From 02b42ce41947b8dcbc6d2143d289f04897add9e1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 21 May 2026 13:30:37 +1000 Subject: [PATCH 001/599] docs: design encrypted domain type prototype --- ...026-05-12-encrypted-domain-types-design.md | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md diff --git a/docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md b/docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md new file mode 100644 index 000000000..914f8577f --- /dev/null +++ b/docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md @@ -0,0 +1,195 @@ +# High-Level Encrypted Domain Types Prototype Design + +## Context + +EQL currently exposes one public encrypted column type, `public.eql_v2_encrypted`, +implemented as a composite type with a single `jsonb` payload field. Query behavior +is selected dynamically from the encrypted payload terms that are present (`hm`, +`bf`, `ob`, `opf`, `opv`, `sv`, etc.). + +The new goal is to add high-level SQL column types such as `encrypted_text`, +`encrypted_jsonb`, and `encrypted_int4`. These types should make application DDL +clearer and give each plaintext shape a static, predictable SQL operator surface. +They should not rely on the broad dynamic dispatch behavior of +`eql_v2_encrypted`. + +The prototype is intentionally limited to: + +- `public.encrypted_text` +- `public.encrypted_jsonb` +- `public.encrypted_int4` + +Configuration inference, automatic registration, broad type coverage, and +production migration behavior are out of scope for the prototype. The prototype +exists to prove whether `jsonb` domain types can provide a clean client-facing +DDL surface while still producing indexable query plans without operator +classes. + +## History And Spike Findings + +A previous branch tried changing `eql_v2_encrypted` itself from a composite type +to a `jsonb` domain. That PR closed unmerged with failing CI, and there is no +clear written rationale for the failure. Separately, EQL has kept +`public.eql_v2_encrypted` and `public.eql_v2_configuration` outside the +`eql_v2` schema so EQL upgrades can drop and recreate `eql_v2` without +cascading into customer columns. + +A transient SQL spike compared three shapes: + +- domain over raw `jsonb` +- domain over `public.eql_v2_encrypted` +- independent composite type with `(data jsonb)` + +The spike showed that domains over `public.eql_v2_encrypted` are ergonomic and +can use existing helpers, but inherit base EQL operators when exact domain +operators are absent. Independent composites avoid inherited behavior, but need +more casts and exact helper/operator wrappers. + +The approved design is simpler: define the high-level types as domains over +raw `jsonb`, then define exact operators for supported and unsupported +operations. This removes the extra `eql_v2_encrypted` layer from the new public +types. + +## Type Model + +Create public domain types over `jsonb`: + +```sql +CREATE DOMAIN public.encrypted_text AS jsonb; +CREATE DOMAIN public.encrypted_jsonb AS jsonb; +CREATE DOMAIN public.encrypted_int4 AS jsonb; +``` + +The payload remains the existing EQL encrypted JSONB payload. The specific +types do not depend on `public.eql_v2_encrypted` for storage or operator +dispatch. + +Because PostgreSQL domains can fall back to base-type behavior, every public +operation in the supported SQL surface must have an exact domain operator: + +- supported operations delegate to fixed index-term helpers; +- unsupported operations raise a type-specific error. + +This prevents accidental fallback to native `jsonb` semantics for common SQL +operators. + +## Prototype Acceptance Criteria + +The prototype must prove these properties: + +- exact domain operators resolve for supported operations; +- exact blocker operators prevent common unsupported operations from falling + through to native `jsonb` behavior; +- supported hot-path operator functions are inlineable SQL functions with no + `SET search_path` clause; +- bare operator predicates use functional indexes and do not require custom + btree or hash operator classes; +- where existing helper signatures are awkward, temporary typed helper wrappers + are small, `LANGUAGE sql`, immutable, strict, parallel-safe, and inlineable + when used in indexed predicates. + +## Operator Surface + +### `encrypted_text` + +Supported: + +- `=` and `<>`, using the `hm` term through `eql_v2.hmac_256(value::jsonb)` +- `~~` and `~~*`, using the `bf` term through `eql_v2.bloom_filter(value::jsonb)` + +Unsupported blockers: + +- `<`, `<=`, `>`, `>=` +- `@>`, `<@` +- `->`, `->>` + +### `encrypted_int4` + +Supported: + +- `=` and `<>`, using the `hm` term through `eql_v2.hmac_256(value::jsonb)` +- `<`, `<=`, `>`, `>=`, using OPE terms by default through an inlineable + expression over `value::jsonb` + +Unsupported blockers: + +- `~~`, `~~*` +- `@>`, `<@` +- `->`, `->>` + +### `encrypted_jsonb` + +Supported: + +- `=` and `<>`, using the `hm` term through `eql_v2.hmac_256(value::jsonb)` +- `@>` and `<@`, using `sv` through inlineable typed STE vector helpers or + wrappers +- `->` and `->>`, using stubbed or adapted encrypted JSON path helpers for the + domain type + +Unsupported blockers: + +- `<`, `<=`, `>`, `>=` +- `~~`, `~~*` + +## Out Of Scope + +Do not add configuration inference in this prototype. The prototype should not +change `eql_v2.add_column`, `eql_v2.add_search_config`, or the configuration +validation functions. + +Do not add automatic registration or event triggers in this prototype. + +Do not add full support for additional encrypted scalar types in this prototype. +The three selected types are enough to test text, scalar range, and JSONB +operator behavior. + +## Error Handling + +Unsupported exact operators should raise clear errors: + +```text +operator < is not supported for encrypted_text +operator ~~ is not supported for encrypted_int4 +operator -> is not supported for encrypted_int4 +``` + +Missing required encrypted index terms should fail through the fixed helper path +with the existing helper errors, such as missing `hm`, `bf`, `opf`, or `sv`. + +Supported hot-path functions should not raise custom errors for missing terms if +an existing helper already provides a precise missing-term error. + +## Testing + +Add focused SQLx coverage for the first three domain types: + +- Domain creation and assignment from valid encrypted JSONB payloads. +- Supported operators for each type. +- Unsupported operators raise the exact type-specific error instead of falling + through to native `jsonb` behavior. +- Functional indexes engage for supported terms: + - `encrypted_text`: `eql_v2.hmac_256(col::jsonb)`, + `eql_v2.bloom_filter(col::jsonb)` + - `encrypted_int4`: `eql_v2.hmac_256(col::jsonb)`, and an OPE order + expression over `col::jsonb` + - `encrypted_jsonb`: `eql_v2.hmac_256(col::jsonb)`, and a typed STE vector + array helper or overload that accepts `encrypted_jsonb` +- `EXPLAIN` plans show index scans for bare operator predicates such as + `col = rhs`, `col ~~ rhs`, `col < rhs`, and `col @> rhs`. +- The same predicates do not require btree/hash operator classes. +- Prepared statements with domain-typed parameters still resolve to exact + domain operators. + +## Implementation Boundary + +Write the first three type surfaces manually. Do not introduce a generator in +the prototype. Manual SQL keeps the spike easy to audit and +lets tests prove the domain-over-`jsonb` approach before expanding to +`encrypted_int2`, `encrypted_int8`, numeric, floating-point, boolean, date, and +timestamp types. + +Supported operator functions and helper wrappers that appear in indexed +predicates must be SQL-language functions intended for planner inlining. +Unsupported blocker functions can use PL/pgSQL because they are not performance +paths. From f3108b4613eca4147f4d9e2854c90b3f827fb4d2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 21 May 2026 13:30:46 +1000 Subject: [PATCH 002/599] feat(bench): fixture and benchmark data-generation foundation Adds the encrypted-int4 fixture generator and benchmark dataset generation tooling: tasks/fixtures/ and tasks/bench.toml, the tests/benchmarks/ harness, the CipherStash Proxy docker-compose used to encrypt fixture data, the int4 fixture install migration, and bench-data test coverage. Registers the new task files in mise.toml and ignores local mise credential overrides. --- .gitignore | 4 + mise.toml | 2 +- tasks/bench.toml | 64 ++++++++++++++ tasks/fixtures.toml | 46 ++++++++++ tasks/fixtures/_generate_common.sh | 69 +++++++++++++++ tasks/fixtures/encrypted_int4_schema.sql | 30 +++++++ tasks/fixtures/generate_encrypted_int4.sh | 83 +++++++++++++++++++ tests/benchmarks/.env.example | 7 ++ tests/benchmarks/.gitignore | 6 ++ tests/benchmarks/README.md | 37 +++++++++ tests/benchmarks/docker-compose.yml | 54 ++++++++++++ tests/benchmarks/generate.sh | 77 +++++++++++++++++ tests/benchmarks/reports/.gitkeep | 0 tests/benchmarks/schema.sql | 81 ++++++++++++++++++ tests/docker-compose.proxy.yml | 35 ++++++++ .../009_install_encrypted_int4_fixture.sql | 29 +++++++ tests/sqlx/tests/bench_data_tests.rs | 24 ++++++ 17 files changed, 647 insertions(+), 1 deletion(-) create mode 100644 tasks/bench.toml create mode 100644 tasks/fixtures.toml create mode 100644 tasks/fixtures/_generate_common.sh create mode 100644 tasks/fixtures/encrypted_int4_schema.sql create mode 100755 tasks/fixtures/generate_encrypted_int4.sh create mode 100644 tests/benchmarks/.env.example create mode 100644 tests/benchmarks/.gitignore create mode 100644 tests/benchmarks/README.md create mode 100644 tests/benchmarks/docker-compose.yml create mode 100755 tests/benchmarks/generate.sh create mode 100644 tests/benchmarks/reports/.gitkeep create mode 100644 tests/benchmarks/schema.sql create mode 100644 tests/docker-compose.proxy.yml create mode 100644 tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql diff --git a/.gitignore b/.gitignore index d9a13a2e9..7c1b67f27 100644 --- a/.gitignore +++ b/.gitignore @@ -123,6 +123,10 @@ web_modules/ .env.local .envrc +# Local mise overrides (CipherStash credentials, etc.) +mise.local.toml +.mise.local.toml + # parcel-bundler cache (https://parceljs.org/) .parcel-cache diff --git a/mise.toml b/mise.toml index fbf499b4f..6fd0b7c6b 100644 --- a/mise.toml +++ b/mise.toml @@ -14,7 +14,7 @@ "python" = "3.13" [task_config] -includes = ["tasks", "tasks/postgres.toml"] +includes = ["tasks", "tasks/postgres.toml", "tasks/bench.toml", "tasks/fixtures.toml"] [env] POSTGRES_DB = "cipherstash" diff --git a/tasks/bench.toml b/tasks/bench.toml new file mode 100644 index 000000000..72abc487f --- /dev/null +++ b/tasks/bench.toml @@ -0,0 +1,64 @@ +["bench:up"] +description = "Start Postgres + Proxy for benchmark data generation" +dir = "{{config_root}}" +run = """ +if [ ! -f tests/benchmarks/.env ]; then + echo "ERROR: tests/benchmarks/.env missing. Copy .env.example and fill in credentials." >&2 + exit 1 +fi +docker compose --env-file tests/benchmarks/.env -f tests/benchmarks/docker-compose.yml up -d +export PGPASSWORD="password" +echo "Waiting for bench-postgres on localhost:7433..." +for i in $(seq 1 60); do + if psql -U cipherstash -d cipherstash -h localhost -p 7433 -c 'SELECT 1' >/dev/null 2>&1; then + echo "bench-postgres ready." + break + fi + sleep 1 + if [ "$i" -eq 60 ]; then + echo "bench-postgres did not become ready in 60s." + echo + echo '=== bench-postgres logs ===' + docker logs bench-postgres 2>&1 | tail -40 + exit 1 + fi +done + +echo "Waiting for bench-proxy on localhost:6433..." +for i in $(seq 1 60); do + if psql -U cipherstash -d cipherstash -h localhost -p 6433 -c 'SELECT 1' >/dev/null 2>&1; then + echo "bench-proxy ready." + exit 0 + fi + sleep 1 +done +echo "bench-proxy did not become ready in 60s." +echo +echo '=== bench-proxy logs ===' +docker logs bench-proxy 2>&1 | tail -40 +exit 1 +""" + +["bench:down"] +description = "Stop benchmark Postgres + Proxy" +dir = "{{config_root}}" +run = """ +docker compose -f tests/benchmarks/docker-compose.yml down -v +""" + +["bench:generate"] +description = "Generate 100K encrypted bench dataset (requires bench:up first)" +# `build` produces release/cipherstash-encrypt.sql, which generate.sh +# installs into the bench Postgres container before applying schema.sql. +depends = ["build"] +dir = "{{config_root}}" +run = """ +tests/benchmarks/generate.sh 100k +""" + +["bench:full"] +description = "Run committed SQLx bench/regression suite" +dir = "{{config_root}}" +run = """ +mise run --output prefix test:bench +""" diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml new file mode 100644 index 000000000..002798801 --- /dev/null +++ b/tasks/fixtures.toml @@ -0,0 +1,46 @@ +["proxy:up"] +description = "Start CipherStash Proxy connected to existing Postgres" +# Reuses the tests/docker-compose.yml Postgres on POSTGRES_PORT. +# CS_* credentials are read from the shell environment (mise/direnv/profile). +# Readiness is verified from the host (the proxy image lacks busybox nc, so +# the container-internal healthcheck cannot be used). Dumps container logs +# on failure so the user does not need a separate `docker logs` invocation. +dir = "{{config_root}}/tests" +run = """ +docker compose -f docker-compose.proxy.yml up -d +echo "Waiting for proxy on localhost:6432..." +export PGPASSWORD="${POSTGRES_PASSWORD:-password}" +for i in $(seq 1 60); do + if psql -U "${POSTGRES_USER:-cipherstash}" -d "${POSTGRES_DB:-cipherstash}" \ + -h localhost -p 6432 -c 'SELECT 1' >/dev/null 2>&1; then + echo "Proxy ready." + exit 0 + fi + sleep 1 +done +echo "Proxy did not become ready in 60s." +echo +echo '=== cipherstash-proxy logs ===' +docker logs cipherstash-proxy 2>&1 | tail -40 +exit 1 +""" + +["proxy:logs"] +description = "Tail CipherStash Proxy container logs" +dir = "{{config_root}}/tests" +run = "docker logs --tail 100 -f cipherstash-proxy" + +["proxy:down"] +description = "Stop CipherStash Proxy" +dir = "{{config_root}}/tests" +run = "docker compose -f docker-compose.proxy.yml down" + +["fixture:int:generate"] +description = "Generate encrypted_int4 fixture (009) via Proxy" +# Prerequisites: +# - mise run postgres:up (existing Postgres on POSTGRES_PORT) +# - mise run reset (ensures EQL is installed in that Postgres) +# - mise run proxy:up (Proxy on localhost:6432) +depends = ["build"] +dir = "{{config_root}}" +run = "tasks/fixtures/generate_encrypted_int4.sh" diff --git a/tasks/fixtures/_generate_common.sh b/tasks/fixtures/_generate_common.sh new file mode 100644 index 000000000..0d6663145 --- /dev/null +++ b/tasks/fixtures/_generate_common.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# Common helpers for fixture generators. Sourced — not executed directly. +# Sets PG_URL / PROXY_URL and exposes restart_proxy_and_wait + dump_fixture_table. + +# Resolve Postgres / Proxy connection from mise [env] (POSTGRES_*) with the +# usual defaults. PROXY_PORT comes from tests/docker-compose.proxy.yml. +PG_USER="${POSTGRES_USER:-cipherstash}" +PG_PASSWORD="${POSTGRES_PASSWORD:-password}" +PG_DB="${POSTGRES_DB:-cipherstash}" +PG_HOST="${POSTGRES_HOST:-localhost}" +PG_PORT="${POSTGRES_PORT:-7432}" +PROXY_PORT="${PROXY_PORT:-6432}" + +PG_URL="postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:${PG_PORT}/${PG_DB}" +PROXY_URL="postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:${PROXY_PORT}/${PG_DB}" + +export PGPASSWORD="$PG_PASSWORD" + +# Proxy caches its encrypt config at connection-handler init time, so any +# add_search_config call applied AFTER Proxy started won't take effect +# until Proxy reconnects. Restart and wait for it to come back. +restart_proxy_and_wait() { + echo "==> Restarting Proxy so it reloads the new encrypt config" + docker restart cipherstash-proxy >/dev/null + + for i in $(seq 1 60); do + if psql "$PROXY_URL" -c 'SELECT 1' >/dev/null 2>&1; then + echo " Proxy ready." + return 0 + fi + sleep 1 + done + + echo "ERROR: Proxy did not come back up after restart" >&2 + docker logs cipherstash-proxy 2>&1 | tail -20 + return 1 +} + +# Render fixture rows as INSERT statements using format(%L). Caller supplies: +# $1 = source table name (e.g. bench_text) +# $2 = destination table name in the migration (e.g. encrypted_text_plaintext) +# $3 = comma-separated source-column projection +# (e.g. "id, plaintext, (encrypted_text).data::text") +# $4 = comma-separated destination column types for format() placeholders +# (e.g. "%L, %L, %L::jsonb") +# $5 = destination column-name tuple +# (e.g. "(id, plaintext, payload)") +# $6 = output path +# +# The migration is written with a DROP / CREATE preamble plus the rendered +# INSERT statements. The CREATE statement must be supplied by the caller via +# stdin BEFORE calling this function; see how each generator pipes it in. +dump_fixture_table() { + local src_table="$1" + local dst_table="$2" + local src_projection="$3" + local fmt_placeholders="$4" + local dst_columns="$5" + local output_path="$6" + + psql "$PG_URL" -v ON_ERROR_STOP=1 -t -A -c " +SELECT format( + 'INSERT INTO ${dst_table} ${dst_columns} VALUES (${fmt_placeholders});', + ${src_projection} +) +FROM ${src_table} +ORDER BY id; +" >> "$output_path" +} diff --git a/tasks/fixtures/encrypted_int4_schema.sql b/tasks/fixtures/encrypted_int4_schema.sql new file mode 100644 index 000000000..5d870590c --- /dev/null +++ b/tasks/fixtures/encrypted_int4_schema.sql @@ -0,0 +1,30 @@ +-- Schema for the encrypted_int4 plaintext-paired fixture. +-- Applied by tasks/fixtures/generate_encrypted_int4.sh; the generator +-- restarts Proxy afterwards so it reloads the new encrypt config. + +DROP TABLE IF EXISTS bench_int4; + +CREATE TABLE bench_int4 ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + plaintext INTEGER NOT NULL, + encrypted_int4 eql_v2_encrypted +); + +-- Idempotency: drop any prior bench_int4 search-config rows so re-running +-- the generator doesn't error with "unique index exists for column". +SELECT eql_v2.remove_search_config('bench_int4', 'encrypted_int4', 'unique') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench_int4,encrypted_int4,indexes,unique}' IS NOT NULL + ); +SELECT eql_v2.remove_search_config('bench_int4', 'encrypted_int4', 'ore') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench_int4,encrypted_int4,indexes,ore}' IS NOT NULL + ); + +-- unique → HMAC (drives =, <>); ore → OPE bytes (drives <, <=, >, >=). +SELECT eql_v2.add_search_config('bench_int4', 'encrypted_int4', 'unique', 'int'); +SELECT eql_v2.add_search_config('bench_int4', 'encrypted_int4', 'ore', 'int'); diff --git a/tasks/fixtures/generate_encrypted_int4.sh b/tasks/fixtures/generate_encrypted_int4.sh new file mode 100755 index 000000000..5662845af --- /dev/null +++ b/tasks/fixtures/generate_encrypted_int4.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Generates an encrypted_int4 fixture by running an integer value set +# through CipherStash Proxy and dumping the resulting (id, plaintext, +# payload jsonb) rows as a SQLx migration. +# +# Prerequisites: +# - mise run postgres:up +# - EQL installed (e.g. via mise run reset + psql -f release/cipherstash-encrypt.sql) +# - mise run proxy:up (Proxy on localhost:6432) +# - mise run build (produces release/cipherstash-encrypt.sql) +# +# Output: +# tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCHEMA_SQL="$SCRIPT_DIR/encrypted_int4_schema.sql" +OUTPUT="$REPO_ROOT/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql" + +# shellcheck source=_generate_common.sh +. "$SCRIPT_DIR/_generate_common.sh" + +if [ ! -f "$SCHEMA_SQL" ]; then + echo "ERROR: $SCHEMA_SQL not found." >&2 + exit 1 +fi + +# 14 values: includes negatives (boundary), small/medium/large/extreme. +# Chosen so range pivots produce distinct cardinalities — see plan in +# docs/superpowers/plans/. +VALUES=(-100 -1 1 2 5 10 17 25 42 50 100 250 1000 9999) +ROW_COUNT=${#VALUES[@]} + +echo "==> Applying fixture schema (drops + recreates bench_int4)" +psql "$PG_URL" -v ON_ERROR_STOP=1 -f "$SCHEMA_SQL" + +restart_proxy_and_wait + +echo "==> Inserting $ROW_COUNT integers through Proxy (encrypts encrypted_int4)" +# Proxy's eql-mapper cannot unify negative integer literals (parsed as +# UnaryOp(Minus, ...)) with the EQL int column when sent via the simple +# query protocol. Send each value over the extended protocol via psql's +# \bind meta-command so the parameter type is communicated as a binary +# int4 instead of being inferred from SQL surface syntax. +INSERT_SQL=$(mktemp) +trap 'rm -f "$INSERT_SQL"' EXIT +for v in "${VALUES[@]}"; do + # Use literal $1/$2 as bind placeholders; \bind supplies their values. + # \g executes the buffered statement; \bind discards bindings after \g. + printf 'INSERT INTO bench_int4 (plaintext, encrypted_int4) VALUES ($1, $2) \\bind %s %s \\g\n' "$v" "$v" >> "$INSERT_SQL" +done +psql "$PROXY_URL" -v ON_ERROR_STOP=1 -f "$INSERT_SQL" >/dev/null + +echo "==> Dumping $ROW_COUNT rows to $OUTPUT" +cat > "$OUTPUT" <
Done. Wrote $ROW_COUNT rows to $OUTPUT" diff --git a/tests/benchmarks/.env.example b/tests/benchmarks/.env.example new file mode 100644 index 000000000..fe41909a4 --- /dev/null +++ b/tests/benchmarks/.env.example @@ -0,0 +1,7 @@ +# CipherStash Proxy credentials +# Get these from https://dashboard.cipherstash.com +CS_CLIENT_ACCESS_KEY= +CS_DEFAULT_KEYSET_ID= +CS_CLIENT_KEY= +CS_CLIENT_ID= +CS_WORKSPACE_CRN= diff --git a/tests/benchmarks/.gitignore b/tests/benchmarks/.gitignore new file mode 100644 index 000000000..9e7d7623f --- /dev/null +++ b/tests/benchmarks/.gitignore @@ -0,0 +1,6 @@ +# Generated reports (too large for git, regenerated on demand) +reports/* +!reports/.gitkeep + +# Local Proxy credentials +.env diff --git a/tests/benchmarks/README.md b/tests/benchmarks/README.md new file mode 100644 index 000000000..69087bdb8 --- /dev/null +++ b/tests/benchmarks/README.md @@ -0,0 +1,37 @@ +# Benchmark Utilities + +This directory contains the Dockerized support stack for generating a 100K-row +encrypted benchmark dataset through CipherStash Proxy. + +The committed automated benchmark coverage lives in the SQLx bench/regression +suite (`mise run test:bench`). `mise run bench:full` is a convenience wrapper +around that existing suite; it does not consume the 100K Docker dataset. + +## Local usage + +```bash +# Populate credentials for the Dockerized Proxy +cp tests/benchmarks/.env.example tests/benchmarks/.env +# Edit .env with your CipherStash credentials + +# Start bench-postgres + bench-proxy and wait for host-side readiness checks +mise run bench:up + +# Build EQL and generate the 100K encrypted dataset in bench-postgres +mise run bench:generate + +# Run the committed SQLx bench/regression suite (10K fixture-based) +mise run bench:full + +# Tear down the Dockerized benchmark stack when finished +mise run bench:down +``` + +## What each task does + +- `bench:up` starts `bench-postgres` and `bench-proxy`, then probes them from + the host with `psql`. +- `bench:generate` installs the built EQL SQL into `bench-postgres`, applies + `schema.sql`, and inserts 100K plaintext rows through Proxy on `localhost:6433`. +- `bench:full` delegates to `mise run test:bench`, which runs the committed + SQLx benchmark/regression suite against the normal local test database. diff --git a/tests/benchmarks/docker-compose.yml b/tests/benchmarks/docker-compose.yml new file mode 100644 index 000000000..d67aca7c3 --- /dev/null +++ b/tests/benchmarks/docker-compose.yml @@ -0,0 +1,54 @@ +services: + postgres: + image: postgres:17 + container_name: bench-postgres + command: > + postgres + -c track_functions=all + -c shared_preload_libraries=pg_stat_statements + -c pg_stat_statements.track=all + -c pg_stat_statements.max=10000 + ports: + - "7433:5432" + environment: + POSTGRES_DB: cipherstash + POSTGRES_USER: cipherstash + POSTGRES_PASSWORD: password + healthcheck: + test: ["CMD-SHELL", "pg_isready -U cipherstash"] + interval: 1s + timeout: 5s + retries: 10 + networks: + - bench + + proxy: + image: cipherstash/proxy:latest + container_name: bench-proxy + ports: + - "6433:6432" + environment: + CS_DATABASE__NAME: cipherstash + CS_DATABASE__USERNAME: cipherstash + CS_DATABASE__PASSWORD: password + CS_DATABASE__HOST: postgres + CS_DATABASE__PORT: 5432 + # EQL install is performed explicitly by generate.sh before schema.sql runs. + # Leaving Proxy's own install off avoids racing against generate.sh. + CS_DATABASE__INSTALL_EQL: "false" + CS_CLIENT_ACCESS_KEY: ${CS_CLIENT_ACCESS_KEY} + CS_DEFAULT_KEYSET_ID: ${CS_DEFAULT_KEYSET_ID} + CS_CLIENT_KEY: ${CS_CLIENT_KEY} + CS_CLIENT_ID: ${CS_CLIENT_ID} + CS_WORKSPACE_CRN: ${CS_WORKSPACE_CRN} + depends_on: + postgres: + condition: service_healthy + networks: + - bench + # No in-container healthcheck: the current cipherstash/proxy image does + # not ship `nc`, so readiness is verified from the host by `bench:up` + # using `psql` against localhost:6433. +networks: + bench: + driver: bridge diff --git a/tests/benchmarks/generate.sh b/tests/benchmarks/generate.sh new file mode 100755 index 000000000..595e8d105 --- /dev/null +++ b/tests/benchmarks/generate.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Generates a 100K-row encrypted bench dataset via CipherStash Proxy. +# No dump is written in v1 — the Tier 2 workflow regenerates fresh each run. +# +# Prerequisites: +# - mise run build (produces release/cipherstash-encrypt.sql) +# - docker compose -f tests/benchmarks/docker-compose.yml up -d --wait +# - tests/benchmarks/.env populated with CipherStash credentials + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +EQL_SQL="$REPO_ROOT/release/cipherstash-encrypt.sql" +SCALE="${1:-100k}" + +case "$SCALE" in + 100k) ROWS=100000 ;; + *) echo "Unsupported scale: $SCALE (only 100k in v1)" >&2; exit 1 ;; +esac + +if [ ! -f "$EQL_SQL" ]; then + echo "ERROR: $EQL_SQL not found. Run 'mise run build' first." >&2 + exit 1 +fi + +PG_URL="postgresql://cipherstash:password@localhost:7433/cipherstash" +PROXY_URL="postgresql://cipherstash:password@localhost:6433/cipherstash" + +echo "==> Installing EQL into bench-postgres" +psql "$PG_URL" -v ON_ERROR_STOP=1 -f "$EQL_SQL" >/dev/null + +echo "==> Applying bench schema and Proxy search configuration" +psql "$PG_URL" -v ON_ERROR_STOP=1 -f "$SCRIPT_DIR/schema.sql" + +# Proxy caches the encrypt config at connection-handler init. add_search_config +# in schema.sql writes the new config but the Proxy will keep running in +# PASSTHROUGH MODE (inserts pass through unencrypted) until it reconnects. +# Restart and wait for it to come back before driving the INSERT. +echo "==> Restarting bench-proxy so it reloads the new encrypt config" +docker restart bench-proxy >/dev/null +for i in $(seq 1 60); do + if psql "$PROXY_URL" -c 'SELECT 1' >/dev/null 2>&1; then + echo " Proxy ready." + break + fi + sleep 1 + if [ "$i" -eq 60 ]; then + echo "ERROR: bench-proxy did not come back up after restart" >&2 + docker logs bench-proxy 2>&1 | tail -20 + exit 1 + fi +done + +echo "==> Inserting $ROWS plaintext rows through Proxy (this encrypts them)" +# generate_series emits plaintext rows; Proxy intercepts and encrypts each +# column per the search config applied in schema.sql. +psql "$PROXY_URL" -v ON_ERROR_STOP=1 -c " +INSERT INTO bench (encrypted_text, encrypted_int, encrypted_bigint) +SELECT + ('text_' || (((gs - 1) % 1000) + 1))::text, + (((gs - 1) % 1000) + 1)::int, + (((gs - 1) % 1000) + 1)::bigint * 1000000000 +FROM generate_series(1, $ROWS) AS gs; +" + +echo "==> Creating indexes and running ANALYZE" +psql "$PG_URL" -v ON_ERROR_STOP=1 -c " +CREATE INDEX IF NOT EXISTS bench_text_hmac_idx ON bench USING hash (eql_v2.hmac_256(encrypted_text)); +CREATE INDEX IF NOT EXISTS bench_text_ore_idx ON bench USING btree (encrypted_text eql_v2.encrypted_operator_class); +CREATE INDEX IF NOT EXISTS bench_int_ore_idx ON bench USING btree (encrypted_int eql_v2.encrypted_operator_class); +CREATE INDEX IF NOT EXISTS bench_bigint_ore_idx ON bench USING btree (encrypted_bigint eql_v2.encrypted_operator_class); +CREATE INDEX IF NOT EXISTS bench_text_bloom_idx ON bench USING gin (eql_v2.bloom_filter(encrypted_text)); +ANALYZE bench; +" + +echo "==> Done. Rows: $ROWS" diff --git a/tests/benchmarks/reports/.gitkeep b/tests/benchmarks/reports/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tests/benchmarks/schema.sql b/tests/benchmarks/schema.sql new file mode 100644 index 000000000..88bb7be48 --- /dev/null +++ b/tests/benchmarks/schema.sql @@ -0,0 +1,81 @@ +-- Bench schema for Tier 2 benchmarks. +-- Applied against the bench-postgres container AFTER EQL has been explicitly +-- installed by generate.sh (see Task 4 — generate.sh installs +-- release/cipherstash-encrypt.sql directly, not relying on Proxy's async install). + +DROP TABLE IF EXISTS bench; + +CREATE TABLE bench ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + encrypted_text eql_v2_encrypted, + encrypted_int eql_v2_encrypted, + encrypted_bigint eql_v2_encrypted +); + +-- Idempotency: clear any prior bench search-config rows so re-running the +-- generator against the same container doesn't error with "... index exists +-- for column". EQL uninstall drops the schema but not public config rows. +SELECT eql_v2.remove_search_config('bench', 'encrypted_text', 'unique') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench,encrypted_text,indexes,unique}' IS NOT NULL + ); +SELECT eql_v2.remove_search_config('bench', 'encrypted_text', 'match') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench,encrypted_text,indexes,match}' IS NOT NULL + ); +SELECT eql_v2.remove_search_config('bench', 'encrypted_text', 'ore') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench,encrypted_text,indexes,ore}' IS NOT NULL + ); +SELECT eql_v2.remove_search_config('bench', 'encrypted_int', 'unique') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench,encrypted_int,indexes,unique}' IS NOT NULL + ); +SELECT eql_v2.remove_search_config('bench', 'encrypted_int', 'ore') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench,encrypted_int,indexes,ore}' IS NOT NULL + ); +SELECT eql_v2.remove_search_config('bench', 'encrypted_bigint', 'unique') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench,encrypted_bigint,indexes,unique}' IS NOT NULL + ); +SELECT eql_v2.remove_search_config('bench', 'encrypted_bigint', 'ore') + WHERE EXISTS ( + SELECT 1 + FROM public.eql_v2_configuration c + WHERE c.data #> '{tables,bench,encrypted_bigint,indexes,ore}' IS NOT NULL + ); + +-- Proxy search configuration: tells Proxy which index terms to generate +-- for each column when plaintext is inserted. +-- +-- Signature: eql_v2.add_search_config(table, column, index, cast_as) +-- (see src/config/functions.sql). add_search_config calls activate_config +-- internally when migrating=false, so no explicit activate_config call. + +-- text column: equality (hmac), pattern match (bloom), ordering (ore) +SELECT eql_v2.add_search_config('bench', 'encrypted_text', 'unique', 'text'); +SELECT eql_v2.add_search_config('bench', 'encrypted_text', 'match', 'text'); +SELECT eql_v2.add_search_config('bench', 'encrypted_text', 'ore', 'text'); + +-- integer column: equality + ORE range/ordering +SELECT eql_v2.add_search_config('bench', 'encrypted_int', 'unique', 'int'); +SELECT eql_v2.add_search_config('bench', 'encrypted_int', 'ore', 'int'); + +-- bigint column: equality + ORE range/ordering +SELECT eql_v2.add_search_config('bench', 'encrypted_bigint', 'unique', 'big_int'); +SELECT eql_v2.add_search_config('bench', 'encrypted_bigint', 'ore', 'big_int'); + +-- Indexes (created after data load in generate.sh, after ANALYZE) diff --git a/tests/docker-compose.proxy.yml b/tests/docker-compose.proxy.yml new file mode 100644 index 000000000..d64e6a8ef --- /dev/null +++ b/tests/docker-compose.proxy.yml @@ -0,0 +1,35 @@ +services: + proxy: + image: cipherstash/proxy:latest + container_name: cipherstash-proxy + ports: + - "6432:6432" + environment: + # Proxy connects to the existing tests/docker-compose.yml Postgres, + # reaching the host via host.docker.internal. POSTGRES_* values come + # from mise.toml [env] block (overridable per shell). + CS_DATABASE__NAME: ${POSTGRES_DB:-cipherstash} + CS_DATABASE__USERNAME: ${POSTGRES_USER:-cipherstash} + CS_DATABASE__PASSWORD: ${POSTGRES_PASSWORD:-password} + CS_DATABASE__HOST: host.docker.internal + CS_DATABASE__PORT: ${POSTGRES_PORT:-7432} + # EQL installation is handled by the existing reset / install flow; the + # Proxy must not race against it. + CS_DATABASE__INSTALL_EQL: "false" + # CipherStash workspace credentials are read from the host shell + # environment (mise / direnv / profile). No .env file is required. + CS_CLIENT_ACCESS_KEY: ${CS_CLIENT_ACCESS_KEY} + CS_DEFAULT_KEYSET_ID: ${CS_DEFAULT_KEYSET_ID} + CS_CLIENT_KEY: ${CS_CLIENT_KEY} + CS_CLIENT_ID: ${CS_CLIENT_ID} + CS_WORKSPACE_CRN: ${CS_WORKSPACE_CRN} + # Optional: pin the CTS region host for workspaces in non-default regions. + CS_CTS_HOST: ${CS_CTS_HOST:-} + CS_ZEROKMS_HOST: ${CS_ZEROKMS_HOST:-} + extra_hosts: + # Linux compatibility; macOS / Windows resolve host.docker.internal natively. + - "host.docker.internal:host-gateway" + # No in-container healthcheck: the current cipherstash/proxy:latest image + # lacks busybox nc, so any TCP probe inside the container fails even when + # the proxy is listening. Readiness is verified from the host by the + # proxy:up task using psql. diff --git a/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql b/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql new file mode 100644 index 000000000..7556d9e6a --- /dev/null +++ b/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql @@ -0,0 +1,29 @@ +-- AUTO-GENERATED by tasks/fixtures/generate_encrypted_int4.sh +-- DO NOT EDIT BY HAND. Re-run the generator to refresh. +-- +-- Source: 14-value integer set defined inline in the generator. +-- Produced via CipherStash Proxy (HMAC + OPE terms). +-- Used by encrypted_int4 domain SQLx fixture tests. + +DROP TABLE IF EXISTS encrypted_int4_plaintext; + +CREATE TABLE encrypted_int4_plaintext ( + id BIGINT PRIMARY KEY, + plaintext INTEGER NOT NULL, + payload JSONB NOT NULL +); + +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('1', '-100', '{"c": "mBbKSl1A>nJLHvy{R_+!y+r237Oz{OOyZusRU1%=^N29ellMsHtFke~AjFeV1#(=nP!7;6lb4dK$exS)cVyEoXZr0(3=TevwytGvV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "c8faf5849bba756007c19df73eb704aa640dea7eec353af533b4502cc354640d", "ob": ["a1a1a1a15481492c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fef2c4558f8c98caf3d95b2a84cfd8d1bf34d597f6b0c7cec23413e27dcb5fea3fa07832f2566f859ed23a16910615e5364d4ac48ae66b56b98836c956171ab4d6cf6eacaa0b1c7b5bae407558a7751d01a3312a765d38eabd8f55815ff310aeab71a3e802ad78088941fb5dbf1867d548b10969184d3a56b71bcbae6f31cec20585879ed7da7174b4bbf9d60080b5ba9ecd38473e20631bbfb4d4883fca75cdf7e4727c85f669e3bc8981fa2d7b6d2309793c86ccdb1fa1fb5e352b4298b138bdee80b603ca95ced5a3a6788048b8922b7f679a524270f36e44ba6006303b494e1e3b6efb9878ce9da67942d1b7c5e1d2ff8d337be041c00f85317c66144171419aa7577d5a717d569c0d5dfe9fa5d52bdf449fa4043a4258c98514eb81abda3b05213f1d096f8e63f7ed72fc7d8f7d88464484bc8d75acc26688770b3f68d699383a92037bc5b015f723aa4a0a7d9073"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('2', '-1', '{"c": "mBbLfH%e(Q?p_s?bNQ{<#{uC8TnV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "f6bde997370f33b54e4ca61473609b197879c18e5197548176518b714b119146", "ob": ["a1a1a1a15481495d65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fef2c4558f8c98caf3d95b2a84cfd8d1bf34d597f6b0c7cec23413e27dcb5fea3fa07832f2566f859ed23a16910615e5365295862e7ec0da68e2a3decc06d1d557b6922aae88582b92f00da5cf7b0e22fef74f1ed895c9164c470aea01637f1d726adaa19b9413d51b2e80f9e6c9fdc1f74a576aabbd6f183d9c6de23082f281d85a5dacf3c5aa719d1ad4a8f22aeb281587ea04465e7d99b73daa382f44af6cc6b300698cdd517f908f618cea3c3733ecccdaf649b4cf9355a9d27bc81c64563e6f177b8755b3aff1bd4549d0e572fe44b752fb8d0e96fd76a5be31a4945ed2ceda86d928aba563485661bcd2ea533396be44c4cd918a5e7eef8dfbb10982ed3eaa49b35036ef673a21ff39e26fe62860d8219ee9aa001e094ce1131ebe5aaef33f8e933a9eb6003c4b9a656043a9cd8723d60174e429f998f37e7317f27a05b68ecbb3c6a4944f062875b85d2d7131da"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('3', '1', '{"c": "mBbLYhRor}6CjJ;AsHY+(?Ng47K{2;`qaGoX)GjDl0Y0;`k@_)eA52JATQHQY^bSRimoI>d;+&&X6|8PG@TT7Dsa8|UCWFmT&`tqV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "e166c0aac72bd6715d32ef1601aa5333531ead4620a5f29da2c1de3488f4c567", "ob": ["a1a1a1a1964545e965cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5af190366875ddb8de5697963484becd5ebb1925d11d89ea7ec7949dc519e7596d9091bf1241fafbc5da30c777b671912ce3e0c372c0ed63fd8499fee2dd5e3934ac2f0f6c4f84a698d76e0fa3a60c19f48dd672705751068bdb2846bd092f5122b1260d9e42cefc95d66b9e2376e6b0a982046952cea11611dbc2a12aac49f2111095cdbe647100a9959bd720d03477ed4fd27e062f65d7b7fdbc9a44d2033563b603a4f3cfe1fcda82cf1730c40f01d92141f4611d6b00dfb08298a41533f7369965867af4a9fba4dbaba1467a2e3b923f970a9c08370b45ae608445f8cab67f1085291ebbf194435b0606b49e8771eb5cfc20cb51c79ff273a77b730fc35fc07c62bb21330260a44e3dc132b19cc7e7874643ffc27ccbb41375abe6c302b009"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('4', '2', '{"c": "mBbM0cqpOq3a!Xis`V0^%ic<-7|Nd29<6#ESv$eRAST6LAHL`!o;_oQUU9dZbi{(cCVQ)i*P2|4WORRB5UyozV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "84507797349e30049201af1f46c5e2e47f4660d18726716a0b56427c0b9a021b", "ob": ["a1a1a1a19645458b65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a513c8a4a70ef54eb8ba541efae0e03dd2fe9264d04a5ef27b7da6eb22e3e902476b6a1bb794b88bae7a12f5341b8c5ea582a5b9d244cd2e6a72e1bc9dca08af01b426d7a918cf1b3f809b957b3083b2d4d93d296c038b17bbd3bdc956a2f97d9791368528ddcc6d87c5b1f8a34f54662ea8f3f8d24ebf67ff186e3ed7ac6e03a94132f7d4e7d7061a53d8013aa36caa74bc98dda9106ad9cf37cfed6a7ff7f8e1270bc9d413251eb1f43ed53fc5a15dfa9d53a8e79478de5a9447c5135d8b8325a5fe397fdb796630bc2fa5e06144fdbd49a576a4833bfd0fc1c89246c9fc807064d10bc3b5d18d3d1f1e07fadb1bd719db0310aa8573a5e7baf1e5fa3d4e791313c225c47cf39089e70d71ee1801c10f278b37eb23afebe904e4f89953d4a64"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('5', '5', '{"c": "mBbKeYS{+(Zso@h#h(k`Pj$@178N4lo-=GaVRpm;j@X|!wb;*>4Co2OARQ#xz%i*M8ke;~Gda*nx5p{`|aV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "fd87f32d954e6b8114710c1cb421b25f9c32ff08cf0b69ba68053ef2a32ec854", "ob": ["a1a1a1a19645459e65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5aa803720971383049abfacef1eae1766a2d5bd879296124ac6930a8cdb4dbe1059aabb4b89fc13888fc4b60fa4498fdecb008eb20c7ae868fa21ba4d55cb69a75a30eaa52f5633c290dffbb6453c35c11fb67fef2a62cabb7a5653e3c3719aa5d805f2fdf80eb05ab66baa6b7f7b3956e71bea6fe97aba914e89e96e4fb6fcf1153f5fd64b8217f18836536df493179b93215ad84e36215c80c2eac0446d6ceb8d1bc26bf325fb597b8bce8192876f2121524d00068bb05b97a7965d982022c61c0fc76ecd90a211587ed344554810dcf102902718a5ed127eacbb43d3030d4ecfa9a6e86541675286dcaa330ae210b3e3d8a5a89f436ac2daa80a1e3f2bd84c4772c417fa71863b43d6a4b8e0e77051240fd73bb3b66eb03a70196ef6f7ffcf8"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('6', '10', '{"c": "mBbJ$2dznX$8+hEVm#p*84AqA7WaqRu6P1z-60C!XlFVZGl#oq!c!{5AkID7t=)F>bIS!jr`cENW5zfF#$D)=RI@5fzL6JWpRQ$YV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "9dfab57faa412c407c8b7a8c6f988afc15f9ab25e604fc6542eb84b00f52e2d9", "ob": ["a1a1a1a19645457265cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a3113f16bb322e59b86500da7574b52d298792c385a5d0355b9ccea9127c7f17fae5686334ec7416bd4da7f31ffe18b8dab571880bd0a11d8dadef2b8210123311a855d8db9c3254af31572e6909f2ec36975aa2e2df540fd7e47398b2dbbb911711c241ad9e2f8471b63e8b74adb6e8c1c10291740faebf8e3c58e2100682e750301eb6807e1723a8a0f228cc3af70860d8b2d7d5efbb8ed2ebad31656f9f31cc20fe49139dd0e97bfeac1d0f599d40e24b6222549b0793be4a19c7f8ebac901021a70eff61a0838eff9acec17d78007237034d10a0672cec37205b095eb80480613da7f4d7139241a274750db8a4e0792e1447f5d52887cbdc935e159c8e13107d26d33dca94518bb4693f7fb6e059c1222561255ccb5f33d4ea9fb187721db"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('7', '17', '{"c": "mBbKs&oax}9^^|SIisV#TLyx}7GwgnjEjg#`hWPogd*#F6}hSJWVEy(B19mLgF*=B&)fehTfyWDL@xFRo>7V{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "0ec321b40a8ae7a37bfd557d8451714996b2986447d32d6a6b3ba91492be0bfe", "ob": ["a1a1a1a1964545ee65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a2b59b0c0132c8308a958946dba0cabf8b5ee08e2c8a7d77f9fe513bf5e8e7da0fecb176102b68aee30552310f7d56af4e973dc54cf43e9d83a72ea3fd8988c7263ec26abd96a3f5afa1b7abfe2c4cee5ed7498c6ea3cc189a1cbac98d9044145dc7598710e35a6ba8bae587c1f115296172695b48c26d4a3497a65cfcb98d63f5e91c34ba1a921883152c1541b85a12bea47bf7de15a9ddb01c8699f93850b42f95cf4f7b5ec56e5fa952235804cd306d5e654da2460a403f81db4aa3b6e667bc5315997e7b69f36acf6b2fc8ba68cfabfb846dbbf124db55cae63f4e38fdbe83d7fc54579b5ba0f2f282847c1a3b3fe4235c5dd1da69e3f1b33eeb6c31fe67ce5f333cd797e2d2aa6d702e9236f7c310b1dc3ee682ff09187c3eb73d11aa72a"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('8', '25', '{"c": "mBbKzuk={LFxu?QubtJ*_sx6=Y5HPpN6zXtgdBlV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "3a8ce9251f3ee4904d625b2e79f9eb930c2b3086ae641f934260c9dd3cf0ecb6", "ob": ["a1a1a1a19645454c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a542bc1720f618d33b43760d45700da56fa52e146601e4e87d97b3a10dd585cb3b0bdc9d13f54e63f4e30326b387b0b4003113da12a722073be23eeb6b6f345e5e0d895ddabc5307b4bee23671ea4793812387c8db666050e8a2c634b5e4bc8b243673485cfc669288dec12bebb53dc5ea0cb079bb0af43b4bac6eb9b52853a7326d9528fe05651c3ee412e855694236d4fcd3192daa776e03bac4852f7310146998dfb0cf39e4e1e6cdb0b329b278472036e751b50a0d43e7b11717a856e93d6f73b4ef447b5ad8f4593f1e8bfbbf6d848cd6887dfd44e03ee79b72b39814071a5f70a5622dea85a6fbeec304a61a5ab4d213e959d2da156323385155c412e94b25b9e7399cb5c249506a17ca65c2a3cd2d49a1ebe99357c7707b5b6e4996f65"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('9', '42', '{"c": "mBbK1bx7W;#5vev=wY1!*a6nW7FhjWI3X9$KbVSRXClSn+{r!8n_e@-AhE3r2#bvbwxh}tD#M--AsG_DqD@Tm2IiPaRrA6Os;*^jV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "231bcb9386ea23eb2630335bc3fa7542b4bec54e5251cec202a10c53453f5b65", "ob": ["a1a1a1a19645450665cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a296cf506a6902dcd1010e8ea6daf751d025252d13f2a5f7ca6f5673aa8bda37cae6d0c2ae66eb602ed1a8922741a8a931a00682f7a84e97267b19e4d3458bd5cc5a54d8fb3a793f0627943eba3318311ea33091db781ccd8c630cb8ff1e5b3edeec7022cfe1a06c987e512f5198825eb659c6206fd6f0197de3e791d52dda77c20adac3d21d3b13acb9fb3742121befe2504ed1c5d150799176b175bf2b82a6ebd5224dab890c323cef7b3e5482eb0efaaf1bc2047afc32345c056e95312c37ece65ba637d452035540e95b338058bad657c2e105b120e30ce76dbbec3a145d491eb5513e69c40dd43a88ddeff386644df2fbd167b7bef640041f9cb57a8174d479954e45e82d3edf5be3637301b5a2c1f633565218618edae2fd75e6048bf0a"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('10', '50', '{"c": "mBbLubhR#eRIBRKP`Za3N&ddX7R78Ur?1=??q*`{-W{g@?u})F3=x0CAOaUdoNrgR-V;Hq{g-NbrRAu#Tm_n~lb?6ctYlh&Os-{aV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "4a040d1a9eb01293059eaf834e84822b97de2dd7c6839d8cdae3cf8e0ef1ab81", "ob": ["a1a1a1a19645458c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a0f4a253e2c8c48870919a382d5b81237d26b63103d7fd84d4077b73f7450239161bbb9cc31c2950d950a1f08897773eff96077f025341ee7985c264c4b9647b7e43c0e17900bdb6d4102d3ccf068ce620d26db623f44d9f5893024538009685c1f178793bfc6b8870cedb33b293a6f5c28f353a4bd0a5bc3979f159399058bb21116b011cad86bb1973be07c3976c2ca262d9fad6fb4903e412eda1839eb30c3439ac51e782e3fab35e517ead7c8b630c490a24aaea97677b4d043f429c0ee4e62a3fe71649c12fecfb7cc8473293ec8f9c9faff8e55c7c5bf4a15c6cbfd4ede19ad2d4f7a29d2c059dbe3f040913ff3c755da18a94182f8d58b94e41770f6c3d8013744e11f8890616e56d380116a7eab2e012364d5a270e8f304b9425ea94d"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('11', '100', '{"c": "mBbL!LwVV+Vl8*@^yEs2*qD*T7PpCgPf=vlV?t2SQ$v0`*^g)EmVCOzAcUF(h2<1yqODlK0-}Arf|cwjcIx+e2jMFj0t9PNsjg*iV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "2fc081842f8545a18689b5eaccca41a935f014ad6d0456a924c4fa8d445833bf", "ob": ["a1a1a1a19645451c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a8fcbebfffe2a0e9c5c05d2eebc34586707605468394a274d4ce84c73300754d90e9904f88788c32137c8207791c44b2752c20812a6ca0201db7f752f944616ab76dbbbfb4924ceae1de65e7a1c38a1b65b0574b5f07ef207a90065c42f4fa65a690e1dca4e037288b70e9a822052953c2a89711f3180c48718689db40a8d8b5715bc16bb5660cbe3484bad5f833b7f4eb57a87310f85299b501ce1efcf26903a448a9187330e2b18f2b0751003c0edf6cf0b99d1d494bf047ac3e204b94ae6aa77a85c9a443de97f7918cb5150a9c59367945d7ae89e18e2a62ad23ecd66f7d32c28ca60728db1c5815293616e4ad1de3c2d74dfdfb839216cb8dc4fc4f49269e39fc1d2f122aff77f0b0e1bfab4ef4432a4e0d3368b4366632b880e52ed89ba"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('12', '250', '{"c": "mBbK#R%P_`%atBydMup-mD_H_7Li%m8A|F;dvA>Y_^QvD>ppyX=lMOvAWh@0st_N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "5f1bd84cff5e65d213b7a5c4005f442d17f169e9e92800598adadf37cff71de6", "ob": ["a1a1a1a19645452e65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5af19c5d189cde4caa7b19cbbb583b33b8dd7bfb4df5f4508c38e1c94e477d128d1873781a3428ec43a7ccc6f55a18d784692f258c2f33bef5cb0997fe486e3b40a5a128db7e5b09db5627ee46a55258e928aa135e0285e764a5ee6aa72311bd810dae9ae2747ce6c4ec2bac140927eaa992cc85d8e9b3c0157cb4a984f58b4fd21ca5e4898cf6a61e7de5bdaa9e045ab546afb65b509f835b023439a2c962312872d38c92357cf83e3475e48450f59197edb6039b25b5abc87e6e58fcbcc42a7b4cdad8d1df6886ba577957207921b53ba1e53830156f116d751ca64138f8936e53a7831ef5fa0819aeb78243579a15383cd55d3d5449b78b01019a35ca9c70d083a2f302f3c3ef7c7ad4ef0a4e8457c552c0d16e43fa7d103ae0171644e00b88"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('13', '1000', '{"c": "mBbKDm$u6vOxUbP-P&WfMw8RT7QXc>s7fP*`bW>P>jPt179vf<5p1l)AiL0!$;tL1C}3Hyy*?tEPN2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "72a100399ebc0cbbf13b13384fbd0a06c7e1c9431ac1204888fc3ee699729f93", "ob": ["a1a1a1a19645d38465cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f6e67f6694308e6798a670a870e41a7dbd333f347fc16f34e9eb2514418afc478cfb9e0893b731832318fe5c01c734eeb58edcb2a49c210e8c80496f45c65ce55bd15fc702bd1a8a50872f2623047bb6138a88291fa548ea837d401d7315be08ae3d725cc9aa0aff3717a6e1254912daa3db212a818b2825055eec4eb6dbc01dc490a727b86e82e51f59cf03c2a76386509d1295d7c76f0474f3216fe77a107a23e88246848bfb86f0494af82b4faf91cabb351db9b568da3eb64ce360d68db724b347da4d844c47439f33585e9f416114ba73973794f2374ed18b0445ed23e6cec6584c23edc1de19e637c4cff55f5203bc104d360ac02b634c11443f110322a1eab498d5ec92abb8c89231f5b3bf10e413fdcbf4ffe41678b66f5a8550c8cce481bbb7e8eae0b6a08ce016f710c4c50"]}'::jsonb); +INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('14', '9999', '{"c": "mBbMDBL-q!6!rQwR5A43Qhsg37M6J*x1=!!pwQ*)It`0cHfasj9oF;2AfOcWDJ#~`f+FVKw-a876;D&NwU@urcv|D7XcB8Ad9Gz{V{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "805123862649caceb6c13fd53c3ea9f9e0888986cdc951cf50a820632aafb2d8", "ob": ["a1a1a1a19645b89065cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f68b1b4ca492400160ebc035ff9744a665420b36ba9eac70df9c96e41e3cc812fd5b754a8970b2f6aab01a2b4285f7aa61290f6aadf52c5c2bd986a2d61af3fe3feba900062db9674416dc29d4d4dd5e7f943a2bf458b9a4baefde3410fd713311c0d1eab7b8039922cb0721969b6fad58986a692110ca39e2293b4dc8022c8518d0bd4615e59897d9776875df6cdb835fbc1cfc69c481d5f48602a4e6da42f953f55add7b1f920d4683747eee2d0f99a9a0ad40827375edfc85ee55cf6acb4bcdc6fc5e2a69a565e7185c86b94a86acdf36be9abd7c843373d0906fd59ec38cf9d2dfd0dd8e0bd85e7525c5c02c8c4d4fb0e6fe5a211b89383a499cbb63820daccd5c37d06f4cf9faa0796eaaef8ae34617ceead72f6ef37cf0c5b5de19234e04bc3e53c92a4f6512ddd0b799fb59839"]}'::jsonb); diff --git a/tests/sqlx/tests/bench_data_tests.rs b/tests/sqlx/tests/bench_data_tests.rs index 0295eaece..c81d6d0da 100644 --- a/tests/sqlx/tests/bench_data_tests.rs +++ b/tests/sqlx/tests/bench_data_tests.rs @@ -20,6 +20,30 @@ async fn fetch_sample_encrypted_text(pool: &PgPool) -> Result { ) } +#[sqlx::test] +async fn benchmark_schema_can_be_reapplied(pool: PgPool) -> Result<()> { + sqlx::query("TRUNCATE TABLE eql_v2_configuration") + .execute(&pool) + .await?; + + let schema = include_str!("../../benchmarks/schema.sql"); + sqlx::raw_sql(schema).execute(&pool).await?; + sqlx::raw_sql(schema).execute(&pool).await?; + + let active_bench_columns: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM eql_v2.config() WHERE state = 'active' AND relation = 'bench'", + ) + .fetch_one(&pool) + .await?; + + assert_eq!( + active_bench_columns, 3, + "reapplying benchmark schema should leave one active config for each bench column" + ); + + Ok(()) +} + // ========== Data Integrity Tests ========== /// Verify fixture seeded exactly 10K rows From 7c2376067c63f5a5831d0e04532bd231ddfc4507 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 25 May 2026 10:49:48 +1000 Subject: [PATCH 003/599] feat(fixtures): add typed SQLx fixture generation --- .gitignore | 5 + ...026-05-12-encrypted-domain-types-design.md | 195 --------- mise.toml | 10 +- tasks/bench.toml | 64 --- tasks/fixtures.toml | 27 +- tasks/fixtures/_generate_common.sh | 69 --- tasks/fixtures/encrypted_int4_schema.sql | 30 -- tasks/fixtures/generate_encrypted_int4.sh | 83 ---- tests/benchmarks/.env.example | 7 - tests/benchmarks/.gitignore | 6 - tests/benchmarks/README.md | 37 -- tests/benchmarks/docker-compose.yml | 54 --- tests/benchmarks/generate.sh | 77 ---- tests/benchmarks/reports/.gitkeep | 0 tests/benchmarks/schema.sql | 81 ---- tests/sqlx/Cargo.toml | 6 + tests/sqlx/README.md | 2 +- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 62 ++- .../{like_data.sql => match_data.sql} | 2 +- .../009_install_encrypted_int4_fixture.sql | 29 -- tests/sqlx/src/fixtures/driver.rs | 406 ++++++++++++++++++ tests/sqlx/src/fixtures/eql_plaintext.rs | 96 +++++ tests/sqlx/src/fixtures/eql_v2_int4.rs | 51 +++ tests/sqlx/src/fixtures/mod.rs | 19 + tests/sqlx/src/fixtures/spec.rs | 364 ++++++++++++++++ tests/sqlx/src/fixtures/validation.rs | 129 ++++++ tests/sqlx/src/lib.rs | 1 + tests/sqlx/tests/bench_data_tests.rs | 24 -- tests/sqlx/tests/eql_v2_int4_fixture_tests.rs | 129 ++++++ tests/sqlx/tests/like_operator_tests.rs | 8 +- 30 files changed, 1301 insertions(+), 772 deletions(-) delete mode 100644 docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md delete mode 100644 tasks/bench.toml delete mode 100644 tasks/fixtures/_generate_common.sh delete mode 100644 tasks/fixtures/encrypted_int4_schema.sql delete mode 100755 tasks/fixtures/generate_encrypted_int4.sh delete mode 100644 tests/benchmarks/.env.example delete mode 100644 tests/benchmarks/.gitignore delete mode 100644 tests/benchmarks/README.md delete mode 100644 tests/benchmarks/docker-compose.yml delete mode 100755 tests/benchmarks/generate.sh delete mode 100644 tests/benchmarks/reports/.gitkeep delete mode 100644 tests/benchmarks/schema.sql rename tests/sqlx/fixtures/{like_data.sql => match_data.sql} (97%) delete mode 100644 tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql create mode 100644 tests/sqlx/src/fixtures/driver.rs create mode 100644 tests/sqlx/src/fixtures/eql_plaintext.rs create mode 100644 tests/sqlx/src/fixtures/eql_v2_int4.rs create mode 100644 tests/sqlx/src/fixtures/mod.rs create mode 100644 tests/sqlx/src/fixtures/spec.rs create mode 100644 tests/sqlx/src/fixtures/validation.rs create mode 100644 tests/sqlx/tests/eql_v2_int4_fixture_tests.rs diff --git a/.gitignore b/.gitignore index 7c1b67f27..68bca65be 100644 --- a/.gitignore +++ b/.gitignore @@ -219,6 +219,10 @@ eql--*.sql # Generated SQLx migration (built from src/, never commit) tests/sqlx/migrations/001_install_eql.sql +# Generated SQLx fixtures (regenerated via `mise run fixture:generate`, +# never commit — stale fixtures hide bugs) +tests/sqlx/fixtures/eql_v2_int4.sql + # Large generated test data files tests/ste_vec_vast.sql tests/ste_vec_*M.sql* @@ -229,6 +233,7 @@ tests/sqlx/target/ # Work files (agent-generated, not for version control) .work/ .serena/ +docs/superpowers/ # Build variants - protect variant deps src/deps-protect.txt diff --git a/docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md b/docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md deleted file mode 100644 index 914f8577f..000000000 --- a/docs/superpowers/specs/2026-05-12-encrypted-domain-types-design.md +++ /dev/null @@ -1,195 +0,0 @@ -# High-Level Encrypted Domain Types Prototype Design - -## Context - -EQL currently exposes one public encrypted column type, `public.eql_v2_encrypted`, -implemented as a composite type with a single `jsonb` payload field. Query behavior -is selected dynamically from the encrypted payload terms that are present (`hm`, -`bf`, `ob`, `opf`, `opv`, `sv`, etc.). - -The new goal is to add high-level SQL column types such as `encrypted_text`, -`encrypted_jsonb`, and `encrypted_int4`. These types should make application DDL -clearer and give each plaintext shape a static, predictable SQL operator surface. -They should not rely on the broad dynamic dispatch behavior of -`eql_v2_encrypted`. - -The prototype is intentionally limited to: - -- `public.encrypted_text` -- `public.encrypted_jsonb` -- `public.encrypted_int4` - -Configuration inference, automatic registration, broad type coverage, and -production migration behavior are out of scope for the prototype. The prototype -exists to prove whether `jsonb` domain types can provide a clean client-facing -DDL surface while still producing indexable query plans without operator -classes. - -## History And Spike Findings - -A previous branch tried changing `eql_v2_encrypted` itself from a composite type -to a `jsonb` domain. That PR closed unmerged with failing CI, and there is no -clear written rationale for the failure. Separately, EQL has kept -`public.eql_v2_encrypted` and `public.eql_v2_configuration` outside the -`eql_v2` schema so EQL upgrades can drop and recreate `eql_v2` without -cascading into customer columns. - -A transient SQL spike compared three shapes: - -- domain over raw `jsonb` -- domain over `public.eql_v2_encrypted` -- independent composite type with `(data jsonb)` - -The spike showed that domains over `public.eql_v2_encrypted` are ergonomic and -can use existing helpers, but inherit base EQL operators when exact domain -operators are absent. Independent composites avoid inherited behavior, but need -more casts and exact helper/operator wrappers. - -The approved design is simpler: define the high-level types as domains over -raw `jsonb`, then define exact operators for supported and unsupported -operations. This removes the extra `eql_v2_encrypted` layer from the new public -types. - -## Type Model - -Create public domain types over `jsonb`: - -```sql -CREATE DOMAIN public.encrypted_text AS jsonb; -CREATE DOMAIN public.encrypted_jsonb AS jsonb; -CREATE DOMAIN public.encrypted_int4 AS jsonb; -``` - -The payload remains the existing EQL encrypted JSONB payload. The specific -types do not depend on `public.eql_v2_encrypted` for storage or operator -dispatch. - -Because PostgreSQL domains can fall back to base-type behavior, every public -operation in the supported SQL surface must have an exact domain operator: - -- supported operations delegate to fixed index-term helpers; -- unsupported operations raise a type-specific error. - -This prevents accidental fallback to native `jsonb` semantics for common SQL -operators. - -## Prototype Acceptance Criteria - -The prototype must prove these properties: - -- exact domain operators resolve for supported operations; -- exact blocker operators prevent common unsupported operations from falling - through to native `jsonb` behavior; -- supported hot-path operator functions are inlineable SQL functions with no - `SET search_path` clause; -- bare operator predicates use functional indexes and do not require custom - btree or hash operator classes; -- where existing helper signatures are awkward, temporary typed helper wrappers - are small, `LANGUAGE sql`, immutable, strict, parallel-safe, and inlineable - when used in indexed predicates. - -## Operator Surface - -### `encrypted_text` - -Supported: - -- `=` and `<>`, using the `hm` term through `eql_v2.hmac_256(value::jsonb)` -- `~~` and `~~*`, using the `bf` term through `eql_v2.bloom_filter(value::jsonb)` - -Unsupported blockers: - -- `<`, `<=`, `>`, `>=` -- `@>`, `<@` -- `->`, `->>` - -### `encrypted_int4` - -Supported: - -- `=` and `<>`, using the `hm` term through `eql_v2.hmac_256(value::jsonb)` -- `<`, `<=`, `>`, `>=`, using OPE terms by default through an inlineable - expression over `value::jsonb` - -Unsupported blockers: - -- `~~`, `~~*` -- `@>`, `<@` -- `->`, `->>` - -### `encrypted_jsonb` - -Supported: - -- `=` and `<>`, using the `hm` term through `eql_v2.hmac_256(value::jsonb)` -- `@>` and `<@`, using `sv` through inlineable typed STE vector helpers or - wrappers -- `->` and `->>`, using stubbed or adapted encrypted JSON path helpers for the - domain type - -Unsupported blockers: - -- `<`, `<=`, `>`, `>=` -- `~~`, `~~*` - -## Out Of Scope - -Do not add configuration inference in this prototype. The prototype should not -change `eql_v2.add_column`, `eql_v2.add_search_config`, or the configuration -validation functions. - -Do not add automatic registration or event triggers in this prototype. - -Do not add full support for additional encrypted scalar types in this prototype. -The three selected types are enough to test text, scalar range, and JSONB -operator behavior. - -## Error Handling - -Unsupported exact operators should raise clear errors: - -```text -operator < is not supported for encrypted_text -operator ~~ is not supported for encrypted_int4 -operator -> is not supported for encrypted_int4 -``` - -Missing required encrypted index terms should fail through the fixed helper path -with the existing helper errors, such as missing `hm`, `bf`, `opf`, or `sv`. - -Supported hot-path functions should not raise custom errors for missing terms if -an existing helper already provides a precise missing-term error. - -## Testing - -Add focused SQLx coverage for the first three domain types: - -- Domain creation and assignment from valid encrypted JSONB payloads. -- Supported operators for each type. -- Unsupported operators raise the exact type-specific error instead of falling - through to native `jsonb` behavior. -- Functional indexes engage for supported terms: - - `encrypted_text`: `eql_v2.hmac_256(col::jsonb)`, - `eql_v2.bloom_filter(col::jsonb)` - - `encrypted_int4`: `eql_v2.hmac_256(col::jsonb)`, and an OPE order - expression over `col::jsonb` - - `encrypted_jsonb`: `eql_v2.hmac_256(col::jsonb)`, and a typed STE vector - array helper or overload that accepts `encrypted_jsonb` -- `EXPLAIN` plans show index scans for bare operator predicates such as - `col = rhs`, `col ~~ rhs`, `col < rhs`, and `col @> rhs`. -- The same predicates do not require btree/hash operator classes. -- Prepared statements with domain-typed parameters still resolve to exact - domain operators. - -## Implementation Boundary - -Write the first three type surfaces manually. Do not introduce a generator in -the prototype. Manual SQL keeps the spike easy to audit and -lets tests prove the domain-over-`jsonb` approach before expanding to -`encrypted_int2`, `encrypted_int8`, numeric, floating-point, boolean, date, and -timestamp types. - -Supported operator functions and helper wrappers that appear in indexed -predicates must be SQL-language functions intended for planner inlining. -Unsupported blocker functions can use PL/pgSQL because they are not performance -paths. diff --git a/mise.toml b/mise.toml index 6fd0b7c6b..86e30d477 100644 --- a/mise.toml +++ b/mise.toml @@ -14,7 +14,7 @@ "python" = "3.13" [task_config] -includes = ["tasks", "tasks/postgres.toml", "tasks/bench.toml", "tasks/fixtures.toml"] +includes = ["tasks", "tasks/postgres.toml", "tasks/fixtures.toml"] [env] POSTGRES_DB = "cipherstash" @@ -45,7 +45,15 @@ echo "Running SQLx migrations..." cd tests/sqlx sqlx migrate run +# Regenerate fixtures every run — they are not committed (see .gitignore). +# Requires Proxy on PROXY_PORT; brings it up if not already running. +echo "Regenerating SQLx fixtures..." +cd "{{config_root}}" +mise run proxy:up +mise run fixture:generate eql_v2_int4 + echo "Running Rust tests..." +cd tests/sqlx cargo test """ diff --git a/tasks/bench.toml b/tasks/bench.toml deleted file mode 100644 index 72abc487f..000000000 --- a/tasks/bench.toml +++ /dev/null @@ -1,64 +0,0 @@ -["bench:up"] -description = "Start Postgres + Proxy for benchmark data generation" -dir = "{{config_root}}" -run = """ -if [ ! -f tests/benchmarks/.env ]; then - echo "ERROR: tests/benchmarks/.env missing. Copy .env.example and fill in credentials." >&2 - exit 1 -fi -docker compose --env-file tests/benchmarks/.env -f tests/benchmarks/docker-compose.yml up -d -export PGPASSWORD="password" -echo "Waiting for bench-postgres on localhost:7433..." -for i in $(seq 1 60); do - if psql -U cipherstash -d cipherstash -h localhost -p 7433 -c 'SELECT 1' >/dev/null 2>&1; then - echo "bench-postgres ready." - break - fi - sleep 1 - if [ "$i" -eq 60 ]; then - echo "bench-postgres did not become ready in 60s." - echo - echo '=== bench-postgres logs ===' - docker logs bench-postgres 2>&1 | tail -40 - exit 1 - fi -done - -echo "Waiting for bench-proxy on localhost:6433..." -for i in $(seq 1 60); do - if psql -U cipherstash -d cipherstash -h localhost -p 6433 -c 'SELECT 1' >/dev/null 2>&1; then - echo "bench-proxy ready." - exit 0 - fi - sleep 1 -done -echo "bench-proxy did not become ready in 60s." -echo -echo '=== bench-proxy logs ===' -docker logs bench-proxy 2>&1 | tail -40 -exit 1 -""" - -["bench:down"] -description = "Stop benchmark Postgres + Proxy" -dir = "{{config_root}}" -run = """ -docker compose -f tests/benchmarks/docker-compose.yml down -v -""" - -["bench:generate"] -description = "Generate 100K encrypted bench dataset (requires bench:up first)" -# `build` produces release/cipherstash-encrypt.sql, which generate.sh -# installs into the bench Postgres container before applying schema.sql. -depends = ["build"] -dir = "{{config_root}}" -run = """ -tests/benchmarks/generate.sh 100k -""" - -["bench:full"] -description = "Run committed SQLx bench/regression suite" -dir = "{{config_root}}" -run = """ -mise run --output prefix test:bench -""" diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index 002798801..dfac6411b 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -35,12 +35,25 @@ description = "Stop CipherStash Proxy" dir = "{{config_root}}/tests" run = "docker compose -f docker-compose.proxy.yml down" -["fixture:int:generate"] -description = "Generate encrypted_int4 fixture (009) via Proxy" +["fixture:generate"] +description = "Generate a SQLx fixture script via CipherStash Proxy" +# Runs the gated generator for the named fixture. Writes +# tests/sqlx/fixtures/.sql. Must run inside the crate — there is no +# root Cargo.toml — matching test:schema / test:sqlx:watch. +# # Prerequisites: -# - mise run postgres:up (existing Postgres on POSTGRES_PORT) -# - mise run reset (ensures EQL is installed in that Postgres) +# - mise run postgres:up (Postgres with EQL installed) # - mise run proxy:up (Proxy on localhost:6432) -depends = ["build"] -dir = "{{config_root}}" -run = "tasks/fixtures/generate_encrypted_int4.sh" +# +# Usage: mise run fixture:generate eql_v2_int4 +dir = "{{config_root}}/tests/sqlx" +run = """ +fixture="{{arg(name="fixture")}}" +case "$fixture" in + (*[!a-z0-9_]*|'') echo "Invalid fixture name: $fixture (expected [a-z0-9_]+)" >&2; exit 1 ;; +esac + +cargo test --features fixture-gen --lib \ + "fixtures::${fixture}::generate" \ + -- --ignored --exact --nocapture +""" diff --git a/tasks/fixtures/_generate_common.sh b/tasks/fixtures/_generate_common.sh deleted file mode 100644 index 0d6663145..000000000 --- a/tasks/fixtures/_generate_common.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env bash -# Common helpers for fixture generators. Sourced — not executed directly. -# Sets PG_URL / PROXY_URL and exposes restart_proxy_and_wait + dump_fixture_table. - -# Resolve Postgres / Proxy connection from mise [env] (POSTGRES_*) with the -# usual defaults. PROXY_PORT comes from tests/docker-compose.proxy.yml. -PG_USER="${POSTGRES_USER:-cipherstash}" -PG_PASSWORD="${POSTGRES_PASSWORD:-password}" -PG_DB="${POSTGRES_DB:-cipherstash}" -PG_HOST="${POSTGRES_HOST:-localhost}" -PG_PORT="${POSTGRES_PORT:-7432}" -PROXY_PORT="${PROXY_PORT:-6432}" - -PG_URL="postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:${PG_PORT}/${PG_DB}" -PROXY_URL="postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:${PROXY_PORT}/${PG_DB}" - -export PGPASSWORD="$PG_PASSWORD" - -# Proxy caches its encrypt config at connection-handler init time, so any -# add_search_config call applied AFTER Proxy started won't take effect -# until Proxy reconnects. Restart and wait for it to come back. -restart_proxy_and_wait() { - echo "==> Restarting Proxy so it reloads the new encrypt config" - docker restart cipherstash-proxy >/dev/null - - for i in $(seq 1 60); do - if psql "$PROXY_URL" -c 'SELECT 1' >/dev/null 2>&1; then - echo " Proxy ready." - return 0 - fi - sleep 1 - done - - echo "ERROR: Proxy did not come back up after restart" >&2 - docker logs cipherstash-proxy 2>&1 | tail -20 - return 1 -} - -# Render fixture rows as INSERT statements using format(%L). Caller supplies: -# $1 = source table name (e.g. bench_text) -# $2 = destination table name in the migration (e.g. encrypted_text_plaintext) -# $3 = comma-separated source-column projection -# (e.g. "id, plaintext, (encrypted_text).data::text") -# $4 = comma-separated destination column types for format() placeholders -# (e.g. "%L, %L, %L::jsonb") -# $5 = destination column-name tuple -# (e.g. "(id, plaintext, payload)") -# $6 = output path -# -# The migration is written with a DROP / CREATE preamble plus the rendered -# INSERT statements. The CREATE statement must be supplied by the caller via -# stdin BEFORE calling this function; see how each generator pipes it in. -dump_fixture_table() { - local src_table="$1" - local dst_table="$2" - local src_projection="$3" - local fmt_placeholders="$4" - local dst_columns="$5" - local output_path="$6" - - psql "$PG_URL" -v ON_ERROR_STOP=1 -t -A -c " -SELECT format( - 'INSERT INTO ${dst_table} ${dst_columns} VALUES (${fmt_placeholders});', - ${src_projection} -) -FROM ${src_table} -ORDER BY id; -" >> "$output_path" -} diff --git a/tasks/fixtures/encrypted_int4_schema.sql b/tasks/fixtures/encrypted_int4_schema.sql deleted file mode 100644 index 5d870590c..000000000 --- a/tasks/fixtures/encrypted_int4_schema.sql +++ /dev/null @@ -1,30 +0,0 @@ --- Schema for the encrypted_int4 plaintext-paired fixture. --- Applied by tasks/fixtures/generate_encrypted_int4.sh; the generator --- restarts Proxy afterwards so it reloads the new encrypt config. - -DROP TABLE IF EXISTS bench_int4; - -CREATE TABLE bench_int4 ( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - plaintext INTEGER NOT NULL, - encrypted_int4 eql_v2_encrypted -); - --- Idempotency: drop any prior bench_int4 search-config rows so re-running --- the generator doesn't error with "unique index exists for column". -SELECT eql_v2.remove_search_config('bench_int4', 'encrypted_int4', 'unique') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench_int4,encrypted_int4,indexes,unique}' IS NOT NULL - ); -SELECT eql_v2.remove_search_config('bench_int4', 'encrypted_int4', 'ore') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench_int4,encrypted_int4,indexes,ore}' IS NOT NULL - ); - --- unique → HMAC (drives =, <>); ore → OPE bytes (drives <, <=, >, >=). -SELECT eql_v2.add_search_config('bench_int4', 'encrypted_int4', 'unique', 'int'); -SELECT eql_v2.add_search_config('bench_int4', 'encrypted_int4', 'ore', 'int'); diff --git a/tasks/fixtures/generate_encrypted_int4.sh b/tasks/fixtures/generate_encrypted_int4.sh deleted file mode 100755 index 5662845af..000000000 --- a/tasks/fixtures/generate_encrypted_int4.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Generates an encrypted_int4 fixture by running an integer value set -# through CipherStash Proxy and dumping the resulting (id, plaintext, -# payload jsonb) rows as a SQLx migration. -# -# Prerequisites: -# - mise run postgres:up -# - EQL installed (e.g. via mise run reset + psql -f release/cipherstash-encrypt.sql) -# - mise run proxy:up (Proxy on localhost:6432) -# - mise run build (produces release/cipherstash-encrypt.sql) -# -# Output: -# tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql - -REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -SCHEMA_SQL="$SCRIPT_DIR/encrypted_int4_schema.sql" -OUTPUT="$REPO_ROOT/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql" - -# shellcheck source=_generate_common.sh -. "$SCRIPT_DIR/_generate_common.sh" - -if [ ! -f "$SCHEMA_SQL" ]; then - echo "ERROR: $SCHEMA_SQL not found." >&2 - exit 1 -fi - -# 14 values: includes negatives (boundary), small/medium/large/extreme. -# Chosen so range pivots produce distinct cardinalities — see plan in -# docs/superpowers/plans/. -VALUES=(-100 -1 1 2 5 10 17 25 42 50 100 250 1000 9999) -ROW_COUNT=${#VALUES[@]} - -echo "==> Applying fixture schema (drops + recreates bench_int4)" -psql "$PG_URL" -v ON_ERROR_STOP=1 -f "$SCHEMA_SQL" - -restart_proxy_and_wait - -echo "==> Inserting $ROW_COUNT integers through Proxy (encrypts encrypted_int4)" -# Proxy's eql-mapper cannot unify negative integer literals (parsed as -# UnaryOp(Minus, ...)) with the EQL int column when sent via the simple -# query protocol. Send each value over the extended protocol via psql's -# \bind meta-command so the parameter type is communicated as a binary -# int4 instead of being inferred from SQL surface syntax. -INSERT_SQL=$(mktemp) -trap 'rm -f "$INSERT_SQL"' EXIT -for v in "${VALUES[@]}"; do - # Use literal $1/$2 as bind placeholders; \bind supplies their values. - # \g executes the buffered statement; \bind discards bindings after \g. - printf 'INSERT INTO bench_int4 (plaintext, encrypted_int4) VALUES ($1, $2) \\bind %s %s \\g\n' "$v" "$v" >> "$INSERT_SQL" -done -psql "$PROXY_URL" -v ON_ERROR_STOP=1 -f "$INSERT_SQL" >/dev/null - -echo "==> Dumping $ROW_COUNT rows to $OUTPUT" -cat > "$OUTPUT" <
Done. Wrote $ROW_COUNT rows to $OUTPUT" diff --git a/tests/benchmarks/.env.example b/tests/benchmarks/.env.example deleted file mode 100644 index fe41909a4..000000000 --- a/tests/benchmarks/.env.example +++ /dev/null @@ -1,7 +0,0 @@ -# CipherStash Proxy credentials -# Get these from https://dashboard.cipherstash.com -CS_CLIENT_ACCESS_KEY= -CS_DEFAULT_KEYSET_ID= -CS_CLIENT_KEY= -CS_CLIENT_ID= -CS_WORKSPACE_CRN= diff --git a/tests/benchmarks/.gitignore b/tests/benchmarks/.gitignore deleted file mode 100644 index 9e7d7623f..000000000 --- a/tests/benchmarks/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Generated reports (too large for git, regenerated on demand) -reports/* -!reports/.gitkeep - -# Local Proxy credentials -.env diff --git a/tests/benchmarks/README.md b/tests/benchmarks/README.md deleted file mode 100644 index 69087bdb8..000000000 --- a/tests/benchmarks/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Benchmark Utilities - -This directory contains the Dockerized support stack for generating a 100K-row -encrypted benchmark dataset through CipherStash Proxy. - -The committed automated benchmark coverage lives in the SQLx bench/regression -suite (`mise run test:bench`). `mise run bench:full` is a convenience wrapper -around that existing suite; it does not consume the 100K Docker dataset. - -## Local usage - -```bash -# Populate credentials for the Dockerized Proxy -cp tests/benchmarks/.env.example tests/benchmarks/.env -# Edit .env with your CipherStash credentials - -# Start bench-postgres + bench-proxy and wait for host-side readiness checks -mise run bench:up - -# Build EQL and generate the 100K encrypted dataset in bench-postgres -mise run bench:generate - -# Run the committed SQLx bench/regression suite (10K fixture-based) -mise run bench:full - -# Tear down the Dockerized benchmark stack when finished -mise run bench:down -``` - -## What each task does - -- `bench:up` starts `bench-postgres` and `bench-proxy`, then probes them from - the host with `psql`. -- `bench:generate` installs the built EQL SQL into `bench-postgres`, applies - `schema.sql`, and inserts 100K plaintext rows through Proxy on `localhost:6433`. -- `bench:full` delegates to `mise run test:bench`, which runs the committed - SQLx benchmark/regression suite against the normal local test database. diff --git a/tests/benchmarks/docker-compose.yml b/tests/benchmarks/docker-compose.yml deleted file mode 100644 index d67aca7c3..000000000 --- a/tests/benchmarks/docker-compose.yml +++ /dev/null @@ -1,54 +0,0 @@ -services: - postgres: - image: postgres:17 - container_name: bench-postgres - command: > - postgres - -c track_functions=all - -c shared_preload_libraries=pg_stat_statements - -c pg_stat_statements.track=all - -c pg_stat_statements.max=10000 - ports: - - "7433:5432" - environment: - POSTGRES_DB: cipherstash - POSTGRES_USER: cipherstash - POSTGRES_PASSWORD: password - healthcheck: - test: ["CMD-SHELL", "pg_isready -U cipherstash"] - interval: 1s - timeout: 5s - retries: 10 - networks: - - bench - - proxy: - image: cipherstash/proxy:latest - container_name: bench-proxy - ports: - - "6433:6432" - environment: - CS_DATABASE__NAME: cipherstash - CS_DATABASE__USERNAME: cipherstash - CS_DATABASE__PASSWORD: password - CS_DATABASE__HOST: postgres - CS_DATABASE__PORT: 5432 - # EQL install is performed explicitly by generate.sh before schema.sql runs. - # Leaving Proxy's own install off avoids racing against generate.sh. - CS_DATABASE__INSTALL_EQL: "false" - CS_CLIENT_ACCESS_KEY: ${CS_CLIENT_ACCESS_KEY} - CS_DEFAULT_KEYSET_ID: ${CS_DEFAULT_KEYSET_ID} - CS_CLIENT_KEY: ${CS_CLIENT_KEY} - CS_CLIENT_ID: ${CS_CLIENT_ID} - CS_WORKSPACE_CRN: ${CS_WORKSPACE_CRN} - depends_on: - postgres: - condition: service_healthy - networks: - - bench - # No in-container healthcheck: the current cipherstash/proxy image does - # not ship `nc`, so readiness is verified from the host by `bench:up` - # using `psql` against localhost:6433. -networks: - bench: - driver: bridge diff --git a/tests/benchmarks/generate.sh b/tests/benchmarks/generate.sh deleted file mode 100755 index 595e8d105..000000000 --- a/tests/benchmarks/generate.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Generates a 100K-row encrypted bench dataset via CipherStash Proxy. -# No dump is written in v1 — the Tier 2 workflow regenerates fresh each run. -# -# Prerequisites: -# - mise run build (produces release/cipherstash-encrypt.sql) -# - docker compose -f tests/benchmarks/docker-compose.yml up -d --wait -# - tests/benchmarks/.env populated with CipherStash credentials - -REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -EQL_SQL="$REPO_ROOT/release/cipherstash-encrypt.sql" -SCALE="${1:-100k}" - -case "$SCALE" in - 100k) ROWS=100000 ;; - *) echo "Unsupported scale: $SCALE (only 100k in v1)" >&2; exit 1 ;; -esac - -if [ ! -f "$EQL_SQL" ]; then - echo "ERROR: $EQL_SQL not found. Run 'mise run build' first." >&2 - exit 1 -fi - -PG_URL="postgresql://cipherstash:password@localhost:7433/cipherstash" -PROXY_URL="postgresql://cipherstash:password@localhost:6433/cipherstash" - -echo "==> Installing EQL into bench-postgres" -psql "$PG_URL" -v ON_ERROR_STOP=1 -f "$EQL_SQL" >/dev/null - -echo "==> Applying bench schema and Proxy search configuration" -psql "$PG_URL" -v ON_ERROR_STOP=1 -f "$SCRIPT_DIR/schema.sql" - -# Proxy caches the encrypt config at connection-handler init. add_search_config -# in schema.sql writes the new config but the Proxy will keep running in -# PASSTHROUGH MODE (inserts pass through unencrypted) until it reconnects. -# Restart and wait for it to come back before driving the INSERT. -echo "==> Restarting bench-proxy so it reloads the new encrypt config" -docker restart bench-proxy >/dev/null -for i in $(seq 1 60); do - if psql "$PROXY_URL" -c 'SELECT 1' >/dev/null 2>&1; then - echo " Proxy ready." - break - fi - sleep 1 - if [ "$i" -eq 60 ]; then - echo "ERROR: bench-proxy did not come back up after restart" >&2 - docker logs bench-proxy 2>&1 | tail -20 - exit 1 - fi -done - -echo "==> Inserting $ROWS plaintext rows through Proxy (this encrypts them)" -# generate_series emits plaintext rows; Proxy intercepts and encrypts each -# column per the search config applied in schema.sql. -psql "$PROXY_URL" -v ON_ERROR_STOP=1 -c " -INSERT INTO bench (encrypted_text, encrypted_int, encrypted_bigint) -SELECT - ('text_' || (((gs - 1) % 1000) + 1))::text, - (((gs - 1) % 1000) + 1)::int, - (((gs - 1) % 1000) + 1)::bigint * 1000000000 -FROM generate_series(1, $ROWS) AS gs; -" - -echo "==> Creating indexes and running ANALYZE" -psql "$PG_URL" -v ON_ERROR_STOP=1 -c " -CREATE INDEX IF NOT EXISTS bench_text_hmac_idx ON bench USING hash (eql_v2.hmac_256(encrypted_text)); -CREATE INDEX IF NOT EXISTS bench_text_ore_idx ON bench USING btree (encrypted_text eql_v2.encrypted_operator_class); -CREATE INDEX IF NOT EXISTS bench_int_ore_idx ON bench USING btree (encrypted_int eql_v2.encrypted_operator_class); -CREATE INDEX IF NOT EXISTS bench_bigint_ore_idx ON bench USING btree (encrypted_bigint eql_v2.encrypted_operator_class); -CREATE INDEX IF NOT EXISTS bench_text_bloom_idx ON bench USING gin (eql_v2.bloom_filter(encrypted_text)); -ANALYZE bench; -" - -echo "==> Done. Rows: $ROWS" diff --git a/tests/benchmarks/reports/.gitkeep b/tests/benchmarks/reports/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/benchmarks/schema.sql b/tests/benchmarks/schema.sql deleted file mode 100644 index 88bb7be48..000000000 --- a/tests/benchmarks/schema.sql +++ /dev/null @@ -1,81 +0,0 @@ --- Bench schema for Tier 2 benchmarks. --- Applied against the bench-postgres container AFTER EQL has been explicitly --- installed by generate.sh (see Task 4 — generate.sh installs --- release/cipherstash-encrypt.sql directly, not relying on Proxy's async install). - -DROP TABLE IF EXISTS bench; - -CREATE TABLE bench ( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - encrypted_text eql_v2_encrypted, - encrypted_int eql_v2_encrypted, - encrypted_bigint eql_v2_encrypted -); - --- Idempotency: clear any prior bench search-config rows so re-running the --- generator against the same container doesn't error with "... index exists --- for column". EQL uninstall drops the schema but not public config rows. -SELECT eql_v2.remove_search_config('bench', 'encrypted_text', 'unique') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench,encrypted_text,indexes,unique}' IS NOT NULL - ); -SELECT eql_v2.remove_search_config('bench', 'encrypted_text', 'match') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench,encrypted_text,indexes,match}' IS NOT NULL - ); -SELECT eql_v2.remove_search_config('bench', 'encrypted_text', 'ore') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench,encrypted_text,indexes,ore}' IS NOT NULL - ); -SELECT eql_v2.remove_search_config('bench', 'encrypted_int', 'unique') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench,encrypted_int,indexes,unique}' IS NOT NULL - ); -SELECT eql_v2.remove_search_config('bench', 'encrypted_int', 'ore') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench,encrypted_int,indexes,ore}' IS NOT NULL - ); -SELECT eql_v2.remove_search_config('bench', 'encrypted_bigint', 'unique') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench,encrypted_bigint,indexes,unique}' IS NOT NULL - ); -SELECT eql_v2.remove_search_config('bench', 'encrypted_bigint', 'ore') - WHERE EXISTS ( - SELECT 1 - FROM public.eql_v2_configuration c - WHERE c.data #> '{tables,bench,encrypted_bigint,indexes,ore}' IS NOT NULL - ); - --- Proxy search configuration: tells Proxy which index terms to generate --- for each column when plaintext is inserted. --- --- Signature: eql_v2.add_search_config(table, column, index, cast_as) --- (see src/config/functions.sql). add_search_config calls activate_config --- internally when migrating=false, so no explicit activate_config call. - --- text column: equality (hmac), pattern match (bloom), ordering (ore) -SELECT eql_v2.add_search_config('bench', 'encrypted_text', 'unique', 'text'); -SELECT eql_v2.add_search_config('bench', 'encrypted_text', 'match', 'text'); -SELECT eql_v2.add_search_config('bench', 'encrypted_text', 'ore', 'text'); - --- integer column: equality + ORE range/ordering -SELECT eql_v2.add_search_config('bench', 'encrypted_int', 'unique', 'int'); -SELECT eql_v2.add_search_config('bench', 'encrypted_int', 'ore', 'int'); - --- bigint column: equality + ORE range/ordering -SELECT eql_v2.add_search_config('bench', 'encrypted_bigint', 'unique', 'big_int'); -SELECT eql_v2.add_search_config('bench', 'encrypted_bigint', 'ore', 'big_int'); - --- Indexes (created after data load in generate.sh, after ANALYZE) diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 875383cfc..95fb86a2c 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -22,3 +22,9 @@ default = [] # it on push to main and on a nightly schedule. Run locally with: # mise run test:bench bench = [] +# Opt-in to compiling the fixture generators. Without this feature the +# `#[cfg(feature = "fixture-gen")]` generator tests do not exist, so +# `cargo test` and CI never see them. Generators need a live Postgres and +# CipherStash Proxy; run one with: +# mise run fixture:generate +fixture-gen = [] diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index ec4e92eb9..a1dc82528 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -70,7 +70,7 @@ cargo test -- --nocapture **encryptindex_tables.sql**: Tables for encryption workflow tests - Table: `users` with plaintext columns for encryption testing -**like_data.sql**: Test data for LIKE operator tests +**match_data.sql**: Test data for LIKE operator tests - 3 encrypted records with bloom filter indexes diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 8814dff09..e4ac7856a 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -7,13 +7,21 @@ This document defines the structure and dependencies of test fixtures used in th ``` EQL Extension (via migrations) ├── encrypted_json.sql - ├── array_data.sql + │ └── array_data.sql (extends `encrypted` table from encrypted_json) + ├── match_data.sql + ├── aggregate_minmax_data.sql + ├── config_tables.sql + ├── constraint_tables.sql + ├── encryptindex_tables.sql + ├── drop_operator_classes.sql (Supabase-simulation; drops opclasses + ORE operators) ├── order_by_null_data.sql (depends on ore migration) ├── ore table (migration 002 — not a fixture) └── bench_data.sql + bench_setup.sql (depend on migration 007) + +eql_v2_int4.sql (no EQL dependency — generated, plain jsonb, not committed) ``` -All fixtures depend on the EQL extension being installed via SQLx migrations. +All fixtures except the generated `eql_v2_int4.sql` depend on the EQL extension being installed via SQLx migrations. --- @@ -182,6 +190,56 @@ CREATE TABLE bench ( --- +## eql_v2_int4.sql + +**Purpose:** 14 encrypted integers for verifying encrypted-integer fixture +structure. Unlike its neighbours, this is a **generated** fixture — produced by +`mise run fixture:generate eql_v2_int4` (the Rust fixture framework in +`tests/sqlx/src/fixtures/`) and **not committed** (see `.gitignore`). It is +plain SQL with **no EQL dependency**: `payload` is `jsonb`, so the script +applies standalone. + +**Regenerated every test run.** `mise run test:sqlx` invokes the generator +before `cargo test`, so a stale committed fixture cannot mask a payload-shape +regression. The generator needs a live Postgres with EQL and a running +CipherStash Proxy — `test:sqlx` brings the Proxy up automatically via +`mise run proxy:up`. Do not hand-edit the generated file; it is overwritten in +place on every run. + +**Schema:** Table lives in the dedicated `fixtures` SQL schema (kept out of the +`public` type/domain namespace so a downstream `public.eql_v2_int4` domain can +coexist): +```sql +CREATE SCHEMA IF NOT EXISTS fixtures; +CREATE TABLE fixtures.eql_v2_int4 ( + id BIGINT PRIMARY KEY, + plaintext integer NOT NULL, + payload jsonb NOT NULL +); +``` + +**Data:** +- 14 rows, ids 1-14; `id = N` is the Nth generated value. +- `plaintext` values: `-100, -1, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999` + — a negative boundary plus small/medium/large/extreme magnitudes. +- `plaintext` is the **in-table oracle**: consuming tests filter + `WHERE plaintext = N` directly, so no Rust value constant is shared. +- Each `payload` is a Proxy-encrypted JSONB object carrying `c` (ciphertext), + `hm` (HMAC equality term), `ob` (ORE block ordering term), and an inert `i` + metadata object. + +**Used By:** +- eql_v2_int4_fixture_tests.rs (structural verification) +- (#225) the `eql_v2_int4` domain operator tests, via per-query `payload` casts + +**Opt-in:** Not a migration — a SQLx fixture script. Each consuming test opts +in explicitly: +```rust +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +``` + +--- + ## Validation Tests Each fixture should have a validation test to ensure correct structure: diff --git a/tests/sqlx/fixtures/like_data.sql b/tests/sqlx/fixtures/match_data.sql similarity index 97% rename from tests/sqlx/fixtures/like_data.sql rename to tests/sqlx/fixtures/match_data.sql index 8f5b2adc0..bd7a49c51 100644 --- a/tests/sqlx/fixtures/like_data.sql +++ b/tests/sqlx/fixtures/match_data.sql @@ -1,4 +1,4 @@ --- Fixture: like_data.sql +-- Fixture: match_data.sql -- -- Creates test data for LIKE operator tests (~~ and ~~* operators) -- Tests encrypted-to-encrypted matching using bloom filter indexes diff --git a/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql b/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql deleted file mode 100644 index 7556d9e6a..000000000 --- a/tests/sqlx/migrations/009_install_encrypted_int4_fixture.sql +++ /dev/null @@ -1,29 +0,0 @@ --- AUTO-GENERATED by tasks/fixtures/generate_encrypted_int4.sh --- DO NOT EDIT BY HAND. Re-run the generator to refresh. --- --- Source: 14-value integer set defined inline in the generator. --- Produced via CipherStash Proxy (HMAC + OPE terms). --- Used by encrypted_int4 domain SQLx fixture tests. - -DROP TABLE IF EXISTS encrypted_int4_plaintext; - -CREATE TABLE encrypted_int4_plaintext ( - id BIGINT PRIMARY KEY, - plaintext INTEGER NOT NULL, - payload JSONB NOT NULL -); - -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('1', '-100', '{"c": "mBbKSl1A>nJLHvy{R_+!y+r237Oz{OOyZusRU1%=^N29ellMsHtFke~AjFeV1#(=nP!7;6lb4dK$exS)cVyEoXZr0(3=TevwytGvV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "c8faf5849bba756007c19df73eb704aa640dea7eec353af533b4502cc354640d", "ob": ["a1a1a1a15481492c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fef2c4558f8c98caf3d95b2a84cfd8d1bf34d597f6b0c7cec23413e27dcb5fea3fa07832f2566f859ed23a16910615e5364d4ac48ae66b56b98836c956171ab4d6cf6eacaa0b1c7b5bae407558a7751d01a3312a765d38eabd8f55815ff310aeab71a3e802ad78088941fb5dbf1867d548b10969184d3a56b71bcbae6f31cec20585879ed7da7174b4bbf9d60080b5ba9ecd38473e20631bbfb4d4883fca75cdf7e4727c85f669e3bc8981fa2d7b6d2309793c86ccdb1fa1fb5e352b4298b138bdee80b603ca95ced5a3a6788048b8922b7f679a524270f36e44ba6006303b494e1e3b6efb9878ce9da67942d1b7c5e1d2ff8d337be041c00f85317c66144171419aa7577d5a717d569c0d5dfe9fa5d52bdf449fa4043a4258c98514eb81abda3b05213f1d096f8e63f7ed72fc7d8f7d88464484bc8d75acc26688770b3f68d699383a92037bc5b015f723aa4a0a7d9073"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('2', '-1', '{"c": "mBbLfH%e(Q?p_s?bNQ{<#{uC8TnV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "f6bde997370f33b54e4ca61473609b197879c18e5197548176518b714b119146", "ob": ["a1a1a1a15481495d65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fef2c4558f8c98caf3d95b2a84cfd8d1bf34d597f6b0c7cec23413e27dcb5fea3fa07832f2566f859ed23a16910615e5365295862e7ec0da68e2a3decc06d1d557b6922aae88582b92f00da5cf7b0e22fef74f1ed895c9164c470aea01637f1d726adaa19b9413d51b2e80f9e6c9fdc1f74a576aabbd6f183d9c6de23082f281d85a5dacf3c5aa719d1ad4a8f22aeb281587ea04465e7d99b73daa382f44af6cc6b300698cdd517f908f618cea3c3733ecccdaf649b4cf9355a9d27bc81c64563e6f177b8755b3aff1bd4549d0e572fe44b752fb8d0e96fd76a5be31a4945ed2ceda86d928aba563485661bcd2ea533396be44c4cd918a5e7eef8dfbb10982ed3eaa49b35036ef673a21ff39e26fe62860d8219ee9aa001e094ce1131ebe5aaef33f8e933a9eb6003c4b9a656043a9cd8723d60174e429f998f37e7317f27a05b68ecbb3c6a4944f062875b85d2d7131da"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('3', '1', '{"c": "mBbLYhRor}6CjJ;AsHY+(?Ng47K{2;`qaGoX)GjDl0Y0;`k@_)eA52JATQHQY^bSRimoI>d;+&&X6|8PG@TT7Dsa8|UCWFmT&`tqV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "e166c0aac72bd6715d32ef1601aa5333531ead4620a5f29da2c1de3488f4c567", "ob": ["a1a1a1a1964545e965cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5af190366875ddb8de5697963484becd5ebb1925d11d89ea7ec7949dc519e7596d9091bf1241fafbc5da30c777b671912ce3e0c372c0ed63fd8499fee2dd5e3934ac2f0f6c4f84a698d76e0fa3a60c19f48dd672705751068bdb2846bd092f5122b1260d9e42cefc95d66b9e2376e6b0a982046952cea11611dbc2a12aac49f2111095cdbe647100a9959bd720d03477ed4fd27e062f65d7b7fdbc9a44d2033563b603a4f3cfe1fcda82cf1730c40f01d92141f4611d6b00dfb08298a41533f7369965867af4a9fba4dbaba1467a2e3b923f970a9c08370b45ae608445f8cab67f1085291ebbf194435b0606b49e8771eb5cfc20cb51c79ff273a77b730fc35fc07c62bb21330260a44e3dc132b19cc7e7874643ffc27ccbb41375abe6c302b009"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('4', '2', '{"c": "mBbM0cqpOq3a!Xis`V0^%ic<-7|Nd29<6#ESv$eRAST6LAHL`!o;_oQUU9dZbi{(cCVQ)i*P2|4WORRB5UyozV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "84507797349e30049201af1f46c5e2e47f4660d18726716a0b56427c0b9a021b", "ob": ["a1a1a1a19645458b65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a513c8a4a70ef54eb8ba541efae0e03dd2fe9264d04a5ef27b7da6eb22e3e902476b6a1bb794b88bae7a12f5341b8c5ea582a5b9d244cd2e6a72e1bc9dca08af01b426d7a918cf1b3f809b957b3083b2d4d93d296c038b17bbd3bdc956a2f97d9791368528ddcc6d87c5b1f8a34f54662ea8f3f8d24ebf67ff186e3ed7ac6e03a94132f7d4e7d7061a53d8013aa36caa74bc98dda9106ad9cf37cfed6a7ff7f8e1270bc9d413251eb1f43ed53fc5a15dfa9d53a8e79478de5a9447c5135d8b8325a5fe397fdb796630bc2fa5e06144fdbd49a576a4833bfd0fc1c89246c9fc807064d10bc3b5d18d3d1f1e07fadb1bd719db0310aa8573a5e7baf1e5fa3d4e791313c225c47cf39089e70d71ee1801c10f278b37eb23afebe904e4f89953d4a64"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('5', '5', '{"c": "mBbKeYS{+(Zso@h#h(k`Pj$@178N4lo-=GaVRpm;j@X|!wb;*>4Co2OARQ#xz%i*M8ke;~Gda*nx5p{`|aV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "fd87f32d954e6b8114710c1cb421b25f9c32ff08cf0b69ba68053ef2a32ec854", "ob": ["a1a1a1a19645459e65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5aa803720971383049abfacef1eae1766a2d5bd879296124ac6930a8cdb4dbe1059aabb4b89fc13888fc4b60fa4498fdecb008eb20c7ae868fa21ba4d55cb69a75a30eaa52f5633c290dffbb6453c35c11fb67fef2a62cabb7a5653e3c3719aa5d805f2fdf80eb05ab66baa6b7f7b3956e71bea6fe97aba914e89e96e4fb6fcf1153f5fd64b8217f18836536df493179b93215ad84e36215c80c2eac0446d6ceb8d1bc26bf325fb597b8bce8192876f2121524d00068bb05b97a7965d982022c61c0fc76ecd90a211587ed344554810dcf102902718a5ed127eacbb43d3030d4ecfa9a6e86541675286dcaa330ae210b3e3d8a5a89f436ac2daa80a1e3f2bd84c4772c417fa71863b43d6a4b8e0e77051240fd73bb3b66eb03a70196ef6f7ffcf8"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('6', '10', '{"c": "mBbJ$2dznX$8+hEVm#p*84AqA7WaqRu6P1z-60C!XlFVZGl#oq!c!{5AkID7t=)F>bIS!jr`cENW5zfF#$D)=RI@5fzL6JWpRQ$YV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "9dfab57faa412c407c8b7a8c6f988afc15f9ab25e604fc6542eb84b00f52e2d9", "ob": ["a1a1a1a19645457265cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a3113f16bb322e59b86500da7574b52d298792c385a5d0355b9ccea9127c7f17fae5686334ec7416bd4da7f31ffe18b8dab571880bd0a11d8dadef2b8210123311a855d8db9c3254af31572e6909f2ec36975aa2e2df540fd7e47398b2dbbb911711c241ad9e2f8471b63e8b74adb6e8c1c10291740faebf8e3c58e2100682e750301eb6807e1723a8a0f228cc3af70860d8b2d7d5efbb8ed2ebad31656f9f31cc20fe49139dd0e97bfeac1d0f599d40e24b6222549b0793be4a19c7f8ebac901021a70eff61a0838eff9acec17d78007237034d10a0672cec37205b095eb80480613da7f4d7139241a274750db8a4e0792e1447f5d52887cbdc935e159c8e13107d26d33dca94518bb4693f7fb6e059c1222561255ccb5f33d4ea9fb187721db"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('7', '17', '{"c": "mBbKs&oax}9^^|SIisV#TLyx}7GwgnjEjg#`hWPogd*#F6}hSJWVEy(B19mLgF*=B&)fehTfyWDL@xFRo>7V{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "0ec321b40a8ae7a37bfd557d8451714996b2986447d32d6a6b3ba91492be0bfe", "ob": ["a1a1a1a1964545ee65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a2b59b0c0132c8308a958946dba0cabf8b5ee08e2c8a7d77f9fe513bf5e8e7da0fecb176102b68aee30552310f7d56af4e973dc54cf43e9d83a72ea3fd8988c7263ec26abd96a3f5afa1b7abfe2c4cee5ed7498c6ea3cc189a1cbac98d9044145dc7598710e35a6ba8bae587c1f115296172695b48c26d4a3497a65cfcb98d63f5e91c34ba1a921883152c1541b85a12bea47bf7de15a9ddb01c8699f93850b42f95cf4f7b5ec56e5fa952235804cd306d5e654da2460a403f81db4aa3b6e667bc5315997e7b69f36acf6b2fc8ba68cfabfb846dbbf124db55cae63f4e38fdbe83d7fc54579b5ba0f2f282847c1a3b3fe4235c5dd1da69e3f1b33eeb6c31fe67ce5f333cd797e2d2aa6d702e9236f7c310b1dc3ee682ff09187c3eb73d11aa72a"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('8', '25', '{"c": "mBbKzuk={LFxu?QubtJ*_sx6=Y5HPpN6zXtgdBlV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "3a8ce9251f3ee4904d625b2e79f9eb930c2b3086ae641f934260c9dd3cf0ecb6", "ob": ["a1a1a1a19645454c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a542bc1720f618d33b43760d45700da56fa52e146601e4e87d97b3a10dd585cb3b0bdc9d13f54e63f4e30326b387b0b4003113da12a722073be23eeb6b6f345e5e0d895ddabc5307b4bee23671ea4793812387c8db666050e8a2c634b5e4bc8b243673485cfc669288dec12bebb53dc5ea0cb079bb0af43b4bac6eb9b52853a7326d9528fe05651c3ee412e855694236d4fcd3192daa776e03bac4852f7310146998dfb0cf39e4e1e6cdb0b329b278472036e751b50a0d43e7b11717a856e93d6f73b4ef447b5ad8f4593f1e8bfbbf6d848cd6887dfd44e03ee79b72b39814071a5f70a5622dea85a6fbeec304a61a5ab4d213e959d2da156323385155c412e94b25b9e7399cb5c249506a17ca65c2a3cd2d49a1ebe99357c7707b5b6e4996f65"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('9', '42', '{"c": "mBbK1bx7W;#5vev=wY1!*a6nW7FhjWI3X9$KbVSRXClSn+{r!8n_e@-AhE3r2#bvbwxh}tD#M--AsG_DqD@Tm2IiPaRrA6Os;*^jV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "231bcb9386ea23eb2630335bc3fa7542b4bec54e5251cec202a10c53453f5b65", "ob": ["a1a1a1a19645450665cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a296cf506a6902dcd1010e8ea6daf751d025252d13f2a5f7ca6f5673aa8bda37cae6d0c2ae66eb602ed1a8922741a8a931a00682f7a84e97267b19e4d3458bd5cc5a54d8fb3a793f0627943eba3318311ea33091db781ccd8c630cb8ff1e5b3edeec7022cfe1a06c987e512f5198825eb659c6206fd6f0197de3e791d52dda77c20adac3d21d3b13acb9fb3742121befe2504ed1c5d150799176b175bf2b82a6ebd5224dab890c323cef7b3e5482eb0efaaf1bc2047afc32345c056e95312c37ece65ba637d452035540e95b338058bad657c2e105b120e30ce76dbbec3a145d491eb5513e69c40dd43a88ddeff386644df2fbd167b7bef640041f9cb57a8174d479954e45e82d3edf5be3637301b5a2c1f633565218618edae2fd75e6048bf0a"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('10', '50', '{"c": "mBbLubhR#eRIBRKP`Za3N&ddX7R78Ur?1=??q*`{-W{g@?u})F3=x0CAOaUdoNrgR-V;Hq{g-NbrRAu#Tm_n~lb?6ctYlh&Os-{aV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "4a040d1a9eb01293059eaf834e84822b97de2dd7c6839d8cdae3cf8e0ef1ab81", "ob": ["a1a1a1a19645458c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a0f4a253e2c8c48870919a382d5b81237d26b63103d7fd84d4077b73f7450239161bbb9cc31c2950d950a1f08897773eff96077f025341ee7985c264c4b9647b7e43c0e17900bdb6d4102d3ccf068ce620d26db623f44d9f5893024538009685c1f178793bfc6b8870cedb33b293a6f5c28f353a4bd0a5bc3979f159399058bb21116b011cad86bb1973be07c3976c2ca262d9fad6fb4903e412eda1839eb30c3439ac51e782e3fab35e517ead7c8b630c490a24aaea97677b4d043f429c0ee4e62a3fe71649c12fecfb7cc8473293ec8f9c9faff8e55c7c5bf4a15c6cbfd4ede19ad2d4f7a29d2c059dbe3f040913ff3c755da18a94182f8d58b94e41770f6c3d8013744e11f8890616e56d380116a7eab2e012364d5a270e8f304b9425ea94d"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('11', '100', '{"c": "mBbL!LwVV+Vl8*@^yEs2*qD*T7PpCgPf=vlV?t2SQ$v0`*^g)EmVCOzAcUF(h2<1yqODlK0-}Arf|cwjcIx+e2jMFj0t9PNsjg*iV{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "2fc081842f8545a18689b5eaccca41a935f014ad6d0456a924c4fa8d445833bf", "ob": ["a1a1a1a19645451c65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5a8fcbebfffe2a0e9c5c05d2eebc34586707605468394a274d4ce84c73300754d90e9904f88788c32137c8207791c44b2752c20812a6ca0201db7f752f944616ab76dbbbfb4924ceae1de65e7a1c38a1b65b0574b5f07ef207a90065c42f4fa65a690e1dca4e037288b70e9a822052953c2a89711f3180c48718689db40a8d8b5715bc16bb5660cbe3484bad5f833b7f4eb57a87310f85299b501ce1efcf26903a448a9187330e2b18f2b0751003c0edf6cf0b99d1d494bf047ac3e204b94ae6aa77a85c9a443de97f7918cb5150a9c59367945d7ae89e18e2a62ad23ecd66f7d32c28ca60728db1c5815293616e4ad1de3c2d74dfdfb839216cb8dc4fc4f49269e39fc1d2f122aff77f0b0e1bfab4ef4432a4e0d3368b4366632b880e52ed89ba"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('12', '250', '{"c": "mBbK#R%P_`%atBydMup-mD_H_7Li%m8A|F;dvA>Y_^QvD>ppyX=lMOvAWh@0st_N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "5f1bd84cff5e65d213b7a5c4005f442d17f169e9e92800598adadf37cff71de6", "ob": ["a1a1a1a19645452e65cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f1888b615f7526dbcd21f213f1891df5af19c5d189cde4caa7b19cbbb583b33b8dd7bfb4df5f4508c38e1c94e477d128d1873781a3428ec43a7ccc6f55a18d784692f258c2f33bef5cb0997fe486e3b40a5a128db7e5b09db5627ee46a55258e928aa135e0285e764a5ee6aa72311bd810dae9ae2747ce6c4ec2bac140927eaa992cc85d8e9b3c0157cb4a984f58b4fd21ca5e4898cf6a61e7de5bdaa9e045ab546afb65b509f835b023439a2c962312872d38c92357cf83e3475e48450f59197edb6039b25b5abc87e6e58fcbcc42a7b4cdad8d1df6886ba577957207921b53ba1e53830156f116d751ca64138f8936e53a7831ef5fa0819aeb78243579a15383cd55d3d5449b78b01019a35ca9c70d083a2f302f3c3ef7c7ad4ef0a4e8457c552c0d16e43fa7d103ae0171644e00b88"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('13', '1000', '{"c": "mBbKDm$u6vOxUbP-P&WfMw8RT7QXc>s7fP*`bW>P>jPt179vf<5p1l)AiL0!$;tL1C}3Hyy*?tEPN2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "72a100399ebc0cbbf13b13384fbd0a06c7e1c9431ac1204888fc3ee699729f93", "ob": ["a1a1a1a19645d38465cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f6e67f6694308e6798a670a870e41a7dbd333f347fc16f34e9eb2514418afc478cfb9e0893b731832318fe5c01c734eeb58edcb2a49c210e8c80496f45c65ce55bd15fc702bd1a8a50872f2623047bb6138a88291fa548ea837d401d7315be08ae3d725cc9aa0aff3717a6e1254912daa3db212a818b2825055eec4eb6dbc01dc490a727b86e82e51f59cf03c2a76386509d1295d7c76f0474f3216fe77a107a23e88246848bfb86f0494af82b4faf91cabb351db9b568da3eb64ce360d68db724b347da4d844c47439f33585e9f416114ba73973794f2374ed18b0445ed23e6cec6584c23edc1de19e637c4cff55f5203bc104d360ac02b634c11443f110322a1eab498d5ec92abb8c89231f5b3bf10e413fdcbf4ffe41678b66f5a8550c8cce481bbb7e8eae0b6a08ce016f710c4c50"]}'::jsonb); -INSERT INTO encrypted_int4_plaintext (id, plaintext, payload) VALUES ('14', '9999', '{"c": "mBbMDBL-q!6!rQwR5A43Qhsg37M6J*x1=!!pwQ*)It`0cHfasj9oF;2AfOcWDJ#~`f+FVKw-a876;D&NwU@urcv|D7XcB8Ad9Gz{V{&N2h#1KJ4(b;4eKp?Aiw4IQd+|>", "i": {"c": "encrypted_int4", "t": "bench_int4"}, "v": 2, "hm": "805123862649caceb6c13fd53c3ea9f9e0888986cdc951cf50a820632aafb2d8", "ob": ["a1a1a1a19645b89065cecfeb3421313bec09225b7928c0122f3a5d81152b1289903ac6485ca9843c2de97fa9663be406a80b7d54a06ab01a16abf5fdcab6b6f5a2a48ba6fd34c0fe6bc8785683b327c03f13eb22dad68591e08a40c49634b09f96c8ac98661a5d2f68b1b4ca492400160ebc035ff9744a665420b36ba9eac70df9c96e41e3cc812fd5b754a8970b2f6aab01a2b4285f7aa61290f6aadf52c5c2bd986a2d61af3fe3feba900062db9674416dc29d4d4dd5e7f943a2bf458b9a4baefde3410fd713311c0d1eab7b8039922cb0721969b6fad58986a692110ca39e2293b4dc8022c8518d0bd4615e59897d9776875df6cdb835fbc1cfc69c481d5f48602a4e6da42f953f55add7b1f920d4683747eee2d0f99a9a0ad40827375edfc85ee55cf6acb4bcdc6fc5e2a69a565e7185c86b94a86acdf36be9abd7c843373d0906fd59ec38cf9d2dfd0dd8e0bd85e7525c5c02c8c4d4fb0e6fe5a211b89383a499cbb63820daccd5c37d06f4cf9faa0796eaaef8ae34617ceead72f6ef37cf0c5b5de19234e04bc3e53c92a4f6512ddd0b799fb59839"]}'::jsonb); diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs new file mode 100644 index 000000000..1b973bfaa --- /dev/null +++ b/tests/sqlx/src/fixtures/driver.rs @@ -0,0 +1,406 @@ +//! `FixtureSpec::run()` — the generation driver. +//! +//! mise owns the containers; this owns the data. The driver assumes +//! `mise run proxy:up` has started `cipherstash-proxy` and that the +//! generation Postgres has EQL installed. Errors are `anyhow` with +//! `.context(...)` — a generator is a developer tool; a clear crash beats a +//! partial fixture. +//! +//! The `public._fixture_` working table is transient plumbing: `.run()` +//! creates it, encrypts into it, renders the committed rows from it, then +//! drops it before returning. The drop runs unconditionally once the table +//! exists — on success *and* on any returned error: `run` captures the +//! post-schema result, drops the table, and only then propagates a failure. +//! So the table never outlives a *returned* run; only a hard crash (panic / +//! `kill`) can leak it, and the next run's start-of-schema +//! `DROP TABLE IF EXISTS` reclaims that case. + +use std::path::PathBuf; +use std::process::Command; +use std::time::Duration; + +use anyhow::{anyhow, Context, Result}; +use sqlx::postgres::PgConnectOptions; +use sqlx::{ConnectOptions, Connection, PgConnection, Row}; + +use super::eql_plaintext::EqlPlaintext; +use super::spec::FixtureSpec; + +/// `cipherstash-proxy` — the fixed container_name from +/// `tests/docker-compose.proxy.yml`. +const PROXY_CONTAINER: &str = "cipherstash-proxy"; + +/// Bag of Rust-type bounds required of a fixture's plaintext value `T`. +/// Collapses the long `where` clause on `impl FixtureSpec<'a, T>` to a single +/// alias; the blanket impl below makes it auto-applied to any `T` that +/// already satisfies the bounds. +pub trait FixtureValue: + EqlPlaintext + + Copy + + Send + + Sync + + for<'q> sqlx::Encode<'q, sqlx::Postgres> + + sqlx::Type +{ +} + +impl FixtureValue for T where + T: EqlPlaintext + + Copy + + Send + + Sync + + for<'q> sqlx::Encode<'q, sqlx::Postgres> + + sqlx::Type +{ +} + +/// Driver connection options, parsed once from the environment at the start +/// of `run`. `direct` is the unmediated Postgres connection (DDL + +/// rendering); `proxy` is the Proxy-mediated connection (encrypted inserts). +struct DriverConfig { + direct: PgConnectOptions, + proxy: PgConnectOptions, +} + +impl DriverConfig { + /// Build connection options from env vars, defaulting to the + /// `mise.toml` `[env]` values. Port parses are strict — a malformed + /// `POSTGRES_PORT` or `PROXY_PORT` surfaces as an `anyhow::Error` with + /// the offending value, matching the rest of the driver's error story. + fn from_env() -> Result { + let host = env_or("POSTGRES_HOST", "localhost"); + let user = env_or("POSTGRES_USER", "cipherstash"); + let password = env_or("POSTGRES_PASSWORD", "password"); + let database = env_or("POSTGRES_DB", "cipherstash"); + let port = parse_port_env("POSTGRES_PORT", 7432)?; + let proxy_port = parse_port_env("PROXY_PORT", 6432)?; + + let direct = PgConnectOptions::new() + .host(&host) + .port(port) + .username(&user) + .password(&password) + .database(&database); + + // Proxy runs on the host at PROXY_PORT (default 6432); same credentials. + let proxy = direct.clone().port(proxy_port); + + Ok(Self { direct, proxy }) + } +} + +fn env_or(key: &str, default: &str) -> String { + std::env::var(key).unwrap_or_else(|_| default.to_string()) +} + +fn parse_port_env(key: &str, default: u16) -> Result { + match std::env::var(key) { + Ok(value) => value + .parse::() + .with_context(|| format!("{key}={value:?} must be a valid u16")), + Err(_) => Ok(default), + } +} + +/// Restart Proxy (so it reloads the new encrypt config) and poll until it +/// accepts a connection. On timeout, dump `docker logs` and fail. +async fn restart_proxy_and_wait(proxy_options: &PgConnectOptions) -> Result<()> { + let status = Command::new("docker") + .args(["restart", PROXY_CONTAINER]) + .status() + .context("failed to spawn `docker restart`")?; + if !status.success() { + anyhow::bail!("`docker restart {PROXY_CONTAINER}` exited non-zero"); + } + + for _ in 0..60 { + if let Ok(mut conn) = proxy_options.clone().connect().await { + if sqlx::query("SELECT 1").execute(&mut conn).await.is_ok() { + let _ = conn.close().await; + return Ok(()); + } + } + tokio::time::sleep(Duration::from_secs(1)).await; + } + + // `docker logs` sends the container's stdout to our stdout and its stderr + // to our stderr; capture both so the diagnostic is non-empty regardless of + // which stream the Proxy logs to. + let logs = Command::new("docker") + .args(["logs", "--tail", "40", PROXY_CONTAINER]) + .output() + .map(|o| { + format!( + "{}{}", + String::from_utf8_lossy(&o.stdout), + String::from_utf8_lossy(&o.stderr), + ) + }) + .unwrap_or_default(); + Err(anyhow!( + "Proxy did not become ready within 60s after restart\n\ + === {PROXY_CONTAINER} logs ===\n{logs}" + )) +} + +/// Absolute path to `tests/sqlx/fixtures/.sql`. Resolved from +/// `CARGO_MANIFEST_DIR` (the `tests/sqlx` crate root) so the path is correct +/// regardless of the process working directory. +fn fixture_script_path(filename: &str) -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("fixtures") + .join(filename) +} + +impl<'a, T> FixtureSpec<'a, T> +where + T: FixtureValue, +{ + /// Generate and write `tests/sqlx/fixtures/.sql`. + /// + /// The production entry point. Parses the env-driven `DriverConfig` + /// once, opens a direct Postgres connection, then delegates the + /// schema + teardown orchestration to `run_with`, supplying + /// `insert_through_proxy` as the closure. After `run_with` returns the + /// rendered INSERT lines, this method composes them with + /// `fixture_script_preamble` and writes the committed script to disk. + pub async fn run(&self) -> Result<()> { + let config = DriverConfig::from_env()?; + + let mut direct = config + .direct + .clone() + .connect() + .await + .context("connecting to Postgres (direct)")?; + + let lines = self + .run_with(&mut direct, || self.insert_through_proxy(&config.proxy)) + .await?; + + let _ = direct.close().await; + + let mut script = self.fixture_script_preamble(); + for line in &lines { + script.push_str(line); + script.push('\n'); + } + + let path = fixture_script_path(&self.script_filename()); + std::fs::write(&path, script) + .with_context(|| format!("writing fixture script {}", path.display()))?; + println!("wrote {} ({} rows)", path.display(), self.values().len()); + Ok(()) + } + + /// Restart Proxy so it picks up the new `add_search_config`, then open a + /// Proxy connection and insert each plaintext value into the working + /// table. Proxy intercepts each insert and writes the encrypted JSONB + /// composite into `payload`. The production insert step extracted from + /// `run`'s closure for skim-ability. + async fn insert_through_proxy(&self, proxy_options: &PgConnectOptions) -> Result<()> { + restart_proxy_and_wait(proxy_options).await?; + + let mut proxy = proxy_options + .clone() + .connect() + .await + .context("connecting to Proxy")?; + let working = self.working_table(); + for (i, value) in self.values().iter().enumerate() { + let id = (i as i64) + 1; + let insert = + format!("INSERT INTO {working} (id, plaintext, payload) VALUES ($1, $2, $3)"); + sqlx::query(&insert) + .bind(id) + .bind(*value) + .bind(*value) + .execute(&mut proxy) + .await + .with_context(|| format!("inserting value #{id} through Proxy"))?; + } + let _ = proxy.close().await; + Ok(()) + } + + /// Orchestrates the schema-apply / insert / render / teardown pipeline + /// against a caller-supplied `direct` connection, with the insert step + /// pluggable via `insert_rows`. The pipeline is: + /// + /// 1. Check the spec is complete. + /// 2. Apply `working_schema_sql` on `direct`. After this succeeds the + /// `public._fixture_` table exists and MUST be dropped before + /// return, whatever happens next. + /// 3. Run `insert_rows()`. Its result is captured (not `?`-propagated) + /// so the drop in step 5 always runs. + /// 4. If the inserter succeeded, render the committed rows via + /// `render_rows_sql` on `direct`. Skipped on inserter error. + /// 5. Drop the working table on `direct` unconditionally. + /// 6. Propagate failures in causal order: inserter error first + /// (root cause), then render, then drop. + /// + /// `run()` calls this with `insert_through_proxy`. Tests call it with + /// closures that insert hand-crafted `eql_v2_encrypted` composite + /// literals directly (no Proxy required), or with closures that return + /// `Err` to exercise the teardown contract. + /// + /// Private by design: this is a test seam, not a public API. Other + /// fixtures must go through `run`. + async fn run_with( + &self, + direct: &mut PgConnection, + insert_rows: F, + ) -> Result> + where + F: FnOnce() -> Fut + Send, + Fut: std::future::Future> + Send, + { + self.check_complete().context("invalid FixtureSpec")?; + + sqlx::raw_sql(&self.working_schema_sql()) + .execute(&mut *direct) + .await + .context("applying working-table schema")?; + + let insert_result = insert_rows().await; + let render_result = if insert_result.is_ok() { + sqlx::query(&self.render_rows_sql()) + .fetch_all(&mut *direct) + .await + .context("rendering fixture rows") + } else { + // Empty placeholder — never observed; `insert_result?` below short-circuits. + Ok(Vec::new()) + }; + + let working = self.working_table(); + let drop_result = sqlx::raw_sql(&format!("DROP TABLE IF EXISTS public.{working};")) + .execute(&mut *direct) + .await; + + insert_result?; + let rows = render_result?; + drop_result.context("dropping the working table")?; + + rows.iter() + .map(|r| r.try_get::(0).context("reading rendered INSERT")) + .collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use sqlx::PgPool; + + /// A small int4 spec for driver tests. Three values keeps the test fast; + /// the driver's orchestration is independent of value count. + fn small_spec(name: &'static str) -> FixtureSpec<'static, i32> { + const VALUES: &[i32] = &[-1, 1, 42]; + FixtureSpec::new(name) + .with_index("unique") + .with_index("ore") + .with_column_type("jsonb") + .with_values(VALUES) + } + + #[sqlx::test] + async fn run_with_renders_committed_rows_and_drops_working_table(pool: PgPool) -> Result<()> { + let spec = small_spec("driver_test_a"); + let working = spec.working_table(); + let working_for_closure = working.clone(); + let pool_for_closure = pool.clone(); + + let mut conn = pool.acquire().await?; + + let lines = spec + .run_with(&mut *conn, move || async move { + // Working table should exist while the closure runs. + let mut c = pool_for_closure.acquire().await?; + let exists: Option = sqlx::query_scalar(&format!( + "SELECT to_regclass('public.{working_for_closure}')::text" + )) + .fetch_one(&mut *c) + .await?; + assert!( + exists.is_some(), + "working table should exist inside the closure" + ); + + for (i, value) in [-1i32, 1, 42].iter().enumerate() { + let id = (i as i64) + 1; + let insert = format!( + "INSERT INTO public.{working_for_closure} \ + (id, plaintext, payload) \ + VALUES ($1, $2, ROW($3::jsonb)::public.eql_v2_encrypted)" + ); + sqlx::query(&insert) + .bind(id) + .bind(*value) + .bind( + r#"{"v":2,"c":"x","i":{"t":"_fixture_driver_test_a","c":"payload"},"hm":"x","ob":["1"]}"#, + ) + .execute(&mut *c) + .await?; + } + Ok(()) + }) + .await?; + + assert_eq!(lines.len(), 3, "one rendered INSERT per inserted row"); + for line in &lines { + assert!( + line.starts_with( + "INSERT INTO fixtures.driver_test_a (id, plaintext, payload) VALUES (" + ), + "rendered line should target the committed table: {line}" + ); + } + + let after: Option = + sqlx::query_scalar(&format!("SELECT to_regclass('public.{working}')::text")) + .fetch_one(&pool) + .await?; + assert!( + after.is_none(), + "working table should be dropped after run_with returns" + ); + + Ok(()) + } + + #[sqlx::test] + async fn run_with_drops_working_table_on_inserter_error(pool: PgPool) -> Result<()> { + let spec = small_spec("driver_test_b"); + let working = spec.working_table(); + + let mut conn = pool.acquire().await?; + + let result = spec + .run_with(&mut *conn, || async { + anyhow::bail!("forced failure for test") + }) + .await; + + assert!( + result.is_err(), + "run_with should propagate the inserter error" + ); + let err_msg = format!("{:#}", result.unwrap_err()); + assert!( + err_msg.contains("forced failure for test"), + "error chain should contain the forced failure: {err_msg}" + ); + + let after: Option = + sqlx::query_scalar(&format!("SELECT to_regclass('public.{working}')::text")) + .fetch_one(&pool) + .await?; + assert!( + after.is_none(), + "working table should be dropped even on inserter error" + ); + + Ok(()) + } +} diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs new file mode 100644 index 000000000..e8c17a229 --- /dev/null +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -0,0 +1,96 @@ +//! Maps a Rust plaintext type `T` to its EQL search-config cast and the SQL +//! type of the `plaintext` column. +//! +//! `Cast` and `PlaintextSqlType` are newtypes with private fields; the only +//! way to obtain one is via the predeclared constants on each type. That +//! makes the EQL allowlist structural — a `T::CAST` is, by construction, a +//! value EQL accepts. The trait is sealed so external crates cannot add +//! impls that bypass this guarantee. + +use std::fmt; + +/// The `cast_as` argument for `eql_v2.add_search_config`. The field is +/// private so the allowlist is the set of `pub const`s below. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Cast(&'static str); + +impl Cast { + pub const TEXT: Cast = Cast("text"); + pub const INT: Cast = Cast("int"); + pub const SMALL_INT: Cast = Cast("small_int"); + pub const BIG_INT: Cast = Cast("big_int"); + pub const REAL: Cast = Cast("real"); + pub const DOUBLE: Cast = Cast("double"); + pub const BOOLEAN: Cast = Cast("boolean"); + pub const DATE: Cast = Cast("date"); + pub const JSONB: Cast = Cast("jsonb"); + pub const JSON: Cast = Cast("json"); + pub const FLOAT: Cast = Cast("float"); + pub const DECIMAL: Cast = Cast("decimal"); + pub const TIMESTAMP: Cast = Cast("timestamp"); + + pub fn as_str(&self) -> &'static str { + self.0 + } +} + +impl fmt::Display for Cast { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.0) + } +} + +/// The SQL type for the `plaintext` oracle column. As with `Cast`, the only +/// way to construct one is via the predeclared constants below. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct PlaintextSqlType(&'static str); + +impl PlaintextSqlType { + pub const INTEGER: PlaintextSqlType = PlaintextSqlType("integer"); + + pub fn as_str(&self) -> &'static str { + self.0 + } +} + +impl fmt::Display for PlaintextSqlType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.0) + } +} + +mod sealed { + pub trait Sealed {} + impl Sealed for i32 {} +} + +/// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast +/// and the SQL type of the `plaintext` column. Sealed; only this crate may +/// add impls. +pub trait EqlPlaintext: sealed::Sealed { + const CAST: Cast; + const PLAINTEXT_SQL_TYPE: PlaintextSqlType; +} + +impl EqlPlaintext for i32 { + const CAST: Cast = Cast::INT; + const PLAINTEXT_SQL_TYPE: PlaintextSqlType = PlaintextSqlType::INTEGER; +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn i32_casts_to_int() { + assert_eq!(::CAST.as_str(), "int"); + } + + #[test] + fn i32_plaintext_sql_type_is_integer() { + assert_eq!( + ::PLAINTEXT_SQL_TYPE.as_str(), + "integer" + ); + } +} diff --git a/tests/sqlx/src/fixtures/eql_v2_int4.rs b/tests/sqlx/src/fixtures/eql_v2_int4.rs new file mode 100644 index 000000000..f32e93a52 --- /dev/null +++ b/tests/sqlx/src/fixtures/eql_v2_int4.rs @@ -0,0 +1,51 @@ +//! The `eql_v2_int4` fixture — the framework's reference example and proof. +//! +//! 14 integers spanning a negative boundary and small/medium/large/extreme +//! magnitudes. The generated `tests/sqlx/fixtures/eql_v2_int4.sql` is a plain +//! `jsonb`-payload table with no EQL dependency; #225 layers the `eql_v2_int4` +//! domain on top by casting `payload` per query. + +use super::spec::FixtureSpec; + +/// 14 values: a negative boundary plus small/medium/large/extreme magnitudes, +/// chosen so range pivots produce distinct cardinalities. +const VALUES: &[i32] = &[-100, -1, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999]; + +/// The complete fixture definition. `.with_index("unique")` drives `=` / `<>` +/// (HMAC); `.with_index("ore")` drives `<` `<=` `>` `>=` (ORE block terms). +pub fn spec() -> FixtureSpec<'static, i32> { + FixtureSpec::new("eql_v2_int4") + .with_index("unique") + .with_index("ore") + .with_column_type("jsonb") + .with_values(VALUES) +} + +/// The generator. Gated by `fixture-gen` so `cargo test` never compiles it; +/// `#[ignore]` is a second guard. Run via `mise run fixture:generate eql_v2_int4`. +#[cfg(feature = "fixture-gen")] +#[tokio::test] +#[ignore = "generator — run via `mise run fixture:generate`"] +async fn generate() -> anyhow::Result<()> { + spec().run().await +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn spec_is_complete() { + assert!(spec().check_complete().is_ok()); + } + + #[test] + fn spec_has_14_values() { + assert_eq!(spec().values().len(), 14); + } + + #[test] + fn spec_includes_negative_values() { + assert!(spec().values().iter().any(|&v| v < 0)); + } +} diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs new file mode 100644 index 000000000..38504ce58 --- /dev/null +++ b/tests/sqlx/src/fixtures/mod.rs @@ -0,0 +1,19 @@ +//! Type-checked fixture generation framework. +//! +//! A fixture is one Rust file under `src/fixtures/` declaring a `FixtureSpec`. +//! `FixtureSpec::run()` generates the committed SQLx fixture script +//! `tests/sqlx/fixtures/.sql`. + +pub mod validation; + +pub mod eql_plaintext; + +pub use eql_plaintext::EqlPlaintext; + +pub mod spec; + +pub use spec::FixtureSpec; + +pub mod driver; + +pub mod eql_v2_int4; diff --git a/tests/sqlx/src/fixtures/spec.rs b/tests/sqlx/src/fixtures/spec.rs new file mode 100644 index 000000000..0f1ea41ce --- /dev/null +++ b/tests/sqlx/src/fixtures/spec.rs @@ -0,0 +1,364 @@ +//! `FixtureSpec` — the type-checked fixture plug-in contract. +//! +//! `T` is the Rust plaintext type, inferred from `.with_values()`. Everything +//! not derivable — the indexes, the committed `payload` column type, the +//! data — is explicit. The fixture name drives every path by convention: +//! - table `fixtures.` +//! - working table `public._fixture_` +//! - script `tests/sqlx/fixtures/.sql` +//! - SQLx ref `scripts("")` +//! +//! Token-safety is enforced **at construction**: `new`, `.with_index`, and +//! `.with_column_type` each validate via the newtype `TryFrom` and **panic** +//! on a violation, so the builder stays a fluent chain (no `Result`, no +//! `?`). Because the spec stores validated newtypes (`FixtureIdentifier`, +//! `ColumnType`) and uses them via `Display` in the SQL renderers, an +//! unvalidated `&str` cannot reach a generated SQL string. `T::CAST` / +//! `T::PLAINTEXT_SQL_TYPE` are typed const newtypes (`Cast`, +//! `PlaintextSqlType`) — their allowlists are structural, so no runtime +//! check is needed. `check_complete()` covers only the completeness checks +//! (non-empty indexes/values) that the builder cannot make until the chain +//! is finished. + +use super::eql_plaintext::EqlPlaintext; +use super::validation::{ColumnType, FixtureIdentifier}; + +/// A fully specified fixture, ready to `.run()`. +pub struct FixtureSpec<'a, T> { + name: FixtureIdentifier, + indexes: Vec, + column_type: ColumnType, + values: &'a [T], +} + +impl<'a, T> FixtureSpec<'a, T> { + /// Start a spec. `name` must match `^[a-z][a-z0-9_]*$` — it becomes a SQL + /// identifier and a filename. Other fields take defaults until set: + /// `column_type` defaults to `"jsonb"`, `indexes`/`values` to empty. + /// + /// # Panics + /// Panics if `name` is not a valid identifier. + pub fn new(name: &str) -> Self { + let name = FixtureIdentifier::try_from(name).unwrap_or_else(|e| panic!("fixture name: {e}")); + let column_type = ColumnType::try_from("jsonb") + .expect("default column type \"jsonb\" must be in the allowlist"); + Self { + name, + indexes: Vec::new(), + column_type, + values: &[], + } + } + + /// Add a search index (`"unique"`, `"ore"`, ...). Chainable. + /// + /// # Panics + /// Panics if `index_name` is not a valid identifier. + pub fn with_index(mut self, index_name: &str) -> Self { + let id = FixtureIdentifier::try_from(index_name).unwrap_or_else(|e| panic!("index name: {e}")); + self.indexes.push(id); + self + } + + /// Set the committed `payload` column SQL type. Defaults to `"jsonb"`. + /// + /// # Panics + /// Panics if `column_type` is not in `validation::ALLOWED_COLUMN_TYPES`. + pub fn with_column_type(mut self, column_type: &str) -> Self { + self.column_type = + ColumnType::try_from(column_type).unwrap_or_else(|e| panic!("column type: {e}")); + self + } + + /// Set the plaintext value list. `T` is inferred and bound here, so this + /// is where `T::CAST` and `T::PLAINTEXT_SQL_TYPE` become known. Their + /// allowlists are structural (typed-const newtypes), so no runtime + /// validation is needed at this point. + pub fn with_values(mut self, values: &'a [T]) -> Self + where + T: EqlPlaintext, + { + self.values = values; + self + } + + // ----- accessors used by SQL rendering / the driver ----- + + pub fn name(&self) -> &str { + self.name.as_str() + } + + pub fn indexes(&self) -> &[FixtureIdentifier] { + &self.indexes + } + + pub fn column_type(&self) -> &ColumnType { + &self.column_type + } + + /// The plaintext value slice. + pub fn values(&self) -> &[T] { + self.values + } + + /// `fixtures.` — the committed fixture table. + pub fn fixture_table(&self) -> String { + format!("fixtures.{}", self.name) + } + + /// `_fixture_` — the transient working table (unqualified `public`). + pub fn working_table(&self) -> String { + format!("_fixture_{}", self.name) + } + + /// `.sql` — the generated script filename (relative to fixtures dir). + pub fn script_filename(&self) -> String { + format!("{}.sql", self.name) + } + + /// SQL for the transient working table on the generation database. + /// `id BIGINT PRIMARY KEY`, `plaintext` as the SQL type for `T`, and + /// `payload eql_v2_encrypted` so Proxy encrypts inserts. Per index: + /// an idempotent `remove_search_config` guarded by `WHERE EXISTS`, then + /// `add_search_config`. Every `add_search_config` argument is a quoted + /// string literal — the table/column names are fixed literals, and the + /// index name and cast are validated tokens (`FixtureIdentifier` / `Cast`). + /// + /// The leading `DROP TABLE IF EXISTS` is belt-and-suspenders: a normal run + /// drops the working table itself at the end of `run()`, so this only + /// matters when a prior run crashed before its own teardown. + pub fn working_schema_sql(&self) -> String + where + T: EqlPlaintext, + { + let working = self.working_table(); + let mut sql = format!( + "DROP TABLE IF EXISTS public.{working};\n\ + CREATE TABLE public.{working} (\n \ + id BIGINT PRIMARY KEY,\n \ + plaintext {plaintext_type} NOT NULL,\n \ + payload eql_v2_encrypted\n);\n", + plaintext_type = T::PLAINTEXT_SQL_TYPE, + ); + for ix in &self.indexes { + sql.push_str(&format!( + "SELECT eql_v2.remove_search_config('{working}', 'payload', '{ix}')\n \ + WHERE EXISTS (\n \ + SELECT 1 FROM public.eql_v2_configuration c\n \ + WHERE c.data #> '{{tables,{working},payload,indexes,{ix}}}' IS NOT NULL\n );\n", + )); + sql.push_str(&format!( + "SELECT eql_v2.add_search_config('{working}', 'payload', '{ix}', '{cast}');\n", + cast = T::CAST, + )); + } + sql + } + + /// The committed fixture script's header + schema + DDL, up to (not + /// including) the rendered INSERT rows. The driver appends the INSERTs. + /// `payload` uses the committed `column_type` (`jsonb` for #224), not + /// `eql_v2_encrypted`; `plaintext` uses the SQL type for `T`. + pub fn fixture_script_preamble(&self) -> String + where + T: EqlPlaintext, + { + format!( + "-- AUTO-GENERATED by `mise run fixture:generate {name}`.\n\ + -- DO NOT EDIT BY HAND. Re-run the generator to refresh.\n\ + --\n\ + -- Encrypted via CipherStash Proxy (HMAC + ORE block terms).\n\ + -- A SQLx fixture script: opt in with\n\ + -- #[sqlx::test(fixtures(path = \"../fixtures\", scripts(\"{name}\")))]\n\ + \n\ + CREATE SCHEMA IF NOT EXISTS fixtures;\n\ + DROP TABLE IF EXISTS {table};\n\ + CREATE TABLE {table} (\n \ + id BIGINT PRIMARY KEY,\n \ + plaintext {plaintext_type} NOT NULL,\n \ + payload {column_type} NOT NULL\n);\n\n", + name = self.name, + table = self.fixture_table(), + plaintext_type = T::PLAINTEXT_SQL_TYPE, + column_type = self.column_type, + ) + } + + /// SQL run on the *direct* connection to render each working-table row as + /// a committed INSERT. `format('%L', ...)` does server-side literal + /// escaping; row values never pass through Rust string interpolation. + /// `(payload).data::text` unwraps the `eql_v2_encrypted` composite to the + /// JSONB text that the committed `jsonb` column stores. + pub fn render_rows_sql(&self) -> String { + format!( + "SELECT format(\n \ + 'INSERT INTO {table} (id, plaintext, payload) VALUES (%L, %L, %L::{column_type});',\n \ + id, plaintext, (payload).data::text\n) \ + FROM public.{working} ORDER BY id", + table = self.fixture_table(), + column_type = self.column_type, + working = self.working_table(), + ) + } + + /// Check the spec is *complete*: it has at least one index and at least + /// one value. These cannot be checked at construction — the builder does + /// not know when the chain is finished — so the driver calls this before + /// generating any SQL. Token safety is already guaranteed by the + /// `FixtureIdentifier`/`ColumnType` newtypes; this method covers only what + /// construction cannot. + pub fn check_complete(&self) -> anyhow::Result<()> { + if self.indexes.is_empty() { + anyhow::bail!("fixture {:?} declares no indexes", self.name.as_str()); + } + if self.values.is_empty() { + anyhow::bail!("fixture {:?} has no values", self.name.as_str()); + } + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn int4_spec() -> FixtureSpec<'static, i32> { + const VALUES: &[i32] = &[-1, 1, 42]; + FixtureSpec::new("eql_v2_int4") + .with_index("unique") + .with_index("ore") + .with_column_type("jsonb") + .with_values(VALUES) + } + + #[test] + fn derives_paths_from_the_name() { + let s = int4_spec(); + assert_eq!(s.fixture_table(), "fixtures.eql_v2_int4"); + assert_eq!(s.working_table(), "_fixture_eql_v2_int4"); + assert_eq!(s.script_filename(), "eql_v2_int4.sql"); + } + + #[test] + fn records_indexes_in_order() { + let s = int4_spec(); + let names: Vec<&str> = s.indexes().iter().map(FixtureIdentifier::as_str).collect(); + assert_eq!(names, vec!["unique", "ore"]); + } + + #[test] + fn column_type_defaults_to_jsonb() { + const V: &[i32] = &[1]; + let s = FixtureSpec::new("x").with_index("unique").with_values(V); + assert_eq!(s.column_type().as_str(), "jsonb"); + } + + #[test] + fn valid_spec_passes_completeness_check() { + assert!(int4_spec().check_complete().is_ok()); + } + + #[test] + #[should_panic(expected = "is not a valid identifier")] + fn validation_rejects_a_bad_name() { + // A bad name panics at construction, before the chain continues. + let _ = FixtureSpec::<'static, i32>::new("Bad-Name"); + } + + #[test] + #[should_panic(expected = "is not in the allowlist")] + fn validation_rejects_a_non_allowlisted_column_type() { + // A non-allowlisted column type panics in `.with_column_type()`. + let _ = FixtureSpec::<'static, i32>::new("x").with_column_type("text"); + } + + #[test] + #[should_panic(expected = "is not a valid identifier")] + fn validation_rejects_a_bad_index_name() { + // A bad index name panics in `.with_index()`. + let _ = FixtureSpec::<'static, i32>::new("x").with_index("BAD IX"); + } + + #[test] + fn completeness_rejects_a_spec_with_no_indexes() { + const V: &[i32] = &[1]; + let s = FixtureSpec::new("x").with_values(V); + assert!(s.check_complete().is_err()); + } + + #[test] + fn completeness_rejects_a_spec_with_no_values() { + const V: &[i32] = &[]; + let s = FixtureSpec::new("x").with_index("unique").with_values(V); + assert!(s.check_complete().is_err()); + } + + #[test] + fn working_schema_sql_drops_and_creates_the_working_table() { + let sql = int4_spec().working_schema_sql(); + assert!(sql.contains("DROP TABLE IF EXISTS public._fixture_eql_v2_int4;")); + assert!(sql.contains("CREATE TABLE public._fixture_eql_v2_int4 (")); + assert!(sql.contains("id BIGINT PRIMARY KEY")); + assert!(sql.contains("plaintext integer NOT NULL")); + // The working table's payload is eql_v2_encrypted so Proxy encrypts inserts. + assert!(sql.contains("payload eql_v2_encrypted")); + } + + #[test] + fn working_schema_sql_configures_each_index_idempotently() { + let sql = int4_spec().working_schema_sql(); + // remove first (idempotent), then add, for both indexes. + assert!(sql + .contains("eql_v2.remove_search_config('_fixture_eql_v2_int4', 'payload', 'unique')")); + assert!(sql.contains( + "eql_v2.add_search_config('_fixture_eql_v2_int4', 'payload', 'unique', 'int')" + )); + assert!( + sql.contains("eql_v2.remove_search_config('_fixture_eql_v2_int4', 'payload', 'ore')") + ); + assert!(sql + .contains("eql_v2.add_search_config('_fixture_eql_v2_int4', 'payload', 'ore', 'int')")); + } + + #[test] + fn working_schema_sql_uses_the_t_cast_not_the_column_type() { + // payload column-type is jsonb, but the EQL cast is i32::CAST = "int". + let sql = int4_spec().working_schema_sql(); + assert!(sql.contains("'int')")); // cast_as argument + assert!(!sql.contains("'jsonb')")); // jsonb is the committed type, not the cast + } + + #[test] + fn fixture_script_preamble_renders_the_committed_table() { + let preamble = int4_spec().fixture_script_preamble(); + // header + assert!(preamble.contains("AUTO-GENERATED")); + assert!(preamble.contains("DO NOT EDIT BY HAND")); + assert!(preamble.contains("mise run fixture:generate eql_v2_int4")); + assert!(preamble.contains("HMAC + ORE block terms")); + // schema + table in the fixtures schema, jsonb payload + assert!(preamble.contains("CREATE SCHEMA IF NOT EXISTS fixtures;")); + assert!(preamble.contains("DROP TABLE IF EXISTS fixtures.eql_v2_int4;")); + assert!(preamble.contains("CREATE TABLE fixtures.eql_v2_int4 (")); + assert!(preamble.contains("id BIGINT PRIMARY KEY")); + assert!(preamble.contains("plaintext integer NOT NULL")); + assert!(preamble.contains("payload jsonb NOT NULL")); + } + + #[test] + fn fixture_script_preamble_uses_the_committed_column_type() { + // The committed table uses .with_column_type(), NOT eql_v2_encrypted. + let preamble = int4_spec().fixture_script_preamble(); + assert!(!preamble.contains("eql_v2_encrypted")); + } + + #[test] + fn render_rows_sql_projects_format_l_over_the_working_table() { + let sql = int4_spec().render_rows_sql(); + assert!(sql.contains("INSERT INTO fixtures.eql_v2_int4 (id, plaintext, payload) VALUES")); + assert!(sql.contains("%L, %L, %L::jsonb")); + assert!(sql.contains("FROM public._fixture_eql_v2_int4")); + assert!(sql.contains("(payload).data::text")); + assert!(sql.contains("ORDER BY id")); + } +} diff --git a/tests/sqlx/src/fixtures/validation.rs b/tests/sqlx/src/fixtures/validation.rs new file mode 100644 index 000000000..e641a7266 --- /dev/null +++ b/tests/sqlx/src/fixtures/validation.rs @@ -0,0 +1,129 @@ +//! Pure SQL-token validators. Validated tokens are wrapped in newtypes +//! (`FixtureIdentifier`, `ColumnType`) so a renderer that accepts the newtype +//! receives type-level proof of validation — an unvalidated `&str` cannot +//! reach the renderer's format strings. + +use std::fmt; + +/// Lowercase snake-case identifier, must start with a letter: `^[a-z][a-z0-9_]*$`. +fn is_valid_identifier(s: &str) -> bool { + let mut chars = s.chars(); + match chars.next() { + Some(c) if c.is_ascii_lowercase() => {} + _ => return false, + } + chars.all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_') +} + +/// Allowlist of committed `payload` column types. `{ jsonb }` for #224 — no +/// domain types exist yet. Extending to domain-typed fixtures means extending +/// this list with validated, optionally schema-qualified type tokens. +pub const ALLOWED_COLUMN_TYPES: &[&str] = &["jsonb"]; + +fn is_valid_column_type(s: &str) -> bool { + ALLOWED_COLUMN_TYPES.contains(&s) +} + +/// A validated SQL identifier. Construction proves the string matches +/// `^[a-z][a-z0-9_]*$`. Renderers interpolate via `Display`, so the bare +/// `&str` cannot reach generated SQL once it has been validated into this type. +#[derive(Debug, Clone)] +pub struct FixtureIdentifier(String); + +impl FixtureIdentifier { + pub fn as_str(&self) -> &str { + &self.0 + } +} + +impl TryFrom<&str> for FixtureIdentifier { + type Error = String; + fn try_from(s: &str) -> Result { + if is_valid_identifier(s) { + Ok(Self(s.to_string())) + } else { + Err(format!( + "{s:?} is not a valid identifier (^[a-z][a-z0-9_]*$)" + )) + } + } +} + +impl fmt::Display for FixtureIdentifier { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} + +/// A validated committed-payload column type token. Construction proves the +/// string is in `ALLOWED_COLUMN_TYPES`. +#[derive(Debug, Clone)] +pub struct ColumnType(String); + +impl ColumnType { + pub fn as_str(&self) -> &str { + &self.0 + } +} + +impl TryFrom<&str> for ColumnType { + type Error = String; + fn try_from(s: &str) -> Result { + if is_valid_column_type(s) { + Ok(Self(s.to_string())) + } else { + Err(format!( + "{s:?} is not in the allowlist {ALLOWED_COLUMN_TYPES:?}" + )) + } + } +} + +impl fmt::Display for ColumnType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(&self.0) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn accepts_valid_identifiers() { + assert!(FixtureIdentifier::try_from("eql_v2_int4").is_ok()); + assert!(FixtureIdentifier::try_from("a").is_ok()); + assert!(FixtureIdentifier::try_from("x9_y").is_ok()); + } + + #[test] + fn rejects_invalid_identifiers() { + assert!(FixtureIdentifier::try_from("").is_err()); + assert!(FixtureIdentifier::try_from("9abc").is_err()); // leading digit + assert!(FixtureIdentifier::try_from("_abc").is_err()); // leading underscore + assert!(FixtureIdentifier::try_from("Abc").is_err()); // uppercase + assert!(FixtureIdentifier::try_from("a-b").is_err()); // hyphen + assert!(FixtureIdentifier::try_from("a b").is_err()); // space + assert!(FixtureIdentifier::try_from("a;DROP").is_err()); // injection attempt + } + + #[test] + fn identifier_renders_via_display() { + let id = FixtureIdentifier::try_from("eql_v2_int4").unwrap(); + assert_eq!(format!("{id}"), "eql_v2_int4"); + } + + #[test] + fn column_type_accepts_jsonb_only() { + assert!(ColumnType::try_from("jsonb").is_ok()); + assert!(ColumnType::try_from("text").is_err()); + assert!(ColumnType::try_from("eql_v2_int4").is_err()); + assert!(ColumnType::try_from("jsonb; DROP TABLE x").is_err()); + } + + #[test] + fn column_type_renders_via_display() { + let ct = ColumnType::try_from("jsonb").unwrap(); + assert_eq!(format!("{ct}"), "jsonb"); + } +} diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 911264c37..2f915e37b 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -5,6 +5,7 @@ use sqlx::PgPool; pub mod assertions; +pub mod fixtures; pub mod helpers; pub mod index_types; pub mod selectors; diff --git a/tests/sqlx/tests/bench_data_tests.rs b/tests/sqlx/tests/bench_data_tests.rs index c81d6d0da..0295eaece 100644 --- a/tests/sqlx/tests/bench_data_tests.rs +++ b/tests/sqlx/tests/bench_data_tests.rs @@ -20,30 +20,6 @@ async fn fetch_sample_encrypted_text(pool: &PgPool) -> Result { ) } -#[sqlx::test] -async fn benchmark_schema_can_be_reapplied(pool: PgPool) -> Result<()> { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - let schema = include_str!("../../benchmarks/schema.sql"); - sqlx::raw_sql(schema).execute(&pool).await?; - sqlx::raw_sql(schema).execute(&pool).await?; - - let active_bench_columns: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM eql_v2.config() WHERE state = 'active' AND relation = 'bench'", - ) - .fetch_one(&pool) - .await?; - - assert_eq!( - active_bench_columns, 3, - "reapplying benchmark schema should leave one active config for each bench column" - ); - - Ok(()) -} - // ========== Data Integrity Tests ========== /// Verify fixture seeded exactly 10K rows diff --git a/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs b/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs new file mode 100644 index 000000000..eb842b588 --- /dev/null +++ b/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs @@ -0,0 +1,129 @@ +//! Structural verification of the generated `eql_v2_int4` fixture. +//! +//! Vanilla SQL over `fixtures.eql_v2_int4` — `payload` is plain `jsonb`, no +//! domain type required. The `plaintext` column is the in-table oracle; no +//! Rust value constant is shared with the generator. #224 verifies the +//! fixture is well-formed; #225 verifies the domain operators on it. + +use anyhow::Result; +use sqlx::PgPool; + +/// The 14 values from `src/fixtures/eql_v2_int4.rs`, in id order. Kept here +/// only to assert the in-table `plaintext` oracle matches what was generated. +/// If `plaintext_column_matches_the_generated_values` fails, the generator's +/// `VALUES` and this constant have drifted — re-run +/// `mise run fixture:generate eql_v2_int4` and update this list to match. +const EXPECTED_PLAINTEXTS: &[i32] = &[-100, -1, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999]; + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn fixture_has_fourteen_rows(pool: PgPool) -> Result<()> { + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v2_int4") + .fetch_one(&pool) + .await?; + assert_eq!(count, 14, "eql_v2_int4 fixture should have 14 rows"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn ids_are_sequential_one_to_fourteen(pool: PgPool) -> Result<()> { + let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.eql_v2_int4 ORDER BY id") + .fetch_all(&pool) + .await?; + assert_eq!(ids, (1..=14).collect::>()); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn plaintext_column_matches_the_generated_values(pool: PgPool) -> Result<()> { + let plaintexts: Vec = + sqlx::query_scalar("SELECT plaintext FROM fixtures.eql_v2_int4 ORDER BY id") + .fetch_all(&pool) + .await?; + assert_eq!(plaintexts, EXPECTED_PLAINTEXTS); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn every_payload_carries_the_hmac_equality_term(pool: PgPool) -> Result<()> { + // `hm` drives equality. Every row's payload must carry an `hm` string term. + let missing: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + WHERE payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", + ) + .fetch_one(&pool) + .await?; + assert_eq!(missing, 0, "every payload must carry an `hm` string term"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn every_payload_carries_the_ore_block_term(pool: PgPool) -> Result<()> { + // `ob` drives ordering. Every row's payload must carry a non-null ob array. + let missing: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + WHERE payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", + ) + .fetch_one(&pool) + .await?; + assert_eq!(missing, 0, "every payload must carry an `ob` array term"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn every_payload_carries_a_ciphertext(pool: PgPool) -> Result<()> { + // `c` is the ciphertext. Every row's payload must carry a `c` string. + let missing: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + WHERE payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", + ) + .fetch_one(&pool) + .await?; + assert_eq!( + missing, 0, + "every payload must carry a `c` ciphertext string" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { + // The in-table `plaintext` oracle: a consuming test can filter on it + // directly. Exactly one row has plaintext = 42. + let ids: Vec = + sqlx::query_scalar("SELECT id FROM fixtures.eql_v2_int4 WHERE plaintext = 42 ORDER BY id") + .fetch_all(&pool) + .await?; + assert_eq!(ids, vec![9], "expected exactly one row with plaintext = 42 at id 9"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn hmac_equality_terms_are_distinct_for_distinct_values(pool: PgPool) -> Result<()> { + // All 14 plaintext values are distinct, so all 14 `hm` terms must be too. + let distinct_hm: i64 = + sqlx::query_scalar("SELECT COUNT(DISTINCT payload->>'hm') FROM fixtures.eql_v2_int4") + .fetch_one(&pool) + .await?; + assert_eq!( + distinct_hm, 14, + "14 distinct values -> 14 distinct hm terms" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +async fn every_payload_declares_eql_payload_version_v2(pool: PgPool) -> Result<()> { + // The EQL `v` payload-format field is checked server-side against `'2'` + // when an `eql_v2_encrypted` value is inserted. Asserting equality here + // (not just presence) means a future bump to `v=3` fails this test + // loudly, forcing the maintainer to regenerate the fixture and audit + // consumers for v2→v3 semantic changes. + let mismatched: i64 = sqlx::query_scalar( + "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + WHERE payload->'v' IS NULL OR payload->>'v' <> '2'", + ) + .fetch_one(&pool) + .await?; + assert_eq!(mismatched, 0, "every payload must declare v = '2'"); + Ok(()) +} diff --git a/tests/sqlx/tests/like_operator_tests.rs b/tests/sqlx/tests/like_operator_tests.rs index ad0627274..679ee81d8 100644 --- a/tests/sqlx/tests/like_operator_tests.rs +++ b/tests/sqlx/tests/like_operator_tests.rs @@ -53,7 +53,7 @@ async fn create_encrypted_json_with_index( }) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("like_data")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] async fn like_operator_matches_pattern(pool: PgPool) -> Result<()> { // Test: ~~ operator (LIKE) matches encrypted values // Tests both ~~ operator and LIKE operator (they're equivalent) @@ -89,7 +89,7 @@ async fn like_operator_matches_pattern(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("like_data")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] async fn like_operator_no_match(pool: PgPool) -> Result<()> { // Test: ~~ operator returns empty for non-matching pattern // This test verifies that LIKE operations correctly return no results @@ -109,7 +109,7 @@ async fn like_operator_no_match(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("like_data")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] async fn like_function_matches_pattern(pool: PgPool) -> Result<()> { // Test: eql_v2.like() function // Tests the eql_v2.like() function which wraps bloom filter matching @@ -129,7 +129,7 @@ async fn like_function_matches_pattern(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("like_data")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] async fn ilike_operator_case_insensitive_matches(pool: PgPool) -> Result<()> { // Test: ~~* operator (ILIKE) matches encrypted values (case-insensitive) // Tests both ~~* operator and ILIKE operator (they're equivalent) From 720eb0c452cd724e6f07a97c445cea9480ba014c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 25 May 2026 14:22:19 +1000 Subject: [PATCH 004/599] refactor(fixtures): replace Proxy with direct cipherstash-client Generator no longer shells out to a CipherStash Proxy container to encrypt fixture values. `cipherstash-client` 0.35 is now a direct dependency of the SQLx test crate and the new `fixtures::cipherstash` module owns ZeroKMS bootstrap (cached in a OnceCell), the index-name -> ColumnConfig mapping, and the per-value encrypt helper. The Rust fixture owns configuration and encryption; the DB only owns table structure. Removes: `tests/docker-compose.proxy.yml`, the `proxy:up`/`proxy:logs`/ `proxy:down` mise tasks, the `mise run proxy:up` step from `test:sqlx`, and the `restart_proxy_and_wait` / `insert_through_proxy` / `PROXY_PORT` plumbing in `driver.rs`. The working-table `payload` column is now plain `jsonb` (no `eql_v2_encrypted` composite) and no `add_search_config` rows are written to `eql_v2_configuration` during generation. `mise run test:sqlx` now needs `CS_CLIENT_ACCESS_KEY` (or `CS_CLIENT_ID` + `CS_CLIENT_KEY`) and `CS_WORKSPACE_CRN` in the process env so `AutoStrategy::detect()` / `EnvKeyProvider` can pick them up. --- mise.toml | 5 +- tasks/fixtures.toml | 44 +- tests/docker-compose.proxy.yml | 35 - tests/sqlx/Cargo.lock | 4506 +++++++++++++++++++--- tests/sqlx/Cargo.toml | 5 +- tests/sqlx/README.md | 18 + tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 16 +- tests/sqlx/src/fixtures/cipherstash.rs | 253 ++ tests/sqlx/src/fixtures/driver.rs | 137 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 26 + tests/sqlx/src/fixtures/mod.rs | 2 + tests/sqlx/src/fixtures/spec.rs | 94 +- 12 files changed, 4281 insertions(+), 860 deletions(-) delete mode 100644 tests/docker-compose.proxy.yml create mode 100644 tests/sqlx/src/fixtures/cipherstash.rs diff --git a/mise.toml b/mise.toml index 86e30d477..879346761 100644 --- a/mise.toml +++ b/mise.toml @@ -46,10 +46,11 @@ cd tests/sqlx sqlx migrate run # Regenerate fixtures every run — they are not committed (see .gitignore). -# Requires Proxy on PROXY_PORT; brings it up if not already running. +# Generator encrypts via cipherstash-client directly; CS_* credentials must +# be present in the shell environment (CS_CLIENT_ACCESS_KEY + +# CS_WORKSPACE_CRN, or the legacy CS_CLIENT_ID/CS_CLIENT_KEY pair). echo "Regenerating SQLx fixtures..." cd "{{config_root}}" -mise run proxy:up mise run fixture:generate eql_v2_int4 echo "Running Rust tests..." diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index dfac6411b..808200cd8 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -1,49 +1,15 @@ -["proxy:up"] -description = "Start CipherStash Proxy connected to existing Postgres" -# Reuses the tests/docker-compose.yml Postgres on POSTGRES_PORT. -# CS_* credentials are read from the shell environment (mise/direnv/profile). -# Readiness is verified from the host (the proxy image lacks busybox nc, so -# the container-internal healthcheck cannot be used). Dumps container logs -# on failure so the user does not need a separate `docker logs` invocation. -dir = "{{config_root}}/tests" -run = """ -docker compose -f docker-compose.proxy.yml up -d -echo "Waiting for proxy on localhost:6432..." -export PGPASSWORD="${POSTGRES_PASSWORD:-password}" -for i in $(seq 1 60); do - if psql -U "${POSTGRES_USER:-cipherstash}" -d "${POSTGRES_DB:-cipherstash}" \ - -h localhost -p 6432 -c 'SELECT 1' >/dev/null 2>&1; then - echo "Proxy ready." - exit 0 - fi - sleep 1 -done -echo "Proxy did not become ready in 60s." -echo -echo '=== cipherstash-proxy logs ===' -docker logs cipherstash-proxy 2>&1 | tail -40 -exit 1 -""" - -["proxy:logs"] -description = "Tail CipherStash Proxy container logs" -dir = "{{config_root}}/tests" -run = "docker logs --tail 100 -f cipherstash-proxy" - -["proxy:down"] -description = "Stop CipherStash Proxy" -dir = "{{config_root}}/tests" -run = "docker compose -f docker-compose.proxy.yml down" - ["fixture:generate"] -description = "Generate a SQLx fixture script via CipherStash Proxy" +description = "Generate a SQLx fixture script via cipherstash-client" # Runs the gated generator for the named fixture. Writes # tests/sqlx/fixtures/.sql. Must run inside the crate — there is no # root Cargo.toml — matching test:schema / test:sqlx:watch. # # Prerequisites: # - mise run postgres:up (Postgres with EQL installed) -# - mise run proxy:up (Proxy on localhost:6432) +# - CS_* credentials in the shell environment (auto-loaded by +# cipherstash-client's AutoStrategy / EnvKeyProvider): +# CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN (preferred), OR +# CS_CLIENT_ID + CS_CLIENT_KEY (legacy pair) # # Usage: mise run fixture:generate eql_v2_int4 dir = "{{config_root}}/tests/sqlx" diff --git a/tests/docker-compose.proxy.yml b/tests/docker-compose.proxy.yml deleted file mode 100644 index d64e6a8ef..000000000 --- a/tests/docker-compose.proxy.yml +++ /dev/null @@ -1,35 +0,0 @@ -services: - proxy: - image: cipherstash/proxy:latest - container_name: cipherstash-proxy - ports: - - "6432:6432" - environment: - # Proxy connects to the existing tests/docker-compose.yml Postgres, - # reaching the host via host.docker.internal. POSTGRES_* values come - # from mise.toml [env] block (overridable per shell). - CS_DATABASE__NAME: ${POSTGRES_DB:-cipherstash} - CS_DATABASE__USERNAME: ${POSTGRES_USER:-cipherstash} - CS_DATABASE__PASSWORD: ${POSTGRES_PASSWORD:-password} - CS_DATABASE__HOST: host.docker.internal - CS_DATABASE__PORT: ${POSTGRES_PORT:-7432} - # EQL installation is handled by the existing reset / install flow; the - # Proxy must not race against it. - CS_DATABASE__INSTALL_EQL: "false" - # CipherStash workspace credentials are read from the host shell - # environment (mise / direnv / profile). No .env file is required. - CS_CLIENT_ACCESS_KEY: ${CS_CLIENT_ACCESS_KEY} - CS_DEFAULT_KEYSET_ID: ${CS_DEFAULT_KEYSET_ID} - CS_CLIENT_KEY: ${CS_CLIENT_KEY} - CS_CLIENT_ID: ${CS_CLIENT_ID} - CS_WORKSPACE_CRN: ${CS_WORKSPACE_CRN} - # Optional: pin the CTS region host for workspaces in non-default regions. - CS_CTS_HOST: ${CS_CTS_HOST:-} - CS_ZEROKMS_HOST: ${CS_ZEROKMS_HOST:-} - extra_hosts: - # Linux compatibility; macOS / Windows resolve host.docker.internal natively. - - "host.docker.internal:host-gateway" - # No in-container healthcheck: the current cipherstash/proxy:latest image - # lacks busybox nc, so any TCP probe inside the container fails even when - # the proxy is listening. Readiness is verified from the host by the - # proxy:up task using psql. diff --git a/tests/sqlx/Cargo.lock b/tests/sqlx/Cargo.lock index db86aeba1..e39e030b2 100644 --- a/tests/sqlx/Cargo.lock +++ b/tests/sqlx/Cargo.lock @@ -2,6 +2,84 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.6", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", + "zeroize", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", + "zeroize", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.12" @@ -25,18 +103,104 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "aquamarine" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", + "zeroize", +] + +[[package]] +name = "async-compression" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-mutex" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73112ce9e1059d8604242af62c7ec8e5975ac58ac251686c8403b45e8a6fe778" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "atoi" version = "2.0.0" @@ -46,12 +210,86 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "aws-lc-rs" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +dependencies = [ + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base32" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" + [[package]] name = "base64" version = "0.22.1" @@ -64,6 +302,15 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +[[package]] +name = "base85" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36915bbaca237c626689b5bd14d02f2ba7a5a359d30a2a08be697392e3718079" +dependencies = [ + "thiserror 1.0.69", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -81,13 +328,40 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" dependencies = [ "serde_core", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", + "zeroize", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -97,24 +371,112 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block-modes" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2211b0817f061502a8dd9f11a37e879e79763e3c698d2418cf824d8cb2f21e" + [[package]] name = "borrow-or-share" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" +[[package]] +name = "borsh" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bumpalo" version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytecount" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + [[package]] name = "byteorder" version = "1.5.0" @@ -126,1036 +488,2802 @@ name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] [[package]] -name = "cfg-if" -version = "1.0.4" +name = "cached" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "9718806c4a2fe9e8a56fd736f97b340dd10ed1be8ed733ed50449f351dc33cae" +dependencies = [ + "ahash 0.8.12", + "cached_proc_macro", + "cached_proc_macro_types", + "hashbrown 0.14.5", + "once_cell", + "thiserror 1.0.69", + "web-time", +] [[package]] -name = "concurrent-queue" -version = "2.5.0" +name = "cached_proc_macro" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +checksum = "2f42a145ed2d10dce2191e1dcf30cfccfea9026660e143662ba5eec4017d5daa" dependencies = [ - "crossbeam-utils", + "darling", + "proc-macro2", + "quote", + "syn 2.0.108", ] [[package]] -name = "const-oid" -version = "0.9.6" +name = "cached_proc_macro_types" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "cc" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ + "find-msvc-tools", + "jobserver", "libc", + "shlex", ] [[package]] -name = "crc" -version = "3.3.0" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" -dependencies = [ - "crc-catalog", -] +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "crc-catalog" -version = "2.4.0" +name = "cfg_aliases" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] -name = "crossbeam-queue" -version = "0.3.12" +name = "chacha20" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" dependencies = [ - "crossbeam-utils", + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "chrono" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ - "generic-array", - "typenum", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", ] [[package]] -name = "data-encoding" -version = "2.11.0" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.6", + "inout", +] [[package]] -name = "der" -version = "0.7.10" +name = "cipherstash-client" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "0257cff25a25a706af6e190e5209865aae4ddf0b36f81febee7de014b22bcc40" dependencies = [ - "const-oid", - "pem-rfc7468", + "aes-gcm-siv", + "anyhow", + "async-mutex", + "async-trait", + "base16ct", + "base64", + "base85", + "blake3", + "chrono", + "cipherstash-config", + "cipherstash-core", + "cllw-ore", + "cts-common", + "derive_more 1.0.0", + "dirs", + "futures", + "hex", + "hmac", + "itertools 0.12.1", + "lazy_static", + "log", + "miette", + "opaque-debug", + "orderable-bytes", + "ore-rs", + "percent-encoding", + "rand 0.8.6", + "recipher", + "reqwest", + "rmp-serde", + "rust-stemmers", + "rust_decimal", + "serde", + "serde_bytes", + "serde_cbor", + "serde_json", + "serdect", + "sha2", + "stack-auth", + "stack-profile", + "static_assertions", + "thiserror 1.0.69", + "tokio", + "toml", + "tracing", + "url", + "uuid", + "vitaminc", + "vitaminc-protected", + "winnow 0.6.26", "zeroize", + "zerokms-protocol", ] [[package]] -name = "digest" -version = "0.10.7" +name = "cipherstash-config" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "d376d237e368e77de53b07bb7309812f45809299063c80b6cc3132f7d8494aed" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", + "bitflags", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] -name = "displaydoc" -version = "0.2.5" +name = "cipherstash-core" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "ca84ffd8a7b2f0c8c6b04eba600738fea115f5a4ed825035a2f13aa1524085a7" dependencies = [ - "proc-macro2", - "quote", - "syn", + "getrandom 0.2.16", + "hmac", + "lazy_static", + "num-bigint", + "rand 0.8.6", + "regex", + "sha2", + "thiserror 1.0.69", ] [[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "either" -version = "1.15.0" +name = "cllw-ore" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "4f73a23cbc15404d9b314c03b16a888f798dbc681bceeb2e18674f602f9da02d" dependencies = [ - "serde", + "blake3", + "chrono", + "hex", + "orderable-bytes", + "rust_decimal", + "subtle", + "thiserror 1.0.69", + "unicode-normalization", ] [[package]] -name = "email_address" -version = "0.2.9" +name = "cmac" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" +checksum = "8543454e3c3f5126effff9cd44d562af4e31fb8ce1cc0d3dcd8f084515dbc1aa" dependencies = [ - "serde", + "cipher", + "dbl", + "digest 0.10.7", ] [[package]] -name = "eql_tests" -version = "0.1.0" +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ - "anyhow", - "hex", - "jsonschema", - "serde", - "serde_json", - "sqlx", - "tokio", + "cc", ] [[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "etcetera" -version = "0.8.0" +name = "combine" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", + "bytes", + "memchr", ] [[package]] -name = "event-listener" -version = "5.4.1" +name = "compression-codecs" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", + "brotli", + "compression-core", + "flate2", + "memchr", ] [[package]] -name = "fancy-regex" -version = "0.18.0" +name = "compression-core" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277" -dependencies = [ - "bit-set", - "regex-automata", - "regex-syntax", -] +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] -name = "fluent-uri" -version = "0.4.1" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "borrow-or-share", - "ref-cast", - "serde", + "crossbeam-utils", ] [[package]] -name = "flume" -version = "0.11.1" +name = "const-hex" +version = "1.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" dependencies = [ - "futures-core", - "futures-sink", - "spin", + "cfg-if", + "cpufeatures 0.2.17", + "proptest", + "serde_core", ] [[package]] -name = "foldhash" -version = "0.1.5" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "foldhash" -version = "0.2.0" +name = "constant_time_eq" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] -name = "form_urlencoded" -version = "1.2.2" +name = "convert_case" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ - "percent-encoding", + "unicode-segmentation", ] [[package]] -name = "fraction" -version = "0.15.4" +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076045bb43dac435333ed5f04caf35c7463631d0dae2deb2638d94dd0a5b872" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "lazy_static", - "num", + "core-foundation-sys", + "libc", ] [[package]] -name = "futures-channel" -version = "0.3.31" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "futures-core" -version = "0.3.31" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] [[package]] -name = "futures-executor" -version = "0.3.31" +name = "cpufeatures" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ - "futures-core", - "futures-task", - "futures-util", + "libc", ] [[package]] -name = "futures-intrusive" -version = "0.5.0" +name = "crc" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ - "futures-core", - "lock_api", - "parking_lot", + "crc-catalog", ] [[package]] -name = "futures-io" -version = "0.3.31" +name = "crc-catalog" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] -name = "futures-sink" -version = "0.3.31" +name = "crc32fast" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] [[package]] -name = "futures-task" -version = "0.3.31" +name = "critical-section" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] -name = "futures-util" -version = "0.3.31" +name = "crossbeam-channel" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", + "crossbeam-utils", ] [[package]] -name = "generic-array" -version = "0.14.9" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "typenum", - "version_check", + "crossbeam-utils", ] [[package]] -name = "getrandom" -version = "0.2.16" +name = "crossbeam-queue" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ - "cfg-if", - "libc", - "wasi", + "crossbeam-utils", ] [[package]] -name = "getrandom" -version = "0.3.4" +name = "crossbeam-utils" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", + "generic-array", + "rand_core 0.6.4", + "typenum", ] [[package]] -name = "hashbrown" -version = "0.15.5" +name = "crypto-common" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.1.5", + "hybrid-array", ] [[package]] -name = "hashbrown" -version = "0.16.0" +name = "ctr" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", + "cipher", ] [[package]] -name = "hashlink" -version = "0.10.0" +name = "cts-common" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "ae6508011dee61bc36e16615e43cb26a8014c49ebb832e713602f3b0dc15af29" dependencies = [ - "hashbrown 0.15.5", + "arrayvec", + "base32", + "cached", + "chrono", + "derive_more 2.1.1", + "either", + "getrandom 0.4.2", + "miette", + "nom", + "regex", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", + "url", + "utoipa", + "uuid", + "vitaminc", ] [[package]] -name = "heck" -version = "0.5.0" +name = "darling" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] [[package]] -name = "hex" -version = "0.4.3" +name = "darling_core" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.108", +] [[package]] -name = "hkdf" -version = "0.12.4" +name = "darling_macro" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "hmac", + "darling_core", + "quote", + "syn 2.0.108", ] [[package]] -name = "hmac" -version = "0.12.1" +name = "data-encoding" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "dbl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd2735a791158376708f9347fe8faba9667589d82427ef3aed6794a8981de3d9" dependencies = [ - "digest", + "generic-array", ] [[package]] -name = "home" -version = "0.5.11" +name = "der" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "windows-sys 0.59.0", + "const-oid", + "pem-rfc7468", + "zeroize", ] [[package]] -name = "icu_collections" -version = "2.0.0" +name = "deranged" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", + "powerfmt", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "derive_more" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", + "derive_more-impl 1.0.0", ] [[package]] -name = "icu_normalizer" -version = "2.0.0" +name = "derive_more" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", + "derive_more-impl 2.1.1", ] [[package]] -name = "icu_normalizer_data" -version = "2.0.0" +name = "derive_more-impl" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "unicode-xid", +] [[package]] -name = "icu_properties" -version = "2.0.1" +name = "derive_more-impl" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.108", + "unicode-xid", ] [[package]] -name = "icu_properties_data" -version = "2.0.1" +name = "deunicode" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" [[package]] -name = "icu_provider" -version = "2.0.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", + "block-buffer 0.10.4", + "const-oid", + "crypto-common 0.1.6", + "subtle", ] [[package]] -name = "idna" -version = "1.1.0" +name = "digest" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "block-buffer 0.12.0", + "crypto-common 0.2.2", ] [[package]] -name = "idna_adapter" -version = "1.2.1" +name = "dirs" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" dependencies = [ - "icu_normalizer", - "icu_properties", + "dirs-sys", ] [[package]] -name = "indexmap" -version = "2.12.0" +name = "dirs-sys" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ - "equivalent", - "hashbrown 0.16.0", + "libc", + "redox_users", + "winapi", ] [[package]] -name = "itoa" -version = "1.0.15" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] [[package]] -name = "js-sys" -version = "0.3.98" +name = "dotenvy" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dummy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac124e13ae9aa56acc4241f8c8207501d93afdd8d8e62f0c1f2e12f6508c65" dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen", + "darling", + "proc-macro2", + "quote", + "syn 2.0.108", ] [[package]] -name = "jsonschema" -version = "0.46.4" +name = "dunce" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc59d2432e047d6090ba1d83c782d0128bd6203857978218f5614dbd3287281f" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ - "ahash", - "bytecount", - "data-encoding", - "email_address", - "fancy-regex", - "fraction", - "getrandom 0.3.4", - "idna", - "itoa", - "num-cmp", - "num-traits", - "percent-encoding", - "referencing", - "regex", - "regex-syntax", "serde", - "serde_json", - "unicode-general-category", - "uuid-simd", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "email_address" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" dependencies = [ - "spin", + "serde", ] [[package]] -name = "libc" -version = "0.2.177" +name = "enum-as-inner" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.108", +] [[package]] -name = "libm" -version = "0.2.15" +name = "eql_tests" +version = "0.1.0" +dependencies = [ + "anyhow", + "cipherstash-client", + "hex", + "jsonschema", + "serde", + "serde_json", + "sqlx", + "tokio", +] + +[[package]] +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "libredox" -version = "0.1.10" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "bitflags", "libc", - "redox_syscall", + "windows-sys 0.61.2", ] [[package]] -name = "libsqlite3-sys" -version = "0.30.1" +name = "etcetera" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" dependencies = [ - "pkg-config", - "vcpkg", + "cfg-if", + "home", + "windows-sys 0.48.0", ] [[package]] -name = "litemap" -version = "0.8.0" +name = "event-listener" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "lock_api" -version = "0.4.14" +name = "event-listener" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ - "scopeguard", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "log" -version = "0.4.28" +name = "fake" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "2d391ba4af7f1d93f01fcf7b2f29e2bc9348e109dfdbf4dcbdc51dfa38dab0b6" +dependencies = [ + "deunicode", + "dummy", + "rand 0.8.6", + "uuid", +] + +[[package]] +name = "fancy-regex" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fluent-uri" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e" +dependencies = [ + "borrow-or-share", + "ref-cast", + "serde", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fraction" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e076045bb43dac435333ed5f04caf35c7463631d0dae2deb2638d94dd0a5b872" +dependencies = [ + "lazy_static", + "num", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3655aa6818d65bc620d6911f05aa7b6aeb596291e1e9f79e52df85583d1e30" +dependencies = [ + "rustix 0.38.44", + "windows-targets 0.52.6", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasip2", + "wasip3", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.12", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" + +[[package]] +name = "hickory-proto" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.9.4", + "ring", + "thiserror 2.0.18", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "moka", + "once_cell", + "parking_lot", + "rand 0.9.4", + "resolv-conf", + "smallvec", + "thiserror 2.0.18", + "tokio", + "tracing", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipconfig" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +dependencies = [ + "socket2", + "widestring", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.108", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.108", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonschema" +version = "0.46.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc59d2432e047d6090ba1d83c782d0128bd6203857978218f5614dbd3287281f" +dependencies = [ + "ahash 0.8.12", + "bytecount", + "data-encoding", + "email_address", + "fancy-regex", + "fraction", + "getrandom 0.3.4", + "idna", + "itoa", + "num-cmp", + "num-traits", + "percent-encoding", + "referencing", + "regex", + "regex-syntax", + "serde", + "serde_json", + "unicode-general-category", + "uuid-simd", +] + +[[package]] +name = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "md-5" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "micromap" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a86d3146ed3995b5913c414f6664344b9617457320782e64f0bb44afd49d74" + +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "backtrace", + "backtrace-ext", + "cfg-if", + "miette-derive", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moka" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.6", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-cmp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "open" +version = "5.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "orderable-bytes" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adba0469737879cabc3bdcaa6a7beb4ff7f5bb4aa5d624816c8bb9d425a7d5df" +dependencies = [ + "chrono", + "rust_decimal", +] + +[[package]] +name = "ore-rs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77fb65718f1aba7bb7f568db90a2b17a48871d83cd9d1101d19fce449dd8dea" +dependencies = [ + "aes", + "block-modes", + "byteorder", + "chrono", + "hex", + "lazy_static", + "num", + "orderable-bytes", + "rand 0.8.6", + "rand_chacha 0.3.1", + "rust_decimal", + "subtle-ng", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", - "digest", + "libc", + "redox_syscall", + "smallvec", + "windows-link", ] [[package]] -name = "memchr" -version = "2.7.6" +name = "pathdiff" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] -name = "micromap" -version = "0.3.0" +name = "pem" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a86d3146ed3995b5913c414f6664344b9617457320782e64f0bb44afd49d74" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] [[package]] -name = "mio" -version = "1.1.0" +name = "pem-rfc7468" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", + "base64ct", ] [[package]] -name = "num" -version = "0.4.3" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.108", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.6+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "proc-macro2" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e0f6df8eaa422d97d72edcd152e1451618fed47fabbdbd5a8864167b1d4aff7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bitflags", "num-traits", + "rand 0.9.4", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "num-integer", - "num-traits", + "getrandom 0.2.16", ] [[package]] -name = "num-bigint-dig" -version = "0.8.6" +name = "rand_core" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", + "getrandom 0.3.4", ] [[package]] -name = "num-cmp" -version = "0.1.0" +name = "rand_core" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] -name = "num-complex" -version = "0.4.6" +name = "rand_xorshift" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "num-traits", + "rand_core 0.9.5", ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "recipher" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "9398dce78ddfce08f93e9d9a3ac64d9b0a4fed478c0a82003c6e4c90dc245125" dependencies = [ - "num-traits", + "aes", + "cmac", + "getrandom 0.2.16", + "hex", + "hex-literal", + "opaque-debug", + "rand 0.8.6", + "rand_chacha 0.3.1", + "serde", + "serde_cbor", + "sha2", + "thiserror 1.0.69", + "zeroize", ] [[package]] -name = "num-iter" -version = "0.1.45" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "bitflags", ] [[package]] -name = "num-rational" -version = "0.4.2" +name = "redox_users" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "num-bigint", - "num-integer", - "num-traits", + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "ref-cast" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ - "autocfg", - "libm", + "ref-cast-impl", ] [[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "outref" -version = "0.5.2" +name = "ref-cast-impl" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] [[package]] -name = "parking" -version = "2.2.1" +name = "referencing" +version = "0.46.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +checksum = "cb674900ca31acd75c4aaf63f48e43e719631c0539ea5a9e64163d1296bcb730" +dependencies = [ + "ahash 0.8.12", + "fluent-uri", + "getrandom 0.3.4", + "hashbrown 0.16.0", + "itoa", + "micromap", + "parking_lot", + "percent-encoding", + "serde_json", +] [[package]] -name = "parking_lot" -version = "0.12.5" +name = "regex" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ - "lock_api", - "parking_lot_core", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "parking_lot_core" -version = "0.9.12" +name = "regex-automata" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "pem-rfc7468" -version = "0.7.0" +name = "regex-syntax" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] -name = "percent-encoding" -version = "2.3.2" +name = "rend" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] [[package]] -name = "pin-project-lite" -version = "0.2.16" +name = "reqwest" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "hickory-resolver", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] [[package]] -name = "pin-utils" -version = "0.1.0" +name = "resolv-conf" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] -name = "pkcs1" -version = "0.7.5" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "der", - "pkcs8", - "spki", + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", ] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "rkyv" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" dependencies = [ - "der", - "spki", + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", ] [[package]] -name = "pkg-config" -version = "0.3.32" +name = "rkyv_derive" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] -name = "potential_utf" -version = "0.1.3" +name = "rmp" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "zerovec", + "num-traits", ] [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "rmp-serde" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "zerocopy", + "rmp", + "serde", ] [[package]] -name = "proc-macro2" -version = "1.0.102" +name = "rsa" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e0f6df8eaa422d97d72edcd152e1451618fed47fabbdbd5a8864167b1d4aff7" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ - "unicode-ident", + "const-oid", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", ] [[package]] -name = "quote" -version = "1.0.41" +name = "rust-stemmers" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" dependencies = [ - "proc-macro2", + "serde", + "serde_derive", ] [[package]] -name = "r-efi" -version = "5.3.0" +name = "rust_decimal" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "0c5108e3d4d903e21aac27f12ba5377b6b34f9f44b325e4894c7924169d06995" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.6", + "rkyv", + "serde", + "serde_json", + "wasm-bindgen", +] [[package]] -name = "rand" -version = "0.8.6" +name = "rustc-demangle" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "rustc-hash" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] -name = "rand_core" -version = "0.6.4" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "getrandom 0.2.16", + "semver", ] [[package]] -name = "redox_syscall" -version = "0.5.18" +name = "rustix" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", ] [[package]] -name = "ref-cast" -version = "1.0.25" +name = "rustix" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "ref-cast-impl", + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", ] [[package]] -name = "ref-cast-impl" -version = "1.0.25" +name = "rustls" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ - "proc-macro2", - "quote", - "syn", + "aws-lc-rs", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] -name = "referencing" -version = "0.46.4" +name = "rustls-native-certs" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb674900ca31acd75c4aaf63f48e43e719631c0539ea5a9e64163d1296bcb730" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ - "ahash", - "fluent-uri", - "getrandom 0.3.4", - "hashbrown 0.16.0", - "itoa", - "micromap", - "parking_lot", - "percent-encoding", - "serde_json", + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] -name = "regex" -version = "1.12.3" +name = "rustls-pki-types" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", + "web-time", + "zeroize", ] [[package]] -name = "regex-automata" -version = "0.4.14" +name = "rustls-platform-verifier" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", ] [[package]] -name = "regex-syntax" -version = "0.8.10" +name = "rustls-platform-verifier-android" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] -name = "rsa" -version = "0.9.10" +name = "rustls-webpki" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted 0.9.0", ] [[package]] @@ -1170,12 +3298,65 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" version = "1.0.228" @@ -1186,6 +3367,26 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half", + "serde", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -1203,7 +3404,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", ] [[package]] @@ -1219,6 +3420,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1231,6 +3441,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f42f67da2385b51a5f9652db9c93d78aeaf7610bf5ec366080b6de810604af53" +dependencies = [ + "base16ct", + "serde", + "zeroize", +] + [[package]] name = "sha1" version = "0.10.6" @@ -1238,10 +3459,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.9" @@ -1249,10 +3476,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.6" @@ -1268,8 +3501,42 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", - "rand_core", + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple_asn1" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.18", + "time", ] [[package]] @@ -1340,7 +3607,7 @@ dependencies = [ "crc", "crossbeam-queue", "either", - "event-listener", + "event-listener 5.4.1", "futures-core", "futures-intrusive", "futures-io", @@ -1356,7 +3623,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror", + "thiserror 2.0.18", "tokio", "tokio-stream", "tracing", @@ -1373,7 +3640,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn", + "syn 2.0.108", ] [[package]] @@ -1396,7 +3663,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn", + "syn 2.0.108", "tokio", "url", ] @@ -1413,7 +3680,7 @@ dependencies = [ "byteorder", "bytes", "crc", - "digest", + "digest 0.10.7", "dotenvy", "either", "futures-channel", @@ -1430,7 +3697,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand", + "rand 0.8.6", "rsa", "serde", "sha1", @@ -1438,7 +3705,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.18", "tracing", "whoami", ] @@ -1468,14 +3735,14 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand", + "rand 0.8.6", "serde", "serde_json", "sha2", "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.18", "tracing", "whoami", ] @@ -1499,74 +3766,258 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror", + "thiserror 2.0.18", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stack-auth" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c823cc3d88e15478d51694ef56037400bd4ae3e1a9e046071e01d251168cc466" +dependencies = [ + "aquamarine", + "base64", + "cts-common", + "jsonwebtoken", + "miette", + "open", + "reqwest", + "serde", + "serde_json", + "stack-profile", + "thiserror 1.0.69", + "tokio", "tracing", "url", + "uuid", + "vitaminc", + "vitaminc-protected", + "web-time", + "zeroize", + "zerokms-protocol", +] + +[[package]] +name = "stack-profile" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd1be30119d59260f3e932f78fbbfbe3674c151d39e7fcca24d0439e7e31ba8" +dependencies = [ + "dirs", + "gethostname", + "serde", + "serde_json", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e396b6523b11ccb83120b115a0b7366de372751aa6edf19844dfb13a6af97e91" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "terminal_size" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" +dependencies = [ + "rustix 1.1.4", + "windows-sys 0.61.2", ] [[package]] -name = "stable_deref_trait" -version = "1.2.1" +name = "textwrap" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.2", +] [[package]] -name = "stringprep" -version = "0.1.5" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", + "thiserror-impl 1.0.69", ] [[package]] -name = "subtle" -version = "2.6.1" +name = "thiserror" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] [[package]] -name = "syn" -version = "2.0.108" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "syn 2.0.108", ] [[package]] -name = "synstructure" -version = "0.13.2" +name = "thiserror-impl" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", ] [[package]] -name = "thiserror" -version = "2.0.17" +name = "time" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ - "thiserror-impl", + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", ] [[package]] -name = "thiserror-impl" -version = "2.0.17" +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ - "proc-macro2", - "quote", - "syn", + "num-conv", + "time-core", ] [[package]] @@ -1619,7 +4070,17 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", ] [[package]] @@ -1633,6 +4094,140 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0db3bae107c9522f86d361697dee1d7386a2ddcf659d5aea5159819a21a3c4a7" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.3", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "async-compression", + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tokio", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -1653,7 +4248,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", ] [[package]] @@ -1665,11 +4260,23 @@ dependencies = [ "once_cell", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[package]] +name = "unarray" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" @@ -1689,6 +4296,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.24" @@ -1704,6 +4317,52 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.6", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.7" @@ -1722,27 +4381,204 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utoipa" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bde15df68e80b16c7d16b9616e80770ad158988daa56a27dccd1e55558b0160" +dependencies = [ + "indexmap", + "serde", + "serde_json", + "utoipa-gen", +] + +[[package]] +name = "utoipa-gen" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba0b99ee52df3028635d93840c797102da61f8a7bb3cf751032455895b52ef8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "url", + "uuid", +] + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "atomic", + "getrandom 0.4.2", + "js-sys", + "md-5", + "serde_core", + "sha1_smol", + "wasm-bindgen", +] + [[package]] name = "uuid-simd" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" dependencies = [ - "outref", - "vsimd", + "outref", + "vsimd", +] + +[[package]] +name = "validator" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fb22e1a008ece370ce08a3e9e4447a910e92621bb49b85d6e48a45397e7cfa" +dependencies = [ + "idna", + "once_cell", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_derive", +] + +[[package]] +name = "validator_derive" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7df16e474ef958526d1205f6dda359fdfab79d9aa6d54bafcb92dcd07673dca" +dependencies = [ + "darling", + "once_cell", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vitaminc" +version = "0.2.0-pre" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9807fc6a29a9ab4a9cd24f103573661d7e04d48651ce8c752d32e73a686446" +dependencies = [ + "vitaminc-aead", + "vitaminc-encrypt", + "vitaminc-protected", + "vitaminc-random", + "vitaminc-traits", +] + +[[package]] +name = "vitaminc-aead" +version = "0.2.0-pre" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3933759550ab4841536e8d019fc73cd77ec2e43dcdaefa3218936534eefabb8d" +dependencies = [ + "bytes", + "serde", + "vitaminc-protected", + "vitaminc-random", + "zeroize", +] + +[[package]] +name = "vitaminc-encrypt" +version = "0.2.0-pre" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdbcfd5e9054ce2a3f0cfac67c3e3164d65f38f3a6d593bc4d5d943e53aaf44" +dependencies = [ + "aes-gcm", + "aws-lc-rs", + "vitaminc-aead", + "vitaminc-protected", + "vitaminc-random", + "zeroize", +] + +[[package]] +name = "vitaminc-protected" +version = "0.2.0-pre" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c639c70c23871680d0cedabb2fb8cfd0ff91eb98d90dd27e9bdebf6eac1fd18" +dependencies = [ + "bitvec", + "digest 0.11.3", + "serde", + "serde_bytes", + "subtle", + "vitaminc-protected-derive", + "zeroize", +] + +[[package]] +name = "vitaminc-protected-derive" +version = "0.2.0-pre" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "659afc33e7252768204f44bd9f377a120a35dc586aa3538b66a3f4cc54a88653" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "vitaminc-random" +version = "0.2.0-pre" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac67bf5f90acc53c87deb5f612ad1beefd0e0e7f5452ab3443d9fa4b0e23f9c5" +dependencies = [ + "getrandom 0.4.2", + "rand 0.10.1", + "thiserror 2.0.18", + "vitaminc-protected", + "vitaminc-random-derives", + "zeroize", ] [[package]] -name = "vcpkg" -version = "0.2.15" +name = "vitaminc-random-derives" +version = "0.2.0-pre" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "efeeb4347ca86ff167228cfbd655c7a6e8a5bd6f032330ac881d6c4c0441768b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] [[package]] -name = "version_check" -version = "0.9.5" +name = "vitaminc-traits" +version = "0.2.0-pre" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "5aeb6ef24c094d225d00753134f082eba59ea2ba8d5d0b5ba761c038ca9375b3" +dependencies = [ + "anyhow", + "bytes", + "rmp-serde", + "serde", + "thiserror 2.0.18", + "vitaminc-protected", + "vitaminc-random", + "zeroize", +] [[package]] name = "vsimd" @@ -1750,6 +4586,25 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -1762,7 +4617,16 @@ version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", ] [[package]] @@ -1780,10 +4644,21 @@ dependencies = [ "cfg-if", "once_cell", "rustversion", + "serde", "wasm-bindgen-macro", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.121" @@ -1803,7 +4678,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.108", "wasm-bindgen-shared", ] @@ -1816,6 +4691,82 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" version = "1.6.1" @@ -1826,12 +4777,113 @@ dependencies = [ "wasite", ] +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -1841,6 +4893,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -2054,18 +5115,142 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +[[package]] +name = "winnow" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn 2.0.108", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.108", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + [[package]] name = "writeable" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "yoke" version = "0.8.0" @@ -2086,7 +5271,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", "synstructure", ] @@ -2107,7 +5292,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", ] [[package]] @@ -2127,7 +5312,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", "synstructure", ] @@ -2136,6 +5321,43 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "zerokms-protocol" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04a9411f442b247e7d00c6a07cfbc6d56c12d485cfaf4f7effa001bfb1615296" +dependencies = [ + "base64", + "cipherstash-config", + "const-hex", + "cts-common", + "fake", + "getrandom 0.2.16", + "opaque-debug", + "rand 0.8.6", + "serde", + "static_assertions", + "thiserror 1.0.69", + "utoipa", + "uuid", + "validator", + "zeroize", +] [[package]] name = "zerotrie" @@ -2167,5 +5389,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.108", ] diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 95fb86a2c..153aebf3f 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -11,6 +11,7 @@ serde_json = "1" anyhow = "1" hex = "0.4" jsonschema = { version = "0.46.4", default-features = false } +cipherstash-client = { version = "0.35", features = ["tokio"] } [dev-dependencies] # None needed - tests live in this crate @@ -25,6 +26,8 @@ bench = [] # Opt-in to compiling the fixture generators. Without this feature the # `#[cfg(feature = "fixture-gen")]` generator tests do not exist, so # `cargo test` and CI never see them. Generators need a live Postgres and -# CipherStash Proxy; run one with: +# CipherStash workspace credentials in the process env +# (`CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN`, or the legacy +# `CS_CLIENT_ID`/`CS_CLIENT_KEY` pair). Run one with: # mise run fixture:generate fixture-gen = [] diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index a1dc82528..978ad1f1f 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -48,6 +48,24 @@ cargo test equality cargo test -- --nocapture ``` +### Generator credentials + +`mise run test:sqlx` regenerates the `eql_v2_int4` fixture before running the +suite via `mise run fixture:generate eql_v2_int4`. The generator encrypts +plaintexts in-process using `cipherstash-client` (no Proxy / no Docker +sidecar), so the following CipherStash workspace credentials must be +present in the shell environment when you run it locally or in CI: + +- `CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN` — preferred, single-token + bearer credential, picked up by `AutoStrategy::detect()`. +- `CS_CLIENT_ID` + `CS_CLIENT_KEY` — the client-key pair used by + `EnvKeyProvider` to derive the per-call data keys. + +If either set is missing the first call into the generator fails fast +during ZeroKMS handshake with a clear `anyhow` chain naming the missing +variable. Other SQLx tests do not need the `CS_*` variables — only the +fixture-regeneration step does. + ## Test Data ### Fixtures diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index e4ac7856a..9ac804b72 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -201,10 +201,11 @@ applies standalone. **Regenerated every test run.** `mise run test:sqlx` invokes the generator before `cargo test`, so a stale committed fixture cannot mask a payload-shape -regression. The generator needs a live Postgres with EQL and a running -CipherStash Proxy — `test:sqlx` brings the Proxy up automatically via -`mise run proxy:up`. Do not hand-edit the generated file; it is overwritten in -place on every run. +regression. The generator encrypts in-process via `cipherstash-client`; it +needs a live Postgres plus CipherStash workspace credentials +(`CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN`, or the legacy +`CS_CLIENT_ID`/`CS_CLIENT_KEY` pair) in the shell environment. Do not +hand-edit the generated file; it is overwritten in place on every run. **Schema:** Table lives in the dedicated `fixtures` SQL schema (kept out of the `public` type/domain namespace so a downstream `public.eql_v2_int4` domain can @@ -224,9 +225,10 @@ CREATE TABLE fixtures.eql_v2_int4 ( — a negative boundary plus small/medium/large/extreme magnitudes. - `plaintext` is the **in-table oracle**: consuming tests filter `WHERE plaintext = N` directly, so no Rust value constant is shared. -- Each `payload` is a Proxy-encrypted JSONB object carrying `c` (ciphertext), - `hm` (HMAC equality term), `ob` (ORE block ordering term), and an inert `i` - metadata object. +- Each `payload` is a cipherstash-client-encrypted JSONB object carrying + `c` (ciphertext), `hm` (HMAC equality term), `ob` (ORE block ordering + term), an inert `i` metadata object, and the EQL v2 root discriminator + (`k = "ct"`, `v = 2`). **Used By:** - eql_v2_int4_fixture_tests.rs (structural verification) diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs new file mode 100644 index 000000000..c8dd6c5bd --- /dev/null +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -0,0 +1,253 @@ +//! Direct `cipherstash-client` integration — the encryption oracle for the +//! SQLx fixture generator. +//! +//! Earlier revisions of the generator started a CipherStash Proxy container, +//! wrote `add_search_config` rows so Proxy knew which columns to encrypt, +//! restarted the container so it reloaded that config, then INSERTed +//! plaintexts through a Proxy-mediated Postgres connection. That whole loop +//! existed only because the Proxy was the encryption oracle. +//! +//! `cipherstash-client` 0.35 exposes the same surface natively. This module +//! owns the bootstrap — `cipher()` lazily builds a process-wide +//! `ScopedCipher` — and the per-value helper +//! `encrypt_store()` that wraps `eql::encrypt_eql` and returns the resulting +//! EQL ciphertext as a `serde_json::Value` ready to bind into a `jsonb` +//! column. +//! +//! `column_config_for` is the bridge between the fixture spec's string-typed +//! index names (`"unique"`, `"ore"`, …) and the typed `IndexType` enum +//! cipherstash-config uses. Unknown names raise immediately so a typo at +//! spec construction fails fast. + +use std::borrow::Cow; +use std::sync::Arc; + +use anyhow::{anyhow, Context, Result}; +use cipherstash_client::encryption::ScopedCipher; +use cipherstash_client::eql::{ + encrypt_eql, EqlCiphertext, EqlEncryptOpts, EqlOperation, EqlOutput, Identifier, + PreparedPlaintext, +}; +use cipherstash_client::schema::column::{Index, IndexType}; +use cipherstash_client::schema::{ColumnConfig, ColumnType}; +use cipherstash_client::zerokms::{EnvKeyProvider, ZeroKMSBuilder}; +use cipherstash_client::AutoStrategy; +use tokio::sync::OnceCell; + +use super::eql_plaintext::{Cast, EqlPlaintext}; +use super::validation::FixtureIdentifier; + +/// Process-wide `ScopedCipher`. Built on first use and held for the lifetime +/// of the test binary — `ScopedCipher` is documented as +/// "initialise once per process, hold an `Arc` for the process lifetime" +/// (see the upstream doc comment in `scoped_cipher.rs`). Re-initialising it +/// per call discards the warm reqwest pool and the cached auth token, and +/// makes the generator slower for no benefit. +static CIPHER: OnceCell>> = OnceCell::const_new(); + +/// Lazily initialise the process-wide cipher. On the first call this performs +/// the AutoStrategy detection, the ZeroKMS handshake, and the keyset load — +/// each subsequent call is an `Arc` clone. +/// +/// Errors surface as `anyhow::Error` with `.context(...)` naming the step +/// that failed (credential detection vs ZeroKMS connect vs keyset load). +pub async fn cipher() -> Result>> { + CIPHER + .get_or_try_init(|| async { + let zerokms = ZeroKMSBuilder::auto() + .context( + "building ZeroKMSBuilder via AutoStrategy::detect() — check \ + CS_CLIENT_ACCESS_KEY or CS_WORKSPACE_CRN env vars", + )? + .with_key_provider(EnvKeyProvider) + .build() + .await + .context( + "building ZeroKMS client — check CS_CLIENT_ID + CS_CLIENT_KEY \ + env vars (loaded by EnvKeyProvider)", + )?; + + let cipher = ScopedCipher::init_default(Arc::new(zerokms)) + .await + .context("initialising ScopedCipher for the default keyset")?; + + Ok::<_, anyhow::Error>(Arc::new(cipher)) + }) + .await + .cloned() +} + +/// Build a `ColumnConfig` from the fixture spec's index list + cast. +/// +/// The fixture spec uses EQL's string-typed index identifiers (`"unique"`, +/// `"ore"`, `"match"`, `"ste_vec"`); cipherstash-config uses the typed +/// `IndexType` enum. The mapping here is the single point of contact +/// between the two — extending fixture coverage to a new index means one +/// new arm here plus the corresponding `EqlPlaintext::CAST` constant. +/// +/// Unknown identifiers raise immediately with the offending name in the +/// error so a typo at spec-construction surfaces at run time (the +/// `FixtureIdentifier` newtype only proves the string is a valid SQL +/// identifier, not that it names a real index type). +pub fn column_config_for( + spec_indexes: &[FixtureIdentifier], + cast: Cast, +) -> Result { + let column_type = cast_to_column_type(cast)?; + let mut config = ColumnConfig::build("payload").casts_as(column_type); + + for ix in spec_indexes { + let index_type = index_type_for(ix.as_str())?; + config = config.add_index(Index::new(index_type)); + } + + Ok(config) +} + +/// Map an `EqlPlaintext::Cast` onto cipherstash-config's `ColumnType`. The +/// `Cast` newtype's allowlist is structural, so the only failure mode is +/// "we extended `EqlPlaintext` with a new variant but forgot to extend +/// this mapping" — explicit error rather than a `_ => unreachable!()` +/// gives the maintainer a clear breadcrumb. +fn cast_to_column_type(cast: Cast) -> Result { + match cast.as_str() { + "int" => Ok(ColumnType::Int), + "small_int" => Ok(ColumnType::SmallInt), + "big_int" => Ok(ColumnType::BigInt), + "boolean" => Ok(ColumnType::Boolean), + "date" => Ok(ColumnType::Date), + "decimal" => Ok(ColumnType::Decimal), + "float" | "real" | "double" => Ok(ColumnType::Float), + "text" => Ok(ColumnType::Text), + "jsonb" | "json" => Ok(ColumnType::Json), + "timestamp" => Ok(ColumnType::Timestamp), + other => Err(anyhow!( + "no cipherstash-config ColumnType mapping for cast {other:?} — \ + extend cipherstash::cast_to_column_type when adding a new \ + EqlPlaintext variant" + )), + } +} + +/// Map the fixture spec's string-typed index identifier onto a typed +/// `IndexType`. Reuses the canonical constructors on `Index` +/// (`Index::new_unique`, etc.) so the defaults stay in sync with whatever +/// cipherstash-config considers the canonical shape for each index. +fn index_type_for(name: &str) -> Result { + match name { + "unique" => Ok(Index::new_unique().index_type), + "ore" => Ok(IndexType::Ore), + "match" => Ok(Index::new_match().index_type), + other => Err(anyhow!( + "unknown EQL index identifier {other:?} — supported: \ + unique, ore, match" + )), + } +} + +/// Encrypt a single plaintext value for storage and return the resulting +/// EQL ciphertext as a `serde_json::Value` ready to bind into a `jsonb` +/// column. +/// +/// Uses `EqlOperation::Store`, which yields a full storage payload +/// (`{"k": "ct", "v": 2, "i": …, "c": …, "hm": …, "ob": …}`) — the same +/// shape Proxy produced for the working table. `EqlEncryptOpts::default()` +/// uses the cipher's default keyset, no lock context, no service token, no +/// index filter — the same defaults Proxy uses for column-config-driven +/// inserts. +pub async fn encrypt_store( + table: &str, + column: &str, + value: T, + config: &ColumnConfig, +) -> Result { + let cipher = cipher().await?; + + let prepared = PreparedPlaintext::new( + Cow::Borrowed(config), + Identifier::new(table, column), + value.to_plaintext(), + EqlOperation::Store, + ); + + let opts = EqlEncryptOpts::default(); + let mut outputs = encrypt_eql(cipher, vec![prepared], &opts) + .await + .with_context(|| format!("encrypting value for {table}.{column}"))?; + + let output = outputs + .pop() + .ok_or_else(|| anyhow!("encrypt_eql returned no outputs"))?; + + let ciphertext: EqlCiphertext = match output { + EqlOutput::Store(ct) => ct, + EqlOutput::Query(_) => { + // EqlOperation::Store always yields EqlOutput::Store; treating + // the other arm as unreachable would hide a future API drift. + return Err(anyhow!( + "encrypt_eql returned a Query output for an EqlOperation::Store input" + )); + } + }; + + serde_json::to_value(&ciphertext).context("serialising EqlCiphertext to JSON") +} + +#[cfg(test)] +mod tests { + use super::*; + + fn ident(s: &str) -> FixtureIdentifier { + FixtureIdentifier::try_from(s).unwrap() + } + + #[test] + fn column_config_for_int_with_unique_and_ore_builds_a_two_index_config() { + let indexes = [ident("unique"), ident("ore")]; + let config = column_config_for(&indexes, Cast::INT).unwrap(); + + assert_eq!(config.name, "payload"); + assert!(matches!(config.cast_type, ColumnType::Int)); + assert_eq!(config.indexes.len(), 2); + assert!(config.indexes.iter().any(|i| i.is_unique())); + assert!(config.indexes.iter().any(|i| i.is_ore())); + } + + #[test] + fn column_config_for_rejects_an_unknown_index_name() { + let indexes = [ident("bogus")]; + let err = column_config_for(&indexes, Cast::INT).unwrap_err(); + assert!( + format!("{err:#}").contains("unknown EQL index identifier"), + "error should name the unknown identifier: {err:#}" + ); + } + + #[test] + fn cast_to_column_type_covers_every_eql_plaintext_cast_constant() { + // Every Cast constant on EqlPlaintext must round-trip into a + // ColumnType — otherwise a freshly-added EqlPlaintext variant + // would crash the generator at run time instead of failing the + // build. Listed explicitly so a new `pub const` on Cast forces an + // update here. + for cast in [ + Cast::TEXT, + Cast::INT, + Cast::SMALL_INT, + Cast::BIG_INT, + Cast::REAL, + Cast::DOUBLE, + Cast::BOOLEAN, + Cast::DATE, + Cast::JSONB, + Cast::JSON, + Cast::FLOAT, + Cast::DECIMAL, + Cast::TIMESTAMP, + ] { + cast_to_column_type(cast).unwrap_or_else(|e| { + panic!("Cast::{} has no ColumnType mapping: {e}", cast.as_str()) + }); + } + } +} diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs index 1b973bfaa..0691ab5d3 100644 --- a/tests/sqlx/src/fixtures/driver.rs +++ b/tests/sqlx/src/fixtures/driver.rs @@ -1,10 +1,11 @@ //! `FixtureSpec::run()` — the generation driver. //! -//! mise owns the containers; this owns the data. The driver assumes -//! `mise run proxy:up` has started `cipherstash-proxy` and that the -//! generation Postgres has EQL installed. Errors are `anyhow` with -//! `.context(...)` — a generator is a developer tool; a clear crash beats a -//! partial fixture. +//! mise owns the containers; this owns the data. The driver opens a direct +//! Postgres connection and encrypts each plaintext value via +//! `cipherstash-client` (see the sibling `cipherstash` module) before +//! inserting the result into a transient working table. Errors are `anyhow` +//! with `.context(...)` — a generator is a developer tool; a clear crash +//! beats a partial fixture. //! //! The `public._fixture_` working table is transient plumbing: `.run()` //! creates it, encrypts into it, renders the committed rows from it, then @@ -16,20 +17,15 @@ //! `DROP TABLE IF EXISTS` reclaims that case. use std::path::PathBuf; -use std::process::Command; -use std::time::Duration; -use anyhow::{anyhow, Context, Result}; +use anyhow::{Context, Result}; use sqlx::postgres::PgConnectOptions; use sqlx::{ConnectOptions, Connection, PgConnection, Row}; +use super::cipherstash; use super::eql_plaintext::EqlPlaintext; use super::spec::FixtureSpec; -/// `cipherstash-proxy` — the fixed container_name from -/// `tests/docker-compose.proxy.yml`. -const PROXY_CONTAINER: &str = "cipherstash-proxy"; - /// Bag of Rust-type bounds required of a fixture's plaintext value `T`. /// Collapses the long `where` clause on `impl FixtureSpec<'a, T>` to a single /// alias; the blanket impl below makes it auto-applied to any `T` that @@ -55,25 +51,24 @@ impl FixtureValue for T where } /// Driver connection options, parsed once from the environment at the start -/// of `run`. `direct` is the unmediated Postgres connection (DDL + -/// rendering); `proxy` is the Proxy-mediated connection (encrypted inserts). +/// of `run`. Only the unmediated Postgres connection is needed: DDL, +/// inserts, and the render step all run against it. Encryption happens in +/// Rust (cipherstash-client), so there is no second connection. struct DriverConfig { direct: PgConnectOptions, - proxy: PgConnectOptions, } impl DriverConfig { /// Build connection options from env vars, defaulting to the /// `mise.toml` `[env]` values. Port parses are strict — a malformed - /// `POSTGRES_PORT` or `PROXY_PORT` surfaces as an `anyhow::Error` with - /// the offending value, matching the rest of the driver's error story. + /// `POSTGRES_PORT` surfaces as an `anyhow::Error` with the offending + /// value, matching the rest of the driver's error story. fn from_env() -> Result { let host = env_or("POSTGRES_HOST", "localhost"); let user = env_or("POSTGRES_USER", "cipherstash"); let password = env_or("POSTGRES_PASSWORD", "password"); let database = env_or("POSTGRES_DB", "cipherstash"); let port = parse_port_env("POSTGRES_PORT", 7432)?; - let proxy_port = parse_port_env("PROXY_PORT", 6432)?; let direct = PgConnectOptions::new() .host(&host) @@ -82,10 +77,7 @@ impl DriverConfig { .password(&password) .database(&database); - // Proxy runs on the host at PROXY_PORT (default 6432); same credentials. - let proxy = direct.clone().port(proxy_port); - - Ok(Self { direct, proxy }) + Ok(Self { direct }) } } @@ -102,47 +94,6 @@ fn parse_port_env(key: &str, default: u16) -> Result { } } -/// Restart Proxy (so it reloads the new encrypt config) and poll until it -/// accepts a connection. On timeout, dump `docker logs` and fail. -async fn restart_proxy_and_wait(proxy_options: &PgConnectOptions) -> Result<()> { - let status = Command::new("docker") - .args(["restart", PROXY_CONTAINER]) - .status() - .context("failed to spawn `docker restart`")?; - if !status.success() { - anyhow::bail!("`docker restart {PROXY_CONTAINER}` exited non-zero"); - } - - for _ in 0..60 { - if let Ok(mut conn) = proxy_options.clone().connect().await { - if sqlx::query("SELECT 1").execute(&mut conn).await.is_ok() { - let _ = conn.close().await; - return Ok(()); - } - } - tokio::time::sleep(Duration::from_secs(1)).await; - } - - // `docker logs` sends the container's stdout to our stdout and its stderr - // to our stderr; capture both so the diagnostic is non-empty regardless of - // which stream the Proxy logs to. - let logs = Command::new("docker") - .args(["logs", "--tail", "40", PROXY_CONTAINER]) - .output() - .map(|o| { - format!( - "{}{}", - String::from_utf8_lossy(&o.stdout), - String::from_utf8_lossy(&o.stderr), - ) - }) - .unwrap_or_default(); - Err(anyhow!( - "Proxy did not become ready within 60s after restart\n\ - === {PROXY_CONTAINER} logs ===\n{logs}" - )) -} - /// Absolute path to `tests/sqlx/fixtures/.sql`. Resolved from /// `CARGO_MANIFEST_DIR` (the `tests/sqlx` crate root) so the path is correct /// regardless of the process working directory. @@ -161,7 +112,7 @@ where /// The production entry point. Parses the env-driven `DriverConfig` /// once, opens a direct Postgres connection, then delegates the /// schema + teardown orchestration to `run_with`, supplying - /// `insert_through_proxy` as the closure. After `run_with` returns the + /// `insert_direct` as the closure. After `run_with` returns the /// rendered INSERT lines, this method composes them with /// `fixture_script_preamble` and writes the committed script to disk. pub async fn run(&self) -> Result<()> { @@ -174,10 +125,21 @@ where .await .context("connecting to Postgres (direct)")?; + // Second direct connection for the inserter closure. `run_with` + // borrows the first connection mutably for the duration of the + // pipeline, so the inserter must hold its own. + let mut inserter_conn = config + .direct + .clone() + .connect() + .await + .context("connecting to Postgres (direct inserter)")?; + let lines = self - .run_with(&mut direct, || self.insert_through_proxy(&config.proxy)) + .run_with(&mut direct, || self.insert_direct(&mut inserter_conn)) .await?; + let _ = inserter_conn.close().await; let _ = direct.close().await; let mut script = self.fixture_script_preamble(); @@ -193,33 +155,34 @@ where Ok(()) } - /// Restart Proxy so it picks up the new `add_search_config`, then open a - /// Proxy connection and insert each plaintext value into the working - /// table. Proxy intercepts each insert and writes the encrypted JSONB - /// composite into `payload`. The production insert step extracted from - /// `run`'s closure for skim-ability. - async fn insert_through_proxy(&self, proxy_options: &PgConnectOptions) -> Result<()> { - restart_proxy_and_wait(proxy_options).await?; + /// Encrypt each plaintext value via cipherstash-client and INSERT it + /// into the working table as plain JSONB. The committed + /// `ColumnConfig` is built once from the spec's indexes + cast — the + /// fixture name is fed as the table identifier so the resulting + /// payload's `i.t` field matches the working table, preserving the + /// shape Proxy used to emit. + async fn insert_direct(&self, direct: &mut PgConnection) -> Result<()> { + let config = cipherstash::column_config_for(self.indexes(), T::CAST) + .context("building ColumnConfig from FixtureSpec indexes")?; - let mut proxy = proxy_options - .clone() - .connect() - .await - .context("connecting to Proxy")?; let working = self.working_table(); for (i, value) in self.values().iter().enumerate() { let id = (i as i64) + 1; + let payload = + cipherstash::encrypt_store(&working, "payload", *value, &config) + .await + .with_context(|| format!("encrypting value #{id}"))?; + let insert = - format!("INSERT INTO {working} (id, plaintext, payload) VALUES ($1, $2, $3)"); + format!("INSERT INTO public.{working} (id, plaintext, payload) VALUES ($1, $2, $3)"); sqlx::query(&insert) .bind(id) .bind(*value) - .bind(*value) - .execute(&mut proxy) + .bind(sqlx::types::Json(payload)) + .execute(&mut *direct) .await - .with_context(|| format!("inserting value #{id} through Proxy"))?; + .with_context(|| format!("inserting value #{id}"))?; } - let _ = proxy.close().await; Ok(()) } @@ -239,10 +202,10 @@ where /// 6. Propagate failures in causal order: inserter error first /// (root cause), then render, then drop. /// - /// `run()` calls this with `insert_through_proxy`. Tests call it with - /// closures that insert hand-crafted `eql_v2_encrypted` composite - /// literals directly (no Proxy required), or with closures that return - /// `Err` to exercise the teardown contract. + /// `run()` calls this with `insert_direct`. Tests call it with + /// closures that insert hand-crafted JSONB payloads directly (no + /// cipherstash-client required), or with closures that return `Err` + /// to exercise the teardown contract. /// /// Private by design: this is a test seam, not a public API. Other /// fixtures must go through `run`. @@ -332,7 +295,7 @@ mod tests { let insert = format!( "INSERT INTO public.{working_for_closure} \ (id, plaintext, payload) \ - VALUES ($1, $2, ROW($3::jsonb)::public.eql_v2_encrypted)" + VALUES ($1, $2, $3::jsonb)" ); sqlx::query(&insert) .bind(id) diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index e8c17a229..4cdc807da 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -6,9 +6,15 @@ //! makes the EQL allowlist structural — a `T::CAST` is, by construction, a //! value EQL accepts. The trait is sealed so external crates cannot add //! impls that bypass this guarantee. +//! +//! `to_plaintext` lifts the value into the cipherstash-client +//! `encryption::Plaintext` enum so the fixture generator can encrypt directly +//! via `eql::encrypt_eql` (no Proxy round trip). use std::fmt; +use cipherstash_client::encryption::Plaintext; + /// The `cast_as` argument for `eql_v2.add_search_config`. The field is /// private so the allowlist is the set of `pub const`s below. #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -70,11 +76,21 @@ mod sealed { pub trait EqlPlaintext: sealed::Sealed { const CAST: Cast; const PLAINTEXT_SQL_TYPE: PlaintextSqlType; + + /// Lift the Rust value into the cipherstash-client `Plaintext` enum the + /// EQL encryption pipeline consumes. The mapping is total — every + /// `EqlPlaintext` impl maps cleanly onto a `Plaintext::*(Some(_))` + /// variant. + fn to_plaintext(self) -> Plaintext; } impl EqlPlaintext for i32 { const CAST: Cast = Cast::INT; const PLAINTEXT_SQL_TYPE: PlaintextSqlType = PlaintextSqlType::INTEGER; + + fn to_plaintext(self) -> Plaintext { + Plaintext::Int(Some(self)) + } } #[cfg(test)] @@ -93,4 +109,14 @@ mod tests { "integer" ); } + + #[test] + fn i32_to_plaintext_wraps_in_int_variant() { + // The trait must lift the raw i32 into the EQL pipeline's Plaintext + // enum so the fixture driver can hand it to `eql::encrypt_eql`. + match (42_i32).to_plaintext() { + Plaintext::Int(Some(value)) => assert_eq!(value, 42), + other => panic!("expected Plaintext::Int(Some(42)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 38504ce58..d2c90c3f8 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -14,6 +14,8 @@ pub mod spec; pub use spec::FixtureSpec; +pub mod cipherstash; + pub mod driver; pub mod eql_v2_int4; diff --git a/tests/sqlx/src/fixtures/spec.rs b/tests/sqlx/src/fixtures/spec.rs index 0f1ea41ce..9ab0c1f2d 100644 --- a/tests/sqlx/src/fixtures/spec.rs +++ b/tests/sqlx/src/fixtures/spec.rs @@ -117,12 +117,13 @@ impl<'a, T> FixtureSpec<'a, T> { } /// SQL for the transient working table on the generation database. - /// `id BIGINT PRIMARY KEY`, `plaintext` as the SQL type for `T`, and - /// `payload eql_v2_encrypted` so Proxy encrypts inserts. Per index: - /// an idempotent `remove_search_config` guarded by `WHERE EXISTS`, then - /// `add_search_config`. Every `add_search_config` argument is a quoted - /// string literal — the table/column names are fixed literals, and the - /// index name and cast are validated tokens (`FixtureIdentifier` / `Cast`). + /// `id BIGINT PRIMARY KEY`, `plaintext` as the SQL type for `T`, and a + /// plain `payload jsonb` staging column. The fixture driver encrypts in + /// Rust via `cipherstash-client` and inserts the resulting JSONB directly + /// — the working table is a values buffer that exists only so the render + /// step can use Postgres `format('%L', …)` for SQL literal escaping. No + /// `eql_v2_configuration` writes, no EQL types — the working table has + /// no EQL dependency at all. /// /// The leading `DROP TABLE IF EXISTS` is belt-and-suspenders: a normal run /// drops the working table itself at the end of `run()`, so this only @@ -132,27 +133,14 @@ impl<'a, T> FixtureSpec<'a, T> { T: EqlPlaintext, { let working = self.working_table(); - let mut sql = format!( + format!( "DROP TABLE IF EXISTS public.{working};\n\ CREATE TABLE public.{working} (\n \ id BIGINT PRIMARY KEY,\n \ plaintext {plaintext_type} NOT NULL,\n \ - payload eql_v2_encrypted\n);\n", + payload jsonb\n);\n", plaintext_type = T::PLAINTEXT_SQL_TYPE, - ); - for ix in &self.indexes { - sql.push_str(&format!( - "SELECT eql_v2.remove_search_config('{working}', 'payload', '{ix}')\n \ - WHERE EXISTS (\n \ - SELECT 1 FROM public.eql_v2_configuration c\n \ - WHERE c.data #> '{{tables,{working},payload,indexes,{ix}}}' IS NOT NULL\n );\n", - )); - sql.push_str(&format!( - "SELECT eql_v2.add_search_config('{working}', 'payload', '{ix}', '{cast}');\n", - cast = T::CAST, - )); - } - sql + ) } /// The committed fixture script's header + schema + DDL, up to (not @@ -167,7 +155,7 @@ impl<'a, T> FixtureSpec<'a, T> { "-- AUTO-GENERATED by `mise run fixture:generate {name}`.\n\ -- DO NOT EDIT BY HAND. Re-run the generator to refresh.\n\ --\n\ - -- Encrypted via CipherStash Proxy (HMAC + ORE block terms).\n\ + -- Encrypted via cipherstash-client (HMAC + ORE block terms).\n\ -- A SQLx fixture script: opt in with\n\ -- #[sqlx::test(fixtures(path = \"../fixtures\", scripts(\"{name}\")))]\n\ \n\ @@ -187,13 +175,14 @@ impl<'a, T> FixtureSpec<'a, T> { /// SQL run on the *direct* connection to render each working-table row as /// a committed INSERT. `format('%L', ...)` does server-side literal /// escaping; row values never pass through Rust string interpolation. - /// `(payload).data::text` unwraps the `eql_v2_encrypted` composite to the - /// JSONB text that the committed `jsonb` column stores. + /// `payload::text` projects the already-encrypted JSONB straight through + /// — the working table stores the cipherstash-client-encrypted payload as + /// plain `jsonb`, so no composite unwrap is needed. pub fn render_rows_sql(&self) -> String { format!( "SELECT format(\n \ 'INSERT INTO {table} (id, plaintext, payload) VALUES (%L, %L, %L::{column_type});',\n \ - id, plaintext, (payload).data::text\n) \ + id, plaintext, payload::text\n) \ FROM public.{working} ORDER BY id", table = self.fixture_table(), column_type = self.column_type, @@ -300,32 +289,25 @@ mod tests { assert!(sql.contains("CREATE TABLE public._fixture_eql_v2_int4 (")); assert!(sql.contains("id BIGINT PRIMARY KEY")); assert!(sql.contains("plaintext integer NOT NULL")); - // The working table's payload is eql_v2_encrypted so Proxy encrypts inserts. - assert!(sql.contains("payload eql_v2_encrypted")); - } - - #[test] - fn working_schema_sql_configures_each_index_idempotently() { - let sql = int4_spec().working_schema_sql(); - // remove first (idempotent), then add, for both indexes. - assert!(sql - .contains("eql_v2.remove_search_config('_fixture_eql_v2_int4', 'payload', 'unique')")); - assert!(sql.contains( - "eql_v2.add_search_config('_fixture_eql_v2_int4', 'payload', 'unique', 'int')" - )); + // The working table's payload is plain jsonb — encryption happens in + // Rust via cipherstash-client, not via a Proxy round trip. + assert!(sql.contains("payload jsonb")); assert!( - sql.contains("eql_v2.remove_search_config('_fixture_eql_v2_int4', 'payload', 'ore')") + !sql.contains("eql_v2_encrypted"), + "working table should not depend on the eql_v2_encrypted type" ); - assert!(sql - .contains("eql_v2.add_search_config('_fixture_eql_v2_int4', 'payload', 'ore', 'int')")); } #[test] - fn working_schema_sql_uses_the_t_cast_not_the_column_type() { - // payload column-type is jsonb, but the EQL cast is i32::CAST = "int". + fn working_schema_sql_does_not_touch_eql_configuration() { + // The cipherstash-client path does NOT write to eql_v2_configuration: + // ColumnConfig lives entirely in Rust, no add_search_config / + // remove_search_config calls are emitted, and the working table has + // no EQL dependency. let sql = int4_spec().working_schema_sql(); - assert!(sql.contains("'int')")); // cast_as argument - assert!(!sql.contains("'jsonb')")); // jsonb is the committed type, not the cast + assert!(!sql.contains("add_search_config")); + assert!(!sql.contains("remove_search_config")); + assert!(!sql.contains("eql_v2_configuration")); } #[test] @@ -345,6 +327,18 @@ mod tests { assert!(preamble.contains("payload jsonb NOT NULL")); } + #[test] + fn fixture_script_preamble_attributes_encryption_to_cipherstash_client() { + // The preamble must record the encryption path so a reader of the + // committed SQL can trace it back to the generator. + let preamble = int4_spec().fixture_script_preamble(); + assert!(preamble.contains("cipherstash-client")); + assert!( + !preamble.contains("CipherStash Proxy"), + "preamble must not credit the Proxy — encryption is direct now" + ); + } + #[test] fn fixture_script_preamble_uses_the_committed_column_type() { // The committed table uses .with_column_type(), NOT eql_v2_encrypted. @@ -358,7 +352,13 @@ mod tests { assert!(sql.contains("INSERT INTO fixtures.eql_v2_int4 (id, plaintext, payload) VALUES")); assert!(sql.contains("%L, %L, %L::jsonb")); assert!(sql.contains("FROM public._fixture_eql_v2_int4")); - assert!(sql.contains("(payload).data::text")); + // payload is already encrypted JSONB in the working table; no + // composite to unwrap. + assert!(sql.contains("payload::text")); + assert!( + !sql.contains("(payload).data"), + "render must not unwrap a composite — payload is plain jsonb" + ); assert!(sql.contains("ORDER BY id")); } } From b850dcc79f49992714ead2461415a78d744dd4fe Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 25 May 2026 15:17:29 +1000 Subject: [PATCH 005/599] Add CipherStash secrets to EQL test workflow --- .github/workflows/test-eql.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 73e5ab370..844764b61 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -64,6 +64,8 @@ jobs: env: POSTGRES_VERSION: ${{ matrix.postgres-version }} + CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} + CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} steps: - uses: actions/checkout@v6 @@ -126,4 +128,3 @@ jobs: mise run --output prefix test:splinter --postgres ${POSTGRES_VERSION} - From fbe007d1c9615cee91ff519c102302bf52d85698 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 25 May 2026 15:39:36 +1000 Subject: [PATCH 006/599] perf(fixtures): batch encrypt_store and add cipherstash test coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `cipherstash::encrypt_store` now takes a slice and returns a `Vec`, so a fixture run issues one `encrypt_eql` call regardless of value count instead of one per value. The 14-row `eql_v2_int4` fixture drops from 14 ZeroKMS round trips to one; the planned bench fixture (~10k rows) gets the same treatment. Empty input short-circuits before `cipher()` so a caller with nothing to encrypt does not pay the bootstrap cost. `driver::insert_direct` now does one batched encrypt then a per-row INSERT loop — the INSERT is invariant across rows so the SQL string is lifted out of the loop. The working table is local Postgres and the per-row execute cost is in microseconds, so batching the INSERTs is not worth the dynamic-SQL complexity. Test coverage closes the gap flagged in the PR review: - Cheap unit tests (no live ZeroKMS): `index_type_for` mapping for unique/ore/match plus the unknown-name error path; an empty-batch short-circuit test that proves `cipher()` is not reached when there is nothing to encrypt (visible because the test runs without CS_* env vars). - Live tests gated by `fixture-gen` + `#[ignore]`: single-value round trip, batch length + per-payload identifier check, and a distinct-plaintexts → distinct `hm` assertion that mirrors the fixture-tests' equality term check at the unit-test layer. --- tests/sqlx/src/fixtures/cipherstash.rs | 269 +++++++++++++++--- tests/sqlx/src/fixtures/driver.rs | 32 ++- tests/sqlx/src/fixtures/spec.rs | 6 +- tests/sqlx/tests/eql_v2_int4_fixture_tests.rs | 6 +- 4 files changed, 262 insertions(+), 51 deletions(-) diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index c8dd6c5bd..eea51f444 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -89,10 +89,7 @@ pub async fn cipher() -> Result>> { /// error so a typo at spec-construction surfaces at run time (the /// `FixtureIdentifier` newtype only proves the string is a valid SQL /// identifier, not that it names a real index type). -pub fn column_config_for( - spec_indexes: &[FixtureIdentifier], - cast: Cast, -) -> Result { +pub fn column_config_for(spec_indexes: &[FixtureIdentifier], cast: Cast) -> Result { let column_type = cast_to_column_type(cast)?; let mut config = ColumnConfig::build("payload").casts_as(column_type); @@ -145,9 +142,14 @@ fn index_type_for(name: &str) -> Result { } } -/// Encrypt a single plaintext value for storage and return the resulting -/// EQL ciphertext as a `serde_json::Value` ready to bind into a `jsonb` -/// column. +/// Encrypt a batch of plaintext values for storage and return one EQL +/// ciphertext per input as a `serde_json::Value` ready to bind into a +/// `jsonb` column. +/// +/// One `encrypt_eql` call regardless of `values.len()` — ZeroKMS does the +/// round trip once, not N times. The per-value field in each +/// `PreparedPlaintext` is `value.to_plaintext()`; the config, identifier, +/// and `EqlOperation::Store` are shared across the batch. /// /// Uses `EqlOperation::Store`, which yields a full storage payload /// (`{"k": "ct", "v": 2, "i": …, "c": …, "hm": …, "ob": …}`) — the same @@ -155,42 +157,71 @@ fn index_type_for(name: &str) -> Result { /// uses the cipher's default keyset, no lock context, no service token, no /// index filter — the same defaults Proxy uses for column-config-driven /// inserts. -pub async fn encrypt_store( +/// +/// An empty `values` slice short-circuits before `cipher()` so a caller +/// with nothing to encrypt does not pay the ZeroKMS bootstrap cost. +pub async fn encrypt_store( table: &str, column: &str, - value: T, + values: &[T], config: &ColumnConfig, -) -> Result { +) -> Result> { + if values.is_empty() { + return Ok(Vec::new()); + } + let cipher = cipher().await?; - let prepared = PreparedPlaintext::new( - Cow::Borrowed(config), - Identifier::new(table, column), - value.to_plaintext(), - EqlOperation::Store, - ); + // `Identifier::new` does two `String` allocations per call — cheap + // enough that constructing per-iteration is preferred over assuming + // the upstream type implements `Clone`. + let prepared: Vec = values + .iter() + .map(|value| { + PreparedPlaintext::new( + Cow::Borrowed(config), + Identifier::new(table, column), + value.to_plaintext(), + EqlOperation::Store, + ) + }) + .collect(); let opts = EqlEncryptOpts::default(); - let mut outputs = encrypt_eql(cipher, vec![prepared], &opts) + let outputs = encrypt_eql(cipher, prepared, &opts) .await - .with_context(|| format!("encrypting value for {table}.{column}"))?; - - let output = outputs - .pop() - .ok_or_else(|| anyhow!("encrypt_eql returned no outputs"))?; - - let ciphertext: EqlCiphertext = match output { - EqlOutput::Store(ct) => ct, - EqlOutput::Query(_) => { - // EqlOperation::Store always yields EqlOutput::Store; treating - // the other arm as unreachable would hide a future API drift. - return Err(anyhow!( - "encrypt_eql returned a Query output for an EqlOperation::Store input" - )); - } - }; + .with_context(|| { + format!( + "encrypting batch of {} values for {table}.{column}", + values.len() + ) + })?; - serde_json::to_value(&ciphertext).context("serialising EqlCiphertext to JSON") + if outputs.len() != values.len() { + return Err(anyhow!( + "encrypt_eql returned {} outputs for {} inputs", + outputs.len(), + values.len() + )); + } + + outputs + .into_iter() + .map(|output| { + let ciphertext: EqlCiphertext = match output { + EqlOutput::Store(ct) => ct, + EqlOutput::Query(_) => { + // EqlOperation::Store always yields EqlOutput::Store; + // treating the other arm as unreachable would hide a + // future API drift. + return Err(anyhow!( + "encrypt_eql returned a Query output for an EqlOperation::Store input" + )); + } + }; + serde_json::to_value(&ciphertext).context("serialising EqlCiphertext to JSON") + }) + .collect() } #[cfg(test)] @@ -223,6 +254,45 @@ mod tests { ); } + #[test] + fn index_type_for_maps_known_names_to_their_canonical_index_type() { + // The named EQL index identifiers each round-trip into the + // `IndexType` cipherstash-config considers canonical for that + // name. Compared via the public `Index` surface (`is_unique`, + // `is_ore`, `is_match`) so the assertion does not depend on the + // shape of the non-exhaustive `IndexType` enum. + let unique = Index::new(index_type_for("unique").unwrap()); + assert!(unique.is_unique(), "'unique' must map to the unique index"); + + let ore = Index::new(index_type_for("ore").unwrap()); + assert!(ore.is_ore(), "'ore' must map to the ORE index"); + + let m = Index::new(index_type_for("match").unwrap()); + assert!(m.is_match(), "'match' must map to the match (bloom) index"); + } + + #[test] + fn index_type_for_rejects_an_unknown_index_name() { + let err = index_type_for("bogus").unwrap_err(); + let msg = format!("{err:#}"); + assert!( + msg.contains("unknown EQL index identifier") && msg.contains("bogus"), + "error should name the offending identifier: {msg}" + ); + } + + #[tokio::test] + async fn encrypt_store_with_empty_values_returns_an_empty_vec_without_calling_cipher() { + // Empty input short-circuits before `cipher()` so a caller with + // nothing to encrypt does not pay the ZeroKMS bootstrap cost. + // Running this test under `cargo test` (no `fixture-gen` feature, + // no CS_* env vars) proves the short-circuit: if `cipher()` were + // reached, the missing credentials would surface as an error. + let config = column_config_for(&[ident("unique")], Cast::INT).unwrap(); + let out = encrypt_store::("t", "c", &[], &config).await.unwrap(); + assert!(out.is_empty(), "empty input must yield empty output"); + } + #[test] fn cast_to_column_type_covers_every_eql_plaintext_cast_constant() { // Every Cast constant on EqlPlaintext must round-trip into a @@ -251,3 +321,134 @@ mod tests { } } } + +/// Live `encrypt_store` round-trips against a real ZeroKMS keyset. Gated +/// by `fixture-gen` so default `cargo test` runs do not require +/// `CS_CLIENT_ACCESS_KEY` / `CS_WORKSPACE_CRN`. Each test is +/// `#[ignore]` so it only runs under +/// `cargo test --features fixture-gen -- --ignored --test-threads=1`, +/// mirroring the `generate` test in `eql_v2_int4.rs`. +/// +/// **Must run serially (`--test-threads=1`).** The process-wide +/// `CIPHER` `OnceCell` caches a `ScopedCipher` whose reqwest connection +/// pool is bound to the tokio runtime that initialised it. Each +/// `#[tokio::test]` builds its own runtime, so under parallel +/// execution the second test's calls go through a pool whose +/// dispatcher has been dropped — failing with +/// "SendRequest: dispatch task is gone". Production fixture runs (one +/// `#[tokio::main]` runtime) are unaffected. +/// +/// These complement the structural fixture-tests in +/// `tests/sqlx/tests/eql_v2_int4_fixture_tests.rs`: those assert over the +/// regenerated SQL file end-to-end; these isolate the +/// `encrypt_store` call so an SDK API drift surfaces here before the +/// whole fixture pipeline fails. +#[cfg(all(test, feature = "fixture-gen"))] +mod live_tests { + use super::*; + use serde_json::Value; + + fn ident(s: &str) -> FixtureIdentifier { + FixtureIdentifier::try_from(s).unwrap() + } + + /// Config used by every live test — `unique` drives the `hm` term, + /// `ore` drives the `ob` term, so the returned payloads carry both. + fn int_config_with_hm_and_ob() -> ColumnConfig { + column_config_for(&[ident("unique"), ident("ore")], Cast::INT).unwrap() + } + + /// Assert the well-formed Store shape: the payload is a JSON object + /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields. Mirrors the + /// per-key assertions in `eql_v2_int4_fixture_tests.rs`. + fn assert_store_shape(payload: &Value) { + let obj = payload + .as_object() + .expect("payload must be a JSON object"); + for key in ["v", "c", "hm", "ob", "i"] { + assert!( + obj.get(key).is_some_and(|v| !v.is_null()), + "payload must carry a non-null `{key}` field; got {payload}" + ); + } + // `v` is the EQL payload-format version. The cipherstash-client + // JSON encodes it as the integer 2; the existing fixture tests + // check `payload->>'v' = '2'` via Postgres's text-cast operator. + // Asserting the number here matches the source format directly. + assert_eq!( + obj.get("v").and_then(Value::as_i64), + Some(2), + "payload must declare v = 2; got {payload}" + ); + } + + #[tokio::test] + #[ignore = "live ZeroKMS — run via `cargo test --features fixture-gen -- --ignored`"] + async fn encrypt_store_single_value_returns_one_eql_payload() { + let config = int_config_with_hm_and_ob(); + let out = encrypt_store("live_one", "payload", &[42_i32], &config) + .await + .expect("encrypt_store should succeed against live ZeroKMS"); + assert_eq!(out.len(), 1, "single input should produce single output"); + assert_store_shape(&out[0]); + } + + #[tokio::test] + #[ignore = "live ZeroKMS — run via `cargo test --features fixture-gen -- --ignored`"] + async fn encrypt_store_batch_returns_one_payload_per_input_in_input_order() { + let config = int_config_with_hm_and_ob(); + let values = [-1_i32, 1, 42]; + let out = encrypt_store("live_batch", "payload", &values, &config) + .await + .expect("encrypt_store should succeed against live ZeroKMS"); + assert_eq!( + out.len(), + values.len(), + "batch length must equal input length" + ); + for (i, payload) in out.iter().enumerate() { + assert_store_shape(payload); + // Each payload's `i.t` should match the table identifier we + // supplied — that's the field consuming code uses to bind a + // payload to its source column. + let identifier_t = payload + .get("i") + .and_then(Value::as_object) + .and_then(|o| o.get("t")) + .and_then(Value::as_str); + assert_eq!( + identifier_t, + Some("live_batch"), + "payload[{i}].i.t must match the table argument; got {payload}" + ); + } + } + + #[tokio::test] + #[ignore = "live ZeroKMS — run via `cargo test --features fixture-gen -- --ignored`"] + async fn encrypt_store_batch_distinct_plaintexts_yield_distinct_hm() { + // HMAC is the equality term — three distinct plaintexts must + // yield three distinct `hm` strings. Mirrors + // `hmac_equality_terms_are_distinct_for_distinct_values` in the + // fixture-tests but at the unit-test layer. + let config = int_config_with_hm_and_ob(); + let out = encrypt_store("live_distinct", "payload", &[-1_i32, 1, 42], &config) + .await + .expect("encrypt_store should succeed against live ZeroKMS"); + + let hms: Vec<&str> = out + .iter() + .map(|p| { + p.get("hm") + .and_then(Value::as_str) + .expect("payload must carry a string `hm` term") + }) + .collect(); + let unique: std::collections::HashSet<&&str> = hms.iter().collect(); + assert_eq!( + unique.len(), + hms.len(), + "distinct plaintexts must yield distinct hm terms; got {hms:?}" + ); + } +} diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs index 0691ab5d3..90060a5f0 100644 --- a/tests/sqlx/src/fixtures/driver.rs +++ b/tests/sqlx/src/fixtures/driver.rs @@ -155,26 +155,30 @@ where Ok(()) } - /// Encrypt each plaintext value via cipherstash-client and INSERT it - /// into the working table as plain JSONB. The committed - /// `ColumnConfig` is built once from the spec's indexes + cast — the - /// fixture name is fed as the table identifier so the resulting - /// payload's `i.t` field matches the working table, preserving the - /// shape Proxy used to emit. + /// Encrypt every plaintext value via cipherstash-client in **one + /// batched call**, then INSERT each ciphertext into the working + /// table as plain JSONB. The committed `ColumnConfig` is built once + /// from the spec's indexes + cast — the fixture name is fed as the + /// table identifier so the resulting payload's `i.t` field matches + /// the working table, preserving the shape Proxy used to emit. + /// + /// Batching means one ZeroKMS round trip per fixture run regardless + /// of value count; the INSERT loop is per-row because the working + /// table is local Postgres and the per-row execute cost is in + /// microseconds. async fn insert_direct(&self, direct: &mut PgConnection) -> Result<()> { let config = cipherstash::column_config_for(self.indexes(), T::CAST) .context("building ColumnConfig from FixtureSpec indexes")?; let working = self.working_table(); - for (i, value) in self.values().iter().enumerate() { - let id = (i as i64) + 1; - let payload = - cipherstash::encrypt_store(&working, "payload", *value, &config) - .await - .with_context(|| format!("encrypting value #{id}"))?; + let payloads = cipherstash::encrypt_store(&working, "payload", self.values(), &config) + .await + .context("encrypting fixture values")?; - let insert = - format!("INSERT INTO public.{working} (id, plaintext, payload) VALUES ($1, $2, $3)"); + let insert = + format!("INSERT INTO public.{working} (id, plaintext, payload) VALUES ($1, $2, $3)"); + for (i, (value, payload)) in self.values().iter().zip(payloads).enumerate() { + let id = (i as i64) + 1; sqlx::query(&insert) .bind(id) .bind(*value) diff --git a/tests/sqlx/src/fixtures/spec.rs b/tests/sqlx/src/fixtures/spec.rs index 9ab0c1f2d..35e82615a 100644 --- a/tests/sqlx/src/fixtures/spec.rs +++ b/tests/sqlx/src/fixtures/spec.rs @@ -39,7 +39,8 @@ impl<'a, T> FixtureSpec<'a, T> { /// # Panics /// Panics if `name` is not a valid identifier. pub fn new(name: &str) -> Self { - let name = FixtureIdentifier::try_from(name).unwrap_or_else(|e| panic!("fixture name: {e}")); + let name = + FixtureIdentifier::try_from(name).unwrap_or_else(|e| panic!("fixture name: {e}")); let column_type = ColumnType::try_from("jsonb") .expect("default column type \"jsonb\" must be in the allowlist"); Self { @@ -55,7 +56,8 @@ impl<'a, T> FixtureSpec<'a, T> { /// # Panics /// Panics if `index_name` is not a valid identifier. pub fn with_index(mut self, index_name: &str) -> Self { - let id = FixtureIdentifier::try_from(index_name).unwrap_or_else(|e| panic!("index name: {e}")); + let id = + FixtureIdentifier::try_from(index_name).unwrap_or_else(|e| panic!("index name: {e}")); self.indexes.push(id); self } diff --git a/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs b/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs index eb842b588..3cf73225e 100644 --- a/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs +++ b/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs @@ -93,7 +93,11 @@ async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { sqlx::query_scalar("SELECT id FROM fixtures.eql_v2_int4 WHERE plaintext = 42 ORDER BY id") .fetch_all(&pool) .await?; - assert_eq!(ids, vec![9], "expected exactly one row with plaintext = 42 at id 9"); + assert_eq!( + ids, + vec![9], + "expected exactly one row with plaintext = 42 at id 9" + ); Ok(()) } From 73b54dec9ca64043eceebcfa24dc719a8a718220 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 25 May 2026 17:15:38 +1000 Subject: [PATCH 007/599] chore(mise): make test:sqlx depend on build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `test:sqlx` copies `release/cipherstash-encrypt.sql` into `tests/sqlx/migrations/001_install_eql.sql` so the EQL extension is applied to each per-test database. Without an explicit build dep a stale release artifact silently ships an old EQL extension — visible when regression-guard migrations (e.g. 003_install_ste_vec_data.sql) fail on a `_encrypted_check_c` shape the current source has already fixed. Declaring `depends = ["build"]` makes the release artifact fresh on every direct invocation of `test:sqlx`; the top-level `test.sh` already builds, so CI behaviour is unchanged. --- mise.toml | 5 +++++ tests/sqlx/src/fixtures/cipherstash.rs | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mise.toml b/mise.toml index 879346761..a5ead126f 100644 --- a/mise.toml +++ b/mise.toml @@ -34,6 +34,11 @@ run = """ [tasks."test:sqlx"] description = "Run SQLx tests with hybrid migration approach" +# `build` produces release/cipherstash-encrypt.sql, which is then cp'd into +# tests/sqlx/migrations/001_install_eql.sql below. Without this dep, a stale +# release artifact silently ships an old EQL extension into the test DB and +# regression-guard migrations (e.g. 003_install_ste_vec_data.sql) fail. +depends = ["build"] dir = "{{config_root}}" run = """ # Copy built SQL to SQLx migrations (EQL install is generated, not static) diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index eea51f444..bb3a69bcc 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -362,9 +362,7 @@ mod live_tests { /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields. Mirrors the /// per-key assertions in `eql_v2_int4_fixture_tests.rs`. fn assert_store_shape(payload: &Value) { - let obj = payload - .as_object() - .expect("payload must be a JSON object"); + let obj = payload.as_object().expect("payload must be a JSON object"); for key in ["v", "c", "hm", "ob", "i"] { assert!( obj.get(key).is_some_and(|v| !v.is_null()), From e31d61df0cf769d7c96e5466824097d906cc4b34 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 28 May 2026 15:22:58 +1000 Subject: [PATCH 008/599] fix(ci): supply client-key creds to fixture generator in test workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The eql_v2_int4 fixture generator encrypts via cipherstash-client, whose EnvKeyProvider requires CS_CLIENT_ID + CS_CLIENT_KEY to load the client key. test:sqlx regenerates fixtures every run, so CI needs that pair — but 9c1c9d4 only wired CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN (ZeroKMS auth), leaving the generator failing with "CS_CLIENT_ID environment variable not set". Add the client-key pair to the test job env. Also correct comments in mise.toml, tasks/fixtures.toml, Cargo.toml, and FIXTURE_SCHEMA.md that framed the two credential pairs as alternatives: auth (access key + workspace CRN) and key material (client id + key) are distinct roles and both are required. --- .github/workflows/test-eql.yml | 2 ++ mise.toml | 8 +++++--- tasks/fixtures.toml | 8 ++++---- tests/sqlx/Cargo.toml | 9 +++++---- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 9 +++++---- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 844764b61..9527faa88 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -66,6 +66,8 @@ jobs: POSTGRES_VERSION: ${{ matrix.postgres-version }} CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} + CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} + CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} steps: - uses: actions/checkout@v6 diff --git a/mise.toml b/mise.toml index a5ead126f..1cd33881d 100644 --- a/mise.toml +++ b/mise.toml @@ -51,9 +51,11 @@ cd tests/sqlx sqlx migrate run # Regenerate fixtures every run — they are not committed (see .gitignore). -# Generator encrypts via cipherstash-client directly; CS_* credentials must -# be present in the shell environment (CS_CLIENT_ACCESS_KEY + -# CS_WORKSPACE_CRN, or the legacy CS_CLIENT_ID/CS_CLIENT_KEY pair). +# Generator encrypts via cipherstash-client directly, which needs BOTH a +# ZeroKMS auth credential (CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN, via +# AutoStrategy) AND a client key (CS_CLIENT_ID + CS_CLIENT_KEY, via +# EnvKeyProvider) in the shell environment. Auth and key material are +# separate roles — the two pairs are not alternatives. echo "Regenerating SQLx fixtures..." cd "{{config_root}}" mise run fixture:generate eql_v2_int4 diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index 808200cd8..be0d6fd18 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -6,10 +6,10 @@ description = "Generate a SQLx fixture script via cipherstash-client" # # Prerequisites: # - mise run postgres:up (Postgres with EQL installed) -# - CS_* credentials in the shell environment (auto-loaded by -# cipherstash-client's AutoStrategy / EnvKeyProvider): -# CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN (preferred), OR -# CS_CLIENT_ID + CS_CLIENT_KEY (legacy pair) +# - CS_* credentials in the shell environment. The generator needs BOTH +# pairs — they are not alternatives: +# CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN ZeroKMS auth (AutoStrategy) +# CS_CLIENT_ID + CS_CLIENT_KEY client key (EnvKeyProvider) # # Usage: mise run fixture:generate eql_v2_int4 dir = "{{config_root}}/tests/sqlx" diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 153aebf3f..12273e6c3 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -25,9 +25,10 @@ default = [] bench = [] # Opt-in to compiling the fixture generators. Without this feature the # `#[cfg(feature = "fixture-gen")]` generator tests do not exist, so -# `cargo test` and CI never see them. Generators need a live Postgres and -# CipherStash workspace credentials in the process env -# (`CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN`, or the legacy -# `CS_CLIENT_ID`/`CS_CLIENT_KEY` pair). Run one with: +# `cargo test` and CI never see them. Generators need a live Postgres and, +# in the process env, BOTH a ZeroKMS auth credential (`CS_CLIENT_ACCESS_KEY` +# + `CS_WORKSPACE_CRN`, via AutoStrategy) AND a client key (`CS_CLIENT_ID` + +# `CS_CLIENT_KEY`, via EnvKeyProvider) — the two pairs are not alternatives. +# Run one with: # mise run fixture:generate fixture-gen = [] diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 9ac804b72..58ecd7420 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -202,10 +202,11 @@ applies standalone. **Regenerated every test run.** `mise run test:sqlx` invokes the generator before `cargo test`, so a stale committed fixture cannot mask a payload-shape regression. The generator encrypts in-process via `cipherstash-client`; it -needs a live Postgres plus CipherStash workspace credentials -(`CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN`, or the legacy -`CS_CLIENT_ID`/`CS_CLIENT_KEY` pair) in the shell environment. Do not -hand-edit the generated file; it is overwritten in place on every run. +needs a live Postgres plus **both** CipherStash credential pairs in the shell +environment (they are not alternatives): `CS_CLIENT_ACCESS_KEY` + +`CS_WORKSPACE_CRN` for ZeroKMS auth (AutoStrategy) **and** `CS_CLIENT_ID` + +`CS_CLIENT_KEY` for the client key (EnvKeyProvider). Do not hand-edit the +generated file; it is overwritten in place on every run. **Schema:** Table lives in the dedicated `fixtures` SQL schema (kept out of the `public` type/domain namespace so a downstream `public.eql_v2_int4` domain can From 6af02ffb03ad0ca9bd348548504a0e8a9ff2ecef Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 12:32:37 +1000 Subject: [PATCH 009/599] feat(codegen): scalar encrypted-domain SQL generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Render eql_v2_ jsonb-backed domain families (types, functions, operators, aggregates) from a minimal TOML manifest. Term capabilities are fixed in terms.py (hm -> equality, ore -> equality+ordering); output is byte-identical and headed AUTO-GENERATED — DO NOT EDIT. Hardening: _sql_str() quote-doubler at every SQL interpolation boundary, distinct-fixture-value validation in spec.py, SQL-identifier validation of manifest domain names, and codegen:domain / codegen:domain:all mise tasks. mise run build regenerates all domains every build. Part of PR #239 (eql_v2_int4 variant family). --- .gitignore | 10 +- mise.toml | 38 ++ tasks/build.sh | 22 +- tasks/codegen/__init__.py | 17 + tasks/codegen/conftest.py | 6 + tasks/codegen/domain.sh | 15 + tasks/codegen/generate.py | 332 ++++++++++++++++ tasks/codegen/operator_surface.py | 72 ++++ tasks/codegen/scalars.py | 93 +++++ tasks/codegen/spec.py | 141 +++++++ tasks/codegen/templates.py | 490 +++++++++++++++++++++++ tasks/codegen/terms.py | 107 +++++ tasks/codegen/test_against_reference.py | 117 ++++++ tasks/codegen/test_generate.py | 351 +++++++++++++++++ tasks/codegen/test_operator_surface.py | 126 ++++++ tasks/codegen/test_scalars.py | 64 +++ tasks/codegen/test_spec.py | 208 ++++++++++ tasks/codegen/test_templates.py | 499 ++++++++++++++++++++++++ tasks/codegen/test_terms.py | 96 +++++ tasks/codegen/test_writer.py | 157 ++++++++ tasks/codegen/types/.gitkeep | 0 tasks/codegen/types/int4.toml | 19 + tasks/codegen/writer.py | 89 +++++ 23 files changed, 3067 insertions(+), 2 deletions(-) create mode 100644 tasks/codegen/__init__.py create mode 100644 tasks/codegen/conftest.py create mode 100755 tasks/codegen/domain.sh create mode 100644 tasks/codegen/generate.py create mode 100644 tasks/codegen/operator_surface.py create mode 100644 tasks/codegen/scalars.py create mode 100644 tasks/codegen/spec.py create mode 100644 tasks/codegen/templates.py create mode 100644 tasks/codegen/terms.py create mode 100644 tasks/codegen/test_against_reference.py create mode 100644 tasks/codegen/test_generate.py create mode 100644 tasks/codegen/test_operator_surface.py create mode 100644 tasks/codegen/test_scalars.py create mode 100644 tasks/codegen/test_spec.py create mode 100644 tasks/codegen/test_templates.py create mode 100644 tasks/codegen/test_terms.py create mode 100644 tasks/codegen/test_writer.py create mode 100644 tasks/codegen/types/.gitkeep create mode 100644 tasks/codegen/types/int4.toml create mode 100644 tasks/codegen/writer.py diff --git a/.gitignore b/.gitignore index 68bca65be..05b0ae002 100644 --- a/.gitignore +++ b/.gitignore @@ -221,7 +221,15 @@ tests/sqlx/migrations/001_install_eql.sql # Generated SQLx fixtures (regenerated via `mise run fixture:generate`, # never commit — stale fixtures hide bugs) -tests/sqlx/fixtures/eql_v2_int4.sql +tests/sqlx/fixtures/eql_v2* + +# Generated encrypted-domain SQL — regenerated by `tasks/build.sh` from +# tasks/codegen/types/.toml on every build (or `mise run codegen:domain +# ` to refresh manually). Hand-written *_extensions.sql stays committed. +src/encrypted_domain/*/*_types.sql +src/encrypted_domain/*/*_functions.sql +src/encrypted_domain/*/*_operators.sql +src/encrypted_domain/*/*_aggregates.sql # Large generated test data files tests/ste_vec_vast.sql diff --git a/mise.toml b/mise.toml index 1cd33881d..270fab257 100644 --- a/mise.toml +++ b/mise.toml @@ -78,3 +78,41 @@ dir = "{{config_root}}/tests/sqlx" run = """ cargo test --test payload_schema_tests """ + +[tasks."codegen:domain:all"] +description = "Regenerate every encrypted-domain type from its TOML manifest" +dir = "{{config_root}}" +run = """ +mise exec python -- python -m tasks.codegen.generate --all +""" + +[tasks."test:codegen"] +description = "Run the encrypted-domain codegen generator tests (no database required)" +dir = "{{config_root}}" +run = """ +# pytest is the only non-stdlib dependency; the install is a fast no-op once satisfied. +mise exec python -- python -m pip install --quiet --disable-pip-version-check pytest +mise exec python -- python -m pytest tasks/codegen -q +""" + +[tasks."test:matrix:inventory"] +description = "Regenerate the int4 matrix test-name inventory snapshot (no database required)" +dir = "{{config_root}}/tests/sqlx" +run = """ +# Pin an explicit feature set so the inventory is deterministic regardless of +# the caller's local flags. `--no-default-features` keeps the `scale` arm +# (`#[cfg(feature = "scale")]`) excluded — its add/delete is a known blind spot +# of this default-feature inventory, covered instead by the scale gate + the +# family::mutations negative controls. `--list` enumerates the whole +# encrypted_domain binary (family::support, family::inlinability, +# family::mutations, scalars::int4); `grep '^scalars::int4'` scopes the +# snapshot to the matrix only, so landing other family tests never dirties it. +# `LC_ALL=C sort` makes ordering byte-stable across locales (a bare `sort` is +# locale-dependent and yields spurious CI diffs). +set -euo pipefail +mkdir -p snapshots +cargo test --no-default-features --test encrypted_domain -- --list | + sed -n 's/: test$//p' | + grep '^scalars::int4' | + LC_ALL=C sort > snapshots/int4_matrix_tests.txt +""" diff --git a/tasks/build.sh b/tasks/build.sh index 0768dd34b..cef25521a 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" -#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql"] +#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "tasks/codegen/types/*.toml", "tasks/codegen/*.py"] #MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" @@ -9,6 +9,26 @@ set -euo pipefail +# Regenerate encrypted-domain SQL from TOML specs before building. +# Generated files (src/encrypted_domain//_*.sql) are gitignored; the +# manifest at tasks/codegen/types/.toml is the source of truth. +# +# Nuke every generated file first so a deleted or renamed manifest can't +# leave orphans in src/ that the `src/**/*.sql` build glob would silently +# pick up. writer.py cleans within a directory it's regenerating, but it +# never runs for a type whose manifest no longer exists. Hand-written +# *_extensions.sql is preserved by the name patterns; -mindepth 2 keeps +# the type-agnostic src/encrypted_domain/functions.sql safe. +find src/encrypted_domain -mindepth 2 -type f \ + \( -name '*_types.sql' -o -name '*_functions.sql' -o -name '*_operators.sql' \ + -o -name '*_aggregates.sql' \) \ + -delete 2>/dev/null || true + +# Regenerate every type — single source of truth for the enumeration lives in +# tasks/codegen/generate.py (sorted, deterministic, aggregate exit code). The +# orphan sweep above still handles the manifest-deleted case --all cannot. +mise exec python -- python -m tasks.codegen.generate --all + # Fail loudly if any file referenced in a tsorted dep list doesn't exist. # Without this, `xargs cat` would print `cat: foo.sql: No such file or directory` # and continue — silently producing an incomplete release artefact. diff --git a/tasks/codegen/__init__.py b/tasks/codegen/__init__.py new file mode 100644 index 000000000..4443af870 --- /dev/null +++ b/tasks/codegen/__init__.py @@ -0,0 +1,17 @@ +"""Encrypted-domain SQL code generator for EQL scalar domain families.""" + +from .generate import generate_type, main +from .spec import DomainSpec, SpecError, TypeSpec, load_spec +from .terms import TERM_CATALOG, Term, TermError + +__all__ = [ + "DomainSpec", + "SpecError", + "TERM_CATALOG", + "Term", + "TermError", + "TypeSpec", + "generate_type", + "load_spec", + "main", +] diff --git a/tasks/codegen/conftest.py b/tasks/codegen/conftest.py new file mode 100644 index 000000000..f03b0e8bb --- /dev/null +++ b/tasks/codegen/conftest.py @@ -0,0 +1,6 @@ +"""pytest discovery anchor for the codegen package. + +Tests import via `from tasks.codegen. import ...`; pytest runs +from the repo root (where `tasks/__init__.py` exists), so no `sys.path` +manipulation is needed. +""" diff --git a/tasks/codegen/domain.sh b/tasks/codegen/domain.sh new file mode 100755 index 000000000..ae279a128 --- /dev/null +++ b/tasks/codegen/domain.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +#MISE description="Regenerate an encrypted-domain type from its TOML spec" +#USAGE arg "type" help="Type token, e.g. int4 (matches tasks/codegen/types/.toml)" + +set -euo pipefail + +TYPE=${usage_type:?type argument required} + +echo "Regenerating encrypted-domain type: ${TYPE}" +mise exec python -- python -m tasks.codegen.generate "${TYPE}" +echo "" +echo "✓ Regenerated src/encrypted_domain/${TYPE}/ (gitignored)" +echo " Note: 'mise run build' regenerates every type automatically;" +echo " this task is for refreshing one type while iterating on its manifest." +echo " When ready, run 'mise run clean && mise run build' then 'mise run test'." diff --git a/tasks/codegen/generate.py b/tasks/codegen/generate.py new file mode 100644 index 000000000..cf30c598c --- /dev/null +++ b/tasks/codegen/generate.py @@ -0,0 +1,332 @@ +"""Top-level scalar encrypted-domain materializer.""" + +import sys +from collections.abc import Iterator +from pathlib import Path + +from .operator_surface import ( + BLOCKER_ONLY_OPERATORS, + PATH_OPERATORS, + SYMMETRIC_OPERATORS, + backing_function, +) +from .spec import DomainSpec, SpecError, TypeSpec, load_spec +from .templates import ( + AGGREGATE_OPS, + domain_name, + extractor_for_operator, + is_ord_capable, + render_aggregate, + render_blocker_bool, + render_blocker_native, + render_blocker_path, + render_domain_block, + render_extractor, + render_fixture_values_rs, + render_operator, + render_wrapper, + role_phrase, + supported_operators, +) +from .terms import TERM_CATALOG, Term, term_requires +from .writer import ( + clean_generated_files, + ensure_generated_paths_writable, + write_generated_file, + write_generated_rs, +) + +REPO_ROOT = Path(__file__).resolve().parents[2] + + +def _symmetric_shapes(dom: str) -> list[tuple[str, str]]: + return [(dom, dom), (dom, "jsonb"), ("jsonb", dom)] + + +def _path_shapes(dom: str) -> list[tuple[str, str]]: + return [(dom, "text"), (dom, "integer"), ("jsonb", dom)] + + +def _blocker_only_shapes(dom: str, op: str) -> list[tuple[str, str, str]]: + if op in {"?", "?|", "?&"}: + rhs = "text[]" if op in {"?|", "?&"} else "text" + return [(dom, rhs, "boolean")] + if op in {"@?", "@@"}: + return [(dom, "jsonpath", "boolean")] + if op == "#>": + return [(dom, "text[]", "jsonb")] + if op == "#>>": + return [(dom, "text[]", "text")] + if op == "-": + return [(dom, "text", "jsonb"), (dom, "integer", "jsonb"), (dom, "text[]", "jsonb")] + if op == "#-": + return [(dom, "text[]", "jsonb")] + if op == "||": + return [(dom, dom, "jsonb"), (dom, "jsonb", "jsonb"), ("jsonb", dom, "jsonb")] + raise ValueError(f"unhandled blocker-only operator: {op}") + + +def _types_path(token: str) -> str: + return f"src/encrypted_domain/{token}/{token}_types.sql" + + +def fixture_values_rs_path(out_root: Path, token: str) -> Path: + """Committed Rust fixture-value const for a type. Outside the gitignored + src/encrypted_domain/ SQL tree because it is consumed (and committed) by + the Rust test crate.""" + return ( + out_root / "tests" / "sqlx" / "src" / "fixtures" / f"{token}_values.rs" + ) + + +def render_types_file(spec: TypeSpec) -> str: + """Body for _types.sql: every domain in one idempotent DO block. + + Iteration order follows the manifest's declared order — the TOML file is + the source of truth for emit order. + """ + blocks = [render_domain_block(domain, spec.token) for domain in spec.domains] + return ( + "-- REQUIRE: src/schema.sql\n\n" + f"--! @file encrypted_domain/{spec.token}/{spec.token}_types.sql\n" + f"--! @brief Encrypted-domain type family for {spec.token}.\n\n" + "DO $$\nBEGIN\n" + + "\n".join(blocks) + + "END\n$$;\n" + ) + + +def _functions_requires(spec: TypeSpec, domain: DomainSpec) -> list[str]: + reqs = [ + "src/schema.sql", + _types_path(spec.token), + "src/encrypted_domain/functions.sql", + ] + for extra in term_requires(domain.terms): + if extra not in reqs: + reqs.append(extra) + return reqs + + +def _extractor_terms(domain: DomainSpec) -> Iterator[Term]: + seen: set[str] = set() + for term_name in domain.terms: + term = TERM_CATALOG[term_name] + if term.extractor not in seen: + seen.add(term.extractor) + yield term + + +def render_functions_file(spec: TypeSpec, domain: DomainSpec) -> str: + """Body for a domain's _functions.sql.""" + dom = domain_name(domain.name) + supported = set(supported_operators(domain)) + parts: list[str] = [] + + for term in _extractor_terms(domain): + parts.append(render_extractor(domain, term)) + + for op in SYMMETRIC_OPERATORS: + extractor = extractor_for_operator(domain, op) + for arg_a, arg_b in _symmetric_shapes(dom): + if op in supported and extractor is not None: + parts.append(render_wrapper(domain, op, arg_a, arg_b, extractor)) + else: + parts.append(render_blocker_bool(domain, op, arg_a, arg_b)) + + for op in PATH_OPERATORS: + for arg_a, arg_b in _path_shapes(dom): + parts.append(render_blocker_path(domain, op, arg_a, arg_b)) + + for op in BLOCKER_ONLY_OPERATORS: + for arg_a, arg_b, returns in _blocker_only_shapes(dom, op): + parts.append(render_blocker_native(domain, op, arg_a, arg_b, returns)) + + requires = "\n".join(f"-- REQUIRE: {r}" for r in _functions_requires(spec, domain)) + header = ( + requires + "\n\n" + f"--! @file encrypted_domain/{spec.token}/{domain.name}_functions.sql\n" + f"--! @brief {role_phrase(domain.terms)} domain of the {spec.token} " + f"encrypted-domain family — comparison/path functions.\n\n" + ) + return header + "\n".join(parts) + + +def render_operators_file(spec: TypeSpec, domain: DomainSpec) -> str: + """Body for a domain's _operators.sql: 44 CREATE OPERATOR statements.""" + dom = domain_name(domain.name) + supported = set(supported_operators(domain)) + parts: list[str] = [] + + for op in SYMMETRIC_OPERATORS: + backing = backing_function(op) + for leftarg, rightarg in _symmetric_shapes(dom): + parts.append( + render_operator( + op, backing, leftarg, rightarg, + supported=op in supported, + ) + ) + for op in PATH_OPERATORS: + backing = backing_function(op) + for leftarg, rightarg in _path_shapes(dom): + parts.append( + render_operator(op, backing, leftarg, rightarg, supported=False) + ) + for op in BLOCKER_ONLY_OPERATORS: + backing = backing_function(op) + for leftarg, rightarg, _returns in _blocker_only_shapes(dom, op): + parts.append( + render_operator(op, backing, leftarg, rightarg, supported=False) + ) + + requires = ( + "-- REQUIRE: src/schema.sql\n" + f"-- REQUIRE: {_types_path(spec.token)}\n" + f"-- REQUIRE: src/encrypted_domain/{spec.token}/" + f"{domain.name}_functions.sql\n" + ) + header = ( + requires + "\n" + f"--! @file encrypted_domain/{spec.token}/{domain.name}_operators.sql\n" + f"--! @brief {role_phrase(domain.terms)} domain of the {spec.token} " + f"encrypted-domain family — operator declarations.\n\n" + ) + return header + "\n".join(parts) + + +def render_aggregates_file(spec: TypeSpec, domain: DomainSpec) -> str | None: + """Body for a domain's _aggregates.sql, or None if the domain has no + ordering comparator (storage/eq variants have no MIN/MAX semantics).""" + if not is_ord_capable(domain): + return None + parts = [render_aggregate(domain, AGGREGATE_OPS[name]) for name in ("min", "max")] + requires = ( + "-- REQUIRE: src/schema.sql\n" + f"-- REQUIRE: {_types_path(spec.token)}\n" + f"-- REQUIRE: src/encrypted_domain/{spec.token}/" + f"{domain.name}_functions.sql\n" + f"-- REQUIRE: src/encrypted_domain/{spec.token}/" + f"{domain.name}_operators.sql\n" + ) + header = ( + requires + "\n" + f"--! @file encrypted_domain/{spec.token}/{domain.name}_aggregates.sql\n" + f"--! @brief {role_phrase(domain.terms)} domain of the {spec.token} " + f"encrypted-domain family — MIN/MAX aggregates.\n\n" + ) + return header + "\n".join(parts) + + +def generate_type(spec: TypeSpec, out_dir: Path) -> list[Path]: + """Regenerate every generated file for a type.""" + out_dir = Path(out_dir) + target_paths = [out_dir / f"{spec.token}_types.sql"] + for domain in spec.domains: + target_paths.append(out_dir / f"{domain.name}_functions.sql") + target_paths.append(out_dir / f"{domain.name}_operators.sql") + if is_ord_capable(domain): + target_paths.append(out_dir / f"{domain.name}_aggregates.sql") + ensure_generated_paths_writable(target_paths) + clean_generated_files(out_dir) + + written: list[Path] = [] + + types_path = out_dir / f"{spec.token}_types.sql" + write_generated_file(types_path, render_types_file(spec)) + written.append(types_path) + + for domain in spec.domains: + fn_path = out_dir / f"{domain.name}_functions.sql" + write_generated_file(fn_path, render_functions_file(spec, domain)) + written.append(fn_path) + + op_path = out_dir / f"{domain.name}_operators.sql" + write_generated_file(op_path, render_operators_file(spec, domain)) + written.append(op_path) + + agg_body = render_aggregates_file(spec, domain) + if agg_body is not None: + agg_path = out_dir / f"{domain.name}_aggregates.sql" + write_generated_file(agg_path, agg_body) + written.append(agg_path) + + return written + + +DEFAULT_TYPES_DIR = Path(__file__).parent / "types" + + +def generate_one(token: str, *, types_dir: Path, out_root: Path) -> int: + """Regenerate one type from types_dir/.toml. + + Returns 0 on success, 1 when the manifest is missing or its inferred token + does not match. A malformed manifest raises SpecError — the caller decides + whether to surface it (single-type CLI) or aggregate it (--all).""" + toml_path = types_dir / f"{token}.toml" + if not toml_path.is_file(): + print(f"error: no manifest at {toml_path}", file=sys.stderr) + return 1 + spec = load_spec(toml_path) + if spec.token != token: + print( + f"error: manifest token '{spec.token}' does not match '{token}'", + file=sys.stderr, + ) + return 1 + out_dir = out_root / "src" / "encrypted_domain" / token + written = generate_type(spec, out_dir) + + if spec.fixture_values is not None: + rs_path = fixture_values_rs_path(out_root, token) + write_generated_rs(rs_path, render_fixture_values_rs(spec)) + written.append(rs_path) + + for path in written: + print(f"generated {path.relative_to(out_root)}") + print(f"generated {len(written)} files for {token}") + return 0 + + +def generate_all(*, types_dir: Path, out_root: Path) -> int: + """Regenerate every type whose manifest lives in types_dir. + + Iterates sorted(types_dir.glob('*.toml')) for deterministic order and + aggregates return codes: a missing/mismatched/malformed manifest is + reported and counted as a failure without aborting the remaining types.""" + tokens = [p.stem for p in sorted(types_dir.glob("*.toml"))] + if not tokens: + print(f"error: no manifests found in {types_dir}", file=sys.stderr) + return 1 + rc = 0 + for token in tokens: + try: + if generate_one(token, types_dir=types_dir, out_root=out_root) != 0: + rc = 1 + except SpecError as exc: + print(f"error: {token}: {exc}", file=sys.stderr) + rc = 1 + status = "ok" if rc == 0 else "FAILED" + print(f"codegen --all: {status} ({len(tokens)} types: {', '.join(tokens)})") + return rc + + +def main( + argv: list[str], + *, + types_dir: Path | None = None, + out_root: Path | None = None, +) -> int: + """CLI entrypoint: generate , or --all for every manifest.""" + types_dir = types_dir or DEFAULT_TYPES_DIR + out_root = out_root or REPO_ROOT + if len(argv) == 2 and argv[1] == "--all": + return generate_all(types_dir=types_dir, out_root=out_root) + if len(argv) != 2: + print("Usage: generate.py | generate.py --all", file=sys.stderr) + return 2 + return generate_one(argv[1], types_dir=types_dir, out_root=out_root) + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/tasks/codegen/operator_surface.py b/tasks/codegen/operator_surface.py new file mode 100644 index 000000000..355e5751c --- /dev/null +++ b/tasks/codegen/operator_surface.py @@ -0,0 +1,72 @@ +"""The generated operator surface for a scalar encrypted-domain type. + +Supported comparison operators route to inlinable wrappers when the domain +has the required term. Unsupported comparisons, path operators, and native +jsonb fallback operators route to blockers. +""" + +from dataclasses import dataclass +from typing import Literal + + +@dataclass(frozen=True) +class Operator: + """One operator in the generated surface.""" + + symbol: str + backing: str # eql_v2 backing function name (bare or quoted) + kind: Literal["symmetric", "path", "blocker_only"] + restrict: str | None # selectivity estimator, symmetric ops only + join: str | None # join selectivity estimator, symmetric ops only + commutator: str | None + negator: str | None + + +SYMMETRIC_OPERATORS = ["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] +PATH_OPERATORS = ["->", "->>"] +BLOCKER_ONLY_OPERATORS = ["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"] + + +OPERATORS: dict[str, Operator] = { + "=": Operator("=", "eq", "symmetric", "eqsel", "eqjoinsel", "=", "<>"), + "<>": Operator("<>", "neq", "symmetric", "neqsel", "neqjoinsel", "<>", "="), + "<": Operator("<", "lt", "symmetric", "scalarltsel", "scalarltjoinsel", ">", ">="), + "<=": Operator("<=", "lte", "symmetric", "scalarlesel", "scalarlejoinsel", ">=", ">"), + ">": Operator(">", "gt", "symmetric", "scalargtsel", "scalargtjoinsel", "<", "<="), + ">=": Operator(">=", "gte", "symmetric", "scalargesel", "scalargejoinsel", "<=", "<"), + "@>": Operator("@>", "contains", "symmetric", None, None, None, None), + "<@": Operator("<@", "contained_by", "symmetric", None, None, None, None), + "->": Operator("->", '"->"', "path", None, None, None, None), + "->>": Operator("->>", '"->>"', "path", None, None, None, None), + "?": Operator("?", '"?"', "blocker_only", None, None, None, None), + "?|": Operator("?|", '"?|"', "blocker_only", None, None, None, None), + "?&": Operator("?&", '"?&"', "blocker_only", None, None, None, None), + "@?": Operator("@?", '"@?"', "blocker_only", None, None, None, None), + "@@": Operator("@@", '"@@"', "blocker_only", None, None, None, None), + "#>": Operator("#>", '"#>"', "blocker_only", None, None, None, None), + "#>>": Operator("#>>", '"#>>"', "blocker_only", None, None, None, None), + "-": Operator("-", '"-"', "blocker_only", None, None, None, None), + "#-": Operator("#-", '"#-"', "blocker_only", None, None, None, None), + "||": Operator("||", '"||"', "blocker_only", None, None, None, None), +} + + +def backing_function(symbol: str) -> str: + """Return the eql_v2 backing function name for an operator symbol.""" + return OPERATORS[symbol].backing + + +# The full union of operator symbols the generator knows about: supported +# wrappers, path operators, and explicit blockers. Together these are exactly +# the native jsonb operator surface for PG 14-17, so this set is the basis of +# the storage-only "every native jsonb operator is blocked" guarantee. +# +# A live-DB structural guard (tests/sqlx/.../family/jsonb_operator_surface.rs) +# queries pg_operator for every operator with a jsonb argument and asserts the +# set is a subset of this union — if a future PG version adds a jsonb operator +# not enumerated here, that test fails rather than silently letting native +# plaintext-jsonb semantics through on an encrypted column. Keep that test's +# hardcoded expectation in sync with this set. +KNOWN_JSONB_OPERATORS: frozenset[str] = frozenset( + SYMMETRIC_OPERATORS + PATH_OPERATORS + BLOCKER_ONLY_OPERATORS +) diff --git a/tasks/codegen/scalars.py b/tasks/codegen/scalars.py new file mode 100644 index 000000000..a93df9056 --- /dev/null +++ b/tasks/codegen/scalars.py @@ -0,0 +1,93 @@ +"""Fixed scalar-kind catalog for fixture-value emission. + +A `ScalarKind` knows how to turn a manifest fixture-value token into a Rust +literal of the type's native Rust scalar, and how to resolve it to a numeric +value for the MIN/MAX/zero invariant check. The manifest carries only the +list of value tokens; the per-type behaviour lives here (mirroring terms.py), +not in free-form TOML fields. + +Recognised sentinels are ``MIN`` / ``MAX`` / ``ZERO``; every other token is a +numeric literal validated against the type's representable range. +""" + +from dataclasses import dataclass + + +class ScalarError(Exception): + """Raised for an unknown scalar token or an invalid fixture value.""" + + +_SENTINELS = ("MIN", "MAX", "ZERO") + + +@dataclass(frozen=True) +class ScalarKind: + """One scalar type's Rust rendering rules for fixture values.""" + + token: str + rust_type: str + min_symbol: str + max_symbol: str + zero_symbol: str + min_value: int + max_value: int + + def _parse(self, value: str) -> int: + if value == "MIN": + return self.min_value + if value == "MAX": + return self.max_value + if value == "ZERO": + return 0 + try: + n = int(value) + except ValueError as exc: + raise ScalarError( + f"{self.token}: {value!r} is not a valid {self.rust_type} " + f"literal or sentinel ({'/'.join(_SENTINELS)})" + ) from exc + if not (self.min_value <= n <= self.max_value): + raise ScalarError( + f"{self.token}: {value!r} out of range for {self.rust_type} " + f"[{self.min_value}, {self.max_value}]" + ) + return n + + def numeric_value(self, value: str) -> int: + """Resolve a fixture token to its numeric value (validates range).""" + return self._parse(value) + + def render_literal(self, value: str) -> str: + """Render a fixture token as a Rust literal of this scalar type.""" + symbols = { + "MIN": self.min_symbol, + "MAX": self.max_symbol, + "ZERO": self.zero_symbol, + } + if value in symbols: + return symbols[value] + return str(self._parse(value)) + + +SCALAR_KINDS: dict[str, ScalarKind] = { + "int4": ScalarKind( + token="int4", + rust_type="i32", + min_symbol="i32::MIN", + max_symbol="i32::MAX", + zero_symbol="0", + min_value=-2147483648, + max_value=2147483647, + ), +} + + +def require_scalar(token: str) -> ScalarKind: + """Return the catalog kind for `token`, or raise ScalarError.""" + try: + return SCALAR_KINDS[token] + except KeyError as exc: + raise ScalarError( + f"unknown scalar token '{token}' " + f"(expected one of {sorted(SCALAR_KINDS)})" + ) from exc diff --git a/tasks/codegen/spec.py b/tasks/codegen/spec.py new file mode 100644 index 000000000..40e28cac3 --- /dev/null +++ b/tasks/codegen/spec.py @@ -0,0 +1,141 @@ +"""Minimal TOML manifest loader for scalar encrypted-domain codegen.""" + +import re +import tomllib +from dataclasses import dataclass +from pathlib import Path + +from .scalars import ScalarError, require_scalar +from .terms import TermError, require_terms + + +_SQL_IDENTIFIER = re.compile(r"^[a-z][a-z0-9_]*$") + + +class SpecError(Exception): + """Raised when a TOML manifest is missing or invalid.""" + + +@dataclass(frozen=True) +class DomainSpec: + """One generated public domain and the fixed terms it carries.""" + + name: str + terms: list[str] + + +@dataclass(frozen=True) +class TypeSpec: + """A scalar encrypted-domain manifest loaded from one TOML file.""" + + token: str + domains: list[DomainSpec] + fixture_values: list[str] | None = None + + +def _load_fixture_values(raw: dict, token: str) -> list[str] | None: + """Parse and validate the optional [fixture] table. + + Returns the ordered list of value tokens, or None when no [fixture] table + is present. The tokens are the manifest source of truth for the generated + Rust fixture-value const; the scalar kind validates each one and the set + must include MIN, MAX, and zero (the matrix comparison pivots).""" + if "fixture" not in raw: + return None + + fixture_table = raw["fixture"] + if not isinstance(fixture_table, dict) or "values" not in fixture_table: + raise SpecError("[fixture]: missing required key 'values'") + + values = fixture_table["values"] + if not isinstance(values, list): + raise SpecError("[fixture] values: must be a list of value tokens") + if not values: + raise SpecError("[fixture] values: must not be empty") + if any(not isinstance(v, str) for v in values): + raise SpecError("[fixture] values: must be strings") + + try: + kind = require_scalar(token) + resolved = [(v, kind.numeric_value(v)) for v in values] + for v in values: + kind.render_literal(v) + except ScalarError as exc: + raise SpecError(f"[fixture] values: {exc}") from exc + + # Distinct-plaintext contract: the matrix oracle treats each fixture value + # as a distinct plaintext, and the generated Rust const must not repeat a + # literal. Detect duplicates against the *resolved numeric* value so that + # both copy-paste token dups ("1", "1") and sentinel/literal aliases + # (e.g. "MIN" alongside the same number as a literal) are rejected. + seen: dict[int, str] = {} + duplicates: list[str] = [] + for token_value, number in resolved: + if number in seen: + duplicates.append( + f"{token_value!r} duplicates {seen[number]!r} (both resolve to {number})" + if token_value != seen[number] + else f"{token_value!r}" + ) + else: + seen[number] = token_value + if duplicates: + raise SpecError( + "[fixture] values: must be distinct, but found duplicate values: " + + ", ".join(duplicates) + ) + + numbers = set(seen) + if not ({kind.min_value, kind.max_value, 0} <= numbers): + raise SpecError( + "[fixture] values: must include MIN, MAX, and zero " + "(the matrix comparison pivots)" + ) + + return list(values) + + +def load_spec(path: Path | str) -> TypeSpec: + """Load and validate a per-type scalar-domain manifest.""" + path = Path(path) + with path.open("rb") as fh: + raw = tomllib.load(fh) + + if "domain" not in raw: + raise SpecError("spec: missing required table '[domain]'") + + domain_table = raw["domain"] + if not isinstance(domain_table, dict) or not domain_table: + raise SpecError("[domain]: at least one domain is required") + + token = path.stem + if not _SQL_IDENTIFIER.match(token): + raise SpecError( + f"spec: token {token!r} must match {_SQL_IDENTIFIER.pattern}" + ) + domains: list[DomainSpec] = [] + for name, terms in domain_table.items(): + if not isinstance(name, str) or not _SQL_IDENTIFIER.match(name): + raise SpecError( + f"[domain] {name}: domain name {name!r} must match " + f"{_SQL_IDENTIFIER.pattern}" + ) + if name != token and not name.startswith(f"{token}_"): + raise SpecError( + f"[domain] {name}: domain name must start with '{token}'" + ) + if not isinstance(terms, list): + raise SpecError( + f"[domain] {name}: value must be a list of term names" + ) + if any(not isinstance(term, str) for term in terms): + raise SpecError(f"[domain] {name}: term names must be strings") + try: + require_terms(list(terms)) + except TermError as exc: + raise SpecError(f"[domain] {name}: {exc}") from exc + domains.append(DomainSpec(name=name, terms=list(terms))) + + fixture_values = _load_fixture_values(raw, token) + + return TypeSpec(token=token, domains=domains, fixture_values=fixture_values) diff --git a/tasks/codegen/templates.py b/tasks/codegen/templates.py new file mode 100644 index 000000000..608334954 --- /dev/null +++ b/tasks/codegen/templates.py @@ -0,0 +1,490 @@ +"""Per-construct SQL template functions for scalar encrypted-domain codegen.""" + +from dataclasses import dataclass + +from .operator_surface import OPERATORS +from .scalars import require_scalar +from .spec import DomainSpec, TypeSpec +from .terms import ( + Term, + extractor_for_operator as _catalog_extractor_for_operator, + operators_for_terms, + role_for_terms, + term_json_keys, +) + +AUTO_GENERATED_HEADER = ( + "-- AUTO-GENERATED — DO NOT EDIT.\n" + "-- Regenerated automatically by `mise run build`; " + "also `mise run codegen:domain ` to refresh one type.\n" + "-- Source of truth: tasks/codegen/types/.toml\n" + "-- This file is gitignored; never commit it.\n" +) + +# Rust counterpart of AUTO_GENERATED_HEADER. Unlike the gitignored SQL surface, +# the fixture-value const IS committed and verified by the CI staleness guard, +# so the wording differs deliberately. +AUTO_GENERATED_HEADER_RS = ( + "// AUTO-GENERATED — DO NOT EDIT.\n" + "// Regenerated by `mise run build` " + "(or `mise run codegen:domain `).\n" + "// Source of truth: tasks/codegen/types/.toml `[fixture] values`.\n" + "// This file IS committed and verified in CI (git diff --exit-code).\n" +) + +ENVELOPE_KEYS = ["v", "i"] +CIPHERTEXT_KEY = "c" +# EQL payload-format version. The domain CHECK pins the 'v' envelope key to +# this value, matching EQL's repo-wide rule (eql_v2._encrypted_check_v, +# src/encrypted/constraints.sql). Presence of 'v' is enforced via +# ENVELOPE_KEYS; this pins its value so a stale/foreign-version payload is +# rejected on insert or cast rather than surfacing later at query time. +VERSION_KEY = "v" +ENVELOPE_VERSION = 2 + + +def _sql_str(s: str) -> str: + """Escape a Python string for use *inside* a single-quoted SQL string + literal by doubling embedded single quotes. + + Use this at every `'{...}'` interpolation boundary in the render_* + helpers — payload keys, operator symbols, domain names rendered into + RAISE messages, etc. + + Today every catalog string (term keys, operator symbols) is quote-free, + so this is a no-op on real input and output stays byte-identical. It + exists so a future quote-bearing catalog string can never break out of + its SQL literal — nothing else enforces the quote-free invariant.""" + return s.replace("'", "''") + + +def render_fixture_values_rs(spec: TypeSpec) -> str: + """Body for tests/sqlx/src/fixtures/_values.rs. + + Emits one `pub const VALUES: &[]` from the manifest's + `[fixture] values`, preserving declaration order. The writer prepends the + AUTO-GENERATED Rust header, so the body carries none.""" + kind = require_scalar(spec.token) + values = spec.fixture_values or [] + literals = "".join(f" {kind.render_literal(v)},\n" for v in values) + return ( + f"//! Fixture plaintext values for the {spec.token} " + "encrypted-domain family.\n" + "//!\n" + f"//! Generated from tasks/codegen/types/{spec.token}.toml " + "`[fixture] values` —\n" + "//! the single source of truth shared by the fixture generator\n" + f"//! (`fixtures::eql_v2_{spec.token}`) and the matrix oracle\n" + "//! (`ScalarType::FIXTURE_VALUES`).\n\n" + f"/// Distinct plaintext values present in the `eql_v2_{spec.token}` " + "fixture.\n" + f"pub const VALUES: &[{kind.rust_type}] = &[\n" + f"{literals}" + "];\n" + ) + +OPERATOR_PHRASES: dict[str, str] = { + "=": "Equality", + "<>": "Inequality", + "<": "Less-than", + "<=": "Less-than-or-equal", + ">": "Greater-than", + ">=": "Greater-than-or-equal", + "@>": "Contains", + "<@": "Contained-by", +} + +DOMAIN_ROLE_PHRASES: dict[str, str] = { + "storage": "Storage-only", + "eq": "Equality-only", + "ord": "Ordered", +} + + +def role_phrase(terms: list[str]) -> str: + """Proper-cased prose label for a domain with these terms — the single + source of truth for role → human prose. Every renderer that wants to + describe a domain's role in @brief lines reaches for this, so a rename + in DOMAIN_ROLE_PHRASES propagates to every generated file.""" + return DOMAIN_ROLE_PHRASES[role_for_terms(terms)] + + +def _scheme_suffix(name: str, token: str, role: str) -> str | None: + """The scheme tag of a domain name, or None for the converged name. + + The naming convention is ``_`` for the recommended converged + domain and ``__`` for a scheme-explicit twin that + pins the same role to one concrete index scheme. ``storage`` has no role + segment, so its converged name is the bare ````. + + Generic by construction: it reads ``token`` and ``role`` rather than any + hard-coded type or scheme string, so it works for int8/date/etc. and for + schemes other than ``ore``. Returns the scheme segment (e.g. ``"ore"``) + for a twin, or None when ``name`` is the converged name (or doesn't match + the convention at all).""" + converged = token if role == "storage" else f"{token}_{role}" + if name == converged: + return None + prefix = converged + "_" + if name.startswith(prefix): + scheme = name[len(prefix):] + if scheme: + return scheme + return None + + +# Roles that come in converged + scheme-explicit-twin pairs and therefore need +# a disambiguating @brief clause. Ordered domains are the case the reviewer +# flagged: int4_ord and int4_ord_ore carry identical terms (["ore"]) and would +# otherwise render an identical brief. Driven by role (generic across int8, +# date, etc.), never by a literal type/scheme name. eq and storage have a +# single name each, so no disambiguation is needed (or wanted — it'd be noise). +_TWINNABLE_ROLES = frozenset({"ord"}) + + +def brief_role_clause(domain: DomainSpec, token: str) -> str: + """The trailing clause distinguishing the recommended converged domain + from a scheme-explicit twin, for use in a per-domain @brief. + + Two domains that carry identical terms (e.g. ``int4_ord`` and + ``int4_ord_ore``, both ``["ore"]``) would otherwise render an identical + brief. The converged name is the recommended one to reach for; the twin + names the concrete scheme explicitly. Returns "" for roles that don't come + in converged/twin pairs (eq, storage) and for names that match no pattern. + + Generic by construction: keyed on the term-derived role and the + ``_[_]`` name shape, never on a literal type or scheme + string, so int8/date/etc. and non-ore schemes work unchanged.""" + role = role_for_terms(domain.terms) + if role not in _TWINNABLE_ROLES: + return "" + scheme = _scheme_suffix(domain.name, token, role) + if scheme is not None: + return ( + f" Scheme-explicit twin pinning the {scheme} scheme; " + f"prefer the converged {token}_{role} name." + ) + if domain.name == f"{token}_{role}": + return " Recommended converged name for this role." + return "" + + +def domain_name(domain: str) -> str: + """The public SQL domain type name.""" + return f"eql_v2_{domain}" + + +def _arg_label(dom: str, arg_type: str) -> str: + """Doxygen brief shape qualifier for one operand: 'domain' if it's + the encrypted-domain type, otherwise the literal SQL type.""" + return "domain" if arg_type == dom else arg_type + + +def _shape_qualifier(dom: str, arg_a: str, arg_b: str) -> str: + """Doxygen brief parenthetical. Empty for the canonical (dom, dom) shape.""" + if arg_a == dom and arg_b == dom: + return "" + return f" ({_arg_label(dom, arg_a)}, {_arg_label(dom, arg_b)})" + + +def render_domain_block(domain: DomainSpec, token: str) -> str: + """One idempotent IF NOT EXISTS CREATE DOMAIN block, prefixed by a + per-domain --! @brief derived from role + token.""" + dom = domain_name(domain.name) + keys = ENVELOPE_KEYS + [CIPHERTEXT_KEY] + term_json_keys(domain.terms) + presence = "\n AND ".join(f"VALUE ? '{_sql_str(key)}'" for key in keys) + checks = ( + presence + + f"\n AND VALUE->>'{_sql_str(VERSION_KEY)}' = '{ENVELOPE_VERSION}'" + ) + phrase = role_phrase(domain.terms) + clause = brief_role_clause(domain, token) + return ( + f" --! @brief {phrase} encrypted {token} domain.{clause}\n" + f" IF NOT EXISTS (\n" + f" SELECT 1 FROM pg_type\n" + f" WHERE typname = '{_sql_str(dom)}' " + f"AND typnamespace = 'public'::regnamespace\n" + f" ) THEN\n" + f" CREATE DOMAIN public.{dom} AS jsonb\n" + f" CHECK (\n" + f" jsonb_typeof(VALUE) = 'object'\n" + f" AND {checks}\n" + f" );\n" + f" END IF;\n" + ) + + +def render_extractor(domain: DomainSpec, term: Term) -> str: + """The inlinable index-term extractor for a domain term.""" + dom = domain_name(domain.name) + doxy = ( + f"--! @brief Index extractor for the {dom} variant.\n" + f"--! @param a {dom}\n" + f"--! @return {term.returns}\n" + ) + return doxy + ( + f"CREATE FUNCTION eql_v2.{term.extractor}(a {dom})\n" + f"RETURNS {term.returns}\n" + f"LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE\n" + f"AS $$ SELECT eql_v2.{term.ctor}(a::jsonb) $$;\n" + ) + + +def _extract_arg(arg_type: str, extractor: str, domain: str, arg: str) -> str: + """The extractor-call SQL for one operand, casting jsonb to the domain first.""" + if arg_type == "jsonb": + return f"eql_v2.{extractor}({arg}::{domain})" + return f"eql_v2.{extractor}({arg})" + + +def render_wrapper( + domain: DomainSpec, op: str, arg_a: str, arg_b: str, extractor: str +) -> str: + """An inlinable comparison wrapper for a supported operator.""" + dom = domain_name(domain.name) + backing = OPERATORS[op].backing + call_a = _extract_arg(arg_a, extractor, dom, "a") + call_b = _extract_arg(arg_b, extractor, dom, "b") + doxy = ( + f"--! @brief {OPERATOR_PHRASES[op]} wrapper for {dom}" + f"{_shape_qualifier(dom, arg_a, arg_b)}.\n" + f"--! @param a {arg_a}\n" + f"--! @param b {arg_b}\n" + f"--! @return boolean\n" + ) + return doxy + ( + f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, b {arg_b})\n" + f"RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE\n" + f"AS $$ SELECT {call_a} {op} {call_b} $$;\n" + ) + + +def render_blocker_bool( + domain: DomainSpec, op: str, arg_a: str, arg_b: str +) -> str: + """A boolean-returning blocker. NEVER STRICT, ALWAYS LANGUAGE plpgsql + so the RAISE survives inlining and planner-time elision; see CLAUDE.md + footguns and the encrypted-domain spec §4.""" + dom = domain_name(domain.name) + backing = OPERATORS[op].backing + doxy = ( + f"--! @brief Blocker for {op} on {dom}" + f"{_shape_qualifier(dom, arg_a, arg_b)}.\n" + f"--! @param a {arg_a}\n" + f"--! @param b {arg_b}\n" + f"--! @return boolean (never returns; always raises)\n" + ) + return doxy + ( + f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, b {arg_b})\n" + f"RETURNS boolean IMMUTABLE PARALLEL SAFE\n" + f"AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool(" + f"'{_sql_str(dom)}', '{_sql_str(op)}'); END; $$\n" + f"LANGUAGE plpgsql;\n" + ) + + +def render_blocker_path( + domain: DomainSpec, op: str, arg_a: str, arg_b: str +) -> str: + """A path-operator blocker. NEVER STRICT, ALWAYS LANGUAGE plpgsql + so the RAISE survives inlining and planner-time elision; see CLAUDE.md + footguns and the encrypted-domain spec §4.""" + dom = domain_name(domain.name) + backing = OPERATORS[op].backing + returns = "text" if op == "->>" else dom + doxy = ( + f"--! @brief Blocker for {op} on {dom} " + f"({_arg_label(dom, arg_a)}, {_arg_label(dom, arg_b)}).\n" + f"--! @param a {arg_a}\n" + f"--! @param selector {arg_b}\n" + f"--! @return {returns} (never returns; always raises)\n" + ) + return doxy + ( + f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, selector {arg_b})\n" + f"RETURNS {returns} IMMUTABLE PARALLEL SAFE\n" + f"AS $$ BEGIN RAISE EXCEPTION " + f"'operator % is not supported for %', '{_sql_str(op)}', " + f"'{_sql_str(dom)}'; END; $$\n" + f"LANGUAGE plpgsql;\n" + ) + + +def render_blocker_native( + domain: DomainSpec, op: str, arg_a: str, arg_b: str, returns: str +) -> str: + """A blocker for a native jsonb fallback operator. NEVER STRICT, ALWAYS + LANGUAGE plpgsql. Boolean blockers delegate to the shared helper so lint + recognition and messages stay uniform; other return types raise directly. + """ + dom = domain_name(domain.name) + backing = OPERATORS[op].backing + doxy = ( + f"--! @brief Blocker for {op} on {dom}" + f"{_shape_qualifier(dom, arg_a, arg_b)}.\n" + f"--! @param a {arg_a}\n" + f"--! @param b {arg_b}\n" + f"--! @return {returns} (never returns; always raises)\n" + ) + if returns == "boolean": + body = ( + "BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool(" + f"'{_sql_str(dom)}', '{_sql_str(op)}'); END;" + ) + else: + body = ( + "BEGIN RAISE EXCEPTION " + f"'operator % is not supported for %', '{_sql_str(op)}', " + f"'{_sql_str(dom)}'; END;" + ) + return doxy + ( + f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, b {arg_b})\n" + f"RETURNS {returns} IMMUTABLE PARALLEL SAFE\n" + f"AS $$ {body} $$\n" + f"LANGUAGE plpgsql;\n" + ) + + +def extractor_for_operator(domain: DomainSpec, op: str) -> str | None: + """Return the catalog extractor that supports op for this domain.""" + return _catalog_extractor_for_operator(domain.terms, op) + + +def supported_operators(domain: DomainSpec) -> list[str]: + """Supported operators for this domain.""" + return operators_for_terms(domain.terms) + + +@dataclass(frozen=True) +class AggregateOp: + """One aggregate operator definition (min or max).""" + + name: str # public function name, e.g. "min" + sfunc_name: str # state function name, e.g. "min_sfunc" + comparator: str # SQL comparator used to choose the new state: "<" or ">" + phrase: str # short prose label used in --! @brief lines + + +AGGREGATE_OPS: dict[str, AggregateOp] = { + "min": AggregateOp("min", "min_sfunc", "<", "minimum"), + "max": AggregateOp("max", "max_sfunc", ">", "maximum"), +} + + +def is_ord_capable(domain: DomainSpec) -> bool: + """True if the domain carries a comparator term (i.e. supports `<`).""" + return role_for_terms(domain.terms) == "ord" + + +def render_aggregate(domain: DomainSpec, op: AggregateOp) -> str: + """Render state function + CREATE AGGREGATE for one aggregate op on one + domain. The ord-capability gate lives at the file-level renderer + (`render_aggregates_file`); callers may legitimately render a single + aggregate without re-asserting that precondition. MIN/MAX on a non-ord + domain is structurally well-formed text but semantically meaningless — + the file-level gate is what stops it ever reaching disk.""" + dom = domain_name(domain.name) + sfunc_doxy = ( + f"--! @brief State function for {op.name} aggregate on {dom}.\n" + f"--! @internal\n" + f"--!\n" + f"--! @param state {dom} running extremum\n" + f"--! @param value {dom} next non-NULL value\n" + f"--! @return {dom} the {op.phrase} of state and value\n" + ) + # plpgsql + STRICT: PG seeds the state with the first non-NULL value and + # skips NULL inputs. plpgsql (not sql) because aggregate state functions + # aren't index expressions — opacity to the planner is fine — and a + # multi-statement BEGIN/IF/END body is the natural shape. + # + # The same rationale is mirrored into the emitted SQL below so a reader of + # the generated file (who never sees this Python) understands why it isn't + # an inlinable LANGUAGE sql CASE. + sfunc_rationale = ( + "-- LANGUAGE plpgsql, not sql: aggregate state functions are not index\n" + "-- expressions, so opacity to the planner is fine, and a multi-statement\n" + "-- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would\n" + "-- also work, but the procedural form mirrors the blocker convention.)\n" + ) + sfunc = sfunc_rationale + ( + f"CREATE FUNCTION eql_v2.{op.sfunc_name}(state {dom}, value {dom})\n" + f"RETURNS {dom}\n" + f"LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE\n" + f"SET search_path = pg_catalog, extensions, public\n" + f"AS $$\n" + f"BEGIN\n" + f" IF value {op.comparator} state THEN\n" + f" RETURN value;\n" + f" END IF;\n" + f" RETURN state;\n" + f"END;\n" + f"$$;\n" + ) + agg_doxy = ( + f"--! @brief Find the {op.phrase} encrypted value in a group of " + f"{dom} values.\n" + f"--!\n" + f"--! Comparison routes through the domain's `{op.comparator}` " + f"operator, which uses the ORE block term — no decryption.\n" + f"--!\n" + f"--! @param input {dom} encrypted values to aggregate\n" + f"--! @return {dom} {op.phrase} of the group, or NULL if all " + f"inputs are NULL\n" + ) + # min/max are associative, so the state function doubles as the combine + # function: merging two partial extrema is the same comparison. With a + # PARALLEL SAFE sfunc/combinefunc and `parallel = safe`, PG can use partial + # and parallel aggregation on the large GROUP BY workloads these ORE + # aggregates exist to serve — still with no decryption. The combinefunc is + # STRICT (it is the sfunc), so PG carries a null partial state through as + # "no value yet", matching the serial seed-and-skip semantics. + aggregate = ( + "-- combinefunc = sfunc: min/max are associative, so merging two partial\n" + "-- extrema is the same comparison. PARALLEL SAFE enables partial and\n" + "-- parallel aggregation on large GROUP BY workloads, with no decryption.\n" + f"CREATE AGGREGATE eql_v2.{op.name}({dom}) (\n" + f" sfunc = eql_v2.{op.sfunc_name},\n" + f" stype = {dom},\n" + f" combinefunc = eql_v2.{op.sfunc_name},\n" + f" parallel = safe\n" + f");\n" + ) + return sfunc_doxy + sfunc + "\n" + agg_doxy + aggregate + + +def render_operator( + op: str, backing: str, leftarg: str, rightarg: str, supported: bool +) -> str: + """A CREATE OPERATOR declaration. + + Unsupported operators are still declared, but their backing function is a + blocker that always raises. We emit them so the operator resolves on the + domain (rather than silently falling through to a native jsonb operator), + and a leading SQL comment explains the placeholder to future readers.""" + meta = OPERATORS[op] + lines = [] + if not supported: + lines.append( + f"-- Placeholder: this domain's term set does not support {op}; " + f"the backing function always raises." + ) + lines += [ + f"CREATE OPERATOR {op} (", + f" FUNCTION = eql_v2.{backing},", + f" LEFTARG = {leftarg}, RIGHTARG = {rightarg}", + ] + if supported and meta.kind == "symmetric": + extras = [] + if meta.commutator: + extras.append(f"COMMUTATOR = {meta.commutator}") + if meta.negator: + extras.append(f"NEGATOR = {meta.negator}") + if meta.restrict: + extras.append(f"RESTRICT = {meta.restrict}") + if meta.join: + extras.append(f"JOIN = {meta.join}") + if extras: + lines[-1] += "," + lines.append(" " + ", ".join(extras)) + lines.append(");") + return "\n".join(lines) + "\n" diff --git a/tasks/codegen/terms.py b/tasks/codegen/terms.py new file mode 100644 index 000000000..32a7c788c --- /dev/null +++ b/tasks/codegen/terms.py @@ -0,0 +1,107 @@ +"""Fixed index-term catalog for scalar encrypted-domain codegen.""" + +from collections.abc import Iterable +from dataclasses import dataclass + + +class TermError(Exception): + """Raised when a manifest references an unknown term.""" + + +@dataclass(frozen=True) +class Term: + """One fixed index term known to the scalar materializer.""" + + name: str + json_key: str + extractor: str + returns: str + ctor: str + role: str + operators: tuple[str, ...] + requires: tuple[str, ...] + + +TERM_CATALOG: dict[str, Term] = { + "hm": Term( + name="hm", + json_key="hm", + extractor="eq_term", + returns="eql_v2.hmac_256", + ctor="hmac_256", + role="eq", + operators=("=", "<>"), + requires=("src/hmac_256/functions.sql",), + ), + "ore": Term( + name="ore", + json_key="ob", + extractor="ord_term", + returns="eql_v2.ore_block_u64_8_256", + ctor="ore_block_u64_8_256", + role="ord", + operators=("=", "<>", "<", "<=", ">", ">="), + requires=( + "src/ore_block_u64_8_256/functions.sql", + "src/ore_block_u64_8_256/operators.sql", + ), + ), +} + + +def _dedupe_preserving_order(values: Iterable[str]) -> list[str]: + """Stable dedupe — first occurrence wins. `dict.fromkeys` preserves insert order.""" + return list(dict.fromkeys(values)) + + +def require_terms(names: list[str]) -> list[Term]: + """Return catalog terms for manifest names, preserving input order.""" + terms: list[Term] = [] + for name in names: + try: + terms.append(TERM_CATALOG[name]) + except KeyError as exc: + raise TermError( + f"unknown term '{name}' (expected one of {sorted(TERM_CATALOG)})" + ) from exc + return terms + + +def operators_for_terms(names: list[str]) -> list[str]: + """Supported operators for the union of a domain's terms.""" + return _dedupe_preserving_order( + op for term in require_terms(names) for op in term.operators + ) + + +def term_json_keys(names: list[str]) -> list[str]: + """JSON payload keys required by these terms.""" + return _dedupe_preserving_order( + term.json_key for term in require_terms(names) + ) + + +def term_requires(names: list[str]) -> list[str]: + """SQL REQUIRE edges needed by these terms.""" + return _dedupe_preserving_order( + req for term in require_terms(names) for req in term.requires + ) + + +def extractor_for_operator(names: list[str], op: str) -> str | None: + """The catalog extractor that supports `op` for a domain carrying `names`.""" + for term in require_terms(names): + if op in term.operators: + return term.extractor + return None + + +def role_for_terms(names: list[str]) -> str: + """Generated-file role label for a domain with these terms. + + A domain with no terms is `storage`; otherwise the role comes from + the first term's catalog role (e.g. `hm` -> `eq`, `ore` -> `ord`). + """ + if not names: + return "storage" + return require_terms(names)[0].role diff --git a/tasks/codegen/test_against_reference.py b/tasks/codegen/test_against_reference.py new file mode 100644 index 000000000..e7ea62e99 --- /dev/null +++ b/tasks/codegen/test_against_reference.py @@ -0,0 +1,117 @@ +"""Identity guard: the generator must reproduce the frozen manual +reference under tests/codegen/reference// byte-for-byte. + +The reference is the reviewed manual implementation. If the generator's +output diverges from the reference, either the generator regressed (fix +it) or the reference is being deliberately updated (commit the new +reference in this PR). + +Compares in-memory `render_*_file` output directly against the reference, +so it runs anywhere regardless of whether the build has materialised +src/encrypted_domain// (those files are gitignored — `tasks/build.sh` +regenerates them on each build). +""" +from pathlib import Path + +import pytest + +from tasks.codegen.generate import ( + REPO_ROOT, + render_aggregates_file, + render_functions_file, + render_operators_file, + render_types_file, +) +from tasks.codegen.spec import load_spec +from tasks.codegen.templates import render_fixture_values_rs + +_REFERENCE_ROOT = REPO_ROOT / "tests" / "codegen" / "reference" +_TYPES_DIR = REPO_ROOT / "tasks" / "codegen" / "types" + + +def _strip_reference_marker(text: str) -> str: + """Drop any leading `-- REFERENCE:` / `// REFERENCE:` lines. They label the + file as the parity baseline (see tests/codegen/reference/README.md) and are + not part of the generator's output. Both comment styles are recognised so + the same helper serves SQL and Rust reference files.""" + lines = text.splitlines(keepends=True) + while lines and lines[0].startswith(("-- REFERENCE:", "// REFERENCE:")): + lines.pop(0) + return "".join(lines) + + +def _reference_files() -> list[Path]: + """Every SQL file under tests/codegen/reference//.""" + if not _REFERENCE_ROOT.is_dir(): + return [] + return sorted(_REFERENCE_ROOT.glob("*/*.sql")) + + +def _render(reference_path: Path) -> str: + """Render the corresponding generator output for a reference file.""" + token = reference_path.parent.name + name = reference_path.name + spec = load_spec(_TYPES_DIR / f"{token}.toml") + + if name == f"{token}_types.sql": + return render_types_file(spec) + + for domain in spec.domains: + if name == f"{domain.name}_functions.sql": + return render_functions_file(spec, domain) + if name == f"{domain.name}_operators.sql": + return render_operators_file(spec, domain) + if name == f"{domain.name}_aggregates.sql": + body = render_aggregates_file(spec, domain) + if body is None: + pytest.fail( + f"reference {reference_path.relative_to(REPO_ROOT)} exists " + f"but the generator skipped this variant (not ord-capable). " + f"Remove the reference file or update the manifest." + ) + return body + + pytest.fail(f"unrecognised reference filename: {name}") + + +@pytest.mark.parametrize( + "reference_path", + _reference_files(), + ids=lambda p: f"{p.parent.name}/{p.name}", +) +def test_generator_matches_manual_reference(reference_path: Path): + """Generator render output must equal the reviewed reference.""" + token = reference_path.parent.name + fix = ( + f"either the generator regressed (fix tasks/codegen/) or the " + f"manual reference is being updated deliberately — commit the " + f"new reference at {reference_path.relative_to(REPO_ROOT)} in " + f"this PR. Regenerate via: mise run codegen:domain {token}" + ) + + expected = _strip_reference_marker(reference_path.read_text(encoding="utf-8")) + actual = _render(reference_path) + + assert actual == expected, f"{reference_path.name}: {fix}" + + +def test_generator_matches_rust_fixture_values_reference(): + """The generated Rust fixture-value const must match the reviewed reference. + + Guards the committed tests/sqlx/src/fixtures/int4_values.rs against drift + from the manifest (the same property the CI staleness guard enforces, but + runnable without a checkout diff).""" + reference_path = _REFERENCE_ROOT / "int4" / "int4_values.rs" + spec = load_spec(_TYPES_DIR / "int4.toml") + + expected = _strip_reference_marker( + reference_path.read_text(encoding="utf-8") + ) + actual = render_fixture_values_rs(spec) + + assert actual == expected, ( + "int4_values.rs: either the generator regressed (fix tasks/codegen/) " + "or the reference is being updated deliberately — commit the new " + f"reference at {reference_path.relative_to(REPO_ROOT)} in this PR. " + "Regenerate via: mise run codegen:domain int4" + ) diff --git a/tasks/codegen/test_generate.py b/tasks/codegen/test_generate.py new file mode 100644 index 000000000..e92e2f2f1 --- /dev/null +++ b/tasks/codegen/test_generate.py @@ -0,0 +1,351 @@ +"""Tests for composing scalar encrypted-domain files from a manifest.""" + +import textwrap + +import pytest + +from tasks.codegen.generate import ( + generate_type, + main, + render_aggregates_file, + render_functions_file, + render_operators_file, + render_types_file, +) +from tasks.codegen.spec import load_spec +from tasks.codegen.templates import AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS +from tasks.codegen.writer import OwnershipError + + +INT4_TOML = textwrap.dedent(""" + [domain] + int4 = [] + int4_eq = ["hm"] + int4_ord_ore = ["ore"] + int4_ord = ["ore"] +""") + +INT4_FIXTURE_TOML = INT4_TOML + textwrap.dedent(""" + [fixture] + values = ["MIN", "-1", "ZERO", "1", "MAX"] +""") + +# A second, synthetic type for multi-type (--all) coverage. No [fixture] table, +# so it never touches scalars.py (which only registers int4) — it exercises the +# enumeration, not fixture rendering. +INT4X_TOML = textwrap.dedent(""" + [domain] + int4x = [] + int4x_eq = ["hm"] + int4x_ord = ["ore"] +""") + + +def _fixture_values_rs(out_root): + return out_root / "tests" / "sqlx" / "src" / "fixtures" / "int4_values.rs" + + +def load(tmp_path): + p = tmp_path / "int4.toml" + p.write_text(INT4_TOML) + return load_spec(p) + + +def test_types_file_has_all_four_domains(tmp_path): + spec = load(tmp_path) + sql = render_types_file(spec) + assert "-- REQUIRE: src/schema.sql" in sql + for dom in ("eql_v2_int4", "eql_v2_int4_eq", + "eql_v2_int4_ord", "eql_v2_int4_ord_ore"): + assert f"CREATE DOMAIN public.{dom} AS jsonb" in sql + + +def test_storage_functions_file_is_all_blockers(tmp_path): + spec = load(tmp_path) + storage = next(d for d in spec.domains if d.name == "int4") + sql = render_functions_file(spec, storage) + assert sql.count("CREATE FUNCTION") == 44 + assert "SET search_path" not in sql + assert sql.count("LANGUAGE plpgsql") == 44 + assert sql.count("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") == 0 + + +def test_eq_functions_file_counts_and_extractor(tmp_path): + spec = load(tmp_path) + eq = next(d for d in spec.domains if d.name == "int4_eq") + sql = render_functions_file(spec, eq) + assert sql.count("CREATE FUNCTION") == 45 + assert "CREATE FUNCTION eql_v2.eq_term(a eql_v2_int4_eq)" in sql + assert "RETURNS eql_v2.hmac_256" in sql + # 1 extractor + 6 wrappers (=, <> across 3 arg-shapes) inlined as SQL; + # 38 blockers across the remaining native jsonb surface as plpgsql. + assert sql.count("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") == 7 + assert sql.count("LANGUAGE plpgsql") == 38 + assert "SET search_path" not in sql + + +def test_ore_functions_file_counts_and_extractor(tmp_path): + spec = load(tmp_path) + ordered = next(d for d in spec.domains if d.name == "int4_ord") + sql = render_functions_file(spec, ordered) + assert sql.count("CREATE FUNCTION") == 45 + assert "CREATE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord)" in sql + assert "RETURNS eql_v2.ore_block_u64_8_256" in sql + # 1 extractor + 18 wrappers (=, <>, <, <=, >, >= across 3 shapes); + # 26 blockers across containment/path/native-jsonb fallback ops. + assert sql.count("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") == 19 + assert sql.count("LANGUAGE plpgsql") == 26 + assert "SET search_path" not in sql + + +def test_operators_file_has_forty_four(tmp_path): + spec = load(tmp_path) + eq = next(d for d in spec.domains if d.name == "int4_eq") + sql = render_operators_file(spec, eq) + assert sql.count("CREATE OPERATOR") == 44 + + +def test_generate_type_writes_expected_files(tmp_path): + spec = load(tmp_path) + out_dir = tmp_path / "int4" + written = generate_type(spec, out_dir) + names = {p.name for p in written} + assert "int4_types.sql" in names + for domain in ("int4", "int4_eq", "int4_ord", "int4_ord_ore"): + assert f"{domain}_functions.sql" in names + assert f"{domain}_operators.sql" in names + # Aggregates only emitted for ord-capable variants — storage and eq skip. + assert "int4_aggregates.sql" not in names + assert "int4_eq_aggregates.sql" not in names + assert "int4_ord_aggregates.sql" in names + assert "int4_ord_ore_aggregates.sql" in names + # 1 types + 4 functions + 4 operators + 2 aggregates = 11 + assert len(written) == 11 + for p in written: + assert p.read_text().startswith(AUTO_GENERATED_HEADER) + + +def test_generate_type_cleans_stale_files(tmp_path): + spec = load(tmp_path) + out_dir = tmp_path / "int4" + out_dir.mkdir() + stale = out_dir / "int4_removed_functions.sql" + stale.write_text(AUTO_GENERATED_HEADER + "-- orphan\n") + generate_type(spec, out_dir) + assert not stale.exists() + + +def test_generate_type_preserves_hand_written_extension_file(tmp_path): + spec = load(tmp_path) + out_dir = tmp_path / "int4" + out_dir.mkdir() + extension = out_dir / "int4_extensions.sql" + body = ( + "-- REQUIRE: src/encrypted_domain/int4/int4_types.sql\n" + "-- hand-written extension SQL\n" + ) + extension.write_text(body) + generate_type(spec, out_dir) + assert extension.read_text() == body + + +def test_generate_type_preflights_hand_written_target_before_cleanup(tmp_path): + spec = load(tmp_path) + out_dir = tmp_path / "int4" + out_dir.mkdir() + generated = out_dir / "int4_types.sql" + protected = out_dir / "int4_eq_functions.sql" + original_generated = AUTO_GENERATED_HEADER + "-- old generated\n" + original_protected = "-- REQUIRE: src/schema.sql\n-- hand-written\n" + generated.write_text(original_generated) + protected.write_text(original_protected) + + with pytest.raises(OwnershipError, match="hand-written"): + generate_type(spec, out_dir) + + assert generated.read_text() == original_generated + assert protected.read_text() == original_protected + assert not (out_dir / "int4_eq_operators.sql").exists() + + +def _seed_types_dir(tmp_path, name: str = "int4.toml", body: str = INT4_TOML): + types_dir = tmp_path / "types" + types_dir.mkdir() + (types_dir / name).write_text(body) + return types_dir + + +def test_main_rejects_wrong_argv_length(capsys): + rc = main(["generate.py"]) + assert rc == 2 + err = capsys.readouterr().err + assert "Usage: generate.py " in err + + +def test_main_errors_on_missing_manifest(tmp_path, capsys): + types_dir = tmp_path / "types" + types_dir.mkdir() + rc = main( + ["generate.py", "int4"], + types_dir=types_dir, + out_root=tmp_path, + ) + assert rc == 1 + err = capsys.readouterr().err + assert "no manifest at" in err + assert "int4.toml" in err + + +def test_main_errors_on_token_mismatch(tmp_path, capsys): + """Manifest stem must equal argv token — guards against a copy/rename.""" + types_dir = _seed_types_dir(tmp_path, name="int4.toml") + rc = main( + ["generate.py", "int8"], + types_dir=types_dir, + out_root=tmp_path, + ) + # int8.toml doesn't exist — first failure is missing manifest, not mismatch. + # To exercise the mismatch branch we need a manifest at int8.toml that + # declares int4 domains (impossible — the loader infers token from stem). + # The branch is therefore unreachable via the normal types/.toml + # convention; the assertion below just confirms the missing-manifest + # error path fires when the names diverge. + assert rc == 1 + err = capsys.readouterr().err + assert "no manifest at" in err + assert "int8.toml" in err + + +def test_main_happy_path_writes_files(tmp_path, capsys): + types_dir = _seed_types_dir(tmp_path) + rc = main( + ["generate.py", "int4"], + types_dir=types_dir, + out_root=tmp_path, + ) + assert rc == 0 + out_dir = tmp_path / "src" / "encrypted_domain" / "int4" + assert (out_dir / "int4_types.sql").is_file() + assert (out_dir / "int4_eq_functions.sql").is_file() + assert (out_dir / "int4_ord_operators.sql").is_file() + assert (out_dir / "int4_ord_aggregates.sql").is_file() + assert (out_dir / "int4_ord_ore_aggregates.sql").is_file() + assert not (out_dir / "int4_aggregates.sql").exists() + assert not (out_dir / "int4_eq_aggregates.sql").exists() + stdout = capsys.readouterr().out + assert "generated 11 files for int4" in stdout + + +def test_main_emits_fixture_values_rs_when_manifest_has_fixture(tmp_path, capsys): + types_dir = _seed_types_dir(tmp_path, body=INT4_FIXTURE_TOML) + rc = main(["generate.py", "int4"], types_dir=types_dir, out_root=tmp_path) + assert rc == 0 + rs = _fixture_values_rs(tmp_path) + assert rs.is_file() + text = rs.read_text() + assert text.startswith(AUTO_GENERATED_HEADER_RS) + assert "pub const VALUES: &[i32] = &[" in text + assert "i32::MIN," in text and "i32::MAX," in text + stdout = capsys.readouterr().out + assert "int4_values.rs" in stdout + + +def test_main_omits_fixture_values_rs_when_no_fixture_table(tmp_path, capsys): + types_dir = _seed_types_dir(tmp_path, body=INT4_TOML) + rc = main(["generate.py", "int4"], types_dir=types_dir, out_root=tmp_path) + assert rc == 0 + assert not _fixture_values_rs(tmp_path).exists() + + +def _seed_two_types(tmp_path): + types_dir = _seed_types_dir(tmp_path, name="int4.toml", body=INT4_TOML) + (types_dir / "int4x.toml").write_text(INT4X_TOML) + return types_dir + + +def test_main_all_generates_every_type(tmp_path, capsys): + types_dir = _seed_two_types(tmp_path) + rc = main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) + assert rc == 0 + assert (tmp_path / "src/encrypted_domain/int4/int4_types.sql").is_file() + assert (tmp_path / "src/encrypted_domain/int4x/int4x_types.sql").is_file() + out = capsys.readouterr().out + assert "generated 11 files for int4" in out + assert "codegen --all: ok (2 types: int4, int4x)" in out + + +def test_main_all_generates_in_sorted_order(tmp_path, capsys): + types_dir = _seed_two_types(tmp_path) + main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) + out = capsys.readouterr().out + assert out.index("for int4\n") < out.index("for int4x\n") + + +def test_main_all_errors_when_no_manifests(tmp_path, capsys): + types_dir = tmp_path / "types" + types_dir.mkdir() + rc = main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) + assert rc == 1 + assert "no manifests found" in capsys.readouterr().err + + +def test_main_all_aggregates_nonzero_on_bad_manifest(tmp_path, capsys): + types_dir = _seed_types_dir(tmp_path, name="int4.toml", body=INT4_TOML) + # 'broken' sorts before 'int4', so it is processed first; its domain name + # does not start with the token, so load_spec raises SpecError. + (types_dir / "broken.toml").write_text("[domain]\nwrongprefix = []\n") + rc = main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) + assert rc == 1 + captured = capsys.readouterr() + assert "broken" in captured.err + assert "codegen --all: FAILED" in captured.out + # The good type still generated despite the broken sibling. + assert (tmp_path / "src/encrypted_domain/int4/int4_types.sql").is_file() + + +def test_ordered_files_are_byte_identical_modulo_typename(tmp_path): + spec = load(tmp_path) + ord_domain = next(d for d in spec.domains if d.name == "int4_ord") + ore_domain = next(d for d in spec.domains if d.name == "int4_ord_ore") + + for renderer in (render_functions_file, render_operators_file, render_aggregates_file): + ord_sql = renderer(spec, ord_domain) + ore_sql = renderer(spec, ore_domain) + normalised_ord = ord_sql.replace("int4_ord_ore", "T").replace( + "int4_ord", "T" + ) + normalised_ore = ore_sql.replace("int4_ord_ore", "T").replace( + "int4_ord", "T" + ) + assert normalised_ord == normalised_ore, ( + f"{renderer.__name__}: int4_ord and int4_ord_ore must produce " + f"byte-identical SQL modulo their typenames" + ) + + +def test_render_aggregates_file_only_for_ord_variants(tmp_path): + spec = load(tmp_path) + storage = next(d for d in spec.domains if d.name == "int4") + eq = next(d for d in spec.domains if d.name == "int4_eq") + ordered = next(d for d in spec.domains if d.name == "int4_ord") + ore = next(d for d in spec.domains if d.name == "int4_ord_ore") + + assert render_aggregates_file(spec, storage) is None + assert render_aggregates_file(spec, eq) is None + assert render_aggregates_file(spec, ordered) is not None + assert render_aggregates_file(spec, ore) is not None + + +def test_render_aggregates_file_carries_both_min_and_max(tmp_path): + spec = load(tmp_path) + ordered = next(d for d in spec.domains if d.name == "int4_ord") + sql = render_aggregates_file(spec, ordered) + assert sql is not None + assert sql.count("CREATE FUNCTION") == 2 + assert sql.count("CREATE AGGREGATE") == 2 + assert "eql_v2.min_sfunc" in sql + assert "eql_v2.max_sfunc" in sql + # REQUIRE edges: types + functions + operators must all be declared. + assert "-- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql" in sql + assert "-- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql" in sql + assert "-- REQUIRE: src/encrypted_domain/int4/int4_types.sql" in sql diff --git a/tasks/codegen/test_operator_surface.py b/tasks/codegen/test_operator_surface.py new file mode 100644 index 000000000..a513ce821 --- /dev/null +++ b/tasks/codegen/test_operator_surface.py @@ -0,0 +1,126 @@ +"""Tests for the scalar operator surface definition.""" +from tasks.codegen.operator_surface import ( + BLOCKER_ONLY_OPERATORS, + KNOWN_JSONB_OPERATORS, + OPERATORS, + PATH_OPERATORS, + SYMMETRIC_OPERATORS, + backing_function, +) + + +def test_twenty_operators_total(): + """The surface covers supported wrappers plus native jsonb fallbacks.""" + assert len(OPERATORS) == 20 + + +def test_eight_symmetric_operators(): + """8 symmetric boolean operators.""" + assert SYMMETRIC_OPERATORS == ["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] + + +def test_two_path_operators(): + """2 path operators.""" + assert PATH_OPERATORS == ["->", "->>"] + + +def test_ten_blocker_only_jsonb_fallback_operators(): + """Native jsonb operators not otherwise supported are blocker-only.""" + assert BLOCKER_ONLY_OPERATORS == [ + "?", + "?|", + "?&", + "@?", + "@@", + "#>", + "#>>", + "-", + "#-", + "||", + ] + + +def test_no_like_operators(): + """The surface excludes ~~ and ~~* (int4 has no LIKE support).""" + assert "~~" not in OPERATORS + assert "~~*" not in OPERATORS + + +def test_backing_function_names(): + """Each operator maps to its eql_v2 backing function name.""" + assert backing_function("=") == "eq" + assert backing_function("<>") == "neq" + assert backing_function("<") == "lt" + assert backing_function("<=") == "lte" + assert backing_function(">") == "gt" + assert backing_function(">=") == "gte" + assert backing_function("@>") == "contains" + assert backing_function("<@") == "contained_by" + assert backing_function("->") == '"->"' + assert backing_function("->>") == '"->>"' + assert backing_function("?") == '"?"' + assert backing_function("?|") == '"?|"' + assert backing_function("?&") == '"?&"' + assert backing_function("@?") == '"@?"' + assert backing_function("@@") == '"@@"' + assert backing_function("#>") == '"#>"' + assert backing_function("#>>") == '"#>>"' + assert backing_function("-") == '"-"' + assert backing_function("#-") == '"#-"' + assert backing_function("||") == '"||"' + + +def test_selectivity_estimators(): + """Symmetric ops carry RESTRICT/JOIN selectivity estimators.""" + assert OPERATORS["="].restrict == "eqsel" + assert OPERATORS["="].join == "eqjoinsel" + assert OPERATORS["<>"].restrict == "neqsel" + assert OPERATORS["<"].restrict == "scalarltsel" + assert OPERATORS["<="].restrict == "scalarlesel" + assert OPERATORS[">"].restrict == "scalargtsel" + assert OPERATORS[">="].restrict == "scalargesel" + + +def test_negators_and_commutators(): + """= / <> are negators; range ops commute as documented.""" + assert OPERATORS["="].negator == "<>" + assert OPERATORS["<>"].negator == "=" + assert OPERATORS["<"].commutator == ">" + assert OPERATORS["<"].negator == ">=" + assert OPERATORS[">="].commutator == "<=" + + +def test_known_jsonb_operators_is_union_of_the_three_lists(): + """The exported union is exactly the three enumerated lists, deduped.""" + assert KNOWN_JSONB_OPERATORS == frozenset( + SYMMETRIC_OPERATORS + PATH_OPERATORS + BLOCKER_ONLY_OPERATORS + ) + + +def test_known_jsonb_operators_matches_operators_keys(): + """The union must stay in lockstep with the OPERATORS table itself, so a + new operator added to one but not the other is caught here rather than + leaving a hole in the storage-only blocker guarantee.""" + assert KNOWN_JSONB_OPERATORS == frozenset(OPERATORS) + + +def test_known_jsonb_operators_full_native_surface(): + """Pin the full native jsonb operator surface for PG 14-17. This is the + source-of-truth the live-DB structural guard + (tests/sqlx/.../family/jsonb_operator_surface.rs) asserts pg_operator is a + subset of. If PG adds a jsonb operator, that DB test fails; if this list is + edited, both must move together. The three lists are disjoint, so the union + size equals their combined length.""" + assert KNOWN_JSONB_OPERATORS == frozenset( + { + # symmetric (supported wrappers) + "=", "<>", "<", "<=", ">", ">=", "@>", "<@", + # path + "->", "->>", + # blocker-only native jsonb fallbacks + "?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||", + } + ) + assert len(KNOWN_JSONB_OPERATORS) == ( + len(SYMMETRIC_OPERATORS) + len(PATH_OPERATORS) + len(BLOCKER_ONLY_OPERATORS) + ) diff --git a/tasks/codegen/test_scalars.py b/tasks/codegen/test_scalars.py new file mode 100644 index 000000000..3ef7d0f0a --- /dev/null +++ b/tasks/codegen/test_scalars.py @@ -0,0 +1,64 @@ +"""Tests for the scalar-kind catalog driving fixture-value emission.""" + +import pytest + +from tasks.codegen.scalars import ( + ScalarError, + require_scalar, + SCALAR_KINDS, +) + + +def test_int4_kind_fields(): + kind = require_scalar("int4") + assert kind.token == "int4" + assert kind.rust_type == "i32" + assert kind.min_symbol == "i32::MIN" + assert kind.max_symbol == "i32::MAX" + assert kind.zero_symbol == "0" + assert kind.min_value == -2147483648 + assert kind.max_value == 2147483647 + + +def test_render_literal_maps_sentinels(): + kind = require_scalar("int4") + assert kind.render_literal("MIN") == "i32::MIN" + assert kind.render_literal("MAX") == "i32::MAX" + assert kind.render_literal("ZERO") == "0" + + +def test_render_literal_passes_through_numeric(): + kind = require_scalar("int4") + assert kind.render_literal("-100") == "-100" + assert kind.render_literal("0") == "0" + assert kind.render_literal("9999") == "9999" + + +def test_render_literal_rejects_non_numeric(): + kind = require_scalar("int4") + with pytest.raises(ScalarError, match="not a valid i32 literal or sentinel"): + kind.render_literal("oops") + + +def test_render_literal_rejects_out_of_range(): + kind = require_scalar("int4") + with pytest.raises(ScalarError, match="out of range"): + kind.render_literal("2147483648") # i32::MAX + 1 + + +def test_numeric_value_resolves_sentinels_and_literals(): + kind = require_scalar("int4") + assert kind.numeric_value("MIN") == -2147483648 + assert kind.numeric_value("MAX") == 2147483647 + assert kind.numeric_value("ZERO") == 0 + assert kind.numeric_value("42") == 42 + assert kind.numeric_value("-1") == -1 + + +def test_require_scalar_unknown_raises(): + with pytest.raises(ScalarError, match="unknown scalar token 'bogus'"): + require_scalar("bogus") + + +def test_int4_registered_in_catalog(): + assert "int4" in SCALAR_KINDS diff --git a/tasks/codegen/test_spec.py b/tasks/codegen/test_spec.py new file mode 100644 index 000000000..151a03cbd --- /dev/null +++ b/tasks/codegen/test_spec.py @@ -0,0 +1,208 @@ +"""Tests for the scalar-domain manifest loader.""" + +import textwrap + +import pytest + +from tasks.codegen.spec import DomainSpec, SpecError, TypeSpec, load_spec + + +VALID_TOML = textwrap.dedent(""" + [domain] + int4 = [] + int4_eq = ["hm"] + int4_ord_ore = ["ore"] + int4_ord = ["ore"] +""") + + +def write(tmp_path, name, text): + p = tmp_path / name + p.write_text(text) + return p + + +def test_loads_valid_manifest_and_infers_token_from_filename(tmp_path): + spec = load_spec(write(tmp_path, "int4.toml", VALID_TOML)) + assert isinstance(spec, TypeSpec) + assert spec.token == "int4" + assert spec.domains == [ + DomainSpec(name="int4", terms=[]), + DomainSpec(name="int4_eq", terms=["hm"]), + DomainSpec(name="int4_ord_ore", terms=["ore"]), + DomainSpec(name="int4_ord", terms=["ore"]), + ] + + +def test_missing_domain_table_raises(tmp_path): + with pytest.raises(SpecError, match="missing required table '\\[domain\\]'"): + load_spec(write(tmp_path, "int4.toml", "")) + + +def test_empty_domain_table_raises(tmp_path): + with pytest.raises(SpecError, match="at least one domain"): + load_spec(write(tmp_path, "int4.toml", "[domain]\n")) + + +def test_domain_value_must_be_list(tmp_path): + bad = textwrap.dedent(""" + [domain] + int4_eq = "hm" + """) + with pytest.raises(SpecError, match="must be a list of term names"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_domain_term_must_be_string(tmp_path): + bad = textwrap.dedent(""" + [domain] + int4_eq = [1] + """) + with pytest.raises(SpecError, match="term names must be strings"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_unknown_term_raises_with_domain_context(tmp_path): + bad = textwrap.dedent(""" + [domain] + int4_eq = ["bogus"] + """) + with pytest.raises(SpecError, match="\\[domain\\] int4_eq: unknown term 'bogus'"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_domain_name_must_start_with_type_token(tmp_path): + bad = textwrap.dedent(""" + [domain] + text = [] + """) + with pytest.raises(SpecError, match="domain name must start with 'int4'"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_domain_name_must_be_token_or_token_underscore(tmp_path): + bad = textwrap.dedent(""" + [domain] + int4xfoo = [] + """) + with pytest.raises(SpecError, match="domain name must start with 'int4'"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +@pytest.mark.parametrize("filename", [ + "Int4.toml", + "int-4.toml", + "int 4.toml", + "4int.toml", + "int4;drop.toml", +]) +def test_token_must_be_sql_identifier(tmp_path, filename): + with pytest.raises(SpecError, match=r"token .* must match"): + load_spec(write(tmp_path, filename, VALID_TOML)) + + +@pytest.mark.parametrize("bad_name", [ + "int4-eq", + "int4 eq", + "INT4_eq", + "int4;drop", +]) +def test_domain_name_must_be_sql_identifier(tmp_path, bad_name): + bad = textwrap.dedent(f""" + [domain] + "{bad_name}" = [] + """) + with pytest.raises(SpecError, match=r"domain name .* must match"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +FIXTURE_TOML = VALID_TOML + textwrap.dedent(""" + [fixture] + values = ["MIN", "-100", "-1", "ZERO", "1", "9999", "MAX"] +""") + + +def test_fixture_values_default_to_none_when_absent(tmp_path): + spec = load_spec(write(tmp_path, "int4.toml", VALID_TOML)) + assert spec.fixture_values is None + + +def test_loads_fixture_values_when_present(tmp_path): + spec = load_spec(write(tmp_path, "int4.toml", FIXTURE_TOML)) + assert spec.fixture_values == [ + "MIN", "-100", "-1", "ZERO", "1", "9999", "MAX", + ] + + +def test_fixture_values_must_be_a_list(tmp_path): + bad = VALID_TOML + '\n[fixture]\nvalues = "MIN"\n' + with pytest.raises(SpecError, match=r"\[fixture\] values: must be a list"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_table_requires_values_key(tmp_path): + bad = VALID_TOML + "\n[fixture]\nother = 1\n" + with pytest.raises(SpecError, match=r"\[fixture\]: missing required key 'values'"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_values_must_be_non_empty(tmp_path): + bad = VALID_TOML + "\n[fixture]\nvalues = []\n" + with pytest.raises(SpecError, match=r"\[fixture\] values: must not be empty"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_values_must_be_strings(tmp_path): + bad = VALID_TOML + "\n[fixture]\nvalues = [1, 2]\n" + with pytest.raises(SpecError, match=r"\[fixture\] values: must be strings"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_values_reject_invalid_literal(tmp_path): + bad = VALID_TOML + '\n[fixture]\nvalues = ["MIN", "oops", "ZERO", "MAX"]\n' + with pytest.raises(SpecError, match="not a valid i32 literal"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_values_require_min_max_zero(tmp_path): + bad = VALID_TOML + '\n[fixture]\nvalues = ["1", "2", "3"]\n' + with pytest.raises(SpecError, match="must include MIN, MAX, and zero"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_values_require_max_even_if_min_and_zero_present(tmp_path): + bad = VALID_TOML + '\n[fixture]\nvalues = ["MIN", "ZERO", "1"]\n' + with pytest.raises(SpecError, match="must include MIN, MAX, and zero"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_values_reject_duplicate_literal(tmp_path): + bad = VALID_TOML + '\n[fixture]\nvalues = ["MIN", "1", "ZERO", "1", "MAX"]\n' + with pytest.raises(SpecError, match=r"must be distinct.*duplicate values.*'1'"): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_values_reject_sentinel_literal_alias(tmp_path): + # "MIN" and the i32::MIN literal resolve to the same plaintext value; + # the distinct-plaintext contract must reject the pair. + bad = ( + VALID_TOML + + '\n[fixture]\nvalues = ["MIN", "-2147483648", "ZERO", "MAX"]\n' + ) + with pytest.raises( + SpecError, + match=r"must be distinct.*'-2147483648' duplicates 'MIN' \(both resolve to -2147483648\)", + ): + load_spec(write(tmp_path, "int4.toml", bad)) + + +def test_fixture_for_unknown_scalar_token_raises(tmp_path): + bad = textwrap.dedent(""" + [domain] + int8 = [] + + [fixture] + values = ["1"] + """) + with pytest.raises(SpecError, match="unknown scalar token 'int8'"): + load_spec(write(tmp_path, "int8.toml", bad)) diff --git a/tasks/codegen/test_templates.py b/tasks/codegen/test_templates.py new file mode 100644 index 000000000..ba1e3b7d0 --- /dev/null +++ b/tasks/codegen/test_templates.py @@ -0,0 +1,499 @@ +"""Tests for per-construct SQL template functions.""" + +from tasks.codegen.spec import DomainSpec, TypeSpec +from tasks.codegen.templates import ( + AGGREGATE_OPS, + AUTO_GENERATED_HEADER, + AUTO_GENERATED_HEADER_RS, + _sql_str, + brief_role_clause, + domain_name, + extractor_for_operator, + is_ord_capable, + render_aggregate, + render_blocker_bool, + render_blocker_native, + render_blocker_path, + render_domain_block, + render_extractor, + render_fixture_values_rs, + render_operator, + render_wrapper, +) +from tasks.codegen.terms import TERM_CATALOG + + +def test_auto_generated_header_present(): + assert "AUTO-GENERATED" in AUTO_GENERATED_HEADER + assert "DO NOT EDIT" in AUTO_GENERATED_HEADER + + +def test_rust_header_is_comment_and_marks_committed(): + # Rust uses // comments, not SQL's --, and unlike the gitignored SQL + # surface this file is committed and CI-verified. + assert AUTO_GENERATED_HEADER_RS.startswith("// AUTO-GENERATED") + assert "DO NOT EDIT" in AUTO_GENERATED_HEADER_RS + assert "committed" in AUTO_GENERATED_HEADER_RS + # No line is an SQL-style (`--`) comment — this is Rust, not SQL. + assert not any( + line.startswith("--") for line in AUTO_GENERATED_HEADER_RS.splitlines() + ) + + +def test_render_fixture_values_rs_emits_typed_const(): + spec = TypeSpec( + token="int4", + domains=[], + fixture_values=["MIN", "-1", "ZERO", "1", "MAX"], + ) + body = render_fixture_values_rs(spec) + assert "pub const VALUES: &[i32] = &[" in body + assert "tasks/codegen/types/int4.toml" in body + # Sentinels map to named consts; numeric tokens pass through. + assert "i32::MIN," in body + assert "i32::MAX," in body + assert " -1,\n" in body + assert " 0,\n" in body # ZERO and "1" both literal + assert " 1,\n" in body + # No AUTO-GENERATED header in the body — the writer prepends it. + assert "AUTO-GENERATED" not in body + + +def test_render_fixture_values_rs_preserves_manifest_order(): + spec = TypeSpec( + token="int4", + domains=[], + fixture_values=["MIN", "ZERO", "MAX"], + ) + body = render_fixture_values_rs(spec) + assert body.index("i32::MIN") < body.index("0,") < body.index("i32::MAX") + + +def test_domain_block_storage_uses_fixed_envelope_only(): + domain = DomainSpec(name="int4", terms=[]) + sql = render_domain_block(domain, "int4") + assert "CREATE DOMAIN public.eql_v2_int4 AS jsonb" in sql + assert "VALUE ? 'v'" in sql + assert "VALUE ? 'i'" in sql + assert "VALUE ? 'c'" in sql + assert "VALUE ? 'hm'" not in sql + assert "VALUE ? 'ob'" not in sql + + +def test_domain_block_uses_catalog_json_keys(): + domain = DomainSpec(name="int4_ord", terms=["ore"]) + sql = render_domain_block(domain, "int4") + assert "CREATE DOMAIN public.eql_v2_int4_ord AS jsonb" in sql + assert "VALUE ? 'ob'" in sql + assert "VALUE ? 'ore'" not in sql + + +def test_domain_block_check_pins_envelope_version(): + """Thread D: the CHECK both verifies the envelope `v` key is PRESENT and + pins its value to the EQL payload-format version (2), matching the + repo-wide eql_v2._encrypted_check_v rule. The v=1 payloads in + tests/sqlx/fixtures/aggregate_minmax_data.sql belong to the separate + composite-type (eql_v2_encrypted) aggregate stream, not these domains, so + pinning the value here rejects stale/foreign-version payloads without + affecting that fixture.""" + for domain in ( + DomainSpec(name="int4", terms=[]), + DomainSpec(name="int4_eq", terms=["hm"]), + DomainSpec(name="int4_ord", terms=["ore"]), + ): + sql = render_domain_block(domain, "int4") + assert "VALUE ? 'v'" in sql # presence checked + assert "VALUE->>'v' = '2'" in sql # value pinned to version 2 + + +def test_extractor_is_catalog_derived_and_inlinable(): + domain = DomainSpec(name="int4_eq", terms=["hm"]) + sql = render_extractor(domain, TERM_CATALOG["hm"]) + assert "CREATE FUNCTION eql_v2.eq_term(a eql_v2_int4_eq)" in sql + assert "RETURNS eql_v2.hmac_256" in sql + assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" in sql + assert "SELECT eql_v2.hmac_256(a::jsonb)" in sql + assert "SET search_path" not in sql + + +def test_wrapper_uses_term_extractor_for_supported_operator(): + domain = DomainSpec(name="int4_ord", terms=["ore"]) + sql = render_wrapper( + domain, + op="<", + arg_a="eql_v2_int4_ord", + arg_b="jsonb", + extractor="ord_term", + ) + assert "CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b jsonb)" in sql + assert "SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b::eql_v2_int4_ord)" in sql + + +def test_wrapper_is_inlinable_sql(): + """Wrappers must be single-statement LANGUAGE sql with no search_path pin.""" + domain = DomainSpec(name="int4_eq", terms=["hm"]) + sql = render_wrapper( + domain, + op="=", + arg_a="eql_v2_int4_eq", + arg_b="eql_v2_int4_eq", + extractor="eq_term", + ) + assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" in sql + assert "SET search_path" not in sql + assert "LANGUAGE plpgsql" not in sql + + +def test_extractor_for_operator_selects_catalog_term(): + domain = DomainSpec(name="int4_ord", terms=["ore"]) + assert extractor_for_operator(domain, "=") == "ord_term" + assert extractor_for_operator(domain, "<") == "ord_term" + + +def test_extractor_for_operator_returns_none_for_unsupported_operator(): + domain = DomainSpec(name="int4_eq", terms=["hm"]) + assert extractor_for_operator(domain, "<") is None + + +def test_blocker_bool_is_not_strict(): + """Footgun: a STRICT blocker lets Postgres skip the body on NULL input, + silently bypassing the 'operator not supported' raise. Assert the exact + attribute line so any future refactor that re-adds STRICT fails loudly.""" + domain = DomainSpec(name="int4", terms=[]) + sql = render_blocker_bool( + domain, op="<", arg_a="eql_v2_int4", arg_b="eql_v2_int4", + ) + assert "CREATE FUNCTION eql_v2.lt(a eql_v2_int4, b eql_v2_int4)" in sql + assert "encrypted_domain_unsupported_bool('eql_v2_int4', '<')" in sql + assert "RETURNS boolean IMMUTABLE PARALLEL SAFE\n" in sql + assert "LANGUAGE plpgsql" in sql + assert "STRICT" not in sql + + +def test_blocker_path_is_not_strict(): + """Mirror of test_blocker_bool_is_not_strict for path blockers.""" + domain = DomainSpec(name="int4", terms=[]) + sql = render_blocker_path( + domain, op="->", arg_a="eql_v2_int4", arg_b="text", + ) + assert "RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE\n" in sql + assert "LANGUAGE plpgsql" in sql + assert "STRICT" not in sql + + +def test_blocker_path_returns_domain_or_text(): + domain = DomainSpec(name="int4", terms=[]) + arrow = render_blocker_path( + domain, op="->", arg_a="eql_v2_int4", arg_b="text", + ) + assert 'CREATE FUNCTION eql_v2."->"(a eql_v2_int4, selector text)' in arrow + assert "RETURNS eql_v2_int4" in arrow + arrow2 = render_blocker_path( + domain, op="->>", arg_a="eql_v2_int4", arg_b="text", + ) + assert "RETURNS text" in arrow2 + + +def test_blocker_path_for_jsonb_left_arg_returns_domain(): + """The (jsonb, dom) shape from _path_shapes still routes to the domain + return type for `->` (only `->>` returns text).""" + domain = DomainSpec(name="int4", terms=[]) + sql = render_blocker_path( + domain, op="->", arg_a="jsonb", arg_b="eql_v2_int4", + ) + assert 'CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4)' in sql + assert "RETURNS eql_v2_int4" in sql + + +def test_blocker_native_bool_uses_helper_and_is_not_strict(): + domain = DomainSpec(name="int4", terms=[]) + sql = render_blocker_native( + domain, op="?", arg_a="eql_v2_int4", arg_b="text", returns="boolean", + ) + assert 'CREATE FUNCTION eql_v2."?"(a eql_v2_int4, b text)' in sql + assert "encrypted_domain_unsupported_bool('eql_v2_int4', '?')" in sql + assert "RETURNS boolean IMMUTABLE PARALLEL SAFE\n" in sql + assert "LANGUAGE plpgsql" in sql + assert "STRICT" not in sql + + +def test_blocker_native_jsonb_result_raises_and_is_not_strict(): + domain = DomainSpec(name="int4", terms=[]) + sql = render_blocker_native( + domain, op="#>", arg_a="eql_v2_int4", arg_b="text[]", returns="jsonb", + ) + assert 'CREATE FUNCTION eql_v2."#>"(a eql_v2_int4, b text[])' in sql + assert "RETURNS jsonb IMMUTABLE PARALLEL SAFE\n" in sql + assert "RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4'" in sql + assert "LANGUAGE plpgsql" in sql + assert "STRICT" not in sql + + +def test_blocker_native_text_result_raises_and_is_not_strict(): + domain = DomainSpec(name="int4", terms=[]) + sql = render_blocker_native( + domain, op="#>>", arg_a="eql_v2_int4", arg_b="text[]", returns="text", + ) + assert 'CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4, b text[])' in sql + assert "RETURNS text IMMUTABLE PARALLEL SAFE\n" in sql + assert "LANGUAGE plpgsql" in sql + assert "STRICT" not in sql + + +def test_blocker_native_concat_cross_shape(): + domain = DomainSpec(name="int4", terms=[]) + sql = render_blocker_native( + domain, op="||", arg_a="jsonb", arg_b="eql_v2_int4", returns="jsonb", + ) + assert 'CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4)' in sql + assert "RETURNS jsonb" in sql + + +def test_operator_symmetric_metadata(): + sql = render_operator( + op="=", backing="eq", + leftarg="eql_v2_int4_eq", rightarg="eql_v2_int4_eq", + supported=True, + ) + assert "CREATE OPERATOR = (" in sql + assert "FUNCTION = eql_v2.eq" in sql + assert "LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq" in sql + assert "NEGATOR = <>" in sql + assert "RESTRICT = eqsel" in sql + + +def test_render_operator_unsupported_emits_only_function_and_args(): + """Unsupported routing must not emit NEGATOR / RESTRICT / JOIN / COMMUTATOR + (those would lie about selectivity for a function that always raises).""" + sql = render_operator( + op="=", backing="eq", + leftarg="eql_v2_int4", rightarg="eql_v2_int4", + supported=False, + ) + assert "CREATE OPERATOR = (" in sql + assert "FUNCTION = eql_v2.eq" in sql + assert "LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4" in sql + assert "NEGATOR" not in sql + assert "RESTRICT" not in sql + assert "JOIN" not in sql + assert "COMMUTATOR" not in sql + + +def test_render_aggregate_min_int4_ord_emits_state_function_and_aggregate(): + """Pin the rendered shape for the canonical (int4_ord, min) case.""" + domain = DomainSpec(name="int4_ord", terms=["ore"]) + sql = render_aggregate(domain, AGGREGATE_OPS["min"]) + assert "CREATE FUNCTION eql_v2.min_sfunc(state eql_v2_int4_ord, value eql_v2_int4_ord)" in sql + assert "RETURNS eql_v2_int4_ord" in sql + assert "LANGUAGE plpgsql IMMUTABLE STRICT" in sql + assert "SET search_path = pg_catalog, extensions, public" in sql + assert "IF value < state THEN" in sql + assert "CREATE AGGREGATE eql_v2.min(eql_v2_int4_ord) (" in sql + assert "sfunc = eql_v2.min_sfunc" in sql + assert "stype = eql_v2_int4_ord" in sql + + +def test_render_aggregate_max_uses_greater_than_comparator(): + """Symmetric pin: max uses `>` not `<`.""" + domain = DomainSpec(name="int4_ord_ore", terms=["ore"]) + sql = render_aggregate(domain, AGGREGATE_OPS["max"]) + assert "CREATE FUNCTION eql_v2.max_sfunc(state eql_v2_int4_ord_ore, value eql_v2_int4_ord_ore)" in sql + assert "IF value > state THEN" in sql + assert "CREATE AGGREGATE eql_v2.max(eql_v2_int4_ord_ore) (" in sql + + +def test_render_aggregate_state_function_is_not_inlinable(): + """Footgun mirror: blockers must be LANGUAGE plpgsql; the state function + deliberately is too, so the planner can't elide an IMMUTABLE STRICT + aggregate state call away. STRICT + plpgsql + SET search_path together.""" + domain = DomainSpec(name="int4_ord", terms=["ore"]) + sql = render_aggregate(domain, AGGREGATE_OPS["min"]) + assert "LANGUAGE plpgsql" in sql + assert "STRICT" in sql + # Inlinable-SQL shape — explicitly absent. + assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" not in sql + + +def test_is_ord_capable_matches_role(): + assert is_ord_capable(DomainSpec(name="int4_ord", terms=["ore"])) is True + assert is_ord_capable(DomainSpec(name="int4_ord_ore", terms=["ore"])) is True + assert is_ord_capable(DomainSpec(name="int4_eq", terms=["hm"])) is False + assert is_ord_capable(DomainSpec(name="int4", terms=[])) is False + + +def test_render_operator_for_containment_omits_commutator(): + """@> has no commutator / negator / selectivity in OPERATORS; supported=True + must still omit those clauses.""" + sql = render_operator( + op="@>", backing="contains", + leftarg="eql_v2_int4_ord", rightarg="eql_v2_int4_ord", + supported=True, + ) + assert "CREATE OPERATOR @> (" in sql + assert "FUNCTION = eql_v2.contains" in sql + assert "COMMUTATOR" not in sql + assert "NEGATOR" not in sql + assert "RESTRICT" not in sql + assert "JOIN" not in sql + + +# --- ITEM A: placeholder/blocker operator comment ------------------------- + + +def test_render_operator_unsupported_emits_placeholder_comment(): + """Thread A: a blocker-backed (unsupported) operator must carry a leading + SQL comment explaining it is a placeholder that raises, so a future + reviewer doesn't wonder why an ordering op is declared on an eq-only + domain.""" + sql = render_operator( + op="<", backing="lt", + leftarg="eql_v2_int4_eq", rightarg="eql_v2_int4_eq", + supported=False, + ) + assert sql.startswith("-- Placeholder:") + assert "does not support <" in sql + assert "always raises" in sql + # The comment precedes the CREATE OPERATOR. + assert sql.index("-- Placeholder:") < sql.index("CREATE OPERATOR") + + +def test_render_operator_supported_has_no_placeholder_comment(): + """Supported operators route to real wrappers — no placeholder comment.""" + sql = render_operator( + op="=", backing="eq", + leftarg="eql_v2_int4_eq", rightarg="eql_v2_int4_eq", + supported=True, + ) + assert "Placeholder" not in sql + + +# --- ITEM B & J: aggregate SQL rationale comments ------------------------- + + +def test_render_aggregate_state_function_emits_plpgsql_rationale_comment(): + """Thread B: the plpgsql rationale must appear in the emitted SQL (not just + as a Python comment) so a SQL reader sees why it isn't an inlinable + LANGUAGE sql CASE.""" + domain = DomainSpec(name="int4_ord", terms=["ore"]) + sql = render_aggregate(domain, AGGREGATE_OPS["min"]) + assert "-- LANGUAGE plpgsql, not sql:" in sql + assert "not index" in sql + # The rationale precedes the state-function definition. + assert sql.index("-- LANGUAGE plpgsql, not sql:") < sql.index( + "CREATE FUNCTION eql_v2.min_sfunc" + ) + + +def test_render_aggregate_enables_parallel_and_combinefunc(): + """Thread #22: MIN/MAX aggregates declare a combine function (the state + function itself — min/max are associative) and PARALLEL = SAFE, so PG can + use partial/parallel aggregation on the large GROUP BY workloads these ORE + aggregates exist to serve. The sfunc is likewise PARALLEL SAFE.""" + for op_name, sfunc in (("min", "min_sfunc"), ("max", "max_sfunc")): + domain = DomainSpec(name="int4_ord", terms=["ore"]) + sql = render_aggregate(domain, AGGREGATE_OPS[op_name]) + # The state function must be parallel-safe... + assert "LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE" in sql + # ...and the aggregate must declare the combinefunc + parallel safety + # inside the CREATE AGGREGATE option list (not merely in prose). + aggregate_body = sql[sql.index(f"CREATE AGGREGATE eql_v2.{op_name}"):] + assert f"combinefunc = eql_v2.{sfunc}" in aggregate_body + assert "parallel = safe" in aggregate_body + # The stale "intentionally disabled" omission note must be gone. + assert "intentionally disabled" not in sql + assert "-- No COMBINEFUNC" not in sql + + +# --- ITEM K: differentiated @brief for converged vs scheme-explicit ------- + + +def test_domain_brief_distinguishes_converged_from_scheme_twin(): + """Thread K: int4_ord (converged) and int4_ord_ore (scheme twin) carry the + same terms but must render distinct, sensible briefs.""" + ord_dom = DomainSpec(name="int4_ord", terms=["ore"]) + ore_dom = DomainSpec(name="int4_ord_ore", terms=["ore"]) + ord_sql = render_domain_block(ord_dom, "int4") + ore_sql = render_domain_block(ore_dom, "int4") + + ord_brief = next( + line for line in ord_sql.splitlines() if "@brief" in line + ) + ore_brief = next( + line for line in ore_sql.splitlines() if "@brief" in line + ) + # Both still lead with the role phrase... + assert "Ordered encrypted int4 domain." in ord_brief + assert "Ordered encrypted int4 domain." in ore_brief + # ...but the trailing clause differs and reads sensibly. + assert ord_brief != ore_brief + assert "Recommended converged name" in ord_brief + assert "Scheme-explicit twin" in ore_brief + assert "ore scheme" in ore_brief + assert "int4_ord" in ore_brief # points back at the converged name + + +def test_brief_role_clause_is_generic_over_token_and_scheme(): + """The disambiguation reads token/role/scheme from the name, not a + hard-coded literal — so it works for other types (int8) and schemes.""" + # Converged ordered name for a different token. + assert "Recommended converged name" in brief_role_clause( + DomainSpec(name="int8_ord", terms=["ore"]), "int8" + ) + # Scheme-explicit twin with a hypothetical non-ore scheme label. + clause = brief_role_clause( + DomainSpec(name="date_ord_lex", terms=["ore"]), "date" + ) + assert "Scheme-explicit twin" in clause + assert "lex scheme" in clause + assert "date_ord" in clause + + +def test_brief_role_clause_empty_for_storage_and_eq(): + """Storage and eq domains have no converged/twin ambiguity (only one name + each), so they get no disambiguating clause — brief stays unchanged.""" + assert brief_role_clause(DomainSpec(name="int4", terms=[]), "int4") == "" + assert brief_role_clause( + DomainSpec(name="int4_eq", terms=["hm"]), "int4" + ) == "" + + +# --- THREAD 1: SQL-string interpolation hardening ------------------------- + + +def test_sql_str_doubles_single_quotes(): + """_sql_str doubles embedded single quotes so a value can't break out of + its SQL string literal.""" + assert _sql_str("o'brien") == "o''brien" + assert _sql_str("a'b'c") == "a''b''c" + # Quote-free input is unchanged — current catalog strings stay byte-stable. + assert _sql_str("int4_eq") == "int4_eq" + assert _sql_str("<=") == "<=" + + +def test_blocker_escapes_quote_bearing_domain_in_rendered_sql(): + """A hypothetical quote-bearing domain name must be doubled inside the + helper-call string literal in the rendered blocker, not interpolated raw. + + (op can't carry a quote in practice — it's looked up in the operator + catalog — so the domain name is the live escaping path through the blocker + string literals.)""" + domain = DomainSpec(name="o'dom", terms=[]) + sql = render_blocker_bool( + domain, op="<", arg_a="eql_v2_o'dom", arg_b="eql_v2_o'dom", + ) + # The dom flows into encrypted_domain_unsupported_bool('', '') + # as a single-quoted literal — the quote must be doubled. + assert "encrypted_domain_unsupported_bool('eql_v2_o''dom', '<')" in sql + # The raw, unescaped single-quoted form must not appear. + assert "'eql_v2_o'dom'" not in sql + + +def test_domain_block_escapes_quote_bearing_key_in_check(): + """A hypothetical quote-bearing payload key must be doubled inside the + VALUE ? '' check rather than interpolated raw.""" + # A term-free domain whose name carries a quote exercises the typname + # literal escaping in the IF NOT EXISTS guard. + quoted = DomainSpec(name="we'ird", terms=[]) + sql = render_domain_block(quoted, "int4") + assert "typname = 'eql_v2_we''ird'" in sql + assert "typname = 'eql_v2_we'ird'" not in sql diff --git a/tasks/codegen/test_terms.py b/tasks/codegen/test_terms.py new file mode 100644 index 000000000..8ac7aa4be --- /dev/null +++ b/tasks/codegen/test_terms.py @@ -0,0 +1,96 @@ +"""Tests for the fixed scalar-domain term catalog.""" + +import pytest + +from tasks.codegen.terms import ( + TermError, + extractor_for_operator, + operators_for_terms, + require_terms, + role_for_terms, + term_json_keys, + term_requires, +) + + +def test_hm_term_provides_equality(): + terms = require_terms(["hm"]) + hm = terms[0] + assert hm.name == "hm" + assert hm.json_key == "hm" + assert hm.extractor == "eq_term" + assert hm.returns == "eql_v2.hmac_256" + assert hm.ctor == "hmac_256" + assert hm.role == "eq" + assert hm.operators == ("=", "<>") + assert hm.requires == ("src/hmac_256/functions.sql",) + + +def test_ore_term_preserves_existing_int4_sql_contract(): + terms = require_terms(["ore"]) + ore = terms[0] + assert ore.name == "ore" + assert ore.json_key == "ob" + assert ore.extractor == "ord_term" + assert ore.returns == "eql_v2.ore_block_u64_8_256" + assert ore.ctor == "ore_block_u64_8_256" + assert ore.role == "ord" + assert ore.operators == ("=", "<>", "<", "<=", ">", ">=") + assert ore.requires == ( + "src/ore_block_u64_8_256/functions.sql", + "src/ore_block_u64_8_256/operators.sql", + ) + + +def test_unknown_term_raises(): + with pytest.raises(TermError, match="unknown term 'bogus'"): + require_terms(["bogus"]) + + +def test_operators_are_union_in_catalog_order(): + assert operators_for_terms(["ore", "hm"]) == [ + "=", "<>", "<", "<=", ">", ">=", + ] + + +def test_json_keys_come_from_catalog_not_manifest_names(): + assert term_json_keys(["hm", "ore"]) == ["hm", "ob"] + + +def test_term_requires_are_deduplicated(): + assert term_requires(["ore", "ore", "hm"]) == [ + "src/ore_block_u64_8_256/functions.sql", + "src/ore_block_u64_8_256/operators.sql", + "src/hmac_256/functions.sql", + ] + + +def test_role_for_terms_handles_storage_eq_ord(): + assert role_for_terms([]) == "storage" + assert role_for_terms(["hm"]) == "eq" + assert role_for_terms(["ore"]) == "ord" + + +def test_operators_for_terms_handles_empty_list(): + assert operators_for_terms([]) == [] + + +def test_term_json_keys_handles_empty_list(): + assert term_json_keys([]) == [] + + +def test_term_requires_handles_empty_list(): + assert term_requires([]) == [] + + +def test_extractor_for_operator_picks_first_term_supporting_op(): + assert extractor_for_operator(["hm"], "=") == "eq_term" + assert extractor_for_operator(["ore"], "<") == "ord_term" + # Multi-term domains: first supporting term wins. + assert extractor_for_operator(["hm", "ore"], "=") == "eq_term" + assert extractor_for_operator(["hm", "ore"], "<") == "ord_term" + + +def test_extractor_for_operator_returns_none_when_no_term_supports_op(): + assert extractor_for_operator(["hm"], "<") is None + assert extractor_for_operator([], "=") is None diff --git a/tasks/codegen/test_writer.py b/tasks/codegen/test_writer.py new file mode 100644 index 000000000..81805cb18 --- /dev/null +++ b/tasks/codegen/test_writer.py @@ -0,0 +1,157 @@ +"""Tests for the ownership / overwrite-refusal / stale-cleanup rules.""" +import pytest +from tasks.codegen.generate import REPO_ROOT +from tasks.codegen.templates import AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS +from tasks.codegen.writer import ( + _MARKER, + OwnershipError, + is_generated, + is_generated_rs, + clean_generated_files, + ensure_generated_paths_writable, + write_generated_file, + write_generated_rs, +) + + +_EXPECTED_SUFFIXES = ( + "_types.sql", + "_functions.sql", + "_operators.sql", + "_aggregates.sql", + "_extensions.sql", +) + + +def test_is_generated_true_for_header(tmp_path): + p = tmp_path / "x.sql" + p.write_text(AUTO_GENERATED_HEADER + "SELECT 1;\n") + assert is_generated(p) is True + + +def test_is_generated_false_for_handwritten(tmp_path): + p = tmp_path / "x.sql" + p.write_text("-- REQUIRE: src/schema.sql\nSELECT 1;\n") + assert is_generated(p) is False + + +def test_is_generated_true_for_crlf_header(tmp_path): + p = tmp_path / "x.sql" + p.write_bytes((_MARKER + "\r\n" + "SELECT 1;\n").encode("utf-8")) + assert is_generated(p) is True + + +def test_write_generated_file_creates_with_header(tmp_path): + p = tmp_path / "int4_types.sql" + write_generated_file(p, "DO $$ BEGIN END $$;\n") + text = p.read_text() + assert text.startswith(AUTO_GENERATED_HEADER) + assert "DO $$ BEGIN END $$;" in text + + +def test_write_refuses_to_overwrite_handwritten(tmp_path): + """Refuse to clobber a hand-written file at a generated path.""" + p = tmp_path / "int4_types.sql" + p.write_text("-- REQUIRE: src/schema.sql\n-- hand-written\n") + with pytest.raises(OwnershipError, match="hand-written"): + write_generated_file(p, "DO $$ BEGIN END $$;\n") + + +def test_preflight_refuses_handwritten_target_before_cleanup(tmp_path): + generated = tmp_path / "int4_types.sql" + hand = tmp_path / "int4_eq_functions.sql" + generated.write_text(AUTO_GENERATED_HEADER + "-- old generated\n") + hand.write_text("-- REQUIRE: src/schema.sql\n-- hand-written\n") + + with pytest.raises(OwnershipError, match=r"int4_eq_functions\.sql"): + ensure_generated_paths_writable([generated, hand]) + + assert generated.exists() + assert hand.exists() + + +def test_write_overwrites_existing_generated_file(tmp_path): + """A file that already carries the header may be overwritten.""" + p = tmp_path / "int4_types.sql" + p.write_text(AUTO_GENERATED_HEADER + "-- old content\n") + write_generated_file(p, "-- new content\n") + text = p.read_text() + assert "-- new content" in text + assert "-- old content" not in text + + +def test_clean_removes_only_generated_files(tmp_path): + """Clean deletes every generated file, keeps the rest.""" + gen1 = tmp_path / "int4_eq_functions.sql" + gen2 = tmp_path / "int4_old_domain_functions.sql" # stale orphan + hand = tmp_path / "int4_jsonb_extra.sql" + gen1.write_text(AUTO_GENERATED_HEADER + "SELECT 1;\n") + gen2.write_text(AUTO_GENERATED_HEADER + "SELECT 2;\n") + hand.write_text("-- REQUIRE: src/schema.sql\n-- hand-written\n") + + removed = clean_generated_files(tmp_path) + + assert not gen1.exists() + assert not gen2.exists() # stale orphan cleaned up + assert hand.exists() # hand-written file untouched + assert set(removed) == {gen1, gen2} + + +def test_clean_on_empty_directory(tmp_path): + """Clean on a greenfield directory removes nothing and does not error.""" + removed = clean_generated_files(tmp_path) + assert removed == [] + + +def test_write_generated_rs_creates_with_rust_header(tmp_path): + p = tmp_path / "int4_values.rs" + write_generated_rs(p, "pub const VALUES: &[i32] = &[];\n") + text = p.read_text() + assert text.startswith(AUTO_GENERATED_HEADER_RS) + assert "pub const VALUES" in text + + +def test_is_generated_rs_true_for_rust_header(tmp_path): + p = tmp_path / "int4_values.rs" + p.write_text(AUTO_GENERATED_HEADER_RS + "pub const VALUES: &[i32] = &[];\n") + assert is_generated_rs(p) is True + + +def test_is_generated_rs_false_for_handwritten(tmp_path): + p = tmp_path / "int4_values.rs" + p.write_text("//! hand-written\npub const VALUES: &[i32] = &[];\n") + assert is_generated_rs(p) is False + + +def test_write_generated_rs_refuses_to_overwrite_handwritten(tmp_path): + p = tmp_path / "int4_values.rs" + p.write_text("//! hand-written\n") + with pytest.raises(OwnershipError, match="hand-written"): + write_generated_rs(p, "pub const VALUES: &[i32] = &[];\n") + + +def test_write_generated_rs_overwrites_existing_generated(tmp_path): + p = tmp_path / "int4_values.rs" + p.write_text(AUTO_GENERATED_HEADER_RS + "// old\n") + write_generated_rs(p, "// new\n") + text = p.read_text() + assert "// new" in text + assert "// old" not in text + + +def test_no_misnamed_sql_files_in_generated_dirs(): + """Files under src/encrypted_domain// must end in one of the four + documented suffixes — catches mistakes like `int4_extension.sql` + (singular), which the build would silently include despite violating + the documented convention.""" + root = REPO_ROOT / "src" / "encrypted_domain" + misnamed = [ + path.relative_to(REPO_ROOT) + for type_dir in root.iterdir() if type_dir.is_dir() + for path in sorted(type_dir.glob("*.sql")) + if not path.name.endswith(_EXPECTED_SUFFIXES) + ] if root.is_dir() else [] + assert not misnamed, ( + f"misnamed SQL files in src/encrypted_domain/ — expected suffix in " + f"{_EXPECTED_SUFFIXES}: {misnamed}" + ) diff --git a/tasks/codegen/types/.gitkeep b/tasks/codegen/types/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tasks/codegen/types/int4.toml b/tasks/codegen/types/int4.toml new file mode 100644 index 000000000..606d80ee4 --- /dev/null +++ b/tasks/codegen/types/int4.toml @@ -0,0 +1,19 @@ +# Encrypted-domain scalar manifest for int4. +# The filename supplies the type token. Each domain lists the index terms +# it carries; term capabilities are fixed in tasks/codegen/terms.py. + +[domain] +int4 = [] +int4_eq = ["hm"] +int4_ord_ore = ["ore"] +int4_ord = ["ore"] + +# Single source of truth for the int4 fixture plaintext list. Drives the +# generated tests/sqlx/src/fixtures/int4_values.rs const, shared by the fixture +# generator and the matrix oracle. Sentinels MIN/MAX/ZERO map to i32 named +# consts; the set MUST include MIN, MAX, and zero (matrix comparison pivots). +[fixture] +values = [ + "MIN", "-100", "-1", "ZERO", "1", "2", "5", "10", "17", "25", + "42", "50", "100", "250", "1000", "9999", "MAX", +] diff --git a/tasks/codegen/writer.py b/tasks/codegen/writer.py new file mode 100644 index 000000000..aa0cdd99b --- /dev/null +++ b/tasks/codegen/writer.py @@ -0,0 +1,89 @@ +"""File writer enforcing the AUTO-GENERATED-header ownership rule. + +The generator owns only files carrying the AUTO-GENERATED header. It +preflights expected output paths, deletes generated files to clear stale +orphans, and refuses to overwrite a hand-written file at a generated path. +""" + +from pathlib import Path + +from .templates import AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS + +# The first line of each header is the ownership marker. +_MARKER = AUTO_GENERATED_HEADER.splitlines()[0] +_RS_MARKER = AUTO_GENERATED_HEADER_RS.splitlines()[0] + + +class OwnershipError(Exception): + """Raised when the generator would clobber a hand-written file.""" + + +def _first_line(path: Path) -> str: + with path.open("r", encoding="utf-8") as fh: + return fh.readline().rstrip("\r\n") + + +def is_generated(path: Path) -> bool: + """True if the file at `path` carries the SQL AUTO-GENERATED marker.""" + if not path.is_file(): + return False + return _first_line(path) == _MARKER + + +def is_generated_rs(path: Path) -> bool: + """True if the file at `path` carries the Rust AUTO-GENERATED marker.""" + if not path.is_file(): + return False + return _first_line(path) == _RS_MARKER + + +def clean_generated_files(directory: Path) -> list[Path]: + """Delete every generated .sql file in `directory`. Returns the list + of removed paths. Hand-written files are left untouched. A no-op on a + directory that does not exist or holds no generated files.""" + directory = Path(directory) + if not directory.is_dir(): + return [] + removed: list[Path] = [] + for path in sorted(directory.glob("*.sql")): + if is_generated(path): + path.unlink() + removed.append(path) + return removed + + +def ensure_generated_paths_writable(paths: list[Path]) -> None: + """Refuse a generation run before cleanup if any target is hand-written.""" + for path in paths: + path = Path(path) + if path.exists() and not is_generated(path): + raise OwnershipError( + f"refusing to overwrite hand-written file: {path} " + f"(no AUTO-GENERATED header). Remove it by hand if it is a " + f"one-time generator-adoption target." + ) + + +def write_generated_file(path: Path, body: str) -> None: + """Write `body` to `path`, prefixed with the SQL AUTO-GENERATED header. + + Refuses (OwnershipError) if `path` exists and is hand-written — a file + at a generated path that lacks the header is never clobbered.""" + path = Path(path) + ensure_generated_paths_writable([path]) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(AUTO_GENERATED_HEADER + body, encoding="utf-8") + + +def write_generated_rs(path: Path, body: str) -> None: + """Write `body` to a Rust file, prefixed with the Rust AUTO-GENERATED + header. Unlike the SQL surface this file is committed; the header still + guards against clobbering a hand-written file at the same path.""" + path = Path(path) + if path.exists() and not is_generated_rs(path): + raise OwnershipError( + f"refusing to overwrite hand-written file: {path} " + f"(no AUTO-GENERATED header)." + ) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(AUTO_GENERATED_HEADER_RS + body, encoding="utf-8") From 9f01dc33f926035571749d18aa720ee567a20e3a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 12:32:37 +1000 Subject: [PATCH 010/599] feat(encrypted-domain): eql_v2_int4 variant family Four jsonb-backed domains for encrypted int4: storage-only eql_v2_int4 (every operator blocked), eql_v2_int4_eq (hm; =, <>), and the ordered pair eql_v2_int4_ord / eql_v2_int4_ord_ore (ore; = <> < <= > >=). Domain CHECK pins the envelope version (VALUE->>'v' = '2'). Unsupported operators are error-throwing placeholders carrying an explanatory comment. Uniform extractors eql_v2.eq_term/ord_term keep functional indexes engaging without ::jsonb casts. Committed reference baselines guard byte parity. Part of PR #239. --- src/encrypted_domain/functions.sql | 26 ++ src/ore_block_u64_8_256/operators.sql | 11 + tests/codegen/reference/README.md | 5 + .../reference/int4/int4_eq_functions.sql | 406 ++++++++++++++++++ .../reference/int4/int4_eq_operators.sql | 271 ++++++++++++ .../codegen/reference/int4/int4_functions.sql | 403 +++++++++++++++++ .../codegen/reference/int4/int4_operators.sql | 271 ++++++++++++ .../reference/int4/int4_ord_functions.sql | 395 +++++++++++++++++ .../reference/int4/int4_ord_operators.sql | 271 ++++++++++++ .../reference/int4/int4_ord_ore_functions.sql | 395 +++++++++++++++++ .../reference/int4/int4_ord_ore_operators.sql | 271 ++++++++++++ tests/codegen/reference/int4/int4_types.sql | 72 ++++ 12 files changed, 2797 insertions(+) create mode 100644 src/encrypted_domain/functions.sql create mode 100644 tests/codegen/reference/README.md create mode 100644 tests/codegen/reference/int4/int4_eq_functions.sql create mode 100644 tests/codegen/reference/int4/int4_eq_operators.sql create mode 100644 tests/codegen/reference/int4/int4_functions.sql create mode 100644 tests/codegen/reference/int4/int4_operators.sql create mode 100644 tests/codegen/reference/int4/int4_ord_functions.sql create mode 100644 tests/codegen/reference/int4/int4_ord_operators.sql create mode 100644 tests/codegen/reference/int4/int4_ord_ore_functions.sql create mode 100644 tests/codegen/reference/int4/int4_ord_ore_operators.sql create mode 100644 tests/codegen/reference/int4/int4_types.sql diff --git a/src/encrypted_domain/functions.sql b/src/encrypted_domain/functions.sql new file mode 100644 index 000000000..24b75145e --- /dev/null +++ b/src/encrypted_domain/functions.sql @@ -0,0 +1,26 @@ +-- REQUIRE: src/schema.sql + +--! @file encrypted_domain/functions.sql +--! @brief Shared blocker helper for the eql_v2_int4 domain family. +--! +--! Per-domain wrapper functions live in src/encrypted_domain/int4/. +--! Blockers in those files delegate to encrypted_domain_unsupported_bool +--! so every domain raises a uniform domain-specific error rather than +--! letting an unsupported operator fall through to native jsonb +--! behaviour. + +--! @brief Shared blocker helper. Raises 'operator X is not supported +--! for TYPE' so unsupported domain operators surface a clear +--! error rather than fall through to native jsonb behaviour. +--! @param type_name Domain type name (eql_v2_int4*) +--! @param operator_name Operator symbol (=, <, @>, ->, etc.) +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.encrypted_domain_unsupported_bool(type_name text, operator_name text) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name; +END; +$$ LANGUAGE plpgsql; diff --git a/src/ore_block_u64_8_256/operators.sql b/src/ore_block_u64_8_256/operators.sql index e9e34561a..06a4fa65d 100644 --- a/src/ore_block_u64_8_256/operators.sql +++ b/src/ore_block_u64_8_256/operators.sql @@ -123,10 +123,17 @@ $$; --! @brief = operator for ORE block types +--! +--! COMMUTATOR is the operator itself: equality is symmetric. The clause +--! is required for a MERGES (mergejoinable) operator — without it the +--! planner raises "could not find commutator" the first time an +--! ore_block equality is used as a join qual (e.g. via the inlined +--! eql_v2_int4_ord_ore equality wrappers). CREATE OPERATOR = ( FUNCTION=eql_v2.ore_block_u64_8_256_eq, LEFTARG=eql_v2.ore_block_u64_8_256, RIGHTARG=eql_v2.ore_block_u64_8_256, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel, @@ -137,10 +144,14 @@ CREATE OPERATOR = ( --! @brief <> operator for ORE block types +--! +--! COMMUTATOR is the operator itself: inequality is symmetric. Required +--! alongside the MERGES flag — see the = operator above. CREATE OPERATOR <> ( FUNCTION=eql_v2.ore_block_u64_8_256_neq, LEFTARG=eql_v2.ore_block_u64_8_256, RIGHTARG=eql_v2.ore_block_u64_8_256, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = eqsel, JOIN = eqjoinsel, diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md new file mode 100644 index 000000000..c1fa5118a --- /dev/null +++ b/tests/codegen/reference/README.md @@ -0,0 +1,5 @@ +# Codegen reference + +The SQL files under `/` are the original, hand-written reference implementation for each encrypted-domain scalar type. + +They are the parity baseline for the generator in `tasks/codegen/`. `tasks/codegen/test_against_reference.py` renders the generator's output and asserts it matches these files byte-for-byte. If the generator diverges, either it regressed (fix `tasks/codegen/`) or the reference is being updated deliberately (commit the new reference in the same PR). diff --git a/tests/codegen/reference/int4/int4_eq_functions.sql b/tests/codegen/reference/int4/int4_eq_functions.sql new file mode 100644 index 000000000..f1fe0d70e --- /dev/null +++ b/tests/codegen/reference/int4/int4_eq_functions.sql @@ -0,0 +1,406 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/functions.sql +-- REQUIRE: src/hmac_256/functions.sql + +--! @file encrypted_domain/int4/int4_eq_functions.sql +--! @brief Equality-only domain of the int4 encrypted-domain family — comparison/path functions. + +--! @brief Index extractor for the eql_v2_int4_eq variant. +--! @param a eql_v2_int4_eq +--! @return eql_v2.hmac_256 +CREATE FUNCTION eql_v2.eq_term(a eql_v2_int4_eq) +RETURNS eql_v2.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.hmac_256(a::jsonb) $$; + +--! @brief Equality wrapper for eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean +CREATE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.eq_term(a) = eql_v2.eq_term(b) $$; + +--! @brief Equality wrapper for eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.eq_term(a) = eql_v2.eq_term(b::eql_v2_int4_eq) $$; + +--! @brief Equality wrapper for eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean +CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.eq_term(a::eql_v2_int4_eq) = eql_v2.eq_term(b) $$; + +--! @brief Inequality wrapper for eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean +CREATE FUNCTION eql_v2.neq(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.eq_term(a) <> eql_v2.eq_term(b) $$; + +--! @brief Inequality wrapper for eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.neq(a eql_v2_int4_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.eq_term(a) <> eql_v2.eq_term(b::eql_v2_int4_eq) $$; + +--! @brief Inequality wrapper for eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean +CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.eq_term(a::eql_v2_int4_eq) <> eql_v2.eq_term(b) $$; + +--! @brief Blocker for < on eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lt(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for < on eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lt(a eql_v2_int4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for < on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <= on eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lte(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <= on eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lte(a eql_v2_int4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <= on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for > on eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gt(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for > on eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gt(a eql_v2_int4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for > on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for >= on eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gte(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for >= on eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gte(a eql_v2_int4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for >= on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_eq (domain, text). +--! @param a eql_v2_int4_eq +--! @param selector text +--! @return eql_v2_int4_eq (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4_eq, selector text) +RETURNS eql_v2_int4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_eq (domain, integer). +--! @param a eql_v2_int4_eq +--! @param selector integer +--! @return eql_v2_int4_eq (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4_eq, selector integer) +RETURNS eql_v2_int4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4_eq +--! @return eql_v2_int4_eq (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4_eq) +RETURNS eql_v2_int4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_eq (domain, text). +--! @param a eql_v2_int4_eq +--! @param selector text +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_eq (domain, integer). +--! @param a eql_v2_int4_eq +--! @param selector integer +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4_eq +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ? on eql_v2_int4_eq (domain, text). +--! @param a eql_v2_int4_eq +--! @param b text +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?"(a eql_v2_int4_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?| on eql_v2_int4_eq (domain, text[]). +--! @param a eql_v2_int4_eq +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?|"(a eql_v2_int4_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '?|'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?& on eql_v2_int4_eq (domain, text[]). +--! @param a eql_v2_int4_eq +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?&"(a eql_v2_int4_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '?&'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @? on eql_v2_int4_eq (domain, jsonpath). +--! @param a eql_v2_int4_eq +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@?"(a eql_v2_int4_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @@ on eql_v2_int4_eq (domain, jsonpath). +--! @param a eql_v2_int4_eq +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@@"(a eql_v2_int4_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #> on eql_v2_int4_eq (domain, text[]). +--! @param a eql_v2_int4_eq +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#>"(a eql_v2_int4_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #>> on eql_v2_int4_eq (domain, text[]). +--! @param a eql_v2_int4_eq +--! @param b text[] +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_eq (domain, text). +--! @param a eql_v2_int4_eq +--! @param b text +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_eq (domain, integer). +--! @param a eql_v2_int4_eq +--! @param b integer +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_eq (domain, text[]). +--! @param a eql_v2_int4_eq +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #- on eql_v2_int4_eq (domain, text[]). +--! @param a eql_v2_int4_eq +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#-"(a eql_v2_int4_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_eq. +--! @param a eql_v2_int4_eq +--! @param b eql_v2_int4_eq +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4_eq, b eql_v2_int4_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_eq (domain, jsonb). +--! @param a eql_v2_int4_eq +--! @param b jsonb +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_eq (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_eq +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_eq_operators.sql b/tests/codegen/reference/int4/int4_eq_operators.sql new file mode 100644 index 000000000..85d8353ca --- /dev/null +++ b/tests/codegen/reference/int4/int4_eq_operators.sql @@ -0,0 +1,271 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/int4/int4_eq_functions.sql + +--! @file encrypted_domain/int4/int4_eq_operators.sql +--! @brief Equality-only domain of the int4 encrypted-domain family — operator declarations. + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +-- Placeholder: this domain's term set does not support <; the backing function always raises. +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support <; the backing function always raises. +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <; the backing function always raises. +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support <=; the backing function always raises. +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support <=; the backing function always raises. +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <=; the backing function always raises. +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support >; the backing function always raises. +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support >; the backing function always raises. +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support >; the backing function always raises. +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support >=; the backing function always raises. +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support >=; the backing function always raises. +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support >=; the backing function always raises. +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4_eq, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4_eq, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support ?; the backing function always raises. +CREATE OPERATOR ? ( + FUNCTION = eql_v2."?", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ?|; the backing function always raises. +CREATE OPERATOR ?| ( + FUNCTION = eql_v2."?|", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ?&; the backing function always raises. +CREATE OPERATOR ?& ( + FUNCTION = eql_v2."?&", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support @?; the backing function always raises. +CREATE OPERATOR @? ( + FUNCTION = eql_v2."@?", + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support @@; the backing function always raises. +CREATE OPERATOR @@ ( + FUNCTION = eql_v2."@@", + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support #>; the backing function always raises. +CREATE OPERATOR #> ( + FUNCTION = eql_v2."#>", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #>>; the backing function always raises. +CREATE OPERATOR #>> ( + FUNCTION = eql_v2."#>>", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_eq, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #-; the backing function always raises. +CREATE OPERATOR #- ( + FUNCTION = eql_v2."#-", + LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq +); diff --git a/tests/codegen/reference/int4/int4_functions.sql b/tests/codegen/reference/int4/int4_functions.sql new file mode 100644 index 000000000..27936e1d7 --- /dev/null +++ b/tests/codegen/reference/int4/int4_functions.sql @@ -0,0 +1,403 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/functions.sql + +--! @file encrypted_domain/int4/int4_functions.sql +--! @brief Storage-only domain of the int4 encrypted-domain family — comparison/path functions. + +--! @brief Blocker for = on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.eq(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for = on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.eq(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for = on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <> on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.neq(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <> on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.neq(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <> on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for < on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lt(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for < on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lt(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for < on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <= on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lte(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <= on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lte(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <= on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for > on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gt(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for > on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gt(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for > on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for >= on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gte(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for >= on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gte(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for >= on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>='); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4 (domain, text). +--! @param a eql_v2_int4 +--! @param selector text +--! @return eql_v2_int4 (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4, selector text) +RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4 (domain, integer). +--! @param a eql_v2_int4 +--! @param selector integer +--! @return eql_v2_int4 (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4, selector integer) +RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4 +--! @return eql_v2_int4 (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4) +RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4 (domain, text). +--! @param a eql_v2_int4 +--! @param selector text +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4 (domain, integer). +--! @param a eql_v2_int4 +--! @param selector integer +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4 +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ? on eql_v2_int4 (domain, text). +--! @param a eql_v2_int4 +--! @param b text +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?"(a eql_v2_int4, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?| on eql_v2_int4 (domain, text[]). +--! @param a eql_v2_int4 +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?|"(a eql_v2_int4, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '?|'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?& on eql_v2_int4 (domain, text[]). +--! @param a eql_v2_int4 +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?&"(a eql_v2_int4, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '?&'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @? on eql_v2_int4 (domain, jsonpath). +--! @param a eql_v2_int4 +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@?"(a eql_v2_int4, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @@ on eql_v2_int4 (domain, jsonpath). +--! @param a eql_v2_int4 +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@@"(a eql_v2_int4, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #> on eql_v2_int4 (domain, text[]). +--! @param a eql_v2_int4 +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#>"(a eql_v2_int4, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #>> on eql_v2_int4 (domain, text[]). +--! @param a eql_v2_int4 +--! @param b text[] +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4 (domain, text). +--! @param a eql_v2_int4 +--! @param b text +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4 (domain, integer). +--! @param a eql_v2_int4 +--! @param b integer +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4 (domain, text[]). +--! @param a eql_v2_int4 +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #- on eql_v2_int4 (domain, text[]). +--! @param a eql_v2_int4 +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#-"(a eql_v2_int4, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4. +--! @param a eql_v2_int4 +--! @param b eql_v2_int4 +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4, b eql_v2_int4) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4 (domain, jsonb). +--! @param a eql_v2_int4 +--! @param b jsonb +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4 (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4 +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_operators.sql b/tests/codegen/reference/int4/int4_operators.sql new file mode 100644 index 000000000..fc3dd7cf4 --- /dev/null +++ b/tests/codegen/reference/int4/int4_operators.sql @@ -0,0 +1,271 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/int4/int4_functions.sql + +--! @file encrypted_domain/int4/int4_operators.sql +--! @brief Storage-only domain of the int4 encrypted-domain family — operator declarations. + +-- Placeholder: this domain's term set does not support =; the backing function always raises. +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support =; the backing function always raises. +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support =; the backing function always raises. +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <>; the backing function always raises. +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <>; the backing function always raises. +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <>; the backing function always raises. +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <; the backing function always raises. +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <; the backing function always raises. +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <; the backing function always raises. +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <=; the backing function always raises. +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <=; the backing function always raises. +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <=; the backing function always raises. +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support >; the backing function always raises. +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support >; the backing function always raises. +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support >; the backing function always raises. +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support >=; the backing function always raises. +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support >=; the backing function always raises. +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support >=; the backing function always raises. +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support ?; the backing function always raises. +CREATE OPERATOR ? ( + FUNCTION = eql_v2."?", + LEFTARG = eql_v2_int4, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ?|; the backing function always raises. +CREATE OPERATOR ?| ( + FUNCTION = eql_v2."?|", + LEFTARG = eql_v2_int4, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ?&; the backing function always raises. +CREATE OPERATOR ?& ( + FUNCTION = eql_v2."?&", + LEFTARG = eql_v2_int4, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support @?; the backing function always raises. +CREATE OPERATOR @? ( + FUNCTION = eql_v2."@?", + LEFTARG = eql_v2_int4, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support @@; the backing function always raises. +CREATE OPERATOR @@ ( + FUNCTION = eql_v2."@@", + LEFTARG = eql_v2_int4, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support #>; the backing function always raises. +CREATE OPERATOR #> ( + FUNCTION = eql_v2."#>", + LEFTARG = eql_v2_int4, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #>>; the backing function always raises. +CREATE OPERATOR #>> ( + FUNCTION = eql_v2."#>>", + LEFTARG = eql_v2_int4, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #-; the backing function always raises. +CREATE OPERATOR #- ( + FUNCTION = eql_v2."#-", + LEFTARG = eql_v2_int4, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4 +); diff --git a/tests/codegen/reference/int4/int4_ord_functions.sql b/tests/codegen/reference/int4/int4_ord_functions.sql new file mode 100644 index 000000000..9d3ba2a29 --- /dev/null +++ b/tests/codegen/reference/int4/int4_ord_functions.sql @@ -0,0 +1,395 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/functions.sql +-- REQUIRE: src/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/int4/int4_ord_functions.sql +--! @brief Ordered domain of the int4 encrypted-domain family — comparison/path functions. + +--! @brief Index extractor for the eql_v2_int4_ord variant. +--! @param a eql_v2_int4_ord +--! @return eql_v2.ore_block_u64_8_256 +CREATE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord) +RETURNS eql_v2.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Equality wrapper for eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b) $$; + +--! @brief Equality wrapper for eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b::eql_v2_int4_ord) $$; + +--! @brief Equality wrapper for eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) = eql_v2.ord_term(b) $$; + +--! @brief Inequality wrapper for eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b) $$; + +--! @brief Inequality wrapper for eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b::eql_v2_int4_ord) $$; + +--! @brief Inequality wrapper for eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) <> eql_v2.ord_term(b) $$; + +--! @brief Less-than wrapper for eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b) $$; + +--! @brief Less-than wrapper for eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b::eql_v2_int4_ord) $$; + +--! @brief Less-than wrapper for eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) < eql_v2.ord_term(b) $$; + +--! @brief Less-than-or-equal wrapper for eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b) $$; + +--! @brief Less-than-or-equal wrapper for eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b::eql_v2_int4_ord) $$; + +--! @brief Less-than-or-equal wrapper for eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) <= eql_v2.ord_term(b) $$; + +--! @brief Greater-than wrapper for eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b) $$; + +--! @brief Greater-than wrapper for eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b::eql_v2_int4_ord) $$; + +--! @brief Greater-than wrapper for eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) > eql_v2.ord_term(b) $$; + +--! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b) $$; + +--! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b::eql_v2_int4_ord) $$; + +--! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean +CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) >= eql_v2.ord_term(b) $$; + +--! @brief Blocker for @> on eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_ord (domain, text). +--! @param a eql_v2_int4_ord +--! @param selector text +--! @return eql_v2_int4_ord (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord, selector text) +RETURNS eql_v2_int4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_ord (domain, integer). +--! @param a eql_v2_int4_ord +--! @param selector integer +--! @return eql_v2_int4_ord (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord, selector integer) +RETURNS eql_v2_int4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4_ord +--! @return eql_v2_int4_ord (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4_ord) +RETURNS eql_v2_int4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_ord (domain, text). +--! @param a eql_v2_int4_ord +--! @param selector text +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_ord (domain, integer). +--! @param a eql_v2_int4_ord +--! @param selector integer +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4_ord +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ? on eql_v2_int4_ord (domain, text). +--! @param a eql_v2_int4_ord +--! @param b text +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?"(a eql_v2_int4_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?| on eql_v2_int4_ord (domain, text[]). +--! @param a eql_v2_int4_ord +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?|"(a eql_v2_int4_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '?|'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?& on eql_v2_int4_ord (domain, text[]). +--! @param a eql_v2_int4_ord +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?&"(a eql_v2_int4_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '?&'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @? on eql_v2_int4_ord (domain, jsonpath). +--! @param a eql_v2_int4_ord +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@?"(a eql_v2_int4_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @@ on eql_v2_int4_ord (domain, jsonpath). +--! @param a eql_v2_int4_ord +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@@"(a eql_v2_int4_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #> on eql_v2_int4_ord (domain, text[]). +--! @param a eql_v2_int4_ord +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#>"(a eql_v2_int4_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #>> on eql_v2_int4_ord (domain, text[]). +--! @param a eql_v2_int4_ord +--! @param b text[] +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_ord (domain, text). +--! @param a eql_v2_int4_ord +--! @param b text +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_ord (domain, integer). +--! @param a eql_v2_int4_ord +--! @param b integer +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_ord (domain, text[]). +--! @param a eql_v2_int4_ord +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #- on eql_v2_int4_ord (domain, text[]). +--! @param a eql_v2_int4_ord +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#-"(a eql_v2_int4_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_ord. +--! @param a eql_v2_int4_ord +--! @param b eql_v2_int4_ord +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord, b eql_v2_int4_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_ord (domain, jsonb). +--! @param a eql_v2_int4_ord +--! @param b jsonb +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_ord (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_ord_operators.sql b/tests/codegen/reference/int4/int4_ord_operators.sql new file mode 100644 index 000000000..3e3657f96 --- /dev/null +++ b/tests/codegen/reference/int4/int4_ord_operators.sql @@ -0,0 +1,271 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql + +--! @file encrypted_domain/int4/int4_ord_operators.sql +--! @brief Ordered domain of the int4 encrypted-domain family — operator declarations. + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4_ord, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4_ord, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord +); + +-- Placeholder: this domain's term set does not support ?; the backing function always raises. +CREATE OPERATOR ? ( + FUNCTION = eql_v2."?", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ?|; the backing function always raises. +CREATE OPERATOR ?| ( + FUNCTION = eql_v2."?|", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ?&; the backing function always raises. +CREATE OPERATOR ?& ( + FUNCTION = eql_v2."?&", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support @?; the backing function always raises. +CREATE OPERATOR @? ( + FUNCTION = eql_v2."@?", + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support @@; the backing function always raises. +CREATE OPERATOR @@ ( + FUNCTION = eql_v2."@@", + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support #>; the backing function always raises. +CREATE OPERATOR #> ( + FUNCTION = eql_v2."#>", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #>>; the backing function always raises. +CREATE OPERATOR #>> ( + FUNCTION = eql_v2."#>>", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_ord, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #-; the backing function always raises. +CREATE OPERATOR #- ( + FUNCTION = eql_v2."#-", + LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord +); diff --git a/tests/codegen/reference/int4/int4_ord_ore_functions.sql b/tests/codegen/reference/int4/int4_ord_ore_functions.sql new file mode 100644 index 000000000..bd6fe8b40 --- /dev/null +++ b/tests/codegen/reference/int4/int4_ord_ore_functions.sql @@ -0,0 +1,395 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/functions.sql +-- REQUIRE: src/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/int4/int4_ord_ore_functions.sql +--! @brief Ordered domain of the int4 encrypted-domain family — comparison/path functions. + +--! @brief Index extractor for the eql_v2_int4_ord_ore variant. +--! @param a eql_v2_int4_ord_ore +--! @return eql_v2.ore_block_u64_8_256 +CREATE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord_ore) +RETURNS eql_v2.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Equality wrapper for eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b) $$; + +--! @brief Equality wrapper for eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; + +--! @brief Equality wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) = eql_v2.ord_term(b) $$; + +--! @brief Inequality wrapper for eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b) $$; + +--! @brief Inequality wrapper for eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; + +--! @brief Inequality wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) <> eql_v2.ord_term(b) $$; + +--! @brief Less-than wrapper for eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b) $$; + +--! @brief Less-than wrapper for eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; + +--! @brief Less-than wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) < eql_v2.ord_term(b) $$; + +--! @brief Less-than-or-equal wrapper for eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b) $$; + +--! @brief Less-than-or-equal wrapper for eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; + +--! @brief Less-than-or-equal wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) <= eql_v2.ord_term(b) $$; + +--! @brief Greater-than wrapper for eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b) $$; + +--! @brief Greater-than wrapper for eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; + +--! @brief Greater-than wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) > eql_v2.ord_term(b) $$; + +--! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b) $$; + +--! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; + +--! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) >= eql_v2.ord_term(b) $$; + +--! @brief Blocker for @> on eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @> on eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@>'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for <@ on eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '<@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_ord_ore (domain, text). +--! @param a eql_v2_int4_ord_ore +--! @param selector text +--! @return eql_v2_int4_ord_ore (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord_ore, selector text) +RETURNS eql_v2_int4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_ord_ore (domain, integer). +--! @param a eql_v2_int4_ord_ore +--! @param selector integer +--! @return eql_v2_int4_ord_ore (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord_ore, selector integer) +RETURNS eql_v2_int4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for -> on eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4_ord_ore +--! @return eql_v2_int4_ord_ore (never returns; always raises) +CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4_ord_ore) +RETURNS eql_v2_int4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_ord_ore (domain, text). +--! @param a eql_v2_int4_ord_ore +--! @param selector text +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_ord_ore (domain, integer). +--! @param a eql_v2_int4_ord_ore +--! @param selector integer +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ->> on eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param selector eql_v2_int4_ord_ore +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ? on eql_v2_int4_ord_ore (domain, text). +--! @param a eql_v2_int4_ord_ore +--! @param b text +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?"(a eql_v2_int4_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?| on eql_v2_int4_ord_ore (domain, text[]). +--! @param a eql_v2_int4_ord_ore +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?|"(a eql_v2_int4_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '?|'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for ?& on eql_v2_int4_ord_ore (domain, text[]). +--! @param a eql_v2_int4_ord_ore +--! @param b text[] +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."?&"(a eql_v2_int4_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '?&'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @? on eql_v2_int4_ord_ore (domain, jsonpath). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@?"(a eql_v2_int4_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@?'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for @@ on eql_v2_int4_ord_ore (domain, jsonpath). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonpath +--! @return boolean (never returns; always raises) +CREATE FUNCTION eql_v2."@@"(a eql_v2_int4_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@@'); END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #> on eql_v2_int4_ord_ore (domain, text[]). +--! @param a eql_v2_int4_ord_ore +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#>"(a eql_v2_int4_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #>> on eql_v2_int4_ord_ore (domain, text[]). +--! @param a eql_v2_int4_ord_ore +--! @param b text[] +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_ord_ore (domain, text). +--! @param a eql_v2_int4_ord_ore +--! @param b text +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_ord_ore (domain, integer). +--! @param a eql_v2_int4_ord_ore +--! @param b integer +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for - on eql_v2_int4_ord_ore (domain, text[]). +--! @param a eql_v2_int4_ord_ore +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for #- on eql_v2_int4_ord_ore (domain, text[]). +--! @param a eql_v2_int4_ord_ore +--! @param b text[] +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."#-"(a eql_v2_int4_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_ord_ore. +--! @param a eql_v2_int4_ord_ore +--! @param b eql_v2_int4_ord_ore +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_ord_ore (domain, jsonb). +--! @param a eql_v2_int4_ord_ore +--! @param b jsonb +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Blocker for || on eql_v2_int4_ord_ore (jsonb, domain). +--! @param a jsonb +--! @param b eql_v2_int4_ord_ore +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_ord_ore_operators.sql b/tests/codegen/reference/int4/int4_ord_ore_operators.sql new file mode 100644 index 000000000..ee1f84cfe --- /dev/null +++ b/tests/codegen/reference/int4/int4_ord_ore_operators.sql @@ -0,0 +1,271 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql + +--! @file encrypted_domain/int4/int4_ord_ore_operators.sql +--! @brief Ordered domain of the int4 encrypted-domain family — operator declarations. + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v2.eq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v2.neq, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v2.lt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v2.lte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v2.gt, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v2.gte, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support @>; the backing function always raises. +CREATE OPERATOR @> ( + FUNCTION = eql_v2.contains, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support <@; the backing function always raises. +CREATE OPERATOR <@ ( + FUNCTION = eql_v2.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->; the backing function always raises. +CREATE OPERATOR -> ( + FUNCTION = eql_v2."->", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support ->>; the backing function always raises. +CREATE OPERATOR ->> ( + FUNCTION = eql_v2."->>", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore +); + +-- Placeholder: this domain's term set does not support ?; the backing function always raises. +CREATE OPERATOR ? ( + FUNCTION = eql_v2."?", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support ?|; the backing function always raises. +CREATE OPERATOR ?| ( + FUNCTION = eql_v2."?|", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ?&; the backing function always raises. +CREATE OPERATOR ?& ( + FUNCTION = eql_v2."?&", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support @?; the backing function always raises. +CREATE OPERATOR @? ( + FUNCTION = eql_v2."@?", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support @@; the backing function always raises. +CREATE OPERATOR @@ ( + FUNCTION = eql_v2."@@", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonpath +); + +-- Placeholder: this domain's term set does not support #>; the backing function always raises. +CREATE OPERATOR #> ( + FUNCTION = eql_v2."#>", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #>>; the backing function always raises. +CREATE OPERATOR #>> ( + FUNCTION = eql_v2."#>>", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = integer +); + +-- Placeholder: this domain's term set does not support -; the backing function always raises. +CREATE OPERATOR - ( + FUNCTION = eql_v2."-", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support #-; the backing function always raises. +CREATE OPERATOR #- ( + FUNCTION = eql_v2."#-", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb +); + +-- Placeholder: this domain's term set does not support ||; the backing function always raises. +CREATE OPERATOR || ( + FUNCTION = eql_v2."||", + LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore +); diff --git a/tests/codegen/reference/int4/int4_types.sql b/tests/codegen/reference/int4/int4_types.sql new file mode 100644 index 000000000..f76165390 --- /dev/null +++ b/tests/codegen/reference/int4/int4_types.sql @@ -0,0 +1,72 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql + +--! @file encrypted_domain/int4/int4_types.sql +--! @brief Encrypted-domain type family for int4. + +DO $$ +BEGIN + --! @brief Storage-only encrypted int4 domain. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'eql_v2_int4' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.eql_v2_int4 AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Equality-only encrypted int4 domain. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'eql_v2_int4_eq' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.eql_v2_int4_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Ordered encrypted int4 domain. Scheme-explicit twin pinning the ore scheme; prefer the converged int4_ord name. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'eql_v2_int4_ord_ore' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.eql_v2_int4_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Ordered encrypted int4 domain. Recommended converged name for this role. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'eql_v2_int4_ord' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.eql_v2_int4_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; From 4fa474869ebaff58a173967ffc746dc0a2d26858 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 12:32:37 +1000 Subject: [PATCH 011/599] feat(aggregates): per-domain MIN/MAX with parallel aggregation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MIN/MAX aggregates on ord-capable int4 domains route comparison through the domain's ORE operators — no decryption. min/max are associative, so the state function doubles as combinefunc; with PARALLEL SAFE sfuncs and parallel = safe, PostgreSQL can use partial/parallel aggregation on the large GROUP BY workloads these aggregates exist to serve. Part of PR #239. --- .../reference/int4/int4_ord_aggregates.sql | 86 +++++++++++++++++++ .../int4/int4_ord_ore_aggregates.sql | 86 +++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 tests/codegen/reference/int4/int4_ord_aggregates.sql create mode 100644 tests/codegen/reference/int4/int4_ord_ore_aggregates.sql diff --git a/tests/codegen/reference/int4/int4_ord_aggregates.sql b/tests/codegen/reference/int4/int4_ord_aggregates.sql new file mode 100644 index 000000000..52a64ec1e --- /dev/null +++ b/tests/codegen/reference/int4/int4_ord_aggregates.sql @@ -0,0 +1,86 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql +-- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql + +--! @file encrypted_domain/int4/int4_ord_aggregates.sql +--! @brief Ordered domain of the int4 encrypted-domain family — MIN/MAX aggregates. + +--! @brief State function for min aggregate on eql_v2_int4_ord. +--! @internal +--! +--! @param state eql_v2_int4_ord running extremum +--! @param value eql_v2_int4_ord next non-NULL value +--! @return eql_v2_int4_ord the minimum of state and value +-- LANGUAGE plpgsql, not sql: aggregate state functions are not index +-- expressions, so opacity to the planner is fine, and a multi-statement +-- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would +-- also work, but the procedural form mirrors the blocker convention.) +CREATE FUNCTION eql_v2.min_sfunc(state eql_v2_int4_ord, value eql_v2_int4_ord) +RETURNS eql_v2_int4_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief Find the minimum encrypted value in a group of eql_v2_int4_ord values. +--! +--! Comparison routes through the domain's `<` operator, which uses the ORE block term — no decryption. +--! +--! @param input eql_v2_int4_ord encrypted values to aggregate +--! @return eql_v2_int4_ord minimum of the group, or NULL if all inputs are NULL +-- combinefunc = sfunc: min/max are associative, so merging two partial +-- extrema is the same comparison. PARALLEL SAFE enables partial and +-- parallel aggregation on large GROUP BY workloads, with no decryption. +CREATE AGGREGATE eql_v2.min(eql_v2_int4_ord) ( + sfunc = eql_v2.min_sfunc, + stype = eql_v2_int4_ord, + combinefunc = eql_v2.min_sfunc, + parallel = safe +); + +--! @brief State function for max aggregate on eql_v2_int4_ord. +--! @internal +--! +--! @param state eql_v2_int4_ord running extremum +--! @param value eql_v2_int4_ord next non-NULL value +--! @return eql_v2_int4_ord the maximum of state and value +-- LANGUAGE plpgsql, not sql: aggregate state functions are not index +-- expressions, so opacity to the planner is fine, and a multi-statement +-- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would +-- also work, but the procedural form mirrors the blocker convention.) +CREATE FUNCTION eql_v2.max_sfunc(state eql_v2_int4_ord, value eql_v2_int4_ord) +RETURNS eql_v2_int4_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief Find the maximum encrypted value in a group of eql_v2_int4_ord values. +--! +--! Comparison routes through the domain's `>` operator, which uses the ORE block term — no decryption. +--! +--! @param input eql_v2_int4_ord encrypted values to aggregate +--! @return eql_v2_int4_ord maximum of the group, or NULL if all inputs are NULL +-- combinefunc = sfunc: min/max are associative, so merging two partial +-- extrema is the same comparison. PARALLEL SAFE enables partial and +-- parallel aggregation on large GROUP BY workloads, with no decryption. +CREATE AGGREGATE eql_v2.max(eql_v2_int4_ord) ( + sfunc = eql_v2.max_sfunc, + stype = eql_v2_int4_ord, + combinefunc = eql_v2.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql new file mode 100644 index 000000000..f2f1e81e8 --- /dev/null +++ b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql @@ -0,0 +1,86 @@ +-- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REQUIRE: src/schema.sql +-- REQUIRE: src/encrypted_domain/int4/int4_types.sql +-- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql +-- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_operators.sql + +--! @file encrypted_domain/int4/int4_ord_ore_aggregates.sql +--! @brief Ordered domain of the int4 encrypted-domain family — MIN/MAX aggregates. + +--! @brief State function for min aggregate on eql_v2_int4_ord_ore. +--! @internal +--! +--! @param state eql_v2_int4_ord_ore running extremum +--! @param value eql_v2_int4_ord_ore next non-NULL value +--! @return eql_v2_int4_ord_ore the minimum of state and value +-- LANGUAGE plpgsql, not sql: aggregate state functions are not index +-- expressions, so opacity to the planner is fine, and a multi-statement +-- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would +-- also work, but the procedural form mirrors the blocker convention.) +CREATE FUNCTION eql_v2.min_sfunc(state eql_v2_int4_ord_ore, value eql_v2_int4_ord_ore) +RETURNS eql_v2_int4_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief Find the minimum encrypted value in a group of eql_v2_int4_ord_ore values. +--! +--! Comparison routes through the domain's `<` operator, which uses the ORE block term — no decryption. +--! +--! @param input eql_v2_int4_ord_ore encrypted values to aggregate +--! @return eql_v2_int4_ord_ore minimum of the group, or NULL if all inputs are NULL +-- combinefunc = sfunc: min/max are associative, so merging two partial +-- extrema is the same comparison. PARALLEL SAFE enables partial and +-- parallel aggregation on large GROUP BY workloads, with no decryption. +CREATE AGGREGATE eql_v2.min(eql_v2_int4_ord_ore) ( + sfunc = eql_v2.min_sfunc, + stype = eql_v2_int4_ord_ore, + combinefunc = eql_v2.min_sfunc, + parallel = safe +); + +--! @brief State function for max aggregate on eql_v2_int4_ord_ore. +--! @internal +--! +--! @param state eql_v2_int4_ord_ore running extremum +--! @param value eql_v2_int4_ord_ore next non-NULL value +--! @return eql_v2_int4_ord_ore the maximum of state and value +-- LANGUAGE plpgsql, not sql: aggregate state functions are not index +-- expressions, so opacity to the planner is fine, and a multi-statement +-- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would +-- also work, but the procedural form mirrors the blocker convention.) +CREATE FUNCTION eql_v2.max_sfunc(state eql_v2_int4_ord_ore, value eql_v2_int4_ord_ore) +RETURNS eql_v2_int4_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief Find the maximum encrypted value in a group of eql_v2_int4_ord_ore values. +--! +--! Comparison routes through the domain's `>` operator, which uses the ORE block term — no decryption. +--! +--! @param input eql_v2_int4_ord_ore encrypted values to aggregate +--! @return eql_v2_int4_ord_ore maximum of the group, or NULL if all inputs are NULL +-- combinefunc = sfunc: min/max are associative, so merging two partial +-- extrema is the same comparison. PARALLEL SAFE enables partial and +-- parallel aggregation on large GROUP BY workloads, with no decryption. +CREATE AGGREGATE eql_v2.max(eql_v2_int4_ord_ore) ( + sfunc = eql_v2.max_sfunc, + stype = eql_v2_int4_ord_ore, + combinefunc = eql_v2.max_sfunc, + parallel = safe +); From 8709c8f1032747f4236fe18159f23712477d49d9 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 12:32:37 +1000 Subject: [PATCH 012/599] feat(lint): encrypted-domain lint rules Add blocker_language, blocker_strict, domain_over_domain, and domain_opclass structural lints enforcing the encrypted-domain footguns (blockers must be plpgsql and non-STRICT; no domain-over-domain; no opclass on a domain). pin_search_path recognises the converged extractor/wrapper names intrinsically. Part of PR #239. --- src/lint/lints.sql | 147 ++++++++++++++++++++++++++++++++++++++ tasks/pin_search_path.sql | 55 ++++++++++++-- 2 files changed, 195 insertions(+), 7 deletions(-) diff --git a/src/lint/lints.sql b/src/lint/lints.sql index 12ffea00f..b378f1bb6 100644 --- a/src/lint/lints.sql +++ b/src/lint/lints.sql @@ -38,6 +38,24 @@ --! but its body invokes a non-inlinable function --! (depth 1; the planner can't peek through --! that boundary). +--! `blocker_language` — encrypted-domain blocker is not LANGUAGE +--! plpgsql. The planner can inline / elide a +--! LANGUAGE sql body when the result is +--! provably unused, silently bypassing the +--! RAISE that the blocker exists to perform. +--! `blocker_strict` — encrypted-domain blocker is STRICT. +--! PostgreSQL skips the body and returns NULL +--! on NULL arguments, silently bypassing the +--! RAISE. +--! `domain_over_domain` — an `eql_v2_*` domain is derived from another +--! `eql_v2_*` domain rather than jsonb. +--! Operators resolve against the ultimate base +--! type, so the derived domain does not +--! inherit the base domain's blocker surface. +--! `domain_opclass` — an operator class is declared FOR TYPE on an +--! `eql_v2_*` domain. Opclasses on domains +--! bypass operator resolution; use a +--! functional index on the extractor instead. --! --! @example --! ``` @@ -85,6 +103,7 @@ AS $$ eo.opname, eo.lhs, eo.rhs, + eo.implfunc AS impl_oid, eo.impl_signature::text AS impl_signature, lang_l.lanname AS lang, p.provolatile AS volatility, @@ -94,6 +113,39 @@ AS $$ FROM eql_operators eo JOIN pg_proc p ON p.oid = eo.implfunc JOIN pg_language lang_l ON lang_l.oid = p.prolang + ), + + -- Encrypted-domain blockers: functions in `eql_v2` whose body contains + -- one of the two blocker markers emitted by the codegen + -- (`encrypted_domain_unsupported_bool` for boolean blockers; the literal + -- `is not supported for` for path-operator blockers) AND that take at + -- least one `public.eql_v2_*` domain over jsonb argument. The argument + -- filter excludes the shared `encrypted_domain_unsupported_bool(text, + -- text)` helper itself, which contains the marker in its body but is + -- not a blocker. + encrypted_domain_blockers AS ( + SELECT + p.oid AS oid, + p.oid::regprocedure::text AS signature, + lang_l.lanname AS lang, + p.proisstrict AS isstrict + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + JOIN pg_catalog.pg_language lang_l ON lang_l.oid = p.prolang + WHERE n.nspname = 'eql_v2' + AND (p.prosrc LIKE '%encrypted_domain_unsupported_bool%' + OR p.prosrc LIKE '%is not supported for%') + AND EXISTS ( + SELECT 1 + FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) + JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + WHERE dt.typtype = 'd' + AND dn.nspname = 'public' + AND dt.typname LIKE 'eql_v2\_%' + AND bt.typname = 'jsonb' + ) ) -- ┌─────────────────────────────────────────────────────────────────┐ @@ -113,6 +165,10 @@ AS $$ lang, opname) AS message FROM op_impl WHERE lang <> 'sql' + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) UNION ALL @@ -125,6 +181,10 @@ AS $$ opname) FROM op_impl WHERE volatility = 'v' + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) UNION ALL @@ -136,6 +196,10 @@ AS $$ 'Operator implementation function has a `SET` clause (e.g. `SET search_path = ...`). Per Postgres function-inlining rules, any `SET` clause blocks inlining. Use schema-qualified identifiers in the body and remove the `SET` clause to allow the planner to inline.') FROM op_impl WHERE config IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) UNION ALL @@ -146,6 +210,10 @@ AS $$ 'Operator implementation function is `SECURITY DEFINER`. Such functions cannot be inlined; remove `SECURITY DEFINER` or use a non-inlinable wrapper layer.' FROM op_impl WHERE secdef + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) -- ┌─────────────────────────────────────────────────────────────────┐ -- │ Transitive inlinability: an operator implementation function │ @@ -201,6 +269,85 @@ AS $$ OR called.prosecdef ) + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Encrypted-domain footguns: blockers exist to RAISE, so they │ + -- │ have inverted inlinability requirements vs operator impls. │ + -- │ A LANGUAGE sql blocker can be elided by the planner; a STRICT │ + -- │ blocker returns NULL on NULL args. Both silently re-enable │ + -- │ operators the storage variant is supposed to block. │ + -- └─────────────────────────────────────────────────────────────────┘ + + UNION ALL + + SELECT + 'error', + 'blocker_language', + format('function %s', signature), + format( + 'Encrypted-domain blocker is `LANGUAGE %s`; must be `LANGUAGE plpgsql` so the RAISE is opaque to the planner. A `LANGUAGE sql` body is inlinable and may be elided when the result is provably unused, silently re-enabling the operator.', + lang) + FROM encrypted_domain_blockers + WHERE lang <> 'plpgsql' + + UNION ALL + + SELECT + 'error', + 'blocker_strict', + format('function %s', signature), + 'Encrypted-domain blocker is `STRICT`. PostgreSQL skips the body and returns NULL on a NULL argument, silently bypassing the RAISE. Remove `STRICT`.' + FROM encrypted_domain_blockers + WHERE isstrict + + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Domain identity: an eql_v2_* domain must be defined directly │ + -- │ over jsonb. Operators resolve against the ultimate base type, │ + -- │ so domain-over-domain inherits jsonb's operator surface and not │ + -- │ the base domain's blockers. │ + -- └─────────────────────────────────────────────────────────────────┘ + + UNION ALL + + SELECT + 'error', + 'domain_over_domain', + format('domain %I.%I', dn.nspname, dt.typname), + format( + 'Domain `%s.%s` is derived from another eql_v2_* domain `%s.%s` rather than jsonb. Operators resolve against the ultimate base type, so the derived domain does not inherit the base domain''s operator surface and storage blockers do not engage. Define this domain directly over jsonb.', + dn.nspname, dt.typname, bn.nspname, bt.typname) + FROM pg_catalog.pg_type dt + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace + WHERE dt.typtype = 'd' + AND dn.nspname = 'public' + AND dt.typname LIKE 'eql_v2\_%' + AND bt.typtype = 'd' + AND bt.typname LIKE 'eql_v2\_%' + + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Domain opclass: an operator class declared FOR TYPE on an │ + -- │ eql_v2_* domain bypasses operator resolution at index time. │ + -- │ Use a functional index on the extractor instead. │ + -- └─────────────────────────────────────────────────────────────────┘ + + UNION ALL + + SELECT + 'error', + 'domain_opclass', + format('opclass %I.%I FOR TYPE %s.%s', cn.nspname, oc.opcname, tn.nspname, t.typname), + format( + 'Operator class `%s.%s` is declared FOR TYPE `%s.%s`, which is an eql_v2_* domain. Opclasses on domains bypass operator resolution. Use a functional index on the extractor (e.g. `eql_v2.eq_term(col)`, `eql_v2.ord_term(col)`) instead.', + cn.nspname, oc.opcname, tn.nspname, t.typname) + FROM pg_catalog.pg_opclass oc + JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype + JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace + JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace + WHERE t.typtype = 'd' + AND tn.nspname = 'public' + AND t.typname LIKE 'eql_v2\_%' + ORDER BY 1, 2, 3; $$; diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql index 8369589eb..168a9478b 100644 --- a/tasks/pin_search_path.sql +++ b/tasks/pin_search_path.sql @@ -215,13 +215,16 @@ BEGIN OR p.proargtypes[1] = (SELECT t.oid FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = 'pg_catalog' AND t.typname = 'int4'))) - -- XOR-aware equality term extractor on a ste_vec entry. Must - -- inline so `eql_v2.eq_term(col -> 'sel')` folds into the - -- calling query and matches a functional hash index built on - -- the same expression. - OR (p.pronargs = 1 - AND p.proname = 'eq_term' - AND p.proargtypes[0] = entry_oid) + -- Equality-term and order-term extractors — `eq_term` / `ord_term` + -- on a ste_vec entry and on the encrypted-domain family. Must + -- inline so `eql_v2.eq_term(col)` / `eql_v2.ord_term(col)` fold + -- into the calling query and match a functional index built on the + -- same expression. Name-only match (any arity-1 overload). The + -- encrypted-domain overloads are also covered by the identity + -- predicate's structural skip in the pin loop; these name-only + -- clauses are kept as belt-and-suspenders. + OR (p.pronargs = 1 AND p.proname = 'eq_term') + OR (p.pronargs = 1 AND p.proname = 'ord_term') -- Type-safe `@>` / `<@` overloads with typed needles -- (`stevec_query`, `ste_vec_entry`). Inline to the existing -- `ste_vec_contains` machinery — must stay unpinned to engage @@ -259,6 +262,44 @@ BEGIN WHERE c LIKE 'search_path=%' ) AND NOT (p.oid = ANY (coalesce(inline_critical_oids, '{}'::oid[]))) + -- Encrypted-domain family — structural skip (hybrid primary mechanism). + -- A new encrypted-domain type needs NO edit here: its inline-critical + -- extractors and comparison wrappers are recognised by the identity + -- predicate — LANGUAGE sql, IMMUTABLE, and taking at least one argument + -- typed as a jsonb-backed DOMAIN in `public` named `eql_v2_*`. The + -- predicate is proconfig-independent: the outer loop has already + -- excluded any function with a pinned `search_path`, so the only + -- functions reaching here are unpinned. This catches no core function: + -- `eql_v2_encrypted` is a composite type (not a domain), `ste_vec_entry` + -- is a domain in `eql_v2` (not `public`), and `hmac_256` is a domain + -- over `text` (not `jsonb`). + AND NOT ( + p.prolang = (SELECT l.oid FROM pg_catalog.pg_language l + WHERE l.lanname = 'sql') + AND p.provolatile = 'i' + AND EXISTS ( + SELECT 1 + FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) + JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + WHERE dt.typtype = 'd' + AND dn.nspname = 'public' + AND dt.typname LIKE 'eql_v2\_%' + AND dt.typbasetype = jsonb_oid + ) + ) + -- Encrypted-domain family — comment-marker fallback. Covers a + -- hand-written extension function that is inline-critical but takes no + -- domain argument (invisible to the identity predicate). The generator + -- does NOT emit this marker — every function it produces takes a domain + -- argument and is covered by the structural skip above. The marker is a + -- manual opt-in for hand-written extension functions only. + AND NOT EXISTS ( + SELECT 1 FROM pg_catalog.pg_description d + WHERE d.objoid = p.oid + AND d.classoid = 'pg_catalog.pg_proc'::regclass + AND d.description LIKE 'eql-inline-critical%' + ) LOOP -- oid::regprocedure renders as `schema.name(argtype, argtype)` and is a -- valid target for ALTER FUNCTION regardless of caller search_path. From 9416839588e9a6f274b3010065d5039430f09ac4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 12:32:52 +1000 Subject: [PATCH 013/599] test(encrypted-domain): SQLx scalar matrix, fixtures & jsonb-surface guard One ScalarType impl plus an ordered_numeric_matrix! invocation generates the full SQLx suite for a scalar. Fixture values are single-sourced from the manifest. Coverage includes: - always-on cost-preference proof (~5000 rows, enable_seqscan ON) that asserts on the EXPLAIN node type (Index/Index Only/Bitmap Index Scan), not an index-name substring; eq_count pinned to == 1 so the derived <> count is load-bearing - a live-DB structural guard querying pg_operator that fails if any native jsonb operator is absent from the generator's blocked surface - ORDER BY NULLS FIRST/LAST coverage for ordered domains Part of PR #239. --- tasks/fixtures.toml | 6 +- tasks/test.sh | 12 +- tasks/test/splinter.sh | 32 +- tests/codegen/reference/int4/int4_values.rs | 28 + tests/sqlx/Cargo.lock | 7 + tests/sqlx/Cargo.toml | 8 + tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 3 +- tests/sqlx/snapshots/int4_matrix_tests.txt | 211 ++ tests/sqlx/src/assertions.rs | 48 + tests/sqlx/src/fixtures/cipherstash.rs | 214 +- tests/sqlx/src/fixtures/driver.rs | 99 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 11 +- tests/sqlx/src/fixtures/eql_v2_int4.rs | 35 +- tests/sqlx/src/fixtures/index_kind.rs | 59 + tests/sqlx/src/fixtures/int4_values.rs | 31 + tests/sqlx/src/fixtures/mod.rs | 13 +- tests/sqlx/src/fixtures/spec.rs | 43 +- tests/sqlx/src/helpers.rs | 13 + tests/sqlx/src/lib.rs | 15 +- tests/sqlx/src/matrix.rs | 2745 +++++++++++++++++ tests/sqlx/src/scalar_domains.rs | 308 ++ tests/sqlx/tests/aggregate_tests.rs | 18 +- tests/sqlx/tests/constraint_tests.rs | 127 +- tests/sqlx/tests/encrypted_domain.rs | 12 + .../encrypted_domain/family/inlinability.rs | 252 ++ .../family/jsonb_operator_surface.rs | 75 + .../sqlx/tests/encrypted_domain/family/mod.rs | 7 + .../encrypted_domain/family/mutations.rs | 428 +++ .../tests/encrypted_domain/family/support.rs | 329 ++ .../tests/encrypted_domain/scalars/int4.rs | 14 + .../tests/encrypted_domain/scalars/mod.rs | 4 + tests/sqlx/tests/eql_v2_int4_fixture_tests.rs | 40 +- tests/sqlx/tests/lint_tests.rs | 262 +- 33 files changed, 5191 insertions(+), 318 deletions(-) create mode 100644 tests/codegen/reference/int4/int4_values.rs create mode 100644 tests/sqlx/snapshots/int4_matrix_tests.txt create mode 100644 tests/sqlx/src/fixtures/index_kind.rs create mode 100644 tests/sqlx/src/fixtures/int4_values.rs create mode 100644 tests/sqlx/src/matrix.rs create mode 100644 tests/sqlx/src/scalar_domains.rs create mode 100644 tests/sqlx/tests/encrypted_domain.rs create mode 100644 tests/sqlx/tests/encrypted_domain/family/inlinability.rs create mode 100644 tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs create mode 100644 tests/sqlx/tests/encrypted_domain/family/mod.rs create mode 100644 tests/sqlx/tests/encrypted_domain/family/mutations.rs create mode 100644 tests/sqlx/tests/encrypted_domain/family/support.rs create mode 100644 tests/sqlx/tests/encrypted_domain/scalars/int4.rs create mode 100644 tests/sqlx/tests/encrypted_domain/scalars/mod.rs diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index be0d6fd18..acce7495e 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -15,8 +15,12 @@ description = "Generate a SQLx fixture script via cipherstash-client" dir = "{{config_root}}/tests/sqlx" run = """ fixture="{{arg(name="fixture")}}" +# Match the Rust `FixtureIdentifier` rule: `^[a-z][a-z0-9_]*$`. Reject +# empty, leading-digit, and any non-lowercase-alphanumeric-underscore +# input here so the failure mode is a clear shell error rather than a +# Rust panic during the cargo test invocation. case "$fixture" in - (*[!a-z0-9_]*|'') echo "Invalid fixture name: $fixture (expected [a-z0-9_]+)" >&2; exit 1 ;; + (''|[0-9]*|*[!a-z0-9_]*) echo "Invalid fixture name: $fixture (expected ^[a-z][a-z0-9_]*$)" >&2; exit 1 ;; esac cargo test --features fixture-gen --lib \ diff --git a/tasks/test.sh b/tasks/test.sh index 2e7988e9b..806d6e998 100755 --- a/tasks/test.sh +++ b/tasks/test.sh @@ -22,17 +22,24 @@ echo "" echo "Building EQL..." mise run --output prefix --force build +# Run encrypted-domain codegen generator tests +echo "" +echo "==============================================" +echo "1/3: Running encrypted-domain codegen tests" +echo "==============================================" +mise run --output prefix test:codegen + # Run lints on sqlx tests echo "" echo "==============================================" -echo "1/2: Running linting checks on SQLx Rust tests" +echo "2/3: Running linting checks on SQLx Rust tests" echo "==============================================" mise run --output prefix test:lint # Run SQLx Rust tests echo "" echo "==============================================" -echo "2/2: Running SQLx Rust Tests" +echo "3/3: Running SQLx Rust Tests" echo "==============================================" mise run --output prefix test:sqlx @@ -42,6 +49,7 @@ echo "✅ ALL TESTS PASSED" echo "==============================================" echo "" echo "Summary:" +echo " ✓ Encrypted-domain codegen tests" echo " ✓ SQLx Rust lint checks" echo " ✓ SQLx Rust tests" echo "" diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index dae147d62..6c2032335 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -9,6 +9,9 @@ set -euo pipefail +# Scope: only findings in EQL-owned schemas are gated. +EQL_OWNED_SCHEMAS="('eql_v2')" + # Pinned to splinter main as of 2026-04-27. Bump intentionally. SPLINTER_SHA="55db5b1f28e58d816f7d9136eed87eabcd95868d" SPLINTER_URL="https://raw.githubusercontent.com/supabase/splinter/${SPLINTER_SHA}/splinter.sql" @@ -81,12 +84,12 @@ function_search_path_mutable eql_v2 jsonb_contained_by function GIN-inlining: sa function_search_path_mutable eql_v2 ore_cllw function Consolidated ORE-CLLW extractor (U-006): inlinable SQL so the planner can fold `eql_v2.ore_cllw(col -> 'sel')` calls into the calling query. SET search_path would silently undo the inlining and prevent functional-index match through the extractor form. Two overloads: (jsonb), (eql_v2.ste_vec_entry). function_search_path_mutable eql_v2 has_ore_cllw function Consolidated ORE-CLLW presence check (U-006): inlinable SQL counterpart to `eql_v2.ore_cllw`. Same rationale as `ore_cllw` — must stay unpinned to inline into the calling query. Two overloads: (jsonb), (eql_v2.ste_vec_entry). function_search_path_mutable eql_v2 selector function STE-vec entry selector extractor (#219): typed (eql_v2.ste_vec_entry) overload, inlinable so the planner can fold `eql_v2.selector(col -> 'sel')` into the calling query. -function_search_path_mutable eql_v2 eq function Equality backing function for `eql_v2.ste_vec_entry × eql_v2.ste_vec_entry` (#219). Inlines to `hmac_256(a) = hmac_256(b)`; the `=` operator must reach the functional hash index on `eql_v2.hmac_256(col -> 'sel')` for bare-form field equality to engage Index Scan. -function_search_path_mutable eql_v2 neq function Inequality backing function for `eql_v2.ste_vec_entry`. Same rationale as `eq`. -function_search_path_mutable eql_v2 lt function Less-than backing function for `eql_v2.ste_vec_entry`. Inlines to `ore_cllw(a) < ore_cllw(b)`; must reach the functional btree opclass on `eql_v2.ore_cllw` for ordered field queries to engage Index Scan. -function_search_path_mutable eql_v2 lte function Less-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. -function_search_path_mutable eql_v2 gt function Greater-than backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. -function_search_path_mutable eql_v2 gte function Greater-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. +function_search_path_mutable eql_v2 eq function Equality backing function for `eql_v2.ste_vec_entry × eql_v2.ste_vec_entry` (#219). Inlines to `hmac_256(a) = hmac_256(b)`; the `=` operator must reach the functional hash index on `eql_v2.hmac_256(col -> 'sel')` for bare-form field equality to engage Index Scan. Splinter matches by name only, so this row also covers the converged eql_v2.eq wrappers on eql_v2_int4_eq / _ord / _ord_ore (PR #225). +function_search_path_mutable eql_v2 neq function Inequality backing function for `eql_v2.ste_vec_entry`. Same rationale as `eq`. Also covers the converged eql_v2.neq wrappers on eql_v2_int4_eq / _ord / _ord_ore (PR #225). +function_search_path_mutable eql_v2 lt function Less-than backing function for `eql_v2.ste_vec_entry`. Inlines to `ore_cllw(a) < ore_cllw(b)`; must reach the functional btree opclass on `eql_v2.ore_cllw` for ordered field queries to engage Index Scan. Splinter matches by name only, so this row also covers the converged eql_v2.lt wrappers on eql_v2_int4_ord / _ord_ore (PR #225). +function_search_path_mutable eql_v2 lte function Less-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. Also covers the converged eql_v2.lte wrappers on eql_v2_int4_ord / _ord_ore (PR #225). +function_search_path_mutable eql_v2 gt function Greater-than backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. Also covers the converged eql_v2.gt wrappers on eql_v2_int4_ord / _ord_ore (PR #225). +function_search_path_mutable eql_v2 gte function Greater-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. Also covers the converged eql_v2.gte wrappers on eql_v2_int4_ord / _ord_ore (PR #225). function_search_path_mutable eql_v2 ore_cllw_eq function Inner comparator for the `eql_v2.ore_cllw` type's `=` operator (#221). The outer same-type operators back the btree opclass on `eql_v2.ore_cllw`; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). Mirrors ore_block_u64_8_256_eq. function_search_path_mutable eql_v2 ore_cllw_neq function Inner comparator for the `eql_v2.ore_cllw` type's `<>` operator (#221). Same rationale as `ore_cllw_eq`. function_search_path_mutable eql_v2 ore_cllw_lt function Inner comparator for the `eql_v2.ore_cllw` type's `<` operator (#221). Same rationale as `ore_cllw_eq`. @@ -94,10 +97,11 @@ function_search_path_mutable eql_v2 ore_cllw_lte function Inner comparator for t function_search_path_mutable eql_v2 ore_cllw_gt function Inner comparator for the `eql_v2.ore_cllw` type's `>` operator (#221). Same rationale as `ore_cllw_eq`. function_search_path_mutable eql_v2 ore_cllw_gte function Inner comparator for the `eql_v2.ore_cllw` type's `>=` operator (#221). Same rationale as `ore_cllw_eq`. function_search_path_mutable eql_v2 -> function Typed sv-element selector lookup (U-007): inlinable SQL so the planner can fold `col -> ''` into the calling query, preserving functional-index match for the chained recipes `WHERE col -> 'sel' = $1::ste_vec_entry` (via eq_term) and `ORDER BY eql_v2.ore_cllw(col -> 'sel')`. Three overloads: (enc, text), (enc, enc), (enc, int). -function_search_path_mutable eql_v2 eq_term function XOR-aware equality term extractor on a ste_vec entry (U-007): coalesces hm and oc as bytea. Must inline so `eql_v2.eq_term(col -> 'sel')` folds into the calling query and matches a functional hash index built on the same expression — same precedent as ore_cllw / hmac_256 extractors on ste_vec_entry. +function_search_path_mutable eql_v2 eq_term function XOR-aware equality term extractor on a ste_vec entry (U-007): coalesces hm and oc as bytea. Must inline so `eql_v2.eq_term(col -> 'sel')` folds into the calling query and matches a functional hash index built on the same expression — same precedent as ore_cllw / hmac_256 extractors on ste_vec_entry. Also covers the eql_v2_int4_eq eq_term overload (PR #225). function_search_path_mutable eql_v2 min function Aggregate (splinter labels these type=function): ALTER AGGREGATE has no SET configuration_parameter syntax, and ALTER ROUTINE/FUNCTION reject aggregates. The aggregate's SFUNC has a pinned search_path. function_search_path_mutable eql_v2 max function Aggregate: same as min. function_search_path_mutable eql_v2 grouped_value function Aggregate: same as min. +function_search_path_mutable eql_v2 ord_term function eql_v2_int4 ordered-variant index extractor: returns eql_v2.ore_block_u64_8_256 (carrying main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v2.ord_term(col)); must inline. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). Covers both ord_term overloads (eql_v2_int4_ord_ore, eql_v2_int4_ord). ALLOW # Wrap splinter (a single bare SELECT expression) into a subquery we can @@ -106,6 +110,7 @@ ALLOW splinter_body="$(tail -n +2 "$splinter_sql" | sed 's/;[[:space:]]*$//')" # Pull all findings with their metadata, then split into allowlisted vs not. +# Scoped to EQL-owned schemas — see EQL_OWNED_SCHEMAS at the top of this file. "${PSQL[@]}" -At -F $'\t' --quiet < "$all_findings_tsv" BEGIN; SET LOCAL search_path = ''; @@ -117,6 +122,7 @@ SELECT coalesce(metadata->>'name', ''), coalesce(metadata->>'type', '') FROM (${splinter_body}) splinter +WHERE coalesce(metadata->>'schema', '') IN ${EQL_OWNED_SCHEMAS} ORDER BY level, name, detail; COMMIT; SQL @@ -155,11 +161,14 @@ awk -F'\t' \ # Touch in case awk didn't write either file (no findings at all). touch "$findings_tsv" "$allowlisted_tsv" +# Summary scoped to the same schemas the gate considers, so the count line +# matches what was actually checked. "${PSQL[@]}" -At -F $'\t' --quiet < "$summary_by_rule" BEGIN; SET LOCAL search_path = ''; SELECT level, name, count(*) FROM (${splinter_body}) splinter +WHERE coalesce(metadata->>'schema', '') IN ${EQL_OWNED_SCHEMAS} GROUP BY level, name ORDER BY CASE level WHEN 'ERROR' THEN 0 WHEN 'WARN' THEN 1 WHEN 'INFO' THEN 2 ELSE 3 END, @@ -175,7 +184,7 @@ warns="$(awk -F'\t' '$2 == "WARN"' "$findings_tsv" | wc -l | tr -d ' ')" infos="$(awk -F'\t' '$2 == "INFO"' "$findings_tsv" | wc -l | tr -d ' ')" echo -echo "Splinter findings: raw=${raw_total} (allowlisted=${allowlisted_total}, unallowlisted=${total} — ERROR=${errors} WARN=${warns} INFO=${infos})" +echo "Splinter findings: raw=${raw_total} (allowlisted=${allowlisted_total}, unmatched=${total} — ERROR=${errors} WARN=${warns} INFO=${infos})" echo printf 'LEVEL\tRULE\tCOUNT (raw)\n' cat "$summary_by_rule" @@ -188,7 +197,7 @@ fi if [[ "$total" -gt 0 ]]; then echo - echo "Unallowlisted findings:" + echo "Findings not covered by the allowlist:" awk -F'\t' '{ printf " - [%s] %s — %s\n", $2, $1, $3 }' "$findings_tsv" fi @@ -198,11 +207,12 @@ if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then echo "## Supabase splinter (database linter)" echo echo "Pinned to [\`splinter@${SPLINTER_SHA:0:12}\`](https://github.com/supabase/splinter/tree/${SPLINTER_SHA})." + echo "Scope: schemas owned by EQL (${EQL_OWNED_SCHEMAS//[\'()]/}). Findings outside these schemas are not reported." echo - echo "**${raw_total} raw findings** (allowlisted: ${allowlisted_total}, unallowlisted: ${total} — ERROR: ${errors}, WARN: ${warns}, INFO: ${infos})" + echo "**${raw_total} raw findings** (allowlisted: ${allowlisted_total}, unmatched: ${total} — ERROR: ${errors}, WARN: ${warns}, INFO: ${infos})" echo if [[ "$total" -gt 0 ]]; then - echo "### Unallowlisted findings (action required)" + echo "### Unmatched findings (action required)" echo echo "| Level | Rule | Detail |" echo "| --- | --- | --- |" diff --git a/tests/codegen/reference/int4/int4_values.rs b/tests/codegen/reference/int4/int4_values.rs new file mode 100644 index 000000000..3e6b1ec68 --- /dev/null +++ b/tests/codegen/reference/int4/int4_values.rs @@ -0,0 +1,28 @@ +// REFERENCE: hand-reviewed parity baseline for tasks/codegen/ — see ../README.md +//! Fixture plaintext values for the int4 encrypted-domain family. +//! +//! Generated from tasks/codegen/types/int4.toml `[fixture] values` — +//! the single source of truth shared by the fixture generator +//! (`fixtures::eql_v2_int4`) and the matrix oracle +//! (`ScalarType::FIXTURE_VALUES`). + +/// Distinct plaintext values present in the `eql_v2_int4` fixture. +pub const VALUES: &[i32] = &[ + i32::MIN, + -100, + -1, + 0, + 1, + 2, + 5, + 10, + 17, + 25, + 42, + 50, + 100, + 250, + 1000, + 9999, + i32::MAX, +]; diff --git a/tests/sqlx/Cargo.lock b/tests/sqlx/Cargo.lock index e39e030b2..18dd84e08 100644 --- a/tests/sqlx/Cargo.lock +++ b/tests/sqlx/Cargo.lock @@ -1163,6 +1163,7 @@ dependencies = [ "cipherstash-client", "hex", "jsonschema", + "paste", "serde", "serde_json", "sqlx", @@ -2525,6 +2526,12 @@ dependencies = [ "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.3" diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 12273e6c3..50f7d035a 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -12,6 +12,7 @@ anyhow = "1" hex = "0.4" jsonschema = { version = "0.46.4", default-features = false } cipherstash-client = { version = "0.35", features = ["tokio"] } +paste = "1" [dev-dependencies] # None needed - tests live in this crate @@ -23,6 +24,13 @@ default = [] # it on push to main and on a nightly schedule. Run locally with: # mise run test:bench bench = [] +# Opt-in to the matrix's per-(variant, index) scale tests. Each builds +# ~5000 rows of filler plus a single selective pivot and asserts the +# planner *prefers* the functional index with `enable_seqscan` left on. +# The default index tests force seqscan off and only prove the index is +# *usable*. Off by default to keep `mise run test` fast; CI runs with +# `--features scale`. +scale = [] # Opt-in to compiling the fixture generators. Without this feature the # `#[cfg(feature = "fixture-gen")]` generator tests do not exist, so # `cargo test` and CI never see them. Generators need a live Postgres and, diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 58ecd7420..f01edce7e 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -9,7 +9,6 @@ EQL Extension (via migrations) ├── encrypted_json.sql │ └── array_data.sql (extends `encrypted` table from encrypted_json) ├── match_data.sql - ├── aggregate_minmax_data.sql ├── config_tables.sql ├── constraint_tables.sql ├── encryptindex_tables.sql @@ -232,7 +231,7 @@ CREATE TABLE fixtures.eql_v2_int4 ( (`k = "ct"`, `v = 2`). **Used By:** -- eql_v2_int4_fixture_tests.rs (structural verification) +- `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` (structural verification, generated per type) - (#225) the `eql_v2_int4` domain operator tests, via per-query `payload` casts **Opt-in:** Not a migration — a SQLx fixture script. Each consuming test opts diff --git a/tests/sqlx/snapshots/int4_matrix_tests.txt b/tests/sqlx/snapshots/int4_matrix_tests.txt new file mode 100644 index 000000000..1fab59bd0 --- /dev/null +++ b/tests/sqlx/snapshots/int4_matrix_tests.txt @@ -0,0 +1,211 @@ +scalars::int4::matrix_int4_eq_aggregate_typecheck_max +scalars::int4::matrix_int4_eq_aggregate_typecheck_min +scalars::int4::matrix_int4_eq_contained_by_blocker +scalars::int4::matrix_int4_eq_contains_blocker +scalars::int4::matrix_int4_eq_count_distinct_extractor +scalars::int4::matrix_int4_eq_count_path_cast +scalars::int4::matrix_int4_eq_count_typed_column +scalars::int4::matrix_int4_eq_eq_pivot_max_correctness +scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape +scalars::int4::matrix_int4_eq_eq_pivot_min_correctness +scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape +scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness +scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape +scalars::int4::matrix_int4_eq_eq_supported_null +scalars::int4::matrix_int4_eq_gt_blocker +scalars::int4::matrix_int4_eq_gte_blocker +scalars::int4::matrix_int4_eq_index_engages_btree +scalars::int4::matrix_int4_eq_index_engages_hash +scalars::int4::matrix_int4_eq_lt_blocker +scalars::int4::matrix_int4_eq_lte_blocker +scalars::int4::matrix_int4_eq_native_absent_ops +scalars::int4::matrix_int4_eq_neq_pivot_max_correctness +scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape +scalars::int4::matrix_int4_eq_neq_pivot_min_correctness +scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape +scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness +scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape +scalars::int4::matrix_int4_eq_neq_supported_null +scalars::int4::matrix_int4_eq_path_op_blockers +scalars::int4::matrix_int4_eq_payload_check +scalars::int4::matrix_int4_eq_planner_metadata_eq +scalars::int4::matrix_int4_eq_sanity +scalars::int4::matrix_int4_eq_typed_column_blocker +scalars::int4::matrix_int4_fixture_shape +scalars::int4::matrix_int4_ord_aggregate_group_by_max +scalars::int4::matrix_int4_ord_aggregate_group_by_min +scalars::int4::matrix_int4_ord_aggregate_max +scalars::int4::matrix_int4_ord_aggregate_max_all_null +scalars::int4::matrix_int4_ord_aggregate_max_empty +scalars::int4::matrix_int4_ord_aggregate_max_mixed_null +scalars::int4::matrix_int4_ord_aggregate_min +scalars::int4::matrix_int4_ord_aggregate_min_all_null +scalars::int4::matrix_int4_ord_aggregate_min_empty +scalars::int4::matrix_int4_ord_aggregate_min_mixed_null +scalars::int4::matrix_int4_ord_aggregate_parallel_safe +scalars::int4::matrix_int4_ord_contained_by_blocker +scalars::int4::matrix_int4_ord_contains_blocker +scalars::int4::matrix_int4_ord_count_distinct_extractor +scalars::int4::matrix_int4_ord_count_path_cast +scalars::int4::matrix_int4_ord_count_typed_column +scalars::int4::matrix_int4_ord_eq_pivot_max_correctness +scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_eq_pivot_min_correctness +scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness +scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_eq_supported_null +scalars::int4::matrix_int4_ord_gt_pivot_max_correctness +scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_gt_pivot_min_correctness +scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness +scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_gt_supported_null +scalars::int4::matrix_int4_ord_gte_pivot_max_correctness +scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_gte_pivot_min_correctness +scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness +scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_gte_supported_null +scalars::int4::matrix_int4_ord_index_engages_btree +scalars::int4::matrix_int4_ord_lt_pivot_max_correctness +scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_lt_pivot_min_correctness +scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness +scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_lt_supported_null +scalars::int4::matrix_int4_ord_lte_pivot_max_correctness +scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_lte_pivot_min_correctness +scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness +scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_lte_supported_null +scalars::int4::matrix_int4_ord_native_absent_ops +scalars::int4::matrix_int4_ord_neq_pivot_max_correctness +scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_neq_pivot_min_correctness +scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness +scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_neq_supported_null +scalars::int4::matrix_int4_ord_ord_routes_through_ob +scalars::int4::matrix_int4_ord_order_by_asc_no_where +scalars::int4::matrix_int4_ord_order_by_asc_nulls_first +scalars::int4::matrix_int4_ord_order_by_asc_nulls_last +scalars::int4::matrix_int4_ord_order_by_asc_with_where +scalars::int4::matrix_int4_ord_order_by_desc_no_where +scalars::int4::matrix_int4_ord_order_by_desc_nulls_first +scalars::int4::matrix_int4_ord_order_by_desc_nulls_last +scalars::int4::matrix_int4_ord_order_by_desc_with_where +scalars::int4::matrix_int4_ord_order_by_using_gt_rejects +scalars::int4::matrix_int4_ord_order_by_using_gte_rejects +scalars::int4::matrix_int4_ord_order_by_using_lt_rejects +scalars::int4::matrix_int4_ord_order_by_using_lte_rejects +scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max +scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min +scalars::int4::matrix_int4_ord_ore_aggregate_max +scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null +scalars::int4::matrix_int4_ord_ore_aggregate_max_empty +scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null +scalars::int4::matrix_int4_ord_ore_aggregate_min +scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null +scalars::int4::matrix_int4_ord_ore_aggregate_min_empty +scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null +scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe +scalars::int4::matrix_int4_ord_ore_contained_by_blocker +scalars::int4::matrix_int4_ord_ore_contains_blocker +scalars::int4::matrix_int4_ord_ore_count_distinct_extractor +scalars::int4::matrix_int4_ord_ore_count_path_cast +scalars::int4::matrix_int4_ord_ore_count_typed_column +scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness +scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness +scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness +scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_ore_eq_supported_null +scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness +scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness +scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness +scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_ore_gt_supported_null +scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness +scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness +scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness +scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_ore_gte_supported_null +scalars::int4::matrix_int4_ord_ore_index_engages_btree +scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness +scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness +scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness +scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_ore_lt_supported_null +scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness +scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness +scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness +scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_ore_lte_supported_null +scalars::int4::matrix_int4_ord_ore_native_absent_ops +scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness +scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape +scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness +scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape +scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness +scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape +scalars::int4::matrix_int4_ord_ore_neq_supported_null +scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob +scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where +scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first +scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last +scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where +scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where +scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first +scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last +scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where +scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects +scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects +scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects +scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects +scalars::int4::matrix_int4_ord_ore_ore_injectivity +scalars::int4::matrix_int4_ord_ore_path_op_blockers +scalars::int4::matrix_int4_ord_ore_payload_check +scalars::int4::matrix_int4_ord_ore_planner_metadata_eq +scalars::int4::matrix_int4_ord_ore_planner_metadata_ord +scalars::int4::matrix_int4_ord_ore_sanity +scalars::int4::matrix_int4_ord_ore_typed_column_blocker +scalars::int4::matrix_int4_ord_path_op_blockers +scalars::int4::matrix_int4_ord_payload_check +scalars::int4::matrix_int4_ord_planner_metadata_eq +scalars::int4::matrix_int4_ord_planner_metadata_ord +scalars::int4::matrix_int4_ord_sanity +scalars::int4::matrix_int4_ord_scale_preference_default_btree +scalars::int4::matrix_int4_ord_typed_column_blocker +scalars::int4::matrix_int4_storage_aggregate_typecheck_max +scalars::int4::matrix_int4_storage_aggregate_typecheck_min +scalars::int4::matrix_int4_storage_contained_by_blocker +scalars::int4::matrix_int4_storage_contains_blocker +scalars::int4::matrix_int4_storage_count_path_cast +scalars::int4::matrix_int4_storage_count_typed_column +scalars::int4::matrix_int4_storage_eq_blocker +scalars::int4::matrix_int4_storage_gt_blocker +scalars::int4::matrix_int4_storage_gte_blocker +scalars::int4::matrix_int4_storage_lt_blocker +scalars::int4::matrix_int4_storage_lte_blocker +scalars::int4::matrix_int4_storage_native_absent_ops +scalars::int4::matrix_int4_storage_neq_blocker +scalars::int4::matrix_int4_storage_path_op_blockers +scalars::int4::matrix_int4_storage_payload_check +scalars::int4::matrix_int4_storage_sanity +scalars::int4::matrix_int4_storage_typed_column_blocker diff --git a/tests/sqlx/src/assertions.rs b/tests/sqlx/src/assertions.rs index 2fa7d4b6d..538db6a12 100644 --- a/tests/sqlx/src/assertions.rs +++ b/tests/sqlx/src/assertions.rs @@ -148,3 +148,51 @@ impl<'a> QueryAssertion<'a> { ); } } + +/// Assert a `sqlx::Error` is a database error with the given SQLSTATE, +/// optionally with the given constraint name. Includes the actual error +/// in the panic message so a failing test prints *why* it failed, not +/// just *that* it failed — `assert!(result.is_err(), "…")` swallows the +/// underlying error so a constraint engagement against the wrong +/// constraint or SQLSTATE passes silently. +/// +/// # SQLSTATEs commonly seen on encrypted columns +/// - `23505` — unique_violation +/// - `23502` — not_null_violation +/// - `23514` — check_violation +/// - `23503` — foreign_key_violation +/// - `P0001` — raise_exception (PL/pgSQL `RAISE EXCEPTION`) +/// - `42704` — undefined_object (no operator class found, etc.) +/// +/// # Example +/// ```ignore +/// let result = sqlx::query(...).execute(&pool).await.unwrap_err(); +/// assert_db_error(&result, "23514", Some("encrypted_check_c_constrained")); +/// ``` +pub fn assert_db_error( + err: &sqlx::Error, + expected_sqlstate: &str, + expected_constraint: Option<&str>, +) { + let db_err = err + .as_database_error() + .unwrap_or_else(|| panic!("expected database error, got: {err:?}")); + + let code = db_err.code(); + assert_eq!( + code.as_deref(), + Some(expected_sqlstate), + "expected SQLSTATE {expected_sqlstate}, got {code:?} (message: {})", + db_err.message(), + ); + + if let Some(expected) = expected_constraint { + let constraint = db_err.constraint(); + assert_eq!( + constraint, + Some(expected), + "expected constraint name {expected:?}, got {constraint:?} (message: {})", + db_err.message(), + ); + } +} diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index bb3a69bcc..d7a8e8ca4 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -8,11 +8,12 @@ //! existed only because the Proxy was the encryption oracle. //! //! `cipherstash-client` 0.35 exposes the same surface natively. This module -//! owns the bootstrap — `cipher()` lazily builds a process-wide -//! `ScopedCipher` — and the per-value helper -//! `encrypt_store()` that wraps `eql::encrypt_eql` and returns the resulting -//! EQL ciphertext as a `serde_json::Value` ready to bind into a `jsonb` -//! column. +//! owns the bootstrap — `build_cipher()` builds a `ScopedCipher` — +//! and the batched helper `encrypt_store()` that wraps `eql::encrypt_eql` and +//! returns the resulting EQL ciphertexts as `serde_json::Value`s ready to bind +//! into a `jsonb` column. A fixture-generator process makes exactly one +//! `encrypt_store` call, so the cipher is built once per process by +//! construction — no static cache, no cross-runtime hazard. //! //! `column_config_for` is the bridge between the fixture spec's string-typed //! index names (`"unique"`, `"ore"`, …) and the typed `IndexType` enum @@ -32,70 +33,38 @@ use cipherstash_client::schema::column::{Index, IndexType}; use cipherstash_client::schema::{ColumnConfig, ColumnType}; use cipherstash_client::zerokms::{EnvKeyProvider, ZeroKMSBuilder}; use cipherstash_client::AutoStrategy; -use tokio::sync::OnceCell; use super::eql_plaintext::{Cast, EqlPlaintext}; -use super::validation::FixtureIdentifier; - -/// Process-wide `ScopedCipher`. Built on first use and held for the lifetime -/// of the test binary — `ScopedCipher` is documented as -/// "initialise once per process, hold an `Arc` for the process lifetime" -/// (see the upstream doc comment in `scoped_cipher.rs`). Re-initialising it -/// per call discards the warm reqwest pool and the cached auth token, and -/// makes the generator slower for no benefit. -static CIPHER: OnceCell>> = OnceCell::const_new(); - -/// Lazily initialise the process-wide cipher. On the first call this performs -/// the AutoStrategy detection, the ZeroKMS handshake, and the keyset load — -/// each subsequent call is an `Arc` clone. -/// -/// Errors surface as `anyhow::Error` with `.context(...)` naming the step -/// that failed (credential detection vs ZeroKMS connect vs keyset load). -pub async fn cipher() -> Result>> { - CIPHER - .get_or_try_init(|| async { - let zerokms = ZeroKMSBuilder::auto() - .context( - "building ZeroKMSBuilder via AutoStrategy::detect() — check \ - CS_CLIENT_ACCESS_KEY or CS_WORKSPACE_CRN env vars", - )? - .with_key_provider(EnvKeyProvider) - .build() - .await - .context( - "building ZeroKMS client — check CS_CLIENT_ID + CS_CLIENT_KEY \ - env vars (loaded by EnvKeyProvider)", - )?; - - let cipher = ScopedCipher::init_default(Arc::new(zerokms)) - .await - .context("initialising ScopedCipher for the default keyset")?; - - Ok::<_, anyhow::Error>(Arc::new(cipher)) - }) - .await - .cloned() +use super::index_kind::IndexKind; + +/// Build a fresh `ScopedCipher`. Performs `AutoStrategy::detect()`, the +/// ZeroKMS handshake, and the keyset load on every call — fine because +/// every fixture-generator process calls this exactly once via the +/// single batched `encrypt_store`. +async fn build_cipher() -> Result>> { + let zerokms = ZeroKMSBuilder::auto()? + .with_key_provider(EnvKeyProvider) + .build() + .await?; + + let cipher = ScopedCipher::init_default(Arc::new(zerokms)).await?; + + Ok(Arc::new(cipher)) } /// Build a `ColumnConfig` from the fixture spec's index list + cast. /// -/// The fixture spec uses EQL's string-typed index identifiers (`"unique"`, -/// `"ore"`, `"match"`, `"ste_vec"`); cipherstash-config uses the typed -/// `IndexType` enum. The mapping here is the single point of contact -/// between the two — extending fixture coverage to a new index means one -/// new arm here plus the corresponding `EqlPlaintext::CAST` constant. -/// -/// Unknown identifiers raise immediately with the offending name in the -/// error so a typo at spec-construction surfaces at run time (the -/// `FixtureIdentifier` newtype only proves the string is a valid SQL -/// identifier, not that it names a real index type). -pub fn column_config_for(spec_indexes: &[FixtureIdentifier], cast: Cast) -> Result { +/// `IndexKind` is a typed enum — every value is a real EQL index by +/// construction, so the mapping is total and `column_config_for` cannot +/// fail on an unknown index name. Extending fixture coverage to a new +/// index is one variant on `IndexKind` plus one arm here, both compile- +/// time checked. +pub fn column_config_for(spec_indexes: &[IndexKind], cast: Cast) -> Result { let column_type = cast_to_column_type(cast)?; let mut config = ColumnConfig::build("payload").casts_as(column_type); for ix in spec_indexes { - let index_type = index_type_for(ix.as_str())?; - config = config.add_index(Index::new(index_type)); + config = config.add_index(Index::new(index_type_for(*ix))); } Ok(config) @@ -126,19 +95,17 @@ fn cast_to_column_type(cast: Cast) -> Result { } } -/// Map the fixture spec's string-typed index identifier onto a typed -/// `IndexType`. Reuses the canonical constructors on `Index` -/// (`Index::new_unique`, etc.) so the defaults stay in sync with whatever -/// cipherstash-config considers the canonical shape for each index. -fn index_type_for(name: &str) -> Result { - match name { - "unique" => Ok(Index::new_unique().index_type), - "ore" => Ok(IndexType::Ore), - "match" => Ok(Index::new_match().index_type), - other => Err(anyhow!( - "unknown EQL index identifier {other:?} — supported: \ - unique, ore, match" - )), +/// Map an `IndexKind` variant onto cipherstash-config's `IndexType`. +/// Reuses the canonical constructors on `Index` (`Index::new_unique`, +/// etc.) so the defaults stay in sync with whatever cipherstash-config +/// considers the canonical shape for each index. Total — every variant +/// has an arm; adding a new variant is a compile error here, which is +/// the point. +fn index_type_for(kind: IndexKind) -> IndexType { + match kind { + IndexKind::Unique => Index::new_unique().index_type, + IndexKind::Ore => IndexType::Ore, + IndexKind::Match => Index::new_match().index_type, } } @@ -158,9 +125,10 @@ fn index_type_for(name: &str) -> Result { /// index filter — the same defaults Proxy uses for column-config-driven /// inserts. /// -/// An empty `values` slice short-circuits before `cipher()` so a caller -/// with nothing to encrypt does not pay the ZeroKMS bootstrap cost. -pub async fn encrypt_store( +/// An empty `values` slice short-circuits before `build_cipher()` so a +/// caller with nothing to encrypt does not pay the ZeroKMS bootstrap +/// cost. +pub async fn encrypt_store( table: &str, column: &str, values: &[T], @@ -170,7 +138,7 @@ pub async fn encrypt_store( return Ok(Vec::new()); } - let cipher = cipher().await?; + let cipher = build_cipher().await?; // `Identifier::new` does two `String` allocations per call — cheap // enough that constructing per-iteration is preferred over assuming @@ -228,13 +196,9 @@ pub async fn encrypt_store( mod tests { use super::*; - fn ident(s: &str) -> FixtureIdentifier { - FixtureIdentifier::try_from(s).unwrap() - } - #[test] fn column_config_for_int_with_unique_and_ore_builds_a_two_index_config() { - let indexes = [ident("unique"), ident("ore")]; + let indexes = [IndexKind::Unique, IndexKind::Ore]; let config = column_config_for(&indexes, Cast::INT).unwrap(); assert_eq!(config.name, "payload"); @@ -244,51 +208,34 @@ mod tests { assert!(config.indexes.iter().any(|i| i.is_ore())); } - #[test] - fn column_config_for_rejects_an_unknown_index_name() { - let indexes = [ident("bogus")]; - let err = column_config_for(&indexes, Cast::INT).unwrap_err(); - assert!( - format!("{err:#}").contains("unknown EQL index identifier"), - "error should name the unknown identifier: {err:#}" - ); - } - - #[test] - fn index_type_for_maps_known_names_to_their_canonical_index_type() { - // The named EQL index identifiers each round-trip into the - // `IndexType` cipherstash-config considers canonical for that - // name. Compared via the public `Index` surface (`is_unique`, - // `is_ore`, `is_match`) so the assertion does not depend on the - // shape of the non-exhaustive `IndexType` enum. - let unique = Index::new(index_type_for("unique").unwrap()); - assert!(unique.is_unique(), "'unique' must map to the unique index"); - - let ore = Index::new(index_type_for("ore").unwrap()); - assert!(ore.is_ore(), "'ore' must map to the ORE index"); - - let m = Index::new(index_type_for("match").unwrap()); - assert!(m.is_match(), "'match' must map to the match (bloom) index"); - } + // Note: the "unknown index name rejected at runtime" test is gone — + // `IndexKind` is a closed enum, so a typo is a compile error. #[test] - fn index_type_for_rejects_an_unknown_index_name() { - let err = index_type_for("bogus").unwrap_err(); - let msg = format!("{err:#}"); - assert!( - msg.contains("unknown EQL index identifier") && msg.contains("bogus"), - "error should name the offending identifier: {msg}" - ); + fn index_type_for_maps_every_variant_to_its_canonical_index_type() { + // Each `IndexKind` variant round-trips into the `IndexType` + // cipherstash-config considers canonical for that name. Compared + // via the public `Index` surface (`is_unique`, `is_ore`, + // `is_match`) so the assertion does not depend on the shape of + // the non-exhaustive `IndexType` enum. + let unique = Index::new(index_type_for(IndexKind::Unique)); + assert!(unique.is_unique(), "Unique must map to the unique index"); + + let ore = Index::new(index_type_for(IndexKind::Ore)); + assert!(ore.is_ore(), "Ore must map to the ORE index"); + + let m = Index::new(index_type_for(IndexKind::Match)); + assert!(m.is_match(), "Match must map to the match (bloom) index"); } #[tokio::test] - async fn encrypt_store_with_empty_values_returns_an_empty_vec_without_calling_cipher() { - // Empty input short-circuits before `cipher()` so a caller with - // nothing to encrypt does not pay the ZeroKMS bootstrap cost. + async fn encrypt_store_with_empty_values_returns_an_empty_vec_without_building_cipher() { + // Empty input short-circuits before `build_cipher()` so a caller + // with nothing to encrypt does not pay the ZeroKMS bootstrap cost. // Running this test under `cargo test` (no `fixture-gen` feature, - // no CS_* env vars) proves the short-circuit: if `cipher()` were - // reached, the missing credentials would surface as an error. - let config = column_config_for(&[ident("unique")], Cast::INT).unwrap(); + // no CS_* env vars) proves the short-circuit: if `build_cipher()` + // were reached, the missing credentials would surface as an error. + let config = column_config_for(&[IndexKind::Unique], Cast::INT).unwrap(); let out = encrypt_store::("t", "c", &[], &config).await.unwrap(); assert!(out.is_empty(), "empty input must yield empty output"); } @@ -326,20 +273,11 @@ mod tests { /// by `fixture-gen` so default `cargo test` runs do not require /// `CS_CLIENT_ACCESS_KEY` / `CS_WORKSPACE_CRN`. Each test is /// `#[ignore]` so it only runs under -/// `cargo test --features fixture-gen -- --ignored --test-threads=1`, -/// mirroring the `generate` test in `eql_v2_int4.rs`. -/// -/// **Must run serially (`--test-threads=1`).** The process-wide -/// `CIPHER` `OnceCell` caches a `ScopedCipher` whose reqwest connection -/// pool is bound to the tokio runtime that initialised it. Each -/// `#[tokio::test]` builds its own runtime, so under parallel -/// execution the second test's calls go through a pool whose -/// dispatcher has been dropped — failing with -/// "SendRequest: dispatch task is gone". Production fixture runs (one -/// `#[tokio::main]` runtime) are unaffected. +/// `cargo test --features fixture-gen -- --ignored`, mirroring the +/// `generate` test in `eql_v2_int4.rs`. /// /// These complement the structural fixture-tests in -/// `tests/sqlx/tests/eql_v2_int4_fixture_tests.rs`: those assert over the +/// the `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs`: those assert over the /// regenerated SQL file end-to-end; these isolate the /// `encrypt_store` call so an SDK API drift surfaces here before the /// whole fixture pipeline fails. @@ -348,19 +286,15 @@ mod live_tests { use super::*; use serde_json::Value; - fn ident(s: &str) -> FixtureIdentifier { - FixtureIdentifier::try_from(s).unwrap() - } - - /// Config used by every live test — `unique` drives the `hm` term, - /// `ore` drives the `ob` term, so the returned payloads carry both. + /// Config used by every live test — `Unique` drives the `hm` term, + /// `Ore` drives the `ob` term, so the returned payloads carry both. fn int_config_with_hm_and_ob() -> ColumnConfig { - column_config_for(&[ident("unique"), ident("ore")], Cast::INT).unwrap() + column_config_for(&[IndexKind::Unique, IndexKind::Ore], Cast::INT).unwrap() } /// Assert the well-formed Store shape: the payload is a JSON object /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields. Mirrors the - /// per-key assertions in `eql_v2_int4_fixture_tests.rs`. + /// per-key assertions in `tests/encrypted_domain/scalars/int4/fixture.rs`. fn assert_store_shape(payload: &Value) { let obj = payload.as_object().expect("payload must be a JSON object"); for key in ["v", "c", "hm", "ob", "i"] { diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs index 90060a5f0..1d6c3f45b 100644 --- a/tests/sqlx/src/fixtures/driver.rs +++ b/tests/sqlx/src/fixtures/driver.rs @@ -110,11 +110,15 @@ where /// Generate and write `tests/sqlx/fixtures/.sql`. /// /// The production entry point. Parses the env-driven `DriverConfig` - /// once, opens a direct Postgres connection, then delegates the - /// schema + teardown orchestration to `run_with`, supplying - /// `insert_direct` as the closure. After `run_with` returns the - /// rendered INSERT lines, this method composes them with + /// once, opens a single direct Postgres connection, runs the + /// schema/insert/render/drop pipeline inline against that connection + /// (no second connection needed — encryption happens in Rust via + /// cipherstash-client), then composes the rendered INSERT lines with /// `fixture_script_preamble` and writes the committed script to disk. + /// + /// The pipeline mirrors the teardown contract in `run_with`: drop the + /// working table unconditionally once it has been created, and + /// propagate failures in causal order (insert error first). pub async fn run(&self) -> Result<()> { let config = DriverConfig::from_env()?; @@ -125,21 +129,42 @@ where .await .context("connecting to Postgres (direct)")?; - // Second direct connection for the inserter closure. `run_with` - // borrows the first connection mutably for the duration of the - // pipeline, so the inserter must hold its own. - let mut inserter_conn = config - .direct - .clone() - .connect() + self.check_complete().context("invalid FixtureSpec")?; + + sqlx::raw_sql(&self.working_schema_sql()) + .execute(&mut direct) .await - .context("connecting to Postgres (direct inserter)")?; + .context("applying working-table schema")?; - let lines = self - .run_with(&mut direct, || self.insert_direct(&mut inserter_conn)) - .await?; + // Insert directly on the same connection used for schema/render/drop. + // The earlier two-connection design existed because `run_with` borrows + // `direct` mutably across the closure call; production has no such + // need — `insert_direct` is the only caller of cipherstash-client and + // can hold the same `&mut direct` for its duration. + let insert_result = self.insert_direct(&mut direct).await; + let render_result = if insert_result.is_ok() { + sqlx::query(&self.render_rows_sql()) + .fetch_all(&mut direct) + .await + .context("rendering fixture rows") + } else { + Ok(Vec::new()) + }; + + let working = self.working_table(); + let drop_result = sqlx::raw_sql(&format!("DROP TABLE IF EXISTS public.{working};")) + .execute(&mut direct) + .await; + + insert_result?; + let rows = render_result?; + drop_result.context("dropping the working table")?; + + let lines: Vec = rows + .iter() + .map(|r| r.try_get::(0).context("reading rendered INSERT")) + .collect::>()?; - let _ = inserter_conn.close().await; let _ = direct.close().await; let mut script = self.fixture_script_preamble(); @@ -190,29 +215,34 @@ where Ok(()) } - /// Orchestrates the schema-apply / insert / render / teardown pipeline - /// against a caller-supplied `direct` connection, with the insert step - /// pluggable via `insert_rows`. The pipeline is: + /// **Test seam** for the schema-apply / insert / render / teardown + /// pipeline. Production code uses `run()`, which inlines the same + /// pipeline on a single connection. This entry point exists so tests + /// can plug in arbitrary insert behavior (hand-crafted JSONB, + /// deliberate failures) without going through cipherstash-client. + /// Gated behind `#[cfg(test)]` so it is never linked into a + /// production build. /// + /// Pipeline: /// 1. Check the spec is complete. /// 2. Apply `working_schema_sql` on `direct`. After this succeeds the /// `public._fixture_` table exists and MUST be dropped before /// return, whatever happens next. - /// 3. Run `insert_rows()`. Its result is captured (not `?`-propagated) - /// so the drop in step 5 always runs. + /// 3. Run `insert_rows()`. Its result is captured (not + /// `?`-propagated) so the drop in step 5 always runs. /// 4. If the inserter succeeded, render the committed rows via /// `render_rows_sql` on `direct`. Skipped on inserter error. /// 5. Drop the working table on `direct` unconditionally. /// 6. Propagate failures in causal order: inserter error first /// (root cause), then render, then drop. /// - /// `run()` calls this with `insert_direct`. Tests call it with - /// closures that insert hand-crafted JSONB payloads directly (no - /// cipherstash-client required), or with closures that return `Err` - /// to exercise the teardown contract. + /// The closure has no `&mut PgConnection` parameter because the + /// caller (a test) closes over its own pool / connection — the + /// production path's single-connection invariant is enforced inside + /// `run`, not here. /// - /// Private by design: this is a test seam, not a public API. Other - /// fixtures must go through `run`. + /// Private by design: this is a test seam, not a public API. + #[cfg(test)] async fn run_with( &self, direct: &mut PgConnection, @@ -263,10 +293,11 @@ mod tests { /// A small int4 spec for driver tests. Three values keeps the test fast; /// the driver's orchestration is independent of value count. fn small_spec(name: &'static str) -> FixtureSpec<'static, i32> { + use super::super::index_kind::IndexKind; const VALUES: &[i32] = &[-1, 1, 42]; FixtureSpec::new(name) - .with_index("unique") - .with_index("ore") + .with_index(IndexKind::Unique) + .with_index(IndexKind::Ore) .with_column_type("jsonb") .with_values(VALUES) } @@ -280,9 +311,13 @@ mod tests { let mut conn = pool.acquire().await?; + // `run_with` is the test seam; it borrows `&mut conn` for the + // schema/render/drop steps, so a test that wants to insert via + // sqlx must close over its own connection — exactly the + // two-connection shape production (`run`) was rewritten to + // avoid. Tests pay this cost so production doesn't have to. let lines = spec - .run_with(&mut *conn, move || async move { - // Working table should exist while the closure runs. + .run_with(&mut conn, move || async move { let mut c = pool_for_closure.acquire().await?; let exists: Option = sqlx::query_scalar(&format!( "SELECT to_regclass('public.{working_for_closure}')::text" @@ -344,7 +379,7 @@ mod tests { let mut conn = pool.acquire().await?; let result = spec - .run_with(&mut *conn, || async { + .run_with(&mut conn, || async { anyhow::bail!("forced failure for test") }) .await; diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 4cdc807da..0db9482aa 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -81,15 +81,18 @@ pub trait EqlPlaintext: sealed::Sealed { /// EQL encryption pipeline consumes. The mapping is total — every /// `EqlPlaintext` impl maps cleanly onto a `Plaintext::*(Some(_))` /// variant. - fn to_plaintext(self) -> Plaintext; + /// + /// Takes `&self` so future non-`Copy` plaintexts (`String`, + /// `BigDecimal`, `Vec`) implement without unnecessary clones. + fn to_plaintext(&self) -> Plaintext; } impl EqlPlaintext for i32 { const CAST: Cast = Cast::INT; const PLAINTEXT_SQL_TYPE: PlaintextSqlType = PlaintextSqlType::INTEGER; - fn to_plaintext(self) -> Plaintext { - Plaintext::Int(Some(self)) + fn to_plaintext(&self) -> Plaintext { + Plaintext::Int(Some(*self)) } } @@ -114,7 +117,7 @@ mod tests { fn i32_to_plaintext_wraps_in_int_variant() { // The trait must lift the raw i32 into the EQL pipeline's Plaintext // enum so the fixture driver can hand it to `eql::encrypt_eql`. - match (42_i32).to_plaintext() { + match 42_i32.to_plaintext() { Plaintext::Int(Some(value)) => assert_eq!(value, 42), other => panic!("expected Plaintext::Int(Some(42)), got {other:?}"), } diff --git a/tests/sqlx/src/fixtures/eql_v2_int4.rs b/tests/sqlx/src/fixtures/eql_v2_int4.rs index f32e93a52..316eac481 100644 --- a/tests/sqlx/src/fixtures/eql_v2_int4.rs +++ b/tests/sqlx/src/fixtures/eql_v2_int4.rs @@ -1,22 +1,21 @@ //! The `eql_v2_int4` fixture — the framework's reference example and proof. //! -//! 14 integers spanning a negative boundary and small/medium/large/extreme -//! magnitudes. The generated `tests/sqlx/fixtures/eql_v2_int4.sql` is a plain -//! `jsonb`-payload table with no EQL dependency; #225 layers the `eql_v2_int4` -//! domain on top by casting `payload` per query. - +//! 17 integers spanning a negative boundary, the i32 signed extremes +//! (`MIN`/`MAX`), zero, and small/medium/large magnitudes. The generated +//! `tests/sqlx/fixtures/eql_v2_int4.sql` is a plain `jsonb`-payload table with +//! no EQL dependency; #225 layers the `eql_v2_int4` domain on top by casting +//! `payload` per query. + +use super::index_kind::IndexKind; +use super::int4_values::VALUES; use super::spec::FixtureSpec; -/// 14 values: a negative boundary plus small/medium/large/extreme magnitudes, -/// chosen so range pivots produce distinct cardinalities. -const VALUES: &[i32] = &[-100, -1, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999]; - -/// The complete fixture definition. `.with_index("unique")` drives `=` / `<>` -/// (HMAC); `.with_index("ore")` drives `<` `<=` `>` `>=` (ORE block terms). +/// The complete fixture definition. `IndexKind::Unique` drives `=` / `<>` +/// (HMAC); `IndexKind::Ore` drives `<` `<=` `>` `>=` (ORE block terms). pub fn spec() -> FixtureSpec<'static, i32> { FixtureSpec::new("eql_v2_int4") - .with_index("unique") - .with_index("ore") + .with_index(IndexKind::Unique) + .with_index(IndexKind::Ore) .with_column_type("jsonb") .with_values(VALUES) } @@ -40,8 +39,14 @@ mod tests { } #[test] - fn spec_has_14_values() { - assert_eq!(spec().values().len(), 14); + fn spec_includes_signed_extremes() { + // i32::MIN / MAX exercise ORE block-encoding sign-bit edges + // that the smaller earlier list did not cover. + let spec = spec(); + let values = spec.values(); + assert!(values.contains(&i32::MIN), "spec must include i32::MIN"); + assert!(values.contains(&i32::MAX), "spec must include i32::MAX"); + assert!(values.contains(&0), "spec must include 0"); } #[test] diff --git a/tests/sqlx/src/fixtures/index_kind.rs b/tests/sqlx/src/fixtures/index_kind.rs new file mode 100644 index 000000000..f1633a03b --- /dev/null +++ b/tests/sqlx/src/fixtures/index_kind.rs @@ -0,0 +1,59 @@ +//! `IndexKind` — the typed EQL search-index identifier. +//! +//! Replaces the `&str` / `FixtureIdentifier`-validated string at the +//! spec/driver boundary. `FixtureIdentifier` proves the value matches +//! `^[a-z][a-z0-9_]*$`; it does NOT prove the name is a real index type. +//! `IndexKind` proves both, at compile time. A typo at spec construction +//! (`.with_index(IndexKind::Uniqu)`) is a compile error rather than a +//! runtime "unknown EQL index identifier" panic deep in the driver. + +use std::fmt; + +/// One of the EQL search-index identifiers cipherstash-config recognises. +/// Construction is through the variants — by construction every value is +/// in the allowlist. The wire-form `&str` (used in cipherstash-config and +/// the SQL renderers) is available via `as_str` / `Display`. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum IndexKind { + /// `unique` — drives `=` / `<>` via HMAC. + Unique, + /// `ore` — drives `<` / `<=` / `>` / `>=` via ORE block terms. + Ore, + /// `match` — drives `LIKE` / `ILIKE` via the bloom filter. + Match, +} + +impl IndexKind { + pub fn as_str(self) -> &'static str { + match self { + IndexKind::Unique => "unique", + IndexKind::Ore => "ore", + IndexKind::Match => "match", + } + } +} + +impl fmt::Display for IndexKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(self.as_str()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn renders_as_the_eql_wire_form_string() { + assert_eq!(IndexKind::Unique.as_str(), "unique"); + assert_eq!(IndexKind::Ore.as_str(), "ore"); + assert_eq!(IndexKind::Match.as_str(), "match"); + } + + #[test] + fn display_matches_as_str() { + assert_eq!(format!("{}", IndexKind::Unique), "unique"); + assert_eq!(format!("{}", IndexKind::Ore), "ore"); + assert_eq!(format!("{}", IndexKind::Match), "match"); + } +} diff --git a/tests/sqlx/src/fixtures/int4_values.rs b/tests/sqlx/src/fixtures/int4_values.rs new file mode 100644 index 000000000..92f6491db --- /dev/null +++ b/tests/sqlx/src/fixtures/int4_values.rs @@ -0,0 +1,31 @@ +// AUTO-GENERATED — DO NOT EDIT. +// Regenerated by `mise run build` (or `mise run codegen:domain `). +// Source of truth: tasks/codegen/types/.toml `[fixture] values`. +// This file IS committed and verified in CI (git diff --exit-code). +//! Fixture plaintext values for the int4 encrypted-domain family. +//! +//! Generated from tasks/codegen/types/int4.toml `[fixture] values` — +//! the single source of truth shared by the fixture generator +//! (`fixtures::eql_v2_int4`) and the matrix oracle +//! (`ScalarType::FIXTURE_VALUES`). + +/// Distinct plaintext values present in the `eql_v2_int4` fixture. +pub const VALUES: &[i32] = &[ + i32::MIN, + -100, + -1, + 0, + 1, + 2, + 5, + 10, + 17, + 25, + 42, + 50, + 100, + 250, + 1000, + 9999, + i32::MAX, +]; diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index d2c90c3f8..416a3b02f 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -1,8 +1,9 @@ //! Type-checked fixture generation framework. //! //! A fixture is one Rust file under `src/fixtures/` declaring a `FixtureSpec`. -//! `FixtureSpec::run()` generates the committed SQLx fixture script -//! `tests/sqlx/fixtures/.sql`. +//! `FixtureSpec::run()` generates the SQLx fixture script +//! `tests/sqlx/fixtures/.sql` (gitignored — regenerated on every +//! `mise run test:sqlx`). pub mod validation; @@ -10,6 +11,10 @@ pub mod eql_plaintext; pub use eql_plaintext::EqlPlaintext; +pub mod index_kind; + +pub use index_kind::IndexKind; + pub mod spec; pub use spec::FixtureSpec; @@ -18,4 +23,8 @@ pub mod cipherstash; pub mod driver; +/// Generated from tasks/codegen/types/int4.toml `[fixture] values`. +/// Committed and verified by CI; never hand-edit (`mise run codegen:domain int4`). +pub mod int4_values; + pub mod eql_v2_int4; diff --git a/tests/sqlx/src/fixtures/spec.rs b/tests/sqlx/src/fixtures/spec.rs index 35e82615a..5f9b952dd 100644 --- a/tests/sqlx/src/fixtures/spec.rs +++ b/tests/sqlx/src/fixtures/spec.rs @@ -21,12 +21,13 @@ //! is finished. use super::eql_plaintext::EqlPlaintext; +use super::index_kind::IndexKind; use super::validation::{ColumnType, FixtureIdentifier}; /// A fully specified fixture, ready to `.run()`. pub struct FixtureSpec<'a, T> { name: FixtureIdentifier, - indexes: Vec, + indexes: Vec, column_type: ColumnType, values: &'a [T], } @@ -51,14 +52,10 @@ impl<'a, T> FixtureSpec<'a, T> { } } - /// Add a search index (`"unique"`, `"ore"`, ...). Chainable. - /// - /// # Panics - /// Panics if `index_name` is not a valid identifier. - pub fn with_index(mut self, index_name: &str) -> Self { - let id = - FixtureIdentifier::try_from(index_name).unwrap_or_else(|e| panic!("index name: {e}")); - self.indexes.push(id); + /// Add a search index. `IndexKind` is a closed enum — a typo at the + /// call site is a compile error rather than a runtime panic. + pub fn with_index(mut self, kind: IndexKind) -> Self { + self.indexes.push(kind); self } @@ -90,7 +87,7 @@ impl<'a, T> FixtureSpec<'a, T> { self.name.as_str() } - pub fn indexes(&self) -> &[FixtureIdentifier] { + pub fn indexes(&self) -> &[IndexKind] { &self.indexes } @@ -140,7 +137,7 @@ impl<'a, T> FixtureSpec<'a, T> { CREATE TABLE public.{working} (\n \ id BIGINT PRIMARY KEY,\n \ plaintext {plaintext_type} NOT NULL,\n \ - payload jsonb\n);\n", + payload jsonb NOT NULL\n);\n", plaintext_type = T::PLAINTEXT_SQL_TYPE, ) } @@ -216,8 +213,8 @@ mod tests { fn int4_spec() -> FixtureSpec<'static, i32> { const VALUES: &[i32] = &[-1, 1, 42]; FixtureSpec::new("eql_v2_int4") - .with_index("unique") - .with_index("ore") + .with_index(IndexKind::Unique) + .with_index(IndexKind::Ore) .with_column_type("jsonb") .with_values(VALUES) } @@ -233,14 +230,15 @@ mod tests { #[test] fn records_indexes_in_order() { let s = int4_spec(); - let names: Vec<&str> = s.indexes().iter().map(FixtureIdentifier::as_str).collect(); - assert_eq!(names, vec!["unique", "ore"]); + assert_eq!(s.indexes(), &[IndexKind::Unique, IndexKind::Ore]); } #[test] fn column_type_defaults_to_jsonb() { const V: &[i32] = &[1]; - let s = FixtureSpec::new("x").with_index("unique").with_values(V); + let s = FixtureSpec::new("x") + .with_index(IndexKind::Unique) + .with_values(V); assert_eq!(s.column_type().as_str(), "jsonb"); } @@ -263,12 +261,9 @@ mod tests { let _ = FixtureSpec::<'static, i32>::new("x").with_column_type("text"); } - #[test] - #[should_panic(expected = "is not a valid identifier")] - fn validation_rejects_a_bad_index_name() { - // A bad index name panics in `.with_index()`. - let _ = FixtureSpec::<'static, i32>::new("x").with_index("BAD IX"); - } + // Note: `with_index` formerly panicked on a malformed identifier (a + // `FixtureIdentifier::try_from` failure). The typed `IndexKind` enum + // makes that case unrepresentable — a typo is now a compile error. #[test] fn completeness_rejects_a_spec_with_no_indexes() { @@ -280,7 +275,9 @@ mod tests { #[test] fn completeness_rejects_a_spec_with_no_values() { const V: &[i32] = &[]; - let s = FixtureSpec::new("x").with_index("unique").with_values(V); + let s = FixtureSpec::new("x") + .with_index(IndexKind::Unique) + .with_values(V); assert!(s.check_complete().is_err()); } diff --git a/tests/sqlx/src/helpers.rs b/tests/sqlx/src/helpers.rs index 6bf5fc4c0..2e111e559 100644 --- a/tests/sqlx/src/helpers.rs +++ b/tests/sqlx/src/helpers.rs @@ -6,6 +6,19 @@ use anyhow::{Context, Result}; use serde_json; use sqlx::{PgPool, Row}; +/// Sentinel payload that satisfies every encrypted-domain CHECK in the +/// `eql_v2_{,_eq,_ord,_ord_ore}` family. Carries the EQL envelope +/// (`v`, `i`, `c`) plus *both* term keys (`hm`, `ob`) so one bind value +/// works for any variant's cast. +/// +/// Used by blocker / null-result tests where the payload is bound but +/// never decrypted — the blocker raises (or the STRICT wrapper +/// short-circuits) before the term values matter. **Not a representative +/// payload.** Real encrypted payloads come from the fixture +/// (Proxy-encrypted). +pub const PLACEHOLDER_PAYLOAD: &str = + r#"{"v":2,"i":{"t":"t","c":"c"},"c":"sample","hm":"sample","ob":["00"]}"#; + /// Fetch ORE encrypted value from pre-seeded ore table /// /// The ore table is created by migration `002_install_ore_data.sql` diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 2f915e37b..c37c176ea 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -8,9 +8,17 @@ pub mod assertions; pub mod fixtures; pub mod helpers; pub mod index_types; +pub mod matrix; +pub mod scalar_domains; pub mod selectors; -pub use assertions::QueryAssertion; +// Re-export `paste` under a stable path so the `scalar_domain_matrix!` macro +// can refer to `$crate::paste::paste!` without requiring callers to depend on +// the `paste` crate directly. +#[doc(hidden)] +pub use paste; + +pub use assertions::{assert_db_error, QueryAssertion}; pub use helpers::{ analyze_table, assert_no_seq_scan, assert_sequential_ids, assert_uses_index, assert_uses_seq_scan, create_jsonb_gin_index, ensure_pg_stat_statements, explain_analyze_avg, @@ -19,8 +27,13 @@ pub use helpers::{ get_ore_text_encrypted_as_jsonb, get_ste_vec_encrypted, get_ste_vec_encrypted_pair, get_ste_vec_selector_term, get_ste_vec_sv_element, get_ste_vec_term_by_id, read_pg_stat_statements, reset_pg_stat_statements, ExplainStats, PgStatEntry, + PLACEHOLDER_PAYLOAD, }; pub use index_types as IndexTypes; +pub use scalar_domains::{ + assert_null, assert_raises, assert_scalar_plaintexts, blocker_msg, commute_op, + fetch_fixture_payload, sql_string_literal, ScalarDomainSpec, ScalarType, Variant, +}; pub use selectors::Selectors; /// Reset pg_stat_user_functions tracking before tests diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs new file mode 100644 index 000000000..0d277af9d --- /dev/null +++ b/tests/sqlx/src/matrix.rs @@ -0,0 +1,2745 @@ +//! Type-generic test matrix for encrypted scalar domains. +//! +//! Two entry points: +//! +//! - **`ordered_numeric_matrix!`** — the recommended wrapper. For an +//! ordered numeric scalar (i32, i64, f64, date, numeric, timestamp, +//! ...) all four variants are present, the operator surface is +//! identical, and the only inputs that change per type are the scalar +//! itself, the suite token (used to derive domain + test names), the +//! EQL type name (the fixture `scripts(...)` ref), and the pivot +//! values. Invocation is ~5 lines. +//! +//! - **`scalar_domain_matrix!`** — the lower-level macro the wrapper +//! expands to. Use directly only for types with a non-standard surface +//! (e.g. equality-only scalars like bool). +//! +//! Each invocation emits one `#[sqlx::test]` per (category, domain, +//! operator, pivot) tuple. Categories: sanity, correctness, cross-shape, +//! supported-NULL, blocker raises, index engagement, ORDER BY, ORDER BY +//! USING. +//! +//! Per-domain capability and payload metadata live in `Variant` (see +//! `scalar_domains.rs`); the macro derives the runtime `ScalarDomainSpec` +//! from `<$scalar as ScalarType>::PG_TYPE` + `Variant::` so no +//! per-type constants are needed. + +// ============================================================================ +// EXPLAIN plan inspection — node-type-aware index-engagement assertion. +// +// The index-engagement arms (`*_index_engages_*`, `*_ord_routes_through_ob`) +// previously asserted `plan_text.contains(index_name)` on a *text* EXPLAIN. +// That substring match is too weak in two independent ways: +// +// 1. It cannot distinguish an actual index-scan node from an incidental +// textual mention of the index name (e.g. inside an `Index Cond`, a +// filter expression, or a "Recheck Cond" line) — any line carrying the +// string passes, even if the relation is still read in full. +// 2. It says nothing about *which kind* of node read the relation. A +// Bitmap-recheck that still touches every heap row, or a node that +// merely references the index, looks identical to a clean Index Scan. +// +// `assert_index_scan_uses` parses `EXPLAIN (FORMAT JSON)` and requires a +// genuine index-scan node (`Index Scan` / `Index Only Scan` / +// `Bitmap Index Scan`) whose `Index Name` is the expected index. This is a +// structurally meaningful assertion even with `enable_seqscan = off`. +// +// LOUD CAVEAT — VALIDITY, NOT PREFERENCE. Even after this upgrade, the +// index-engagement arms run against a ~17-row fixture with +// `SET LOCAL enable_seqscan = off`. With the only cheaper alternative +// (seqscan) forcibly disabled, the planner will pick essentially any usable +// index. So these arms prove the index is USABLE / VALID (the operator +// resolves through the functional index and produces a real index-scan node) +// — they do NOT prove the planner would PREFER the index under realistic +// costs. Cost-preference is proven exclusively by `__scalar_matrix_scale_case` +// (the `*_scale_preference_*` tests), which build ~5000 rows and leave +// `enable_seqscan` ON. Those are `#[cfg(feature = "scale")]` and are OFF in +// default PR CI. Do not read a green index-engagement arm as "the planner +// chooses this index" — it only means "the planner *can* use this index". +// ============================================================================ + +/// Assert that a JSON EXPLAIN plan contains a real index-scan node whose +/// `Index Name` matches `index_name`. +/// +/// Recursively walks the plan tree. A node qualifies only if its `Node Type` +/// is one of `Index Scan`, `Index Only Scan`, or `Bitmap Index Scan` AND its +/// `Index Name` equals `index_name`. This is strictly stronger than a +/// substring match on the text plan, which would also accept an index name +/// appearing in an `Index Cond` / `Recheck Cond` / filter expression without +/// any index-scan node actually reading the relation. +/// +/// `query` is the bare SQL (no `EXPLAIN` prefix); it is interpolated directly, +/// so it must be a trusted/hardcoded string. `tx` is any sqlx executor. +/// +/// Returns `Err` (with the full pretty-printed plan) if no qualifying node is +/// found, so it composes with the `?` operator inside the generated arms. +pub async fn assert_index_scan_uses<'e, E>( + executor: E, + query: &str, + index_name: &str, + context: &str, +) -> anyhow::Result<()> +where + E: sqlx::Executor<'e, Database = sqlx::Postgres>, +{ + let sql = format!("EXPLAIN (FORMAT JSON) {query}"); + let plan: serde_json::Value = sqlx::query_scalar(&sql) + .fetch_one(executor) + .await + .map_err(|e| anyhow::anyhow!("running `{sql}`: {e}"))?; + + let mut index_scan_nodes: Vec<(String, String)> = Vec::new(); + collect_index_scan_nodes(&plan, &mut index_scan_nodes); + + let matched = index_scan_nodes + .iter() + .any(|(_node_type, name)| name == index_name); + + anyhow::ensure!( + matched, + "{context}: expected an index-scan node (Index Scan / Index Only Scan / \ + Bitmap Index Scan) referencing index `{index_name}`, but found none. \ + Index-scan nodes present: {index_scan_nodes:?}. Full plan:\n{}", + serde_json::to_string_pretty(&plan).unwrap_or_else(|_| plan.to_string()), + ); + Ok(()) +} + +/// Recursively collect `(Node Type, Index Name)` pairs for every index-scan +/// node in a JSON EXPLAIN plan tree. Only the three index-scan node types are +/// collected; other nodes (Seq Scan, Aggregate, Sort, ...) are skipped but +/// their children are still walked. +fn collect_index_scan_nodes(value: &serde_json::Value, found: &mut Vec<(String, String)>) { + match value { + serde_json::Value::Object(map) => { + if let Some(node_type) = map.get("Node Type").and_then(|v| v.as_str()) { + if matches!( + node_type, + "Index Scan" | "Index Only Scan" | "Bitmap Index Scan" + ) { + let index_name = map + .get("Index Name") + .and_then(|v| v.as_str()) + .unwrap_or(""); + found.push((node_type.to_string(), index_name.to_string())); + } + } + for v in map.values() { + collect_index_scan_nodes(v, found); + } + } + serde_json::Value::Array(arr) => { + for item in arr { + collect_index_scan_nodes(item, found); + } + } + _ => {} + } +} + +/// Convention wrapper for ordered numeric scalars. Expands to a +/// `scalar_domain_matrix!` invocation with the standard 4 variants, 6 +/// supported comparison operators, 2 path operators, and the standard +/// blocker / index partitions. +/// +/// `eql_type` is the EQL domain type name (e.g. `"eql_v2_int4"`). It is +/// used as the SQLx fixture `scripts(...)` ref, which sqlx parses as a +/// token-level string literal — so it must be a literal, not derived. +/// +/// Pivots — the comparison anchors swept by the correctness / cross-shape +/// arms — are derived from the scalar type: `MIN`, `MAX`, and zero +/// (`Default::default()`). The fixture must contain those three plaintext +/// rows, since each pivot's ciphertext is fetched at test time via +/// `fetch_fixture_payload`. +#[macro_export] +macro_rules! ordered_numeric_matrix { + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal $(,)? + ) => { + $crate::scalar_domain_matrix! { + suite = $suite, + scalar = $scalar, + eql_type = $eql_type, + // Relative to the suite source file at + // tests/sqlx/tests/encrypted_domain/scalars/.rs; sqlx's + // include_str! resolves it against that file. Every scalar + // suite lives at this depth, so the path is fixed here rather + // than repeated per invocation. + fixture_path = "../../../fixtures", + all_domains = [(storage, Storage), (eq, Eq), (ord, Ord), (ord_ore, OrdOre)], + eq_domains = [(eq, Eq), (ord, Ord), (ord_ore, OrdOre)], + ord_domains = [(ord, Ord), (ord_ore, OrdOre)], + ord_ore_domains = [(ord_ore, OrdOre)], + pivots = [ + (min, <$scalar>::MIN), + (max, <$scalar>::MAX), + (zero, <$scalar as ::core::default::Default>::default()), + ], + eq_ops = [(eq, "="), (neq, "<>")], + ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + index_combos = [ + (eq, Eq, "eql_v2.eq_term", "btree", [(eq, "=")]), + (eq, Eq, "eql_v2.eq_term", "hash", [(eq, "=")]), + (ord, Ord, "eql_v2.ord_term", "btree", + [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), + (ord_ore, OrdOre, "eql_v2.ord_term", "btree", + [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), + ], + blocker_combos = [ + (storage, Storage, [ + (eq, "="), (neq, "<>"), + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + (eq, Eq, [ + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + (ord, Ord, [(contains, "@>"), (contained_by, "<@")]), + (ord_ore, OrdOre, [(contains, "@>"), (contained_by, "<@")]), + ], + // Always-on cost-preference proof (#239 thread 17): the recommended + // converged ordered domain, ord_term btree. One curated combo keeps + // PR CI cost bounded. + scale_default_combos = [ + (ord, Ord, "eql_v2.ord_term", "btree"), + ], + } + }; +} + +/// Convention wrapper for equality-only scalars (no ord variants). Bool +/// is the canonical consumer: `=` / `<>` are meaningful; the four ord +/// operators are deliberate blockers. +/// +/// Expands to `scalar_domain_matrix!` with `ord_domains = []`, +/// `ord_ore_domains = []`, no btree-ord index combo, and blocker_combos +/// covering the ord operators on every materialised variant. Order-by / +/// order-by-using arms emit zero tests because they iterate empty +/// ord_domains. +/// +/// **Status:** this umbrella has no in-tree consumer yet. It exists so +/// that adding `bool` (or any other equality-only scalar) is one +/// `impl ScalarType` + fixture + one-line macro invocation, with no +/// macro authoring required. Runtime validation lands with bool. +#[macro_export] +macro_rules! eq_only_scalar_matrix { + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal, + pivots = [$($pivot:tt),+ $(,)?] $(,)? + ) => { + $crate::scalar_domain_matrix! { + suite = $suite, + scalar = $scalar, + eql_type = $eql_type, + // Fixed path; see `ordered_numeric_matrix!` for the rationale. + fixture_path = "../../../fixtures", + all_domains = [(storage, Storage), (eq, Eq)], + eq_domains = [(eq, Eq)], + ord_domains = [], + ord_ore_domains = [], + pivots = [$($pivot),+], + eq_ops = [(eq, "="), (neq, "<>")], + ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + index_combos = [ + (eq, Eq, "eql_v2.eq_term", "btree", [(eq, "=")]), + (eq, Eq, "eql_v2.eq_term", "hash", [(eq, "=")]), + ], + blocker_combos = [ + (storage, Storage, [ + (eq, "="), (neq, "<>"), + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + (eq, Eq, [ + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + ], + // Equality-only scalars have no ordered functional index to prefer. + scale_default_combos = [], + } + }; +} + +/// Low-level entry point. Use `ordered_numeric_matrix!` instead unless +/// your type's surface deviates from the standard ordered-numeric shape. +#[macro_export] +macro_rules! scalar_domain_matrix { + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal, + fixture_path = $fixture_path:literal, + all_domains = [$(($all_name:ident, $all_variant:ident)),+ $(,)?], + eq_domains = [$($eq_dom:tt),+ $(,)?], + ord_domains = [$($ord_dom:tt),* $(,)?], + ord_ore_domains = [$($ord_ore_dom:tt),* $(,)?], + pivots = [$($pivot:tt),+ $(,)?], + eq_ops = [$($eq_op:tt),+ $(,)?], + ord_ops = [$($ord_op:tt),+ $(,)?], + index_combos = [$($index_combo:tt),+ $(,)?], + blocker_combos = [$($blocker_combo:tt),+ $(,)?], + // Curated combo(s) that get an ALWAYS-ON cost-preference test (#239 + // thread 17). May be empty (e.g. equality-only scalars have no ordered + // index to prefer). + scale_default_combos = [$($scale_default_combo:tt),* $(,)?] $(,)? + ) => { + $crate::__scalar_matrix_sanity! { + suite = $suite, scalar = $scalar, + domains = [$(($all_name, $all_variant)),+], + } + $crate::__scalar_matrix_dxop_outer! { + case = __scalar_matrix_correctness_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($eq_dom),+], ops_list = [$($eq_op),+], + pivots_list = [$($pivot),+], + } + $crate::__scalar_matrix_dxop_outer! { + case = __scalar_matrix_correctness_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], ops_list = [$($ord_op),+], + pivots_list = [$($pivot),+], + } + $crate::__scalar_matrix_dxop_outer! { + case = __scalar_matrix_cross_shape_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($eq_dom),+], ops_list = [$($eq_op),+], + pivots_list = [$($pivot),+], + } + $crate::__scalar_matrix_dxop_outer! { + case = __scalar_matrix_cross_shape_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], ops_list = [$($ord_op),+], + pivots_list = [$($pivot),+], + } + $crate::__scalar_matrix_dxo_outer! { + case = __scalar_matrix_supported_null_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($eq_dom),+], ops_list = [$($eq_op),+], + } + $crate::__scalar_matrix_dxo_outer! { + case = __scalar_matrix_supported_null_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], ops_list = [$($ord_op),+], + } + $crate::__scalar_matrix_blocker_outer! { + suite = $suite, scalar = $scalar, + combos = [$($blocker_combo),+], + } + $crate::__scalar_matrix_payload_check_outer! { + suite = $suite, scalar = $scalar, + domains = [$(($all_name, $all_variant)),+], + } + $crate::__scalar_matrix_path_op_outer! { + suite = $suite, scalar = $scalar, + domains = [$(($all_name, $all_variant)),+], + } + $crate::__scalar_matrix_native_absent_outer! { + suite = $suite, scalar = $scalar, + domains = [$(($all_name, $all_variant)),+], + } + $crate::__scalar_matrix_typed_column_outer! { + suite = $suite, scalar = $scalar, + combos = [$($blocker_combo),+], + } + $crate::__scalar_matrix_planner_metadata_outer! { + suite = $suite, scalar = $scalar, group = eq, + domains = [$($eq_dom),+], + ops_list = [$($eq_op),+], + } + $crate::__scalar_matrix_planner_metadata_outer! { + suite = $suite, scalar = $scalar, group = ord, + domains = [$($ord_dom),*], + ops_list = [$($ord_op),+], + } + $crate::__scalar_matrix_index_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + combos = [$($index_combo),+], + } + $crate::__scalar_matrix_scale_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + combos = [$($index_combo),+], + } + $crate::__scalar_matrix_scale_default_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + combos = [$($scale_default_combo),*], + } + $crate::__scalar_matrix_fixture_shape! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + } + $crate::__scalar_matrix_ord_routes_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], + } + $crate::__scalar_matrix_ore_injectivity_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_ore_dom),*], + } + $crate::__scalar_matrix_aggregate_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], + } + $crate::__scalar_matrix_aggregate_group_by_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], + } + $crate::__scalar_matrix_aggregate_parallel_outer! { + suite = $suite, scalar = $scalar, + domains = [$($ord_dom),*], + } + $crate::__scalar_matrix_aggregate_typecheck_outer! { + suite = $suite, scalar = $scalar, + domains = [$(($all_name, $all_variant)),+], + } + $crate::__scalar_matrix_count_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$(($all_name, $all_variant)),+], + } + $crate::__scalar_matrix_order_by_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], + } + $crate::__scalar_matrix_order_by_nulls_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], + } + $crate::__scalar_matrix_order_by_using_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($ord_dom),*], ops_list = [$($ord_op),+], + } + }; +} + +// ============================================================================ +// Helpers: spec construction inside generated test bodies. +// ============================================================================ + +/// Inside a generated test body, build the runtime `ScalarDomainSpec` +/// from `<$scalar>::PG_TYPE` + `Variant::$variant`. All categories use +/// this — keeps the per-case body short. +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_spec { + ($scalar:ty, $variant:ident) => { + $crate::scalar_domains::ScalarDomainSpec::new::<$scalar>( + $crate::scalar_domains::Variant::$variant, + ) + }; +} + +// ============================================================================ +// Sanity category — one test per domain. Cheap thread-through check that +// the macro expanded and the trait wires up. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_sanity { + ( + suite = $suite:ident, + scalar = $scalar:ty, + domains = [$(($name:ident, $variant:ident)),+ $(,)?] $(,)? + ) => { + $( + $crate::paste::paste! { + #[sqlx::test] + async fn [](_pool: sqlx::PgPool) + -> anyhow::Result<()> + { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + assert!(!spec.sql_domain.is_empty()); + assert!(<$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name() + .starts_with("fixtures.")); + Ok(()) + } + } + )+ + }; +} + +// ============================================================================ +// Shared cartesian-product drivers. `macro_rules!` cannot cross-product +// independent lists in one repetition (`$($($(…)*)*)*` over flat depth-1 +// lists does not compile — every metavariable is bound at depth 1), so one +// recursion level fixes one dimension. These generic drivers do that fan-out +// once and dispatch to a per-category leaf macro named by `case`. The +// dimension lists are independent: this is a product, not a zip. +// ============================================================================ + +// domain × op × pivot. +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_dxop_outer { + ( + case = $case:ident, + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$($domain:tt),* $(,)?], + ops_list = $ops_list:tt, pivots_list = $pivots_list:tt $(,)? + ) => { + $( + $crate::__scalar_matrix_dxop_mid! { + case = $case, + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + domain = $domain, ops_list = $ops_list, pivots_list = $pivots_list, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_dxop_mid { + ( + case = $case:ident, + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domain = ($dom_name:ident, $variant:ident), + ops_list = [$($op:tt),+ $(,)?], pivots_list = $pivots_list:tt $(,)? + ) => { + $( + $crate::__scalar_matrix_dxop_inner! { + case = $case, + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + op = $op, pivots_list = $pivots_list, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_dxop_inner { + ( + case = $case:ident, + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + op = ($op_name:ident, $op:literal), + pivots_list = [$($pivot:tt),+ $(,)?] $(,)? + ) => { + $( + $crate::$case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + op_name = $op_name, op = $op, pivot = $pivot, + } + )+ + }; +} + +// domain × op. +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_dxo_outer { + ( + case = $case:ident, + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$($domain:tt),* $(,)?], ops_list = $ops_list:tt $(,)? + ) => { + $( + $crate::__scalar_matrix_dxo_inner! { + case = $case, + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + domain = $domain, ops_list = $ops_list, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_dxo_inner { + ( + case = $case:ident, + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domain = ($dom_name:ident, $variant:ident), + ops_list = [$($op:tt),+ $(,)?] $(,)? + ) => { + $( + $crate::$case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, op = $op, + } + )+ + }; +} + +// ============================================================================ +// Correctness category — leaf for the domain × op × pivot driver: assert the +// row set from `WHERE col op pivot` matches `T::expected_forward(op, pivot)`. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_correctness_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + op_name = $op_name:ident, op = $op:literal, + pivot = ($pivot_name:ident, $pivot_val:expr) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let pivot: $scalar = $pivot_val; + let payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + let lit = $crate::scalar_domains::sql_string_literal(&payload); + let predicate = format!( + "payload::{d} {op} {lit}::jsonb::{d}", + d = &spec.sql_domain, op = $op, + ); + let expected = + <$scalar as $crate::scalar_domains::ScalarType>::expected_forward($op, pivot); + $crate::scalar_domains::assert_scalar_plaintexts::<$scalar>( + &pool, &spec.sql_domain, $op, &predicate, &expected, + ) + .await + } + } + }; +} + +// ============================================================================ +// Cross-shape category — leaf for the domain × op × pivot driver: per +// (domain, op, pivot) sweep the three operator argument shapes (d,d), (d,j), +// (j,d) and assert each returns the right row count. The `j_d` shape uses the +// commuted operator's expected set. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_cross_shape_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + op_name = $op_name:ident, op = $op:literal, + pivot = ($pivot_name:ident, $pivot_val:expr) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let pivot: $scalar = $pivot_val; + let payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + let lit = $crate::scalar_domains::sql_string_literal(&payload); + let forward_count = + <$scalar as $crate::scalar_domains::ScalarType>::expected_forward($op, pivot) + .len() as i64; + let commuted_count = <$scalar as $crate::scalar_domains::ScalarType>::expected_forward( + $crate::scalar_domains::commute_op($op), pivot, + ).len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ("d_d", format!("payload::{d} {op} {lit}::jsonb::{d}", op = $op), forward_count), + ("d_j", format!("payload::{d} {op} {lit}::jsonb", op = $op), forward_count), + ("j_d", format!("{lit}::jsonb {op} payload::{d}", op = $op), commuted_count), + ]; + let table = <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = format!("SELECT count(*) FROM {table} WHERE {predicate}"); + let count: i64 = sqlx::query_scalar(&count_sql).fetch_one(&pool).await?; + assert_eq!( + count, expected_count, + "domain={} op={} pivot={:?} shape={shape_label} SQL={count_sql} \ + expected {expected_count} rows, got {count}", + d, $op, pivot + ); + } + Ok(()) + } + } + }; +} + +// ============================================================================ +// Supported-NULL category — leaf for the domain × op driver: STRICT wrappers +// must propagate NULL on all three NULL positions (left, right, both). +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_supported_null_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + op = ($op_name:ident, $op:literal) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + let sql = format!( + "SELECT $1::jsonb::{d} {op} $2::jsonb::{d}", + d = &spec.sql_domain, op = $op, + ); + $crate::scalar_domains::assert_null(&pool, &sql, &[Some(payload), None]).await?; + $crate::scalar_domains::assert_null(&pool, &sql, &[None, Some(payload)]).await?; + $crate::scalar_domains::assert_null(&pool, &sql, &[None, None]).await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// Blocker category — per blocked (domain, op), sweep 3 arg shapes (all +// must raise) and 3 NULL positions on the (d, d) shape (non-STRICT proof). +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_blocker_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + combos = [$($combo:tt),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_blocker_combo! { + suite = $suite, scalar = $scalar, combo = $combo, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_blocker_combo { + ( + suite = $suite:ident, scalar = $scalar:ty, + combo = ($dom_name:ident, $variant:ident, [$($op:tt),+ $(,)?]) $(,)? + ) => { + $( + $crate::__scalar_matrix_blocker_case! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, op = $op, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_blocker_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = $variant:ident, + op = ($op_name:ident, $op:literal) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + let msg = $crate::scalar_domains::blocker_msg(&spec.sql_domain, $op); + let d = &spec.sql_domain; + + // Sweep 3 arg shapes — every overload must engage. + let shapes: [(String, String); 3] = [ + (format!("$1::jsonb::{d}"), format!("$2::jsonb::{d}")), + (format!("$1::jsonb::{d}"), "$2::jsonb".into()), + ("$1::jsonb".into(), format!("$2::jsonb::{d}")), + ]; + for (lhs, rhs) in shapes { + let sql = format!("SELECT {lhs} {op} {rhs}", op = $op); + $crate::scalar_domains::assert_raises( + &pool, &sql, &[Some(payload), Some(payload)], &msg, + ).await?; + } + + // Sweep 3 NULL positions on the (d, d) shape — blockers + // are non-STRICT so they must engage on every NULL config. + let null_sql = format!( + "SELECT $1::jsonb::{d} {op} $2::jsonb::{d}", op = $op, + ); + $crate::scalar_domains::assert_raises(&pool, &null_sql, &[None, Some(payload)], &msg).await?; + $crate::scalar_domains::assert_raises(&pool, &null_sql, &[Some(payload), None], &msg).await?; + $crate::scalar_domains::assert_raises(&pool, &null_sql, &[None, None], &msg).await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// Payload-check category — per variant, the domain CHECK rejects payloads +// missing required keys (envelope `v`/`i`/`c` plus `Variant::required_term()`) +// and rejects non-object payloads. Required keys are derived from +// `Variant::payload_required_keys()` so future variants pick up coverage. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_payload_check_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + domains = [$(($dom_name:ident, $variant:ident)),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_payload_check_case! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_payload_check_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let baseline = $crate::helpers::PLACEHOLDER_PAYLOAD; + + // Each required key must trigger CHECK rejection when stripped. + for key in spec.variant.payload_required_keys() { + let sql = format!( + "SELECT ('{baseline}'::jsonb - '{key}')::{d}", + ); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err(&format!( + "{d} must reject payload missing `{key}`: {sql}" + )) + .to_string(); + anyhow::ensure!( + err.contains("violates check constraint"), + "expected check-constraint violation for missing `{key}` on {d}, got: {err}", + ); + } + + // Non-object payloads are rejected for every variant. + let sql = format!(r#"SELECT '["v","i","c"]'::jsonb::{d}"#); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err(&format!("{d} must reject non-object payload")) + .to_string(); + anyhow::ensure!( + err.contains("violates check constraint"), + "expected check-constraint violation for non-object on {d}, got: {err}", + ); + Ok(()) + } + } + }; +} + +// ============================================================================ +// Path-operator category — `->` and `->>` must raise the blocker on every +// variant (encrypted domains don't expose JSON path access). Three arg +// shapes per op, matching the parameter blocker arm's coverage. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_path_op_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + domains = [$(($dom_name:ident, $variant:ident)),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_path_op_case! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_path_op_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + + for op in ["->", "->>"] { + let msg = $crate::scalar_domains::blocker_msg(d, op); + for sql in [ + format!("SELECT $1::jsonb::{d} {op} 'field'::text"), + format!("SELECT $1::jsonb::{d} {op} 0::integer"), + format!("SELECT $1::jsonb {op} $1::jsonb::{d}"), + ] { + $crate::scalar_domains::assert_raises( + &pool, &sql, &[Some(payload)], &msg, + ).await?; + } + } + Ok(()) + } + } + }; +} + +// ============================================================================ +// Native-absent category — `~~` / `~~*` (LIKE / ILIKE) are deliberately +// not declared on encrypted-domain types (no pattern-match capability), +// so resolution falls back to PostgreSQL's "operator does not exist" +// rather than an EQL blocker. Pin that they stay absent on every variant. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_native_absent_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + domains = [$(($dom_name:ident, $variant:ident)),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_native_absent_case! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_native_absent_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + + for op in ["~~", "~~*"] { + let sql = format!("SELECT $1::jsonb::{d} {op} $2::jsonb::{d}"); + $crate::scalar_domains::assert_raises( + &pool, &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ).await?; + } + Ok(()) + } + } + }; +} + +// ============================================================================ +// Typed-column blocker category — pins the bare `WHERE col op col` form a +// real caller writes. The parameter blocker arm uses $1/$2 binds; this +// form resolves the same overloads through a different planner path +// (column-typed operand vs. cast-expression operand). One test per +// (variant, blocker-ops list), savepoint-isolated to avoid abort. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_typed_column_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + combos = [$($combo:tt),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_typed_column_case! { + suite = $suite, scalar = $scalar, combo = $combo, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_typed_column_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + combo = ($dom_name:ident, $variant:ident, [$(($op_name:ident, $op:literal)),+ $(,)?]) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + + let mut tx = pool.begin().await?; + let create_sql = format!( + "CREATE TEMP TABLE typed_col (\ + id integer GENERATED ALWAYS AS IDENTITY,\ + value {d}\ + ) ON COMMIT DROP" + ); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = format!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{d})" + ); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + + $( + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = format!("SELECT * FROM typed_col WHERE value {op} value", op = $op); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err(&format!("{d} column {op} must raise", op = $op)) + .to_string(); + let expected = $crate::scalar_domains::blocker_msg(d, $op); + anyhow::ensure!( + err.contains(&expected), + "unexpected error for {sql}: got {err}, want {expected}", + ); + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + )+ + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// Planner-metadata category — for every (variant, supported-op) the +// declared operator must carry COMMUTATOR, NEGATOR, and the RESTRICT / +// JOIN selectivity estimators on all 3 arg-shapes. Without these the +// planner cannot normalise commuted/negated predicates or cost them. +// Called twice from `scalar_domain_matrix!`: once for (eq_domains, +// eq_ops), once for (ord_domains, ord_ops). Storage variants have no +// supported ops and so don't emit a test. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_planner_metadata_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, group = $group:ident, + domains = [$(($dom_name:ident, $variant:ident)),* $(,)?], + ops_list = $ops_list:tt $(,)? + ) => { + $( + $crate::__scalar_matrix_planner_metadata_case! { + suite = $suite, scalar = $scalar, group = $group, + dom_name = $dom_name, variant = $variant, + ops_list = $ops_list, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_planner_metadata_case { + ( + suite = $suite:ident, scalar = $scalar:ty, group = $group:ident, + dom_name = $dom_name:ident, variant = $variant:ident, + ops_list = [$(($op_name:ident, $op:literal)),+ $(,)?] $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let ops: &[&str] = &[$($op),+]; + let op_list = ops.iter() + .map(|o| format!("'{o}'")) + .collect::>() + .join(", "); + let sql = format!( + r#" + SELECT o.oprname, + lt.typname AS lhs, + rt.typname AS rhs, + o.oprcom <> 0 AS has_commutator, + o.oprnegate <> 0 AS has_negator, + o.oprrest::oid <> 0 AS has_restrict, + o.oprjoin::oid <> 0 AS has_join + FROM pg_catalog.pg_operator o + JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft + JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright + WHERE o.oprname IN ({op_list}) + AND (lt.typname = '{d}' OR rt.typname = '{d}') + "# + ); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = + sqlx::query_as(&sql).fetch_all(&pool).await?; + + let expected = ops.len() * 3; + anyhow::ensure!( + rows.len() == expected, + "expected {expected} rows ({n_ops} ops x 3 arg shapes) on {d}, got {got}", + n_ops = ops.len(), + got = rows.len(), + ); + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + anyhow::ensure!(*has_com, + "operator {op}({lhs},{rhs}) must declare COMMUTATOR"); + anyhow::ensure!(*has_neg, + "operator {op}({lhs},{rhs}) must declare NEGATOR"); + anyhow::ensure!(*has_rest, + "operator {op}({lhs},{rhs}) must declare RESTRICT"); + anyhow::ensure!(*has_join, + "operator {op}({lhs},{rhs}) must declare JOIN"); + } + Ok(()) + } + } + }; +} + +// ============================================================================ +// Scale-preference category — feature-gated. Builds a temp table with +// ~5000 filler rows plus one selective pivot, creates the functional +// index, and asserts the planner *prefers* the index with +// `enable_seqscan` left on. The index_engages arm forces seqscan off and +// only proves the index is *usable*; this proves the planner picks it. +// Off by default (`#[cfg(feature = "scale")]`) so PR CI stays fast. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_scale_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + combos = [$($combo:tt),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_scale_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, combo = $combo, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_scale_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + combo = ( + $dom_name:ident, $variant:ident, + $extractor:literal, $using:literal, + [$(($op_name:ident, $op:literal)),+ $(,)?] $(,)? + ) $(,)? + ) => { + $crate::paste::paste! { + #[cfg(feature = "scale")] + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let table = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), + "_scale_", $using, + ); + let index = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), + "_scale_", $using, "_idx", + ); + + let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + anyhow::ensure!(values.len() >= 2, + "scale test requires >= 2 fixture rows for distinct filler/pivot"); + let filler = values[0]; + let pivot = values[values.len() / 2]; + let filler_payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, filler).await?; + let pivot_payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE {table} (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO {table}(value) \ +SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", + )).bind(&filler_payload).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO {table}(value) VALUES ($1::jsonb::{d})", + )).bind(&pivot_payload).execute(&mut *tx).await?; + sqlx::query(&format!( + "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = $extractor, + )).execute(&mut *tx).await?; + sqlx::query(&format!("ANALYZE {table}")) + .execute(&mut *tx).await?; + + let lit = pivot_payload.replace('\'', "''"); + let plan: Vec = sqlx::query_scalar(&format!( + "EXPLAIN SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}", + )).fetch_all(&mut *tx).await?; + let plan_text = plan.join("\n"); + anyhow::ensure!(plan_text.contains(index), + "with seqscan enabled the planner must prefer the {extractor} \ +{using} index for a selective = ; plan:\n{plan_text}", + extractor = $extractor, using = $using, + ); + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// Scale-preference DEFAULT category — the always-on counterpart of the +// feature-gated scale sweep above (#239 thread 17). For one curated combo +// (the recommended ordered domain, ord_term btree) it builds ~5000 filler +// rows + one selective pivot, ANALYZEs, and — leaving `enable_seqscan` ON — +// asserts the planner PREFERS the functional index under realistic costs. +// Unlike the index-engagement arms (validity only, seqscan forced off), this +// proves cost-preference; unlike the `*_scale_preference_*` sweep it runs in +// default PR CI. The assertion is node-type-aware via `assert_index_scan_uses` +// (a genuine Index/Index-Only/Bitmap-Index-Scan node referencing the index), +// so it cannot be satisfied by an incidental textual mention of the index. +// Curated to a single combo so PR CI cost stays bounded. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_scale_default_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + combos = [$($combo:tt),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_scale_default_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, combo = $combo, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_scale_default_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + combo = ($dom_name:ident, $variant:ident, $extractor:literal, $using:literal) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let table = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), + "_scaledef_", $using, + ); + let index = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), + "_scaledef_", $using, "_idx", + ); + + let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + anyhow::ensure!(values.len() >= 2, + "scale test requires >= 2 fixture rows for distinct filler/pivot"); + let filler = values[0]; + let pivot = values[values.len() / 2]; + let filler_payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, filler).await?; + let pivot_payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE {table} (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO {table}(value) \ +SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", + )).bind(&filler_payload).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO {table}(value) VALUES ($1::jsonb::{d})", + )).bind(&pivot_payload).execute(&mut *tx).await?; + sqlx::query(&format!( + "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = $extractor, + )).execute(&mut *tx).await?; + sqlx::query(&format!("ANALYZE {table}")) + .execute(&mut *tx).await?; + // enable_seqscan left ON: this is a cost-preference proof, not a + // validity check. With ~5000 filler rows and a single selective + // pivot, a correctly-costed plan must choose the functional index. + + let lit = pivot_payload.replace('\'', "''"); + $crate::matrix::assert_index_scan_uses( + &mut *tx, + &format!("SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}"), + index, + "with seqscan ON the planner must PREFER the ord_term functional index for a selective =", + ).await?; + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// Fixture-shape category — one test per type that pins the fixture's +// structural invariants: row count matches `T::FIXTURE_VALUES.len()`, +// ids are sequential from 1, plaintext column matches FIXTURE_VALUES in +// order, every payload carries the variant terms (`hm`, `ob`, `c`), +// distinct plaintexts produce distinct hm terms, every payload declares +// `v=2`. A single test runs all assertions to keep pool-setup cost +// bounded. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_fixture_shape { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let table = <$scalar as ScalarType>::fixture_table_name(); + let expected: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + let n = expected.len() as i64; + + let count: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table}", + )).fetch_one(&pool).await?; + anyhow::ensure!(count == n, + "row count must match FIXTURE_VALUES.len(): want {n}, got {count}"); + + let ids: Vec = sqlx::query_scalar(&format!( + "SELECT id FROM {table} ORDER BY id", + )).fetch_all(&pool).await?; + anyhow::ensure!(ids == (1..=n).collect::>(), + "ids must be sequential from 1: got {ids:?}"); + + let plaintexts: Vec<$scalar> = sqlx::query_scalar(&format!( + "SELECT plaintext FROM {table} ORDER BY id", + )).fetch_all(&pool).await?; + anyhow::ensure!(plaintexts == expected, + "plaintext column must match FIXTURE_VALUES in order"); + + for (label, predicate) in [ + ("hm string", "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'"), + ("ob array", "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'"), + ("c string", "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'"), + ] { + let missing: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} WHERE {predicate}", + )).fetch_one(&pool).await?; + anyhow::ensure!(missing == 0, + "every payload must carry a `{label}` term; missing = {missing}"); + } + + let distinct_hm: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(DISTINCT payload->>'hm') FROM {table}", + )).fetch_one(&pool).await?; + anyhow::ensure!(distinct_hm == n, + "{n} distinct values -> {n} distinct hm terms; got {distinct_hm}"); + + let mismatched_version: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} \ + WHERE payload->'v' IS NULL OR payload->>'v' <> '2'", + )).fetch_one(&pool).await?; + anyhow::ensure!(mismatched_version == 0, + "every payload must declare v = '2'"); + + // Value-filtering oracle: take the midpoint of FIXTURE_VALUES, + // derive its expected id from position, assert exactly one row. + if !expected.is_empty() { + let probe = expected[expected.len() / 2]; + let probe_lit = <$scalar as ScalarType>::to_sql_literal(probe); + let expected_id = (expected.len() / 2 + 1) as i64; + let ids: Vec = sqlx::query_scalar(&format!( + "SELECT id FROM {table} WHERE plaintext = {lit} ORDER BY id", lit = probe_lit, + )).fetch_all(&pool).await?; + anyhow::ensure!(ids == vec![expected_id], + "expected exactly one row with plaintext = {probe:?} at id {expected_id}, got {ids:?}"); + } + + Ok(()) + } + } + }; +} + +// ============================================================================ +// Ord-routes-through-ob category — ordered variants carry `c + ob` and +// drop `hm`. Equality on an ord variant must therefore route through +// `eql_v2.ord_term` (the `ob` term), never HMAC. Strip `hm` from every +// fixture payload so an accidental regression to HMAC equality fails +// rather than passing on the hm-carrying fixture. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_ord_routes_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$(($dom_name:ident, $variant:ident)),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_ord_routes_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_ord_routes_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let table = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), "_no_hm", + ); + let index = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), "_no_hm_idx", + ); + let fixture_table = + <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + let pivot: $scalar = + <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES[0]; + let pivot_lit = + <$scalar as $crate::scalar_domains::ScalarType>::to_sql_literal(pivot); + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE {table} (plaintext {pg}, value {d}) ON COMMIT DROP", + pg = <$scalar as $crate::scalar_domains::ScalarType>::PG_TYPE, + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO {table}(plaintext, value) \ + SELECT plaintext, (payload - 'hm')::{d} FROM {fixture}", fixture = fixture_table, + )).execute(&mut *tx).await?; + let with_hm: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM {table} WHERE jsonb_exists(value::jsonb, 'hm')", + )).fetch_one(&mut *tx).await?; + anyhow::ensure!(with_hm == 0, "test rows must not carry hm"); + + sqlx::query(&format!( + "CREATE INDEX {index} ON {table} USING btree (eql_v2.ord_term(value))", + )).execute(&mut *tx).await?; + sqlx::query(&format!("ANALYZE {table}")) + .execute(&mut *tx).await?; + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx).await?; + + let pivot_payload: String = sqlx::query_scalar(&format!( + "SELECT (payload - 'hm')::text FROM {fixture} WHERE plaintext = {lit}", + fixture = fixture_table, lit = pivot_lit, + )).fetch_one(&mut *tx).await?; + + // The fixture plaintexts are distinct, so the pivot row is + // unique: `=` via ob must match EXACTLY one row, not "at + // least one". A weaker `>= 1` here is not independent of the + // `<>` check below — `expected_neq` is `len - eq_count`, so an + // `=` that over-matches inflates `eq_count` and deflates + // `expected_neq` in lockstep and both assertions still pass. + // Pinning `== 1` makes both this and the derived `<>` count + // load-bearing. + let eq_count: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM {table} WHERE value = $1::jsonb::{d}", + )).bind(&pivot_payload).fetch_one(&mut *tx).await?; + anyhow::ensure!(eq_count == 1, + "= must match exactly the pivot row via ob with no hm present (want 1, got {eq_count})"); + + // Derive from the pinned `eq_count == 1`: every other fixture + // row must be `<>`. Kept as `len - eq_count` (not a bare + // `len - 1`) so that if the `== 1` invariant above is ever + // relaxed the two assertions cannot silently compensate for + // each other — the derivation stays honest regardless. + let expected_neq = + <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES.len() as i64 + - eq_count; + let neq_count: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM {table} WHERE value <> $1::jsonb::{d}", + )).bind(&pivot_payload).fetch_one(&mut *tx).await?; + anyhow::ensure!(neq_count == expected_neq, + "<> must match every non-pivot fixture row (want {expected_neq}, got {neq_count})", + ); + + // VALIDITY, NOT PREFERENCE: this runs with + // `enable_seqscan = off` (set above) on the ~17-row fixture, + // so the planner picks the only usable alternative. A green + // assertion proves the `eql_v2.ord_term` functional btree is + // *usable* for `=` with no hm present, NOT that the planner + // would *prefer* it at realistic scale. Cost-preference lives + // in the `*_scale_preference_*` tests + // (`#[cfg(feature = "scale")]`, OFF in PR CI). See the module + // header on `assert_index_scan_uses` for the full caveat. + // + // Node-type-aware (not a name substring): we require a genuine + // Index/Index-Only/Bitmap-Index-Scan node referencing `index`, + // so an incidental textual mention of the index name in an + // Index Cond / filter can no longer satisfy the assertion. + let lit = pivot_payload.replace('\'', "''"); + $crate::matrix::assert_index_scan_uses( + &mut *tx, + &format!("SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}"), + index, + "= must engage the eql_v2.ord_term functional btree with no hm", + ).await?; + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// ORE-injectivity category — for OrdOre variants, distinct plaintexts in +// the fixture must produce distinct ORE blocks. Pairwise self-join over +// the fixture: zero collisions. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_ore_injectivity_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$(($dom_name:ident, $variant:ident)),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_ore_injectivity_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_ore_injectivity_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let fixture_table = + <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + let collisions: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) \ +FROM {fixture} a \ +JOIN {fixture} b ON a.id < b.id \ +WHERE a.payload::{d} = b.payload::{d}", + fixture = fixture_table, + )).fetch_one(&pool).await?; + anyhow::ensure!(collisions == 0, + "no two distinct plaintexts may share an ORE term on {d}"); + Ok(()) + } + } + }; +} + +// ============================================================================ +// Index-engagement category — per (domain, extractor, using, ops) build a +// typed temp table from the fixture, create the functional index, sweep +// ops × rhs-casts asserting EXPLAIN contains a genuine index-scan node +// referencing the index (via `assert_index_scan_uses`, not a name substring). +// +// VALIDITY ONLY: forces `enable_seqscan = off` on the ~17-row fixture, so a +// green arm proves the index is *usable*, NOT that the planner would *prefer* +// it. Cost-preference is the `*_scale_preference_*` tests +// (`#[cfg(feature = "scale")]`, OFF in PR CI). See the module-level comment on +// `assert_index_scan_uses` for the full caveat. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_index_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + combos = [$($combo:tt),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_index_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, combo = $combo, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_index_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + combo = ( + $dom_name:ident, $variant:ident, + $extractor:literal, $using:literal, + [$(($op_name:ident, $op:literal)),+ $(,)?] $(,)? + ) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let table = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), + "_idx_", $using, + ); + let index = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), + "_idx_", $using, "_idx", + ); + let fixture_table = + <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + let mut tx = pool.begin().await?; + + sqlx::query(&format!( + "CREATE TEMP TABLE {table} (plaintext {pg}, value {d}) ON COMMIT DROP", + pg = <$scalar as $crate::scalar_domains::ScalarType>::PG_TYPE, + d = &spec.sql_domain, + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO {table}(plaintext, value) \ + SELECT plaintext, payload::{d} FROM {fixture}", d = &spec.sql_domain, fixture = fixture_table, + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = $extractor, + )).execute(&mut *tx).await?; + sqlx::query(&format!("ANALYZE {table}")) + .execute(&mut *tx).await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + + let pivot: $scalar = <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES[0]; + let payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + let lit = $crate::scalar_domains::sql_string_literal(&payload); + + // VALIDITY, NOT PREFERENCE: `enable_seqscan = off` is set + // above and the table holds only the ~17 fixture rows, so the + // planner has no cheaper option than the functional index. + // These arms therefore prove the index is *usable* for each + // (op, rhs-cast) shape — that the operator resolves through + // `{extractor}` and produces a real index-scan node — NOT that + // the planner would *prefer* the index under realistic costs. + // Cost-preference is proven ONLY by the `*_scale_preference_*` + // tests (`#[cfg(feature = "scale")]`), which are OFF in default + // PR CI. See the module header on `assert_index_scan_uses`. + // + // The assertion is node-type-aware (Index / Index Only / + // Bitmap Index Scan referencing `index`), not a bare substring + // match on the text plan, so an index name that merely appears + // in an Index Cond / Recheck Cond / filter cannot pass it. + let rhs_casts = [format!("::{d}", d = &spec.sql_domain), String::new()]; + $( + for rhs_cast in &rhs_casts { + let query = format!( + "SELECT * FROM {table} WHERE value {op} {lit}::jsonb{cast}", op = $op, cast = rhs_cast, + ); + $crate::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &format!( + "domain={} op={} rhs_cast={:?} must use index={}", + &spec.sql_domain, $op, rhs_cast, index, + ), + ).await?; + } + )+ + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// ORDER BY category — per ord domain × {ASC,DESC} × {no-WHERE, WHERE>0}. +// Fixture has no NULL plaintexts so NULLS FIRST/LAST is moot. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$($domain:tt),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_order_by_domain! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, domain = $domain, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_domain { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domain = ($dom_name:ident, $variant:ident) $(,)? + ) => { + $crate::__scalar_matrix_order_by_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = asc_no_where, direction = "ASC", where_clause = "", + } + $crate::__scalar_matrix_order_by_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = desc_no_where, direction = "DESC", where_clause = "", + } + $crate::__scalar_matrix_order_by_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = asc_with_where, direction = "ASC", + where_clause = " WHERE plaintext > 0", + } + $crate::__scalar_matrix_order_by_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = desc_with_where, direction = "DESC", + where_clause = " WHERE plaintext > 0", + } + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + mode_name = $mode_name:ident, direction = $direction:literal, + where_clause = $where_clause:literal $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let fixture_table = + <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + let sql = format!( + "SELECT plaintext FROM {fixture}{where_clause} \ +ORDER BY eql_v2.ord_term(payload::{d}) {dir}", + fixture = fixture_table, where_clause = $where_clause, + d = &spec.sql_domain, dir = $direction, + ); + let actual: Vec<$scalar> = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + + let zero: $scalar = Default::default(); + let mut expected: Vec<$scalar> = + <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES.to_vec(); + expected.sort(); + if $where_clause.contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if $direction == "DESC" { expected.reverse(); } + + assert_eq!(actual, expected, + "domain={} mode={} SQL={} expected {:?}, got {:?}", + &spec.sql_domain, stringify!($mode_name), sql, expected, actual); + Ok(()) + } + } + }; +} + +// ============================================================================ +// ORDER BY NULLS FIRST/LAST category — per ord domain × {ASC,DESC} × +// {NULLS FIRST, NULLS LAST}. The plain ORDER BY arm above sorts the fixture, +// which has no NULL rows, so NULLS placement goes untested there. This arm +// builds an isolated temp table mixing NULL-valued rows with the fixture rows +// and pins that the NULL sort keys land at the requested end while the +// non-NULL rows stay in plaintext order. `eql_v2.ord_term` is STRICT, so a +// NULL domain value yields a NULL sort key; a regression making it non-STRICT +// would let NULL rows interleave — see the `family::mutations` negative +// control for that dimension. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_nulls_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$($domain:tt),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_order_by_nulls_domain! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, domain = $domain, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_nulls_domain { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domain = ($dom_name:ident, $variant:ident) $(,)? + ) => { + $crate::__scalar_matrix_order_by_nulls_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = asc_nulls_first, direction = "ASC", nulls = "FIRST", + } + $crate::__scalar_matrix_order_by_nulls_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = asc_nulls_last, direction = "ASC", nulls = "LAST", + } + $crate::__scalar_matrix_order_by_nulls_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = desc_nulls_first, direction = "DESC", nulls = "FIRST", + } + $crate::__scalar_matrix_order_by_nulls_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + mode_name = desc_nulls_last, direction = "DESC", nulls = "LAST", + } + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_nulls_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + mode_name = $mode_name:ident, direction = $direction:literal, nulls = $nulls:literal $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + // Number of NULL-valued rows mixed in; >1 proves they cluster. + const NULL_ROWS: usize = 3; + + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let table = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), + "_order_by_", stringify!($mode_name), + ); + let fixture_table = + <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + let pg = <$scalar as $crate::scalar_domains::ScalarType>::PG_TYPE; + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE {table} (plaintext {pg}, value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + // Non-NULL rows: every fixture row, carrying its plaintext. + sqlx::query(&format!( + "INSERT INTO {table}(plaintext, value) \ +SELECT plaintext, payload::{d} FROM {fixture}", fixture = fixture_table, + )).execute(&mut *tx).await?; + // NULL-valued rows: NULL plaintext too, so they surface as None + // and their position is what the assertion pins. + sqlx::query(&format!( + "INSERT INTO {table}(plaintext, value) \ +SELECT NULL::{pg}, NULL::{d} FROM generate_series(1, {n})", n = NULL_ROWS, + )).execute(&mut *tx).await?; + + let sql = format!( + "SELECT plaintext FROM {table} \ +ORDER BY eql_v2.ord_term(value) {dir} NULLS {nulls}", + dir = $direction, nulls = $nulls, + ); + let actual: Vec> = + sqlx::query_scalar(&sql).fetch_all(&mut *tx).await?; + + // Ground truth: non-NULL plaintexts sorted (reversed for DESC), + // with NULL_ROWS Nones at the requested end. + let mut non_null: Vec<$scalar> = + <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES.to_vec(); + non_null.sort(); + if $direction == "DESC" { non_null.reverse(); } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if $nulls == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + + assert_eq!(actual, expected, + "domain={} mode={} SQL={} expected {:?}, got {:?}", + d, stringify!($mode_name), sql, expected, actual); + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// ORDER BY USING category — every op × ord domain must reject +// `ORDER BY col USING ` because the design forbids opclasses on +// these domains. If a refactor accidentally adds one, this fails. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_using_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$($domain:tt),* $(,)?], ops_list = $ops_list:tt $(,)? + ) => { + $( + $crate::__scalar_matrix_order_by_using_inner! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + domain = $domain, ops_list = $ops_list, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_using_inner { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domain = ($dom_name:ident, $variant:ident), + ops_list = [$(($op_name:ident, $op:literal)),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_order_by_using_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + op_name = $op_name, op = $op, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_order_by_using_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + op_name = $op_name:ident, op = $op:literal $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let fixture_table = + <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + let sql = format!( + "SELECT plaintext FROM {fixture} ORDER BY payload::{d} USING {op}", + fixture = fixture_table, d = &spec.sql_domain, op = $op, + ); + let err = sqlx::query_scalar::<_, $scalar>(&sql) + .fetch_all(&pool) + .await + .expect_err(&format!( + "domain={} op={} SQL={} must reject ORDER BY USING (no opclass on \ +domain by design) but succeeded", + &spec.sql_domain, $op, sql, + )); + // SQLSTATE 42809 (wrong_object_type) — "operator X is not a + // valid ordering operator". The boolean operator exists on the + // domain but lacks a btree opclass entry, so ORDER BY USING + // refuses to use it. Pinning this catches the regression where + // a stray opclass would make ORDER BY USING start succeeding + // for the wrong reason — `is_err()` alone could not. + $crate::assert_db_error(&err, "42809", None); + Ok(()) + } + } + }; +} + +// ============================================================================ +// Aggregate category — per (ord domain, op ∈ {min, max}), three tests: +// extremum identity (payload of the min/max FIXTURE_VALUES row), all-NULL +// returns NULL, and mixed NULL/non-NULL returns the correct extremum from +// the non-NULL subset. Pins that `eql_v2.min` / `eql_v2.max` aggregates +// route through the domain's `<` / `>` and that the STRICT state function +// correctly seeds + skips NULLs. Emits zero tests when ord_domains is +// empty — eq-only umbrellas pick that up naturally. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$($domain:tt),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_aggregate_mid! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + domain = $domain, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_mid { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domain = ($dom_name:ident, $variant:ident) $(,)? + ) => { + $crate::__scalar_matrix_aggregate_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + op_name = min, agg_fn = "min", picker = min, + } + $crate::__scalar_matrix_aggregate_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + op_name = max, agg_fn = "max", picker = max, + } + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + op_name = $op_name:ident, agg_fn = $agg_fn:literal, picker = $picker:ident $(,)? + ) => { + $crate::paste::paste! { + // Extremum identity: aggregate returns the exact payload of the + // smallest (or largest) fixture row. Domain-cast on both sides + // so the comparator routes through the variant's `<` / `>`. + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let fixture = <$scalar as ScalarType>::fixture_table_name(); + let extremum: $scalar = <$scalar as ScalarType>::FIXTURE_VALUES + .iter() + .copied() + .$picker() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = <$scalar as ScalarType>::to_sql_literal(extremum); + + let expected: String = sqlx::query_scalar(&format!( + "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = extremum_lit, + )).fetch_one(&pool).await?; + + let actual: String = sqlx::query_scalar(&format!( + "SELECT eql_v2.{agg}(payload::{d})::text FROM {fixture}", + agg = $agg_fn, + )).fetch_one(&pool).await?; + + assert_eq!( + actual, expected, + "eql_v2.{}({}) must return the payload of plaintext={:?} (the fixture {})", + $agg_fn, d, extremum, $agg_fn, + ); + + // Secondary diagnostic: when the primary identity holds, + // the ORE comparator must agree. The check is reached only + // on success of `assert_eq!`, so it's a self-consistency + // assertion on the comparator — catches the regression + // where payload text matches but `ord_term` resolves to a + // different value (e.g. due to payload-key reordering). + let ord_terms_match: bool = sqlx::query_scalar(&format!( + "SELECT eql_v2.ord_term(eql_v2.{agg}(payload::{d})) \ + = eql_v2.ord_term($1::jsonb::{d}) \ + FROM {fixture}", + agg = $agg_fn, + )) + .bind(&expected) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + ord_terms_match, + "eql_v2.ord_term(eql_v2.{}({})) must equal eql_v2.ord_term() \ + for plaintext={:?}", + $agg_fn, d, extremum, + ); + Ok(()) + } + + // Empty rowset: aggregate over zero rows returns NULL, + // structurally distinct from the all-NULL case (no rows fed + // at all vs. rows fed but every value NULL). Both must + // return NULL but they exercise different sfunc paths. + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE empty_agg (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + let result: Option = sqlx::query_scalar(&format!( + "SELECT eql_v2.{agg}(value)::text FROM empty_agg", + agg = $agg_fn, + )).fetch_one(&mut *tx).await?; + anyhow::ensure!( + result.is_none(), + "empty rowset to eql_v2.{} on {} must return NULL, got {:?}", + $agg_fn, d, result, + ); + tx.commit().await?; + Ok(()) + } + + // All-NULL input: STRICT sfunc never seeds the state, final + // result is NULL. No fixture needed. + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let sql = format!( + "SELECT eql_v2.{agg}(NULL::{d})::text FROM generate_series(1, 3)", + agg = $agg_fn, + ); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + result.is_none(), + "all-NULL input to eql_v2.{} on {} must return NULL, got {:?}; SQL={}", + $agg_fn, d, result, sql, + ); + Ok(()) + } + + // Mixed NULL / non-NULL: feeds [NULL, mid, NULL, high, NULL] and + // asserts the aggregate returns the correct extremum of {mid, + // high}. A non-STRICT sfunc would crash on (state=NULL, value=mid) + // because `value < state` would be NULL; the STRICT contract + // skips NULL inputs and seeds with the first non-NULL value. + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let fixture = <$scalar as ScalarType>::fixture_table_name(); + let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + anyhow::ensure!( + values.len() >= 2, + "mixed-NULL test needs >= 2 fixture values; got {}", + values.len(), + ); + let mut sorted: Vec<$scalar> = values.to_vec(); + sorted.sort(); + // Span the fixture's extremes — for signed numeric scalars this + // exercises the ORE sign-bit edges in addition to pinning STRICT + // sfunc behaviour. + let low: $scalar = *sorted.first().expect("non-empty after len check"); + let high: $scalar = *sorted.last().expect("non-empty after len check"); + // .min() / .max() on two values resolves to the correct picker. + let expected_plaintext: $scalar = low.$picker(high); + let low_lit = <$scalar as ScalarType>::to_sql_literal(low); + let high_lit = <$scalar as ScalarType>::to_sql_literal(high); + let expected_lit = <$scalar as ScalarType>::to_sql_literal(expected_plaintext); + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE mixed_null (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO mixed_null(value) \ + SELECT NULL::{d} \ + UNION ALL SELECT payload::{d} FROM {fixture} WHERE plaintext = {low} \ + UNION ALL SELECT NULL::{d} \ + UNION ALL SELECT payload::{d} FROM {fixture} WHERE plaintext = {high} \ + UNION ALL SELECT NULL::{d}", low = low_lit, high = high_lit, + )).execute(&mut *tx).await?; + + let expected: String = sqlx::query_scalar(&format!( + "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = expected_lit, + )).fetch_one(&mut *tx).await?; + + let actual: Option = sqlx::query_scalar(&format!( + "SELECT eql_v2.{agg}(value)::text FROM mixed_null", + agg = $agg_fn, + )).fetch_one(&mut *tx).await?; + + anyhow::ensure!( + actual.as_deref() == Some(expected.as_str()), + "eql_v2.{} on mixed NULL/non-NULL must return the {} non-NULL value (plaintext={:?}); want {expected:?}, got {actual:?}", + $agg_fn, $agg_fn, expected_plaintext, + ); + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// Aggregate parallelism category — per ord domain, assert that the catalog +// declares MIN/MAX as PARALLEL SAFE with a combine function. Without those, +// PostgreSQL silently forecloses partial/parallel aggregation on exactly the +// large GROUP BY workloads these ORE aggregates exist to serve (#239 thread +// 22). A catalog-level structural guard (cheap, deterministic, no plan +// dependence) rather than a flaky "force a parallel plan" behavioural test. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_parallel_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + domains = [$($domain:tt),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_aggregate_parallel_case! { + suite = $suite, scalar = $scalar, domain = $domain, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_parallel_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + domain = ($dom_name:ident, $variant:ident) $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + for agg in ["min", "max"] { + let (proparallel, has_combine): (String, bool) = sqlx::query_as( + "SELECT p.proparallel::text, a.aggcombinefn <> 0 \ + FROM pg_proc p \ + JOIN pg_aggregate a ON a.aggfnoid = p.oid \ + WHERE p.proname = $1 \ + AND p.pronamespace = 'eql_v2'::regnamespace \ + AND p.proargtypes[0]::regtype = $2::regtype", + ) + .bind(agg) + .bind(d) + .fetch_one(&pool) + .await?; + anyhow::ensure!(proparallel == "s", + "eql_v2.{agg}({d}) must be PARALLEL SAFE (proparallel='s'), got {proparallel:?}"); + anyhow::ensure!(has_combine, + "eql_v2.{agg}({d}) must declare a combinefunc for partial aggregation"); + } + Ok(()) + } + } + }; +} + +// ============================================================================ +// Aggregate GROUP BY category — per (ord domain, op ∈ {min, max}), build a +// temp table partitioned into two groups, populate each with a known +// subset of fixture rows, GROUP BY the group key, and assert that +// `eql_v2.(value)` returns the correct extremum payload per group. +// Pins that the aggregate composes correctly under GROUP BY (state is +// reset between groups, the sfunc routes through the variant's +// comparator inside each partition). +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_group_by_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$($domain:tt),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_aggregate_group_by_mid! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + domain = $domain, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_group_by_mid { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domain = ($dom_name:ident, $variant:ident) $(,)? + ) => { + $crate::__scalar_matrix_aggregate_group_by_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + op_name = min, agg_fn = "min", picker = min, + } + $crate::__scalar_matrix_aggregate_group_by_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + op_name = max, agg_fn = "max", picker = max, + } + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_group_by_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident, + op_name = $op_name:ident, agg_fn = $agg_fn:literal, picker = $picker:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let fixture = <$scalar as ScalarType>::fixture_table_name(); + let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + anyhow::ensure!( + values.len() >= 5, + "GROUP BY test needs >= 5 fixture values; got {}", + values.len(), + ); + + // Partition FIXTURE_VALUES[..3] into group 1 and [3..5] + // into group 2. Per-group extremum is computed in Rust as + // the ground truth. + let group1: &[$scalar] = &values[..3]; + let group2: &[$scalar] = &values[3..5]; + let group1_extremum: $scalar = group1.iter().copied().$picker() + .expect("group 1 is non-empty"); + let group2_extremum: $scalar = group2.iter().copied().$picker() + .expect("group 2 is non-empty"); + let g1_lit = <$scalar as ScalarType>::to_sql_literal(group1_extremum); + let g2_lit = <$scalar as ScalarType>::to_sql_literal(group2_extremum); + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE group_test (group_key int, value {d}) \ +ON COMMIT DROP", + )).execute(&mut *tx).await?; + + // Insert group 1 rows. + for v in group1 { + let lit = <$scalar as ScalarType>::to_sql_literal(*v); + sqlx::query(&format!( + "INSERT INTO group_test(group_key, value) \ +SELECT 1, payload::{d} FROM {fixture} WHERE plaintext = {lit}", + )).execute(&mut *tx).await?; + } + // Insert group 2 rows. + for v in group2 { + let lit = <$scalar as ScalarType>::to_sql_literal(*v); + sqlx::query(&format!( + "INSERT INTO group_test(group_key, value) \ +SELECT 2, payload::{d} FROM {fixture} WHERE plaintext = {lit}", + )).execute(&mut *tx).await?; + } + + // Lookup the expected payload texts for each group's extremum. + let g1_expected: String = sqlx::query_scalar(&format!( + "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = g1_lit, + )).fetch_one(&mut *tx).await?; + let g2_expected: String = sqlx::query_scalar(&format!( + "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = g2_lit, + )).fetch_one(&mut *tx).await?; + + let rows: Vec<(i32, String)> = sqlx::query_as(&format!( + "SELECT group_key, eql_v2.{agg}(value)::text \ +FROM group_test GROUP BY group_key ORDER BY group_key", + agg = $agg_fn, + )).fetch_all(&mut *tx).await?; + + anyhow::ensure!( + rows.len() == 2, + "GROUP BY must return 2 rows, got {}", + rows.len(), + ); + anyhow::ensure!( + rows[0].0 == 1 && rows[0].1 == g1_expected, + "group 1 eql_v2.{}({}) must yield payload for plaintext={:?}; \ +want ({}, {:?}), got {:?}", + $agg_fn, d, group1_extremum, 1, g1_expected, rows[0], + ); + anyhow::ensure!( + rows[1].0 == 2 && rows[1].1 == g2_expected, + "group 2 eql_v2.{}({}) must yield payload for plaintext={:?}; \ +want ({}, {:?}), got {:?}", + $agg_fn, d, group2_extremum, 2, g2_expected, rows[1], + ); + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// Aggregate type-safety category — for variants that do NOT support ord +// (Storage, Eq), `eql_v2.min()` / `eql_v2.max(...)` must +// resolve to "function does not exist" (SQLSTATE 42883). Pins that +// codegen correctly omits MIN/MAX wrappers for these variants — a +// SQL-level regression test complementing the codegen unit test. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_typecheck_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + domains = [$(($dom_name:ident, $variant:ident)),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_aggregate_typecheck_dispatch! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, + } + )+ + }; +} + +// Dispatch on variant ident: ord-capable variants (Ord, OrdOre) emit no +// typecheck test — they DO declare min/max. Non-ord variants (Storage, +// Eq) emit one test per aggregate op asserting the call fails with +// SQLSTATE 42883. +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_typecheck_dispatch { + // Ord, OrdOre: no typecheck test — these variants declare min/max. + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = Ord $(,)? + ) => {}; + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = OrdOre $(,)? + ) => {}; + // Storage, Eq: emit min + max typecheck tests. + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::__scalar_matrix_aggregate_typecheck_case! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, + op_name = min, agg_fn = "min", + } + $crate::__scalar_matrix_aggregate_typecheck_case! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, + op_name = max, agg_fn = "max", + } + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_aggregate_typecheck_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = $variant:ident, + op_name = $op_name:ident, agg_fn = $agg_fn:literal $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE typecheck_table (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{d})", + )).bind(payload).execute(&mut *tx).await?; + + // Savepoint-isolate the probe so the failed lookup + // doesn't abort the outer transaction and tx.commit() + // can succeed cleanly. + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let sql = format!( + "SELECT eql_v2.{agg}(value) FROM typecheck_table", + agg = $agg_fn, + ); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err(&format!( + "eql_v2.{} on non-ord variant {} must raise but succeeded", + $agg_fn, d, + )); + // 42883 = undefined_function (no overload defined at all); + // 42725 = ambiguous_function (multiple overloads resolve, + // none specific to this variant). Either confirms the + // variant carries no MIN/MAX of its own — the generic + // eql_v2_encrypted overload is reachable via cast but + // can't be resolved unambiguously from a domain-typed + // column. Both outcomes are acceptable "not supported". + let db_err = err.as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + anyhow::ensure!( + code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), + "expected SQLSTATE 42883 (undefined_function) or 42725 \ +(ambiguous_function) for eql_v2.{}({}), got {:?} (message: {})", + $agg_fn, d, code, db_err.message(), + ); + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + + tx.commit().await?; + Ok(()) + } + } + }; +} + +// ============================================================================ +// COUNT category — pins three forms per variant: plain COUNT(value) on a +// typed column, COUNT(payload::variant) on the fixture, and +// COUNT(DISTINCT extractor(value)) using the variant's own extractor. The +// DISTINCT case dispatches per-variant: Storage has no extractor and so +// emits no DISTINCT test; Eq uses eq_term, Ord/OrdOre use ord_term. +// +// This is net new coverage relative to the legacy aggregate_tests.rs file, +// which only covered plain COUNT and only against the eql_v2_encrypted +// type. Pinning per-variant DISTINCT catches the breakage class where +// picking the wrong extractor would fail at runtime ("function +// eql_v2.eq_term(eql_v2_int4_ord) does not exist") — exactly the kind of +// thing the variant-aware matrix is meant to surface mechanically. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_count_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$(($dom_name:ident, $variant:ident)),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_count_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + } + $crate::__scalar_matrix_count_distinct_dispatch! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_count_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + // COUNT(value) on a typed column — pins that PG's native COUNT + // works on a domain-typed column without an aggregate declaration. + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let fixture = <$scalar as ScalarType>::fixture_table_name(); + let expected = <$scalar as ScalarType>::FIXTURE_VALUES.len() as i64; + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE typed_count (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO typed_count(value) SELECT payload::{d} FROM {fixture}", + )).execute(&mut *tx).await?; + + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ).fetch_one(&mut *tx).await?; + anyhow::ensure!( + actual == expected, + "COUNT(value) on typed {} column: want {}, got {}", + d, expected, actual, + ); + + tx.commit().await?; + Ok(()) + } + + // COUNT(payload::variant) on the fixture — pins COUNT on a + // path-cast expression. No temp table; the cast happens inline. + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let fixture = <$scalar as ScalarType>::fixture_table_name(); + let expected = <$scalar as ScalarType>::FIXTURE_VALUES.len() as i64; + + let sql = format!( + "SELECT COUNT(payload::{d}) FROM {fixture}", + ); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + anyhow::ensure!( + actual == expected, + "COUNT(payload::{}) on {}: want {}, got {}; SQL={}", + d, fixture, expected, actual, sql, + ); + Ok(()) + } + } + }; +} + +// Dispatch on variant ident: Storage has no discriminating extractor, so +// emits no DISTINCT test. The other three (Eq, Ord, OrdOre) each emit one +// test that reads the extractor function name from the runtime +// `ScalarDomainSpec::extractor_fn()` accessor (Eq -> `eql_v2.eq_term`, +// Ord/OrdOre -> `eql_v2.ord_term`) and appends `(value)` at the call site. +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_count_distinct_dispatch { + // Storage: no DISTINCT case — no extractor to deduplicate by. + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = Storage $(,)? + ) => {}; + // Eq, Ord, OrdOre — emit the DISTINCT test. + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let extractor_fn = spec.extractor_fn() + .expect("non-Storage variant must expose an extractor"); + let extractor = format!("{extractor_fn}(value)"); + let fixture = <$scalar as ScalarType>::fixture_table_name(); + let expected = <$scalar as ScalarType>::FIXTURE_VALUES.len() as i64; + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE distinct_count (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO distinct_count(value) SELECT payload::{d} FROM {fixture}", + )).execute(&mut *tx).await?; + + let sql = format!( + "SELECT COUNT(DISTINCT {extr}) FROM distinct_count", + extr = extractor, + ); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + anyhow::ensure!( + actual == expected, + "COUNT(DISTINCT {}) on {}: want {} (one per FIXTURE_VALUES row), got {}; SQL={}", + extractor, d, expected, actual, sql, + ); + + tx.commit().await?; + Ok(()) + } + } + }; +} diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs new file mode 100644 index 000000000..b31c1a554 --- /dev/null +++ b/tests/sqlx/src/scalar_domains.rs @@ -0,0 +1,308 @@ +//! Type-generic substrate for the encrypted-scalar-domain test matrix. +//! +//! Adding a new encrypted scalar type (e.g. `i64` for int8, `f64` for +//! float8) is a 4-line `impl ScalarType` plus a Proxy-encrypted fixture. +//! Everything else — the four `eql_v2_{,_eq,_ord,_ord_ore}` domains, +//! per-domain payload shapes, supported operators, index extractor +//! expressions, ground-truth result sets — is derived from +//! `T::PG_TYPE`, `T::FIXTURE_VALUES`, and the `Variant` enum. + +use anyhow::{bail, Context, Result}; +use sqlx::PgPool; +use std::fmt::{Debug, Display}; + +/// One impl per scalar type. Two `const`s and the rest defaults. +pub trait ScalarType: + Copy + + Ord + + Default + + Debug + + Display + + Send + + Sync + + Unpin + + 'static + + for<'r> sqlx::Decode<'r, sqlx::Postgres> + + sqlx::Type +{ + /// Postgres native type token — also the suffix in the SQL domain + /// name and the fixture script name. Examples: `"int4"`, `"int8"`. + const PG_TYPE: &'static str; + + /// Distinct plaintext values present in the fixture. Order doesn't + /// matter — `expected_forward` sorts before returning. + /// + /// For types driven by `ordered_numeric_matrix!`, the fixture MUST + /// include `MIN`, `MAX`, and zero (`Default::default()`): the matrix + /// uses those three as comparison pivots and fetches each one's + /// ciphertext via `fetch_fixture_payload`, which fails loudly if the + /// row is absent. + const FIXTURE_VALUES: &'static [Self]; + + /// `fixtures.eql_v2_`. + fn fixture_table_name() -> String { + format!("fixtures.eql_v2_{}", Self::PG_TYPE) + } + + /// SQL-literal rendering via `Display`. Override for types whose + /// `Display` form isn't a valid SQL literal (e.g. strings, dates). + fn to_sql_literal(value: Self) -> String { + value.to_string() + } + + /// Ground-truth result set for `WHERE col op pivot`. Default works + /// for any `Ord` scalar; override only for non-orderable types. + fn expected_forward(op: &str, pivot: Self) -> Vec { + let predicate: fn(Self, Self) -> bool = match op { + "=" => |a, b| a == b, + "<>" => |a, b| a != b, + "<" => |a, b| a < b, + "<=" => |a, b| a <= b, + ">" => |a, b| a > b, + ">=" => |a, b| a >= b, + other => panic!("expected_forward: unsupported operator {other}"), + }; + let mut values: Vec = Self::FIXTURE_VALUES + .iter() + .copied() + .filter(|v| predicate(*v, pivot)) + .collect(); + values.sort(); + values + } +} + +impl ScalarType for i32 { + const PG_TYPE: &'static str = "int4"; + /// Single-sourced from `tasks/codegen/types/int4.toml` `[fixture] values` + /// via the generated `fixtures::int4_values::VALUES` const — the same list + /// the fixture generator encrypts, so the oracle cannot drift from the + /// fixture. Spans the negative boundary, the i32 signed extremes, and zero. + const FIXTURE_VALUES: &'static [i32] = crate::fixtures::int4_values::VALUES; +} + +/// Per-domain capability + payload shape. Storage carries no terms, `Eq` +/// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate +/// twins — same operator surface, different SQL domain names — for the +/// scheme-explicit vs converged-name migration story. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Variant { + Storage, + Eq, + Ord, + OrdOre, +} + +impl Variant { + /// Every variant the family currently materialises, in declaration + /// order. Tests iterate over this rather than hand-listing variants + /// so adding a future variant requires no test edit. + pub const ALL: &'static [Variant] = + &[Variant::Storage, Variant::Eq, Variant::Ord, Variant::OrdOre]; + + pub const fn suffix(self) -> &'static str { + match self { + Variant::Storage => "", + Variant::Eq => "_eq", + Variant::Ord => "_ord", + Variant::OrdOre => "_ord_ore", + } + } + + /// Term key the variant requires on its CHECK constraint. `Storage` + /// requires nothing beyond the envelope; `Eq` requires `hm`; + /// `Ord` / `OrdOre` require `ob`. Read by tests that need to know + /// "what term does this variant carry?" — not by payload builders; + /// see `PLACEHOLDER_PAYLOAD`. + pub const fn required_term(self) -> Option<&'static str> { + match self { + Variant::Storage => None, + Variant::Eq => Some("hm"), + Variant::Ord | Variant::OrdOre => Some("ob"), + } + } + + /// Top-level JSONB keys the variant's domain CHECK requires. + /// Storage requires the EQL envelope (`v`, `i`, `c`); ord-capable + /// variants additionally require their term key (`hm` / `ob`). The + /// matrix `payload_check` arm iterates this to assert each key's + /// absence is rejected at the cast. + pub fn payload_required_keys(self) -> impl Iterator { + ["v", "i", "c"].into_iter().chain(self.required_term()) + } + + pub const fn supports_eq(self) -> bool { + !matches!(self, Variant::Storage) + } + + pub const fn supports_ord(self) -> bool { + matches!(self, Variant::Ord | Variant::OrdOre) + } + + /// Function name of the discriminating extractor for this variant, + /// or `None` if the variant carries no extractor (`Storage`). Returns + /// just the function name — call sites append `(column)` themselves so + /// the accessor is decoupled from any specific column-naming + /// convention. `Eq` resolves to `eql_v2.eq_term`; `Ord` and `OrdOre` + /// both resolve to `eql_v2.ord_term`. + pub const fn extractor_fn(self) -> Option<&'static str> { + match self { + Variant::Storage => None, + Variant::Eq => Some("eql_v2.eq_term"), + Variant::Ord | Variant::OrdOre => Some("eql_v2.ord_term"), + } + } +} + +/// Runtime spec built from `(T, Variant)`. The matrix macro consumes +/// this; nothing here is `const` because `sql_domain` is derived via +/// `format!` from `T::PG_TYPE`. +#[derive(Debug, Clone)] +pub struct ScalarDomainSpec { + pub sql_domain: String, + pub variant: Variant, +} + +impl ScalarDomainSpec { + pub fn new(variant: Variant) -> Self { + Self { + sql_domain: format!("eql_v2_{}{}", T::PG_TYPE, variant.suffix()), + variant, + } + } + + pub fn supports_eq(&self) -> bool { + self.variant.supports_eq() + } + + pub fn supports_ord(&self) -> bool { + self.variant.supports_ord() + } + + pub fn extractor_fn(&self) -> Option<&'static str> { + self.variant.extractor_fn() + } +} + +/// SQL string-literal escaping for direct interpolation. +pub fn sql_string_literal(value: &str) -> String { + format!("'{}'", value.replace('\'', "''")) +} + +/// `a op b` and `b op' a` return the same row set when `op'` is the +/// commutator of `op`. Used by the cross-shape arm when the column moves +/// to the right operand. +pub fn commute_op(op: &str) -> &'static str { + match op { + "=" => "=", + "<>" => "<>", + "<" => ">", + "<=" => ">=", + ">" => "<", + ">=" => "<=", + other => panic!("commute_op: unsupported operator {other}"), + } +} + +/// Fetch the payload row keyed by `plaintext` from `T`'s fixture table. +pub async fn fetch_fixture_payload(pool: &PgPool, plaintext: T) -> Result { + let sql = format!( + "SELECT payload::text FROM {table} WHERE plaintext = {lit}", + table = T::fixture_table_name(), + lit = T::to_sql_literal(plaintext), + ); + sqlx::query_scalar(&sql) + .fetch_one(pool) + .await + .with_context(|| { + format!( + "fetching {} payload for plaintext={:?}", + T::fixture_table_name(), + plaintext + ) + }) +} + +/// Sorted plaintexts matching `predicate` against `T`'s fixture table. +async fn scalar_plaintexts_matching( + pool: &PgPool, + predicate: &str, +) -> Result> { + let sql = format!( + "SELECT plaintext FROM {table} WHERE {predicate} ORDER BY plaintext", + table = T::fixture_table_name(), + ); + let mut rows: Vec = sqlx::query_scalar(&sql) + .fetch_all(pool) + .await + .with_context(|| format!("running scalar plaintext query: {sql}"))?; + rows.sort(); + Ok(rows) +} + +/// Run `predicate` against `T`'s fixture; assert plaintexts equal `expected`. +pub async fn assert_scalar_plaintexts( + pool: &PgPool, + domain: &str, + op: &str, + predicate: &str, + expected: &[T], +) -> Result<()> { + let actual = scalar_plaintexts_matching::(pool, predicate).await?; + let mut want = expected.to_vec(); + want.sort(); + assert_eq!( + actual, want, + "domain={domain} operator={op} predicate={predicate} must match expected plaintexts" + ); + Ok(()) +} + +/// Unified raise-assertion: query must error and the message must contain +/// `expected_msg`. Covers blocker raises (`expected_msg = "operator X is +/// not supported for {domain}"`) and native-operator absence +/// (`"operator does not exist"`). Bind slots are `Option<&str>`: `Some` +/// = bind the payload, `None` = bind NULL. +pub async fn assert_raises( + pool: &PgPool, + sql: &str, + binds: &[Option<&str>], + expected_msg: &str, +) -> Result<()> { + let mut q = sqlx::query(sql); + for b in binds { + q = q.bind(*b); + } + let result = q.fetch_one(pool).await; + let err = match result { + Ok(_) => bail!("SQL must raise: {sql}"), + Err(e) => e.to_string(), + }; + if !err.contains(expected_msg) { + bail!("SQL={sql} expected error containing {expected_msg:?}, got {err}"); + } + Ok(()) +} + +/// Unified NULL-result assertion: the query must succeed and return NULL. +/// Used for supported operators where STRICT semantics propagate NULL. +pub async fn assert_null(pool: &PgPool, sql: &str, binds: &[Option<&str>]) -> Result<()> { + let mut q = sqlx::query_scalar::<_, Option>(sql); + for b in binds { + q = q.bind(*b); + } + let result: Option = q + .fetch_one(pool) + .await + .with_context(|| format!("running null-result assertion: {sql}"))?; + if result.is_some() { + bail!("SQL={sql} with NULL operand must yield NULL, got {result:?}"); + } + Ok(()) +} + +/// Blocker error message — the contract every encrypted-domain blocker +/// must satisfy regardless of arg shape or NULL configuration. +pub fn blocker_msg(domain: &str, op: &str) -> String { + format!("operator {op} is not supported for {domain}") +} diff --git a/tests/sqlx/tests/aggregate_tests.rs b/tests/sqlx/tests/aggregate_tests.rs index 9306df26e..f942a51e1 100644 --- a/tests/sqlx/tests/aggregate_tests.rs +++ b/tests/sqlx/tests/aggregate_tests.rs @@ -1,14 +1,20 @@ //! Aggregate function tests //! -//! Tests COUNT, MAX, MIN with encrypted data including eql_v2.min() and eql_v2.max() +//! Covers native `COUNT` / `GROUP BY` on `eql_v2_encrypted` and the +//! `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates +//! on the composite type. Per-domain aggregates +//! (`eql_v2.min(eql_v2__ord)` etc.) are additionally covered by the +//! encrypted-domain test matrix (`tests/sqlx/src/matrix.rs`, instantiated per +//! scalar type from `tests/sqlx/tests/encrypted_domain/scalars/.rs`). use anyhow::Result; use sqlx::PgPool; #[sqlx::test] async fn count_aggregate_on_encrypted_column(pool: PgPool) -> Result<()> { - // Test: COUNT works on encrypted columns (counts non-NULL encrypted values) - + // COUNT on an `eql_v2_encrypted` column is PostgreSQL-native — no + // aggregate declaration is required. Pin that it still counts non-NULL + // encrypted rows on the legacy composite type. let count: i64 = sqlx::query_scalar("SELECT COUNT(e) FROM ore") .fetch_one(&pool) .await?; @@ -68,9 +74,9 @@ async fn min_aggregate_on_encrypted_column(pool: PgPool) -> Result<()> { #[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] async fn group_by_with_encrypted_column(pool: PgPool) -> Result<()> { - // Test: GROUP BY works with encrypted data - // Fixture creates 3 distinct encrypted records, each unique - + // GROUP BY on `eql_v2_encrypted` works natively against the fixture's + // distinct payloads. Pin that grouping by an encrypted column returns + // the expected number of groups. let group_count: i64 = sqlx::query_scalar( "SELECT COUNT(*) FROM ( SELECT e, COUNT(*) FROM encrypted GROUP BY e diff --git a/tests/sqlx/tests/constraint_tests.rs b/tests/sqlx/tests/constraint_tests.rs index baf51a132..7e2871c17 100644 --- a/tests/sqlx/tests/constraint_tests.rs +++ b/tests/sqlx/tests/constraint_tests.rs @@ -3,6 +3,7 @@ //! Tests UNIQUE, NOT NULL, CHECK constraints on encrypted columns use anyhow::Result; +use eql_tests::assert_db_error; use sqlx::PgPool; #[sqlx::test(fixtures(path = "../fixtures", scripts("constraint_tables")))] @@ -25,17 +26,15 @@ async fn unique_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { assert_eq!(count, 1, "Should have 1 record after insert"); // Attempt duplicate insert - let result = sqlx::query( + let err = sqlx::query( "INSERT INTO constrained (unique_field, not_null_field, check_field) VALUES (create_encrypted_json(1, 'hm'), create_encrypted_json(2, 'hm'), create_encrypted_json(2, 'hm'))" ) .execute(&pool) - .await; + .await + .expect_err("UNIQUE constraint should prevent duplicate"); - assert!( - result.is_err(), - "UNIQUE constraint should prevent duplicate" - ); + assert_db_error(&err, "23505", Some("constrained_unique_field_key")); // Verify count unchanged after failed insert let count_after: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM constrained") @@ -51,14 +50,17 @@ async fn unique_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { async fn not_null_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { // Test: NOT NULL constraint enforced (2 assertions) - let result = sqlx::query( + let err = sqlx::query( "INSERT INTO constrained (unique_field) VALUES (create_encrypted_json(2, 'hm'))", ) .execute(&pool) - .await; + .await + .expect_err("NOT NULL constraint should prevent NULL"); - assert!(result.is_err(), "NOT NULL constraint should prevent NULL"); + // NOT NULL is a column attribute, not a named constraint — `constraint()` + // returns None, so only pin the SQLSTATE. + assert_db_error(&err, "23502", None); // Verify no records were inserted let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM constrained") @@ -74,7 +76,7 @@ async fn not_null_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { async fn check_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { // Test: CHECK constraint enforced (2 assertions) - let result = sqlx::query( + let err = sqlx::query( "INSERT INTO constrained (unique_field, not_null_field, check_field) VALUES ( create_encrypted_json(3, 'hm'), @@ -83,9 +85,10 @@ async fn check_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { )", ) .execute(&pool) - .await; + .await + .expect_err("CHECK constraint should prevent NULL"); - assert!(result.is_err(), "CHECK constraint should prevent NULL"); + assert_db_error(&err, "23514", Some("constrained_check_field_check")); // Verify no records were inserted let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM constrained") @@ -199,15 +202,13 @@ async fn foreign_key_constraint_with_encrypted(pool: PgPool) -> Result<()> { ); // Attempt to insert child with different encrypted value (should fail FK check) - let different_insert_result = + let err = sqlx::query("INSERT INTO child (id, parent_id) VALUES (2, create_encrypted_json(2, 'hm'))") .execute(&pool) - .await; + .await + .expect_err("FK constraint should reject non-existent parent reference"); - assert!( - different_insert_result.is_err(), - "FK constraint should reject non-existent parent reference" - ); + assert_db_error(&err, "23503", Some("child_parent_id_fkey")); // Verify child count unchanged let final_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM child") @@ -258,14 +259,17 @@ async fn add_encrypted_constraint_prevents_invalid_data(pool: PgPool) -> Result< .await?; // Now attempt to insert invalid data - should fail - let result = sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") + let err = sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") .execute(&pool) - .await; + .await + .expect_err("Constraint should prevent insert of invalid eql_v2_encrypted (empty JSONB)"); - assert!( - result.is_err(), - "Constraint should prevent insert of invalid eql_v2_encrypted (empty JSONB)" - ); + // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint + // propagates the underlying SQLSTATE (P0001 raise_exception) rather than + // 23514. The raise message identifies which check failed (missing v, + // invalid v, missing root c/sv, etc.) — that's the value over a bare + // `is_err()` check. + assert_db_error(&err, "P0001", None); // Verify count unchanged after failed insert let final_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM encrypted") @@ -290,14 +294,17 @@ async fn remove_encrypted_constraint_allows_invalid_data(pool: PgPool) -> Result .await?; // Verify constraint is working - invalid data should be rejected - let result = sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") + let err = sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") .execute(&pool) - .await; + .await + .expect_err("Constraint should prevent insert of invalid eql_v2_encrypted"); - assert!( - result.is_err(), - "Constraint should prevent insert of invalid eql_v2_encrypted" - ); + // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint + // propagates the underlying SQLSTATE (P0001 raise_exception) rather than + // 23514. The raise message identifies which check failed (missing v, + // invalid v, missing root c/sv, etc.) — that's the value over a bare + // `is_err()` check. + assert_db_error(&err, "P0001", None); // Remove the constraint sqlx::query("SELECT eql_v2.remove_encrypted_constraint('encrypted', 'e')") @@ -342,18 +349,21 @@ async fn version_metadata_validation_on_insert(pool: PgPool) -> Result<()> { .fetch_one(&pool) .await?; - // Attempt to insert without version field - should fail - let result = sqlx::query(&format!( - "INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)", - encrypted_without_version - )) - .execute(&pool) - .await; + // Attempt to insert without version field - should fail. Bind the payload + // rather than format!-interpolate it — JSONB strings can carry quotes + // and would otherwise need hand-rolled escaping. + let err = sqlx::query("INSERT INTO encrypted (e) VALUES ($1::jsonb::eql_v2_encrypted)") + .bind(&encrypted_without_version) + .execute(&pool) + .await + .expect_err("Insert should fail when version field is missing"); - assert!( - result.is_err(), - "Insert should fail when version field is missing" - ); + // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint + // propagates the underlying SQLSTATE (P0001 raise_exception) rather than + // 23514. The raise message identifies which check failed (missing v, + // invalid v, missing root c/sv, etc.) — that's the value over a bare + // `is_err()` check. + assert_db_error(&err, "P0001", None); // Create encrypted value with invalid version (v=1 instead of v=2) let encrypted_invalid_version: String = @@ -362,17 +372,18 @@ async fn version_metadata_validation_on_insert(pool: PgPool) -> Result<()> { .await?; // Attempt to insert with invalid version - should fail - let result = sqlx::query(&format!( - "INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)", - encrypted_invalid_version - )) - .execute(&pool) - .await; + let err = sqlx::query("INSERT INTO encrypted (e) VALUES ($1::jsonb::eql_v2_encrypted)") + .bind(&encrypted_invalid_version) + .execute(&pool) + .await + .expect_err("Insert should fail when version field is invalid (v=1)"); - assert!( - result.is_err(), - "Insert should fail when version field is invalid (v=1)" - ); + // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint + // propagates the underlying SQLSTATE (P0001 raise_exception) rather than + // 23514. The raise message identifies which check failed (missing v, + // invalid v, missing root c/sv, etc.) — that's the value over a bare + // `is_err()` check. + assert_db_error(&err, "P0001", None); // Insert with valid version (v=2) should succeed sqlx::query("INSERT INTO encrypted (e) VALUES (create_encrypted_json(1))") @@ -455,17 +466,17 @@ async fn check_encrypted_accepts_stevec_payload(pool: PgPool) -> Result<()> { ); // Sanity-check the negative path: a root that carries neither `c` nor - // `sv` is still rejected with the updated error message. - let neither: Result = sqlx::query_scalar( + // `sv` is still rejected with the updated error message. Calling + // `check_encrypted` directly RAISEs (not a CHECK constraint), so + // SQLSTATE P0001 (raise_exception) rather than 23514. + let err = sqlx::query_scalar::<_, bool>( "SELECT eql_v2.check_encrypted('{\"v\": 2, \"i\": {\"t\": \"users\", \"c\": \"x\"}}'::jsonb)", ) .fetch_one(&pool) - .await; + .await + .expect_err("payload with neither c nor sv at root must be rejected"); - assert!( - neither.is_err(), - "payload with neither c nor sv at root must be rejected" - ); + assert_db_error(&err, "P0001", None); Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs new file mode 100644 index 000000000..0ac40b22f --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -0,0 +1,12 @@ +//! Umbrella integration-test binary for the encrypted-domain type family. +//! +//! Cargo's default discovery picks this file up as a test binary; the +//! module tree under `encrypted_domain/` is pulled in via the `#[path]` +//! attributes below. Legacy tests under `tests/sqlx/tests/*.rs` continue +//! to compile as their own separate binaries. + +#[path = "encrypted_domain/family/mod.rs"] +mod family; + +#[path = "encrypted_domain/scalars/mod.rs"] +mod scalars; diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs new file mode 100644 index 000000000..373472287 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -0,0 +1,252 @@ +//! Global guard for the encrypted-domain inline-critical SQL surface. +//! +//! `tasks/pin_search_path.sql` runs after every build and pins a fixed +//! `search_path` on every `eql_v2` function — except the inline-critical +//! ones, which must stay unpinned so the planner can inline them and the +//! documented functional indexes (`eql_v2.eq_term(col)`, +//! `eql_v2.ord_term(col)`, …) engage. +//! +//! The encrypted-domain family is skipped by a structural rule anchored +//! on the *identity predicate*: a `LANGUAGE sql`, `IMMUTABLE` function +//! taking at least one argument typed as a jsonb-backed DOMAIN in +//! `public` named `eql_v2_*`. The identity predicate is +//! proconfig-independent — it describes what a function intrinsically +//! IS, not whether it has been pinned. +//! +//! This test is the global net for that rule. It uses the identity +//! predicate VERBATIM and appends one offender filter: +//! `proconfig IS NOT NULL` — a function matching the family shape that +//! nonetheless carries a pinned `search_path`. It asserts that offender +//! set is empty. Because the test and the pin-loop skip clause share the +//! identity predicate exactly (the guard only adds the offender filter), +//! they cannot drift apart on identity. +//! +//! A non-empty result means `pin_search_path.sql` pinned an +//! inline-critical encrypted-domain function — index engagement is +//! silently broken for that type. This is not int4-specific: a missed +//! skip for ANY encrypted-domain type — present or future — fails here, +//! so a new type's author does not have to remember to add a per-type +//! inlinability assertion. + +use anyhow::Result; +use sqlx::PgPool; + +#[sqlx::test] +async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> Result<()> { + // The identity predicate is shared verbatim with the structural skip + // clause in tasks/pin_search_path.sql: LANGUAGE sql, IMMUTABLE, and + // taking at least one argument typed as a `public.eql_v2_*` domain + // over jsonb. It is proconfig-independent. The ONLY addition here is + // the offender filter `p.proconfig IS NOT NULL` — a function that + // matches the identity predicate but DID get pinned. That set must be + // empty. + let offenders: Vec<(String, String)> = sqlx::query_as( + r#" + SELECT p.oid::regprocedure::text AS signature, + array_to_string(p.proconfig, ', ') AS proconfig + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + JOIN pg_catalog.pg_language l ON l.oid = p.prolang + WHERE n.nspname = 'eql_v2' + AND l.lanname = 'sql' + AND p.provolatile = 'i' + AND p.proconfig IS NOT NULL + AND EXISTS ( + SELECT 1 + FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) + JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + WHERE dt.typtype = 'd' + AND dn.nspname = 'public' + AND dt.typname LIKE 'eql_v2\_%' + AND bt.typname = 'jsonb' + ) + ORDER BY signature + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + offenders.is_empty(), + "pin_search_path.sql pinned {} inline-critical encrypted-domain \ + SQL function(s) — index engagement is silently broken. \ + Offenders (signature → proconfig):\n{}", + offenders.len(), + offenders + .iter() + .map(|(sig, cfg)| format!(" {sig} → {cfg}")) + .collect::>() + .join("\n"), + ); + Ok(()) +} + +#[sqlx::test] +async fn every_inline_critical_eligible_domain_has_inline_critical_functions( + pool: PgPool, +) -> Result<()> { + // Stronger than a bare `count > 0`: if a future change accidentally + // narrows the structural predicate (e.g. hard-codes `eql_v2_int4_%`), + // a `count > 0` assertion would still pass while int8/bool/date + // domains silently lose inline-critical coverage. Instead, assert + // that EVERY inline-critical-eligible domain (any `public.eql_v2_*` + // domain over jsonb that carries a capability suffix — `_eq`, `_ord`, + // `_ord_ore`) appears as an argument type of at least one + // inline-critical function. + // + // Storage-only variants (the bare `eql_v2_` domain, with no + // capability suffix) intentionally have NO inline-critical surface + // and are excluded from the eligibility set. + let unbound: Vec = sqlx::query_scalar( + r#" + SELECT dt.typname + FROM pg_catalog.pg_type dt + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + WHERE dt.typtype = 'd' + AND dn.nspname = 'public' + AND bt.typname = 'jsonb' + AND dt.typname LIKE 'eql_v2\_%' + AND ( + dt.typname LIKE '%\_eq' + OR dt.typname LIKE '%\_ord' + OR dt.typname LIKE '%\_ord\_ore' + ) + AND NOT EXISTS ( + SELECT 1 + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + JOIN pg_catalog.pg_language l ON l.oid = p.prolang + WHERE n.nspname = 'eql_v2' + AND l.lanname = 'sql' + AND p.provolatile = 'i' + AND dt.oid = ANY(p.proargtypes::oid[]) + ) + ORDER BY dt.typname + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + unbound.is_empty(), + "the following inline-critical-eligible domains have NO \ + inline-critical function bound — index engagement is broken \ + for them: {unbound:?}" + ); + Ok(()) +} + +/// Encrypted-domain blockers must be `LANGUAGE plpgsql` and **never** +/// `STRICT`. A LANGUAGE sql blocker is inlinable (the planner can elide +/// it when the result is provably unused); a STRICT blocker returns NULL +/// on a NULL argument, silently bypassing the RAISE. Either footgun +/// re-enables an operator the storage variant exists to block. +/// +/// This is a structural guard that does NOT depend on `eql_v2.lints()` — +/// a regression to the lint catalog itself cannot hide a regression to +/// the blocker surface from this test. +#[sqlx::test] +async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> Result<()> { + let offenders: Vec<(String, String, bool)> = sqlx::query_as( + r#" + SELECT p.oid::regprocedure::text AS signature, + l.lanname, + p.proisstrict + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + JOIN pg_catalog.pg_language l ON l.oid = p.prolang + WHERE n.nspname = 'eql_v2' + AND (p.prosrc LIKE '%encrypted_domain_unsupported_bool%' + OR p.prosrc LIKE '%is not supported for%') + AND EXISTS ( + SELECT 1 + FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) + JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + WHERE dt.typtype = 'd' + AND dn.nspname = 'public' + AND dt.typname LIKE 'eql_v2\_%' + AND bt.typname = 'jsonb' + ) + AND (l.lanname <> 'plpgsql' OR p.proisstrict) + ORDER BY signature + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + offenders.is_empty(), + "encrypted-domain blockers must be LANGUAGE plpgsql and non-STRICT. \ + Offenders (signature, language, isstrict): {offenders:#?}" + ); + Ok(()) +} + +/// No `eql_v2_*` domain may be derived from another `eql_v2_*` domain — +/// operators resolve against the ultimate base type, so a derived domain +/// inherits jsonb's operator surface and not the base domain's blockers. +/// All family domains must be defined directly over jsonb. +#[sqlx::test] +async fn no_eql_v2_domain_is_derived_from_another_eql_v2_domain(pool: PgPool) -> Result<()> { + let offenders: Vec<(String, String)> = sqlx::query_as( + r#" + SELECT format('%I.%I', dn.nspname, dt.typname) AS derived, + format('%I.%I', bn.nspname, bt.typname) AS base + FROM pg_catalog.pg_type dt + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace + WHERE dt.typtype = 'd' + AND dn.nspname = 'public' + AND dt.typname LIKE 'eql_v2\_%' + AND bt.typtype = 'd' + AND bt.typname LIKE 'eql_v2\_%' + ORDER BY derived + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + offenders.is_empty(), + "eql_v2_* domains must be defined directly over jsonb, not derived \ + from another eql_v2_* domain. Offenders (derived, base): {offenders:#?}" + ); + Ok(()) +} + +/// No operator class may be declared `FOR TYPE` on an `eql_v2_*` domain. +/// Opclasses on domains bypass the operator-resolution that storage +/// blockers depend on. The recommended index pattern is a functional +/// index on the extractor (e.g. `eql_v2.eq_term(col)`). +#[sqlx::test] +async fn no_opclass_targets_eql_v2_domain(pool: PgPool) -> Result<()> { + let offenders: Vec<(String, String)> = sqlx::query_as( + r#" + SELECT format('%I.%I', cn.nspname, oc.opcname) AS opclass, + format('%I.%I', tn.nspname, t.typname) AS for_type + FROM pg_catalog.pg_opclass oc + JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype + JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace + JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace + WHERE t.typtype = 'd' + AND tn.nspname = 'public' + AND t.typname LIKE 'eql_v2\_%' + ORDER BY opclass + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + offenders.is_empty(), + "no operator class may target an eql_v2_* domain — use a functional \ + index on the extractor instead. Offenders (opclass, for_type): {offenders:#?}" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs new file mode 100644 index 000000000..8dc2e0494 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -0,0 +1,75 @@ +//! Structural guard for the blocked native-jsonb operator enumeration. +//! +//! The storage-only domains (`eql_v2_int4`, future scalars) promise that +//! *every* native jsonb operator is blocked, so an encrypted column can never +//! fall through to plaintext-jsonb semantics. That promise rests on three +//! hand-maintained lists in `tasks/codegen/operator_surface.py` +//! (`SYMMETRIC_OPERATORS`, `PATH_OPERATORS`, `BLOCKER_ONLY_OPERATORS`), whose +//! union is `KNOWN_JSONB_OPERATORS`. +//! +//! Those lists are an *enumeration*, not a structural guarantee: a future PG +//! version could add a jsonb operator that nobody adds here, and it would +//! silently route to native jsonb behaviour. This test closes that gap by +//! asking the live catalog which operators actually touch `jsonb` and failing +//! if any symbol is absent from the known union. +//! +//! Source of truth: `tasks/codegen/operator_surface.py::KNOWN_JSONB_OPERATORS` +//! (asserted complete by `tasks/codegen/test_operator_surface.py`). The set +//! below is hardcoded — the lowest-friction bridge from a Python constant to a +//! Rust test — and must be kept in sync with that module. If you add an +//! operator there, add it here; the Python test pins the union so the two can +//! only drift in this file. + +use anyhow::Result; +use sqlx::PgPool; + +/// Mirror of `KNOWN_JSONB_OPERATORS` in +/// `tasks/codegen/operator_surface.py`. Keep in sync with that module. +const KNOWN_JSONB_OPERATORS: &[&str] = &[ + // symmetric (supported wrappers) + "=", "<>", "<", "<=", ">", ">=", "@>", "<@", // + // path + "->", "->>", // + // blocker-only native jsonb fallbacks + "?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||", +]; + +#[sqlx::test] +async fn every_native_jsonb_operator_is_known_to_the_generator(pool: PgPool) -> Result<()> { + // Distinct operator symbols whose left OR right argument is `jsonb`. This + // is the full surface a value typed as a jsonb-backed domain can reach via + // operator resolution against the ultimate base type. + let native: Vec = sqlx::query_scalar( + r#" + SELECT DISTINCT o.oprname + FROM pg_catalog.pg_operator o + WHERE o.oprleft = 'jsonb'::regtype + OR o.oprright = 'jsonb'::regtype + ORDER BY 1 + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + !native.is_empty(), + "expected pg_operator to expose jsonb operators; query returned none" + ); + + let missing: Vec<&String> = native + .iter() + .filter(|sym| !KNOWN_JSONB_OPERATORS.contains(&sym.as_str())) + .collect(); + + assert!( + missing.is_empty(), + "PostgreSQL exposes jsonb operator(s) not enumerated in \ + tasks/codegen/operator_surface.py (KNOWN_JSONB_OPERATORS): {missing:#?}. \ + A storage-only encrypted domain would route these to native \ + plaintext-jsonb semantics instead of an EQL blocker. Add each symbol \ + to the appropriate list in operator_surface.py (and to the mirror in \ + this test) and regenerate the SQL surface." + ); + + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/family/mod.rs b/tests/sqlx/tests/encrypted_domain/family/mod.rs new file mode 100644 index 000000000..6622e0f8c --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/family/mod.rs @@ -0,0 +1,7 @@ +//! Family-level tests: invariants that apply across every scalar type in +//! the encrypted-domain family (not int4-specific). + +pub mod inlinability; +pub mod jsonb_operator_surface; +pub mod mutations; +pub mod support; diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs new file mode 100644 index 000000000..2745e1aea --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -0,0 +1,428 @@ +//! Negative controls (mutation tests) for the scalar-domain matrix. +//! +//! A green matrix proves the SUT behaves correctly *today*, but it cannot +//! prove the matrix arms would catch a regression — an arm could be +//! vacuous and still pass. Each test here applies one surgical mutation to +//! the installed `eql_v2` schema and asserts that the property a specific +//! matrix arm guards now flips. If a mutation does NOT flip the property, +//! that arm has no teeth. +//! +//! Mechanism: `CREATE OR REPLACE FUNCTION` keeps the function oid, so the +//! operators / aggregates that reference it keep resolving to the (now +//! mutated) body — that's what lets us re-route a comparison or disable a +//! blocker without touching operator definitions. Each `#[sqlx::test]` +//! gets its own fresh database (EQL pre-installed via the auto-applied +//! `migrations/001_install_eql.sql`), so the mutation is discarded when the +//! per-test DB is dropped — no cleanup, no rebuild. +//! +//! Pattern per test: assert the baseline property holds, mutate, assert it +//! now breaks. The baseline assertion is load-bearing — it proves the +//! probe is non-vacuous before the mutation. + +use anyhow::{ensure, Result}; +use eql_tests::{ + assert_null, assert_raises, blocker_msg, fetch_fixture_payload, ScalarType, PLACEHOLDER_PAYLOAD, +}; +use sqlx::PgPool; + +/// Apply one DDL mutation to the installed schema. +async fn mutate(pool: &PgPool, ddl: &str) -> Result<()> { + sqlx::query(ddl).execute(pool).await?; + Ok(()) +} + +// 1. Storage `=` blocker — disabling it lets the storage variant compare +// equal. Proves the `blocker` arm (and `typed_column_blocker`) would +// catch a blocker that silently stopped raising. +#[sqlx::test] +async fn disabling_storage_eq_blocker_flips_blocker_arm(pool: PgPool) -> Result<()> { + let sql = "SELECT $1::jsonb::eql_v2_int4 = $2::jsonb::eql_v2_int4"; + + // Baseline: the storage `=` blocker raises. + assert_raises( + &pool, + sql, + &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], + &blocker_msg("eql_v2_int4", "="), + ) + .await?; + + // Mutation: replace the plpgsql blocker with an inlinable SQL body that + // returns true. CREATE OR REPLACE keeps the oid, so the `=` operator on + // (eql_v2_int4, eql_v2_int4) now resolves to this no-raise body. + mutate( + &pool, + "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4, b eql_v2_int4) \ + RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", + ) + .await?; + + // Post: the operator returns true instead of raising — arm has teeth. + let result: Option = sqlx::query_scalar(sql) + .bind(PLACEHOLDER_PAYLOAD) + .bind(PLACEHOLDER_PAYLOAD) + .fetch_one(&pool) + .await?; + ensure!( + result == Some(true), + "after disabling the storage `=` blocker, `=` must return true (got {result:?})" + ); + Ok(()) +} + +// 2. Planner-metadata RESTRICT selectivity — unsetting it makes the +// `planner_metadata` arm's `oprrest <> 0` check report false. (COMMUTATOR +// cannot be unset via ALTER, so RESTRICT is the pragmatic teeth probe for +// this arm.) +#[sqlx::test] +async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<()> { + async fn restrict_present(pool: &PgPool) -> Result { + let present: bool = sqlx::query_scalar( + r#" + SELECT o.oprrest::oid <> 0 + FROM pg_catalog.pg_operator o + JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft + JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright + WHERE o.oprname = '=' + AND lt.typname = 'eql_v2_int4_ord' + AND rt.typname = 'eql_v2_int4_ord' + "#, + ) + .fetch_one(pool) + .await?; + Ok(present) + } + + // Baseline: `=` on (ord, ord) declares a RESTRICT estimator. + ensure!( + restrict_present(&pool).await?, + "baseline: `=` on eql_v2_int4_ord must declare a RESTRICT estimator" + ); + + // Mutation: unset RESTRICT. DROP OPERATOR would hit COMMUTATOR/NEGATOR + // dependency links; ALTER ... SET (RESTRICT = NONE) avoids that. + mutate( + &pool, + "ALTER OPERATOR = (eql_v2_int4_ord, eql_v2_int4_ord) SET (RESTRICT = NONE)", + ) + .await?; + + // Post: the planner-metadata check now reports false — arm has teeth. + ensure!( + !restrict_present(&pool).await?, + "after SET (RESTRICT = NONE), the planner-metadata check must report false" + ); + Ok(()) +} + +// 3. `_ord` equality must route through `ord_term` (`ob`), never HMAC. +// Rerouting it through `hmac_256` (`hm`) over hm-stripped rows makes `=` +// stop matching. Proves the `ord_routes_through_ob` arm has teeth. +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Result<()> { + // Strip `hm` per-row inline; the `_ord` CHECK only requires `ob`, so the + // cast still succeeds. The pivot is likewise hm-stripped. + let pivot: i32 = 42; + let pivot_payload: String = sqlx::query_scalar(&format!( + "SELECT (payload - 'hm')::text FROM fixtures.eql_v2_int4 WHERE plaintext = {pivot}", + )) + .fetch_one(&pool) + .await?; + + let count_sql = "SELECT count(*) FROM fixtures.eql_v2_int4 \ + WHERE (payload - 'hm')::eql_v2_int4_ord = $1::jsonb::eql_v2_int4_ord"; + + // Baseline: with `hm` stripped, `=` still matches the pivot via `ord_term` + // (the `ob` term survives) — exactly one row. + let baseline: i64 = sqlx::query_scalar(count_sql) + .bind(&pivot_payload) + .fetch_one(&pool) + .await?; + ensure!( + baseline == 1, + "baseline: `_ord` `=` must match exactly the pivot via ob with hm stripped (got {baseline})" + ); + + // Mutation: reroute `_ord` `=` through HMAC. `eql_v2.hmac_256(jsonb)` is + // STRICT and the `hm` key is absent, so it yields NULL and `=` matches + // nothing. + mutate( + &pool, + "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4_ord, b eql_v2_int4_ord) \ + RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ + AS $$ SELECT eql_v2.hmac_256(a::jsonb) = eql_v2.hmac_256(b::jsonb) $$", + ) + .await?; + + // Post: routing through the absent `hm` matches zero rows — arm has teeth. + let mutated: i64 = sqlx::query_scalar(count_sql) + .bind(&pivot_payload) + .fetch_one(&pool) + .await?; + ensure!( + mutated == 0, + "after rerouting `_ord` `=` through hm, it must match zero hm-stripped rows (got {mutated})" + ); + Ok(()) +} + +// 4. Supported `=` on `_eq` is STRICT — it must propagate NULL. Dropping +// STRICT (and returning non-NULL) makes `x = NULL` return a value. Proves +// the `supported_null` arm has teeth. +#[sqlx::test] +async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result<()> { + let sql = "SELECT $1::jsonb::eql_v2_int4_eq = $2::jsonb::eql_v2_int4_eq"; + + // Baseline: STRICT `=` propagates NULL when one side is NULL. + assert_null(&pool, sql, &[Some(PLACEHOLDER_PAYLOAD), None]).await?; + + // Mutation: drop STRICT and return a constant non-NULL. CREATE OR REPLACE + // keeps the oid; the operator now ignores NULL semantics. + mutate( + &pool, + "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b eql_v2_int4_eq) \ + RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", + ) + .await?; + + // Post: `x = NULL` returns true instead of NULL — arm has teeth. + let result: Option = sqlx::query_scalar(sql) + .bind(PLACEHOLDER_PAYLOAD) + .bind(Option::<&str>::None) + .fetch_one(&pool) + .await?; + ensure!( + result == Some(true), + "after dropping STRICT on `_eq` `=`, `x = NULL` must return true, not NULL (got {result:?})" + ); + Ok(()) +} + +// 5. Ord `<` correctness routes through `eql_v2.lt`. Turning `lt` into a +// blocker makes `<` raise — proving the ord `<` correctness arm has teeth. +// Crucially, ORDER BY routes through `ord_term`, NOT `<`, so it must stay +// green here. This is the #5-vs-#7 split: #5 attacks `<`, #7 attacks the +// sort key. Blocking `<` alone must not disturb ORDER BY. +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { + let lt_sql = "SELECT $1::jsonb::eql_v2_int4_ord < $2::jsonb::eql_v2_int4_ord"; + let order_by_sql = "SELECT plaintext FROM fixtures.eql_v2_int4 \ + ORDER BY eql_v2.ord_term(payload::eql_v2_int4_ord) ASC"; + + let mut ascending: Vec = ::FIXTURE_VALUES.to_vec(); + ascending.sort(); + + // Baseline: `<` works (no raise) and ORDER BY is plaintext-sorted. + let lt_baseline: Option = sqlx::query_scalar(lt_sql) + .bind(PLACEHOLDER_PAYLOAD) + .bind(PLACEHOLDER_PAYLOAD) + .fetch_one(&pool) + .await?; + ensure!( + lt_baseline.is_some(), + "baseline: `_ord` `<` must return a boolean (got {lt_baseline:?})" + ); + let order_baseline: Vec = sqlx::query_scalar(order_by_sql).fetch_all(&pool).await?; + ensure!( + order_baseline == ascending, + "baseline: ORDER BY ord_term ASC must be plaintext-sorted" + ); + + // Mutation: turn `eql_v2.lt(_ord, _ord)` into a blocker. Must be + // LANGUAGE plpgsql and non-STRICT so the RAISE always fires. + mutate( + &pool, + "CREATE OR REPLACE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b eql_v2_int4_ord) \ + RETURNS boolean LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE \ + AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<'); END; $$", + ) + .await?; + + // Post: `<` now raises — the ord `<` arm has teeth. + assert_raises( + &pool, + lt_sql, + &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], + &blocker_msg("eql_v2_int4_ord", "<"), + ) + .await?; + + // Post: ORDER BY is UNCHANGED — it routes through ord_term, not `<`. + // This is the whole point of separating #5 from #7. + let order_after: Vec = sqlx::query_scalar(order_by_sql).fetch_all(&pool).await?; + ensure!( + order_after == ascending, + "blocking `<` must NOT disturb ORDER BY (it routes through ord_term); got {order_after:?}" + ); + Ok(()) +} + +// 6. `_eq` equality must route through `eq_term` (`hm`), never ORE — the +// mirror of #3 for the eq path. Rerouting it through +// `ore_block_u64_8_256` (`ob`) over ob-stripped rows breaks equality. +// +// Two notes on why this is shaped differently from the plan's literal +// "returns 0 where forward expects 1": +// - The fixture payloads carry BOTH `hm` and `ob`, so rerouting `_eq` +// `=` through ORE on the RAW fixture would still match (both terms are +// injective per plaintext) — vacuous. Stripping `ob` forces the +// rerouted operator onto an absent term, exactly as #3 strips `hm`. +// - `ore_block_u64_8_256(jsonb)` RAISES on an absent `ob` ("Expected an +// ore index (ob)"), whereas `hmac_256(jsonb)` returns NULL on an absent +// `hm`. So the eq path breaks via a raise, not a 0-count. Either way the +// correct hm-routed equality matches and the rerouted one does not. +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { + // Strip `ob` per-row inline; the `_eq` CHECK only requires `hm`, so the + // cast still succeeds. The pivot is likewise ob-stripped. + let pivot: i32 = 42; + let pivot_payload: String = sqlx::query_scalar(&format!( + "SELECT (payload - 'ob')::text FROM fixtures.eql_v2_int4 WHERE plaintext = {pivot}", + )) + .fetch_one(&pool) + .await?; + + let count_sql = "SELECT count(*) FROM fixtures.eql_v2_int4 \ + WHERE (payload - 'ob')::eql_v2_int4_eq = $1::jsonb::eql_v2_int4_eq"; + + // Baseline: with `ob` stripped, `=` still matches the pivot via `eq_term` + // (the `hm` term survives) — exactly one row. + let baseline: i64 = sqlx::query_scalar(count_sql) + .bind(&pivot_payload) + .fetch_one(&pool) + .await?; + ensure!( + baseline == 1, + "baseline: `_eq` `=` must match exactly the pivot via hm with ob stripped (got {baseline})" + ); + + // Mutation: reroute `_eq` `=` through ORE. The `ob` key is absent, so + // `eql_v2.ore_block_u64_8_256(jsonb)` raises rather than matching. + mutate( + &pool, + "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b eql_v2_int4_eq) \ + RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ + AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) = eql_v2.ore_block_u64_8_256(b::jsonb) $$", + ) + .await?; + + // Post: routing through the absent `ob` raises ("Expected an ore index") + // instead of matching the pivot — equality is broken, arm has teeth. + let err = sqlx::query_scalar::<_, i64>(count_sql) + .bind(&pivot_payload) + .fetch_one(&pool) + .await + .expect_err("rerouting `_eq` `=` through the absent ob term must fail") + .to_string(); + ensure!( + err.contains("Expected an ore index"), + "rerouted `_eq` `=` must fail on the absent ob term; got: {err}" + ); + Ok(()) +} + +// 7. ORDER BY routes through `ord_term` — the sort key, NOT `<` (see #5). +// Collapsing `ord_term` to a constant makes ORDER BY DESC no longer +// plaintext-sorted. Proves the ORDER BY arm has teeth independently of the +// `<` arm. +// +// A constant key collapses ASC and DESC to the same heap order. The +// fixture inserts rows in ascending plaintext (id 1..n), so a seq scan +// returns ascending order — which can never equal the descending +// expectation. Asserting against DESC therefore detects the collapse +// regardless of heap order (the ascending-fixture caveat from the plan). +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { + let order_by_desc = "SELECT plaintext FROM fixtures.eql_v2_int4 \ + ORDER BY eql_v2.ord_term(payload::eql_v2_int4_ord) DESC"; + + let mut descending: Vec = ::FIXTURE_VALUES.to_vec(); + descending.sort(); + descending.reverse(); + + // Baseline: ORDER BY ord_term DESC is plaintext-descending. + let baseline: Vec = sqlx::query_scalar(order_by_desc).fetch_all(&pool).await?; + ensure!( + baseline == descending, + "baseline: ORDER BY ord_term DESC must be plaintext-descending" + ); + + // Mutation: collapse ord_term to a constant ORE block. Use a REAL fixture + // payload as the source (guaranteed to construct a valid ore_block) and a + // unique dollar-quote tag so the embedded jsonb literal can't break the + // function body. + let const_payload = fetch_fixture_payload::(&pool, 0).await?; + let ddl = format!( + "CREATE OR REPLACE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord) \ + RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ + AS $mutbody$ SELECT eql_v2.ore_block_u64_8_256('{esc}'::jsonb) $mutbody$", + esc = const_payload.replace('\'', "''"), + ); + mutate(&pool, &ddl).await?; + + // Post: every row now sorts equal, so DESC collapses to heap (ascending) + // order and can no longer equal the descending expectation — arm has teeth. + let mutated: Vec = sqlx::query_scalar(order_by_desc).fetch_all(&pool).await?; + ensure!( + mutated != descending, + "after collapsing ord_term to a constant, ORDER BY DESC must no longer be \ + plaintext-descending (got {mutated:?})" + ); + Ok(()) +} + +// 8. ORDER BY NULLS placement depends on `ord_term` being STRICT: a NULL domain +// value yields a NULL sort key, so `NULLS LAST` parks those rows at the tail. +// Dropping STRICT (coalescing a NULL input to a real payload) gives NULL-valued +// rows a concrete sort key, so they stop clustering at the end. Proves the +// ORDER BY NULLS arm has teeth on the NULL-placement dimension — one #5 (block +// `lt`) and #7 (collapse `ord_term`) do not exercise, since both run on the +// NULL-free fixture. A UNION ALL subquery supplies the NULL rows inline, so no +// session-local temp table is needed and the global `mutate()` stays valid. +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Result<()> { + const NULL_ROWS: usize = 3; + let order_by = format!( + "SELECT plaintext FROM ( \ + SELECT plaintext, payload::eql_v2_int4_ord AS value FROM fixtures.eql_v2_int4 \ + UNION ALL \ + SELECT NULL::int4, NULL::eql_v2_int4_ord FROM generate_series(1, {NULL_ROWS}) \ + ) s \ + ORDER BY eql_v2.ord_term(value) ASC NULLS LAST" + ); + + let tail_all_none = + |rows: &[Option]| rows.iter().rev().take(NULL_ROWS).all(|x| x.is_none()); + + // Baseline: STRICT ord_term -> NULL value -> NULL sort key -> NULLS LAST + // parks the NULL-valued rows at the tail. + let baseline: Vec> = sqlx::query_scalar(&order_by).fetch_all(&pool).await?; + ensure!( + tail_all_none(&baseline), + "baseline: the {NULL_ROWS} NULL-valued rows must cluster at the tail under \ + NULLS LAST (got {baseline:?})" + ); + + // Mutation: drop STRICT and coalesce a NULL input to a REAL fixture payload, + // so NULL-valued rows gain a concrete (non-NULL) sort key; non-NULL rows are + // unchanged. Unique dollar-quote tag guards the embedded jsonb literal. + let const_payload = fetch_fixture_payload::(&pool, 0).await?; + let ddl = format!( + "CREATE OR REPLACE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord) \ + RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ + AS $mutbody$ SELECT eql_v2.ore_block_u64_8_256(\ + coalesce(a, '{esc}'::jsonb::eql_v2_int4_ord)::jsonb) $mutbody$", + esc = const_payload.replace('\'', "''"), + ); + mutate(&pool, &ddl).await?; + + // Post: NULL-valued rows now carry a concrete key, so they no longer park at + // the tail — the NULLS arm catches the lost STRICT contract. + let mutated: Vec> = sqlx::query_scalar(&order_by).fetch_all(&pool).await?; + ensure!( + !tail_all_none(&mutated), + "after dropping STRICT on ord_term, the NULL-valued rows must no longer \ + cluster at the tail (got {mutated:?})" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs new file mode 100644 index 000000000..b062b9ce7 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -0,0 +1,329 @@ +//! Self-checks for the type-generic matrix substrate +//! (`tests/sqlx/src/scalar_domains.rs`). Each test pins one piece of the +//! `ScalarType` / `Variant` / assertion-helper API that the matrix +//! depends on. + +use anyhow::Result; +use eql_tests::{ + assert_null, assert_raises, assert_scalar_plaintexts, blocker_msg, fetch_fixture_payload, + sql_string_literal, ScalarDomainSpec, ScalarType, Variant, PLACEHOLDER_PAYLOAD, +}; +use sqlx::PgPool; + +#[test] +fn variant_derives_consistent_sql_domain_and_capabilities() { + let storage = ScalarDomainSpec::new::(Variant::Storage); + assert_eq!(storage.sql_domain, "eql_v2_int4"); + assert!(!storage.supports_eq()); + assert!(!storage.supports_ord()); + assert_eq!(storage.extractor_fn(), None); + assert_eq!(Variant::Storage.required_term(), None); + + let eq = ScalarDomainSpec::new::(Variant::Eq); + assert_eq!(eq.sql_domain, "eql_v2_int4_eq"); + assert!(eq.supports_eq()); + assert!(!eq.supports_ord()); + assert_eq!(eq.extractor_fn(), Some("eql_v2.eq_term")); + assert_eq!(Variant::Eq.required_term(), Some("hm")); + + let ord = ScalarDomainSpec::new::(Variant::Ord); + assert_eq!(ord.sql_domain, "eql_v2_int4_ord"); + assert!(ord.supports_ord()); + assert_eq!(ord.extractor_fn(), Some("eql_v2.ord_term")); + assert_eq!(Variant::Ord.required_term(), Some("ob")); + + let ord_ore = ScalarDomainSpec::new::(Variant::OrdOre); + assert_eq!(ord_ore.sql_domain, "eql_v2_int4_ord_ore"); + assert!(ord_ore.supports_ord()); + assert_eq!(ord_ore.extractor_fn(), Some("eql_v2.ord_term")); +} + +#[test] +fn expected_forward_default_is_numeric_ground_truth() { + // Pinned against the full 17-row fixture (extremes + zero + the + // original 14). The output is sorted-ascending by `expected_forward`, + // so a regression in the default impl's filter or sort shows up + // here. + assert_eq!(::expected_forward("=", 10), vec![10]); + assert_eq!( + ::expected_forward("<", 10), + vec![i32::MIN, -100, -1, 0, 1, 2, 5] + ); + assert_eq!( + ::expected_forward("<=", 10), + vec![i32::MIN, -100, -1, 0, 1, 2, 5, 10] + ); + assert_eq!( + ::expected_forward(">", 10), + vec![17, 25, 42, 50, 100, 250, 1000, 9999, i32::MAX] + ); + assert_eq!( + ::expected_forward(">=", 10), + vec![10, 17, 25, 42, 50, 100, 250, 1000, 9999, i32::MAX] + ); + assert_eq!( + ::expected_forward("<>", 42), + vec![ + i32::MIN, + -100, + -1, + 0, + 1, + 2, + 5, + 10, + 17, + 25, + 50, + 100, + 250, + 1000, + 9999, + i32::MAX + ] + ); +} + +#[test] +fn sql_string_literal_escapes_single_quotes() { + assert_eq!(sql_string_literal("abc'def"), "'abc''def'"); +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +async fn fetch_fixture_payload_returns_keyed_row(pool: PgPool) -> Result<()> { + // Parse the payload as JSON rather than substring-matching — whitespace + // and key ordering in the serialised form are not contract. + let payload = fetch_fixture_payload::(&pool, 42).await?; + let value: serde_json::Value = serde_json::from_str(&payload)?; + assert_eq!(value["v"], serde_json::json!(2), "payload must carry v=2"); + assert!(value.get("c").is_some(), "payload must carry a c field"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +async fn assert_scalar_plaintexts_reports_sql_context(pool: PgPool) -> Result<()> { + let lit = sql_string_literal(&fetch_fixture_payload::(&pool, 42).await?); + let predicate = format!("payload::eql_v2_int4_ord_ore = {lit}::jsonb::eql_v2_int4_ord_ore"); + assert_scalar_plaintexts::(&pool, "eql_v2_int4_ord_ore", "=", &predicate, &[42]).await?; + Ok(()) +} + +#[sqlx::test] +async fn placeholder_payload_satisfies_every_variant_check(pool: PgPool) -> Result<()> { + // The whole point of PLACEHOLDER_PAYLOAD: one sentinel that casts + // successfully to every domain in the family. If a variant CHECK + // tightens, this test fails and PLACEHOLDER_PAYLOAD needs updating. + // + // Iterates `Variant::ALL` against `::PG_TYPE` + // rather than hardcoding domain names — when `int8` (or any future + // scalar) lands, this test picks it up automatically by extending + // the type list below. + for variant in Variant::ALL { + let spec = ScalarDomainSpec::new::(*variant); + let sql = format!("SELECT $1::jsonb::{}", spec.sql_domain); + sqlx::query(&sql) + .bind(PLACEHOLDER_PAYLOAD) + .fetch_one(&pool) + .await + .map_err(|e| { + anyhow::anyhow!("PLACEHOLDER_PAYLOAD must cast to {}: {e}", spec.sql_domain) + })?; + } + Ok(()) +} + +#[sqlx::test] +async fn assert_raises_two_bind_blocker(pool: PgPool) -> Result<()> { + let msg = blocker_msg("eql_v2_int4", "="); + assert_raises( + &pool, + "SELECT $1::jsonb::eql_v2_int4 = $2::jsonb::eql_v2_int4", + &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], + &msg, + ) + .await +} + +#[sqlx::test] +async fn assert_raises_one_bind_path_blocker(pool: PgPool) -> Result<()> { + let msg = blocker_msg("eql_v2_int4", "->"); + assert_raises( + &pool, + "SELECT $1::jsonb::eql_v2_int4 -> 'field'::text", + &[Some(PLACEHOLDER_PAYLOAD)], + &msg, + ) + .await +} + +#[sqlx::test] +async fn assert_raises_native_operator_absent(pool: PgPool) -> Result<()> { + // ~~ (LIKE) isn't declared on int4 — error message is PG's native + // "operator does not exist", not an EQL blocker message. + assert_raises( + &pool, + "SELECT $1::jsonb::eql_v2_int4 ~~ $2::jsonb::eql_v2_int4", + &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], + "operator does not exist", + ) + .await +} + +#[sqlx::test] +async fn omitted_native_jsonb_operators_raise_eql_blockers(pool: PgPool) -> Result<()> { + let cases: &[(&str, &[Option<&str>], &str)] = &[ + ( + "SELECT $1::jsonb::eql_v2_int4 ? 'c'::text", + &[Some(PLACEHOLDER_PAYLOAD)], + "?", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 ?| ARRAY['c']", + &[Some(PLACEHOLDER_PAYLOAD)], + "?|", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 ?& ARRAY['c']", + &[Some(PLACEHOLDER_PAYLOAD)], + "?&", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 #> ARRAY['i']", + &[Some(PLACEHOLDER_PAYLOAD)], + "#>", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 #>> ARRAY['i', 'c']", + &[Some(PLACEHOLDER_PAYLOAD)], + "#>>", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 @? '$.c'::jsonpath", + &[Some(PLACEHOLDER_PAYLOAD)], + "@?", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 @@ '$.c == \"placeholder\"'::jsonpath", + &[Some(PLACEHOLDER_PAYLOAD)], + "@@", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 - 'c'::text", + &[Some(PLACEHOLDER_PAYLOAD)], + "-", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 - 0", + &[Some(PLACEHOLDER_PAYLOAD)], + "-", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 - ARRAY['c']", + &[Some(PLACEHOLDER_PAYLOAD)], + "-", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 #- ARRAY['i']", + &[Some(PLACEHOLDER_PAYLOAD)], + "#-", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 || $2::jsonb", + &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], + "||", + ), + ( + "SELECT $1::jsonb || $2::jsonb::eql_v2_int4", + &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], + "||", + ), + ( + "SELECT $1::jsonb::eql_v2_int4 || $2::jsonb::eql_v2_int4", + &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], + "||", + ), + ]; + + for (sql, binds, op) in cases { + assert_raises(&pool, sql, binds, &blocker_msg("eql_v2_int4", op)).await?; + } + Ok(()) +} + +#[sqlx::test] +async fn assert_raises_engages_on_all_null(pool: PgPool) -> Result<()> { + // Non-STRICT blocker proof — must raise even with NULL on both sides. + let msg = blocker_msg("eql_v2_int4", "="); + assert_raises( + &pool, + "SELECT $1::jsonb::eql_v2_int4 = $2::jsonb::eql_v2_int4", + &[None, None], + &msg, + ) + .await +} + +#[sqlx::test] +async fn assert_null_propagates_through_supported_op(pool: PgPool) -> Result<()> { + // STRICT supported op with one NULL operand yields NULL. + assert_null( + &pool, + "SELECT $1::jsonb::eql_v2_int4_eq = $2::jsonb::eql_v2_int4_eq", + &[Some(PLACEHOLDER_PAYLOAD), None], + ) + .await +} + +#[sqlx::test] +async fn neq_propagates_null_under_three_valued_logic(pool: PgPool) -> Result<()> { + // `<>` with a NULL operand must yield NULL (not true, not false). + // Three-valued logic is easy to get wrong in domain wrappers; a + // STRICT supported `<>` returns NULL on either NULL side. + for binds in [ + &[Some(PLACEHOLDER_PAYLOAD), None][..], + &[None, Some(PLACEHOLDER_PAYLOAD)][..], + &[None, None][..], + ] { + assert_null( + &pool, + "SELECT $1::jsonb::eql_v2_int4_eq <> $2::jsonb::eql_v2_int4_eq", + binds, + ) + .await?; + } + Ok(()) +} + +#[sqlx::test] +async fn no_cross_variant_equality_operator_is_declared(pool: PgPool) -> Result<()> { + // The family deliberately does NOT define operators that mix two + // different capability variants — `eql_v2_int4_eq = eql_v2_int4_ord` + // would resolve against jsonb (the ultimate base type) and silently + // bypass the per-variant blockers. If someone accidentally adds such + // an operator, this test fails. + // + // The check is structural (`pg_operator`) rather than dynamic + // ("invoke and see it raise") so a future PG version with stricter + // operator resolution doesn't mask the regression. + let cross_variant: Vec = sqlx::query_scalar( + r#" + SELECT format('%s(%s, %s)', + o.oprname, lt.typname, rt.typname) + FROM pg_catalog.pg_operator o + JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft + JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright + WHERE lt.typname LIKE 'eql_v2\_%' + AND rt.typname LIKE 'eql_v2\_%' + AND lt.typname <> rt.typname + ORDER BY 1 + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + cross_variant.is_empty(), + "no operator should mix two different eql_v2_* domain types, but found: {cross_variant:#?}" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/scalars/int4.rs b/tests/sqlx/tests/encrypted_domain/scalars/int4.rs new file mode 100644 index 000000000..6ec665d33 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/scalars/int4.rs @@ -0,0 +1,14 @@ +//! `eql_v2_int4` — the reference scalar implementation. +//! +//! Adding a new ordered numeric scalar (i64, f64, date, ...) is one +//! `impl ScalarType` in `tests/sqlx/src/scalar_domains.rs` plus an +//! `ordered_numeric_matrix!` invocation like this one. The matrix covers +//! everything generic over `T: ScalarType`. + +use eql_tests::ordered_numeric_matrix; + +ordered_numeric_matrix! { + suite = int4, + scalar = i32, + eql_type = "eql_v2_int4", +} diff --git a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs new file mode 100644 index 000000000..8abc18571 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs @@ -0,0 +1,4 @@ +//! Per-scalar tests. Each subdirectory targets one scalar type; future +//! additions (`int8`, `bool`, `date`, …) become sibling modules here. + +pub mod int4; diff --git a/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs b/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs index 3cf73225e..04233f154 100644 --- a/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs +++ b/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs @@ -8,28 +8,46 @@ use anyhow::Result; use sqlx::PgPool; -/// The 14 values from `src/fixtures/eql_v2_int4.rs`, in id order. Kept here +/// The 17 values from `src/fixtures/eql_v2_int4.rs`, in id order. Kept here /// only to assert the in-table `plaintext` oracle matches what was generated. /// If `plaintext_column_matches_the_generated_values` fails, the generator's /// `VALUES` and this constant have drifted — re-run /// `mise run fixture:generate eql_v2_int4` and update this list to match. -const EXPECTED_PLAINTEXTS: &[i32] = &[-100, -1, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999]; +const EXPECTED_PLAINTEXTS: &[i32] = &[ + i32::MIN, + -100, + -1, + 0, + 1, + 2, + 5, + 10, + 17, + 25, + 42, + 50, + 100, + 250, + 1000, + 9999, + i32::MAX, +]; #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] -async fn fixture_has_fourteen_rows(pool: PgPool) -> Result<()> { +async fn fixture_has_seventeen_rows(pool: PgPool) -> Result<()> { let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v2_int4") .fetch_one(&pool) .await?; - assert_eq!(count, 14, "eql_v2_int4 fixture should have 14 rows"); + assert_eq!(count, 17, "eql_v2_int4 fixture should have 17 rows"); Ok(()) } #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] -async fn ids_are_sequential_one_to_fourteen(pool: PgPool) -> Result<()> { +async fn ids_are_sequential_one_to_seventeen(pool: PgPool) -> Result<()> { let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.eql_v2_int4 ORDER BY id") .fetch_all(&pool) .await?; - assert_eq!(ids, (1..=14).collect::>()); + assert_eq!(ids, (1..=17).collect::>()); Ok(()) } @@ -95,22 +113,22 @@ async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { .await?; assert_eq!( ids, - vec![9], - "expected exactly one row with plaintext = 42 at id 9" + vec![11], + "expected exactly one row with plaintext = 42 at id 11" ); Ok(()) } #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] async fn hmac_equality_terms_are_distinct_for_distinct_values(pool: PgPool) -> Result<()> { - // All 14 plaintext values are distinct, so all 14 `hm` terms must be too. + // All 17 plaintext values are distinct, so all 17 `hm` terms must be too. let distinct_hm: i64 = sqlx::query_scalar("SELECT COUNT(DISTINCT payload->>'hm') FROM fixtures.eql_v2_int4") .fetch_one(&pool) .await?; assert_eq!( - distinct_hm, 14, - "14 distinct values -> 14 distinct hm terms" + distinct_hm, 17, + "17 distinct values -> 17 distinct hm terms" ); Ok(()) } diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index 1bd080c94..f9194b82c 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -12,8 +12,15 @@ //! appropriate. use anyhow::Result; +use eql_tests::Variant; use sqlx::PgPool; +/// Pg-type tokens for the encrypted-scalar-domain families currently +/// materialised. Extending the family (e.g. when `int8`/`bool`/`date` +/// land) is a one-line array extension here — every downstream +/// parameterised test picks it up automatically. +const SCALAR_PG_TYPES: &[&str] = &["int4"]; + #[derive(Debug, sqlx::FromRow)] struct LintRow { severity: String, @@ -33,16 +40,13 @@ async fn fetch_lints(pool: &PgPool) -> Result> { } #[sqlx::test] -async fn lint_function_exists_and_returns_rows(pool: PgPool) -> Result<()> { - let rows = fetch_lints(&pool).await?; - // The current state of EQL has a non-trivial number of inlinability - // violations on the operator surface. Confirm the lint produces output - // and the columns parse correctly. - assert!( - !rows.is_empty(), - "Expected lint to surface at least one inlinability violation \ - against the current EQL surface; got 0 rows" - ); +async fn lint_function_exists_and_row_schema_parses(pool: PgPool) -> Result<()> { + // Schema-only check: `eql_v2.lints()` exists and its rows decode into + // `LintRow`. Previous incarnation asserted `!rows.is_empty()` and so + // would fail on a *cleaner* build (e.g. when Phase 1+ removes the + // current noisy violations), reading like a regression for a good + // reason. The rule-specific tests below pin actual behaviour. + let _rows = fetch_lints(&pool).await?; Ok(()) } @@ -70,6 +74,10 @@ async fn lint_categories_are_well_known(pool: PgPool) -> Result<()> { "inlinability_set_clause", "inlinability_secdef", "inlinability_transitive", + "blocker_language", + "blocker_strict", + "domain_over_domain", + "domain_opclass", ]; for row in rows { assert!( @@ -82,6 +90,175 @@ async fn lint_categories_are_well_known(pool: PgPool) -> Result<()> { Ok(()) } +/// A blocker rendered in `LANGUAGE sql` instead of `plpgsql` is the +/// inverse of the extractor/wrapper inlinability rule: a blocker's job is +/// to RAISE, and `LANGUAGE sql` bodies are inlinable — which means the +/// planner can fold or elide the call when the result is provably unused +/// (a dead CASE branch, a folded predicate), silently bypassing the RAISE +/// and re-enabling the operator. See CLAUDE.md footguns. This test plants +/// a fake LANGUAGE sql blocker on `eql_v2_int4` and asserts the lint +/// surfaces it under category `blocker_language`. +#[sqlx::test] +async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { + sqlx::query( + r#" + CREATE FUNCTION eql_v2.test_bad_blocker_sql(a eql_v2_int4, b eql_v2_int4) + RETURNS boolean LANGUAGE sql IMMUTABLE + AS $$ SELECT eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '=') $$; + "#, + ) + .execute(&pool) + .await?; + + let rows = fetch_lints(&pool).await?; + let violations: Vec<&LintRow> = rows + .iter() + .filter(|r| { + r.category == "blocker_language" && r.object_name.contains("test_bad_blocker_sql") + }) + .collect(); + + assert!( + !violations.is_empty(), + "Expected `blocker_language` to flag the LANGUAGE sql fake blocker, \ + but got no matching row. All lint rows:\n{:#?}", + rows + ); + assert_eq!( + violations[0].severity, "error", + "blocker_language must be severity=error" + ); + Ok(()) +} + +/// A blocker marked `STRICT` lets PostgreSQL skip the body and return NULL +/// on a NULL argument — silently bypassing the "operator not supported" +/// RAISE. See CLAUDE.md footguns. This test plants a fake STRICT plpgsql +/// blocker on `eql_v2_int4` and asserts the lint surfaces it under +/// `blocker_strict`. +#[sqlx::test] +async fn lint_flags_strict_blocker(pool: PgPool) -> Result<()> { + sqlx::query( + r#" + CREATE FUNCTION eql_v2.test_bad_blocker_strict(a eql_v2_int4, b eql_v2_int4) + RETURNS boolean LANGUAGE plpgsql IMMUTABLE STRICT + AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$; + "#, + ) + .execute(&pool) + .await?; + + let rows = fetch_lints(&pool).await?; + let violations: Vec<&LintRow> = rows + .iter() + .filter(|r| { + r.category == "blocker_strict" && r.object_name.contains("test_bad_blocker_strict") + }) + .collect(); + + assert!( + !violations.is_empty(), + "Expected `blocker_strict` to flag the STRICT fake blocker, \ + but got no matching row. All lint rows:\n{:#?}", + rows + ); + assert_eq!( + violations[0].severity, "error", + "blocker_strict must be severity=error" + ); + Ok(()) +} + +/// Generated encrypted-domain blockers intentionally use non-inlinable +/// plpgsql functions. They should be checked by the blocker-specific lint +/// rules, not reported as normal operator inlinability failures. +#[sqlx::test] +async fn lint_does_not_report_generated_blockers_as_inlinability_errors( + pool: PgPool, +) -> Result<()> { + let rows = fetch_lints(&pool).await?; + let violations: Vec<&LintRow> = rows + .iter() + .filter(|r| { + matches!( + r.category.as_str(), + "inlinability_language" + | "inlinability_volatility" + | "inlinability_set_clause" + | "inlinability_secdef" + ) && r.object_name.contains("eql_v2_int4") + && (r.object_name.contains("operator =(") + || r.object_name.contains("operator ->(") + || r.object_name.contains("operator ?(")) + }) + .collect(); + + assert!( + violations.is_empty(), + "generated encrypted-domain blockers must not be reported by direct \ + inlinability rules; got: {violations:#?}" + ); + Ok(()) +} + +/// An `eql_v2_*` domain whose base type is another `eql_v2_*` domain (not +/// jsonb) silently bypasses the storage variant's blockers: operators +/// resolve against the ultimate base type, so a derived domain does not +/// inherit the base domain's operator surface. See CLAUDE.md footguns. +/// This test plants a domain-over-domain offender and asserts the lint +/// surfaces it under `domain_over_domain`. +#[sqlx::test] +async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { + sqlx::query(r#"CREATE DOMAIN public.eql_v2_test_baddom AS public.eql_v2_int4;"#) + .execute(&pool) + .await?; + + let rows = fetch_lints(&pool).await?; + let violations: Vec<&LintRow> = rows + .iter() + .filter(|r| { + r.category == "domain_over_domain" && r.object_name.contains("eql_v2_test_baddom") + }) + .collect(); + + assert!( + !violations.is_empty(), + "Expected `domain_over_domain` to flag the derived domain, \ + but got no matching row. All lint rows:\n{:#?}", + rows + ); + assert_eq!( + violations[0].severity, "error", + "domain_over_domain must be severity=error" + ); + Ok(()) +} + +/// An operator class declared `FOR TYPE` on an `eql_v2_*` domain bypasses +/// the operator-resolution that the storage blockers depend on. The +/// recommended pattern is a functional index on the extractor; opclasses +/// on domains must never appear. See CLAUDE.md footguns. The current +/// build emits zero opclasses on `eql_v2_*` domains, so this test is +/// negative: it asserts the rule category is well-known and surfaces no +/// rows. A positive test would require constructing a valid opclass on a +/// domain, which is non-trivial scaffolding — the `domain_opclass` +/// structural guard in `tests/encrypted_domain/family/inlinability.rs` is the +/// independent net for regressions. +#[sqlx::test] +async fn lint_domain_opclass_surface_is_clean(pool: PgPool) -> Result<()> { + let rows = fetch_lints(&pool).await?; + let violations: Vec<&LintRow> = rows + .iter() + .filter(|r| r.category == "domain_opclass") + .collect(); + assert!( + violations.is_empty(), + "domain_opclass surface should be empty in a clean build, got: {:#?}", + violations + ); + Ok(()) +} + /// Phase 1 regression: the operators rewritten in #193 (=, <>, ~~, ~~*, /// @>, <@ on eql_v2_encrypted) must report zero lint violations. If this /// test fails, an inlinability regression has been introduced into one @@ -119,3 +296,68 @@ async fn lint_phase_1_operators_are_clean(pool: PgPool) -> Result<()> { ); Ok(()) } + +/// Every encrypted-scalar-domain family's inlinable operator surface +/// must report zero lint violations. The supported operators on the +/// `_eq`, `_ord`, and `_ord_ore` variants are codegen-emitted SQL +/// wrappers (LANGUAGE sql, IMMUTABLE, no pinned `search_path`); the +/// planner can fold them into the documented functional indexes. A +/// regression to plpgsql or a pinned `search_path` breaks index +/// engagement. +/// +/// Storage-only variants (the bare `eql_v2_` domain with no +/// capability suffix) are intentionally excluded — every operator on +/// them is a non-STRICT plpgsql blocker, which doesn't need to be +/// inlinable. +/// +/// Discovers the eligible operator set from `pg_operator` rather than +/// hardcoding the int4 inventory — when `int8` (or `bool`, `date`, ...) +/// lands, this test picks it up automatically with no edit. The earlier +/// hardcoded list was a copy-paste hazard. +#[sqlx::test] +async fn scalar_family_inlinable_operators_are_clean(pool: PgPool) -> Result<()> { + // Build the inline-critical signature set Rust-side from + // `SCALAR_PG_TYPES × Variant::ALL × supported-operators`. Eq-only + // variants declare `<`/`<=`/`>`/`>=` as blockers (intentionally + // non-inlinable), so they must NOT be expected to be clean here — + // only the ops the variant actually supports as wrappers count. + // + // Storage variants contribute no inline-critical surface; their + // entire operator set is blockers by design. + let mut prefixes: Vec = Vec::new(); + for pg_type in SCALAR_PG_TYPES { + for variant in Variant::ALL { + if matches!(variant, Variant::Storage) { + continue; + } + let domain = format!("eql_v2_{pg_type}{}", variant.suffix()); + let supported_ops: &[&str] = if variant.supports_ord() { + &["=", "<>", "<", "<=", ">", ">="] + } else { + // Eq variants support equality only; ordering ops on `_eq` + // are blockers. + &["=", "<>"] + }; + for op in supported_ops { + // Domain-on-left and jsonb-on-left arg shapes both + // need to be inlinable; the domain-on-right shape is + // the `(jsonb, domain)` operator. + prefixes.push(format!("operator {op}({domain},")); + prefixes.push(format!("operator {op}(jsonb, {domain})")); + } + } + } + + let rows = fetch_lints(&pool).await?; + let violations: Vec<&LintRow> = rows + .iter() + .filter(|row| prefixes.iter().any(|p| row.object_name.starts_with(p))) + .collect(); + + assert!( + violations.is_empty(), + "scalar-family inline-critical operators should report zero \ + lint violations, but got: {violations:#?}" + ); + Ok(()) +} From 2dc600c1e517dd3e090ded3cd131365a34c662d5 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 12:32:52 +1000 Subject: [PATCH 014/599] docs(encrypted-domain): implementation spec, generator reference & changelog Add encrypted-domain implementation spec and generator reference; document both aggregate paths in eql-functions / sql-support; record the int4 family under CHANGELOG Added. CLAUDE.md gains the encrypted-domain materializer guidance and footgun list. Part of PR #239. --- CHANGELOG.md | 5 + CLAUDE.md | 23 +- docs/development/documentation-inventory.md | 7 - docs/reference/encrypted-domain-generator.md | 398 ++++++++++++++++++ .../encrypted-domain-implementation-spec.md | 339 +++++++++++++++ docs/reference/eql-functions.md | 65 ++- docs/reference/sql-support.md | 24 +- tasks/docs/generate.sh | 2 + tasks/docs/validate.sh | 2 + tasks/docs/validate/coverage.sh | 2 + tasks/docs/validate/documented-sql.sh | 2 + tasks/docs/validate/required-tags.sh | 2 + 12 files changed, 851 insertions(+), 20 deletions(-) create mode 100644 docs/reference/encrypted-domain-generator.md create mode 100644 docs/reference/encrypted-domain-implementation-spec.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e8c9568f..e3d45c0ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,11 @@ Each entry that ships in a published release links to the PR that introduced it. ## [Unreleased] +### Added + +- **`eql_v2_int4` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int4` columns: `eql_v2_int4` (storage-only), `eql_v2_int4_eq` (`=` / `<>` via HMAC), and `eql_v2_int4_ord` / `eql_v2_int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v2.eq_term` / `eql_v2.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) +- **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v2.min(eql_v2__ord)` / `eql_v2.max(eql_v2__ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) + ## [2.3.1] — 2026-05-21 ### Fixed diff --git a/CLAUDE.md b/CLAUDE.md index 65ed6d58d..361fd31b5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -61,6 +61,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search - `src/operators/` - SQL operators for encrypted data comparisons - `src/config/` - Configuration management functions - `src/blake3/`, `src/hmac_256/`, `src/bloom_filter/`, `src/ore_*` - Index implementations +- `src/encrypted_domain/` - Encrypted-domain type families (jsonb-backed PostgreSQL domains, one per operator/index capability) - `tasks/` - mise task scripts - `tests/sqlx/` - Rust/SQLx test framework (PostgreSQL 14-17 support) - `release/` - Generated SQL installation files @@ -72,6 +73,25 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search - **Operators**: Support comparisons between encrypted and plain JSONB data - **CipherStash Proxy**: Required for encryption/decryption operations +### Encrypted-Domain Types + +`src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains, one domain per operator/index capability (`eql_v2_` storage-only, `eql_v2__eq`, `eql_v2__ord`). `eql_v2_int4` (PR #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, and `timestamp` follow this materializer pattern. `jsonb` needs a separate design and is out of scope for the scalar materializer. + +Adding a scalar encrypted-domain type is generated from a minimal manifest at `tasks/codegen/types/.toml`: the filename supplies ``, and the `[domain]` table maps each generated domain name to the fixed index terms it carries. Example: `int4_eq = ["hm"]`, `int4_ord = ["ore"]`. Term capabilities are fixed in `tasks/codegen/terms.py`: `hm` provides equality, and `ore` provides equality plus ordering. `mise run build` regenerates the scalar SQL surface into `src/encrypted_domain//` from every manifest at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. Use `mise run codegen:domain ` to refresh a single type manually while iterating on its manifest, or `mise run codegen:domain:all` to regenerate every type at once (the same enumeration `mise run build` uses). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` files are gitignored and never committed — the TOML manifest plus `tasks/codegen/terms.py` are the source of truth. Generated files carry an `AUTO-GENERATED — DO NOT EDIT` header; change the manifest or term catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. + +**Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the manifest only declares domain names and terms. New term behavior belongs in `tasks/codegen/terms.py` with tests, not in free-form TOML fields. + +Regeneration is deterministic: identical manifest + term catalog produce byte-identical SQL. If `mise run build` produces unexpected output, the change is in the manifest, `tasks/codegen/terms.py`, or `tasks/codegen/templates.py` — not in random run-to-run variation. + +Footguns the spec exists to prevent: + +- **Blockers must never be `STRICT`.** A `STRICT` blocker lets PostgreSQL skip the body and return `NULL` on a `NULL` argument, silently bypassing the "operator not supported" exception. +- **No domain-over-domain** (`CREATE DOMAIN a AS b`). Operators resolve against the ultimate base type (`jsonb`), so a derived domain does not inherit the base domain's operator surface — blockers stop engaging. +- **No operator class on a domain.** Index through a functional index on the extractor (`eq_term` / `ord_term`), whose return type already carries a default opclass. +- **Inlinable functions** (extractors, comparison wrappers) need `LANGUAGE sql`, a single-statement `SELECT`, `IMMUTABLE`, and **no `SET` clause** — a pinned `search_path` disables inlining. No per-type allowlist edit: the `pin_search_path.sql` structural rule recognises encrypted-domain functions intrinsically and `tasks/test/splinter.sh` covers the converged extractor/wrapper names. +- **Blockers must be `LANGUAGE plpgsql`, not `LANGUAGE sql`.** The inverse of the rule above. A blocker exists to always raise, but a `LANGUAGE sql` body is inlinable and the planner can elide the call when the result is provably unused (dead `CASE` branch, folded predicate). `LANGUAGE plpgsql` is opaque to the planner, so the call — and its `RAISE` — survives. The generator in `tasks/codegen/templates.py` enforces this; don't "simplify" the rendered blockers to `LANGUAGE sql` even though the body is a single expression. +- **Build with `mise run clean && mise run build`** — a bare build can leave stale `release/*.sql`. + ### Testing Infrastructure - Tests are written in Rust using SQLx, located in `tests/sqlx/` - Tests run against PostgreSQL 14, 15, 16, 17 using Docker containers @@ -199,6 +219,7 @@ Prefer `LANGUAGE SQL` over `LANGUAGE plpgsql` unless you need procedural feature - Exception handling (`BEGIN...EXCEPTION...END`) - Complex control flow (loops, early returns) - Dynamic SQL (`EXECUTE`) +- Functions that must remain opaque to the planner — typically blockers whose only job is to `RAISE`. `LANGUAGE sql` would be inlined and may be elided when the result is provably unused; `LANGUAGE plpgsql` is never inlined, so the body always runs. See the encrypted-domain footgun list above and the blocker renderers in `tasks/codegen/templates.py`. ## Release & changelog discipline @@ -222,7 +243,7 @@ What does *not* need an entry: Pick the right section (`Added` / `Changed` / `Deprecated` / `Removed` / `Fixed` / `Security`). Lead with the user-visible fact, then a short "Why." explanation, then a PR link in parentheses. Match the tone and density of existing entries — a single dense paragraph per entry, not a bullet list. -Example shape (real entry from `2.3.0`): +Example entry (real entry from `2.3.0`): > **`=`, `<>`, `~~` (`LIKE`), `~~*` (`ILIKE`) on `eql_v2_encrypted` are now inlinable SQL functions.** The planner can structurally match these operators against the documented functional indexes (`eql_v2.hmac_256(col)` for equality, `eql_v2.bloom_filter(col)` for `LIKE`/`ILIKE`), so bare-form queries (`WHERE col = $1`) engage the index without per-query rewriting. Previously these operators wrapped multi-branch PL/pgSQL bodies that the planner could not inline, forcing seq scans on Supabase / managed Postgres installations that lack operator-class indexes. ([#193](...), [#196](...)) diff --git a/docs/development/documentation-inventory.md b/docs/development/documentation-inventory.md index bdbe8fd82..e9e89eed3 100644 --- a/docs/development/documentation-inventory.md +++ b/docs/development/documentation-inventory.md @@ -77,13 +77,6 @@ Generated: Mon 27 Oct 2025 11:39:50 AEDT ## src/crypto.sql -## src/encrypted/aggregates.sql - -- CREATE FUNCTION eql_v2.min(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE AGGREGATE eql_v2.min(eql_v2_encrypted) -- CREATE FUNCTION eql_v2.max(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE AGGREGATE eql_v2.max(eql_v2_encrypted) - ## src/encrypted/casts.sql - CREATE FUNCTION eql_v2.to_encrypted(data jsonb) diff --git a/docs/reference/encrypted-domain-generator.md b/docs/reference/encrypted-domain-generator.md new file mode 100644 index 000000000..9b5026900 --- /dev/null +++ b/docs/reference/encrypted-domain-generator.md @@ -0,0 +1,398 @@ +# Encrypted-Domain Code Generator + +How `tasks/codegen/` turns a TOML manifest into the SQL surface for a +scalar encrypted-domain type. This document describes the generator +itself — its inputs, stages, outputs, and the invariants it enforces. +The contract those outputs must satisfy is in +[`encrypted-domain-implementation-spec.md`](./encrypted-domain-implementation-spec.md); +this file describes the machine that produces them. + +The reference type is `eql_v2_int4` (PR #239). `text` and `jsonb` are +outside scope. + +## 1. Why a generator + +A single scalar encrypted-domain type emits several hundred SQL +declarations across eleven files: four domains, three extractors, dozens +of comparison wrappers and blockers, 176 `CREATE OPERATOR` statements (44 +per domain), and MIN/MAX aggregates for every ordered domain. The shape +is mechanical and +the invariants are unforgiving — a `STRICT` blocker silently bypasses +its exception, a pinned `search_path` disables inlining and reverts +queries to seq scans. The generator exists so each new scalar type adds +one TOML file rather than ninety hand-written declarations that must +agree with each other and with `pin_search_path.sql`, +`tasks/test/splinter.sh`, and `src/encrypted_domain/functions.sql`. + +## 2. Pipeline + +`tasks/codegen/` is a small Python package. Entry point: +`python -m tasks.codegen.generate `, wrapped by +`mise run codegen:domain ` (`tasks/codegen/domain.sh:10`). +`tasks/build.sh` invokes the same entry point for every manifest at +the start of every `mise run build`, so the generated SQL is never +checked in — the TOML manifest is the source of truth. + +Stages, in order: + +1. **Load manifest** — `spec.load_spec(toml_path)` reads + `tasks/codegen/types/.toml`, validates the `[domain]` table, + validates the token and every domain name as SQL identifiers + (`_SQL_IDENTIFIER`, `spec.py:12`), checks each domain name starts with the + filename token, resolves every listed term against `terms.TERM_CATALOG`, + and parses the optional `[fixture]` table (`_load_fixture_values`, + `spec.py:36`). Returns a `TypeSpec` (`tasks/codegen/spec.py:98`). +2. **Resolve terms** — for each `DomainSpec`, `terms.require_terms` + maps catalog names (`hm`, `ore`) to `Term` records carrying the + extractor name, return type, JSON envelope key, supported + operators, and the SQL `-- REQUIRE:` edges those terms imply + (`tasks/codegen/terms.py:57-88`). +3. **Render** — `generate.render_types_file`, + `generate.render_functions_file`, `generate.render_operators_file`, + and `generate.render_aggregates_file` (the last only for ordered + domains) build SQL strings via the per-construct functions in + `templates.py`; when the manifest declares a `[fixture]` table, + `templates.render_fixture_values_rs` also renders the committed Rust + value const. No template engine — plain f-strings, with the structural + shape of each declaration encoded in code (`tasks/codegen/generate.py`). +4. **Write** — `writer.write_generated_file` prefixes every SQL output with + the `AUTO-GENERATED — DO NOT EDIT` header (`templates.py:13-17`) and + refuses to overwrite any pre-existing file that lacks that marker + (`tasks/codegen/writer.py:67`). The committed Rust value const is written + by `writer.write_generated_rs` (`writer.py:78`) with its own Rust + `AUTO-GENERATED` header. `generate_type` cleans stale generated files in + the target directory before rewriting so an abandoned domain disappears on + the next regeneration (`generate.py:221`). + +There is no caching layer, no incremental mode, and no rewriting of +hand-written files. Each invocation regenerates every output for one +type from a single manifest. + +## 3. Manifest format + +```toml +[domain] +int4 = [] +int4_eq = ["hm"] +int4_ord_ore = ["ore"] +int4_ord = ["ore"] +``` + +Rules enforced by `spec.load_spec`: + +- The filename stem is the **type token** (`int4` here). It must match + the CLI argument and prefix every domain name. +- The TOML must have a non-empty `[domain]` table at the top level. The + only other recognised top-level key is the optional `[fixture]` table + (see §3a). +- The filename token and every domain key must be valid lowercase SQL + identifiers (`^[a-z][a-z0-9_]*$`); anything else raises `SpecError`. +- Each domain key must equal the token or start with `_`. +- Each value must be a list of strings, and each string must be a key + in `terms.TERM_CATALOG`. Unknown terms raise `SpecError`. + +The `[domain]` table declares nothing else — no extractor names, no +operator lists, no REQUIRE edges. Every behavioural fact comes from the +term catalog. + +Domains may be **twinned** (`int4_ord` and `int4_ord_ore` both carry +`["ore"]`). The generator emits them as independent domains with +byte-identical SQL modulo type name. Twins exist so callers can choose +a name that documents intent ("ordered, regardless of mechanism" vs +"ordered via ORE block") without committing to one term family in a +future migration. + +Manifest order is significant. The generator iterates domains in their +declared TOML order (`generate.py:48`), and that order shows up in the +generated `_types.sql` `DO` block. + +### 3a. Optional `[fixture]` table + +```toml +[fixture] +values = ["MIN", "-1", "ZERO", "1", "MAX"] +``` + +A type may declare an ordered `[fixture] values` list — the single source +of truth for the committed Rust const +`tests/sqlx/src/fixtures/_values.rs`, consumed by the SQLx fixture +generator and the matrix oracle. `_load_fixture_values` (`spec.py:36`) +requires a non-empty list of string tokens; each resolves through the +scalar-kind catalog (`scalars.py`) — the sentinels `MIN` / `MAX` / `ZERO` +plus any numeric literal in the type's representable range. Validation +enforces a **distinct-plaintext contract**: duplicates are rejected against +the *resolved numeric* value, so both copy-paste token dups (`"1", "1"`) and +sentinel/literal aliases (`"MIN"` alongside the same number) raise +`SpecError` — and the set **must include MIN, MAX, and zero** (the matrix +comparison pivots). Unlike the gitignored SQL surface, `_values.rs` +**is committed** (its rendering is deterministic), and CI regenerates it and +runs `git diff --exit-code` to catch an un-regenerated manifest edit. See +implementation spec §9 for the authoring guidance. + +## 4. Term catalog + +`tasks/codegen/terms.py:25-49` defines every term the materializer +recognises. A term is a frozen dataclass: + +```python +Term( + name="hm", # manifest key + json_key="hm", # envelope payload key + extractor="eq_term", # SQL extractor function name + returns="eql_v2.hmac_256", # extractor return type + ctor="hmac_256", # eql_v2 constructor in jsonb + role="eq", # file-header phrasing + operators=("=", "<>"), # operators this term enables + requires=("src/hmac_256/functions.sql",) # SQL REQUIRE edges +) +``` + +Current catalog: + +| Term | JSON key | Extractor | Returns | Operators | +| ----- | -------- | ----------- | -------------------------------- | ---------------------------------- | +| `hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` `<>` | +| `ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | + +Adding a term is a code change to `terms.py` with matching tests in +`test_terms.py` — never a free-form manifest field. The catalog is the +only source of operator support, extractor identity, and REQUIRE edges; +the manifest is a thin selector over it. + +## 5. The operator surface + +`tasks/codegen/operator_surface.py` enumerates the surface every generated +domain declares: + +- **Supported-capable comparisons**: `=` `<>` `<` `<=` `>` `>=` `@>` `<@` +- **Path blockers**: `->` `->>` +- **Native `jsonb` fallback blockers**: `?` `?|` `?&` `@?` `@@` `#>` `#>>` `-` `#-` `||` + +Comparison and path operators keep the historical three-argument shapes: + +- Symmetric: `(domain, domain)`, `(domain, jsonb)`, `(jsonb, domain)` +- Path: `(domain, text)`, `(domain, integer)`, `(jsonb, domain)` + +Native `jsonb` fallback blockers use only the shapes PostgreSQL exposes +for `jsonb` itself, for a total of **44 `CREATE OPERATOR` statements per +domain**. Supported operators are emitted with full planner metadata +(`COMMUTATOR`, `NEGATOR`, `RESTRICT`, `JOIN` selectivity estimators) and +back onto inlinable wrappers; unsupported operators carry minimal metadata +and back onto blockers. + +Path operators always back onto blockers — neither current term +enables them. The additional native `jsonb` operators are blocker-only. +Untyped string literals are a PostgreSQL resolver edge: `? 'c'` can still +select the built-in `jsonb` operator, while `? 'c'::text` and bound text +parameters select the generated blocker. + +The union of these three lists is `KNOWN_JSONB_OPERATORS`. A live-DB +structural guard +(`tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs`) +queries `pg_operator` for every operator with a `jsonb` argument and asserts +the set is a subset of this union, so a future PostgreSQL version that adds a +`jsonb` operator nobody enumerated here fails the test rather than silently +routing an encrypted column to native plaintext-`jsonb` semantics. +`test_operator_surface.py` pins the Python union; the Rust test mirrors it. + +## 6. Generated outputs + +For a manifest with `D` domains of which `A` are ordered (ord-capable), +the generator writes `1 + 2D + A` SQL files into +`src/encrypted_domain//`, plus — when the manifest carries a +`[fixture]` table — one committed Rust const at +`tests/sqlx/src/fixtures/_values.rs`. For `int4` (`D = 4`, `A = 2`): +eleven SQL files and one Rust file. The SQL outputs are gitignored — `tasks/build.sh` regenerates them at the +start of every build from each `tasks/codegen/types/.toml`, +`mise run codegen:domain ` refreshes a single type manually, and +`mise run codegen:domain:all` regenerates every type in one invocation (the +same `generate.py --all` enumeration the build uses). The manifest plus +`tasks/codegen/terms.py` are the source of truth. + +| File | Content | +| --------------------------------- | ---------------------------------------------------------------------------------------- | +| `_types.sql` | Single idempotent `DO` block creating every domain; each domain `CHECK` pins the payload version (`VALUE->>'v' = '2'`) and required envelope/ciphertext/term keys; one `--! @brief` per domain | +| `_functions.sql` | One extractor per unique term, then 44 wrappers-or-blockers covering the surface | +| `_operators.sql` | 44 `CREATE OPERATOR` statements with planner metadata on supported ops | +| `_aggregates.sql` | MIN/MAX state functions + `CREATE AGGREGATE`; emitted only for ordered (ord-capable) domains | + +Every file: + +- Opens with the `AUTO-GENERATED — DO NOT EDIT` header + (`templates.py:13-17`). +- Declares its `-- REQUIRE:` edges in dependency order — types files + require `src/schema.sql`; function files require schema, types, and + `src/encrypted_domain/functions.sql` plus each term's `requires` set; + operator files require schema, types, and their domain's function + file; aggregate files require schema, types, and their domain's + function and operator files. +- Carries Doxygen `--! @file` / `--! @brief` headers describing its + role. + +### Function-count totals per domain + +| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | +| ------------ | ---------: | -------: | -------: | --------: | --------: | +| none | 0 | 0 | 44 | 44 | 44 | +| `["hm"]` | 1 | 6 | 38 | 45 | 44 | +| `["ore"]` | 1 | 18 | 26 | 45 | 44 | + +Six wrappers for `hm` = `=` and `<>` × three shapes. Eighteen for `ore` += six operators × three shapes. The 44-operator total never moves; the +wrapper/blocker split is what shifts, and native `jsonb` fallback +operators are always blockers. + +The table above covers `_functions.sql` only. Ordered domains +additionally emit `_aggregates.sql` — two state functions +(`min_sfunc`, `max_sfunc`) and two `CREATE AGGREGATE` declarations +(`eql_v2.min`, `eql_v2.max`). Each aggregate declares +`combinefunc = ` and `parallel = safe`: min/max are associative, so +the state function doubles as the combine function, enabling partial and +parallel aggregation on large `GROUP BY` ORE workloads with no decryption. + +## 7. Invariants the generator enforces + +The generator's job is partly to write SQL and partly to make +incorrect SQL unreachable. Invariants encoded in code: + +- **Blockers are never `STRICT`.** `render_blocker_bool`, + `render_blocker_path`, and `render_blocker_native` emit + `IMMUTABLE PARALLEL SAFE` without the + `STRICT` qualifier (`templates.py:263-345`), so a `NULL` + argument still reaches the `RAISE` and the unsupported-operator + exception fires. There is no code path that produces a strict + blocker. +- **Wrappers are inlinable SQL.** `render_wrapper` and + `render_extractor` emit `LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE` + with a single-statement `SELECT` and no `SET search_path` + (`templates.py:218-260`). `pin_search_path.sql:265-290` + catches them structurally and leaves them unpinned. +- **Aggregate state functions are the deliberate exception.** + `render_aggregate` emits `min_sfunc` / `max_sfunc` as + `LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE` *with* a pinned + `SET search_path` (`templates.py:379-452`). They are aggregate transition + functions, not index expressions, so pinning is correct; the generated + `min` / `max` aggregates are allowlisted by name in `splinter.sh`. The + aggregates are `parallel = safe` with the sfunc reused as `combinefunc`. +- **SQL-literal injection is structurally prevented.** Every string + interpolated into a single-quoted SQL literal — payload keys, operator + symbols, domain names in `RAISE` messages — passes through `_sql_str` + (`templates.py:46`), which doubles embedded single quotes. Today's catalog + strings are all quote-free so it is a no-op, but it guarantees a future + quote-bearing catalog string cannot break out of its literal. +- **No domain-over-domain.** Every domain is `CREATE DOMAIN ... AS + jsonb`, never `AS ` (`templates.py:72`). PostgreSQL + resolves operators against the underlying base type; a derived domain + would silently bypass the fixed operator surface. +- **No operator class on a domain.** The generator emits operators, + not operator classes. Callers index through the extractor function + (e.g. `USING btree (eql_v2.ord_term(col))`), whose return type + already carries a default opclass. +- **Ownership boundary.** `writer.is_generated` recognises owned files + by their header line and refuses to overwrite anything else + (`writer.py:20-26`, `44-53`). A hand-written file at a generated + path is a hard error, not a silent clobber. Stale generated files + for removed domains are cleaned before the new files land + (`writer.py:29-41`). + +## 8. Extension files + +`_extensions.sql` is the hand-written sibling. The generator +never creates, lists, or cleans it; it has no auto-generated header +and must declare its own `-- REQUIRE:` edges. Use it for behaviour +that's specific to the type and not part of the fixed surface — e.g. +cross-domain casts, helper functions, type-specific constraints. + +`pin_search_path.sql:291-302` describes the fallback marker for +inline-critical extension functions that take no domain argument and +so escape the structural skip: + +```sql +COMMENT ON FUNCTION eql_v2.my_helper(...) IS 'eql-inline-critical: ...'; +``` + +The generator does **not** emit this marker; every function it +produces takes a domain argument and is covered by the structural skip +intrinsically. + +## 9. Lint and test integration + +The generator depends on two pieces of build tooling recognising its +output without per-type edits: + +- **`tasks/pin_search_path.sql:265-290`** — structural skip identifies + encrypted-domain functions by language (`sql`), volatility + (`IMMUTABLE`), and the presence of at least one argument typed as a + jsonb-backed `DOMAIN` in `public` named `eql_v2_*`. New scalar types + need no edit here. +- **`tasks/test/splinter.sh`** — name-based allowlist. The converged + wrapper names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, `eq_term`, + `ord_term`) are already covered by entries originally added for + `ste_vec_entry` and friends (`splinter.sh:87-104`). Splinter matches + by name only, so a new scalar type that uses the catalog extractors + inherits coverage. Adding a new term whose extractor has a new name + requires a splinter entry. + +## 10. Tests + +`mise run test:codegen` runs the generator test suite — `pytest +tasks/codegen` — with no database required: + +- `test_spec.py`, `test_terms.py`, `test_scalars.py`, + `test_operator_surface.py`, `test_templates.py`, `test_writer.py` — unit + tests per module. +- `test_generate.py` — end-to-end rendering tests asserting file + counts and structural shape. +- `test_against_reference.py` — byte-for-byte match of in-memory + `render_*_file` output against a hand-reviewed (header-stripped) + reference under `tests/codegen/reference/int4/`. Runs anywhere + without depending on materialised `src/encrypted_domain//`. The + reference fixture is the human-readable contract that survives + generator refactors. + +The codegen suite is a prerequisite of the PostgreSQL test matrix +(`tasks/test.sh`), so generated-SQL drift fails CI before any database +test runs. + +## 11. Adding a new scalar type + +The end-to-end shape from a generator perspective: + +1. **Author** `tasks/codegen/types/.toml`. Domain names must + start with the token; term names must already exist in + `terms.TERM_CATALOG`. If `` is a new scalar kind, first register + a `ScalarKind` in `scalars.py` — `load_spec` resolves the scalar before + anything else, so an unregistered token raises + `ScalarError: unknown scalar token ''`. +2. **Regenerate**. Either run `mise run codegen:domain ` while + iterating, or just `mise run build` — the build regenerates every + manifest first. The generator cleans stale generated files, writes + new ones, and refuses any hand-written file at a generated path. + Generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` are + gitignored and never committed. +3. **Hand-write** `_extensions.sql` if the type needs SQL + beyond the fixed surface. Add `eql-inline-critical` markers only on + inline-critical helpers that take no domain argument. This file IS + committed. +4. **Build picks it up automatically** — `tasks/build.sh` regenerates + before computing the `tsort` graph, so the new files appear in the + dependency walk via the `-- REQUIRE:` edges the generator emits. +5. **Baseline & test.** Create a hand-reviewed byte-parity baseline under + `tests/codegen/reference//` (each file marked `-- REFERENCE:` / + `// REFERENCE:`) so `test_against_reference.py` guards the new type — it + only covers types that have a baseline directory. Then run + `mise run test:codegen`, the relevant SQLx suites, and the PostgreSQL + matrix. + +Adding a new **term** is a bigger move — edit `terms.py`, add tests, +audit `splinter.sh` for a name collision, and update the reference +fixture under `tests/codegen/reference/`. + +## 12. Out of scope + +`text` and `jsonb` are not materialised through this generator. There +is no guard preventing a `text.toml` from being authored; the catalog +simply lacks the term shape those types would need. Text and JSONB +encrypted behaviour lives on the composite `eql_v2_encrypted` type and +its hand-written operator surface in `src/encrypted/` and +`src/operators/`, not the scalar materializer. diff --git a/docs/reference/encrypted-domain-implementation-spec.md b/docs/reference/encrypted-domain-implementation-spec.md new file mode 100644 index 000000000..4499c20d1 --- /dev/null +++ b/docs/reference/encrypted-domain-implementation-spec.md @@ -0,0 +1,339 @@ +# Encrypted Domain Type Implementation Spec + +This is the scalar encrypted-domain generator contract used by `int4`. +It applies to scalar domains whose searchable payloads are represented by +the fixed term catalog in `tasks/codegen/terms.py`. + +`text` and `jsonb` are outside this scalar materializer. + +## 1. Model + +Each generated public domain is a concrete `jsonb` domain named +`public.eql_v2_`. The manifest is intentionally small: + +```toml +[domain] +int4 = [] +int4_eq = ["hm"] +int4_ord_ore = ["ore"] +int4_ord = ["ore"] +``` + +The TOML filename supplies the type token. The `[domain]` table maps each +generated domain name to the fixed terms it carries. The generator +emits files in the manifest's declared order, so order keys in the TOML +in the order you want them to appear in generated output. Term capabilities +come only from `tasks/codegen/terms.py`: + +| Term | JSON key | Extractor | Return type | Supported operators | +|---|---|---|---|---| +| `hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` / `<>` | +| `ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` / `<>` / `<` / `<=` / `>` / `>=` | + +For current `int4`, domains carrying `ore` use JSON key `ob`, extractor +`ord_term`, and the ORE block supports equality plus ordering. A type +that needs a non-ORE equality term on an ordered domain needs a new +catalog term design, not a manifest flag. + +The manifest above declares two ordered domains, `int4_ord` and +`int4_ord_ore`, carrying the same term. They are intentional twins: the +generator emits byte-identical SQL (modulo type name) so callers can pick +a name that documents intent without committing to a term family in a +future migration. + +## 2. Checklist + +- [ ] Author `tasks/codegen/types/.toml`. The filename supplies ``. + The `[domain]` table maps generated domain names to fixed terms: + + ```toml + [domain] + int4 = [] + int4_eq = ["hm"] + int4_ord_ore = ["ore"] + int4_ord = ["ore"] + ``` + + Terms determine operator support: `hm` provides `=` / `<>`; `ore` + provides `=` / `<>` / `<` / `<=` / `>` / `>=`. +- [ ] Add or update catalog terms in `tasks/codegen/terms.py` with tests. +- [ ] **If `` is a new scalar kind, register a `ScalarKind` in + `tasks/codegen/scalars.py`** (use the `int4` entry as the template): its + `token`, `rust_type`, the `MIN` / `MAX` / `ZERO` Rust symbols, and the + numeric `min_value` / `max_value` bounds. This is a code change with + tests, exactly like a new catalog term in `terms.py` — not a manifest + field. `load_spec` resolves the scalar before it validates anything, so + without this entry `mise run codegen:domain ` raises + `ScalarError: unknown scalar token ''` and emits nothing. Then search + the codegen tests for any fixture using `` as a negative "unknown + scalar" example (e.g. `test_spec.py`) and update it — registering the + kind makes that token valid. +- [ ] Declare the fixture plaintext list once in the manifest's `[fixture]` + table (see §9). The list MUST include `MIN`, `MAX`, and zero. +- [ ] Run `mise run codegen:domain ` to materialise generated SQL and the + committed `tests/sqlx/src/fixtures/_values.rs` while iterating, or + just `mise run build` — every build regenerates from the manifest first. + Commit the regenerated `_values.rs` (CI diffs it). +- [ ] Generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / + `*_aggregates.sql` are gitignored and never committed. The TOML + manifest plus `tasks/codegen/terms.py` are the source of truth. + Change the manifest or catalog and rebuild; do not hand-edit + generated SQL. +- [ ] Put optional hand-written SQL in + `src/encrypted_domain//_extensions.sql` with explicit + `-- REQUIRE:` edges. This file IS committed. +- [ ] Create a hand-reviewed byte-parity baseline under + `tests/codegen/reference//` — one file per generated SQL output plus + `_values.rs`, each headed with the `-- REFERENCE:` / `// REFERENCE:` + marker. `tasks/codegen/test_against_reference.py` only guards types that + have a baseline directory, so without it the new type gets no + drift protection. The committed-fixture parity assertion is currently + `int4`-only; extend it to cover ``. +- [ ] Run `mise run test:codegen`, the relevant SQLx suites, and the + PostgreSQL matrix before merging. + +## 3. Domain Generation + +The generator emits `src/encrypted_domain//_types.sql` (gitignored; +materialised on every `mise run build` and on `mise run codegen:domain +`) with one idempotent `DO $$ ... $$` block. Domain `CHECK` +constraints always require: + +- fixed envelope keys `v` and `i`; +- ciphertext key `c`; +- catalog JSON keys for the listed terms; +- the envelope version value: `VALUE->>'v' = '2'`, matching the repo-wide + `eql_v2._encrypted_check_v` rule (`src/encrypted/constraints.sql`). + +For example, a domain with `["ore"]` requires `v`, `i`, `c`, and `ob` present, +with `v` pinned to `2`. Beyond key presence and the version value, a malformed +term can still fail later inside its extractor unless a future catalog design +adds stronger validation. + +Every generated domain is a concrete domain over `jsonb`. Do not define +one generated domain over another generated domain; PostgreSQL resolves +operators against the underlying base type in ways that bypass the fixed +operator surface. + +## 4. Extractors And Wrappers + +Extractor names and return types come from `tasks/codegen/terms.py`, not +from TOML. Generated extractors and supported comparison wrappers are +inline-friendly SQL functions: + +```sql +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT ... $$; +``` + +Extractors and comparison wrappers must not carry a pinned `search_path` +— a `SET` clause disables inlining and reverts index-backed queries to +seq scans. The build tooling recognises these generated functions +structurally, so the generator does not emit `eql-inline-critical` +markers. Aggregate state functions are the one deliberate exception — see +§5 — because they are never index expressions. + +Unsupported operators route to blockers. Blockers are `plpgsql`, +`IMMUTABLE`, `PARALLEL SAFE`, and intentionally not `STRICT`. Both +choices are deliberate: + +- **`plpgsql`, not `sql`.** A `LANGUAGE sql` body would be inlinable, and + the planner could elide the call when the result is provably unused + (dead `CASE` branch, folded predicate), letting a blocked operator + appear to succeed. `plpgsql` is opaque to the planner, so the call — + and its `RAISE` — always survives. +- **Not `STRICT`.** A `STRICT` blocker lets PostgreSQL skip the body and + return `NULL` on a `NULL` argument, silently bypassing the + unsupported-operator exception. + +## 5. Operators + +Every generated domain declares supported scalar comparison operators plus +blockers for the native `jsonb` operator surface that PostgreSQL could +otherwise reach through domain-to-base-type fallback. Each domain emits +44 `CREATE OPERATOR` statements. Supported operators route to wrappers; +everything else routes to blockers. + +| Operators | Forms | +|---|---| +| `=` `<>` `<` `<=` `>` `>=` `@>` `<@` | `(domain, domain)` · `(domain, jsonb)` · `(jsonb, domain)` | +| `->` `->>` | `(domain, text)` · `(domain, integer)` · `(jsonb, domain)` | +| `?` | `(domain, text)` | +| `?\|` `?&` | `(domain, text[])` | +| `@?` `@@` | `(domain, jsonpath)` | +| `#>` `#>>` `#-` | `(domain, text[])` | +| `-` | `(domain, text)` · `(domain, integer)` · `(domain, text[])` | +| `\|\|` | `(domain, domain)` · `(domain, jsonb)` · `(jsonb, domain)` | + +Function counts: + +| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | +|---|---:|---:|---:|---:|---:| +| none | 0 | 0 | 44 | 44 | 44 | +| `hm` | 1 (`eq_term`) | 6 | 38 | 45 | 44 | +| `ore` | 1 (`ord_term`) | 18 | 26 | 45 | 44 | + +Supported comparison operators carry planner metadata such as +`COMMUTATOR`, `NEGATOR`, `RESTRICT`, and `JOIN`. Blocker operators keep +minimal metadata because they should never be planner-visible supported +paths. + +PostgreSQL's operator resolver still prefers the built-in `jsonb` operator +for untyped string literals in forms such as `payload::eql_v2_int4 ? 'c'`. +Use typed parameters or explicit casts (`'c'::text`) to route those forms +to the generated blocker. The generated surface blocks the typed native +operator shapes exposed by the catalog. + +### Aggregates + +Each ordered (ord-capable) domain additionally gets a generated +`_aggregates.sql` file declaring `MIN` / `MAX`: + +- two state functions, `eql_v2.min_sfunc` and `eql_v2.max_sfunc`, and +- two aggregates, `eql_v2.min()` and `eql_v2.max()`. + +Comparison routes through the domain's `<` / `>` operator (the ORE block +term — no decryption). The state functions are `LANGUAGE plpgsql +IMMUTABLE STRICT PARALLEL SAFE` **with** a pinned `SET search_path`. This is +the one place the "no pinned `search_path`" rule of §4 does not apply: +aggregate transition functions are never index expressions, so pinning is +correct. `STRICT` makes PostgreSQL seed the running state with the first +non-NULL value and skip NULLs, so an all-NULL group returns NULL. + +Each `CREATE AGGREGATE` declares `combinefunc = ` and +`parallel = safe`: min/max are associative, so the state function doubles as +the combine function, and with a `PARALLEL SAFE` sfunc/combinefunc +PostgreSQL can use partial and parallel aggregation on the large `GROUP BY` +ORE workloads these aggregates exist to serve — still with no decryption. +Storage-only and equality-only domains have no comparator and emit no +aggregate file. + +## 6. Extension Files + +Optional hand-written SQL beyond the fixed scalar surface belongs in: + +```text +src/encrypted_domain//_extensions.sql +``` + +The generator must not create this file, list it in TOML, add an +auto-generated header, or clean it during regeneration. The file must +declare its own `-- REQUIRE:` edges, usually to `_types.sql` and +whichever generated function or operator file it extends. Unlike the +generated siblings, `_extensions.sql` IS committed. + +## 7. Indexing + +Do not create operator classes on generated public domains. Index through +the extractor: + +```sql +CREATE INDEX ... ON table_name USING btree (eql_v2.ord_term(col)); +CREATE INDEX ... ON table_name USING hash (eql_v2.eq_term(col)); +``` + +The extractor return type must already have the needed PostgreSQL access +method support. `ore` depends on +`src/ore_block_u64_8_256/functions.sql` and +`src/ore_block_u64_8_256/operators.sql`; `hm` depends on +`src/hmac_256/functions.sql`. + +## 8. Tests + +Cover each generated domain with SQLx tests appropriate to its terms: + +- supported operators return correct rows for all argument forms; +- unsupported operators raise the expected error for all forms; +- blockers raise on `NULL` input; +- supported wrappers return `NULL` for `NULL` operands; +- functional indexes engage and return correct rows; +- constant-on-left comparisons engage the index where applicable; +- domain `CHECK` rejects non-object and under-populated payloads; +- real typed columns are tested, not only cast literals; +- generated ordered-domain twins remain byte-identical modulo type name + (verified by `tasks/codegen/test_against_reference.py` against the + hand-reviewed baseline in `tests/codegen/reference//`). + +For ordered numeric scalars this coverage is generated by the +`ordered_numeric_matrix!` convention wrapper in `tests/sqlx/src/matrix.rs`: +one `impl ScalarType` (`tests/sqlx/src/scalar_domains.rs`) plus a single +invocation taking `suite`, `scalar`, and `eql_type`. The matrix derives +its comparison pivots — the scalar's `MIN`, `MAX`, and zero +(`Default::default()`) — from the type rather than a hand-written list, so +the invocation carries no pivot argument. Equality-only scalars use the +sibling `eq_only_scalar_matrix!`. The `matrix.rs` module header is the +canonical, current list of the test categories the matrix emits (sanity, +correctness, cross-shape, supported-NULL, blocker raises, index engagement, +ORDER BY, ORDER BY USING) — read it rather than maintaining a duplicate +count here. + +For ordered `int4`, keep the assertion that distinct plaintext values +produce distinct ORE blocks. Do not add assertions for term behavior that +the catalog does not promise. + +## 9. Fixtures + +Fixture generation should use real encrypted payloads produced through +CipherStash Proxy. A single payload table may carry every term needed by +the generated domains for that type. For `int4`, the payloads carry `c`, +`hm`, and `ob`; the equality domain reads `hm`, and ordered domains read +`ob`. + +Choose values so range operators produce distinguishable result counts, +include useful boundaries, and cover omitted-term negative cases. For a +scalar driven by `ordered_numeric_matrix!`, the fixture **must** include +the type's `MIN`, `MAX`, and zero (`Default::default()`): the matrix uses +those three as comparison pivots and fetches each one's ciphertext from the +fixture via `fetch_fixture_payload`, which fails loudly if the row is +absent. + +### Single-sourcing the value list + +The plaintext value list is declared **once**, in the manifest's optional +`[fixture]` table, and generated into Rust — never hand-maintained in two +places: + +```toml +[fixture] +values = [ + "MIN", "-100", "-1", "ZERO", "1", "2", "5", "10", "17", "25", + "42", "50", "100", "250", "1000", "9999", "MAX", +] +``` + +Values are strings so the convention is type-agnostic. The sentinels `MIN`, +`MAX`, and `ZERO` map to the scalar's Rust named consts (for `int4`: +`i32::MIN`, `i32::MAX`, `0`); every other token is a numeric literal +validated against the type's representable range. The per-type rendering +rules live in `tasks/codegen/scalars.py` (mirroring `terms.py`), not in +free-form TOML fields. `load_spec` enforces the matrix invariant: the set +**must** include `MIN`, `MAX`, and zero, or the build fails. + +The generator emits `tests/sqlx/src/fixtures/_values.rs` exposing one +`pub const VALUES: &[]`. Both consumers reference that single +symbol — the fixture generator (`fixtures::eql_v2_::spec`) and the matrix +oracle (`impl ScalarType for { const FIXTURE_VALUES }`) — so the +oracle cannot drift from the values the generator encrypts. + +Unlike the gitignored `*_*.sql` surface and the gitignored encrypted +`tests/sqlx/fixtures/eql_v2_.sql` (whose ciphertext is non-deterministic +per-encrypt), `_values.rs` **is committed**: its rendering is +deterministic, so the CI `codegen` job regenerates it and runs +`git diff --exit-code` to catch a manifest edit that wasn't regenerated. +Regenerate with `mise run codegen:domain ` and commit the result; never +hand-edit it. + +## 10. Build And Verification + +- `mise run codegen:domain ` (optional; refreshes one type while + iterating on its manifest before a full build) +- `mise run test:codegen` +- `mise run clean && mise run build` (regenerates every type's SQL + from its manifest first, then builds the release artefacts) +- relevant SQLx suites +- `mise run test` across supported PostgreSQL versions +- `mise run --output prefix test:splinter --postgres 17` after a + PostgreSQL 17 install has built EQL + +The CI codegen job should remain a prerequisite of the PostgreSQL test +matrix so generated SQL drift is caught before database tests run. diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index 940cb1ae7..5ee40c77d 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -422,6 +422,33 @@ eql_v2.ste_vec(val eql_v2_encrypted) RETURNS eql_v2_encrypted[] eql_v2.ste_vec(val jsonb) RETURNS eql_v2_encrypted[] ``` +### `eql_v2.eq_term()` / `eql_v2.ord_term()` (encrypted-domain) + +Extract the equality (`hm`) or ordering (`ob`) index term from a scalar +encrypted-domain value. Generated per eq/ord-capable variant of every +scalar type — see [Encrypted-Domain Code Generator](./encrypted-domain-generator.md). +The argument type selects the overload, and both are inlinable so a +functional index built on the extractor engages. + +```sql +-- int4 — generated for every scalar type's eq / ord variants. +eql_v2.eq_term(a eql_v2_int4_eq) RETURNS eql_v2.hmac_256 +eql_v2.ord_term(a eql_v2_int4_ord) RETURNS eql_v2.ore_block_u64_8_256 +eql_v2.ord_term(a eql_v2_int4_ord_ore) RETURNS eql_v2.ore_block_u64_8_256 +``` + +**Example:** +```sql +-- Functional indexes on the extracted terms (see Database Indexes) +CREATE INDEX ON users USING hash (eql_v2.eq_term(salary_encrypted)); +CREATE INDEX ON users USING btree (eql_v2.ord_term(salary_encrypted)); +``` + +> The full per-domain operator/wrapper/blocker surface (and the +> `eql_v2_` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is +> documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v2_t) +> and the [generator reference](./encrypted-domain-generator.md). + --- ## JSONB Path Functions @@ -540,10 +567,11 @@ eql_v2.meta_data(val jsonb) RETURNS jsonb ### `eql_v2.selector()` -Extract selector hash from encrypted value. +Extract selector hash from an encrypted payload (`jsonb`) or a ste_vec entry. ```sql -eql_v2.selector(val eql_v2_encrypted) RETURNS text +eql_v2.selector(val jsonb) RETURNS text +eql_v2.selector(entry eql_v2.ste_vec_entry) RETURNS text ``` ### `eql_v2.is_ste_vec_array()` @@ -624,34 +652,51 @@ FROM products GROUP BY eql_v2.jsonb_path_query_first(encrypted_json, 'color_selector'); ``` -### `eql_v2.min()` +### `eql_v2.min()` / `eql_v2.max()` (composite type) -Returns the minimum encrypted value in a set (requires `ore` index for ordering). +Returns the minimum or maximum encrypted value in a set on an `eql_v2_encrypted` column (requires `ore` index terms for ordering). ```sql eql_v2.min(eql_v2_encrypted) RETURNS eql_v2_encrypted +eql_v2.max(eql_v2_encrypted) RETURNS eql_v2_encrypted ``` +Comparison routes through the `<` / `>` operator on `eql_v2_encrypted`, which uses the ORE block term — no decryption. + **Example:** ```sql SELECT eql_v2.min(encrypted_date) FROM events; -SELECT eql_v2.min(encrypted_price) FROM products WHERE category = 'electronics'; +SELECT eql_v2.max(encrypted_price) FROM products WHERE category = 'electronics'; ``` -### `eql_v2.max()` +### `eql_v2.min()` / `eql_v2.max()` (per-domain) -Returns the maximum encrypted value in a set (requires `ore` index for ordering). +Returns the minimum or maximum encrypted value in a set on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`eql_v2__ord`, `eql_v2__ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. These are type-safe alternatives to the composite-type aggregates above and coexist with them. ```sql -eql_v2.max(eql_v2_encrypted) RETURNS eql_v2_encrypted +-- int4 — generated for every ordered variant of every scalar type. +eql_v2.min(eql_v2_int4_ord) RETURNS eql_v2_int4_ord +eql_v2.max(eql_v2_int4_ord) RETURNS eql_v2_int4_ord +eql_v2.min(eql_v2_int4_ord_ore) RETURNS eql_v2_int4_ord_ore +eql_v2.max(eql_v2_int4_ord_ore) RETURNS eql_v2_int4_ord_ore ``` +Comparison routes through the variant's `<` / `>` operator, which uses the ORE block term — no decryption. The state function is `STRICT`, so `NULL` inputs are skipped and an all-`NULL` input set returns `NULL`. + **Example:** ```sql -SELECT eql_v2.max(encrypted_date) FROM events; -SELECT eql_v2.max(encrypted_price) FROM products WHERE category = 'electronics'; +-- ord-capable column (e.g. price_encrypted typed as eql_v2_int4_ord) +SELECT eql_v2.min(price_encrypted) FROM products; +SELECT eql_v2.max(price_encrypted) FROM products WHERE category = 'electronics'; + +-- Equivalent on a generic jsonb column (cast to the right domain) +SELECT eql_v2.min(price_jsonb::eql_v2_int4_ord) FROM products; ``` +`SUM` / `AVG` and other numeric aggregates are not supported on encrypted columns — decrypt at the application boundary. `MIN` / `MAX` only require comparator-revealing terms; arithmetic aggregates would require homomorphic encryption. + +**See also:** [`docs/reference/sql-support.md`](./sql-support.md) for the per-variant capability table. + --- ## Utility Functions diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index e1bf18e4a..ff2de727a 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -59,6 +59,25 @@ Use the equivalent [`jsonb_path_query`](#jsonb-functions-and-selectors-enabled-b --- +## Encrypted-domain scalar types (`eql_v2_`) + +Scalar encrypted-domain types (e.g. `eql_v2_int4`; see the [generator reference](./encrypted-domain-generator.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. + +Each scalar type `` generates one storage-only variant plus eq/ord query variants: + +| Domain variant | Term carried | `=` `<>` | `<` `<=` `>` `>=` | `MIN` / `MAX` | `LIKE`/`ILIKE`, JSONB / ste_vec ops | +| ------------------------------- | ------------------- | :------: | :---------------: | :-----------: | :---------------------------------: | +| `eql_v2_` | none (storage only) | ❌ | ❌ | ❌ | ❌ | +| `eql_v2__eq` | `hm` (hmac_256) | ✅ | ❌ | ❌ | ❌ | +| `eql_v2__ord` / `_ord_ore` | `ob` (ore_block) | ✅ | ✅ | ✅ | ❌ | + +- The bare `eql_v2_` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site) when you need to query. +- Unsupported operators are not silent no-ops: they route to blocker functions that `RAISE` an "operator not supported" exception (a `NULL` operand still raises — the blockers are deliberately not `STRICT`). +- `LIKE` / `ILIKE` and the native JSONB operators (`@>`, `<@`, `->`, `->>`, `?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`) are blocked on **every** scalar domain variant — they are meaningless on a scalar payload. +- `MIN` / `MAX` are exposed only on the ordered variants as `eql_v2.min(eql_v2__ord)` / `eql_v2.max(...)` — see [EQL Functions Reference](./eql-functions.md#eql_v2min--eql_v2max-per-domain). + +--- + ## SQL syntax / feature support This matrix covers higher-level SQL constructs rather than individual operators. As above, ✅ requires the listed index to be configured on the column; ❌ means the construct cannot be used against that column (without first decrypting via CipherStash Proxy or Protect.js). @@ -76,7 +95,7 @@ This matrix covers higher-level SQL constructs rather than individual operators. | `GROUP BY col` | requires `unique` on the whole column; `ore` / `ope` not yet supported (see note below). Extracted JSON paths have separate caveats — see [ste_vec section](#index-terms-by-json-node-type). | ✅ | ❌ | ❌ | ❌ | ❌ | | `DISTINCT` / `DISTINCT ON (col)` | `unique`, `ore`, or `ope` | ✅ | ✅ | ✅ | ❌ | ❌ | | `HAVING` | same index requirements as the predicates used in `HAVING` (see operator matrix) | varies | varies | varies | varies | varies | -| `MIN(col)` / `MAX(col)` | | ❌ | ✅ | ✅ | ❌ | ❌ | +| `MIN(col)` / `MAX(col)` | `eql_v2.min(eql_v2_encrypted)` / `max` work on any `eql_v2_encrypted` column with `ore` terms. The encrypted-domain family additionally exposes type-safe `eql_v2.min(eql_v2__ord)` / `max` (and the `_ord_ore` twin); `Storage` and `Eq` variants have no comparator and do not declare these aggregates. | ❌ | ✅ | ✅ | ❌ | ❌ | | `COUNT(col)` / `COUNT(DISTINCT col)` | `ore` / `ope` or `unique` for `DISTINCT`; none for plain `COUNT(col)` | ✅ | ✅ | ✅ | ✅ | ✅ | | `JOIN … ON lhs.col = rhs.col` | same index and keyset on both sides | ✅ | ✅ | ✅ | ❌ | ❌ | | `JOIN … ON lhs.col < rhs.col` etc. | same index and keyset on both sides | ❌ | ✅ | ✅ | ❌ | ❌ | @@ -89,7 +108,8 @@ Notes: - **Cross-column / cross-table comparisons** (joins, `IN (subquery)`, `UNION` dedup, etc.) require both sides to have been encrypted with the *same* keyset and the matching search index. Encrypted values from different `ste_vec` prefixes are deliberately incomparable. - **`GROUP BY`** on encrypted columns relies on an operator class which currently only supports encrypted values with a `unique` index term. This is a surprising limitation because it would be natural to expect `ore` / `ope` index terms to also work. This limitation will be lifted in the future. See [Database Indexes](./database-indexes.md#group-by) for performance considerations. - **`ORDER BY`** without an `ore` or `ope` index will still *run* (the EQL `compare` function has a deterministic literal fallback to avoid btree errors), but the resulting order is not meaningful. Configure `ore` (or `ope`) whenever ordering matters. -- **Aggregates beyond `MIN`/`MAX`** (e.g. `SUM`, `AVG`) are not supported on encrypted values — decrypt and perform those aggregate operations on the client-side instead. +- **`MIN(col)` / `MAX(col)`** is available two ways. The composite-type aggregates `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` work on any `eql_v2_encrypted` column carrying `ore` terms. The encrypted-domain family additionally exposes type-safe per-variant aggregates — see `eql_v2.min(eql_v2__ord)` / `eql_v2.max(eql_v2__ord)` (and the `_ord_ore` twin) in [EQL Functions Reference](./eql-functions.md#eql_v2min--eql_v2max-per-domain). For a domain-typed column, type it as the appropriate `_ord` variant or cast at the call site (`eql_v2.min(col::eql_v2_int4_ord)`). +- **Aggregates beyond `MIN`/`MAX`** (e.g. `SUM`, `AVG`) are not supported on encrypted values — they would require homomorphic encryption. Decrypt at the application boundary and perform those aggregates client-side. - **Parameter binding**: CipherStash Proxy rewrites bound parameters in `WHERE`, `JOIN`, and `RETURNING` clauses with `::JSONB::eql_v2_encrypted` casts so that the encrypted operator and any B-tree / GIN indexes are selected. Writing those casts yourself is only required when bypassing the proxy. --- diff --git a/tasks/docs/generate.sh b/tasks/docs/generate.sh index ea5a5658b..033bdc205 100755 --- a/tasks/docs/generate.sh +++ b/tasks/docs/generate.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash #MISE description="Generate API documentation (with Doxygen)" +# Build first so generated encrypted-domain SQL exists under src/. +#MISE depends=["build"] set -e diff --git a/tasks/docs/validate.sh b/tasks/docs/validate.sh index 39275596c..14b659afb 100755 --- a/tasks/docs/validate.sh +++ b/tasks/docs/validate.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash #MISE description="Validate SQL documentation" +# Build first so generated encrypted-domain SQL exists under src/. +#MISE depends=["build"] set -e diff --git a/tasks/docs/validate/coverage.sh b/tasks/docs/validate/coverage.sh index 623f8f2f1..4657ec76e 100755 --- a/tasks/docs/validate/coverage.sh +++ b/tasks/docs/validate/coverage.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash #MISE description="Checks documentation coverage for SQL files" +# Build first so generated encrypted-domain SQL exists under src/. +#MISE depends=["build"] set -e diff --git a/tasks/docs/validate/documented-sql.sh b/tasks/docs/validate/documented-sql.sh index b7fd166d7..9ce3fb348 100755 --- a/tasks/docs/validate/documented-sql.sh +++ b/tasks/docs/validate/documented-sql.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash #MISE description="Validates SQL syntax for all documented files" +# Build first so generated encrypted-domain SQL exists under src/. +#MISE depends=["build"] set -e diff --git a/tasks/docs/validate/required-tags.sh b/tasks/docs/validate/required-tags.sh index 55e595572..602c37c1a 100755 --- a/tasks/docs/validate/required-tags.sh +++ b/tasks/docs/validate/required-tags.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash #MISE description="Validates required Doxygen tags are present" +# Build first so generated encrypted-domain SQL exists under src/. +#MISE depends=["build"] set -e From ae2c01328e49993d66851b1652cb1b1f605a0589 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 12:32:52 +1000 Subject: [PATCH 015/599] ci(test-eql): pin third-party actions to SHAs, scope permissions Pin third-party actions to commit SHAs, set permissions: contents: read and persist-credentials: false on checkouts, and add a codegen job gating the PG matrix. Part of PR #239. --- .github/workflows/test-eql.yml | 98 ++++++++++++++++++++++++++++++---- 1 file changed, 89 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 9527faa88..436df8864 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -29,21 +29,26 @@ defaults: run: shell: bash -l {0} +permissions: + contents: read + jobs: schema: name: "JSON Schema validation" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - - uses: jdx/mise-action@v4 + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true cache: true - - uses: Swatinem/rust-cache@v2 + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: workspaces: tests/sqlx shared-key: sqlx-tests @@ -52,10 +57,76 @@ jobs: run: | mise run test:schema + codegen: + name: "Encrypted-domain codegen" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + + - name: Run codegen generator + drift tests + run: | + mise run test:codegen + + # Regenerate the committed Rust fixture-value consts for EVERY type from + # their manifests and fail if any differ from / are missing in the tree. + # The value lists are rendered deterministically (unlike the encrypted + # .sql fixtures, whose ciphertext is non-deterministic and gitignored), so + # a plain diff is the right guard — it catches a manifest edit that wasn't + # regenerated. `git add -N` registers any brand-new untracked const so a + # forgotten-to-commit file also trips the diff. No Postgres needed: this + # only runs the Python generator. + - name: Regenerate and verify fixture-value consts (all types) + run: | + mise run codegen:domain:all + git add -N tests/sqlx/src/fixtures + git diff --exit-code -- tests/sqlx/src/fixtures \ + || { echo "Fixture value const(s) stale or uncommitted — run 'mise run codegen:domain:all' and commit tests/sqlx/src/fixtures."; exit 1; } + + matrix-coverage: + name: "Matrix coverage inventory" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: tests/sqlx + shared-key: sqlx-tests + + # Regenerate the matrix test-name inventory with the SAME pinned feature + # set the local task uses (`--no-default-features`, scale excluded), then + # fail if it differs from the committed snapshot. A coverage change shows + # up as added/removed names in the PR diff — e.g. emptying `ord_domains` + # drops ~140 names, impossible to miss in review. No Postgres needed: + # `--list` only enumerates, the suite uses runtime queries. + - name: Regenerate and verify the matrix test-name inventory + run: | + mise run test:matrix:inventory + git diff --exit-code -- tests/sqlx/snapshots/int4_matrix_tests.txt \ + || { echo "Coverage inventory stale — run 'mise run test:matrix:inventory' and commit."; exit 1; } + test: name: "Test & Validate EQL (Postgres ${{ matrix.postgres-version }})" runs-on: ubuntu-latest-m - needs: schema + needs: [schema, codegen] strategy: fail-fast: false @@ -64,21 +135,28 @@ jobs: env: POSTGRES_VERSION: ${{ matrix.postgres-version }} + # CS_* are required for `mise run test:sqlx` to regenerate the + # cipherstash-client-encrypted fixtures before the suite runs. + # This repository does not accept fork PRs, so the secrets-on- + # `pull_request` constraint that breaks the fork CI flow does not + # apply here — leave the env block unconditional. CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - - uses: jdx/mise-action@v4 + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true # [default: true] run `mise install` cache: true # [default: true] cache mise using GitHub's cache - - uses: Swatinem/rust-cache@v2 + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: workspaces: tests/sqlx shared-key: sqlx-tests @@ -105,9 +183,11 @@ jobs: POSTGRES_VERSION: "17" steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - - uses: jdx/mise-action@v4 + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true From aede0c6091ab5f11242543a22b3fe745584c8f69 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 14:12:43 +1000 Subject: [PATCH 016/599] test(encrypted-domain): scope jsonb-surface guard to native operators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The jsonb_operator_surface guard queried pg_operator for every operator with a jsonb operand and asserted the set is a subset of the 20 known native jsonb operators. It swept in EQL's own cross-type operators on the legacy eql_v2_encrypted composite (`eql_v2_encrypted ~~ jsonb`, `jsonb ~~ eql_v2_encrypted`) — they take a jsonb operand but are not native and are unreachable from a storage scalar domain — failing CI with ["~~", "~~*"]. Exclude operands typed eql_v2_encrypted so the guard tests only the native jsonb surface a domain can fall through to. The deliberate design is unchanged: int4 has no LIKE, operator_surface.py pins exactly 20 operators and excludes ~~/~~*, and the matrix native_absent_ops arm asserts ~~/~~* parse-error on storage domains. Verified: full encrypted_domain suite 239 passed / 0 failed (was 238/1); operator_surface Python tests 11 passed; no codegen change. --- .../family/jsonb_operator_surface.rs | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index 8dc2e0494..1a2fb95e8 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -10,8 +10,11 @@ //! Those lists are an *enumeration*, not a structural guarantee: a future PG //! version could add a jsonb operator that nobody adds here, and it would //! silently route to native jsonb behaviour. This test closes that gap by -//! asking the live catalog which operators actually touch `jsonb` and failing -//! if any symbol is absent from the known union. +//! asking the live catalog which *native* operators touch `jsonb` and failing +//! if any symbol is absent from the known union. EQL's own cross-type operators +//! on the legacy `eql_v2_encrypted` composite (which also take a jsonb operand, +//! e.g. `~~` / `~~*`) are excluded — they are not native and are unreachable +//! from a storage scalar domain. //! //! Source of truth: `tasks/codegen/operator_surface.py::KNOWN_JSONB_OPERATORS` //! (asserted complete by `tasks/codegen/test_operator_surface.py`). The set @@ -36,15 +39,25 @@ const KNOWN_JSONB_OPERATORS: &[&str] = &[ #[sqlx::test] async fn every_native_jsonb_operator_is_known_to_the_generator(pool: PgPool) -> Result<()> { - // Distinct operator symbols whose left OR right argument is `jsonb`. This - // is the full surface a value typed as a jsonb-backed domain can reach via + // Distinct operator symbols whose left OR right argument is `jsonb` — the + // native surface a value typed as a jsonb-backed domain can reach via // operator resolution against the ultimate base type. + // + // Exclude EQL's own cross-type operators on the legacy `eql_v2_encrypted` + // composite (e.g. `eql_v2_encrypted ~~ jsonb`, `jsonb ~~ eql_v2_encrypted`). + // They take a jsonb operand but are NOT native plaintext-jsonb operators and + // are unreachable from a storage scalar domain: a `eql_v2_int4` operand + // resolves to the domain / its jsonb base, never to `eql_v2_encrypted`, so + // `col ~~ x` finds no operator (asserted by the matrix `native_absent_ops` + // arm). Matching on `typname` is search_path-independent and a harmless + // no-op when the type is absent (e.g. the Protect build variant). let native: Vec = sqlx::query_scalar( r#" SELECT DISTINCT o.oprname FROM pg_catalog.pg_operator o - WHERE o.oprleft = 'jsonb'::regtype - OR o.oprright = 'jsonb'::regtype + WHERE (o.oprleft = 'jsonb'::regtype OR o.oprright = 'jsonb'::regtype) + AND o.oprleft NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') + AND o.oprright NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') ORDER BY 1 "#, ) From e3eb6d73f2da71f9b4aa94d12ce770857cf28d39 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 14:26:24 +1000 Subject: [PATCH 017/599] refactor(fixtures): collapse scalar fixture wrappers behind scalar_fixture! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recovered from orphaned commit 0a60f71 (dropped by a reset during the stacked-PR shuffle). The eql_v2_int4 fixture file was ~95% boilerplate shared with future scalar types: the spec() builder, the fixture-gen generator test, and the property-test module differed only in name, the Rust plaintext type, and the value const. Add a scalar_fixture!(name, ty, values) macro that stamps out all three. MIN/MAX in the signed-extremes test derive from <$ty>. The int2 hunk from the original commit is dropped — int2 is not on this branch. Test-infra only; no caller-observable change. Fixture property tests pass (3/3); generate() still compiles under --features fixture-gen. --- tests/sqlx/src/fixtures/eql_v2_int4.rs | 47 +------------- tests/sqlx/src/fixtures/mod.rs | 3 + tests/sqlx/src/fixtures/scalar_fixture.rs | 74 +++++++++++++++++++++++ 3 files changed, 78 insertions(+), 46 deletions(-) create mode 100644 tests/sqlx/src/fixtures/scalar_fixture.rs diff --git a/tests/sqlx/src/fixtures/eql_v2_int4.rs b/tests/sqlx/src/fixtures/eql_v2_int4.rs index 316eac481..429e47d92 100644 --- a/tests/sqlx/src/fixtures/eql_v2_int4.rs +++ b/tests/sqlx/src/fixtures/eql_v2_int4.rs @@ -6,51 +6,6 @@ //! no EQL dependency; #225 layers the `eql_v2_int4` domain on top by casting //! `payload` per query. -use super::index_kind::IndexKind; use super::int4_values::VALUES; -use super::spec::FixtureSpec; -/// The complete fixture definition. `IndexKind::Unique` drives `=` / `<>` -/// (HMAC); `IndexKind::Ore` drives `<` `<=` `>` `>=` (ORE block terms). -pub fn spec() -> FixtureSpec<'static, i32> { - FixtureSpec::new("eql_v2_int4") - .with_index(IndexKind::Unique) - .with_index(IndexKind::Ore) - .with_column_type("jsonb") - .with_values(VALUES) -} - -/// The generator. Gated by `fixture-gen` so `cargo test` never compiles it; -/// `#[ignore]` is a second guard. Run via `mise run fixture:generate eql_v2_int4`. -#[cfg(feature = "fixture-gen")] -#[tokio::test] -#[ignore = "generator — run via `mise run fixture:generate`"] -async fn generate() -> anyhow::Result<()> { - spec().run().await -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn spec_is_complete() { - assert!(spec().check_complete().is_ok()); - } - - #[test] - fn spec_includes_signed_extremes() { - // i32::MIN / MAX exercise ORE block-encoding sign-bit edges - // that the smaller earlier list did not cover. - let spec = spec(); - let values = spec.values(); - assert!(values.contains(&i32::MIN), "spec must include i32::MIN"); - assert!(values.contains(&i32::MAX), "spec must include i32::MAX"); - assert!(values.contains(&0), "spec must include 0"); - } - - #[test] - fn spec_includes_negative_values() { - assert!(spec().values().iter().any(|&v| v < 0)); - } -} +crate::scalar_fixture!("eql_v2_int4", i32, VALUES); diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 416a3b02f..ee087d1d1 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -19,6 +19,9 @@ pub mod spec; pub use spec::FixtureSpec; +#[macro_use] +pub mod scalar_fixture; + pub mod cipherstash; pub mod driver; diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs new file mode 100644 index 000000000..00956cd67 --- /dev/null +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -0,0 +1,74 @@ +//! `scalar_fixture!` — collapse a scalar fixture wrapper to one invocation. +//! +//! Every `eql_v2_` scalar fixture file (`eql_v2_int2`, `eql_v2_int4`, …) is +//! the same three items differing only in the fixture name, the Rust plaintext +//! type, and the generated value list: the `spec()` builder, the `fixture-gen` +//! generator test, and a small property-test module. This macro stamps all +//! three out, so a new scalar fixture is one `use` of the value const plus one +//! `scalar_fixture!(…)`. +//! +//! The per-file `//!` module docs still belong in each fixture file — they +//! describe *that* type's value choices and are not boilerplate. + +/// Stamp out the `spec()` builder, the `fixture-gen` generator test, and the +/// property-test module for a scalar fixture. +/// +/// - `$name` — the fixture name (`"eql_v2_int2"`), drives every derived path. +/// - `$ty` — the Rust plaintext type (`i16`); `<$ty>::MIN`/`MAX` supply the +/// signed-extreme assertions. +/// - `$values` — the generated value const (`int2_values::VALUES`). +/// +/// Indexes are fixed to `Unique` (HMAC, drives `=` / `<>`) and `Ore` (ORE +/// block terms, drives `<` `<=` `>` `>=`) with a committed `jsonb` payload — +/// the shape shared by every ordered scalar domain. +#[macro_export] +macro_rules! scalar_fixture { + ($name:literal, $ty:ty, $values:expr $(,)?) => { + /// The complete fixture definition. `IndexKind::Unique` drives `=` / + /// `<>` (HMAC); `IndexKind::Ore` drives `<` `<=` `>` `>=` (ORE block + /// terms). + pub fn spec() -> $crate::fixtures::FixtureSpec<'static, $ty> { + $crate::fixtures::FixtureSpec::new($name) + .with_index($crate::fixtures::IndexKind::Unique) + .with_index($crate::fixtures::IndexKind::Ore) + .with_column_type("jsonb") + .with_values($values) + } + + /// The generator. Gated by `fixture-gen` so `cargo test` never compiles + /// it; `#[ignore]` is a second guard. Run via + /// `mise run fixture:generate`. + #[cfg(feature = "fixture-gen")] + #[tokio::test] + #[ignore = "generator — run via `mise run fixture:generate`"] + async fn generate() -> anyhow::Result<()> { + spec().run().await + } + + #[cfg(test)] + mod tests { + use super::*; + + #[test] + fn spec_is_complete() { + assert!(spec().check_complete().is_ok()); + } + + #[test] + fn spec_includes_signed_extremes() { + // MIN / MAX exercise ORE block-encoding sign-bit edges that a + // smaller list would not cover. + let spec = spec(); + let values = spec.values(); + assert!(values.contains(&<$ty>::MIN), "spec must include {}::MIN", stringify!($ty)); + assert!(values.contains(&<$ty>::MAX), "spec must include {}::MAX", stringify!($ty)); + assert!(values.contains(&0), "spec must include 0"); + } + + #[test] + fn spec_includes_negative_values() { + assert!(spec().values().iter().any(|&v| v < 0)); + } + } + }; +} From 2f17d8da5bc16bf25b67cc27b7d20200935fe741 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 14:35:29 +1000 Subject: [PATCH 018/599] style(fixtures): rustfmt scalar_fixture.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cargo fmt --check (tasks/test/lint.sh) flagged scalar_fixture.rs: two assert! lines in the generated property-test arm exceed the line width, so rustfmt wraps them. The file was committed unformatted in d36bb55 and CI lint catches it. Formatting only — the macro expands identically, no behaviour change. --- tests/sqlx/src/fixtures/scalar_fixture.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 00956cd67..2394b0495 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -60,8 +60,16 @@ macro_rules! scalar_fixture { // smaller list would not cover. let spec = spec(); let values = spec.values(); - assert!(values.contains(&<$ty>::MIN), "spec must include {}::MIN", stringify!($ty)); - assert!(values.contains(&<$ty>::MAX), "spec must include {}::MAX", stringify!($ty)); + assert!( + values.contains(&<$ty>::MIN), + "spec must include {}::MIN", + stringify!($ty) + ); + assert!( + values.contains(&<$ty>::MAX), + "spec must include {}::MAX", + stringify!($ty) + ); assert!(values.contains(&0), "spec must include 0"); } From 47b88226b095ee1e4ee0c58282a0780229496730 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 11:09:42 +1000 Subject: [PATCH 019/599] feat(encrypted-domain): move int4 domain family into a new eql_v3 schema Introduce a separate eql_v3 schema for the encrypted-domain type families and move the int4 family into it, dropping the redundant version prefix: eql_v3.int4{,_eq,_ord,_ord_ore}, with extractors/wrappers/aggregates (eql_v3.eq_term, ord_term, eq/neq/lt/lte/gt/gte, min/max) also in eql_v3. The core index-term types (eql_v2.hmac_256, eql_v2.ore_block_u64_8_256) stay in eql_v2 and are referenced cross-schema. eql_v2 is unchanged. - codegen: DOMAIN_SCHEMA/CORE_SCHEMA in templates.py; schema-qualified domain_name; schema-v3 REQUIRE edges in generate.py - new src/schema-v3.sql; blocker helper moved to eql_v3 - pin_search_path: pin loop + structural skip broadened to eql_v3 - lints: operator/blocker/domain_over_domain/domain_opclass recognisers extended to eql_v3 - splinter: scope + eql_v3 allowlist rows - SQLx harness + family/lint tests + codegen tests + reference baseline - uninstallers drop eql_v3; docs, CHANGELOG, CLAUDE.md updated Resolves the open PR #239 review thread asking to move the family to eql_v3. The generator/test-quality hardening that was previously bundled here (_sql_str, brief disambiguation, placeholder/aggregate rationale comments, assert_index_scan_uses) now lands separately on v3-domain-type-int4, since it is schema-independent and useful to every scalar type. --- CHANGELOG.md | 4 +- CLAUDE.md | 6 +- docs/reference/encrypted-domain-generator.md | 12 +- .../encrypted-domain-implementation-spec.md | 25 +- docs/reference/eql-functions.md | 40 +- docs/reference/sql-support.md | 18 +- src/encrypted_domain/functions.sql | 10 +- src/lint/lints.sql | 29 +- src/schema-v3.sql | 22 + tasks/codegen/generate.py | 7 +- tasks/codegen/templates.py | 53 ++- tasks/codegen/test_generate.py | 16 +- tasks/codegen/test_templates.py | 110 ++--- tasks/pin_search_path.sql | 17 +- tasks/test/splinter.sh | 33 +- tasks/uninstall-protect.sql | 1 + tasks/uninstall.sql | 5 + .../reference/int4/int4_eq_functions.sql | 389 +++++++++--------- .../reference/int4/int4_eq_operators.sql | 178 ++++---- .../codegen/reference/int4/int4_functions.sql | 383 ++++++++--------- .../codegen/reference/int4/int4_operators.sql | 178 ++++---- .../reference/int4/int4_ord_aggregates.sql | 54 +-- .../reference/int4/int4_ord_functions.sql | 389 +++++++++--------- .../reference/int4/int4_ord_operators.sql | 178 ++++---- .../int4/int4_ord_ore_aggregates.sql | 54 +-- .../reference/int4/int4_ord_ore_functions.sql | 389 +++++++++--------- .../reference/int4/int4_ord_ore_operators.sql | 178 ++++---- tests/codegen/reference/int4/int4_types.sql | 18 +- tests/sqlx/src/matrix.rs | 74 ++-- tests/sqlx/src/scalar_domains.rs | 13 +- .../encrypted_domain/family/inlinability.rs | 112 ++--- .../family/jsonb_operator_surface.rs | 2 +- .../encrypted_domain/family/mutations.rs | 54 +-- .../tests/encrypted_domain/family/support.rs | 76 ++-- tests/sqlx/tests/lint_tests.rs | 18 +- 35 files changed, 1621 insertions(+), 1524 deletions(-) create mode 100644 src/schema-v3.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index e3d45c0ac..00215fd23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,8 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added -- **`eql_v2_int4` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int4` columns: `eql_v2_int4` (storage-only), `eql_v2_int4_eq` (`=` / `<>` via HMAC), and `eql_v2_int4_ord` / `eql_v2_int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v2.eq_term` / `eql_v2.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) -- **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v2.min(eql_v2__ord)` / `eql_v2.max(eql_v2__ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) +- **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors still return the core `eql_v2.hmac_256` / `eql_v2.ore_block_u64_8_256` index-term types, which remain in `eql_v2` and are referenced cross-schema. Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) +- **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) ## [2.3.1] — 2026-05-21 diff --git a/CLAUDE.md b/CLAUDE.md index 361fd31b5..1328a8b0d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -50,7 +50,7 @@ This project uses `mise` for task management. Common commands: This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for searchable encryption. Key architectural components: ### Core Structure -- **Schema**: All EQL functions/types are in `eql_v2` PostgreSQL schema +- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4` and future scalar domains) live in a separate `eql_v3` schema (see below); they reuse the core `eql_v2` index-term types cross-schema. `eql_v2` is unchanged and remains the documented public API. - **Main Type**: `eql_v2_encrypted` - composite type for encrypted columns (stored as JSONB) - **Configuration**: `eql_v2_configuration` table tracks encryption configs - **Index Types**: Various encrypted index types (blake3, hmac_256, bloom_filter, ore variants) @@ -75,7 +75,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains, one domain per operator/index capability (`eql_v2_` storage-only, `eql_v2__eq`, `eql_v2__ord`). `eql_v2_int4` (PR #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, and `timestamp` follow this materializer pattern. `jsonb` needs a separate design and is out of scope for the scalar materializer. +`src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, and `timestamp` follow this materializer pattern. `jsonb` needs a separate design and is out of scope for the scalar materializer. Adding a scalar encrypted-domain type is generated from a minimal manifest at `tasks/codegen/types/.toml`: the filename supplies ``, and the `[domain]` table maps each generated domain name to the fixed index terms it carries. Example: `int4_eq = ["hm"]`, `int4_ord = ["ore"]`. Term capabilities are fixed in `tasks/codegen/terms.py`: `hm` provides equality, and `ore` provides equality plus ordering. `mise run build` regenerates the scalar SQL surface into `src/encrypted_domain//` from every manifest at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. Use `mise run codegen:domain ` to refresh a single type manually while iterating on its manifest, or `mise run codegen:domain:all` to regenerate every type at once (the same enumeration `mise run build` uses). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` files are gitignored and never committed — the TOML manifest plus `tasks/codegen/terms.py` are the source of truth. Generated files carry an `AUTO-GENERATED — DO NOT EDIT` header; change the manifest or term catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. @@ -260,7 +260,7 @@ The entry under `Changed` / `Deprecated` should cross-link to the `U-NNN`. See ` ### Versioning -The `eql_v2` PostgreSQL schema name is part of the public API and is **independent of the EQL release version**. Major-version bumps to EQL do not rename the schema. When deciding on a version bump: +The `eql_v2` PostgreSQL schema name is part of the public API and is **independent of the EQL release version**. Major-version bumps to EQL do not rename the schema. The `eql_v3` schema is **not** a rename of `eql_v2`: it is a separate, additional schema introduced to namespace the encrypted-domain type families. Both schemas coexist; `eql_v2` keeps the core types/operators and is unchanged. Adding a new schema for a new surface is additive, not a public-API break. When deciding on a version bump: - **Patch (`2.3.x`)** — bug fixes, no behaviour changes - **Minor (`2.x.0`)** — additive changes, behaviour changes that don't break the public API (signatures, schema name, payload format, operator names) diff --git a/docs/reference/encrypted-domain-generator.md b/docs/reference/encrypted-domain-generator.md index 9b5026900..bb6252be1 100644 --- a/docs/reference/encrypted-domain-generator.md +++ b/docs/reference/encrypted-domain-generator.md @@ -7,7 +7,7 @@ The contract those outputs must satisfy is in [`encrypted-domain-implementation-spec.md`](./encrypted-domain-implementation-spec.md); this file describes the machine that produces them. -The reference type is `eql_v2_int4` (PR #239). `text` and `jsonb` are +The reference type is `eql_v3.int4` (PR #239). `text` and `jsonb` are outside scope. ## 1. Why a generator @@ -245,7 +245,7 @@ operators are always blockers. The table above covers `_functions.sql` only. Ordered domains additionally emit `_aggregates.sql` — two state functions (`min_sfunc`, `max_sfunc`) and two `CREATE AGGREGATE` declarations -(`eql_v2.min`, `eql_v2.max`). Each aggregate declares +(`eql_v3.min`, `eql_v3.max`). Each aggregate declares `combinefunc = ` and `parallel = safe`: min/max are associative, so the state function doubles as the combine function, enabling partial and parallel aggregation on large `GROUP BY` ORE workloads with no decryption. @@ -280,13 +280,13 @@ incorrect SQL unreachable. Invariants encoded in code: (`templates.py:46`), which doubles embedded single quotes. Today's catalog strings are all quote-free so it is a no-op, but it guarantees a future quote-bearing catalog string cannot break out of its literal. -- **No domain-over-domain.** Every domain is `CREATE DOMAIN ... AS - jsonb`, never `AS ` (`templates.py:72`). PostgreSQL +- **No domain-over-domain.** Every domain is `CREATE DOMAIN eql_v3. + AS jsonb`, never `AS ` (`templates.py:72`). PostgreSQL resolves operators against the underlying base type; a derived domain would silently bypass the fixed operator surface. - **No operator class on a domain.** The generator emits operators, not operator classes. Callers index through the extractor function - (e.g. `USING btree (eql_v2.ord_term(col))`), whose return type + (e.g. `USING btree (eql_v3.ord_term(col))`), whose return type already carries a default opclass. - **Ownership boundary.** `writer.is_generated` recognises owned files by their header line and refuses to overwrite anything else @@ -323,7 +323,7 @@ output without per-type edits: - **`tasks/pin_search_path.sql:265-290`** — structural skip identifies encrypted-domain functions by language (`sql`), volatility (`IMMUTABLE`), and the presence of at least one argument typed as a - jsonb-backed `DOMAIN` in `public` named `eql_v2_*`. New scalar types + jsonb-backed `DOMAIN` in the `eql_v3` schema. New scalar types need no edit here. - **`tasks/test/splinter.sh`** — name-based allowlist. The converged wrapper names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, `eq_term`, diff --git a/docs/reference/encrypted-domain-implementation-spec.md b/docs/reference/encrypted-domain-implementation-spec.md index 4499c20d1..c6bec96ac 100644 --- a/docs/reference/encrypted-domain-implementation-spec.md +++ b/docs/reference/encrypted-domain-implementation-spec.md @@ -8,8 +8,9 @@ the fixed term catalog in `tasks/codegen/terms.py`. ## 1. Model -Each generated public domain is a concrete `jsonb` domain named -`public.eql_v2_`. The manifest is intentionally small: +Each generated domain is a concrete `jsonb` domain in the `eql_v3` +schema named `eql_v3.` (dropped by `DROP SCHEMA eql_v3 CASCADE`; +survives an `eql_v2` uninstall). The manifest is intentionally small: ```toml [domain] @@ -110,10 +111,10 @@ with `v` pinned to `2`. Beyond key presence and the version value, a malformed term can still fail later inside its extractor unless a future catalog design adds stronger validation. -Every generated domain is a concrete domain over `jsonb`. Do not define -one generated domain over another generated domain; PostgreSQL resolves -operators against the underlying base type in ways that bypass the fixed -operator surface. +Every generated domain is a concrete domain over `jsonb` in the `eql_v3` +schema. Do not define one generated domain over another generated domain; +PostgreSQL resolves operators against the underlying base type in ways +that bypass the fixed operator surface. ## 4. Extractors And Wrappers @@ -179,7 +180,7 @@ minimal metadata because they should never be planner-visible supported paths. PostgreSQL's operator resolver still prefers the built-in `jsonb` operator -for untyped string literals in forms such as `payload::eql_v2_int4 ? 'c'`. +for untyped string literals in forms such as `payload::eql_v3.int4 ? 'c'`. Use typed parameters or explicit casts (`'c'::text`) to route those forms to the generated blocker. The generated surface blocks the typed native operator shapes exposed by the catalog. @@ -189,8 +190,8 @@ operator shapes exposed by the catalog. Each ordered (ord-capable) domain additionally gets a generated `_aggregates.sql` file declaring `MIN` / `MAX`: -- two state functions, `eql_v2.min_sfunc` and `eql_v2.max_sfunc`, and -- two aggregates, `eql_v2.min()` and `eql_v2.max()`. +- two state functions, `eql_v3.min_sfunc` and `eql_v3.max_sfunc`, and +- two aggregates, `eql_v3.min()` and `eql_v3.max()`. Comparison routes through the domain's `<` / `>` operator (the ORE block term — no decryption). The state functions are `LANGUAGE plpgsql @@ -224,12 +225,12 @@ generated siblings, `_extensions.sql` IS committed. ## 7. Indexing -Do not create operator classes on generated public domains. Index through +Do not create operator classes on generated domains. Index through the extractor: ```sql -CREATE INDEX ... ON table_name USING btree (eql_v2.ord_term(col)); -CREATE INDEX ... ON table_name USING hash (eql_v2.eq_term(col)); +CREATE INDEX ... ON table_name USING btree (eql_v3.ord_term(col)); +CREATE INDEX ... ON table_name USING hash (eql_v3.eq_term(col)); ``` The extractor return type must already have the needed PostgreSQL access diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index 5ee40c77d..e517e63e5 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -422,31 +422,33 @@ eql_v2.ste_vec(val eql_v2_encrypted) RETURNS eql_v2_encrypted[] eql_v2.ste_vec(val jsonb) RETURNS eql_v2_encrypted[] ``` -### `eql_v2.eq_term()` / `eql_v2.ord_term()` (encrypted-domain) +### `eql_v3.eq_term()` / `eql_v3.ord_term()` (encrypted-domain) Extract the equality (`hm`) or ordering (`ob`) index term from a scalar encrypted-domain value. Generated per eq/ord-capable variant of every scalar type — see [Encrypted-Domain Code Generator](./encrypted-domain-generator.md). The argument type selects the overload, and both are inlinable so a -functional index built on the extractor engages. +functional index built on the extractor engages. The extractors live in +the `eql_v3` schema; their return types remain the core `eql_v2` +index-term types. ```sql -- int4 — generated for every scalar type's eq / ord variants. -eql_v2.eq_term(a eql_v2_int4_eq) RETURNS eql_v2.hmac_256 -eql_v2.ord_term(a eql_v2_int4_ord) RETURNS eql_v2.ore_block_u64_8_256 -eql_v2.ord_term(a eql_v2_int4_ord_ore) RETURNS eql_v2.ore_block_u64_8_256 +eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v2.hmac_256 +eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v2.ore_block_u64_8_256 +eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v2.ore_block_u64_8_256 ``` **Example:** ```sql -- Functional indexes on the extracted terms (see Database Indexes) -CREATE INDEX ON users USING hash (eql_v2.eq_term(salary_encrypted)); -CREATE INDEX ON users USING btree (eql_v2.ord_term(salary_encrypted)); +CREATE INDEX ON users USING hash (eql_v3.eq_term(salary_encrypted)); +CREATE INDEX ON users USING btree (eql_v3.ord_term(salary_encrypted)); ``` > The full per-domain operator/wrapper/blocker surface (and the -> `eql_v2_` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is -> documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v2_t) +> `eql_v3.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is +> documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v3t) > and the [generator reference](./encrypted-domain-generator.md). --- @@ -669,28 +671,28 @@ SELECT eql_v2.min(encrypted_date) FROM events; SELECT eql_v2.max(encrypted_price) FROM products WHERE category = 'electronics'; ``` -### `eql_v2.min()` / `eql_v2.max()` (per-domain) +### `eql_v3.min()` / `eql_v3.max()` (per-domain) -Returns the minimum or maximum encrypted value in a set on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`eql_v2__ord`, `eql_v2__ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. These are type-safe alternatives to the composite-type aggregates above and coexist with them. +Returns the minimum or maximum encrypted value in a set on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`eql_v3._ord`, `eql_v3._ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. These are type-safe alternatives to the composite-type aggregates above and coexist with them. ```sql -- int4 — generated for every ordered variant of every scalar type. -eql_v2.min(eql_v2_int4_ord) RETURNS eql_v2_int4_ord -eql_v2.max(eql_v2_int4_ord) RETURNS eql_v2_int4_ord -eql_v2.min(eql_v2_int4_ord_ore) RETURNS eql_v2_int4_ord_ore -eql_v2.max(eql_v2_int4_ord_ore) RETURNS eql_v2_int4_ord_ore +eql_v3.min(eql_v3.int4_ord) RETURNS eql_v3.int4_ord +eql_v3.max(eql_v3.int4_ord) RETURNS eql_v3.int4_ord +eql_v3.min(eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore +eql_v3.max(eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore ``` Comparison routes through the variant's `<` / `>` operator, which uses the ORE block term — no decryption. The state function is `STRICT`, so `NULL` inputs are skipped and an all-`NULL` input set returns `NULL`. **Example:** ```sql --- ord-capable column (e.g. price_encrypted typed as eql_v2_int4_ord) -SELECT eql_v2.min(price_encrypted) FROM products; -SELECT eql_v2.max(price_encrypted) FROM products WHERE category = 'electronics'; +-- ord-capable column (e.g. price_encrypted typed as eql_v3.int4_ord) +SELECT eql_v3.min(price_encrypted) FROM products; +SELECT eql_v3.max(price_encrypted) FROM products WHERE category = 'electronics'; -- Equivalent on a generic jsonb column (cast to the right domain) -SELECT eql_v2.min(price_jsonb::eql_v2_int4_ord) FROM products; +SELECT eql_v3.min(price_jsonb::eql_v3.int4_ord) FROM products; ``` `SUM` / `AVG` and other numeric aggregates are not supported on encrypted columns — decrypt at the application boundary. `MIN` / `MAX` only require comparator-revealing terms; arithmetic aggregates would require homomorphic encryption. diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index ff2de727a..d15be2ee0 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -59,22 +59,22 @@ Use the equivalent [`jsonb_path_query`](#jsonb-functions-and-selectors-enabled-b --- -## Encrypted-domain scalar types (`eql_v2_`) +## Encrypted-domain scalar types (`eql_v3.`) -Scalar encrypted-domain types (e.g. `eql_v2_int4`; see the [generator reference](./encrypted-domain-generator.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. +Scalar encrypted-domain types (e.g. `eql_v3.int4`; see the [generator reference](./encrypted-domain-generator.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types remain the core `eql_v2` types. Each scalar type `` generates one storage-only variant plus eq/ord query variants: | Domain variant | Term carried | `=` `<>` | `<` `<=` `>` `>=` | `MIN` / `MAX` | `LIKE`/`ILIKE`, JSONB / ste_vec ops | | ------------------------------- | ------------------- | :------: | :---------------: | :-----------: | :---------------------------------: | -| `eql_v2_` | none (storage only) | ❌ | ❌ | ❌ | ❌ | -| `eql_v2__eq` | `hm` (hmac_256) | ✅ | ❌ | ❌ | ❌ | -| `eql_v2__ord` / `_ord_ore` | `ob` (ore_block) | ✅ | ✅ | ✅ | ❌ | +| `eql_v3.` | none (storage only) | ❌ | ❌ | ❌ | ❌ | +| `eql_v3._eq` | `hm` (hmac_256) | ✅ | ❌ | ❌ | ❌ | +| `eql_v3._ord` / `_ord_ore` | `ob` (ore_block) | ✅ | ✅ | ✅ | ❌ | -- The bare `eql_v2_` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site) when you need to query. +- The bare `eql_v3.` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site) when you need to query. - Unsupported operators are not silent no-ops: they route to blocker functions that `RAISE` an "operator not supported" exception (a `NULL` operand still raises — the blockers are deliberately not `STRICT`). - `LIKE` / `ILIKE` and the native JSONB operators (`@>`, `<@`, `->`, `->>`, `?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`) are blocked on **every** scalar domain variant — they are meaningless on a scalar payload. -- `MIN` / `MAX` are exposed only on the ordered variants as `eql_v2.min(eql_v2__ord)` / `eql_v2.max(...)` — see [EQL Functions Reference](./eql-functions.md#eql_v2min--eql_v2max-per-domain). +- `MIN` / `MAX` are exposed only on the ordered variants as `eql_v3.min(eql_v3._ord)` / `eql_v3.max(...)` — see [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). --- @@ -95,7 +95,7 @@ This matrix covers higher-level SQL constructs rather than individual operators. | `GROUP BY col` | requires `unique` on the whole column; `ore` / `ope` not yet supported (see note below). Extracted JSON paths have separate caveats — see [ste_vec section](#index-terms-by-json-node-type). | ✅ | ❌ | ❌ | ❌ | ❌ | | `DISTINCT` / `DISTINCT ON (col)` | `unique`, `ore`, or `ope` | ✅ | ✅ | ✅ | ❌ | ❌ | | `HAVING` | same index requirements as the predicates used in `HAVING` (see operator matrix) | varies | varies | varies | varies | varies | -| `MIN(col)` / `MAX(col)` | `eql_v2.min(eql_v2_encrypted)` / `max` work on any `eql_v2_encrypted` column with `ore` terms. The encrypted-domain family additionally exposes type-safe `eql_v2.min(eql_v2__ord)` / `max` (and the `_ord_ore` twin); `Storage` and `Eq` variants have no comparator and do not declare these aggregates. | ❌ | ✅ | ✅ | ❌ | ❌ | +| `MIN(col)` / `MAX(col)` | `eql_v2.min(eql_v2_encrypted)` / `max` work on any `eql_v2_encrypted` column with `ore` terms. The encrypted-domain family additionally exposes type-safe `eql_v3.min(eql_v3._ord)` / `max` (and the `_ord_ore` twin); `Storage` and `Eq` variants have no comparator and do not declare these aggregates. | ❌ | ✅ | ✅ | ❌ | ❌ | | `COUNT(col)` / `COUNT(DISTINCT col)` | `ore` / `ope` or `unique` for `DISTINCT`; none for plain `COUNT(col)` | ✅ | ✅ | ✅ | ✅ | ✅ | | `JOIN … ON lhs.col = rhs.col` | same index and keyset on both sides | ✅ | ✅ | ✅ | ❌ | ❌ | | `JOIN … ON lhs.col < rhs.col` etc. | same index and keyset on both sides | ❌ | ✅ | ✅ | ❌ | ❌ | @@ -108,7 +108,7 @@ Notes: - **Cross-column / cross-table comparisons** (joins, `IN (subquery)`, `UNION` dedup, etc.) require both sides to have been encrypted with the *same* keyset and the matching search index. Encrypted values from different `ste_vec` prefixes are deliberately incomparable. - **`GROUP BY`** on encrypted columns relies on an operator class which currently only supports encrypted values with a `unique` index term. This is a surprising limitation because it would be natural to expect `ore` / `ope` index terms to also work. This limitation will be lifted in the future. See [Database Indexes](./database-indexes.md#group-by) for performance considerations. - **`ORDER BY`** without an `ore` or `ope` index will still *run* (the EQL `compare` function has a deterministic literal fallback to avoid btree errors), but the resulting order is not meaningful. Configure `ore` (or `ope`) whenever ordering matters. -- **`MIN(col)` / `MAX(col)`** is available two ways. The composite-type aggregates `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` work on any `eql_v2_encrypted` column carrying `ore` terms. The encrypted-domain family additionally exposes type-safe per-variant aggregates — see `eql_v2.min(eql_v2__ord)` / `eql_v2.max(eql_v2__ord)` (and the `_ord_ore` twin) in [EQL Functions Reference](./eql-functions.md#eql_v2min--eql_v2max-per-domain). For a domain-typed column, type it as the appropriate `_ord` variant or cast at the call site (`eql_v2.min(col::eql_v2_int4_ord)`). +- **`MIN(col)` / `MAX(col)`** is available two ways. The composite-type aggregates `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` work on any `eql_v2_encrypted` column carrying `ore` terms. The encrypted-domain family additionally exposes type-safe per-variant aggregates — see `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) in [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). For a domain-typed column, type it as the appropriate `_ord` variant or cast at the call site (`eql_v3.min(col::eql_v3.int4_ord)`). - **Aggregates beyond `MIN`/`MAX`** (e.g. `SUM`, `AVG`) are not supported on encrypted values — they would require homomorphic encryption. Decrypt at the application boundary and perform those aggregates client-side. - **Parameter binding**: CipherStash Proxy rewrites bound parameters in `WHERE`, `JOIN`, and `RETURNING` clauses with `::JSONB::eql_v2_encrypted` casts so that the encrypted operator and any B-tree / GIN indexes are selected. Writing those casts yourself is only required when bypassing the proxy. diff --git a/src/encrypted_domain/functions.sql b/src/encrypted_domain/functions.sql index 24b75145e..71a070a18 100644 --- a/src/encrypted_domain/functions.sql +++ b/src/encrypted_domain/functions.sql @@ -1,9 +1,9 @@ --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql --! @file encrypted_domain/functions.sql ---! @brief Shared blocker helper for the eql_v2_int4 domain family. +--! @brief Shared blocker helper for the eql_v3 encrypted-domain families. --! ---! Per-domain wrapper functions live in src/encrypted_domain/int4/. +--! Per-domain wrapper functions live in src/encrypted_domain//. --! Blockers in those files delegate to encrypted_domain_unsupported_bool --! so every domain raises a uniform domain-specific error rather than --! letting an unsupported operator fall through to native jsonb @@ -12,10 +12,10 @@ --! @brief Shared blocker helper. Raises 'operator X is not supported --! for TYPE' so unsupported domain operators surface a clear --! error rather than fall through to native jsonb behaviour. ---! @param type_name Domain type name (eql_v2_int4*) +--! @param type_name Domain type name (eql_v3.*) --! @param operator_name Operator symbol (=, <, @>, ->, etc.) --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.encrypted_domain_unsupported_bool(type_name text, operator_name text) +CREATE FUNCTION eql_v3.encrypted_domain_unsupported_bool(type_name text, operator_name text) RETURNS boolean IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public diff --git a/src/lint/lints.sql b/src/lint/lints.sql index b378f1bb6..bf38c1e6f 100644 --- a/src/lint/lints.sql +++ b/src/lint/lints.sql @@ -1,4 +1,5 @@ -- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql --! @brief EQL lint: detect non-inlinable operator implementation functions --! @@ -92,7 +93,8 @@ AS $$ SELECT 1 FROM pg_type t WHERE t.oid IN (op.oprleft, op.oprright) AND (t.typname LIKE 'eql_v2%' - OR t.typnamespace = 'eql_v2'::regnamespace) + OR t.typnamespace = 'eql_v2'::regnamespace + OR t.typnamespace = 'eql_v3'::regnamespace) ) ), @@ -132,7 +134,7 @@ AS $$ FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language lang_l ON lang_l.oid = p.prolang - WHERE n.nspname = 'eql_v2' + WHERE n.nspname IN ('eql_v2', 'eql_v3') AND (p.prosrc LIKE '%encrypted_domain_unsupported_bool%' OR p.prosrc LIKE '%is not supported for%') AND EXISTS ( @@ -142,9 +144,11 @@ AS $$ JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype WHERE dt.typtype = 'd' - AND dn.nspname = 'public' - AND dt.typname LIKE 'eql_v2\_%' AND bt.typname = 'jsonb' + AND ( + dn.nspname = 'eql_v3' + OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') + ) ) ) @@ -320,10 +324,15 @@ AS $$ JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace WHERE dt.typtype = 'd' - AND dn.nspname = 'public' - AND dt.typname LIKE 'eql_v2\_%' + AND ( + dn.nspname = 'eql_v3' + OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') + ) AND bt.typtype = 'd' - AND bt.typname LIKE 'eql_v2\_%' + AND ( + bn.nspname = 'eql_v3' + OR (bn.nspname = 'public' AND bt.typname LIKE 'eql_v2\_%') + ) -- ┌─────────────────────────────────────────────────────────────────┐ -- │ Domain opclass: an operator class declared FOR TYPE on an │ @@ -345,8 +354,10 @@ AS $$ JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace WHERE t.typtype = 'd' - AND tn.nspname = 'public' - AND t.typname LIKE 'eql_v2\_%' + AND ( + tn.nspname = 'eql_v3' + OR (tn.nspname = 'public' AND t.typname LIKE 'eql_v2\_%') + ) ORDER BY 1, 2, 3; $$; diff --git a/src/schema-v3.sql b/src/schema-v3.sql new file mode 100644 index 000000000..06df8d380 --- /dev/null +++ b/src/schema-v3.sql @@ -0,0 +1,22 @@ +--! @file schema-v3.sql +--! @brief EQL v3 schema creation +--! +--! Creates the eql_v3 schema, which houses the encrypted-domain type +--! families (eql_v3.int4 and future scalar domains): their domains, index-term +--! extractors, comparison wrappers, blockers, and aggregates. The core +--! index-term types these reuse (eql_v2.hmac_256, eql_v2.ore_block_u64_8_256) +--! remain in the eql_v2 schema and are referenced cross-schema. +--! +--! Drops existing schema if present to support clean reinstallation. +--! +--! @warning DROP SCHEMA CASCADE will remove all objects in the schema +--! @note eql_v3 is a new, additional schema for domain families; the eql_v2 +--! schema name is unchanged. + +--! @brief Drop existing EQL v3 schema +--! @warning CASCADE will drop all dependent objects +DROP SCHEMA IF EXISTS eql_v3 CASCADE; + +--! @brief Create EQL v3 schema +--! @note Houses the encrypted-domain type families +CREATE SCHEMA eql_v3; diff --git a/tasks/codegen/generate.py b/tasks/codegen/generate.py index cf30c598c..03ac6be7f 100644 --- a/tasks/codegen/generate.py +++ b/tasks/codegen/generate.py @@ -87,7 +87,7 @@ def render_types_file(spec: TypeSpec) -> str: """ blocks = [render_domain_block(domain, spec.token) for domain in spec.domains] return ( - "-- REQUIRE: src/schema.sql\n\n" + "-- REQUIRE: src/schema-v3.sql\n\n" f"--! @file encrypted_domain/{spec.token}/{spec.token}_types.sql\n" f"--! @brief Encrypted-domain type family for {spec.token}.\n\n" "DO $$\nBEGIN\n" @@ -99,6 +99,7 @@ def render_types_file(spec: TypeSpec) -> str: def _functions_requires(spec: TypeSpec, domain: DomainSpec) -> list[str]: reqs = [ "src/schema.sql", + "src/schema-v3.sql", _types_path(spec.token), "src/encrypted_domain/functions.sql", ] @@ -181,7 +182,7 @@ def render_operators_file(spec: TypeSpec, domain: DomainSpec) -> str: ) requires = ( - "-- REQUIRE: src/schema.sql\n" + "-- REQUIRE: src/schema-v3.sql\n" f"-- REQUIRE: {_types_path(spec.token)}\n" f"-- REQUIRE: src/encrypted_domain/{spec.token}/" f"{domain.name}_functions.sql\n" @@ -202,7 +203,7 @@ def render_aggregates_file(spec: TypeSpec, domain: DomainSpec) -> str | None: return None parts = [render_aggregate(domain, AGGREGATE_OPS[name]) for name in ("min", "max")] requires = ( - "-- REQUIRE: src/schema.sql\n" + "-- REQUIRE: src/schema-v3.sql\n" f"-- REQUIRE: {_types_path(spec.token)}\n" f"-- REQUIRE: src/encrypted_domain/{spec.token}/" f"{domain.name}_functions.sql\n" diff --git a/tasks/codegen/templates.py b/tasks/codegen/templates.py index 608334954..0c446fec2 100644 --- a/tasks/codegen/templates.py +++ b/tasks/codegen/templates.py @@ -49,7 +49,8 @@ def _sql_str(s: str) -> str: Use this at every `'{...}'` interpolation boundary in the render_* helpers — payload keys, operator symbols, domain names rendered into - RAISE messages, etc. + RAISE messages, etc. NOT for schema-qualified identifiers like + ``eql_v3.foo``: those are emitted unquoted and must not be doubled. Today every catalog string (term keys, operator symbols) is quote-free, so this is a no-op on real input and output stays byte-identical. It @@ -58,6 +59,16 @@ def _sql_str(s: str) -> str: return s.replace("'", "''") +# Schema housing the encrypted-domain families: the domains themselves plus +# their index-term extractors, comparison wrappers, blockers, and aggregates. +# New in v3 and distinct from the core eql_v2 schema, which still owns the +# shared index-term types the extractors return and construct +# (eql_v2.hmac_256, eql_v2.ore_block_u64_8_256). +DOMAIN_SCHEMA = "eql_v3" +# Schema owning the core index-term types/constructors the extractors reuse. +CORE_SCHEMA = "eql_v2" + + def render_fixture_values_rs(spec: TypeSpec) -> str: """Body for tests/sqlx/src/fixtures/_values.rs. @@ -170,8 +181,8 @@ def brief_role_clause(domain: DomainSpec, token: str) -> str: def domain_name(domain: str) -> str: - """The public SQL domain type name.""" - return f"eql_v2_{domain}" + """The schema-qualified SQL domain type name, e.g. ``eql_v3.int4_eq``.""" + return f"{DOMAIN_SCHEMA}.{domain}" def _arg_label(dom: str, arg_type: str) -> str: @@ -203,10 +214,10 @@ def render_domain_block(domain: DomainSpec, token: str) -> str: f" --! @brief {phrase} encrypted {token} domain.{clause}\n" f" IF NOT EXISTS (\n" f" SELECT 1 FROM pg_type\n" - f" WHERE typname = '{_sql_str(dom)}' " - f"AND typnamespace = 'public'::regnamespace\n" + f" WHERE typname = '{_sql_str(domain.name)}' " + f"AND typnamespace = '{DOMAIN_SCHEMA}'::regnamespace\n" f" ) THEN\n" - f" CREATE DOMAIN public.{dom} AS jsonb\n" + f" CREATE DOMAIN {dom} AS jsonb\n" f" CHECK (\n" f" jsonb_typeof(VALUE) = 'object'\n" f" AND {checks}\n" @@ -224,18 +235,18 @@ def render_extractor(domain: DomainSpec, term: Term) -> str: f"--! @return {term.returns}\n" ) return doxy + ( - f"CREATE FUNCTION eql_v2.{term.extractor}(a {dom})\n" + f"CREATE FUNCTION {DOMAIN_SCHEMA}.{term.extractor}(a {dom})\n" f"RETURNS {term.returns}\n" f"LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE\n" - f"AS $$ SELECT eql_v2.{term.ctor}(a::jsonb) $$;\n" + f"AS $$ SELECT {CORE_SCHEMA}.{term.ctor}(a::jsonb) $$;\n" ) def _extract_arg(arg_type: str, extractor: str, domain: str, arg: str) -> str: """The extractor-call SQL for one operand, casting jsonb to the domain first.""" if arg_type == "jsonb": - return f"eql_v2.{extractor}({arg}::{domain})" - return f"eql_v2.{extractor}({arg})" + return f"{DOMAIN_SCHEMA}.{extractor}({arg}::{domain})" + return f"{DOMAIN_SCHEMA}.{extractor}({arg})" def render_wrapper( @@ -254,7 +265,7 @@ def render_wrapper( f"--! @return boolean\n" ) return doxy + ( - f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, b {arg_b})\n" + f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, b {arg_b})\n" f"RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE\n" f"AS $$ SELECT {call_a} {op} {call_b} $$;\n" ) @@ -276,9 +287,9 @@ def render_blocker_bool( f"--! @return boolean (never returns; always raises)\n" ) return doxy + ( - f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, b {arg_b})\n" + f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, b {arg_b})\n" f"RETURNS boolean IMMUTABLE PARALLEL SAFE\n" - f"AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool(" + f"AS $$ BEGIN RETURN {DOMAIN_SCHEMA}.encrypted_domain_unsupported_bool(" f"'{_sql_str(dom)}', '{_sql_str(op)}'); END; $$\n" f"LANGUAGE plpgsql;\n" ) @@ -301,7 +312,7 @@ def render_blocker_path( f"--! @return {returns} (never returns; always raises)\n" ) return doxy + ( - f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, selector {arg_b})\n" + f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, selector {arg_b})\n" f"RETURNS {returns} IMMUTABLE PARALLEL SAFE\n" f"AS $$ BEGIN RAISE EXCEPTION " f"'operator % is not supported for %', '{_sql_str(op)}', " @@ -328,7 +339,7 @@ def render_blocker_native( ) if returns == "boolean": body = ( - "BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool(" + f"BEGIN RETURN {DOMAIN_SCHEMA}.encrypted_domain_unsupported_bool(" f"'{_sql_str(dom)}', '{_sql_str(op)}'); END;" ) else: @@ -338,7 +349,7 @@ def render_blocker_native( f"'{_sql_str(dom)}'; END;" ) return doxy + ( - f"CREATE FUNCTION eql_v2.{backing}(a {arg_a}, b {arg_b})\n" + f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, b {arg_b})\n" f"RETURNS {returns} IMMUTABLE PARALLEL SAFE\n" f"AS $$ {body} $$\n" f"LANGUAGE plpgsql;\n" @@ -407,7 +418,7 @@ def render_aggregate(domain: DomainSpec, op: AggregateOp) -> str: "-- also work, but the procedural form mirrors the blocker convention.)\n" ) sfunc = sfunc_rationale + ( - f"CREATE FUNCTION eql_v2.{op.sfunc_name}(state {dom}, value {dom})\n" + f"CREATE FUNCTION {DOMAIN_SCHEMA}.{op.sfunc_name}(state {dom}, value {dom})\n" f"RETURNS {dom}\n" f"LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE\n" f"SET search_path = pg_catalog, extensions, public\n" @@ -442,10 +453,10 @@ def render_aggregate(domain: DomainSpec, op: AggregateOp) -> str: "-- combinefunc = sfunc: min/max are associative, so merging two partial\n" "-- extrema is the same comparison. PARALLEL SAFE enables partial and\n" "-- parallel aggregation on large GROUP BY workloads, with no decryption.\n" - f"CREATE AGGREGATE eql_v2.{op.name}({dom}) (\n" - f" sfunc = eql_v2.{op.sfunc_name},\n" + f"CREATE AGGREGATE {DOMAIN_SCHEMA}.{op.name}({dom}) (\n" + f" sfunc = {DOMAIN_SCHEMA}.{op.sfunc_name},\n" f" stype = {dom},\n" - f" combinefunc = eql_v2.{op.sfunc_name},\n" + f" combinefunc = {DOMAIN_SCHEMA}.{op.sfunc_name},\n" f" parallel = safe\n" f");\n" ) @@ -470,7 +481,7 @@ def render_operator( ) lines += [ f"CREATE OPERATOR {op} (", - f" FUNCTION = eql_v2.{backing},", + f" FUNCTION = {DOMAIN_SCHEMA}.{backing},", f" LEFTARG = {leftarg}, RIGHTARG = {rightarg}", ] if supported and meta.kind == "symmetric": diff --git a/tasks/codegen/test_generate.py b/tasks/codegen/test_generate.py index e92e2f2f1..db93b9890 100644 --- a/tasks/codegen/test_generate.py +++ b/tasks/codegen/test_generate.py @@ -54,10 +54,10 @@ def load(tmp_path): def test_types_file_has_all_four_domains(tmp_path): spec = load(tmp_path) sql = render_types_file(spec) - assert "-- REQUIRE: src/schema.sql" in sql - for dom in ("eql_v2_int4", "eql_v2_int4_eq", - "eql_v2_int4_ord", "eql_v2_int4_ord_ore"): - assert f"CREATE DOMAIN public.{dom} AS jsonb" in sql + assert "-- REQUIRE: src/schema-v3.sql" in sql + for dom in ("int4", "int4_eq", + "int4_ord", "int4_ord_ore"): + assert f"CREATE DOMAIN eql_v3.{dom} AS jsonb" in sql def test_storage_functions_file_is_all_blockers(tmp_path): @@ -75,7 +75,7 @@ def test_eq_functions_file_counts_and_extractor(tmp_path): eq = next(d for d in spec.domains if d.name == "int4_eq") sql = render_functions_file(spec, eq) assert sql.count("CREATE FUNCTION") == 45 - assert "CREATE FUNCTION eql_v2.eq_term(a eql_v2_int4_eq)" in sql + assert "CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)" in sql assert "RETURNS eql_v2.hmac_256" in sql # 1 extractor + 6 wrappers (=, <> across 3 arg-shapes) inlined as SQL; # 38 blockers across the remaining native jsonb surface as plpgsql. @@ -89,7 +89,7 @@ def test_ore_functions_file_counts_and_extractor(tmp_path): ordered = next(d for d in spec.domains if d.name == "int4_ord") sql = render_functions_file(spec, ordered) assert sql.count("CREATE FUNCTION") == 45 - assert "CREATE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord)" in sql + assert "CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)" in sql assert "RETURNS eql_v2.ore_block_u64_8_256" in sql # 1 extractor + 18 wrappers (=, <>, <, <=, >, >= across 3 shapes); # 26 blockers across containment/path/native-jsonb fallback ops. @@ -343,8 +343,8 @@ def test_render_aggregates_file_carries_both_min_and_max(tmp_path): assert sql is not None assert sql.count("CREATE FUNCTION") == 2 assert sql.count("CREATE AGGREGATE") == 2 - assert "eql_v2.min_sfunc" in sql - assert "eql_v2.max_sfunc" in sql + assert "eql_v3.min_sfunc" in sql + assert "eql_v3.max_sfunc" in sql # REQUIRE edges: types + functions + operators must all be declared. assert "-- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql" in sql assert "-- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql" in sql diff --git a/tasks/codegen/test_templates.py b/tasks/codegen/test_templates.py index ba1e3b7d0..7f30e4cb4 100644 --- a/tasks/codegen/test_templates.py +++ b/tasks/codegen/test_templates.py @@ -72,7 +72,7 @@ def test_render_fixture_values_rs_preserves_manifest_order(): def test_domain_block_storage_uses_fixed_envelope_only(): domain = DomainSpec(name="int4", terms=[]) sql = render_domain_block(domain, "int4") - assert "CREATE DOMAIN public.eql_v2_int4 AS jsonb" in sql + assert "CREATE DOMAIN eql_v3.int4 AS jsonb" in sql assert "VALUE ? 'v'" in sql assert "VALUE ? 'i'" in sql assert "VALUE ? 'c'" in sql @@ -83,7 +83,7 @@ def test_domain_block_storage_uses_fixed_envelope_only(): def test_domain_block_uses_catalog_json_keys(): domain = DomainSpec(name="int4_ord", terms=["ore"]) sql = render_domain_block(domain, "int4") - assert "CREATE DOMAIN public.eql_v2_int4_ord AS jsonb" in sql + assert "CREATE DOMAIN eql_v3.int4_ord AS jsonb" in sql assert "VALUE ? 'ob'" in sql assert "VALUE ? 'ore'" not in sql @@ -109,7 +109,7 @@ def test_domain_block_check_pins_envelope_version(): def test_extractor_is_catalog_derived_and_inlinable(): domain = DomainSpec(name="int4_eq", terms=["hm"]) sql = render_extractor(domain, TERM_CATALOG["hm"]) - assert "CREATE FUNCTION eql_v2.eq_term(a eql_v2_int4_eq)" in sql + assert "CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)" in sql assert "RETURNS eql_v2.hmac_256" in sql assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" in sql assert "SELECT eql_v2.hmac_256(a::jsonb)" in sql @@ -121,12 +121,12 @@ def test_wrapper_uses_term_extractor_for_supported_operator(): sql = render_wrapper( domain, op="<", - arg_a="eql_v2_int4_ord", + arg_a="eql_v3.int4_ord", arg_b="jsonb", extractor="ord_term", ) - assert "CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b jsonb)" in sql - assert "SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b::eql_v2_int4_ord)" in sql + assert "CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b jsonb)" in sql + assert "SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int4_ord)" in sql def test_wrapper_is_inlinable_sql(): @@ -135,8 +135,8 @@ def test_wrapper_is_inlinable_sql(): sql = render_wrapper( domain, op="=", - arg_a="eql_v2_int4_eq", - arg_b="eql_v2_int4_eq", + arg_a="eql_v3.int4_eq", + arg_b="eql_v3.int4_eq", extractor="eq_term", ) assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" in sql @@ -161,10 +161,10 @@ def test_blocker_bool_is_not_strict(): attribute line so any future refactor that re-adds STRICT fails loudly.""" domain = DomainSpec(name="int4", terms=[]) sql = render_blocker_bool( - domain, op="<", arg_a="eql_v2_int4", arg_b="eql_v2_int4", + domain, op="<", arg_a="eql_v3.int4", arg_b="eql_v3.int4", ) - assert "CREATE FUNCTION eql_v2.lt(a eql_v2_int4, b eql_v2_int4)" in sql - assert "encrypted_domain_unsupported_bool('eql_v2_int4', '<')" in sql + assert "CREATE FUNCTION eql_v3.lt(a eql_v3.int4, b eql_v3.int4)" in sql + assert "encrypted_domain_unsupported_bool('eql_v3.int4', '<')" in sql assert "RETURNS boolean IMMUTABLE PARALLEL SAFE\n" in sql assert "LANGUAGE plpgsql" in sql assert "STRICT" not in sql @@ -174,9 +174,9 @@ def test_blocker_path_is_not_strict(): """Mirror of test_blocker_bool_is_not_strict for path blockers.""" domain = DomainSpec(name="int4", terms=[]) sql = render_blocker_path( - domain, op="->", arg_a="eql_v2_int4", arg_b="text", + domain, op="->", arg_a="eql_v3.int4", arg_b="text", ) - assert "RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE\n" in sql + assert "RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE\n" in sql assert "LANGUAGE plpgsql" in sql assert "STRICT" not in sql @@ -184,12 +184,12 @@ def test_blocker_path_is_not_strict(): def test_blocker_path_returns_domain_or_text(): domain = DomainSpec(name="int4", terms=[]) arrow = render_blocker_path( - domain, op="->", arg_a="eql_v2_int4", arg_b="text", + domain, op="->", arg_a="eql_v3.int4", arg_b="text", ) - assert 'CREATE FUNCTION eql_v2."->"(a eql_v2_int4, selector text)' in arrow - assert "RETURNS eql_v2_int4" in arrow + assert 'CREATE FUNCTION eql_v3."->"(a eql_v3.int4, selector text)' in arrow + assert "RETURNS eql_v3.int4" in arrow arrow2 = render_blocker_path( - domain, op="->>", arg_a="eql_v2_int4", arg_b="text", + domain, op="->>", arg_a="eql_v3.int4", arg_b="text", ) assert "RETURNS text" in arrow2 @@ -199,19 +199,19 @@ def test_blocker_path_for_jsonb_left_arg_returns_domain(): return type for `->` (only `->>` returns text).""" domain = DomainSpec(name="int4", terms=[]) sql = render_blocker_path( - domain, op="->", arg_a="jsonb", arg_b="eql_v2_int4", + domain, op="->", arg_a="jsonb", arg_b="eql_v3.int4", ) - assert 'CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4)' in sql - assert "RETURNS eql_v2_int4" in sql + assert 'CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4)' in sql + assert "RETURNS eql_v3.int4" in sql def test_blocker_native_bool_uses_helper_and_is_not_strict(): domain = DomainSpec(name="int4", terms=[]) sql = render_blocker_native( - domain, op="?", arg_a="eql_v2_int4", arg_b="text", returns="boolean", + domain, op="?", arg_a="eql_v3.int4", arg_b="text", returns="boolean", ) - assert 'CREATE FUNCTION eql_v2."?"(a eql_v2_int4, b text)' in sql - assert "encrypted_domain_unsupported_bool('eql_v2_int4', '?')" in sql + assert 'CREATE FUNCTION eql_v3."?"(a eql_v3.int4, b text)' in sql + assert "encrypted_domain_unsupported_bool('eql_v3.int4', '?')" in sql assert "RETURNS boolean IMMUTABLE PARALLEL SAFE\n" in sql assert "LANGUAGE plpgsql" in sql assert "STRICT" not in sql @@ -220,11 +220,11 @@ def test_blocker_native_bool_uses_helper_and_is_not_strict(): def test_blocker_native_jsonb_result_raises_and_is_not_strict(): domain = DomainSpec(name="int4", terms=[]) sql = render_blocker_native( - domain, op="#>", arg_a="eql_v2_int4", arg_b="text[]", returns="jsonb", + domain, op="#>", arg_a="eql_v3.int4", arg_b="text[]", returns="jsonb", ) - assert 'CREATE FUNCTION eql_v2."#>"(a eql_v2_int4, b text[])' in sql + assert 'CREATE FUNCTION eql_v3."#>"(a eql_v3.int4, b text[])' in sql assert "RETURNS jsonb IMMUTABLE PARALLEL SAFE\n" in sql - assert "RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4'" in sql + assert "RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4'" in sql assert "LANGUAGE plpgsql" in sql assert "STRICT" not in sql @@ -232,9 +232,9 @@ def test_blocker_native_jsonb_result_raises_and_is_not_strict(): def test_blocker_native_text_result_raises_and_is_not_strict(): domain = DomainSpec(name="int4", terms=[]) sql = render_blocker_native( - domain, op="#>>", arg_a="eql_v2_int4", arg_b="text[]", returns="text", + domain, op="#>>", arg_a="eql_v3.int4", arg_b="text[]", returns="text", ) - assert 'CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4, b text[])' in sql + assert 'CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4, b text[])' in sql assert "RETURNS text IMMUTABLE PARALLEL SAFE\n" in sql assert "LANGUAGE plpgsql" in sql assert "STRICT" not in sql @@ -243,21 +243,21 @@ def test_blocker_native_text_result_raises_and_is_not_strict(): def test_blocker_native_concat_cross_shape(): domain = DomainSpec(name="int4", terms=[]) sql = render_blocker_native( - domain, op="||", arg_a="jsonb", arg_b="eql_v2_int4", returns="jsonb", + domain, op="||", arg_a="jsonb", arg_b="eql_v3.int4", returns="jsonb", ) - assert 'CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4)' in sql + assert 'CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4)' in sql assert "RETURNS jsonb" in sql def test_operator_symmetric_metadata(): sql = render_operator( op="=", backing="eq", - leftarg="eql_v2_int4_eq", rightarg="eql_v2_int4_eq", + leftarg="eql_v3.int4_eq", rightarg="eql_v3.int4_eq", supported=True, ) assert "CREATE OPERATOR = (" in sql - assert "FUNCTION = eql_v2.eq" in sql - assert "LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq" in sql + assert "FUNCTION = eql_v3.eq" in sql + assert "LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq" in sql assert "NEGATOR = <>" in sql assert "RESTRICT = eqsel" in sql @@ -267,12 +267,12 @@ def test_render_operator_unsupported_emits_only_function_and_args(): (those would lie about selectivity for a function that always raises).""" sql = render_operator( op="=", backing="eq", - leftarg="eql_v2_int4", rightarg="eql_v2_int4", + leftarg="eql_v3.int4", rightarg="eql_v3.int4", supported=False, ) assert "CREATE OPERATOR = (" in sql - assert "FUNCTION = eql_v2.eq" in sql - assert "LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4" in sql + assert "FUNCTION = eql_v3.eq" in sql + assert "LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4" in sql assert "NEGATOR" not in sql assert "RESTRICT" not in sql assert "JOIN" not in sql @@ -283,23 +283,23 @@ def test_render_aggregate_min_int4_ord_emits_state_function_and_aggregate(): """Pin the rendered shape for the canonical (int4_ord, min) case.""" domain = DomainSpec(name="int4_ord", terms=["ore"]) sql = render_aggregate(domain, AGGREGATE_OPS["min"]) - assert "CREATE FUNCTION eql_v2.min_sfunc(state eql_v2_int4_ord, value eql_v2_int4_ord)" in sql - assert "RETURNS eql_v2_int4_ord" in sql + assert "CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int4_ord, value eql_v3.int4_ord)" in sql + assert "RETURNS eql_v3.int4_ord" in sql assert "LANGUAGE plpgsql IMMUTABLE STRICT" in sql assert "SET search_path = pg_catalog, extensions, public" in sql assert "IF value < state THEN" in sql - assert "CREATE AGGREGATE eql_v2.min(eql_v2_int4_ord) (" in sql - assert "sfunc = eql_v2.min_sfunc" in sql - assert "stype = eql_v2_int4_ord" in sql + assert "CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord) (" in sql + assert "sfunc = eql_v3.min_sfunc" in sql + assert "stype = eql_v3.int4_ord" in sql def test_render_aggregate_max_uses_greater_than_comparator(): """Symmetric pin: max uses `>` not `<`.""" domain = DomainSpec(name="int4_ord_ore", terms=["ore"]) sql = render_aggregate(domain, AGGREGATE_OPS["max"]) - assert "CREATE FUNCTION eql_v2.max_sfunc(state eql_v2_int4_ord_ore, value eql_v2_int4_ord_ore)" in sql + assert "CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int4_ord_ore, value eql_v3.int4_ord_ore)" in sql assert "IF value > state THEN" in sql - assert "CREATE AGGREGATE eql_v2.max(eql_v2_int4_ord_ore) (" in sql + assert "CREATE AGGREGATE eql_v3.max(eql_v3.int4_ord_ore) (" in sql def test_render_aggregate_state_function_is_not_inlinable(): @@ -326,11 +326,11 @@ def test_render_operator_for_containment_omits_commutator(): must still omit those clauses.""" sql = render_operator( op="@>", backing="contains", - leftarg="eql_v2_int4_ord", rightarg="eql_v2_int4_ord", + leftarg="eql_v3.int4_ord", rightarg="eql_v3.int4_ord", supported=True, ) assert "CREATE OPERATOR @> (" in sql - assert "FUNCTION = eql_v2.contains" in sql + assert "FUNCTION = eql_v3.contains" in sql assert "COMMUTATOR" not in sql assert "NEGATOR" not in sql assert "RESTRICT" not in sql @@ -347,7 +347,7 @@ def test_render_operator_unsupported_emits_placeholder_comment(): domain.""" sql = render_operator( op="<", backing="lt", - leftarg="eql_v2_int4_eq", rightarg="eql_v2_int4_eq", + leftarg="eql_v3.int4_eq", rightarg="eql_v3.int4_eq", supported=False, ) assert sql.startswith("-- Placeholder:") @@ -361,7 +361,7 @@ def test_render_operator_supported_has_no_placeholder_comment(): """Supported operators route to real wrappers — no placeholder comment.""" sql = render_operator( op="=", backing="eq", - leftarg="eql_v2_int4_eq", rightarg="eql_v2_int4_eq", + leftarg="eql_v3.int4_eq", rightarg="eql_v3.int4_eq", supported=True, ) assert "Placeholder" not in sql @@ -380,7 +380,7 @@ def test_render_aggregate_state_function_emits_plpgsql_rationale_comment(): assert "not index" in sql # The rationale precedes the state-function definition. assert sql.index("-- LANGUAGE plpgsql, not sql:") < sql.index( - "CREATE FUNCTION eql_v2.min_sfunc" + "CREATE FUNCTION eql_v3.min_sfunc" ) @@ -396,8 +396,8 @@ def test_render_aggregate_enables_parallel_and_combinefunc(): assert "LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE" in sql # ...and the aggregate must declare the combinefunc + parallel safety # inside the CREATE AGGREGATE option list (not merely in prose). - aggregate_body = sql[sql.index(f"CREATE AGGREGATE eql_v2.{op_name}"):] - assert f"combinefunc = eql_v2.{sfunc}" in aggregate_body + aggregate_body = sql[sql.index(f"CREATE AGGREGATE eql_v3.{op_name}"):] + assert f"combinefunc = eql_v3.{sfunc}" in aggregate_body assert "parallel = safe" in aggregate_body # The stale "intentionally disabled" omission note must be gone. assert "intentionally disabled" not in sql @@ -479,13 +479,13 @@ def test_blocker_escapes_quote_bearing_domain_in_rendered_sql(): string literals.)""" domain = DomainSpec(name="o'dom", terms=[]) sql = render_blocker_bool( - domain, op="<", arg_a="eql_v2_o'dom", arg_b="eql_v2_o'dom", + domain, op="<", arg_a="eql_v3.o'dom", arg_b="eql_v3.o'dom", ) # The dom flows into encrypted_domain_unsupported_bool('', '') # as a single-quoted literal — the quote must be doubled. - assert "encrypted_domain_unsupported_bool('eql_v2_o''dom', '<')" in sql + assert "encrypted_domain_unsupported_bool('eql_v3.o''dom', '<')" in sql # The raw, unescaped single-quoted form must not appear. - assert "'eql_v2_o'dom'" not in sql + assert "'eql_v3.o'dom'" not in sql def test_domain_block_escapes_quote_bearing_key_in_check(): @@ -495,5 +495,5 @@ def test_domain_block_escapes_quote_bearing_key_in_check(): # literal escaping in the IF NOT EXISTS guard. quoted = DomainSpec(name="we'ird", terms=[]) sql = render_domain_block(quoted, "int4") - assert "typname = 'eql_v2_we''ird'" in sql - assert "typname = 'eql_v2_we'ird'" not in sql + assert "typname = 'we''ird'" in sql + assert "typname = 'we'ird'" not in sql diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql index 168a9478b..774be740b 100644 --- a/tasks/pin_search_path.sql +++ b/tasks/pin_search_path.sql @@ -250,7 +250,7 @@ BEGIN SELECT p.oid FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE n.nspname = 'eql_v2' + WHERE n.nspname IN ('eql_v2', 'eql_v3') -- Only normal functions ('f') and window functions ('w') accept -- ALTER FUNCTION ... SET. Aggregates ('a') would be rejected by -- ALTER ROUTINE/FUNCTION, and procedures ('p') would need ALTER @@ -266,13 +266,16 @@ BEGIN -- A new encrypted-domain type needs NO edit here: its inline-critical -- extractors and comparison wrappers are recognised by the identity -- predicate — LANGUAGE sql, IMMUTABLE, and taking at least one argument - -- typed as a jsonb-backed DOMAIN in `public` named `eql_v2_*`. The + -- typed as a jsonb-backed DOMAIN of the encrypted-domain families. The + -- families live in the `eql_v3` schema (e.g. `eql_v3.int4_eq`); the + -- legacy `public.eql_v2_*` form is kept for any pre-v3 domain. The -- predicate is proconfig-independent: the outer loop has already -- excluded any function with a pinned `search_path`, so the only -- functions reaching here are unpinned. This catches no core function: -- `eql_v2_encrypted` is a composite type (not a domain), `ste_vec_entry` - -- is a domain in `eql_v2` (not `public`), and `hmac_256` is a domain - -- over `text` (not `jsonb`). + -- is a domain in `eql_v2` (not `eql_v3`/`public`), and `hmac_256` is a + -- domain over `text` (not `jsonb`). The eql_v3 blockers are plpgsql, so + -- the LANGUAGE-sql guard leaves them to be pinned as intended. AND NOT ( p.prolang = (SELECT l.oid FROM pg_catalog.pg_language l WHERE l.lanname = 'sql') @@ -283,9 +286,11 @@ BEGIN JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace WHERE dt.typtype = 'd' - AND dn.nspname = 'public' - AND dt.typname LIKE 'eql_v2\_%' AND dt.typbasetype = jsonb_oid + AND ( + dn.nspname = 'eql_v3' + OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') + ) ) ) -- Encrypted-domain family — comment-marker fallback. Covers a diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index 6c2032335..a01de51a7 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -10,7 +10,7 @@ set -euo pipefail # Scope: only findings in EQL-owned schemas are gated. -EQL_OWNED_SCHEMAS="('eql_v2')" +EQL_OWNED_SCHEMAS="('eql_v2', 'eql_v3')" # Pinned to splinter main as of 2026-04-27. Bump intentionally. SPLINTER_SHA="55db5b1f28e58d816f7d9136eed87eabcd95868d" @@ -84,12 +84,12 @@ function_search_path_mutable eql_v2 jsonb_contained_by function GIN-inlining: sa function_search_path_mutable eql_v2 ore_cllw function Consolidated ORE-CLLW extractor (U-006): inlinable SQL so the planner can fold `eql_v2.ore_cllw(col -> 'sel')` calls into the calling query. SET search_path would silently undo the inlining and prevent functional-index match through the extractor form. Two overloads: (jsonb), (eql_v2.ste_vec_entry). function_search_path_mutable eql_v2 has_ore_cllw function Consolidated ORE-CLLW presence check (U-006): inlinable SQL counterpart to `eql_v2.ore_cllw`. Same rationale as `ore_cllw` — must stay unpinned to inline into the calling query. Two overloads: (jsonb), (eql_v2.ste_vec_entry). function_search_path_mutable eql_v2 selector function STE-vec entry selector extractor (#219): typed (eql_v2.ste_vec_entry) overload, inlinable so the planner can fold `eql_v2.selector(col -> 'sel')` into the calling query. -function_search_path_mutable eql_v2 eq function Equality backing function for `eql_v2.ste_vec_entry × eql_v2.ste_vec_entry` (#219). Inlines to `hmac_256(a) = hmac_256(b)`; the `=` operator must reach the functional hash index on `eql_v2.hmac_256(col -> 'sel')` for bare-form field equality to engage Index Scan. Splinter matches by name only, so this row also covers the converged eql_v2.eq wrappers on eql_v2_int4_eq / _ord / _ord_ore (PR #225). -function_search_path_mutable eql_v2 neq function Inequality backing function for `eql_v2.ste_vec_entry`. Same rationale as `eq`. Also covers the converged eql_v2.neq wrappers on eql_v2_int4_eq / _ord / _ord_ore (PR #225). -function_search_path_mutable eql_v2 lt function Less-than backing function for `eql_v2.ste_vec_entry`. Inlines to `ore_cllw(a) < ore_cllw(b)`; must reach the functional btree opclass on `eql_v2.ore_cllw` for ordered field queries to engage Index Scan. Splinter matches by name only, so this row also covers the converged eql_v2.lt wrappers on eql_v2_int4_ord / _ord_ore (PR #225). -function_search_path_mutable eql_v2 lte function Less-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. Also covers the converged eql_v2.lte wrappers on eql_v2_int4_ord / _ord_ore (PR #225). -function_search_path_mutable eql_v2 gt function Greater-than backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. Also covers the converged eql_v2.gt wrappers on eql_v2_int4_ord / _ord_ore (PR #225). -function_search_path_mutable eql_v2 gte function Greater-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. Also covers the converged eql_v2.gte wrappers on eql_v2_int4_ord / _ord_ore (PR #225). +function_search_path_mutable eql_v2 eq function Equality backing function for `eql_v2.ste_vec_entry × eql_v2.ste_vec_entry` (#219). Inlines to `hmac_256(a) = hmac_256(b)`; the `=` operator must reach the functional hash index on `eql_v2.hmac_256(col -> 'sel')` for bare-form field equality to engage Index Scan. (The converged int4 wrappers moved to the eql_v3 schema — see the eql_v3 rows below.) +function_search_path_mutable eql_v2 neq function Inequality backing function for `eql_v2.ste_vec_entry`. Same rationale as `eq`. +function_search_path_mutable eql_v2 lt function Less-than backing function for `eql_v2.ste_vec_entry`. Inlines to `ore_cllw(a) < ore_cllw(b)`; must reach the functional btree opclass on `eql_v2.ore_cllw` for ordered field queries to engage Index Scan. +function_search_path_mutable eql_v2 lte function Less-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. +function_search_path_mutable eql_v2 gt function Greater-than backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. +function_search_path_mutable eql_v2 gte function Greater-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. function_search_path_mutable eql_v2 ore_cllw_eq function Inner comparator for the `eql_v2.ore_cllw` type's `=` operator (#221). The outer same-type operators back the btree opclass on `eql_v2.ore_cllw`; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). Mirrors ore_block_u64_8_256_eq. function_search_path_mutable eql_v2 ore_cllw_neq function Inner comparator for the `eql_v2.ore_cllw` type's `<>` operator (#221). Same rationale as `ore_cllw_eq`. function_search_path_mutable eql_v2 ore_cllw_lt function Inner comparator for the `eql_v2.ore_cllw` type's `<` operator (#221). Same rationale as `ore_cllw_eq`. @@ -97,11 +97,26 @@ function_search_path_mutable eql_v2 ore_cllw_lte function Inner comparator for t function_search_path_mutable eql_v2 ore_cllw_gt function Inner comparator for the `eql_v2.ore_cllw` type's `>` operator (#221). Same rationale as `ore_cllw_eq`. function_search_path_mutable eql_v2 ore_cllw_gte function Inner comparator for the `eql_v2.ore_cllw` type's `>=` operator (#221). Same rationale as `ore_cllw_eq`. function_search_path_mutable eql_v2 -> function Typed sv-element selector lookup (U-007): inlinable SQL so the planner can fold `col -> ''` into the calling query, preserving functional-index match for the chained recipes `WHERE col -> 'sel' = $1::ste_vec_entry` (via eq_term) and `ORDER BY eql_v2.ore_cllw(col -> 'sel')`. Three overloads: (enc, text), (enc, enc), (enc, int). -function_search_path_mutable eql_v2 eq_term function XOR-aware equality term extractor on a ste_vec entry (U-007): coalesces hm and oc as bytea. Must inline so `eql_v2.eq_term(col -> 'sel')` folds into the calling query and matches a functional hash index built on the same expression — same precedent as ore_cllw / hmac_256 extractors on ste_vec_entry. Also covers the eql_v2_int4_eq eq_term overload (PR #225). +function_search_path_mutable eql_v2 eq_term function XOR-aware equality term extractor on a ste_vec entry (U-007): coalesces hm and oc as bytea. Must inline so `eql_v2.eq_term(col -> 'sel')` folds into the calling query and matches a functional hash index built on the same expression — same precedent as ore_cllw / hmac_256 extractors on ste_vec_entry. (The eql_v3.int4_eq eq_term extractor is a separate overload in the eql_v3 schema — see the eql_v3 rows below.) function_search_path_mutable eql_v2 min function Aggregate (splinter labels these type=function): ALTER AGGREGATE has no SET configuration_parameter syntax, and ALTER ROUTINE/FUNCTION reject aggregates. The aggregate's SFUNC has a pinned search_path. function_search_path_mutable eql_v2 max function Aggregate: same as min. function_search_path_mutable eql_v2 grouped_value function Aggregate: same as min. -function_search_path_mutable eql_v2 ord_term function eql_v2_int4 ordered-variant index extractor: returns eql_v2.ore_block_u64_8_256 (carrying main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v2.ord_term(col)); must inline. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). Covers both ord_term overloads (eql_v2_int4_ord_ore, eql_v2_int4_ord). +# Encrypted-domain families live in the eql_v3 schema (the int4 family and +# future scalar domains). Their inlinable extractors and comparison wrappers +# must stay unpinned for functional-index matching, exactly as the eql_v2 +# encrypted-type operators above; splinter matches by (schema, name, type), so +# they need their own rows. The plpgsql blockers are pinned by +# tasks/pin_search_path.sql and do not surface here. +function_search_path_mutable eql_v3 eq_term function HMAC equality term extractor for the eql_v3 *_eq domains: returns eql_v2.hmac_256. Must inline so `eql_v3.eq_term(col)` folds into the calling query and matches the functional hash/btree index built on the same expression. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). +function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v2.ore_block_u64_8_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). +function_search_path_mutable eql_v3 eq function Equality comparison wrapper on the eql_v3 domains. Inlines to `eq_term(a) = eq_term(b)`; must reach the functional index on eql_v3.eq_term(col) for bare-form equality to engage Index Scan. Covers the converged eq wrappers on the eql_v3 int4 variants. +function_search_path_mutable eql_v3 neq function Inequality comparison wrapper on the eql_v3 domains. Same rationale as eql_v3.eq. +function_search_path_mutable eql_v3 lt function Less-than comparison wrapper on the eql_v3 ordered domains. Inlines to `ord_term(a) < ord_term(b)`; must reach the functional btree index on eql_v3.ord_term(col) for range queries to engage Index Scan. +function_search_path_mutable eql_v3 lte function Less-than-or-equal comparison wrapper on the eql_v3 ordered domains. Same rationale as eql_v3.lt. +function_search_path_mutable eql_v3 gt function Greater-than comparison wrapper on the eql_v3 ordered domains. Same rationale as eql_v3.lt. +function_search_path_mutable eql_v3 gte function Greater-than-or-equal comparison wrapper on the eql_v3 ordered domains. Same rationale as eql_v3.lt. +function_search_path_mutable eql_v3 min function Per-domain MIN aggregate on the eql_v3 ordered domains (splinter labels aggregates type=function): ALTER AGGREGATE has no SET configuration_parameter syntax, and ALTER ROUTINE/FUNCTION reject aggregates. The aggregate's SFUNC carries a pinned search_path. +function_search_path_mutable eql_v3 max function Per-domain MAX aggregate on the eql_v3 ordered domains. Same as eql_v3.min. ALLOW # Wrap splinter (a single bare SELECT expression) into a subquery we can diff --git a/tasks/uninstall-protect.sql b/tasks/uninstall-protect.sql index 83fddc7d6..eb48602ed 100644 --- a/tasks/uninstall-protect.sql +++ b/tasks/uninstall-protect.sql @@ -1 +1,2 @@ DROP SCHEMA IF EXISTS eql_v2 CASCADE; +DROP SCHEMA IF EXISTS eql_v3 CASCADE; diff --git a/tasks/uninstall.sql b/tasks/uninstall.sql index d77778700..e087e2a88 100644 --- a/tasks/uninstall.sql +++ b/tasks/uninstall.sql @@ -10,3 +10,8 @@ END $$; DROP SCHEMA IF EXISTS eql_v2 CASCADE; + +-- Encrypted-domain families (eql_v3.int4 and future scalar domains) live in +-- their own schema; drop it too. CASCADE removes the domains and any columns +-- typed with them. +DROP SCHEMA IF EXISTS eql_v3 CASCADE; diff --git a/tests/codegen/reference/int4/int4_eq_functions.sql b/tests/codegen/reference/int4/int4_eq_functions.sql index f1fe0d70e..14344ba2a 100644 --- a/tests/codegen/reference/int4/int4_eq_functions.sql +++ b/tests/codegen/reference/int4/int4_eq_functions.sql @@ -1,5 +1,6 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md -- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/functions.sql -- REQUIRE: src/hmac_256/functions.sql @@ -7,400 +8,400 @@ --! @file encrypted_domain/int4/int4_eq_functions.sql --! @brief Equality-only domain of the int4 encrypted-domain family — comparison/path functions. ---! @brief Index extractor for the eql_v2_int4_eq variant. ---! @param a eql_v2_int4_eq +--! @brief Index extractor for the eql_v3.int4_eq variant. +--! @param a eql_v3.int4_eq --! @return eql_v2.hmac_256 -CREATE FUNCTION eql_v2.eq_term(a eql_v2_int4_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v2.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v2.hmac_256(a::jsonb) $$; ---! @brief Equality wrapper for eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Equality wrapper for eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean -CREATE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.eq_term(a) = eql_v2.eq_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Equality wrapper for eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Equality wrapper for eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.eq_term(a) = eql_v2.eq_term(b::eql_v2_int4_eq) $$; +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.int4_eq) $$; ---! @brief Equality wrapper for eql_v2_int4_eq (jsonb, domain). +--! @brief Equality wrapper for eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean -CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.eq_term(a::eql_v2_int4_eq) = eql_v2.eq_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a::eql_v3.int4_eq) = eql_v3.eq_term(b) $$; ---! @brief Inequality wrapper for eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Inequality wrapper for eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean -CREATE FUNCTION eql_v2.neq(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.eq_term(a) <> eql_v2.eq_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Inequality wrapper for eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Inequality wrapper for eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.neq(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4_eq, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.eq_term(a) <> eql_v2.eq_term(b::eql_v2_int4_eq) $$; +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.int4_eq) $$; ---! @brief Inequality wrapper for eql_v2_int4_eq (jsonb, domain). +--! @brief Inequality wrapper for eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean -CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.eq_term(a::eql_v2_int4_eq) <> eql_v2.eq_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a::eql_v3.int4_eq) <> eql_v3.eq_term(b) $$; ---! @brief Blocker for < on eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Blocker for < on eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lt(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Blocker for < on eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lt(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for < on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Blocker for <= on eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lte(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Blocker for <= on eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lte(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for <= on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Blocker for > on eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gt(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Blocker for > on eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gt(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for > on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Blocker for >= on eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gte(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Blocker for >= on eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gte(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for >= on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '>='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Blocker for @> on eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Blocker for @> on eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for @> on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Blocker for <@ on eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Blocker for <@ on eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for <@ on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_eq (domain, text). ---! @param a eql_v2_int4_eq +--! @brief Blocker for -> on eql_v3.int4_eq (domain, text). +--! @param a eql_v3.int4_eq --! @param selector text ---! @return eql_v2_int4_eq (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4_eq, selector text) -RETURNS eql_v2_int4_eq IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_eq'; END; $$ +--! @return eql_v3.int4_eq (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4_eq, selector text) +RETURNS eql_v3.int4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_eq (domain, integer). ---! @param a eql_v2_int4_eq +--! @brief Blocker for -> on eql_v3.int4_eq (domain, integer). +--! @param a eql_v3.int4_eq --! @param selector integer ---! @return eql_v2_int4_eq (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4_eq, selector integer) -RETURNS eql_v2_int4_eq IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_eq'; END; $$ +--! @return eql_v3.int4_eq (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4_eq, selector integer) +RETURNS eql_v3.int4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for -> on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4_eq ---! @return eql_v2_int4_eq (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4_eq) -RETURNS eql_v2_int4_eq IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_eq'; END; $$ +--! @param selector eql_v3.int4_eq +--! @return eql_v3.int4_eq (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4_eq) +RETURNS eql_v3.int4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_eq (domain, text). ---! @param a eql_v2_int4_eq +--! @brief Blocker for ->> on eql_v3.int4_eq (domain, text). +--! @param a eql_v3.int4_eq --! @param selector text --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_eq, selector text) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_eq, selector text) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_eq (domain, integer). ---! @param a eql_v2_int4_eq +--! @brief Blocker for ->> on eql_v3.int4_eq (domain, integer). +--! @param a eql_v3.int4_eq --! @param selector integer --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_eq, selector integer) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_eq, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for ->> on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4_eq +--! @param selector eql_v3.int4_eq --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4_eq) +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4_eq) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v2_int4_eq (domain, text). ---! @param a eql_v2_int4_eq +--! @brief Blocker for ? on eql_v3.int4_eq (domain, text). +--! @param a eql_v3.int4_eq --! @param b text --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?"(a eql_v2_int4_eq, b text) +CREATE FUNCTION eql_v3."?"(a eql_v3.int4_eq, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v2_int4_eq (domain, text[]). ---! @param a eql_v2_int4_eq +--! @brief Blocker for ?| on eql_v3.int4_eq (domain, text[]). +--! @param a eql_v3.int4_eq --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?|"(a eql_v2_int4_eq, b text[]) +CREATE FUNCTION eql_v3."?|"(a eql_v3.int4_eq, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '?|'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '?|'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v2_int4_eq (domain, text[]). ---! @param a eql_v2_int4_eq +--! @brief Blocker for ?& on eql_v3.int4_eq (domain, text[]). +--! @param a eql_v3.int4_eq --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?&"(a eql_v2_int4_eq, b text[]) +CREATE FUNCTION eql_v3."?&"(a eql_v3.int4_eq, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '?&'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '?&'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v2_int4_eq (domain, jsonpath). ---! @param a eql_v2_int4_eq +--! @brief Blocker for @? on eql_v3.int4_eq (domain, jsonpath). +--! @param a eql_v3.int4_eq --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@?"(a eql_v2_int4_eq, b jsonpath) +CREATE FUNCTION eql_v3."@?"(a eql_v3.int4_eq, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v2_int4_eq (domain, jsonpath). ---! @param a eql_v2_int4_eq +--! @brief Blocker for @@ on eql_v3.int4_eq (domain, jsonpath). +--! @param a eql_v3.int4_eq --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@@"(a eql_v2_int4_eq, b jsonpath) +CREATE FUNCTION eql_v3."@@"(a eql_v3.int4_eq, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_eq', '@@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v2_int4_eq (domain, text[]). ---! @param a eql_v2_int4_eq +--! @brief Blocker for #> on eql_v3.int4_eq (domain, text[]). +--! @param a eql_v3.int4_eq --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#>"(a eql_v2_int4_eq, b text[]) +CREATE FUNCTION eql_v3."#>"(a eql_v3.int4_eq, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v2_int4_eq (domain, text[]). ---! @param a eql_v2_int4_eq +--! @brief Blocker for #>> on eql_v3.int4_eq (domain, text[]). +--! @param a eql_v3.int4_eq --! @param b text[] --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4_eq, b text[]) +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4_eq, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_eq (domain, text). ---! @param a eql_v2_int4_eq +--! @brief Blocker for - on eql_v3.int4_eq (domain, text). +--! @param a eql_v3.int4_eq --! @param b text --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_eq, b text) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_eq, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_eq (domain, integer). ---! @param a eql_v2_int4_eq +--! @brief Blocker for - on eql_v3.int4_eq (domain, integer). +--! @param a eql_v3.int4_eq --! @param b integer --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_eq, b integer) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_eq, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_eq (domain, text[]). ---! @param a eql_v2_int4_eq +--! @brief Blocker for - on eql_v3.int4_eq (domain, text[]). +--! @param a eql_v3.int4_eq --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_eq, b text[]) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_eq, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v2_int4_eq (domain, text[]). ---! @param a eql_v2_int4_eq +--! @brief Blocker for #- on eql_v3.int4_eq (domain, text[]). +--! @param a eql_v3.int4_eq --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#-"(a eql_v2_int4_eq, b text[]) +CREATE FUNCTION eql_v3."#-"(a eql_v3.int4_eq, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_eq. ---! @param a eql_v2_int4_eq ---! @param b eql_v2_int4_eq +--! @brief Blocker for || on eql_v3.int4_eq. +--! @param a eql_v3.int4_eq +--! @param b eql_v3.int4_eq --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4_eq, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_eq (domain, jsonb). ---! @param a eql_v2_int4_eq +--! @brief Blocker for || on eql_v3.int4_eq (domain, jsonb). +--! @param a eql_v3.int4_eq --! @param b jsonb --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4_eq, b jsonb) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4_eq, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_eq (jsonb, domain). +--! @brief Blocker for || on eql_v3.int4_eq (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_eq +--! @param b eql_v3.int4_eq --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4_eq) +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4_eq) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_eq'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_eq_operators.sql b/tests/codegen/reference/int4/int4_eq_operators.sql index 85d8353ca..a39951f65 100644 --- a/tests/codegen/reference/int4/int4_eq_operators.sql +++ b/tests/codegen/reference/int4/int4_eq_operators.sql @@ -1,5 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_eq_functions.sql @@ -7,265 +7,265 @@ --! @brief Equality-only domain of the int4 encrypted-domain family — operator declarations. CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq, + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb, + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq, + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq, + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb, + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq, + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); -- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4_eq, RIGHTARG = integer + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4_eq, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4_eq, RIGHTARG = integer + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4_eq, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( - FUNCTION = eql_v2."?", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( - FUNCTION = eql_v2."?|", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( - FUNCTION = eql_v2."?&", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( - FUNCTION = eql_v2."@?", - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonpath + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( - FUNCTION = eql_v2."@@", - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonpath + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( - FUNCTION = eql_v2."#>", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( - FUNCTION = eql_v2."#>>", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_eq, RIGHTARG = integer + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_eq, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( - FUNCTION = eql_v2."#-", - LEFTARG = eql_v2_int4_eq, RIGHTARG = text[] + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4_eq, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4_eq, RIGHTARG = jsonb + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_eq + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); diff --git a/tests/codegen/reference/int4/int4_functions.sql b/tests/codegen/reference/int4/int4_functions.sql index 27936e1d7..a60bc7b18 100644 --- a/tests/codegen/reference/int4/int4_functions.sql +++ b/tests/codegen/reference/int4/int4_functions.sql @@ -1,403 +1,404 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md -- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/functions.sql --! @file encrypted_domain/int4/int4_functions.sql --! @brief Storage-only domain of the int4 encrypted-domain family — comparison/path functions. ---! @brief Blocker for = on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for = on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.eq(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for = on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for = on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.eq(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for = on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for = on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <> on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for <> on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.neq(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <> on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for <> on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.neq(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <> on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for <> on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for < on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lt(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for < on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lt(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for < on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for <= on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lte(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for <= on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lte(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for <= on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for > on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gt(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for > on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gt(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for > on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for >= on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gte(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for >= on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gte(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for >= on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '>='); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>='); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for @> on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for @> on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for @> on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for <@ on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for <@ on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for <@ on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4 (domain, text). ---! @param a eql_v2_int4 +--! @brief Blocker for -> on eql_v3.int4 (domain, text). +--! @param a eql_v3.int4 --! @param selector text ---! @return eql_v2_int4 (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4, selector text) -RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4'; END; $$ +--! @return eql_v3.int4 (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4, selector text) +RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4 (domain, integer). ---! @param a eql_v2_int4 +--! @brief Blocker for -> on eql_v3.int4 (domain, integer). +--! @param a eql_v3.int4 --! @param selector integer ---! @return eql_v2_int4 (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4, selector integer) -RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4'; END; $$ +--! @return eql_v3.int4 (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4, selector integer) +RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for -> on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4 ---! @return eql_v2_int4 (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4) -RETURNS eql_v2_int4 IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4'; END; $$ +--! @param selector eql_v3.int4 +--! @return eql_v3.int4 (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4) +RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4 (domain, text). ---! @param a eql_v2_int4 +--! @brief Blocker for ->> on eql_v3.int4 (domain, text). +--! @param a eql_v3.int4 --! @param selector text --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4, selector text) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4, selector text) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4 (domain, integer). ---! @param a eql_v2_int4 +--! @brief Blocker for ->> on eql_v3.int4 (domain, integer). +--! @param a eql_v3.int4 --! @param selector integer --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4, selector integer) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for ->> on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4 +--! @param selector eql_v3.int4 --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4) +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v2_int4 (domain, text). ---! @param a eql_v2_int4 +--! @brief Blocker for ? on eql_v3.int4 (domain, text). +--! @param a eql_v3.int4 --! @param b text --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?"(a eql_v2_int4, b text) +CREATE FUNCTION eql_v3."?"(a eql_v3.int4, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v2_int4 (domain, text[]). ---! @param a eql_v2_int4 +--! @brief Blocker for ?| on eql_v3.int4 (domain, text[]). +--! @param a eql_v3.int4 --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?|"(a eql_v2_int4, b text[]) +CREATE FUNCTION eql_v3."?|"(a eql_v3.int4, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '?|'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '?|'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v2_int4 (domain, text[]). ---! @param a eql_v2_int4 +--! @brief Blocker for ?& on eql_v3.int4 (domain, text[]). +--! @param a eql_v3.int4 --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?&"(a eql_v2_int4, b text[]) +CREATE FUNCTION eql_v3."?&"(a eql_v3.int4, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '?&'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '?&'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v2_int4 (domain, jsonpath). ---! @param a eql_v2_int4 +--! @brief Blocker for @? on eql_v3.int4 (domain, jsonpath). +--! @param a eql_v3.int4 --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@?"(a eql_v2_int4, b jsonpath) +CREATE FUNCTION eql_v3."@?"(a eql_v3.int4, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v2_int4 (domain, jsonpath). ---! @param a eql_v2_int4 +--! @brief Blocker for @@ on eql_v3.int4 (domain, jsonpath). +--! @param a eql_v3.int4 --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@@"(a eql_v2_int4, b jsonpath) +CREATE FUNCTION eql_v3."@@"(a eql_v3.int4, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '@@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v2_int4 (domain, text[]). ---! @param a eql_v2_int4 +--! @brief Blocker for #> on eql_v3.int4 (domain, text[]). +--! @param a eql_v3.int4 --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#>"(a eql_v2_int4, b text[]) +CREATE FUNCTION eql_v3."#>"(a eql_v3.int4, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v2_int4 (domain, text[]). ---! @param a eql_v2_int4 +--! @brief Blocker for #>> on eql_v3.int4 (domain, text[]). +--! @param a eql_v3.int4 --! @param b text[] --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4, b text[]) +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4 (domain, text). ---! @param a eql_v2_int4 +--! @brief Blocker for - on eql_v3.int4 (domain, text). +--! @param a eql_v3.int4 --! @param b text --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4, b text) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4 (domain, integer). ---! @param a eql_v2_int4 +--! @brief Blocker for - on eql_v3.int4 (domain, integer). +--! @param a eql_v3.int4 --! @param b integer --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4, b integer) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4 (domain, text[]). ---! @param a eql_v2_int4 +--! @brief Blocker for - on eql_v3.int4 (domain, text[]). +--! @param a eql_v3.int4 --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4, b text[]) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v2_int4 (domain, text[]). ---! @param a eql_v2_int4 +--! @brief Blocker for #- on eql_v3.int4 (domain, text[]). +--! @param a eql_v3.int4 --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#-"(a eql_v2_int4, b text[]) +CREATE FUNCTION eql_v3."#-"(a eql_v3.int4, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4. ---! @param a eql_v2_int4 ---! @param b eql_v2_int4 +--! @brief Blocker for || on eql_v3.int4. +--! @param a eql_v3.int4 +--! @param b eql_v3.int4 --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4, b eql_v2_int4) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4, b eql_v3.int4) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4 (domain, jsonb). ---! @param a eql_v2_int4 +--! @brief Blocker for || on eql_v3.int4 (domain, jsonb). +--! @param a eql_v3.int4 --! @param b jsonb --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4, b jsonb) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4 (jsonb, domain). +--! @brief Blocker for || on eql_v3.int4 (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4 +--! @param b eql_v3.int4 --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4) +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_operators.sql b/tests/codegen/reference/int4/int4_operators.sql index fc3dd7cf4..24ff16077 100644 --- a/tests/codegen/reference/int4/int4_operators.sql +++ b/tests/codegen/reference/int4/int4_operators.sql @@ -1,5 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_functions.sql @@ -8,264 +8,264 @@ -- Placeholder: this domain's term set does not support =; the backing function always raises. CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support =; the backing function always raises. CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support =; the backing function always raises. CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <>; the backing function always raises. CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <>; the backing function always raises. CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <>; the backing function always raises. CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4, RIGHTARG = text + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4, RIGHTARG = integer + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4, RIGHTARG = text + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4, RIGHTARG = integer + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( - FUNCTION = eql_v2."?", - LEFTARG = eql_v2_int4, RIGHTARG = text + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int4, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( - FUNCTION = eql_v2."?|", - LEFTARG = eql_v2_int4, RIGHTARG = text[] + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int4, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( - FUNCTION = eql_v2."?&", - LEFTARG = eql_v2_int4, RIGHTARG = text[] + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int4, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( - FUNCTION = eql_v2."@?", - LEFTARG = eql_v2_int4, RIGHTARG = jsonpath + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int4, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( - FUNCTION = eql_v2."@@", - LEFTARG = eql_v2_int4, RIGHTARG = jsonpath + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int4, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( - FUNCTION = eql_v2."#>", - LEFTARG = eql_v2_int4, RIGHTARG = text[] + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int4, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( - FUNCTION = eql_v2."#>>", - LEFTARG = eql_v2_int4, RIGHTARG = text[] + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int4, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4, RIGHTARG = text + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4, RIGHTARG = text ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4, RIGHTARG = integer + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4, RIGHTARG = text[] + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( - FUNCTION = eql_v2."#-", - LEFTARG = eql_v2_int4, RIGHTARG = text[] + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int4, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4, RIGHTARG = jsonb + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4 + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); diff --git a/tests/codegen/reference/int4/int4_ord_aggregates.sql b/tests/codegen/reference/int4/int4_ord_aggregates.sql index 52a64ec1e..12f5efccc 100644 --- a/tests/codegen/reference/int4/int4_ord_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_aggregates.sql @@ -1,5 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql @@ -7,18 +7,18 @@ --! @file encrypted_domain/int4/int4_ord_aggregates.sql --! @brief Ordered domain of the int4 encrypted-domain family — MIN/MAX aggregates. ---! @brief State function for min aggregate on eql_v2_int4_ord. +--! @brief State function for min aggregate on eql_v3.int4_ord. --! @internal --! ---! @param state eql_v2_int4_ord running extremum ---! @param value eql_v2_int4_ord next non-NULL value ---! @return eql_v2_int4_ord the minimum of state and value +--! @param state eql_v3.int4_ord running extremum +--! @param value eql_v3.int4_ord next non-NULL value +--! @return eql_v3.int4_ord the minimum of state and value -- LANGUAGE plpgsql, not sql: aggregate state functions are not index -- expressions, so opacity to the planner is fine, and a multi-statement -- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would -- also work, but the procedural form mirrors the blocker convention.) -CREATE FUNCTION eql_v2.min_sfunc(state eql_v2_int4_ord, value eql_v2_int4_ord) -RETURNS eql_v2_int4_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int4_ord, value eql_v3.int4_ord) +RETURNS eql_v3.int4_ord LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ @@ -30,34 +30,34 @@ BEGIN END; $$; ---! @brief Find the minimum encrypted value in a group of eql_v2_int4_ord values. +--! @brief Find the minimum encrypted value in a group of eql_v3.int4_ord values. --! --! Comparison routes through the domain's `<` operator, which uses the ORE block term — no decryption. --! ---! @param input eql_v2_int4_ord encrypted values to aggregate ---! @return eql_v2_int4_ord minimum of the group, or NULL if all inputs are NULL +--! @param input eql_v3.int4_ord encrypted values to aggregate +--! @return eql_v3.int4_ord minimum of the group, or NULL if all inputs are NULL -- combinefunc = sfunc: min/max are associative, so merging two partial -- extrema is the same comparison. PARALLEL SAFE enables partial and -- parallel aggregation on large GROUP BY workloads, with no decryption. -CREATE AGGREGATE eql_v2.min(eql_v2_int4_ord) ( - sfunc = eql_v2.min_sfunc, - stype = eql_v2_int4_ord, - combinefunc = eql_v2.min_sfunc, +CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.int4_ord, + combinefunc = eql_v3.min_sfunc, parallel = safe ); ---! @brief State function for max aggregate on eql_v2_int4_ord. +--! @brief State function for max aggregate on eql_v3.int4_ord. --! @internal --! ---! @param state eql_v2_int4_ord running extremum ---! @param value eql_v2_int4_ord next non-NULL value ---! @return eql_v2_int4_ord the maximum of state and value +--! @param state eql_v3.int4_ord running extremum +--! @param value eql_v3.int4_ord next non-NULL value +--! @return eql_v3.int4_ord the maximum of state and value -- LANGUAGE plpgsql, not sql: aggregate state functions are not index -- expressions, so opacity to the planner is fine, and a multi-statement -- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would -- also work, but the procedural form mirrors the blocker convention.) -CREATE FUNCTION eql_v2.max_sfunc(state eql_v2_int4_ord, value eql_v2_int4_ord) -RETURNS eql_v2_int4_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int4_ord, value eql_v3.int4_ord) +RETURNS eql_v3.int4_ord LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ @@ -69,18 +69,18 @@ BEGIN END; $$; ---! @brief Find the maximum encrypted value in a group of eql_v2_int4_ord values. +--! @brief Find the maximum encrypted value in a group of eql_v3.int4_ord values. --! --! Comparison routes through the domain's `>` operator, which uses the ORE block term — no decryption. --! ---! @param input eql_v2_int4_ord encrypted values to aggregate ---! @return eql_v2_int4_ord maximum of the group, or NULL if all inputs are NULL +--! @param input eql_v3.int4_ord encrypted values to aggregate +--! @return eql_v3.int4_ord maximum of the group, or NULL if all inputs are NULL -- combinefunc = sfunc: min/max are associative, so merging two partial -- extrema is the same comparison. PARALLEL SAFE enables partial and -- parallel aggregation on large GROUP BY workloads, with no decryption. -CREATE AGGREGATE eql_v2.max(eql_v2_int4_ord) ( - sfunc = eql_v2.max_sfunc, - stype = eql_v2_int4_ord, - combinefunc = eql_v2.max_sfunc, +CREATE AGGREGATE eql_v3.max(eql_v3.int4_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.int4_ord, + combinefunc = eql_v3.max_sfunc, parallel = safe ); diff --git a/tests/codegen/reference/int4/int4_ord_functions.sql b/tests/codegen/reference/int4/int4_ord_functions.sql index 9d3ba2a29..a49bb1e99 100644 --- a/tests/codegen/reference/int4/int4_ord_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_functions.sql @@ -1,5 +1,6 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md -- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/functions.sql -- REQUIRE: src/ore_block_u64_8_256/functions.sql @@ -8,388 +9,388 @@ --! @file encrypted_domain/int4/int4_ord_functions.sql --! @brief Ordered domain of the int4 encrypted-domain family — comparison/path functions. ---! @brief Index extractor for the eql_v2_int4_ord variant. ---! @param a eql_v2_int4_ord +--! @brief Index extractor for the eql_v3.int4_ord variant. +--! @param a eql_v3.int4_ord --! @return eql_v2.ore_block_u64_8_256 -CREATE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; ---! @brief Equality wrapper for eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Equality wrapper for eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Equality wrapper for eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Equality wrapper for eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b::eql_v2_int4_ord) $$; +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Equality wrapper for eql_v2_int4_ord (jsonb, domain). +--! @brief Equality wrapper for eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) = eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) = eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Inequality wrapper for eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Inequality wrapper for eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b::eql_v2_int4_ord) $$; +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Inequality wrapper for eql_v2_int4_ord (jsonb, domain). +--! @brief Inequality wrapper for eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) <> eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) <> eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Less-than wrapper for eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Less-than wrapper for eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b::eql_v2_int4_ord) $$; +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Less-than wrapper for eql_v2_int4_ord (jsonb, domain). +--! @brief Less-than wrapper for eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) < eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) < eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Less-than-or-equal wrapper for eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Less-than-or-equal wrapper for eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b::eql_v2_int4_ord) $$; +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Less-than-or-equal wrapper for eql_v2_int4_ord (jsonb, domain). +--! @brief Less-than-or-equal wrapper for eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) <= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) <= eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Greater-than wrapper for eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Greater-than wrapper for eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b::eql_v2_int4_ord) $$; +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Greater-than wrapper for eql_v2_int4_ord (jsonb, domain). +--! @brief Greater-than wrapper for eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) > eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) > eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b::eql_v2_int4_ord) $$; +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord (jsonb, domain). +--! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean -CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord) >= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) >= eql_v3.ord_term(b) $$; ---! @brief Blocker for @> on eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Blocker for @> on eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Blocker for @> on eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4_ord (jsonb, domain). +--! @brief Blocker for @> on eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Blocker for <@ on eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Blocker for <@ on eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_ord (jsonb, domain). +--! @brief Blocker for <@ on eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_ord (domain, text). ---! @param a eql_v2_int4_ord +--! @brief Blocker for -> on eql_v3.int4_ord (domain, text). +--! @param a eql_v3.int4_ord --! @param selector text ---! @return eql_v2_int4_ord (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord, selector text) -RETURNS eql_v2_int4_ord IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord'; END; $$ +--! @return eql_v3.int4_ord (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord, selector text) +RETURNS eql_v3.int4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_ord (domain, integer). ---! @param a eql_v2_int4_ord +--! @brief Blocker for -> on eql_v3.int4_ord (domain, integer). +--! @param a eql_v3.int4_ord --! @param selector integer ---! @return eql_v2_int4_ord (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord, selector integer) -RETURNS eql_v2_int4_ord IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord'; END; $$ +--! @return eql_v3.int4_ord (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord, selector integer) +RETURNS eql_v3.int4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_ord (jsonb, domain). +--! @brief Blocker for -> on eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4_ord ---! @return eql_v2_int4_ord (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4_ord) -RETURNS eql_v2_int4_ord IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord'; END; $$ +--! @param selector eql_v3.int4_ord +--! @return eql_v3.int4_ord (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4_ord) +RETURNS eql_v3.int4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_ord (domain, text). ---! @param a eql_v2_int4_ord +--! @brief Blocker for ->> on eql_v3.int4_ord (domain, text). +--! @param a eql_v3.int4_ord --! @param selector text --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord, selector text) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord, selector text) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_ord (domain, integer). ---! @param a eql_v2_int4_ord +--! @brief Blocker for ->> on eql_v3.int4_ord (domain, integer). +--! @param a eql_v3.int4_ord --! @param selector integer --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord, selector integer) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_ord (jsonb, domain). +--! @brief Blocker for ->> on eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4_ord +--! @param selector eql_v3.int4_ord --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4_ord) +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4_ord) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v2_int4_ord (domain, text). ---! @param a eql_v2_int4_ord +--! @brief Blocker for ? on eql_v3.int4_ord (domain, text). +--! @param a eql_v3.int4_ord --! @param b text --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?"(a eql_v2_int4_ord, b text) +CREATE FUNCTION eql_v3."?"(a eql_v3.int4_ord, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v2_int4_ord (domain, text[]). ---! @param a eql_v2_int4_ord +--! @brief Blocker for ?| on eql_v3.int4_ord (domain, text[]). +--! @param a eql_v3.int4_ord --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?|"(a eql_v2_int4_ord, b text[]) +CREATE FUNCTION eql_v3."?|"(a eql_v3.int4_ord, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '?|'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '?|'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v2_int4_ord (domain, text[]). ---! @param a eql_v2_int4_ord +--! @brief Blocker for ?& on eql_v3.int4_ord (domain, text[]). +--! @param a eql_v3.int4_ord --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?&"(a eql_v2_int4_ord, b text[]) +CREATE FUNCTION eql_v3."?&"(a eql_v3.int4_ord, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '?&'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '?&'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v2_int4_ord (domain, jsonpath). ---! @param a eql_v2_int4_ord +--! @brief Blocker for @? on eql_v3.int4_ord (domain, jsonpath). +--! @param a eql_v3.int4_ord --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@?"(a eql_v2_int4_ord, b jsonpath) +CREATE FUNCTION eql_v3."@?"(a eql_v3.int4_ord, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v2_int4_ord (domain, jsonpath). ---! @param a eql_v2_int4_ord +--! @brief Blocker for @@ on eql_v3.int4_ord (domain, jsonpath). +--! @param a eql_v3.int4_ord --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@@"(a eql_v2_int4_ord, b jsonpath) +CREATE FUNCTION eql_v3."@@"(a eql_v3.int4_ord, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '@@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v2_int4_ord (domain, text[]). ---! @param a eql_v2_int4_ord +--! @brief Blocker for #> on eql_v3.int4_ord (domain, text[]). +--! @param a eql_v3.int4_ord --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#>"(a eql_v2_int4_ord, b text[]) +CREATE FUNCTION eql_v3."#>"(a eql_v3.int4_ord, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v2_int4_ord (domain, text[]). ---! @param a eql_v2_int4_ord +--! @brief Blocker for #>> on eql_v3.int4_ord (domain, text[]). +--! @param a eql_v3.int4_ord --! @param b text[] --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4_ord, b text[]) +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4_ord, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_ord (domain, text). ---! @param a eql_v2_int4_ord +--! @brief Blocker for - on eql_v3.int4_ord (domain, text). +--! @param a eql_v3.int4_ord --! @param b text --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord, b text) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_ord (domain, integer). ---! @param a eql_v2_int4_ord +--! @brief Blocker for - on eql_v3.int4_ord (domain, integer). +--! @param a eql_v3.int4_ord --! @param b integer --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord, b integer) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_ord (domain, text[]). ---! @param a eql_v2_int4_ord +--! @brief Blocker for - on eql_v3.int4_ord (domain, text[]). +--! @param a eql_v3.int4_ord --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord, b text[]) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v2_int4_ord (domain, text[]). ---! @param a eql_v2_int4_ord +--! @brief Blocker for #- on eql_v3.int4_ord (domain, text[]). +--! @param a eql_v3.int4_ord --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#-"(a eql_v2_int4_ord, b text[]) +CREATE FUNCTION eql_v3."#-"(a eql_v3.int4_ord, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_ord. ---! @param a eql_v2_int4_ord ---! @param b eql_v2_int4_ord +--! @brief Blocker for || on eql_v3.int4_ord. +--! @param a eql_v3.int4_ord +--! @param b eql_v3.int4_ord --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_ord (domain, jsonb). ---! @param a eql_v2_int4_ord +--! @brief Blocker for || on eql_v3.int4_ord (domain, jsonb). +--! @param a eql_v3.int4_ord --! @param b jsonb --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord, b jsonb) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_ord (jsonb, domain). +--! @brief Blocker for || on eql_v3.int4_ord (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord +--! @param b eql_v3.int4_ord --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4_ord) +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4_ord) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_ord_operators.sql b/tests/codegen/reference/int4/int4_ord_operators.sql index 3e3657f96..f52ecebb8 100644 --- a/tests/codegen/reference/int4/int4_ord_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_operators.sql @@ -1,5 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql @@ -7,265 +7,265 @@ --! @brief Ordered domain of the int4 encrypted-domain family — operator declarations. CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb, + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord, + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4_ord, RIGHTARG = integer + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4_ord, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4_ord, RIGHTARG = integer + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4_ord, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); -- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( - FUNCTION = eql_v2."?", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( - FUNCTION = eql_v2."?|", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( - FUNCTION = eql_v2."?&", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( - FUNCTION = eql_v2."@?", - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonpath + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( - FUNCTION = eql_v2."@@", - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonpath + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( - FUNCTION = eql_v2."#>", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( - FUNCTION = eql_v2."#>>", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_ord, RIGHTARG = integer + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_ord, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( - FUNCTION = eql_v2."#-", - LEFTARG = eql_v2_int4_ord, RIGHTARG = text[] + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4_ord, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4_ord, RIGHTARG = jsonb + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); diff --git a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql index f2f1e81e8..263964592 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql @@ -1,5 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_operators.sql @@ -7,18 +7,18 @@ --! @file encrypted_domain/int4/int4_ord_ore_aggregates.sql --! @brief Ordered domain of the int4 encrypted-domain family — MIN/MAX aggregates. ---! @brief State function for min aggregate on eql_v2_int4_ord_ore. +--! @brief State function for min aggregate on eql_v3.int4_ord_ore. --! @internal --! ---! @param state eql_v2_int4_ord_ore running extremum ---! @param value eql_v2_int4_ord_ore next non-NULL value ---! @return eql_v2_int4_ord_ore the minimum of state and value +--! @param state eql_v3.int4_ord_ore running extremum +--! @param value eql_v3.int4_ord_ore next non-NULL value +--! @return eql_v3.int4_ord_ore the minimum of state and value -- LANGUAGE plpgsql, not sql: aggregate state functions are not index -- expressions, so opacity to the planner is fine, and a multi-statement -- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would -- also work, but the procedural form mirrors the blocker convention.) -CREATE FUNCTION eql_v2.min_sfunc(state eql_v2_int4_ord_ore, value eql_v2_int4_ord_ore) -RETURNS eql_v2_int4_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int4_ord_ore, value eql_v3.int4_ord_ore) +RETURNS eql_v3.int4_ord_ore LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ @@ -30,34 +30,34 @@ BEGIN END; $$; ---! @brief Find the minimum encrypted value in a group of eql_v2_int4_ord_ore values. +--! @brief Find the minimum encrypted value in a group of eql_v3.int4_ord_ore values. --! --! Comparison routes through the domain's `<` operator, which uses the ORE block term — no decryption. --! ---! @param input eql_v2_int4_ord_ore encrypted values to aggregate ---! @return eql_v2_int4_ord_ore minimum of the group, or NULL if all inputs are NULL +--! @param input eql_v3.int4_ord_ore encrypted values to aggregate +--! @return eql_v3.int4_ord_ore minimum of the group, or NULL if all inputs are NULL -- combinefunc = sfunc: min/max are associative, so merging two partial -- extrema is the same comparison. PARALLEL SAFE enables partial and -- parallel aggregation on large GROUP BY workloads, with no decryption. -CREATE AGGREGATE eql_v2.min(eql_v2_int4_ord_ore) ( - sfunc = eql_v2.min_sfunc, - stype = eql_v2_int4_ord_ore, - combinefunc = eql_v2.min_sfunc, +CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.int4_ord_ore, + combinefunc = eql_v3.min_sfunc, parallel = safe ); ---! @brief State function for max aggregate on eql_v2_int4_ord_ore. +--! @brief State function for max aggregate on eql_v3.int4_ord_ore. --! @internal --! ---! @param state eql_v2_int4_ord_ore running extremum ---! @param value eql_v2_int4_ord_ore next non-NULL value ---! @return eql_v2_int4_ord_ore the maximum of state and value +--! @param state eql_v3.int4_ord_ore running extremum +--! @param value eql_v3.int4_ord_ore next non-NULL value +--! @return eql_v3.int4_ord_ore the maximum of state and value -- LANGUAGE plpgsql, not sql: aggregate state functions are not index -- expressions, so opacity to the planner is fine, and a multi-statement -- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would -- also work, but the procedural form mirrors the blocker convention.) -CREATE FUNCTION eql_v2.max_sfunc(state eql_v2_int4_ord_ore, value eql_v2_int4_ord_ore) -RETURNS eql_v2_int4_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int4_ord_ore, value eql_v3.int4_ord_ore) +RETURNS eql_v3.int4_ord_ore LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ @@ -69,18 +69,18 @@ BEGIN END; $$; ---! @brief Find the maximum encrypted value in a group of eql_v2_int4_ord_ore values. +--! @brief Find the maximum encrypted value in a group of eql_v3.int4_ord_ore values. --! --! Comparison routes through the domain's `>` operator, which uses the ORE block term — no decryption. --! ---! @param input eql_v2_int4_ord_ore encrypted values to aggregate ---! @return eql_v2_int4_ord_ore maximum of the group, or NULL if all inputs are NULL +--! @param input eql_v3.int4_ord_ore encrypted values to aggregate +--! @return eql_v3.int4_ord_ore maximum of the group, or NULL if all inputs are NULL -- combinefunc = sfunc: min/max are associative, so merging two partial -- extrema is the same comparison. PARALLEL SAFE enables partial and -- parallel aggregation on large GROUP BY workloads, with no decryption. -CREATE AGGREGATE eql_v2.max(eql_v2_int4_ord_ore) ( - sfunc = eql_v2.max_sfunc, - stype = eql_v2_int4_ord_ore, - combinefunc = eql_v2.max_sfunc, +CREATE AGGREGATE eql_v3.max(eql_v3.int4_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.int4_ord_ore, + combinefunc = eql_v3.max_sfunc, parallel = safe ); diff --git a/tests/codegen/reference/int4/int4_ord_ore_functions.sql b/tests/codegen/reference/int4/int4_ord_ore_functions.sql index bd6fe8b40..005bf6720 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_functions.sql @@ -1,5 +1,6 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md -- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/functions.sql -- REQUIRE: src/ore_block_u64_8_256/functions.sql @@ -8,388 +9,388 @@ --! @file encrypted_domain/int4/int4_ord_ore_functions.sql --! @brief Ordered domain of the int4 encrypted-domain family — comparison/path functions. ---! @brief Index extractor for the eql_v2_int4_ord_ore variant. ---! @param a eql_v2_int4_ord_ore +--! @brief Index extractor for the eql_v3.int4_ord_ore variant. +--! @param a eql_v3.int4_ord_ore --! @return eql_v2.ore_block_u64_8_256 -CREATE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; ---! @brief Equality wrapper for eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Equality wrapper for eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Equality wrapper for eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Equality wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.eq(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) = eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Equality wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Equality wrapper for eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.eq(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) = eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) = eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Inequality wrapper for eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Inequality wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.neq(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <> eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Inequality wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Inequality wrapper for eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.neq(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) <> eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) <> eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Less-than wrapper for eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Less-than wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.lt(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) < eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Less-than wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Less-than wrapper for eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.lt(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) < eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) < eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Less-than-or-equal wrapper for eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Less-than-or-equal wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.lte(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) <= eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Less-than-or-equal wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Less-than-or-equal wrapper for eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.lte(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) <= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) <= eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Greater-than wrapper for eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Greater-than wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.gt(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) > eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Greater-than wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Greater-than wrapper for eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.gt(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) > eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) > eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean -CREATE FUNCTION eql_v2.gte(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a) >= eql_v2.ord_term(b::eql_v2_int4_ord_ore) $$; +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Greater-than-or-equal wrapper for eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean -CREATE FUNCTION eql_v2.gte(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ord_term(a::eql_v2_int4_ord_ore) >= eql_v2.ord_term(b) $$; +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) >= eql_v3.ord_term(b) $$; ---! @brief Blocker for @> on eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Blocker for @> on eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for @> on eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Blocker for @> on eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contains(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@>'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@>'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Blocker for <@ on eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for <@ on eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Blocker for <@ on eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2.contained_by(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '<@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '<@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_ord_ore (domain, text). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for -> on eql_v3.int4_ord_ore (domain, text). +--! @param a eql_v3.int4_ord_ore --! @param selector text ---! @return eql_v2_int4_ord_ore (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord_ore, selector text) -RETURNS eql_v2_int4_ord_ore IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord_ore'; END; $$ +--! @return eql_v3.int4_ord_ore (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord_ore, selector text) +RETURNS eql_v3.int4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_ord_ore (domain, integer). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for -> on eql_v3.int4_ord_ore (domain, integer). +--! @param a eql_v3.int4_ord_ore --! @param selector integer ---! @return eql_v2_int4_ord_ore (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a eql_v2_int4_ord_ore, selector integer) -RETURNS eql_v2_int4_ord_ore IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord_ore'; END; $$ +--! @return eql_v3.int4_ord_ore (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord_ore, selector integer) +RETURNS eql_v3.int4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Blocker for -> on eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4_ord_ore ---! @return eql_v2_int4_ord_ore (never returns; always raises) -CREATE FUNCTION eql_v2."->"(a jsonb, selector eql_v2_int4_ord_ore) -RETURNS eql_v2_int4_ord_ore IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v2_int4_ord_ore'; END; $$ +--! @param selector eql_v3.int4_ord_ore +--! @return eql_v3.int4_ord_ore (never returns; always raises) +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4_ord_ore) +RETURNS eql_v3.int4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_ord_ore (domain, text). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for ->> on eql_v3.int4_ord_ore (domain, text). +--! @param a eql_v3.int4_ord_ore --! @param selector text --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord_ore, selector text) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord_ore, selector text) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_ord_ore (domain, integer). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for ->> on eql_v3.int4_ord_ore (domain, integer). +--! @param a eql_v3.int4_ord_ore --! @param selector integer --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a eql_v2_int4_ord_ore, selector integer) +CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord_ore, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Blocker for ->> on eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param selector eql_v2_int4_ord_ore +--! @param selector eql_v3.int4_ord_ore --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."->>"(a jsonb, selector eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4_ord_ore) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v2_int4_ord_ore (domain, text). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for ? on eql_v3.int4_ord_ore (domain, text). +--! @param a eql_v3.int4_ord_ore --! @param b text --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?"(a eql_v2_int4_ord_ore, b text) +CREATE FUNCTION eql_v3."?"(a eql_v3.int4_ord_ore, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v2_int4_ord_ore (domain, text[]). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for ?| on eql_v3.int4_ord_ore (domain, text[]). +--! @param a eql_v3.int4_ord_ore --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?|"(a eql_v2_int4_ord_ore, b text[]) +CREATE FUNCTION eql_v3."?|"(a eql_v3.int4_ord_ore, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '?|'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '?|'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v2_int4_ord_ore (domain, text[]). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for ?& on eql_v3.int4_ord_ore (domain, text[]). +--! @param a eql_v3.int4_ord_ore --! @param b text[] --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."?&"(a eql_v2_int4_ord_ore, b text[]) +CREATE FUNCTION eql_v3."?&"(a eql_v3.int4_ord_ore, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '?&'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '?&'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v2_int4_ord_ore (domain, jsonpath). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for @? on eql_v3.int4_ord_ore (domain, jsonpath). +--! @param a eql_v3.int4_ord_ore --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@?"(a eql_v2_int4_ord_ore, b jsonpath) +CREATE FUNCTION eql_v3."@?"(a eql_v3.int4_ord_ore, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@?'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@?'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v2_int4_ord_ore (domain, jsonpath). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for @@ on eql_v3.int4_ord_ore (domain, jsonpath). +--! @param a eql_v3.int4_ord_ore --! @param b jsonpath --! @return boolean (never returns; always raises) -CREATE FUNCTION eql_v2."@@"(a eql_v2_int4_ord_ore, b jsonpath) +CREATE FUNCTION eql_v3."@@"(a eql_v3.int4_ord_ore, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord_ore', '@@'); END; $$ +AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@@'); END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v2_int4_ord_ore (domain, text[]). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for #> on eql_v3.int4_ord_ore (domain, text[]). +--! @param a eql_v3.int4_ord_ore --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#>"(a eql_v2_int4_ord_ore, b text[]) +CREATE FUNCTION eql_v3."#>"(a eql_v3.int4_ord_ore, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v2_int4_ord_ore (domain, text[]). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for #>> on eql_v3.int4_ord_ore (domain, text[]). +--! @param a eql_v3.int4_ord_ore --! @param b text[] --! @return text (never returns; always raises) -CREATE FUNCTION eql_v2."#>>"(a eql_v2_int4_ord_ore, b text[]) +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4_ord_ore, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_ord_ore (domain, text). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for - on eql_v3.int4_ord_ore (domain, text). +--! @param a eql_v3.int4_ord_ore --! @param b text --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord_ore, b text) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord_ore, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_ord_ore (domain, integer). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for - on eql_v3.int4_ord_ore (domain, integer). +--! @param a eql_v3.int4_ord_ore --! @param b integer --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord_ore, b integer) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord_ore, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v2_int4_ord_ore (domain, text[]). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for - on eql_v3.int4_ord_ore (domain, text[]). +--! @param a eql_v3.int4_ord_ore --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."-"(a eql_v2_int4_ord_ore, b text[]) +CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord_ore, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v2_int4_ord_ore (domain, text[]). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for #- on eql_v3.int4_ord_ore (domain, text[]). +--! @param a eql_v3.int4_ord_ore --! @param b text[] --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."#-"(a eql_v2_int4_ord_ore, b text[]) +CREATE FUNCTION eql_v3."#-"(a eql_v3.int4_ord_ore, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_ord_ore. ---! @param a eql_v2_int4_ord_ore ---! @param b eql_v2_int4_ord_ore +--! @brief Blocker for || on eql_v3.int4_ord_ore. +--! @param a eql_v3.int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord_ore, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_ord_ore (domain, jsonb). ---! @param a eql_v2_int4_ord_ore +--! @brief Blocker for || on eql_v3.int4_ord_ore (domain, jsonb). +--! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a eql_v2_int4_ord_ore, b jsonb) +CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord_ore, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v2_int4_ord_ore (jsonb, domain). +--! @brief Blocker for || on eql_v3.int4_ord_ore (jsonb, domain). --! @param a jsonb ---! @param b eql_v2_int4_ord_ore +--! @param b eql_v3.int4_ord_ore --! @return jsonb (never returns; always raises) -CREATE FUNCTION eql_v2."||"(a jsonb, b eql_v2_int4_ord_ore) +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4_ord_ore) RETURNS jsonb IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v2_int4_ord_ore'; END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int4/int4_ord_ore_operators.sql b/tests/codegen/reference/int4/int4_ord_ore_operators.sql index ee1f84cfe..e6dc27e94 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_operators.sql @@ -1,5 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql @@ -7,265 +7,265 @@ --! @brief Ordered domain of the int4 encrypted-domain family — operator declarations. CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb, + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore, + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( - FUNCTION = eql_v2.contains, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( - FUNCTION = eql_v2.contained_by, - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = integer + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( - FUNCTION = eql_v2."->", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = integer + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( - FUNCTION = eql_v2."->>", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); -- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( - FUNCTION = eql_v2."?", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); -- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( - FUNCTION = eql_v2."?|", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( - FUNCTION = eql_v2."?&", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( - FUNCTION = eql_v2."@?", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonpath + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( - FUNCTION = eql_v2."@@", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonpath + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonpath ); -- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( - FUNCTION = eql_v2."#>", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( - FUNCTION = eql_v2."#>>", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = integer + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = integer ); -- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( - FUNCTION = eql_v2."-", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( - FUNCTION = eql_v2."#-", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = text[] + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = eql_v2_int4_ord_ore, RIGHTARG = jsonb + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb ); -- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( - FUNCTION = eql_v2."||", - LEFTARG = jsonb, RIGHTARG = eql_v2_int4_ord_ore + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); diff --git a/tests/codegen/reference/int4/int4_types.sql b/tests/codegen/reference/int4/int4_types.sql index f76165390..0b33e740c 100644 --- a/tests/codegen/reference/int4/int4_types.sql +++ b/tests/codegen/reference/int4/int4_types.sql @@ -1,5 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md --- REQUIRE: src/schema.sql +-- REQUIRE: src/schema-v3.sql --! @file encrypted_domain/int4/int4_types.sql --! @brief Encrypted-domain type family for int4. @@ -9,9 +9,9 @@ BEGIN --! @brief Storage-only encrypted int4 domain. IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'eql_v2_int4' AND typnamespace = 'public'::regnamespace + WHERE typname = 'int4' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.eql_v2_int4 AS jsonb + CREATE DOMAIN eql_v3.int4 AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -24,9 +24,9 @@ BEGIN --! @brief Equality-only encrypted int4 domain. IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'eql_v2_int4_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'int4_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.eql_v2_int4_eq AS jsonb + CREATE DOMAIN eql_v3.int4_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -40,9 +40,9 @@ BEGIN --! @brief Ordered encrypted int4 domain. Scheme-explicit twin pinning the ore scheme; prefer the converged int4_ord name. IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'eql_v2_int4_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'int4_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.eql_v2_int4_ord_ore AS jsonb + CREATE DOMAIN eql_v3.int4_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -56,9 +56,9 @@ BEGIN --! @brief Ordered encrypted int4 domain. Recommended converged name for this role. IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'eql_v2_int4_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'int4_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.eql_v2_int4_ord AS jsonb + CREATE DOMAIN eql_v3.int4_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 0d277af9d..8b8c09235 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -180,11 +180,11 @@ macro_rules! ordered_numeric_matrix { eq_ops = [(eq, "="), (neq, "<>")], ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], index_combos = [ - (eq, Eq, "eql_v2.eq_term", "btree", [(eq, "=")]), - (eq, Eq, "eql_v2.eq_term", "hash", [(eq, "=")]), - (ord, Ord, "eql_v2.ord_term", "btree", + (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), + (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), + (ord, Ord, "eql_v3.ord_term", "btree", [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), - (ord_ore, OrdOre, "eql_v2.ord_term", "btree", + (ord_ore, OrdOre, "eql_v3.ord_term", "btree", [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), ], blocker_combos = [ @@ -246,8 +246,8 @@ macro_rules! eq_only_scalar_matrix { eq_ops = [(eq, "="), (neq, "<>")], ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], index_combos = [ - (eq, Eq, "eql_v2.eq_term", "btree", [(eq, "=")]), - (eq, Eq, "eql_v2.eq_term", "hash", [(eq, "=")]), + (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), + (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), ], blocker_combos = [ (storage, Storage, [ @@ -1095,7 +1095,7 @@ macro_rules! __scalar_matrix_planner_metadata_case { JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright WHERE o.oprname IN ({op_list}) - AND (lt.typname = '{d}' OR rt.typname = '{d}') + AND ('{d}'::regtype = o.oprleft OR '{d}'::regtype = o.oprright) "# ); let rows: Vec<(String, String, String, bool, bool, bool, bool)> = @@ -1411,7 +1411,7 @@ macro_rules! __scalar_matrix_fixture_shape { // ============================================================================ // Ord-routes-through-ob category — ordered variants carry `c + ob` and // drop `hm`. Equality on an ord variant must therefore route through -// `eql_v2.ord_term` (the `ob` term), never HMAC. Strip `hm` from every +// `eql_v3.ord_term` (the `ob` term), never HMAC. Strip `hm` from every // fixture payload so an accidental regression to HMAC equality fails // rather than passing on the hm-carrying fixture. // ============================================================================ @@ -1474,7 +1474,7 @@ macro_rules! __scalar_matrix_ord_routes_case { anyhow::ensure!(with_hm == 0, "test rows must not carry hm"); sqlx::query(&format!( - "CREATE INDEX {index} ON {table} USING btree (eql_v2.ord_term(value))", + "CREATE INDEX {index} ON {table} USING btree (eql_v3.ord_term(value))", )).execute(&mut *tx).await?; sqlx::query(&format!("ANALYZE {table}")) .execute(&mut *tx).await?; @@ -1518,7 +1518,7 @@ macro_rules! __scalar_matrix_ord_routes_case { // VALIDITY, NOT PREFERENCE: this runs with // `enable_seqscan = off` (set above) on the ~17-row fixture, // so the planner picks the only usable alternative. A green - // assertion proves the `eql_v2.ord_term` functional btree is + // assertion proves the `eql_v3.ord_term` functional btree is // *usable* for `=` with no hm present, NOT that the planner // would *prefer* it at realistic scale. Cost-preference lives // in the `*_scale_preference_*` tests @@ -1534,7 +1534,7 @@ macro_rules! __scalar_matrix_ord_routes_case { &mut *tx, &format!("SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}"), index, - "= must engage the eql_v2.ord_term functional btree with no hm", + "= must engage the eql_v3.ord_term functional btree with no hm", ).await?; tx.commit().await?; @@ -1786,7 +1786,7 @@ macro_rules! __scalar_matrix_order_by_case { <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); let sql = format!( "SELECT plaintext FROM {fixture}{where_clause} \ -ORDER BY eql_v2.ord_term(payload::{d}) {dir}", +ORDER BY eql_v3.ord_term(payload::{d}) {dir}", fixture = fixture_table, where_clause = $where_clause, d = &spec.sql_domain, dir = $direction, ); @@ -1816,7 +1816,7 @@ ORDER BY eql_v2.ord_term(payload::{d}) {dir}", // which has no NULL rows, so NULLS placement goes untested there. This arm // builds an isolated temp table mixing NULL-valued rows with the fixture rows // and pins that the NULL sort keys land at the requested end while the -// non-NULL rows stay in plaintext order. `eql_v2.ord_term` is STRICT, so a +// non-NULL rows stay in plaintext order. `eql_v3.ord_term` is STRICT, so a // NULL domain value yields a NULL sort key; a regression making it non-STRICT // would let NULL rows interleave — see the `family::mutations` negative // control for that dimension. @@ -1911,7 +1911,7 @@ SELECT NULL::{pg}, NULL::{d} FROM generate_series(1, {n})", n = NULL_ROWS, let sql = format!( "SELECT plaintext FROM {table} \ -ORDER BY eql_v2.ord_term(value) {dir} NULLS {nulls}", +ORDER BY eql_v3.ord_term(value) {dir} NULLS {nulls}", dir = $direction, nulls = $nulls, ); let actual: Vec> = @@ -2029,7 +2029,7 @@ domain by design) but succeeded", // Aggregate category — per (ord domain, op ∈ {min, max}), three tests: // extremum identity (payload of the min/max FIXTURE_VALUES row), all-NULL // returns NULL, and mixed NULL/non-NULL returns the correct extremum from -// the non-NULL subset. Pins that `eql_v2.min` / `eql_v2.max` aggregates +// the non-NULL subset. Pins that `eql_v3.min` / `eql_v3.max` aggregates // route through the domain's `<` / `>` and that the STRICT state function // correctly seeds + skips NULLs. Emits zero tests when ord_domains is // empty — eq-only umbrellas pick that up naturally. @@ -2103,13 +2103,13 @@ macro_rules! __scalar_matrix_aggregate_case { )).fetch_one(&pool).await?; let actual: String = sqlx::query_scalar(&format!( - "SELECT eql_v2.{agg}(payload::{d})::text FROM {fixture}", + "SELECT eql_v3.{agg}(payload::{d})::text FROM {fixture}", agg = $agg_fn, )).fetch_one(&pool).await?; assert_eq!( actual, expected, - "eql_v2.{}({}) must return the payload of plaintext={:?} (the fixture {})", + "eql_v3.{}({}) must return the payload of plaintext={:?} (the fixture {})", $agg_fn, d, extremum, $agg_fn, ); @@ -2120,8 +2120,8 @@ macro_rules! __scalar_matrix_aggregate_case { // where payload text matches but `ord_term` resolves to a // different value (e.g. due to payload-key reordering). let ord_terms_match: bool = sqlx::query_scalar(&format!( - "SELECT eql_v2.ord_term(eql_v2.{agg}(payload::{d})) \ - = eql_v2.ord_term($1::jsonb::{d}) \ + "SELECT eql_v3.ord_term(eql_v3.{agg}(payload::{d})) \ + = eql_v3.ord_term($1::jsonb::{d}) \ FROM {fixture}", agg = $agg_fn, )) @@ -2130,7 +2130,7 @@ macro_rules! __scalar_matrix_aggregate_case { .await?; anyhow::ensure!( ord_terms_match, - "eql_v2.ord_term(eql_v2.{}({})) must equal eql_v2.ord_term() \ + "eql_v3.ord_term(eql_v3.{}({})) must equal eql_v3.ord_term() \ for plaintext={:?}", $agg_fn, d, extremum, ); @@ -2152,12 +2152,12 @@ macro_rules! __scalar_matrix_aggregate_case { "CREATE TEMP TABLE empty_agg (value {d}) ON COMMIT DROP", )).execute(&mut *tx).await?; let result: Option = sqlx::query_scalar(&format!( - "SELECT eql_v2.{agg}(value)::text FROM empty_agg", + "SELECT eql_v3.{agg}(value)::text FROM empty_agg", agg = $agg_fn, )).fetch_one(&mut *tx).await?; anyhow::ensure!( result.is_none(), - "empty rowset to eql_v2.{} on {} must return NULL, got {:?}", + "empty rowset to eql_v3.{} on {} must return NULL, got {:?}", $agg_fn, d, result, ); tx.commit().await?; @@ -2173,7 +2173,7 @@ macro_rules! __scalar_matrix_aggregate_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; let sql = format!( - "SELECT eql_v2.{agg}(NULL::{d})::text FROM generate_series(1, 3)", + "SELECT eql_v3.{agg}(NULL::{d})::text FROM generate_series(1, 3)", agg = $agg_fn, ); let result: Option = sqlx::query_scalar(&sql) @@ -2181,7 +2181,7 @@ macro_rules! __scalar_matrix_aggregate_case { .await?; anyhow::ensure!( result.is_none(), - "all-NULL input to eql_v2.{} on {} must return NULL, got {:?}; SQL={}", + "all-NULL input to eql_v3.{} on {} must return NULL, got {:?}; SQL={}", $agg_fn, d, result, sql, ); Ok(()) @@ -2237,13 +2237,13 @@ macro_rules! __scalar_matrix_aggregate_case { )).fetch_one(&mut *tx).await?; let actual: Option = sqlx::query_scalar(&format!( - "SELECT eql_v2.{agg}(value)::text FROM mixed_null", + "SELECT eql_v3.{agg}(value)::text FROM mixed_null", agg = $agg_fn, )).fetch_one(&mut *tx).await?; anyhow::ensure!( actual.as_deref() == Some(expected.as_str()), - "eql_v2.{} on mixed NULL/non-NULL must return the {} non-NULL value (plaintext={:?}); want {expected:?}, got {actual:?}", + "eql_v3.{} on mixed NULL/non-NULL must return the {} non-NULL value (plaintext={:?}); want {expected:?}, got {actual:?}", $agg_fn, $agg_fn, expected_plaintext, ); @@ -2320,7 +2320,7 @@ macro_rules! __scalar_matrix_aggregate_parallel_case { // Aggregate GROUP BY category — per (ord domain, op ∈ {min, max}), build a // temp table partitioned into two groups, populate each with a known // subset of fixture rows, GROUP BY the group key, and assert that -// `eql_v2.(value)` returns the correct extremum payload per group. +// `eql_v3.(value)` returns the correct extremum payload per group. // Pins that the aggregate composes correctly under GROUP BY (state is // reset between groups, the sfunc routes through the variant's // comparator inside each partition). @@ -2430,7 +2430,7 @@ SELECT 2, payload::{d} FROM {fixture} WHERE plaintext = {lit}", )).fetch_one(&mut *tx).await?; let rows: Vec<(i32, String)> = sqlx::query_as(&format!( - "SELECT group_key, eql_v2.{agg}(value)::text \ + "SELECT group_key, eql_v3.{agg}(value)::text \ FROM group_test GROUP BY group_key ORDER BY group_key", agg = $agg_fn, )).fetch_all(&mut *tx).await?; @@ -2442,13 +2442,13 @@ FROM group_test GROUP BY group_key ORDER BY group_key", ); anyhow::ensure!( rows[0].0 == 1 && rows[0].1 == g1_expected, - "group 1 eql_v2.{}({}) must yield payload for plaintext={:?}; \ + "group 1 eql_v3.{}({}) must yield payload for plaintext={:?}; \ want ({}, {:?}), got {:?}", $agg_fn, d, group1_extremum, 1, g1_expected, rows[0], ); anyhow::ensure!( rows[1].0 == 2 && rows[1].1 == g2_expected, - "group 2 eql_v2.{}({}) must yield payload for plaintext={:?}; \ + "group 2 eql_v3.{}({}) must yield payload for plaintext={:?}; \ want ({}, {:?}), got {:?}", $agg_fn, d, group2_extremum, 2, g2_expected, rows[1], ); @@ -2462,7 +2462,7 @@ want ({}, {:?}), got {:?}", // ============================================================================ // Aggregate type-safety category — for variants that do NOT support ord -// (Storage, Eq), `eql_v2.min()` / `eql_v2.max(...)` must +// (Storage, Eq), `eql_v3.min()` / `eql_v3.max(...)` must // resolve to "function does not exist" (SQLSTATE 42883). Pins that // codegen correctly omits MIN/MAX wrappers for these variants — a // SQL-level regression test complementing the codegen unit test. @@ -2548,14 +2548,14 @@ macro_rules! __scalar_matrix_aggregate_typecheck_case { // can succeed cleanly. sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; let sql = format!( - "SELECT eql_v2.{agg}(value) FROM typecheck_table", + "SELECT eql_v3.{agg}(value) FROM typecheck_table", agg = $agg_fn, ); let err = sqlx::query_scalar::<_, String>(&sql) .fetch_one(&mut *tx) .await .expect_err(&format!( - "eql_v2.{} on non-ord variant {} must raise but succeeded", + "eql_v3.{} on non-ord variant {} must raise but succeeded", $agg_fn, d, )); // 42883 = undefined_function (no overload defined at all); @@ -2571,7 +2571,7 @@ macro_rules! __scalar_matrix_aggregate_typecheck_case { anyhow::ensure!( code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), "expected SQLSTATE 42883 (undefined_function) or 42725 \ -(ambiguous_function) for eql_v2.{}({}), got {:?} (message: {})", +(ambiguous_function) for eql_v3.{}({}), got {:?} (message: {})", $agg_fn, d, code, db_err.message(), ); sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; @@ -2594,7 +2594,7 @@ macro_rules! __scalar_matrix_aggregate_typecheck_case { // which only covered plain COUNT and only against the eql_v2_encrypted // type. Pinning per-variant DISTINCT catches the breakage class where // picking the wrong extractor would fail at runtime ("function -// eql_v2.eq_term(eql_v2_int4_ord) does not exist") — exactly the kind of +// eql_v3.eq_term(eql_v3.int4_ord) does not exist") — exactly the kind of // thing the variant-aware matrix is meant to surface mechanically. // ============================================================================ @@ -2689,8 +2689,8 @@ macro_rules! __scalar_matrix_count_case { // Dispatch on variant ident: Storage has no discriminating extractor, so // emits no DISTINCT test. The other three (Eq, Ord, OrdOre) each emit one // test that reads the extractor function name from the runtime -// `ScalarDomainSpec::extractor_fn()` accessor (Eq -> `eql_v2.eq_term`, -// Ord/OrdOre -> `eql_v2.ord_term`) and appends `(value)` at the call site. +// `ScalarDomainSpec::extractor_fn()` accessor (Eq -> `eql_v3.eq_term`, +// Ord/OrdOre -> `eql_v3.ord_term`) and appends `(value)` at the call site. #[macro_export] #[doc(hidden)] macro_rules! __scalar_matrix_count_distinct_dispatch { diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index b31c1a554..e7567584a 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -143,20 +143,21 @@ impl Variant { /// or `None` if the variant carries no extractor (`Storage`). Returns /// just the function name — call sites append `(column)` themselves so /// the accessor is decoupled from any specific column-naming - /// convention. `Eq` resolves to `eql_v2.eq_term`; `Ord` and `OrdOre` - /// both resolve to `eql_v2.ord_term`. + /// convention. `Eq` resolves to `eql_v3.eq_term`; `Ord` and `OrdOre` + /// both resolve to `eql_v3.ord_term`. pub const fn extractor_fn(self) -> Option<&'static str> { match self { Variant::Storage => None, - Variant::Eq => Some("eql_v2.eq_term"), - Variant::Ord | Variant::OrdOre => Some("eql_v2.ord_term"), + Variant::Eq => Some("eql_v3.eq_term"), + Variant::Ord | Variant::OrdOre => Some("eql_v3.ord_term"), } } } /// Runtime spec built from `(T, Variant)`. The matrix macro consumes /// this; nothing here is `const` because `sql_domain` is derived via -/// `format!` from `T::PG_TYPE`. +/// `format!` from `T::PG_TYPE`. The domains live in the `eql_v3` schema, +/// so `sql_domain` is schema-qualified (e.g. `eql_v3.int4_eq`). #[derive(Debug, Clone)] pub struct ScalarDomainSpec { pub sql_domain: String, @@ -166,7 +167,7 @@ pub struct ScalarDomainSpec { impl ScalarDomainSpec { pub fn new(variant: Variant) -> Self { Self { - sql_domain: format!("eql_v2_{}{}", T::PG_TYPE, variant.suffix()), + sql_domain: format!("eql_v3.{}{}", T::PG_TYPE, variant.suffix()), variant, } } diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 373472287..3cacb605a 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -1,17 +1,18 @@ //! Global guard for the encrypted-domain inline-critical SQL surface. //! //! `tasks/pin_search_path.sql` runs after every build and pins a fixed -//! `search_path` on every `eql_v2` function — except the inline-critical -//! ones, which must stay unpinned so the planner can inline them and the -//! documented functional indexes (`eql_v2.eq_term(col)`, -//! `eql_v2.ord_term(col)`, …) engage. +//! `search_path` on every `eql_v2`/`eql_v3` function — except the +//! inline-critical ones, which must stay unpinned so the planner can +//! inline them and the documented functional indexes (`eql_v3.eq_term(col)`, +//! `eql_v3.ord_term(col)`, …) engage. //! //! The encrypted-domain family is skipped by a structural rule anchored //! on the *identity predicate*: a `LANGUAGE sql`, `IMMUTABLE` function -//! taking at least one argument typed as a jsonb-backed DOMAIN in -//! `public` named `eql_v2_*`. The identity predicate is -//! proconfig-independent — it describes what a function intrinsically -//! IS, not whether it has been pinned. +//! taking at least one argument typed as a jsonb-backed DOMAIN of the +//! encrypted-domain families — a domain in the `eql_v3` schema (e.g. +//! `eql_v3.int4_eq`) or the legacy `public.eql_v2_*` form. The identity +//! predicate is proconfig-independent — it describes what a function +//! intrinsically IS, not whether it has been pinned. //! //! This test is the global net for that rule. It uses the identity //! predicate VERBATIM and appends one offender filter: @@ -35,11 +36,12 @@ use sqlx::PgPool; async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> Result<()> { // The identity predicate is shared verbatim with the structural skip // clause in tasks/pin_search_path.sql: LANGUAGE sql, IMMUTABLE, and - // taking at least one argument typed as a `public.eql_v2_*` domain - // over jsonb. It is proconfig-independent. The ONLY addition here is - // the offender filter `p.proconfig IS NOT NULL` — a function that - // matches the identity predicate but DID get pinned. That set must be - // empty. + // taking at least one argument typed as an encrypted-domain-family + // domain over jsonb (an `eql_v3.*` domain or the legacy + // `public.eql_v2_*` form). It is proconfig-independent. The ONLY + // addition here is the offender filter `p.proconfig IS NOT NULL` — a + // function that matches the identity predicate but DID get pinned. + // That set must be empty. let offenders: Vec<(String, String)> = sqlx::query_as( r#" SELECT p.oid::regprocedure::text AS signature, @@ -47,7 +49,7 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language l ON l.oid = p.prolang - WHERE n.nspname = 'eql_v2' + WHERE n.nspname IN ('eql_v2', 'eql_v3') AND l.lanname = 'sql' AND p.provolatile = 'i' AND p.proconfig IS NOT NULL @@ -58,9 +60,11 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype WHERE dt.typtype = 'd' - AND dn.nspname = 'public' - AND dt.typname LIKE 'eql_v2\_%' AND bt.typname = 'jsonb' + AND ( + dn.nspname = 'eql_v3' + OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') + ) ) ORDER BY signature "#, @@ -88,17 +92,18 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( pool: PgPool, ) -> Result<()> { // Stronger than a bare `count > 0`: if a future change accidentally - // narrows the structural predicate (e.g. hard-codes `eql_v2_int4_%`), - // a `count > 0` assertion would still pass while int8/bool/date + // narrows the structural predicate (e.g. hard-codes `int4_%`), a + // `count > 0` assertion would still pass while int8/bool/date // domains silently lose inline-critical coverage. Instead, assert - // that EVERY inline-critical-eligible domain (any `public.eql_v2_*` - // domain over jsonb that carries a capability suffix — `_eq`, `_ord`, - // `_ord_ore`) appears as an argument type of at least one - // inline-critical function. + // that EVERY inline-critical-eligible domain (any encrypted-domain + // family domain over jsonb — `eql_v3.*` or legacy `public.eql_v2_*` — + // that carries a capability suffix — `_eq`, `_ord`, `_ord_ore`) + // appears as an argument type of at least one inline-critical + // function. // - // Storage-only variants (the bare `eql_v2_` domain, with no - // capability suffix) intentionally have NO inline-critical surface - // and are excluded from the eligibility set. + // Storage-only variants (the bare `eql_v3.` / `eql_v2_` domain, + // with no capability suffix) intentionally have NO inline-critical + // surface and are excluded from the eligibility set. let unbound: Vec = sqlx::query_scalar( r#" SELECT dt.typname @@ -106,9 +111,11 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype WHERE dt.typtype = 'd' - AND dn.nspname = 'public' AND bt.typname = 'jsonb' - AND dt.typname LIKE 'eql_v2\_%' + AND ( + dn.nspname = 'eql_v3' + OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') + ) AND ( dt.typname LIKE '%\_eq' OR dt.typname LIKE '%\_ord' @@ -119,7 +126,7 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language l ON l.oid = p.prolang - WHERE n.nspname = 'eql_v2' + WHERE n.nspname IN ('eql_v2', 'eql_v3') AND l.lanname = 'sql' AND p.provolatile = 'i' AND dt.oid = ANY(p.proargtypes::oid[]) @@ -158,7 +165,7 @@ async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> R FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language l ON l.oid = p.prolang - WHERE n.nspname = 'eql_v2' + WHERE n.nspname IN ('eql_v2', 'eql_v3') AND (p.prosrc LIKE '%encrypted_domain_unsupported_bool%' OR p.prosrc LIKE '%is not supported for%') AND EXISTS ( @@ -168,9 +175,11 @@ async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> R JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype WHERE dt.typtype = 'd' - AND dn.nspname = 'public' - AND dt.typname LIKE 'eql_v2\_%' AND bt.typname = 'jsonb' + AND ( + dn.nspname = 'eql_v3' + OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') + ) ) AND (l.lanname <> 'plpgsql' OR p.proisstrict) ORDER BY signature @@ -187,10 +196,10 @@ async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> R Ok(()) } -/// No `eql_v2_*` domain may be derived from another `eql_v2_*` domain — -/// operators resolve against the ultimate base type, so a derived domain -/// inherits jsonb's operator surface and not the base domain's blockers. -/// All family domains must be defined directly over jsonb. +/// No encrypted-domain family domain may be derived from another family +/// domain — operators resolve against the ultimate base type, so a derived +/// domain inherits jsonb's operator surface and not the base domain's +/// blockers. All family domains must be defined directly over jsonb. #[sqlx::test] async fn no_eql_v2_domain_is_derived_from_another_eql_v2_domain(pool: PgPool) -> Result<()> { let offenders: Vec<(String, String)> = sqlx::query_as( @@ -202,10 +211,15 @@ async fn no_eql_v2_domain_is_derived_from_another_eql_v2_domain(pool: PgPool) -> JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace WHERE dt.typtype = 'd' - AND dn.nspname = 'public' - AND dt.typname LIKE 'eql_v2\_%' + AND ( + dn.nspname = 'eql_v3' + OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') + ) AND bt.typtype = 'd' - AND bt.typname LIKE 'eql_v2\_%' + AND ( + bn.nspname = 'eql_v3' + OR (bn.nspname = 'public' AND bt.typname LIKE 'eql_v2\_%') + ) ORDER BY derived "#, ) @@ -214,16 +228,16 @@ async fn no_eql_v2_domain_is_derived_from_another_eql_v2_domain(pool: PgPool) -> assert!( offenders.is_empty(), - "eql_v2_* domains must be defined directly over jsonb, not derived \ - from another eql_v2_* domain. Offenders (derived, base): {offenders:#?}" + "encrypted-domain family domains must be defined directly over jsonb, \ + not derived from another family domain. Offenders (derived, base): {offenders:#?}" ); Ok(()) } -/// No operator class may be declared `FOR TYPE` on an `eql_v2_*` domain. -/// Opclasses on domains bypass the operator-resolution that storage -/// blockers depend on. The recommended index pattern is a functional -/// index on the extractor (e.g. `eql_v2.eq_term(col)`). +/// No operator class may be declared `FOR TYPE` on an encrypted-domain +/// family domain. Opclasses on domains bypass the operator-resolution that +/// storage blockers depend on. The recommended index pattern is a functional +/// index on the extractor (e.g. `eql_v3.eq_term(col)`). #[sqlx::test] async fn no_opclass_targets_eql_v2_domain(pool: PgPool) -> Result<()> { let offenders: Vec<(String, String)> = sqlx::query_as( @@ -235,8 +249,10 @@ async fn no_opclass_targets_eql_v2_domain(pool: PgPool) -> Result<()> { JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace WHERE t.typtype = 'd' - AND tn.nspname = 'public' - AND t.typname LIKE 'eql_v2\_%' + AND ( + tn.nspname = 'eql_v3' + OR (tn.nspname = 'public' AND t.typname LIKE 'eql_v2\_%') + ) ORDER BY opclass "#, ) @@ -245,8 +261,8 @@ async fn no_opclass_targets_eql_v2_domain(pool: PgPool) -> Result<()> { assert!( offenders.is_empty(), - "no operator class may target an eql_v2_* domain — use a functional \ - index on the extractor instead. Offenders (opclass, for_type): {offenders:#?}" + "no operator class may target an encrypted-domain family domain — use a \ + functional index on the extractor instead. Offenders (opclass, for_type): {offenders:#?}" ); Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index 1a2fb95e8..b10a848cb 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -1,6 +1,6 @@ //! Structural guard for the blocked native-jsonb operator enumeration. //! -//! The storage-only domains (`eql_v2_int4`, future scalars) promise that +//! The storage-only domains (`eql_v3.int4`, future scalars) promise that //! *every* native jsonb operator is blocked, so an encrypted column can never //! fall through to plaintext-jsonb semantics. That promise rests on three //! hand-maintained lists in `tasks/codegen/operator_surface.py` diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index 2745e1aea..7be208531 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -36,23 +36,23 @@ async fn mutate(pool: &PgPool, ddl: &str) -> Result<()> { // catch a blocker that silently stopped raising. #[sqlx::test] async fn disabling_storage_eq_blocker_flips_blocker_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::eql_v2_int4 = $2::jsonb::eql_v2_int4"; + let sql = "SELECT $1::jsonb::eql_v3.int4 = $2::jsonb::eql_v3.int4"; // Baseline: the storage `=` blocker raises. assert_raises( &pool, sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("eql_v2_int4", "="), + &blocker_msg("eql_v3.int4", "="), ) .await?; // Mutation: replace the plpgsql blocker with an inlinable SQL body that // returns true. CREATE OR REPLACE keeps the oid, so the `=` operator on - // (eql_v2_int4, eql_v2_int4) now resolves to this no-raise body. + // (eql_v3.int4, eql_v3.int4) now resolves to this no-raise body. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4, b eql_v2_int4) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4, b eql_v3.int4) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -84,8 +84,8 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright WHERE o.oprname = '=' - AND lt.typname = 'eql_v2_int4_ord' - AND rt.typname = 'eql_v2_int4_ord' + AND lt.typname = 'int4_ord' + AND rt.typname = 'int4_ord' "#, ) .fetch_one(pool) @@ -96,14 +96,14 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( // Baseline: `=` on (ord, ord) declares a RESTRICT estimator. ensure!( restrict_present(&pool).await?, - "baseline: `=` on eql_v2_int4_ord must declare a RESTRICT estimator" + "baseline: `=` on eql_v3.int4_ord must declare a RESTRICT estimator" ); // Mutation: unset RESTRICT. DROP OPERATOR would hit COMMUTATOR/NEGATOR // dependency links; ALTER ... SET (RESTRICT = NONE) avoids that. mutate( &pool, - "ALTER OPERATOR = (eql_v2_int4_ord, eql_v2_int4_ord) SET (RESTRICT = NONE)", + "ALTER OPERATOR = (eql_v3.int4_ord, eql_v3.int4_ord) SET (RESTRICT = NONE)", ) .await?; @@ -130,7 +130,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul .await?; let count_sql = "SELECT count(*) FROM fixtures.eql_v2_int4 \ - WHERE (payload - 'hm')::eql_v2_int4_ord = $1::jsonb::eql_v2_int4_ord"; + WHERE (payload - 'hm')::eql_v3.int4_ord = $1::jsonb::eql_v3.int4_ord"; // Baseline: with `hm` stripped, `=` still matches the pivot via `ord_term` // (the `ob` term survives) — exactly one row. @@ -148,7 +148,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // nothing. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4_ord, b eql_v2_int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_ord, b eql_v3.int4_ord) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v2.hmac_256(a::jsonb) = eql_v2.hmac_256(b::jsonb) $$", ) @@ -171,7 +171,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // the `supported_null` arm has teeth. #[sqlx::test] async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::eql_v2_int4_eq = $2::jsonb::eql_v2_int4_eq"; + let sql = "SELECT $1::jsonb::eql_v3.int4_eq = $2::jsonb::eql_v3.int4_eq"; // Baseline: STRICT `=` propagates NULL when one side is NULL. assert_null(&pool, sql, &[Some(PLACEHOLDER_PAYLOAD), None]).await?; @@ -180,7 +180,7 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // keeps the oid; the operator now ignores NULL semantics. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b eql_v2_int4_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -205,9 +205,9 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // sort key. Blocking `<` alone must not disturb ORDER BY. #[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { - let lt_sql = "SELECT $1::jsonb::eql_v2_int4_ord < $2::jsonb::eql_v2_int4_ord"; + let lt_sql = "SELECT $1::jsonb::eql_v3.int4_ord < $2::jsonb::eql_v3.int4_ord"; let order_by_sql = "SELECT plaintext FROM fixtures.eql_v2_int4 \ - ORDER BY eql_v2.ord_term(payload::eql_v2_int4_ord) ASC"; + ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) ASC"; let mut ascending: Vec = ::FIXTURE_VALUES.to_vec(); ascending.sort(); @@ -228,13 +228,13 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { "baseline: ORDER BY ord_term ASC must be plaintext-sorted" ); - // Mutation: turn `eql_v2.lt(_ord, _ord)` into a blocker. Must be + // Mutation: turn `eql_v3.lt(_ord, _ord)` into a blocker. Must be // LANGUAGE plpgsql and non-STRICT so the RAISE always fires. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v2.lt(a eql_v2_int4_ord, b eql_v2_int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b eql_v3.int4_ord) \ RETURNS boolean LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE \ - AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4_ord', '<'); END; $$", + AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<'); END; $$", ) .await?; @@ -243,7 +243,7 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { &pool, lt_sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("eql_v2_int4_ord", "<"), + &blocker_msg("eql_v3.int4_ord", "<"), ) .await?; @@ -283,7 +283,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { .await?; let count_sql = "SELECT count(*) FROM fixtures.eql_v2_int4 \ - WHERE (payload - 'ob')::eql_v2_int4_eq = $1::jsonb::eql_v2_int4_eq"; + WHERE (payload - 'ob')::eql_v3.int4_eq = $1::jsonb::eql_v3.int4_eq"; // Baseline: with `ob` stripped, `=` still matches the pivot via `eq_term` // (the `hm` term survives) — exactly one row. @@ -300,7 +300,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // `eql_v2.ore_block_u64_8_256(jsonb)` raises rather than matching. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v2.eq(a eql_v2_int4_eq, b eql_v2_int4_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) = eql_v2.ore_block_u64_8_256(b::jsonb) $$", ) @@ -334,7 +334,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { #[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { let order_by_desc = "SELECT plaintext FROM fixtures.eql_v2_int4 \ - ORDER BY eql_v2.ord_term(payload::eql_v2_int4_ord) DESC"; + ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) DESC"; let mut descending: Vec = ::FIXTURE_VALUES.to_vec(); descending.sort(); @@ -353,7 +353,7 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { // function body. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $mutbody$ SELECT eql_v2.ore_block_u64_8_256('{esc}'::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), @@ -384,11 +384,11 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re const NULL_ROWS: usize = 3; let order_by = format!( "SELECT plaintext FROM ( \ - SELECT plaintext, payload::eql_v2_int4_ord AS value FROM fixtures.eql_v2_int4 \ + SELECT plaintext, payload::eql_v3.int4_ord AS value FROM fixtures.eql_v2_int4 \ UNION ALL \ - SELECT NULL::int4, NULL::eql_v2_int4_ord FROM generate_series(1, {NULL_ROWS}) \ + SELECT NULL::int4, NULL::eql_v3.int4_ord FROM generate_series(1, {NULL_ROWS}) \ ) s \ - ORDER BY eql_v2.ord_term(value) ASC NULLS LAST" + ORDER BY eql_v3.ord_term(value) ASC NULLS LAST" ); let tail_all_none = @@ -408,10 +408,10 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re // unchanged. Unique dollar-quote tag guards the embedded jsonb literal. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v2.ord_term(a eql_v2_int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ AS $mutbody$ SELECT eql_v2.ore_block_u64_8_256(\ - coalesce(a, '{esc}'::jsonb::eql_v2_int4_ord)::jsonb) $mutbody$", + coalesce(a, '{esc}'::jsonb::eql_v3.int4_ord)::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); mutate(&pool, &ddl).await?; diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index b062b9ce7..08b19c047 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -13,29 +13,29 @@ use sqlx::PgPool; #[test] fn variant_derives_consistent_sql_domain_and_capabilities() { let storage = ScalarDomainSpec::new::(Variant::Storage); - assert_eq!(storage.sql_domain, "eql_v2_int4"); + assert_eq!(storage.sql_domain, "eql_v3.int4"); assert!(!storage.supports_eq()); assert!(!storage.supports_ord()); assert_eq!(storage.extractor_fn(), None); assert_eq!(Variant::Storage.required_term(), None); let eq = ScalarDomainSpec::new::(Variant::Eq); - assert_eq!(eq.sql_domain, "eql_v2_int4_eq"); + assert_eq!(eq.sql_domain, "eql_v3.int4_eq"); assert!(eq.supports_eq()); assert!(!eq.supports_ord()); - assert_eq!(eq.extractor_fn(), Some("eql_v2.eq_term")); + assert_eq!(eq.extractor_fn(), Some("eql_v3.eq_term")); assert_eq!(Variant::Eq.required_term(), Some("hm")); let ord = ScalarDomainSpec::new::(Variant::Ord); - assert_eq!(ord.sql_domain, "eql_v2_int4_ord"); + assert_eq!(ord.sql_domain, "eql_v3.int4_ord"); assert!(ord.supports_ord()); - assert_eq!(ord.extractor_fn(), Some("eql_v2.ord_term")); + assert_eq!(ord.extractor_fn(), Some("eql_v3.ord_term")); assert_eq!(Variant::Ord.required_term(), Some("ob")); let ord_ore = ScalarDomainSpec::new::(Variant::OrdOre); - assert_eq!(ord_ore.sql_domain, "eql_v2_int4_ord_ore"); + assert_eq!(ord_ore.sql_domain, "eql_v3.int4_ord_ore"); assert!(ord_ore.supports_ord()); - assert_eq!(ord_ore.extractor_fn(), Some("eql_v2.ord_term")); + assert_eq!(ord_ore.extractor_fn(), Some("eql_v3.ord_term")); } #[test] @@ -103,8 +103,8 @@ async fn fetch_fixture_payload_returns_keyed_row(pool: PgPool) -> Result<()> { #[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] async fn assert_scalar_plaintexts_reports_sql_context(pool: PgPool) -> Result<()> { let lit = sql_string_literal(&fetch_fixture_payload::(&pool, 42).await?); - let predicate = format!("payload::eql_v2_int4_ord_ore = {lit}::jsonb::eql_v2_int4_ord_ore"); - assert_scalar_plaintexts::(&pool, "eql_v2_int4_ord_ore", "=", &predicate, &[42]).await?; + let predicate = format!("payload::eql_v3.int4_ord_ore = {lit}::jsonb::eql_v3.int4_ord_ore"); + assert_scalar_plaintexts::(&pool, "eql_v3.int4_ord_ore", "=", &predicate, &[42]).await?; Ok(()) } @@ -134,10 +134,10 @@ async fn placeholder_payload_satisfies_every_variant_check(pool: PgPool) -> Resu #[sqlx::test] async fn assert_raises_two_bind_blocker(pool: PgPool) -> Result<()> { - let msg = blocker_msg("eql_v2_int4", "="); + let msg = blocker_msg("eql_v3.int4", "="); assert_raises( &pool, - "SELECT $1::jsonb::eql_v2_int4 = $2::jsonb::eql_v2_int4", + "SELECT $1::jsonb::eql_v3.int4 = $2::jsonb::eql_v3.int4", &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], &msg, ) @@ -146,10 +146,10 @@ async fn assert_raises_two_bind_blocker(pool: PgPool) -> Result<()> { #[sqlx::test] async fn assert_raises_one_bind_path_blocker(pool: PgPool) -> Result<()> { - let msg = blocker_msg("eql_v2_int4", "->"); + let msg = blocker_msg("eql_v3.int4", "->"); assert_raises( &pool, - "SELECT $1::jsonb::eql_v2_int4 -> 'field'::text", + "SELECT $1::jsonb::eql_v3.int4 -> 'field'::text", &[Some(PLACEHOLDER_PAYLOAD)], &msg, ) @@ -162,7 +162,7 @@ async fn assert_raises_native_operator_absent(pool: PgPool) -> Result<()> { // "operator does not exist", not an EQL blocker message. assert_raises( &pool, - "SELECT $1::jsonb::eql_v2_int4 ~~ $2::jsonb::eql_v2_int4", + "SELECT $1::jsonb::eql_v3.int4 ~~ $2::jsonb::eql_v3.int4", &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], "operator does not exist", ) @@ -173,79 +173,79 @@ async fn assert_raises_native_operator_absent(pool: PgPool) -> Result<()> { async fn omitted_native_jsonb_operators_raise_eql_blockers(pool: PgPool) -> Result<()> { let cases: &[(&str, &[Option<&str>], &str)] = &[ ( - "SELECT $1::jsonb::eql_v2_int4 ? 'c'::text", + "SELECT $1::jsonb::eql_v3.int4 ? 'c'::text", &[Some(PLACEHOLDER_PAYLOAD)], "?", ), ( - "SELECT $1::jsonb::eql_v2_int4 ?| ARRAY['c']", + "SELECT $1::jsonb::eql_v3.int4 ?| ARRAY['c']", &[Some(PLACEHOLDER_PAYLOAD)], "?|", ), ( - "SELECT $1::jsonb::eql_v2_int4 ?& ARRAY['c']", + "SELECT $1::jsonb::eql_v3.int4 ?& ARRAY['c']", &[Some(PLACEHOLDER_PAYLOAD)], "?&", ), ( - "SELECT $1::jsonb::eql_v2_int4 #> ARRAY['i']", + "SELECT $1::jsonb::eql_v3.int4 #> ARRAY['i']", &[Some(PLACEHOLDER_PAYLOAD)], "#>", ), ( - "SELECT $1::jsonb::eql_v2_int4 #>> ARRAY['i', 'c']", + "SELECT $1::jsonb::eql_v3.int4 #>> ARRAY['i', 'c']", &[Some(PLACEHOLDER_PAYLOAD)], "#>>", ), ( - "SELECT $1::jsonb::eql_v2_int4 @? '$.c'::jsonpath", + "SELECT $1::jsonb::eql_v3.int4 @? '$.c'::jsonpath", &[Some(PLACEHOLDER_PAYLOAD)], "@?", ), ( - "SELECT $1::jsonb::eql_v2_int4 @@ '$.c == \"placeholder\"'::jsonpath", + "SELECT $1::jsonb::eql_v3.int4 @@ '$.c == \"placeholder\"'::jsonpath", &[Some(PLACEHOLDER_PAYLOAD)], "@@", ), ( - "SELECT $1::jsonb::eql_v2_int4 - 'c'::text", + "SELECT $1::jsonb::eql_v3.int4 - 'c'::text", &[Some(PLACEHOLDER_PAYLOAD)], "-", ), ( - "SELECT $1::jsonb::eql_v2_int4 - 0", + "SELECT $1::jsonb::eql_v3.int4 - 0", &[Some(PLACEHOLDER_PAYLOAD)], "-", ), ( - "SELECT $1::jsonb::eql_v2_int4 - ARRAY['c']", + "SELECT $1::jsonb::eql_v3.int4 - ARRAY['c']", &[Some(PLACEHOLDER_PAYLOAD)], "-", ), ( - "SELECT $1::jsonb::eql_v2_int4 #- ARRAY['i']", + "SELECT $1::jsonb::eql_v3.int4 #- ARRAY['i']", &[Some(PLACEHOLDER_PAYLOAD)], "#-", ), ( - "SELECT $1::jsonb::eql_v2_int4 || $2::jsonb", + "SELECT $1::jsonb::eql_v3.int4 || $2::jsonb", &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], "||", ), ( - "SELECT $1::jsonb || $2::jsonb::eql_v2_int4", + "SELECT $1::jsonb || $2::jsonb::eql_v3.int4", &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], "||", ), ( - "SELECT $1::jsonb::eql_v2_int4 || $2::jsonb::eql_v2_int4", + "SELECT $1::jsonb::eql_v3.int4 || $2::jsonb::eql_v3.int4", &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], "||", ), ]; for (sql, binds, op) in cases { - assert_raises(&pool, sql, binds, &blocker_msg("eql_v2_int4", op)).await?; + assert_raises(&pool, sql, binds, &blocker_msg("eql_v3.int4", op)).await?; } Ok(()) } @@ -253,10 +253,10 @@ async fn omitted_native_jsonb_operators_raise_eql_blockers(pool: PgPool) -> Resu #[sqlx::test] async fn assert_raises_engages_on_all_null(pool: PgPool) -> Result<()> { // Non-STRICT blocker proof — must raise even with NULL on both sides. - let msg = blocker_msg("eql_v2_int4", "="); + let msg = blocker_msg("eql_v3.int4", "="); assert_raises( &pool, - "SELECT $1::jsonb::eql_v2_int4 = $2::jsonb::eql_v2_int4", + "SELECT $1::jsonb::eql_v3.int4 = $2::jsonb::eql_v3.int4", &[None, None], &msg, ) @@ -268,7 +268,7 @@ async fn assert_null_propagates_through_supported_op(pool: PgPool) -> Result<()> // STRICT supported op with one NULL operand yields NULL. assert_null( &pool, - "SELECT $1::jsonb::eql_v2_int4_eq = $2::jsonb::eql_v2_int4_eq", + "SELECT $1::jsonb::eql_v3.int4_eq = $2::jsonb::eql_v3.int4_eq", &[Some(PLACEHOLDER_PAYLOAD), None], ) .await @@ -286,7 +286,7 @@ async fn neq_propagates_null_under_three_valued_logic(pool: PgPool) -> Result<() ] { assert_null( &pool, - "SELECT $1::jsonb::eql_v2_int4_eq <> $2::jsonb::eql_v2_int4_eq", + "SELECT $1::jsonb::eql_v3.int4_eq <> $2::jsonb::eql_v3.int4_eq", binds, ) .await?; @@ -297,7 +297,7 @@ async fn neq_propagates_null_under_three_valued_logic(pool: PgPool) -> Result<() #[sqlx::test] async fn no_cross_variant_equality_operator_is_declared(pool: PgPool) -> Result<()> { // The family deliberately does NOT define operators that mix two - // different capability variants — `eql_v2_int4_eq = eql_v2_int4_ord` + // different capability variants — `eql_v3.int4_eq = eql_v3.int4_ord` // would resolve against jsonb (the ultimate base type) and silently // bypass the per-variant blockers. If someone accidentally adds such // an operator, this test fails. @@ -311,9 +311,11 @@ async fn no_cross_variant_equality_operator_is_declared(pool: PgPool) -> Result< o.oprname, lt.typname, rt.typname) FROM pg_catalog.pg_operator o JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft + JOIN pg_catalog.pg_namespace ln ON ln.oid = lt.typnamespace JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright - WHERE lt.typname LIKE 'eql_v2\_%' - AND rt.typname LIKE 'eql_v2\_%' + JOIN pg_catalog.pg_namespace rn ON rn.oid = rt.typnamespace + WHERE ln.nspname = 'eql_v3' + AND rn.nspname = 'eql_v3' AND lt.typname <> rt.typname ORDER BY 1 "#, @@ -323,7 +325,7 @@ async fn no_cross_variant_equality_operator_is_declared(pool: PgPool) -> Result< assert!( cross_variant.is_empty(), - "no operator should mix two different eql_v2_* domain types, but found: {cross_variant:#?}" + "no operator should mix two different eql_v3 domain types, but found: {cross_variant:#?}" ); Ok(()) } diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index f9194b82c..0387e396a 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -96,15 +96,15 @@ async fn lint_categories_are_well_known(pool: PgPool) -> Result<()> { /// planner can fold or elide the call when the result is provably unused /// (a dead CASE branch, a folded predicate), silently bypassing the RAISE /// and re-enabling the operator. See CLAUDE.md footguns. This test plants -/// a fake LANGUAGE sql blocker on `eql_v2_int4` and asserts the lint +/// a fake LANGUAGE sql blocker on `eql_v3.int4` and asserts the lint /// surfaces it under category `blocker_language`. #[sqlx::test] async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v2.test_bad_blocker_sql(a eql_v2_int4, b eql_v2_int4) + CREATE FUNCTION eql_v2.test_bad_blocker_sql(a eql_v3.int4, b eql_v3.int4) RETURNS boolean LANGUAGE sql IMMUTABLE - AS $$ SELECT eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '=') $$; + AS $$ SELECT eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '=') $$; "#, ) .execute(&pool) @@ -134,15 +134,15 @@ async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { /// A blocker marked `STRICT` lets PostgreSQL skip the body and return NULL /// on a NULL argument — silently bypassing the "operator not supported" /// RAISE. See CLAUDE.md footguns. This test plants a fake STRICT plpgsql -/// blocker on `eql_v2_int4` and asserts the lint surfaces it under +/// blocker on `eql_v3.int4` and asserts the lint surfaces it under /// `blocker_strict`. #[sqlx::test] async fn lint_flags_strict_blocker(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v2.test_bad_blocker_strict(a eql_v2_int4, b eql_v2_int4) + CREATE FUNCTION eql_v2.test_bad_blocker_strict(a eql_v3.int4, b eql_v3.int4) RETURNS boolean LANGUAGE plpgsql IMMUTABLE STRICT - AS $$ BEGIN RETURN eql_v2.encrypted_domain_unsupported_bool('eql_v2_int4', '='); END; $$; + AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$; "#, ) .execute(&pool) @@ -186,7 +186,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( | "inlinability_volatility" | "inlinability_set_clause" | "inlinability_secdef" - ) && r.object_name.contains("eql_v2_int4") + ) && r.object_name.contains("eql_v3.int4") && (r.object_name.contains("operator =(") || r.object_name.contains("operator ->(") || r.object_name.contains("operator ?(")) @@ -209,7 +209,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( /// surfaces it under `domain_over_domain`. #[sqlx::test] async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { - sqlx::query(r#"CREATE DOMAIN public.eql_v2_test_baddom AS public.eql_v2_int4;"#) + sqlx::query(r#"CREATE DOMAIN public.eql_v2_test_baddom AS eql_v3.int4;"#) .execute(&pool) .await?; @@ -330,7 +330,7 @@ async fn scalar_family_inlinable_operators_are_clean(pool: PgPool) -> Result<()> if matches!(variant, Variant::Storage) { continue; } - let domain = format!("eql_v2_{pg_type}{}", variant.suffix()); + let domain = format!("eql_v3.{pg_type}{}", variant.suffix()); let supported_ops: &[&str] = if variant.supports_ord() { &["=", "<>", "<", "<=", ">", ">="] } else { From 9ac73d28a2520811a428dd201b7fe24f87b0e418 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 15:21:31 +1000 Subject: [PATCH 020/599] test(encrypted-domain): point int4 matrix tests at eql_v3 schema The int4 domain family moved from eql_v2 to eql_v3, but three generated matrix tests still hardcoded eql_v2. Fixes the CI failures on PG 15/16/17: - scale_default_combos used eql_v2.ord_term as the index extractor, but the ord column is eql_v3.int4_ord (extractor is eql_v3.ord_term). - the aggregate parallel-safety introspection query filtered pg_proc on 'eql_v2'::regnamespace, finding no min/max aggregate (now in eql_v3). Test-only; no production SQL change. --- tests/sqlx/src/matrix.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 8b8c09235..6227de531 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -204,7 +204,7 @@ macro_rules! ordered_numeric_matrix { // converged ordered domain, ord_term btree. One curated combo keeps // PR CI cost bounded. scale_default_combos = [ - (ord, Ord, "eql_v2.ord_term", "btree"), + (ord, Ord, "eql_v3.ord_term", "btree"), ], } }; @@ -2298,7 +2298,7 @@ macro_rules! __scalar_matrix_aggregate_parallel_case { FROM pg_proc p \ JOIN pg_aggregate a ON a.aggfnoid = p.oid \ WHERE p.proname = $1 \ - AND p.pronamespace = 'eql_v2'::regnamespace \ + AND p.pronamespace = 'eql_v3'::regnamespace \ AND p.proargtypes[0]::regtype = $2::regtype", ) .bind(agg) @@ -2306,9 +2306,9 @@ macro_rules! __scalar_matrix_aggregate_parallel_case { .fetch_one(&pool) .await?; anyhow::ensure!(proparallel == "s", - "eql_v2.{agg}({d}) must be PARALLEL SAFE (proparallel='s'), got {proparallel:?}"); + "eql_v3.{agg}({d}) must be PARALLEL SAFE (proparallel='s'), got {proparallel:?}"); anyhow::ensure!(has_combine, - "eql_v2.{agg}({d}) must declare a combinefunc for partial aggregation"); + "eql_v3.{agg}({d}) must declare a combinefunc for partial aggregation"); } Ok(()) } From c2949c9c16d817fec7e9a55fd7d13e702259d761 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 16:01:45 +1000 Subject: [PATCH 021/599] fix(lint): describe encrypted-domains namespace-neutrally The domain_over_domain and domain_opclass lint messages hard-coded 'eql_v2_*' and recommended eql_v2.eq_term/ord_term. Now that these lints also target eql_v3 domains, a message firing on an eql_v3 domain pointed at the wrong surface. Drop the version-specific label ('another encrypted-domain', 'an encrypted-domain type') and build the extractor recommendation from the offending domain's own schema (%s.eq_term / %s.ord_term via tn.nspname) so remediation is correct in either namespace. Addresses CodeRabbit review feedback on #247. --- src/lint/lints.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lint/lints.sql b/src/lint/lints.sql index bf38c1e6f..cf66f7d4a 100644 --- a/src/lint/lints.sql +++ b/src/lint/lints.sql @@ -304,7 +304,7 @@ AS $$ WHERE isstrict -- ┌─────────────────────────────────────────────────────────────────┐ - -- │ Domain identity: an eql_v2_* domain must be defined directly │ + -- │ Domain identity: an encrypted-domain must be defined directly │ -- │ over jsonb. Operators resolve against the ultimate base type, │ -- │ so domain-over-domain inherits jsonb's operator surface and not │ -- │ the base domain's blockers. │ @@ -317,7 +317,7 @@ AS $$ 'domain_over_domain', format('domain %I.%I', dn.nspname, dt.typname), format( - 'Domain `%s.%s` is derived from another eql_v2_* domain `%s.%s` rather than jsonb. Operators resolve against the ultimate base type, so the derived domain does not inherit the base domain''s operator surface and storage blockers do not engage. Define this domain directly over jsonb.', + 'Domain `%s.%s` is derived from another encrypted-domain `%s.%s` rather than jsonb. Operators resolve against the ultimate base type, so the derived domain does not inherit the base domain''s operator surface and storage blockers do not engage. Define this domain directly over jsonb.', dn.nspname, dt.typname, bn.nspname, bt.typname) FROM pg_catalog.pg_type dt JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace @@ -336,7 +336,7 @@ AS $$ -- ┌─────────────────────────────────────────────────────────────────┐ -- │ Domain opclass: an operator class declared FOR TYPE on an │ - -- │ eql_v2_* domain bypasses operator resolution at index time. │ + -- │ encrypted-domain bypasses operator resolution at index time. │ -- │ Use a functional index on the extractor instead. │ -- └─────────────────────────────────────────────────────────────────┘ @@ -347,8 +347,8 @@ AS $$ 'domain_opclass', format('opclass %I.%I FOR TYPE %s.%s', cn.nspname, oc.opcname, tn.nspname, t.typname), format( - 'Operator class `%s.%s` is declared FOR TYPE `%s.%s`, which is an eql_v2_* domain. Opclasses on domains bypass operator resolution. Use a functional index on the extractor (e.g. `eql_v2.eq_term(col)`, `eql_v2.ord_term(col)`) instead.', - cn.nspname, oc.opcname, tn.nspname, t.typname) + 'Operator class `%s.%s` is declared FOR TYPE `%s.%s`, which is an encrypted-domain type. Opclasses on domains bypass operator resolution. Use a functional index on the extractor (e.g. `%s.eq_term(col)`, `%s.ord_term(col)`) instead.', + cn.nspname, oc.opcname, tn.nspname, t.typname, tn.nspname, tn.nspname) FROM pg_catalog.pg_opclass oc JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace From 3db36a06e51889ecac327cd32c7d39749d89f909 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 16:01:45 +1000 Subject: [PATCH 022/599] test(matrix): assert real index-scan node in scale-preference sweep The feature-gated scale-preference sweep arm asserted plan_text.contains(index) on raw EXPLAIN text, which can false-pass on an incidental mention of the index name. Switch it to the JSON-plan helper assert_index_scan_uses, matching the always-on default-category arm and every other EXPLAIN assertion in the file, so the sweep proves a genuine Index/Index-Only/Bitmap-Index scan node rather than a substring. Addresses CodeRabbit review feedback on #247. --- tests/sqlx/src/matrix.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 6227de531..ac690a16d 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1205,15 +1205,15 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", .execute(&mut *tx).await?; let lit = pivot_payload.replace('\'', "''"); - let plan: Vec = sqlx::query_scalar(&format!( - "EXPLAIN SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}", - )).fetch_all(&mut *tx).await?; - let plan_text = plan.join("\n"); - anyhow::ensure!(plan_text.contains(index), - "with seqscan enabled the planner must prefer the {extractor} \ -{using} index for a selective = ; plan:\n{plan_text}", - extractor = $extractor, using = $using, - ); + $crate::matrix::assert_index_scan_uses( + &mut *tx, + &format!("SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}"), + index, + &format!( + "with seqscan enabled the planner must prefer the {extractor} {using} index for a selective =", + extractor = $extractor, using = $using, + ), + ).await?; tx.commit().await?; Ok(()) From f1ffb73108f654749e576159f61fdb1ccc2ce30c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 14:16:51 +1000 Subject: [PATCH 023/599] feat(encrypted-domain): add int2 scalar domain family MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the int2 ordered numeric scalar to the generated encrypted-domain family, stacked on the int4 reference. Four jsonb-backed domains (eql_v2_int2{,_eq,_ord,_ord_ore}) are generated from the new tasks/codegen/types/int2.toml manifest by the existing type-generic materializer — no generator behaviour changes. - Register the int2 ScalarKind (i16, MIN -32768 / MAX 32767 / zero) in tasks/codegen/scalars.py, with test_scalars.py coverage. - Commit the generated fixture-value const tests/sqlx/src/fixtures/int2_values.rs (single source of truth shared by the fixture generator and the matrix oracle). - Wire the SQLx matrix oracle: impl ScalarType for i16, the eql_v2_int2 fixture via the scalar_fixture! macro (mirroring eql_v2_int4), and the sealed EqlPlaintext impl for i16 (small_int cast, Plaintext::SmallInt, smallint oracle column). - Add the ordered_numeric_matrix! invocation and the int2 matrix test-name inventory snapshot. - Record the new family in CHANGELOG.md. Keep the codegen reference int4-only: it is a golden master for the type-generic generator, so one anchor detects all template/term drift. New scalar types add no per-type baseline; documented in the spec and tests/codegen/reference/README.md. int2 is guaranteed by the int4 reference, the int2_values.rs staleness guard + test_scalars.py, and the SQLx matrix. --- .github/workflows/test-eql.yml | 1 + CHANGELOG.md | 1 + CLAUDE.md | 1 + docs/reference/encrypted-domain-generator.md | 23 +- .../encrypted-domain-implementation-spec.md | 45 +++- mise.toml | 14 +- tasks/codegen/scalars.py | 9 + tasks/codegen/test_scalars.py | 18 ++ tasks/codegen/types/int2.toml | 19 ++ tests/codegen/reference/README.md | 12 +- tests/sqlx/snapshots/README.md | 53 +++++ tests/sqlx/snapshots/int2_matrix_tests.txt | 211 ++++++++++++++++++ tests/sqlx/src/fixtures/eql_plaintext.rs | 34 +++ tests/sqlx/src/fixtures/eql_v2_int2.rs | 12 + tests/sqlx/src/fixtures/int2_values.rs | 33 +++ tests/sqlx/src/fixtures/mod.rs | 6 + tests/sqlx/src/scalar_domains.rs | 9 + .../tests/encrypted_domain/scalars/int2.rs | 14 ++ .../tests/encrypted_domain/scalars/mod.rs | 2 + 19 files changed, 495 insertions(+), 22 deletions(-) create mode 100644 tasks/codegen/types/int2.toml create mode 100644 tests/sqlx/snapshots/README.md create mode 100644 tests/sqlx/snapshots/int2_matrix_tests.txt create mode 100644 tests/sqlx/src/fixtures/eql_v2_int2.rs create mode 100644 tests/sqlx/src/fixtures/int2_values.rs create mode 100644 tests/sqlx/tests/encrypted_domain/scalars/int2.rs diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 436df8864..ff82bb42d 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -121,6 +121,7 @@ jobs: run: | mise run test:matrix:inventory git diff --exit-code -- tests/sqlx/snapshots/int4_matrix_tests.txt \ + tests/sqlx/snapshots/int2_matrix_tests.txt \ || { echo "Coverage inventory stale — run 'mise run test:matrix:inventory' and commit."; exit 1; } test: diff --git a/CHANGELOG.md b/CHANGELOG.md index 00215fd23..c75b70db3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors still return the core `eql_v2.hmac_256` / `eql_v2.ore_block_u64_8_256` index-term types, which remain in `eql_v2` and are referenced cross-schema. Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) +- **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from `tasks/codegen/types/int2.toml` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) ## [2.3.1] — 2026-05-21 diff --git a/CLAUDE.md b/CLAUDE.md index 1328a8b0d..4b4891230 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,6 +29,7 @@ This project uses `mise` for task management. Common commands: - Run SQLx tests directly: `mise run test:sqlx` - Run SQLx tests in watch mode: `mise run test:sqlx:watch` - Tests are located in `tests/sqlx/` using Rust and SQLx framework +- Regenerate the scalar matrix coverage snapshots: `mise run test:matrix:inventory` (no database required). These committed `tests/sqlx/snapshots/_matrix_tests.txt` baselines pin the set of `scalars::::*` test names so a silently dropped/renamed/`#[cfg]`-gated test fails CI's `matrix-coverage` job. When you add or remove matrix tests (or add a scalar type), regenerate and commit the affected snapshot in the same change. See `tests/sqlx/snapshots/README.md`. ### Build System - Dependencies are resolved using `-- REQUIRE:` comments in SQL files diff --git a/docs/reference/encrypted-domain-generator.md b/docs/reference/encrypted-domain-generator.md index bb6252be1..9b2d6a076 100644 --- a/docs/reference/encrypted-domain-generator.md +++ b/docs/reference/encrypted-domain-generator.md @@ -377,12 +377,23 @@ The end-to-end shape from a generator perspective: 4. **Build picks it up automatically** — `tasks/build.sh` regenerates before computing the `tsort` graph, so the new files appear in the dependency walk via the `-- REQUIRE:` edges the generator emits. -5. **Baseline & test.** Create a hand-reviewed byte-parity baseline under - `tests/codegen/reference//` (each file marked `-- REFERENCE:` / - `// REFERENCE:`) so `test_against_reference.py` guards the new type — it - only covers types that have a baseline directory. Then run - `mise run test:codegen`, the relevant SQLx suites, and the PostgreSQL - matrix. +5. **Test.** Do **not** add a `tests/codegen/reference//` baseline. + `int4` is the sole golden master for the type-generic generator: the SQL + templates are pure token substitution and the only type-specific rendering + is `_values.rs`, so a per-type baseline can only fail where `int4`'s + already would. Drift protection for the new type comes from the `int4` + reference (shared templates + `terms.py`), the committed `_values.rs` + const guarded by the codegen staleness check, the `` cases in + `test_scalars.py`, and the `ordered_numeric_matrix!` SQLx suite (behaviour, + not bytes). Run `mise run test:codegen`, the relevant SQLx suites, and the + PostgreSQL matrix. +6. **Snapshot the matrix inventory.** Run `mise run test:matrix:inventory` + and commit the new `tests/sqlx/snapshots/_matrix_tests.txt` — the + sorted list of the type's `scalars::::*` test names. CI's + `matrix-coverage` job `git diff --exit-code`s it (like `_values.rs`) + to catch a silently dropped or renamed matrix test. The snapshot is a + committed test baseline, not gitignored generated SQL. See + `tests/sqlx/snapshots/README.md`. Adding a new **term** is a bigger move — edit `terms.py`, add tests, audit `splinter.sh` for a name collision, and update the reference diff --git a/docs/reference/encrypted-domain-implementation-spec.md b/docs/reference/encrypted-domain-implementation-spec.md index c6bec96ac..e21c8d6a1 100644 --- a/docs/reference/encrypted-domain-implementation-spec.md +++ b/docs/reference/encrypted-domain-implementation-spec.md @@ -83,13 +83,21 @@ future migration. - [ ] Put optional hand-written SQL in `src/encrypted_domain//_extensions.sql` with explicit `-- REQUIRE:` edges. This file IS committed. -- [ ] Create a hand-reviewed byte-parity baseline under - `tests/codegen/reference//` — one file per generated SQL output plus - `_values.rs`, each headed with the `-- REFERENCE:` / `// REFERENCE:` - marker. `tasks/codegen/test_against_reference.py` only guards types that - have a baseline directory, so without it the new type gets no - drift protection. The committed-fixture parity assertion is currently - `int4`-only; extend it to cover ``. +- [ ] Do **not** add a `tests/codegen/reference//` baseline. `int4` is the + single golden master for the type-generic generator: the SQL templates are + pure token substitution and the only type-specific rendering is + `_values.rs`, so a per-type baseline can only fail when `int4`'s already + would. Drift protection for the new type comes from the `int4` reference + (shared templates + `terms.py`), the committed `_values.rs` const guarded + by the CI staleness check (`mise run codegen:domain ` + `git diff + --exit-code`) and the `` cases in `tasks/codegen/test_scalars.py`, and + the `ordered_numeric_matrix!` SQLx suite (behaviour, not bytes). +- [ ] Run `mise run test:matrix:inventory` and commit the regenerated + `tests/sqlx/snapshots/_matrix_tests.txt` — the sorted inventory of every + `scalars::::*` test name in the `encrypted_domain` binary. CI diffs it + (same as `_values.rs`); a stale snapshot fails the `matrix-coverage` + job with "Coverage inventory stale". This baseline is what catches a + silently dropped, renamed, or `#[cfg]`-gated matrix test. See §8. - [ ] Run `mise run test:codegen`, the relevant SQLx suites, and the PostgreSQL matrix before merging. @@ -252,8 +260,9 @@ Cover each generated domain with SQLx tests appropriate to its terms: - domain `CHECK` rejects non-object and under-populated payloads; - real typed columns are tested, not only cast literals; - generated ordered-domain twins remain byte-identical modulo type name - (verified by `tasks/codegen/test_against_reference.py` against the - hand-reviewed baseline in `tests/codegen/reference//`). + (the shared generator is anchored by the `int4` golden master in + `tests/codegen/reference/int4/` via `tasks/codegen/test_against_reference.py`; + new types add no baseline of their own — see §2). For ordered numeric scalars this coverage is generated by the `ordered_numeric_matrix!` convention wrapper in `tests/sqlx/src/matrix.rs`: @@ -272,6 +281,24 @@ For ordered `int4`, keep the assertion that distinct plaintext values produce distinct ORE blocks. Do not add assertions for term behavior that the catalog does not promise. +### Matrix coverage inventory snapshot + +The *set of test names* the matrix emits is itself guarded. `mise run +test:matrix:inventory` lists every test in the `encrypted_domain` binary +under a pinned feature set (`--no-default-features`, which deliberately +excludes the `scale` arm — see the task comment in `mise.toml`), greps it to +each `scalars::::*` matrix, `LC_ALL=C sort`s for byte-stable ordering, and +writes one committed snapshot per scalar at +`tests/sqlx/snapshots/_matrix_tests.txt`. The CI `matrix-coverage` job +regenerates with the same feature set and `git diff --exit-code`s every +snapshot; a divergence fails with "Coverage inventory stale". This is the +guard that catches a silently dropped, renamed, or `#[cfg]`-gated matrix +test — a behaviour the SQLx assertions above cannot see, because a deleted +test simply stops running. When you add a scalar you add a new snapshot; +when you add or remove matrix tests you regenerate and commit the affected +snapshot in the same change. The files are a committed test baseline, **not** +gitignored generated SQL. See `tests/sqlx/snapshots/README.md`. + ## 9. Fixtures Fixture generation should use real encrypted payloads produced through diff --git a/mise.toml b/mise.toml index 270fab257..c513202fa 100644 --- a/mise.toml +++ b/mise.toml @@ -96,7 +96,7 @@ mise exec python -- python -m pytest tasks/codegen -q """ [tasks."test:matrix:inventory"] -description = "Regenerate the int4 matrix test-name inventory snapshot (no database required)" +description = "Regenerate the int4/int2 matrix test-name inventory snapshots (no database required)" dir = "{{config_root}}/tests/sqlx" run = """ # Pin an explicit feature set so the inventory is deterministic regardless of @@ -105,14 +105,18 @@ run = """ # of this default-feature inventory, covered instead by the scale gate + the # family::mutations negative controls. `--list` enumerates the whole # encrypted_domain binary (family::support, family::inlinability, -# family::mutations, scalars::int4); `grep '^scalars::int4'` scopes the -# snapshot to the matrix only, so landing other family tests never dirties it. -# `LC_ALL=C sort` makes ordering byte-stable across locales (a bare `sort` is -# locale-dependent and yields spurious CI diffs). +# family::mutations, scalars::int4, scalars::int2); the per-scalar `grep` +# scopes each snapshot to that matrix only, so landing other family tests +# never dirties it. `LC_ALL=C sort` makes ordering byte-stable across locales +# (a bare `sort` is locale-dependent and yields spurious CI diffs). set -euo pipefail mkdir -p snapshots cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p' | grep '^scalars::int4' | LC_ALL=C sort > snapshots/int4_matrix_tests.txt +cargo test --no-default-features --test encrypted_domain -- --list | + sed -n 's/: test$//p' | + grep '^scalars::int2' | + LC_ALL=C sort > snapshots/int2_matrix_tests.txt """ diff --git a/tasks/codegen/scalars.py b/tasks/codegen/scalars.py index a93df9056..eee01dc46 100644 --- a/tasks/codegen/scalars.py +++ b/tasks/codegen/scalars.py @@ -79,6 +79,15 @@ def render_literal(self, value: str) -> str: min_value=-2147483648, max_value=2147483647, ), + "int2": ScalarKind( + token="int2", + rust_type="i16", + min_symbol="i16::MIN", + max_symbol="i16::MAX", + zero_symbol="0", + min_value=-32768, + max_value=32767, + ), } diff --git a/tasks/codegen/test_scalars.py b/tasks/codegen/test_scalars.py index 3ef7d0f0a..1f15f1c3c 100644 --- a/tasks/codegen/test_scalars.py +++ b/tasks/codegen/test_scalars.py @@ -62,3 +62,21 @@ def test_require_scalar_unknown_raises(): def test_int4_registered_in_catalog(): assert "int4" in SCALAR_KINDS + + +def test_int2_kind_resolves_and_renders(): + kind = require_scalar("int2") + assert kind.rust_type == "i16" + assert kind.numeric_value("MIN") == -32768 + assert kind.numeric_value("MAX") == 32767 + assert kind.numeric_value("ZERO") == 0 + assert kind.render_literal("MIN") == "i16::MIN" + assert kind.render_literal("MAX") == "i16::MAX" + assert kind.render_literal("ZERO") == "0" + assert kind.render_literal("30000") == "30000" + + +def test_int2_kind_rejects_out_of_range(): + kind = require_scalar("int2") + with pytest.raises(ScalarError, match="out of range"): + kind.numeric_value("40000") diff --git a/tasks/codegen/types/int2.toml b/tasks/codegen/types/int2.toml new file mode 100644 index 000000000..314bc6982 --- /dev/null +++ b/tasks/codegen/types/int2.toml @@ -0,0 +1,19 @@ +# Encrypted-domain scalar manifest for int2. +# The filename supplies the type token. Each domain lists the index terms +# it carries; term capabilities are fixed in tasks/codegen/terms.py. + +[domain] +int2 = [] +int2_eq = ["hm"] +int2_ord_ore = ["ore"] +int2_ord = ["ore"] + +# Single source of truth for the int2 fixture plaintext list. Drives the +# generated tests/sqlx/src/fixtures/int2_values.rs const, shared by the fixture +# generator and the matrix oracle. Sentinels MIN/MAX/ZERO map to i16 named +# consts; the set MUST include MIN, MAX, and zero (matrix comparison pivots). +[fixture] +values = [ + "MIN", "-30000", "-100", "-1", "ZERO", "1", "2", "5", "10", "17", "25", + "42", "50", "100", "250", "1000", "9999", "30000", "MAX", +] diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index c1fa5118a..58f01cc17 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -1,5 +1,13 @@ # Codegen reference -The SQL files under `/` are the original, hand-written reference implementation for each encrypted-domain scalar type. +The SQL files under `int4/` are the original, hand-written reference implementation for the encrypted-domain scalar generator. `int4` is the **single golden master**: the generator in `tasks/codegen/` is type-generic — its SQL templates are pure token substitution, and the only type-specific rendering is the `_values.rs` const — so one anchored type detects all template/term drift for every current and future scalar. -They are the parity baseline for the generator in `tasks/codegen/`. `tasks/codegen/test_against_reference.py` renders the generator's output and asserts it matches these files byte-for-byte. If the generator diverges, either it regressed (fix `tasks/codegen/`) or the reference is being updated deliberately (commit the new reference in the same PR). +`tasks/codegen/test_against_reference.py` renders the generator's output for `int4` and asserts it matches these files byte-for-byte. If the generator diverges, either it regressed (fix `tasks/codegen/`) or the reference is being updated deliberately (commit the new `int4` reference in the same PR). + +## New scalar types do not add a reference + +Adding a scalar type (`int2`, `int8`, …) does **not** add a `tests/codegen/reference//` directory. A per-type baseline would be redundant: the SQL is byte-identical to `int4` modulo the type token, so it can only fail when `int4`'s baseline already would. New types are guaranteed three other ways: + +- the `int4` reference here anchors the shared generator (templates + `terms.py`); +- the committed `tests/sqlx/src/fixtures/_values.rs` const is pinned by the CI staleness guard (`git diff --exit-code` after `mise run codegen:domain `) and by the `` cases in `tasks/codegen/test_scalars.py` (the only type-specific rendering, `i16::MIN` vs `i32::MIN`); +- the SQLx `ordered_numeric_matrix!` suite exercises the generated SQL's *behaviour* against a real database — a far stronger guarantee than a byte comparison. diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md new file mode 100644 index 000000000..a4ce5ae90 --- /dev/null +++ b/tests/sqlx/snapshots/README.md @@ -0,0 +1,53 @@ +# Matrix coverage inventory snapshots + +This directory holds one committed snapshot per scalar encrypted-domain type: + +- `int4_matrix_tests.txt` +- `int2_matrix_tests.txt` + +Each file is a sorted, byte-stable list of every `scalars::::*` test name in +the `encrypted_domain` SQLx binary. They are a **committed test baseline**, not +gitignored generated SQL — keep them in version control. + +## What they guard + +The SQLx assertions verify that the tests which run produce the right results. +They cannot see a test that *stops running* — a matrix test that is deleted, +renamed, or hidden behind a `#[cfg]` gate simply vanishes silently, quietly +shrinking coverage. These snapshots close that gap: they pin the *set of test +names* so any such change shows up as an added/removed line in the PR diff. + +## How they are generated + +Run: + +```bash +mise run test:matrix:inventory +``` + +The task (`mise.toml`, `[tasks."test:matrix:inventory"]`) enumerates the binary +with `cargo test --test encrypted_domain -- --list`, greps each +`scalars::` matrix into its own file, and `LC_ALL=C sort`s for ordering +that is byte-stable across locales. No database is required — `--list` only +enumerates; the suite uses runtime queries. + +It pins `--no-default-features` so the inventory is deterministic regardless of +the caller's local flags. That deliberately excludes the `scale` feature arm +(`#[cfg(feature = "scale")]`) — a known blind spot of this inventory, covered +instead by the scale gate plus the `family::mutations` negative controls. + +## CI enforcement + +The `matrix-coverage` job in `.github/workflows/test-eql.yml` regenerates with +the same pinned feature set and runs `git diff --exit-code` against every +snapshot in this directory. A divergence fails the job with: + +> Coverage inventory stale — run 'mise run test:matrix:inventory' and commit. + +## When you must update these + +- **Adding a new scalar type** → a new `_matrix_tests.txt` appears; commit it. +- **Adding / removing / renaming matrix tests** → regenerate and commit the + affected snapshot in the same change. + +See `docs/reference/encrypted-domain-implementation-spec.md` §2 and §8. diff --git a/tests/sqlx/snapshots/int2_matrix_tests.txt b/tests/sqlx/snapshots/int2_matrix_tests.txt new file mode 100644 index 000000000..3b6ed674a --- /dev/null +++ b/tests/sqlx/snapshots/int2_matrix_tests.txt @@ -0,0 +1,211 @@ +scalars::int2::matrix_int2_eq_aggregate_typecheck_max +scalars::int2::matrix_int2_eq_aggregate_typecheck_min +scalars::int2::matrix_int2_eq_contained_by_blocker +scalars::int2::matrix_int2_eq_contains_blocker +scalars::int2::matrix_int2_eq_count_distinct_extractor +scalars::int2::matrix_int2_eq_count_path_cast +scalars::int2::matrix_int2_eq_count_typed_column +scalars::int2::matrix_int2_eq_eq_pivot_max_correctness +scalars::int2::matrix_int2_eq_eq_pivot_max_cross_shape +scalars::int2::matrix_int2_eq_eq_pivot_min_correctness +scalars::int2::matrix_int2_eq_eq_pivot_min_cross_shape +scalars::int2::matrix_int2_eq_eq_pivot_zero_correctness +scalars::int2::matrix_int2_eq_eq_pivot_zero_cross_shape +scalars::int2::matrix_int2_eq_eq_supported_null +scalars::int2::matrix_int2_eq_gt_blocker +scalars::int2::matrix_int2_eq_gte_blocker +scalars::int2::matrix_int2_eq_index_engages_btree +scalars::int2::matrix_int2_eq_index_engages_hash +scalars::int2::matrix_int2_eq_lt_blocker +scalars::int2::matrix_int2_eq_lte_blocker +scalars::int2::matrix_int2_eq_native_absent_ops +scalars::int2::matrix_int2_eq_neq_pivot_max_correctness +scalars::int2::matrix_int2_eq_neq_pivot_max_cross_shape +scalars::int2::matrix_int2_eq_neq_pivot_min_correctness +scalars::int2::matrix_int2_eq_neq_pivot_min_cross_shape +scalars::int2::matrix_int2_eq_neq_pivot_zero_correctness +scalars::int2::matrix_int2_eq_neq_pivot_zero_cross_shape +scalars::int2::matrix_int2_eq_neq_supported_null +scalars::int2::matrix_int2_eq_path_op_blockers +scalars::int2::matrix_int2_eq_payload_check +scalars::int2::matrix_int2_eq_planner_metadata_eq +scalars::int2::matrix_int2_eq_sanity +scalars::int2::matrix_int2_eq_typed_column_blocker +scalars::int2::matrix_int2_fixture_shape +scalars::int2::matrix_int2_ord_aggregate_group_by_max +scalars::int2::matrix_int2_ord_aggregate_group_by_min +scalars::int2::matrix_int2_ord_aggregate_max +scalars::int2::matrix_int2_ord_aggregate_max_all_null +scalars::int2::matrix_int2_ord_aggregate_max_empty +scalars::int2::matrix_int2_ord_aggregate_max_mixed_null +scalars::int2::matrix_int2_ord_aggregate_min +scalars::int2::matrix_int2_ord_aggregate_min_all_null +scalars::int2::matrix_int2_ord_aggregate_min_empty +scalars::int2::matrix_int2_ord_aggregate_min_mixed_null +scalars::int2::matrix_int2_ord_aggregate_parallel_safe +scalars::int2::matrix_int2_ord_contained_by_blocker +scalars::int2::matrix_int2_ord_contains_blocker +scalars::int2::matrix_int2_ord_count_distinct_extractor +scalars::int2::matrix_int2_ord_count_path_cast +scalars::int2::matrix_int2_ord_count_typed_column +scalars::int2::matrix_int2_ord_eq_pivot_max_correctness +scalars::int2::matrix_int2_ord_eq_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_eq_pivot_min_correctness +scalars::int2::matrix_int2_ord_eq_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_eq_pivot_zero_correctness +scalars::int2::matrix_int2_ord_eq_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_eq_supported_null +scalars::int2::matrix_int2_ord_gt_pivot_max_correctness +scalars::int2::matrix_int2_ord_gt_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_gt_pivot_min_correctness +scalars::int2::matrix_int2_ord_gt_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_gt_pivot_zero_correctness +scalars::int2::matrix_int2_ord_gt_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_gt_supported_null +scalars::int2::matrix_int2_ord_gte_pivot_max_correctness +scalars::int2::matrix_int2_ord_gte_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_gte_pivot_min_correctness +scalars::int2::matrix_int2_ord_gte_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_gte_pivot_zero_correctness +scalars::int2::matrix_int2_ord_gte_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_gte_supported_null +scalars::int2::matrix_int2_ord_index_engages_btree +scalars::int2::matrix_int2_ord_lt_pivot_max_correctness +scalars::int2::matrix_int2_ord_lt_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_lt_pivot_min_correctness +scalars::int2::matrix_int2_ord_lt_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_lt_pivot_zero_correctness +scalars::int2::matrix_int2_ord_lt_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_lt_supported_null +scalars::int2::matrix_int2_ord_lte_pivot_max_correctness +scalars::int2::matrix_int2_ord_lte_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_lte_pivot_min_correctness +scalars::int2::matrix_int2_ord_lte_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_lte_pivot_zero_correctness +scalars::int2::matrix_int2_ord_lte_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_lte_supported_null +scalars::int2::matrix_int2_ord_native_absent_ops +scalars::int2::matrix_int2_ord_neq_pivot_max_correctness +scalars::int2::matrix_int2_ord_neq_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_neq_pivot_min_correctness +scalars::int2::matrix_int2_ord_neq_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_neq_pivot_zero_correctness +scalars::int2::matrix_int2_ord_neq_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_neq_supported_null +scalars::int2::matrix_int2_ord_ord_routes_through_ob +scalars::int2::matrix_int2_ord_order_by_asc_no_where +scalars::int2::matrix_int2_ord_order_by_asc_nulls_first +scalars::int2::matrix_int2_ord_order_by_asc_nulls_last +scalars::int2::matrix_int2_ord_order_by_asc_with_where +scalars::int2::matrix_int2_ord_order_by_desc_no_where +scalars::int2::matrix_int2_ord_order_by_desc_nulls_first +scalars::int2::matrix_int2_ord_order_by_desc_nulls_last +scalars::int2::matrix_int2_ord_order_by_desc_with_where +scalars::int2::matrix_int2_ord_order_by_using_gt_rejects +scalars::int2::matrix_int2_ord_order_by_using_gte_rejects +scalars::int2::matrix_int2_ord_order_by_using_lt_rejects +scalars::int2::matrix_int2_ord_order_by_using_lte_rejects +scalars::int2::matrix_int2_ord_ore_aggregate_group_by_max +scalars::int2::matrix_int2_ord_ore_aggregate_group_by_min +scalars::int2::matrix_int2_ord_ore_aggregate_max +scalars::int2::matrix_int2_ord_ore_aggregate_max_all_null +scalars::int2::matrix_int2_ord_ore_aggregate_max_empty +scalars::int2::matrix_int2_ord_ore_aggregate_max_mixed_null +scalars::int2::matrix_int2_ord_ore_aggregate_min +scalars::int2::matrix_int2_ord_ore_aggregate_min_all_null +scalars::int2::matrix_int2_ord_ore_aggregate_min_empty +scalars::int2::matrix_int2_ord_ore_aggregate_min_mixed_null +scalars::int2::matrix_int2_ord_ore_aggregate_parallel_safe +scalars::int2::matrix_int2_ord_ore_contained_by_blocker +scalars::int2::matrix_int2_ord_ore_contains_blocker +scalars::int2::matrix_int2_ord_ore_count_distinct_extractor +scalars::int2::matrix_int2_ord_ore_count_path_cast +scalars::int2::matrix_int2_ord_ore_count_typed_column +scalars::int2::matrix_int2_ord_ore_eq_pivot_max_correctness +scalars::int2::matrix_int2_ord_ore_eq_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_ore_eq_pivot_min_correctness +scalars::int2::matrix_int2_ord_ore_eq_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_ore_eq_pivot_zero_correctness +scalars::int2::matrix_int2_ord_ore_eq_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_ore_eq_supported_null +scalars::int2::matrix_int2_ord_ore_gt_pivot_max_correctness +scalars::int2::matrix_int2_ord_ore_gt_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_ore_gt_pivot_min_correctness +scalars::int2::matrix_int2_ord_ore_gt_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_ore_gt_pivot_zero_correctness +scalars::int2::matrix_int2_ord_ore_gt_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_ore_gt_supported_null +scalars::int2::matrix_int2_ord_ore_gte_pivot_max_correctness +scalars::int2::matrix_int2_ord_ore_gte_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_ore_gte_pivot_min_correctness +scalars::int2::matrix_int2_ord_ore_gte_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_ore_gte_pivot_zero_correctness +scalars::int2::matrix_int2_ord_ore_gte_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_ore_gte_supported_null +scalars::int2::matrix_int2_ord_ore_index_engages_btree +scalars::int2::matrix_int2_ord_ore_lt_pivot_max_correctness +scalars::int2::matrix_int2_ord_ore_lt_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_ore_lt_pivot_min_correctness +scalars::int2::matrix_int2_ord_ore_lt_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_ore_lt_pivot_zero_correctness +scalars::int2::matrix_int2_ord_ore_lt_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_ore_lt_supported_null +scalars::int2::matrix_int2_ord_ore_lte_pivot_max_correctness +scalars::int2::matrix_int2_ord_ore_lte_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_ore_lte_pivot_min_correctness +scalars::int2::matrix_int2_ord_ore_lte_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_ore_lte_pivot_zero_correctness +scalars::int2::matrix_int2_ord_ore_lte_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_ore_lte_supported_null +scalars::int2::matrix_int2_ord_ore_native_absent_ops +scalars::int2::matrix_int2_ord_ore_neq_pivot_max_correctness +scalars::int2::matrix_int2_ord_ore_neq_pivot_max_cross_shape +scalars::int2::matrix_int2_ord_ore_neq_pivot_min_correctness +scalars::int2::matrix_int2_ord_ore_neq_pivot_min_cross_shape +scalars::int2::matrix_int2_ord_ore_neq_pivot_zero_correctness +scalars::int2::matrix_int2_ord_ore_neq_pivot_zero_cross_shape +scalars::int2::matrix_int2_ord_ore_neq_supported_null +scalars::int2::matrix_int2_ord_ore_ord_routes_through_ob +scalars::int2::matrix_int2_ord_ore_order_by_asc_no_where +scalars::int2::matrix_int2_ord_ore_order_by_asc_nulls_first +scalars::int2::matrix_int2_ord_ore_order_by_asc_nulls_last +scalars::int2::matrix_int2_ord_ore_order_by_asc_with_where +scalars::int2::matrix_int2_ord_ore_order_by_desc_no_where +scalars::int2::matrix_int2_ord_ore_order_by_desc_nulls_first +scalars::int2::matrix_int2_ord_ore_order_by_desc_nulls_last +scalars::int2::matrix_int2_ord_ore_order_by_desc_with_where +scalars::int2::matrix_int2_ord_ore_order_by_using_gt_rejects +scalars::int2::matrix_int2_ord_ore_order_by_using_gte_rejects +scalars::int2::matrix_int2_ord_ore_order_by_using_lt_rejects +scalars::int2::matrix_int2_ord_ore_order_by_using_lte_rejects +scalars::int2::matrix_int2_ord_ore_ore_injectivity +scalars::int2::matrix_int2_ord_ore_path_op_blockers +scalars::int2::matrix_int2_ord_ore_payload_check +scalars::int2::matrix_int2_ord_ore_planner_metadata_eq +scalars::int2::matrix_int2_ord_ore_planner_metadata_ord +scalars::int2::matrix_int2_ord_ore_sanity +scalars::int2::matrix_int2_ord_ore_typed_column_blocker +scalars::int2::matrix_int2_ord_path_op_blockers +scalars::int2::matrix_int2_ord_payload_check +scalars::int2::matrix_int2_ord_planner_metadata_eq +scalars::int2::matrix_int2_ord_planner_metadata_ord +scalars::int2::matrix_int2_ord_sanity +scalars::int2::matrix_int2_ord_scale_preference_default_btree +scalars::int2::matrix_int2_ord_typed_column_blocker +scalars::int2::matrix_int2_storage_aggregate_typecheck_max +scalars::int2::matrix_int2_storage_aggregate_typecheck_min +scalars::int2::matrix_int2_storage_contained_by_blocker +scalars::int2::matrix_int2_storage_contains_blocker +scalars::int2::matrix_int2_storage_count_path_cast +scalars::int2::matrix_int2_storage_count_typed_column +scalars::int2::matrix_int2_storage_eq_blocker +scalars::int2::matrix_int2_storage_gt_blocker +scalars::int2::matrix_int2_storage_gte_blocker +scalars::int2::matrix_int2_storage_lt_blocker +scalars::int2::matrix_int2_storage_lte_blocker +scalars::int2::matrix_int2_storage_native_absent_ops +scalars::int2::matrix_int2_storage_neq_blocker +scalars::int2::matrix_int2_storage_path_op_blockers +scalars::int2::matrix_int2_storage_payload_check +scalars::int2::matrix_int2_storage_sanity +scalars::int2::matrix_int2_storage_typed_column_blocker diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 0db9482aa..36b348fd5 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -53,6 +53,7 @@ pub struct PlaintextSqlType(&'static str); impl PlaintextSqlType { pub const INTEGER: PlaintextSqlType = PlaintextSqlType("integer"); + pub const SMALLINT: PlaintextSqlType = PlaintextSqlType("smallint"); pub fn as_str(&self) -> &'static str { self.0 @@ -68,6 +69,7 @@ impl fmt::Display for PlaintextSqlType { mod sealed { pub trait Sealed {} impl Sealed for i32 {} + impl Sealed for i16 {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -96,6 +98,15 @@ impl EqlPlaintext for i32 { } } +impl EqlPlaintext for i16 { + const CAST: Cast = Cast::SMALL_INT; + const PLAINTEXT_SQL_TYPE: PlaintextSqlType = PlaintextSqlType::SMALLINT; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::SmallInt(Some(*self)) + } +} + #[cfg(test)] mod tests { use super::*; @@ -122,4 +133,27 @@ mod tests { other => panic!("expected Plaintext::Int(Some(42)), got {other:?}"), } } + + #[test] + fn i16_casts_to_small_int() { + assert_eq!(::CAST.as_str(), "small_int"); + } + + #[test] + fn i16_plaintext_sql_type_is_smallint() { + assert_eq!( + ::PLAINTEXT_SQL_TYPE.as_str(), + "smallint" + ); + } + + #[test] + fn i16_to_plaintext_wraps_in_small_int_variant() { + // i16 must lift into the SmallInt variant so the fixture driver + // encrypts it under the `small_int` cast, not `int`. + match 42_i16.to_plaintext() { + Plaintext::SmallInt(Some(value)) => assert_eq!(value, 42), + other => panic!("expected Plaintext::SmallInt(Some(42)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/fixtures/eql_v2_int2.rs b/tests/sqlx/src/fixtures/eql_v2_int2.rs new file mode 100644 index 000000000..ec4a13332 --- /dev/null +++ b/tests/sqlx/src/fixtures/eql_v2_int2.rs @@ -0,0 +1,12 @@ +//! The `eql_v2_int2` fixture — the int4 reference, clamped to 16 bits. +//! +//! 19 integers spanning a negative boundary, the i16 signed extremes +//! (`MIN`/`MAX`), zero, a pair near the ±32767 boundary, and +//! small/medium/large magnitudes. The generated +//! `tests/sqlx/fixtures/eql_v2_int2.sql` is a plain `jsonb`-payload table with +//! no EQL dependency; the `eql_v2_int2` domain is layered on top by casting +//! `payload` per query. + +use super::int2_values::VALUES; + +crate::scalar_fixture!("eql_v2_int2", i16, VALUES); diff --git a/tests/sqlx/src/fixtures/int2_values.rs b/tests/sqlx/src/fixtures/int2_values.rs new file mode 100644 index 000000000..74aff1c41 --- /dev/null +++ b/tests/sqlx/src/fixtures/int2_values.rs @@ -0,0 +1,33 @@ +// AUTO-GENERATED — DO NOT EDIT. +// Regenerated by `mise run build` (or `mise run codegen:domain `). +// Source of truth: tasks/codegen/types/.toml `[fixture] values`. +// This file IS committed and verified in CI (git diff --exit-code). +//! Fixture plaintext values for the int2 encrypted-domain family. +//! +//! Generated from tasks/codegen/types/int2.toml `[fixture] values` — +//! the single source of truth shared by the fixture generator +//! (`fixtures::eql_v2_int2`) and the matrix oracle +//! (`ScalarType::FIXTURE_VALUES`). + +/// Distinct plaintext values present in the `eql_v2_int2` fixture. +pub const VALUES: &[i16] = &[ + i16::MIN, + -30000, + -100, + -1, + 0, + 1, + 2, + 5, + 10, + 17, + 25, + 42, + 50, + 100, + 250, + 1000, + 9999, + 30000, + i16::MAX, +]; diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index ee087d1d1..ac363a49e 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -31,3 +31,9 @@ pub mod driver; pub mod int4_values; pub mod eql_v2_int4; + +/// Generated from tasks/codegen/types/int2.toml `[fixture] values`. +/// Committed and verified by CI; never hand-edit (`mise run codegen:domain int2`). +pub mod int2_values; + +pub mod eql_v2_int2; diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index e7567584a..c3acc4284 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -81,6 +81,15 @@ impl ScalarType for i32 { const FIXTURE_VALUES: &'static [i32] = crate::fixtures::int4_values::VALUES; } +impl ScalarType for i16 { + const PG_TYPE: &'static str = "int2"; + /// Single-sourced from `tasks/codegen/types/int2.toml` `[fixture] values` + /// via the generated `fixtures::int2_values::VALUES` const — the same list + /// the fixture generator encrypts, so the oracle cannot drift from the + /// fixture. Spans the negative boundary, the i16 signed extremes, and zero. + const FIXTURE_VALUES: &'static [i16] = crate::fixtures::int2_values::VALUES; +} + /// Per-domain capability + payload shape. Storage carries no terms, `Eq` /// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate /// twins — same operator surface, different SQL domain names — for the diff --git a/tests/sqlx/tests/encrypted_domain/scalars/int2.rs b/tests/sqlx/tests/encrypted_domain/scalars/int2.rs new file mode 100644 index 000000000..7a8e93314 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/scalars/int2.rs @@ -0,0 +1,14 @@ +//! `eql_v2_int2` — the int4 reference scalar, clamped to 16 bits. +//! +//! Adding a new ordered numeric scalar (i64, f64, date, ...) is one +//! `impl ScalarType` in `tests/sqlx/src/scalar_domains.rs` plus an +//! `ordered_numeric_matrix!` invocation like this one. The matrix covers +//! everything generic over `T: ScalarType`. + +use eql_tests::ordered_numeric_matrix; + +ordered_numeric_matrix! { + suite = int2, + scalar = i16, + eql_type = "eql_v2_int2", +} diff --git a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs index 8abc18571..f42cfb5f4 100644 --- a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs @@ -2,3 +2,5 @@ //! additions (`int8`, `bool`, `date`, …) become sibling modules here. pub mod int4; + +pub mod int2; From 2265e80aa6ea4db87cec185847a59643107a461d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 1 Jun 2026 15:17:44 +1000 Subject: [PATCH 024/599] ci(fixtures): regenerate all scalar fixtures via fixture:generate:all MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test task hand-listed only eql_v2_int4 for fixture regeneration, so the int2 matrix test's compile-time include_str! of eql_v2_int2.sql failed in CI (fixtures are gitignored and regenerated each run). Add a fixture:generate:all task that enumerates tasks/codegen/types/*.toml — the same manifests codegen:domain:all drives — and regenerates the fixture for every type declaring a [fixture] table, then call it from the test task. New scalar types are now picked up automatically. --- mise.toml | 5 ++++- tasks/fixtures.toml | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index c513202fa..8eecd6b6d 100644 --- a/mise.toml +++ b/mise.toml @@ -51,6 +51,9 @@ cd tests/sqlx sqlx migrate run # Regenerate fixtures every run — they are not committed (see .gitignore). +# fixture:generate:all enumerates every scalar manifest in +# tasks/codegen/types/ that declares a [fixture] table, so new scalar types +# are picked up automatically without editing this task. # Generator encrypts via cipherstash-client directly, which needs BOTH a # ZeroKMS auth credential (CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN, via # AutoStrategy) AND a client key (CS_CLIENT_ID + CS_CLIENT_KEY, via @@ -58,7 +61,7 @@ sqlx migrate run # separate roles — the two pairs are not alternatives. echo "Regenerating SQLx fixtures..." cd "{{config_root}}" -mise run fixture:generate eql_v2_int4 +mise run fixture:generate:all echo "Running Rust tests..." cd tests/sqlx diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index acce7495e..ecfe3ad9c 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -27,3 +27,32 @@ cargo test --features fixture-gen --lib \ "fixtures::${fixture}::generate" \ -- --ignored --exact --nocapture """ + +["fixture:generate:all"] +description = "Regenerate every scalar SQLx fixture declared by a type manifest" +# Enumerates tasks/codegen/types/*.toml — the SAME manifests that +# `codegen:domain:all` drives — and regenerates the SQLx fixture for each type +# whose manifest declares a [fixture] table. This keeps the test fixtures in +# lockstep with the declared scalar types: adding a new scalar type (a new +# .toml with a [fixture] table) is picked up automatically, so the test +# task never has to hand-list each fixture. Same prerequisites as +# `fixture:generate` (Postgres up + CS_* credentials). +dir = "{{config_root}}" +run = """ +generated=0 +for manifest in tasks/codegen/types/*.toml; do + # Guard the no-match case (glob stays literal under POSIX sh). + [ -e "$manifest" ] || continue + # Only types that declare a [fixture] table have a SQLx fixture generator. + grep -qE '^\\[fixture\\]' "$manifest" || continue + token=$(basename "$manifest" .toml) + echo "Generating fixture eql_v2_${token}..." + mise run fixture:generate "eql_v2_${token}" + generated=$((generated + 1)) +done +if [ "$generated" -eq 0 ]; then + echo "No scalar manifests with a [fixture] table found in tasks/codegen/types/" >&2 + exit 1 +fi +echo "Regenerated ${generated} scalar fixture(s)." +""" From 2e8f05909d37d862e9e4bd20ea321caaa8a1488e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 29 May 2026 16:10:31 +1000 Subject: [PATCH 025/599] test(int4): split out cargo-expand macro-expansion snapshot guard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the int4 matrix `cargo expand` snapshot and its regeneration tooling into this stacked PR so the main int4 PR (#239) no longer carries the ~37k-line generated snapshot. The snapshot is a body-level fidelity backstop for the `ordered_numeric_matrix!` / `scalar_domain_matrix!` macros — it catches changes *inside* generated test bodies, complementing the name-inventory snapshot (`int4_matrix_tests.txt`, checked in test-eql.yml) that catches add/remove of whole arms. - tests/sqlx/snapshots/int4_expanded.rs — the expanded matrix snapshot - .github/workflows/macro-expand-eql.yml — nightly, non-blocking drift check - mise.toml — the `test:matrix:expand` regeneration task (pinned nightly) --- .github/workflows/macro-expand-eql.yml | 69 + mise.toml | 43 + tests/sqlx/snapshots/int4_expanded.rs | 28811 +++++++++++++++++++++++ 3 files changed, 28923 insertions(+) create mode 100644 .github/workflows/macro-expand-eql.yml create mode 100644 tests/sqlx/snapshots/int4_expanded.rs diff --git a/.github/workflows/macro-expand-eql.yml b/.github/workflows/macro-expand-eql.yml new file mode 100644 index 000000000..5ba71543c --- /dev/null +++ b/.github/workflows/macro-expand-eql.yml @@ -0,0 +1,69 @@ +name: "Macro expand EQL" + +# Regenerates the int4 matrix `cargo expand` snapshot and fails if it has +# drifted from the committed copy. This is a body-level fidelity backstop for +# the `ordered_numeric_matrix!` / `scalar_domain_matrix!` macros — the +# name-inventory snapshot (test-eql.yml `matrix-coverage` job) catches +# add/remove of whole arms; this catches changes *inside* the generated bodies. +# +# Non-blocking by design: it is NOT a required PR check. `cargo expand` needs a +# nightly toolchain, so it is isolated off the PR path. +# - nightly schedule (the backstop that flags a forgotten local regen) +# - manual workflow_dispatch +# +# The toolchain is pinned (nightly-2026-05-01) in lockstep with the +# `test:matrix:expand` mise task so the snapshot only moves when the macro +# moves, not when nightly reformats its expansion. Bump both together. +on: + schedule: + # 03:00 UTC daily + - cron: "0 3 * * *" + + workflow_dispatch: + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" + MISE_VERBOSE: "1" + +defaults: + run: + shell: bash -l {0} + +permissions: + contents: read + +jobs: + macro-expand: + name: "Macro expand drift (nightly)" + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - uses: jdx/mise-action@v4 + with: + version: 2026.4.0 + install: true + cache: true + + - uses: Swatinem/rust-cache@v2 + with: + workspaces: tests/sqlx + shared-key: sqlx-tests + + # Pinned nightly — keep the date in lockstep with the `cargo +nightly-...` + # invocation in the `test:matrix:expand` mise task. rustfmt formats the + # expansion deterministically. + - name: Install pinned nightly + cargo-expand + run: | + rustup toolchain install nightly-2026-05-01 --profile minimal --component rustfmt + cargo binstall -y cargo-expand + + - name: Regenerate and verify the matrix expansion snapshot + run: | + mise run test:matrix:expand + git diff --exit-code -- tests/sqlx/snapshots/int4_expanded.rs \ + || { echo "Expansion snapshot stale — run 'mise run test:matrix:expand' (needs the pinned nightly) and commit."; exit 1; } diff --git a/mise.toml b/mise.toml index 8eecd6b6d..635144b67 100644 --- a/mise.toml +++ b/mise.toml @@ -123,3 +123,46 @@ cargo test --no-default-features --test encrypted_domain -- --list | grep '^scalars::int2' | LC_ALL=C sort > snapshots/int2_matrix_tests.txt """ + +[tasks."test:matrix:expand"] +description = "Regenerate the int4 matrix cargo-expand snapshot (requires the pinned nightly + cargo-expand)" +dir = "{{config_root}}/tests/sqlx" +run = """ +# Body-level fidelity backstop for the macro: the expanded source of the int4 +# matrix arms. NIGHTLY is pinned to a known-good date so the snapshot only moves +# when *the macro* moves, not when nightly reformats — bump the date deliberately +# and in lockstep with .github/workflows/macro-expand-eql.yml. +# +# `#[sqlx::test]` embeds one `sqlx::migrate::Migration` per file in migrations/ +# plus the fixture (via include_str) into EVERY generated test — ~477 MB of +# repeated data dwarfing the macro bodies, and non-deterministic across +# environments (the generated 001_install_eql.sql is absent in a bare checkout). +# Normalise both to fixed empties so the snapshot depends only on matrix.rs + +# the sqlx/test harness: swap migrations/ for a single empty placeholder and +# empty the int4 fixture, expand, then restore (trap fires on any exit). This is +# expand-only surgery on gitignored/generated inputs; nothing here is committed. +# +# Non-blocking lane (no Postgres, never compiled): the `.rs` name lives under +# snapshots/, not tests/, so Cargo never treats it as a test target. +set -euo pipefail +mkdir -p snapshots fixtures +BK=$(mktemp -d) +cp -a migrations "$BK/migrations" +# The int4 fixture is gitignored (regenerated) and absent in a bare checkout — +# back it up only if present, and on restore drop the empty stand-in if so. +HAD_FIXTURE=0 +if [ -f fixtures/eql_v2_int4.sql ]; then cp -a fixtures/eql_v2_int4.sql "$BK/eql_v2_int4.sql"; HAD_FIXTURE=1; fi +restore() { + rm -rf migrations && cp -a "$BK/migrations" migrations + if [ "$HAD_FIXTURE" = 1 ]; then cp -af "$BK/eql_v2_int4.sql" fixtures/eql_v2_int4.sql; else rm -f fixtures/eql_v2_int4.sql; fi + rm -rf "$BK" +} +trap restore EXIT +# Wipe + recreate so the expand input is ALWAYS exactly one empty migration + +# one empty fixture, regardless of what the checkout had — this is what makes +# the snapshot deterministic across local and CI. +rm -rf migrations && mkdir migrations +: > migrations/0001_placeholder.sql +: > fixtures/eql_v2_int4.sql +cargo +nightly-2026-05-01 expand --test encrypted_domain scalars::int4 > snapshots/int4_expanded.rs +""" diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/int4_expanded.rs new file mode 100644 index 000000000..3441b01b1 --- /dev/null +++ b/tests/sqlx/snapshots/int4_expanded.rs @@ -0,0 +1,28811 @@ +pub mod int4 { + //! `eql_v2_int4` — the reference scalar implementation. + //! + //! Adding a new ordered numeric scalar (i64, f64, date, ...) is one + //! `impl ScalarType` in `tests/sqlx/src/scalar_domains.rs` plus an + //! `ordered_numeric_matrix!` invocation like this one. The matrix covers + //! everything generic over `T: ScalarType`. + use eql_tests::ordered_numeric_matrix; + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_sanity"] + #[doc(hidden)] + pub const matrix_int4_storage_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_storage_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 451usize, + start_col: 26usize, + end_line: 451usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_sanity()), + ), + }; + fn matrix_int4_storage_sanity() -> anyhow::Result<()> { + async fn matrix_int4_storage_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_sanity"] + #[doc(hidden)] + pub const matrix_int4_eq_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 451usize, + start_col: 26usize, + end_line: 451usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_sanity()), + ), + }; + fn matrix_int4_eq_sanity() -> anyhow::Result<()> { + async fn matrix_int4_eq_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_sanity"] + #[doc(hidden)] + pub const matrix_int4_ord_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_ord_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 451usize, + start_col: 26usize, + end_line: 451usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_sanity()), + ), + }; + fn matrix_int4_ord_sanity() -> anyhow::Result<()> { + async fn matrix_int4_ord_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_sanity"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_ord_ore_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 451usize, + start_col: 26usize, + end_line: 451usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_sanity()), + ), + }; + fn matrix_int4_ord_ore_sanity() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_eq_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_eq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_eq_pivot_min_correctness()), + ), + }; + fn matrix_int4_eq_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_eq_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_eq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_eq_pivot_max_correctness()), + ), + }; + fn matrix_int4_eq_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_eq_eq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_eq_pivot_zero_correctness()), + ), + }; + fn matrix_int4_eq_eq_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_eq_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_neq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_neq_pivot_min_correctness()), + ), + }; + fn matrix_int4_eq_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_eq_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_neq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_neq_pivot_max_correctness()), + ), + }; + fn matrix_int4_eq_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_eq_neq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_neq_pivot_zero_correctness()), + ), + }; + fn matrix_int4_eq_neq_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_eq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_eq_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_eq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_eq_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_eq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_eq_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_eq_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_neq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_neq_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_neq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_neq_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_neq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_neq_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_neq_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_ore_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_ore_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_eq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_ore_eq_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_ore_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_ore_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_neq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_ore_neq_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lt_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_lt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lt_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_lt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_lt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lt_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_lt_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lte_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_lte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lte_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_lte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_lte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lte_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_lte_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gt_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_gt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gt_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_gt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_gt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gt_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_gt_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gte_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_gte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gte_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_gte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_gte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gte_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_gte_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_ore_lt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_ore_lt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_ore_lt_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_ore_lte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_ore_lte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_ore_lte_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_ore_gt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_ore_gt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_ore_gt_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_min_correctness()), + ), + }; + fn matrix_int4_ord_ore_gte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_max_correctness()), + ), + }; + fn matrix_int4_ord_ore_gte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 587usize, + start_col: 22usize, + end_line: 587usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_zero_correctness()), + ), + }; + fn matrix_int4_ord_ore_gte_pivot_zero_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_zero_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{0} {1} {2}::jsonb::{0}", + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + i32, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_zero_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_eq_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_eq_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_eq_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_eq_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_eq_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_eq_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_eq_eq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_eq_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_eq_eq_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_eq_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_neq_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_eq_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_eq_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_neq_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_eq_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_eq_neq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_neq_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_eq_neq_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_eq_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_eq_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_eq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_eq_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_eq_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_neq_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_neq_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_neq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_neq_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_neq_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_eq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_eq_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_neq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_neq_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<>", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lt_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_lt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lt_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_lt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_lt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lt_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_lt_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lte_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_lte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lte_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_lte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_lte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lte_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_lte_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gt_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_gt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gt_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_gt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_gt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gt_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_gt_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gte_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_gte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gte_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_gte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_gte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gte_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_gte_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_lt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_lt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_lt_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_lte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_lte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_lte_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + "<=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_gt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_gt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_gt_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_min_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_gte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MIN; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_max_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_gte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::MAX; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 628usize, + start_col: 22usize, + end_line: 628usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_zero_cross_shape()), + ), + }; + fn matrix_int4_ord_ore_gte_pivot_zero_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_zero_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: i32 = ::default(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot, + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot, + ) + .len() as i64; + let d = &spec.sql_domain; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "payload::{1} {0} {2}::jsonb::{1}", + ">=", + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_zero_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_supported_null"] + #[doc(hidden)] + pub const matrix_int4_eq_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_eq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_eq_supported_null()), + ), + }; + fn matrix_int4_eq_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_eq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_supported_null"] + #[doc(hidden)] + pub const matrix_int4_eq_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_neq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_neq_supported_null()), + ), + }; + fn matrix_int4_eq_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<>", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_neq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_eq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_eq_supported_null()), + ), + }; + fn matrix_int4_ord_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_eq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_neq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_neq_supported_null()), + ), + }; + fn matrix_int4_ord_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<>", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_neq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_eq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_eq_supported_null()), + ), + }; + fn matrix_int4_ord_ore_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_neq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_neq_supported_null()), + ), + }; + fn matrix_int4_ord_ore_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<>", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lt_supported_null()), + ), + }; + fn matrix_int4_ord_lt_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_lt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_lte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_lte_supported_null()), + ), + }; + fn matrix_int4_ord_lte_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_lte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gt_supported_null()), + ), + }; + fn matrix_int4_ord_gt_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_gt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_gte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_gte_supported_null()), + ), + }; + fn matrix_int4_ord_gte_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_gte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lt_supported_null()), + ), + }; + fn matrix_int4_ord_ore_lt_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_lte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_lte_supported_null()), + ), + }; + fn matrix_int4_ord_ore_lte_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gt_supported_null()), + ), + }; + fn matrix_int4_ord_ore_gt_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_supported_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_gte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 680usize, + start_col: 22usize, + end_line: 680usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_gte_supported_null()), + ), + }; + fn matrix_int4_ord_ore_gte_supported_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_eq_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_eq_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_storage_eq_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_eq_blocker()), + ), + }; + fn matrix_int4_storage_eq_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_eq_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_eq_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_eq_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_neq_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_neq_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_storage_neq_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_neq_blocker()), + ), + }; + fn matrix_int4_storage_neq_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_neq_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_neq_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_neq_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_lt_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_storage_lt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_lt_blocker()), + ), + }; + fn matrix_int4_storage_lt_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_lt_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_lt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_lt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_lte_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_storage_lte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_lte_blocker()), + ), + }; + fn matrix_int4_storage_lte_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_lte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_lte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_lte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_gt_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_storage_gt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_gt_blocker()), + ), + }; + fn matrix_int4_storage_gt_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_gt_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_gt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_gt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_gte_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_storage_gte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_gte_blocker()), + ), + }; + fn matrix_int4_storage_gte_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_gte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_gte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_gte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_contains_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_contains_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_contains_blocker()), + ), + }; + fn matrix_int4_storage_contains_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_contained_by_blocker()), + ), + }; + fn matrix_int4_storage_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_lt_blocker"] + #[doc(hidden)] + pub const matrix_int4_eq_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_lt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_lt_blocker()), + ), + }; + fn matrix_int4_eq_lt_blocker() -> anyhow::Result<()> { + async fn matrix_int4_eq_lt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_lt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_lt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_lte_blocker"] + #[doc(hidden)] + pub const matrix_int4_eq_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_lte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_lte_blocker()), + ), + }; + fn matrix_int4_eq_lte_blocker() -> anyhow::Result<()> { + async fn matrix_int4_eq_lte_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_lte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_lte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_gt_blocker"] + #[doc(hidden)] + pub const matrix_int4_eq_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_gt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_gt_blocker()), + ), + }; + fn matrix_int4_eq_gt_blocker() -> anyhow::Result<()> { + async fn matrix_int4_eq_gt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_gt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_gt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_gte_blocker"] + #[doc(hidden)] + pub const matrix_int4_eq_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_gte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_gte_blocker()), + ), + }; + fn matrix_int4_eq_gte_blocker() -> anyhow::Result<()> { + async fn matrix_int4_eq_gte_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_gte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_gte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_contains_blocker"] + #[doc(hidden)] + pub const matrix_int4_eq_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_contains_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_contains_blocker()), + ), + }; + fn matrix_int4_eq_contains_blocker() -> anyhow::Result<()> { + async fn matrix_int4_eq_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_int4_eq_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_contained_by_blocker()), + ), + }; + fn matrix_int4_eq_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_int4_eq_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_contains_blocker"] + #[doc(hidden)] + pub const matrix_int4_ord_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_contains_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_contains_blocker()), + ), + }; + fn matrix_int4_ord_contains_blocker() -> anyhow::Result<()> { + async fn matrix_int4_ord_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_int4_ord_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_contained_by_blocker()), + ), + }; + fn matrix_int4_ord_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_int4_ord_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_contains_blocker"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_contains_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_contains_blocker()), + ), + }; + fn matrix_int4_ord_ore_contains_blocker() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 744usize, + start_col: 22usize, + end_line: 744usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_contained_by_blocker()), + ), + }; + fn matrix_int4_ord_ore_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_payload_check"] + #[doc(hidden)] + pub const matrix_int4_storage_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_payload_check", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 811usize, + start_col: 22usize, + end_line: 811usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_payload_check()), + ), + }; + fn matrix_int4_storage_payload_check() -> anyhow::Result<()> { + async fn matrix_int4_storage_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.variant.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_payload_check"] + #[doc(hidden)] + pub const matrix_int4_eq_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_payload_check"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 811usize, + start_col: 22usize, + end_line: 811usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_payload_check()), + ), + }; + fn matrix_int4_eq_payload_check() -> anyhow::Result<()> { + async fn matrix_int4_eq_payload_check(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.variant.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_payload_check"] + #[doc(hidden)] + pub const matrix_int4_ord_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_ord_payload_check"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 811usize, + start_col: 22usize, + end_line: 811usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_payload_check()), + ), + }; + fn matrix_int4_ord_payload_check() -> anyhow::Result<()> { + async fn matrix_int4_ord_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.variant.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_payload_check"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_payload_check", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 811usize, + start_col: 22usize, + end_line: 811usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_payload_check()), + ), + }; + fn matrix_int4_ord_ore_payload_check() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.variant.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_path_op_blockers"] + #[doc(hidden)] + pub const matrix_int4_storage_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 884usize, + start_col: 22usize, + end_line: 884usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_path_op_blockers()), + ), + }; + fn matrix_int4_storage_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_int4_storage_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_path_op_blockers"] + #[doc(hidden)] + pub const matrix_int4_eq_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_path_op_blockers"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 884usize, + start_col: 22usize, + end_line: 884usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_path_op_blockers()), + ), + }; + fn matrix_int4_eq_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_int4_eq_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_path_op_blockers"] + #[doc(hidden)] + pub const matrix_int4_ord_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 884usize, + start_col: 22usize, + end_line: 884usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_path_op_blockers()), + ), + }; + fn matrix_int4_ord_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_int4_ord_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_path_op_blockers"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 884usize, + start_col: 22usize, + end_line: 884usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_path_op_blockers()), + ), + }; + fn matrix_int4_ord_ore_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_native_absent_ops"] + #[doc(hidden)] + pub const matrix_int4_storage_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 941usize, + start_col: 22usize, + end_line: 941usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_native_absent_ops()), + ), + }; + fn matrix_int4_storage_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_int4_storage_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_native_absent_ops"] + #[doc(hidden)] + pub const matrix_int4_eq_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 941usize, + start_col: 22usize, + end_line: 941usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_native_absent_ops()), + ), + }; + fn matrix_int4_eq_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_int4_eq_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_native_absent_ops"] + #[doc(hidden)] + pub const matrix_int4_ord_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 941usize, + start_col: 22usize, + end_line: 941usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_native_absent_ops()), + ), + }; + fn matrix_int4_ord_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_int4_ord_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_native_absent_ops"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 941usize, + start_col: 22usize, + end_line: 941usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_native_absent_ops()), + ), + }; + fn matrix_int4_ord_ore_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 994usize, + start_col: 22usize, + end_line: 994usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_typed_column_blocker()), + ), + }; + fn matrix_int4_storage_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_int4_eq_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 994usize, + start_col: 22usize, + end_line: 994usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_typed_column_blocker()), + ), + }; + fn matrix_int4_eq_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_int4_eq_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_int4_ord_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 994usize, + start_col: 22usize, + end_line: 994usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_typed_column_blocker()), + ), + }; + fn matrix_int4_ord_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_int4_ord_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 994usize, + start_col: 22usize, + end_line: 994usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_typed_column_blocker()), + ), + }; + fn matrix_int4_ord_ore_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_planner_metadata_eq"] + #[doc(hidden)] + pub const matrix_int4_eq_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_planner_metadata_eq", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1075usize, + start_col: 22usize, + end_line: 1075usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_planner_metadata_eq()), + ), + }; + fn matrix_int4_eq_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_int4_eq_planner_metadata_eq( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let ops: &[&str] = &["=", "<>"]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_planner_metadata_eq", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_planner_metadata_eq; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_planner_metadata_eq"] + #[doc(hidden)] + pub const matrix_int4_ord_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_planner_metadata_eq", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1075usize, + start_col: 22usize, + end_line: 1075usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_planner_metadata_eq()), + ), + }; + fn matrix_int4_ord_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_int4_ord_planner_metadata_eq( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let ops: &[&str] = &["=", "<>"]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_planner_metadata_eq", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_planner_metadata_eq; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_planner_metadata_eq"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_planner_metadata_eq", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1075usize, + start_col: 22usize, + end_line: 1075usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_planner_metadata_eq()), + ), + }; + fn matrix_int4_ord_ore_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_planner_metadata_eq( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let ops: &[&str] = &["=", "<>"]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_planner_metadata_eq", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_planner_metadata_eq; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_planner_metadata_ord"] + #[doc(hidden)] + pub const matrix_int4_ord_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_planner_metadata_ord", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1075usize, + start_col: 22usize, + end_line: 1075usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_planner_metadata_ord()), + ), + }; + fn matrix_int4_ord_planner_metadata_ord() -> anyhow::Result<()> { + async fn matrix_int4_ord_planner_metadata_ord( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let ops: &[&str] = &["<", "<=", ">", ">="]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_planner_metadata_ord", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_planner_metadata_ord; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_planner_metadata_ord"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_planner_metadata_ord", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1075usize, + start_col: 22usize, + end_line: 1075usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_planner_metadata_ord()), + ), + }; + fn matrix_int4_ord_ore_planner_metadata_ord() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_planner_metadata_ord( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let ops: &[&str] = &["<", "<=", ">", ">="]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_planner_metadata_ord", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_planner_metadata_ord; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_index_engages_btree"] + #[doc(hidden)] + pub const matrix_int4_eq_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1641usize, + start_col: 22usize, + end_line: 1641usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_index_engages_btree()), + ), + }; + fn matrix_int4_eq_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_int4_eq_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let table = "matrix_int4_eq_idx_btree"; + let index = "matrix_int4_eq_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + "eql_v2.eq_term", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: i32 = ::FIXTURE_VALUES[0]; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_index_engages_hash"] + #[doc(hidden)] + pub const matrix_int4_eq_index_engages_hash: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_index_engages_hash", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1641usize, + start_col: 22usize, + end_line: 1641usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_index_engages_hash()), + ), + }; + fn matrix_int4_eq_index_engages_hash() -> anyhow::Result<()> { + async fn matrix_int4_eq_index_engages_hash( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let table = "matrix_int4_eq_idx_hash"; + let index = "matrix_int4_eq_idx_hash_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "hash", + "eql_v2.eq_term", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: i32 = ::FIXTURE_VALUES[0]; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_index_engages_hash", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_index_engages_hash; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_index_engages_btree"] + #[doc(hidden)] + pub const matrix_int4_ord_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1641usize, + start_col: 22usize, + end_line: 1641usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_index_engages_btree()), + ), + }; + fn matrix_int4_ord_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_int4_ord_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let table = "matrix_int4_ord_idx_btree"; + let index = "matrix_int4_ord_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + "eql_v2.ord_term", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: i32 = ::FIXTURE_VALUES[0]; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_index_engages_btree"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1641usize, + start_col: 22usize, + end_line: 1641usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_index_engages_btree()), + ), + }; + fn matrix_int4_ord_ore_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let table = "matrix_int4_ord_ore_idx_btree"; + let index = "matrix_int4_ord_ore_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + "eql_v2.ord_term", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: i32 = ::FIXTURE_VALUES[0]; + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_scale_preference_default_btree"] + #[doc(hidden)] + pub const matrix_int4_ord_scale_preference_default_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_scale_preference_default_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1263usize, + start_col: 22usize, + end_line: 1263usize, + end_col: 86usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_scale_preference_default_btree()), + ), + }; + fn matrix_int4_ord_scale_preference_default_btree() -> anyhow::Result<()> { + async fn matrix_int4_ord_scale_preference_default_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_scaledef_btree"; + let index = "matrix_int4_ord_scaledef_btree_idx"; + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "scale test requires >= 2 fixture rows for distinct filler/pivot", + ), + ); + error + }); + } + let filler = values[0]; + let pivot = values[values.len() / 2]; + let filler_payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, filler) + .await?; + let pivot_payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + i32, + >(&pool, pivot) + .await?; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (value {1}) ON COMMIT DROP", + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {0}(value) SELECT $1::jsonb::{1} FROM generate_series(1, 5000)", + table, + d, + ), + ) + }), + ) + .bind(&filler_payload) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {0}(value) VALUES ($1::jsonb::{1})", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + "eql_v2.ord_term", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + let lit = pivot_payload.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value = \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + "with seqscan ON the planner must PREFER the ord_term functional index for a selective =", + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_scale_preference_default_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_scale_preference_default_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_fixture_shape"] + #[doc(hidden)] + pub const matrix_int4_fixture_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_fixture_shape"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1341usize, + start_col: 22usize, + end_line: 1341usize, + end_col: 55usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_fixture_shape()), + ), + }; + fn matrix_int4_fixture_shape() -> anyhow::Result<()> { + async fn matrix_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let table = ::fixture_table_name(); + let expected: &[i32] = ::FIXTURE_VALUES; + let n = expected.len() as i64; + let count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT COUNT(*) FROM {0}", table), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(count == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "row count must match FIXTURE_VALUES.len(): want {0}, got {1}", + n, + count, + ), + ); + error + }); + } + let ids: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT id FROM {0} ORDER BY id", table), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not(ids == (1..=n).collect::>()) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("ids must be sequential from 1: got {0:?}", ids), + ); + error + }); + } + let plaintexts: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT plaintext FROM {0} ORDER BY id", table), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not(plaintexts == expected) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "plaintext column must match FIXTURE_VALUES in order", + ), + ); + error + }); + } + for (label, predicate) in [ + ( + "hm string", + "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", + ), + ( + "ob array", + "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", + ), + ( + "c string", + "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", + ), + ] { + let missing: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(missing == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "every payload must carry a `{0}` term; missing = {1}", + label, + missing, + ), + ); + error + }); + } + } + let distinct_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT payload->>\'hm\') FROM {0}", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(distinct_hm == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0} distinct values -> {0} distinct hm terms; got {1}", + n, + distinct_hm, + ), + ); + error + }); + } + let mismatched_version: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload->\'v\' IS NULL OR payload->>\'v\' <> \'2\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(mismatched_version == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("every payload must declare v = \'2\'"), + ); + error + }); + } + if !expected.is_empty() { + let probe = expected[expected.len() / 2]; + let probe_lit = ::to_sql_literal(probe); + let expected_id = (expected.len() / 2 + 1) as i64; + let ids: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT id FROM {1} WHERE plaintext = {0} ORDER BY id", + probe_lit, + table, + ), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not( + ids + == ::alloc::boxed::box_assume_init_into_vec_unsafe( + ::alloc::intrinsics::write_box_via_move( + ::alloc::boxed::Box::new_uninit(), + [expected_id], + ), + ), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected exactly one row with plaintext = {0:?} at id {1}, got {2:?}", + probe, + expected_id, + ids, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_fixture_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_fixture_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ord_routes_through_ob"] + #[doc(hidden)] + pub const matrix_int4_ord_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ord_routes_through_ob", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1444usize, + start_col: 22usize, + end_line: 1444usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ord_routes_through_ob()), + ), + }; + fn matrix_int4_ord_ord_routes_through_ob() -> anyhow::Result<()> { + async fn matrix_int4_ord_ord_routes_through_ob( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_no_hm"; + let index = "matrix_int4_ord_no_hm_idx"; + let fixture_table = ::fixture_table_name(); + let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot_lit = ::to_sql_literal( + pivot, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {1} (plaintext {0}, value {2}) ON COMMIT DROP", + ::PG_TYPE, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, (payload - \'hm\')::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let with_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", + table, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(with_hm == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("test rows must not carry hm"), + ); + error + }); + } + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {0} ON {1} USING btree (eql_v2.ord_term(value))", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot_payload: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (payload - \'hm\')::text FROM {0} WHERE plaintext = {1}", + fixture_table, + pivot_lit, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let eq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value = $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(eq_count == 1) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "= must match exactly the pivot row via ob with no hm present (want 1, got {0})", + eq_count, + ), + ); + error + }); + } + let expected_neq = ::FIXTURE_VALUES + .len() as i64 - eq_count; + let neq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value <> $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(neq_count == expected_neq) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "<> must match every non-pivot fixture row (want {0}, got {1})", + expected_neq, + neq_count, + ), + ); + error + }); + } + let lit = pivot_payload.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value = \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + "= must engage the eql_v2.ord_term functional btree with no hm", + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ord_routes_through_ob", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ord_routes_through_ob; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1444usize, + start_col: 22usize, + end_line: 1444usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_ord_routes_through_ob()), + ), + }; + fn matrix_int4_ord_ore_ord_routes_through_ob() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_ord_routes_through_ob( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_ore_no_hm"; + let index = "matrix_int4_ord_ore_no_hm_idx"; + let fixture_table = ::fixture_table_name(); + let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot_lit = ::to_sql_literal( + pivot, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {1} (plaintext {0}, value {2}) ON COMMIT DROP", + ::PG_TYPE, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, (payload - \'hm\')::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let with_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", + table, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(with_hm == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("test rows must not carry hm"), + ); + error + }); + } + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {0} ON {1} USING btree (eql_v2.ord_term(value))", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot_payload: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (payload - \'hm\')::text FROM {0} WHERE plaintext = {1}", + fixture_table, + pivot_lit, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let eq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value = $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(eq_count == 1) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "= must match exactly the pivot row via ob with no hm present (want 1, got {0})", + eq_count, + ), + ); + error + }); + } + let expected_neq = ::FIXTURE_VALUES + .len() as i64 - eq_count; + let neq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value <> $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(neq_count == expected_neq) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "<> must match every non-pivot fixture row (want {0}, got {1})", + expected_neq, + neq_count, + ), + ); + error + }); + } + let lit = pivot_payload.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value = \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + "= must engage the eql_v2.ord_term functional btree with no hm", + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_ord_routes_through_ob; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_ore_injectivity"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_ore_injectivity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_ore_injectivity", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1578usize, + start_col: 22usize, + end_line: 1578usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_ore_injectivity()), + ), + }; + fn matrix_int4_ord_ore_ore_injectivity() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_ore_injectivity( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture_table = ::fixture_table_name(); + let collisions: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} a JOIN {0} b ON a.id < b.id WHERE a.payload::{1} = b.payload::{1}", + fixture_table, + d, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(collisions == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "no two distinct plaintexts may share an ORE term on {0}", + d, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_ore_injectivity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_ore_injectivity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_ord_aggregate_min"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2087usize, + start_col: 22usize, + end_line: 2087usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_min()), + ), + }; + fn matrix_int4_ord_aggregate_min() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let extremum: i32 = ::FIXTURE_VALUES + .iter() + .copied() + .min() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + extremum_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "min", + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "min", + d, + extremum, + "min", + ), + ), + ); + } + } + }; + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "min", + d, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "min", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min_empty"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_min_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2145usize, + start_col: 22usize, + end_line: 2145usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_min_empty()), + ), + }; + fn matrix_int4_ord_aggregate_min_empty() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_min_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "min", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_min_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min_all_null"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_min_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2170usize, + start_col: 22usize, + end_line: 2170usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_min_all_null()), + ), + }; + fn matrix_int4_ord_aggregate_min_all_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_min_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "min", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "min", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_min_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min_mixed_null"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_min_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2196usize, + start_col: 22usize, + end_line: 2196usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_min_mixed_null()), + ), + }; + fn matrix_int4_ord_aggregate_min_mixed_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_min_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: i32 = *sorted.first().expect("non-empty after len check"); + let high: i32 = *sorted.last().expect("non-empty after len check"); + let expected_plaintext: i32 = low.min(high); + let low_lit = ::to_sql_literal(low); + let high_lit = ::to_sql_literal(high); + let expected_lit = ::to_sql_literal( + expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + expected_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "min", + "min", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_min_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_ord_aggregate_max"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2087usize, + start_col: 22usize, + end_line: 2087usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_max()), + ), + }; + fn matrix_int4_ord_aggregate_max() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let extremum: i32 = ::FIXTURE_VALUES + .iter() + .copied() + .max() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + extremum_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "max", + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "max", + d, + extremum, + "max", + ), + ), + ); + } + } + }; + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "max", + d, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "max", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max_empty"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_max_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2145usize, + start_col: 22usize, + end_line: 2145usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_max_empty()), + ), + }; + fn matrix_int4_ord_aggregate_max_empty() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_max_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "max", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_max_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max_all_null"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_max_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2170usize, + start_col: 22usize, + end_line: 2170usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_max_all_null()), + ), + }; + fn matrix_int4_ord_aggregate_max_all_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_max_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "max", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "max", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_max_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max_mixed_null"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_max_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2196usize, + start_col: 22usize, + end_line: 2196usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_max_mixed_null()), + ), + }; + fn matrix_int4_ord_aggregate_max_mixed_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_max_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: i32 = *sorted.first().expect("non-empty after len check"); + let high: i32 = *sorted.last().expect("non-empty after len check"); + let expected_plaintext: i32 = low.max(high); + let low_lit = ::to_sql_literal(low); + let high_lit = ::to_sql_literal(high); + let expected_lit = ::to_sql_literal( + expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + expected_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "max", + "max", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_max_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2087usize, + start_col: 22usize, + end_line: 2087usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_min()), + ), + }; + fn matrix_int4_ord_ore_aggregate_min() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let extremum: i32 = ::FIXTURE_VALUES + .iter() + .copied() + .min() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + extremum_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "min", + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "min", + d, + extremum, + "min", + ), + ), + ); + } + } + }; + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "min", + d, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "min", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min_empty"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_min_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2145usize, + start_col: 22usize, + end_line: 2145usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_min_empty()), + ), + }; + fn matrix_int4_ord_ore_aggregate_min_empty() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_min_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "min", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2170usize, + start_col: 22usize, + end_line: 2170usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_min_all_null()), + ), + }; + fn matrix_int4_ord_ore_aggregate_min_all_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_min_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "min", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "min", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2196usize, + start_col: 22usize, + end_line: 2196usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_min_mixed_null()), + ), + }; + fn matrix_int4_ord_ore_aggregate_min_mixed_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_min_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: i32 = *sorted.first().expect("non-empty after len check"); + let high: i32 = *sorted.last().expect("non-empty after len check"); + let expected_plaintext: i32 = low.min(high); + let low_lit = ::to_sql_literal(low); + let high_lit = ::to_sql_literal(high); + let expected_lit = ::to_sql_literal( + expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + expected_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "min", + "min", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2087usize, + start_col: 22usize, + end_line: 2087usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_max()), + ), + }; + fn matrix_int4_ord_ore_aggregate_max() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let extremum: i32 = ::FIXTURE_VALUES + .iter() + .copied() + .max() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + extremum_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "max", + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "max", + d, + extremum, + "max", + ), + ), + ); + } + } + }; + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "max", + d, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "max", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max_empty"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_max_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2145usize, + start_col: 22usize, + end_line: 2145usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_max_empty()), + ), + }; + fn matrix_int4_ord_ore_aggregate_max_empty() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_max_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "max", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2170usize, + start_col: 22usize, + end_line: 2170usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_max_all_null()), + ), + }; + fn matrix_int4_ord_ore_aggregate_max_all_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_max_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "max", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "max", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2196usize, + start_col: 22usize, + end_line: 2196usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_max_mixed_null()), + ), + }; + fn matrix_int4_ord_ore_aggregate_max_mixed_null() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_max_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: i32 = *sorted.first().expect("non-empty after len check"); + let high: i32 = *sorted.last().expect("non-empty after len check"); + let expected_plaintext: i32 = low.max(high); + let low_lit = ::to_sql_literal(low); + let high_lit = ::to_sql_literal(high); + let expected_lit = ::to_sql_literal( + expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + expected_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "max", + "max", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_group_by_min"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_group_by_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2375usize, + start_col: 22usize, + end_line: 2375usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_group_by_min()), + ), + }; + fn matrix_int4_ord_aggregate_group_by_min() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_group_by_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[i32] = &values[..3]; + let group2: &[i32] = &values[3..5]; + let group1_extremum: i32 = group1 + .iter() + .copied() + .min() + .expect("group 1 is non-empty"); + let group2_extremum: i32 = group2 + .iter() + .copied() + .min() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(group1_extremum); + let g2_lit = ::to_sql_literal(group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g1_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g2_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "min", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_group_by_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_group_by_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_group_by_max"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_group_by_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2375usize, + start_col: 22usize, + end_line: 2375usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_group_by_max()), + ), + }; + fn matrix_int4_ord_aggregate_group_by_max() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_group_by_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[i32] = &values[..3]; + let group2: &[i32] = &values[3..5]; + let group1_extremum: i32 = group1 + .iter() + .copied() + .max() + .expect("group 1 is non-empty"); + let group2_extremum: i32 = group2 + .iter() + .copied() + .max() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(group1_extremum); + let g2_lit = ::to_sql_literal(group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g1_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g2_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "max", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_group_by_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_group_by_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2375usize, + start_col: 22usize, + end_line: 2375usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_group_by_min()), + ), + }; + fn matrix_int4_ord_ore_aggregate_group_by_min() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_group_by_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[i32] = &values[..3]; + let group2: &[i32] = &values[3..5]; + let group1_extremum: i32 = group1 + .iter() + .copied() + .min() + .expect("group 1 is non-empty"); + let group2_extremum: i32 = group2 + .iter() + .copied() + .min() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(group1_extremum); + let g2_lit = ::to_sql_literal(group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g1_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g2_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "min", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_group_by_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2375usize, + start_col: 22usize, + end_line: 2375usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_group_by_max()), + ), + }; + fn matrix_int4_ord_ore_aggregate_group_by_max() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_group_by_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let values: &[i32] = ::FIXTURE_VALUES; + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[i32] = &values[..3]; + let group2: &[i32] = &values[3..5]; + let group1_extremum: i32 = group1 + .iter() + .copied() + .max() + .expect("group 1 is non-empty"); + let group2_extremum: i32 = group2 + .iter() + .copied() + .max() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(group1_extremum); + let g2_lit = ::to_sql_literal(group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(*v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g1_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT payload::text FROM {1} WHERE plaintext = {0}", + g2_lit, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "max", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_group_by_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_parallel_safe"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_parallel_safe", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2290usize, + start_col: 22usize, + end_line: 2290usize, + end_col: 77usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_parallel_safe()), + ), + }; + fn matrix_int4_ord_aggregate_parallel_safe() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_parallel_safe( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + for agg in ["min", "max"] { + let (proparallel, has_combine): (String, bool) = sqlx::query_as( + "SELECT p.proparallel::text, a.aggcombinefn <> 0 \ + FROM pg_proc p \ + JOIN pg_aggregate a ON a.aggfnoid = p.oid \ + WHERE p.proname = $1 \ + AND p.pronamespace = 'eql_v2'::regnamespace \ + AND p.proargtypes[0]::regtype = $2::regtype", + ) + .bind(agg) + .bind(d) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(proparallel == "s") { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v2.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", + agg, + d, + proparallel, + ), + ); + error + }); + } + if ::anyhow::__private::not(has_combine) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v2.{0}({1}) must declare a combinefunc for partial aggregation", + agg, + d, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_parallel_safe", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_parallel_safe; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2290usize, + start_col: 22usize, + end_line: 2290usize, + end_col: 77usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_parallel_safe()), + ), + }; + fn matrix_int4_ord_ore_aggregate_parallel_safe() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_parallel_safe( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + for agg in ["min", "max"] { + let (proparallel, has_combine): (String, bool) = sqlx::query_as( + "SELECT p.proparallel::text, a.aggcombinefn <> 0 \ + FROM pg_proc p \ + JOIN pg_aggregate a ON a.aggfnoid = p.oid \ + WHERE p.proname = $1 \ + AND p.pronamespace = 'eql_v2'::regnamespace \ + AND p.proargtypes[0]::regtype = $2::regtype", + ) + .bind(agg) + .bind(d) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(proparallel == "s") { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v2.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", + agg, + d, + proparallel, + ), + ); + error + }); + } + if ::anyhow::__private::not(has_combine) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v2.{0}({1}) must declare a combinefunc for partial aggregation", + agg, + d, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_parallel_safe; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_int4_storage_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2531usize, + start_col: 22usize, + end_line: 2531usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_aggregate_typecheck_min()), + ), + }; + fn matrix_int4_storage_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_int4_storage_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_int4_storage_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2531usize, + start_col: 22usize, + end_line: 2531usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_aggregate_typecheck_max()), + ), + }; + fn matrix_int4_storage_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_int4_storage_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_int4_eq_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2531usize, + start_col: 22usize, + end_line: 2531usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_aggregate_typecheck_min()), + ), + }; + fn matrix_int4_eq_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_int4_eq_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_int4_eq_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2531usize, + start_col: 22usize, + end_line: 2531usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_aggregate_typecheck_max()), + ), + }; + fn matrix_int4_eq_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_int4_eq_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v2.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_count_typed_column"] + #[doc(hidden)] + pub const matrix_int4_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2632usize, + start_col: 22usize, + end_line: 2632usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_count_typed_column()), + ), + }; + fn matrix_int4_storage_count_typed_column() -> anyhow::Result<()> { + async fn matrix_int4_storage_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_storage_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_count_path_cast"] + #[doc(hidden)] + pub const matrix_int4_storage_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_count_path_cast", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2665usize, + start_col: 22usize, + end_line: 2665usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_count_path_cast()), + ), + }; + fn matrix_int4_storage_count_path_cast() -> anyhow::Result<()> { + async fn matrix_int4_storage_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_storage_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_count_typed_column"] + #[doc(hidden)] + pub const matrix_int4_eq_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2632usize, + start_col: 22usize, + end_line: 2632usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_count_typed_column()), + ), + }; + fn matrix_int4_eq_count_typed_column() -> anyhow::Result<()> { + async fn matrix_int4_eq_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_count_path_cast"] + #[doc(hidden)] + pub const matrix_int4_eq_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_eq_count_path_cast"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2665usize, + start_col: 22usize, + end_line: 2665usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_count_path_cast()), + ), + }; + fn matrix_int4_eq_count_path_cast() -> anyhow::Result<()> { + async fn matrix_int4_eq_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_int4_eq_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2709usize, + start_col: 22usize, + end_line: 2709usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_count_distinct_extractor()), + ), + }; + fn matrix_int4_eq_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_int4_eq_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let extractor_fn = spec + .extractor_fn() + .expect("non-Storage variant must expose an extractor"); + let extractor = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) + }); + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT payload::{0} FROM {1}", + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_eq_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_count_typed_column"] + #[doc(hidden)] + pub const matrix_int4_ord_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2632usize, + start_col: 22usize, + end_line: 2632usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_count_typed_column()), + ), + }; + fn matrix_int4_ord_count_typed_column() -> anyhow::Result<()> { + async fn matrix_int4_ord_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_count_path_cast"] + #[doc(hidden)] + pub const matrix_int4_ord_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::int4::matrix_int4_ord_count_path_cast"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2665usize, + start_col: 22usize, + end_line: 2665usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_count_path_cast()), + ), + }; + fn matrix_int4_ord_count_path_cast() -> anyhow::Result<()> { + async fn matrix_int4_ord_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_int4_ord_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2709usize, + start_col: 22usize, + end_line: 2709usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_count_distinct_extractor()), + ), + }; + fn matrix_int4_ord_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_int4_ord_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let extractor_fn = spec + .extractor_fn() + .expect("non-Storage variant must expose an extractor"); + let extractor = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) + }); + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT payload::{0} FROM {1}", + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_count_typed_column"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2632usize, + start_col: 22usize, + end_line: 2632usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_count_typed_column()), + ), + }; + fn matrix_int4_ord_ore_count_typed_column() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_count_path_cast"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_count_path_cast", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2665usize, + start_col: 22usize, + end_line: 2665usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_count_path_cast()), + ), + }; + fn matrix_int4_ord_ore_count_path_cast() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 2709usize, + start_col: 22usize, + end_line: 2709usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_count_distinct_extractor()), + ), + }; + fn matrix_int4_ord_ore_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let extractor_fn = spec + .extractor_fn() + .expect("non-Storage variant must expose an extractor"); + let extractor = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) + }); + let fixture = ::fixture_table_name(); + let expected = ::FIXTURE_VALUES.len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT payload::{0} FROM {1}", + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_no_where"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_asc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_asc_no_where()), + ), + }; + fn matrix_int4_ord_order_by_asc_no_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_asc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + "", + &spec.sql_domain, + "ASC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if "".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_no_where"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_desc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_desc_no_where()), + ), + }; + fn matrix_int4_ord_order_by_desc_no_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_desc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + "", + &spec.sql_domain, + "DESC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if "".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_with_where"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_asc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_asc_with_where()), + ), + }; + fn matrix_int4_ord_order_by_asc_with_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_asc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + " WHERE plaintext > 0", + &spec.sql_domain, + "ASC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if " WHERE plaintext > 0".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_with_where"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_desc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_desc_with_where()), + ), + }; + fn matrix_int4_ord_order_by_desc_with_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_desc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + " WHERE plaintext > 0", + &spec.sql_domain, + "DESC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if " WHERE plaintext > 0".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_no_where()), + ), + }; + fn matrix_int4_ord_ore_order_by_asc_no_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_asc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + "", + &spec.sql_domain, + "ASC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if "".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_no_where()), + ), + }; + fn matrix_int4_ord_ore_order_by_desc_no_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_desc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + "", + &spec.sql_domain, + "DESC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if "".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_with_where()), + ), + }; + fn matrix_int4_ord_ore_order_by_asc_with_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_asc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + " WHERE plaintext > 0", + &spec.sql_domain, + "ASC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if " WHERE plaintext > 0".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1781usize, + start_col: 22usize, + end_line: 1781usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_with_where()), + ), + }; + fn matrix_int4_ord_ore_order_by_desc_with_where() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_desc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + fixture_table, + " WHERE plaintext > 0", + &spec.sql_domain, + "DESC", + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let zero: i32 = Default::default(); + let mut expected: Vec = ::FIXTURE_VALUES + .to_vec(); + expected.sort(); + if " WHERE plaintext > 0".contains("plaintext > 0") { + expected.retain(|v| *v > zero); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_nulls_first"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_asc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_asc_nulls_first()), + ), + }; + fn matrix_int4_ord_order_by_asc_nulls_first() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_asc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_order_by_asc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "ASC", + "FIRST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_nulls_last"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_asc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_asc_nulls_last()), + ), + }; + fn matrix_int4_ord_order_by_asc_nulls_last() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_asc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_order_by_asc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "ASC", + "LAST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_nulls_first"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_desc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_desc_nulls_first()), + ), + }; + fn matrix_int4_ord_order_by_desc_nulls_first() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_desc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_order_by_desc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "DESC", + "FIRST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_nulls_last"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_desc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_desc_nulls_last()), + ), + }; + fn matrix_int4_ord_order_by_desc_nulls_last() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_desc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_order_by_desc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "DESC", + "LAST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_nulls_first()), + ), + }; + fn matrix_int4_ord_ore_order_by_asc_nulls_first() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_asc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_ore_order_by_asc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "ASC", + "FIRST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_nulls_last()), + ), + }; + fn matrix_int4_ord_ore_order_by_asc_nulls_last() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_asc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_ore_order_by_asc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "ASC", + "LAST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_nulls_first()), + ), + }; + fn matrix_int4_ord_ore_order_by_desc_nulls_first() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_desc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_ore_order_by_desc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "DESC", + "FIRST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1880usize, + start_col: 22usize, + end_line: 1880usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_nulls_last()), + ), + }; + fn matrix_int4_ord_ore_order_by_desc_nulls_last() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_desc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_int4_ord_ore_order_by_desc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "DESC", + "LAST", + table, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::FIXTURE_VALUES + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_lt_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_using_lt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_using_lt_rejects()), + ), + }; + fn matrix_int4_ord_order_by_using_lt_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_using_lt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + "<", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_lt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_using_lt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_lte_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_using_lte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_using_lte_rejects()), + ), + }; + fn matrix_int4_ord_order_by_using_lte_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_using_lte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + "<=", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_lte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_using_lte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_gt_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_using_gt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_using_gt_rejects()), + ), + }; + fn matrix_int4_ord_order_by_using_gt_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_using_gt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + ">", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_gt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_using_gt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_gte_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_order_by_using_gte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_order_by_using_gte_rejects()), + ), + }; + fn matrix_int4_ord_order_by_using_gte_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_order_by_using_gte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + ">=", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_gte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_order_by_using_gte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_using_lt_rejects()), + ), + }; + fn matrix_int4_ord_ore_order_by_using_lt_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_using_lt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + "<", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_lt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_using_lte_rejects()), + ), + }; + fn matrix_int4_ord_ore_order_by_using_lte_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_using_lte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + "<=", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_lte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_using_gt_rejects()), + ), + }; + fn matrix_int4_ord_ore_order_by_using_gt_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_using_gt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + ">", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_gt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "src/matrix.rs", + start_line: 1997usize, + start_col: 22usize, + end_line: 1997usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_order_by_using_gte_rejects()), + ), + }; + fn matrix_int4_ord_ore_order_by_using_gte_rejects() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_order_by_using_gte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + fixture_table, + &spec.sql_domain, + ">=", + ), + ) + }); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v2_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_gte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } +} From 4b63394bfc595ce265344caabadfc02ad4796f50 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 29 May 2026 17:06:46 +1000 Subject: [PATCH 026/599] ci(macro-expand): pin cargo-expand, single-source nightly, harden regen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hardens the non-blocking macro-expand snapshot lane: 1. Pin cargo-expand to 1.0.122 (was unpinned). cargo-expand drives the rustfmt pass, so an unpinned version can drift the snapshot even with a frozen macro + nightly. 2. Single-source the pinned nightly date in mise.toml. The workflow now greps `nightly-YYYY-MM-DD` from mise.toml instead of hardcoding it, so there is nothing to bump in lockstep — the date lives in one place. 3. Don't truncate the snapshot before a possibly-failing expand: the mise task now expands into a mktemp file and `mv`s on success, so a transient expand failure no longer leaves a 0-byte snapshot locally. 4. SHA-pin the third-party actions (checkout, mise-action, rust-cache), reusing the exact SHAs already pinned in test-eql.yml (commit 41c7496). 5. Document the intended body-only-change nightly gap (no pull_request trigger) in the workflow header comment. --- .github/workflows/macro-expand-eql.yml | 37 +++++++++++++++++--------- mise.toml | 30 ++++++++++++++++++--- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/.github/workflows/macro-expand-eql.yml b/.github/workflows/macro-expand-eql.yml index 5ba71543c..f6411657d 100644 --- a/.github/workflows/macro-expand-eql.yml +++ b/.github/workflows/macro-expand-eql.yml @@ -11,9 +11,16 @@ name: "Macro expand EQL" # - nightly schedule (the backstop that flags a forgotten local regen) # - manual workflow_dispatch # -# The toolchain is pinned (nightly-2026-05-01) in lockstep with the -# `test:matrix:expand` mise task so the snapshot only moves when the macro -# moves, not when nightly reformats its expansion. Bump both together. +# GAP (intended): there is no `pull_request` trigger, so a change that only +# touches macro *bodies* (no arm add/remove) can merge without ever running +# here and will first surface as a red nightly run afterwards. Accept this — the +# expand lane needs nightly and stays off the PR critical path by design. +# +# The pinned nightly date lives in ONE place: the `cargo +nightly-...` invocation +# in the `test:matrix:expand` mise task. The install step below DERIVES the date +# from mise.toml (grep), so there is nothing to keep in lockstep — bump it once in +# mise.toml. The snapshot then only moves when the macro moves, not when nightly +# reformats its expansion. on: schedule: # 03:00 UTC daily @@ -39,28 +46,34 @@ jobs: timeout-minutes: 30 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false - - uses: jdx/mise-action@v4 + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true cache: true - - uses: Swatinem/rust-cache@v2 + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: workspaces: tests/sqlx shared-key: sqlx-tests - # Pinned nightly — keep the date in lockstep with the `cargo +nightly-...` - # invocation in the `test:matrix:expand` mise task. rustfmt formats the - # expansion deterministically. - - name: Install pinned nightly + cargo-expand + # Derive the pinned nightly date from mise.toml (single source of truth — + # the `cargo +nightly-...` invocation in the `test:matrix:expand` task) so + # there is nothing to bump in lockstep here. cargo-expand is likewise pinned + # once in mise.toml's [tools] (`cargo:cargo-expand`) and installed by the + # mise-action step above, so its version is single-sourced too — no + # hardcoded version lives in this workflow. It drives the rustfmt pass, so + # an unpinned version could drift the snapshot even with a frozen macro + + # nightly. The snapshot then only moves when the macro moves. + - name: Install pinned nightly toolchain run: | - rustup toolchain install nightly-2026-05-01 --profile minimal --component rustfmt - cargo binstall -y cargo-expand + NIGHTLY=$(grep -oE 'nightly-[0-9]{4}-[0-9]{2}-[0-9]{2}' mise.toml | head -1) + test -n "$NIGHTLY" || { echo "could not find pinned nightly in mise.toml"; exit 1; } + rustup toolchain install "$NIGHTLY" --profile minimal --component rustfmt - name: Regenerate and verify the matrix expansion snapshot run: | diff --git a/mise.toml b/mise.toml index 635144b67..adee16580 100644 --- a/mise.toml +++ b/mise.toml @@ -11,6 +11,13 @@ "rust" = { version = "latest", components = "rustc,rust-std,cargo,rustfmt,rust-docs,clippy" } "cargo:cargo-binstall" = "latest" "cargo:sqlx-cli" = "latest" +# Single source of truth for the cargo-expand version used by `test:matrix:expand`. +# Pinned in lockstep with the nightly date in that task: cargo-expand drives the +# rustfmt pass, so an unpinned version can drift the matrix snapshot even with a +# frozen macro + nightly. mise installs this for both local runs and CI (the +# macro-expand-eql.yml workflow's mise-action step), so there is no separate +# hardcoded version to keep in lockstep. +"cargo:cargo-expand" = "1.0.122" "python" = "3.13" [task_config] @@ -129,9 +136,11 @@ description = "Regenerate the int4 matrix cargo-expand snapshot (requires the pi dir = "{{config_root}}/tests/sqlx" run = """ # Body-level fidelity backstop for the macro: the expanded source of the int4 -# matrix arms. NIGHTLY is pinned to a known-good date so the snapshot only moves -# when *the macro* moves, not when nightly reformats — bump the date deliberately -# and in lockstep with .github/workflows/macro-expand-eql.yml. +# matrix arms. The `cargo +nightly-...` invocation below is the SINGLE source of +# the pinned nightly date — .github/workflows/macro-expand-eql.yml greps it from +# here rather than hardcoding, so there is nothing to keep in lockstep. The date +# is pinned to a known-good value so the snapshot only moves when *the macro* +# moves, not when nightly reformats — bump it deliberately, here, in one place. # # `#[sqlx::test]` embeds one `sqlx::migrate::Migration` per file in migrations/ # plus the fixture (via include_str) into EVERY generated test — ~477 MB of @@ -145,6 +154,12 @@ run = """ # Non-blocking lane (no Postgres, never compiled): the `.rs` name lives under # snapshots/, not tests/, so Cargo never treats it as a test target. set -euo pipefail +# Force the mise-pinned cargo-expand (mise.toml [tools]) to win over any stray +# global `cargo install cargo-expand` in ~/.cargo/bin, which otherwise sits +# ahead of mise's install dir on PATH and silently drifts the snapshot. The +# version is single-sourced in [tools]; this only fixes PATH precedence. +PATH="$(mise where cargo:cargo-expand)/bin:$PATH" +export PATH mkdir -p snapshots fixtures BK=$(mktemp -d) cp -a migrations "$BK/migrations" @@ -164,5 +179,12 @@ trap restore EXIT rm -rf migrations && mkdir migrations : > migrations/0001_placeholder.sql : > fixtures/eql_v2_int4.sql -cargo +nightly-2026-05-01 expand --test encrypted_domain scalars::int4 > snapshots/int4_expanded.rs +# Expand into a temp file and mv into place only on success — a redirect straight +# onto the snapshot would zero it before cargo runs, so a transient expand +# failure would leave a 0-byte snapshot locally. (Under `set -euo pipefail` a +# cargo failure aborts the script and the trap restores migrations/fixtures; the +# temp file is then orphaned in $TMPDIR, which is acceptable.) +OUT=$(mktemp) +cargo +nightly-2026-05-01 expand --test encrypted_domain scalars::int4 > "$OUT" +mv "$OUT" snapshots/int4_expanded.rs """ From 6a96e859bb0a05c649bff7957daebcd9641de844 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 08:19:47 +1000 Subject: [PATCH 027/599] feat(codegen): add Cargo workspace with eql-scalars catalog + eql-codegen stub Introduce a root Cargo workspace (resolver 2, default-members = tests/sqlx so a bare `cargo test` behaves as before) with two new members: - crates/eql-scalars: a std-only, dependency-free catalog encoding the scalar and index-term facts as Rust enums/consts (ScalarKind, Term, Fixture, DomainSpec, ScalarSpec, const CATALOG) with the spec.py/terms.py/scalars.py validations ported as #[test]s. The CATALOG registry carries int4 + int2 only (matching the manifests on this branch); int8 is intentionally absent. The capability layer (ScalarKind::I64) already supports it, so adding int8 later is a pure CATALOG append. - crates/eql-codegen: a stub binary (filled in by a later plan). The root Cargo.lock supersedes tests/sqlx/Cargo.lock (removed) and /target/ is gitignored. No consumers yet; this is the foundation layer only. --- .gitignore | 3 + tests/sqlx/Cargo.lock => Cargo.lock | 8 + Cargo.toml | 22 + crates/eql-codegen/Cargo.toml | 8 + crates/eql-codegen/src/main.rs | 2 + crates/eql-scalars/Cargo.toml | 10 + crates/eql-scalars/src/lib.rs | 745 ++++++++++++++++++++++++++++ 7 files changed, 798 insertions(+) rename tests/sqlx/Cargo.lock => Cargo.lock (99%) create mode 100644 Cargo.toml create mode 100644 crates/eql-codegen/Cargo.toml create mode 100644 crates/eql-codegen/src/main.rs create mode 100644 crates/eql-scalars/Cargo.toml create mode 100644 crates/eql-scalars/src/lib.rs diff --git a/.gitignore b/.gitignore index 05b0ae002..bdc8e4446 100644 --- a/.gitignore +++ b/.gitignore @@ -246,3 +246,6 @@ docs/superpowers/ # Build variants - protect variant deps src/deps-protect.txt src/deps-ordered-protect.txt + +# Cargo workspace root build artifacts +/target/ diff --git a/tests/sqlx/Cargo.lock b/Cargo.lock similarity index 99% rename from tests/sqlx/Cargo.lock rename to Cargo.lock index 18dd84e08..f7bdda956 100644 --- a/tests/sqlx/Cargo.lock +++ b/Cargo.lock @@ -1155,6 +1155,14 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "eql-codegen" +version = "0.1.0" + +[[package]] +name = "eql-scalars" +version = "0.1.0" + [[package]] name = "eql_tests" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..0baa1aad8 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,22 @@ +# Cargo workspace root. +# +# Members: +# crates/eql-scalars — the scalar/term catalog (std-only, no deps). Source of +# truth for the Rust generator (Plan 2) and the SQLx test +# harness (Plan 3). +# crates/eql-codegen — the SQL generator binary (stub here; Plan 2 fills it in). +# tests/sqlx — the existing `eql_tests` SQLx integration crate. +# +# resolver = "2" keeps the heavy test-crate feature set (sqlx/tokio/cipherstash- +# client) from unifying into the lean catalog/generator crates. +# +# default-members = ["tests/sqlx"] keeps a bare `cargo test` / `cargo build` at the +# root building only the test crate, exactly as the pre-workspace layout did. +[workspace] +resolver = "2" +members = [ + "crates/eql-scalars", + "crates/eql-codegen", + "tests/sqlx", +] +default-members = ["tests/sqlx"] diff --git a/crates/eql-codegen/Cargo.toml b/crates/eql-codegen/Cargo.toml new file mode 100644 index 000000000..0c4e9b25a --- /dev/null +++ b/crates/eql-codegen/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "eql-codegen" +version = "0.1.0" +edition = "2021" +description = "SQL generator for EQL encrypted-domain types (stub; implemented in Plan 2)." + +# Stub: Plan 2 adds `eql-scalars` as a path dependency and implements the binary. +[dependencies] diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs new file mode 100644 index 000000000..e51f0ccfe --- /dev/null +++ b/crates/eql-codegen/src/main.rs @@ -0,0 +1,2 @@ +//! Stub entry point. Plan 2 replaces this with the catalog-driven SQL generator. +fn main() {} diff --git a/crates/eql-scalars/Cargo.toml b/crates/eql-scalars/Cargo.toml new file mode 100644 index 000000000..093b1a121 --- /dev/null +++ b/crates/eql-scalars/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "eql-scalars" +version = "0.1.0" +edition = "2021" +description = "Scalar/term catalog for EQL encrypted-domain codegen (std-only, no deps)." + +# INTENTIONALLY no dependencies. This crate must stay std-only so the future +# generator (eql-codegen) compiles in ~1-2s and never drags serde/toml onto the +# SQL build's critical path. Do not add deps here. +[dependencies] diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs new file mode 100644 index 000000000..a9c7cba64 --- /dev/null +++ b/crates/eql-scalars/src/lib.rs @@ -0,0 +1,745 @@ +//! Scalar/term catalog for EQL encrypted-domain codegen. +//! +//! Replaces the Python `tasks/codegen/scalars.py`, `terms.py`, and `spec.py` +//! plus the `tasks/codegen/types/*.toml` manifests. Plain Rust data + enums; +//! std-only, no dependencies. +//! +//! Plans 2 and 3 depend on the public names here verbatim — do not rename. + +/// The native Rust scalar a domain type maps onto. +/// +/// Mirrors `scalars.py`'s `ScalarKind` rendering facts. `min_value`/`max_value` +/// are widened to `i128` so a single accessor type covers `i16`..`i64` bounds. +/// This is the fixed capability layer: a variant being present here only means +/// the generator *can* render that Rust kind; the `CATALOG` registry below is +/// what declares which scalar types actually exist. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ScalarKind { + I16, + I32, + I64, +} + +impl ScalarKind { + /// The Rust type name as it appears in generated source (e.g. `"i32"`). + pub const fn rust_type(self) -> &'static str { + match self { + ScalarKind::I16 => "i16", + ScalarKind::I32 => "i32", + ScalarKind::I64 => "i64", + } + } + + /// The `MIN` named-constant symbol (e.g. `"i32::MIN"`). + pub const fn min_symbol(self) -> &'static str { + match self { + ScalarKind::I16 => "i16::MIN", + ScalarKind::I32 => "i32::MIN", + ScalarKind::I64 => "i64::MIN", + } + } + + /// The `MAX` named-constant symbol (e.g. `"i32::MAX"`). + pub const fn max_symbol(self) -> &'static str { + match self { + ScalarKind::I16 => "i16::MAX", + ScalarKind::I32 => "i32::MAX", + ScalarKind::I64 => "i64::MAX", + } + } + + /// The zero literal symbol (always `"0"`). + pub const fn zero_symbol(self) -> &'static str { + "0" + } + + /// Inclusive lower bound of the representable range, widened to `i128`. + pub const fn min_value(self) -> i128 { + match self { + ScalarKind::I16 => i16::MIN as i128, + ScalarKind::I32 => i32::MIN as i128, + ScalarKind::I64 => i64::MIN as i128, + } + } + + /// Inclusive upper bound of the representable range, widened to `i128`. + pub const fn max_value(self) -> i128 { + match self { + ScalarKind::I16 => i16::MAX as i128, + ScalarKind::I32 => i32::MAX as i128, + ScalarKind::I64 => i64::MAX as i128, + } + } +} + +/// A fixed index term known to the scalar materializer. +/// +/// Mirrors `terms.py`'s `TERM_CATALOG`. `Hm` provides equality; `Ore` provides +/// equality plus ordering. The `json_key`/`extractor`/`returns`/`ctor` values +/// are the cross-schema SQL contract and are copied verbatim from `terms.py` — +/// changing one is a generated-SQL behaviour change, not a refactor. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Term { + Hm, + Ore, +} + +impl Term { + /// JSON payload key carrying this term (`"hm"` / `"ob"`). + pub const fn json_key(self) -> &'static str { + match self { + Term::Hm => "hm", + Term::Ore => "ob", + } + } + + /// The generated extractor function name (`"eq_term"` / `"ord_term"`). + pub const fn extractor(self) -> &'static str { + match self { + Term::Hm => "eq_term", + Term::Ore => "ord_term", + } + } + + /// Cross-schema return type of the extractor (in `eql_v2`). + pub const fn returns(self) -> &'static str { + match self { + Term::Hm => "eql_v2.hmac_256", + Term::Ore => "eql_v2.ore_block_u64_8_256", + } + } + + /// Constructor name for the index-term type (unqualified). + pub const fn ctor(self) -> &'static str { + match self { + Term::Hm => "hmac_256", + Term::Ore => "ore_block_u64_8_256", + } + } + + /// Generated-file role label for a domain whose first term is this one. + pub const fn role(self) -> &'static str { + match self { + Term::Hm => "eq", + Term::Ore => "ord", + } + } + + /// SQL operators this term supports, in catalog order. + pub const fn operators(self) -> &'static [&'static str] { + match self { + Term::Hm => &["=", "<>"], + Term::Ore => &["=", "<>", "<", "<=", ">", ">="], + } + } + + /// SQL `-- REQUIRE:` edges this term pulls in, in catalog order. + pub const fn requires(self) -> &'static [&'static str] { + match self { + Term::Hm => &["src/hmac_256/functions.sql"], + Term::Ore => &[ + "src/ore_block_u64_8_256/functions.sql", + "src/ore_block_u64_8_256/operators.sql", + ], + } + } +} + +impl Term { + /// Stable dedupe — first occurrence wins. The Rust analogue of + /// `terms.py`'s `dict.fromkeys` ordering contract. + fn dedupe_preserving_order<'a>( + items: impl IntoIterator, + ) -> Vec<&'a str> { + let mut out: Vec<&'a str> = Vec::new(); + for item in items { + if !out.contains(&item) { + out.push(item); + } + } + out + } + + /// Supported operators for the union of a domain's terms (catalog order, + /// deduped). Mirrors `terms.py::operators_for_terms`. + pub fn operators_for_terms(terms: &[Term]) -> Vec<&'static str> { + Self::dedupe_preserving_order( + terms.iter().flat_map(|t| t.operators().iter().copied()), + ) + } + + /// JSON payload keys required by these terms (deduped, in order). + /// Mirrors `terms.py::term_json_keys`. + pub fn term_json_keys(terms: &[Term]) -> Vec<&'static str> { + Self::dedupe_preserving_order(terms.iter().map(|t| t.json_key())) + } + + /// SQL `-- REQUIRE:` edges needed by these terms (deduped, in order). + /// Mirrors `terms.py::term_requires`. + pub fn term_requires(terms: &[Term]) -> Vec<&'static str> { + Self::dedupe_preserving_order( + terms.iter().flat_map(|t| t.requires().iter().copied()), + ) + } + + /// The extractor that supports `op` for a domain carrying `terms`, or + /// `None`. First supporting term wins. Mirrors + /// `terms.py::extractor_for_operator`. + pub fn extractor_for_operator(terms: &[Term], op: &str) -> Option<&'static str> { + terms + .iter() + .find(|t| t.operators().contains(&op)) + .map(|t| t.extractor()) + } + + /// Generated-file role label for a domain with these terms. No terms => + /// `"storage"`; otherwise the first term's role. Mirrors + /// `terms.py::role_for_terms`. + pub fn role_for_terms(terms: &[Term]) -> &'static str { + match terms.first() { + None => "storage", + Some(t) => t.role(), + } + } +} + +/// A single fixture plaintext value for a scalar type. +/// +/// Mirrors `scalars.py`'s fixture-token handling, but typed: the sentinels +/// `MIN`/`MAX`/`ZERO` (the matrix comparison pivots) are dedicated variants, +/// and `N(i128)` is any explicit numeric literal. Range validity of committed +/// catalog data is enforced by the invariant `#[test]`s, not here. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Fixture { + Min, + Max, + Zero, + N(i128), +} + +impl Fixture { + /// Resolve this fixture to its numeric value for the given scalar kind. + /// Mirrors `scalars.py::numeric_value`. Infallible: `Min`/`Max` resolve to + /// the kind's bounds, `Zero` to `0`, and `N(n)` to `n` verbatim. It does + /// NOT range-check — for committed catalog data the range is statically + /// un-failable, and the bounds guard the old `Result` encoded lives in the + /// invariant test `every_fixture_value_is_within_kind_bounds` + /// (which compares this value against `[min_value(), max_value()]`). + pub fn numeric_value(self, kind: ScalarKind) -> i128 { + match self { + Fixture::Min => kind.min_value(), + Fixture::Max => kind.max_value(), + Fixture::Zero => 0, + Fixture::N(n) => n, + } + } + + /// Render this fixture as a Rust source literal of the given scalar kind. + /// Sentinels render to their named constant; `N` renders the integer. + /// Mirrors `scalars.py::render_literal`. + pub fn render_literal(self, kind: ScalarKind) -> String { + match self { + Fixture::Min => kind.min_symbol().to_string(), + Fixture::Max => kind.max_symbol().to_string(), + Fixture::Zero => kind.zero_symbol().to_string(), + Fixture::N(n) => n.to_string(), + } + } +} + +/// One generated public domain: a suffix appended to the type token and the +/// fixed index terms it carries. Suffix `""` is the storage-only domain. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct DomainSpec { + pub suffix: &'static str, + pub terms: &'static [Term], +} + +/// A scalar encrypted-domain type: its SQL token, native Rust type, generated +/// domains, and fixture plaintext list. The Rust analogue of one `*.toml`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct ScalarSpec { + pub token: &'static str, + pub kind: ScalarKind, + pub domains: &'static [DomainSpec], + pub fixtures: &'static [Fixture], +} + +impl ScalarSpec { + /// The fully-qualified domain name: `token` + `suffix`. Makes the old + /// "domain name must start with the token" validation structural. + pub fn domain_name(&self, domain: &DomainSpec) -> String { + format!("{}{}", self.token, domain.suffix) + } +} + +/// Domains shared by every ordered-integer scalar, in manifest file order: +/// storage (no terms), `_eq` (hm), `_ord_ore` (ore), `_ord` (ore). +const ORDERED_INT_DOMAINS: &[DomainSpec] = &[ + DomainSpec { suffix: "", terms: &[] }, + DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, + DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, + DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, +]; + +/// int4 fixture plaintexts — verbatim from `tasks/codegen/types/int4.toml`. +const INT4_FIXTURES: &[Fixture] = &[ + Fixture::Min, + Fixture::N(-100), + Fixture::N(-1), + Fixture::Zero, + Fixture::N(1), + Fixture::N(2), + Fixture::N(5), + Fixture::N(10), + Fixture::N(17), + Fixture::N(25), + Fixture::N(42), + Fixture::N(50), + Fixture::N(100), + Fixture::N(250), + Fixture::N(1000), + Fixture::N(9999), + Fixture::Max, +]; + +/// int2 fixture plaintexts — verbatim from `tasks/codegen/types/int2.toml`. +const INT2_FIXTURES: &[Fixture] = &[ + Fixture::Min, + Fixture::N(-30000), + Fixture::N(-100), + Fixture::N(-1), + Fixture::Zero, + Fixture::N(1), + Fixture::N(2), + Fixture::N(5), + Fixture::N(10), + Fixture::N(17), + Fixture::N(25), + Fixture::N(42), + Fixture::N(50), + Fixture::N(100), + Fixture::N(250), + Fixture::N(1000), + Fixture::N(9999), + Fixture::N(30000), + Fixture::Max, +]; + +const INT4: ScalarSpec = ScalarSpec { + token: "int4", + kind: ScalarKind::I32, + domains: ORDERED_INT_DOMAINS, + fixtures: INT4_FIXTURES, +}; + +const INT2: ScalarSpec = ScalarSpec { + token: "int2", + kind: ScalarKind::I16, + domains: ORDERED_INT_DOMAINS, + fixtures: INT2_FIXTURES, +}; + +/// The scalar catalog: the single source of truth replacing the TOML manifests +/// present on this branch (`int4`, `int2`). Order is significant (it drives +/// generation/enumeration order). `int8` is intentionally absent here — it is +/// added on the branch that introduces the int8 SQL surface by appending its +/// `ScalarSpec`; the capability layer above (`ScalarKind::I64`) already supports +/// it, so that addition is a pure append. +pub const CATALOG: &[ScalarSpec] = &[INT4, INT2]; + +#[cfg(test)] +mod rust_tests { + use super::*; + + #[test] + fn i32_facts_match_int4() { + assert_eq!(ScalarKind::I32.rust_type(), "i32"); + assert_eq!(ScalarKind::I32.min_symbol(), "i32::MIN"); + assert_eq!(ScalarKind::I32.max_symbol(), "i32::MAX"); + assert_eq!(ScalarKind::I32.zero_symbol(), "0"); + assert_eq!(ScalarKind::I32.min_value(), -2_147_483_648_i128); + assert_eq!(ScalarKind::I32.max_value(), 2_147_483_647_i128); + } + + #[test] + fn i16_facts_match_int2() { + assert_eq!(ScalarKind::I16.rust_type(), "i16"); + assert_eq!(ScalarKind::I16.min_symbol(), "i16::MIN"); + assert_eq!(ScalarKind::I16.max_symbol(), "i16::MAX"); + assert_eq!(ScalarKind::I16.zero_symbol(), "0"); + assert_eq!(ScalarKind::I16.min_value(), -32_768_i128); + assert_eq!(ScalarKind::I16.max_value(), 32_767_i128); + } + + #[test] + fn i64_facts() { + // Capability-layer fact: i64 is the Rust kind a future int8 maps onto. + // Present here so adding int8 later is a pure `CATALOG` append. + assert_eq!(ScalarKind::I64.rust_type(), "i64"); + assert_eq!(ScalarKind::I64.min_symbol(), "i64::MIN"); + assert_eq!(ScalarKind::I64.max_symbol(), "i64::MAX"); + assert_eq!(ScalarKind::I64.zero_symbol(), "0"); + assert_eq!(ScalarKind::I64.min_value(), -9_223_372_036_854_775_808_i128); + assert_eq!(ScalarKind::I64.max_value(), 9_223_372_036_854_775_807_i128); + } +} + +#[cfg(test)] +mod term_tests { + use super::*; + + #[test] + fn hm_term_provides_equality() { + let hm = Term::Hm; + assert_eq!(hm.json_key(), "hm"); + assert_eq!(hm.extractor(), "eq_term"); + assert_eq!(hm.returns(), "eql_v2.hmac_256"); + assert_eq!(hm.ctor(), "hmac_256"); + assert_eq!(hm.role(), "eq"); + assert_eq!(hm.operators(), &["=", "<>"]); + assert_eq!(hm.requires(), &["src/hmac_256/functions.sql"]); + } + + #[test] + fn ore_term_preserves_int4_sql_contract() { + let ore = Term::Ore; + assert_eq!(ore.json_key(), "ob"); + assert_eq!(ore.extractor(), "ord_term"); + assert_eq!(ore.returns(), "eql_v2.ore_block_u64_8_256"); + assert_eq!(ore.ctor(), "ore_block_u64_8_256"); + assert_eq!(ore.role(), "ord"); + assert_eq!(ore.operators(), &["=", "<>", "<", "<=", ">", ">="]); + assert_eq!( + ore.requires(), + &[ + "src/ore_block_u64_8_256/functions.sql", + "src/ore_block_u64_8_256/operators.sql", + ] + ); + } +} + +#[cfg(test)] +mod term_helper_tests { + use super::*; + + #[test] + fn operators_are_union_in_catalog_order() { + // ore then hm: ore's six ops first, hm adds nothing new. + assert_eq!( + Term::operators_for_terms(&[Term::Ore, Term::Hm]), + vec!["=", "<>", "<", "<=", ">", ">="] + ); + } + + #[test] + fn operators_for_terms_handles_empty() { + assert!(Term::operators_for_terms(&[]).is_empty()); + } + + #[test] + fn json_keys_come_from_catalog() { + assert_eq!( + Term::term_json_keys(&[Term::Hm, Term::Ore]), + vec!["hm", "ob"] + ); + assert!(Term::term_json_keys(&[]).is_empty()); + } + + #[test] + fn requires_are_deduplicated_in_order() { + assert_eq!( + Term::term_requires(&[Term::Ore, Term::Ore, Term::Hm]), + vec![ + "src/ore_block_u64_8_256/functions.sql", + "src/ore_block_u64_8_256/operators.sql", + "src/hmac_256/functions.sql", + ] + ); + assert!(Term::term_requires(&[]).is_empty()); + } + + #[test] + fn role_for_terms_handles_storage_eq_ord() { + assert_eq!(Term::role_for_terms(&[]), "storage"); + assert_eq!(Term::role_for_terms(&[Term::Hm]), "eq"); + assert_eq!(Term::role_for_terms(&[Term::Ore]), "ord"); + } + + #[test] + fn extractor_for_operator_picks_first_supporting_term() { + assert_eq!(Term::extractor_for_operator(&[Term::Hm], "="), Some("eq_term")); + assert_eq!(Term::extractor_for_operator(&[Term::Ore], "<"), Some("ord_term")); + assert_eq!( + Term::extractor_for_operator(&[Term::Hm, Term::Ore], "="), + Some("eq_term") + ); + assert_eq!( + Term::extractor_for_operator(&[Term::Hm, Term::Ore], "<"), + Some("ord_term") + ); + } + + #[test] + fn extractor_for_operator_none_when_unsupported() { + assert_eq!(Term::extractor_for_operator(&[Term::Hm], "<"), None); + assert_eq!(Term::extractor_for_operator(&[], "="), None); + } +} + +#[cfg(test)] +mod fixture_tests { + use super::*; + + #[test] + fn numeric_value_resolves_sentinels_and_literals_for_i32() { + assert_eq!(Fixture::Min.numeric_value(ScalarKind::I32), -2_147_483_648); + assert_eq!(Fixture::Max.numeric_value(ScalarKind::I32), 2_147_483_647); + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I32), 0); + assert_eq!(Fixture::N(42).numeric_value(ScalarKind::I32), 42); + assert_eq!(Fixture::N(-1).numeric_value(ScalarKind::I32), -1); + } + + #[test] + fn numeric_value_resolves_sentinels_per_kind() { + // Sentinels resolve to the kind's bounds; zero is always 0. + assert_eq!(Fixture::Min.numeric_value(ScalarKind::I16), -32_768); + assert_eq!(Fixture::Max.numeric_value(ScalarKind::I16), 32_767); + assert_eq!(Fixture::Min.numeric_value(ScalarKind::I64), -9_223_372_036_854_775_808); + assert_eq!(Fixture::Max.numeric_value(ScalarKind::I64), 9_223_372_036_854_775_807); + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I64), 0); + // `numeric_value` is infallible: it resolves a literal verbatim and does + // NOT range-check. Range validity of committed catalog data is enforced + // by the invariant test `every_fixture_value_is_within_kind_bounds`, + // which compares `numeric_value` against `[min_value(), max_value()]`. + assert_eq!(Fixture::N(5_000_000_000).numeric_value(ScalarKind::I64), 5_000_000_000); + } + + #[test] + fn render_literal_maps_sentinels() { + assert_eq!(Fixture::Min.render_literal(ScalarKind::I32), "i32::MIN"); + assert_eq!(Fixture::Max.render_literal(ScalarKind::I32), "i32::MAX"); + assert_eq!(Fixture::Zero.render_literal(ScalarKind::I32), "0"); + assert_eq!(Fixture::Min.render_literal(ScalarKind::I16), "i16::MIN"); + assert_eq!(Fixture::Max.render_literal(ScalarKind::I64), "i64::MAX"); + } + + #[test] + fn render_literal_passes_through_numeric() { + assert_eq!(Fixture::N(-100).render_literal(ScalarKind::I32), "-100"); + assert_eq!(Fixture::N(9999).render_literal(ScalarKind::I32), "9999"); + assert_eq!(Fixture::N(5_000_000_000).render_literal(ScalarKind::I64), "5000000000"); + } +} + +#[cfg(test)] +mod catalog_tests { + use super::*; + + fn scalar(token: &str) -> &'static ScalarSpec { + CATALOG + .iter() + .find(|s| s.token == token) + .unwrap_or_else(|| panic!("{token} missing from CATALOG")) + } + + #[test] + fn catalog_has_int4_int2_in_order() { + let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); + assert_eq!(tokens, vec!["int4", "int2"]); + } + + #[test] + fn int4_maps_to_i32_with_four_domains() { + let s = scalar("int4"); + assert_eq!(s.kind, ScalarKind::I32); + let suffixes: Vec<&str> = s.domains.iter().map(|d| d.suffix).collect(); + // File order from int4.toml: storage, _eq, _ord_ore, _ord. + assert_eq!(suffixes, vec!["", "_eq", "_ord_ore", "_ord"]); + } + + #[test] + fn int4_domain_terms_match_manifest() { + let s = scalar("int4"); + assert_eq!(s.domains[0].terms, &[] as &[Term]); // storage + assert_eq!(s.domains[1].terms, &[Term::Hm]); // _eq + assert_eq!(s.domains[2].terms, &[Term::Ore]); // _ord_ore + assert_eq!(s.domains[3].terms, &[Term::Ore]); // _ord + } + + #[test] + fn int2_rust_type() { + assert_eq!(scalar("int2").kind, ScalarKind::I16); + } + + #[test] + fn all_types_share_the_same_domain_shape() { + // Every scalar declares the same four domains with the same terms; + // only the token differs (the matrix-snapshot collapse depends on this). + for s in CATALOG { + let suffixes: Vec<&str> = s.domains.iter().map(|d| d.suffix).collect(); + assert_eq!( + suffixes, + vec!["", "_eq", "_ord_ore", "_ord"], + "{} has unexpected domain set", + s.token + ); + } + } + + #[test] + fn domain_name_concatenates_token_and_suffix() { + let s = scalar("int4"); + assert_eq!(s.domain_name(&s.domains[0]), "int4"); // storage + assert_eq!(s.domain_name(&s.domains[1]), "int4_eq"); + assert_eq!(s.domain_name(&s.domains[3]), "int4_ord"); + } + + #[test] + fn int4_fixtures_match_manifest() { + let s = scalar("int4"); + // From int4.toml [fixture] values, in order. + let expected = vec![ + Fixture::Min, + Fixture::N(-100), + Fixture::N(-1), + Fixture::Zero, + Fixture::N(1), + Fixture::N(2), + Fixture::N(5), + Fixture::N(10), + Fixture::N(17), + Fixture::N(25), + Fixture::N(42), + Fixture::N(50), + Fixture::N(100), + Fixture::N(250), + Fixture::N(1000), + Fixture::N(9999), + Fixture::Max, + ]; + assert_eq!(s.fixtures, expected.as_slice()); + } + + #[test] + fn int2_fixtures_match_manifest() { + let s = scalar("int2"); + // From int2.toml [fixture] values, in order — includes the wide + // ±30000 values that exercise the i16 bounds. + assert!(s.fixtures.contains(&Fixture::N(-30000))); + assert!(s.fixtures.contains(&Fixture::N(30000))); + assert_eq!(s.fixtures.first(), Some(&Fixture::Min)); + assert_eq!(s.fixtures.last(), Some(&Fixture::Max)); + } +} + +#[cfg(test)] +mod invariant_tests { + use super::*; + use std::collections::HashMap; + + #[test] + fn every_domain_name_starts_with_its_token() { + for s in CATALOG { + for d in s.domains { + let name = s.domain_name(d); + assert!( + name == s.token || name.starts_with(&format!("{}_", s.token)), + "{name} does not start with token {}", + s.token + ); + } + } + } + + #[test] + fn every_type_has_at_least_one_domain() { + for s in CATALOG { + assert!(!s.domains.is_empty(), "{} has no domains", s.token); + } + } + + #[test] + fn fixtures_include_min_max_and_zero() { + for s in CATALOG { + let resolved: Vec = s + .fixtures + .iter() + .map(|f| f.numeric_value(s.kind)) + .collect(); + assert!( + resolved.contains(&s.kind.min_value()), + "{} fixtures missing MIN", + s.token + ); + assert!( + resolved.contains(&s.kind.max_value()), + "{} fixtures missing MAX", + s.token + ); + assert!(resolved.contains(&0), "{} fixtures missing zero", s.token); + } + } + + #[test] + fn fixture_values_are_distinct_by_resolved_number() { + for s in CATALOG { + let mut seen: HashMap = HashMap::new(); + for f in s.fixtures { + let n = f.numeric_value(s.kind); + if let Some(prev) = seen.insert(n, *f) { + panic!( + "{}: {f:?} duplicates {prev:?} (both resolve to {n})", + s.token + ); + } + } + } + } + + #[test] + fn every_fixture_value_is_within_kind_bounds() { + // `numeric_value` is infallible, so the range guarantee the old + // `Result` encoded is asserted explicitly here: this is the ONLY guard + // against an out-of-range `N` in committed catalog data. + for s in CATALOG { + let (lo, hi) = (s.kind.min_value(), s.kind.max_value()); + for f in s.fixtures { + let n = f.numeric_value(s.kind); + assert!( + n >= lo && n <= hi, + "{}: fixture {f:?} resolves to {n}, out of range [{lo}, {hi}]", + s.token + ); + } + } + } + + #[test] + fn helper_outputs_match_for_known_domains() { + // Cross-check the Term helpers against a known domain shape on int4. + let s = CATALOG.iter().find(|s| s.token == "int4").unwrap(); + // storage domain: no terms. + assert_eq!(Term::role_for_terms(s.domains[0].terms), "storage"); + assert!(Term::operators_for_terms(s.domains[0].terms).is_empty()); + // _eq domain: hm => equality only. + assert_eq!(Term::role_for_terms(s.domains[1].terms), "eq"); + assert_eq!( + Term::operators_for_terms(s.domains[1].terms), + vec!["=", "<>"] + ); + assert_eq!(Term::term_json_keys(s.domains[1].terms), vec!["hm"]); + // _ord domain: ore => full ordering. + assert_eq!(Term::role_for_terms(s.domains[3].terms), "ord"); + assert_eq!( + Term::operators_for_terms(s.domains[3].terms), + vec!["=", "<>", "<", "<=", ">", ">="] + ); + assert_eq!(Term::term_json_keys(s.domains[3].terms), vec!["ob"]); + assert_eq!( + Term::extractor_for_operator(s.domains[3].terms, "<"), + Some("ord_term") + ); + } +} From 21ee563a072cbb447b1a665753a43971bcf7ed9b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 08:19:56 +1000 Subject: [PATCH 028/599] ci: move rust-cache workspaces key to root for the Cargo workspace --- .github/workflows/bench-eql.yml | 2 +- .github/workflows/test-eql.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/bench-eql.yml b/.github/workflows/bench-eql.yml index cee01ca3b..5b302c088 100644 --- a/.github/workflows/bench-eql.yml +++ b/.github/workflows/bench-eql.yml @@ -50,7 +50,7 @@ jobs: - uses: Swatinem/rust-cache@v2 with: - workspaces: tests/sqlx + workspaces: . shared-key: sqlx-tests - name: Setup database diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index ff82bb42d..6dbc62e8a 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -50,7 +50,7 @@ jobs: - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: - workspaces: tests/sqlx + workspaces: . shared-key: sqlx-tests - name: Validate v2.2 / v2.3 payload schemas @@ -108,7 +108,7 @@ jobs: - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: - workspaces: tests/sqlx + workspaces: . shared-key: sqlx-tests # Regenerate the matrix test-name inventory with the SAME pinned feature @@ -159,7 +159,7 @@ jobs: - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: - workspaces: tests/sqlx + workspaces: . shared-key: sqlx-tests - name: Setup database (Postgres ${{ matrix.postgres-version }}) From a23d09398ccda7bc21fd2443884e5af294ffbefa Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:07:08 +1000 Subject: [PATCH 029/599] feat(codegen): value-kind Fixture + fixtures! macro in eql-scalars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the integer-only `Fixture::N(i128)` with a value-kind-tagged enum (`Int`/`Numeric`/`Text`/`Jsonb` + Min/Max/Zero sentinels) so one non-generic CATALOG spans every scalar kind. A new `fixtures!` macro builds each type's fixture array and range-checks integer literals at the definition site (`const _RANGE_CHECK`), so an out-of-range literal (e.g. N(-40000) for i16) fails to compile — the compile-time guarantee from the PR review, delivered where it applies without primitive-generic `Fixture` (which would force a heterogeneous catalog and only help integer kinds). - ScalarKind gains Numeric/Text/Jsonb + is_int(); bounded-numeric accessors panic on non-int kinds (gated by is_int(); explicit arms so a future integer variant breaks the build rather than silently hitting the panic). - numeric_value -> Option (None for string kinds); render_literal quotes string-backed kinds via Debug. - Tests: per-kind DistinctKey; #[should_panic] coverage for the accessors; macro edge cases (empty/trailing-comma/sentinels-only); string-variant render/None. 41 pass (was 30). - CLAUDE.md: text/jsonb are "planned, no SQL surface yet", not "out of scope". Comments note text/numeric are ORE-orderable (only jsonb isn't). --- CLAUDE.md | 4 +- crates/eql-scalars/src/lib.rs | 501 ++++++++++++++++++++++++---------- 2 files changed, 357 insertions(+), 148 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 4b4891230..c15fa0e17 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -76,9 +76,9 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, and `timestamp` follow this materializer pattern. `jsonb` needs a separate design and is out of scope for the scalar materializer. +`src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. -Adding a scalar encrypted-domain type is generated from a minimal manifest at `tasks/codegen/types/.toml`: the filename supplies ``, and the `[domain]` table maps each generated domain name to the fixed index terms it carries. Example: `int4_eq = ["hm"]`, `int4_ord = ["ore"]`. Term capabilities are fixed in `tasks/codegen/terms.py`: `hm` provides equality, and `ore` provides equality plus ordering. `mise run build` regenerates the scalar SQL surface into `src/encrypted_domain//` from every manifest at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. Use `mise run codegen:domain ` to refresh a single type manually while iterating on its manifest, or `mise run codegen:domain:all` to regenerate every type at once (the same enumeration `mise run build` uses). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` files are gitignored and never committed — the TOML manifest plus `tasks/codegen/terms.py` are the source of truth. Generated files carry an `AUTO-GENERATED — DO NOT EDIT` header; change the manifest or term catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. +Adding a scalar encrypted-domain type is generated from a minimal manifest at `tasks/codegen/types/.toml`: the filename supplies ``, and the `[domain]` table maps each generated domain name to the fixed index terms it carries. Example: `int4_eq = ["hm"]`, `int4_ord = ["ore"]`. Term capabilities are fixed in `tasks/codegen/terms.py`: `hm` provides equality, and `ore` provides equality plus ordering. `mise run build` regenerates the scalar SQL surface into `src/encrypted_domain//` from every manifest at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. Use `mise run codegen:domain ` to refresh a single type manually while iterating on its manifest, or `mise run codegen:domain:all` to regenerate every type at once (the same enumeration `mise run build` uses). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` files are gitignored and never committed — the TOML manifest plus `tasks/codegen/terms.py` are the source of truth. Generated files carry an `AUTO-GENERATED — DO NOT EDIT` header; change the manifest or term catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` have no generated SQL surface yet (they are planned, not out of scope); `jsonb` needs a separate SQL design beyond this ordered-scalar materializer. **Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the manifest only declares domain names and terms. New term behavior belongs in `tasks/codegen/terms.py` with tests, not in free-form TOML fields. diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index a9c7cba64..91cfae3dd 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -1,73 +1,117 @@ -//! Scalar/term catalog for EQL encrypted-domain codegen. +//! Scalar/term catalog for EQL encrypted-domain codegen — the Rust source of +//! truth replacing `tasks/codegen/{scalars,terms,spec}.py` and the +//! `types/*.toml` manifests. Std-only, no dependencies. //! -//! Replaces the Python `tasks/codegen/scalars.py`, `terms.py`, and `spec.py` -//! plus the `tasks/codegen/types/*.toml` manifests. Plain Rust data + enums; -//! std-only, no dependencies. +//! `Fixture` is value-kind tagged (one non-generic enum, variant = value kind), +//! so a single `CATALOG` spans every scalar kind. Integer literals are +//! range-checked at their definition site by `fixtures!` (`N(-40000)` for `i16` +//! does not compile). //! -//! Plans 2 and 3 depend on the public names here verbatim — do not rename. +//! Capability axes are independent: equality covers every kind; order covers +//! every kind except `jsonb` (ORE compares ciphertext, so it is +//! plaintext-agnostic — `text`/`date` order like integers); only the integer +//! kinds have an i128 range with `Min`/`Max`/`Zero` sentinels. `numeric_value` +//! cannot yet express the order of a non-integer fixture set. +//! +//! Public names are consumed verbatim by the later codegen plans — do not rename. -/// The native Rust scalar a domain type maps onto. +/// The native scalar a domain type maps onto. Integer kinds carry i128 bounds; +/// the others (`Numeric`/`Text`/`Jsonb`) have string fixtures and no numeric +/// range — though `Numeric`/`Text` are still ORE-orderable, only `Jsonb` is not. +/// Capability layer only: `CATALOG` declares which kinds actually exist. /// -/// Mirrors `scalars.py`'s `ScalarKind` rendering facts. `min_value`/`max_value` -/// are widened to `i128` so a single accessor type covers `i16`..`i64` bounds. -/// This is the fixed capability layer: a variant being present here only means -/// the generator *can* render that Rust kind; the `CATALOG` registry below is -/// what declares which scalar types actually exist. +/// The bounded-numeric accessors below `panic!` on non-integer kinds; callers +/// gate with `is_int()`, so the panic guards against misuse rather than being a +/// reachable path (kept over `Option` to spare every integer caller an unwrap). #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ScalarKind { I16, I32, I64, + Numeric, + Text, + Jsonb, } impl ScalarKind { + /// Fixed-width integer kinds — those with i128 bounds and `Min`/`Max`/`Zero` + /// sentinels. Gates the bounded-numeric accessors and invariants. NOT an + /// orderability test: `Numeric`/`Text` are ORE-orderable yet not integers. + pub const fn is_int(self) -> bool { + matches!(self, ScalarKind::I16 | ScalarKind::I32 | ScalarKind::I64) + } + /// The Rust type name as it appears in generated source (e.g. `"i32"`). pub const fn rust_type(self) -> &'static str { match self { ScalarKind::I16 => "i16", ScalarKind::I32 => "i32", ScalarKind::I64 => "i64", + ScalarKind::Numeric => "numeric", + ScalarKind::Text => "text", + ScalarKind::Jsonb => "jsonb", } } - /// The `MIN` named-constant symbol (e.g. `"i32::MIN"`). + /// The `MIN` named-constant symbol (e.g. `"i32::MIN"`). Integer kinds only. pub const fn min_symbol(self) -> &'static str { match self { ScalarKind::I16 => "i16::MIN", ScalarKind::I32 => "i32::MIN", ScalarKind::I64 => "i64::MIN", + // Explicit (not `_`) so a future integer variant is a compile + // error here rather than silently hitting the panic. + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + panic!("min_symbol is only defined for integer kinds") + } } } - /// The `MAX` named-constant symbol (e.g. `"i32::MAX"`). + /// The `MAX` named-constant symbol (e.g. `"i32::MAX"`). Integer kinds only. pub const fn max_symbol(self) -> &'static str { match self { ScalarKind::I16 => "i16::MAX", ScalarKind::I32 => "i32::MAX", ScalarKind::I64 => "i64::MAX", + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + panic!("max_symbol is only defined for integer kinds") + } } } - /// The zero literal symbol (always `"0"`). + /// The zero literal symbol (always `"0"`). Integer kinds only. pub const fn zero_symbol(self) -> &'static str { - "0" + match self { + ScalarKind::I16 | ScalarKind::I32 | ScalarKind::I64 => "0", + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + panic!("zero_symbol is only defined for integer kinds") + } + } } /// Inclusive lower bound of the representable range, widened to `i128`. + /// Integer kinds only. pub const fn min_value(self) -> i128 { match self { ScalarKind::I16 => i16::MIN as i128, ScalarKind::I32 => i32::MIN as i128, ScalarKind::I64 => i64::MIN as i128, + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + panic!("min_value is only defined for integer kinds") + } } } /// Inclusive upper bound of the representable range, widened to `i128`. + /// Integer kinds only. pub const fn max_value(self) -> i128 { match self { ScalarKind::I16 => i16::MAX as i128, ScalarKind::I32 => i32::MAX as i128, ScalarKind::I64 => i64::MAX as i128, + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + panic!("max_value is only defined for integer kinds") + } } } } @@ -148,9 +192,7 @@ impl Term { impl Term { /// Stable dedupe — first occurrence wins. The Rust analogue of /// `terms.py`'s `dict.fromkeys` ordering contract. - fn dedupe_preserving_order<'a>( - items: impl IntoIterator, - ) -> Vec<&'a str> { + fn dedupe_preserving_order<'a>(items: impl IntoIterator) -> Vec<&'a str> { let mut out: Vec<&'a str> = Vec::new(); for item in items { if !out.contains(&item) { @@ -163,9 +205,7 @@ impl Term { /// Supported operators for the union of a domain's terms (catalog order, /// deduped). Mirrors `terms.py::operators_for_terms`. pub fn operators_for_terms(terms: &[Term]) -> Vec<&'static str> { - Self::dedupe_preserving_order( - terms.iter().flat_map(|t| t.operators().iter().copied()), - ) + Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.operators().iter().copied())) } /// JSON payload keys required by these terms (deduped, in order). @@ -177,9 +217,7 @@ impl Term { /// SQL `-- REQUIRE:` edges needed by these terms (deduped, in order). /// Mirrors `terms.py::term_requires`. pub fn term_requires(terms: &[Term]) -> Vec<&'static str> { - Self::dedupe_preserving_order( - terms.iter().flat_map(|t| t.requires().iter().copied()), - ) + Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.requires().iter().copied())) } /// The extractor that supports `op` for a domain carrying `terms`, or @@ -203,46 +241,49 @@ impl Term { } } -/// A single fixture plaintext value for a scalar type. +/// A single fixture plaintext value, value-kind tagged: `Min`/`Max`/`Zero` are +/// the integer matrix pivots (resolved per-kind); `Int` is an integer literal; +/// `Numeric`/`Text`/`Jsonb` carry rendered string literals. /// -/// Mirrors `scalars.py`'s fixture-token handling, but typed: the sentinels -/// `MIN`/`MAX`/`ZERO` (the matrix comparison pivots) are dedicated variants, -/// and `N(i128)` is any explicit numeric literal. Range validity of committed -/// catalog data is enforced by the invariant `#[test]`s, not here. +/// `fixtures!` range-checks `Int` literals at compile time, but a hand-built +/// `Fixture::Int(n)` is not — hence the runtime invariant tests. `Int(MIN)` and +/// `Min` resolve equal but render differently (`"-32768"` vs `"i16::MIN"`). #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Fixture { Min, Max, Zero, - N(i128), + Int(i128), + Numeric(&'static str), + Text(&'static str), + Jsonb(&'static str), } impl Fixture { - /// Resolve this fixture to its numeric value for the given scalar kind. - /// Mirrors `scalars.py::numeric_value`. Infallible: `Min`/`Max` resolve to - /// the kind's bounds, `Zero` to `0`, and `N(n)` to `n` verbatim. It does - /// NOT range-check — for committed catalog data the range is statically - /// un-failable, and the bounds guard the old `Result` encoded lives in the - /// invariant test `every_fixture_value_is_within_kind_bounds` - /// (which compares this value against `[min_value(), max_value()]`). - pub fn numeric_value(self, kind: ScalarKind) -> i128 { + /// The integer value for this fixture (`Min`/`Max` -> kind bounds, `Zero` -> + /// 0, `Int(n)` -> n), or `None` for the string-backed kinds. Does not + /// range-check; `every_fixture_value_is_within_kind_bounds` guards the bounds. + pub fn numeric_value(self, kind: ScalarKind) -> Option { match self { - Fixture::Min => kind.min_value(), - Fixture::Max => kind.max_value(), - Fixture::Zero => 0, - Fixture::N(n) => n, + Fixture::Min => Some(kind.min_value()), + Fixture::Max => Some(kind.max_value()), + Fixture::Zero => Some(0), + Fixture::Int(n) => Some(n), + Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) => None, } } - /// Render this fixture as a Rust source literal of the given scalar kind. - /// Sentinels render to their named constant; `N` renders the integer. - /// Mirrors `scalars.py::render_literal`. + /// Render as a Rust source literal: sentinels -> named constant, `Int` -> the + /// number, string kinds -> a `Debug`-quoted (Rust-escaped, not SQL) literal. pub fn render_literal(self, kind: ScalarKind) -> String { match self { Fixture::Min => kind.min_symbol().to_string(), Fixture::Max => kind.max_symbol().to_string(), Fixture::Zero => kind.zero_symbol().to_string(), - Fixture::N(n) => n.to_string(), + Fixture::Int(n) => n.to_string(), + Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) => { + format!("{s:?}") + } } } } @@ -276,55 +317,56 @@ impl ScalarSpec { /// Domains shared by every ordered-integer scalar, in manifest file order: /// storage (no terms), `_eq` (hm), `_ord_ore` (ore), `_ord` (ore). const ORDERED_INT_DOMAINS: &[DomainSpec] = &[ - DomainSpec { suffix: "", terms: &[] }, - DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, - DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, - DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, + DomainSpec { + suffix: "", + terms: &[], + }, + DomainSpec { + suffix: "_eq", + terms: &[Term::Hm], + }, + DomainSpec { + suffix: "_ord_ore", + terms: &[Term::Ore], + }, + DomainSpec { + suffix: "_ord", + terms: &[Term::Ore], + }, ]; +/// Builds a `&[Fixture]`. The `int ;` arm (a tt-muncher over `Min`/`Max`/ +/// `Zero` and `N()`) range-checks each literal against `` at compile +/// time via `const _RANGE_CHECK`, so out-of-range literals do not compile; +/// `text;`/`numeric;`/`jsonb;` wrap string literals. The reject case has no +/// in-crate test (macro isn't exported, no `trybuild` under zero-deps) — verify +/// by hand with a bad `N(..)`. +macro_rules! fixtures { + (int $t:ty; $($body:tt)*) => { fixtures!(@int $t; [] $($body)*) }; + (@int $t:ty; [$($acc:expr),*]) => { &[$($acc),*] }; + (@int $t:ty; [$($acc:expr),*] , $($r:tt)*) => { fixtures!(@int $t; [$($acc),*] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Min $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Min ] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Max $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Max ] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Zero $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Zero] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] N($v:literal) $($r:tt)*) => { + fixtures!(@int $t; [$($acc,)* Fixture::Int({ const _RANGE_CHECK: $t = $v; $v as i128 })] $($r)*) + }; + (text; $($s:literal),* $(,)?) => { &[$(Fixture::Text($s)),*] }; + (numeric; $($s:literal),* $(,)?) => { &[$(Fixture::Numeric($s)),*] }; + (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; +} + /// int4 fixture plaintexts — verbatim from `tasks/codegen/types/int4.toml`. -const INT4_FIXTURES: &[Fixture] = &[ - Fixture::Min, - Fixture::N(-100), - Fixture::N(-1), - Fixture::Zero, - Fixture::N(1), - Fixture::N(2), - Fixture::N(5), - Fixture::N(10), - Fixture::N(17), - Fixture::N(25), - Fixture::N(42), - Fixture::N(50), - Fixture::N(100), - Fixture::N(250), - Fixture::N(1000), - Fixture::N(9999), - Fixture::Max, -]; +/// `N(..)` literals are range-checked against `i32` at compile time. +const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; + Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), + N(42), N(50), N(100), N(250), N(1000), N(9999), Max); /// int2 fixture plaintexts — verbatim from `tasks/codegen/types/int2.toml`. -const INT2_FIXTURES: &[Fixture] = &[ - Fixture::Min, - Fixture::N(-30000), - Fixture::N(-100), - Fixture::N(-1), - Fixture::Zero, - Fixture::N(1), - Fixture::N(2), - Fixture::N(5), - Fixture::N(10), - Fixture::N(17), - Fixture::N(25), - Fixture::N(42), - Fixture::N(50), - Fixture::N(100), - Fixture::N(250), - Fixture::N(1000), - Fixture::N(9999), - Fixture::N(30000), - Fixture::Max, -]; +/// `N(..)` literals are range-checked against `i16` at compile time. +const INT2_FIXTURES: &[Fixture] = fixtures!(int i16; + Min, N(-30000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), + N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(30000), Max); const INT4: ScalarSpec = ScalarSpec { token: "int4", @@ -340,12 +382,8 @@ const INT2: ScalarSpec = ScalarSpec { fixtures: INT2_FIXTURES, }; -/// The scalar catalog: the single source of truth replacing the TOML manifests -/// present on this branch (`int4`, `int2`). Order is significant (it drives -/// generation/enumeration order). `int8` is intentionally absent here — it is -/// added on the branch that introduces the int8 SQL surface by appending its -/// `ScalarSpec`; the capability layer above (`ScalarKind::I64`) already supports -/// it, so that addition is a pure append. +/// The scalar catalog — the single source of truth. Order is significant (it +/// drives generation order). New types are appended as their SQL surface lands. pub const CATALOG: &[ScalarSpec] = &[INT4, INT2]; #[cfg(test)] @@ -372,6 +410,47 @@ mod rust_tests { assert_eq!(ScalarKind::I16.max_value(), 32_767_i128); } + #[test] + fn is_int_classifies_kinds() { + assert!(ScalarKind::I16.is_int()); + assert!(ScalarKind::I32.is_int()); + assert!(ScalarKind::I64.is_int()); + assert!(!ScalarKind::Numeric.is_int()); + assert!(!ScalarKind::Text.is_int()); + assert!(!ScalarKind::Jsonb.is_int()); + } + + // Pin that the bounded-numeric accessors panic (with message) on non-int kinds. + #[test] + #[should_panic(expected = "min_symbol is only defined for integer kinds")] + fn min_symbol_panics_on_non_int_kind() { + ScalarKind::Text.min_symbol(); + } + + #[test] + #[should_panic(expected = "max_symbol is only defined for integer kinds")] + fn max_symbol_panics_on_non_int_kind() { + ScalarKind::Numeric.max_symbol(); + } + + #[test] + #[should_panic(expected = "zero_symbol is only defined for integer kinds")] + fn zero_symbol_panics_on_non_int_kind() { + ScalarKind::Jsonb.zero_symbol(); + } + + #[test] + #[should_panic(expected = "min_value is only defined for integer kinds")] + fn min_value_panics_on_non_int_kind() { + ScalarKind::Text.min_value(); + } + + #[test] + #[should_panic(expected = "max_value is only defined for integer kinds")] + fn max_value_panics_on_non_int_kind() { + ScalarKind::Jsonb.max_value(); + } + #[test] fn i64_facts() { // Capability-layer fact: i64 is the Rust kind a future int8 maps onto. @@ -469,8 +548,14 @@ mod term_helper_tests { #[test] fn extractor_for_operator_picks_first_supporting_term() { - assert_eq!(Term::extractor_for_operator(&[Term::Hm], "="), Some("eq_term")); - assert_eq!(Term::extractor_for_operator(&[Term::Ore], "<"), Some("ord_term")); + assert_eq!( + Term::extractor_for_operator(&[Term::Hm], "="), + Some("eq_term") + ); + assert_eq!( + Term::extractor_for_operator(&[Term::Ore], "<"), + Some("ord_term") + ); assert_eq!( Term::extractor_for_operator(&[Term::Hm, Term::Ore], "="), Some("eq_term") @@ -494,26 +579,51 @@ mod fixture_tests { #[test] fn numeric_value_resolves_sentinels_and_literals_for_i32() { - assert_eq!(Fixture::Min.numeric_value(ScalarKind::I32), -2_147_483_648); - assert_eq!(Fixture::Max.numeric_value(ScalarKind::I32), 2_147_483_647); - assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I32), 0); - assert_eq!(Fixture::N(42).numeric_value(ScalarKind::I32), 42); - assert_eq!(Fixture::N(-1).numeric_value(ScalarKind::I32), -1); + assert_eq!( + Fixture::Min.numeric_value(ScalarKind::I32), + Some(-2_147_483_648) + ); + assert_eq!( + Fixture::Max.numeric_value(ScalarKind::I32), + Some(2_147_483_647) + ); + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I32), Some(0)); + assert_eq!(Fixture::Int(42).numeric_value(ScalarKind::I32), Some(42)); + assert_eq!(Fixture::Int(-1).numeric_value(ScalarKind::I32), Some(-1)); } #[test] fn numeric_value_resolves_sentinels_per_kind() { // Sentinels resolve to the kind's bounds; zero is always 0. - assert_eq!(Fixture::Min.numeric_value(ScalarKind::I16), -32_768); - assert_eq!(Fixture::Max.numeric_value(ScalarKind::I16), 32_767); - assert_eq!(Fixture::Min.numeric_value(ScalarKind::I64), -9_223_372_036_854_775_808); - assert_eq!(Fixture::Max.numeric_value(ScalarKind::I64), 9_223_372_036_854_775_807); - assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I64), 0); - // `numeric_value` is infallible: it resolves a literal verbatim and does - // NOT range-check. Range validity of committed catalog data is enforced - // by the invariant test `every_fixture_value_is_within_kind_bounds`, - // which compares `numeric_value` against `[min_value(), max_value()]`. - assert_eq!(Fixture::N(5_000_000_000).numeric_value(ScalarKind::I64), 5_000_000_000); + assert_eq!(Fixture::Min.numeric_value(ScalarKind::I16), Some(-32_768)); + assert_eq!(Fixture::Max.numeric_value(ScalarKind::I16), Some(32_767)); + assert_eq!( + Fixture::Min.numeric_value(ScalarKind::I64), + Some(-9_223_372_036_854_775_808) + ); + assert_eq!( + Fixture::Max.numeric_value(ScalarKind::I64), + Some(9_223_372_036_854_775_807) + ); + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I64), Some(0)); + // `Int` resolves verbatim; no runtime range-check here. + assert_eq!( + Fixture::Int(5_000_000_000).numeric_value(ScalarKind::I64), + Some(5_000_000_000) + ); + } + + #[test] + fn numeric_value_is_none_for_string_variants() { + assert_eq!(Fixture::Text("alice").numeric_value(ScalarKind::Text), None); + assert_eq!( + Fixture::Numeric("3.14").numeric_value(ScalarKind::Numeric), + None + ); + assert_eq!( + Fixture::Jsonb(r#"{"a":1}"#).numeric_value(ScalarKind::Jsonb), + None + ); } #[test] @@ -527,9 +637,69 @@ mod fixture_tests { #[test] fn render_literal_passes_through_numeric() { - assert_eq!(Fixture::N(-100).render_literal(ScalarKind::I32), "-100"); - assert_eq!(Fixture::N(9999).render_literal(ScalarKind::I32), "9999"); - assert_eq!(Fixture::N(5_000_000_000).render_literal(ScalarKind::I64), "5000000000"); + assert_eq!(Fixture::Int(-100).render_literal(ScalarKind::I32), "-100"); + assert_eq!(Fixture::Int(9999).render_literal(ScalarKind::I32), "9999"); + assert_eq!( + Fixture::Int(5_000_000_000).render_literal(ScalarKind::I64), + "5000000000" + ); + } + + #[test] + fn render_literal_quotes_string_variants() { + // String-backed kinds render a valid quoted Rust literal. + assert_eq!( + Fixture::Text("alice").render_literal(ScalarKind::Text), + "\"alice\"" + ); + assert_eq!( + Fixture::Numeric("3.14").render_literal(ScalarKind::Numeric), + "\"3.14\"" + ); + assert_eq!( + Fixture::Jsonb(r#"{"a":1}"#).render_literal(ScalarKind::Jsonb), + r#""{\"a\":1}""# + ); + } + + #[test] + fn fixtures_macro_builds_each_kind() { + // The int arm range-checks at compile time; sentinels + literals mix. + const INTS: &[Fixture] = fixtures!(int i16; Min, N(-1), Zero, N(30000), Max); + assert_eq!( + INTS, + &[ + Fixture::Min, + Fixture::Int(-1), + Fixture::Zero, + Fixture::Int(30000), + Fixture::Max + ] + ); + // The string arms wrap into the matching variant. + const TEXTS: &[Fixture] = fixtures!(text; "alice", "bob"); + assert_eq!(TEXTS, &[Fixture::Text("alice"), Fixture::Text("bob")]); + const NUMS: &[Fixture] = fixtures!(numeric; "0.1", "-2.5"); + assert_eq!(NUMS, &[Fixture::Numeric("0.1"), Fixture::Numeric("-2.5")]); + const JSONS: &[Fixture] = fixtures!(jsonb; r#"{"a":1}"#); + assert_eq!(JSONS, &[Fixture::Jsonb(r#"{"a":1}"#)]); + } + + #[test] + fn fixtures_macro_handles_degenerate_inputs() { + // Empty list — every arm accepts zero elements. + const NO_INT: &[Fixture] = fixtures!(int i32;); + const NO_TEXT: &[Fixture] = fixtures!(text;); + assert_eq!(NO_INT, &[] as &[Fixture]); + assert_eq!(NO_TEXT, &[] as &[Fixture]); + // Trailing comma — int muncher (leading-comma rule) and string arm `$(,)?`. + const TRAILING_INT: &[Fixture] = fixtures!(int i32; Min, N(1),); + const TRAILING_TEXT: &[Fixture] = fixtures!(text; "a",); + assert_eq!(TRAILING_INT, &[Fixture::Min, Fixture::Int(1)]); + assert_eq!(TRAILING_TEXT, &[Fixture::Text("a")]); + // Sentinels-only, no `N(..)`. + const SENTINELS: &[Fixture] = fixtures!(int i32; Min, Zero, Max); + assert_eq!(SENTINELS, &[Fixture::Min, Fixture::Zero, Fixture::Max]); } } @@ -602,21 +772,21 @@ mod catalog_tests { // From int4.toml [fixture] values, in order. let expected = vec![ Fixture::Min, - Fixture::N(-100), - Fixture::N(-1), + Fixture::Int(-100), + Fixture::Int(-1), Fixture::Zero, - Fixture::N(1), - Fixture::N(2), - Fixture::N(5), - Fixture::N(10), - Fixture::N(17), - Fixture::N(25), - Fixture::N(42), - Fixture::N(50), - Fixture::N(100), - Fixture::N(250), - Fixture::N(1000), - Fixture::N(9999), + Fixture::Int(1), + Fixture::Int(2), + Fixture::Int(5), + Fixture::Int(10), + Fixture::Int(17), + Fixture::Int(25), + Fixture::Int(42), + Fixture::Int(50), + Fixture::Int(100), + Fixture::Int(250), + Fixture::Int(1000), + Fixture::Int(9999), Fixture::Max, ]; assert_eq!(s.fixtures, expected.as_slice()); @@ -627,8 +797,8 @@ mod catalog_tests { let s = scalar("int2"); // From int2.toml [fixture] values, in order — includes the wide // ±30000 values that exercise the i16 bounds. - assert!(s.fixtures.contains(&Fixture::N(-30000))); - assert!(s.fixtures.contains(&Fixture::N(30000))); + assert!(s.fixtures.contains(&Fixture::Int(-30000))); + assert!(s.fixtures.contains(&Fixture::Int(30000))); assert_eq!(s.fixtures.first(), Some(&Fixture::Min)); assert_eq!(s.fixtures.last(), Some(&Fixture::Max)); } @@ -660,13 +830,34 @@ mod invariant_tests { } } + /// Cross-kind distinctness key: integer fixtures dedupe by their resolved + /// number, string-backed fixtures by their literal. Generalises the Python + /// distinct-plaintext contract to every scalar kind. + #[derive(Debug, PartialEq, Eq, Hash)] + enum DistinctKey { + Num(i128), + Str(&'static str), + } + + fn distinct_key(f: Fixture, kind: ScalarKind) -> DistinctKey { + match f { + Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) => DistinctKey::Str(s), + _ => DistinctKey::Num( + f.numeric_value(kind) + .expect("sentinel/Int fixtures resolve to a number"), + ), + } + } + #[test] fn fixtures_include_min_max_and_zero() { - for s in CATALOG { + // The MIN/MAX/ZERO pivots are an integer-kind invariant; non-integer + // kinds (text/numeric/jsonb) have no such pivots. + for s in CATALOG.iter().filter(|s| s.kind.is_int()) { let resolved: Vec = s .fixtures .iter() - .map(|f| f.numeric_value(s.kind)) + .filter_map(|f| f.numeric_value(s.kind)) .collect(); assert!( resolved.contains(&s.kind.min_value()), @@ -685,28 +876,46 @@ mod invariant_tests { #[test] fn fixture_values_are_distinct_by_resolved_number() { for s in CATALOG { - let mut seen: HashMap = HashMap::new(); + let mut seen: HashMap = HashMap::new(); for f in s.fixtures { - let n = f.numeric_value(s.kind); - if let Some(prev) = seen.insert(n, *f) { - panic!( - "{}: {f:?} duplicates {prev:?} (both resolve to {n})", - s.token - ); + if let Some(prev) = seen.insert(distinct_key(*f, s.kind), *f) { + panic!("{}: {f:?} duplicates {prev:?}", s.token); } } } } + #[test] + fn distinct_key_separates_string_fixtures() { + // CATALOG is int-only, so the `Str` path is otherwise unexercised. + assert_eq!( + distinct_key(Fixture::Text("a"), ScalarKind::Text), + distinct_key(Fixture::Text("a"), ScalarKind::Text) + ); + assert_ne!( + distinct_key(Fixture::Text("a"), ScalarKind::Text), + distinct_key(Fixture::Text("b"), ScalarKind::Text) + ); + assert_eq!( + distinct_key(Fixture::Numeric("x"), ScalarKind::Numeric), + distinct_key(Fixture::Jsonb("x"), ScalarKind::Jsonb) + ); + // Str and Num keys never collide. + assert_ne!( + distinct_key(Fixture::Text("0"), ScalarKind::Text), + distinct_key(Fixture::Zero, ScalarKind::I32) + ); + } + #[test] fn every_fixture_value_is_within_kind_bounds() { - // `numeric_value` is infallible, so the range guarantee the old - // `Result` encoded is asserted explicitly here: this is the ONLY guard - // against an out-of-range `N` in committed catalog data. - for s in CATALOG { + // Asserts the resolved sentinels stay within bounds (integer kinds only). + for s in CATALOG.iter().filter(|s| s.kind.is_int()) { let (lo, hi) = (s.kind.min_value(), s.kind.max_value()); for f in s.fixtures { - let n = f.numeric_value(s.kind); + let Some(n) = f.numeric_value(s.kind) else { + continue; + }; assert!( n >= lo && n <= hi, "{}: fixture {f:?} resolves to {n}, out of range [{lo}, {hi}]", From 49138d429c3745407d2d687eb40b02c21c425e2d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:26:18 +1000 Subject: [PATCH 030/599] ci(test): cover the Rust workspace crates in test-eql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The workspace members under crates/ were invisible to CI: the test-eql path filters only matched src/sql/tests/tasks, so a PR touching crates/** or the root Cargo.{toml,lock} skipped the workflow entirely, and no task ran the new crates' tests anyway (test:sqlx runs only tests/sqlx; the "codegen" job runs the Python generator, not the Rust eql-codegen crate; default-members is tests/sqlx). The eql-scalars catalog tests could break with CI green. - Add crates/**, Cargo.toml, Cargo.lock to the test-eql push + pull_request path filters (and mirror them in bench-eql). - New `test:crates` mise task: cargo fmt --check + clippy + test, scoped to -p eql-scalars -p eql-codegen (NOT --workspace — tests/sqlx needs Postgres + CS_* secrets and stays covered by the `test` job). - New `rust-crates` CI job running it — no database, fast, standalone. --- .github/workflows/bench-eql.yml | 3 +++ .github/workflows/test-eql.yml | 34 +++++++++++++++++++++++++++++++++ mise.toml | 17 +++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/.github/workflows/bench-eql.yml b/.github/workflows/bench-eql.yml index 5b302c088..782ed3c35 100644 --- a/.github/workflows/bench-eql.yml +++ b/.github/workflows/bench-eql.yml @@ -15,6 +15,9 @@ on: - "src/**/*.sql" - "tests/sqlx/**/*" - "tasks/**/*" + - "crates/**" + - "Cargo.toml" + - "Cargo.lock" schedule: # 02:00 UTC daily diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 6dbc62e8a..4fa0c4572 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -9,6 +9,9 @@ on: - "sql/**/*.sql" - "tests/**/*" - "tasks/**/*" + - "crates/**" + - "Cargo.toml" + - "Cargo.lock" pull_request: # run on all pull requests @@ -18,6 +21,9 @@ on: - "sql/**/*.sql" - "tests/**/*" - "tasks/**/*" + - "crates/**" + - "Cargo.toml" + - "Cargo.lock" workflow_dispatch: @@ -57,6 +63,34 @@ jobs: run: | mise run test:schema + rust-crates: + name: "Rust workspace crates" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests + + # fmt + clippy + test for the std-only catalog/generator crates. No + # Postgres: these never touch a database, so they run standalone and fast. + - name: Compile, lint and test the Rust workspace crates + run: | + export active_rust_toolchain=$(rustup show active-toolchain | cut -d' ' -f1) + rustup component add --toolchain ${active_rust_toolchain} rustfmt clippy + mise run test:crates + codegen: name: "Encrypted-domain codegen" runs-on: ubuntu-latest diff --git a/mise.toml b/mise.toml index adee16580..78ea2cb01 100644 --- a/mise.toml +++ b/mise.toml @@ -105,6 +105,23 @@ mise exec python -- python -m pip install --quiet --disable-pip-version-check py mise exec python -- python -m pytest tasks/codegen -q """ +[tasks."test:crates"] +description = "Compile, lint and test the std-only Rust workspace crates (no database)" +dir = "{{config_root}}" +run = """ +# eql-scalars / eql-codegen are the lean workspace members. Scope explicitly to +# them (NOT --workspace): a workspace-wide test would drag in tests/sqlx, whose +# suite needs Postgres + CS_* secrets and is already covered by the `test` job. +# clippy is likewise scoped — a workspace clippy recompiles the heavy +# sqlx/tokio/cipherstash-client tree for no added coverage of these crates. +# `set -eu` only (no pipefail): mise runs tasks under `sh`, which is dash on the +# CI runners, and dash rejects `set -o pipefail`. There are no pipes here. +set -eu +cargo fmt --check +cargo clippy -p eql-scalars -p eql-codegen --all-targets -- -D warnings +cargo test -p eql-scalars -p eql-codegen +""" + [tasks."test:matrix:inventory"] description = "Regenerate the int4/int2 matrix test-name inventory snapshots (no database required)" dir = "{{config_root}}/tests/sqlx" From ff02377083de61474f111949d4f27140a1a7644d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:20:57 +1000 Subject: [PATCH 031/599] feat(codegen): port SQL generator to Rust with generator parity Port the scalar encrypted-domain SQL generator from the Python oracle to the `eql-codegen` Rust crate, achieving generator parity and wiring it into the build/test/CI flow. Generator: - Scaffold the eql-codegen crate: AUTO-GENERATED headers, schema consts, sql_str, operator-surface table, backing_function, role/brief/shape helpers, and the fixture-values renderer. - Port the domain-block, extractor, wrapper, three blocker renderers (LANGUAGE plpgsql, never STRICT), operator, aggregate (ord-capability), and types-file renderers; relocate derivation helpers + logic tests into the context layer. - Render the int4 SQL surface (types/functions/operators/aggregates) from minijinja templates; add the minijinja+serde template environment. - Port the ownership-guarded writer (std-only) and the generate_all orchestrator + CLI (generate / list-types). Tests & CI: - int4 golden-master reference tests; values.rs byte-exact, integration golden line-normalized; coarsened footgun + escaping guards as whole-file/context scans. - Retire the Python-oracle parity gate; codegen:parity now gates on golden + values. Drop the deprecated Python test:codegen drift check. Cleanup: - Standardize the generated-SQL marker on `-- AUTOMATICALLY GENERATED FILE` (the project-wide marker docs:validate greps on); regenerate int2/int4 values.rs fixtures and update the consts.rs assertion and CLAUDE.md. - Address review findings (operator-check rename, placeholder_payload comment, exit-code u8 clamp). --- .github/workflows/test-eql.yml | 22 +- CLAUDE.md | 2 +- Cargo.lock | 21 + crates/eql-codegen/Cargo.toml | 14 +- crates/eql-codegen/src/consts.rs | 62 ++ crates/eql-codegen/src/context.rs | 306 ++++++++ crates/eql-codegen/src/generate.rs | 709 ++++++++++++++++++ crates/eql-codegen/src/lib.rs | 11 + crates/eql-codegen/src/main.rs | 46 +- crates/eql-codegen/src/operator_surface.rs | 149 ++++ crates/eql-codegen/src/templates.rs | 72 ++ crates/eql-codegen/src/writer.rs | 291 +++++++ .../eql-codegen/templates/aggregates.sql.j2 | 34 + crates/eql-codegen/templates/functions.sql.j2 | 34 + crates/eql-codegen/templates/operators.sql.j2 | 13 + crates/eql-codegen/templates/types.sql.j2 | 26 + crates/eql-codegen/tests/parity.rs | 100 +++ mise.toml | 5 + tasks/codegen-parity.sh | 26 + tasks/test.sh | 15 +- .../reference/int4/int4_eq_functions.sql | 215 +++--- .../reference/int4/int4_eq_operators.sql | 41 +- .../codegen/reference/int4/int4_functions.sql | 237 +++--- .../codegen/reference/int4/int4_operators.sql | 47 +- .../reference/int4/int4_ord_aggregates.sql | 55 +- .../reference/int4/int4_ord_functions.sql | 167 +++-- .../reference/int4/int4_ord_operators.sql | 29 +- .../int4/int4_ord_ore_aggregates.sql | 55 +- .../reference/int4/int4_ord_ore_functions.sql | 167 +++-- .../reference/int4/int4_ord_ore_operators.sql | 29 +- tests/codegen/reference/int4/int4_types.sql | 11 +- tests/sqlx/src/fixtures/int2_values.rs | 5 +- tests/sqlx/src/fixtures/int4_values.rs | 5 +- .../tests/encrypted_domain/family/support.rs | 20 +- 34 files changed, 2395 insertions(+), 646 deletions(-) create mode 100644 crates/eql-codegen/src/consts.rs create mode 100644 crates/eql-codegen/src/context.rs create mode 100644 crates/eql-codegen/src/generate.rs create mode 100644 crates/eql-codegen/src/lib.rs create mode 100644 crates/eql-codegen/src/operator_surface.rs create mode 100644 crates/eql-codegen/src/templates.rs create mode 100644 crates/eql-codegen/src/writer.rs create mode 100644 crates/eql-codegen/templates/aggregates.sql.j2 create mode 100644 crates/eql-codegen/templates/functions.sql.j2 create mode 100644 crates/eql-codegen/templates/operators.sql.j2 create mode 100644 crates/eql-codegen/templates/types.sql.j2 create mode 100644 crates/eql-codegen/tests/parity.rs create mode 100755 tasks/codegen-parity.sh diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 4fa0c4572..22a61d1c2 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -106,9 +106,17 @@ jobs: install: true cache: true - - name: Run codegen generator + drift tests - run: | - mise run test:codegen + # Shared with the sibling Rust jobs so the eql-codegen build artifacts the + # parity gate needs are reused rather than rebuilt from scratch. + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests + + # The Python `test:codegen` drift suite is intentionally not run here: the + # Python generator is deprecated and removed in the following PR. The + # hand-written reference (tests/codegen/reference/) is now gated against + # the Rust generator by the `mise run codegen:parity` step below. # Regenerate the committed Rust fixture-value consts for EVERY type from # their manifests and fail if any differ from / are missing in the tree. @@ -125,6 +133,14 @@ jobs: git diff --exit-code -- tests/sqlx/src/fixtures \ || { echo "Fixture value const(s) stale or uncommitted — run 'mise run codegen:domain:all' and commit tests/sqlx/src/fixtures."; exit 1; } + # Cross-generator parity: assert the Rust eql-codegen output is byte- + # identical to the Python oracle across all types, the committed + # _values.rs, and the int4 golden reference. No Postgres needed — both + # generators are deterministic and run offline. + - name: Verify Rust↔Python generator parity + run: | + mise run codegen:parity + matrix-coverage: name: "Matrix coverage inventory" runs-on: ubuntu-latest diff --git a/CLAUDE.md b/CLAUDE.md index c15fa0e17..104770621 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -78,7 +78,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search `src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. -Adding a scalar encrypted-domain type is generated from a minimal manifest at `tasks/codegen/types/.toml`: the filename supplies ``, and the `[domain]` table maps each generated domain name to the fixed index terms it carries. Example: `int4_eq = ["hm"]`, `int4_ord = ["ore"]`. Term capabilities are fixed in `tasks/codegen/terms.py`: `hm` provides equality, and `ore` provides equality plus ordering. `mise run build` regenerates the scalar SQL surface into `src/encrypted_domain//` from every manifest at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. Use `mise run codegen:domain ` to refresh a single type manually while iterating on its manifest, or `mise run codegen:domain:all` to regenerate every type at once (the same enumeration `mise run build` uses). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` files are gitignored and never committed — the TOML manifest plus `tasks/codegen/terms.py` are the source of truth. Generated files carry an `AUTO-GENERATED — DO NOT EDIT` header; change the manifest or term catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` have no generated SQL surface yet (they are planned, not out of scope); `jsonb` needs a separate SQL design beyond this ordered-scalar materializer. +Adding a scalar encrypted-domain type is generated from a minimal manifest at `tasks/codegen/types/.toml`: the filename supplies ``, and the `[domain]` table maps each generated domain name to the fixed index terms it carries. Example: `int4_eq = ["hm"]`, `int4_ord = ["ore"]`. Term capabilities are fixed in `tasks/codegen/terms.py`: `hm` provides equality, and `ore` provides equality plus ordering. `mise run build` regenerates the scalar SQL surface into `src/encrypted_domain//` from every manifest at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. Use `mise run codegen:domain ` to refresh a single type manually while iterating on its manifest, or `mise run codegen:domain:all` to regenerate every type at once (the same enumeration `mise run build` uses). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` files are gitignored and never committed — the TOML manifest plus `tasks/codegen/terms.py` are the source of truth. Generated files carry an `AUTOMATICALLY GENERATED FILE — DO NOT EDIT` header (the project-wide marker that `docs:validate` greps on to skip generated SQL); change the manifest or term catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` have no generated SQL surface yet (they are planned, not out of scope); `jsonb` needs a separate SQL design beyond this ordered-scalar materializer. **Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the manifest only declares domain names and terms. New term behavior belongs in `tasks/codegen/terms.py` with tests, not in free-form TOML fields. diff --git a/Cargo.lock b/Cargo.lock index f7bdda956..ebc391655 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1158,6 +1158,11 @@ dependencies = [ [[package]] name = "eql-codegen" version = "0.1.0" +dependencies = [ + "eql-scalars", + "minijinja", + "serde", +] [[package]] name = "eql-scalars" @@ -2234,6 +2239,12 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "memo-map" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" + [[package]] name = "micromap" version = "0.3.0" @@ -2270,6 +2281,16 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "minijinja" +version = "2.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2929e494b2280e1e18959bb2e121da03347ae896896fdfaceaab43c88a02803f" +dependencies = [ + "memo-map", + "serde", +] + [[package]] name = "miniz_oxide" version = "0.8.9" diff --git a/crates/eql-codegen/Cargo.toml b/crates/eql-codegen/Cargo.toml index 0c4e9b25a..251653972 100644 --- a/crates/eql-codegen/Cargo.toml +++ b/crates/eql-codegen/Cargo.toml @@ -2,7 +2,17 @@ name = "eql-codegen" version = "0.1.0" edition = "2021" -description = "SQL generator for EQL encrypted-domain types (stub; implemented in Plan 2)." +publish = false -# Stub: Plan 2 adds `eql-scalars` as a path dependency and implements the binary. [dependencies] +eql-scalars = { path = "../eql-scalars" } +minijinja = "2" +serde = { version = "1", features = ["derive"] } + +[[bin]] +name = "eql-codegen" +path = "src/main.rs" + +[lib] +name = "eql_codegen" +path = "src/lib.rs" diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs new file mode 100644 index 000000000..ae318ac83 --- /dev/null +++ b/crates/eql-codegen/src/consts.rs @@ -0,0 +1,62 @@ +//! AUTO-GENERATED headers, schema constants, and SQL-string escaping. + +/// SQL generated-file marker. The SQL templates emit this as their first line; +/// the writer uses it only to recognise files it owns (overwrite/clean safety). +pub const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE.\n"; + +/// Rust generated-file marker, prepended to `_values.rs` (which has no +/// template). Rust comment syntax so the `.rs` file stays valid. +pub const AUTO_GENERATED_HEADER_RS: &str = "// AUTOMATICALLY GENERATED FILE.\n"; + +/// Schema housing the encrypted-domain families. +pub const DOMAIN_SCHEMA: &str = "eql_v3"; +/// Schema owning the core index-term types/constructors. +pub const CORE_SCHEMA: &str = "eql_v2"; + +/// Envelope keys checked for presence in every domain CHECK, in order. +pub const ENVELOPE_KEYS: &[&str] = &["v", "i"]; +/// Ciphertext payload key. +pub const CIPHERTEXT_KEY: &str = "c"; +/// Envelope-version key whose value is pinned. +pub const VERSION_KEY: &str = "v"; +/// EQL payload-format version pinned by the domain CHECK. +pub const ENVELOPE_VERSION: u32 = 2; + +/// Escape a string for use inside a single-quoted SQL literal by doubling +/// embedded single quotes. Port of templates.py `_sql_str`. +pub fn sql_str(s: &str) -> String { + s.replace('\'', "''") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn sql_marker_is_grep_compatible_single_line() { + // The `^-- AUTOMATICALLY GENERATED FILE` marker is what + // tasks/docs/validate/{coverage,required-tags}.sh grep on to skip + // generated SQL — keep this assertion and that grep in lockstep. + assert_eq!(AUTO_GENERATED_HEADER, "-- AUTOMATICALLY GENERATED FILE.\n"); + assert!(AUTO_GENERATED_HEADER.contains("AUTOMATICALLY GENERATED FILE")); + } + + #[test] + fn rust_marker_is_a_rust_comment() { + assert_eq!(AUTO_GENERATED_HEADER_RS, "// AUTOMATICALLY GENERATED FILE.\n"); + for line in AUTO_GENERATED_HEADER_RS.lines() { + assert!( + !line.starts_with("--"), + "rust marker must not contain SQL comments" + ); + } + } + + #[test] + fn sql_str_doubles_single_quotes() { + assert_eq!(sql_str("o'brien"), "o''brien"); + assert_eq!(sql_str("a'b'c"), "a''b''c"); + assert_eq!(sql_str("int4_eq"), "int4_eq"); + assert_eq!(sql_str("<="), "<="); + } +} diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs new file mode 100644 index 000000000..6a104831e --- /dev/null +++ b/crates/eql-codegen/src/context.rs @@ -0,0 +1,306 @@ +//! minijinja environment + serde context structs + relocated logic helpers. + +use crate::consts::*; +use eql_scalars::{DomainSpec, Term}; + +/// Line-normalize SQL for best-effort byte-exact comparison: trim each line's +/// leading/trailing whitespace and drop blank lines; preserve intra-line +/// spacing. NOT used for `_values.rs` (which stays byte-exact). +pub fn normalize_sql(s: &str) -> String { + s.lines() + .map(|l| l.trim()) + .filter(|l| !l.is_empty()) + .collect::>() + .join("\n") +} + +/// Build the minijinja environment with the four embedded whole-file templates. +/// Templates are compiled in via `include_str!` — no runtime file IO. +pub fn environment() -> minijinja::Environment<'static> { + let mut env = minijinja::Environment::new(); + // Preserve each template file's trailing newline so generated SQL files end + // with one (minijinja strips it by default). + env.set_keep_trailing_newline(true); + env.add_template("types.sql", include_str!("../templates/types.sql.j2")) + .expect("types.sql template"); + env.add_template("functions.sql", include_str!("../templates/functions.sql.j2")) + .expect("functions.sql template"); + env.add_template("operators.sql", include_str!("../templates/operators.sql.j2")) + .expect("operators.sql template"); + env.add_template("aggregates.sql", include_str!("../templates/aggregates.sql.j2")) + .expect("aggregates.sql template"); + env.add_global("domain_schema", DOMAIN_SCHEMA); + env.add_global("core_schema", CORE_SCHEMA); + env +} + +/// One idempotent CREATE DOMAIN block, with SQL-required values precomputed. +#[derive(serde::Serialize)] +pub struct DomainBlock { + pub typname: String, // sql_str-escaped bare name, e.g. int4_ord_ore + pub name: String, // raw bare name (unescaped), e.g. int4_ord_ore + pub keys: Vec, // ordered, sql_str-escaped key tokens (envelope + ciphertext + term keys) +} + +#[derive(serde::Serialize)] +pub struct TypesContext { + pub token: String, + pub domains: Vec, +} + +/// Build the per-domain block data (port of `render_domain_block`'s value logic, +/// minus comment prose and the CHECK skeleton — those are template-resident). +pub fn domain_block(token: &str, domain: &DomainSpec) -> DomainBlock { + let name = full_domain_name(token, domain.suffix); + + let mut keys: Vec = ENVELOPE_KEYS.iter().map(|k| sql_str(k)).collect(); + keys.push(sql_str(CIPHERTEXT_KEY)); + for k in Term::term_json_keys(domain.terms) { + keys.push(sql_str(k)); + } + + DomainBlock { + // typname is sql_str-escaped defensively: the escaping boundary stays + // Rust-side even though real catalog names carry no quotes. + typname: sql_str(&name), + name, + keys, + } +} + +/// One SQL parameter (name + SQL type), shared by wrapper/blocker signatures +/// and their `@param` docs tags. +#[derive(serde::Serialize)] +pub struct SqlParam { + pub name: &'static str, // "a", "b", or "selector" + pub ty: String, +} + +/// One generated function entry. The serde tag drives the template's three-way +/// switch; the blocker arm is never merged with the others (footgun separation). +#[derive(serde::Serialize)] +#[serde(tag = "kind")] +pub enum FnEntry { + Extractor { + ret: String, // e.g. eql_v2.hmac_256 (selection STAYS in Rust) + extractor: String, // e.g. eq_term + ctor: String, // e.g. hmac_256 (called as {{ core_schema }}.{{ ctor }}) + }, + Wrapper { + op: String, // SQL operator used in the body, e.g. = + function_name: String, // e.g. eq + args: [SqlParam; 2], + call_a: String, // e.g. eql_v3.eq_term(a) (embeds extract_arg cast logic) + call_b: String, // e.g. eql_v3.eq_term(b::eql_v3.int4_eq) + }, + Blocker { + operator_lit: String, // sql_str(op), escaped content for the RAISE literal + function_name: String, // e.g. lt / "->" / "#>" + args: [SqlParam; 2], + returns: String, // boolean / text / jsonb / domain (selection STAYS in Rust) + }, +} + +#[derive(serde::Serialize)] +pub struct FunctionsContext { + pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:" + pub token: String, + pub name: String, // full domain name (token+suffix) + pub dom: String, // schema-qualified domain, e.g. eql_v3.int4_eq + pub domain_lit: String, // sql_str(dom), defensively escaped for the RAISE literal + pub entries: Vec, +} + +/// Build the inlinable index-extractor entry for a domain term. +pub fn extractor_entry(term: Term) -> FnEntry { + FnEntry::Extractor { + ret: term.returns().to_string(), + extractor: term.extractor().to_string(), + ctor: term.ctor().to_string(), + } +} + +/// Build an inlinable comparison-wrapper entry for a supported operator. +/// `dom` is the schema-qualified domain name. +pub fn wrapper_entry(dom: &str, op: &str, arg_a: &str, arg_b: &str, extractor: &str) -> FnEntry { + use crate::operator_surface::backing_function; + FnEntry::Wrapper { + op: op.to_string(), + function_name: backing_function(op).to_string(), + args: [ + SqlParam { name: "a", ty: arg_a.to_string() }, + SqlParam { name: "b", ty: arg_b.to_string() }, + ], + call_a: extract_arg(arg_a, extractor, dom, "a"), + call_b: extract_arg(arg_b, extractor, dom, "b"), + } +} + +/// Build an unsupported-operator blocker entry. Every blocker shares one +/// uniform `RAISE EXCEPTION` body; only signature facts vary. +pub fn blocker_entry(op: &str, args: [SqlParam; 2], returns: &str) -> FnEntry { + use crate::operator_surface::backing_function; + FnEntry::Blocker { + // operator_lit is sql_str-escaped defensively for the single-quoted RAISE literal. + operator_lit: sql_str(op), + function_name: backing_function(op).to_string(), + args, + returns: returns.to_string(), + } +} + +/// One CREATE OPERATOR declaration, with the optional metadata line precomputed. +#[derive(serde::Serialize)] +pub struct OpEntry { + pub symbol: String, + pub function_name: String, // unqualified; schema literal lives in the template + pub leftarg: String, + pub rightarg: String, + pub metadata: Option, // e.g. "COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel" +} + +#[derive(serde::Serialize)] +pub struct OperatorsContext { + pub requires: Vec, + pub token: String, + pub name: String, + pub dom: String, + pub operators: Vec, +} + +/// Build one CREATE OPERATOR entry. The metadata line exists only for supported +/// symmetric operators that carry at least one extra (the `@>`/`<@` symmetric- +/// but-empty trap collapses to `None`). +pub fn operator_entry( + op: &str, + function_name: &str, + leftarg: &str, + rightarg: &str, + supported: bool, +) -> OpEntry { + use crate::operator_surface::{operator, Kind}; + let meta = operator(op); + let metadata = if supported && meta.kind == Kind::Symmetric { + let mut extras = Vec::new(); + if let Some(c) = meta.commutator { + extras.push(format!("COMMUTATOR = {c}")); + } + if let Some(n) = meta.negator { + extras.push(format!("NEGATOR = {n}")); + } + if let Some(r) = meta.restrict { + extras.push(format!("RESTRICT = {r}")); + } + if let Some(j) = meta.join { + extras.push(format!("JOIN = {j}")); + } + (!extras.is_empty()).then(|| extras.join(", ")) // empty → None (the @>/<@ trap) + } else { + None + }; + OpEntry { + symbol: op.to_string(), + function_name: function_name.to_string(), + leftarg: leftarg.to_string(), + rightarg: rightarg.to_string(), + metadata, + } +} + +#[derive(serde::Serialize)] +pub struct AggregatesContext { + pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:" + pub token: String, + pub name: String, + pub dom: String, // schema-qualified domain, hoisted + pub aggregates: &'static [AggregateOp], // == AGGREGATE_OPS +} + +/// The schema-qualified SQL domain type name, e.g. `eql_v3.int4_eq`. +/// Port of `domain_name`. +pub fn domain_name(name: &str) -> String { + format!("{DOMAIN_SCHEMA}.{name}") +} + +/// The full domain name from a token + suffix (suffix "" => bare token). +pub fn full_domain_name(token: &str, suffix: &str) -> String { + format!("{token}{suffix}") +} + +/// The extractor-call SQL for one operand, casting jsonb to the domain first. +/// Port of `_extract_arg`. `dom` is the schema-qualified domain name. +pub fn extract_arg(arg_type: &str, extractor: &str, dom: &str, arg: &str) -> String { + if arg_type == "jsonb" { + format!("{DOMAIN_SCHEMA}.{extractor}({arg}::{dom})") + } else { + format!("{DOMAIN_SCHEMA}.{extractor}({arg})") + } +} + +/// One aggregate operator definition (min or max). Only SQL-required facts: the +/// state-function name is the mechanical suffix `{{ a.name }}_sfunc` in the +/// template, and English comment phrases are template-resident. +#[derive(serde::Serialize)] +pub struct AggregateOp { + pub name: &'static str, // min / max + pub comparator: &'static str, // < / > +} + +/// The two aggregate ops in (min, max) order. Port of `AGGREGATE_OPS`. +pub const AGGREGATE_OPS: &[AggregateOp] = &[ + AggregateOp { name: "min", comparator: "<" }, + AggregateOp { name: "max", comparator: ">" }, +]; + +/// True if the domain carries a comparator term (supports `<`). +/// Port of `is_ord_capable`. +pub fn is_ord_capable(terms: &[Term]) -> bool { + Term::role_for_terms(terms) == "ord" +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn domain_name_qualifies_with_schema() { + assert_eq!(domain_name("int4_eq"), "eql_v3.int4_eq"); + } + + #[test] + fn is_ord_capable_matches_role() { + assert!(is_ord_capable(&[Term::Ore])); + assert!(!is_ord_capable(&[Term::Hm])); + assert!(!is_ord_capable(&[])); + } + + #[test] + fn normalize_trims_lines_and_drops_blanks() { + let input = " CREATE DOMAIN x\n\n CHECK (a) \n\n"; + assert_eq!(normalize_sql(input), "CREATE DOMAIN x\nCHECK (a)"); + } + + #[test] + fn normalize_preserves_intra_line_spacing() { + let input = "RAISE EXCEPTION 'operator % is not supported for %';"; + assert_eq!( + normalize_sql(input), + "RAISE EXCEPTION 'operator % is not supported for %';" + ); + } + + #[test] + fn normalize_equal_modulo_indentation_and_blank_lines() { + let a = "DO $$\nBEGIN\n IF NOT EXISTS (\n ) THEN\n END IF;\nEND\n$$;\n"; + let b = "DO $$\n\nBEGIN\n IF NOT EXISTS (\n ) THEN\nEND IF;\nEND\n$$;"; + assert_eq!(normalize_sql(a), normalize_sql(b)); + } + + #[test] + fn environment_has_four_templates() { + let env = environment(); + for name in ["types.sql", "functions.sql", "operators.sql", "aggregates.sql"] { + assert!(env.get_template(name).is_ok(), "missing template {name}"); + } + } +} diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs new file mode 100644 index 000000000..a7e1340c9 --- /dev/null +++ b/crates/eql-codegen/src/generate.rs @@ -0,0 +1,709 @@ +//! File renderers and orchestrator (port of generate.py). + +use std::path::{Path, PathBuf}; + +use eql_scalars::{DomainSpec, ScalarSpec, Term}; + +use crate::operator_surface::{ + backing_function, BLOCKER_ONLY_OPERATORS, PATH_OPERATORS, SYMMETRIC_OPERATORS, +}; +use crate::context::{domain_name, is_ord_capable}; + +/// The full domain name (token + suffix). suffix "" => bare token. +fn full_name(token: &str, suffix: &str) -> String { + format!("{token}{suffix}") +} + +/// Symmetric-operator argument shapes. Port of `_symmetric_shapes`. +fn symmetric_shapes(dom: &str) -> Vec<(String, String)> { + vec![ + (dom.to_string(), dom.to_string()), + (dom.to_string(), "jsonb".to_string()), + ("jsonb".to_string(), dom.to_string()), + ] +} + +/// Path-operator argument shapes. Port of `_path_shapes`. +fn path_shapes(dom: &str) -> Vec<(String, String)> { + vec![ + (dom.to_string(), "text".to_string()), + (dom.to_string(), "integer".to_string()), + ("jsonb".to_string(), dom.to_string()), + ] +} + +/// Blocker-only argument shapes for a native jsonb operator. +/// Port of `_blocker_only_shapes`. Returns (arg_a, arg_b, returns). +fn blocker_only_shapes(dom: &str, op: &str) -> Vec<(String, String, String)> { + let d = dom.to_string(); + match op { + "?" => vec![(d, "text".into(), "boolean".into())], + "?|" | "?&" => vec![(d, "text[]".into(), "boolean".into())], + "@?" | "@@" => vec![(d, "jsonpath".into(), "boolean".into())], + "#>" => vec![(d, "text[]".into(), "jsonb".into())], + "#>>" => vec![(d, "text[]".into(), "text".into())], + "-" => vec![ + (d.clone(), "text".into(), "jsonb".into()), + (d.clone(), "integer".into(), "jsonb".into()), + (d, "text[]".into(), "jsonb".into()), + ], + "#-" => vec![(d, "text[]".into(), "jsonb".into())], + "||" => vec![ + (d.clone(), d.clone(), "jsonb".into()), + (d.clone(), "jsonb".into(), "jsonb".into()), + ("jsonb".into(), d, "jsonb".into()), + ], + other => panic!("unhandled blocker-only operator: {other}"), + } +} + +/// REQUIRE path for a type's _types.sql. Port of `_types_path`. +fn types_path(token: &str) -> String { + format!("src/encrypted_domain/{token}/{token}_types.sql") +} + +/// Committed Rust fixture-value const path. Port of `fixture_values_rs_path`. +pub fn fixture_values_rs_path(out_root: &Path, token: &str) -> PathBuf { + out_root + .join("tests") + .join("sqlx") + .join("src") + .join("fixtures") + .join(format!("{token}_values.rs")) +} + +/// Body for _types.sql: every domain in one idempotent DO block. +/// Port of `render_types_file`. +pub fn render_types_file(spec: &ScalarSpec) -> String { + use crate::context::{domain_block, environment, TypesContext}; + let ctx = TypesContext { + token: spec.token.to_string(), + domains: spec + .domains + .iter() + .map(|d| domain_block(spec.token, d)) + .collect(), + }; + environment() + .get_template("types.sql") + .unwrap() + .render(&ctx) + .expect("render types.sql") +} + +/// REQUIRE edges for a domain's _functions.sql. Port of `_functions_requires`. +fn functions_requires(token: &str, terms: &[Term]) -> Vec { + let mut reqs = vec![ + "src/schema.sql".to_string(), + "src/schema-v3.sql".to_string(), + types_path(token), + "src/encrypted_domain/functions.sql".to_string(), + ]; + for extra in Term::term_requires(terms) { + if !reqs.iter().any(|r| r == extra) { + reqs.push(extra.to_string()); + } + } + reqs +} + +/// Distinct extractor-bearing terms (first occurrence per extractor). +/// Port of `_extractor_terms`. +fn extractor_terms(terms: &[Term]) -> Vec { + let mut seen: Vec<&str> = Vec::new(); + let mut out: Vec = Vec::new(); + for &t in terms { + if !seen.contains(&t.extractor()) { + seen.push(t.extractor()); + out.push(t); + } + } + out +} + +/// Body for a domain's _functions.sql. Port of `render_functions_file`. +pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { + use crate::consts::sql_str; + use crate::context::{ + blocker_entry, environment, extractor_entry, wrapper_entry, FunctionsContext, SqlParam, + }; + let name = full_name(token, domain.suffix); + let dom = domain_name(&name); + let domain_lit = sql_str(&dom); + let supported = Term::operators_for_terms(domain.terms); + let is_supported = |op: &str| supported.iter().any(|s| *s == op); + + let mut entries = Vec::new(); + for term in extractor_terms(domain.terms) { + entries.push(extractor_entry(term)); + } + for &op in SYMMETRIC_OPERATORS { + let extractor = Term::extractor_for_operator(domain.terms, op); + for (arg_a, arg_b) in symmetric_shapes(&dom) { + if is_supported(op) { + if let Some(ex) = extractor { + entries.push(wrapper_entry(&dom, op, &arg_a, &arg_b, ex)); + continue; + } + } + let args = [ + SqlParam { name: "a", ty: arg_a }, + SqlParam { name: "b", ty: arg_b }, + ]; + entries.push(blocker_entry(op, args, "boolean")); + } + } + for &op in PATH_OPERATORS { + for (arg_a, arg_b) in path_shapes(&dom) { + let returns = if op == "->>" { "text".to_string() } else { dom.clone() }; + let args = [ + SqlParam { name: "a", ty: arg_a }, + SqlParam { name: "selector", ty: arg_b }, + ]; + entries.push(blocker_entry(op, args, &returns)); + } + } + for &op in BLOCKER_ONLY_OPERATORS { + for (arg_a, arg_b, returns) in blocker_only_shapes(&dom, op) { + let args = [ + SqlParam { name: "a", ty: arg_a }, + SqlParam { name: "b", ty: arg_b }, + ]; + entries.push(blocker_entry(op, args, &returns)); + } + } + + let ctx = FunctionsContext { + requires: functions_requires(token, domain.terms), + token: token.to_string(), + name, + dom, + domain_lit, + entries, + }; + environment() + .get_template("functions.sql") + .unwrap() + .render(&ctx) + .expect("render functions.sql") +} + +/// Body for a domain's _operators.sql. Port of `render_operators_file`. +pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { + use crate::context::{environment, operator_entry, OperatorsContext}; + let name = full_name(token, domain.suffix); + let dom = domain_name(&name); + let supported = Term::operators_for_terms(domain.terms); + let is_supported = |op: &str| supported.iter().any(|s| *s == op); + + let mut operators = Vec::new(); + for &op in SYMMETRIC_OPERATORS { + let function_name = backing_function(op); + for (l, r) in symmetric_shapes(&dom) { + operators.push(operator_entry(op, function_name, &l, &r, is_supported(op))); + } + } + for &op in PATH_OPERATORS { + let function_name = backing_function(op); + for (l, r) in path_shapes(&dom) { + operators.push(operator_entry(op, function_name, &l, &r, false)); + } + } + for &op in BLOCKER_ONLY_OPERATORS { + let function_name = backing_function(op); + for (l, r, _ret) in blocker_only_shapes(&dom, op) { + operators.push(operator_entry(op, function_name, &l, &r, false)); + } + } + + let ctx = OperatorsContext { + requires: vec![ + "src/schema-v3.sql".to_string(), + types_path(token), + format!("src/encrypted_domain/{token}/{name}_functions.sql"), + ], + token: token.to_string(), + name, + dom, + operators, + }; + environment() + .get_template("operators.sql") + .unwrap() + .render(&ctx) + .expect("render operators.sql") +} + +/// Body for a domain's _aggregates.sql, or None if not ord-capable. +/// Port of `render_aggregates_file`. +pub fn render_aggregates_file(token: &str, domain: &DomainSpec) -> Option { + use crate::context::{environment, AggregatesContext, AGGREGATE_OPS}; + if !is_ord_capable(domain.terms) { + return None; + } + let name = full_name(token, domain.suffix); + let dom = domain_name(&name); + let ctx = AggregatesContext { + requires: vec![ + "src/schema-v3.sql".to_string(), + types_path(token), + format!("src/encrypted_domain/{token}/{name}_functions.sql"), + format!("src/encrypted_domain/{token}/{name}_operators.sql"), + ], + token: token.to_string(), + name, + dom, // hoisted: one copy, template reads {{ dom }} + aggregates: AGGREGATE_OPS, // iterate the const directly (no per-entry wrapper) + }; + Some( + environment() + .get_template("aggregates.sql") + .unwrap() + .render(&ctx) + .expect("render aggregates.sql"), + ) +} + +use crate::templates::render_fixture_values_rs; +use crate::writer::{ + clean_generated_files, ensure_generated_paths_writable, write_generated_file, + write_generated_rs, WriteError, +}; + +/// Regenerate every generated file for one type into `out_dir`. +/// Port of `generate_type`. Returns the written paths. +pub fn generate_type(spec: &ScalarSpec, out_dir: &Path) -> Result, WriteError> { + let token = spec.token; + let mut targets = vec![out_dir.join(format!("{token}_types.sql"))]; + for d in spec.domains { + let name = full_name(token, d.suffix); + targets.push(out_dir.join(format!("{name}_functions.sql"))); + targets.push(out_dir.join(format!("{name}_operators.sql"))); + if is_ord_capable(d.terms) { + targets.push(out_dir.join(format!("{name}_aggregates.sql"))); + } + } + ensure_generated_paths_writable(&targets)?; + clean_generated_files(out_dir)?; + + let mut written: Vec = Vec::new(); + + let types_path = out_dir.join(format!("{token}_types.sql")); + write_generated_file(&types_path, &render_types_file(spec))?; + written.push(types_path); + + for d in spec.domains { + let name = full_name(token, d.suffix); + let fn_path = out_dir.join(format!("{name}_functions.sql")); + write_generated_file(&fn_path, &render_functions_file(token, d))?; + written.push(fn_path); + + let op_path = out_dir.join(format!("{name}_operators.sql")); + write_generated_file(&op_path, &render_operators_file(token, d))?; + written.push(op_path); + + if let Some(agg) = render_aggregates_file(token, d) { + let agg_path = out_dir.join(format!("{name}_aggregates.sql")); + write_generated_file(&agg_path, &agg)?; + written.push(agg_path); + } + } + Ok(written) +} + +/// Generate every catalog type's SQL + committed _values.rs under `out_root`. +/// The single entry point: replaces Python's per-type and --all forms. +pub fn generate_all(out_root: &Path) -> Result { + for spec in eql_scalars::CATALOG { + let token = spec.token; + let out_dir = out_root + .join("src") + .join("encrypted_domain") + .join(token); + let mut written = generate_type(spec, &out_dir)?; + + let rs_path = fixture_values_rs_path(out_root, token); + write_generated_rs(&rs_path, &render_fixture_values_rs(spec))?; + written.push(rs_path); + + for p in &written { + let rel = p.strip_prefix(out_root).unwrap_or(p); + println!("generated {}", rel.display()); + } + println!("generated {} files for {token}", written.len()); + } + let tokens: Vec<&str> = eql_scalars::CATALOG.iter().map(|s| s.token).collect(); + println!( + "codegen: ok ({} types: {})", + tokens.len(), + tokens.join(", ") + ); + Ok(0) +} + +#[cfg(test)] +mod tests { + use super::*; + use eql_scalars::CATALOG; + + fn spec(token: &str) -> &'static ScalarSpec { + CATALOG.iter().find(|s| s.token == token).expect("catalog token") + } + + fn domain<'a>(spec: &'a ScalarSpec, suffix: &str) -> &'a DomainSpec { + spec.domains.iter().find(|d| d.suffix == suffix).expect("domain suffix") + } + + use crate::templates::render_fixture_values_rs; + use std::fs; + + fn repo_root() -> PathBuf { + // crates/eql-codegen/ -> repo root is two parents up from CARGO_MANIFEST_DIR. + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .parent() + .unwrap() + .to_path_buf() + } + + fn strip_reference_marker(text: &str) -> String { + let mut lines: Vec<&str> = text.lines().collect(); + // .lines() drops the trailing newline; re-add per line and handle the + // first marker line(s). + while !lines.is_empty() + && (lines[0].starts_with("-- REFERENCE:") || lines[0].starts_with("// REFERENCE:")) + { + lines.remove(0); + } + let mut out = lines.join("\n"); + if text.ends_with('\n') { + out.push('\n'); + } + out + } + + fn rendered_for(token: &str, name: &str, spec: &ScalarSpec) -> String { + if name == format!("{token}_types.sql") { + return render_types_file(spec); + } + for d in spec.domains { + let full = full_name(token, d.suffix); + if name == format!("{full}_functions.sql") { + return render_functions_file(token, d); + } + if name == format!("{full}_operators.sql") { + return render_operators_file(token, d); + } + if name == format!("{full}_aggregates.sql") { + return render_aggregates_file(token, d) + .expect("reference exists but generator skipped (not ord-capable)"); + } + } + panic!("unrecognised reference filename: {name}"); + } + + #[test] + fn types_file_normalized_matches_golden() { + use crate::context::normalize_sql; + let root = repo_root(); + let path = root.join("tests/codegen/reference/int4/int4_types.sql"); + let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); + let actual = render_types_file(spec("int4")); + assert_eq!(normalize_sql(&actual), normalize_sql(&expected)); + } + + #[test] + fn functions_files_normalized_match_golden() { + use crate::context::normalize_sql; + let root = repo_root(); + let s = spec("int4"); + for d in s.domains { + let full = full_name("int4", d.suffix); + let path = root.join(format!("tests/codegen/reference/int4/{full}_functions.sql")); + let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); + let actual = render_functions_file("int4", d); + assert_eq!( + normalize_sql(&actual), + normalize_sql(&expected), + "{full}_functions.sql diverged" + ); + } + } + + #[test] + fn operators_files_normalized_match_golden() { + use crate::context::normalize_sql; + let root = repo_root(); + let s = spec("int4"); + for d in s.domains { + let full = full_name("int4", d.suffix); + let path = root.join(format!("tests/codegen/reference/int4/{full}_operators.sql")); + let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); + let actual = render_operators_file("int4", d); + assert_eq!(normalize_sql(&actual), normalize_sql(&expected), "{full}_operators.sql"); + } + } + + #[test] + fn aggregates_files_normalized_match_golden() { + use crate::context::normalize_sql; + let root = repo_root(); + let s = spec("int4"); + for d in s.domains { + if let Some(actual) = render_aggregates_file("int4", d) { + let full = full_name("int4", d.suffix); + let path = root.join(format!("tests/codegen/reference/int4/{full}_aggregates.sql")); + let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); + assert_eq!(normalize_sql(&actual), normalize_sql(&expected), "{full}_aggregates.sql"); + } + } + } + + #[test] + fn generator_matches_int4_reference_golden() { + let root = repo_root(); + let ref_dir = root.join("tests/codegen/reference/int4"); + let s = spec("int4"); + let mut checked = 0; + for entry in fs::read_dir(&ref_dir).expect("reference dir") { + let path = entry.unwrap().path(); + if path.extension().and_then(|e| e.to_str()) != Some("sql") { + continue; + } + let name = path.file_name().unwrap().to_str().unwrap().to_string(); + use crate::context::normalize_sql; + let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); + let actual = rendered_for("int4", &name, s); + assert_eq!( + normalize_sql(&actual), + normalize_sql(&expected), + "{name}: generator diverged from golden reference (normalized)" + ); + checked += 1; + } + assert!(checked >= 11, "expected >=11 reference SQL files, checked {checked}"); + } + + #[test] + fn generator_matches_int4_values_rs_reference() { + let root = repo_root(); + let path = root.join("tests/codegen/reference/int4/int4_values.rs"); + let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); + let actual = render_fixture_values_rs(spec("int4")); + assert_eq!(actual, expected, "int4_values.rs: generator diverged from golden reference"); + } + + #[test] + fn generate_type_writes_expected_files() { + let d = crate::writer::test_support::tempdir(); + let s = spec("int4"); + let out = d.path().join("int4"); + let written = generate_type(s, &out).unwrap(); + let names: Vec = written + .iter() + .map(|p| p.file_name().unwrap().to_str().unwrap().to_string()) + .collect(); + assert!(names.contains(&"int4_types.sql".to_string())); + for dom in ["int4", "int4_eq", "int4_ord_ore", "int4_ord"] { + assert!(names.contains(&format!("{dom}_functions.sql"))); + assert!(names.contains(&format!("{dom}_operators.sql"))); + } + assert!(!names.contains(&"int4_aggregates.sql".to_string())); + assert!(!names.contains(&"int4_eq_aggregates.sql".to_string())); + assert!(names.contains(&"int4_ord_ore_aggregates.sql".to_string())); + assert!(names.contains(&"int4_ord_aggregates.sql".to_string())); + assert_eq!(written.len(), 11); + for p in &written { + assert!(fs::read_to_string(p).unwrap().starts_with(crate::consts::AUTO_GENERATED_HEADER)); + } + } + + #[test] + fn types_file_has_all_four_domains() { + let sql = render_types_file(spec("int4")); + assert!(sql.contains("-- REQUIRE: src/schema-v3.sql")); + for dom in ["int4", "int4_eq", "int4_ord_ore", "int4_ord"] { + assert!(sql.contains(&format!("CREATE DOMAIN eql_v3.{dom} AS jsonb")), "missing {dom}"); + } + } + + #[test] + fn storage_functions_file_is_all_blockers() { + let s = spec("int4"); + let sql = render_functions_file(s.token, domain(s, "")); + assert_eq!(sql.matches("CREATE FUNCTION").count(), 44); + assert!(!sql.contains("SET search_path")); + assert_eq!(sql.matches("LANGUAGE plpgsql").count(), 44); + assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 0); + } + + #[test] + fn eq_functions_file_counts() { + let s = spec("int4"); + let sql = render_functions_file(s.token, domain(s, "_eq")); + assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); + assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)")); + assert!(sql.contains("RETURNS eql_v2.hmac_256")); + assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 7); + assert_eq!(sql.matches("LANGUAGE plpgsql").count(), 38); + assert!(!sql.contains("SET search_path")); + } + + #[test] + fn ore_functions_file_counts() { + let s = spec("int4"); + let sql = render_functions_file(s.token, domain(s, "_ord")); + assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); + assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)")); + assert!(sql.contains("RETURNS eql_v2.ore_block_u64_8_256")); + assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 19); + assert_eq!(sql.matches("LANGUAGE plpgsql").count(), 26); + } + + #[test] + fn operators_file_has_forty_four() { + let s = spec("int4"); + let sql = render_operators_file(s.token, domain(s, "_eq")); + assert_eq!(sql.matches("CREATE OPERATOR").count(), 44); + } + + #[test] + fn aggregates_file_only_for_ord_variants() { + let s = spec("int4"); + assert!(render_aggregates_file(s.token, domain(s, "")).is_none()); + assert!(render_aggregates_file(s.token, domain(s, "_eq")).is_none()); + assert!(render_aggregates_file(s.token, domain(s, "_ord")).is_some()); + assert!(render_aggregates_file(s.token, domain(s, "_ord_ore")).is_some()); + } + + #[test] + fn aggregates_file_carries_min_and_max_and_requires() { + let s = spec("int4"); + let sql = render_aggregates_file(s.token, domain(s, "_ord")).unwrap(); + assert_eq!(sql.matches("CREATE FUNCTION").count(), 2); + assert_eq!(sql.matches("CREATE AGGREGATE").count(), 2); + assert!(sql.contains("eql_v3.min_sfunc")); + assert!(sql.contains("eql_v3.max_sfunc")); + assert!(sql.contains("-- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql")); + assert!(sql.contains("-- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql")); + assert!(sql.contains("-- REQUIRE: src/encrypted_domain/int4/int4_types.sql")); + } + + #[test] + fn ordered_files_byte_identical_modulo_typename() { + let s = spec("int4"); + let ord = domain(s, "_ord"); + let ore = domain(s, "_ord_ore"); + let norm = |sql: String| sql.replace("int4_ord_ore", "T").replace("int4_ord", "T"); + assert_eq!(norm(render_functions_file(s.token, ord)), norm(render_functions_file(s.token, ore))); + assert_eq!(norm(render_operators_file(s.token, ord)), norm(render_operators_file(s.token, ore))); + assert_eq!( + norm(render_aggregates_file(s.token, ord).unwrap()), + norm(render_aggregates_file(s.token, ore).unwrap()) + ); + } + + // --- Coarsened footgun invariant guards (whole-file scans) --- + + #[test] + fn blockers_are_never_strict_and_always_plpgsql() { + let s = spec("int4"); + // Storage domain functions file is all blockers. + let sql = render_functions_file("int4", domain(s, "")); + // Every CREATE FUNCTION here is a blocker: none may be STRICT, all plpgsql. + assert!(!sql.contains("STRICT"), "blocker marked STRICT"); + assert_eq!( + sql.matches("CREATE FUNCTION").count(), + sql.matches("LANGUAGE plpgsql").count(), + "every blocker must be LANGUAGE plpgsql" + ); + } + + #[test] + fn inlinable_functions_have_no_set_search_path() { + let s = spec("int4"); + // Extractors and wrappers (eq/ord functions files) are inlinable SQL. + for suffix in ["_eq", "_ord"] { + let sql = render_functions_file("int4", domain(s, suffix)); + // Inlinable rows are the LANGUAGE sql ones; none may pin search_path. + for block in sql.split("CREATE FUNCTION").skip(1) { + if block.contains("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") { + assert!( + !block.contains("SET search_path"), + "inlinable SQL function pins search_path" + ); + } + } + } + } + + #[test] + fn aggregate_state_functions_are_plpgsql_not_inlinable() { + let s = spec("int4"); + let sql = render_aggregates_file("int4", domain(s, "_ord")).unwrap(); + assert_eq!(sql.matches("CREATE FUNCTION").count(), 2); + assert_eq!(sql.matches("LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE").count(), 2); + assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 0); + } + + #[test] + fn generated_function_like_docs_keep_required_tags() { + let s = spec("int4"); + for d in s.domains { + let sql = render_functions_file("int4", d); + let functions = sql.matches("CREATE FUNCTION").count(); + assert_eq!(sql.matches("--! @return").count(), functions); + assert!( + sql.matches("--! @param").count() >= functions, + "each generated function must keep at least one @param tag" + ); + assert!( + sql.matches("--! @brief").count() >= functions, + "each generated function must keep @brief" + ); + } + + let sql = render_aggregates_file("int4", domain(s, "_ord")).unwrap(); + let function_like = + sql.matches("CREATE FUNCTION").count() + sql.matches("CREATE AGGREGATE").count(); + assert_eq!(sql.matches("--! @return").count(), function_like); + assert!(sql.matches("--! @param").count() >= function_like); + assert!(sql.matches("--! @brief").count() >= function_like); + } + + // --- Escaping guards over the context builders (synthetic inputs) --- + + #[test] + fn blocker_entry_preserves_operator_literal_and_domain_lit_is_escaped() { + use crate::consts::sql_str; + use crate::context::{blocker_entry, FnEntry, SqlParam}; + let dom = "eql_v3.o'dom"; + let domain_lit = sql_str(dom); + let entry = blocker_entry( + "<", + [ + SqlParam { name: "a", ty: dom.into() }, + SqlParam { name: "b", ty: dom.into() }, + ], + "boolean", + ); + match entry { + FnEntry::Blocker { operator_lit, .. } => { + assert_eq!(domain_lit, "eql_v3.o''dom"); // quote doubled by sql_str + assert_eq!(operator_lit, "<"); + } + _ => panic!("expected blocker"), + } + } + + #[test] + fn domain_block_escapes_quote_bearing_name() { + use crate::context::domain_block; + use eql_scalars::DomainSpec; + let block = domain_block("int4", &DomainSpec { suffix: "_q", terms: &[] }); + assert_eq!(block.typname, "int4_q"); // no quote present → unchanged + // keys are sql_str-escaped key tokens; none should carry a bare unescaped quote. + assert!(block.keys.iter().all(|k| !k.contains("o'"))); + } +} diff --git a/crates/eql-codegen/src/lib.rs b/crates/eql-codegen/src/lib.rs new file mode 100644 index 000000000..ebde05bf7 --- /dev/null +++ b/crates/eql-codegen/src/lib.rs @@ -0,0 +1,11 @@ +//! Scalar encrypted-domain SQL generator. Renders the `eql-scalars` catalog to +//! the gitignored SQL surface and the committed `_values.rs` consts. The SQL +//! surface is validated against the `tests/codegen/reference/int4` golden under +//! line-normalized comparison; `_values.rs` is validated byte-exact. + +pub mod consts; +pub mod context; +pub mod generate; +pub mod operator_surface; +pub mod templates; +pub mod writer; diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index e51f0ccfe..6e88340e4 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -1,2 +1,44 @@ -//! Stub entry point. Plan 2 replaces this with the catalog-driven SQL generator. -fn main() {} +use std::path::PathBuf; +use std::process::ExitCode; + +use eql_codegen::generate::generate_all; + +fn repo_root() -> PathBuf { + // The binary runs from the repo root via `cargo run`; CARGO_MANIFEST_DIR + // points at crates/eql-codegen, so the repo root is two parents up. + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .parent() + .unwrap() + .to_path_buf() +} + +fn main() -> ExitCode { + let args: Vec = std::env::args().collect(); + + // `list-types`: print catalog tokens, one per line. Consumed by Plan 3's + // fixtures-all and matrix-inventory enumeration. + if args.len() == 2 && args[1] == "list-types" { + for spec in eql_scalars::CATALOG { + println!("{}", spec.token); + } + return ExitCode::SUCCESS; + } + + if args.len() == 1 { + // No args: generate every type's SQL + _values.rs. + match generate_all(&repo_root()) { + Ok(0) => return ExitCode::SUCCESS, + Ok(code) => return ExitCode::from(code.clamp(0, 255) as u8), + Err(e) => { + eprintln!("error: {e}"); + return ExitCode::from(1); + } + } + } + + eprintln!("Usage: eql-codegen (generate all types)"); + eprintln!(" eql-codegen list-types (print catalog tokens)"); + ExitCode::from(2) +} diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs new file mode 100644 index 000000000..eace7e067 --- /dev/null +++ b/crates/eql-codegen/src/operator_surface.rs @@ -0,0 +1,149 @@ +//! The generated operator surface (port of operator_surface.py). + +/// One operator in the generated surface. +#[derive(Clone, Copy)] +pub struct Operator { + pub symbol: &'static str, + pub backing: &'static str, + pub kind: Kind, + pub restrict: Option<&'static str>, + pub join: Option<&'static str>, + pub commutator: Option<&'static str>, + pub negator: Option<&'static str>, +} + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Kind { + Symmetric, + Path, + BlockerOnly, +} + +pub const SYMMETRIC_OPERATORS: &[&str] = &["=", "<>", "<", "<=", ">", ">=", "@>", "<@"]; +pub const PATH_OPERATORS: &[&str] = &["->", "->>"]; +pub const BLOCKER_ONLY_OPERATORS: &[&str] = + &["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"]; + +/// Look up the operator metadata for a symbol. Panics on an unknown symbol — +/// the generator only ever passes catalog symbols, matching Python's KeyError. +pub fn operator(symbol: &str) -> Operator { + OPERATORS + .iter() + .copied() + .find(|o| o.symbol == symbol) + .unwrap_or_else(|| panic!("unknown operator symbol: {symbol}")) +} + +/// The eql_v2 backing function name for an operator symbol. +pub fn backing_function(symbol: &str) -> &'static str { + operator(symbol).backing +} + +/// The 20-operator table. Order matches the SYMMETRIC/PATH/BLOCKER_ONLY lists. +pub const OPERATORS: &[Operator] = &[ + Operator { symbol: "=", backing: "eq", kind: Kind::Symmetric, restrict: Some("eqsel"), join: Some("eqjoinsel"), commutator: Some("="), negator: Some("<>") }, + Operator { symbol: "<>", backing: "neq", kind: Kind::Symmetric, restrict: Some("neqsel"), join: Some("neqjoinsel"), commutator: Some("<>"), negator: Some("=") }, + Operator { symbol: "<", backing: "lt", kind: Kind::Symmetric, restrict: Some("scalarltsel"), join: Some("scalarltjoinsel"), commutator: Some(">"), negator: Some(">=") }, + Operator { symbol: "<=", backing: "lte", kind: Kind::Symmetric, restrict: Some("scalarlesel"), join: Some("scalarlejoinsel"), commutator: Some(">="), negator: Some(">") }, + Operator { symbol: ">", backing: "gt", kind: Kind::Symmetric, restrict: Some("scalargtsel"), join: Some("scalargtjoinsel"), commutator: Some("<"), negator: Some("<=") }, + Operator { symbol: ">=", backing: "gte", kind: Kind::Symmetric, restrict: Some("scalargesel"), join: Some("scalargejoinsel"), commutator: Some("<="), negator: Some("<") }, + Operator { symbol: "@>", backing: "contains", kind: Kind::Symmetric, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "<@", backing: "contained_by", kind: Kind::Symmetric, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "->", backing: "\"->\"", kind: Kind::Path, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "->>", backing: "\"->>\"", kind: Kind::Path, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "?", backing: "\"?\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "?|", backing: "\"?|\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "?&", backing: "\"?&\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "@?", backing: "\"@?\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "@@", backing: "\"@@\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "#>", backing: "\"#>\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "#>>", backing: "\"#>>\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "-", backing: "\"-\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "#-", backing: "\"#-\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { symbol: "||", backing: "\"||\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, +]; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn twenty_operators_total() { + assert_eq!(OPERATORS.len(), 20); + } + + #[test] + fn operator_lists_match() { + assert_eq!(SYMMETRIC_OPERATORS, &["=", "<>", "<", "<=", ">", ">=", "@>", "<@"]); + assert_eq!(PATH_OPERATORS, &["->", "->>"]); + assert_eq!( + BLOCKER_ONLY_OPERATORS, + &["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"] + ); + } + + #[test] + fn no_like_operators() { + assert!(OPERATORS.iter().all(|o| o.symbol != "~~" && o.symbol != "~~*")); + } + + #[test] + fn backing_function_names() { + assert_eq!(backing_function("="), "eq"); + assert_eq!(backing_function("<>"), "neq"); + assert_eq!(backing_function("<"), "lt"); + assert_eq!(backing_function("<="), "lte"); + assert_eq!(backing_function(">"), "gt"); + assert_eq!(backing_function(">="), "gte"); + assert_eq!(backing_function("@>"), "contains"); + assert_eq!(backing_function("<@"), "contained_by"); + assert_eq!(backing_function("->"), "\"->\""); + assert_eq!(backing_function("->>"), "\"->>\""); + assert_eq!(backing_function("?"), "\"?\""); + assert_eq!(backing_function("?|"), "\"?|\""); + assert_eq!(backing_function("?&"), "\"?&\""); + assert_eq!(backing_function("@?"), "\"@?\""); + assert_eq!(backing_function("@@"), "\"@@\""); + assert_eq!(backing_function("#>"), "\"#>\""); + assert_eq!(backing_function("#>>"), "\"#>>\""); + assert_eq!(backing_function("-"), "\"-\""); + assert_eq!(backing_function("#-"), "\"#-\""); + assert_eq!(backing_function("||"), "\"||\""); + } + + #[test] + fn selectivity_estimators() { + assert_eq!(operator("=").restrict, Some("eqsel")); + assert_eq!(operator("=").join, Some("eqjoinsel")); + assert_eq!(operator("<>").restrict, Some("neqsel")); + assert_eq!(operator("<").restrict, Some("scalarltsel")); + assert_eq!(operator("<=").restrict, Some("scalarlesel")); + assert_eq!(operator(">").restrict, Some("scalargtsel")); + assert_eq!(operator(">=").restrict, Some("scalargesel")); + } + + #[test] + fn negators_and_commutators() { + assert_eq!(operator("=").negator, Some("<>")); + assert_eq!(operator("<>").negator, Some("=")); + assert_eq!(operator("<").commutator, Some(">")); + assert_eq!(operator("<").negator, Some(">=")); + assert_eq!(operator(">=").commutator, Some("<=")); + } + + #[test] + fn known_jsonb_operators_match_table_keys() { + let union: Vec<&str> = SYMMETRIC_OPERATORS + .iter() + .chain(PATH_OPERATORS) + .chain(BLOCKER_ONLY_OPERATORS) + .copied() + .collect(); + let keys: Vec<&str> = OPERATORS.iter().map(|o| o.symbol).collect(); + assert_eq!(union, keys); + assert_eq!( + union.len(), + SYMMETRIC_OPERATORS.len() + PATH_OPERATORS.len() + BLOCKER_ONLY_OPERATORS.len() + ); + } +} diff --git a/crates/eql-codegen/src/templates.rs b/crates/eql-codegen/src/templates.rs new file mode 100644 index 000000000..df4e30658 --- /dev/null +++ b/crates/eql-codegen/src/templates.rs @@ -0,0 +1,72 @@ +//! Rust fixture-const renderer. The SQL surface is rendered from minijinja +//! templates (see `context.rs`); this file emits only the committed +//! `_values.rs` consts, which stay byte-exact. + +use eql_scalars::ScalarSpec; + +/// Body for tests/sqlx/src/fixtures/_values.rs. The writer prepends the +/// AUTO-GENERATED Rust header, so the body carries none. +/// Port of templates.py `render_fixture_values_rs`. +pub fn render_fixture_values_rs(spec: &ScalarSpec) -> String { + let token = spec.token; + let rust_type = spec.kind.rust_type(); + let mut literals = String::new(); + for &f in spec.fixtures { + literals.push_str(&format!(" {},\n", f.render_literal(spec.kind))); + } + format!( + "//! Fixture plaintext values for the {token} encrypted-domain family.\n\ + //!\n\ + //! Generated from tasks/codegen/types/{token}.toml `[fixture] values` —\n\ + //! the single source of truth shared by the fixture generator\n\ + //! (`fixtures::eql_v2_{token}`) and the matrix oracle\n\ + //! (`ScalarType::FIXTURE_VALUES`).\n\n\ + /// Distinct plaintext values present in the `eql_v2_{token}` fixture.\n\ + pub const VALUES: &[{rust_type}] = &[\n\ + {literals}\ + ];\n" + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use eql_scalars::CATALOG; + + fn spec(token: &str) -> &'static ScalarSpec { + CATALOG.iter().find(|s| s.token == token).expect("catalog token") + } + + #[test] + fn fixture_values_rs_emits_typed_const_for_int4() { + let body = render_fixture_values_rs(spec("int4")); + assert!(body.contains("pub const VALUES: &[i32] = &[")); + assert!(body.contains("tasks/codegen/types/int4.toml")); + assert!(body.contains(" i32::MIN,\n")); + assert!(body.contains(" i32::MAX,\n")); + assert!(body.contains(" -1,\n")); + assert!(body.contains(" 0,\n")); + assert!(body.contains(" 1,\n")); + assert!(!body.contains("AUTO-GENERATED")); + } + + #[test] + fn fixture_values_rs_preserves_catalog_order() { + let body = render_fixture_values_rs(spec("int4")); + let min = body.find("i32::MIN").unwrap(); + let zero = body.find(" 0,").unwrap(); + let max = body.find("i32::MAX").unwrap(); + assert!(min < zero && zero < max); + } + + // Adapted from the plan's `fixture_values_rs_int8_uses_i64`: the shipped + // CATALOG has no int8 (deliberately reserved for a later branch), so this + // exercises the second committed non-i32 type — int2 (i16). + #[test] + fn fixture_values_rs_int2_uses_i16() { + let body = render_fixture_values_rs(spec("int2")); + assert!(body.contains("pub const VALUES: &[i16] = &[")); + assert!(body.contains(" i16::MIN,\n")); + assert!(body.contains(" -30000,\n")); + } +} diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs new file mode 100644 index 000000000..172c336de --- /dev/null +++ b/crates/eql-codegen/src/writer.rs @@ -0,0 +1,291 @@ +//! Ownership-guarded file writer (port of writer.py). + +use std::fs; +use std::io; +use std::path::{Path, PathBuf}; + +use crate::consts::{AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS}; + +/// First line of the SQL header — the ownership marker. +fn sql_marker() -> &'static str { + AUTO_GENERATED_HEADER.lines().next().unwrap() +} + +/// First line of the Rust header — the ownership marker. +fn rs_marker() -> &'static str { + AUTO_GENERATED_HEADER_RS.lines().next().unwrap() +} + +/// Raised when the generator would clobber a hand-written file. +#[derive(Debug)] +pub enum WriteError { + Ownership(String), + Io(io::Error), +} + +impl From for WriteError { + fn from(e: io::Error) -> Self { + WriteError::Io(e) + } +} + +impl std::fmt::Display for WriteError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + WriteError::Ownership(m) => write!(f, "{m}"), + WriteError::Io(e) => write!(f, "io error: {e}"), + } + } +} + +fn first_line(path: &Path) -> io::Result { + let content = fs::read_to_string(path)?; + Ok(content + .lines() + .next() + .unwrap_or("") + .trim_end_matches(['\r', '\n']) + .to_string()) +} + +/// True if the file carries the SQL AUTO-GENERATED marker. Port of `is_generated`. +pub fn is_generated(path: &Path) -> bool { + path.is_file() && first_line(path).map(|l| l == sql_marker()).unwrap_or(false) +} + +/// True if the file carries the Rust AUTO-GENERATED marker. Port of `is_generated_rs`. +pub fn is_generated_rs(path: &Path) -> bool { + path.is_file() && first_line(path).map(|l| l == rs_marker()).unwrap_or(false) +} + +/// Delete every generated .sql file in `directory`, returning removed paths. +/// Port of `clean_generated_files`. +pub fn clean_generated_files(directory: &Path) -> io::Result> { + if !directory.is_dir() { + return Ok(Vec::new()); + } + let mut paths: Vec = fs::read_dir(directory)? + .filter_map(|e| e.ok().map(|e| e.path())) + .filter(|p| p.extension().and_then(|x| x.to_str()) == Some("sql")) + .collect(); + paths.sort(); + let mut removed = Vec::new(); + for p in paths { + if is_generated(&p) { + fs::remove_file(&p)?; + removed.push(p); + } + } + Ok(removed) +} + +/// Refuse a generation run if any target is hand-written. Port of +/// `ensure_generated_paths_writable`. +pub fn ensure_generated_paths_writable(paths: &[PathBuf]) -> Result<(), WriteError> { + for path in paths { + if path.exists() && !is_generated(path) { + return Err(WriteError::Ownership(format!( + "refusing to overwrite hand-written file: {} (no AUTO-GENERATED header). \ + Remove it by hand if it is a one-time generator-adoption target.", + path.display() + ))); + } + } + Ok(()) +} + +/// Write the rendered SQL `body` to `path`, after refusing to clobber a +/// hand-written file. The SQL templates emit the `-- AUTOMATICALLY GENERATED +/// FILE.` marker as their own first line, so the writer writes `body` verbatim +/// — it does not prepend a header. +pub fn write_generated_file(path: &Path, body: &str) -> Result<(), WriteError> { + ensure_generated_paths_writable(std::slice::from_ref(&path.to_path_buf()))?; + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + fs::write(path, body)?; + Ok(()) +} + +/// Write `body` to a Rust file prefixed with the Rust header. Port of `write_generated_rs`. +pub fn write_generated_rs(path: &Path, body: &str) -> Result<(), WriteError> { + if path.exists() && !is_generated_rs(path) { + return Err(WriteError::Ownership(format!( + "refusing to overwrite hand-written file: {} (no AUTO-GENERATED header).", + path.display() + ))); + } + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + fs::write(path, format!("{AUTO_GENERATED_HEADER_RS}{body}"))?; + Ok(()) +} + +#[cfg(test)] +pub(crate) mod test_support { + use std::fs; + use std::path::{Path, PathBuf}; + + pub struct TempDir(PathBuf); + impl TempDir { + pub fn path(&self) -> &Path { &self.0 } + } + impl Drop for TempDir { + fn drop(&mut self) { let _ = fs::remove_dir_all(&self.0); } + } + pub fn tempdir() -> TempDir { + let mut p = std::env::temp_dir(); + let nanos = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH).unwrap().as_nanos(); + p.push(format!("eql-codegen-test-{nanos}-{:?}", std::thread::current().id())); + fs::create_dir_all(&p).unwrap(); + TempDir(p) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::test_support::tempdir as tmp; + + #[test] + fn is_generated_true_for_header() { + let d = tmp(); + let p = d.path().join("x.sql"); + fs::write(&p, format!("{AUTO_GENERATED_HEADER}SELECT 1;\n")).unwrap(); + assert!(is_generated(&p)); + } + + #[test] + fn is_generated_false_for_handwritten() { + let d = tmp(); + let p = d.path().join("x.sql"); + fs::write(&p, "-- REQUIRE: src/schema.sql\nSELECT 1;\n").unwrap(); + assert!(!is_generated(&p)); + } + + #[test] + fn is_generated_true_for_crlf_header() { + let d = tmp(); + let p = d.path().join("x.sql"); + let marker = sql_marker(); + fs::write(&p, format!("{marker}\r\nSELECT 1;\n")).unwrap(); + assert!(is_generated(&p)); + } + + #[test] + fn write_generated_file_writes_rendered_body_verbatim() { + let d = tmp(); + let p = d.path().join("int4_types.sql"); + // The template render carries the marker on line 1; the writer writes it + // through unchanged. + let body = format!("{AUTO_GENERATED_HEADER}DO $$ BEGIN END $$;\n"); + write_generated_file(&p, &body).unwrap(); + let text = fs::read_to_string(&p).unwrap(); + assert_eq!(text, body); + assert!(is_generated(&p)); + } + + #[test] + fn write_refuses_to_overwrite_handwritten() { + let d = tmp(); + let p = d.path().join("int4_types.sql"); + fs::write(&p, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); + let err = write_generated_file(&p, "DO $$ BEGIN END $$;\n").unwrap_err(); + assert!(matches!(err, WriteError::Ownership(_))); + assert!(err.to_string().contains("hand-written")); + } + + #[test] + fn preflight_refuses_handwritten_target() { + let d = tmp(); + let generated = d.path().join("int4_types.sql"); + let hand = d.path().join("int4_eq_functions.sql"); + fs::write(&generated, format!("{AUTO_GENERATED_HEADER}-- old generated\n")).unwrap(); + fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); + let err = ensure_generated_paths_writable(&[generated.clone(), hand.clone()]).unwrap_err(); + assert!(err.to_string().contains("int4_eq_functions.sql")); + assert!(generated.exists()); + assert!(hand.exists()); + } + + #[test] + fn write_overwrites_existing_generated_file() { + let d = tmp(); + let p = d.path().join("int4_types.sql"); + fs::write(&p, format!("{AUTO_GENERATED_HEADER}-- old content\n")).unwrap(); + write_generated_file(&p, &format!("{AUTO_GENERATED_HEADER}-- new content\n")).unwrap(); + let text = fs::read_to_string(&p).unwrap(); + assert!(text.contains("-- new content")); + assert!(!text.contains("-- old content")); + } + + #[test] + fn clean_removes_only_generated_files() { + let d = tmp(); + let gen1 = d.path().join("int4_eq_functions.sql"); + let gen2 = d.path().join("int4_old_domain_functions.sql"); + let hand = d.path().join("int4_jsonb_extra.sql"); + fs::write(&gen1, format!("{AUTO_GENERATED_HEADER}SELECT 1;\n")).unwrap(); + fs::write(&gen2, format!("{AUTO_GENERATED_HEADER}SELECT 2;\n")).unwrap(); + fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); + let removed = clean_generated_files(d.path()).unwrap(); + assert!(!gen1.exists()); + assert!(!gen2.exists()); + assert!(hand.exists()); + assert_eq!(removed.len(), 2); + } + + #[test] + fn clean_on_empty_directory() { + let d = tmp(); + assert!(clean_generated_files(d.path()).unwrap().is_empty()); + } + + #[test] + fn write_generated_rs_creates_with_rust_header() { + let d = tmp(); + let p = d.path().join("int4_values.rs"); + write_generated_rs(&p, "pub const VALUES: &[i32] = &[];\n").unwrap(); + let text = fs::read_to_string(&p).unwrap(); + assert!(text.starts_with(AUTO_GENERATED_HEADER_RS)); + assert!(text.contains("pub const VALUES")); + } + + #[test] + fn is_generated_rs_true_for_rust_header() { + let d = tmp(); + let p = d.path().join("int4_values.rs"); + fs::write(&p, format!("{AUTO_GENERATED_HEADER_RS}pub const VALUES: &[i32] = &[];\n")).unwrap(); + assert!(is_generated_rs(&p)); + } + + #[test] + fn is_generated_rs_false_for_handwritten() { + let d = tmp(); + let p = d.path().join("int4_values.rs"); + fs::write(&p, "//! hand-written\npub const VALUES: &[i32] = &[];\n").unwrap(); + assert!(!is_generated_rs(&p)); + } + + #[test] + fn write_generated_rs_refuses_handwritten() { + let d = tmp(); + let p = d.path().join("int4_values.rs"); + fs::write(&p, "//! hand-written\n").unwrap(); + let err = write_generated_rs(&p, "pub const VALUES: &[i32] = &[];\n").unwrap_err(); + assert!(err.to_string().contains("hand-written")); + } + + #[test] + fn write_generated_rs_overwrites_existing_generated() { + let d = tmp(); + let p = d.path().join("int4_values.rs"); + fs::write(&p, format!("{AUTO_GENERATED_HEADER_RS}// old\n")).unwrap(); + write_generated_rs(&p, "// new\n").unwrap(); + let text = fs::read_to_string(&p).unwrap(); + assert!(text.contains("// new")); + assert!(!text.contains("// old")); + } +} diff --git a/crates/eql-codegen/templates/aggregates.sql.j2 b/crates/eql-codegen/templates/aggregates.sql.j2 new file mode 100644 index 000000000..9660917d7 --- /dev/null +++ b/crates/eql-codegen/templates/aggregates.sql.j2 @@ -0,0 +1,34 @@ +-- AUTOMATICALLY GENERATED FILE. +{% for r in requires -%} +-- REQUIRE: {{ r }} +{% endfor %} +--! @file encrypted_domain/{{ token }}/{{ name }}_aggregates.sql +--! @brief Aggregates for {{ dom }}. +{% for a in aggregates %} +--! @brief State function for {{ a.name }} on {{ dom }}. +--! @param state {{ dom }} +--! @param value {{ dom }} +--! @return {{ dom }} +CREATE FUNCTION {{ domain_schema }}.{{ a.name }}_sfunc(state {{ dom }}, value {{ dom }}) +RETURNS {{ dom }} +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value {{ a.comparator }} state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief {{ a.name }} aggregate for {{ dom }}. +--! @param input {{ dom }} +--! @return {{ dom }} +CREATE AGGREGATE {{ domain_schema }}.{{ a.name }}({{ dom }}) ( + sfunc = {{ domain_schema }}.{{ a.name }}_sfunc, + stype = {{ dom }}, + combinefunc = {{ domain_schema }}.{{ a.name }}_sfunc, + parallel = safe +); +{% endfor -%} diff --git a/crates/eql-codegen/templates/functions.sql.j2 b/crates/eql-codegen/templates/functions.sql.j2 new file mode 100644 index 000000000..0b75cd3ab --- /dev/null +++ b/crates/eql-codegen/templates/functions.sql.j2 @@ -0,0 +1,34 @@ +-- AUTOMATICALLY GENERATED FILE. +{% for r in requires -%} +-- REQUIRE: {{ r }} +{% endfor %} +--! @file encrypted_domain/{{ token }}/{{ name }}_functions.sql +--! @brief Functions for {{ dom }}. +{% for e in entries %} +{% if e.kind == "Extractor" -%} +--! @brief Index extractor for {{ dom }}. +--! @param a {{ dom }} +--! @return {{ e.ret }} +CREATE FUNCTION {{ domain_schema }}.{{ e.extractor }}(a {{ dom }}) +RETURNS {{ e.ret }} +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT {{ core_schema }}.{{ e.ctor }}(a::jsonb) $$; +{% elif e.kind == "Wrapper" -%} +--! @brief Operator wrapper for {{ dom }}. +--! @param {{ e.args[0].name }} {{ e.args[0].ty }} +--! @param {{ e.args[1].name }} {{ e.args[1].ty }} +--! @return boolean +CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT {{ e.call_a }} {{ e.op }} {{ e.call_b }} $$; +{% else -%} +--! @brief Unsupported operator blocker for {{ dom }}. +--! @param {{ e.args[0].name }} {{ e.args[0].ty }} +--! @param {{ e.args[1].name }} {{ e.args[1].ty }} +--! @return {{ e.returns }} +CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) +RETURNS {{ e.returns }} IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '{{ e.operator_lit }}', '{{ domain_lit }}'; END; $$ +LANGUAGE plpgsql; +{% endif -%} +{% endfor -%} diff --git a/crates/eql-codegen/templates/operators.sql.j2 b/crates/eql-codegen/templates/operators.sql.j2 new file mode 100644 index 000000000..1dc1360cd --- /dev/null +++ b/crates/eql-codegen/templates/operators.sql.j2 @@ -0,0 +1,13 @@ +-- AUTOMATICALLY GENERATED FILE. +{% for r in requires -%} +-- REQUIRE: {{ r }} +{% endfor %} +--! @file encrypted_domain/{{ token }}/{{ name }}_operators.sql +--! @brief Operators for {{ dom }}. +{% for o in operators %} +CREATE OPERATOR {{ o.symbol }} ( + FUNCTION = {{ domain_schema }}.{{ o.function_name }}, + LEFTARG = {{ o.leftarg }}, RIGHTARG = {{ o.rightarg }}{% if o.metadata %}, + {{ o.metadata }}{% endif %} +); +{% endfor -%} diff --git a/crates/eql-codegen/templates/types.sql.j2 b/crates/eql-codegen/templates/types.sql.j2 new file mode 100644 index 000000000..99636ac0f --- /dev/null +++ b/crates/eql-codegen/templates/types.sql.j2 @@ -0,0 +1,26 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/schema-v3.sql + +--! @file encrypted_domain/{{ token }}/{{ token }}_types.sql +--! @brief Encrypted-domain types for {{ token }}. + +DO $$ +BEGIN +{%- for d in domains %} + --! @brief Encrypted domain {{ domain_schema }}.{{ d.name }}. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = '{{ d.typname }}' AND typnamespace = '{{ domain_schema }}'::regnamespace + ) THEN + CREATE DOMAIN {{ domain_schema }}.{{ d.name }} AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + {%- for k in d.keys %} + AND VALUE ? '{{ k }}' + {%- endfor %} + AND VALUE->>'v' = '2' + ); + END IF; +{% endfor -%} +END +$$; diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs new file mode 100644 index 000000000..c05045862 --- /dev/null +++ b/crates/eql-codegen/tests/parity.rs @@ -0,0 +1,100 @@ +//! THE PARITY GATE. Runs the Rust generator (into a temp dir) and asserts the +//! int4 SQL surface is line-normalized-equal to the `tests/codegen/reference/int4` +//! golden, and that committed `_values.rs` are byte-identical to the +//! generator output. The golden reference — not the retired Python generator — +//! is the sole oracle. + +use std::fs; +use std::path::PathBuf; + +fn repo_root() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent().unwrap() + .parent().unwrap() + .to_path_buf() +} + +fn tempdir(tag: &str) -> PathBuf { + let mut p = std::env::temp_dir(); + let nanos = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH).unwrap().as_nanos(); + p.push(format!("eql-parity-{tag}-{nanos}")); + fs::create_dir_all(&p).unwrap(); + p +} + +#[test] +fn rust_generator_matches_committed_values_rs() { + let root = repo_root(); + let out = tempdir("rust-values"); + eql_codegen::generate::generate_all(&out).expect("rust generate_all"); + + for spec in eql_scalars::CATALOG { + let token = spec.token; + let generated = out.join(format!("tests/sqlx/src/fixtures/{token}_values.rs")); + let committed = root.join(format!("tests/sqlx/src/fixtures/{token}_values.rs")); + let g = fs::read(&generated).expect("generated values.rs"); + let c = fs::read(&committed).expect("committed values.rs"); + assert_eq!( + g, c, + "{token}_values.rs: Rust generator output differs from the committed file" + ); + } +} + +#[test] +fn rust_generator_matches_int4_golden_files() { + let root = repo_root(); + let out = tempdir("rust-golden"); + eql_codegen::generate::generate_all(&out).expect("rust generate_all"); + + let ref_dir = root.join("tests/codegen/reference/int4"); + let gen_dir = out.join("src/encrypted_domain/int4"); + for entry in fs::read_dir(&ref_dir).unwrap() { + let path = entry.unwrap().path(); + if path.extension().and_then(|e| e.to_str()) != Some("sql") { continue; } + let name = path.file_name().unwrap().to_str().unwrap(); + let reference = fs::read_to_string(&path).unwrap(); + // Strip the leading `-- REFERENCE:` provenance line. What remains is the + // generated body, which already starts with the template-owned + // `-- AUTOMATICALLY GENERATED FILE.` marker — the same first line the + // materialised file carries, so no header is re-added here. + let expected: String = reference.lines() + .skip_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) + .map(|l| format!("{l}\n")) + .collect(); + let actual = fs::read_to_string(gen_dir.join(name)).unwrap(); + assert_eq!( + eql_codegen::context::normalize_sql(&actual), + eql_codegen::context::normalize_sql(&expected), + "{name}: materialised output differs from golden (normalized)" + ); + } +} + +/// Both Rust strippers (the in-crate `strip_reference_marker` and this file's +/// golden test) skip a variable number of leading `-- REFERENCE:` lines, while +/// the shell gate skips exactly one with `tail -n +2`. They agree only while +/// every reference file carries exactly one marker line — make that explicit. +#[test] +fn every_reference_file_has_exactly_one_marker_line() { + let root = repo_root(); + let dir = root.join("tests/codegen/reference/int4"); + for entry in fs::read_dir(&dir).unwrap() { + let path = entry.unwrap().path(); + let ext = path.extension().and_then(|e| e.to_str()); + if ext != Some("sql") && ext != Some("rs") { + continue; + } + let text = fs::read_to_string(&path).unwrap(); + let markers = text + .lines() + .take_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) + .count(); + assert_eq!( + markers, 1, + "{}: expected exactly 1 leading REFERENCE marker line (shell `tail -n +2` assumes one); found {markers}", + path.display() + ); + } +} diff --git a/mise.toml b/mise.toml index 78ea2cb01..e627b45d6 100644 --- a/mise.toml +++ b/mise.toml @@ -96,6 +96,11 @@ run = """ mise exec python -- python -m tasks.codegen.generate --all """ +[tasks."codegen:parity"] +description = "Parity gate: Rust eql-codegen output byte-identical to the Python oracle" +dir = "{{config_root}}" +run = "bash tasks/codegen-parity.sh" + [tasks."test:codegen"] description = "Run the encrypted-domain codegen generator tests (no database required)" dir = "{{config_root}}" diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh new file mode 100755 index 000000000..ff3a90a63 --- /dev/null +++ b/tasks/codegen-parity.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +#MISE description="Parity gate: Rust eql-codegen output matches the int4 golden (normalized) and committed values.rs" + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$REPO_ROOT" + +echo "==> Generating with the Rust generator (writes the real repo tree)" +cargo run -q -p eql-codegen -- > /dev/null + +echo "==> Diffing Rust int4 SQL vs golden reference (line-normalized)" +norm() { sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep -v '^$'; } +for f in tests/codegen/reference/int4/*.sql; do + name="$(basename "$f")" + # Reference: drop the 1-line `-- REFERENCE:` provenance line. What remains — + # and the whole generated file — both start with the template-owned + # `-- AUTOMATICALLY GENERATED FILE.` marker, so no header strip is needed. + diff <(tail -n +2 "$f" | norm) \ + <(norm < "src/encrypted_domain/int4/$name") +done + +echo "==> Verifying committed _values.rs are byte-identical (git clean)" +git diff --exit-code -- tests/sqlx/src/fixtures/*_values.rs + +echo "PARITY OK: Rust generator matches the int4 golden (normalized) and committed values.rs." diff --git a/tasks/test.sh b/tasks/test.sh index 806d6e998..74e044df4 100755 --- a/tasks/test.sh +++ b/tasks/test.sh @@ -22,24 +22,22 @@ echo "" echo "Building EQL..." mise run --output prefix --force build -# Run encrypted-domain codegen generator tests -echo "" -echo "==============================================" -echo "1/3: Running encrypted-domain codegen tests" -echo "==============================================" -mise run --output prefix test:codegen +# The encrypted-domain codegen drift suite (`test:codegen`) is the deprecated +# Python generator's pytest and is intentionally not run here. The Rust +# generator is gated against the hand-written reference by the dedicated +# "Encrypted-domain codegen" CI job (`mise run codegen:parity`). # Run lints on sqlx tests echo "" echo "==============================================" -echo "2/3: Running linting checks on SQLx Rust tests" +echo "1/2: Running linting checks on SQLx Rust tests" echo "==============================================" mise run --output prefix test:lint # Run SQLx Rust tests echo "" echo "==============================================" -echo "3/3: Running SQLx Rust Tests" +echo "2/2: Running SQLx Rust Tests" echo "==============================================" mise run --output prefix test:sqlx @@ -49,7 +47,6 @@ echo "✅ ALL TESTS PASSED" echo "==============================================" echo "" echo "Summary:" -echo " ✓ Encrypted-domain codegen tests" echo " ✓ SQLx Rust lint checks" echo " ✓ SQLx Rust tests" echo "" diff --git a/tests/codegen/reference/int4/int4_eq_functions.sql b/tests/codegen/reference/int4/int4_eq_functions.sql index 14344ba2a..21fddfd57 100644 --- a/tests/codegen/reference/int4/int4_eq_functions.sql +++ b/tests/codegen/reference/int4/int4_eq_functions.sql @@ -1,4 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql @@ -6,9 +7,9 @@ -- REQUIRE: src/hmac_256/functions.sql --! @file encrypted_domain/int4/int4_eq_functions.sql ---! @brief Equality-only domain of the int4 encrypted-domain family — comparison/path functions. +--! @brief Functions for eql_v3.int4_eq. ---! @brief Index extractor for the eql_v3.int4_eq variant. +--! @brief Index extractor for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @return eql_v2.hmac_256 CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq) @@ -16,7 +17,7 @@ RETURNS eql_v2.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v2.hmac_256(a::jsonb) $$; ---! @brief Equality wrapper for eql_v3.int4_eq. +--! @brief Operator wrapper for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq --! @return boolean @@ -24,7 +25,7 @@ CREATE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Equality wrapper for eql_v3.int4_eq (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean @@ -32,7 +33,7 @@ CREATE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.int4_eq) $$; ---! @brief Equality wrapper for eql_v3.int4_eq (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq --! @return boolean @@ -40,7 +41,7 @@ CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a::eql_v3.int4_eq) = eql_v3.eq_term(b) $$; ---! @brief Inequality wrapper for eql_v3.int4_eq. +--! @brief Operator wrapper for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq --! @return boolean @@ -48,7 +49,7 @@ CREATE FUNCTION eql_v3.neq(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Inequality wrapper for eql_v3.int4_eq (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb --! @return boolean @@ -56,7 +57,7 @@ CREATE FUNCTION eql_v3.neq(a eql_v3.int4_eq, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.int4_eq) $$; ---! @brief Inequality wrapper for eql_v3.int4_eq (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq --! @return boolean @@ -64,343 +65,343 @@ CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a::eql_v3.int4_eq) <> eql_v3.eq_term(b) $$; ---! @brief Blocker for < on eql_v3.int4_eq. +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lt(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v3.int4_eq (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lt(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v3.int4_eq. +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lte(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v3.int4_eq (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lte(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v3.int4_eq. +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gt(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v3.int4_eq (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gt(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v3.int4_eq. +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gte(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v3.int4_eq (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gte(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '>='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4_eq. +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4_eq (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_eq. +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_eq (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_eq, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4_eq) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_eq (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param selector text ---! @return eql_v3.int4_eq (never returns; always raises) +--! @return eql_v3.int4_eq CREATE FUNCTION eql_v3."->"(a eql_v3.int4_eq, selector text) RETURNS eql_v3.int4_eq IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_eq (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param selector integer ---! @return eql_v3.int4_eq (never returns; always raises) +--! @return eql_v3.int4_eq CREATE FUNCTION eql_v3."->"(a eql_v3.int4_eq, selector integer) RETURNS eql_v3.int4_eq IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param selector eql_v3.int4_eq ---! @return eql_v3.int4_eq (never returns; always raises) +--! @return eql_v3.int4_eq CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4_eq) RETURNS eql_v3.int4_eq IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_eq (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param selector text ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_eq, selector text) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_eq (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param selector integer ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_eq, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param selector eql_v3.int4_eq ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4_eq) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v3.int4_eq (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?"(a eql_v3.int4_eq, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v3.int4_eq (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?|"(a eql_v3.int4_eq, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '?|'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v3.int4_eq (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?&"(a eql_v3.int4_eq, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '?&'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v3.int4_eq (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@?"(a eql_v3.int4_eq, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v3.int4_eq (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@@"(a eql_v3.int4_eq, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_eq', '@@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v3.int4_eq (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#>"(a eql_v3.int4_eq, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v3.int4_eq (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text[] ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4_eq, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_eq (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_eq, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_eq (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b integer ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_eq, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_eq (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_eq, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v3.int4_eq (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#-"(a eql_v3.int4_eq, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_eq. +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b eql_v3.int4_eq ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_eq (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a eql_v3.int4_eq --! @param b jsonb ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4_eq, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_eq'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_eq (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_eq. --! @param a jsonb --! @param b eql_v3.int4_eq ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4_eq) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_eq'; END; $$ diff --git a/tests/codegen/reference/int4/int4_eq_operators.sql b/tests/codegen/reference/int4/int4_eq_operators.sql index a39951f65..fa0d44cd5 100644 --- a/tests/codegen/reference/int4/int4_eq_operators.sql +++ b/tests/codegen/reference/int4/int4_eq_operators.sql @@ -1,10 +1,11 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_eq_functions.sql --! @file encrypted_domain/int4/int4_eq_operators.sql ---! @brief Equality-only domain of the int4 encrypted-domain family — operator declarations. +--! @brief Operators for eql_v3.int4_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, @@ -42,229 +43,191 @@ CREATE OPERATOR <> ( COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); --- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( FUNCTION = eql_v3.lt, LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( FUNCTION = eql_v3.lt, LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( FUNCTION = eql_v3.lt, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( FUNCTION = eql_v3.gt, LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( FUNCTION = eql_v3.gt, LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( FUNCTION = eql_v3.gt, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4_eq, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4_eq, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( FUNCTION = eql_v3."?", LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( FUNCTION = eql_v3."?|", LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( FUNCTION = eql_v3."?&", LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( FUNCTION = eql_v3."@?", LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( FUNCTION = eql_v3."@@", LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( FUNCTION = eql_v3."#>", LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( FUNCTION = eql_v3."#>>", LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_eq, RIGHTARG = text ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_eq, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( FUNCTION = eql_v3."#-", LEFTARG = eql_v3.int4_eq, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4_eq, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_eq diff --git a/tests/codegen/reference/int4/int4_functions.sql b/tests/codegen/reference/int4/int4_functions.sql index a60bc7b18..36c9df70b 100644 --- a/tests/codegen/reference/int4/int4_functions.sql +++ b/tests/codegen/reference/int4/int4_functions.sql @@ -1,403 +1,404 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/functions.sql --! @file encrypted_domain/int4/int4_functions.sql ---! @brief Storage-only domain of the int4 encrypted-domain family — comparison/path functions. +--! @brief Functions for eql_v3.int4. ---! @brief Blocker for = on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.eq(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for = on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.eq(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for = on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <> on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.neq(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <> on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.neq(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <> on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lt(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lt(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for < on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lte(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lte(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <= on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gt(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gt(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for > on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gte(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gte(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for >= on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '>='); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4 (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param selector text ---! @return eql_v3.int4 (never returns; always raises) +--! @return eql_v3.int4 CREATE FUNCTION eql_v3."->"(a eql_v3.int4, selector text) RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4 (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param selector integer ---! @return eql_v3.int4 (never returns; always raises) +--! @return eql_v3.int4 CREATE FUNCTION eql_v3."->"(a eql_v3.int4, selector integer) RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param selector eql_v3.int4 ---! @return eql_v3.int4 (never returns; always raises) +--! @return eql_v3.int4 CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4) RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4 (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param selector text ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4, selector text) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4 (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param selector integer ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param selector eql_v3.int4 ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v3.int4 (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?"(a eql_v3.int4, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v3.int4 (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?|"(a eql_v3.int4, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '?|'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v3.int4 (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?&"(a eql_v3.int4, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '?&'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v3.int4 (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@?"(a eql_v3.int4, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v3.int4 (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@@"(a eql_v3.int4, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '@@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v3.int4 (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#>"(a eql_v3.int4, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v3.int4 (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text[] ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4 (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4 (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b integer ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4 (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v3.int4 (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#-"(a eql_v3.int4, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4. +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b eql_v3.int4 ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4, b eql_v3.int4) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4 (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a eql_v3.int4 --! @param b jsonb ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4 (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4. --! @param a jsonb --! @param b eql_v3.int4 ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4'; END; $$ diff --git a/tests/codegen/reference/int4/int4_operators.sql b/tests/codegen/reference/int4/int4_operators.sql index 24ff16077..def25237e 100644 --- a/tests/codegen/reference/int4/int4_operators.sql +++ b/tests/codegen/reference/int4/int4_operators.sql @@ -1,270 +1,227 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_functions.sql --! @file encrypted_domain/int4/int4_operators.sql ---! @brief Storage-only domain of the int4 encrypted-domain family — operator declarations. +--! @brief Operators for eql_v3.int4. --- Placeholder: this domain's term set does not support =; the backing function always raises. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support =; the backing function always raises. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support =; the backing function always raises. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <>; the backing function always raises. CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <>; the backing function always raises. CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <>; the backing function always raises. CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( FUNCTION = eql_v3.lt, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( FUNCTION = eql_v3.lt, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <; the backing function always raises. CREATE OPERATOR < ( FUNCTION = eql_v3.lt, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <=; the backing function always raises. CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( FUNCTION = eql_v3.gt, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( FUNCTION = eql_v3.gt, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support >; the backing function always raises. CREATE OPERATOR > ( FUNCTION = eql_v3.gt, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support >=; the backing function always raises. CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = jsonb, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( FUNCTION = eql_v3."?", LEFTARG = eql_v3.int4, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( FUNCTION = eql_v3."?|", LEFTARG = eql_v3.int4, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( FUNCTION = eql_v3."?&", LEFTARG = eql_v3.int4, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( FUNCTION = eql_v3."@?", LEFTARG = eql_v3.int4, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( FUNCTION = eql_v3."@@", LEFTARG = eql_v3.int4, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( FUNCTION = eql_v3."#>", LEFTARG = eql_v3.int4, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( FUNCTION = eql_v3."#>>", LEFTARG = eql_v3.int4, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4, RIGHTARG = text ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( FUNCTION = eql_v3."#-", LEFTARG = eql_v3.int4, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4 ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = jsonb, RIGHTARG = eql_v3.int4 diff --git a/tests/codegen/reference/int4/int4_ord_aggregates.sql b/tests/codegen/reference/int4/int4_ord_aggregates.sql index 12f5efccc..7efdf1779 100644 --- a/tests/codegen/reference/int4/int4_ord_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_aggregates.sql @@ -1,22 +1,17 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql --! @file encrypted_domain/int4/int4_ord_aggregates.sql ---! @brief Ordered domain of the int4 encrypted-domain family — MIN/MAX aggregates. +--! @brief Aggregates for eql_v3.int4_ord. ---! @brief State function for min aggregate on eql_v3.int4_ord. ---! @internal ---! ---! @param state eql_v3.int4_ord running extremum ---! @param value eql_v3.int4_ord next non-NULL value ---! @return eql_v3.int4_ord the minimum of state and value --- LANGUAGE plpgsql, not sql: aggregate state functions are not index --- expressions, so opacity to the planner is fine, and a multi-statement --- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would --- also work, but the procedural form mirrors the blocker convention.) +--! @brief State function for min on eql_v3.int4_ord. +--! @param state eql_v3.int4_ord +--! @param value eql_v3.int4_ord +--! @return eql_v3.int4_ord CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int4_ord, value eql_v3.int4_ord) RETURNS eql_v3.int4_ord LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE @@ -30,15 +25,9 @@ BEGIN END; $$; ---! @brief Find the minimum encrypted value in a group of eql_v3.int4_ord values. ---! ---! Comparison routes through the domain's `<` operator, which uses the ORE block term — no decryption. ---! ---! @param input eql_v3.int4_ord encrypted values to aggregate ---! @return eql_v3.int4_ord minimum of the group, or NULL if all inputs are NULL --- combinefunc = sfunc: min/max are associative, so merging two partial --- extrema is the same comparison. PARALLEL SAFE enables partial and --- parallel aggregation on large GROUP BY workloads, with no decryption. +--! @brief min aggregate for eql_v3.int4_ord. +--! @param input eql_v3.int4_ord +--! @return eql_v3.int4_ord CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord) ( sfunc = eql_v3.min_sfunc, stype = eql_v3.int4_ord, @@ -46,16 +35,10 @@ CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord) ( parallel = safe ); ---! @brief State function for max aggregate on eql_v3.int4_ord. ---! @internal ---! ---! @param state eql_v3.int4_ord running extremum ---! @param value eql_v3.int4_ord next non-NULL value ---! @return eql_v3.int4_ord the maximum of state and value --- LANGUAGE plpgsql, not sql: aggregate state functions are not index --- expressions, so opacity to the planner is fine, and a multi-statement --- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would --- also work, but the procedural form mirrors the blocker convention.) +--! @brief State function for max on eql_v3.int4_ord. +--! @param state eql_v3.int4_ord +--! @param value eql_v3.int4_ord +--! @return eql_v3.int4_ord CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int4_ord, value eql_v3.int4_ord) RETURNS eql_v3.int4_ord LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE @@ -69,15 +52,9 @@ BEGIN END; $$; ---! @brief Find the maximum encrypted value in a group of eql_v3.int4_ord values. ---! ---! Comparison routes through the domain's `>` operator, which uses the ORE block term — no decryption. ---! ---! @param input eql_v3.int4_ord encrypted values to aggregate ---! @return eql_v3.int4_ord maximum of the group, or NULL if all inputs are NULL --- combinefunc = sfunc: min/max are associative, so merging two partial --- extrema is the same comparison. PARALLEL SAFE enables partial and --- parallel aggregation on large GROUP BY workloads, with no decryption. +--! @brief max aggregate for eql_v3.int4_ord. +--! @param input eql_v3.int4_ord +--! @return eql_v3.int4_ord CREATE AGGREGATE eql_v3.max(eql_v3.int4_ord) ( sfunc = eql_v3.max_sfunc, stype = eql_v3.int4_ord, diff --git a/tests/codegen/reference/int4/int4_ord_functions.sql b/tests/codegen/reference/int4/int4_ord_functions.sql index a49bb1e99..b4dda68de 100644 --- a/tests/codegen/reference/int4/int4_ord_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_functions.sql @@ -1,4 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql @@ -7,9 +8,9 @@ -- REQUIRE: src/ore_block_u64_8_256/operators.sql --! @file encrypted_domain/int4/int4_ord_functions.sql ---! @brief Ordered domain of the int4 encrypted-domain family — comparison/path functions. +--! @brief Functions for eql_v3.int4_ord. ---! @brief Index extractor for the eql_v3.int4_ord variant. +--! @brief Index extractor for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @return eql_v2.ore_block_u64_8_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) @@ -17,7 +18,7 @@ RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; ---! @brief Equality wrapper for eql_v3.int4_ord. +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord --! @return boolean @@ -25,7 +26,7 @@ CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Equality wrapper for eql_v3.int4_ord (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean @@ -33,7 +34,7 @@ CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Equality wrapper for eql_v3.int4_ord (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord --! @return boolean @@ -41,7 +42,7 @@ CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) = eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v3.int4_ord. +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord --! @return boolean @@ -49,7 +50,7 @@ CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v3.int4_ord (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean @@ -57,7 +58,7 @@ CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Inequality wrapper for eql_v3.int4_ord (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord --! @return boolean @@ -65,7 +66,7 @@ CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) <> eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v3.int4_ord. +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord --! @return boolean @@ -73,7 +74,7 @@ CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v3.int4_ord (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean @@ -81,7 +82,7 @@ CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Less-than wrapper for eql_v3.int4_ord (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord --! @return boolean @@ -89,7 +90,7 @@ CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) < eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v3.int4_ord. +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord --! @return boolean @@ -97,7 +98,7 @@ CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v3.int4_ord (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean @@ -105,7 +106,7 @@ CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Less-than-or-equal wrapper for eql_v3.int4_ord (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord --! @return boolean @@ -113,7 +114,7 @@ CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) <= eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v3.int4_ord. +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord --! @return boolean @@ -121,7 +122,7 @@ CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v3.int4_ord (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean @@ -129,7 +130,7 @@ CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Greater-than wrapper for eql_v3.int4_ord (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord --! @return boolean @@ -137,7 +138,7 @@ CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) > eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord. +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord --! @return boolean @@ -145,7 +146,7 @@ CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb --! @return boolean @@ -153,7 +154,7 @@ CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int4_ord) $$; ---! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord --! @return boolean @@ -161,235 +162,235 @@ CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord) >= eql_v3.ord_term(b) $$; ---! @brief Blocker for @> on eql_v3.int4_ord. +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4_ord (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4_ord (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_ord. +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_ord (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_ord (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4_ord) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_ord (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param selector text ---! @return eql_v3.int4_ord (never returns; always raises) +--! @return eql_v3.int4_ord CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord, selector text) RETURNS eql_v3.int4_ord IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_ord (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param selector integer ---! @return eql_v3.int4_ord (never returns; always raises) +--! @return eql_v3.int4_ord CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord, selector integer) RETURNS eql_v3.int4_ord IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_ord (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a jsonb --! @param selector eql_v3.int4_ord ---! @return eql_v3.int4_ord (never returns; always raises) +--! @return eql_v3.int4_ord CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4_ord) RETURNS eql_v3.int4_ord IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_ord (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param selector text ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord, selector text) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_ord (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param selector integer ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_ord (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a jsonb --! @param selector eql_v3.int4_ord ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4_ord) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v3.int4_ord (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?"(a eql_v3.int4_ord, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v3.int4_ord (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?|"(a eql_v3.int4_ord, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '?|'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v3.int4_ord (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?&"(a eql_v3.int4_ord, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '?&'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v3.int4_ord (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@?"(a eql_v3.int4_ord, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v3.int4_ord (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@@"(a eql_v3.int4_ord, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '@@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v3.int4_ord (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#>"(a eql_v3.int4_ord, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v3.int4_ord (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text[] ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4_ord, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_ord (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_ord (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b integer ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_ord (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v3.int4_ord (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#-"(a eql_v3.int4_ord, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_ord. +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b eql_v3.int4_ord ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord, b eql_v3.int4_ord) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_ord (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a eql_v3.int4_ord --! @param b jsonb ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_ord (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord. --! @param a jsonb --! @param b eql_v3.int4_ord ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4_ord) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord'; END; $$ diff --git a/tests/codegen/reference/int4/int4_ord_operators.sql b/tests/codegen/reference/int4/int4_ord_operators.sql index f52ecebb8..697f162ef 100644 --- a/tests/codegen/reference/int4/int4_ord_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_operators.sql @@ -1,10 +1,11 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql --! @file encrypted_domain/int4/int4_ord_operators.sql ---! @brief Ordered domain of the int4 encrypted-domain family — operator declarations. +--! @brief Operators for eql_v3.int4_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, @@ -114,157 +115,131 @@ CREATE OPERATOR >= ( COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4_ord, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4_ord, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord ); --- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( FUNCTION = eql_v3."?", LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( FUNCTION = eql_v3."?|", LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( FUNCTION = eql_v3."?&", LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( FUNCTION = eql_v3."@?", LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( FUNCTION = eql_v3."@@", LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( FUNCTION = eql_v3."#>", LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( FUNCTION = eql_v3."#>>", LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_ord, RIGHTARG = text ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_ord, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( FUNCTION = eql_v3."#-", LEFTARG = eql_v3.int4_ord, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4_ord, RIGHTARG = eql_v3.int4_ord ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4_ord, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord diff --git a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql index 263964592..5b160ed7e 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql @@ -1,22 +1,17 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_operators.sql --! @file encrypted_domain/int4/int4_ord_ore_aggregates.sql ---! @brief Ordered domain of the int4 encrypted-domain family — MIN/MAX aggregates. +--! @brief Aggregates for eql_v3.int4_ord_ore. ---! @brief State function for min aggregate on eql_v3.int4_ord_ore. ---! @internal ---! ---! @param state eql_v3.int4_ord_ore running extremum ---! @param value eql_v3.int4_ord_ore next non-NULL value ---! @return eql_v3.int4_ord_ore the minimum of state and value --- LANGUAGE plpgsql, not sql: aggregate state functions are not index --- expressions, so opacity to the planner is fine, and a multi-statement --- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would --- also work, but the procedural form mirrors the blocker convention.) +--! @brief State function for min on eql_v3.int4_ord_ore. +--! @param state eql_v3.int4_ord_ore +--! @param value eql_v3.int4_ord_ore +--! @return eql_v3.int4_ord_ore CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int4_ord_ore, value eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE @@ -30,15 +25,9 @@ BEGIN END; $$; ---! @brief Find the minimum encrypted value in a group of eql_v3.int4_ord_ore values. ---! ---! Comparison routes through the domain's `<` operator, which uses the ORE block term — no decryption. ---! ---! @param input eql_v3.int4_ord_ore encrypted values to aggregate ---! @return eql_v3.int4_ord_ore minimum of the group, or NULL if all inputs are NULL --- combinefunc = sfunc: min/max are associative, so merging two partial --- extrema is the same comparison. PARALLEL SAFE enables partial and --- parallel aggregation on large GROUP BY workloads, with no decryption. +--! @brief min aggregate for eql_v3.int4_ord_ore. +--! @param input eql_v3.int4_ord_ore +--! @return eql_v3.int4_ord_ore CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord_ore) ( sfunc = eql_v3.min_sfunc, stype = eql_v3.int4_ord_ore, @@ -46,16 +35,10 @@ CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord_ore) ( parallel = safe ); ---! @brief State function for max aggregate on eql_v3.int4_ord_ore. ---! @internal ---! ---! @param state eql_v3.int4_ord_ore running extremum ---! @param value eql_v3.int4_ord_ore next non-NULL value ---! @return eql_v3.int4_ord_ore the maximum of state and value --- LANGUAGE plpgsql, not sql: aggregate state functions are not index --- expressions, so opacity to the planner is fine, and a multi-statement --- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would --- also work, but the procedural form mirrors the blocker convention.) +--! @brief State function for max on eql_v3.int4_ord_ore. +--! @param state eql_v3.int4_ord_ore +--! @param value eql_v3.int4_ord_ore +--! @return eql_v3.int4_ord_ore CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int4_ord_ore, value eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE @@ -69,15 +52,9 @@ BEGIN END; $$; ---! @brief Find the maximum encrypted value in a group of eql_v3.int4_ord_ore values. ---! ---! Comparison routes through the domain's `>` operator, which uses the ORE block term — no decryption. ---! ---! @param input eql_v3.int4_ord_ore encrypted values to aggregate ---! @return eql_v3.int4_ord_ore maximum of the group, or NULL if all inputs are NULL --- combinefunc = sfunc: min/max are associative, so merging two partial --- extrema is the same comparison. PARALLEL SAFE enables partial and --- parallel aggregation on large GROUP BY workloads, with no decryption. +--! @brief max aggregate for eql_v3.int4_ord_ore. +--! @param input eql_v3.int4_ord_ore +--! @return eql_v3.int4_ord_ore CREATE AGGREGATE eql_v3.max(eql_v3.int4_ord_ore) ( sfunc = eql_v3.max_sfunc, stype = eql_v3.int4_ord_ore, diff --git a/tests/codegen/reference/int4/int4_ord_ore_functions.sql b/tests/codegen/reference/int4/int4_ord_ore_functions.sql index 005bf6720..327bc18c4 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_functions.sql @@ -1,4 +1,5 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql @@ -7,9 +8,9 @@ -- REQUIRE: src/ore_block_u64_8_256/operators.sql --! @file encrypted_domain/int4/int4_ord_ore_functions.sql ---! @brief Ordered domain of the int4 encrypted-domain family — comparison/path functions. +--! @brief Functions for eql_v3.int4_ord_ore. ---! @brief Index extractor for the eql_v3.int4_ord_ore variant. +--! @brief Index extractor for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @return eql_v2.ore_block_u64_8_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord_ore) @@ -17,7 +18,7 @@ RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; ---! @brief Equality wrapper for eql_v3.int4_ord_ore. +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -25,7 +26,7 @@ CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Equality wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean @@ -33,7 +34,7 @@ CREATE FUNCTION eql_v3.eq(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Equality wrapper for eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -41,7 +42,7 @@ CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) = eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v3.int4_ord_ore. +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -49,7 +50,7 @@ CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Inequality wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean @@ -57,7 +58,7 @@ CREATE FUNCTION eql_v3.neq(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Inequality wrapper for eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -65,7 +66,7 @@ CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) <> eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v3.int4_ord_ore. +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -73,7 +74,7 @@ CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Less-than wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean @@ -81,7 +82,7 @@ CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Less-than wrapper for eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -89,7 +90,7 @@ CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) < eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v3.int4_ord_ore. +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -97,7 +98,7 @@ CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Less-than-or-equal wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean @@ -105,7 +106,7 @@ CREATE FUNCTION eql_v3.lte(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Less-than-or-equal wrapper for eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -113,7 +114,7 @@ CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) <= eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v3.int4_ord_ore. +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -121,7 +122,7 @@ CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Greater-than wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean @@ -129,7 +130,7 @@ CREATE FUNCTION eql_v3.gt(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Greater-than wrapper for eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -137,7 +138,7 @@ CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) > eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord_ore. +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -145,7 +146,7 @@ CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb --! @return boolean @@ -153,7 +154,7 @@ CREATE FUNCTION eql_v3.gte(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int4_ord_ore) $$; ---! @brief Greater-than-or-equal wrapper for eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore --! @return boolean @@ -161,235 +162,235 @@ CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a::eql_v3.int4_ord_ore) >= eql_v3.ord_term(b) $$; ---! @brief Blocker for @> on eql_v3.int4_ord_ore. +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @> on eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@>'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_ord_ore. +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a eql_v3.int4_ord_ore, b jsonb) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for <@ on eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int4_ord_ore) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '<@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_ord_ore (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param selector text ---! @return eql_v3.int4_ord_ore (never returns; always raises) +--! @return eql_v3.int4_ord_ore CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord_ore, selector text) RETURNS eql_v3.int4_ord_ore IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_ord_ore (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param selector integer ---! @return eql_v3.int4_ord_ore (never returns; always raises) +--! @return eql_v3.int4_ord_ore CREATE FUNCTION eql_v3."->"(a eql_v3.int4_ord_ore, selector integer) RETURNS eql_v3.int4_ord_ore IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for -> on eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a jsonb --! @param selector eql_v3.int4_ord_ore ---! @return eql_v3.int4_ord_ore (never returns; always raises) +--! @return eql_v3.int4_ord_ore CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_ord_ore (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param selector text ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord_ore, selector text) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_ord_ore (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param selector integer ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a eql_v3.int4_ord_ore, selector integer) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ->> on eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a jsonb --! @param selector eql_v3.int4_ord_ore ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int4_ord_ore) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ? on eql_v3.int4_ord_ore (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?"(a eql_v3.int4_ord_ore, b text) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?| on eql_v3.int4_ord_ore (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?|"(a eql_v3.int4_ord_ore, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '?|'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for ?& on eql_v3.int4_ord_ore (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text[] ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."?&"(a eql_v3.int4_ord_ore, b text[]) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '?&'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @? on eql_v3.int4_ord_ore (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@?"(a eql_v3.int4_ord_ore, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@?'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for @@ on eql_v3.int4_ord_ore (domain, jsonpath). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonpath ---! @return boolean (never returns; always raises) +--! @return boolean CREATE FUNCTION eql_v3."@@"(a eql_v3.int4_ord_ore, b jsonpath) RETURNS boolean IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4_ord_ore', '@@'); END; $$ +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #> on eql_v3.int4_ord_ore (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#>"(a eql_v3.int4_ord_ore, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #>> on eql_v3.int4_ord_ore (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text[] ---! @return text (never returns; always raises) +--! @return text CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4_ord_ore, b text[]) RETURNS text IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_ord_ore (domain, text). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord_ore, b text) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_ord_ore (domain, integer). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b integer ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord_ore, b integer) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for - on eql_v3.int4_ord_ore (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."-"(a eql_v3.int4_ord_ore, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for #- on eql_v3.int4_ord_ore (domain, text[]). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b text[] ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."#-"(a eql_v3.int4_ord_ore, b text[]) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_ord_ore. +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b eql_v3.int4_ord_ore ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_ord_ore (domain, jsonb). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore --! @param b jsonb ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a eql_v3.int4_ord_ore, b jsonb) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord_ore'; END; $$ LANGUAGE plpgsql; ---! @brief Blocker for || on eql_v3.int4_ord_ore (jsonb, domain). +--! @brief Unsupported operator blocker for eql_v3.int4_ord_ore. --! @param a jsonb --! @param b eql_v3.int4_ord_ore ---! @return jsonb (never returns; always raises) +--! @return jsonb CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4_ord_ore) RETURNS jsonb IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int4_ord_ore'; END; $$ diff --git a/tests/codegen/reference/int4/int4_ord_ore_operators.sql b/tests/codegen/reference/int4/int4_ord_ore_operators.sql index e6dc27e94..47549cdbb 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_operators.sql @@ -1,10 +1,11 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql -- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql --! @file encrypted_domain/int4/int4_ord_ore_operators.sql ---! @brief Ordered domain of the int4 encrypted-domain family — operator declarations. +--! @brief Operators for eql_v3.int4_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, @@ -114,157 +115,131 @@ CREATE OPERATOR >= ( COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support @>; the backing function always raises. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support <@; the backing function always raises. CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->; the backing function always raises. CREATE OPERATOR -> ( FUNCTION = eql_v3."->", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support ->>; the backing function always raises. CREATE OPERATOR ->> ( FUNCTION = eql_v3."->>", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore ); --- Placeholder: this domain's term set does not support ?; the backing function always raises. CREATE OPERATOR ? ( FUNCTION = eql_v3."?", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); --- Placeholder: this domain's term set does not support ?|; the backing function always raises. CREATE OPERATOR ?| ( FUNCTION = eql_v3."?|", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ?&; the backing function always raises. CREATE OPERATOR ?& ( FUNCTION = eql_v3."?&", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support @?; the backing function always raises. CREATE OPERATOR @? ( FUNCTION = eql_v3."@?", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support @@; the backing function always raises. CREATE OPERATOR @@ ( FUNCTION = eql_v3."@@", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonpath ); --- Placeholder: this domain's term set does not support #>; the backing function always raises. CREATE OPERATOR #> ( FUNCTION = eql_v3."#>", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #>>; the backing function always raises. CREATE OPERATOR #>> ( FUNCTION = eql_v3."#>>", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = integer ); --- Placeholder: this domain's term set does not support -; the backing function always raises. CREATE OPERATOR - ( FUNCTION = eql_v3."-", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support #-; the backing function always raises. CREATE OPERATOR #- ( FUNCTION = eql_v3."#-", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = text[] ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = eql_v3.int4_ord_ore ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = eql_v3.int4_ord_ore, RIGHTARG = jsonb ); --- Placeholder: this domain's term set does not support ||; the backing function always raises. CREATE OPERATOR || ( FUNCTION = eql_v3."||", LEFTARG = jsonb, RIGHTARG = eql_v3.int4_ord_ore diff --git a/tests/codegen/reference/int4/int4_types.sql b/tests/codegen/reference/int4/int4_types.sql index 0b33e740c..bb708a617 100644 --- a/tests/codegen/reference/int4/int4_types.sql +++ b/tests/codegen/reference/int4/int4_types.sql @@ -1,12 +1,13 @@ -- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql --! @file encrypted_domain/int4/int4_types.sql ---! @brief Encrypted-domain type family for int4. +--! @brief Encrypted-domain types for int4. DO $$ BEGIN - --! @brief Storage-only encrypted int4 domain. + --! @brief Encrypted domain eql_v3.int4. IF NOT EXISTS ( SELECT 1 FROM pg_type WHERE typname = 'int4' AND typnamespace = 'eql_v3'::regnamespace @@ -21,7 +22,7 @@ BEGIN ); END IF; - --! @brief Equality-only encrypted int4 domain. + --! @brief Encrypted domain eql_v3.int4_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type WHERE typname = 'int4_eq' AND typnamespace = 'eql_v3'::regnamespace @@ -37,7 +38,7 @@ BEGIN ); END IF; - --! @brief Ordered encrypted int4 domain. Scheme-explicit twin pinning the ore scheme; prefer the converged int4_ord name. + --! @brief Encrypted domain eql_v3.int4_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type WHERE typname = 'int4_ord_ore' AND typnamespace = 'eql_v3'::regnamespace @@ -53,7 +54,7 @@ BEGIN ); END IF; - --! @brief Ordered encrypted int4 domain. Recommended converged name for this role. + --! @brief Encrypted domain eql_v3.int4_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type WHERE typname = 'int4_ord' AND typnamespace = 'eql_v3'::regnamespace diff --git a/tests/sqlx/src/fixtures/int2_values.rs b/tests/sqlx/src/fixtures/int2_values.rs index 74aff1c41..4ff2db389 100644 --- a/tests/sqlx/src/fixtures/int2_values.rs +++ b/tests/sqlx/src/fixtures/int2_values.rs @@ -1,7 +1,4 @@ -// AUTO-GENERATED — DO NOT EDIT. -// Regenerated by `mise run build` (or `mise run codegen:domain `). -// Source of truth: tasks/codegen/types/.toml `[fixture] values`. -// This file IS committed and verified in CI (git diff --exit-code). +// AUTOMATICALLY GENERATED FILE. //! Fixture plaintext values for the int2 encrypted-domain family. //! //! Generated from tasks/codegen/types/int2.toml `[fixture] values` — diff --git a/tests/sqlx/src/fixtures/int4_values.rs b/tests/sqlx/src/fixtures/int4_values.rs index 92f6491db..c9c48b304 100644 --- a/tests/sqlx/src/fixtures/int4_values.rs +++ b/tests/sqlx/src/fixtures/int4_values.rs @@ -1,7 +1,4 @@ -// AUTO-GENERATED — DO NOT EDIT. -// Regenerated by `mise run build` (or `mise run codegen:domain `). -// Source of truth: tasks/codegen/types/.toml `[fixture] values`. -// This file IS committed and verified in CI (git diff --exit-code). +// AUTOMATICALLY GENERATED FILE. //! Fixture plaintext values for the int4 encrypted-domain family. //! //! Generated from tasks/codegen/types/int4.toml `[fixture] values` — diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index 08b19c047..5f1bdb6d2 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -114,10 +114,11 @@ async fn placeholder_payload_satisfies_every_variant_check(pool: PgPool) -> Resu // successfully to every domain in the family. If a variant CHECK // tightens, this test fails and PLACEHOLDER_PAYLOAD needs updating. // - // Iterates `Variant::ALL` against `::PG_TYPE` - // rather than hardcoding domain names — when `int8` (or any future - // scalar) lands, this test picks it up automatically by extending - // the type list below. + // Iterates `Variant::ALL` for `i32`, deriving each domain name from + // `ScalarDomainSpec::new::(variant).sql_domain` rather than + // hardcoding the names. Currently `i32`-only; when `int8` (or any + // future scalar) lands, wrap this in a per-type loop so the + // PLACEHOLDER_PAYLOAD cast is exercised against every scalar. for variant in Variant::ALL { let spec = ScalarDomainSpec::new::(*variant); let sql = format!("SELECT $1::jsonb::{}", spec.sql_domain); @@ -295,12 +296,13 @@ async fn neq_propagates_null_under_three_valued_logic(pool: PgPool) -> Result<() } #[sqlx::test] -async fn no_cross_variant_equality_operator_is_declared(pool: PgPool) -> Result<()> { - // The family deliberately does NOT define operators that mix two - // different capability variants — `eql_v3.int4_eq = eql_v3.int4_ord` +async fn no_cross_variant_operator_is_declared(pool: PgPool) -> Result<()> { + // The family deliberately does NOT define ANY operator that mixes two + // different capability variants — e.g. `eql_v3.int4_eq = eql_v3.int4_ord` // would resolve against jsonb (the ultimate base type) and silently - // bypass the per-variant blockers. If someone accidentally adds such - // an operator, this test fails. + // bypass the per-variant blockers. The query below has no `oprname` + // filter, so it catches a cross-variant operator of any kind, not just + // `=`. If someone accidentally adds such an operator, this test fails. // // The check is structural (`pg_operator`) rather than dynamic // ("invoke and see it raise") so a future PG version with stricter From 3e28303f4255a63c0abc0169884dc22640353f03 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 16:37:05 +1000 Subject: [PATCH 032/599] fix(codegen): align Python generator marker with Rust + fmt/clippy crates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Rust port (1590dc3) re-headed every committed/golden artifact to the `AUTOMATICALLY GENERATED FILE.` marker and updated consts.rs + CLAUDE.md, but left the Python generator on its original `AUTO-GENERATED — DO NOT EDIT.` marker. CI still runs the Python generator (codegen:domain:all, build), so its ownership check mismatched the Rust-marked files and refused to overwrite them as hand-written (OwnershipError), failing the "Encrypted-domain codegen" job. Align tasks/codegen/templates.py (and its marker tests) to the canonical single-line Rust marker — the one docs:validate greps on and consts.rs asserts. Also fix the "Rust workspace crates" job: cargo fmt the eql-codegen sources (never formatted) and resolve two latent clippy manual_contains lints in generate.rs that fmt's fail-fast had masked. Verified locally: codegen:domain:all (+ git diff), codegen:parity, and test:crates (fmt --check + clippy -D warnings + cargo test) all pass. --- crates/eql-codegen/src/consts.rs | 5 +- crates/eql-codegen/src/context.rs | 52 +++-- crates/eql-codegen/src/generate.rs | 154 +++++++++++---- crates/eql-codegen/src/operator_surface.rs | 209 ++++++++++++++++++--- crates/eql-codegen/src/templates.rs | 5 +- crates/eql-codegen/src/writer.rs | 31 ++- crates/eql-codegen/tests/parity.rs | 17 +- tasks/codegen/templates.py | 30 ++- tasks/codegen/test_templates.py | 21 ++- 9 files changed, 412 insertions(+), 112 deletions(-) diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index ae318ac83..c1b9e75c8 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -43,7 +43,10 @@ mod tests { #[test] fn rust_marker_is_a_rust_comment() { - assert_eq!(AUTO_GENERATED_HEADER_RS, "// AUTOMATICALLY GENERATED FILE.\n"); + assert_eq!( + AUTO_GENERATED_HEADER_RS, + "// AUTOMATICALLY GENERATED FILE.\n" + ); for line in AUTO_GENERATED_HEADER_RS.lines() { assert!( !line.starts_with("--"), diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 6a104831e..83eb52e9d 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -23,12 +23,21 @@ pub fn environment() -> minijinja::Environment<'static> { env.set_keep_trailing_newline(true); env.add_template("types.sql", include_str!("../templates/types.sql.j2")) .expect("types.sql template"); - env.add_template("functions.sql", include_str!("../templates/functions.sql.j2")) - .expect("functions.sql template"); - env.add_template("operators.sql", include_str!("../templates/operators.sql.j2")) - .expect("operators.sql template"); - env.add_template("aggregates.sql", include_str!("../templates/aggregates.sql.j2")) - .expect("aggregates.sql template"); + env.add_template( + "functions.sql", + include_str!("../templates/functions.sql.j2"), + ) + .expect("functions.sql template"); + env.add_template( + "operators.sql", + include_str!("../templates/operators.sql.j2"), + ) + .expect("operators.sql template"); + env.add_template( + "aggregates.sql", + include_str!("../templates/aggregates.sql.j2"), + ) + .expect("aggregates.sql template"); env.add_global("domain_schema", DOMAIN_SCHEMA); env.add_global("core_schema", CORE_SCHEMA); env @@ -87,8 +96,8 @@ pub enum FnEntry { ctor: String, // e.g. hmac_256 (called as {{ core_schema }}.{{ ctor }}) }, Wrapper { - op: String, // SQL operator used in the body, e.g. = - function_name: String, // e.g. eq + op: String, // SQL operator used in the body, e.g. = + function_name: String, // e.g. eq args: [SqlParam; 2], call_a: String, // e.g. eql_v3.eq_term(a) (embeds extract_arg cast logic) call_b: String, // e.g. eql_v3.eq_term(b::eql_v3.int4_eq) @@ -128,8 +137,14 @@ pub fn wrapper_entry(dom: &str, op: &str, arg_a: &str, arg_b: &str, extractor: & op: op.to_string(), function_name: backing_function(op).to_string(), args: [ - SqlParam { name: "a", ty: arg_a.to_string() }, - SqlParam { name: "b", ty: arg_b.to_string() }, + SqlParam { + name: "a", + ty: arg_a.to_string(), + }, + SqlParam { + name: "b", + ty: arg_b.to_string(), + }, ], call_a: extract_arg(arg_a, extractor, dom, "a"), call_b: extract_arg(arg_b, extractor, dom, "b"), @@ -248,8 +263,14 @@ pub struct AggregateOp { /// The two aggregate ops in (min, max) order. Port of `AGGREGATE_OPS`. pub const AGGREGATE_OPS: &[AggregateOp] = &[ - AggregateOp { name: "min", comparator: "<" }, - AggregateOp { name: "max", comparator: ">" }, + AggregateOp { + name: "min", + comparator: "<", + }, + AggregateOp { + name: "max", + comparator: ">", + }, ]; /// True if the domain carries a comparator term (supports `<`). @@ -299,7 +320,12 @@ mod tests { #[test] fn environment_has_four_templates() { let env = environment(); - for name in ["types.sql", "functions.sql", "operators.sql", "aggregates.sql"] { + for name in [ + "types.sql", + "functions.sql", + "operators.sql", + "aggregates.sql", + ] { assert!(env.get_template(name).is_ok(), "missing template {name}"); } } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index a7e1340c9..6cbd259a3 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -4,10 +4,10 @@ use std::path::{Path, PathBuf}; use eql_scalars::{DomainSpec, ScalarSpec, Term}; +use crate::context::{domain_name, is_ord_capable}; use crate::operator_surface::{ backing_function, BLOCKER_ONLY_OPERATORS, PATH_OPERATORS, SYMMETRIC_OPERATORS, }; -use crate::context::{domain_name, is_ord_capable}; /// The full domain name (token + suffix). suffix "" => bare token. fn full_name(token: &str, suffix: &str) -> String { @@ -131,7 +131,7 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { let dom = domain_name(&name); let domain_lit = sql_str(&dom); let supported = Term::operators_for_terms(domain.terms); - let is_supported = |op: &str| supported.iter().any(|s| *s == op); + let is_supported = |op: &str| supported.contains(&op); let mut entries = Vec::new(); for term in extractor_terms(domain.terms) { @@ -147,18 +147,34 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { } } let args = [ - SqlParam { name: "a", ty: arg_a }, - SqlParam { name: "b", ty: arg_b }, + SqlParam { + name: "a", + ty: arg_a, + }, + SqlParam { + name: "b", + ty: arg_b, + }, ]; entries.push(blocker_entry(op, args, "boolean")); } } for &op in PATH_OPERATORS { for (arg_a, arg_b) in path_shapes(&dom) { - let returns = if op == "->>" { "text".to_string() } else { dom.clone() }; + let returns = if op == "->>" { + "text".to_string() + } else { + dom.clone() + }; let args = [ - SqlParam { name: "a", ty: arg_a }, - SqlParam { name: "selector", ty: arg_b }, + SqlParam { + name: "a", + ty: arg_a, + }, + SqlParam { + name: "selector", + ty: arg_b, + }, ]; entries.push(blocker_entry(op, args, &returns)); } @@ -166,8 +182,14 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { for &op in BLOCKER_ONLY_OPERATORS { for (arg_a, arg_b, returns) in blocker_only_shapes(&dom, op) { let args = [ - SqlParam { name: "a", ty: arg_a }, - SqlParam { name: "b", ty: arg_b }, + SqlParam { + name: "a", + ty: arg_a, + }, + SqlParam { + name: "b", + ty: arg_b, + }, ]; entries.push(blocker_entry(op, args, &returns)); } @@ -194,7 +216,7 @@ pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { let name = full_name(token, domain.suffix); let dom = domain_name(&name); let supported = Term::operators_for_terms(domain.terms); - let is_supported = |op: &str| supported.iter().any(|s| *s == op); + let is_supported = |op: &str| supported.contains(&op); let mut operators = Vec::new(); for &op in SYMMETRIC_OPERATORS { @@ -252,7 +274,7 @@ pub fn render_aggregates_file(token: &str, domain: &DomainSpec) -> Option Result, pub fn generate_all(out_root: &Path) -> Result { for spec in eql_scalars::CATALOG { let token = spec.token; - let out_dir = out_root - .join("src") - .join("encrypted_domain") - .join(token); + let out_dir = out_root.join("src").join("encrypted_domain").join(token); let mut written = generate_type(spec, &out_dir)?; let rs_path = fixture_values_rs_path(out_root, token); @@ -347,11 +366,17 @@ mod tests { use eql_scalars::CATALOG; fn spec(token: &str) -> &'static ScalarSpec { - CATALOG.iter().find(|s| s.token == token).expect("catalog token") + CATALOG + .iter() + .find(|s| s.token == token) + .expect("catalog token") } fn domain<'a>(spec: &'a ScalarSpec, suffix: &str) -> &'a DomainSpec { - spec.domains.iter().find(|d| d.suffix == suffix).expect("domain suffix") + spec.domains + .iter() + .find(|d| d.suffix == suffix) + .expect("domain suffix") } use crate::templates::render_fixture_values_rs; @@ -441,7 +466,11 @@ mod tests { let path = root.join(format!("tests/codegen/reference/int4/{full}_operators.sql")); let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); let actual = render_operators_file("int4", d); - assert_eq!(normalize_sql(&actual), normalize_sql(&expected), "{full}_operators.sql"); + assert_eq!( + normalize_sql(&actual), + normalize_sql(&expected), + "{full}_operators.sql" + ); } } @@ -453,9 +482,15 @@ mod tests { for d in s.domains { if let Some(actual) = render_aggregates_file("int4", d) { let full = full_name("int4", d.suffix); - let path = root.join(format!("tests/codegen/reference/int4/{full}_aggregates.sql")); + let path = root.join(format!( + "tests/codegen/reference/int4/{full}_aggregates.sql" + )); let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - assert_eq!(normalize_sql(&actual), normalize_sql(&expected), "{full}_aggregates.sql"); + assert_eq!( + normalize_sql(&actual), + normalize_sql(&expected), + "{full}_aggregates.sql" + ); } } } @@ -482,7 +517,10 @@ mod tests { ); checked += 1; } - assert!(checked >= 11, "expected >=11 reference SQL files, checked {checked}"); + assert!( + checked >= 11, + "expected >=11 reference SQL files, checked {checked}" + ); } #[test] @@ -491,7 +529,10 @@ mod tests { let path = root.join("tests/codegen/reference/int4/int4_values.rs"); let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); let actual = render_fixture_values_rs(spec("int4")); - assert_eq!(actual, expected, "int4_values.rs: generator diverged from golden reference"); + assert_eq!( + actual, expected, + "int4_values.rs: generator diverged from golden reference" + ); } #[test] @@ -515,7 +556,9 @@ mod tests { assert!(names.contains(&"int4_ord_aggregates.sql".to_string())); assert_eq!(written.len(), 11); for p in &written { - assert!(fs::read_to_string(p).unwrap().starts_with(crate::consts::AUTO_GENERATED_HEADER)); + assert!(fs::read_to_string(p) + .unwrap() + .starts_with(crate::consts::AUTO_GENERATED_HEADER)); } } @@ -524,7 +567,10 @@ mod tests { let sql = render_types_file(spec("int4")); assert!(sql.contains("-- REQUIRE: src/schema-v3.sql")); for dom in ["int4", "int4_eq", "int4_ord_ore", "int4_ord"] { - assert!(sql.contains(&format!("CREATE DOMAIN eql_v3.{dom} AS jsonb")), "missing {dom}"); + assert!( + sql.contains(&format!("CREATE DOMAIN eql_v3.{dom} AS jsonb")), + "missing {dom}" + ); } } @@ -535,7 +581,11 @@ mod tests { assert_eq!(sql.matches("CREATE FUNCTION").count(), 44); assert!(!sql.contains("SET search_path")); assert_eq!(sql.matches("LANGUAGE plpgsql").count(), 44); - assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 0); + assert_eq!( + sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") + .count(), + 0 + ); } #[test] @@ -545,7 +595,11 @@ mod tests { assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)")); assert!(sql.contains("RETURNS eql_v2.hmac_256")); - assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 7); + assert_eq!( + sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") + .count(), + 7 + ); assert_eq!(sql.matches("LANGUAGE plpgsql").count(), 38); assert!(!sql.contains("SET search_path")); } @@ -557,7 +611,11 @@ mod tests { assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)")); assert!(sql.contains("RETURNS eql_v2.ore_block_u64_8_256")); - assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 19); + assert_eq!( + sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") + .count(), + 19 + ); assert_eq!(sql.matches("LANGUAGE plpgsql").count(), 26); } @@ -596,8 +654,14 @@ mod tests { let ord = domain(s, "_ord"); let ore = domain(s, "_ord_ore"); let norm = |sql: String| sql.replace("int4_ord_ore", "T").replace("int4_ord", "T"); - assert_eq!(norm(render_functions_file(s.token, ord)), norm(render_functions_file(s.token, ore))); - assert_eq!(norm(render_operators_file(s.token, ord)), norm(render_operators_file(s.token, ore))); + assert_eq!( + norm(render_functions_file(s.token, ord)), + norm(render_functions_file(s.token, ore)) + ); + assert_eq!( + norm(render_operators_file(s.token, ord)), + norm(render_operators_file(s.token, ore)) + ); assert_eq!( norm(render_aggregates_file(s.token, ord).unwrap()), norm(render_aggregates_file(s.token, ore).unwrap()) @@ -643,8 +707,16 @@ mod tests { let s = spec("int4"); let sql = render_aggregates_file("int4", domain(s, "_ord")).unwrap(); assert_eq!(sql.matches("CREATE FUNCTION").count(), 2); - assert_eq!(sql.matches("LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE").count(), 2); - assert_eq!(sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE").count(), 0); + assert_eq!( + sql.matches("LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE") + .count(), + 2 + ); + assert_eq!( + sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") + .count(), + 0 + ); } #[test] @@ -683,8 +755,14 @@ mod tests { let entry = blocker_entry( "<", [ - SqlParam { name: "a", ty: dom.into() }, - SqlParam { name: "b", ty: dom.into() }, + SqlParam { + name: "a", + ty: dom.into(), + }, + SqlParam { + name: "b", + ty: dom.into(), + }, ], "boolean", ); @@ -701,9 +779,15 @@ mod tests { fn domain_block_escapes_quote_bearing_name() { use crate::context::domain_block; use eql_scalars::DomainSpec; - let block = domain_block("int4", &DomainSpec { suffix: "_q", terms: &[] }); + let block = domain_block( + "int4", + &DomainSpec { + suffix: "_q", + terms: &[], + }, + ); assert_eq!(block.typname, "int4_q"); // no quote present → unchanged - // keys are sql_str-escaped key tokens; none should carry a bare unescaped quote. + // keys are sql_str-escaped key tokens; none should carry a bare unescaped quote. assert!(block.keys.iter().all(|k| !k.contains("o'"))); } } diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index eace7e067..772ac3582 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -41,26 +41,186 @@ pub fn backing_function(symbol: &str) -> &'static str { /// The 20-operator table. Order matches the SYMMETRIC/PATH/BLOCKER_ONLY lists. pub const OPERATORS: &[Operator] = &[ - Operator { symbol: "=", backing: "eq", kind: Kind::Symmetric, restrict: Some("eqsel"), join: Some("eqjoinsel"), commutator: Some("="), negator: Some("<>") }, - Operator { symbol: "<>", backing: "neq", kind: Kind::Symmetric, restrict: Some("neqsel"), join: Some("neqjoinsel"), commutator: Some("<>"), negator: Some("=") }, - Operator { symbol: "<", backing: "lt", kind: Kind::Symmetric, restrict: Some("scalarltsel"), join: Some("scalarltjoinsel"), commutator: Some(">"), negator: Some(">=") }, - Operator { symbol: "<=", backing: "lte", kind: Kind::Symmetric, restrict: Some("scalarlesel"), join: Some("scalarlejoinsel"), commutator: Some(">="), negator: Some(">") }, - Operator { symbol: ">", backing: "gt", kind: Kind::Symmetric, restrict: Some("scalargtsel"), join: Some("scalargtjoinsel"), commutator: Some("<"), negator: Some("<=") }, - Operator { symbol: ">=", backing: "gte", kind: Kind::Symmetric, restrict: Some("scalargesel"), join: Some("scalargejoinsel"), commutator: Some("<="), negator: Some("<") }, - Operator { symbol: "@>", backing: "contains", kind: Kind::Symmetric, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "<@", backing: "contained_by", kind: Kind::Symmetric, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "->", backing: "\"->\"", kind: Kind::Path, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "->>", backing: "\"->>\"", kind: Kind::Path, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "?", backing: "\"?\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "?|", backing: "\"?|\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "?&", backing: "\"?&\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "@?", backing: "\"@?\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "@@", backing: "\"@@\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "#>", backing: "\"#>\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "#>>", backing: "\"#>>\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "-", backing: "\"-\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "#-", backing: "\"#-\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, - Operator { symbol: "||", backing: "\"||\"", kind: Kind::BlockerOnly, restrict: None, join: None, commutator: None, negator: None }, + Operator { + symbol: "=", + backing: "eq", + kind: Kind::Symmetric, + restrict: Some("eqsel"), + join: Some("eqjoinsel"), + commutator: Some("="), + negator: Some("<>"), + }, + Operator { + symbol: "<>", + backing: "neq", + kind: Kind::Symmetric, + restrict: Some("neqsel"), + join: Some("neqjoinsel"), + commutator: Some("<>"), + negator: Some("="), + }, + Operator { + symbol: "<", + backing: "lt", + kind: Kind::Symmetric, + restrict: Some("scalarltsel"), + join: Some("scalarltjoinsel"), + commutator: Some(">"), + negator: Some(">="), + }, + Operator { + symbol: "<=", + backing: "lte", + kind: Kind::Symmetric, + restrict: Some("scalarlesel"), + join: Some("scalarlejoinsel"), + commutator: Some(">="), + negator: Some(">"), + }, + Operator { + symbol: ">", + backing: "gt", + kind: Kind::Symmetric, + restrict: Some("scalargtsel"), + join: Some("scalargtjoinsel"), + commutator: Some("<"), + negator: Some("<="), + }, + Operator { + symbol: ">=", + backing: "gte", + kind: Kind::Symmetric, + restrict: Some("scalargesel"), + join: Some("scalargejoinsel"), + commutator: Some("<="), + negator: Some("<"), + }, + Operator { + symbol: "@>", + backing: "contains", + kind: Kind::Symmetric, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "<@", + backing: "contained_by", + kind: Kind::Symmetric, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "->", + backing: "\"->\"", + kind: Kind::Path, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "->>", + backing: "\"->>\"", + kind: Kind::Path, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "?", + backing: "\"?\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "?|", + backing: "\"?|\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "?&", + backing: "\"?&\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "@?", + backing: "\"@?\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "@@", + backing: "\"@@\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "#>", + backing: "\"#>\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "#>>", + backing: "\"#>>\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "-", + backing: "\"-\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "#-", + backing: "\"#-\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, + Operator { + symbol: "||", + backing: "\"||\"", + kind: Kind::BlockerOnly, + restrict: None, + join: None, + commutator: None, + negator: None, + }, ]; #[cfg(test)] @@ -74,7 +234,10 @@ mod tests { #[test] fn operator_lists_match() { - assert_eq!(SYMMETRIC_OPERATORS, &["=", "<>", "<", "<=", ">", ">=", "@>", "<@"]); + assert_eq!( + SYMMETRIC_OPERATORS, + &["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] + ); assert_eq!(PATH_OPERATORS, &["->", "->>"]); assert_eq!( BLOCKER_ONLY_OPERATORS, @@ -84,7 +247,9 @@ mod tests { #[test] fn no_like_operators() { - assert!(OPERATORS.iter().all(|o| o.symbol != "~~" && o.symbol != "~~*")); + assert!(OPERATORS + .iter() + .all(|o| o.symbol != "~~" && o.symbol != "~~*")); } #[test] diff --git a/crates/eql-codegen/src/templates.rs b/crates/eql-codegen/src/templates.rs index df4e30658..484db6c8d 100644 --- a/crates/eql-codegen/src/templates.rs +++ b/crates/eql-codegen/src/templates.rs @@ -34,7 +34,10 @@ mod tests { use eql_scalars::CATALOG; fn spec(token: &str) -> &'static ScalarSpec { - CATALOG.iter().find(|s| s.token == token).expect("catalog token") + CATALOG + .iter() + .find(|s| s.token == token) + .expect("catalog token") } #[test] diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index 172c336de..7675af9fa 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -129,16 +129,25 @@ pub(crate) mod test_support { pub struct TempDir(PathBuf); impl TempDir { - pub fn path(&self) -> &Path { &self.0 } + pub fn path(&self) -> &Path { + &self.0 + } } impl Drop for TempDir { - fn drop(&mut self) { let _ = fs::remove_dir_all(&self.0); } + fn drop(&mut self) { + let _ = fs::remove_dir_all(&self.0); + } } pub fn tempdir() -> TempDir { let mut p = std::env::temp_dir(); let nanos = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH).unwrap().as_nanos(); - p.push(format!("eql-codegen-test-{nanos}-{:?}", std::thread::current().id())); + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos(); + p.push(format!( + "eql-codegen-test-{nanos}-{:?}", + std::thread::current().id() + )); fs::create_dir_all(&p).unwrap(); TempDir(p) } @@ -146,8 +155,8 @@ pub(crate) mod test_support { #[cfg(test)] mod tests { - use super::*; use super::test_support::tempdir as tmp; + use super::*; #[test] fn is_generated_true_for_header() { @@ -202,7 +211,11 @@ mod tests { let d = tmp(); let generated = d.path().join("int4_types.sql"); let hand = d.path().join("int4_eq_functions.sql"); - fs::write(&generated, format!("{AUTO_GENERATED_HEADER}-- old generated\n")).unwrap(); + fs::write( + &generated, + format!("{AUTO_GENERATED_HEADER}-- old generated\n"), + ) + .unwrap(); fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); let err = ensure_generated_paths_writable(&[generated.clone(), hand.clone()]).unwrap_err(); assert!(err.to_string().contains("int4_eq_functions.sql")); @@ -257,7 +270,11 @@ mod tests { fn is_generated_rs_true_for_rust_header() { let d = tmp(); let p = d.path().join("int4_values.rs"); - fs::write(&p, format!("{AUTO_GENERATED_HEADER_RS}pub const VALUES: &[i32] = &[];\n")).unwrap(); + fs::write( + &p, + format!("{AUTO_GENERATED_HEADER_RS}pub const VALUES: &[i32] = &[];\n"), + ) + .unwrap(); assert!(is_generated_rs(&p)); } diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index c05045862..87c27526b 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -9,15 +9,19 @@ use std::path::PathBuf; fn repo_root() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .parent().unwrap() - .parent().unwrap() + .parent() + .unwrap() + .parent() + .unwrap() .to_path_buf() } fn tempdir(tag: &str) -> PathBuf { let mut p = std::env::temp_dir(); let nanos = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH).unwrap().as_nanos(); + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos(); p.push(format!("eql-parity-{tag}-{nanos}")); fs::create_dir_all(&p).unwrap(); p @@ -52,14 +56,17 @@ fn rust_generator_matches_int4_golden_files() { let gen_dir = out.join("src/encrypted_domain/int4"); for entry in fs::read_dir(&ref_dir).unwrap() { let path = entry.unwrap().path(); - if path.extension().and_then(|e| e.to_str()) != Some("sql") { continue; } + if path.extension().and_then(|e| e.to_str()) != Some("sql") { + continue; + } let name = path.file_name().unwrap().to_str().unwrap(); let reference = fs::read_to_string(&path).unwrap(); // Strip the leading `-- REFERENCE:` provenance line. What remains is the // generated body, which already starts with the template-owned // `-- AUTOMATICALLY GENERATED FILE.` marker — the same first line the // materialised file carries, so no header is re-added here. - let expected: String = reference.lines() + let expected: String = reference + .lines() .skip_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) .map(|l| format!("{l}\n")) .collect(); diff --git a/tasks/codegen/templates.py b/tasks/codegen/templates.py index 0c446fec2..d79eb3ee7 100644 --- a/tasks/codegen/templates.py +++ b/tasks/codegen/templates.py @@ -13,24 +13,18 @@ term_json_keys, ) -AUTO_GENERATED_HEADER = ( - "-- AUTO-GENERATED — DO NOT EDIT.\n" - "-- Regenerated automatically by `mise run build`; " - "also `mise run codegen:domain ` to refresh one type.\n" - "-- Source of truth: tasks/codegen/types/.toml\n" - "-- This file is gitignored; never commit it.\n" -) - -# Rust counterpart of AUTO_GENERATED_HEADER. Unlike the gitignored SQL surface, -# the fixture-value const IS committed and verified by the CI staleness guard, -# so the wording differs deliberately. -AUTO_GENERATED_HEADER_RS = ( - "// AUTO-GENERATED — DO NOT EDIT.\n" - "// Regenerated by `mise run build` " - "(or `mise run codegen:domain `).\n" - "// Source of truth: tasks/codegen/types/.toml `[fixture] values`.\n" - "// This file IS committed and verified in CI (git diff --exit-code).\n" -) +# SQL generated-file marker, emitted as the first line of every generated SQL +# file. Must stay byte-identical to the Rust generator's AUTO_GENERATED_HEADER +# (crates/eql-codegen/src/consts.rs) so the two generators are at byte parity +# (mise run codegen:parity). The `^-- AUTOMATICALLY GENERATED FILE` first line +# is also what tasks/docs/validate/{coverage,required-tags}.sh grep on to skip +# generated SQL — keep this and that grep in lockstep. +AUTO_GENERATED_HEADER = "-- AUTOMATICALLY GENERATED FILE.\n" + +# Rust counterpart, prepended to the committed `_values.rs` (which has no +# template). Rust comment syntax (`//`) so the `.rs` file stays valid; must stay +# byte-identical to the Rust generator's AUTO_GENERATED_HEADER_RS. +AUTO_GENERATED_HEADER_RS = "// AUTOMATICALLY GENERATED FILE.\n" ENVELOPE_KEYS = ["v", "i"] CIPHERTEXT_KEY = "c" diff --git a/tasks/codegen/test_templates.py b/tasks/codegen/test_templates.py index 7f30e4cb4..221dcd9b3 100644 --- a/tasks/codegen/test_templates.py +++ b/tasks/codegen/test_templates.py @@ -24,16 +24,17 @@ def test_auto_generated_header_present(): - assert "AUTO-GENERATED" in AUTO_GENERATED_HEADER - assert "DO NOT EDIT" in AUTO_GENERATED_HEADER + # Byte-identical to the Rust generator's marker + # (crates/eql-codegen/src/consts.rs) and to the `^-- AUTOMATICALLY GENERATED + # FILE` prefix that tasks/docs/validate/*.sh grep on to skip generated SQL. + assert AUTO_GENERATED_HEADER == "-- AUTOMATICALLY GENERATED FILE.\n" + assert "AUTOMATICALLY GENERATED FILE" in AUTO_GENERATED_HEADER -def test_rust_header_is_comment_and_marks_committed(): - # Rust uses // comments, not SQL's --, and unlike the gitignored SQL - # surface this file is committed and CI-verified. - assert AUTO_GENERATED_HEADER_RS.startswith("// AUTO-GENERATED") - assert "DO NOT EDIT" in AUTO_GENERATED_HEADER_RS - assert "committed" in AUTO_GENERATED_HEADER_RS +def test_rust_header_is_a_rust_comment(): + # Rust uses // comments, not SQL's --. Byte-identical to the Rust + # generator's AUTO_GENERATED_HEADER_RS (crates/eql-codegen/src/consts.rs). + assert AUTO_GENERATED_HEADER_RS == "// AUTOMATICALLY GENERATED FILE.\n" # No line is an SQL-style (`--`) comment — this is Rust, not SQL. assert not any( line.startswith("--") for line in AUTO_GENERATED_HEADER_RS.splitlines() @@ -55,8 +56,8 @@ def test_render_fixture_values_rs_emits_typed_const(): assert " -1,\n" in body assert " 0,\n" in body # ZERO and "1" both literal assert " 1,\n" in body - # No AUTO-GENERATED header in the body — the writer prepends it. - assert "AUTO-GENERATED" not in body + # No generated-file marker in the body — the writer prepends it. + assert "AUTOMATICALLY GENERATED FILE" not in body def test_render_fixture_values_rs_preserves_manifest_order(): From 053b373680935e2878c80c60e12308770dddb9cc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 17:05:28 +1000 Subject: [PATCH 033/599] fix(codegen): address CodeRabbit review findings on generator parity - Point generated values.rs header at eql-scalars::CATALOG, not deleted TOML - Cover int2 in scalar_family_inlinable_operators_are_clean lint test - codegen-parity.sh: catch untracked generated values.rs via git status - main.rs: make non-zero Ok exit-code arm an explicit FAILURE - Fix stale fixture.rs breadcrumb in cipherstash.rs to int4.rs - FIXTURE_SCHEMA.md: int4 fixture is now 17 rows incl signed extremes + zero --- crates/eql-codegen/src/main.rs | 4 ++-- crates/eql-codegen/src/templates.rs | 4 ++-- tasks/codegen-parity.sh | 9 ++++++++- tests/codegen/reference/int4/int4_values.rs | 2 +- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 15 +++++++++------ tests/sqlx/src/fixtures/cipherstash.rs | 2 +- tests/sqlx/src/fixtures/int2_values.rs | 2 +- tests/sqlx/src/fixtures/int4_values.rs | 2 +- tests/sqlx/tests/lint_tests.rs | 2 +- 9 files changed, 26 insertions(+), 16 deletions(-) diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index 6e88340e4..b1b96de8e 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -30,10 +30,10 @@ fn main() -> ExitCode { // No args: generate every type's SQL + _values.rs. match generate_all(&repo_root()) { Ok(0) => return ExitCode::SUCCESS, - Ok(code) => return ExitCode::from(code.clamp(0, 255) as u8), + Ok(_) => return ExitCode::FAILURE, // any non-zero codegen result is a failure Err(e) => { eprintln!("error: {e}"); - return ExitCode::from(1); + return ExitCode::FAILURE; } } } diff --git a/crates/eql-codegen/src/templates.rs b/crates/eql-codegen/src/templates.rs index 484db6c8d..1f2a33e39 100644 --- a/crates/eql-codegen/src/templates.rs +++ b/crates/eql-codegen/src/templates.rs @@ -17,7 +17,7 @@ pub fn render_fixture_values_rs(spec: &ScalarSpec) -> String { format!( "//! Fixture plaintext values for the {token} encrypted-domain family.\n\ //!\n\ - //! Generated from tasks/codegen/types/{token}.toml `[fixture] values` —\n\ + //! Generated from the `{token}` row in `eql-scalars::CATALOG` (`fixtures`) —\n\ //! the single source of truth shared by the fixture generator\n\ //! (`fixtures::eql_v2_{token}`) and the matrix oracle\n\ //! (`ScalarType::FIXTURE_VALUES`).\n\n\ @@ -44,7 +44,7 @@ mod tests { fn fixture_values_rs_emits_typed_const_for_int4() { let body = render_fixture_values_rs(spec("int4")); assert!(body.contains("pub const VALUES: &[i32] = &[")); - assert!(body.contains("tasks/codegen/types/int4.toml")); + assert!(body.contains("eql-scalars::CATALOG")); assert!(body.contains(" i32::MIN,\n")); assert!(body.contains(" i32::MAX,\n")); assert!(body.contains(" -1,\n")); diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh index ff3a90a63..1f8d1e10d 100755 --- a/tasks/codegen-parity.sh +++ b/tasks/codegen-parity.sh @@ -21,6 +21,13 @@ for f in tests/codegen/reference/int4/*.sql; do done echo "==> Verifying committed _values.rs are byte-identical (git clean)" -git diff --exit-code -- tests/sqlx/src/fixtures/*_values.rs +# `git diff` only catches modifications to tracked files; a newly-generated but +# uncommitted _values.rs would slip through. `git status --porcelain` also +# reports untracked files, mirroring the CI codegen job. +if [ -n "$(git status --porcelain -- tests/sqlx/src/fixtures/)" ]; then + echo "values.rs stale or uncommitted after regeneration" >&2 + git status --porcelain -- tests/sqlx/src/fixtures/ >&2 + exit 1 +fi echo "PARITY OK: Rust generator matches the int4 golden (normalized) and committed values.rs." diff --git a/tests/codegen/reference/int4/int4_values.rs b/tests/codegen/reference/int4/int4_values.rs index 3e6b1ec68..77a69ad03 100644 --- a/tests/codegen/reference/int4/int4_values.rs +++ b/tests/codegen/reference/int4/int4_values.rs @@ -1,7 +1,7 @@ // REFERENCE: hand-reviewed parity baseline for tasks/codegen/ — see ../README.md //! Fixture plaintext values for the int4 encrypted-domain family. //! -//! Generated from tasks/codegen/types/int4.toml `[fixture] values` — +//! Generated from the `int4` row in `eql-scalars::CATALOG` (`fixtures`) — //! the single source of truth shared by the fixture generator //! (`fixtures::eql_v2_int4`) and the matrix oracle //! (`ScalarType::FIXTURE_VALUES`). diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index f01edce7e..c8122b062 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -191,9 +191,11 @@ CREATE TABLE bench ( ## eql_v2_int4.sql -**Purpose:** 14 encrypted integers for verifying encrypted-integer fixture -structure. Unlike its neighbours, this is a **generated** fixture — produced by -`mise run fixture:generate eql_v2_int4` (the Rust fixture framework in +**Purpose:** 17 encrypted integers for verifying encrypted-integer fixture +structure. The set MUST include the signed extremes (`i32::MIN`/`i32::MAX`) and +zero — they are the matrix comparison pivots, which is why the count grew from +14 to 17. Unlike its neighbours, this is a **generated** fixture — produced by +`mise run fixture:generate:all` (the Rust fixture framework in `tests/sqlx/src/fixtures/`) and **not committed** (see `.gitignore`). It is plain SQL with **no EQL dependency**: `payload` is `jsonb`, so the script applies standalone. @@ -220,9 +222,10 @@ CREATE TABLE fixtures.eql_v2_int4 ( ``` **Data:** -- 14 rows, ids 1-14; `id = N` is the Nth generated value. -- `plaintext` values: `-100, -1, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999` - — a negative boundary plus small/medium/large/extreme magnitudes. +- 17 rows, ids 1-17; `id = N` is the Nth generated value. +- `plaintext` values: `i32::MIN, -100, -1, 0, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999, i32::MAX` + — the signed extremes and zero (matrix comparison pivots) plus + small/medium/large magnitudes. - `plaintext` is the **in-table oracle**: consuming tests filter `WHERE plaintext = N` directly, so no Rust value constant is shared. - Each `payload` is a cipherstash-client-encrypted JSONB object carrying diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index d7a8e8ca4..303e39973 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -294,7 +294,7 @@ mod live_tests { /// Assert the well-formed Store shape: the payload is a JSON object /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields. Mirrors the - /// per-key assertions in `tests/encrypted_domain/scalars/int4/fixture.rs`. + /// per-key assertions in `tests/sqlx/tests/encrypted_domain/scalars/int4.rs`. fn assert_store_shape(payload: &Value) { let obj = payload.as_object().expect("payload must be a JSON object"); for key in ["v", "c", "hm", "ob", "i"] { diff --git a/tests/sqlx/src/fixtures/int2_values.rs b/tests/sqlx/src/fixtures/int2_values.rs index 4ff2db389..a1c0a8477 100644 --- a/tests/sqlx/src/fixtures/int2_values.rs +++ b/tests/sqlx/src/fixtures/int2_values.rs @@ -1,7 +1,7 @@ // AUTOMATICALLY GENERATED FILE. //! Fixture plaintext values for the int2 encrypted-domain family. //! -//! Generated from tasks/codegen/types/int2.toml `[fixture] values` — +//! Generated from the `int2` row in `eql-scalars::CATALOG` (`fixtures`) — //! the single source of truth shared by the fixture generator //! (`fixtures::eql_v2_int2`) and the matrix oracle //! (`ScalarType::FIXTURE_VALUES`). diff --git a/tests/sqlx/src/fixtures/int4_values.rs b/tests/sqlx/src/fixtures/int4_values.rs index c9c48b304..d0c31a63a 100644 --- a/tests/sqlx/src/fixtures/int4_values.rs +++ b/tests/sqlx/src/fixtures/int4_values.rs @@ -1,7 +1,7 @@ // AUTOMATICALLY GENERATED FILE. //! Fixture plaintext values for the int4 encrypted-domain family. //! -//! Generated from tasks/codegen/types/int4.toml `[fixture] values` — +//! Generated from the `int4` row in `eql-scalars::CATALOG` (`fixtures`) — //! the single source of truth shared by the fixture generator //! (`fixtures::eql_v2_int4`) and the matrix oracle //! (`ScalarType::FIXTURE_VALUES`). diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index 0387e396a..a7f9152db 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -19,7 +19,7 @@ use sqlx::PgPool; /// materialised. Extending the family (e.g. when `int8`/`bool`/`date` /// land) is a one-line array extension here — every downstream /// parameterised test picks it up automatically. -const SCALAR_PG_TYPES: &[&str] = &["int4"]; +const SCALAR_PG_TYPES: &[&str] = &["int4", "int2"]; #[derive(Debug, sqlx::FromRow)] struct LintRow { From 1af9bac921cf9e98acdc2f0e1e21edea3b16d6ad Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 20:48:06 +1000 Subject: [PATCH 034/599] refactor(codegen): model operator surface as a central PostgreSQL catalog Replace the generic `Kind` enum (Symmetric/Path/BlockerOnly) and the parallel `SYMMETRIC_OPERATORS`/`PATH_OPERATORS`/`BLOCKER_ONLY_OPERATORS` slices + per-shape helpers with a single `OPERATORS` catalog where each operator carries strongly-typed PostgreSQL signatures and pure-data planner metadata. - operator_surface.rs: add `TypeSlot`, `OperatorSignature`, `RenderedSignature`, and `OperatorMetadata`; each `Operator` now owns its `signatures` and `metadata`. Rename `backing` -> `function_name` and `backing_function` -> `operator_function_name`. Delete `Kind` and the three category slices. - generate.rs: `render_functions_file`/`render_operators_file` iterate the catalog x signatures and choose wrapper vs unsupported-operator entries per domain from `Term::operators_for_terms`. Remove the category loops and `*_shapes` helpers; preserve the `selector` param name for `->`/`->>` via a small `arg_b_name` helper. - context.rs: `operator_entry` takes `&Operator` and renders metadata only when the domain supports the operator; rename `FnEntry::Blocker` -> `Unsupported` and `blocker_entry` -> `unsupported_entry`. Generated SQL is byte-identical (codegen:parity passes); blocking is now a per-domain emission decision rather than a static operator category. Adds direct unit tests for metadata gating, the selector naming, the jsonpath/text[] slots, and a non-empty-signatures catalog invariant. Spec: docs/development/operator-surface-generation-spec.md --- crates/eql-codegen/src/context.rs | 82 +-- crates/eql-codegen/src/generate.rs | 173 +++--- crates/eql-codegen/src/operator_surface.rs | 592 ++++++++++++++------- 3 files changed, 512 insertions(+), 335 deletions(-) diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 83eb52e9d..cdb68e67b 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -1,6 +1,7 @@ //! minijinja environment + serde context structs + relocated logic helpers. use crate::consts::*; +use crate::operator_surface::Operator; use eql_scalars::{DomainSpec, Term}; /// Line-normalize SQL for best-effort byte-exact comparison: trim each line's @@ -77,8 +78,8 @@ pub fn domain_block(token: &str, domain: &DomainSpec) -> DomainBlock { } } -/// One SQL parameter (name + SQL type), shared by wrapper/blocker signatures -/// and their `@param` docs tags. +/// One SQL parameter (name + SQL type), shared by wrapper and +/// unsupported-operator signatures and their `@param` docs tags. #[derive(serde::Serialize)] pub struct SqlParam { pub name: &'static str, // "a", "b", or "selector" @@ -86,7 +87,8 @@ pub struct SqlParam { } /// One generated function entry. The serde tag drives the template's three-way -/// switch; the blocker arm is never merged with the others (footgun separation). +/// switch; the unsupported-operator arm is never merged with the others (footgun +/// separation — its body must always raise). #[derive(serde::Serialize)] #[serde(tag = "kind")] pub enum FnEntry { @@ -102,7 +104,7 @@ pub enum FnEntry { call_a: String, // e.g. eql_v3.eq_term(a) (embeds extract_arg cast logic) call_b: String, // e.g. eql_v3.eq_term(b::eql_v3.int4_eq) }, - Blocker { + Unsupported { operator_lit: String, // sql_str(op), escaped content for the RAISE literal function_name: String, // e.g. lt / "->" / "#>" args: [SqlParam; 2], @@ -132,10 +134,10 @@ pub fn extractor_entry(term: Term) -> FnEntry { /// Build an inlinable comparison-wrapper entry for a supported operator. /// `dom` is the schema-qualified domain name. pub fn wrapper_entry(dom: &str, op: &str, arg_a: &str, arg_b: &str, extractor: &str) -> FnEntry { - use crate::operator_surface::backing_function; + use crate::operator_surface::operator_function_name; FnEntry::Wrapper { op: op.to_string(), - function_name: backing_function(op).to_string(), + function_name: operator_function_name(op).to_string(), args: [ SqlParam { name: "a", @@ -151,14 +153,14 @@ pub fn wrapper_entry(dom: &str, op: &str, arg_a: &str, arg_b: &str, extractor: & } } -/// Build an unsupported-operator blocker entry. Every blocker shares one -/// uniform `RAISE EXCEPTION` body; only signature facts vary. -pub fn blocker_entry(op: &str, args: [SqlParam; 2], returns: &str) -> FnEntry { - use crate::operator_surface::backing_function; - FnEntry::Blocker { +/// Build an unsupported-operator entry. Every such entry shares one uniform +/// `RAISE EXCEPTION` body; only signature facts vary. +pub fn unsupported_entry(op: &str, args: [SqlParam; 2], returns: &str) -> FnEntry { + use crate::operator_surface::operator_function_name; + FnEntry::Unsupported { // operator_lit is sql_str-escaped defensively for the single-quoted RAISE literal. operator_lit: sql_str(op), - function_name: backing_function(op).to_string(), + function_name: operator_function_name(op).to_string(), args, returns: returns.to_string(), } @@ -183,39 +185,18 @@ pub struct OperatorsContext { pub operators: Vec, } -/// Build one CREATE OPERATOR entry. The metadata line exists only for supported -/// symmetric operators that carry at least one extra (the `@>`/`<@` symmetric- -/// but-empty trap collapses to `None`). -pub fn operator_entry( - op: &str, - function_name: &str, - leftarg: &str, - rightarg: &str, - supported: bool, -) -> OpEntry { - use crate::operator_surface::{operator, Kind}; - let meta = operator(op); - let metadata = if supported && meta.kind == Kind::Symmetric { - let mut extras = Vec::new(); - if let Some(c) = meta.commutator { - extras.push(format!("COMMUTATOR = {c}")); - } - if let Some(n) = meta.negator { - extras.push(format!("NEGATOR = {n}")); - } - if let Some(r) = meta.restrict { - extras.push(format!("RESTRICT = {r}")); - } - if let Some(j) = meta.join { - extras.push(format!("JOIN = {j}")); - } - (!extras.is_empty()).then(|| extras.join(", ")) // empty → None (the @>/<@ trap) +/// Build one CREATE OPERATOR entry. Planner metadata is emitted only when the +/// current domain supports the operator and the operator carries metadata (the +/// `@>`/`<@` empty-metadata case collapses to `None`). +pub fn operator_entry(op: &Operator, leftarg: &str, rightarg: &str, supported: bool) -> OpEntry { + let metadata = if supported { + op.metadata.render() } else { None }; OpEntry { - symbol: op.to_string(), - function_name: function_name.to_string(), + symbol: op.symbol.to_string(), + function_name: op.function_name.to_string(), leftarg: leftarg.to_string(), rightarg: rightarg.to_string(), metadata, @@ -329,4 +310,23 @@ mod tests { assert!(env.get_template(name).is_ok(), "missing template {name}"); } } + + #[test] + fn operator_entry_emits_metadata_only_when_supported() { + use crate::operator_surface::operator; + // Supported comparison operator carries its planner metadata. + let eq = operator_entry(&operator("="), "eql_v3.int4_eq", "eql_v3.int4_eq", true); + assert_eq!(eq.symbol, "="); + assert_eq!(eq.function_name, "eq"); + assert_eq!( + eq.metadata.as_deref(), + Some("COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel") + ); + // The same operator, unsupported on this domain → no metadata line. + let eq_unsupported = operator_entry(&operator("="), "eql_v3.int4", "eql_v3.int4", false); + assert_eq!(eq_unsupported.metadata, None); + // Supported but metadata-less operator (`@>`) → still no metadata line. + let contains = operator_entry(&operator("@>"), "eql_v3.int4_eq", "eql_v3.int4_eq", true); + assert_eq!(contains.metadata, None); + } } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 6cbd259a3..c76255458 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -5,55 +5,21 @@ use std::path::{Path, PathBuf}; use eql_scalars::{DomainSpec, ScalarSpec, Term}; use crate::context::{domain_name, is_ord_capable}; -use crate::operator_surface::{ - backing_function, BLOCKER_ONLY_OPERATORS, PATH_OPERATORS, SYMMETRIC_OPERATORS, -}; +use crate::operator_surface::OPERATORS; /// The full domain name (token + suffix). suffix "" => bare token. fn full_name(token: &str, suffix: &str) -> String { format!("{token}{suffix}") } -/// Symmetric-operator argument shapes. Port of `_symmetric_shapes`. -fn symmetric_shapes(dom: &str) -> Vec<(String, String)> { - vec![ - (dom.to_string(), dom.to_string()), - (dom.to_string(), "jsonb".to_string()), - ("jsonb".to_string(), dom.to_string()), - ] -} - -/// Path-operator argument shapes. Port of `_path_shapes`. -fn path_shapes(dom: &str) -> Vec<(String, String)> { - vec![ - (dom.to_string(), "text".to_string()), - (dom.to_string(), "integer".to_string()), - ("jsonb".to_string(), dom.to_string()), - ] -} - -/// Blocker-only argument shapes for a native jsonb operator. -/// Port of `_blocker_only_shapes`. Returns (arg_a, arg_b, returns). -fn blocker_only_shapes(dom: &str, op: &str) -> Vec<(String, String, String)> { - let d = dom.to_string(); - match op { - "?" => vec![(d, "text".into(), "boolean".into())], - "?|" | "?&" => vec![(d, "text[]".into(), "boolean".into())], - "@?" | "@@" => vec![(d, "jsonpath".into(), "boolean".into())], - "#>" => vec![(d, "text[]".into(), "jsonb".into())], - "#>>" => vec![(d, "text[]".into(), "text".into())], - "-" => vec![ - (d.clone(), "text".into(), "jsonb".into()), - (d.clone(), "integer".into(), "jsonb".into()), - (d, "text[]".into(), "jsonb".into()), - ], - "#-" => vec![(d, "text[]".into(), "jsonb".into())], - "||" => vec![ - (d.clone(), d.clone(), "jsonb".into()), - (d.clone(), "jsonb".into(), "jsonb".into()), - ("jsonb".into(), d, "jsonb".into()), - ], - other => panic!("unhandled blocker-only operator: {other}"), +/// The second-parameter name for an operator's generated signature. The `->` and +/// `->>` path operators take a path *selector* as their right operand; every +/// other operator uses the generic `b`. This is a naming convention only — it +/// has no bearing on whether the operator is supported. +fn arg_b_name(symbol: &str) -> &'static str { + match symbol { + "->" | "->>" => "selector", + _ => "b", } } @@ -125,7 +91,7 @@ fn extractor_terms(terms: &[Term]) -> Vec { pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { use crate::consts::sql_str; use crate::context::{ - blocker_entry, environment, extractor_entry, wrapper_entry, FunctionsContext, SqlParam, + environment, extractor_entry, unsupported_entry, wrapper_entry, FunctionsContext, SqlParam, }; let name = full_name(token, domain.suffix); let dom = domain_name(&name); @@ -137,61 +103,33 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { for term in extractor_terms(domain.terms) { entries.push(extractor_entry(term)); } - for &op in SYMMETRIC_OPERATORS { - let extractor = Term::extractor_for_operator(domain.terms, op); - for (arg_a, arg_b) in symmetric_shapes(&dom) { - if is_supported(op) { + for op in OPERATORS { + let extractor = Term::extractor_for_operator(domain.terms, op.symbol); + for sig in op.signatures { + let rendered = sig.render(&dom); + if is_supported(op.symbol) { if let Some(ex) = extractor { - entries.push(wrapper_entry(&dom, op, &arg_a, &arg_b, ex)); + entries.push(wrapper_entry( + &dom, + op.symbol, + &rendered.left, + &rendered.right, + ex, + )); continue; } } let args = [ SqlParam { name: "a", - ty: arg_a, - }, - SqlParam { - name: "b", - ty: arg_b, - }, - ]; - entries.push(blocker_entry(op, args, "boolean")); - } - } - for &op in PATH_OPERATORS { - for (arg_a, arg_b) in path_shapes(&dom) { - let returns = if op == "->>" { - "text".to_string() - } else { - dom.clone() - }; - let args = [ - SqlParam { - name: "a", - ty: arg_a, - }, - SqlParam { - name: "selector", - ty: arg_b, - }, - ]; - entries.push(blocker_entry(op, args, &returns)); - } - } - for &op in BLOCKER_ONLY_OPERATORS { - for (arg_a, arg_b, returns) in blocker_only_shapes(&dom, op) { - let args = [ - SqlParam { - name: "a", - ty: arg_a, + ty: rendered.left, }, SqlParam { - name: "b", - ty: arg_b, + name: arg_b_name(op.symbol), + ty: rendered.right, }, ]; - entries.push(blocker_entry(op, args, &returns)); + entries.push(unsupported_entry(op.symbol, args, &rendered.returns)); } } @@ -219,22 +157,17 @@ pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { let is_supported = |op: &str| supported.contains(&op); let mut operators = Vec::new(); - for &op in SYMMETRIC_OPERATORS { - let function_name = backing_function(op); - for (l, r) in symmetric_shapes(&dom) { - operators.push(operator_entry(op, function_name, &l, &r, is_supported(op))); - } - } - for &op in PATH_OPERATORS { - let function_name = backing_function(op); - for (l, r) in path_shapes(&dom) { - operators.push(operator_entry(op, function_name, &l, &r, false)); - } - } - for &op in BLOCKER_ONLY_OPERATORS { - let function_name = backing_function(op); - for (l, r, _ret) in blocker_only_shapes(&dom, op) { - operators.push(operator_entry(op, function_name, &l, &r, false)); + for op in OPERATORS { + for sig in op.signatures { + // CREATE OPERATOR only needs the operand types; `rendered.returns` is + // intentionally discarded here (it matters only for the function body). + let rendered = sig.render(&dom); + operators.push(operator_entry( + op, + &rendered.left, + &rendered.right, + is_supported(op.symbol), + )); } } @@ -428,6 +361,28 @@ mod tests { panic!("unrecognised reference filename: {name}"); } + #[test] + fn arg_b_name_is_selector_only_for_path_operators() { + assert_eq!(arg_b_name("->"), "selector"); + assert_eq!(arg_b_name("->>"), "selector"); + assert_eq!(arg_b_name("="), "b"); + assert_eq!(arg_b_name("||"), "b"); + assert_eq!(arg_b_name("@>"), "b"); + } + + #[test] + fn functions_render_supported_wrappers_and_unsupported_entries_from_catalog() { + let s = spec("int4"); + let d = domain(s, "_eq"); + let sql = render_functions_file("int4", d); + assert!(sql.contains("CREATE FUNCTION eql_v3.eq(")); + assert!(sql.contains("AS $$ SELECT")); + assert!(sql.contains("CREATE FUNCTION eql_v3.lt(")); + assert!(sql.contains("RAISE EXCEPTION 'operator % is not supported for %', '<'")); + assert!(sql.contains("CREATE FUNCTION eql_v3.\"->\"(")); + assert!(sql.contains("RAISE EXCEPTION 'operator % is not supported for %', '->'")); + } + #[test] fn types_file_normalized_matches_golden() { use crate::context::normalize_sql; @@ -747,12 +702,12 @@ mod tests { // --- Escaping guards over the context builders (synthetic inputs) --- #[test] - fn blocker_entry_preserves_operator_literal_and_domain_lit_is_escaped() { + fn unsupported_entry_preserves_operator_literal_and_domain_lit_is_escaped() { use crate::consts::sql_str; - use crate::context::{blocker_entry, FnEntry, SqlParam}; + use crate::context::{unsupported_entry, FnEntry, SqlParam}; let dom = "eql_v3.o'dom"; let domain_lit = sql_str(dom); - let entry = blocker_entry( + let entry = unsupported_entry( "<", [ SqlParam { @@ -767,11 +722,11 @@ mod tests { "boolean", ); match entry { - FnEntry::Blocker { operator_lit, .. } => { + FnEntry::Unsupported { operator_lit, .. } => { assert_eq!(domain_lit, "eql_v3.o''dom"); // quote doubled by sql_str assert_eq!(operator_lit, "<"); } - _ => panic!("expected blocker"), + _ => panic!("expected unsupported-operator entry"), } } diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index 772ac3582..38f1ec192 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -4,25 +4,179 @@ #[derive(Clone, Copy)] pub struct Operator { pub symbol: &'static str, - pub backing: &'static str, - pub kind: Kind, + pub function_name: &'static str, + pub signatures: &'static [OperatorSignature], + pub metadata: OperatorMetadata, +} + +/// Optional `CREATE OPERATOR` planner metadata. Pure data — whether it is +/// emitted is a per-domain decision (supported operators only), not a property +/// of the operator's category. +#[derive(Clone, Copy)] +pub struct OperatorMetadata { pub restrict: Option<&'static str>, pub join: Option<&'static str>, pub commutator: Option<&'static str>, pub negator: Option<&'static str>, } +impl OperatorMetadata { + /// Metadata with no planner hints — the common case for operators that carry + /// no commutator/negator/selectivity estimators. + pub const fn none() -> Self { + Self { + restrict: None, + join: None, + commutator: None, + negator: None, + } + } + + /// Render the `CREATE OPERATOR` metadata clause, or `None` when no hint is + /// present (the `@>`/`<@` symmetric-but-empty case collapses to `None`). + pub fn render(self) -> Option { + let mut extras = Vec::new(); + if let Some(c) = self.commutator { + extras.push(format!("COMMUTATOR = {c}")); + } + if let Some(n) = self.negator { + extras.push(format!("NEGATOR = {n}")); + } + if let Some(r) = self.restrict { + extras.push(format!("RESTRICT = {r}")); + } + if let Some(j) = self.join { + extras.push(format!("JOIN = {j}")); + } + (!extras.is_empty()).then(|| extras.join(", ")) + } +} + +/// A type position in a PostgreSQL operator overload. `Domain` renders to the +/// concrete encrypted domain being generated; every other slot renders to a +/// fixed PostgreSQL type name. #[derive(Clone, Copy, PartialEq, Eq)] -pub enum Kind { - Symmetric, - Path, - BlockerOnly, +pub enum TypeSlot { + Domain, + Jsonb, + Text, + Integer, + TextArray, + Jsonpath, + Boolean, +} + +impl TypeSlot { + fn render(self, dom: &str) -> String { + match self { + TypeSlot::Domain => dom.to_string(), + TypeSlot::Jsonb => "jsonb".to_string(), + TypeSlot::Text => "text".to_string(), + TypeSlot::Integer => "integer".to_string(), + TypeSlot::TextArray => "text[]".to_string(), + TypeSlot::Jsonpath => "jsonpath".to_string(), + TypeSlot::Boolean => "boolean".to_string(), + } + } } -pub const SYMMETRIC_OPERATORS: &[&str] = &["=", "<>", "<", "<=", ">", ">=", "@>", "<@"]; -pub const PATH_OPERATORS: &[&str] = &["->", "->>"]; -pub const BLOCKER_ONLY_OPERATORS: &[&str] = - &["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"]; +/// One PostgreSQL-shaped operator overload: left/right argument slots and the +/// return slot. +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct OperatorSignature { + pub left: TypeSlot, + pub right: TypeSlot, + pub returns: TypeSlot, +} + +/// An `OperatorSignature` with every slot resolved to a concrete SQL type name. +pub struct RenderedSignature { + pub left: String, + pub right: String, + pub returns: String, +} + +impl OperatorSignature { + pub fn render(self, dom: &str) -> RenderedSignature { + RenderedSignature { + left: self.left.render(dom), + right: self.right.render(dom), + returns: self.returns.render(dom), + } + } +} + +/// Terse constructor for the static signature tables below. +const fn sig(left: TypeSlot, right: TypeSlot, returns: TypeSlot) -> OperatorSignature { + OperatorSignature { + left, + right, + returns, + } +} + +/// Symmetric boolean overloads (`domain`/`jsonb` convenience pairs), shared by +/// `=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`. +const BOOL_SYMMETRIC_SIGNATURES: &[OperatorSignature] = &[ + sig(TypeSlot::Domain, TypeSlot::Domain, TypeSlot::Boolean), + sig(TypeSlot::Domain, TypeSlot::Jsonb, TypeSlot::Boolean), + sig(TypeSlot::Jsonb, TypeSlot::Domain, TypeSlot::Boolean), +]; + +/// `->` path-selector overloads (returns the domain). +const ARROW_SIGNATURES: &[OperatorSignature] = &[ + sig(TypeSlot::Domain, TypeSlot::Text, TypeSlot::Domain), + sig(TypeSlot::Domain, TypeSlot::Integer, TypeSlot::Domain), + sig(TypeSlot::Jsonb, TypeSlot::Domain, TypeSlot::Domain), +]; + +/// `->>` path-selector overloads (returns text). +const ARROW_TEXT_SIGNATURES: &[OperatorSignature] = &[ + sig(TypeSlot::Domain, TypeSlot::Text, TypeSlot::Text), + sig(TypeSlot::Domain, TypeSlot::Integer, TypeSlot::Text), + sig(TypeSlot::Jsonb, TypeSlot::Domain, TypeSlot::Text), +]; + +/// `?` key-existence overload. +const HAS_KEY_SIGNATURES: &[OperatorSignature] = + &[sig(TypeSlot::Domain, TypeSlot::Text, TypeSlot::Boolean)]; + +/// `?|` / `?&` any/all-keys overloads. +const HAS_ANY_KEYS_SIGNATURES: &[OperatorSignature] = &[sig( + TypeSlot::Domain, + TypeSlot::TextArray, + TypeSlot::Boolean, +)]; + +/// `@?` / `@@` jsonpath-predicate overloads. +const JSONPATH_SIGNATURES: &[OperatorSignature] = + &[sig(TypeSlot::Domain, TypeSlot::Jsonpath, TypeSlot::Boolean)]; + +/// `#>` path-extract overload (returns jsonb). +const PATH_EXTRACT_JSONB_SIGNATURES: &[OperatorSignature] = + &[sig(TypeSlot::Domain, TypeSlot::TextArray, TypeSlot::Jsonb)]; + +/// `#>>` path-extract overload (returns text). +const PATH_EXTRACT_TEXT_SIGNATURES: &[OperatorSignature] = + &[sig(TypeSlot::Domain, TypeSlot::TextArray, TypeSlot::Text)]; + +/// `-` delete-key overloads. +const DELETE_SIGNATURES: &[OperatorSignature] = &[ + sig(TypeSlot::Domain, TypeSlot::Text, TypeSlot::Jsonb), + sig(TypeSlot::Domain, TypeSlot::Integer, TypeSlot::Jsonb), + sig(TypeSlot::Domain, TypeSlot::TextArray, TypeSlot::Jsonb), +]; + +/// `#-` delete-path overload. +const DELETE_PATH_SIGNATURES: &[OperatorSignature] = + &[sig(TypeSlot::Domain, TypeSlot::TextArray, TypeSlot::Jsonb)]; + +/// `||` concatenation overloads (`domain`/`jsonb` convenience pairs). +const CONCAT_SIGNATURES: &[OperatorSignature] = &[ + sig(TypeSlot::Domain, TypeSlot::Domain, TypeSlot::Jsonb), + sig(TypeSlot::Domain, TypeSlot::Jsonb, TypeSlot::Jsonb), + sig(TypeSlot::Jsonb, TypeSlot::Domain, TypeSlot::Jsonb), +]; /// Look up the operator metadata for a symbol. Panics on an unknown symbol — /// the generator only ever passes catalog symbols, matching Python's KeyError. @@ -34,192 +188,148 @@ pub fn operator(symbol: &str) -> Operator { .unwrap_or_else(|| panic!("unknown operator symbol: {symbol}")) } -/// The eql_v2 backing function name for an operator symbol. -pub fn backing_function(symbol: &str) -> &'static str { - operator(symbol).backing +/// The generated SQL function name for an operator symbol (e.g. `eq`, `"->"`). +pub fn operator_function_name(symbol: &str) -> &'static str { + operator(symbol).function_name } -/// The 20-operator table. Order matches the SYMMETRIC/PATH/BLOCKER_ONLY lists. +/// Comparison-operator metadata (commutator/negator/selectivity estimators). +const fn cmp_metadata( + restrict: &'static str, + join: &'static str, + commutator: &'static str, + negator: &'static str, +) -> OperatorMetadata { + OperatorMetadata { + restrict: Some(restrict), + join: Some(join), + commutator: Some(commutator), + negator: Some(negator), + } +} + +/// The 20-operator catalog. Order is: comparison operators, then path-selector +/// operators, then the remaining native jsonb operators. pub const OPERATORS: &[Operator] = &[ Operator { symbol: "=", - backing: "eq", - kind: Kind::Symmetric, - restrict: Some("eqsel"), - join: Some("eqjoinsel"), - commutator: Some("="), - negator: Some("<>"), + function_name: "eq", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: cmp_metadata("eqsel", "eqjoinsel", "=", "<>"), }, Operator { symbol: "<>", - backing: "neq", - kind: Kind::Symmetric, - restrict: Some("neqsel"), - join: Some("neqjoinsel"), - commutator: Some("<>"), - negator: Some("="), + function_name: "neq", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: cmp_metadata("neqsel", "neqjoinsel", "<>", "="), }, Operator { symbol: "<", - backing: "lt", - kind: Kind::Symmetric, - restrict: Some("scalarltsel"), - join: Some("scalarltjoinsel"), - commutator: Some(">"), - negator: Some(">="), + function_name: "lt", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: cmp_metadata("scalarltsel", "scalarltjoinsel", ">", ">="), }, Operator { symbol: "<=", - backing: "lte", - kind: Kind::Symmetric, - restrict: Some("scalarlesel"), - join: Some("scalarlejoinsel"), - commutator: Some(">="), - negator: Some(">"), + function_name: "lte", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: cmp_metadata("scalarlesel", "scalarlejoinsel", ">=", ">"), }, Operator { symbol: ">", - backing: "gt", - kind: Kind::Symmetric, - restrict: Some("scalargtsel"), - join: Some("scalargtjoinsel"), - commutator: Some("<"), - negator: Some("<="), + function_name: "gt", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: cmp_metadata("scalargtsel", "scalargtjoinsel", "<", "<="), }, Operator { symbol: ">=", - backing: "gte", - kind: Kind::Symmetric, - restrict: Some("scalargesel"), - join: Some("scalargejoinsel"), - commutator: Some("<="), - negator: Some("<"), + function_name: "gte", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: cmp_metadata("scalargesel", "scalargejoinsel", "<=", "<"), }, Operator { symbol: "@>", - backing: "contains", - kind: Kind::Symmetric, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "contains", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "<@", - backing: "contained_by", - kind: Kind::Symmetric, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "contained_by", + signatures: BOOL_SYMMETRIC_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "->", - backing: "\"->\"", - kind: Kind::Path, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"->\"", + signatures: ARROW_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "->>", - backing: "\"->>\"", - kind: Kind::Path, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"->>\"", + signatures: ARROW_TEXT_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "?", - backing: "\"?\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"?\"", + signatures: HAS_KEY_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "?|", - backing: "\"?|\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"?|\"", + signatures: HAS_ANY_KEYS_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "?&", - backing: "\"?&\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"?&\"", + signatures: HAS_ANY_KEYS_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "@?", - backing: "\"@?\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"@?\"", + signatures: JSONPATH_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "@@", - backing: "\"@@\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"@@\"", + signatures: JSONPATH_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "#>", - backing: "\"#>\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"#>\"", + signatures: PATH_EXTRACT_JSONB_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "#>>", - backing: "\"#>>\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"#>>\"", + signatures: PATH_EXTRACT_TEXT_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "-", - backing: "\"-\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"-\"", + signatures: DELETE_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "#-", - backing: "\"#-\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"#-\"", + signatures: DELETE_PATH_SIGNATURES, + metadata: OperatorMetadata::none(), }, Operator { symbol: "||", - backing: "\"||\"", - kind: Kind::BlockerOnly, - restrict: None, - join: None, - commutator: None, - negator: None, + function_name: "\"||\"", + signatures: CONCAT_SIGNATURES, + metadata: OperatorMetadata::none(), }, ]; @@ -227,21 +337,127 @@ pub const OPERATORS: &[Operator] = &[ mod tests { use super::*; + fn rendered_signatures(op: &str) -> Vec<(String, String, String)> { + operator(op) + .signatures + .iter() + .map(|sig| sig.render("eql_v3.int4_ord")) + .map(|sig| (sig.left, sig.right, sig.returns)) + .collect() + } + #[test] - fn twenty_operators_total() { - assert_eq!(OPERATORS.len(), 20); + fn signature_slots_render_for_domain() { + let sig = OperatorSignature { + left: TypeSlot::Domain, + right: TypeSlot::Text, + returns: TypeSlot::Boolean, + }; + let rendered = sig.render("eql_v3.int4_eq"); + assert_eq!(rendered.left, "eql_v3.int4_eq"); + assert_eq!(rendered.right, "text"); + assert_eq!(rendered.returns, "boolean"); } #[test] - fn operator_lists_match() { + fn operator_catalog_carries_postgres_signatures() { + let arrow = operator("->"); + let rendered: Vec<_> = arrow + .signatures + .iter() + .map(|sig| sig.render("eql_v3.int4")) + .map(|sig| (sig.left, sig.right, sig.returns)) + .collect(); assert_eq!( - SYMMETRIC_OPERATORS, - &["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] + rendered, + vec![ + ( + "eql_v3.int4".to_string(), + "text".to_string(), + "eql_v3.int4".to_string() + ), + ( + "eql_v3.int4".to_string(), + "integer".to_string(), + "eql_v3.int4".to_string() + ), + ( + "jsonb".to_string(), + "eql_v3.int4".to_string(), + "eql_v3.int4".to_string() + ), + ] ); - assert_eq!(PATH_OPERATORS, &["->", "->>"]); + } + + #[test] + fn equality_signatures_match_existing_symmetric_shapes() { assert_eq!( - BLOCKER_ONLY_OPERATORS, - &["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"] + rendered_signatures("="), + vec![ + ( + "eql_v3.int4_ord".into(), + "eql_v3.int4_ord".into(), + "boolean".into() + ), + ("eql_v3.int4_ord".into(), "jsonb".into(), "boolean".into()), + ("jsonb".into(), "eql_v3.int4_ord".into(), "boolean".into()), + ] + ); + } + + #[test] + fn native_jsonb_signatures_match_existing_operator_shapes() { + assert_eq!( + rendered_signatures("||"), + vec![ + ( + "eql_v3.int4_ord".into(), + "eql_v3.int4_ord".into(), + "jsonb".into() + ), + ("eql_v3.int4_ord".into(), "jsonb".into(), "jsonb".into()), + ("jsonb".into(), "eql_v3.int4_ord".into(), "jsonb".into()), + ] + ); + assert_eq!( + rendered_signatures("?|"), + vec![("eql_v3.int4_ord".into(), "text[]".into(), "boolean".into())] + ); + } + + #[test] + fn jsonpath_and_text_array_signatures_render() { + // `@?` carries the jsonpath slot and `#>`/`#>>` carry the text[] slot — + // the slot kinds not asserted by the symmetric/arrow signature tests. + assert_eq!( + rendered_signatures("@?"), + vec![( + "eql_v3.int4_ord".into(), + "jsonpath".into(), + "boolean".into() + )] + ); + assert_eq!( + rendered_signatures("#>"), + vec![("eql_v3.int4_ord".into(), "text[]".into(), "jsonb".into())] + ); + assert_eq!( + rendered_signatures("#>>"), + vec![("eql_v3.int4_ord".into(), "text[]".into(), "text".into())] + ); + } + + #[test] + fn twenty_operators_total() { + assert_eq!(OPERATORS.len(), 20); + } + + #[test] + fn every_operator_has_signatures() { + assert!( + OPERATORS.iter().all(|o| !o.signatures.is_empty()), + "every catalog operator must declare at least one signature" ); } @@ -253,62 +469,68 @@ mod tests { } #[test] - fn backing_function_names() { - assert_eq!(backing_function("="), "eq"); - assert_eq!(backing_function("<>"), "neq"); - assert_eq!(backing_function("<"), "lt"); - assert_eq!(backing_function("<="), "lte"); - assert_eq!(backing_function(">"), "gt"); - assert_eq!(backing_function(">="), "gte"); - assert_eq!(backing_function("@>"), "contains"); - assert_eq!(backing_function("<@"), "contained_by"); - assert_eq!(backing_function("->"), "\"->\""); - assert_eq!(backing_function("->>"), "\"->>\""); - assert_eq!(backing_function("?"), "\"?\""); - assert_eq!(backing_function("?|"), "\"?|\""); - assert_eq!(backing_function("?&"), "\"?&\""); - assert_eq!(backing_function("@?"), "\"@?\""); - assert_eq!(backing_function("@@"), "\"@@\""); - assert_eq!(backing_function("#>"), "\"#>\""); - assert_eq!(backing_function("#>>"), "\"#>>\""); - assert_eq!(backing_function("-"), "\"-\""); - assert_eq!(backing_function("#-"), "\"#-\""); - assert_eq!(backing_function("||"), "\"||\""); + fn function_names() { + assert_eq!(operator_function_name("="), "eq"); + assert_eq!(operator_function_name("<>"), "neq"); + assert_eq!(operator_function_name("<"), "lt"); + assert_eq!(operator_function_name("<="), "lte"); + assert_eq!(operator_function_name(">"), "gt"); + assert_eq!(operator_function_name(">="), "gte"); + assert_eq!(operator_function_name("@>"), "contains"); + assert_eq!(operator_function_name("<@"), "contained_by"); + assert_eq!(operator_function_name("->"), "\"->\""); + assert_eq!(operator_function_name("->>"), "\"->>\""); + assert_eq!(operator_function_name("?"), "\"?\""); + assert_eq!(operator_function_name("?|"), "\"?|\""); + assert_eq!(operator_function_name("?&"), "\"?&\""); + assert_eq!(operator_function_name("@?"), "\"@?\""); + assert_eq!(operator_function_name("@@"), "\"@@\""); + assert_eq!(operator_function_name("#>"), "\"#>\""); + assert_eq!(operator_function_name("#>>"), "\"#>>\""); + assert_eq!(operator_function_name("-"), "\"-\""); + assert_eq!(operator_function_name("#-"), "\"#-\""); + assert_eq!(operator_function_name("||"), "\"||\""); } #[test] fn selectivity_estimators() { - assert_eq!(operator("=").restrict, Some("eqsel")); - assert_eq!(operator("=").join, Some("eqjoinsel")); - assert_eq!(operator("<>").restrict, Some("neqsel")); - assert_eq!(operator("<").restrict, Some("scalarltsel")); - assert_eq!(operator("<=").restrict, Some("scalarlesel")); - assert_eq!(operator(">").restrict, Some("scalargtsel")); - assert_eq!(operator(">=").restrict, Some("scalargesel")); + assert_eq!(operator("=").metadata.restrict, Some("eqsel")); + assert_eq!(operator("=").metadata.join, Some("eqjoinsel")); + assert_eq!(operator("<>").metadata.restrict, Some("neqsel")); + assert_eq!(operator("<").metadata.restrict, Some("scalarltsel")); + assert_eq!(operator("<=").metadata.restrict, Some("scalarlesel")); + assert_eq!(operator(">").metadata.restrict, Some("scalargtsel")); + assert_eq!(operator(">=").metadata.restrict, Some("scalargesel")); } #[test] fn negators_and_commutators() { - assert_eq!(operator("=").negator, Some("<>")); - assert_eq!(operator("<>").negator, Some("=")); - assert_eq!(operator("<").commutator, Some(">")); - assert_eq!(operator("<").negator, Some(">=")); - assert_eq!(operator(">=").commutator, Some("<=")); + assert_eq!(operator("=").metadata.negator, Some("<>")); + assert_eq!(operator("<>").metadata.negator, Some("=")); + assert_eq!(operator("<").metadata.commutator, Some(">")); + assert_eq!(operator("<").metadata.negator, Some(">=")); + assert_eq!(operator(">=").metadata.commutator, Some("<=")); } #[test] - fn known_jsonb_operators_match_table_keys() { - let union: Vec<&str> = SYMMETRIC_OPERATORS - .iter() - .chain(PATH_OPERATORS) - .chain(BLOCKER_ONLY_OPERATORS) - .copied() - .collect(); + fn metadata_renders_only_when_present() { + assert_eq!( + operator("=").metadata.render().unwrap(), + "COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel" + ); + assert_eq!(operator("->").metadata.render(), None); + assert_eq!(operator("@>").metadata.render(), None); + } + + #[test] + fn catalog_symbols_match_expected_order() { let keys: Vec<&str> = OPERATORS.iter().map(|o| o.symbol).collect(); - assert_eq!(union, keys); assert_eq!( - union.len(), - SYMMETRIC_OPERATORS.len() + PATH_OPERATORS.len() + BLOCKER_ONLY_OPERATORS.len() + keys, + vec![ + "=", "<>", "<", "<=", ">", ">=", "@>", "<@", "->", "->>", "?", "?|", "?&", "@?", + "@@", "#>", "#>>", "-", "#-", "||" + ] ); } } From d1cd0abba1e9b79855de93ae33ac4304fd10ea60 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 20:56:18 +1000 Subject: [PATCH 035/599] fix(codegen): align Python fixture-values header with Rust generator The committed `_values.rs` files carry the Rust generator's header ("Generated from the `` row in `eql-scalars::CATALOG`"), but the Python generator still emitted the older "tasks/codegen/types/.toml" wording. CI's "regenerate fixture-value consts" step runs the Python generator (`codegen:domain:all`) and diffs the result, so the header mismatch failed the build. Re-align `templates.py` to the Rust header (the recurrence of the drift fixed in 9dca205) and update the now-stale assertion in `test_templates.py`. Verified: `codegen:domain:all` leaves tests/sqlx/src/fixtures clean and `codegen:parity` still passes. --- tasks/codegen/templates.py | 4 ++-- tasks/codegen/test_templates.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/codegen/templates.py b/tasks/codegen/templates.py index d79eb3ee7..14fefbc6f 100644 --- a/tasks/codegen/templates.py +++ b/tasks/codegen/templates.py @@ -76,8 +76,8 @@ def render_fixture_values_rs(spec: TypeSpec) -> str: f"//! Fixture plaintext values for the {spec.token} " "encrypted-domain family.\n" "//!\n" - f"//! Generated from tasks/codegen/types/{spec.token}.toml " - "`[fixture] values` —\n" + f"//! Generated from the `{spec.token}` row in `eql-scalars::CATALOG` " + "(`fixtures`) —\n" "//! the single source of truth shared by the fixture generator\n" f"//! (`fixtures::eql_v2_{spec.token}`) and the matrix oracle\n" "//! (`ScalarType::FIXTURE_VALUES`).\n\n" diff --git a/tasks/codegen/test_templates.py b/tasks/codegen/test_templates.py index 221dcd9b3..4a24f9232 100644 --- a/tasks/codegen/test_templates.py +++ b/tasks/codegen/test_templates.py @@ -49,7 +49,7 @@ def test_render_fixture_values_rs_emits_typed_const(): ) body = render_fixture_values_rs(spec) assert "pub const VALUES: &[i32] = &[" in body - assert "tasks/codegen/types/int4.toml" in body + assert "`int4` row in `eql-scalars::CATALOG`" in body # Sentinels map to named consts; numeric tokens pass through. assert "i32::MIN," in body assert "i32::MAX," in body From 0229df731ce7650524c87aedaf90b2e49bc78c76 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 08:13:52 +1000 Subject: [PATCH 036/599] refactor(codegen): split functions template into per-kind partials Replace the if/elif/else body in functions.sql.j2 with a dynamic {% include %} driven off each entry's serde "kind" tag (Extractor/Wrapper/Unsupported -> functions/.sql.j2). The parent template keeps the once-per-file header, -- REQUIRE: loop, and entry loop; each per-kind body lives in its own partial under templates/functions/. Dispatch stays in the template layer off the existing #[serde(tag="kind")] value, so FnEntry, generate.rs, and the Rust render path are unchanged. Generated SQL is line-normalized-identical (golden test + codegen:parity). --- crates/eql-codegen/src/context.rs | 32 +++++++++++++++++-- crates/eql-codegen/templates/functions.sql.j2 | 27 +--------------- .../templates/functions/extractor.sql.j2 | 7 ++++ .../templates/functions/unsupported.sql.j2 | 8 +++++ .../templates/functions/wrapper.sql.j2 | 7 ++++ 5 files changed, 52 insertions(+), 29 deletions(-) create mode 100644 crates/eql-codegen/templates/functions/extractor.sql.j2 create mode 100644 crates/eql-codegen/templates/functions/unsupported.sql.j2 create mode 100644 crates/eql-codegen/templates/functions/wrapper.sql.j2 diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index cdb68e67b..7ea33db12 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -15,8 +15,11 @@ pub fn normalize_sql(s: &str) -> String { .join("\n") } -/// Build the minijinja environment with the four embedded whole-file templates. -/// Templates are compiled in via `include_str!` — no runtime file IO. +/// Build the minijinja environment with the embedded templates: one whole-file +/// template per output file (`types`/`functions`/`operators`/`aggregates`) plus +/// the per-kind function-body partials that `functions.sql` dynamically +/// `{% include %}`s. Templates are compiled in via `include_str!` — no runtime +/// file IO. pub fn environment() -> minijinja::Environment<'static> { let mut env = minijinja::Environment::new(); // Preserve each template file's trailing newline so generated SQL files end @@ -29,6 +32,24 @@ pub fn environment() -> minijinja::Environment<'static> { include_str!("../templates/functions.sql.j2"), ) .expect("functions.sql template"); + // Per-kind function bodies, dynamically `{% include %}`d by the parent + // `functions.sql` template based on each entry's `kind` tag + // (Extractor/Wrapper/Unsupported -> extractor/wrapper/unsupported). + env.add_template( + "functions/extractor.sql.j2", + include_str!("../templates/functions/extractor.sql.j2"), + ) + .expect("functions/extractor.sql.j2 template"); + env.add_template( + "functions/wrapper.sql.j2", + include_str!("../templates/functions/wrapper.sql.j2"), + ) + .expect("functions/wrapper.sql.j2 template"); + env.add_template( + "functions/unsupported.sql.j2", + include_str!("../templates/functions/unsupported.sql.j2"), + ) + .expect("functions/unsupported.sql.j2 template"); env.add_template( "operators.sql", include_str!("../templates/operators.sql.j2"), @@ -299,13 +320,18 @@ mod tests { } #[test] - fn environment_has_four_templates() { + fn environment_has_whole_file_and_partial_templates() { let env = environment(); for name in [ + // One whole-file template per generated SQL file. "types.sql", "functions.sql", "operators.sql", "aggregates.sql", + // Per-kind partials included by functions.sql. + "functions/extractor.sql.j2", + "functions/wrapper.sql.j2", + "functions/unsupported.sql.j2", ] { assert!(env.get_template(name).is_ok(), "missing template {name}"); } diff --git a/crates/eql-codegen/templates/functions.sql.j2 b/crates/eql-codegen/templates/functions.sql.j2 index 0b75cd3ab..ba4f3a020 100644 --- a/crates/eql-codegen/templates/functions.sql.j2 +++ b/crates/eql-codegen/templates/functions.sql.j2 @@ -5,30 +5,5 @@ --! @file encrypted_domain/{{ token }}/{{ name }}_functions.sql --! @brief Functions for {{ dom }}. {% for e in entries %} -{% if e.kind == "Extractor" -%} ---! @brief Index extractor for {{ dom }}. ---! @param a {{ dom }} ---! @return {{ e.ret }} -CREATE FUNCTION {{ domain_schema }}.{{ e.extractor }}(a {{ dom }}) -RETURNS {{ e.ret }} -LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT {{ core_schema }}.{{ e.ctor }}(a::jsonb) $$; -{% elif e.kind == "Wrapper" -%} ---! @brief Operator wrapper for {{ dom }}. ---! @param {{ e.args[0].name }} {{ e.args[0].ty }} ---! @param {{ e.args[1].name }} {{ e.args[1].ty }} ---! @return boolean -CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) -RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT {{ e.call_a }} {{ e.op }} {{ e.call_b }} $$; -{% else -%} ---! @brief Unsupported operator blocker for {{ dom }}. ---! @param {{ e.args[0].name }} {{ e.args[0].ty }} ---! @param {{ e.args[1].name }} {{ e.args[1].ty }} ---! @return {{ e.returns }} -CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) -RETURNS {{ e.returns }} IMMUTABLE PARALLEL SAFE -AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '{{ e.operator_lit }}', '{{ domain_lit }}'; END; $$ -LANGUAGE plpgsql; -{% endif -%} +{% include "functions/" ~ e.kind|lower ~ ".sql.j2" -%} {% endfor -%} diff --git a/crates/eql-codegen/templates/functions/extractor.sql.j2 b/crates/eql-codegen/templates/functions/extractor.sql.j2 new file mode 100644 index 000000000..da649b213 --- /dev/null +++ b/crates/eql-codegen/templates/functions/extractor.sql.j2 @@ -0,0 +1,7 @@ +--! @brief Index extractor for {{ dom }}. +--! @param a {{ dom }} +--! @return {{ e.ret }} +CREATE FUNCTION {{ domain_schema }}.{{ e.extractor }}(a {{ dom }}) +RETURNS {{ e.ret }} +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT {{ core_schema }}.{{ e.ctor }}(a::jsonb) $$; diff --git a/crates/eql-codegen/templates/functions/unsupported.sql.j2 b/crates/eql-codegen/templates/functions/unsupported.sql.j2 new file mode 100644 index 000000000..f33dab6c3 --- /dev/null +++ b/crates/eql-codegen/templates/functions/unsupported.sql.j2 @@ -0,0 +1,8 @@ +--! @brief Unsupported operator blocker for {{ dom }}. +--! @param {{ e.args[0].name }} {{ e.args[0].ty }} +--! @param {{ e.args[1].name }} {{ e.args[1].ty }} +--! @return {{ e.returns }} +CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) +RETURNS {{ e.returns }} IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '{{ e.operator_lit }}', '{{ domain_lit }}'; END; $$ +LANGUAGE plpgsql; diff --git a/crates/eql-codegen/templates/functions/wrapper.sql.j2 b/crates/eql-codegen/templates/functions/wrapper.sql.j2 new file mode 100644 index 000000000..243f24658 --- /dev/null +++ b/crates/eql-codegen/templates/functions/wrapper.sql.j2 @@ -0,0 +1,7 @@ +--! @brief Operator wrapper for {{ dom }}. +--! @param {{ e.args[0].name }} {{ e.args[0].ty }} +--! @param {{ e.args[1].name }} {{ e.args[1].ty }} +--! @return boolean +CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT {{ e.call_a }} {{ e.op }} {{ e.call_b }} $$; From dd5f81926a9712ccf93c2a162dce0c71f361a377 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 08:26:40 +1000 Subject: [PATCH 037/599] refactor(codegen): prune dead consts and enable dead-code detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove VERSION_KEY and ENVELOPE_VERSION — dead leftovers from the Python port never wired into the Rust generator (the version-pin clause is a literal 'v'='2' in types.sql.j2). Fold the always-present CIPHERTEXT_KEY into ENVELOPE_KEYS as ["v","i","c"]; context::domain_block keeps the same v,i,c ordering ahead of term keys, so generated SQL is byte-identical. Demote all consts.rs items from pub to pub(crate). Nothing outside the crate imports eql_codegen::consts, so this is safe and lets the built-in dead_code lint see them — the existing `clippy -- -D warnings` CI step (mise run test:crates) now fails on unused internal items, no workflow change needed. Verified: clippy -D warnings clean, 63 lib + 3 parity tests pass, codegen:parity OK (generated SQL unchanged). --- crates/eql-codegen/src/consts.rs | 22 +++++++++------------- crates/eql-codegen/src/context.rs | 1 - 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index c1b9e75c8..3f2fdbf0b 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -2,29 +2,25 @@ /// SQL generated-file marker. The SQL templates emit this as their first line; /// the writer uses it only to recognise files it owns (overwrite/clean safety). -pub const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE.\n"; +pub(crate) const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE.\n"; /// Rust generated-file marker, prepended to `_values.rs` (which has no /// template). Rust comment syntax so the `.rs` file stays valid. -pub const AUTO_GENERATED_HEADER_RS: &str = "// AUTOMATICALLY GENERATED FILE.\n"; +pub(crate) const AUTO_GENERATED_HEADER_RS: &str = "// AUTOMATICALLY GENERATED FILE.\n"; /// Schema housing the encrypted-domain families. -pub const DOMAIN_SCHEMA: &str = "eql_v3"; +pub(crate) const DOMAIN_SCHEMA: &str = "eql_v3"; /// Schema owning the core index-term types/constructors. -pub const CORE_SCHEMA: &str = "eql_v2"; +pub(crate) const CORE_SCHEMA: &str = "eql_v2"; -/// Envelope keys checked for presence in every domain CHECK, in order. -pub const ENVELOPE_KEYS: &[&str] = &["v", "i"]; -/// Ciphertext payload key. -pub const CIPHERTEXT_KEY: &str = "c"; -/// Envelope-version key whose value is pinned. -pub const VERSION_KEY: &str = "v"; -/// EQL payload-format version pinned by the domain CHECK. -pub const ENVELOPE_VERSION: u32 = 2; +/// Always-present payload keys checked for presence in every domain CHECK, in +/// order: envelope version (`v`), ident (`i`), ciphertext (`c`). Term-specific +/// keys are appended after these by `context::domain_block`. +pub(crate) const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; /// Escape a string for use inside a single-quoted SQL literal by doubling /// embedded single quotes. Port of templates.py `_sql_str`. -pub fn sql_str(s: &str) -> String { +pub(crate) fn sql_str(s: &str) -> String { s.replace('\'', "''") } diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 7ea33db12..7066377fd 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -85,7 +85,6 @@ pub fn domain_block(token: &str, domain: &DomainSpec) -> DomainBlock { let name = full_domain_name(token, domain.suffix); let mut keys: Vec = ENVELOPE_KEYS.iter().map(|k| sql_str(k)).collect(); - keys.push(sql_str(CIPHERTEXT_KEY)); for k in Term::term_json_keys(domain.terms) { keys.push(sql_str(k)); } From 350c751c126e9b4d37019a22b04ed6bb0c55cf4d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 08:47:51 +1000 Subject: [PATCH 038/599] refactor(codegen): use a raw string for the values.rs renderer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the \n\-continuation format string in render_fixture_values_rs with a flush-left raw string literal — same emitted bytes, far more legible. Kept as format! (not a minijinja template) deliberately: _values.rs is validated byte-exact, unlike the line-normalized SQL surface, and the type-aware literal rendering stays in Rust regardless. Verified byte-identical via codegen:parity (rust_generator_matches_ committed_values_rs); fmt/clippy -D warnings clean, all tests pass. --- crates/eql-codegen/src/templates.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/crates/eql-codegen/src/templates.rs b/crates/eql-codegen/src/templates.rs index 1f2a33e39..e0da5290c 100644 --- a/crates/eql-codegen/src/templates.rs +++ b/crates/eql-codegen/src/templates.rs @@ -14,17 +14,20 @@ pub fn render_fixture_values_rs(spec: &ScalarSpec) -> String { for &f in spec.fixtures { literals.push_str(&format!(" {},\n", f.render_literal(spec.kind))); } + // Raw string keeps the emitted shape legible while staying byte-exact; + // lines are flush-left because raw-string whitespace is literal output. format!( - "//! Fixture plaintext values for the {token} encrypted-domain family.\n\ - //!\n\ - //! Generated from the `{token}` row in `eql-scalars::CATALOG` (`fixtures`) —\n\ - //! the single source of truth shared by the fixture generator\n\ - //! (`fixtures::eql_v2_{token}`) and the matrix oracle\n\ - //! (`ScalarType::FIXTURE_VALUES`).\n\n\ - /// Distinct plaintext values present in the `eql_v2_{token}` fixture.\n\ - pub const VALUES: &[{rust_type}] = &[\n\ - {literals}\ - ];\n" + r#"//! Fixture plaintext values for the {token} encrypted-domain family. +//! +//! Generated from the `{token}` row in `eql-scalars::CATALOG` (`fixtures`) — +//! the single source of truth shared by the fixture generator +//! (`fixtures::eql_v2_{token}`) and the matrix oracle +//! (`ScalarType::FIXTURE_VALUES`). + +/// Distinct plaintext values present in the `eql_v2_{token}` fixture. +pub const VALUES: &[{rust_type}] = &[ +{literals}]; +"# ) } From 5acec1b9d7f6be2f63e6961b03c35629d312943b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 08:58:05 +1000 Subject: [PATCH 039/599] docs(tests): clarify eql_v2_int* are fixture names, not domain types The `eql_v2_int4`/`eql_v2_int2` fixtures are plain jsonb-payload test tables; the encrypted-domain types they exercise are correctly under eql_v3 (eql_v3.int4_eq/_ord), derived from the scalar type and applied via per-query cast. Reword matrix.rs's misleading "EQL domain type name" comment on `eql_type` to say fixture/table name, and point the fixtures mod.rs value-const docs at eql-scalars::CATALOG instead of the retired tasks/codegen Python path. Comment-only; no behaviour change. --- tests/sqlx/src/fixtures/mod.rs | 8 ++++---- tests/sqlx/src/matrix.rs | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index ac363a49e..f616f5568 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -26,14 +26,14 @@ pub mod cipherstash; pub mod driver; -/// Generated from tasks/codegen/types/int4.toml `[fixture] values`. -/// Committed and verified by CI; never hand-edit (`mise run codegen:domain int4`). +/// Generated from the `int4` row in `eql-scalars::CATALOG` (`fixtures`). +/// Committed and verified by CI; never hand-edit (regenerated by `eql-codegen`). pub mod int4_values; pub mod eql_v2_int4; -/// Generated from tasks/codegen/types/int2.toml `[fixture] values`. -/// Committed and verified by CI; never hand-edit (`mise run codegen:domain int2`). +/// Generated from the `int2` row in `eql-scalars::CATALOG` (`fixtures`). +/// Committed and verified by CI; never hand-edit (regenerated by `eql-codegen`). pub mod int2_values; pub mod eql_v2_int2; diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index ac690a16d..644ea3514 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -142,9 +142,11 @@ fn collect_index_scan_nodes(value: &serde_json::Value, found: &mut Vec<(String, /// supported comparison operators, 2 path operators, and the standard /// blocker / index partitions. /// -/// `eql_type` is the EQL domain type name (e.g. `"eql_v2_int4"`). It is -/// used as the SQLx fixture `scripts(...)` ref, which sqlx parses as a -/// token-level string literal — so it must be a literal, not derived. +/// `eql_type` is the fixture/table name (e.g. `"eql_v2_int4"`), used as the +/// SQLx fixture `scripts(...)` ref — sqlx parses it as a token-level string +/// literal, so it must be a literal, not derived. It is NOT a domain type +/// name: the `eql_v3.*` domains exercised here are derived from the scalar +/// type (see `scalar_domains.rs`, `format!("eql_v3.{}…", T::PG_TYPE)`). /// /// Pivots — the comparison anchors swept by the correctness / cross-shape /// arms — are derived from the scalar type: `MIN`, `MAX`, and zero From 77c350ebe4748dc9266ad82a19eaa341d7ea63ed Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 09:54:08 +1000 Subject: [PATCH 040/599] docs(comments): correct stale domain references in lint catalog and fixtures The domain_over_domain/domain_opclass lint-catalog header described the target as an eql_v2_* domain, but the checks match both eql_v3.* and legacy public.eql_v2_*. The int2/int4 fixture doc-comments called the fixture struct names a 'domain'; the actual domains are eql_v3.int2 / eql_v3.int4 (see 0905042). Comment-only; no behaviour change. --- src/lint/lints.sql | 8 +++++--- tests/sqlx/src/fixtures/eql_v2_int2.rs | 2 +- tests/sqlx/src/fixtures/eql_v2_int4.rs | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/lint/lints.sql b/src/lint/lints.sql index cf66f7d4a..f7870abd9 100644 --- a/src/lint/lints.sql +++ b/src/lint/lints.sql @@ -48,13 +48,15 @@ --! PostgreSQL skips the body and returns NULL --! on NULL arguments, silently bypassing the --! RAISE. ---! `domain_over_domain` — an `eql_v2_*` domain is derived from another ---! `eql_v2_*` domain rather than jsonb. +--! `domain_over_domain` — an encrypted domain (`eql_v3.*` or +--! `public.eql_v2_*`) is derived from another +--! encrypted domain rather than jsonb. --! Operators resolve against the ultimate base --! type, so the derived domain does not --! inherit the base domain's blocker surface. --! `domain_opclass` — an operator class is declared FOR TYPE on an ---! `eql_v2_*` domain. Opclasses on domains +--! encrypted domain (`eql_v3.*` or +--! `public.eql_v2_*`). Opclasses on domains --! bypass operator resolution; use a --! functional index on the extractor instead. --! diff --git a/tests/sqlx/src/fixtures/eql_v2_int2.rs b/tests/sqlx/src/fixtures/eql_v2_int2.rs index ec4a13332..0848f85e3 100644 --- a/tests/sqlx/src/fixtures/eql_v2_int2.rs +++ b/tests/sqlx/src/fixtures/eql_v2_int2.rs @@ -4,7 +4,7 @@ //! (`MIN`/`MAX`), zero, a pair near the ±32767 boundary, and //! small/medium/large magnitudes. The generated //! `tests/sqlx/fixtures/eql_v2_int2.sql` is a plain `jsonb`-payload table with -//! no EQL dependency; the `eql_v2_int2` domain is layered on top by casting +//! no EQL dependency; the `eql_v3.int2` domain is layered on top by casting //! `payload` per query. use super::int2_values::VALUES; diff --git a/tests/sqlx/src/fixtures/eql_v2_int4.rs b/tests/sqlx/src/fixtures/eql_v2_int4.rs index 429e47d92..fd28b15b7 100644 --- a/tests/sqlx/src/fixtures/eql_v2_int4.rs +++ b/tests/sqlx/src/fixtures/eql_v2_int4.rs @@ -3,7 +3,7 @@ //! 17 integers spanning a negative boundary, the i32 signed extremes //! (`MIN`/`MAX`), zero, and small/medium/large magnitudes. The generated //! `tests/sqlx/fixtures/eql_v2_int4.sql` is a plain `jsonb`-payload table with -//! no EQL dependency; #225 layers the `eql_v2_int4` domain on top by casting +//! no EQL dependency; #225 layers the `eql_v3.int4` domain on top by casting //! `payload` per query. use super::int4_values::VALUES; From 84917271316a1b95fa15b9f8623d5f94c00e4b7d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:09:09 +1000 Subject: [PATCH 041/599] build(test): path-dep eql-scalars from tests/sqlx for catalog-driven fixtures --- Cargo.lock | 1 + tests/sqlx/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index ebc391655..2d902e931 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1174,6 +1174,7 @@ version = "0.1.0" dependencies = [ "anyhow", "cipherstash-client", + "eql-scalars", "hex", "jsonschema", "paste", diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 50f7d035a..c7a8525a7 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -13,6 +13,7 @@ hex = "0.4" jsonschema = { version = "0.46.4", default-features = false } cipherstash-client = { version = "0.35", features = ["tokio"] } paste = "1" +eql-scalars = { path = "../../crates/eql-scalars" } [dev-dependencies] # None needed - tests live in this crate From 6a4929ec68143bdf6831182060153afe38808a1f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:10:21 +1000 Subject: [PATCH 042/599] build: generate encrypted-domain SQL via eql-codegen (Rust), not Python --- tasks/build.sh | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/tasks/build.sh b/tasks/build.sh index cef25521a..621b0b726 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" -#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "tasks/codegen/types/*.toml", "tasks/codegen/*.py"] +#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] #MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" @@ -9,25 +9,27 @@ set -euo pipefail -# Regenerate encrypted-domain SQL from TOML specs before building. +# Regenerate encrypted-domain SQL from the Rust catalog before building. # Generated files (src/encrypted_domain//_*.sql) are gitignored; the -# manifest at tasks/codegen/types/.toml is the source of truth. +# catalog at crates/eql-scalars/src (eql-scalars::CATALOG) is the source of +# truth, rendered by the eql-codegen binary. # -# Nuke every generated file first so a deleted or renamed manifest can't +# Nuke every generated file first so a type removed from the catalog can't # leave orphans in src/ that the `src/**/*.sql` build glob would silently -# pick up. writer.py cleans within a directory it's regenerating, but it -# never runs for a type whose manifest no longer exists. Hand-written -# *_extensions.sql is preserved by the name patterns; -mindepth 2 keeps -# the type-agnostic src/encrypted_domain/functions.sql safe. +# pick up. eql-codegen cleans within a directory it regenerates, but never +# runs for a type no longer in the catalog. Hand-written *_extensions.sql is +# preserved by the name patterns; -mindepth 2 keeps the type-agnostic +# src/encrypted_domain/functions.sql safe. find src/encrypted_domain -mindepth 2 -type f \ \( -name '*_types.sql' -o -name '*_functions.sql' -o -name '*_operators.sql' \ -o -name '*_aggregates.sql' \) \ -delete 2>/dev/null || true -# Regenerate every type — single source of truth for the enumeration lives in -# tasks/codegen/generate.py (sorted, deterministic, aggregate exit code). The -# orphan sweep above still handles the manifest-deleted case --all cannot. -mise exec python -- python -m tasks.codegen.generate --all +# Regenerate every type — the catalog (eql-scalars::CATALOG) is the single +# source of truth for the enumeration; eql-codegen renders all SQL and all +# tests/sqlx/src/fixtures/_values.rs in one deterministic run. The orphan +# sweep above still handles the catalog-removed case the generator cannot. +cargo run -p eql-codegen # Fail loudly if any file referenced in a tsorted dep list doesn't exist. # Without this, `xargs cat` would print `cat: foo.sql: No such file or directory` From 323a93657fb837e68a65d03837fea4bc29cab35c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:11:44 +1000 Subject: [PATCH 043/599] test(fixtures): add catalog-driven generate-all-fixtures entry point --- tests/sqlx/tests/generate_all_fixtures.rs | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 tests/sqlx/tests/generate_all_fixtures.rs diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs new file mode 100644 index 000000000..bbc1f5953 --- /dev/null +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -0,0 +1,46 @@ +//! Catalog-driven "generate every encrypted fixture" entry point. +//! +//! Replaces the Python-era `fixture:generate ` per-type scripts and the +//! `fixture:generate:all` TOML-glob loop (which spawned a separate `cargo test` +//! per type). This runs ALL scalar fixture generators in ONE process, iterating +//! `eql_scalars::CATALOG` for the authoritative token set. +//! +//! The encrypted-fixture logic itself is unchanged — each type's +//! `fixtures::eql_v2_::spec().run()` still produces +//! `tests/sqlx/fixtures/eql_v2_.sql` exactly as before. +//! +//! Gated behind `fixture-gen` (needs a live Postgres + CS_* creds). Run via: +//! mise run fixture:generate:all +#![cfg(feature = "fixture-gen")] + +use eql_scalars::CATALOG; +use eql_tests::fixtures; + +/// Map a catalog token to its fixture generator and run it. A token present in +/// the catalog but missing here is a wiring gap — fail loudly so a new scalar +/// type cannot silently skip fixture generation. +async fn generate_for_token(token: &str) -> anyhow::Result<()> { + match token { + "int2" => fixtures::eql_v2_int2::spec().run().await, + "int4" => fixtures::eql_v2_int4::spec().run().await, + other => anyhow::bail!( + "no fixture generator wired for catalog token '{other}'. \ + Add an arm to generate_for_token in tests/sqlx/tests/generate_all_fixtures.rs \ + (and the eql_v2_{other} fixture module). See the encrypted-domain spec §9." + ), + } +} + +#[tokio::test] +#[ignore = "generator — run via `mise run fixture:generate:all`"] +async fn generate_all() -> anyhow::Result<()> { + let mut generated = 0usize; + for spec in CATALOG { + eprintln!("Generating fixture eql_v2_{}...", spec.token); + generate_for_token(spec.token).await?; + generated += 1; + } + assert!(generated > 0, "CATALOG is empty — nothing to generate"); + eprintln!("Regenerated {generated} scalar fixture(s)."); + Ok(()) +} From ed68a5c8e9e80fa7b29dc66c4a252c41fbc6e2f5 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:13:58 +1000 Subject: [PATCH 044/599] build(fixtures): collapse fixture:generate{,:all} into one catalog-driven task --- tasks/fixtures.toml | 61 +++++++++++---------------------------------- 1 file changed, 14 insertions(+), 47 deletions(-) diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index ecfe3ad9c..f24bc6848 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -1,8 +1,13 @@ -["fixture:generate"] -description = "Generate a SQLx fixture script via cipherstash-client" -# Runs the gated generator for the named fixture. Writes -# tests/sqlx/fixtures/.sql. Must run inside the crate — there is no -# root Cargo.toml — matching test:schema / test:sqlx:watch. +["fixture:generate:all"] +description = "Regenerate every scalar SQLx fixture in one process, driven by eql-scalars::CATALOG" +# Replaces the Python-era per-type `fixture:generate ` script and the +# TOML-glob `fixture:generate:all` loop (one `cargo test` per type). The +# generate_all_fixtures test iterates eql-scalars::CATALOG and runs every +# eql_v2_ fixture generator in a SINGLE process. The encrypted-fixture logic +# is unchanged; only enumeration + entry point changed. +# +# Writes tests/sqlx/fixtures/eql_v2_.sql (gitignored — regenerated on every +# `mise run test:sqlx`). # # Prerequisites: # - mise run postgres:up (Postgres with EQL installed) @@ -11,48 +16,10 @@ description = "Generate a SQLx fixture script via cipherstash-client" # CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN ZeroKMS auth (AutoStrategy) # CS_CLIENT_ID + CS_CLIENT_KEY client key (EnvKeyProvider) # -# Usage: mise run fixture:generate eql_v2_int4 +# Must run inside the crate — a workspace member still builds from its own dir. dir = "{{config_root}}/tests/sqlx" run = """ -fixture="{{arg(name="fixture")}}" -# Match the Rust `FixtureIdentifier` rule: `^[a-z][a-z0-9_]*$`. Reject -# empty, leading-digit, and any non-lowercase-alphanumeric-underscore -# input here so the failure mode is a clear shell error rather than a -# Rust panic during the cargo test invocation. -case "$fixture" in - (''|[0-9]*|*[!a-z0-9_]*) echo "Invalid fixture name: $fixture (expected ^[a-z][a-z0-9_]*$)" >&2; exit 1 ;; -esac - -cargo test --features fixture-gen --lib \ - "fixtures::${fixture}::generate" \ - -- --ignored --exact --nocapture -""" - -["fixture:generate:all"] -description = "Regenerate every scalar SQLx fixture declared by a type manifest" -# Enumerates tasks/codegen/types/*.toml — the SAME manifests that -# `codegen:domain:all` drives — and regenerates the SQLx fixture for each type -# whose manifest declares a [fixture] table. This keeps the test fixtures in -# lockstep with the declared scalar types: adding a new scalar type (a new -# .toml with a [fixture] table) is picked up automatically, so the test -# task never has to hand-list each fixture. Same prerequisites as -# `fixture:generate` (Postgres up + CS_* credentials). -dir = "{{config_root}}" -run = """ -generated=0 -for manifest in tasks/codegen/types/*.toml; do - # Guard the no-match case (glob stays literal under POSIX sh). - [ -e "$manifest" ] || continue - # Only types that declare a [fixture] table have a SQLx fixture generator. - grep -qE '^\\[fixture\\]' "$manifest" || continue - token=$(basename "$manifest" .toml) - echo "Generating fixture eql_v2_${token}..." - mise run fixture:generate "eql_v2_${token}" - generated=$((generated + 1)) -done -if [ "$generated" -eq 0 ]; then - echo "No scalar manifests with a [fixture] table found in tasks/codegen/types/" >&2 - exit 1 -fi -echo "Regenerated ${generated} scalar fixture(s)." +set -euo pipefail +cargo test --features fixture-gen --test generate_all_fixtures \ + generate_all -- --ignored --exact --nocapture """ From 683b6c7aeb59e087fe98cc7bcfbf2931a2b0f15e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:14:23 +1000 Subject: [PATCH 045/599] docs(mise): describe catalog-driven fixture regeneration in test:sqlx --- mise.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mise.toml b/mise.toml index e627b45d6..b17117b80 100644 --- a/mise.toml +++ b/mise.toml @@ -58,9 +58,10 @@ cd tests/sqlx sqlx migrate run # Regenerate fixtures every run — they are not committed (see .gitignore). -# fixture:generate:all enumerates every scalar manifest in -# tasks/codegen/types/ that declares a [fixture] table, so new scalar types -# are picked up automatically without editing this task. +# fixture:generate:all iterates eql-scalars::CATALOG and generates every +# scalar fixture in one process, so new scalar types are picked up +# automatically (add the catalog row + the fixture wiring) without editing +# this task. # Generator encrypts via cipherstash-client directly, which needs BOTH a # ZeroKMS auth credential (CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN, via # AutoStrategy) AND a client key (CS_CLIENT_ID + CS_CLIENT_KEY, via From a68e57470cc95ff74a9b15011643fcdab185fb71 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:32:03 +1000 Subject: [PATCH 046/599] test(matrix): collapse per-type inventory to one catalog-reconciled snapshot --- mise.toml | 76 ++++++-- tests/sqlx/snapshots/int2_matrix_tests.txt | 211 --------------------- tests/sqlx/snapshots/int4_matrix_tests.txt | 211 --------------------- tests/sqlx/snapshots/matrix_tests.txt | 211 +++++++++++++++++++++ 4 files changed, 267 insertions(+), 442 deletions(-) delete mode 100644 tests/sqlx/snapshots/int2_matrix_tests.txt delete mode 100644 tests/sqlx/snapshots/int4_matrix_tests.txt create mode 100644 tests/sqlx/snapshots/matrix_tests.txt diff --git a/mise.toml b/mise.toml index b17117b80..c92d222b9 100644 --- a/mise.toml +++ b/mise.toml @@ -129,29 +129,65 @@ cargo test -p eql-scalars -p eql-codegen """ [tasks."test:matrix:inventory"] -description = "Regenerate the int4/int2 matrix test-name inventory snapshots (no database required)" +description = "Verify the matrix test-name set against the single canonical snapshot, catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" run = """ -# Pin an explicit feature set so the inventory is deterministic regardless of -# the caller's local flags. `--no-default-features` keeps the `scale` arm -# (`#[cfg(feature = "scale")]`) excluded — its add/delete is a known blind spot -# of this default-feature inventory, covered instead by the scale gate + the -# family::mutations negative controls. `--list` enumerates the whole -# encrypted_domain binary (family::support, family::inlinability, -# family::mutations, scalars::int4, scalars::int2); the per-scalar `grep` -# scopes each snapshot to that matrix only, so landing other family tests -# never dirties it. `LC_ALL=C sort` makes ordering byte-stable across locales -# (a bare `sort` is locale-dependent and yields spurious CI diffs). +# ONE canonical, token-normalized snapshot (snapshots/matrix_tests.txt) pins the +# set of macro-emitted matrix test names. The two per-type snapshots are gone: +# they were byte-identical modulo the type token, so one canonical set plus a +# per-type normalize+compare carries the same signal at 1/N the committed surface. +# +# Steps: +# 1. List the encrypted_domain binary ONCE (deterministic; reused below). +# 2. Discover the set of scalar types present FROM THE BINARY'S OWN OUTPUT +# (scalars:::: prefixes) — never a directory glob. +# 3. For each discovered type, normalize its token to and assert its set +# equals the canonical snapshot. Assert at least one type is present. +# 4. Completeness cross-check: assert the discovered type set equals +# `eql-codegen list-types`. A catalog type added without its matrix wiring +# (no scalars:::: tests in the binary) fails here. +# +# `--no-default-features` excludes the `scale` arm (a known, documented blind +# spot, covered by the scale gate + family::mutations negative controls). +# `LC_ALL=C sort` makes ordering byte-stable across locales. No database needed. set -euo pipefail -mkdir -p snapshots -cargo test --no-default-features --test encrypted_domain -- --list | - sed -n 's/: test$//p' | - grep '^scalars::int4' | - LC_ALL=C sort > snapshots/int4_matrix_tests.txt -cargo test --no-default-features --test encrypted_domain -- --list | - sed -n 's/: test$//p' | - grep '^scalars::int2' | - LC_ALL=C sort > snapshots/int2_matrix_tests.txt + +test -f snapshots/matrix_tests.txt || { echo "snapshots/matrix_tests.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } + +listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') + +# Types present in the binary, from scalars:::: prefixes. +discovered=$(printf '%s\\n' "$listing" \ + | sed -n 's/^scalars::\\([a-z0-9_]*\\)::.*/\\1/p' \ + | LC_ALL=C sort -u) +[ -n "$discovered" ] || { echo "No scalars:::: tests found in the encrypted_domain binary." >&2; exit 1; } + +# Per-type normalize + compare against the canonical snapshot. +checked=0 +while IFS= read -r t; do + [ -n "$t" ] || continue + printf '%s\\n' "$listing" | grep "^scalars::${t}::" \ + | sed -e "s/^scalars::${t}::/scalars::::/" -e "s/_${t}_/__/g" | LC_ALL=C sort > "/tmp/matrix-norm-${t}.txt" + if ! cmp -s "/tmp/matrix-norm-${t}.txt" snapshots/matrix_tests.txt; then + echo "Matrix test-name set for '${t}' differs from snapshots/matrix_tests.txt:" >&2 + diff snapshots/matrix_tests.txt "/tmp/matrix-norm-${t}.txt" >&2 || true + exit 1 + fi + checked=$((checked + 1)) +done <<< "$discovered" +[ "$checked" -gt 0 ] || { echo "No scalar type matched the canonical snapshot." >&2; exit 1; } + +# Completeness cross-check against the catalog (the single source of truth). +catalog=$(cd "{{config_root}}" && cargo run -p eql-codegen -- list-types | LC_ALL=C sort -u) +if [ "$discovered" != "$catalog" ]; then + echo "Catalog types and matrix-wired types disagree." >&2 + echo " catalog (eql-codegen list-types): $(echo "$catalog" | tr '\\n' ' ')" >&2 + echo " matrix-wired (binary --list): $(echo "$discovered" | tr '\\n' ' ')" >&2 + echo "A catalog type missing its matrix wiring (or a wired type not in the catalog) trips this." >&2 + exit 1 +fi + +echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot; catalog reconciled." """ [tasks."test:matrix:expand"] diff --git a/tests/sqlx/snapshots/int2_matrix_tests.txt b/tests/sqlx/snapshots/int2_matrix_tests.txt deleted file mode 100644 index 3b6ed674a..000000000 --- a/tests/sqlx/snapshots/int2_matrix_tests.txt +++ /dev/null @@ -1,211 +0,0 @@ -scalars::int2::matrix_int2_eq_aggregate_typecheck_max -scalars::int2::matrix_int2_eq_aggregate_typecheck_min -scalars::int2::matrix_int2_eq_contained_by_blocker -scalars::int2::matrix_int2_eq_contains_blocker -scalars::int2::matrix_int2_eq_count_distinct_extractor -scalars::int2::matrix_int2_eq_count_path_cast -scalars::int2::matrix_int2_eq_count_typed_column -scalars::int2::matrix_int2_eq_eq_pivot_max_correctness -scalars::int2::matrix_int2_eq_eq_pivot_max_cross_shape -scalars::int2::matrix_int2_eq_eq_pivot_min_correctness -scalars::int2::matrix_int2_eq_eq_pivot_min_cross_shape -scalars::int2::matrix_int2_eq_eq_pivot_zero_correctness -scalars::int2::matrix_int2_eq_eq_pivot_zero_cross_shape -scalars::int2::matrix_int2_eq_eq_supported_null -scalars::int2::matrix_int2_eq_gt_blocker -scalars::int2::matrix_int2_eq_gte_blocker -scalars::int2::matrix_int2_eq_index_engages_btree -scalars::int2::matrix_int2_eq_index_engages_hash -scalars::int2::matrix_int2_eq_lt_blocker -scalars::int2::matrix_int2_eq_lte_blocker -scalars::int2::matrix_int2_eq_native_absent_ops -scalars::int2::matrix_int2_eq_neq_pivot_max_correctness -scalars::int2::matrix_int2_eq_neq_pivot_max_cross_shape -scalars::int2::matrix_int2_eq_neq_pivot_min_correctness -scalars::int2::matrix_int2_eq_neq_pivot_min_cross_shape -scalars::int2::matrix_int2_eq_neq_pivot_zero_correctness -scalars::int2::matrix_int2_eq_neq_pivot_zero_cross_shape -scalars::int2::matrix_int2_eq_neq_supported_null -scalars::int2::matrix_int2_eq_path_op_blockers -scalars::int2::matrix_int2_eq_payload_check -scalars::int2::matrix_int2_eq_planner_metadata_eq -scalars::int2::matrix_int2_eq_sanity -scalars::int2::matrix_int2_eq_typed_column_blocker -scalars::int2::matrix_int2_fixture_shape -scalars::int2::matrix_int2_ord_aggregate_group_by_max -scalars::int2::matrix_int2_ord_aggregate_group_by_min -scalars::int2::matrix_int2_ord_aggregate_max -scalars::int2::matrix_int2_ord_aggregate_max_all_null -scalars::int2::matrix_int2_ord_aggregate_max_empty -scalars::int2::matrix_int2_ord_aggregate_max_mixed_null -scalars::int2::matrix_int2_ord_aggregate_min -scalars::int2::matrix_int2_ord_aggregate_min_all_null -scalars::int2::matrix_int2_ord_aggregate_min_empty -scalars::int2::matrix_int2_ord_aggregate_min_mixed_null -scalars::int2::matrix_int2_ord_aggregate_parallel_safe -scalars::int2::matrix_int2_ord_contained_by_blocker -scalars::int2::matrix_int2_ord_contains_blocker -scalars::int2::matrix_int2_ord_count_distinct_extractor -scalars::int2::matrix_int2_ord_count_path_cast -scalars::int2::matrix_int2_ord_count_typed_column -scalars::int2::matrix_int2_ord_eq_pivot_max_correctness -scalars::int2::matrix_int2_ord_eq_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_eq_pivot_min_correctness -scalars::int2::matrix_int2_ord_eq_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_eq_pivot_zero_correctness -scalars::int2::matrix_int2_ord_eq_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_eq_supported_null -scalars::int2::matrix_int2_ord_gt_pivot_max_correctness -scalars::int2::matrix_int2_ord_gt_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_gt_pivot_min_correctness -scalars::int2::matrix_int2_ord_gt_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_gt_pivot_zero_correctness -scalars::int2::matrix_int2_ord_gt_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_gt_supported_null -scalars::int2::matrix_int2_ord_gte_pivot_max_correctness -scalars::int2::matrix_int2_ord_gte_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_gte_pivot_min_correctness -scalars::int2::matrix_int2_ord_gte_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_gte_pivot_zero_correctness -scalars::int2::matrix_int2_ord_gte_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_gte_supported_null -scalars::int2::matrix_int2_ord_index_engages_btree -scalars::int2::matrix_int2_ord_lt_pivot_max_correctness -scalars::int2::matrix_int2_ord_lt_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_lt_pivot_min_correctness -scalars::int2::matrix_int2_ord_lt_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_lt_pivot_zero_correctness -scalars::int2::matrix_int2_ord_lt_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_lt_supported_null -scalars::int2::matrix_int2_ord_lte_pivot_max_correctness -scalars::int2::matrix_int2_ord_lte_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_lte_pivot_min_correctness -scalars::int2::matrix_int2_ord_lte_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_lte_pivot_zero_correctness -scalars::int2::matrix_int2_ord_lte_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_lte_supported_null -scalars::int2::matrix_int2_ord_native_absent_ops -scalars::int2::matrix_int2_ord_neq_pivot_max_correctness -scalars::int2::matrix_int2_ord_neq_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_neq_pivot_min_correctness -scalars::int2::matrix_int2_ord_neq_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_neq_pivot_zero_correctness -scalars::int2::matrix_int2_ord_neq_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_neq_supported_null -scalars::int2::matrix_int2_ord_ord_routes_through_ob -scalars::int2::matrix_int2_ord_order_by_asc_no_where -scalars::int2::matrix_int2_ord_order_by_asc_nulls_first -scalars::int2::matrix_int2_ord_order_by_asc_nulls_last -scalars::int2::matrix_int2_ord_order_by_asc_with_where -scalars::int2::matrix_int2_ord_order_by_desc_no_where -scalars::int2::matrix_int2_ord_order_by_desc_nulls_first -scalars::int2::matrix_int2_ord_order_by_desc_nulls_last -scalars::int2::matrix_int2_ord_order_by_desc_with_where -scalars::int2::matrix_int2_ord_order_by_using_gt_rejects -scalars::int2::matrix_int2_ord_order_by_using_gte_rejects -scalars::int2::matrix_int2_ord_order_by_using_lt_rejects -scalars::int2::matrix_int2_ord_order_by_using_lte_rejects -scalars::int2::matrix_int2_ord_ore_aggregate_group_by_max -scalars::int2::matrix_int2_ord_ore_aggregate_group_by_min -scalars::int2::matrix_int2_ord_ore_aggregate_max -scalars::int2::matrix_int2_ord_ore_aggregate_max_all_null -scalars::int2::matrix_int2_ord_ore_aggregate_max_empty -scalars::int2::matrix_int2_ord_ore_aggregate_max_mixed_null -scalars::int2::matrix_int2_ord_ore_aggregate_min -scalars::int2::matrix_int2_ord_ore_aggregate_min_all_null -scalars::int2::matrix_int2_ord_ore_aggregate_min_empty -scalars::int2::matrix_int2_ord_ore_aggregate_min_mixed_null -scalars::int2::matrix_int2_ord_ore_aggregate_parallel_safe -scalars::int2::matrix_int2_ord_ore_contained_by_blocker -scalars::int2::matrix_int2_ord_ore_contains_blocker -scalars::int2::matrix_int2_ord_ore_count_distinct_extractor -scalars::int2::matrix_int2_ord_ore_count_path_cast -scalars::int2::matrix_int2_ord_ore_count_typed_column -scalars::int2::matrix_int2_ord_ore_eq_pivot_max_correctness -scalars::int2::matrix_int2_ord_ore_eq_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_ore_eq_pivot_min_correctness -scalars::int2::matrix_int2_ord_ore_eq_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_ore_eq_pivot_zero_correctness -scalars::int2::matrix_int2_ord_ore_eq_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_ore_eq_supported_null -scalars::int2::matrix_int2_ord_ore_gt_pivot_max_correctness -scalars::int2::matrix_int2_ord_ore_gt_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_ore_gt_pivot_min_correctness -scalars::int2::matrix_int2_ord_ore_gt_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_ore_gt_pivot_zero_correctness -scalars::int2::matrix_int2_ord_ore_gt_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_ore_gt_supported_null -scalars::int2::matrix_int2_ord_ore_gte_pivot_max_correctness -scalars::int2::matrix_int2_ord_ore_gte_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_ore_gte_pivot_min_correctness -scalars::int2::matrix_int2_ord_ore_gte_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_ore_gte_pivot_zero_correctness -scalars::int2::matrix_int2_ord_ore_gte_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_ore_gte_supported_null -scalars::int2::matrix_int2_ord_ore_index_engages_btree -scalars::int2::matrix_int2_ord_ore_lt_pivot_max_correctness -scalars::int2::matrix_int2_ord_ore_lt_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_ore_lt_pivot_min_correctness -scalars::int2::matrix_int2_ord_ore_lt_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_ore_lt_pivot_zero_correctness -scalars::int2::matrix_int2_ord_ore_lt_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_ore_lt_supported_null -scalars::int2::matrix_int2_ord_ore_lte_pivot_max_correctness -scalars::int2::matrix_int2_ord_ore_lte_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_ore_lte_pivot_min_correctness -scalars::int2::matrix_int2_ord_ore_lte_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_ore_lte_pivot_zero_correctness -scalars::int2::matrix_int2_ord_ore_lte_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_ore_lte_supported_null -scalars::int2::matrix_int2_ord_ore_native_absent_ops -scalars::int2::matrix_int2_ord_ore_neq_pivot_max_correctness -scalars::int2::matrix_int2_ord_ore_neq_pivot_max_cross_shape -scalars::int2::matrix_int2_ord_ore_neq_pivot_min_correctness -scalars::int2::matrix_int2_ord_ore_neq_pivot_min_cross_shape -scalars::int2::matrix_int2_ord_ore_neq_pivot_zero_correctness -scalars::int2::matrix_int2_ord_ore_neq_pivot_zero_cross_shape -scalars::int2::matrix_int2_ord_ore_neq_supported_null -scalars::int2::matrix_int2_ord_ore_ord_routes_through_ob -scalars::int2::matrix_int2_ord_ore_order_by_asc_no_where -scalars::int2::matrix_int2_ord_ore_order_by_asc_nulls_first -scalars::int2::matrix_int2_ord_ore_order_by_asc_nulls_last -scalars::int2::matrix_int2_ord_ore_order_by_asc_with_where -scalars::int2::matrix_int2_ord_ore_order_by_desc_no_where -scalars::int2::matrix_int2_ord_ore_order_by_desc_nulls_first -scalars::int2::matrix_int2_ord_ore_order_by_desc_nulls_last -scalars::int2::matrix_int2_ord_ore_order_by_desc_with_where -scalars::int2::matrix_int2_ord_ore_order_by_using_gt_rejects -scalars::int2::matrix_int2_ord_ore_order_by_using_gte_rejects -scalars::int2::matrix_int2_ord_ore_order_by_using_lt_rejects -scalars::int2::matrix_int2_ord_ore_order_by_using_lte_rejects -scalars::int2::matrix_int2_ord_ore_ore_injectivity -scalars::int2::matrix_int2_ord_ore_path_op_blockers -scalars::int2::matrix_int2_ord_ore_payload_check -scalars::int2::matrix_int2_ord_ore_planner_metadata_eq -scalars::int2::matrix_int2_ord_ore_planner_metadata_ord -scalars::int2::matrix_int2_ord_ore_sanity -scalars::int2::matrix_int2_ord_ore_typed_column_blocker -scalars::int2::matrix_int2_ord_path_op_blockers -scalars::int2::matrix_int2_ord_payload_check -scalars::int2::matrix_int2_ord_planner_metadata_eq -scalars::int2::matrix_int2_ord_planner_metadata_ord -scalars::int2::matrix_int2_ord_sanity -scalars::int2::matrix_int2_ord_scale_preference_default_btree -scalars::int2::matrix_int2_ord_typed_column_blocker -scalars::int2::matrix_int2_storage_aggregate_typecheck_max -scalars::int2::matrix_int2_storage_aggregate_typecheck_min -scalars::int2::matrix_int2_storage_contained_by_blocker -scalars::int2::matrix_int2_storage_contains_blocker -scalars::int2::matrix_int2_storage_count_path_cast -scalars::int2::matrix_int2_storage_count_typed_column -scalars::int2::matrix_int2_storage_eq_blocker -scalars::int2::matrix_int2_storage_gt_blocker -scalars::int2::matrix_int2_storage_gte_blocker -scalars::int2::matrix_int2_storage_lt_blocker -scalars::int2::matrix_int2_storage_lte_blocker -scalars::int2::matrix_int2_storage_native_absent_ops -scalars::int2::matrix_int2_storage_neq_blocker -scalars::int2::matrix_int2_storage_path_op_blockers -scalars::int2::matrix_int2_storage_payload_check -scalars::int2::matrix_int2_storage_sanity -scalars::int2::matrix_int2_storage_typed_column_blocker diff --git a/tests/sqlx/snapshots/int4_matrix_tests.txt b/tests/sqlx/snapshots/int4_matrix_tests.txt deleted file mode 100644 index 1fab59bd0..000000000 --- a/tests/sqlx/snapshots/int4_matrix_tests.txt +++ /dev/null @@ -1,211 +0,0 @@ -scalars::int4::matrix_int4_eq_aggregate_typecheck_max -scalars::int4::matrix_int4_eq_aggregate_typecheck_min -scalars::int4::matrix_int4_eq_contained_by_blocker -scalars::int4::matrix_int4_eq_contains_blocker -scalars::int4::matrix_int4_eq_count_distinct_extractor -scalars::int4::matrix_int4_eq_count_path_cast -scalars::int4::matrix_int4_eq_count_typed_column -scalars::int4::matrix_int4_eq_eq_pivot_max_correctness -scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape -scalars::int4::matrix_int4_eq_eq_pivot_min_correctness -scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape -scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness -scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape -scalars::int4::matrix_int4_eq_eq_supported_null -scalars::int4::matrix_int4_eq_gt_blocker -scalars::int4::matrix_int4_eq_gte_blocker -scalars::int4::matrix_int4_eq_index_engages_btree -scalars::int4::matrix_int4_eq_index_engages_hash -scalars::int4::matrix_int4_eq_lt_blocker -scalars::int4::matrix_int4_eq_lte_blocker -scalars::int4::matrix_int4_eq_native_absent_ops -scalars::int4::matrix_int4_eq_neq_pivot_max_correctness -scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape -scalars::int4::matrix_int4_eq_neq_pivot_min_correctness -scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape -scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness -scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape -scalars::int4::matrix_int4_eq_neq_supported_null -scalars::int4::matrix_int4_eq_path_op_blockers -scalars::int4::matrix_int4_eq_payload_check -scalars::int4::matrix_int4_eq_planner_metadata_eq -scalars::int4::matrix_int4_eq_sanity -scalars::int4::matrix_int4_eq_typed_column_blocker -scalars::int4::matrix_int4_fixture_shape -scalars::int4::matrix_int4_ord_aggregate_group_by_max -scalars::int4::matrix_int4_ord_aggregate_group_by_min -scalars::int4::matrix_int4_ord_aggregate_max -scalars::int4::matrix_int4_ord_aggregate_max_all_null -scalars::int4::matrix_int4_ord_aggregate_max_empty -scalars::int4::matrix_int4_ord_aggregate_max_mixed_null -scalars::int4::matrix_int4_ord_aggregate_min -scalars::int4::matrix_int4_ord_aggregate_min_all_null -scalars::int4::matrix_int4_ord_aggregate_min_empty -scalars::int4::matrix_int4_ord_aggregate_min_mixed_null -scalars::int4::matrix_int4_ord_aggregate_parallel_safe -scalars::int4::matrix_int4_ord_contained_by_blocker -scalars::int4::matrix_int4_ord_contains_blocker -scalars::int4::matrix_int4_ord_count_distinct_extractor -scalars::int4::matrix_int4_ord_count_path_cast -scalars::int4::matrix_int4_ord_count_typed_column -scalars::int4::matrix_int4_ord_eq_pivot_max_correctness -scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_eq_pivot_min_correctness -scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness -scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_eq_supported_null -scalars::int4::matrix_int4_ord_gt_pivot_max_correctness -scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_gt_pivot_min_correctness -scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness -scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_gt_supported_null -scalars::int4::matrix_int4_ord_gte_pivot_max_correctness -scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_gte_pivot_min_correctness -scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness -scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_gte_supported_null -scalars::int4::matrix_int4_ord_index_engages_btree -scalars::int4::matrix_int4_ord_lt_pivot_max_correctness -scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_lt_pivot_min_correctness -scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness -scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_lt_supported_null -scalars::int4::matrix_int4_ord_lte_pivot_max_correctness -scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_lte_pivot_min_correctness -scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness -scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_lte_supported_null -scalars::int4::matrix_int4_ord_native_absent_ops -scalars::int4::matrix_int4_ord_neq_pivot_max_correctness -scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_neq_pivot_min_correctness -scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness -scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_neq_supported_null -scalars::int4::matrix_int4_ord_ord_routes_through_ob -scalars::int4::matrix_int4_ord_order_by_asc_no_where -scalars::int4::matrix_int4_ord_order_by_asc_nulls_first -scalars::int4::matrix_int4_ord_order_by_asc_nulls_last -scalars::int4::matrix_int4_ord_order_by_asc_with_where -scalars::int4::matrix_int4_ord_order_by_desc_no_where -scalars::int4::matrix_int4_ord_order_by_desc_nulls_first -scalars::int4::matrix_int4_ord_order_by_desc_nulls_last -scalars::int4::matrix_int4_ord_order_by_desc_with_where -scalars::int4::matrix_int4_ord_order_by_using_gt_rejects -scalars::int4::matrix_int4_ord_order_by_using_gte_rejects -scalars::int4::matrix_int4_ord_order_by_using_lt_rejects -scalars::int4::matrix_int4_ord_order_by_using_lte_rejects -scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max -scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min -scalars::int4::matrix_int4_ord_ore_aggregate_max -scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null -scalars::int4::matrix_int4_ord_ore_aggregate_max_empty -scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null -scalars::int4::matrix_int4_ord_ore_aggregate_min -scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null -scalars::int4::matrix_int4_ord_ore_aggregate_min_empty -scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null -scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe -scalars::int4::matrix_int4_ord_ore_contained_by_blocker -scalars::int4::matrix_int4_ord_ore_contains_blocker -scalars::int4::matrix_int4_ord_ore_count_distinct_extractor -scalars::int4::matrix_int4_ord_ore_count_path_cast -scalars::int4::matrix_int4_ord_ore_count_typed_column -scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness -scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness -scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness -scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_ore_eq_supported_null -scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness -scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness -scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness -scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_ore_gt_supported_null -scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness -scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness -scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness -scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_ore_gte_supported_null -scalars::int4::matrix_int4_ord_ore_index_engages_btree -scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness -scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness -scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness -scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_ore_lt_supported_null -scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness -scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness -scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness -scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_ore_lte_supported_null -scalars::int4::matrix_int4_ord_ore_native_absent_ops -scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness -scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape -scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness -scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape -scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness -scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape -scalars::int4::matrix_int4_ord_ore_neq_supported_null -scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob -scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where -scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first -scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last -scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where -scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where -scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first -scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last -scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where -scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects -scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects -scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects -scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects -scalars::int4::matrix_int4_ord_ore_ore_injectivity -scalars::int4::matrix_int4_ord_ore_path_op_blockers -scalars::int4::matrix_int4_ord_ore_payload_check -scalars::int4::matrix_int4_ord_ore_planner_metadata_eq -scalars::int4::matrix_int4_ord_ore_planner_metadata_ord -scalars::int4::matrix_int4_ord_ore_sanity -scalars::int4::matrix_int4_ord_ore_typed_column_blocker -scalars::int4::matrix_int4_ord_path_op_blockers -scalars::int4::matrix_int4_ord_payload_check -scalars::int4::matrix_int4_ord_planner_metadata_eq -scalars::int4::matrix_int4_ord_planner_metadata_ord -scalars::int4::matrix_int4_ord_sanity -scalars::int4::matrix_int4_ord_scale_preference_default_btree -scalars::int4::matrix_int4_ord_typed_column_blocker -scalars::int4::matrix_int4_storage_aggregate_typecheck_max -scalars::int4::matrix_int4_storage_aggregate_typecheck_min -scalars::int4::matrix_int4_storage_contained_by_blocker -scalars::int4::matrix_int4_storage_contains_blocker -scalars::int4::matrix_int4_storage_count_path_cast -scalars::int4::matrix_int4_storage_count_typed_column -scalars::int4::matrix_int4_storage_eq_blocker -scalars::int4::matrix_int4_storage_gt_blocker -scalars::int4::matrix_int4_storage_gte_blocker -scalars::int4::matrix_int4_storage_lt_blocker -scalars::int4::matrix_int4_storage_lte_blocker -scalars::int4::matrix_int4_storage_native_absent_ops -scalars::int4::matrix_int4_storage_neq_blocker -scalars::int4::matrix_int4_storage_path_op_blockers -scalars::int4::matrix_int4_storage_payload_check -scalars::int4::matrix_int4_storage_sanity -scalars::int4::matrix_int4_storage_typed_column_blocker diff --git a/tests/sqlx/snapshots/matrix_tests.txt b/tests/sqlx/snapshots/matrix_tests.txt new file mode 100644 index 000000000..2cdfc22bd --- /dev/null +++ b/tests/sqlx/snapshots/matrix_tests.txt @@ -0,0 +1,211 @@ +scalars::::matrix__eq_aggregate_typecheck_max +scalars::::matrix__eq_aggregate_typecheck_min +scalars::::matrix__eq_contained_by_blocker +scalars::::matrix__eq_contains_blocker +scalars::::matrix__eq_count_distinct_extractor +scalars::::matrix__eq_count_path_cast +scalars::::matrix__eq_count_typed_column +scalars::::matrix__eq_eq_pivot_max_correctness +scalars::::matrix__eq_eq_pivot_max_cross_shape +scalars::::matrix__eq_eq_pivot_min_correctness +scalars::::matrix__eq_eq_pivot_min_cross_shape +scalars::::matrix__eq_eq_pivot_zero_correctness +scalars::::matrix__eq_eq_pivot_zero_cross_shape +scalars::::matrix__eq_eq_supported_null +scalars::::matrix__eq_gt_blocker +scalars::::matrix__eq_gte_blocker +scalars::::matrix__eq_index_engages_btree +scalars::::matrix__eq_index_engages_hash +scalars::::matrix__eq_lt_blocker +scalars::::matrix__eq_lte_blocker +scalars::::matrix__eq_native_absent_ops +scalars::::matrix__eq_neq_pivot_max_correctness +scalars::::matrix__eq_neq_pivot_max_cross_shape +scalars::::matrix__eq_neq_pivot_min_correctness +scalars::::matrix__eq_neq_pivot_min_cross_shape +scalars::::matrix__eq_neq_pivot_zero_correctness +scalars::::matrix__eq_neq_pivot_zero_cross_shape +scalars::::matrix__eq_neq_supported_null +scalars::::matrix__eq_path_op_blockers +scalars::::matrix__eq_payload_check +scalars::::matrix__eq_planner_metadata_eq +scalars::::matrix__eq_sanity +scalars::::matrix__eq_typed_column_blocker +scalars::::matrix__fixture_shape +scalars::::matrix__ord_aggregate_group_by_max +scalars::::matrix__ord_aggregate_group_by_min +scalars::::matrix__ord_aggregate_max +scalars::::matrix__ord_aggregate_max_all_null +scalars::::matrix__ord_aggregate_max_empty +scalars::::matrix__ord_aggregate_max_mixed_null +scalars::::matrix__ord_aggregate_min +scalars::::matrix__ord_aggregate_min_all_null +scalars::::matrix__ord_aggregate_min_empty +scalars::::matrix__ord_aggregate_min_mixed_null +scalars::::matrix__ord_aggregate_parallel_safe +scalars::::matrix__ord_contained_by_blocker +scalars::::matrix__ord_contains_blocker +scalars::::matrix__ord_count_distinct_extractor +scalars::::matrix__ord_count_path_cast +scalars::::matrix__ord_count_typed_column +scalars::::matrix__ord_eq_pivot_max_correctness +scalars::::matrix__ord_eq_pivot_max_cross_shape +scalars::::matrix__ord_eq_pivot_min_correctness +scalars::::matrix__ord_eq_pivot_min_cross_shape +scalars::::matrix__ord_eq_pivot_zero_correctness +scalars::::matrix__ord_eq_pivot_zero_cross_shape +scalars::::matrix__ord_eq_supported_null +scalars::::matrix__ord_gt_pivot_max_correctness +scalars::::matrix__ord_gt_pivot_max_cross_shape +scalars::::matrix__ord_gt_pivot_min_correctness +scalars::::matrix__ord_gt_pivot_min_cross_shape +scalars::::matrix__ord_gt_pivot_zero_correctness +scalars::::matrix__ord_gt_pivot_zero_cross_shape +scalars::::matrix__ord_gt_supported_null +scalars::::matrix__ord_gte_pivot_max_correctness +scalars::::matrix__ord_gte_pivot_max_cross_shape +scalars::::matrix__ord_gte_pivot_min_correctness +scalars::::matrix__ord_gte_pivot_min_cross_shape +scalars::::matrix__ord_gte_pivot_zero_correctness +scalars::::matrix__ord_gte_pivot_zero_cross_shape +scalars::::matrix__ord_gte_supported_null +scalars::::matrix__ord_index_engages_btree +scalars::::matrix__ord_lt_pivot_max_correctness +scalars::::matrix__ord_lt_pivot_max_cross_shape +scalars::::matrix__ord_lt_pivot_min_correctness +scalars::::matrix__ord_lt_pivot_min_cross_shape +scalars::::matrix__ord_lt_pivot_zero_correctness +scalars::::matrix__ord_lt_pivot_zero_cross_shape +scalars::::matrix__ord_lt_supported_null +scalars::::matrix__ord_lte_pivot_max_correctness +scalars::::matrix__ord_lte_pivot_max_cross_shape +scalars::::matrix__ord_lte_pivot_min_correctness +scalars::::matrix__ord_lte_pivot_min_cross_shape +scalars::::matrix__ord_lte_pivot_zero_correctness +scalars::::matrix__ord_lte_pivot_zero_cross_shape +scalars::::matrix__ord_lte_supported_null +scalars::::matrix__ord_native_absent_ops +scalars::::matrix__ord_neq_pivot_max_correctness +scalars::::matrix__ord_neq_pivot_max_cross_shape +scalars::::matrix__ord_neq_pivot_min_correctness +scalars::::matrix__ord_neq_pivot_min_cross_shape +scalars::::matrix__ord_neq_pivot_zero_correctness +scalars::::matrix__ord_neq_pivot_zero_cross_shape +scalars::::matrix__ord_neq_supported_null +scalars::::matrix__ord_ord_routes_through_ob +scalars::::matrix__ord_order_by_asc_no_where +scalars::::matrix__ord_order_by_asc_nulls_first +scalars::::matrix__ord_order_by_asc_nulls_last +scalars::::matrix__ord_order_by_asc_with_where +scalars::::matrix__ord_order_by_desc_no_where +scalars::::matrix__ord_order_by_desc_nulls_first +scalars::::matrix__ord_order_by_desc_nulls_last +scalars::::matrix__ord_order_by_desc_with_where +scalars::::matrix__ord_order_by_using_gt_rejects +scalars::::matrix__ord_order_by_using_gte_rejects +scalars::::matrix__ord_order_by_using_lt_rejects +scalars::::matrix__ord_order_by_using_lte_rejects +scalars::::matrix__ord_ore_aggregate_group_by_max +scalars::::matrix__ord_ore_aggregate_group_by_min +scalars::::matrix__ord_ore_aggregate_max +scalars::::matrix__ord_ore_aggregate_max_all_null +scalars::::matrix__ord_ore_aggregate_max_empty +scalars::::matrix__ord_ore_aggregate_max_mixed_null +scalars::::matrix__ord_ore_aggregate_min +scalars::::matrix__ord_ore_aggregate_min_all_null +scalars::::matrix__ord_ore_aggregate_min_empty +scalars::::matrix__ord_ore_aggregate_min_mixed_null +scalars::::matrix__ord_ore_aggregate_parallel_safe +scalars::::matrix__ord_ore_contained_by_blocker +scalars::::matrix__ord_ore_contains_blocker +scalars::::matrix__ord_ore_count_distinct_extractor +scalars::::matrix__ord_ore_count_path_cast +scalars::::matrix__ord_ore_count_typed_column +scalars::::matrix__ord_ore_eq_pivot_max_correctness +scalars::::matrix__ord_ore_eq_pivot_max_cross_shape +scalars::::matrix__ord_ore_eq_pivot_min_correctness +scalars::::matrix__ord_ore_eq_pivot_min_cross_shape +scalars::::matrix__ord_ore_eq_pivot_zero_correctness +scalars::::matrix__ord_ore_eq_pivot_zero_cross_shape +scalars::::matrix__ord_ore_eq_supported_null +scalars::::matrix__ord_ore_gt_pivot_max_correctness +scalars::::matrix__ord_ore_gt_pivot_max_cross_shape +scalars::::matrix__ord_ore_gt_pivot_min_correctness +scalars::::matrix__ord_ore_gt_pivot_min_cross_shape +scalars::::matrix__ord_ore_gt_pivot_zero_correctness +scalars::::matrix__ord_ore_gt_pivot_zero_cross_shape +scalars::::matrix__ord_ore_gt_supported_null +scalars::::matrix__ord_ore_gte_pivot_max_correctness +scalars::::matrix__ord_ore_gte_pivot_max_cross_shape +scalars::::matrix__ord_ore_gte_pivot_min_correctness +scalars::::matrix__ord_ore_gte_pivot_min_cross_shape +scalars::::matrix__ord_ore_gte_pivot_zero_correctness +scalars::::matrix__ord_ore_gte_pivot_zero_cross_shape +scalars::::matrix__ord_ore_gte_supported_null +scalars::::matrix__ord_ore_index_engages_btree +scalars::::matrix__ord_ore_lt_pivot_max_correctness +scalars::::matrix__ord_ore_lt_pivot_max_cross_shape +scalars::::matrix__ord_ore_lt_pivot_min_correctness +scalars::::matrix__ord_ore_lt_pivot_min_cross_shape +scalars::::matrix__ord_ore_lt_pivot_zero_correctness +scalars::::matrix__ord_ore_lt_pivot_zero_cross_shape +scalars::::matrix__ord_ore_lt_supported_null +scalars::::matrix__ord_ore_lte_pivot_max_correctness +scalars::::matrix__ord_ore_lte_pivot_max_cross_shape +scalars::::matrix__ord_ore_lte_pivot_min_correctness +scalars::::matrix__ord_ore_lte_pivot_min_cross_shape +scalars::::matrix__ord_ore_lte_pivot_zero_correctness +scalars::::matrix__ord_ore_lte_pivot_zero_cross_shape +scalars::::matrix__ord_ore_lte_supported_null +scalars::::matrix__ord_ore_native_absent_ops +scalars::::matrix__ord_ore_neq_pivot_max_correctness +scalars::::matrix__ord_ore_neq_pivot_max_cross_shape +scalars::::matrix__ord_ore_neq_pivot_min_correctness +scalars::::matrix__ord_ore_neq_pivot_min_cross_shape +scalars::::matrix__ord_ore_neq_pivot_zero_correctness +scalars::::matrix__ord_ore_neq_pivot_zero_cross_shape +scalars::::matrix__ord_ore_neq_supported_null +scalars::::matrix__ord_ore_ord_routes_through_ob +scalars::::matrix__ord_ore_order_by_asc_no_where +scalars::::matrix__ord_ore_order_by_asc_nulls_first +scalars::::matrix__ord_ore_order_by_asc_nulls_last +scalars::::matrix__ord_ore_order_by_asc_with_where +scalars::::matrix__ord_ore_order_by_desc_no_where +scalars::::matrix__ord_ore_order_by_desc_nulls_first +scalars::::matrix__ord_ore_order_by_desc_nulls_last +scalars::::matrix__ord_ore_order_by_desc_with_where +scalars::::matrix__ord_ore_order_by_using_gt_rejects +scalars::::matrix__ord_ore_order_by_using_gte_rejects +scalars::::matrix__ord_ore_order_by_using_lt_rejects +scalars::::matrix__ord_ore_order_by_using_lte_rejects +scalars::::matrix__ord_ore_ore_injectivity +scalars::::matrix__ord_ore_path_op_blockers +scalars::::matrix__ord_ore_payload_check +scalars::::matrix__ord_ore_planner_metadata_eq +scalars::::matrix__ord_ore_planner_metadata_ord +scalars::::matrix__ord_ore_sanity +scalars::::matrix__ord_ore_typed_column_blocker +scalars::::matrix__ord_path_op_blockers +scalars::::matrix__ord_payload_check +scalars::::matrix__ord_planner_metadata_eq +scalars::::matrix__ord_planner_metadata_ord +scalars::::matrix__ord_sanity +scalars::::matrix__ord_scale_preference_default_btree +scalars::::matrix__ord_typed_column_blocker +scalars::::matrix__storage_aggregate_typecheck_max +scalars::::matrix__storage_aggregate_typecheck_min +scalars::::matrix__storage_contained_by_blocker +scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_path_cast +scalars::::matrix__storage_count_typed_column +scalars::::matrix__storage_eq_blocker +scalars::::matrix__storage_gt_blocker +scalars::::matrix__storage_gte_blocker +scalars::::matrix__storage_lt_blocker +scalars::::matrix__storage_lte_blocker +scalars::::matrix__storage_native_absent_ops +scalars::::matrix__storage_neq_blocker +scalars::::matrix__storage_path_op_blockers +scalars::::matrix__storage_payload_check +scalars::::matrix__storage_sanity +scalars::::matrix__storage_typed_column_blocker From f8e3b9f1da62d65422fe3a527f826d661ba979c1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:33:56 +1000 Subject: [PATCH 047/599] ci(codegen): Rust catalog/generator tests + golden parity, drop pytest --- .github/workflows/test-eql.yml | 35 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 22a61d1c2..462062960 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -113,31 +113,30 @@ jobs: workspaces: . shared-key: sqlx-tests - # The Python `test:codegen` drift suite is intentionally not run here: the - # Python generator is deprecated and removed in the following PR. The - # hand-written reference (tests/codegen/reference/) is now gated against - # the Rust generator by the `mise run codegen:parity` step below. + # Crate compile/lint/test (cargo test -p eql-scalars -p eql-codegen) runs + # in the dedicated `test:crates` job; this job covers the codegen-specific + # gates only — fixture-value regeneration and golden/values parity. # Regenerate the committed Rust fixture-value consts for EVERY type from - # their manifests and fail if any differ from / are missing in the tree. - # The value lists are rendered deterministically (unlike the encrypted - # .sql fixtures, whose ciphertext is non-deterministic and gitignored), so - # a plain diff is the right guard — it catches a manifest edit that wasn't - # regenerated. `git add -N` registers any brand-new untracked const so a - # forgotten-to-commit file also trips the diff. No Postgres needed: this - # only runs the Python generator. + # the catalog and fail if any differ from / are missing in the tree. + # eql-codegen renders all _values.rs deterministically (unlike the + # encrypted .sql fixtures, whose ciphertext is non-deterministic and + # gitignored), so a plain diff is the right guard — it catches a catalog + # edit that wasn't regenerated. `git add -N` registers any brand-new + # untracked const so a forgotten-to-commit file also trips the diff. No + # Postgres needed: the generator is std-only. - name: Regenerate and verify fixture-value consts (all types) run: | - mise run codegen:domain:all + cargo run -p eql-codegen git add -N tests/sqlx/src/fixtures git diff --exit-code -- tests/sqlx/src/fixtures \ - || { echo "Fixture value const(s) stale or uncommitted — run 'mise run codegen:domain:all' and commit tests/sqlx/src/fixtures."; exit 1; } + || { echo "Fixture value const(s) stale or uncommitted — run 'cargo run -p eql-codegen' and commit tests/sqlx/src/fixtures."; exit 1; } - # Cross-generator parity: assert the Rust eql-codegen output is byte- - # identical to the Python oracle across all types, the committed - # _values.rs, and the int4 golden reference. No Postgres needed — both - # generators are deterministic and run offline. - - name: Verify Rust↔Python generator parity + # Parity gate: assert the Rust eql-codegen output is line-normalized-equal + # to the int4 golden reference and the committed _values.rs are byte- + # identical (git-clean) after regeneration. Python is no longer an oracle + # (retired in P2). No Postgres needed — the generator runs offline. + - name: Verify generator parity (golden + values) run: | mise run codegen:parity From 6391cbefa2d03a473bcbe693a0acb23ddb0abbaf Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:34:54 +1000 Subject: [PATCH 048/599] ci(matrix): verify single canonical snapshot, catalog-reconciled, cache root workspace --- .github/workflows/test-eql.yml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 462062960..feacd2c60 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -160,17 +160,21 @@ jobs: workspaces: . shared-key: sqlx-tests - # Regenerate the matrix test-name inventory with the SAME pinned feature - # set the local task uses (`--no-default-features`, scale excluded), then - # fail if it differs from the committed snapshot. A coverage change shows - # up as added/removed names in the PR diff — e.g. emptying `ord_domains` - # drops ~140 names, impossible to miss in review. No Postgres needed: - # `--list` only enumerates, the suite uses runtime queries. - - name: Regenerate and verify the matrix test-name inventory + # Verify the matrix test-name set against the SINGLE canonical snapshot + # (snapshots/matrix_tests.txt) with the SAME pinned feature set the local + # task uses (`--no-default-features`, scale excluded), and cross-check the + # binary's discovered type set against `eql-codegen list-types`. A coverage + # change shows up as a diff in the snapshot; a catalog type missing its + # matrix wiring fails the cross-check. No Postgres needed: `--list` only + # enumerates, the suite uses runtime queries. + - name: Verify the matrix test-name inventory run: | mise run test:matrix:inventory - git diff --exit-code -- tests/sqlx/snapshots/int4_matrix_tests.txt \ - tests/sqlx/snapshots/int2_matrix_tests.txt \ + # Diff the whole snapshots/ directory so the single canonical file + # isn't hardcoded here; the mise task discovers the type set from the + # binary and reconciles it against `eql-codegen list-types`. + git add -N tests/sqlx/snapshots + git diff --exit-code -- tests/sqlx/snapshots \ || { echo "Coverage inventory stale — run 'mise run test:matrix:inventory' and commit."; exit 1; } test: From d0bbc351e17e158113c0e91f31a7bc314f51954e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:56:38 +1000 Subject: [PATCH 049/599] build: remove Python codegen toolchain (catalog/generator is Rust) --- mise.toml | 18 +- tasks/codegen/__init__.py | 17 - tasks/codegen/conftest.py | 6 - tasks/codegen/domain.sh | 15 - tasks/codegen/generate.py | 333 ---------------- tasks/codegen/operator_surface.py | 72 ---- tasks/codegen/scalars.py | 102 ----- tasks/codegen/spec.py | 141 ------- tasks/codegen/templates.py | 495 ----------------------- tasks/codegen/terms.py | 107 ----- tasks/codegen/test_against_reference.py | 117 ------ tasks/codegen/test_generate.py | 351 ----------------- tasks/codegen/test_operator_surface.py | 126 ------ tasks/codegen/test_scalars.py | 82 ---- tasks/codegen/test_spec.py | 208 ---------- tasks/codegen/test_templates.py | 500 ------------------------ tasks/codegen/test_terms.py | 96 ----- tasks/codegen/test_writer.py | 157 -------- tasks/codegen/types/.gitkeep | 0 tasks/codegen/types/int2.toml | 19 - tasks/codegen/types/int4.toml | 19 - tasks/codegen/writer.py | 89 ----- 22 files changed, 6 insertions(+), 3064 deletions(-) delete mode 100644 tasks/codegen/__init__.py delete mode 100644 tasks/codegen/conftest.py delete mode 100755 tasks/codegen/domain.sh delete mode 100644 tasks/codegen/generate.py delete mode 100644 tasks/codegen/operator_surface.py delete mode 100644 tasks/codegen/scalars.py delete mode 100644 tasks/codegen/spec.py delete mode 100644 tasks/codegen/templates.py delete mode 100644 tasks/codegen/terms.py delete mode 100644 tasks/codegen/test_against_reference.py delete mode 100644 tasks/codegen/test_generate.py delete mode 100644 tasks/codegen/test_operator_surface.py delete mode 100644 tasks/codegen/test_scalars.py delete mode 100644 tasks/codegen/test_spec.py delete mode 100644 tasks/codegen/test_templates.py delete mode 100644 tasks/codegen/test_terms.py delete mode 100644 tasks/codegen/test_writer.py delete mode 100644 tasks/codegen/types/.gitkeep delete mode 100644 tasks/codegen/types/int2.toml delete mode 100644 tasks/codegen/types/int4.toml delete mode 100644 tasks/codegen/writer.py diff --git a/mise.toml b/mise.toml index c92d222b9..d4fabf596 100644 --- a/mise.toml +++ b/mise.toml @@ -18,6 +18,9 @@ # macro-expand-eql.yml workflow's mise-action step), so there is no separate # hardcoded version to keep in lockstep. "cargo:cargo-expand" = "1.0.122" +# Still required by the documentation tooling (`tasks/docs/generate/*.py`, run +# by `docs:generate:markdown` in the release workflow). The encrypted-domain +# codegen toolchain is now Rust (eql-scalars/eql-codegen) and needs no Python. "python" = "3.13" [task_config] @@ -90,25 +93,16 @@ run = """ cargo test --test payload_schema_tests """ -[tasks."codegen:domain:all"] -description = "Regenerate every encrypted-domain type from its TOML manifest" -dir = "{{config_root}}" -run = """ -mise exec python -- python -m tasks.codegen.generate --all -""" - [tasks."codegen:parity"] -description = "Parity gate: Rust eql-codegen output byte-identical to the Python oracle" +description = "Parity gate: Rust eql-codegen output matches the int4 golden (normalized) + committed values.rs" dir = "{{config_root}}" run = "bash tasks/codegen-parity.sh" [tasks."test:codegen"] -description = "Run the encrypted-domain codegen generator tests (no database required)" +description = "Run the encrypted-domain catalog + generator tests (no database required)" dir = "{{config_root}}" run = """ -# pytest is the only non-stdlib dependency; the install is a fast no-op once satisfied. -mise exec python -- python -m pip install --quiet --disable-pip-version-check pytest -mise exec python -- python -m pytest tasks/codegen -q +cargo test -p eql-scalars -p eql-codegen """ [tasks."test:crates"] diff --git a/tasks/codegen/__init__.py b/tasks/codegen/__init__.py deleted file mode 100644 index 4443af870..000000000 --- a/tasks/codegen/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Encrypted-domain SQL code generator for EQL scalar domain families.""" - -from .generate import generate_type, main -from .spec import DomainSpec, SpecError, TypeSpec, load_spec -from .terms import TERM_CATALOG, Term, TermError - -__all__ = [ - "DomainSpec", - "SpecError", - "TERM_CATALOG", - "Term", - "TermError", - "TypeSpec", - "generate_type", - "load_spec", - "main", -] diff --git a/tasks/codegen/conftest.py b/tasks/codegen/conftest.py deleted file mode 100644 index f03b0e8bb..000000000 --- a/tasks/codegen/conftest.py +++ /dev/null @@ -1,6 +0,0 @@ -"""pytest discovery anchor for the codegen package. - -Tests import via `from tasks.codegen. import ...`; pytest runs -from the repo root (where `tasks/__init__.py` exists), so no `sys.path` -manipulation is needed. -""" diff --git a/tasks/codegen/domain.sh b/tasks/codegen/domain.sh deleted file mode 100755 index ae279a128..000000000 --- a/tasks/codegen/domain.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -#MISE description="Regenerate an encrypted-domain type from its TOML spec" -#USAGE arg "type" help="Type token, e.g. int4 (matches tasks/codegen/types/.toml)" - -set -euo pipefail - -TYPE=${usage_type:?type argument required} - -echo "Regenerating encrypted-domain type: ${TYPE}" -mise exec python -- python -m tasks.codegen.generate "${TYPE}" -echo "" -echo "✓ Regenerated src/encrypted_domain/${TYPE}/ (gitignored)" -echo " Note: 'mise run build' regenerates every type automatically;" -echo " this task is for refreshing one type while iterating on its manifest." -echo " When ready, run 'mise run clean && mise run build' then 'mise run test'." diff --git a/tasks/codegen/generate.py b/tasks/codegen/generate.py deleted file mode 100644 index 03ac6be7f..000000000 --- a/tasks/codegen/generate.py +++ /dev/null @@ -1,333 +0,0 @@ -"""Top-level scalar encrypted-domain materializer.""" - -import sys -from collections.abc import Iterator -from pathlib import Path - -from .operator_surface import ( - BLOCKER_ONLY_OPERATORS, - PATH_OPERATORS, - SYMMETRIC_OPERATORS, - backing_function, -) -from .spec import DomainSpec, SpecError, TypeSpec, load_spec -from .templates import ( - AGGREGATE_OPS, - domain_name, - extractor_for_operator, - is_ord_capable, - render_aggregate, - render_blocker_bool, - render_blocker_native, - render_blocker_path, - render_domain_block, - render_extractor, - render_fixture_values_rs, - render_operator, - render_wrapper, - role_phrase, - supported_operators, -) -from .terms import TERM_CATALOG, Term, term_requires -from .writer import ( - clean_generated_files, - ensure_generated_paths_writable, - write_generated_file, - write_generated_rs, -) - -REPO_ROOT = Path(__file__).resolve().parents[2] - - -def _symmetric_shapes(dom: str) -> list[tuple[str, str]]: - return [(dom, dom), (dom, "jsonb"), ("jsonb", dom)] - - -def _path_shapes(dom: str) -> list[tuple[str, str]]: - return [(dom, "text"), (dom, "integer"), ("jsonb", dom)] - - -def _blocker_only_shapes(dom: str, op: str) -> list[tuple[str, str, str]]: - if op in {"?", "?|", "?&"}: - rhs = "text[]" if op in {"?|", "?&"} else "text" - return [(dom, rhs, "boolean")] - if op in {"@?", "@@"}: - return [(dom, "jsonpath", "boolean")] - if op == "#>": - return [(dom, "text[]", "jsonb")] - if op == "#>>": - return [(dom, "text[]", "text")] - if op == "-": - return [(dom, "text", "jsonb"), (dom, "integer", "jsonb"), (dom, "text[]", "jsonb")] - if op == "#-": - return [(dom, "text[]", "jsonb")] - if op == "||": - return [(dom, dom, "jsonb"), (dom, "jsonb", "jsonb"), ("jsonb", dom, "jsonb")] - raise ValueError(f"unhandled blocker-only operator: {op}") - - -def _types_path(token: str) -> str: - return f"src/encrypted_domain/{token}/{token}_types.sql" - - -def fixture_values_rs_path(out_root: Path, token: str) -> Path: - """Committed Rust fixture-value const for a type. Outside the gitignored - src/encrypted_domain/ SQL tree because it is consumed (and committed) by - the Rust test crate.""" - return ( - out_root / "tests" / "sqlx" / "src" / "fixtures" / f"{token}_values.rs" - ) - - -def render_types_file(spec: TypeSpec) -> str: - """Body for _types.sql: every domain in one idempotent DO block. - - Iteration order follows the manifest's declared order — the TOML file is - the source of truth for emit order. - """ - blocks = [render_domain_block(domain, spec.token) for domain in spec.domains] - return ( - "-- REQUIRE: src/schema-v3.sql\n\n" - f"--! @file encrypted_domain/{spec.token}/{spec.token}_types.sql\n" - f"--! @brief Encrypted-domain type family for {spec.token}.\n\n" - "DO $$\nBEGIN\n" - + "\n".join(blocks) - + "END\n$$;\n" - ) - - -def _functions_requires(spec: TypeSpec, domain: DomainSpec) -> list[str]: - reqs = [ - "src/schema.sql", - "src/schema-v3.sql", - _types_path(spec.token), - "src/encrypted_domain/functions.sql", - ] - for extra in term_requires(domain.terms): - if extra not in reqs: - reqs.append(extra) - return reqs - - -def _extractor_terms(domain: DomainSpec) -> Iterator[Term]: - seen: set[str] = set() - for term_name in domain.terms: - term = TERM_CATALOG[term_name] - if term.extractor not in seen: - seen.add(term.extractor) - yield term - - -def render_functions_file(spec: TypeSpec, domain: DomainSpec) -> str: - """Body for a domain's _functions.sql.""" - dom = domain_name(domain.name) - supported = set(supported_operators(domain)) - parts: list[str] = [] - - for term in _extractor_terms(domain): - parts.append(render_extractor(domain, term)) - - for op in SYMMETRIC_OPERATORS: - extractor = extractor_for_operator(domain, op) - for arg_a, arg_b in _symmetric_shapes(dom): - if op in supported and extractor is not None: - parts.append(render_wrapper(domain, op, arg_a, arg_b, extractor)) - else: - parts.append(render_blocker_bool(domain, op, arg_a, arg_b)) - - for op in PATH_OPERATORS: - for arg_a, arg_b in _path_shapes(dom): - parts.append(render_blocker_path(domain, op, arg_a, arg_b)) - - for op in BLOCKER_ONLY_OPERATORS: - for arg_a, arg_b, returns in _blocker_only_shapes(dom, op): - parts.append(render_blocker_native(domain, op, arg_a, arg_b, returns)) - - requires = "\n".join(f"-- REQUIRE: {r}" for r in _functions_requires(spec, domain)) - header = ( - requires + "\n\n" - f"--! @file encrypted_domain/{spec.token}/{domain.name}_functions.sql\n" - f"--! @brief {role_phrase(domain.terms)} domain of the {spec.token} " - f"encrypted-domain family — comparison/path functions.\n\n" - ) - return header + "\n".join(parts) - - -def render_operators_file(spec: TypeSpec, domain: DomainSpec) -> str: - """Body for a domain's _operators.sql: 44 CREATE OPERATOR statements.""" - dom = domain_name(domain.name) - supported = set(supported_operators(domain)) - parts: list[str] = [] - - for op in SYMMETRIC_OPERATORS: - backing = backing_function(op) - for leftarg, rightarg in _symmetric_shapes(dom): - parts.append( - render_operator( - op, backing, leftarg, rightarg, - supported=op in supported, - ) - ) - for op in PATH_OPERATORS: - backing = backing_function(op) - for leftarg, rightarg in _path_shapes(dom): - parts.append( - render_operator(op, backing, leftarg, rightarg, supported=False) - ) - for op in BLOCKER_ONLY_OPERATORS: - backing = backing_function(op) - for leftarg, rightarg, _returns in _blocker_only_shapes(dom, op): - parts.append( - render_operator(op, backing, leftarg, rightarg, supported=False) - ) - - requires = ( - "-- REQUIRE: src/schema-v3.sql\n" - f"-- REQUIRE: {_types_path(spec.token)}\n" - f"-- REQUIRE: src/encrypted_domain/{spec.token}/" - f"{domain.name}_functions.sql\n" - ) - header = ( - requires + "\n" - f"--! @file encrypted_domain/{spec.token}/{domain.name}_operators.sql\n" - f"--! @brief {role_phrase(domain.terms)} domain of the {spec.token} " - f"encrypted-domain family — operator declarations.\n\n" - ) - return header + "\n".join(parts) - - -def render_aggregates_file(spec: TypeSpec, domain: DomainSpec) -> str | None: - """Body for a domain's _aggregates.sql, or None if the domain has no - ordering comparator (storage/eq variants have no MIN/MAX semantics).""" - if not is_ord_capable(domain): - return None - parts = [render_aggregate(domain, AGGREGATE_OPS[name]) for name in ("min", "max")] - requires = ( - "-- REQUIRE: src/schema-v3.sql\n" - f"-- REQUIRE: {_types_path(spec.token)}\n" - f"-- REQUIRE: src/encrypted_domain/{spec.token}/" - f"{domain.name}_functions.sql\n" - f"-- REQUIRE: src/encrypted_domain/{spec.token}/" - f"{domain.name}_operators.sql\n" - ) - header = ( - requires + "\n" - f"--! @file encrypted_domain/{spec.token}/{domain.name}_aggregates.sql\n" - f"--! @brief {role_phrase(domain.terms)} domain of the {spec.token} " - f"encrypted-domain family — MIN/MAX aggregates.\n\n" - ) - return header + "\n".join(parts) - - -def generate_type(spec: TypeSpec, out_dir: Path) -> list[Path]: - """Regenerate every generated file for a type.""" - out_dir = Path(out_dir) - target_paths = [out_dir / f"{spec.token}_types.sql"] - for domain in spec.domains: - target_paths.append(out_dir / f"{domain.name}_functions.sql") - target_paths.append(out_dir / f"{domain.name}_operators.sql") - if is_ord_capable(domain): - target_paths.append(out_dir / f"{domain.name}_aggregates.sql") - ensure_generated_paths_writable(target_paths) - clean_generated_files(out_dir) - - written: list[Path] = [] - - types_path = out_dir / f"{spec.token}_types.sql" - write_generated_file(types_path, render_types_file(spec)) - written.append(types_path) - - for domain in spec.domains: - fn_path = out_dir / f"{domain.name}_functions.sql" - write_generated_file(fn_path, render_functions_file(spec, domain)) - written.append(fn_path) - - op_path = out_dir / f"{domain.name}_operators.sql" - write_generated_file(op_path, render_operators_file(spec, domain)) - written.append(op_path) - - agg_body = render_aggregates_file(spec, domain) - if agg_body is not None: - agg_path = out_dir / f"{domain.name}_aggregates.sql" - write_generated_file(agg_path, agg_body) - written.append(agg_path) - - return written - - -DEFAULT_TYPES_DIR = Path(__file__).parent / "types" - - -def generate_one(token: str, *, types_dir: Path, out_root: Path) -> int: - """Regenerate one type from types_dir/.toml. - - Returns 0 on success, 1 when the manifest is missing or its inferred token - does not match. A malformed manifest raises SpecError — the caller decides - whether to surface it (single-type CLI) or aggregate it (--all).""" - toml_path = types_dir / f"{token}.toml" - if not toml_path.is_file(): - print(f"error: no manifest at {toml_path}", file=sys.stderr) - return 1 - spec = load_spec(toml_path) - if spec.token != token: - print( - f"error: manifest token '{spec.token}' does not match '{token}'", - file=sys.stderr, - ) - return 1 - out_dir = out_root / "src" / "encrypted_domain" / token - written = generate_type(spec, out_dir) - - if spec.fixture_values is not None: - rs_path = fixture_values_rs_path(out_root, token) - write_generated_rs(rs_path, render_fixture_values_rs(spec)) - written.append(rs_path) - - for path in written: - print(f"generated {path.relative_to(out_root)}") - print(f"generated {len(written)} files for {token}") - return 0 - - -def generate_all(*, types_dir: Path, out_root: Path) -> int: - """Regenerate every type whose manifest lives in types_dir. - - Iterates sorted(types_dir.glob('*.toml')) for deterministic order and - aggregates return codes: a missing/mismatched/malformed manifest is - reported and counted as a failure without aborting the remaining types.""" - tokens = [p.stem for p in sorted(types_dir.glob("*.toml"))] - if not tokens: - print(f"error: no manifests found in {types_dir}", file=sys.stderr) - return 1 - rc = 0 - for token in tokens: - try: - if generate_one(token, types_dir=types_dir, out_root=out_root) != 0: - rc = 1 - except SpecError as exc: - print(f"error: {token}: {exc}", file=sys.stderr) - rc = 1 - status = "ok" if rc == 0 else "FAILED" - print(f"codegen --all: {status} ({len(tokens)} types: {', '.join(tokens)})") - return rc - - -def main( - argv: list[str], - *, - types_dir: Path | None = None, - out_root: Path | None = None, -) -> int: - """CLI entrypoint: generate , or --all for every manifest.""" - types_dir = types_dir or DEFAULT_TYPES_DIR - out_root = out_root or REPO_ROOT - if len(argv) == 2 and argv[1] == "--all": - return generate_all(types_dir=types_dir, out_root=out_root) - if len(argv) != 2: - print("Usage: generate.py | generate.py --all", file=sys.stderr) - return 2 - return generate_one(argv[1], types_dir=types_dir, out_root=out_root) - - -if __name__ == "__main__": - sys.exit(main(sys.argv)) diff --git a/tasks/codegen/operator_surface.py b/tasks/codegen/operator_surface.py deleted file mode 100644 index 355e5751c..000000000 --- a/tasks/codegen/operator_surface.py +++ /dev/null @@ -1,72 +0,0 @@ -"""The generated operator surface for a scalar encrypted-domain type. - -Supported comparison operators route to inlinable wrappers when the domain -has the required term. Unsupported comparisons, path operators, and native -jsonb fallback operators route to blockers. -""" - -from dataclasses import dataclass -from typing import Literal - - -@dataclass(frozen=True) -class Operator: - """One operator in the generated surface.""" - - symbol: str - backing: str # eql_v2 backing function name (bare or quoted) - kind: Literal["symmetric", "path", "blocker_only"] - restrict: str | None # selectivity estimator, symmetric ops only - join: str | None # join selectivity estimator, symmetric ops only - commutator: str | None - negator: str | None - - -SYMMETRIC_OPERATORS = ["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] -PATH_OPERATORS = ["->", "->>"] -BLOCKER_ONLY_OPERATORS = ["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"] - - -OPERATORS: dict[str, Operator] = { - "=": Operator("=", "eq", "symmetric", "eqsel", "eqjoinsel", "=", "<>"), - "<>": Operator("<>", "neq", "symmetric", "neqsel", "neqjoinsel", "<>", "="), - "<": Operator("<", "lt", "symmetric", "scalarltsel", "scalarltjoinsel", ">", ">="), - "<=": Operator("<=", "lte", "symmetric", "scalarlesel", "scalarlejoinsel", ">=", ">"), - ">": Operator(">", "gt", "symmetric", "scalargtsel", "scalargtjoinsel", "<", "<="), - ">=": Operator(">=", "gte", "symmetric", "scalargesel", "scalargejoinsel", "<=", "<"), - "@>": Operator("@>", "contains", "symmetric", None, None, None, None), - "<@": Operator("<@", "contained_by", "symmetric", None, None, None, None), - "->": Operator("->", '"->"', "path", None, None, None, None), - "->>": Operator("->>", '"->>"', "path", None, None, None, None), - "?": Operator("?", '"?"', "blocker_only", None, None, None, None), - "?|": Operator("?|", '"?|"', "blocker_only", None, None, None, None), - "?&": Operator("?&", '"?&"', "blocker_only", None, None, None, None), - "@?": Operator("@?", '"@?"', "blocker_only", None, None, None, None), - "@@": Operator("@@", '"@@"', "blocker_only", None, None, None, None), - "#>": Operator("#>", '"#>"', "blocker_only", None, None, None, None), - "#>>": Operator("#>>", '"#>>"', "blocker_only", None, None, None, None), - "-": Operator("-", '"-"', "blocker_only", None, None, None, None), - "#-": Operator("#-", '"#-"', "blocker_only", None, None, None, None), - "||": Operator("||", '"||"', "blocker_only", None, None, None, None), -} - - -def backing_function(symbol: str) -> str: - """Return the eql_v2 backing function name for an operator symbol.""" - return OPERATORS[symbol].backing - - -# The full union of operator symbols the generator knows about: supported -# wrappers, path operators, and explicit blockers. Together these are exactly -# the native jsonb operator surface for PG 14-17, so this set is the basis of -# the storage-only "every native jsonb operator is blocked" guarantee. -# -# A live-DB structural guard (tests/sqlx/.../family/jsonb_operator_surface.rs) -# queries pg_operator for every operator with a jsonb argument and asserts the -# set is a subset of this union — if a future PG version adds a jsonb operator -# not enumerated here, that test fails rather than silently letting native -# plaintext-jsonb semantics through on an encrypted column. Keep that test's -# hardcoded expectation in sync with this set. -KNOWN_JSONB_OPERATORS: frozenset[str] = frozenset( - SYMMETRIC_OPERATORS + PATH_OPERATORS + BLOCKER_ONLY_OPERATORS -) diff --git a/tasks/codegen/scalars.py b/tasks/codegen/scalars.py deleted file mode 100644 index eee01dc46..000000000 --- a/tasks/codegen/scalars.py +++ /dev/null @@ -1,102 +0,0 @@ -"""Fixed scalar-kind catalog for fixture-value emission. - -A `ScalarKind` knows how to turn a manifest fixture-value token into a Rust -literal of the type's native Rust scalar, and how to resolve it to a numeric -value for the MIN/MAX/zero invariant check. The manifest carries only the -list of value tokens; the per-type behaviour lives here (mirroring terms.py), -not in free-form TOML fields. - -Recognised sentinels are ``MIN`` / ``MAX`` / ``ZERO``; every other token is a -numeric literal validated against the type's representable range. -""" - -from dataclasses import dataclass - - -class ScalarError(Exception): - """Raised for an unknown scalar token or an invalid fixture value.""" - - -_SENTINELS = ("MIN", "MAX", "ZERO") - - -@dataclass(frozen=True) -class ScalarKind: - """One scalar type's Rust rendering rules for fixture values.""" - - token: str - rust_type: str - min_symbol: str - max_symbol: str - zero_symbol: str - min_value: int - max_value: int - - def _parse(self, value: str) -> int: - if value == "MIN": - return self.min_value - if value == "MAX": - return self.max_value - if value == "ZERO": - return 0 - try: - n = int(value) - except ValueError as exc: - raise ScalarError( - f"{self.token}: {value!r} is not a valid {self.rust_type} " - f"literal or sentinel ({'/'.join(_SENTINELS)})" - ) from exc - if not (self.min_value <= n <= self.max_value): - raise ScalarError( - f"{self.token}: {value!r} out of range for {self.rust_type} " - f"[{self.min_value}, {self.max_value}]" - ) - return n - - def numeric_value(self, value: str) -> int: - """Resolve a fixture token to its numeric value (validates range).""" - return self._parse(value) - - def render_literal(self, value: str) -> str: - """Render a fixture token as a Rust literal of this scalar type.""" - symbols = { - "MIN": self.min_symbol, - "MAX": self.max_symbol, - "ZERO": self.zero_symbol, - } - if value in symbols: - return symbols[value] - return str(self._parse(value)) - - -SCALAR_KINDS: dict[str, ScalarKind] = { - "int4": ScalarKind( - token="int4", - rust_type="i32", - min_symbol="i32::MIN", - max_symbol="i32::MAX", - zero_symbol="0", - min_value=-2147483648, - max_value=2147483647, - ), - "int2": ScalarKind( - token="int2", - rust_type="i16", - min_symbol="i16::MIN", - max_symbol="i16::MAX", - zero_symbol="0", - min_value=-32768, - max_value=32767, - ), -} - - -def require_scalar(token: str) -> ScalarKind: - """Return the catalog kind for `token`, or raise ScalarError.""" - try: - return SCALAR_KINDS[token] - except KeyError as exc: - raise ScalarError( - f"unknown scalar token '{token}' " - f"(expected one of {sorted(SCALAR_KINDS)})" - ) from exc diff --git a/tasks/codegen/spec.py b/tasks/codegen/spec.py deleted file mode 100644 index 40e28cac3..000000000 --- a/tasks/codegen/spec.py +++ /dev/null @@ -1,141 +0,0 @@ -"""Minimal TOML manifest loader for scalar encrypted-domain codegen.""" - -import re -import tomllib -from dataclasses import dataclass -from pathlib import Path - -from .scalars import ScalarError, require_scalar -from .terms import TermError, require_terms - - -_SQL_IDENTIFIER = re.compile(r"^[a-z][a-z0-9_]*$") - - -class SpecError(Exception): - """Raised when a TOML manifest is missing or invalid.""" - - -@dataclass(frozen=True) -class DomainSpec: - """One generated public domain and the fixed terms it carries.""" - - name: str - terms: list[str] - - -@dataclass(frozen=True) -class TypeSpec: - """A scalar encrypted-domain manifest loaded from one TOML file.""" - - token: str - domains: list[DomainSpec] - fixture_values: list[str] | None = None - - -def _load_fixture_values(raw: dict, token: str) -> list[str] | None: - """Parse and validate the optional [fixture] table. - - Returns the ordered list of value tokens, or None when no [fixture] table - is present. The tokens are the manifest source of truth for the generated - Rust fixture-value const; the scalar kind validates each one and the set - must include MIN, MAX, and zero (the matrix comparison pivots).""" - if "fixture" not in raw: - return None - - fixture_table = raw["fixture"] - if not isinstance(fixture_table, dict) or "values" not in fixture_table: - raise SpecError("[fixture]: missing required key 'values'") - - values = fixture_table["values"] - if not isinstance(values, list): - raise SpecError("[fixture] values: must be a list of value tokens") - if not values: - raise SpecError("[fixture] values: must not be empty") - if any(not isinstance(v, str) for v in values): - raise SpecError("[fixture] values: must be strings") - - try: - kind = require_scalar(token) - resolved = [(v, kind.numeric_value(v)) for v in values] - for v in values: - kind.render_literal(v) - except ScalarError as exc: - raise SpecError(f"[fixture] values: {exc}") from exc - - # Distinct-plaintext contract: the matrix oracle treats each fixture value - # as a distinct plaintext, and the generated Rust const must not repeat a - # literal. Detect duplicates against the *resolved numeric* value so that - # both copy-paste token dups ("1", "1") and sentinel/literal aliases - # (e.g. "MIN" alongside the same number as a literal) are rejected. - seen: dict[int, str] = {} - duplicates: list[str] = [] - for token_value, number in resolved: - if number in seen: - duplicates.append( - f"{token_value!r} duplicates {seen[number]!r} (both resolve to {number})" - if token_value != seen[number] - else f"{token_value!r}" - ) - else: - seen[number] = token_value - if duplicates: - raise SpecError( - "[fixture] values: must be distinct, but found duplicate values: " - + ", ".join(duplicates) - ) - - numbers = set(seen) - if not ({kind.min_value, kind.max_value, 0} <= numbers): - raise SpecError( - "[fixture] values: must include MIN, MAX, and zero " - "(the matrix comparison pivots)" - ) - - return list(values) - - -def load_spec(path: Path | str) -> TypeSpec: - """Load and validate a per-type scalar-domain manifest.""" - path = Path(path) - with path.open("rb") as fh: - raw = tomllib.load(fh) - - if "domain" not in raw: - raise SpecError("spec: missing required table '[domain]'") - - domain_table = raw["domain"] - if not isinstance(domain_table, dict) or not domain_table: - raise SpecError("[domain]: at least one domain is required") - - token = path.stem - if not _SQL_IDENTIFIER.match(token): - raise SpecError( - f"spec: token {token!r} must match {_SQL_IDENTIFIER.pattern}" - ) - domains: list[DomainSpec] = [] - for name, terms in domain_table.items(): - if not isinstance(name, str) or not _SQL_IDENTIFIER.match(name): - raise SpecError( - f"[domain] {name}: domain name {name!r} must match " - f"{_SQL_IDENTIFIER.pattern}" - ) - if name != token and not name.startswith(f"{token}_"): - raise SpecError( - f"[domain] {name}: domain name must start with '{token}'" - ) - if not isinstance(terms, list): - raise SpecError( - f"[domain] {name}: value must be a list of term names" - ) - if any(not isinstance(term, str) for term in terms): - raise SpecError(f"[domain] {name}: term names must be strings") - try: - require_terms(list(terms)) - except TermError as exc: - raise SpecError(f"[domain] {name}: {exc}") from exc - domains.append(DomainSpec(name=name, terms=list(terms))) - - fixture_values = _load_fixture_values(raw, token) - - return TypeSpec(token=token, domains=domains, fixture_values=fixture_values) diff --git a/tasks/codegen/templates.py b/tasks/codegen/templates.py deleted file mode 100644 index 14fefbc6f..000000000 --- a/tasks/codegen/templates.py +++ /dev/null @@ -1,495 +0,0 @@ -"""Per-construct SQL template functions for scalar encrypted-domain codegen.""" - -from dataclasses import dataclass - -from .operator_surface import OPERATORS -from .scalars import require_scalar -from .spec import DomainSpec, TypeSpec -from .terms import ( - Term, - extractor_for_operator as _catalog_extractor_for_operator, - operators_for_terms, - role_for_terms, - term_json_keys, -) - -# SQL generated-file marker, emitted as the first line of every generated SQL -# file. Must stay byte-identical to the Rust generator's AUTO_GENERATED_HEADER -# (crates/eql-codegen/src/consts.rs) so the two generators are at byte parity -# (mise run codegen:parity). The `^-- AUTOMATICALLY GENERATED FILE` first line -# is also what tasks/docs/validate/{coverage,required-tags}.sh grep on to skip -# generated SQL — keep this and that grep in lockstep. -AUTO_GENERATED_HEADER = "-- AUTOMATICALLY GENERATED FILE.\n" - -# Rust counterpart, prepended to the committed `_values.rs` (which has no -# template). Rust comment syntax (`//`) so the `.rs` file stays valid; must stay -# byte-identical to the Rust generator's AUTO_GENERATED_HEADER_RS. -AUTO_GENERATED_HEADER_RS = "// AUTOMATICALLY GENERATED FILE.\n" - -ENVELOPE_KEYS = ["v", "i"] -CIPHERTEXT_KEY = "c" -# EQL payload-format version. The domain CHECK pins the 'v' envelope key to -# this value, matching EQL's repo-wide rule (eql_v2._encrypted_check_v, -# src/encrypted/constraints.sql). Presence of 'v' is enforced via -# ENVELOPE_KEYS; this pins its value so a stale/foreign-version payload is -# rejected on insert or cast rather than surfacing later at query time. -VERSION_KEY = "v" -ENVELOPE_VERSION = 2 - - -def _sql_str(s: str) -> str: - """Escape a Python string for use *inside* a single-quoted SQL string - literal by doubling embedded single quotes. - - Use this at every `'{...}'` interpolation boundary in the render_* - helpers — payload keys, operator symbols, domain names rendered into - RAISE messages, etc. NOT for schema-qualified identifiers like - ``eql_v3.foo``: those are emitted unquoted and must not be doubled. - - Today every catalog string (term keys, operator symbols) is quote-free, - so this is a no-op on real input and output stays byte-identical. It - exists so a future quote-bearing catalog string can never break out of - its SQL literal — nothing else enforces the quote-free invariant.""" - return s.replace("'", "''") - - -# Schema housing the encrypted-domain families: the domains themselves plus -# their index-term extractors, comparison wrappers, blockers, and aggregates. -# New in v3 and distinct from the core eql_v2 schema, which still owns the -# shared index-term types the extractors return and construct -# (eql_v2.hmac_256, eql_v2.ore_block_u64_8_256). -DOMAIN_SCHEMA = "eql_v3" -# Schema owning the core index-term types/constructors the extractors reuse. -CORE_SCHEMA = "eql_v2" - - -def render_fixture_values_rs(spec: TypeSpec) -> str: - """Body for tests/sqlx/src/fixtures/_values.rs. - - Emits one `pub const VALUES: &[]` from the manifest's - `[fixture] values`, preserving declaration order. The writer prepends the - AUTO-GENERATED Rust header, so the body carries none.""" - kind = require_scalar(spec.token) - values = spec.fixture_values or [] - literals = "".join(f" {kind.render_literal(v)},\n" for v in values) - return ( - f"//! Fixture plaintext values for the {spec.token} " - "encrypted-domain family.\n" - "//!\n" - f"//! Generated from the `{spec.token}` row in `eql-scalars::CATALOG` " - "(`fixtures`) —\n" - "//! the single source of truth shared by the fixture generator\n" - f"//! (`fixtures::eql_v2_{spec.token}`) and the matrix oracle\n" - "//! (`ScalarType::FIXTURE_VALUES`).\n\n" - f"/// Distinct plaintext values present in the `eql_v2_{spec.token}` " - "fixture.\n" - f"pub const VALUES: &[{kind.rust_type}] = &[\n" - f"{literals}" - "];\n" - ) - -OPERATOR_PHRASES: dict[str, str] = { - "=": "Equality", - "<>": "Inequality", - "<": "Less-than", - "<=": "Less-than-or-equal", - ">": "Greater-than", - ">=": "Greater-than-or-equal", - "@>": "Contains", - "<@": "Contained-by", -} - -DOMAIN_ROLE_PHRASES: dict[str, str] = { - "storage": "Storage-only", - "eq": "Equality-only", - "ord": "Ordered", -} - - -def role_phrase(terms: list[str]) -> str: - """Proper-cased prose label for a domain with these terms — the single - source of truth for role → human prose. Every renderer that wants to - describe a domain's role in @brief lines reaches for this, so a rename - in DOMAIN_ROLE_PHRASES propagates to every generated file.""" - return DOMAIN_ROLE_PHRASES[role_for_terms(terms)] - - -def _scheme_suffix(name: str, token: str, role: str) -> str | None: - """The scheme tag of a domain name, or None for the converged name. - - The naming convention is ``_`` for the recommended converged - domain and ``__`` for a scheme-explicit twin that - pins the same role to one concrete index scheme. ``storage`` has no role - segment, so its converged name is the bare ````. - - Generic by construction: it reads ``token`` and ``role`` rather than any - hard-coded type or scheme string, so it works for int8/date/etc. and for - schemes other than ``ore``. Returns the scheme segment (e.g. ``"ore"``) - for a twin, or None when ``name`` is the converged name (or doesn't match - the convention at all).""" - converged = token if role == "storage" else f"{token}_{role}" - if name == converged: - return None - prefix = converged + "_" - if name.startswith(prefix): - scheme = name[len(prefix):] - if scheme: - return scheme - return None - - -# Roles that come in converged + scheme-explicit-twin pairs and therefore need -# a disambiguating @brief clause. Ordered domains are the case the reviewer -# flagged: int4_ord and int4_ord_ore carry identical terms (["ore"]) and would -# otherwise render an identical brief. Driven by role (generic across int8, -# date, etc.), never by a literal type/scheme name. eq and storage have a -# single name each, so no disambiguation is needed (or wanted — it'd be noise). -_TWINNABLE_ROLES = frozenset({"ord"}) - - -def brief_role_clause(domain: DomainSpec, token: str) -> str: - """The trailing clause distinguishing the recommended converged domain - from a scheme-explicit twin, for use in a per-domain @brief. - - Two domains that carry identical terms (e.g. ``int4_ord`` and - ``int4_ord_ore``, both ``["ore"]``) would otherwise render an identical - brief. The converged name is the recommended one to reach for; the twin - names the concrete scheme explicitly. Returns "" for roles that don't come - in converged/twin pairs (eq, storage) and for names that match no pattern. - - Generic by construction: keyed on the term-derived role and the - ``_[_]`` name shape, never on a literal type or scheme - string, so int8/date/etc. and non-ore schemes work unchanged.""" - role = role_for_terms(domain.terms) - if role not in _TWINNABLE_ROLES: - return "" - scheme = _scheme_suffix(domain.name, token, role) - if scheme is not None: - return ( - f" Scheme-explicit twin pinning the {scheme} scheme; " - f"prefer the converged {token}_{role} name." - ) - if domain.name == f"{token}_{role}": - return " Recommended converged name for this role." - return "" - - -def domain_name(domain: str) -> str: - """The schema-qualified SQL domain type name, e.g. ``eql_v3.int4_eq``.""" - return f"{DOMAIN_SCHEMA}.{domain}" - - -def _arg_label(dom: str, arg_type: str) -> str: - """Doxygen brief shape qualifier for one operand: 'domain' if it's - the encrypted-domain type, otherwise the literal SQL type.""" - return "domain" if arg_type == dom else arg_type - - -def _shape_qualifier(dom: str, arg_a: str, arg_b: str) -> str: - """Doxygen brief parenthetical. Empty for the canonical (dom, dom) shape.""" - if arg_a == dom and arg_b == dom: - return "" - return f" ({_arg_label(dom, arg_a)}, {_arg_label(dom, arg_b)})" - - -def render_domain_block(domain: DomainSpec, token: str) -> str: - """One idempotent IF NOT EXISTS CREATE DOMAIN block, prefixed by a - per-domain --! @brief derived from role + token.""" - dom = domain_name(domain.name) - keys = ENVELOPE_KEYS + [CIPHERTEXT_KEY] + term_json_keys(domain.terms) - presence = "\n AND ".join(f"VALUE ? '{_sql_str(key)}'" for key in keys) - checks = ( - presence - + f"\n AND VALUE->>'{_sql_str(VERSION_KEY)}' = '{ENVELOPE_VERSION}'" - ) - phrase = role_phrase(domain.terms) - clause = brief_role_clause(domain, token) - return ( - f" --! @brief {phrase} encrypted {token} domain.{clause}\n" - f" IF NOT EXISTS (\n" - f" SELECT 1 FROM pg_type\n" - f" WHERE typname = '{_sql_str(domain.name)}' " - f"AND typnamespace = '{DOMAIN_SCHEMA}'::regnamespace\n" - f" ) THEN\n" - f" CREATE DOMAIN {dom} AS jsonb\n" - f" CHECK (\n" - f" jsonb_typeof(VALUE) = 'object'\n" - f" AND {checks}\n" - f" );\n" - f" END IF;\n" - ) - - -def render_extractor(domain: DomainSpec, term: Term) -> str: - """The inlinable index-term extractor for a domain term.""" - dom = domain_name(domain.name) - doxy = ( - f"--! @brief Index extractor for the {dom} variant.\n" - f"--! @param a {dom}\n" - f"--! @return {term.returns}\n" - ) - return doxy + ( - f"CREATE FUNCTION {DOMAIN_SCHEMA}.{term.extractor}(a {dom})\n" - f"RETURNS {term.returns}\n" - f"LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE\n" - f"AS $$ SELECT {CORE_SCHEMA}.{term.ctor}(a::jsonb) $$;\n" - ) - - -def _extract_arg(arg_type: str, extractor: str, domain: str, arg: str) -> str: - """The extractor-call SQL for one operand, casting jsonb to the domain first.""" - if arg_type == "jsonb": - return f"{DOMAIN_SCHEMA}.{extractor}({arg}::{domain})" - return f"{DOMAIN_SCHEMA}.{extractor}({arg})" - - -def render_wrapper( - domain: DomainSpec, op: str, arg_a: str, arg_b: str, extractor: str -) -> str: - """An inlinable comparison wrapper for a supported operator.""" - dom = domain_name(domain.name) - backing = OPERATORS[op].backing - call_a = _extract_arg(arg_a, extractor, dom, "a") - call_b = _extract_arg(arg_b, extractor, dom, "b") - doxy = ( - f"--! @brief {OPERATOR_PHRASES[op]} wrapper for {dom}" - f"{_shape_qualifier(dom, arg_a, arg_b)}.\n" - f"--! @param a {arg_a}\n" - f"--! @param b {arg_b}\n" - f"--! @return boolean\n" - ) - return doxy + ( - f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, b {arg_b})\n" - f"RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE\n" - f"AS $$ SELECT {call_a} {op} {call_b} $$;\n" - ) - - -def render_blocker_bool( - domain: DomainSpec, op: str, arg_a: str, arg_b: str -) -> str: - """A boolean-returning blocker. NEVER STRICT, ALWAYS LANGUAGE plpgsql - so the RAISE survives inlining and planner-time elision; see CLAUDE.md - footguns and the encrypted-domain spec §4.""" - dom = domain_name(domain.name) - backing = OPERATORS[op].backing - doxy = ( - f"--! @brief Blocker for {op} on {dom}" - f"{_shape_qualifier(dom, arg_a, arg_b)}.\n" - f"--! @param a {arg_a}\n" - f"--! @param b {arg_b}\n" - f"--! @return boolean (never returns; always raises)\n" - ) - return doxy + ( - f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, b {arg_b})\n" - f"RETURNS boolean IMMUTABLE PARALLEL SAFE\n" - f"AS $$ BEGIN RETURN {DOMAIN_SCHEMA}.encrypted_domain_unsupported_bool(" - f"'{_sql_str(dom)}', '{_sql_str(op)}'); END; $$\n" - f"LANGUAGE plpgsql;\n" - ) - - -def render_blocker_path( - domain: DomainSpec, op: str, arg_a: str, arg_b: str -) -> str: - """A path-operator blocker. NEVER STRICT, ALWAYS LANGUAGE plpgsql - so the RAISE survives inlining and planner-time elision; see CLAUDE.md - footguns and the encrypted-domain spec §4.""" - dom = domain_name(domain.name) - backing = OPERATORS[op].backing - returns = "text" if op == "->>" else dom - doxy = ( - f"--! @brief Blocker for {op} on {dom} " - f"({_arg_label(dom, arg_a)}, {_arg_label(dom, arg_b)}).\n" - f"--! @param a {arg_a}\n" - f"--! @param selector {arg_b}\n" - f"--! @return {returns} (never returns; always raises)\n" - ) - return doxy + ( - f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, selector {arg_b})\n" - f"RETURNS {returns} IMMUTABLE PARALLEL SAFE\n" - f"AS $$ BEGIN RAISE EXCEPTION " - f"'operator % is not supported for %', '{_sql_str(op)}', " - f"'{_sql_str(dom)}'; END; $$\n" - f"LANGUAGE plpgsql;\n" - ) - - -def render_blocker_native( - domain: DomainSpec, op: str, arg_a: str, arg_b: str, returns: str -) -> str: - """A blocker for a native jsonb fallback operator. NEVER STRICT, ALWAYS - LANGUAGE plpgsql. Boolean blockers delegate to the shared helper so lint - recognition and messages stay uniform; other return types raise directly. - """ - dom = domain_name(domain.name) - backing = OPERATORS[op].backing - doxy = ( - f"--! @brief Blocker for {op} on {dom}" - f"{_shape_qualifier(dom, arg_a, arg_b)}.\n" - f"--! @param a {arg_a}\n" - f"--! @param b {arg_b}\n" - f"--! @return {returns} (never returns; always raises)\n" - ) - if returns == "boolean": - body = ( - f"BEGIN RETURN {DOMAIN_SCHEMA}.encrypted_domain_unsupported_bool(" - f"'{_sql_str(dom)}', '{_sql_str(op)}'); END;" - ) - else: - body = ( - "BEGIN RAISE EXCEPTION " - f"'operator % is not supported for %', '{_sql_str(op)}', " - f"'{_sql_str(dom)}'; END;" - ) - return doxy + ( - f"CREATE FUNCTION {DOMAIN_SCHEMA}.{backing}(a {arg_a}, b {arg_b})\n" - f"RETURNS {returns} IMMUTABLE PARALLEL SAFE\n" - f"AS $$ {body} $$\n" - f"LANGUAGE plpgsql;\n" - ) - - -def extractor_for_operator(domain: DomainSpec, op: str) -> str | None: - """Return the catalog extractor that supports op for this domain.""" - return _catalog_extractor_for_operator(domain.terms, op) - - -def supported_operators(domain: DomainSpec) -> list[str]: - """Supported operators for this domain.""" - return operators_for_terms(domain.terms) - - -@dataclass(frozen=True) -class AggregateOp: - """One aggregate operator definition (min or max).""" - - name: str # public function name, e.g. "min" - sfunc_name: str # state function name, e.g. "min_sfunc" - comparator: str # SQL comparator used to choose the new state: "<" or ">" - phrase: str # short prose label used in --! @brief lines - - -AGGREGATE_OPS: dict[str, AggregateOp] = { - "min": AggregateOp("min", "min_sfunc", "<", "minimum"), - "max": AggregateOp("max", "max_sfunc", ">", "maximum"), -} - - -def is_ord_capable(domain: DomainSpec) -> bool: - """True if the domain carries a comparator term (i.e. supports `<`).""" - return role_for_terms(domain.terms) == "ord" - - -def render_aggregate(domain: DomainSpec, op: AggregateOp) -> str: - """Render state function + CREATE AGGREGATE for one aggregate op on one - domain. The ord-capability gate lives at the file-level renderer - (`render_aggregates_file`); callers may legitimately render a single - aggregate without re-asserting that precondition. MIN/MAX on a non-ord - domain is structurally well-formed text but semantically meaningless — - the file-level gate is what stops it ever reaching disk.""" - dom = domain_name(domain.name) - sfunc_doxy = ( - f"--! @brief State function for {op.name} aggregate on {dom}.\n" - f"--! @internal\n" - f"--!\n" - f"--! @param state {dom} running extremum\n" - f"--! @param value {dom} next non-NULL value\n" - f"--! @return {dom} the {op.phrase} of state and value\n" - ) - # plpgsql + STRICT: PG seeds the state with the first non-NULL value and - # skips NULL inputs. plpgsql (not sql) because aggregate state functions - # aren't index expressions — opacity to the planner is fine — and a - # multi-statement BEGIN/IF/END body is the natural shape. - # - # The same rationale is mirrored into the emitted SQL below so a reader of - # the generated file (who never sees this Python) understands why it isn't - # an inlinable LANGUAGE sql CASE. - sfunc_rationale = ( - "-- LANGUAGE plpgsql, not sql: aggregate state functions are not index\n" - "-- expressions, so opacity to the planner is fine, and a multi-statement\n" - "-- BEGIN/IF/END body is the natural shape. (A LANGUAGE sql CASE would\n" - "-- also work, but the procedural form mirrors the blocker convention.)\n" - ) - sfunc = sfunc_rationale + ( - f"CREATE FUNCTION {DOMAIN_SCHEMA}.{op.sfunc_name}(state {dom}, value {dom})\n" - f"RETURNS {dom}\n" - f"LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE\n" - f"SET search_path = pg_catalog, extensions, public\n" - f"AS $$\n" - f"BEGIN\n" - f" IF value {op.comparator} state THEN\n" - f" RETURN value;\n" - f" END IF;\n" - f" RETURN state;\n" - f"END;\n" - f"$$;\n" - ) - agg_doxy = ( - f"--! @brief Find the {op.phrase} encrypted value in a group of " - f"{dom} values.\n" - f"--!\n" - f"--! Comparison routes through the domain's `{op.comparator}` " - f"operator, which uses the ORE block term — no decryption.\n" - f"--!\n" - f"--! @param input {dom} encrypted values to aggregate\n" - f"--! @return {dom} {op.phrase} of the group, or NULL if all " - f"inputs are NULL\n" - ) - # min/max are associative, so the state function doubles as the combine - # function: merging two partial extrema is the same comparison. With a - # PARALLEL SAFE sfunc/combinefunc and `parallel = safe`, PG can use partial - # and parallel aggregation on the large GROUP BY workloads these ORE - # aggregates exist to serve — still with no decryption. The combinefunc is - # STRICT (it is the sfunc), so PG carries a null partial state through as - # "no value yet", matching the serial seed-and-skip semantics. - aggregate = ( - "-- combinefunc = sfunc: min/max are associative, so merging two partial\n" - "-- extrema is the same comparison. PARALLEL SAFE enables partial and\n" - "-- parallel aggregation on large GROUP BY workloads, with no decryption.\n" - f"CREATE AGGREGATE {DOMAIN_SCHEMA}.{op.name}({dom}) (\n" - f" sfunc = {DOMAIN_SCHEMA}.{op.sfunc_name},\n" - f" stype = {dom},\n" - f" combinefunc = {DOMAIN_SCHEMA}.{op.sfunc_name},\n" - f" parallel = safe\n" - f");\n" - ) - return sfunc_doxy + sfunc + "\n" + agg_doxy + aggregate - - -def render_operator( - op: str, backing: str, leftarg: str, rightarg: str, supported: bool -) -> str: - """A CREATE OPERATOR declaration. - - Unsupported operators are still declared, but their backing function is a - blocker that always raises. We emit them so the operator resolves on the - domain (rather than silently falling through to a native jsonb operator), - and a leading SQL comment explains the placeholder to future readers.""" - meta = OPERATORS[op] - lines = [] - if not supported: - lines.append( - f"-- Placeholder: this domain's term set does not support {op}; " - f"the backing function always raises." - ) - lines += [ - f"CREATE OPERATOR {op} (", - f" FUNCTION = {DOMAIN_SCHEMA}.{backing},", - f" LEFTARG = {leftarg}, RIGHTARG = {rightarg}", - ] - if supported and meta.kind == "symmetric": - extras = [] - if meta.commutator: - extras.append(f"COMMUTATOR = {meta.commutator}") - if meta.negator: - extras.append(f"NEGATOR = {meta.negator}") - if meta.restrict: - extras.append(f"RESTRICT = {meta.restrict}") - if meta.join: - extras.append(f"JOIN = {meta.join}") - if extras: - lines[-1] += "," - lines.append(" " + ", ".join(extras)) - lines.append(");") - return "\n".join(lines) + "\n" diff --git a/tasks/codegen/terms.py b/tasks/codegen/terms.py deleted file mode 100644 index 32a7c788c..000000000 --- a/tasks/codegen/terms.py +++ /dev/null @@ -1,107 +0,0 @@ -"""Fixed index-term catalog for scalar encrypted-domain codegen.""" - -from collections.abc import Iterable -from dataclasses import dataclass - - -class TermError(Exception): - """Raised when a manifest references an unknown term.""" - - -@dataclass(frozen=True) -class Term: - """One fixed index term known to the scalar materializer.""" - - name: str - json_key: str - extractor: str - returns: str - ctor: str - role: str - operators: tuple[str, ...] - requires: tuple[str, ...] - - -TERM_CATALOG: dict[str, Term] = { - "hm": Term( - name="hm", - json_key="hm", - extractor="eq_term", - returns="eql_v2.hmac_256", - ctor="hmac_256", - role="eq", - operators=("=", "<>"), - requires=("src/hmac_256/functions.sql",), - ), - "ore": Term( - name="ore", - json_key="ob", - extractor="ord_term", - returns="eql_v2.ore_block_u64_8_256", - ctor="ore_block_u64_8_256", - role="ord", - operators=("=", "<>", "<", "<=", ">", ">="), - requires=( - "src/ore_block_u64_8_256/functions.sql", - "src/ore_block_u64_8_256/operators.sql", - ), - ), -} - - -def _dedupe_preserving_order(values: Iterable[str]) -> list[str]: - """Stable dedupe — first occurrence wins. `dict.fromkeys` preserves insert order.""" - return list(dict.fromkeys(values)) - - -def require_terms(names: list[str]) -> list[Term]: - """Return catalog terms for manifest names, preserving input order.""" - terms: list[Term] = [] - for name in names: - try: - terms.append(TERM_CATALOG[name]) - except KeyError as exc: - raise TermError( - f"unknown term '{name}' (expected one of {sorted(TERM_CATALOG)})" - ) from exc - return terms - - -def operators_for_terms(names: list[str]) -> list[str]: - """Supported operators for the union of a domain's terms.""" - return _dedupe_preserving_order( - op for term in require_terms(names) for op in term.operators - ) - - -def term_json_keys(names: list[str]) -> list[str]: - """JSON payload keys required by these terms.""" - return _dedupe_preserving_order( - term.json_key for term in require_terms(names) - ) - - -def term_requires(names: list[str]) -> list[str]: - """SQL REQUIRE edges needed by these terms.""" - return _dedupe_preserving_order( - req for term in require_terms(names) for req in term.requires - ) - - -def extractor_for_operator(names: list[str], op: str) -> str | None: - """The catalog extractor that supports `op` for a domain carrying `names`.""" - for term in require_terms(names): - if op in term.operators: - return term.extractor - return None - - -def role_for_terms(names: list[str]) -> str: - """Generated-file role label for a domain with these terms. - - A domain with no terms is `storage`; otherwise the role comes from - the first term's catalog role (e.g. `hm` -> `eq`, `ore` -> `ord`). - """ - if not names: - return "storage" - return require_terms(names)[0].role diff --git a/tasks/codegen/test_against_reference.py b/tasks/codegen/test_against_reference.py deleted file mode 100644 index e7ea62e99..000000000 --- a/tasks/codegen/test_against_reference.py +++ /dev/null @@ -1,117 +0,0 @@ -"""Identity guard: the generator must reproduce the frozen manual -reference under tests/codegen/reference// byte-for-byte. - -The reference is the reviewed manual implementation. If the generator's -output diverges from the reference, either the generator regressed (fix -it) or the reference is being deliberately updated (commit the new -reference in this PR). - -Compares in-memory `render_*_file` output directly against the reference, -so it runs anywhere regardless of whether the build has materialised -src/encrypted_domain// (those files are gitignored — `tasks/build.sh` -regenerates them on each build). -""" -from pathlib import Path - -import pytest - -from tasks.codegen.generate import ( - REPO_ROOT, - render_aggregates_file, - render_functions_file, - render_operators_file, - render_types_file, -) -from tasks.codegen.spec import load_spec -from tasks.codegen.templates import render_fixture_values_rs - -_REFERENCE_ROOT = REPO_ROOT / "tests" / "codegen" / "reference" -_TYPES_DIR = REPO_ROOT / "tasks" / "codegen" / "types" - - -def _strip_reference_marker(text: str) -> str: - """Drop any leading `-- REFERENCE:` / `// REFERENCE:` lines. They label the - file as the parity baseline (see tests/codegen/reference/README.md) and are - not part of the generator's output. Both comment styles are recognised so - the same helper serves SQL and Rust reference files.""" - lines = text.splitlines(keepends=True) - while lines and lines[0].startswith(("-- REFERENCE:", "// REFERENCE:")): - lines.pop(0) - return "".join(lines) - - -def _reference_files() -> list[Path]: - """Every SQL file under tests/codegen/reference//.""" - if not _REFERENCE_ROOT.is_dir(): - return [] - return sorted(_REFERENCE_ROOT.glob("*/*.sql")) - - -def _render(reference_path: Path) -> str: - """Render the corresponding generator output for a reference file.""" - token = reference_path.parent.name - name = reference_path.name - spec = load_spec(_TYPES_DIR / f"{token}.toml") - - if name == f"{token}_types.sql": - return render_types_file(spec) - - for domain in spec.domains: - if name == f"{domain.name}_functions.sql": - return render_functions_file(spec, domain) - if name == f"{domain.name}_operators.sql": - return render_operators_file(spec, domain) - if name == f"{domain.name}_aggregates.sql": - body = render_aggregates_file(spec, domain) - if body is None: - pytest.fail( - f"reference {reference_path.relative_to(REPO_ROOT)} exists " - f"but the generator skipped this variant (not ord-capable). " - f"Remove the reference file or update the manifest." - ) - return body - - pytest.fail(f"unrecognised reference filename: {name}") - - -@pytest.mark.parametrize( - "reference_path", - _reference_files(), - ids=lambda p: f"{p.parent.name}/{p.name}", -) -def test_generator_matches_manual_reference(reference_path: Path): - """Generator render output must equal the reviewed reference.""" - token = reference_path.parent.name - fix = ( - f"either the generator regressed (fix tasks/codegen/) or the " - f"manual reference is being updated deliberately — commit the " - f"new reference at {reference_path.relative_to(REPO_ROOT)} in " - f"this PR. Regenerate via: mise run codegen:domain {token}" - ) - - expected = _strip_reference_marker(reference_path.read_text(encoding="utf-8")) - actual = _render(reference_path) - - assert actual == expected, f"{reference_path.name}: {fix}" - - -def test_generator_matches_rust_fixture_values_reference(): - """The generated Rust fixture-value const must match the reviewed reference. - - Guards the committed tests/sqlx/src/fixtures/int4_values.rs against drift - from the manifest (the same property the CI staleness guard enforces, but - runnable without a checkout diff).""" - reference_path = _REFERENCE_ROOT / "int4" / "int4_values.rs" - spec = load_spec(_TYPES_DIR / "int4.toml") - - expected = _strip_reference_marker( - reference_path.read_text(encoding="utf-8") - ) - actual = render_fixture_values_rs(spec) - - assert actual == expected, ( - "int4_values.rs: either the generator regressed (fix tasks/codegen/) " - "or the reference is being updated deliberately — commit the new " - f"reference at {reference_path.relative_to(REPO_ROOT)} in this PR. " - "Regenerate via: mise run codegen:domain int4" - ) diff --git a/tasks/codegen/test_generate.py b/tasks/codegen/test_generate.py deleted file mode 100644 index db93b9890..000000000 --- a/tasks/codegen/test_generate.py +++ /dev/null @@ -1,351 +0,0 @@ -"""Tests for composing scalar encrypted-domain files from a manifest.""" - -import textwrap - -import pytest - -from tasks.codegen.generate import ( - generate_type, - main, - render_aggregates_file, - render_functions_file, - render_operators_file, - render_types_file, -) -from tasks.codegen.spec import load_spec -from tasks.codegen.templates import AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS -from tasks.codegen.writer import OwnershipError - - -INT4_TOML = textwrap.dedent(""" - [domain] - int4 = [] - int4_eq = ["hm"] - int4_ord_ore = ["ore"] - int4_ord = ["ore"] -""") - -INT4_FIXTURE_TOML = INT4_TOML + textwrap.dedent(""" - [fixture] - values = ["MIN", "-1", "ZERO", "1", "MAX"] -""") - -# A second, synthetic type for multi-type (--all) coverage. No [fixture] table, -# so it never touches scalars.py (which only registers int4) — it exercises the -# enumeration, not fixture rendering. -INT4X_TOML = textwrap.dedent(""" - [domain] - int4x = [] - int4x_eq = ["hm"] - int4x_ord = ["ore"] -""") - - -def _fixture_values_rs(out_root): - return out_root / "tests" / "sqlx" / "src" / "fixtures" / "int4_values.rs" - - -def load(tmp_path): - p = tmp_path / "int4.toml" - p.write_text(INT4_TOML) - return load_spec(p) - - -def test_types_file_has_all_four_domains(tmp_path): - spec = load(tmp_path) - sql = render_types_file(spec) - assert "-- REQUIRE: src/schema-v3.sql" in sql - for dom in ("int4", "int4_eq", - "int4_ord", "int4_ord_ore"): - assert f"CREATE DOMAIN eql_v3.{dom} AS jsonb" in sql - - -def test_storage_functions_file_is_all_blockers(tmp_path): - spec = load(tmp_path) - storage = next(d for d in spec.domains if d.name == "int4") - sql = render_functions_file(spec, storage) - assert sql.count("CREATE FUNCTION") == 44 - assert "SET search_path" not in sql - assert sql.count("LANGUAGE plpgsql") == 44 - assert sql.count("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") == 0 - - -def test_eq_functions_file_counts_and_extractor(tmp_path): - spec = load(tmp_path) - eq = next(d for d in spec.domains if d.name == "int4_eq") - sql = render_functions_file(spec, eq) - assert sql.count("CREATE FUNCTION") == 45 - assert "CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)" in sql - assert "RETURNS eql_v2.hmac_256" in sql - # 1 extractor + 6 wrappers (=, <> across 3 arg-shapes) inlined as SQL; - # 38 blockers across the remaining native jsonb surface as plpgsql. - assert sql.count("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") == 7 - assert sql.count("LANGUAGE plpgsql") == 38 - assert "SET search_path" not in sql - - -def test_ore_functions_file_counts_and_extractor(tmp_path): - spec = load(tmp_path) - ordered = next(d for d in spec.domains if d.name == "int4_ord") - sql = render_functions_file(spec, ordered) - assert sql.count("CREATE FUNCTION") == 45 - assert "CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)" in sql - assert "RETURNS eql_v2.ore_block_u64_8_256" in sql - # 1 extractor + 18 wrappers (=, <>, <, <=, >, >= across 3 shapes); - # 26 blockers across containment/path/native-jsonb fallback ops. - assert sql.count("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") == 19 - assert sql.count("LANGUAGE plpgsql") == 26 - assert "SET search_path" not in sql - - -def test_operators_file_has_forty_four(tmp_path): - spec = load(tmp_path) - eq = next(d for d in spec.domains if d.name == "int4_eq") - sql = render_operators_file(spec, eq) - assert sql.count("CREATE OPERATOR") == 44 - - -def test_generate_type_writes_expected_files(tmp_path): - spec = load(tmp_path) - out_dir = tmp_path / "int4" - written = generate_type(spec, out_dir) - names = {p.name for p in written} - assert "int4_types.sql" in names - for domain in ("int4", "int4_eq", "int4_ord", "int4_ord_ore"): - assert f"{domain}_functions.sql" in names - assert f"{domain}_operators.sql" in names - # Aggregates only emitted for ord-capable variants — storage and eq skip. - assert "int4_aggregates.sql" not in names - assert "int4_eq_aggregates.sql" not in names - assert "int4_ord_aggregates.sql" in names - assert "int4_ord_ore_aggregates.sql" in names - # 1 types + 4 functions + 4 operators + 2 aggregates = 11 - assert len(written) == 11 - for p in written: - assert p.read_text().startswith(AUTO_GENERATED_HEADER) - - -def test_generate_type_cleans_stale_files(tmp_path): - spec = load(tmp_path) - out_dir = tmp_path / "int4" - out_dir.mkdir() - stale = out_dir / "int4_removed_functions.sql" - stale.write_text(AUTO_GENERATED_HEADER + "-- orphan\n") - generate_type(spec, out_dir) - assert not stale.exists() - - -def test_generate_type_preserves_hand_written_extension_file(tmp_path): - spec = load(tmp_path) - out_dir = tmp_path / "int4" - out_dir.mkdir() - extension = out_dir / "int4_extensions.sql" - body = ( - "-- REQUIRE: src/encrypted_domain/int4/int4_types.sql\n" - "-- hand-written extension SQL\n" - ) - extension.write_text(body) - generate_type(spec, out_dir) - assert extension.read_text() == body - - -def test_generate_type_preflights_hand_written_target_before_cleanup(tmp_path): - spec = load(tmp_path) - out_dir = tmp_path / "int4" - out_dir.mkdir() - generated = out_dir / "int4_types.sql" - protected = out_dir / "int4_eq_functions.sql" - original_generated = AUTO_GENERATED_HEADER + "-- old generated\n" - original_protected = "-- REQUIRE: src/schema.sql\n-- hand-written\n" - generated.write_text(original_generated) - protected.write_text(original_protected) - - with pytest.raises(OwnershipError, match="hand-written"): - generate_type(spec, out_dir) - - assert generated.read_text() == original_generated - assert protected.read_text() == original_protected - assert not (out_dir / "int4_eq_operators.sql").exists() - - -def _seed_types_dir(tmp_path, name: str = "int4.toml", body: str = INT4_TOML): - types_dir = tmp_path / "types" - types_dir.mkdir() - (types_dir / name).write_text(body) - return types_dir - - -def test_main_rejects_wrong_argv_length(capsys): - rc = main(["generate.py"]) - assert rc == 2 - err = capsys.readouterr().err - assert "Usage: generate.py " in err - - -def test_main_errors_on_missing_manifest(tmp_path, capsys): - types_dir = tmp_path / "types" - types_dir.mkdir() - rc = main( - ["generate.py", "int4"], - types_dir=types_dir, - out_root=tmp_path, - ) - assert rc == 1 - err = capsys.readouterr().err - assert "no manifest at" in err - assert "int4.toml" in err - - -def test_main_errors_on_token_mismatch(tmp_path, capsys): - """Manifest stem must equal argv token — guards against a copy/rename.""" - types_dir = _seed_types_dir(tmp_path, name="int4.toml") - rc = main( - ["generate.py", "int8"], - types_dir=types_dir, - out_root=tmp_path, - ) - # int8.toml doesn't exist — first failure is missing manifest, not mismatch. - # To exercise the mismatch branch we need a manifest at int8.toml that - # declares int4 domains (impossible — the loader infers token from stem). - # The branch is therefore unreachable via the normal types/.toml - # convention; the assertion below just confirms the missing-manifest - # error path fires when the names diverge. - assert rc == 1 - err = capsys.readouterr().err - assert "no manifest at" in err - assert "int8.toml" in err - - -def test_main_happy_path_writes_files(tmp_path, capsys): - types_dir = _seed_types_dir(tmp_path) - rc = main( - ["generate.py", "int4"], - types_dir=types_dir, - out_root=tmp_path, - ) - assert rc == 0 - out_dir = tmp_path / "src" / "encrypted_domain" / "int4" - assert (out_dir / "int4_types.sql").is_file() - assert (out_dir / "int4_eq_functions.sql").is_file() - assert (out_dir / "int4_ord_operators.sql").is_file() - assert (out_dir / "int4_ord_aggregates.sql").is_file() - assert (out_dir / "int4_ord_ore_aggregates.sql").is_file() - assert not (out_dir / "int4_aggregates.sql").exists() - assert not (out_dir / "int4_eq_aggregates.sql").exists() - stdout = capsys.readouterr().out - assert "generated 11 files for int4" in stdout - - -def test_main_emits_fixture_values_rs_when_manifest_has_fixture(tmp_path, capsys): - types_dir = _seed_types_dir(tmp_path, body=INT4_FIXTURE_TOML) - rc = main(["generate.py", "int4"], types_dir=types_dir, out_root=tmp_path) - assert rc == 0 - rs = _fixture_values_rs(tmp_path) - assert rs.is_file() - text = rs.read_text() - assert text.startswith(AUTO_GENERATED_HEADER_RS) - assert "pub const VALUES: &[i32] = &[" in text - assert "i32::MIN," in text and "i32::MAX," in text - stdout = capsys.readouterr().out - assert "int4_values.rs" in stdout - - -def test_main_omits_fixture_values_rs_when_no_fixture_table(tmp_path, capsys): - types_dir = _seed_types_dir(tmp_path, body=INT4_TOML) - rc = main(["generate.py", "int4"], types_dir=types_dir, out_root=tmp_path) - assert rc == 0 - assert not _fixture_values_rs(tmp_path).exists() - - -def _seed_two_types(tmp_path): - types_dir = _seed_types_dir(tmp_path, name="int4.toml", body=INT4_TOML) - (types_dir / "int4x.toml").write_text(INT4X_TOML) - return types_dir - - -def test_main_all_generates_every_type(tmp_path, capsys): - types_dir = _seed_two_types(tmp_path) - rc = main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) - assert rc == 0 - assert (tmp_path / "src/encrypted_domain/int4/int4_types.sql").is_file() - assert (tmp_path / "src/encrypted_domain/int4x/int4x_types.sql").is_file() - out = capsys.readouterr().out - assert "generated 11 files for int4" in out - assert "codegen --all: ok (2 types: int4, int4x)" in out - - -def test_main_all_generates_in_sorted_order(tmp_path, capsys): - types_dir = _seed_two_types(tmp_path) - main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) - out = capsys.readouterr().out - assert out.index("for int4\n") < out.index("for int4x\n") - - -def test_main_all_errors_when_no_manifests(tmp_path, capsys): - types_dir = tmp_path / "types" - types_dir.mkdir() - rc = main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) - assert rc == 1 - assert "no manifests found" in capsys.readouterr().err - - -def test_main_all_aggregates_nonzero_on_bad_manifest(tmp_path, capsys): - types_dir = _seed_types_dir(tmp_path, name="int4.toml", body=INT4_TOML) - # 'broken' sorts before 'int4', so it is processed first; its domain name - # does not start with the token, so load_spec raises SpecError. - (types_dir / "broken.toml").write_text("[domain]\nwrongprefix = []\n") - rc = main(["generate.py", "--all"], types_dir=types_dir, out_root=tmp_path) - assert rc == 1 - captured = capsys.readouterr() - assert "broken" in captured.err - assert "codegen --all: FAILED" in captured.out - # The good type still generated despite the broken sibling. - assert (tmp_path / "src/encrypted_domain/int4/int4_types.sql").is_file() - - -def test_ordered_files_are_byte_identical_modulo_typename(tmp_path): - spec = load(tmp_path) - ord_domain = next(d for d in spec.domains if d.name == "int4_ord") - ore_domain = next(d for d in spec.domains if d.name == "int4_ord_ore") - - for renderer in (render_functions_file, render_operators_file, render_aggregates_file): - ord_sql = renderer(spec, ord_domain) - ore_sql = renderer(spec, ore_domain) - normalised_ord = ord_sql.replace("int4_ord_ore", "T").replace( - "int4_ord", "T" - ) - normalised_ore = ore_sql.replace("int4_ord_ore", "T").replace( - "int4_ord", "T" - ) - assert normalised_ord == normalised_ore, ( - f"{renderer.__name__}: int4_ord and int4_ord_ore must produce " - f"byte-identical SQL modulo their typenames" - ) - - -def test_render_aggregates_file_only_for_ord_variants(tmp_path): - spec = load(tmp_path) - storage = next(d for d in spec.domains if d.name == "int4") - eq = next(d for d in spec.domains if d.name == "int4_eq") - ordered = next(d for d in spec.domains if d.name == "int4_ord") - ore = next(d for d in spec.domains if d.name == "int4_ord_ore") - - assert render_aggregates_file(spec, storage) is None - assert render_aggregates_file(spec, eq) is None - assert render_aggregates_file(spec, ordered) is not None - assert render_aggregates_file(spec, ore) is not None - - -def test_render_aggregates_file_carries_both_min_and_max(tmp_path): - spec = load(tmp_path) - ordered = next(d for d in spec.domains if d.name == "int4_ord") - sql = render_aggregates_file(spec, ordered) - assert sql is not None - assert sql.count("CREATE FUNCTION") == 2 - assert sql.count("CREATE AGGREGATE") == 2 - assert "eql_v3.min_sfunc" in sql - assert "eql_v3.max_sfunc" in sql - # REQUIRE edges: types + functions + operators must all be declared. - assert "-- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql" in sql - assert "-- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql" in sql - assert "-- REQUIRE: src/encrypted_domain/int4/int4_types.sql" in sql diff --git a/tasks/codegen/test_operator_surface.py b/tasks/codegen/test_operator_surface.py deleted file mode 100644 index a513ce821..000000000 --- a/tasks/codegen/test_operator_surface.py +++ /dev/null @@ -1,126 +0,0 @@ -"""Tests for the scalar operator surface definition.""" -from tasks.codegen.operator_surface import ( - BLOCKER_ONLY_OPERATORS, - KNOWN_JSONB_OPERATORS, - OPERATORS, - PATH_OPERATORS, - SYMMETRIC_OPERATORS, - backing_function, -) - - -def test_twenty_operators_total(): - """The surface covers supported wrappers plus native jsonb fallbacks.""" - assert len(OPERATORS) == 20 - - -def test_eight_symmetric_operators(): - """8 symmetric boolean operators.""" - assert SYMMETRIC_OPERATORS == ["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] - - -def test_two_path_operators(): - """2 path operators.""" - assert PATH_OPERATORS == ["->", "->>"] - - -def test_ten_blocker_only_jsonb_fallback_operators(): - """Native jsonb operators not otherwise supported are blocker-only.""" - assert BLOCKER_ONLY_OPERATORS == [ - "?", - "?|", - "?&", - "@?", - "@@", - "#>", - "#>>", - "-", - "#-", - "||", - ] - - -def test_no_like_operators(): - """The surface excludes ~~ and ~~* (int4 has no LIKE support).""" - assert "~~" not in OPERATORS - assert "~~*" not in OPERATORS - - -def test_backing_function_names(): - """Each operator maps to its eql_v2 backing function name.""" - assert backing_function("=") == "eq" - assert backing_function("<>") == "neq" - assert backing_function("<") == "lt" - assert backing_function("<=") == "lte" - assert backing_function(">") == "gt" - assert backing_function(">=") == "gte" - assert backing_function("@>") == "contains" - assert backing_function("<@") == "contained_by" - assert backing_function("->") == '"->"' - assert backing_function("->>") == '"->>"' - assert backing_function("?") == '"?"' - assert backing_function("?|") == '"?|"' - assert backing_function("?&") == '"?&"' - assert backing_function("@?") == '"@?"' - assert backing_function("@@") == '"@@"' - assert backing_function("#>") == '"#>"' - assert backing_function("#>>") == '"#>>"' - assert backing_function("-") == '"-"' - assert backing_function("#-") == '"#-"' - assert backing_function("||") == '"||"' - - -def test_selectivity_estimators(): - """Symmetric ops carry RESTRICT/JOIN selectivity estimators.""" - assert OPERATORS["="].restrict == "eqsel" - assert OPERATORS["="].join == "eqjoinsel" - assert OPERATORS["<>"].restrict == "neqsel" - assert OPERATORS["<"].restrict == "scalarltsel" - assert OPERATORS["<="].restrict == "scalarlesel" - assert OPERATORS[">"].restrict == "scalargtsel" - assert OPERATORS[">="].restrict == "scalargesel" - - -def test_negators_and_commutators(): - """= / <> are negators; range ops commute as documented.""" - assert OPERATORS["="].negator == "<>" - assert OPERATORS["<>"].negator == "=" - assert OPERATORS["<"].commutator == ">" - assert OPERATORS["<"].negator == ">=" - assert OPERATORS[">="].commutator == "<=" - - -def test_known_jsonb_operators_is_union_of_the_three_lists(): - """The exported union is exactly the three enumerated lists, deduped.""" - assert KNOWN_JSONB_OPERATORS == frozenset( - SYMMETRIC_OPERATORS + PATH_OPERATORS + BLOCKER_ONLY_OPERATORS - ) - - -def test_known_jsonb_operators_matches_operators_keys(): - """The union must stay in lockstep with the OPERATORS table itself, so a - new operator added to one but not the other is caught here rather than - leaving a hole in the storage-only blocker guarantee.""" - assert KNOWN_JSONB_OPERATORS == frozenset(OPERATORS) - - -def test_known_jsonb_operators_full_native_surface(): - """Pin the full native jsonb operator surface for PG 14-17. This is the - source-of-truth the live-DB structural guard - (tests/sqlx/.../family/jsonb_operator_surface.rs) asserts pg_operator is a - subset of. If PG adds a jsonb operator, that DB test fails; if this list is - edited, both must move together. The three lists are disjoint, so the union - size equals their combined length.""" - assert KNOWN_JSONB_OPERATORS == frozenset( - { - # symmetric (supported wrappers) - "=", "<>", "<", "<=", ">", ">=", "@>", "<@", - # path - "->", "->>", - # blocker-only native jsonb fallbacks - "?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||", - } - ) - assert len(KNOWN_JSONB_OPERATORS) == ( - len(SYMMETRIC_OPERATORS) + len(PATH_OPERATORS) + len(BLOCKER_ONLY_OPERATORS) - ) diff --git a/tasks/codegen/test_scalars.py b/tasks/codegen/test_scalars.py deleted file mode 100644 index 1f15f1c3c..000000000 --- a/tasks/codegen/test_scalars.py +++ /dev/null @@ -1,82 +0,0 @@ -"""Tests for the scalar-kind catalog driving fixture-value emission.""" - -import pytest - -from tasks.codegen.scalars import ( - ScalarError, - require_scalar, - SCALAR_KINDS, -) - - -def test_int4_kind_fields(): - kind = require_scalar("int4") - assert kind.token == "int4" - assert kind.rust_type == "i32" - assert kind.min_symbol == "i32::MIN" - assert kind.max_symbol == "i32::MAX" - assert kind.zero_symbol == "0" - assert kind.min_value == -2147483648 - assert kind.max_value == 2147483647 - - -def test_render_literal_maps_sentinels(): - kind = require_scalar("int4") - assert kind.render_literal("MIN") == "i32::MIN" - assert kind.render_literal("MAX") == "i32::MAX" - assert kind.render_literal("ZERO") == "0" - - -def test_render_literal_passes_through_numeric(): - kind = require_scalar("int4") - assert kind.render_literal("-100") == "-100" - assert kind.render_literal("0") == "0" - assert kind.render_literal("9999") == "9999" - - -def test_render_literal_rejects_non_numeric(): - kind = require_scalar("int4") - with pytest.raises(ScalarError, match="not a valid i32 literal or sentinel"): - kind.render_literal("oops") - - -def test_render_literal_rejects_out_of_range(): - kind = require_scalar("int4") - with pytest.raises(ScalarError, match="out of range"): - kind.render_literal("2147483648") # i32::MAX + 1 - - -def test_numeric_value_resolves_sentinels_and_literals(): - kind = require_scalar("int4") - assert kind.numeric_value("MIN") == -2147483648 - assert kind.numeric_value("MAX") == 2147483647 - assert kind.numeric_value("ZERO") == 0 - assert kind.numeric_value("42") == 42 - assert kind.numeric_value("-1") == -1 - - -def test_require_scalar_unknown_raises(): - with pytest.raises(ScalarError, match="unknown scalar token 'bogus'"): - require_scalar("bogus") - - -def test_int4_registered_in_catalog(): - assert "int4" in SCALAR_KINDS - - -def test_int2_kind_resolves_and_renders(): - kind = require_scalar("int2") - assert kind.rust_type == "i16" - assert kind.numeric_value("MIN") == -32768 - assert kind.numeric_value("MAX") == 32767 - assert kind.numeric_value("ZERO") == 0 - assert kind.render_literal("MIN") == "i16::MIN" - assert kind.render_literal("MAX") == "i16::MAX" - assert kind.render_literal("ZERO") == "0" - assert kind.render_literal("30000") == "30000" - - -def test_int2_kind_rejects_out_of_range(): - kind = require_scalar("int2") - with pytest.raises(ScalarError, match="out of range"): - kind.numeric_value("40000") diff --git a/tasks/codegen/test_spec.py b/tasks/codegen/test_spec.py deleted file mode 100644 index 151a03cbd..000000000 --- a/tasks/codegen/test_spec.py +++ /dev/null @@ -1,208 +0,0 @@ -"""Tests for the scalar-domain manifest loader.""" - -import textwrap - -import pytest - -from tasks.codegen.spec import DomainSpec, SpecError, TypeSpec, load_spec - - -VALID_TOML = textwrap.dedent(""" - [domain] - int4 = [] - int4_eq = ["hm"] - int4_ord_ore = ["ore"] - int4_ord = ["ore"] -""") - - -def write(tmp_path, name, text): - p = tmp_path / name - p.write_text(text) - return p - - -def test_loads_valid_manifest_and_infers_token_from_filename(tmp_path): - spec = load_spec(write(tmp_path, "int4.toml", VALID_TOML)) - assert isinstance(spec, TypeSpec) - assert spec.token == "int4" - assert spec.domains == [ - DomainSpec(name="int4", terms=[]), - DomainSpec(name="int4_eq", terms=["hm"]), - DomainSpec(name="int4_ord_ore", terms=["ore"]), - DomainSpec(name="int4_ord", terms=["ore"]), - ] - - -def test_missing_domain_table_raises(tmp_path): - with pytest.raises(SpecError, match="missing required table '\\[domain\\]'"): - load_spec(write(tmp_path, "int4.toml", "")) - - -def test_empty_domain_table_raises(tmp_path): - with pytest.raises(SpecError, match="at least one domain"): - load_spec(write(tmp_path, "int4.toml", "[domain]\n")) - - -def test_domain_value_must_be_list(tmp_path): - bad = textwrap.dedent(""" - [domain] - int4_eq = "hm" - """) - with pytest.raises(SpecError, match="must be a list of term names"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_domain_term_must_be_string(tmp_path): - bad = textwrap.dedent(""" - [domain] - int4_eq = [1] - """) - with pytest.raises(SpecError, match="term names must be strings"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_unknown_term_raises_with_domain_context(tmp_path): - bad = textwrap.dedent(""" - [domain] - int4_eq = ["bogus"] - """) - with pytest.raises(SpecError, match="\\[domain\\] int4_eq: unknown term 'bogus'"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_domain_name_must_start_with_type_token(tmp_path): - bad = textwrap.dedent(""" - [domain] - text = [] - """) - with pytest.raises(SpecError, match="domain name must start with 'int4'"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_domain_name_must_be_token_or_token_underscore(tmp_path): - bad = textwrap.dedent(""" - [domain] - int4xfoo = [] - """) - with pytest.raises(SpecError, match="domain name must start with 'int4'"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -@pytest.mark.parametrize("filename", [ - "Int4.toml", - "int-4.toml", - "int 4.toml", - "4int.toml", - "int4;drop.toml", -]) -def test_token_must_be_sql_identifier(tmp_path, filename): - with pytest.raises(SpecError, match=r"token .* must match"): - load_spec(write(tmp_path, filename, VALID_TOML)) - - -@pytest.mark.parametrize("bad_name", [ - "int4-eq", - "int4 eq", - "INT4_eq", - "int4;drop", -]) -def test_domain_name_must_be_sql_identifier(tmp_path, bad_name): - bad = textwrap.dedent(f""" - [domain] - "{bad_name}" = [] - """) - with pytest.raises(SpecError, match=r"domain name .* must match"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -FIXTURE_TOML = VALID_TOML + textwrap.dedent(""" - [fixture] - values = ["MIN", "-100", "-1", "ZERO", "1", "9999", "MAX"] -""") - - -def test_fixture_values_default_to_none_when_absent(tmp_path): - spec = load_spec(write(tmp_path, "int4.toml", VALID_TOML)) - assert spec.fixture_values is None - - -def test_loads_fixture_values_when_present(tmp_path): - spec = load_spec(write(tmp_path, "int4.toml", FIXTURE_TOML)) - assert spec.fixture_values == [ - "MIN", "-100", "-1", "ZERO", "1", "9999", "MAX", - ] - - -def test_fixture_values_must_be_a_list(tmp_path): - bad = VALID_TOML + '\n[fixture]\nvalues = "MIN"\n' - with pytest.raises(SpecError, match=r"\[fixture\] values: must be a list"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_table_requires_values_key(tmp_path): - bad = VALID_TOML + "\n[fixture]\nother = 1\n" - with pytest.raises(SpecError, match=r"\[fixture\]: missing required key 'values'"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_values_must_be_non_empty(tmp_path): - bad = VALID_TOML + "\n[fixture]\nvalues = []\n" - with pytest.raises(SpecError, match=r"\[fixture\] values: must not be empty"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_values_must_be_strings(tmp_path): - bad = VALID_TOML + "\n[fixture]\nvalues = [1, 2]\n" - with pytest.raises(SpecError, match=r"\[fixture\] values: must be strings"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_values_reject_invalid_literal(tmp_path): - bad = VALID_TOML + '\n[fixture]\nvalues = ["MIN", "oops", "ZERO", "MAX"]\n' - with pytest.raises(SpecError, match="not a valid i32 literal"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_values_require_min_max_zero(tmp_path): - bad = VALID_TOML + '\n[fixture]\nvalues = ["1", "2", "3"]\n' - with pytest.raises(SpecError, match="must include MIN, MAX, and zero"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_values_require_max_even_if_min_and_zero_present(tmp_path): - bad = VALID_TOML + '\n[fixture]\nvalues = ["MIN", "ZERO", "1"]\n' - with pytest.raises(SpecError, match="must include MIN, MAX, and zero"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_values_reject_duplicate_literal(tmp_path): - bad = VALID_TOML + '\n[fixture]\nvalues = ["MIN", "1", "ZERO", "1", "MAX"]\n' - with pytest.raises(SpecError, match=r"must be distinct.*duplicate values.*'1'"): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_values_reject_sentinel_literal_alias(tmp_path): - # "MIN" and the i32::MIN literal resolve to the same plaintext value; - # the distinct-plaintext contract must reject the pair. - bad = ( - VALID_TOML - + '\n[fixture]\nvalues = ["MIN", "-2147483648", "ZERO", "MAX"]\n' - ) - with pytest.raises( - SpecError, - match=r"must be distinct.*'-2147483648' duplicates 'MIN' \(both resolve to -2147483648\)", - ): - load_spec(write(tmp_path, "int4.toml", bad)) - - -def test_fixture_for_unknown_scalar_token_raises(tmp_path): - bad = textwrap.dedent(""" - [domain] - int8 = [] - - [fixture] - values = ["1"] - """) - with pytest.raises(SpecError, match="unknown scalar token 'int8'"): - load_spec(write(tmp_path, "int8.toml", bad)) diff --git a/tasks/codegen/test_templates.py b/tasks/codegen/test_templates.py deleted file mode 100644 index 4a24f9232..000000000 --- a/tasks/codegen/test_templates.py +++ /dev/null @@ -1,500 +0,0 @@ -"""Tests for per-construct SQL template functions.""" - -from tasks.codegen.spec import DomainSpec, TypeSpec -from tasks.codegen.templates import ( - AGGREGATE_OPS, - AUTO_GENERATED_HEADER, - AUTO_GENERATED_HEADER_RS, - _sql_str, - brief_role_clause, - domain_name, - extractor_for_operator, - is_ord_capable, - render_aggregate, - render_blocker_bool, - render_blocker_native, - render_blocker_path, - render_domain_block, - render_extractor, - render_fixture_values_rs, - render_operator, - render_wrapper, -) -from tasks.codegen.terms import TERM_CATALOG - - -def test_auto_generated_header_present(): - # Byte-identical to the Rust generator's marker - # (crates/eql-codegen/src/consts.rs) and to the `^-- AUTOMATICALLY GENERATED - # FILE` prefix that tasks/docs/validate/*.sh grep on to skip generated SQL. - assert AUTO_GENERATED_HEADER == "-- AUTOMATICALLY GENERATED FILE.\n" - assert "AUTOMATICALLY GENERATED FILE" in AUTO_GENERATED_HEADER - - -def test_rust_header_is_a_rust_comment(): - # Rust uses // comments, not SQL's --. Byte-identical to the Rust - # generator's AUTO_GENERATED_HEADER_RS (crates/eql-codegen/src/consts.rs). - assert AUTO_GENERATED_HEADER_RS == "// AUTOMATICALLY GENERATED FILE.\n" - # No line is an SQL-style (`--`) comment — this is Rust, not SQL. - assert not any( - line.startswith("--") for line in AUTO_GENERATED_HEADER_RS.splitlines() - ) - - -def test_render_fixture_values_rs_emits_typed_const(): - spec = TypeSpec( - token="int4", - domains=[], - fixture_values=["MIN", "-1", "ZERO", "1", "MAX"], - ) - body = render_fixture_values_rs(spec) - assert "pub const VALUES: &[i32] = &[" in body - assert "`int4` row in `eql-scalars::CATALOG`" in body - # Sentinels map to named consts; numeric tokens pass through. - assert "i32::MIN," in body - assert "i32::MAX," in body - assert " -1,\n" in body - assert " 0,\n" in body # ZERO and "1" both literal - assert " 1,\n" in body - # No generated-file marker in the body — the writer prepends it. - assert "AUTOMATICALLY GENERATED FILE" not in body - - -def test_render_fixture_values_rs_preserves_manifest_order(): - spec = TypeSpec( - token="int4", - domains=[], - fixture_values=["MIN", "ZERO", "MAX"], - ) - body = render_fixture_values_rs(spec) - assert body.index("i32::MIN") < body.index("0,") < body.index("i32::MAX") - - -def test_domain_block_storage_uses_fixed_envelope_only(): - domain = DomainSpec(name="int4", terms=[]) - sql = render_domain_block(domain, "int4") - assert "CREATE DOMAIN eql_v3.int4 AS jsonb" in sql - assert "VALUE ? 'v'" in sql - assert "VALUE ? 'i'" in sql - assert "VALUE ? 'c'" in sql - assert "VALUE ? 'hm'" not in sql - assert "VALUE ? 'ob'" not in sql - - -def test_domain_block_uses_catalog_json_keys(): - domain = DomainSpec(name="int4_ord", terms=["ore"]) - sql = render_domain_block(domain, "int4") - assert "CREATE DOMAIN eql_v3.int4_ord AS jsonb" in sql - assert "VALUE ? 'ob'" in sql - assert "VALUE ? 'ore'" not in sql - - -def test_domain_block_check_pins_envelope_version(): - """Thread D: the CHECK both verifies the envelope `v` key is PRESENT and - pins its value to the EQL payload-format version (2), matching the - repo-wide eql_v2._encrypted_check_v rule. The v=1 payloads in - tests/sqlx/fixtures/aggregate_minmax_data.sql belong to the separate - composite-type (eql_v2_encrypted) aggregate stream, not these domains, so - pinning the value here rejects stale/foreign-version payloads without - affecting that fixture.""" - for domain in ( - DomainSpec(name="int4", terms=[]), - DomainSpec(name="int4_eq", terms=["hm"]), - DomainSpec(name="int4_ord", terms=["ore"]), - ): - sql = render_domain_block(domain, "int4") - assert "VALUE ? 'v'" in sql # presence checked - assert "VALUE->>'v' = '2'" in sql # value pinned to version 2 - - -def test_extractor_is_catalog_derived_and_inlinable(): - domain = DomainSpec(name="int4_eq", terms=["hm"]) - sql = render_extractor(domain, TERM_CATALOG["hm"]) - assert "CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)" in sql - assert "RETURNS eql_v2.hmac_256" in sql - assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" in sql - assert "SELECT eql_v2.hmac_256(a::jsonb)" in sql - assert "SET search_path" not in sql - - -def test_wrapper_uses_term_extractor_for_supported_operator(): - domain = DomainSpec(name="int4_ord", terms=["ore"]) - sql = render_wrapper( - domain, - op="<", - arg_a="eql_v3.int4_ord", - arg_b="jsonb", - extractor="ord_term", - ) - assert "CREATE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b jsonb)" in sql - assert "SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int4_ord)" in sql - - -def test_wrapper_is_inlinable_sql(): - """Wrappers must be single-statement LANGUAGE sql with no search_path pin.""" - domain = DomainSpec(name="int4_eq", terms=["hm"]) - sql = render_wrapper( - domain, - op="=", - arg_a="eql_v3.int4_eq", - arg_b="eql_v3.int4_eq", - extractor="eq_term", - ) - assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" in sql - assert "SET search_path" not in sql - assert "LANGUAGE plpgsql" not in sql - - -def test_extractor_for_operator_selects_catalog_term(): - domain = DomainSpec(name="int4_ord", terms=["ore"]) - assert extractor_for_operator(domain, "=") == "ord_term" - assert extractor_for_operator(domain, "<") == "ord_term" - - -def test_extractor_for_operator_returns_none_for_unsupported_operator(): - domain = DomainSpec(name="int4_eq", terms=["hm"]) - assert extractor_for_operator(domain, "<") is None - - -def test_blocker_bool_is_not_strict(): - """Footgun: a STRICT blocker lets Postgres skip the body on NULL input, - silently bypassing the 'operator not supported' raise. Assert the exact - attribute line so any future refactor that re-adds STRICT fails loudly.""" - domain = DomainSpec(name="int4", terms=[]) - sql = render_blocker_bool( - domain, op="<", arg_a="eql_v3.int4", arg_b="eql_v3.int4", - ) - assert "CREATE FUNCTION eql_v3.lt(a eql_v3.int4, b eql_v3.int4)" in sql - assert "encrypted_domain_unsupported_bool('eql_v3.int4', '<')" in sql - assert "RETURNS boolean IMMUTABLE PARALLEL SAFE\n" in sql - assert "LANGUAGE plpgsql" in sql - assert "STRICT" not in sql - - -def test_blocker_path_is_not_strict(): - """Mirror of test_blocker_bool_is_not_strict for path blockers.""" - domain = DomainSpec(name="int4", terms=[]) - sql = render_blocker_path( - domain, op="->", arg_a="eql_v3.int4", arg_b="text", - ) - assert "RETURNS eql_v3.int4 IMMUTABLE PARALLEL SAFE\n" in sql - assert "LANGUAGE plpgsql" in sql - assert "STRICT" not in sql - - -def test_blocker_path_returns_domain_or_text(): - domain = DomainSpec(name="int4", terms=[]) - arrow = render_blocker_path( - domain, op="->", arg_a="eql_v3.int4", arg_b="text", - ) - assert 'CREATE FUNCTION eql_v3."->"(a eql_v3.int4, selector text)' in arrow - assert "RETURNS eql_v3.int4" in arrow - arrow2 = render_blocker_path( - domain, op="->>", arg_a="eql_v3.int4", arg_b="text", - ) - assert "RETURNS text" in arrow2 - - -def test_blocker_path_for_jsonb_left_arg_returns_domain(): - """The (jsonb, dom) shape from _path_shapes still routes to the domain - return type for `->` (only `->>` returns text).""" - domain = DomainSpec(name="int4", terms=[]) - sql = render_blocker_path( - domain, op="->", arg_a="jsonb", arg_b="eql_v3.int4", - ) - assert 'CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int4)' in sql - assert "RETURNS eql_v3.int4" in sql - - -def test_blocker_native_bool_uses_helper_and_is_not_strict(): - domain = DomainSpec(name="int4", terms=[]) - sql = render_blocker_native( - domain, op="?", arg_a="eql_v3.int4", arg_b="text", returns="boolean", - ) - assert 'CREATE FUNCTION eql_v3."?"(a eql_v3.int4, b text)' in sql - assert "encrypted_domain_unsupported_bool('eql_v3.int4', '?')" in sql - assert "RETURNS boolean IMMUTABLE PARALLEL SAFE\n" in sql - assert "LANGUAGE plpgsql" in sql - assert "STRICT" not in sql - - -def test_blocker_native_jsonb_result_raises_and_is_not_strict(): - domain = DomainSpec(name="int4", terms=[]) - sql = render_blocker_native( - domain, op="#>", arg_a="eql_v3.int4", arg_b="text[]", returns="jsonb", - ) - assert 'CREATE FUNCTION eql_v3."#>"(a eql_v3.int4, b text[])' in sql - assert "RETURNS jsonb IMMUTABLE PARALLEL SAFE\n" in sql - assert "RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int4'" in sql - assert "LANGUAGE plpgsql" in sql - assert "STRICT" not in sql - - -def test_blocker_native_text_result_raises_and_is_not_strict(): - domain = DomainSpec(name="int4", terms=[]) - sql = render_blocker_native( - domain, op="#>>", arg_a="eql_v3.int4", arg_b="text[]", returns="text", - ) - assert 'CREATE FUNCTION eql_v3."#>>"(a eql_v3.int4, b text[])' in sql - assert "RETURNS text IMMUTABLE PARALLEL SAFE\n" in sql - assert "LANGUAGE plpgsql" in sql - assert "STRICT" not in sql - - -def test_blocker_native_concat_cross_shape(): - domain = DomainSpec(name="int4", terms=[]) - sql = render_blocker_native( - domain, op="||", arg_a="jsonb", arg_b="eql_v3.int4", returns="jsonb", - ) - assert 'CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int4)' in sql - assert "RETURNS jsonb" in sql - - -def test_operator_symmetric_metadata(): - sql = render_operator( - op="=", backing="eq", - leftarg="eql_v3.int4_eq", rightarg="eql_v3.int4_eq", - supported=True, - ) - assert "CREATE OPERATOR = (" in sql - assert "FUNCTION = eql_v3.eq" in sql - assert "LEFTARG = eql_v3.int4_eq, RIGHTARG = eql_v3.int4_eq" in sql - assert "NEGATOR = <>" in sql - assert "RESTRICT = eqsel" in sql - - -def test_render_operator_unsupported_emits_only_function_and_args(): - """Unsupported routing must not emit NEGATOR / RESTRICT / JOIN / COMMUTATOR - (those would lie about selectivity for a function that always raises).""" - sql = render_operator( - op="=", backing="eq", - leftarg="eql_v3.int4", rightarg="eql_v3.int4", - supported=False, - ) - assert "CREATE OPERATOR = (" in sql - assert "FUNCTION = eql_v3.eq" in sql - assert "LEFTARG = eql_v3.int4, RIGHTARG = eql_v3.int4" in sql - assert "NEGATOR" not in sql - assert "RESTRICT" not in sql - assert "JOIN" not in sql - assert "COMMUTATOR" not in sql - - -def test_render_aggregate_min_int4_ord_emits_state_function_and_aggregate(): - """Pin the rendered shape for the canonical (int4_ord, min) case.""" - domain = DomainSpec(name="int4_ord", terms=["ore"]) - sql = render_aggregate(domain, AGGREGATE_OPS["min"]) - assert "CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int4_ord, value eql_v3.int4_ord)" in sql - assert "RETURNS eql_v3.int4_ord" in sql - assert "LANGUAGE plpgsql IMMUTABLE STRICT" in sql - assert "SET search_path = pg_catalog, extensions, public" in sql - assert "IF value < state THEN" in sql - assert "CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord) (" in sql - assert "sfunc = eql_v3.min_sfunc" in sql - assert "stype = eql_v3.int4_ord" in sql - - -def test_render_aggregate_max_uses_greater_than_comparator(): - """Symmetric pin: max uses `>` not `<`.""" - domain = DomainSpec(name="int4_ord_ore", terms=["ore"]) - sql = render_aggregate(domain, AGGREGATE_OPS["max"]) - assert "CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int4_ord_ore, value eql_v3.int4_ord_ore)" in sql - assert "IF value > state THEN" in sql - assert "CREATE AGGREGATE eql_v3.max(eql_v3.int4_ord_ore) (" in sql - - -def test_render_aggregate_state_function_is_not_inlinable(): - """Footgun mirror: blockers must be LANGUAGE plpgsql; the state function - deliberately is too, so the planner can't elide an IMMUTABLE STRICT - aggregate state call away. STRICT + plpgsql + SET search_path together.""" - domain = DomainSpec(name="int4_ord", terms=["ore"]) - sql = render_aggregate(domain, AGGREGATE_OPS["min"]) - assert "LANGUAGE plpgsql" in sql - assert "STRICT" in sql - # Inlinable-SQL shape — explicitly absent. - assert "LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE" not in sql - - -def test_is_ord_capable_matches_role(): - assert is_ord_capable(DomainSpec(name="int4_ord", terms=["ore"])) is True - assert is_ord_capable(DomainSpec(name="int4_ord_ore", terms=["ore"])) is True - assert is_ord_capable(DomainSpec(name="int4_eq", terms=["hm"])) is False - assert is_ord_capable(DomainSpec(name="int4", terms=[])) is False - - -def test_render_operator_for_containment_omits_commutator(): - """@> has no commutator / negator / selectivity in OPERATORS; supported=True - must still omit those clauses.""" - sql = render_operator( - op="@>", backing="contains", - leftarg="eql_v3.int4_ord", rightarg="eql_v3.int4_ord", - supported=True, - ) - assert "CREATE OPERATOR @> (" in sql - assert "FUNCTION = eql_v3.contains" in sql - assert "COMMUTATOR" not in sql - assert "NEGATOR" not in sql - assert "RESTRICT" not in sql - assert "JOIN" not in sql - - -# --- ITEM A: placeholder/blocker operator comment ------------------------- - - -def test_render_operator_unsupported_emits_placeholder_comment(): - """Thread A: a blocker-backed (unsupported) operator must carry a leading - SQL comment explaining it is a placeholder that raises, so a future - reviewer doesn't wonder why an ordering op is declared on an eq-only - domain.""" - sql = render_operator( - op="<", backing="lt", - leftarg="eql_v3.int4_eq", rightarg="eql_v3.int4_eq", - supported=False, - ) - assert sql.startswith("-- Placeholder:") - assert "does not support <" in sql - assert "always raises" in sql - # The comment precedes the CREATE OPERATOR. - assert sql.index("-- Placeholder:") < sql.index("CREATE OPERATOR") - - -def test_render_operator_supported_has_no_placeholder_comment(): - """Supported operators route to real wrappers — no placeholder comment.""" - sql = render_operator( - op="=", backing="eq", - leftarg="eql_v3.int4_eq", rightarg="eql_v3.int4_eq", - supported=True, - ) - assert "Placeholder" not in sql - - -# --- ITEM B & J: aggregate SQL rationale comments ------------------------- - - -def test_render_aggregate_state_function_emits_plpgsql_rationale_comment(): - """Thread B: the plpgsql rationale must appear in the emitted SQL (not just - as a Python comment) so a SQL reader sees why it isn't an inlinable - LANGUAGE sql CASE.""" - domain = DomainSpec(name="int4_ord", terms=["ore"]) - sql = render_aggregate(domain, AGGREGATE_OPS["min"]) - assert "-- LANGUAGE plpgsql, not sql:" in sql - assert "not index" in sql - # The rationale precedes the state-function definition. - assert sql.index("-- LANGUAGE plpgsql, not sql:") < sql.index( - "CREATE FUNCTION eql_v3.min_sfunc" - ) - - -def test_render_aggregate_enables_parallel_and_combinefunc(): - """Thread #22: MIN/MAX aggregates declare a combine function (the state - function itself — min/max are associative) and PARALLEL = SAFE, so PG can - use partial/parallel aggregation on the large GROUP BY workloads these ORE - aggregates exist to serve. The sfunc is likewise PARALLEL SAFE.""" - for op_name, sfunc in (("min", "min_sfunc"), ("max", "max_sfunc")): - domain = DomainSpec(name="int4_ord", terms=["ore"]) - sql = render_aggregate(domain, AGGREGATE_OPS[op_name]) - # The state function must be parallel-safe... - assert "LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE" in sql - # ...and the aggregate must declare the combinefunc + parallel safety - # inside the CREATE AGGREGATE option list (not merely in prose). - aggregate_body = sql[sql.index(f"CREATE AGGREGATE eql_v3.{op_name}"):] - assert f"combinefunc = eql_v3.{sfunc}" in aggregate_body - assert "parallel = safe" in aggregate_body - # The stale "intentionally disabled" omission note must be gone. - assert "intentionally disabled" not in sql - assert "-- No COMBINEFUNC" not in sql - - -# --- ITEM K: differentiated @brief for converged vs scheme-explicit ------- - - -def test_domain_brief_distinguishes_converged_from_scheme_twin(): - """Thread K: int4_ord (converged) and int4_ord_ore (scheme twin) carry the - same terms but must render distinct, sensible briefs.""" - ord_dom = DomainSpec(name="int4_ord", terms=["ore"]) - ore_dom = DomainSpec(name="int4_ord_ore", terms=["ore"]) - ord_sql = render_domain_block(ord_dom, "int4") - ore_sql = render_domain_block(ore_dom, "int4") - - ord_brief = next( - line for line in ord_sql.splitlines() if "@brief" in line - ) - ore_brief = next( - line for line in ore_sql.splitlines() if "@brief" in line - ) - # Both still lead with the role phrase... - assert "Ordered encrypted int4 domain." in ord_brief - assert "Ordered encrypted int4 domain." in ore_brief - # ...but the trailing clause differs and reads sensibly. - assert ord_brief != ore_brief - assert "Recommended converged name" in ord_brief - assert "Scheme-explicit twin" in ore_brief - assert "ore scheme" in ore_brief - assert "int4_ord" in ore_brief # points back at the converged name - - -def test_brief_role_clause_is_generic_over_token_and_scheme(): - """The disambiguation reads token/role/scheme from the name, not a - hard-coded literal — so it works for other types (int8) and schemes.""" - # Converged ordered name for a different token. - assert "Recommended converged name" in brief_role_clause( - DomainSpec(name="int8_ord", terms=["ore"]), "int8" - ) - # Scheme-explicit twin with a hypothetical non-ore scheme label. - clause = brief_role_clause( - DomainSpec(name="date_ord_lex", terms=["ore"]), "date" - ) - assert "Scheme-explicit twin" in clause - assert "lex scheme" in clause - assert "date_ord" in clause - - -def test_brief_role_clause_empty_for_storage_and_eq(): - """Storage and eq domains have no converged/twin ambiguity (only one name - each), so they get no disambiguating clause — brief stays unchanged.""" - assert brief_role_clause(DomainSpec(name="int4", terms=[]), "int4") == "" - assert brief_role_clause( - DomainSpec(name="int4_eq", terms=["hm"]), "int4" - ) == "" - - -# --- THREAD 1: SQL-string interpolation hardening ------------------------- - - -def test_sql_str_doubles_single_quotes(): - """_sql_str doubles embedded single quotes so a value can't break out of - its SQL string literal.""" - assert _sql_str("o'brien") == "o''brien" - assert _sql_str("a'b'c") == "a''b''c" - # Quote-free input is unchanged — current catalog strings stay byte-stable. - assert _sql_str("int4_eq") == "int4_eq" - assert _sql_str("<=") == "<=" - - -def test_blocker_escapes_quote_bearing_domain_in_rendered_sql(): - """A hypothetical quote-bearing domain name must be doubled inside the - helper-call string literal in the rendered blocker, not interpolated raw. - - (op can't carry a quote in practice — it's looked up in the operator - catalog — so the domain name is the live escaping path through the blocker - string literals.)""" - domain = DomainSpec(name="o'dom", terms=[]) - sql = render_blocker_bool( - domain, op="<", arg_a="eql_v3.o'dom", arg_b="eql_v3.o'dom", - ) - # The dom flows into encrypted_domain_unsupported_bool('', '') - # as a single-quoted literal — the quote must be doubled. - assert "encrypted_domain_unsupported_bool('eql_v3.o''dom', '<')" in sql - # The raw, unescaped single-quoted form must not appear. - assert "'eql_v3.o'dom'" not in sql - - -def test_domain_block_escapes_quote_bearing_key_in_check(): - """A hypothetical quote-bearing payload key must be doubled inside the - VALUE ? '' check rather than interpolated raw.""" - # A term-free domain whose name carries a quote exercises the typname - # literal escaping in the IF NOT EXISTS guard. - quoted = DomainSpec(name="we'ird", terms=[]) - sql = render_domain_block(quoted, "int4") - assert "typname = 'we''ird'" in sql - assert "typname = 'we'ird'" not in sql diff --git a/tasks/codegen/test_terms.py b/tasks/codegen/test_terms.py deleted file mode 100644 index 8ac7aa4be..000000000 --- a/tasks/codegen/test_terms.py +++ /dev/null @@ -1,96 +0,0 @@ -"""Tests for the fixed scalar-domain term catalog.""" - -import pytest - -from tasks.codegen.terms import ( - TermError, - extractor_for_operator, - operators_for_terms, - require_terms, - role_for_terms, - term_json_keys, - term_requires, -) - - -def test_hm_term_provides_equality(): - terms = require_terms(["hm"]) - hm = terms[0] - assert hm.name == "hm" - assert hm.json_key == "hm" - assert hm.extractor == "eq_term" - assert hm.returns == "eql_v2.hmac_256" - assert hm.ctor == "hmac_256" - assert hm.role == "eq" - assert hm.operators == ("=", "<>") - assert hm.requires == ("src/hmac_256/functions.sql",) - - -def test_ore_term_preserves_existing_int4_sql_contract(): - terms = require_terms(["ore"]) - ore = terms[0] - assert ore.name == "ore" - assert ore.json_key == "ob" - assert ore.extractor == "ord_term" - assert ore.returns == "eql_v2.ore_block_u64_8_256" - assert ore.ctor == "ore_block_u64_8_256" - assert ore.role == "ord" - assert ore.operators == ("=", "<>", "<", "<=", ">", ">=") - assert ore.requires == ( - "src/ore_block_u64_8_256/functions.sql", - "src/ore_block_u64_8_256/operators.sql", - ) - - -def test_unknown_term_raises(): - with pytest.raises(TermError, match="unknown term 'bogus'"): - require_terms(["bogus"]) - - -def test_operators_are_union_in_catalog_order(): - assert operators_for_terms(["ore", "hm"]) == [ - "=", "<>", "<", "<=", ">", ">=", - ] - - -def test_json_keys_come_from_catalog_not_manifest_names(): - assert term_json_keys(["hm", "ore"]) == ["hm", "ob"] - - -def test_term_requires_are_deduplicated(): - assert term_requires(["ore", "ore", "hm"]) == [ - "src/ore_block_u64_8_256/functions.sql", - "src/ore_block_u64_8_256/operators.sql", - "src/hmac_256/functions.sql", - ] - - -def test_role_for_terms_handles_storage_eq_ord(): - assert role_for_terms([]) == "storage" - assert role_for_terms(["hm"]) == "eq" - assert role_for_terms(["ore"]) == "ord" - - -def test_operators_for_terms_handles_empty_list(): - assert operators_for_terms([]) == [] - - -def test_term_json_keys_handles_empty_list(): - assert term_json_keys([]) == [] - - -def test_term_requires_handles_empty_list(): - assert term_requires([]) == [] - - -def test_extractor_for_operator_picks_first_term_supporting_op(): - assert extractor_for_operator(["hm"], "=") == "eq_term" - assert extractor_for_operator(["ore"], "<") == "ord_term" - # Multi-term domains: first supporting term wins. - assert extractor_for_operator(["hm", "ore"], "=") == "eq_term" - assert extractor_for_operator(["hm", "ore"], "<") == "ord_term" - - -def test_extractor_for_operator_returns_none_when_no_term_supports_op(): - assert extractor_for_operator(["hm"], "<") is None - assert extractor_for_operator([], "=") is None diff --git a/tasks/codegen/test_writer.py b/tasks/codegen/test_writer.py deleted file mode 100644 index 81805cb18..000000000 --- a/tasks/codegen/test_writer.py +++ /dev/null @@ -1,157 +0,0 @@ -"""Tests for the ownership / overwrite-refusal / stale-cleanup rules.""" -import pytest -from tasks.codegen.generate import REPO_ROOT -from tasks.codegen.templates import AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS -from tasks.codegen.writer import ( - _MARKER, - OwnershipError, - is_generated, - is_generated_rs, - clean_generated_files, - ensure_generated_paths_writable, - write_generated_file, - write_generated_rs, -) - - -_EXPECTED_SUFFIXES = ( - "_types.sql", - "_functions.sql", - "_operators.sql", - "_aggregates.sql", - "_extensions.sql", -) - - -def test_is_generated_true_for_header(tmp_path): - p = tmp_path / "x.sql" - p.write_text(AUTO_GENERATED_HEADER + "SELECT 1;\n") - assert is_generated(p) is True - - -def test_is_generated_false_for_handwritten(tmp_path): - p = tmp_path / "x.sql" - p.write_text("-- REQUIRE: src/schema.sql\nSELECT 1;\n") - assert is_generated(p) is False - - -def test_is_generated_true_for_crlf_header(tmp_path): - p = tmp_path / "x.sql" - p.write_bytes((_MARKER + "\r\n" + "SELECT 1;\n").encode("utf-8")) - assert is_generated(p) is True - - -def test_write_generated_file_creates_with_header(tmp_path): - p = tmp_path / "int4_types.sql" - write_generated_file(p, "DO $$ BEGIN END $$;\n") - text = p.read_text() - assert text.startswith(AUTO_GENERATED_HEADER) - assert "DO $$ BEGIN END $$;" in text - - -def test_write_refuses_to_overwrite_handwritten(tmp_path): - """Refuse to clobber a hand-written file at a generated path.""" - p = tmp_path / "int4_types.sql" - p.write_text("-- REQUIRE: src/schema.sql\n-- hand-written\n") - with pytest.raises(OwnershipError, match="hand-written"): - write_generated_file(p, "DO $$ BEGIN END $$;\n") - - -def test_preflight_refuses_handwritten_target_before_cleanup(tmp_path): - generated = tmp_path / "int4_types.sql" - hand = tmp_path / "int4_eq_functions.sql" - generated.write_text(AUTO_GENERATED_HEADER + "-- old generated\n") - hand.write_text("-- REQUIRE: src/schema.sql\n-- hand-written\n") - - with pytest.raises(OwnershipError, match=r"int4_eq_functions\.sql"): - ensure_generated_paths_writable([generated, hand]) - - assert generated.exists() - assert hand.exists() - - -def test_write_overwrites_existing_generated_file(tmp_path): - """A file that already carries the header may be overwritten.""" - p = tmp_path / "int4_types.sql" - p.write_text(AUTO_GENERATED_HEADER + "-- old content\n") - write_generated_file(p, "-- new content\n") - text = p.read_text() - assert "-- new content" in text - assert "-- old content" not in text - - -def test_clean_removes_only_generated_files(tmp_path): - """Clean deletes every generated file, keeps the rest.""" - gen1 = tmp_path / "int4_eq_functions.sql" - gen2 = tmp_path / "int4_old_domain_functions.sql" # stale orphan - hand = tmp_path / "int4_jsonb_extra.sql" - gen1.write_text(AUTO_GENERATED_HEADER + "SELECT 1;\n") - gen2.write_text(AUTO_GENERATED_HEADER + "SELECT 2;\n") - hand.write_text("-- REQUIRE: src/schema.sql\n-- hand-written\n") - - removed = clean_generated_files(tmp_path) - - assert not gen1.exists() - assert not gen2.exists() # stale orphan cleaned up - assert hand.exists() # hand-written file untouched - assert set(removed) == {gen1, gen2} - - -def test_clean_on_empty_directory(tmp_path): - """Clean on a greenfield directory removes nothing and does not error.""" - removed = clean_generated_files(tmp_path) - assert removed == [] - - -def test_write_generated_rs_creates_with_rust_header(tmp_path): - p = tmp_path / "int4_values.rs" - write_generated_rs(p, "pub const VALUES: &[i32] = &[];\n") - text = p.read_text() - assert text.startswith(AUTO_GENERATED_HEADER_RS) - assert "pub const VALUES" in text - - -def test_is_generated_rs_true_for_rust_header(tmp_path): - p = tmp_path / "int4_values.rs" - p.write_text(AUTO_GENERATED_HEADER_RS + "pub const VALUES: &[i32] = &[];\n") - assert is_generated_rs(p) is True - - -def test_is_generated_rs_false_for_handwritten(tmp_path): - p = tmp_path / "int4_values.rs" - p.write_text("//! hand-written\npub const VALUES: &[i32] = &[];\n") - assert is_generated_rs(p) is False - - -def test_write_generated_rs_refuses_to_overwrite_handwritten(tmp_path): - p = tmp_path / "int4_values.rs" - p.write_text("//! hand-written\n") - with pytest.raises(OwnershipError, match="hand-written"): - write_generated_rs(p, "pub const VALUES: &[i32] = &[];\n") - - -def test_write_generated_rs_overwrites_existing_generated(tmp_path): - p = tmp_path / "int4_values.rs" - p.write_text(AUTO_GENERATED_HEADER_RS + "// old\n") - write_generated_rs(p, "// new\n") - text = p.read_text() - assert "// new" in text - assert "// old" not in text - - -def test_no_misnamed_sql_files_in_generated_dirs(): - """Files under src/encrypted_domain// must end in one of the four - documented suffixes — catches mistakes like `int4_extension.sql` - (singular), which the build would silently include despite violating - the documented convention.""" - root = REPO_ROOT / "src" / "encrypted_domain" - misnamed = [ - path.relative_to(REPO_ROOT) - for type_dir in root.iterdir() if type_dir.is_dir() - for path in sorted(type_dir.glob("*.sql")) - if not path.name.endswith(_EXPECTED_SUFFIXES) - ] if root.is_dir() else [] - assert not misnamed, ( - f"misnamed SQL files in src/encrypted_domain/ — expected suffix in " - f"{_EXPECTED_SUFFIXES}: {misnamed}" - ) diff --git a/tasks/codegen/types/.gitkeep b/tasks/codegen/types/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tasks/codegen/types/int2.toml b/tasks/codegen/types/int2.toml deleted file mode 100644 index 314bc6982..000000000 --- a/tasks/codegen/types/int2.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Encrypted-domain scalar manifest for int2. -# The filename supplies the type token. Each domain lists the index terms -# it carries; term capabilities are fixed in tasks/codegen/terms.py. - -[domain] -int2 = [] -int2_eq = ["hm"] -int2_ord_ore = ["ore"] -int2_ord = ["ore"] - -# Single source of truth for the int2 fixture plaintext list. Drives the -# generated tests/sqlx/src/fixtures/int2_values.rs const, shared by the fixture -# generator and the matrix oracle. Sentinels MIN/MAX/ZERO map to i16 named -# consts; the set MUST include MIN, MAX, and zero (matrix comparison pivots). -[fixture] -values = [ - "MIN", "-30000", "-100", "-1", "ZERO", "1", "2", "5", "10", "17", "25", - "42", "50", "100", "250", "1000", "9999", "30000", "MAX", -] diff --git a/tasks/codegen/types/int4.toml b/tasks/codegen/types/int4.toml deleted file mode 100644 index 606d80ee4..000000000 --- a/tasks/codegen/types/int4.toml +++ /dev/null @@ -1,19 +0,0 @@ -# Encrypted-domain scalar manifest for int4. -# The filename supplies the type token. Each domain lists the index terms -# it carries; term capabilities are fixed in tasks/codegen/terms.py. - -[domain] -int4 = [] -int4_eq = ["hm"] -int4_ord_ore = ["ore"] -int4_ord = ["ore"] - -# Single source of truth for the int4 fixture plaintext list. Drives the -# generated tests/sqlx/src/fixtures/int4_values.rs const, shared by the fixture -# generator and the matrix oracle. Sentinels MIN/MAX/ZERO map to i32 named -# consts; the set MUST include MIN, MAX, and zero (matrix comparison pivots). -[fixture] -values = [ - "MIN", "-100", "-1", "ZERO", "1", "2", "5", "10", "17", "25", - "42", "50", "100", "250", "1000", "9999", "MAX", -] diff --git a/tasks/codegen/writer.py b/tasks/codegen/writer.py deleted file mode 100644 index aa0cdd99b..000000000 --- a/tasks/codegen/writer.py +++ /dev/null @@ -1,89 +0,0 @@ -"""File writer enforcing the AUTO-GENERATED-header ownership rule. - -The generator owns only files carrying the AUTO-GENERATED header. It -preflights expected output paths, deletes generated files to clear stale -orphans, and refuses to overwrite a hand-written file at a generated path. -""" - -from pathlib import Path - -from .templates import AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS - -# The first line of each header is the ownership marker. -_MARKER = AUTO_GENERATED_HEADER.splitlines()[0] -_RS_MARKER = AUTO_GENERATED_HEADER_RS.splitlines()[0] - - -class OwnershipError(Exception): - """Raised when the generator would clobber a hand-written file.""" - - -def _first_line(path: Path) -> str: - with path.open("r", encoding="utf-8") as fh: - return fh.readline().rstrip("\r\n") - - -def is_generated(path: Path) -> bool: - """True if the file at `path` carries the SQL AUTO-GENERATED marker.""" - if not path.is_file(): - return False - return _first_line(path) == _MARKER - - -def is_generated_rs(path: Path) -> bool: - """True if the file at `path` carries the Rust AUTO-GENERATED marker.""" - if not path.is_file(): - return False - return _first_line(path) == _RS_MARKER - - -def clean_generated_files(directory: Path) -> list[Path]: - """Delete every generated .sql file in `directory`. Returns the list - of removed paths. Hand-written files are left untouched. A no-op on a - directory that does not exist or holds no generated files.""" - directory = Path(directory) - if not directory.is_dir(): - return [] - removed: list[Path] = [] - for path in sorted(directory.glob("*.sql")): - if is_generated(path): - path.unlink() - removed.append(path) - return removed - - -def ensure_generated_paths_writable(paths: list[Path]) -> None: - """Refuse a generation run before cleanup if any target is hand-written.""" - for path in paths: - path = Path(path) - if path.exists() and not is_generated(path): - raise OwnershipError( - f"refusing to overwrite hand-written file: {path} " - f"(no AUTO-GENERATED header). Remove it by hand if it is a " - f"one-time generator-adoption target." - ) - - -def write_generated_file(path: Path, body: str) -> None: - """Write `body` to `path`, prefixed with the SQL AUTO-GENERATED header. - - Refuses (OwnershipError) if `path` exists and is hand-written — a file - at a generated path that lacks the header is never clobbered.""" - path = Path(path) - ensure_generated_paths_writable([path]) - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(AUTO_GENERATED_HEADER + body, encoding="utf-8") - - -def write_generated_rs(path: Path, body: str) -> None: - """Write `body` to a Rust file, prefixed with the Rust AUTO-GENERATED - header. Unlike the SQL surface this file is committed; the header still - guards against clobbering a hand-written file at the same path.""" - path = Path(path) - if path.exists() and not is_generated_rs(path): - raise OwnershipError( - f"refusing to overwrite hand-written file: {path} " - f"(no AUTO-GENERATED header)." - ) - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(AUTO_GENERATED_HEADER_RS + body, encoding="utf-8") From 1b0a2c3734acb5967a45711eb54307fc8d660c51 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 15:58:23 +1000 Subject: [PATCH 050/599] docs(CLAUDE): describe Rust catalog codegen, single matrix snapshot, no TOML/Python --- CLAUDE.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 104770621..65da42bdc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,7 +29,7 @@ This project uses `mise` for task management. Common commands: - Run SQLx tests directly: `mise run test:sqlx` - Run SQLx tests in watch mode: `mise run test:sqlx:watch` - Tests are located in `tests/sqlx/` using Rust and SQLx framework -- Regenerate the scalar matrix coverage snapshots: `mise run test:matrix:inventory` (no database required). These committed `tests/sqlx/snapshots/_matrix_tests.txt` baselines pin the set of `scalars::::*` test names so a silently dropped/renamed/`#[cfg]`-gated test fails CI's `matrix-coverage` job. When you add or remove matrix tests (or add a scalar type), regenerate and commit the affected snapshot in the same change. See `tests/sqlx/snapshots/README.md`. +- Verify the scalar matrix coverage snapshot: `mise run test:matrix:inventory` (no database required). ONE committed `tests/sqlx/snapshots/matrix_tests.txt` baseline pins the token-normalized set of `scalars::::*` test names so a silently dropped/renamed/`#[cfg]`-gated test fails CI's `matrix-coverage` job. The task discovers the present scalar types from the test binary's `--list` and cross-checks them against `cargo run -p eql-codegen -- list-types`, so a catalog type missing its matrix wiring also fails. When you change which matrix tests the macro emits, regenerate and commit the single snapshot in the same change. See `tests/sqlx/snapshots/README.md`. ### Build System - Dependencies are resolved using `-- REQUIRE:` comments in SQL files @@ -78,11 +78,11 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search `src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. -Adding a scalar encrypted-domain type is generated from a minimal manifest at `tasks/codegen/types/.toml`: the filename supplies ``, and the `[domain]` table maps each generated domain name to the fixed index terms it carries. Example: `int4_eq = ["hm"]`, `int4_ord = ["ore"]`. Term capabilities are fixed in `tasks/codegen/terms.py`: `hm` provides equality, and `ore` provides equality plus ordering. `mise run build` regenerates the scalar SQL surface into `src/encrypted_domain//` from every manifest at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. Use `mise run codegen:domain ` to refresh a single type manually while iterating on its manifest, or `mise run codegen:domain:all` to regenerate every type at once (the same enumeration `mise run build` uses). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` files are gitignored and never committed — the TOML manifest plus `tasks/codegen/terms.py` are the source of truth. Generated files carry an `AUTOMATICALLY GENERATED FILE — DO NOT EDIT` header (the project-wide marker that `docs:validate` greps on to skip generated SQL); change the manifest or term catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` have no generated SQL surface yet (they are planned, not out of scope); `jsonb` needs a separate SQL design beyond this ordered-scalar materializer. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/encrypted_domain//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed; the committed `tests/sqlx/src/fixtures/_values.rs` consts are also generated (CI diffs them). Generated SQL carries an `AUTOMATICALLY GENERATED FILE — DO NOT EDIT` header (the project-wide marker `docs:validate` greps on) and the committed `_values.rs` carries an `AUTO-GENERATED — DO NOT EDIT` header; change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. -**Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the manifest only declares domain names and terms. New term behavior belongs in `tasks/codegen/terms.py` with tests, not in free-form TOML fields. +**Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. -Regeneration is deterministic: identical manifest + term catalog produce byte-identical SQL. If `mise run build` produces unexpected output, the change is in the manifest, `tasks/codegen/terms.py`, or `tasks/codegen/templates.py` — not in random run-to-run variation. +Regeneration is deterministic: an identical `CATALOG` produces byte-identical SQL. If `mise run build` produces unexpected output, the change is in `crates/eql-scalars/src` (the catalog/terms) or `crates/eql-codegen/src` (the renderers) — not in random run-to-run variation. Footguns the spec exists to prevent: @@ -90,7 +90,7 @@ Footguns the spec exists to prevent: - **No domain-over-domain** (`CREATE DOMAIN a AS b`). Operators resolve against the ultimate base type (`jsonb`), so a derived domain does not inherit the base domain's operator surface — blockers stop engaging. - **No operator class on a domain.** Index through a functional index on the extractor (`eq_term` / `ord_term`), whose return type already carries a default opclass. - **Inlinable functions** (extractors, comparison wrappers) need `LANGUAGE sql`, a single-statement `SELECT`, `IMMUTABLE`, and **no `SET` clause** — a pinned `search_path` disables inlining. No per-type allowlist edit: the `pin_search_path.sql` structural rule recognises encrypted-domain functions intrinsically and `tasks/test/splinter.sh` covers the converged extractor/wrapper names. -- **Blockers must be `LANGUAGE plpgsql`, not `LANGUAGE sql`.** The inverse of the rule above. A blocker exists to always raise, but a `LANGUAGE sql` body is inlinable and the planner can elide the call when the result is provably unused (dead `CASE` branch, folded predicate). `LANGUAGE plpgsql` is opaque to the planner, so the call — and its `RAISE` — survives. The generator in `tasks/codegen/templates.py` enforces this; don't "simplify" the rendered blockers to `LANGUAGE sql` even though the body is a single expression. +- **Blockers must be `LANGUAGE plpgsql`, not `LANGUAGE sql`.** The inverse of the rule above. A blocker exists to always raise, but a `LANGUAGE sql` body is inlinable and the planner can elide the call when the result is provably unused (dead `CASE` branch, folded predicate). `LANGUAGE plpgsql` is opaque to the planner, so the call — and its `RAISE` — survives. The blocker renderers in `crates/eql-codegen/src` enforce this; don't "simplify" the rendered blockers to `LANGUAGE sql` even though the body is a single expression. - **Build with `mise run clean && mise run build`** — a bare build can leave stale `release/*.sql`. ### Testing Infrastructure @@ -220,7 +220,7 @@ Prefer `LANGUAGE SQL` over `LANGUAGE plpgsql` unless you need procedural feature - Exception handling (`BEGIN...EXCEPTION...END`) - Complex control flow (loops, early returns) - Dynamic SQL (`EXECUTE`) -- Functions that must remain opaque to the planner — typically blockers whose only job is to `RAISE`. `LANGUAGE sql` would be inlined and may be elided when the result is provably unused; `LANGUAGE plpgsql` is never inlined, so the body always runs. See the encrypted-domain footgun list above and the blocker renderers in `tasks/codegen/templates.py`. +- Functions that must remain opaque to the planner — typically blockers whose only job is to `RAISE`. `LANGUAGE sql` would be inlined and may be elided when the result is provably unused; `LANGUAGE plpgsql` is never inlined, so the body always runs. See the encrypted-domain footgun list above and the blocker renderers in `crates/eql-codegen/src`. ## Release & changelog discipline From 3c0dbb97055a192a133c2ab4affb1cd0cd331c16 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 16:01:44 +1000 Subject: [PATCH 051/599] docs(spec): rewrite encrypted-domain spec for Rust catalog, single matrix snapshot --- .../encrypted-domain-implementation-spec.md | 264 ++++++++++-------- 1 file changed, 146 insertions(+), 118 deletions(-) diff --git a/docs/reference/encrypted-domain-implementation-spec.md b/docs/reference/encrypted-domain-implementation-spec.md index e21c8d6a1..838f870cc 100644 --- a/docs/reference/encrypted-domain-implementation-spec.md +++ b/docs/reference/encrypted-domain-implementation-spec.md @@ -2,7 +2,7 @@ This is the scalar encrypted-domain generator contract used by `int4`. It applies to scalar domains whose searchable payloads are represented by -the fixed term catalog in `tasks/codegen/terms.py`. +the fixed `Term` catalog in `crates/eql-scalars/src`. `text` and `jsonb` are outside this scalar materializer. @@ -10,33 +10,41 @@ the fixed term catalog in `tasks/codegen/terms.py`. Each generated domain is a concrete `jsonb` domain in the `eql_v3` schema named `eql_v3.` (dropped by `DROP SCHEMA eql_v3 CASCADE`; -survives an `eql_v2` uninstall). The manifest is intentionally small: - -```toml -[domain] -int4 = [] -int4_eq = ["hm"] -int4_ord_ore = ["ore"] -int4_ord = ["ore"] +survives an `eql_v2` uninstall). A type's catalog row is intentionally +small — a `ScalarSpec` whose `domains` field lists each generated domain +as a `DomainSpec` (a `suffix` plus the fixed terms it carries): + +```rust +ScalarSpec { + token: "int4", + kind: ScalarKind::I32, + domains: &[ + DomainSpec { suffix: "", terms: &[] }, + DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, + DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, + DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, + ], + fixtures: &[/* see §9 */], +} ``` -The TOML filename supplies the type token. The `[domain]` table maps each -generated domain name to the fixed terms it carries. The generator -emits files in the manifest's declared order, so order keys in the TOML -in the order you want them to appear in generated output. Term capabilities -come only from `tasks/codegen/terms.py`: +The `token` supplies the type token; each domain's full name is `token` ++ `suffix`. The generator emits domains in the order the `domains` slice +declares them, so order the slice the way you want the generated output to +read. Term capabilities are fixed by the `Term` enum +(`crates/eql-scalars/src`): | Term | JSON key | Extractor | Return type | Supported operators | |---|---|---|---|---| -| `hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` / `<>` | -| `ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` / `<>` / `<` / `<=` / `>` / `>=` | +| `Hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` / `<>` | +| `Ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` / `<>` / `<` / `<=` / `>` / `>=` | -For current `int4`, domains carrying `ore` use JSON key `ob`, extractor +For current `int4`, domains carrying `Ore` use JSON key `ob`, extractor `ord_term`, and the ORE block supports equality plus ordering. A type that needs a non-ORE equality term on an ordered domain needs a new -catalog term design, not a manifest flag. +`Term` design, not a catalog flag. -The manifest above declares two ordered domains, `int4_ord` and +The row above declares two ordered domains, `int4_ord` and `int4_ord_ore`, carrying the same term. They are intentional twins: the generator emits byte-identical SQL (modulo type name) so callers can pick a name that documents intent without committing to a term family in a @@ -44,42 +52,38 @@ future migration. ## 2. Checklist -- [ ] Author `tasks/codegen/types/.toml`. The filename supplies ``. - The `[domain]` table maps generated domain names to fixed terms: - - ```toml - [domain] - int4 = [] - int4_eq = ["hm"] - int4_ord_ore = ["ore"] - int4_ord = ["ore"] - ``` - - Terms determine operator support: `hm` provides `=` / `<>`; `ore` - provides `=` / `<>` / `<` / `<=` / `>` / `>=`. -- [ ] Add or update catalog terms in `tasks/codegen/terms.py` with tests. -- [ ] **If `` is a new scalar kind, register a `ScalarKind` in - `tasks/codegen/scalars.py`** (use the `int4` entry as the template): its - `token`, `rust_type`, the `MIN` / `MAX` / `ZERO` Rust symbols, and the - numeric `min_value` / `max_value` bounds. This is a code change with - tests, exactly like a new catalog term in `terms.py` — not a manifest - field. `load_spec` resolves the scalar before it validates anything, so - without this entry `mise run codegen:domain ` raises - `ScalarError: unknown scalar token ''` and emits nothing. Then search - the codegen tests for any fixture using `` as a negative "unknown - scalar" example (e.g. `test_spec.py`) and update it — registering the - kind makes that token valid. -- [ ] Declare the fixture plaintext list once in the manifest's `[fixture]` - table (see §9). The list MUST include `MIN`, `MAX`, and zero. -- [ ] Run `mise run codegen:domain ` to materialise generated SQL and the - committed `tests/sqlx/src/fixtures/_values.rs` while iterating, or - just `mise run build` — every build regenerates from the manifest first. - Commit the regenerated `_values.rs` (CI diffs it). +- [ ] Add a row to the Rust catalog `eql-scalars::CATALOG` + (`crates/eql-scalars/src/lib.rs`). A `ScalarSpec` declares: + + - `token` — the type token (e.g. `int8`); supplies `` everywhere. + - `kind` — the `ScalarKind` (`I16` / `I32` / `I64`), which carries the + Rust type name, the `MIN`/`MAX`/zero symbols, and the numeric bounds. + - `domains` — a `&[DomainSpec]`, each a `suffix` + the fixed `Term`s it + carries. The storage domain is suffix `""` with no terms; `_eq => [Hm]`; + `_ord` and `_ord_ore => [Ore]`. + - `fixtures` — the `Fixture` value list (see §9). It MUST include `Min`, + `Max`, and zero. + + Terms determine operator support: `Hm` provides `=` / `<>`; `Ore` + provides `=` / `<>` / `<` / `<=` / `>` / `>=`. There is no TOML manifest + and no Python: the catalog is the source of truth, validated by the + compiler (an undefined `Term` or unknown `ScalarKind` is a compile error) + plus catalog `#[test]`s over `CATALOG`. +- [ ] **If `` needs a new scalar width**, add a `ScalarKind` enum variant in + `crates/eql-scalars/src/lib.rs` with its rust-type name, `MIN`/`MAX`/zero + symbols, and numeric bounds, and unit-test its `impl` methods. New term + behaviour likewise belongs in the `Term` enum's `impl` methods with tests + — not in free-form catalog data. +- [ ] Run `cargo run -p eql-codegen` to materialise the generated SQL + (`src/encrypted_domain//_{types,functions,operators,aggregates}.sql`, + gitignored) and the committed `tests/sqlx/src/fixtures/_values.rs` + const, or just `mise run build` — every build runs the generator first. + Commit the regenerated `_values.rs` (CI diffs it). There is no per-type + codegen task: one run generates every type from `CATALOG`. - [ ] Generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / - `*_aggregates.sql` are gitignored and never committed. The TOML - manifest plus `tasks/codegen/terms.py` are the source of truth. - Change the manifest or catalog and rebuild; do not hand-edit - generated SQL. + `*_aggregates.sql` are gitignored and never committed. The catalog + (`eql-scalars::CATALOG`) plus the `eql-codegen` renderers are the source + of truth. Change the catalog and rebuild; do not hand-edit generated SQL. - [ ] Put optional hand-written SQL in `src/encrypted_domain//_extensions.sql` with explicit `-- REQUIRE:` edges. This file IS committed. @@ -87,25 +91,47 @@ future migration. single golden master for the type-generic generator: the SQL templates are pure token substitution and the only type-specific rendering is `_values.rs`, so a per-type baseline can only fail when `int4`'s already - would. Drift protection for the new type comes from the `int4` reference - (shared templates + `terms.py`), the committed `_values.rs` const guarded - by the CI staleness check (`mise run codegen:domain ` + `git diff - --exit-code`) and the `` cases in `tasks/codegen/test_scalars.py`, and - the `ordered_numeric_matrix!` SQLx suite (behaviour, not bytes). -- [ ] Run `mise run test:matrix:inventory` and commit the regenerated - `tests/sqlx/snapshots/_matrix_tests.txt` — the sorted inventory of every - `scalars::::*` test name in the `encrypted_domain` binary. CI diffs it - (same as `_values.rs`); a stale snapshot fails the `matrix-coverage` - job with "Coverage inventory stale". This baseline is what catches a - silently dropped, renamed, or `#[cfg]`-gated matrix test. See §8. -- [ ] Run `mise run test:codegen`, the relevant SQLx suites, and the - PostgreSQL matrix before merging. + would. Drift protection for the new type comes from the `int4` reference, + the committed `_values.rs` const guarded by the CI staleness check + (`cargo run -p eql-codegen` + `git diff --exit-code`) and the catalog/ + generator `#[test]`s (`cargo test -p eql-scalars -p eql-codegen`), and the + `ordered_numeric_matrix!` SQLx suite (behaviour, not bytes). +- [ ] Wire the SQLx matrix oracle. The generated SQL is enough to install the + domains, but the `ordered_numeric_matrix!` suite only runs once the Rust + harness knows about the scalar. Copy each piece from the `int4` + reference — these are hand-maintained registration lists (the Phase-4 + `scalar_types!` registry, a separate plan, will collapse them): + + | File | Add | + |------|-----| + | `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for the scalar's Rust type: `impl Sealed for {}`, a `PlaintextSqlType` const for its base column type, `impl EqlPlaintext for ` (`CAST`, `PLAINTEXT_SQL_TYPE`, `to_plaintext` → the right `Plaintext` variant), plus the two `#[test]` casts. | + | `tests/sqlx/src/fixtures/eql_v2_.rs` | `crate::scalar_fixture!("eql_v2_", , VALUES);` (pulls `super::_values::VALUES`). | + | `tests/sqlx/src/fixtures/mod.rs` | `pub mod _values;` and `pub mod eql_v2_;`. | + | `tests/sqlx/tests/generate_all_fixtures.rs` | An arm in `generate_for_token`: `"" => fixtures::eql_v2_::spec().run().await,`. The match is exhaustive over the catalog — a catalog token with no arm fails the generator loudly. | + | `tests/sqlx/src/scalar_domains.rs` | `impl ScalarType for ` — `PG_TYPE` (the base PG type, e.g. `"int8"`) and `FIXTURE_VALUES = crate::fixtures::_values::VALUES`. | + | `tests/sqlx/tests/encrypted_domain/scalars/.rs` | `ordered_numeric_matrix! { suite = , scalar = , eql_type = "eql_v2_" }`. | + | `tests/sqlx/tests/encrypted_domain/scalars/mod.rs` | `pub mod ;`. | + + `` is the scalar's Rust type (`i32` for `int4`, `i16` for `int2`). + Forget one and the matrix simply does not run for the type — the matrix + inventory cross-check (next step) surfaces it, because the catalog has the + type but the binary has no `scalars::::` tests. +- [ ] Run `mise run test:matrix:inventory`. It verifies every present type's + token-normalized `scalars::::*` name set equals the single canonical + `tests/sqlx/snapshots/matrix_tests.txt`, and cross-checks the present type + set against `cargo run -p eql-codegen -- list-types`. You do **not** edit a + per-type snapshot — there is one canonical snapshot; you only regenerate it + when the macro's emitted name set itself changes. A catalog type missing + its matrix wiring fails the cross-check. See §8 and + `tests/sqlx/snapshots/README.md`. +- [ ] Run `mise run test:codegen` (`cargo test -p eql-scalars -p eql-codegen`), + the relevant SQLx suites, and the PostgreSQL matrix before merging. ## 3. Domain Generation The generator emits `src/encrypted_domain//_types.sql` (gitignored; -materialised on every `mise run build` and on `mise run codegen:domain -`) with one idempotent `DO $$ ... $$` block. Domain `CHECK` +materialised on every `mise run build` and every `cargo run -p eql-codegen`) +with one idempotent `DO $$ ... $$` block. Domain `CHECK` constraints always require: - fixed envelope keys `v` and `i`; @@ -126,9 +152,9 @@ that bypass the fixed operator surface. ## 4. Extractors And Wrappers -Extractor names and return types come from `tasks/codegen/terms.py`, not -from TOML. Generated extractors and supported comparison wrappers are -inline-friendly SQL functions: +Extractor names and return types come from the `Term` enum +(`crates/eql-scalars/src`), not from catalog data. Generated extractors and +supported comparison wrappers are inline-friendly SQL functions: ```sql LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE @@ -225,7 +251,7 @@ Optional hand-written SQL beyond the fixed scalar surface belongs in: src/encrypted_domain//_extensions.sql ``` -The generator must not create this file, list it in TOML, add an +The generator must not create this file, list it in the catalog, add an auto-generated header, or clean it during regeneration. The file must declare its own `-- REQUIRE:` edges, usually to `_types.sql` and whichever generated function or operator file it extends. Unlike the @@ -261,7 +287,7 @@ Cover each generated domain with SQLx tests appropriate to its terms: - real typed columns are tested, not only cast literals; - generated ordered-domain twins remain byte-identical modulo type name (the shared generator is anchored by the `int4` golden master in - `tests/codegen/reference/int4/` via `tasks/codegen/test_against_reference.py`; + `tests/codegen/reference/int4/` via the eql-codegen parity test; new types add no baseline of their own — see §2). For ordered numeric scalars this coverage is generated by the @@ -283,21 +309,24 @@ the catalog does not promise. ### Matrix coverage inventory snapshot -The *set of test names* the matrix emits is itself guarded. `mise run -test:matrix:inventory` lists every test in the `encrypted_domain` binary -under a pinned feature set (`--no-default-features`, which deliberately -excludes the `scale` arm — see the task comment in `mise.toml`), greps it to -each `scalars::::*` matrix, `LC_ALL=C sort`s for byte-stable ordering, and -writes one committed snapshot per scalar at -`tests/sqlx/snapshots/_matrix_tests.txt`. The CI `matrix-coverage` job -regenerates with the same feature set and `git diff --exit-code`s every -snapshot; a divergence fails with "Coverage inventory stale". This is the -guard that catches a silently dropped, renamed, or `#[cfg]`-gated matrix -test — a behaviour the SQLx assertions above cannot see, because a deleted -test simply stops running. When you add a scalar you add a new snapshot; -when you add or remove matrix tests you regenerate and commit the affected -snapshot in the same change. The files are a committed test baseline, **not** -gitignored generated SQL. See `tests/sqlx/snapshots/README.md`. +The *set of test names* the matrix emits is guarded by ONE committed, +token-normalized snapshot at `tests/sqlx/snapshots/matrix_tests.txt` — the +sorted inventory of every `scalars::::*` test name with the type token +replaced by the literal ``. (The per-type `_matrix_tests.txt` files are +gone: they were byte-identical modulo the token, so one canonical set plus a +per-type normalize-and-compare carries the same signal at a fraction of the +committed surface.) This is the guard that catches a silently dropped, renamed, +or `#[cfg]`-gated matrix test, a behaviour the SQLx assertions above cannot see. +The snapshot is a committed test baseline, **not** gitignored generated SQL. + +`mise run test:matrix:inventory` discovers the present scalar types from the +`encrypted_domain` binary's `--list`, normalizes each type's token to ``, +asserts every type's set equals the canonical snapshot, and cross-checks the +discovered type set against `cargo run -p eql-codegen -- list-types` (the catalog +is the single source). The CI `matrix-coverage` job gates it. **`tests/sqlx/snapshots/README.md` +is the source of truth** for the mechanics (pinned feature set, the catalog +cross-check, the CI diff, and when to regenerate); see it rather than +duplicating the detail here. ## 9. Fixtures @@ -317,47 +346,46 @@ absent. ### Single-sourcing the value list -The plaintext value list is declared **once**, in the manifest's optional -`[fixture]` table, and generated into Rust — never hand-maintained in two -places: +The plaintext value list is declared **once**, in the catalog row's `fixtures` +field, and generated into Rust — never hand-maintained in two places: -```toml -[fixture] -values = [ - "MIN", "-100", "-1", "ZERO", "1", "2", "5", "10", "17", "25", - "42", "50", "100", "250", "1000", "9999", "MAX", -] +```rust +fixtures: &[Fixture::Min, Fixture::N(-100), Fixture::N(-1), Fixture::Zero, + Fixture::N(1), Fixture::N(2), Fixture::N(5), Fixture::N(10), + Fixture::N(17), Fixture::N(25), Fixture::N(42), Fixture::N(50), + Fixture::N(100), Fixture::N(250), Fixture::N(1000), + Fixture::N(9999), Fixture::Max], ``` -Values are strings so the convention is type-agnostic. The sentinels `MIN`, -`MAX`, and `ZERO` map to the scalar's Rust named consts (for `int4`: -`i32::MIN`, `i32::MAX`, `0`); every other token is a numeric literal -validated against the type's representable range. The per-type rendering -rules live in `tasks/codegen/scalars.py` (mirroring `terms.py`), not in -free-form TOML fields. `load_spec` enforces the matrix invariant: the set -**must** include `MIN`, `MAX`, and zero, or the build fails. +`Fixture::Min` / `Fixture::Max` / `Fixture::Zero` resolve to the scalar's Rust +named consts (for `int4`: `i32::MIN`, `i32::MAX`, `0`); every `Fixture::N(_)` is +a numeric literal validated against the `ScalarKind`'s representable range by a +catalog `#[test]` (`numeric_value` is infallible, so the range check is the +explicit invariant `every_fixture_value_is_within_kind_bounds`). The same test +enforces the matrix invariant: the set **must** include `Min`, `Max`, and zero, +or the test fails (the compile-time analogue of the old `load_spec` validation). -The generator emits `tests/sqlx/src/fixtures/_values.rs` exposing one +`eql-codegen` emits `tests/sqlx/src/fixtures/_values.rs` exposing one `pub const VALUES: &[]`. Both consumers reference that single symbol — the fixture generator (`fixtures::eql_v2_::spec`) and the matrix -oracle (`impl ScalarType for { const FIXTURE_VALUES }`) — so the -oracle cannot drift from the values the generator encrypts. +oracle (`impl ScalarType for { const FIXTURE_VALUES }`) — so the oracle +cannot drift from the values the generator encrypts. Unlike the gitignored `*_*.sql` surface and the gitignored encrypted `tests/sqlx/fixtures/eql_v2_.sql` (whose ciphertext is non-deterministic -per-encrypt), `_values.rs` **is committed**: its rendering is -deterministic, so the CI `codegen` job regenerates it and runs -`git diff --exit-code` to catch a manifest edit that wasn't regenerated. -Regenerate with `mise run codegen:domain ` and commit the result; never -hand-edit it. +per-encrypt), `_values.rs` **is committed**: its rendering is deterministic, +so the CI `codegen` job regenerates it (`cargo run -p eql-codegen`) and runs +`git diff --exit-code` to catch a catalog edit that wasn't regenerated. +Regenerate with `cargo run -p eql-codegen` (or `mise run build`) and commit the +result; never hand-edit it. ## 10. Build And Verification -- `mise run codegen:domain ` (optional; refreshes one type while - iterating on its manifest before a full build) -- `mise run test:codegen` -- `mise run clean && mise run build` (regenerates every type's SQL - from its manifest first, then builds the release artefacts) +- `cargo run -p eql-codegen` (optional; refreshes all generated SQL + + `_values.rs` from the catalog before a full build) +- `mise run test:codegen` (`cargo test -p eql-scalars -p eql-codegen`) +- `mise run clean && mise run build` (regenerates every type's SQL from + the catalog first, then builds the release artefacts) - relevant SQLx suites - `mise run test` across supported PostgreSQL versions - `mise run --output prefix test:splinter --postgres 17` after a From 9efae0fe3a960df09af5119fe84ba1eff6390de8 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 16:02:34 +1000 Subject: [PATCH 052/599] docs(snapshots): rewrite README for single catalog-driven matrix snapshot --- tests/sqlx/snapshots/README.md | 80 ++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index a4ce5ae90..213b034f1 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -1,23 +1,26 @@ -# Matrix coverage inventory snapshots +# Matrix coverage inventory snapshot -This directory holds one committed snapshot per scalar encrypted-domain type: +This directory holds ONE committed snapshot, `matrix_tests.txt` — the canonical, +token-normalized list of every `scalars::::*` test name in the +`encrypted_domain` SQLx binary, with each type token replaced by the literal +``. It is a **committed test baseline**, not gitignored generated SQL — keep +it in version control. -- `int4_matrix_tests.txt` -- `int2_matrix_tests.txt` +The per-type `_matrix_tests.txt` files are gone. They were byte-identical +modulo the type token (the matrix tests are macro-generated from one +`ordered_numeric_matrix!` invocation per type with no per-type variation), so a +single canonical set plus a per-type normalize-and-compare carries the same +signal at a fraction of the committed surface. -Each file is a sorted, byte-stable list of every `scalars::::*` test name in -the `encrypted_domain` SQLx binary. They are a **committed test baseline**, not -gitignored generated SQL — keep them in version control. - -## What they guard +## What it guards The SQLx assertions verify that the tests which run produce the right results. They cannot see a test that *stops running* — a matrix test that is deleted, renamed, or hidden behind a `#[cfg]` gate simply vanishes silently, quietly -shrinking coverage. These snapshots close that gap: they pin the *set of test +shrinking coverage. This snapshot closes that gap: it pins the *set of test names* so any such change shows up as an added/removed line in the PR diff. -## How they are generated +## How it is generated / checked Run: @@ -25,11 +28,21 @@ Run: mise run test:matrix:inventory ``` -The task (`mise.toml`, `[tasks."test:matrix:inventory"]`) enumerates the binary -with `cargo test --test encrypted_domain -- --list`, greps each -`scalars::` matrix into its own file, and `LC_ALL=C sort`s for ordering -that is byte-stable across locales. No database is required — `--list` only -enumerates; the suite uses runtime queries. +The task (`mise.toml`, `[tasks."test:matrix:inventory"]`): + +1. Lists the `encrypted_domain` binary ONCE with + `cargo test --no-default-features --test encrypted_domain -- --list`. +2. Discovers the set of scalar types present **from the binary's own output** + (the `scalars::::` prefixes) — never a directory glob. +3. Normalizes each type's token to `` and asserts that type's set equals the + canonical `matrix_tests.txt`. Asserts at least one type is present. +4. **Completeness cross-check:** asserts the discovered type set equals + `cargo run -p eql-codegen -- list-types` (the catalog is the single source). + A catalog type added without its matrix wiring — no `scalars::::` tests in + the binary — fails here. + +`LC_ALL=C sort` makes ordering byte-stable across locales. No database is +required — `--list` only enumerates; the suite uses runtime queries. It pins `--no-default-features` so the inventory is deterministic regardless of the caller's local flags. That deliberately excludes the `scale` feature arm @@ -38,16 +51,29 @@ instead by the scale gate plus the `family::mutations` negative controls. ## CI enforcement -The `matrix-coverage` job in `.github/workflows/test-eql.yml` regenerates with -the same pinned feature set and runs `git diff --exit-code` against every -snapshot in this directory. A divergence fails the job with: - -> Coverage inventory stale — run 'mise run test:matrix:inventory' and commit. - -## When you must update these - -- **Adding a new scalar type** → a new `_matrix_tests.txt` appears; commit it. -- **Adding / removing / renaming matrix tests** → regenerate and commit the - affected snapshot in the same change. +The `matrix-coverage` job in `.github/workflows/test-eql.yml` runs the same +task, then `git add -N tests/sqlx/snapshots` and +`git diff --exit-code -- tests/sqlx/snapshots`. The `git add -N` makes a +brand-new, never-committed snapshot trip the diff too. A divergence (or a failed +catalog cross-check) fails the job. + +## When you must update this + +- **Adding a new scalar type** → add the catalog row in + `eql-scalars::CATALOG`, wire the SQLx matrix oracle (see the implementation + spec §2), then run `mise run test:matrix:inventory`. If the new type's + normalized name set matches the canonical snapshot (it will, for a standard + `ordered_numeric_matrix!` type), no snapshot edit is needed — the cross-check + just confirms the type is wired. +- **Removing a scalar type** → remove the catalog row and its matrix wiring; the + cross-check then sees the type gone from both sides. +- **Changing which matrix tests the macro emits** → regenerate and commit + `matrix_tests.txt` in the same change: + ```bash + cd tests/sqlx + cargo test --no-default-features --test encrypted_domain -- --list \ + | sed -n 's/: test$//p' | grep '^scalars::int4::' \ + | sed -e 's/^scalars::int4::/scalars::::/' -e 's/_int4_/__/g' | LC_ALL=C sort > snapshots/matrix_tests.txt + ``` See `docs/reference/encrypted-domain-implementation-spec.md` §2 and §8. From ca1a2ea828486f8a0667112234e0871cc6b00847 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 16:04:16 +1000 Subject: [PATCH 053/599] docs(changelog): record Rust catalog codegen + Python toolchain removal --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c75b70db3..1a280a719 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,9 +23,13 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors still return the core `eql_v2.hmac_256` / `eql_v2.ore_block_u64_8_256` index-term types, which remain in `eql_v2` and are referenced cross-schema. Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) -- **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from `tasks/codegen/types/int2.toml` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) +- **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) +### Changed + +- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the same gitignored SQL surface and the same committed `tests/sqlx/src/fixtures/_values.rs` consts via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#PR](https://github.com/cipherstash/encrypt-query-language/pull/PR)) + ## [2.3.1] — 2026-05-21 ### Fixed From e37af3f1be37202b39ff95246db8a8d3fe840944 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 2 Jun 2026 16:15:48 +1000 Subject: [PATCH 054/599] docs(CLAUDE): match actual generated-file markers (-- / // AUTOMATICALLY GENERATED FILE) --- CLAUDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 65da42bdc..ec0788ca0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -78,7 +78,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search `src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. -Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/encrypted_domain//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed; the committed `tests/sqlx/src/fixtures/_values.rs` consts are also generated (CI diffs them). Generated SQL carries an `AUTOMATICALLY GENERATED FILE — DO NOT EDIT` header (the project-wide marker `docs:validate` greps on) and the committed `_values.rs` carries an `AUTO-GENERATED — DO NOT EDIT` header; change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/encrypted_domain//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed; the committed `tests/sqlx/src/fixtures/_values.rs` consts are also generated (CI diffs them). Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on) and the committed `_values.rs` carries a `// AUTOMATICALLY GENERATED FILE` header; change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. **Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. From 4961055f5acdee148680f32d0efc94ce99a514a7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 09:41:35 +1000 Subject: [PATCH 055/599] refactor(codegen): drop generated _values.rs; materialise fixtures from catalog The committed tests/sqlx/src/fixtures/{int4,int2}_values.rs were a Rust->Rust codegen round-trip: eql-codegen re-serialised each catalog row's Fixture list into a committed .rs that the test crate then imported -- even though that crate already depends on eql-scalars. Now the catalog row is the single definition for both the SQL surface and the test fixtures, as originally intended. eql-scalars materialises each row's Fixture list into a typed const at compile time via the new int_values! macro (numeric_value is now a const fn): pub const INT4_VALUES: &[i32] = ...; pub const INT2_VALUES: &[i16] = ...; ScalarType::FIXTURE_VALUES reads them directly. The trait contract is unchanged, so matrix.rs, the int4_expanded.rs snapshot, and mutations.rs are untouched. - delete int4_values.rs, int2_values.rs, the golden reference/int4/int4_values.rs, the templates.rs renderer, and the now-dead Rust-header writer machinery (write_generated_rs / is_generated_rs / AUTO_GENERATED_HEADER_RS) - eql-scalars: add int_values! + the two consts + values_tests pinning the lists - CI/tasks: drop the regenerate-and-diff fixture-const step and the values.rs git-clean check in codegen-parity.sh - docs: CLAUDE.md, CHANGELOG, implementation spec, reference README Shipped SQL is unchanged (release/*.sql byte-identical). Verified: cargo test -p eql-scalars -p eql-codegen, cargo check -p eql_tests --all-targets, mise run codegen:parity, mise run clean && mise run build. --- .github/workflows/test-eql.yml | 27 ++-- CHANGELOG.md | 2 +- CLAUDE.md | 2 +- crates/eql-codegen/src/consts.rs | 18 --- crates/eql-codegen/src/context.rs | 33 ----- crates/eql-codegen/src/generate.rs | 77 +++--------- crates/eql-codegen/src/lib.rs | 9 +- crates/eql-codegen/src/main.rs | 2 +- crates/eql-codegen/src/templates.rs | 78 ------------ crates/eql-codegen/src/writer.rs | 77 +----------- crates/eql-codegen/tests/parity.rs | 47 +++---- crates/eql-scalars/src/lib.rs | 116 +++++++++++++++++- .../encrypted-domain-implementation-spec.md | 63 +++++----- tasks/build.sh | 7 +- tasks/codegen-parity.sh | 44 ++++--- tests/codegen/reference/README.md | 16 ++- .../reference/int4/int4_eq_functions.sql | 2 +- .../reference/int4/int4_eq_operators.sql | 2 +- .../codegen/reference/int4/int4_functions.sql | 2 +- .../codegen/reference/int4/int4_operators.sql | 2 +- .../reference/int4/int4_ord_aggregates.sql | 2 +- .../reference/int4/int4_ord_functions.sql | 2 +- .../reference/int4/int4_ord_operators.sql | 2 +- .../int4/int4_ord_ore_aggregates.sql | 2 +- .../reference/int4/int4_ord_ore_functions.sql | 2 +- .../reference/int4/int4_ord_ore_operators.sql | 2 +- tests/codegen/reference/int4/int4_types.sql | 2 +- tests/codegen/reference/int4/int4_values.rs | 28 ----- tests/sqlx/src/fixtures/eql_v2_int2.rs | 2 +- tests/sqlx/src/fixtures/eql_v2_int4.rs | 2 +- tests/sqlx/src/fixtures/int2_values.rs | 30 ----- tests/sqlx/src/fixtures/int4_values.rs | 28 ----- tests/sqlx/src/fixtures/mod.rs | 11 +- tests/sqlx/src/fixtures/scalar_fixture.rs | 2 +- tests/sqlx/src/scalar_domains.rs | 20 +-- 35 files changed, 264 insertions(+), 499 deletions(-) delete mode 100644 crates/eql-codegen/src/templates.rs delete mode 100644 tests/codegen/reference/int4/int4_values.rs delete mode 100644 tests/sqlx/src/fixtures/int2_values.rs delete mode 100644 tests/sqlx/src/fixtures/int4_values.rs diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index feacd2c60..d74f2946a 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -115,28 +115,15 @@ jobs: # Crate compile/lint/test (cargo test -p eql-scalars -p eql-codegen) runs # in the dedicated `test:crates` job; this job covers the codegen-specific - # gates only — fixture-value regeneration and golden/values parity. - - # Regenerate the committed Rust fixture-value consts for EVERY type from - # the catalog and fail if any differ from / are missing in the tree. - # eql-codegen renders all _values.rs deterministically (unlike the - # encrypted .sql fixtures, whose ciphertext is non-deterministic and - # gitignored), so a plain diff is the right guard — it catches a catalog - # edit that wasn't regenerated. `git add -N` registers any brand-new - # untracked const so a forgotten-to-commit file also trips the diff. No - # Postgres needed: the generator is std-only. - - name: Regenerate and verify fixture-value consts (all types) - run: | - cargo run -p eql-codegen - git add -N tests/sqlx/src/fixtures - git diff --exit-code -- tests/sqlx/src/fixtures \ - || { echo "Fixture value const(s) stale or uncommitted — run 'cargo run -p eql-codegen' and commit tests/sqlx/src/fixtures."; exit 1; } + # gate only — golden parity. The plaintext fixture lists are no longer a + # generated file: they live in the catalog (`eql_scalars::INT4_VALUES` / + # `INT2_VALUES`) and are pinned by `eql-scalars`'s own unit tests, so there + # is nothing to regenerate-and-diff here. # Parity gate: assert the Rust eql-codegen output is line-normalized-equal - # to the int4 golden reference and the committed _values.rs are byte- - # identical (git-clean) after regeneration. Python is no longer an oracle - # (retired in P2). No Postgres needed — the generator runs offline. - - name: Verify generator parity (golden + values) + # to the int4 golden reference. Python is no longer an oracle (retired in + # P2). No Postgres needed — the generator runs offline. + - name: Verify generator parity (golden) run: | mise run codegen:parity diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a280a719..853e5e81a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Changed -- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the same gitignored SQL surface and the same committed `tests/sqlx/src/fixtures/_values.rs` consts via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#PR](https://github.com/cipherstash/encrypt-query-language/pull/PR)) +- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#PR](https://github.com/cipherstash/encrypt-query-language/pull/PR)) ## [2.3.1] — 2026-05-21 diff --git a/CLAUDE.md b/CLAUDE.md index ec0788ca0..9cb5b80f0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -78,7 +78,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search `src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. -Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/encrypted_domain//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed; the committed `tests/sqlx/src/fixtures/_values.rs` consts are also generated (CI diffs them). Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on) and the committed `_values.rs` carries a `// AUTOMATICALLY GENERATED FILE` header; change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/encrypted_domain//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. **Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 3f2fdbf0b..64d2e438c 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -4,10 +4,6 @@ /// the writer uses it only to recognise files it owns (overwrite/clean safety). pub(crate) const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE.\n"; -/// Rust generated-file marker, prepended to `_values.rs` (which has no -/// template). Rust comment syntax so the `.rs` file stays valid. -pub(crate) const AUTO_GENERATED_HEADER_RS: &str = "// AUTOMATICALLY GENERATED FILE.\n"; - /// Schema housing the encrypted-domain families. pub(crate) const DOMAIN_SCHEMA: &str = "eql_v3"; /// Schema owning the core index-term types/constructors. @@ -37,20 +33,6 @@ mod tests { assert!(AUTO_GENERATED_HEADER.contains("AUTOMATICALLY GENERATED FILE")); } - #[test] - fn rust_marker_is_a_rust_comment() { - assert_eq!( - AUTO_GENERATED_HEADER_RS, - "// AUTOMATICALLY GENERATED FILE.\n" - ); - for line in AUTO_GENERATED_HEADER_RS.lines() { - assert!( - !line.starts_with("--"), - "rust marker must not contain SQL comments" - ); - } - } - #[test] fn sql_str_doubles_single_quotes() { assert_eq!(sql_str("o'brien"), "o''brien"); diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 7066377fd..01e80c6ca 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -4,17 +4,6 @@ use crate::consts::*; use crate::operator_surface::Operator; use eql_scalars::{DomainSpec, Term}; -/// Line-normalize SQL for best-effort byte-exact comparison: trim each line's -/// leading/trailing whitespace and drop blank lines; preserve intra-line -/// spacing. NOT used for `_values.rs` (which stays byte-exact). -pub fn normalize_sql(s: &str) -> String { - s.lines() - .map(|l| l.trim()) - .filter(|l| !l.is_empty()) - .collect::>() - .join("\n") -} - /// Build the minijinja environment with the embedded templates: one whole-file /// template per output file (`types`/`functions`/`operators`/`aggregates`) plus /// the per-kind function-body partials that `functions.sql` dynamically @@ -296,28 +285,6 @@ mod tests { assert!(!is_ord_capable(&[])); } - #[test] - fn normalize_trims_lines_and_drops_blanks() { - let input = " CREATE DOMAIN x\n\n CHECK (a) \n\n"; - assert_eq!(normalize_sql(input), "CREATE DOMAIN x\nCHECK (a)"); - } - - #[test] - fn normalize_preserves_intra_line_spacing() { - let input = "RAISE EXCEPTION 'operator % is not supported for %';"; - assert_eq!( - normalize_sql(input), - "RAISE EXCEPTION 'operator % is not supported for %';" - ); - } - - #[test] - fn normalize_equal_modulo_indentation_and_blank_lines() { - let a = "DO $$\nBEGIN\n IF NOT EXISTS (\n ) THEN\n END IF;\nEND\n$$;\n"; - let b = "DO $$\n\nBEGIN\n IF NOT EXISTS (\n ) THEN\nEND IF;\nEND\n$$;"; - assert_eq!(normalize_sql(a), normalize_sql(b)); - } - #[test] fn environment_has_whole_file_and_partial_templates() { let env = environment(); diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index c76255458..581f0244c 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -28,16 +28,6 @@ fn types_path(token: &str) -> String { format!("src/encrypted_domain/{token}/{token}_types.sql") } -/// Committed Rust fixture-value const path. Port of `fixture_values_rs_path`. -pub fn fixture_values_rs_path(out_root: &Path, token: &str) -> PathBuf { - out_root - .join("tests") - .join("sqlx") - .join("src") - .join("fixtures") - .join(format!("{token}_values.rs")) -} - /// Body for _types.sql: every domain in one idempotent DO block. /// Port of `render_types_file`. pub fn render_types_file(spec: &ScalarSpec) -> String { @@ -219,10 +209,8 @@ pub fn render_aggregates_file(token: &str, domain: &DomainSpec) -> Option Result, Ok(written) } -/// Generate every catalog type's SQL + committed _values.rs under `out_root`. -/// The single entry point: replaces Python's per-type and --all forms. +/// Generate every catalog type's gitignored SQL surface under `out_root`. The +/// single entry point: replaces Python's per-type and --all forms. The +/// plaintext fixture lists are not generated — they live in the catalog +/// (`eql_scalars::INT4_VALUES` / `INT2_VALUES`), read directly by the SQLx tests. pub fn generate_all(out_root: &Path) -> Result { for spec in eql_scalars::CATALOG { let token = spec.token; let out_dir = out_root.join("src").join("encrypted_domain").join(token); - let mut written = generate_type(spec, &out_dir)?; - - let rs_path = fixture_values_rs_path(out_root, token); - write_generated_rs(&rs_path, &render_fixture_values_rs(spec))?; - written.push(rs_path); + let written = generate_type(spec, &out_dir)?; for p in &written { let rel = p.strip_prefix(out_root).unwrap_or(p); @@ -312,7 +298,6 @@ mod tests { .expect("domain suffix") } - use crate::templates::render_fixture_values_rs; use std::fs; fn repo_root() -> PathBuf { @@ -384,18 +369,16 @@ mod tests { } #[test] - fn types_file_normalized_matches_golden() { - use crate::context::normalize_sql; + fn types_file_matches_golden() { let root = repo_root(); let path = root.join("tests/codegen/reference/int4/int4_types.sql"); let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); let actual = render_types_file(spec("int4")); - assert_eq!(normalize_sql(&actual), normalize_sql(&expected)); + assert_eq!(actual, expected); } #[test] - fn functions_files_normalized_match_golden() { - use crate::context::normalize_sql; + fn functions_files_match_golden() { let root = repo_root(); let s = spec("int4"); for d in s.domains { @@ -403,17 +386,12 @@ mod tests { let path = root.join(format!("tests/codegen/reference/int4/{full}_functions.sql")); let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); let actual = render_functions_file("int4", d); - assert_eq!( - normalize_sql(&actual), - normalize_sql(&expected), - "{full}_functions.sql diverged" - ); + assert_eq!(actual, expected, "{full}_functions.sql diverged"); } } #[test] - fn operators_files_normalized_match_golden() { - use crate::context::normalize_sql; + fn operators_files_match_golden() { let root = repo_root(); let s = spec("int4"); for d in s.domains { @@ -421,17 +399,12 @@ mod tests { let path = root.join(format!("tests/codegen/reference/int4/{full}_operators.sql")); let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); let actual = render_operators_file("int4", d); - assert_eq!( - normalize_sql(&actual), - normalize_sql(&expected), - "{full}_operators.sql" - ); + assert_eq!(actual, expected, "{full}_operators.sql"); } } #[test] - fn aggregates_files_normalized_match_golden() { - use crate::context::normalize_sql; + fn aggregates_files_match_golden() { let root = repo_root(); let s = spec("int4"); for d in s.domains { @@ -441,11 +414,7 @@ mod tests { "tests/codegen/reference/int4/{full}_aggregates.sql" )); let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - assert_eq!( - normalize_sql(&actual), - normalize_sql(&expected), - "{full}_aggregates.sql" - ); + assert_eq!(actual, expected, "{full}_aggregates.sql"); } } } @@ -462,13 +431,11 @@ mod tests { continue; } let name = path.file_name().unwrap().to_str().unwrap().to_string(); - use crate::context::normalize_sql; let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); let actual = rendered_for("int4", &name, s); assert_eq!( - normalize_sql(&actual), - normalize_sql(&expected), - "{name}: generator diverged from golden reference (normalized)" + actual, expected, + "{name}: generator diverged from golden reference" ); checked += 1; } @@ -478,18 +445,6 @@ mod tests { ); } - #[test] - fn generator_matches_int4_values_rs_reference() { - let root = repo_root(); - let path = root.join("tests/codegen/reference/int4/int4_values.rs"); - let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - let actual = render_fixture_values_rs(spec("int4")); - assert_eq!( - actual, expected, - "int4_values.rs: generator diverged from golden reference" - ); - } - #[test] fn generate_type_writes_expected_files() { let d = crate::writer::test_support::tempdir(); diff --git a/crates/eql-codegen/src/lib.rs b/crates/eql-codegen/src/lib.rs index ebde05bf7..aada6bb79 100644 --- a/crates/eql-codegen/src/lib.rs +++ b/crates/eql-codegen/src/lib.rs @@ -1,11 +1,12 @@ //! Scalar encrypted-domain SQL generator. Renders the `eql-scalars` catalog to -//! the gitignored SQL surface and the committed `_values.rs` consts. The SQL -//! surface is validated against the `tests/codegen/reference/int4` golden under -//! line-normalized comparison; `_values.rs` is validated byte-exact. +//! the gitignored SQL surface, validated byte-for-byte against the +//! `tests/codegen/reference/int4` golden (modulo the one `-- REFERENCE:` +//! provenance line each reference file carries). The plaintext fixture lists +//! the SQLx matrix consumes live in the catalog itself +//! (`eql_scalars::INT4_VALUES` / `INT2_VALUES`), not in a generated file. pub mod consts; pub mod context; pub mod generate; pub mod operator_surface; -pub mod templates; pub mod writer; diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index b1b96de8e..c51bf4c2f 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -27,7 +27,7 @@ fn main() -> ExitCode { } if args.len() == 1 { - // No args: generate every type's SQL + _values.rs. + // No args: generate every type's gitignored SQL surface. match generate_all(&repo_root()) { Ok(0) => return ExitCode::SUCCESS, Ok(_) => return ExitCode::FAILURE, // any non-zero codegen result is a failure diff --git a/crates/eql-codegen/src/templates.rs b/crates/eql-codegen/src/templates.rs deleted file mode 100644 index e0da5290c..000000000 --- a/crates/eql-codegen/src/templates.rs +++ /dev/null @@ -1,78 +0,0 @@ -//! Rust fixture-const renderer. The SQL surface is rendered from minijinja -//! templates (see `context.rs`); this file emits only the committed -//! `_values.rs` consts, which stay byte-exact. - -use eql_scalars::ScalarSpec; - -/// Body for tests/sqlx/src/fixtures/_values.rs. The writer prepends the -/// AUTO-GENERATED Rust header, so the body carries none. -/// Port of templates.py `render_fixture_values_rs`. -pub fn render_fixture_values_rs(spec: &ScalarSpec) -> String { - let token = spec.token; - let rust_type = spec.kind.rust_type(); - let mut literals = String::new(); - for &f in spec.fixtures { - literals.push_str(&format!(" {},\n", f.render_literal(spec.kind))); - } - // Raw string keeps the emitted shape legible while staying byte-exact; - // lines are flush-left because raw-string whitespace is literal output. - format!( - r#"//! Fixture plaintext values for the {token} encrypted-domain family. -//! -//! Generated from the `{token}` row in `eql-scalars::CATALOG` (`fixtures`) — -//! the single source of truth shared by the fixture generator -//! (`fixtures::eql_v2_{token}`) and the matrix oracle -//! (`ScalarType::FIXTURE_VALUES`). - -/// Distinct plaintext values present in the `eql_v2_{token}` fixture. -pub const VALUES: &[{rust_type}] = &[ -{literals}]; -"# - ) -} - -#[cfg(test)] -mod tests { - use super::*; - use eql_scalars::CATALOG; - - fn spec(token: &str) -> &'static ScalarSpec { - CATALOG - .iter() - .find(|s| s.token == token) - .expect("catalog token") - } - - #[test] - fn fixture_values_rs_emits_typed_const_for_int4() { - let body = render_fixture_values_rs(spec("int4")); - assert!(body.contains("pub const VALUES: &[i32] = &[")); - assert!(body.contains("eql-scalars::CATALOG")); - assert!(body.contains(" i32::MIN,\n")); - assert!(body.contains(" i32::MAX,\n")); - assert!(body.contains(" -1,\n")); - assert!(body.contains(" 0,\n")); - assert!(body.contains(" 1,\n")); - assert!(!body.contains("AUTO-GENERATED")); - } - - #[test] - fn fixture_values_rs_preserves_catalog_order() { - let body = render_fixture_values_rs(spec("int4")); - let min = body.find("i32::MIN").unwrap(); - let zero = body.find(" 0,").unwrap(); - let max = body.find("i32::MAX").unwrap(); - assert!(min < zero && zero < max); - } - - // Adapted from the plan's `fixture_values_rs_int8_uses_i64`: the shipped - // CATALOG has no int8 (deliberately reserved for a later branch), so this - // exercises the second committed non-i32 type — int2 (i16). - #[test] - fn fixture_values_rs_int2_uses_i16() { - let body = render_fixture_values_rs(spec("int2")); - assert!(body.contains("pub const VALUES: &[i16] = &[")); - assert!(body.contains(" i16::MIN,\n")); - assert!(body.contains(" -30000,\n")); - } -} diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index 7675af9fa..afbcdce09 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -4,18 +4,13 @@ use std::fs; use std::io; use std::path::{Path, PathBuf}; -use crate::consts::{AUTO_GENERATED_HEADER, AUTO_GENERATED_HEADER_RS}; +use crate::consts::AUTO_GENERATED_HEADER; /// First line of the SQL header — the ownership marker. fn sql_marker() -> &'static str { AUTO_GENERATED_HEADER.lines().next().unwrap() } -/// First line of the Rust header — the ownership marker. -fn rs_marker() -> &'static str { - AUTO_GENERATED_HEADER_RS.lines().next().unwrap() -} - /// Raised when the generator would clobber a hand-written file. #[derive(Debug)] pub enum WriteError { @@ -53,11 +48,6 @@ pub fn is_generated(path: &Path) -> bool { path.is_file() && first_line(path).map(|l| l == sql_marker()).unwrap_or(false) } -/// True if the file carries the Rust AUTO-GENERATED marker. Port of `is_generated_rs`. -pub fn is_generated_rs(path: &Path) -> bool { - path.is_file() && first_line(path).map(|l| l == rs_marker()).unwrap_or(false) -} - /// Delete every generated .sql file in `directory`, returning removed paths. /// Port of `clean_generated_files`. pub fn clean_generated_files(directory: &Path) -> io::Result> { @@ -107,21 +97,6 @@ pub fn write_generated_file(path: &Path, body: &str) -> Result<(), WriteError> { Ok(()) } -/// Write `body` to a Rust file prefixed with the Rust header. Port of `write_generated_rs`. -pub fn write_generated_rs(path: &Path, body: &str) -> Result<(), WriteError> { - if path.exists() && !is_generated_rs(path) { - return Err(WriteError::Ownership(format!( - "refusing to overwrite hand-written file: {} (no AUTO-GENERATED header).", - path.display() - ))); - } - if let Some(parent) = path.parent() { - fs::create_dir_all(parent)?; - } - fs::write(path, format!("{AUTO_GENERATED_HEADER_RS}{body}"))?; - Ok(()) -} - #[cfg(test)] pub(crate) mod test_support { use std::fs; @@ -255,54 +230,4 @@ mod tests { let d = tmp(); assert!(clean_generated_files(d.path()).unwrap().is_empty()); } - - #[test] - fn write_generated_rs_creates_with_rust_header() { - let d = tmp(); - let p = d.path().join("int4_values.rs"); - write_generated_rs(&p, "pub const VALUES: &[i32] = &[];\n").unwrap(); - let text = fs::read_to_string(&p).unwrap(); - assert!(text.starts_with(AUTO_GENERATED_HEADER_RS)); - assert!(text.contains("pub const VALUES")); - } - - #[test] - fn is_generated_rs_true_for_rust_header() { - let d = tmp(); - let p = d.path().join("int4_values.rs"); - fs::write( - &p, - format!("{AUTO_GENERATED_HEADER_RS}pub const VALUES: &[i32] = &[];\n"), - ) - .unwrap(); - assert!(is_generated_rs(&p)); - } - - #[test] - fn is_generated_rs_false_for_handwritten() { - let d = tmp(); - let p = d.path().join("int4_values.rs"); - fs::write(&p, "//! hand-written\npub const VALUES: &[i32] = &[];\n").unwrap(); - assert!(!is_generated_rs(&p)); - } - - #[test] - fn write_generated_rs_refuses_handwritten() { - let d = tmp(); - let p = d.path().join("int4_values.rs"); - fs::write(&p, "//! hand-written\n").unwrap(); - let err = write_generated_rs(&p, "pub const VALUES: &[i32] = &[];\n").unwrap_err(); - assert!(err.to_string().contains("hand-written")); - } - - #[test] - fn write_generated_rs_overwrites_existing_generated() { - let d = tmp(); - let p = d.path().join("int4_values.rs"); - fs::write(&p, format!("{AUTO_GENERATED_HEADER_RS}// old\n")).unwrap(); - write_generated_rs(&p, "// new\n").unwrap(); - let text = fs::read_to_string(&p).unwrap(); - assert!(text.contains("// new")); - assert!(!text.contains("// old")); - } } diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index 87c27526b..a59ed8dc5 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -1,8 +1,10 @@ //! THE PARITY GATE. Runs the Rust generator (into a temp dir) and asserts the -//! int4 SQL surface is line-normalized-equal to the `tests/codegen/reference/int4` -//! golden, and that committed `_values.rs` are byte-identical to the -//! generator output. The golden reference — not the retired Python generator — -//! is the sole oracle. +//! int4 SQL surface is byte-for-byte equal to the `tests/codegen/reference/int4` +//! golden (modulo the one leading `-- REFERENCE:` provenance line). The golden +//! reference — not the retired Python generator — is the sole oracle. The +//! plaintext fixture lists are not generated; they live in the catalog +//! (`eql_scalars::INT4_VALUES` / `INT2_VALUES`) and are pinned by +//! `eql-scalars`'s own `values_tests`. use std::fs; use std::path::PathBuf; @@ -27,25 +29,6 @@ fn tempdir(tag: &str) -> PathBuf { p } -#[test] -fn rust_generator_matches_committed_values_rs() { - let root = repo_root(); - let out = tempdir("rust-values"); - eql_codegen::generate::generate_all(&out).expect("rust generate_all"); - - for spec in eql_scalars::CATALOG { - let token = spec.token; - let generated = out.join(format!("tests/sqlx/src/fixtures/{token}_values.rs")); - let committed = root.join(format!("tests/sqlx/src/fixtures/{token}_values.rs")); - let g = fs::read(&generated).expect("generated values.rs"); - let c = fs::read(&committed).expect("committed values.rs"); - assert_eq!( - g, c, - "{token}_values.rs: Rust generator output differs from the committed file" - ); - } -} - #[test] fn rust_generator_matches_int4_golden_files() { let root = repo_root(); @@ -61,20 +44,20 @@ fn rust_generator_matches_int4_golden_files() { } let name = path.file_name().unwrap().to_str().unwrap(); let reference = fs::read_to_string(&path).unwrap(); - // Strip the leading `-- REFERENCE:` provenance line. What remains is the - // generated body, which already starts with the template-owned - // `-- AUTOMATICALLY GENERATED FILE.` marker — the same first line the - // materialised file carries, so no header is re-added here. + // Strip the leading `-- REFERENCE:` provenance line(s), preserving the + // remaining bytes verbatim (`split_inclusive` keeps the `\n` + // terminators). What remains is the generated body, which already starts + // with the template-owned `-- AUTOMATICALLY GENERATED FILE.` marker — the + // same first line the materialised file carries — so the comparison is + // byte-for-byte with no header re-added. let expected: String = reference - .lines() + .split_inclusive('\n') .skip_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) - .map(|l| format!("{l}\n")) .collect(); let actual = fs::read_to_string(gen_dir.join(name)).unwrap(); assert_eq!( - eql_codegen::context::normalize_sql(&actual), - eql_codegen::context::normalize_sql(&expected), - "{name}: materialised output differs from golden (normalized)" + actual, expected, + "{name}: materialised output differs from golden" ); } } diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 91cfae3dd..f606a07b3 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -263,7 +263,10 @@ impl Fixture { /// The integer value for this fixture (`Min`/`Max` -> kind bounds, `Zero` -> /// 0, `Int(n)` -> n), or `None` for the string-backed kinds. Does not /// range-check; `every_fixture_value_is_within_kind_bounds` guards the bounds. - pub fn numeric_value(self, kind: ScalarKind) -> Option { + /// + /// `const fn` so the `int_values!` materialiser can resolve a whole fixture + /// list into a typed `&'static` array at compile time. + pub const fn numeric_value(self, kind: ScalarKind) -> Option { match self { Fixture::Min => Some(kind.min_value()), Fixture::Max => Some(kind.max_value()), @@ -386,6 +389,43 @@ const INT2: ScalarSpec = ScalarSpec { /// drives generation order). New types are appended as their SQL surface lands. pub const CATALOG: &[ScalarSpec] = &[INT4, INT2]; +/// Materialise an integer scalar's fixtures into a typed `&'static` slice at +/// compile time. This is the **single-sourced** plaintext list the SQLx test +/// matrix reads as `ScalarType::FIXTURE_VALUES` and the fixture generator +/// encrypts — derived from the same `CATALOG` row that drives SQL generation, +/// so the oracle cannot drift from the fixture. (It replaces the old generated, +/// committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no +/// longer needs to round-trip through generated Rust.) +/// +/// Integer kinds only: a non-numeric fixture (`Text`/`Numeric`/`Jsonb`) is a +/// const-eval error, mirroring `numeric_value`'s `None`. +macro_rules! int_values { + ($name:ident, $ty:ty, $spec:expr) => { + #[doc = concat!("Distinct plaintext fixture values for `", stringify!($spec), "`, ")] + #[doc = "materialised from its `CATALOG` row (see `int_values!`)."] + pub const $name: &[$ty] = { + const SPEC: ScalarSpec = $spec; + const N: usize = SPEC.fixtures.len(); + const ARR: [$ty; N] = { + let mut out = [0 as $ty; N]; + let mut i = 0; + while i < N { + out[i] = match SPEC.fixtures[i].numeric_value(SPEC.kind) { + Some(v) => v as $ty, + None => panic!("integer scalar fixture must resolve to a number"), + }; + i += 1; + } + out + }; + &ARR + }; + }; +} + +int_values!(INT4_VALUES, i32, INT4); +int_values!(INT2_VALUES, i16, INT2); + #[cfg(test)] mod rust_tests { use super::*; @@ -804,6 +844,80 @@ mod catalog_tests { } } +#[cfg(test)] +mod values_tests { + use super::*; + + // The exact typed lists the SQLx matrix consumes. These pin the values the + // deleted golden `int4_values.rs` / committed `_values.rs` used to pin: + // a catalog edit that changes a fixture must update these assertions. + #[test] + fn int4_values_materialise_to_typed_array() { + assert_eq!( + INT4_VALUES, + &[ + i32::MIN, + -100, + -1, + 0, + 1, + 2, + 5, + 10, + 17, + 25, + 42, + 50, + 100, + 250, + 1000, + 9999, + i32::MAX + ] + ); + } + + #[test] + fn int2_values_materialise_to_typed_array() { + assert_eq!( + INT2_VALUES, + &[ + i16::MIN, + -30000, + -100, + -1, + 0, + 1, + 2, + 5, + 10, + 17, + 25, + 42, + 50, + 100, + 250, + 1000, + 9999, + 30000, + i16::MAX + ] + ); + } + + #[test] + fn materialised_values_track_their_fixture_lists() { + // One value per fixture, in catalog order; sentinels resolve to extremes. + assert_eq!(INT4_VALUES.len(), INT4_FIXTURES.len()); + assert_eq!(INT2_VALUES.len(), INT2_FIXTURES.len()); + assert_eq!(INT4_VALUES.first(), Some(&i32::MIN)); + assert_eq!(INT4_VALUES.last(), Some(&i32::MAX)); + assert_eq!(INT2_VALUES.first(), Some(&i16::MIN)); + assert_eq!(INT2_VALUES.last(), Some(&i16::MAX)); + assert!(INT4_VALUES.contains(&0) && INT2_VALUES.contains(&0)); + } +} + #[cfg(test)] mod invariant_tests { use super::*; diff --git a/docs/reference/encrypted-domain-implementation-spec.md b/docs/reference/encrypted-domain-implementation-spec.md index 838f870cc..cf1a4b19b 100644 --- a/docs/reference/encrypted-domain-implementation-spec.md +++ b/docs/reference/encrypted-domain-implementation-spec.md @@ -69,6 +69,13 @@ future migration. and no Python: the catalog is the source of truth, validated by the compiler (an undefined `Term` or unknown `ScalarKind` is a compile error) plus catalog `#[test]`s over `CATALOG`. +- [ ] Materialise the type's plaintext fixture list as a typed const next to + `CATALOG`: add `int_values!(_VALUES, , );` (e.g. + `int_values!(INT8_VALUES, i64, INT8);`). The macro resolves the row's + `Fixture` list into a compile-time `&'static []` — the single source the + SQLx matrix reads as `FIXTURE_VALUES`. Pin the exact list with a + `values_tests` assertion. This replaces the old generated, committed + `_values.rs`. - [ ] **If `` needs a new scalar width**, add a `ScalarKind` enum variant in `crates/eql-scalars/src/lib.rs` with its rust-type name, `MIN`/`MAX`/zero symbols, and numeric bounds, and unit-test its `impl` methods. New term @@ -76,10 +83,11 @@ future migration. — not in free-form catalog data. - [ ] Run `cargo run -p eql-codegen` to materialise the generated SQL (`src/encrypted_domain//_{types,functions,operators,aggregates}.sql`, - gitignored) and the committed `tests/sqlx/src/fixtures/_values.rs` - const, or just `mise run build` — every build runs the generator first. - Commit the regenerated `_values.rs` (CI diffs it). There is no per-type - codegen task: one run generates every type from `CATALOG`. + gitignored), or just `mise run build` — every build runs the generator + first. There is no per-type codegen task: one run generates every type from + `CATALOG`. The plaintext fixture list is **not** generated — it is + materialised from the catalog row at compile time (see the next step), so + there is nothing to regenerate-and-commit on the test side. - [ ] Generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` are gitignored and never committed. The catalog (`eql-scalars::CATALOG`) plus the `eql-codegen` renderers are the source @@ -89,12 +97,11 @@ future migration. `-- REQUIRE:` edges. This file IS committed. - [ ] Do **not** add a `tests/codegen/reference//` baseline. `int4` is the single golden master for the type-generic generator: the SQL templates are - pure token substitution and the only type-specific rendering is - `_values.rs`, so a per-type baseline can only fail when `int4`'s already - would. Drift protection for the new type comes from the `int4` reference, - the committed `_values.rs` const guarded by the CI staleness check - (`cargo run -p eql-codegen` + `git diff --exit-code`) and the catalog/ - generator `#[test]`s (`cargo test -p eql-scalars -p eql-codegen`), and the + pure token substitution, so a per-type baseline can only fail when `int4`'s + already would. Drift protection for the new type comes from the `int4` + reference, the catalog `values_tests` pinning the materialised + `eql_scalars::_VALUES` const, the catalog/generator `#[test]`s + (`cargo test -p eql-scalars -p eql-codegen`), and the `ordered_numeric_matrix!` SQLx suite (behaviour, not bytes). - [ ] Wire the SQLx matrix oracle. The generated SQL is enough to install the domains, but the `ordered_numeric_matrix!` suite only runs once the Rust @@ -105,10 +112,10 @@ future migration. | File | Add | |------|-----| | `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for the scalar's Rust type: `impl Sealed for {}`, a `PlaintextSqlType` const for its base column type, `impl EqlPlaintext for ` (`CAST`, `PLAINTEXT_SQL_TYPE`, `to_plaintext` → the right `Plaintext` variant), plus the two `#[test]` casts. | - | `tests/sqlx/src/fixtures/eql_v2_.rs` | `crate::scalar_fixture!("eql_v2_", , VALUES);` (pulls `super::_values::VALUES`). | - | `tests/sqlx/src/fixtures/mod.rs` | `pub mod _values;` and `pub mod eql_v2_;`. | + | `tests/sqlx/src/fixtures/eql_v2_.rs` | `use eql_scalars::_VALUES as VALUES;` then `crate::scalar_fixture!("eql_v2_", , VALUES);`. | + | `tests/sqlx/src/fixtures/mod.rs` | `pub mod eql_v2_;`. | | `tests/sqlx/tests/generate_all_fixtures.rs` | An arm in `generate_for_token`: `"" => fixtures::eql_v2_::spec().run().await,`. The match is exhaustive over the catalog — a catalog token with no arm fails the generator loudly. | - | `tests/sqlx/src/scalar_domains.rs` | `impl ScalarType for ` — `PG_TYPE` (the base PG type, e.g. `"int8"`) and `FIXTURE_VALUES = crate::fixtures::_values::VALUES`. | + | `tests/sqlx/src/scalar_domains.rs` | `impl ScalarType for ` — `PG_TYPE` (the base PG type, e.g. `"int8"`) and `FIXTURE_VALUES = eql_scalars::_VALUES`. | | `tests/sqlx/tests/encrypted_domain/scalars/.rs` | `ordered_numeric_matrix! { suite = , scalar = , eql_type = "eql_v2_" }`. | | `tests/sqlx/tests/encrypted_domain/scalars/mod.rs` | `pub mod ;`. | @@ -347,7 +354,8 @@ absent. ### Single-sourcing the value list The plaintext value list is declared **once**, in the catalog row's `fixtures` -field, and generated into Rust — never hand-maintained in two places: +field, and materialised into a typed Rust const — never hand-maintained in two +places: ```rust fixtures: &[Fixture::Min, Fixture::N(-100), Fixture::N(-1), Fixture::Zero, @@ -365,24 +373,21 @@ explicit invariant `every_fixture_value_is_within_kind_bounds`). The same test enforces the matrix invariant: the set **must** include `Min`, `Max`, and zero, or the test fails (the compile-time analogue of the old `load_spec` validation). -`eql-codegen` emits `tests/sqlx/src/fixtures/_values.rs` exposing one -`pub const VALUES: &[]`. Both consumers reference that single -symbol — the fixture generator (`fixtures::eql_v2_::spec`) and the matrix -oracle (`impl ScalarType for { const FIXTURE_VALUES }`) — so the oracle -cannot drift from the values the generator encrypts. - -Unlike the gitignored `*_*.sql` surface and the gitignored encrypted -`tests/sqlx/fixtures/eql_v2_.sql` (whose ciphertext is non-deterministic -per-encrypt), `_values.rs` **is committed**: its rendering is deterministic, -so the CI `codegen` job regenerates it (`cargo run -p eql-codegen`) and runs -`git diff --exit-code` to catch a catalog edit that wasn't regenerated. -Regenerate with `cargo run -p eql-codegen` (or `mise run build`) and commit the -result; never hand-edit it. +The `int_values!` macro (in `crates/eql-scalars/src/lib.rs`) materialises that +`Fixture` list into a `pub const _VALUES: &[]` at compile +time, sitting next to `CATALOG`. Both consumers reference that single symbol — +the fixture generator (`fixtures::eql_v2_::spec`) and the matrix oracle +(`impl ScalarType for { const FIXTURE_VALUES = eql_scalars::_VALUES }`) +— so the oracle cannot drift from the values the generator encrypts. There is no +generated `_values.rs`: a Rust source of truth does not round-trip through +generated Rust. The exact list is pinned by a `values_tests` assertion, and the +`Fixture`-list invariants (`Min`/`Max`/zero present, in-bounds) by the catalog +`#[test]`s. ## 10. Build And Verification -- `cargo run -p eql-codegen` (optional; refreshes all generated SQL + - `_values.rs` from the catalog before a full build) +- `cargo run -p eql-codegen` (optional; refreshes all generated SQL from the + catalog before a full build) - `mise run test:codegen` (`cargo test -p eql-scalars -p eql-codegen`) - `mise run clean && mise run build` (regenerates every type's SQL from the catalog first, then builds the release artefacts) diff --git a/tasks/build.sh b/tasks/build.sh index 621b0b726..311dfbc75 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -26,9 +26,10 @@ find src/encrypted_domain -mindepth 2 -type f \ -delete 2>/dev/null || true # Regenerate every type — the catalog (eql-scalars::CATALOG) is the single -# source of truth for the enumeration; eql-codegen renders all SQL and all -# tests/sqlx/src/fixtures/_values.rs in one deterministic run. The orphan -# sweep above still handles the catalog-removed case the generator cannot. +# source of truth for the enumeration; eql-codegen renders all SQL in one +# deterministic run. The plaintext fixture lists are not generated — the SQLx +# tests read them straight from the catalog (eql_scalars::INT4_VALUES / …). The +# orphan sweep above still handles the catalog-removed case the generator cannot. cargo run -p eql-codegen # Fail loudly if any file referenced in a tsorted dep list doesn't exist. diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh index 1f8d1e10d..2de923bef 100755 --- a/tasks/codegen-parity.sh +++ b/tasks/codegen-parity.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#MISE description="Parity gate: Rust eql-codegen output matches the int4 golden (normalized) and committed values.rs" +#MISE description="Parity gate: Rust eql-codegen output matches the int4 golden (byte-for-byte)" set -euo pipefail @@ -9,25 +9,31 @@ cd "$REPO_ROOT" echo "==> Generating with the Rust generator (writes the real repo tree)" cargo run -q -p eql-codegen -- > /dev/null -echo "==> Diffing Rust int4 SQL vs golden reference (line-normalized)" -norm() { sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep -v '^$'; } +echo "==> Comparing int4 generated SQL file SET vs golden (catches extra/dropped files)" +# The content loop below is golden-driven: it verifies every golden file has a +# matching generated body, so a DROPPED file fails there. It cannot see an EXTRA +# generated file (a new template output, or the new half of a rename) — that name +# is never iterated. Assert the sets are equal first to close that blind spot. +# "Generated" excludes any committed, hand-written SQL (e.g. int4_extensions.sql), +# which lives in this dir but has no golden counterpart; git-tracked == hand-written. +golden_set=$(cd tests/codegen/reference/int4 && ls *.sql | LC_ALL=C sort) +gen_set=$(cd src/encrypted_domain/int4 \ + && comm -23 <(ls *.sql | LC_ALL=C sort) \ + <(git ls-files . | sed 's#.*/##' | LC_ALL=C sort)) +if [ "$golden_set" != "$gen_set" ]; then + echo "int4 generated SQL file set differs from golden (< golden, > generated):" >&2 + diff <(echo "$golden_set") <(echo "$gen_set") >&2 || true + exit 1 +fi + +echo "==> Diffing Rust int4 SQL vs golden reference (byte-for-byte)" for f in tests/codegen/reference/int4/*.sql; do name="$(basename "$f")" - # Reference: drop the 1-line `-- REFERENCE:` provenance line. What remains — - # and the whole generated file — both start with the template-owned - # `-- AUTOMATICALLY GENERATED FILE.` marker, so no header strip is needed. - diff <(tail -n +2 "$f" | norm) \ - <(norm < "src/encrypted_domain/int4/$name") + # Drop the 1-line `-- REFERENCE:` provenance line, then compare the remaining + # bytes EXACTLY. Both the reference body (from line 2) and the whole generated + # file start with the template-owned `-- AUTOMATICALLY GENERATED FILE.` marker, + # so no header strip is needed — any whitespace or blank-line drift fails here. + diff <(tail -n +2 "$f") "src/encrypted_domain/int4/$name" done -echo "==> Verifying committed _values.rs are byte-identical (git clean)" -# `git diff` only catches modifications to tracked files; a newly-generated but -# uncommitted _values.rs would slip through. `git status --porcelain` also -# reports untracked files, mirroring the CI codegen job. -if [ -n "$(git status --porcelain -- tests/sqlx/src/fixtures/)" ]; then - echo "values.rs stale or uncommitted after regeneration" >&2 - git status --porcelain -- tests/sqlx/src/fixtures/ >&2 - exit 1 -fi - -echo "PARITY OK: Rust generator matches the int4 golden (normalized) and committed values.rs." +echo "PARITY OK: Rust generator matches the int4 golden (byte-for-byte)." diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index 58f01cc17..8a91bf681 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -1,13 +1,21 @@ # Codegen reference -The SQL files under `int4/` are the original, hand-written reference implementation for the encrypted-domain scalar generator. `int4` is the **single golden master**: the generator in `tasks/codegen/` is type-generic — its SQL templates are pure token substitution, and the only type-specific rendering is the `_values.rs` const — so one anchored type detects all template/term drift for every current and future scalar. +The SQL files under `int4/` are the hand-written golden reference for the encrypted-domain scalar generator. `int4` is the **single golden master**: the generator in `crates/eql-codegen` is type-generic — its SQL templates are pure token substitution driven by the `eql-scalars::CATALOG` rows — so one anchored type detects all template/term drift for every current and future scalar. -`tasks/codegen/test_against_reference.py` renders the generator's output for `int4` and asserts it matches these files byte-for-byte. If the generator diverges, either it regressed (fix `tasks/codegen/`) or the reference is being updated deliberately (commit the new `int4` reference in the same PR). +Each reference file's first line is a `-- REFERENCE:` provenance marker; everything after it is the generated body verbatim, starting with the template-owned `-- AUTOMATICALLY GENERATED FILE.` header. + +The parity gate renders the generator's output for `int4` and asserts it matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same reference: + +- `crates/eql-codegen/tests/parity.rs` — runs `generate_all` into a temp dir and byte-compares the materialised `int4` SQL surface; +- the in-crate golden tests in `crates/eql-codegen/src/generate.rs` — byte-compare each `render_*_file` output against the corresponding reference; +- `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate, a plain `diff` of `tail -n +2 ` against the regenerated tree. + +If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (commit the new `int4` reference in the same PR). Whitespace and blank-line drift now fail the gate — there is no normalization. ## New scalar types do not add a reference Adding a scalar type (`int2`, `int8`, …) does **not** add a `tests/codegen/reference//` directory. A per-type baseline would be redundant: the SQL is byte-identical to `int4` modulo the type token, so it can only fail when `int4`'s baseline already would. New types are guaranteed three other ways: -- the `int4` reference here anchors the shared generator (templates + `terms.py`); -- the committed `tests/sqlx/src/fixtures/_values.rs` const is pinned by the CI staleness guard (`git diff --exit-code` after `mise run codegen:domain `) and by the `` cases in `tasks/codegen/test_scalars.py` (the only type-specific rendering, `i16::MIN` vs `i32::MIN`); +- the `int4` reference here anchors the shared generator (templates + the `Term` enum's capability `impl`s in `crates/eql-scalars`); +- the per-type plaintext fixture list (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, materialised from each `CATALOG` row) is pinned by `eql-scalars`'s own `values_tests` — there is no generated `_values.rs` to diff; - the SQLx `ordered_numeric_matrix!` suite exercises the generated SQL's *behaviour* against a real database — a far stronger guarantee than a byte comparison. diff --git a/tests/codegen/reference/int4/int4_eq_functions.sql b/tests/codegen/reference/int4/int4_eq_functions.sql index 21fddfd57..1b2445777 100644 --- a/tests/codegen/reference/int4/int4_eq_functions.sql +++ b/tests/codegen/reference/int4/int4_eq_functions.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql diff --git a/tests/codegen/reference/int4/int4_eq_operators.sql b/tests/codegen/reference/int4/int4_eq_operators.sql index fa0d44cd5..a2190e16e 100644 --- a/tests/codegen/reference/int4/int4_eq_operators.sql +++ b/tests/codegen/reference/int4/int4_eq_operators.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql diff --git a/tests/codegen/reference/int4/int4_functions.sql b/tests/codegen/reference/int4/int4_functions.sql index 36c9df70b..6dae83885 100644 --- a/tests/codegen/reference/int4/int4_functions.sql +++ b/tests/codegen/reference/int4/int4_functions.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql diff --git a/tests/codegen/reference/int4/int4_operators.sql b/tests/codegen/reference/int4/int4_operators.sql index def25237e..e461c3b72 100644 --- a/tests/codegen/reference/int4/int4_operators.sql +++ b/tests/codegen/reference/int4/int4_operators.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql diff --git a/tests/codegen/reference/int4/int4_ord_aggregates.sql b/tests/codegen/reference/int4/int4_ord_aggregates.sql index 7efdf1779..08cdc10d4 100644 --- a/tests/codegen/reference/int4/int4_ord_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_aggregates.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql diff --git a/tests/codegen/reference/int4/int4_ord_functions.sql b/tests/codegen/reference/int4/int4_ord_functions.sql index b4dda68de..2c0ee56bf 100644 --- a/tests/codegen/reference/int4/int4_ord_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_functions.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql diff --git a/tests/codegen/reference/int4/int4_ord_operators.sql b/tests/codegen/reference/int4/int4_ord_operators.sql index 697f162ef..a5321c628 100644 --- a/tests/codegen/reference/int4/int4_ord_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_operators.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql diff --git a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql index 5b160ed7e..de5b0848b 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql diff --git a/tests/codegen/reference/int4/int4_ord_ore_functions.sql b/tests/codegen/reference/int4/int4_ord_ore_functions.sql index 327bc18c4..75f09fb9f 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_functions.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema.sql -- REQUIRE: src/schema-v3.sql diff --git a/tests/codegen/reference/int4/int4_ord_ore_operators.sql b/tests/codegen/reference/int4/int4_ord_ore_operators.sql index 47549cdbb..52f363cf8 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_operators.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql -- REQUIRE: src/encrypted_domain/int4/int4_types.sql diff --git a/tests/codegen/reference/int4/int4_types.sql b/tests/codegen/reference/int4/int4_types.sql index bb708a617..ba4d9d895 100644 --- a/tests/codegen/reference/int4/int4_types.sql +++ b/tests/codegen/reference/int4/int4_types.sql @@ -1,4 +1,4 @@ --- REFERENCE: hand-written parity baseline for tasks/codegen/ — see ../README.md +-- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/schema-v3.sql diff --git a/tests/codegen/reference/int4/int4_values.rs b/tests/codegen/reference/int4/int4_values.rs deleted file mode 100644 index 77a69ad03..000000000 --- a/tests/codegen/reference/int4/int4_values.rs +++ /dev/null @@ -1,28 +0,0 @@ -// REFERENCE: hand-reviewed parity baseline for tasks/codegen/ — see ../README.md -//! Fixture plaintext values for the int4 encrypted-domain family. -//! -//! Generated from the `int4` row in `eql-scalars::CATALOG` (`fixtures`) — -//! the single source of truth shared by the fixture generator -//! (`fixtures::eql_v2_int4`) and the matrix oracle -//! (`ScalarType::FIXTURE_VALUES`). - -/// Distinct plaintext values present in the `eql_v2_int4` fixture. -pub const VALUES: &[i32] = &[ - i32::MIN, - -100, - -1, - 0, - 1, - 2, - 5, - 10, - 17, - 25, - 42, - 50, - 100, - 250, - 1000, - 9999, - i32::MAX, -]; diff --git a/tests/sqlx/src/fixtures/eql_v2_int2.rs b/tests/sqlx/src/fixtures/eql_v2_int2.rs index 0848f85e3..661e44759 100644 --- a/tests/sqlx/src/fixtures/eql_v2_int2.rs +++ b/tests/sqlx/src/fixtures/eql_v2_int2.rs @@ -7,6 +7,6 @@ //! no EQL dependency; the `eql_v3.int2` domain is layered on top by casting //! `payload` per query. -use super::int2_values::VALUES; +use eql_scalars::INT2_VALUES as VALUES; crate::scalar_fixture!("eql_v2_int2", i16, VALUES); diff --git a/tests/sqlx/src/fixtures/eql_v2_int4.rs b/tests/sqlx/src/fixtures/eql_v2_int4.rs index fd28b15b7..facb69c45 100644 --- a/tests/sqlx/src/fixtures/eql_v2_int4.rs +++ b/tests/sqlx/src/fixtures/eql_v2_int4.rs @@ -6,6 +6,6 @@ //! no EQL dependency; #225 layers the `eql_v3.int4` domain on top by casting //! `payload` per query. -use super::int4_values::VALUES; +use eql_scalars::INT4_VALUES as VALUES; crate::scalar_fixture!("eql_v2_int4", i32, VALUES); diff --git a/tests/sqlx/src/fixtures/int2_values.rs b/tests/sqlx/src/fixtures/int2_values.rs deleted file mode 100644 index a1c0a8477..000000000 --- a/tests/sqlx/src/fixtures/int2_values.rs +++ /dev/null @@ -1,30 +0,0 @@ -// AUTOMATICALLY GENERATED FILE. -//! Fixture plaintext values for the int2 encrypted-domain family. -//! -//! Generated from the `int2` row in `eql-scalars::CATALOG` (`fixtures`) — -//! the single source of truth shared by the fixture generator -//! (`fixtures::eql_v2_int2`) and the matrix oracle -//! (`ScalarType::FIXTURE_VALUES`). - -/// Distinct plaintext values present in the `eql_v2_int2` fixture. -pub const VALUES: &[i16] = &[ - i16::MIN, - -30000, - -100, - -1, - 0, - 1, - 2, - 5, - 10, - 17, - 25, - 42, - 50, - 100, - 250, - 1000, - 9999, - 30000, - i16::MAX, -]; diff --git a/tests/sqlx/src/fixtures/int4_values.rs b/tests/sqlx/src/fixtures/int4_values.rs deleted file mode 100644 index d0c31a63a..000000000 --- a/tests/sqlx/src/fixtures/int4_values.rs +++ /dev/null @@ -1,28 +0,0 @@ -// AUTOMATICALLY GENERATED FILE. -//! Fixture plaintext values for the int4 encrypted-domain family. -//! -//! Generated from the `int4` row in `eql-scalars::CATALOG` (`fixtures`) — -//! the single source of truth shared by the fixture generator -//! (`fixtures::eql_v2_int4`) and the matrix oracle -//! (`ScalarType::FIXTURE_VALUES`). - -/// Distinct plaintext values present in the `eql_v2_int4` fixture. -pub const VALUES: &[i32] = &[ - i32::MIN, - -100, - -1, - 0, - 1, - 2, - 5, - 10, - 17, - 25, - 42, - 50, - 100, - 250, - 1000, - 9999, - i32::MAX, -]; diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index f616f5568..9a78189e7 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -26,14 +26,9 @@ pub mod cipherstash; pub mod driver; -/// Generated from the `int4` row in `eql-scalars::CATALOG` (`fixtures`). -/// Committed and verified by CI; never hand-edit (regenerated by `eql-codegen`). -pub mod int4_values; - +/// Scalar fixtures read their plaintext value lists directly from the catalog +/// (`eql_scalars::INT4_VALUES` / `INT2_VALUES`) — see `scalar_fixture!`. There +/// is no generated `_values.rs` module any more. pub mod eql_v2_int4; -/// Generated from the `int2` row in `eql-scalars::CATALOG` (`fixtures`). -/// Committed and verified by CI; never hand-edit (regenerated by `eql-codegen`). -pub mod int2_values; - pub mod eql_v2_int2; diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 2394b0495..1232b8b29 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -16,7 +16,7 @@ /// - `$name` — the fixture name (`"eql_v2_int2"`), drives every derived path. /// - `$ty` — the Rust plaintext type (`i16`); `<$ty>::MIN`/`MAX` supply the /// signed-extreme assertions. -/// - `$values` — the generated value const (`int2_values::VALUES`). +/// - `$values` — the catalog-materialised value const (`eql_scalars::INT2_VALUES`). /// /// Indexes are fixed to `Unique` (HMAC, drives `=` / `<>`) and `Ore` (ORE /// block terms, drives `<` `<=` `>` `>=`) with a committed `jsonb` payload — diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index c3acc4284..39f5c079b 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -74,20 +74,20 @@ pub trait ScalarType: impl ScalarType for i32 { const PG_TYPE: &'static str = "int4"; - /// Single-sourced from `tasks/codegen/types/int4.toml` `[fixture] values` - /// via the generated `fixtures::int4_values::VALUES` const — the same list - /// the fixture generator encrypts, so the oracle cannot drift from the - /// fixture. Spans the negative boundary, the i32 signed extremes, and zero. - const FIXTURE_VALUES: &'static [i32] = crate::fixtures::int4_values::VALUES; + /// Single-sourced from the `int4` row in `eql-scalars::CATALOG` + /// (`eql_scalars::INT4_VALUES`, materialised from its `Fixture` list) — the + /// same list the fixture generator encrypts, so the oracle cannot drift from + /// the fixture. Spans the negative boundary, the i32 signed extremes, and zero. + const FIXTURE_VALUES: &'static [i32] = eql_scalars::INT4_VALUES; } impl ScalarType for i16 { const PG_TYPE: &'static str = "int2"; - /// Single-sourced from `tasks/codegen/types/int2.toml` `[fixture] values` - /// via the generated `fixtures::int2_values::VALUES` const — the same list - /// the fixture generator encrypts, so the oracle cannot drift from the - /// fixture. Spans the negative boundary, the i16 signed extremes, and zero. - const FIXTURE_VALUES: &'static [i16] = crate::fixtures::int2_values::VALUES; + /// Single-sourced from the `int2` row in `eql-scalars::CATALOG` + /// (`eql_scalars::INT2_VALUES`, materialised from its `Fixture` list) — the + /// same list the fixture generator encrypts, so the oracle cannot drift from + /// the fixture. Spans the negative boundary, the i16 signed extremes, and zero. + const FIXTURE_VALUES: &'static [i16] = eql_scalars::INT2_VALUES; } /// Per-domain capability + payload shape. Storage carries no terms, `Eq` From d800944def0abb4053ae3a78a6c39dae49c027b4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 10:06:50 +1000 Subject: [PATCH 056/599] docs(codegen): align generator docs with Rust eql-codegen cutover Rewrite encrypted-domain-generator.md and the int4 golden-reference README to describe the Rust eql-codegen toolchain, replacing stale references to the retired Python codegen (TOML manifests, terms.py/templates.py, the test_against_reference.py byte-oracle, the codegen:domain tasks, and committed _values.rs fixtures). Source of truth is now the eql-scalars CATALOG; SQL is rendered via minijinja templates; parity is the byte-for-byte int4 golden gate (file-set guard + diff) in codegen-parity.sh, with no values.rs check. Also fix the codegen:parity mise task description, which still said "(normalized) + committed values.rs". --- docs/reference/encrypted-domain-generator.md | 702 ++++++++++--------- mise.toml | 2 +- tests/codegen/reference/README.md | 22 +- 3 files changed, 403 insertions(+), 323 deletions(-) diff --git a/docs/reference/encrypted-domain-generator.md b/docs/reference/encrypted-domain-generator.md index 9b2d6a076..770cbeaf6 100644 --- a/docs/reference/encrypted-domain-generator.md +++ b/docs/reference/encrypted-domain-generator.md @@ -1,14 +1,22 @@ # Encrypted-Domain Code Generator -How `tasks/codegen/` turns a TOML manifest into the SQL surface for a -scalar encrypted-domain type. This document describes the generator -itself — its inputs, stages, outputs, and the invariants it enforces. -The contract those outputs must satisfy is in +How the Rust `eql-codegen` crate turns the `eql-scalars` catalog into the +SQL surface for a scalar encrypted-domain type. This document describes +the generator itself — its inputs, stages, outputs, and the invariants it +enforces. The contract those outputs must satisfy is in [`encrypted-domain-implementation-spec.md`](./encrypted-domain-implementation-spec.md); this file describes the machine that produces them. -The reference type is `eql_v3.int4` (PR #239). `text` and `jsonb` are -outside scope. +The reference type is `eql_v3.int4`. `text` and `jsonb` are outside scope. + +The generator is **Rust, not Python**. There is no TOML manifest, no +`tasks/codegen/` package, no `terms.py`/`templates.py`/`spec.py`. The +source of truth is the `CATALOG` const in +[`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs); +the renderers live in [`crates/eql-codegen/`](../../crates/eql-codegen/). +Adding a scalar type is adding a `ScalarSpec` row to `CATALOG`, validated +by the compiler plus catalog `#[test]`s — never an edit to free-form +manifest data. ## 1. Why a generator @@ -16,198 +24,230 @@ A single scalar encrypted-domain type emits several hundred SQL declarations across eleven files: four domains, three extractors, dozens of comparison wrappers and blockers, 176 `CREATE OPERATOR` statements (44 per domain), and MIN/MAX aggregates for every ordered domain. The shape -is mechanical and -the invariants are unforgiving — a `STRICT` blocker silently bypasses -its exception, a pinned `search_path` disables inlining and reverts -queries to seq scans. The generator exists so each new scalar type adds -one TOML file rather than ninety hand-written declarations that must -agree with each other and with `pin_search_path.sql`, +is mechanical and the invariants are unforgiving — a `STRICT` blocker +silently bypasses its exception, a pinned `search_path` disables inlining +and reverts queries to seq scans. The generator exists so each new scalar +type adds one `CATALOG` row rather than ninety hand-written declarations +that must agree with each other and with `pin_search_path.sql`, `tasks/test/splinter.sh`, and `src/encrypted_domain/functions.sql`. ## 2. Pipeline -`tasks/codegen/` is a small Python package. Entry point: -`python -m tasks.codegen.generate `, wrapped by -`mise run codegen:domain ` (`tasks/codegen/domain.sh:10`). -`tasks/build.sh` invokes the same entry point for every manifest at -the start of every `mise run build`, so the generated SQL is never -checked in — the TOML manifest is the source of truth. - -Stages, in order: - -1. **Load manifest** — `spec.load_spec(toml_path)` reads - `tasks/codegen/types/.toml`, validates the `[domain]` table, - validates the token and every domain name as SQL identifiers - (`_SQL_IDENTIFIER`, `spec.py:12`), checks each domain name starts with the - filename token, resolves every listed term against `terms.TERM_CATALOG`, - and parses the optional `[fixture]` table (`_load_fixture_values`, - `spec.py:36`). Returns a `TypeSpec` (`tasks/codegen/spec.py:98`). -2. **Resolve terms** — for each `DomainSpec`, `terms.require_terms` - maps catalog names (`hm`, `ore`) to `Term` records carrying the - extractor name, return type, JSON envelope key, supported - operators, and the SQL `-- REQUIRE:` edges those terms imply - (`tasks/codegen/terms.py:57-88`). -3. **Render** — `generate.render_types_file`, - `generate.render_functions_file`, `generate.render_operators_file`, - and `generate.render_aggregates_file` (the last only for ordered - domains) build SQL strings via the per-construct functions in - `templates.py`; when the manifest declares a `[fixture]` table, - `templates.render_fixture_values_rs` also renders the committed Rust - value const. No template engine — plain f-strings, with the structural - shape of each declaration encoded in code (`tasks/codegen/generate.py`). -4. **Write** — `writer.write_generated_file` prefixes every SQL output with - the `AUTO-GENERATED — DO NOT EDIT` header (`templates.py:13-17`) and - refuses to overwrite any pre-existing file that lacks that marker - (`tasks/codegen/writer.py:67`). The committed Rust value const is written - by `writer.write_generated_rs` (`writer.py:78`) with its own Rust - `AUTO-GENERATED` header. `generate_type` cleans stale generated files in - the target directory before rewriting so an abandoned domain disappears on - the next regeneration (`generate.py:221`). - -There is no caching layer, no incremental mode, and no rewriting of -hand-written files. Each invocation regenerates every output for one -type from a single manifest. - -## 3. Manifest format - -```toml -[domain] -int4 = [] -int4_eq = ["hm"] -int4_ord_ore = ["ore"] -int4_ord = ["ore"] +`eql-codegen` is a small Rust crate with a binary entry point. The +generator runs as `cargo run -p eql-codegen` (no subcommand), which calls +`generate::generate_all` (`crates/eql-codegen/src/generate.rs`) over every +row of `eql_scalars::CATALOG`, writing each type's SQL into +`src/encrypted_domain//`. A second subcommand, +`cargo run -p eql-codegen -- list-types`, prints the catalog tokens one per +line (consumed by the fixture and matrix-inventory enumeration). The +binary's `main` (`crates/eql-codegen/src/main.rs`) recognises exactly these +two forms; any other argument is a usage error. + +`tasks/build.sh` runs `cargo run -p eql-codegen` at the start of every +`mise run build`, so the generated SQL is never checked in — the catalog +is the source of truth. (The build first sweeps every generated +`*_{types,functions,operators,aggregates}.sql` under `src/encrypted_domain` +so a type removed from `CATALOG` cannot leave orphans the `src/**/*.sql` +build glob would pick up; hand-written `*_extensions.sql` is preserved by +the name patterns.) + +Stages, in order (`generate_all` → `generate_type`): + +1. **Read the catalog.** `eql_scalars::CATALOG` is the in-binary source of + truth — a `&[ScalarSpec]`, each row a `token`, a `ScalarKind`, an + ordered `&[DomainSpec]`, and a `&[Fixture]` list + (`crates/eql-scalars/src/lib.rs`). There is no parse/validate stage at + generation time: the catalog is validated at compile time (an undefined + `Term` or unknown `ScalarKind` does not compile) and by the catalog + `#[test]`s, so by the time `generate_all` runs the data is already + well-formed. +2. **Resolve terms.** For each `DomainSpec`, the `Term` enum's `impl` + methods supply the extractor name, return type, JSON envelope key, + supported operators, and the SQL `-- REQUIRE:` edges those terms imply + (`Term::operators_for_terms`, `term_json_keys`, `term_requires`, + `extractor_for_operator`, `role_for_terms` — `crates/eql-scalars/src/lib.rs`). +3. **Render.** `render_types_file`, `render_functions_file`, + `render_operators_file`, and `render_aggregates_file` (the last only for + ordered domains) build the context structs in + `crates/eql-codegen/src/context.rs` and render them through embedded + **minijinja** templates (`crates/eql-codegen/templates/*.j2`, + compiled in via `include_str!` — no runtime file IO). The structural + shape of each declaration is split between the context builders (Rust) + and the templates (Jinja). +4. **Write.** `clean_generated_files` first deletes every generated `.sql` + in the target directory (recognised by the header marker) so an + abandoned domain disappears on the next regeneration; + `ensure_generated_paths_writable` then refuses to proceed if any target + path is a hand-written file lacking the marker; `write_generated_file` + writes each rendered body verbatim (`crates/eql-codegen/src/writer.rs`). + The template emits the `-- AUTOMATICALLY GENERATED FILE.` marker as its + own first line, so the writer does not prepend a header — it only uses + the marker to recognise files it owns. + +There is no caching layer and no incremental mode. Each `cargo run -p +eql-codegen` regenerates every output for every catalog type from scratch. +Regeneration is deterministic: identical catalog + renderers produce +byte-identical SQL. + +## 3. Catalog format + +A scalar type is one `ScalarSpec` row +(`crates/eql-scalars/src/lib.rs`): + +```rust +ScalarSpec { + token: "int4", + kind: ScalarKind::I32, + domains: &[ + DomainSpec { suffix: "", terms: &[] }, + DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, + DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, + DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, + ], + fixtures: INT4_FIXTURES, +} ``` -Rules enforced by `spec.load_spec`: - -- The filename stem is the **type token** (`int4` here). It must match - the CLI argument and prefix every domain name. -- The TOML must have a non-empty `[domain]` table at the top level. The - only other recognised top-level key is the optional `[fixture]` table - (see §3a). -- The filename token and every domain key must be valid lowercase SQL - identifiers (`^[a-z][a-z0-9_]*$`); anything else raises `SpecError`. -- Each domain key must equal the token or start with `_`. -- Each value must be a list of strings, and each string must be a key - in `terms.TERM_CATALOG`. Unknown terms raise `SpecError`. - -The `[domain]` table declares nothing else — no extractor names, no -operator lists, no REQUIRE edges. Every behavioural fact comes from the -term catalog. +Structural rules, enforced by the type system and the catalog `#[test]`s +rather than a runtime validator: + +- `token` supplies the **type token** (`int4` here). Each domain's full + name is `token` + `suffix`; `ScalarSpec::domain_name` makes the old + "domain name must start with the token" rule structural, and + `every_domain_name_starts_with_its_token` pins it. +- `kind` is a `ScalarKind` (`I16` / `I32` / `I64` / `Numeric` / `Text` / + `Jsonb`), which carries the Rust type name, the `MIN`/`MAX`/zero symbols, + and the numeric bounds. Only the integer kinds have an i128 range with + `Min`/`Max`/`Zero` sentinels; the bounded accessors `panic!` on the + others (a misuse guard, gated by `is_int()`). +- `domains` is a non-empty `&[DomainSpec]` (pinned by + `every_type_has_at_least_one_domain`). Each `DomainSpec` is a `suffix` + plus a `&[Term]`; the storage domain is `suffix: ""` with no terms. +- `fixtures` is a `&[Fixture]` (see §3a). + +The `DomainSpec` declares nothing else — no extractor names, no operator +lists, no REQUIRE edges. Every behavioural fact comes from the `Term` +enum. Domains may be **twinned** (`int4_ord` and `int4_ord_ore` both carry -`["ore"]`). The generator emits them as independent domains with -byte-identical SQL modulo type name. Twins exist so callers can choose -a name that documents intent ("ordered, regardless of mechanism" vs -"ordered via ORE block") without committing to one term family in a -future migration. - -Manifest order is significant. The generator iterates domains in their -declared TOML order (`generate.py:48`), and that order shows up in the -generated `_types.sql` `DO` block. - -### 3a. Optional `[fixture]` table - -```toml -[fixture] -values = ["MIN", "-1", "ZERO", "1", "MAX"] +`&[Term::Ore]`). The generator emits them as independent domains with +byte-identical SQL modulo type name (`ordered_files_byte_identical_modulo_typename`). +Twins exist so callers can choose a name that documents intent ("ordered, +regardless of mechanism" vs "ordered via ORE block") without committing to +one term family in a future migration. + +Catalog order is significant. The generator iterates `CATALOG` in order +(driving generation order), and iterates each spec's `domains` slice in +order — that order shows up in the generated `_types.sql` `DO` block. + +### 3a. The `fixtures` field + +The `fixtures` field is an ordered `&[Fixture]` — the single source of +truth for the type's plaintext fixture list, consumed by the SQLx fixture +generator and the matrix oracle. A `Fixture` is value-kind tagged: +`Min` / `Max` / `Zero` (the integer matrix pivots, resolved per-kind), +`Int(i128)` (an integer literal), and `Numeric`/`Text`/`Jsonb` string +variants. The `fixtures!` macro range-checks each `Int` literal against the +kind at compile time (`N(-40000)` for an `i16` kind does not compile): + +```rust +const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; + Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), + N(42), N(50), N(100), N(250), N(1000), N(9999), Max); ``` -A type may declare an ordered `[fixture] values` list — the single source -of truth for the committed Rust const -`tests/sqlx/src/fixtures/_values.rs`, consumed by the SQLx fixture -generator and the matrix oracle. `_load_fixture_values` (`spec.py:36`) -requires a non-empty list of string tokens; each resolves through the -scalar-kind catalog (`scalars.py`) — the sentinels `MIN` / `MAX` / `ZERO` -plus any numeric literal in the type's representable range. Validation -enforces a **distinct-plaintext contract**: duplicates are rejected against -the *resolved numeric* value, so both copy-paste token dups (`"1", "1"`) and -sentinel/literal aliases (`"MIN"` alongside the same number) raise -`SpecError` — and the set **must include MIN, MAX, and zero** (the matrix -comparison pivots). Unlike the gitignored SQL surface, `_values.rs` -**is committed** (its rendering is deterministic), and CI regenerates it and -runs `git diff --exit-code` to catch an un-regenerated manifest edit. See -implementation spec §9 for the authoring guidance. +Catalog `#[test]`s enforce a **distinct-plaintext contract** plus the +matrix-pivot requirement: `fixture_values_are_distinct_by_resolved_number` +rejects duplicates against the resolved value (so both copy-paste dups and +sentinel/literal aliases fail), `fixtures_include_min_max_and_zero` requires +`Min`, `Max`, and zero for integer kinds, and +`every_fixture_value_is_within_kind_bounds` keeps every resolved value in +range. These are the compile/test-time analogue of the old `load_spec` +validation. + +The plaintext value list is **not** rendered to a generated file. The +`int_values!` macro (next to `CATALOG`) materialises a `Fixture` list into +a typed `pub const _VALUES: &[]` at compile time +(`INT4_VALUES`, `INT2_VALUES`). Both consumers reference that single symbol +— the fixture generator and the matrix oracle's `FIXTURE_VALUES` — so the +oracle cannot drift from the values the generator encrypts. There is no +committed `_values.rs`: a Rust source of truth does not round-trip +through generated Rust. (The old generated, committed file is gone.) The +exact materialised list is pinned by the catalog's `values_tests`. ## 4. Term catalog -`tasks/codegen/terms.py:25-49` defines every term the materializer -recognises. A term is a frozen dataclass: - -```python -Term( - name="hm", # manifest key - json_key="hm", # envelope payload key - extractor="eq_term", # SQL extractor function name - returns="eql_v2.hmac_256", # extractor return type - ctor="hmac_256", # eql_v2 constructor in jsonb - role="eq", # file-header phrasing - operators=("=", "<>"), # operators this term enables - requires=("src/hmac_256/functions.sql",) # SQL REQUIRE edges -) -``` +The `Term` enum (`crates/eql-scalars/src/lib.rs`) defines every term the +materializer recognises. The `json_key`/`extractor`/`returns`/`ctor` +values are the cross-schema SQL contract — changing one is a generated-SQL +behaviour change, not a refactor. -Current catalog: +| Term | JSON key | Extractor | Returns | Operators | +| ----- | -------- | ----------- | -------------------------------- | -------------------------- | +| `Hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` `<>` | +| `Ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | -| Term | JSON key | Extractor | Returns | Operators | -| ----- | -------- | ----------- | -------------------------------- | ---------------------------------- | -| `hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` `<>` | -| `ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | +The index-term return types (`eql_v2.hmac_256`, +`eql_v2.ore_block_u64_8_256`) live in `eql_v2` and are referenced +cross-schema; the domains, extractors, and wrappers live in `eql_v3`. -Adding a term is a code change to `terms.py` with matching tests in -`test_terms.py` — never a free-form manifest field. The catalog is the -only source of operator support, extractor identity, and REQUIRE edges; -the manifest is a thin selector over it. +Adding a term is a code change to the `Term` enum's `impl` methods +(`json_key`, `extractor`, `returns`, `ctor`, `role`, `operators`, +`requires`) with matching `#[test]`s (`term_tests` / `term_helper_tests`) +— never a free-form catalog field. The `Term` enum is the only source of +operator support, extractor identity, and REQUIRE edges; a `DomainSpec` is +a thin selector over it. ## 5. The operator surface -`tasks/codegen/operator_surface.py` enumerates the surface every generated -domain declares: - -- **Supported-capable comparisons**: `=` `<>` `<` `<=` `>` `>=` `@>` `<@` -- **Path blockers**: `->` `->>` -- **Native `jsonb` fallback blockers**: `?` `?|` `?&` `@?` `@@` `#>` `#>>` `-` `#-` `||` - -Comparison and path operators keep the historical three-argument shapes: - -- Symmetric: `(domain, domain)`, `(domain, jsonb)`, `(jsonb, domain)` -- Path: `(domain, text)`, `(domain, integer)`, `(jsonb, domain)` - -Native `jsonb` fallback blockers use only the shapes PostgreSQL exposes -for `jsonb` itself, for a total of **44 `CREATE OPERATOR` statements per -domain**. Supported operators are emitted with full planner metadata -(`COMMUTATOR`, `NEGATOR`, `RESTRICT`, `JOIN` selectivity estimators) and -back onto inlinable wrappers; unsupported operators carry minimal metadata -and back onto blockers. - -Path operators always back onto blockers — neither current term -enables them. The additional native `jsonb` operators are blocker-only. -Untyped string literals are a PostgreSQL resolver edge: `? 'c'` can still -select the built-in `jsonb` operator, while `? 'c'::text` and bound text -parameters select the generated blocker. - -The union of these three lists is `KNOWN_JSONB_OPERATORS`. A live-DB -structural guard +`crates/eql-codegen/src/operator_surface.rs` enumerates the 20-operator +surface every generated domain declares (`OPERATORS`): + +- **Comparison operators**: `=` `<>` `<` `<=` `>` `>=` `@>` `<@` +- **Path-selector operators**: `->` `->>` +- **Native `jsonb` operators**: `?` `?|` `?&` `@?` `@@` `#>` `#>>` `-` `#-` `||` + +Each operator carries its PostgreSQL-shaped signatures. The comparison +operators use the three symmetric shapes — `(domain, domain)`, +`(domain, jsonb)`, `(jsonb, domain)`; the path and native operators use +only the shapes PostgreSQL exposes for `jsonb` itself. Summed across all +20 operators, that is **44 `CREATE OPERATOR` statements per domain** +(`operators_file_has_forty_four`). + +Whether an operator routes to a wrapper or a blocker is a per-domain +decision driven by the domain's terms (`Term::operators_for_terms`), not a +property of the operator. Supported operators are emitted with full planner +metadata (`COMMUTATOR`, `NEGATOR`, `RESTRICT`, `JOIN` selectivity +estimators) and back onto inlinable wrappers; unsupported operators carry +minimal metadata and back onto blockers (`operator_entry` only renders +metadata when the operator is supported on that domain). + +Path operators always back onto blockers — neither current term enables +them. The native `jsonb` operators are blocker-only. Untyped string +literals are a PostgreSQL resolver edge: `? 'c'` can still select the +built-in `jsonb` operator, while `? 'c'::text` and bound text parameters +select the generated blocker. + +A live-DB structural guard (`tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs`) -queries `pg_operator` for every operator with a `jsonb` argument and asserts -the set is a subset of this union, so a future PostgreSQL version that adds a -`jsonb` operator nobody enumerated here fails the test rather than silently -routing an encrypted column to native plaintext-`jsonb` semantics. -`test_operator_surface.py` pins the Python union; the Rust test mirrors it. +queries `pg_operator` for every operator with a `jsonb` argument and +asserts the set is a subset of the surface this module enumerates, so a +future PostgreSQL version that adds a `jsonb` operator nobody enumerated +here fails the test rather than silently routing an encrypted column to +native plaintext-`jsonb` semantics. The `operator_surface` unit tests pin +the Rust surface (20 operators, signatures, metadata); the live-DB test +mirrors it. ## 6. Generated outputs -For a manifest with `D` domains of which `A` are ordered (ord-capable), -the generator writes `1 + 2D + A` SQL files into -`src/encrypted_domain//`, plus — when the manifest carries a -`[fixture]` table — one committed Rust const at -`tests/sqlx/src/fixtures/_values.rs`. For `int4` (`D = 4`, `A = 2`): -eleven SQL files and one Rust file. The SQL outputs are gitignored — `tasks/build.sh` regenerates them at the -start of every build from each `tasks/codegen/types/.toml`, -`mise run codegen:domain ` refreshes a single type manually, and -`mise run codegen:domain:all` regenerates every type in one invocation (the -same `generate.py --all` enumeration the build uses). The manifest plus -`tasks/codegen/terms.py` are the source of truth. +For a type with `D` domains of which `A` are ordered (ord-capable), the +generator writes `1 + 2D + A` SQL files into +`src/encrypted_domain//`. For `int4` (`D = 4`, `A = 2`): eleven SQL +files. The SQL outputs are **gitignored** — +`.gitignore` excludes `src/encrypted_domain/*/*_{types,functions,operators,aggregates}.sql`, +and `tasks/build.sh` regenerates them at the start of every build. There is +**no per-type codegen task**: one `cargo run -p eql-codegen` regenerates +every catalog type in a single deterministic run. | File | Content | | --------------------------------- | ---------------------------------------------------------------------------------------- | @@ -218,29 +258,30 @@ same `generate.py --all` enumeration the build uses). The manifest plus Every file: -- Opens with the `AUTO-GENERATED — DO NOT EDIT` header - (`templates.py:13-17`). +- Opens with the `-- AUTOMATICALLY GENERATED FILE.` marker (the project-wide + marker `docs:validate` greps on to skip generated SQL — + `crates/eql-codegen/src/consts.rs`). - Declares its `-- REQUIRE:` edges in dependency order — types files - require `src/schema.sql`; function files require schema, types, and + require `src/schema-v3.sql`; function files require schema, types, and `src/encrypted_domain/functions.sql` plus each term's `requires` set; - operator files require schema, types, and their domain's function - file; aggregate files require schema, types, and their domain's - function and operator files. -- Carries Doxygen `--! @file` / `--! @brief` headers describing its - role. + operator files require `src/schema-v3.sql`, types, and their domain's + function file; aggregate files require `src/schema-v3.sql`, types, and + their domain's function and operator files. +- Carries Doxygen `--! @file` / `--! @brief` headers describing its role. ### Function-count totals per domain -| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | -| ------------ | ---------: | -------: | -------: | --------: | --------: | -| none | 0 | 0 | 44 | 44 | 44 | -| `["hm"]` | 1 | 6 | 38 | 45 | 44 | -| `["ore"]` | 1 | 18 | 26 | 45 | 44 | +| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | +| ---------------- | ---------: | -------: | -------: | --------: | --------: | +| none | 0 | 0 | 44 | 44 | 44 | +| `&[Term::Hm]` | 1 | 6 | 38 | 45 | 44 | +| `&[Term::Ore]` | 1 | 18 | 26 | 45 | 44 | -Six wrappers for `hm` = `=` and `<>` × three shapes. Eighteen for `ore` +Six wrappers for `Hm` = `=` and `<>` × three shapes. Eighteen for `Ore` = six operators × three shapes. The 44-operator total never moves; the wrapper/blocker split is what shifts, and native `jsonb` fallback -operators are always blockers. +operators are always blockers. (Pinned by `storage_functions_file_is_all_blockers`, +`eq_functions_file_counts`, `ore_functions_file_counts`.) The table above covers `_functions.sql` only. Ordered domains additionally emit `_aggregates.sql` — two state functions @@ -252,67 +293,74 @@ parallel aggregation on large `GROUP BY` ORE workloads with no decryption. ## 7. Invariants the generator enforces -The generator's job is partly to write SQL and partly to make -incorrect SQL unreachable. Invariants encoded in code: - -- **Blockers are never `STRICT`.** `render_blocker_bool`, - `render_blocker_path`, and `render_blocker_native` emit - `IMMUTABLE PARALLEL SAFE` without the - `STRICT` qualifier (`templates.py:263-345`), so a `NULL` - argument still reaches the `RAISE` and the unsupported-operator - exception fires. There is no code path that produces a strict - blocker. -- **Wrappers are inlinable SQL.** `render_wrapper` and - `render_extractor` emit `LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE` - with a single-statement `SELECT` and no `SET search_path` - (`templates.py:218-260`). `pin_search_path.sql:265-290` - catches them structurally and leaves them unpinned. -- **Aggregate state functions are the deliberate exception.** - `render_aggregate` emits `min_sfunc` / `max_sfunc` as - `LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE` *with* a pinned - `SET search_path` (`templates.py:379-452`). They are aggregate transition - functions, not index expressions, so pinning is correct; the generated - `min` / `max` aggregates are allowlisted by name in `splinter.sh`. The - aggregates are `parallel = safe` with the sfunc reused as `combinefunc`. +The generator's job is partly to write SQL and partly to make incorrect +SQL unreachable. Invariants encoded in the renderers / templates and +guarded by `#[test]`s in `crates/eql-codegen/src/generate.rs`: + +- **Blockers are never `STRICT` and always `plpgsql`.** The + unsupported-operator template emits each blocker as `IMMUTABLE PARALLEL + SAFE` / `LANGUAGE plpgsql` without `STRICT`, so a `NULL` argument still + reaches the `RAISE`. `blockers_are_never_strict_and_always_plpgsql` + asserts the storage domain (all blockers) contains no `STRICT` and as + many `LANGUAGE plpgsql` as `CREATE FUNCTION`. A `LANGUAGE sql` blocker + would be inlinable and could be elided when the result is provably + unused; `plpgsql` is opaque to the planner so the `RAISE` survives. +- **Wrappers and extractors are inlinable SQL.** They emit `LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE` with a single-statement `SELECT` and **no + `SET search_path`** (`inlinable_functions_have_no_set_search_path`). A + pinned `search_path` disables inlining. `tasks/pin_search_path.sql` + recognises these functions structurally — by language (`sql`), volatility + (`IMMUTABLE`), and a jsonb-backed `DOMAIN` argument in the `eql_v3` + schema — and leaves them unpinned, with no per-type edit. +- **Aggregate state functions are the deliberate exception.** `min_sfunc` / + `max_sfunc` are `LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE` *with* + a pinned `SET search_path` (`aggregate_state_functions_are_plpgsql_not_inlinable`). + They are aggregate transition functions, not index expressions, so + pinning is correct; the generated `min` / `max` aggregates are + allowlisted by name in `splinter.sh`. - **SQL-literal injection is structurally prevented.** Every string interpolated into a single-quoted SQL literal — payload keys, operator - symbols, domain names in `RAISE` messages — passes through `_sql_str` - (`templates.py:46`), which doubles embedded single quotes. Today's catalog - strings are all quote-free so it is a no-op, but it guarantees a future - quote-bearing catalog string cannot break out of its literal. + symbols, domain names in `RAISE` messages — passes through `sql_str` + (`crates/eql-codegen/src/consts.rs`), which doubles embedded single + quotes. Today's catalog strings are all quote-free so it is a no-op, but + it guarantees a future quote-bearing string cannot break out of its + literal (`unsupported_entry_preserves_operator_literal_and_domain_lit_is_escaped`, + `domain_block_escapes_quote_bearing_name`). - **No domain-over-domain.** Every domain is `CREATE DOMAIN eql_v3. - AS jsonb`, never `AS ` (`templates.py:72`). PostgreSQL - resolves operators against the underlying base type; a derived domain - would silently bypass the fixed operator surface. -- **No operator class on a domain.** The generator emits operators, - not operator classes. Callers index through the extractor function - (e.g. `USING btree (eql_v3.ord_term(col))`), whose return type - already carries a default opclass. -- **Ownership boundary.** `writer.is_generated` recognises owned files - by their header line and refuses to overwrite anything else - (`writer.py:20-26`, `44-53`). A hand-written file at a generated - path is a hard error, not a silent clobber. Stale generated files - for removed domains are cleaned before the new files land - (`writer.py:29-41`). + AS jsonb`, never `AS ` (`types_file_has_all_four_domains`). + PostgreSQL resolves operators against the underlying base type; a derived + domain would silently bypass the fixed operator surface. +- **No operator class on a domain.** The generator emits operators, not + operator classes. Callers index through the extractor function (e.g. + `USING btree (eql_v3.ord_term(col))`), whose return type already carries + a default opclass. +- **Ownership boundary.** `is_generated` recognises owned files by their + header marker; `ensure_generated_paths_writable` refuses to overwrite + anything else, and `clean_generated_files` deletes only files carrying + the marker (`crates/eql-codegen/src/writer.rs`). A hand-written file at a + generated path is a hard error, not a silent clobber. Stale generated + files for removed domains are cleaned before the new files land. ## 8. Extension files -`_extensions.sql` is the hand-written sibling. The generator -never creates, lists, or cleans it; it has no auto-generated header -and must declare its own `-- REQUIRE:` edges. Use it for behaviour -that's specific to the type and not part of the fixed surface — e.g. -cross-domain casts, helper functions, type-specific constraints. +`_extensions.sql` is the hand-written sibling. The generator never +creates, lists, or cleans it; it has no auto-generated header and must +declare its own `-- REQUIRE:` edges. Use it for behaviour that's specific +to the type and not part of the fixed surface — e.g. cross-domain casts, +helper functions, type-specific constraints. Unlike the generated +siblings, `_extensions.sql` IS committed. (Neither `int4` nor `int2` +ships one today — there is no committed `*_extensions.sql` in the tree.) -`pin_search_path.sql:291-302` describes the fallback marker for -inline-critical extension functions that take no domain argument and -so escape the structural skip: +`tasks/pin_search_path.sql` describes the fallback marker for +inline-critical extension functions that take no domain argument and so +escape the structural skip: ```sql COMMENT ON FUNCTION eql_v2.my_helper(...) IS 'eql-inline-critical: ...'; ``` -The generator does **not** emit this marker; every function it -produces takes a domain argument and is covered by the structural skip +The generator does **not** emit this marker; every function it produces +takes a domain argument and is covered by the structural skip intrinsically. ## 9. Lint and test integration @@ -320,90 +368,116 @@ intrinsically. The generator depends on two pieces of build tooling recognising its output without per-type edits: -- **`tasks/pin_search_path.sql:265-290`** — structural skip identifies - encrypted-domain functions by language (`sql`), volatility - (`IMMUTABLE`), and the presence of at least one argument typed as a - jsonb-backed `DOMAIN` in the `eql_v3` schema. New scalar types - need no edit here. +- **`tasks/pin_search_path.sql`** — structural skip identifies + encrypted-domain functions by language (`sql`), volatility (`IMMUTABLE`), + and the presence of at least one argument typed as a jsonb-backed + `DOMAIN` in the `eql_v3` schema. New scalar types need no edit here. - **`tasks/test/splinter.sh`** — name-based allowlist. The converged - wrapper names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, `eq_term`, - `ord_term`) are already covered by entries originally added for - `ste_vec_entry` and friends (`splinter.sh:87-104`). Splinter matches - by name only, so a new scalar type that uses the catalog extractors - inherits coverage. Adding a new term whose extractor has a new name - requires a splinter entry. + wrapper / extractor names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, + `eq_term`, `ord_term`) plus the generated `min` / `max` aggregates are + covered by `eql_v3`-schema entries. Splinter matches by name only, so a + new scalar type that uses the catalog extractors inherits coverage. + Adding a new term whose extractor has a new name requires a splinter + entry. ## 10. Tests -`mise run test:codegen` runs the generator test suite — `pytest -tasks/codegen` — with no database required: - -- `test_spec.py`, `test_terms.py`, `test_scalars.py`, - `test_operator_surface.py`, `test_templates.py`, `test_writer.py` — unit - tests per module. -- `test_generate.py` — end-to-end rendering tests asserting file - counts and structural shape. -- `test_against_reference.py` — byte-for-byte match of in-memory - `render_*_file` output against a hand-reviewed (header-stripped) - reference under `tests/codegen/reference/int4/`. Runs anywhere - without depending on materialised `src/encrypted_domain//`. The - reference fixture is the human-readable contract that survives - generator refactors. - -The codegen suite is a prerequisite of the PostgreSQL test matrix -(`tasks/test.sh`), so generated-SQL drift fails CI before any database +The generator's tests are Rust, run by `mise run test:codegen` +(`cargo test -p eql-scalars -p eql-codegen`) — no database required. The +broader `mise run test:crates` adds `cargo clippy ... -D warnings`. + +- **`eql-scalars` unit tests** — `rust_tests`, `term_tests`, + `term_helper_tests`, `fixture_tests`, `catalog_tests`, `invariant_tests`, + `values_tests` over `CATALOG`, the `Term`/`ScalarKind`/`Fixture` impls, + and the materialised `_VALUES` consts + (`crates/eql-scalars/src/lib.rs`). +- **`eql-codegen` unit tests** — file counts, language/volatility + invariants, escaping guards, and twin byte-identity + (`crates/eql-codegen/src/generate.rs` `#[cfg(test)]` module). +- **The parity gate** — `mise run codegen:parity` + (`tasks/codegen-parity.sh`). It runs `cargo run -p eql-codegen` into the + real tree, then: + 1. compares the int4 generated SQL **file set** against the golden under + `tests/codegen/reference/int4/*.sql`, excluding committed hand-written + files (`comm -23` of `ls` against `git ls-files`), so an extra or + dropped generated file fails; and + 2. diffs each golden file **byte-for-byte** against its generated + counterpart, after dropping the golden's single leading + `-- REFERENCE:` provenance line (`tail -n +2`). Both bodies start with + the `-- AUTOMATICALLY GENERATED FILE.` marker, so no header strip is + needed. + The same byte-for-byte assertion runs in-crate as + `crates/eql-codegen/tests/parity.rs` (`rust_generator_matches_int4_golden_files`) + and in the `generate.rs` golden tests. The golden reference — not any + Python oracle — is the sole contract that survives generator refactors. + +CI runs these in three jobs in `.github/workflows/test-eql.yml`: the +`test:crates` job (`Rust workspace crates`) compiles/lints/tests the +crates, the `codegen` job (`Encrypted-domain codegen`) runs `mise run +codegen:parity`, and the `matrix-coverage` job runs `mise run +test:matrix:inventory`. The codegen job is a prerequisite of the +PostgreSQL test matrix, so generated-SQL drift fails CI before any database test runs. ## 11. Adding a new scalar type -The end-to-end shape from a generator perspective: - -1. **Author** `tasks/codegen/types/.toml`. Domain names must - start with the token; term names must already exist in - `terms.TERM_CATALOG`. If `` is a new scalar kind, first register - a `ScalarKind` in `scalars.py` — `load_spec` resolves the scalar before - anything else, so an unregistered token raises - `ScalarError: unknown scalar token ''`. -2. **Regenerate**. Either run `mise run codegen:domain ` while - iterating, or just `mise run build` — the build regenerates every - manifest first. The generator cleans stale generated files, writes - new ones, and refuses any hand-written file at a generated path. - Generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` are - gitignored and never committed. -3. **Hand-write** `_extensions.sql` if the type needs SQL - beyond the fixed surface. Add `eql-inline-critical` markers only on - inline-critical helpers that take no domain argument. This file IS +From a generator perspective: + +1. **Add a `ScalarSpec` row to `eql_scalars::CATALOG`** + (`crates/eql-scalars/src/lib.rs`) — `token`, `kind`, the `domains` + slice, and the `fixtures` list. Term names must be `Term` variants and + the kind must be a `ScalarKind` variant, or it does not compile. If the + type needs a new scalar width, add a `ScalarKind` variant (with its + rust-type name, `MIN`/`MAX`/zero symbols, and bounds) and unit-test its + `impl`. New term behaviour belongs in the `Term` enum's `impl`, not in + catalog data. +2. **Materialise the value list** with `int_values!(_VALUES, , + );` next to `CATALOG`, and pin it with a `values_tests` + assertion. This is the single source the SQLx matrix reads as + `FIXTURE_VALUES`. There is nothing to regenerate-and-commit on the test + side — it is a compile-time const, not a generated file. +3. **Regenerate.** `cargo run -p eql-codegen` (or just `mise run build` — + the build runs the generator first). One run regenerates every catalog + type; there is no per-type codegen task. The generated + `*_{types,functions,operators,aggregates}.sql` are gitignored and never committed. -4. **Build picks it up automatically** — `tasks/build.sh` regenerates - before computing the `tsort` graph, so the new files appear in the - dependency walk via the `-- REQUIRE:` edges the generator emits. -5. **Test.** Do **not** add a `tests/codegen/reference//` baseline. - `int4` is the sole golden master for the type-generic generator: the SQL - templates are pure token substitution and the only type-specific rendering - is `_values.rs`, so a per-type baseline can only fail where `int4`'s - already would. Drift protection for the new type comes from the `int4` - reference (shared templates + `terms.py`), the committed `_values.rs` - const guarded by the codegen staleness check, the `` cases in - `test_scalars.py`, and the `ordered_numeric_matrix!` SQLx suite (behaviour, - not bytes). Run `mise run test:codegen`, the relevant SQLx suites, and the - PostgreSQL matrix. -6. **Snapshot the matrix inventory.** Run `mise run test:matrix:inventory` - and commit the new `tests/sqlx/snapshots/_matrix_tests.txt` — the - sorted list of the type's `scalars::::*` test names. CI's - `matrix-coverage` job `git diff --exit-code`s it (like `_values.rs`) - to catch a silently dropped or renamed matrix test. The snapshot is a - committed test baseline, not gitignored generated SQL. See - `tests/sqlx/snapshots/README.md`. - -Adding a new **term** is a bigger move — edit `terms.py`, add tests, -audit `splinter.sh` for a name collision, and update the reference -fixture under `tests/codegen/reference/`. +4. **Hand-write** `_extensions.sql` if the type needs SQL beyond the + fixed surface, with explicit `-- REQUIRE:` edges. This file IS committed. +5. **Do not add a `tests/codegen/reference//` baseline.** `int4` is + the sole golden master for the type-generic generator: the templates are + pure token substitution, so a per-type baseline can only fail where + `int4`'s already would. Drift protection for the new type comes from the + `int4` reference (shared templates + `Term` enum), the catalog + `values_tests` pinning the materialised `_VALUES`, the + catalog/generator `#[test]`s, and the `ordered_numeric_matrix!` SQLx + suite (behaviour, not bytes). +6. **Wire the SQLx matrix oracle and snapshot the inventory.** The + implementation spec §2 lists the hand-maintained registration files. + Then run `mise run test:matrix:inventory`: it normalizes each present + type's `scalars::::*` test-name set to ``, asserts it equals + the single canonical `tests/sqlx/snapshots/matrix_tests.txt`, and + cross-checks the present type set against `cargo run -p eql-codegen -- + list-types`. There is **no per-type snapshot** — the per-type + `_matrix_tests.txt` files were collapsed into one token-normalized + snapshot. You only regenerate `matrix_tests.txt` when the macro's + emitted name set itself changes. A catalog type added without its matrix + wiring fails the cross-check (catalog has the type, binary has no + `scalars::::` tests). See `tests/sqlx/snapshots/README.md` and + the implementation spec §2 / §8. + +Adding a new **term** is a bigger move — edit the `Term` enum's `impl` +methods, add `#[test]`s, audit `splinter.sh` for a name collision if the +extractor name is new, and (because it changes the int4 surface) update the +golden reference under `tests/codegen/reference/int4/`. ## 12. Out of scope -`text` and `jsonb` are not materialised through this generator. There -is no guard preventing a `text.toml` from being authored; the catalog -simply lacks the term shape those types would need. Text and JSONB -encrypted behaviour lives on the composite `eql_v2_encrypted` type and -its hand-written operator surface in `src/encrypted/` and -`src/operators/`, not the scalar materializer. +`text` and `jsonb` are not materialised through this generator. The +`ScalarKind` enum carries `Text`/`Numeric`/`Jsonb` variants and the +`Fixture` enum carries their string-backed shapes at the capability layer, +but `CATALOG` declares only the integer scalars today, so no `text`/`jsonb` +SQL surface is generated. Text and JSONB encrypted behaviour lives on the +composite `eql_v2_encrypted` type and its hand-written operator surface in +`src/encrypted/` and `src/operators/`, not the scalar materializer. +`jsonb` in particular needs a separate SQL design beyond this +ordered-scalar materializer. diff --git a/mise.toml b/mise.toml index d4fabf596..06c13bbcf 100644 --- a/mise.toml +++ b/mise.toml @@ -94,7 +94,7 @@ cargo test --test payload_schema_tests """ [tasks."codegen:parity"] -description = "Parity gate: Rust eql-codegen output matches the int4 golden (normalized) + committed values.rs" +description = "Parity gate: Rust eql-codegen output matches the int4 golden (byte-for-byte)" dir = "{{config_root}}" run = "bash tasks/codegen-parity.sh" diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index 8a91bf681..ae7204ab5 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -1,21 +1,27 @@ # Codegen reference -The SQL files under `int4/` are the hand-written golden reference for the encrypted-domain scalar generator. `int4` is the **single golden master**: the generator in `crates/eql-codegen` is type-generic — its SQL templates are pure token substitution driven by the `eql-scalars::CATALOG` rows — so one anchored type detects all template/term drift for every current and future scalar. +The SQL files under `int4/` are the hand-maintained golden reference for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). `int4` is the **single golden master**: the generator is type-generic — its templates are pure token substitution driven by the `eql_scalars::CATALOG` rows (`crates/eql-scalars/src/lib.rs`) — so one anchored type detects all template/term drift for every current and future scalar. Each reference file's first line is a `-- REFERENCE:` provenance marker; everything after it is the generated body verbatim, starting with the template-owned `-- AUTOMATICALLY GENERATED FILE.` header. -The parity gate renders the generator's output for `int4` and asserts it matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same reference: +The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the real `src/encrypted_domain/int4/` tree) and asserts its output matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same reference: -- `crates/eql-codegen/tests/parity.rs` — runs `generate_all` into a temp dir and byte-compares the materialised `int4` SQL surface; -- the in-crate golden tests in `crates/eql-codegen/src/generate.rs` — byte-compare each `render_*_file` output against the corresponding reference; -- `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate, a plain `diff` of `tail -n +2 ` against the regenerated tree. +- `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate. It first compares the generated `int4` SQL *file set* against the golden `*.sql` set (`comm -23` against `git ls-files` excludes the committed, hand-written `int4_extensions.sql`, which has no golden counterpart) to catch extra/dropped files, then `diff`s each golden file against its generated counterpart after `tail -n +2` drops the provenance line. Any whitespace or blank-line drift fails — there is no normalization. +- `crates/eql-codegen/tests/parity.rs` (`rust_generator_matches_int4_golden_files`) — runs `generate_all` into a temp dir and byte-compares the materialised `int4` SQL surface against the same golden. +- the in-crate golden tests in `crates/eql-codegen/src/generate.rs` — byte-compare each `render_*_file` output against the corresponding reference. -If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (commit the new `int4` reference in the same PR). Whitespace and blank-line drift now fail the gate — there is no normalization. +The golden reference, not any retired generator, is the sole oracle. If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (commit the new `int4` reference in the same PR). + +See `docs/reference/encrypted-domain-generator.md` for the full generator story (manifest-free catalog, templates, term capabilities). + +## No committed fixture values + +Plaintext fixture lists are **not** generated and **not** committed as `_values.rs` files — there are none in the tree. They live in the catalog as `eql_scalars::INT4_VALUES` / `INT2_VALUES`, materialised at compile time by the `int_values!` macro in `crates/eql-scalars/src/lib.rs` from each `CATALOG` row, and pinned by `eql-scalars`'s own `values_tests`. The parity gate only globs `*.sql`; it does not check any `values.rs`. ## New scalar types do not add a reference Adding a scalar type (`int2`, `int8`, …) does **not** add a `tests/codegen/reference//` directory. A per-type baseline would be redundant: the SQL is byte-identical to `int4` modulo the type token, so it can only fail when `int4`'s baseline already would. New types are guaranteed three other ways: - the `int4` reference here anchors the shared generator (templates + the `Term` enum's capability `impl`s in `crates/eql-scalars`); -- the per-type plaintext fixture list (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, materialised from each `CATALOG` row) is pinned by `eql-scalars`'s own `values_tests` — there is no generated `_values.rs` to diff; -- the SQLx `ordered_numeric_matrix!` suite exercises the generated SQL's *behaviour* against a real database — a far stronger guarantee than a byte comparison. +- a catalog row plus the compiler and `eql-scalars`'s `#[test]`/`values_tests` over `CATALOG` validate the new type's spec and materialised value list; +- the SQLx `ordered_numeric_matrix!` suite exercises the generated SQL's *behaviour* against a real database — a far stronger guarantee than a byte comparison — and `mise run test:matrix:inventory` reconciles the matrix test-name set against the single canonical, token-normalized `tests/sqlx/snapshots/matrix_tests.txt` (cross-checked against `eql-codegen list-types`) with no database required. From d2afbf7eaf82e8e09b1834896763ed20e69b77d7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 10:55:59 +1000 Subject: [PATCH 057/599] fix(ci): pin bash via shebang for strict-mode mise tasks mise runs inline TOML tasks under `sh`, which is dash on the CI runners. `fixture:generate:all` used `set -euo pipefail` and failed there with 'Illegal option -o pipefail' (the task is new on this branch and had never run under CI's dash). `test:matrix:inventory` and `test:matrix:expand` had the same latent bug -- pipefail plus real pipes. Pin bash with a `#!/usr/bin/env bash` shebang as the first line of each strict-mode run block (mise honors it) and standardise on `set -euo pipefail`, so pipefail is portable regardless of the runner's /bin/sh. --- mise.toml | 10 +++++++--- tasks/fixtures.toml | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mise.toml b/mise.toml index 06c13bbcf..7f3e4d9cc 100644 --- a/mise.toml +++ b/mise.toml @@ -109,14 +109,16 @@ cargo test -p eql-scalars -p eql-codegen description = "Compile, lint and test the std-only Rust workspace crates (no database)" dir = "{{config_root}}" run = """ +#!/usr/bin/env bash # eql-scalars / eql-codegen are the lean workspace members. Scope explicitly to # them (NOT --workspace): a workspace-wide test would drag in tests/sqlx, whose # suite needs Postgres + CS_* secrets and is already covered by the `test` job. # clippy is likewise scoped — a workspace clippy recompiles the heavy # sqlx/tokio/cipherstash-client tree for no added coverage of these crates. -# `set -eu` only (no pipefail): mise runs tasks under `sh`, which is dash on the -# CI runners, and dash rejects `set -o pipefail`. There are no pipes here. -set -eu +# bash is pinned via the `#!/usr/bin/env bash` shebang above (mise honors a +# `#!` first line), so `set -o pipefail` is available regardless of the runner's +# /bin/sh (dash on the CI images). +set -euo pipefail cargo fmt --check cargo clippy -p eql-scalars -p eql-codegen --all-targets -- -D warnings cargo test -p eql-scalars -p eql-codegen @@ -126,6 +128,7 @@ cargo test -p eql-scalars -p eql-codegen description = "Verify the matrix test-name set against the single canonical snapshot, catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" run = """ +#!/usr/bin/env bash # ONE canonical, token-normalized snapshot (snapshots/matrix_tests.txt) pins the # set of macro-emitted matrix test names. The two per-type snapshots are gone: # they were byte-identical modulo the type token, so one canonical set plus a @@ -188,6 +191,7 @@ echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot; cata description = "Regenerate the int4 matrix cargo-expand snapshot (requires the pinned nightly + cargo-expand)" dir = "{{config_root}}/tests/sqlx" run = """ +#!/usr/bin/env bash # Body-level fidelity backstop for the macro: the expanded source of the int4 # matrix arms. The `cargo +nightly-...` invocation below is the SINGLE source of # the pinned nightly date — .github/workflows/macro-expand-eql.yml greps it from diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index f24bc6848..04b7d5b52 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -19,6 +19,10 @@ description = "Regenerate every scalar SQLx fixture in one process, driven by eq # Must run inside the crate — a workspace member still builds from its own dir. dir = "{{config_root}}/tests/sqlx" run = """ +#!/usr/bin/env bash +# bash is pinned via the `#!/usr/bin/env bash` shebang above (mise honors a `#!` +# first line), so `set -o pipefail` is available regardless of the runner's +# /bin/sh (dash on the CI images). set -euo pipefail cargo test --features fixture-gen --test generate_all_fixtures \ generate_all -- --ignored --exact --nocapture From ec7243a7ec9934eb1e4571c683790b6e5b0bbd2d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 10:56:06 +1000 Subject: [PATCH 058/599] docs(reference): rename encrypted-domain spec to task-oriented guide Rename encrypted-domain-implementation-spec.md (and fold in the generator reference) to adding-a-scalar-encrypted-domain-type.md, update all cross-references (CLAUDE.md, eql-functions.md, sql-support.md, tests READMEs), and fill in the PR #252 link in the unreleased CHANGELOG entry. --- CHANGELOG.md | 2 +- CLAUDE.md | 2 +- .../adding-a-scalar-encrypted-domain-type.md | 619 ++++++++++++++++++ docs/reference/encrypted-domain-generator.md | 483 -------------- .../encrypted-domain-implementation-spec.md | 400 ----------- docs/reference/eql-functions.md | 4 +- docs/reference/sql-support.md | 2 +- tests/codegen/reference/README.md | 2 +- tests/sqlx/snapshots/README.md | 7 +- 9 files changed, 629 insertions(+), 892 deletions(-) create mode 100644 docs/reference/adding-a-scalar-encrypted-domain-type.md delete mode 100644 docs/reference/encrypted-domain-generator.md delete mode 100644 docs/reference/encrypted-domain-implementation-spec.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 853e5e81a..767001947 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Changed -- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#PR](https://github.com/cipherstash/encrypt-query-language/pull/PR)) +- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) ## [2.3.1] — 2026-05-21 diff --git a/CLAUDE.md b/CLAUDE.md index 9cb5b80f0..50766e33a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -80,7 +80,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/encrypted_domain//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. -**Adding a new encrypted-domain type: follow `docs/reference/encrypted-domain-implementation-spec.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. +**Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. Regeneration is deterministic: an identical `CATALOG` produces byte-identical SQL. If `mise run build` produces unexpected output, the change is in `crates/eql-scalars/src` (the catalog/terms) or `crates/eql-codegen/src` (the renderers) — not in random run-to-run variation. diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md new file mode 100644 index 000000000..ee304a3d7 --- /dev/null +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -0,0 +1,619 @@ +# Adding a Scalar Encrypted-Domain Type + +The one reference for adding a scalar encrypted-domain type (`int4`, `int2`, +and future ordered numeric scalars). The **top half** (§§1–4) is the path you +follow to add a type; the **reference half** (§§5–7) is the detail behind it — +the generated surface, its invariants, and how the generator itself works. +Read top-down to ship a type; drop into the reference half when something +breaks or you need the *why*. + +A scalar encrypted-domain type is a family of concrete `jsonb` domains in the +**`eql_v3`** schema (`eql_v3.`, `eql_v3._eq`, +`eql_v3._ord`, …), dropped by `DROP SCHEMA eql_v3 CASCADE` and surviving +an `eql_v2` uninstall. Their extractors, comparison wrappers, and MIN/MAX +aggregates also live in `eql_v3`; the index-term types they return +(`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are +referenced cross-schema. + +The whole SQL surface is **generated** from a single Rust source of truth: the +`CATALOG` const in [`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs), +rendered by the [`eql-codegen`](../../crates/eql-codegen/) crate. There is no +TOML manifest and no Python — adding a type is adding one `ScalarSpec` row, +validated by the compiler plus catalog `#[test]`s. The reference type is +`eql_v3.int4`. **`text` and `jsonb` are out of scope** for this materializer +(see §7). + +--- + +## 1. TL;DR — the one path + +To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): + +1. **Add a `ScalarSpec` row to `eql_scalars::CATALOG`** — `token`, `kind`, + `domains`, `fixtures` (§2). If the type needs a new scalar width, add a + `ScalarKind` variant first; if it needs new term behaviour, that goes in the + `Term` enum's `impl`, never in catalog data. +2. **Materialise the value list** — `int_values!(_VALUES, , );` + next to `CATALOG`, pinned by a `values_tests` assertion (§2). This is the + single source the SQLx matrix reads; there is no generated `_values.rs`. +3. **Wire the SQLx matrix oracle** — copy the seven small registrations from the + `int4` reference (§3). +4. **Regenerate** — `cargo run -p eql-codegen` (or just `mise run build`, which + runs the generator first). One run regenerates *every* catalog type; there is + no per-type codegen task. The generated `*_{types,functions,operators,aggregates}.sql` + are gitignored and never committed. +5. **Snapshot the matrix inventory** — `mise run test:matrix:inventory` (§3). +6. **Verify** — `mise run test:codegen`, the relevant SQLx suites, and the + PostgreSQL matrix (§4). + +Things you do **not** do: + +- **Don't commit generated SQL.** `*_types.sql` / `*_functions.sql` / + `*_operators.sql` / `*_aggregates.sql` are gitignored; the catalog plus the + renderers are the source of truth. Change the catalog and rebuild — never + hand-edit generated SQL. +- **Don't add a `tests/codegen/reference//` baseline.** `int4` is the sole + golden master (§4). +- **Don't edit `mise.toml`, the CI workflow, `pin_search_path.sql`, or + `splinter.sh`** for an ordinary type — they recognise the generated surface + intrinsically (§5, §6). The exception is a brand-new *term* whose extractor + has a new name (§5). + +Hand-written SQL beyond the fixed surface goes in +`src/encrypted_domain//_extensions.sql` with explicit `-- REQUIRE:` edges +— and **that file IS committed** (§5). + +--- + +## 2. The catalog row (`ScalarSpec`) + +A scalar type is one `ScalarSpec` row in +[`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs): + +```rust +ScalarSpec { + token: "int4", + kind: ScalarKind::I32, + domains: &[ + DomainSpec { suffix: "", terms: &[] }, + DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, + DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, + DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, + ], + fixtures: INT4_FIXTURES, +} +``` + +The fields, all enforced by the type system and the catalog `#[test]`s rather +than a runtime validator: + +- **`token`** — the type token (`int4`); supplies `` everywhere. Each + domain's full name is `token` + `suffix` (`ScalarSpec::domain_name`), pinned by + `every_domain_name_starts_with_its_token`. +- **`kind`** — a `ScalarKind` (`I16` / `I32` / `I64` / `Numeric` / `Text` / + `Jsonb`), carrying the Rust type name, the `MIN`/`MAX`/zero symbols, and the + numeric bounds. Only the integer kinds have an i128 range with `Min`/`Max`/`Zero` + sentinels; the bounded accessors `panic!` on the others (a misuse guard gated + by `is_int()`). **If `` needs a new scalar width, add a `ScalarKind` + variant** (rust-type name, `MIN`/`MAX`/zero symbols, bounds) with unit tests + over its `impl` methods. +- **`domains`** — a non-empty `&[DomainSpec]` (pinned by + `every_type_has_at_least_one_domain`), each a `suffix` + the fixed `&[Term]` it + carries. The storage domain is `suffix: ""` with no terms; `_eq => [Term::Hm]`; + `_ord` and `_ord_ore => [Term::Ore]`. A `DomainSpec` declares nothing else — no + extractor names, no operator lists, no REQUIRE edges. Every behavioural fact + comes from the `Term` enum. +- **`fixtures`** — the type's plaintext fixture list (see below). + +**Terms** are fixed by the `Term` enum (`crates/eql-scalars/src/lib.rs`). The +`json_key` / `extractor` / `returns` / `ctor` values are the cross-schema SQL +contract — changing one is a generated-SQL behaviour change, not a refactor: + +| Term | JSON key | Extractor | Returns | Operators | +| ----- | -------- | ----------- | -------------------------------- | -------------------------- | +| `Hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` `<>` | +| `Ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | + +A type that needs a non-ORE equality term on an ordered domain needs a **new +`Term`**, not a catalog flag. Adding a term is a code change to the `Term` +enum's `impl` methods (`json_key`, `extractor`, `returns`, `ctor`, `role`, +`operators`, `requires`) with matching `#[test]`s (`term_tests` / +`term_helper_tests`) — never a free-form catalog field. + +**Twins.** `int4_ord` and `int4_ord_ore` both carry `&[Term::Ore]`. The +generator emits them as independent domains with byte-identical SQL modulo type +name (`ordered_files_byte_identical_modulo_typename`). Twins let callers choose +a name that documents intent ("ordered, regardless of mechanism" vs "ordered via +ORE block") without committing to one term family in a future migration. + +**Order is significant.** The generator iterates `CATALOG` in order (driving +generation order), and iterates each spec's `domains` slice in order — that +order shows up in the generated `_types.sql` `DO` block. Order the slice +the way you want the output to read. + +### Fixtures — single-sourcing the value list + +The `fixtures` field is an ordered `&[Fixture]` — the single source of truth +for the type's plaintext list, consumed by both the SQLx fixture generator and +the matrix oracle. A `Fixture` is value-kind tagged: `Min` / `Max` / `Zero` (the +integer matrix pivots, resolved per-kind), `Int(i128)` (an integer literal), and +`Numeric` / `Text` / `Jsonb` string variants. The `fixtures!` macro +range-checks each `Int` literal against the kind at compile time (`N(-40000)` +for an `i16` kind does not compile): + +```rust +const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; + Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), + N(42), N(50), N(100), N(250), N(1000), N(9999), Max); +``` + +Catalog `#[test]`s enforce a **distinct-plaintext contract** plus the +matrix-pivot requirement: + +- `fixture_values_are_distinct_by_resolved_number` rejects duplicates against + the *resolved* value, so both copy-paste dups and sentinel/literal aliases + (`Min` alongside the same number) fail; +- `fixtures_include_min_max_and_zero` requires `Min`, `Max`, and zero for + integer kinds — the matrix uses those three as comparison pivots and fetches + each one's ciphertext from the fixture via `fetch_fixture_payload`, which fails + loudly if the row is absent; +- `every_fixture_value_is_within_kind_bounds` keeps every resolved value in + range. + +These are the compile/test-time analogue of the old `load_spec` validation. +Beyond the pivots, choose values so range operators produce distinguishable +result counts, include useful boundaries, and cover omitted-term negative cases. + +The plaintext list is **not** rendered to a generated file. The `int_values!` +macro (next to `CATALOG`) materialises a `Fixture` list into a typed `pub const +_VALUES: &[]` at compile time (`INT4_VALUES`, `INT2_VALUES`): + +```rust +int_values!(INT4_VALUES, i32, INT4); +``` + +Both consumers reference that single symbol — the fixture generator +(`fixtures::eql_v2_::spec`) and the matrix oracle's `FIXTURE_VALUES` — so the +oracle cannot drift from the values the generator encrypts. There is no +committed `_values.rs`: a Rust source of truth does not round-trip through +generated Rust. Pin the exact materialised list with a `values_tests` assertion. + +--- + +## 3. Wire the SQLx matrix oracle + +The generated SQL is enough to *install* the domains, but the +`ordered_numeric_matrix!` suite only runs once the Rust harness knows about the +scalar. These are hand-maintained registration lists — copy each piece from the +`int4` reference. `` is the scalar's Rust type (`i32` for `int4`, `i16` for +`int2`): + +| File | Add | +|------|-----| +| `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}`, a `PlaintextSqlType` const for its base column type, `impl EqlPlaintext for ` (`CAST`, `PLAINTEXT_SQL_TYPE`, `to_plaintext` → the right `Plaintext` variant), plus the two `#[test]` casts. | +| `tests/sqlx/src/fixtures/eql_v2_.rs` | `use eql_scalars::_VALUES as VALUES;` then `crate::scalar_fixture!("eql_v2_", , VALUES);`. | +| `tests/sqlx/src/fixtures/mod.rs` | `pub mod eql_v2_;`. | +| `tests/sqlx/tests/generate_all_fixtures.rs` | An arm in `generate_for_token`: `"" => fixtures::eql_v2_::spec().run().await,`. The match is exhaustive over the catalog — a catalog token with no arm fails the generator loudly. | +| `tests/sqlx/src/scalar_domains.rs` | `impl ScalarType for ` — `PG_TYPE` (the base PG type, e.g. `"int8"`) and `FIXTURE_VALUES = eql_scalars::_VALUES`. | +| `tests/sqlx/tests/encrypted_domain/scalars/.rs` | `ordered_numeric_matrix! { suite = , scalar = , eql_type = "eql_v2_" }`. | +| `tests/sqlx/tests/encrypted_domain/scalars/mod.rs` | `pub mod ;`. | + +Forget one and the matrix simply does not run for the type — the matrix +inventory cross-check (below) surfaces it, because the catalog has the type but +the binary has no `scalars::::` tests. (A future Phase-4 `scalar_types!` +registry, tracked separately, will collapse these into one declaration.) + +The coverage these registrations unlock comes from the `ordered_numeric_matrix!` +convention wrapper in `tests/sqlx/src/matrix.rs`: one `impl ScalarType` plus a +single invocation taking `suite`, `scalar`, and `eql_type`. The matrix derives +its comparison pivots — the scalar's `MIN`, `MAX`, and zero +(`Default::default()`) — from the type rather than a hand-written list, so the +invocation carries no pivot argument. Equality-only scalars use the sibling +`eq_only_scalar_matrix!`. The `matrix.rs` module header is the canonical, +current list of the categories the matrix emits (sanity, correctness, +cross-shape, supported-NULL, blocker raises, index engagement, ORDER BY, ORDER +BY USING) — read it rather than duplicating a count here. For ordered `int4`, +keep the assertion that distinct plaintext values produce distinct ORE blocks; +do not add assertions for term behaviour the catalog does not promise. + +### Matrix coverage inventory snapshot + +The *set of test names* the matrix emits is guarded by **one** committed, +token-normalized snapshot at `tests/sqlx/snapshots/matrix_tests.txt` — the +sorted inventory of every `scalars::::*` test name with the type token +replaced by the literal ``. (The per-type `_matrix_tests.txt` files are +gone: they were byte-identical modulo the token, so one canonical set plus a +per-type normalize-and-compare carries the same signal at a fraction of the +committed surface.) This is the guard that catches a silently dropped, renamed, +or `#[cfg]`-gated matrix test — a behaviour the SQLx assertions cannot see (a +deleted test just stops running). The snapshot is a committed test baseline, +**not** gitignored generated SQL. + +`mise run test:matrix:inventory` discovers the present scalar types from the +`encrypted_domain` binary's `--list`, normalizes each type's token to ``, +asserts every type's set equals the canonical snapshot, and cross-checks the +discovered type set against `cargo run -p eql-codegen -- list-types` (the +catalog is the single source). You do **not** edit a per-type snapshot or touch +`mise.toml` / the CI workflow — you only regenerate the one `matrix_tests.txt` +when the macro's emitted name set itself changes. A catalog type missing its +matrix wiring fails the cross-check. The CI `matrix-coverage` job gates it. +**`tests/sqlx/snapshots/README.md` is the source of truth** for the mechanics +(pinned feature set, the catalog cross-check, the CI diff, and when to +regenerate). + +--- + +## 4. Regenerate, snapshot & verify + +Regeneration is deterministic: identical catalog + renderers produce +byte-identical SQL. If `mise run build` produces unexpected output, the change +is in `crates/eql-scalars/src` (catalog/terms) or `crates/eql-codegen/src` +(renderers) — not run-to-run variation. + +Run, in order: + +- `cargo run -p eql-codegen` (optional; refreshes all generated SQL from the + catalog before a full build) +- `mise run test:codegen` (`cargo test -p eql-scalars -p eql-codegen`) +- `mise run test:matrix:inventory` (matrix inventory + catalog cross-check; no + database) +- `mise run clean && mise run build` (regenerates every type's SQL from the + catalog first, then builds the release artefacts — a bare build can leave + stale `release/*.sql`) +- the relevant SQLx suites +- `mise run test` across supported PostgreSQL versions +- `mise run --output prefix test:splinter --postgres 17` after a PostgreSQL 17 + install has built EQL + +The CI codegen job is a prerequisite of the PostgreSQL test matrix, so +generated-SQL drift is caught before database tests run. + +**Why no per-type golden baseline.** Do **not** add a +`tests/codegen/reference//` baseline. `int4` is the sole golden master for +the type-generic generator: the templates are pure token substitution, so a +per-type baseline can only fail where `int4`'s already would. Drift protection +for a new type comes from the `int4` reference (shared templates + `Term` enum), +the catalog `values_tests` pinning the materialised `_VALUES`, the +catalog/generator `#[test]`s, and the `ordered_numeric_matrix!` SQLx suite +(behaviour, not bytes). + +--- + +## 5. The generated surface — what correct output looks like + +This is the contract the generated SQL satisfies. You normally never read it to +*add* a type — read it when a test fails or you're extending the surface. + +### Domains and CHECK constraints + +The generator emits `src/encrypted_domain//_types.sql` (gitignored; +materialised on every build) with one idempotent `DO $$ ... $$` block. Every +domain is a concrete domain over `jsonb` in the `eql_v3` schema — **never** +`CREATE DOMAIN a AS b` over another generated domain (PostgreSQL resolves +operators against the underlying base type, bypassing the fixed surface). Each +domain's `CHECK` requires: + +- fixed envelope keys `v` and `i`; +- ciphertext key `c`; +- catalog JSON keys for the listed terms; +- the envelope version value `VALUE->>'v' = '2'`, matching the repo-wide + `eql_v2._encrypted_check_v` rule (`src/encrypted/constraints.sql`). + +So a domain with `&[Term::Ore]` requires `v`, `i`, `c`, and `ob` present, with +`v` pinned to `2`. Beyond key presence and the version value, a malformed term +can still fail later inside its extractor. + +### Extractors, wrappers, and blockers + +Extractor names and return types come from the `Term` enum. Generated extractors +and supported comparison wrappers are inline-friendly SQL functions: + +```sql +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT ... $$; +``` + +They must **not** carry a pinned `search_path` — a `SET` clause disables +inlining and reverts index-backed queries to seq scans. The build tooling +recognises these functions structurally, so the generator emits no +`eql-inline-critical` markers. (Aggregate state functions are the one deliberate +exception — see below.) + +Unsupported operators route to **blockers**, which are `LANGUAGE plpgsql`, +`IMMUTABLE`, `PARALLEL SAFE`, and intentionally **not `STRICT`**: + +- **`plpgsql`, not `sql`.** A `LANGUAGE sql` body is inlinable, and the planner + could elide the call when the result is provably unused (dead `CASE` branch, + folded predicate), letting a blocked operator appear to succeed. `plpgsql` is + opaque to the planner, so the call — and its `RAISE` — always survives. +- **Not `STRICT`.** A `STRICT` blocker lets PostgreSQL skip the body and return + `NULL` on a `NULL` argument, silently bypassing the unsupported-operator + exception. + +### Operators + +Every generated domain declares supported scalar comparison operators plus +blockers for the native `jsonb` operator surface PostgreSQL could otherwise +reach through domain-to-base-type fallback. The surface is a fixed 20 operators +(`crates/eql-codegen/src/operator_surface.rs`, `OPERATORS`), each with its +PostgreSQL-shaped signatures, summing to **44 `CREATE OPERATOR` statements per +domain**: + +| Operators | Forms | +|---|---| +| `=` `<>` `<` `<=` `>` `>=` `@>` `<@` | `(domain, domain)` · `(domain, jsonb)` · `(jsonb, domain)` | +| `->` `->>` | `(domain, text)` · `(domain, integer)` · `(jsonb, domain)` | +| `?` | `(domain, text)` | +| `?\|` `?&` | `(domain, text[])` | +| `@?` `@@` | `(domain, jsonpath)` | +| `#>` `#>>` `#-` | `(domain, text[])` | +| `-` | `(domain, text)` · `(domain, integer)` · `(domain, text[])` | +| `\|\|` | `(domain, domain)` · `(domain, jsonb)` · `(jsonb, domain)` | + +Whether an operator routes to a wrapper or a blocker is a per-domain decision +driven by the domain's terms (`Term::operators_for_terms`), not a property of +the operator. Supported operators are emitted with full planner metadata +(`COMMUTATOR`, `NEGATOR`, `RESTRICT`, `JOIN` selectivity estimators) backing +onto inlinable wrappers; everything else carries minimal metadata backing onto +blockers. Path operators always back onto blockers — neither current term +enables them — and the native `jsonb` operators are blocker-only. + +The wrapper/blocker split per domain (the 44-operator total never moves): + +| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | +| ---------------- | ---------: | -------: | -------: | --------: | --------: | +| none | 0 | 0 | 44 | 44 | 44 | +| `&[Term::Hm]` | 1 (`eq_term`) | 6 | 38 | 45 | 44 | +| `&[Term::Ore]` | 1 (`ord_term`) | 18 | 26 | 45 | 44 | + +Six wrappers for `Hm` = `=` and `<>` × three shapes; eighteen for `Ore` = six +operators × three shapes. + +**Untyped-literal resolver edge.** PostgreSQL's operator resolver still prefers +the built-in `jsonb` operator for untyped string literals in forms such as +`payload::eql_v3.int4 ? 'c'`. Use typed parameters or explicit casts +(`? 'c'::text`, bound text parameters) to route those forms to the generated +blocker. A live-DB structural guard +(`tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs`) queries +`pg_operator` for every operator with a `jsonb` argument and asserts the set is +a subset of the enumerated surface, so a future PostgreSQL version that adds a +`jsonb` operator nobody enumerated fails the test rather than silently routing an +encrypted column to native plaintext-`jsonb` semantics. + +### Aggregates + +Each ordered (ord-capable) domain additionally gets a generated +`_aggregates.sql`: two state functions (`eql_v3.min_sfunc`, +`eql_v3.max_sfunc`) and two aggregates (`eql_v3.min()`, +`eql_v3.max()`). Comparison routes through the domain's `<` / `>` +operator (the ORE block term — no decryption). The state functions are `LANGUAGE +plpgsql IMMUTABLE STRICT PARALLEL SAFE` **with** a pinned `SET search_path` — +the one place the "no pinned `search_path`" rule does not apply, because +aggregate transition functions are never index expressions. `STRICT` makes +PostgreSQL seed the running state with the first non-NULL value and skip NULLs, +so an all-NULL group returns NULL. Each `CREATE AGGREGATE` declares +`combinefunc = ` and `parallel = safe`: min/max are associative, so the +state function doubles as the combine function, enabling partial and parallel +aggregation on large `GROUP BY` ORE workloads with no decryption. Storage-only +and equality-only domains have no comparator and emit no aggregate file. + +### Indexing + +Do not create operator classes on generated domains. Index through the +extractor, whose return type already carries a default opclass: + +```sql +CREATE INDEX ... ON table_name USING btree (eql_v3.ord_term(col)); +CREATE INDEX ... ON table_name USING hash (eql_v3.eq_term(col)); +``` + +`ore` depends on `src/ore_block_u64_8_256/functions.sql` and +`src/ore_block_u64_8_256/operators.sql`; `hm` depends on +`src/hmac_256/functions.sql`. + +### Extension files + +Optional hand-written SQL beyond the fixed surface belongs in +`src/encrypted_domain//_extensions.sql`. The generator never creates, +lists, headers, or cleans it; it must declare its own `-- REQUIRE:` edges +(usually to `_types.sql` and whichever generated function or operator file it +extends). Use it for cross-domain casts, helper functions, or type-specific +constraints. Unlike the generated siblings, **`_extensions.sql` IS +committed.** (Neither `int4` nor `int2` ships one today.) + +`tasks/pin_search_path.sql` describes the fallback marker for inline-critical +extension functions that take no domain argument and so escape the structural +skip: + +```sql +COMMENT ON FUNCTION eql_v2.my_helper(...) IS 'eql-inline-critical: ...'; +``` + +The generator never emits this marker; every function it produces takes a domain +argument and is covered by the structural skip intrinsically. + +### Invariants the generator enforces + +The generator's job is partly to write SQL and partly to make incorrect SQL +unreachable. Invariants encoded in the renderers / templates and guarded by +`#[test]`s in `crates/eql-codegen/src/generate.rs`: + +- **Blockers are never `STRICT` and always `plpgsql`** — the + unsupported-operator template emits each blocker as `IMMUTABLE PARALLEL SAFE` / + `LANGUAGE plpgsql` without `STRICT` + (`blockers_are_never_strict_and_always_plpgsql`). +- **Wrappers and extractors are inlinable SQL** — `LANGUAGE sql IMMUTABLE STRICT + PARALLEL SAFE`, single-statement `SELECT`, no `SET search_path` + (`inlinable_functions_have_no_set_search_path`). +- **Aggregate state functions are the deliberate exception** — `plpgsql` *with* + a pinned `SET search_path` (`aggregate_state_functions_are_plpgsql_not_inlinable`). +- **SQL-literal injection is structurally prevented** — every interpolated + single-quoted literal passes through `sql_str` + (`crates/eql-codegen/src/consts.rs`), which doubles embedded single quotes. +- **No domain-over-domain** — every domain is `CREATE DOMAIN eql_v3. AS + jsonb` (`types_file_has_all_four_domains`). +- **No operator class on a domain** — the generator emits operators, not + operator classes. +- **Ownership boundary** — `is_generated` recognises owned files by their header + marker; `ensure_generated_paths_writable` refuses to overwrite anything else, + and `clean_generated_files` deletes only marked files + (`crates/eql-codegen/src/writer.rs`). A hand-written file at a generated path + is a hard error, not a silent clobber. + +### Lint and test integration + +Two pieces of build tooling recognise the generated output without per-type +edits: + +- **`tasks/pin_search_path.sql`** — structural skip identifies encrypted-domain + functions by language (`sql`), volatility (`IMMUTABLE`), and a jsonb-backed + `DOMAIN` argument in the `eql_v3` schema. New scalar types need no edit. +- **`tasks/test/splinter.sh`** — name-based allowlist. The converged wrapper / + extractor names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, `eq_term`, `ord_term`) + plus the generated `min` / `max` aggregates are already covered by + `eql_v3`-schema entries. A new scalar type inherits coverage; **only a new + term whose extractor has a new name requires a splinter entry.** + +--- + +## 6. Generator internals — the machine + +You need this section only when **modifying the generator itself**, not when +adding a type. + +### Why a generator + +A single scalar type emits several hundred SQL declarations across eleven files: +four domains, three extractors, dozens of wrappers and blockers, 176 `CREATE +OPERATOR` statements (44 per domain), and MIN/MAX aggregates per ordered domain. +The shape is mechanical and the invariants are unforgiving — a `STRICT` blocker +silently bypasses its exception; a pinned `search_path` reverts queries to seq +scans. The generator exists so each new type adds one `CATALOG` row rather than +ninety hand-written declarations that must agree with each other and with +`pin_search_path.sql`, `tasks/test/splinter.sh`, and +`src/encrypted_domain/functions.sql`. + +### Pipeline + +`eql-codegen` is a small Rust crate with a binary entry point. The generator +runs as `cargo run -p eql-codegen` (no subcommand), which calls +`generate::generate_all` (`crates/eql-codegen/src/generate.rs`) over every row of +`eql_scalars::CATALOG`, writing each type's SQL into +`src/encrypted_domain//`. A second subcommand, `cargo run -p eql-codegen +-- list-types`, prints the catalog tokens one per line (consumed by the fixture +and matrix-inventory enumeration). `main` (`crates/eql-codegen/src/main.rs`) +recognises exactly these two forms; any other argument is a usage error. + +`tasks/build.sh` runs `cargo run -p eql-codegen` at the start of every `mise run +build`, so the generated SQL is never checked in. (The build first sweeps every +generated `*_{types,functions,operators,aggregates}.sql` under +`src/encrypted_domain` so a type removed from `CATALOG` cannot leave orphans the +`src/**/*.sql` build glob would pick up; hand-written `*_extensions.sql` is +preserved by the name patterns.) + +Stages, in order (`generate_all` → `generate_type`): + +1. **Read the catalog.** `eql_scalars::CATALOG` is the in-binary source of truth + — a `&[ScalarSpec]`. There is no parse/validate stage at generation time: the + catalog is validated at compile time (an undefined `Term` or unknown + `ScalarKind` does not compile) and by the catalog `#[test]`s, so the data is + already well-formed by the time `generate_all` runs. +2. **Resolve terms.** For each `DomainSpec`, the `Term` enum's `impl` methods + supply the extractor name, return type, JSON envelope key, supported + operators, and the SQL `-- REQUIRE:` edges those terms imply + (`Term::operators_for_terms`, `term_json_keys`, `term_requires`, + `extractor_for_operator`, `role_for_terms`). +3. **Render.** `render_types_file`, `render_functions_file`, + `render_operators_file`, and `render_aggregates_file` (the last only for + ordered domains) build the context structs in + `crates/eql-codegen/src/context.rs` and render them through embedded + **minijinja** templates (`crates/eql-codegen/templates/*.j2`, compiled in via + `include_str!` — no runtime file IO). The structural shape of each declaration + is split between the context builders (Rust) and the templates (Jinja). +4. **Write.** `clean_generated_files` first deletes every generated `.sql` in the + target directory (recognised by the header marker) so an abandoned domain + disappears on the next regeneration; `ensure_generated_paths_writable` then + refuses to proceed if any target path is a hand-written file lacking the + marker; `write_generated_file` writes each rendered body verbatim + (`crates/eql-codegen/src/writer.rs`). The template emits the `-- AUTOMATICALLY + GENERATED FILE.` marker as its own first line, so the writer does not prepend + a header — it only uses the marker to recognise files it owns. + +There is no caching layer and no incremental mode. Each run regenerates every +output for every catalog type from scratch. + +### Generated outputs + +For a type with `D` domains of which `A` are ordered, the generator writes `1 + +2D + A` SQL files into `src/encrypted_domain//`. For `int4` (`D = 4`, `A = +2`): eleven SQL files. The outputs are gitignored +(`.gitignore` excludes `src/encrypted_domain/*/*_{types,functions,operators,aggregates}.sql`) +and regenerated at the start of every build. + +| File | Content | +| --------------------------------- | ---------------------------------------------------------------------------------------- | +| `_types.sql` | Single idempotent `DO` block creating every domain; each `CHECK` pins the payload version (`VALUE->>'v' = '2'`) and required envelope/ciphertext/term keys; one `--! @brief` per domain | +| `_functions.sql` | One extractor per unique term, then 44 wrappers-or-blockers covering the surface | +| `_operators.sql` | 44 `CREATE OPERATOR` statements with planner metadata on supported ops | +| `_aggregates.sql` | MIN/MAX state functions + `CREATE AGGREGATE`; emitted only for ordered domains | + +Every file opens with the `-- AUTOMATICALLY GENERATED FILE.` marker (the +project-wide marker `docs:validate` greps on to skip generated SQL — +`crates/eql-codegen/src/consts.rs`), declares its `-- REQUIRE:` edges in +dependency order (types files require `src/schema-v3.sql`; function files require +both `src/schema.sql` and `src/schema-v3.sql`, the types file, and +`src/encrypted_domain/functions.sql` plus each term's `requires` set; operator +files require `src/schema-v3.sql`, the types file, and their domain's function +file; aggregate files require `src/schema-v3.sql`, the types file, and their +domain's function and operator files), and carries Doxygen `--! @file` / +`--! @brief` headers. + +### Generator tests and the parity gate + +The generator's tests are Rust, run by `mise run test:codegen` (`cargo test -p +eql-scalars -p eql-codegen`) — no database. `mise run test:crates` adds `cargo +clippy ... -D warnings`. + +- **`eql-scalars` unit tests** — `rust_tests`, `term_tests`, + `term_helper_tests`, `fixture_tests`, `catalog_tests`, `invariant_tests`, + `values_tests` over `CATALOG`, the `Term` / `ScalarKind` / `Fixture` impls, and + the materialised `_VALUES` consts. +- **`eql-codegen` unit tests** — file counts, language/volatility invariants, + escaping guards, and twin byte-identity + (`crates/eql-codegen/src/generate.rs` `#[cfg(test)]`). +- **The parity gate** — `mise run codegen:parity` (`tasks/codegen-parity.sh`). + It runs the generator into the real tree, then (1) compares the int4 generated + SQL **file set** against the golden under `tests/codegen/reference/int4/*.sql`, + excluding committed hand-written files (`comm -23` of `ls` against `git + ls-files`), so an extra or dropped generated file fails; and (2) diffs each + golden file **byte-for-byte** against its generated counterpart, after dropping + the golden's single leading `-- REFERENCE:` provenance line (`tail -n +2`). The + same byte-for-byte assertion runs in-crate as + `crates/eql-codegen/tests/parity.rs` + (`rust_generator_matches_int4_golden_files`). The golden reference — not any + Python oracle — is the sole contract that survives generator refactors. + +CI runs these in three jobs in `.github/workflows/test-eql.yml`: `rust-crates` +(`Rust workspace crates`, runs `mise run test:crates`), `codegen` +(`Encrypted-domain codegen`, runs `mise run codegen:parity`), and +`matrix-coverage` (`Matrix coverage inventory`, runs `mise run +test:matrix:inventory`). The codegen job is a prerequisite of the PostgreSQL +test matrix. + +Adding a new **term** is a bigger move than adding a type: edit the `Term` enum's +`impl` methods, add `#[test]`s, audit `splinter.sh` for a name collision if the +extractor name is new, and — because it changes the int4 surface — update the +golden reference under `tests/codegen/reference/int4/`. + +--- + +## 7. Out of scope — `text` and `jsonb` + +`text` and `jsonb` are **not** materialised through this generator. The +`ScalarKind` enum carries `Text` / `Numeric` / `Jsonb` variants and the +`Fixture` enum carries their string-backed shapes at the capability layer, but +`CATALOG` declares only the integer scalars today, so no `text` / `jsonb` SQL +surface is generated. Text and JSONB encrypted behaviour lives on the composite +`eql_v2_encrypted` type and its hand-written operator surface in `src/encrypted/` +and `src/operators/`, not the scalar materializer. `jsonb` in particular needs a +separate SQL design beyond this ordered-scalar materializer. diff --git a/docs/reference/encrypted-domain-generator.md b/docs/reference/encrypted-domain-generator.md deleted file mode 100644 index 770cbeaf6..000000000 --- a/docs/reference/encrypted-domain-generator.md +++ /dev/null @@ -1,483 +0,0 @@ -# Encrypted-Domain Code Generator - -How the Rust `eql-codegen` crate turns the `eql-scalars` catalog into the -SQL surface for a scalar encrypted-domain type. This document describes -the generator itself — its inputs, stages, outputs, and the invariants it -enforces. The contract those outputs must satisfy is in -[`encrypted-domain-implementation-spec.md`](./encrypted-domain-implementation-spec.md); -this file describes the machine that produces them. - -The reference type is `eql_v3.int4`. `text` and `jsonb` are outside scope. - -The generator is **Rust, not Python**. There is no TOML manifest, no -`tasks/codegen/` package, no `terms.py`/`templates.py`/`spec.py`. The -source of truth is the `CATALOG` const in -[`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs); -the renderers live in [`crates/eql-codegen/`](../../crates/eql-codegen/). -Adding a scalar type is adding a `ScalarSpec` row to `CATALOG`, validated -by the compiler plus catalog `#[test]`s — never an edit to free-form -manifest data. - -## 1. Why a generator - -A single scalar encrypted-domain type emits several hundred SQL -declarations across eleven files: four domains, three extractors, dozens -of comparison wrappers and blockers, 176 `CREATE OPERATOR` statements (44 -per domain), and MIN/MAX aggregates for every ordered domain. The shape -is mechanical and the invariants are unforgiving — a `STRICT` blocker -silently bypasses its exception, a pinned `search_path` disables inlining -and reverts queries to seq scans. The generator exists so each new scalar -type adds one `CATALOG` row rather than ninety hand-written declarations -that must agree with each other and with `pin_search_path.sql`, -`tasks/test/splinter.sh`, and `src/encrypted_domain/functions.sql`. - -## 2. Pipeline - -`eql-codegen` is a small Rust crate with a binary entry point. The -generator runs as `cargo run -p eql-codegen` (no subcommand), which calls -`generate::generate_all` (`crates/eql-codegen/src/generate.rs`) over every -row of `eql_scalars::CATALOG`, writing each type's SQL into -`src/encrypted_domain//`. A second subcommand, -`cargo run -p eql-codegen -- list-types`, prints the catalog tokens one per -line (consumed by the fixture and matrix-inventory enumeration). The -binary's `main` (`crates/eql-codegen/src/main.rs`) recognises exactly these -two forms; any other argument is a usage error. - -`tasks/build.sh` runs `cargo run -p eql-codegen` at the start of every -`mise run build`, so the generated SQL is never checked in — the catalog -is the source of truth. (The build first sweeps every generated -`*_{types,functions,operators,aggregates}.sql` under `src/encrypted_domain` -so a type removed from `CATALOG` cannot leave orphans the `src/**/*.sql` -build glob would pick up; hand-written `*_extensions.sql` is preserved by -the name patterns.) - -Stages, in order (`generate_all` → `generate_type`): - -1. **Read the catalog.** `eql_scalars::CATALOG` is the in-binary source of - truth — a `&[ScalarSpec]`, each row a `token`, a `ScalarKind`, an - ordered `&[DomainSpec]`, and a `&[Fixture]` list - (`crates/eql-scalars/src/lib.rs`). There is no parse/validate stage at - generation time: the catalog is validated at compile time (an undefined - `Term` or unknown `ScalarKind` does not compile) and by the catalog - `#[test]`s, so by the time `generate_all` runs the data is already - well-formed. -2. **Resolve terms.** For each `DomainSpec`, the `Term` enum's `impl` - methods supply the extractor name, return type, JSON envelope key, - supported operators, and the SQL `-- REQUIRE:` edges those terms imply - (`Term::operators_for_terms`, `term_json_keys`, `term_requires`, - `extractor_for_operator`, `role_for_terms` — `crates/eql-scalars/src/lib.rs`). -3. **Render.** `render_types_file`, `render_functions_file`, - `render_operators_file`, and `render_aggregates_file` (the last only for - ordered domains) build the context structs in - `crates/eql-codegen/src/context.rs` and render them through embedded - **minijinja** templates (`crates/eql-codegen/templates/*.j2`, - compiled in via `include_str!` — no runtime file IO). The structural - shape of each declaration is split between the context builders (Rust) - and the templates (Jinja). -4. **Write.** `clean_generated_files` first deletes every generated `.sql` - in the target directory (recognised by the header marker) so an - abandoned domain disappears on the next regeneration; - `ensure_generated_paths_writable` then refuses to proceed if any target - path is a hand-written file lacking the marker; `write_generated_file` - writes each rendered body verbatim (`crates/eql-codegen/src/writer.rs`). - The template emits the `-- AUTOMATICALLY GENERATED FILE.` marker as its - own first line, so the writer does not prepend a header — it only uses - the marker to recognise files it owns. - -There is no caching layer and no incremental mode. Each `cargo run -p -eql-codegen` regenerates every output for every catalog type from scratch. -Regeneration is deterministic: identical catalog + renderers produce -byte-identical SQL. - -## 3. Catalog format - -A scalar type is one `ScalarSpec` row -(`crates/eql-scalars/src/lib.rs`): - -```rust -ScalarSpec { - token: "int4", - kind: ScalarKind::I32, - domains: &[ - DomainSpec { suffix: "", terms: &[] }, - DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, - DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, - DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, - ], - fixtures: INT4_FIXTURES, -} -``` - -Structural rules, enforced by the type system and the catalog `#[test]`s -rather than a runtime validator: - -- `token` supplies the **type token** (`int4` here). Each domain's full - name is `token` + `suffix`; `ScalarSpec::domain_name` makes the old - "domain name must start with the token" rule structural, and - `every_domain_name_starts_with_its_token` pins it. -- `kind` is a `ScalarKind` (`I16` / `I32` / `I64` / `Numeric` / `Text` / - `Jsonb`), which carries the Rust type name, the `MIN`/`MAX`/zero symbols, - and the numeric bounds. Only the integer kinds have an i128 range with - `Min`/`Max`/`Zero` sentinels; the bounded accessors `panic!` on the - others (a misuse guard, gated by `is_int()`). -- `domains` is a non-empty `&[DomainSpec]` (pinned by - `every_type_has_at_least_one_domain`). Each `DomainSpec` is a `suffix` - plus a `&[Term]`; the storage domain is `suffix: ""` with no terms. -- `fixtures` is a `&[Fixture]` (see §3a). - -The `DomainSpec` declares nothing else — no extractor names, no operator -lists, no REQUIRE edges. Every behavioural fact comes from the `Term` -enum. - -Domains may be **twinned** (`int4_ord` and `int4_ord_ore` both carry -`&[Term::Ore]`). The generator emits them as independent domains with -byte-identical SQL modulo type name (`ordered_files_byte_identical_modulo_typename`). -Twins exist so callers can choose a name that documents intent ("ordered, -regardless of mechanism" vs "ordered via ORE block") without committing to -one term family in a future migration. - -Catalog order is significant. The generator iterates `CATALOG` in order -(driving generation order), and iterates each spec's `domains` slice in -order — that order shows up in the generated `_types.sql` `DO` block. - -### 3a. The `fixtures` field - -The `fixtures` field is an ordered `&[Fixture]` — the single source of -truth for the type's plaintext fixture list, consumed by the SQLx fixture -generator and the matrix oracle. A `Fixture` is value-kind tagged: -`Min` / `Max` / `Zero` (the integer matrix pivots, resolved per-kind), -`Int(i128)` (an integer literal), and `Numeric`/`Text`/`Jsonb` string -variants. The `fixtures!` macro range-checks each `Int` literal against the -kind at compile time (`N(-40000)` for an `i16` kind does not compile): - -```rust -const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; - Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), - N(42), N(50), N(100), N(250), N(1000), N(9999), Max); -``` - -Catalog `#[test]`s enforce a **distinct-plaintext contract** plus the -matrix-pivot requirement: `fixture_values_are_distinct_by_resolved_number` -rejects duplicates against the resolved value (so both copy-paste dups and -sentinel/literal aliases fail), `fixtures_include_min_max_and_zero` requires -`Min`, `Max`, and zero for integer kinds, and -`every_fixture_value_is_within_kind_bounds` keeps every resolved value in -range. These are the compile/test-time analogue of the old `load_spec` -validation. - -The plaintext value list is **not** rendered to a generated file. The -`int_values!` macro (next to `CATALOG`) materialises a `Fixture` list into -a typed `pub const _VALUES: &[]` at compile time -(`INT4_VALUES`, `INT2_VALUES`). Both consumers reference that single symbol -— the fixture generator and the matrix oracle's `FIXTURE_VALUES` — so the -oracle cannot drift from the values the generator encrypts. There is no -committed `_values.rs`: a Rust source of truth does not round-trip -through generated Rust. (The old generated, committed file is gone.) The -exact materialised list is pinned by the catalog's `values_tests`. - -## 4. Term catalog - -The `Term` enum (`crates/eql-scalars/src/lib.rs`) defines every term the -materializer recognises. The `json_key`/`extractor`/`returns`/`ctor` -values are the cross-schema SQL contract — changing one is a generated-SQL -behaviour change, not a refactor. - -| Term | JSON key | Extractor | Returns | Operators | -| ----- | -------- | ----------- | -------------------------------- | -------------------------- | -| `Hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` `<>` | -| `Ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | - -The index-term return types (`eql_v2.hmac_256`, -`eql_v2.ore_block_u64_8_256`) live in `eql_v2` and are referenced -cross-schema; the domains, extractors, and wrappers live in `eql_v3`. - -Adding a term is a code change to the `Term` enum's `impl` methods -(`json_key`, `extractor`, `returns`, `ctor`, `role`, `operators`, -`requires`) with matching `#[test]`s (`term_tests` / `term_helper_tests`) -— never a free-form catalog field. The `Term` enum is the only source of -operator support, extractor identity, and REQUIRE edges; a `DomainSpec` is -a thin selector over it. - -## 5. The operator surface - -`crates/eql-codegen/src/operator_surface.rs` enumerates the 20-operator -surface every generated domain declares (`OPERATORS`): - -- **Comparison operators**: `=` `<>` `<` `<=` `>` `>=` `@>` `<@` -- **Path-selector operators**: `->` `->>` -- **Native `jsonb` operators**: `?` `?|` `?&` `@?` `@@` `#>` `#>>` `-` `#-` `||` - -Each operator carries its PostgreSQL-shaped signatures. The comparison -operators use the three symmetric shapes — `(domain, domain)`, -`(domain, jsonb)`, `(jsonb, domain)`; the path and native operators use -only the shapes PostgreSQL exposes for `jsonb` itself. Summed across all -20 operators, that is **44 `CREATE OPERATOR` statements per domain** -(`operators_file_has_forty_four`). - -Whether an operator routes to a wrapper or a blocker is a per-domain -decision driven by the domain's terms (`Term::operators_for_terms`), not a -property of the operator. Supported operators are emitted with full planner -metadata (`COMMUTATOR`, `NEGATOR`, `RESTRICT`, `JOIN` selectivity -estimators) and back onto inlinable wrappers; unsupported operators carry -minimal metadata and back onto blockers (`operator_entry` only renders -metadata when the operator is supported on that domain). - -Path operators always back onto blockers — neither current term enables -them. The native `jsonb` operators are blocker-only. Untyped string -literals are a PostgreSQL resolver edge: `? 'c'` can still select the -built-in `jsonb` operator, while `? 'c'::text` and bound text parameters -select the generated blocker. - -A live-DB structural guard -(`tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs`) -queries `pg_operator` for every operator with a `jsonb` argument and -asserts the set is a subset of the surface this module enumerates, so a -future PostgreSQL version that adds a `jsonb` operator nobody enumerated -here fails the test rather than silently routing an encrypted column to -native plaintext-`jsonb` semantics. The `operator_surface` unit tests pin -the Rust surface (20 operators, signatures, metadata); the live-DB test -mirrors it. - -## 6. Generated outputs - -For a type with `D` domains of which `A` are ordered (ord-capable), the -generator writes `1 + 2D + A` SQL files into -`src/encrypted_domain//`. For `int4` (`D = 4`, `A = 2`): eleven SQL -files. The SQL outputs are **gitignored** — -`.gitignore` excludes `src/encrypted_domain/*/*_{types,functions,operators,aggregates}.sql`, -and `tasks/build.sh` regenerates them at the start of every build. There is -**no per-type codegen task**: one `cargo run -p eql-codegen` regenerates -every catalog type in a single deterministic run. - -| File | Content | -| --------------------------------- | ---------------------------------------------------------------------------------------- | -| `_types.sql` | Single idempotent `DO` block creating every domain; each domain `CHECK` pins the payload version (`VALUE->>'v' = '2'`) and required envelope/ciphertext/term keys; one `--! @brief` per domain | -| `_functions.sql` | One extractor per unique term, then 44 wrappers-or-blockers covering the surface | -| `_operators.sql` | 44 `CREATE OPERATOR` statements with planner metadata on supported ops | -| `_aggregates.sql` | MIN/MAX state functions + `CREATE AGGREGATE`; emitted only for ordered (ord-capable) domains | - -Every file: - -- Opens with the `-- AUTOMATICALLY GENERATED FILE.` marker (the project-wide - marker `docs:validate` greps on to skip generated SQL — - `crates/eql-codegen/src/consts.rs`). -- Declares its `-- REQUIRE:` edges in dependency order — types files - require `src/schema-v3.sql`; function files require schema, types, and - `src/encrypted_domain/functions.sql` plus each term's `requires` set; - operator files require `src/schema-v3.sql`, types, and their domain's - function file; aggregate files require `src/schema-v3.sql`, types, and - their domain's function and operator files. -- Carries Doxygen `--! @file` / `--! @brief` headers describing its role. - -### Function-count totals per domain - -| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | -| ---------------- | ---------: | -------: | -------: | --------: | --------: | -| none | 0 | 0 | 44 | 44 | 44 | -| `&[Term::Hm]` | 1 | 6 | 38 | 45 | 44 | -| `&[Term::Ore]` | 1 | 18 | 26 | 45 | 44 | - -Six wrappers for `Hm` = `=` and `<>` × three shapes. Eighteen for `Ore` -= six operators × three shapes. The 44-operator total never moves; the -wrapper/blocker split is what shifts, and native `jsonb` fallback -operators are always blockers. (Pinned by `storage_functions_file_is_all_blockers`, -`eq_functions_file_counts`, `ore_functions_file_counts`.) - -The table above covers `_functions.sql` only. Ordered domains -additionally emit `_aggregates.sql` — two state functions -(`min_sfunc`, `max_sfunc`) and two `CREATE AGGREGATE` declarations -(`eql_v3.min`, `eql_v3.max`). Each aggregate declares -`combinefunc = ` and `parallel = safe`: min/max are associative, so -the state function doubles as the combine function, enabling partial and -parallel aggregation on large `GROUP BY` ORE workloads with no decryption. - -## 7. Invariants the generator enforces - -The generator's job is partly to write SQL and partly to make incorrect -SQL unreachable. Invariants encoded in the renderers / templates and -guarded by `#[test]`s in `crates/eql-codegen/src/generate.rs`: - -- **Blockers are never `STRICT` and always `plpgsql`.** The - unsupported-operator template emits each blocker as `IMMUTABLE PARALLEL - SAFE` / `LANGUAGE plpgsql` without `STRICT`, so a `NULL` argument still - reaches the `RAISE`. `blockers_are_never_strict_and_always_plpgsql` - asserts the storage domain (all blockers) contains no `STRICT` and as - many `LANGUAGE plpgsql` as `CREATE FUNCTION`. A `LANGUAGE sql` blocker - would be inlinable and could be elided when the result is provably - unused; `plpgsql` is opaque to the planner so the `RAISE` survives. -- **Wrappers and extractors are inlinable SQL.** They emit `LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE` with a single-statement `SELECT` and **no - `SET search_path`** (`inlinable_functions_have_no_set_search_path`). A - pinned `search_path` disables inlining. `tasks/pin_search_path.sql` - recognises these functions structurally — by language (`sql`), volatility - (`IMMUTABLE`), and a jsonb-backed `DOMAIN` argument in the `eql_v3` - schema — and leaves them unpinned, with no per-type edit. -- **Aggregate state functions are the deliberate exception.** `min_sfunc` / - `max_sfunc` are `LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE` *with* - a pinned `SET search_path` (`aggregate_state_functions_are_plpgsql_not_inlinable`). - They are aggregate transition functions, not index expressions, so - pinning is correct; the generated `min` / `max` aggregates are - allowlisted by name in `splinter.sh`. -- **SQL-literal injection is structurally prevented.** Every string - interpolated into a single-quoted SQL literal — payload keys, operator - symbols, domain names in `RAISE` messages — passes through `sql_str` - (`crates/eql-codegen/src/consts.rs`), which doubles embedded single - quotes. Today's catalog strings are all quote-free so it is a no-op, but - it guarantees a future quote-bearing string cannot break out of its - literal (`unsupported_entry_preserves_operator_literal_and_domain_lit_is_escaped`, - `domain_block_escapes_quote_bearing_name`). -- **No domain-over-domain.** Every domain is `CREATE DOMAIN eql_v3. - AS jsonb`, never `AS ` (`types_file_has_all_four_domains`). - PostgreSQL resolves operators against the underlying base type; a derived - domain would silently bypass the fixed operator surface. -- **No operator class on a domain.** The generator emits operators, not - operator classes. Callers index through the extractor function (e.g. - `USING btree (eql_v3.ord_term(col))`), whose return type already carries - a default opclass. -- **Ownership boundary.** `is_generated` recognises owned files by their - header marker; `ensure_generated_paths_writable` refuses to overwrite - anything else, and `clean_generated_files` deletes only files carrying - the marker (`crates/eql-codegen/src/writer.rs`). A hand-written file at a - generated path is a hard error, not a silent clobber. Stale generated - files for removed domains are cleaned before the new files land. - -## 8. Extension files - -`_extensions.sql` is the hand-written sibling. The generator never -creates, lists, or cleans it; it has no auto-generated header and must -declare its own `-- REQUIRE:` edges. Use it for behaviour that's specific -to the type and not part of the fixed surface — e.g. cross-domain casts, -helper functions, type-specific constraints. Unlike the generated -siblings, `_extensions.sql` IS committed. (Neither `int4` nor `int2` -ships one today — there is no committed `*_extensions.sql` in the tree.) - -`tasks/pin_search_path.sql` describes the fallback marker for -inline-critical extension functions that take no domain argument and so -escape the structural skip: - -```sql -COMMENT ON FUNCTION eql_v2.my_helper(...) IS 'eql-inline-critical: ...'; -``` - -The generator does **not** emit this marker; every function it produces -takes a domain argument and is covered by the structural skip -intrinsically. - -## 9. Lint and test integration - -The generator depends on two pieces of build tooling recognising its -output without per-type edits: - -- **`tasks/pin_search_path.sql`** — structural skip identifies - encrypted-domain functions by language (`sql`), volatility (`IMMUTABLE`), - and the presence of at least one argument typed as a jsonb-backed - `DOMAIN` in the `eql_v3` schema. New scalar types need no edit here. -- **`tasks/test/splinter.sh`** — name-based allowlist. The converged - wrapper / extractor names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, - `eq_term`, `ord_term`) plus the generated `min` / `max` aggregates are - covered by `eql_v3`-schema entries. Splinter matches by name only, so a - new scalar type that uses the catalog extractors inherits coverage. - Adding a new term whose extractor has a new name requires a splinter - entry. - -## 10. Tests - -The generator's tests are Rust, run by `mise run test:codegen` -(`cargo test -p eql-scalars -p eql-codegen`) — no database required. The -broader `mise run test:crates` adds `cargo clippy ... -D warnings`. - -- **`eql-scalars` unit tests** — `rust_tests`, `term_tests`, - `term_helper_tests`, `fixture_tests`, `catalog_tests`, `invariant_tests`, - `values_tests` over `CATALOG`, the `Term`/`ScalarKind`/`Fixture` impls, - and the materialised `_VALUES` consts - (`crates/eql-scalars/src/lib.rs`). -- **`eql-codegen` unit tests** — file counts, language/volatility - invariants, escaping guards, and twin byte-identity - (`crates/eql-codegen/src/generate.rs` `#[cfg(test)]` module). -- **The parity gate** — `mise run codegen:parity` - (`tasks/codegen-parity.sh`). It runs `cargo run -p eql-codegen` into the - real tree, then: - 1. compares the int4 generated SQL **file set** against the golden under - `tests/codegen/reference/int4/*.sql`, excluding committed hand-written - files (`comm -23` of `ls` against `git ls-files`), so an extra or - dropped generated file fails; and - 2. diffs each golden file **byte-for-byte** against its generated - counterpart, after dropping the golden's single leading - `-- REFERENCE:` provenance line (`tail -n +2`). Both bodies start with - the `-- AUTOMATICALLY GENERATED FILE.` marker, so no header strip is - needed. - The same byte-for-byte assertion runs in-crate as - `crates/eql-codegen/tests/parity.rs` (`rust_generator_matches_int4_golden_files`) - and in the `generate.rs` golden tests. The golden reference — not any - Python oracle — is the sole contract that survives generator refactors. - -CI runs these in three jobs in `.github/workflows/test-eql.yml`: the -`test:crates` job (`Rust workspace crates`) compiles/lints/tests the -crates, the `codegen` job (`Encrypted-domain codegen`) runs `mise run -codegen:parity`, and the `matrix-coverage` job runs `mise run -test:matrix:inventory`. The codegen job is a prerequisite of the -PostgreSQL test matrix, so generated-SQL drift fails CI before any database -test runs. - -## 11. Adding a new scalar type - -From a generator perspective: - -1. **Add a `ScalarSpec` row to `eql_scalars::CATALOG`** - (`crates/eql-scalars/src/lib.rs`) — `token`, `kind`, the `domains` - slice, and the `fixtures` list. Term names must be `Term` variants and - the kind must be a `ScalarKind` variant, or it does not compile. If the - type needs a new scalar width, add a `ScalarKind` variant (with its - rust-type name, `MIN`/`MAX`/zero symbols, and bounds) and unit-test its - `impl`. New term behaviour belongs in the `Term` enum's `impl`, not in - catalog data. -2. **Materialise the value list** with `int_values!(_VALUES, , - );` next to `CATALOG`, and pin it with a `values_tests` - assertion. This is the single source the SQLx matrix reads as - `FIXTURE_VALUES`. There is nothing to regenerate-and-commit on the test - side — it is a compile-time const, not a generated file. -3. **Regenerate.** `cargo run -p eql-codegen` (or just `mise run build` — - the build runs the generator first). One run regenerates every catalog - type; there is no per-type codegen task. The generated - `*_{types,functions,operators,aggregates}.sql` are gitignored and never - committed. -4. **Hand-write** `_extensions.sql` if the type needs SQL beyond the - fixed surface, with explicit `-- REQUIRE:` edges. This file IS committed. -5. **Do not add a `tests/codegen/reference//` baseline.** `int4` is - the sole golden master for the type-generic generator: the templates are - pure token substitution, so a per-type baseline can only fail where - `int4`'s already would. Drift protection for the new type comes from the - `int4` reference (shared templates + `Term` enum), the catalog - `values_tests` pinning the materialised `_VALUES`, the - catalog/generator `#[test]`s, and the `ordered_numeric_matrix!` SQLx - suite (behaviour, not bytes). -6. **Wire the SQLx matrix oracle and snapshot the inventory.** The - implementation spec §2 lists the hand-maintained registration files. - Then run `mise run test:matrix:inventory`: it normalizes each present - type's `scalars::::*` test-name set to ``, asserts it equals - the single canonical `tests/sqlx/snapshots/matrix_tests.txt`, and - cross-checks the present type set against `cargo run -p eql-codegen -- - list-types`. There is **no per-type snapshot** — the per-type - `_matrix_tests.txt` files were collapsed into one token-normalized - snapshot. You only regenerate `matrix_tests.txt` when the macro's - emitted name set itself changes. A catalog type added without its matrix - wiring fails the cross-check (catalog has the type, binary has no - `scalars::::` tests). See `tests/sqlx/snapshots/README.md` and - the implementation spec §2 / §8. - -Adding a new **term** is a bigger move — edit the `Term` enum's `impl` -methods, add `#[test]`s, audit `splinter.sh` for a name collision if the -extractor name is new, and (because it changes the int4 surface) update the -golden reference under `tests/codegen/reference/int4/`. - -## 12. Out of scope - -`text` and `jsonb` are not materialised through this generator. The -`ScalarKind` enum carries `Text`/`Numeric`/`Jsonb` variants and the -`Fixture` enum carries their string-backed shapes at the capability layer, -but `CATALOG` declares only the integer scalars today, so no `text`/`jsonb` -SQL surface is generated. Text and JSONB encrypted behaviour lives on the -composite `eql_v2_encrypted` type and its hand-written operator surface in -`src/encrypted/` and `src/operators/`, not the scalar materializer. -`jsonb` in particular needs a separate SQL design beyond this -ordered-scalar materializer. diff --git a/docs/reference/encrypted-domain-implementation-spec.md b/docs/reference/encrypted-domain-implementation-spec.md deleted file mode 100644 index cf1a4b19b..000000000 --- a/docs/reference/encrypted-domain-implementation-spec.md +++ /dev/null @@ -1,400 +0,0 @@ -# Encrypted Domain Type Implementation Spec - -This is the scalar encrypted-domain generator contract used by `int4`. -It applies to scalar domains whose searchable payloads are represented by -the fixed `Term` catalog in `crates/eql-scalars/src`. - -`text` and `jsonb` are outside this scalar materializer. - -## 1. Model - -Each generated domain is a concrete `jsonb` domain in the `eql_v3` -schema named `eql_v3.` (dropped by `DROP SCHEMA eql_v3 CASCADE`; -survives an `eql_v2` uninstall). A type's catalog row is intentionally -small — a `ScalarSpec` whose `domains` field lists each generated domain -as a `DomainSpec` (a `suffix` plus the fixed terms it carries): - -```rust -ScalarSpec { - token: "int4", - kind: ScalarKind::I32, - domains: &[ - DomainSpec { suffix: "", terms: &[] }, - DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, - DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, - DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, - ], - fixtures: &[/* see §9 */], -} -``` - -The `token` supplies the type token; each domain's full name is `token` -+ `suffix`. The generator emits domains in the order the `domains` slice -declares them, so order the slice the way you want the generated output to -read. Term capabilities are fixed by the `Term` enum -(`crates/eql-scalars/src`): - -| Term | JSON key | Extractor | Return type | Supported operators | -|---|---|---|---|---| -| `Hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` / `<>` | -| `Ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` / `<>` / `<` / `<=` / `>` / `>=` | - -For current `int4`, domains carrying `Ore` use JSON key `ob`, extractor -`ord_term`, and the ORE block supports equality plus ordering. A type -that needs a non-ORE equality term on an ordered domain needs a new -`Term` design, not a catalog flag. - -The row above declares two ordered domains, `int4_ord` and -`int4_ord_ore`, carrying the same term. They are intentional twins: the -generator emits byte-identical SQL (modulo type name) so callers can pick -a name that documents intent without committing to a term family in a -future migration. - -## 2. Checklist - -- [ ] Add a row to the Rust catalog `eql-scalars::CATALOG` - (`crates/eql-scalars/src/lib.rs`). A `ScalarSpec` declares: - - - `token` — the type token (e.g. `int8`); supplies `` everywhere. - - `kind` — the `ScalarKind` (`I16` / `I32` / `I64`), which carries the - Rust type name, the `MIN`/`MAX`/zero symbols, and the numeric bounds. - - `domains` — a `&[DomainSpec]`, each a `suffix` + the fixed `Term`s it - carries. The storage domain is suffix `""` with no terms; `_eq => [Hm]`; - `_ord` and `_ord_ore => [Ore]`. - - `fixtures` — the `Fixture` value list (see §9). It MUST include `Min`, - `Max`, and zero. - - Terms determine operator support: `Hm` provides `=` / `<>`; `Ore` - provides `=` / `<>` / `<` / `<=` / `>` / `>=`. There is no TOML manifest - and no Python: the catalog is the source of truth, validated by the - compiler (an undefined `Term` or unknown `ScalarKind` is a compile error) - plus catalog `#[test]`s over `CATALOG`. -- [ ] Materialise the type's plaintext fixture list as a typed const next to - `CATALOG`: add `int_values!(_VALUES, , );` (e.g. - `int_values!(INT8_VALUES, i64, INT8);`). The macro resolves the row's - `Fixture` list into a compile-time `&'static []` — the single source the - SQLx matrix reads as `FIXTURE_VALUES`. Pin the exact list with a - `values_tests` assertion. This replaces the old generated, committed - `_values.rs`. -- [ ] **If `` needs a new scalar width**, add a `ScalarKind` enum variant in - `crates/eql-scalars/src/lib.rs` with its rust-type name, `MIN`/`MAX`/zero - symbols, and numeric bounds, and unit-test its `impl` methods. New term - behaviour likewise belongs in the `Term` enum's `impl` methods with tests - — not in free-form catalog data. -- [ ] Run `cargo run -p eql-codegen` to materialise the generated SQL - (`src/encrypted_domain//_{types,functions,operators,aggregates}.sql`, - gitignored), or just `mise run build` — every build runs the generator - first. There is no per-type codegen task: one run generates every type from - `CATALOG`. The plaintext fixture list is **not** generated — it is - materialised from the catalog row at compile time (see the next step), so - there is nothing to regenerate-and-commit on the test side. -- [ ] Generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / - `*_aggregates.sql` are gitignored and never committed. The catalog - (`eql-scalars::CATALOG`) plus the `eql-codegen` renderers are the source - of truth. Change the catalog and rebuild; do not hand-edit generated SQL. -- [ ] Put optional hand-written SQL in - `src/encrypted_domain//_extensions.sql` with explicit - `-- REQUIRE:` edges. This file IS committed. -- [ ] Do **not** add a `tests/codegen/reference//` baseline. `int4` is the - single golden master for the type-generic generator: the SQL templates are - pure token substitution, so a per-type baseline can only fail when `int4`'s - already would. Drift protection for the new type comes from the `int4` - reference, the catalog `values_tests` pinning the materialised - `eql_scalars::_VALUES` const, the catalog/generator `#[test]`s - (`cargo test -p eql-scalars -p eql-codegen`), and the - `ordered_numeric_matrix!` SQLx suite (behaviour, not bytes). -- [ ] Wire the SQLx matrix oracle. The generated SQL is enough to install the - domains, but the `ordered_numeric_matrix!` suite only runs once the Rust - harness knows about the scalar. Copy each piece from the `int4` - reference — these are hand-maintained registration lists (the Phase-4 - `scalar_types!` registry, a separate plan, will collapse them): - - | File | Add | - |------|-----| - | `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for the scalar's Rust type: `impl Sealed for {}`, a `PlaintextSqlType` const for its base column type, `impl EqlPlaintext for ` (`CAST`, `PLAINTEXT_SQL_TYPE`, `to_plaintext` → the right `Plaintext` variant), plus the two `#[test]` casts. | - | `tests/sqlx/src/fixtures/eql_v2_.rs` | `use eql_scalars::_VALUES as VALUES;` then `crate::scalar_fixture!("eql_v2_", , VALUES);`. | - | `tests/sqlx/src/fixtures/mod.rs` | `pub mod eql_v2_;`. | - | `tests/sqlx/tests/generate_all_fixtures.rs` | An arm in `generate_for_token`: `"" => fixtures::eql_v2_::spec().run().await,`. The match is exhaustive over the catalog — a catalog token with no arm fails the generator loudly. | - | `tests/sqlx/src/scalar_domains.rs` | `impl ScalarType for ` — `PG_TYPE` (the base PG type, e.g. `"int8"`) and `FIXTURE_VALUES = eql_scalars::_VALUES`. | - | `tests/sqlx/tests/encrypted_domain/scalars/.rs` | `ordered_numeric_matrix! { suite = , scalar = , eql_type = "eql_v2_" }`. | - | `tests/sqlx/tests/encrypted_domain/scalars/mod.rs` | `pub mod ;`. | - - `` is the scalar's Rust type (`i32` for `int4`, `i16` for `int2`). - Forget one and the matrix simply does not run for the type — the matrix - inventory cross-check (next step) surfaces it, because the catalog has the - type but the binary has no `scalars::::` tests. -- [ ] Run `mise run test:matrix:inventory`. It verifies every present type's - token-normalized `scalars::::*` name set equals the single canonical - `tests/sqlx/snapshots/matrix_tests.txt`, and cross-checks the present type - set against `cargo run -p eql-codegen -- list-types`. You do **not** edit a - per-type snapshot — there is one canonical snapshot; you only regenerate it - when the macro's emitted name set itself changes. A catalog type missing - its matrix wiring fails the cross-check. See §8 and - `tests/sqlx/snapshots/README.md`. -- [ ] Run `mise run test:codegen` (`cargo test -p eql-scalars -p eql-codegen`), - the relevant SQLx suites, and the PostgreSQL matrix before merging. - -## 3. Domain Generation - -The generator emits `src/encrypted_domain//_types.sql` (gitignored; -materialised on every `mise run build` and every `cargo run -p eql-codegen`) -with one idempotent `DO $$ ... $$` block. Domain `CHECK` -constraints always require: - -- fixed envelope keys `v` and `i`; -- ciphertext key `c`; -- catalog JSON keys for the listed terms; -- the envelope version value: `VALUE->>'v' = '2'`, matching the repo-wide - `eql_v2._encrypted_check_v` rule (`src/encrypted/constraints.sql`). - -For example, a domain with `["ore"]` requires `v`, `i`, `c`, and `ob` present, -with `v` pinned to `2`. Beyond key presence and the version value, a malformed -term can still fail later inside its extractor unless a future catalog design -adds stronger validation. - -Every generated domain is a concrete domain over `jsonb` in the `eql_v3` -schema. Do not define one generated domain over another generated domain; -PostgreSQL resolves operators against the underlying base type in ways -that bypass the fixed operator surface. - -## 4. Extractors And Wrappers - -Extractor names and return types come from the `Term` enum -(`crates/eql-scalars/src`), not from catalog data. Generated extractors and -supported comparison wrappers are inline-friendly SQL functions: - -```sql -LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT ... $$; -``` - -Extractors and comparison wrappers must not carry a pinned `search_path` -— a `SET` clause disables inlining and reverts index-backed queries to -seq scans. The build tooling recognises these generated functions -structurally, so the generator does not emit `eql-inline-critical` -markers. Aggregate state functions are the one deliberate exception — see -§5 — because they are never index expressions. - -Unsupported operators route to blockers. Blockers are `plpgsql`, -`IMMUTABLE`, `PARALLEL SAFE`, and intentionally not `STRICT`. Both -choices are deliberate: - -- **`plpgsql`, not `sql`.** A `LANGUAGE sql` body would be inlinable, and - the planner could elide the call when the result is provably unused - (dead `CASE` branch, folded predicate), letting a blocked operator - appear to succeed. `plpgsql` is opaque to the planner, so the call — - and its `RAISE` — always survives. -- **Not `STRICT`.** A `STRICT` blocker lets PostgreSQL skip the body and - return `NULL` on a `NULL` argument, silently bypassing the - unsupported-operator exception. - -## 5. Operators - -Every generated domain declares supported scalar comparison operators plus -blockers for the native `jsonb` operator surface that PostgreSQL could -otherwise reach through domain-to-base-type fallback. Each domain emits -44 `CREATE OPERATOR` statements. Supported operators route to wrappers; -everything else routes to blockers. - -| Operators | Forms | -|---|---| -| `=` `<>` `<` `<=` `>` `>=` `@>` `<@` | `(domain, domain)` · `(domain, jsonb)` · `(jsonb, domain)` | -| `->` `->>` | `(domain, text)` · `(domain, integer)` · `(jsonb, domain)` | -| `?` | `(domain, text)` | -| `?\|` `?&` | `(domain, text[])` | -| `@?` `@@` | `(domain, jsonpath)` | -| `#>` `#>>` `#-` | `(domain, text[])` | -| `-` | `(domain, text)` · `(domain, integer)` · `(domain, text[])` | -| `\|\|` | `(domain, domain)` · `(domain, jsonb)` · `(jsonb, domain)` | - -Function counts: - -| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | -|---|---:|---:|---:|---:|---:| -| none | 0 | 0 | 44 | 44 | 44 | -| `hm` | 1 (`eq_term`) | 6 | 38 | 45 | 44 | -| `ore` | 1 (`ord_term`) | 18 | 26 | 45 | 44 | - -Supported comparison operators carry planner metadata such as -`COMMUTATOR`, `NEGATOR`, `RESTRICT`, and `JOIN`. Blocker operators keep -minimal metadata because they should never be planner-visible supported -paths. - -PostgreSQL's operator resolver still prefers the built-in `jsonb` operator -for untyped string literals in forms such as `payload::eql_v3.int4 ? 'c'`. -Use typed parameters or explicit casts (`'c'::text`) to route those forms -to the generated blocker. The generated surface blocks the typed native -operator shapes exposed by the catalog. - -### Aggregates - -Each ordered (ord-capable) domain additionally gets a generated -`_aggregates.sql` file declaring `MIN` / `MAX`: - -- two state functions, `eql_v3.min_sfunc` and `eql_v3.max_sfunc`, and -- two aggregates, `eql_v3.min()` and `eql_v3.max()`. - -Comparison routes through the domain's `<` / `>` operator (the ORE block -term — no decryption). The state functions are `LANGUAGE plpgsql -IMMUTABLE STRICT PARALLEL SAFE` **with** a pinned `SET search_path`. This is -the one place the "no pinned `search_path`" rule of §4 does not apply: -aggregate transition functions are never index expressions, so pinning is -correct. `STRICT` makes PostgreSQL seed the running state with the first -non-NULL value and skip NULLs, so an all-NULL group returns NULL. - -Each `CREATE AGGREGATE` declares `combinefunc = ` and -`parallel = safe`: min/max are associative, so the state function doubles as -the combine function, and with a `PARALLEL SAFE` sfunc/combinefunc -PostgreSQL can use partial and parallel aggregation on the large `GROUP BY` -ORE workloads these aggregates exist to serve — still with no decryption. -Storage-only and equality-only domains have no comparator and emit no -aggregate file. - -## 6. Extension Files - -Optional hand-written SQL beyond the fixed scalar surface belongs in: - -```text -src/encrypted_domain//_extensions.sql -``` - -The generator must not create this file, list it in the catalog, add an -auto-generated header, or clean it during regeneration. The file must -declare its own `-- REQUIRE:` edges, usually to `_types.sql` and -whichever generated function or operator file it extends. Unlike the -generated siblings, `_extensions.sql` IS committed. - -## 7. Indexing - -Do not create operator classes on generated domains. Index through -the extractor: - -```sql -CREATE INDEX ... ON table_name USING btree (eql_v3.ord_term(col)); -CREATE INDEX ... ON table_name USING hash (eql_v3.eq_term(col)); -``` - -The extractor return type must already have the needed PostgreSQL access -method support. `ore` depends on -`src/ore_block_u64_8_256/functions.sql` and -`src/ore_block_u64_8_256/operators.sql`; `hm` depends on -`src/hmac_256/functions.sql`. - -## 8. Tests - -Cover each generated domain with SQLx tests appropriate to its terms: - -- supported operators return correct rows for all argument forms; -- unsupported operators raise the expected error for all forms; -- blockers raise on `NULL` input; -- supported wrappers return `NULL` for `NULL` operands; -- functional indexes engage and return correct rows; -- constant-on-left comparisons engage the index where applicable; -- domain `CHECK` rejects non-object and under-populated payloads; -- real typed columns are tested, not only cast literals; -- generated ordered-domain twins remain byte-identical modulo type name - (the shared generator is anchored by the `int4` golden master in - `tests/codegen/reference/int4/` via the eql-codegen parity test; - new types add no baseline of their own — see §2). - -For ordered numeric scalars this coverage is generated by the -`ordered_numeric_matrix!` convention wrapper in `tests/sqlx/src/matrix.rs`: -one `impl ScalarType` (`tests/sqlx/src/scalar_domains.rs`) plus a single -invocation taking `suite`, `scalar`, and `eql_type`. The matrix derives -its comparison pivots — the scalar's `MIN`, `MAX`, and zero -(`Default::default()`) — from the type rather than a hand-written list, so -the invocation carries no pivot argument. Equality-only scalars use the -sibling `eq_only_scalar_matrix!`. The `matrix.rs` module header is the -canonical, current list of the test categories the matrix emits (sanity, -correctness, cross-shape, supported-NULL, blocker raises, index engagement, -ORDER BY, ORDER BY USING) — read it rather than maintaining a duplicate -count here. - -For ordered `int4`, keep the assertion that distinct plaintext values -produce distinct ORE blocks. Do not add assertions for term behavior that -the catalog does not promise. - -### Matrix coverage inventory snapshot - -The *set of test names* the matrix emits is guarded by ONE committed, -token-normalized snapshot at `tests/sqlx/snapshots/matrix_tests.txt` — the -sorted inventory of every `scalars::::*` test name with the type token -replaced by the literal ``. (The per-type `_matrix_tests.txt` files are -gone: they were byte-identical modulo the token, so one canonical set plus a -per-type normalize-and-compare carries the same signal at a fraction of the -committed surface.) This is the guard that catches a silently dropped, renamed, -or `#[cfg]`-gated matrix test, a behaviour the SQLx assertions above cannot see. -The snapshot is a committed test baseline, **not** gitignored generated SQL. - -`mise run test:matrix:inventory` discovers the present scalar types from the -`encrypted_domain` binary's `--list`, normalizes each type's token to ``, -asserts every type's set equals the canonical snapshot, and cross-checks the -discovered type set against `cargo run -p eql-codegen -- list-types` (the catalog -is the single source). The CI `matrix-coverage` job gates it. **`tests/sqlx/snapshots/README.md` -is the source of truth** for the mechanics (pinned feature set, the catalog -cross-check, the CI diff, and when to regenerate); see it rather than -duplicating the detail here. - -## 9. Fixtures - -Fixture generation should use real encrypted payloads produced through -CipherStash Proxy. A single payload table may carry every term needed by -the generated domains for that type. For `int4`, the payloads carry `c`, -`hm`, and `ob`; the equality domain reads `hm`, and ordered domains read -`ob`. - -Choose values so range operators produce distinguishable result counts, -include useful boundaries, and cover omitted-term negative cases. For a -scalar driven by `ordered_numeric_matrix!`, the fixture **must** include -the type's `MIN`, `MAX`, and zero (`Default::default()`): the matrix uses -those three as comparison pivots and fetches each one's ciphertext from the -fixture via `fetch_fixture_payload`, which fails loudly if the row is -absent. - -### Single-sourcing the value list - -The plaintext value list is declared **once**, in the catalog row's `fixtures` -field, and materialised into a typed Rust const — never hand-maintained in two -places: - -```rust -fixtures: &[Fixture::Min, Fixture::N(-100), Fixture::N(-1), Fixture::Zero, - Fixture::N(1), Fixture::N(2), Fixture::N(5), Fixture::N(10), - Fixture::N(17), Fixture::N(25), Fixture::N(42), Fixture::N(50), - Fixture::N(100), Fixture::N(250), Fixture::N(1000), - Fixture::N(9999), Fixture::Max], -``` - -`Fixture::Min` / `Fixture::Max` / `Fixture::Zero` resolve to the scalar's Rust -named consts (for `int4`: `i32::MIN`, `i32::MAX`, `0`); every `Fixture::N(_)` is -a numeric literal validated against the `ScalarKind`'s representable range by a -catalog `#[test]` (`numeric_value` is infallible, so the range check is the -explicit invariant `every_fixture_value_is_within_kind_bounds`). The same test -enforces the matrix invariant: the set **must** include `Min`, `Max`, and zero, -or the test fails (the compile-time analogue of the old `load_spec` validation). - -The `int_values!` macro (in `crates/eql-scalars/src/lib.rs`) materialises that -`Fixture` list into a `pub const _VALUES: &[]` at compile -time, sitting next to `CATALOG`. Both consumers reference that single symbol — -the fixture generator (`fixtures::eql_v2_::spec`) and the matrix oracle -(`impl ScalarType for { const FIXTURE_VALUES = eql_scalars::_VALUES }`) -— so the oracle cannot drift from the values the generator encrypts. There is no -generated `_values.rs`: a Rust source of truth does not round-trip through -generated Rust. The exact list is pinned by a `values_tests` assertion, and the -`Fixture`-list invariants (`Min`/`Max`/zero present, in-bounds) by the catalog -`#[test]`s. - -## 10. Build And Verification - -- `cargo run -p eql-codegen` (optional; refreshes all generated SQL from the - catalog before a full build) -- `mise run test:codegen` (`cargo test -p eql-scalars -p eql-codegen`) -- `mise run clean && mise run build` (regenerates every type's SQL from - the catalog first, then builds the release artefacts) -- relevant SQLx suites -- `mise run test` across supported PostgreSQL versions -- `mise run --output prefix test:splinter --postgres 17` after a - PostgreSQL 17 install has built EQL - -The CI codegen job should remain a prerequisite of the PostgreSQL test -matrix so generated SQL drift is caught before database tests run. diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index e517e63e5..cfca800cb 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -426,7 +426,7 @@ eql_v2.ste_vec(val jsonb) RETURNS eql_v2_encrypted[] Extract the equality (`hm`) or ordering (`ob`) index term from a scalar encrypted-domain value. Generated per eq/ord-capable variant of every -scalar type — see [Encrypted-Domain Code Generator](./encrypted-domain-generator.md). +scalar type — see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md). The argument type selects the overload, and both are inlinable so a functional index built on the extractor engages. The extractors live in the `eql_v3` schema; their return types remain the core `eql_v2` @@ -449,7 +449,7 @@ CREATE INDEX ON users USING btree (eql_v3.ord_term(salary_encrypted)); > The full per-domain operator/wrapper/blocker surface (and the > `eql_v3.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is > documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v3t) -> and the [generator reference](./encrypted-domain-generator.md). +> and the [scalar encrypted-domain type reference](./adding-a-scalar-encrypted-domain-type.md). --- diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index d15be2ee0..c52048507 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -61,7 +61,7 @@ Use the equivalent [`jsonb_path_query`](#jsonb-functions-and-selectors-enabled-b ## Encrypted-domain scalar types (`eql_v3.`) -Scalar encrypted-domain types (e.g. `eql_v3.int4`; see the [generator reference](./encrypted-domain-generator.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types remain the core `eql_v2` types. +Scalar encrypted-domain types (e.g. `eql_v3.int4`; see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types remain the core `eql_v2` types. Each scalar type `` generates one storage-only variant plus eq/ord query variants: diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index ae7204ab5..186d6d5cb 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -12,7 +12,7 @@ The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the The golden reference, not any retired generator, is the sole oracle. If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (commit the new `int4` reference in the same PR). -See `docs/reference/encrypted-domain-generator.md` for the full generator story (manifest-free catalog, templates, term capabilities). +See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §6 for the full generator story (catalog source of truth, minijinja templates, term capabilities). ## No committed fixture values diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 213b034f1..ed363608b 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -60,8 +60,9 @@ catalog cross-check) fails the job. ## When you must update this - **Adding a new scalar type** → add the catalog row in - `eql-scalars::CATALOG`, wire the SQLx matrix oracle (see the implementation - spec §2), then run `mise run test:matrix:inventory`. If the new type's + `eql-scalars::CATALOG`, wire the SQLx matrix oracle (see + `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3), then run + `mise run test:matrix:inventory`. If the new type's normalized name set matches the canonical snapshot (it will, for a standard `ordered_numeric_matrix!` type), no snapshot edit is needed — the cross-check just confirms the type is wired. @@ -76,4 +77,4 @@ catalog cross-check) fails the job. | sed -e 's/^scalars::int4::/scalars::::/' -e 's/_int4_/__/g' | LC_ALL=C sort > snapshots/matrix_tests.txt ``` -See `docs/reference/encrypted-domain-implementation-spec.md` §2 and §8. +See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3 (matrix oracle + inventory snapshot). From 1cb4eaa342b699a03fd1ca7f809bd666a22af445 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:11:07 +1000 Subject: [PATCH 059/599] =?UTF-8?q?build:=20always=20run=20codegen=20?= =?UTF-8?q?=E2=80=94=20drop=20mise=20sources/outputs=20incremental=20skip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `#MISE sources`/`outputs` declarations let mise skip the `build` task when it judged the inputs unchanged and the release artefacts already present. Because the encrypted-domain SQL is gitignored and regenerated by `cargo run -p eql-codegen`, a skipped build could ship stale `release/*.sql`. Drop them so the build always regenerates. --- tasks/build.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/tasks/build.sh b/tasks/build.sh index 311dfbc75..ead831849 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,8 +1,6 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" -#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] -#MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" #!/bin/bash From b4d6005985b03543ccf9e2b9fda36d980b135a13 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 12:14:51 +1000 Subject: [PATCH 060/599] refactor(scalars): generate SQLx matrix harness from one declarative list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the seven per-type hand registrations with a single `scalar_harness!` list expanded by the new `eql-tests-macros` proc-macros: the `ScalarType` impls, `eql_v2_` fixture modules, `ordered_numeric_matrix!` suites, and the `generate_for_token` dispatch are all generated from that one list. Derive `EqlPlaintext`'s `CAST` / `PLAINTEXT_SQL_TYPE` from a single `const KIND: ScalarKind` (via `cast_for_kind` / `plaintext_sql_type_for_kind` const-fn defaults), collapsing each impl to `KIND` + `to_plaintext`. Add `eql-tests-macros` to `test:crates` (clippy -D warnings + unit tests). Update the guide §3: adding a type drops from seven harness edits to one `scalar_harness!` line. Test-harness/tooling only — no change to generated SQL or the public API. --- Cargo.lock | 10 + Cargo.toml | 3 + crates/eql-tests-macros/Cargo.toml | 13 + crates/eql-tests-macros/src/lib.rs | 326 ++++++++++++++++++ .../adding-a-scalar-encrypted-domain-type.md | 34 +- mise.toml | 16 +- tests/sqlx/Cargo.toml | 1 + tests/sqlx/src/fixtures/cipherstash.rs | 3 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 47 ++- tests/sqlx/src/fixtures/eql_v2_int2.rs | 12 - tests/sqlx/src/fixtures/eql_v2_int4.rs | 11 - tests/sqlx/src/fixtures/mod.rs | 14 +- tests/sqlx/src/lib.rs | 8 + tests/sqlx/src/scalar_domains.rs | 34 +- tests/sqlx/src/scalar_harness.rs | 63 ++++ .../tests/encrypted_domain/scalars/int2.rs | 14 - .../tests/encrypted_domain/scalars/int4.rs | 14 - .../tests/encrypted_domain/scalars/mod.rs | 12 +- tests/sqlx/tests/generate_all_fixtures.rs | 21 +- 19 files changed, 528 insertions(+), 128 deletions(-) create mode 100644 crates/eql-tests-macros/Cargo.toml create mode 100644 crates/eql-tests-macros/src/lib.rs delete mode 100644 tests/sqlx/src/fixtures/eql_v2_int2.rs delete mode 100644 tests/sqlx/src/fixtures/eql_v2_int4.rs create mode 100644 tests/sqlx/src/scalar_harness.rs delete mode 100644 tests/sqlx/tests/encrypted_domain/scalars/int2.rs delete mode 100644 tests/sqlx/tests/encrypted_domain/scalars/int4.rs diff --git a/Cargo.lock b/Cargo.lock index 2d902e931..3f44eee0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1168,6 +1168,15 @@ dependencies = [ name = "eql-scalars" version = "0.1.0" +[[package]] +name = "eql-tests-macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "eql_tests" version = "0.1.0" @@ -1175,6 +1184,7 @@ dependencies = [ "anyhow", "cipherstash-client", "eql-scalars", + "eql-tests-macros", "hex", "jsonschema", "paste", diff --git a/Cargo.toml b/Cargo.toml index 0baa1aad8..6e0b67604 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,8 @@ # truth for the Rust generator (Plan 2) and the SQLx test # harness (Plan 3). # crates/eql-codegen — the SQL generator binary (stub here; Plan 2 fills it in). +# crates/eql-tests-macros — proc-macros expanding the single scalar-harness +# list into the per-type SQLx-matrix wiring. # tests/sqlx — the existing `eql_tests` SQLx integration crate. # # resolver = "2" keeps the heavy test-crate feature set (sqlx/tokio/cipherstash- @@ -17,6 +19,7 @@ resolver = "2" members = [ "crates/eql-scalars", "crates/eql-codegen", + "crates/eql-tests-macros", "tests/sqlx", ] default-members = ["tests/sqlx"] diff --git a/crates/eql-tests-macros/Cargo.toml b/crates/eql-tests-macros/Cargo.toml new file mode 100644 index 000000000..8c352a9ae --- /dev/null +++ b/crates/eql-tests-macros/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "eql-tests-macros" +version = "0.1.0" +edition = "2021" +description = "Proc-macros that expand a single scalar-harness list into the per-type SQLx-matrix wiring (ScalarType impls, fixture modules, matrix suites, fixture dispatch)." + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "2", features = ["full"] } +quote = "1" +proc-macro2 = "1" diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs new file mode 100644 index 000000000..a2ceb198e --- /dev/null +++ b/crates/eql-tests-macros/src/lib.rs @@ -0,0 +1,326 @@ +//! Proc-macros that expand ONE declarative scalar-harness list into all the +//! per-type SQLx-matrix wiring that used to be hand-maintained across four +//! locations. +//! +//! # Why a proc-macro (and why more than one) +//! +//! Adding a scalar encrypted-domain type used to require editing several +//! files in lock-step (see +//! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). The harness +//! wiring — everything *except* the catalog row in `eql-scalars` and the +//! `EqlPlaintext` impl, which are owned by a separate task — is now driven by +//! a SINGLE list, e.g.: +//! +//! ```ignore +//! eql_tests::scalar_harness! { +//! int4 => i32, +//! int2 => i16, +//! int8 => i64, +//! } +//! ``` +//! +//! Rust macros emit code into the crate/module where they are invoked, and the +//! harness pieces live in three *different* compilation contexts: +//! +//! 1. the `ScalarType` impls + the fixture modules live in the `eql-tests` +//! **library** (`src/`); +//! 2. the `ordered_numeric_matrix!` suites live in the `encrypted_domain` +//! **integration-test binary** (`tests/`), a separate crate target; +//! 3. the `generate_all_fixtures` dispatch lives in *another* integration-test +//! binary (`tests/generate_all_fixtures.rs`). +//! +//! A single macro invocation cannot emit into all three at once, so the design +//! is: ONE canonical list, captured by the `macro_rules! scalar_harness!` +//! re-exported from `eql-tests` (see `tests/sqlx/src/scalar_harness.rs`), which +//! forwards that same list to whichever proc-macro is appropriate for the call +//! site. Each proc-macro below parses the identical `token => rust_type` list +//! and emits only the items that belong where it is invoked. The list itself is +//! the single source of truth; the four emitters are pure functions of it. +//! +//! Each entry is `token => rust_type` where `token` is the Postgres type token +//! (e.g. `int4`, also the fixture/domain name suffix) and `rust_type` is the +//! Rust plaintext type (`i32`). The catalog value const is derived by +//! upper-casing the token and appending `_VALUES` (`int4` -> `INT4_VALUES`), +//! matching `eql_scalars::INT4_VALUES`. +//! +//! The four emitters are split into thin `#[proc_macro]` shims and pure +//! `proc_macro2::TokenStream` core functions (`*_tokens`) so the core logic is +//! unit-testable without a consumer crate — see the `tests` module. + +use proc_macro::TokenStream; +use proc_macro2::TokenStream as TokenStream2; +use quote::{format_ident, quote}; +use syn::parse::{Parse, ParseStream}; +use syn::punctuated::Punctuated; +use syn::{Ident, Token, Type}; + +/// One `token => rust_type` entry from the harness list. +struct ScalarEntry { + /// The Postgres type token (`int4`), also the fixture/domain name suffix + /// and the `suite` ident in the matrix invocation. + token: Ident, + /// The Rust plaintext type (`i32`). + rust_type: Type, +} + +impl Parse for ScalarEntry { + fn parse(input: ParseStream) -> syn::Result { + let token: Ident = input.parse()?; + input.parse::]>()?; + let rust_type: Type = input.parse()?; + Ok(ScalarEntry { token, rust_type }) + } +} + +/// The whole comma-separated list, with optional trailing comma. +struct ScalarList { + entries: Vec, +} + +impl Parse for ScalarList { + fn parse(input: ParseStream) -> syn::Result { + let punctuated = Punctuated::::parse_terminated(input)?; + Ok(ScalarList { + entries: punctuated.into_iter().collect(), + }) + } +} + +/// `int4` -> `INT4_VALUES` — the catalog value const for a token. Mirrors the +/// `int_values!(INT4_VALUES, ...)` naming in `eql_scalars`. +fn values_const_ident(token: &Ident) -> Ident { + format_ident!("{}_VALUES", token.to_string().to_uppercase()) +} + +// --------------------------------------------------------------------------- +// Core token generators (pure, unit-testable). +// --------------------------------------------------------------------------- + +/// Emit one `impl ScalarType for ` per entry. See +/// [`emit_scalar_type_impls`]. +fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { + let impls = list.entries.iter().map(|e| { + let token_str = e.token.to_string(); + let rust_type = &e.rust_type; + let values = values_const_ident(&e.token); + quote! { + impl ScalarType for #rust_type { + const PG_TYPE: &'static str = #token_str; + /// Single-sourced from the matching row in `eql-scalars::CATALOG` + /// (`eql_scalars::*_VALUES`, materialised from its `Fixture` + /// list) — the same list the fixture generator encrypts, so the + /// oracle cannot drift from the fixture. + const FIXTURE_VALUES: &'static [#rust_type] = ::eql_scalars::#values; + } + } + }); + quote! { #(#impls)* } +} + +/// Emit one `pub mod eql_v2_ { ... }` per entry. See +/// [`emit_scalar_fixture_modules`]. +fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { + let mods = list.entries.iter().map(|e| { + let token_str = e.token.to_string(); + let rust_type = &e.rust_type; + let values = values_const_ident(&e.token); + let mod_ident = format_ident!("eql_v2_{}", e.token); + let fixture_name = format!("eql_v2_{}", token_str); + quote! { + #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_harness!`.")] + pub mod #mod_ident { + use ::eql_scalars::#values as VALUES; + // `scalar_fixture!` is `#[macro_export]`ed from this crate + // (`eql-tests`), so `crate::scalar_fixture!` resolves here since + // the modules are emitted into the `eql-tests` lib. + crate::scalar_fixture!(#fixture_name, #rust_type, VALUES); + } + } + }); + quote! { #(#mods)* } +} + +/// Emit the `generate_for_token` dispatch fn. See [`emit_fixture_dispatch`]. +fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { + let arms = list.entries.iter().map(|e| { + let token_str = e.token.to_string(); + let mod_ident = format_ident!("eql_v2_{}", e.token); + quote! { + #token_str => ::eql_tests::fixtures::#mod_ident::spec().run().await, + } + }); + quote! { + /// Map a catalog token to its fixture generator and run it. Generated by + /// `scalar_harness!` from the single harness list. A token present in the + /// catalog but absent from that list hits the catch-all below and fails + /// loudly so a new scalar type cannot silently skip fixture generation. + async fn generate_for_token(token: &str) -> anyhow::Result<()> { + match token { + #(#arms)* + other => anyhow::bail!( + "no fixture generator wired for catalog token '{other}'. \ + Add it to the scalar_harness! list (tests/sqlx/src/scalar_harness.rs). \ + See the encrypted-domain spec §3." + ), + } + } + } +} + +/// Emit one `pub mod { ordered_numeric_matrix! { ... } }` per entry. +/// See [`emit_scalar_matrix_suites`]. +fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { + let mods = list.entries.iter().map(|e| { + let token = &e.token; + let token_str = e.token.to_string(); + let rust_type = &e.rust_type; + let eql_type = format!("eql_v2_{}", token_str); + quote! { + #[doc = concat!("`eql_v2_", #token_str, "` matrix suite — generated by `scalar_harness!`.")] + pub mod #token { + ::eql_tests::ordered_numeric_matrix! { + suite = #token, + scalar = #rust_type, + eql_type = #eql_type, + } + } + } + }); + quote! { #(#mods)* } +} + +// --------------------------------------------------------------------------- +// Proc-macro shims. +// --------------------------------------------------------------------------- + +/// Emit one `impl ScalarType for ` per entry. +/// +/// Invoked (via `scalar_harness!`) inside `tests/sqlx/src/scalar_domains.rs`, +/// so the impls land in the `eql-tests` library next to the trait. Replaces the +/// three hand-written impls. `PG_TYPE` is the token string; `FIXTURE_VALUES` +/// is the catalog const `eql_scalars::_VALUES` — single-sourced +/// from the catalog so the oracle cannot drift from the fixture. +#[proc_macro] +pub fn emit_scalar_type_impls(input: TokenStream) -> TokenStream { + let list = syn::parse_macro_input!(input as ScalarList); + scalar_type_impls_tokens(&list).into() +} + +/// Emit one `pub mod eql_v2_ { ... }` per entry. +/// +/// Invoked (via `scalar_harness!`) inside `tests/sqlx/src/fixtures/mod.rs`, so +/// the modules land at `crate::fixtures::eql_v2_` — the path the matrix +/// and the fixture dispatch reference. Each module body is exactly what the old +/// per-type `fixtures/eql_v2_.rs` file contained: a `use` of the catalog +/// value const plus a `scalar_fixture!` invocation. The per-type files are +/// therefore deleted. +#[proc_macro] +pub fn emit_scalar_fixture_modules(input: TokenStream) -> TokenStream { + let list = syn::parse_macro_input!(input as ScalarList); + scalar_fixture_modules_tokens(&list).into() +} + +/// Emit the `generate_for_token` dispatch as a single function driven by the +/// list. +/// +/// Invoked (via `scalar_harness!`) inside `tests/generate_all_fixtures.rs`. +/// Emits an `async fn generate_for_token(token: &str) -> anyhow::Result<()>` +/// with one match arm per entry plus a loud catch-all, replacing the +/// hand-written match. A catalog token with no entry here (i.e. not in the +/// harness list) hits the catch-all and fails the generator loudly — preserving +/// the "a catalog type with no harness wiring fails loudly" guarantee at +/// generation time (the matrix-inventory cross-check enforces it at test time). +#[proc_macro] +pub fn emit_fixture_dispatch(input: TokenStream) -> TokenStream { + let list = syn::parse_macro_input!(input as ScalarList); + fixture_dispatch_tokens(&list).into() +} + +/// Emit one `pub mod { ordered_numeric_matrix! { ... } }` per entry. +/// +/// Invoked (via `scalar_harness!`) inside +/// `tests/sqlx/tests/encrypted_domain/scalars/mod.rs`, so the matrix suites land +/// in the `encrypted_domain` integration-test binary — the only place +/// `#[sqlx::test]` suites belong. This is a SEPARATE proc-macro from the +/// lib-side ones because that binary is a different crate target: a single macro +/// invocation in `src/` could not emit into `tests/`. The generated module + +/// `ordered_numeric_matrix!` invocation are byte-equivalent to the old per-type +/// `scalars/.rs` files, so the emitted test names (`scalars:::: +/// matrix_*`) are unchanged and the token-normalized `matrix_tests.txt` snapshot +/// keeps matching. +#[proc_macro] +pub fn emit_scalar_matrix_suites(input: TokenStream) -> TokenStream { + let list = syn::parse_macro_input!(input as ScalarList); + scalar_matrix_suites_tokens(&list).into() +} + +#[cfg(test)] +mod tests { + use super::*; + + fn sample() -> ScalarList { + syn::parse_str::("int4 => i32, int8 => i64,").unwrap() + } + + /// The token-stream comparison is on the normalized `to_string()` form so + /// whitespace/formatting differences don't make the assertions brittle. + fn norm(ts: &TokenStream2) -> String { + ts.to_string() + } + + #[test] + fn values_const_name_is_uppercased_with_suffix() { + let token: Ident = syn::parse_str("int8").unwrap(); + assert_eq!(values_const_ident(&token).to_string(), "INT8_VALUES"); + } + + #[test] + fn scalar_type_impls_emit_pg_type_and_fixture_values() { + let out = norm(&scalar_type_impls_tokens(&sample())); + // One impl per entry, with the right PG_TYPE string and catalog const. + assert!(out.contains("impl ScalarType for i32")); + assert!(out.contains("impl ScalarType for i64")); + assert!(out.contains(r#"const PG_TYPE : & 'static str = "int4""#)); + assert!(out.contains(r#"const PG_TYPE : & 'static str = "int8""#)); + assert!(out.contains(":: eql_scalars :: INT4_VALUES")); + assert!(out.contains(":: eql_scalars :: INT8_VALUES")); + } + + #[test] + fn fixture_modules_emit_named_mods_with_scalar_fixture() { + let out = norm(&scalar_fixture_modules_tokens(&sample())); + assert!(out.contains("pub mod eql_v2_int4")); + assert!(out.contains("pub mod eql_v2_int8")); + assert!(out.contains("crate :: scalar_fixture !")); + assert!(out.contains(r#""eql_v2_int4""#)); + assert!(out.contains(":: eql_scalars :: INT4_VALUES as VALUES")); + } + + #[test] + fn fixture_dispatch_emits_one_arm_per_token_and_a_catch_all() { + let out = norm(&fixture_dispatch_tokens(&sample())); + assert!(out.contains("async fn generate_for_token")); + assert!(out.contains(r#""int4" =>"#)); + assert!(out.contains(r#""int8" =>"#)); + assert!(out.contains(":: eql_tests :: fixtures :: eql_v2_int4 :: spec")); + // Loud catch-all preserved. + assert!(out.contains("other =>")); + assert!(out.contains("no fixture generator wired")); + } + + #[test] + fn matrix_suites_emit_mods_with_unchanged_suite_and_eql_type() { + let out = norm(&scalar_matrix_suites_tokens(&sample())); + assert!(out.contains("pub mod int4")); + assert!(out.contains("pub mod int8")); + assert!(out.contains(":: eql_tests :: ordered_numeric_matrix !")); + // suite/scalar/eql_type must match what the old per-type files used so + // the generated test names (and the snapshot) are unchanged. + assert!(out.contains("suite = int4")); + assert!(out.contains("scalar = i32")); + assert!(out.contains(r#"eql_type = "eql_v2_int4""#)); + assert!(out.contains("suite = int8")); + assert!(out.contains("scalar = i64")); + assert!(out.contains(r#"eql_type = "eql_v2_int8""#)); + } +} diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index ee304a3d7..041bc9996 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -184,24 +184,28 @@ generated Rust. Pin the exact materialised list with a `values_tests` assertion. The generated SQL is enough to *install* the domains, but the `ordered_numeric_matrix!` suite only runs once the Rust harness knows about the -scalar. These are hand-maintained registration lists — copy each piece from the -`int4` reference. `` is the scalar's Rust type (`i32` for `int4`, `i16` for -`int2`): +scalar. `` is the scalar's Rust type (`i32` for `int4`, `i16` for `int2`). +There are now **two** registrations: | File | Add | |------|-----| -| `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}`, a `PlaintextSqlType` const for its base column type, `impl EqlPlaintext for ` (`CAST`, `PLAINTEXT_SQL_TYPE`, `to_plaintext` → the right `Plaintext` variant), plus the two `#[test]` casts. | -| `tests/sqlx/src/fixtures/eql_v2_.rs` | `use eql_scalars::_VALUES as VALUES;` then `crate::scalar_fixture!("eql_v2_", , VALUES);`. | -| `tests/sqlx/src/fixtures/mod.rs` | `pub mod eql_v2_;`. | -| `tests/sqlx/tests/generate_all_fixtures.rs` | An arm in `generate_for_token`: `"" => fixtures::eql_v2_::spec().run().await,`. The match is exhaustive over the catalog — a catalog token with no arm fails the generator loudly. | -| `tests/sqlx/src/scalar_domains.rs` | `impl ScalarType for ` — `PG_TYPE` (the base PG type, e.g. `"int8"`) and `FIXTURE_VALUES = eql_scalars::_VALUES`. | -| `tests/sqlx/tests/encrypted_domain/scalars/.rs` | `ordered_numeric_matrix! { suite = , scalar = , eql_type = "eql_v2_" }`. | -| `tests/sqlx/tests/encrypted_domain/scalars/mod.rs` | `pub mod ;`. | - -Forget one and the matrix simply does not run for the type — the matrix -inventory cross-check (below) surfaces it, because the catalog has the type but -the binary has no `scalars::::` tests. (A future Phase-4 `scalar_types!` -registry, tracked separately, will collapse these into one declaration.) +| `tests/sqlx/src/scalar_harness.rs` | One ` => ` line in the `scalar_harness!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType`, the `eql_v2_` fixture module, the `ordered_numeric_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | +| `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}` and `impl EqlPlaintext for ` carrying just `const KIND: ScalarKind` plus the value-typed `to_plaintext` → the right `Plaintext` variant. `CAST` and `PLAINTEXT_SQL_TYPE` are **derived** from `KIND` via the `cast_for_kind` / `plaintext_sql_type_for_kind` `const fn` defaults, so a brand-new integer kind needs an arm in those two helpers — not a per-type const. Keep the three `#[test]`s (cast / sql-type / to_plaintext) mirroring the existing ones. | + +The single ` => ` line in `scalar_harness.rs` is the harness source of +truth. The four code-generators (`emit_scalar_type_impls`, +`emit_scalar_fixture_modules`, `emit_scalar_matrix_suites`, +`emit_fixture_dispatch`) are pure functions of that list, invoked at each call +site via `scalar_harness!()`; there are four because proc-macros emit into +the crate/module where they're invoked and the pieces span the `eql-tests` lib, +the `encrypted_domain` test binary, and the `generate_all_fixtures` test binary. +See the `scalar_harness.rs` module docs and `crates/eql-tests-macros/src/lib.rs`. + +Forget the harness line and the matrix simply does not run for the type — the +matrix inventory cross-check (below) surfaces it, because the catalog has the +type but the binary has no `scalars::::` tests. A catalog token absent from +the `scalar_harness!` list also fails the `generate_for_token` catch-all loudly +at fixture-generation time. The coverage these registrations unlock comes from the `ordered_numeric_matrix!` convention wrapper in `tests/sqlx/src/matrix.rs`: one `impl ScalarType` plus a diff --git a/mise.toml b/mise.toml index 7f3e4d9cc..ccd458fcd 100644 --- a/mise.toml +++ b/mise.toml @@ -110,18 +110,20 @@ description = "Compile, lint and test the std-only Rust workspace crates (no dat dir = "{{config_root}}" run = """ #!/usr/bin/env bash -# eql-scalars / eql-codegen are the lean workspace members. Scope explicitly to -# them (NOT --workspace): a workspace-wide test would drag in tests/sqlx, whose -# suite needs Postgres + CS_* secrets and is already covered by the `test` job. -# clippy is likewise scoped — a workspace clippy recompiles the heavy -# sqlx/tokio/cipherstash-client tree for no added coverage of these crates. +# eql-scalars / eql-codegen / eql-tests-macros are the lean workspace members. +# Scope explicitly to them (NOT --workspace): a workspace-wide test would drag +# in tests/sqlx, whose suite needs Postgres + CS_* secrets and is already +# covered by the `test` job. eql-tests-macros only pulls syn/quote/proc-macro2, +# so it stays in the lean set. clippy is likewise scoped — a workspace clippy +# recompiles the heavy sqlx/tokio/cipherstash-client tree for no added coverage +# of these crates. # bash is pinned via the `#!/usr/bin/env bash` shebang above (mise honors a # `#!` first line), so `set -o pipefail` is available regardless of the runner's # /bin/sh (dash on the CI images). set -euo pipefail cargo fmt --check -cargo clippy -p eql-scalars -p eql-codegen --all-targets -- -D warnings -cargo test -p eql-scalars -p eql-codegen +cargo clippy -p eql-scalars -p eql-codegen -p eql-tests-macros --all-targets -- -D warnings +cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros """ [tasks."test:matrix:inventory"] diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index c7a8525a7..112177264 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -14,6 +14,7 @@ jsonschema = { version = "0.46.4", default-features = false } cipherstash-client = { version = "0.35", features = ["tokio"] } paste = "1" eql-scalars = { path = "../../crates/eql-scalars" } +eql-tests-macros = { path = "../../crates/eql-tests-macros" } [dev-dependencies] # None needed - tests live in this crate diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index 303e39973..d43cfeafd 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -294,7 +294,8 @@ mod live_tests { /// Assert the well-formed Store shape: the payload is a JSON object /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields. Mirrors the - /// per-key assertions in `tests/sqlx/tests/encrypted_domain/scalars/int4.rs`. + /// per-key assertions in the generated `scalars::int4` matrix suite + /// (emitted from the `scalar_harness!` list in `scalar_harness.rs`). fn assert_store_shape(payload: &Value) { let obj = payload.as_object().expect("payload must be a JSON object"); for key in ["v", "c", "hm", "ob", "i"] { diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 36b348fd5..3fde4393b 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -14,6 +14,7 @@ use std::fmt; use cipherstash_client::encryption::Plaintext; +use eql_scalars::ScalarKind; /// The `cast_as` argument for `eql_v2.add_search_config`. The field is /// private so the allowlist is the set of `pub const`s below. @@ -66,6 +67,34 @@ impl fmt::Display for PlaintextSqlType { } } +/// The EQL `cast_as` for a scalar kind, drawn from the `Cast` allowlist. +/// +/// Only the integer kinds have `EqlPlaintext` impls, so only those resolve; +/// the non-integer kinds mirror the `eql_scalars` accessor convention and +/// `panic!`, since no impl can ever reach them. +const fn cast_for_kind(kind: ScalarKind) -> Cast { + match kind { + ScalarKind::I32 => Cast::INT, + ScalarKind::I16 => Cast::SMALL_INT, + ScalarKind::I64 | ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + panic!("EqlPlaintext is only implemented for integer scalar kinds") + } + } +} + +/// The `plaintext` oracle column SQL type for a scalar kind, drawn from the +/// `PlaintextSqlType` allowlist. As with `cast_for_kind`, only integer kinds +/// resolve. +const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { + match kind { + ScalarKind::I32 => PlaintextSqlType::INTEGER, + ScalarKind::I16 => PlaintextSqlType::SMALLINT, + ScalarKind::I64 | ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + panic!("EqlPlaintext is only implemented for integer scalar kinds") + } + } +} + mod sealed { pub trait Sealed {} impl Sealed for i32 {} @@ -75,9 +104,17 @@ mod sealed { /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast /// and the SQL type of the `plaintext` column. Sealed; only this crate may /// add impls. +/// +/// Each impl supplies a single `KIND`; the EQL cast and `plaintext` column +/// SQL type are derived from it via `cast_for_kind` / +/// `plaintext_sql_type_for_kind`, so they cannot drift from the kind. pub trait EqlPlaintext: sealed::Sealed { - const CAST: Cast; - const PLAINTEXT_SQL_TYPE: PlaintextSqlType; + /// The scalar kind this plaintext type maps to. The single source of + /// truth from which `CAST` and `PLAINTEXT_SQL_TYPE` are derived. + const KIND: ScalarKind; + + const CAST: Cast = cast_for_kind(Self::KIND); + const PLAINTEXT_SQL_TYPE: PlaintextSqlType = plaintext_sql_type_for_kind(Self::KIND); /// Lift the Rust value into the cipherstash-client `Plaintext` enum the /// EQL encryption pipeline consumes. The mapping is total — every @@ -90,8 +127,7 @@ pub trait EqlPlaintext: sealed::Sealed { } impl EqlPlaintext for i32 { - const CAST: Cast = Cast::INT; - const PLAINTEXT_SQL_TYPE: PlaintextSqlType = PlaintextSqlType::INTEGER; + const KIND: ScalarKind = ScalarKind::I32; fn to_plaintext(&self) -> Plaintext { Plaintext::Int(Some(*self)) @@ -99,8 +135,7 @@ impl EqlPlaintext for i32 { } impl EqlPlaintext for i16 { - const CAST: Cast = Cast::SMALL_INT; - const PLAINTEXT_SQL_TYPE: PlaintextSqlType = PlaintextSqlType::SMALLINT; + const KIND: ScalarKind = ScalarKind::I16; fn to_plaintext(&self) -> Plaintext { Plaintext::SmallInt(Some(*self)) diff --git a/tests/sqlx/src/fixtures/eql_v2_int2.rs b/tests/sqlx/src/fixtures/eql_v2_int2.rs deleted file mode 100644 index 661e44759..000000000 --- a/tests/sqlx/src/fixtures/eql_v2_int2.rs +++ /dev/null @@ -1,12 +0,0 @@ -//! The `eql_v2_int2` fixture — the int4 reference, clamped to 16 bits. -//! -//! 19 integers spanning a negative boundary, the i16 signed extremes -//! (`MIN`/`MAX`), zero, a pair near the ±32767 boundary, and -//! small/medium/large magnitudes. The generated -//! `tests/sqlx/fixtures/eql_v2_int2.sql` is a plain `jsonb`-payload table with -//! no EQL dependency; the `eql_v3.int2` domain is layered on top by casting -//! `payload` per query. - -use eql_scalars::INT2_VALUES as VALUES; - -crate::scalar_fixture!("eql_v2_int2", i16, VALUES); diff --git a/tests/sqlx/src/fixtures/eql_v2_int4.rs b/tests/sqlx/src/fixtures/eql_v2_int4.rs deleted file mode 100644 index facb69c45..000000000 --- a/tests/sqlx/src/fixtures/eql_v2_int4.rs +++ /dev/null @@ -1,11 +0,0 @@ -//! The `eql_v2_int4` fixture — the framework's reference example and proof. -//! -//! 17 integers spanning a negative boundary, the i32 signed extremes -//! (`MIN`/`MAX`), zero, and small/medium/large magnitudes. The generated -//! `tests/sqlx/fixtures/eql_v2_int4.sql` is a plain `jsonb`-payload table with -//! no EQL dependency; #225 layers the `eql_v3.int4` domain on top by casting -//! `payload` per query. - -use eql_scalars::INT4_VALUES as VALUES; - -crate::scalar_fixture!("eql_v2_int4", i32, VALUES); diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 9a78189e7..bd67fb68f 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -26,9 +26,11 @@ pub mod cipherstash; pub mod driver; -/// Scalar fixtures read their plaintext value lists directly from the catalog -/// (`eql_scalars::INT4_VALUES` / `INT2_VALUES`) — see `scalar_fixture!`. There -/// is no generated `_values.rs` module any more. -pub mod eql_v2_int4; - -pub mod eql_v2_int2; +// The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, +// `eql_v2_int8`, …) are generated from the single harness list in +// `scalar_harness.rs`. Each expands to `pub mod eql_v2_ { … scalar_fixture! +// … }` — the same three items the old per-type `eql_v2_.rs` files held. +// Scalar fixtures read their plaintext value lists directly from the catalog +// (`eql_scalars::_VALUES`) — see `scalar_fixture!`. There is no +// generated `_values.rs` module. +crate::scalar_harness!(fixture_modules); diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index c37c176ea..3c90a567b 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -10,6 +10,8 @@ pub mod helpers; pub mod index_types; pub mod matrix; pub mod scalar_domains; +#[macro_use] +pub mod scalar_harness; pub mod selectors; // Re-export `paste` under a stable path so the `scalar_domain_matrix!` macro @@ -18,6 +20,12 @@ pub mod selectors; #[doc(hidden)] pub use paste; +// Re-export the harness proc-macro crate under a stable path so the +// `scalar_harness!` macro can refer to `$crate::eql_tests_macros::!` +// without each call site depending on the proc-macro crate directly. +#[doc(hidden)] +pub use eql_tests_macros; + pub use assertions::{assert_db_error, QueryAssertion}; pub use helpers::{ analyze_table, assert_no_seq_scan, assert_sequential_ids, assert_uses_index, diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 39f5c079b..7205b44dc 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1,11 +1,13 @@ //! Type-generic substrate for the encrypted-scalar-domain test matrix. //! //! Adding a new encrypted scalar type (e.g. `i64` for int8, `f64` for -//! float8) is a 4-line `impl ScalarType` plus a Proxy-encrypted fixture. -//! Everything else — the four `eql_v2_{,_eq,_ord,_ord_ore}` domains, -//! per-domain payload shapes, supported operators, index extractor -//! expressions, ground-truth result sets — is derived from -//! `T::PG_TYPE`, `T::FIXTURE_VALUES`, and the `Variant` enum. +//! float8) is one ` => ` line in the `scalar_harness!` list +//! (`scalar_harness.rs`) plus an `EqlPlaintext` impl and a catalog row. +//! The `impl ScalarType` below is generated from that list. Everything +//! else — the four `eql_v2_{,_eq,_ord,_ord_ore}` domains, per-domain +//! payload shapes, supported operators, index extractor expressions, +//! ground-truth result sets — is derived from `T::PG_TYPE`, +//! `T::FIXTURE_VALUES`, and the `Variant` enum. use anyhow::{bail, Context, Result}; use sqlx::PgPool; @@ -72,23 +74,11 @@ pub trait ScalarType: } } -impl ScalarType for i32 { - const PG_TYPE: &'static str = "int4"; - /// Single-sourced from the `int4` row in `eql-scalars::CATALOG` - /// (`eql_scalars::INT4_VALUES`, materialised from its `Fixture` list) — the - /// same list the fixture generator encrypts, so the oracle cannot drift from - /// the fixture. Spans the negative boundary, the i32 signed extremes, and zero. - const FIXTURE_VALUES: &'static [i32] = eql_scalars::INT4_VALUES; -} - -impl ScalarType for i16 { - const PG_TYPE: &'static str = "int2"; - /// Single-sourced from the `int2` row in `eql-scalars::CATALOG` - /// (`eql_scalars::INT2_VALUES`, materialised from its `Fixture` list) — the - /// same list the fixture generator encrypts, so the oracle cannot drift from - /// the fixture. Spans the negative boundary, the i16 signed extremes, and zero. - const FIXTURE_VALUES: &'static [i16] = eql_scalars::INT2_VALUES; -} +// The per-type `impl ScalarType` blocks (one per scalar, each carrying its +// `PG_TYPE` token string and `FIXTURE_VALUES = eql_scalars::_VALUES`) +// are generated from the single harness list in `scalar_harness.rs`. To add a +// type, add a `token => rust_type` line there — not an impl here. +crate::scalar_harness!(scalar_type_impls); /// Per-domain capability + payload shape. Storage carries no terms, `Eq` /// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate diff --git a/tests/sqlx/src/scalar_harness.rs b/tests/sqlx/src/scalar_harness.rs new file mode 100644 index 000000000..3172191aa --- /dev/null +++ b/tests/sqlx/src/scalar_harness.rs @@ -0,0 +1,63 @@ +//! The single declarative scalar-harness list — the harness source of truth. +//! +//! Adding a scalar encrypted-domain type to the SQLx matrix used to require +//! editing several files in lock-step. That wiring is now generated from the +//! ONE list embedded in the `scalar_harness!` macro below. To add a type, add +//! one `token => rust_type` line here (plus the catalog row in `eql-scalars` +//! and the `EqlPlaintext` impl, which are owned separately — see +//! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). +//! +//! # How it works +//! +//! Proc-macros emit into the crate/module where they're invoked, and the +//! harness pieces live in three different compilation contexts (the `eql-tests` +//! lib, the `encrypted_domain` integration-test binary, and the +//! `generate_all_fixtures` integration-test binary). One proc-macro invocation +//! can't reach all three. So the canonical list is held *here once*, inside the +//! `scalar_harness!` `macro_rules!`, and each call site invokes +//! `scalar_harness!()` to forward that same list to the +//! `eql_tests_macros` proc-macro appropriate for that site: +//! +//! - `scalar_harness!(scalar_type_impls)` — in `scalar_domains.rs` (lib): the +//! `impl ScalarType` block. +//! - `scalar_harness!(fixture_modules)` — in `fixtures/mod.rs` (lib): the +//! `pub mod eql_v2_` fixture modules. +//! - `scalar_harness!(matrix_suites)` — in +//! `tests/encrypted_domain/scalars/mod.rs` (test binary): the +//! `ordered_numeric_matrix!` suites. +//! - `scalar_harness!(fixture_dispatch)` — in `tests/generate_all_fixtures.rs` +//! (test binary): the `generate_for_token` dispatch fn. +//! +//! The list appears once; the four mode arms are pure expansions of it, so the +//! list is genuinely the single source of truth. The matrix-inventory +//! cross-check (`mise run test:matrix:inventory`) still compares the type set +//! the binary actually emits against `eql-codegen list-types`, so a catalog +//! type missing from this list fails loudly. + +/// Forward the single canonical scalar-harness list to the `eql_tests_macros` +/// proc-macro selected by `$mode`. See the module docs for the call sites. +/// +/// THE LIST. This is the only place the harness token set is declared. Keep it +/// in sync with `eql-scalars::CATALOG` — the matrix-inventory cross-check +/// enforces that they agree. +#[macro_export] +macro_rules! scalar_harness { + (scalar_type_impls) => { + $crate::scalar_harness!(@dispatch emit_scalar_type_impls); + }; + (fixture_modules) => { + $crate::scalar_harness!(@dispatch emit_scalar_fixture_modules); + }; + (matrix_suites) => { + $crate::scalar_harness!(@dispatch emit_scalar_matrix_suites); + }; + (fixture_dispatch) => { + $crate::scalar_harness!(@dispatch emit_fixture_dispatch); + }; + (@dispatch $emitter:ident) => { + $crate::eql_tests_macros::$emitter! { + int4 => i32, + int2 => i16, + } + }; +} diff --git a/tests/sqlx/tests/encrypted_domain/scalars/int2.rs b/tests/sqlx/tests/encrypted_domain/scalars/int2.rs deleted file mode 100644 index 7a8e93314..000000000 --- a/tests/sqlx/tests/encrypted_domain/scalars/int2.rs +++ /dev/null @@ -1,14 +0,0 @@ -//! `eql_v2_int2` — the int4 reference scalar, clamped to 16 bits. -//! -//! Adding a new ordered numeric scalar (i64, f64, date, ...) is one -//! `impl ScalarType` in `tests/sqlx/src/scalar_domains.rs` plus an -//! `ordered_numeric_matrix!` invocation like this one. The matrix covers -//! everything generic over `T: ScalarType`. - -use eql_tests::ordered_numeric_matrix; - -ordered_numeric_matrix! { - suite = int2, - scalar = i16, - eql_type = "eql_v2_int2", -} diff --git a/tests/sqlx/tests/encrypted_domain/scalars/int4.rs b/tests/sqlx/tests/encrypted_domain/scalars/int4.rs deleted file mode 100644 index 6ec665d33..000000000 --- a/tests/sqlx/tests/encrypted_domain/scalars/int4.rs +++ /dev/null @@ -1,14 +0,0 @@ -//! `eql_v2_int4` — the reference scalar implementation. -//! -//! Adding a new ordered numeric scalar (i64, f64, date, ...) is one -//! `impl ScalarType` in `tests/sqlx/src/scalar_domains.rs` plus an -//! `ordered_numeric_matrix!` invocation like this one. The matrix covers -//! everything generic over `T: ScalarType`. - -use eql_tests::ordered_numeric_matrix; - -ordered_numeric_matrix! { - suite = int4, - scalar = i32, - eql_type = "eql_v2_int4", -} diff --git a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs index f42cfb5f4..0ba4ddc51 100644 --- a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs @@ -1,6 +1,8 @@ -//! Per-scalar tests. Each subdirectory targets one scalar type; future -//! additions (`int8`, `bool`, `date`, …) become sibling modules here. +//! Per-scalar matrix suites. Each `pub mod ` targets one scalar type and +//! holds its `ordered_numeric_matrix!` invocation. +//! +//! The modules are generated from the single harness list in +//! `tests/sqlx/src/scalar_harness.rs` — adding a type there adds its suite here +//! automatically. The old per-type `scalars/.rs` files are gone. -pub mod int4; - -pub mod int2; +eql_tests::scalar_harness!(matrix_suites); diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index bbc1f5953..e81ab9d05 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -14,22 +14,13 @@ #![cfg(feature = "fixture-gen")] use eql_scalars::CATALOG; -use eql_tests::fixtures; -/// Map a catalog token to its fixture generator and run it. A token present in -/// the catalog but missing here is a wiring gap — fail loudly so a new scalar -/// type cannot silently skip fixture generation. -async fn generate_for_token(token: &str) -> anyhow::Result<()> { - match token { - "int2" => fixtures::eql_v2_int2::spec().run().await, - "int4" => fixtures::eql_v2_int4::spec().run().await, - other => anyhow::bail!( - "no fixture generator wired for catalog token '{other}'. \ - Add an arm to generate_for_token in tests/sqlx/tests/generate_all_fixtures.rs \ - (and the eql_v2_{other} fixture module). See the encrypted-domain spec §9." - ), - } -} +// `generate_for_token(token: &str) -> anyhow::Result<()>` is generated from the +// single harness list in `tests/sqlx/src/scalar_harness.rs`: one match arm per +// token (`"int4" => fixtures::eql_v2_int4::spec().run().await`) plus a loud +// catch-all. A catalog token absent from that list hits the catch-all and fails +// the generator loudly, so a new scalar type cannot silently skip generation. +eql_tests::scalar_harness!(fixture_dispatch); #[tokio::test] #[ignore = "generator — run via `mise run fixture:generate:all`"] From 1b58c1d87e17d7154cfb78e2e863c817703e7686 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 12:28:49 +1000 Subject: [PATCH 061/599] test(scalars): abstract per-type catalog tests into generic checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The per-type catalog tests mostly restated the catalog literal (kind, domain count, specific fixtures) or duplicated the whole fixture list as a hardcoded golden array — double-bookkeeping that a wrong fixture wouldn't even fail (the distinctness / bounds / min-max-zero invariants catch that). Replace them with checks generic over CATALOG, which cover every type (including future ones) with no per-type code: - `all_types_share_the_same_domain_shape` now also asserts each domain's terms (subsumes `_domain_terms_match_manifest`). - `every_int_kind_matches_its_rust_type` pins token->kind once (the kind drives the Min/Max pivot resolution, so a wrong kind would otherwise silently corrupt the matrix pivots without failing any test). - `materialised_values_match_resolved_fixtures` computes the expected values from each row's fixtures (no hardcoded array), subsuming the per-type `_values_materialise_to_typed_array` goldens and the `_track_` test. Adding a scalar now needs only one `check(&INTx, INTx_VALUES)` line, not a duplicated golden list. --- crates/eql-scalars/src/lib.rs | 179 ++++++++++------------------------ 1 file changed, 53 insertions(+), 126 deletions(-) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index f606a07b3..07bb45e81 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -760,44 +760,47 @@ mod catalog_tests { assert_eq!(tokens, vec!["int4", "int2"]); } - #[test] - fn int4_maps_to_i32_with_four_domains() { - let s = scalar("int4"); - assert_eq!(s.kind, ScalarKind::I32); - let suffixes: Vec<&str> = s.domains.iter().map(|d| d.suffix).collect(); - // File order from int4.toml: storage, _eq, _ord_ore, _ord. - assert_eq!(suffixes, vec!["", "_eq", "_ord_ore", "_ord"]); - } - - #[test] - fn int4_domain_terms_match_manifest() { - let s = scalar("int4"); - assert_eq!(s.domains[0].terms, &[] as &[Term]); // storage - assert_eq!(s.domains[1].terms, &[Term::Hm]); // _eq - assert_eq!(s.domains[2].terms, &[Term::Ore]); // _ord_ore - assert_eq!(s.domains[3].terms, &[Term::Ore]); // _ord - } - - #[test] - fn int2_rust_type() { - assert_eq!(scalar("int2").kind, ScalarKind::I16); - } - #[test] fn all_types_share_the_same_domain_shape() { // Every scalar declares the same four domains with the same terms; // only the token differs (the matrix-snapshot collapse depends on this). + // Generic over CATALOG, so it covers every type — including new ones — + // and subsumes the old per-type `_maps_to_*_with_four_domains` / + // `_domain_terms_match_manifest` tests (which only restated the + // catalog literal for one token). for s in CATALOG { - let suffixes: Vec<&str> = s.domains.iter().map(|d| d.suffix).collect(); + let shape: Vec<(&str, &[Term])> = + s.domains.iter().map(|d| (d.suffix, d.terms)).collect(); assert_eq!( - suffixes, - vec!["", "_eq", "_ord_ore", "_ord"], - "{} has unexpected domain set", + shape, + vec![ + ("", &[] as &[Term]), + ("_eq", &[Term::Hm][..]), + ("_ord_ore", &[Term::Ore][..]), + ("_ord", &[Term::Ore][..]), + ], + "{} has unexpected domain shape", s.token ); } } + #[test] + fn every_int_kind_matches_its_rust_type() { + // The kind↔rust-type pairing for every integer scalar, generic over + // CATALOG. Replaces the per-type `_maps_to_iNN` / `_rust_type` + // restatements. + for s in CATALOG.iter().filter(|s| s.kind.is_int()) { + let expected = match s.token { + "int2" => ScalarKind::I16, + "int4" => ScalarKind::I32, + "int8" => ScalarKind::I64, + other => panic!("unmapped integer scalar token {other}"), + }; + assert_eq!(s.kind, expected, "{} maps to the wrong kind", s.token); + } + } + #[test] fn domain_name_concatenates_token_and_suffix() { let s = scalar("int4"); @@ -805,116 +808,40 @@ mod catalog_tests { assert_eq!(s.domain_name(&s.domains[1]), "int4_eq"); assert_eq!(s.domain_name(&s.domains[3]), "int4_ord"); } - - #[test] - fn int4_fixtures_match_manifest() { - let s = scalar("int4"); - // From int4.toml [fixture] values, in order. - let expected = vec![ - Fixture::Min, - Fixture::Int(-100), - Fixture::Int(-1), - Fixture::Zero, - Fixture::Int(1), - Fixture::Int(2), - Fixture::Int(5), - Fixture::Int(10), - Fixture::Int(17), - Fixture::Int(25), - Fixture::Int(42), - Fixture::Int(50), - Fixture::Int(100), - Fixture::Int(250), - Fixture::Int(1000), - Fixture::Int(9999), - Fixture::Max, - ]; - assert_eq!(s.fixtures, expected.as_slice()); - } - - #[test] - fn int2_fixtures_match_manifest() { - let s = scalar("int2"); - // From int2.toml [fixture] values, in order — includes the wide - // ±30000 values that exercise the i16 bounds. - assert!(s.fixtures.contains(&Fixture::Int(-30000))); - assert!(s.fixtures.contains(&Fixture::Int(30000))); - assert_eq!(s.fixtures.first(), Some(&Fixture::Min)); - assert_eq!(s.fixtures.last(), Some(&Fixture::Max)); - } } #[cfg(test)] mod values_tests { use super::*; - // The exact typed lists the SQLx matrix consumes. These pin the values the - // deleted golden `int4_values.rs` / committed `_values.rs` used to pin: - // a catalog edit that changes a fixture must update these assertions. - #[test] - fn int4_values_materialise_to_typed_array() { - assert_eq!( - INT4_VALUES, - &[ - i32::MIN, - -100, - -1, - 0, - 1, - 2, - 5, - 10, - 17, - 25, - 42, - 50, - 100, - 250, - 1000, - 9999, - i32::MAX - ] - ); - } - - #[test] - fn int2_values_materialise_to_typed_array() { + /// Every materialised `_VALUES` array equals its catalog row's fixtures, + /// resolved per kind, in order. Computed from the fixtures — no hardcoded + /// expected array — so it cannot drift and adding a type needs only one + /// `check(&INTx, INTx_VALUES)` line, not a duplicated golden list. Subsumes + /// the old per-type `_values_materialise_to_typed_array` goldens and + /// `materialised_values_track_their_fixture_lists`. + fn check>(spec: &ScalarSpec, values: &[T]) { assert_eq!( - INT2_VALUES, - &[ - i16::MIN, - -30000, - -100, - -1, - 0, - 1, - 2, - 5, - 10, - 17, - 25, - 42, - 50, - 100, - 250, - 1000, - 9999, - 30000, - i16::MAX - ] + values.len(), + spec.fixtures.len(), + "{}: value count != fixture count", + spec.token ); + for (i, (v, f)) in values.iter().zip(spec.fixtures).enumerate() { + assert_eq!( + (*v).into(), + f.numeric_value(spec.kind) + .expect("integer scalar fixture resolves to a number"), + "{}: value[{i}] does not match resolved fixture {f:?}", + spec.token + ); + } } #[test] - fn materialised_values_track_their_fixture_lists() { - // One value per fixture, in catalog order; sentinels resolve to extremes. - assert_eq!(INT4_VALUES.len(), INT4_FIXTURES.len()); - assert_eq!(INT2_VALUES.len(), INT2_FIXTURES.len()); - assert_eq!(INT4_VALUES.first(), Some(&i32::MIN)); - assert_eq!(INT4_VALUES.last(), Some(&i32::MAX)); - assert_eq!(INT2_VALUES.first(), Some(&i16::MIN)); - assert_eq!(INT2_VALUES.last(), Some(&i16::MAX)); - assert!(INT4_VALUES.contains(&0) && INT2_VALUES.contains(&0)); + fn materialised_values_match_resolved_fixtures() { + check(&INT4, INT4_VALUES); + check(&INT2, INT2_VALUES); } } From 88ffdcd99badca0addcb4d2ab325c2622997bc2a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 13:01:51 +1000 Subject: [PATCH 062/599] refactor(tests): rename scalar_harness! to scalar_types! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The macro/file is the declarative registry of scalar types under matrix test; 'scalar_types' names what it is (the type list), where 'harness' was opaque. Pure rename — file, macro, call sites, and docs. --- crates/eql-tests-macros/src/lib.rs | 22 +++++++------- .../adding-a-scalar-encrypted-domain-type.md | 10 +++---- tests/sqlx/src/fixtures/cipherstash.rs | 2 +- tests/sqlx/src/fixtures/mod.rs | 4 +-- tests/sqlx/src/lib.rs | 4 +-- tests/sqlx/src/scalar_domains.rs | 8 ++--- .../{scalar_harness.rs => scalar_types.rs} | 29 ++++++++++--------- .../tests/encrypted_domain/scalars/mod.rs | 4 +-- tests/sqlx/tests/generate_all_fixtures.rs | 4 +-- 9 files changed, 44 insertions(+), 43 deletions(-) rename tests/sqlx/src/{scalar_harness.rs => scalar_types.rs} (67%) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index a2ceb198e..af74c1b2a 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -12,7 +12,7 @@ //! a SINGLE list, e.g.: //! //! ```ignore -//! eql_tests::scalar_harness! { +//! eql_tests::scalar_types! { //! int4 => i32, //! int2 => i16, //! int8 => i64, @@ -30,8 +30,8 @@ //! binary (`tests/generate_all_fixtures.rs`). //! //! A single macro invocation cannot emit into all three at once, so the design -//! is: ONE canonical list, captured by the `macro_rules! scalar_harness!` -//! re-exported from `eql-tests` (see `tests/sqlx/src/scalar_harness.rs`), which +//! is: ONE canonical list, captured by the `macro_rules! scalar_types!` +//! re-exported from `eql-tests` (see `tests/sqlx/src/scalar_types.rs`), which //! forwards that same list to whichever proc-macro is appropriate for the call //! site. Each proc-macro below parses the identical `token => rust_type` list //! and emits only the items that belong where it is invoked. The list itself is @@ -127,7 +127,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { let mod_ident = format_ident!("eql_v2_{}", e.token); let fixture_name = format!("eql_v2_{}", token_str); quote! { - #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_harness!`.")] + #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] pub mod #mod_ident { use ::eql_scalars::#values as VALUES; // `scalar_fixture!` is `#[macro_export]`ed from this crate @@ -151,7 +151,7 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { }); quote! { /// Map a catalog token to its fixture generator and run it. Generated by - /// `scalar_harness!` from the single harness list. A token present in the + /// `scalar_types!` from the single harness list. A token present in the /// catalog but absent from that list hits the catch-all below and fails /// loudly so a new scalar type cannot silently skip fixture generation. async fn generate_for_token(token: &str) -> anyhow::Result<()> { @@ -159,7 +159,7 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { #(#arms)* other => anyhow::bail!( "no fixture generator wired for catalog token '{other}'. \ - Add it to the scalar_harness! list (tests/sqlx/src/scalar_harness.rs). \ + Add it to the scalar_types! list (tests/sqlx/src/scalar_types.rs). \ See the encrypted-domain spec §3." ), } @@ -176,7 +176,7 @@ fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { let rust_type = &e.rust_type; let eql_type = format!("eql_v2_{}", token_str); quote! { - #[doc = concat!("`eql_v2_", #token_str, "` matrix suite — generated by `scalar_harness!`.")] + #[doc = concat!("`eql_v2_", #token_str, "` matrix suite — generated by `scalar_types!`.")] pub mod #token { ::eql_tests::ordered_numeric_matrix! { suite = #token, @@ -195,7 +195,7 @@ fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { /// Emit one `impl ScalarType for ` per entry. /// -/// Invoked (via `scalar_harness!`) inside `tests/sqlx/src/scalar_domains.rs`, +/// Invoked (via `scalar_types!`) inside `tests/sqlx/src/scalar_domains.rs`, /// so the impls land in the `eql-tests` library next to the trait. Replaces the /// three hand-written impls. `PG_TYPE` is the token string; `FIXTURE_VALUES` /// is the catalog const `eql_scalars::_VALUES` — single-sourced @@ -208,7 +208,7 @@ pub fn emit_scalar_type_impls(input: TokenStream) -> TokenStream { /// Emit one `pub mod eql_v2_ { ... }` per entry. /// -/// Invoked (via `scalar_harness!`) inside `tests/sqlx/src/fixtures/mod.rs`, so +/// Invoked (via `scalar_types!`) inside `tests/sqlx/src/fixtures/mod.rs`, so /// the modules land at `crate::fixtures::eql_v2_` — the path the matrix /// and the fixture dispatch reference. Each module body is exactly what the old /// per-type `fixtures/eql_v2_.rs` file contained: a `use` of the catalog @@ -223,7 +223,7 @@ pub fn emit_scalar_fixture_modules(input: TokenStream) -> TokenStream { /// Emit the `generate_for_token` dispatch as a single function driven by the /// list. /// -/// Invoked (via `scalar_harness!`) inside `tests/generate_all_fixtures.rs`. +/// Invoked (via `scalar_types!`) inside `tests/generate_all_fixtures.rs`. /// Emits an `async fn generate_for_token(token: &str) -> anyhow::Result<()>` /// with one match arm per entry plus a loud catch-all, replacing the /// hand-written match. A catalog token with no entry here (i.e. not in the @@ -238,7 +238,7 @@ pub fn emit_fixture_dispatch(input: TokenStream) -> TokenStream { /// Emit one `pub mod { ordered_numeric_matrix! { ... } }` per entry. /// -/// Invoked (via `scalar_harness!`) inside +/// Invoked (via `scalar_types!`) inside /// `tests/sqlx/tests/encrypted_domain/scalars/mod.rs`, so the matrix suites land /// in the `encrypted_domain` integration-test binary — the only place /// `#[sqlx::test]` suites belong. This is a SEPARATE proc-macro from the diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 041bc9996..68d913e8a 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -189,22 +189,22 @@ There are now **two** registrations: | File | Add | |------|-----| -| `tests/sqlx/src/scalar_harness.rs` | One ` => ` line in the `scalar_harness!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType`, the `eql_v2_` fixture module, the `ordered_numeric_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | +| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType`, the `eql_v2_` fixture module, the `ordered_numeric_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | | `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}` and `impl EqlPlaintext for ` carrying just `const KIND: ScalarKind` plus the value-typed `to_plaintext` → the right `Plaintext` variant. `CAST` and `PLAINTEXT_SQL_TYPE` are **derived** from `KIND` via the `cast_for_kind` / `plaintext_sql_type_for_kind` `const fn` defaults, so a brand-new integer kind needs an arm in those two helpers — not a per-type const. Keep the three `#[test]`s (cast / sql-type / to_plaintext) mirroring the existing ones. | -The single ` => ` line in `scalar_harness.rs` is the harness source of +The single ` => ` line in `scalar_types.rs` is the harness source of truth. The four code-generators (`emit_scalar_type_impls`, `emit_scalar_fixture_modules`, `emit_scalar_matrix_suites`, `emit_fixture_dispatch`) are pure functions of that list, invoked at each call -site via `scalar_harness!()`; there are four because proc-macros emit into +site via `scalar_types!()`; there are four because proc-macros emit into the crate/module where they're invoked and the pieces span the `eql-tests` lib, the `encrypted_domain` test binary, and the `generate_all_fixtures` test binary. -See the `scalar_harness.rs` module docs and `crates/eql-tests-macros/src/lib.rs`. +See the `scalar_types.rs` module docs and `crates/eql-tests-macros/src/lib.rs`. Forget the harness line and the matrix simply does not run for the type — the matrix inventory cross-check (below) surfaces it, because the catalog has the type but the binary has no `scalars::::` tests. A catalog token absent from -the `scalar_harness!` list also fails the `generate_for_token` catch-all loudly +the `scalar_types!` list also fails the `generate_for_token` catch-all loudly at fixture-generation time. The coverage these registrations unlock comes from the `ordered_numeric_matrix!` diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index d43cfeafd..adb121737 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -295,7 +295,7 @@ mod live_tests { /// Assert the well-formed Store shape: the payload is a JSON object /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields. Mirrors the /// per-key assertions in the generated `scalars::int4` matrix suite - /// (emitted from the `scalar_harness!` list in `scalar_harness.rs`). + /// (emitted from the `scalar_types!` list in `scalar_types.rs`). fn assert_store_shape(payload: &Value) { let obj = payload.as_object().expect("payload must be a JSON object"); for key in ["v", "c", "hm", "ob", "i"] { diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index bd67fb68f..bbcd6cce5 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -28,9 +28,9 @@ pub mod driver; // The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, // `eql_v2_int8`, …) are generated from the single harness list in -// `scalar_harness.rs`. Each expands to `pub mod eql_v2_ { … scalar_fixture! +// `scalar_types.rs`. Each expands to `pub mod eql_v2_ { … scalar_fixture! // … }` — the same three items the old per-type `eql_v2_.rs` files held. // Scalar fixtures read their plaintext value lists directly from the catalog // (`eql_scalars::_VALUES`) — see `scalar_fixture!`. There is no // generated `_values.rs` module. -crate::scalar_harness!(fixture_modules); +crate::scalar_types!(fixture_modules); diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 3c90a567b..4386222be 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -11,7 +11,7 @@ pub mod index_types; pub mod matrix; pub mod scalar_domains; #[macro_use] -pub mod scalar_harness; +pub mod scalar_types; pub mod selectors; // Re-export `paste` under a stable path so the `scalar_domain_matrix!` macro @@ -21,7 +21,7 @@ pub mod selectors; pub use paste; // Re-export the harness proc-macro crate under a stable path so the -// `scalar_harness!` macro can refer to `$crate::eql_tests_macros::!` +// `scalar_types!` macro can refer to `$crate::eql_tests_macros::!` // without each call site depending on the proc-macro crate directly. #[doc(hidden)] pub use eql_tests_macros; diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 7205b44dc..e9f91e3b6 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1,8 +1,8 @@ //! Type-generic substrate for the encrypted-scalar-domain test matrix. //! //! Adding a new encrypted scalar type (e.g. `i64` for int8, `f64` for -//! float8) is one ` => ` line in the `scalar_harness!` list -//! (`scalar_harness.rs`) plus an `EqlPlaintext` impl and a catalog row. +//! float8) is one ` => ` line in the `scalar_types!` list +//! (`scalar_types.rs`) plus an `EqlPlaintext` impl and a catalog row. //! The `impl ScalarType` below is generated from that list. Everything //! else — the four `eql_v2_{,_eq,_ord,_ord_ore}` domains, per-domain //! payload shapes, supported operators, index extractor expressions, @@ -76,9 +76,9 @@ pub trait ScalarType: // The per-type `impl ScalarType` blocks (one per scalar, each carrying its // `PG_TYPE` token string and `FIXTURE_VALUES = eql_scalars::_VALUES`) -// are generated from the single harness list in `scalar_harness.rs`. To add a +// are generated from the single harness list in `scalar_types.rs`. To add a // type, add a `token => rust_type` line there — not an impl here. -crate::scalar_harness!(scalar_type_impls); +crate::scalar_types!(scalar_type_impls); /// Per-domain capability + payload shape. Storage carries no terms, `Eq` /// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate diff --git a/tests/sqlx/src/scalar_harness.rs b/tests/sqlx/src/scalar_types.rs similarity index 67% rename from tests/sqlx/src/scalar_harness.rs rename to tests/sqlx/src/scalar_types.rs index 3172191aa..0e57a39c7 100644 --- a/tests/sqlx/src/scalar_harness.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -1,8 +1,9 @@ -//! The single declarative scalar-harness list — the harness source of truth. +//! The single declarative list of scalar types under matrix test — the +//! harness source of truth. //! //! Adding a scalar encrypted-domain type to the SQLx matrix used to require //! editing several files in lock-step. That wiring is now generated from the -//! ONE list embedded in the `scalar_harness!` macro below. To add a type, add +//! ONE list embedded in the `scalar_types!` macro below. To add a type, add //! one `token => rust_type` line here (plus the catalog row in `eql-scalars` //! and the `EqlPlaintext` impl, which are owned separately — see //! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). @@ -14,18 +15,18 @@ //! lib, the `encrypted_domain` integration-test binary, and the //! `generate_all_fixtures` integration-test binary). One proc-macro invocation //! can't reach all three. So the canonical list is held *here once*, inside the -//! `scalar_harness!` `macro_rules!`, and each call site invokes -//! `scalar_harness!()` to forward that same list to the +//! `scalar_types!` `macro_rules!`, and each call site invokes +//! `scalar_types!()` to forward that same list to the //! `eql_tests_macros` proc-macro appropriate for that site: //! -//! - `scalar_harness!(scalar_type_impls)` — in `scalar_domains.rs` (lib): the +//! - `scalar_types!(scalar_type_impls)` — in `scalar_domains.rs` (lib): the //! `impl ScalarType` block. -//! - `scalar_harness!(fixture_modules)` — in `fixtures/mod.rs` (lib): the +//! - `scalar_types!(fixture_modules)` — in `fixtures/mod.rs` (lib): the //! `pub mod eql_v2_` fixture modules. -//! - `scalar_harness!(matrix_suites)` — in +//! - `scalar_types!(matrix_suites)` — in //! `tests/encrypted_domain/scalars/mod.rs` (test binary): the //! `ordered_numeric_matrix!` suites. -//! - `scalar_harness!(fixture_dispatch)` — in `tests/generate_all_fixtures.rs` +//! - `scalar_types!(fixture_dispatch)` — in `tests/generate_all_fixtures.rs` //! (test binary): the `generate_for_token` dispatch fn. //! //! The list appears once; the four mode arms are pure expansions of it, so the @@ -34,25 +35,25 @@ //! the binary actually emits against `eql-codegen list-types`, so a catalog //! type missing from this list fails loudly. -/// Forward the single canonical scalar-harness list to the `eql_tests_macros` +/// Forward the single canonical scalar-type list to the `eql_tests_macros` /// proc-macro selected by `$mode`. See the module docs for the call sites. /// /// THE LIST. This is the only place the harness token set is declared. Keep it /// in sync with `eql-scalars::CATALOG` — the matrix-inventory cross-check /// enforces that they agree. #[macro_export] -macro_rules! scalar_harness { +macro_rules! scalar_types { (scalar_type_impls) => { - $crate::scalar_harness!(@dispatch emit_scalar_type_impls); + $crate::scalar_types!(@dispatch emit_scalar_type_impls); }; (fixture_modules) => { - $crate::scalar_harness!(@dispatch emit_scalar_fixture_modules); + $crate::scalar_types!(@dispatch emit_scalar_fixture_modules); }; (matrix_suites) => { - $crate::scalar_harness!(@dispatch emit_scalar_matrix_suites); + $crate::scalar_types!(@dispatch emit_scalar_matrix_suites); }; (fixture_dispatch) => { - $crate::scalar_harness!(@dispatch emit_fixture_dispatch); + $crate::scalar_types!(@dispatch emit_fixture_dispatch); }; (@dispatch $emitter:ident) => { $crate::eql_tests_macros::$emitter! { diff --git a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs index 0ba4ddc51..f900af3e2 100644 --- a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs @@ -2,7 +2,7 @@ //! holds its `ordered_numeric_matrix!` invocation. //! //! The modules are generated from the single harness list in -//! `tests/sqlx/src/scalar_harness.rs` — adding a type there adds its suite here +//! `tests/sqlx/src/scalar_types.rs` — adding a type there adds its suite here //! automatically. The old per-type `scalars/.rs` files are gone. -eql_tests::scalar_harness!(matrix_suites); +eql_tests::scalar_types!(matrix_suites); diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index e81ab9d05..72ebbdf09 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -16,11 +16,11 @@ use eql_scalars::CATALOG; // `generate_for_token(token: &str) -> anyhow::Result<()>` is generated from the -// single harness list in `tests/sqlx/src/scalar_harness.rs`: one match arm per +// single harness list in `tests/sqlx/src/scalar_types.rs`: one match arm per // token (`"int4" => fixtures::eql_v2_int4::spec().run().await`) plus a loud // catch-all. A catalog token absent from that list hits the catch-all and fails // the generator loudly, so a new scalar type cannot silently skip generation. -eql_tests::scalar_harness!(fixture_dispatch); +eql_tests::scalar_types!(fixture_dispatch); #[tokio::test] #[ignore = "generator — run via `mise run fixture:generate:all`"] From 66f7febf32682f542d339171c75dccd07df41d96 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:28:30 +1000 Subject: [PATCH 063/599] docs(tests): tighten scalar-harness macro comments Condense verbose module/item docs on the scalar_types! macro wiring, keeping the load-bearing facts (single source of truth, three compilation contexts, token => rust_type format, matrix-inventory cross-check). Comment-only change. --- crates/eql-tests-macros/src/lib.rs | 141 +++++++++++------------------ tests/sqlx/src/fixtures/mod.rs | 11 +-- tests/sqlx/src/scalar_types.rs | 58 +++++------- 3 files changed, 80 insertions(+), 130 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index af74c1b2a..537a83128 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -1,51 +1,31 @@ -//! Proc-macros that expand ONE declarative scalar-harness list into all the -//! per-type SQLx-matrix wiring that used to be hand-maintained across four -//! locations. +//! Proc-macros that expand one declarative scalar-type list into the per-type +//! SQLx-matrix wiring that used to be hand-maintained across four locations. //! -//! # Why a proc-macro (and why more than one) -//! -//! Adding a scalar encrypted-domain type used to require editing several -//! files in lock-step (see -//! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). The harness -//! wiring — everything *except* the catalog row in `eql-scalars` and the -//! `EqlPlaintext` impl, which are owned by a separate task — is now driven by -//! a SINGLE list, e.g.: +//! The list lives once in the `scalar_types!` `macro_rules!` in +//! `tests/sqlx/src/scalar_types.rs`: //! //! ```ignore //! eql_tests::scalar_types! { //! int4 => i32, //! int2 => i16, -//! int8 => i64, //! } //! ``` //! -//! Rust macros emit code into the crate/module where they are invoked, and the -//! harness pieces live in three *different* compilation contexts: -//! -//! 1. the `ScalarType` impls + the fixture modules live in the `eql-tests` -//! **library** (`src/`); -//! 2. the `ordered_numeric_matrix!` suites live in the `encrypted_domain` -//! **integration-test binary** (`tests/`), a separate crate target; -//! 3. the `generate_all_fixtures` dispatch lives in *another* integration-test -//! binary (`tests/generate_all_fixtures.rs`). -//! -//! A single macro invocation cannot emit into all three at once, so the design -//! is: ONE canonical list, captured by the `macro_rules! scalar_types!` -//! re-exported from `eql-tests` (see `tests/sqlx/src/scalar_types.rs`), which -//! forwards that same list to whichever proc-macro is appropriate for the call -//! site. Each proc-macro below parses the identical `token => rust_type` list -//! and emits only the items that belong where it is invoked. The list itself is -//! the single source of truth; the four emitters are pure functions of it. +//! The harness pieces live in three separate compilation contexts — the +//! `eql-tests` lib, the `encrypted_domain` integration-test binary, and the +//! `generate_all_fixtures` integration-test binary — so no single invocation +//! can emit them all. `scalar_types!` forwards the same list to whichever +//! proc-macro below fits the call site; each parses the list and emits only the +//! items belonging there. The list is the single source of truth; the four +//! emitters are pure functions of it. //! -//! Each entry is `token => rust_type` where `token` is the Postgres type token -//! (e.g. `int4`, also the fixture/domain name suffix) and `rust_type` is the -//! Rust plaintext type (`i32`). The catalog value const is derived by -//! upper-casing the token and appending `_VALUES` (`int4` -> `INT4_VALUES`), -//! matching `eql_scalars::INT4_VALUES`. +//! Each entry is `token => rust_type`: `token` is the Postgres type token +//! (`int4`, also the fixture/domain suffix), `rust_type` is the Rust plaintext +//! type (`i32`). The catalog value const is the upper-cased token plus +//! `_VALUES` (`int4` -> `eql_scalars::INT4_VALUES`). //! -//! The four emitters are split into thin `#[proc_macro]` shims and pure -//! `proc_macro2::TokenStream` core functions (`*_tokens`) so the core logic is -//! unit-testable without a consumer crate — see the `tests` module. +//! Each emitter is split into a thin `#[proc_macro]` shim and a pure `*_tokens` +//! core so the core is unit-testable without a consumer crate. use proc_macro::TokenStream; use proc_macro2::TokenStream as TokenStream2; @@ -54,12 +34,12 @@ use syn::parse::{Parse, ParseStream}; use syn::punctuated::Punctuated; use syn::{Ident, Token, Type}; -/// One `token => rust_type` entry from the harness list. +/// One `token => rust_type` entry. struct ScalarEntry { - /// The Postgres type token (`int4`), also the fixture/domain name suffix - /// and the `suite` ident in the matrix invocation. + /// Postgres type token (`int4`); also the fixture/domain suffix and the + /// matrix `suite` ident. token: Ident, - /// The Rust plaintext type (`i32`). + /// Rust plaintext type (`i32`). rust_type: Type, } @@ -72,7 +52,7 @@ impl Parse for ScalarEntry { } } -/// The whole comma-separated list, with optional trailing comma. +/// The comma-separated list (optional trailing comma). struct ScalarList { entries: Vec, } @@ -86,8 +66,7 @@ impl Parse for ScalarList { } } -/// `int4` -> `INT4_VALUES` — the catalog value const for a token. Mirrors the -/// `int_values!(INT4_VALUES, ...)` naming in `eql_scalars`. +/// `int4` -> `INT4_VALUES`, the catalog value const in `eql_scalars`. fn values_const_ident(token: &Ident) -> Ident { format_ident!("{}_VALUES", token.to_string().to_uppercase()) } @@ -106,10 +85,9 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { quote! { impl ScalarType for #rust_type { const PG_TYPE: &'static str = #token_str; - /// Single-sourced from the matching row in `eql-scalars::CATALOG` - /// (`eql_scalars::*_VALUES`, materialised from its `Fixture` - /// list) — the same list the fixture generator encrypts, so the - /// oracle cannot drift from the fixture. + /// The catalog `eql_scalars::*_VALUES` list — the same values + /// the fixture generator encrypts, so the oracle can't drift + /// from the fixture. const FIXTURE_VALUES: &'static [#rust_type] = ::eql_scalars::#values; } } @@ -130,9 +108,8 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] pub mod #mod_ident { use ::eql_scalars::#values as VALUES; - // `scalar_fixture!` is `#[macro_export]`ed from this crate - // (`eql-tests`), so `crate::scalar_fixture!` resolves here since - // the modules are emitted into the `eql-tests` lib. + // `scalar_fixture!` is `#[macro_export]`ed by `eql-tests`; + // these modules expand into that lib, so `crate::` resolves it. crate::scalar_fixture!(#fixture_name, #rust_type, VALUES); } } @@ -150,10 +127,9 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { } }); quote! { - /// Map a catalog token to its fixture generator and run it. Generated by - /// `scalar_types!` from the single harness list. A token present in the - /// catalog but absent from that list hits the catch-all below and fails - /// loudly so a new scalar type cannot silently skip fixture generation. + /// Map a catalog token to its fixture generator and run it. A token in + /// the catalog but absent from the harness list hits the catch-all and + /// fails loudly, so a new scalar type can't silently skip generation. async fn generate_for_token(token: &str) -> anyhow::Result<()> { match token { #(#arms)* @@ -195,11 +171,9 @@ fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { /// Emit one `impl ScalarType for ` per entry. /// -/// Invoked (via `scalar_types!`) inside `tests/sqlx/src/scalar_domains.rs`, -/// so the impls land in the `eql-tests` library next to the trait. Replaces the -/// three hand-written impls. `PG_TYPE` is the token string; `FIXTURE_VALUES` -/// is the catalog const `eql_scalars::_VALUES` — single-sourced -/// from the catalog so the oracle cannot drift from the fixture. +/// Invoked via `scalar_types!` in `tests/sqlx/src/scalar_domains.rs`, so the +/// impls land in the `eql-tests` lib next to the trait. `PG_TYPE` is the token +/// string; `FIXTURE_VALUES` is the catalog const `eql_scalars::_VALUES`. #[proc_macro] pub fn emit_scalar_type_impls(input: TokenStream) -> TokenStream { let list = syn::parse_macro_input!(input as ScalarList); @@ -208,28 +182,23 @@ pub fn emit_scalar_type_impls(input: TokenStream) -> TokenStream { /// Emit one `pub mod eql_v2_ { ... }` per entry. /// -/// Invoked (via `scalar_types!`) inside `tests/sqlx/src/fixtures/mod.rs`, so -/// the modules land at `crate::fixtures::eql_v2_` — the path the matrix -/// and the fixture dispatch reference. Each module body is exactly what the old -/// per-type `fixtures/eql_v2_.rs` file contained: a `use` of the catalog -/// value const plus a `scalar_fixture!` invocation. The per-type files are -/// therefore deleted. +/// Invoked via `scalar_types!` in `tests/sqlx/src/fixtures/mod.rs`, so the +/// modules land at `crate::fixtures::eql_v2_` — the path the matrix and +/// fixture dispatch reference. Each body is a `use` of the catalog value const +/// plus a `scalar_fixture!` invocation. #[proc_macro] pub fn emit_scalar_fixture_modules(input: TokenStream) -> TokenStream { let list = syn::parse_macro_input!(input as ScalarList); scalar_fixture_modules_tokens(&list).into() } -/// Emit the `generate_for_token` dispatch as a single function driven by the -/// list. +/// Emit the `generate_for_token` dispatch fn. /// -/// Invoked (via `scalar_types!`) inside `tests/generate_all_fixtures.rs`. -/// Emits an `async fn generate_for_token(token: &str) -> anyhow::Result<()>` -/// with one match arm per entry plus a loud catch-all, replacing the -/// hand-written match. A catalog token with no entry here (i.e. not in the -/// harness list) hits the catch-all and fails the generator loudly — preserving -/// the "a catalog type with no harness wiring fails loudly" guarantee at -/// generation time (the matrix-inventory cross-check enforces it at test time). +/// Invoked via `scalar_types!` in `tests/generate_all_fixtures.rs`. Emits an +/// `async fn generate_for_token(token: &str)` with one match arm per entry plus +/// a loud catch-all, so a catalog token missing from the harness list fails the +/// generator loudly. (The matrix-inventory cross-check enforces the same at +/// test time.) #[proc_macro] pub fn emit_fixture_dispatch(input: TokenStream) -> TokenStream { let list = syn::parse_macro_input!(input as ScalarList); @@ -238,16 +207,12 @@ pub fn emit_fixture_dispatch(input: TokenStream) -> TokenStream { /// Emit one `pub mod { ordered_numeric_matrix! { ... } }` per entry. /// -/// Invoked (via `scalar_types!`) inside +/// Invoked via `scalar_types!` in /// `tests/sqlx/tests/encrypted_domain/scalars/mod.rs`, so the matrix suites land -/// in the `encrypted_domain` integration-test binary — the only place -/// `#[sqlx::test]` suites belong. This is a SEPARATE proc-macro from the -/// lib-side ones because that binary is a different crate target: a single macro -/// invocation in `src/` could not emit into `tests/`. The generated module + -/// `ordered_numeric_matrix!` invocation are byte-equivalent to the old per-type -/// `scalars/.rs` files, so the emitted test names (`scalars:::: -/// matrix_*`) are unchanged and the token-normalized `matrix_tests.txt` snapshot -/// keeps matching. +/// in the `encrypted_domain` integration-test binary where `#[sqlx::test]` +/// suites belong. Separate from the lib-side macros because that binary is a +/// different crate target. The emitted test names (`scalars::::matrix_*`) +/// match the old per-type files, so the `matrix_tests.txt` snapshot still holds. #[proc_macro] pub fn emit_scalar_matrix_suites(input: TokenStream) -> TokenStream { let list = syn::parse_macro_input!(input as ScalarList); @@ -262,8 +227,8 @@ mod tests { syn::parse_str::("int4 => i32, int8 => i64,").unwrap() } - /// The token-stream comparison is on the normalized `to_string()` form so - /// whitespace/formatting differences don't make the assertions brittle. + /// Normalize to the `to_string()` form so whitespace differences don't make + /// assertions brittle. fn norm(ts: &TokenStream2) -> String { ts.to_string() } @@ -314,8 +279,8 @@ mod tests { assert!(out.contains("pub mod int4")); assert!(out.contains("pub mod int8")); assert!(out.contains(":: eql_tests :: ordered_numeric_matrix !")); - // suite/scalar/eql_type must match what the old per-type files used so - // the generated test names (and the snapshot) are unchanged. + // suite/scalar/eql_type must match the old per-type files so test names + // (and the snapshot) are unchanged. assert!(out.contains("suite = int4")); assert!(out.contains("scalar = i32")); assert!(out.contains(r#"eql_type = "eql_v2_int4""#)); diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index bbcd6cce5..65cdacbc1 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -26,11 +26,8 @@ pub mod cipherstash; pub mod driver; -// The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, -// `eql_v2_int8`, …) are generated from the single harness list in -// `scalar_types.rs`. Each expands to `pub mod eql_v2_ { … scalar_fixture! -// … }` — the same three items the old per-type `eql_v2_.rs` files held. -// Scalar fixtures read their plaintext value lists directly from the catalog -// (`eql_scalars::_VALUES`) — see `scalar_fixture!`. There is no -// generated `_values.rs` module. +// The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, …) are +// generated from the harness list in `scalar_types.rs`. Each expands to +// `pub mod eql_v2_ { … scalar_fixture! … }`, reading its plaintext values +// directly from the catalog (`eql_scalars::_VALUES`). crate::scalar_types!(fixture_modules); diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 0e57a39c7..0d6a70a8c 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -1,46 +1,34 @@ -//! The single declarative list of scalar types under matrix test — the -//! harness source of truth. +//! The single declarative list of scalar types under matrix test — the harness +//! source of truth. //! -//! Adding a scalar encrypted-domain type to the SQLx matrix used to require -//! editing several files in lock-step. That wiring is now generated from the -//! ONE list embedded in the `scalar_types!` macro below. To add a type, add -//! one `token => rust_type` line here (plus the catalog row in `eql-scalars` -//! and the `EqlPlaintext` impl, which are owned separately — see +//! To add a scalar encrypted-domain type to the SQLx matrix, add one +//! `token => rust_type` line below (plus the catalog row in `eql-scalars` and +//! the `EqlPlaintext` impl, owned separately — see //! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). //! -//! # How it works +//! The harness pieces live in three separate compilation contexts (the +//! `eql-tests` lib, the `encrypted_domain` integration-test binary, and the +//! `generate_all_fixtures` integration-test binary), so no single proc-macro +//! invocation can reach all three. The list is held here once, inside the +//! `scalar_types!` `macro_rules!`; each call site invokes `scalar_types!()` +//! to forward it to the matching `eql_tests_macros` proc-macro: //! -//! Proc-macros emit into the crate/module where they're invoked, and the -//! harness pieces live in three different compilation contexts (the `eql-tests` -//! lib, the `encrypted_domain` integration-test binary, and the -//! `generate_all_fixtures` integration-test binary). One proc-macro invocation -//! can't reach all three. So the canonical list is held *here once*, inside the -//! `scalar_types!` `macro_rules!`, and each call site invokes -//! `scalar_types!()` to forward that same list to the -//! `eql_tests_macros` proc-macro appropriate for that site: +//! - `scalar_type_impls` — `scalar_domains.rs` (lib): the `impl ScalarType` block. +//! - `fixture_modules` — `fixtures/mod.rs` (lib): the `pub mod eql_v2_` modules. +//! - `matrix_suites` — `tests/encrypted_domain/scalars/mod.rs` (test binary): +//! the `ordered_numeric_matrix!` suites. +//! - `fixture_dispatch` — `tests/generate_all_fixtures.rs` (test binary): the +//! `generate_for_token` dispatch fn. //! -//! - `scalar_types!(scalar_type_impls)` — in `scalar_domains.rs` (lib): the -//! `impl ScalarType` block. -//! - `scalar_types!(fixture_modules)` — in `fixtures/mod.rs` (lib): the -//! `pub mod eql_v2_` fixture modules. -//! - `scalar_types!(matrix_suites)` — in -//! `tests/encrypted_domain/scalars/mod.rs` (test binary): the -//! `ordered_numeric_matrix!` suites. -//! - `scalar_types!(fixture_dispatch)` — in `tests/generate_all_fixtures.rs` -//! (test binary): the `generate_for_token` dispatch fn. -//! -//! The list appears once; the four mode arms are pure expansions of it, so the -//! list is genuinely the single source of truth. The matrix-inventory -//! cross-check (`mise run test:matrix:inventory`) still compares the type set -//! the binary actually emits against `eql-codegen list-types`, so a catalog +//! The matrix-inventory cross-check (`mise run test:matrix:inventory`) compares +//! the type set the binary emits against `eql-codegen list-types`, so a catalog //! type missing from this list fails loudly. -/// Forward the single canonical scalar-type list to the `eql_tests_macros` -/// proc-macro selected by `$mode`. See the module docs for the call sites. +/// Forward the canonical scalar-type list to the `eql_tests_macros` proc-macro +/// selected by `$mode` (see module docs for call sites). /// -/// THE LIST. This is the only place the harness token set is declared. Keep it -/// in sync with `eql-scalars::CATALOG` — the matrix-inventory cross-check -/// enforces that they agree. +/// This is the only place the harness token set is declared. Keep it in sync +/// with `eql-scalars::CATALOG`; the matrix-inventory cross-check enforces it. #[macro_export] macro_rules! scalar_types { (scalar_type_impls) => { From 42cee6b8572b1144cb91174baa8364d1073edbf8 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 13:03:40 +1000 Subject: [PATCH 064/599] feat(int8): add eql_v3.int8 encrypted-domain type family One ScalarSpec row in eql-scalars::CATALOG, one `EqlPlaintext for i64` impl, and one `int8 => i64` line in the scalar_types! list. The generated SQL surface, the ScalarType impl, the fixture module, the matrix suite, and the fixture dispatch all follow from those. No bespoke catalog tests: the generic CATALOG checks cover int8; only the order-pin assertion and one `check(&INT8, INT8_VALUES)` line are touched. Generated SQL is byte-identical to the int4 reference modulo token. --- CHANGELOG.md | 1 + crates/eql-scalars/src/lib.rs | 22 +++++++++++++-- tests/sqlx/src/fixtures/eql_plaintext.rs | 36 ++++++++++++++++++++++-- tests/sqlx/src/scalar_types.rs | 1 + 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 767001947..7969bf32f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors still return the core `eql_v2.hmac_256` / `eql_v2.ore_block_u64_8_256` index-term types, which remain in `eql_v2` and are referenced cross-schema. Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) +- **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) ### Changed diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 07bb45e81..e41d20f42 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -371,6 +371,13 @@ const INT2_FIXTURES: &[Fixture] = fixtures!(int i16; Min, N(-30000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(30000), Max); +/// int8 fixture plaintexts — the int4 set plus two values beyond the i32 range +/// (`±5_000_000_000`) so the matrix exercises the full 64-bit width. `N(..)` +/// literals are range-checked against `i64` at compile time. +const INT8_FIXTURES: &[Fixture] = fixtures!(int i64; + Min, N(-5000000000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), + N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(5000000000), Max); + const INT4: ScalarSpec = ScalarSpec { token: "int4", kind: ScalarKind::I32, @@ -385,9 +392,16 @@ const INT2: ScalarSpec = ScalarSpec { fixtures: INT2_FIXTURES, }; +const INT8: ScalarSpec = ScalarSpec { + token: "int8", + kind: ScalarKind::I64, + domains: ORDERED_INT_DOMAINS, + fixtures: INT8_FIXTURES, +}; + /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[INT4, INT2]; +pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8]; /// Materialise an integer scalar's fixtures into a typed `&'static` slice at /// compile time. This is the **single-sourced** plaintext list the SQLx test @@ -425,6 +439,7 @@ macro_rules! int_values { int_values!(INT4_VALUES, i32, INT4); int_values!(INT2_VALUES, i16, INT2); +int_values!(INT8_VALUES, i64, INT8); #[cfg(test)] mod rust_tests { @@ -755,9 +770,9 @@ mod catalog_tests { } #[test] - fn catalog_has_int4_int2_in_order() { + fn catalog_has_int4_int2_int8_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); - assert_eq!(tokens, vec!["int4", "int2"]); + assert_eq!(tokens, vec!["int4", "int2", "int8"]); } #[test] @@ -842,6 +857,7 @@ mod values_tests { fn materialised_values_match_resolved_fixtures() { check(&INT4, INT4_VALUES); check(&INT2, INT2_VALUES); + check(&INT8, INT8_VALUES); } } diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 3fde4393b..72c5b2a04 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -55,6 +55,7 @@ pub struct PlaintextSqlType(&'static str); impl PlaintextSqlType { pub const INTEGER: PlaintextSqlType = PlaintextSqlType("integer"); pub const SMALLINT: PlaintextSqlType = PlaintextSqlType("smallint"); + pub const BIGINT: PlaintextSqlType = PlaintextSqlType("bigint"); pub fn as_str(&self) -> &'static str { self.0 @@ -76,7 +77,8 @@ const fn cast_for_kind(kind: ScalarKind) -> Cast { match kind { ScalarKind::I32 => Cast::INT, ScalarKind::I16 => Cast::SMALL_INT, - ScalarKind::I64 | ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::I64 => Cast::BIG_INT, + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for integer scalar kinds") } } @@ -89,7 +91,8 @@ const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { match kind { ScalarKind::I32 => PlaintextSqlType::INTEGER, ScalarKind::I16 => PlaintextSqlType::SMALLINT, - ScalarKind::I64 | ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::I64 => PlaintextSqlType::BIGINT, + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for integer scalar kinds") } } @@ -99,6 +102,7 @@ mod sealed { pub trait Sealed {} impl Sealed for i32 {} impl Sealed for i16 {} + impl Sealed for i64 {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -142,6 +146,14 @@ impl EqlPlaintext for i16 { } } +impl EqlPlaintext for i64 { + const KIND: ScalarKind = ScalarKind::I64; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::BigInt(Some(*self)) + } +} + #[cfg(test)] mod tests { use super::*; @@ -191,4 +203,24 @@ mod tests { other => panic!("expected Plaintext::SmallInt(Some(42)), got {other:?}"), } } + + #[test] + fn i64_casts_to_big_int() { + assert_eq!(::CAST.as_str(), "big_int"); + } + + #[test] + fn i64_plaintext_sql_type_is_bigint() { + assert_eq!(::PLAINTEXT_SQL_TYPE.as_str(), "bigint"); + } + + #[test] + fn i64_to_plaintext_wraps_in_big_int_variant() { + // i64 must lift into the BigInt variant so the fixture driver + // encrypts it under the `big_int` cast, not `int`. + match 42_i64.to_plaintext() { + Plaintext::BigInt(Some(value)) => assert_eq!(value, 42), + other => panic!("expected Plaintext::BigInt(Some(42)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 0d6a70a8c..389897eaa 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -47,6 +47,7 @@ macro_rules! scalar_types { $crate::eql_tests_macros::$emitter! { int4 => i32, int2 => i16, + int8 => i64, } }; } From 41505cc846b763ed97aa27dc3dd8a9f8c24d8732 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:17:58 +1000 Subject: [PATCH 065/599] refactor(codegen): target eql_v3 schema and src/v3/scalars output paths Flip CORE_SCHEMA to eql_v3, qualify the extractor RETURNS type with the core schema (D12), repoint generated output paths and REQUIRE edges to src/v3, drop the vestigial src/schema.sql edge (D10), and repoint term REQUIRE edges to src/v3/sem. Golden reference regenerated in the follow-up commit. --- .gitignore | 17 ++++++++----- crates/eql-codegen/src/consts.rs | 2 +- crates/eql-codegen/src/context.rs | 7 ++++- crates/eql-codegen/src/generate.rs | 31 +++++++++++------------ crates/eql-codegen/templates/types.sql.j2 | 4 +-- crates/eql-codegen/tests/parity.rs | 2 +- crates/eql-scalars/src/lib.rs | 18 ++++++------- tasks/codegen-parity.sh | 4 +-- 8 files changed, 46 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index bdc8e4446..83ee4c424 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,9 @@ deps-ordered.txt deps-supabase.txt deps-ordered-supabase.txt +src/deps-v3.txt +src/deps-ordered-v3.txt + # Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore src/version.sql @@ -223,13 +226,13 @@ tests/sqlx/migrations/001_install_eql.sql # never commit — stale fixtures hide bugs) tests/sqlx/fixtures/eql_v2* -# Generated encrypted-domain SQL — regenerated by `tasks/build.sh` from -# tasks/codegen/types/.toml on every build (or `mise run codegen:domain -# ` to refresh manually). Hand-written *_extensions.sql stays committed. -src/encrypted_domain/*/*_types.sql -src/encrypted_domain/*/*_functions.sql -src/encrypted_domain/*/*_operators.sql -src/encrypted_domain/*/*_aggregates.sql +# Generated encrypted-domain SQL — regenerated by `tasks/build.sh` from the +# eql-scalars::CATALOG via `cargo run -p eql-codegen` on every build. The +# hand-written src/v3/scalars/functions.sql (no type subdir) stays committed. +src/v3/scalars/*/*_types.sql +src/v3/scalars/*/*_functions.sql +src/v3/scalars/*/*_operators.sql +src/v3/scalars/*/*_aggregates.sql # Large generated test data files tests/ste_vec_vast.sql diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 64d2e438c..635c4908f 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -7,7 +7,7 @@ pub(crate) const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE. /// Schema housing the encrypted-domain families. pub(crate) const DOMAIN_SCHEMA: &str = "eql_v3"; /// Schema owning the core index-term types/constructors. -pub(crate) const CORE_SCHEMA: &str = "eql_v2"; +pub(crate) const CORE_SCHEMA: &str = "eql_v3"; /// Always-present payload keys checked for presence in every domain CHECK, in /// order: envelope version (`v`), ident (`i`), ciphertext (`c`). Term-specific diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 01e80c6ca..225c6cdaa 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -132,9 +132,14 @@ pub struct FunctionsContext { } /// Build the inlinable index-extractor entry for a domain term. +/// +/// The `RETURNS` type name equals the constructor name (`hmac_256`, +/// `ore_block_u64_8_256`); qualify it with `CORE_SCHEMA` here so flipping the +/// core schema moves BOTH the body's constructor call and the declared return +/// type together (design D12). `Term::returns()` is intentionally not used. pub fn extractor_entry(term: Term) -> FnEntry { FnEntry::Extractor { - ret: term.returns().to_string(), + ret: format!("{CORE_SCHEMA}.{}", term.ctor()), extractor: term.extractor().to_string(), ctor: term.ctor().to_string(), } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 581f0244c..f71579710 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -25,7 +25,7 @@ fn arg_b_name(symbol: &str) -> &'static str { /// REQUIRE path for a type's _types.sql. Port of `_types_path`. fn types_path(token: &str) -> String { - format!("src/encrypted_domain/{token}/{token}_types.sql") + format!("src/v3/scalars/{token}/{token}_types.sql") } /// Body for _types.sql: every domain in one idempotent DO block. @@ -50,10 +50,9 @@ pub fn render_types_file(spec: &ScalarSpec) -> String { /// REQUIRE edges for a domain's _functions.sql. Port of `_functions_requires`. fn functions_requires(token: &str, terms: &[Term]) -> Vec { let mut reqs = vec![ - "src/schema.sql".to_string(), - "src/schema-v3.sql".to_string(), + "src/v3/schema.sql".to_string(), types_path(token), - "src/encrypted_domain/functions.sql".to_string(), + "src/v3/scalars/functions.sql".to_string(), ]; for extra in Term::term_requires(terms) { if !reqs.iter().any(|r| r == extra) { @@ -163,9 +162,9 @@ pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { let ctx = OperatorsContext { requires: vec![ - "src/schema-v3.sql".to_string(), + "src/v3/schema.sql".to_string(), types_path(token), - format!("src/encrypted_domain/{token}/{name}_functions.sql"), + format!("src/v3/scalars/{token}/{name}_functions.sql"), ], token: token.to_string(), name, @@ -190,10 +189,10 @@ pub fn render_aggregates_file(token: &str, domain: &DomainSpec) -> Option Result, pub fn generate_all(out_root: &Path) -> Result { for spec in eql_scalars::CATALOG { let token = spec.token; - let out_dir = out_root.join("src").join("encrypted_domain").join(token); + let out_dir = out_root.join("src").join("v3").join("scalars").join(token); let written = generate_type(spec, &out_dir)?; for p in &written { @@ -475,7 +474,7 @@ mod tests { #[test] fn types_file_has_all_four_domains() { let sql = render_types_file(spec("int4")); - assert!(sql.contains("-- REQUIRE: src/schema-v3.sql")); + assert!(sql.contains("-- REQUIRE: src/v3/schema.sql")); for dom in ["int4", "int4_eq", "int4_ord_ore", "int4_ord"] { assert!( sql.contains(&format!("CREATE DOMAIN eql_v3.{dom} AS jsonb")), @@ -504,7 +503,7 @@ mod tests { let sql = render_functions_file(s.token, domain(s, "_eq")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)")); - assert!(sql.contains("RETURNS eql_v2.hmac_256")); + assert!(sql.contains("RETURNS eql_v3.hmac_256")); assert_eq!( sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") .count(), @@ -520,7 +519,7 @@ mod tests { let sql = render_functions_file(s.token, domain(s, "_ord")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)")); - assert!(sql.contains("RETURNS eql_v2.ore_block_u64_8_256")); + assert!(sql.contains("RETURNS eql_v3.ore_block_u64_8_256")); assert_eq!( sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") .count(), @@ -553,9 +552,9 @@ mod tests { assert_eq!(sql.matches("CREATE AGGREGATE").count(), 2); assert!(sql.contains("eql_v3.min_sfunc")); assert!(sql.contains("eql_v3.max_sfunc")); - assert!(sql.contains("-- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql")); - assert!(sql.contains("-- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql")); - assert!(sql.contains("-- REQUIRE: src/encrypted_domain/int4/int4_types.sql")); + assert!(sql.contains("-- REQUIRE: src/v3/scalars/int4/int4_ord_operators.sql")); + assert!(sql.contains("-- REQUIRE: src/v3/scalars/int4/int4_ord_functions.sql")); + assert!(sql.contains("-- REQUIRE: src/v3/scalars/int4/int4_types.sql")); } #[test] diff --git a/crates/eql-codegen/templates/types.sql.j2 b/crates/eql-codegen/templates/types.sql.j2 index 99636ac0f..b8263e24c 100644 --- a/crates/eql-codegen/templates/types.sql.j2 +++ b/crates/eql-codegen/templates/types.sql.j2 @@ -1,7 +1,7 @@ -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql +-- REQUIRE: src/v3/schema.sql ---! @file encrypted_domain/{{ token }}/{{ token }}_types.sql +--! @file v3/scalars/{{ token }}/{{ token }}_types.sql --! @brief Encrypted-domain types for {{ token }}. DO $$ diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index a59ed8dc5..d5efb1939 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -36,7 +36,7 @@ fn rust_generator_matches_int4_golden_files() { eql_codegen::generate::generate_all(&out).expect("rust generate_all"); let ref_dir = root.join("tests/codegen/reference/int4"); - let gen_dir = out.join("src/encrypted_domain/int4"); + let gen_dir = out.join("src/v3/scalars/int4"); for entry in fs::read_dir(&ref_dir).unwrap() { let path = entry.unwrap().path(); if path.extension().and_then(|e| e.to_str()) != Some("sql") { diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index e41d20f42..313b0fe9c 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -180,10 +180,10 @@ impl Term { /// SQL `-- REQUIRE:` edges this term pulls in, in catalog order. pub const fn requires(self) -> &'static [&'static str] { match self { - Term::Hm => &["src/hmac_256/functions.sql"], + Term::Hm => &["src/v3/sem/hmac_256/functions.sql"], Term::Ore => &[ - "src/ore_block_u64_8_256/functions.sql", - "src/ore_block_u64_8_256/operators.sql", + "src/v3/sem/ore_block_u64_8_256/functions.sql", + "src/v3/sem/ore_block_u64_8_256/operators.sql", ], } } @@ -532,7 +532,7 @@ mod term_tests { assert_eq!(hm.ctor(), "hmac_256"); assert_eq!(hm.role(), "eq"); assert_eq!(hm.operators(), &["=", "<>"]); - assert_eq!(hm.requires(), &["src/hmac_256/functions.sql"]); + assert_eq!(hm.requires(), &["src/v3/sem/hmac_256/functions.sql"]); } #[test] @@ -547,8 +547,8 @@ mod term_tests { assert_eq!( ore.requires(), &[ - "src/ore_block_u64_8_256/functions.sql", - "src/ore_block_u64_8_256/operators.sql", + "src/v3/sem/ore_block_u64_8_256/functions.sql", + "src/v3/sem/ore_block_u64_8_256/operators.sql", ] ); } @@ -586,9 +586,9 @@ mod term_helper_tests { assert_eq!( Term::term_requires(&[Term::Ore, Term::Ore, Term::Hm]), vec![ - "src/ore_block_u64_8_256/functions.sql", - "src/ore_block_u64_8_256/operators.sql", - "src/hmac_256/functions.sql", + "src/v3/sem/ore_block_u64_8_256/functions.sql", + "src/v3/sem/ore_block_u64_8_256/operators.sql", + "src/v3/sem/hmac_256/functions.sql", ] ); assert!(Term::term_requires(&[]).is_empty()); diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh index 2de923bef..13e8bead3 100755 --- a/tasks/codegen-parity.sh +++ b/tasks/codegen-parity.sh @@ -17,7 +17,7 @@ echo "==> Comparing int4 generated SQL file SET vs golden (catches extra/dropped # "Generated" excludes any committed, hand-written SQL (e.g. int4_extensions.sql), # which lives in this dir but has no golden counterpart; git-tracked == hand-written. golden_set=$(cd tests/codegen/reference/int4 && ls *.sql | LC_ALL=C sort) -gen_set=$(cd src/encrypted_domain/int4 \ +gen_set=$(cd src/v3/scalars/int4 \ && comm -23 <(ls *.sql | LC_ALL=C sort) \ <(git ls-files . | sed 's#.*/##' | LC_ALL=C sort)) if [ "$golden_set" != "$gen_set" ]; then @@ -33,7 +33,7 @@ for f in tests/codegen/reference/int4/*.sql; do # bytes EXACTLY. Both the reference body (from line 2) and the whole generated # file start with the template-owned `-- AUTOMATICALLY GENERATED FILE.` marker, # so no header strip is needed — any whitespace or blank-line drift fails here. - diff <(tail -n +2 "$f") "src/encrypted_domain/int4/$name" + diff <(tail -n +2 "$f") "src/v3/scalars/int4/$name" done echo "PARITY OK: Rust generator matches the int4 golden (byte-for-byte)." From 66066e33a8a29e3c4c5dbcb0520d3a2090e305cd Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:18:48 +1000 Subject: [PATCH 066/599] test(codegen): regenerate int4 golden for the eql_v3 schema + src/v3 paths --- .../reference/int4/int4_eq_functions.sql | 17 ++++++++--------- .../reference/int4/int4_eq_operators.sql | 8 ++++---- .../codegen/reference/int4/int4_functions.sql | 9 ++++----- .../codegen/reference/int4/int4_operators.sql | 8 ++++---- .../reference/int4/int4_ord_aggregates.sql | 10 +++++----- .../reference/int4/int4_ord_functions.sql | 19 +++++++++---------- .../reference/int4/int4_ord_operators.sql | 8 ++++---- .../int4/int4_ord_ore_aggregates.sql | 10 +++++----- .../reference/int4/int4_ord_ore_functions.sql | 19 +++++++++---------- .../reference/int4/int4_ord_ore_operators.sql | 8 ++++---- tests/codegen/reference/int4/int4_types.sql | 6 +++--- 11 files changed, 59 insertions(+), 63 deletions(-) diff --git a/tests/codegen/reference/int4/int4_eq_functions.sql b/tests/codegen/reference/int4/int4_eq_functions.sql index 1b2445777..54a7c048d 100644 --- a/tests/codegen/reference/int4/int4_eq_functions.sql +++ b/tests/codegen/reference/int4/int4_eq_functions.sql @@ -1,21 +1,20 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema.sql --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/functions.sql --- REQUIRE: src/hmac_256/functions.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql --! @file encrypted_domain/int4/int4_eq_functions.sql --! @brief Functions for eql_v3.int4_eq. --! @brief Index extractor for eql_v3.int4_eq. --! @param a eql_v3.int4_eq ---! @return eql_v2.hmac_256 +--! @return eql_v3.hmac_256 CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq) -RETURNS eql_v2.hmac_256 +RETURNS eql_v3.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.hmac_256(a::jsonb) $$; +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int4_eq. --! @param a eql_v3.int4_eq diff --git a/tests/codegen/reference/int4/int4_eq_operators.sql b/tests/codegen/reference/int4/int4_eq_operators.sql index a2190e16e..9da0ce326 100644 --- a/tests/codegen/reference/int4/int4_eq_operators.sql +++ b/tests/codegen/reference/int4/int4_eq_operators.sql @@ -1,8 +1,8 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/int4/int4_eq_functions.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/int4/int4_eq_functions.sql --! @file encrypted_domain/int4/int4_eq_operators.sql --! @brief Operators for eql_v3.int4_eq. diff --git a/tests/codegen/reference/int4/int4_functions.sql b/tests/codegen/reference/int4/int4_functions.sql index 6dae83885..dc1421634 100644 --- a/tests/codegen/reference/int4/int4_functions.sql +++ b/tests/codegen/reference/int4/int4_functions.sql @@ -1,9 +1,8 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema.sql --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/functions.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql --! @file encrypted_domain/int4/int4_functions.sql --! @brief Functions for eql_v3.int4. diff --git a/tests/codegen/reference/int4/int4_operators.sql b/tests/codegen/reference/int4/int4_operators.sql index e461c3b72..fb6c03f94 100644 --- a/tests/codegen/reference/int4/int4_operators.sql +++ b/tests/codegen/reference/int4/int4_operators.sql @@ -1,8 +1,8 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/int4/int4_functions.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/int4/int4_functions.sql --! @file encrypted_domain/int4/int4_operators.sql --! @brief Operators for eql_v3.int4. diff --git a/tests/codegen/reference/int4/int4_ord_aggregates.sql b/tests/codegen/reference/int4/int4_ord_aggregates.sql index 08cdc10d4..95ce5d3b0 100644 --- a/tests/codegen/reference/int4/int4_ord_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_aggregates.sql @@ -1,9 +1,9 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql --- REQUIRE: src/encrypted_domain/int4/int4_ord_operators.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/int4/int4_ord_functions.sql +-- REQUIRE: src/v3/scalars/int4/int4_ord_operators.sql --! @file encrypted_domain/int4/int4_ord_aggregates.sql --! @brief Aggregates for eql_v3.int4_ord. diff --git a/tests/codegen/reference/int4/int4_ord_functions.sql b/tests/codegen/reference/int4/int4_ord_functions.sql index 2c0ee56bf..4b170fcbe 100644 --- a/tests/codegen/reference/int4/int4_ord_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_functions.sql @@ -1,22 +1,21 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema.sql --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/functions.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql --! @file encrypted_domain/int4/int4_ord_functions.sql --! @brief Functions for eql_v3.int4_ord. --! @brief Index extractor for eql_v3.int4_ord. --! @param a eql_v3.int4_ord ---! @return eql_v2.ore_block_u64_8_256 +--! @return eql_v3.ore_block_u64_8_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) -RETURNS eql_v2.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord diff --git a/tests/codegen/reference/int4/int4_ord_operators.sql b/tests/codegen/reference/int4/int4_ord_operators.sql index a5321c628..52a52a12a 100644 --- a/tests/codegen/reference/int4/int4_ord_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_operators.sql @@ -1,8 +1,8 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/int4/int4_ord_functions.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/int4/int4_ord_functions.sql --! @file encrypted_domain/int4/int4_ord_operators.sql --! @brief Operators for eql_v3.int4_ord. diff --git a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql index de5b0848b..369a19381 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_aggregates.sql @@ -1,9 +1,9 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql --- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_operators.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/int4/int4_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/int4/int4_ord_ore_operators.sql --! @file encrypted_domain/int4/int4_ord_ore_aggregates.sql --! @brief Aggregates for eql_v3.int4_ord_ore. diff --git a/tests/codegen/reference/int4/int4_ord_ore_functions.sql b/tests/codegen/reference/int4/int4_ord_ore_functions.sql index 75f09fb9f..e93c84918 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_functions.sql @@ -1,22 +1,21 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema.sql --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/functions.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql --! @file encrypted_domain/int4/int4_ord_ore_functions.sql --! @brief Functions for eql_v3.int4_ord_ore. --! @brief Index extractor for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore ---! @return eql_v2.ore_block_u64_8_256 +--! @return eql_v3.ore_block_u64_8_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord_ore) -RETURNS eql_v2.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore diff --git a/tests/codegen/reference/int4/int4_ord_ore_operators.sql b/tests/codegen/reference/int4/int4_ord_ore_operators.sql index 52f363cf8..73e57f635 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_operators.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_operators.sql @@ -1,8 +1,8 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql --- REQUIRE: src/encrypted_domain/int4/int4_types.sql --- REQUIRE: src/encrypted_domain/int4/int4_ord_ore_functions.sql +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int4/int4_types.sql +-- REQUIRE: src/v3/scalars/int4/int4_ord_ore_functions.sql --! @file encrypted_domain/int4/int4_ord_ore_operators.sql --! @brief Operators for eql_v3.int4_ord_ore. diff --git a/tests/codegen/reference/int4/int4_types.sql b/tests/codegen/reference/int4/int4_types.sql index ba4d9d895..01082ea27 100644 --- a/tests/codegen/reference/int4/int4_types.sql +++ b/tests/codegen/reference/int4/int4_types.sql @@ -1,8 +1,8 @@ --- REFERENCE: hand-written parity baseline for crates/eql-codegen — see ../README.md +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md -- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/schema-v3.sql +-- REQUIRE: src/v3/schema.sql ---! @file encrypted_domain/int4/int4_types.sql +--! @file v3/scalars/int4/int4_types.sql --! @brief Encrypted-domain types for int4. DO $$ From 98174b023f6e3b806c447e5119cbf5caf07c3d1a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:20:00 +1000 Subject: [PATCH 067/599] feat(v3): relocate schema and fork crypto/common into src/v3 (D7, D8) --- src/schema-v3.sql | 22 -------------------- src/v3/common.sql | 38 +++++++++++++++++++++++++++++++++ src/v3/crypto.sql | 53 +++++++++++++++++++++++++++++++++++++++++++++++ src/v3/schema.sql | 23 ++++++++++++++++++++ 4 files changed, 114 insertions(+), 22 deletions(-) delete mode 100644 src/schema-v3.sql create mode 100644 src/v3/common.sql create mode 100644 src/v3/crypto.sql create mode 100644 src/v3/schema.sql diff --git a/src/schema-v3.sql b/src/schema-v3.sql deleted file mode 100644 index 06df8d380..000000000 --- a/src/schema-v3.sql +++ /dev/null @@ -1,22 +0,0 @@ ---! @file schema-v3.sql ---! @brief EQL v3 schema creation ---! ---! Creates the eql_v3 schema, which houses the encrypted-domain type ---! families (eql_v3.int4 and future scalar domains): their domains, index-term ---! extractors, comparison wrappers, blockers, and aggregates. The core ---! index-term types these reuse (eql_v2.hmac_256, eql_v2.ore_block_u64_8_256) ---! remain in the eql_v2 schema and are referenced cross-schema. ---! ---! Drops existing schema if present to support clean reinstallation. ---! ---! @warning DROP SCHEMA CASCADE will remove all objects in the schema ---! @note eql_v3 is a new, additional schema for domain families; the eql_v2 ---! schema name is unchanged. - ---! @brief Drop existing EQL v3 schema ---! @warning CASCADE will drop all dependent objects -DROP SCHEMA IF EXISTS eql_v3 CASCADE; - ---! @brief Create EQL v3 schema ---! @note Houses the encrypted-domain type families -CREATE SCHEMA eql_v3; diff --git a/src/v3/common.sql b/src/v3/common.sql new file mode 100644 index 000000000..b30366fc3 --- /dev/null +++ b/src/v3/common.sql @@ -0,0 +1,38 @@ +-- REQUIRE: src/v3/schema.sql + +--! @file v3/common.sql +--! @brief Common utility functions for the self-contained eql_v3 surface. +--! +--! Forked from src/common.sql (design D7) so the eql_v3 ORE constructor owns the +--! one transitive helper it needs without reaching into another schema. The +--! eql_v2 original is unchanged. + +--! @brief Convert JSONB hex array to bytea array +--! @internal +--! +--! Converts a JSONB array of hex-encoded strings into a PostgreSQL bytea array. +--! Used for deserializing binary data (like ORE terms) from JSONB storage. +--! +--! @param val jsonb JSONB array of hex-encoded strings +--! @return bytea[] Array of decoded binary values +--! +--! @note Returns NULL if input is JSON null +--! @note Each array element is hex-decoded to bytea +CREATE FUNCTION eql_v3.jsonb_array_to_bytea_array(val jsonb) +RETURNS bytea[] + SET search_path = pg_catalog, extensions, public +AS $$ +DECLARE + terms_arr bytea[]; +BEGIN + IF jsonb_typeof(val) = 'null' THEN + RETURN NULL; + END IF; + + SELECT array_agg(decode(value::text, 'hex')::bytea) + INTO terms_arr + FROM jsonb_array_elements_text(val) AS value; + + RETURN terms_arr; +END; +$$ LANGUAGE plpgsql; diff --git a/src/v3/crypto.sql b/src/v3/crypto.sql new file mode 100644 index 000000000..bd99b1627 --- /dev/null +++ b/src/v3/crypto.sql @@ -0,0 +1,53 @@ +-- REQUIRE: src/v3/schema.sql + +--! @file v3/crypto.sql +--! @brief PostgreSQL pgcrypto extension enablement (eql_v3 fork) +--! +--! Forked from src/crypto.sql (design D8) so the entire eql_v3 dependency +--! closure lives under src/v3/. Enables the pgcrypto extension which provides +--! cryptographic functions used by the eql_v3 ORE comparison path. +--! +--! Installs pgcrypto into the `extensions` schema (Supabase convention) to +--! avoid the `extension_in_public` lint. Every EQL function that uses pgcrypto +--! has `pg_catalog, extensions, public` on its `search_path`, so a pre-existing +--! install in `public` keeps working — and a pre-existing install anywhere else +--! will be rejected at install time. The body is idempotent +--! (`CREATE SCHEMA IF NOT EXISTS`, `pg_extension` guard), so running it +--! alongside the eql_v2 copy in a combined install is safe. +--! +--! @note pgcrypto provides functions like digest(), hmac(), gen_random_bytes() + +--! @brief Create extensions schema (Supabase convention) +CREATE SCHEMA IF NOT EXISTS extensions; + +--! @brief Enable pgcrypto extension and validate its schema +DO $$ +DECLARE + pgcrypto_schema name; +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pgcrypto') THEN + CREATE EXTENSION pgcrypto WITH SCHEMA extensions; + END IF; + + SELECT n.nspname INTO pgcrypto_schema + FROM pg_extension e + JOIN pg_namespace n ON n.oid = e.extnamespace + WHERE e.extname = 'pgcrypto'; + + IF pgcrypto_schema = 'extensions' THEN + -- expected location, nothing to say + NULL; + ELSIF pgcrypto_schema = 'public' THEN + RAISE NOTICE + 'pgcrypto is installed in the `public` schema. EQL works against this layout, ' + 'but Supabase splinter will flag it as `extension_in_public`. Move it with: ' + 'ALTER EXTENSION pgcrypto SET SCHEMA extensions'; + ELSE + RAISE EXCEPTION + 'pgcrypto is installed in schema `%`, which is not on the EQL function search_path ' + '(pg_catalog, extensions, public). EQL cryptographic operations would fail at ' + 'runtime. Relocate the extension before installing EQL: ' + 'ALTER EXTENSION pgcrypto SET SCHEMA extensions', + pgcrypto_schema; + END IF; +END $$; diff --git a/src/v3/schema.sql b/src/v3/schema.sql new file mode 100644 index 000000000..41be4d404 --- /dev/null +++ b/src/v3/schema.sql @@ -0,0 +1,23 @@ +--! @file v3/schema.sql +--! @brief EQL v3 schema creation +--! +--! Creates the eql_v3 schema, which houses the self-contained encrypted-domain +--! type families (eql_v3.int4, eql_v3.int8, and future scalar domains): their +--! jsonb-backed domains, the searchable-encrypted-metadata (SEM) index-term +--! types they use (eql_v3.hmac_256, eql_v3.ore_block_u64_8_256), the index-term +--! extractors, comparison wrappers, blockers, and aggregates. The v3 surface is +--! self-contained — it owns every type it needs and has no runtime dependency +--! on another EQL schema. +--! +--! Drops existing schema if present to support clean reinstallation. +--! +--! @warning DROP SCHEMA CASCADE will remove all objects in the schema +--! @note eql_v3 is a new, additional schema for the encrypted-domain families. + +--! @brief Drop existing EQL v3 schema +--! @warning CASCADE will drop all dependent objects +DROP SCHEMA IF EXISTS eql_v3 CASCADE; + +--! @brief Create EQL v3 schema +--! @note Houses the encrypted-domain type families +CREATE SCHEMA eql_v3; From 79ae8b335abe98142114f4ef3fe8e7f52f4f6428 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:20:53 +1000 Subject: [PATCH 068/599] feat(v3): add self-contained eql_v3.hmac_256 SEM type (jsonb-only) --- src/v3/sem/hmac_256/functions.sql | 42 +++++++++++++++++++++++++++++++ src/v3/sem/hmac_256/types.sql | 12 +++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/v3/sem/hmac_256/functions.sql create mode 100644 src/v3/sem/hmac_256/types.sql diff --git a/src/v3/sem/hmac_256/functions.sql b/src/v3/sem/hmac_256/functions.sql new file mode 100644 index 000000000..9b2592cc5 --- /dev/null +++ b/src/v3/sem/hmac_256/functions.sql @@ -0,0 +1,42 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/hmac_256/types.sql + +--! @file v3/sem/hmac_256/functions.sql +--! @brief HMAC-SHA256 index-term extraction from a jsonb payload (eql_v3 SEM). +--! +--! jsonb-only subset of src/hmac_256/functions.sql. The encrypted-column and +--! ste_vec-entry overloads are intentionally omitted — the eql_v3 scalar +--! domains extract from the jsonb payload directly via a cast to the domain. +--! (Doc comments deliberately avoid naming eql_v2 symbols so the +--! self-containment grep stays clean.) + +--! @brief Extract HMAC-SHA256 index term from JSONB payload +--! +--! Inlinable single-statement SQL — the planner can fold this into the calling +--! query so functional hash/btree indexes built on `eql_v3.eq_term(col)` +--! (which calls this) engage structurally. +--! +--! @param val jsonb containing encrypted EQL payload +--! @return eql_v3.hmac_256 HMAC-SHA256 hash value, or NULL when `hm` is absent +CREATE FUNCTION eql_v3.hmac_256(val jsonb) + RETURNS eql_v3.hmac_256 + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT (val ->> 'hm')::eql_v3.hmac_256 +$$; + + +--! @brief Check if JSONB payload contains HMAC-SHA256 index term +--! +--! @param val jsonb containing encrypted EQL payload +--! @return boolean True if 'hm' field is present and non-null +CREATE FUNCTION eql_v3.has_hmac_256(val jsonb) + RETURNS boolean + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + RETURN val ->> 'hm' IS NOT NULL; + END; +$$ LANGUAGE plpgsql; diff --git a/src/v3/sem/hmac_256/types.sql b/src/v3/sem/hmac_256/types.sql new file mode 100644 index 000000000..929879355 --- /dev/null +++ b/src/v3/sem/hmac_256/types.sql @@ -0,0 +1,12 @@ +-- REQUIRE: src/v3/schema.sql + +--! @file v3/sem/hmac_256/types.sql +--! @brief HMAC-SHA256 index term type (eql_v3 SEM) +--! +--! Domain type representing HMAC-SHA256 hash values. Used for exact-match +--! encrypted searches. The hash is stored in the 'hm' field of encrypted data +--! payloads. Self-contained eql_v3 copy (design D1/D3); the eql_v2 original is +--! unchanged. +--! +--! @note Transient type used only during query execution. +CREATE DOMAIN eql_v3.hmac_256 AS text; From 800772292876e7bdedabdbdd3bc5d68d54fa9c01 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:22:25 +1000 Subject: [PATCH 069/599] feat(v3): add self-contained eql_v3.ore_block_u64_8_256 SEM type (jsonb-only) --- src/v3/sem/ore_block_u64_8_256/functions.sql | 206 ++++++++++++++++++ .../ore_block_u64_8_256/operator_class.sql | 26 +++ src/v3/sem/ore_block_u64_8_256/operators.sql | 145 ++++++++++++ src/v3/sem/ore_block_u64_8_256/types.sql | 26 +++ 4 files changed, 403 insertions(+) create mode 100644 src/v3/sem/ore_block_u64_8_256/functions.sql create mode 100644 src/v3/sem/ore_block_u64_8_256/operator_class.sql create mode 100644 src/v3/sem/ore_block_u64_8_256/operators.sql create mode 100644 src/v3/sem/ore_block_u64_8_256/types.sql diff --git a/src/v3/sem/ore_block_u64_8_256/functions.sql b/src/v3/sem/ore_block_u64_8_256/functions.sql new file mode 100644 index 000000000..f86ef8a42 --- /dev/null +++ b/src/v3/sem/ore_block_u64_8_256/functions.sql @@ -0,0 +1,206 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/crypto.sql +-- REQUIRE: src/v3/common.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/types.sql + +--! @file v3/sem/ore_block_u64_8_256/functions.sql +--! @brief ORE block construction, extraction, and comparison (eql_v3 SEM). +--! +--! jsonb-only subset of src/ore_block_u64_8_256/functions.sql. The +--! encrypted-column overloads are omitted; the helper jsonb_array_to_bytea_array +--! and pgcrypto encrypt() are reached via the forked src/v3/common.sql and +--! src/v3/crypto.sql so the whole closure stays under src/v3. (Doc comments +--! deliberately avoid naming eql_v2 symbols so the self-containment grep stays +--! clean.) + +--! @brief Convert JSONB array to ORE block composite type +--! @internal +--! @param val jsonb Array of hex-encoded ORE block terms +--! @return eql_v3.ore_block_u64_8_256 ORE block composite, or NULL if input is null +CREATE FUNCTION eql_v3.jsonb_array_to_ore_block_u64_8_256(val jsonb) +RETURNS eql_v3.ore_block_u64_8_256 + SET search_path = pg_catalog, extensions, public +AS $$ +DECLARE + terms eql_v3.ore_block_u64_8_256_term[]; +BEGIN + IF jsonb_typeof(val) = 'null' THEN + RETURN NULL; + END IF; + + SELECT array_agg(ROW(b)::eql_v3.ore_block_u64_8_256_term) + INTO terms + FROM unnest(eql_v3.jsonb_array_to_bytea_array(val)) AS b; + + RETURN ROW(terms)::eql_v3.ore_block_u64_8_256; +END; +$$ LANGUAGE plpgsql; + + +--! @brief Extract ORE block index term from JSONB payload +--! @param val jsonb containing encrypted EQL payload +--! @return eql_v3.ore_block_u64_8_256 ORE block index term +--! @throws Exception if 'ob' field is missing +CREATE FUNCTION eql_v3.ore_block_u64_8_256(val jsonb) + RETURNS eql_v3.ore_block_u64_8_256 + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + IF val IS NULL THEN + RETURN NULL; + END IF; + + IF eql_v3.has_ore_block_u64_8_256(val) THEN + RETURN eql_v3.jsonb_array_to_ore_block_u64_8_256(val->'ob'); + END IF; + RAISE 'Expected an ore index (ob) value in json: %', val; + END; +$$ LANGUAGE plpgsql; + + +--! @brief Check if JSONB payload contains ORE block index term +--! @param val jsonb containing encrypted EQL payload +--! @return boolean True if 'ob' field is present and non-null +CREATE FUNCTION eql_v3.has_ore_block_u64_8_256(val jsonb) + RETURNS boolean + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + RETURN val ->> 'ob' IS NOT NULL; + END; +$$ LANGUAGE plpgsql; + + +--! @brief Compare two ORE block terms using cryptographic comparison +--! @internal +--! @param a eql_v3.ore_block_u64_8_256_term First ORE term +--! @param b eql_v3.ore_block_u64_8_256_term Second ORE term +--! @return integer -1 if a < b, 0 if a = b, 1 if a > b +--! @throws Exception if ciphertexts are different lengths +CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_term(a eql_v3.ore_block_u64_8_256_term, b eql_v3.ore_block_u64_8_256_term) + RETURNS integer + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + eq boolean := true; + unequal_block smallint := 0; + hash_key bytea; + data_block bytea; + encrypt_block bytea; + target_block bytea; + + left_block_size CONSTANT smallint := 16; + right_block_size CONSTANT smallint := 32; + right_offset CONSTANT smallint := 136; -- 8 * 17 + + indicator smallint := 0; + BEGIN + IF a IS NULL AND b IS NULL THEN + RETURN 0; + END IF; + + IF a IS NULL THEN + RETURN -1; + END IF; + + IF b IS NULL THEN + RETURN 1; + END IF; + + IF bit_length(a.bytes) != bit_length(b.bytes) THEN + RAISE EXCEPTION 'Ciphertexts are different lengths'; + END IF; + + FOR block IN 0..7 LOOP + IF + substr(a.bytes, 1 + block, 1) != substr(b.bytes, 1 + block, 1) + OR substr(a.bytes, 9 + left_block_size * block, left_block_size) != substr(b.bytes, 9 + left_block_size * BLOCK, left_block_size) + THEN + IF eq THEN + unequal_block := block; + END IF; + eq = false; + END IF; + END LOOP; + + IF eq THEN + RETURN 0::integer; + END IF; + + hash_key := substr(b.bytes, right_offset + 1, 16); + + target_block := substr(b.bytes, right_offset + 17 + (unequal_block * right_block_size), right_block_size); + + data_block := substr(a.bytes, 9 + (left_block_size * unequal_block), left_block_size); + + encrypt_block := encrypt(data_block::bytea, hash_key::bytea, 'aes-ecb'); + + indicator := ( + get_bit( + encrypt_block, + 0 + ) + get_bit(target_block, get_byte(a.bytes, unequal_block))) % 2; + + IF indicator = 1 THEN + RETURN 1::integer; + ELSE + RETURN -1::integer; + END IF; + END; +$$ LANGUAGE plpgsql; + + +--! @brief Compare arrays of ORE block terms recursively +--! @internal +--! @param a eql_v3.ore_block_u64_8_256_term[] First array +--! @param b eql_v3.ore_block_u64_8_256_term[] Second array +--! @return integer -1/0/1, or NULL if either array is NULL +CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256_term[], b eql_v3.ore_block_u64_8_256_term[]) +RETURNS integer + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + cmp_result integer; + BEGIN + IF a IS NULL OR b IS NULL THEN + RETURN NULL; + END IF; + + IF cardinality(a) = 0 AND cardinality(b) = 0 THEN + RETURN 0; + END IF; + + IF (cardinality(a) = 0) AND cardinality(b) > 0 THEN + RETURN -1; + END IF; + + IF cardinality(a) > 0 AND (cardinality(b) = 0) THEN + RETURN 1; + END IF; + + cmp_result := eql_v3.compare_ore_block_u64_8_256_term(a[1], b[1]); + + IF cmp_result = 0 THEN + RETURN eql_v3.compare_ore_block_u64_8_256_terms(a[2:array_length(a,1)], b[2:array_length(b,1)]); + END IF; + + RETURN cmp_result; + END +$$ LANGUAGE plpgsql; + + +--! @brief Compare ORE block composite types +--! @internal +--! @param a eql_v3.ore_block_u64_8_256 First ORE block +--! @param b eql_v3.ore_block_u64_8_256 Second ORE block +--! @return integer -1/0/1 +CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +RETURNS integer + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + RETURN eql_v3.compare_ore_block_u64_8_256_terms(a.terms, b.terms); + END +$$ LANGUAGE plpgsql; diff --git a/src/v3/sem/ore_block_u64_8_256/operator_class.sql b/src/v3/sem/ore_block_u64_8_256/operator_class.sql new file mode 100644 index 000000000..b367c8f67 --- /dev/null +++ b/src/v3/sem/ore_block_u64_8_256/operator_class.sql @@ -0,0 +1,26 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/types.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql + +--! @file v3/sem/ore_block_u64_8_256/operator_class.sql +--! @brief B-tree operator family + default class on eql_v3.ore_block_u64_8_256. +--! +--! Gives the composite type its DEFAULT btree opclass so the recommended +--! functional index `CREATE INDEX ON t (eql_v3.ord_term(col))` engages without +--! an explicit opclass annotation (design D4). Excluded from the Supabase build +--! variant by the `**/*operator_class.sql` glob. + +--! @brief B-tree operator family for ORE block types +CREATE OPERATOR FAMILY eql_v3.ore_block_u64_8_256_operator_family USING btree; + +--! @brief B-tree operator class for ORE block encrypted values +--! +--! Supports operators: <, <=, =, >=, >. Uses comparison function +--! compare_ore_block_u64_8_256_terms. +CREATE OPERATOR CLASS eql_v3.ore_block_u64_8_256_operator_class DEFAULT FOR TYPE eql_v3.ore_block_u64_8_256 USING btree FAMILY eql_v3.ore_block_u64_8_256_operator_family AS + OPERATOR 1 <, + OPERATOR 2 <=, + OPERATOR 3 =, + OPERATOR 4 >=, + OPERATOR 5 >, + FUNCTION 1 eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256); diff --git a/src/v3/sem/ore_block_u64_8_256/operators.sql b/src/v3/sem/ore_block_u64_8_256/operators.sql new file mode 100644 index 000000000..78364a194 --- /dev/null +++ b/src/v3/sem/ore_block_u64_8_256/operators.sql @@ -0,0 +1,145 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/types.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql + +--! @file v3/sem/ore_block_u64_8_256/operators.sql +--! @brief Comparison operators on eql_v3.ore_block_u64_8_256. +--! +--! The six backing functions are inlinable single-statement SQL so the planner +--! can fold the eql_v3 comparison wrappers through to functional-index matching. + +--! @brief Equality backing function for ORE block types +--! @internal +CREATE FUNCTION eql_v3.ore_block_u64_8_256_eq(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) = 0 +$$; + +--! @brief Not-equal backing function for ORE block types +--! @internal +CREATE FUNCTION eql_v3.ore_block_u64_8_256_neq(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) <> 0 +$$; + +--! @brief Less-than backing function for ORE block types +--! @internal +CREATE FUNCTION eql_v3.ore_block_u64_8_256_lt(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) = -1 +$$; + +--! @brief Less-than-or-equal backing function for ORE block types +--! @internal +CREATE FUNCTION eql_v3.ore_block_u64_8_256_lte(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) != 1 +$$; + +--! @brief Greater-than backing function for ORE block types +--! @internal +CREATE FUNCTION eql_v3.ore_block_u64_8_256_gt(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) = 1 +$$; + +--! @brief Greater-than-or-equal backing function for ORE block types +--! @internal +CREATE FUNCTION eql_v3.ore_block_u64_8_256_gte(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) != -1 +$$; + + +--! @brief = operator for ORE block types +--! +--! COMMUTATOR is the operator itself: equality is symmetric. Required for the +--! MERGES flag — without it the planner raises "could not find commutator" the +--! first time an ore_block equality is used as a join qual (e.g. via the inlined +--! eql_v3._ord_ore equality wrappers). +CREATE OPERATOR = ( + FUNCTION=eql_v3.ore_block_u64_8_256_eq, + LEFTARG=eql_v3.ore_block_u64_8_256, + RIGHTARG=eql_v3.ore_block_u64_8_256, + COMMUTATOR = =, + NEGATOR = <>, + RESTRICT = eqsel, + JOIN = eqjoinsel, + HASHES, + MERGES +); + +--! @brief <> operator for ORE block types +CREATE OPERATOR <> ( + FUNCTION=eql_v3.ore_block_u64_8_256_neq, + LEFTARG=eql_v3.ore_block_u64_8_256, + RIGHTARG=eql_v3.ore_block_u64_8_256, + COMMUTATOR = <>, + NEGATOR = =, + RESTRICT = eqsel, + JOIN = eqjoinsel, + HASHES, + MERGES +); + +--! @brief > operator for ORE block types +CREATE OPERATOR > ( + FUNCTION=eql_v3.ore_block_u64_8_256_gt, + LEFTARG=eql_v3.ore_block_u64_8_256, + RIGHTARG=eql_v3.ore_block_u64_8_256, + COMMUTATOR = <, + NEGATOR = <=, + RESTRICT = scalargtsel, + JOIN = scalargtjoinsel +); + +--! @brief < operator for ORE block types +CREATE OPERATOR < ( + FUNCTION=eql_v3.ore_block_u64_8_256_lt, + LEFTARG=eql_v3.ore_block_u64_8_256, + RIGHTARG=eql_v3.ore_block_u64_8_256, + COMMUTATOR = >, + NEGATOR = >=, + RESTRICT = scalarltsel, + JOIN = scalarltjoinsel +); + +--! @brief <= operator for ORE block types +CREATE OPERATOR <= ( + FUNCTION=eql_v3.ore_block_u64_8_256_lte, + LEFTARG=eql_v3.ore_block_u64_8_256, + RIGHTARG=eql_v3.ore_block_u64_8_256, + COMMUTATOR = >=, + NEGATOR = >, + RESTRICT = scalarlesel, + JOIN = scalarlejoinsel +); + +--! @brief >= operator for ORE block types +CREATE OPERATOR >= ( + FUNCTION=eql_v3.ore_block_u64_8_256_gte, + LEFTARG=eql_v3.ore_block_u64_8_256, + RIGHTARG=eql_v3.ore_block_u64_8_256, + COMMUTATOR = <=, + NEGATOR = <, + RESTRICT = scalargesel, + JOIN = scalargejoinsel +); diff --git a/src/v3/sem/ore_block_u64_8_256/types.sql b/src/v3/sem/ore_block_u64_8_256/types.sql new file mode 100644 index 000000000..f7e44dd06 --- /dev/null +++ b/src/v3/sem/ore_block_u64_8_256/types.sql @@ -0,0 +1,26 @@ +-- REQUIRE: src/v3/schema.sql + +--! @file v3/sem/ore_block_u64_8_256/types.sql +--! @brief ORE block index-term types (eql_v3 SEM). +--! +--! Self-contained eql_v3 copies of the Order-Revealing Encryption block types +--! (design D1/D3). The eql_v2 originals are unchanged. + +--! @brief ORE block term type for Order-Revealing Encryption +--! +--! Composite type representing a single ORE block term. Stores encrypted data +--! as bytea that enables range comparisons without decryption. +CREATE TYPE eql_v3.ore_block_u64_8_256_term AS ( + bytes bytea +); + + +--! @brief ORE block index term type for range queries +--! +--! Composite type containing an array of ORE block terms. The array is stored +--! in the 'ob' field of encrypted data payloads. +--! +--! @note Transient type used only during query execution. +CREATE TYPE eql_v3.ore_block_u64_8_256 AS ( + terms eql_v3.ore_block_u64_8_256_term[] +); From 56cf93b54390393912c0ef59b41eaeb3a1e4adb7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:37:54 +1000 Subject: [PATCH 070/599] feat(v3): move shared blocker to src/v3/scalars; remove src/encrypted_domain Also repoint src/lint/lints.sql's REQUIRE from the moved src/schema-v3.sql to src/v3/schema.sql so the combined build's dependency graph still resolves. --- src/lint/lints.sql | 2 +- src/{encrypted_domain => v3/scalars}/functions.sql | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/{encrypted_domain => v3/scalars}/functions.sql (93%) diff --git a/src/lint/lints.sql b/src/lint/lints.sql index f7870abd9..08c4a7de3 100644 --- a/src/lint/lints.sql +++ b/src/lint/lints.sql @@ -1,5 +1,5 @@ -- REQUIRE: src/schema.sql --- REQUIRE: src/schema-v3.sql +-- REQUIRE: src/v3/schema.sql --! @brief EQL lint: detect non-inlinable operator implementation functions --! diff --git a/src/encrypted_domain/functions.sql b/src/v3/scalars/functions.sql similarity index 93% rename from src/encrypted_domain/functions.sql rename to src/v3/scalars/functions.sql index 71a070a18..ab997a480 100644 --- a/src/encrypted_domain/functions.sql +++ b/src/v3/scalars/functions.sql @@ -1,6 +1,6 @@ --- REQUIRE: src/schema-v3.sql +-- REQUIRE: src/v3/schema.sql ---! @file encrypted_domain/functions.sql +--! @file v3/scalars/functions.sql --! @brief Shared blocker helper for the eql_v3 encrypted-domain families. --! --! Per-domain wrapper functions live in src/encrypted_domain//. From df0f51b0ded11f29a913bab04d339da4dc796dee Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:39:21 +1000 Subject: [PATCH 071/599] build(v3): emit self-contained release/cipherstash-encrypt-v3.sql variant (D9, D13) Also add the v3 installer/uninstaller to the build task's MISE outputs list (and tasks/uninstall-v3.sql to sources) so the incremental cache tracks them. --- tasks/build.sh | 44 +++++++++++++++++++++++++++++++++++++++--- tasks/uninstall-v3.sql | 3 +++ 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 tasks/uninstall-v3.sql diff --git a/tasks/build.sh b/tasks/build.sh index ead831849..4d10e752f 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -8,7 +8,7 @@ set -euo pipefail # Regenerate encrypted-domain SQL from the Rust catalog before building. -# Generated files (src/encrypted_domain//_*.sql) are gitignored; the +# Generated files (src/v3/scalars//_*.sql) are gitignored; the # catalog at crates/eql-scalars/src (eql-scalars::CATALOG) is the source of # truth, rendered by the eql-codegen binary. # @@ -17,8 +17,8 @@ set -euo pipefail # pick up. eql-codegen cleans within a directory it regenerates, but never # runs for a type no longer in the catalog. Hand-written *_extensions.sql is # preserved by the name patterns; -mindepth 2 keeps the type-agnostic -# src/encrypted_domain/functions.sql safe. -find src/encrypted_domain -mindepth 2 -type f \ +# src/v3/scalars/functions.sql safe. +find src/v3/scalars -mindepth 2 -type f \ \( -name '*_types.sql' -o -name '*_functions.sql' -o -name '*_operators.sql' \ -o -name '*_aggregates.sql' \) \ -delete 2>/dev/null || true @@ -59,6 +59,9 @@ rm -f release/cipherstash-encrypt-supabase.sql rm -f release/cipherstash-encrypt-protect.sql rm -f release/cipherstash-encrypt-protect-uninstall.sql +rm -f release/cipherstash-encrypt-v3.sql +rm -f release/cipherstash-encrypt-v3-uninstall.sql + rm -f dbdev/eql--0.0.0.sql rm -f src/version.sql @@ -68,6 +71,8 @@ rm -f src/deps-supabase.txt rm -f src/deps-ordered-supabase.txt rm -f src/deps-protect.txt rm -f src/deps-ordered-protect.txt +rm -f src/deps-v3.txt +rm -f src/deps-ordered-v3.txt RELEASE_VERSION=${usage_version:-DEV} @@ -163,6 +168,37 @@ cat tasks/pin_search_path.sql >> release/cipherstash-encrypt-protect.sql cat tasks/uninstall-protect.sql >> release/cipherstash-encrypt-protect-uninstall.sql +# v3-only build (design D9): the self-contained eql_v3 surface — schema, SEM +# types, scalar domains — globbed from src/v3 ONLY. This is the unit the +# self-containment gate greps; it is the only artifact that can be "free of +# eql_v2", because the combined variants glob all of src/. It deliberately does +# NOT append tasks/pin_search_path.sql (D11): that script is eql_v2-coupled +# (raises if public.eql_v2_encrypted / eql_v2.ste_vec_entry are absent and only +# ever pins eql_v2 functions), so appending it would both fail a clean v3 +# install and break the self-containment grep. +find src/v3 -type f -path "*.sql" ! -path "*_test.sql" | while IFS= read -r sql_file; do + echo $sql_file + + echo "$sql_file $sql_file" >> src/deps-v3.txt + + while IFS= read -r line; do + if [[ "$line" == *"-- REQUIRE:"* ]]; then + deps=${line#*-- REQUIRE: } + for dep in $deps; do + echo "$sql_file $dep" >> src/deps-v3.txt + done + fi + done < "$sql_file" +done + +cat src/deps-v3.txt | tsort | tac > src/deps-ordered-v3.txt +verify_deps_exist src/deps-ordered-v3.txt + +cat src/deps-ordered-v3.txt | xargs cat | grep -v REQUIRE >> release/cipherstash-encrypt-v3.sql + +cat tasks/uninstall-v3.sql >> release/cipherstash-encrypt-v3-uninstall.sql + + echo echo '###############################################' echo "# ✅Build succeeded" @@ -172,8 +208,10 @@ echo 'Installer:' echo ' release/cipherstash-encrypt.sql' echo ' release/cipherstash-encrypt-supabase.sql' echo ' release/cipherstash-encrypt-protect.sql' +echo ' release/cipherstash-encrypt-v3.sql' echo echo 'Uninstaller:' echo ' release/cipherstash-encrypt-uninstall.sql' echo ' release/cipherstash-encrypt-uninstall-supabase.sql' echo ' release/cipherstash-encrypt-protect-uninstall.sql' +echo ' release/cipherstash-encrypt-v3-uninstall.sql' diff --git a/tasks/uninstall-v3.sql b/tasks/uninstall-v3.sql new file mode 100644 index 000000000..ce680dc95 --- /dev/null +++ b/tasks/uninstall-v3.sql @@ -0,0 +1,3 @@ +-- Uninstall the standalone eql_v3 surface. CASCADE removes the domains, SEM +-- types, operators, opclass, and any columns typed with the eql_v3 domains. +DROP SCHEMA IF EXISTS eql_v3 CASCADE; From e1caba23b720df7efe2ecc58688e1c9258c8908c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:49:46 +1000 Subject: [PATCH 072/599] fix(v3): keep eql_v3 SEM ore_block/hmac_256 inlinable in the combined build The combined-build pin_search_path allowlist is eql_v2-scoped; the self-contained eql_v3 SEM functions (composite/jsonb args) would be pinned, silently breaking v3 functional-index inlining. Mirror the eql_v2 treatment, allowlist them in splinter, and add a direct regression guard. --- tasks/pin_search_path.sql | 26 +++++++++++- tasks/test/splinter.sh | 11 ++++- .../encrypted_domain/family/inlinability.rs | 41 +++++++++++++++++++ 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql index 774be740b..1abf9c7df 100644 --- a/tasks/pin_search_path.sql +++ b/tasks/pin_search_path.sql @@ -99,7 +99,8 @@ BEGIN SELECT pg_catalog.array_agg(p.oid) INTO inline_critical_oids FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE n.nspname = 'eql_v2' + WHERE ( + n.nspname = 'eql_v2' AND ( -- Same-type (encrypted, encrypted) operators that must inline. -- `like`/`ilike` are the SQL helpers that `~~`/`~~*` delegate to; @@ -244,7 +245,28 @@ BEGIN OR p.proargtypes[0] = (SELECT t.oid FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = 'eql_v2' AND t.typname = 'stevec_query'))) - ); + ) + ) + OR ( + -- eql_v3 SEM index-term functions (self-contained fork). These mirror the + -- eql_v2 ore_block / hmac_256 inline-critical clauses above: the + -- comparison-wrapper inlining for the eql_v3 *_ord domains and eq_term only + -- reaches functional-index matching if these inner functions stay inlinable + -- (no SET, IMMUTABLE). The generated extractors/wrappers themselves are + -- spared by the jsonb-DOMAIN structural skip below; these SEM functions take + -- a composite (ore_block) or raw jsonb (hmac_256) arg, so they need an + -- explicit entry here. + n.nspname = 'eql_v3' + AND ( + (p.pronargs = 2 + AND p.proname IN ('ore_block_u64_8_256_eq', 'ore_block_u64_8_256_neq', + 'ore_block_u64_8_256_lt', 'ore_block_u64_8_256_lte', + 'ore_block_u64_8_256_gt', 'ore_block_u64_8_256_gte')) + OR (p.pronargs = 1 + AND p.proname = 'hmac_256' + AND p.proargtypes[0] = jsonb_oid) + ) + ); FOR fn_oid IN SELECT p.oid diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index a01de51a7..9d8c3cb10 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -107,8 +107,8 @@ function_search_path_mutable eql_v2 grouped_value function Aggregate: same as mi # encrypted-type operators above; splinter matches by (schema, name, type), so # they need their own rows. The plpgsql blockers are pinned by # tasks/pin_search_path.sql and do not surface here. -function_search_path_mutable eql_v3 eq_term function HMAC equality term extractor for the eql_v3 *_eq domains: returns eql_v2.hmac_256. Must inline so `eql_v3.eq_term(col)` folds into the calling query and matches the functional hash/btree index built on the same expression. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). -function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v2.ore_block_u64_8_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). +function_search_path_mutable eql_v3 eq_term function HMAC equality term extractor for the eql_v3 *_eq domains: returns eql_v3.hmac_256. Must inline so `eql_v3.eq_term(col)` folds into the calling query and matches the functional hash/btree index built on the same expression. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). +function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v3.ore_block_u64_8_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). function_search_path_mutable eql_v3 eq function Equality comparison wrapper on the eql_v3 domains. Inlines to `eq_term(a) = eq_term(b)`; must reach the functional index on eql_v3.eq_term(col) for bare-form equality to engage Index Scan. Covers the converged eq wrappers on the eql_v3 int4 variants. function_search_path_mutable eql_v3 neq function Inequality comparison wrapper on the eql_v3 domains. Same rationale as eql_v3.eq. function_search_path_mutable eql_v3 lt function Less-than comparison wrapper on the eql_v3 ordered domains. Inlines to `ord_term(a) < ord_term(b)`; must reach the functional btree index on eql_v3.ord_term(col) for range queries to engage Index Scan. @@ -117,6 +117,13 @@ function_search_path_mutable eql_v3 gt function Greater-than comparison wrapper function_search_path_mutable eql_v3 gte function Greater-than-or-equal comparison wrapper on the eql_v3 ordered domains. Same rationale as eql_v3.lt. function_search_path_mutable eql_v3 min function Per-domain MIN aggregate on the eql_v3 ordered domains (splinter labels aggregates type=function): ALTER AGGREGATE has no SET configuration_parameter syntax, and ALTER ROUTINE/FUNCTION reject aggregates. The aggregate's SFUNC carries a pinned search_path. function_search_path_mutable eql_v3 max function Per-domain MAX aggregate on the eql_v3 ordered domains. Same as eql_v3.min. +function_search_path_mutable eql_v3 ore_block_u64_8_256_eq function Inner comparator for the eql_v3 ore_block_u64_8_256 type's `=` operator (self-contained SEM fork). The eql_v3 *_ord comparison wrappers inline to `ord_term(a) op ord_term(b)`; the planner only carries that through to the functional ORE index if this inner function is also inlinable (no SET, IMMUTABLE). Mirrors eql_v2.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_u64_8_256_neq function Inner comparator for the eql_v3 ore_block_u64_8_256 `<>` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_u64_8_256_lt function Inner comparator for the eql_v3 ore_block_u64_8_256 `<` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_u64_8_256_lte function Inner comparator for the eql_v3 ore_block_u64_8_256 `<=` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_u64_8_256_gt function Inner comparator for the eql_v3 ore_block_u64_8_256 `>` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_u64_8_256_gte function Inner comparator for the eql_v3 ore_block_u64_8_256 `>=` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.eq_term. Must inline so the functional hash/btree index on eql_v3.eq_term(col) engages. Mirrors eql_v2.hmac_256. ALLOW # Wrap splinter (a single bare SELECT expression) into a subquery we can diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 3cacb605a..7e17e2654 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -87,6 +87,47 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> Ok(()) } +/// Direct guard for the self-contained eql_v3 SEM index-term functions. Unlike +/// the structural guard above (which covers jsonb-domain-arg functions), these +/// take a composite (ore_block_u64_8_256) or raw jsonb (hmac_256) arg, so they +/// are NOT caught by the structural pin-skip and need explicit inline_critical +/// allowlisting. If pin_search_path.sql pins any of them, v3 functional-index +/// inlining silently regresses to Seq Scan — this test fails instead. +#[sqlx::test] +async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Result<()> { + let rows: Vec<(String,)> = sqlx::query_as( + r#" + SELECT p.proname || '(' || pg_catalog.pg_get_function_arguments(p.oid) || ')' + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE n.nspname = 'eql_v3' + AND ( + (p.pronargs = 2 AND p.proname IN ( + 'ore_block_u64_8_256_eq','ore_block_u64_8_256_neq', + 'ore_block_u64_8_256_lt','ore_block_u64_8_256_lte', + 'ore_block_u64_8_256_gt','ore_block_u64_8_256_gte')) + OR (p.pronargs = 1 AND p.proname = 'hmac_256') + ) + AND ( + -- offender: pinned search_path, or not inlinable SQL/IMMUTABLE + EXISTS (SELECT 1 FROM unnest(coalesce(p.proconfig,'{}'::text[])) c WHERE c LIKE 'search_path=%') + OR p.provolatile <> 'i' + OR p.prolang <> (SELECT l.oid FROM pg_catalog.pg_language l WHERE l.lanname = 'sql') + ) + ORDER BY 1 + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + rows.is_empty(), + "eql_v3 SEM inline-critical functions must stay unpinned + inlinable SQL; offenders: {:?}", + rows.iter().map(|r| &r.0).collect::>() + ); + Ok(()) +} + #[sqlx::test] async fn every_inline_critical_eligible_domain_has_inline_critical_functions( pool: PgPool, From ef3700af173931f843dfc63f634c8259fd21fce9 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:50:44 +1000 Subject: [PATCH 073/599] test(v3): add self-containment gate (symbol + file + artifact) and CI job --- .github/workflows/test-eql.yml | 28 ++++++++++++++++++++ tasks/test/self_contained_v3.sh | 47 +++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100755 tasks/test/self_contained_v3.sh diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index d74f2946a..76062cfe4 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -127,6 +127,34 @@ jobs: run: | mise run codegen:parity + self-contained-v3: + name: "eql_v3 self-containment" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests + + # Build to materialise release/cipherstash-encrypt-v3.sql and + # src/deps-ordered-v3.txt, then assert no eql_v2 symbol/file leakage. + - name: Build EQL + run: mise run --force build + + - name: Assert eql_v3 is self-contained + run: mise run test:self_contained_v3 + matrix-coverage: name: "Matrix coverage inventory" runs-on: ubuntu-latest diff --git a/tasks/test/self_contained_v3.sh b/tasks/test/self_contained_v3.sh new file mode 100755 index 000000000..59373cc92 --- /dev/null +++ b/tasks/test/self_contained_v3.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +#MISE description="Assert the eql_v3 surface is self-contained (no eql_v2 symbol/file leakage)" + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO_ROOT" + +fail=0 + +# Symbol level (design goal 1): no eql_v2. anywhere under src/v3 — the +# hand-written SEM + foundation files plus the gitignored generated scalar +# surface (present because build runs codegen). Run `mise run build` first. +echo "==> Symbol gate: no 'eql_v2.' under src/v3" +if grep -rn 'eql_v2\.' src/v3; then + echo "ERROR: eql_v2. reference found in src/v3 (must be self-contained)" >&2 + fail=1 +fi + +# File level (design goal 2): the v3-only dependency closure pulls in no file +# outside src/v3/. tsort output is one path per line. +if [[ ! -f src/deps-ordered-v3.txt ]]; then + echo "ERROR: src/deps-ordered-v3.txt missing — run 'mise run build' first" >&2 + exit 2 +fi +echo "==> File gate: every path in src/deps-ordered-v3.txt is under src/v3/" +if grep -v '^src/v3/' src/deps-ordered-v3.txt; then + echo "ERROR: v3 dep closure pulls in a path outside src/v3/ (eql_v2 file leak)" >&2 + fail=1 +fi + +# Belt-and-braces: the assembled artifact carries no eql_v2 symbol. +echo "==> Artifact gate: release/cipherstash-encrypt-v3.sql has no 'eql_v2.'" +if [[ ! -f release/cipherstash-encrypt-v3.sql ]]; then + echo "ERROR: release/cipherstash-encrypt-v3.sql missing — run 'mise run build' first" >&2 + exit 2 +fi +if grep -n 'eql_v2\.' release/cipherstash-encrypt-v3.sql; then + echo "ERROR: assembled v3 artifact contains an eql_v2. reference" >&2 + fail=1 +fi + +if [[ $fail -ne 0 ]]; then + echo "self-containment gate FAILED" >&2 + exit 1 +fi +echo "self-containment gate OK" From d20df2f96d8fa93a2c1daa11c211848c39885605 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:51:28 +1000 Subject: [PATCH 074/599] test(v3): assert the v3 artifact is self-contained and v2-decoupled --- tests/sqlx/tests/build_validation_tests.rs | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/sqlx/tests/build_validation_tests.rs b/tests/sqlx/tests/build_validation_tests.rs index 264f770bf..d23ba5a54 100644 --- a/tests/sqlx/tests/build_validation_tests.rs +++ b/tests/sqlx/tests/build_validation_tests.rs @@ -138,3 +138,52 @@ fn protect_variant_is_smaller_than_full() { full.len() ); } + +// ============================================================================= +// v3-only Variant Tests (design D9/D11 — self-contained eql_v3 surface) +// ============================================================================= + +#[test] +fn v3_variant_file_exists() { + assert!( + Path::new("../../release/cipherstash-encrypt-v3.sql").exists(), + "v3-only variant installer should exist" + ); +} + +#[test] +fn v3_uninstaller_exists() { + assert!( + Path::new("../../release/cipherstash-encrypt-v3-uninstall.sql").exists(), + "v3-only variant uninstaller should exist" + ); +} + +#[test] +fn v3_variant_creates_eql_v3_schema() { + let sql = read_release_sql("cipherstash-encrypt-v3.sql"); + assert!( + sql.contains("CREATE SCHEMA eql_v3"), + "v3 variant must create the eql_v3 schema" + ); +} + +#[test] +fn v3_variant_has_no_eql_v2_symbol() { + let sql = read_release_sql("cipherstash-encrypt-v3.sql"); + assert!( + !sql.contains("eql_v2."), + "v3 variant must be self-contained (no eql_v2. reference)" + ); +} + +#[test] +fn v3_variant_omits_v2_coupled_pin_search_path() { + // D11: the v3 artifact must NOT append tasks/pin_search_path.sql, which is + // eql_v2-coupled (references eql_v2_encrypted / ste_vec_entry). + let sql = read_release_sql("cipherstash-encrypt-v3.sql"); + assert!( + !sql.contains("ste_vec_entry") && !sql.contains("eql_v2_encrypted"), + "v3 variant must not carry the eql_v2-coupled pin_search_path script" + ); +} From f38782bff48facfd1f2c496f77d49fc72232c39f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:54:01 +1000 Subject: [PATCH 075/599] test(v3): clean-DB install + functional-index smoke (proves D11, D4) --- .github/workflows/test-eql.yml | 5 +++ tasks/test/clean_install_v3.sh | 70 ++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100755 tasks/test/clean_install_v3.sh diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 76062cfe4..776d701a8 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -244,6 +244,11 @@ jobs: rustup component add --toolchain ${active_rust_toolchain} rustfmt clippy mise run --output prefix test --postgres ${POSTGRES_VERSION} + - name: Clean-DB v3 install smoke (Postgres ${{ matrix.postgres-version }}) + run: | + mise run build + mise run test:clean_install_v3 + splinter: name: "Supabase splinter" runs-on: ubuntu-latest-m diff --git a/tasks/test/clean_install_v3.sh b/tasks/test/clean_install_v3.sh new file mode 100755 index 000000000..7c771da8d --- /dev/null +++ b/tasks/test/clean_install_v3.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +#MISE description="Install release/cipherstash-encrypt-v3.sql into a scratch DB with NO eql_v2 and smoke-test it (D11, D4)" +#USAGE flag "--port " help="Postgres port" default="7432" +#USAGE flag "--user " help="Postgres user" default="cipherstash" + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO_ROOT" + +PG_PORT="${usage_port:-7432}" +PG_USER="${usage_user:-cipherstash}" +export PGPASSWORD="${POSTGRES_PASSWORD:-password}" +SCRATCH_DB="cipherstash_v3_clean" + +ADMIN=(psql -U "$PG_USER" -h localhost -p "$PG_PORT" -d postgres -v ON_ERROR_STOP=1 -q) +RUN=(psql -U "$PG_USER" -h localhost -p "$PG_PORT" -d "$SCRATCH_DB" -v ON_ERROR_STOP=1 -q) + +test -f release/cipherstash-encrypt-v3.sql || { echo "Build first: release/cipherstash-encrypt-v3.sql missing" >&2; exit 2; } + +echo "==> (re)creating scratch database $SCRATCH_DB (no eql_v2 installed)" +"${ADMIN[@]}" -c "DROP DATABASE IF EXISTS ${SCRATCH_DB} WITH (FORCE);" +"${ADMIN[@]}" -c "CREATE DATABASE ${SCRATCH_DB};" + +cleanup() { "${ADMIN[@]}" -c "DROP DATABASE IF EXISTS ${SCRATCH_DB} WITH (FORCE);" >/dev/null 2>&1 || true; } +trap cleanup EXIT + +echo "==> installing the standalone eql_v3 surface" +"${RUN[@]}" -f release/cipherstash-encrypt-v3.sql + +echo "==> asserting NO eql_v2 schema exists (proves no v2 dependency)" +"${RUN[@]}" -c "DO \$\$ BEGIN IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'eql_v2') THEN RAISE EXCEPTION 'eql_v2 schema unexpectedly present'; END IF; END \$\$;" + +echo "==> smoke: domains, SEM types, extractors, opclass functional index (D4)" +"${RUN[@]}" <<'SQL' +-- Domains and SEM types exist in eql_v3. +SELECT 'eql_v3.int4_ord'::regtype; +SELECT 'eql_v3.hmac_256'::regtype; +SELECT 'eql_v3.ore_block_u64_8_256'::regtype; + +-- A real ordered-domain column + the documented functional index. This is the +-- D4 proof: it fails outright if the ported operator_class is absent. +CREATE TABLE v3_smoke (c eql_v3.int4_ord); +CREATE INDEX v3_smoke_ord ON v3_smoke (eql_v3.ord_term(c)); +DROP TABLE v3_smoke; +SQL + +echo "==> smoke: the shared blocker is reachable and raises" +"${RUN[@]}" <<'SQL' +DO $$ +DECLARE + raised boolean := false; +BEGIN + -- The blocker always RAISEs; catch it and assert we got the expected message. + BEGIN + PERFORM eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); + EXCEPTION WHEN OTHERS THEN + raised := true; + IF SQLERRM <> 'operator < is not supported for eql_v3.int4' THEN + RAISE EXCEPTION 'blocker raised an unexpected message: %', SQLERRM; + END IF; + END; + + IF NOT raised THEN + RAISE EXCEPTION 'blocker eql_v3.encrypted_domain_unsupported_bool did not raise'; + END IF; +END $$; +SQL + +echo "clean v3 install OK (D11 + D4 proven)" From 1f9f171dd4462aaf39bca3af51cf41b5b59a5be3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 14:58:30 +1000 Subject: [PATCH 076/599] docs(v3): document the self-contained eql_v3 schema and v3-only installer --- CHANGELOG.md | 3 +- CLAUDE.md | 10 ++-- .../adding-a-scalar-encrypted-domain-type.md | 49 +++++++++++-------- tests/codegen/reference/README.md | 2 +- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7969bf32f..d15fa325e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,10 +22,11 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added -- **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors still return the core `eql_v2.hmac_256` / `eql_v2.ore_block_u64_8_256` index-term types, which remain in `eql_v2` and are referenced cross-schema. Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) +- **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_u64_8_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) +- **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) ### Changed diff --git a/CLAUDE.md b/CLAUDE.md index 50766e33a..9c9a08ca2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,6 +37,7 @@ This project uses `mise` for task management. Common commands: - `cipherstash-encrypt.sql` - Main installer - `cipherstash-encrypt-supabase.sql` - Supabase-compatible (excludes operator classes) - `cipherstash-encrypt-protect.sql` - ProtectJS variant (excludes config management) + - `cipherstash-encrypt-v3.sql` - Standalone, self-contained `eql_v3` surface only (globbed from `src/v3` alone; no `eql_v2`, installable into a DB with no `eql_v2` present) - Corresponding uninstallers for each variant #### Build Variants @@ -45,13 +46,14 @@ This project uses `mise` for task management. Common commands: | Main | Nothing | Full EQL with all features | | Supabase | Operator classes | Supabase compatibility | | Protect | `src/config/*`, `src/encryptindex/*` | ProtectJS (no database-side config) | +| v3-only | Everything outside `src/v3` (and `pin_search_path.sql`) | Self-contained `eql_v3` surface, `eql_v2`-free (gated by `mise run test:self_contained_v3`) | ## Project Architecture This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for searchable encryption. Key architectural components: ### Core Structure -- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4` and future scalar domains) live in a separate `eql_v3` schema (see below); they reuse the core `eql_v2` index-term types cross-schema. `eql_v2` is unchanged and remains the documented public API. +- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4` and future scalar domains) live in a separate `eql_v3` schema (see below). The `eql_v3` surface is **self-contained**: it owns its own copies of the searchable-encrypted-metadata (SEM) index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_u64_8_256`, hand-written under `src/v3/sem/`) and has no runtime dependency on `eql_v2`. `eql_v2` is unchanged and remains the documented public API. - **Main Type**: `eql_v2_encrypted` - composite type for encrypted columns (stored as JSONB) - **Configuration**: `eql_v2_configuration` table tracks encryption configs - **Index Types**: Various encrypted index types (blake3, hmac_256, bloom_filter, ore variants) @@ -62,7 +64,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search - `src/operators/` - SQL operators for encrypted data comparisons - `src/config/` - Configuration management functions - `src/blake3/`, `src/hmac_256/`, `src/bloom_filter/`, `src/ore_*` - Index implementations -- `src/encrypted_domain/` - Encrypted-domain type families (jsonb-backed PostgreSQL domains, one per operator/index capability) +- `src/v3/` - Self-contained `eql_v3` surface: `src/v3/schema.sql`, forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_u64_8_256`), and the generated scalar encrypted-domain families under `src/v3/scalars//` (plus the shared blocker `src/v3/scalars/functions.sql`) - `tasks/` - mise task scripts - `tests/sqlx/` - Rust/SQLx test framework (PostgreSQL 14-17 support) - `release/` - Generated SQL installation files @@ -76,9 +78,9 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/encrypted_domain/` holds **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, but the index-term types they return and construct (`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are referenced cross-schema. `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_u64_8_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. -Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/encrypted_domain//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/encrypted_domain//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. **Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 68d913e8a..e4ae242b8 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -11,9 +11,11 @@ A scalar encrypted-domain type is a family of concrete `jsonb` domains in the **`eql_v3`** schema (`eql_v3.`, `eql_v3._eq`, `eql_v3._ord`, …), dropped by `DROP SCHEMA eql_v3 CASCADE` and surviving an `eql_v2` uninstall. Their extractors, comparison wrappers, and MIN/MAX -aggregates also live in `eql_v3`; the index-term types they return -(`eql_v2.hmac_256`, `eql_v2.ore_block_u64_8_256`) stay in `eql_v2` and are -referenced cross-schema. +aggregates also live in `eql_v3`; the searchable-encrypted-metadata (SEM) +index-term types they return (`eql_v3.hmac_256`, +`eql_v3.ore_block_u64_8_256`) are **also `eql_v3`** — hand-written under +`src/v3/sem/`. The whole v3 surface is self-contained: it owns every type it +needs and has no runtime dependency on `eql_v2` (CI gates this — see §6). The whole SQL surface is **generated** from a single Rust source of truth: the `CATALOG` const in [`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs), @@ -60,7 +62,7 @@ Things you do **not** do: has a new name (§5). Hand-written SQL beyond the fixed surface goes in -`src/encrypted_domain//_extensions.sql` with explicit `-- REQUIRE:` edges +`src/v3/scalars//_extensions.sql` with explicit `-- REQUIRE:` edges — and **that file IS committed** (§5). --- @@ -111,8 +113,8 @@ contract — changing one is a generated-SQL behaviour change, not a refactor: | Term | JSON key | Extractor | Returns | Operators | | ----- | -------- | ----------- | -------------------------------- | -------------------------- | -| `Hm` | `hm` | `eq_term` | `eql_v2.hmac_256` | `=` `<>` | -| `Ore` | `ob` | `ord_term` | `eql_v2.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | +| `Hm` | `hm` | `eq_term` | `eql_v3.hmac_256` | `=` `<>` | +| `Ore` | `ob` | `ord_term` | `eql_v3.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | A type that needs a non-ORE equality term on an ordered domain needs a **new `Term`**, not a catalog flag. Adding a term is a code change to the `Term` @@ -290,7 +292,7 @@ This is the contract the generated SQL satisfies. You normally never read it to ### Domains and CHECK constraints -The generator emits `src/encrypted_domain//_types.sql` (gitignored; +The generator emits `src/v3/scalars//_types.sql` (gitignored; materialised on every build) with one idempotent `DO $$ ... $$` block. Every domain is a concrete domain over `jsonb` in the `eql_v3` schema — **never** `CREATE DOMAIN a AS b` over another generated domain (PostgreSQL resolves @@ -411,14 +413,14 @@ CREATE INDEX ... ON table_name USING btree (eql_v3.ord_term(col)); CREATE INDEX ... ON table_name USING hash (eql_v3.eq_term(col)); ``` -`ore` depends on `src/ore_block_u64_8_256/functions.sql` and -`src/ore_block_u64_8_256/operators.sql`; `hm` depends on -`src/hmac_256/functions.sql`. +`ore` depends on `src/v3/sem/ore_block_u64_8_256/functions.sql` and +`src/v3/sem/ore_block_u64_8_256/operators.sql`; `hm` depends on +`src/v3/sem/hmac_256/functions.sql`. ### Extension files Optional hand-written SQL beyond the fixed surface belongs in -`src/encrypted_domain//_extensions.sql`. The generator never creates, +`src/v3/scalars//_extensions.sql`. The generator never creates, lists, headers, or cleans it; it must declare its own `-- REQUIRE:` edges (usually to `_types.sql` and whichever generated function or operator file it extends). Use it for cross-domain casts, helper functions, or type-specific @@ -495,7 +497,7 @@ silently bypasses its exception; a pinned `search_path` reverts queries to seq scans. The generator exists so each new type adds one `CATALOG` row rather than ninety hand-written declarations that must agree with each other and with `pin_search_path.sql`, `tasks/test/splinter.sh`, and -`src/encrypted_domain/functions.sql`. +`src/v3/scalars/functions.sql`. ### Pipeline @@ -503,15 +505,20 @@ ninety hand-written declarations that must agree with each other and with runs as `cargo run -p eql-codegen` (no subcommand), which calls `generate::generate_all` (`crates/eql-codegen/src/generate.rs`) over every row of `eql_scalars::CATALOG`, writing each type's SQL into -`src/encrypted_domain//`. A second subcommand, `cargo run -p eql-codegen +`src/v3/scalars//`. A second subcommand, `cargo run -p eql-codegen -- list-types`, prints the catalog tokens one per line (consumed by the fixture and matrix-inventory enumeration). `main` (`crates/eql-codegen/src/main.rs`) recognises exactly these two forms; any other argument is a usage error. +The generator targets the `eql_v3` schema throughout: `CORE_SCHEMA = "eql_v3"` +(`crates/eql-codegen/src/consts.rs`) qualifies both the domain families and the +SEM index-term types the extractors return (`eql_v3.hmac_256`, +`eql_v3.ore_block_u64_8_256`), so no generated SQL references `eql_v2`. + `tasks/build.sh` runs `cargo run -p eql-codegen` at the start of every `mise run build`, so the generated SQL is never checked in. (The build first sweeps every generated `*_{types,functions,operators,aggregates}.sql` under -`src/encrypted_domain` so a type removed from `CATALOG` cannot leave orphans the +`src/v3/scalars` so a type removed from `CATALOG` cannot leave orphans the `src/**/*.sql` build glob would pick up; hand-written `*_extensions.sql` is preserved by the name patterns.) @@ -549,9 +556,9 @@ output for every catalog type from scratch. ### Generated outputs For a type with `D` domains of which `A` are ordered, the generator writes `1 + -2D + A` SQL files into `src/encrypted_domain//`. For `int4` (`D = 4`, `A = +2D + A` SQL files into `src/v3/scalars//`. For `int4` (`D = 4`, `A = 2`): eleven SQL files. The outputs are gitignored -(`.gitignore` excludes `src/encrypted_domain/*/*_{types,functions,operators,aggregates}.sql`) +(`.gitignore` excludes `src/v3/scalars/*/*_{types,functions,operators,aggregates}.sql`) and regenerated at the start of every build. | File | Content | @@ -564,11 +571,11 @@ and regenerated at the start of every build. Every file opens with the `-- AUTOMATICALLY GENERATED FILE.` marker (the project-wide marker `docs:validate` greps on to skip generated SQL — `crates/eql-codegen/src/consts.rs`), declares its `-- REQUIRE:` edges in -dependency order (types files require `src/schema-v3.sql`; function files require -both `src/schema.sql` and `src/schema-v3.sql`, the types file, and -`src/encrypted_domain/functions.sql` plus each term's `requires` set; operator -files require `src/schema-v3.sql`, the types file, and their domain's function -file; aggregate files require `src/schema-v3.sql`, the types file, and their +dependency order (types files require `src/v3/schema.sql`; function files require +`src/v3/schema.sql`, the types file, and +`src/v3/scalars/functions.sql` plus each term's `requires` set; operator +files require `src/v3/schema.sql`, the types file, and their domain's function +file; aggregate files require `src/v3/schema.sql`, the types file, and their domain's function and operator files), and carries Doxygen `--! @file` / `--! @brief` headers. diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index 186d6d5cb..fb2de7207 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -4,7 +4,7 @@ The SQL files under `int4/` are the hand-maintained golden reference for the enc Each reference file's first line is a `-- REFERENCE:` provenance marker; everything after it is the generated body verbatim, starting with the template-owned `-- AUTOMATICALLY GENERATED FILE.` header. -The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the real `src/encrypted_domain/int4/` tree) and asserts its output matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same reference: +The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the real `src/v3/scalars/int4/` tree) and asserts its output matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same reference: - `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate. It first compares the generated `int4` SQL *file set* against the golden `*.sql` set (`comm -23` against `git ls-files` excludes the committed, hand-written `int4_extensions.sql`, which has no golden counterpart) to catch extra/dropped files, then `diff`s each golden file against its generated counterpart after `tail -n +2` drops the provenance line. Any whitespace or blank-line drift fails — there is no normalization. - `crates/eql-codegen/tests/parity.rs` (`rust_generator_matches_int4_golden_files`) — runs `generate_all` into a temp dir and byte-compares the materialised `int4` SQL surface against the same golden. From fb483aed35d1b931dfb99212db57557d865b7c90 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 15:15:06 +1000 Subject: [PATCH 077/599] test(v3): update family mutation tests + drop-opclass fixture for the eql_v3 SEM fork The ord_term extractor now returns eql_v3.ore_block_u64_8_256 (D12), so the CREATE-OR-REPLACE mutation redefinitions must declare the eql_v3 return type and construct eql_v3 SEM terms; the eq-reroute mutations move to eql_v3 SEM too. The drop_operator_classes fixture now also drops the new eql_v3 ORE btree opclass, which the Supabase build's **/*operator_class.sql glob likewise excludes. --- tests/sqlx/fixtures/drop_operator_classes.sql | 7 +++++++ .../tests/encrypted_domain/family/mutations.rs | 16 ++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/tests/sqlx/fixtures/drop_operator_classes.sql b/tests/sqlx/fixtures/drop_operator_classes.sql index 2c5632bb0..094073aa3 100644 --- a/tests/sqlx/fixtures/drop_operator_classes.sql +++ b/tests/sqlx/fixtures/drop_operator_classes.sql @@ -16,6 +16,13 @@ DROP OPERATOR FAMILY IF EXISTS eql_v2.encrypted_hash_operator_family USING hash DROP OPERATOR CLASS IF EXISTS eql_v2.ore_block_u64_8_256_operator_class USING btree CASCADE; DROP OPERATOR FAMILY IF EXISTS eql_v2.ore_block_u64_8_256_operator_family USING btree CASCADE; +-- Drop the self-contained eql_v3 ORE btree operator class too — its file carries +-- the `*operator_class.sql` suffix, so the Supabase build's `**/*operator_class.sql` +-- glob excludes it as well. Without this the unqualified-name opclass check below +-- still finds the eql_v3 copy. +DROP OPERATOR CLASS IF EXISTS eql_v3.ore_block_u64_8_256_operator_class USING btree CASCADE; +DROP OPERATOR FAMILY IF EXISTS eql_v3.ore_block_u64_8_256_operator_family USING btree CASCADE; + -- Drop ore_block_u64_8_256 operators (also excluded from Supabase build) DROP OPERATOR IF EXISTS = (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; DROP OPERATOR IF EXISTS <> (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index 7be208531..36d394d88 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -143,14 +143,14 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul "baseline: `_ord` `=` must match exactly the pivot via ob with hm stripped (got {baseline})" ); - // Mutation: reroute `_ord` `=` through HMAC. `eql_v2.hmac_256(jsonb)` is + // Mutation: reroute `_ord` `=` through HMAC. `eql_v3.hmac_256(jsonb)` is // STRICT and the `hm` key is absent, so it yields NULL and `=` matches // nothing. mutate( &pool, "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_ord, b eql_v3.int4_ord) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ - AS $$ SELECT eql_v2.hmac_256(a::jsonb) = eql_v2.hmac_256(b::jsonb) $$", + AS $$ SELECT eql_v3.hmac_256(a::jsonb) = eql_v3.hmac_256(b::jsonb) $$", ) .await?; @@ -297,12 +297,12 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { ); // Mutation: reroute `_eq` `=` through ORE. The `ob` key is absent, so - // `eql_v2.ore_block_u64_8_256(jsonb)` raises rather than matching. + // `eql_v3.ore_block_u64_8_256(jsonb)` raises rather than matching. mutate( &pool, "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ - AS $$ SELECT eql_v2.ore_block_u64_8_256(a::jsonb) = eql_v2.ore_block_u64_8_256(b::jsonb) $$", + AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) = eql_v3.ore_block_u64_8_256(b::jsonb) $$", ) .await?; @@ -354,8 +354,8 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ - RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ - AS $mutbody$ SELECT eql_v2.ore_block_u64_8_256('{esc}'::jsonb) $mutbody$", + RETURNS eql_v3.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ + AS $mutbody$ SELECT eql_v3.ore_block_u64_8_256('{esc}'::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); mutate(&pool, &ddl).await?; @@ -409,8 +409,8 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ - RETURNS eql_v2.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ - AS $mutbody$ SELECT eql_v2.ore_block_u64_8_256(\ + RETURNS eql_v3.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ + AS $mutbody$ SELECT eql_v3.ore_block_u64_8_256(\ coalesce(a, '{esc}'::jsonb::eql_v3.int4_ord)::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); From 13d7d66e18dd59475902a97c84353b83fde7bc31 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 15:15:15 +1000 Subject: [PATCH 078/599] refactor(codegen): extract v3 path constants, drop dead Term::returns, fix blocker doc path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hoist the src/v3 path strings into named constants in generate.rs (byte-identical output — parity holds). Remove the now-dead Term::returns() (codegen builds the extractor return type from CORE_SCHEMA + ctor) and its legacy eql_v2 test assertions. Repoint the shared blocker's doc comment to src/v3/scalars//. --- crates/eql-codegen/src/generate.rs | 32 +++++++++++++++++++++--------- crates/eql-scalars/src/lib.rs | 10 ---------- src/v3/scalars/functions.sql | 2 +- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index f71579710..622ca6345 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -7,6 +7,20 @@ use eql_scalars::{DomainSpec, ScalarSpec, Term}; use crate::context::{domain_name, is_ord_capable}; use crate::operator_surface::OPERATORS; +/// REQUIRE edge for the v3 schema file — pulled in by every generated file. +const V3_SCHEMA: &str = "src/v3/schema.sql"; +/// REQUIRE edge for the hand-written shared blocker helper. +const V3_SCALARS_BLOCKER: &str = "src/v3/scalars/functions.sql"; +/// Root of the generated per-token scalar surface. The single place the tree +/// layout is spelled out — keeps `types_path`/`scalar_path` and the REQUIRE +/// vecs from drifting if the surface ever relocates again. +const V3_SCALARS_DIR: &str = "src/v3/scalars"; + +/// REQUIRE path for a generated file `file` under a token's scalar dir. +fn scalar_path(token: &str, file: &str) -> String { + format!("{V3_SCALARS_DIR}/{token}/{file}") +} + /// The full domain name (token + suffix). suffix "" => bare token. fn full_name(token: &str, suffix: &str) -> String { format!("{token}{suffix}") @@ -25,7 +39,7 @@ fn arg_b_name(symbol: &str) -> &'static str { /// REQUIRE path for a type's _types.sql. Port of `_types_path`. fn types_path(token: &str) -> String { - format!("src/v3/scalars/{token}/{token}_types.sql") + scalar_path(token, &format!("{token}_types.sql")) } /// Body for _types.sql: every domain in one idempotent DO block. @@ -50,9 +64,9 @@ pub fn render_types_file(spec: &ScalarSpec) -> String { /// REQUIRE edges for a domain's _functions.sql. Port of `_functions_requires`. fn functions_requires(token: &str, terms: &[Term]) -> Vec { let mut reqs = vec![ - "src/v3/schema.sql".to_string(), + V3_SCHEMA.to_string(), types_path(token), - "src/v3/scalars/functions.sql".to_string(), + V3_SCALARS_BLOCKER.to_string(), ]; for extra in Term::term_requires(terms) { if !reqs.iter().any(|r| r == extra) { @@ -162,9 +176,9 @@ pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { let ctx = OperatorsContext { requires: vec![ - "src/v3/schema.sql".to_string(), + V3_SCHEMA.to_string(), types_path(token), - format!("src/v3/scalars/{token}/{name}_functions.sql"), + scalar_path(token, &format!("{name}_functions.sql")), ], token: token.to_string(), name, @@ -189,10 +203,10 @@ pub fn render_aggregates_file(token: &str, domain: &DomainSpec) -> Option Result, pub fn generate_all(out_root: &Path) -> Result { for spec in eql_scalars::CATALOG { let token = spec.token; - let out_dir = out_root.join("src").join("v3").join("scalars").join(token); + let out_dir = out_root.join(V3_SCALARS_DIR).join(token); let written = generate_type(spec, &out_dir)?; for p in &written { diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 313b0fe9c..6410869aa 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -145,14 +145,6 @@ impl Term { } } - /// Cross-schema return type of the extractor (in `eql_v2`). - pub const fn returns(self) -> &'static str { - match self { - Term::Hm => "eql_v2.hmac_256", - Term::Ore => "eql_v2.ore_block_u64_8_256", - } - } - /// Constructor name for the index-term type (unqualified). pub const fn ctor(self) -> &'static str { match self { @@ -528,7 +520,6 @@ mod term_tests { let hm = Term::Hm; assert_eq!(hm.json_key(), "hm"); assert_eq!(hm.extractor(), "eq_term"); - assert_eq!(hm.returns(), "eql_v2.hmac_256"); assert_eq!(hm.ctor(), "hmac_256"); assert_eq!(hm.role(), "eq"); assert_eq!(hm.operators(), &["=", "<>"]); @@ -540,7 +531,6 @@ mod term_tests { let ore = Term::Ore; assert_eq!(ore.json_key(), "ob"); assert_eq!(ore.extractor(), "ord_term"); - assert_eq!(ore.returns(), "eql_v2.ore_block_u64_8_256"); assert_eq!(ore.ctor(), "ore_block_u64_8_256"); assert_eq!(ore.role(), "ord"); assert_eq!(ore.operators(), &["=", "<>", "<", "<=", ">", ">="]); diff --git a/src/v3/scalars/functions.sql b/src/v3/scalars/functions.sql index ab997a480..532730239 100644 --- a/src/v3/scalars/functions.sql +++ b/src/v3/scalars/functions.sql @@ -3,7 +3,7 @@ --! @file v3/scalars/functions.sql --! @brief Shared blocker helper for the eql_v3 encrypted-domain families. --! ---! Per-domain wrapper functions live in src/encrypted_domain//. +--! Per-domain wrapper functions live in src/v3/scalars//. --! Blockers in those files delegate to encrypted_domain_unsupported_bool --! so every domain raises a uniform domain-specific error rather than --! letting an unsupported operator fall through to native jsonb From 3c3d65dd8d5b7863882cfca5260d21e563bf46a9 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 15:33:47 +1000 Subject: [PATCH 079/599] test(v3): direct coverage for the eql_v3 ORE/HMAC SEM functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The eql_v3 SEM index-term functions are a hand-port of the eql_v2 originals. The scalar matrix already exercises the array comparator's happy path end-to-end against real ciphertext fixtures, but several branches are structurally unreachable there and were tested only on the eql_v2 copies. Add a sibling family test module covering them: - differential v2<->v3 parity on real `ob` fixtures (both sides routed through extractor -> composite -> compare_..._terms, so the schema prefix is the only variable) — the strongest guard against a faithful-port slip; - the 'Ciphertexts are different lengths' RAISE; - NULL-term ordering branches the STRICT wrappers bypass; - array NULL + empty/cardinality recursion base cases; - has_* presence checks, the missing-`ob` RAISE, and the NULL-jsonb short-circuit. Verified non-vacuous: a deliberately broken comparator fails T1/T2/T3 while the independent T4/T5 stay green. --- .../sqlx/tests/encrypted_domain/family/mod.rs | 1 + .../sqlx/tests/encrypted_domain/family/sem.rs | 214 ++++++++++++++++++ 2 files changed, 215 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/family/sem.rs diff --git a/tests/sqlx/tests/encrypted_domain/family/mod.rs b/tests/sqlx/tests/encrypted_domain/family/mod.rs index 6622e0f8c..892842a20 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mod.rs @@ -4,4 +4,5 @@ pub mod inlinability; pub mod jsonb_operator_surface; pub mod mutations; +pub mod sem; pub mod support; diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs new file mode 100644 index 000000000..4f30bac2e --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -0,0 +1,214 @@ +//! Direct behavioural tests for the self-contained `eql_v3` searchable- +//! encrypted-metadata (SEM) index-term functions (`eql_v3.hmac_256`, +//! `eql_v3.ore_block_u64_8_256` and their comparators). +//! +//! These functions are a HAND-PORT of the `eql_v2` originals (`src/v3/sem/`). +//! The scalar matrix already exercises the happy path of the *array* comparator +//! end-to-end against real ciphertext fixtures (ordering, equality, min/max, +//! injectivity, index engagement). This file covers the branches the matrix +//! structurally cannot reach, and which are otherwise tested only on the +//! `eql_v2` copies (in `tests/index_compare_tests.rs`): +//! +//! - T1: differential v2↔v3 parity on real `ob` fixtures (the strongest guard +//! against a faithful-port slip — see below). +//! - T2: the `'Ciphertexts are different lengths'` RAISE (all real fixtures are +//! equal length, so the matrix never hits it). +//! - T3: NULL-term ordering inside `compare_ore_block_u64_8_256_term` — the +//! `STRICT` comparison wrappers short-circuit before these branches run. +//! - T4: array-level NULL + empty/cardinality base cases of the recursion. +//! - T5: presence checks (`has_*`) and the missing-`ob` RAISE. +//! +//! All migrations (`001`–`007`) auto-apply to every `#[sqlx::test]` pool, so the +//! real `ore` table (ids 1–1000) and both schemas are available with no setup. + +use std::collections::HashSet; + +use anyhow::Result; +use eql_tests::assert_raises; +use sqlx::PgPool; + +/// A single term built directly from hex — no encryption needed for the +/// structural/edge-case tests. +fn term(hex: &str) -> String { + format!("ROW(decode('{hex}', 'hex'))::eql_v3.ore_block_u64_8_256_term") +} + +/// T1 — Differential parity: the same real `ob` payload must compare identically +/// through the `eql_v2` and `eql_v3` array comparators. `eql_v2` is the trusted +/// oracle; `eql_v3` is the byte-port. Both sides route through the SAME path +/// (jsonb extractor → composite → `compare_ore_block_u64_8_256_terms`) so the +/// schema prefix is the only variable — any divergence is a genuine port bug. +/// v3 has no encrypted-arg `compare` overload, hence the extractor routing. +#[sqlx::test] +async fn ore_v2_v3_comparator_parity_on_real_fixtures(pool: PgPool) -> Result<()> { + // Pairs spanning equal and unequal ids. Plaintext order of the fixtures is + // undocumented, so we assert v2≡v3 agreement (not a specific sign). + let pairs = [ + (1i64, 1i64), + (1, 2), + (2, 1), + (1, 500), + (500, 1), + (42, 42), + (10, 900), + (900, 10), + ]; + + let sql = r#" + WITH a AS (SELECT e::jsonb AS j FROM ore WHERE id = $1), + b AS (SELECT e::jsonb AS j FROM ore WHERE id = $2) + SELECT + eql_v2.compare_ore_block_u64_8_256_terms( + eql_v2.ore_block_u64_8_256(a.j), eql_v2.ore_block_u64_8_256(b.j)) AS v2, + eql_v3.compare_ore_block_u64_8_256_terms( + eql_v3.ore_block_u64_8_256(a.j), eql_v3.ore_block_u64_8_256(b.j)) AS v3 + FROM a, b + "#; + + let mut v3_signs: HashSet = HashSet::new(); + for (x, y) in pairs { + let (v2, v3): (i32, i32) = sqlx::query_as(sql) + .bind(x) + .bind(y) + .fetch_one(&pool) + .await?; + assert_eq!( + v2, v3, + "eql_v2 and eql_v3 ORE comparators disagree on ids ({x},{y}): v2={v2} v3={v3}" + ); + v3_signs.insert(v3); + } + + // Non-triviality: the sample must have actually exercised lt, eq, and gt — + // otherwise the parity check could pass on a degenerate all-equal path. + assert!(v3_signs.contains(&0), "sample must include an equal pair (0)"); + assert!( + v3_signs.contains(&-1), + "sample must include a less-than pair (-1)" + ); + assert!( + v3_signs.contains(&1), + "sample must include a greater-than pair (1)" + ); + Ok(()) +} + +/// T2 — The term comparator must reject ciphertexts of different lengths. This +/// guard is unreachable via the matrix (every real fixture is equal length). +#[sqlx::test] +async fn ore_term_comparator_rejects_different_length_ciphertexts(pool: PgPool) -> Result<()> { + let sql = format!( + "SELECT eql_v3.compare_ore_block_u64_8_256_term({}, {})", + term("aabbccdd"), // 4 bytes + term("aabbccddee"), // 5 bytes + ); + assert_raises(&pool, &sql, &[], "Ciphertexts are different lengths").await?; + Ok(()) +} + +/// T3 — NULL-term ordering inside `compare_ore_block_u64_8_256_term`. The +/// function is intentionally NOT `STRICT`, so these defensive branches are +/// reachable by a direct call (the `STRICT` comparison wrappers never reach +/// them). Pins: `(NULL, t) = -1`, `(t, NULL) = 1`, `(NULL, NULL) = 0`. +#[sqlx::test] +async fn ore_term_comparator_null_ordering(pool: PgPool) -> Result<()> { + let t = term("aabb"); + let n = "NULL::eql_v3.ore_block_u64_8_256_term"; + + let cases = [ + ( + format!("SELECT eql_v3.compare_ore_block_u64_8_256_term({n}, {t})"), + -1, + ), + ( + format!("SELECT eql_v3.compare_ore_block_u64_8_256_term({t}, {n})"), + 1, + ), + ( + format!("SELECT eql_v3.compare_ore_block_u64_8_256_term({n}, {n})"), + 0, + ), + ]; + + for (sql, expected) in cases { + let got: i32 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + assert_eq!(got, expected, "null-term ordering: {sql}"); + } + Ok(()) +} + +/// T4 — Array-level NULL and empty/cardinality base cases of the recursive +/// `compare_ore_block_u64_8_256_terms(term[], term[])`. NULL array → NULL; +/// both empty → 0; empty vs non-empty → -1; non-empty vs empty → 1. +#[sqlx::test] +async fn ore_terms_array_null_and_empty_base_cases(pool: PgPool) -> Result<()> { + let t = format!("ARRAY[{}]", term("aabb")); + let empty = "ARRAY[]::eql_v3.ore_block_u64_8_256_term[]"; + let null_arr = "NULL::eql_v3.ore_block_u64_8_256_term[]"; + + // NULL array operand → NULL result (the array overload returns NULL; it is + // not STRICT). Typed as Option; the shared `assert_null` helper only + // types Option, so query directly here. + for sql in [ + format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({null_arr}, {t})"), + format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({t}, {null_arr})"), + ] { + let got: Option = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + assert!(got.is_none(), "NULL array operand must yield NULL: {sql}"); + } + + let cases = [ + ( + format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({empty}, {empty})"), + 0, + ), + ( + format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({empty}, {t})"), + -1, + ), + ( + format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({t}, {empty})"), + 1, + ), + ]; + for (sql, expected) in cases { + let got: i32 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + assert_eq!(got, expected, "array base case: {sql}"); + } + Ok(()) +} + +/// T5 — SEM presence checks (`has_ore_block_u64_8_256`, `has_hmac_256`), the +/// extractor's missing-`ob` RAISE, and its NULL-jsonb short-circuit. +#[sqlx::test] +async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<()> { + let bool_cases = [ + (r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":["aa"]}'::jsonb)"#, true), + (r#"SELECT eql_v3.has_ore_block_u64_8_256('{}'::jsonb)"#, false), + // json-null `ob` → `->>` yields NULL → absent. + (r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":null}'::jsonb)"#, false), + (r#"SELECT eql_v3.has_hmac_256('{"hm":"abc"}'::jsonb)"#, true), + (r#"SELECT eql_v3.has_hmac_256('{}'::jsonb)"#, false), + ]; + for (sql, expected) in bool_cases { + let got: bool = sqlx::query_scalar(sql).fetch_one(&pool).await?; + assert_eq!(got, expected, "presence check: {sql}"); + } + + // Missing `ob` → RAISE. + assert_raises( + &pool, + r#"SELECT eql_v3.ore_block_u64_8_256('{"foo":1}'::jsonb)"#, + &[], + "Expected an ore index (ob) value", + ) + .await?; + + // NULL jsonb → NULL composite (STRICT short-circuit), NOT a raise. + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.ore_block_u64_8_256(NULL::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!(is_null, "NULL jsonb must extract to a NULL composite, not raise"); + Ok(()) +} From 5f8994f0c7a80d0653d6042310e07daab6a974ae Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 16:25:46 +1000 Subject: [PATCH 080/599] test(v3): harden self-containment checks to also reject bare eql_v2_ entity names Addresses CodeRabbit review: the artifact/test self-containment assertions only matched schema-qualified eql_v2. references; extend them to also reject eql_v2_ names (eql_v2_encrypted, eql_v2_configuration) while still allowing prose mentions of eql_v2 in doc comments. Verified the v3 artifact and src/v3 contain zero eql_v2_ occurrences. --- tasks/test/self_contained_v3.sh | 15 +++++++++------ tests/sqlx/tests/build_validation_tests.rs | 7 +++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/tasks/test/self_contained_v3.sh b/tasks/test/self_contained_v3.sh index 59373cc92..72466624e 100755 --- a/tasks/test/self_contained_v3.sh +++ b/tasks/test/self_contained_v3.sh @@ -11,9 +11,12 @@ fail=0 # Symbol level (design goal 1): no eql_v2. anywhere under src/v3 — the # hand-written SEM + foundation files plus the gitignored generated scalar # surface (present because build runs codegen). Run `mise run build` first. -echo "==> Symbol gate: no 'eql_v2.' under src/v3" -if grep -rn 'eql_v2\.' src/v3; then - echo "ERROR: eql_v2. reference found in src/v3 (must be self-contained)" >&2 +# Match both schema-qualified refs (`eql_v2.`) and bare v2 entity names +# (`eql_v2_encrypted`, `eql_v2_configuration`, …). Prose like "the eql_v2 +# original is unchanged" in doc comments is intentionally still allowed. +echo "==> Symbol gate: no 'eql_v2.' / 'eql_v2_' under src/v3" +if grep -rnE 'eql_v2[._]' src/v3; then + echo "ERROR: eql_v2 symbol/entity reference found in src/v3 (must be self-contained)" >&2 fail=1 fi @@ -30,13 +33,13 @@ if grep -v '^src/v3/' src/deps-ordered-v3.txt; then fi # Belt-and-braces: the assembled artifact carries no eql_v2 symbol. -echo "==> Artifact gate: release/cipherstash-encrypt-v3.sql has no 'eql_v2.'" +echo "==> Artifact gate: release/cipherstash-encrypt-v3.sql has no 'eql_v2.' / 'eql_v2_'" if [[ ! -f release/cipherstash-encrypt-v3.sql ]]; then echo "ERROR: release/cipherstash-encrypt-v3.sql missing — run 'mise run build' first" >&2 exit 2 fi -if grep -n 'eql_v2\.' release/cipherstash-encrypt-v3.sql; then - echo "ERROR: assembled v3 artifact contains an eql_v2. reference" >&2 +if grep -nE 'eql_v2[._]' release/cipherstash-encrypt-v3.sql; then + echo "ERROR: assembled v3 artifact contains an eql_v2 symbol/entity reference" >&2 fail=1 fi diff --git a/tests/sqlx/tests/build_validation_tests.rs b/tests/sqlx/tests/build_validation_tests.rs index d23ba5a54..691a5d4a6 100644 --- a/tests/sqlx/tests/build_validation_tests.rs +++ b/tests/sqlx/tests/build_validation_tests.rs @@ -171,9 +171,12 @@ fn v3_variant_creates_eql_v3_schema() { #[test] fn v3_variant_has_no_eql_v2_symbol() { let sql = read_release_sql("cipherstash-encrypt-v3.sql"); + // Reject both schema-qualified refs (`eql_v2.`) and bare v2 entity names + // (`eql_v2_encrypted`, `eql_v2_configuration`, …). Prose mentions like + // "the eql_v2 original is unchanged" in doc comments are still allowed. assert!( - !sql.contains("eql_v2."), - "v3 variant must be self-contained (no eql_v2. reference)" + !sql.contains("eql_v2.") && !sql.contains("eql_v2_"), + "v3 variant must be self-contained (no eql_v2. or eql_v2_ reference)" ); } From 58af4750cccdce5528edd199abeaedf9849f2cfe Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 16:40:53 +1000 Subject: [PATCH 081/599] refactor(codegen): collapse CORE/DOMAIN schema constants into a single SCHEMA With eql_v3 fully self-contained, the encrypted-domain families and the SEM index-term types they call live in one schema, so there is no second schema to point the core types at. Replace the CORE_SCHEMA/DOMAIN_SCHEMA pair with one SCHEMA = "eql_v3" constant; the templates read it via the {{ schema }} global. Output is byte-identical (golden parity holds). --- crates/eql-codegen/src/consts.rs | 10 ++++++---- crates/eql-codegen/src/context.rs | 19 +++++++++---------- .../eql-codegen/templates/aggregates.sql.j2 | 8 ++++---- .../templates/functions/extractor.sql.j2 | 4 ++-- .../templates/functions/unsupported.sql.j2 | 2 +- .../templates/functions/wrapper.sql.j2 | 2 +- crates/eql-codegen/templates/operators.sql.j2 | 2 +- crates/eql-codegen/templates/types.sql.j2 | 6 +++--- 8 files changed, 27 insertions(+), 26 deletions(-) diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 635c4908f..0f7a1ef72 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -4,10 +4,12 @@ /// the writer uses it only to recognise files it owns (overwrite/clean safety). pub(crate) const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE.\n"; -/// Schema housing the encrypted-domain families. -pub(crate) const DOMAIN_SCHEMA: &str = "eql_v3"; -/// Schema owning the core index-term types/constructors. -pub(crate) const CORE_SCHEMA: &str = "eql_v3"; +/// The single schema housing the self-contained `eql_v3` surface: the +/// encrypted-domain families AND the SEM index-term types/constructors they +/// call. v3 has zero dependency on `eql_v2`, so domains and core index-term +/// types share one schema by construction — there is no second schema to point +/// the core types at. +pub(crate) const SCHEMA: &str = "eql_v3"; /// Always-present payload keys checked for presence in every domain CHECK, in /// order: envelope version (`v`), ident (`i`), ciphertext (`c`). Term-specific diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 225c6cdaa..78b508832 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -49,8 +49,7 @@ pub fn environment() -> minijinja::Environment<'static> { include_str!("../templates/aggregates.sql.j2"), ) .expect("aggregates.sql template"); - env.add_global("domain_schema", DOMAIN_SCHEMA); - env.add_global("core_schema", CORE_SCHEMA); + env.add_global("schema", SCHEMA); env } @@ -104,7 +103,7 @@ pub enum FnEntry { Extractor { ret: String, // e.g. eql_v2.hmac_256 (selection STAYS in Rust) extractor: String, // e.g. eq_term - ctor: String, // e.g. hmac_256 (called as {{ core_schema }}.{{ ctor }}) + ctor: String, // e.g. hmac_256 (called as {{ schema }}.{{ ctor }}) }, Wrapper { op: String, // SQL operator used in the body, e.g. = @@ -134,12 +133,12 @@ pub struct FunctionsContext { /// Build the inlinable index-extractor entry for a domain term. /// /// The `RETURNS` type name equals the constructor name (`hmac_256`, -/// `ore_block_u64_8_256`); qualify it with `CORE_SCHEMA` here so flipping the -/// core schema moves BOTH the body's constructor call and the declared return -/// type together (design D12). `Term::returns()` is intentionally not used. +/// `ore_block_u64_8_256`); qualify it with `SCHEMA` — the same schema as the +/// body's constructor call — so the declared return type and the call stay in +/// lockstep. `Term::returns()` is intentionally not used. pub fn extractor_entry(term: Term) -> FnEntry { FnEntry::Extractor { - ret: format!("{CORE_SCHEMA}.{}", term.ctor()), + ret: format!("{SCHEMA}.{}", term.ctor()), extractor: term.extractor().to_string(), ctor: term.ctor().to_string(), } @@ -229,7 +228,7 @@ pub struct AggregatesContext { /// The schema-qualified SQL domain type name, e.g. `eql_v3.int4_eq`. /// Port of `domain_name`. pub fn domain_name(name: &str) -> String { - format!("{DOMAIN_SCHEMA}.{name}") + format!("{SCHEMA}.{name}") } /// The full domain name from a token + suffix (suffix "" => bare token). @@ -241,9 +240,9 @@ pub fn full_domain_name(token: &str, suffix: &str) -> String { /// Port of `_extract_arg`. `dom` is the schema-qualified domain name. pub fn extract_arg(arg_type: &str, extractor: &str, dom: &str, arg: &str) -> String { if arg_type == "jsonb" { - format!("{DOMAIN_SCHEMA}.{extractor}({arg}::{dom})") + format!("{SCHEMA}.{extractor}({arg}::{dom})") } else { - format!("{DOMAIN_SCHEMA}.{extractor}({arg})") + format!("{SCHEMA}.{extractor}({arg})") } } diff --git a/crates/eql-codegen/templates/aggregates.sql.j2 b/crates/eql-codegen/templates/aggregates.sql.j2 index 9660917d7..d85ab2830 100644 --- a/crates/eql-codegen/templates/aggregates.sql.j2 +++ b/crates/eql-codegen/templates/aggregates.sql.j2 @@ -9,7 +9,7 @@ --! @param state {{ dom }} --! @param value {{ dom }} --! @return {{ dom }} -CREATE FUNCTION {{ domain_schema }}.{{ a.name }}_sfunc(state {{ dom }}, value {{ dom }}) +CREATE FUNCTION {{ schema }}.{{ a.name }}_sfunc(state {{ dom }}, value {{ dom }}) RETURNS {{ dom }} LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public @@ -25,10 +25,10 @@ $$; --! @brief {{ a.name }} aggregate for {{ dom }}. --! @param input {{ dom }} --! @return {{ dom }} -CREATE AGGREGATE {{ domain_schema }}.{{ a.name }}({{ dom }}) ( - sfunc = {{ domain_schema }}.{{ a.name }}_sfunc, +CREATE AGGREGATE {{ schema }}.{{ a.name }}({{ dom }}) ( + sfunc = {{ schema }}.{{ a.name }}_sfunc, stype = {{ dom }}, - combinefunc = {{ domain_schema }}.{{ a.name }}_sfunc, + combinefunc = {{ schema }}.{{ a.name }}_sfunc, parallel = safe ); {% endfor -%} diff --git a/crates/eql-codegen/templates/functions/extractor.sql.j2 b/crates/eql-codegen/templates/functions/extractor.sql.j2 index da649b213..9044f8908 100644 --- a/crates/eql-codegen/templates/functions/extractor.sql.j2 +++ b/crates/eql-codegen/templates/functions/extractor.sql.j2 @@ -1,7 +1,7 @@ --! @brief Index extractor for {{ dom }}. --! @param a {{ dom }} --! @return {{ e.ret }} -CREATE FUNCTION {{ domain_schema }}.{{ e.extractor }}(a {{ dom }}) +CREATE FUNCTION {{ schema }}.{{ e.extractor }}(a {{ dom }}) RETURNS {{ e.ret }} LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT {{ core_schema }}.{{ e.ctor }}(a::jsonb) $$; +AS $$ SELECT {{ schema }}.{{ e.ctor }}(a::jsonb) $$; diff --git a/crates/eql-codegen/templates/functions/unsupported.sql.j2 b/crates/eql-codegen/templates/functions/unsupported.sql.j2 index f33dab6c3..5ec85aed2 100644 --- a/crates/eql-codegen/templates/functions/unsupported.sql.j2 +++ b/crates/eql-codegen/templates/functions/unsupported.sql.j2 @@ -2,7 +2,7 @@ --! @param {{ e.args[0].name }} {{ e.args[0].ty }} --! @param {{ e.args[1].name }} {{ e.args[1].ty }} --! @return {{ e.returns }} -CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) +CREATE FUNCTION {{ schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) RETURNS {{ e.returns }} IMMUTABLE PARALLEL SAFE AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '{{ e.operator_lit }}', '{{ domain_lit }}'; END; $$ LANGUAGE plpgsql; diff --git a/crates/eql-codegen/templates/functions/wrapper.sql.j2 b/crates/eql-codegen/templates/functions/wrapper.sql.j2 index 243f24658..1e0b43ace 100644 --- a/crates/eql-codegen/templates/functions/wrapper.sql.j2 +++ b/crates/eql-codegen/templates/functions/wrapper.sql.j2 @@ -2,6 +2,6 @@ --! @param {{ e.args[0].name }} {{ e.args[0].ty }} --! @param {{ e.args[1].name }} {{ e.args[1].ty }} --! @return boolean -CREATE FUNCTION {{ domain_schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) +CREATE FUNCTION {{ schema }}.{{ e.function_name }}({{ e.args[0].name }} {{ e.args[0].ty }}, {{ e.args[1].name }} {{ e.args[1].ty }}) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT {{ e.call_a }} {{ e.op }} {{ e.call_b }} $$; diff --git a/crates/eql-codegen/templates/operators.sql.j2 b/crates/eql-codegen/templates/operators.sql.j2 index 1dc1360cd..bb33ff528 100644 --- a/crates/eql-codegen/templates/operators.sql.j2 +++ b/crates/eql-codegen/templates/operators.sql.j2 @@ -6,7 +6,7 @@ --! @brief Operators for {{ dom }}. {% for o in operators %} CREATE OPERATOR {{ o.symbol }} ( - FUNCTION = {{ domain_schema }}.{{ o.function_name }}, + FUNCTION = {{ schema }}.{{ o.function_name }}, LEFTARG = {{ o.leftarg }}, RIGHTARG = {{ o.rightarg }}{% if o.metadata %}, {{ o.metadata }}{% endif %} ); diff --git a/crates/eql-codegen/templates/types.sql.j2 b/crates/eql-codegen/templates/types.sql.j2 index b8263e24c..f46f66164 100644 --- a/crates/eql-codegen/templates/types.sql.j2 +++ b/crates/eql-codegen/templates/types.sql.j2 @@ -7,12 +7,12 @@ DO $$ BEGIN {%- for d in domains %} - --! @brief Encrypted domain {{ domain_schema }}.{{ d.name }}. + --! @brief Encrypted domain {{ schema }}.{{ d.name }}. IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = '{{ d.typname }}' AND typnamespace = '{{ domain_schema }}'::regnamespace + WHERE typname = '{{ d.typname }}' AND typnamespace = '{{ schema }}'::regnamespace ) THEN - CREATE DOMAIN {{ domain_schema }}.{{ d.name }} AS jsonb + CREATE DOMAIN {{ schema }}.{{ d.name }} AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' {%- for k in d.keys %} From 87d1108f540c84057628a4e68c1cecc7a211d04f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 17:10:13 +1000 Subject: [PATCH 082/599] fix(v3): address code-review findings on stale docs/comments + test hardening - Cargo.toml: update stale fixture command to fixture:generate:all - eql-functions.md: index examples use distinct _eq/_ord columns (a column carries a single domain, so eq_term/ord_term apply to different columns) - scalars/mod.rs: header describes the scalar_types!(matrix_suites) layout - codegen-parity.sh: ls *.sql -> portable find (no set -e abort on empty dir) - inlinability.rs: narrow arity-1 hmac_256 match to the jsonb overload --- docs/reference/eql-functions.md | 8 +++++--- tasks/codegen-parity.sh | 7 +++++-- tests/sqlx/Cargo.toml | 4 ++-- tests/sqlx/tests/encrypted_domain/family/inlinability.rs | 3 ++- tests/sqlx/tests/encrypted_domain/scalars/mod.rs | 5 +++-- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index cfca800cb..20c6f958f 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -441,9 +441,11 @@ eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v2.ore_block_u64_8_256 **Example:** ```sql --- Functional indexes on the extracted terms (see Database Indexes) -CREATE INDEX ON users USING hash (eql_v3.eq_term(salary_encrypted)); -CREATE INDEX ON users USING btree (eql_v3.ord_term(salary_encrypted)); +-- Functional indexes on the extracted terms (see Database Indexes). +-- A column carries a single domain type, so `eq_term` and `ord_term` +-- apply to different columns (an `_eq` column vs an `_ord`/`_ord_ore` one). +CREATE INDEX ON users USING hash (eql_v3.eq_term(salary_eq)); +CREATE INDEX ON users USING btree (eql_v3.ord_term(salary_ord)); ``` > The full per-domain operator/wrapper/blocker surface (and the diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh index 13e8bead3..0445802f4 100755 --- a/tasks/codegen-parity.sh +++ b/tasks/codegen-parity.sh @@ -16,9 +16,12 @@ echo "==> Comparing int4 generated SQL file SET vs golden (catches extra/dropped # is never iterated. Assert the sets are equal first to close that blind spot. # "Generated" excludes any committed, hand-written SQL (e.g. int4_extensions.sql), # which lives in this dir but has no golden counterpart; git-tracked == hand-written. -golden_set=$(cd tests/codegen/reference/int4 && ls *.sql | LC_ALL=C sort) +# find (not `ls *.sql`) so an empty dir yields zero lines instead of aborting +# under `set -e`; `-maxdepth 1` + sed strips the leading `./` for bare names. +golden_set=$(cd tests/codegen/reference/int4 \ + && find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) gen_set=$(cd src/v3/scalars/int4 \ - && comm -23 <(ls *.sql | LC_ALL=C sort) \ + && comm -23 <(find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) \ <(git ls-files . | sed 's#.*/##' | LC_ALL=C sort)) if [ "$golden_set" != "$gen_set" ]; then echo "int4 generated SQL file set differs from golden (< golden, > generated):" >&2 diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 112177264..208f6d86f 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -39,6 +39,6 @@ scale = [] # in the process env, BOTH a ZeroKMS auth credential (`CS_CLIENT_ACCESS_KEY` # + `CS_WORKSPACE_CRN`, via AutoStrategy) AND a client key (`CS_CLIENT_ID` + # `CS_CLIENT_KEY`, via EnvKeyProvider) — the two pairs are not alternatives. -# Run one with: -# mise run fixture:generate +# Regenerate all fixtures with: +# mise run fixture:generate:all fixture-gen = [] diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 7e17e2654..1a250ef96 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -106,7 +106,8 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu 'ore_block_u64_8_256_eq','ore_block_u64_8_256_neq', 'ore_block_u64_8_256_lt','ore_block_u64_8_256_lte', 'ore_block_u64_8_256_gt','ore_block_u64_8_256_gte')) - OR (p.pronargs = 1 AND p.proname = 'hmac_256') + OR (p.pronargs = 1 AND p.proname = 'hmac_256' + AND p.proargtypes[0] = 'jsonb'::regtype) ) AND ( -- offender: pinned search_path, or not inlinable SQL/IMMUTABLE diff --git a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs index f900af3e2..72c64f879 100644 --- a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs @@ -1,5 +1,6 @@ -//! Per-scalar matrix suites. Each `pub mod ` targets one scalar type and -//! holds its `ordered_numeric_matrix!` invocation. +//! Per-scalar matrix suites, generated by the `scalar_types!(matrix_suites)` +//! invocation below — one module per scalar type, each holding its +//! `ordered_numeric_matrix!` suite. //! //! The modules are generated from the single harness list in //! `tests/sqlx/src/scalar_types.rs` — adding a type there adds its suite here From c88dac13b28da57374d12f089b28e24070c707ae Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 20:29:25 +1000 Subject: [PATCH 083/599] docs(v3): add missing @param/@return tags to ore_block_u64_8_256 operators The six comparison operator backing functions (_eq, _neq, _lt, _lte, _gt, _gte) were missing required @param and @return Doxygen tags, failing docs:validate:required-tags with 6 errors and 6 warnings. Tags follow the eql_v2 sibling src/ore_block_u64_8_256/operators.sql convention. --- src/v3/sem/ore_block_u64_8_256/operators.sql | 36 ++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/v3/sem/ore_block_u64_8_256/operators.sql b/src/v3/sem/ore_block_u64_8_256/operators.sql index 78364a194..beca9da86 100644 --- a/src/v3/sem/ore_block_u64_8_256/operators.sql +++ b/src/v3/sem/ore_block_u64_8_256/operators.sql @@ -10,6 +10,12 @@ --! @brief Equality backing function for ORE block types --! @internal +--! +--! @param a eql_v3.ore_block_u64_8_256 Left operand +--! @param b eql_v3.ore_block_u64_8_256 Right operand +--! @return boolean True if the ORE blocks are equal +--! +--! @see eql_v3.compare_ore_block_u64_8_256_terms CREATE FUNCTION eql_v3.ore_block_u64_8_256_eq(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) RETURNS boolean LANGUAGE sql @@ -20,6 +26,12 @@ $$; --! @brief Not-equal backing function for ORE block types --! @internal +--! +--! @param a eql_v3.ore_block_u64_8_256 Left operand +--! @param b eql_v3.ore_block_u64_8_256 Right operand +--! @return boolean True if the ORE blocks are not equal +--! +--! @see eql_v3.compare_ore_block_u64_8_256_terms CREATE FUNCTION eql_v3.ore_block_u64_8_256_neq(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) RETURNS boolean LANGUAGE sql @@ -30,6 +42,12 @@ $$; --! @brief Less-than backing function for ORE block types --! @internal +--! +--! @param a eql_v3.ore_block_u64_8_256 Left operand +--! @param b eql_v3.ore_block_u64_8_256 Right operand +--! @return boolean True if the left operand is less than the right operand +--! +--! @see eql_v3.compare_ore_block_u64_8_256_terms CREATE FUNCTION eql_v3.ore_block_u64_8_256_lt(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) RETURNS boolean LANGUAGE sql @@ -40,6 +58,12 @@ $$; --! @brief Less-than-or-equal backing function for ORE block types --! @internal +--! +--! @param a eql_v3.ore_block_u64_8_256 Left operand +--! @param b eql_v3.ore_block_u64_8_256 Right operand +--! @return boolean True if the left operand is less than or equal to the right operand +--! +--! @see eql_v3.compare_ore_block_u64_8_256_terms CREATE FUNCTION eql_v3.ore_block_u64_8_256_lte(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) RETURNS boolean LANGUAGE sql @@ -50,6 +74,12 @@ $$; --! @brief Greater-than backing function for ORE block types --! @internal +--! +--! @param a eql_v3.ore_block_u64_8_256 Left operand +--! @param b eql_v3.ore_block_u64_8_256 Right operand +--! @return boolean True if the left operand is greater than the right operand +--! +--! @see eql_v3.compare_ore_block_u64_8_256_terms CREATE FUNCTION eql_v3.ore_block_u64_8_256_gt(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) RETURNS boolean LANGUAGE sql @@ -60,6 +90,12 @@ $$; --! @brief Greater-than-or-equal backing function for ORE block types --! @internal +--! +--! @param a eql_v3.ore_block_u64_8_256 Left operand +--! @param b eql_v3.ore_block_u64_8_256 Right operand +--! @return boolean True if the left operand is greater than or equal to the right operand +--! +--! @see eql_v3.compare_ore_block_u64_8_256_terms CREATE FUNCTION eql_v3.ore_block_u64_8_256_gte(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) RETURNS boolean LANGUAGE sql From 4f611cc6e2239d3879b1779aeeec4586e591fe18 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 20:50:13 +1000 Subject: [PATCH 084/599] style(test): rustfmt encrypted_domain/family/sem.rs cargo fmt --check was failing CI (test:lint and test:crates jobs) on this file; apply rustfmt with no logic changes. --- .../sqlx/tests/encrypted_domain/family/sem.rs | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 4f30bac2e..3d12bdd85 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -67,11 +67,7 @@ async fn ore_v2_v3_comparator_parity_on_real_fixtures(pool: PgPool) -> Result<() let mut v3_signs: HashSet = HashSet::new(); for (x, y) in pairs { - let (v2, v3): (i32, i32) = sqlx::query_as(sql) - .bind(x) - .bind(y) - .fetch_one(&pool) - .await?; + let (v2, v3): (i32, i32) = sqlx::query_as(sql).bind(x).bind(y).fetch_one(&pool).await?; assert_eq!( v2, v3, "eql_v2 and eql_v3 ORE comparators disagree on ids ({x},{y}): v2={v2} v3={v3}" @@ -81,7 +77,10 @@ async fn ore_v2_v3_comparator_parity_on_real_fixtures(pool: PgPool) -> Result<() // Non-triviality: the sample must have actually exercised lt, eq, and gt — // otherwise the parity check could pass on a degenerate all-equal path. - assert!(v3_signs.contains(&0), "sample must include an equal pair (0)"); + assert!( + v3_signs.contains(&0), + "sample must include an equal pair (0)" + ); assert!( v3_signs.contains(&-1), "sample must include a less-than pair (-1)" @@ -183,10 +182,19 @@ async fn ore_terms_array_null_and_empty_base_cases(pool: PgPool) -> Result<()> { #[sqlx::test] async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<()> { let bool_cases = [ - (r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":["aa"]}'::jsonb)"#, true), - (r#"SELECT eql_v3.has_ore_block_u64_8_256('{}'::jsonb)"#, false), + ( + r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":["aa"]}'::jsonb)"#, + true, + ), + ( + r#"SELECT eql_v3.has_ore_block_u64_8_256('{}'::jsonb)"#, + false, + ), // json-null `ob` → `->>` yields NULL → absent. - (r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":null}'::jsonb)"#, false), + ( + r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":null}'::jsonb)"#, + false, + ), (r#"SELECT eql_v3.has_hmac_256('{"hm":"abc"}'::jsonb)"#, true), (r#"SELECT eql_v3.has_hmac_256('{}'::jsonb)"#, false), ]; @@ -209,6 +217,9 @@ async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<() sqlx::query_scalar("SELECT eql_v3.ore_block_u64_8_256(NULL::jsonb) IS NULL") .fetch_one(&pool) .await?; - assert!(is_null, "NULL jsonb must extract to a NULL composite, not raise"); + assert!( + is_null, + "NULL jsonb must extract to a NULL composite, not raise" + ); Ok(()) } From cee714a7b56093cf7c17bde586b504151806b7c6 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 21:32:59 +1000 Subject: [PATCH 085/599] chore: quote echo var in tasks/build.sh Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- tasks/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/build.sh b/tasks/build.sh index 4d10e752f..2bf736204 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -177,7 +177,7 @@ cat tasks/uninstall-protect.sql >> release/cipherstash-encrypt-protect-uninstall # ever pins eql_v2 functions), so appending it would both fail a clean v3 # install and break the self-containment grep. find src/v3 -type f -path "*.sql" ! -path "*_test.sql" | while IFS= read -r sql_file; do - echo $sql_file + echo "$sql_file" echo "$sql_file $sql_file" >> src/deps-v3.txt From 2ab4b88490e4d8e94eedd8a84d28c91759a7d0cb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 4 Jun 2026 17:41:22 +1000 Subject: [PATCH 086/599] =?UTF-8?q?fix(v3):=20address=20PR=20#255=20review?= =?UTF-8?q?=20feedback=20=E2=80=94=20SQL=20inlining,=20stale=20docs,=20tes?= =?UTF-8?q?t=20hardening?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Collates and resolves code-review feedback on the self-contained eql_v3 PR. Inlinable SEM helpers (coderdan threads): - Convert eql_v3.jsonb_array_to_bytea_array and eql_v3.jsonb_array_to_ore_block_u64_8_256 from LANGUAGE plpgsql to inlinable LANGUAGE sql IMMUTABLE (no SET), using a CASE-scalar-subquery form so JSON-null/empty-array inputs still return NULL rather than raising (a naive FROM-SRF + WHERE rewrite would regress null to error). - These take a bare jsonb (not a domain), so pin_search_path.sql's structural skip does not cover them; opt them in via its documented 'eql-inline-critical' COMMENT marker so they install unpinned and the planner can inline them. Add matching splinter allowlist rows. The eql_v2 copies stay plpgsql by design. Direct SEM tests added (sem.rs). Stale references: - eql-functions.md / sql-support.md: v3 extractors now document eql_v3 SEM return types, not eql_v2. - pin_search_path.sql header, scalar_types.rs and mutations.rs comments. Test/build hardening: - writer.rs validates the AUTO-GENERATED ownership header before writing. - eql-scalars int_values! fails at compile time on narrowed-fixture overflow. - parity.rs asserts the generated file set, not just per-file contents. - mise.toml: shared test:sqlx:prep so test:sqlx:watch gets the same prep. - build.sh v3-only build rejects REQUIRE edges outside src/v3. - fixtures: single-source PAYLOAD_COLUMN const; enforce 63-byte identifier limit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- crates/eql-codegen/src/writer.rs | 35 ++++ crates/eql-codegen/tests/parity.rs | 23 +++ crates/eql-scalars/src/lib.rs | 15 +- docs/reference/eql-functions.md | 10 +- docs/reference/sql-support.md | 2 +- mise.toml | 15 +- src/v3/common.sql | 39 ++-- src/v3/sem/ore_block_u64_8_256/functions.sql | 40 +++-- tasks/build.sh | 25 +++ tasks/pin_search_path.sql | 2 +- tasks/test/splinter.sh | 2 + tests/sqlx/src/fixtures/cipherstash.rs | 7 +- tests/sqlx/src/fixtures/driver.rs | 19 +- tests/sqlx/src/fixtures/validation.rs | 27 ++- tests/sqlx/src/scalar_types.rs | 2 +- .../encrypted_domain/family/inlinability.rs | 81 ++++++++- .../encrypted_domain/family/mutations.rs | 2 +- .../sqlx/tests/encrypted_domain/family/sem.rs | 170 ++++++++++++++++++ 18 files changed, 461 insertions(+), 55 deletions(-) diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index afbcdce09..4d310fc82 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -90,6 +90,25 @@ pub fn ensure_generated_paths_writable(paths: &[PathBuf]) -> Result<(), WriteErr /// — it does not prepend a header. pub fn write_generated_file(path: &Path, body: &str) -> Result<(), WriteError> { ensure_generated_paths_writable(std::slice::from_ref(&path.to_path_buf()))?; + // The template is trusted to carry the ownership marker as its first line, + // but a renderer bug (or a hand-edited template) could drop it — which would + // then defeat `is_generated`/`clean_generated_files`, leaving an unowned file + // the next run refuses to overwrite. Validate the marker before writing. + let first = body + .lines() + .next() + .unwrap_or("") + .trim_end_matches(['\r', '\n']); + if first != sql_marker() { + return Err(WriteError::Ownership(format!( + "refusing to write generated file without the AUTO-GENERATED marker as its \ + first line: {} (expected first line {:?}, got {:?}). The SQL template must \ + emit the marker.", + path.display(), + sql_marker(), + first + ))); + } if let Some(parent) = path.parent() { fs::create_dir_all(parent)?; } @@ -171,6 +190,22 @@ mod tests { assert!(is_generated(&p)); } + #[test] + fn write_rejects_body_without_marker() { + let d = tmp(); + let p = d.path().join("int4_types.sql"); + // A body whose first line is NOT the AUTO-GENERATED marker must be + // rejected — the template is required to emit it. + let body = "-- REQUIRE: src/v3/schema.sql\nDO $$ BEGIN END $$;\n"; + let err = write_generated_file(&p, body).unwrap_err(); + assert!(matches!(err, WriteError::Ownership(_))); + assert!(err.to_string().contains("AUTO-GENERATED marker")); + assert!( + !p.exists(), + "no file should be written when the marker is missing" + ); + } + #[test] fn write_refuses_to_overwrite_handwritten() { let d = tmp(); diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index d5efb1939..a0f1e3b1b 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -37,6 +37,29 @@ fn rust_generator_matches_int4_golden_files() { let ref_dir = root.join("tests/codegen/reference/int4"); let gen_dir = out.join("src/v3/scalars/int4"); + + // Assert the generated .sql file SET matches the reference set first — the + // per-file byte comparison below only iterates reference files, so a missing + // generated file (or an extra one the reference never pins) would otherwise + // pass silently. + let sql_names = |dir: &std::path::Path| -> Vec { + let mut names: Vec = fs::read_dir(dir) + .unwrap() + .filter_map(|e| e.ok().map(|e| e.path())) + .filter(|p| p.extension().and_then(|x| x.to_str()) == Some("sql")) + .map(|p| p.file_name().unwrap().to_str().unwrap().to_string()) + .collect(); + names.sort(); + names + }; + let ref_names = sql_names(&ref_dir); + let gen_names = sql_names(&gen_dir); + assert_eq!( + gen_names, ref_names, + "generated int4 .sql file set differs from golden reference set \ + (reference: {ref_names:?}, generated: {gen_names:?})" + ); + for entry in fs::read_dir(&ref_dir).unwrap() { let path = entry.unwrap().path(); if path.extension().and_then(|e| e.to_str()) != Some("sql") { diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 6410869aa..be910d2e5 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -417,7 +417,20 @@ macro_rules! int_values { let mut i = 0; while i < N { out[i] = match SPEC.fixtures[i].numeric_value(SPEC.kind) { - Some(v) => v as $ty, + Some(v) => { + // Const-eval bounds check: a fixture value that does + // not fit the narrowed target type would otherwise be + // silently truncated/wrapped by `as`. Make it a + // compile-time error instead. + if v < <$ty>::MIN as i128 || v > <$ty>::MAX as i128 { + panic!(concat!( + "integer scalar fixture value out of range for `", + stringify!($ty), + "`" + )); + } + v as $ty + } None => panic!("integer scalar fixture must resolve to a number"), }; i += 1; diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index 20c6f958f..b610349cb 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -429,14 +429,14 @@ encrypted-domain value. Generated per eq/ord-capable variant of every scalar type — see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md). The argument type selects the overload, and both are inlinable so a functional index built on the extractor engages. The extractors live in -the `eql_v3` schema; their return types remain the core `eql_v2` -index-term types. +the `eql_v3` schema; their return types are the self-contained `eql_v3` +SEM index-term types. ```sql -- int4 — generated for every scalar type's eq / ord variants. -eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v2.hmac_256 -eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v2.ore_block_u64_8_256 -eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v2.ore_block_u64_8_256 +eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v3.hmac_256 +eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v3.ore_block_u64_8_256 +eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v3.ore_block_u64_8_256 ``` **Example:** diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index c52048507..82770ad9b 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -61,7 +61,7 @@ Use the equivalent [`jsonb_path_query`](#jsonb-functions-and-selectors-enabled-b ## Encrypted-domain scalar types (`eql_v3.`) -Scalar encrypted-domain types (e.g. `eql_v3.int4`; see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types remain the core `eql_v2` types. +Scalar encrypted-domain types (e.g. `eql_v3.int4`; see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types are the self-contained `eql_v3` SEM types (`eql_v3.hmac_256`, `eql_v3.ore_block_u64_8_256`). Each scalar type `` generates one storage-only variant plus eq/ord query variants: diff --git a/mise.toml b/mise.toml index ccd458fcd..8baafecb1 100644 --- a/mise.toml +++ b/mise.toml @@ -42,8 +42,8 @@ run = """ rm -f release/cipherstash-encrypt.sql """ -[tasks."test:sqlx"] -description = "Run SQLx tests with hybrid migration approach" +[tasks."test:sqlx:prep"] +description = "Prepare the SQLx test DB: cp built EQL into migrations, migrate, regenerate fixtures" # `build` produces release/cipherstash-encrypt.sql, which is then cp'd into # tests/sqlx/migrations/001_install_eql.sql below. Without this dep, a stale # release artifact silently ships an old EQL extension into the test DB and @@ -73,14 +73,23 @@ sqlx migrate run echo "Regenerating SQLx fixtures..." cd "{{config_root}}" mise run fixture:generate:all +""" +[tasks."test:sqlx"] +description = "Run SQLx tests with hybrid migration approach" +# Prep (build + cp + migrate + fixtures) is shared with test:sqlx:watch. +depends = ["test:sqlx:prep"] +dir = "{{config_root}}/tests/sqlx" +run = """ echo "Running Rust tests..." -cd tests/sqlx cargo test """ [tasks."test:sqlx:watch"] description = "Run SQLx tests in watch mode (rebuild EQL on changes)" +# Same prep as test:sqlx so watch mode starts from a migrated DB + fresh +# fixtures, not a stale checkout. +depends = ["test:sqlx:prep"] dir = "{{config_root}}/tests/sqlx" run = """ cargo watch -x test diff --git a/src/v3/common.sql b/src/v3/common.sql index b30366fc3..698989c7e 100644 --- a/src/v3/common.sql +++ b/src/v3/common.sql @@ -18,21 +18,32 @@ --! --! @note Returns NULL if input is JSON null --! @note Each array element is hex-decoded to bytea +--! @note Inlinable `LANGUAGE sql` IMMUTABLE form (no `SET search_path`) so the +--! planner can fold this per-encrypted-value helper into the calling query. +--! This deliberately diverges from the v2 plpgsql equivalent (intentionally +--! left unchanged): the `CASE WHEN jsonb_typeof(val) = 'array'` guard only +--! evaluates the set-returning `jsonb_array_elements_text` for an array, so a +--! non-array JSON scalar returns NULL here instead of raising "cannot extract +--! elements from a scalar". Both callers only ever pass an array or JSON null +--! (`val->'ob'`), so the divergence is unreachable in practice; JSON null and +--! empty array still return NULL exactly as before. CREATE FUNCTION eql_v3.jsonb_array_to_bytea_array(val jsonb) RETURNS bytea[] - SET search_path = pg_catalog, extensions, public + IMMUTABLE AS $$ -DECLARE - terms_arr bytea[]; -BEGIN - IF jsonb_typeof(val) = 'null' THEN - RETURN NULL; - END IF; + SELECT CASE WHEN jsonb_typeof(val) = 'array' + THEN ( + SELECT array_agg(decode(value::text, 'hex')::bytea) + FROM jsonb_array_elements_text(val) AS value + ) + ELSE NULL + END; +$$ LANGUAGE sql; - SELECT array_agg(decode(value::text, 'hex')::bytea) - INTO terms_arr - FROM jsonb_array_elements_text(val) AS value; - - RETURN terms_arr; -END; -$$ LANGUAGE plpgsql; +--! @internal Mark this hand-written helper inline-critical so the post-install +--! pin_search_path pass leaves it unpinned (no `SET search_path`), preserving +--! SQL-function inlining. It takes a bare `jsonb` arg (not a jsonb-backed +--! encrypted DOMAIN), so the structural skip in tasks/pin_search_path.sql does +--! not recognise it; this marker is the documented manual opt-in. +COMMENT ON FUNCTION eql_v3.jsonb_array_to_bytea_array(jsonb) IS + 'eql-inline-critical: per-encrypted-value ORE helper; must stay inlinable (unpinned search_path)'; diff --git a/src/v3/sem/ore_block_u64_8_256/functions.sql b/src/v3/sem/ore_block_u64_8_256/functions.sql index f86ef8a42..ccc6a817b 100644 --- a/src/v3/sem/ore_block_u64_8_256/functions.sql +++ b/src/v3/sem/ore_block_u64_8_256/functions.sql @@ -17,24 +17,34 @@ --! @internal --! @param val jsonb Array of hex-encoded ORE block terms --! @return eql_v3.ore_block_u64_8_256 ORE block composite, or NULL if input is null +--! @note Inlinable `LANGUAGE sql` IMMUTABLE form (no `SET search_path`) so the +--! planner can fold this per-encrypted-value helper into the calling query. +--! This deliberately diverges from the v2 plpgsql equivalent (intentionally +--! left unchanged): the `CASE WHEN jsonb_typeof(val) = 'array'` guard only +--! evaluates the array path for an array, so a non-array JSON scalar returns +--! NULL here instead of raising. The sole caller passes `val->'ob'`, always an +--! array or JSON null, so the divergence is unreachable in practice; JSON null +--! and empty array still return NULL exactly as before. CREATE FUNCTION eql_v3.jsonb_array_to_ore_block_u64_8_256(val jsonb) RETURNS eql_v3.ore_block_u64_8_256 - SET search_path = pg_catalog, extensions, public + IMMUTABLE AS $$ -DECLARE - terms eql_v3.ore_block_u64_8_256_term[]; -BEGIN - IF jsonb_typeof(val) = 'null' THEN - RETURN NULL; - END IF; - - SELECT array_agg(ROW(b)::eql_v3.ore_block_u64_8_256_term) - INTO terms - FROM unnest(eql_v3.jsonb_array_to_bytea_array(val)) AS b; - - RETURN ROW(terms)::eql_v3.ore_block_u64_8_256; -END; -$$ LANGUAGE plpgsql; + SELECT CASE WHEN jsonb_typeof(val) = 'array' + THEN ROW(( + SELECT array_agg(ROW(b)::eql_v3.ore_block_u64_8_256_term) + FROM unnest(eql_v3.jsonb_array_to_bytea_array(val)) AS b + ))::eql_v3.ore_block_u64_8_256 + ELSE NULL + END; +$$ LANGUAGE sql; + +--! @internal Mark this hand-written helper inline-critical so the post-install +--! pin_search_path pass leaves it unpinned (no `SET search_path`), preserving +--! SQL-function inlining. It takes a bare `jsonb` arg (not a jsonb-backed +--! encrypted DOMAIN), so the structural skip in tasks/pin_search_path.sql does +--! not recognise it; this marker is the documented manual opt-in. +COMMENT ON FUNCTION eql_v3.jsonb_array_to_ore_block_u64_8_256(jsonb) IS + 'eql-inline-critical: per-encrypted-value ORE helper; must stay inlinable (unpinned search_path)'; --! @brief Extract ORE block index term from JSONB payload diff --git a/tasks/build.sh b/tasks/build.sh index 2bf736204..4d3d94e01 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -48,6 +48,29 @@ verify_deps_exist() { fi } +# Fail loudly if any v3 REQUIRE edge points OUTSIDE src/v3. The v3-only build +# must be self-contained (no eql_v2 coupling); a stray `-- REQUIRE: src/...` +# edge to a non-v3 file would silently pull eql_v2 SQL into the v3 artefact (or +# tsort would drop it), breaking self-containment. Each line in deps-v3.txt is +# " "; self-edges (file == dep) are skipped, every other dep target +# must start with src/v3/. +verify_v3_self_contained() { + local dep_file=$1 + local offending=0 + while IFS=' ' read -r src dep; do + [[ -z "$dep" ]] && continue + [[ "$src" == "$dep" ]] && continue + if [[ "$dep" != src/v3/* ]]; then + echo "ERROR: v3 REQUIRE edge points outside src/v3: $src -- REQUIRE: $dep" >&2 + offending=1 + fi + done < "$dep_file" + if [[ $offending -ne 0 ]]; then + echo "ERROR: v3-only build is not self-contained — a -- REQUIRE: target lives outside src/v3 (see above)." >&2 + exit 1 + fi +} + mkdir -p release rm -f release/cipherstash-encrypt-uninstall.sql @@ -191,6 +214,8 @@ find src/v3 -type f -path "*.sql" ! -path "*_test.sql" | while IFS= read -r sql_ done < "$sql_file" done +verify_v3_self_contained src/deps-v3.txt + cat src/deps-v3.txt | tsort | tac > src/deps-ordered-v3.txt verify_deps_exist src/deps-ordered-v3.txt diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql index 1abf9c7df..75eed567f 100644 --- a/tasks/pin_search_path.sql +++ b/tasks/pin_search_path.sql @@ -1,5 +1,5 @@ --! @file pin_search_path.sql ---! @brief Post-install: pin search_path on every eql_v2.* function +--! @brief Post-install: pin search_path on every eql_v2.* and eql_v3.* function --! --! This file is appended verbatim by `tasks/build.sh` to the end of every --! release variant (main, supabase, protect/stack), AFTER all `src/**/*.sql` diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index 9d8c3cb10..282b485b0 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -124,6 +124,8 @@ function_search_path_mutable eql_v3 ore_block_u64_8_256_lte function Inner compa function_search_path_mutable eql_v3 ore_block_u64_8_256_gt function Inner comparator for the eql_v3 ore_block_u64_8_256 `>` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. function_search_path_mutable eql_v3 ore_block_u64_8_256_gte function Inner comparator for the eql_v3 ore_block_u64_8_256 `>=` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.eq_term. Must inline so the functional hash/btree index on eql_v3.eq_term(col) engages. Mirrors eql_v2.hmac_256. +function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_u64_8_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours. The eql_v2 copy stays plpgsql (pinned) by design. +function_search_path_mutable eql_v3 jsonb_array_to_ore_block_u64_8_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_u64_8_256, carries the `eql-inline-critical` COMMENT marker. The eql_v2 copy stays plpgsql (pinned) by design. ALLOW # Wrap splinter (a single bare SELECT expression) into a subquery we can diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index adb121737..22e552fa2 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -59,9 +59,14 @@ async fn build_cipher() -> Result>> { /// fail on an unknown index name. Extending fixture coverage to a new /// index is one variant on `IndexKind` plus one arm here, both compile- /// time checked. +/// The single encrypted-payload column name. Single-sourced here so the +/// `ColumnConfig` built for encryption and the `INSERT` target column in the +/// driver cannot drift apart. +pub const PAYLOAD_COLUMN: &str = "payload"; + pub fn column_config_for(spec_indexes: &[IndexKind], cast: Cast) -> Result { let column_type = cast_to_column_type(cast)?; - let mut config = ColumnConfig::build("payload").casts_as(column_type); + let mut config = ColumnConfig::build(PAYLOAD_COLUMN).casts_as(column_type); for ix in spec_indexes { config = config.add_index(Index::new(index_type_for(*ix))); diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs index 1d6c3f45b..127e20a16 100644 --- a/tests/sqlx/src/fixtures/driver.rs +++ b/tests/sqlx/src/fixtures/driver.rs @@ -196,12 +196,19 @@ where .context("building ColumnConfig from FixtureSpec indexes")?; let working = self.working_table(); - let payloads = cipherstash::encrypt_store(&working, "payload", self.values(), &config) - .await - .context("encrypting fixture values")?; - - let insert = - format!("INSERT INTO public.{working} (id, plaintext, payload) VALUES ($1, $2, $3)"); + let payloads = cipherstash::encrypt_store( + &working, + cipherstash::PAYLOAD_COLUMN, + self.values(), + &config, + ) + .await + .context("encrypting fixture values")?; + + let insert = format!( + "INSERT INTO public.{working} (id, plaintext, {col}) VALUES ($1, $2, $3)", + col = cipherstash::PAYLOAD_COLUMN + ); for (i, (value, payload)) in self.values().iter().zip(payloads).enumerate() { let id = (i as i64) + 1; sqlx::query(&insert) diff --git a/tests/sqlx/src/fixtures/validation.rs b/tests/sqlx/src/fixtures/validation.rs index e641a7266..61746e60b 100644 --- a/tests/sqlx/src/fixtures/validation.rs +++ b/tests/sqlx/src/fixtures/validation.rs @@ -5,8 +5,17 @@ use std::fmt; -/// Lowercase snake-case identifier, must start with a letter: `^[a-z][a-z0-9_]*$`. +/// Maximum unquoted identifier length PostgreSQL preserves; longer identifiers +/// are silently truncated (`NAMEDATALEN - 1`). +const MAX_IDENTIFIER_LEN: usize = 63; + +/// Lowercase snake-case identifier, must start with a letter and be at most +/// 63 bytes (PostgreSQL truncates beyond that): `^[a-z][a-z0-9_]{0,62}$`. fn is_valid_identifier(s: &str) -> bool { + // All accepted chars are single-byte ASCII, so byte length == char count. + if s.len() > MAX_IDENTIFIER_LEN { + return false; + } let mut chars = s.chars(); match chars.next() { Some(c) if c.is_ascii_lowercase() => {} @@ -107,6 +116,22 @@ mod tests { assert!(FixtureIdentifier::try_from("a;DROP").is_err()); // injection attempt } + #[test] + fn accepts_63_char_identifier() { + // 63 bytes is the longest PostgreSQL preserves unquoted. + let id = format!("a{}", "b".repeat(62)); + assert_eq!(id.len(), 63); + assert!(FixtureIdentifier::try_from(id.as_str()).is_ok()); + } + + #[test] + fn rejects_64_char_identifier() { + // 64 bytes would be silently truncated by PostgreSQL. + let id = format!("a{}", "b".repeat(63)); + assert_eq!(id.len(), 64); + assert!(FixtureIdentifier::try_from(id.as_str()).is_err()); + } + #[test] fn identifier_renders_via_display() { let id = FixtureIdentifier::try_from("eql_v2_int4").unwrap(); diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 389897eaa..b9b9f1124 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -14,7 +14,7 @@ //! to forward it to the matching `eql_tests_macros` proc-macro: //! //! - `scalar_type_impls` — `scalar_domains.rs` (lib): the `impl ScalarType` block. -//! - `fixture_modules` — `fixtures/mod.rs` (lib): the `pub mod eql_v2_` modules. +//! - `fixture_modules` — `fixtures/mod.rs` (lib): the `pub mod eql_v3_` modules. //! - `matrix_suites` — `tests/encrypted_domain/scalars/mod.rs` (test binary): //! the `ordered_numeric_matrix!` suites. //! - `fixture_dispatch` — `tests/generate_all_fixtures.rs` (test binary): the diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 1a250ef96..8caed2bf7 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -89,10 +89,22 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> /// Direct guard for the self-contained eql_v3 SEM index-term functions. Unlike /// the structural guard above (which covers jsonb-domain-arg functions), these -/// take a composite (ore_block_u64_8_256) or raw jsonb (hmac_256) arg, so they -/// are NOT caught by the structural pin-skip and need explicit inline_critical -/// allowlisting. If pin_search_path.sql pins any of them, v3 functional-index -/// inlining silently regresses to Seq Scan — this test fails instead. +/// take a composite (ore_block_u64_8_256) or raw jsonb (hmac_256/the two +/// per-encrypted-value `jsonb_array_to_*` helpers) arg, so they are NOT caught +/// by the structural pin-skip and need explicit inline_critical allowlisting. +/// If pin_search_path.sql pins any of them, v3 functional-index inlining +/// silently regresses to Seq Scan — this test fails instead. +/// +/// `jsonb_array_to_bytea_array(jsonb)` and +/// `jsonb_array_to_ore_block_u64_8_256(jsonb)` are included here: both take a +/// bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the structural +/// skip in tasks/pin_search_path.sql does not recognise them — they are kept +/// unpinned by the `eql-inline-critical` COMMENT marker instead. This test +/// asserts the unpinned + inlinable-SQL state directly; the companion +/// `eql_v3_sem_inline_critical_functions_carry_marker` test below asserts the +/// marker itself, so an edit that drops the marker (or a pin_search_path.sql +/// refactor that stops honouring it) fails CI even though both checks live in +/// separate tests. #[sqlx::test] async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Result<()> { let rows: Vec<(String,)> = sqlx::query_as( @@ -106,7 +118,10 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu 'ore_block_u64_8_256_eq','ore_block_u64_8_256_neq', 'ore_block_u64_8_256_lt','ore_block_u64_8_256_lte', 'ore_block_u64_8_256_gt','ore_block_u64_8_256_gte')) - OR (p.pronargs = 1 AND p.proname = 'hmac_256' + OR (p.pronargs = 1 AND p.proname IN ( + 'hmac_256', + 'jsonb_array_to_bytea_array', + 'jsonb_array_to_ore_block_u64_8_256') AND p.proargtypes[0] = 'jsonb'::regtype) ) AND ( @@ -129,6 +144,62 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu Ok(()) } +/// Companion guard for the two bare-`jsonb` per-encrypted-value helpers +/// (`jsonb_array_to_bytea_array`, `jsonb_array_to_ore_block_u64_8_256`). The +/// unpinned state asserted above is only DURABLE because each helper carries an +/// `eql-inline-critical` COMMENT marker that `tasks/pin_search_path.sql` honours +/// (it skips pinning functions whose `pg_description` matches +/// `'eql-inline-critical%'`). Neither helper is caught by the structural +/// jsonb-domain skip, so the marker is the ONLY thing keeping them unpinned — +/// an edit that removes the marker, or a pin_search_path.sql refactor that drops +/// the marker handling, would silently re-pin them and break inlining. This test +/// asserts the marker is present (and the helpers are SQL/IMMUTABLE) so that +/// failure surfaces here. +#[sqlx::test] +async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result<()> { + // Each expected helper must appear with a present inline-critical marker + // and be inlinable SQL/IMMUTABLE. Any helper that is missing, unmarked, or + // not inlinable SQL/IMMUTABLE is an offender. + let offenders: Vec<(String, Option, String, String)> = sqlx::query_as( + r#" + WITH expected(proname) AS ( + VALUES ('jsonb_array_to_bytea_array'), + ('jsonb_array_to_ore_block_u64_8_256') + ) + SELECT e.proname AS proname, + d.description AS marker, + l.lanname AS prolang, + p.provolatile::text AS provolatile + FROM expected e + LEFT JOIN pg_catalog.pg_proc p + ON p.proname = e.proname + AND p.pronamespace = 'eql_v3'::regnamespace + AND p.pronargs = 1 + AND p.proargtypes[0] = 'jsonb'::regtype + LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang + LEFT JOIN pg_catalog.pg_description d + ON d.objoid = p.oid AND d.classoid = 'pg_proc'::regclass + WHERE p.oid IS NULL + OR d.description IS NULL + OR d.description NOT LIKE 'eql-inline-critical%' + OR l.lanname IS DISTINCT FROM 'sql' + OR p.provolatile IS DISTINCT FROM 'i' + ORDER BY e.proname + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + offenders.is_empty(), + "eql_v3 SEM bare-jsonb helpers must carry an `eql-inline-critical` COMMENT \ + marker and be inlinable SQL/IMMUTABLE — the marker is what keeps \ + pin_search_path.sql from pinning them. Offenders \ + (proname, marker, prolang, provolatile): {offenders:#?}" + ); + Ok(()) +} + #[sqlx::test] async fn every_inline_critical_eligible_domain_has_inline_critical_functions( pool: PgPool, diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index 36d394d88..253898426 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -198,7 +198,7 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< Ok(()) } -// 5. Ord `<` correctness routes through `eql_v2.lt`. Turning `lt` into a +// 5. Ord `<` correctness routes through `eql_v3.lt`. Turning `lt` into a // blocker makes `<` raise — proving the ord `<` correctness arm has teeth. // Crucially, ORDER BY routes through `ord_term`, NOT `<`, so it must stay // green here. This is the #5-vs-#7 split: #5 attacks `<`, #7 attacks the diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 3d12bdd85..b7d2543c0 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -223,3 +223,173 @@ async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<() ); Ok(()) } + +/// T6 — Characterization of `eql_v3.jsonb_array_to_bytea_array(jsonb)` across its +/// three real-world input shapes. This is the safety net for the plpgsql→sql +/// inlining refactor (the function is reached per-encrypted-value, so it must be +/// inlinable). Behaviour pinned: +/// - JSON null (`'null'`) → NULL (the load-bearing null guard) +/// - empty array (`'[]'`) → NULL (array_agg over zero rows is NULL) +/// - populated array → decoded bytea[] +/// +/// Note the deliberate divergence the inlinable CASE form introduces vs. the +/// v2 plpgsql equivalent: a non-array JSON *scalar* (e.g. a number) returns NULL +/// rather than raising `cannot extract elements from a scalar`. Both callers only +/// ever pass an array or json-null (`val->'ob'`), so this is unreachable in +/// practice; we pin it here so the divergence is intentional and visible. +#[sqlx::test] +async fn jsonb_array_to_bytea_array_input_shapes(pool: PgPool) -> Result<()> { + // SQL NULL (distinct from JSON null `'null'`). The function is NOT STRICT, + // so the body runs: `jsonb_typeof(NULL)` is NULL → the CASE guard + // `WHEN jsonb_typeof(val) = 'array'` is not-true → ELSE NULL. + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_bytea_array(NULL::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!( + is_null, + "SQL NULL must yield NULL bytea[] (function is not STRICT)" + ); + + // JSON null → NULL. + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_bytea_array('null'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!(is_null, "JSON null must yield NULL bytea[]"); + + // Empty array → NULL (array_agg over zero rows). + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_bytea_array('[]'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!(is_null, "empty JSON array must yield NULL bytea[]"); + + // Single-element array → one decoded bytea element. + let decoded: Vec> = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_bytea_array('[\"aabb\"]'::jsonb)") + .fetch_one(&pool) + .await?; + assert_eq!( + decoded, + vec![vec![0xaau8, 0xbb]], + "single-element array must hex-decode to a 1-element bytea[]" + ); + + // Populated array → hex-decoded bytea[] round-trip. + let decoded: Vec> = sqlx::query_scalar( + "SELECT eql_v3.jsonb_array_to_bytea_array('[\"aabb\",\"ccdd\"]'::jsonb)", + ) + .fetch_one(&pool) + .await?; + assert_eq!( + decoded, + vec![vec![0xaau8, 0xbb], vec![0xccu8, 0xdd]], + "populated array must hex-decode to bytea[]" + ); + + // Deliberate delta: a non-array JSON scalar returns NULL (not a raise). + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_bytea_array('5'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!( + is_null, + "non-array JSON scalar must yield NULL (documented delta)" + ); + + // Same delta for a non-array JSON object — `jsonb_typeof` is 'object', so + // the CASE guard is not-true → ELSE NULL (not a raise). + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_bytea_array('{}'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!( + is_null, + "non-array JSON object must yield NULL (documented delta)" + ); + + Ok(()) +} + +/// T7 — Characterization of `eql_v3.jsonb_array_to_ore_block_u64_8_256(jsonb)` +/// across the same three input shapes. Safety net for the same plpgsql→sql +/// inlining refactor. Behaviour pinned: +/// - JSON null (`'null'`) → NULL composite +/// - empty array (`'[]'`) → NULL composite (inner array_agg is NULL) +/// - populated array → non-NULL composite with one term per element +/// +/// Same documented delta as T6 for a non-array JSON scalar. +#[sqlx::test] +async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { + // SQL NULL (distinct from JSON null `'null'`). Not STRICT, so the body + // runs: `jsonb_typeof(NULL)` is NULL → CASE guard not-true → ELSE NULL. + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256(NULL::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!( + is_null, + "SQL NULL must yield NULL composite (function is not STRICT)" + ); + + // JSON null → NULL composite. + let is_null: bool = sqlx::query_scalar( + "SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('null'::jsonb) IS NULL", + ) + .fetch_one(&pool) + .await?; + assert!(is_null, "JSON null must yield NULL composite"); + + // Empty array → NULL composite. + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('[]'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!(is_null, "empty JSON array must yield NULL composite"); + + // Single-element array → non-NULL composite with exactly 1 term. + let term_count: i32 = sqlx::query_scalar( + "SELECT cardinality((eql_v3.jsonb_array_to_ore_block_u64_8_256('[\"aabb\"]'::jsonb)).terms)", + ) + .fetch_one(&pool) + .await?; + assert_eq!( + term_count, 1, + "single-element array must yield exactly one term" + ); + + // Populated array → non-NULL composite with one term per element. + let term_count: i32 = sqlx::query_scalar( + "SELECT cardinality((eql_v3.jsonb_array_to_ore_block_u64_8_256('[\"aabb\",\"ccdd\",\"eeff\"]'::jsonb)).terms)", + ) + .fetch_one(&pool) + .await?; + assert_eq!( + term_count, 3, + "populated array must yield one term per element" + ); + + // Deliberate delta: a non-array JSON scalar returns NULL (not a raise). + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('5'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!( + is_null, + "non-array JSON scalar must yield NULL (documented delta)" + ); + + // Same delta for a non-array JSON object — `jsonb_typeof` is 'object', so + // the CASE guard is not-true → ELSE NULL (not a raise). + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('{}'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; + assert!( + is_null, + "non-array JSON object must yield NULL (documented delta)" + ); + + Ok(()) +} From eac4f67d7561ee7cbf2880ef652a26006fbbe02d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 20:57:29 +1000 Subject: [PATCH 087/599] refactor(tests): generalise scalar matrix harness off integer-inherent consts Make the SQLx scalar-matrix harness type-agnostic ahead of the first non-integer scalar, without adding one. Three integer assumptions are lifted: - `ScalarType::FIXTURE_VALUES` (a `const`) becomes `fn fixture_values()`, so a scalar whose values can't be const-constructed can return a borrow of a lazily-built `Vec` instead. Integer impls still hand back their `eql_scalars::_VALUES` const. - New `min_pivot()` / `max_pivot()` trait methods replace the matrix's direct `::MIN` / `::MAX` pivot references, so a scalar without an inherent `::MIN`/`::MAX` const can supply an explicit sentinel. - The ORDER BY arms build their `WHERE` clause from `to_sql_literal(zero)` instead of a hardcoded `> 0`, so a non-integer plaintext column typechecks. Behaviour-preserving for the existing `int4` / `int2` types: the integer `min_pivot`/`max_pivot` resolve to `Self::MIN`/`Self::MAX`, `to_sql_literal(0)` renders `0`, and the generated test names are unchanged. The int4 cargo-expand snapshot is regenerated to track the method-based bodies. --- crates/eql-tests-macros/src/lib.rs | 26 +- tests/sqlx/snapshots/int4_expanded.rs | 1860 +++++++++-------- tests/sqlx/src/matrix.rs | 78 +- tests/sqlx/src/scalar_domains.rs | 38 +- .../encrypted_domain/family/mutations.rs | 4 +- 5 files changed, 1080 insertions(+), 926 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 537a83128..408648ae4 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -85,10 +85,26 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { quote! { impl ScalarType for #rust_type { const PG_TYPE: &'static str = #token_str; + /// The catalog `eql_scalars::*_VALUES` list — the same values /// the fixture generator encrypts, so the oracle can't drift - /// from the fixture. - const FIXTURE_VALUES: &'static [#rust_type] = ::eql_scalars::#values; + /// from the fixture. A method (not a `const`) so non-integer + /// scalars whose values can't be `const`-constructed can return + /// a borrow of a lazily-built `Vec`; integer scalars hand back + /// their catalog const directly. + fn fixture_values() -> &'static [#rust_type] { + ::eql_scalars::#values + } + + /// Integer scalars pivot on their inherent `MIN`/`MAX` consts; + /// the fixture lists include both (`fixtures!(int …; Min, …, Max)`). + fn min_pivot() -> #rust_type { + <#rust_type>::MIN + } + + fn max_pivot() -> #rust_type { + <#rust_type>::MAX + } } } }); @@ -249,6 +265,12 @@ mod tests { assert!(out.contains(r#"const PG_TYPE : & 'static str = "int8""#)); assert!(out.contains(":: eql_scalars :: INT4_VALUES")); assert!(out.contains(":: eql_scalars :: INT8_VALUES")); + // const→fn: fixture values is a method now, plus the integer pivots. + assert!(out.contains("fn fixture_values")); + assert!(out.contains("fn min_pivot")); + assert!(out.contains("fn max_pivot")); + assert!(out.contains("MIN")); + assert!(out.contains("MAX")); } #[test] diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/int4_expanded.rs index 3441b01b1..f2997d2af 100644 --- a/tests/sqlx/snapshots/int4_expanded.rs +++ b/tests/sqlx/snapshots/int4_expanded.rs @@ -1,11 +1,5 @@ +///`eql_v2_int4` matrix suite — generated by `scalar_types!`. pub mod int4 { - //! `eql_v2_int4` — the reference scalar implementation. - //! - //! Adding a new ordered numeric scalar (i64, f64, date, ...) is one - //! `impl ScalarType` in `tests/sqlx/src/scalar_domains.rs` plus an - //! `ordered_numeric_matrix!` invocation like this one. The matrix covers - //! everything generic over `T: ScalarType`. - use eql_tests::ordered_numeric_matrix; extern crate test; #[rustc_test_marker = "scalars::int4::matrix_int4_storage_sanity"] #[doc(hidden)] @@ -14,10 +8,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_storage_sanity"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 451usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 454usize, start_col: 26usize, - end_line: 451usize, + end_line: 454usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -91,10 +85,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_sanity"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 451usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 454usize, start_col: 26usize, - end_line: 451usize, + end_line: 454usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -168,10 +162,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_ord_sanity"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 451usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 454usize, start_col: 26usize, - end_line: 451usize, + end_line: 454usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -245,10 +239,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_ord_ore_sanity"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 451usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 454usize, start_col: 26usize, - end_line: 451usize, + end_line: 454usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -324,10 +318,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -347,7 +341,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -423,10 +417,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -446,7 +440,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -522,10 +516,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -621,10 +615,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -644,7 +638,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -720,10 +714,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -743,7 +737,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -819,10 +813,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -918,10 +912,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -941,7 +935,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -1017,10 +1011,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1040,7 +1034,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -1116,10 +1110,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1215,10 +1209,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1238,7 +1232,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -1314,10 +1308,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1337,7 +1331,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -1413,10 +1407,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1512,10 +1506,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1535,7 +1529,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -1611,10 +1605,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1634,7 +1628,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -1710,10 +1704,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1809,10 +1803,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1832,7 +1826,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -1908,10 +1902,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1931,7 +1925,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -2007,10 +2001,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2106,10 +2100,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2129,7 +2123,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -2205,10 +2199,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2228,7 +2222,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -2304,10 +2298,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2403,10 +2397,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2426,7 +2420,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -2502,10 +2496,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2525,7 +2519,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -2601,10 +2595,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2700,10 +2694,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2723,7 +2717,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -2799,10 +2793,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2822,7 +2816,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -2898,10 +2892,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2997,10 +2991,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3020,7 +3014,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -3096,10 +3090,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3119,7 +3113,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -3195,10 +3189,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3294,10 +3288,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3317,7 +3311,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -3393,10 +3387,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3416,7 +3410,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -3492,10 +3486,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3591,10 +3585,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3614,7 +3608,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -3690,10 +3684,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3713,7 +3707,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -3789,10 +3783,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3888,10 +3882,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3911,7 +3905,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -3987,10 +3981,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4010,7 +4004,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -4086,10 +4080,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4185,10 +4179,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4208,7 +4202,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -4284,10 +4278,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4307,7 +4301,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -4383,10 +4377,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 587usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 590usize, start_col: 22usize, - end_line: 587usize, + end_line: 590usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4482,10 +4476,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4505,7 +4499,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -4648,10 +4642,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4671,7 +4665,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -4814,10 +4808,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4980,10 +4974,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5003,7 +4997,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -5146,10 +5140,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5169,7 +5163,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -5312,10 +5306,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5478,10 +5472,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5501,7 +5495,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -5644,10 +5638,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5667,7 +5661,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -5810,10 +5804,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5976,10 +5970,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5999,7 +5993,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -6142,10 +6136,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6165,7 +6159,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -6308,10 +6302,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6474,10 +6468,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6497,7 +6491,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -6640,10 +6634,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6663,7 +6657,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -6806,10 +6800,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6972,10 +6966,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6995,7 +6989,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -7138,10 +7132,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7161,7 +7155,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -7304,10 +7298,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7470,10 +7464,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7493,7 +7487,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -7636,10 +7630,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7659,7 +7653,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -7802,10 +7796,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7968,10 +7962,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7991,7 +7985,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -8134,10 +8128,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8157,7 +8151,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -8300,10 +8294,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8466,10 +8460,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8489,7 +8483,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -8632,10 +8626,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8655,7 +8649,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -8798,10 +8792,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8964,10 +8958,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8987,7 +8981,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -9130,10 +9124,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9153,7 +9147,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -9296,10 +9290,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9462,10 +9456,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9485,7 +9479,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -9628,10 +9622,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9651,7 +9645,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -9794,10 +9788,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9960,10 +9954,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9983,7 +9977,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -10126,10 +10120,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10149,7 +10143,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -10292,10 +10286,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10458,10 +10452,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10481,7 +10475,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -10624,10 +10618,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10647,7 +10641,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -10790,10 +10784,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10956,10 +10950,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10979,7 +10973,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MIN; + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -11122,10 +11116,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11145,7 +11139,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::MAX; + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -11288,10 +11282,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 628usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 631usize, start_col: 22usize, - end_line: 628usize, + end_line: 631usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11454,10 +11448,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11547,10 +11541,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11640,10 +11634,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11733,10 +11727,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11826,10 +11820,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11919,10 +11913,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12012,10 +12006,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12105,10 +12099,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12198,10 +12192,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12291,10 +12285,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12384,10 +12378,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12477,10 +12471,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12570,10 +12564,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12663,10 +12657,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 680usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 683usize, start_col: 22usize, - end_line: 680usize, + end_line: 683usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12754,10 +12748,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_storage_eq_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -12889,10 +12883,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_storage_neq_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13024,10 +13018,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_storage_lt_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13159,10 +13153,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_storage_lte_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13294,10 +13288,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_storage_gt_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13429,10 +13423,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_storage_gte_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13566,10 +13560,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13703,10 +13697,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13838,10 +13832,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_lt_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13971,10 +13965,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_lte_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14104,10 +14098,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_gt_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14237,10 +14231,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_gte_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14370,10 +14364,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_contains_blocker"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14507,10 +14501,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14644,10 +14638,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14781,10 +14775,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14918,10 +14912,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15055,10 +15049,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 744usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 747usize, start_col: 22usize, - end_line: 744usize, + end_line: 747usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15192,10 +15186,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 811usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 814usize, start_col: 22usize, - end_line: 811usize, + end_line: 814usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15332,10 +15326,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_payload_check"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 811usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 814usize, start_col: 22usize, - end_line: 811usize, + end_line: 814usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15470,10 +15464,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_ord_payload_check"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 811usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 814usize, start_col: 22usize, - end_line: 811usize, + end_line: 814usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15612,10 +15606,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 811usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 814usize, start_col: 22usize, - end_line: 811usize, + end_line: 814usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15754,10 +15748,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 884usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 887usize, start_col: 22usize, - end_line: 884usize, + end_line: 887usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15855,10 +15849,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_path_op_blockers"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 884usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 887usize, start_col: 22usize, - end_line: 884usize, + end_line: 887usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15958,10 +15952,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 884usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 887usize, start_col: 22usize, - end_line: 884usize, + end_line: 887usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16061,10 +16055,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 884usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 887usize, start_col: 22usize, - end_line: 884usize, + end_line: 887usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16164,10 +16158,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 941usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 944usize, start_col: 22usize, - end_line: 941usize, + end_line: 944usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16253,10 +16247,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 941usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 944usize, start_col: 22usize, - end_line: 941usize, + end_line: 944usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16342,10 +16336,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 941usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 944usize, start_col: 22usize, - end_line: 941usize, + end_line: 944usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16431,10 +16425,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 941usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 944usize, start_col: 22usize, - end_line: 941usize, + end_line: 944usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16520,10 +16514,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 994usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 997usize, start_col: 22usize, - end_line: 994usize, + end_line: 997usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -16891,10 +16885,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 994usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 997usize, start_col: 22usize, - end_line: 994usize, + end_line: 997usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17192,10 +17186,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 994usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 997usize, start_col: 22usize, - end_line: 994usize, + end_line: 997usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17353,10 +17347,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 994usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 997usize, start_col: 22usize, - end_line: 994usize, + end_line: 997usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17514,10 +17508,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1075usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1078usize, start_col: 22usize, - end_line: 1075usize, + end_line: 1078usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17549,7 +17543,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", op_list, d, ), @@ -17678,10 +17672,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1075usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1078usize, start_col: 22usize, - end_line: 1075usize, + end_line: 1078usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17713,7 +17707,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", op_list, d, ), @@ -17842,10 +17836,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1075usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1078usize, start_col: 22usize, - end_line: 1075usize, + end_line: 1078usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17877,7 +17871,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", op_list, d, ), @@ -18006,10 +18000,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1075usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1078usize, start_col: 22usize, - end_line: 1075usize, + end_line: 1078usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18041,7 +18035,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", op_list, d, ), @@ -18170,10 +18164,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1075usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1078usize, start_col: 22usize, - end_line: 1075usize, + end_line: 1078usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18205,7 +18199,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (lt.typname = \'{1}\' OR rt.typname = \'{1}\')\n ", + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", op_list, d, ), @@ -18334,10 +18328,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1641usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1644usize, start_col: 22usize, - end_line: 1641usize, + end_line: 1644usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18395,7 +18389,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v2.eq_term", + "eql_v3.eq_term", index, table, ), @@ -18412,7 +18406,7 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot: i32 = ::fixture_values()[0]; let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -18508,10 +18502,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1641usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1644usize, start_col: 22usize, - end_line: 1641usize, + end_line: 1644usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18569,7 +18563,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "hash", - "eql_v2.eq_term", + "eql_v3.eq_term", index, table, ), @@ -18586,7 +18580,7 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot: i32 = ::fixture_values()[0]; let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -18682,10 +18676,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1641usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1644usize, start_col: 22usize, - end_line: 1641usize, + end_line: 1644usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18743,7 +18737,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v2.ord_term", + "eql_v3.ord_term", index, table, ), @@ -18760,7 +18754,7 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot: i32 = ::fixture_values()[0]; let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -18976,10 +18970,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1641usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1644usize, start_col: 22usize, - end_line: 1641usize, + end_line: 1644usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19037,7 +19031,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v2.ord_term", + "eql_v3.ord_term", index, table, ), @@ -19054,7 +19048,7 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot: i32 = ::fixture_values()[0]; let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -19270,10 +19264,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1263usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1266usize, start_col: 22usize, - end_line: 1263usize, + end_line: 1266usize, end_col: 86usize, compile_fail: false, no_run: false, @@ -19297,7 +19291,7 @@ pub mod int4 { let d = &spec.sql_domain; let table = "matrix_int4_ord_scaledef_btree"; let index = "matrix_int4_ord_scaledef_btree_idx"; - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( @@ -19366,7 +19360,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v2.ord_term", + "eql_v3.ord_term", index, table, ), @@ -19451,10 +19445,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_fixture_shape"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1341usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1344usize, start_col: 22usize, - end_line: 1341usize, + end_line: 1344usize, end_col: 55usize, compile_fail: false, no_run: false, @@ -19471,7 +19465,7 @@ pub mod int4 { { use ::eql_tests::scalar_domains::ScalarType; let table = ::fixture_table_name(); - let expected: &[i32] = ::FIXTURE_VALUES; + let expected: &[i32] = ::fixture_values(); let n = expected.len() as i64; let count: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -19706,10 +19700,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1444usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1447usize, start_col: 22usize, - end_line: 1444usize, + end_line: 1447usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19733,7 +19727,7 @@ pub mod int4 { let table = "matrix_int4_ord_no_hm"; let index = "matrix_int4_ord_no_hm_idx"; let fixture_table = ::fixture_table_name(); - let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot: i32 = ::fixture_values()[0]; let pivot_lit = ::to_sql_literal( pivot, ); @@ -19790,7 +19784,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "CREATE INDEX {0} ON {1} USING btree (eql_v2.ord_term(value))", + "CREATE INDEX {0} ON {1} USING btree (eql_v3.ord_term(value))", index, table, ), @@ -19845,7 +19839,7 @@ pub mod int4 { error }); } - let expected_neq = ::FIXTURE_VALUES + let expected_neq = ::fixture_values() .len() as i64 - eq_count; let neq_count: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -19887,7 +19881,7 @@ pub mod int4 { ) }), index, - "= must engage the eql_v2.ord_term functional btree with no hm", + "= must engage the eql_v3.ord_term functional btree with no hm", ) .await?; tx.commit().await?; @@ -19944,10 +19938,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1444usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1447usize, start_col: 22usize, - end_line: 1444usize, + end_line: 1447usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19971,7 +19965,7 @@ pub mod int4 { let table = "matrix_int4_ord_ore_no_hm"; let index = "matrix_int4_ord_ore_no_hm_idx"; let fixture_table = ::fixture_table_name(); - let pivot: i32 = ::FIXTURE_VALUES[0]; + let pivot: i32 = ::fixture_values()[0]; let pivot_lit = ::to_sql_literal( pivot, ); @@ -20028,7 +20022,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "CREATE INDEX {0} ON {1} USING btree (eql_v2.ord_term(value))", + "CREATE INDEX {0} ON {1} USING btree (eql_v3.ord_term(value))", index, table, ), @@ -20083,7 +20077,7 @@ pub mod int4 { error }); } - let expected_neq = ::FIXTURE_VALUES + let expected_neq = ::fixture_values() .len() as i64 - eq_count; let neq_count: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -20125,7 +20119,7 @@ pub mod int4 { ) }), index, - "= must engage the eql_v2.ord_term functional btree with no hm", + "= must engage the eql_v3.ord_term functional btree with no hm", ) .await?; tx.commit().await?; @@ -20182,10 +20176,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1578usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1581usize, start_col: 22usize, - end_line: 1578usize, + end_line: 1581usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -20282,10 +20276,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_ord_aggregate_min"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2087usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2099usize, start_col: 22usize, - end_line: 2087usize, + end_line: 2099usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -20308,7 +20302,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let extremum: i32 = ::FIXTURE_VALUES + let extremum: i32 = ::fixture_values() .iter() .copied() .min() @@ -20331,7 +20325,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", "min", d, fixture, @@ -20351,7 +20345,7 @@ pub mod int4 { &*right_val, ::core::option::Option::Some( format_args!( - "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", "min", d, extremum, @@ -20366,7 +20360,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", "min", d, fixture, @@ -20383,7 +20377,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", "min", d, extremum, @@ -20446,10 +20440,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2145usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2157usize, start_col: 22usize, - end_line: 2145usize, + end_line: 2157usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -20487,7 +20481,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "SELECT eql_v3.{0}(value)::text FROM empty_agg", "min", ), ) @@ -20501,7 +20495,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", "min", d, result, @@ -20558,10 +20552,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2170usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2182usize, start_col: 22usize, - end_line: 2170usize, + end_line: 2182usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -20585,7 +20579,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", "min", d, ), @@ -20600,7 +20594,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", "min", d, result, @@ -20657,10 +20651,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2196usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2208usize, start_col: 22usize, - end_line: 2196usize, + end_line: 2208usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -20683,7 +20677,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -20753,7 +20747,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "SELECT eql_v3.{0}(value)::text FROM mixed_null", "min", ), ) @@ -20769,7 +20763,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", "min", "min", expected_plaintext, @@ -20833,10 +20827,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_ord_aggregate_max"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2087usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2099usize, start_col: 22usize, - end_line: 2087usize, + end_line: 2099usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -20859,7 +20853,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let extremum: i32 = ::FIXTURE_VALUES + let extremum: i32 = ::fixture_values() .iter() .copied() .max() @@ -20882,7 +20876,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", "max", d, fixture, @@ -20902,7 +20896,7 @@ pub mod int4 { &*right_val, ::core::option::Option::Some( format_args!( - "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", "max", d, extremum, @@ -20917,7 +20911,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", "max", d, fixture, @@ -20934,7 +20928,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", "max", d, extremum, @@ -20997,10 +20991,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2145usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2157usize, start_col: 22usize, - end_line: 2145usize, + end_line: 2157usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21038,7 +21032,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "SELECT eql_v3.{0}(value)::text FROM empty_agg", "max", ), ) @@ -21052,7 +21046,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", "max", d, result, @@ -21109,10 +21103,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2170usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2182usize, start_col: 22usize, - end_line: 2170usize, + end_line: 2182usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21136,7 +21130,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", "max", d, ), @@ -21151,7 +21145,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", "max", d, result, @@ -21208,10 +21202,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2196usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2208usize, start_col: 22usize, - end_line: 2196usize, + end_line: 2208usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21234,7 +21228,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -21304,7 +21298,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "SELECT eql_v3.{0}(value)::text FROM mixed_null", "max", ), ) @@ -21320,7 +21314,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", "max", "max", expected_plaintext, @@ -21386,10 +21380,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2087usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2099usize, start_col: 22usize, - end_line: 2087usize, + end_line: 2099usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21412,7 +21406,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let extremum: i32 = ::FIXTURE_VALUES + let extremum: i32 = ::fixture_values() .iter() .copied() .min() @@ -21435,7 +21429,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", "min", d, fixture, @@ -21455,7 +21449,7 @@ pub mod int4 { &*right_val, ::core::option::Option::Some( format_args!( - "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", "min", d, extremum, @@ -21470,7 +21464,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", "min", d, fixture, @@ -21487,7 +21481,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", "min", d, extremum, @@ -21550,10 +21544,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2145usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2157usize, start_col: 22usize, - end_line: 2145usize, + end_line: 2157usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21591,7 +21585,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "SELECT eql_v3.{0}(value)::text FROM empty_agg", "min", ), ) @@ -21605,7 +21599,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", "min", d, result, @@ -21662,10 +21656,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2170usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2182usize, start_col: 22usize, - end_line: 2170usize, + end_line: 2182usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21689,7 +21683,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", "min", d, ), @@ -21704,7 +21698,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", "min", d, result, @@ -21761,10 +21755,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2196usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2208usize, start_col: 22usize, - end_line: 2196usize, + end_line: 2208usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21787,7 +21781,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -21857,7 +21851,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "SELECT eql_v3.{0}(value)::text FROM mixed_null", "min", ), ) @@ -21873,7 +21867,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", "min", "min", expected_plaintext, @@ -21939,10 +21933,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2087usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2099usize, start_col: 22usize, - end_line: 2087usize, + end_line: 2099usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21965,7 +21959,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let extremum: i32 = ::FIXTURE_VALUES + let extremum: i32 = ::fixture_values() .iter() .copied() .max() @@ -21988,7 +21982,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", "max", d, fixture, @@ -22008,7 +22002,7 @@ pub mod int4 { &*right_val, ::core::option::Option::Some( format_args!( - "eql_v2.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", "max", d, extremum, @@ -22023,7 +22017,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.ord_term(eql_v2.{0}(payload::{1})) = eql_v2.ord_term($1::jsonb::{1}) FROM {2}", + "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", "max", d, fixture, @@ -22040,7 +22034,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.ord_term(eql_v2.{0}({1})) must equal eql_v2.ord_term() for plaintext={2:?}", + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", "max", d, extremum, @@ -22103,10 +22097,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2145usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2157usize, start_col: 22usize, - end_line: 2145usize, + end_line: 2157usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -22144,7 +22138,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM empty_agg", + "SELECT eql_v3.{0}(value)::text FROM empty_agg", "max", ), ) @@ -22158,7 +22152,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "empty rowset to eql_v2.{0} on {1} must return NULL, got {2:?}", + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", "max", d, result, @@ -22215,10 +22209,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2170usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2182usize, start_col: 22usize, - end_line: 2170usize, + end_line: 2182usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22242,7 +22236,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", "max", d, ), @@ -22257,7 +22251,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "all-NULL input to eql_v2.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", "max", d, result, @@ -22314,10 +22308,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2196usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2208usize, start_col: 22usize, - end_line: 2196usize, + end_line: 2208usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22340,7 +22334,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -22410,7 +22404,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value)::text FROM mixed_null", + "SELECT eql_v3.{0}(value)::text FROM mixed_null", "max", ), ) @@ -22426,7 +22420,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", "max", "max", expected_plaintext, @@ -22492,10 +22486,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2375usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2387usize, start_col: 22usize, - end_line: 2375usize, + end_line: 2387usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -22518,7 +22512,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -22624,7 +22618,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", "min", ), ) @@ -22652,7 +22646,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "min", d, group1_extremum, @@ -22671,7 +22665,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "min", d, group2_extremum, @@ -22738,10 +22732,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2375usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2387usize, start_col: 22usize, - end_line: 2375usize, + end_line: 2387usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -22764,7 +22758,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -22870,7 +22864,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", "max", ), ) @@ -22898,7 +22892,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "max", d, group1_extremum, @@ -22917,7 +22911,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "max", d, group2_extremum, @@ -22984,10 +22978,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2375usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2387usize, start_col: 22usize, - end_line: 2375usize, + end_line: 2387usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23010,7 +23004,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -23116,7 +23110,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", "min", ), ) @@ -23144,7 +23138,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "min", d, group1_extremum, @@ -23163,7 +23157,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "min", d, group2_extremum, @@ -23230,10 +23224,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2375usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2387usize, start_col: 22usize, - end_line: 2375usize, + end_line: 2387usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23256,7 +23250,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let values: &[i32] = ::FIXTURE_VALUES; + let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { return ::anyhow::__private::Err( ::anyhow::Error::msg( @@ -23362,7 +23356,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT group_key, eql_v2.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", "max", ), ) @@ -23390,7 +23384,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 1 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "max", d, group1_extremum, @@ -23409,7 +23403,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "group 2 eql_v2.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", "max", d, group2_extremum, @@ -23476,10 +23470,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2290usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2302usize, start_col: 22usize, - end_line: 2290usize, + end_line: 2302usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23506,7 +23500,7 @@ pub mod int4 { FROM pg_proc p \ JOIN pg_aggregate a ON a.aggfnoid = p.oid \ WHERE p.proname = $1 \ - AND p.pronamespace = 'eql_v2'::regnamespace \ + AND p.pronamespace = 'eql_v3'::regnamespace \ AND p.proargtypes[0]::regtype = $2::regtype", ) .bind(agg) @@ -23517,7 +23511,7 @@ pub mod int4 { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "eql_v2.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", + "eql_v3.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", agg, d, proparallel, @@ -23530,7 +23524,7 @@ pub mod int4 { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "eql_v2.{0}({1}) must declare a combinefunc for partial aggregation", + "eql_v3.{0}({1}) must declare a combinefunc for partial aggregation", agg, d, ), @@ -23585,10 +23579,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2290usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2302usize, start_col: 22usize, - end_line: 2290usize, + end_line: 2302usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23615,7 +23609,7 @@ pub mod int4 { FROM pg_proc p \ JOIN pg_aggregate a ON a.aggfnoid = p.oid \ WHERE p.proname = $1 \ - AND p.pronamespace = 'eql_v2'::regnamespace \ + AND p.pronamespace = 'eql_v3'::regnamespace \ AND p.proargtypes[0]::regtype = $2::regtype", ) .bind(agg) @@ -23626,7 +23620,7 @@ pub mod int4 { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "eql_v2.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", + "eql_v3.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", agg, d, proparallel, @@ -23639,7 +23633,7 @@ pub mod int4 { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "eql_v2.{0}({1}) must declare a combinefunc for partial aggregation", + "eql_v3.{0}({1}) must declare a combinefunc for partial aggregation", agg, d, ), @@ -23694,10 +23688,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2531usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2543usize, start_col: 22usize, - end_line: 2531usize, + end_line: 2543usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23749,7 +23743,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value) FROM typecheck_table", + "SELECT eql_v3.{0}(value) FROM typecheck_table", "min", ), ) @@ -23761,7 +23755,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "min", d, ), @@ -23780,7 +23774,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", "min", d, code, @@ -23839,10 +23833,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2531usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2543usize, start_col: 22usize, - end_line: 2531usize, + end_line: 2543usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23894,7 +23888,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value) FROM typecheck_table", + "SELECT eql_v3.{0}(value) FROM typecheck_table", "max", ), ) @@ -23906,7 +23900,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "max", d, ), @@ -23925,7 +23919,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", "max", d, code, @@ -23984,10 +23978,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2531usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2543usize, start_col: 22usize, - end_line: 2531usize, + end_line: 2543usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24039,7 +24033,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value) FROM typecheck_table", + "SELECT eql_v3.{0}(value) FROM typecheck_table", "min", ), ) @@ -24051,7 +24045,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "min", d, ), @@ -24070,7 +24064,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", "min", d, code, @@ -24129,10 +24123,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2531usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2543usize, start_col: 22usize, - end_line: 2531usize, + end_line: 2543usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24184,7 +24178,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v2.{0}(value) FROM typecheck_table", + "SELECT eql_v3.{0}(value) FROM typecheck_table", "max", ), ) @@ -24196,7 +24190,7 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "eql_v2.{0} on non-ord variant {1} must raise but succeeded", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "max", d, ), @@ -24215,7 +24209,7 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v2.{0}({1}), got {2:?} (message: {3})", + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", "max", d, code, @@ -24274,10 +24268,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2632usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2644usize, start_col: 22usize, - end_line: 2632usize, + end_line: 2644usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24300,7 +24294,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Storage); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -24402,10 +24396,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2665usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2677usize, start_col: 22usize, - end_line: 2665usize, + end_line: 2677usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -24428,7 +24422,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Storage); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), @@ -24506,10 +24500,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2632usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2644usize, start_col: 22usize, - end_line: 2632usize, + end_line: 2644usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24532,7 +24526,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Eq); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -24632,10 +24626,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_eq_count_path_cast"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2665usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2677usize, start_col: 22usize, - end_line: 2665usize, + end_line: 2677usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -24658,7 +24652,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Eq); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), @@ -24736,10 +24730,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2709usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2721usize, start_col: 22usize, - end_line: 2709usize, + end_line: 2721usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -24768,7 +24762,7 @@ pub mod int4 { ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) }); let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -24876,10 +24870,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2632usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2644usize, start_col: 22usize, - end_line: 2632usize, + end_line: 2644usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24902,7 +24896,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -25002,10 +24996,10 @@ pub mod int4 { name: test::StaticTestName("scalars::int4::matrix_int4_ord_count_path_cast"), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2665usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2677usize, start_col: 22usize, - end_line: 2665usize, + end_line: 2677usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25028,7 +25022,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), @@ -25106,10 +25100,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2709usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2721usize, start_col: 22usize, - end_line: 2709usize, + end_line: 2721usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -25138,7 +25132,7 @@ pub mod int4 { ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) }); let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -25246,10 +25240,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2632usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2644usize, start_col: 22usize, - end_line: 2632usize, + end_line: 2644usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25272,7 +25266,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -25374,10 +25368,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2665usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2677usize, start_col: 22usize, - end_line: 2665usize, + end_line: 2677usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25400,7 +25394,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), @@ -25478,10 +25472,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 2709usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2721usize, start_col: 22usize, - end_line: 2709usize, + end_line: 2721usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -25510,7 +25504,7 @@ pub mod int4 { ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) }); let fixture = ::fixture_table_name(); - let expected = ::FIXTURE_VALUES.len() as i64; + let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -25618,10 +25612,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -25638,27 +25632,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "all" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - "", &spec.sql_domain, "ASC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if "".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "ASC" == "DESC" { @@ -25739,10 +25747,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -25759,27 +25767,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "all" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - "", &spec.sql_domain, "DESC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if "".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "DESC" == "DESC" { @@ -25860,10 +25882,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -25880,27 +25902,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "gt_zero" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - " WHERE plaintext > 0", &spec.sql_domain, "ASC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if " WHERE plaintext > 0".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "ASC" == "DESC" { @@ -25981,10 +26017,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26001,27 +26037,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "gt_zero" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - " WHERE plaintext > 0", &spec.sql_domain, "DESC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if " WHERE plaintext > 0".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "DESC" == "DESC" { @@ -26102,10 +26152,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26122,27 +26172,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "all" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - "", &spec.sql_domain, "ASC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if "".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "ASC" == "DESC" { @@ -26223,10 +26287,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26243,27 +26307,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "all" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - "", &spec.sql_domain, "DESC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if "".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "DESC" == "DESC" { @@ -26344,10 +26422,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26364,27 +26442,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "gt_zero" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - " WHERE plaintext > 0", &spec.sql_domain, "ASC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if " WHERE plaintext > 0".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "ASC" == "DESC" { @@ -26465,10 +26557,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1781usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1782usize, start_col: 22usize, - end_line: 1781usize, + end_line: 1782usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26485,27 +26577,41 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let fixture_table = ::fixture_table_name(); + let fixture_table = ::fixture_table_name(); + let zero: i32 = Default::default(); + let gt_zero = "gt_zero" == "gt_zero"; + let where_clause = if gt_zero { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(zero), + ), + ) + }) + } else { + String::new() + }; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{1} ORDER BY eql_v2.ord_term(payload::{2}) {3}", + "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", fixture_table, - " WHERE plaintext > 0", &spec.sql_domain, "DESC", + where_clause, ), ) }); let actual: Vec = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: i32 = Default::default(); - let mut expected: Vec = ::FIXTURE_VALUES + let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if " WHERE plaintext > 0".contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if "DESC" == "DESC" { @@ -26586,10 +26692,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26661,7 +26767,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "ASC", "FIRST", table, @@ -26671,7 +26777,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "ASC" == "DESC" { @@ -26762,10 +26868,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26837,7 +26943,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "ASC", "LAST", table, @@ -26847,7 +26953,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "ASC" == "DESC" { @@ -26938,10 +27044,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27013,7 +27119,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "DESC", "FIRST", table, @@ -27023,7 +27129,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "DESC" == "DESC" { @@ -27114,10 +27220,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27189,7 +27295,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "DESC", "LAST", table, @@ -27199,7 +27305,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "DESC" == "DESC" { @@ -27290,10 +27396,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27365,7 +27471,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "ASC", "FIRST", table, @@ -27375,7 +27481,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "ASC" == "DESC" { @@ -27466,10 +27572,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27541,7 +27647,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "ASC", "LAST", table, @@ -27551,7 +27657,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "ASC" == "DESC" { @@ -27642,10 +27748,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27717,7 +27823,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "DESC", "FIRST", table, @@ -27727,7 +27833,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "DESC" == "DESC" { @@ -27818,10 +27924,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1880usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1892usize, start_col: 22usize, - end_line: 1880usize, + end_line: 1892usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27893,7 +27999,7 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v2.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", "DESC", "LAST", table, @@ -27903,7 +28009,7 @@ pub mod int4 { let actual: Vec> = sqlx::query_scalar(&sql) .fetch_all(&mut *tx) .await?; - let mut non_null: Vec = ::FIXTURE_VALUES + let mut non_null: Vec = ::fixture_values() .to_vec(); non_null.sort(); if "DESC" == "DESC" { @@ -27994,10 +28100,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28097,10 +28203,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28200,10 +28306,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28303,10 +28409,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28406,10 +28512,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28509,10 +28615,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28612,10 +28718,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28715,10 +28821,10 @@ pub mod int4 { ), ignore: false, ignore_message: ::core::option::Option::None, - source_file: "src/matrix.rs", - start_line: 1997usize, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2009usize, start_col: 22usize, - end_line: 1997usize, + end_line: 2009usize, end_col: 87usize, compile_fail: false, no_run: false, diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 644ea3514..2fdb9e5b0 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -149,10 +149,11 @@ fn collect_index_scan_nodes(value: &serde_json::Value, found: &mut Vec<(String, /// type (see `scalar_domains.rs`, `format!("eql_v3.{}…", T::PG_TYPE)`). /// /// Pivots — the comparison anchors swept by the correctness / cross-shape -/// arms — are derived from the scalar type: `MIN`, `MAX`, and zero -/// (`Default::default()`). The fixture must contain those three plaintext -/// rows, since each pivot's ciphertext is fetched at test time via -/// `fetch_fixture_payload`. +/// arms — are derived from the scalar type: `min_pivot()`, `max_pivot()`, and +/// zero (`Default::default()`). Integer scalars resolve `min_pivot`/`max_pivot` +/// to `Self::MIN`/`Self::MAX`; temporal scalars use explicit sentinel dates. The +/// fixture must contain those three plaintext rows, since each pivot's +/// ciphertext is fetched at test time via `fetch_fixture_payload`. #[macro_export] macro_rules! ordered_numeric_matrix { ( @@ -175,8 +176,8 @@ macro_rules! ordered_numeric_matrix { ord_domains = [(ord, Ord), (ord_ore, OrdOre)], ord_ore_domains = [(ord_ore, OrdOre)], pivots = [ - (min, <$scalar>::MIN), - (max, <$scalar>::MAX), + (min, <$scalar as $crate::scalar_domains::ScalarType>::min_pivot()), + (max, <$scalar as $crate::scalar_domains::ScalarType>::max_pivot()), (zero, <$scalar as ::core::default::Default>::default()), ], eq_ops = [(eq, "="), (neq, "<>")], @@ -1179,7 +1180,7 @@ macro_rules! __scalar_matrix_scale_case { "_scale_", $using, "_idx", ); - let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!(values.len() >= 2, "scale test requires >= 2 fixture rows for distinct filler/pivot"); let filler = values[0]; @@ -1277,7 +1278,7 @@ macro_rules! __scalar_matrix_scale_default_case { "_scaledef_", $using, "_idx", ); - let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!(values.len() >= 2, "scale test requires >= 2 fixture rows for distinct filler/pivot"); let filler = values[0]; @@ -1324,8 +1325,8 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", // ============================================================================ // Fixture-shape category — one test per type that pins the fixture's -// structural invariants: row count matches `T::FIXTURE_VALUES.len()`, -// ids are sequential from 1, plaintext column matches FIXTURE_VALUES in +// structural invariants: row count matches `T::fixture_values().len()`, +// ids are sequential from 1, plaintext column matches fixture_values() in // order, every payload carries the variant terms (`hm`, `ob`, `c`), // distinct plaintexts produce distinct hm terms, every payload declares // `v=2`. A single test runs all assertions to keep pool-setup cost @@ -1345,7 +1346,7 @@ macro_rules! __scalar_matrix_fixture_shape { ) -> anyhow::Result<()> { use $crate::scalar_domains::ScalarType; let table = <$scalar as ScalarType>::fixture_table_name(); - let expected: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + let expected: &[$scalar] = <$scalar as ScalarType>::fixture_values(); let n = expected.len() as i64; let count: i64 = sqlx::query_scalar(&format!( @@ -1457,7 +1458,7 @@ macro_rules! __scalar_matrix_ord_routes_case { let fixture_table = <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); let pivot: $scalar = - <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES[0]; + <$scalar as $crate::scalar_domains::ScalarType>::fixture_values()[0]; let pivot_lit = <$scalar as $crate::scalar_domains::ScalarType>::to_sql_literal(pivot); @@ -1508,7 +1509,7 @@ macro_rules! __scalar_matrix_ord_routes_case { // relaxed the two assertions cannot silently compensate for // each other — the derivation stays honest regardless. let expected_neq = - <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES.len() as i64 + <$scalar as $crate::scalar_domains::ScalarType>::fixture_values().len() as i64 - eq_count; let neq_count: i64 = sqlx::query_scalar(&format!( "SELECT count(*) FROM {table} WHERE value <> $1::jsonb::{d}", @@ -1672,7 +1673,7 @@ macro_rules! __scalar_matrix_index_case { .execute(&mut *tx).await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: $scalar = <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES[0]; + let pivot: $scalar = <$scalar as $crate::scalar_domains::ScalarType>::fixture_values()[0]; let payload = $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; let lit = $crate::scalar_domains::sql_string_literal(&payload); @@ -1747,24 +1748,22 @@ macro_rules! __scalar_matrix_order_by_domain { $crate::__scalar_matrix_order_by_case! { suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, dom_name = $dom_name, variant = $variant, - mode_name = asc_no_where, direction = "ASC", where_clause = "", + mode_name = asc_no_where, direction = "ASC", filter = all, } $crate::__scalar_matrix_order_by_case! { suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, dom_name = $dom_name, variant = $variant, - mode_name = desc_no_where, direction = "DESC", where_clause = "", + mode_name = desc_no_where, direction = "DESC", filter = all, } $crate::__scalar_matrix_order_by_case! { suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, dom_name = $dom_name, variant = $variant, - mode_name = asc_with_where, direction = "ASC", - where_clause = " WHERE plaintext > 0", + mode_name = asc_with_where, direction = "ASC", filter = gt_zero, } $crate::__scalar_matrix_order_by_case! { suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, dom_name = $dom_name, variant = $variant, - mode_name = desc_with_where, direction = "DESC", - where_clause = " WHERE plaintext > 0", + mode_name = desc_with_where, direction = "DESC", filter = gt_zero, } }; } @@ -1776,29 +1775,40 @@ macro_rules! __scalar_matrix_order_by_case { suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, dom_name = $dom_name:ident, variant = $variant:ident, mode_name = $mode_name:ident, direction = $direction:literal, - where_clause = $where_clause:literal $(,)? + filter = $filter:ident $(,)? ) => { $crate::paste::paste! { #[sqlx::test(fixtures(path = $script_path, scripts($script)))] async fn []( pool: sqlx::PgPool, ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); - let fixture_table = - <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); + let fixture_table = <$scalar as ScalarType>::fixture_table_name(); + + let zero: $scalar = Default::default(); + let gt_zero = stringify!($filter) == "gt_zero"; + // Build the WHERE clause from the zero pivot's SQL literal so it + // is type-agnostic: `plaintext > 0` for integers, `plaintext > + // '1970-01-01'` for dates. A hardcoded `> 0` would not typecheck + // against a non-integer plaintext column. + let where_clause = if gt_zero { + format!(" WHERE plaintext > {}", <$scalar as ScalarType>::to_sql_literal(zero)) + } else { + String::new() + }; let sql = format!( "SELECT plaintext FROM {fixture}{where_clause} \ ORDER BY eql_v3.ord_term(payload::{d}) {dir}", - fixture = fixture_table, where_clause = $where_clause, + fixture = fixture_table, d = &spec.sql_domain, dir = $direction, ); let actual: Vec<$scalar> = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - let zero: $scalar = Default::default(); let mut expected: Vec<$scalar> = - <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES.to_vec(); + <$scalar as ScalarType>::fixture_values().to_vec(); expected.sort(); - if $where_clause.contains("plaintext > 0") { + if gt_zero { expected.retain(|v| *v > zero); } if $direction == "DESC" { expected.reverse(); } @@ -1922,7 +1932,7 @@ ORDER BY eql_v3.ord_term(value) {dir} NULLS {nulls}", // Ground truth: non-NULL plaintexts sorted (reversed for DESC), // with NULL_ROWS Nones at the requested end. let mut non_null: Vec<$scalar> = - <$scalar as $crate::scalar_domains::ScalarType>::FIXTURE_VALUES.to_vec(); + <$scalar as $crate::scalar_domains::ScalarType>::fixture_values().to_vec(); non_null.sort(); if $direction == "DESC" { non_null.reverse(); } let sorted = non_null.into_iter().map(Some); @@ -2093,7 +2103,7 @@ macro_rules! __scalar_matrix_aggregate_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; let fixture = <$scalar as ScalarType>::fixture_table_name(); - let extremum: $scalar = <$scalar as ScalarType>::FIXTURE_VALUES + let extremum: $scalar = <$scalar as ScalarType>::fixture_values() .iter() .copied() .$picker() @@ -2202,7 +2212,7 @@ macro_rules! __scalar_matrix_aggregate_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; let fixture = <$scalar as ScalarType>::fixture_table_name(); - let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!( values.len() >= 2, "mixed-NULL test needs >= 2 fixture values; got {}", @@ -2381,7 +2391,7 @@ macro_rules! __scalar_matrix_aggregate_group_by_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; let fixture = <$scalar as ScalarType>::fixture_table_name(); - let values: &[$scalar] = <$scalar as ScalarType>::FIXTURE_VALUES; + let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!( values.len() >= 5, "GROUP BY test needs >= 5 fixture values; got {}", @@ -2638,7 +2648,7 @@ macro_rules! __scalar_matrix_count_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; let fixture = <$scalar as ScalarType>::fixture_table_name(); - let expected = <$scalar as ScalarType>::FIXTURE_VALUES.len() as i64; + let expected = <$scalar as ScalarType>::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query(&format!( @@ -2671,7 +2681,7 @@ macro_rules! __scalar_matrix_count_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; let fixture = <$scalar as ScalarType>::fixture_table_name(); - let expected = <$scalar as ScalarType>::FIXTURE_VALUES.len() as i64; + let expected = <$scalar as ScalarType>::fixture_values().len() as i64; let sql = format!( "SELECT COUNT(payload::{d}) FROM {fixture}", @@ -2718,7 +2728,7 @@ macro_rules! __scalar_matrix_count_distinct_dispatch { .expect("non-Storage variant must expose an extractor"); let extractor = format!("{extractor_fn}(value)"); let fixture = <$scalar as ScalarType>::fixture_table_name(); - let expected = <$scalar as ScalarType>::FIXTURE_VALUES.len() as i64; + let expected = <$scalar as ScalarType>::fixture_values().len() as i64; let mut tx = pool.begin().await?; sqlx::query(&format!( diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index e9f91e3b6..ba432c3e1 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -7,7 +7,7 @@ //! else — the four `eql_v2_{,_eq,_ord,_ord_ore}` domains, per-domain //! payload shapes, supported operators, index extractor expressions, //! ground-truth result sets — is derived from `T::PG_TYPE`, -//! `T::FIXTURE_VALUES`, and the `Variant` enum. +//! `T::fixture_values()`, and the `Variant` enum. use anyhow::{bail, Context, Result}; use sqlx::PgPool; @@ -34,12 +34,27 @@ pub trait ScalarType: /// Distinct plaintext values present in the fixture. Order doesn't /// matter — `expected_forward` sorts before returning. /// - /// For types driven by `ordered_numeric_matrix!`, the fixture MUST - /// include `MIN`, `MAX`, and zero (`Default::default()`): the matrix - /// uses those three as comparison pivots and fetches each one's - /// ciphertext via `fetch_fixture_payload`, which fails loudly if the - /// row is absent. - const FIXTURE_VALUES: &'static [Self]; + /// A method rather than a `const` so a scalar whose values can't be + /// `const`-constructed can return a borrow of a lazily-built `Vec`; + /// integer scalars return their `eql_scalars::_VALUES` const directly. + /// + /// For types driven by `ordered_numeric_matrix!`, the values MUST + /// include the three pivots (`min_pivot()`, `max_pivot()`, and zero + /// `Default::default()`): the matrix uses those as comparison pivots and + /// fetches each one's ciphertext via `fetch_fixture_payload`, which fails + /// loudly if the row is absent. + fn fixture_values() -> &'static [Self]; + + /// The low comparison pivot swept by the correctness / cross-shape arms. + /// Integer scalars return `Self::MIN`. A trait method (rather than the + /// matrix referencing `Self::MIN` directly) so a scalar without an inherent + /// `::MIN` const can supply an explicit sentinel; the returned value must be + /// present verbatim in `fixture_values()`. + fn min_pivot() -> Self; + + /// The high comparison pivot. Integer scalars return `Self::MAX`. Must be + /// present verbatim in `fixture_values()`. + fn max_pivot() -> Self; /// `fixtures.eql_v2_`. fn fixture_table_name() -> String { @@ -64,7 +79,7 @@ pub trait ScalarType: ">=" => |a, b| a >= b, other => panic!("expected_forward: unsupported operator {other}"), }; - let mut values: Vec = Self::FIXTURE_VALUES + let mut values: Vec = Self::fixture_values() .iter() .copied() .filter(|v| predicate(*v, pivot)) @@ -75,9 +90,10 @@ pub trait ScalarType: } // The per-type `impl ScalarType` blocks (one per scalar, each carrying its -// `PG_TYPE` token string and `FIXTURE_VALUES = eql_scalars::_VALUES`) -// are generated from the single harness list in `scalar_types.rs`. To add a -// type, add a `token => rust_type` line there — not an impl here. +// `PG_TYPE` token string, `fixture_values() = eql_scalars::_VALUES`, and +// `min_pivot()`/`max_pivot()` = `Self::MIN`/`Self::MAX`) are generated from the +// single harness list in `scalar_types.rs`. To add a type, add a +// `token => rust_type` line there — not an impl here. crate::scalar_types!(scalar_type_impls); /// Per-domain capability + payload shape. Storage carries no terms, `Eq` diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index 253898426..d78d55203 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -209,7 +209,7 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { let order_by_sql = "SELECT plaintext FROM fixtures.eql_v2_int4 \ ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) ASC"; - let mut ascending: Vec = ::FIXTURE_VALUES.to_vec(); + let mut ascending: Vec = ::fixture_values().to_vec(); ascending.sort(); // Baseline: `<` works (no raise) and ORDER BY is plaintext-sorted. @@ -336,7 +336,7 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { let order_by_desc = "SELECT plaintext FROM fixtures.eql_v2_int4 \ ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) DESC"; - let mut descending: Vec = ::FIXTURE_VALUES.to_vec(); + let mut descending: Vec = ::fixture_values().to_vec(); descending.sort(); descending.reverse(); From 74b8f8cab0c2ee6e3fd46cba7acc6db668637d9b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 4 Jun 2026 09:20:46 +1000 Subject: [PATCH 088/599] fix: apply CodeRabbit auto-fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scalar_domains.rs: document fixture_values() stable-order contract (callers compare element-wise and index positionally without sorting) - eql-tests-macros: assert emitted min_pivot/max_pivot bodies instead of loose MIN/MAX substrings that also match the doc comment 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- crates/eql-tests-macros/src/lib.rs | 11 +++++++---- tests/sqlx/src/scalar_domains.rs | 9 +++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 408648ae4..b88a06776 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -267,10 +267,13 @@ mod tests { assert!(out.contains(":: eql_scalars :: INT8_VALUES")); // const→fn: fixture values is a method now, plus the integer pivots. assert!(out.contains("fn fixture_values")); - assert!(out.contains("fn min_pivot")); - assert!(out.contains("fn max_pivot")); - assert!(out.contains("MIN")); - assert!(out.contains("MAX")); + // Assert the emitted pivot bodies, not bare `MIN`/`MAX` substrings: + // the latter also appear in the doc comment, so a loose check would + // pass even if the bodies stopped returning the inherent bounds. + assert!(out.contains("fn min_pivot () -> i32 { < i32 > :: MIN }")); + assert!(out.contains("fn max_pivot () -> i32 { < i32 > :: MAX }")); + assert!(out.contains("fn min_pivot () -> i64 { < i64 > :: MIN }")); + assert!(out.contains("fn max_pivot () -> i64 { < i64 > :: MAX }")); } #[test] diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index ba432c3e1..6c3d9a0c3 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -31,8 +31,13 @@ pub trait ScalarType: /// name and the fixture script name. Examples: `"int4"`, `"int8"`. const PG_TYPE: &'static str; - /// Distinct plaintext values present in the fixture. Order doesn't - /// matter — `expected_forward` sorts before returning. + /// Distinct plaintext values present in the fixture, in a stable + /// order that MUST match fixture insertion order (the SQL script's + /// `id` sequence). Callers rely on this: the fixture-shape test + /// compares this slice element-wise against the `ORDER BY id` + /// plaintext column, and the scale/index arms index positionally + /// (`[0]`, `[len / 2]`) without sorting. A lazily-built `Vec` impl + /// must therefore be built deterministically in that same order. /// /// A method rather than a `const` so a scalar whose values can't be /// `const`-constructed can return a borrow of a lazily-built `Vec`; From d3ac71caa863c50b4dea4b487ea27cec359be94a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 20:58:17 +1000 Subject: [PATCH 089/599] feat(scalars): add eql_v3.date encrypted-domain type + temporal harness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the `eql_v3.date` encrypted-domain scalar — the first non-integer ordered type — on top of the integer-agnostic harness refactor (parent PR). The SQL codegen needs no change (domains are jsonb-backed and token-driven); the work is one catalog row plus the temporal wiring the refactor enabled. Catalog (`eql-scalars`): `ScalarKind::Date` (`chrono::NaiveDate`), `Fixture::Date(&str)` (zero-dep ISO strings), `DATE_FIXTURES` (16 dates incl. the three matrix pivots), and `pub const DATE` appended to `CATALOG`, with mirrored panic / pivot-presence / token-order tests. Harness: an explicit `[temporal]` marker in the `scalar_types!` dispatch list drives the divergences from the integer path — the `impl ScalarType` for a temporal scalar is hand-written (chrono values can't be a `const` slice; pivots are explicit sentinels), and `scalar_fixture!` stamps a pivot-presence assert instead of the integer signed-extreme asserts. Adds `impl ScalarType for NaiveDate` (LazyLock-parsed values, `min_pivot`/`max_pivot` sentinels, quoted `to_sql_literal`), `EqlPlaintext for NaiveDate` (Cast::DATE), the sqlx `chrono` feature + direct `chrono` dep, the CHANGELOG entry, and a temporal-kinds note in the adding-a-scalar reference. --- CHANGELOG.md | 1 + Cargo.lock | 5 + crates/eql-scalars/src/lib.rs | 144 +++++++++++- crates/eql-tests-macros/src/lib.rs | 222 ++++++++++++++++-- .../adding-a-scalar-encrypted-domain-type.md | 34 ++- tasks/build.sh | 2 + tests/sqlx/Cargo.toml | 6 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 50 +++- tests/sqlx/src/fixtures/scalar_fixture.rs | 93 ++++++-- tests/sqlx/src/scalar_domains.rs | 139 ++++++++++- tests/sqlx/src/scalar_types.rs | 7 +- 11 files changed, 627 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d15fa325e..0c128bdc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_u64_8_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) +- **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) diff --git a/Cargo.lock b/Cargo.lock index 3f44eee0a..bfecae6ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1182,6 +1182,7 @@ name = "eql_tests" version = "0.1.0" dependencies = [ "anyhow", + "chrono", "cipherstash-client", "eql-scalars", "eql-tests-macros", @@ -3651,6 +3652,7 @@ checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ "base64", "bytes", + "chrono", "crc", "crossbeam-queue", "either", @@ -3726,6 +3728,7 @@ dependencies = [ "bitflags", "byteorder", "bytes", + "chrono", "crc", "digest 0.10.7", "dotenvy", @@ -3767,6 +3770,7 @@ dependencies = [ "base64", "bitflags", "byteorder", + "chrono", "crc", "dotenvy", "etcetera", @@ -3801,6 +3805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" dependencies = [ "atoi", + "chrono", "flume", "futures-channel", "futures-core", diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index be910d2e5..d1bab7682 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -31,6 +31,11 @@ pub enum ScalarKind { Numeric, Text, Jsonb, + /// Calendar date (`chrono::NaiveDate`). Ordered like the integer kinds via + /// ORE, but string-backed (ISO-8601) at the catalog layer and with no i128 + /// range — so it is *not* `is_int()` and the bounded-numeric accessors + /// panic for it, exactly like the other non-integer kinds. + Date, } impl ScalarKind { @@ -50,6 +55,7 @@ impl ScalarKind { ScalarKind::Numeric => "numeric", ScalarKind::Text => "text", ScalarKind::Jsonb => "jsonb", + ScalarKind::Date => "chrono::NaiveDate", } } @@ -61,7 +67,7 @@ impl ScalarKind { ScalarKind::I64 => "i64::MIN", // Explicit (not `_`) so a future integer variant is a compile // error here rather than silently hitting the panic. - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { panic!("min_symbol is only defined for integer kinds") } } @@ -73,7 +79,7 @@ impl ScalarKind { ScalarKind::I16 => "i16::MAX", ScalarKind::I32 => "i32::MAX", ScalarKind::I64 => "i64::MAX", - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { panic!("max_symbol is only defined for integer kinds") } } @@ -83,7 +89,7 @@ impl ScalarKind { pub const fn zero_symbol(self) -> &'static str { match self { ScalarKind::I16 | ScalarKind::I32 | ScalarKind::I64 => "0", - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { panic!("zero_symbol is only defined for integer kinds") } } @@ -96,7 +102,7 @@ impl ScalarKind { ScalarKind::I16 => i16::MIN as i128, ScalarKind::I32 => i32::MIN as i128, ScalarKind::I64 => i64::MIN as i128, - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { panic!("min_value is only defined for integer kinds") } } @@ -109,7 +115,7 @@ impl ScalarKind { ScalarKind::I16 => i16::MAX as i128, ScalarKind::I32 => i32::MAX as i128, ScalarKind::I64 => i64::MAX as i128, - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { panic!("max_value is only defined for integer kinds") } } @@ -249,6 +255,10 @@ pub enum Fixture { Numeric(&'static str), Text(&'static str), Jsonb(&'static str), + /// An ISO-8601 date string (`"1970-01-01"`). The catalog stays zero-dep, so + /// the string is parsed into a `chrono::NaiveDate` in the SQLx harness, not + /// here. Distinct by literal, like the other string-backed fixtures. + Date(&'static str), } impl Fixture { @@ -264,7 +274,7 @@ impl Fixture { Fixture::Max => Some(kind.max_value()), Fixture::Zero => Some(0), Fixture::Int(n) => Some(n), - Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) => None, + Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) | Fixture::Date(_) => None, } } @@ -276,7 +286,7 @@ impl Fixture { Fixture::Max => kind.max_symbol().to_string(), Fixture::Zero => kind.zero_symbol().to_string(), Fixture::Int(n) => n.to_string(), - Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) => { + Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { format!("{s:?}") } } @@ -349,6 +359,7 @@ macro_rules! fixtures { (text; $($s:literal),* $(,)?) => { &[$(Fixture::Text($s)),*] }; (numeric; $($s:literal),* $(,)?) => { &[$(Fixture::Numeric($s)),*] }; (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; + (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; } /// int4 fixture plaintexts — verbatim from `tasks/codegen/types/int4.toml`. @@ -370,6 +381,20 @@ const INT8_FIXTURES: &[Fixture] = fixtures!(int i64; Min, N(-5000000000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(5000000000), Max); +/// date fixture plaintexts — ISO-8601 (`YYYY-MM-DD`) strings, parsed into +/// `chrono::NaiveDate` in the SQLx harness (the catalog stays zero-dep). The +/// three temporal pivots MUST be present verbatim: `"1900-01-01"` (min_pivot), +/// `"1970-01-01"` (zero = `NaiveDate::default()`), and `"2099-12-31"` +/// (max_pivot) — the matrix fetches each one's ciphertext via +/// `fetch_fixture_payload`, which fails loudly if a row is absent. The interior +/// dates span varied years/months so range operators yield distinguishable +/// counts. All distinct. +const DATE_FIXTURES: &[Fixture] = fixtures!(date; + "1900-01-01", "1950-07-15", "1969-12-31", "1970-01-01", "1970-01-02", + "1980-02-29", "1991-11-09", "1999-12-31", "2000-01-01", "2004-02-29", + "2012-06-30", "2016-03-15", "2020-10-21", "2024-02-29", "2038-01-19", + "2099-12-31"); + const INT4: ScalarSpec = ScalarSpec { token: "int4", kind: ScalarKind::I32, @@ -391,13 +416,28 @@ const INT8: ScalarSpec = ScalarSpec { fixtures: INT8_FIXTURES, }; +/// `date` — an ordered, non-integer scalar. Reuses `ORDERED_INT_DOMAINS` (the +/// four-domain ordered shape is identical to the integer scalars); only the +/// kind and fixtures differ. +/// +/// Public (unlike the integer specs) because the SQLx harness reads +/// `DATE.fixtures` directly to parse the ISO strings into `chrono::NaiveDate` +/// at runtime — there is no `DATE_VALUES` const (chrono is not `const`-friendly +/// and `eql-scalars` stays zero-dep, so no typed slice is materialised here). +pub const DATE: ScalarSpec = ScalarSpec { + token: "date", + kind: ScalarKind::Date, + domains: ORDERED_INT_DOMAINS, + fixtures: DATE_FIXTURES, +}; + /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8]; +pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE]; /// Materialise an integer scalar's fixtures into a typed `&'static` slice at /// compile time. This is the **single-sourced** plaintext list the SQLx test -/// matrix reads as `ScalarType::FIXTURE_VALUES` and the fixture generator +/// matrix reads via `ScalarType::fixture_values()` and the fixture generator /// encrypts — derived from the same `CATALOG` row that drives SQL generation, /// so the oracle cannot drift from the fixture. (It replaces the old generated, /// committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no @@ -478,6 +518,7 @@ mod rust_tests { assert!(!ScalarKind::Numeric.is_int()); assert!(!ScalarKind::Text.is_int()); assert!(!ScalarKind::Jsonb.is_int()); + assert!(!ScalarKind::Date.is_int()); } // Pin that the bounded-numeric accessors panic (with message) on non-int kinds. @@ -522,6 +563,46 @@ mod rust_tests { assert_eq!(ScalarKind::I64.min_value(), -9_223_372_036_854_775_808_i128); assert_eq!(ScalarKind::I64.max_value(), 9_223_372_036_854_775_807_i128); } + + #[test] + fn date_maps_to_naive_date() { + // Ordered, non-integer kind: it carries a rust type but no i128 range, + // so it is not `is_int()` and the bounded accessors panic (below). + assert_eq!(ScalarKind::Date.rust_type(), "chrono::NaiveDate"); + assert!(!ScalarKind::Date.is_int()); + } + + // The bounded-numeric accessors panic on Date exactly as on the other + // non-integer kinds — Date is not an integer kind. + #[test] + #[should_panic(expected = "min_symbol is only defined for integer kinds")] + fn min_symbol_panics_on_date() { + ScalarKind::Date.min_symbol(); + } + + #[test] + #[should_panic(expected = "max_symbol is only defined for integer kinds")] + fn max_symbol_panics_on_date() { + ScalarKind::Date.max_symbol(); + } + + #[test] + #[should_panic(expected = "zero_symbol is only defined for integer kinds")] + fn zero_symbol_panics_on_date() { + ScalarKind::Date.zero_symbol(); + } + + #[test] + #[should_panic(expected = "min_value is only defined for integer kinds")] + fn min_value_panics_on_date() { + ScalarKind::Date.min_value(); + } + + #[test] + #[should_panic(expected = "max_value is only defined for integer kinds")] + fn max_value_panics_on_date() { + ScalarKind::Date.max_value(); + } } #[cfg(test)] @@ -682,6 +763,10 @@ mod fixture_tests { Fixture::Jsonb(r#"{"a":1}"#).numeric_value(ScalarKind::Jsonb), None ); + assert_eq!( + Fixture::Date("1970-01-01").numeric_value(ScalarKind::Date), + None + ); } #[test] @@ -718,6 +803,10 @@ mod fixture_tests { Fixture::Jsonb(r#"{"a":1}"#).render_literal(ScalarKind::Jsonb), r#""{\"a\":1}""# ); + assert_eq!( + Fixture::Date("1970-01-01").render_literal(ScalarKind::Date), + "\"1970-01-01\"" + ); } #[test] @@ -741,6 +830,11 @@ mod fixture_tests { assert_eq!(NUMS, &[Fixture::Numeric("0.1"), Fixture::Numeric("-2.5")]); const JSONS: &[Fixture] = fixtures!(jsonb; r#"{"a":1}"#); assert_eq!(JSONS, &[Fixture::Jsonb(r#"{"a":1}"#)]); + const DATES: &[Fixture] = fixtures!(date; "1970-01-01", "2099-12-31"); + assert_eq!( + DATES, + &[Fixture::Date("1970-01-01"), Fixture::Date("2099-12-31")] + ); } #[test] @@ -773,9 +867,33 @@ mod catalog_tests { } #[test] - fn catalog_has_int4_int2_int8_in_order() { + fn catalog_has_int4_int2_int8_date_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); - assert_eq!(tokens, vec!["int4", "int2", "int8"]); + assert_eq!(tokens, vec!["int4", "int2", "int8", "date"]); + } + + /// The three temporal matrix pivots must be present verbatim in DATE's + /// fixture strings — `fetch_fixture_payload` fetches each one's ciphertext, + /// failing loudly if absent. The integer `fixtures_include_min_max_and_zero` + /// invariant filters `is_int()` and skips date, so this is its temporal + /// analogue. + #[test] + fn temporal_fixtures_include_pivot_plaintexts() { + let date = scalar("date"); + let strings: Vec<&str> = date + .fixtures + .iter() + .filter_map(|f| match f { + Fixture::Date(s) => Some(*s), + _ => None, + }) + .collect(); + for pivot in ["1900-01-01", "1970-01-01", "2099-12-31"] { + assert!( + strings.contains(&pivot), + "date fixtures missing temporal pivot {pivot}" + ); + } } #[test] @@ -901,7 +1019,9 @@ mod invariant_tests { fn distinct_key(f: Fixture, kind: ScalarKind) -> DistinctKey { match f { - Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) => DistinctKey::Str(s), + Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { + DistinctKey::Str(s) + } _ => DistinctKey::Num( f.numeric_value(kind) .expect("sentinel/Int fixtures resolve to a number"), diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index b88a06776..e252bca03 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -32,15 +32,74 @@ use proc_macro2::TokenStream as TokenStream2; use quote::{format_ident, quote}; use syn::parse::{Parse, ParseStream}; use syn::punctuated::Punctuated; -use syn::{Ident, Token, Type}; +use syn::{bracketed, Ident, Token, Type}; -/// One `token => rust_type` entry. +/// One `token => rust_type` entry, with an optional trailing `[temporal]` flag. struct ScalarEntry { /// Postgres type token (`int4`); also the fixture/domain suffix and the /// matrix `suite` ident. token: Ident, /// Rust plaintext type (`i32`). rust_type: Type, + /// Whether this entry is a **temporal** (chrono-backed) scalar rather than a + /// fixed-width integer. Declared explicitly via a trailing `[temporal]` + /// marker in the dispatch list (`date => chrono::NaiveDate [temporal]`) + /// rather than sniffed from the Rust type path — so a temporal type that + /// isn't chrono-spelled, or a non-temporal type whose path happens to + /// contain `DateTime`, cannot be misclassified. + temporal: bool, +} + +/// The recognised optional entry markers, written in `[brackets]` after the +/// rust type (`date => chrono::NaiveDate [temporal]`). `temporal` is the only +/// one today; a new marker is added here so the accepted set stays a single +/// source of truth — `parse_optional_marker` validates against this slice and +/// the rejection message lists it verbatim. +const SUPPORTED_MARKERS: &[&str] = &["temporal"]; + +/// Parse the optional trailing `[marker]` on a scalar entry, returning whether +/// the `temporal` marker was present. +/// +/// Absent brackets → `false` (an ordinary integer scalar). When brackets are +/// present they must hold exactly one recognised identifier: an unknown marker +/// (`[temporial]`), empty brackets (`[]`), or trailing junk (`[temporal foo]`) +/// are all hard parse errors. The whole point of the explicit marker is that a +/// typo fails loudly rather than silently defaulting an entry to integer, so +/// the parse is strict on every malformed shape, not just unknown names. +fn parse_optional_marker(input: ParseStream) -> syn::Result { + if !input.peek(syn::token::Bracket) { + return Ok(false); + } + let content; + bracketed!(content in input); + + let marker: Ident = content.parse()?; + // Reject anything after the single marker ident (`[temporal foo]`, + // `[temporal, bar]`) — otherwise `bracketed!` would silently drop it. + if !content.is_empty() { + let rest: TokenStream2 = content.parse()?; + return Err(syn::Error::new_spanned( + rest, + "expected a single marker identifier, e.g. `[temporal]`", + )); + } + + let name = marker.to_string(); + if !SUPPORTED_MARKERS.contains(&name.as_str()) { + let supported = SUPPORTED_MARKERS + .iter() + .map(|m| format!("`{m}`")) + .collect::>() + .join(", "); + return Err(syn::Error::new( + marker.span(), + format!("unknown scalar marker `{name}`; supported markers: {supported}"), + )); + } + + // Only `temporal` flips the temporal flag; a future non-temporal marker + // would pass validation above but leave this `false`. + Ok(name == "temporal") } impl Parse for ScalarEntry { @@ -48,7 +107,28 @@ impl Parse for ScalarEntry { let token: Ident = input.parse()?; input.parse::]>()?; let rust_type: Type = input.parse()?; - Ok(ScalarEntry { token, rust_type }) + let temporal = parse_optional_marker(input)?; + Ok(ScalarEntry { + token, + rust_type, + temporal, + }) + } +} + +impl ScalarEntry { + /// Whether this entry is a **temporal** (chrono-backed) scalar rather than a + /// fixed-width integer, as declared by the `[temporal]` marker. It drives + /// two divergences: + /// + /// 1. The `impl ScalarType` for a temporal scalar is **hand-written** in + /// `scalar_domains.rs` (chrono values can't be a `const` slice and the + /// pivots are explicit sentinels), so `emit_scalar_type_impls` skips it. + /// 2. The integer-only fixture asserts (`::MIN`, `contains(&0)`, + /// `any(|v| v < 0)`) don't typecheck for a date, so `scalar_fixture!` + /// stamps a temporal (pivot-presence) variant instead. + fn is_temporal(&self) -> bool { + self.temporal } } @@ -78,7 +158,9 @@ fn values_const_ident(token: &Ident) -> Ident { /// Emit one `impl ScalarType for ` per entry. See /// [`emit_scalar_type_impls`]. fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { - let impls = list.entries.iter().map(|e| { + // Temporal scalars hand-write their `impl ScalarType` (see `is_temporal`); + // only integer scalars get a macro-generated impl. + let impls = list.entries.iter().filter(|e| !e.is_temporal()).map(|e| { let token_str = e.token.to_string(); let rust_type = &e.rust_type; let values = values_const_ident(&e.token); @@ -88,10 +170,7 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { /// The catalog `eql_scalars::*_VALUES` list — the same values /// the fixture generator encrypts, so the oracle can't drift - /// from the fixture. A method (not a `const`) so non-integer - /// scalars whose values can't be `const`-constructed can return - /// a borrow of a lazily-built `Vec`; integer scalars hand back - /// their catalog const directly. + /// from the fixture. fn fixture_values() -> &'static [#rust_type] { ::eql_scalars::#values } @@ -117,16 +196,33 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { let mods = list.entries.iter().map(|e| { let token_str = e.token.to_string(); let rust_type = &e.rust_type; - let values = values_const_ident(&e.token); let mod_ident = format_ident!("eql_v2_{}", e.token); let fixture_name = format!("eql_v2_{}", token_str); - quote! { - #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] - pub mod #mod_ident { - use ::eql_scalars::#values as VALUES; - // `scalar_fixture!` is `#[macro_export]`ed by `eql-tests`; - // these modules expand into that lib, so `crate::` resolves it. - crate::scalar_fixture!(#fixture_name, #rust_type, VALUES); + if e.is_temporal() { + // Temporal scalars have no `eql_scalars::_VALUES` const (chrono + // is not `const`-friendly). The values come from the harness + // accessor (`_values()`), and the fixture stamps the + // `temporal` kind so the integer-only signed-extreme asserts are + // replaced by a pivot-presence assert. The accessor name mirrors + // the token (`date` -> `date_values`). + let values_fn = format_ident!("{}_values", e.token); + quote! { + #[doc = concat!("`eql_v2_", #token_str, "` temporal scalar fixture — generated by `scalar_types!`.")] + pub mod #mod_ident { + use crate::scalar_domains::#values_fn as values; + crate::scalar_fixture!(temporal, #fixture_name, #rust_type, values()); + } + } + } else { + let values = values_const_ident(&e.token); + quote! { + #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] + pub mod #mod_ident { + use ::eql_scalars::#values as VALUES; + // `scalar_fixture!` is `#[macro_export]`ed by `eql-tests`; + // these modules expand into that lib, so `crate::` resolves it. + crate::scalar_fixture!(int, #fixture_name, #rust_type, VALUES); + } } } }); @@ -284,6 +380,100 @@ mod tests { assert!(out.contains("crate :: scalar_fixture !")); assert!(out.contains(r#""eql_v2_int4""#)); assert!(out.contains(":: eql_scalars :: INT4_VALUES as VALUES")); + // Integer entries stamp the `int` kind discriminator. + assert!(out.contains("int ,")); + } + + #[test] + fn temporal_entry_skips_impl_and_stamps_temporal_fixture() { + let list = + syn::parse_str::("int4 => i32, date => chrono::NaiveDate [temporal],") + .unwrap(); + // Impl emitter skips the temporal entry (hand-written impl). + let impls = norm(&scalar_type_impls_tokens(&list)); + assert!(impls.contains("impl ScalarType for i32")); + assert!(!impls.contains("NaiveDate")); + // Fixture-module emitter stamps the temporal kind + harness accessor. + let mods = norm(&scalar_fixture_modules_tokens(&list)); + assert!(mods.contains("pub mod eql_v2_date")); + assert!(mods.contains("temporal ,")); + assert!(mods.contains("date_values")); + // Matrix + dispatch emitters include the temporal entry like any other. + let suites = norm(&scalar_matrix_suites_tokens(&list)); + assert!(suites.contains("pub mod date")); + assert!(suites.contains("scalar = chrono :: NaiveDate")); + let dispatch = norm(&fixture_dispatch_tokens(&list)); + assert!(dispatch.contains(r#""date" =>"#)); + } + + /// Parse a single entry, asserting it parses, and return whether it is + /// temporal. Keeps the per-shape assertions below to one line each. + fn parse_entry_is_temporal(src: &str) -> bool { + syn::parse_str::(src) + .unwrap_or_else(|e| panic!("`{src}` should parse: {e}")) + .is_temporal() + } + + /// Parse a single entry expecting a parse error, returning the message. + fn parse_entry_err(src: &str) -> String { + match syn::parse_str::(src) { + Ok(_) => panic!("`{src}` should have failed to parse"), + Err(e) => e.to_string(), + } + } + + #[test] + fn no_marker_is_integer() { + // No brackets → integer, even when the type path mentions chrono: + // temporal-ness is declared, never inferred from the rust type. + assert!(!parse_entry_is_temporal("int4 => i32")); + assert!(!parse_entry_is_temporal("date => chrono::NaiveDate")); + } + + #[test] + fn temporal_marker_sets_the_flag() { + assert!(parse_entry_is_temporal( + "date => chrono::NaiveDate [temporal]" + )); + // Marker binds to its own entry, not the next one, across a list. + let list = + syn::parse_str::("date => chrono::NaiveDate [temporal], int4 => i32,") + .unwrap(); + assert!(list.entries[0].is_temporal()); + assert!(!list.entries[1].is_temporal()); + } + + #[test] + fn unknown_marker_errors_and_lists_the_supported_set() { + let msg = parse_entry_err("date => chrono::NaiveDate [temporial]"); + // Names the offending marker and the supported set, so the message is + // actionable rather than just "parse error". + assert!(msg.contains("unknown scalar marker"), "got: {msg}"); + assert!( + msg.contains("temporial"), + "should name the bad marker: {msg}" + ); + assert!( + msg.contains("`temporal`"), + "should list supported markers: {msg}" + ); + } + + #[test] + fn empty_marker_brackets_error() { + // `[]` has no marker ident to parse — a malformed entry, not a no-op. + let msg = parse_entry_err("date => chrono::NaiveDate []"); + assert!(!msg.is_empty()); + } + + #[test] + fn trailing_junk_in_marker_brackets_errors() { + // Regression guard: `[temporal foo]` / `[temporal, bar]` must NOT be + // silently accepted as `temporal` with the extra tokens dropped. + let msg = parse_entry_err("date => chrono::NaiveDate [temporal foo]"); + assert!(msg.contains("single marker identifier"), "got: {msg}"); + let msg = parse_entry_err("date => chrono::NaiveDate [temporal, bar]"); + assert!(msg.contains("single marker identifier"), "got: {msg}"); } #[test] diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index e4ae242b8..95d73a980 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -175,11 +175,41 @@ int_values!(INT4_VALUES, i32, INT4); ``` Both consumers reference that single symbol — the fixture generator -(`fixtures::eql_v2_::spec`) and the matrix oracle's `FIXTURE_VALUES` — so the -oracle cannot drift from the values the generator encrypts. There is no +(`fixtures::eql_v2_::spec`) and the matrix oracle's `fixture_values()` — so +the oracle cannot drift from the values the generator encrypts. There is no committed `_values.rs`: a Rust source of truth does not round-trip through generated Rust. Pin the exact materialised list with a `values_tests` assertion. +### Temporal kinds — string-backed fixtures and the pivot trait + +A **temporal** scalar (the `date` reference; `timestamptz` follows the same +shape) is *ordered but non-integer*, so it diverges from the integer path in +three places — all in the catalog/harness, never the SQL codegen (domains stay +jsonb-backed and token-driven): + +- **String-backed fixtures.** `eql-scalars` stays zero-dependency, so the + catalog stores ISO strings (`Fixture::Date("1970-01-01")`), not `chrono` + values. There is **no** `int_values!` / `_VALUES` const for a temporal kind + (chrono constructors are not `const`). The SQLx harness parses the catalog + strings into a `LazyLock>` and exposes them via a + `date_values()` accessor; `ScalarType::fixture_values()` returns a borrow of + that. The fixtures must include the three pivot plaintexts verbatim — for + `date`: `"1900-01-01"` (min), `"1970-01-01"` (zero = `NaiveDate::default()`), + `"2099-12-31"` (max) — guarded by `temporal_fixtures_include_pivot_plaintexts`. +- **The pivot trait, not `Self::MIN`/`MAX`.** `ScalarType::fixture_values()` is a + method (not a `const`), and the comparison pivots come from + `ScalarType::min_pivot()` / `max_pivot()` (zero stays `Default::default()`). + Integer impls return `Self::MIN`/`Self::MAX` (emitted by the proc-macro); + temporal impls return explicit sentinel dates and are **hand-written** in + `scalar_domains.rs` (the macro emits only integer impls). `to_sql_literal` is + overridden to single-quote the value (`'1970-01-01'`), since a bare `Display` + date is not a valid SQL literal. +- **The sqlx `chrono` feature.** The test crate enables sqlx's `chrono` feature + (and depends on `chrono` directly) so `Encode`/`Decode`/`Type` resolve for + `NaiveDate`. The integer-only fixture asserts (`::MIN`, `contains(&0)`, + `v < 0`) are stamped only for `int` entries; temporal entries stamp a + pivot-presence assert instead (the `kind` discriminator on `scalar_fixture!`). + --- ## 3. Wire the SQLx matrix oracle diff --git a/tasks/build.sh b/tasks/build.sh index 4d3d94e01..98dee8db7 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" +#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] +#MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" #!/bin/bash diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 208f6d86f..e67941c1a 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "macros"] } +sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "macros", "chrono"] } tokio = { version = "1", features = ["full"] } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -12,6 +12,10 @@ anyhow = "1" hex = "0.4" jsonschema = { version = "0.46.4", default-features = false } cipherstash-client = { version = "0.35", features = ["tokio"] } +# chrono is already in the tree transitively (cipherstash-client / ore-rs); pin +# it as a direct dependency so the harness can name `chrono::NaiveDate` for the +# `date` scalar (Encode/Decode/Type come from the sqlx `chrono` feature above). +chrono = { version = "0.4", default-features = false } paste = "1" eql-scalars = { path = "../../crates/eql-scalars" } eql-tests-macros = { path = "../../crates/eql-tests-macros" } diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 72c5b2a04..65c9f43ed 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -56,6 +56,7 @@ impl PlaintextSqlType { pub const INTEGER: PlaintextSqlType = PlaintextSqlType("integer"); pub const SMALLINT: PlaintextSqlType = PlaintextSqlType("smallint"); pub const BIGINT: PlaintextSqlType = PlaintextSqlType("bigint"); + pub const DATE: PlaintextSqlType = PlaintextSqlType("date"); pub fn as_str(&self) -> &'static str { self.0 @@ -70,30 +71,32 @@ impl fmt::Display for PlaintextSqlType { /// The EQL `cast_as` for a scalar kind, drawn from the `Cast` allowlist. /// -/// Only the integer kinds have `EqlPlaintext` impls, so only those resolve; -/// the non-integer kinds mirror the `eql_scalars` accessor convention and -/// `panic!`, since no impl can ever reach them. +/// Only the wired kinds (the integer kinds plus `Date`) have `EqlPlaintext` +/// impls, so only those resolve; the remaining kinds mirror the `eql_scalars` +/// accessor convention and `panic!`, since no impl can ever reach them. const fn cast_for_kind(kind: ScalarKind) -> Cast { match kind { ScalarKind::I32 => Cast::INT, ScalarKind::I16 => Cast::SMALL_INT, ScalarKind::I64 => Cast::BIG_INT, + ScalarKind::Date => Cast::DATE, ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { - panic!("EqlPlaintext is only implemented for integer scalar kinds") + panic!("EqlPlaintext is only implemented for the wired scalar kinds") } } } /// The `plaintext` oracle column SQL type for a scalar kind, drawn from the -/// `PlaintextSqlType` allowlist. As with `cast_for_kind`, only integer kinds -/// resolve. +/// `PlaintextSqlType` allowlist. As with `cast_for_kind`, only the wired kinds +/// (integers plus `Date`) resolve. const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { match kind { ScalarKind::I32 => PlaintextSqlType::INTEGER, ScalarKind::I16 => PlaintextSqlType::SMALLINT, ScalarKind::I64 => PlaintextSqlType::BIGINT, + ScalarKind::Date => PlaintextSqlType::DATE, ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { - panic!("EqlPlaintext is only implemented for integer scalar kinds") + panic!("EqlPlaintext is only implemented for the wired scalar kinds") } } } @@ -103,6 +106,7 @@ mod sealed { impl Sealed for i32 {} impl Sealed for i16 {} impl Sealed for i64 {} + impl Sealed for chrono::NaiveDate {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -154,6 +158,14 @@ impl EqlPlaintext for i64 { } } +impl EqlPlaintext for chrono::NaiveDate { + const KIND: ScalarKind = ScalarKind::Date; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::NaiveDate(Some(*self)) + } +} + #[cfg(test)] mod tests { use super::*; @@ -223,4 +235,28 @@ mod tests { other => panic!("expected Plaintext::BigInt(Some(42)), got {other:?}"), } } + + #[test] + fn naive_date_casts_to_date() { + assert_eq!(::CAST.as_str(), "date"); + } + + #[test] + fn naive_date_plaintext_sql_type_is_date() { + assert_eq!( + ::PLAINTEXT_SQL_TYPE.as_str(), + "date" + ); + } + + #[test] + fn naive_date_to_plaintext_wraps_in_naive_date_variant() { + // A NaiveDate must lift into the NaiveDate variant so the fixture + // driver encrypts it under the `date` cast. + let d = chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap(); + match d.to_plaintext() { + Plaintext::NaiveDate(Some(value)) => assert_eq!(value, d), + other => panic!("expected Plaintext::NaiveDate(Some(1970-01-01)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 1232b8b29..d6a955abb 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -13,37 +13,28 @@ /// Stamp out the `spec()` builder, the `fixture-gen` generator test, and the /// property-test module for a scalar fixture. /// +/// The leading **kind** discriminator (`int` / `temporal`) selects which +/// property asserts are stamped — the rest of the expansion is identical: +/// +/// - `int` — signed-extreme asserts (`<$ty>::MIN`/`MAX`, `contains(&0)`, +/// `any(|v| v < 0)`). These typecheck only for integer plaintexts. +/// - `temporal` — a pivot-presence assert (`min_pivot`/`max_pivot`/zero from the +/// `ScalarType` impl all appear in the values). `<$ty>::MIN` / `< 0` don't +/// exist for a `chrono::NaiveDate`, so the integer asserts can't be reused. +/// /// - `$name` — the fixture name (`"eql_v2_int2"`), drives every derived path. -/// - `$ty` — the Rust plaintext type (`i16`); `<$ty>::MIN`/`MAX` supply the -/// signed-extreme assertions. -/// - `$values` — the catalog-materialised value const (`eql_scalars::INT2_VALUES`). +/// - `$ty` — the Rust plaintext type (`i16` / `chrono::NaiveDate`). +/// - `$values` — the value source: the catalog const (`eql_scalars::INT2_VALUES`) +/// for integers, or the harness accessor (`date_values()`) for temporal. /// /// Indexes are fixed to `Unique` (HMAC, drives `=` / `<>`) and `Ore` (ORE /// block terms, drives `<` `<=` `>` `>=`) with a committed `jsonb` payload — /// the shape shared by every ordered scalar domain. #[macro_export] macro_rules! scalar_fixture { - ($name:literal, $ty:ty, $values:expr $(,)?) => { - /// The complete fixture definition. `IndexKind::Unique` drives `=` / - /// `<>` (HMAC); `IndexKind::Ore` drives `<` `<=` `>` `>=` (ORE block - /// terms). - pub fn spec() -> $crate::fixtures::FixtureSpec<'static, $ty> { - $crate::fixtures::FixtureSpec::new($name) - .with_index($crate::fixtures::IndexKind::Unique) - .with_index($crate::fixtures::IndexKind::Ore) - .with_column_type("jsonb") - .with_values($values) - } - - /// The generator. Gated by `fixture-gen` so `cargo test` never compiles - /// it; `#[ignore]` is a second guard. Run via - /// `mise run fixture:generate`. - #[cfg(feature = "fixture-gen")] - #[tokio::test] - #[ignore = "generator — run via `mise run fixture:generate`"] - async fn generate() -> anyhow::Result<()> { - spec().run().await - } + // Integer scalars: signed-extreme property asserts. + (int, $name:literal, $ty:ty, $values:expr $(,)?) => { + $crate::scalar_fixture!(@common $name, $ty, $values); #[cfg(test)] mod tests { @@ -79,4 +70,58 @@ macro_rules! scalar_fixture { } } }; + + // Temporal scalars: pivot-presence property assert (no signed extremes). + (temporal, $name:literal, $ty:ty, $values:expr $(,)?) => { + $crate::scalar_fixture!(@common $name, $ty, $values); + + #[cfg(test)] + mod tests { + use super::*; + use $crate::scalar_domains::ScalarType; + + #[test] + fn spec_is_complete() { + assert!(spec().check_complete().is_ok()); + } + + #[test] + fn spec_includes_pivots() { + // The three matrix pivots (min/max/zero) must be present in the + // fixture — `fetch_fixture_payload` fetches each at test time. + let spec = spec(); + let values = spec.values(); + let min = <$ty as ScalarType>::min_pivot(); + let max = <$ty as ScalarType>::max_pivot(); + let zero: $ty = ::core::default::Default::default(); + assert!(values.contains(&min), "spec must include min_pivot {min:?}"); + assert!(values.contains(&max), "spec must include max_pivot {max:?}"); + assert!(values.contains(&zero), "spec must include zero pivot {zero:?}"); + } + } + }; + + // Shared expansion: the `spec()` builder + the gated generator test. + (@common $name:literal, $ty:ty, $values:expr) => { + /// The complete fixture definition. `IndexKind::Unique` drives `=` / + /// `<>` (HMAC); `IndexKind::Ore` drives `<` `<=` `>` `>=` (ORE block + /// terms). + pub fn spec() -> $crate::fixtures::FixtureSpec<'static, $ty> { + $crate::fixtures::FixtureSpec::new($name) + .with_index($crate::fixtures::IndexKind::Unique) + .with_index($crate::fixtures::IndexKind::Ore) + .with_column_type("jsonb") + .with_values($values) + } + + /// The generator. Gated by `fixture-gen` so `cargo test` never compiles + /// it; `#[ignore]` is a second guard. Run via + /// `mise run fixture:generate`. + #[cfg(feature = "fixture-gen")] + #[tokio::test] + #[ignore = "generator — run via `mise run fixture:generate`"] + async fn generate() -> anyhow::Result<()> { + spec().run().await + } + }; } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 6c3d9a0c3..69453f59e 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -12,6 +12,7 @@ use anyhow::{bail, Context, Result}; use sqlx::PgPool; use std::fmt::{Debug, Display}; +use std::sync::LazyLock; /// One impl per scalar type. Two `const`s and the rest defaults. pub trait ScalarType: @@ -39,9 +40,11 @@ pub trait ScalarType: /// (`[0]`, `[len / 2]`) without sorting. A lazily-built `Vec` impl /// must therefore be built deterministically in that same order. /// - /// A method rather than a `const` so a scalar whose values can't be - /// `const`-constructed can return a borrow of a lazily-built `Vec`; - /// integer scalars return their `eql_scalars::_VALUES` const directly. + /// A method rather than a `const` because non-integer scalars (e.g. + /// `chrono::NaiveDate`, whose `from_ymd_opt` is not `const`) cannot be + /// materialised into a const slice; the harness builds those into a + /// `LazyLock>` and returns a borrow of it (see `date_values`). + /// Integer scalars return their `eql_scalars::_VALUES` const directly. /// /// For types driven by `ordered_numeric_matrix!`, the values MUST /// include the three pivots (`min_pivot()`, `max_pivot()`, and zero @@ -51,14 +54,15 @@ pub trait ScalarType: fn fixture_values() -> &'static [Self]; /// The low comparison pivot swept by the correctness / cross-shape arms. - /// Integer scalars return `Self::MIN`. A trait method (rather than the - /// matrix referencing `Self::MIN` directly) so a scalar without an inherent - /// `::MIN` const can supply an explicit sentinel; the returned value must be - /// present verbatim in `fixture_values()`. + /// Integer scalars return `Self::MIN`; temporal scalars return an explicit + /// sentinel (e.g. `1900-01-01`). A trait method rather than `Self::MIN` + /// because `chrono::DateTime` exposes `MAX_UTC`, not an inherent + /// `::MAX` const. The pivot must be present verbatim in `fixture_values()`. fn min_pivot() -> Self; - /// The high comparison pivot. Integer scalars return `Self::MAX`. Must be - /// present verbatim in `fixture_values()`. + /// The high comparison pivot. Integer scalars return `Self::MAX`; temporal + /// scalars return an explicit sentinel (e.g. `2099-12-31`). Must be present + /// verbatim in `fixture_values()`. fn max_pivot() -> Self; /// `fixtures.eql_v2_`. @@ -94,13 +98,122 @@ pub trait ScalarType: } } -// The per-type `impl ScalarType` blocks (one per scalar, each carrying its -// `PG_TYPE` token string, `fixture_values() = eql_scalars::_VALUES`, and -// `min_pivot()`/`max_pivot()` = `Self::MIN`/`Self::MAX`) are generated from the -// single harness list in `scalar_types.rs`. To add a type, add a +// The per-type `impl ScalarType` blocks for the **integer** scalars (each +// carrying its `PG_TYPE` token, `fixture_values() = eql_scalars::_VALUES`, +// and `min_pivot()`/`max_pivot()` = `Self::MIN`/`Self::MAX`) are generated from +// the single harness list in `scalar_types.rs`. To add an integer type, add a // `token => rust_type` line there — not an impl here. +// +// Temporal scalars (`chrono::NaiveDate`, and `DateTime` in the stacked +// timestamptz PR) are hand-written below instead: their fixture values cannot be +// a `const` slice (chrono constructors are not `const`), and their pivots are +// explicit sentinels rather than `Self::MIN`/`Self::MAX`. The macro emits only +// integer impls. crate::scalar_types!(scalar_type_impls); +/// Typed `chrono::NaiveDate` fixture values, parsed once from `date`'s catalog +/// row. The catalog stores ISO strings (zero-dep); parsing into `NaiveDate` +/// lives here. `from_ymd_opt` is not `const`, so this cannot be a const slice — +/// hence the `LazyLock>` + `fixture_values()`-returns-a-borrow shape that +/// the const→fn trait change exists to allow. +static DATE_VALUES_CELL: LazyLock> = LazyLock::new(|| { + eql_scalars::DATE + .fixtures + .iter() + .map(|f| match f { + eql_scalars::Fixture::Date(s) => chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d") + .unwrap_or_else(|e| panic!("invalid date fixture {s:?}: {e}")), + other => panic!("date catalog fixture must be Fixture::Date, got {other:?}"), + }) + .collect() +}); + +/// The parsed `chrono::NaiveDate` fixture values, in catalog order. Mirrors the +/// `eql_scalars::_VALUES` accessor pattern for the integer scalars; the +/// stacked timestamptz PR adds a sibling `timestamptz_values()`. Public so the +/// `eql_v2_date` fixture module (emitted by `scalar_types!(fixture_modules)`) +/// can hand the slice to `scalar_fixture!` — temporal scalars have no +/// `eql_scalars::_VALUES` const to point at. +pub fn date_values() -> &'static [chrono::NaiveDate] { + &DATE_VALUES_CELL +} + +impl ScalarType for chrono::NaiveDate { + const PG_TYPE: &'static str = "date"; + + fn fixture_values() -> &'static [Self] { + date_values() + } + + /// Temporal min pivot — `1900-01-01`, present verbatim in the catalog + /// fixtures (not `Self::MIN`, which would be far outside the fixture set). + fn min_pivot() -> Self { + chrono::NaiveDate::from_ymd_opt(1900, 1, 1).expect("1900-01-01 is a valid date") + } + + /// Temporal max pivot — `2099-12-31`, present verbatim in the catalog + /// fixtures. + fn max_pivot() -> Self { + chrono::NaiveDate::from_ymd_opt(2099, 12, 31).expect("2099-12-31 is a valid date") + } + + /// `Display` renders a `NaiveDate` as `2099-12-31` (unquoted), which is not + /// a valid SQL literal on its own — wrap it in single quotes. + fn to_sql_literal(value: Self) -> String { + format!("'{value}'") + } +} + +#[cfg(test)] +mod date_value_tests { + use super::*; + + /// The parsed `NaiveDate` values match the catalog fixture strings in + /// order and count — the harness oracle cannot drift from the catalog the + /// fixture generator encrypts. + #[test] + fn date_values_match_catalog_fixtures() { + let catalog: Vec<&str> = eql_scalars::DATE + .fixtures + .iter() + .map(|f| match f { + eql_scalars::Fixture::Date(s) => *s, + other => panic!("unexpected non-date fixture {other:?}"), + }) + .collect(); + let parsed = ::fixture_values(); + assert_eq!( + parsed.len(), + catalog.len(), + "parsed date count must match catalog fixture count" + ); + for (date, iso) in parsed.iter().zip(&catalog) { + assert_eq!(&date.format("%Y-%m-%d").to_string(), iso); + } + } + + /// The three temporal pivots resolve to fixture rows present verbatim. + #[test] + fn date_pivots_are_in_fixture_values() { + let values = ::fixture_values(); + let min = ::min_pivot(); + let max = ::max_pivot(); + let zero = chrono::NaiveDate::default(); + assert!(values.contains(&min), "min_pivot {min} must be a fixture"); + assert!(values.contains(&max), "max_pivot {max} must be a fixture"); + assert!( + values.contains(&zero), + "zero pivot {zero} must be a fixture" + ); + // Default is 1970-01-01, the documented zero pivot. + assert_eq!( + zero, + chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap(), + "NaiveDate::default() must be 1970-01-01" + ); + } +} + /// Per-domain capability + payload shape. Storage carries no terms, `Eq` /// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate /// twins — same operator surface, different SQL domain names — for the diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index b9b9f1124..6747900a6 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -4,7 +4,11 @@ //! To add a scalar encrypted-domain type to the SQLx matrix, add one //! `token => rust_type` line below (plus the catalog row in `eql-scalars` and //! the `EqlPlaintext` impl, owned separately — see -//! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). +//! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). A temporal +//! (chrono-backed) scalar adds a trailing `[temporal]` marker +//! (`date => chrono::NaiveDate [temporal]`): it hand-writes its `impl +//! ScalarType` in `scalar_domains.rs` and gets pivot-presence fixture asserts +//! instead of the integer signed-extreme ones. //! //! The harness pieces live in three separate compilation contexts (the //! `eql-tests` lib, the `encrypted_domain` integration-test binary, and the @@ -48,6 +52,7 @@ macro_rules! scalar_types { int4 => i32, int2 => i16, int8 => i64, + date => chrono::NaiveDate [temporal], } }; } From d6fdb5d64d458700e82a622102ef2da5bb123553 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 4 Jun 2026 23:44:00 +1000 Subject: [PATCH 090/599] docs: correct stale 'out of scope' scalar coverage in adding-a-scalar reference CATALOG now includes the non-integer ordered scalar (date) alongside the integers, so the 'only the integer scalars today' wording was stale. Addresses CodeRabbit feedback on PR #256. --- docs/reference/adding-a-scalar-encrypted-domain-type.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 95d73a980..4438e88a0 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -653,7 +653,8 @@ golden reference under `tests/codegen/reference/int4/`. `text` and `jsonb` are **not** materialised through this generator. The `ScalarKind` enum carries `Text` / `Numeric` / `Jsonb` variants and the `Fixture` enum carries their string-backed shapes at the capability layer, but -`CATALOG` declares only the integer scalars today, so no `text` / `jsonb` SQL +`CATALOG` declares only the ordered scalars today — the fixed-width integers +(`int2` / `int4` / `int8`) and the temporal `date` — so no `text` / `jsonb` SQL surface is generated. Text and JSONB encrypted behaviour lives on the composite `eql_v2_encrypted` type and its hand-written operator surface in `src/encrypted/` and `src/operators/`, not the scalar materializer. `jsonb` in particular needs a From 01f71bee90cd76e04d7b518deb7e82588b382f1c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 4 Jun 2026 23:46:00 +1000 Subject: [PATCH 091/599] feat(eql-scalars): add total BoundedIntKind sub-enum --- crates/eql-scalars/src/lib.rs | 90 +++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index d1bab7682..88b7259eb 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -15,14 +15,80 @@ //! //! Public names are consumed verbatim by the later codegen plans — do not rename. +/// The fixed-width integer kinds — exactly those scalar kinds with an `i128` +/// range and `MIN`/`MAX`/`Zero` sentinels. These accessors are **total**: every +/// variant answers every method. Non-integer kinds (`Numeric`/`Text`/`Jsonb`/ +/// `Date`) are simply not representable here, so there is no partial function to +/// panic — `ScalarKind::Date` cannot call `min_symbol()` because `Date` is not a +/// `BoundedIntKind`. Reach this type from a `ScalarKind` via +/// [`ScalarKind::as_bounded_int`]. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BoundedIntKind { + I16, + I32, + I64, +} + +impl BoundedIntKind { + /// The Rust type name as it appears in generated source (e.g. `"i32"`). + pub const fn rust_type(self) -> &'static str { + match self { + BoundedIntKind::I16 => "i16", + BoundedIntKind::I32 => "i32", + BoundedIntKind::I64 => "i64", + } + } + + /// The `MIN` named-constant symbol (e.g. `"i32::MIN"`). + pub const fn min_symbol(self) -> &'static str { + match self { + BoundedIntKind::I16 => "i16::MIN", + BoundedIntKind::I32 => "i32::MIN", + BoundedIntKind::I64 => "i64::MIN", + } + } + + /// The `MAX` named-constant symbol (e.g. `"i32::MAX"`). + pub const fn max_symbol(self) -> &'static str { + match self { + BoundedIntKind::I16 => "i16::MAX", + BoundedIntKind::I32 => "i32::MAX", + BoundedIntKind::I64 => "i64::MAX", + } + } + + /// The zero literal symbol (always `"0"`). + pub const fn zero_symbol(self) -> &'static str { + "0" + } + + /// Inclusive lower bound of the representable range, widened to `i128`. + pub const fn min_value(self) -> i128 { + match self { + BoundedIntKind::I16 => i16::MIN as i128, + BoundedIntKind::I32 => i32::MIN as i128, + BoundedIntKind::I64 => i64::MIN as i128, + } + } + + /// Inclusive upper bound of the representable range, widened to `i128`. + pub const fn max_value(self) -> i128 { + match self { + BoundedIntKind::I16 => i16::MAX as i128, + BoundedIntKind::I32 => i32::MAX as i128, + BoundedIntKind::I64 => i64::MAX as i128, + } + } +} + /// The native scalar a domain type maps onto. Integer kinds carry i128 bounds; /// the others (`Numeric`/`Text`/`Jsonb`) have string fixtures and no numeric /// range — though `Numeric`/`Text` are still ORE-orderable, only `Jsonb` is not. /// Capability layer only: `CATALOG` declares which kinds actually exist. /// -/// The bounded-numeric accessors below `panic!` on non-integer kinds; callers -/// gate with `is_int()`, so the panic guards against misuse rather than being a -/// reachable path (kept over `Option` to spare every integer caller an unwrap). +/// The bounded-numeric accessors live on the total [`BoundedIntKind`], reached +/// via [`ScalarKind::as_bounded_int`]; non-integer kinds have no such accessor, +/// so misuse is a compile error rather than a runtime panic. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ScalarKind { I16, @@ -490,6 +556,24 @@ int_values!(INT8_VALUES, i64, INT8); mod rust_tests { use super::*; + #[test] + fn bounded_int_kind_accessors_are_total() { + assert_eq!(BoundedIntKind::I16.rust_type(), "i16"); + assert_eq!(BoundedIntKind::I16.min_symbol(), "i16::MIN"); + assert_eq!(BoundedIntKind::I16.max_symbol(), "i16::MAX"); + assert_eq!(BoundedIntKind::I16.zero_symbol(), "0"); + assert_eq!(BoundedIntKind::I16.min_value(), -32_768_i128); + assert_eq!(BoundedIntKind::I16.max_value(), 32_767_i128); + + assert_eq!(BoundedIntKind::I32.min_symbol(), "i32::MIN"); + assert_eq!(BoundedIntKind::I32.min_value(), -2_147_483_648_i128); + assert_eq!(BoundedIntKind::I32.max_value(), 2_147_483_647_i128); + + assert_eq!(BoundedIntKind::I64.max_symbol(), "i64::MAX"); + assert_eq!(BoundedIntKind::I64.min_value(), -9_223_372_036_854_775_808_i128); + assert_eq!(BoundedIntKind::I64.max_value(), 9_223_372_036_854_775_807_i128); + } + #[test] fn i32_facts_match_int4() { assert_eq!(ScalarKind::I32.rust_type(), "i32"); From fc0853237a20ee0a74830f4aa7c034c9b8fc23ca Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 4 Jun 2026 23:51:12 +1000 Subject: [PATCH 092/599] refactor(eql-scalars): move bounded accessors to BoundedIntKind ScalarKind loses the five partial accessors that panicked on non-integer kinds; bounds now live on the total BoundedIntKind, reached via ScalarKind::as_bounded_int(). Date::min_symbol() is now a compile error. A CATALOG invariant test replaces the deleted #[should_panic] tests. --- crates/eql-scalars/src/lib.rs | 279 +++++++++++++++------------------- 1 file changed, 125 insertions(+), 154 deletions(-) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 88b7259eb..b5a362c7d 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -99,17 +99,33 @@ pub enum ScalarKind { Jsonb, /// Calendar date (`chrono::NaiveDate`). Ordered like the integer kinds via /// ORE, but string-backed (ISO-8601) at the catalog layer and with no i128 - /// range — so it is *not* `is_int()` and the bounded-numeric accessors - /// panic for it, exactly like the other non-integer kinds. + /// range — so it is *not* `is_int()` and `as_bounded_int()` returns `None` + /// for it, like the other non-integer kinds. The bounded-numeric accessors + /// live on `BoundedIntKind`, which `Date` cannot be, so they are + /// unreachable for it by construction rather than by a runtime panic. Date, } impl ScalarKind { - /// Fixed-width integer kinds — those with i128 bounds and `Min`/`Max`/`Zero` - /// sentinels. Gates the bounded-numeric accessors and invariants. NOT an - /// orderability test: `Numeric`/`Text` are ORE-orderable yet not integers. + /// The fixed-width integer kinds — those with `i128` bounds and + /// `Min`/`Max`/`Zero` sentinels — projected onto [`BoundedIntKind`], or + /// `None` for the non-integer kinds. The single boundary where "this kind has + /// bounds" is decided; the bounded accessors live on `BoundedIntKind` and are + /// total there. NOT an orderability test: `Numeric`/`Text`/`Date` are + /// ORE-orderable yet not integers. + pub const fn as_bounded_int(self) -> Option { + match self { + ScalarKind::I16 => Some(BoundedIntKind::I16), + ScalarKind::I32 => Some(BoundedIntKind::I32), + ScalarKind::I64 => Some(BoundedIntKind::I64), + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => None, + } + } + + /// True for the fixed-width integer kinds. Gates the bounded-numeric + /// invariants. Equivalent to `self.as_bounded_int().is_some()`. pub const fn is_int(self) -> bool { - matches!(self, ScalarKind::I16 | ScalarKind::I32 | ScalarKind::I64) + self.as_bounded_int().is_some() } /// The Rust type name as it appears in generated source (e.g. `"i32"`). @@ -124,68 +140,6 @@ impl ScalarKind { ScalarKind::Date => "chrono::NaiveDate", } } - - /// The `MIN` named-constant symbol (e.g. `"i32::MIN"`). Integer kinds only. - pub const fn min_symbol(self) -> &'static str { - match self { - ScalarKind::I16 => "i16::MIN", - ScalarKind::I32 => "i32::MIN", - ScalarKind::I64 => "i64::MIN", - // Explicit (not `_`) so a future integer variant is a compile - // error here rather than silently hitting the panic. - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { - panic!("min_symbol is only defined for integer kinds") - } - } - } - - /// The `MAX` named-constant symbol (e.g. `"i32::MAX"`). Integer kinds only. - pub const fn max_symbol(self) -> &'static str { - match self { - ScalarKind::I16 => "i16::MAX", - ScalarKind::I32 => "i32::MAX", - ScalarKind::I64 => "i64::MAX", - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { - panic!("max_symbol is only defined for integer kinds") - } - } - } - - /// The zero literal symbol (always `"0"`). Integer kinds only. - pub const fn zero_symbol(self) -> &'static str { - match self { - ScalarKind::I16 | ScalarKind::I32 | ScalarKind::I64 => "0", - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { - panic!("zero_symbol is only defined for integer kinds") - } - } - } - - /// Inclusive lower bound of the representable range, widened to `i128`. - /// Integer kinds only. - pub const fn min_value(self) -> i128 { - match self { - ScalarKind::I16 => i16::MIN as i128, - ScalarKind::I32 => i32::MIN as i128, - ScalarKind::I64 => i64::MIN as i128, - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { - panic!("min_value is only defined for integer kinds") - } - } - } - - /// Inclusive upper bound of the representable range, widened to `i128`. - /// Integer kinds only. - pub const fn max_value(self) -> i128 { - match self { - ScalarKind::I16 => i16::MAX as i128, - ScalarKind::I32 => i32::MAX as i128, - ScalarKind::I64 => i64::MAX as i128, - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => { - panic!("max_value is only defined for integer kinds") - } - } - } } /// A fixed index term known to the scalar materializer. @@ -336,8 +290,18 @@ impl Fixture { /// list into a typed `&'static` array at compile time. pub const fn numeric_value(self, kind: ScalarKind) -> Option { match self { - Fixture::Min => Some(kind.min_value()), - Fixture::Max => Some(kind.max_value()), + // `?` is not allowed in `const fn`, so match `as_bounded_int()` + // explicitly. A pivot on a non-integer kind resolves to `None`; the + // `pivot_sentinels_only_appear_with_integer_kinds` catalog test + // guarantees that combination never reaches a real `CATALOG` row. + Fixture::Min => match kind.as_bounded_int() { + Some(k) => Some(k.min_value()), + None => None, + }, + Fixture::Max => match kind.as_bounded_int() { + Some(k) => Some(k.max_value()), + None => None, + }, Fixture::Zero => Some(0), Fixture::Int(n) => Some(n), Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) | Fixture::Date(_) => None, @@ -347,10 +311,23 @@ impl Fixture { /// Render as a Rust source literal: sentinels -> named constant, `Int` -> the /// number, string kinds -> a `Debug`-quoted (Rust-escaped, not SQL) literal. pub fn render_literal(self, kind: ScalarKind) -> String { + const PIVOT_MSG: &str = "Min/Max/Zero fixtures require an integer kind"; match self { - Fixture::Min => kind.min_symbol().to_string(), - Fixture::Max => kind.max_symbol().to_string(), - Fixture::Zero => kind.zero_symbol().to_string(), + Fixture::Min => kind + .as_bounded_int() + .expect(PIVOT_MSG) + .min_symbol() + .to_string(), + Fixture::Max => kind + .as_bounded_int() + .expect(PIVOT_MSG) + .max_symbol() + .to_string(), + Fixture::Zero => kind + .as_bounded_int() + .expect(PIVOT_MSG) + .zero_symbol() + .to_string(), Fixture::Int(n) => n.to_string(), Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { format!("{s:?}") @@ -570,28 +547,51 @@ mod rust_tests { assert_eq!(BoundedIntKind::I32.max_value(), 2_147_483_647_i128); assert_eq!(BoundedIntKind::I64.max_symbol(), "i64::MAX"); - assert_eq!(BoundedIntKind::I64.min_value(), -9_223_372_036_854_775_808_i128); - assert_eq!(BoundedIntKind::I64.max_value(), 9_223_372_036_854_775_807_i128); + assert_eq!( + BoundedIntKind::I64.min_value(), + -9_223_372_036_854_775_808_i128 + ); + assert_eq!( + BoundedIntKind::I64.max_value(), + 9_223_372_036_854_775_807_i128 + ); + } + + #[test] + fn as_bounded_int_maps_integer_kinds_only() { + assert_eq!(ScalarKind::I16.as_bounded_int(), Some(BoundedIntKind::I16)); + assert_eq!(ScalarKind::I32.as_bounded_int(), Some(BoundedIntKind::I32)); + assert_eq!(ScalarKind::I64.as_bounded_int(), Some(BoundedIntKind::I64)); + assert_eq!(ScalarKind::Numeric.as_bounded_int(), None); + assert_eq!(ScalarKind::Text.as_bounded_int(), None); + assert_eq!(ScalarKind::Jsonb.as_bounded_int(), None); + assert_eq!(ScalarKind::Date.as_bounded_int(), None); } #[test] fn i32_facts_match_int4() { assert_eq!(ScalarKind::I32.rust_type(), "i32"); - assert_eq!(ScalarKind::I32.min_symbol(), "i32::MIN"); - assert_eq!(ScalarKind::I32.max_symbol(), "i32::MAX"); - assert_eq!(ScalarKind::I32.zero_symbol(), "0"); - assert_eq!(ScalarKind::I32.min_value(), -2_147_483_648_i128); - assert_eq!(ScalarKind::I32.max_value(), 2_147_483_647_i128); + let k = ScalarKind::I32 + .as_bounded_int() + .expect("I32 is an integer kind"); + assert_eq!(k.min_symbol(), "i32::MIN"); + assert_eq!(k.max_symbol(), "i32::MAX"); + assert_eq!(k.zero_symbol(), "0"); + assert_eq!(k.min_value(), -2_147_483_648_i128); + assert_eq!(k.max_value(), 2_147_483_647_i128); } #[test] fn i16_facts_match_int2() { assert_eq!(ScalarKind::I16.rust_type(), "i16"); - assert_eq!(ScalarKind::I16.min_symbol(), "i16::MIN"); - assert_eq!(ScalarKind::I16.max_symbol(), "i16::MAX"); - assert_eq!(ScalarKind::I16.zero_symbol(), "0"); - assert_eq!(ScalarKind::I16.min_value(), -32_768_i128); - assert_eq!(ScalarKind::I16.max_value(), 32_767_i128); + let k = ScalarKind::I16 + .as_bounded_int() + .expect("I16 is an integer kind"); + assert_eq!(k.min_symbol(), "i16::MIN"); + assert_eq!(k.max_symbol(), "i16::MAX"); + assert_eq!(k.zero_symbol(), "0"); + assert_eq!(k.min_value(), -32_768_i128); + assert_eq!(k.max_value(), 32_767_i128); } #[test] @@ -605,87 +605,50 @@ mod rust_tests { assert!(!ScalarKind::Date.is_int()); } - // Pin that the bounded-numeric accessors panic (with message) on non-int kinds. - #[test] - #[should_panic(expected = "min_symbol is only defined for integer kinds")] - fn min_symbol_panics_on_non_int_kind() { - ScalarKind::Text.min_symbol(); - } - - #[test] - #[should_panic(expected = "max_symbol is only defined for integer kinds")] - fn max_symbol_panics_on_non_int_kind() { - ScalarKind::Numeric.max_symbol(); - } - - #[test] - #[should_panic(expected = "zero_symbol is only defined for integer kinds")] - fn zero_symbol_panics_on_non_int_kind() { - ScalarKind::Jsonb.zero_symbol(); - } - - #[test] - #[should_panic(expected = "min_value is only defined for integer kinds")] - fn min_value_panics_on_non_int_kind() { - ScalarKind::Text.min_value(); - } - - #[test] - #[should_panic(expected = "max_value is only defined for integer kinds")] - fn max_value_panics_on_non_int_kind() { - ScalarKind::Jsonb.max_value(); - } - #[test] fn i64_facts() { // Capability-layer fact: i64 is the Rust kind a future int8 maps onto. // Present here so adding int8 later is a pure `CATALOG` append. assert_eq!(ScalarKind::I64.rust_type(), "i64"); - assert_eq!(ScalarKind::I64.min_symbol(), "i64::MIN"); - assert_eq!(ScalarKind::I64.max_symbol(), "i64::MAX"); - assert_eq!(ScalarKind::I64.zero_symbol(), "0"); - assert_eq!(ScalarKind::I64.min_value(), -9_223_372_036_854_775_808_i128); - assert_eq!(ScalarKind::I64.max_value(), 9_223_372_036_854_775_807_i128); + let k = ScalarKind::I64 + .as_bounded_int() + .expect("I64 is an integer kind"); + assert_eq!(k.min_symbol(), "i64::MIN"); + assert_eq!(k.max_symbol(), "i64::MAX"); + assert_eq!(k.zero_symbol(), "0"); + assert_eq!(k.min_value(), -9_223_372_036_854_775_808_i128); + assert_eq!(k.max_value(), 9_223_372_036_854_775_807_i128); } #[test] fn date_maps_to_naive_date() { // Ordered, non-integer kind: it carries a rust type but no i128 range, - // so it is not `is_int()` and the bounded accessors panic (below). + // so it is not `is_int()` and `as_bounded_int()` returns `None` — the + // bounded accessors are simply not reachable for it. assert_eq!(ScalarKind::Date.rust_type(), "chrono::NaiveDate"); assert!(!ScalarKind::Date.is_int()); + assert_eq!(ScalarKind::Date.as_bounded_int(), None); } - // The bounded-numeric accessors panic on Date exactly as on the other - // non-integer kinds — Date is not an integer kind. - #[test] - #[should_panic(expected = "min_symbol is only defined for integer kinds")] - fn min_symbol_panics_on_date() { - ScalarKind::Date.min_symbol(); - } - - #[test] - #[should_panic(expected = "max_symbol is only defined for integer kinds")] - fn max_symbol_panics_on_date() { - ScalarKind::Date.max_symbol(); - } - + /// The structural guarantee that replaces the old runtime panics: a + /// `Min`/`Max`/`Zero` pivot sentinel may only appear in a `CATALOG` row whose + /// kind is an integer kind. `render_literal` would `expect`-panic and + /// `numeric_value` would resolve to `None` for a pivot on a non-integer kind; + /// this test makes such a row a test failure at the source of truth. #[test] - #[should_panic(expected = "zero_symbol is only defined for integer kinds")] - fn zero_symbol_panics_on_date() { - ScalarKind::Date.zero_symbol(); - } - - #[test] - #[should_panic(expected = "min_value is only defined for integer kinds")] - fn min_value_panics_on_date() { - ScalarKind::Date.min_value(); - } - - #[test] - #[should_panic(expected = "max_value is only defined for integer kinds")] - fn max_value_panics_on_date() { - ScalarKind::Date.max_value(); + fn pivot_sentinels_only_appear_with_integer_kinds() { + for spec in CATALOG { + for fixture in spec.fixtures { + if matches!(fixture, Fixture::Min | Fixture::Max | Fixture::Zero) { + assert!( + spec.kind.is_int(), + "pivot sentinel {fixture:?} on non-integer kind {:?} (token `{}`)", + spec.kind, + spec.token, + ); + } + } + } } } @@ -1118,18 +1081,22 @@ mod invariant_tests { // The MIN/MAX/ZERO pivots are an integer-kind invariant; non-integer // kinds (text/numeric/jsonb) have no such pivots. for s in CATALOG.iter().filter(|s| s.kind.is_int()) { + let bk = s + .kind + .as_bounded_int() + .expect("loop is filtered to integer kinds"); let resolved: Vec = s .fixtures .iter() .filter_map(|f| f.numeric_value(s.kind)) .collect(); assert!( - resolved.contains(&s.kind.min_value()), + resolved.contains(&bk.min_value()), "{} fixtures missing MIN", s.token ); assert!( - resolved.contains(&s.kind.max_value()), + resolved.contains(&bk.max_value()), "{} fixtures missing MAX", s.token ); @@ -1175,7 +1142,11 @@ mod invariant_tests { fn every_fixture_value_is_within_kind_bounds() { // Asserts the resolved sentinels stay within bounds (integer kinds only). for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let (lo, hi) = (s.kind.min_value(), s.kind.max_value()); + let bk = s + .kind + .as_bounded_int() + .expect("loop is filtered to integer kinds"); + let (lo, hi) = (bk.min_value(), bk.max_value()); for f in s.fixtures { let Some(n) = f.numeric_value(s.kind) else { continue; From b1b993486fdd9bc0a414d4108aeb82be960d9c32 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 4 Jun 2026 23:54:55 +1000 Subject: [PATCH 093/599] docs: describe BoundedIntKind instead of panicking accessors Update the adding-a-scalar reference's `kind` bullet to reflect that the bounded-numeric accessors moved to the total BoundedIntKind sub-enum, and add the implementation plan under docs/superpowers/plans/. --- .../adding-a-scalar-encrypted-domain-type.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 4438e88a0..2f95c20cc 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -93,12 +93,16 @@ than a runtime validator: domain's full name is `token` + `suffix` (`ScalarSpec::domain_name`), pinned by `every_domain_name_starts_with_its_token`. - **`kind`** — a `ScalarKind` (`I16` / `I32` / `I64` / `Numeric` / `Text` / - `Jsonb`), carrying the Rust type name, the `MIN`/`MAX`/zero symbols, and the - numeric bounds. Only the integer kinds have an i128 range with `Min`/`Max`/`Zero` - sentinels; the bounded accessors `panic!` on the others (a misuse guard gated - by `is_int()`). **If `` needs a new scalar width, add a `ScalarKind` - variant** (rust-type name, `MIN`/`MAX`/zero symbols, bounds) with unit tests - over its `impl` methods. + `Jsonb` / `Date`), carrying the Rust type name. Only the integer kinds have an + i128 range with `Min`/`Max`/`Zero` sentinels: those bounded accessors + (`min_symbol`/`max_symbol`/`zero_symbol`/`min_value`/`max_value`) live on the + total `BoundedIntKind` sub-enum, reached via `ScalarKind::as_bounded_int() -> + Option`. Non-integer kinds (`Numeric`/`Text`/`Jsonb`/`Date`) + return `None` and simply have no bounded accessor — misuse is a compile error, + not a runtime panic. **If `` needs a new fixed-width integer, add a + `BoundedIntKind` variant** (rust-type name, `MIN`/`MAX`/zero symbols, bounds) + plus its `ScalarKind` variant and `as_bounded_int` arm, with unit tests over + the `impl` methods. - **`domains`** — a non-empty `&[DomainSpec]` (pinned by `every_type_has_at_least_one_domain`), each a `suffix` + the fixed `&[Term]` it carries. The storage domain is `suffix: ""` with no terms; `_eq => [Term::Hm]`; From 03ee7f661c93f301ecf4befcc06cd8091c9760e6 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 13:08:42 +1000 Subject: [PATCH 094/599] test(scalars): add temporal_values! macro for chrono-backed ScalarType wiring --- tests/sqlx/src/scalar_domains.rs | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 69453f59e..58c3883c5 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -111,6 +111,81 @@ pub trait ScalarType: // integer impls. crate::scalar_types!(scalar_type_impls); +/// Generate the test wiring for one chrono-backed (temporal) scalar from its +/// catalog row: a `LazyLock>` parsing the catalog fixture strings, a +/// public `()` returning a borrow of it, `impl ScalarType for T`, and +/// a `#[cfg(test)]` module asserting the parsed values track the catalog and +/// include the pivots. The chrono analogue of `eql_scalars::int_values!` +/// (integers materialise a `const` slice; temporals can't, so values live in a +/// `LazyLock`). `parse`/`min_pivot`/`max_pivot`/`sql_lit` are expressions so each +/// type supplies its own chrono parsing, sentinel pivots, and SQL literal form. +macro_rules! temporal_values { + ( + cell = $cell:ident, + accessor = $accessor:ident, + rust_type = $ty:ty, + spec = $spec:path, + variant = $variant:ident, + pg_type = $pg:literal, + parse = $parse:expr, + min_pivot = $min:expr, + max_pivot = $max:expr, + sql_lit = $sql_lit:expr $(,)? + ) => { + static $cell: std::sync::LazyLock> = std::sync::LazyLock::new(|| { + let parse: fn(&str) -> $ty = $parse; + $spec + .fixtures + .iter() + .map(|f| match f { + ::eql_scalars::Fixture::$variant(s) => parse(s), + other => panic!(concat!("non-", $pg, " fixture in ", $pg, " catalog row: {:?}"), other), + }) + .collect() + }); + + #[doc = concat!("Typed `", stringify!($ty), "` fixtures for `", $pg, "`, parsed once from the catalog.")] + pub fn $accessor() -> &'static [$ty] { + &$cell + } + + impl ScalarType for $ty { + const PG_TYPE: &'static str = $pg; + fn fixture_values() -> &'static [$ty] { $accessor() } + fn min_pivot() -> $ty { $min } + fn max_pivot() -> $ty { $max } + fn to_sql_literal(value: $ty) -> String { + let f: fn(&$ty) -> String = $sql_lit; + f(&value) + } + } + + #[cfg(test)] + mod $accessor { + use super::*; + #[test] + fn values_match_catalog_fixtures() { + let parse: fn(&str) -> $ty = $parse; + let want: Vec<$ty> = $spec.fixtures.iter().map(|f| match f { + ::eql_scalars::Fixture::$variant(s) => parse(s), + other => panic!("non-{} fixture: {:?}", $pg, other), + }).collect(); + assert_eq!($accessor(), want.as_slice()); + } + #[test] + fn pivots_present_in_fixtures() { + let vals = $accessor(); + assert!(vals.contains(&<$ty as ScalarType>::min_pivot()), "min pivot missing"); + assert!(vals.contains(&<$ty as ScalarType>::max_pivot()), "max pivot missing"); + // The matrix sweeps a zero pivot (`Default::default()`) on every + // ordered/eq-only suite and fetches its ciphertext via + // `fetch_fixture_payload`, so it must be present verbatim too. + assert!(vals.contains(&<$ty as Default>::default()), "zero/default pivot missing"); + } + } + }; +} + /// Typed `chrono::NaiveDate` fixture values, parsed once from `date`'s catalog /// row. The catalog stores ISO strings (zero-dep); parsing into `NaiveDate` /// lives here. `from_ymd_opt` is not `const`, so this cannot be a const slice — From 86b1238e8069a823b8a36e45ce39cfbf5c4741df Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 13:25:28 +1000 Subject: [PATCH 095/599] test(scalars): generate date ScalarType via temporal_values! --- tests/sqlx/src/scalar_domains.rs | 120 +++++-------------------------- 1 file changed, 18 insertions(+), 102 deletions(-) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 58c3883c5..a4eabdf2d 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -12,7 +12,6 @@ use anyhow::{bail, Context, Result}; use sqlx::PgPool; use std::fmt::{Debug, Display}; -use std::sync::LazyLock; /// One impl per scalar type. Two `const`s and the rest defaults. pub trait ScalarType: @@ -186,107 +185,24 @@ macro_rules! temporal_values { }; } -/// Typed `chrono::NaiveDate` fixture values, parsed once from `date`'s catalog -/// row. The catalog stores ISO strings (zero-dep); parsing into `NaiveDate` -/// lives here. `from_ymd_opt` is not `const`, so this cannot be a const slice — -/// hence the `LazyLock>` + `fixture_values()`-returns-a-borrow shape that -/// the const→fn trait change exists to allow. -static DATE_VALUES_CELL: LazyLock> = LazyLock::new(|| { - eql_scalars::DATE - .fixtures - .iter() - .map(|f| match f { - eql_scalars::Fixture::Date(s) => chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d") - .unwrap_or_else(|e| panic!("invalid date fixture {s:?}: {e}")), - other => panic!("date catalog fixture must be Fixture::Date, got {other:?}"), - }) - .collect() -}); - -/// The parsed `chrono::NaiveDate` fixture values, in catalog order. Mirrors the -/// `eql_scalars::_VALUES` accessor pattern for the integer scalars; the -/// stacked timestamptz PR adds a sibling `timestamptz_values()`. Public so the -/// `eql_v2_date` fixture module (emitted by `scalar_types!(fixture_modules)`) -/// can hand the slice to `scalar_fixture!` — temporal scalars have no -/// `eql_scalars::_VALUES` const to point at. -pub fn date_values() -> &'static [chrono::NaiveDate] { - &DATE_VALUES_CELL -} - -impl ScalarType for chrono::NaiveDate { - const PG_TYPE: &'static str = "date"; - - fn fixture_values() -> &'static [Self] { - date_values() - } - - /// Temporal min pivot — `1900-01-01`, present verbatim in the catalog - /// fixtures (not `Self::MIN`, which would be far outside the fixture set). - fn min_pivot() -> Self { - chrono::NaiveDate::from_ymd_opt(1900, 1, 1).expect("1900-01-01 is a valid date") - } - - /// Temporal max pivot — `2099-12-31`, present verbatim in the catalog - /// fixtures. - fn max_pivot() -> Self { - chrono::NaiveDate::from_ymd_opt(2099, 12, 31).expect("2099-12-31 is a valid date") - } - - /// `Display` renders a `NaiveDate` as `2099-12-31` (unquoted), which is not - /// a valid SQL literal on its own — wrap it in single quotes. - fn to_sql_literal(value: Self) -> String { - format!("'{value}'") - } -} - -#[cfg(test)] -mod date_value_tests { - use super::*; - - /// The parsed `NaiveDate` values match the catalog fixture strings in - /// order and count — the harness oracle cannot drift from the catalog the - /// fixture generator encrypts. - #[test] - fn date_values_match_catalog_fixtures() { - let catalog: Vec<&str> = eql_scalars::DATE - .fixtures - .iter() - .map(|f| match f { - eql_scalars::Fixture::Date(s) => *s, - other => panic!("unexpected non-date fixture {other:?}"), - }) - .collect(); - let parsed = ::fixture_values(); - assert_eq!( - parsed.len(), - catalog.len(), - "parsed date count must match catalog fixture count" - ); - for (date, iso) in parsed.iter().zip(&catalog) { - assert_eq!(&date.format("%Y-%m-%d").to_string(), iso); - } - } - - /// The three temporal pivots resolve to fixture rows present verbatim. - #[test] - fn date_pivots_are_in_fixture_values() { - let values = ::fixture_values(); - let min = ::min_pivot(); - let max = ::max_pivot(); - let zero = chrono::NaiveDate::default(); - assert!(values.contains(&min), "min_pivot {min} must be a fixture"); - assert!(values.contains(&max), "max_pivot {max} must be a fixture"); - assert!( - values.contains(&zero), - "zero pivot {zero} must be a fixture" - ); - // Default is 1970-01-01, the documented zero pivot. - assert_eq!( - zero, - chrono::NaiveDate::from_ymd_opt(1970, 1, 1).unwrap(), - "NaiveDate::default() must be 1970-01-01" - ); - } +// `date`'s `ScalarType` wiring is generated from its catalog row by +// `temporal_values!` — the chrono analogue of the integer `int_values!` path. +// Values can't be a `const` slice (`from_ymd_opt` is not `const`), so they live +// in a `LazyLock>` behind `date_values()`. `date_values()` is public so +// the `eql_v2_date` fixture module (emitted by `scalar_types!(fixture_modules)`) +// can hand the slice to `scalar_fixture!`. +temporal_values! { + cell = DATE_VALUES_CELL, + accessor = date_values, + rust_type = chrono::NaiveDate, + spec = eql_scalars::DATE, + variant = Date, + pg_type = "date", + parse = |s| chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d") + .expect("catalog date fixture must be YYYY-MM-DD"), + min_pivot = chrono::NaiveDate::from_ymd_opt(1900, 1, 1).expect("1900-01-01 valid"), + max_pivot = chrono::NaiveDate::from_ymd_opt(2099, 12, 31).expect("2099-12-31 valid"), + sql_lit = |v| format!("'{v}'"), } /// Per-domain capability + payload shape. Storage carries no terms, `Eq` From bd7f3a1c7ba44ac407bdc8ced6af7accdc7bcb32 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 13:27:20 +1000 Subject: [PATCH 096/599] feat(eql-scalars): add is_temporal()/is_eq_only() capability accessors --- crates/eql-scalars/src/lib.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index b5a362c7d..d8d3d7fbb 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -128,6 +128,13 @@ impl ScalarKind { self.as_bounded_int().is_some() } + /// True for chrono-backed temporal kinds (`Date`; `Timestamptz` once added) — + /// the kinds whose test `ScalarType` impl is generated by `temporal_values!` + /// rather than the integer proc-macro path. Replaces the `[temporal]` marker. + pub const fn is_temporal(self) -> bool { + matches!(self, ScalarKind::Date) + } + /// The Rust type name as it appears in generated source (e.g. `"i32"`). pub const fn rust_type(self) -> &'static str { match self { @@ -360,6 +367,14 @@ impl ScalarSpec { pub fn domain_name(&self, domain: &DomainSpec) -> String { format!("{}{}", self.token, domain.suffix) } + + /// True when this type declares no ordered (`_ord`) domain — i.e. equality-only + /// (storage + `_eq`). Replaces the future `[eq_only]` marker: the domain set + /// already carries this. The `_ord_ore` twin only appears alongside `_ord`, so + /// testing `_ord` suffices. + pub fn is_eq_only(&self) -> bool { + !self.domains.iter().any(|d| d.suffix == "_ord") + } } /// Domains shared by every ordered-integer scalar, in manifest file order: @@ -650,6 +665,23 @@ mod rust_tests { } } } + + #[test] + fn is_temporal_classifies_chrono_kinds() { + assert!(ScalarKind::Date.is_temporal()); + assert!(!ScalarKind::I16.is_temporal()); + assert!(!ScalarKind::I32.is_temporal()); + assert!(!ScalarKind::I64.is_temporal()); + // Timestamptz arrives in Phase 5; assert it here once present. + } + + #[test] + fn is_eq_only_detects_absence_of_ord_domains() { + let int4 = CATALOG.iter().find(|s| s.token == "int4").unwrap(); + assert!(!int4.is_eq_only(), "int4 is ordered"); + let date = CATALOG.iter().find(|s| s.token == "date").unwrap(); + assert!(!date.is_eq_only(), "date is ordered"); + } } #[cfg(test)] From 71560ab7a5faf5676fea39f519aa2c8237e6b0c4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 13:28:34 +1000 Subject: [PATCH 097/599] build(eql-tests-macros): depend on eql-scalars catalog --- Cargo.lock | 1 + crates/eql-tests-macros/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index bfecae6ba..20adc3229 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1172,6 +1172,7 @@ version = "0.1.0" name = "eql-tests-macros" version = "0.1.0" dependencies = [ + "eql-scalars", "proc-macro2", "quote", "syn 2.0.108", diff --git a/crates/eql-tests-macros/Cargo.toml b/crates/eql-tests-macros/Cargo.toml index 8c352a9ae..cc92e04c2 100644 --- a/crates/eql-tests-macros/Cargo.toml +++ b/crates/eql-tests-macros/Cargo.toml @@ -11,3 +11,4 @@ proc-macro = true syn = { version = "2", features = ["full"] } quote = "1" proc-macro2 = "1" +eql-scalars = { path = "../eql-scalars" } From 7cc73af3907e2746d44c86c72d3f5a9f62a4eb9a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 13:31:23 +1000 Subject: [PATCH 098/599] refactor(eql-tests-macros): derive temporal/eq_only from catalog, drop [temporal] marker --- crates/eql-tests-macros/src/lib.rs | 200 ++++++++--------------------- 1 file changed, 53 insertions(+), 147 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index e252bca03..504dbf03c 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -32,74 +32,19 @@ use proc_macro2::TokenStream as TokenStream2; use quote::{format_ident, quote}; use syn::parse::{Parse, ParseStream}; use syn::punctuated::Punctuated; -use syn::{bracketed, Ident, Token, Type}; +use syn::{Ident, Token, Type}; -/// One `token => rust_type` entry, with an optional trailing `[temporal]` flag. +/// One `token => rust_type` entry. The type's *shape* (temporal vs integer, +/// equality-only vs ordered) is **not** declared here — it is read from the +/// `eql-scalars::CATALOG` row for `token` via [`is_temporal_token`] / +/// [`is_eq_only_token`]. The catalog is the single source of truth; this list +/// only maps a token to the Rust plaintext type the harness compiles against. struct ScalarEntry { /// Postgres type token (`int4`); also the fixture/domain suffix and the - /// matrix `suite` ident. + /// matrix `suite` ident. Must name a row in `eql-scalars::CATALOG`. token: Ident, /// Rust plaintext type (`i32`). rust_type: Type, - /// Whether this entry is a **temporal** (chrono-backed) scalar rather than a - /// fixed-width integer. Declared explicitly via a trailing `[temporal]` - /// marker in the dispatch list (`date => chrono::NaiveDate [temporal]`) - /// rather than sniffed from the Rust type path — so a temporal type that - /// isn't chrono-spelled, or a non-temporal type whose path happens to - /// contain `DateTime`, cannot be misclassified. - temporal: bool, -} - -/// The recognised optional entry markers, written in `[brackets]` after the -/// rust type (`date => chrono::NaiveDate [temporal]`). `temporal` is the only -/// one today; a new marker is added here so the accepted set stays a single -/// source of truth — `parse_optional_marker` validates against this slice and -/// the rejection message lists it verbatim. -const SUPPORTED_MARKERS: &[&str] = &["temporal"]; - -/// Parse the optional trailing `[marker]` on a scalar entry, returning whether -/// the `temporal` marker was present. -/// -/// Absent brackets → `false` (an ordinary integer scalar). When brackets are -/// present they must hold exactly one recognised identifier: an unknown marker -/// (`[temporial]`), empty brackets (`[]`), or trailing junk (`[temporal foo]`) -/// are all hard parse errors. The whole point of the explicit marker is that a -/// typo fails loudly rather than silently defaulting an entry to integer, so -/// the parse is strict on every malformed shape, not just unknown names. -fn parse_optional_marker(input: ParseStream) -> syn::Result { - if !input.peek(syn::token::Bracket) { - return Ok(false); - } - let content; - bracketed!(content in input); - - let marker: Ident = content.parse()?; - // Reject anything after the single marker ident (`[temporal foo]`, - // `[temporal, bar]`) — otherwise `bracketed!` would silently drop it. - if !content.is_empty() { - let rest: TokenStream2 = content.parse()?; - return Err(syn::Error::new_spanned( - rest, - "expected a single marker identifier, e.g. `[temporal]`", - )); - } - - let name = marker.to_string(); - if !SUPPORTED_MARKERS.contains(&name.as_str()) { - let supported = SUPPORTED_MARKERS - .iter() - .map(|m| format!("`{m}`")) - .collect::>() - .join(", "); - return Err(syn::Error::new( - marker.span(), - format!("unknown scalar marker `{name}`; supported markers: {supported}"), - )); - } - - // Only `temporal` flips the temporal flag; a future non-temporal marker - // would pass validation above but leave this `false`. - Ok(name == "temporal") } impl Parse for ScalarEntry { @@ -107,29 +52,31 @@ impl Parse for ScalarEntry { let token: Ident = input.parse()?; input.parse::]>()?; let rust_type: Type = input.parse()?; - let temporal = parse_optional_marker(input)?; - Ok(ScalarEntry { - token, - rust_type, - temporal, - }) + Ok(ScalarEntry { token, rust_type }) } } -impl ScalarEntry { - /// Whether this entry is a **temporal** (chrono-backed) scalar rather than a - /// fixed-width integer, as declared by the `[temporal]` marker. It drives - /// two divergences: - /// - /// 1. The `impl ScalarType` for a temporal scalar is **hand-written** in - /// `scalar_domains.rs` (chrono values can't be a `const` slice and the - /// pivots are explicit sentinels), so `emit_scalar_type_impls` skips it. - /// 2. The integer-only fixture asserts (`::MIN`, `contains(&0)`, - /// `any(|v| v < 0)`) don't typecheck for a date, so `scalar_fixture!` - /// stamps a temporal (pivot-presence) variant instead. - fn is_temporal(&self) -> bool { - self.temporal - } +/// The `eql-scalars::CATALOG` row for `token`, or a hard panic at macro-expansion +/// time if the token is unknown — a dispatch-list entry must name a catalog type. +fn spec_for_token(token: &str) -> &'static eql_scalars::ScalarSpec { + eql_scalars::CATALOG + .iter() + .find(|s| s.token == token) + .unwrap_or_else(|| panic!("scalar token `{token}` not in eql-scalars::CATALOG")) +} + +/// True when `token`'s catalog kind is temporal (chrono-backed). Replaces the +/// `[temporal]` marker: temporal scalars hand off their `impl ScalarType` to +/// `temporal_values!` (so `emit_scalar_type_impls` skips them) and stamp the +/// `temporal` fixture variant. +fn is_temporal_token(token: &str) -> bool { + spec_for_token(token).kind.is_temporal() +} + +/// True when `token`'s catalog row declares no ordered domain — equality-only. +/// Replaces the `[eq_only]` marker. +fn is_eq_only_token(token: &str) -> bool { + spec_for_token(token).is_eq_only() } /// The comma-separated list (optional trailing comma). @@ -158,9 +105,13 @@ fn values_const_ident(token: &Ident) -> Ident { /// Emit one `impl ScalarType for ` per entry. See /// [`emit_scalar_type_impls`]. fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { - // Temporal scalars hand-write their `impl ScalarType` (see `is_temporal`); - // only integer scalars get a macro-generated impl. - let impls = list.entries.iter().filter(|e| !e.is_temporal()).map(|e| { + // Temporal scalars hand off their `impl ScalarType` to `temporal_values!` + // (catalog-driven); only integer scalars get a macro-generated impl here. + let impls = list + .entries + .iter() + .filter(|e| !is_temporal_token(&e.token.to_string())) + .map(|e| { let token_str = e.token.to_string(); let rust_type = &e.rust_type; let values = values_const_ident(&e.token); @@ -198,7 +149,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { let rust_type = &e.rust_type; let mod_ident = format_ident!("eql_v2_{}", e.token); let fixture_name = format!("eql_v2_{}", token_str); - if e.is_temporal() { + if is_temporal_token(&e.token.to_string()) { // Temporal scalars have no `eql_scalars::_VALUES` const (chrono // is not `const`-friendly). The values come from the harness // accessor (`_values()`), and the fixture stamps the @@ -386,10 +337,10 @@ mod tests { #[test] fn temporal_entry_skips_impl_and_stamps_temporal_fixture() { + // No marker: `date`'s temporal shape is read from eql-scalars::CATALOG. let list = - syn::parse_str::("int4 => i32, date => chrono::NaiveDate [temporal],") - .unwrap(); - // Impl emitter skips the temporal entry (hand-written impl). + syn::parse_str::("int4 => i32, date => chrono::NaiveDate").unwrap(); + // Impl emitter skips the temporal entry (handed to `temporal_values!`). let impls = norm(&scalar_type_impls_tokens(&list)); assert!(impls.contains("impl ScalarType for i32")); assert!(!impls.contains("NaiveDate")); @@ -406,74 +357,29 @@ mod tests { assert!(dispatch.contains(r#""date" =>"#)); } - /// Parse a single entry, asserting it parses, and return whether it is - /// temporal. Keeps the per-shape assertions below to one line each. - fn parse_entry_is_temporal(src: &str) -> bool { - syn::parse_str::(src) - .unwrap_or_else(|e| panic!("`{src}` should parse: {e}")) - .is_temporal() - } - - /// Parse a single entry expecting a parse error, returning the message. - fn parse_entry_err(src: &str) -> String { - match syn::parse_str::(src) { - Ok(_) => panic!("`{src}` should have failed to parse"), - Err(e) => e.to_string(), - } - } - - #[test] - fn no_marker_is_integer() { - // No brackets → integer, even when the type path mentions chrono: - // temporal-ness is declared, never inferred from the rust type. - assert!(!parse_entry_is_temporal("int4 => i32")); - assert!(!parse_entry_is_temporal("date => chrono::NaiveDate")); - } - #[test] - fn temporal_marker_sets_the_flag() { - assert!(parse_entry_is_temporal( - "date => chrono::NaiveDate [temporal]" - )); - // Marker binds to its own entry, not the next one, across a list. - let list = - syn::parse_str::("date => chrono::NaiveDate [temporal], int4 => i32,") - .unwrap(); - assert!(list.entries[0].is_temporal()); - assert!(!list.entries[1].is_temporal()); + fn entry_parses_without_markers() { + let list = syn::parse_str::("int4 => i32, date => chrono::NaiveDate") + .expect("bare token => rust_type must parse"); + assert_eq!(list.entries.len(), 2); } #[test] - fn unknown_marker_errors_and_lists_the_supported_set() { - let msg = parse_entry_err("date => chrono::NaiveDate [temporial]"); - // Names the offending marker and the supported set, so the message is - // actionable rather than just "parse error". - assert!(msg.contains("unknown scalar marker"), "got: {msg}"); - assert!( - msg.contains("temporial"), - "should name the bad marker: {msg}" - ); - assert!( - msg.contains("`temporal`"), - "should list supported markers: {msg}" - ); + fn temporal_is_read_from_catalog_not_a_marker() { + assert!(!is_temporal_token("int4")); + assert!(is_temporal_token("date")); } #[test] - fn empty_marker_brackets_error() { - // `[]` has no marker ident to parse — a malformed entry, not a no-op. - let msg = parse_entry_err("date => chrono::NaiveDate []"); - assert!(!msg.is_empty()); + fn eq_only_is_read_from_catalog_not_a_marker() { + assert!(!is_eq_only_token("int4")); + assert!(!is_eq_only_token("date")); } #[test] - fn trailing_junk_in_marker_brackets_errors() { - // Regression guard: `[temporal foo]` / `[temporal, bar]` must NOT be - // silently accepted as `temporal` with the extra tokens dropped. - let msg = parse_entry_err("date => chrono::NaiveDate [temporal foo]"); - assert!(msg.contains("single marker identifier"), "got: {msg}"); - let msg = parse_entry_err("date => chrono::NaiveDate [temporal, bar]"); - assert!(msg.contains("single marker identifier"), "got: {msg}"); + #[should_panic(expected = "not in eql-scalars::CATALOG")] + fn unknown_token_fails_loudly() { + is_temporal_token("nonesuch"); } #[test] From c8198089da1a5e36285cdf2d31c3eac15c4bce76 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 15:57:10 +1000 Subject: [PATCH 099/599] test(scalars): drop [temporal] marker from dispatch list (catalog-derived) --- tests/sqlx/src/scalar_types.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 6747900a6..45173d052 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -4,11 +4,13 @@ //! To add a scalar encrypted-domain type to the SQLx matrix, add one //! `token => rust_type` line below (plus the catalog row in `eql-scalars` and //! the `EqlPlaintext` impl, owned separately — see -//! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). A temporal -//! (chrono-backed) scalar adds a trailing `[temporal]` marker -//! (`date => chrono::NaiveDate [temporal]`): it hand-writes its `impl -//! ScalarType` in `scalar_domains.rs` and gets pivot-presence fixture asserts -//! instead of the integer signed-extreme ones. +//! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). The entry +//! carries no shape marker: whether a type is temporal (chrono-backed) or +//! equality-only is read from its `eql-scalars::CATALOG` row +//! (`ScalarKind::is_temporal()` / `ScalarSpec::is_eq_only()`). A temporal +//! scalar generates its `impl ScalarType` via `temporal_values!` in +//! `scalar_domains.rs` and gets pivot-presence fixture asserts instead of the +//! integer signed-extreme ones. //! //! The harness pieces live in three separate compilation contexts (the //! `eql-tests` lib, the `encrypted_domain` integration-test binary, and the @@ -52,7 +54,7 @@ macro_rules! scalar_types { int4 => i32, int2 => i16, int8 => i64, - date => chrono::NaiveDate [temporal], + date => chrono::NaiveDate, } }; } From 41fb309d6c5e62361bb8711e171ad39a25bcce38 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 16:21:29 +1000 Subject: [PATCH 100/599] feat(eql-tests-macros): guard ordered matrix against eq-only types via is_eq_only_token The ordered_numeric_matrix! suite exercises /min/max; an equality-only scalar (no _ord domain in eql-scalars::CATALOG) does not support those. Route the matrix emitter through matrix_suite_for_entry, which reads eq-only-ness from the catalog (is_eq_only_token) and emits a compile_error! for an eq-only token instead of silently generating ordering tests it cannot pass. Makes the catalog-derived is_eq_only accessor load-bearing and leaves a clean seam for an equality-only matrix path. Both arms unit-tested. --- crates/eql-tests-macros/src/lib.rs | 74 +++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 504dbf03c..43dada557 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -74,7 +74,9 @@ fn is_temporal_token(token: &str) -> bool { } /// True when `token`'s catalog row declares no ordered domain — equality-only. -/// Replaces the `[eq_only]` marker. +/// Replaces the `[eq_only]` marker. Consumed by [`matrix_suite_for_entry`] to +/// keep an eq-only type out of the ordered matrix (which exercises ordering +/// operators it does not support). fn is_eq_only_token(token: &str) -> bool { spec_for_token(token).is_eq_only() } @@ -206,24 +208,42 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { } } +/// Build the matrix suite for one entry. Ordered types get the +/// `ordered_numeric_matrix!` suite (`=`/`<>`/`<`/`>`/`min`/`max`). An eq-only +/// type has no `_ord` domain, so the ordered matrix would exercise ordering +/// operators the type does not support — emit a `compile_error!` directing the +/// author to wire an equality-only matrix instead. The shape is read from the +/// catalog (`eq_only` = [`is_eq_only_token`]), not a marker; `eq_only` is passed +/// in so this stays a pure function of its inputs and both arms are unit-testable +/// without an eq-only row in the live catalog. +fn matrix_suite_for_entry(token: &Ident, rust_type: &Type, eq_only: bool) -> TokenStream2 { + let token_str = token.to_string(); + if eq_only { + let msg = format!( + "scalar `{token_str}` is equality-only (no `_ord` domain in eql-scalars::CATALOG); \ + the ordered matrix exercises ordering operators it does not support. \ + Wire an equality-only matrix for it instead of routing it through the ordered suite." + ); + return quote! { compile_error!(#msg); }; + } + let eql_type = format!("eql_v2_{}", token_str); + quote! { + #[doc = concat!("`eql_v2_", #token_str, "` matrix suite — generated by `scalar_types!`.")] + pub mod #token { + ::eql_tests::ordered_numeric_matrix! { + suite = #token, + scalar = #rust_type, + eql_type = #eql_type, + } + } + } +} + /// Emit one `pub mod { ordered_numeric_matrix! { ... } }` per entry. -/// See [`emit_scalar_matrix_suites`]. +/// See [`emit_scalar_matrix_suites`] and [`matrix_suite_for_entry`]. fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { let mods = list.entries.iter().map(|e| { - let token = &e.token; - let token_str = e.token.to_string(); - let rust_type = &e.rust_type; - let eql_type = format!("eql_v2_{}", token_str); - quote! { - #[doc = concat!("`eql_v2_", #token_str, "` matrix suite — generated by `scalar_types!`.")] - pub mod #token { - ::eql_tests::ordered_numeric_matrix! { - suite = #token, - scalar = #rust_type, - eql_type = #eql_type, - } - } - } + matrix_suite_for_entry(&e.token, &e.rust_type, is_eq_only_token(&e.token.to_string())) }); quote! { #(#mods)* } } @@ -376,6 +396,28 @@ mod tests { assert!(!is_eq_only_token("date")); } + #[test] + fn ordered_entry_emits_ordered_matrix_suite() { + let token: Ident = syn::parse_str("int4").unwrap(); + let rust_type: Type = syn::parse_str("i32").unwrap(); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, false)); + assert!(out.contains(":: eql_tests :: ordered_numeric_matrix !")); + assert!(out.contains("suite = int4")); + assert!(!out.contains("compile_error")); + } + + #[test] + fn eq_only_entry_emits_compile_error_not_ordered_matrix() { + // No eq-only row exists in the live catalog yet, so pass the shape + // directly: an eq-only token must never reach the ordered matrix. + let token: Ident = syn::parse_str("timestamptz").unwrap(); + let rust_type: Type = syn::parse_str("chrono::DateTime").unwrap(); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, true)); + assert!(out.contains("compile_error !")); + assert!(out.contains("equality-only")); + assert!(!out.contains("ordered_numeric_matrix")); + } + #[test] #[should_panic(expected = "not in eql-scalars::CATALOG")] fn unknown_token_fails_loudly() { From 17f516d353dd7569492a3fe2cd3978bb39280a1b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 16:44:41 +1000 Subject: [PATCH 101/599] style(eql-tests-macros): apply rustfmt to scalar matrix emitters --- crates/eql-tests-macros/src/lib.rs | 57 ++++++++++++++++-------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 43dada557..74dfe11ca 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -114,32 +114,32 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { .iter() .filter(|e| !is_temporal_token(&e.token.to_string())) .map(|e| { - let token_str = e.token.to_string(); - let rust_type = &e.rust_type; - let values = values_const_ident(&e.token); - quote! { - impl ScalarType for #rust_type { - const PG_TYPE: &'static str = #token_str; - - /// The catalog `eql_scalars::*_VALUES` list — the same values - /// the fixture generator encrypts, so the oracle can't drift - /// from the fixture. - fn fixture_values() -> &'static [#rust_type] { - ::eql_scalars::#values - } - - /// Integer scalars pivot on their inherent `MIN`/`MAX` consts; - /// the fixture lists include both (`fixtures!(int …; Min, …, Max)`). - fn min_pivot() -> #rust_type { - <#rust_type>::MIN - } - - fn max_pivot() -> #rust_type { - <#rust_type>::MAX + let token_str = e.token.to_string(); + let rust_type = &e.rust_type; + let values = values_const_ident(&e.token); + quote! { + impl ScalarType for #rust_type { + const PG_TYPE: &'static str = #token_str; + + /// The catalog `eql_scalars::*_VALUES` list — the same values + /// the fixture generator encrypts, so the oracle can't drift + /// from the fixture. + fn fixture_values() -> &'static [#rust_type] { + ::eql_scalars::#values + } + + /// Integer scalars pivot on their inherent `MIN`/`MAX` consts; + /// the fixture lists include both (`fixtures!(int …; Min, …, Max)`). + fn min_pivot() -> #rust_type { + <#rust_type>::MIN + } + + fn max_pivot() -> #rust_type { + <#rust_type>::MAX + } } } - } - }); + }); quote! { #(#impls)* } } @@ -243,7 +243,11 @@ fn matrix_suite_for_entry(token: &Ident, rust_type: &Type, eq_only: bool) -> Tok /// See [`emit_scalar_matrix_suites`] and [`matrix_suite_for_entry`]. fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { let mods = list.entries.iter().map(|e| { - matrix_suite_for_entry(&e.token, &e.rust_type, is_eq_only_token(&e.token.to_string())) + matrix_suite_for_entry( + &e.token, + &e.rust_type, + is_eq_only_token(&e.token.to_string()), + ) }); quote! { #(#mods)* } } @@ -358,8 +362,7 @@ mod tests { #[test] fn temporal_entry_skips_impl_and_stamps_temporal_fixture() { // No marker: `date`'s temporal shape is read from eql-scalars::CATALOG. - let list = - syn::parse_str::("int4 => i32, date => chrono::NaiveDate").unwrap(); + let list = syn::parse_str::("int4 => i32, date => chrono::NaiveDate").unwrap(); // Impl emitter skips the temporal entry (handed to `temporal_values!`). let impls = norm(&scalar_type_impls_tokens(&list)); assert!(impls.contains("impl ScalarType for i32")); From 1354c464503d907fb9e6faadda567a39952a2229 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 17:52:00 +1000 Subject: [PATCH 102/599] test(scalars): add unified scalar_matrix! wrapper (caps = [eq] | [eq, ord]) Single entry point selected by a capability marker, replacing the two parallel wrappers. caps = [eq, ord] is the ordered-numeric body (verbatim from ordered_numeric_matrix!); caps = [eq] is the equality-only body with pivots derived from the ScalarType impl (min/max/Default), matching the proven timestamptz-era eq-only form so the eq-only name set stays a clean subset of the ordered snapshot. Old wrappers still present; removed next. --- tests/sqlx/src/matrix.rs | 129 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 2fdb9e5b0..b22dfa4b6 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -269,8 +269,133 @@ macro_rules! eq_only_scalar_matrix { }; } -/// Low-level entry point. Use `ordered_numeric_matrix!` instead unless -/// your type's surface deviates from the standard ordered-numeric shape. +/// Unified convention wrapper for scalar encrypted-domain suites. Replaces the +/// two parallel wrappers (`ordered_numeric_matrix!` + `eq_only_scalar_matrix!`) +/// with one entry point selected by a `caps` capability marker: +/// +/// - `caps = [eq, ord]` — the ordered-numeric shape (all four variants; +/// `=`/`<>`/`<`/`<=`/`>`/`>=`; ORDER BY / ORDER BY USING; ORE injectivity; +/// the ordered functional index). Consumers: `int2`/`int4`/`int8`/`date`. +/// - `caps = [eq]` — equality-only (storage + `_eq` only; `=`/`<>` meaningful, +/// the four ord operators are deliberate blockers). The empty `ord_domains` +/// make the order-by / ORE arms emit zero tests. First consumer: +/// `timestamptz`. +/// +/// Both arms take the identical `(suite, scalar, eql_type)` signature and derive +/// the three comparison pivots from the `ScalarType` impl +/// (`min_pivot()`/`max_pivot()`/`Default`), so the invocation shape is the same +/// regardless of capability — only the `caps` marker differs. The emitted test +/// names for an ordered type are byte-identical to the old +/// `ordered_numeric_matrix!`; the eq-only name set is exactly that set minus the +/// `_ord` / `order_by` / `routes_through_ob` lines. +#[macro_export] +macro_rules! scalar_matrix { + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal, + caps = [eq, ord] $(,)? + ) => { + $crate::scalar_domain_matrix! { + suite = $suite, + scalar = $scalar, + eql_type = $eql_type, + // Relative to the suite source file at + // tests/sqlx/tests/encrypted_domain/scalars/.rs; sqlx's + // include_str! resolves it against that file. Every scalar + // suite lives at this depth, so the path is fixed here rather + // than repeated per invocation. + fixture_path = "../../../fixtures", + all_domains = [(storage, Storage), (eq, Eq), (ord, Ord), (ord_ore, OrdOre)], + eq_domains = [(eq, Eq), (ord, Ord), (ord_ore, OrdOre)], + ord_domains = [(ord, Ord), (ord_ore, OrdOre)], + ord_ore_domains = [(ord_ore, OrdOre)], + pivots = [ + (min, <$scalar as $crate::scalar_domains::ScalarType>::min_pivot()), + (max, <$scalar as $crate::scalar_domains::ScalarType>::max_pivot()), + (zero, <$scalar as ::core::default::Default>::default()), + ], + eq_ops = [(eq, "="), (neq, "<>")], + ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + index_combos = [ + (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), + (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), + (ord, Ord, "eql_v3.ord_term", "btree", + [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), + (ord_ore, OrdOre, "eql_v3.ord_term", "btree", + [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), + ], + blocker_combos = [ + (storage, Storage, [ + (eq, "="), (neq, "<>"), + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + (eq, Eq, [ + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + (ord, Ord, [(contains, "@>"), (contained_by, "<@")]), + (ord_ore, OrdOre, [(contains, "@>"), (contained_by, "<@")]), + ], + // Always-on cost-preference proof (#239 thread 17): the recommended + // converged ordered domain, ord_term btree. One curated combo keeps + // PR CI cost bounded. + scale_default_combos = [ + (ord, Ord, "eql_v3.ord_term", "btree"), + ], + } + }; + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal, + caps = [eq] $(,)? + ) => { + $crate::scalar_domain_matrix! { + suite = $suite, + scalar = $scalar, + eql_type = $eql_type, + // Fixed path; see the `caps = [eq, ord]` arm for the rationale. + fixture_path = "../../../fixtures", + all_domains = [(storage, Storage), (eq, Eq)], + eq_domains = [(eq, Eq)], + ord_domains = [], + ord_ore_domains = [], + // Pivots derived from the scalar type exactly like the ordered arm + // (`min_pivot()`/`max_pivot()`/`Default`), so the equality + // correctness / cross-shape arms sweep the same three anchors and + // the eq-only name set stays a clean subset of the ordered one. + pivots = [ + (min, <$scalar as $crate::scalar_domains::ScalarType>::min_pivot()), + (max, <$scalar as $crate::scalar_domains::ScalarType>::max_pivot()), + (zero, <$scalar as ::core::default::Default>::default()), + ], + eq_ops = [(eq, "="), (neq, "<>")], + ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + index_combos = [ + (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), + (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), + ], + blocker_combos = [ + (storage, Storage, [ + (eq, "="), (neq, "<>"), + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + (eq, Eq, [ + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + ], + // Equality-only scalars have no ordered functional index to prefer. + scale_default_combos = [], + } + }; +} + +/// Low-level entry point. Use `scalar_matrix!` instead unless +/// your type's surface deviates from the standard scalar shapes. #[macro_export] macro_rules! scalar_domain_matrix { ( From a7b20a80eed3ff7e2e8623e355975ee05cbbe5dc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 18:41:03 +1000 Subject: [PATCH 103/599] test(scalars): emit unified scalar_matrix!; remove the two parallel wrappers The matrix-suite emitter now routes every type through scalar_matrix! with a caps marker derived from the catalog (is_eq_only_token): ordered types get caps = [eq, ord], equality-only types caps = [eq]. This replaces the prior ordered-only emission + eq-only compile_error! seam with a real eq-only path, and deletes ordered_numeric_matrix! / eq_only_scalar_matrix! from matrix.rs. Generated test names are byte-identical (inventory OK, 4 types match the canonical snapshot) and the scalar matrix is green at the baseline (844 passed, 0 failed). release/*.sql unchanged. Doc comments naming the old wrappers updated to scalar_matrix!. --- crates/eql-tests-macros/src/lib.rs | 70 ++++---- tests/sqlx/src/matrix.rs | 151 ++---------------- tests/sqlx/src/scalar_domains.rs | 2 +- tests/sqlx/src/scalar_types.rs | 2 +- .../tests/encrypted_domain/scalars/mod.rs | 2 +- 5 files changed, 56 insertions(+), 171 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 74dfe11ca..01b1d1e79 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -208,38 +208,37 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { } } -/// Build the matrix suite for one entry. Ordered types get the -/// `ordered_numeric_matrix!` suite (`=`/`<>`/`<`/`>`/`min`/`max`). An eq-only -/// type has no `_ord` domain, so the ordered matrix would exercise ordering -/// operators the type does not support — emit a `compile_error!` directing the -/// author to wire an equality-only matrix instead. The shape is read from the -/// catalog (`eq_only` = [`is_eq_only_token`]), not a marker; `eq_only` is passed -/// in so this stays a pure function of its inputs and both arms are unit-testable -/// without an eq-only row in the live catalog. +/// Build the matrix suite for one entry. Both shapes route through the unified +/// `scalar_matrix!` wrapper, selected by a `caps` capability marker derived from +/// the catalog (`eq_only` = [`is_eq_only_token`]): an ordered type emits +/// `caps = [eq, ord]` (`=`/`<>`/`<`/`>`/`min`/`max`); an equality-only type (no +/// `_ord` domain) emits `caps = [eq]`, whose empty `ord_domains` make the +/// ordering arms emit zero tests rather than exercising operators the type does +/// not support. `eq_only` is passed in so this stays a pure function of its +/// inputs and both arms are unit-testable without an eq-only row in the live +/// catalog. fn matrix_suite_for_entry(token: &Ident, rust_type: &Type, eq_only: bool) -> TokenStream2 { let token_str = token.to_string(); - if eq_only { - let msg = format!( - "scalar `{token_str}` is equality-only (no `_ord` domain in eql-scalars::CATALOG); \ - the ordered matrix exercises ordering operators it does not support. \ - Wire an equality-only matrix for it instead of routing it through the ordered suite." - ); - return quote! { compile_error!(#msg); }; - } let eql_type = format!("eql_v2_{}", token_str); + let caps = if eq_only { + quote! { caps = [eq] } + } else { + quote! { caps = [eq, ord] } + }; quote! { #[doc = concat!("`eql_v2_", #token_str, "` matrix suite — generated by `scalar_types!`.")] pub mod #token { - ::eql_tests::ordered_numeric_matrix! { + ::eql_tests::scalar_matrix! { suite = #token, scalar = #rust_type, eql_type = #eql_type, + #caps } } } } -/// Emit one `pub mod { ordered_numeric_matrix! { ... } }` per entry. +/// Emit one `pub mod { scalar_matrix! { ... } }` per entry. /// See [`emit_scalar_matrix_suites`] and [`matrix_suite_for_entry`]. fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { let mods = list.entries.iter().map(|e| { @@ -292,7 +291,7 @@ pub fn emit_fixture_dispatch(input: TokenStream) -> TokenStream { fixture_dispatch_tokens(&list).into() } -/// Emit one `pub mod { ordered_numeric_matrix! { ... } }` per entry. +/// Emit one `pub mod { scalar_matrix! { ... } }` per entry. /// /// Invoked via `scalar_types!` in /// `tests/sqlx/tests/encrypted_domain/scalars/mod.rs`, so the matrix suites land @@ -400,25 +399,27 @@ mod tests { } #[test] - fn ordered_entry_emits_ordered_matrix_suite() { + fn ordered_entry_emits_scalar_matrix_with_eq_ord_caps() { let token: Ident = syn::parse_str("int4").unwrap(); let rust_type: Type = syn::parse_str("i32").unwrap(); let out = norm(&matrix_suite_for_entry(&token, &rust_type, false)); - assert!(out.contains(":: eql_tests :: ordered_numeric_matrix !")); + assert!(out.contains(":: eql_tests :: scalar_matrix !")); + assert!(out.contains("caps = [eq , ord]")); assert!(out.contains("suite = int4")); - assert!(!out.contains("compile_error")); } #[test] - fn eq_only_entry_emits_compile_error_not_ordered_matrix() { + fn eq_only_entry_emits_scalar_matrix_with_eq_caps_only() { // No eq-only row exists in the live catalog yet, so pass the shape - // directly: an eq-only token must never reach the ordered matrix. + // directly: an eq-only token routes to the `caps = [eq]` arm (empty + // ord_domains), never the ordered `caps = [eq, ord]` arm. let token: Ident = syn::parse_str("timestamptz").unwrap(); let rust_type: Type = syn::parse_str("chrono::DateTime").unwrap(); let out = norm(&matrix_suite_for_entry(&token, &rust_type, true)); - assert!(out.contains("compile_error !")); - assert!(out.contains("equality-only")); - assert!(!out.contains("ordered_numeric_matrix")); + assert!(out.contains(":: eql_tests :: scalar_matrix !")); + assert!(out.contains("caps = [eq]")); + assert!(!out.contains("caps = [eq , ord]")); + assert!(!out.contains("compile_error")); } #[test] @@ -444,7 +445,7 @@ mod tests { let out = norm(&scalar_matrix_suites_tokens(&sample())); assert!(out.contains("pub mod int4")); assert!(out.contains("pub mod int8")); - assert!(out.contains(":: eql_tests :: ordered_numeric_matrix !")); + assert!(out.contains(":: eql_tests :: scalar_matrix !")); // suite/scalar/eql_type must match the old per-type files so test names // (and the snapshot) are unchanged. assert!(out.contains("suite = int4")); @@ -454,4 +455,17 @@ mod tests { assert!(out.contains("scalar = i64")); assert!(out.contains(r#"eql_type = "eql_v2_int8""#)); } + + #[test] + fn matrix_suites_emit_unified_macro_with_caps() { + // Both base types are ordered, so the emitter routes them through the + // unified wrapper with the ordered capability marker and never names + // either of the now-deleted parallel wrappers. + let list = syn::parse_str::("int4 => i32, date => chrono::NaiveDate").unwrap(); + let out = norm(&scalar_matrix_suites_tokens(&list)); + assert!(out.contains(":: eql_tests :: scalar_matrix !")); + assert!(out.contains("caps = [eq , ord]")); + assert!(!out.contains("ordered_numeric_matrix")); + assert!(!out.contains("eq_only_scalar_matrix")); + } } diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index b22dfa4b6..9b79103be 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -2,17 +2,20 @@ //! //! Two entry points: //! -//! - **`ordered_numeric_matrix!`** — the recommended wrapper. For an -//! ordered numeric scalar (i32, i64, f64, date, numeric, timestamp, -//! ...) all four variants are present, the operator surface is -//! identical, and the only inputs that change per type are the scalar -//! itself, the suite token (used to derive domain + test names), the -//! EQL type name (the fixture `scripts(...)` ref), and the pivot -//! values. Invocation is ~5 lines. +//! - **`scalar_matrix!`** — the recommended wrapper. One invocation per type +//! (~5 lines), with a `caps` capability marker selecting the shape: +//! `caps = [eq, ord]` for an ordered scalar (i32, i64, date, ...) where all +//! four variants are present and the full `=`/`<>`/`<`/`>`/`min`/`max` +//! surface applies; `caps = [eq]` for an equality-only scalar (timestamptz, +//! bool, ...) where only storage + `_eq` materialise and the ord operators +//! are blockers. The only other inputs that change per type are the scalar +//! itself, the suite token (used to derive domain + test names), and the EQL +//! type name (the fixture `scripts(...)` ref); pivots are derived from the +//! `ScalarType` impl. //! //! - **`scalar_domain_matrix!`** — the lower-level macro the wrapper //! expands to. Use directly only for types with a non-standard surface -//! (e.g. equality-only scalars like bool). +//! that neither `caps` shape covers. //! //! Each invocation emits one `#[sqlx::test]` per (category, domain, //! operator, pivot) tuple. Categories: sanity, correctness, cross-shape, @@ -137,138 +140,6 @@ fn collect_index_scan_nodes(value: &serde_json::Value, found: &mut Vec<(String, } } -/// Convention wrapper for ordered numeric scalars. Expands to a -/// `scalar_domain_matrix!` invocation with the standard 4 variants, 6 -/// supported comparison operators, 2 path operators, and the standard -/// blocker / index partitions. -/// -/// `eql_type` is the fixture/table name (e.g. `"eql_v2_int4"`), used as the -/// SQLx fixture `scripts(...)` ref — sqlx parses it as a token-level string -/// literal, so it must be a literal, not derived. It is NOT a domain type -/// name: the `eql_v3.*` domains exercised here are derived from the scalar -/// type (see `scalar_domains.rs`, `format!("eql_v3.{}…", T::PG_TYPE)`). -/// -/// Pivots — the comparison anchors swept by the correctness / cross-shape -/// arms — are derived from the scalar type: `min_pivot()`, `max_pivot()`, and -/// zero (`Default::default()`). Integer scalars resolve `min_pivot`/`max_pivot` -/// to `Self::MIN`/`Self::MAX`; temporal scalars use explicit sentinel dates. The -/// fixture must contain those three plaintext rows, since each pivot's -/// ciphertext is fetched at test time via `fetch_fixture_payload`. -#[macro_export] -macro_rules! ordered_numeric_matrix { - ( - suite = $suite:ident, - scalar = $scalar:ty, - eql_type = $eql_type:literal $(,)? - ) => { - $crate::scalar_domain_matrix! { - suite = $suite, - scalar = $scalar, - eql_type = $eql_type, - // Relative to the suite source file at - // tests/sqlx/tests/encrypted_domain/scalars/.rs; sqlx's - // include_str! resolves it against that file. Every scalar - // suite lives at this depth, so the path is fixed here rather - // than repeated per invocation. - fixture_path = "../../../fixtures", - all_domains = [(storage, Storage), (eq, Eq), (ord, Ord), (ord_ore, OrdOre)], - eq_domains = [(eq, Eq), (ord, Ord), (ord_ore, OrdOre)], - ord_domains = [(ord, Ord), (ord_ore, OrdOre)], - ord_ore_domains = [(ord_ore, OrdOre)], - pivots = [ - (min, <$scalar as $crate::scalar_domains::ScalarType>::min_pivot()), - (max, <$scalar as $crate::scalar_domains::ScalarType>::max_pivot()), - (zero, <$scalar as ::core::default::Default>::default()), - ], - eq_ops = [(eq, "="), (neq, "<>")], - ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], - index_combos = [ - (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), - (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), - (ord, Ord, "eql_v3.ord_term", "btree", - [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), - (ord_ore, OrdOre, "eql_v3.ord_term", "btree", - [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), - ], - blocker_combos = [ - (storage, Storage, [ - (eq, "="), (neq, "<>"), - (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), - (contains, "@>"), (contained_by, "<@"), - ]), - (eq, Eq, [ - (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), - (contains, "@>"), (contained_by, "<@"), - ]), - (ord, Ord, [(contains, "@>"), (contained_by, "<@")]), - (ord_ore, OrdOre, [(contains, "@>"), (contained_by, "<@")]), - ], - // Always-on cost-preference proof (#239 thread 17): the recommended - // converged ordered domain, ord_term btree. One curated combo keeps - // PR CI cost bounded. - scale_default_combos = [ - (ord, Ord, "eql_v3.ord_term", "btree"), - ], - } - }; -} - -/// Convention wrapper for equality-only scalars (no ord variants). Bool -/// is the canonical consumer: `=` / `<>` are meaningful; the four ord -/// operators are deliberate blockers. -/// -/// Expands to `scalar_domain_matrix!` with `ord_domains = []`, -/// `ord_ore_domains = []`, no btree-ord index combo, and blocker_combos -/// covering the ord operators on every materialised variant. Order-by / -/// order-by-using arms emit zero tests because they iterate empty -/// ord_domains. -/// -/// **Status:** this umbrella has no in-tree consumer yet. It exists so -/// that adding `bool` (or any other equality-only scalar) is one -/// `impl ScalarType` + fixture + one-line macro invocation, with no -/// macro authoring required. Runtime validation lands with bool. -#[macro_export] -macro_rules! eq_only_scalar_matrix { - ( - suite = $suite:ident, - scalar = $scalar:ty, - eql_type = $eql_type:literal, - pivots = [$($pivot:tt),+ $(,)?] $(,)? - ) => { - $crate::scalar_domain_matrix! { - suite = $suite, - scalar = $scalar, - eql_type = $eql_type, - // Fixed path; see `ordered_numeric_matrix!` for the rationale. - fixture_path = "../../../fixtures", - all_domains = [(storage, Storage), (eq, Eq)], - eq_domains = [(eq, Eq)], - ord_domains = [], - ord_ore_domains = [], - pivots = [$($pivot),+], - eq_ops = [(eq, "="), (neq, "<>")], - ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], - index_combos = [ - (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), - (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), - ], - blocker_combos = [ - (storage, Storage, [ - (eq, "="), (neq, "<>"), - (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), - (contains, "@>"), (contained_by, "<@"), - ]), - (eq, Eq, [ - (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), - (contains, "@>"), (contained_by, "<@"), - ]), - ], - // Equality-only scalars have no ordered functional index to prefer. - scale_default_combos = [], - } - }; -} - /// Unified convention wrapper for scalar encrypted-domain suites. Replaces the /// two parallel wrappers (`ordered_numeric_matrix!` + `eq_only_scalar_matrix!`) /// with one entry point selected by a `caps` capability marker: diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index a4eabdf2d..5b304a375 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -45,7 +45,7 @@ pub trait ScalarType: /// `LazyLock>` and returns a borrow of it (see `date_values`). /// Integer scalars return their `eql_scalars::_VALUES` const directly. /// - /// For types driven by `ordered_numeric_matrix!`, the values MUST + /// For types driven by `scalar_matrix!`, the values MUST /// include the three pivots (`min_pivot()`, `max_pivot()`, and zero /// `Default::default()`): the matrix uses those as comparison pivots and /// fetches each one's ciphertext via `fetch_fixture_payload`, which fails diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 45173d052..feeca6050 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -22,7 +22,7 @@ //! - `scalar_type_impls` — `scalar_domains.rs` (lib): the `impl ScalarType` block. //! - `fixture_modules` — `fixtures/mod.rs` (lib): the `pub mod eql_v3_` modules. //! - `matrix_suites` — `tests/encrypted_domain/scalars/mod.rs` (test binary): -//! the `ordered_numeric_matrix!` suites. +//! the `scalar_matrix!` suites. //! - `fixture_dispatch` — `tests/generate_all_fixtures.rs` (test binary): the //! `generate_for_token` dispatch fn. //! diff --git a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs index 72c64f879..8995492f3 100644 --- a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs @@ -1,6 +1,6 @@ //! Per-scalar matrix suites, generated by the `scalar_types!(matrix_suites)` //! invocation below — one module per scalar type, each holding its -//! `ordered_numeric_matrix!` suite. +//! `scalar_matrix!` suite. //! //! The modules are generated from the single harness list in //! `tests/sqlx/src/scalar_types.rs` — adding a type there adds its suite here From 0d91d19240f0aa13ccd789099e63298a1755b6eb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 18:59:56 +1000 Subject: [PATCH 104/599] test(matrix): single-snapshot inventory accepts derived eq-only subset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each discovered scalar type now matches EITHER the full canonical snapshot (ordered shape) OR a subset derived from it on the fly — the ordered names minus the ord-only lines (_ord / order_by / routes_through_ob). An equality-only scalar (timestamptz, next) is validated against that derivation, so it needs no second committed snapshot. The per-type shape (ordered/eq_only) is now printed. All four current types are ordered; the eq-only branch is dormant but unit-proven (51-line strict subset of the 211-line baseline). --- mise.toml | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/mise.toml b/mise.toml index 8baafecb1..fadad50bf 100644 --- a/mise.toml +++ b/mise.toml @@ -136,21 +136,26 @@ cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros """ [tasks."test:matrix:inventory"] -description = "Verify the matrix test-name set against the single canonical snapshot, catalog-cross-checked (no database required)" +description = "Verify the matrix test-name set against the single canonical snapshot (or its derived eq-only subset), catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" run = """ #!/usr/bin/env bash # ONE canonical, token-normalized snapshot (snapshots/matrix_tests.txt) pins the -# set of macro-emitted matrix test names. The two per-type snapshots are gone: -# they were byte-identical modulo the type token, so one canonical set plus a -# per-type normalize+compare carries the same signal at 1/N the committed surface. +# set of macro-emitted matrix test names for the ORDERED scalar shape. There is +# no second committed file for the equality-only shape: an eq-only type's name +# set is exactly the ordered set MINUS the ord-only lines, so the inventory +# DERIVES it from the one baseline (ordered minus `_ord`/`order_by`/ +# `routes_through_ob`). Each discovered type must match either the full baseline +# (ordered) or that derived subset (eq-only). This keeps one committed snapshot +# however many ordered/eq-only types exist. # # Steps: # 1. List the encrypted_domain binary ONCE (deterministic; reused below). # 2. Discover the set of scalar types present FROM THE BINARY'S OWN OUTPUT # (scalars:::: prefixes) — never a directory glob. # 3. For each discovered type, normalize its token to and assert its set -# equals the canonical snapshot. Assert at least one type is present. +# equals EITHER the canonical snapshot (ordered) OR the derived eq-only +# subset. Assert at least one type is present. # 4. Completeness cross-check: assert the discovered type set equals # `eql-codegen list-types`. A catalog type added without its matrix wiring # (no scalars:::: tests in the binary) fails here. @@ -170,20 +175,36 @@ discovered=$(printf '%s\\n' "$listing" \ | LC_ALL=C sort -u) [ -n "$discovered" ] || { echo "No scalars:::: tests found in the encrypted_domain binary." >&2; exit 1; } -# Per-type normalize + compare against the canonical snapshot. +# An equality-only type (no `_ord` domain) emits a strict SUBSET of the +# canonical (ordered) snapshot: the same names minus every ord-only line +# (`_ord` / `order_by` / `routes_through_ob`). Derive that subset once here, so +# an equality-only scalar (e.g. timestamptz) needs NO second committed snapshot +# — it is validated against this derivation from the single baseline. +eq_only_expected=$(grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u) + +# Per-type normalize + compare: each type must match EITHER the full canonical +# snapshot (ordered shape) OR the derived eq-only subset (equality-only shape). checked=0 while IFS= read -r t; do [ -n "$t" ] || continue printf '%s\\n' "$listing" | grep "^scalars::${t}::" \ | sed -e "s/^scalars::${t}::/scalars::::/" -e "s/_${t}_/__/g" | LC_ALL=C sort > "/tmp/matrix-norm-${t}.txt" - if ! cmp -s "/tmp/matrix-norm-${t}.txt" snapshots/matrix_tests.txt; then - echo "Matrix test-name set for '${t}' differs from snapshots/matrix_tests.txt:" >&2 + if cmp -s "/tmp/matrix-norm-${t}.txt" snapshots/matrix_tests.txt; then + shape="ordered" + elif [ "$(cat "/tmp/matrix-norm-${t}.txt")" = "$eq_only_expected" ]; then + shape="eq_only" + else + echo "Matrix test-name set for '${t}' matches NEITHER the canonical snapshot nor its derived eq-only subset." >&2 + echo " vs ordered (snapshots/matrix_tests.txt):" >&2 diff snapshots/matrix_tests.txt "/tmp/matrix-norm-${t}.txt" >&2 || true + echo " vs derived eq-only (ordered minus _ord/order_by/routes_through_ob):" >&2 + diff <(printf '%s\\n' "$eq_only_expected") "/tmp/matrix-norm-${t}.txt" >&2 || true exit 1 fi + echo " ${t}: ${shape}" checked=$((checked + 1)) done <<< "$discovered" -[ "$checked" -gt 0 ] || { echo "No scalar type matched the canonical snapshot." >&2; exit 1; } +[ "$checked" -gt 0 ] || { echo "No scalar type matched the canonical snapshot or its derived eq-only subset." >&2; exit 1; } # Completeness cross-check against the catalog (the single source of truth). catalog=$(cd "{{config_root}}" && cargo run -p eql-codegen -- list-types | LC_ALL=C sort -u) @@ -195,7 +216,7 @@ if [ "$discovered" != "$catalog" ]; then exit 1 fi -echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot; catalog reconciled." +echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot or its derived eq-only subset; catalog reconciled." """ [tasks."test:matrix:expand"] From cc513b09d1f4deefff4c04f10944b6893ac3e32c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 19:00:54 +1000 Subject: [PATCH 105/599] docs(snapshots): single baseline + derived eq-only check Document that there is ONE committed snapshot (the ordered shape) and that equality-only types are validated against a subset derived from it on the fly (baseline minus _ord/order_by/routes_through_ob), so an eq-only scalar needs no second snapshot. Update the stale ordered_numeric_matrix! references to scalar_matrix! and describe the printed per-type shape. --- tests/sqlx/snapshots/README.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index ed363608b..8b01c3846 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -8,10 +8,17 @@ it in version control. The per-type `_matrix_tests.txt` files are gone. They were byte-identical modulo the type token (the matrix tests are macro-generated from one -`ordered_numeric_matrix!` invocation per type with no per-type variation), so a +`scalar_matrix!` invocation per type with no per-type variation), so a single canonical set plus a per-type normalize-and-compare carries the same signal at a fraction of the committed surface. +There is also **no** separate snapshot for equality-only types. An eq-only +scalar (`scalar_matrix! { caps = [eq] }`, e.g. `timestamptz`) emits exactly the +ordered name set MINUS the ord-only lines, so the inventory **derives** its +expected set from this one baseline — `matrix_tests.txt` minus every line +matching `_ord` / `order_by` / `routes_through_ob`. The baseline file itself is +always the ordered (`caps = [eq, ord]`) shape. + ## What it guards The SQLx assertions verify that the tests which run produce the right results. @@ -34,8 +41,11 @@ The task (`mise.toml`, `[tasks."test:matrix:inventory"]`): `cargo test --no-default-features --test encrypted_domain -- --list`. 2. Discovers the set of scalar types present **from the binary's own output** (the `scalars::::` prefixes) — never a directory glob. -3. Normalizes each type's token to `` and asserts that type's set equals the - canonical `matrix_tests.txt`. Asserts at least one type is present. +3. Normalizes each type's token to `` and asserts that type's set equals + **either** the canonical `matrix_tests.txt` (ordered shape) **or** the derived + eq-only subset (`matrix_tests.txt` minus `_ord`/`order_by`/`routes_through_ob`). + Prints each type's resolved shape (`ordered` / `eq_only`). Asserts at least + one type is present. 4. **Completeness cross-check:** asserts the discovered type set equals `cargo run -p eql-codegen -- list-types` (the catalog is the single source). A catalog type added without its matrix wiring — no `scalars::::` tests in @@ -62,10 +72,10 @@ catalog cross-check) fails the job. - **Adding a new scalar type** → add the catalog row in `eql-scalars::CATALOG`, wire the SQLx matrix oracle (see `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3), then run - `mise run test:matrix:inventory`. If the new type's - normalized name set matches the canonical snapshot (it will, for a standard - `ordered_numeric_matrix!` type), no snapshot edit is needed — the cross-check - just confirms the type is wired. + `mise run test:matrix:inventory`. No snapshot edit is needed: an ordered + (`caps = [eq, ord]`) type matches the canonical baseline, and an equality-only + (`caps = [eq]`) type matches the derived eq-only subset — both are checked + against this one file. The cross-check just confirms the type is wired. - **Removing a scalar type** → remove the catalog row and its matrix wiring; the cross-check then sees the type gone from both sides. - **Changing which matrix tests the macro emits** → regenerate and commit From 6887a4434ae121df4fef47f0e64b0a53a0a9cc44 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 08:16:12 +1000 Subject: [PATCH 106/599] test(matrix): derive eq-only subset to a file; compare via cmp/diff The eq-only inventory check captured the derived subset into a shell variable and compared with [ string equality, which strips trailing newlines on capture and forced the failure diff to reconstruct the string via printf. Materialise the subset to a file so both shapes compare through the same cmp/diff path as the ordered snapshot. --- mise.toml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/mise.toml b/mise.toml index fadad50bf..7e34b78e3 100644 --- a/mise.toml +++ b/mise.toml @@ -177,10 +177,14 @@ discovered=$(printf '%s\\n' "$listing" \ # An equality-only type (no `_ord` domain) emits a strict SUBSET of the # canonical (ordered) snapshot: the same names minus every ord-only line -# (`_ord` / `order_by` / `routes_through_ob`). Derive that subset once here, so -# an equality-only scalar (e.g. timestamptz) needs NO second committed snapshot -# — it is validated against this derivation from the single baseline. -eq_only_expected=$(grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u) +# (`_ord` / `order_by` / `routes_through_ob`). Derive that subset once into a +# file, so an equality-only scalar (e.g. timestamptz) needs NO second committed +# snapshot — it is validated against this derivation from the single baseline. +# Materialise to a file (not a shell variable) so both shapes compare via the +# same `cmp`/`diff` path: a variable would strip trailing newlines on capture +# and force the failure diff to reconstruct the string with `printf`. +eq_only_expected="/tmp/matrix-eq-only-expected.txt" +grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u > "$eq_only_expected" # Per-type normalize + compare: each type must match EITHER the full canonical # snapshot (ordered shape) OR the derived eq-only subset (equality-only shape). @@ -191,14 +195,14 @@ while IFS= read -r t; do | sed -e "s/^scalars::${t}::/scalars::::/" -e "s/_${t}_/__/g" | LC_ALL=C sort > "/tmp/matrix-norm-${t}.txt" if cmp -s "/tmp/matrix-norm-${t}.txt" snapshots/matrix_tests.txt; then shape="ordered" - elif [ "$(cat "/tmp/matrix-norm-${t}.txt")" = "$eq_only_expected" ]; then + elif cmp -s "/tmp/matrix-norm-${t}.txt" "$eq_only_expected"; then shape="eq_only" else echo "Matrix test-name set for '${t}' matches NEITHER the canonical snapshot nor its derived eq-only subset." >&2 echo " vs ordered (snapshots/matrix_tests.txt):" >&2 diff snapshots/matrix_tests.txt "/tmp/matrix-norm-${t}.txt" >&2 || true echo " vs derived eq-only (ordered minus _ord/order_by/routes_through_ob):" >&2 - diff <(printf '%s\\n' "$eq_only_expected") "/tmp/matrix-norm-${t}.txt" >&2 || true + diff "$eq_only_expected" "/tmp/matrix-norm-${t}.txt" >&2 || true exit 1 fi echo " ${t}: ${shape}" From bce844faa45604709df94a917060a2172d394477 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 10:00:10 +1000 Subject: [PATCH 107/599] docs(v3): sync scalar-domain guide with implementation; drop deleted-Python refs Cross-checked docs/reference/adding-a-scalar-encrypted-domain-type.md against the current eql-scalars / eql-codegen / sqlx harness and corrected stale claims: - Matrix macros: the two wrappers ordered_numeric_matrix! / eq_only_scalar_matrix! were unified into scalar_matrix! (caps = [eq] / [eq, ord] over scalar_domain_matrix!). - Term::returns is not a real method; the methods are json_key/extractor/ctor/ role/operators/requires (the Returns column is eql_v3. + ctor). - Schema const is SCHEMA, not CORE_SCHEMA. - Temporal impls are emitted by the temporal_values! declarative macro, not hand-written. Also removed every dangling reference to the deleted Python codegen toolchain (tasks/codegen/*.py, terms.py, templates.py, operator_surface.py, *.toml type manifests, load_spec) across eql-scalars, eql-codegen, and the jsonb operator surface guard test, re-pointing them at the Rust sources of truth. The CHANGELOG [Unreleased] entry that documents the removal is left intact. --- crates/eql-codegen/src/consts.rs | 2 +- crates/eql-codegen/src/generate.rs | 2 +- crates/eql-codegen/src/operator_surface.rs | 2 +- crates/eql-codegen/src/writer.rs | 2 +- crates/eql-scalars/src/lib.rs | 28 ++++++-------- .../adding-a-scalar-encrypted-domain-type.md | 38 +++++++++++-------- .../family/jsonb_operator_surface.rs | 28 +++++++------- 7 files changed, 50 insertions(+), 52 deletions(-) diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 0f7a1ef72..9266882f5 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -17,7 +17,7 @@ pub(crate) const SCHEMA: &str = "eql_v3"; pub(crate) const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; /// Escape a string for use inside a single-quoted SQL literal by doubling -/// embedded single quotes. Port of templates.py `_sql_str`. +/// embedded single quotes. pub(crate) fn sql_str(s: &str) -> String { s.replace('\'', "''") } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 622ca6345..f428e475a 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -1,4 +1,4 @@ -//! File renderers and orchestrator (port of generate.py). +//! File renderers and orchestrator. use std::path::{Path, PathBuf}; diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index 38f1ec192..19237ddef 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -1,4 +1,4 @@ -//! The generated operator surface (port of operator_surface.py). +//! The generated operator surface. /// One operator in the generated surface. #[derive(Clone, Copy)] diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index 4d310fc82..153bc8e6f 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -1,4 +1,4 @@ -//! Ownership-guarded file writer (port of writer.py). +//! Ownership-guarded file writer. use std::fs; use std::io; diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index d8d3d7fbb..a6b67f6bc 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -1,6 +1,6 @@ -//! Scalar/term catalog for EQL encrypted-domain codegen — the Rust source of -//! truth replacing `tasks/codegen/{scalars,terms,spec}.py` and the -//! `types/*.toml` manifests. Std-only, no dependencies. +//! Scalar/term catalog for EQL encrypted-domain codegen — the single Rust +//! source of truth for every scalar type, term, and fixture. Std-only, no +//! dependencies. //! //! `Fixture` is value-kind tagged (one non-generic enum, variant = value kind), //! so a single `CATALOG` spans every scalar kind. Integer literals are @@ -151,9 +151,8 @@ impl ScalarKind { /// A fixed index term known to the scalar materializer. /// -/// Mirrors `terms.py`'s `TERM_CATALOG`. `Hm` provides equality; `Ore` provides -/// equality plus ordering. The `json_key`/`extractor`/`returns`/`ctor` values -/// are the cross-schema SQL contract and are copied verbatim from `terms.py` — +/// `Hm` provides equality; `Ore` provides equality plus ordering. The +/// `json_key`/`extractor`/`ctor` values are the cross-schema SQL contract — /// changing one is a generated-SQL behaviour change, not a refactor. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Term { @@ -215,8 +214,7 @@ impl Term { } impl Term { - /// Stable dedupe — first occurrence wins. The Rust analogue of - /// `terms.py`'s `dict.fromkeys` ordering contract. + /// Stable dedupe — first occurrence wins. fn dedupe_preserving_order<'a>(items: impl IntoIterator) -> Vec<&'a str> { let mut out: Vec<&'a str> = Vec::new(); for item in items { @@ -228,26 +226,23 @@ impl Term { } /// Supported operators for the union of a domain's terms (catalog order, - /// deduped). Mirrors `terms.py::operators_for_terms`. + /// deduped). pub fn operators_for_terms(terms: &[Term]) -> Vec<&'static str> { Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.operators().iter().copied())) } /// JSON payload keys required by these terms (deduped, in order). - /// Mirrors `terms.py::term_json_keys`. pub fn term_json_keys(terms: &[Term]) -> Vec<&'static str> { Self::dedupe_preserving_order(terms.iter().map(|t| t.json_key())) } /// SQL `-- REQUIRE:` edges needed by these terms (deduped, in order). - /// Mirrors `terms.py::term_requires`. pub fn term_requires(terms: &[Term]) -> Vec<&'static str> { Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.requires().iter().copied())) } /// The extractor that supports `op` for a domain carrying `terms`, or - /// `None`. First supporting term wins. Mirrors - /// `terms.py::extractor_for_operator`. + /// `None`. First supporting term wins. pub fn extractor_for_operator(terms: &[Term], op: &str) -> Option<&'static str> { terms .iter() @@ -256,8 +251,7 @@ impl Term { } /// Generated-file role label for a domain with these terms. No terms => - /// `"storage"`; otherwise the first term's role. Mirrors - /// `terms.py::role_for_terms`. + /// `"storage"`; otherwise the first term's role. pub fn role_for_terms(terms: &[Term]) -> &'static str { match terms.first() { None => "storage", @@ -420,13 +414,13 @@ macro_rules! fixtures { (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; } -/// int4 fixture plaintexts — verbatim from `tasks/codegen/types/int4.toml`. +/// int4 fixture plaintexts. /// `N(..)` literals are range-checked against `i32` at compile time. const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), Max); -/// int2 fixture plaintexts — verbatim from `tasks/codegen/types/int2.toml`. +/// int2 fixture plaintexts. /// `N(..)` literals are range-checked against `i16` at compile time. const INT2_FIXTURES: &[Fixture] = fixtures!(int i16; Min, N(-30000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 2f95c20cc..7cf73ccb8 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -112,8 +112,9 @@ than a runtime validator: - **`fixtures`** — the type's plaintext fixture list (see below). **Terms** are fixed by the `Term` enum (`crates/eql-scalars/src/lib.rs`). The -`json_key` / `extractor` / `returns` / `ctor` values are the cross-schema SQL -contract — changing one is a generated-SQL behaviour change, not a refactor: +`json_key` / `extractor` / `ctor` values are the cross-schema SQL contract (the +Returns column below is `eql_v3.` + `ctor`) — changing one is a generated-SQL +behaviour change, not a refactor: | Term | JSON key | Extractor | Returns | Operators | | ----- | -------- | ----------- | -------------------------------- | -------------------------- | @@ -122,7 +123,7 @@ contract — changing one is a generated-SQL behaviour change, not a refactor: A type that needs a non-ORE equality term on an ordered domain needs a **new `Term`**, not a catalog flag. Adding a term is a code change to the `Term` -enum's `impl` methods (`json_key`, `extractor`, `returns`, `ctor`, `role`, +enum's `impl` methods (`json_key`, `extractor`, `ctor`, `role`, `operators`, `requires`) with matching `#[test]`s (`term_tests` / `term_helper_tests`) — never a free-form catalog field. @@ -166,7 +167,7 @@ matrix-pivot requirement: - `every_fixture_value_is_within_kind_bounds` keeps every resolved value in range. -These are the compile/test-time analogue of the old `load_spec` validation. +These run at compile/test time rather than at generation time. Beyond the pivots, choose values so range operators produce distinguishable result counts, include useful boundaries, and cover omitted-term negative cases. @@ -204,8 +205,9 @@ jsonb-backed and token-driven): method (not a `const`), and the comparison pivots come from `ScalarType::min_pivot()` / `max_pivot()` (zero stays `Default::default()`). Integer impls return `Self::MIN`/`Self::MAX` (emitted by the proc-macro); - temporal impls return explicit sentinel dates and are **hand-written** in - `scalar_domains.rs` (the macro emits only integer impls). `to_sql_literal` is + temporal impls return explicit sentinel dates and are emitted by the + `temporal_values!` declarative macro in `scalar_domains.rs` (the proc-macro + emits only integer impls). `to_sql_literal` is overridden to single-quote the value (`'1970-01-01'`), since a bare `Display` date is not a valid SQL literal. - **The sqlx `chrono` feature.** The test crate enables sqlx's `chrono` feature @@ -219,13 +221,13 @@ jsonb-backed and token-driven): ## 3. Wire the SQLx matrix oracle The generated SQL is enough to *install* the domains, but the -`ordered_numeric_matrix!` suite only runs once the Rust harness knows about the +`scalar_matrix!` suite only runs once the Rust harness knows about the scalar. `` is the scalar's Rust type (`i32` for `int4`, `i16` for `int2`). There are now **two** registrations: | File | Add | |------|-----| -| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType`, the `eql_v2_` fixture module, the `ordered_numeric_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | +| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType`, the `eql_v2_` fixture module, the `scalar_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | | `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}` and `impl EqlPlaintext for ` carrying just `const KIND: ScalarKind` plus the value-typed `to_plaintext` → the right `Plaintext` variant. `CAST` and `PLAINTEXT_SQL_TYPE` are **derived** from `KIND` via the `cast_for_kind` / `plaintext_sql_type_for_kind` `const fn` defaults, so a brand-new integer kind needs an arm in those two helpers — not a per-type const. Keep the three `#[test]`s (cast / sql-type / to_plaintext) mirroring the existing ones. | The single ` => ` line in `scalar_types.rs` is the harness source of @@ -243,13 +245,17 @@ type but the binary has no `scalars::::` tests. A catalog token absent from the `scalar_types!` list also fails the `generate_for_token` catch-all loudly at fixture-generation time. -The coverage these registrations unlock comes from the `ordered_numeric_matrix!` +The coverage these registrations unlock comes from the `scalar_matrix!` convention wrapper in `tests/sqlx/src/matrix.rs`: one `impl ScalarType` plus a -single invocation taking `suite`, `scalar`, and `eql_type`. The matrix derives -its comparison pivots — the scalar's `MIN`, `MAX`, and zero -(`Default::default()`) — from the type rather than a hand-written list, so the -invocation carries no pivot argument. Equality-only scalars use the sibling -`eq_only_scalar_matrix!`. The `matrix.rs` module header is the canonical, +single invocation taking `suite`, `scalar`, `eql_type`, and a `caps` capability +marker. The matrix derives its comparison pivots — the scalar's `MIN`, `MAX`, +and zero (`Default::default()`) — from the type rather than a hand-written list, +so the invocation carries no pivot argument. `caps = [eq, ord]` selects the +ordered-numeric shape (all four variants; `=`/`<>`/`<`/`<=`/`>`/`>=`; ORDER BY / +ORDER BY USING; ORE injectivity); `caps = [eq]` selects the equality-only shape +(storage + `_eq` only; the four ord operators are deliberate blockers). Both +expand to the lower-level `scalar_domain_matrix!`. The `matrix.rs` module header +is the canonical, current list of the categories the matrix emits (sanity, correctness, cross-shape, supported-NULL, blocker raises, index engagement, ORDER BY, ORDER BY USING) — read it rather than duplicating a count here. For ordered `int4`, @@ -314,7 +320,7 @@ the type-generic generator: the templates are pure token substitution, so a per-type baseline can only fail where `int4`'s already would. Drift protection for a new type comes from the `int4` reference (shared templates + `Term` enum), the catalog `values_tests` pinning the materialised `_VALUES`, the -catalog/generator `#[test]`s, and the `ordered_numeric_matrix!` SQLx suite +catalog/generator `#[test]`s, and the `scalar_matrix!` SQLx suite (behaviour, not bytes). --- @@ -544,7 +550,7 @@ runs as `cargo run -p eql-codegen` (no subcommand), which calls and matrix-inventory enumeration). `main` (`crates/eql-codegen/src/main.rs`) recognises exactly these two forms; any other argument is a usage error. -The generator targets the `eql_v3` schema throughout: `CORE_SCHEMA = "eql_v3"` +The generator targets the `eql_v3` schema throughout: `SCHEMA = "eql_v3"` (`crates/eql-codegen/src/consts.rs`) qualifies both the domain families and the SEM index-term types the extractors return (`eql_v3.hmac_256`, `eql_v3.ore_block_u64_8_256`), so no generated SQL references `eql_v2`. diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index b10a848cb..70abb64d1 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -2,10 +2,9 @@ //! //! The storage-only domains (`eql_v3.int4`, future scalars) promise that //! *every* native jsonb operator is blocked, so an encrypted column can never -//! fall through to plaintext-jsonb semantics. That promise rests on three -//! hand-maintained lists in `tasks/codegen/operator_surface.py` -//! (`SYMMETRIC_OPERATORS`, `PATH_OPERATORS`, `BLOCKER_ONLY_OPERATORS`), whose -//! union is `KNOWN_JSONB_OPERATORS`. +//! fall through to plaintext-jsonb semantics. That promise rests on the +//! enumerated operator surface in `crates/eql-codegen/src/operator_surface.rs` +//! (the `OPERATORS` const), mirrored locally below as `KNOWN_JSONB_OPERATORS`. //! //! Those lists are an *enumeration*, not a structural guarantee: a future PG //! version could add a jsonb operator that nobody adds here, and it would @@ -16,18 +15,17 @@ //! e.g. `~~` / `~~*`) are excluded — they are not native and are unreachable //! from a storage scalar domain. //! -//! Source of truth: `tasks/codegen/operator_surface.py::KNOWN_JSONB_OPERATORS` -//! (asserted complete by `tasks/codegen/test_operator_surface.py`). The set -//! below is hardcoded — the lowest-friction bridge from a Python constant to a -//! Rust test — and must be kept in sync with that module. If you add an -//! operator there, add it here; the Python test pins the union so the two can -//! only drift in this file. +//! Source of truth: `crates/eql-codegen/src/operator_surface.rs` (the +//! `OPERATORS` const, pinned at 20 entries by its own unit tests). The set +//! below is a hardcoded mirror and must be kept in sync with that module. If +//! you add an operator there, add it here. use anyhow::Result; use sqlx::PgPool; -/// Mirror of `KNOWN_JSONB_OPERATORS` in -/// `tasks/codegen/operator_surface.py`. Keep in sync with that module. +/// Mirror of the enumerated operator surface in +/// `crates/eql-codegen/src/operator_surface.rs` (`OPERATORS`). Keep in sync +/// with that module. const KNOWN_JSONB_OPERATORS: &[&str] = &[ // symmetric (supported wrappers) "=", "<>", "<", "<=", ">", ">=", "@>", "<@", // @@ -77,11 +75,11 @@ async fn every_native_jsonb_operator_is_known_to_the_generator(pool: PgPool) -> assert!( missing.is_empty(), "PostgreSQL exposes jsonb operator(s) not enumerated in \ - tasks/codegen/operator_surface.py (KNOWN_JSONB_OPERATORS): {missing:#?}. \ + crates/eql-codegen/src/operator_surface.rs (OPERATORS): {missing:#?}. \ A storage-only encrypted domain would route these to native \ plaintext-jsonb semantics instead of an EQL blocker. Add each symbol \ - to the appropriate list in operator_surface.py (and to the mirror in \ - this test) and regenerate the SQL surface." + to OPERATORS in operator_surface.rs (and to the mirror in this test) \ + and regenerate the SQL surface." ); Ok(()) From 88327c11a9278584d2ccd87b5d68a12868733785 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:25:41 +1000 Subject: [PATCH 108/599] refactor(eql-scalars): split lib.rs into definitions + impl/test modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The crate's single lib.rs had grown to 1215 lines, ~55% of it tests, with each enum's definition interleaved with its impl block. Reorganise for readability so the catalog reads top-to-bottom: - lib.rs (~240 lines) keeps the *definitions* — the six type defs, the two crate-internal macros (fixtures!, int_values!), and all catalog data (ORDERED_INT_DOMAINS, INT*_FIXTURES, INT4/INT2/INT8/DATE, CATALOG, INT*_VALUES). - Inherent impls move to sibling modules: kind.rs (BoundedIntKind, ScalarKind), term.rs (Term), fixture.rs (Fixture), spec.rs (ScalarSpec). Methods travel with their types, so no re-exports are needed. - The 7 unit-test modules move verbatim into tests.rs (#[cfg(test)] mod tests), kept as one group because rust_tests spans multiple types; use super::* becomes use crate::*. Pure code-move, zero behaviour change. Public API surface of the crate is unchanged. Verified: cargo test -p eql-scalars (40 pass), codegen:parity (byte-for-byte identical int4 golden), test:crates clippy -D warnings clean, eql-codegen/eql-tests-macros build unchanged. --- crates/eql-scalars/src/fixture.rs | 60 ++ crates/eql-scalars/src/kind.rs | 100 +++ crates/eql-scalars/src/lib.rs | 1002 ++--------------------------- crates/eql-scalars/src/spec.rs | 21 + crates/eql-scalars/src/term.rs | 106 +++ crates/eql-scalars/src/tests.rs | 675 +++++++++++++++++++ 6 files changed, 1001 insertions(+), 963 deletions(-) create mode 100644 crates/eql-scalars/src/fixture.rs create mode 100644 crates/eql-scalars/src/kind.rs create mode 100644 crates/eql-scalars/src/spec.rs create mode 100644 crates/eql-scalars/src/term.rs create mode 100644 crates/eql-scalars/src/tests.rs diff --git a/crates/eql-scalars/src/fixture.rs b/crates/eql-scalars/src/fixture.rs new file mode 100644 index 000000000..0cd69053a --- /dev/null +++ b/crates/eql-scalars/src/fixture.rs @@ -0,0 +1,60 @@ +//! Inherent impls for [`Fixture`] — resolving a fixture to its integer value +//! (`numeric_value`) and rendering it as a Rust source literal +//! (`render_literal`). Definition lives in `lib.rs`. + +use crate::{Fixture, ScalarKind}; + +impl Fixture { + /// The integer value for this fixture (`Min`/`Max` -> kind bounds, `Zero` -> + /// 0, `Int(n)` -> n), or `None` for the string-backed kinds. Does not + /// range-check; `every_fixture_value_is_within_kind_bounds` guards the bounds. + /// + /// `const fn` so the `int_values!` materialiser can resolve a whole fixture + /// list into a typed `&'static` array at compile time. + pub const fn numeric_value(self, kind: ScalarKind) -> Option { + match self { + // `?` is not allowed in `const fn`, so match `as_bounded_int()` + // explicitly. A pivot on a non-integer kind resolves to `None`; the + // `pivot_sentinels_only_appear_with_integer_kinds` catalog test + // guarantees that combination never reaches a real `CATALOG` row. + Fixture::Min => match kind.as_bounded_int() { + Some(k) => Some(k.min_value()), + None => None, + }, + Fixture::Max => match kind.as_bounded_int() { + Some(k) => Some(k.max_value()), + None => None, + }, + Fixture::Zero => Some(0), + Fixture::Int(n) => Some(n), + Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) | Fixture::Date(_) => None, + } + } + + /// Render as a Rust source literal: sentinels -> named constant, `Int` -> the + /// number, string kinds -> a `Debug`-quoted (Rust-escaped, not SQL) literal. + pub fn render_literal(self, kind: ScalarKind) -> String { + const PIVOT_MSG: &str = "Min/Max/Zero fixtures require an integer kind"; + match self { + Fixture::Min => kind + .as_bounded_int() + .expect(PIVOT_MSG) + .min_symbol() + .to_string(), + Fixture::Max => kind + .as_bounded_int() + .expect(PIVOT_MSG) + .max_symbol() + .to_string(), + Fixture::Zero => kind + .as_bounded_int() + .expect(PIVOT_MSG) + .zero_symbol() + .to_string(), + Fixture::Int(n) => n.to_string(), + Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { + format!("{s:?}") + } + } + } +} diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-scalars/src/kind.rs new file mode 100644 index 000000000..9116ec38f --- /dev/null +++ b/crates/eql-scalars/src/kind.rs @@ -0,0 +1,100 @@ +//! Inherent impls for the scalar-kind vocabulary: [`BoundedIntKind`] (the total +//! accessors for fixed-width integer kinds) and [`ScalarKind`] (the native +//! scalar a domain maps onto). Definitions live in `lib.rs`. + +use crate::{BoundedIntKind, ScalarKind}; + +impl BoundedIntKind { + /// The Rust type name as it appears in generated source (e.g. `"i32"`). + pub const fn rust_type(self) -> &'static str { + match self { + BoundedIntKind::I16 => "i16", + BoundedIntKind::I32 => "i32", + BoundedIntKind::I64 => "i64", + } + } + + /// The `MIN` named-constant symbol (e.g. `"i32::MIN"`). + pub const fn min_symbol(self) -> &'static str { + match self { + BoundedIntKind::I16 => "i16::MIN", + BoundedIntKind::I32 => "i32::MIN", + BoundedIntKind::I64 => "i64::MIN", + } + } + + /// The `MAX` named-constant symbol (e.g. `"i32::MAX"`). + pub const fn max_symbol(self) -> &'static str { + match self { + BoundedIntKind::I16 => "i16::MAX", + BoundedIntKind::I32 => "i32::MAX", + BoundedIntKind::I64 => "i64::MAX", + } + } + + /// The zero literal symbol (always `"0"`). + pub const fn zero_symbol(self) -> &'static str { + "0" + } + + /// Inclusive lower bound of the representable range, widened to `i128`. + pub const fn min_value(self) -> i128 { + match self { + BoundedIntKind::I16 => i16::MIN as i128, + BoundedIntKind::I32 => i32::MIN as i128, + BoundedIntKind::I64 => i64::MIN as i128, + } + } + + /// Inclusive upper bound of the representable range, widened to `i128`. + pub const fn max_value(self) -> i128 { + match self { + BoundedIntKind::I16 => i16::MAX as i128, + BoundedIntKind::I32 => i32::MAX as i128, + BoundedIntKind::I64 => i64::MAX as i128, + } + } +} + +impl ScalarKind { + /// The fixed-width integer kinds — those with `i128` bounds and + /// `Min`/`Max`/`Zero` sentinels — projected onto [`BoundedIntKind`], or + /// `None` for the non-integer kinds. The single boundary where "this kind has + /// bounds" is decided; the bounded accessors live on `BoundedIntKind` and are + /// total there. NOT an orderability test: `Numeric`/`Text`/`Date` are + /// ORE-orderable yet not integers. + pub const fn as_bounded_int(self) -> Option { + match self { + ScalarKind::I16 => Some(BoundedIntKind::I16), + ScalarKind::I32 => Some(BoundedIntKind::I32), + ScalarKind::I64 => Some(BoundedIntKind::I64), + ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => None, + } + } + + /// True for the fixed-width integer kinds. Gates the bounded-numeric + /// invariants. Equivalent to `self.as_bounded_int().is_some()`. + pub const fn is_int(self) -> bool { + self.as_bounded_int().is_some() + } + + /// True for chrono-backed temporal kinds (`Date`; `Timestamptz` once added) — + /// the kinds whose test `ScalarType` impl is generated by `temporal_values!` + /// rather than the integer proc-macro path. Replaces the `[temporal]` marker. + pub const fn is_temporal(self) -> bool { + matches!(self, ScalarKind::Date) + } + + /// The Rust type name as it appears in generated source (e.g. `"i32"`). + pub const fn rust_type(self) -> &'static str { + match self { + ScalarKind::I16 => "i16", + ScalarKind::I32 => "i32", + ScalarKind::I64 => "i64", + ScalarKind::Numeric => "numeric", + ScalarKind::Text => "text", + ScalarKind::Jsonb => "jsonb", + ScalarKind::Date => "chrono::NaiveDate", + } + } +} diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index a6b67f6bc..b488d5f71 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -14,6 +14,17 @@ //! cannot yet express the order of a non-integer fixture set. //! //! Public names are consumed verbatim by the later codegen plans — do not rename. +//! +//! **Layout.** This file holds the *definitions* — the type vocabulary and the +//! catalog data — so the whole catalog reads top-to-bottom. The inherent `impl` +//! blocks live in sibling modules (`kind`, `term`, `fixture`, `spec`); the unit +//! tests live in `tests`. The methods travel with their types, so nothing here +//! re-exports them. + +mod fixture; +mod kind; +mod spec; +mod term; /// The fixed-width integer kinds — exactly those scalar kinds with an `i128` /// range and `MIN`/`MAX`/`Zero` sentinels. These accessors are **total**: every @@ -21,7 +32,7 @@ /// `Date`) are simply not representable here, so there is no partial function to /// panic — `ScalarKind::Date` cannot call `min_symbol()` because `Date` is not a /// `BoundedIntKind`. Reach this type from a `ScalarKind` via -/// [`ScalarKind::as_bounded_int`]. +/// [`ScalarKind::as_bounded_int`]. (Accessors are impl'd in `kind`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum BoundedIntKind { I16, @@ -29,58 +40,6 @@ pub enum BoundedIntKind { I64, } -impl BoundedIntKind { - /// The Rust type name as it appears in generated source (e.g. `"i32"`). - pub const fn rust_type(self) -> &'static str { - match self { - BoundedIntKind::I16 => "i16", - BoundedIntKind::I32 => "i32", - BoundedIntKind::I64 => "i64", - } - } - - /// The `MIN` named-constant symbol (e.g. `"i32::MIN"`). - pub const fn min_symbol(self) -> &'static str { - match self { - BoundedIntKind::I16 => "i16::MIN", - BoundedIntKind::I32 => "i32::MIN", - BoundedIntKind::I64 => "i64::MIN", - } - } - - /// The `MAX` named-constant symbol (e.g. `"i32::MAX"`). - pub const fn max_symbol(self) -> &'static str { - match self { - BoundedIntKind::I16 => "i16::MAX", - BoundedIntKind::I32 => "i32::MAX", - BoundedIntKind::I64 => "i64::MAX", - } - } - - /// The zero literal symbol (always `"0"`). - pub const fn zero_symbol(self) -> &'static str { - "0" - } - - /// Inclusive lower bound of the representable range, widened to `i128`. - pub const fn min_value(self) -> i128 { - match self { - BoundedIntKind::I16 => i16::MIN as i128, - BoundedIntKind::I32 => i32::MIN as i128, - BoundedIntKind::I64 => i64::MIN as i128, - } - } - - /// Inclusive upper bound of the representable range, widened to `i128`. - pub const fn max_value(self) -> i128 { - match self { - BoundedIntKind::I16 => i16::MAX as i128, - BoundedIntKind::I32 => i32::MAX as i128, - BoundedIntKind::I64 => i64::MAX as i128, - } - } -} - /// The native scalar a domain type maps onto. Integer kinds carry i128 bounds; /// the others (`Numeric`/`Text`/`Jsonb`) have string fixtures and no numeric /// range — though `Numeric`/`Text` are still ORE-orderable, only `Jsonb` is not. @@ -88,7 +47,8 @@ impl BoundedIntKind { /// /// The bounded-numeric accessors live on the total [`BoundedIntKind`], reached /// via [`ScalarKind::as_bounded_int`]; non-integer kinds have no such accessor, -/// so misuse is a compile error rather than a runtime panic. +/// so misuse is a compile error rather than a runtime panic. (Accessors are +/// impl'd in `kind`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ScalarKind { I16, @@ -106,160 +66,18 @@ pub enum ScalarKind { Date, } -impl ScalarKind { - /// The fixed-width integer kinds — those with `i128` bounds and - /// `Min`/`Max`/`Zero` sentinels — projected onto [`BoundedIntKind`], or - /// `None` for the non-integer kinds. The single boundary where "this kind has - /// bounds" is decided; the bounded accessors live on `BoundedIntKind` and are - /// total there. NOT an orderability test: `Numeric`/`Text`/`Date` are - /// ORE-orderable yet not integers. - pub const fn as_bounded_int(self) -> Option { - match self { - ScalarKind::I16 => Some(BoundedIntKind::I16), - ScalarKind::I32 => Some(BoundedIntKind::I32), - ScalarKind::I64 => Some(BoundedIntKind::I64), - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => None, - } - } - - /// True for the fixed-width integer kinds. Gates the bounded-numeric - /// invariants. Equivalent to `self.as_bounded_int().is_some()`. - pub const fn is_int(self) -> bool { - self.as_bounded_int().is_some() - } - - /// True for chrono-backed temporal kinds (`Date`; `Timestamptz` once added) — - /// the kinds whose test `ScalarType` impl is generated by `temporal_values!` - /// rather than the integer proc-macro path. Replaces the `[temporal]` marker. - pub const fn is_temporal(self) -> bool { - matches!(self, ScalarKind::Date) - } - - /// The Rust type name as it appears in generated source (e.g. `"i32"`). - pub const fn rust_type(self) -> &'static str { - match self { - ScalarKind::I16 => "i16", - ScalarKind::I32 => "i32", - ScalarKind::I64 => "i64", - ScalarKind::Numeric => "numeric", - ScalarKind::Text => "text", - ScalarKind::Jsonb => "jsonb", - ScalarKind::Date => "chrono::NaiveDate", - } - } -} - /// A fixed index term known to the scalar materializer. /// /// `Hm` provides equality; `Ore` provides equality plus ordering. The /// `json_key`/`extractor`/`ctor` values are the cross-schema SQL contract — -/// changing one is a generated-SQL behaviour change, not a refactor. +/// changing one is a generated-SQL behaviour change, not a refactor. (The +/// per-term accessors and `*_for_terms` helpers are impl'd in `term`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Term { Hm, Ore, } -impl Term { - /// JSON payload key carrying this term (`"hm"` / `"ob"`). - pub const fn json_key(self) -> &'static str { - match self { - Term::Hm => "hm", - Term::Ore => "ob", - } - } - - /// The generated extractor function name (`"eq_term"` / `"ord_term"`). - pub const fn extractor(self) -> &'static str { - match self { - Term::Hm => "eq_term", - Term::Ore => "ord_term", - } - } - - /// Constructor name for the index-term type (unqualified). - pub const fn ctor(self) -> &'static str { - match self { - Term::Hm => "hmac_256", - Term::Ore => "ore_block_u64_8_256", - } - } - - /// Generated-file role label for a domain whose first term is this one. - pub const fn role(self) -> &'static str { - match self { - Term::Hm => "eq", - Term::Ore => "ord", - } - } - - /// SQL operators this term supports, in catalog order. - pub const fn operators(self) -> &'static [&'static str] { - match self { - Term::Hm => &["=", "<>"], - Term::Ore => &["=", "<>", "<", "<=", ">", ">="], - } - } - - /// SQL `-- REQUIRE:` edges this term pulls in, in catalog order. - pub const fn requires(self) -> &'static [&'static str] { - match self { - Term::Hm => &["src/v3/sem/hmac_256/functions.sql"], - Term::Ore => &[ - "src/v3/sem/ore_block_u64_8_256/functions.sql", - "src/v3/sem/ore_block_u64_8_256/operators.sql", - ], - } - } -} - -impl Term { - /// Stable dedupe — first occurrence wins. - fn dedupe_preserving_order<'a>(items: impl IntoIterator) -> Vec<&'a str> { - let mut out: Vec<&'a str> = Vec::new(); - for item in items { - if !out.contains(&item) { - out.push(item); - } - } - out - } - - /// Supported operators for the union of a domain's terms (catalog order, - /// deduped). - pub fn operators_for_terms(terms: &[Term]) -> Vec<&'static str> { - Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.operators().iter().copied())) - } - - /// JSON payload keys required by these terms (deduped, in order). - pub fn term_json_keys(terms: &[Term]) -> Vec<&'static str> { - Self::dedupe_preserving_order(terms.iter().map(|t| t.json_key())) - } - - /// SQL `-- REQUIRE:` edges needed by these terms (deduped, in order). - pub fn term_requires(terms: &[Term]) -> Vec<&'static str> { - Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.requires().iter().copied())) - } - - /// The extractor that supports `op` for a domain carrying `terms`, or - /// `None`. First supporting term wins. - pub fn extractor_for_operator(terms: &[Term], op: &str) -> Option<&'static str> { - terms - .iter() - .find(|t| t.operators().contains(&op)) - .map(|t| t.extractor()) - } - - /// Generated-file role label for a domain with these terms. No terms => - /// `"storage"`; otherwise the first term's role. - pub fn role_for_terms(terms: &[Term]) -> &'static str { - match terms.first() { - None => "storage", - Some(t) => t.role(), - } - } -} - /// A single fixture plaintext value, value-kind tagged: `Min`/`Max`/`Zero` are /// the integer matrix pivots (resolved per-kind); `Int` is an integer literal; /// `Numeric`/`Text`/`Jsonb` carry rendered string literals. @@ -267,6 +85,7 @@ impl Term { /// `fixtures!` range-checks `Int` literals at compile time, but a hand-built /// `Fixture::Int(n)` is not — hence the runtime invariant tests. `Int(MIN)` and /// `Min` resolve equal but render differently (`"-32768"` vs `"i16::MIN"`). +/// (`numeric_value`/`render_literal` are impl'd in `fixture`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Fixture { Min, @@ -282,61 +101,6 @@ pub enum Fixture { Date(&'static str), } -impl Fixture { - /// The integer value for this fixture (`Min`/`Max` -> kind bounds, `Zero` -> - /// 0, `Int(n)` -> n), or `None` for the string-backed kinds. Does not - /// range-check; `every_fixture_value_is_within_kind_bounds` guards the bounds. - /// - /// `const fn` so the `int_values!` materialiser can resolve a whole fixture - /// list into a typed `&'static` array at compile time. - pub const fn numeric_value(self, kind: ScalarKind) -> Option { - match self { - // `?` is not allowed in `const fn`, so match `as_bounded_int()` - // explicitly. A pivot on a non-integer kind resolves to `None`; the - // `pivot_sentinels_only_appear_with_integer_kinds` catalog test - // guarantees that combination never reaches a real `CATALOG` row. - Fixture::Min => match kind.as_bounded_int() { - Some(k) => Some(k.min_value()), - None => None, - }, - Fixture::Max => match kind.as_bounded_int() { - Some(k) => Some(k.max_value()), - None => None, - }, - Fixture::Zero => Some(0), - Fixture::Int(n) => Some(n), - Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) | Fixture::Date(_) => None, - } - } - - /// Render as a Rust source literal: sentinels -> named constant, `Int` -> the - /// number, string kinds -> a `Debug`-quoted (Rust-escaped, not SQL) literal. - pub fn render_literal(self, kind: ScalarKind) -> String { - const PIVOT_MSG: &str = "Min/Max/Zero fixtures require an integer kind"; - match self { - Fixture::Min => kind - .as_bounded_int() - .expect(PIVOT_MSG) - .min_symbol() - .to_string(), - Fixture::Max => kind - .as_bounded_int() - .expect(PIVOT_MSG) - .max_symbol() - .to_string(), - Fixture::Zero => kind - .as_bounded_int() - .expect(PIVOT_MSG) - .zero_symbol() - .to_string(), - Fixture::Int(n) => n.to_string(), - Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { - format!("{s:?}") - } - } - } -} - /// One generated public domain: a suffix appended to the type token and the /// fixed index terms it carries. Suffix `""` is the storage-only domain. #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -347,6 +111,7 @@ pub struct DomainSpec { /// A scalar encrypted-domain type: its SQL token, native Rust type, generated /// domains, and fixture plaintext list. The Rust analogue of one `*.toml`. +/// (`domain_name`/`is_eq_only` are impl'd in `spec`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ScalarSpec { pub token: &'static str, @@ -355,20 +120,26 @@ pub struct ScalarSpec { pub fixtures: &'static [Fixture], } -impl ScalarSpec { - /// The fully-qualified domain name: `token` + `suffix`. Makes the old - /// "domain name must start with the token" validation structural. - pub fn domain_name(&self, domain: &DomainSpec) -> String { - format!("{}{}", self.token, domain.suffix) - } - - /// True when this type declares no ordered (`_ord`) domain — i.e. equality-only - /// (storage + `_eq`). Replaces the future `[eq_only]` marker: the domain set - /// already carries this. The `_ord_ore` twin only appears alongside `_ord`, so - /// testing `_ord` suffices. - pub fn is_eq_only(&self) -> bool { - !self.domains.iter().any(|d| d.suffix == "_ord") - } +/// Builds a `&[Fixture]`. The `int ;` arm (a tt-muncher over `Min`/`Max`/ +/// `Zero` and `N()`) range-checks each literal against `` at compile +/// time via `const _RANGE_CHECK`, so out-of-range literals do not compile; +/// `text;`/`numeric;`/`jsonb;` wrap string literals. The reject case has no +/// in-crate test (macro isn't exported, no `trybuild` under zero-deps) — verify +/// by hand with a bad `N(..)`. +macro_rules! fixtures { + (int $t:ty; $($body:tt)*) => { fixtures!(@int $t; [] $($body)*) }; + (@int $t:ty; [$($acc:expr),*]) => { &[$($acc),*] }; + (@int $t:ty; [$($acc:expr),*] , $($r:tt)*) => { fixtures!(@int $t; [$($acc),*] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Min $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Min ] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Max $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Max ] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Zero $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Zero] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] N($v:literal) $($r:tt)*) => { + fixtures!(@int $t; [$($acc,)* Fixture::Int({ const _RANGE_CHECK: $t = $v; $v as i128 })] $($r)*) + }; + (text; $($s:literal),* $(,)?) => { &[$(Fixture::Text($s)),*] }; + (numeric; $($s:literal),* $(,)?) => { &[$(Fixture::Numeric($s)),*] }; + (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; + (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; } /// Domains shared by every ordered-integer scalar, in manifest file order: @@ -392,28 +163,6 @@ const ORDERED_INT_DOMAINS: &[DomainSpec] = &[ }, ]; -/// Builds a `&[Fixture]`. The `int ;` arm (a tt-muncher over `Min`/`Max`/ -/// `Zero` and `N()`) range-checks each literal against `` at compile -/// time via `const _RANGE_CHECK`, so out-of-range literals do not compile; -/// `text;`/`numeric;`/`jsonb;` wrap string literals. The reject case has no -/// in-crate test (macro isn't exported, no `trybuild` under zero-deps) — verify -/// by hand with a bad `N(..)`. -macro_rules! fixtures { - (int $t:ty; $($body:tt)*) => { fixtures!(@int $t; [] $($body)*) }; - (@int $t:ty; [$($acc:expr),*]) => { &[$($acc),*] }; - (@int $t:ty; [$($acc:expr),*] , $($r:tt)*) => { fixtures!(@int $t; [$($acc),*] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] Min $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Min ] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] Max $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Max ] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] Zero $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Zero] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] N($v:literal) $($r:tt)*) => { - fixtures!(@int $t; [$($acc,)* Fixture::Int({ const _RANGE_CHECK: $t = $v; $v as i128 })] $($r)*) - }; - (text; $($s:literal),* $(,)?) => { &[$(Fixture::Text($s)),*] }; - (numeric; $($s:literal),* $(,)?) => { &[$(Fixture::Numeric($s)),*] }; - (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; - (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; -} - /// int4 fixture plaintexts. /// `N(..)` literals are range-checked against `i32` at compile time. const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; @@ -539,677 +288,4 @@ int_values!(INT2_VALUES, i16, INT2); int_values!(INT8_VALUES, i64, INT8); #[cfg(test)] -mod rust_tests { - use super::*; - - #[test] - fn bounded_int_kind_accessors_are_total() { - assert_eq!(BoundedIntKind::I16.rust_type(), "i16"); - assert_eq!(BoundedIntKind::I16.min_symbol(), "i16::MIN"); - assert_eq!(BoundedIntKind::I16.max_symbol(), "i16::MAX"); - assert_eq!(BoundedIntKind::I16.zero_symbol(), "0"); - assert_eq!(BoundedIntKind::I16.min_value(), -32_768_i128); - assert_eq!(BoundedIntKind::I16.max_value(), 32_767_i128); - - assert_eq!(BoundedIntKind::I32.min_symbol(), "i32::MIN"); - assert_eq!(BoundedIntKind::I32.min_value(), -2_147_483_648_i128); - assert_eq!(BoundedIntKind::I32.max_value(), 2_147_483_647_i128); - - assert_eq!(BoundedIntKind::I64.max_symbol(), "i64::MAX"); - assert_eq!( - BoundedIntKind::I64.min_value(), - -9_223_372_036_854_775_808_i128 - ); - assert_eq!( - BoundedIntKind::I64.max_value(), - 9_223_372_036_854_775_807_i128 - ); - } - - #[test] - fn as_bounded_int_maps_integer_kinds_only() { - assert_eq!(ScalarKind::I16.as_bounded_int(), Some(BoundedIntKind::I16)); - assert_eq!(ScalarKind::I32.as_bounded_int(), Some(BoundedIntKind::I32)); - assert_eq!(ScalarKind::I64.as_bounded_int(), Some(BoundedIntKind::I64)); - assert_eq!(ScalarKind::Numeric.as_bounded_int(), None); - assert_eq!(ScalarKind::Text.as_bounded_int(), None); - assert_eq!(ScalarKind::Jsonb.as_bounded_int(), None); - assert_eq!(ScalarKind::Date.as_bounded_int(), None); - } - - #[test] - fn i32_facts_match_int4() { - assert_eq!(ScalarKind::I32.rust_type(), "i32"); - let k = ScalarKind::I32 - .as_bounded_int() - .expect("I32 is an integer kind"); - assert_eq!(k.min_symbol(), "i32::MIN"); - assert_eq!(k.max_symbol(), "i32::MAX"); - assert_eq!(k.zero_symbol(), "0"); - assert_eq!(k.min_value(), -2_147_483_648_i128); - assert_eq!(k.max_value(), 2_147_483_647_i128); - } - - #[test] - fn i16_facts_match_int2() { - assert_eq!(ScalarKind::I16.rust_type(), "i16"); - let k = ScalarKind::I16 - .as_bounded_int() - .expect("I16 is an integer kind"); - assert_eq!(k.min_symbol(), "i16::MIN"); - assert_eq!(k.max_symbol(), "i16::MAX"); - assert_eq!(k.zero_symbol(), "0"); - assert_eq!(k.min_value(), -32_768_i128); - assert_eq!(k.max_value(), 32_767_i128); - } - - #[test] - fn is_int_classifies_kinds() { - assert!(ScalarKind::I16.is_int()); - assert!(ScalarKind::I32.is_int()); - assert!(ScalarKind::I64.is_int()); - assert!(!ScalarKind::Numeric.is_int()); - assert!(!ScalarKind::Text.is_int()); - assert!(!ScalarKind::Jsonb.is_int()); - assert!(!ScalarKind::Date.is_int()); - } - - #[test] - fn i64_facts() { - // Capability-layer fact: i64 is the Rust kind a future int8 maps onto. - // Present here so adding int8 later is a pure `CATALOG` append. - assert_eq!(ScalarKind::I64.rust_type(), "i64"); - let k = ScalarKind::I64 - .as_bounded_int() - .expect("I64 is an integer kind"); - assert_eq!(k.min_symbol(), "i64::MIN"); - assert_eq!(k.max_symbol(), "i64::MAX"); - assert_eq!(k.zero_symbol(), "0"); - assert_eq!(k.min_value(), -9_223_372_036_854_775_808_i128); - assert_eq!(k.max_value(), 9_223_372_036_854_775_807_i128); - } - - #[test] - fn date_maps_to_naive_date() { - // Ordered, non-integer kind: it carries a rust type but no i128 range, - // so it is not `is_int()` and `as_bounded_int()` returns `None` — the - // bounded accessors are simply not reachable for it. - assert_eq!(ScalarKind::Date.rust_type(), "chrono::NaiveDate"); - assert!(!ScalarKind::Date.is_int()); - assert_eq!(ScalarKind::Date.as_bounded_int(), None); - } - - /// The structural guarantee that replaces the old runtime panics: a - /// `Min`/`Max`/`Zero` pivot sentinel may only appear in a `CATALOG` row whose - /// kind is an integer kind. `render_literal` would `expect`-panic and - /// `numeric_value` would resolve to `None` for a pivot on a non-integer kind; - /// this test makes such a row a test failure at the source of truth. - #[test] - fn pivot_sentinels_only_appear_with_integer_kinds() { - for spec in CATALOG { - for fixture in spec.fixtures { - if matches!(fixture, Fixture::Min | Fixture::Max | Fixture::Zero) { - assert!( - spec.kind.is_int(), - "pivot sentinel {fixture:?} on non-integer kind {:?} (token `{}`)", - spec.kind, - spec.token, - ); - } - } - } - } - - #[test] - fn is_temporal_classifies_chrono_kinds() { - assert!(ScalarKind::Date.is_temporal()); - assert!(!ScalarKind::I16.is_temporal()); - assert!(!ScalarKind::I32.is_temporal()); - assert!(!ScalarKind::I64.is_temporal()); - // Timestamptz arrives in Phase 5; assert it here once present. - } - - #[test] - fn is_eq_only_detects_absence_of_ord_domains() { - let int4 = CATALOG.iter().find(|s| s.token == "int4").unwrap(); - assert!(!int4.is_eq_only(), "int4 is ordered"); - let date = CATALOG.iter().find(|s| s.token == "date").unwrap(); - assert!(!date.is_eq_only(), "date is ordered"); - } -} - -#[cfg(test)] -mod term_tests { - use super::*; - - #[test] - fn hm_term_provides_equality() { - let hm = Term::Hm; - assert_eq!(hm.json_key(), "hm"); - assert_eq!(hm.extractor(), "eq_term"); - assert_eq!(hm.ctor(), "hmac_256"); - assert_eq!(hm.role(), "eq"); - assert_eq!(hm.operators(), &["=", "<>"]); - assert_eq!(hm.requires(), &["src/v3/sem/hmac_256/functions.sql"]); - } - - #[test] - fn ore_term_preserves_int4_sql_contract() { - let ore = Term::Ore; - assert_eq!(ore.json_key(), "ob"); - assert_eq!(ore.extractor(), "ord_term"); - assert_eq!(ore.ctor(), "ore_block_u64_8_256"); - assert_eq!(ore.role(), "ord"); - assert_eq!(ore.operators(), &["=", "<>", "<", "<=", ">", ">="]); - assert_eq!( - ore.requires(), - &[ - "src/v3/sem/ore_block_u64_8_256/functions.sql", - "src/v3/sem/ore_block_u64_8_256/operators.sql", - ] - ); - } -} - -#[cfg(test)] -mod term_helper_tests { - use super::*; - - #[test] - fn operators_are_union_in_catalog_order() { - // ore then hm: ore's six ops first, hm adds nothing new. - assert_eq!( - Term::operators_for_terms(&[Term::Ore, Term::Hm]), - vec!["=", "<>", "<", "<=", ">", ">="] - ); - } - - #[test] - fn operators_for_terms_handles_empty() { - assert!(Term::operators_for_terms(&[]).is_empty()); - } - - #[test] - fn json_keys_come_from_catalog() { - assert_eq!( - Term::term_json_keys(&[Term::Hm, Term::Ore]), - vec!["hm", "ob"] - ); - assert!(Term::term_json_keys(&[]).is_empty()); - } - - #[test] - fn requires_are_deduplicated_in_order() { - assert_eq!( - Term::term_requires(&[Term::Ore, Term::Ore, Term::Hm]), - vec![ - "src/v3/sem/ore_block_u64_8_256/functions.sql", - "src/v3/sem/ore_block_u64_8_256/operators.sql", - "src/v3/sem/hmac_256/functions.sql", - ] - ); - assert!(Term::term_requires(&[]).is_empty()); - } - - #[test] - fn role_for_terms_handles_storage_eq_ord() { - assert_eq!(Term::role_for_terms(&[]), "storage"); - assert_eq!(Term::role_for_terms(&[Term::Hm]), "eq"); - assert_eq!(Term::role_for_terms(&[Term::Ore]), "ord"); - } - - #[test] - fn extractor_for_operator_picks_first_supporting_term() { - assert_eq!( - Term::extractor_for_operator(&[Term::Hm], "="), - Some("eq_term") - ); - assert_eq!( - Term::extractor_for_operator(&[Term::Ore], "<"), - Some("ord_term") - ); - assert_eq!( - Term::extractor_for_operator(&[Term::Hm, Term::Ore], "="), - Some("eq_term") - ); - assert_eq!( - Term::extractor_for_operator(&[Term::Hm, Term::Ore], "<"), - Some("ord_term") - ); - } - - #[test] - fn extractor_for_operator_none_when_unsupported() { - assert_eq!(Term::extractor_for_operator(&[Term::Hm], "<"), None); - assert_eq!(Term::extractor_for_operator(&[], "="), None); - } -} - -#[cfg(test)] -mod fixture_tests { - use super::*; - - #[test] - fn numeric_value_resolves_sentinels_and_literals_for_i32() { - assert_eq!( - Fixture::Min.numeric_value(ScalarKind::I32), - Some(-2_147_483_648) - ); - assert_eq!( - Fixture::Max.numeric_value(ScalarKind::I32), - Some(2_147_483_647) - ); - assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I32), Some(0)); - assert_eq!(Fixture::Int(42).numeric_value(ScalarKind::I32), Some(42)); - assert_eq!(Fixture::Int(-1).numeric_value(ScalarKind::I32), Some(-1)); - } - - #[test] - fn numeric_value_resolves_sentinels_per_kind() { - // Sentinels resolve to the kind's bounds; zero is always 0. - assert_eq!(Fixture::Min.numeric_value(ScalarKind::I16), Some(-32_768)); - assert_eq!(Fixture::Max.numeric_value(ScalarKind::I16), Some(32_767)); - assert_eq!( - Fixture::Min.numeric_value(ScalarKind::I64), - Some(-9_223_372_036_854_775_808) - ); - assert_eq!( - Fixture::Max.numeric_value(ScalarKind::I64), - Some(9_223_372_036_854_775_807) - ); - assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I64), Some(0)); - // `Int` resolves verbatim; no runtime range-check here. - assert_eq!( - Fixture::Int(5_000_000_000).numeric_value(ScalarKind::I64), - Some(5_000_000_000) - ); - } - - #[test] - fn numeric_value_is_none_for_string_variants() { - assert_eq!(Fixture::Text("alice").numeric_value(ScalarKind::Text), None); - assert_eq!( - Fixture::Numeric("3.14").numeric_value(ScalarKind::Numeric), - None - ); - assert_eq!( - Fixture::Jsonb(r#"{"a":1}"#).numeric_value(ScalarKind::Jsonb), - None - ); - assert_eq!( - Fixture::Date("1970-01-01").numeric_value(ScalarKind::Date), - None - ); - } - - #[test] - fn render_literal_maps_sentinels() { - assert_eq!(Fixture::Min.render_literal(ScalarKind::I32), "i32::MIN"); - assert_eq!(Fixture::Max.render_literal(ScalarKind::I32), "i32::MAX"); - assert_eq!(Fixture::Zero.render_literal(ScalarKind::I32), "0"); - assert_eq!(Fixture::Min.render_literal(ScalarKind::I16), "i16::MIN"); - assert_eq!(Fixture::Max.render_literal(ScalarKind::I64), "i64::MAX"); - } - - #[test] - fn render_literal_passes_through_numeric() { - assert_eq!(Fixture::Int(-100).render_literal(ScalarKind::I32), "-100"); - assert_eq!(Fixture::Int(9999).render_literal(ScalarKind::I32), "9999"); - assert_eq!( - Fixture::Int(5_000_000_000).render_literal(ScalarKind::I64), - "5000000000" - ); - } - - #[test] - fn render_literal_quotes_string_variants() { - // String-backed kinds render a valid quoted Rust literal. - assert_eq!( - Fixture::Text("alice").render_literal(ScalarKind::Text), - "\"alice\"" - ); - assert_eq!( - Fixture::Numeric("3.14").render_literal(ScalarKind::Numeric), - "\"3.14\"" - ); - assert_eq!( - Fixture::Jsonb(r#"{"a":1}"#).render_literal(ScalarKind::Jsonb), - r#""{\"a\":1}""# - ); - assert_eq!( - Fixture::Date("1970-01-01").render_literal(ScalarKind::Date), - "\"1970-01-01\"" - ); - } - - #[test] - fn fixtures_macro_builds_each_kind() { - // The int arm range-checks at compile time; sentinels + literals mix. - const INTS: &[Fixture] = fixtures!(int i16; Min, N(-1), Zero, N(30000), Max); - assert_eq!( - INTS, - &[ - Fixture::Min, - Fixture::Int(-1), - Fixture::Zero, - Fixture::Int(30000), - Fixture::Max - ] - ); - // The string arms wrap into the matching variant. - const TEXTS: &[Fixture] = fixtures!(text; "alice", "bob"); - assert_eq!(TEXTS, &[Fixture::Text("alice"), Fixture::Text("bob")]); - const NUMS: &[Fixture] = fixtures!(numeric; "0.1", "-2.5"); - assert_eq!(NUMS, &[Fixture::Numeric("0.1"), Fixture::Numeric("-2.5")]); - const JSONS: &[Fixture] = fixtures!(jsonb; r#"{"a":1}"#); - assert_eq!(JSONS, &[Fixture::Jsonb(r#"{"a":1}"#)]); - const DATES: &[Fixture] = fixtures!(date; "1970-01-01", "2099-12-31"); - assert_eq!( - DATES, - &[Fixture::Date("1970-01-01"), Fixture::Date("2099-12-31")] - ); - } - - #[test] - fn fixtures_macro_handles_degenerate_inputs() { - // Empty list — every arm accepts zero elements. - const NO_INT: &[Fixture] = fixtures!(int i32;); - const NO_TEXT: &[Fixture] = fixtures!(text;); - assert_eq!(NO_INT, &[] as &[Fixture]); - assert_eq!(NO_TEXT, &[] as &[Fixture]); - // Trailing comma — int muncher (leading-comma rule) and string arm `$(,)?`. - const TRAILING_INT: &[Fixture] = fixtures!(int i32; Min, N(1),); - const TRAILING_TEXT: &[Fixture] = fixtures!(text; "a",); - assert_eq!(TRAILING_INT, &[Fixture::Min, Fixture::Int(1)]); - assert_eq!(TRAILING_TEXT, &[Fixture::Text("a")]); - // Sentinels-only, no `N(..)`. - const SENTINELS: &[Fixture] = fixtures!(int i32; Min, Zero, Max); - assert_eq!(SENTINELS, &[Fixture::Min, Fixture::Zero, Fixture::Max]); - } -} - -#[cfg(test)] -mod catalog_tests { - use super::*; - - fn scalar(token: &str) -> &'static ScalarSpec { - CATALOG - .iter() - .find(|s| s.token == token) - .unwrap_or_else(|| panic!("{token} missing from CATALOG")) - } - - #[test] - fn catalog_has_int4_int2_int8_date_in_order() { - let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); - assert_eq!(tokens, vec!["int4", "int2", "int8", "date"]); - } - - /// The three temporal matrix pivots must be present verbatim in DATE's - /// fixture strings — `fetch_fixture_payload` fetches each one's ciphertext, - /// failing loudly if absent. The integer `fixtures_include_min_max_and_zero` - /// invariant filters `is_int()` and skips date, so this is its temporal - /// analogue. - #[test] - fn temporal_fixtures_include_pivot_plaintexts() { - let date = scalar("date"); - let strings: Vec<&str> = date - .fixtures - .iter() - .filter_map(|f| match f { - Fixture::Date(s) => Some(*s), - _ => None, - }) - .collect(); - for pivot in ["1900-01-01", "1970-01-01", "2099-12-31"] { - assert!( - strings.contains(&pivot), - "date fixtures missing temporal pivot {pivot}" - ); - } - } - - #[test] - fn all_types_share_the_same_domain_shape() { - // Every scalar declares the same four domains with the same terms; - // only the token differs (the matrix-snapshot collapse depends on this). - // Generic over CATALOG, so it covers every type — including new ones — - // and subsumes the old per-type `_maps_to_*_with_four_domains` / - // `_domain_terms_match_manifest` tests (which only restated the - // catalog literal for one token). - for s in CATALOG { - let shape: Vec<(&str, &[Term])> = - s.domains.iter().map(|d| (d.suffix, d.terms)).collect(); - assert_eq!( - shape, - vec![ - ("", &[] as &[Term]), - ("_eq", &[Term::Hm][..]), - ("_ord_ore", &[Term::Ore][..]), - ("_ord", &[Term::Ore][..]), - ], - "{} has unexpected domain shape", - s.token - ); - } - } - - #[test] - fn every_int_kind_matches_its_rust_type() { - // The kind↔rust-type pairing for every integer scalar, generic over - // CATALOG. Replaces the per-type `_maps_to_iNN` / `_rust_type` - // restatements. - for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let expected = match s.token { - "int2" => ScalarKind::I16, - "int4" => ScalarKind::I32, - "int8" => ScalarKind::I64, - other => panic!("unmapped integer scalar token {other}"), - }; - assert_eq!(s.kind, expected, "{} maps to the wrong kind", s.token); - } - } - - #[test] - fn domain_name_concatenates_token_and_suffix() { - let s = scalar("int4"); - assert_eq!(s.domain_name(&s.domains[0]), "int4"); // storage - assert_eq!(s.domain_name(&s.domains[1]), "int4_eq"); - assert_eq!(s.domain_name(&s.domains[3]), "int4_ord"); - } -} - -#[cfg(test)] -mod values_tests { - use super::*; - - /// Every materialised `_VALUES` array equals its catalog row's fixtures, - /// resolved per kind, in order. Computed from the fixtures — no hardcoded - /// expected array — so it cannot drift and adding a type needs only one - /// `check(&INTx, INTx_VALUES)` line, not a duplicated golden list. Subsumes - /// the old per-type `_values_materialise_to_typed_array` goldens and - /// `materialised_values_track_their_fixture_lists`. - fn check>(spec: &ScalarSpec, values: &[T]) { - assert_eq!( - values.len(), - spec.fixtures.len(), - "{}: value count != fixture count", - spec.token - ); - for (i, (v, f)) in values.iter().zip(spec.fixtures).enumerate() { - assert_eq!( - (*v).into(), - f.numeric_value(spec.kind) - .expect("integer scalar fixture resolves to a number"), - "{}: value[{i}] does not match resolved fixture {f:?}", - spec.token - ); - } - } - - #[test] - fn materialised_values_match_resolved_fixtures() { - check(&INT4, INT4_VALUES); - check(&INT2, INT2_VALUES); - check(&INT8, INT8_VALUES); - } -} - -#[cfg(test)] -mod invariant_tests { - use super::*; - use std::collections::HashMap; - - #[test] - fn every_domain_name_starts_with_its_token() { - for s in CATALOG { - for d in s.domains { - let name = s.domain_name(d); - assert!( - name == s.token || name.starts_with(&format!("{}_", s.token)), - "{name} does not start with token {}", - s.token - ); - } - } - } - - #[test] - fn every_type_has_at_least_one_domain() { - for s in CATALOG { - assert!(!s.domains.is_empty(), "{} has no domains", s.token); - } - } - - /// Cross-kind distinctness key: integer fixtures dedupe by their resolved - /// number, string-backed fixtures by their literal. Generalises the Python - /// distinct-plaintext contract to every scalar kind. - #[derive(Debug, PartialEq, Eq, Hash)] - enum DistinctKey { - Num(i128), - Str(&'static str), - } - - fn distinct_key(f: Fixture, kind: ScalarKind) -> DistinctKey { - match f { - Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { - DistinctKey::Str(s) - } - _ => DistinctKey::Num( - f.numeric_value(kind) - .expect("sentinel/Int fixtures resolve to a number"), - ), - } - } - - #[test] - fn fixtures_include_min_max_and_zero() { - // The MIN/MAX/ZERO pivots are an integer-kind invariant; non-integer - // kinds (text/numeric/jsonb) have no such pivots. - for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let bk = s - .kind - .as_bounded_int() - .expect("loop is filtered to integer kinds"); - let resolved: Vec = s - .fixtures - .iter() - .filter_map(|f| f.numeric_value(s.kind)) - .collect(); - assert!( - resolved.contains(&bk.min_value()), - "{} fixtures missing MIN", - s.token - ); - assert!( - resolved.contains(&bk.max_value()), - "{} fixtures missing MAX", - s.token - ); - assert!(resolved.contains(&0), "{} fixtures missing zero", s.token); - } - } - - #[test] - fn fixture_values_are_distinct_by_resolved_number() { - for s in CATALOG { - let mut seen: HashMap = HashMap::new(); - for f in s.fixtures { - if let Some(prev) = seen.insert(distinct_key(*f, s.kind), *f) { - panic!("{}: {f:?} duplicates {prev:?}", s.token); - } - } - } - } - - #[test] - fn distinct_key_separates_string_fixtures() { - // CATALOG is int-only, so the `Str` path is otherwise unexercised. - assert_eq!( - distinct_key(Fixture::Text("a"), ScalarKind::Text), - distinct_key(Fixture::Text("a"), ScalarKind::Text) - ); - assert_ne!( - distinct_key(Fixture::Text("a"), ScalarKind::Text), - distinct_key(Fixture::Text("b"), ScalarKind::Text) - ); - assert_eq!( - distinct_key(Fixture::Numeric("x"), ScalarKind::Numeric), - distinct_key(Fixture::Jsonb("x"), ScalarKind::Jsonb) - ); - // Str and Num keys never collide. - assert_ne!( - distinct_key(Fixture::Text("0"), ScalarKind::Text), - distinct_key(Fixture::Zero, ScalarKind::I32) - ); - } - - #[test] - fn every_fixture_value_is_within_kind_bounds() { - // Asserts the resolved sentinels stay within bounds (integer kinds only). - for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let bk = s - .kind - .as_bounded_int() - .expect("loop is filtered to integer kinds"); - let (lo, hi) = (bk.min_value(), bk.max_value()); - for f in s.fixtures { - let Some(n) = f.numeric_value(s.kind) else { - continue; - }; - assert!( - n >= lo && n <= hi, - "{}: fixture {f:?} resolves to {n}, out of range [{lo}, {hi}]", - s.token - ); - } - } - } - - #[test] - fn helper_outputs_match_for_known_domains() { - // Cross-check the Term helpers against a known domain shape on int4. - let s = CATALOG.iter().find(|s| s.token == "int4").unwrap(); - // storage domain: no terms. - assert_eq!(Term::role_for_terms(s.domains[0].terms), "storage"); - assert!(Term::operators_for_terms(s.domains[0].terms).is_empty()); - // _eq domain: hm => equality only. - assert_eq!(Term::role_for_terms(s.domains[1].terms), "eq"); - assert_eq!( - Term::operators_for_terms(s.domains[1].terms), - vec!["=", "<>"] - ); - assert_eq!(Term::term_json_keys(s.domains[1].terms), vec!["hm"]); - // _ord domain: ore => full ordering. - assert_eq!(Term::role_for_terms(s.domains[3].terms), "ord"); - assert_eq!( - Term::operators_for_terms(s.domains[3].terms), - vec!["=", "<>", "<", "<=", ">", ">="] - ); - assert_eq!(Term::term_json_keys(s.domains[3].terms), vec!["ob"]); - assert_eq!( - Term::extractor_for_operator(s.domains[3].terms, "<"), - Some("ord_term") - ); - } -} +mod tests; diff --git a/crates/eql-scalars/src/spec.rs b/crates/eql-scalars/src/spec.rs new file mode 100644 index 000000000..8c4143ed8 --- /dev/null +++ b/crates/eql-scalars/src/spec.rs @@ -0,0 +1,21 @@ +//! Inherent impls for [`ScalarSpec`] — the per-type helpers `domain_name` +//! (token + suffix) and `is_eq_only` (no `_ord` domain). Definitions for +//! [`ScalarSpec`] and [`DomainSpec`] live in `lib.rs`. + +use crate::{DomainSpec, ScalarSpec}; + +impl ScalarSpec { + /// The fully-qualified domain name: `token` + `suffix`. Makes the old + /// "domain name must start with the token" validation structural. + pub fn domain_name(&self, domain: &DomainSpec) -> String { + format!("{}{}", self.token, domain.suffix) + } + + /// True when this type declares no ordered (`_ord`) domain — i.e. equality-only + /// (storage + `_eq`). Replaces the future `[eq_only]` marker: the domain set + /// already carries this. The `_ord_ore` twin only appears alongside `_ord`, so + /// testing `_ord` suffices. + pub fn is_eq_only(&self) -> bool { + !self.domains.iter().any(|d| d.suffix == "_ord") + } +} diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-scalars/src/term.rs new file mode 100644 index 000000000..eee366cba --- /dev/null +++ b/crates/eql-scalars/src/term.rs @@ -0,0 +1,106 @@ +//! Inherent impls for [`Term`] — the per-term SQL contract (`json_key`, +//! `extractor`, `ctor`, `role`, `operators`, `requires`) plus the cross-term +//! helpers that resolve a domain's `&[Term]` to its operators, keys, requires, +//! role, and extractor. Definition lives in `lib.rs`. + +use crate::Term; + +impl Term { + /// JSON payload key carrying this term (`"hm"` / `"ob"`). + pub const fn json_key(self) -> &'static str { + match self { + Term::Hm => "hm", + Term::Ore => "ob", + } + } + + /// The generated extractor function name (`"eq_term"` / `"ord_term"`). + pub const fn extractor(self) -> &'static str { + match self { + Term::Hm => "eq_term", + Term::Ore => "ord_term", + } + } + + /// Constructor name for the index-term type (unqualified). + pub const fn ctor(self) -> &'static str { + match self { + Term::Hm => "hmac_256", + Term::Ore => "ore_block_u64_8_256", + } + } + + /// Generated-file role label for a domain whose first term is this one. + pub const fn role(self) -> &'static str { + match self { + Term::Hm => "eq", + Term::Ore => "ord", + } + } + + /// SQL operators this term supports, in catalog order. + pub const fn operators(self) -> &'static [&'static str] { + match self { + Term::Hm => &["=", "<>"], + Term::Ore => &["=", "<>", "<", "<=", ">", ">="], + } + } + + /// SQL `-- REQUIRE:` edges this term pulls in, in catalog order. + pub const fn requires(self) -> &'static [&'static str] { + match self { + Term::Hm => &["src/v3/sem/hmac_256/functions.sql"], + Term::Ore => &[ + "src/v3/sem/ore_block_u64_8_256/functions.sql", + "src/v3/sem/ore_block_u64_8_256/operators.sql", + ], + } + } +} + +impl Term { + /// Stable dedupe — first occurrence wins. + fn dedupe_preserving_order<'a>(items: impl IntoIterator) -> Vec<&'a str> { + let mut out: Vec<&'a str> = Vec::new(); + for item in items { + if !out.contains(&item) { + out.push(item); + } + } + out + } + + /// Supported operators for the union of a domain's terms (catalog order, + /// deduped). + pub fn operators_for_terms(terms: &[Term]) -> Vec<&'static str> { + Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.operators().iter().copied())) + } + + /// JSON payload keys required by these terms (deduped, in order). + pub fn term_json_keys(terms: &[Term]) -> Vec<&'static str> { + Self::dedupe_preserving_order(terms.iter().map(|t| t.json_key())) + } + + /// SQL `-- REQUIRE:` edges needed by these terms (deduped, in order). + pub fn term_requires(terms: &[Term]) -> Vec<&'static str> { + Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.requires().iter().copied())) + } + + /// The extractor that supports `op` for a domain carrying `terms`, or + /// `None`. First supporting term wins. + pub fn extractor_for_operator(terms: &[Term], op: &str) -> Option<&'static str> { + terms + .iter() + .find(|t| t.operators().contains(&op)) + .map(|t| t.extractor()) + } + + /// Generated-file role label for a domain with these terms. No terms => + /// `"storage"`; otherwise the first term's role. + pub fn role_for_terms(terms: &[Term]) -> &'static str { + match terms.first() { + None => "storage", + Some(t) => t.role(), + } + } +} diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs new file mode 100644 index 000000000..557a9bd00 --- /dev/null +++ b/crates/eql-scalars/src/tests.rs @@ -0,0 +1,675 @@ +//! Unit tests for the scalar/term catalog. Kept as one `#[cfg(test)]` module +//! (declared from `lib.rs`) rather than co-located with each impl file because +//! `rust_tests` spans `BoundedIntKind` + `ScalarKind` + `Fixture` + +//! `ScalarSpec`. Each inner module imports the crate-root catalog with +//! `use crate::*;`; the crate-local `fixtures!` macro is in scope here by textual +//! scoping (this module is declared after the macro definition in `lib.rs`). + +mod rust_tests { + use crate::*; + + #[test] + fn bounded_int_kind_accessors_are_total() { + assert_eq!(BoundedIntKind::I16.rust_type(), "i16"); + assert_eq!(BoundedIntKind::I16.min_symbol(), "i16::MIN"); + assert_eq!(BoundedIntKind::I16.max_symbol(), "i16::MAX"); + assert_eq!(BoundedIntKind::I16.zero_symbol(), "0"); + assert_eq!(BoundedIntKind::I16.min_value(), -32_768_i128); + assert_eq!(BoundedIntKind::I16.max_value(), 32_767_i128); + + assert_eq!(BoundedIntKind::I32.min_symbol(), "i32::MIN"); + assert_eq!(BoundedIntKind::I32.min_value(), -2_147_483_648_i128); + assert_eq!(BoundedIntKind::I32.max_value(), 2_147_483_647_i128); + + assert_eq!(BoundedIntKind::I64.max_symbol(), "i64::MAX"); + assert_eq!( + BoundedIntKind::I64.min_value(), + -9_223_372_036_854_775_808_i128 + ); + assert_eq!( + BoundedIntKind::I64.max_value(), + 9_223_372_036_854_775_807_i128 + ); + } + + #[test] + fn as_bounded_int_maps_integer_kinds_only() { + assert_eq!(ScalarKind::I16.as_bounded_int(), Some(BoundedIntKind::I16)); + assert_eq!(ScalarKind::I32.as_bounded_int(), Some(BoundedIntKind::I32)); + assert_eq!(ScalarKind::I64.as_bounded_int(), Some(BoundedIntKind::I64)); + assert_eq!(ScalarKind::Numeric.as_bounded_int(), None); + assert_eq!(ScalarKind::Text.as_bounded_int(), None); + assert_eq!(ScalarKind::Jsonb.as_bounded_int(), None); + assert_eq!(ScalarKind::Date.as_bounded_int(), None); + } + + #[test] + fn i32_facts_match_int4() { + assert_eq!(ScalarKind::I32.rust_type(), "i32"); + let k = ScalarKind::I32 + .as_bounded_int() + .expect("I32 is an integer kind"); + assert_eq!(k.min_symbol(), "i32::MIN"); + assert_eq!(k.max_symbol(), "i32::MAX"); + assert_eq!(k.zero_symbol(), "0"); + assert_eq!(k.min_value(), -2_147_483_648_i128); + assert_eq!(k.max_value(), 2_147_483_647_i128); + } + + #[test] + fn i16_facts_match_int2() { + assert_eq!(ScalarKind::I16.rust_type(), "i16"); + let k = ScalarKind::I16 + .as_bounded_int() + .expect("I16 is an integer kind"); + assert_eq!(k.min_symbol(), "i16::MIN"); + assert_eq!(k.max_symbol(), "i16::MAX"); + assert_eq!(k.zero_symbol(), "0"); + assert_eq!(k.min_value(), -32_768_i128); + assert_eq!(k.max_value(), 32_767_i128); + } + + #[test] + fn is_int_classifies_kinds() { + assert!(ScalarKind::I16.is_int()); + assert!(ScalarKind::I32.is_int()); + assert!(ScalarKind::I64.is_int()); + assert!(!ScalarKind::Numeric.is_int()); + assert!(!ScalarKind::Text.is_int()); + assert!(!ScalarKind::Jsonb.is_int()); + assert!(!ScalarKind::Date.is_int()); + } + + #[test] + fn i64_facts() { + // Capability-layer fact: i64 is the Rust kind a future int8 maps onto. + // Present here so adding int8 later is a pure `CATALOG` append. + assert_eq!(ScalarKind::I64.rust_type(), "i64"); + let k = ScalarKind::I64 + .as_bounded_int() + .expect("I64 is an integer kind"); + assert_eq!(k.min_symbol(), "i64::MIN"); + assert_eq!(k.max_symbol(), "i64::MAX"); + assert_eq!(k.zero_symbol(), "0"); + assert_eq!(k.min_value(), -9_223_372_036_854_775_808_i128); + assert_eq!(k.max_value(), 9_223_372_036_854_775_807_i128); + } + + #[test] + fn date_maps_to_naive_date() { + // Ordered, non-integer kind: it carries a rust type but no i128 range, + // so it is not `is_int()` and `as_bounded_int()` returns `None` — the + // bounded accessors are simply not reachable for it. + assert_eq!(ScalarKind::Date.rust_type(), "chrono::NaiveDate"); + assert!(!ScalarKind::Date.is_int()); + assert_eq!(ScalarKind::Date.as_bounded_int(), None); + } + + /// The structural guarantee that replaces the old runtime panics: a + /// `Min`/`Max`/`Zero` pivot sentinel may only appear in a `CATALOG` row whose + /// kind is an integer kind. `render_literal` would `expect`-panic and + /// `numeric_value` would resolve to `None` for a pivot on a non-integer kind; + /// this test makes such a row a test failure at the source of truth. + #[test] + fn pivot_sentinels_only_appear_with_integer_kinds() { + for spec in CATALOG { + for fixture in spec.fixtures { + if matches!(fixture, Fixture::Min | Fixture::Max | Fixture::Zero) { + assert!( + spec.kind.is_int(), + "pivot sentinel {fixture:?} on non-integer kind {:?} (token `{}`)", + spec.kind, + spec.token, + ); + } + } + } + } + + #[test] + fn is_temporal_classifies_chrono_kinds() { + assert!(ScalarKind::Date.is_temporal()); + assert!(!ScalarKind::I16.is_temporal()); + assert!(!ScalarKind::I32.is_temporal()); + assert!(!ScalarKind::I64.is_temporal()); + // Timestamptz arrives in Phase 5; assert it here once present. + } + + #[test] + fn is_eq_only_detects_absence_of_ord_domains() { + let int4 = CATALOG.iter().find(|s| s.token == "int4").unwrap(); + assert!(!int4.is_eq_only(), "int4 is ordered"); + let date = CATALOG.iter().find(|s| s.token == "date").unwrap(); + assert!(!date.is_eq_only(), "date is ordered"); + } +} + +mod term_tests { + use crate::*; + + #[test] + fn hm_term_provides_equality() { + let hm = Term::Hm; + assert_eq!(hm.json_key(), "hm"); + assert_eq!(hm.extractor(), "eq_term"); + assert_eq!(hm.ctor(), "hmac_256"); + assert_eq!(hm.role(), "eq"); + assert_eq!(hm.operators(), &["=", "<>"]); + assert_eq!(hm.requires(), &["src/v3/sem/hmac_256/functions.sql"]); + } + + #[test] + fn ore_term_preserves_int4_sql_contract() { + let ore = Term::Ore; + assert_eq!(ore.json_key(), "ob"); + assert_eq!(ore.extractor(), "ord_term"); + assert_eq!(ore.ctor(), "ore_block_u64_8_256"); + assert_eq!(ore.role(), "ord"); + assert_eq!(ore.operators(), &["=", "<>", "<", "<=", ">", ">="]); + assert_eq!( + ore.requires(), + &[ + "src/v3/sem/ore_block_u64_8_256/functions.sql", + "src/v3/sem/ore_block_u64_8_256/operators.sql", + ] + ); + } +} + +mod term_helper_tests { + use crate::*; + + #[test] + fn operators_are_union_in_catalog_order() { + // ore then hm: ore's six ops first, hm adds nothing new. + assert_eq!( + Term::operators_for_terms(&[Term::Ore, Term::Hm]), + vec!["=", "<>", "<", "<=", ">", ">="] + ); + } + + #[test] + fn operators_for_terms_handles_empty() { + assert!(Term::operators_for_terms(&[]).is_empty()); + } + + #[test] + fn json_keys_come_from_catalog() { + assert_eq!( + Term::term_json_keys(&[Term::Hm, Term::Ore]), + vec!["hm", "ob"] + ); + assert!(Term::term_json_keys(&[]).is_empty()); + } + + #[test] + fn requires_are_deduplicated_in_order() { + assert_eq!( + Term::term_requires(&[Term::Ore, Term::Ore, Term::Hm]), + vec![ + "src/v3/sem/ore_block_u64_8_256/functions.sql", + "src/v3/sem/ore_block_u64_8_256/operators.sql", + "src/v3/sem/hmac_256/functions.sql", + ] + ); + assert!(Term::term_requires(&[]).is_empty()); + } + + #[test] + fn role_for_terms_handles_storage_eq_ord() { + assert_eq!(Term::role_for_terms(&[]), "storage"); + assert_eq!(Term::role_for_terms(&[Term::Hm]), "eq"); + assert_eq!(Term::role_for_terms(&[Term::Ore]), "ord"); + } + + #[test] + fn extractor_for_operator_picks_first_supporting_term() { + assert_eq!( + Term::extractor_for_operator(&[Term::Hm], "="), + Some("eq_term") + ); + assert_eq!( + Term::extractor_for_operator(&[Term::Ore], "<"), + Some("ord_term") + ); + assert_eq!( + Term::extractor_for_operator(&[Term::Hm, Term::Ore], "="), + Some("eq_term") + ); + assert_eq!( + Term::extractor_for_operator(&[Term::Hm, Term::Ore], "<"), + Some("ord_term") + ); + } + + #[test] + fn extractor_for_operator_none_when_unsupported() { + assert_eq!(Term::extractor_for_operator(&[Term::Hm], "<"), None); + assert_eq!(Term::extractor_for_operator(&[], "="), None); + } +} + +mod fixture_tests { + use crate::*; + + #[test] + fn numeric_value_resolves_sentinels_and_literals_for_i32() { + assert_eq!( + Fixture::Min.numeric_value(ScalarKind::I32), + Some(-2_147_483_648) + ); + assert_eq!( + Fixture::Max.numeric_value(ScalarKind::I32), + Some(2_147_483_647) + ); + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I32), Some(0)); + assert_eq!(Fixture::Int(42).numeric_value(ScalarKind::I32), Some(42)); + assert_eq!(Fixture::Int(-1).numeric_value(ScalarKind::I32), Some(-1)); + } + + #[test] + fn numeric_value_resolves_sentinels_per_kind() { + // Sentinels resolve to the kind's bounds; zero is always 0. + assert_eq!(Fixture::Min.numeric_value(ScalarKind::I16), Some(-32_768)); + assert_eq!(Fixture::Max.numeric_value(ScalarKind::I16), Some(32_767)); + assert_eq!( + Fixture::Min.numeric_value(ScalarKind::I64), + Some(-9_223_372_036_854_775_808) + ); + assert_eq!( + Fixture::Max.numeric_value(ScalarKind::I64), + Some(9_223_372_036_854_775_807) + ); + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::I64), Some(0)); + // `Int` resolves verbatim; no runtime range-check here. + assert_eq!( + Fixture::Int(5_000_000_000).numeric_value(ScalarKind::I64), + Some(5_000_000_000) + ); + } + + #[test] + fn numeric_value_is_none_for_string_variants() { + assert_eq!(Fixture::Text("alice").numeric_value(ScalarKind::Text), None); + assert_eq!( + Fixture::Numeric("3.14").numeric_value(ScalarKind::Numeric), + None + ); + assert_eq!( + Fixture::Jsonb(r#"{"a":1}"#).numeric_value(ScalarKind::Jsonb), + None + ); + assert_eq!( + Fixture::Date("1970-01-01").numeric_value(ScalarKind::Date), + None + ); + } + + #[test] + fn render_literal_maps_sentinels() { + assert_eq!(Fixture::Min.render_literal(ScalarKind::I32), "i32::MIN"); + assert_eq!(Fixture::Max.render_literal(ScalarKind::I32), "i32::MAX"); + assert_eq!(Fixture::Zero.render_literal(ScalarKind::I32), "0"); + assert_eq!(Fixture::Min.render_literal(ScalarKind::I16), "i16::MIN"); + assert_eq!(Fixture::Max.render_literal(ScalarKind::I64), "i64::MAX"); + } + + #[test] + fn render_literal_passes_through_numeric() { + assert_eq!(Fixture::Int(-100).render_literal(ScalarKind::I32), "-100"); + assert_eq!(Fixture::Int(9999).render_literal(ScalarKind::I32), "9999"); + assert_eq!( + Fixture::Int(5_000_000_000).render_literal(ScalarKind::I64), + "5000000000" + ); + } + + #[test] + fn render_literal_quotes_string_variants() { + // String-backed kinds render a valid quoted Rust literal. + assert_eq!( + Fixture::Text("alice").render_literal(ScalarKind::Text), + "\"alice\"" + ); + assert_eq!( + Fixture::Numeric("3.14").render_literal(ScalarKind::Numeric), + "\"3.14\"" + ); + assert_eq!( + Fixture::Jsonb(r#"{"a":1}"#).render_literal(ScalarKind::Jsonb), + r#""{\"a\":1}""# + ); + assert_eq!( + Fixture::Date("1970-01-01").render_literal(ScalarKind::Date), + "\"1970-01-01\"" + ); + } + + #[test] + fn fixtures_macro_builds_each_kind() { + // The int arm range-checks at compile time; sentinels + literals mix. + const INTS: &[Fixture] = fixtures!(int i16; Min, N(-1), Zero, N(30000), Max); + assert_eq!( + INTS, + &[ + Fixture::Min, + Fixture::Int(-1), + Fixture::Zero, + Fixture::Int(30000), + Fixture::Max + ] + ); + // The string arms wrap into the matching variant. + const TEXTS: &[Fixture] = fixtures!(text; "alice", "bob"); + assert_eq!(TEXTS, &[Fixture::Text("alice"), Fixture::Text("bob")]); + const NUMS: &[Fixture] = fixtures!(numeric; "0.1", "-2.5"); + assert_eq!(NUMS, &[Fixture::Numeric("0.1"), Fixture::Numeric("-2.5")]); + const JSONS: &[Fixture] = fixtures!(jsonb; r#"{"a":1}"#); + assert_eq!(JSONS, &[Fixture::Jsonb(r#"{"a":1}"#)]); + const DATES: &[Fixture] = fixtures!(date; "1970-01-01", "2099-12-31"); + assert_eq!( + DATES, + &[Fixture::Date("1970-01-01"), Fixture::Date("2099-12-31")] + ); + } + + #[test] + fn fixtures_macro_handles_degenerate_inputs() { + // Empty list — every arm accepts zero elements. + const NO_INT: &[Fixture] = fixtures!(int i32;); + const NO_TEXT: &[Fixture] = fixtures!(text;); + assert_eq!(NO_INT, &[] as &[Fixture]); + assert_eq!(NO_TEXT, &[] as &[Fixture]); + // Trailing comma — int muncher (leading-comma rule) and string arm `$(,)?`. + const TRAILING_INT: &[Fixture] = fixtures!(int i32; Min, N(1),); + const TRAILING_TEXT: &[Fixture] = fixtures!(text; "a",); + assert_eq!(TRAILING_INT, &[Fixture::Min, Fixture::Int(1)]); + assert_eq!(TRAILING_TEXT, &[Fixture::Text("a")]); + // Sentinels-only, no `N(..)`. + const SENTINELS: &[Fixture] = fixtures!(int i32; Min, Zero, Max); + assert_eq!(SENTINELS, &[Fixture::Min, Fixture::Zero, Fixture::Max]); + } +} + +mod catalog_tests { + use crate::*; + + fn scalar(token: &str) -> &'static ScalarSpec { + CATALOG + .iter() + .find(|s| s.token == token) + .unwrap_or_else(|| panic!("{token} missing from CATALOG")) + } + + #[test] + fn catalog_has_int4_int2_int8_date_in_order() { + let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); + assert_eq!(tokens, vec!["int4", "int2", "int8", "date"]); + } + + /// The three temporal matrix pivots must be present verbatim in DATE's + /// fixture strings — `fetch_fixture_payload` fetches each one's ciphertext, + /// failing loudly if absent. The integer `fixtures_include_min_max_and_zero` + /// invariant filters `is_int()` and skips date, so this is its temporal + /// analogue. + #[test] + fn temporal_fixtures_include_pivot_plaintexts() { + let date = scalar("date"); + let strings: Vec<&str> = date + .fixtures + .iter() + .filter_map(|f| match f { + Fixture::Date(s) => Some(*s), + _ => None, + }) + .collect(); + for pivot in ["1900-01-01", "1970-01-01", "2099-12-31"] { + assert!( + strings.contains(&pivot), + "date fixtures missing temporal pivot {pivot}" + ); + } + } + + #[test] + fn all_types_share_the_same_domain_shape() { + // Every scalar declares the same four domains with the same terms; + // only the token differs (the matrix-snapshot collapse depends on this). + // Generic over CATALOG, so it covers every type — including new ones — + // and subsumes the old per-type `_maps_to_*_with_four_domains` / + // `_domain_terms_match_manifest` tests (which only restated the + // catalog literal for one token). + for s in CATALOG { + let shape: Vec<(&str, &[Term])> = + s.domains.iter().map(|d| (d.suffix, d.terms)).collect(); + assert_eq!( + shape, + vec![ + ("", &[] as &[Term]), + ("_eq", &[Term::Hm][..]), + ("_ord_ore", &[Term::Ore][..]), + ("_ord", &[Term::Ore][..]), + ], + "{} has unexpected domain shape", + s.token + ); + } + } + + #[test] + fn every_int_kind_matches_its_rust_type() { + // The kind↔rust-type pairing for every integer scalar, generic over + // CATALOG. Replaces the per-type `_maps_to_iNN` / `_rust_type` + // restatements. + for s in CATALOG.iter().filter(|s| s.kind.is_int()) { + let expected = match s.token { + "int2" => ScalarKind::I16, + "int4" => ScalarKind::I32, + "int8" => ScalarKind::I64, + other => panic!("unmapped integer scalar token {other}"), + }; + assert_eq!(s.kind, expected, "{} maps to the wrong kind", s.token); + } + } + + #[test] + fn domain_name_concatenates_token_and_suffix() { + let s = scalar("int4"); + assert_eq!(s.domain_name(&s.domains[0]), "int4"); // storage + assert_eq!(s.domain_name(&s.domains[1]), "int4_eq"); + assert_eq!(s.domain_name(&s.domains[3]), "int4_ord"); + } +} + +mod values_tests { + use crate::*; + + /// Every materialised `_VALUES` array equals its catalog row's fixtures, + /// resolved per kind, in order. Computed from the fixtures — no hardcoded + /// expected array — so it cannot drift and adding a type needs only one + /// `check(&INTx, INTx_VALUES)` line, not a duplicated golden list. Subsumes + /// the old per-type `_values_materialise_to_typed_array` goldens and + /// `materialised_values_track_their_fixture_lists`. + fn check>(spec: &ScalarSpec, values: &[T]) { + assert_eq!( + values.len(), + spec.fixtures.len(), + "{}: value count != fixture count", + spec.token + ); + for (i, (v, f)) in values.iter().zip(spec.fixtures).enumerate() { + assert_eq!( + (*v).into(), + f.numeric_value(spec.kind) + .expect("integer scalar fixture resolves to a number"), + "{}: value[{i}] does not match resolved fixture {f:?}", + spec.token + ); + } + } + + #[test] + fn materialised_values_match_resolved_fixtures() { + check(&INT4, INT4_VALUES); + check(&INT2, INT2_VALUES); + check(&INT8, INT8_VALUES); + } +} + +mod invariant_tests { + use crate::*; + use std::collections::HashMap; + + #[test] + fn every_domain_name_starts_with_its_token() { + for s in CATALOG { + for d in s.domains { + let name = s.domain_name(d); + assert!( + name == s.token || name.starts_with(&format!("{}_", s.token)), + "{name} does not start with token {}", + s.token + ); + } + } + } + + #[test] + fn every_type_has_at_least_one_domain() { + for s in CATALOG { + assert!(!s.domains.is_empty(), "{} has no domains", s.token); + } + } + + /// Cross-kind distinctness key: integer fixtures dedupe by their resolved + /// number, string-backed fixtures by their literal. Generalises the Python + /// distinct-plaintext contract to every scalar kind. + #[derive(Debug, PartialEq, Eq, Hash)] + enum DistinctKey { + Num(i128), + Str(&'static str), + } + + fn distinct_key(f: Fixture, kind: ScalarKind) -> DistinctKey { + match f { + Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { + DistinctKey::Str(s) + } + _ => DistinctKey::Num( + f.numeric_value(kind) + .expect("sentinel/Int fixtures resolve to a number"), + ), + } + } + + #[test] + fn fixtures_include_min_max_and_zero() { + // The MIN/MAX/ZERO pivots are an integer-kind invariant; non-integer + // kinds (text/numeric/jsonb) have no such pivots. + for s in CATALOG.iter().filter(|s| s.kind.is_int()) { + let bk = s + .kind + .as_bounded_int() + .expect("loop is filtered to integer kinds"); + let resolved: Vec = s + .fixtures + .iter() + .filter_map(|f| f.numeric_value(s.kind)) + .collect(); + assert!( + resolved.contains(&bk.min_value()), + "{} fixtures missing MIN", + s.token + ); + assert!( + resolved.contains(&bk.max_value()), + "{} fixtures missing MAX", + s.token + ); + assert!(resolved.contains(&0), "{} fixtures missing zero", s.token); + } + } + + #[test] + fn fixture_values_are_distinct_by_resolved_number() { + for s in CATALOG { + let mut seen: HashMap = HashMap::new(); + for f in s.fixtures { + if let Some(prev) = seen.insert(distinct_key(*f, s.kind), *f) { + panic!("{}: {f:?} duplicates {prev:?}", s.token); + } + } + } + } + + #[test] + fn distinct_key_separates_string_fixtures() { + // CATALOG is int-only, so the `Str` path is otherwise unexercised. + assert_eq!( + distinct_key(Fixture::Text("a"), ScalarKind::Text), + distinct_key(Fixture::Text("a"), ScalarKind::Text) + ); + assert_ne!( + distinct_key(Fixture::Text("a"), ScalarKind::Text), + distinct_key(Fixture::Text("b"), ScalarKind::Text) + ); + assert_eq!( + distinct_key(Fixture::Numeric("x"), ScalarKind::Numeric), + distinct_key(Fixture::Jsonb("x"), ScalarKind::Jsonb) + ); + // Str and Num keys never collide. + assert_ne!( + distinct_key(Fixture::Text("0"), ScalarKind::Text), + distinct_key(Fixture::Zero, ScalarKind::I32) + ); + } + + #[test] + fn every_fixture_value_is_within_kind_bounds() { + // Asserts the resolved sentinels stay within bounds (integer kinds only). + for s in CATALOG.iter().filter(|s| s.kind.is_int()) { + let bk = s + .kind + .as_bounded_int() + .expect("loop is filtered to integer kinds"); + let (lo, hi) = (bk.min_value(), bk.max_value()); + for f in s.fixtures { + let Some(n) = f.numeric_value(s.kind) else { + continue; + }; + assert!( + n >= lo && n <= hi, + "{}: fixture {f:?} resolves to {n}, out of range [{lo}, {hi}]", + s.token + ); + } + } + } + + #[test] + fn helper_outputs_match_for_known_domains() { + // Cross-check the Term helpers against a known domain shape on int4. + let s = CATALOG.iter().find(|s| s.token == "int4").unwrap(); + // storage domain: no terms. + assert_eq!(Term::role_for_terms(s.domains[0].terms), "storage"); + assert!(Term::operators_for_terms(s.domains[0].terms).is_empty()); + // _eq domain: hm => equality only. + assert_eq!(Term::role_for_terms(s.domains[1].terms), "eq"); + assert_eq!( + Term::operators_for_terms(s.domains[1].terms), + vec!["=", "<>"] + ); + assert_eq!(Term::term_json_keys(s.domains[1].terms), vec!["hm"]); + // _ord domain: ore => full ordering. + assert_eq!(Term::role_for_terms(s.domains[3].terms), "ord"); + assert_eq!( + Term::operators_for_terms(s.domains[3].terms), + vec!["=", "<>", "<", "<=", ">", ">="] + ); + assert_eq!(Term::term_json_keys(s.domains[3].terms), vec!["ob"]); + assert_eq!( + Term::extractor_for_operator(s.domains[3].terms, "<"), + Some("ord_term") + ); + } +} From 11efda9abc3d3252903a4c68bda752237899a2d0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 16:16:18 +1000 Subject: [PATCH 109/599] docs(eql-scalars): correct ScalarKind::rust_type docstring The docstring claimed all returned strings are Rust type names as they appear in generated source, but Numeric/Text/Jsonb return SQL tokens (numeric/text/jsonb) and have no generated surface. Clarify that only I16/I32/I64/Date return canonical Rust type names and the rest are placeholders, and note the sole call site (tests.rs). --- crates/eql-scalars/src/kind.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-scalars/src/kind.rs index 9116ec38f..3b3d72fac 100644 --- a/crates/eql-scalars/src/kind.rs +++ b/crates/eql-scalars/src/kind.rs @@ -85,7 +85,13 @@ impl ScalarKind { matches!(self, ScalarKind::Date) } - /// The Rust type name as it appears in generated source (e.g. `"i32"`). + /// A debug/identifier string for the kind. For the codegen-supported kinds + /// (`I16`/`I32`/`I64`/`Date`) this is the canonical Rust plaintext type name + /// (`"i32"`, `"chrono::NaiveDate"`). For the not-yet-wired kinds + /// (`Numeric`/`Text`/`Jsonb`) it returns the SQL/type token (`"numeric"`, + /// `"text"`, `"jsonb"`) as a placeholder — those variants have no generated + /// surface, so the string is not consumed by codegen. Only call site is + /// `crates/eql-scalars/src/tests.rs`. pub const fn rust_type(self) -> &'static str { match self { ScalarKind::I16 => "i16", From 2848b338cd68b2d3c9b67e03f22842b8a458fc00 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 5 Jun 2026 17:19:13 +1000 Subject: [PATCH 110/599] feat(v3/sem): pin ORE comparators IMMUTABLE + T8 regression test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three compare_ore_block_u64_8_256_term(s) overloads (term×term, term[]×term[], composite×composite) are now IMMUTABLE, diverging from the v2 originals which default to VOLATILE. The comparison is deterministic — its only crypto call, pgcrypto encrypt(), is IMMUTABLE — so the planner can fold/cache in ordering and index contexts. NOT STRICT: the NULL-handling branches are load-bearing. T8 (family::sem::ore_comparators_are_immutable) asserts exactly 3 overloads exist and all have provolatile = 'i', so a silent regression to VOLATILE fails CI. --- src/v3/sem/ore_block_u64_8_256/functions.sql | 10 +++++ tests/sqlx/src/fixtures/cipherstash.rs | 10 ++--- .../sqlx/tests/encrypted_domain/family/sem.rs | 43 +++++++++++++++++++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/v3/sem/ore_block_u64_8_256/functions.sql b/src/v3/sem/ore_block_u64_8_256/functions.sql index ccc6a817b..f2e155a95 100644 --- a/src/v3/sem/ore_block_u64_8_256/functions.sql +++ b/src/v3/sem/ore_block_u64_8_256/functions.sql @@ -89,8 +89,16 @@ $$ LANGUAGE plpgsql; --! @param b eql_v3.ore_block_u64_8_256_term Second ORE term --! @return integer -1 if a < b, 0 if a = b, 1 if a > b --! @throws Exception if ciphertexts are different lengths +--! @note Marked `IMMUTABLE` (the three `compare_ore_block_u64_8_256_term(s)` +--! overloads all are). This deliberately diverges from the v2 originals, +--! which carry no volatility marker and so default to `VOLATILE`. The +--! comparison is deterministic — its only crypto call, pgcrypto `encrypt()`, +--! is itself `IMMUTABLE STRICT PARALLEL SAFE` — so `IMMUTABLE` lets the +--! planner fold/cache these in ordering and index contexts. NOT `STRICT`: +--! the NULL-handling branches below are load-bearing for the array overload. CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_term(a eql_v3.ore_block_u64_8_256_term, b eql_v3.ore_block_u64_8_256_term) RETURNS integer + IMMUTABLE SET search_path = pg_catalog, extensions, public AS $$ DECLARE @@ -169,6 +177,7 @@ $$ LANGUAGE plpgsql; --! @return integer -1/0/1, or NULL if either array is NULL CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256_term[], b eql_v3.ore_block_u64_8_256_term[]) RETURNS integer + IMMUTABLE SET search_path = pg_catalog, extensions, public AS $$ DECLARE @@ -208,6 +217,7 @@ $$ LANGUAGE plpgsql; --! @return integer -1/0/1 CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) RETURNS integer + IMMUTABLE SET search_path = pg_catalog, extensions, public AS $$ BEGIN diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index 22e552fa2..aa3a26afb 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -52,6 +52,11 @@ async fn build_cipher() -> Result>> { Ok(Arc::new(cipher)) } +/// The single encrypted-payload column name. Single-sourced here so the +/// `ColumnConfig` built for encryption and the `INSERT` target column in the +/// driver cannot drift apart. +pub const PAYLOAD_COLUMN: &str = "payload"; + /// Build a `ColumnConfig` from the fixture spec's index list + cast. /// /// `IndexKind` is a typed enum — every value is a real EQL index by @@ -59,11 +64,6 @@ async fn build_cipher() -> Result>> { /// fail on an unknown index name. Extending fixture coverage to a new /// index is one variant on `IndexKind` plus one arm here, both compile- /// time checked. -/// The single encrypted-payload column name. Single-sourced here so the -/// `ColumnConfig` built for encryption and the `INSERT` target column in the -/// driver cannot drift apart. -pub const PAYLOAD_COLUMN: &str = "payload"; - pub fn column_config_for(spec_indexes: &[IndexKind], cast: Cast) -> Result { let column_type = cast_to_column_type(cast)?; let mut config = ColumnConfig::build(PAYLOAD_COLUMN).casts_as(column_type); diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index b7d2543c0..8329a0999 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -393,3 +393,46 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { Ok(()) } + +/// T8 — Volatility pin: all three `compare_ore_block_u64_8_256_term(s)` overloads +/// (term×term, term[]×term[], composite×composite) must be `IMMUTABLE` +/// (`provolatile = 'i'`). This deliberately diverges from the `eql_v2` +/// originals, which carry no marker and default to `VOLATILE`. The comparison +/// is deterministic — pgcrypto `encrypt()` is itself `IMMUTABLE` — and the +/// marker is what lets the planner fold/cache these in ordering/index contexts, +/// so a silent regression to `VOLATILE` (e.g. dropping the keyword on a future +/// edit) must fail CI. +#[sqlx::test] +async fn ore_comparators_are_immutable(pool: PgPool) -> Result<()> { + let rows: Vec<(String, String)> = sqlx::query_as( + r#" + SELECT pg_catalog.pg_get_function_arguments(p.oid) AS args, + p.provolatile::text AS provolatile + FROM pg_catalog.pg_proc p + WHERE p.pronamespace = 'eql_v3'::regnamespace + AND p.proname IN ( + 'compare_ore_block_u64_8_256_term', + 'compare_ore_block_u64_8_256_terms' + ) + ORDER BY args + "#, + ) + .fetch_all(&pool) + .await?; + + // Pin the count so an overload silently disappearing (or a fourth appearing) + // also fails, not just a volatility flip. + assert_eq!( + rows.len(), + 3, + "expected exactly 3 compare overloads, found: {rows:?}" + ); + + for (args, provolatile) in &rows { + assert_eq!( + provolatile, "i", + "compare_ore_block_u64_8_256_term(s)({args}) must be IMMUTABLE, got provolatile={provolatile}" + ); + } + Ok(()) +} From 562722b405a0038450e059c759016b0199c95528 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 18:54:49 +1000 Subject: [PATCH 111/599] test(v3/sem): pin proisstrict alongside provolatile in T8 Widen the existing T8 catalog query to also assert all three compare_ore_block_u64_8_256_term(s) overloads are NOT STRICT, closing the lopsided pin where the equally load-bearing non-STRICT property was only guarded behaviourally (T3, term overload only). Now pinned at the same catalog layer T8 already queries, covering the array/composite overloads T3 does not directly assert. --- .../sqlx/tests/encrypted_domain/family/sem.rs | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 8329a0999..90ac83fac 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -394,20 +394,29 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { Ok(()) } -/// T8 — Volatility pin: all three `compare_ore_block_u64_8_256_term(s)` overloads -/// (term×term, term[]×term[], composite×composite) must be `IMMUTABLE` -/// (`provolatile = 'i'`). This deliberately diverges from the `eql_v2` -/// originals, which carry no marker and default to `VOLATILE`. The comparison -/// is deterministic — pgcrypto `encrypt()` is itself `IMMUTABLE` — and the -/// marker is what lets the planner fold/cache these in ordering/index contexts, -/// so a silent regression to `VOLATILE` (e.g. dropping the keyword on a future -/// edit) must fail CI. +/// T8 — Catalog pin for all three `compare_ore_block_u64_8_256_term(s)` overloads +/// (term×term, term[]×term[], composite×composite). Two load-bearing catalog +/// properties are pinned at the same layer: +/// +/// - `IMMUTABLE` (`provolatile = 'i'`). This deliberately diverges from the +/// `eql_v2` originals, which carry no marker and default to `VOLATILE`. The +/// comparison is deterministic — pgcrypto `encrypt()` is itself `IMMUTABLE` +/// — and the marker is what lets the planner fold/cache these in +/// ordering/index contexts, so a silent regression to `VOLATILE` (e.g. +/// dropping the keyword on a future edit) must fail CI. +/// - NOT `STRICT` (`proisstrict = false`). The NULL-handling branches inside +/// the comparators are load-bearing (T3 pins their behaviour for the term +/// overload). A stray `STRICT` would let PostgreSQL skip the body on a NULL +/// argument, silently bypassing those branches. T3 guards this behaviourally +/// for the term overload; this pins it at the catalog layer for all three, +/// including the array/composite overloads T3 does not directly assert. #[sqlx::test] async fn ore_comparators_are_immutable(pool: PgPool) -> Result<()> { - let rows: Vec<(String, String)> = sqlx::query_as( + let rows: Vec<(String, String, bool)> = sqlx::query_as( r#" SELECT pg_catalog.pg_get_function_arguments(p.oid) AS args, - p.provolatile::text AS provolatile + p.provolatile::text AS provolatile, + p.proisstrict AS isstrict FROM pg_catalog.pg_proc p WHERE p.pronamespace = 'eql_v3'::regnamespace AND p.proname IN ( @@ -421,18 +430,22 @@ async fn ore_comparators_are_immutable(pool: PgPool) -> Result<()> { .await?; // Pin the count so an overload silently disappearing (or a fourth appearing) - // also fails, not just a volatility flip. + // also fails, not just a volatility/strictness flip. assert_eq!( rows.len(), 3, "expected exactly 3 compare overloads, found: {rows:?}" ); - for (args, provolatile) in &rows { + for (args, provolatile, isstrict) in &rows { assert_eq!( provolatile, "i", "compare_ore_block_u64_8_256_term(s)({args}) must be IMMUTABLE, got provolatile={provolatile}" ); + assert!( + !isstrict, + "compare_ore_block_u64_8_256_term(s)({args}) must NOT be STRICT (NULL branches are load-bearing)" + ); } Ok(()) } From 013f00ec3ceba20089bafd249e8fd24777051428 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 3 Jun 2026 19:07:53 +1000 Subject: [PATCH 112/599] feat(scalars): add eql_v3.timestamptz encrypted-domain type (equality-only) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the timestamptz scalar encrypted-domain type to the eql_v3 family as EQUALITY-ONLY: storage + eql_v3.timestamptz_eq (= / <> via HMAC), no ord domains, no MIN/MAX aggregates. Ordering is deferred: cipherstash encrypts Plaintext::Timestamp at native 12-block ORE width, but EQL's only ORE comparator (eql_v2.compare_ore_block_u64_8_256_term) is hardcoded to 8 blocks, so an ordered timestamptz domain would silently mis-order. Ordering follows once a wide-ORE (12-block) term lands. - catalog: add EQ_ONLY_DOMAINS (storage + _eq); point TIMESTAMPTZ at it. Replace all_types_share_the_same_domain_shape with a shape-aware test (every type matches one of two known shapes) plus a pin of which token uses which shape. - dispatch: extend the scalar_types! entry grammar with an optional [eq_only] marker; eq-only entries emit eq_only_scalar_matrix! instead of ordered_numeric_matrix!. ordered int4/int2/date emission is byte-identical. - matrix: eq_only_scalar_matrix! now derives its three pivots from the ScalarType impl (like the ordered macro) instead of requiring explicit pivots — the first consumer wires cleanly with no per-call pivot authoring. - inventory: make mise test:matrix:inventory shape-aware. Add the second canonical snapshot matrix_tests_eq_only.txt; each discovered type is compared against the snapshot matching its shape (ordered vs eq-only). Document the two-shape mechanism in snapshots/README.md. matrix_tests.txt is unchanged. - CHANGELOG: timestamptz ships equality-only, ordering deferred. --- CHANGELOG.md | 1 + crates/eql-scalars/src/fixture.rs | 12 ++- crates/eql-scalars/src/kind.rs | 15 ++- crates/eql-scalars/src/lib.rs | 68 ++++++++++++- crates/eql-scalars/src/tests.rs | 120 +++++++++++++++++++---- tests/sqlx/src/fixtures/eql_plaintext.rs | 50 +++++++++- tests/sqlx/src/scalar_domains.rs | 25 +++++ tests/sqlx/src/scalar_types.rs | 1 + 8 files changed, 259 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c128bdc8..82634a024 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) - **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) +- **`eql_v3.timestamptz` encrypted-domain type family (equality-only).** Two jsonb-backed domains for encrypted `timestamptz` columns — `eql_v3.timestamptz` (storage-only) and `eql_v3.timestamptz_eq` (`=` / `<>` via HMAC) — generated from the `timestamptz` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast. Index via a functional index on the `eql_v3.eq_term` extractor, not an operator class on the domain. **Ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) is deferred:** cipherstash encrypts `Plaintext::Timestamp` at native 12-block ORE width, but EQL's only ORE comparator (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so ordered timestamptz domains would silently mis-order. There are no `eql_v3.timestamptz_ord` / `_ord_ore` domains and no timestamptz `MIN` / `MAX` aggregates until a wide-ORE (12-block) term lands — tracked in [#241](https://github.com/cipherstash/encrypt-query-language/issues/241). Why: a type-safe, equality-searchable encrypted UTC-timestamp column, stacking on the `date` temporal-scalar foundation; ordering follows once the comparator supports the native ciphertext width. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) diff --git a/crates/eql-scalars/src/fixture.rs b/crates/eql-scalars/src/fixture.rs index 0cd69053a..b9ea18213 100644 --- a/crates/eql-scalars/src/fixture.rs +++ b/crates/eql-scalars/src/fixture.rs @@ -27,7 +27,11 @@ impl Fixture { }, Fixture::Zero => Some(0), Fixture::Int(n) => Some(n), - Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) | Fixture::Date(_) => None, + Fixture::Numeric(_) + | Fixture::Text(_) + | Fixture::Jsonb(_) + | Fixture::Date(_) + | Fixture::Timestamptz(_) => None, } } @@ -52,7 +56,11 @@ impl Fixture { .zero_symbol() .to_string(), Fixture::Int(n) => n.to_string(), - Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { + Fixture::Numeric(s) + | Fixture::Text(s) + | Fixture::Jsonb(s) + | Fixture::Date(s) + | Fixture::Timestamptz(s) => { format!("{s:?}") } } diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-scalars/src/kind.rs index 3b3d72fac..b5ded6fa8 100644 --- a/crates/eql-scalars/src/kind.rs +++ b/crates/eql-scalars/src/kind.rs @@ -68,7 +68,11 @@ impl ScalarKind { ScalarKind::I16 => Some(BoundedIntKind::I16), ScalarKind::I32 => Some(BoundedIntKind::I32), ScalarKind::I64 => Some(BoundedIntKind::I64), - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Date => None, + ScalarKind::Numeric + | ScalarKind::Text + | ScalarKind::Jsonb + | ScalarKind::Date + | ScalarKind::Timestamptz => None, } } @@ -78,11 +82,11 @@ impl ScalarKind { self.as_bounded_int().is_some() } - /// True for chrono-backed temporal kinds (`Date`; `Timestamptz` once added) — - /// the kinds whose test `ScalarType` impl is generated by `temporal_values!` - /// rather than the integer proc-macro path. Replaces the `[temporal]` marker. + /// True for chrono-backed temporal kinds (`Date`, `Timestamptz`) — the kinds + /// whose test `ScalarType` impl is generated by `temporal_values!` rather + /// than the integer proc-macro path. Replaces the `[temporal]` marker. pub const fn is_temporal(self) -> bool { - matches!(self, ScalarKind::Date) + matches!(self, ScalarKind::Date | ScalarKind::Timestamptz) } /// A debug/identifier string for the kind. For the codegen-supported kinds @@ -101,6 +105,7 @@ impl ScalarKind { ScalarKind::Text => "text", ScalarKind::Jsonb => "jsonb", ScalarKind::Date => "chrono::NaiveDate", + ScalarKind::Timestamptz => "chrono::DateTime", } } } diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index b488d5f71..ad1fffcf6 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -64,6 +64,13 @@ pub enum ScalarKind { /// live on `BoundedIntKind`, which `Date` cannot be, so they are /// unreachable for it by construction rather than by a runtime panic. Date, + /// UTC timestamp (`chrono::DateTime`). Ordered like the integer kinds + /// via ORE, but string-backed (RFC3339) at the catalog layer and with no + /// i128 range — so it is *not* `is_int()` and the bounded-numeric accessors + /// panic for it, exactly like the other non-integer kinds. UTC-normalized: + /// cipherstash has no tz-preserving type, so it maps to the `timestamp` + /// cast and the SQL `timestamp with time zone` plaintext type. + Timestamptz, } /// A fixed index term known to the scalar materializer. @@ -99,6 +106,10 @@ pub enum Fixture { /// the string is parsed into a `chrono::NaiveDate` in the SQLx harness, not /// here. Distinct by literal, like the other string-backed fixtures. Date(&'static str), + /// An RFC3339 UTC timestamp string (`"1970-01-01T00:00:00Z"`). The catalog + /// stays zero-dep, so the string is parsed into a `chrono::DateTime` in + /// the SQLx harness, not here. Distinct by literal, like `Date`. + Timestamptz(&'static str), } /// One generated public domain: a suffix appended to the type token and the @@ -140,6 +151,7 @@ macro_rules! fixtures { (numeric; $($s:literal),* $(,)?) => { &[$(Fixture::Numeric($s)),*] }; (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; + (timestamptz; $($s:literal),* $(,)?) => { &[$(Fixture::Timestamptz($s)),*] }; } /// Domains shared by every ordered-integer scalar, in manifest file order: @@ -163,6 +175,24 @@ const ORDERED_INT_DOMAINS: &[DomainSpec] = &[ }, ]; +/// Equality-only domains: storage (no terms) + `_eq` (hm). Used by scalar types +/// that can hash for equality but cannot (yet) be ordered. `timestamptz` is the +/// first such type: cipherstash encrypts `Plaintext::Timestamp` at native +/// 12-block ORE width, but EQL's only ORE comparator +/// (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so an +/// ordered domain would silently mis-order. Ordering is deferred until a +/// wide-ORE (12-block) term exists. +const EQ_ONLY_DOMAINS: &[DomainSpec] = &[ + DomainSpec { + suffix: "", + terms: &[], + }, + DomainSpec { + suffix: "_eq", + terms: &[Term::Hm], + }, +]; + /// int4 fixture plaintexts. /// `N(..)` literals are range-checked against `i32` at compile time. const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; @@ -196,6 +226,21 @@ const DATE_FIXTURES: &[Fixture] = fixtures!(date; "2012-06-30", "2016-03-15", "2020-10-21", "2024-02-29", "2038-01-19", "2099-12-31"); +/// timestamptz fixture plaintexts — RFC3339 UTC strings, parsed into +/// `chrono::DateTime` in the SQLx harness (the catalog stays zero-dep). +/// The three temporal pivots MUST be present verbatim: `"1900-01-01T00:00:00Z"` +/// (min_pivot), `"1970-01-01T00:00:00Z"` (zero = `DateTime::::default()`, +/// the Unix epoch), and `"2099-12-31T23:59:59Z"` (max_pivot) — the matrix +/// fetches each one's ciphertext via `fetch_fixture_payload`, which fails loudly +/// if a row is absent. The interior timestamps span varied dates AND times of +/// day so range operators yield distinguishable counts. All distinct. +const TIMESTAMPTZ_FIXTURES: &[Fixture] = fixtures!(timestamptz; + "1900-01-01T00:00:00Z", "1950-07-15T06:30:00Z", "1969-12-31T23:59:59Z", + "1970-01-01T00:00:00Z", "1970-01-01T00:00:01Z", "1985-04-12T23:20:50Z", + "1999-12-31T23:59:59Z", "2000-01-01T00:00:00Z", "2004-02-29T12:00:00Z", + "2012-06-30T11:59:59Z", "2016-03-15T08:15:30Z", "2020-10-21T14:45:00Z", + "2024-02-29T17:30:45Z", "2038-01-19T03:14:07Z", "2099-12-31T23:59:59Z"); + const INT4: ScalarSpec = ScalarSpec { token: "int4", kind: ScalarKind::I32, @@ -232,9 +277,30 @@ pub const DATE: ScalarSpec = ScalarSpec { fixtures: DATE_FIXTURES, }; +/// `timestamptz` — an **equality-only** (UTC-normalized) non-integer scalar. +/// Uses `EQ_ONLY_DOMAINS` (storage + `_eq`) rather than the four-domain ordered +/// shape: cipherstash encrypts `Plaintext::Timestamp` at native 12-block ORE +/// width, but EQL's only ORE comparator +/// (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so an +/// ordered timestamptz domain would silently mis-order. Ordering is deferred to +/// a future PR that adds a wide-ORE (12-block) term. The three "pivot" fixture +/// values are retained as equality pivots; the kind stays ordered-shaped +/// (carries a rust type, no i128 range) so the harness can parse them. +/// +/// Public (like `DATE`) because the SQLx harness reads `TIMESTAMPTZ.fixtures` +/// directly to parse the RFC3339 strings into `chrono::DateTime` at +/// runtime — there is no `TIMESTAMPTZ_VALUES` const (chrono is not +/// `const`-friendly and `eql-scalars` stays zero-dep). +pub const TIMESTAMPTZ: ScalarSpec = ScalarSpec { + token: "timestamptz", + kind: ScalarKind::Timestamptz, + domains: EQ_ONLY_DOMAINS, + fixtures: TIMESTAMPTZ_FIXTURES, +}; + /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE]; +pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ]; /// Materialise an integer scalar's fixtures into a typed `&'static` slice at /// compile time. This is the **single-sourced** plaintext list the SQLx test diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 557a9bd00..bd31c7fee 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -41,6 +41,7 @@ mod rust_tests { assert_eq!(ScalarKind::Text.as_bounded_int(), None); assert_eq!(ScalarKind::Jsonb.as_bounded_int(), None); assert_eq!(ScalarKind::Date.as_bounded_int(), None); + assert_eq!(ScalarKind::Timestamptz.as_bounded_int(), None); } #[test] @@ -78,6 +79,7 @@ mod rust_tests { assert!(!ScalarKind::Text.is_int()); assert!(!ScalarKind::Jsonb.is_int()); assert!(!ScalarKind::Date.is_int()); + assert!(!ScalarKind::Timestamptz.is_int()); } #[test] @@ -105,6 +107,16 @@ mod rust_tests { assert_eq!(ScalarKind::Date.as_bounded_int(), None); } + #[test] + fn timestamptz_maps_to_datetime() { + // Temporal, non-integer, equality-only kind: it carries a rust type but + // no i128 range, so it is not `is_int()` and `as_bounded_int()` returns + // `None` — the bounded accessors are not reachable for it. + assert_eq!(ScalarKind::Timestamptz.rust_type(), "chrono::DateTime"); + assert!(!ScalarKind::Timestamptz.is_int()); + assert_eq!(ScalarKind::Timestamptz.as_bounded_int(), None); + } + /// The structural guarantee that replaces the old runtime panics: a /// `Min`/`Max`/`Zero` pivot sentinel may only appear in a `CATALOG` row whose /// kind is an integer kind. `render_literal` would `expect`-panic and @@ -129,10 +141,10 @@ mod rust_tests { #[test] fn is_temporal_classifies_chrono_kinds() { assert!(ScalarKind::Date.is_temporal()); + assert!(ScalarKind::Timestamptz.is_temporal()); assert!(!ScalarKind::I16.is_temporal()); assert!(!ScalarKind::I32.is_temporal()); assert!(!ScalarKind::I64.is_temporal()); - // Timestamptz arrives in Phase 5; assert it here once present. } #[test] @@ -141,6 +153,8 @@ mod rust_tests { assert!(!int4.is_eq_only(), "int4 is ordered"); let date = CATALOG.iter().find(|s| s.token == "date").unwrap(); assert!(!date.is_eq_only(), "date is ordered"); + let ts = CATALOG.iter().find(|s| s.token == "timestamptz").unwrap(); + assert!(ts.is_eq_only(), "timestamptz is equality-only"); } } @@ -303,6 +317,10 @@ mod fixture_tests { Fixture::Date("1970-01-01").numeric_value(ScalarKind::Date), None ); + assert_eq!( + Fixture::Timestamptz("1970-01-01T00:00:00Z").numeric_value(ScalarKind::Timestamptz), + None + ); } #[test] @@ -343,6 +361,10 @@ mod fixture_tests { Fixture::Date("1970-01-01").render_literal(ScalarKind::Date), "\"1970-01-01\"" ); + assert_eq!( + Fixture::Timestamptz("1970-01-01T00:00:00Z").render_literal(ScalarKind::Timestamptz), + "\"1970-01-01T00:00:00Z\"" + ); } #[test] @@ -371,6 +393,15 @@ mod fixture_tests { DATES, &[Fixture::Date("1970-01-01"), Fixture::Date("2099-12-31")] ); + const STAMPS: &[Fixture] = + fixtures!(timestamptz; "1970-01-01T00:00:00Z", "2099-12-31T23:59:59Z"); + assert_eq!( + STAMPS, + &[ + Fixture::Timestamptz("1970-01-01T00:00:00Z"), + Fixture::Timestamptz("2099-12-31T23:59:59Z") + ] + ); } #[test] @@ -402,9 +433,9 @@ mod catalog_tests { } #[test] - fn catalog_has_int4_int2_int8_date_in_order() { + fn catalog_has_int4_int2_int8_date_timestamptz_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); - assert_eq!(tokens, vec!["int4", "int2", "int8", "date"]); + assert_eq!(tokens, vec!["int4", "int2", "int8", "date", "timestamptz"]); } /// The three temporal matrix pivots must be present verbatim in DATE's @@ -431,26 +462,71 @@ mod catalog_tests { } } + /// The three temporal matrix pivots must be present verbatim in + /// TIMESTAMPTZ's fixture strings — the timestamptz analogue of + /// `temporal_fixtures_include_pivot_plaintexts`. + #[test] + fn timestamptz_fixtures_include_pivot_plaintexts() { + let ts = scalar("timestamptz"); + let strings: Vec<&str> = ts + .fixtures + .iter() + .filter_map(|f| match f { + Fixture::Timestamptz(s) => Some(*s), + _ => None, + }) + .collect(); + for pivot in [ + "1900-01-01T00:00:00Z", + "1970-01-01T00:00:00Z", + "2099-12-31T23:59:59Z", + ] { + assert!( + strings.contains(&pivot), + "timestamptz fixtures missing temporal pivot {pivot}" + ); + } + } + #[test] - fn all_types_share_the_same_domain_shape() { - // Every scalar declares the same four domains with the same terms; - // only the token differs (the matrix-snapshot collapse depends on this). - // Generic over CATALOG, so it covers every type — including new ones — - // and subsumes the old per-type `_maps_to_*_with_four_domains` / - // `_domain_terms_match_manifest` tests (which only restated the - // catalog literal for one token). + fn every_type_uses_a_known_domain_shape() { + // Each scalar's domain shape must be one of the two known-valid shapes: + // the four-domain ORDERED shape (storage + `_eq` + `_ord_ore` + `_ord`) + // or the two-domain EQ-ONLY shape (storage + `_eq`). This catches + // accidental drift — a typo'd suffix, a wrong term, a dropped domain — + // without hardcoding which token gets which shape (that is the catalog's + // job; the matrix dispatch and the inventory snapshots are shape-aware). + // Subsumes the old per-type `_maps_to_*_with_four_domains` / + // `_domain_terms_match_manifest` tests. + let ordered: Vec<(&str, &[Term])> = vec![ + ("", &[] as &[Term]), + ("_eq", &[Term::Hm][..]), + ("_ord_ore", &[Term::Ore][..]), + ("_ord", &[Term::Ore][..]), + ]; + let eq_only: Vec<(&str, &[Term])> = vec![("", &[] as &[Term]), ("_eq", &[Term::Hm][..])]; for s in CATALOG { let shape: Vec<(&str, &[Term])> = s.domains.iter().map(|d| (d.suffix, d.terms)).collect(); + assert!( + shape == ordered || shape == eq_only, + "{} has an unrecognised domain shape: {shape:?}", + s.token + ); + } + } + + #[test] + fn ordered_and_eq_only_shapes_are_used_as_declared() { + // Pin which catalog tokens carry which shape, so a row silently flipping + // ORDERED_INT_DOMAINS <-> EQ_ONLY_DOMAINS is caught. timestamptz is + // equality-only (12-block ORE vs 8-block comparator); the rest ordered. + for s in CATALOG { + let is_eq_only = s.domains.len() == 2; + let expect_eq_only = s.token == "timestamptz"; assert_eq!( - shape, - vec![ - ("", &[] as &[Term]), - ("_eq", &[Term::Hm][..]), - ("_ord_ore", &[Term::Ore][..]), - ("_ord", &[Term::Ore][..]), - ], - "{} has unexpected domain shape", + is_eq_only, expect_eq_only, + "{} domain shape (eq_only={is_eq_only}) does not match expectation", s.token ); } @@ -552,9 +628,11 @@ mod invariant_tests { fn distinct_key(f: Fixture, kind: ScalarKind) -> DistinctKey { match f { - Fixture::Numeric(s) | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) => { - DistinctKey::Str(s) - } + Fixture::Numeric(s) + | Fixture::Text(s) + | Fixture::Jsonb(s) + | Fixture::Date(s) + | Fixture::Timestamptz(s) => DistinctKey::Str(s), _ => DistinctKey::Num( f.numeric_value(kind) .expect("sentinel/Int fixtures resolve to a number"), diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 65c9f43ed..5cb88099e 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -57,6 +57,7 @@ impl PlaintextSqlType { pub const SMALLINT: PlaintextSqlType = PlaintextSqlType("smallint"); pub const BIGINT: PlaintextSqlType = PlaintextSqlType("bigint"); pub const DATE: PlaintextSqlType = PlaintextSqlType("date"); + pub const TIMESTAMPTZ: PlaintextSqlType = PlaintextSqlType("timestamp with time zone"); pub fn as_str(&self) -> &'static str { self.0 @@ -71,15 +72,17 @@ impl fmt::Display for PlaintextSqlType { /// The EQL `cast_as` for a scalar kind, drawn from the `Cast` allowlist. /// -/// Only the wired kinds (the integer kinds plus `Date`) have `EqlPlaintext` -/// impls, so only those resolve; the remaining kinds mirror the `eql_scalars` -/// accessor convention and `panic!`, since no impl can ever reach them. +/// Only the wired kinds (the integer kinds plus `Date` / `Timestamptz`) have +/// `EqlPlaintext` impls, so only those resolve; the remaining kinds mirror the +/// `eql_scalars` accessor convention and `panic!`, since no impl can ever reach +/// them. const fn cast_for_kind(kind: ScalarKind) -> Cast { match kind { ScalarKind::I32 => Cast::INT, ScalarKind::I16 => Cast::SMALL_INT, ScalarKind::I64 => Cast::BIG_INT, ScalarKind::Date => Cast::DATE, + ScalarKind::Timestamptz => Cast::TIMESTAMP, ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } @@ -88,13 +91,14 @@ const fn cast_for_kind(kind: ScalarKind) -> Cast { /// The `plaintext` oracle column SQL type for a scalar kind, drawn from the /// `PlaintextSqlType` allowlist. As with `cast_for_kind`, only the wired kinds -/// (integers plus `Date`) resolve. +/// (integers plus `Date` / `Timestamptz`) resolve. const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { match kind { ScalarKind::I32 => PlaintextSqlType::INTEGER, ScalarKind::I16 => PlaintextSqlType::SMALLINT, ScalarKind::I64 => PlaintextSqlType::BIGINT, ScalarKind::Date => PlaintextSqlType::DATE, + ScalarKind::Timestamptz => PlaintextSqlType::TIMESTAMPTZ, ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } @@ -107,6 +111,7 @@ mod sealed { impl Sealed for i16 {} impl Sealed for i64 {} impl Sealed for chrono::NaiveDate {} + impl Sealed for chrono::DateTime {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -166,6 +171,14 @@ impl EqlPlaintext for chrono::NaiveDate { } } +impl EqlPlaintext for chrono::DateTime { + const KIND: ScalarKind = ScalarKind::Timestamptz; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::Timestamp(Some(*self)) + } +} + #[cfg(test)] mod tests { use super::*; @@ -259,4 +272,33 @@ mod tests { other => panic!("expected Plaintext::NaiveDate(Some(1970-01-01)), got {other:?}"), } } + + #[test] + fn datetime_utc_casts_to_timestamp() { + // timestamptz is UTC-normalized — cipherstash has no tz-preserving + // type, so it encrypts under the `timestamp` cast. + assert_eq!( + as EqlPlaintext>::CAST.as_str(), + "timestamp" + ); + } + + #[test] + fn datetime_utc_plaintext_sql_type_is_timestamptz() { + assert_eq!( + as EqlPlaintext>::PLAINTEXT_SQL_TYPE.as_str(), + "timestamp with time zone" + ); + } + + #[test] + fn datetime_utc_to_plaintext_wraps_in_timestamp_variant() { + // A DateTime must lift into the Timestamp variant so the fixture + // driver encrypts it under the `timestamp` cast. + let ts = chrono::DateTime::::default(); + match ts.to_plaintext() { + Plaintext::Timestamp(Some(value)) => assert_eq!(value, ts), + other => panic!("expected Plaintext::Timestamp(Some(epoch)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 5b304a375..8e8049c42 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -205,6 +205,31 @@ temporal_values! { sql_lit = |v| format!("'{v}'"), } +// `timestamptz`'s `ScalarType` wiring, generated from its catalog row by the +// same `temporal_values!` path as `date`. timestamptz is equality-only (its +// catalog row uses the eq-only domain shape), but the *value* wiring is +// identical to any temporal scalar: RFC3339 strings parsed once into +// `DateTime` behind `timestamptz_values()`. The pivots are retained as the +// three equality anchors the matrix sweeps. +temporal_values! { + cell = TIMESTAMPTZ_VALUES_CELL, + accessor = timestamptz_values, + rust_type = chrono::DateTime, + spec = eql_scalars::TIMESTAMPTZ, + variant = Timestamptz, + pg_type = "timestamptz", + parse = |s| chrono::DateTime::parse_from_rfc3339(s) + .expect("catalog timestamptz fixture must be RFC3339") + .with_timezone(&chrono::Utc), + min_pivot = "1900-01-01T00:00:00Z" + .parse() + .expect("1900-01-01T00:00:00Z is a valid timestamp"), + max_pivot = "2099-12-31T23:59:59Z" + .parse() + .expect("2099-12-31T23:59:59Z is a valid timestamp"), + sql_lit = |v| format!("'{}'", v.to_rfc3339()), +} + /// Per-domain capability + payload shape. Storage carries no terms, `Eq` /// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate /// twins — same operator surface, different SQL domain names — for the diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index feeca6050..5ab94293c 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -55,6 +55,7 @@ macro_rules! scalar_types { int2 => i16, int8 => i64, date => chrono::NaiveDate, + timestamptz => chrono::DateTime, } }; } From ea62630b91c7f20bbecdaaac734d1757abe29a1d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 18:52:13 +1000 Subject: [PATCH 113/599] test(scalars): guard timestamptz UTC-normalization and instant-distinctness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR #257 review feedback. The temporal_values! auto-generated tests re-run the exact parse closure over all-UTC (`…Z`) catalog fixtures, so they cannot catch a regression that drops the offset→UTC conversion, and fixture distinctness is keyed by string upstream in eql-scalars (which is zero-dep, no chrono) so two RFC3339 strings denoting the same UTC instant pass as distinct. Add two harness-side guards alongside the timestamptz temporal_values! call: - rfc3339_offset_is_normalized_to_utc: feeds an offset-bearing RFC3339 string and asserts it resolves to the same instant as the Z form (fails on a switch to .naive_utc()). - fixtures_are_distinct_by_instant: dedups timestamptz_values() by parsed DateTime, guarding the property the fixture table keys on. --- tests/sqlx/src/scalar_domains.rs | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 8e8049c42..c46fde9df 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -230,6 +230,61 @@ temporal_values! { sql_lit = |v| format!("'{}'", v.to_rfc3339()), } +/// Focused guards for the timestamptz value wiring that the `temporal_values!` +/// auto-generated tests can't cover, because every catalog fixture is already +/// `…Z` (UTC). Both tests intentionally live in the harness, not in +/// `eql-scalars`, which is deliberately zero-dep (no chrono). +#[cfg(test)] +mod timestamptz_value_guards { + use super::*; + + // Mirror of the `temporal_values!` parse closure above. Kept independent so + // a regression that drops the offset→UTC conversion in the macro invocation + // is caught here rather than re-running the (all-UTC, tautological) catalog + // fixtures. + fn parse(s: &str) -> chrono::DateTime { + chrono::DateTime::parse_from_rfc3339(s) + .expect("RFC3339") + .with_timezone(&chrono::Utc) + } + + /// The type's headline guarantee ("Values are UTC-normalized") exercised + /// with a genuinely non-UTC input. Passes today; fails the moment the parse + /// path stops converting offsets to UTC (e.g. a switch to `.naive_utc()` or + /// constructing the `DateTime` from the naive local time). + #[test] + fn rfc3339_offset_is_normalized_to_utc() { + use chrono::{Datelike, Timelike}; + // 05:00 at +05:00 is midnight UTC — same instant as the Z form. + assert_eq!( + parse("2000-01-01T05:00:00+05:00"), + parse("2000-01-01T00:00:00Z"), + ); + // …and it lands on the UTC wall-clock, not the offset-local one. + let utc = parse("2000-01-01T05:00:00+05:00"); + assert_eq!((utc.hour(), utc.day()), (0, 1)); + } + + /// `eql-scalars::invariant_tests::fixture_values_are_distinct_by_resolved_number` + /// keys `Fixture::Timestamptz` by its literal string, so two RFC3339 strings + /// that denote the same UTC instant (e.g. `…00:00Z` vs `…01:00+01:00`) would + /// pass as "distinct" there. The fixture *table* keys on the parsed + /// `DateTime`, so an aliasing pair would silently insert duplicate + /// `plaintext` rows and break `fetch_fixture_payload`'s `fetch_one`. This + /// guards distinctness by instant, which is the property the table relies on. + #[test] + fn fixtures_are_distinct_by_instant() { + use std::collections::HashSet; + let vals = timestamptz_values(); // &[DateTime], parsed from the catalog + let unique: HashSet<_> = vals.iter().collect(); + assert_eq!( + unique.len(), + vals.len(), + "two timestamptz fixtures alias to the same UTC instant", + ); + } +} + /// Per-domain capability + payload shape. Storage carries no terms, `Eq` /// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate /// twins — same operator surface, different SQL domain names — for the From 09452af0593d34d9199520f77cba1e7e5c5b9a3a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 19:24:49 +1000 Subject: [PATCH 114/599] chore(tests): remove unused get_ore_encrypted import in operator_class_tests --- tests/sqlx/tests/operator_class_tests.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/sqlx/tests/operator_class_tests.rs b/tests/sqlx/tests/operator_class_tests.rs index 46ad9aaec..0e0d1a1dc 100644 --- a/tests/sqlx/tests/operator_class_tests.rs +++ b/tests/sqlx/tests/operator_class_tests.rs @@ -3,7 +3,6 @@ //! Tests PostgreSQL operator class definitions and index behavior use anyhow::Result; -use eql_tests::get_ore_encrypted; use sqlx::PgPool; /// Helper to create encrypted table for testing From 56b0a26a6140198f0f21400a29dcf594649f8b60 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:42:53 +1000 Subject: [PATCH 115/599] feat(eql-scalars): add Bloom term + text catalog row + TEXT_VALUES Adds the `Bloom` index `Term` (json key `bf`, extractor `match_term`, ctor `bloom_filter`, role `match`, operators `@>`/`<@`) and the `text` row to the scalar `CATALOG`: `ScalarKind::Text`, a `_match` (Bloom) domain on top of the ordered shape, and the `TEXT_FIXTURES` / `TEXT_VALUES` plaintext list (materialised by a `text_values!` macro alongside `int_values!`). `Fixture::Zero` is gated to the integer kinds. Covered by `term_tests` and catalog `#[test]`s. --- crates/eql-scalars/src/fixture.rs | 5 +- crates/eql-scalars/src/lib.rs | 82 +++++++++++++++++++++++- crates/eql-scalars/src/term.rs | 6 ++ crates/eql-scalars/src/tests.rs | 102 ++++++++++++++++++++++++++++-- 4 files changed, 186 insertions(+), 9 deletions(-) diff --git a/crates/eql-scalars/src/fixture.rs b/crates/eql-scalars/src/fixture.rs index b9ea18213..cef88c443 100644 --- a/crates/eql-scalars/src/fixture.rs +++ b/crates/eql-scalars/src/fixture.rs @@ -25,7 +25,10 @@ impl Fixture { Some(k) => Some(k.max_value()), None => None, }, - Fixture::Zero => Some(0), + Fixture::Zero => match kind.as_bounded_int() { + Some(_) => Some(0), + None => None, + }, Fixture::Int(n) => Some(n), Fixture::Numeric(_) | Fixture::Text(_) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index ad1fffcf6..56777bbc8 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -83,6 +83,7 @@ pub enum ScalarKind { pub enum Term { Hm, Ore, + Bloom, } /// A single fixture plaintext value, value-kind tagged: `Min`/`Max`/`Zero` are @@ -298,9 +299,56 @@ pub const TIMESTAMPTZ: ScalarSpec = ScalarSpec { fixtures: TIMESTAMPTZ_FIXTURES, }; +/// Domains for `text`: the ordered shape plus a `_match` domain backed by the +/// `Bloom` term (`@>`/`<@` containment). The ordered subset (`""`, `_eq`, +/// `_ord_ore`, `_ord`) is identical to `ORDERED_INT_DOMAINS`; `_match` is the +/// only addition, so text still runs the standard ordered matrix. +const TEXT_DOMAINS: &[DomainSpec] = &[ + DomainSpec { + suffix: "", + terms: &[], + }, + DomainSpec { + suffix: "_eq", + terms: &[Term::Hm], + }, + DomainSpec { + suffix: "_match", + terms: &[Term::Bloom], + }, + DomainSpec { + suffix: "_ord_ore", + terms: &[Term::Ore], + }, + DomainSpec { + suffix: "_ord", + terms: &[Term::Ore], + }, +]; + +/// `text` fixture plaintexts — curated so eq/ord give a lexicographic spread, +/// `""` is the ordered "zero" pivot (`String::default()`), and the match suite +/// has a known substring pair (`"aardvark"`/`"aard"`, sharing 3-grams) and a +/// disjoint value (`"zzzz"`, no shared 3-grams). `"aard"` is the lexicographic +/// `min_pivot` (after `""`) and `"zzzz"` the `max_pivot`; both must be present +/// verbatim so the matrix can fetch their ciphertext. All distinct. +const TEXT_FIXTURES: &[Fixture] = fixtures!(text; + "", "aard", "aardvark", "alice", "bob", "carol", + "dave", "erin", "frank", "mallory", "trent", "zzzz"); + +/// `text` — an ordered, non-integer, unbounded scalar. Adds a `_match` domain +/// (the `Bloom` term) on top of the ordered shape. Public because the SQLx +/// harness reads `TEXT_VALUES` (materialised below). +pub const TEXT: ScalarSpec = ScalarSpec { + token: "text", + kind: ScalarKind::Text, + domains: TEXT_DOMAINS, + fixtures: TEXT_FIXTURES, +}; + /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ]; +pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ, TEXT]; /// Materialise an integer scalar's fixtures into a typed `&'static` slice at /// compile time. This is the **single-sourced** plaintext list the SQLx test @@ -353,5 +401,37 @@ int_values!(INT4_VALUES, i32, INT4); int_values!(INT2_VALUES, i16, INT2); int_values!(INT8_VALUES, i64, INT8); +/// Materialise a `text` scalar's fixtures into a `&'static [&'static str]` at +/// compile time — the single-sourced plaintext list the SQLx matrix reads via +/// `ScalarType::fixture_values()` and the fixture generator encrypts. Unlike +/// `date` (chrono is not `const`-friendly), a `Fixture::Text(&'static str)` is +/// already const, so text materialises a typed slice like the integer kinds. +/// A non-text fixture is a const-eval panic (compile-time guard). +macro_rules! text_values { + ($name:ident, $spec:expr) => { + #[doc = concat!("Distinct plaintext fixture values for `", stringify!($spec), "`, ")] + #[doc = "materialised from its `CATALOG` row (see `text_values!`)."] + pub const $name: &[&'static str] = { + const SPEC: ScalarSpec = $spec; + const N: usize = SPEC.fixtures.len(); + const ARR: [&'static str; N] = { + let mut out = [""; N]; + let mut i = 0; + while i < N { + out[i] = match SPEC.fixtures[i] { + Fixture::Text(s) => s, + _ => panic!("text scalar fixture must be Fixture::Text"), + }; + i += 1; + } + out + }; + &ARR + }; + }; +} + +text_values!(TEXT_VALUES, TEXT); + #[cfg(test)] mod tests; diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-scalars/src/term.rs index eee366cba..a7f2e3905 100644 --- a/crates/eql-scalars/src/term.rs +++ b/crates/eql-scalars/src/term.rs @@ -11,6 +11,7 @@ impl Term { match self { Term::Hm => "hm", Term::Ore => "ob", + Term::Bloom => "bf", } } @@ -19,6 +20,7 @@ impl Term { match self { Term::Hm => "eq_term", Term::Ore => "ord_term", + Term::Bloom => "match_term", } } @@ -27,6 +29,7 @@ impl Term { match self { Term::Hm => "hmac_256", Term::Ore => "ore_block_u64_8_256", + Term::Bloom => "bloom_filter", } } @@ -35,6 +38,7 @@ impl Term { match self { Term::Hm => "eq", Term::Ore => "ord", + Term::Bloom => "match", } } @@ -43,6 +47,7 @@ impl Term { match self { Term::Hm => &["=", "<>"], Term::Ore => &["=", "<>", "<", "<=", ">", ">="], + Term::Bloom => &["@>", "<@"], } } @@ -54,6 +59,7 @@ impl Term { "src/v3/sem/ore_block_u64_8_256/functions.sql", "src/v3/sem/ore_block_u64_8_256/operators.sql", ], + Term::Bloom => &["src/v3/sem/bloom_filter/functions.sql"], } } } diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index bd31c7fee..2b2dd05f5 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -188,6 +188,38 @@ mod term_tests { ] ); } + + #[test] + fn bloom_term_contract() { + let b = Term::Bloom; + assert_eq!(b.json_key(), "bf"); + assert_eq!(b.extractor(), "match_term"); + assert_eq!(b.ctor(), "bloom_filter"); + assert_eq!(b.role(), "match"); + assert_eq!(b.operators(), &["@>", "<@"]); + assert_eq!(b.requires(), &["src/v3/sem/bloom_filter/functions.sql"]); + } + + #[test] + fn bloom_extractor_routes_match_operators() { + let terms = &[Term::Bloom]; + assert_eq!( + Term::extractor_for_operator(terms, "@>"), + Some("match_term") + ); + assert_eq!( + Term::extractor_for_operator(terms, "<@"), + Some("match_term") + ); + assert_eq!(Term::extractor_for_operator(terms, "="), None); + } + + #[test] + fn bloom_role_is_match_not_ord() { + assert_eq!(Term::role_for_terms(&[Term::Bloom]), "match"); + // match is not ord-capable: no aggregates. + assert_ne!(Term::role_for_terms(&[Term::Bloom]), "ord"); + } } mod term_helper_tests { @@ -433,9 +465,27 @@ mod catalog_tests { } #[test] - fn catalog_has_int4_int2_int8_date_timestamptz_in_order() { + fn catalog_has_int4_int2_int8_date_timestamptz_text_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); - assert_eq!(tokens, vec!["int4", "int2", "int8", "date", "timestamptz"]); + assert_eq!( + tokens, + vec!["int4", "int2", "int8", "date", "timestamptz", "text"] + ); + } + + #[test] + fn text_spec_is_in_catalog() { + let text = scalar("text"); + assert_eq!(text.kind, ScalarKind::Text); + let suffixes: Vec<_> = text.domains.iter().map(|d| d.suffix).collect(); + assert_eq!(suffixes, vec!["", "_eq", "_match", "_ord_ore", "_ord"]); + } + + #[test] + fn text_match_domain_carries_only_bloom() { + let text = scalar("text"); + let m = text.domains.iter().find(|d| d.suffix == "_match").unwrap(); + assert_eq!(m.terms, &[Term::Bloom]); } /// The three temporal matrix pivots must be present verbatim in DATE's @@ -490,9 +540,10 @@ mod catalog_tests { #[test] fn every_type_uses_a_known_domain_shape() { - // Each scalar's domain shape must be one of the two known-valid shapes: - // the four-domain ORDERED shape (storage + `_eq` + `_ord_ore` + `_ord`) - // or the two-domain EQ-ONLY shape (storage + `_eq`). This catches + // Each scalar's domain shape must be one of the known-valid shapes: + // the four-domain ORDERED shape (storage + `_eq` + `_ord_ore` + `_ord`), + // the two-domain EQ-ONLY shape (storage + `_eq`), or the ORDERED shape + // plus a `_match` domain (text's Bloom containment). This catches // accidental drift — a typo'd suffix, a wrong term, a dropped domain — // without hardcoding which token gets which shape (that is the catalog's // job; the matrix dispatch and the inventory snapshots are shape-aware). @@ -505,11 +556,18 @@ mod catalog_tests { ("_ord", &[Term::Ore][..]), ]; let eq_only: Vec<(&str, &[Term])> = vec![("", &[] as &[Term]), ("_eq", &[Term::Hm][..])]; + let ordered_match: Vec<(&str, &[Term])> = vec![ + ("", &[] as &[Term]), + ("_eq", &[Term::Hm][..]), + ("_match", &[Term::Bloom][..]), + ("_ord_ore", &[Term::Ore][..]), + ("_ord", &[Term::Ore][..]), + ]; for s in CATALOG { let shape: Vec<(&str, &[Term])> = s.domains.iter().map(|d| (d.suffix, d.terms)).collect(); assert!( - shape == ordered || shape == eq_only, + shape == ordered || shape == eq_only || shape == ordered_match, "{} has an unrecognised domain shape: {shape:?}", s.token ); @@ -520,7 +578,8 @@ mod catalog_tests { fn ordered_and_eq_only_shapes_are_used_as_declared() { // Pin which catalog tokens carry which shape, so a row silently flipping // ORDERED_INT_DOMAINS <-> EQ_ONLY_DOMAINS is caught. timestamptz is - // equality-only (12-block ORE vs 8-block comparator); the rest ordered. + // equality-only (12-block ORE vs 8-block comparator); the rest ordered + // (text adds a `_match` domain on top, so it is not eq_only either). for s in CATALOG { let is_eq_only = s.domains.len() == 2; let expect_eq_only = s.token == "timestamptz"; @@ -590,6 +649,35 @@ mod values_tests { check(&INT2, INT2_VALUES); check(&INT8, INT8_VALUES); } + + #[test] + // `TEXT_VALUES` is a compile-time const slice, so clippy can prove the + // non-emptiness guard true; keep it as an explicit invariant regardless. + #[allow(clippy::const_is_empty)] + fn text_values_are_distinct_and_nonempty() { + assert!(!TEXT_VALUES.is_empty()); + let mut seen = std::collections::HashSet::new(); + for v in TEXT_VALUES { + assert!(seen.insert(*v), "duplicate text fixture: {v}"); + } + // empty string present as the lexicographic zero pivot + assert!( + TEXT_VALUES.contains(&""), + "TEXT_VALUES must include the empty string" + ); + } + + #[test] + fn text_values_match_fixtures_in_order() { + let from_fixtures: Vec<&str> = TEXT_FIXTURES + .iter() + .map(|f| match f { + Fixture::Text(s) => *s, + other => panic!("text fixture must be Fixture::Text, got {other:?}"), + }) + .collect(); + assert_eq!(TEXT_VALUES.to_vec(), from_fixtures); + } } mod invariant_tests { From 0448afd3c3d62ff4619579c106cc670ebab348ca Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:43:07 +1000 Subject: [PATCH 116/599] feat(v3): add self-contained eql_v3.bloom_filter SEM index-term The searchable-encrypted-metadata `match` term for text. Adds the `eql_v3.bloom_filter` domain (`smallint[]`) and the inlinable `eql_v3.bloom_filter(jsonb)` extractor + `has_bloom_filter` predicate, mirroring `eql_v3.hmac_256`: no RAISE, no pinned search_path, so the functional GIN index on `match_term(col)` engages structurally. The extractor gates on `jsonb_typeof(val -> 'bf') = 'array'`, returning NULL (not erroring) for absent or malformed `bf` outside the domain CHECK. Adds the inline-critical clause to `pin_search_path.sql` and allowlists `match_term`/containment in the splinter lint so the unpinned extractor stays inlinable. Covered by family/sem.rs. --- src/v3/sem/bloom_filter/functions.sql | 59 +++++++++++++++++++ src/v3/sem/bloom_filter/types.sql | 14 +++++ tasks/pin_search_path.sql | 7 ++- tasks/test/splinter.sh | 4 ++ .../sqlx/tests/encrypted_domain/family/sem.rs | 45 ++++++++++++++ 5 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 src/v3/sem/bloom_filter/functions.sql create mode 100644 src/v3/sem/bloom_filter/types.sql diff --git a/src/v3/sem/bloom_filter/functions.sql b/src/v3/sem/bloom_filter/functions.sql new file mode 100644 index 000000000..29e5cf11e --- /dev/null +++ b/src/v3/sem/bloom_filter/functions.sql @@ -0,0 +1,59 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/bloom_filter/types.sql + +--! @file v3/sem/bloom_filter/functions.sql +--! @brief Extractor for the eql_v3 Bloom-filter SEM index term. +--! +--! jsonb-only subset of src/bloom_filter/functions.sql. The encrypted-column +--! overloads are intentionally omitted — the eql_v3 scalar domains extract from +--! the jsonb payload directly via a cast to the domain. (Doc comments +--! deliberately avoid naming eql_v2 symbols so the self-containment grep stays +--! clean.) + +--! @brief Test whether a jsonb payload carries a Bloom-filter (`bf`) term. +--! +--! @param val jsonb The encrypted payload. +--! @return boolean True when the `bf` key is present and non-null. +--! +--! @internal Defined for parity with the eql_v3 SEM index-term predicates +--! (`has_hmac_256` / `has_ore_block_u64_8_256`); it is not currently called by +--! the extractor below, which gates on value-shape inline, nor by the generated +--! domain CHECK, which tests `bf` presence via the envelope-key skeleton. Kept +--! as the canonical presence test for callers that need one. +CREATE FUNCTION eql_v3.has_bloom_filter(val jsonb) + RETURNS boolean + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + RETURN val ? 'bf' AND val ->> 'bf' IS NOT NULL; + END; +$$ LANGUAGE plpgsql; + +--! @brief Extract the Bloom-filter index term from a jsonb payload. +--! +--! Inlinable single-statement SQL — the planner can fold this into the calling +--! query so the functional GIN index built on `eql_v3.match_term(col)` (which +--! calls this) engages structurally. Mirrors `eql_v3.hmac_256(jsonb)`: no RAISE +--! and no pinned `search_path`. Returns NULL when `bf` is absent (or present but +--! not a json array) rather than raising — the `match` capability is tied to the +--! domain, whose CHECK already guarantees `bf` is a present array, so a missing +--! or malformed key can only occur on raw jsonb outside the domain (where NULL, +--! like the HMAC extractor, is the right answer). Gating on `jsonb_typeof(...) = +--! 'array'` keeps a degenerate payload such as `{"bf": null}` returning NULL +--! instead of erroring inside `jsonb_array_elements`. An empty `bf` array yields +--! an empty filter (contains nothing, contained by everything), matching +--! set-containment semantics. +--! +--! @param val jsonb The encrypted payload. +--! @return eql_v3.bloom_filter The `bf` array as a smallint[] domain value, or +--! NULL when `bf` is absent or not a json array. +CREATE FUNCTION eql_v3.bloom_filter(val jsonb) + RETURNS eql_v3.bloom_filter + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT CASE WHEN jsonb_typeof(val -> 'bf') = 'array' + THEN ARRAY(SELECT jsonb_array_elements(val -> 'bf'))::eql_v3.bloom_filter + END +$$; diff --git a/src/v3/sem/bloom_filter/types.sql b/src/v3/sem/bloom_filter/types.sql new file mode 100644 index 000000000..b319825e4 --- /dev/null +++ b/src/v3/sem/bloom_filter/types.sql @@ -0,0 +1,14 @@ +-- REQUIRE: src/v3/schema.sql + +--! @file v3/sem/bloom_filter/types.sql +--! @brief Self-contained eql_v3 Bloom-filter SEM index-term type. + +--! @brief Bloom-filter index term: a bit array stored as smallint[]. +--! +--! Backs the `match` capability (`@>` / `<@`) on `eql_v3.text_match`. The +--! filter is read from the `bf` field of an encrypted jsonb payload. Native +--! `smallint[]` array-containment (`@>`/`<@`) is inherited through the domain, +--! so this type needs no custom operators. +--! +--! @note Self-contained: references no eql_v2 symbol. +CREATE DOMAIN eql_v3.bloom_filter AS smallint[]; diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql index 75eed567f..66fb30080 100644 --- a/tasks/pin_search_path.sql +++ b/tasks/pin_search_path.sql @@ -254,8 +254,8 @@ BEGIN -- reaches functional-index matching if these inner functions stay inlinable -- (no SET, IMMUTABLE). The generated extractors/wrappers themselves are -- spared by the jsonb-DOMAIN structural skip below; these SEM functions take - -- a composite (ore_block) or raw jsonb (hmac_256) arg, so they need an - -- explicit entry here. + -- a composite (ore_block) or raw jsonb (hmac_256, bloom_filter) arg, so they + -- need an explicit entry here. n.nspname = 'eql_v3' AND ( (p.pronargs = 2 @@ -265,6 +265,9 @@ BEGIN OR (p.pronargs = 1 AND p.proname = 'hmac_256' AND p.proargtypes[0] = jsonb_oid) + OR (p.pronargs = 1 + AND p.proname = 'bloom_filter' + AND p.proargtypes[0] = jsonb_oid) ) ); diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index 282b485b0..cdb5d2f51 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -109,6 +109,9 @@ function_search_path_mutable eql_v2 grouped_value function Aggregate: same as mi # tasks/pin_search_path.sql and do not surface here. function_search_path_mutable eql_v3 eq_term function HMAC equality term extractor for the eql_v3 *_eq domains: returns eql_v3.hmac_256. Must inline so `eql_v3.eq_term(col)` folds into the calling query and matches the functional hash/btree index built on the same expression. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v3.ore_block_u64_8_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). +function_search_path_mutable eql_v3 match_term function Bloom-filter match term extractor for the eql_v3 *_match domains: returns eql_v3.bloom_filter. Used inside the inlinable @>/<@ containment wrappers and as the functional-index expression USING gin (eql_v3.match_term(col)); must inline so the GIN index engages. SET search_path would disable SQL function inlining. +function_search_path_mutable eql_v3 contains function Containment (@>) comparison wrapper on the eql_v3 *_match domains. Inlines to `match_term(a) @> match_term(b)`; must reach the functional GIN index on eql_v3.match_term(col) for bloom-filter match to engage Bitmap Index Scan. +function_search_path_mutable eql_v3 contained_by function Contained-by (<@) comparison wrapper on the eql_v3 *_match domains. Same rationale as eql_v3.contains. function_search_path_mutable eql_v3 eq function Equality comparison wrapper on the eql_v3 domains. Inlines to `eq_term(a) = eq_term(b)`; must reach the functional index on eql_v3.eq_term(col) for bare-form equality to engage Index Scan. Covers the converged eq wrappers on the eql_v3 int4 variants. function_search_path_mutable eql_v3 neq function Inequality comparison wrapper on the eql_v3 domains. Same rationale as eql_v3.eq. function_search_path_mutable eql_v3 lt function Less-than comparison wrapper on the eql_v3 ordered domains. Inlines to `ord_term(a) < ord_term(b)`; must reach the functional btree index on eql_v3.ord_term(col) for range queries to engage Index Scan. @@ -124,6 +127,7 @@ function_search_path_mutable eql_v3 ore_block_u64_8_256_lte function Inner compa function_search_path_mutable eql_v3 ore_block_u64_8_256_gt function Inner comparator for the eql_v3 ore_block_u64_8_256 `>` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. function_search_path_mutable eql_v3 ore_block_u64_8_256_gte function Inner comparator for the eql_v3 ore_block_u64_8_256 `>=` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.eq_term. Must inline so the functional hash/btree index on eql_v3.eq_term(col) engages. Mirrors eql_v2.hmac_256. +function_search_path_mutable eql_v3 bloom_filter function Bloom-filter match extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.match_term. Must inline so the functional GIN index on eql_v3.match_term(col) engages. Mirrors eql_v3.hmac_256. function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_u64_8_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours. The eql_v2 copy stays plpgsql (pinned) by design. function_search_path_mutable eql_v3 jsonb_array_to_ore_block_u64_8_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_u64_8_256, carries the `eql-inline-critical` COMMENT marker. The eql_v2 copy stays plpgsql (pinned) by design. ALLOW diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 90ac83fac..5346feb50 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -449,3 +449,48 @@ async fn ore_comparators_are_immutable(pool: PgPool) -> Result<()> { } Ok(()) } + +/// T7 — Bloom-filter SEM extractor (`eql_v3.bloom_filter(jsonb)`): reads the +/// `bf` array out of a payload. Inlinable SQL mirroring `hmac_256` — NULL on a +/// missing key, not a raise (the `match` capability is tied to the domain, +/// whose CHECK guarantees `bf`). +#[sqlx::test] +async fn bloom_filter_extractor_reads_bf_array(pool: PgPool) -> Result<()> { + let got: Vec = + sqlx::query_scalar("SELECT eql_v3.bloom_filter('{\"bf\":[1,2,3]}'::jsonb)::smallint[]") + .fetch_one(&pool) + .await?; + assert_eq!(got, vec![1i16, 2, 3]); + Ok(()) +} + +#[sqlx::test] +async fn bloom_filter_extractor_returns_null_without_bf(pool: PgPool) -> Result<()> { + // Inlinable SQL extractor (like hmac_256): a payload without `bf` yields + // NULL, not an exception. The RAISE is redundant because the `text_match` + // domain CHECK already guarantees `bf` is present on the typed path. + let got: Option> = + sqlx::query_scalar("SELECT eql_v3.bloom_filter('{\"hm\":\"x\"}'::jsonb)::smallint[]") + .fetch_one(&pool) + .await?; + assert!( + got.is_none(), + "absent bf must return NULL (capability is tied to the domain)" + ); + Ok(()) +} + +#[sqlx::test] +async fn bloom_filter_extractor_returns_null_for_non_array_bf(pool: PgPool) -> Result<()> { + // A degenerate raw payload where `bf` is present but not a json array + // (`{"bf": null}`) must return NULL, not error inside `jsonb_array_elements`. + // The extractor gates on `jsonb_typeof(...) = 'array'`, so a malformed key — + // only reachable outside the domain, whose CHECK guarantees an array — is + // treated like an absent one. + let got: Option> = + sqlx::query_scalar("SELECT eql_v3.bloom_filter('{\"bf\":null}'::jsonb)::smallint[]") + .fetch_one(&pool) + .await?; + assert!(got.is_none(), "non-array bf must return NULL, not raise"); + Ok(()) +} From edb3af3b2d848da653ba88be383071aa89c4b128 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:43:18 +1000 Subject: [PATCH 117/599] feat(codegen): containment metadata for @>/<@ on Bloom domains Teaches the codegen operator surface about the `@>`/`<@` containment operators so they are generated only on domains carrying the `Bloom` term (the `text_match` domain), and blocked elsewhere via the usual domain-fallback blockers. The operator-metadata test is table-driven, so a new term's surface is one table row. --- crates/eql-codegen/src/context.rs | 52 ++++++++++++++++------ crates/eql-codegen/src/operator_surface.rs | 38 ++++++++++++++-- 2 files changed, 72 insertions(+), 18 deletions(-) diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 78b508832..4581bfa48 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -310,19 +310,43 @@ mod tests { #[test] fn operator_entry_emits_metadata_only_when_supported() { use crate::operator_surface::operator; - // Supported comparison operator carries its planner metadata. - let eq = operator_entry(&operator("="), "eql_v3.int4_eq", "eql_v3.int4_eq", true); - assert_eq!(eq.symbol, "="); - assert_eq!(eq.function_name, "eq"); - assert_eq!( - eq.metadata.as_deref(), - Some("COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel") - ); - // The same operator, unsupported on this domain → no metadata line. - let eq_unsupported = operator_entry(&operator("="), "eql_v3.int4", "eql_v3.int4", false); - assert_eq!(eq_unsupported.metadata, None); - // Supported but metadata-less operator (`@>`) → still no metadata line. - let contains = operator_entry(&operator("@>"), "eql_v3.int4_eq", "eql_v3.int4_eq", true); - assert_eq!(contains.metadata, None); + + // (symbol, domain, supported) -> expected `CREATE OPERATOR` metadata + // clause. Adding a term that carries operator metadata is one new row + // here, not another hand-rolled assertion block. + let cases: &[(&str, &str, bool, Option<&str>)] = &[ + // Supported comparison operator carries its planner metadata. + ( + "=", + "eql_v3.int4_eq", + true, + Some("COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel"), + ), + // The same operator, unsupported on this domain → no metadata line. + ("=", "eql_v3.int4", false, None), + // Supported but metadata-less operator (`->`) → still no metadata. + ("->", "eql_v3.int4_eq", true, None), + // `@>` carries containment metadata when supported (the Bloom + // `text_match` path). + ( + "@>", + "eql_v3.text_match", + true, + Some("COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel"), + ), + // ... but suppressed when `@>` is a blocker (non-Bloom domains), + // which is why the int4 golden is unchanged. + ("@>", "eql_v3.int4_eq", false, None), + ]; + + for (symbol, dom, supported, expected) in cases { + let entry = operator_entry(&operator(symbol), dom, dom, *supported); + assert_eq!(entry.symbol, *symbol); + assert_eq!( + entry.metadata.as_deref(), + *expected, + "operator {symbol} on {dom} (supported={supported})", + ); + } } } diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index 19237ddef..d819f6e25 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -33,7 +33,7 @@ impl OperatorMetadata { } /// Render the `CREATE OPERATOR` metadata clause, or `None` when no hint is - /// present (the `@>`/`<@` symmetric-but-empty case collapses to `None`). + /// present (e.g. the path-selector operators, which carry no metadata). pub fn render(self) -> Option { let mut extras = Vec::new(); if let Some(c) = self.commutator { @@ -208,6 +208,18 @@ const fn cmp_metadata( } } +/// Containment-operator metadata (`@>` / `<@`): commutator is the mirror +/// operator, no negator (a non-containment is not another listed operator), +/// containment selectivity estimators. +const fn containment_metadata(commutator: &'static str) -> OperatorMetadata { + OperatorMetadata { + restrict: Some("contsel"), + join: Some("contjoinsel"), + commutator: Some(commutator), + negator: None, + } +} + /// The 20-operator catalog. Order is: comparison operators, then path-selector /// operators, then the remaining native jsonb operators. pub const OPERATORS: &[Operator] = &[ @@ -251,13 +263,13 @@ pub const OPERATORS: &[Operator] = &[ symbol: "@>", function_name: "contains", signatures: BOOL_SYMMETRIC_SIGNATURES, - metadata: OperatorMetadata::none(), + metadata: containment_metadata("<@"), }, Operator { symbol: "<@", function_name: "contained_by", signatures: BOOL_SYMMETRIC_SIGNATURES, - metadata: OperatorMetadata::none(), + metadata: containment_metadata("@>"), }, Operator { symbol: "->", @@ -519,7 +531,25 @@ mod tests { "COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel" ); assert_eq!(operator("->").metadata.render(), None); - assert_eq!(operator("@>").metadata.render(), None); + // `@>`/`<@` now carry containment metadata (no negator). + assert_eq!( + operator("@>").metadata.render().unwrap(), + "COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel" + ); + } + + #[test] + fn containment_operators_have_containment_metadata() { + let c = operator("@>"); + assert_eq!(c.metadata.commutator, Some("<@")); + assert_eq!(c.metadata.restrict, Some("contsel")); + assert_eq!(c.metadata.join, Some("contjoinsel")); + assert_eq!(c.metadata.negator, None); + let cb = operator("<@"); + assert_eq!(cb.metadata.commutator, Some("@>")); + assert_eq!(cb.metadata.restrict, Some("contsel")); + assert_eq!(cb.metadata.join, Some("contjoinsel")); + assert_eq!(cb.metadata.negator, None); } #[test] From 79854183f913356d9f129ebf20beca6972739596 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:43:51 +1000 Subject: [PATCH 118/599] feat(tests): wire text into the SQLx scalar matrix Registers `text => String` in the `scalar_types!` list and teaches the harness about an owned, non-Copy scalar: `ScalarType`/fixtures go `Copy` -> `Clone`, `to_sql_literal` takes `&Self`, and `String` gets a hand-written `impl ScalarType` (lexicographic pivots, single-quote SQL literal). The `eql-tests-macros` dispatch is catalog-derived (`is_int_token`/`is_temporal_token`/`is_text_token` read from `eql_scalars::CATALOG`) rather than a dispatch-list marker, and the `scalar_fixture!` macro gains a `text` arm stamping the `Match` index. Adds the sealed `EqlPlaintext` impl for `String` (text cast + `Plaintext::Text`). --- crates/eql-tests-macros/src/lib.rs | 112 ++++++++++++++++++---- tests/sqlx/src/fixtures/driver.rs | 6 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 43 ++++++++- tests/sqlx/src/fixtures/scalar_fixture.rs | 67 ++++++++++--- tests/sqlx/src/matrix.rs | 55 +++++------ tests/sqlx/src/scalar_domains.rs | 108 +++++++++++++++++++-- tests/sqlx/src/scalar_types.rs | 1 + 7 files changed, 313 insertions(+), 79 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 01b1d1e79..b26c31767 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -73,6 +73,26 @@ fn is_temporal_token(token: &str) -> bool { spec_for_token(token).kind.is_temporal() } +/// True when `token`'s catalog kind is a fixed-width integer (`int2`/`int4`/ +/// `int8`). The integer kinds are the only ones whose `impl ScalarType` is +/// macro-generated (inherent `MIN`/`MAX` pivots + a `const` `_VALUES` +/// slice) and whose fixture module stamps the `int` discriminator. Every +/// non-integer kind (`date`, `text`) is hand-written in `scalar_domains.rs` and +/// skipped by `scalar_type_impls_tokens`. +fn is_int_token(token: &str) -> bool { + spec_for_token(token).kind.is_int() +} + +/// True when `token`'s catalog kind is `text` — an unbounded, owned-`String` +/// scalar. Like a temporal scalar it is hand-written (no `const`-friendly +/// inherent pivots), so `emit_scalar_type_impls` skips it; but it stamps the +/// `text` fixture discriminator (which additionally adds the `Match` index, so +/// generated payloads carry `bf`) and draws its values from the harness accessor +/// (`text_values()`). Replaces the `[text]` marker. +fn is_text_token(token: &str) -> bool { + matches!(spec_for_token(token).kind, eql_scalars::ScalarKind::Text) +} + /// True when `token`'s catalog row declares no ordered domain — equality-only. /// Replaces the `[eq_only]` marker. Consumed by [`matrix_suite_for_entry`] to /// keep an eq-only type out of the ordered matrix (which exercises ordering @@ -107,12 +127,15 @@ fn values_const_ident(token: &Ident) -> Ident { /// Emit one `impl ScalarType for ` per entry. See /// [`emit_scalar_type_impls`]. fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { - // Temporal scalars hand off their `impl ScalarType` to `temporal_values!` - // (catalog-driven); only integer scalars get a macro-generated impl here. + // Only integer scalars get a macro-generated impl (inherent `MIN`/`MAX` + // pivots + a `const` `_VALUES` slice). Every non-integer kind is + // hand-written in `scalar_domains.rs`: temporal scalars (`date`) hand off to + // `temporal_values!`, and `text` is an owned `String` with explicit pivots — + // both would fail to typecheck through the integer materialiser. let impls = list .entries .iter() - .filter(|e| !is_temporal_token(&e.token.to_string())) + .filter(|e| is_int_token(&e.token.to_string())) .map(|e| { let token_str = e.token.to_string(); let rust_type = &e.rust_type; @@ -151,22 +174,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { let rust_type = &e.rust_type; let mod_ident = format_ident!("eql_v2_{}", e.token); let fixture_name = format!("eql_v2_{}", token_str); - if is_temporal_token(&e.token.to_string()) { - // Temporal scalars have no `eql_scalars::_VALUES` const (chrono - // is not `const`-friendly). The values come from the harness - // accessor (`_values()`), and the fixture stamps the - // `temporal` kind so the integer-only signed-extreme asserts are - // replaced by a pivot-presence assert. The accessor name mirrors - // the token (`date` -> `date_values`). - let values_fn = format_ident!("{}_values", e.token); - quote! { - #[doc = concat!("`eql_v2_", #token_str, "` temporal scalar fixture — generated by `scalar_types!`.")] - pub mod #mod_ident { - use crate::scalar_domains::#values_fn as values; - crate::scalar_fixture!(temporal, #fixture_name, #rust_type, values()); - } - } - } else { + if is_int_token(&token_str) { let values = values_const_ident(&e.token); quote! { #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] @@ -177,6 +185,35 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { crate::scalar_fixture!(int, #fixture_name, #rust_type, VALUES); } } + } else { + // Hand-written non-integer scalars (`date`, `text`) have no + // `eql_scalars::_VALUES` const usable by the integer + // materialiser (chrono is not `const`-friendly; text is owned + // `String`). The values come from the harness accessor + // (`_values()`), and the fixture stamps the kind-specific + // discriminator so the integer-only signed-extreme asserts are + // replaced by a pivot-presence assert. The `text` discriminator + // additionally adds the `Match` index, so generated payloads carry + // `bf`. The accessor name mirrors the token (`date` -> `date_values`, + // `text` -> `text_values`). + let values_fn = format_ident!("{}_values", e.token); + let discriminator = if is_temporal_token(&token_str) { + format_ident!("temporal") + } else if is_text_token(&token_str) { + format_ident!("text") + } else { + panic!( + "scalar token `{token_str}` is neither integer, temporal, nor \ + text — no fixture discriminator is wired for its kind" + ) + }; + quote! { + #[doc = concat!("`eql_v2_", #token_str, "` hand-written scalar fixture — generated by `scalar_types!`.")] + pub mod #mod_ident { + use crate::scalar_domains::#values_fn as values; + crate::scalar_fixture!(#discriminator, #fixture_name, #rust_type, values()); + } + } } }); quote! { #(#mods)* } @@ -398,6 +435,43 @@ mod tests { assert!(!is_eq_only_token("date")); } + #[test] + fn kind_classification_is_read_from_catalog_not_a_marker() { + // Integer vs temporal vs text is read from the catalog kind, never from + // a `[marker]` on the dispatch entry. + assert!(is_int_token("int4")); + assert!(!is_int_token("date")); + assert!(!is_int_token("text")); + assert!(is_text_token("text")); + assert!(!is_text_token("int4")); + assert!(!is_text_token("date")); + } + + #[test] + fn text_entry_skips_impl_and_stamps_text_fixture() { + // No marker: `text`'s shape is read from eql-scalars::CATALOG. + let list = syn::parse_str::("int4 => i32, text => String").unwrap(); + // Impl emitter skips the text entry (hand-written in scalar_domains.rs). + let impls = norm(&scalar_type_impls_tokens(&list)); + assert!(impls.contains("impl ScalarType for i32")); + assert!( + !impls.contains("impl ScalarType for String"), + "text must skip the generated impl (hand-written instead)" + ); + // Fixture-module emitter stamps the text kind + harness accessor. The + // `text` discriminator drives the Match index (payloads carry `bf`). + let mods = norm(&scalar_fixture_modules_tokens(&list)); + assert!(mods.contains("pub mod eql_v2_text")); + assert!(mods.contains("text ,"), "got: {mods}"); + assert!(mods.contains("text_values"), "got: {mods}"); + // Matrix + dispatch emitters include the text entry like any other. + let suites = norm(&scalar_matrix_suites_tokens(&list)); + assert!(suites.contains("pub mod text")); + assert!(suites.contains("scalar = String")); + let dispatch = norm(&fixture_dispatch_tokens(&list)); + assert!(dispatch.contains(r#""text" =>"#)); + } + #[test] fn ordered_entry_emits_scalar_matrix_with_eq_ord_caps() { let token: Ident = syn::parse_str("int4").unwrap(); diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs index 127e20a16..96c0411d7 100644 --- a/tests/sqlx/src/fixtures/driver.rs +++ b/tests/sqlx/src/fixtures/driver.rs @@ -32,7 +32,7 @@ use super::spec::FixtureSpec; /// already satisfies the bounds. pub trait FixtureValue: EqlPlaintext - + Copy + + Clone + Send + Sync + for<'q> sqlx::Encode<'q, sqlx::Postgres> @@ -42,7 +42,7 @@ pub trait FixtureValue: impl FixtureValue for T where T: EqlPlaintext - + Copy + + Clone + Send + Sync + for<'q> sqlx::Encode<'q, sqlx::Postgres> @@ -213,7 +213,7 @@ where let id = (i as i64) + 1; sqlx::query(&insert) .bind(id) - .bind(*value) + .bind(value.clone()) .bind(sqlx::types::Json(payload)) .execute(&mut *direct) .await diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 5cb88099e..cacce8720 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -58,6 +58,7 @@ impl PlaintextSqlType { pub const BIGINT: PlaintextSqlType = PlaintextSqlType("bigint"); pub const DATE: PlaintextSqlType = PlaintextSqlType("date"); pub const TIMESTAMPTZ: PlaintextSqlType = PlaintextSqlType("timestamp with time zone"); + pub const TEXT: PlaintextSqlType = PlaintextSqlType("text"); pub fn as_str(&self) -> &'static str { self.0 @@ -72,8 +73,8 @@ impl fmt::Display for PlaintextSqlType { /// The EQL `cast_as` for a scalar kind, drawn from the `Cast` allowlist. /// -/// Only the wired kinds (the integer kinds plus `Date` / `Timestamptz`) have -/// `EqlPlaintext` impls, so only those resolve; the remaining kinds mirror the +/// Only the wired kinds (the integer kinds, `Text`, plus `Date` / `Timestamptz`) +/// have `EqlPlaintext` impls, so only those resolve; the remaining kinds mirror the /// `eql_scalars` accessor convention and `panic!`, since no impl can ever reach /// them. const fn cast_for_kind(kind: ScalarKind) -> Cast { @@ -83,7 +84,8 @@ const fn cast_for_kind(kind: ScalarKind) -> Cast { ScalarKind::I64 => Cast::BIG_INT, ScalarKind::Date => Cast::DATE, ScalarKind::Timestamptz => Cast::TIMESTAMP, - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::Text => Cast::TEXT, + ScalarKind::Numeric | ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } } @@ -91,7 +93,7 @@ const fn cast_for_kind(kind: ScalarKind) -> Cast { /// The `plaintext` oracle column SQL type for a scalar kind, drawn from the /// `PlaintextSqlType` allowlist. As with `cast_for_kind`, only the wired kinds -/// (integers plus `Date` / `Timestamptz`) resolve. +/// (integers, `Text`, plus `Date` / `Timestamptz`) resolve. const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { match kind { ScalarKind::I32 => PlaintextSqlType::INTEGER, @@ -99,7 +101,8 @@ const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { ScalarKind::I64 => PlaintextSqlType::BIGINT, ScalarKind::Date => PlaintextSqlType::DATE, ScalarKind::Timestamptz => PlaintextSqlType::TIMESTAMPTZ, - ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb => { + ScalarKind::Text => PlaintextSqlType::TEXT, + ScalarKind::Numeric | ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } } @@ -112,6 +115,7 @@ mod sealed { impl Sealed for i64 {} impl Sealed for chrono::NaiveDate {} impl Sealed for chrono::DateTime {} + impl Sealed for String {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -179,6 +183,14 @@ impl EqlPlaintext for chrono::DateTime { } } +impl EqlPlaintext for String { + const KIND: ScalarKind = ScalarKind::Text; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::Text(Some(self.clone())) + } +} + #[cfg(test)] mod tests { use super::*; @@ -301,4 +313,25 @@ mod tests { other => panic!("expected Plaintext::Timestamp(Some(epoch)), got {other:?}"), } } + + #[test] + fn string_cast_is_text() { + assert_eq!(::CAST, Cast::TEXT); + } + + #[test] + fn string_plaintext_sql_type_is_text() { + assert_eq!( + ::PLAINTEXT_SQL_TYPE, + PlaintextSqlType::TEXT + ); + } + + #[test] + fn string_to_plaintext_is_text() { + // A String must lift into the Text variant so the fixture driver + // encrypts it under the `text` cast. + let p = "hi".to_string().to_plaintext(); + assert!(matches!(p, Plaintext::Text(Some(ref s)) if s == "hi")); + } } diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index d6a955abb..451917d5f 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -13,28 +13,34 @@ /// Stamp out the `spec()` builder, the `fixture-gen` generator test, and the /// property-test module for a scalar fixture. /// -/// The leading **kind** discriminator (`int` / `temporal`) selects which -/// property asserts are stamped — the rest of the expansion is identical: +/// The leading **kind** discriminator (`int` / `temporal` / `text`) selects +/// which property asserts are stamped and which index set the fixture declares +/// — the rest of the expansion is identical: /// /// - `int` — signed-extreme asserts (`<$ty>::MIN`/`MAX`, `contains(&0)`, -/// `any(|v| v < 0)`). These typecheck only for integer plaintexts. +/// `any(|v| v < 0)`). These typecheck only for integer plaintexts. Indexes +/// `Unique` + `Ore`. /// - `temporal` — a pivot-presence assert (`min_pivot`/`max_pivot`/zero from the /// `ScalarType` impl all appear in the values). `<$ty>::MIN` / `< 0` don't /// exist for a `chrono::NaiveDate`, so the integer asserts can't be reused. +/// Indexes `Unique` + `Ore`. +/// - `text` — pivot-presence asserts (same as `temporal`; text has no signed +/// extremes), plus a third `Match` index so generated payloads carry `bf` for +/// the `text_match` containment surface. Indexes `Unique` + `Ore` + `Match`. /// /// - `$name` — the fixture name (`"eql_v2_int2"`), drives every derived path. -/// - `$ty` — the Rust plaintext type (`i16` / `chrono::NaiveDate`). +/// - `$ty` — the Rust plaintext type (`i16` / `chrono::NaiveDate` / `String`). /// - `$values` — the value source: the catalog const (`eql_scalars::INT2_VALUES`) -/// for integers, or the harness accessor (`date_values()`) for temporal. +/// for integers, or the harness accessor (`date_values()` / `text_values()`). /// -/// Indexes are fixed to `Unique` (HMAC, drives `=` / `<>`) and `Ore` (ORE -/// block terms, drives `<` `<=` `>` `>=`) with a committed `jsonb` payload — -/// the shape shared by every ordered scalar domain. +/// `Unique` drives `=` / `<>` (HMAC); `Ore` drives `<` `<=` `>` `>=` (ORE block +/// terms); `Match` drives `@>` / `<@` (bloom filter). The committed payload is +/// always `jsonb`. #[macro_export] macro_rules! scalar_fixture { // Integer scalars: signed-extreme property asserts. (int, $name:literal, $ty:ty, $values:expr $(,)?) => { - $crate::scalar_fixture!(@common $name, $ty, $values); + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); #[cfg(test)] mod tests { @@ -73,7 +79,7 @@ macro_rules! scalar_fixture { // Temporal scalars: pivot-presence property assert (no signed extremes). (temporal, $name:literal, $ty:ty, $values:expr $(,)?) => { - $crate::scalar_fixture!(@common $name, $ty, $values); + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); #[cfg(test)] mod tests { @@ -101,15 +107,46 @@ macro_rules! scalar_fixture { } }; - // Shared expansion: the `spec()` builder + the gated generator test. - (@common $name:literal, $ty:ty, $values:expr) => { + // Text scalars: pivot-presence asserts (like temporal) + the `Match` index + // so generated payloads carry `bf` for the `text_match` containment surface. + (text, $name:literal, $ty:ty, $values:expr $(,)?) => { + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore, Match]); + + #[cfg(test)] + mod tests { + use super::*; + use $crate::scalar_domains::ScalarType; + + #[test] + fn spec_is_complete() { + assert!(spec().check_complete().is_ok()); + } + + #[test] + fn spec_includes_pivots() { + // text has no signed extremes; assert the ScalarType pivots are + // present (min/max/zero), like the temporal arm. + let spec = spec(); + let values = spec.values(); + let min = <$ty as ScalarType>::min_pivot(); + let max = <$ty as ScalarType>::max_pivot(); + let zero: $ty = ::core::default::Default::default(); + assert!(values.contains(&min), "spec must include min_pivot {min:?}"); + assert!(values.contains(&max), "spec must include max_pivot {max:?}"); + assert!(values.contains(&zero), "spec must include zero pivot {zero:?}"); + } + } + }; + + // Shared expansion: the `spec()` builder + the gated generator test. The + // trailing `[Unique, Ore, ...]` token list parametrizes the index set. + (@common $name:literal, $ty:ty, $values:expr, [$($ix:ident),+ $(,)?]) => { /// The complete fixture definition. `IndexKind::Unique` drives `=` / /// `<>` (HMAC); `IndexKind::Ore` drives `<` `<=` `>` `>=` (ORE block - /// terms). + /// terms); `IndexKind::Match` (when present) drives `@>` / `<@` (bloom). pub fn spec() -> $crate::fixtures::FixtureSpec<'static, $ty> { $crate::fixtures::FixtureSpec::new($name) - .with_index($crate::fixtures::IndexKind::Unique) - .with_index($crate::fixtures::IndexKind::Ore) + $(.with_index($crate::fixtures::IndexKind::$ix))+ .with_column_type("jsonb") .with_values($values) } diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 9b79103be..f52327a9c 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -589,7 +589,7 @@ macro_rules! __scalar_matrix_correctness_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let pivot: $scalar = $pivot_val; let payload = - $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot.clone()).await?; let lit = $crate::scalar_domains::sql_string_literal(&payload); let predicate = format!( "payload::{d} {op} {lit}::jsonb::{d}", @@ -630,13 +630,13 @@ macro_rules! __scalar_matrix_cross_shape_case { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let pivot: $scalar = $pivot_val; let payload = - $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot.clone()).await?; let lit = $crate::scalar_domains::sql_string_literal(&payload); let forward_count = - <$scalar as $crate::scalar_domains::ScalarType>::expected_forward($op, pivot) + <$scalar as $crate::scalar_domains::ScalarType>::expected_forward($op, pivot.clone()) .len() as i64; let commuted_count = <$scalar as $crate::scalar_domains::ScalarType>::expected_forward( - $crate::scalar_domains::commute_op($op), pivot, + $crate::scalar_domains::commute_op($op), pivot.clone(), ).len() as i64; let d = &spec.sql_domain; let shapes = [ @@ -1179,8 +1179,8 @@ macro_rules! __scalar_matrix_scale_case { let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!(values.len() >= 2, "scale test requires >= 2 fixture rows for distinct filler/pivot"); - let filler = values[0]; - let pivot = values[values.len() / 2]; + let filler = values[0].clone(); + let pivot = values[values.len() / 2].clone(); let filler_payload = $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, filler).await?; let pivot_payload = @@ -1277,8 +1277,8 @@ macro_rules! __scalar_matrix_scale_default_case { let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!(values.len() >= 2, "scale test requires >= 2 fixture rows for distinct filler/pivot"); - let filler = values[0]; - let pivot = values[values.len() / 2]; + let filler = values[0].clone(); + let pivot = values[values.len() / 2].clone(); let filler_payload = $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, filler).await?; let pivot_payload = @@ -1391,7 +1391,7 @@ macro_rules! __scalar_matrix_fixture_shape { // Value-filtering oracle: take the midpoint of FIXTURE_VALUES, // derive its expected id from position, assert exactly one row. if !expected.is_empty() { - let probe = expected[expected.len() / 2]; + let probe = &expected[expected.len() / 2]; let probe_lit = <$scalar as ScalarType>::to_sql_literal(probe); let expected_id = (expected.len() / 2 + 1) as i64; let ids: Vec = sqlx::query_scalar(&format!( @@ -1454,9 +1454,9 @@ macro_rules! __scalar_matrix_ord_routes_case { let fixture_table = <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); let pivot: $scalar = - <$scalar as $crate::scalar_domains::ScalarType>::fixture_values()[0]; + <$scalar as $crate::scalar_domains::ScalarType>::fixture_values()[0].clone(); let pivot_lit = - <$scalar as $crate::scalar_domains::ScalarType>::to_sql_literal(pivot); + <$scalar as $crate::scalar_domains::ScalarType>::to_sql_literal(&pivot); let mut tx = pool.begin().await?; sqlx::query(&format!( @@ -1669,7 +1669,7 @@ macro_rules! __scalar_matrix_index_case { .execute(&mut *tx).await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: $scalar = <$scalar as $crate::scalar_domains::ScalarType>::fixture_values()[0]; + let pivot: $scalar = <$scalar as $crate::scalar_domains::ScalarType>::fixture_values()[0].clone(); let payload = $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; let lit = $crate::scalar_domains::sql_string_literal(&payload); @@ -1789,7 +1789,7 @@ macro_rules! __scalar_matrix_order_by_case { // '1970-01-01'` for dates. A hardcoded `> 0` would not typecheck // against a non-integer plaintext column. let where_clause = if gt_zero { - format!(" WHERE plaintext > {}", <$scalar as ScalarType>::to_sql_literal(zero)) + format!(" WHERE plaintext > {}", <$scalar as ScalarType>::to_sql_literal(&zero)) } else { String::new() }; @@ -2101,10 +2101,10 @@ macro_rules! __scalar_matrix_aggregate_case { let fixture = <$scalar as ScalarType>::fixture_table_name(); let extremum: $scalar = <$scalar as ScalarType>::fixture_values() .iter() - .copied() + .cloned() .$picker() .expect("FIXTURE_VALUES must be non-empty"); - let extremum_lit = <$scalar as ScalarType>::to_sql_literal(extremum); + let extremum_lit = <$scalar as ScalarType>::to_sql_literal(&extremum); let expected: String = sqlx::query_scalar(&format!( "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = extremum_lit, @@ -2219,13 +2219,14 @@ macro_rules! __scalar_matrix_aggregate_case { // Span the fixture's extremes — for signed numeric scalars this // exercises the ORE sign-bit edges in addition to pinning STRICT // sfunc behaviour. - let low: $scalar = *sorted.first().expect("non-empty after len check"); - let high: $scalar = *sorted.last().expect("non-empty after len check"); + let low: $scalar = sorted.first().expect("non-empty after len check").clone(); + let high: $scalar = sorted.last().expect("non-empty after len check").clone(); // .min() / .max() on two values resolves to the correct picker. - let expected_plaintext: $scalar = low.$picker(high); - let low_lit = <$scalar as ScalarType>::to_sql_literal(low); - let high_lit = <$scalar as ScalarType>::to_sql_literal(high); - let expected_lit = <$scalar as ScalarType>::to_sql_literal(expected_plaintext); + // Clone so `low`/`high` survive for the literals below. + let expected_plaintext: $scalar = low.clone().$picker(high.clone()); + let low_lit = <$scalar as ScalarType>::to_sql_literal(&low); + let high_lit = <$scalar as ScalarType>::to_sql_literal(&high); + let expected_lit = <$scalar as ScalarType>::to_sql_literal(&expected_plaintext); let mut tx = pool.begin().await?; sqlx::query(&format!( @@ -2399,12 +2400,12 @@ macro_rules! __scalar_matrix_aggregate_group_by_case { // the ground truth. let group1: &[$scalar] = &values[..3]; let group2: &[$scalar] = &values[3..5]; - let group1_extremum: $scalar = group1.iter().copied().$picker() + let group1_extremum: $scalar = group1.iter().cloned().$picker() .expect("group 1 is non-empty"); - let group2_extremum: $scalar = group2.iter().copied().$picker() + let group2_extremum: $scalar = group2.iter().cloned().$picker() .expect("group 2 is non-empty"); - let g1_lit = <$scalar as ScalarType>::to_sql_literal(group1_extremum); - let g2_lit = <$scalar as ScalarType>::to_sql_literal(group2_extremum); + let g1_lit = <$scalar as ScalarType>::to_sql_literal(&group1_extremum); + let g2_lit = <$scalar as ScalarType>::to_sql_literal(&group2_extremum); let mut tx = pool.begin().await?; sqlx::query(&format!( @@ -2414,7 +2415,7 @@ ON COMMIT DROP", // Insert group 1 rows. for v in group1 { - let lit = <$scalar as ScalarType>::to_sql_literal(*v); + let lit = <$scalar as ScalarType>::to_sql_literal(v); sqlx::query(&format!( "INSERT INTO group_test(group_key, value) \ SELECT 1, payload::{d} FROM {fixture} WHERE plaintext = {lit}", @@ -2422,7 +2423,7 @@ SELECT 1, payload::{d} FROM {fixture} WHERE plaintext = {lit}", } // Insert group 2 rows. for v in group2 { - let lit = <$scalar as ScalarType>::to_sql_literal(*v); + let lit = <$scalar as ScalarType>::to_sql_literal(v); sqlx::query(&format!( "INSERT INTO group_test(group_key, value) \ SELECT 2, payload::{d} FROM {fixture} WHERE plaintext = {lit}", diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index c46fde9df..913e22655 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -15,7 +15,7 @@ use std::fmt::{Debug, Display}; /// One impl per scalar type. Two `const`s and the rest defaults. pub trait ScalarType: - Copy + Clone + Ord + Default + Debug @@ -69,16 +69,20 @@ pub trait ScalarType: format!("fixtures.eql_v2_{}", Self::PG_TYPE) } - /// SQL-literal rendering via `Display`. Override for types whose - /// `Display` form isn't a valid SQL literal (e.g. strings, dates). - fn to_sql_literal(value: Self) -> String { + /// SQL-literal rendering via `Display`. Takes `&Self` so a non-`Copy` + /// scalar (e.g. `String`) can be rendered without being consumed. Override + /// for types whose `Display` form isn't a valid SQL literal (e.g. strings, + /// dates). + fn to_sql_literal(value: &Self) -> String { value.to_string() } /// Ground-truth result set for `WHERE col op pivot`. Default works /// for any `Ord` scalar; override only for non-orderable types. fn expected_forward(op: &str, pivot: Self) -> Vec { - let predicate: fn(Self, Self) -> bool = match op { + // `&Self`-taking predicate so the default impl stays generic over a + // merely-`Clone` (non-`Copy`) scalar like `String`. + let predicate: fn(&Self, &Self) -> bool = match op { "=" => |a, b| a == b, "<>" => |a, b| a != b, "<" => |a, b| a < b, @@ -89,8 +93,8 @@ pub trait ScalarType: }; let mut values: Vec = Self::fixture_values() .iter() - .copied() - .filter(|v| predicate(*v, pivot)) + .filter(|v| predicate(v, &pivot)) + .cloned() .collect(); values.sort(); values @@ -153,9 +157,9 @@ macro_rules! temporal_values { fn fixture_values() -> &'static [$ty] { $accessor() } fn min_pivot() -> $ty { $min } fn max_pivot() -> $ty { $max } - fn to_sql_literal(value: $ty) -> String { + fn to_sql_literal(value: &$ty) -> String { let f: fn(&$ty) -> String = $sql_lit; - f(&value) + f(value) } } @@ -285,6 +289,90 @@ mod timestamptz_value_guards { } } +// `text` is hand-written rather than driven by `temporal_values!`: it is an +// owned `String` (not chrono-backed), so it materialises its values from the +// `eql_scalars::TEXT_VALUES` const slice rather than parsing catalog strings. +// `text_values()` is public so the `eql_v2_text` fixture module (emitted by +// `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. + +/// Typed `String` fixture values, built once from `text`'s catalog row. +/// `eql_scalars::TEXT_VALUES` is a `&[&'static str]` const, but the `ScalarType` +/// contract returns `&[Self]` = `&[String]` (owned), so we materialise them into +/// a `LazyLock>` and return a borrow — the same shape as +/// `date_values`. (Unlike `date`, no parsing is needed; the values are the +/// strings verbatim.) +static TEXT_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock::new(|| { + eql_scalars::TEXT_VALUES + .iter() + .map(|s| s.to_string()) + .collect() +}); + +/// The `String` fixture values, in catalog order. Public so the `eql_v2_text` +/// fixture module (emitted by `scalar_types!(fixture_modules)`) can hand the +/// slice to `scalar_fixture!` — `text` is owned `String`, so there is no +/// `eql_scalars::_VALUES`-typed `&[String]` const to point at directly. +pub fn text_values() -> &'static [String] { + &TEXT_VALUES_CELL +} + +impl ScalarType for String { + const PG_TYPE: &'static str = "text"; + + fn fixture_values() -> &'static [Self] { + text_values() + } + + /// Lexicographic min pivot — the lexicographically-smallest non-empty + /// fixture (`"aard"`; the empty-string zero pivot sorts below it). Present + /// verbatim in `fixture_values()`; keep in sync with `TEXT_FIXTURES`. + fn min_pivot() -> Self { + "aard".to_string() + } + + /// Lexicographic max pivot — the lexicographically-largest fixture + /// (`"zzzz"`). + fn max_pivot() -> Self { + "zzzz".to_string() + } + + /// `Display` for a `String` is the unquoted text, which is not a valid SQL + /// literal; quote it and double any embedded single quotes. + fn to_sql_literal(value: &Self) -> String { + format!("'{}'", value.replace('\'', "''")) + } +} + +#[cfg(test)] +mod text_value_tests { + use super::*; + + /// The `min`/`max`/zero pivots resolve to fixture rows present verbatim, so + /// `fetch_fixture_payload` can resolve each one's ciphertext. + #[test] + fn text_pivots_are_in_fixture_values() { + let values = ::fixture_values(); + let min = ::min_pivot(); + let max = ::max_pivot(); + let zero = String::default(); + assert!(values.contains(&min), "min_pivot {min:?} must be a fixture"); + assert!(values.contains(&max), "max_pivot {max:?} must be a fixture"); + assert!(values.contains(&zero), "zero pivot \"\" must be a fixture"); + assert!(min <= max, "lexicographic min must not exceed max"); + } + + /// The harness value list matches the catalog `TEXT_VALUES` in order — the + /// oracle cannot drift from the catalog the fixture generator encrypts. + #[test] + fn text_values_match_catalog() { + let got: Vec<&str> = ::fixture_values() + .iter() + .map(|s| s.as_str()) + .collect(); + assert_eq!(got, eql_scalars::TEXT_VALUES.to_vec()); + } +} + /// Per-domain capability + payload shape. Storage carries no terms, `Eq` /// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate /// twins — same operator surface, different SQL domain names — for the @@ -414,7 +502,7 @@ pub async fn fetch_fixture_payload(pool: &PgPool, plaintext: T) - let sql = format!( "SELECT payload::text FROM {table} WHERE plaintext = {lit}", table = T::fixture_table_name(), - lit = T::to_sql_literal(plaintext), + lit = T::to_sql_literal(&plaintext), ); sqlx::query_scalar(&sql) .fetch_one(pool) diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 5ab94293c..a51b288db 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -56,6 +56,7 @@ macro_rules! scalar_types { int8 => i64, date => chrono::NaiveDate, timestamptz => chrono::DateTime, + text => String, } }; } From f98ba699e59865b9d8907fa4cea889273cfa275d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:44:12 +1000 Subject: [PATCH 119/599] refactor(tests): split ScalarType into OrderedScalar/SignedScalar; fix text "" pivot (#262) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The scalar matrix's third pivot was hardwired to `Default::default()` — `0` for int, the epoch for date, but `""` for text, which encrypts to an empty ORE term and broke ordering/aggregates. Introduce the taxonomy as traits: - `ScalarType` (base) — identity, fixtures, literal rendering. - `OrderedScalar: ScalarType` — `min_pivot`/`max_pivot` + an overridable interior `mid_pivot` (default `Self::default()`). int/date inherit (0/epoch); text overrides to a real median ("frank"), never the degenerate "". - `SignedScalar: OrderedScalar` — `origin()` (numeric zero / sign boundary). int and date only; text is NOT `SignedScalar`. The proc-macro and the `temporal_values!` macro emit the `OrderedScalar` (+ `SignedScalar`) impls; the unified `scalar_matrix!` sweeps `min`/`mid`/`max` from `OrderedScalar` (the `_pivot_zero_` -> `_pivot_mid_` snapshot rename). The signed-only sign-boundary test lives in `encrypted_domain/signed.rs`, generic over `SignedScalar`, so a `text` instantiation is a compile error. Drops `""` from `TEXT_FIXTURES`. --- crates/eql-scalars/src/lib.rs | 19 ++- crates/eql-scalars/src/tests.rs | 11 +- crates/eql-tests-macros/src/lib.rs | 12 ++ tests/sqlx/snapshots/README.md | 8 ++ tests/sqlx/snapshots/matrix_tests.txt | 56 ++++---- tests/sqlx/src/fixtures/scalar_fixture.rs | 26 ++-- tests/sqlx/src/matrix.rs | 67 ++++++---- tests/sqlx/src/scalar_domains.rs | 138 ++++++++++++++------ tests/sqlx/tests/encrypted_domain/signed.rs | 53 ++++++++ 9 files changed, 273 insertions(+), 117 deletions(-) create mode 100644 tests/sqlx/tests/encrypted_domain/signed.rs diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 56777bbc8..d3d055e1c 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -326,14 +326,19 @@ const TEXT_DOMAINS: &[DomainSpec] = &[ }, ]; -/// `text` fixture plaintexts — curated so eq/ord give a lexicographic spread, -/// `""` is the ordered "zero" pivot (`String::default()`), and the match suite -/// has a known substring pair (`"aardvark"`/`"aard"`, sharing 3-grams) and a -/// disjoint value (`"zzzz"`, no shared 3-grams). `"aard"` is the lexicographic -/// `min_pivot` (after `""`) and `"zzzz"` the `max_pivot`; both must be present -/// verbatim so the matrix can fetch their ciphertext. All distinct. +/// `text` fixture plaintexts — curated so eq/ord give a lexicographic spread +/// and the match suite has a known substring pair (`"aardvark"`/`"aard"`, +/// sharing 3-grams) and a disjoint value (`"zzzz"`, no shared 3-grams). +/// `"aard"` is the lexicographic `min_pivot`, `"zzzz"` the `max_pivot`, and +/// `"frank"` the interior `mid_pivot`; all three must be present verbatim so the +/// matrix can fetch their ciphertext. All distinct. +/// +/// The empty string is deliberately **not** a fixture: text is an ordered, not +/// signed, scalar (no numeric origin), and `""` encrypts to an empty ORE term +/// whose comparison is undefined (see issue #262). The interior pivot is a real +/// median value, not `String::default()`. const TEXT_FIXTURES: &[Fixture] = fixtures!(text; - "", "aard", "aardvark", "alice", "bob", "carol", + "aard", "aardvark", "alice", "bob", "carol", "dave", "erin", "frank", "mallory", "trent", "zzzz"); /// `text` — an ordered, non-integer, unbounded scalar. Adds a `_match` domain diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 2b2dd05f5..28824ae95 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -660,10 +660,15 @@ mod values_tests { for v in TEXT_VALUES { assert!(seen.insert(*v), "duplicate text fixture: {v}"); } - // empty string present as the lexicographic zero pivot + // The interior `mid_pivot` ("frank") must be present; the empty string + // must NOT (text has no numeric origin — see issue #262). assert!( - TEXT_VALUES.contains(&""), - "TEXT_VALUES must include the empty string" + TEXT_VALUES.contains(&"frank"), + "TEXT_VALUES must include the mid pivot \"frank\"" + ); + assert!( + !TEXT_VALUES.contains(&""), + "TEXT_VALUES must not include the empty string" ); } diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index b26c31767..e7f45074e 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -150,7 +150,9 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { fn fixture_values() -> &'static [#rust_type] { ::eql_scalars::#values } + } + impl OrderedScalar for #rust_type { /// Integer scalars pivot on their inherent `MIN`/`MAX` consts; /// the fixture lists include both (`fixtures!(int …; Min, …, Max)`). fn min_pivot() -> #rust_type { @@ -160,6 +162,16 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { fn max_pivot() -> #rust_type { <#rust_type>::MAX } + // `mid_pivot` inherits the default `Self::default()` = `0`, + // which is the numeric origin and a `Zero` fixture row. + } + + impl SignedScalar for #rust_type { + /// Integers are signed about `0`; the fixtures straddle it + /// (negatives below, positives above). + fn origin() -> #rust_type { + 0 + } } } }); diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 8b01c3846..a592ffdfc 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -19,6 +19,14 @@ expected set from this one baseline — `matrix_tests.txt` minus every line matching `_ord` / `order_by` / `routes_through_ob`. The baseline file itself is always the ordered (`caps = [eq, ord]`) shape. +The "no per-type variation" property is preserved by design: every ordered +scalar sweeps the same three `OrderedScalar` pivots (`min`/`mid`/`max`), so the +`_pivot_mid_*` arms are identical modulo token across `int`/`date`/`text`. The +**signed-only** sign-boundary test (`SignedScalar`, `int`/`date` only) lives +*outside* the `scalars::::` namespace (in `encrypted_domain/signed.rs`, +mirroring the `text_match` suites), so it is deliberately invisible to this +inventory — keeping one canonical set rather than per-capability snapshots. + ## What it guards The SQLx assertions verify that the tests which run produce the right results. diff --git a/tests/sqlx/snapshots/matrix_tests.txt b/tests/sqlx/snapshots/matrix_tests.txt index 2cdfc22bd..46cb39264 100644 --- a/tests/sqlx/snapshots/matrix_tests.txt +++ b/tests/sqlx/snapshots/matrix_tests.txt @@ -7,10 +7,10 @@ scalars::::matrix__eq_count_path_cast scalars::::matrix__eq_count_typed_column scalars::::matrix__eq_eq_pivot_max_correctness scalars::::matrix__eq_eq_pivot_max_cross_shape +scalars::::matrix__eq_eq_pivot_mid_correctness +scalars::::matrix__eq_eq_pivot_mid_cross_shape scalars::::matrix__eq_eq_pivot_min_correctness scalars::::matrix__eq_eq_pivot_min_cross_shape -scalars::::matrix__eq_eq_pivot_zero_correctness -scalars::::matrix__eq_eq_pivot_zero_cross_shape scalars::::matrix__eq_eq_supported_null scalars::::matrix__eq_gt_blocker scalars::::matrix__eq_gte_blocker @@ -21,10 +21,10 @@ scalars::::matrix__eq_lte_blocker scalars::::matrix__eq_native_absent_ops scalars::::matrix__eq_neq_pivot_max_correctness scalars::::matrix__eq_neq_pivot_max_cross_shape +scalars::::matrix__eq_neq_pivot_mid_correctness +scalars::::matrix__eq_neq_pivot_mid_cross_shape scalars::::matrix__eq_neq_pivot_min_correctness scalars::::matrix__eq_neq_pivot_min_cross_shape -scalars::::matrix__eq_neq_pivot_zero_correctness -scalars::::matrix__eq_neq_pivot_zero_cross_shape scalars::::matrix__eq_neq_supported_null scalars::::matrix__eq_path_op_blockers scalars::::matrix__eq_payload_check @@ -50,47 +50,47 @@ scalars::::matrix__ord_count_path_cast scalars::::matrix__ord_count_typed_column scalars::::matrix__ord_eq_pivot_max_correctness scalars::::matrix__ord_eq_pivot_max_cross_shape +scalars::::matrix__ord_eq_pivot_mid_correctness +scalars::::matrix__ord_eq_pivot_mid_cross_shape scalars::::matrix__ord_eq_pivot_min_correctness scalars::::matrix__ord_eq_pivot_min_cross_shape -scalars::::matrix__ord_eq_pivot_zero_correctness -scalars::::matrix__ord_eq_pivot_zero_cross_shape scalars::::matrix__ord_eq_supported_null scalars::::matrix__ord_gt_pivot_max_correctness scalars::::matrix__ord_gt_pivot_max_cross_shape +scalars::::matrix__ord_gt_pivot_mid_correctness +scalars::::matrix__ord_gt_pivot_mid_cross_shape scalars::::matrix__ord_gt_pivot_min_correctness scalars::::matrix__ord_gt_pivot_min_cross_shape -scalars::::matrix__ord_gt_pivot_zero_correctness -scalars::::matrix__ord_gt_pivot_zero_cross_shape scalars::::matrix__ord_gt_supported_null scalars::::matrix__ord_gte_pivot_max_correctness scalars::::matrix__ord_gte_pivot_max_cross_shape +scalars::::matrix__ord_gte_pivot_mid_correctness +scalars::::matrix__ord_gte_pivot_mid_cross_shape scalars::::matrix__ord_gte_pivot_min_correctness scalars::::matrix__ord_gte_pivot_min_cross_shape -scalars::::matrix__ord_gte_pivot_zero_correctness -scalars::::matrix__ord_gte_pivot_zero_cross_shape scalars::::matrix__ord_gte_supported_null scalars::::matrix__ord_index_engages_btree scalars::::matrix__ord_lt_pivot_max_correctness scalars::::matrix__ord_lt_pivot_max_cross_shape +scalars::::matrix__ord_lt_pivot_mid_correctness +scalars::::matrix__ord_lt_pivot_mid_cross_shape scalars::::matrix__ord_lt_pivot_min_correctness scalars::::matrix__ord_lt_pivot_min_cross_shape -scalars::::matrix__ord_lt_pivot_zero_correctness -scalars::::matrix__ord_lt_pivot_zero_cross_shape scalars::::matrix__ord_lt_supported_null scalars::::matrix__ord_lte_pivot_max_correctness scalars::::matrix__ord_lte_pivot_max_cross_shape +scalars::::matrix__ord_lte_pivot_mid_correctness +scalars::::matrix__ord_lte_pivot_mid_cross_shape scalars::::matrix__ord_lte_pivot_min_correctness scalars::::matrix__ord_lte_pivot_min_cross_shape -scalars::::matrix__ord_lte_pivot_zero_correctness -scalars::::matrix__ord_lte_pivot_zero_cross_shape scalars::::matrix__ord_lte_supported_null scalars::::matrix__ord_native_absent_ops scalars::::matrix__ord_neq_pivot_max_correctness scalars::::matrix__ord_neq_pivot_max_cross_shape +scalars::::matrix__ord_neq_pivot_mid_correctness +scalars::::matrix__ord_neq_pivot_mid_cross_shape scalars::::matrix__ord_neq_pivot_min_correctness scalars::::matrix__ord_neq_pivot_min_cross_shape -scalars::::matrix__ord_neq_pivot_zero_correctness -scalars::::matrix__ord_neq_pivot_zero_cross_shape scalars::::matrix__ord_neq_supported_null scalars::::matrix__ord_ord_routes_through_ob scalars::::matrix__ord_order_by_asc_no_where @@ -123,47 +123,47 @@ scalars::::matrix__ord_ore_count_path_cast scalars::::matrix__ord_ore_count_typed_column scalars::::matrix__ord_ore_eq_pivot_max_correctness scalars::::matrix__ord_ore_eq_pivot_max_cross_shape +scalars::::matrix__ord_ore_eq_pivot_mid_correctness +scalars::::matrix__ord_ore_eq_pivot_mid_cross_shape scalars::::matrix__ord_ore_eq_pivot_min_correctness scalars::::matrix__ord_ore_eq_pivot_min_cross_shape -scalars::::matrix__ord_ore_eq_pivot_zero_correctness -scalars::::matrix__ord_ore_eq_pivot_zero_cross_shape scalars::::matrix__ord_ore_eq_supported_null scalars::::matrix__ord_ore_gt_pivot_max_correctness scalars::::matrix__ord_ore_gt_pivot_max_cross_shape +scalars::::matrix__ord_ore_gt_pivot_mid_correctness +scalars::::matrix__ord_ore_gt_pivot_mid_cross_shape scalars::::matrix__ord_ore_gt_pivot_min_correctness scalars::::matrix__ord_ore_gt_pivot_min_cross_shape -scalars::::matrix__ord_ore_gt_pivot_zero_correctness -scalars::::matrix__ord_ore_gt_pivot_zero_cross_shape scalars::::matrix__ord_ore_gt_supported_null scalars::::matrix__ord_ore_gte_pivot_max_correctness scalars::::matrix__ord_ore_gte_pivot_max_cross_shape +scalars::::matrix__ord_ore_gte_pivot_mid_correctness +scalars::::matrix__ord_ore_gte_pivot_mid_cross_shape scalars::::matrix__ord_ore_gte_pivot_min_correctness scalars::::matrix__ord_ore_gte_pivot_min_cross_shape -scalars::::matrix__ord_ore_gte_pivot_zero_correctness -scalars::::matrix__ord_ore_gte_pivot_zero_cross_shape scalars::::matrix__ord_ore_gte_supported_null scalars::::matrix__ord_ore_index_engages_btree scalars::::matrix__ord_ore_lt_pivot_max_correctness scalars::::matrix__ord_ore_lt_pivot_max_cross_shape +scalars::::matrix__ord_ore_lt_pivot_mid_correctness +scalars::::matrix__ord_ore_lt_pivot_mid_cross_shape scalars::::matrix__ord_ore_lt_pivot_min_correctness scalars::::matrix__ord_ore_lt_pivot_min_cross_shape -scalars::::matrix__ord_ore_lt_pivot_zero_correctness -scalars::::matrix__ord_ore_lt_pivot_zero_cross_shape scalars::::matrix__ord_ore_lt_supported_null scalars::::matrix__ord_ore_lte_pivot_max_correctness scalars::::matrix__ord_ore_lte_pivot_max_cross_shape +scalars::::matrix__ord_ore_lte_pivot_mid_correctness +scalars::::matrix__ord_ore_lte_pivot_mid_cross_shape scalars::::matrix__ord_ore_lte_pivot_min_correctness scalars::::matrix__ord_ore_lte_pivot_min_cross_shape -scalars::::matrix__ord_ore_lte_pivot_zero_correctness -scalars::::matrix__ord_ore_lte_pivot_zero_cross_shape scalars::::matrix__ord_ore_lte_supported_null scalars::::matrix__ord_ore_native_absent_ops scalars::::matrix__ord_ore_neq_pivot_max_correctness scalars::::matrix__ord_ore_neq_pivot_max_cross_shape +scalars::::matrix__ord_ore_neq_pivot_mid_correctness +scalars::::matrix__ord_ore_neq_pivot_mid_cross_shape scalars::::matrix__ord_ore_neq_pivot_min_correctness scalars::::matrix__ord_ore_neq_pivot_min_cross_shape -scalars::::matrix__ord_ore_neq_pivot_zero_correctness -scalars::::matrix__ord_ore_neq_pivot_zero_cross_shape scalars::::matrix__ord_ore_neq_supported_null scalars::::matrix__ord_ore_ord_routes_through_ob scalars::::matrix__ord_ore_order_by_asc_no_where diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 451917d5f..6efcfa3d7 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -84,7 +84,7 @@ macro_rules! scalar_fixture { #[cfg(test)] mod tests { use super::*; - use $crate::scalar_domains::ScalarType; + use $crate::scalar_domains::OrderedScalar; #[test] fn spec_is_complete() { @@ -93,16 +93,16 @@ macro_rules! scalar_fixture { #[test] fn spec_includes_pivots() { - // The three matrix pivots (min/max/zero) must be present in the + // The three matrix pivots (min/mid/max) must be present in the // fixture — `fetch_fixture_payload` fetches each at test time. let spec = spec(); let values = spec.values(); - let min = <$ty as ScalarType>::min_pivot(); - let max = <$ty as ScalarType>::max_pivot(); - let zero: $ty = ::core::default::Default::default(); + let min = <$ty as OrderedScalar>::min_pivot(); + let mid = <$ty as OrderedScalar>::mid_pivot(); + let max = <$ty as OrderedScalar>::max_pivot(); assert!(values.contains(&min), "spec must include min_pivot {min:?}"); + assert!(values.contains(&mid), "spec must include mid_pivot {mid:?}"); assert!(values.contains(&max), "spec must include max_pivot {max:?}"); - assert!(values.contains(&zero), "spec must include zero pivot {zero:?}"); } } }; @@ -115,7 +115,7 @@ macro_rules! scalar_fixture { #[cfg(test)] mod tests { use super::*; - use $crate::scalar_domains::ScalarType; + use $crate::scalar_domains::OrderedScalar; #[test] fn spec_is_complete() { @@ -124,16 +124,16 @@ macro_rules! scalar_fixture { #[test] fn spec_includes_pivots() { - // text has no signed extremes; assert the ScalarType pivots are - // present (min/max/zero), like the temporal arm. + // text has no signed extremes; assert the OrderedScalar pivots + // (min/mid/max) are present, like the temporal arm. let spec = spec(); let values = spec.values(); - let min = <$ty as ScalarType>::min_pivot(); - let max = <$ty as ScalarType>::max_pivot(); - let zero: $ty = ::core::default::Default::default(); + let min = <$ty as OrderedScalar>::min_pivot(); + let mid = <$ty as OrderedScalar>::mid_pivot(); + let max = <$ty as OrderedScalar>::max_pivot(); assert!(values.contains(&min), "spec must include min_pivot {min:?}"); + assert!(values.contains(&mid), "spec must include mid_pivot {mid:?}"); assert!(values.contains(&max), "spec must include max_pivot {max:?}"); - assert!(values.contains(&zero), "spec must include zero pivot {zero:?}"); } } }; diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index f52327a9c..427108c36 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -152,13 +152,20 @@ fn collect_index_scan_nodes(value: &serde_json::Value, found: &mut Vec<(String, /// make the order-by / ORE arms emit zero tests. First consumer: /// `timestamptz`. /// -/// Both arms take the identical `(suite, scalar, eql_type)` signature and derive -/// the three comparison pivots from the `ScalarType` impl -/// (`min_pivot()`/`max_pivot()`/`Default`), so the invocation shape is the same -/// regardless of capability — only the `caps` marker differs. The emitted test -/// names for an ordered type are byte-identical to the old -/// `ordered_numeric_matrix!`; the eq-only name set is exactly that set minus the -/// `_ord` / `order_by` / `routes_through_ob` lines. +/// Both arms take the identical `(suite, scalar, eql_type)` signature, so the +/// invocation shape is the same regardless of capability — only the `caps` +/// marker differs. The emitted test names for an ordered type are byte-identical +/// to the old `ordered_numeric_matrix!`; the eq-only name set is exactly that +/// set minus the `_ord` / `order_by` / `routes_through_ob` lines. +/// +/// Pivots — the comparison anchors swept by the correctness / cross-shape +/// arms — are the `OrderedScalar` anchors: `min_pivot()`, `max_pivot()`, and the +/// interior `mid_pivot()`. Integer scalars resolve `min`/`max` to +/// `Self::MIN`/`Self::MAX` and `mid` to the origin `0`; temporal scalars use +/// explicit sentinel dates (`mid` = the epoch); `text` uses a real median +/// fixture for `mid` (its `Default` `""` is degenerate for ORE, #262). The +/// fixture must contain those three plaintext rows, since each pivot's +/// ciphertext is fetched at test time via `fetch_fixture_payload`. #[macro_export] macro_rules! scalar_matrix { ( @@ -182,9 +189,9 @@ macro_rules! scalar_matrix { ord_domains = [(ord, Ord), (ord_ore, OrdOre)], ord_ore_domains = [(ord_ore, OrdOre)], pivots = [ - (min, <$scalar as $crate::scalar_domains::ScalarType>::min_pivot()), - (max, <$scalar as $crate::scalar_domains::ScalarType>::max_pivot()), - (zero, <$scalar as ::core::default::Default>::default()), + (min, <$scalar as $crate::scalar_domains::OrderedScalar>::min_pivot()), + (max, <$scalar as $crate::scalar_domains::OrderedScalar>::max_pivot()), + (mid, <$scalar as $crate::scalar_domains::OrderedScalar>::mid_pivot()), ], eq_ops = [(eq, "="), (neq, "<>")], ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], @@ -234,13 +241,14 @@ macro_rules! scalar_matrix { ord_domains = [], ord_ore_domains = [], // Pivots derived from the scalar type exactly like the ordered arm - // (`min_pivot()`/`max_pivot()`/`Default`), so the equality - // correctness / cross-shape arms sweep the same three anchors and - // the eq-only name set stays a clean subset of the ordered one. + // (`OrderedScalar::min_pivot()`/`max_pivot()`/`mid_pivot()`), so the + // equality correctness / cross-shape arms sweep the same three + // anchors and the eq-only name set stays a clean subset of the + // ordered one. pivots = [ - (min, <$scalar as $crate::scalar_domains::ScalarType>::min_pivot()), - (max, <$scalar as $crate::scalar_domains::ScalarType>::max_pivot()), - (zero, <$scalar as ::core::default::Default>::default()), + (min, <$scalar as $crate::scalar_domains::OrderedScalar>::min_pivot()), + (max, <$scalar as $crate::scalar_domains::OrderedScalar>::max_pivot()), + (mid, <$scalar as $crate::scalar_domains::OrderedScalar>::mid_pivot()), ], eq_ops = [(eq, "="), (neq, "<>")], ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], @@ -1754,12 +1762,12 @@ macro_rules! __scalar_matrix_order_by_domain { $crate::__scalar_matrix_order_by_case! { suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, dom_name = $dom_name, variant = $variant, - mode_name = asc_with_where, direction = "ASC", filter = gt_zero, + mode_name = asc_with_where, direction = "ASC", filter = gt_mid, } $crate::__scalar_matrix_order_by_case! { suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, dom_name = $dom_name, variant = $variant, - mode_name = desc_with_where, direction = "DESC", filter = gt_zero, + mode_name = desc_with_where, direction = "DESC", filter = gt_mid, } }; } @@ -1778,18 +1786,19 @@ macro_rules! __scalar_matrix_order_by_case { async fn []( pool: sqlx::PgPool, ) -> anyhow::Result<()> { - use $crate::scalar_domains::ScalarType; + use $crate::scalar_domains::{OrderedScalar, ScalarType}; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let fixture_table = <$scalar as ScalarType>::fixture_table_name(); - let zero: $scalar = Default::default(); - let gt_zero = stringify!($filter) == "gt_zero"; - // Build the WHERE clause from the zero pivot's SQL literal so it - // is type-agnostic: `plaintext > 0` for integers, `plaintext > - // '1970-01-01'` for dates. A hardcoded `> 0` would not typecheck - // against a non-integer plaintext column. - let where_clause = if gt_zero { - format!(" WHERE plaintext > {}", <$scalar as ScalarType>::to_sql_literal(&zero)) + let mid: $scalar = <$scalar as OrderedScalar>::mid_pivot(); + let gt_mid = stringify!($filter) == "gt_mid"; + // Build the WHERE clause from the interior pivot's SQL literal so + // it is type-agnostic: `plaintext > 0` for integers, `plaintext > + // '1970-01-01'` for dates, `plaintext > 'frank'` for text. A + // hardcoded `> 0` would not typecheck against a non-integer + // plaintext column. + let where_clause = if gt_mid { + format!(" WHERE plaintext > {}", <$scalar as ScalarType>::to_sql_literal(&mid)) } else { String::new() }; @@ -1804,8 +1813,8 @@ ORDER BY eql_v3.ord_term(payload::{d}) {dir}", let mut expected: Vec<$scalar> = <$scalar as ScalarType>::fixture_values().to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if $direction == "DESC" { expected.reverse(); } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 913e22655..e7ae37472 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -45,25 +45,13 @@ pub trait ScalarType: /// `LazyLock>` and returns a borrow of it (see `date_values`). /// Integer scalars return their `eql_scalars::_VALUES` const directly. /// - /// For types driven by `scalar_matrix!`, the values MUST - /// include the three pivots (`min_pivot()`, `max_pivot()`, and zero - /// `Default::default()`): the matrix uses those as comparison pivots and - /// fetches each one's ciphertext via `fetch_fixture_payload`, which fails - /// loudly if the row is absent. + /// For types driven by `scalar_matrix!` (caps = [eq, ord]), the values MUST + /// include the three `OrderedScalar` pivots (`min_pivot()`, `max_pivot()`, + /// `mid_pivot()`): the matrix uses those as comparison pivots and fetches + /// each one's ciphertext via `fetch_fixture_payload`, which fails loudly if + /// the row is absent. fn fixture_values() -> &'static [Self]; - /// The low comparison pivot swept by the correctness / cross-shape arms. - /// Integer scalars return `Self::MIN`; temporal scalars return an explicit - /// sentinel (e.g. `1900-01-01`). A trait method rather than `Self::MIN` - /// because `chrono::DateTime` exposes `MAX_UTC`, not an inherent - /// `::MAX` const. The pivot must be present verbatim in `fixture_values()`. - fn min_pivot() -> Self; - - /// The high comparison pivot. Integer scalars return `Self::MAX`; temporal - /// scalars return an explicit sentinel (e.g. `2099-12-31`). Must be present - /// verbatim in `fixture_values()`. - fn max_pivot() -> Self; - /// `fixtures.eql_v2_`. fn fixture_table_name() -> String { format!("fixtures.eql_v2_{}", Self::PG_TYPE) @@ -101,6 +89,46 @@ pub trait ScalarType: } } +/// An **ordered** scalar — one whose `_ord` domains support `<`/`<=`/`>`/`>=`. +/// Carries the three comparison anchors the `ordered_numeric_matrix!` sweeps: +/// the `min`/`max` boundaries and an interior `mid` pivot. All three must be +/// present verbatim in `fixture_values()` (the matrix fetches each pivot's +/// ciphertext via `fetch_fixture_payload`). +/// +/// `min`/`max` are boundary anchors; `mid` is an interior anchor used by the +/// correctness/cross-shape sweep and the ORDER-BY-with-filter arm. `mid` +/// defaults to `Self::default()` — for signed scalars that is the numeric +/// origin (`0`, epoch), which is a fine interior anchor; lexicographic scalars +/// (e.g. `String`, whose `Default` is the degenerate empty string) override it +/// with a real median fixture. +pub trait OrderedScalar: ScalarType { + /// The low boundary pivot. Integer scalars return `Self::MIN`; others an + /// explicit sentinel. Present verbatim in `fixture_values()`. + fn min_pivot() -> Self; + + /// The high boundary pivot. Integer scalars return `Self::MAX`; others an + /// explicit sentinel. Present verbatim in `fixture_values()`. + fn max_pivot() -> Self; + + /// The interior pivot. Defaults to `Self::default()` (the numeric origin for + /// signed scalars); override where `Default` is not a usable fixture anchor. + /// Present verbatim in `fixture_values()`. + fn mid_pivot() -> Self { + Self::default() + } +} + +/// A **signed** scalar — an ordered scalar with a numeric origin / sign +/// boundary (`int`, `date`). `text` is `OrderedScalar` but **not** +/// `SignedScalar`: lexicographic order has no origin. The bound gates the +/// signed-only sign-boundary test, so a `text` instantiation of it is a compile +/// error. +pub trait SignedScalar: OrderedScalar { + /// The numeric origin (the sign boundary): `0` for integers, the epoch for + /// dates. Fixtures straddle it (negatives below, positives above). + fn origin() -> Self; +} + // The per-type `impl ScalarType` blocks for the **integer** scalars (each // carrying its `PG_TYPE` token, `fixture_values() = eql_scalars::_VALUES`, // and `min_pivot()`/`max_pivot()` = `Self::MIN`/`Self::MAX`) are generated from @@ -155,14 +183,27 @@ macro_rules! temporal_values { impl ScalarType for $ty { const PG_TYPE: &'static str = $pg; fn fixture_values() -> &'static [$ty] { $accessor() } - fn min_pivot() -> $ty { $min } - fn max_pivot() -> $ty { $max } fn to_sql_literal(value: &$ty) -> String { let f: fn(&$ty) -> String = $sql_lit; f(value) } } + impl OrderedScalar for $ty { + fn min_pivot() -> $ty { $min } + fn max_pivot() -> $ty { $max } + // `mid_pivot` inherits the default `Self::default()`. Every chrono + // temporal type's `Default` is the epoch (`1970-01-01` for a date), + // which is also `origin()` — a real fixture and the sign boundary. + } + + impl SignedScalar for $ty { + // Temporal scalars encrypt as a signed offset from the epoch, so the + // numeric origin is `Self::default()` (e.g. `1970-01-01`); fixtures + // straddle it (earlier dates below, later dates above). + fn origin() -> $ty { <$ty as ::core::default::Default>::default() } + } + #[cfg(test)] mod $accessor { use super::*; @@ -178,12 +219,17 @@ macro_rules! temporal_values { #[test] fn pivots_present_in_fixtures() { let vals = $accessor(); - assert!(vals.contains(&<$ty as ScalarType>::min_pivot()), "min pivot missing"); - assert!(vals.contains(&<$ty as ScalarType>::max_pivot()), "max pivot missing"); - // The matrix sweeps a zero pivot (`Default::default()`) on every - // ordered/eq-only suite and fetches its ciphertext via + assert!(vals.contains(&<$ty as OrderedScalar>::min_pivot()), "min pivot missing"); + assert!(vals.contains(&<$ty as OrderedScalar>::max_pivot()), "max pivot missing"); + // The matrix sweeps the interior `mid_pivot()` (here the default + // origin) on every ordered suite and fetches its ciphertext via // `fetch_fixture_payload`, so it must be present verbatim too. - assert!(vals.contains(&<$ty as Default>::default()), "zero/default pivot missing"); + assert!(vals.contains(&<$ty as OrderedScalar>::mid_pivot()), "mid/default pivot missing"); + assert_eq!( + <$ty as OrderedScalar>::mid_pivot(), + <$ty as SignedScalar>::origin(), + "for a signed temporal scalar mid_pivot == origin", + ); } } }; @@ -323,9 +369,17 @@ impl ScalarType for String { text_values() } - /// Lexicographic min pivot — the lexicographically-smallest non-empty - /// fixture (`"aard"`; the empty-string zero pivot sorts below it). Present - /// verbatim in `fixture_values()`; keep in sync with `TEXT_FIXTURES`. + /// `Display` for a `String` is the unquoted text, which is not a valid SQL + /// literal; quote it and double any embedded single quotes. + fn to_sql_literal(value: &Self) -> String { + format!("'{}'", value.replace('\'', "''")) + } +} + +impl OrderedScalar for String { + /// Lexicographic min pivot — the lexicographically-smallest fixture + /// (`"aard"`). Present verbatim in `fixture_values()`; keep in sync with + /// `TEXT_FIXTURES`. fn min_pivot() -> Self { "aard".to_string() } @@ -336,29 +390,39 @@ impl ScalarType for String { "zzzz".to_string() } - /// `Display` for a `String` is the unquoted text, which is not a valid SQL - /// literal; quote it and double any embedded single quotes. - fn to_sql_literal(value: &Self) -> String { - format!("'{}'", value.replace('\'', "''")) + /// Interior pivot — a real median fixture. `String::default()` is `""`, + /// which is degenerate for ORE (issue #262), so `text` overrides the + /// inherited default with a genuine middle value. + fn mid_pivot() -> Self { + "frank".to_string() } } +// `String` is deliberately NOT `SignedScalar`: lexicographic text has no +// numeric origin / sign boundary. The signed-only sign-boundary test bounds on +// `SignedScalar`, so a `String` instantiation of it would not compile. + #[cfg(test)] mod text_value_tests { use super::*; - /// The `min`/`max`/zero pivots resolve to fixture rows present verbatim, so + /// The `min`/`mid`/`max` pivots resolve to fixture rows present verbatim, so /// `fetch_fixture_payload` can resolve each one's ciphertext. #[test] fn text_pivots_are_in_fixture_values() { let values = ::fixture_values(); - let min = ::min_pivot(); - let max = ::max_pivot(); - let zero = String::default(); + let min = ::min_pivot(); + let mid = ::mid_pivot(); + let max = ::max_pivot(); assert!(values.contains(&min), "min_pivot {min:?} must be a fixture"); + assert!(values.contains(&mid), "mid_pivot {mid:?} must be a fixture"); assert!(values.contains(&max), "max_pivot {max:?} must be a fixture"); - assert!(values.contains(&zero), "zero pivot \"\" must be a fixture"); - assert!(min <= max, "lexicographic min must not exceed max"); + assert!(min <= mid && mid <= max, "min <= mid <= max must hold"); + // text has no numeric origin: the empty string is not a fixture. + assert!( + !values.iter().any(|v| v.is_empty()), + "the empty string must not be a text fixture" + ); } /// The harness value list matches the catalog `TEXT_VALUES` in order — the diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs new file mode 100644 index 000000000..e00f92990 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -0,0 +1,53 @@ +//! Sign-boundary coverage for **signed** scalars (`int`, `date`) — the +//! `SignedScalar` delta on top of the uniform ordered matrix. +//! +//! ORE encrypts signed values as an offset from a numeric origin (`0` for +//! integers, the epoch for dates). This suite asserts the ORE block ordering is +//! **monotonic across that origin**: a fixture below the origin orders before +//! the origin, which orders before a fixture above it — through the encrypted +//! `_ord` domain, with no decryption. +//! +//! It is deliberately **outside** the `scalars::::` namespace (like the +//! `text_match` suites) so the matrix-inventory snapshot — which pins the +//! *uniform* per-type test set — does not see it. The generic body bounds on +//! `eql_tests::scalar_domains::SignedScalar`, so a `text` (`!SignedScalar`) +//! instantiation is a **compile error**: lexicographic text has no origin. +// `SignedScalar` is the bound; its supertrait methods (`min_pivot`/`max_pivot` +// from `OrderedScalar`, `PG_TYPE` from `ScalarType`) are reachable through it. +use eql_tests::scalar_domains::{fetch_fixture_payload, sql_string_literal, SignedScalar}; +use sqlx::PgPool; + +/// `min_pivot() < origin() < max_pivot()` holds through the encrypted `_ord` +/// domain's `<` operator (ORE block comparison), spanning the sign boundary. +async fn sign_boundary_is_monotonic(pool: &PgPool) -> anyhow::Result<()> { + let d = format!("eql_v3.{}_ord", T::PG_TYPE); + + // Fixtures straddling the origin: min is below it, max above it. + let below = sql_string_literal(&fetch_fixture_payload::(pool, T::min_pivot()).await?); + let origin = sql_string_literal(&fetch_fixture_payload::(pool, T::origin()).await?); + let above = sql_string_literal(&fetch_fixture_payload::(pool, T::max_pivot()).await?); + + let sql = format!( + "SELECT \ + ({below}::jsonb::{d} < {origin}::jsonb::{d}) AND \ + ({origin}::jsonb::{d} < {above}::jsonb::{d}) AND \ + ({below}::jsonb::{d} < {above}::jsonb::{d})" + ); + let monotonic: bool = sqlx::query_scalar(&sql).fetch_one(pool).await?; + assert!( + monotonic, + "{}: ORE ordering must be monotonic across the origin (below < origin < above):\n{sql}", + T::PG_TYPE, + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int4")))] +async fn int4_sign_boundary(pool: PgPool) -> anyhow::Result<()> { + sign_boundary_is_monotonic::(&pool).await +} + +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_date")))] +async fn date_sign_boundary(pool: PgPool) -> anyhow::Result<()> { + sign_boundary_is_monotonic::(&pool).await +} From d15c3784ba23ecf09abdc2d41b5b824d8668ba10 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:44:27 +1000 Subject: [PATCH 120/599] test(v3): text_smoke + text_match containment suites SQLx coverage for the text family beyond the generated matrix: `text_smoke` exercises `eql_v3.text_match @> match` and the blocked `=` plus empty-bloom set semantics; `text_match` is the dedicated containment suite (self / substring / disjoint / bare-operator GIN index engagement). Both live under `encrypted_domain/text/` (outside the `scalars::` namespace) so the matrix inventory snapshot stays the uniform per-type set, and are registered alongside the signed-only suite in `encrypted_domain.rs`. --- tests/sqlx/tests/encrypted_domain.rs | 16 +++ .../tests/encrypted_domain/scalars/mod.rs | 7 + .../tests/encrypted_domain/text/text_match.rs | 135 ++++++++++++++++++ .../tests/encrypted_domain/text/text_smoke.rs | 65 +++++++++ 4 files changed, 223 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/text/text_match.rs create mode 100644 tests/sqlx/tests/encrypted_domain/text/text_smoke.rs diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 0ac40b22f..5c82b5fcb 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -10,3 +10,19 @@ mod family; #[path = "encrypted_domain/scalars/mod.rs"] mod scalars; + +// Text-specific behavioural suites (literal-payload smoke + fixture-backed +// match-containment). Deliberately NOT under `scalars::` — the matrix-inventory +// gate treats every `scalars::::` prefix as a scalar type, so these would be +// mis-discovered as types `text_smoke` / `text_match`. +#[path = "encrypted_domain/text/text_smoke.rs"] +mod text_smoke; + +#[path = "encrypted_domain/text/text_match.rs"] +mod text_match; + +// Signed-only sign-boundary suite (`int`, `date`). Like the text suites it +// lives outside `scalars::` so the matrix-inventory snapshot (which pins the +// uniform per-type set) does not see the signed-only delta. +#[path = "encrypted_domain/signed.rs"] +mod signed; diff --git a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs index 8995492f3..3425ff060 100644 --- a/tests/sqlx/tests/encrypted_domain/scalars/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/scalars/mod.rs @@ -7,3 +7,10 @@ //! automatically. The old per-type `scalars/.rs` files are gone. eql_tests::scalar_types!(matrix_suites); + +// NOTE: the `text_match` / `text_smoke` behavioural suites live in the sibling +// `encrypted_domain/text/` module tree, NOT here. The matrix-inventory gate +// discovers scalar types from every `scalars::::` test-name prefix +// (`tasks`/`mise.toml`), so a `scalars::text_smoke::` module would be +// mis-discovered as a scalar type `text_smoke` and pollute the snapshot / +// catalog cross-check. Keeping them out of `scalars::` avoids that. diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs new file mode 100644 index 000000000..171edfcfc --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -0,0 +1,135 @@ +//! Match-containment coverage for `eql_v3.text_match` — separate from the +//! ordered matrix because `@>` is asymmetric/probabilistic, not a total order. +//! Asserts against the generated `eql_v2_text` fixtures (which carry `bf`). +use sqlx::PgPool; + +const TABLE: &str = "fixtures.eql_v2_text"; + +async fn payload_for(pool: &PgPool, plaintext: &str) -> anyhow::Result { + Ok(sqlx::query_scalar::<_, serde_json::Value>(&format!( + "SELECT payload::jsonb FROM {TABLE} WHERE plaintext = $1" + )) + .bind(plaintext) + .fetch_one(pool) + .await?) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn value_matches_itself(pool: PgPool) -> anyhow::Result<()> { + let p = payload_for(&pool, "aardvark").await?; + let hit: bool = sqlx::query_scalar( + "SELECT ($1::jsonb::eql_v3.text_match) @> ($1::jsonb::eql_v3.text_match)", + ) + .bind(&p) + .fetch_one(&pool) + .await?; + assert!(hit, "a value's bloom filter must contain itself"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn haystack_contains_substring_needle(pool: PgPool) -> anyhow::Result<()> { + let hay = payload_for(&pool, "aardvark").await?; + let needle = payload_for(&pool, "aard").await?; + let hit: bool = sqlx::query_scalar( + "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match)", + ) + .bind(&hay) + .bind(&needle) + .fetch_one(&pool) + .await?; + assert!(hit, "'aardvark' bloom must contain 'aard' (shared ngrams)"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn disjoint_value_does_not_match(pool: PgPool) -> anyhow::Result<()> { + // A bloom filter is probabilistic and admits false positives, so a true + // negative is only deterministic for inputs that share no n-grams. "aard" + // (3-grams `aar`, `ard`) and "zzzz" (`zzz`) are chosen ngram-disjoint in + // TEXT_FIXTURES (crates/eql-scalars/src/lib.rs) precisely for this assertion; + // keep them disjoint if the fixture list changes. + let hay = payload_for(&pool, "aard").await?; + let needle = payload_for(&pool, "zzzz").await?; + let hit: bool = sqlx::query_scalar( + "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match)", + ) + .bind(&hay) + .bind(&needle) + .fetch_one(&pool) + .await?; + assert!( + !hit, + "'aard' must not contain disjoint 'zzzz' (no shared ngrams)" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn match_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { + // Explicit extractor form `match_term(col) @> match_term(needle)`. Forces + // `enable_seqscan = off` so this is an index-VALIDITY proof on the small + // fixture (not a cost-preference one), and uses the node-type-aware + // `assert_index_scan_uses` rather than a plan substring match. + let mut tx = pool.begin().await?; + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx) + .await?; + sqlx::query(&format!( + "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::eql_v3.text_match))" + )) + .execute(&mut *tx) + .await?; + + // Needle embedded via an uncorrelated subquery so the helper receives a + // hardcoded query (it interpolates directly and takes no binds). + let query = format!( + "SELECT 1 FROM {TABLE} \ + WHERE eql_v3.match_term(payload::eql_v3.text_match) \ + @> eql_v3.match_term((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::eql_v3.text_match)" + ); + eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + "text_match_idx", + "explicit match_term(col) @> match_term(needle) must engage the functional GIN index", + ) + .await?; + Ok(()) +} + +/// Companion to `match_uses_functional_index` proving the **bare operator** form +/// `WHERE col @> needle` (not the explicit `match_term(col) @> match_term(needle)`) +/// reaches the GIN index — i.e. the generated `@>` wrapper inlines through +/// `match_term` to the native array-containment the index supports. Forces +/// `enable_seqscan = off` so this is an index-**validity** proof on the small +/// fixture, not a cost-preference one, and uses the node-type-aware +/// `assert_index_scan_uses` rather than a plan substring match. +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { + let mut tx = pool.begin().await?; + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx) + .await?; + sqlx::query(&format!( + "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::eql_v3.text_match))" + )) + .execute(&mut *tx) + .await?; + + // The needle is embedded via an uncorrelated subquery so the helper receives + // a hardcoded query string (it interpolates directly and takes no binds). + let query = format!( + "SELECT 1 FROM {TABLE} \ + WHERE (payload::eql_v3.text_match) \ + @> ((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::eql_v3.text_match)" + ); + eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + "text_match_idx", + "bare `@>` operator on text_match must engage the functional GIN index", + ) + .await?; + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs new file mode 100644 index 000000000..b62fab67a --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs @@ -0,0 +1,65 @@ +//! Literal-payload smoke tests for the generated `eql_v3.text_match` surface: +//! `@>` containment engages (supported wrapper) and `=` raises (blocker). +//! Uses hand-written jsonb payloads carrying `bf` — no encryption/fixtures +//! needed. The fixture-backed containment behaviour lives in `text_match.rs`. +use sqlx::PgPool; + +#[sqlx::test] +async fn text_match_at_contains_engages(pool: PgPool) -> anyhow::Result<()> { + // self-containment: a filter contains a subset of itself + let hit: bool = sqlx::query_scalar( + "SELECT ('{\"v\":\"2\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::eql_v3.text_match) + @> ('{\"v\":\"2\",\"i\":{},\"c\":\"x\",\"bf\":[2]}'::jsonb::eql_v3.text_match)", + ) + .fetch_one(&pool) + .await?; + assert!(hit, "[1,2,3] @> [2] must hold"); + Ok(()) +} + +#[sqlx::test] +async fn text_match_eq_is_blocked(pool: PgPool) -> anyhow::Result<()> { + let err = sqlx::query( + "SELECT ('{\"v\":\"2\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::eql_v3.text_match) + = ('{\"v\":\"2\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::eql_v3.text_match)", + ) + .execute(&pool) + .await + .unwrap_err(); + assert!( + format!("{err}").contains("not supported"), + "= must be blocked on text_match" + ); + Ok(()) +} + +#[sqlx::test] +async fn empty_bloom_has_empty_set_semantics(pool: PgPool) -> anyhow::Result<()> { + // A value too short to tokenize (e.g. the empty string) yields an empty + // bloom filter (`bf: []`). Containment then follows empty-set semantics: + // everything contains the empty set; the empty set contains nothing. Uses + // literal payloads so the assertion is deterministic and independent of how + // the encryptor renders a `bf` for a degenerate plaintext. + const NON_EMPTY: &str = + "'{\"v\":\"2\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::eql_v3.text_match"; + const EMPTY: &str = "'{\"v\":\"2\",\"i\":{},\"c\":\"x\",\"bf\":[]}'::jsonb::eql_v3.text_match"; + + let everything_contains_empty: bool = + sqlx::query_scalar(&format!("SELECT ({NON_EMPTY}) @> ({EMPTY})")) + .fetch_one(&pool) + .await?; + assert!( + everything_contains_empty, + "every filter must contain the empty filter" + ); + + let empty_contains_nothing: bool = + sqlx::query_scalar(&format!("SELECT ({EMPTY}) @> ({NON_EMPTY})")) + .fetch_one(&pool) + .await?; + assert!( + !empty_contains_nothing, + "empty filter must not contain a non-empty one" + ); + Ok(()) +} From 8677c41e1e656761383d34313e933e414a303204 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:44:38 +1000 Subject: [PATCH 121/599] docs(v3): document text scalar + Bloom term; changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documents the `eql_v3.text` family (eq / match / ord) and the `Bloom` index term in the scalar-encrypted-domain reference guide — including the `OrderedScalar`/`SignedScalar` pivot-trait section and the catalog-derived (marker-free) text dispatch — and adds the `[Unreleased]` changelog entry (#260). --- CHANGELOG.md | 1 + .../adding-a-scalar-encrypted-domain-type.md | 110 +++++++++++------- 2 files changed, 71 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82634a024..cce69f272 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) - **`eql_v3.timestamptz` encrypted-domain type family (equality-only).** Two jsonb-backed domains for encrypted `timestamptz` columns — `eql_v3.timestamptz` (storage-only) and `eql_v3.timestamptz_eq` (`=` / `<>` via HMAC) — generated from the `timestamptz` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast. Index via a functional index on the `eql_v3.eq_term` extractor, not an operator class on the domain. **Ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) is deferred:** cipherstash encrypts `Plaintext::Timestamp` at native 12-block ORE width, but EQL's only ORE comparator (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so ordered timestamptz domains would silently mis-order. There are no `eql_v3.timestamptz_ord` / `_ord_ore` domains and no timestamptz `MIN` / `MAX` aggregates until a wide-ORE (12-block) term lands — tracked in [#241](https://github.com/cipherstash/encrypt-query-language/issues/241). Why: a type-safe, equality-searchable encrypted UTC-timestamp column, stacking on the `date` temporal-scalar foundation; ordering follows once the comparator supports the native ciphertext width. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) +- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) ### Changed diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 7cf73ccb8..06322efa0 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -22,8 +22,9 @@ The whole SQL surface is **generated** from a single Rust source of truth: the rendered by the [`eql-codegen`](../../crates/eql-codegen/) crate. There is no TOML manifest and no Python — adding a type is adding one `ScalarSpec` row, validated by the compiler plus catalog `#[test]`s. The reference type is -`eql_v3.int4`. **`text` and `jsonb` are out of scope** for this materializer -(see §7). +`eql_v3.int4`; `eql_v3.text` is the worked non-integer example (ordered + +equality + a `match` capability via the `Bloom` term). **`jsonb` remains out of +scope** for this materializer (see §7). --- @@ -38,7 +39,7 @@ To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): 2. **Materialise the value list** — `int_values!(_VALUES, , );` next to `CATALOG`, pinned by a `values_tests` assertion (§2). This is the single source the SQLx matrix reads; there is no generated `_values.rs`. -3. **Wire the SQLx matrix oracle** — copy the seven small registrations from the +3. **Wire the SQLx matrix oracle** — copy the two small registrations from the `int4` reference (§3). 4. **Regenerate** — `cargo run -p eql-codegen` (or just `mise run build`, which runs the generator first). One run regenerates *every* catalog type; there is @@ -116,10 +117,11 @@ than a runtime validator: Returns column below is `eql_v3.` + `ctor`) — changing one is a generated-SQL behaviour change, not a refactor: -| Term | JSON key | Extractor | Returns | Operators | -| ----- | -------- | ----------- | -------------------------------- | -------------------------- | -| `Hm` | `hm` | `eq_term` | `eql_v3.hmac_256` | `=` `<>` | -| `Ore` | `ob` | `ord_term` | `eql_v3.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | +| Term | JSON key | Extractor | Returns | Operators | +| ------- | -------- | ------------ | -------------------------------- | -------------------------- | +| `Hm` | `hm` | `eq_term` | `eql_v3.hmac_256` | `=` `<>` | +| `Ore` | `ob` | `ord_term` | `eql_v3.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | +| `Bloom` | `bf` | `match_term` | `eql_v3.bloom_filter` | `@>` `<@` | A type that needs a non-ORE equality term on an ordered domain needs a **new `Term`**, not a catalog flag. Adding a term is a code change to the `Term` @@ -199,15 +201,25 @@ jsonb-backed and token-driven): strings into a `LazyLock>` and exposes them via a `date_values()` accessor; `ScalarType::fixture_values()` returns a borrow of that. The fixtures must include the three pivot plaintexts verbatim — for - `date`: `"1900-01-01"` (min), `"1970-01-01"` (zero = `NaiveDate::default()`), - `"2099-12-31"` (max) — guarded by `temporal_fixtures_include_pivot_plaintexts`. -- **The pivot trait, not `Self::MIN`/`MAX`.** `ScalarType::fixture_values()` is a - method (not a `const`), and the comparison pivots come from - `ScalarType::min_pivot()` / `max_pivot()` (zero stays `Default::default()`). - Integer impls return `Self::MIN`/`Self::MAX` (emitted by the proc-macro); - temporal impls return explicit sentinel dates and are emitted by the - `temporal_values!` declarative macro in `scalar_domains.rs` (the proc-macro - emits only integer impls). `to_sql_literal` is + `date`: `"1900-01-01"` (min), `"1970-01-01"` (mid = the epoch = + `NaiveDate::default()` = `origin()`), `"2099-12-31"` (max) — guarded by + `temporal_fixtures_include_pivot_plaintexts` (catalog) and the + `temporal_values!`-generated `pivots_present_in_fixtures`. +- **The pivot traits, not `Self::MIN`/`MAX`.** `ScalarType::fixture_values()` is a + method (not a `const`); the comparison pivots live on a small trait hierarchy + over `ScalarType` (`scalar_domains.rs`): **`OrderedScalar`** carries the + `min_pivot()` / `max_pivot()` boundaries and the interior `mid_pivot()` (default + `Self::default()`); **`SignedScalar: OrderedScalar`** adds `origin()` (the + numeric zero / sign boundary). Integer impls (`min=MIN`, `max=MAX`, `mid` + inherits `0`, `origin=0`) are emitted by the proc-macro; the temporal `date` + impl returns explicit sentinel dates (`mid` inherits the epoch = `origin()`) and + is emitted by the `temporal_values!` declarative macro in `scalar_domains.rs`, + which emits the `ScalarType` + `OrderedScalar` + `SignedScalar` impls together + (the proc-macro emits only integer impls). `date` is both `OrderedScalar` and + `SignedScalar`; `text` is `OrderedScalar` only and **hand-written** in + `scalar_domains.rs` (lexicographic order has no origin, so it overrides + `mid_pivot()` with a real median fixture rather than the degenerate + `String::default()` empty string — see issue #262). `to_sql_literal` is overridden to single-quote the value (`'1970-01-01'`), since a bare `Display` date is not a valid SQL literal. - **The sqlx `chrono` feature.** The test crate enables sqlx's `chrono` feature @@ -246,16 +258,21 @@ the `scalar_types!` list also fails the `generate_for_token` catch-all loudly at fixture-generation time. The coverage these registrations unlock comes from the `scalar_matrix!` -convention wrapper in `tests/sqlx/src/matrix.rs`: one `impl ScalarType` plus a -single invocation taking `suite`, `scalar`, `eql_type`, and a `caps` capability -marker. The matrix derives its comparison pivots — the scalar's `MIN`, `MAX`, -and zero (`Default::default()`) — from the type rather than a hand-written list, -so the invocation carries no pivot argument. `caps = [eq, ord]` selects the +convention wrapper in `tests/sqlx/src/matrix.rs`: one `impl ScalarType` (plus +`OrderedScalar`, and `SignedScalar` for signed kinds) and a single invocation +taking `suite`, `scalar`, `eql_type`, and a `caps` capability marker. The matrix +derives its comparison pivots — the scalar's `min_pivot()`, `max_pivot()`, and +the interior `mid_pivot()` — from `OrderedScalar` rather than a hand-written +list, so the invocation carries no pivot argument. `caps = [eq, ord]` selects the ordered-numeric shape (all four variants; `=`/`<>`/`<`/`<=`/`>`/`>=`; ORDER BY / ORDER BY USING; ORE injectivity); `caps = [eq]` selects the equality-only shape (storage + `_eq` only; the four ord operators are deliberate blockers). Both -expand to the lower-level `scalar_domain_matrix!`. The `matrix.rs` module header -is the canonical, +expand to the lower-level `scalar_domain_matrix!`. The pivot *sweep* is uniform +across every ordered type (one canonical snapshot); the signed-only sign-boundary +test (`SignedScalar`, `int`/`date`) lives outside `scalars::` in +`encrypted_domain/signed.rs`, so a `text` instantiation of it is a compile error +and it never enters the inventory snapshot. The `matrix.rs` module header is the +canonical, current list of the categories the matrix emits (sanity, correctness, cross-shape, supported-NULL, blocker raises, index engagement, ORDER BY, ORDER BY USING) — read it rather than duplicating a count here. For ordered `int4`, @@ -406,14 +423,15 @@ enables them — and the native `jsonb` operators are blocker-only. The wrapper/blocker split per domain (the 44-operator total never moves): -| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | -| ---------------- | ---------: | -------: | -------: | --------: | --------: | -| none | 0 | 0 | 44 | 44 | 44 | -| `&[Term::Hm]` | 1 (`eq_term`) | 6 | 38 | 45 | 44 | -| `&[Term::Ore]` | 1 (`ord_term`) | 18 | 26 | 45 | 44 | +| Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | +| ----------------- | ---------: | -------: | -------: | --------: | --------: | +| none | 0 | 0 | 44 | 44 | 44 | +| `&[Term::Hm]` | 1 (`eq_term`) | 6 | 38 | 45 | 44 | +| `&[Term::Bloom]` | 1 (`match_term`) | 6 | 38 | 45 | 44 | +| `&[Term::Ore]` | 1 (`ord_term`) | 18 | 26 | 45 | 44 | -Six wrappers for `Hm` = `=` and `<>` × three shapes; eighteen for `Ore` = six -operators × three shapes. +Six wrappers for `Hm` = `=` and `<>` × three shapes; six for `Bloom` = `@>` and +`<@` × three shapes; eighteen for `Ore` = six operators × three shapes. **Untyped-literal resolver edge.** PostgreSQL's operator resolver still prefers the built-in `jsonb` operator for untyped string literals in forms such as @@ -658,14 +676,26 @@ golden reference under `tests/codegen/reference/int4/`. --- -## 7. Out of scope — `text` and `jsonb` - -`text` and `jsonb` are **not** materialised through this generator. The -`ScalarKind` enum carries `Text` / `Numeric` / `Jsonb` variants and the -`Fixture` enum carries their string-backed shapes at the capability layer, but -`CATALOG` declares only the ordered scalars today — the fixed-width integers -(`int2` / `int4` / `int8`) and the temporal `date` — so no `text` / `jsonb` SQL -surface is generated. Text and JSONB encrypted behaviour lives on the composite +## 7. `text` (in scope) and `jsonb` (out of scope) + +`text` **is** materialised through this generator. It is the worked example of +an ordered, non-integer, unbounded scalar: it hand-writes its `impl ScalarType` ++ `OrderedScalar` (its `text` shape is read from the catalog `ScalarKind`, like +`date`'s temporal shape — there is no dispatch-list marker) with explicit +lexicographic `min`/`max` pivots instead of `::MIN`/`::MAX` and a real median +`mid_pivot()`. It is **`OrderedScalar` but not `SignedScalar`** — +lexicographic text has no numeric origin, so it does not get the signed-only +sign-boundary test, and the empty string is deliberately not a fixture (`""` +encrypts to an empty ORE term; issue #262). `text` is also the first type to add +a new index `Term` (`Bloom`) — giving it a `match` capability (`@>`/`<@` +bloom-filter containment on the `eql_v3.text_match` domain) on top of equality +(`Hm`) and ordering (`Ore`). Match is deliberately **not** SQL `LIKE`: it is +probabilistic ngram-bloom containment, exposed only on `text_match`, and never +backs equality. + +`jsonb` remains **out of scope**. The `ScalarKind`/`Fixture` enums carry its +string-backed shape at the capability layer, but no `jsonb` SQL surface is +generated — it needs a separate SQL design beyond this ordered-scalar +materializer. JSONB encrypted behaviour today lives on the composite `eql_v2_encrypted` type and its hand-written operator surface in `src/encrypted/` -and `src/operators/`, not the scalar materializer. `jsonb` in particular needs a -separate SQL design beyond this ordered-scalar materializer. +and `src/operators/`, not the scalar materializer. From cf3f00b0150802471d169b06130fa65688d2ec70 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:44:50 +1000 Subject: [PATCH 122/599] refactor(v3): drop redundant IF val IS NULL from ore_block extractor (STRICT) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `eql_v3.ore_block_u64_8_256(jsonb)` extractor is `STRICT`, so PostgreSQL already short-circuits to NULL on a NULL argument — the explicit `IF val IS NULL` guard is dead code. Adjacent cleanup to the SEM extractors; no behaviour change. --- src/v3/sem/ore_block_u64_8_256/functions.sql | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/v3/sem/ore_block_u64_8_256/functions.sql b/src/v3/sem/ore_block_u64_8_256/functions.sql index f2e155a95..815ae6c69 100644 --- a/src/v3/sem/ore_block_u64_8_256/functions.sql +++ b/src/v3/sem/ore_block_u64_8_256/functions.sql @@ -57,10 +57,8 @@ CREATE FUNCTION eql_v3.ore_block_u64_8_256(val jsonb) SET search_path = pg_catalog, extensions, public AS $$ BEGIN - IF val IS NULL THEN - RETURN NULL; - END IF; - + -- Declared STRICT: PostgreSQL returns NULL for a NULL argument without + -- entering the body, so no explicit `val IS NULL` guard is needed. IF eql_v3.has_ore_block_u64_8_256(val) THEN RETURN eql_v3.jsonb_array_to_ore_block_u64_8_256(val->'ob'); END IF; From ceaac494b354cb61028a8a790924d28cceb1a6f3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 14:22:45 +1000 Subject: [PATCH 123/599] test(v3): cover <@, NULL, payload-CHECK and LIKE-absence for text_match MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bloom containment surface (eql_v3.text_match @>/<@) replaces deprecated LIKE/ILIKE but is semantically different (probabilistic, ngram-based, no wildcards/anchoring), which confuses users. Close the coverage gaps: - <@ (contained-by) was implemented in SQL but completely untested: add positive, negative, and commutator (a @> b == b <@ a) assertions, plus a literal-payload <@ engage and empty-set test. - match_null_propagates: @>/<@ are STRICT, so a NULL operand yields NULL. - text_match_containment_requires_all_elements: pins set-containment semantics (every needle ngram must be present) — the property that makes @> not LIKE. - text_match_like_ilike_absent: ~~/~~* resolve to 'operator does not exist' on text_match, the domain a LIKE user would reach for. - text_match_payload_check_rejects_missing_bf: the domain CHECK requires bf. Hand-written suites only (bloom is text-only, outside the cross-type matrix); no SQL/fixture changes — reuses existing eql_v2_text fixtures. --- .../tests/encrypted_domain/text/text_match.rs | 67 +++++++++++ .../tests/encrypted_domain/text/text_smoke.rs | 113 +++++++++++++++++- 2 files changed, 179 insertions(+), 1 deletion(-) diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index 171edfcfc..a1b01ebd7 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -133,3 +133,70 @@ async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> .await?; Ok(()) } + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn needle_contained_by_haystack(pool: PgPool) -> anyhow::Result<()> { + // `<@` (contained-by) is the COMMUTATOR of `@>`; the implemented + // `eql_v3.contained_by` is otherwise untested. `aard <@ aardvark` holds for + // the same shared-ngram reason `aardvark @> aard` does. + let needle = payload_for(&pool, "aard").await?; + let hay = payload_for(&pool, "aardvark").await?; + let hit: bool = sqlx::query_scalar( + "SELECT ($1::jsonb::eql_v3.text_match) <@ ($2::jsonb::eql_v3.text_match)", + ) + .bind(&needle) + .bind(&hay) + .fetch_one(&pool) + .await?; + assert!( + hit, + "'aard' bloom must be contained by 'aardvark' (shared ngrams)" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn disjoint_value_not_contained_by(pool: PgPool) -> anyhow::Result<()> { + // `<@` negative, mirroring `disjoint_value_does_not_match`. "zzzz" (3-gram + // `zzz`) and "aard" (`aar`, `ard`) are ngram-disjoint in TEXT_FIXTURES, so + // this is a deterministic true negative (bloom filters admit false positives + // only for inputs that share n-grams). Keep them disjoint if the fixture + // list changes. + let needle = payload_for(&pool, "zzzz").await?; + let hay = payload_for(&pool, "aard").await?; + let hit: bool = sqlx::query_scalar( + "SELECT ($1::jsonb::eql_v3.text_match) <@ ($2::jsonb::eql_v3.text_match)", + ) + .bind(&needle) + .bind(&hay) + .fetch_one(&pool) + .await?; + assert!( + !hit, + "disjoint 'zzzz' must not be contained by 'aard' (no shared ngrams)" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn contains_and_contained_by_are_commutative(pool: PgPool) -> anyhow::Result<()> { + // Pin the `COMMUTATOR = @>/<@` declaration behaviorally: `a @> b` must equal + // `b <@ a` for the same operand pair, and both hold for the superset/subset + // pair `aardvark`/`aard`. + let sup = payload_for(&pool, "aardvark").await?; + let sub = payload_for(&pool, "aard").await?; + let (contains, contained_by): (bool, bool) = sqlx::query_as( + "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match), + ($2::jsonb::eql_v3.text_match) <@ ($1::jsonb::eql_v3.text_match)", + ) + .bind(&sup) + .bind(&sub) + .fetch_one(&pool) + .await?; + assert_eq!( + contains, contained_by, + "`a @> b` and `b <@ a` must agree (COMMUTATOR)" + ); + assert!(contains, "'aardvark' @> 'aard' must hold for the curated pair"); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs index b62fab67a..cb810c124 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs @@ -1,9 +1,18 @@ //! Literal-payload smoke tests for the generated `eql_v3.text_match` surface: -//! `@>` containment engages (supported wrapper) and `=` raises (blocker). +//! `@>` / `<@` containment engages (supported wrappers), `=` raises (blocker), +//! `~~`/`~~*` are absent (no pattern-match), and the domain CHECK requires `bf`. //! Uses hand-written jsonb payloads carrying `bf` — no encryption/fixtures //! needed. The fixture-backed containment behaviour lives in `text_match.rs`. use sqlx::PgPool; +/// Build a literal `eql_v3.text_match` cast expression carrying bloom array +/// `bf` (e.g. `"[1,2,3]"` or `"[]"`). Lets these tests state set-containment +/// semantics directly on `bf` arrays — deterministic, with no encryption and no +/// bloom false positives to reason about. +fn match_cast(bf: &str) -> String { + format!("'{{\"v\":\"2\",\"i\":{{}},\"c\":\"x\",\"bf\":{bf}}}'::jsonb::eql_v3.text_match") +} + #[sqlx::test] async fn text_match_at_contains_engages(pool: PgPool) -> anyhow::Result<()> { // self-containment: a filter contains a subset of itself @@ -63,3 +72,105 @@ async fn empty_bloom_has_empty_set_semantics(pool: PgPool) -> anyhow::Result<()> ); Ok(()) } + +#[sqlx::test] +async fn match_null_propagates(pool: PgPool) -> anyhow::Result<()> { + // `eql_v3.contains` / `eql_v3.contained_by` are STRICT, so a NULL operand + // yields NULL (three-valued logic) rather than false or an error. + const BF: &str = r#"{"v":"2","i":{},"c":"x","bf":[1,2,3]}"#; + for op in ["@>", "<@"] { + let sql = + format!("SELECT ($1::jsonb::eql_v3.text_match) {op} ($2::jsonb::eql_v3.text_match)"); + eql_tests::assert_null(&pool, &sql, &[None, Some(BF)]).await?; + eql_tests::assert_null(&pool, &sql, &[Some(BF), None]).await?; + } + Ok(()) +} + +#[sqlx::test] +async fn text_match_contained_by_engages(pool: PgPool) -> anyhow::Result<()> { + // `<@` is the COMMUTATOR of `@>` and otherwise unexercised on literals. + let hit: bool = + sqlx::query_scalar(&format!("SELECT ({}) <@ ({})", match_cast("[2]"), match_cast("[1,2,3]"))) + .fetch_one(&pool) + .await?; + assert!(hit, "[2] <@ [1,2,3] must hold"); + Ok(()) +} + +#[sqlx::test] +async fn empty_bloom_contained_by_semantics(pool: PgPool) -> anyhow::Result<()> { + // `<@` mirror of the `@>` empty-set test: the empty filter is contained by + // everything; a non-empty filter is not contained by the empty filter. + let empty_in_everything: bool = + sqlx::query_scalar(&format!("SELECT ({}) <@ ({})", match_cast("[]"), match_cast("[1,2,3]"))) + .fetch_one(&pool) + .await?; + assert!( + empty_in_everything, + "the empty filter must be contained by every filter" + ); + + let nonempty_not_in_empty: bool = + sqlx::query_scalar(&format!("SELECT ({}) <@ ({})", match_cast("[1,2,3]"), match_cast("[]"))) + .fetch_one(&pool) + .await?; + assert!( + !nonempty_not_in_empty, + "a non-empty filter must not be contained by the empty filter" + ); + Ok(()) +} + +#[sqlx::test] +async fn text_match_containment_requires_all_elements(pool: PgPool) -> anyhow::Result<()> { + // `@>` is set containment: the haystack bloom must include *every* element of + // the needle bloom. This is what makes it unlike SQL `LIKE` — there is no + // wildcard or anchoring, only "are all of these ngrams present". Asserted on + // literal `bf` arrays so it is deterministic (no bloom false positives). + let cases = [ + ("[1,2,3]", "[1,2]", true), // proper subset + ("[1,2,3]", "[3,4]", false), // partial overlap — 4 is absent + ("[1,2]", "[3]", false), // disjoint + ]; + for (hay, needle, expected) in cases { + let sql = format!("SELECT ({}) @> ({})", match_cast(hay), match_cast(needle)); + let hit: bool = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + assert_eq!(hit, expected, "bf {hay} @> bf {needle} should be {expected}"); + } + Ok(()) +} + +#[sqlx::test] +async fn text_match_like_ilike_absent(pool: PgPool) -> anyhow::Result<()> { + // The bloom containment surface replaces deprecated `LIKE`/`ILIKE`, but it is + // NOT a pattern-match operator. `~~`/`~~*` are deliberately not declared on + // eql_v3.text_match, so they resolve to PostgreSQL's "operator does not + // exist" rather than an EQL blocker. Pin that they stay absent on the very + // domain a `LIKE` user would reach for. + const BF: &str = r#"{"v":"2","i":{},"c":"x","bf":[1]}"#; + for op in ["~~", "~~*"] { + let sql = + format!("SELECT $1::jsonb::eql_v3.text_match {op} $2::jsonb::eql_v3.text_match"); + eql_tests::assert_raises(&pool, &sql, &[Some(BF), Some(BF)], "operator does not exist") + .await?; + } + Ok(()) +} + +#[sqlx::test] +async fn text_match_payload_check_rejects_missing_bf(pool: PgPool) -> anyhow::Result<()> { + // The generated eql_v3.text_match domain CHECK requires the `bf` key + // (src/v3/scalars/text/text_types.sql). A well-formed envelope lacking `bf` + // must be rejected at the cast, so a match query can never silently run + // against a payload that carries no bloom term. + const NO_BF: &str = r#"{"v":"2","i":{},"c":"x"}"#; + eql_tests::assert_raises( + &pool, + "SELECT $1::jsonb::eql_v3.text_match", + &[Some(NO_BF)], + "violates check constraint", + ) + .await?; + Ok(()) +} From 1822f98a6601382c067e9cd0783e20f3a8867eb6 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 14:33:31 +1000 Subject: [PATCH 124/599] style(v3): cargo fmt text_match and text_smoke tests --- .../tests/encrypted_domain/text/text_match.rs | 5 +- .../tests/encrypted_domain/text/text_smoke.rs | 50 ++++++++++++------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index a1b01ebd7..d903da78f 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -197,6 +197,9 @@ async fn contains_and_contained_by_are_commutative(pool: PgPool) -> anyhow::Resu contains, contained_by, "`a @> b` and `b <@ a` must agree (COMMUTATOR)" ); - assert!(contains, "'aardvark' @> 'aard' must hold for the curated pair"); + assert!( + contains, + "'aardvark' @> 'aard' must hold for the curated pair" + ); Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs index cb810c124..b1c0c8c61 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs @@ -90,10 +90,13 @@ async fn match_null_propagates(pool: PgPool) -> anyhow::Result<()> { #[sqlx::test] async fn text_match_contained_by_engages(pool: PgPool) -> anyhow::Result<()> { // `<@` is the COMMUTATOR of `@>` and otherwise unexercised on literals. - let hit: bool = - sqlx::query_scalar(&format!("SELECT ({}) <@ ({})", match_cast("[2]"), match_cast("[1,2,3]"))) - .fetch_one(&pool) - .await?; + let hit: bool = sqlx::query_scalar(&format!( + "SELECT ({}) <@ ({})", + match_cast("[2]"), + match_cast("[1,2,3]") + )) + .fetch_one(&pool) + .await?; assert!(hit, "[2] <@ [1,2,3] must hold"); Ok(()) } @@ -102,19 +105,25 @@ async fn text_match_contained_by_engages(pool: PgPool) -> anyhow::Result<()> { async fn empty_bloom_contained_by_semantics(pool: PgPool) -> anyhow::Result<()> { // `<@` mirror of the `@>` empty-set test: the empty filter is contained by // everything; a non-empty filter is not contained by the empty filter. - let empty_in_everything: bool = - sqlx::query_scalar(&format!("SELECT ({}) <@ ({})", match_cast("[]"), match_cast("[1,2,3]"))) - .fetch_one(&pool) - .await?; + let empty_in_everything: bool = sqlx::query_scalar(&format!( + "SELECT ({}) <@ ({})", + match_cast("[]"), + match_cast("[1,2,3]") + )) + .fetch_one(&pool) + .await?; assert!( empty_in_everything, "the empty filter must be contained by every filter" ); - let nonempty_not_in_empty: bool = - sqlx::query_scalar(&format!("SELECT ({}) <@ ({})", match_cast("[1,2,3]"), match_cast("[]"))) - .fetch_one(&pool) - .await?; + let nonempty_not_in_empty: bool = sqlx::query_scalar(&format!( + "SELECT ({}) <@ ({})", + match_cast("[1,2,3]"), + match_cast("[]") + )) + .fetch_one(&pool) + .await?; assert!( !nonempty_not_in_empty, "a non-empty filter must not be contained by the empty filter" @@ -136,7 +145,10 @@ async fn text_match_containment_requires_all_elements(pool: PgPool) -> anyhow::R for (hay, needle, expected) in cases { let sql = format!("SELECT ({}) @> ({})", match_cast(hay), match_cast(needle)); let hit: bool = sqlx::query_scalar(&sql).fetch_one(&pool).await?; - assert_eq!(hit, expected, "bf {hay} @> bf {needle} should be {expected}"); + assert_eq!( + hit, expected, + "bf {hay} @> bf {needle} should be {expected}" + ); } Ok(()) } @@ -150,10 +162,14 @@ async fn text_match_like_ilike_absent(pool: PgPool) -> anyhow::Result<()> { // domain a `LIKE` user would reach for. const BF: &str = r#"{"v":"2","i":{},"c":"x","bf":[1]}"#; for op in ["~~", "~~*"] { - let sql = - format!("SELECT $1::jsonb::eql_v3.text_match {op} $2::jsonb::eql_v3.text_match"); - eql_tests::assert_raises(&pool, &sql, &[Some(BF), Some(BF)], "operator does not exist") - .await?; + let sql = format!("SELECT $1::jsonb::eql_v3.text_match {op} $2::jsonb::eql_v3.text_match"); + eql_tests::assert_raises( + &pool, + &sql, + &[Some(BF), Some(BF)], + "operator does not exist", + ) + .await?; } Ok(()) } From 89bebd1a5450112aa91735b17be6d66277259596 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 19:04:40 +1000 Subject: [PATCH 125/599] test(v3): cover reviewer-flagged coverage gaps in text family MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the four characterization tests @auxesis requested on #260, each pinning a branch the existing suite never reached: - has_bloom_filter(jsonb) presence predicate (present/absent/{"bf":null} -> false) — the IS NOT NULL half of its guard was untested, and it is not reached transitively by the extractor or domain CHECK. - bloom_filter(jsonb) empty-array branch: {"bf":[]} -> empty smallint[], not NULL (the extractor basis for empty-set containment semantics). - String::to_sql_literal single-quote escaping (O'Brien -> 'O''Brien'); all TEXT fixtures are quote-free so no DB test hit the .replace. - Fixture::Zero/Min/Max -> None on non-integer kinds (Date/Text), the arm changed from unconditional Some(0); previously only guarded indirectly by the pivot_sentinels_only_appear_with_integer_kinds catalog invariant. All four pass; behaviour was already correct, these are regression nets. --- crates/eql-scalars/src/tests.rs | 14 +++++ tests/sqlx/src/scalar_domains.rs | 19 +++++++ .../sqlx/tests/encrypted_domain/family/sem.rs | 52 +++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 28824ae95..1c988377a 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -355,6 +355,20 @@ mod fixture_tests { ); } + #[test] + fn sentinel_value_is_none_on_non_integer_kinds() { + // Directly pins the `kind.as_bounded_int() => None` arm of + // `numeric_value` for the pivot sentinels. Previously `Fixture::Zero` + // returned `Some(0)` unconditionally; a refactor that restored that + // would make the two `Zero` cases below fail. The + // `pivot_sentinels_only_appear_with_integer_kinds` catalog invariant + // guards this only indirectly. + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::Date), None); + assert_eq!(Fixture::Zero.numeric_value(ScalarKind::Text), None); + assert_eq!(Fixture::Min.numeric_value(ScalarKind::Text), None); + assert_eq!(Fixture::Max.numeric_value(ScalarKind::Date), None); + } + #[test] fn render_literal_maps_sentinels() { assert_eq!(Fixture::Min.render_literal(ScalarKind::I32), "i32::MIN"); diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index e7ae37472..0d6cfe770 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -435,6 +435,25 @@ mod text_value_tests { .collect(); assert_eq!(got, eql_scalars::TEXT_VALUES.to_vec()); } + + /// Directly exercises the `String` `to_sql_literal` override's + /// single-quote-doubling branch. Every `TEXT_VALUES` fixture is quote-free, + /// so no DB-backed test reaches the `.replace('\'', "''")`; this pins it so a + /// quoting/injection regression in the override is caught. (The sibling + /// `sql_string_literal` helper is tested separately — this covers the + /// trait method itself.) + #[test] + fn text_to_sql_literal_escapes_single_quotes() { + assert_eq!( + ::to_sql_literal(&"O'Brien".to_string()), + "'O''Brien'" + ); + // a quote-free value is wrapped but otherwise untouched + assert_eq!( + ::to_sql_literal(&"frank".to_string()), + "'frank'" + ); + } } /// Per-domain capability + payload shape. Storage carries no terms, `Eq` diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 5346feb50..76a51a2a9 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -494,3 +494,55 @@ async fn bloom_filter_extractor_returns_null_for_non_array_bf(pool: PgPool) -> R assert!(got.is_none(), "non-array bf must return NULL, not raise"); Ok(()) } + +#[sqlx::test] +async fn bloom_filter_extractor_empty_array_is_empty_not_null(pool: PgPool) -> Result<()> { + // An empty `bf` array hits the `jsonb_typeof(...) = 'array'` branch with + // zero elements and must extract as an EMPTY filter — `Some([])`, not NULL. + // This is the extractor-level basis for the empty-set containment semantics + // ("contains nothing, contained by everything") the smoke tests assert only + // via literal `text_match` casts. Distinct from the absent/non-array NULL + // branches above. + let got: Option> = + sqlx::query_scalar("SELECT eql_v3.bloom_filter('{\"bf\":[]}'::jsonb)::smallint[]") + .fetch_one(&pool) + .await?; + assert_eq!( + got, + Some(vec![]), + "empty bf array must extract as empty array, not NULL" + ); + Ok(()) +} + +/// T8 — `eql_v3.has_bloom_filter(jsonb)` presence predicate. Mirrors the +/// `has_hmac_256` / `has_ore_block_u64_8_256` coverage in T5: its two-part guard +/// (`val ? 'bf'` AND `val ->> 'bf' IS NOT NULL`) is exercised across present, +/// absent, and json-null cases. The `{"bf":null}` → false case pins the +/// `IS NOT NULL` half — the predicate is not reached transitively by the +/// extractor or the domain CHECK, so it needs direct coverage. +#[sqlx::test] +async fn has_bloom_filter_detects_bf_presence(pool: PgPool) -> Result<()> { + let bool_cases = [ + // present + non-null array → true + ( + r#"SELECT eql_v3.has_bloom_filter('{"bf":[1,2,3]}'::jsonb)"#, + true, + ), + // key absent → false + ( + r#"SELECT eql_v3.has_bloom_filter('{"hm":"x"}'::jsonb)"#, + false, + ), + // key present but json-null → false (the `->> ... IS NOT NULL` half) + ( + r#"SELECT eql_v3.has_bloom_filter('{"bf":null}'::jsonb)"#, + false, + ), + ]; + for (sql, expected) in bool_cases { + let got: bool = sqlx::query_scalar(sql).fetch_one(&pool).await?; + assert_eq!(got, expected, "presence check: {sql}"); + } + Ok(()) +} From caea8f752cf459214a91b1f240f1e3c371e86295 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 10 Jun 2026 10:27:07 +1000 Subject: [PATCH 126/599] docs(v3): close guide gaps for eq-only and Bloom-match scalar types Reconcile the adding-a-scalar guide with the post-timestamptz/text catalog: correct the claim that timestamptz is ordered (it is equality-only via EQ_ONLY_DOMAINS), add the missing Timestamptz/Date enum variants, and note that @>/<@ back onto Bloom containment wrappers rather than blockers. Document the previously-undocumented mechanics a follower needs: eq-only is selected by the catalog domain slice (caps auto-derived), a new-capability domain like _match needs hand-written #[path]-registered suites, non-integer types need the third scalar_domains.rs registration, and the Bloom splinter allowlist names. --- .../adding-a-scalar-encrypted-domain-type.md | 123 ++++++++++++++---- 1 file changed, 100 insertions(+), 23 deletions(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 06322efa0..d60264e69 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -39,8 +39,10 @@ To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): 2. **Materialise the value list** — `int_values!(_VALUES, , );` next to `CATALOG`, pinned by a `values_tests` assertion (§2). This is the single source the SQLx matrix reads; there is no generated `_values.rs`. -3. **Wire the SQLx matrix oracle** — copy the two small registrations from the - `int4` reference (§3). +3. **Wire the SQLx matrix oracle** — for an integer type, copy the two small + registrations from the `int4` reference; a non-integer (string-backed) type + needs a third (`scalar_domains.rs`), and `date`/`text` are the references + there (§3). 4. **Regenerate** — `cargo run -p eql-codegen` (or just `mise run build`, which runs the generator first). One run regenerates *every* catalog type; there is no per-type codegen task. The generated `*_{types,functions,operators,aggregates}.sql` @@ -94,11 +96,13 @@ than a runtime validator: domain's full name is `token` + `suffix` (`ScalarSpec::domain_name`), pinned by `every_domain_name_starts_with_its_token`. - **`kind`** — a `ScalarKind` (`I16` / `I32` / `I64` / `Numeric` / `Text` / - `Jsonb` / `Date`), carrying the Rust type name. Only the integer kinds have an + `Jsonb` / `Date` / `Timestamptz`), carrying the Rust type name. Only the + integer kinds have an i128 range with `Min`/`Max`/`Zero` sentinels: those bounded accessors (`min_symbol`/`max_symbol`/`zero_symbol`/`min_value`/`max_value`) live on the total `BoundedIntKind` sub-enum, reached via `ScalarKind::as_bounded_int() -> - Option`. Non-integer kinds (`Numeric`/`Text`/`Jsonb`/`Date`) + Option`. Non-integer kinds + (`Numeric`/`Text`/`Jsonb`/`Date`/`Timestamptz`) return `None` and simply have no bounded accessor — misuse is a compile error, not a runtime panic. **If `` needs a new fixed-width integer, add a `BoundedIntKind` variant** (rust-type name, `MIN`/`MAX`/zero symbols, bounds) @@ -146,7 +150,8 @@ The `fixtures` field is an ordered `&[Fixture]` — the single source of truth for the type's plaintext list, consumed by both the SQLx fixture generator and the matrix oracle. A `Fixture` is value-kind tagged: `Min` / `Max` / `Zero` (the integer matrix pivots, resolved per-kind), `Int(i128)` (an integer literal), and -`Numeric` / `Text` / `Jsonb` string variants. The `fixtures!` macro +`Numeric` / `Text` / `Jsonb` / `Date` / `Timestamptz` string variants. The +`fixtures!` macro range-checks each `Int` literal against the kind at compile time (`N(-40000)` for an `i16` kind does not compile): @@ -187,12 +192,26 @@ the oracle cannot drift from the values the generator encrypts. There is no committed `_values.rs`: a Rust source of truth does not round-trip through generated Rust. Pin the exact materialised list with a `values_tests` assertion. +The materialiser macro differs by kind: `int_values!` for integers, `text_values!` +for `text` (a `Fixture::Text(&'static str)` is already `const`, so it too +materialises a typed `&'static` slice), and **none** for the chrono-backed +temporal kinds (`date`/`timestamptz`) — chrono constructors are not `const`, so +there is no `_VALUES` const; the SQLx harness parses the catalog strings into a +`LazyLock>` instead (§"Temporal kinds" and `scalar_domains.rs`). + ### Temporal kinds — string-backed fixtures and the pivot trait -A **temporal** scalar (the `date` reference; `timestamptz` follows the same -shape) is *ordered but non-integer*, so it diverges from the integer path in -three places — all in the catalog/harness, never the SQL codegen (domains stay -jsonb-backed and token-driven): +A **temporal** scalar (`date` is the *ordered* temporal reference) is *ordered +but non-integer*, so it diverges from the integer path in three places — all in +the catalog/harness, never the SQL codegen (domains stay jsonb-backed and +token-driven). **`timestamptz` is the exception: it is equality-only, not +ordered** — its catalog row uses `EQ_ONLY_DOMAINS` (storage + `_eq`, no +`_ord`/`_ord_ore`), the eq-only shape of §3, because cipherstash encrypts +`Plaintext::Timestamp` at native 12-block ORE width while EQL's only comparator +(`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so an +ordered `timestamptz` domain would silently mis-order (see the catalog comment on +the `TIMESTAMPTZ` spec). Its value-wiring is still the temporal path below; only +its domain set differs. The three divergences (for the ordered `date`): - **String-backed fixtures.** `eql-scalars` stays zero-dependency, so the catalog stores ISO strings (`Fixture::Date("1970-01-01")`), not `chrono` @@ -235,12 +254,17 @@ jsonb-backed and token-driven): The generated SQL is enough to *install* the domains, but the `scalar_matrix!` suite only runs once the Rust harness knows about the scalar. `` is the scalar's Rust type (`i32` for `int4`, `i16` for `int2`). -There are now **two** registrations: +The registrations depend on whether `` is an **integer** kind. For an +integer type (the `int4` reference) there are **two**; a **non-integer +(string-backed)** type — `date`, `timestamptz`, `text` — needs a **third** +(`scalar_domains.rs`), because the proc-macro emits `impl ScalarType` only for +integer kinds: | File | Add | |------|-----| -| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType`, the `eql_v2_` fixture module, the `scalar_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | -| `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}` and `impl EqlPlaintext for ` carrying just `const KIND: ScalarKind` plus the value-typed `to_plaintext` → the right `Plaintext` variant. `CAST` and `PLAINTEXT_SQL_TYPE` are **derived** from `KIND` via the `cast_for_kind` / `plaintext_sql_type_for_kind` `const fn` defaults, so a brand-new integer kind needs an arm in those two helpers — not a per-type const. Keep the three `#[test]`s (cast / sql-type / to_plaintext) mirroring the existing ones. | +| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType` **(integer kinds only)**, the `eql_v2_` fixture module, the `scalar_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | +| `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}` and `impl EqlPlaintext for ` carrying just `const KIND: ScalarKind` plus the value-typed `to_plaintext` → the right `Plaintext` variant. `CAST` and `PLAINTEXT_SQL_TYPE` are **derived** from `KIND` via the `cast_for_kind` / `plaintext_sql_type_for_kind` `const fn` defaults, so a brand-new kind needs an arm in those two helpers — not a per-type const (see §3.1 for a non-integer kind's full wiring). Keep the three `#[test]`s (cast / sql-type / to_plaintext) mirroring the existing ones. | +| `tests/sqlx/src/scalar_domains.rs` **(non-integer only)** | The `impl ScalarType` the proc-macro skips for non-integer kinds. For a **chrono-backed** kind (`date`, `timestamptz`) this is a `temporal_values!` invocation that materialises the catalog ISO/RFC3339 strings into a `LazyLock>` and emits `impl ScalarType` + `OrderedScalar` (+ `SignedScalar` for `date`). For **`text`** it is a hand-written `impl ScalarType` / `OrderedScalar` block (lexicographic `min`/`max`/`mid` pivots, `to_sql_literal` override) — `String` has no numeric origin, so it is deliberately **not** `SignedScalar`. | The single ` => ` line in `scalar_types.rs` is the harness source of truth. The four code-generators (`emit_scalar_type_impls`, @@ -267,7 +291,13 @@ list, so the invocation carries no pivot argument. `caps = [eq, ord]` selects th ordered-numeric shape (all four variants; `=`/`<>`/`<`/`<=`/`>`/`>=`; ORDER BY / ORDER BY USING; ORE injectivity); `caps = [eq]` selects the equality-only shape (storage + `_eq` only; the four ord operators are deliberate blockers). Both -expand to the lower-level `scalar_domain_matrix!`. The pivot *sweep* is uniform +expand to the lower-level `scalar_domain_matrix!`. **You never write `caps`**: +the `scalar_matrix!` proc-macro derives it from the catalog row via +`ScalarSpec::is_eq_only()` (`is_eq_only_token` in `eql-tests-macros`), so the +ordered-vs-eq-only selection is a pure function of which domain-suffix slice the +catalog row uses — `EQ_ONLY_DOMAINS` (→ `[eq]`) vs `ORDERED_INT_DOMAINS` (→ `[eq, +ord]`). `timestamptz` is the worked eq-only example: its `EQ_ONLY_DOMAINS` row +auto-emits `caps = [eq]`, no harness flag. The pivot *sweep* is uniform across every ordered type (one canonical snapshot); the signed-only sign-boundary test (`SignedScalar`, `int`/`date`) lives outside `scalars::` in `encrypted_domain/signed.rs`, so a `text` instantiation of it is a compile error @@ -279,6 +309,40 @@ BY USING) — read it rather than duplicating a count here. For ordered `int4`, keep the assertion that distinct plaintext values produce distinct ORE blocks; do not add assertions for term behaviour the catalog does not promise. +### 3.1 Wiring a brand-new non-integer kind + +The integer arms above suffice for a new *width* of an existing integer kind. A +brand-new **non-integer** kind (the way `Date`/`Timestamptz`/`Text` were each +first added) also needs, in `tests/sqlx/src/fixtures/eql_plaintext.rs`: + +- a `Cast` const + a `PlaintextSqlType` const (e.g. `Cast::DATE`, + `PlaintextSqlType::TIMESTAMPTZ`) on those two newtypes; +- an arm in **`cast_for_kind`** and in **`plaintext_sql_type_for_kind`** mapping + the new `ScalarKind` to those consts (a missing arm is a `panic!`, not a silent + default); +- a `sealed::Sealed` impl for the Rust plaintext type (so the `EqlPlaintext` impl + is admissible); +- an `impl EqlPlaintext` whose `to_plaintext` maps onto the correct + `Plaintext::*` variant (`Plaintext::NaiveDate` / `Plaintext::Timestamp` / + `Plaintext::Text`), plus the three mirrored `#[test]`s. + +### New-capability domains (e.g. `_match` / `Bloom`) + +A domain carrying a capability the matrix does not model — `text`'s `_match` +(`Bloom`, `@>`/`<@`) is the only example today — is **not** covered by the +auto-generated `scalar_matrix!`, which only understands the eq/ord caps. So for +such a domain you must, in addition to the catalog row: + +- **write hand-written behavioural suites** — see + `tests/sqlx/tests/encrypted_domain/text/text_match.rs` (fixture-backed + bloom-containment) and `text_smoke.rs` (literal-payload `@>`/`<@` engage, `=` + raises, `~~`/`~~*` absent, CHECK requires `bf`); +- **register them via `#[path]` mod declarations** in + `tests/sqlx/tests/encrypted_domain.rs`, kept **outside** the `scalars::` module + on purpose: the matrix-inventory gate treats every `scalars::::` prefix as a + scalar type, so a suite registered there would be mis-discovered as a phantom + type (and would pollute the inventory snapshot). + ### Matrix coverage inventory snapshot The *set of test names* the matrix emits is guarded by **one** committed, @@ -419,7 +483,11 @@ the operator. Supported operators are emitted with full planner metadata (`COMMUTATOR`, `NEGATOR`, `RESTRICT`, `JOIN` selectivity estimators) backing onto inlinable wrappers; everything else carries minimal metadata backing onto blockers. Path operators always back onto blockers — neither current term -enables them — and the native `jsonb` operators are blocker-only. +enables them — and the native `jsonb` operators are blocker-only **except +`@>`/`<@`**, which back onto inlinable containment wrappers (`eql_v3.contains` / +`eql_v3.contained_by`) on a `Bloom` `_match` domain (e.g. `eql_v3.text_match`) +and elsewhere stay blockers — matching the per-domain table just below, where the +`&[Term::Bloom]` row carries six containment wrappers. The wrapper/blocker split per domain (the 44-operator total never moves): @@ -533,10 +601,14 @@ edits: functions by language (`sql`), volatility (`IMMUTABLE`), and a jsonb-backed `DOMAIN` argument in the `eql_v3` schema. New scalar types need no edit. - **`tasks/test/splinter.sh`** — name-based allowlist. The converged wrapper / - extractor names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, `eq_term`, `ord_term`) - plus the generated `min` / `max` aggregates are already covered by - `eql_v3`-schema entries. A new scalar type inherits coverage; **only a new - term whose extractor has a new name requires a splinter entry.** + extractor names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, `eq_term`, `ord_term`, + the `Bloom` term's `match_term` extractor and its `contains` / `contained_by` + containment wrappers) plus the generated `min` / `max` aggregates and the SEM + `hmac_256` / `ore_block_u64_8_256` / `bloom_filter` constructors are already + covered by `eql_v3`-schema entries. A new scalar type inherits coverage; **a + new term needs splinter entries for each new name it introduces — both its + extractor and its comparison wrappers** (adding `Bloom` required `match_term`, + `contains`, `contained_by`, and the SEM `bloom_filter`). --- @@ -547,9 +619,12 @@ adding a type. ### Why a generator -A single scalar type emits several hundred SQL declarations across eleven files: -four domains, three extractors, dozens of wrappers and blockers, 176 `CREATE -OPERATOR` statements (44 per domain), and MIN/MAX aggregates per ordered domain. +A single scalar type emits several hundred SQL declarations. For `int4`: eleven +files, four domains, three extractors, dozens of wrappers and blockers, 176 +`CREATE OPERATOR` statements (44 per domain), and MIN/MAX aggregates per ordered +domain. (The per-domain figure is fixed — 44 operators per domain, the `1 + 2D + +A` file formula below — so a type with more domains, e.g. `text`'s five, scales +those totals up.) The shape is mechanical and the invariants are unforgiving — a `STRICT` blocker silently bypasses its exception; a pinned `search_path` reverts queries to seq scans. The generator exists so each new type adds one `CATALOG` row rather than @@ -670,8 +745,10 @@ test:matrix:inventory`). The codegen job is a prerequisite of the PostgreSQL test matrix. Adding a new **term** is a bigger move than adding a type: edit the `Term` enum's -`impl` methods, add `#[test]`s, audit `splinter.sh` for a name collision if the -extractor name is new, and — because it changes the int4 surface — update the +`impl` methods, add `#[test]`s, add a `splinter.sh` entry for **each new name the +term introduces** — its extractor *and* its comparison wrappers, plus any new SEM +constructor (adding `Bloom` required `match_term`, `contains`, `contained_by`, +and the SEM `bloom_filter`) — and, because it changes the int4 surface, update the golden reference under `tests/codegen/reference/int4/`. --- From eb26c1b0d1a4dc86b446bd6511942b81eaaebbcc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 10 Jun 2026 10:38:59 +1000 Subject: [PATCH 127/599] docs(v3): correct bloom_filter comments on the text_match domain CHECK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The extractor doc and its sibling test comment claimed the text_match domain CHECK guarantees `bf` is an array, so a non-array `bf` could only occur outside the domain. The CHECK only asserts key presence (`VALUE ? 'bf'`), so a typed value like {"bf": null} reaches the extractor with a non-array `bf` — which is exactly why the array-gate and its test exist. Also fix a stale macro name (`ordered_numeric_matrix!` -> `scalar_matrix!`) and trim a thrice-repeated rationale in the text_values wiring. --- src/v3/sem/bloom_filter/functions.sql | 18 +++++++++--------- tests/sqlx/src/scalar_domains.rs | 5 ++--- .../sqlx/tests/encrypted_domain/family/sem.rs | 10 +++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/v3/sem/bloom_filter/functions.sql b/src/v3/sem/bloom_filter/functions.sql index 29e5cf11e..291ba736d 100644 --- a/src/v3/sem/bloom_filter/functions.sql +++ b/src/v3/sem/bloom_filter/functions.sql @@ -35,15 +35,15 @@ $$ LANGUAGE plpgsql; --! Inlinable single-statement SQL — the planner can fold this into the calling --! query so the functional GIN index built on `eql_v3.match_term(col)` (which --! calls this) engages structurally. Mirrors `eql_v3.hmac_256(jsonb)`: no RAISE ---! and no pinned `search_path`. Returns NULL when `bf` is absent (or present but ---! not a json array) rather than raising — the `match` capability is tied to the ---! domain, whose CHECK already guarantees `bf` is a present array, so a missing ---! or malformed key can only occur on raw jsonb outside the domain (where NULL, ---! like the HMAC extractor, is the right answer). Gating on `jsonb_typeof(...) = ---! 'array'` keeps a degenerate payload such as `{"bf": null}` returning NULL ---! instead of erroring inside `jsonb_array_elements`. An empty `bf` array yields ---! an empty filter (contains nothing, contained by everything), matching ---! set-containment semantics. +--! and no pinned `search_path`. Returns NULL when `bf` is absent or present but +--! not a json array, rather than raising. The `text_match` domain CHECK +--! guarantees the `bf` *key* is present but not that it is an array, so a +--! non-array `bf` (e.g. `{"bf": null}`) can reach here even on a typed value; +--! gating on `jsonb_typeof(...) = 'array'` returns NULL for that case — and for +--! raw jsonb outside the domain — instead of erroring inside +--! `jsonb_array_elements`. NULL, like the HMAC extractor, is the right answer. An +--! empty `bf` array yields an empty filter (contains nothing, contained by +--! everything), matching set-containment semantics. --! --! @param val jsonb The encrypted payload. --! @return eql_v3.bloom_filter The `bf` array as a smallint[] domain value, or diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 0d6cfe770..25ad3605a 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -90,7 +90,7 @@ pub trait ScalarType: } /// An **ordered** scalar — one whose `_ord` domains support `<`/`<=`/`>`/`>=`. -/// Carries the three comparison anchors the `ordered_numeric_matrix!` sweeps: +/// Carries the three comparison anchors the `scalar_matrix!` ordered arm sweeps: /// the `min`/`max` boundaries and an interior `mid` pivot. All three must be /// present verbatim in `fixture_values()` (the matrix fetches each pivot's /// ciphertext via `fetch_fixture_payload`). @@ -356,8 +356,7 @@ static TEXT_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock: /// The `String` fixture values, in catalog order. Public so the `eql_v2_text` /// fixture module (emitted by `scalar_types!(fixture_modules)`) can hand the -/// slice to `scalar_fixture!` — `text` is owned `String`, so there is no -/// `eql_scalars::_VALUES`-typed `&[String]` const to point at directly. +/// slice to `scalar_fixture!`. pub fn text_values() -> &'static [String] { &TEXT_VALUES_CELL } diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 76a51a2a9..da4a748d5 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -482,11 +482,11 @@ async fn bloom_filter_extractor_returns_null_without_bf(pool: PgPool) -> Result< #[sqlx::test] async fn bloom_filter_extractor_returns_null_for_non_array_bf(pool: PgPool) -> Result<()> { - // A degenerate raw payload where `bf` is present but not a json array - // (`{"bf": null}`) must return NULL, not error inside `jsonb_array_elements`. - // The extractor gates on `jsonb_typeof(...) = 'array'`, so a malformed key — - // only reachable outside the domain, whose CHECK guarantees an array — is - // treated like an absent one. + // A payload where `bf` is present but not a json array (`{"bf": null}`) must + // return NULL, not error inside `jsonb_array_elements`. The `text_match` + // domain CHECK only requires the `bf` key to be present, not that it is an + // array, so a non-array `bf` can reach the extractor even on a typed value; + // gating on `jsonb_typeof(...) = 'array'` treats it like an absent key. let got: Option> = sqlx::query_scalar("SELECT eql_v3.bloom_filter('{\"bf\":null}'::jsonb)::smallint[]") .fetch_one(&pool) From 5fdaa4352d4fdae928e786e77204bc8365ae7ac1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 10 Jun 2026 23:10:25 +1000 Subject: [PATCH 128/599] test(codegen): commit per-type parity goldens for every catalog scalar Adds int2/int8/date/text/timestamptz reference goldens alongside the existing int4 set, generated once with `cargo run -p eql-codegen` and byte-identical to the generator output. These cover the eq-only and Bloom `text_match` render shapes that int4 never exercises. Pure generated SQL. The parity machinery that discovers these dirs and gates each against the generator (dynamic discovery + `reference_dirs_match_catalog_tokens`) lands in the stacked follow-up (eql-codegen/eql-scalars review hardening), which depends on these files existing. Until then the existing int4 parity test is unaffected. --- .../reference/date/date_eq_functions.sql | 407 ++++++++++++++++++ .../reference/date/date_eq_operators.sql | 234 ++++++++++ .../codegen/reference/date/date_functions.sql | 404 +++++++++++++++++ .../codegen/reference/date/date_operators.sql | 228 ++++++++++ .../reference/date/date_ord_aggregates.sql | 63 +++ .../reference/date/date_ord_functions.sql | 396 +++++++++++++++++ .../reference/date/date_ord_operators.sql | 246 +++++++++++ .../date/date_ord_ore_aggregates.sql | 63 +++ .../reference/date/date_ord_ore_functions.sql | 396 +++++++++++++++++ .../reference/date/date_ord_ore_operators.sql | 246 +++++++++++ tests/codegen/reference/date/date_types.sql | 73 ++++ .../reference/int2/int2_eq_functions.sql | 407 ++++++++++++++++++ .../reference/int2/int2_eq_operators.sql | 234 ++++++++++ .../codegen/reference/int2/int2_functions.sql | 404 +++++++++++++++++ .../codegen/reference/int2/int2_operators.sql | 228 ++++++++++ .../reference/int2/int2_ord_aggregates.sql | 63 +++ .../reference/int2/int2_ord_functions.sql | 396 +++++++++++++++++ .../reference/int2/int2_ord_operators.sql | 246 +++++++++++ .../int2/int2_ord_ore_aggregates.sql | 63 +++ .../reference/int2/int2_ord_ore_functions.sql | 396 +++++++++++++++++ .../reference/int2/int2_ord_ore_operators.sql | 246 +++++++++++ tests/codegen/reference/int2/int2_types.sql | 73 ++++ .../reference/int8/int8_eq_functions.sql | 407 ++++++++++++++++++ .../reference/int8/int8_eq_operators.sql | 234 ++++++++++ .../codegen/reference/int8/int8_functions.sql | 404 +++++++++++++++++ .../codegen/reference/int8/int8_operators.sql | 228 ++++++++++ .../reference/int8/int8_ord_aggregates.sql | 63 +++ .../reference/int8/int8_ord_functions.sql | 396 +++++++++++++++++ .../reference/int8/int8_ord_operators.sql | 246 +++++++++++ .../int8/int8_ord_ore_aggregates.sql | 63 +++ .../reference/int8/int8_ord_ore_functions.sql | 396 +++++++++++++++++ .../reference/int8/int8_ord_ore_operators.sql | 246 +++++++++++ tests/codegen/reference/int8/int8_types.sql | 73 ++++ .../reference/text/text_eq_functions.sql | 407 ++++++++++++++++++ .../reference/text/text_eq_operators.sql | 234 ++++++++++ .../codegen/reference/text/text_functions.sql | 404 +++++++++++++++++ .../reference/text/text_match_functions.sql | 407 ++++++++++++++++++ .../reference/text/text_match_operators.sql | 234 ++++++++++ .../codegen/reference/text/text_operators.sql | 228 ++++++++++ .../reference/text/text_ord_aggregates.sql | 63 +++ .../reference/text/text_ord_functions.sql | 396 +++++++++++++++++ .../reference/text/text_ord_operators.sql | 246 +++++++++++ .../text/text_ord_ore_aggregates.sql | 63 +++ .../reference/text/text_ord_ore_functions.sql | 396 +++++++++++++++++ .../reference/text/text_ord_ore_operators.sql | 246 +++++++++++ tests/codegen/reference/text/text_types.sql | 89 ++++ .../timestamptz/timestamptz_eq_functions.sql | 407 ++++++++++++++++++ .../timestamptz/timestamptz_eq_operators.sql | 234 ++++++++++ .../timestamptz/timestamptz_functions.sql | 404 +++++++++++++++++ .../timestamptz/timestamptz_operators.sql | 228 ++++++++++ .../timestamptz/timestamptz_types.sql | 41 ++ 51 files changed, 12995 insertions(+) create mode 100644 tests/codegen/reference/date/date_eq_functions.sql create mode 100644 tests/codegen/reference/date/date_eq_operators.sql create mode 100644 tests/codegen/reference/date/date_functions.sql create mode 100644 tests/codegen/reference/date/date_operators.sql create mode 100644 tests/codegen/reference/date/date_ord_aggregates.sql create mode 100644 tests/codegen/reference/date/date_ord_functions.sql create mode 100644 tests/codegen/reference/date/date_ord_operators.sql create mode 100644 tests/codegen/reference/date/date_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/date/date_ord_ore_functions.sql create mode 100644 tests/codegen/reference/date/date_ord_ore_operators.sql create mode 100644 tests/codegen/reference/date/date_types.sql create mode 100644 tests/codegen/reference/int2/int2_eq_functions.sql create mode 100644 tests/codegen/reference/int2/int2_eq_operators.sql create mode 100644 tests/codegen/reference/int2/int2_functions.sql create mode 100644 tests/codegen/reference/int2/int2_operators.sql create mode 100644 tests/codegen/reference/int2/int2_ord_aggregates.sql create mode 100644 tests/codegen/reference/int2/int2_ord_functions.sql create mode 100644 tests/codegen/reference/int2/int2_ord_operators.sql create mode 100644 tests/codegen/reference/int2/int2_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/int2/int2_ord_ore_functions.sql create mode 100644 tests/codegen/reference/int2/int2_ord_ore_operators.sql create mode 100644 tests/codegen/reference/int2/int2_types.sql create mode 100644 tests/codegen/reference/int8/int8_eq_functions.sql create mode 100644 tests/codegen/reference/int8/int8_eq_operators.sql create mode 100644 tests/codegen/reference/int8/int8_functions.sql create mode 100644 tests/codegen/reference/int8/int8_operators.sql create mode 100644 tests/codegen/reference/int8/int8_ord_aggregates.sql create mode 100644 tests/codegen/reference/int8/int8_ord_functions.sql create mode 100644 tests/codegen/reference/int8/int8_ord_operators.sql create mode 100644 tests/codegen/reference/int8/int8_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/int8/int8_ord_ore_functions.sql create mode 100644 tests/codegen/reference/int8/int8_ord_ore_operators.sql create mode 100644 tests/codegen/reference/int8/int8_types.sql create mode 100644 tests/codegen/reference/text/text_eq_functions.sql create mode 100644 tests/codegen/reference/text/text_eq_operators.sql create mode 100644 tests/codegen/reference/text/text_functions.sql create mode 100644 tests/codegen/reference/text/text_match_functions.sql create mode 100644 tests/codegen/reference/text/text_match_operators.sql create mode 100644 tests/codegen/reference/text/text_operators.sql create mode 100644 tests/codegen/reference/text/text_ord_aggregates.sql create mode 100644 tests/codegen/reference/text/text_ord_functions.sql create mode 100644 tests/codegen/reference/text/text_ord_operators.sql create mode 100644 tests/codegen/reference/text/text_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/text/text_ord_ore_functions.sql create mode 100644 tests/codegen/reference/text/text_ord_ore_operators.sql create mode 100644 tests/codegen/reference/text/text_types.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_eq_functions.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_eq_operators.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_functions.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_operators.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_types.sql diff --git a/tests/codegen/reference/date/date_eq_functions.sql b/tests/codegen/reference/date/date_eq_functions.sql new file mode 100644 index 000000000..d3355a1b6 --- /dev/null +++ b/tests/codegen/reference/date/date_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/date/date_eq_functions.sql +--! @brief Functions for eql_v3.date_eq. + +--! @brief Index extractor for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.date_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.date_eq) $$; + +--! @brief Operator wrapper for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.date_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.date_eq) $$; + +--! @brief Operator wrapper for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.date_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.date_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param selector text +--! @return eql_v3.date_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.date_eq, selector text) +RETURNS eql_v3.date_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param selector integer +--! @return eql_v3.date_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.date_eq, selector integer) +RETURNS eql_v3.date_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param selector eql_v3.date_eq +--! @return eql_v3.date_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.date_eq) +RETURNS eql_v3.date_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param selector eql_v3.date_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.date_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.date_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.date_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.date_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.date_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.date_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.date_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.date_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.date_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b eql_v3.date_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date_eq, b eql_v3.date_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a eql_v3.date_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_eq. +--! @param a jsonb +--! @param b eql_v3.date_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.date_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/date/date_eq_operators.sql b/tests/codegen/reference/date/date_eq_operators.sql new file mode 100644 index 000000000..2ce55451c --- /dev/null +++ b/tests/codegen/reference/date/date_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/date/date_eq_functions.sql + +--! @file encrypted_domain/date/date_eq_operators.sql +--! @brief Operators for eql_v3.date_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.date_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.date_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.date_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.date_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.date_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.date_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq +); diff --git a/tests/codegen/reference/date/date_functions.sql b/tests/codegen/reference/date/date_functions.sql new file mode 100644 index 000000000..c363848a6 --- /dev/null +++ b/tests/codegen/reference/date/date_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/date/date_functions.sql +--! @brief Functions for eql_v3.date. + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.date) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param selector text +--! @return eql_v3.date +CREATE FUNCTION eql_v3."->"(a eql_v3.date, selector text) +RETURNS eql_v3.date IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param selector integer +--! @return eql_v3.date +CREATE FUNCTION eql_v3."->"(a eql_v3.date, selector integer) +RETURNS eql_v3.date IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param selector eql_v3.date +--! @return eql_v3.date +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.date) +RETURNS eql_v3.date IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param selector eql_v3.date +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.date) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.date, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.date, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.date, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.date, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.date, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.date, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.date, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.date, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b eql_v3.date +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date, b eql_v3.date) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a eql_v3.date +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date. +--! @param a jsonb +--! @param b eql_v3.date +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.date) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/date/date_operators.sql b/tests/codegen/reference/date/date_operators.sql new file mode 100644 index 000000000..989ebaa8c --- /dev/null +++ b/tests/codegen/reference/date/date_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/date/date_functions.sql + +--! @file encrypted_domain/date/date_operators.sql +--! @brief Operators for eql_v3.date. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.date, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.date, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.date, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.date, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.date, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.date, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.date, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.date, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.date +); diff --git a/tests/codegen/reference/date/date_ord_aggregates.sql b/tests/codegen/reference/date/date_ord_aggregates.sql new file mode 100644 index 000000000..bb29e742d --- /dev/null +++ b/tests/codegen/reference/date/date_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_functions.sql +-- REQUIRE: src/v3/scalars/date/date_ord_operators.sql + +--! @file encrypted_domain/date/date_ord_aggregates.sql +--! @brief Aggregates for eql_v3.date_ord. + +--! @brief State function for min on eql_v3.date_ord. +--! @param state eql_v3.date_ord +--! @param value eql_v3.date_ord +--! @return eql_v3.date_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.date_ord, value eql_v3.date_ord) +RETURNS eql_v3.date_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.date_ord. +--! @param input eql_v3.date_ord +--! @return eql_v3.date_ord +CREATE AGGREGATE eql_v3.min(eql_v3.date_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.date_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.date_ord. +--! @param state eql_v3.date_ord +--! @param value eql_v3.date_ord +--! @return eql_v3.date_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.date_ord, value eql_v3.date_ord) +RETURNS eql_v3.date_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.date_ord. +--! @param input eql_v3.date_ord +--! @return eql_v3.date_ord +CREATE AGGREGATE eql_v3.max(eql_v3.date_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.date_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/date/date_ord_functions.sql b/tests/codegen/reference/date/date_ord_functions.sql new file mode 100644 index 000000000..8c2adf487 --- /dev/null +++ b/tests/codegen/reference/date/date_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/date/date_ord_functions.sql +--! @brief Functions for eql_v3.date_ord. + +--! @brief Index extractor for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.date_ord) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.date_ord) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.date_ord) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.date_ord) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.date_ord) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.date_ord) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.date_ord) $$; + +--! @brief Operator wrapper for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.date_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.date_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param selector text +--! @return eql_v3.date_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.date_ord, selector text) +RETURNS eql_v3.date_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param selector integer +--! @return eql_v3.date_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.date_ord, selector integer) +RETURNS eql_v3.date_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a jsonb +--! @param selector eql_v3.date_ord +--! @return eql_v3.date_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.date_ord) +RETURNS eql_v3.date_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a jsonb +--! @param selector eql_v3.date_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.date_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.date_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.date_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.date_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.date_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.date_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.date_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.date_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.date_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b eql_v3.date_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date_ord, b eql_v3.date_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a eql_v3.date_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord. +--! @param a jsonb +--! @param b eql_v3.date_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.date_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/date/date_ord_operators.sql b/tests/codegen/reference/date/date_ord_operators.sql new file mode 100644 index 000000000..155a6d6d9 --- /dev/null +++ b/tests/codegen/reference/date/date_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_functions.sql + +--! @file encrypted_domain/date/date_ord_operators.sql +--! @brief Operators for eql_v3.date_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.date_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.date_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.date_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.date_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.date_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.date_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord +); diff --git a/tests/codegen/reference/date/date_ord_ore_aggregates.sql b/tests/codegen/reference/date/date_ord_ore_aggregates.sql new file mode 100644 index 000000000..6ae694277 --- /dev/null +++ b/tests/codegen/reference/date/date_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/date/date_ord_ore_operators.sql + +--! @file encrypted_domain/date/date_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.date_ord_ore. + +--! @brief State function for min on eql_v3.date_ord_ore. +--! @param state eql_v3.date_ord_ore +--! @param value eql_v3.date_ord_ore +--! @return eql_v3.date_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.date_ord_ore, value eql_v3.date_ord_ore) +RETURNS eql_v3.date_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.date_ord_ore. +--! @param input eql_v3.date_ord_ore +--! @return eql_v3.date_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.date_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.date_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.date_ord_ore. +--! @param state eql_v3.date_ord_ore +--! @param value eql_v3.date_ord_ore +--! @return eql_v3.date_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.date_ord_ore, value eql_v3.date_ord_ore) +RETURNS eql_v3.date_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.date_ord_ore. +--! @param input eql_v3.date_ord_ore +--! @return eql_v3.date_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.date_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.date_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/date/date_ord_ore_functions.sql b/tests/codegen/reference/date/date_ord_ore_functions.sql new file mode 100644 index 000000000..1fe590738 --- /dev/null +++ b/tests/codegen/reference/date/date_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/date/date_ord_ore_functions.sql +--! @brief Functions for eql_v3.date_ord_ore. + +--! @brief Index extractor for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.date_ord_ore) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.date_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.date_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.date_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.date_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.date_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.date_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.date_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.date_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param selector text +--! @return eql_v3.date_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.date_ord_ore, selector text) +RETURNS eql_v3.date_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param selector integer +--! @return eql_v3.date_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.date_ord_ore, selector integer) +RETURNS eql_v3.date_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.date_ord_ore +--! @return eql_v3.date_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.date_ord_ore) +RETURNS eql_v3.date_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.date_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.date_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.date_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.date_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.date_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.date_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.date_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.date_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.date_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.date_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.date_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.date_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b eql_v3.date_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a eql_v3.date_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.date_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.date_ord_ore. +--! @param a jsonb +--! @param b eql_v3.date_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.date_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/date/date_ord_ore_operators.sql b/tests/codegen/reference/date/date_ord_ore_operators.sql new file mode 100644 index 000000000..68dce80b1 --- /dev/null +++ b/tests/codegen/reference/date/date_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_ore_functions.sql + +--! @file encrypted_domain/date/date_ord_ore_operators.sql +--! @brief Operators for eql_v3.date_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore +); diff --git a/tests/codegen/reference/date/date_types.sql b/tests/codegen/reference/date/date_types.sql new file mode 100644 index 000000000..97a416d53 --- /dev/null +++ b/tests/codegen/reference/date/date_types.sql @@ -0,0 +1,73 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/date/date_types.sql +--! @brief Encrypted-domain types for date. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.date. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.date AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.date_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.date_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.date_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.date_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.date_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.date_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; diff --git a/tests/codegen/reference/int2/int2_eq_functions.sql b/tests/codegen/reference/int2/int2_eq_functions.sql new file mode 100644 index 000000000..6a90a191c --- /dev/null +++ b/tests/codegen/reference/int2/int2_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/int2/int2_eq_functions.sql +--! @brief Functions for eql_v3.int2_eq. + +--! @brief Index extractor for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.int2_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.int2_eq) $$; + +--! @brief Operator wrapper for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int2_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.int2_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.int2_eq) $$; + +--! @brief Operator wrapper for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int2_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.int2_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int2_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param selector text +--! @return eql_v3.int2_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.int2_eq, selector text) +RETURNS eql_v3.int2_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param selector integer +--! @return eql_v3.int2_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.int2_eq, selector integer) +RETURNS eql_v3.int2_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param selector eql_v3.int2_eq +--! @return eql_v3.int2_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int2_eq) +RETURNS eql_v3.int2_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param selector eql_v3.int2_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int2_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int2_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int2_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int2_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int2_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int2_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int2_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int2_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int2_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b eql_v3.int2_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2_eq, b eql_v3.int2_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a eql_v3.int2_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_eq. +--! @param a jsonb +--! @param b eql_v3.int2_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int2_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int2/int2_eq_operators.sql b/tests/codegen/reference/int2/int2_eq_operators.sql new file mode 100644 index 000000000..081f4d58c --- /dev/null +++ b/tests/codegen/reference/int2/int2_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/int2/int2_eq_functions.sql + +--! @file encrypted_domain/int2/int2_eq_operators.sql +--! @brief Operators for eql_v3.int2_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int2_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2_eq, RIGHTARG = eql_v3.int2_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_eq +); diff --git a/tests/codegen/reference/int2/int2_functions.sql b/tests/codegen/reference/int2/int2_functions.sql new file mode 100644 index 000000000..8b4600652 --- /dev/null +++ b/tests/codegen/reference/int2/int2_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/int2/int2_functions.sql +--! @brief Functions for eql_v3.int2. + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int2) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param selector text +--! @return eql_v3.int2 +CREATE FUNCTION eql_v3."->"(a eql_v3.int2, selector text) +RETURNS eql_v3.int2 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param selector integer +--! @return eql_v3.int2 +CREATE FUNCTION eql_v3."->"(a eql_v3.int2, selector integer) +RETURNS eql_v3.int2 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param selector eql_v3.int2 +--! @return eql_v3.int2 +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int2) +RETURNS eql_v3.int2 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param selector eql_v3.int2 +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int2) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int2, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int2, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int2, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int2, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int2, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int2, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int2, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int2, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b eql_v3.int2 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2, b eql_v3.int2) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a eql_v3.int2 +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2. +--! @param a jsonb +--! @param b eql_v3.int2 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int2) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int2/int2_operators.sql b/tests/codegen/reference/int2/int2_operators.sql new file mode 100644 index 000000000..bc0e7c8dd --- /dev/null +++ b/tests/codegen/reference/int2/int2_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/int2/int2_functions.sql + +--! @file encrypted_domain/int2/int2_operators.sql +--! @brief Operators for eql_v3.int2. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int2, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int2, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int2, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int2, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int2, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int2, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int2, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int2, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2, RIGHTARG = eql_v3.int2 +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2 +); diff --git a/tests/codegen/reference/int2/int2_ord_aggregates.sql b/tests/codegen/reference/int2/int2_ord_aggregates.sql new file mode 100644 index 000000000..41d0bb095 --- /dev/null +++ b/tests/codegen/reference/int2/int2_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/int2/int2_ord_functions.sql +-- REQUIRE: src/v3/scalars/int2/int2_ord_operators.sql + +--! @file encrypted_domain/int2/int2_ord_aggregates.sql +--! @brief Aggregates for eql_v3.int2_ord. + +--! @brief State function for min on eql_v3.int2_ord. +--! @param state eql_v3.int2_ord +--! @param value eql_v3.int2_ord +--! @return eql_v3.int2_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int2_ord, value eql_v3.int2_ord) +RETURNS eql_v3.int2_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.int2_ord. +--! @param input eql_v3.int2_ord +--! @return eql_v3.int2_ord +CREATE AGGREGATE eql_v3.min(eql_v3.int2_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.int2_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.int2_ord. +--! @param state eql_v3.int2_ord +--! @param value eql_v3.int2_ord +--! @return eql_v3.int2_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int2_ord, value eql_v3.int2_ord) +RETURNS eql_v3.int2_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.int2_ord. +--! @param input eql_v3.int2_ord +--! @return eql_v3.int2_ord +CREATE AGGREGATE eql_v3.max(eql_v3.int2_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.int2_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/int2/int2_ord_functions.sql b/tests/codegen/reference/int2/int2_ord_functions.sql new file mode 100644 index 000000000..58c977d2d --- /dev/null +++ b/tests/codegen/reference/int2/int2_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/int2/int2_ord_functions.sql +--! @brief Functions for eql_v3.int2_ord. + +--! @brief Index extractor for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.int2_ord) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int2_ord) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int2_ord) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int2_ord) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int2_ord) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int2_ord) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int2_ord) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int2_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int2_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int2_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param selector text +--! @return eql_v3.int2_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.int2_ord, selector text) +RETURNS eql_v3.int2_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param selector integer +--! @return eql_v3.int2_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.int2_ord, selector integer) +RETURNS eql_v3.int2_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a jsonb +--! @param selector eql_v3.int2_ord +--! @return eql_v3.int2_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int2_ord) +RETURNS eql_v3.int2_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a jsonb +--! @param selector eql_v3.int2_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int2_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int2_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int2_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int2_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int2_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int2_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int2_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int2_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int2_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b eql_v3.int2_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2_ord, b eql_v3.int2_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a eql_v3.int2_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord. +--! @param a jsonb +--! @param b eql_v3.int2_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int2_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int2/int2_ord_operators.sql b/tests/codegen/reference/int2/int2_ord_operators.sql new file mode 100644 index 000000000..4724cc23e --- /dev/null +++ b/tests/codegen/reference/int2/int2_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/int2/int2_ord_functions.sql + +--! @file encrypted_domain/int2/int2_ord_operators.sql +--! @brief Operators for eql_v3.int2_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int2_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2_ord, RIGHTARG = eql_v3.int2_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord +); diff --git a/tests/codegen/reference/int2/int2_ord_ore_aggregates.sql b/tests/codegen/reference/int2/int2_ord_ore_aggregates.sql new file mode 100644 index 000000000..ac4fd28cb --- /dev/null +++ b/tests/codegen/reference/int2/int2_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/int2/int2_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/int2/int2_ord_ore_operators.sql + +--! @file encrypted_domain/int2/int2_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.int2_ord_ore. + +--! @brief State function for min on eql_v3.int2_ord_ore. +--! @param state eql_v3.int2_ord_ore +--! @param value eql_v3.int2_ord_ore +--! @return eql_v3.int2_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int2_ord_ore, value eql_v3.int2_ord_ore) +RETURNS eql_v3.int2_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.int2_ord_ore. +--! @param input eql_v3.int2_ord_ore +--! @return eql_v3.int2_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.int2_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.int2_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.int2_ord_ore. +--! @param state eql_v3.int2_ord_ore +--! @param value eql_v3.int2_ord_ore +--! @return eql_v3.int2_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int2_ord_ore, value eql_v3.int2_ord_ore) +RETURNS eql_v3.int2_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.int2_ord_ore. +--! @param input eql_v3.int2_ord_ore +--! @return eql_v3.int2_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.int2_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.int2_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/int2/int2_ord_ore_functions.sql b/tests/codegen/reference/int2/int2_ord_ore_functions.sql new file mode 100644 index 000000000..ab200402a --- /dev/null +++ b/tests/codegen/reference/int2/int2_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/int2/int2_ord_ore_functions.sql +--! @brief Functions for eql_v3.int2_ord_ore. + +--! @brief Index extractor for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.int2_ord_ore) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int2_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int2_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int2_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int2_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int2_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int2_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int2_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int2_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int2_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param selector text +--! @return eql_v3.int2_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.int2_ord_ore, selector text) +RETURNS eql_v3.int2_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param selector integer +--! @return eql_v3.int2_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.int2_ord_ore, selector integer) +RETURNS eql_v3.int2_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.int2_ord_ore +--! @return eql_v3.int2_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int2_ord_ore) +RETURNS eql_v3.int2_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int2_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.int2_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int2_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int2_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int2_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int2_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int2_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int2_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int2_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int2_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int2_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int2_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b eql_v3.int2_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a eql_v3.int2_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int2_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int2_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int2_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int2_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int2_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int2/int2_ord_ore_operators.sql b/tests/codegen/reference/int2/int2_ord_ore_operators.sql new file mode 100644 index 000000000..ac9ffd947 --- /dev/null +++ b/tests/codegen/reference/int2/int2_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int2/int2_types.sql +-- REQUIRE: src/v3/scalars/int2/int2_ord_ore_functions.sql + +--! @file encrypted_domain/int2/int2_ord_ore_operators.sql +--! @brief Operators for eql_v3.int2_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = eql_v3.int2_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int2_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int2_ord_ore +); diff --git a/tests/codegen/reference/int2/int2_types.sql b/tests/codegen/reference/int2/int2_types.sql new file mode 100644 index 000000000..ee11a9610 --- /dev/null +++ b/tests/codegen/reference/int2/int2_types.sql @@ -0,0 +1,73 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/int2/int2_types.sql +--! @brief Encrypted-domain types for int2. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.int2. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int2' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int2 AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.int2_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int2_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int2_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.int2_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int2_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int2_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.int2_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int2_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int2_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; diff --git a/tests/codegen/reference/int8/int8_eq_functions.sql b/tests/codegen/reference/int8/int8_eq_functions.sql new file mode 100644 index 000000000..bd8c8642c --- /dev/null +++ b/tests/codegen/reference/int8/int8_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/int8/int8_eq_functions.sql +--! @brief Functions for eql_v3.int8_eq. + +--! @brief Index extractor for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.int8_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.int8_eq) $$; + +--! @brief Operator wrapper for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.int8_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.int8_eq) $$; + +--! @brief Operator wrapper for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.int8_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param selector text +--! @return eql_v3.int8_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.int8_eq, selector text) +RETURNS eql_v3.int8_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param selector integer +--! @return eql_v3.int8_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.int8_eq, selector integer) +RETURNS eql_v3.int8_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param selector eql_v3.int8_eq +--! @return eql_v3.int8_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int8_eq) +RETURNS eql_v3.int8_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param selector eql_v3.int8_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int8_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int8_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int8_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int8_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int8_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int8_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int8_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int8_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int8_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b eql_v3.int8_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8_eq, b eql_v3.int8_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a eql_v3.int8_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_eq. +--! @param a jsonb +--! @param b eql_v3.int8_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int8_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int8/int8_eq_operators.sql b/tests/codegen/reference/int8/int8_eq_operators.sql new file mode 100644 index 000000000..2f964d251 --- /dev/null +++ b/tests/codegen/reference/int8/int8_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/int8/int8_eq_functions.sql + +--! @file encrypted_domain/int8/int8_eq_operators.sql +--! @brief Operators for eql_v3.int8_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8_eq, RIGHTARG = eql_v3.int8_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_eq +); diff --git a/tests/codegen/reference/int8/int8_functions.sql b/tests/codegen/reference/int8/int8_functions.sql new file mode 100644 index 000000000..81604c9a4 --- /dev/null +++ b/tests/codegen/reference/int8/int8_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/int8/int8_functions.sql +--! @brief Functions for eql_v3.int8. + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param selector text +--! @return eql_v3.int8 +CREATE FUNCTION eql_v3."->"(a eql_v3.int8, selector text) +RETURNS eql_v3.int8 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param selector integer +--! @return eql_v3.int8 +CREATE FUNCTION eql_v3."->"(a eql_v3.int8, selector integer) +RETURNS eql_v3.int8 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param selector eql_v3.int8 +--! @return eql_v3.int8 +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int8) +RETURNS eql_v3.int8 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param selector eql_v3.int8 +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int8) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int8, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int8, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int8, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int8, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int8, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int8, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int8, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int8, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b eql_v3.int8 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8, b eql_v3.int8) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a eql_v3.int8 +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8. +--! @param a jsonb +--! @param b eql_v3.int8 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int8) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int8/int8_operators.sql b/tests/codegen/reference/int8/int8_operators.sql new file mode 100644 index 000000000..00f719277 --- /dev/null +++ b/tests/codegen/reference/int8/int8_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/int8/int8_functions.sql + +--! @file encrypted_domain/int8/int8_operators.sql +--! @brief Operators for eql_v3.int8. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int8, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int8, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int8, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int8, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int8, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int8, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int8, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int8, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8, RIGHTARG = eql_v3.int8 +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8 +); diff --git a/tests/codegen/reference/int8/int8_ord_aggregates.sql b/tests/codegen/reference/int8/int8_ord_aggregates.sql new file mode 100644 index 000000000..12cc456c4 --- /dev/null +++ b/tests/codegen/reference/int8/int8_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/int8/int8_ord_functions.sql +-- REQUIRE: src/v3/scalars/int8/int8_ord_operators.sql + +--! @file encrypted_domain/int8/int8_ord_aggregates.sql +--! @brief Aggregates for eql_v3.int8_ord. + +--! @brief State function for min on eql_v3.int8_ord. +--! @param state eql_v3.int8_ord +--! @param value eql_v3.int8_ord +--! @return eql_v3.int8_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int8_ord, value eql_v3.int8_ord) +RETURNS eql_v3.int8_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.int8_ord. +--! @param input eql_v3.int8_ord +--! @return eql_v3.int8_ord +CREATE AGGREGATE eql_v3.min(eql_v3.int8_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.int8_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.int8_ord. +--! @param state eql_v3.int8_ord +--! @param value eql_v3.int8_ord +--! @return eql_v3.int8_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int8_ord, value eql_v3.int8_ord) +RETURNS eql_v3.int8_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.int8_ord. +--! @param input eql_v3.int8_ord +--! @return eql_v3.int8_ord +CREATE AGGREGATE eql_v3.max(eql_v3.int8_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.int8_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/int8/int8_ord_functions.sql b/tests/codegen/reference/int8/int8_ord_functions.sql new file mode 100644 index 000000000..109dcd2b8 --- /dev/null +++ b/tests/codegen/reference/int8/int8_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/int8/int8_ord_functions.sql +--! @brief Functions for eql_v3.int8_ord. + +--! @brief Index extractor for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.int8_ord) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int8_ord) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int8_ord) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int8_ord) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int8_ord) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int8_ord) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int8_ord) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param selector text +--! @return eql_v3.int8_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.int8_ord, selector text) +RETURNS eql_v3.int8_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param selector integer +--! @return eql_v3.int8_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.int8_ord, selector integer) +RETURNS eql_v3.int8_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a jsonb +--! @param selector eql_v3.int8_ord +--! @return eql_v3.int8_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int8_ord) +RETURNS eql_v3.int8_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a jsonb +--! @param selector eql_v3.int8_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int8_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int8_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int8_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int8_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int8_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int8_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int8_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int8_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int8_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b eql_v3.int8_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8_ord, b eql_v3.int8_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a eql_v3.int8_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord. +--! @param a jsonb +--! @param b eql_v3.int8_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int8_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int8/int8_ord_operators.sql b/tests/codegen/reference/int8/int8_ord_operators.sql new file mode 100644 index 000000000..336a1c3de --- /dev/null +++ b/tests/codegen/reference/int8/int8_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/int8/int8_ord_functions.sql + +--! @file encrypted_domain/int8/int8_ord_operators.sql +--! @brief Operators for eql_v3.int8_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8_ord, RIGHTARG = eql_v3.int8_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord +); diff --git a/tests/codegen/reference/int8/int8_ord_ore_aggregates.sql b/tests/codegen/reference/int8/int8_ord_ore_aggregates.sql new file mode 100644 index 000000000..8612be81f --- /dev/null +++ b/tests/codegen/reference/int8/int8_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/int8/int8_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/int8/int8_ord_ore_operators.sql + +--! @file encrypted_domain/int8/int8_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.int8_ord_ore. + +--! @brief State function for min on eql_v3.int8_ord_ore. +--! @param state eql_v3.int8_ord_ore +--! @param value eql_v3.int8_ord_ore +--! @return eql_v3.int8_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.int8_ord_ore, value eql_v3.int8_ord_ore) +RETURNS eql_v3.int8_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.int8_ord_ore. +--! @param input eql_v3.int8_ord_ore +--! @return eql_v3.int8_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.int8_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.int8_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.int8_ord_ore. +--! @param state eql_v3.int8_ord_ore +--! @param value eql_v3.int8_ord_ore +--! @return eql_v3.int8_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.int8_ord_ore, value eql_v3.int8_ord_ore) +RETURNS eql_v3.int8_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.int8_ord_ore. +--! @param input eql_v3.int8_ord_ore +--! @return eql_v3.int8_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.int8_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.int8_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/int8/int8_ord_ore_functions.sql b/tests/codegen/reference/int8/int8_ord_ore_functions.sql new file mode 100644 index 000000000..dd413fce6 --- /dev/null +++ b/tests/codegen/reference/int8/int8_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/int8/int8_ord_ore_functions.sql +--! @brief Functions for eql_v3.int8_ord_ore. + +--! @brief Index extractor for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.int8_ord_ore) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.int8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.int8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.int8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.int8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.int8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.int8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.int8_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.int8_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.int8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param selector text +--! @return eql_v3.int8_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.int8_ord_ore, selector text) +RETURNS eql_v3.int8_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param selector integer +--! @return eql_v3.int8_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.int8_ord_ore, selector integer) +RETURNS eql_v3.int8_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.int8_ord_ore +--! @return eql_v3.int8_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.int8_ord_ore) +RETURNS eql_v3.int8_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.int8_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.int8_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.int8_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.int8_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.int8_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.int8_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.int8_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.int8_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.int8_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.int8_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.int8_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.int8_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b eql_v3.int8_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a eql_v3.int8_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.int8_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.int8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.int8_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.int8_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.int8_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/int8/int8_ord_ore_operators.sql b/tests/codegen/reference/int8/int8_ord_ore_operators.sql new file mode 100644 index 000000000..b845984d5 --- /dev/null +++ b/tests/codegen/reference/int8/int8_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/int8/int8_types.sql +-- REQUIRE: src/v3/scalars/int8/int8_ord_ore_functions.sql + +--! @file encrypted_domain/int8/int8_ord_ore_operators.sql +--! @brief Operators for eql_v3.int8_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = eql_v3.int8_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.int8_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.int8_ord_ore +); diff --git a/tests/codegen/reference/int8/int8_types.sql b/tests/codegen/reference/int8/int8_types.sql new file mode 100644 index 000000000..321ff3403 --- /dev/null +++ b/tests/codegen/reference/int8/int8_types.sql @@ -0,0 +1,73 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/int8/int8_types.sql +--! @brief Encrypted-domain types for int8. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.int8. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int8' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int8 AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.int8_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int8_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int8_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.int8_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int8_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int8_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.int8_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'int8_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.int8_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; diff --git a/tests/codegen/reference/text/text_eq_functions.sql b/tests/codegen/reference/text/text_eq_functions.sql new file mode 100644 index 000000000..9833c6da0 --- /dev/null +++ b/tests/codegen/reference/text/text_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/text/text_eq_functions.sql +--! @brief Functions for eql_v3.text_eq. + +--! @brief Index extractor for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_eq) $$; + +--! @brief Operator wrapper for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_eq) $$; + +--! @brief Operator wrapper for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param selector text +--! @return eql_v3.text_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.text_eq, selector text) +RETURNS eql_v3.text_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param selector integer +--! @return eql_v3.text_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.text_eq, selector integer) +RETURNS eql_v3.text_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param selector eql_v3.text_eq +--! @return eql_v3.text_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.text_eq) +RETURNS eql_v3.text_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param selector eql_v3.text_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.text_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.text_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.text_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.text_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.text_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.text_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.text_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.text_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.text_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b eql_v3.text_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_eq, b eql_v3.text_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a eql_v3.text_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_eq. +--! @param a jsonb +--! @param b eql_v3.text_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.text_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/text/text_eq_operators.sql b/tests/codegen/reference/text/text_eq_operators.sql new file mode 100644 index 000000000..0f789a750 --- /dev/null +++ b/tests/codegen/reference/text/text_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_eq_functions.sql + +--! @file encrypted_domain/text/text_eq_operators.sql +--! @brief Operators for eql_v3.text_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.text_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.text_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.text_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.text_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.text_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.text_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq +); diff --git a/tests/codegen/reference/text/text_functions.sql b/tests/codegen/reference/text/text_functions.sql new file mode 100644 index 000000000..96097a34b --- /dev/null +++ b/tests/codegen/reference/text/text_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/text/text_functions.sql +--! @brief Functions for eql_v3.text. + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param selector text +--! @return eql_v3.text +CREATE FUNCTION eql_v3."->"(a eql_v3.text, selector text) +RETURNS eql_v3.text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param selector integer +--! @return eql_v3.text +CREATE FUNCTION eql_v3."->"(a eql_v3.text, selector integer) +RETURNS eql_v3.text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param selector eql_v3.text +--! @return eql_v3.text +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.text) +RETURNS eql_v3.text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param selector eql_v3.text +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.text, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.text, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.text, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.text, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.text, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.text, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.text, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.text, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b eql_v3.text +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text, b eql_v3.text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a eql_v3.text +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text. +--! @param a jsonb +--! @param b eql_v3.text +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/text/text_match_functions.sql b/tests/codegen/reference/text/text_match_functions.sql new file mode 100644 index 000000000..3c0b2e99a --- /dev/null +++ b/tests/codegen/reference/text/text_match_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/bloom_filter/functions.sql + +--! @file encrypted_domain/text/text_match_functions.sql +--! @brief Functions for eql_v3.text_match. + +--! @brief Index extractor for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @return eql_v3.bloom_filter +CREATE FUNCTION eql_v3.match_term(a eql_v3.text_match) +RETURNS eql_v3.bloom_filter +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.bloom_filter(a::jsonb) $$; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_match, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_match, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_match, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_match, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_match, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_match, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_match) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Operator wrapper for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_match, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::eql_v3.text_match) $$; + +--! @brief Operator wrapper for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text_match) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a::eql_v3.text_match) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_match, b eql_v3.text_match) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_match, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::eql_v3.text_match) $$; + +--! @brief Operator wrapper for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text_match) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a::eql_v3.text_match) <@ eql_v3.match_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param selector text +--! @return eql_v3.text_match +CREATE FUNCTION eql_v3."->"(a eql_v3.text_match, selector text) +RETURNS eql_v3.text_match IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param selector integer +--! @return eql_v3.text_match +CREATE FUNCTION eql_v3."->"(a eql_v3.text_match, selector integer) +RETURNS eql_v3.text_match IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param selector eql_v3.text_match +--! @return eql_v3.text_match +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.text_match) +RETURNS eql_v3.text_match IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_match, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_match, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param selector eql_v3.text_match +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.text_match) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.text_match, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.text_match, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.text_match, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.text_match, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.text_match, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.text_match, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.text_match, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_match, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_match, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_match, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.text_match, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b eql_v3.text_match +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_match, b eql_v3.text_match) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a eql_v3.text_match +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_match, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_match. +--! @param a jsonb +--! @param b eql_v3.text_match +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.text_match) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_match'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/text/text_match_operators.sql b/tests/codegen/reference/text/text_match_operators.sql new file mode 100644 index 000000000..5edebe855 --- /dev/null +++ b/tests/codegen/reference/text/text_match_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_match_functions.sql + +--! @file encrypted_domain/text/text_match_operators.sql +--! @brief Operators for eql_v3.text_match. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_match, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_match, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_match, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_match, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.text_match, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.text_match, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.text_match, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.text_match, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.text_match, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.text_match, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.text_match, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_match, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_match, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_match, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.text_match, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_match, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_match +); diff --git a/tests/codegen/reference/text/text_operators.sql b/tests/codegen/reference/text/text_operators.sql new file mode 100644 index 000000000..9d4b77136 --- /dev/null +++ b/tests/codegen/reference/text/text_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_functions.sql + +--! @file encrypted_domain/text/text_operators.sql +--! @brief Operators for eql_v3.text. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.text, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.text, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.text, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.text, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.text, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.text, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.text, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.text, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.text +); diff --git a/tests/codegen/reference/text/text_ord_aggregates.sql b/tests/codegen/reference/text/text_ord_aggregates.sql new file mode 100644 index 000000000..e04db3778 --- /dev/null +++ b/tests/codegen/reference/text/text_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_functions.sql +-- REQUIRE: src/v3/scalars/text/text_ord_operators.sql + +--! @file encrypted_domain/text/text_ord_aggregates.sql +--! @brief Aggregates for eql_v3.text_ord. + +--! @brief State function for min on eql_v3.text_ord. +--! @param state eql_v3.text_ord +--! @param value eql_v3.text_ord +--! @return eql_v3.text_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.text_ord, value eql_v3.text_ord) +RETURNS eql_v3.text_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.text_ord. +--! @param input eql_v3.text_ord +--! @return eql_v3.text_ord +CREATE AGGREGATE eql_v3.min(eql_v3.text_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.text_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.text_ord. +--! @param state eql_v3.text_ord +--! @param value eql_v3.text_ord +--! @return eql_v3.text_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.text_ord, value eql_v3.text_ord) +RETURNS eql_v3.text_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.text_ord. +--! @param input eql_v3.text_ord +--! @return eql_v3.text_ord +CREATE AGGREGATE eql_v3.max(eql_v3.text_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.text_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/text/text_ord_functions.sql b/tests/codegen/reference/text/text_ord_functions.sql new file mode 100644 index 000000000..7bd872fc0 --- /dev/null +++ b/tests/codegen/reference/text/text_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/text/text_ord_functions.sql +--! @brief Functions for eql_v3.text_ord. + +--! @brief Index extractor for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_ord) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.text_ord) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.text_ord) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.text_ord) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.text_ord) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.text_ord) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.text_ord) $$; + +--! @brief Operator wrapper for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param selector text +--! @return eql_v3.text_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.text_ord, selector text) +RETURNS eql_v3.text_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param selector integer +--! @return eql_v3.text_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.text_ord, selector integer) +RETURNS eql_v3.text_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a jsonb +--! @param selector eql_v3.text_ord +--! @return eql_v3.text_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.text_ord) +RETURNS eql_v3.text_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a jsonb +--! @param selector eql_v3.text_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.text_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.text_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.text_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.text_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.text_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.text_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.text_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.text_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.text_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b eql_v3.text_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_ord, b eql_v3.text_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord. +--! @param a jsonb +--! @param b eql_v3.text_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.text_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/text/text_ord_operators.sql b/tests/codegen/reference/text/text_ord_operators.sql new file mode 100644 index 000000000..085672b3e --- /dev/null +++ b/tests/codegen/reference/text/text_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_functions.sql + +--! @file encrypted_domain/text/text_ord_operators.sql +--! @brief Operators for eql_v3.text_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.text_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.text_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.text_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.text_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.text_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.text_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord +); diff --git a/tests/codegen/reference/text/text_ord_ore_aggregates.sql b/tests/codegen/reference/text/text_ord_ore_aggregates.sql new file mode 100644 index 000000000..c8d5884e2 --- /dev/null +++ b/tests/codegen/reference/text/text_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/text/text_ord_ore_operators.sql + +--! @file encrypted_domain/text/text_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.text_ord_ore. + +--! @brief State function for min on eql_v3.text_ord_ore. +--! @param state eql_v3.text_ord_ore +--! @param value eql_v3.text_ord_ore +--! @return eql_v3.text_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.text_ord_ore, value eql_v3.text_ord_ore) +RETURNS eql_v3.text_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.text_ord_ore. +--! @param input eql_v3.text_ord_ore +--! @return eql_v3.text_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.text_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.text_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.text_ord_ore. +--! @param state eql_v3.text_ord_ore +--! @param value eql_v3.text_ord_ore +--! @return eql_v3.text_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.text_ord_ore, value eql_v3.text_ord_ore) +RETURNS eql_v3.text_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.text_ord_ore. +--! @param input eql_v3.text_ord_ore +--! @return eql_v3.text_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.text_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.text_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/text/text_ord_ore_functions.sql b/tests/codegen/reference/text/text_ord_ore_functions.sql new file mode 100644 index 000000000..f1353486e --- /dev/null +++ b/tests/codegen/reference/text/text_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql + +--! @file encrypted_domain/text/text_ord_ore_functions.sql +--! @brief Functions for eql_v3.text_ord_ore. + +--! @brief Index extractor for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_ord_ore) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param selector text +--! @return eql_v3.text_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.text_ord_ore, selector text) +RETURNS eql_v3.text_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param selector integer +--! @return eql_v3.text_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.text_ord_ore, selector integer) +RETURNS eql_v3.text_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.text_ord_ore +--! @return eql_v3.text_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.text_ord_ore) +RETURNS eql_v3.text_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.text_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.text_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.text_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.text_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.text_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.text_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.text_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.text_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.text_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.text_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b eql_v3.text_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_ord_ore. +--! @param a jsonb +--! @param b eql_v3.text_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.text_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/text/text_ord_ore_operators.sql b/tests/codegen/reference/text/text_ord_ore_operators.sql new file mode 100644 index 000000000..4ed500adf --- /dev/null +++ b/tests/codegen/reference/text/text_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_ore_functions.sql + +--! @file encrypted_domain/text/text_ord_ore_operators.sql +--! @brief Operators for eql_v3.text_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore +); diff --git a/tests/codegen/reference/text/text_types.sql b/tests/codegen/reference/text/text_types.sql new file mode 100644 index 000000000..e0043d823 --- /dev/null +++ b/tests/codegen/reference/text/text_types.sql @@ -0,0 +1,89 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/text/text_types.sql +--! @brief Encrypted-domain types for text. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.text. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.text AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.text_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.text_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.text_match. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_match' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.text_match AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'bf' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.text_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.text_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.text_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.text_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; diff --git a/tests/codegen/reference/timestamptz/timestamptz_eq_functions.sql b/tests/codegen/reference/timestamptz/timestamptz_eq_functions.sql new file mode 100644 index 000000000..a1877c168 --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/timestamptz/timestamptz_eq_functions.sql +--! @brief Functions for eql_v3.timestamptz_eq. + +--! @brief Index extractor for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.timestamptz_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.timestamptz_eq) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.timestamptz_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.timestamptz_eq) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.timestamptz_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.timestamptz_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param selector text +--! @return eql_v3.timestamptz_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz_eq, selector text) +RETURNS eql_v3.timestamptz_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param selector integer +--! @return eql_v3.timestamptz_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz_eq, selector integer) +RETURNS eql_v3.timestamptz_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param selector eql_v3.timestamptz_eq +--! @return eql_v3.timestamptz_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.timestamptz_eq) +RETURNS eql_v3.timestamptz_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param selector eql_v3.timestamptz_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.timestamptz_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.timestamptz_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.timestamptz_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.timestamptz_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.timestamptz_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.timestamptz_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.timestamptz_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.timestamptz_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.timestamptz_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b eql_v3.timestamptz_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz_eq, b eql_v3.timestamptz_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a eql_v3.timestamptz_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_eq. +--! @param a jsonb +--! @param b eql_v3.timestamptz_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.timestamptz_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/timestamptz/timestamptz_eq_operators.sql b/tests/codegen/reference/timestamptz/timestamptz_eq_operators.sql new file mode 100644 index 000000000..922e1ec82 --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_eq_functions.sql + +--! @file encrypted_domain/timestamptz/timestamptz_eq_operators.sql +--! @brief Operators for eql_v3.timestamptz_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = eql_v3.timestamptz_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_eq +); diff --git a/tests/codegen/reference/timestamptz/timestamptz_functions.sql b/tests/codegen/reference/timestamptz/timestamptz_functions.sql new file mode 100644 index 000000000..e7a81ef1c --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/timestamptz/timestamptz_functions.sql +--! @brief Functions for eql_v3.timestamptz. + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.timestamptz) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param selector text +--! @return eql_v3.timestamptz +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz, selector text) +RETURNS eql_v3.timestamptz IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param selector integer +--! @return eql_v3.timestamptz +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz, selector integer) +RETURNS eql_v3.timestamptz IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param selector eql_v3.timestamptz +--! @return eql_v3.timestamptz +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.timestamptz) +RETURNS eql_v3.timestamptz IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param selector eql_v3.timestamptz +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.timestamptz) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.timestamptz, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.timestamptz, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.timestamptz, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.timestamptz, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.timestamptz, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.timestamptz, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.timestamptz, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.timestamptz, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b eql_v3.timestamptz +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz, b eql_v3.timestamptz) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a eql_v3.timestamptz +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz. +--! @param a jsonb +--! @param b eql_v3.timestamptz +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.timestamptz) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/timestamptz/timestamptz_operators.sql b/tests/codegen/reference/timestamptz/timestamptz_operators.sql new file mode 100644 index 000000000..64532757c --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_functions.sql + +--! @file encrypted_domain/timestamptz/timestamptz_operators.sql +--! @brief Operators for eql_v3.timestamptz. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.timestamptz, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz, RIGHTARG = eql_v3.timestamptz +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz +); diff --git a/tests/codegen/reference/timestamptz/timestamptz_types.sql b/tests/codegen/reference/timestamptz/timestamptz_types.sql new file mode 100644 index 000000000..61445e873 --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_types.sql @@ -0,0 +1,41 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/timestamptz/timestamptz_types.sql +--! @brief Encrypted-domain types for timestamptz. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.timestamptz. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamptz' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.timestamptz AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.timestamptz_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamptz_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.timestamptz_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; From d8942c27c5f2fc996d40634c7e7626ca400444b6 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 10 Jun 2026 18:06:58 +1000 Subject: [PATCH 129/599] refactor(v3): address code-review findings across eql-codegen/eql-scalars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Acts on the three-agent code review of the v3 scalar codegen crates (quality, idiomatic-Rust, test coverage). No user-facing behaviour change: generated SQL is byte-identical (parity gate green, no churn in release/ or src/). Parity gate (the High findings): - Commit goldens for every catalog type (int2/int8/date/timestamptz/ text), generated once, not just int4 — catches regressions in the eq-only and Bloom text_match render shapes int4 never exercises. - Parity tests discover reference dirs dynamically and cross-check the set against CATALOG (reference_dirs_match_catalog_tokens); shell gate loops every dir. - Add a determinism test (two runs byte-identical) and an extractor_terms dedup unit test. Type-system seams: - Introduce Role enum; is_ord_capable compares == Role::Ord instead of a stringly-typed "ord" (a typo can no longer disable aggregate codegen). - wrapper_entry/unsupported_entry take &Operator (no per-signature re-scan); add a should_panic guard for operator() on unknown symbols. Dead code / consolidation / errors: - Delete unused Fixture::render_literal; collapse three token+suffix impls into DomainSpec::name_with_token; move extractor_terms into eql-scalars; WriteError derives std::error::Error via thiserror; ScalarKind::rust_type panics on the no-surface numeric/jsonb arms. Coverage + low cleanup: - Tests for WriteError::Io and the commute_op/expected_forward panic guards; commit matrix_tests_eq_only.txt and pin the eq-only derivation. - Shared eql_codegen::repo_root; Drop-cleaned parity tempdir; const AUTO_GENERATED_MARKER; ScalarKind::is_text; doc/comment fixes. --- Cargo.lock | 1 + crates/eql-codegen/Cargo.toml | 1 + crates/eql-codegen/src/consts.rs | 17 +- crates/eql-codegen/src/context.rs | 33 +-- crates/eql-codegen/src/generate.rs | 151 ++++------- crates/eql-codegen/src/lib.rs | 23 +- crates/eql-codegen/src/main.rs | 13 +- crates/eql-codegen/src/operator_surface.rs | 13 + crates/eql-codegen/src/writer.rs | 47 ++-- crates/eql-codegen/tests/parity.rs | 243 ++++++++++++------ crates/eql-scalars/src/fixture.rs | 34 +-- crates/eql-scalars/src/kind.rs | 23 +- crates/eql-scalars/src/lib.rs | 29 ++- crates/eql-scalars/src/spec.rs | 12 +- crates/eql-scalars/src/term.rs | 35 ++- crates/eql-scalars/src/tests.rs | 113 ++++---- crates/eql-tests-macros/src/lib.rs | 2 +- .../adding-a-scalar-encrypted-domain-type.md | 49 ++-- mise.toml | 14 + tasks/codegen-parity.sh | 73 +++--- tests/codegen/reference/README.md | 28 +- tests/sqlx/snapshots/README.md | 21 +- tests/sqlx/snapshots/matrix_tests_eq_only.txt | 51 ++++ tests/sqlx/src/scalar_domains.rs | 31 +++ 24 files changed, 634 insertions(+), 423 deletions(-) create mode 100644 tests/sqlx/snapshots/matrix_tests_eq_only.txt diff --git a/Cargo.lock b/Cargo.lock index 20adc3229..54be696d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1162,6 +1162,7 @@ dependencies = [ "eql-scalars", "minijinja", "serde", + "thiserror 2.0.18", ] [[package]] diff --git a/crates/eql-codegen/Cargo.toml b/crates/eql-codegen/Cargo.toml index 251653972..b384c977e 100644 --- a/crates/eql-codegen/Cargo.toml +++ b/crates/eql-codegen/Cargo.toml @@ -8,6 +8,7 @@ publish = false eql-scalars = { path = "../eql-scalars" } minijinja = "2" serde = { version = "1", features = ["derive"] } +thiserror = "2" [[bin]] name = "eql-codegen" diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 9266882f5..16d627782 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -1,7 +1,15 @@ //! AUTO-GENERATED headers, schema constants, and SQL-string escaping. -/// SQL generated-file marker. The SQL templates emit this as their first line; -/// the writer uses it only to recognise files it owns (overwrite/clean safety). +/// SQL generated-file marker — the header's first line, with no trailing +/// newline. The writer uses it to recognise files it owns (overwrite/clean +/// safety) without re-splitting the header on every call. +pub(crate) const AUTO_GENERATED_MARKER: &str = "-- AUTOMATICALLY GENERATED FILE."; + +/// SQL generated-file header (marker + newline). The SQL templates emit this as +/// their first line; production code recognises files via [`AUTO_GENERATED_MARKER`], +/// so this full-header const is only needed by tests that synthesise file bodies. +/// Kept in lockstep with the marker by `header_is_marker_plus_newline`. +#[cfg(test)] pub(crate) const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE.\n"; /// The single schema housing the self-contained `eql_v3` surface: the @@ -35,6 +43,11 @@ mod tests { assert!(AUTO_GENERATED_HEADER.contains("AUTOMATICALLY GENERATED FILE")); } + #[test] + fn header_is_marker_plus_newline() { + assert_eq!(AUTO_GENERATED_HEADER, format!("{AUTO_GENERATED_MARKER}\n")); + } + #[test] fn sql_str_doubles_single_quotes() { assert_eq!(sql_str("o'brien"), "o''brien"); diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 4581bfa48..857622a3f 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -2,7 +2,7 @@ use crate::consts::*; use crate::operator_surface::Operator; -use eql_scalars::{DomainSpec, Term}; +use eql_scalars::{DomainSpec, Role, Term}; /// Build the minijinja environment with the embedded templates: one whole-file /// template per output file (`types`/`functions`/`operators`/`aggregates`) plus @@ -70,7 +70,7 @@ pub struct TypesContext { /// Build the per-domain block data (port of `render_domain_block`'s value logic, /// minus comment prose and the CHECK skeleton — those are template-resident). pub fn domain_block(token: &str, domain: &DomainSpec) -> DomainBlock { - let name = full_domain_name(token, domain.suffix); + let name = domain.name_with_token(token); let mut keys: Vec = ENVELOPE_KEYS.iter().map(|k| sql_str(k)).collect(); for k in Term::term_json_keys(domain.terms) { @@ -101,7 +101,7 @@ pub struct SqlParam { #[serde(tag = "kind")] pub enum FnEntry { Extractor { - ret: String, // e.g. eql_v2.hmac_256 (selection STAYS in Rust) + ret: String, // e.g. eql_v3.hmac_256 (selection STAYS in Rust) extractor: String, // e.g. eq_term ctor: String, // e.g. hmac_256 (called as {{ schema }}.{{ ctor }}) }, @@ -145,12 +145,12 @@ pub fn extractor_entry(term: Term) -> FnEntry { } /// Build an inlinable comparison-wrapper entry for a supported operator. -/// `dom` is the schema-qualified domain name. -pub fn wrapper_entry(dom: &str, op: &str, arg_a: &str, arg_b: &str, extractor: &str) -> FnEntry { - use crate::operator_surface::operator_function_name; +/// `dom` is the schema-qualified domain name; `op` is the already-resolved +/// operator (the caller iterates `OPERATORS`, so no symbol re-lookup is needed). +pub fn wrapper_entry(dom: &str, op: &Operator, arg_a: &str, arg_b: &str, extractor: &str) -> FnEntry { FnEntry::Wrapper { - op: op.to_string(), - function_name: operator_function_name(op).to_string(), + op: op.symbol.to_string(), + function_name: op.function_name.to_string(), args: [ SqlParam { name: "a", @@ -167,13 +167,13 @@ pub fn wrapper_entry(dom: &str, op: &str, arg_a: &str, arg_b: &str, extractor: & } /// Build an unsupported-operator entry. Every such entry shares one uniform -/// `RAISE EXCEPTION` body; only signature facts vary. -pub fn unsupported_entry(op: &str, args: [SqlParam; 2], returns: &str) -> FnEntry { - use crate::operator_surface::operator_function_name; +/// `RAISE EXCEPTION` body; only signature facts vary. `op` is the +/// already-resolved operator (no symbol re-lookup needed). +pub fn unsupported_entry(op: &Operator, args: [SqlParam; 2], returns: &str) -> FnEntry { FnEntry::Unsupported { // operator_lit is sql_str-escaped defensively for the single-quoted RAISE literal. - operator_lit: sql_str(op), - function_name: operator_function_name(op).to_string(), + operator_lit: sql_str(op.symbol), + function_name: op.function_name.to_string(), args, returns: returns.to_string(), } @@ -231,11 +231,6 @@ pub fn domain_name(name: &str) -> String { format!("{SCHEMA}.{name}") } -/// The full domain name from a token + suffix (suffix "" => bare token). -pub fn full_domain_name(token: &str, suffix: &str) -> String { - format!("{token}{suffix}") -} - /// The extractor-call SQL for one operand, casting jsonb to the domain first. /// Port of `_extract_arg`. `dom` is the schema-qualified domain name. pub fn extract_arg(arg_type: &str, extractor: &str, dom: &str, arg: &str) -> String { @@ -270,7 +265,7 @@ pub const AGGREGATE_OPS: &[AggregateOp] = &[ /// True if the domain carries a comparator term (supports `<`). /// Port of `is_ord_capable`. pub fn is_ord_capable(terms: &[Term]) -> bool { - Term::role_for_terms(terms) == "ord" + Term::role_for_terms(terms) == Role::Ord } #[cfg(test)] diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index f428e475a..eefa23bb5 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -21,11 +21,6 @@ fn scalar_path(token: &str, file: &str) -> String { format!("{V3_SCALARS_DIR}/{token}/{file}") } -/// The full domain name (token + suffix). suffix "" => bare token. -fn full_name(token: &str, suffix: &str) -> String { - format!("{token}{suffix}") -} - /// The second-parameter name for an operator's generated signature. The `->` and /// `->>` path operators take a path *selector* as their right operand; every /// other operator uses the generic `b`. This is a naming convention only — it @@ -76,34 +71,20 @@ fn functions_requires(token: &str, terms: &[Term]) -> Vec { reqs } -/// Distinct extractor-bearing terms (first occurrence per extractor). -/// Port of `_extractor_terms`. -fn extractor_terms(terms: &[Term]) -> Vec { - let mut seen: Vec<&str> = Vec::new(); - let mut out: Vec = Vec::new(); - for &t in terms { - if !seen.contains(&t.extractor()) { - seen.push(t.extractor()); - out.push(t); - } - } - out -} - /// Body for a domain's _functions.sql. Port of `render_functions_file`. pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { use crate::consts::sql_str; use crate::context::{ environment, extractor_entry, unsupported_entry, wrapper_entry, FunctionsContext, SqlParam, }; - let name = full_name(token, domain.suffix); + let name = domain.name_with_token(token); let dom = domain_name(&name); let domain_lit = sql_str(&dom); let supported = Term::operators_for_terms(domain.terms); let is_supported = |op: &str| supported.contains(&op); let mut entries = Vec::new(); - for term in extractor_terms(domain.terms) { + for term in Term::extractor_terms(domain.terms) { entries.push(extractor_entry(term)); } for op in OPERATORS { @@ -114,7 +95,7 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { if let Some(ex) = extractor { entries.push(wrapper_entry( &dom, - op.symbol, + op, &rendered.left, &rendered.right, ex, @@ -132,7 +113,7 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { ty: rendered.right, }, ]; - entries.push(unsupported_entry(op.symbol, args, &rendered.returns)); + entries.push(unsupported_entry(op, args, &rendered.returns)); } } @@ -154,7 +135,7 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { /// Body for a domain's _operators.sql. Port of `render_operators_file`. pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { use crate::context::{environment, operator_entry, OperatorsContext}; - let name = full_name(token, domain.suffix); + let name = domain.name_with_token(token); let dom = domain_name(&name); let supported = Term::operators_for_terms(domain.terms); let is_supported = |op: &str| supported.contains(&op); @@ -199,7 +180,7 @@ pub fn render_aggregates_file(token: &str, domain: &DomainSpec) -> Option Result, let token = spec.token; let mut targets = vec![out_dir.join(format!("{token}_types.sql"))]; for d in spec.domains { - let name = full_name(token, d.suffix); + let name = d.name_with_token(token); targets.push(out_dir.join(format!("{name}_functions.sql"))); targets.push(out_dir.join(format!("{name}_operators.sql"))); if is_ord_capable(d.terms) { @@ -249,7 +230,7 @@ pub fn generate_type(spec: &ScalarSpec, out_dir: &Path) -> Result, written.push(types_path); for d in spec.domains { - let name = full_name(token, d.suffix); + let name = d.name_with_token(token); let fn_path = out_dir.join(format!("{name}_functions.sql")); write_generated_file(&fn_path, &render_functions_file(token, d))?; written.push(fn_path); @@ -311,18 +292,9 @@ mod tests { .expect("domain suffix") } + use crate::repo_root; use std::fs; - fn repo_root() -> PathBuf { - // crates/eql-codegen/ -> repo root is two parents up from CARGO_MANIFEST_DIR. - PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .parent() - .unwrap() - .to_path_buf() - } - fn strip_reference_marker(text: &str) -> String { let mut lines: Vec<&str> = text.lines().collect(); // .lines() drops the trailing newline; re-add per line and handle the @@ -344,7 +316,7 @@ mod tests { return render_types_file(spec); } for d in spec.domains { - let full = full_name(token, d.suffix); + let full = d.name_with_token(token); if name == format!("{full}_functions.sql") { return render_functions_file(token, d); } @@ -381,83 +353,53 @@ mod tests { assert!(sql.contains("RAISE EXCEPTION 'operator % is not supported for %', '->'")); } - #[test] - fn types_file_matches_golden() { - let root = repo_root(); - let path = root.join("tests/codegen/reference/int4/int4_types.sql"); - let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - let actual = render_types_file(spec("int4")); - assert_eq!(actual, expected); - } - - #[test] - fn functions_files_match_golden() { - let root = repo_root(); - let s = spec("int4"); - for d in s.domains { - let full = full_name("int4", d.suffix); - let path = root.join(format!("tests/codegen/reference/int4/{full}_functions.sql")); - let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - let actual = render_functions_file("int4", d); - assert_eq!(actual, expected, "{full}_functions.sql diverged"); - } - } - - #[test] - fn operators_files_match_golden() { - let root = repo_root(); - let s = spec("int4"); - for d in s.domains { - let full = full_name("int4", d.suffix); - let path = root.join(format!("tests/codegen/reference/int4/{full}_operators.sql")); - let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - let actual = render_operators_file("int4", d); - assert_eq!(actual, expected, "{full}_operators.sql"); - } - } - - #[test] - fn aggregates_files_match_golden() { - let root = repo_root(); - let s = spec("int4"); - for d in s.domains { - if let Some(actual) = render_aggregates_file("int4", d) { - let full = full_name("int4", d.suffix); - let path = root.join(format!( - "tests/codegen/reference/int4/{full}_aggregates.sql" - )); - let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - assert_eq!(actual, expected, "{full}_aggregates.sql"); - } - } + /// The committed reference token dirs under `tests/codegen/reference/`. + fn reference_tokens(root: &std::path::Path) -> Vec { + let mut tokens: Vec = fs::read_dir(root.join("tests/codegen/reference")) + .expect("reference dir") + .filter_map(|e| e.ok()) + .filter(|e| e.path().is_dir()) + .map(|e| e.file_name().to_str().unwrap().to_string()) + .collect(); + tokens.sort(); + tokens } + /// Byte-compare every `render_*_file` output against its committed golden, + /// for **every** catalog type with a reference dir (not just int4). This is + /// the in-crate golden gate over the render functions directly (the + /// integration `parity.rs` gate runs `generate_all` to disk). The reference + /// dirs are cross-checked against the catalog by `parity.rs`'s + /// `reference_dirs_match_catalog_tokens`. #[test] - fn generator_matches_int4_reference_golden() { + fn generator_matches_reference_goldens() { let root = repo_root(); - let ref_dir = root.join("tests/codegen/reference/int4"); - let s = spec("int4"); let mut checked = 0; - for entry in fs::read_dir(&ref_dir).expect("reference dir") { - let path = entry.unwrap().path(); - if path.extension().and_then(|e| e.to_str()) != Some("sql") { - continue; + for token in reference_tokens(&root) { + let s = spec(&token); + let ref_dir = root.join("tests/codegen/reference").join(&token); + for entry in fs::read_dir(&ref_dir).expect("reference dir") { + let path = entry.unwrap().path(); + if path.extension().and_then(|e| e.to_str()) != Some("sql") { + continue; + } + let name = path.file_name().unwrap().to_str().unwrap().to_string(); + let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); + let actual = rendered_for(&token, &name, s); + assert_eq!( + actual, expected, + "{token}/{name}: generator diverged from golden reference" + ); + checked += 1; } - let name = path.file_name().unwrap().to_str().unwrap().to_string(); - let expected = strip_reference_marker(&fs::read_to_string(&path).unwrap()); - let actual = rendered_for("int4", &name, s); - assert_eq!( - actual, expected, - "{name}: generator diverged from golden reference" - ); - checked += 1; } assert!( checked >= 11, - "expected >=11 reference SQL files, checked {checked}" + "expected >=11 reference SQL files across all tokens, checked {checked}" ); } + #[test] fn generate_type_writes_expected_files() { let d = crate::writer::test_support::tempdir(); @@ -673,10 +615,11 @@ mod tests { fn unsupported_entry_preserves_operator_literal_and_domain_lit_is_escaped() { use crate::consts::sql_str; use crate::context::{unsupported_entry, FnEntry, SqlParam}; + use crate::operator_surface::operator; let dom = "eql_v3.o'dom"; let domain_lit = sql_str(dom); let entry = unsupported_entry( - "<", + &operator("<"), [ SqlParam { name: "a", diff --git a/crates/eql-codegen/src/lib.rs b/crates/eql-codegen/src/lib.rs index aada6bb79..bc1fd9d11 100644 --- a/crates/eql-codegen/src/lib.rs +++ b/crates/eql-codegen/src/lib.rs @@ -1,12 +1,27 @@ //! Scalar encrypted-domain SQL generator. Renders the `eql-scalars` catalog to -//! the gitignored SQL surface, validated byte-for-byte against the -//! `tests/codegen/reference/int4` golden (modulo the one `-- REFERENCE:` -//! provenance line each reference file carries). The plaintext fixture lists -//! the SQLx matrix consumes live in the catalog itself +//! the gitignored SQL surface, validated byte-for-byte against the per-token +//! goldens under `tests/codegen/reference//` (modulo the one +//! `-- REFERENCE:` provenance line each reference file carries). The plaintext +//! fixture lists the SQLx matrix consumes live in the catalog itself //! (`eql_scalars::INT4_VALUES` / `INT2_VALUES`), not in a generated file. +use std::path::PathBuf; + pub mod consts; pub mod context; pub mod generate; pub mod operator_surface; pub mod writer; + +/// The repository root, derived from this crate's manifest dir (the generator +/// writes the real `src/v3/scalars/` tree relative to it). `CARGO_MANIFEST_DIR` +/// is `crates/eql-codegen`, so the repo root is two parents up. Shared by the +/// binary, the in-crate tests, and the `tests/parity.rs` gate. +pub fn repo_root() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .parent() + .unwrap() + .to_path_buf() +} diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index c51bf4c2f..3f5f6680f 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -1,18 +1,7 @@ -use std::path::PathBuf; use std::process::ExitCode; use eql_codegen::generate::generate_all; - -fn repo_root() -> PathBuf { - // The binary runs from the repo root via `cargo run`; CARGO_MANIFEST_DIR - // points at crates/eql-codegen, so the repo root is two parents up. - PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .parent() - .unwrap() - .to_path_buf() -} +use eql_codegen::repo_root; fn main() -> ExitCode { let args: Vec = std::env::args().collect(); diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index d819f6e25..ea0b24c9a 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -34,6 +34,11 @@ impl OperatorMetadata { /// Render the `CREATE OPERATOR` metadata clause, or `None` when no hint is /// present (e.g. the path-selector operators, which carry no metadata). + /// + /// The emission order (COMMUTATOR, NEGATOR, RESTRICT, JOIN) is **load-bearing + /// for the golden byte-match** — reordering these blocks changes generated + /// SQL and breaks the parity gate. Keep it fixed regardless of struct field + /// order. pub fn render(self) -> Option { let mut extras = Vec::new(); if let Some(c) = self.commutator { @@ -465,6 +470,14 @@ mod tests { assert_eq!(OPERATORS.len(), 20); } + #[test] + #[should_panic(expected = "unknown operator symbol")] + fn operator_panics_on_unknown_symbol() { + // The generator only ever passes catalog symbols; an unknown symbol is a + // programming error and must fail loudly rather than silently no-op. + let _ = operator("~~"); + } + #[test] fn every_operator_has_signatures() { assert!( diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index 153bc8e6f..63f0f26c1 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -4,33 +4,22 @@ use std::fs; use std::io; use std::path::{Path, PathBuf}; -use crate::consts::AUTO_GENERATED_HEADER; +use crate::consts::AUTO_GENERATED_MARKER; /// First line of the SQL header — the ownership marker. -fn sql_marker() -> &'static str { - AUTO_GENERATED_HEADER.lines().next().unwrap() +const fn sql_marker() -> &'static str { + AUTO_GENERATED_MARKER } -/// Raised when the generator would clobber a hand-written file. -#[derive(Debug)] +/// Raised when the generator would clobber a hand-written file, or on an +/// underlying IO error. Implements `std::error::Error` (via `thiserror`) so it +/// composes with `?`, `Box`, and `source()` chains. +#[derive(Debug, thiserror::Error)] pub enum WriteError { + #[error("{0}")] Ownership(String), - Io(io::Error), -} - -impl From for WriteError { - fn from(e: io::Error) -> Self { - WriteError::Io(e) - } -} - -impl std::fmt::Display for WriteError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - WriteError::Ownership(m) => write!(f, "{m}"), - WriteError::Io(e) => write!(f, "io error: {e}"), - } - } + #[error("io error: {0}")] + Io(#[from] io::Error), } fn first_line(path: &Path) -> io::Result { @@ -151,6 +140,7 @@ pub(crate) mod test_support { mod tests { use super::test_support::tempdir as tmp; use super::*; + use crate::consts::AUTO_GENERATED_HEADER; #[test] fn is_generated_true_for_header() { @@ -265,4 +255,19 @@ mod tests { let d = tmp(); assert!(clean_generated_files(d.path()).unwrap().is_empty()); } + + #[test] + fn write_surfaces_io_error_via_from_and_display() { + // Exercise the `WriteError::Io` arm and its `From` conversion: + // a marker-valid body whose parent path is a *file* makes `create_dir_all` + // fail, which `?`-converts into `WriteError::Io`. + let d = tmp(); + let blocker = d.path().join("not-a-dir"); + fs::write(&blocker, "i am a file\n").unwrap(); + let target = blocker.join("int4_types.sql"); // parent is a file + let body = format!("{AUTO_GENERATED_HEADER}DO $$ BEGIN END $$;\n"); + let err = write_generated_file(&target, &body).unwrap_err(); + assert!(matches!(err, WriteError::Io(_)), "expected Io, got {err:?}"); + assert!(err.to_string().starts_with("io error: ")); + } } diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index a0f1e3b1b..1b5584e8c 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -1,24 +1,34 @@ //! THE PARITY GATE. Runs the Rust generator (into a temp dir) and asserts the -//! int4 SQL surface is byte-for-byte equal to the `tests/codegen/reference/int4` -//! golden (modulo the one leading `-- REFERENCE:` provenance line). The golden -//! reference — not the retired Python generator — is the sole oracle. The -//! plaintext fixture lists are not generated; they live in the catalog -//! (`eql_scalars::INT4_VALUES` / `INT2_VALUES`) and are pinned by -//! `eql-scalars`'s own `values_tests`. +//! generated SQL surface is byte-for-byte equal to the committed golden under +//! `tests/codegen/reference//` (modulo the one leading `-- REFERENCE:` +//! provenance line). Every catalog type has a committed golden, generated once; +//! the golden — not the retired Python generator — is the sole oracle. The +//! reference dirs are *discovered* dynamically and cross-checked against +//! `eql_scalars::CATALOG`, so a new catalog type with no golden (or a stale +//! golden with no catalog row) fails here. The plaintext fixture lists are not +//! generated; they live in the catalog (`eql_scalars::INT4_VALUES` / +//! `INT2_VALUES`) and are pinned by `eql-scalars`'s own `values_tests`. +use std::collections::BTreeSet; use std::fs; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; -fn repo_root() -> PathBuf { - PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .parent() - .unwrap() - .to_path_buf() +use eql_codegen::repo_root; + +/// A temp dir removed on drop, so parity runs don't leak `/tmp` trees. +struct TempDir(PathBuf); +impl TempDir { + fn path(&self) -> &Path { + &self.0 + } +} +impl Drop for TempDir { + fn drop(&mut self) { + let _ = fs::remove_dir_all(&self.0); + } } -fn tempdir(tag: &str) -> PathBuf { +fn tempdir(tag: &str) -> TempDir { let mut p = std::env::temp_dir(); let nanos = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) @@ -26,88 +36,163 @@ fn tempdir(tag: &str) -> PathBuf { .as_nanos(); p.push(format!("eql-parity-{tag}-{nanos}")); fs::create_dir_all(&p).unwrap(); - p + TempDir(p) +} + +/// The committed reference token dirs under `tests/codegen/reference/` (every +/// entry that is a directory; `README.md` and any stray file are skipped). +fn reference_tokens(root: &Path) -> BTreeSet { + fs::read_dir(root.join("tests/codegen/reference")) + .expect("reference dir") + .filter_map(|e| e.ok()) + .filter(|e| e.path().is_dir()) + .map(|e| e.file_name().to_str().unwrap().to_string()) + .collect() +} + +/// The sorted `*.sql` file names directly under `dir`. +fn sql_names(dir: &Path) -> Vec { + let mut names: Vec = fs::read_dir(dir) + .unwrap() + .filter_map(|e| e.ok().map(|e| e.path())) + .filter(|p| p.extension().and_then(|x| x.to_str()) == Some("sql")) + .map(|p| p.file_name().unwrap().to_str().unwrap().to_string()) + .collect(); + names.sort(); + names +} + +/// Strip the leading `-- REFERENCE:` provenance line(s), preserving the +/// remaining bytes verbatim (`split_inclusive` keeps the `\n` terminators). +/// What remains is the generated body, which already starts with the +/// template-owned `-- AUTOMATICALLY GENERATED FILE.` marker — the same first +/// line the materialised file carries — so the comparison is byte-for-byte. +fn reference_body(reference: &str) -> String { + reference + .split_inclusive('\n') + .skip_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) + .collect() } #[test] -fn rust_generator_matches_int4_golden_files() { +fn reference_dirs_match_catalog_tokens() { let root = repo_root(); - let out = tempdir("rust-golden"); - eql_codegen::generate::generate_all(&out).expect("rust generate_all"); - - let ref_dir = root.join("tests/codegen/reference/int4"); - let gen_dir = out.join("src/v3/scalars/int4"); - - // Assert the generated .sql file SET matches the reference set first — the - // per-file byte comparison below only iterates reference files, so a missing - // generated file (or an extra one the reference never pins) would otherwise - // pass silently. - let sql_names = |dir: &std::path::Path| -> Vec { - let mut names: Vec = fs::read_dir(dir) - .unwrap() - .filter_map(|e| e.ok().map(|e| e.path())) - .filter(|p| p.extension().and_then(|x| x.to_str()) == Some("sql")) - .map(|p| p.file_name().unwrap().to_str().unwrap().to_string()) - .collect(); - names.sort(); - names - }; - let ref_names = sql_names(&ref_dir); - let gen_names = sql_names(&gen_dir); + let refs = reference_tokens(&root); + let catalog: BTreeSet = eql_scalars::CATALOG + .iter() + .map(|s| s.token.to_string()) + .collect(); assert_eq!( - gen_names, ref_names, - "generated int4 .sql file set differs from golden reference set \ - (reference: {ref_names:?}, generated: {gen_names:?})" + refs, catalog, + "committed reference dirs must equal the catalog token set: a new \ + catalog type needs a committed `tests/codegen/reference//` golden \ + (generate it with `cargo run -p eql-codegen` and prepend a `-- REFERENCE:` \ + line), and a stale golden with no catalog row must be removed" ); +} - for entry in fs::read_dir(&ref_dir).unwrap() { - let path = entry.unwrap().path(); - if path.extension().and_then(|e| e.to_str()) != Some("sql") { - continue; - } - let name = path.file_name().unwrap().to_str().unwrap(); - let reference = fs::read_to_string(&path).unwrap(); - // Strip the leading `-- REFERENCE:` provenance line(s), preserving the - // remaining bytes verbatim (`split_inclusive` keeps the `\n` - // terminators). What remains is the generated body, which already starts - // with the template-owned `-- AUTOMATICALLY GENERATED FILE.` marker — the - // same first line the materialised file carries — so the comparison is - // byte-for-byte with no header re-added. - let expected: String = reference - .split_inclusive('\n') - .skip_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) - .collect(); - let actual = fs::read_to_string(gen_dir.join(name)).unwrap(); +#[test] +fn rust_generator_matches_golden_files() { + let root = repo_root(); + let out = tempdir("rust-golden"); + eql_codegen::generate::generate_all(out.path()).expect("rust generate_all"); + + for token in reference_tokens(&root) { + let ref_dir = root.join("tests/codegen/reference").join(&token); + let gen_dir = out.path().join("src/v3/scalars").join(&token); + + // Assert the generated .sql file SET matches the reference set first — the + // per-file byte comparison below only iterates reference files, so a + // missing generated file (or an extra one the reference never pins) would + // otherwise pass silently. + let ref_names = sql_names(&ref_dir); + let gen_names = sql_names(&gen_dir); assert_eq!( - actual, expected, - "{name}: materialised output differs from golden" + gen_names, ref_names, + "{token}: generated .sql file set differs from golden reference set \ + (reference: {ref_names:?}, generated: {gen_names:?})" ); + + for name in &ref_names { + let reference = fs::read_to_string(ref_dir.join(name)).unwrap(); + let expected = reference_body(&reference); + let actual = fs::read_to_string(gen_dir.join(name)).unwrap(); + assert_eq!( + actual, expected, + "{token}/{name}: materialised output differs from golden" + ); + } + } +} + +/// Run the generator twice into separate temp dirs and assert every emitted file +/// is byte-identical between the runs. Guards the documented determinism promise +/// (identical `CATALOG` => byte-identical SQL) against a future `HashMap`/`HashSet` +/// iteration leaking into a renderer. +#[test] +fn generate_all_is_deterministic_across_runs() { + let a = tempdir("determinism-a"); + let b = tempdir("determinism-b"); + eql_codegen::generate::generate_all(a.path()).expect("generate_all a"); + eql_codegen::generate::generate_all(b.path()).expect("generate_all b"); + + let collect = |root: &Path| -> Vec<(String, String)> { + let base = root.join("src/v3/scalars"); + let mut files: Vec<(String, String)> = Vec::new(); + let mut stack = vec![base.clone()]; + while let Some(dir) = stack.pop() { + for entry in fs::read_dir(&dir).unwrap() { + let path = entry.unwrap().path(); + if path.is_dir() { + stack.push(path); + } else if path.extension().and_then(|x| x.to_str()) == Some("sql") { + let rel = path.strip_prefix(&base).unwrap().to_str().unwrap().to_string(); + files.push((rel, fs::read_to_string(&path).unwrap())); + } + } + } + files.sort(); + files + }; + + let fa = collect(a.path()); + let fb = collect(b.path()); + assert_eq!( + fa.iter().map(|(n, _)| n).collect::>(), + fb.iter().map(|(n, _)| n).collect::>(), + "two generator runs emitted different file sets" + ); + for ((na, ca), (_nb, cb)) in fa.iter().zip(fb.iter()) { + assert_eq!(ca, cb, "{na}: two generator runs produced different bytes"); } } /// Both Rust strippers (the in-crate `strip_reference_marker` and this file's /// golden test) skip a variable number of leading `-- REFERENCE:` lines, while /// the shell gate skips exactly one with `tail -n +2`. They agree only while -/// every reference file carries exactly one marker line — make that explicit. +/// every reference file carries exactly one marker line — make that explicit +/// across every committed reference dir. #[test] fn every_reference_file_has_exactly_one_marker_line() { let root = repo_root(); - let dir = root.join("tests/codegen/reference/int4"); - for entry in fs::read_dir(&dir).unwrap() { - let path = entry.unwrap().path(); - let ext = path.extension().and_then(|e| e.to_str()); - if ext != Some("sql") && ext != Some("rs") { - continue; + for token in reference_tokens(&root) { + let dir = root.join("tests/codegen/reference").join(&token); + for entry in fs::read_dir(&dir).unwrap() { + let path = entry.unwrap().path(); + let ext = path.extension().and_then(|e| e.to_str()); + if ext != Some("sql") && ext != Some("rs") { + continue; + } + let text = fs::read_to_string(&path).unwrap(); + let markers = text + .lines() + .take_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) + .count(); + assert_eq!( + markers, 1, + "{}: expected exactly 1 leading REFERENCE marker line (shell `tail -n +2` assumes one); found {markers}", + path.display() + ); } - let text = fs::read_to_string(&path).unwrap(); - let markers = text - .lines() - .take_while(|l| l.starts_with("-- REFERENCE:") || l.starts_with("// REFERENCE:")) - .count(); - assert_eq!( - markers, 1, - "{}: expected exactly 1 leading REFERENCE marker line (shell `tail -n +2` assumes one); found {markers}", - path.display() - ); } } diff --git a/crates/eql-scalars/src/fixture.rs b/crates/eql-scalars/src/fixture.rs index cef88c443..23208ddb2 100644 --- a/crates/eql-scalars/src/fixture.rs +++ b/crates/eql-scalars/src/fixture.rs @@ -1,6 +1,5 @@ //! Inherent impls for [`Fixture`] — resolving a fixture to its integer value -//! (`numeric_value`) and rendering it as a Rust source literal -//! (`render_literal`). Definition lives in `lib.rs`. +//! (`numeric_value`). Definition lives in `lib.rs`. use crate::{Fixture, ScalarKind}; @@ -37,35 +36,4 @@ impl Fixture { | Fixture::Timestamptz(_) => None, } } - - /// Render as a Rust source literal: sentinels -> named constant, `Int` -> the - /// number, string kinds -> a `Debug`-quoted (Rust-escaped, not SQL) literal. - pub fn render_literal(self, kind: ScalarKind) -> String { - const PIVOT_MSG: &str = "Min/Max/Zero fixtures require an integer kind"; - match self { - Fixture::Min => kind - .as_bounded_int() - .expect(PIVOT_MSG) - .min_symbol() - .to_string(), - Fixture::Max => kind - .as_bounded_int() - .expect(PIVOT_MSG) - .max_symbol() - .to_string(), - Fixture::Zero => kind - .as_bounded_int() - .expect(PIVOT_MSG) - .zero_symbol() - .to_string(), - Fixture::Int(n) => n.to_string(), - Fixture::Numeric(s) - | Fixture::Text(s) - | Fixture::Jsonb(s) - | Fixture::Date(s) - | Fixture::Timestamptz(s) => { - format!("{s:?}") - } - } - } } diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-scalars/src/kind.rs index b5ded6fa8..69ab70f5a 100644 --- a/crates/eql-scalars/src/kind.rs +++ b/crates/eql-scalars/src/kind.rs @@ -89,23 +89,30 @@ impl ScalarKind { matches!(self, ScalarKind::Date | ScalarKind::Timestamptz) } - /// A debug/identifier string for the kind. For the codegen-supported kinds - /// (`I16`/`I32`/`I64`/`Date`) this is the canonical Rust plaintext type name - /// (`"i32"`, `"chrono::NaiveDate"`). For the not-yet-wired kinds - /// (`Numeric`/`Text`/`Jsonb`) it returns the SQL/type token (`"numeric"`, - /// `"text"`, `"jsonb"`) as a placeholder — those variants have no generated - /// surface, so the string is not consumed by codegen. Only call site is + /// True for the `Text` kind — an unbounded, owned-`String` scalar. Keeps + /// "textness" classification in the catalog crate alongside `is_int` / + /// `is_temporal`, rather than matching the variant at each call site. + pub const fn is_text(self) -> bool { + matches!(self, ScalarKind::Text) + } + + /// A debug/identifier string for the kind: the canonical Rust plaintext type + /// name (`"i32"`, `"chrono::NaiveDate"`). `Numeric`/`Jsonb` have **no + /// generated SQL surface** and no catalog row, so calling this on them is a + /// programming error and panics loudly rather than returning a plausible SQL + /// token a premature caller might feed into codegen. Only call site today is /// `crates/eql-scalars/src/tests.rs`. pub const fn rust_type(self) -> &'static str { match self { ScalarKind::I16 => "i16", ScalarKind::I32 => "i32", ScalarKind::I64 => "i64", - ScalarKind::Numeric => "numeric", ScalarKind::Text => "text", - ScalarKind::Jsonb => "jsonb", ScalarKind::Date => "chrono::NaiveDate", ScalarKind::Timestamptz => "chrono::DateTime", + ScalarKind::Numeric | ScalarKind::Jsonb => { + panic!("ScalarKind::rust_type: numeric/jsonb have no generated surface yet") + } } } } diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index d3d055e1c..54163c0b0 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -86,14 +86,39 @@ pub enum Term { Bloom, } +/// The generated-file role of a domain, derived from its first term (or +/// `Storage` for a term-less domain). Gates ord-only codegen (aggregates) via an +/// exhaustive `==` against [`Role::Ord`] rather than a stringly-typed compare — +/// a typo can no longer silently disable aggregate generation. `label` is the +/// `&'static str` form for any future template/serde consumer. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Role { + Storage, + Eq, + Ord, + Match, +} + +impl Role { + /// The lowercase label (`"storage"`/`"eq"`/`"ord"`/`"match"`). + pub const fn label(self) -> &'static str { + match self { + Role::Storage => "storage", + Role::Eq => "eq", + Role::Ord => "ord", + Role::Match => "match", + } + } +} + /// A single fixture plaintext value, value-kind tagged: `Min`/`Max`/`Zero` are /// the integer matrix pivots (resolved per-kind); `Int` is an integer literal; /// `Numeric`/`Text`/`Jsonb` carry rendered string literals. /// /// `fixtures!` range-checks `Int` literals at compile time, but a hand-built /// `Fixture::Int(n)` is not — hence the runtime invariant tests. `Int(MIN)` and -/// `Min` resolve equal but render differently (`"-32768"` vs `"i16::MIN"`). -/// (`numeric_value`/`render_literal` are impl'd in `fixture`.) +/// `Min` resolve to the same numeric value via `numeric_value`. +/// (`numeric_value` is impl'd in `fixture`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Fixture { Min, diff --git a/crates/eql-scalars/src/spec.rs b/crates/eql-scalars/src/spec.rs index 8c4143ed8..2d9ae7ea2 100644 --- a/crates/eql-scalars/src/spec.rs +++ b/crates/eql-scalars/src/spec.rs @@ -4,11 +4,21 @@ use crate::{DomainSpec, ScalarSpec}; +impl DomainSpec { + /// The full (unqualified) domain name for this domain under `token`: + /// `token` + `suffix` (suffix `""` => bare token). The **single** source for + /// the token+suffix concatenation — codegen builds every domain name through + /// this, so the "domain name starts with the token" rule is structural. + pub fn name_with_token(&self, token: &str) -> String { + format!("{token}{}", self.suffix) + } +} + impl ScalarSpec { /// The fully-qualified domain name: `token` + `suffix`. Makes the old /// "domain name must start with the token" validation structural. pub fn domain_name(&self, domain: &DomainSpec) -> String { - format!("{}{}", self.token, domain.suffix) + domain.name_with_token(self.token) } /// True when this type declares no ordered (`_ord`) domain — i.e. equality-only diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-scalars/src/term.rs index a7f2e3905..f8f194e58 100644 --- a/crates/eql-scalars/src/term.rs +++ b/crates/eql-scalars/src/term.rs @@ -3,7 +3,7 @@ //! helpers that resolve a domain's `&[Term]` to its operators, keys, requires, //! role, and extractor. Definition lives in `lib.rs`. -use crate::Term; +use crate::{Role, Term}; impl Term { /// JSON payload key carrying this term (`"hm"` / `"ob"`). @@ -33,12 +33,12 @@ impl Term { } } - /// Generated-file role label for a domain whose first term is this one. - pub const fn role(self) -> &'static str { + /// Generated-file [`Role`] for a domain whose first term is this one. + pub const fn role(self) -> Role { match self { - Term::Hm => "eq", - Term::Ore => "ord", - Term::Bloom => "match", + Term::Hm => Role::Eq, + Term::Ore => Role::Ord, + Term::Bloom => Role::Match, } } @@ -87,6 +87,21 @@ impl Term { Self::dedupe_preserving_order(terms.iter().map(|t| t.json_key())) } + /// Distinct extractor-bearing terms, first occurrence per extractor wins. + /// Two terms sharing an extractor collapse to the first, since the generated + /// `eq_term`/`ord_term`/`match_term` function is emitted once per extractor. + pub fn extractor_terms(terms: &[Term]) -> Vec { + let mut seen: Vec<&str> = Vec::new(); + let mut out: Vec = Vec::new(); + for &t in terms { + if !seen.contains(&t.extractor()) { + seen.push(t.extractor()); + out.push(t); + } + } + out + } + /// SQL `-- REQUIRE:` edges needed by these terms (deduped, in order). pub fn term_requires(terms: &[Term]) -> Vec<&'static str> { Self::dedupe_preserving_order(terms.iter().flat_map(|t| t.requires().iter().copied())) @@ -101,11 +116,11 @@ impl Term { .map(|t| t.extractor()) } - /// Generated-file role label for a domain with these terms. No terms => - /// `"storage"`; otherwise the first term's role. - pub fn role_for_terms(terms: &[Term]) -> &'static str { + /// Generated-file [`Role`] for a domain with these terms. No terms => + /// [`Role::Storage`]; otherwise the first term's role. + pub fn role_for_terms(terms: &[Term]) -> Role { match terms.first() { - None => "storage", + None => Role::Storage, Some(t) => t.role(), } } diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 1c988377a..e440148d3 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -82,6 +82,22 @@ mod rust_tests { assert!(!ScalarKind::Timestamptz.is_int()); } + #[test] + fn is_text_classifies_only_text() { + assert!(ScalarKind::Text.is_text()); + for k in [ + ScalarKind::I16, + ScalarKind::I32, + ScalarKind::I64, + ScalarKind::Numeric, + ScalarKind::Jsonb, + ScalarKind::Date, + ScalarKind::Timestamptz, + ] { + assert!(!k.is_text()); + } + } + #[test] fn i64_facts() { // Capability-layer fact: i64 is the Rust kind a future int8 maps onto. @@ -119,9 +135,9 @@ mod rust_tests { /// The structural guarantee that replaces the old runtime panics: a /// `Min`/`Max`/`Zero` pivot sentinel may only appear in a `CATALOG` row whose - /// kind is an integer kind. `render_literal` would `expect`-panic and - /// `numeric_value` would resolve to `None` for a pivot on a non-integer kind; - /// this test makes such a row a test failure at the source of truth. + /// kind is an integer kind. `numeric_value` would resolve to `None` for a + /// pivot on a non-integer kind; this test makes such a row a test failure at + /// the source of truth. #[test] fn pivot_sentinels_only_appear_with_integer_kinds() { for spec in CATALOG { @@ -167,7 +183,7 @@ mod term_tests { assert_eq!(hm.json_key(), "hm"); assert_eq!(hm.extractor(), "eq_term"); assert_eq!(hm.ctor(), "hmac_256"); - assert_eq!(hm.role(), "eq"); + assert_eq!(hm.role(), Role::Eq); assert_eq!(hm.operators(), &["=", "<>"]); assert_eq!(hm.requires(), &["src/v3/sem/hmac_256/functions.sql"]); } @@ -178,7 +194,7 @@ mod term_tests { assert_eq!(ore.json_key(), "ob"); assert_eq!(ore.extractor(), "ord_term"); assert_eq!(ore.ctor(), "ore_block_u64_8_256"); - assert_eq!(ore.role(), "ord"); + assert_eq!(ore.role(), Role::Ord); assert_eq!(ore.operators(), &["=", "<>", "<", "<=", ">", ">="]); assert_eq!( ore.requires(), @@ -195,7 +211,7 @@ mod term_tests { assert_eq!(b.json_key(), "bf"); assert_eq!(b.extractor(), "match_term"); assert_eq!(b.ctor(), "bloom_filter"); - assert_eq!(b.role(), "match"); + assert_eq!(b.role(), Role::Match); assert_eq!(b.operators(), &["@>", "<@"]); assert_eq!(b.requires(), &["src/v3/sem/bloom_filter/functions.sql"]); } @@ -216,9 +232,17 @@ mod term_tests { #[test] fn bloom_role_is_match_not_ord() { - assert_eq!(Term::role_for_terms(&[Term::Bloom]), "match"); + assert_eq!(Term::role_for_terms(&[Term::Bloom]), Role::Match); // match is not ord-capable: no aggregates. - assert_ne!(Term::role_for_terms(&[Term::Bloom]), "ord"); + assert_ne!(Term::role_for_terms(&[Term::Bloom]), Role::Ord); + } + + #[test] + fn role_labels_are_stable() { + assert_eq!(Role::Storage.label(), "storage"); + assert_eq!(Role::Eq.label(), "eq"); + assert_eq!(Role::Ord.label(), "ord"); + assert_eq!(Role::Match.label(), "match"); } } @@ -263,9 +287,26 @@ mod term_helper_tests { #[test] fn role_for_terms_handles_storage_eq_ord() { - assert_eq!(Term::role_for_terms(&[]), "storage"); - assert_eq!(Term::role_for_terms(&[Term::Hm]), "eq"); - assert_eq!(Term::role_for_terms(&[Term::Ore]), "ord"); + assert_eq!(Term::role_for_terms(&[]), Role::Storage); + assert_eq!(Term::role_for_terms(&[Term::Hm]), Role::Eq); + assert_eq!(Term::role_for_terms(&[Term::Ore]), Role::Ord); + } + + #[test] + fn extractor_terms_dedupes_by_extractor_first_occurrence_wins() { + // No catalog domain currently carries two terms sharing an extractor, so + // this exercises the dedupe branch directly: Hm and Ore have distinct + // extractors (eq_term / ord_term) and survive; the repeated term collapses. + assert_eq!( + Term::extractor_terms(&[Term::Hm, Term::Ore, Term::Hm]), + vec![Term::Hm, Term::Ore] + ); + // First-occurrence order: Ore before Hm stays Ore, Hm. + assert_eq!( + Term::extractor_terms(&[Term::Ore, Term::Hm, Term::Ore]), + vec![Term::Ore, Term::Hm] + ); + assert_eq!(Term::extractor_terms(&[]), Vec::::new()); } #[test] @@ -369,50 +410,6 @@ mod fixture_tests { assert_eq!(Fixture::Max.numeric_value(ScalarKind::Date), None); } - #[test] - fn render_literal_maps_sentinels() { - assert_eq!(Fixture::Min.render_literal(ScalarKind::I32), "i32::MIN"); - assert_eq!(Fixture::Max.render_literal(ScalarKind::I32), "i32::MAX"); - assert_eq!(Fixture::Zero.render_literal(ScalarKind::I32), "0"); - assert_eq!(Fixture::Min.render_literal(ScalarKind::I16), "i16::MIN"); - assert_eq!(Fixture::Max.render_literal(ScalarKind::I64), "i64::MAX"); - } - - #[test] - fn render_literal_passes_through_numeric() { - assert_eq!(Fixture::Int(-100).render_literal(ScalarKind::I32), "-100"); - assert_eq!(Fixture::Int(9999).render_literal(ScalarKind::I32), "9999"); - assert_eq!( - Fixture::Int(5_000_000_000).render_literal(ScalarKind::I64), - "5000000000" - ); - } - - #[test] - fn render_literal_quotes_string_variants() { - // String-backed kinds render a valid quoted Rust literal. - assert_eq!( - Fixture::Text("alice").render_literal(ScalarKind::Text), - "\"alice\"" - ); - assert_eq!( - Fixture::Numeric("3.14").render_literal(ScalarKind::Numeric), - "\"3.14\"" - ); - assert_eq!( - Fixture::Jsonb(r#"{"a":1}"#).render_literal(ScalarKind::Jsonb), - r#""{\"a\":1}""# - ); - assert_eq!( - Fixture::Date("1970-01-01").render_literal(ScalarKind::Date), - "\"1970-01-01\"" - ); - assert_eq!( - Fixture::Timestamptz("1970-01-01T00:00:00Z").render_literal(ScalarKind::Timestamptz), - "\"1970-01-01T00:00:00Z\"" - ); - } - #[test] fn fixtures_macro_builds_each_kind() { // The int arm range-checks at compile time; sentinels + literals mix. @@ -836,17 +833,17 @@ mod invariant_tests { // Cross-check the Term helpers against a known domain shape on int4. let s = CATALOG.iter().find(|s| s.token == "int4").unwrap(); // storage domain: no terms. - assert_eq!(Term::role_for_terms(s.domains[0].terms), "storage"); + assert_eq!(Term::role_for_terms(s.domains[0].terms), Role::Storage); assert!(Term::operators_for_terms(s.domains[0].terms).is_empty()); // _eq domain: hm => equality only. - assert_eq!(Term::role_for_terms(s.domains[1].terms), "eq"); + assert_eq!(Term::role_for_terms(s.domains[1].terms), Role::Eq); assert_eq!( Term::operators_for_terms(s.domains[1].terms), vec!["=", "<>"] ); assert_eq!(Term::term_json_keys(s.domains[1].terms), vec!["hm"]); // _ord domain: ore => full ordering. - assert_eq!(Term::role_for_terms(s.domains[3].terms), "ord"); + assert_eq!(Term::role_for_terms(s.domains[3].terms), Role::Ord); assert_eq!( Term::operators_for_terms(s.domains[3].terms), vec!["=", "<>", "<", "<=", ">", ">="] diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index e7f45074e..1c0b76d57 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -90,7 +90,7 @@ fn is_int_token(token: &str) -> bool { /// generated payloads carry `bf`) and draws its values from the harness accessor /// (`text_values()`). Replaces the `[text]` marker. fn is_text_token(token: &str) -> bool { - matches!(spec_for_token(token).kind, eql_scalars::ScalarKind::Text) + spec_for_token(token).kind.is_text() } /// True when `token`'s catalog row declares no ordered domain — equality-only. diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index d60264e69..f909f90ca 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -395,14 +395,19 @@ Run, in order: The CI codegen job is a prerequisite of the PostgreSQL test matrix, so generated-SQL drift is caught before database tests run. -**Why no per-type golden baseline.** Do **not** add a -`tests/codegen/reference//` baseline. `int4` is the sole golden master for -the type-generic generator: the templates are pure token substitution, so a -per-type baseline can only fail where `int4`'s already would. Drift protection -for a new type comes from the `int4` reference (shared templates + `Term` enum), -the catalog `values_tests` pinning the materialised `_VALUES`, the -catalog/generator `#[test]`s, and the `scalar_matrix!` SQLx suite -(behaviour, not bytes). +**Commit a per-type golden baseline.** Every catalog type **must** have a +committed `tests/codegen/reference//` baseline, generated once and checked in +(see `tests/codegen/reference/README.md` for the regenerate-and-commit recipe). +The generator is type-generic, but per-type domain *shapes* differ — ordered +types carry `_ord`/`_ord_ore` + aggregates, equality-only types (`timestamptz`) +omit them, and the Bloom `text_match` domain renders `@>`/`<@` as supported +containment operators no ordered type emits — so anchoring every type catches a +regression in any shape, not just the ordered one. `reference_dirs_match_catalog_tokens` +(in `crates/eql-codegen/tests/parity.rs`) fails CI if a catalog row has no golden +or a golden has no catalog row. Drift protection is further reinforced by the +catalog `values_tests` pinning the materialised `_VALUES`, the +catalog/generator `#[test]`s, and the `scalar_matrix!` SQLx suite (behaviour, not +bytes). --- @@ -726,16 +731,19 @@ clippy ... -D warnings`. escaping guards, and twin byte-identity (`crates/eql-codegen/src/generate.rs` `#[cfg(test)]`). - **The parity gate** — `mise run codegen:parity` (`tasks/codegen-parity.sh`). - It runs the generator into the real tree, then (1) compares the int4 generated - SQL **file set** against the golden under `tests/codegen/reference/int4/*.sql`, - excluding committed hand-written files (`comm -23` of `ls` against `git - ls-files`), so an extra or dropped generated file fails; and (2) diffs each - golden file **byte-for-byte** against its generated counterpart, after dropping - the golden's single leading `-- REFERENCE:` provenance line (`tail -n +2`). The - same byte-for-byte assertion runs in-crate as - `crates/eql-codegen/tests/parity.rs` - (`rust_generator_matches_int4_golden_files`). The golden reference — not any - Python oracle — is the sole contract that survives generator refactors. + It runs the generator into the real tree, then for **every** committed + reference token dir (1) compares that type's generated SQL **file set** against + the golden under `tests/codegen/reference//*.sql`, excluding committed + hand-written files (`comm -23` of `ls` against `git ls-files`), so an extra or + dropped generated file fails; and (2) diffs each golden file **byte-for-byte** + against its generated counterpart, after dropping the golden's single leading + `-- REFERENCE:` provenance line (`tail -n +2`). The same byte-for-byte + assertion runs in-crate as `crates/eql-codegen/tests/parity.rs` + (`rust_generator_matches_golden_files`), alongside + `generate_all_is_deterministic_across_runs` (two runs are byte-identical) and + `reference_dirs_match_catalog_tokens` (reference dirs == catalog tokens). The + golden reference — not any Python oracle — is the sole contract that survives + generator refactors. CI runs these in three jobs in `.github/workflows/test-eql.yml`: `rust-crates` (`Rust workspace crates`, runs `mise run test:crates`), `codegen` @@ -748,8 +756,9 @@ Adding a new **term** is a bigger move than adding a type: edit the `Term` enum' `impl` methods, add `#[test]`s, add a `splinter.sh` entry for **each new name the term introduces** — its extractor *and* its comparison wrappers, plus any new SEM constructor (adding `Bloom` required `match_term`, `contains`, `contained_by`, -and the SEM `bloom_filter`) — and, because it changes the int4 surface, update the -golden reference under `tests/codegen/reference/int4/`. +and the SEM `bloom_filter`) — and, because it changes the generated surface, +regenerate and commit the affected golden references under +`tests/codegen/reference//`. --- diff --git a/mise.toml b/mise.toml index 7e34b78e3..9c7528b4e 100644 --- a/mise.toml +++ b/mise.toml @@ -166,6 +166,7 @@ run = """ set -euo pipefail test -f snapshots/matrix_tests.txt || { echo "snapshots/matrix_tests.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } +test -f snapshots/matrix_tests_eq_only.txt || { echo "snapshots/matrix_tests_eq_only.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') @@ -186,6 +187,19 @@ discovered=$(printf '%s\\n' "$listing" \ eq_only_expected="/tmp/matrix-eq-only-expected.txt" grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u > "$eq_only_expected" +# Pin the derivation: the runtime-derived eq-only set must equal the COMMITTED +# snapshot. This closes the blind spot where the strip filter (or a new ordered +# test name that the filter wrongly keeps/drops) silently changes what the +# eq-only gate accepts — any such change now diffs against a committed artifact +# and must be re-committed deliberately. +if ! cmp -s "$eq_only_expected" snapshots/matrix_tests_eq_only.txt; then + echo "Derived eq-only set differs from committed snapshots/matrix_tests_eq_only.txt." >&2 + echo "If the ordered baseline changed intentionally, regenerate the eq-only snapshot:" >&2 + echo " grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u > snapshots/matrix_tests_eq_only.txt" >&2 + diff snapshots/matrix_tests_eq_only.txt "$eq_only_expected" >&2 || true + exit 1 +fi + # Per-type normalize + compare: each type must match EITHER the full canonical # snapshot (ordered shape) OR the derived eq-only subset (equality-only shape). checked=0 diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh index 0445802f4..41439e436 100755 --- a/tasks/codegen-parity.sh +++ b/tasks/codegen-parity.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#MISE description="Parity gate: Rust eql-codegen output matches the int4 golden (byte-for-byte)" +#MISE description="Parity gate: Rust eql-codegen output matches the committed goldens (byte-for-byte, every catalog type)" set -euo pipefail @@ -9,34 +9,47 @@ cd "$REPO_ROOT" echo "==> Generating with the Rust generator (writes the real repo tree)" cargo run -q -p eql-codegen -- > /dev/null -echo "==> Comparing int4 generated SQL file SET vs golden (catches extra/dropped files)" -# The content loop below is golden-driven: it verifies every golden file has a -# matching generated body, so a DROPPED file fails there. It cannot see an EXTRA -# generated file (a new template output, or the new half of a rename) — that name -# is never iterated. Assert the sets are equal first to close that blind spot. -# "Generated" excludes any committed, hand-written SQL (e.g. int4_extensions.sql), -# which lives in this dir but has no golden counterpart; git-tracked == hand-written. -# find (not `ls *.sql`) so an empty dir yields zero lines instead of aborting -# under `set -e`; `-maxdepth 1` + sed strips the leading `./` for bare names. -golden_set=$(cd tests/codegen/reference/int4 \ - && find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) -gen_set=$(cd src/v3/scalars/int4 \ - && comm -23 <(find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) \ - <(git ls-files . | sed 's#.*/##' | LC_ALL=C sort)) -if [ "$golden_set" != "$gen_set" ]; then - echo "int4 generated SQL file set differs from golden (< golden, > generated):" >&2 - diff <(echo "$golden_set") <(echo "$gen_set") >&2 || true - exit 1 -fi - -echo "==> Diffing Rust int4 SQL vs golden reference (byte-for-byte)" -for f in tests/codegen/reference/int4/*.sql; do - name="$(basename "$f")" - # Drop the 1-line `-- REFERENCE:` provenance line, then compare the remaining - # bytes EXACTLY. Both the reference body (from line 2) and the whole generated - # file start with the template-owned `-- AUTOMATICALLY GENERATED FILE.` marker, - # so no header strip is needed — any whitespace or blank-line drift fails here. - diff <(tail -n +2 "$f") "src/v3/scalars/int4/$name" +# Every catalog type has a committed golden under tests/codegen/reference//, +# generated once. Discover them (each subdir is one token) and gate each against +# its generated counterpart. The Rust gate (crates/eql-codegen/tests/parity.rs, +# reference_dirs_match_catalog_tokens) asserts this dir set equals the catalog +# token set, so a new type with no golden fails there. +tokens=$(find tests/codegen/reference -mindepth 1 -maxdepth 1 -type d \ + | sed 's#.*/##' | LC_ALL=C sort) + +for token in $tokens; do + ref_dir="tests/codegen/reference/$token" + gen_dir="src/v3/scalars/$token" + + echo "==> [$token] Comparing generated SQL file SET vs golden (catches extra/dropped files)" + # The content loop below is golden-driven: it verifies every golden file has a + # matching generated body, so a DROPPED file fails there. It cannot see an EXTRA + # generated file (a new template output, or the new half of a rename) — that name + # is never iterated. Assert the sets are equal first to close that blind spot. + # "Generated" excludes any committed, hand-written SQL (e.g. _extensions.sql), + # which lives in this dir but has no golden counterpart; git-tracked == hand-written. + # find (not `ls *.sql`) so an empty dir yields zero lines instead of aborting + # under `set -e`; `-maxdepth 1` + sed strips the leading `./` for bare names. + golden_set=$(cd "$ref_dir" \ + && find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) + gen_set=$(cd "$gen_dir" \ + && comm -23 <(find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) \ + <(git ls-files . | sed 's#.*/##' | LC_ALL=C sort)) + if [ "$golden_set" != "$gen_set" ]; then + echo "[$token] generated SQL file set differs from golden (< golden, > generated):" >&2 + diff <(echo "$golden_set") <(echo "$gen_set") >&2 || true + exit 1 + fi + + echo "==> [$token] Diffing Rust SQL vs golden reference (byte-for-byte)" + for f in "$ref_dir"/*.sql; do + name="$(basename "$f")" + # Drop the 1-line `-- REFERENCE:` provenance line, then compare the remaining + # bytes EXACTLY. Both the reference body (from line 2) and the whole generated + # file start with the template-owned `-- AUTOMATICALLY GENERATED FILE.` marker, + # so no header strip is needed — any whitespace or blank-line drift fails here. + diff <(tail -n +2 "$f") "$gen_dir/$name" + done done -echo "PARITY OK: Rust generator matches the int4 golden (byte-for-byte)." +echo "PARITY OK: Rust generator matches every committed golden (byte-for-byte)." diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index fb2de7207..f873ec0ac 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -1,27 +1,29 @@ # Codegen reference -The SQL files under `int4/` are the hand-maintained golden reference for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). `int4` is the **single golden master**: the generator is type-generic — its templates are pure token substitution driven by the `eql_scalars::CATALOG` rows (`crates/eql-scalars/src/lib.rs`) — so one anchored type detects all template/term drift for every current and future scalar. +The SQL files under `/` (`int4/`, `int2/`, `int8/`, `date/`, `timestamptz/`, `text/`) are the committed golden reference for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). **Every catalog type has a golden**, generated once from a known-good run and committed. Although the generator is type-generic — its templates are pure token substitution driven by the `eql_scalars::CATALOG` rows (`crates/eql-scalars/src/lib.rs`) — the per-type domain *shapes* differ (ordered types carry `_ord`/`_ord_ore` + aggregates; `timestamptz` is equality-only; `text` carries the Bloom `text_match` domain whose `@>`/`<@` render as supported containment operators), so anchoring every type catches a regression in any shape, not just the ordered one. Each reference file's first line is a `-- REFERENCE:` provenance marker; everything after it is the generated body verbatim, starting with the template-owned `-- AUTOMATICALLY GENERATED FILE.` header. -The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the real `src/v3/scalars/int4/` tree) and asserts its output matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same reference: +The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the real `src/v3/scalars//` trees) and asserts its output matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same references: -- `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate. It first compares the generated `int4` SQL *file set* against the golden `*.sql` set (`comm -23` against `git ls-files` excludes the committed, hand-written `int4_extensions.sql`, which has no golden counterpart) to catch extra/dropped files, then `diff`s each golden file against its generated counterpart after `tail -n +2` drops the provenance line. Any whitespace or blank-line drift fails — there is no normalization. -- `crates/eql-codegen/tests/parity.rs` (`rust_generator_matches_int4_golden_files`) — runs `generate_all` into a temp dir and byte-compares the materialised `int4` SQL surface against the same golden. -- the in-crate golden tests in `crates/eql-codegen/src/generate.rs` — byte-compare each `render_*_file` output against the corresponding reference. +- `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate. It discovers the reference token dirs, and for each first compares the generated SQL *file set* against the golden `*.sql` set (`comm -23` against `git ls-files` excludes any committed, hand-written `_extensions.sql`, which has no golden counterpart) to catch extra/dropped files, then `diff`s each golden file against its generated counterpart after `tail -n +2` drops the provenance line. Any whitespace or blank-line drift fails — there is no normalization. +- `crates/eql-codegen/tests/parity.rs` — `rust_generator_matches_golden_files` runs `generate_all` into a temp dir and byte-compares every materialised token surface against its golden; `generate_all_is_deterministic_across_runs` asserts two runs are byte-identical; `reference_dirs_match_catalog_tokens` asserts the committed reference dir set **equals** the `eql_scalars::CATALOG` token set. +- the in-crate golden test in `crates/eql-codegen/src/generate.rs` (`generator_matches_reference_goldens`) — byte-compares each `render_*_file` output against the corresponding reference, for every token. -The golden reference, not any retired generator, is the sole oracle. If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (commit the new `int4` reference in the same PR). +The golden reference, not any retired generator, is the sole oracle. If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (regenerate and commit the new references in the same PR). See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §6 for the full generator story (catalog source of truth, minijinja templates, term capabilities). -## No committed fixture values +## Adding or updating a reference -Plaintext fixture lists are **not** generated and **not** committed as `_values.rs` files — there are none in the tree. They live in the catalog as `eql_scalars::INT4_VALUES` / `INT2_VALUES`, materialised at compile time by the `int_values!` macro in `crates/eql-scalars/src/lib.rs` from each `CATALOG` row, and pinned by `eql-scalars`'s own `values_tests`. The parity gate only globs `*.sql`; it does not check any `values.rs`. +Every catalog token **must** have a committed `tests/codegen/reference//` dir — `reference_dirs_match_catalog_tokens` fails CI if a catalog row has no golden, or a golden has no catalog row. To (re)generate: -## New scalar types do not add a reference +1. `cargo run -p eql-codegen` — writes the real `src/v3/scalars//` tree (gitignored). +2. For each generated `*.sql`, copy it into `tests/codegen/reference//` with a single `-- REFERENCE:` provenance line prepended as line 1. +3. Run `mise run codegen:parity` (or `cargo test -p eql-codegen`) to confirm byte-for-byte parity. -Adding a scalar type (`int2`, `int8`, …) does **not** add a `tests/codegen/reference//` directory. A per-type baseline would be redundant: the SQL is byte-identical to `int4` modulo the type token, so it can only fail when `int4`'s baseline already would. New types are guaranteed three other ways: +A deliberate generator change (template/term/catalog edit) regenerates the affected references in the same PR. -- the `int4` reference here anchors the shared generator (templates + the `Term` enum's capability `impl`s in `crates/eql-scalars`); -- a catalog row plus the compiler and `eql-scalars`'s `#[test]`/`values_tests` over `CATALOG` validate the new type's spec and materialised value list; -- the SQLx `ordered_numeric_matrix!` suite exercises the generated SQL's *behaviour* against a real database — a far stronger guarantee than a byte comparison — and `mise run test:matrix:inventory` reconciles the matrix test-name set against the single canonical, token-normalized `tests/sqlx/snapshots/matrix_tests.txt` (cross-checked against `eql-codegen list-types`) with no database required. +## No committed fixture values + +Plaintext fixture lists are **not** generated and **not** committed as `_values.rs` files — there are none in the tree. They live in the catalog as `eql_scalars::INT4_VALUES` / `INT2_VALUES`, materialised at compile time by the `int_values!` macro in `crates/eql-scalars/src/lib.rs` from each `CATALOG` row, and pinned by `eql-scalars`'s own `values_tests`. The parity gate only globs `*.sql`; it does not check any `values.rs`. diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index a592ffdfc..839fac8a8 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -12,12 +12,21 @@ modulo the type token (the matrix tests are macro-generated from one single canonical set plus a per-type normalize-and-compare carries the same signal at a fraction of the committed surface. -There is also **no** separate snapshot for equality-only types. An eq-only -scalar (`scalar_matrix! { caps = [eq] }`, e.g. `timestamptz`) emits exactly the -ordered name set MINUS the ord-only lines, so the inventory **derives** its -expected set from this one baseline — `matrix_tests.txt` minus every line -matching `_ord` / `order_by` / `routes_through_ob`. The baseline file itself is -always the ordered (`caps = [eq, ord]`) shape. +For equality-only types there is a second committed snapshot, +`matrix_tests_eq_only.txt`. An eq-only scalar (`scalar_matrix! { caps = [eq] }`, +e.g. `timestamptz`) emits exactly the ordered name set MINUS the ord-only lines, +so this file is **derived** from `matrix_tests.txt` (minus every line matching +`_ord` / `order_by` / `routes_through_ob`) — but it is committed and pinned: the +inventory gate re-derives the set at runtime and asserts it equals this +committed file, so a change to the ordered baseline or the strip filter that +alters the eq-only set fails until the snapshot is deliberately regenerated. +Eq-only types are then matched against the committed snapshot. The +`matrix_tests.txt` baseline itself is always the ordered (`caps = [eq, ord]`) +shape. Regenerate the eq-only snapshot with: + +``` +grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u > snapshots/matrix_tests_eq_only.txt +``` The "no per-type variation" property is preserved by design: every ordered scalar sweeps the same three `OrderedScalar` pivots (`min`/`mid`/`max`), so the diff --git a/tests/sqlx/snapshots/matrix_tests_eq_only.txt b/tests/sqlx/snapshots/matrix_tests_eq_only.txt new file mode 100644 index 000000000..1a66c5567 --- /dev/null +++ b/tests/sqlx/snapshots/matrix_tests_eq_only.txt @@ -0,0 +1,51 @@ +scalars::::matrix__eq_aggregate_typecheck_max +scalars::::matrix__eq_aggregate_typecheck_min +scalars::::matrix__eq_contained_by_blocker +scalars::::matrix__eq_contains_blocker +scalars::::matrix__eq_count_distinct_extractor +scalars::::matrix__eq_count_path_cast +scalars::::matrix__eq_count_typed_column +scalars::::matrix__eq_eq_pivot_max_correctness +scalars::::matrix__eq_eq_pivot_max_cross_shape +scalars::::matrix__eq_eq_pivot_mid_correctness +scalars::::matrix__eq_eq_pivot_mid_cross_shape +scalars::::matrix__eq_eq_pivot_min_correctness +scalars::::matrix__eq_eq_pivot_min_cross_shape +scalars::::matrix__eq_eq_supported_null +scalars::::matrix__eq_gt_blocker +scalars::::matrix__eq_gte_blocker +scalars::::matrix__eq_index_engages_btree +scalars::::matrix__eq_index_engages_hash +scalars::::matrix__eq_lt_blocker +scalars::::matrix__eq_lte_blocker +scalars::::matrix__eq_native_absent_ops +scalars::::matrix__eq_neq_pivot_max_correctness +scalars::::matrix__eq_neq_pivot_max_cross_shape +scalars::::matrix__eq_neq_pivot_mid_correctness +scalars::::matrix__eq_neq_pivot_mid_cross_shape +scalars::::matrix__eq_neq_pivot_min_correctness +scalars::::matrix__eq_neq_pivot_min_cross_shape +scalars::::matrix__eq_neq_supported_null +scalars::::matrix__eq_path_op_blockers +scalars::::matrix__eq_payload_check +scalars::::matrix__eq_planner_metadata_eq +scalars::::matrix__eq_sanity +scalars::::matrix__eq_typed_column_blocker +scalars::::matrix__fixture_shape +scalars::::matrix__storage_aggregate_typecheck_max +scalars::::matrix__storage_aggregate_typecheck_min +scalars::::matrix__storage_contained_by_blocker +scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_path_cast +scalars::::matrix__storage_count_typed_column +scalars::::matrix__storage_eq_blocker +scalars::::matrix__storage_gt_blocker +scalars::::matrix__storage_gte_blocker +scalars::::matrix__storage_lt_blocker +scalars::::matrix__storage_lte_blocker +scalars::::matrix__storage_native_absent_ops +scalars::::matrix__storage_neq_blocker +scalars::::matrix__storage_path_op_blockers +scalars::::matrix__storage_payload_check +scalars::::matrix__storage_sanity +scalars::::matrix__storage_typed_column_blocker diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 25ad3605a..b7d168412 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -681,3 +681,34 @@ pub async fn assert_null(pool: &PgPool, sql: &str, binds: &[Option<&str>]) -> Re pub fn blocker_msg(domain: &str, op: &str) -> String { format!("operator {op} is not supported for {domain}") } + +#[cfg(test)] +mod helper_panic_tests { + use super::*; + + // The cross-shape arm only ever passes the six comparison operators to these + // helpers; an unexpected symbol is a harness bug and must fail loudly rather + // than silently mis-route a row set. These pin that guard. + + #[test] + fn commute_op_maps_the_six_comparisons() { + assert_eq!(commute_op("="), "="); + assert_eq!(commute_op("<>"), "<>"); + assert_eq!(commute_op("<"), ">"); + assert_eq!(commute_op("<="), ">="); + assert_eq!(commute_op(">"), "<"); + assert_eq!(commute_op(">="), "<="); + } + + #[test] + #[should_panic(expected = "commute_op: unsupported operator")] + fn commute_op_panics_on_unsupported() { + let _ = commute_op("@>"); + } + + #[test] + #[should_panic(expected = "expected_forward: unsupported operator")] + fn expected_forward_panics_on_unsupported() { + let _ = ::expected_forward("@>", 0); + } +} From dcd559aa02230f78242cdbfc96ed02ab315aaaa5 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 11:01:59 +1000 Subject: [PATCH 130/599] style(crates): apply cargo fmt to eql-codegen sources and parity test --- crates/eql-codegen/src/context.rs | 8 +++++++- crates/eql-codegen/src/generate.rs | 9 +-------- crates/eql-codegen/tests/parity.rs | 7 ++++++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 857622a3f..ece6d49b8 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -147,7 +147,13 @@ pub fn extractor_entry(term: Term) -> FnEntry { /// Build an inlinable comparison-wrapper entry for a supported operator. /// `dom` is the schema-qualified domain name; `op` is the already-resolved /// operator (the caller iterates `OPERATORS`, so no symbol re-lookup is needed). -pub fn wrapper_entry(dom: &str, op: &Operator, arg_a: &str, arg_b: &str, extractor: &str) -> FnEntry { +pub fn wrapper_entry( + dom: &str, + op: &Operator, + arg_a: &str, + arg_b: &str, + extractor: &str, +) -> FnEntry { FnEntry::Wrapper { op: op.symbol.to_string(), function_name: op.function_name.to_string(), diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index eefa23bb5..24f57f474 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -93,13 +93,7 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { let rendered = sig.render(&dom); if is_supported(op.symbol) { if let Some(ex) = extractor { - entries.push(wrapper_entry( - &dom, - op, - &rendered.left, - &rendered.right, - ex, - )); + entries.push(wrapper_entry(&dom, op, &rendered.left, &rendered.right, ex)); continue; } } @@ -399,7 +393,6 @@ mod tests { ); } - #[test] fn generate_type_writes_expected_files() { let d = crate::writer::test_support::tempdir(); diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index 1b5584e8c..8d6a0c512 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -146,7 +146,12 @@ fn generate_all_is_deterministic_across_runs() { if path.is_dir() { stack.push(path); } else if path.extension().and_then(|x| x.to_str()) == Some("sql") { - let rel = path.strip_prefix(&base).unwrap().to_str().unwrap().to_string(); + let rel = path + .strip_prefix(&base) + .unwrap() + .to_str() + .unwrap() + .to_string(); files.push((rel, fs::read_to_string(&path).unwrap())); } } From c5cc8fe35da8835cd0e7478c793c52c927ce8699 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 11:14:55 +1000 Subject: [PATCH 131/599] docs(codegen): rename "golden" terminology to "reference SQL files" Sweep prose, comments, scripts, mise descriptions, and test identifiers to use the codebase's existing "reference" vocabulary (the dir is already tests/codegen/reference/). Renames the parity test functions rust_generator_matches_golden_files -> rust_generator_matches_reference_files and generator_matches_reference_goldens -> generator_matches_reference_files, plus the shell golden_set -> reference_set, with all cross-references updated. --- crates/eql-codegen/src/context.rs | 2 +- crates/eql-codegen/src/generate.rs | 8 ++--- crates/eql-codegen/src/lib.rs | 2 +- crates/eql-codegen/src/operator_surface.rs | 2 +- crates/eql-codegen/tests/parity.rs | 29 ++++++++++--------- crates/eql-scalars/src/tests.rs | 4 +-- .../adding-a-scalar-encrypted-domain-type.md | 20 ++++++------- mise.toml | 2 +- tasks/codegen-parity.sh | 24 +++++++-------- tests/codegen/reference/README.md | 12 ++++---- 10 files changed, 53 insertions(+), 52 deletions(-) diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index ece6d49b8..bb31f418b 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -336,7 +336,7 @@ mod tests { Some("COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel"), ), // ... but suppressed when `@>` is a blocker (non-Bloom domains), - // which is why the int4 golden is unchanged. + // which is why the int4 reference is unchanged. ("@>", "eql_v3.int4_eq", false, None), ]; diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 24f57f474..c8880e4e0 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -359,14 +359,14 @@ mod tests { tokens } - /// Byte-compare every `render_*_file` output against its committed golden, + /// Byte-compare every `render_*_file` output against its committed reference, /// for **every** catalog type with a reference dir (not just int4). This is - /// the in-crate golden gate over the render functions directly (the + /// the in-crate reference gate over the render functions directly (the /// integration `parity.rs` gate runs `generate_all` to disk). The reference /// dirs are cross-checked against the catalog by `parity.rs`'s /// `reference_dirs_match_catalog_tokens`. #[test] - fn generator_matches_reference_goldens() { + fn generator_matches_reference_files() { let root = repo_root(); let mut checked = 0; for token in reference_tokens(&root) { @@ -382,7 +382,7 @@ mod tests { let actual = rendered_for(&token, &name, s); assert_eq!( actual, expected, - "{token}/{name}: generator diverged from golden reference" + "{token}/{name}: generator diverged from reference" ); checked += 1; } diff --git a/crates/eql-codegen/src/lib.rs b/crates/eql-codegen/src/lib.rs index bc1fd9d11..be49bc48f 100644 --- a/crates/eql-codegen/src/lib.rs +++ b/crates/eql-codegen/src/lib.rs @@ -1,6 +1,6 @@ //! Scalar encrypted-domain SQL generator. Renders the `eql-scalars` catalog to //! the gitignored SQL surface, validated byte-for-byte against the per-token -//! goldens under `tests/codegen/reference//` (modulo the one +//! reference SQL files under `tests/codegen/reference//` (modulo the one //! `-- REFERENCE:` provenance line each reference file carries). The plaintext //! fixture lists the SQLx matrix consumes live in the catalog itself //! (`eql_scalars::INT4_VALUES` / `INT2_VALUES`), not in a generated file. diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index ea0b24c9a..2445eb557 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -36,7 +36,7 @@ impl OperatorMetadata { /// present (e.g. the path-selector operators, which carry no metadata). /// /// The emission order (COMMUTATOR, NEGATOR, RESTRICT, JOIN) is **load-bearing - /// for the golden byte-match** — reordering these blocks changes generated + /// for the reference byte-match** — reordering these blocks changes generated /// SQL and breaks the parity gate. Keep it fixed regardless of struct field /// order. pub fn render(self) -> Option { diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index 8d6a0c512..b9e21dd93 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -1,11 +1,12 @@ //! THE PARITY GATE. Runs the Rust generator (into a temp dir) and asserts the -//! generated SQL surface is byte-for-byte equal to the committed golden under -//! `tests/codegen/reference//` (modulo the one leading `-- REFERENCE:` -//! provenance line). Every catalog type has a committed golden, generated once; -//! the golden — not the retired Python generator — is the sole oracle. The -//! reference dirs are *discovered* dynamically and cross-checked against -//! `eql_scalars::CATALOG`, so a new catalog type with no golden (or a stale -//! golden with no catalog row) fails here. The plaintext fixture lists are not +//! generated SQL surface is byte-for-byte equal to the committed reference SQL +//! files under `tests/codegen/reference//` (modulo the one leading +//! `-- REFERENCE:` provenance line). Every catalog type has a committed +//! reference, generated once; the reference — not the retired Python generator +//! — is the sole oracle. The reference dirs are *discovered* dynamically and +//! cross-checked against `eql_scalars::CATALOG`, so a new catalog type with no +//! reference (or a stale reference with no catalog row) fails here. The +//! plaintext fixture lists are not //! generated; they live in the catalog (`eql_scalars::INT4_VALUES` / //! `INT2_VALUES`) and are pinned by `eql-scalars`'s own `values_tests`. @@ -85,16 +86,16 @@ fn reference_dirs_match_catalog_tokens() { assert_eq!( refs, catalog, "committed reference dirs must equal the catalog token set: a new \ - catalog type needs a committed `tests/codegen/reference//` golden \ + catalog type needs a committed `tests/codegen/reference//` reference \ (generate it with `cargo run -p eql-codegen` and prepend a `-- REFERENCE:` \ - line), and a stale golden with no catalog row must be removed" + line), and a stale reference with no catalog row must be removed" ); } #[test] -fn rust_generator_matches_golden_files() { +fn rust_generator_matches_reference_files() { let root = repo_root(); - let out = tempdir("rust-golden"); + let out = tempdir("rust-reference"); eql_codegen::generate::generate_all(out.path()).expect("rust generate_all"); for token in reference_tokens(&root) { @@ -109,7 +110,7 @@ fn rust_generator_matches_golden_files() { let gen_names = sql_names(&gen_dir); assert_eq!( gen_names, ref_names, - "{token}: generated .sql file set differs from golden reference set \ + "{token}: generated .sql file set differs from reference set \ (reference: {ref_names:?}, generated: {gen_names:?})" ); @@ -119,7 +120,7 @@ fn rust_generator_matches_golden_files() { let actual = fs::read_to_string(gen_dir.join(name)).unwrap(); assert_eq!( actual, expected, - "{token}/{name}: materialised output differs from golden" + "{token}/{name}: materialised output differs from reference" ); } } @@ -173,7 +174,7 @@ fn generate_all_is_deterministic_across_runs() { } /// Both Rust strippers (the in-crate `strip_reference_marker` and this file's -/// golden test) skip a variable number of leading `-- REFERENCE:` lines, while +/// reference test) skip a variable number of leading `-- REFERENCE:` lines, while /// the shell gate skips exactly one with `tail -n +2`. They agree only while /// every reference file carries exactly one marker line — make that explicit /// across every committed reference dir. diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index e440148d3..ce12668e4 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -633,8 +633,8 @@ mod values_tests { /// Every materialised `_VALUES` array equals its catalog row's fixtures, /// resolved per kind, in order. Computed from the fixtures — no hardcoded /// expected array — so it cannot drift and adding a type needs only one - /// `check(&INTx, INTx_VALUES)` line, not a duplicated golden list. Subsumes - /// the old per-type `_values_materialise_to_typed_array` goldens and + /// `check(&INTx, INTx_VALUES)` line, not a duplicated reference list. Subsumes + /// the old per-type `_values_materialise_to_typed_array` references and /// `materialised_values_track_their_fixture_lists`. fn check>(spec: &ScalarSpec, values: &[T]) { assert_eq!( diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index f909f90ca..8e159c476 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -58,7 +58,7 @@ Things you do **not** do: renderers are the source of truth. Change the catalog and rebuild — never hand-edit generated SQL. - **Don't add a `tests/codegen/reference//` baseline.** `int4` is the sole - golden master (§4). + reference (§4). - **Don't edit `mise.toml`, the CI workflow, `pin_search_path.sql`, or `splinter.sh`** for an ordinary type — they recognise the generated surface intrinsically (§5, §6). The exception is a brand-new *term* whose extractor @@ -395,7 +395,7 @@ Run, in order: The CI codegen job is a prerequisite of the PostgreSQL test matrix, so generated-SQL drift is caught before database tests run. -**Commit a per-type golden baseline.** Every catalog type **must** have a +**Commit a per-type reference baseline.** Every catalog type **must** have a committed `tests/codegen/reference//` baseline, generated once and checked in (see `tests/codegen/reference/README.md` for the regenerate-and-commit recipe). The generator is type-generic, but per-type domain *shapes* differ — ordered @@ -403,8 +403,8 @@ types carry `_ord`/`_ord_ore` + aggregates, equality-only types (`timestamptz`) omit them, and the Bloom `text_match` domain renders `@>`/`<@` as supported containment operators no ordered type emits — so anchoring every type catches a regression in any shape, not just the ordered one. `reference_dirs_match_catalog_tokens` -(in `crates/eql-codegen/tests/parity.rs`) fails CI if a catalog row has no golden -or a golden has no catalog row. Drift protection is further reinforced by the +(in `crates/eql-codegen/tests/parity.rs`) fails CI if a catalog row has no reference +or a reference has no catalog row. Drift protection is further reinforced by the catalog `values_tests` pinning the materialised `_VALUES`, the catalog/generator `#[test]`s, and the `scalar_matrix!` SQLx suite (behaviour, not bytes). @@ -733,16 +733,16 @@ clippy ... -D warnings`. - **The parity gate** — `mise run codegen:parity` (`tasks/codegen-parity.sh`). It runs the generator into the real tree, then for **every** committed reference token dir (1) compares that type's generated SQL **file set** against - the golden under `tests/codegen/reference//*.sql`, excluding committed + the reference under `tests/codegen/reference//*.sql`, excluding committed hand-written files (`comm -23` of `ls` against `git ls-files`), so an extra or - dropped generated file fails; and (2) diffs each golden file **byte-for-byte** - against its generated counterpart, after dropping the golden's single leading + dropped generated file fails; and (2) diffs each reference file **byte-for-byte** + against its generated counterpart, after dropping the reference's single leading `-- REFERENCE:` provenance line (`tail -n +2`). The same byte-for-byte assertion runs in-crate as `crates/eql-codegen/tests/parity.rs` - (`rust_generator_matches_golden_files`), alongside + (`rust_generator_matches_reference_files`), alongside `generate_all_is_deterministic_across_runs` (two runs are byte-identical) and `reference_dirs_match_catalog_tokens` (reference dirs == catalog tokens). The - golden reference — not any Python oracle — is the sole contract that survives + reference SQL files — not any Python oracle — are the sole contract that survives generator refactors. CI runs these in three jobs in `.github/workflows/test-eql.yml`: `rust-crates` @@ -757,7 +757,7 @@ Adding a new **term** is a bigger move than adding a type: edit the `Term` enum' term introduces** — its extractor *and* its comparison wrappers, plus any new SEM constructor (adding `Bloom` required `match_term`, `contains`, `contained_by`, and the SEM `bloom_filter`) — and, because it changes the generated surface, -regenerate and commit the affected golden references under +regenerate and commit the affected reference files under `tests/codegen/reference//`. --- diff --git a/mise.toml b/mise.toml index 9c7528b4e..912950b58 100644 --- a/mise.toml +++ b/mise.toml @@ -103,7 +103,7 @@ cargo test --test payload_schema_tests """ [tasks."codegen:parity"] -description = "Parity gate: Rust eql-codegen output matches the int4 golden (byte-for-byte)" +description = "Parity gate: Rust eql-codegen output matches the int4 reference SQL files (byte-for-byte)" dir = "{{config_root}}" run = "bash tasks/codegen-parity.sh" diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh index 41439e436..8dad670a6 100755 --- a/tasks/codegen-parity.sh +++ b/tasks/codegen-parity.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#MISE description="Parity gate: Rust eql-codegen output matches the committed goldens (byte-for-byte, every catalog type)" +#MISE description="Parity gate: Rust eql-codegen output matches the committed reference SQL files (byte-for-byte, every catalog type)" set -euo pipefail @@ -9,11 +9,11 @@ cd "$REPO_ROOT" echo "==> Generating with the Rust generator (writes the real repo tree)" cargo run -q -p eql-codegen -- > /dev/null -# Every catalog type has a committed golden under tests/codegen/reference//, +# Every catalog type has a committed reference under tests/codegen/reference//, # generated once. Discover them (each subdir is one token) and gate each against # its generated counterpart. The Rust gate (crates/eql-codegen/tests/parity.rs, # reference_dirs_match_catalog_tokens) asserts this dir set equals the catalog -# token set, so a new type with no golden fails there. +# token set, so a new type with no reference fails there. tokens=$(find tests/codegen/reference -mindepth 1 -maxdepth 1 -type d \ | sed 's#.*/##' | LC_ALL=C sort) @@ -21,27 +21,27 @@ for token in $tokens; do ref_dir="tests/codegen/reference/$token" gen_dir="src/v3/scalars/$token" - echo "==> [$token] Comparing generated SQL file SET vs golden (catches extra/dropped files)" - # The content loop below is golden-driven: it verifies every golden file has a + echo "==> [$token] Comparing generated SQL file SET vs reference (catches extra/dropped files)" + # The content loop below is reference-driven: it verifies every reference file has a # matching generated body, so a DROPPED file fails there. It cannot see an EXTRA # generated file (a new template output, or the new half of a rename) — that name # is never iterated. Assert the sets are equal first to close that blind spot. # "Generated" excludes any committed, hand-written SQL (e.g. _extensions.sql), - # which lives in this dir but has no golden counterpart; git-tracked == hand-written. + # which lives in this dir but has no reference counterpart; git-tracked == hand-written. # find (not `ls *.sql`) so an empty dir yields zero lines instead of aborting # under `set -e`; `-maxdepth 1` + sed strips the leading `./` for bare names. - golden_set=$(cd "$ref_dir" \ + reference_set=$(cd "$ref_dir" \ && find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) gen_set=$(cd "$gen_dir" \ && comm -23 <(find . -maxdepth 1 -name '*.sql' | sed 's#.*/##' | LC_ALL=C sort) \ <(git ls-files . | sed 's#.*/##' | LC_ALL=C sort)) - if [ "$golden_set" != "$gen_set" ]; then - echo "[$token] generated SQL file set differs from golden (< golden, > generated):" >&2 - diff <(echo "$golden_set") <(echo "$gen_set") >&2 || true + if [ "$reference_set" != "$gen_set" ]; then + echo "[$token] generated SQL file set differs from reference (< reference, > generated):" >&2 + diff <(echo "$reference_set") <(echo "$gen_set") >&2 || true exit 1 fi - echo "==> [$token] Diffing Rust SQL vs golden reference (byte-for-byte)" + echo "==> [$token] Diffing Rust SQL vs reference (byte-for-byte)" for f in "$ref_dir"/*.sql; do name="$(basename "$f")" # Drop the 1-line `-- REFERENCE:` provenance line, then compare the remaining @@ -52,4 +52,4 @@ for token in $tokens; do done done -echo "PARITY OK: Rust generator matches every committed golden (byte-for-byte)." +echo "PARITY OK: Rust generator matches every committed reference (byte-for-byte)." diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index f873ec0ac..0b7de96b9 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -1,22 +1,22 @@ # Codegen reference -The SQL files under `/` (`int4/`, `int2/`, `int8/`, `date/`, `timestamptz/`, `text/`) are the committed golden reference for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). **Every catalog type has a golden**, generated once from a known-good run and committed. Although the generator is type-generic — its templates are pure token substitution driven by the `eql_scalars::CATALOG` rows (`crates/eql-scalars/src/lib.rs`) — the per-type domain *shapes* differ (ordered types carry `_ord`/`_ord_ore` + aggregates; `timestamptz` is equality-only; `text` carries the Bloom `text_match` domain whose `@>`/`<@` render as supported containment operators), so anchoring every type catches a regression in any shape, not just the ordered one. +The SQL files under `/` (`int4/`, `int2/`, `int8/`, `date/`, `timestamptz/`, `text/`) are the committed reference SQL files for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). **Every catalog type has a reference**, generated once from a known-good run and committed. Although the generator is type-generic — its templates are pure token substitution driven by the `eql_scalars::CATALOG` rows (`crates/eql-scalars/src/lib.rs`) — the per-type domain *shapes* differ (ordered types carry `_ord`/`_ord_ore` + aggregates; `timestamptz` is equality-only; `text` carries the Bloom `text_match` domain whose `@>`/`<@` render as supported containment operators), so anchoring every type catches a regression in any shape, not just the ordered one. Each reference file's first line is a `-- REFERENCE:` provenance marker; everything after it is the generated body verbatim, starting with the template-owned `-- AUTOMATICALLY GENERATED FILE.` header. The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the real `src/v3/scalars//` trees) and asserts its output matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same references: -- `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate. It discovers the reference token dirs, and for each first compares the generated SQL *file set* against the golden `*.sql` set (`comm -23` against `git ls-files` excludes any committed, hand-written `_extensions.sql`, which has no golden counterpart) to catch extra/dropped files, then `diff`s each golden file against its generated counterpart after `tail -n +2` drops the provenance line. Any whitespace or blank-line drift fails — there is no normalization. -- `crates/eql-codegen/tests/parity.rs` — `rust_generator_matches_golden_files` runs `generate_all` into a temp dir and byte-compares every materialised token surface against its golden; `generate_all_is_deterministic_across_runs` asserts two runs are byte-identical; `reference_dirs_match_catalog_tokens` asserts the committed reference dir set **equals** the `eql_scalars::CATALOG` token set. -- the in-crate golden test in `crates/eql-codegen/src/generate.rs` (`generator_matches_reference_goldens`) — byte-compares each `render_*_file` output against the corresponding reference, for every token. +- `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate. It discovers the reference token dirs, and for each first compares the generated SQL *file set* against the reference `*.sql` set (`comm -23` against `git ls-files` excludes any committed, hand-written `_extensions.sql`, which has no reference counterpart) to catch extra/dropped files, then `diff`s each reference file against its generated counterpart after `tail -n +2` drops the provenance line. Any whitespace or blank-line drift fails — there is no normalization. +- `crates/eql-codegen/tests/parity.rs` — `rust_generator_matches_reference_files` runs `generate_all` into a temp dir and byte-compares every materialised token surface against its reference; `generate_all_is_deterministic_across_runs` asserts two runs are byte-identical; `reference_dirs_match_catalog_tokens` asserts the committed reference dir set **equals** the `eql_scalars::CATALOG` token set. +- the in-crate reference test in `crates/eql-codegen/src/generate.rs` (`generator_matches_reference_files`) — byte-compares each `render_*_file` output against the corresponding reference, for every token. -The golden reference, not any retired generator, is the sole oracle. If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (regenerate and commit the new references in the same PR). +The reference SQL files, not any retired generator, are the sole oracle. If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (regenerate and commit the new references in the same PR). See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §6 for the full generator story (catalog source of truth, minijinja templates, term capabilities). ## Adding or updating a reference -Every catalog token **must** have a committed `tests/codegen/reference//` dir — `reference_dirs_match_catalog_tokens` fails CI if a catalog row has no golden, or a golden has no catalog row. To (re)generate: +Every catalog token **must** have a committed `tests/codegen/reference//` dir — `reference_dirs_match_catalog_tokens` fails CI if a catalog row has no reference, or a reference has no catalog row. To (re)generate: 1. `cargo run -p eql-codegen` — writes the real `src/v3/scalars//` tree (gitignored). 2. For each generated `*.sql`, copy it into `tests/codegen/reference//` with a single `-- REFERENCE:` provenance line prepended as line 1. From 24420616327ac00540c9407ad46fa842ee29f608 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 11:46:10 +1000 Subject: [PATCH 132/599] refactor(codegen): collapse AUTO_GENERATED_HEADER into the marker AUTO_GENERATED_HEADER was a #[cfg(test)]-only duplicate of AUTO_GENERATED_MARKER + "\n", kept in sync by two dedicated tests. Drop it: tests now build file bodies with format!("{AUTO_GENERATED_MARKER}\n...") and the lone starts_with check appends the newline inline. One source of truth, no behavior change. --- crates/eql-codegen/src/consts.rs | 24 +++++++----------------- crates/eql-codegen/src/generate.rs | 2 +- crates/eql-codegen/src/writer.rs | 17 ++++++++--------- tests/sqlx/snapshots/README.md | 2 +- 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 16d627782..af0cd309a 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -1,17 +1,11 @@ //! AUTO-GENERATED headers, schema constants, and SQL-string escaping. /// SQL generated-file marker — the header's first line, with no trailing -/// newline. The writer uses it to recognise files it owns (overwrite/clean -/// safety) without re-splitting the header on every call. +/// newline. The SQL templates emit it (followed by a newline) as line 1, and the +/// writer uses it to recognise files it owns (overwrite/clean safety). Tests that +/// synthesise file bodies append `\n` to form the full header line. pub(crate) const AUTO_GENERATED_MARKER: &str = "-- AUTOMATICALLY GENERATED FILE."; -/// SQL generated-file header (marker + newline). The SQL templates emit this as -/// their first line; production code recognises files via [`AUTO_GENERATED_MARKER`], -/// so this full-header const is only needed by tests that synthesise file bodies. -/// Kept in lockstep with the marker by `header_is_marker_plus_newline`. -#[cfg(test)] -pub(crate) const AUTO_GENERATED_HEADER: &str = "-- AUTOMATICALLY GENERATED FILE.\n"; - /// The single schema housing the self-contained `eql_v3` surface: the /// encrypted-domain families AND the SEM index-term types/constructors they /// call. v3 has zero dependency on `eql_v2`, so domains and core index-term @@ -38,14 +32,10 @@ mod tests { fn sql_marker_is_grep_compatible_single_line() { // The `^-- AUTOMATICALLY GENERATED FILE` marker is what // tasks/docs/validate/{coverage,required-tags}.sh grep on to skip - // generated SQL — keep this assertion and that grep in lockstep. - assert_eq!(AUTO_GENERATED_HEADER, "-- AUTOMATICALLY GENERATED FILE.\n"); - assert!(AUTO_GENERATED_HEADER.contains("AUTOMATICALLY GENERATED FILE")); - } - - #[test] - fn header_is_marker_plus_newline() { - assert_eq!(AUTO_GENERATED_HEADER, format!("{AUTO_GENERATED_MARKER}\n")); + // generated SQL — keep this assertion and that grep in lockstep. The + // marker is a single line with no embedded newline (tests append `\n`). + assert_eq!(AUTO_GENERATED_MARKER, "-- AUTOMATICALLY GENERATED FILE."); + assert!(!AUTO_GENERATED_MARKER.contains('\n')); } #[test] diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index c8880e4e0..af6c9cbca 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -416,7 +416,7 @@ mod tests { for p in &written { assert!(fs::read_to_string(p) .unwrap() - .starts_with(crate::consts::AUTO_GENERATED_HEADER)); + .starts_with(&format!("{}\n", crate::consts::AUTO_GENERATED_MARKER))); } } diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index 63f0f26c1..93d6b4489 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -140,13 +140,12 @@ pub(crate) mod test_support { mod tests { use super::test_support::tempdir as tmp; use super::*; - use crate::consts::AUTO_GENERATED_HEADER; #[test] fn is_generated_true_for_header() { let d = tmp(); let p = d.path().join("x.sql"); - fs::write(&p, format!("{AUTO_GENERATED_HEADER}SELECT 1;\n")).unwrap(); + fs::write(&p, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); assert!(is_generated(&p)); } @@ -173,7 +172,7 @@ mod tests { let p = d.path().join("int4_types.sql"); // The template render carries the marker on line 1; the writer writes it // through unchanged. - let body = format!("{AUTO_GENERATED_HEADER}DO $$ BEGIN END $$;\n"); + let body = format!("{AUTO_GENERATED_MARKER}\nDO $$ BEGIN END $$;\n"); write_generated_file(&p, &body).unwrap(); let text = fs::read_to_string(&p).unwrap(); assert_eq!(text, body); @@ -213,7 +212,7 @@ mod tests { let hand = d.path().join("int4_eq_functions.sql"); fs::write( &generated, - format!("{AUTO_GENERATED_HEADER}-- old generated\n"), + format!("{AUTO_GENERATED_MARKER}\n-- old generated\n"), ) .unwrap(); fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); @@ -227,8 +226,8 @@ mod tests { fn write_overwrites_existing_generated_file() { let d = tmp(); let p = d.path().join("int4_types.sql"); - fs::write(&p, format!("{AUTO_GENERATED_HEADER}-- old content\n")).unwrap(); - write_generated_file(&p, &format!("{AUTO_GENERATED_HEADER}-- new content\n")).unwrap(); + fs::write(&p, format!("{AUTO_GENERATED_MARKER}\n-- old content\n")).unwrap(); + write_generated_file(&p, &format!("{AUTO_GENERATED_MARKER}\n-- new content\n")).unwrap(); let text = fs::read_to_string(&p).unwrap(); assert!(text.contains("-- new content")); assert!(!text.contains("-- old content")); @@ -240,8 +239,8 @@ mod tests { let gen1 = d.path().join("int4_eq_functions.sql"); let gen2 = d.path().join("int4_old_domain_functions.sql"); let hand = d.path().join("int4_jsonb_extra.sql"); - fs::write(&gen1, format!("{AUTO_GENERATED_HEADER}SELECT 1;\n")).unwrap(); - fs::write(&gen2, format!("{AUTO_GENERATED_HEADER}SELECT 2;\n")).unwrap(); + fs::write(&gen1, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); + fs::write(&gen2, format!("{AUTO_GENERATED_MARKER}\nSELECT 2;\n")).unwrap(); fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); let removed = clean_generated_files(d.path()).unwrap(); assert!(!gen1.exists()); @@ -265,7 +264,7 @@ mod tests { let blocker = d.path().join("not-a-dir"); fs::write(&blocker, "i am a file\n").unwrap(); let target = blocker.join("int4_types.sql"); // parent is a file - let body = format!("{AUTO_GENERATED_HEADER}DO $$ BEGIN END $$;\n"); + let body = format!("{AUTO_GENERATED_MARKER}\nDO $$ BEGIN END $$;\n"); let err = write_generated_file(&target, &body).unwrap_err(); assert!(matches!(err, WriteError::Io(_)), "expected Io, got {err:?}"); assert!(err.to_string().starts_with("io error: ")); diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 839fac8a8..6a2bde216 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -24,7 +24,7 @@ Eq-only types are then matched against the committed snapshot. The `matrix_tests.txt` baseline itself is always the ordered (`caps = [eq, ord]`) shape. Regenerate the eq-only snapshot with: -``` +```bash grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u > snapshots/matrix_tests_eq_only.txt ``` From 3b23d088422c3a7a8abcc15955e33c711eaf98c1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:03:04 +1000 Subject: [PATCH 133/599] build(ci): add cargo-nextest to mise tools for sharded sqlx suite --- mise.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mise.toml b/mise.toml index 912950b58..35d8f2b68 100644 --- a/mise.toml +++ b/mise.toml @@ -11,6 +11,10 @@ "rust" = { version = "latest", components = "rustc,rust-std,cargo,rustfmt,rust-docs,clippy" } "cargo:cargo-binstall" = "latest" "cargo:sqlx-cli" = "latest" +# Installed via the already-present cargo-binstall (fast in CI). Drives the +# sharded sqlx suite: `cargo nextest archive` builds the test binaries once and +# `cargo nextest run --partition hash:K/N` runs a stable hash-partitioned shard. +"cargo:cargo-nextest" = "latest" # Single source of truth for the cargo-expand version used by `test:matrix:expand`. # Pinned in lockstep with the nightly date in that task: cargo-expand drives the # rustfmt pass, so an unpinned version can drift the matrix snapshot even with a From 8851052788d86b04e02f1da632252fcb2d75895e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:03:56 +1000 Subject: [PATCH 134/599] build(ci): add test:sqlx:archive (build-once nextest archive) --- mise.toml | 10 ++++++++++ tasks/test/sqlx-archive.sh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tasks/test/sqlx-archive.sh diff --git a/mise.toml b/mise.toml index 35d8f2b68..00623b9a9 100644 --- a/mise.toml +++ b/mise.toml @@ -99,6 +99,16 @@ run = """ cargo watch -x test """ +[tasks."test:sqlx:archive"] +description = "Build EQL + compile the sqlx test binaries once into a reusable nextest archive" +# `build` produces release/cipherstash-encrypt.sql, uploaded alongside the +# archive and consumed by every shard. This mirrors test:sqlx:prep (mise.toml:51): +# the `#MISE depends` directive in the script is inert under `bash tasks/...`, so +# the dependency MUST be declared here. +depends = ["build"] +dir = "{{config_root}}" +run = "bash tasks/test/sqlx-archive.sh" + [tasks."test:schema"] description = "Validate sample payloads against the v2.2 / v2.3 JSON Schemas (no database required)" dir = "{{config_root}}/tests/sqlx" diff --git a/tasks/test/sqlx-archive.sh b/tasks/test/sqlx-archive.sh new file mode 100644 index 000000000..b91c2ade0 --- /dev/null +++ b/tasks/test/sqlx-archive.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# NOTE: this script is invoked via `bash tasks/...` from an inline mise task, so +# `#MISE` directives here would be INERT (they only fire when mise auto-discovers +# a script as a file-task). The `build` dependency is therefore declared on the +# inline [tasks."test:sqlx:archive"] block (Step 2), mirroring test:sqlx:prep. + +# bash is pinned via the shebang (mise honors a `#!` first line) so pipefail is +# available regardless of the runner's /bin/sh. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO_ROOT" + +# Archive lands at the repo root so the workflow can upload it by a stable path. +ARCHIVE="${NEXTEST_ARCHIVE:-nextest.tar.zst}" + +# The mise task's `depends = ["build"]` (Step 2) has already produced +# release/cipherstash-encrypt.sql. Belt-and-braces: fail loudly if it's missing +# (e.g. the script is run directly rather than via `mise run test:sqlx:archive`). +test -f release/cipherstash-encrypt.sql \ + || { echo "release/cipherstash-encrypt.sql missing — run via 'mise run test:sqlx:archive' (it depends on build)" >&2; exit 2; } + +# Compile every tests/sqlx test binary with DEFAULT features and pack them. +# No database is touched here — archive only compiles. The shards apply the live +# Postgres + migration at run time. +echo "==> archiving sqlx test binaries to ${ARCHIVE}" +cd tests/sqlx +cargo nextest archive --archive-file "${REPO_ROOT}/${ARCHIVE}" + +echo "==> archive written: ${REPO_ROOT}/${ARCHIVE}" From 21e85103bb315aa2d7f8e145b664bacbe3e26144 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:04:22 +1000 Subject: [PATCH 135/599] build(ci): add test:sqlx:partition (run one shard from archive) --- mise.toml | 5 +++++ tasks/test/sqlx-partition.sh | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 tasks/test/sqlx-partition.sh diff --git a/mise.toml b/mise.toml index 00623b9a9..84ded29b7 100644 --- a/mise.toml +++ b/mise.toml @@ -109,6 +109,11 @@ depends = ["build"] dir = "{{config_root}}" run = "bash tasks/test/sqlx-archive.sh" +[tasks."test:sqlx:partition"] +description = "Run one hash partition of the sqlx suite from a prebuilt nextest archive (SHARD / SHARD_TOTAL env)" +dir = "{{config_root}}" +run = "bash tasks/test/sqlx-partition.sh" + [tasks."test:schema"] description = "Validate sample payloads against the v2.2 / v2.3 JSON Schemas (no database required)" dir = "{{config_root}}/tests/sqlx" diff --git a/tasks/test/sqlx-partition.sh b/tasks/test/sqlx-partition.sh new file mode 100644 index 000000000..8829dfafb --- /dev/null +++ b/tasks/test/sqlx-partition.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +#MISE description="Run one hash partition of the sqlx suite from a prebuilt nextest archive" + +# bash is pinned via the shebang so pipefail is available on dash-based runners. +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO_ROOT" + +# Required: which shard (1-based) and how many shards total. +: "${SHARD:?SHARD (1-based shard index) must be set}" +: "${SHARD_TOTAL:?SHARD_TOTAL (number of shards) must be set}" +ARCHIVE="${NEXTEST_ARCHIVE:-nextest.tar.zst}" + +test -f "${ARCHIVE}" \ + || { echo "archive ${ARCHIVE} missing — run test:sqlx:archive / download the artifact first" >&2; exit 2; } +test -f release/cipherstash-encrypt.sql \ + || { echo "release/cipherstash-encrypt.sql missing — download the build-archive artifact first" >&2; exit 2; } + +# 1. Install the built EQL into the SQLx migration set (same as test:sqlx:prep, +# but WITHOUT rebuilding — the SQL comes from the build-archive artifact). +echo "==> installing built EQL into tests/sqlx/migrations/001_install_eql.sql" +cp release/cipherstash-encrypt.sql tests/sqlx/migrations/001_install_eql.sql + +# 2. Migrate this shard's own Postgres. +echo "==> running sqlx migrations" +(cd tests/sqlx && sqlx migrate run) + +# 3. Regenerate the gitignored per-test fixtures for THIS shard's DB. Not in the +# archive/artifact (see plan Task 3 header); needs CS_* + a live PG. +echo "==> regenerating SQLx fixtures for this shard" +mise run fixture:generate:all + +# 4. Run this partition from the prebuilt archive. Default features (matching the +# archive). `hash:` is stable across test add/remove (see design decision 4). +echo "==> running nextest partition hash:${SHARD}/${SHARD_TOTAL}" +cd tests/sqlx +cargo nextest run \ + --archive-file "${REPO_ROOT}/${ARCHIVE}" \ + --workspace-remap "${REPO_ROOT}" \ + --partition "hash:${SHARD}/${SHARD_TOTAL}" From 55d5d891f522b67e06fafa24258f5863d3de2344 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:15:49 +1000 Subject: [PATCH 136/599] ci: shard sqlx suite, build-once archive, merge-queue full matrix, ci-required gate --- .github/workflows/test-eql.yml | 414 ++++++++++++++++++++++----------- 1 file changed, 279 insertions(+), 135 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 776d701a8..37fad833a 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -1,31 +1,17 @@ name: "Test EQL" + +# NB: NO path filter at on: level. A workflow skipped by a path/branch filter +# leaves its required checks stuck Pending and blocks merge. Relevance is +# computed by the `changes` job and applied per-job via `if:` instead. +# +# NB: NO `push:` trigger. Under a required merge queue, push-to-main validation +# is redundant — the queue already validated the exact merge commit, and branch +# protection blocks direct pushes. (Resolves the design's ambiguous "light jobs +# only on push:main" sanity net by dropping the trigger entirely.) on: - push: - branches: - - main - paths: - - ".github/workflows/test-eql.yml" - - "src/**/*.sql" - - "sql/**/*.sql" - - "tests/**/*" - - "tasks/**/*" - - "crates/**" - - "Cargo.toml" - - "Cargo.lock" - - pull_request: - # run on all pull requests - paths: - - ".github/workflows/test-eql.yml" - - "src/**/*.sql" - - "sql/**/*.sql" - - "tests/**/*" - - "tasks/**/*" - - "crates/**" - - "Cargo.toml" - - "Cargo.lock" - - workflow_dispatch: + pull_request: {} + merge_group: {} # required pre-merge gate; runs the full matrix + workflow_dispatch: {} # manual runs use the PR shape (PG17 x 4 shards) env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" @@ -38,11 +24,190 @@ defaults: permissions: contents: read +# PRs cancel superseded runs; the merge queue must NOT cancel — a cancelled +# merge_group run never reports a final status and ejects the PR from the queue. +concurrency: + group: test-eql-${{ github.event_name }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: - schema: - name: "JSON Schema validation" + # Runs on EVERY event and MUST always succeed (never skipped, never failed) — + # downstream heavy jobs `needs: [changes]`, and a skipped/failed `changes` + # would either skip the merge-queue matrix or deadlock `ci-required`. + changes: + name: "Detect relevant changes" + runs-on: ubuntu-latest + outputs: + relevant: ${{ steps.r.outputs.relevant }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + + # Diff ONLY on pull_request, where a base ref is well-defined. On + # merge_group/workflow_dispatch the base ref is absent and the filter errors/empties. + - id: f + if: github.event_name == 'pull_request' + uses: dorny/paths-filter@v3 + with: + filters: | + relevant: + - ".github/workflows/test-eql.yml" + - "src/**" + - "sql/**" + - "tests/**" + - "tasks/**" + - "crates/**" + - "Cargo.toml" + - "Cargo.lock" + + # Explicit default (not `|| 'true'`, which trips GitHub's inconsistent + # treatment of the string 'false'). merge_group/workflow_dispatch never + # read this value — their downstream `if:` branch ignores `relevant` — but + # default true is the safe value regardless. + - id: r + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + echo "relevant=${{ steps.f.outputs.relevant }}" >> "$GITHUB_OUTPUT" + else + echo "relevant=true" >> "$GITHUB_OUTPUT" + fi + + # Pure bash; no checkout/toolchain. Derives the PG-version + shard fan-out + # from the event: PR -> PG17 x 4 shards; merge queue -> PG 14-17 x 2 shards. + setup: + name: "Compute matrix" + runs-on: ubuntu-latest + outputs: + pg-versions: ${{ steps.cfg.outputs.pg }} + shard-total: ${{ steps.cfg.outputs.shard_total }} + shards: ${{ steps.cfg.outputs.shards }} + steps: + - id: cfg + run: | + if [ "${{ github.event_name }}" = "merge_group" ]; then + echo 'pg=[14,15,16,17]' >> "$GITHUB_OUTPUT" + echo 'shard_total=2' >> "$GITHUB_OUTPUT" + echo 'shards=[1,2]' >> "$GITHUB_OUTPUT" + else + echo 'pg=[17]' >> "$GITHUB_OUTPUT" + echo 'shard_total=4' >> "$GITHUB_OUTPUT" + echo 'shards=[1,2,3,4]' >> "$GITHUB_OUTPUT" + fi + + # Compile the test binaries ONCE. Runs in the queue and on workflow_dispatch + # always, and on PRs only when relevant files changed (docs-only PRs never pay + # the ~4-min compile). + build-archive: + name: "Build test archive" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests + + - name: Build EQL + archive test binaries + run: | + mise run test:sqlx:archive + + - uses: actions/upload-artifact@v4 + with: + name: nextest-archive + path: | + nextest.tar.zst + release/cipherstash-encrypt.sql + retention-days: 1 + if-no-files-found: error + + # Sharded sqlx suite. No longer needs [schema, codegen] (gate removed) — + # shards start right after build-archive. + test: + name: "Shard PG${{ matrix.postgres-version }} ${{ matrix.shard }}/${{ needs.setup.outputs.shard-total }}" + needs: [changes, setup, build-archive] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') + runs-on: ubuntu-latest-m + strategy: + fail-fast: false + matrix: + postgres-version: ${{ fromJSON(needs.setup.outputs.pg-versions) }} + shard: ${{ fromJSON(needs.setup.outputs.shards) }} + env: + POSTGRES_VERSION: ${{ matrix.postgres-version }} + SHARD: ${{ matrix.shard }} + SHARD_TOTAL: ${{ needs.setup.outputs.shard-total }} + # CS_* are required for per-shard fixture regeneration (see plan Task 3). + # This repo does not accept fork PRs, so the secrets-on-pull_request + # constraint does not apply — leave the block unconditional. + CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} + CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} + CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} + CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} + steps: + # Checkout path MUST be identical to build-archive so the archive's + # workspace remap lines up (design: archive<->commit coupling). + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests + + - uses: actions/download-artifact@v4 + with: + name: nextest-archive + + - name: Setup database (Postgres ${{ matrix.postgres-version }}) + run: | + mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" + - name: Run shard ${{ matrix.shard }}/${{ needs.setup.outputs.shard-total }} + run: | + mise run test:sqlx:partition + + # docs:validate + Clean-DB v3 install smoke. Both are version-relevant, so + # they follow the event's PG set (PG17 on PR; 14-17 in the queue). Moved out + # of the old per-version test job so they run ONCE per version, not per shard. + validate: + name: "Validate (Postgres ${{ matrix.postgres-version }})" + needs: [changes, setup] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') + runs-on: ubuntu-latest-m + strategy: + fail-fast: false + matrix: + postgres-version: ${{ fromJSON(needs.setup.outputs.pg-versions) }} + env: + POSTGRES_VERSION: ${{ matrix.postgres-version }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -59,32 +224,68 @@ jobs: workspaces: . shared-key: sqlx-tests + - name: Setup database (Postgres ${{ matrix.postgres-version }}) + run: | + mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" + + - name: Validate SQL documentation (Postgres ${{ matrix.postgres-version }}) + run: | + mise run docs:validate + + - name: Clean-DB v3 install smoke (Postgres ${{ matrix.postgres-version }}) + run: | + mise run build + mise run test:clean_install_v3 + + schema: + name: "JSON Schema validation" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests - name: Validate v2.2 / v2.3 payload schemas run: | mise run test:schema rust-crates: name: "Rust workspace crates" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') runs-on: ubuntu-latest - steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false - - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true cache: true - - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: workspaces: . shared-key: sqlx-tests - - # fmt + clippy + test for the std-only catalog/generator crates. No - # Postgres: these never touch a database, so they run standalone and fast. + # `mise run test:crates` runs `cargo fmt --check` at the workspace root, + # which covers tests/sqlx (a workspace member). This subsumes the old + # standalone `test:lint` step that the removed per-version test job ran. - name: Compile, lint and test the Rust workspace crates run: | export active_rust_toolchain=$(rustup show active-toolchain | cut -d' ' -f1) @@ -93,184 +294,105 @@ jobs: codegen: name: "Encrypted-domain codegen" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') runs-on: ubuntu-latest - steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false - - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true cache: true - - # Shared with the sibling Rust jobs so the eql-codegen build artifacts the - # parity gate needs are reused rather than rebuilt from scratch. - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: workspaces: . shared-key: sqlx-tests - - # Crate compile/lint/test (cargo test -p eql-scalars -p eql-codegen) runs - # in the dedicated `test:crates` job; this job covers the codegen-specific - # gate only — golden parity. The plaintext fixture lists are no longer a - # generated file: they live in the catalog (`eql_scalars::INT4_VALUES` / - # `INT2_VALUES`) and are pinned by `eql-scalars`'s own unit tests, so there - # is nothing to regenerate-and-diff here. - - # Parity gate: assert the Rust eql-codegen output is line-normalized-equal - # to the int4 golden reference. Python is no longer an oracle (retired in - # P2). No Postgres needed — the generator runs offline. - name: Verify generator parity (golden) run: | mise run codegen:parity self-contained-v3: name: "eql_v3 self-containment" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') runs-on: ubuntu-latest - steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false - - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true cache: true - - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: workspaces: . shared-key: sqlx-tests - - # Build to materialise release/cipherstash-encrypt-v3.sql and - # src/deps-ordered-v3.txt, then assert no eql_v2 symbol/file leakage. - name: Build EQL run: mise run --force build - - name: Assert eql_v3 is self-contained run: mise run test:self_contained_v3 matrix-coverage: name: "Matrix coverage inventory" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') runs-on: ubuntu-latest - steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false - - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true cache: true - - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: workspaces: . shared-key: sqlx-tests - - # Verify the matrix test-name set against the SINGLE canonical snapshot - # (snapshots/matrix_tests.txt) with the SAME pinned feature set the local - # task uses (`--no-default-features`, scale excluded), and cross-check the - # binary's discovered type set against `eql-codegen list-types`. A coverage - # change shows up as a diff in the snapshot; a catalog type missing its - # matrix wiring fails the cross-check. No Postgres needed: `--list` only - # enumerates, the suite uses runtime queries. - name: Verify the matrix test-name inventory run: | mise run test:matrix:inventory - # Diff the whole snapshots/ directory so the single canonical file - # isn't hardcoded here; the mise task discovers the type set from the - # binary and reconciles it against `eql-codegen list-types`. git add -N tests/sqlx/snapshots git diff --exit-code -- tests/sqlx/snapshots \ || { echo "Coverage inventory stale — run 'mise run test:matrix:inventory' and commit."; exit 1; } - test: - name: "Test & Validate EQL (Postgres ${{ matrix.postgres-version }})" - runs-on: ubuntu-latest-m - needs: [schema, codegen] - - strategy: - fail-fast: false - matrix: - postgres-version: [17, 16, 15, 14] - - env: - POSTGRES_VERSION: ${{ matrix.postgres-version }} - # CS_* are required for `mise run test:sqlx` to regenerate the - # cipherstash-client-encrypted fixtures before the suite runs. - # This repository does not accept fork PRs, so the secrets-on- - # `pull_request` constraint that breaks the fork CI flow does not - # apply here — leave the env block unconditional. - CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} - CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} - CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} - CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} - - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - persist-credentials: false - - - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 - with: - version: 2026.4.0 - install: true # [default: true] run `mise install` - cache: true # [default: true] cache mise using GitHub's cache - - - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 - with: - workspaces: . - shared-key: sqlx-tests - - - name: Setup database (Postgres ${{ matrix.postgres-version }}) - run: | - mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" - - - name: Validate SQL documentation (Postgres ${{ matrix.postgres-version }}) - run: | - mise run docs:validate - - - name: Test EQL for Postgres ${{ matrix.postgres-version }} - run: | - export active_rust_toolchain=$(rustup show active-toolchain | cut -d' ' -f1) - rustup component add --toolchain ${active_rust_toolchain} rustfmt clippy - mise run --output prefix test --postgres ${POSTGRES_VERSION} - - - name: Clean-DB v3 install smoke (Postgres ${{ matrix.postgres-version }}) - run: | - mise run build - mise run test:clean_install_v3 - splinter: name: "Supabase splinter" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') runs-on: ubuntu-latest-m - env: POSTGRES_VERSION: "17" - steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false - - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 with: version: 2026.4.0 install: true cache: true - - name: Setup database run: | mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" - - name: Build and install EQL run: | mise run --output prefix --force build @@ -278,9 +400,31 @@ jobs: | docker exec -i postgres-${POSTGRES_VERSION} \ psql -v ON_ERROR_STOP=1 \ postgresql://cipherstash:password@localhost/cipherstash -f- - - name: Run splinter run: | mise run --output prefix test:splinter --postgres ${POSTGRES_VERSION} - + # The ONE required status check. Stable name on every event, so branch + # protection never references an event-dependent leaf name (which would + # deadlock). Passes iff every needed job is success or skipped. Treating + # skipped as pass is intentional: heavy jobs are legitimately skipped on + # docs-only PRs, and a genuine failure is still caught because the FAILING + # source job is itself in `needs` and reports failure. + ci-required: + name: "CI required" + needs: [changes, setup, build-archive, test, validate, schema, rust-crates, + codegen, self-contained-v3, matrix-coverage, splinter] + if: always() + runs-on: ubuntu-latest + steps: + - name: Assert all required jobs passed or were skipped + run: | + results='${{ join(needs.*.result, ' ') }}' + echo "needed results: $results" + for r in $results; do + case "$r" in + success|skipped) ;; + *) echo "gate fail: a needed job reported '$r'"; exit 1 ;; + esac + done + echo "ci-required: all needed jobs passed or were skipped" From 88a592648c8797f8333d9ed640120dc75bb74832 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:17:10 +1000 Subject: [PATCH 137/599] build(ci): gitignore the transient nextest.tar.zst archive --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 83ee4c424..048045e06 100644 --- a/.gitignore +++ b/.gitignore @@ -252,3 +252,7 @@ src/deps-ordered-protect.txt # Cargo workspace root build artifacts /target/ + +# Prebuilt nextest archive (transient build-once output for the sharded sqlx +# suite; uploaded as a CI artifact, never committed — see tasks/test/sqlx-archive.sh) +nextest.tar.zst From 8751bdb8a9bb69680d139d334b16c58ff3a0740a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 12:44:39 +1000 Subject: [PATCH 138/599] fix(ci): generate fixtures+migration in build-archive before nextest archive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sqlx::test embeds the per-type fixtures and 001_install_eql.sql migration into the test binaries via include_str! at COMPILE time, so they must exist before 'cargo nextest archive' runs — not just at shard run time. test:sqlx:archive now depends on test:sqlx:prep (build + cp migration + migrate + fixture:generate:all) and the build-archive job runs postgres:up + carries CS_* creds. Validated from a clean checkout (removed fixtures/migration, rebuilt archive, ran a shard green). --- .github/workflows/test-eql.yml | 17 +++++++++++++++++ mise.toml | 15 ++++++++++----- tasks/test/sqlx-archive.sh | 27 ++++++++++++++++++--------- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 37fad833a..773c1c143 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -106,6 +106,19 @@ jobs: || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') runs-on: ubuntu-latest + env: + # test:sqlx:archive depends on test:sqlx:prep, which copies the built EQL + # into migrations/, applies it to a live Postgres, and regenerates the + # per-type fixtures — both are include_str!'d into the test binaries at + # COMPILE time, so they must exist before `cargo nextest archive`. Fixture + # generation needs a live PG with EQL installed (the postgres:up step + # below) plus CS_* creds. This repo does not accept fork PRs, so the + # secrets-on-pull_request constraint does not apply — block is unconditional. + POSTGRES_VERSION: "17" + CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} + CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} + CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} + CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -122,6 +135,10 @@ jobs: workspaces: . shared-key: sqlx-tests + - name: Setup database (Postgres 17) + run: | + mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" + - name: Build EQL + archive test binaries run: | mise run test:sqlx:archive diff --git a/mise.toml b/mise.toml index 84ded29b7..934856c4a 100644 --- a/mise.toml +++ b/mise.toml @@ -101,11 +101,16 @@ cargo watch -x test [tasks."test:sqlx:archive"] description = "Build EQL + compile the sqlx test binaries once into a reusable nextest archive" -# `build` produces release/cipherstash-encrypt.sql, uploaded alongside the -# archive and consumed by every shard. This mirrors test:sqlx:prep (mise.toml:51): -# the `#MISE depends` directive in the script is inert under `bash tasks/...`, so -# the dependency MUST be declared here. -depends = ["build"] +# Depends on test:sqlx:prep (NOT just build): `#[sqlx::test(fixtures(scripts(…)))]` +# embeds the per-type fixture SQL AND the 001_install_eql.sql migration into the +# compiled test binaries via `include_str!` at COMPILE time. So the fixtures + +# migration must exist on disk BEFORE `cargo nextest archive` compiles — prep +# produces both (build → cp migration → sqlx migrate → fixture:generate:all). +# Consequence: this task needs a live Postgres + CS_* creds (prep's +# fixture:generate:all prerequisites), so the build-archive CI job runs +# postgres:up and carries the CS_* env. The `#MISE depends` directive in the +# script is inert under `bash tasks/...`, so the dependency MUST be declared here. +depends = ["test:sqlx:prep"] dir = "{{config_root}}" run = "bash tasks/test/sqlx-archive.sh" diff --git a/tasks/test/sqlx-archive.sh b/tasks/test/sqlx-archive.sh index b91c2ade0..93addb08d 100644 --- a/tasks/test/sqlx-archive.sh +++ b/tasks/test/sqlx-archive.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash # NOTE: this script is invoked via `bash tasks/...` from an inline mise task, so # `#MISE` directives here would be INERT (they only fire when mise auto-discovers -# a script as a file-task). The `build` dependency is therefore declared on the -# inline [tasks."test:sqlx:archive"] block (Step 2), mirroring test:sqlx:prep. +# a script as a file-task). The `test:sqlx:prep` dependency is therefore declared +# on the inline [tasks."test:sqlx:archive"] block. # bash is pinned via the shebang (mise honors a `#!` first line) so pipefail is # available regardless of the runner's /bin/sh. @@ -14,15 +14,24 @@ cd "$REPO_ROOT" # Archive lands at the repo root so the workflow can upload it by a stable path. ARCHIVE="${NEXTEST_ARCHIVE:-nextest.tar.zst}" -# The mise task's `depends = ["build"]` (Step 2) has already produced -# release/cipherstash-encrypt.sql. Belt-and-braces: fail loudly if it's missing -# (e.g. the script is run directly rather than via `mise run test:sqlx:archive`). +# The mise task's `depends = ["test:sqlx:prep"]` has already produced +# release/cipherstash-encrypt.sql, copied it to migrations/001_install_eql.sql, +# and regenerated the per-type fixtures. These are NOT optional: the sqlx::test +# macros `include_str!` the migration + fixtures into the compiled binaries at +# COMPILE time, so they must be on disk before `cargo nextest archive` runs. +# Belt-and-braces: fail loudly if any are missing (e.g. the script was run +# directly, or without a live Postgres + CS_* for fixture generation). test -f release/cipherstash-encrypt.sql \ - || { echo "release/cipherstash-encrypt.sql missing — run via 'mise run test:sqlx:archive' (it depends on build)" >&2; exit 2; } + || { echo "release/cipherstash-encrypt.sql missing — run via 'mise run test:sqlx:archive' (it depends on test:sqlx:prep)" >&2; exit 2; } +test -f tests/sqlx/migrations/001_install_eql.sql \ + || { echo "tests/sqlx/migrations/001_install_eql.sql missing — prep did not run (needs a live Postgres)" >&2; exit 2; } +ls tests/sqlx/fixtures/eql_v2_*.sql >/dev/null 2>&1 \ + || { echo "tests/sqlx/fixtures/eql_v2_*.sql missing — fixture:generate:all did not run (needs Postgres + CS_* creds)" >&2; exit 2; } -# Compile every tests/sqlx test binary with DEFAULT features and pack them. -# No database is touched here — archive only compiles. The shards apply the live -# Postgres + migration at run time. +# Compile every tests/sqlx test binary with DEFAULT features and pack them. The +# migration + fixtures (embedded via include_str at compile time) are baked into +# the archive, so the shards consume them without regenerating. The shards still +# need their own live Postgres for sqlx::test's per-test scratch databases. echo "==> archiving sqlx test binaries to ${ARCHIVE}" cd tests/sqlx cargo nextest archive --archive-file "${REPO_ROOT}/${ARCHIVE}" From 6894ebf4ac323308615f8dcf9e3d9328ba537bdb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 13:07:17 +1000 Subject: [PATCH 139/599] fix(ci): ship all release/*.sql variants in the build-archive artifact build_validation_tests read cipherstash-encrypt{,-protect,-protect-uninstall, -v3,-v3-uninstall}.sql from ../../release at runtime (std::fs, not embedded), and release/ is gitignored so the shard checkout has none of them. The artifact only carried the main installer, so those tests failed on every shard. Upload the full release/*.sql set (build-archive's prep already generated it via 'mise run build'). docs/reference/schema/*.json (read by payload_schema_tests) are committed, so no artifact change is needed for those. --- .github/workflows/test-eql.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 773c1c143..13bc7c8ad 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -143,12 +143,17 @@ jobs: run: | mise run test:sqlx:archive + # Ship ALL release variants, not just the main installer: the + # build_validation_tests read cipherstash-encrypt{,-protect,-protect-uninstall, + # -v3,-v3-uninstall}.sql from ../../release at RUN time (std::fs, not embedded), + # and release/ is gitignored so the shard checkout has none of them. `mise run + # build` (via prep) produced the whole set in build-archive. - uses: actions/upload-artifact@v4 with: name: nextest-archive path: | nextest.tar.zst - release/cipherstash-encrypt.sql + release/*.sql retention-days: 1 if-no-files-found: error From 381a3b26fd85481c065c53feb34d99dd9efbac61 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 13:32:10 +1000 Subject: [PATCH 140/599] =?UTF-8?q?perf(ci):=20run=20shards=20straight=20f?= =?UTF-8?q?rom=20the=20archive=20=E2=80=94=20no=20per-shard=20recompile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shard's fixture:generate:all ran 'cargo test --features fixture-gen', forcing a full compile of the cipherstash-client/sqlx tree on EVERY shard and defeating the build-once archive. Since build-archive now embeds the fixtures + migration into the binaries (include_str! at compile time), the shard needs none of that: drop the cp-migration / sqlx-migrate / fixture-regen steps and the CS_* env, and just run 'cargo nextest run --archive-file --partition'. sqlx::test applies the embedded migration+fixtures to its own scratch DBs against the job's Postgres. Validated from a clean-room shard simulation (no source fixtures/migration on disk, only the archive + release/*.sql): 348/348 passed, 0 'Compiling' lines. --- .github/workflows/test-eql.yml | 11 ++++------- tasks/test/sqlx-partition.sh | 34 +++++++++++++++------------------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 13bc7c8ad..1d98259dc 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -176,13 +176,10 @@ jobs: POSTGRES_VERSION: ${{ matrix.postgres-version }} SHARD: ${{ matrix.shard }} SHARD_TOTAL: ${{ needs.setup.outputs.shard-total }} - # CS_* are required for per-shard fixture regeneration (see plan Task 3). - # This repo does not accept fork PRs, so the secrets-on-pull_request - # constraint does not apply — leave the block unconditional. - CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} - CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} - CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} - CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} + # No CS_* here: the shard runs the prebuilt archive (fixtures + migration + # embedded by build-archive), so it does not regenerate fixtures and needs + # no credentials. It only needs the live Postgres (below) for sqlx::test's + # per-test scratch databases and the release/*.sql from the artifact. steps: # Checkout path MUST be identical to build-archive so the archive's # workspace remap lines up (design: archive<->commit coupling). diff --git a/tasks/test/sqlx-partition.sh b/tasks/test/sqlx-partition.sh index 8829dfafb..7252cb10b 100644 --- a/tasks/test/sqlx-partition.sh +++ b/tasks/test/sqlx-partition.sh @@ -14,26 +14,22 @@ ARCHIVE="${NEXTEST_ARCHIVE:-nextest.tar.zst}" test -f "${ARCHIVE}" \ || { echo "archive ${ARCHIVE} missing — run test:sqlx:archive / download the artifact first" >&2; exit 2; } -test -f release/cipherstash-encrypt.sql \ - || { echo "release/cipherstash-encrypt.sql missing — download the build-archive artifact first" >&2; exit 2; } -# 1. Install the built EQL into the SQLx migration set (same as test:sqlx:prep, -# but WITHOUT rebuilding — the SQL comes from the build-archive artifact). -echo "==> installing built EQL into tests/sqlx/migrations/001_install_eql.sql" -cp release/cipherstash-encrypt.sql tests/sqlx/migrations/001_install_eql.sql - -# 2. Migrate this shard's own Postgres. -echo "==> running sqlx migrations" -(cd tests/sqlx && sqlx migrate run) - -# 3. Regenerate the gitignored per-test fixtures for THIS shard's DB. Not in the -# archive/artifact (see plan Task 3 header); needs CS_* + a live PG. -echo "==> regenerating SQLx fixtures for this shard" -mise run fixture:generate:all - -# 4. Run this partition from the prebuilt archive. Default features (matching the -# archive). `hash:` is stable across test add/remove (see design decision 4). -echo "==> running nextest partition hash:${SHARD}/${SHARD_TOTAL}" +# The archive already carries everything compiled-in: build-archive ran prep +# (build → cp 001_install_eql.sql → sqlx migrate → fixture:generate:all) BEFORE +# `cargo nextest archive`, so the migration AND the per-type fixtures are +# include_str!'d into the binaries. The shard therefore does NOT re-run prep or +# regenerate fixtures — doing so would force a full `cargo test` compile on every +# shard (defeating the build-once archive) for no effect, since sqlx::test uses +# the embedded copies. `sqlx::test` provisions its own per-test scratch databases +# against the live Postgres (the job's postgres:up step) and applies the embedded +# migrations + fixtures to each. +# +# The only on-disk runtime dependency is release/*.sql (read by +# build_validation_tests via std::fs); those arrive with the downloaded artifact. +# release/ is NOT touched here — no cp, no migrate, no CS_* — the shard just runs +# the prebuilt binaries. +echo "==> running nextest partition hash:${SHARD}/${SHARD_TOTAL} from ${ARCHIVE}" cd tests/sqlx cargo nextest run \ --archive-file "${REPO_ROOT}/${ARCHIVE}" \ From e62aff7b2624dd7ae74d929faee6b0b0106da824 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 9 Jun 2026 14:23:11 +1000 Subject: [PATCH 141/599] perf(ci): keep the heavy dep cache + trim CI debuginfo Two Rust CI compile-time fixes for the test-eql workflow: - Only build-archive saves the shared rust-cache key. All jobs shared shared-key: sqlx-tests, so the first job to finish won the (immutable) save. Light jobs (codegen ~18s, self-containment ~26s, rust-crates ~32s) beat build-archive (~10m), saving a ~136 MiB deps-less target/. Result: build-archive recompiled tokio/ring/ore-rs/sqlx/cipherstash-client every run. save-if: false on the seven light jobs makes build-archive the sole saver, so the full compiled tree is what gets cached. - CARGO_INCREMENTAL=0 + CARGO_PROFILE_DEV_DEBUG=line-tables-only (CI-only): clean CI builds never reuse incremental state (it just bloats target/ and the cache up/download), and line-tables-only keeps readable panic backtraces at a fraction of full-debuginfo compile cost. nextest's test profile inherits these from dev. Local dev is unaffected. --- .github/workflows/test-eql.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 1d98259dc..30ea9761c 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -16,6 +16,13 @@ on: env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" MISE_VERBOSE: "1" + # CI compile-time tuning (CI-only; local dev keeps full debuginfo + incremental). + # Clean CI builds never reuse incremental state, so it only bloats target/ and + # the rust-cache up/download. line-tables-only keeps readable panic backtraces + # for failing tests at a fraction of full-debuginfo compile cost. nextest's + # `test` profile inherits these from `dev`. + CARGO_INCREMENTAL: "0" + CARGO_PROFILE_DEV_DEBUG: "line-tables-only" defaults: run: @@ -134,6 +141,10 @@ jobs: with: workspaces: . shared-key: sqlx-tests + # The sole saver of the shared cache: this job compiles the full heavy + # dep tree, so it must own the `sqlx-tests` key. All other jobs set + # `save-if: false` so a fast-finishing light job can't win the save race + # and overwrite the key with a deps-less target/. - name: Setup database (Postgres 17) run: | @@ -197,6 +208,7 @@ jobs: with: workspaces: . shared-key: sqlx-tests + save-if: false - uses: actions/download-artifact@v4 with: @@ -242,6 +254,7 @@ jobs: with: workspaces: . shared-key: sqlx-tests + save-if: false - name: Setup database (Postgres ${{ matrix.postgres-version }}) run: | @@ -277,6 +290,7 @@ jobs: with: workspaces: . shared-key: sqlx-tests + save-if: false - name: Validate v2.2 / v2.3 payload schemas run: | mise run test:schema @@ -302,6 +316,7 @@ jobs: with: workspaces: . shared-key: sqlx-tests + save-if: false # `mise run test:crates` runs `cargo fmt --check` at the workspace root, # which covers tests/sqlx (a workspace member). This subsumes the old # standalone `test:lint` step that the removed per-version test job ran. @@ -332,6 +347,7 @@ jobs: with: workspaces: . shared-key: sqlx-tests + save-if: false - name: Verify generator parity (golden) run: | mise run codegen:parity @@ -357,6 +373,7 @@ jobs: with: workspaces: . shared-key: sqlx-tests + save-if: false - name: Build EQL run: mise run --force build - name: Assert eql_v3 is self-contained @@ -383,6 +400,7 @@ jobs: with: workspaces: . shared-key: sqlx-tests + save-if: false - name: Verify the matrix test-name inventory run: | mise run test:matrix:inventory From 9d4c30cd31a775d58107410604a1973453d259ab Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 10 Jun 2026 12:37:56 +1000 Subject: [PATCH 142/599] ci: SHA-pin dorny/paths-filter + upload/download-artifact Pin the three remaining floating action refs in test-eql.yml to commit SHAs (matching the checkout/mise-action/rust-cache pins already in the file): dorny/paths-filter@d1c1ffe # v3, actions/upload-artifact@ea165f8 # v4, actions/download-artifact@d3f86a1 # v4. Addresses CodeRabbit review feedback. --- .github/workflows/test-eql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 30ea9761c..354f92ff3 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -55,7 +55,7 @@ jobs: # merge_group/workflow_dispatch the base ref is absent and the filter errors/empties. - id: f if: github.event_name == 'pull_request' - uses: dorny/paths-filter@v3 + uses: dorny/paths-filter@d1c1ffe0248fe513906c8e24db8ea791d46f8590 # v3 with: filters: | relevant: @@ -159,7 +159,7 @@ jobs: # -v3,-v3-uninstall}.sql from ../../release at RUN time (std::fs, not embedded), # and release/ is gitignored so the shard checkout has none of them. `mise run # build` (via prep) produced the whole set in build-archive. - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: nextest-archive path: | @@ -210,7 +210,7 @@ jobs: shared-key: sqlx-tests save-if: false - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: nextest-archive From 4d7d02641e5e75f2606e03558cadfe386ab8b0fb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 10 Jun 2026 12:37:56 +1000 Subject: [PATCH 143/599] fix(ci): handle absolute NEXTEST_ARCHIVE paths Both sqlx-archive.sh and sqlx-partition.sh unconditionally prefixed ${REPO_ROOT}, so an absolute NEXTEST_ARCHIVE override became ${REPO_ROOT}//abs/path. Normalize once (absolute used verbatim, relative resolved against REPO_ROOT) into ARCHIVE_PATH and use it everywhere, including partition.sh's existence check (previously cwd-relative, now consistent with the nextest invocation). Addresses CodeRabbit review feedback. --- tasks/test/sqlx-archive.sh | 14 ++++++++++---- tasks/test/sqlx-partition.sh | 16 +++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/tasks/test/sqlx-archive.sh b/tasks/test/sqlx-archive.sh index 93addb08d..7bd6465cf 100644 --- a/tasks/test/sqlx-archive.sh +++ b/tasks/test/sqlx-archive.sh @@ -12,7 +12,13 @@ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$REPO_ROOT" # Archive lands at the repo root so the workflow can upload it by a stable path. -ARCHIVE="${NEXTEST_ARCHIVE:-nextest.tar.zst}" +# A relative NEXTEST_ARCHIVE is resolved against REPO_ROOT; an absolute override +# is used verbatim (otherwise it would be mangled into "${REPO_ROOT}/abs/path"). +ARCHIVE_INPUT="${NEXTEST_ARCHIVE:-nextest.tar.zst}" +case "${ARCHIVE_INPUT}" in + /*) ARCHIVE_PATH="${ARCHIVE_INPUT}" ;; + *) ARCHIVE_PATH="${REPO_ROOT}/${ARCHIVE_INPUT}" ;; +esac # The mise task's `depends = ["test:sqlx:prep"]` has already produced # release/cipherstash-encrypt.sql, copied it to migrations/001_install_eql.sql, @@ -32,8 +38,8 @@ ls tests/sqlx/fixtures/eql_v2_*.sql >/dev/null 2>&1 \ # migration + fixtures (embedded via include_str at compile time) are baked into # the archive, so the shards consume them without regenerating. The shards still # need their own live Postgres for sqlx::test's per-test scratch databases. -echo "==> archiving sqlx test binaries to ${ARCHIVE}" +echo "==> archiving sqlx test binaries to ${ARCHIVE_PATH}" cd tests/sqlx -cargo nextest archive --archive-file "${REPO_ROOT}/${ARCHIVE}" +cargo nextest archive --archive-file "${ARCHIVE_PATH}" -echo "==> archive written: ${REPO_ROOT}/${ARCHIVE}" +echo "==> archive written: ${ARCHIVE_PATH}" diff --git a/tasks/test/sqlx-partition.sh b/tasks/test/sqlx-partition.sh index 7252cb10b..f8050f7d0 100644 --- a/tasks/test/sqlx-partition.sh +++ b/tasks/test/sqlx-partition.sh @@ -10,10 +10,16 @@ cd "$REPO_ROOT" # Required: which shard (1-based) and how many shards total. : "${SHARD:?SHARD (1-based shard index) must be set}" : "${SHARD_TOTAL:?SHARD_TOTAL (number of shards) must be set}" -ARCHIVE="${NEXTEST_ARCHIVE:-nextest.tar.zst}" +# A relative NEXTEST_ARCHIVE is resolved against REPO_ROOT; an absolute override +# is used verbatim (matching tasks/test/sqlx-archive.sh). +ARCHIVE_INPUT="${NEXTEST_ARCHIVE:-nextest.tar.zst}" +case "${ARCHIVE_INPUT}" in + /*) ARCHIVE_PATH="${ARCHIVE_INPUT}" ;; + *) ARCHIVE_PATH="${REPO_ROOT}/${ARCHIVE_INPUT}" ;; +esac -test -f "${ARCHIVE}" \ - || { echo "archive ${ARCHIVE} missing — run test:sqlx:archive / download the artifact first" >&2; exit 2; } +test -f "${ARCHIVE_PATH}" \ + || { echo "archive ${ARCHIVE_PATH} missing — run test:sqlx:archive / download the artifact first" >&2; exit 2; } # The archive already carries everything compiled-in: build-archive ran prep # (build → cp 001_install_eql.sql → sqlx migrate → fixture:generate:all) BEFORE @@ -29,9 +35,9 @@ test -f "${ARCHIVE}" \ # build_validation_tests via std::fs); those arrive with the downloaded artifact. # release/ is NOT touched here — no cp, no migrate, no CS_* — the shard just runs # the prebuilt binaries. -echo "==> running nextest partition hash:${SHARD}/${SHARD_TOTAL} from ${ARCHIVE}" +echo "==> running nextest partition hash:${SHARD}/${SHARD_TOTAL} from ${ARCHIVE_PATH}" cd tests/sqlx cargo nextest run \ - --archive-file "${REPO_ROOT}/${ARCHIVE}" \ + --archive-file "${ARCHIVE_PATH}" \ --workspace-remap "${REPO_ROOT}" \ --partition "hash:${SHARD}/${SHARD_TOTAL}" From 2cdaf07227cdf56266f7ac507d0d56012e4457f8 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 12:24:21 +1000 Subject: [PATCH 144/599] ci: add mise.toml to relevance filter + document merge-queue pattern - Add mise.toml to the relevant: path filter so a toolchain/tasks-only PR no longer skips the required suite (CodeRabbit, PR #265). - Add .github/workflows/README.md documenting the two run shapes, the merge-queue flow, and the CI required aggregator pattern. --- .github/workflows/README.md | 86 ++++++++++++++++++++++++++++++++++ .github/workflows/test-eql.yml | 1 + 2 files changed, 87 insertions(+) create mode 100644 .github/workflows/README.md diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 000000000..58236f8f9 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,86 @@ +# CI: `test-eql.yml` + +Fast PR feedback + a thorough pre-merge gate, using a merge queue and a single +aggregated required check. + +## Two run shapes + +`test-eql.yml` triggers on `pull_request`, `merge_group`, and `workflow_dispatch`. +`setup` derives the matrix from the event: + +| Event | Trigger | Matrix | Purpose | +|---|---|---|---| +| `pull_request` | push to a PR | PG17 × 4 shards | fast developer feedback | +| `merge_group` | "Merge when ready" → queued | PG14–17 × 2 shards | full pre-merge gate on the real merged state | +| `workflow_dispatch` | manual run | PG17 × 4 shards (PR shape) | ad-hoc | + +The PR run is feedback only. The merge-queue run is the gate. + +## Relevance skip applies to PRs only + +Each job runs when: +`merge_group || workflow_dispatch || (pull_request && relevant == 'true')`. + +So the `changes` relevance filter (`relevant:` paths) **only gates the +`pull_request` event** — a docs-only PR skips the heavy jobs on its PR run. On +`merge_group` (and `workflow_dispatch`) every job runs **unconditionally**: a +queued PR always pays the full gate regardless of which files it touched. + +## How the queue works + +1. Click **Merge when ready** — the PR is queued, not merged. +2. GitHub builds a temporary branch = `main` + this PR (+ any PRs ahead in the + queue) and fires `merge_group`, so CI tests the **post-merge state**, not the + stale PR branch. +3. The full PG14–17 × 2 matrix (plus the single-run jobs) runs and feeds + `ci-required`. +4. `ci-required` green → the PR is **merged into `main` using the queue's + configured merge method**. Red → the PR is **removed from the queue**; `main` + is untouched. + +This catches semantic conflicts — two PRs that each pass alone but break +together — which PR-only checks never test. + +## The `ci-required` aggregator + +Per-event matrices make leaf job names unstable (a `test` job is displayed as +`Shard PG17 1/4`, but the queue produces `Shard PG14 1/2` … `Shard PG17 2/2`), +so leaf names can't be named as required checks. Instead, one aggregator job +(id `ci-required`, **display name `CI required`**) `needs:` every job, runs with +`if: always()`, and passes only if each needed result is `success` **or** +`skipped`. Mark **only `CI required`** as the required status check. + +- `if: always()` — runs even when dependencies fail/skip, so the check always + reports (a never-reported required check leaves the queue stuck *Pending*). +- `skipped` counts as pass — a docs-only PR skips the heavy jobs on its PR run + but must still report Success so the PR stays eligible to queue. + +This is the well-known "aggregate / final gate job" pattern for matrix + +merge-queue workflows. + +## Operator setup (one-time, GitHub UI) + +Settings → Branches → rule for `main`: + +1. **Require merge queue.** +2. **Require status checks to pass** → add **`CI required` only** (the display + name; not the per-shard leaf names). + +Then verify (see `docs/plans/2026-06-09-ci-pr-feedback-sharding-rollout.md`): + +- **Queue a relevant PR** → `merge_group` runs the full gate — 8 `Shard …` jobs + + 4 `Validate …` jobs + `build-archive`, `schema`, `rust-crates`, `codegen`, + `self-contained-v3`, `matrix-coverage`, `splinter` — all green → `CI required` + green → PR merges. +- **Open a docs-only PR** → on its `pull_request` run the heavy jobs skip and + `CI required` reports **Success** (not stuck *Pending*), so the PR can be + queued. + +## References + +- Merge queue: +- `merge_group` event: +- Required status checks: +- `needs` / `always()` / `join()`: +- Path filtering (`dorny/paths-filter`): +- nextest archive + partitioning: · diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 354f92ff3..11bc17d78 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -67,6 +67,7 @@ jobs: - "crates/**" - "Cargo.toml" - "Cargo.lock" + - "mise.toml" # Explicit default (not `|| 'true'`, which trips GitHub's inconsistent # treatment of the string 'false'). merge_group/workflow_dispatch never From 5f2badb3ec35596ea7f1795148938e9a77403cfc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 11:43:00 +1000 Subject: [PATCH 145/599] feat(v3): add eql_v3.ore_cllw SEM type and operators Self-contained CLLW ORE searchable-encrypted-metadata index-term type used by the encrypted-JSONB surface for entry-level ordering: the type, extractors/comparators, comparison operators, and a btree operator class, all under src/v3/sem/ore_cllw/ (no eql_v2 dependency). --- src/v3/sem/ore_cllw/functions.sql | 171 +++++++++++++++++++++++++ src/v3/sem/ore_cllw/operator_class.sql | 29 +++++ src/v3/sem/ore_cllw/operators.sql | 166 ++++++++++++++++++++++++ src/v3/sem/ore_cllw/types.sql | 23 ++++ 4 files changed, 389 insertions(+) create mode 100644 src/v3/sem/ore_cllw/functions.sql create mode 100644 src/v3/sem/ore_cllw/operator_class.sql create mode 100644 src/v3/sem/ore_cllw/operators.sql create mode 100644 src/v3/sem/ore_cllw/types.sql diff --git a/src/v3/sem/ore_cllw/functions.sql b/src/v3/sem/ore_cllw/functions.sql new file mode 100644 index 000000000..bd34ac8ce --- /dev/null +++ b/src/v3/sem/ore_cllw/functions.sql @@ -0,0 +1,171 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/ore_cllw/types.sql + +--! @file v3/sem/ore_cllw/functions.sql +--! @brief CLLW ORE index-term extraction and comparison (eql_v3 SEM). + +--! @brief Extract CLLW ORE index term from raw jsonb +--! +--! Returns the CLLW ORE ciphertext from the `oc` field of a single sv element +--! supplied as raw jsonb. Inlinable single-statement SQL — the planner folds +--! the body into the calling query. +--! +--! **Missing-`oc` semantics**: returns SQL-level NULL (not a composite with +--! NULL bytes) when `oc` is absent, so btree's NULL handling filters those +--! rows from range queries. +--! +--! @param val jsonb An object carrying an `oc` field +--! @return eql_v3.ore_cllw Composite carrying the CLLW ciphertext, or NULL +--! when the `oc` field is absent. +--! @see eql_v3.has_ore_cllw +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.ore_cllw(val jsonb) + RETURNS eql_v3.ore_cllw + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT CASE WHEN val ->> 'oc' IS NULL THEN NULL + ELSE ROW(decode(val ->> 'oc', 'hex'))::eql_v3.ore_cllw + END +$$; + +COMMENT ON FUNCTION eql_v3.ore_cllw(jsonb) IS + 'eql-inline-critical: raw-jsonb CLLW extractor; must stay inlinable (unpinned search_path)'; + +--! @brief Check if a raw jsonb value contains a CLLW ORE index term +--! @param val jsonb An object that may carry an `oc` field +--! @return boolean True if `oc` field is present and non-null +CREATE FUNCTION eql_v3.has_ore_cllw(val jsonb) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT val ->> 'oc' IS NOT NULL +$$; + +COMMENT ON FUNCTION eql_v3.has_ore_cllw(jsonb) IS + 'eql-inline-critical: raw-jsonb CLLW presence helper; must stay inlinable (unpinned search_path)'; + +--! @brief CLLW per-byte comparison helper +--! @internal +--! +--! Byte-by-byte comparison implementing the CLLW order-revealing protocol. +--! Identify the index of the first differing byte; if `(y_byte + 1) == x_byte` +--! (mod 256) there, then x > y; otherwise x < y. Equal inputs return 0. Inputs +--! MUST be the same length (the caller guarantees this). Stays `LANGUAGE +--! plpgsql` — the per-byte loop can't be a single inlinable SQL expression. +--! +--! @param a bytea First CLLW ciphertext slice +--! @param b bytea Second CLLW ciphertext slice +--! @return integer -1, 0, or 1 +--! @throws Exception if inputs are different lengths +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.compare_ore_cllw_term_bytes(a bytea, b bytea) +RETURNS int + SET search_path = pg_catalog, extensions, public +AS $$ +DECLARE + len_a INT; + len_b INT; + i INT; + first_diff INT := 0; +BEGIN + + len_a := LENGTH(a); + len_b := LENGTH(b); + + IF len_a != len_b THEN + RAISE EXCEPTION 'ore_cllw index terms are not the same length'; + END IF; + + FOR i IN 1..len_a LOOP + IF first_diff = 0 AND get_byte(a, i - 1) != get_byte(b, i - 1) THEN + first_diff := i; + END IF; + END LOOP; + + IF first_diff = 0 THEN + RETURN 0; + END IF; + + IF ((get_byte(b, first_diff - 1) + 1) & 255) = get_byte(a, first_diff - 1) THEN + RETURN 1; + ELSE + RETURN -1; + END IF; +END; +$$ LANGUAGE plpgsql; + +--! @brief Variable-length CLLW ORE term comparison +--! @internal +--! +--! Three-way comparison of two CLLW ORE ciphertext terms of potentially +--! different lengths. Compares the shared prefix via the CLLW per-byte +--! protocol; on equal prefixes, the shorter input sorts first. The leading +--! domain-tag byte makes numeric (`0x00`) sort before string (`0x01`). Stays +--! `LANGUAGE plpgsql` because it dispatches to `compare_ore_cllw_term_bytes`. +--! +--! btree filters NULL composites at the row level, so this should never see a +--! NULL composite under normal operation; the IS-NULL guard returns NULL +--! defensively. A non-NULL composite with NULL `bytes` is a contract violation +--! — the extractor returns SQL NULL (not ROW(NULL)) on missing `oc`, so raise +--! loudly rather than silently misorder. +--! +--! @param a eql_v3.ore_cllw First term +--! @param b eql_v3.ore_cllw Second term +--! @return integer -1, 0, or 1; NULL if either composite is NULL +--! @throws Exception if either composite has a NULL `bytes` field +--! @see eql_v3.compare_ore_cllw_term_bytes +CREATE FUNCTION eql_v3.compare_ore_cllw_term(a eql_v3.ore_cllw, b eql_v3.ore_cllw) +RETURNS int + SET search_path = pg_catalog, extensions, public +AS $$ +DECLARE + len_a INT; + len_b INT; + common_len INT; + cmp_result INT; +BEGIN + IF a::text IS NULL OR b::text IS NULL THEN + RETURN NULL; + END IF; + + IF a.bytes IS NULL OR b.bytes IS NULL THEN + RAISE EXCEPTION 'eql_v3.compare_ore_cllw_term: composite has NULL bytes field — extractor invariant violated. Check that the index expression uses eql_v3.ore_cllw(...) and not a hand-crafted ROW(NULL).'; + END IF; + + len_a := LENGTH(a.bytes); + len_b := LENGTH(b.bytes); + + IF len_a = 0 AND len_b = 0 THEN + RETURN 0; + ELSIF len_a = 0 THEN + RETURN -1; + ELSIF len_b = 0 THEN + RETURN 1; + END IF; + + IF len_a < len_b THEN + common_len := len_a; + ELSE + common_len := len_b; + END IF; + + cmp_result := eql_v3.compare_ore_cllw_term_bytes( + SUBSTRING(a.bytes FROM 1 FOR common_len), + SUBSTRING(b.bytes FROM 1 FOR common_len) + ); + + IF cmp_result = -1 THEN + RETURN -1; + ELSIF cmp_result = 1 THEN + RETURN 1; + END IF; + + IF len_a < len_b THEN + RETURN -1; + ELSIF len_a > len_b THEN + RETURN 1; + ELSE + RETURN 0; + END IF; +END; +$$ LANGUAGE plpgsql; diff --git a/src/v3/sem/ore_cllw/operator_class.sql b/src/v3/sem/ore_cllw/operator_class.sql new file mode 100644 index 000000000..4bd0473bf --- /dev/null +++ b/src/v3/sem/ore_cllw/operator_class.sql @@ -0,0 +1,29 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/ore_cllw/types.sql +-- REQUIRE: src/v3/sem/ore_cllw/functions.sql +-- REQUIRE: src/v3/sem/ore_cllw/operators.sql + +--! @file v3/sem/ore_cllw/operator_class.sql +--! @brief Btree operator class on the eql_v3.ore_cllw composite type. +--! +--! DEFAULT FOR TYPE so a functional btree index on eql_v3.ore_cllw(expr) +--! engages without an explicit opclass annotation. FUNCTION 1 is the three-way +--! comparator btree's internal sort uses; it is plpgsql by design (per-byte +--! CLLW protocol needs iteration) and is called once per index-entry pair +--! during build / search, not per-row in the outer query. +--! +--! @note Excluded from the Supabase build variant by the build glob +--! `**/*operator_class.sql`. +--! @see eql_v3.compare_ore_cllw_term + +CREATE OPERATOR FAMILY eql_v3.ore_cllw_ops USING btree; + +CREATE OPERATOR CLASS eql_v3.ore_cllw_ops + DEFAULT FOR TYPE eql_v3.ore_cllw + USING btree FAMILY eql_v3.ore_cllw_ops AS + OPERATOR 1 < (eql_v3.ore_cllw, eql_v3.ore_cllw), + OPERATOR 2 <= (eql_v3.ore_cllw, eql_v3.ore_cllw), + OPERATOR 3 = (eql_v3.ore_cllw, eql_v3.ore_cllw), + OPERATOR 4 >= (eql_v3.ore_cllw, eql_v3.ore_cllw), + OPERATOR 5 > (eql_v3.ore_cllw, eql_v3.ore_cllw), + FUNCTION 1 eql_v3.compare_ore_cllw_term(eql_v3.ore_cllw, eql_v3.ore_cllw); diff --git a/src/v3/sem/ore_cllw/operators.sql b/src/v3/sem/ore_cllw/operators.sql new file mode 100644 index 000000000..4c910518b --- /dev/null +++ b/src/v3/sem/ore_cllw/operators.sql @@ -0,0 +1,166 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/ore_cllw/types.sql +-- REQUIRE: src/v3/sem/ore_cllw/functions.sql + +--! @file v3/sem/ore_cllw/operators.sql +--! @brief Comparison operators on the eql_v3.ore_cllw composite type. +--! +--! Each backing function reduces to a single SELECT over +--! eql_v3.compare_ore_cllw_term(a, b) and is inlinable so the planner can fold +--! it through to functional-index matching. The inner comparator is plpgsql +--! (per-byte loop) and is not inlined — fine for index *match*. +--! +--! @note Deliberately no HASHES / MERGES — the CLLW protocol gives ordering, +--! not a hash; there is no merge-joinable opclass on the other side. +--! @see eql_v3.compare_ore_cllw_term + +--! @brief Equality backing function for eql_v3.ore_cllw. +--! @internal +--! +--! @param a eql_v3.ore_cllw Left operand +--! @param b eql_v3.ore_cllw Right operand +--! @return boolean True if the CLLW ORE terms are equal +--! +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.ore_cllw_eq(a eql_v3.ore_cllw, b eql_v3.ore_cllw) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_cllw_term(a, b) = 0 +$$; + +--! @brief Not-equal backing function for eql_v3.ore_cllw. +--! @internal +--! +--! @param a eql_v3.ore_cllw Left operand +--! @param b eql_v3.ore_cllw Right operand +--! @return boolean True if the CLLW ORE terms are not equal +--! +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.ore_cllw_neq(a eql_v3.ore_cllw, b eql_v3.ore_cllw) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_cllw_term(a, b) <> 0 +$$; + +--! @brief Less-than backing function for eql_v3.ore_cllw. +--! @internal +--! +--! @param a eql_v3.ore_cllw Left operand +--! @param b eql_v3.ore_cllw Right operand +--! @return boolean True if the left operand is less than the right operand +--! +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.ore_cllw_lt(a eql_v3.ore_cllw, b eql_v3.ore_cllw) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_cllw_term(a, b) = -1 +$$; + +--! @brief Less-than-or-equal backing function for eql_v3.ore_cllw. +--! @internal +--! +--! @param a eql_v3.ore_cllw Left operand +--! @param b eql_v3.ore_cllw Right operand +--! @return boolean True if the left operand is less than or equal to the right operand +--! +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.ore_cllw_lte(a eql_v3.ore_cllw, b eql_v3.ore_cllw) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_cllw_term(a, b) <> 1 +$$; + +--! @brief Greater-than backing function for eql_v3.ore_cllw. +--! @internal +--! +--! @param a eql_v3.ore_cllw Left operand +--! @param b eql_v3.ore_cllw Right operand +--! @return boolean True if the left operand is greater than the right operand +--! +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.ore_cllw_gt(a eql_v3.ore_cllw, b eql_v3.ore_cllw) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_cllw_term(a, b) = 1 +$$; + +--! @brief Greater-than-or-equal backing function for eql_v3.ore_cllw. +--! @internal +--! +--! @param a eql_v3.ore_cllw Left operand +--! @param b eql_v3.ore_cllw Right operand +--! @return boolean True if the left operand is greater than or equal to the right operand +--! +--! @see eql_v3.compare_ore_cllw_term +CREATE FUNCTION eql_v3.ore_cllw_gte(a eql_v3.ore_cllw, b eql_v3.ore_cllw) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_cllw_term(a, b) <> -1 +$$; + + +CREATE OPERATOR = ( + FUNCTION = eql_v3.ore_cllw_eq, + LEFTARG = eql_v3.ore_cllw, + RIGHTARG = eql_v3.ore_cllw, + COMMUTATOR = =, + NEGATOR = <>, + RESTRICT = eqsel, + JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.ore_cllw_neq, + LEFTARG = eql_v3.ore_cllw, + RIGHTARG = eql_v3.ore_cllw, + COMMUTATOR = <>, + NEGATOR = =, + RESTRICT = neqsel, + JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.ore_cllw_lt, + LEFTARG = eql_v3.ore_cllw, + RIGHTARG = eql_v3.ore_cllw, + COMMUTATOR = >, + NEGATOR = >=, + RESTRICT = scalarltsel, + JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.ore_cllw_lte, + LEFTARG = eql_v3.ore_cllw, + RIGHTARG = eql_v3.ore_cllw, + COMMUTATOR = >=, + NEGATOR = >, + RESTRICT = scalarlesel, + JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.ore_cllw_gt, + LEFTARG = eql_v3.ore_cllw, + RIGHTARG = eql_v3.ore_cllw, + COMMUTATOR = <, + NEGATOR = <=, + RESTRICT = scalargtsel, + JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.ore_cllw_gte, + LEFTARG = eql_v3.ore_cllw, + RIGHTARG = eql_v3.ore_cllw, + COMMUTATOR = <=, + NEGATOR = <, + RESTRICT = scalargesel, + JOIN = scalargejoinsel +); diff --git a/src/v3/sem/ore_cllw/types.sql b/src/v3/sem/ore_cllw/types.sql new file mode 100644 index 000000000..30d5ed0aa --- /dev/null +++ b/src/v3/sem/ore_cllw/types.sql @@ -0,0 +1,23 @@ +-- REQUIRE: src/v3/schema.sql + +--! @file v3/sem/ore_cllw/types.sql +--! @brief CLLW ORE index term type for STE-vec range queries (eql_v3 SEM) +--! +--! Composite type for CLLW (Copyless Logarithmic Width) Order-Revealing +--! Encryption. The ciphertext is stored in the `oc` field of encrypted data +--! payloads (Standard-mode `ste_vec` elements). Used by the range operators +--! (`<`, `<=`, `>`, `>=`) when an sv element carries an `oc` term. +--! +--! The wire-format `oc` value is a hex string with a leading domain-tag byte +--! (`0x00` numeric, `0x01` string) followed by the CLLW ciphertext. The +--! decoded `bytes` field carries the full byte string including the tag — the +--! comparator is variable-length capable, so numeric and string values within +--! the same column order correctly: the domain tag separates the ranges +--! (numeric < string) and the within-domain comparison falls through to the +--! CLLW per-byte protocol. +--! +--! @note This is a transient type used only during query execution. +--! @see eql_v3.compare_ore_cllw_term +CREATE TYPE eql_v3.ore_cllw AS ( + bytes bytea +); From 9b9d8b0ac58e8db9847321cd1b20b780e579d75e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 21:16:35 +1000 Subject: [PATCH 146/599] fix(v3): wire eql_v3.ore_cllw functions into inlining/lint parity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ore_cllw SEM fork (598a35b) added the inlinable extractors and operator backing functions but did not give them the same inlining/lint treatment eql_v2 has: - splinter (tasks/test/splinter.sh): add allowlist rows for eql_v3.ore_cllw, has_ore_cllw and the six ore_cllw_* operators. Without these the splinter job fails on the two uncovered findings. - pin_search_path.sql: add the six composite-arg ore_cllw_* operators and the jsonb ore_cllw/has_ore_cllw extractors to the eql_v3 inline-critical clause. The operators take a composite arg (not a jsonb-backed domain) so the structural skip did not spare them — they were being silently pinned, killing inlining and the btree functional -index match, exactly what the eql_v2 inline_critical_oids list avoids. - ore_cllw_opclass_tests.rs: backing_functions_are_inlinable now asserts both eql_v2 and eql_v3 operators are unpinned + inlinable SQL. - inlinability.rs: add eql_v3.bloom_filter(jsonb) to the v3 unpinned assertion list (parity with its sibling eql_v3.hmac_256). --- tasks/pin_search_path.sql | 23 +++++ tasks/test/splinter.sh | 8 ++ .../encrypted_domain/family/inlinability.rs | 14 ++-- tests/sqlx/tests/ore_cllw_opclass_tests.rs | 84 +++++++++++-------- 4 files changed, 88 insertions(+), 41 deletions(-) diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql index 66fb30080..d00e34267 100644 --- a/tasks/pin_search_path.sql +++ b/tasks/pin_search_path.sql @@ -262,6 +262,29 @@ BEGIN AND p.proname IN ('ore_block_u64_8_256_eq', 'ore_block_u64_8_256_neq', 'ore_block_u64_8_256_lt', 'ore_block_u64_8_256_lte', 'ore_block_u64_8_256_gt', 'ore_block_u64_8_256_gte')) + -- Inner ORE-CLLW comparison helpers backing the `<`, `<=`, `=`, `>=`, + -- `>`, `<>` operators on the eql_v3.ore_cllw composite type (registered + -- via the DEFAULT eql_v3.ore_cllw_ops btree opclass). Same precedent as + -- the ore_block_u64_8_256_* helpers above and the eql_v2.ore_cllw_* + -- helpers: PG only carries the inlined operator wrapper through to + -- functional-index match if the inner backing function is also + -- inlinable. They take the composite arg (not a jsonb-backed domain), + -- so the structural skip below does not spare them — they need an + -- explicit entry here. The plpgsql FUNCTION 1 comparator + -- (compare_ore_cllw_term) stays pinned by design. + OR (p.pronargs = 2 + AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', + 'ore_cllw_lt', 'ore_cllw_lte', + 'ore_cllw_gt', 'ore_cllw_gte')) + -- Raw-jsonb CLLW extractor / presence helper. Inlinable SQL — pinning + -- would silently undo the fold of `eql_v3.ore_cllw(col -> 'sel')` into + -- the calling query and break functional-index match. (These also carry + -- the `eql-inline-critical` COMMENT marker honoured by the fallback + -- below; listed here too so the intent is explicit alongside the + -- operators they support. Single (jsonb) overload in the v3 fork.) + OR (p.pronargs = 1 + AND p.proname IN ('ore_cllw', 'has_ore_cllw') + AND p.proargtypes[0] = jsonb_oid) OR (p.pronargs = 1 AND p.proname = 'hmac_256' AND p.proargtypes[0] = jsonb_oid) diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index cdb5d2f51..38289466f 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -130,6 +130,14 @@ function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor fo function_search_path_mutable eql_v3 bloom_filter function Bloom-filter match extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.match_term. Must inline so the functional GIN index on eql_v3.match_term(col) engages. Mirrors eql_v3.hmac_256. function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_u64_8_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours. The eql_v2 copy stays plpgsql (pinned) by design. function_search_path_mutable eql_v3 jsonb_array_to_ore_block_u64_8_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_u64_8_256, carries the `eql-inline-critical` COMMENT marker. The eql_v2 copy stays plpgsql (pinned) by design. +function_search_path_mutable eql_v3 ore_cllw function CLLW ORE raw-jsonb extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) so the planner folds `eql_v3.ore_cllw(col -> 'sel')` into the calling query and matches the functional btree index on the same expression. Stays unpinned via the `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours (the arg is bare jsonb, not a jsonb-backed domain). Mirrors eql_v2.ore_cllw — single (jsonb) overload (no ste_vec_entry overload in the v3 fork). +function_search_path_mutable eql_v3 has_ore_cllw function CLLW ORE presence check for the eql_v3 SEM fork: inlinable SQL (jsonb) counterpart to `eql_v3.ore_cllw`. Same rationale — must stay unpinned to inline. Single (jsonb) overload. Mirrors eql_v2.has_ore_cllw. +function_search_path_mutable eql_v3 ore_cllw_eq function Inner comparator for the eql_v3.ore_cllw composite type's `=` operator (self-contained SEM fork, DEFAULT FOR TYPE btree opclass eql_v3.ore_cllw_ops). The outer same-type operators back the opclass; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). The plpgsql FUNCTION 1 comparator (compare_ore_cllw_term) stays pinned by design. Mirrors eql_v2.ore_cllw_eq. +function_search_path_mutable eql_v3 ore_cllw_neq function Inner comparator for the eql_v3.ore_cllw `<>` operator. Same rationale as eql_v3.ore_cllw_eq. +function_search_path_mutable eql_v3 ore_cllw_lt function Inner comparator for the eql_v3.ore_cllw `<` operator. Same rationale as eql_v3.ore_cllw_eq. +function_search_path_mutable eql_v3 ore_cllw_lte function Inner comparator for the eql_v3.ore_cllw `<=` operator. Same rationale as eql_v3.ore_cllw_eq. +function_search_path_mutable eql_v3 ore_cllw_gt function Inner comparator for the eql_v3.ore_cllw `>` operator. Same rationale as eql_v3.ore_cllw_eq. +function_search_path_mutable eql_v3 ore_cllw_gte function Inner comparator for the eql_v3.ore_cllw `>=` operator. Same rationale as eql_v3.ore_cllw_eq. ALLOW # Wrap splinter (a single bare SELECT expression) into a subquery we can diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 8caed2bf7..3f5929506 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -89,11 +89,12 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> /// Direct guard for the self-contained eql_v3 SEM index-term functions. Unlike /// the structural guard above (which covers jsonb-domain-arg functions), these -/// take a composite (ore_block_u64_8_256) or raw jsonb (hmac_256/the two -/// per-encrypted-value `jsonb_array_to_*` helpers) arg, so they are NOT caught -/// by the structural pin-skip and need explicit inline_critical allowlisting. -/// If pin_search_path.sql pins any of them, v3 functional-index inlining -/// silently regresses to Seq Scan — this test fails instead. +/// take a composite (ore_block_u64_8_256) or raw jsonb (hmac_256, bloom_filter, +/// the ore_cllw/has_ore_cllw extractors, the two per-encrypted-value +/// `jsonb_array_to_*` helpers) arg, so they are NOT caught by the structural +/// pin-skip and need explicit inline_critical allowlisting. If +/// pin_search_path.sql pins any of them, v3 functional-index inlining silently +/// regresses to Seq Scan — this test fails instead. /// /// `jsonb_array_to_bytea_array(jsonb)` and /// `jsonb_array_to_ore_block_u64_8_256(jsonb)` are included here: both take a @@ -120,6 +121,9 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu 'ore_block_u64_8_256_gt','ore_block_u64_8_256_gte')) OR (p.pronargs = 1 AND p.proname IN ( 'hmac_256', + 'bloom_filter', + 'ore_cllw', + 'has_ore_cllw', 'jsonb_array_to_bytea_array', 'jsonb_array_to_ore_block_u64_8_256') AND p.proargtypes[0] = 'jsonb'::regtype) diff --git a/tests/sqlx/tests/ore_cllw_opclass_tests.rs b/tests/sqlx/tests/ore_cllw_opclass_tests.rs index 4f6370ed4..56d6f46f8 100644 --- a/tests/sqlx/tests/ore_cllw_opclass_tests.rs +++ b/tests/sqlx/tests/ore_cllw_opclass_tests.rs @@ -316,43 +316,55 @@ async fn backing_functions_are_inlinable(pool: PgPool) -> Result<()> { // each function is `LANGUAGE sql`, `IMMUTABLE`, `STRICT`, `PARALLEL // SAFE`, and not pinned with a `SET search_path`. Any of those failing // would silently kill inlining and break functional-index match. - let rows = sqlx::query( - "SELECT p.proname, - l.lanname, - p.provolatile, - p.proparallel, - p.proisstrict, - (p.proconfig IS NOT NULL) AS pinned - FROM pg_proc p - JOIN pg_namespace n ON n.oid = p.pronamespace - JOIN pg_language l ON l.oid = p.prolang - WHERE n.nspname = 'eql_v2' - AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', - 'ore_cllw_lt', 'ore_cllw_lte', - 'ore_cllw_gt', 'ore_cllw_gte') - ORDER BY p.proname", - ) - .fetch_all(&pool) - .await?; + // + // Covers BOTH schemas: `eql_v2` and the self-contained `eql_v3` SEM fork. + // The eql_v3 operators take the composite `eql_v3.ore_cllw` arg, so they + // are not spared by the jsonb-domain structural skip in + // `tasks/pin_search_path.sql` — they need an explicit inline-critical + // entry there, and this asserts that entry keeps them unpinned. + for schema in ["eql_v2", "eql_v3"] { + let rows = sqlx::query( + "SELECT p.proname, + l.lanname, + p.provolatile, + p.proparallel, + p.proisstrict, + (p.proconfig IS NOT NULL) AS pinned + FROM pg_proc p + JOIN pg_namespace n ON n.oid = p.pronamespace + JOIN pg_language l ON l.oid = p.prolang + WHERE n.nspname = $1 + AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', + 'ore_cllw_lt', 'ore_cllw_lte', + 'ore_cllw_gt', 'ore_cllw_gte') + ORDER BY p.proname", + ) + .bind(schema) + .fetch_all(&pool) + .await?; - assert_eq!(rows.len(), 6, "expected 6 backing functions"); - - for row in rows { - let name: String = row.get("proname"); - let lang: String = row.get("lanname"); - let volatile: i8 = row.get("provolatile"); - let parallel: i8 = row.get("proparallel"); - let strict: bool = row.get("proisstrict"); - let pinned: bool = row.get("pinned"); - - assert_eq!(lang, "sql", "{name}: must be LANGUAGE sql"); - assert_eq!(volatile as u8, b'i', "{name}: must be IMMUTABLE"); - assert_eq!(parallel as u8, b's', "{name}: must be PARALLEL SAFE"); - assert!(strict, "{name}: must be STRICT"); - assert!( - !pinned, - "{name}: must NOT have SET search_path (kills inlining)" - ); + assert_eq!(rows.len(), 6, "expected 6 backing functions in {schema}"); + + for row in rows { + let name: String = row.get("proname"); + let lang: String = row.get("lanname"); + let volatile: i8 = row.get("provolatile"); + let parallel: i8 = row.get("proparallel"); + let strict: bool = row.get("proisstrict"); + let pinned: bool = row.get("pinned"); + + assert_eq!(lang, "sql", "{schema}.{name}: must be LANGUAGE sql"); + assert_eq!(volatile as u8, b'i', "{schema}.{name}: must be IMMUTABLE"); + assert_eq!( + parallel as u8, b's', + "{schema}.{name}: must be PARALLEL SAFE" + ); + assert!(strict, "{schema}.{name}: must be STRICT"); + assert!( + !pinned, + "{schema}.{name}: must NOT have SET search_path (kills inlining)" + ); + } } Ok(()) } From 79c9cd6462877dc9488928811c9e995b2a534d1c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 10:11:48 +1000 Subject: [PATCH 147/599] test(v3): add eql_v3.ore_cllw behavioral coverage; tighten codegen gates and docs Address review findings 1, 3, 4, 5, 6 on the eql-v3-ore-cllw branch. behavioral test hardcoded eql_v2. v3 is a hand-written fork (src/v3/sem/ ore_cllw/) that can drift independently. Add tests/sqlx/tests/ ore_cllw_v3_opclass_tests.rs (13 #[sqlx::test]) mirroring the v2 suite, adapted to v3's jsonb-only surface (single eql_v3.ore_cllw(jsonb) extractor, no encrypted column / ste_vec / ->): comparator + CLLW per-byte semantics, all six operators, cross-domain tag ordering, extractor NULL handling, ore_cllw_ops DEFAULT FOR TYPE, and functional-index EXPLAIN tests (ORDER BY -> Index Scan/no Sort; WHERE range -> Index Cond). catalog type with no golden slipped past the shell loop (completeness was enforced only by the separate Rust gate). Add a catalog cross-check against `cargo run -p eql-codegen -- list-types` before the loop, mirroring the matrix-inventory gate. operators_for_terms unions, an inconsistency for a future mixed-term domain. Make is_ord_capable union across terms and role_for_terms use Role::rank precedence (Ord > Eq > Match > Storage). Output-neutral for the single-term catalog (parity goldens byte-identical); add mixed-term unit tests. mise.toml inventory-task comment both claimed a single committed snapshot. Correct both to describe the two committed snapshots (ordered baseline + derived/pinned eq-only). silently"; it actually panics at the read_to_string unwrap. Reword. Finding 2 was refuted (the ore_cllw/has_ore_cllw unpinned contract is already guarded) and is not changed. --- crates/eql-codegen/src/context.rs | 20 +- crates/eql-codegen/tests/parity.rs | 8 +- crates/eql-scalars/src/lib.rs | 28 +- crates/eql-scalars/src/term.rs | 20 +- crates/eql-scalars/src/tests.rs | 20 + mise.toml | 25 +- tasks/codegen-parity.sh | 16 + tests/sqlx/snapshots/README.md | 11 +- tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs | 349 ++++++++++++++++++ 9 files changed, 465 insertions(+), 32 deletions(-) create mode 100644 tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index bb31f418b..027dc4cf2 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -268,10 +268,13 @@ pub const AGGREGATE_OPS: &[AggregateOp] = &[ }, ]; -/// True if the domain carries a comparator term (supports `<`). -/// Port of `is_ord_capable`. +/// True if the domain carries a comparator term (any term that supports `<`). +/// Unions across the terms — consistent with `Term::operators_for_terms` — +/// rather than reading only the first, so a future mixed-term domain that +/// carries an ord term anywhere is correctly ord-capable. Port of +/// `is_ord_capable`. pub fn is_ord_capable(terms: &[Term]) -> bool { - Term::role_for_terms(terms) == Role::Ord + terms.iter().any(|t| t.role() == Role::Ord) } #[cfg(test)] @@ -290,6 +293,17 @@ mod tests { assert!(!is_ord_capable(&[])); } + #[test] + fn is_ord_capable_unions_across_terms() { + // An ord term anywhere in the list makes the domain ord-capable, + // regardless of position — consistent with operators_for_terms' union, + // not the first-term role. (No catalog domain is multi-term today; this + // pins the order-independent semantics for a future mixed-term domain.) + assert!(is_ord_capable(&[Term::Hm, Term::Ore])); + assert!(is_ord_capable(&[Term::Ore, Term::Hm])); + assert!(!is_ord_capable(&[Term::Hm, Term::Bloom])); + } + #[test] fn environment_has_whole_file_and_partial_templates() { let env = environment(); diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index b9e21dd93..c8c678425 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -102,10 +102,12 @@ fn rust_generator_matches_reference_files() { let ref_dir = root.join("tests/codegen/reference").join(&token); let gen_dir = out.path().join("src/v3/scalars").join(&token); - // Assert the generated .sql file SET matches the reference set first — the + // Assert the generated .sql file SET matches the reference set first. The // per-file byte comparison below only iterates reference files, so a - // missing generated file (or an extra one the reference never pins) would - // otherwise pass silently. + // missing generated file would surface only as an opaque `unwrap` panic on + // the `read_to_string` below, and an EXTRA generated file (one the + // reference never pins) would pass silently — it is never iterated. This + // set check turns both into a clear file-set diff. let ref_names = sql_names(&ref_dir); let gen_names = sql_names(&gen_dir); assert_eq!( diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 54163c0b0..e5b9ee0ea 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -86,11 +86,12 @@ pub enum Term { Bloom, } -/// The generated-file role of a domain, derived from its first term (or -/// `Storage` for a term-less domain). Gates ord-only codegen (aggregates) via an -/// exhaustive `==` against [`Role::Ord`] rather than a stringly-typed compare — -/// a typo can no longer silently disable aggregate generation. `label` is the -/// `&'static str` form for any future template/serde consumer. +/// The generated-file role of a domain, resolved from its terms by the +/// richest-comparison precedence in [`Role::rank`] (or `Storage` for a term-less +/// domain). Gates ord-only codegen (aggregates) via an exhaustive `==` against +/// [`Role::Ord`] rather than a stringly-typed compare — a typo can no longer +/// silently disable aggregate generation. `label` is the `&'static str` form for +/// any future template/serde consumer. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Role { Storage, @@ -109,6 +110,23 @@ impl Role { Role::Match => "match", } } + + /// Precedence used by [`Term::role_for_terms`] to resolve a multi-term + /// domain to a single generated-file role: the richest comparison capability + /// wins (`Ord > Eq > Match > Storage`). Ordering subsumes equality, so an + /// `Ore` term anywhere makes the domain ord-shaped; `Match` (containment) is + /// a weaker standalone surface; `Storage` is the absence of any term. The + /// current catalog is single-term, so this only disambiguates a hypothetical + /// future mixed-term domain — and keeps `role_for_terms` consistent with + /// [`Term::operators_for_terms`], which already unions across all terms. + pub const fn rank(self) -> u8 { + match self { + Role::Storage => 0, + Role::Match => 1, + Role::Eq => 2, + Role::Ord => 3, + } + } } /// A single fixture plaintext value, value-kind tagged: `Min`/`Max`/`Zero` are diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-scalars/src/term.rs index f8f194e58..ebdba91f1 100644 --- a/crates/eql-scalars/src/term.rs +++ b/crates/eql-scalars/src/term.rs @@ -33,7 +33,8 @@ impl Term { } } - /// Generated-file [`Role`] for a domain whose first term is this one. + /// Generated-file [`Role`] contributed by this single term. A domain's role + /// is the richest of its terms' roles — see [`Term::role_for_terms`]. pub const fn role(self) -> Role { match self { Term::Hm => Role::Eq, @@ -117,11 +118,18 @@ impl Term { } /// Generated-file [`Role`] for a domain with these terms. No terms => - /// [`Role::Storage`]; otherwise the first term's role. + /// [`Role::Storage`]; otherwise the **richest** role across the terms by + /// [`Role::rank`] precedence (`Ord > Eq > Match > Storage`). For the current + /// single-term catalog this equals the lone term's role, so generated SQL is + /// unchanged; the precedence only disambiguates a future mixed-term domain + /// (e.g. `[Hm, Ore]` => `Ord`), keeping this consistent with + /// [`Term::operators_for_terms`], which unions across all terms rather than + /// reading only the first. pub fn role_for_terms(terms: &[Term]) -> Role { - match terms.first() { - None => Role::Storage, - Some(t) => t.role(), - } + terms + .iter() + .map(|t| t.role()) + .max_by_key(|r| r.rank()) + .unwrap_or(Role::Storage) } } diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index ce12668e4..f9cd51f38 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -292,6 +292,26 @@ mod term_helper_tests { assert_eq!(Term::role_for_terms(&[Term::Ore]), Role::Ord); } + #[test] + fn role_for_terms_takes_richest_role_order_independently() { + // A mixed-term domain resolves to the richest role by Role::rank + // precedence (Ord > Eq > Match > Storage), regardless of term order — + // consistent with operators_for_terms' union, not the first term. No + // catalog domain is multi-term today; this pins the semantics so a future + // `[Hm, Ore]` domain generates the ord surface (and its aggregates). + assert_eq!(Term::role_for_terms(&[Term::Hm, Term::Ore]), Role::Ord); + assert_eq!(Term::role_for_terms(&[Term::Ore, Term::Hm]), Role::Ord); + assert_eq!(Term::role_for_terms(&[Term::Hm, Term::Bloom]), Role::Eq); + assert_eq!(Term::role_for_terms(&[Term::Bloom, Term::Hm]), Role::Eq); + } + + #[test] + fn role_rank_orders_richest_comparison_highest() { + assert!(Role::Ord.rank() > Role::Eq.rank()); + assert!(Role::Eq.rank() > Role::Match.rank()); + assert!(Role::Match.rank() > Role::Storage.rank()); + } + #[test] fn extractor_terms_dedupes_by_extractor_first_occurrence_wins() { // No catalog domain currently carries two terms sharing an extractor, so diff --git a/mise.toml b/mise.toml index 934856c4a..a20cc0f48 100644 --- a/mise.toml +++ b/mise.toml @@ -164,23 +164,28 @@ description = "Verify the matrix test-name set against the single canonical snap dir = "{{config_root}}/tests/sqlx" run = """ #!/usr/bin/env bash -# ONE canonical, token-normalized snapshot (snapshots/matrix_tests.txt) pins the -# set of macro-emitted matrix test names for the ORDERED scalar shape. There is -# no second committed file for the equality-only shape: an eq-only type's name -# set is exactly the ordered set MINUS the ord-only lines, so the inventory -# DERIVES it from the one baseline (ordered minus `_ord`/`order_by`/ -# `routes_through_ob`). Each discovered type must match either the full baseline -# (ordered) or that derived subset (eq-only). This keeps one committed snapshot -# however many ordered/eq-only types exist. +# Two committed, token-normalized snapshots. The canonical one +# (snapshots/matrix_tests.txt) pins the set of macro-emitted matrix test names +# for the ORDERED scalar shape. The second (snapshots/matrix_tests_eq_only.txt) +# is the equality-only shape: an eq-only type's name set is exactly the ordered +# set MINUS the ord-only lines (`_ord`/`order_by`/`routes_through_ob`), so it is +# DERIVED from the one baseline — but it is also committed and PINNED: the gate +# re-derives the subset at runtime and asserts it equals the committed file +# (step 3 below), so a change to the baseline or the strip filter that alters the +# eq-only set must be re-committed deliberately. Each discovered type must then +# match either the full baseline (ordered) or that derived/pinned subset +# (eq-only). One baseline drives both shapes however many types exist. # # Steps: # 1. List the encrypted_domain binary ONCE (deterministic; reused below). # 2. Discover the set of scalar types present FROM THE BINARY'S OWN OUTPUT # (scalars:::: prefixes) — never a directory glob. -# 3. For each discovered type, normalize its token to and assert its set +# 3. Derive the eq-only subset from the ordered baseline and assert it equals +# the committed snapshots/matrix_tests_eq_only.txt (pins the derivation). +# 4. For each discovered type, normalize its token to and assert its set # equals EITHER the canonical snapshot (ordered) OR the derived eq-only # subset. Assert at least one type is present. -# 4. Completeness cross-check: assert the discovered type set equals +# 5. Completeness cross-check: assert the discovered type set equals # `eql-codegen list-types`. A catalog type added without its matrix wiring # (no scalars:::: tests in the binary) fails here. # diff --git a/tasks/codegen-parity.sh b/tasks/codegen-parity.sh index 8dad670a6..ae3bbfd8b 100755 --- a/tasks/codegen-parity.sh +++ b/tasks/codegen-parity.sh @@ -17,6 +17,22 @@ cargo run -q -p eql-codegen -- > /dev/null tokens=$(find tests/codegen/reference -mindepth 1 -maxdepth 1 -type d \ | sed 's#.*/##' | LC_ALL=C sort) +# Completeness cross-check against the catalog (the single source of truth), +# mirroring the matrix-inventory gate in mise.toml. The per-token loop below is +# golden-DRIVEN, so a new catalog type with no committed reference dir is never +# iterated and would slip through silently. Assert the committed reference dir +# set equals `list-types` (the CATALOG tokens) first so a missing golden fails +# HERE, not only in the Rust gate (crates/eql-codegen/tests/parity.rs, +# reference_dirs_match_catalog_tokens), which remains the in-process +# belt-and-suspenders. `list-types` prints one CATALOG token per line. +catalog_tokens=$(cargo run -q -p eql-codegen -- list-types | LC_ALL=C sort -u) +if [ "$tokens" != "$catalog_tokens" ]; then + echo "reference dirs != catalog tokens (< reference dirs, > catalog list-types):" >&2 + diff <(echo "$tokens") <(echo "$catalog_tokens") >&2 || true + echo "A new catalog type needs a committed tests/codegen/reference// golden." >&2 + exit 1 +fi + for token in $tokens; do ref_dir="tests/codegen/reference/$token" gen_dir="src/v3/scalars/$token" diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 6a2bde216..b82ae8716 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -1,10 +1,11 @@ # Matrix coverage inventory snapshot -This directory holds ONE committed snapshot, `matrix_tests.txt` — the canonical, -token-normalized list of every `scalars::::*` test name in the -`encrypted_domain` SQLx binary, with each type token replaced by the literal -``. It is a **committed test baseline**, not gitignored generated SQL — keep -it in version control. +This directory holds two committed snapshots. The canonical one is +`matrix_tests.txt` — the token-normalized list of every `scalars::::*` test +name in the `encrypted_domain` SQLx binary, with each type token replaced by the +literal ``. The second, `matrix_tests_eq_only.txt`, is *derived* from it (see +below) and pinned. Both are **committed test baselines**, not gitignored +generated SQL — keep them in version control. The per-type `_matrix_tests.txt` files are gone. They were byte-identical modulo the type token (the matrix tests are macro-generated from one diff --git a/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs b/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs new file mode 100644 index 000000000..f09395a1e --- /dev/null +++ b/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs @@ -0,0 +1,349 @@ +//! Operator class tests for `eql_v3.ore_cllw` (the self-contained v3 SEM fork). +//! +//! Mirrors `ore_cllw_opclass_tests.rs` (which covers `eql_v2.ore_cllw`) for the +//! hand-written `eql_v3` copy under `src/v3/sem/ore_cllw/`. Because v3 is a fork, +//! not generated from v2, its comparator, operators, opclass wiring, and extractor +//! NULL semantics can drift independently — the existing v3 coverage is only +//! pg_proc inlinability metadata (`ore_cllw_opclass_tests.rs::backing_functions_are_inlinable` +//! and `encrypted_domain/family/inlinability.rs`), which would not catch a +//! behavioural regression. This file closes that gap. +//! +//! Validates that: +//! - the same-type comparison operators (`=`, `<>`, `<`, `<=`, `>`, `>=`) on +//! `eql_v3.ore_cllw` reduce to `compare_ore_cllw_term(a, b) 0` and return +//! the correct semantics under the CLLW per-byte protocol; +//! - the leading domain-tag byte (`0x00` numeric, `0x01` string) produces the +//! right cross-domain ordering (numeric < string); +//! - the btree operator class `eql_v3.ore_cllw_ops` is registered as +//! `DEFAULT FOR TYPE`, so functional btree indexes on `eql_v3.ore_cllw(col)` +//! pick it up without an explicit opclass annotation; +//! - the planner engages the functional index for `ORDER BY ... LIMIT n` +//! (Index Scan, not Sort) and for a `WHERE` range qual (Index Cond). +//! +//! **v3 surface differences from v2** (confirmed in `src/v3/sem/ore_cllw/`): +//! - composite is `eql_v3.ore_cllw AS (bytes bytea)`; literals via +//! `ROW(decode('','hex'))::eql_v3.ore_cllw`. +//! - there is only ONE extractor overload, `eql_v3.ore_cllw(jsonb)` — v3 has no +//! encrypted-column type, no `ste_vec_entry` domain, and no `->` selector. So +//! the functional-index tests build on a plain `jsonb` column via +//! `eql_v3.ore_cllw(value)`, and the v2 `..._via_arrow_chain` test has no v3 +//! analogue. +//! +//! The test data is hand-crafted byte strings rather than real CLLW ciphertexts; +//! sufficient for opclass-wiring and protocol assertions (the per-byte protocol +//! is identical to v2's, which `ore_cllw_opclass_tests.rs` also exercises). + +use anyhow::Result; +use sqlx::PgPool; + +// Helper: construct an `eql_v3.ore_cllw` literal from a hex string. +// Format: `[tag_byte][cllw_ciphertext_bytes]`. +fn ore_cllw(hex: &str) -> String { + format!("ROW(decode('{hex}', 'hex'))::eql_v3.ore_cllw") +} + +// =========================================================================== +// Operator wiring + CLLW per-byte semantics +// =========================================================================== + +#[sqlx::test] +async fn eq_same_bytes(pool: PgPool) -> Result<()> { + let a = ore_cllw("00aabbcc"); + let result: bool = sqlx::query_scalar(&format!("SELECT {a} = {a}")) + .fetch_one(&pool) + .await?; + assert!(result, "= should be true for identical ore_cllw values"); + Ok(()) +} + +#[sqlx::test] +async fn neq_different_bytes(pool: PgPool) -> Result<()> { + let a = ore_cllw("00aabbcc"); + let b = ore_cllw("00aabbcd"); + let result: bool = sqlx::query_scalar(&format!("SELECT {a} <> {b}")) + .fetch_one(&pool) + .await?; + assert!(result, "<> should be true for different ore_cllw values"); + Ok(()) +} + +#[sqlx::test] +async fn lt_within_domain(pool: PgPool) -> Result<()> { + // Both numeric domain (tag 0x00). Differ at byte 1: a=0x01, b=0x02. + // CLLW: at diff position, y+1 == x means x>y. Here y=0x02 (b), x=0x01 (a). + // y+1 = 0x03 != x → x < y → a < b. + let a = ore_cllw("0001"); + let b = ore_cllw("0002"); + let result: bool = sqlx::query_scalar(&format!("SELECT {a} < {b}")) + .fetch_one(&pool) + .await?; + assert!(result, "< should be true under the CLLW per-byte protocol"); + Ok(()) +} + +#[sqlx::test] +async fn gt_within_domain(pool: PgPool) -> Result<()> { + // Reverse of lt_within_domain: differ at byte 1, a=0x02, b=0x01. + // y+1 = 0x02 = x → x > y → a > b. + let a = ore_cllw("0002"); + let b = ore_cllw("0001"); + let result: bool = sqlx::query_scalar(&format!("SELECT {a} > {b}")) + .fetch_one(&pool) + .await?; + assert!(result, "> should be true under the CLLW per-byte protocol"); + Ok(()) +} + +#[sqlx::test] +async fn lte_includes_equal(pool: PgPool) -> Result<()> { + let a = ore_cllw("0001"); + let b = ore_cllw("0002"); + for sql in [format!("SELECT {a} <= {b}"), format!("SELECT {a} <= {a}")] { + let r: bool = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + assert!(r, "<= true for both less-than and equal: {sql}"); + } + Ok(()) +} + +#[sqlx::test] +async fn gte_includes_equal(pool: PgPool) -> Result<()> { + let a = ore_cllw("0002"); + let b = ore_cllw("0001"); + for sql in [format!("SELECT {a} >= {b}"), format!("SELECT {a} >= {a}")] { + let r: bool = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + assert!(r, ">= true for both greater-than and equal: {sql}"); + } + Ok(()) +} + +// =========================================================================== +// Cross-domain ordering via the leading tag byte +// =========================================================================== + +#[sqlx::test] +async fn numeric_sorts_before_string_via_tag_byte(pool: PgPool) -> Result<()> { + // Numeric tag = 0x00, string tag = 0x01. They differ at byte 0. + // y(string)=0x01, x(numeric)=0x00. y+1=0x02 != x → numeric < string. + let numeric = ore_cllw("00ffffff"); + let string = ore_cllw("01000000"); + let result: bool = sqlx::query_scalar(&format!("SELECT {numeric} < {string}")) + .fetch_one(&pool) + .await?; + assert!( + result, + "numeric (tag 0x00) should sort before string (tag 0x01)" + ); + + let reverse: bool = sqlx::query_scalar(&format!("SELECT {string} > {numeric}")) + .fetch_one(&pool) + .await?; + assert!( + reverse, + "string (tag 0x01) should sort after numeric (tag 0x00)" + ); + Ok(()) +} + +// =========================================================================== +// Opclass registration: DEFAULT FOR TYPE +// =========================================================================== + +#[sqlx::test] +async fn opclass_is_default_for_type(pool: PgPool) -> Result<()> { + // Confirms `eql_v3.ore_cllw_ops` is the default btree opclass for + // `eql_v3.ore_cllw`. Without this, functional btree indexes on the type + // would need an explicit `USING btree (... eql_v3.ore_cllw_ops)` annotation. + let is_default: bool = sqlx::query_scalar( + "SELECT opcdefault + FROM pg_opclass oc + JOIN pg_namespace n ON n.oid = oc.opcnamespace + WHERE n.nspname = 'eql_v3' + AND oc.opcname = 'ore_cllw_ops'", + ) + .fetch_one(&pool) + .await?; + assert!( + is_default, + "eql_v3.ore_cllw_ops should be DEFAULT FOR TYPE eql_v3.ore_cllw" + ); + Ok(()) +} + +// =========================================================================== +// Extractor NULL semantics — `eql_v3.ore_cllw(jsonb)` (the single overload) +// =========================================================================== + +#[sqlx::test] +async fn ore_cllw_extractor_returns_null_when_oc_absent(pool: PgPool) -> Result<()> { + let is_null: bool = sqlx::query_scalar( + "SELECT eql_v3.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"hm\":\"abc\"}'::jsonb) IS NULL", + ) + .fetch_one(&pool) + .await?; + assert!( + is_null, + "eql_v3.ore_cllw(jsonb) should return SQL NULL when `oc` is absent" + ); + Ok(()) +} + +#[sqlx::test] +async fn ore_cllw_extractor_returns_composite_when_oc_present(pool: PgPool) -> Result<()> { + let is_null: bool = sqlx::query_scalar( + "SELECT eql_v3.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"oc\":\"deadbeef\"}'::jsonb) IS NULL", + ) + .fetch_one(&pool) + .await?; + assert!( + !is_null, + "eql_v3.ore_cllw(jsonb) should NOT be NULL when `oc` is present" + ); + Ok(()) +} + +#[sqlx::test] +async fn comparator_returns_null_on_null_composite(pool: PgPool) -> Result<()> { + // The comparator returns SQL NULL (not a raise) when handed a SQL-NULL + // composite — the shape the extractor produces for a missing-`oc` row, which + // btree's NULL handling then filters from range queries. (A non-NULL + // composite with a NULL `bytes` field would raise instead, but that shape is + // unreachable via the extractor.) + let cmp: Option = sqlx::query_scalar( + "SELECT eql_v3.compare_ore_cllw_term(\ + eql_v3.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"hm\":\"abc\"}'::jsonb), \ + eql_v3.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"oc\":\"00ff\"}'::jsonb)\ + )", + ) + .fetch_one(&pool) + .await?; + assert!( + cmp.is_none(), + "compare_ore_cllw_term with a NULL composite should return SQL NULL" + ); + Ok(()) +} + +// =========================================================================== +// Functional-index match: ORDER BY engages Index Scan, not Sort +// +// v3 has no encrypted-column type, so the index is built on a plain jsonb +// column via the single `eql_v3.ore_cllw(jsonb)` extractor overload. +// =========================================================================== + +#[sqlx::test] +async fn functional_index_engages_for_order_by(pool: PgPool) -> Result<()> { + let mut tx = pool.begin().await?; + + sqlx::query( + "CREATE TABLE ore_cllw_v3_test + (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + value jsonb NOT NULL)", + ) + .execute(&mut *tx) + .await?; + + // Seed 20 rows with synthetic data: each `value` carries an `oc` field of + // varying bytes (numeric domain tag, then a counter). + for i in 0..20u8 { + let hex = format!("00{:02x}", i); + let sql = format!( + "INSERT INTO ore_cllw_v3_test(value) \ + VALUES (jsonb_build_object('oc', '{hex}'))" + ); + sqlx::query(&sql).execute(&mut *tx).await?; + } + + // Functional btree on the extractor — no opclass annotation needed because + // `eql_v3.ore_cllw_ops` is DEFAULT FOR TYPE. + sqlx::query( + "CREATE INDEX ore_cllw_v3_test_idx + ON ore_cllw_v3_test (eql_v3.ore_cllw(value))", + ) + .execute(&mut *tx) + .await?; + + // Force the planner to prefer the index even on a tiny fixture (seq scan is + // usually cheaper at 20 rows). + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx) + .await?; + let explain_rows = sqlx::query_scalar::<_, String>( + "EXPLAIN SELECT id FROM ore_cllw_v3_test \ + ORDER BY eql_v3.ore_cllw(value) LIMIT 5", + ) + .fetch_all(&mut *tx) + .await?; + let explain = explain_rows.join("\n"); + + assert!( + explain.contains("Index Scan") || explain.contains("Index Only Scan"), + "Expected Index Scan via ore_cllw_v3_test_idx, got:\n{explain}" + ); + assert!( + !explain.contains("Sort"), + "Expected no Sort node (index walks in order), got:\n{explain}" + ); + + tx.rollback().await?; + Ok(()) +} + +// =========================================================================== +// Functional-index match: WHERE-clause range engages Index Cond +// =========================================================================== + +#[sqlx::test] +async fn functional_index_engages_for_where_range(pool: PgPool) -> Result<()> { + let mut tx = pool.begin().await?; + + sqlx::query( + "CREATE TABLE ore_cllw_v3_where_test + (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + value jsonb NOT NULL)", + ) + .execute(&mut *tx) + .await?; + + // Seed 100 rows so the planner can plausibly prefer an index scan. + for i in 0..100u8 { + let hex = format!("00{:02x}", i); + let sql = format!( + "INSERT INTO ore_cllw_v3_where_test(value) \ + VALUES (jsonb_build_object('oc', '{hex}'))" + ); + sqlx::query(&sql).execute(&mut *tx).await?; + } + + sqlx::query( + "CREATE INDEX ore_cllw_v3_where_test_idx + ON ore_cllw_v3_where_test (eql_v3.ore_cllw(value))", + ) + .execute(&mut *tx) + .await?; + + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx) + .await?; + let explain_rows = sqlx::query_scalar::<_, String>( + "EXPLAIN SELECT id FROM ore_cllw_v3_where_test \ + WHERE eql_v3.ore_cllw(value) \ + < eql_v3.ore_cllw('{\"oc\":\"00aa\"}'::jsonb)", + ) + .fetch_all(&mut *tx) + .await?; + let explain = explain_rows.join("\n"); + + // Accept either Index Scan or Bitmap Index Scan — both are valid + // index-engaging plans for a range qual. The key negative: NO Seq Scan. + assert!( + explain.contains("Index Scan") || explain.contains("Bitmap Index Scan"), + "Expected Index Scan via ore_cllw_v3_where_test_idx for WHERE range, got:\n{explain}" + ); + assert!( + explain.contains("Index Cond"), + "Expected Index Cond clause on the WHERE range, got:\n{explain}" + ); + + tx.rollback().await?; + Ok(()) +} From dd45f6a7a4ac237eac01e6b4969384a563dae304 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 15:15:37 +1000 Subject: [PATCH 148/599] test(v3): cover ore_cllw different-length terms; add comparators to inline-critical check Addresses PR #272 review feedback: - Add three eql_v3.ore_cllw opclass tests exercising compare_ore_cllw_term's different-length branches the equal-length operator tests never hit: shorter-sorts-first on an equal prefix, empty-bytes short-circuit, and a differing shared-prefix byte outranking length. - Add the six ore_cllw_* 2-arg comparators to the eql_v3 SEM inline-critical check in inlinability.rs, mirroring tasks/pin_search_path.sql:275-278 and the ore_block_u64_8_256_* entry; update the doc comment to call out the composite-arg comparators. --- .../encrypted_domain/family/inlinability.rs | 12 ++- tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs | 75 +++++++++++++++++++ 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 3f5929506..5ba4084d4 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -89,10 +89,10 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> /// Direct guard for the self-contained eql_v3 SEM index-term functions. Unlike /// the structural guard above (which covers jsonb-domain-arg functions), these -/// take a composite (ore_block_u64_8_256) or raw jsonb (hmac_256, bloom_filter, -/// the ore_cllw/has_ore_cllw extractors, the two per-encrypted-value -/// `jsonb_array_to_*` helpers) arg, so they are NOT caught by the structural -/// pin-skip and need explicit inline_critical allowlisting. If +/// take a composite (the ore_block_u64_8_256 and ore_cllw comparators) or raw +/// jsonb (hmac_256, bloom_filter, the ore_cllw/has_ore_cllw extractors, the two +/// per-encrypted-value `jsonb_array_to_*` helpers) arg, so they are NOT caught +/// by the structural pin-skip and need explicit inline_critical allowlisting. If /// pin_search_path.sql pins any of them, v3 functional-index inlining silently /// regresses to Seq Scan — this test fails instead. /// @@ -119,6 +119,10 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu 'ore_block_u64_8_256_eq','ore_block_u64_8_256_neq', 'ore_block_u64_8_256_lt','ore_block_u64_8_256_lte', 'ore_block_u64_8_256_gt','ore_block_u64_8_256_gte')) + OR (p.pronargs = 2 AND p.proname IN ( + 'ore_cllw_eq','ore_cllw_neq', + 'ore_cllw_lt','ore_cllw_lte', + 'ore_cllw_gt','ore_cllw_gte')) OR (p.pronargs = 1 AND p.proname IN ( 'hmac_256', 'bloom_filter', diff --git a/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs b/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs index f09395a1e..a72f73ccb 100644 --- a/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs +++ b/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs @@ -144,6 +144,81 @@ async fn numeric_sorts_before_string_via_tag_byte(pool: PgPool) -> Result<()> { Ok(()) } +// =========================================================================== +// Different-length terms +// +// The equal-length operator tests above never exercise the length-handling +// branches of `eql_v3.compare_ore_cllw_term` (src/v3/sem/ore_cllw/functions.sql): +// it trims to the shared prefix, breaks an equal-prefix tie by length (shorter +// sorts first), and short-circuits empty bytes ahead of any per-byte compare. +// These are distinct code paths from the same-length comparator path. +// =========================================================================== + +#[sqlx::test] +async fn shorter_sorts_first_when_prefix_equal(pool: PgPool) -> Result<()> { + // `a` (2 bytes) is a prefix of `b` (3 bytes). The shared prefix (00 01) is + // equal, so the length tie-break decides: the shorter term sorts first + // (functions.sql len_a < len_b → -1). + let a = ore_cllw("0001"); + let b = ore_cllw("000102"); + + let lt: bool = sqlx::query_scalar(&format!("SELECT {a} < {b}")) + .fetch_one(&pool) + .await?; + assert!(lt, "shorter term should sort before its longer prefix-extension"); + + let gt: bool = sqlx::query_scalar(&format!("SELECT {b} > {a}")) + .fetch_one(&pool) + .await?; + assert!(gt, "longer term should sort after its shorter prefix"); + + let neq: bool = sqlx::query_scalar(&format!("SELECT {a} <> {b}")) + .fetch_one(&pool) + .await?; + assert!(neq, "different-length terms with equal prefix are not equal"); + Ok(()) +} + +#[sqlx::test] +async fn empty_sorts_before_nonempty(pool: PgPool) -> Result<()> { + // `decode('', 'hex')` is a zero-length (non-NULL) bytea. The len = 0 + // branches in functions.sql return -1 / 1 / 0 directly, ahead of any byte + // comparison. + let empty = ore_cllw(""); + let nonempty = ore_cllw("0000"); + + let lt: bool = sqlx::query_scalar(&format!("SELECT {empty} < {nonempty}")) + .fetch_one(&pool) + .await?; + assert!(lt, "empty term should sort before a non-empty term"); + + let eq: bool = sqlx::query_scalar(&format!("SELECT {empty} = {empty}")) + .fetch_one(&pool) + .await?; + assert!(eq, "two empty terms compare equal"); + Ok(()) +} + +#[sqlx::test] +async fn differing_prefix_outranks_length(pool: PgPool) -> Result<()> { + // When the shared prefix already differs, the per-byte protocol decides the + // order regardless of length. `a` (2 bytes) is shorter than `b` (3 bytes), + // but they differ at byte 1: b=0x01, a=0x02, and (0x01 + 1) == 0x02 means + // a > b under the CLLW protocol — length does NOT override the prefix. + let a = ore_cllw("0002"); + let b = ore_cllw("0001ff"); + + let gt: bool = sqlx::query_scalar(&format!("SELECT {a} > {b}")) + .fetch_one(&pool) + .await?; + assert!( + gt, + "a differing shared-prefix byte should decide order even when the \ + shorter term would otherwise sort first" + ); + Ok(()) +} + // =========================================================================== // Opclass registration: DEFAULT FOR TYPE // =========================================================================== From 03606598c5e81556d30c7ae1c4d77fe9aeae6405 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 15:34:07 +1000 Subject: [PATCH 149/599] test(v3): pin ore_cllw ROW(NULL) RAISE divergence from eql_v2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit eql_v3.compare_ore_cllw_term guards with `a::text IS NULL` (true only for a genuine SQL-NULL composite), so a hand-crafted ROW(NULL) falls through to the `a.bytes IS NULL` check and RAISES the extractor-invariant violation. eql_v2 guards with `a IS NULL`, which — for a single-field composite — is also true for ROW(NULL), so v2 silently returns NULL and its RAISE branch is unreachable. No committed test exercised this divergence: both the existing v3 and v2 tests only cover the shared SQL-NULL -> RETURN NULL path. Add comparator_raises_on_row_null_composite to validate v3 raises on ROW(NULL), and clarify the sibling NULL-return test's comment to make the divergence explicit. --- tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs b/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs index a72f73ccb..728e03c4a 100644 --- a/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs +++ b/tests/sqlx/tests/ore_cllw_v3_opclass_tests.rs @@ -165,7 +165,10 @@ async fn shorter_sorts_first_when_prefix_equal(pool: PgPool) -> Result<()> { let lt: bool = sqlx::query_scalar(&format!("SELECT {a} < {b}")) .fetch_one(&pool) .await?; - assert!(lt, "shorter term should sort before its longer prefix-extension"); + assert!( + lt, + "shorter term should sort before its longer prefix-extension" + ); let gt: bool = sqlx::query_scalar(&format!("SELECT {b} > {a}")) .fetch_one(&pool) @@ -175,7 +178,10 @@ async fn shorter_sorts_first_when_prefix_equal(pool: PgPool) -> Result<()> { let neq: bool = sqlx::query_scalar(&format!("SELECT {a} <> {b}")) .fetch_one(&pool) .await?; - assert!(neq, "different-length terms with equal prefix are not equal"); + assert!( + neq, + "different-length terms with equal prefix are not equal" + ); Ok(()) } @@ -278,11 +284,10 @@ async fn ore_cllw_extractor_returns_composite_when_oc_present(pool: PgPool) -> R #[sqlx::test] async fn comparator_returns_null_on_null_composite(pool: PgPool) -> Result<()> { - // The comparator returns SQL NULL (not a raise) when handed a SQL-NULL - // composite — the shape the extractor produces for a missing-`oc` row, which - // btree's NULL handling then filters from range queries. (A non-NULL - // composite with a NULL `bytes` field would raise instead, but that shape is - // unreachable via the extractor.) + // SQL-NULL composite (the shape the extractor produces for a missing-`oc` + // row): the comparator returns SQL NULL, which btree's NULL handling then + // filters from range queries. `a::text IS NULL` catches this — a genuine + // SQL-NULL composite casts to NULL text. This path is shared with eql_v2. let cmp: Option = sqlx::query_scalar( "SELECT eql_v3.compare_ore_cllw_term(\ eql_v3.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"hm\":\"abc\"}'::jsonb), \ @@ -298,6 +303,43 @@ async fn comparator_returns_null_on_null_composite(pool: PgPool) -> Result<()> { Ok(()) } +#[sqlx::test] +async fn comparator_raises_on_row_null_composite(pool: PgPool) -> Result<()> { + // EXPLICIT, VALIDATED DIVERGENCE FROM eql_v2. + // + // A hand-crafted `ROW(NULL)::eql_v3.ore_cllw` is NOT a SQL-NULL composite — + // for a single-field composite, `ROW(NULL) IS NULL` is true (row-IS-NULL + // fires when every field is NULL), but `(ROW(NULL))::text` is the non-NULL + // text `()`, so `a::text IS NULL` is FALSE. The value therefore falls + // through v3's first guard to the `a.bytes IS NULL` check and RAISES the + // extractor-invariant violation. + // + // eql_v2's `compare_ore_cllw_term` guards with `a IS NULL` instead, which IS + // true for `ROW(NULL)`, so eql_v2 silently RETURNs NULL here and its RAISE + // branch is unreachable (see eql_v2's own `comparator_raises_on_null_bytes_ + // in_non_null_composite`, which documents the branch as unreachable and + // asserts the NULL return). v3 deliberately uses `a::text IS NULL` so the + // "raise loudly rather than silently misorder" contract is reachable. This + // test pins that divergence — neither the SQL-NULL test above nor the v2 + // suite exercises it. + let err = sqlx::query( + "SELECT eql_v3.compare_ore_cllw_term(\ + ROW(NULL)::eql_v3.ore_cllw, \ + ROW(decode('00ff', 'hex'))::eql_v3.ore_cllw\ + )", + ) + .execute(&pool) + .await + .expect_err("ROW(NULL) composite must RAISE in v3, not return NULL"); + + let msg = format!("{err:?}"); + assert!( + msg.contains("composite has NULL bytes field"), + "expected the extractor-invariant RAISE, got: {msg}" + ); + Ok(()) +} + // =========================================================================== // Functional-index match: ORDER BY engages Index Scan, not Sort // From 44744e773b9e1b5345c26e5c8c3d9cfb908e42fe Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 23:40:44 +1000 Subject: [PATCH 150/599] chore: make dead code a compile error (workspace [lints]) + drop dead index_types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a [workspace.lints] table denying dead_code and unused_imports, with each member crate opting in via [lints] workspace = true. Dead code is now a hard `cargo build`/`cargo test` error, not just a clippy -D warnings CI warning, so an unused fn/field/variant/import cannot rot silently. Also removes tests/sqlx/src/index_types.rs (and its lib.rs mod + IndexTypes re-export). The module was a typo-prevention constants scaffold added with the SQLx test migration (2025-10-27, 47d1c21) but never adopted — all six constants had zero references since creation. It is the kind of dead code the new lint is meant to stop, but rustc's dead_code lint exempts unused *pub* items in a lib crate (it assumes a sibling/downstream crate may use them), and eql_tests is a lib consumed by its integration tests, so the pub module slipped through. Removed by hand; the lint guards the private-dead-code case going forward. Verified: full workspace + every integration test target compiles clean under the new deny policy; eql-scalars/eql-codegen/eql-tests-macros test suites green. --- Cargo.toml | 6 ++++++ crates/eql-codegen/Cargo.toml | 3 +++ crates/eql-scalars/Cargo.toml | 3 +++ crates/eql-tests-macros/Cargo.toml | 3 +++ tests/sqlx/Cargo.toml | 3 +++ tests/sqlx/src/index_types.rs | 21 --------------------- tests/sqlx/src/lib.rs | 2 -- 7 files changed, 18 insertions(+), 23 deletions(-) delete mode 100644 tests/sqlx/src/index_types.rs diff --git a/Cargo.toml b/Cargo.toml index 6e0b67604..b7d177577 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,3 +23,9 @@ members = [ "tests/sqlx", ] default-members = ["tests/sqlx"] + +# Dead code is a hard error. Note: rustc exempts unused `pub` items in a lib, so +# don't `pub` a test-support item unless an integration test consumes it. +[workspace.lints.rust] +dead_code = "deny" +unused_imports = "deny" diff --git a/crates/eql-codegen/Cargo.toml b/crates/eql-codegen/Cargo.toml index b384c977e..0fb89e77b 100644 --- a/crates/eql-codegen/Cargo.toml +++ b/crates/eql-codegen/Cargo.toml @@ -17,3 +17,6 @@ path = "src/main.rs" [lib] name = "eql_codegen" path = "src/lib.rs" + +[lints] +workspace = true diff --git a/crates/eql-scalars/Cargo.toml b/crates/eql-scalars/Cargo.toml index 093b1a121..ca9e5341e 100644 --- a/crates/eql-scalars/Cargo.toml +++ b/crates/eql-scalars/Cargo.toml @@ -8,3 +8,6 @@ description = "Scalar/term catalog for EQL encrypted-domain codegen (std-only, n # generator (eql-codegen) compiles in ~1-2s and never drags serde/toml onto the # SQL build's critical path. Do not add deps here. [dependencies] + +[lints] +workspace = true diff --git a/crates/eql-tests-macros/Cargo.toml b/crates/eql-tests-macros/Cargo.toml index cc92e04c2..6cad3d7ef 100644 --- a/crates/eql-tests-macros/Cargo.toml +++ b/crates/eql-tests-macros/Cargo.toml @@ -12,3 +12,6 @@ syn = { version = "2", features = ["full"] } quote = "1" proc-macro2 = "1" eql-scalars = { path = "../eql-scalars" } + +[lints] +workspace = true diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index e67941c1a..fbdd9506a 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -23,6 +23,9 @@ eql-tests-macros = { path = "../../crates/eql-tests-macros" } [dev-dependencies] # None needed - tests live in this crate +[lints] +workspace = true + [features] default = [] # Opt-in to slow benchmark / regression / scale tests. Without this feature diff --git a/tests/sqlx/src/index_types.rs b/tests/sqlx/src/index_types.rs deleted file mode 100644 index 26603b3c8..000000000 --- a/tests/sqlx/src/index_types.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! Index type constants for EQL tests -//! -//! Prevents typos in index type strings across test files - -/// HMAC-256 index type -pub const HMAC: &str = "hm"; - -/// Blake3 index type -pub const BLAKE3: &str = "b3"; - -/// ORE 64-bit index type -pub const ORE64: &str = "ore64"; - -/// ORE CLLW U64 8-byte index type -pub const ORE_CLLW_U64_8: &str = "ore_cllw_u64_8"; - -/// ORE CLLW Variable 8-byte index type -pub const ORE_CLLW_VAR_8: &str = "ore_cllw_var_8"; - -/// ORE Block U64 8-byte 256-bit index type -pub const ORE_BLOCK_U64_8_256: &str = "ore_block_u64_8_256"; diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 4386222be..471960304 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -7,7 +7,6 @@ use sqlx::PgPool; pub mod assertions; pub mod fixtures; pub mod helpers; -pub mod index_types; pub mod matrix; pub mod scalar_domains; #[macro_use] @@ -37,7 +36,6 @@ pub use helpers::{ read_pg_stat_statements, reset_pg_stat_statements, ExplainStats, PgStatEntry, PLACEHOLDER_PAYLOAD, }; -pub use index_types as IndexTypes; pub use scalar_domains::{ assert_null, assert_raises, assert_scalar_plaintexts, blocker_msg, commute_op, fetch_fixture_payload, sql_string_literal, ScalarDomainSpec, ScalarType, Variant, From 9e4db8551bbfc6259096c0f6a1605393197c3a2b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 23:17:19 +1000 Subject: [PATCH 151/599] fix(v3/sem): address CodeRabbit findings - hmac_256: make has_hmac_256 inlinable (LANGUAGE sql, drop SET search_path) - ore_block_u64_8_256: fix BLOCK->block casing in ORE comparator (cosmetic; plpgsql is case-insensitive) - match_data fixture: correct N-values comment to match the create_encrypted_json(1/2/3) inserts --- src/v3/sem/hmac_256/functions.sql | 8 +++----- src/v3/sem/ore_block_u64_8_256/functions.sql | 2 +- tests/sqlx/fixtures/match_data.sql | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/v3/sem/hmac_256/functions.sql b/src/v3/sem/hmac_256/functions.sql index 9b2592cc5..051975d91 100644 --- a/src/v3/sem/hmac_256/functions.sql +++ b/src/v3/sem/hmac_256/functions.sql @@ -33,10 +33,8 @@ $$; --! @return boolean True if 'hm' field is present and non-null CREATE FUNCTION eql_v3.has_hmac_256(val jsonb) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public AS $$ - BEGIN - RETURN val ->> 'hm' IS NOT NULL; - END; -$$ LANGUAGE plpgsql; + SELECT (val ->> 'hm') IS NOT NULL +$$; diff --git a/src/v3/sem/ore_block_u64_8_256/functions.sql b/src/v3/sem/ore_block_u64_8_256/functions.sql index 815ae6c69..2a13ef317 100644 --- a/src/v3/sem/ore_block_u64_8_256/functions.sql +++ b/src/v3/sem/ore_block_u64_8_256/functions.sql @@ -132,7 +132,7 @@ AS $$ FOR block IN 0..7 LOOP IF substr(a.bytes, 1 + block, 1) != substr(b.bytes, 1 + block, 1) - OR substr(a.bytes, 9 + left_block_size * block, left_block_size) != substr(b.bytes, 9 + left_block_size * BLOCK, left_block_size) + OR substr(a.bytes, 9 + left_block_size * block, left_block_size) != substr(b.bytes, 9 + left_block_size * block, left_block_size) THEN IF eq THEN unequal_block := block; diff --git a/tests/sqlx/fixtures/match_data.sql b/tests/sqlx/fixtures/match_data.sql index bd7a49c51..7e8c5ec89 100644 --- a/tests/sqlx/fixtures/match_data.sql +++ b/tests/sqlx/fixtures/match_data.sql @@ -4,7 +4,7 @@ -- Tests encrypted-to-encrypted matching using bloom filter indexes -- -- Plaintext structure: {"hello": "world", "n": N} --- where N is 10, 20, or 30 for records 1, 2, 3 +-- where N is 1, 2, or 3 for records 1, 2, 3 -- Create table for LIKE operator tests DROP TABLE IF EXISTS encrypted CASCADE; From 4e351883bf44d9bef993c6907f3f5cd053cefb8a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 11:43:00 +1000 Subject: [PATCH 152/599] feat(v3): add eql_v3 encrypted-JSONB (SteVec) document surface Hand-written eql_v3 encrypted-JSONB document type, separate from the scalar materializer. Adds the eql_v3.json / ste_vec_entry / ste_vec_query domains with strict envelope CHECKs; extractors (eq_term, ore_cllw, selector, ciphertext, meta_data) and to_ste_vec_query normalization; containment plus jsonb_path_* / jsonb_array_* helpers; operators (-> ->> @> <@ and entry-level = <> < <= > >=); and a native-jsonb firewall that blocks root-document comparisons and every unsupported native jsonb operator reachable through domain fallback. --- src/v3/jsonb/blockers.sql | 518 ++++++++++++++++++++++++++++++++++++ src/v3/jsonb/functions.sql | 472 ++++++++++++++++++++++++++++++++ src/v3/jsonb/jsonb_test.sql | 103 +++++++ src/v3/jsonb/operators.sql | 388 +++++++++++++++++++++++++++ src/v3/jsonb/types.sql | 178 +++++++++++++ 5 files changed, 1659 insertions(+) create mode 100644 src/v3/jsonb/blockers.sql create mode 100644 src/v3/jsonb/functions.sql create mode 100644 src/v3/jsonb/jsonb_test.sql create mode 100644 src/v3/jsonb/operators.sql create mode 100644 src/v3/jsonb/types.sql diff --git a/src/v3/jsonb/blockers.sql b/src/v3/jsonb/blockers.sql new file mode 100644 index 000000000..7690040a0 --- /dev/null +++ b/src/v3/jsonb/blockers.sql @@ -0,0 +1,518 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/jsonb/types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file v3/jsonb/blockers.sql +--! @brief Native-jsonb firewall for eql_v3.json. +--! +--! eql_v3.json SUPPORTS @> <@ -> ->> (see operators.sql). Comparisons +--! = <> < <= > >= are supported on eql_v3.ste_vec_entry only, not on the root +--! document domain. +--! Every OTHER native jsonb operator reachable via domain fallback against the +--! base type jsonb is BLOCKED here so an encrypted column can never silently +--! route to plaintext-jsonb semantics. The blocked set is KNOWN_JSONB_OPERATORS +--! minus the supported ops: ? ?| ?& @? @@ #> #>> - #- ||. +--! +--! Each blocker is LANGUAGE plpgsql (NEVER STRICT — a STRICT blocker would let +--! PostgreSQL skip the body and return NULL on a NULL argument, bypassing the +--! exception) and delegates to the shared eql_v3.encrypted_domain_unsupported_bool +--! helper. The bound operator must resolve before native fallback, so the +--! firewall fires. + +--! @brief Blocker: ? (key/element exists). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_exists(a eql_v3.json, b text) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '?'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR ? ( + FUNCTION = eql_v3.jsonb_blocked_exists, + LEFTARG = eql_v3.json, + RIGHTARG = text +); + +--! @brief Blocker: ?| (any key exists). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text[] Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_exists_any(a eql_v3.json, b text[]) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '?|'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3.jsonb_blocked_exists_any, + LEFTARG = eql_v3.json, + RIGHTARG = text[] +); + +--! @brief Blocker: ?& (all keys exist). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text[] Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_exists_all(a eql_v3.json, b text[]) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '?&'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3.jsonb_blocked_exists_all, + LEFTARG = eql_v3.json, + RIGHTARG = text[] +); + +--! @brief Blocker: @? (jsonpath exists). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b jsonpath Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_jsonpath_exists(a eql_v3.json, b jsonpath) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '@?'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR @? ( + FUNCTION = eql_v3.jsonb_blocked_jsonpath_exists, + LEFTARG = eql_v3.json, + RIGHTARG = jsonpath +); + +--! @brief Blocker: @@ (jsonpath predicate). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b jsonpath Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_jsonpath_match(a eql_v3.json, b jsonpath) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '@@'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3.jsonb_blocked_jsonpath_match, + LEFTARG = eql_v3.json, + RIGHTARG = jsonpath +); + +--! @brief Blocker: #> (path extract, native returns jsonb). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text[] Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_path_extract(a eql_v3.json, b text[]) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '#>'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR #> ( + FUNCTION = eql_v3.jsonb_blocked_path_extract, + LEFTARG = eql_v3.json, + RIGHTARG = text[] +); + +--! @brief Blocker: #>> (path extract as text). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text[] Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_path_extract_text(a eql_v3.json, b text[]) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '#>>'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3.jsonb_blocked_path_extract_text, + LEFTARG = eql_v3.json, + RIGHTARG = text[] +); + +--! @brief Blocker: - (delete key, text RHS; native returns jsonb). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_delete_text(a eql_v3.json, b text) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '-'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR - ( + FUNCTION = eql_v3.jsonb_blocked_delete_text, + LEFTARG = eql_v3.json, + RIGHTARG = text +); + +--! @brief Blocker: - (delete index, integer RHS). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b integer Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_delete_int(a eql_v3.json, b integer) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '-'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR - ( + FUNCTION = eql_v3.jsonb_blocked_delete_int, + LEFTARG = eql_v3.json, + RIGHTARG = integer +); + +--! @brief Blocker: - (delete keys, text[] RHS). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text[] Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_delete_array(a eql_v3.json, b text[]) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '-'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR - ( + FUNCTION = eql_v3.jsonb_blocked_delete_array, + LEFTARG = eql_v3.json, + RIGHTARG = text[] +); + +--! @brief Blocker: #- (delete at path). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b text[] Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_delete_path(a eql_v3.json, b text[]) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '#-'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR #- ( + FUNCTION = eql_v3.jsonb_blocked_delete_path, + LEFTARG = eql_v3.json, + RIGHTARG = text[] +); + +--! @brief Blocker: || (concatenate, encrypted on the left). +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b jsonb Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_concat(a eql_v3.json, b jsonb) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '||'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR || ( + FUNCTION = eql_v3.jsonb_blocked_concat, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +--! @brief Blocker: || (concatenate, encrypted on the right). +--! @param a jsonb Native LHS operand. +--! @param b eql_v3.json Right operand (encrypted payload). +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_concat_rhs(a jsonb, b eql_v3.json) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '||'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR || ( + FUNCTION = eql_v3.jsonb_blocked_concat_rhs, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +------------------------------------------------------------------------------ +-- Root-document comparison blockers. +------------------------------------------------------------------------------ + +--! @brief Blocker: root eql_v3.json document comparisons. +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b eql_v3.json Right operand (encrypted payload). +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_compare_json_json(a eql_v3.json, b eql_v3.json) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', 'comparison'); +END; +$$ LANGUAGE plpgsql; + +--! @brief Blocker: root eql_v3.json-to-jsonb comparisons. +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b jsonb Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_compare_json_jsonb(a eql_v3.json, b jsonb) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', 'comparison'); +END; +$$ LANGUAGE plpgsql; + +--! @brief Blocker: root jsonb-to-eql_v3.json comparisons. +--! @param a jsonb Native LHS operand. +--! @param b eql_v3.json Right operand (encrypted payload). +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_compare_jsonb_json(a jsonb, b eql_v3.json) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', 'comparison'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR = ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_json, + LEFTARG = eql_v3.json, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.jsonb_blocked_compare_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_json, + LEFTARG = eql_v3.json, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.jsonb_blocked_compare_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_json, + LEFTARG = eql_v3.json, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.jsonb_blocked_compare_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_json, + LEFTARG = eql_v3.json, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.jsonb_blocked_compare_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_json, + LEFTARG = eql_v3.json, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.jsonb_blocked_compare_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_json, + LEFTARG = eql_v3.json, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.jsonb_blocked_compare_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.jsonb_blocked_compare_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +------------------------------------------------------------------------------ +-- Mixed jsonb containment blockers. +------------------------------------------------------------------------------ + +--! @brief Blocker: @> with encrypted root document and native jsonb. +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b jsonb Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_contains_json_jsonb(a eql_v3.json, b jsonb) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '@>'); +END; +$$ LANGUAGE plpgsql; + +--! @brief Blocker: @> with native jsonb and encrypted root document. +--! @param a jsonb Native LHS operand. +--! @param b eql_v3.json Right operand (encrypted payload). +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_contains_jsonb_json(a jsonb, b eql_v3.json) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '@>'); +END; +$$ LANGUAGE plpgsql; + +--! @brief Blocker: <@ with encrypted root document and native jsonb. +--! @param a eql_v3.json Left operand (encrypted payload). +--! @param b jsonb Native RHS operand. +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_contained_json_jsonb(a eql_v3.json, b jsonb) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '<@'); +END; +$$ LANGUAGE plpgsql; + +--! @brief Blocker: <@ with native jsonb and encrypted root document. +--! @param a jsonb Native LHS operand. +--! @param b eql_v3.json Right operand (encrypted payload). +--! @return boolean Never returns; always raises 'operator not supported'. +CREATE FUNCTION eql_v3.jsonb_blocked_contained_jsonb_json(a jsonb, b eql_v3.json) +RETURNS boolean +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '<@'); +END; +$$ LANGUAGE plpgsql; + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.jsonb_blocked_contains_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.jsonb_blocked_contains_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.jsonb_blocked_contained_json_jsonb, + LEFTARG = eql_v3.json, + RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.jsonb_blocked_contained_jsonb_json, + LEFTARG = jsonb, + RIGHTARG = eql_v3.json +); diff --git a/src/v3/jsonb/functions.sql b/src/v3/jsonb/functions.sql new file mode 100644 index 000000000..bfb4f38c0 --- /dev/null +++ b/src/v3/jsonb/functions.sql @@ -0,0 +1,472 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/jsonb/types.sql +-- REQUIRE: src/v3/sem/ore_cllw/types.sql +-- REQUIRE: src/v3/sem/ore_cllw/functions.sql + +--! @file v3/jsonb/functions.sql +--! @brief Extractors, containment engine, and path/array functions for the +--! eql_v3 encrypted-JSONB (SteVec) surface. +--! +--! `selector` parameters here are *encrypted-side* selector hashes — the +--! deterministic hash the crypto layer emits in the `s` field of each sv +--! element. Plaintext JSONPaths are never accepted at runtime. + +------------------------------------------------------------------------------ +-- Envelope helpers (eql_v3 owns these; jsonb-only) +------------------------------------------------------------------------------ + +--! @brief Extract metadata (i, v) from a raw jsonb encrypted value. +--! @param val jsonb encrypted EQL payload +--! @return jsonb Metadata object with `i` and `v` fields. +CREATE FUNCTION eql_v3.meta_data(val jsonb) + RETURNS jsonb + IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE SQL +AS $$ + SELECT jsonb_build_object('i', val->'i', 'v', val->'v'); +$$; + +COMMENT ON FUNCTION eql_v3.meta_data(jsonb) IS + 'eql-inline-critical: raw-jsonb envelope helper used by v3 jsonb wrappers; must stay inlinable (unpinned search_path)'; + +--! @brief Extract ciphertext (c) from a raw jsonb encrypted value. +--! @param val jsonb encrypted EQL payload +--! @return text Base64-encoded ciphertext. +--! @throws Exception if `c` is absent. +CREATE FUNCTION eql_v3.ciphertext(val jsonb) + RETURNS text + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + IF val ? 'c' THEN + RETURN val->>'c'; + END IF; + RAISE 'Expected a ciphertext (c) value in json: %', val; + END; +$$ LANGUAGE plpgsql; + +------------------------------------------------------------------------------ +-- Selector extractors +------------------------------------------------------------------------------ + +--! @brief Extract selector (s) from a raw jsonb encrypted value. +--! @param val jsonb encrypted EQL payload +--! @return text The selector value. +--! @throws Exception if `s` is absent. +CREATE FUNCTION eql_v3.selector(val jsonb) + RETURNS text + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + IF val ? 's' THEN + RETURN val->>'s'; + END IF; + RAISE 'Expected a selector index (s) value in json: %', val; + END; +$$ LANGUAGE plpgsql; + +--! @brief Extract selector (s) from a ste_vec entry. The DOMAIN CHECK +--! guarantees `s` is present, so this is a simple field access. +--! @param entry eql_v3.ste_vec_entry +--! @return text The selector value. +CREATE FUNCTION eql_v3.selector(entry eql_v3.ste_vec_entry) + RETURNS text + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT entry ->> 's' +$$; + +------------------------------------------------------------------------------ +-- Equality-term extractor (XOR-aware: coalesce(hm, oc)) +------------------------------------------------------------------------------ + +--! @brief XOR-aware equality term extractor for eql_v3.ste_vec_entry. +--! +--! Returns the bytea of whichever deterministic term the sv entry carries — +--! `hm` (HMAC-256) or `oc` (CLLW ORE). The two byte distributions are disjoint +--! by construction, so byte equality on the coalesce is unambiguous. Canonical +--! equality extractor used by `=` / `<>` on ste_vec_entry. +--! +--! @param entry eql_v3.ste_vec_entry +--! @return bytea Decoded `hm` or `oc` bytes (NULL if entry is NULL). +CREATE FUNCTION eql_v3.eq_term(entry eql_v3.ste_vec_entry) + RETURNS bytea + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT decode(coalesce(entry ->> 'hm', entry ->> 'oc'), 'hex') +$$; + +------------------------------------------------------------------------------ +-- ORE CLLW per-entry overloads (live here so sem/ore_cllw stays a leaf) +------------------------------------------------------------------------------ + +--! @brief Extract CLLW ORE index term from a ste_vec entry. +--! +--! `oc` is only ever present on an sv element, never at a root encrypted value, +--! so the typed overload accepts eql_v3.ste_vec_entry. Returns SQL NULL when +--! `oc` is absent (btree NULL-filters such rows from range queries). +--! +--! @param entry eql_v3.ste_vec_entry +--! @return eql_v3.ore_cllw Composite carrying the CLLW ciphertext, or NULL. +--! @see eql_v3.has_ore_cllw +CREATE FUNCTION eql_v3.ore_cllw(entry eql_v3.ste_vec_entry) + RETURNS eql_v3.ore_cllw + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT CASE WHEN entry ->> 'oc' IS NULL THEN NULL + ELSE ROW(decode(entry ->> 'oc', 'hex'))::eql_v3.ore_cllw + END +$$; + +--! @brief Check if a ste_vec entry contains a CLLW ORE index term. +--! @param entry eql_v3.ste_vec_entry +--! @return boolean True if `oc` is present and non-null. +CREATE FUNCTION eql_v3.has_ore_cllw(entry eql_v3.ste_vec_entry) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT entry ->> 'oc' IS NOT NULL +$$; + +------------------------------------------------------------------------------ +-- sv-array helpers +------------------------------------------------------------------------------ + +--! @brief Extract the sv element array as raw jsonb[]. +--! +--! Returns the elements of `sv` (or a single-element array wrapping the value +--! when there is no `sv`). No envelope re-wrapping — raw jsonb elements. +--! +--! @param val jsonb encrypted EQL payload +--! @return jsonb[] Array of sv elements. +CREATE FUNCTION eql_v3.ste_vec(val jsonb) + RETURNS jsonb[] + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + sv jsonb; + ary jsonb[]; + BEGIN + IF val ? 'sv' THEN + sv := val->'sv'; + ELSE + sv := jsonb_build_array(val); + END IF; + + SELECT array_agg(elem) + INTO ary + FROM jsonb_array_elements(sv) AS elem; + + RETURN ary; + END; +$$ LANGUAGE plpgsql; + +--! @brief Check if a jsonb payload is marked as an sv array (`a` flag true). +--! @param val jsonb encrypted EQL payload +--! @return boolean True if `a` is present and true. +CREATE FUNCTION eql_v3.is_ste_vec_array(val jsonb) + RETURNS boolean + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + BEGIN + IF val ? 'a' THEN + RETURN (val->>'a')::boolean; + END IF; + RETURN false; + END; +$$ LANGUAGE plpgsql; + +------------------------------------------------------------------------------ +-- Deterministic-fields array for GIN containment +------------------------------------------------------------------------------ + +--! @brief Extract deterministic search fields (s, hm, oc, op) per sv element. +--! +--! Excludes non-deterministic ciphertext so PostgreSQL's native jsonb `@>` can +--! compare for containment. Use for GIN indexes and containment queries. +--! +--! @param val jsonb encrypted EQL payload +--! @return jsonb[] Array of objects with only deterministic fields. +CREATE FUNCTION eql_v3.jsonb_array(val jsonb) +RETURNS jsonb[] +IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE SQL +AS $$ + SELECT ARRAY( + SELECT jsonb_object_agg(kv.key, kv.value) + FROM jsonb_array_elements( + CASE WHEN val ? 'sv' THEN val->'sv' ELSE jsonb_build_array(val) END + ) AS elem, + LATERAL jsonb_each(elem) AS kv(key, value) + WHERE kv.key IN ('s', 'hm', 'oc', 'op') + GROUP BY elem + ); +$$; + +COMMENT ON FUNCTION eql_v3.jsonb_array(jsonb) IS + 'eql-inline-critical: raw-jsonb deterministic-field array helper; must stay inlinable (unpinned search_path)'; + +------------------------------------------------------------------------------ +-- Containment +------------------------------------------------------------------------------ + +--! @brief GIN-indexable containment check: does `a` contain all of `b`? +--! @param a jsonb Container payload. +--! @param b jsonb Search payload. +--! @return boolean True if a contains all deterministic elements of b. +CREATE FUNCTION eql_v3.jsonb_contains(a jsonb, b jsonb) +RETURNS boolean +IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE SQL +AS $$ + SELECT eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b); +$$; + +COMMENT ON FUNCTION eql_v3.jsonb_contains(jsonb, jsonb) IS + 'eql-inline-critical: raw-jsonb containment helper; must stay inlinable (unpinned search_path)'; + +--! @brief GIN-indexable "is contained by" check. +--! @param a jsonb Payload to check. +--! @param b jsonb Container payload. +--! @return boolean True if all elements of a are contained in b. +CREATE FUNCTION eql_v3.jsonb_contained_by(a jsonb, b jsonb) +RETURNS boolean +IMMUTABLE STRICT PARALLEL SAFE +LANGUAGE SQL +AS $$ + SELECT eql_v3.jsonb_array(a) <@ eql_v3.jsonb_array(b); +$$; + +COMMENT ON FUNCTION eql_v3.jsonb_contained_by(jsonb, jsonb) IS + 'eql-inline-critical: raw-jsonb contained-by helper; must stay inlinable (unpinned search_path)'; + +--! @brief Check if an sv array contains a specific sv element. +--! +--! Match = selector equal AND eq_term equal (byte-equality over coalesce(hm, +--! oc)). This collapses the v2 hm/oc CASE: under the XOR contract both terms +--! are deterministic and byte-disjoint, so either one is a valid equality +--! discriminator and a single byte comparison is correct. +--! +--! ASSUMPTION (locked by a negative test in v3_jsonb_tests.rs): hm and oc byte +--! distributions never collide at a given selector. The crypto layer configures +--! a selector for eq XOR ordered, so both sides of a real comparison carry the +--! same term type; and an oc value carries a leading domain-tag byte an hm never +--! has. Unlike v2's explicit `has_hmac(both)`/`has_ore_cllw(both)`/`ELSE false` +--! CASE, this collapse would wrongly match an hm needle against an oc leaf if +--! their hex bytes were ever identical — which the contract prevents. The +--! negative-containment test guards against regression. +--! +--! @param a jsonb[] sv array to search within. +--! @param b jsonb sv element to search for. +--! @return boolean True if b is found in any element of a. +CREATE FUNCTION eql_v3.ste_vec_contains(a jsonb[], b jsonb) + RETURNS boolean + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + result boolean; + _a jsonb; + BEGIN + result := false; + + FOR idx IN 1..array_length(a, 1) LOOP + _a := a[idx]; + result := result OR ( + eql_v3.selector(_a) = eql_v3.selector(b) + AND eql_v3.eq_term(_a::eql_v3.ste_vec_entry) = eql_v3.eq_term(b::eql_v3.ste_vec_entry) + ); + EXIT WHEN result; + END LOOP; + + RETURN result; + END; +$$ LANGUAGE plpgsql; + +--! @brief Does encrypted value `a` contain all sv elements of `b`? +--! +--! Empty b is always contained. Each element of b must match selector + eq_term +--! in some element of a. +--! +--! @param a eql_v3.json Container. +--! @param b eql_v3.json Elements to find. +--! @return boolean True if all elements of b are contained in a. +--! @see eql_v3.ste_vec_contains(jsonb[], jsonb) +CREATE FUNCTION eql_v3.ste_vec_contains(a eql_v3.json, b eql_v3.json) + RETURNS boolean + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + result boolean; + sv_a jsonb[]; + sv_b jsonb[]; + _b jsonb; + BEGIN + sv_a := eql_v3.ste_vec(a); + sv_b := eql_v3.ste_vec(b); + + IF array_length(sv_b, 1) IS NULL THEN + RETURN true; + END IF; + + IF array_length(sv_a, 1) IS NULL THEN + RETURN false; + END IF; + + result := true; + + FOR idx IN 1..array_length(sv_b, 1) LOOP + _b := sv_b[idx]; + result := result AND eql_v3.ste_vec_contains(sv_a, _b); + END LOOP; + + RETURN result; + END; +$$ LANGUAGE plpgsql; + +------------------------------------------------------------------------------ +-- Path queries (text selector only) +------------------------------------------------------------------------------ + +--! @brief Query encrypted JSONB for sv elements matching `selector`. +--! +--! Returns one ste_vec_entry row per matching encrypted element. Returns empty +--! set on no match. It deliberately does not wrap multiple matches as an +--! eql_v3.json document, because the root document domain requires an `sv` +--! array and single leaves belong to eql_v3.ste_vec_entry. +--! +--! @param val jsonb encrypted EQL payload with `sv`. +--! @param selector text Selector hash (`s` value). +--! @return SETOF eql_v3.ste_vec_entry Matching encrypted entries. +--! @see eql_v3.jsonb_path_query_first +CREATE FUNCTION eql_v3.jsonb_path_query(val jsonb, selector text) + RETURNS SETOF eql_v3.ste_vec_entry + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT (eql_v3.meta_data(val) || elem)::eql_v3.ste_vec_entry + FROM jsonb_array_elements(val -> 'sv') elem + WHERE elem ->> 's' = selector +$$; + +COMMENT ON FUNCTION eql_v3.jsonb_path_query(jsonb, text) IS + 'eql-inline-critical: raw-jsonb path query helper; must stay inlinable (unpinned search_path)'; + +--! @brief Check if a selector path exists in encrypted JSONB. +--! @param val jsonb encrypted EQL payload. +--! @param selector text Selector hash to test. +--! @return boolean True if a matching element exists. +CREATE FUNCTION eql_v3.jsonb_path_exists(val jsonb, selector text) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT EXISTS ( + SELECT 1 FROM jsonb_array_elements(val -> 'sv') elem + WHERE elem ->> 's' = selector + ); +$$; + +COMMENT ON FUNCTION eql_v3.jsonb_path_exists(jsonb, text) IS + 'eql-inline-critical: raw-jsonb path exists helper; must stay inlinable (unpinned search_path)'; + +--! @brief Get the first sv element matching `selector`, or NULL. +--! @param val jsonb encrypted EQL payload. +--! @param selector text Selector hash to match. +--! @return eql_v3.ste_vec_entry First matching element or NULL. +CREATE FUNCTION eql_v3.jsonb_path_query_first(val jsonb, selector text) + RETURNS eql_v3.ste_vec_entry + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT (eql_v3.meta_data(val) || elem)::eql_v3.ste_vec_entry + FROM jsonb_array_elements(val -> 'sv') elem + WHERE elem ->> 's' = selector + LIMIT 1 +$$; + +COMMENT ON FUNCTION eql_v3.jsonb_path_query_first(jsonb, text) IS + 'eql-inline-critical: raw-jsonb path first helper; must stay inlinable (unpinned search_path)'; + +------------------------------------------------------------------------------ +-- Array functions +------------------------------------------------------------------------------ + +--! @brief Get the length of an encrypted JSONB array. +--! @param val jsonb encrypted EQL payload (must have `a` flag true). +--! @return integer Number of elements. +--! @throws Exception 'cannot get array length of a non-array' if not an array. +CREATE FUNCTION eql_v3.jsonb_array_length(val jsonb) + RETURNS integer + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + sv jsonb[]; + BEGIN + IF eql_v3.is_ste_vec_array(val) THEN + sv := eql_v3.ste_vec(val); + RETURN array_length(sv, 1); + END IF; + + RAISE 'cannot get array length of a non-array'; + END; +$$ LANGUAGE plpgsql; + +--! @brief Extract elements of an encrypted JSONB array as rows. +--! @param val jsonb encrypted EQL payload (must have `a` flag true). +--! @return SETOF eql_v3.ste_vec_entry One row per element (metadata preserved). +--! @throws Exception 'cannot extract elements from non-array' if not an array. +CREATE FUNCTION eql_v3.jsonb_array_elements(val jsonb) + RETURNS SETOF eql_v3.ste_vec_entry + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + sv jsonb[]; + meta jsonb; + item jsonb; + BEGIN + IF NOT eql_v3.is_ste_vec_array(val) THEN + RAISE 'cannot extract elements from non-array'; + END IF; + + meta := eql_v3.meta_data(val); + sv := eql_v3.ste_vec(val); + + FOR idx IN 1..array_length(sv, 1) LOOP + item = sv[idx]; + RETURN NEXT (meta || item)::eql_v3.ste_vec_entry; + END LOOP; + + RETURN; + END; +$$ LANGUAGE plpgsql; + +--! @brief Extract elements of an encrypted JSONB array as ciphertext text. +--! @param val jsonb encrypted EQL payload (must have `a` flag true). +--! @return SETOF text One ciphertext per element. +--! @throws Exception 'cannot extract elements from non-array' if not an array. +CREATE FUNCTION eql_v3.jsonb_array_elements_text(val jsonb) + RETURNS SETOF text + IMMUTABLE STRICT PARALLEL SAFE + SET search_path = pg_catalog, extensions, public +AS $$ + DECLARE + sv jsonb[]; + BEGIN + IF NOT eql_v3.is_ste_vec_array(val) THEN + RAISE 'cannot extract elements from non-array'; + END IF; + + sv := eql_v3.ste_vec(val); + + FOR idx IN 1..array_length(sv, 1) LOOP + RETURN NEXT eql_v3.ciphertext(sv[idx]); + END LOOP; + + RETURN; + END; +$$ LANGUAGE plpgsql; diff --git a/src/v3/jsonb/jsonb_test.sql b/src/v3/jsonb/jsonb_test.sql new file mode 100644 index 000000000..be8064df4 --- /dev/null +++ b/src/v3/jsonb/jsonb_test.sql @@ -0,0 +1,103 @@ +-- NOT A BUILD FILE: matched by the `*_test.sql` build-glob exclusion. +-- Run against a DB with the combined release installed: +-- psql "$CONN" -v ON_ERROR_STOP=1 -f src/v3/jsonb/jsonb_test.sql + +DO $$ +DECLARE + doc eql_v3.json; + needle eql_v3.json; + entry_a eql_v3.ste_vec_entry; + entry_b eql_v3.ste_vec_entry; + entry_count integer; + raised boolean; +BEGIN + -- A two-element sv document: one hm leaf, one oc leaf. + doc := '{ + "i": {"c": "col", "t": "encrypted"}, "v": 2, "sv": [ + {"s": "sel_hm", "c": "ct1", "hm": "8067db44a848ab32c3056a3dbe4edf16"}, + {"s": "sel_oc", "c": "ct2", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b"} + ] + }'::eql_v3.json; + + -- domain CHECK: missing envelope keys must reject. + BEGIN + raised := false; + PERFORM '{"sv": []}'::eql_v3.json; + EXCEPTION WHEN check_violation THEN raised := true; + END; + IF NOT raised THEN RAISE EXCEPTION 'eql_v3.json accepted a payload missing v/i'; END IF; + + -- domain CHECK: wrong envelope version must reject. + BEGIN + raised := false; + PERFORM '{"i":{},"v":3,"sv":[]}'::eql_v3.json; + EXCEPTION WHEN check_violation THEN raised := true; + END; + IF NOT raised THEN RAISE EXCEPTION 'eql_v3.json accepted an envelope with v != 2'; END IF; + + -- ste_vec_entry CHECK: both hm and oc must reject. + BEGIN + raised := false; + PERFORM '{"s":"x","c":"y","hm":"aa","oc":"bb"}'::eql_v3.ste_vec_entry; + EXCEPTION WHEN check_violation THEN raised := true; + END; + IF NOT raised THEN RAISE EXCEPTION 'ste_vec_entry accepted both hm and oc'; END IF; + + -- -> extracts an entry by selector. NOTE: the selector literal MUST be typed + -- (`::text`). A bare untyped literal (`doc -> 'sel_hm'`) resolves to the native + -- `jsonb -> text` operator because PostgreSQL reduces the `eql_v3.json` domain to + -- its base type during operator resolution of an unknown-typed RHS — see + -- docs/decisions/2026-06-10-eql-v3-json-type-kind.md. Typed operands (the Proxy + -- interface) always resolve to our operator. + entry_a := doc -> 'sel_hm'::text; + IF eql_v3.selector(entry_a) <> 'sel_hm' THEN RAISE EXCEPTION '-> selector mismatch'; END IF; + + -- ->> returns text (selector typed for the same reason as above). + IF (doc ->> 'sel_hm'::text) IS NULL THEN RAISE EXCEPTION '->> returned NULL'; END IF; + + -- path/array functions return ste_vec_entry values, not eql_v3.json documents. + SELECT count(*) INTO entry_count FROM eql_v3.jsonb_path_query(doc::jsonb, 'sel_hm') AS e; + IF entry_count <> 1 THEN RAISE EXCEPTION 'jsonb_path_query did not return one matching entry'; END IF; + + entry_b := eql_v3.jsonb_path_query_first(doc::jsonb, 'sel_hm'); + IF eql_v3.selector(entry_b) <> 'sel_hm' THEN RAISE EXCEPTION 'jsonb_path_query_first selector mismatch'; END IF; + + SELECT count(*) INTO entry_count + FROM eql_v3.jsonb_array_elements( + '{"i":{},"v":2,"a":true,"sv":[{"s":"aa","c":"x","hm":"00"},{"s":"bb","c":"y","hm":"11"}]}'::eql_v3.json::jsonb + ) AS e; + IF entry_count <> 2 THEN RAISE EXCEPTION 'jsonb_array_elements did not return two entries'; END IF; + + -- entry equality across hm leaves (same hm in needle). + entry_b := '{"s":"sel_hm","c":"other","hm":"8067db44a848ab32c3056a3dbe4edf16"}'::eql_v3.ste_vec_entry; + IF NOT (entry_a = entry_b) THEN RAISE EXCEPTION 'eq_term equality failed for hm leaf'; END IF; + + -- ordered comparison on oc leaves: a smaller oc < a larger oc. + IF NOT ( + '{"s":"o","c":"x","oc":"fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b"}'::eql_v3.ste_vec_entry + < + '{"s":"o","c":"x","oc":"fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbca"}'::eql_v3.ste_vec_entry + ) THEN RAISE EXCEPTION 'ordered < on oc leaves failed'; END IF; + + -- containment: doc contains itself. + needle := doc; + IF NOT (doc @> needle) THEN RAISE EXCEPTION '@> self-containment failed'; END IF; + + -- each blocked operator raises. Operands are typed so resolution reaches our + -- blocker rather than native jsonb (see the -> note above): `'sel_hm'::text`, + -- `ARRAY[...]::text[]`, `'{}'::jsonb`. + raised := false; + BEGIN PERFORM doc ? 'sel_hm'::text; EXCEPTION WHEN OTHERS THEN raised := true; END; + IF NOT raised THEN RAISE EXCEPTION 'blocker ? did not raise'; END IF; + + raised := false; + BEGIN PERFORM doc #> ARRAY['sel_hm']; EXCEPTION WHEN OTHERS THEN raised := true; END; + IF NOT raised THEN RAISE EXCEPTION 'blocker #> did not raise'; END IF; + + raised := false; + BEGIN PERFORM doc || '{}'::jsonb; EXCEPTION WHEN OTHERS THEN raised := true; END; + IF NOT raised THEN RAISE EXCEPTION 'blocker || did not raise'; END IF; + + RAISE NOTICE 'v3 jsonb smoke OK'; +END; +$$; diff --git a/src/v3/jsonb/operators.sql b/src/v3/jsonb/operators.sql new file mode 100644 index 000000000..2cb1bbe3f --- /dev/null +++ b/src/v3/jsonb/operators.sql @@ -0,0 +1,388 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/jsonb/types.sql +-- REQUIRE: src/v3/jsonb/functions.sql +-- REQUIRE: src/v3/sem/ore_cllw/operators.sql + +--! @file v3/jsonb/operators.sql +--! @brief Operators on eql_v3.json and eql_v3.ste_vec_entry. + +------------------------------------------------------------------------------ +-- -> field accessor (returns ste_vec_entry) +------------------------------------------------------------------------------ + +--! @brief -> operator with text selector. +--! +--! Returns the sv entry whose `s` equals @p selector, with root `i`/`v` merged +--! in. Inlinable: `WHERE col -> 'sel' = $1` reduces structurally to +--! `eql_v3.eq_term(col -> 'sel') = eql_v3.eq_term($1)` and matches a functional +--! index on `eql_v3.eq_term(col -> 'sel')`. +--! +--! @warning The selector operand MUST carry a known type — a text-typed +--! parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::text`). +--! A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> text` +--! operator and silently returns native jsonb semantics (a root-key lookup, +--! typically NULL), NOT this operator: PostgreSQL reduces the `eql_v3.json` +--! domain to its base type `jsonb` when resolving an unknown-typed RHS, and the +--! native base-type operator wins the exact-match tiebreak. This is intrinsic to +--! the domain type-kind and applies to the native-jsonb blockers too. See +--! docs/decisions/2026-06-10-eql-v3-json-type-kind.md. +--! +--! @param e eql_v3.json Root encrypted payload. +--! @param selector text Selector hash. +--! @return eql_v3.ste_vec_entry Matching entry merged with root meta, or NULL. +CREATE FUNCTION eql_v3."->"(e eql_v3.json, selector text) + RETURNS eql_v3.ste_vec_entry + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT ( + eql_v3.meta_data(e) || + jsonb_path_query_first( + e, + '$.sv[*] ? (@.s == $sel)'::jsonpath, + jsonb_build_object('sel', selector) + ) + )::eql_v3.ste_vec_entry +$$; + +CREATE OPERATOR ->( + FUNCTION=eql_v3."->", + LEFTARG=eql_v3.json, + RIGHTARG=text +); + +--! @brief -> operator with integer array index (0-based, JSONB convention). +--! @param e eql_v3.json Encrypted sv-array payload. +--! @param selector integer Array index. +--! @return eql_v3.ste_vec_entry Matching entry merged with root meta, or NULL. +CREATE FUNCTION eql_v3."->"(e eql_v3.json, selector integer) + RETURNS eql_v3.ste_vec_entry + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT CASE + WHEN eql_v3.is_ste_vec_array(e) THEN + -- NOTE: `e::jsonb` is REQUIRED. `e` is eql_v3.json and the custom + -- `->(eql_v3.json, text)` operator is already created earlier in + -- this file, so a bare `e -> 'sv'` would resolve to that selector-lookup + -- operator (searching for an sv entry with selector 'sv') instead of + -- native jsonb array access. Casting to jsonb forces native `->`. + (eql_v3.meta_data(e) || (e::jsonb -> 'sv' -> selector))::eql_v3.ste_vec_entry + ELSE NULL + END +$$; + +CREATE OPERATOR ->( + FUNCTION=eql_v3."->", + LEFTARG=eql_v3.json, + RIGHTARG=integer +); + +------------------------------------------------------------------------------ +-- ->> field accessor (alias of -> coerced to text) +------------------------------------------------------------------------------ + +--! @brief ->> operator with text selector. Inlinable alias of -> coerced to +--! text. +--! +--! Intentional v2 parity: this serializes the entire matched ste_vec_entry +--! object as JSON text. It does not decrypt or return scalar plaintext like +--! native `jsonb ->>`. +--! @param e eql_v3.json Encrypted payload. +--! @param selector text Field selector hash. +--! @return text The matching entry as text. +CREATE FUNCTION eql_v3."->>"(e eql_v3.json, selector text) + RETURNS text + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3."->"(e, selector)::jsonb::text +$$; + +CREATE OPERATOR ->> ( + FUNCTION=eql_v3."->>", + LEFTARG=eql_v3.json, + RIGHTARG=text +); + +--! @brief ->> operator with integer array index. Inlinable alias of +--! ->(json, integer) coerced to text. +--! @param e eql_v3.json Encrypted sv-array payload. +--! @param selector integer Array index. +--! @return text The matching entry as text. +CREATE FUNCTION eql_v3."->>"(e eql_v3.json, selector integer) + RETURNS text + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3."->"(e, selector)::jsonb::text +$$; + +CREATE OPERATOR ->> ( + FUNCTION=eql_v3."->>", + LEFTARG=eql_v3.json, + RIGHTARG=integer +); + +------------------------------------------------------------------------------ +-- @> containment +------------------------------------------------------------------------------ + +--! @brief @> contains operator (document, document). +--! @param a eql_v3.json Container. +--! @param b eql_v3.json Contained value. +--! @return boolean True if a contains b. +--! @see eql_v3.ste_vec_contains +CREATE FUNCTION eql_v3."@>"(a eql_v3.json, b eql_v3.json) +RETURNS boolean +LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.ste_vec_contains(a, b) +$$; + +CREATE OPERATOR @>( + FUNCTION=eql_v3."@>", + LEFTARG=eql_v3.json, + RIGHTARG=eql_v3.json +); + +--! @brief @> contains operator with an ste_vec_query needle. +--! +--! Inlines to native `jsonb @>` over `eql_v3.to_ste_vec_query(a)::jsonb`, so a +--! functional GIN index on the same expression engages. +--! +--! @param a eql_v3.json Container. +--! @param b eql_v3.ste_vec_query Query payload. +--! @return boolean True if a contains b. +CREATE FUNCTION eql_v3."@>"(a eql_v3.json, b eql_v3.ste_vec_query) +RETURNS boolean +LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.to_ste_vec_query(a)::jsonb @> b::jsonb +$$; + +CREATE OPERATOR @>( + FUNCTION=eql_v3."@>", + LEFTARG=eql_v3.json, + RIGHTARG=eql_v3.ste_vec_query +); + +--! @brief @> contains operator with a single ste_vec_entry needle. +--! +--! Wraps the entry into a single-element sv array (stripping `c`) and reduces +--! to the same `to_ste_vec_query(a)::jsonb @> needle::jsonb` form. +--! +--! @param a eql_v3.json Container. +--! @param b eql_v3.ste_vec_entry Single entry. +--! @return boolean True if a contains an sv entry matching b. +CREATE FUNCTION eql_v3."@>"(a eql_v3.json, b eql_v3.ste_vec_entry) +RETURNS boolean +LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.to_ste_vec_query(a)::jsonb + @> jsonb_build_object( + 'sv', + jsonb_build_array( + jsonb_strip_nulls( + jsonb_build_object( + 's', b -> 's', + 'hm', b -> 'hm', + 'oc', b -> 'oc' + ) + ) + ) + ) +$$; + +CREATE OPERATOR @>( + FUNCTION=eql_v3."@>", + LEFTARG=eql_v3.json, + RIGHTARG=eql_v3.ste_vec_entry +); + +------------------------------------------------------------------------------ +-- <@ contained-by (reverse of @>) +------------------------------------------------------------------------------ + +--! @brief <@ contained-by operator (document, document). +--! @param a eql_v3.json Contained value. +--! @param b eql_v3.json Container. +--! @return boolean True if a is contained by b. +CREATE FUNCTION eql_v3."<@"(a eql_v3.json, b eql_v3.json) +RETURNS boolean +LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.ste_vec_contains(b, a) +$$; + +CREATE OPERATOR <@( + FUNCTION=eql_v3."<@", + LEFTARG=eql_v3.json, + RIGHTARG=eql_v3.json +); + +--! @brief <@ contained-by operator with an ste_vec_query LHS. +--! @param a eql_v3.ste_vec_query Query payload. +--! @param b eql_v3.json Container. +--! @return boolean True if b contains a. +CREATE FUNCTION eql_v3."<@"(a eql_v3.ste_vec_query, b eql_v3.json) +RETURNS boolean +LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3."@>"(b, a) +$$; + +CREATE OPERATOR <@( + FUNCTION=eql_v3."<@", + LEFTARG=eql_v3.ste_vec_query, + RIGHTARG=eql_v3.json +); + +--! @brief <@ contained-by operator with a ste_vec_entry LHS. +--! @param a eql_v3.ste_vec_entry Single entry. +--! @param b eql_v3.json Container. +--! @return boolean True if b contains a. +CREATE FUNCTION eql_v3."<@"(a eql_v3.ste_vec_entry, b eql_v3.json) +RETURNS boolean +LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3."@>"(b, a) +$$; + +CREATE OPERATOR <@( + FUNCTION=eql_v3."<@", + LEFTARG=eql_v3.ste_vec_entry, + RIGHTARG=eql_v3.json +); + +------------------------------------------------------------------------------ +-- ste_vec_entry comparisons +------------------------------------------------------------------------------ + +--! @brief Equality on ste_vec_entry via eq_term (hm-or-oc byte equality). +--! @internal +--! @param a eql_v3.ste_vec_entry Left operand +--! @param b eql_v3.ste_vec_entry Right operand +--! @return boolean True if the entries are equal +CREATE FUNCTION eql_v3.eq(a eql_v3.ste_vec_entry, b eql_v3.ste_vec_entry) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) +$$; + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.ste_vec_entry, + RIGHTARG = eql_v3.ste_vec_entry, + COMMUTATOR = =, + NEGATOR = <>, + RESTRICT = eqsel, + JOIN = eqjoinsel +); + +--! @brief Inequality on ste_vec_entry via eq_term. +--! @internal +--! @param a eql_v3.ste_vec_entry Left operand +--! @param b eql_v3.ste_vec_entry Right operand +--! @return boolean True if the entries are not equal +CREATE FUNCTION eql_v3.neq(a eql_v3.ste_vec_entry, b eql_v3.ste_vec_entry) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) +$$; + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.ste_vec_entry, + RIGHTARG = eql_v3.ste_vec_entry, + COMMUTATOR = <>, + NEGATOR = =, + RESTRICT = neqsel, + JOIN = neqjoinsel +); + +--! @brief Less-than on ste_vec_entry via ore_cllw. +--! @internal +--! @param a eql_v3.ste_vec_entry Left operand +--! @param b eql_v3.ste_vec_entry Right operand +--! @return boolean True if a is less than b +CREATE FUNCTION eql_v3.lt(a eql_v3.ste_vec_entry, b eql_v3.ste_vec_entry) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.ore_cllw(a) < eql_v3.ore_cllw(b) +$$; + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.ste_vec_entry, + RIGHTARG = eql_v3.ste_vec_entry, + COMMUTATOR = >, + NEGATOR = >=, + RESTRICT = scalarltsel, + JOIN = scalarltjoinsel +); + +--! @brief Less-than-or-equal on ste_vec_entry via ore_cllw. +--! @internal +--! @param a eql_v3.ste_vec_entry Left operand +--! @param b eql_v3.ste_vec_entry Right operand +--! @return boolean True if a is less than or equal to b +CREATE FUNCTION eql_v3.lte(a eql_v3.ste_vec_entry, b eql_v3.ste_vec_entry) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.ore_cllw(a) <= eql_v3.ore_cllw(b) +$$; + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.ste_vec_entry, + RIGHTARG = eql_v3.ste_vec_entry, + COMMUTATOR = >=, + NEGATOR = >, + RESTRICT = scalarlesel, + JOIN = scalarlejoinsel +); + +--! @brief Greater-than on ste_vec_entry via ore_cllw. +--! @internal +--! @param a eql_v3.ste_vec_entry Left operand +--! @param b eql_v3.ste_vec_entry Right operand +--! @return boolean True if a is greater than b +CREATE FUNCTION eql_v3.gt(a eql_v3.ste_vec_entry, b eql_v3.ste_vec_entry) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.ore_cllw(a) > eql_v3.ore_cllw(b) +$$; + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.ste_vec_entry, + RIGHTARG = eql_v3.ste_vec_entry, + COMMUTATOR = <, + NEGATOR = <=, + RESTRICT = scalargtsel, + JOIN = scalargtjoinsel +); + +--! @brief Greater-than-or-equal on ste_vec_entry via ore_cllw. +--! @internal +--! @param a eql_v3.ste_vec_entry Left operand +--! @param b eql_v3.ste_vec_entry Right operand +--! @return boolean True if a is greater than or equal to b +CREATE FUNCTION eql_v3.gte(a eql_v3.ste_vec_entry, b eql_v3.ste_vec_entry) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.ore_cllw(a) >= eql_v3.ore_cllw(b) +$$; + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.ste_vec_entry, + RIGHTARG = eql_v3.ste_vec_entry, + COMMUTATOR = <=, + NEGATOR = <, + RESTRICT = scalargesel, + JOIN = scalargejoinsel +); diff --git a/src/v3/jsonb/types.sql b/src/v3/jsonb/types.sql new file mode 100644 index 000000000..44089f9d1 --- /dev/null +++ b/src/v3/jsonb/types.sql @@ -0,0 +1,178 @@ +-- REQUIRE: src/v3/schema.sql + +--! @file v3/jsonb/types.sql +--! @brief Domain types for the eql_v3 encrypted-JSONB (SteVec) surface. +--! +--! Three jsonb-backed domains (none over another domain — operators resolve +--! against the ultimate base type jsonb, so the native-jsonb firewall in +--! blockers.sql can attach): +--! - eql_v3.json — storage/root: an EQL envelope object ({i, v, ...}). +--! - eql_v3.ste_vec_entry — a single sv element (returned by `->`). +--! - eql_v3.ste_vec_query — a containment needle (sv elements, no ciphertext). + +--! @brief Validate a single SteVec entry payload. +--! @internal +--! @param val jsonb Candidate entry payload. +--! @return boolean True when `val` is an sv entry with string `s`, string `c`, +--! and exactly one string deterministic term (`hm` XOR `oc`). +CREATE FUNCTION eql_v3.is_valid_ste_vec_entry_payload(val jsonb) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT COALESCE( + jsonb_typeof(val) = 'object' + AND jsonb_typeof(val -> 's') = 'string' + AND jsonb_typeof(val -> 'c') = 'string' + AND ( + (jsonb_typeof(val -> 'hm') = 'string' AND NOT (val ? 'oc')) + OR + (jsonb_typeof(val -> 'oc') = 'string' AND NOT (val ? 'hm')) + ), + false + ) +$$; + +--! @brief Validate a SteVec containment query payload. +--! @internal +--! @param val jsonb Candidate query payload. +--! @return boolean True when `val` is `{"sv":[...]}` and every element carries +--! string `s`, no ciphertext, and exactly one string term (`hm` XOR +--! `oc`). +CREATE FUNCTION eql_v3.is_valid_ste_vec_query_payload(val jsonb) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT COALESCE( + jsonb_typeof(val) = 'object' + AND jsonb_typeof(val -> 'sv') = 'array' + AND NOT EXISTS ( + SELECT 1 + FROM jsonb_array_elements( + CASE WHEN jsonb_typeof(val -> 'sv') = 'array' THEN val -> 'sv' ELSE '[]'::jsonb END + ) AS elem + WHERE NOT COALESCE(( + jsonb_typeof(elem) = 'object' + AND jsonb_typeof(elem -> 's') = 'string' + AND NOT (elem ? 'c') + AND ( + (jsonb_typeof(elem -> 'hm') = 'string' AND NOT (elem ? 'oc')) + OR + (jsonb_typeof(elem -> 'oc') = 'string' AND NOT (elem ? 'hm')) + ) + ), false) + ), + false + ) +$$; + +--! @brief Validate a root SteVec document payload. +--! @internal +--! @param val jsonb Candidate document payload. +--! @return boolean True when `val` is an encrypted document envelope with +--! `v = 2`, `i`, an `sv` array, and valid sv entry elements. +CREATE FUNCTION eql_v3.is_valid_ste_vec_document_payload(val jsonb) + RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT COALESCE( + jsonb_typeof(val) = 'object' + AND val ? 'v' + AND val ->> 'v' = '2' + AND val ? 'i' + AND jsonb_typeof(val -> 'sv') = 'array' + AND NOT EXISTS ( + SELECT 1 + FROM jsonb_array_elements( + CASE WHEN jsonb_typeof(val -> 'sv') = 'array' THEN val -> 'sv' ELSE '[]'::jsonb END + ) AS elem + WHERE NOT eql_v3.is_valid_ste_vec_entry_payload(elem) + ), + false + ) +$$; + +--! @brief Storage/root domain for an encrypted JSONB column. +--! +--! CHECK: a JSON object carrying the EQL envelope (`v = 2` version and `i` index +--! metadata). Root `c` is intentionally NOT required — an sv-array root payload +--! is `{i, v, sv}` with no root ciphertext. The CHECK now also requires an `sv` +--! array, so the domain accepts only SteVec **document** payloads and rejects +--! encrypted *scalar* payloads (which carry `c`/`hm`/`ob` but no `sv`) — this is +--! what keeps `eql_v3.json` a typed document domain rather than a generic +--! encrypted envelope. The firewall in blockers.sql attaches to this domain to +--! stop native jsonb operators from reaching a column value. +--! +--! @note Constructing from inline JSON uses the standard DOMAIN cast: +--! `'{"i":{},"v":2,"sv":[...]}'::eql_v3.json`. +CREATE DOMAIN eql_v3.json AS jsonb + CHECK ( + eql_v3.is_valid_ste_vec_document_payload(VALUE) + ); + +--! @brief Domain type for an individual sv element. +--! +--! A single element inside an `sv` array: a JSON object that carries a selector +--! (`s`), a ciphertext (`c`), and **exactly one** of `hm` (HMAC-256, for +--! hash-equality) or `oc` (CLLW ORE, for ordered queries) — they are mutually +--! exclusive. This is the type returned by `->` and accepted by the per-entry +--! extractors `eql_v3.eq_term` / `eql_v3.ore_cllw`. Extra fields (`a`, root +--! `i`/`v` merged in by `->`) are allowed. +--! +--! @see src/v3/jsonb/operators.sql +CREATE DOMAIN eql_v3.ste_vec_entry AS jsonb + CHECK ( + eql_v3.is_valid_ste_vec_entry_payload(VALUE) + ); + +--! @brief Domain type for an STE-vec containment needle. +--! +--! A query-shaped payload `{"sv":[...]}` whose elements carry selector + index +--! term but **never** a ciphertext (`c`). Each element must carry `s` and +--! exactly one deterministic term (`hm` XOR `oc`). Typing the needle this way +--! stops selector-only needles from casting and matching every row via bare +--! `jsonb @>`. +--! +--! @note Construct from inline JSON via the DOMAIN cast: +--! `'{"sv":[{"s":"","hm":""}]}'::eql_v3.ste_vec_query`. +--! @see eql_v3.to_ste_vec_query +CREATE DOMAIN eql_v3.ste_vec_query AS jsonb + CHECK ( + eql_v3.is_valid_ste_vec_query_payload(VALUE) + ); + +--! @brief Convert an eql_v3.json to a ste_vec_query needle. +--! +--! Normalises each sv element down to the matching-relevant fields: `s` plus +--! exactly one of `hm` / `oc`. Other fields (`c`, `a`, `i`/`v`, anything else) +--! are stripped. This is the canonical needle shape for `@>` containment. +--! Designed for use as a functional GIN index expression: +--! `GIN (eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops)`. +--! +--! @param e eql_v3.json Source encrypted payload +--! @return eql_v3.ste_vec_query Query-shaped needle, sv elements normalised. +--! @see eql_v3.ste_vec_query +CREATE FUNCTION eql_v3.to_ste_vec_query(e eql_v3.json) + RETURNS eql_v3.ste_vec_query + LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT jsonb_build_object( + 'sv', + coalesce( + (SELECT jsonb_agg( + jsonb_strip_nulls( + jsonb_build_object( + 's', elem -> 's', + 'hm', elem -> 'hm', + 'oc', elem -> 'oc' + ) + ) + ) + FROM jsonb_array_elements(e::jsonb -> 'sv') AS elem), + '[]'::jsonb + ) + )::eql_v3.ste_vec_query +$$; + +CREATE CAST (eql_v3.json AS eql_v3.ste_vec_query) + WITH FUNCTION eql_v3.to_ste_vec_query + AS ASSIGNMENT; From 8f6ca802d707792a47f854cf1a52581d424788cb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 11:43:12 +1000 Subject: [PATCH 153/599] test(v3): add eql_v3 jsonb SQLx harness, fixtures, codegen plumbing, and guards Parameterized SQLx harness and operator-surface guard for the eql_v3 jsonb document type, with a FixtureSpec-generated (gitignored) v3_ste_vec SteVec fixture (serde_json::Value as a first-class EqlPlaintext + IndexKind::SteVec, emitting an eql_v3.json payload column) and a pinned SQLx inventory snapshot. Extends build-validation and splinter allowlists to the jsonb document functions, adds codegen support for jsonb operand casting, and applies cargo fmt. Also gitignores the decision/handoff working notes that are retained on disk but intentionally not committed. --- .github/workflows/test-eql.yml | 3 +- .gitignore | 5 + mise.toml | 20 + tasks/test/clean_install_v3.sh | 39 + tasks/test/splinter.sh | 24 +- tests/sqlx/snapshots/README.md | 17 + tests/sqlx/snapshots/v3_jsonb_tests.txt | 72 + tests/sqlx/src/fixtures/cipherstash.rs | 22 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 46 + tests/sqlx/src/fixtures/index_kind.rs | 7 + tests/sqlx/src/fixtures/mod.rs | 6 + tests/sqlx/src/fixtures/v3_ste_vec.rs | 105 ++ tests/sqlx/src/fixtures/validation.rs | 14 +- tests/sqlx/tests/build_validation_tests.rs | 7 +- .../encrypted_domain/family/inlinability.rs | 41 +- .../tests/encrypted_domain/family/support.rs | 13 +- tests/sqlx/tests/generate_all_fixtures.rs | 8 + .../tests/v3_jsonb_operator_surface_tests.rs | 360 +++++ tests/sqlx/tests/v3_jsonb_tests.rs | 1321 +++++++++++++++++ 19 files changed, 2112 insertions(+), 18 deletions(-) create mode 100644 tests/sqlx/snapshots/v3_jsonb_tests.txt create mode 100644 tests/sqlx/src/fixtures/v3_ste_vec.rs create mode 100644 tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs create mode 100644 tests/sqlx/tests/v3_jsonb_tests.rs diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 11bc17d78..14178c254 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -405,9 +405,10 @@ jobs: - name: Verify the matrix test-name inventory run: | mise run test:matrix:inventory + mise run test:v3-jsonb:inventory git add -N tests/sqlx/snapshots git diff --exit-code -- tests/sqlx/snapshots \ - || { echo "Coverage inventory stale — run 'mise run test:matrix:inventory' and commit."; exit 1; } + || { echo "Coverage inventory stale — run the relevant inventory task and commit."; exit 1; } splinter: name: "Supabase splinter" diff --git a/.gitignore b/.gitignore index 048045e06..a6e7d0613 100644 --- a/.gitignore +++ b/.gitignore @@ -225,6 +225,7 @@ tests/sqlx/migrations/001_install_eql.sql # Generated SQLx fixtures (regenerated via `mise run fixture:generate`, # never commit — stale fixtures hide bugs) tests/sqlx/fixtures/eql_v2* +tests/sqlx/fixtures/v3_ste_vec.sql # Generated encrypted-domain SQL — regenerated by `tasks/build.sh` from the # eql-scalars::CATALOG via `cargo run -p eql-codegen` on every build. The @@ -256,3 +257,7 @@ src/deps-ordered-protect.txt # Prebuilt nextest archive (transient build-once output for the sharded sqlx # suite; uploaded as a CI artifact, never committed — see tasks/test/sqlx-archive.sh) nextest.tar.zst + +# Working notes retained on disk but intentionally not committed +docs/decisions/2026-06-10-eql-v3-json-type-kind.md +docs/handoff/2026-06-10-v3-jsonb-fixture-alignment.md diff --git a/mise.toml b/mise.toml index a20cc0f48..cd22fb654 100644 --- a/mise.toml +++ b/mise.toml @@ -266,6 +266,26 @@ fi echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot or its derived eq-only subset; catalog reconciled." """ +[tasks."test:v3-jsonb:inventory"] +description = "Verify the v3 jsonb SQLx test-name inventory snapshot (no database required)" +dir = "{{config_root}}/tests/sqlx" +run = """ +#!/usr/bin/env bash +set -euo pipefail + +test -f snapshots/v3_jsonb_tests.txt || { echo "snapshots/v3_jsonb_tests.txt missing — regenerate and commit it." >&2; exit 1; } + +tmp=$(mktemp) +trap 'rm -f "$tmp"' EXIT + +cargo test --test v3_jsonb_tests --test v3_jsonb_operator_surface_tests -- --list \ + | sed -n 's/: test$//p' \ + | LC_ALL=C sort > "$tmp" + +diff -u snapshots/v3_jsonb_tests.txt "$tmp" +echo "v3 jsonb inventory OK" +""" + [tasks."test:matrix:expand"] description = "Regenerate the int4 matrix cargo-expand snapshot (requires the pinned nightly + cargo-expand)" dir = "{{config_root}}/tests/sqlx" diff --git a/tasks/test/clean_install_v3.sh b/tasks/test/clean_install_v3.sh index 7c771da8d..cb9e9d02d 100755 --- a/tasks/test/clean_install_v3.sh +++ b/tasks/test/clean_install_v3.sh @@ -67,4 +67,43 @@ BEGIN END $$; SQL +echo "==> smoke: v3 encrypted JSONB surface" +"${RUN[@]}" <<'SQL' +CREATE TABLE v3_json_smoke (id int PRIMARY KEY, e eql_v3.json); +INSERT INTO v3_json_smoke VALUES + (1, '{"i":{"c":"v3_json_smoke","t":"encrypted"},"v":2,"sv":[{"s":"sel","c":"ciphertext","hm":"00"}]}'::eql_v3.json); + +-- Supported typed accessors and containment. +SELECT (e -> 'sel'::text)::jsonb ->> 'hm' FROM v3_json_smoke WHERE id = 1; +SELECT e ->> 'sel'::text FROM v3_json_smoke WHERE id = 1; +SELECT count(*) FROM v3_json_smoke +WHERE e @> '{"sv":[{"s":"sel","hm":"00"}]}'::eql_v3.ste_vec_query; +SELECT count(*) FROM v3_json_smoke +WHERE '{"sv":[{"s":"sel","hm":"00"}]}'::eql_v3.ste_vec_query <@ e; + +-- Documented GIN expression installs cleanly in a v3-only database. +CREATE INDEX v3_json_smoke_gin + ON v3_json_smoke USING gin ((eql_v3.to_ste_vec_query(e)::jsonb) jsonb_path_ops); + +DO $$ +DECLARE + raised boolean := false; +BEGIN + BEGIN + PERFORM e ? 'sel'::text FROM v3_json_smoke WHERE id = 1; + EXCEPTION WHEN OTHERS THEN + raised := true; + IF SQLERRM <> 'operator ? is not supported for eql_v3.json' THEN + RAISE EXCEPTION 'json blocker raised an unexpected message: %', SQLERRM; + END IF; + END; + + IF NOT raised THEN + RAISE EXCEPTION 'v3 json blocker did not raise'; + END IF; +END $$; + +DROP TABLE v3_json_smoke; +SQL + echo "clean v3 install OK (D11 + D4 proven)" diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index 38289466f..fcf53e8cc 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -130,14 +130,34 @@ function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor fo function_search_path_mutable eql_v3 bloom_filter function Bloom-filter match extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.match_term. Must inline so the functional GIN index on eql_v3.match_term(col) engages. Mirrors eql_v3.hmac_256. function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_u64_8_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours. The eql_v2 copy stays plpgsql (pinned) by design. function_search_path_mutable eql_v3 jsonb_array_to_ore_block_u64_8_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_u64_8_256, carries the `eql-inline-critical` COMMENT marker. The eql_v2 copy stays plpgsql (pinned) by design. -function_search_path_mutable eql_v3 ore_cllw function CLLW ORE raw-jsonb extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) so the planner folds `eql_v3.ore_cllw(col -> 'sel')` into the calling query and matches the functional btree index on the same expression. Stays unpinned via the `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours (the arg is bare jsonb, not a jsonb-backed domain). Mirrors eql_v2.ore_cllw — single (jsonb) overload (no ste_vec_entry overload in the v3 fork). -function_search_path_mutable eql_v3 has_ore_cllw function CLLW ORE presence check for the eql_v3 SEM fork: inlinable SQL (jsonb) counterpart to `eql_v3.ore_cllw`. Same rationale — must stay unpinned to inline. Single (jsonb) overload. Mirrors eql_v2.has_ore_cllw. function_search_path_mutable eql_v3 ore_cllw_eq function Inner comparator for the eql_v3.ore_cllw composite type's `=` operator (self-contained SEM fork, DEFAULT FOR TYPE btree opclass eql_v3.ore_cllw_ops). The outer same-type operators back the opclass; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). The plpgsql FUNCTION 1 comparator (compare_ore_cllw_term) stays pinned by design. Mirrors eql_v2.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_neq function Inner comparator for the eql_v3.ore_cllw `<>` operator. Same rationale as eql_v3.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_lt function Inner comparator for the eql_v3.ore_cllw `<` operator. Same rationale as eql_v3.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_lte function Inner comparator for the eql_v3.ore_cllw `<=` operator. Same rationale as eql_v3.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_gt function Inner comparator for the eql_v3.ore_cllw `>` operator. Same rationale as eql_v3.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_gte function Inner comparator for the eql_v3.ore_cllw `>=` operator. Same rationale as eql_v3.ore_cllw_eq. +# Encrypted-JSONB document surface (src/v3/jsonb): the hand-written eql_v3.json / +# ste_vec_entry / ste_vec_query domains and their selector/extractor/operator +# functions. Inlinable for the same functional-index reasons as the eql_v2 +# ste_vec surface above; left unpinned by tasks/pin_search_path.sql via either +# the structural jsonb-domain-arg skip or the documented `eql-inline-critical` +# COMMENT marker (the plpgsql blockers in blockers.sql are pinned and do not +# surface). Splinter matches by (schema, name, type), so they need their own rows. +function_search_path_mutable eql_v3 -> function Typed sv-element selector lookup on the eql_v3 encrypted-JSONB surface: inlinable SQL over an eql_v3.json domain arg so `col -> ''` folds into the calling query, preserving functional-index match for the chained ste_vec recipes (eq_term / ore_cllw on the extracted entry). Left unpinned by the structural domain-arg skip in pin_search_path.sql; mirrors eql_v2.->. Two overloads: (json, text), (json, int). +function_search_path_mutable eql_v3 ->> function Text sv-element selector lookup on the eql_v3 encrypted-JSONB surface: inlinable SQL over an eql_v3.json domain arg, text-returning counterpart to eql_v3.->. Structural domain-arg skip. Two overloads: (json, text), (json, int). +function_search_path_mutable eql_v3 @> function Containment (@>) operator wrapper on the eql_v3 encrypted-JSONB surface: inlinable SQL so the planner can match the functional GIN index on eql_v3.jsonb_array(col). Structural domain-arg skip (eql_v3.json). Mirrors eql_v2.@>. Three overloads. +function_search_path_mutable eql_v3 <@ function Contained-by (<@) operator wrapper on the eql_v3 encrypted-JSONB surface: same rationale as eql_v3.@>. Three overloads. +function_search_path_mutable eql_v3 ore_cllw function ORE-CLLW extractor on the eql_v3 encrypted-JSONB surface: inlinable SQL so `eql_v3.ore_cllw(col -> 'sel')` folds into the calling query and reaches the functional btree opclass on eql_v3.ore_cllw. Structural domain-arg skip. Mirrors eql_v2.ore_cllw. Two overloads: (jsonb) (SEM fork), (eql_v3.ste_vec_entry). +function_search_path_mutable eql_v3 has_ore_cllw function ORE-CLLW presence check on the eql_v3 encrypted-JSONB surface: inlinable SQL counterpart to eql_v3.ore_cllw, structural domain-arg skip. Mirrors eql_v2.has_ore_cllw. Two overloads: (jsonb) (SEM fork), (eql_v3.ste_vec_entry). +function_search_path_mutable eql_v3 selector function STE-vec entry selector extractor: typed (eql_v3.ste_vec_entry) overload, inlinable so `eql_v3.selector(col -> 'sel')` folds into the calling query. Structural domain-arg skip. The (jsonb) overload is plpgsql with a pinned search_path and does not surface. Mirrors eql_v2.selector. +function_search_path_mutable eql_v3 to_ste_vec_query function Encrypted-JSONB query-document constructor (CAST WITH FUNCTION for eql_v3.ste_vec_query): inlinable SQL over an eql_v3.json domain arg, structural domain-arg skip. Builds the ste_vec query value the @>/<@ wrappers compare against; must inline to fold into the calling query. +function_search_path_mutable eql_v3 jsonb_array function ste_vec array extractor for the eql_v3 encrypted-JSONB surface: inlinable SQL (raw jsonb arg) behind the functional GIN index expression eql_v3.jsonb_array(col). Takes bare jsonb, so it carries the documented `eql-inline-critical` COMMENT marker that pin_search_path.sql honours rather than the structural skip. Mirrors eql_v2.jsonb_array. +function_search_path_mutable eql_v3 jsonb_contains function GIN-inlining wrapper: unfolds to eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b). Carries the `eql-inline-critical` COMMENT marker. Mirrors eql_v2.jsonb_contains. +function_search_path_mutable eql_v3 jsonb_contained_by function GIN-inlining wrapper: same as eql_v3.jsonb_contains. +function_search_path_mutable eql_v3 jsonb_path_query function Field-level JSONB extractor on the eql_v3 encrypted-JSONB surface: inlinable SQL, carries the `eql-inline-critical` COMMENT marker so it stays unpinned and folds into the calling query. Mirrors eql_v2.jsonb_path_query. +function_search_path_mutable eql_v3 jsonb_path_exists function Field-level JSONB EXISTS variant: same rationale as eql_v3.jsonb_path_query. +function_search_path_mutable eql_v3 jsonb_path_query_first function Field-level JSONB LIMIT 1 variant: same rationale as eql_v3.jsonb_path_query. +function_search_path_mutable eql_v3 meta_data function Encrypted-payload metadata extractor: inlinable SQL (raw jsonb arg), carries the `eql-inline-critical` COMMENT marker so it stays unpinned and folds into the calling query. ALLOW # Wrap splinter (a single bare SELECT expression) into a subquery we can diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index b82ae8716..833211e7c 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -106,3 +106,20 @@ catalog cross-check) fails the job. ``` See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3 (matrix oracle + inventory snapshot). + +## v3_jsonb_tests.txt + +`v3_jsonb_tests.txt` pins the SQLx test-name set for the hand-written +`eql_v3.json` harness and its signature-aware operator-surface guard. It catches +silent coverage shrinkage in macro-generated blocker/NULL/path cases. + +Regenerate with: + +```bash +cd tests/sqlx +cargo test --test v3_jsonb_tests --test v3_jsonb_operator_surface_tests -- --list \ + | sed -n 's/: test$//p' \ + | LC_ALL=C sort > snapshots/v3_jsonb_tests.txt +``` + +CI verifies it with `mise run test:v3-jsonb:inventory`. diff --git a/tests/sqlx/snapshots/v3_jsonb_tests.txt b/tests/sqlx/snapshots/v3_jsonb_tests.txt new file mode 100644 index 000000000..0064a7215 --- /dev/null +++ b/tests/sqlx/snapshots/v3_jsonb_tests.txt @@ -0,0 +1,72 @@ +v3_jsonb_array_length_and_elements +v3_jsonb_array_length_non_array_raises +v3_jsonb_arrow_accessors_supported_null +v3_jsonb_arrow_integer_index_on_array +v3_jsonb_at_at_blocker +v3_jsonb_at_question_blocker +v3_jsonb_concat_blocker +v3_jsonb_containment_hm_only +v3_jsonb_containment_mixed +v3_jsonb_containment_oc_only +v3_jsonb_containment_rejects_wrong_bytes +v3_jsonb_containment_rejects_wrong_selector +v3_jsonb_containment_rejects_wrong_term_type +v3_jsonb_containment_self_and_subset +v3_jsonb_doc_contains_doc_lhs_supported_null +v3_jsonb_doc_contains_doc_rhs_supported_null +v3_jsonb_doc_contains_entry_rhs_supported_null +v3_jsonb_doc_contains_query_lhs_supported_null +v3_jsonb_doc_contains_query_rhs_supported_null +v3_jsonb_entry_contained_lhs_supported_null +v3_jsonb_entry_entry_shape_resolves +v3_jsonb_entry_eq_does_not_declare_hashes_or_merges +v3_jsonb_entry_eq_lhs_supported_null +v3_jsonb_entry_eq_rhs_supported_null +v3_jsonb_entry_gt_lhs_supported_null +v3_jsonb_entry_gte_lhs_supported_null +v3_jsonb_entry_lt_lhs_supported_null +v3_jsonb_entry_lte_lhs_supported_null +v3_jsonb_entry_neq_lhs_supported_null +v3_jsonb_entry_operators_declare_commutator_negator +v3_jsonb_fixture_structural_invariants +v3_jsonb_generator_envelope_shape_accepted +v3_jsonb_hm_eq_correctness +v3_jsonb_index_ore_cllw_btree_engages +v3_jsonb_index_to_ste_vec_query_gin_engages +v3_jsonb_json_payload_check +v3_jsonb_minus_array_blocker +v3_jsonb_minus_int_blocker +v3_jsonb_minus_text_blocker +v3_jsonb_mixed_contained_by_blocker +v3_jsonb_mixed_contains_blocker +v3_jsonb_oc_eq_correctness +v3_jsonb_oc_gt_correctness +v3_jsonb_oc_gte_correctness +v3_jsonb_oc_ladder_is_total_order +v3_jsonb_oc_lt_correctness +v3_jsonb_oc_lte_correctness +v3_jsonb_ore_cllw_null_bytes_composite_raises +v3_jsonb_path_del_blocker +v3_jsonb_path_exists_and_first +v3_jsonb_path_get_blocker +v3_jsonb_path_get_text_blocker +v3_jsonb_path_query_match_and_miss +v3_jsonb_payload_check_accepts_valid +v3_jsonb_query_contained_lhs_supported_null +v3_jsonb_question_amp_blocker +v3_jsonb_question_blocker +v3_jsonb_question_pipe_blocker +v3_jsonb_root_doc_doc_comparison_blockers +v3_jsonb_root_eq_blocker +v3_jsonb_root_gt_blocker +v3_jsonb_root_gte_blocker +v3_jsonb_root_lt_blocker +v3_jsonb_root_lte_blocker +v3_jsonb_root_neq_blocker +v3_jsonb_ste_vec_entry_payload_check +v3_jsonb_ste_vec_query_payload_check +v3_jsonb_surface_blocker_signatures +v3_jsonb_surface_entry_mixed_shapes_absent +v3_jsonb_surface_root_comparisons_blocked +v3_jsonb_surface_supported_or_blocked +v3_jsonb_surface_supported_signatures diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index aa3a26afb..77a92dca0 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -29,7 +29,7 @@ use cipherstash_client::eql::{ encrypt_eql, EqlCiphertext, EqlEncryptOpts, EqlOperation, EqlOutput, Identifier, PreparedPlaintext, }; -use cipherstash_client::schema::column::{Index, IndexType}; +use cipherstash_client::schema::column::{ArrayIndexMode, Index, IndexType, SteVecMode}; use cipherstash_client::schema::{ColumnConfig, ColumnType}; use cipherstash_client::zerokms::{EnvKeyProvider, ZeroKMSBuilder}; use cipherstash_client::AutoStrategy; @@ -57,6 +57,15 @@ async fn build_cipher() -> Result>> { /// driver cannot drift apart. pub const PAYLOAD_COLUMN: &str = "payload"; +/// The SteVec index domain-separation prefix used for the `v3_ste_vec` +/// document fixture. The value is not externally constrained: the v3 jsonb +/// harness re-derives its selector constants from the *generated* fixture and +/// forges its own ORE ladder, so the fixture only needs to be *internally +/// consistent* — a single fixed prefix applied to all rows yields stable +/// per-path selectors. Any well-formed prefix that produces extractor- +/// compatible `hm`/`oc` leaves works. +pub const STE_VEC_PREFIX: &str = "v3_ste_vec"; + /// Build a `ColumnConfig` from the fixture spec's index list + cast. /// /// `IndexKind` is a typed enum — every value is a real EQL index by @@ -111,6 +120,17 @@ fn index_type_for(kind: IndexKind) -> IndexType { IndexKind::Unique => Index::new_unique().index_type, IndexKind::Ore => IndexType::Ore, IndexKind::Match => Index::new_match().index_type, + // No `Index::new_ste_vec()` constructor exists — SteVec is a struct + // variant. `mode: SteVecMode::Standard` (the default) yields the + // ORE-CLLW (`oc`) terms the `eql_v3.ore_cllw` extractor consumes; + // `ArrayIndexMode::default()` (NONE) + no term filters keep the + // document index minimal. + IndexKind::SteVec => IndexType::SteVec { + prefix: STE_VEC_PREFIX.to_string(), + term_filters: vec![], + array_index_mode: ArrayIndexMode::default(), + mode: SteVecMode::default(), + }, } } diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index cacce8720..9e85aac57 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -59,6 +59,7 @@ impl PlaintextSqlType { pub const DATE: PlaintextSqlType = PlaintextSqlType("date"); pub const TIMESTAMPTZ: PlaintextSqlType = PlaintextSqlType("timestamp with time zone"); pub const TEXT: PlaintextSqlType = PlaintextSqlType("text"); + pub const JSONB: PlaintextSqlType = PlaintextSqlType("jsonb"); pub fn as_str(&self) -> &'static str { self.0 @@ -116,6 +117,7 @@ mod sealed { impl Sealed for chrono::NaiveDate {} impl Sealed for chrono::DateTime {} impl Sealed for String {} + impl Sealed for serde_json::Value {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -191,6 +193,26 @@ impl EqlPlaintext for String { } } +/// A JSON document plaintext — the encrypted-JSONB (SteVec) fixture value. +/// +/// `serde_json::Value` is the document analogue of the scalar plaintexts: +/// `to_plaintext` lifts it into `Plaintext::Json`, which cipherstash-client +/// encrypts into a SteVec `eql_v3.json` payload under a JSON-indexed +/// `ColumnConfig` (`IndexKind::SteVec`). The `cast_for_kind` / +/// `plaintext_sql_type_for_kind` derivations panic on `ScalarKind::Jsonb` +/// (the scalar matrix never wires jsonb), so this impl OVERRIDES `CAST` and +/// `PLAINTEXT_SQL_TYPE` directly — the default const expressions are never +/// instantiated for this type. `KIND` is still `Jsonb` for documentation. +impl EqlPlaintext for serde_json::Value { + const KIND: ScalarKind = ScalarKind::Jsonb; + const CAST: Cast = Cast::JSONB; + const PLAINTEXT_SQL_TYPE: PlaintextSqlType = PlaintextSqlType::JSONB; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::Json(Some(self.clone())) + } +} + #[cfg(test)] mod tests { use super::*; @@ -334,4 +356,28 @@ mod tests { let p = "hi".to_string().to_plaintext(); assert!(matches!(p, Plaintext::Text(Some(ref s)) if s == "hi")); } + + #[test] + fn json_value_casts_to_jsonb_and_plaintext_type_is_jsonb() { + // The document impl OVERRIDES the kind-derived defaults (Jsonb would + // panic in cast_for_kind), so assert the overrides resolve. + assert_eq!(::CAST, Cast::JSONB); + assert_eq!( + ::PLAINTEXT_SQL_TYPE, + PlaintextSqlType::JSONB + ); + } + + #[test] + fn json_value_to_plaintext_wraps_in_json_variant() { + // A document must lift into the Json variant so the fixture driver + // encrypts it through the SteVec document path. + let doc = serde_json::json!({ "hello": "world", "number": 1 }); + match doc.to_plaintext() { + Plaintext::Json(Some(ref value)) => { + assert_eq!(*value, serde_json::json!({ "hello": "world", "number": 1 })) + } + other => panic!("expected Plaintext::Json(Some(_)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/fixtures/index_kind.rs b/tests/sqlx/src/fixtures/index_kind.rs index f1633a03b..adb4fc40e 100644 --- a/tests/sqlx/src/fixtures/index_kind.rs +++ b/tests/sqlx/src/fixtures/index_kind.rs @@ -21,6 +21,10 @@ pub enum IndexKind { Ore, /// `match` — drives `LIKE` / `ILIKE` via the bloom filter. Match, + /// `ste_vec` — drives the encrypted-JSONB (SteVec) document surface: + /// per-leaf HMAC (`hm`, equality) + ORE-CLLW (`oc`, ordered) terms. Used + /// by the `v3_ste_vec` document fixture, not the scalar matrix. + SteVec, } impl IndexKind { @@ -29,6 +33,7 @@ impl IndexKind { IndexKind::Unique => "unique", IndexKind::Ore => "ore", IndexKind::Match => "match", + IndexKind::SteVec => "ste_vec", } } } @@ -48,6 +53,7 @@ mod tests { assert_eq!(IndexKind::Unique.as_str(), "unique"); assert_eq!(IndexKind::Ore.as_str(), "ore"); assert_eq!(IndexKind::Match.as_str(), "match"); + assert_eq!(IndexKind::SteVec.as_str(), "ste_vec"); } #[test] @@ -55,5 +61,6 @@ mod tests { assert_eq!(format!("{}", IndexKind::Unique), "unique"); assert_eq!(format!("{}", IndexKind::Ore), "ore"); assert_eq!(format!("{}", IndexKind::Match), "match"); + assert_eq!(format!("{}", IndexKind::SteVec), "ste_vec"); } } diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 65cdacbc1..503743d9c 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -26,6 +26,12 @@ pub mod cipherstash; pub mod driver; +// The v3 jsonb (SteVec document) fixture — a hand-written `FixtureSpec` +// over `serde_json::Value`, generated through the same pipeline as the +// scalar `eql_v2_` fixtures. Not a CATALOG scalar, so it is registered +// here directly rather than via `scalar_types!`. +pub mod v3_ste_vec; + // The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, …) are // generated from the harness list in `scalar_types.rs`. Each expands to // `pub mod eql_v2_ { … scalar_fixture! … }`, reading its plaintext values diff --git a/tests/sqlx/src/fixtures/v3_ste_vec.rs b/tests/sqlx/src/fixtures/v3_ste_vec.rs new file mode 100644 index 000000000..4e1a04eeb --- /dev/null +++ b/tests/sqlx/src/fixtures/v3_ste_vec.rs @@ -0,0 +1,105 @@ +//! The `v3_ste_vec` jsonb (SteVec document) fixture — the document analogue +//! of the scalar `eql_v2_` fixtures, generated through the SAME +//! `FixtureSpec` machinery. +//! +//! A `serde_json::Value` is a first-class `EqlPlaintext` (see +//! `eql_plaintext.rs`), so the document fixture is just a +//! `FixtureSpec` with the `IndexKind::SteVec` index and an +//! `eql_v3.json` committed `payload` column. `FixtureSpec::run` encrypts each +//! document through cipherstash-client into a SteVec payload, stages it, and +//! writes `tests/sqlx/fixtures/v3_ste_vec.sql` (gitignored — regenerated on +//! every `mise run test:sqlx`) with the identical +//! `fixtures. (id, plaintext, payload)` shape the scalar fixtures use. +//! +//! Unlike the scalars there is no plaintext-vs-decrypt oracle column relation +//! to maintain; the `plaintext` column simply carries the source JSON document +//! for debuggability, exactly as the scalar fixtures carry the source scalar. + +use anyhow::Result; +use serde_json::{json, Value}; + +use super::index_kind::IndexKind; +use super::spec::FixtureSpec; + +/// The committed fixture name → table `fixtures.v3_ste_vec`, script +/// `v3_ste_vec.sql`, SQLx ref `scripts("v3_ste_vec")`. +const NAME: &str = "v3_ste_vec"; + +/// The committed `payload` column type — the `eql_v3.json` DOMAIN, so the +/// domain CHECK runs when the fixture loads. +const PAYLOAD_TYPE: &str = "eql_v3.json"; + +/// Number of fixture rows. Ten matches the historical fixture and gives the +/// harness's containment / index tests a non-trivial set. +const ROW_COUNT: i64 = 10; + +/// The ten plaintext documents — the source of truth for the fixture. +/// +/// `hello` VARIES across all rows (10 distinct values → 10 distinct `$.hello` +/// `oc` leaves) so the W1 containment oracle (`fwd == expected`, where +/// `expected` = rows whose `$.hello` oc equals the row-1 self-needle) and the +/// D11 ORE-btree test have real discrimination — a constant `$.hello` would +/// make `expected == ROW_COUNT` and silently hollow the oracle. `number` also +/// varies (its own `$.number` oc). `nested` is a constant object so `$` and +/// `$.nested` carry stable `hm` leaves across all rows (LB2 / LB4). +fn documents() -> Vec { + (1..=ROW_COUNT) + .map(|i| { + json!({ + "hello": format!("world-{i}"), + "number": i, + "nested": { "deep": "constant" }, + }) + }) + .collect() +} + +/// Generate `tests/sqlx/fixtures/v3_ste_vec.sql` by encrypting the plaintext +/// documents through the shared `FixtureSpec` pipeline (connection-from-env, +/// stage → `format('%L')` render → drop-on-error teardown → file write — the +/// same code path the scalar fixtures use). The document set lives for the +/// duration of the call; the spec borrows it and `run()` completes before +/// return. +pub async fn generate() -> Result<()> { + let docs = documents(); + FixtureSpec::new(NAME) + .with_index(IndexKind::SteVec) + .with_column_type(PAYLOAD_TYPE) + .with_values(&docs) + .run() + .await +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn documents_are_ten_rows_with_distinct_hello_and_varying_number() { + let docs = documents(); + assert_eq!(docs.len(), 10); + // `$.hello` must be DISTINCT per row (oracle discrimination — Risk #0). + let hellos: std::collections::HashSet<&str> = + docs.iter().map(|d| d["hello"].as_str().unwrap()).collect(); + assert_eq!(hellos.len(), 10, "$.hello must be distinct across all rows"); + // `nested` is a constant object so `$.nested` carries a stable hm leaf. + assert!(docs + .iter() + .all(|d| d["nested"] == json!({ "deep": "constant" }))); + let numbers: Vec = docs.iter().map(|d| d["number"].as_i64().unwrap()).collect(); + assert_eq!(numbers, (1..=10).collect::>()); + } + + #[test] + fn spec_builds_a_json_document_fixture() { + let docs = documents(); + let spec = FixtureSpec::new(NAME) + .with_index(IndexKind::SteVec) + .with_column_type(PAYLOAD_TYPE) + .with_values(&docs); + assert_eq!(spec.fixture_table(), "fixtures.v3_ste_vec"); + assert_eq!(spec.column_type().as_str(), "eql_v3.json"); + assert_eq!(spec.indexes(), &[IndexKind::SteVec]); + assert!(spec.check_complete().is_ok()); + } +} diff --git a/tests/sqlx/src/fixtures/validation.rs b/tests/sqlx/src/fixtures/validation.rs index 61746e60b..1b25bc3a8 100644 --- a/tests/sqlx/src/fixtures/validation.rs +++ b/tests/sqlx/src/fixtures/validation.rs @@ -24,10 +24,12 @@ fn is_valid_identifier(s: &str) -> bool { chars.all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_') } -/// Allowlist of committed `payload` column types. `{ jsonb }` for #224 — no -/// domain types exist yet. Extending to domain-typed fixtures means extending -/// this list with validated, optionally schema-qualified type tokens. -pub const ALLOWED_COLUMN_TYPES: &[&str] = &["jsonb"]; +/// Allowlist of committed `payload` column types. `jsonb` for the scalar +/// fixtures; `eql_v3.json` for the v3 jsonb (SteVec document) fixture, whose +/// committed `payload` column is the `eql_v3.json` DOMAIN so the domain CHECK +/// runs on load. Schema-qualified tokens are allowed — each is an exact, +/// vetted entry here, never a free-form `&str`. +pub const ALLOWED_COLUMN_TYPES: &[&str] = &["jsonb", "eql_v3.json"]; fn is_valid_column_type(s: &str) -> bool { ALLOWED_COLUMN_TYPES.contains(&s) @@ -139,10 +141,12 @@ mod tests { } #[test] - fn column_type_accepts_jsonb_only() { + fn column_type_accepts_allowlisted_tokens_only() { assert!(ColumnType::try_from("jsonb").is_ok()); + assert!(ColumnType::try_from("eql_v3.json").is_ok()); assert!(ColumnType::try_from("text").is_err()); assert!(ColumnType::try_from("eql_v2_int4").is_err()); + assert!(ColumnType::try_from("eql_v3.jsonb").is_err()); assert!(ColumnType::try_from("jsonb; DROP TABLE x").is_err()); } diff --git a/tests/sqlx/tests/build_validation_tests.rs b/tests/sqlx/tests/build_validation_tests.rs index 691a5d4a6..034c55535 100644 --- a/tests/sqlx/tests/build_validation_tests.rs +++ b/tests/sqlx/tests/build_validation_tests.rs @@ -183,10 +183,13 @@ fn v3_variant_has_no_eql_v2_symbol() { #[test] fn v3_variant_omits_v2_coupled_pin_search_path() { // D11: the v3 artifact must NOT append tasks/pin_search_path.sql, which is - // eql_v2-coupled (references eql_v2_encrypted / ste_vec_entry). + // eql_v2-coupled (it references public.eql_v2_encrypted / eql_v2.ste_vec_entry + // and only pins eql_v2 functions). Match the eql_v2-QUALIFIED markers: a bare + // `ste_vec_entry` substring would false-positive on the legitimate + // `eql_v3.ste_vec_entry` DOMAIN that the v3 jsonb document surface defines. let sql = read_release_sql("cipherstash-encrypt-v3.sql"); assert!( - !sql.contains("ste_vec_entry") && !sql.contains("eql_v2_encrypted"), + !sql.contains("eql_v2.ste_vec_entry") && !sql.contains("eql_v2_encrypted"), "v3 variant must not carry the eql_v2-coupled pin_search_path script" ); } diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 5ba4084d4..922d9ee41 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -110,9 +110,28 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Result<()> { let rows: Vec<(String,)> = sqlx::query_as( r#" + WITH expected(proname, pronargs, arg0, arg1) AS ( + VALUES + ('jsonb_array_to_bytea_array', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_array_to_ore_block_u64_8_256', 1, 'jsonb'::regtype, 0::oid), + ('ore_cllw', 1, 'jsonb'::regtype, 0::oid), + ('has_ore_cllw', 1, 'jsonb'::regtype, 0::oid), + ('meta_data', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_array', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_contains', 2, 'jsonb'::regtype, 'jsonb'::regtype), + ('jsonb_contained_by', 2, 'jsonb'::regtype, 'jsonb'::regtype), + ('jsonb_path_query', 2, 'jsonb'::regtype, 'text'::regtype), + ('jsonb_path_exists', 2, 'jsonb'::regtype, 'text'::regtype), + ('jsonb_path_query_first', 2, 'jsonb'::regtype, 'text'::regtype) + ) SELECT p.proname || '(' || pg_catalog.pg_get_function_arguments(p.oid) || ')' FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + LEFT JOIN expected e + ON e.proname = p.proname + AND e.pronargs = p.pronargs + AND e.arg0 = p.proargtypes[0] + AND (e.pronargs = 1 OR e.arg1 = p.proargtypes[1]) WHERE n.nspname = 'eql_v3' AND ( (p.pronargs = 2 AND p.proname IN ( @@ -131,6 +150,7 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu 'jsonb_array_to_bytea_array', 'jsonb_array_to_ore_block_u64_8_256') AND p.proargtypes[0] = 'jsonb'::regtype) + OR e.proname IS NOT NULL ) AND ( -- offender: pinned search_path, or not inlinable SQL/IMMUTABLE @@ -170,9 +190,19 @@ async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result // not inlinable SQL/IMMUTABLE is an offender. let offenders: Vec<(String, Option, String, String)> = sqlx::query_as( r#" - WITH expected(proname) AS ( - VALUES ('jsonb_array_to_bytea_array'), - ('jsonb_array_to_ore_block_u64_8_256') + WITH expected(proname, pronargs, arg0, arg1) AS ( + VALUES + ('jsonb_array_to_bytea_array', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_array_to_ore_block_u64_8_256', 1, 'jsonb'::regtype, 0::oid), + ('ore_cllw', 1, 'jsonb'::regtype, 0::oid), + ('has_ore_cllw', 1, 'jsonb'::regtype, 0::oid), + ('meta_data', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_array', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_contains', 2, 'jsonb'::regtype, 'jsonb'::regtype), + ('jsonb_contained_by', 2, 'jsonb'::regtype, 'jsonb'::regtype), + ('jsonb_path_query', 2, 'jsonb'::regtype, 'text'::regtype), + ('jsonb_path_exists', 2, 'jsonb'::regtype, 'text'::regtype), + ('jsonb_path_query_first', 2, 'jsonb'::regtype, 'text'::regtype) ) SELECT e.proname AS proname, d.description AS marker, @@ -182,8 +212,9 @@ async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result LEFT JOIN pg_catalog.pg_proc p ON p.proname = e.proname AND p.pronamespace = 'eql_v3'::regnamespace - AND p.pronargs = 1 - AND p.proargtypes[0] = 'jsonb'::regtype + AND p.pronargs = e.pronargs + AND p.proargtypes[0] = e.arg0 + AND (e.pronargs = 1 OR p.proargtypes[1] = e.arg1) LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang LEFT JOIN pg_catalog.pg_description d ON d.objoid = p.oid AND d.classoid = 'pg_proc'::regclass diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index 5f1bdb6d2..f571ca4e6 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -297,13 +297,20 @@ async fn neq_propagates_null_under_three_valued_logic(pool: PgPool) -> Result<() #[sqlx::test] async fn no_cross_variant_operator_is_declared(pool: PgPool) -> Result<()> { - // The family deliberately does NOT define ANY operator that mixes two - // different capability variants — e.g. `eql_v3.int4_eq = eql_v3.int4_ord` + // The SCALAR family deliberately does NOT define ANY operator that mixes + // two different capability variants — e.g. `eql_v3.int4_eq = eql_v3.int4_ord` // would resolve against jsonb (the ultimate base type) and silently // bypass the per-variant blockers. The query below has no `oprname` // filter, so it catches a cross-variant operator of any kind, not just // `=`. If someone accidentally adds such an operator, this test fails. // + // The jsonb DOCUMENT surface is excluded: it intentionally defines + // cross-type containment operators (`json @> ste_vec_query`, + // `json @> ste_vec_entry` and their `<@` commutators) — the documented + // document-containment API, not scalar capability variants that must + // resolve to a blocker. So `json` / `ste_vec_entry` / `ste_vec_query` are + // out of scope for this scalar-variant guard. + // // The check is structural (`pg_operator`) rather than dynamic // ("invoke and see it raise") so a future PG version with stricter // operator resolution doesn't mask the regression. @@ -319,6 +326,8 @@ async fn no_cross_variant_operator_is_declared(pool: PgPool) -> Result<()> { WHERE ln.nspname = 'eql_v3' AND rn.nspname = 'eql_v3' AND lt.typname <> rt.typname + AND lt.typname NOT IN ('json', 'ste_vec_entry', 'ste_vec_query') + AND rt.typname NOT IN ('json', 'ste_vec_entry', 'ste_vec_query') ORDER BY 1 "#, ) diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index 72ebbdf09..9e6e971a0 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -33,5 +33,13 @@ async fn generate_all() -> anyhow::Result<()> { } assert!(generated > 0, "CATALOG is empty — nothing to generate"); eprintln!("Regenerated {generated} scalar fixture(s)."); + + // The v3 jsonb (SteVec document) fixture is not a CATALOG scalar — it is a + // hand-written `FixtureSpec` that rides the SAME + // generation pipeline. Generate it in the same process so one + // `fixture:generate:all` run (and the prep flow) refreshes everything. + eprintln!("Generating fixture v3_ste_vec (jsonb SteVec document)..."); + eql_tests::fixtures::v3_ste_vec::generate().await?; + eprintln!("Regenerated v3_ste_vec."); Ok(()) } diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs new file mode 100644 index 000000000..d6a06addd --- /dev/null +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -0,0 +1,360 @@ +//! D12 — signature-aware operator-surface guard for the `eql_v3` encrypted-JSONB +//! (SteVec) surface. +//! +//! This binary reads `pg_operator`, not the fixture. It verifies BOTH sides of +//! the surface: +//! 1. Every native jsonb operator symbol is either a supported root symbol OR +//! has an `eql_v3.json`-bound blocker (so a column can never silently route +//! to plaintext-jsonb semantics). +//! 2. Every supported symbol is bound with EXACTLY the intended safe operand +//! signatures, and unsupported root-document comparison signatures +//! (`eql_v3.json = eql_v3.json`, etc.) are blocked. +//! 3. Every blocker is bound to `eql_v3.json` with PostgreSQL's real native +//! RHS type for that operator. +//! +//! Design source of truth: +//! `docs/superpowers/plans/2026-06-09-eql-v3-jsonb-test-harness-design.md` (D12). + +use sqlx::PgPool; +use std::collections::BTreeSet; + +/// Root-document operator symbols the surface SUPPORTS (an `eql_v3.json`-bound +/// operator, not a blocker). +const SUPPORTED_ROOT_SYMBOLS: &[&str] = &["@>", "<@", "->", "->>"]; + +/// Entry comparison symbols on `eql_v3.ste_vec_entry`. +const SUPPORTED_ENTRY_SYMBOLS: &[&str] = &["=", "<>", "<", "<=", ">", ">="]; + +/// Native jsonb operators the surface BLOCKS (each raises "is not supported"). +const BLOCKED_ROOT_SYMBOLS: &[&str] = &[ + "?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||", "=", "<>", "<", "<=", ">", ">=", +]; + +/// Fetch the set of `(oprname, lhs_regtype, rhs_regtype)` for every operator +/// with at least one operand among the v3 jsonb domains. +async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result> { + let rows: Vec<(String, String, String)> = sqlx::query_as( + r#" + WITH d AS ( + SELECT 'eql_v3.json'::regtype AS j, + 'eql_v3.ste_vec_entry'::regtype AS e, + 'eql_v3.ste_vec_query'::regtype AS q + ) + SELECT o.oprname, + pg_catalog.format_type(o.oprleft, NULL) AS lhs, + pg_catalog.format_type(o.oprright, NULL) AS rhs + FROM pg_operator o, d + WHERE o.oprleft IN (d.j, d.e, d.q) + OR o.oprright IN (d.j, d.e, d.q) + "#, + ) + .fetch_all(pool) + .await?; + Ok(rows) +} + +/// `format_type` renders the reserved word `json` quoted (`eql_v3."json"`). +/// Normalise so comparisons read naturally. +fn norm(ty: &str) -> String { + ty.replace("eql_v3.\"json\"", "eql_v3.json") +} + +// ============================================================================ +// (1) Every native jsonb operator symbol is supported-or-blocked. +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<()> { + // Native jsonb operator symbols (left OR right operand is plaintext jsonb), + // excluding EQL's own cross-type operators on the legacy `eql_v2_encrypted` + // composite (those take a jsonb operand but are not native and unreachable + // from a v3 domain). + let native: Vec = sqlx::query_scalar( + r#" + SELECT DISTINCT o.oprname + FROM pg_catalog.pg_operator o + WHERE (o.oprleft = 'jsonb'::regtype OR o.oprright = 'jsonb'::regtype) + AND o.oprleft NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') + AND o.oprright NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') + ORDER BY 1 + "#, + ) + .fetch_all(&pool) + .await?; + assert!( + !native.is_empty(), + "expected pg_operator to expose jsonb operators" + ); + + // The blocked symbols MUST each have an eql_v3.json-bound operator. + let bound: Vec<(String, String, String)> = v3_jsonb_operators(&pool).await?; + let json_bound_symbols: BTreeSet = bound + .iter() + .filter(|(_, l, r)| norm(l) == "eql_v3.json" || norm(r) == "eql_v3.json") + .map(|(n, _, _)| n.clone()) + .collect(); + + let supported: BTreeSet<&str> = SUPPORTED_ROOT_SYMBOLS.iter().copied().collect(); + + let mut unaccounted: Vec = Vec::new(); + for sym in &native { + let is_supported = supported.contains(sym.as_str()); + let is_blocked = + BLOCKED_ROOT_SYMBOLS.contains(&sym.as_str()) && json_bound_symbols.contains(sym); + if !is_supported && !is_blocked { + unaccounted.push(sym.clone()); + } + } + + assert!( + unaccounted.is_empty(), + "native jsonb operator(s) neither supported, blocked, nor an intentionally-native \ + comparison on eql_v3.json: {unaccounted:#?}. Each would route an encrypted column \ + to native plaintext-jsonb semantics (e.g. key/path extraction). Add a supported \ + wrapper or an eql_v3.json-bound blocker." + ); + + // And every blocked symbol must actually be bound (no missing blocker). + let mut missing_blockers: Vec<&str> = Vec::new(); + for sym in BLOCKED_ROOT_SYMBOLS { + if !json_bound_symbols.contains(*sym) { + missing_blockers.push(sym); + } + } + assert!( + missing_blockers.is_empty(), + "blocked symbol(s) have no eql_v3.json-bound operator: {missing_blockers:?}" + ); + Ok(()) +} + +// ============================================================================ +// (2) Supported operand signatures exist EXACTLY as intended. +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_surface_supported_signatures(pool: PgPool) -> anyhow::Result<()> { + let bound = v3_jsonb_operators(&pool).await?; + let have: BTreeSet<(String, String, String)> = bound + .iter() + .map(|(n, l, r)| (n.clone(), norm(l), norm(r))) + .collect(); + + // Exact supported operand signatures (verified against operators.sql). + let expected_supported: &[(&str, &str, &str)] = &[ + // containment + ("@>", "eql_v3.json", "eql_v3.json"), + ("@>", "eql_v3.json", "eql_v3.ste_vec_query"), + ("@>", "eql_v3.json", "eql_v3.ste_vec_entry"), + ("<@", "eql_v3.json", "eql_v3.json"), + ("<@", "eql_v3.ste_vec_query", "eql_v3.json"), + ("<@", "eql_v3.ste_vec_entry", "eql_v3.json"), + // path access + ("->", "eql_v3.json", "text"), + ("->", "eql_v3.json", "integer"), + ("->>", "eql_v3.json", "text"), + // entry comparisons + ("=", "eql_v3.ste_vec_entry", "eql_v3.ste_vec_entry"), + ("<>", "eql_v3.ste_vec_entry", "eql_v3.ste_vec_entry"), + ("<", "eql_v3.ste_vec_entry", "eql_v3.ste_vec_entry"), + ("<=", "eql_v3.ste_vec_entry", "eql_v3.ste_vec_entry"), + (">", "eql_v3.ste_vec_entry", "eql_v3.ste_vec_entry"), + (">=", "eql_v3.ste_vec_entry", "eql_v3.ste_vec_entry"), + ]; + + let mut missing: Vec<(&str, &str, &str)> = Vec::new(); + for (op, l, r) in expected_supported { + if !have.contains(&(op.to_string(), l.to_string(), r.to_string())) { + missing.push((op, l, r)); + } + } + assert!( + missing.is_empty(), + "expected supported operand signature(s) are absent: {missing:#?}" + ); + Ok(()) +} + +// ============================================================================ +// (2b) Unsupported root-document comparison signatures are BLOCKED. +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_surface_root_comparisons_blocked(pool: PgPool) -> anyhow::Result<()> { + let rows: Vec<(String, String, String)> = sqlx::query_as( + r#" + SELECT o.oprname, + pg_catalog.format_type(o.oprleft, NULL), + pg_catalog.format_type(o.oprright, NULL) + FROM pg_operator o + WHERE o.oprname IN ('=', '<>', '<', '<=', '>', '>=') + AND ('eql_v3.json'::regtype IN (o.oprleft, o.oprright)) + ORDER BY 1, 2, 3 + "#, + ) + .fetch_all(&pool) + .await?; + let have: BTreeSet<(String, String, String)> = rows + .iter() + .map(|(op, l, r)| (op.clone(), norm(l), norm(r))) + .collect(); + for op in ["=", "<>", "<", "<=", ">", ">="] { + for (l, r) in [ + ("eql_v3.json", "eql_v3.json"), + ("eql_v3.json", "jsonb"), + ("jsonb", "eql_v3.json"), + ] { + assert!( + have.contains(&(op.to_string(), l.to_string(), r.to_string())), + "root-document comparison blocker missing for {op}({l}, {r})" + ); + } + } + Ok(()) +} + +// ============================================================================ +// (2c) Mixed-shape entry signatures are ABSENT. +// +// The entry comparison operators must be (ste_vec_entry, ste_vec_entry) only — +// never (ste_vec_entry, jsonb) or (jsonb, ste_vec_entry), which would let a +// raw jsonb operand sneak past the domain. (A runtime such pair flattens to +// native jsonb, so absence is structural.) +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_surface_entry_mixed_shapes_absent(pool: PgPool) -> anyhow::Result<()> { + let mixed: Vec<(String, String, String)> = sqlx::query_as( + r#" + SELECT o.oprname, + pg_catalog.format_type(o.oprleft, NULL), + pg_catalog.format_type(o.oprright, NULL) + FROM pg_operator o + WHERE o.oprname IN ('=', '<>', '<', '<=', '>', '>=') + AND ('eql_v3.ste_vec_entry'::regtype IN (o.oprleft, o.oprright)) + AND NOT (o.oprleft = 'eql_v3.ste_vec_entry'::regtype + AND o.oprright = 'eql_v3.ste_vec_entry'::regtype) + "#, + ) + .fetch_all(&pool) + .await?; + assert!( + mixed.is_empty(), + "entry comparison operators must be (ste_vec_entry, ste_vec_entry) only; \ + found mixed-shape signature(s): {mixed:#?}" + ); + + // Sanity: all six entry symbols ARE present in the symmetric shape. + let present: BTreeSet = sqlx::query_scalar::<_, String>( + r#" + SELECT o.oprname + FROM pg_operator o + WHERE o.oprleft = 'eql_v3.ste_vec_entry'::regtype + AND o.oprright = 'eql_v3.ste_vec_entry'::regtype + "#, + ) + .fetch_all(&pool) + .await? + .into_iter() + .collect(); + for sym in SUPPORTED_ENTRY_SYMBOLS { + assert!( + present.contains(*sym), + "entry operator {sym} missing on (ste_vec_entry, ste_vec_entry)" + ); + } + Ok(()) +} + +// ============================================================================ +// (3) Each blocker is bound to eql_v3.json with PostgreSQL's real native RHS +// type for that operator. +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> { + let bound = v3_jsonb_operators(&pool).await?; + let have: BTreeSet<(String, String, String)> = bound + .iter() + .map(|(n, l, r)| (n.clone(), norm(l), norm(r))) + .collect(); + + // Exact blocker operand signatures with PostgreSQL's real native RHS types + // (verified against blockers.sql and the live catalog). + let expected_blockers: &[(&str, &str, &str)] = &[ + ("?", "eql_v3.json", "text"), + ("?|", "eql_v3.json", "text[]"), + ("?&", "eql_v3.json", "text[]"), + ("@?", "eql_v3.json", "jsonpath"), + ("@@", "eql_v3.json", "jsonpath"), + ("#>", "eql_v3.json", "text[]"), + ("#>>", "eql_v3.json", "text[]"), + ("-", "eql_v3.json", "text"), + ("-", "eql_v3.json", "integer"), + ("-", "eql_v3.json", "text[]"), + ("#-", "eql_v3.json", "text[]"), + ("||", "eql_v3.json", "jsonb"), + // concat is also blocked with the domain on the RIGHT. + ("||", "jsonb", "eql_v3.json"), + // root comparisons are blocked for every typed domain/jsonb shape. + ("=", "eql_v3.json", "eql_v3.json"), + ("=", "eql_v3.json", "jsonb"), + ("=", "jsonb", "eql_v3.json"), + ("<>", "eql_v3.json", "eql_v3.json"), + ("<>", "eql_v3.json", "jsonb"), + ("<>", "jsonb", "eql_v3.json"), + ("<", "eql_v3.json", "eql_v3.json"), + ("<", "eql_v3.json", "jsonb"), + ("<", "jsonb", "eql_v3.json"), + ("<=", "eql_v3.json", "eql_v3.json"), + ("<=", "eql_v3.json", "jsonb"), + ("<=", "jsonb", "eql_v3.json"), + (">", "eql_v3.json", "eql_v3.json"), + (">", "eql_v3.json", "jsonb"), + (">", "jsonb", "eql_v3.json"), + (">=", "eql_v3.json", "eql_v3.json"), + (">=", "eql_v3.json", "jsonb"), + (">=", "jsonb", "eql_v3.json"), + // mixed jsonb containment shapes are blocked; safe forms use json, + // ste_vec_query, or ste_vec_entry. + ("@>", "eql_v3.json", "jsonb"), + ("@>", "jsonb", "eql_v3.json"), + ("<@", "eql_v3.json", "jsonb"), + ("<@", "jsonb", "eql_v3.json"), + ]; + + let mut missing: Vec<(&str, &str, &str)> = Vec::new(); + for (op, l, r) in expected_blockers { + if !have.contains(&(op.to_string(), l.to_string(), r.to_string())) { + missing.push((op, l, r)); + } + } + assert!( + missing.is_empty(), + "expected blocker signature(s) are absent: {missing:#?}" + ); + + // Every blocked symbol's eql_v3.json-bound operator backs a non-STRICT + // plpgsql blocker function (proisstrict = false), so a NULL domain operand + // still raises rather than short-circuiting to NULL. + let strict_offenders: Vec<(String, String)> = sqlx::query_as( + r#" + SELECT o.oprname, p.proname + FROM pg_operator o + JOIN pg_proc p ON p.oid = o.oprcode + WHERE ('eql_v3.json'::regtype IN (o.oprleft, o.oprright)) + AND o.oprname IN ('?', '?|', '?&', '@?', '@@', '#>', '#>>', '-', '#-', '||', + '=', '<>', '<', '<=', '>', '>=', '@>', '<@') + AND p.proname LIKE 'jsonb_blocked%' + AND (p.proisstrict OR p.prolang <> (SELECT oid FROM pg_language WHERE lanname = 'plpgsql')) + "#, + ) + .fetch_all(&pool) + .await?; + assert!( + strict_offenders.is_empty(), + "blocker(s) must be non-STRICT plpgsql so NULL operands still raise; \ + offending (operator, function): {strict_offenders:#?}" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs new file mode 100644 index 000000000..8c16a3369 --- /dev/null +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -0,0 +1,1321 @@ +//! Parameterized test harness for the `eql_v3` encrypted-JSONB (SteVec) surface +//! (`eql_v3.json` / `eql_v3.ste_vec_entry` / `eql_v3.ste_vec_query`). +//! +//! Design source of truth: +//! `docs/superpowers/plans/2026-06-09-eql-v3-jsonb-test-harness-design.md`. +//! This file owns dimensions D1–D11 and D13–D14. The signature-aware +//! operator-surface guard (D12) lives in `v3_jsonb_operator_surface_tests.rs`. +//! +//! Parameter axes are `{leaf kind: hm, oc} × {operator / behavior}` — NOT +//! `{scalar type}`, because a SteVec value is a *document* (a collection of +//! leaves addressed by selector), so it does not fit `scalar_matrix!`. +//! +//! CRITICAL correctness rule: `eql_v3.json` is a DOMAIN over `jsonb`. +//! PostgreSQL resolves `domain OP untyped_literal` to the NATIVE jsonb operator +//! (the domain flattens to its base type for unknown-typed literals). So every +//! `->`/`->>` selector operand and every blocker RHS operand below is +//! explicitly typed (`-> 'sel'::text`, `? 'x'::text`, `@? '$.sv'::jsonpath`, +//! `|| '{}'::jsonb`, …). A BARE literal would resolve to native jsonb and never +//! reach our operator/blocker, giving false results. See +//! `docs/decisions/2026-06-10-eql-v3-json-type-kind.md`. + +use eql_tests::matrix::assert_index_scan_uses; +use sqlx::PgPool; + +// ============================================================================ +// Fixture constants (fixture `v3_ste_vec.sql` → table `fixtures.v3_ste_vec`, +// 10 rows; loaded per-test via +// `#[sqlx::test(fixtures(scripts("v3_ste_vec")))]` on the tests that read it). +// +// NOTE (axis-1): the fixture is GENERATED — cipherstash-client SteVec document +// encryption through the shared `FixtureSpec` pipeline (`mise run +// fixture:generate:all`), not committed. These two SELECTORS are deterministic +// functions of the JSON path under the fixture keyset, re-derived from the +// generated fixture. The root hm TERM is derived at RUNTIME (`root_hm_term`) so +// the last byte-incidental value self-heals across keyset / `documents()` +// changes. Regenerate the fixture and re-derive the selectors on a keyset change. +// ============================================================================ + +/// A selector carrying a constant `hm` leaf across all rows (an object node — +/// the document root `$` / `$.nested`). Used for equality / containment needles. +const SEL_ROOT_HM: &str = "87042b77604cf03ab1ec9a05b5f9c2f7"; +/// A selector carrying a distinct-per-row `oc` leaf (a scalar value, `$.hello` +/// / `$.number`). Distinctness is load-bearing for the W1 containment oracle +/// (`v3_jsonb_containment_oc_only`) — a constant oc would hollow it (Risk #0), +/// guarded by `v3_jsonb_fixture_structural_invariants`. +const SEL_HELLO_OC: &str = "3a114ad13d25b030f41175114347de59"; + +/// A forged `hm` term for the SELF-CONTAINED equality / containment tests (D1, +/// `containment_self_and_subset`) — they build their own entries / docs and +/// need only a valid, internally-consistent hex term, NOT the fixture's real +/// root hm (which the fixture-touching tests derive at runtime). +const HM_TERM_FORGED: &str = "aabbccddeeff00112233445566778899"; + +// ============================================================================ +// Tier-2 builders — curated literal payloads with KNOWN relationships. +// +// The fixture's real `oc` ciphertexts are not in a guaranteed total order, so +// the ORDERED-correctness arms (D2) use a CURATED forged `oc` ladder built +// inline here (forge hex differing in the trailing byte, like the smoke +// `src/v3/jsonb/jsonb_test.sql`). Under the CLLW per-byte protocol, when the +// first differing byte `b` satisfies `(b+1) == a`, then `a > b`; choosing +// trailing bytes `..00 < ..01 < ..02` yields a total, known order. +// +// Why not assert ordering over the *real* per-leaf `oc` ciphertexts directly: +// the v3_ste_vec fixture's `$.hello` `oc` leaves are sampled values with no +// known/stable plaintext-to-order mapping (the proxy emits CLLW blocks whose +// pairwise order is not curated in the fixture), so there is no oracle to assert +// against per leaf. Real-ciphertext ordering *is* covered where an oracle +// exists: the scalar matrix ORDER BY arm (`tests/sqlx/src/matrix.rs`, +// `*_ord_*_order_by`) sorts a column of real fixture ciphertexts and asserts the +// result matches the plaintext-sorted oracle. This forged ladder covers the +// complementary axis — that the per-leaf jsonb `oc` comparison wiring itself +// orders correctly — with a known total order the fixture cannot provide. +// ============================================================================ + +/// A forged `oc` hex ladder at a shared prefix, strictly increasing under CLLW. +/// `OC_LADDER[0] < OC_LADDER[1] < OC_LADDER[2] < OC_LADDER[3]`. +const OC_LADDER: [&str; 4] = [ + "00010203040500", + "00010203040501", + "00010203040502", + "00010203040503", +]; + +/// Build a single sv entry literal (`ste_vec_entry`-shaped) carrying selector +/// `sel`, ciphertext `c`, and exactly one term (`hm` or `oc`). +fn entry(sel: &str, term_field: &str, term_hex: &str) -> String { + format!(r#"{{"s":"{sel}","c":"ct","{term_field}":"{term_hex}"}}"#) +} + +/// Build an `oc` ste_vec_entry literal at the canonical ordered selector. +fn oc_entry(oc_hex: &str) -> String { + entry(SEL_HELLO_OC, "oc", oc_hex) +} + +/// Build a document literal (`eql_v3.json`-shaped) wrapping the given sv element +/// literals (each already a JSON object string). +fn doc(elems: &[String]) -> String { + format!( + r#"{{"i":{{"c":"col","t":"encrypted"}},"v":2,"sv":[{}]}}"#, + elems.join(",") + ) +} + +/// Build a `ste_vec_query` needle literal from `(selector, term_field, hex)` +/// triples (each element carries `s` + exactly one term, never `c`). +fn needle(elems: &[(&str, &str, &str)]) -> String { + let parts: Vec = elems + .iter() + .map(|(s, field, hex)| format!(r#"{{"s":"{s}","{field}":"{hex}"}}"#)) + .collect(); + format!(r#"{{"sv":[{}]}}"#, parts.join(",")) +} + +/// Derive the fixture's constant root `hm` term at runtime from row 1. +/// +/// The term is a deterministic function of the root plaintext + keyset, so it +/// changes when the fixture is regenerated under a new keyset or when +/// `documents()` changes the root object. Runtime derivation keeps the +/// fixture-touching tests correct without a stale hard-coded literal (extends +/// the W1 self-needle pattern). `SEL_ROOT_HM` carries a constant hm across all +/// rows (asserted by `v3_jsonb_fixture_structural_invariants`), so row 1 is +/// representative. +async fn root_hm_term(pool: &PgPool) -> anyhow::Result { + Ok(sqlx::query_scalar(&format!( + "SELECT (payload ->> '{SEL_ROOT_HM}'::text)::jsonb ->> 'hm' \ + FROM fixtures.v3_ste_vec WHERE id = 1" + )) + .fetch_one(pool) + .await?) +} + +// ============================================================================ +// D1 — Equality correctness on a leaf (entry = needle iff terms equal; <> is +// the negation). Parameterized over leaf kind ∈ {hm, oc}. +// ============================================================================ + +macro_rules! v3_jsonb_eq_correctness { + ( $( ($name:ident, $field:literal, $sel:expr, $a:expr, $b:expr) ),+ $(,)? ) => { + $( paste::paste! { + #[sqlx::test] + async fn [](pool: PgPool) -> anyhow::Result<()> { + let same_a = entry($sel, $field, $a); + let same_b = entry($sel, $field, $a); // different `c`-irrelevant copy, same term + let diff_b = entry($sel, $field, $b); + + // = is true iff terms equal. + let eq_same: bool = sqlx::query_scalar(&format!( + "SELECT '{same_a}'::eql_v3.ste_vec_entry = '{same_b}'::eql_v3.ste_vec_entry" + )).fetch_one(&pool).await?; + assert!(eq_same, "{} entries with equal terms must be =", $field); + + let eq_diff: bool = sqlx::query_scalar(&format!( + "SELECT '{same_a}'::eql_v3.ste_vec_entry = '{diff_b}'::eql_v3.ste_vec_entry" + )).fetch_one(&pool).await?; + assert!(!eq_diff, "{} entries with differing terms must NOT be =", $field); + + // <> is the exact negation of =. + let neq_same: bool = sqlx::query_scalar(&format!( + "SELECT '{same_a}'::eql_v3.ste_vec_entry <> '{same_b}'::eql_v3.ste_vec_entry" + )).fetch_one(&pool).await?; + assert!(!neq_same, "<> must be false when terms equal"); + + let neq_diff: bool = sqlx::query_scalar(&format!( + "SELECT '{same_a}'::eql_v3.ste_vec_entry <> '{diff_b}'::eql_v3.ste_vec_entry" + )).fetch_one(&pool).await?; + assert!(neq_diff, "<> must be true when terms differ"); + + Ok(()) + } + } )+ + }; +} + +v3_jsonb_eq_correctness!( + ( + hm, + "hm", + SEL_ROOT_HM, + HM_TERM_FORGED, + "ffffffffffffffffffffffffffffffff" + ), + (oc, "oc", SEL_HELLO_OC, OC_LADDER[0], OC_LADDER[1]), +); + +// ============================================================================ +// D2 — Ordered correctness on an `oc` leaf: < <= > >= follow CLLW ORE order, +// asserted against the curated, KNOWN-ordered forged ladder. Order is +// total and known, so we assert the exact relation for each operator. +// ============================================================================ + +macro_rules! v3_jsonb_ord_correctness { + ( $( ($name:ident, $op:literal, $lo_rel:expr, $eq_rel:expr, $hi_rel:expr) ),+ $(,)? ) => { + $( paste::paste! { + #[sqlx::test] + async fn [](pool: PgPool) -> anyhow::Result<()> { + let lo = oc_entry(OC_LADDER[1]); + let mid = oc_entry(OC_LADDER[1]); // equal term to `lo` + let hi = oc_entry(OC_LADDER[2]); + + // mid `op` (something strictly greater): the "lo < hi" position. + let against_greater: bool = sqlx::query_scalar(&format!( + "SELECT '{mid}'::eql_v3.ste_vec_entry {} '{hi}'::eql_v3.ste_vec_entry", $op + )).fetch_one(&pool).await?; + assert_eq!(against_greater, $lo_rel, + "oc {} against a strictly-greater leaf", $op); + + // mid `op` (equal term). + let against_equal: bool = sqlx::query_scalar(&format!( + "SELECT '{mid}'::eql_v3.ste_vec_entry {} '{lo}'::eql_v3.ste_vec_entry", $op + )).fetch_one(&pool).await?; + assert_eq!(against_equal, $eq_rel, + "oc {} against an equal-term leaf", $op); + + // hi `op` (something strictly smaller). + let against_smaller: bool = sqlx::query_scalar(&format!( + "SELECT '{hi}'::eql_v3.ste_vec_entry {} '{lo}'::eql_v3.ste_vec_entry", $op + )).fetch_one(&pool).await?; + assert_eq!(against_smaller, $hi_rel, + "oc {} against a strictly-smaller leaf", $op); + + Ok(()) + } + } )+ + }; +} + +// op vs-greater vs-equal vs-smaller +v3_jsonb_ord_correctness!( + (lt, "<", true, false, false), + (lte, "<=", true, true, false), + (gt, ">", false, false, true), + (gte, ">=", false, true, true), +); + +/// D2 — the forged ladder is a TOTAL order across all four leaves. +#[sqlx::test] +async fn v3_jsonb_oc_ladder_is_total_order(pool: PgPool) -> anyhow::Result<()> { + for w in OC_LADDER.windows(2) { + let lo = oc_entry(w[0]); + let hi = oc_entry(w[1]); + let ok: bool = sqlx::query_scalar(&format!( + "SELECT '{lo}'::eql_v3.ste_vec_entry < '{hi}'::eql_v3.ste_vec_entry" + )) + .fetch_one(&pool) + .await?; + assert!( + ok, + "ladder must be strictly increasing: {} < {}", + w[0], w[1] + ); + } + // Transitive end-to-end: first < last. + let first = oc_entry(OC_LADDER[0]); + let last = oc_entry(OC_LADDER[OC_LADDER.len() - 1]); + let end: bool = sqlx::query_scalar(&format!( + "SELECT '{first}'::eql_v3.ste_vec_entry < '{last}'::eql_v3.ste_vec_entry" + )) + .fetch_one(&pool) + .await?; + assert!(end, "ladder ends must be ordered first < last"); + Ok(()) +} + +// ============================================================================ +// D3 — Entry comparison shape guard: the supported `(entry, entry)` form +// resolves and behaves. (The mixed-shape ABSENCE — `(entry, jsonb)` / +// `(jsonb, entry)` — is a structural catalog guard and lives in +// v3_jsonb_operator_surface_tests.rs, because at runtime such a pair +// flattens to native `jsonb = jsonb` rather than raising.) +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_entry_entry_shape_resolves(pool: PgPool) -> anyhow::Result<()> { + let a = entry(SEL_HELLO_OC, "oc", OC_LADDER[0]); + let b = entry(SEL_HELLO_OC, "oc", OC_LADDER[1]); + // Each of the six entry operators resolves on (entry, entry) and returns bool. + for op in ["=", "<>", "<", "<=", ">", ">="] { + let _v: bool = sqlx::query_scalar(&format!( + "SELECT '{a}'::eql_v3.ste_vec_entry {op} '{b}'::eql_v3.ste_vec_entry" + )) + .fetch_one(&pool) + .await?; + } + Ok(()) +} + +// ============================================================================ +// D4 — Containment positives + commutator agreement `a @> b ⇔ b <@ a`. +// Parameterized over needle kind ∈ {hm-only, oc-only, mixed}. +// ============================================================================ + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_containment_hm_only(pool: PgPool) -> anyhow::Result<()> { + // Root hm term is constant across every fixture row, so the needle matches + // all of them. Compare against the live row count (W/C: no hard-coded `10`), + // and require a non-empty table so "matches all" isn't vacuously "matches 0". + let total: i64 = sqlx::query_scalar("SELECT count(*) FROM fixtures.v3_ste_vec") + .fetch_one(&pool) + .await?; + assert!( + total > 0, + "fixture sanity: fixtures.v3_ste_vec must be non-empty" + ); + + let root_hm = root_hm_term(&pool).await?; + let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); + let hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert_eq!( + hits, total, + "every fixture row carries the constant root hm" + ); + + // Commutator: ste_vec_query <@ json must agree row-for-row. + let hits_rev: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::eql_v3.ste_vec_query <@ payload" + )) + .fetch_one(&pool) + .await?; + assert_eq!(hits_rev, hits, "a @> b must agree with b <@ a"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_containment_oc_only(pool: PgPool) -> anyhow::Result<()> { + // Use a self-needle: extract row 1's `$.hello` oc term and search for it. + let oc: String = sqlx::query_scalar(&format!( + "SELECT (payload ->> '{SEL_HELLO_OC}'::text)::jsonb ->> 'oc' FROM fixtures.v3_ste_vec WHERE id = 1" + )) + .fetch_one(&pool) + .await?; + let n = needle(&[(SEL_HELLO_OC, "oc", &oc)]); + + // Row 1 must be among the matches (oc terms can repeat across rows). + let row1: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert_eq!(row1, 1, "row 1 must contain its own oc leaf"); + + // Commutator agreement over the whole table. + let fwd: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + let rev: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::eql_v3.ste_vec_query <@ payload" + )) + .fetch_one(&pool) + .await?; + assert_eq!(fwd, rev, "oc-only @> must agree with <@"); + + // Independent oracle (W1): the exact match count, computed by plain field + // extraction + string equality — NOT via the `@>` operator under test. This + // pins containment to the ground-truth multiplicity, so an over-matching or + // collapsed containment fails (`fwd > expected`) rather than passing the old + // tautological `fwd >= 1`. + let expected: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec \ + WHERE (payload ->> '{SEL_HELLO_OC}'::text)::jsonb ->> 'oc' = '{oc}'" + )) + .fetch_one(&pool) + .await?; + assert!( + expected >= 1, + "fixture sanity: row 1's oc term must be present" + ); + assert_eq!( + fwd, expected, + "@> must match exactly the rows whose $.hello oc equals the needle term" + ); + + // W1 strict-subset (Risk #0): the self-needle must match a PROPER subset, + // not the whole table. With `$.hello` distinct per row, `expected == 1 < + // total`. A full-table match means `$.hello` collapsed to a constant oc and + // the exact-multiplicity check above is vacuous. + let total: i64 = sqlx::query_scalar("SELECT count(*) FROM fixtures.v3_ste_vec") + .fetch_one(&pool) + .await?; + assert!( + expected < total, + "W1: $.hello oc self-needle must match a strict subset ({expected} of {total}); \ + a full-table match means $.hello is constant and the oracle is hollow (Risk #0)" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_containment_mixed(pool: PgPool) -> anyhow::Result<()> { + // Mixed needle: root hm + row 1's own oc leaf. Row 1 must match. + let oc: String = sqlx::query_scalar(&format!( + "SELECT (payload ->> '{SEL_HELLO_OC}'::text)::jsonb ->> 'oc' FROM fixtures.v3_ste_vec WHERE id = 1" + )) + .fetch_one(&pool) + .await?; + let root_hm = root_hm_term(&pool).await?; + let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm), (SEL_HELLO_OC, "oc", &oc)]); + + let row1: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert_eq!( + row1, 1, + "row 1 contains both the root hm and its own oc leaf" + ); + Ok(()) +} + +/// D4 — self-containment and the document/document + entry-needle overloads +/// against a curated doc with both leaf kinds. +#[sqlx::test] +async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<()> { + let full = doc(&[ + entry(SEL_ROOT_HM, "hm", HM_TERM_FORGED), + oc_entry(OC_LADDER[2]), + ]); + let subset = doc(&[entry(SEL_ROOT_HM, "hm", HM_TERM_FORGED)]); + + // Self-containment (json @> json). + let self_c: bool = sqlx::query_scalar(&format!( + "SELECT '{full}'::eql_v3.json @> '{full}'::eql_v3.json" + )) + .fetch_one(&pool) + .await?; + assert!(self_c, "a document must contain itself"); + + // Superset @> subset, and commutator subset <@ superset. + let sup: bool = sqlx::query_scalar(&format!( + "SELECT '{full}'::eql_v3.json @> '{subset}'::eql_v3.json" + )) + .fetch_one(&pool) + .await?; + let sub: bool = sqlx::query_scalar(&format!( + "SELECT '{subset}'::eql_v3.json <@ '{full}'::eql_v3.json" + )) + .fetch_one(&pool) + .await?; + assert!( + sup && sub, + "superset @> subset must agree with subset <@ superset" + ); + + // Subset does NOT contain superset. + let backwards: bool = sqlx::query_scalar(&format!( + "SELECT '{subset}'::eql_v3.json @> '{full}'::eql_v3.json" + )) + .fetch_one(&pool) + .await?; + assert!(!backwards, "subset must not contain superset"); + + // entry-needle overload (json @> ste_vec_entry) + reverse (entry <@ json). + let ent = entry(SEL_ROOT_HM, "hm", HM_TERM_FORGED); + let by_entry: bool = sqlx::query_scalar(&format!( + "SELECT '{full}'::eql_v3.json @> '{ent}'::eql_v3.ste_vec_entry" + )) + .fetch_one(&pool) + .await?; + let by_entry_rev: bool = sqlx::query_scalar(&format!( + "SELECT '{ent}'::eql_v3.ste_vec_entry <@ '{full}'::eql_v3.json" + )) + .fetch_one(&pool) + .await?; + assert!( + by_entry && by_entry_rev, + "entry-needle @> and its <@ reverse must hold" + ); + Ok(()) +} + +/// LB1–LB3 structural invariants of the GENERATED fixture, asserted directly +/// (the containment / index oracles only imply them). This is the "generated +/// fixture matches the load-bearing properties" guard, and it doubles as the +/// reproducibility contract: live SteVec encryption is NOT byte-deterministic +/// (ZeroKMS randomises the `c` ciphertext), so the stable contract is these +/// structural invariants, not byte-equality. It is correctly fixture-touching, +/// so it fails on the empty-fixture negative control (count(*) = 10). +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_fixture_structural_invariants(pool: PgPool) -> anyhow::Result<()> { + // LB1: exactly 10 rows, ids 1..=10. + let n: i64 = sqlx::query_scalar("SELECT count(*) FROM fixtures.v3_ste_vec") + .fetch_one(&pool) + .await?; + assert_eq!(n, 10, "LB1: exactly 10 rows"); + let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.v3_ste_vec ORDER BY id") + .fetch_all(&pool) + .await?; + assert_eq!(ids, (1..=10).collect::>(), "LB1: ids 1..=10"); + + // LB2: the root hm selector is present in every row with a CONSTANT hm term. + let distinct_root_hm: i64 = sqlx::query_scalar(&format!( + "SELECT count(DISTINCT (payload ->> '{SEL_ROOT_HM}'::text)::jsonb ->> 'hm') \ + FROM fixtures.v3_ste_vec" + )) + .fetch_one(&pool) + .await?; + assert_eq!(distinct_root_hm, 1, "LB2: root hm constant across all rows"); + let root_hm_rows: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec \ + WHERE (payload ->> '{SEL_ROOT_HM}'::text)::jsonb ? 'hm'::text" + )) + .fetch_one(&pool) + .await?; + assert_eq!(root_hm_rows, 10, "LB2: root hm present in every row"); + + // LB3: the $.hello oc is present in every row AND distinct across all 10 + // (oracle discrimination — Risk #0). + let distinct_hello_oc: i64 = sqlx::query_scalar(&format!( + "SELECT count(DISTINCT (payload ->> '{SEL_HELLO_OC}'::text)::jsonb ->> 'oc') \ + FROM fixtures.v3_ste_vec" + )) + .fetch_one(&pool) + .await?; + assert_eq!( + distinct_hello_oc, 10, + "LB3: $.hello oc distinct across all rows (oracle discrimination)" + ); + Ok(()) +} + +// ============================================================================ +// D5 — Negative / discriminating containment (the eq_term coalesce(hm,oc) +// collapse regression guard). BOTH wrong-bytes AND wrong-term-type. +// ============================================================================ + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_containment_rejects_wrong_bytes(pool: PgPool) -> anyhow::Result<()> { + // Non-vacuity floor (W3): the CORRECT needle at this selector must match + // some rows, so the `== 0` below means "rejected", not "table empty". + let root_hm = root_hm_term(&pool).await?; + let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); + let good_hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert!( + good_hits > 0, + "fixture sanity: the correct hm needle must match" + ); + + // Real selector, WRONG hm bytes — must match nothing. + let n = needle(&[(SEL_ROOT_HM, "hm", "deadbeefdeadbeefdeadbeefdeadbeef")]); + let hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert_eq!( + hits, 0, + "a needle with wrong term bytes at a real selector must not match" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::Result<()> { + // The genuine load-bearing collapse guard (W2), fully self-contained (no + // fixture): a curated `hm` leaf and an `oc` needle carrying BYTE-IDENTICAL + // term bytes at the same selector. `eq_term` coalesces hm/oc to the same + // bytes, so a naive byte compare would falsely match — but containment keys + // on the term FIELD (`hm` vs `oc`), so the oc needle must REJECT while the + // matching hm needle ACCEPTS (floor proving it's discrimination, not a dead + // path). The fixture data happens to contain no such collision, so this + // constructs one explicitly rather than relying on the rows. + const COLLIDE_SEL: &str = "00000000000000000000000000000001"; + const COLLIDE_TERM: &str = "00112233445566778899aabbccddeeff"; + let hm_doc = doc(&[entry(COLLIDE_SEL, "hm", COLLIDE_TERM)]); + let oc_needle = needle(&[(COLLIDE_SEL, "oc", COLLIDE_TERM)]); + let hm_needle = needle(&[(COLLIDE_SEL, "hm", COLLIDE_TERM)]); + let collide_accept: bool = sqlx::query_scalar(&format!( + "SELECT '{hm_doc}'::eql_v3.json @> '{hm_needle}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + let collide_reject: bool = sqlx::query_scalar(&format!( + "SELECT '{hm_doc}'::eql_v3.json @> '{oc_needle}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert!(collide_accept, "matching hm needle must accept (floor)"); + assert!( + !collide_reject, + "an oc needle must NOT match an hm leaf with byte-identical term bytes" + ); + + // The same field-type discrimination against the REAL fixture rows. W3 + // non-vacuity floor first: the correct hm needle matches, so `== 0` below + // means "rejected", not "table empty". + let root_hm = root_hm_term(&pool).await?; + let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); + let good_hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert!( + good_hits > 0, + "fixture sanity: the correct hm needle must match" + ); + + // An `oc`-field needle carrying the real hm term at the hm selector: rejects. + let n = needle(&[(SEL_ROOT_HM, "oc", &root_hm)]); + let hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert_eq!( + hits, 0, + "an oc-field needle must not match an hm leaf (field-type discrimination)" + ); + + // And the reverse: an `hm`-field needle carrying a real oc term at the oc + // selector must reject against every row. + let oc: String = sqlx::query_scalar(&format!( + "SELECT (payload ->> '{SEL_HELLO_OC}'::text)::jsonb ->> 'oc' FROM fixtures.v3_ste_vec WHERE id = 1" + )) + .fetch_one(&pool) + .await?; + let n2 = needle(&[(SEL_HELLO_OC, "hm", &oc)]); + let hits2: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n2}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert_eq!( + hits2, 0, + "an hm-field needle must not match an oc leaf (field-type discrimination)" + ); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_containment_rejects_wrong_selector(pool: PgPool) -> anyhow::Result<()> { + // Non-vacuity floor (W3): the same term at its REAL selector must match, so + // the `== 0` below means "rejected for wrong selector", not "table empty". + let root_hm = root_hm_term(&pool).await?; + let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); + let good_hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert!( + good_hits > 0, + "fixture sanity: the term matches at its real selector" + ); + + // Right term bytes, but a selector that exists in no fixture row. + let n = needle(&[("ffffffffffffffffffffffffffffffff", "hm", &root_hm)]); + let hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.ste_vec_query" + )) + .fetch_one(&pool) + .await?; + assert_eq!( + hits, 0, + "a needle at a non-existent selector must not match" + ); + Ok(()) +} + +// ============================================================================ +// D6 — NULL-per-supported-signature: every supported wrapper is STRICT and +// propagates NULL on each nullable argument position. +// ============================================================================ + +macro_rules! v3_jsonb_supported_null { + ( $( ($name:ident, $sql:expr) ),+ $(,)? ) => { + $( paste::paste! { + #[sqlx::test] + async fn [](pool: PgPool) -> anyhow::Result<()> { + // Supported operators are STRICT: a NULL operand yields NULL, not + // an error and not a non-NULL result. + eql_tests::assert_null(&pool, $sql, &[]).await + } + } )+ + }; +} + +// A well-formed empty document — the non-NULL counterpart used by the blocker +// arms below. +const NN_DOC: &str = r#"{"i":{},"v":2,"sv":[]}"#; + +v3_jsonb_supported_null!( + // entry comparisons (= <> < <= > >=), NULL on each side + (entry_eq_lhs, "SELECT NULL::eql_v3.ste_vec_entry = '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::eql_v3.ste_vec_entry"), + (entry_eq_rhs, "SELECT '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::eql_v3.ste_vec_entry = NULL::eql_v3.ste_vec_entry"), + (entry_neq_lhs, "SELECT NULL::eql_v3.ste_vec_entry <> '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::eql_v3.ste_vec_entry"), + (entry_lt_lhs, "SELECT NULL::eql_v3.ste_vec_entry < '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.ste_vec_entry"), + (entry_lte_lhs, "SELECT NULL::eql_v3.ste_vec_entry <= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.ste_vec_entry"), + (entry_gt_lhs, "SELECT NULL::eql_v3.ste_vec_entry > '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.ste_vec_entry"), + (entry_gte_lhs, "SELECT NULL::eql_v3.ste_vec_entry >= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.ste_vec_entry"), + // document containment: json @> json + (doc_contains_doc_lhs, "SELECT NULL::eql_v3.json @> '{\"i\":{},\"v\":2,\"sv\":[]}'::eql_v3.json"), + (doc_contains_doc_rhs, "SELECT '{\"i\":{},\"v\":2,\"sv\":[]}'::eql_v3.json @> NULL::eql_v3.json"), + // json @> ste_vec_query / json @> ste_vec_entry + (doc_contains_query_lhs, "SELECT NULL::eql_v3.json @> '{\"sv\":[]}'::eql_v3.ste_vec_query"), + (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":2,\"sv\":[]}'::eql_v3.json @> NULL::eql_v3.ste_vec_query"), + (doc_contains_entry_rhs, "SELECT '{\"i\":{},\"v\":2,\"sv\":[]}'::eql_v3.json @> NULL::eql_v3.ste_vec_entry"), + // <@ reverses + (query_contained_lhs, "SELECT NULL::eql_v3.ste_vec_query <@ '{\"i\":{},\"v\":2,\"sv\":[]}'::eql_v3.json"), + (entry_contained_lhs, "SELECT NULL::eql_v3.ste_vec_entry <@ '{\"i\":{},\"v\":2,\"sv\":[]}'::eql_v3.json"), +); + +// The `-> text` / `-> int` / `->> text` accessors return non-boolean types, so +// they can't go through `assert_null` (which expects `Option`). Assert +// their STRICT NULL-propagation directly. +#[sqlx::test] +async fn v3_jsonb_arrow_accessors_supported_null(pool: PgPool) -> anyhow::Result<()> { + let arrow_text: Option = + sqlx::query_scalar("SELECT (NULL::eql_v3.json -> 'x'::text)::jsonb::text") + .fetch_one(&pool) + .await?; + assert!(arrow_text.is_none(), "json -> text must propagate NULL"); + + let arrow_int: Option = + sqlx::query_scalar("SELECT (NULL::eql_v3.json -> 0::integer)::jsonb::text") + .fetch_one(&pool) + .await?; + assert!(arrow_int.is_none(), "json -> int must propagate NULL"); + + let arrow_text_text: Option = + sqlx::query_scalar("SELECT NULL::eql_v3.json ->> 'x'::text") + .fetch_one(&pool) + .await?; + assert!( + arrow_text_text.is_none(), + "json ->> text must propagate NULL" + ); + + let arrow_int_text: Option = + sqlx::query_scalar("SELECT NULL::eql_v3.json ->> 0::integer") + .fetch_one(&pool) + .await?; + assert!(arrow_int_text.is_none(), "json ->> int must propagate NULL"); + Ok(()) +} + +// ============================================================================ +// D7 — Blocker-per-unsupported-native-jsonb-signature. Each blocked native op +// raises "is not supported" using PostgreSQL's real RHS type/value, and +// the blocker is non-STRICT (NULL domain operand STILL raises). +// ============================================================================ + +macro_rules! v3_jsonb_blocker_cases { + ( $( ($name:ident, $op:literal, $rhs:expr, rhs_domain = $rhs_domain:expr) ),+ $(,)? ) => { + $( paste::paste! { + #[sqlx::test] + async fn [](pool: PgPool) -> anyhow::Result<()> { + let lhs = format!("'{}'::eql_v3.json", NN_DOC); + let msg = "is not supported"; + + // Domain on the left, real-typed RHS — must raise. + let sql = format!("SELECT {lhs} {} {}", $op, $rhs); + eql_tests::assert_raises(&pool, &sql, &[], msg).await?; + + // Non-STRICT proof: NULL domain LHS must STILL raise (a STRICT + // blocker would short-circuit to NULL and bypass the exception). + let null_lhs = format!("SELECT NULL::eql_v3.json {} {}", $op, $rhs); + eql_tests::assert_raises(&pool, &null_lhs, &[], msg).await?; + + // Domain on the RIGHT, only where the surface defines that form. + let rhs_dom: Option<&str> = $rhs_domain; + if let Some(_) = rhs_dom { + let sql = format!("SELECT {} {} '{}'::eql_v3.json", $rhs, $op, NN_DOC); + eql_tests::assert_raises(&pool, &sql, &[], msg).await?; + // Non-STRICT proof for the right-domain form. + let null_rhs = format!("SELECT {} {} NULL::eql_v3.json", $rhs, $op); + eql_tests::assert_raises(&pool, &null_rhs, &[], msg).await?; + } + Ok(()) + } + } )+ + }; +} + +v3_jsonb_blocker_cases!( + ( + root_eq, + "=", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + ( + root_neq, + "<>", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + ( + root_lt, + "<", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + ( + root_lte, + "<=", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + ( + root_gt, + ">", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + ( + root_gte, + ">=", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + ( + mixed_contains, + "@>", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + ( + mixed_contained_by, + "<@", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), + (question, "?", "'x'::text", rhs_domain = None), + (question_pipe, "?|", "ARRAY['x']::text[]", rhs_domain = None), + (question_amp, "?&", "ARRAY['x']::text[]", rhs_domain = None), + (at_question, "@?", "'$.sv'::jsonpath", rhs_domain = None), + (at_at, "@@", "'$.sv'::jsonpath", rhs_domain = None), + (path_get, "#>", "ARRAY['sv']::text[]", rhs_domain = None), + ( + path_get_text, + "#>>", + "ARRAY['sv']::text[]", + rhs_domain = None + ), + (minus_text, "-", "'sv'::text", rhs_domain = None), + (minus_int, "-", "0::integer", rhs_domain = None), + (minus_array, "-", "ARRAY['sv']::text[]", rhs_domain = None), + (path_del, "#-", "ARRAY['sv']::text[]", rhs_domain = None), + ( + concat, + "||", + "'{}'::jsonb", + rhs_domain = Some("'{}'::jsonb") + ), +); + +#[sqlx::test] +async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Result<()> { + let lhs = format!("'{}'::eql_v3.json", NN_DOC); + let rhs = format!("'{}'::eql_v3.json", NN_DOC); + for op in ["=", "<>", "<", "<=", ">", ">="] { + let sql = format!("SELECT {lhs} {op} {rhs}"); + eql_tests::assert_raises(&pool, &sql, &[], "is not supported").await?; + } + Ok(()) +} + +// ============================================================================ +// D9 — Payload-CHECK per domain. Malformed payloads are rejected by the domain +// CHECK (error contains "violates check constraint"). +// ============================================================================ + +macro_rules! v3_jsonb_payload_reject { + ( $fn:ident, $domain:expr, [ $( $payload:expr ),+ $(,)? ] ) => { + #[sqlx::test] + async fn $fn(pool: PgPool) -> anyhow::Result<()> { + for payload in [ $( $payload ),+ ] { + let sql = format!("SELECT '{}'::{}", payload, $domain); + eql_tests::assert_raises(&pool, &sql, &[], "violates check constraint") + .await + .map_err(|e| anyhow::anyhow!("payload {:?} for {} should reject: {}", payload, $domain, e))?; + } + Ok(()) + } + }; +} + +v3_jsonb_payload_reject!( + v3_jsonb_json_payload_check, + "eql_v3.json", + [ + "[]", // non-object + "{\"v\":2,\"sv\":[]}", // missing i + "{\"i\":{},\"sv\":[]}", // missing v + "{\"i\":{},\"v\":3,\"sv\":[]}", // v != 2 + "{\"i\":{},\"v\":2.0,\"sv\":[]}", // v renders to text '2.0', not '2' + "{\"i\":{},\"v\":2}", // missing sv + "{\"i\":{},\"v\":2,\"sv\":{}}", // sv not an array + "{\"i\":{},\"v\":2,\"sv\":[{\"s\":null,\"c\":\"y\",\"hm\":\"00\"}]}", // bad entry s + "{\"i\":{},\"v\":2,\"sv\":[{\"s\":\"x\",\"c\":1,\"hm\":\"00\"}]}", // bad entry c + "{\"i\":{},\"v\":2,\"sv\":[{\"s\":\"x\",\"c\":\"y\",\"hm\":null}]}", // bad entry hm + "{\"i\":{},\"v\":2,\"sv\":[{\"s\":\"x\",\"c\":\"y\",\"oc\":1}]}", // bad entry oc + ] +); + +v3_jsonb_payload_reject!( + v3_jsonb_ste_vec_entry_payload_check, + "eql_v3.ste_vec_entry", + [ + "[]", // non-object + "{\"s\":\"x\",\"hm\":\"00\"}", // missing c + "{\"c\":\"y\",\"hm\":\"00\"}", // missing s + "{\"s\":\"x\",\"c\":\"y\"}", // neither hm nor oc + "{\"s\":\"x\",\"c\":\"y\",\"hm\":\"00\",\"oc\":\"01\"}", // both hm and oc (XOR) + "{\"s\":null,\"c\":\"y\",\"hm\":\"00\"}", // s must be a string + "{\"s\":\"x\",\"c\":1,\"hm\":\"00\"}", // c must be a string + "{\"s\":\"x\",\"c\":\"y\",\"hm\":null}", // hm must be a string + "{\"s\":\"x\",\"c\":\"y\",\"oc\":1}", // oc must be a string + ] +); + +v3_jsonb_payload_reject!( + v3_jsonb_ste_vec_query_payload_check, + "eql_v3.ste_vec_query", + [ + "[]", // non-object + "{\"sv\":{}}", // sv not an array + "{\"sv\":[{\"s\":\"x\",\"c\":\"y\",\"hm\":\"00\"}]}", // c-bearing element + "{\"sv\":[{\"hm\":\"00\"}]}", // selector-only (no s) + "{\"sv\":[{\"s\":\"x\",\"hm\":\"00\",\"oc\":\"01\"}]}", // both terms + "{\"sv\":[{\"s\":\"x\"}]}", // no term + "{\"sv\":[{\"s\":null,\"hm\":\"00\"}]}", // s must be a string + "{\"sv\":[{\"s\":\"x\",\"hm\":null}]}", // hm must be a string + "{\"sv\":[{\"s\":\"x\",\"oc\":1}]}", // oc must be a string + ] +); + +/// D9 — the well-formed positives the CHECKs MUST accept (so the rejects above +/// aren't trivially passing because everything is rejected). +#[sqlx::test] +async fn v3_jsonb_payload_check_accepts_valid(pool: PgPool) -> anyhow::Result<()> { + let ok_doc: bool = + sqlx::query_scalar("SELECT '{\"i\":{},\"v\":2,\"sv\":[]}'::eql_v3.json IS NOT NULL") + .fetch_one(&pool) + .await?; + assert!(ok_doc); + let ok_entry: bool = sqlx::query_scalar( + "SELECT '{\"s\":\"x\",\"c\":\"y\",\"hm\":\"00\"}'::eql_v3.ste_vec_entry IS NOT NULL", + ) + .fetch_one(&pool) + .await?; + assert!(ok_entry); + let ok_query: bool = sqlx::query_scalar( + "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"00\"}]}'::eql_v3.ste_vec_query IS NOT NULL", + ) + .fetch_one(&pool) + .await?; + assert!(ok_query); + Ok(()) +} + +/// D9 — the cipherstash-client SteVec envelope SHAPE (the extra top-level +/// `k:"sv"` the generator emits, plus the per-entry `a` array marker) must pass +/// the `eql_v3.json` domain CHECK. The static fixture lacked `k`; the generated +/// fixture carries it, so this guards the generated fixture against a CHECK +/// rejection independently of live encryption (no creds, no fixture load). +#[sqlx::test] +async fn v3_jsonb_generator_envelope_shape_accepted(pool: PgPool) -> anyhow::Result<()> { + let envelope = r#"{ + "k":"sv","v":2,"i":{"c":"payload","t":"_fixture_v3_ste_vec"}, + "sv":[ + {"s":"87042b77604cf03ab1ec9a05b5f9c2f7","c":"ct","hm":"8477cf88d9be4f92503b0d31dd575704","a":false}, + {"s":"3a114ad13d25b030f41175114347de59","c":"ct","oc":"00010203","a":false} + ] + }"#; + let ok: bool = sqlx::query_scalar(&format!("SELECT '{envelope}'::eql_v3.json IS NOT NULL")) + .fetch_one(&pool) + .await?; + assert!( + ok, + "cipherstash SteVec envelope (root k:\"sv\" + per-entry a) must pass the eql_v3.json CHECK" + ); + Ok(()) +} + +// ============================================================================ +// D10 — Path/array function correctness. Matching selector returns +// ste_vec_entry rows; missing selector returns empty/NULL; non-array +// raises; jsonb_array_elements returns SETOF ste_vec_entry. +// ============================================================================ + +/// A curated array-flavoured document (`a:true`) the array functions accept. +fn array_doc() -> String { + r#"{"i":{},"v":2,"a":true,"sv":[{"s":"aa","c":"x","hm":"00"},{"s":"bb","c":"y","hm":"11"}]}"# + .to_string() +} + +#[sqlx::test] +async fn v3_jsonb_path_query_match_and_miss(pool: PgPool) -> anyhow::Result<()> { + let d = array_doc(); + // Matching selector returns exactly one entry row, whose selector is 'aa'. + let hits: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::eql_v3.json::jsonb, 'aa')" + )) + .fetch_one(&pool) + .await?; + assert_eq!(hits, 1, "one entry matches selector 'aa'"); + + let sel: String = sqlx::query_scalar(&format!( + "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_path_query('{d}'::eql_v3.json::jsonb, 'aa') AS e" + )) + .fetch_one(&pool) + .await?; + assert_eq!(sel, "aa", "matched entry carries the queried selector"); + + // Missing selector returns an empty set. + let miss: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::eql_v3.json::jsonb, 'zz')" + )) + .fetch_one(&pool) + .await?; + assert_eq!(miss, 0, "no entry matches a missing selector"); + Ok(()) +} + +#[sqlx::test] +async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { + let d = array_doc(); + let exists: bool = sqlx::query_scalar(&format!( + "SELECT eql_v3.jsonb_path_exists('{d}'::eql_v3.json::jsonb, 'bb')" + )) + .fetch_one(&pool) + .await?; + assert!(exists, "selector 'bb' exists"); + + let missing: bool = sqlx::query_scalar(&format!( + "SELECT eql_v3.jsonb_path_exists('{d}'::eql_v3.json::jsonb, 'zz')" + )) + .fetch_one(&pool) + .await?; + assert!(!missing, "selector 'zz' does not exist"); + + // query_first returns the matching entry (selector 'bb'). + let first_sel: String = sqlx::query_scalar(&format!( + "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::eql_v3.json::jsonb, 'bb'))" + )) + .fetch_one(&pool) + .await?; + assert_eq!(first_sel, "bb"); + + // query_first on a miss returns NULL. + let first_miss: Option = sqlx::query_scalar(&format!( + "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::eql_v3.json::jsonb, 'zz'))" + )) + .fetch_one(&pool) + .await?; + assert!(first_miss.is_none(), "query_first on a miss is NULL"); + Ok(()) +} + +#[sqlx::test] +async fn v3_jsonb_array_length_and_elements(pool: PgPool) -> anyhow::Result<()> { + let d = array_doc(); + let len: i32 = sqlx::query_scalar(&format!( + "SELECT eql_v3.jsonb_array_length('{d}'::eql_v3.json::jsonb)" + )) + .fetch_one(&pool) + .await?; + assert_eq!(len, 2, "array doc has two elements"); + + let n: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM eql_v3.jsonb_array_elements('{d}'::eql_v3.json::jsonb)" + )) + .fetch_one(&pool) + .await?; + assert_eq!(n, 2, "jsonb_array_elements yields one row per element"); + + // jsonb_array_elements returns SETOF eql_v3.ste_vec_entry — the rows are + // valid entries (the entry extractor accepts them). + let sels: Vec = sqlx::query_scalar(&format!( + "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_array_elements('{d}'::eql_v3.json::jsonb) AS e ORDER BY 1" + )) + .fetch_all(&pool) + .await?; + assert_eq!(sels, vec!["aa".to_string(), "bb".to_string()]); + + let texts: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM eql_v3.jsonb_array_elements_text('{d}'::eql_v3.json::jsonb)" + )) + .fetch_one(&pool) + .await?; + assert_eq!(texts, 2, "elements_text yields one ciphertext per element"); + Ok(()) +} + +#[sqlx::test] +async fn v3_jsonb_array_length_non_array_raises(pool: PgPool) -> anyhow::Result<()> { + // A document WITHOUT the `a:true` array flag is not an array. + let not_array = r#"{"i":{},"v":2,"sv":[{"s":"aa","c":"x","hm":"00"}]}"#; + let sql = format!("SELECT eql_v3.jsonb_array_length('{not_array}'::eql_v3.json::jsonb)"); + eql_tests::assert_raises(&pool, &sql, &[], "non-array").await?; + + let sql2 = format!( + "SELECT count(*) FROM eql_v3.jsonb_array_elements('{not_array}'::eql_v3.json::jsonb)" + ); + eql_tests::assert_raises(&pool, &sql2, &[], "non-array").await?; + Ok(()) +} + +// ============================================================================ +// D11 — Index engagement (validity, not preference): enable_seqscan=off + +// node-type-aware assert_index_scan_uses on the 10-row fixture. +// ============================================================================ + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_index_to_ste_vec_query_gin_engages(pool: PgPool) -> anyhow::Result<()> { + let mut tx = pool.begin().await?; + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx) + .await?; + sqlx::query( + "CREATE INDEX v3_jsonb_gin_idx ON fixtures.v3_ste_vec \ + USING gin ((eql_v3.to_ste_vec_query(payload)::jsonb) jsonb_path_ops)", + ) + .execute(&mut *tx) + .await?; + + let root_hm = root_hm_term(&pool).await?; + let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); + let query = + format!("SELECT id FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.ste_vec_query"); + assert_index_scan_uses( + &mut *tx, + &query, + "v3_jsonb_gin_idx", + "to_ste_vec_query GIN must engage for payload @> needle", + ) + .await?; + + // Row floor (W6): the index must actually RETURN rows, not engage over an + // empty leaf. Without this, an index-scan-over-nothing would pass green. + let matched: Vec = sqlx::query_scalar(&query).fetch_all(&mut *tx).await?; + assert!(!matched.is_empty(), "the GIN-engaged query must match rows"); + + tx.rollback().await?; + Ok(()) +} + +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_index_ore_cllw_btree_engages(pool: PgPool) -> anyhow::Result<()> { + let mut tx = pool.begin().await?; + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx) + .await?; + sqlx::query(&format!( + "CREATE INDEX v3_jsonb_btree_idx ON fixtures.v3_ste_vec \ + (eql_v3.ore_cllw(payload -> '{SEL_HELLO_OC}'::text))" + )) + .execute(&mut *tx) + .await?; + + let query = format!( + "SELECT id FROM fixtures.v3_ste_vec ORDER BY eql_v3.ore_cllw(payload -> '{SEL_HELLO_OC}'::text)" + ); + assert_index_scan_uses( + &mut *tx, + &query, + "v3_jsonb_btree_idx", + "ore_cllw default btree opclass must engage for ORDER BY on a per-leaf oc", + ) + .await?; + + // Row floor (W6): the ordered scan must actually return rows, not engage + // over an empty leaf. + let ordered: Vec = sqlx::query_scalar(&query).fetch_all(&mut *tx).await?; + assert!( + !ordered.is_empty(), + "the btree-engaged ORDER BY must return rows" + ); + + tx.rollback().await?; + Ok(()) +} + +// ============================================================================ +// D13 — Operator-integer overload (`-> int`): the array-index form casts +// through native jsonb and is NOT shadowed by the `-> text` selector op. +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_arrow_integer_index_on_array(pool: PgPool) -> anyhow::Result<()> { + let d = array_doc(); + // `-> 0` / `-> 1` index the sv array positionally (native jsonb path), not a + // selector lookup. Selectors come out in array order. + let i0: String = sqlx::query_scalar(&format!( + "SELECT eql_v3.selector('{d}'::eql_v3.json -> 0::integer)" + )) + .fetch_one(&pool) + .await?; + assert_eq!(i0, "aa", "-> 0 must index the first sv element"); + + let i1: String = sqlx::query_scalar(&format!( + "SELECT eql_v3.selector('{d}'::eql_v3.json -> 1::integer)" + )) + .fetch_one(&pool) + .await?; + assert_eq!(i1, "bb", "-> 1 must index the second sv element"); + + let t1: String = sqlx::query_scalar(&format!("SELECT '{d}'::eql_v3.json ->> 1::integer")) + .fetch_one(&pool) + .await?; + assert!( + t1.contains("\"s\": \"bb\""), + "->> 1 must serialize the second sv element, got {t1}" + ); + + // Regression: `-> 'sv'::text` is a SELECTOR lookup (our text operator), NOT + // native key access — there is no element with selector 'sv', so NULL. + let sv_lookup: Option = sqlx::query_scalar(&format!( + "SELECT eql_v3.selector('{d}'::eql_v3.json -> 'sv'::text)" + )) + .fetch_one(&pool) + .await?; + assert!( + sv_lookup.is_none(), + "-> 'sv'::text must be a selector lookup (no match), not native key access" + ); + Ok(()) +} + +#[sqlx::test] +async fn v3_jsonb_ore_cllw_null_bytes_composite_raises(pool: PgPool) -> anyhow::Result<()> { + eql_tests::assert_raises( + &pool, + "SELECT eql_v3.compare_ore_cllw_term( + ROW(NULL)::eql_v3.ore_cllw, + ROW(decode('00', 'hex'))::eql_v3.ore_cllw + )", + &[], + "NULL bytes field", + ) + .await?; + Ok(()) +} + +// ============================================================================ +// D14 — Planner metadata: supported entry operators declare COMMUTATOR/NEGATOR +// so commuted/negated predicates are recognised. Asserted via pg_operator. +// ============================================================================ + +#[sqlx::test] +async fn v3_jsonb_entry_operators_declare_commutator_negator(pool: PgPool) -> anyhow::Result<()> { + // For each entry operator, fetch its declared commutator/negator symbol. + let rows: Vec<(String, Option, Option)> = sqlx::query_as( + r#" + SELECT o.oprname, + com.oprname AS commutator, + neg.oprname AS negator + FROM pg_operator o + LEFT JOIN pg_operator com ON com.oid = o.oprcom + LEFT JOIN pg_operator neg ON neg.oid = o.oprnegate + WHERE o.oprleft = 'eql_v3.ste_vec_entry'::regtype + AND o.oprright = 'eql_v3.ste_vec_entry'::regtype + ORDER BY o.oprname + "#, + ) + .fetch_all(&pool) + .await?; + + // Expected (op, commutator, negator) per operators.sql. + let expected: &[(&str, &str, &str)] = &[ + ("<", ">", ">="), + ("<=", ">=", ">"), + ("<>", "<>", "="), + ("=", "=", "<>"), + (">", "<", "<="), + (">=", "<=", "<"), + ]; + assert_eq!(rows.len(), expected.len(), "six entry comparison operators"); + + for (op, com, neg) in expected { + let found = rows + .iter() + .find(|(name, _, _)| name == op) + .unwrap_or_else(|| panic!("operator {op} missing on ste_vec_entry")); + assert_eq!( + found.1.as_deref(), + Some(*com), + "operator {op} must declare COMMUTATOR {com}" + ); + assert_eq!( + found.2.as_deref(), + Some(*neg), + "operator {op} must declare NEGATOR {neg}" + ); + } + Ok(()) +} + +#[sqlx::test] +async fn v3_jsonb_entry_eq_does_not_declare_hashes_or_merges(pool: PgPool) -> anyhow::Result<()> { + let flags: (bool, bool) = sqlx::query_as( + r#" + SELECT oprcanhash, oprcanmerge + FROM pg_operator + WHERE oprname = '=' + AND oprleft = 'eql_v3.ste_vec_entry'::regtype + AND oprright = 'eql_v3.ste_vec_entry'::regtype + "#, + ) + .fetch_one(&pool) + .await?; + assert_eq!( + flags, + (false, false), + "ste_vec_entry = has no hash/btree opfamily" + ); + Ok(()) +} From 63c066229474e6437f6f0edbd345e6c465e10c06 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 11:43:12 +1000 Subject: [PATCH 154/599] docs(v3): note eql_v3 jsonb surface in CHANGELOG and CLAUDE.md CHANGELOG entry for the eql_v3 encrypted-JSONB SteVec document type (PR #267) and a CLAUDE.md note that tests must run against real generated encrypted data. --- CHANGELOG.md | 1 + CLAUDE.md | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cce69f272..dc5f6d0f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added +- **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see `docs/decisions/2026-06-10-eql-v3-json-type-kind.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_u64_8_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) diff --git a/CLAUDE.md b/CLAUDE.md index 9c9a08ca2..6005f72db 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -103,6 +103,22 @@ Footguns the spec exists to prevent: - SQL test fixtures and helpers in `tests/test_helpers.sql` - Database connection: `localhost:7432` (cipherstash/password) +#### Tests run against real encrypted data (hard requirement) + +EQL is searchable encryption; tests MUST use real ciphertexts/index terms from the actual crypto, +never hand-curated or synthetic blobs. Fixtures are **generated** by encrypting plaintext through +cipherstash-client: `mise run test:sqlx:prep` runs `fixture:generate:all` (the +`generate_all_fixtures` test, `--features fixture-gen`, over `eql-scalars::CATALOG`) → gitignored +`tests/sqlx/fixtures/eql_v2_*.sql`. + +- The SQLx suite **requires** CipherStash creds — ZeroKMS auth (`CS_CLIENT_ACCESS_KEY` + + `CS_WORKSPACE_CRN`) AND a client key (`CS_CLIENT_ID` + `CS_CLIENT_KEY`); see the + `test:sqlx:prep` comment in `mise.toml`. CI has them. This is expected, not a reason to avoid + generated fixtures. +- Do NOT add static/committed fixtures to dodge the creds dependency. The one committed + exception, `tests/sqlx/fixtures/v3_ste_vec.sql`, is a gap pending a SteVec-document generator + (`docs/handoff/2026-06-10-v3-jsonb-fixture-alignment.md`), not a pattern to copy. + ## Project Learning & Retrospectives Valuable lessons and insights from completed work: From 0cf9ec92dbefa832f7babc74d18bd59c34f0057f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 14:04:40 +1000 Subject: [PATCH 155/599] refactor(v3-tests): add access-path seam to scalar matrix (no behaviour change) Introduce ScalarType seam methods (sql_domain, column_expr, placeholder_payload, eq/ord_extractor_expr) with defaults that reproduce today's scalar SQL exactly, thread them through ScalarDomainSpec + fetch_fixture_payload + every reusable matrix leaf case (correctness, cross-shape, supported_null, order_by(+nulls/ +using), count(+distinct), index, aggregate(+group_by)). Verified byte-identical matrix_tests.txt / matrix_tests_eq_only.txt snapshots and all 1106 scalar matrix DB tests pass. Also lands the (inert, not-yet-invoked) jsonb_entry_matrix! macro. --- tests/sqlx/src/matrix.rs | 147 +++++++++++++++++++++++-------- tests/sqlx/src/scalar_domains.rs | 104 +++++++++++++++++++++- 2 files changed, 213 insertions(+), 38 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 427108c36..9f5690923 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -273,6 +273,70 @@ macro_rules! scalar_matrix { }; } +/// Reduced behaviour matrix for a SteVec **entry** view type (e.g. +/// `JsonbEntryInt4`). Runs only the leaf drivers that are surface-agnostic +/// once routed through the access-path seam: correctness (d,d only), +/// supported_null, order_by(+nulls/+using), count, index_engages, and — once +/// `src/v3/jsonb/aggregates.sql` exists — aggregate(+group_by/+parallel). +/// Containment / blockers / payload_check / path-op / native-absent / +/// planner-metadata stay in the hand-written `v3_jsonb_tests` suite — they have +/// no scalar analogue or assert document-specific surface. +/// `ord_routes_through_ob` and scalar `ore_injectivity` are also excluded: they +/// are scalar-term invariants and are not semantically correct for +/// `ste_vec_entry` (entry equality routes through `eq_term`, not ORE). +/// +/// The single `(entry, Ord)` "domain" is variant-independent — `ste_vec_entry` +/// has one domain. Equality reduces through `eql_v3.eq_term`; ordering, index, +/// count-distinct, and aggregates reduce through `eql_v3.ore_cllw` via the +/// `JsonbEntryInt4` extractor overrides. +#[macro_export] +macro_rules! jsonb_entry_matrix { + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal $(,)? + ) => { + $crate::__scalar_matrix_dxop_outer! { + case = __scalar_matrix_correctness_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], + ops_list = [(eq, "="), (neq, "<>"), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + pivots_list = [ + (min, <$scalar as $crate::scalar_domains::OrderedScalar>::min_pivot()), + (max, <$scalar as $crate::scalar_domains::OrderedScalar>::max_pivot()), + (mid, <$scalar as $crate::scalar_domains::OrderedScalar>::mid_pivot()), + ], + } + $crate::__scalar_matrix_dxo_outer! { + case = __scalar_matrix_supported_null_case, + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], + ops_list = [(eq, "="), (neq, "<>"), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + } + $crate::__scalar_matrix_order_by_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], + } + $crate::__scalar_matrix_order_by_nulls_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], + } + $crate::__scalar_matrix_order_by_using_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], ops_list = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + } + $crate::__scalar_matrix_count_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], + } + $crate::__scalar_matrix_index_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + combos = [(entry, Ord, "eql_v3.ore_cllw", "btree", + [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")])], + } + }; +} + /// Low-level entry point. Use `scalar_matrix!` instead unless /// your type's surface deviates from the standard scalar shapes. #[macro_export] @@ -600,8 +664,8 @@ macro_rules! __scalar_matrix_correctness_case { $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot.clone()).await?; let lit = $crate::scalar_domains::sql_string_literal(&payload); let predicate = format!( - "payload::{d} {op} {lit}::jsonb::{d}", - d = &spec.sql_domain, op = $op, + "({col})::{d} {op} {lit}::jsonb::{d}", + col = &spec.column_expr, d = &spec.sql_domain, op = $op, ); let expected = <$scalar as $crate::scalar_domains::ScalarType>::expected_forward($op, pivot); @@ -647,10 +711,11 @@ macro_rules! __scalar_matrix_cross_shape_case { $crate::scalar_domains::commute_op($op), pivot.clone(), ).len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ - ("d_d", format!("payload::{d} {op} {lit}::jsonb::{d}", op = $op), forward_count), - ("d_j", format!("payload::{d} {op} {lit}::jsonb", op = $op), forward_count), - ("j_d", format!("{lit}::jsonb {op} payload::{d}", op = $op), commuted_count), + ("d_d", format!("({col})::{d} {op} {lit}::jsonb::{d}", op = $op), forward_count), + ("d_j", format!("({col})::{d} {op} {lit}::jsonb", op = $op), forward_count), + ("j_d", format!("{lit}::jsonb {op} ({col})::{d}", op = $op), commuted_count), ]; let table = <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); for (shape_label, predicate, expected_count) in shapes { @@ -688,7 +753,7 @@ macro_rules! __scalar_matrix_supported_null_case { pool: sqlx::PgPool, ) -> anyhow::Result<()> { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); - let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = format!( "SELECT $1::jsonb::{d} {op} $2::jsonb::{d}", d = &spec.sql_domain, op = $op, @@ -1668,7 +1733,7 @@ macro_rules! __scalar_matrix_index_case { )).execute(&mut *tx).await?; sqlx::query(&format!( "INSERT INTO {table}(plaintext, value) \ - SELECT plaintext, payload::{d} FROM {fixture}", d = &spec.sql_domain, fixture = fixture_table, + SELECT plaintext, ({col})::{d} FROM {fixture}", col = &spec.column_expr, d = &spec.sql_domain, fixture = fixture_table, )).execute(&mut *tx).await?; sqlx::query(&format!( "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = $extractor, @@ -1802,11 +1867,14 @@ macro_rules! __scalar_matrix_order_by_case { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec.ord_extractor)(&format!("({col})::{d}")); let sql = format!( "SELECT plaintext FROM {fixture}{where_clause} \ -ORDER BY eql_v3.ord_term(payload::{d}) {dir}", +ORDER BY {ord} {dir}", fixture = fixture_table, - d = &spec.sql_domain, dir = $direction, + dir = $direction, ); let actual: Vec<$scalar> = sqlx::query_scalar(&sql).fetch_all(&pool).await?; @@ -1917,7 +1985,7 @@ macro_rules! __scalar_matrix_order_by_nulls_case { // Non-NULL rows: every fixture row, carrying its plaintext. sqlx::query(&format!( "INSERT INTO {table}(plaintext, value) \ -SELECT plaintext, payload::{d} FROM {fixture}", fixture = fixture_table, +SELECT plaintext, ({col})::{d} FROM {fixture}", col = &spec.column_expr, fixture = fixture_table, )).execute(&mut *tx).await?; // NULL-valued rows: NULL plaintext too, so they surface as None // and their position is what the assertion pins. @@ -1926,9 +1994,10 @@ SELECT plaintext, payload::{d} FROM {fixture}", fixture = fixture_table, SELECT NULL::{pg}, NULL::{d} FROM generate_series(1, {n})", n = NULL_ROWS, )).execute(&mut *tx).await?; + let ord = (spec.ord_extractor)("value"); let sql = format!( "SELECT plaintext FROM {table} \ -ORDER BY eql_v3.ord_term(value) {dir} NULLS {nulls}", +ORDER BY {ord} {dir} NULLS {nulls}", dir = $direction, nulls = $nulls, ); let actual: Vec> = @@ -2018,8 +2087,8 @@ macro_rules! __scalar_matrix_order_by_using_case { let fixture_table = <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); let sql = format!( - "SELECT plaintext FROM {fixture} ORDER BY payload::{d} USING {op}", - fixture = fixture_table, d = &spec.sql_domain, op = $op, + "SELECT plaintext FROM {fixture} ORDER BY ({col})::{d} USING {op}", + fixture = fixture_table, col = &spec.column_expr, d = &spec.sql_domain, op = $op, ); let err = sqlx::query_scalar::<_, $scalar>(&sql) .fetch_all(&pool) @@ -2107,6 +2176,7 @@ macro_rules! __scalar_matrix_aggregate_case { use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = <$scalar as ScalarType>::fixture_table_name(); let extremum: $scalar = <$scalar as ScalarType>::fixture_values() .iter() @@ -2116,11 +2186,11 @@ macro_rules! __scalar_matrix_aggregate_case { let extremum_lit = <$scalar as ScalarType>::to_sql_literal(&extremum); let expected: String = sqlx::query_scalar(&format!( - "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = extremum_lit, + "SELECT (({col})::{d})::text FROM {fixture} WHERE plaintext = {lit}", lit = extremum_lit, )).fetch_one(&pool).await?; let actual: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.{agg}(payload::{d})::text FROM {fixture}", + "SELECT eql_v3.{agg}(({col})::{d})::text FROM {fixture}", agg = $agg_fn, )).fetch_one(&pool).await?; @@ -2131,16 +2201,17 @@ macro_rules! __scalar_matrix_aggregate_case { ); // Secondary diagnostic: when the primary identity holds, - // the ORE comparator must agree. The check is reached only + // the ordering comparator must agree. The check is reached only // on success of `assert_eq!`, so it's a self-consistency // assertion on the comparator — catches the regression - // where payload text matches but `ord_term` resolves to a - // different value (e.g. due to payload-key reordering). + // where payload text matches but the ordering term resolves to a + // different value (e.g. due to payload-key reordering). Routed + // through the ord-extractor seam so scalars use `eql_v3.ord_term` + // and SteVec entries use `eql_v3.ore_cllw`. + let lhs_ord = (spec.ord_extractor)(&format!("eql_v3.{}(({col})::{d})", $agg_fn)); + let rhs_ord = (spec.ord_extractor)(&format!("$1::jsonb::{d}")); let ord_terms_match: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.ord_term(eql_v3.{agg}(payload::{d})) \ - = eql_v3.ord_term($1::jsonb::{d}) \ - FROM {fixture}", - agg = $agg_fn, + "SELECT {lhs_ord} = {rhs_ord} FROM {fixture}", )) .bind(&expected) .fetch_one(&pool) @@ -2216,6 +2287,7 @@ macro_rules! __scalar_matrix_aggregate_case { use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = <$scalar as ScalarType>::fixture_table_name(); let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!( @@ -2244,14 +2316,14 @@ macro_rules! __scalar_matrix_aggregate_case { sqlx::query(&format!( "INSERT INTO mixed_null(value) \ SELECT NULL::{d} \ - UNION ALL SELECT payload::{d} FROM {fixture} WHERE plaintext = {low} \ + UNION ALL SELECT ({col})::{d} FROM {fixture} WHERE plaintext = {low} \ UNION ALL SELECT NULL::{d} \ - UNION ALL SELECT payload::{d} FROM {fixture} WHERE plaintext = {high} \ + UNION ALL SELECT ({col})::{d} FROM {fixture} WHERE plaintext = {high} \ UNION ALL SELECT NULL::{d}", low = low_lit, high = high_lit, )).execute(&mut *tx).await?; let expected: String = sqlx::query_scalar(&format!( - "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = expected_lit, + "SELECT (({col})::{d})::text FROM {fixture} WHERE plaintext = {lit}", lit = expected_lit, )).fetch_one(&mut *tx).await?; let actual: Option = sqlx::query_scalar(&format!( @@ -2396,6 +2468,7 @@ macro_rules! __scalar_matrix_aggregate_group_by_case { use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = <$scalar as ScalarType>::fixture_table_name(); let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); anyhow::ensure!( @@ -2427,7 +2500,7 @@ ON COMMIT DROP", let lit = <$scalar as ScalarType>::to_sql_literal(v); sqlx::query(&format!( "INSERT INTO group_test(group_key, value) \ -SELECT 1, payload::{d} FROM {fixture} WHERE plaintext = {lit}", +SELECT 1, ({col})::{d} FROM {fixture} WHERE plaintext = {lit}", )).execute(&mut *tx).await?; } // Insert group 2 rows. @@ -2435,16 +2508,16 @@ SELECT 1, payload::{d} FROM {fixture} WHERE plaintext = {lit}", let lit = <$scalar as ScalarType>::to_sql_literal(v); sqlx::query(&format!( "INSERT INTO group_test(group_key, value) \ -SELECT 2, payload::{d} FROM {fixture} WHERE plaintext = {lit}", +SELECT 2, ({col})::{d} FROM {fixture} WHERE plaintext = {lit}", )).execute(&mut *tx).await?; } // Lookup the expected payload texts for each group's extremum. let g1_expected: String = sqlx::query_scalar(&format!( - "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = g1_lit, + "SELECT (({col})::{d})::text FROM {fixture} WHERE plaintext = {lit}", lit = g1_lit, )).fetch_one(&mut *tx).await?; let g2_expected: String = sqlx::query_scalar(&format!( - "SELECT payload::text FROM {fixture} WHERE plaintext = {lit}", lit = g2_lit, + "SELECT (({col})::{d})::text FROM {fixture} WHERE plaintext = {lit}", lit = g2_lit, )).fetch_one(&mut *tx).await?; let rows: Vec<(i32, String)> = sqlx::query_as(&format!( @@ -2661,7 +2734,8 @@ macro_rules! __scalar_matrix_count_case { "CREATE TEMP TABLE typed_count (value {d}) ON COMMIT DROP", )).execute(&mut *tx).await?; sqlx::query(&format!( - "INSERT INTO typed_count(value) SELECT payload::{d} FROM {fixture}", + "INSERT INTO typed_count(value) SELECT ({col})::{d} FROM {fixture}", + col = &spec.column_expr, )).execute(&mut *tx).await?; let actual: i64 = sqlx::query_scalar( @@ -2690,13 +2764,14 @@ macro_rules! __scalar_matrix_count_case { let expected = <$scalar as ScalarType>::fixture_values().len() as i64; let sql = format!( - "SELECT COUNT(payload::{d}) FROM {fixture}", + "SELECT COUNT(({col})::{d}) FROM {fixture}", + col = &spec.column_expr, ); let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; anyhow::ensure!( actual == expected, - "COUNT(payload::{}) on {}: want {}, got {}; SQL={}", - d, fixture, expected, actual, sql, + "COUNT(({})::{}) on {}: want {}, got {}; SQL={}", + &spec.column_expr, d, fixture, expected, actual, sql, ); Ok(()) } @@ -2730,9 +2805,8 @@ macro_rules! __scalar_matrix_count_distinct_dispatch { use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; - let extractor_fn = spec.extractor_fn() + let extractor = spec.extractor_expr("value") .expect("non-Storage variant must expose an extractor"); - let extractor = format!("{extractor_fn}(value)"); let fixture = <$scalar as ScalarType>::fixture_table_name(); let expected = <$scalar as ScalarType>::fixture_values().len() as i64; @@ -2741,7 +2815,8 @@ macro_rules! __scalar_matrix_count_distinct_dispatch { "CREATE TEMP TABLE distinct_count (value {d}) ON COMMIT DROP", )).execute(&mut *tx).await?; sqlx::query(&format!( - "INSERT INTO distinct_count(value) SELECT payload::{d} FROM {fixture}", + "INSERT INTO distinct_count(value) SELECT ({col})::{d} FROM {fixture}", + col = &spec.column_expr, )).execute(&mut *tx).await?; let sql = format!( diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index b7d168412..f1e810ba5 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -57,6 +57,45 @@ pub trait ScalarType: format!("fixtures.eql_v2_{}", Self::PG_TYPE) } + /// SQL domain the comparable value is cast to. Default: the generated + /// scalar domain `eql_v3.`. A non-scalar surface + /// (e.g. a SteVec entry, whose single domain `eql_v3.ste_vec_entry` is + /// variant-independent) overrides this to ignore the suffix. + fn sql_domain(variant: Variant) -> String { + format!("eql_v3.{}{}", Self::PG_TYPE, variant.suffix()) + } + + /// SQL expression that yields the comparable value from a fixture row. + /// Default: the bare `payload` column (a whole encrypted-scalar payload). + /// A SteVec-entry view overrides this with an extraction expression such + /// as `(payload -> '')`, which already has type + /// `eql_v3.ste_vec_entry`. The expression is cast to `sql_domain(variant)` + /// at every call site, so a redundant `::eql_v3.ste_vec_entry` cast on an + /// already-entry expression is a harmless no-op. + fn column_expr() -> String { + "payload".to_string() + } + + /// A valid payload literal for this SQL domain family. Used by NULL + /// propagation and typecheck tests where the payload is bound but never + /// decrypted. Default: scalar root-envelope placeholder. + fn placeholder_payload() -> &'static str { + crate::helpers::PLACEHOLDER_PAYLOAD + } + + /// Equality extractor expression for a domain-typed value expression. + /// Default scalar Eq path is `eql_v3.eq_term(value)`. + fn eq_extractor_expr(value_expr: &str) -> String { + format!("eql_v3.eq_term({value_expr})") + } + + /// Ordering extractor expression for a domain-typed value expression. + /// Default scalar Ord/OrdOre path is `eql_v3.ord_term(value)`. + /// SteVec entries override this to `eql_v3.ore_cllw(value)`. + fn ord_extractor_expr(value_expr: &str) -> String { + format!("eql_v3.ord_term({value_expr})") + } + /// SQL-literal rendering via `Display`. Takes `&Self` so a non-`Copy` /// scalar (e.g. `String`) can be rendered without being consumed. Override /// for types whose `Display` form isn't a valid SQL literal (e.g. strings, @@ -535,14 +574,23 @@ impl Variant { #[derive(Debug, Clone)] pub struct ScalarDomainSpec { pub sql_domain: String, + /// SQL expression yielding the comparable value (default `"payload"`). + pub column_expr: String, pub variant: Variant, + pub placeholder_payload: &'static str, + pub eq_extractor: fn(&str) -> String, + pub ord_extractor: fn(&str) -> String, } impl ScalarDomainSpec { pub fn new(variant: Variant) -> Self { Self { - sql_domain: format!("eql_v3.{}{}", T::PG_TYPE, variant.suffix()), + sql_domain: T::sql_domain(variant), + column_expr: T::column_expr(), variant, + placeholder_payload: T::placeholder_payload(), + eq_extractor: T::eq_extractor_expr, + ord_extractor: T::ord_extractor_expr, } } @@ -557,6 +605,19 @@ impl ScalarDomainSpec { pub fn extractor_fn(&self) -> Option<&'static str> { self.variant.extractor_fn() } + + /// Extractor expression for the variant's discriminating term applied to + /// `value_expr`. Routes through the per-type `eq_extractor` / `ord_extractor` + /// seams, so scalars produce `eql_v3.eq_term(...)` / `eql_v3.ord_term(...)` + /// and a SteVec-entry view produces `eql_v3.eq_term(...)` / `eql_v3.ore_cllw(...)`. + /// `Storage` has no discriminating term and returns `None`. + pub fn extractor_expr(&self, value_expr: &str) -> Option { + match self.variant { + Variant::Storage => None, + Variant::Eq => Some((self.eq_extractor)(value_expr)), + Variant::Ord | Variant::OrdOre => Some((self.ord_extractor)(value_expr)), + } + } } /// SQL string-literal escaping for direct interpolation. @@ -582,7 +643,8 @@ pub fn commute_op(op: &str) -> &'static str { /// Fetch the payload row keyed by `plaintext` from `T`'s fixture table. pub async fn fetch_fixture_payload(pool: &PgPool, plaintext: T) -> Result { let sql = format!( - "SELECT payload::text FROM {table} WHERE plaintext = {lit}", + "SELECT ({col})::text FROM {table} WHERE plaintext = {lit}", + col = T::column_expr(), table = T::fixture_table_name(), lit = T::to_sql_literal(&plaintext), ); @@ -712,3 +774,41 @@ mod helper_panic_tests { let _ = ::expected_forward("@>", 0); } } + +#[cfg(test)] +mod seam_tests { + use super::*; + + /// The access-path / extractor seam defaults must reproduce today's scalar + /// SQL exactly: bare `payload`, `eql_v3.`, and + /// `eql_v3.ord_term(...)` for the ordered extractor. A view type that + /// overrides these (e.g. `JsonbEntryInt4`) is what makes entry reuse + /// possible — but the defaults are the no-regression contract. + #[test] + fn scalar_defaults_reproduce_today_sql() { + let spec = ScalarDomainSpec::new::(Variant::Ord); + assert_eq!(spec.column_expr, "payload"); + assert_eq!(spec.sql_domain, "eql_v3.int4_ord"); + assert_eq!( + spec.extractor_expr("value"), + Some("eql_v3.ord_term(value)".to_string()), + ); + assert_eq!( + (spec.eq_extractor)("value"), + "eql_v3.eq_term(value)".to_string(), + ); + assert_eq!(spec.placeholder_payload, crate::helpers::PLACEHOLDER_PAYLOAD); + } + + /// The Eq variant routes through the equality extractor; Storage has none. + #[test] + fn scalar_eq_and_storage_extractor_routes() { + let eq = ScalarDomainSpec::new::(Variant::Eq); + assert_eq!(eq.sql_domain, "eql_v3.int4_eq"); + assert_eq!(eq.extractor_expr("value"), Some("eql_v3.eq_term(value)".to_string())); + + let storage = ScalarDomainSpec::new::(Variant::Storage); + assert_eq!(storage.sql_domain, "eql_v3.int4"); + assert_eq!(storage.extractor_expr("value"), None); + } +} From e2ef9368ebbaf458aa799fc58074e458fd505337 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 14:08:51 +1000 Subject: [PATCH 156/599] test(v3): add scalar-shaped SteVec document fixture v3_doc_int4 A SteVec document {"field": } per eql_scalars::INT4_VALUES, with an int4 plaintext oracle, so the scalar matrix's behaviour generators can run against the entry extracted at the $.field oc selector. Adds the run_with_payloads split-payload driver seam (jsonb-document encryption input, int4 oracle column), the generator, generate_all_fixtures wiring, and the gitignore rule for the generated .sql. SELECTOR pins the ORE-CLLW (oc) entry selector. --- .gitignore | 1 + tests/sqlx/src/fixtures/driver.rs | 109 ++++++++++++++++++ tests/sqlx/src/fixtures/mod.rs | 7 ++ tests/sqlx/src/fixtures/v3_doc_int4.rs | 132 ++++++++++++++++++++++ tests/sqlx/tests/generate_all_fixtures.rs | 8 ++ 5 files changed, 257 insertions(+) create mode 100644 tests/sqlx/src/fixtures/v3_doc_int4.rs diff --git a/.gitignore b/.gitignore index a6e7d0613..37af0cf22 100644 --- a/.gitignore +++ b/.gitignore @@ -226,6 +226,7 @@ tests/sqlx/migrations/001_install_eql.sql # never commit — stale fixtures hide bugs) tests/sqlx/fixtures/eql_v2* tests/sqlx/fixtures/v3_ste_vec.sql +tests/sqlx/fixtures/v3_doc_int4.sql # Generated encrypted-domain SQL — regenerated by `tasks/build.sh` from the # eql-scalars::CATALOG via `cargo run -p eql-codegen` on every build. The diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs index 96c0411d7..766b712ec 100644 --- a/tests/sqlx/src/fixtures/driver.rs +++ b/tests/sqlx/src/fixtures/driver.rs @@ -222,6 +222,115 @@ where Ok(()) } + /// Generate `tests/sqlx/fixtures/.sql` from **caller-supplied + /// encrypted payloads** instead of encrypting `self.values()` in-driver. + /// + /// The split-payload seam: encryption input and the plaintext oracle column + /// are different value streams. `self.values()` drives the committed + /// `plaintext` column (the oracle) and the fixture-table schema; `payloads` + /// are the already-encrypted JSONB documents to store in `payload`. Used by + /// the `v3_doc_int4` fixture, whose committed payload is a SteVec document + /// encrypted from `{"field": }` while the oracle column is the bare + /// `int4`. + /// + /// `payloads.len()` must equal `self.values().len()`. Otherwise this mirrors + /// `run()` exactly — same connection-from-env, schema → insert → render → + /// drop-on-error teardown → file-write pipeline — but inserts the supplied + /// payloads rather than calling `cipherstash::encrypt_store(self.values())`. + /// Narrow by design: it exists only for fixtures whose committed payload is + /// encrypted from one value stream while the plaintext oracle is another. + pub async fn run_with_payloads(&self, payloads: Vec) -> Result<()> { + anyhow::ensure!( + payloads.len() == self.values().len(), + "run_with_payloads: {} payloads for {} plaintext values", + payloads.len(), + self.values().len(), + ); + + let config = DriverConfig::from_env()?; + + let mut direct = config + .direct + .clone() + .connect() + .await + .context("connecting to Postgres (direct)")?; + + self.check_complete().context("invalid FixtureSpec")?; + + sqlx::raw_sql(&self.working_schema_sql()) + .execute(&mut direct) + .await + .context("applying working-table schema")?; + + let insert_result = self.insert_payloads(&mut direct, &payloads).await; + let render_result = if insert_result.is_ok() { + sqlx::query(&self.render_rows_sql()) + .fetch_all(&mut direct) + .await + .context("rendering fixture rows") + } else { + Ok(Vec::new()) + }; + + let working = self.working_table(); + let drop_result = sqlx::raw_sql(&format!("DROP TABLE IF EXISTS public.{working};")) + .execute(&mut direct) + .await; + + insert_result?; + let rows = render_result?; + drop_result.context("dropping the working table")?; + + let lines: Vec = rows + .iter() + .map(|r| r.try_get::(0).context("reading rendered INSERT")) + .collect::>()?; + + let _ = direct.close().await; + + let mut script = self.fixture_script_preamble(); + for line in &lines { + script.push_str(line); + script.push('\n'); + } + + let path = fixture_script_path(&self.script_filename()); + std::fs::write(&path, script) + .with_context(|| format!("writing fixture script {}", path.display()))?; + println!("wrote {} ({} rows)", path.display(), self.values().len()); + Ok(()) + } + + /// INSERT the caller-supplied encrypted payloads alongside `self.values()` + /// as the plaintext oracle. The plaintext/payload pairing is positional — + /// `payloads[i]` is the ciphertext for `self.values()[i]` — so the caller + /// MUST keep the two streams index-aligned (the `v3_doc_int4` generator + /// builds both from the same ordered `INT4_VALUES` walk). Unlike + /// `insert_direct`, no `cipherstash::encrypt_store` call happens here. + async fn insert_payloads( + &self, + direct: &mut PgConnection, + payloads: &[serde_json::Value], + ) -> Result<()> { + let working = self.working_table(); + let insert = format!( + "INSERT INTO public.{working} (id, plaintext, {col}) VALUES ($1, $2, $3)", + col = cipherstash::PAYLOAD_COLUMN + ); + for (i, (value, payload)) in self.values().iter().zip(payloads).enumerate() { + let id = (i as i64) + 1; + sqlx::query(&insert) + .bind(id) + .bind(value.clone()) + .bind(sqlx::types::Json(payload.clone())) + .execute(&mut *direct) + .await + .with_context(|| format!("inserting value #{id}"))?; + } + Ok(()) + } + /// **Test seam** for the schema-apply / insert / render / teardown /// pipeline. Production code uses `run()`, which inlines the same /// pipeline on a single connection. This entry point exists so tests diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 503743d9c..098db4f68 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -32,6 +32,13 @@ pub mod driver; // here directly rather than via `scalar_types!`. pub mod v3_ste_vec; +// The scalar-shaped SteVec document fixture — a SteVec document carrying one +// int4 scalar at `$.field` per `eql_scalars::INT4_VALUES`. A SPLIT fixture +// (jsonb-document encryption input, int4 plaintext oracle), so it uses the +// `run_with_payloads` seam rather than `FixtureSpec::run`. Drives the +// jsonb-entry behaviour matrix (`JsonbEntryInt4`). +pub mod v3_doc_int4; + // The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, …) are // generated from the harness list in `scalar_types.rs`. Each expands to // `pub mod eql_v2_ { … scalar_fixture! … }`, reading its plaintext values diff --git a/tests/sqlx/src/fixtures/v3_doc_int4.rs b/tests/sqlx/src/fixtures/v3_doc_int4.rs new file mode 100644 index 000000000..78c227593 --- /dev/null +++ b/tests/sqlx/src/fixtures/v3_doc_int4.rs @@ -0,0 +1,132 @@ +//! The `v3_doc_int4` fixture — a SteVec document carrying one int4 scalar at +//! `$.field`, one row per `eql_scalars::INT4_VALUES`. Lets the scalar matrix's +//! behaviour generators run against the entry extracted at that selector +//! (`payload -> SELECTOR`), reusing the int4 oracle. +//! +//! Unlike the scalar fixtures (`FixtureSpec::run()` encrypts bare ints) +//! and `v3_ste_vec` (`FixtureSpec::run()` makes the +//! `plaintext` column jsonb), this fixture is a SPLIT: the encryption input is a +//! `serde_json::Value` document stream while the committed `plaintext` oracle +//! column is bare `int4`. It therefore encrypts the documents directly via +//! `cipherstash::encrypt_store` and stores them through the +//! `FixtureSpec::run_with_payloads` seam, with a `FixtureSpec` driving the +//! plaintext schema and oracle. +//! +//! Gitignored output: tests/sqlx/fixtures/v3_doc_int4.sql (regenerated by +//! `mise run fixture:generate:all`). + +use anyhow::Result; +use serde_json::Value; + +use super::index_kind::IndexKind; +use super::spec::FixtureSpec; + +/// The committed fixture name → table `fixtures.v3_doc_int4`, script +/// `v3_doc_int4.sql`, SQLx ref `scripts("v3_doc_int4")`. +const NAME: &str = "v3_doc_int4"; + +/// The committed `payload` column type — the `eql_v3.json` document DOMAIN, so +/// the domain CHECK runs when the fixture loads. +const PAYLOAD_TYPE: &str = "eql_v3.json"; + +/// JSON path encrypted in each document. The SteVec selector hash for this +/// path is pinned in `SELECTOR` below. +const FIELD: &str = "field"; + +/// The SteVec selector hash for the `$.field` **ORE-CLLW (`oc`)** entry, +/// constant across every row (same path + index → same selector). SteVec emits +/// two sv entries per ordered field — an `hm` entry (equality only) and an `oc` +/// entry — under distinct selectors. The matrix needs the entry that supports +/// BOTH comparisons: `eql_v3.eq_term` reads `coalesce(hm, oc)` (so it works on +/// the `oc` entry, injective on distinct plaintexts) and `eql_v3.ore_cllw` +/// requires `oc`. The `hm` entry would have no `oc`, breaking ordering. +/// +/// Read from the generated fixture and pinned here so a future selector drift +/// fails loudly: the integration `jsonb_entry` suite extracts the entry at +/// `payload -> SELECTOR` and asserts it is non-NULL and `oc`-carrying for every +/// row, which only holds if this matches the emitted selector. The selector is +/// derived from the workspace keyset + the fixed STE_VEC_PREFIX + the `field` +/// path, so it is stable for a given CipherStash workspace; if it drifts, +/// regenerate the fixture and re-pin from the emitted `"s"`. +pub const SELECTOR: &str = "fce8be759db230351b10a058b7ba50a7"; + +/// Build the plaintext documents: `{"field": }` per int4 fixture value, +/// paired with the bare int4 oracle value. +fn documents() -> Vec<(i32, Value)> { + eql_scalars::INT4_VALUES + .iter() + .map(|&v| (v, serde_json::json!({ FIELD: v }))) + .collect() +} + +/// Generate `tests/sqlx/fixtures/v3_doc_int4.sql`. Splits the two value +/// streams: the `serde_json::Value` documents are encrypted with +/// `IndexKind::SteVec`, while the `int4` plaintexts drive the fixture-table +/// schema and the committed `plaintext` oracle column. `.run()` is NOT used — +/// it would encrypt bare `i32` values instead of `{"field": int}` documents. +pub async fn generate() -> Result<()> { + use super::cipherstash; + use super::eql_plaintext::EqlPlaintext; + + let pairs = documents(); + let plaintexts: Vec = pairs.iter().map(|(v, _)| *v).collect(); + let docs: Vec = pairs.into_iter().map(|(_, doc)| doc).collect(); + + let spec = FixtureSpec::new(NAME) + .with_index(IndexKind::SteVec) + .with_column_type(PAYLOAD_TYPE) + .with_values(&plaintexts); + let working = spec.working_table(); + + let config = cipherstash::column_config_for( + spec.indexes(), + ::CAST, + )?; + let payloads = + cipherstash::encrypt_store(&working, cipherstash::PAYLOAD_COLUMN, &docs, &config).await?; + anyhow::ensure!( + payloads.len() == plaintexts.len(), + "encrypt_store returned {} payloads for {} documents", + payloads.len(), + plaintexts.len(), + ); + + spec.run_with_payloads(payloads).await +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn documents_are_one_per_int4_fixture_value() { + let docs = documents(); + assert_eq!(docs.len(), eql_scalars::INT4_VALUES.len()); + for (v, doc) in &docs { + assert_eq!(doc[FIELD].as_i64(), Some(*v as i64)); + } + } + + /// Every int4 pivot the scalar matrix sweeps (`min`/`max`/`mid`) must be a + /// fixture row, since the entry matrix fetches each pivot's entry payload + /// via `fetch_fixture_payload`. + #[test] + fn fixture_covers_the_scalar_pivots() { + let plaintexts: Vec = documents().into_iter().map(|(v, _)| v).collect(); + for pivot in [i32::MIN, 0, i32::MAX] { + assert!( + plaintexts.contains(&pivot), + "v3_doc_int4 must carry the int4 pivot {pivot}", + ); + } + } + + #[test] + fn selector_is_a_32_hex_string() { + assert_eq!(SELECTOR.len(), 32, "SELECTOR must be a 16-byte hex hash"); + assert!( + SELECTOR.chars().all(|c| c.is_ascii_hexdigit()), + "SELECTOR must be lowercase hex: {SELECTOR}", + ); + } +} diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index 9e6e971a0..40db22166 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -41,5 +41,13 @@ async fn generate_all() -> anyhow::Result<()> { eprintln!("Generating fixture v3_ste_vec (jsonb SteVec document)..."); eql_tests::fixtures::v3_ste_vec::generate().await?; eprintln!("Regenerated v3_ste_vec."); + + // The scalar-shaped SteVec document fixture — one `{"field": }` + // document per `eql_scalars::INT4_VALUES`, with an int4 plaintext oracle — + // drives the jsonb-entry behaviour matrix. Same pipeline, split payload + // (jsonb-document encryption input, int4 oracle column). + eprintln!("Generating fixture v3_doc_int4 (scalar-shaped SteVec document)..."); + eql_tests::fixtures::v3_doc_int4::generate().await?; + eprintln!("Regenerated v3_doc_int4."); Ok(()) } From 1737b8db1f579516a0e46ca159b3d972cb712c5c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 14:09:08 +1000 Subject: [PATCH 157/599] test(v3): add JsonbEntryInt4 view type delegating int4 oracle to entry extraction Newtype over i32 that reuses the int4 plaintext oracle (expected_forward, pivots, fixture_values) but overrides the access path: casts to eql_v3.ste_vec_entry, extracts at v3_doc_int4::SELECTOR, uses eql_v3.eq_term for equality and eql_v3.ore_cllw for ordering, and supplies a valid ste_vec_entry placeholder. This is the object the reduced entry matrix sweeps. --- tests/sqlx/src/jsonb_entry.rs | 180 ++++++++++++++++++++++++++++++++++ tests/sqlx/src/lib.rs | 1 + 2 files changed, 181 insertions(+) create mode 100644 tests/sqlx/src/jsonb_entry.rs diff --git a/tests/sqlx/src/jsonb_entry.rs b/tests/sqlx/src/jsonb_entry.rs new file mode 100644 index 000000000..02ece6dd8 --- /dev/null +++ b/tests/sqlx/src/jsonb_entry.rs @@ -0,0 +1,180 @@ +//! SteVec **entry** view type for the behaviour matrix. A `JsonbEntryInt4` +//! reuses the `i32` plaintext oracle (`expected_forward`, pivots, +//! `fixture_values`) but reaches its comparable value by extracting the entry +//! at `v3_doc_int4::SELECTOR` and casting to `eql_v3.ste_vec_entry`, so the +//! matrix's correctness/ordering/null/order-by/count/index generators run +//! against jsonb-entry comparisons instead of whole-column scalar casts. +//! +//! It is deliberately NOT a `eql_scalars::CATALOG` scalar (it has no generated +//! domain family and must stay out of the scalar matrix inventory). The entry +//! suite invokes it through the reduced `jsonb_entry_matrix!` macro. + +use crate::fixtures::v3_doc_int4; +use crate::scalar_domains::{OrderedScalar, ScalarType, Variant}; + +/// Newtype over `i32`. `Display`/`Ord`/`Default` delegate to the inner value so +/// the inherited `expected_forward` oracle is identical to int4's. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] +pub struct JsonbEntryInt4(pub i32); + +impl std::fmt::Display for JsonbEntryInt4 { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl sqlx::Type for JsonbEntryInt4 { + fn type_info() -> sqlx::postgres::PgTypeInfo { + >::type_info() + } +} + +impl<'r> sqlx::Decode<'r, sqlx::Postgres> for JsonbEntryInt4 { + fn decode(value: sqlx::postgres::PgValueRef<'r>) -> Result { + Ok(JsonbEntryInt4(>::decode( + value, + )?)) + } +} + +/// Fixture values: int4's list, wrapped. Materialised once into a `LazyLock` +/// because the trait returns `&'static [Self]` and `i32`'s const slice cannot +/// be reinterpreted as `&[JsonbEntryInt4]` without an allocation. +static VALUES: std::sync::LazyLock> = std::sync::LazyLock::new(|| { + eql_scalars::INT4_VALUES + .iter() + .copied() + .map(JsonbEntryInt4) + .collect() +}); + +impl ScalarType for JsonbEntryInt4 { + /// Drives `fixture_table_name()`'s default; overridden below, but kept + /// honest (the entry is an int4-shaped document). + const PG_TYPE: &'static str = "int4"; + + fn fixture_values() -> &'static [Self] { + &VALUES + } + + /// The scalar-shaped document fixture, not `fixtures.eql_v2_int4`. + fn fixture_table_name() -> String { + "fixtures.v3_doc_int4".to_string() + } + + /// Single entry domain, variant-independent. + fn sql_domain(_variant: Variant) -> String { + "eql_v3.ste_vec_entry".to_string() + } + + /// Extract the entry at the pinned selector. `->` already yields + /// `eql_v3.ste_vec_entry`; the call sites' `::eql_v3.ste_vec_entry` cast is + /// a no-op. The selector literal is explicitly typed as text so Postgres + /// resolves the `eql_v3.json -> text` operator instead of native jsonb path + /// lookup. Parenthesised by the call sites (`({col})::{d}`). + fn column_expr() -> String { + format!("payload -> '{}'::text", v3_doc_int4::SELECTOR) + } + + fn to_sql_literal(value: &Self) -> String { + value.0.to_string() + } + + /// Valid `eql_v3.ste_vec_entry` literal for tests that only need a non-NULL + /// operand shape (NULL propagation). Must satisfy the domain CHECK: string + /// `s`, string `c`, exactly one of `hm`/`oc`. + fn placeholder_payload() -> &'static str { + r#"{"s":"placeholder","c":"sample","oc":"00"}"# + } + + fn eq_extractor_expr(value_expr: &str) -> String { + format!("eql_v3.eq_term({value_expr})") + } + + fn ord_extractor_expr(value_expr: &str) -> String { + format!("eql_v3.ore_cllw({value_expr})") + } +} + +impl OrderedScalar for JsonbEntryInt4 { + fn min_pivot() -> Self { + JsonbEntryInt4(::min_pivot()) + } + fn max_pivot() -> Self { + JsonbEntryInt4(::max_pivot()) + } + fn mid_pivot() -> Self { + JsonbEntryInt4(::mid_pivot()) + } +} + +// `JsonbEntryInt4` is deliberately NOT `SignedScalar` — the entry suite does +// not run the signed-only sign-boundary test. `expected_forward` is the +// inherited default from `ScalarType` (it works for any `Ord` type), so the +// oracle is automatically int4-identical. + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn delegates_oracle_to_int4() { + // Same forward result set as i32 for a representative op/pivot. + let got = ::expected_forward(">", JsonbEntryInt4(0)); + let want: Vec = ::expected_forward(">", 0) + .into_iter() + .map(JsonbEntryInt4) + .collect(); + assert_eq!(got, want); + } + + #[test] + fn extracts_entry_at_selector() { + assert_eq!( + ::column_expr(), + format!("payload -> '{}'::text", v3_doc_int4::SELECTOR), + ); + assert_eq!( + ::sql_domain(Variant::Ord), + "eql_v3.ste_vec_entry", + ); + assert_eq!( + ::ord_extractor_expr("value"), + "eql_v3.ore_cllw(value)", + ); + assert_eq!( + ::eq_extractor_expr("value"), + "eql_v3.eq_term(value)", + ); + } + + #[test] + fn fixture_values_wrap_int4_values_in_order() { + let got: Vec = ::fixture_values() + .iter() + .map(|e| e.0) + .collect(); + assert_eq!(got, eql_scalars::INT4_VALUES.to_vec()); + } + + #[test] + fn pivots_delegate_to_int4() { + assert_eq!(::min_pivot().0, i32::MIN); + assert_eq!(::max_pivot().0, i32::MAX); + assert_eq!(::mid_pivot().0, 0); + } + + /// The placeholder must satisfy the `eql_v3.ste_vec_entry` CHECK shape: + /// string `s`, string `c`, exactly one of `hm`/`oc`. (SQL-level validity is + /// asserted in the integration `jsonb_entry` suite against the live domain.) + #[test] + fn placeholder_is_a_valid_entry_shape() { + let v: serde_json::Value = + serde_json::from_str(::placeholder_payload()).unwrap(); + assert!(v.get("s").and_then(|x| x.as_str()).is_some()); + assert!(v.get("c").and_then(|x| x.as_str()).is_some()); + let has_hm = v.get("hm").is_some(); + let has_oc = v.get("oc").is_some(); + assert!(has_hm ^ has_oc, "exactly one of hm/oc must be present"); + } +} diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 471960304..71678a176 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -7,6 +7,7 @@ use sqlx::PgPool; pub mod assertions; pub mod fixtures; pub mod helpers; +pub mod jsonb_entry; pub mod matrix; pub mod scalar_domains; #[macro_use] From cd6cdc97094a16cc865bbfcbc3584e78682a29bf Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 14:36:44 +1000 Subject: [PATCH 158/599] test(v3): reuse scalar matrix generators for jsonb SteVec-entry behaviours MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add jsonb_entry_matrix! (a reduced sibling of scalar_matrix!) and instantiate it for JsonbEntryInt4: correctness (d,d), supported_null, order_by(+nulls/+using), count(+distinct), plus hand-written entry-specific fixture-shape, ORE-CLLW injectivity, and index-engagement tests. 42 tests, all passing. Index engagement is hand-written (domain-cast RHS only): the shared index driver also sweeps a bare-jsonb RHS, which is correct for scalars (they have (domain,jsonb) operators) but for entries flattens to native jsonb < jsonb (no ore_cllw, no index) — ste_vec_entry has no (entry,jsonb) operator. Equality is excluded from the index sweep: entry = routes through eq_term, not ore_cllw. Names live under jsonb_entry:: and are pinned by the isolated test:matrix:inventory:jsonb_entry task (NOT the scalar catalog cross-check). --- mise.toml | 25 +++ .../snapshots/matrix_jsonb_entry_tests.txt | 42 +++++ tests/sqlx/src/matrix.rs | 13 +- tests/sqlx/tests/encrypted_domain.rs | 7 + .../tests/encrypted_domain/jsonb_entry.rs | 171 ++++++++++++++++++ 5 files changed, 253 insertions(+), 5 deletions(-) create mode 100644 tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt create mode 100644 tests/sqlx/tests/encrypted_domain/jsonb_entry.rs diff --git a/mise.toml b/mise.toml index cd22fb654..f7ff6bde7 100644 --- a/mise.toml +++ b/mise.toml @@ -266,6 +266,31 @@ fi echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot or its derived eq-only subset; catalog reconciled." """ +[tasks."test:matrix:inventory:jsonb_entry"] +description = "Verify jsonb-entry matrix test-name set against its own snapshot (no scalar catalog cross-check)" +dir = "{{config_root}}/tests/sqlx" +run = """ +#!/usr/bin/env bash +# The jsonb-entry behaviour matrix (jsonb_entry_matrix!) is a SIBLING of the +# scalar matrix inventory, NOT folded into it: JsonbEntryInt4 is deliberately +# not a eql-scalars::CATALOG type, so it has no scalars:::: tests and no +# `eql-codegen list-types` row. Its names live under `jsonb_entry::…` and are +# pinned by this isolated snapshot (no catalog cross-check). No database needed. +set -euo pipefail +test -f snapshots/matrix_jsonb_entry_tests.txt || { echo "snapshots/matrix_jsonb_entry_tests.txt missing — regenerate." >&2; exit 1; } +listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') +printf '%s\\n' "$listing" \ + | grep '^jsonb_entry::.*jsonb_entry_int4' \ + | sed -E 's/_int4_/__/' \ + | LC_ALL=C sort -u > /tmp/matrix-jsonb-entry-current.txt +if ! cmp -s /tmp/matrix-jsonb-entry-current.txt snapshots/matrix_jsonb_entry_tests.txt; then + echo "JSONB-entry matrix test-name set differs from snapshots/matrix_jsonb_entry_tests.txt." >&2 + diff snapshots/matrix_jsonb_entry_tests.txt /tmp/matrix-jsonb-entry-current.txt >&2 || true + exit 1 +fi +echo "JSONB-entry matrix inventory OK." +""" + [tasks."test:v3-jsonb:inventory"] description = "Verify the v3 jsonb SQLx test-name inventory snapshot (no database required)" dir = "{{config_root}}/tests/sqlx" diff --git a/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt new file mode 100644 index 000000000..9108011d1 --- /dev/null +++ b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt @@ -0,0 +1,42 @@ +jsonb_entry::jsonb_entry__fixture_shape +jsonb_entry::jsonb_entry__index_engages +jsonb_entry::jsonb_entry__ore_cllw_injectivity +jsonb_entry::matrix_jsonb_entry__entry_count_distinct_extractor +jsonb_entry::matrix_jsonb_entry__entry_count_path_cast +jsonb_entry::matrix_jsonb_entry__entry_count_typed_column +jsonb_entry::matrix_jsonb_entry__entry_eq_pivot_max_correctness +jsonb_entry::matrix_jsonb_entry__entry_eq_pivot_mid_correctness +jsonb_entry::matrix_jsonb_entry__entry_eq_pivot_min_correctness +jsonb_entry::matrix_jsonb_entry__entry_eq_supported_null +jsonb_entry::matrix_jsonb_entry__entry_gt_pivot_max_correctness +jsonb_entry::matrix_jsonb_entry__entry_gt_pivot_mid_correctness +jsonb_entry::matrix_jsonb_entry__entry_gt_pivot_min_correctness +jsonb_entry::matrix_jsonb_entry__entry_gt_supported_null +jsonb_entry::matrix_jsonb_entry__entry_gte_pivot_max_correctness +jsonb_entry::matrix_jsonb_entry__entry_gte_pivot_mid_correctness +jsonb_entry::matrix_jsonb_entry__entry_gte_pivot_min_correctness +jsonb_entry::matrix_jsonb_entry__entry_gte_supported_null +jsonb_entry::matrix_jsonb_entry__entry_lt_pivot_max_correctness +jsonb_entry::matrix_jsonb_entry__entry_lt_pivot_mid_correctness +jsonb_entry::matrix_jsonb_entry__entry_lt_pivot_min_correctness +jsonb_entry::matrix_jsonb_entry__entry_lt_supported_null +jsonb_entry::matrix_jsonb_entry__entry_lte_pivot_max_correctness +jsonb_entry::matrix_jsonb_entry__entry_lte_pivot_mid_correctness +jsonb_entry::matrix_jsonb_entry__entry_lte_pivot_min_correctness +jsonb_entry::matrix_jsonb_entry__entry_lte_supported_null +jsonb_entry::matrix_jsonb_entry__entry_neq_pivot_max_correctness +jsonb_entry::matrix_jsonb_entry__entry_neq_pivot_mid_correctness +jsonb_entry::matrix_jsonb_entry__entry_neq_pivot_min_correctness +jsonb_entry::matrix_jsonb_entry__entry_neq_supported_null +jsonb_entry::matrix_jsonb_entry__entry_order_by_asc_no_where +jsonb_entry::matrix_jsonb_entry__entry_order_by_asc_nulls_first +jsonb_entry::matrix_jsonb_entry__entry_order_by_asc_nulls_last +jsonb_entry::matrix_jsonb_entry__entry_order_by_asc_with_where +jsonb_entry::matrix_jsonb_entry__entry_order_by_desc_no_where +jsonb_entry::matrix_jsonb_entry__entry_order_by_desc_nulls_first +jsonb_entry::matrix_jsonb_entry__entry_order_by_desc_nulls_last +jsonb_entry::matrix_jsonb_entry__entry_order_by_desc_with_where +jsonb_entry::matrix_jsonb_entry__entry_order_by_using_gt_rejects +jsonb_entry::matrix_jsonb_entry__entry_order_by_using_gte_rejects +jsonb_entry::matrix_jsonb_entry__entry_order_by_using_lt_rejects +jsonb_entry::matrix_jsonb_entry__entry_order_by_using_lte_rejects diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 9f5690923..ed686b796 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -329,11 +329,14 @@ macro_rules! jsonb_entry_matrix { suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", domains = [(entry, Ord)], } - $crate::__scalar_matrix_index_outer! { - suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", - combos = [(entry, Ord, "eql_v3.ore_cllw", "btree", - [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")])], - } + // Index engagement is NOT driven by `__scalar_matrix_index_outer!` for + // entries: that shared driver also sweeps a bare-jsonb RHS + // (`value < ''::jsonb`), which is load-bearing for scalars (they have + // `(domain, jsonb)` cross-type operators) but UNSAFE for entries — + // `ste_vec_entry` has no `(entry, jsonb)` operator, so a bare-jsonb RHS + // flattens to native `jsonb < jsonb` (no ore_cllw, no index) rather than + // the entry operator. The hand-written `jsonb_entry_int4_index_engages` + // test in the suite probes index engagement with the domain-cast RHS only. }; } diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 5c82b5fcb..033d5afde 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -26,3 +26,10 @@ mod text_match; // uniform per-type set) does not see the signed-only delta. #[path = "encrypted_domain/signed.rs"] mod signed; + +// SteVec jsonb-entry behaviour matrix (the reduced `jsonb_entry_matrix!`). +// Deliberately NOT under `scalars::` — `JsonbEntryInt4` is not a catalog scalar, +// so its names live under `jsonb_entry::…` and are pinned by the separate +// `test:matrix:inventory:jsonb_entry` task, not the scalar inventory. +#[path = "encrypted_domain/jsonb_entry.rs"] +mod jsonb_entry; diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs new file mode 100644 index 000000000..22e3e085b --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -0,0 +1,171 @@ +//! Behaviour matrix for SteVec jsonb-entry comparisons, reusing the scalar +//! matrix generators via `jsonb_entry_matrix!`. Covers the positive behaviours +//! (correctness / ordering / NULL / ORDER BY / COUNT / index engagement, plus +//! entry-specific fixture-shape and ORE-CLLW injectivity tests) that the +//! hand-written `v3_jsonb_tests` suite does not. Document-specific behaviours +//! (containment / path query / array ops / the operator-surface guard) remain +//! in `v3_jsonb_tests` / `v3_jsonb_operator_surface_tests`. +//! +//! The view type (`JsonbEntryInt4`) is deliberately NOT a `eql_scalars::CATALOG` +//! scalar, so this suite is hand-written rather than emitted by the +//! `scalar_types!` list — and its test names live under `jsonb_entry::…`, +//! validated by `test:matrix:inventory:jsonb_entry` (NOT the scalar inventory). + +use eql_tests::fixtures::v3_doc_int4::SELECTOR; +use eql_tests::jsonb_entry::JsonbEntryInt4; +use eql_tests::scalar_domains::ScalarType; + +eql_tests::jsonb_entry_matrix! { + suite = jsonb_entry_int4, + scalar = eql_tests::jsonb_entry::JsonbEntryInt4, + eql_type = "v3_doc_int4", +} + +// ---------------------------------------------------------------------------- +// Entry-specific structural invariant. Pins that the pinned SELECTOR extracts a +// real, `oc`-carrying entry from every fixture row — a wrong selector would make +// every matrix comparison vacuous via NULL extraction rather than failing. +// ---------------------------------------------------------------------------- +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] +async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { + let n = ::fixture_values().len() as i64; + + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.v3_doc_int4") + .fetch_one(&pool) + .await?; + anyhow::ensure!( + count == n, + "row count must match fixture_values().len(): want {n}, got {count}", + ); + + // ids sequential from 1 (the split generator inserts in INT4_VALUES order). + let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.v3_doc_int4 ORDER BY id") + .fetch_all(&pool) + .await?; + anyhow::ensure!( + ids == (1..=n).collect::>(), + "ids must be sequential from 1: got {ids:?}", + ); + + // Every row's entry at the selector is non-NULL — guards against a wrong + // SELECTOR silently hollowing out the matrix. + let null_entries: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM fixtures.v3_doc_int4 WHERE (payload -> '{SELECTOR}'::text) IS NULL", + )) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + null_entries == 0, + "{null_entries} rows have a NULL entry at SELECTOR — wrong selector for $.field?", + ); + + // Every extracted entry is a valid ste_vec_entry payload AND carries `oc` + // (the ordered term the matrix's ore_cllw paths require). + let invalid: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM fixtures.v3_doc_int4 \ + WHERE NOT eql_v3.is_valid_ste_vec_entry_payload((payload -> '{SELECTOR}'::text)::jsonb) \ + OR NOT eql_v3.has_ore_cllw((payload -> '{SELECTOR}'::text)::eql_v3.ste_vec_entry)", + )) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + invalid == 0, + "{invalid} rows have an invalid or oc-less entry at SELECTOR", + ); + + // Distinct oc terms == row count (distinct plaintexts → distinct ORE-CLLW + // leaves), so the correctness/ordering oracle has real discrimination. + let distinct_oc: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(DISTINCT ((payload -> '{SELECTOR}'::text)::jsonb ->> 'oc')) \ + FROM fixtures.v3_doc_int4", + )) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + distinct_oc == n, + "{n} distinct plaintexts must yield {n} distinct oc terms; got {distinct_oc}", + ); + + Ok(()) +} + +// ---------------------------------------------------------------------------- +// ORE-CLLW injectivity. Distinct plaintexts must produce distinct ore_cllw +// terms. Compares `eql_v3.ore_cllw(...)` outputs directly — NOT entry `=`, which +// tests `eq_term`, not ORE. +// ---------------------------------------------------------------------------- +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] +async fn jsonb_entry_int4_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow::Result<()> { + let collisions: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) \ + FROM fixtures.v3_doc_int4 a \ + JOIN fixtures.v3_doc_int4 b ON a.id < b.id \ + WHERE a.plaintext <> b.plaintext \ + AND eql_v3.ore_cllw((a.payload -> '{SELECTOR}'::text)::eql_v3.ste_vec_entry) \ + = eql_v3.ore_cllw((b.payload -> '{SELECTOR}'::text)::eql_v3.ste_vec_entry)", + )) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + collisions == 0, + "no two distinct plaintexts may share an ORE-CLLW term ($.field); got {collisions} collisions", + ); + Ok(()) +} + +// ---------------------------------------------------------------------------- +// Index engagement — hand-written (not via the shared `__scalar_matrix_index` +// driver, which sweeps a bare-jsonb RHS that flattens to native `jsonb < jsonb` +// for entries). Builds the ore_cllw functional btree and asserts each ORDERING +// op (which inlines to `ore_cllw(value) ore_cllw(const)`) engages it, using +// the domain-cast RHS (`''::eql_v3.ste_vec_entry`) so the entry operator +// resolves rather than native jsonb. +// +// VALIDITY ONLY: forces `enable_seqscan = off` on the ~17-row fixture, so a +// green assertion proves the index is USABLE, not that the planner would PREFER +// it at scale (mirrors the scalar index-engagement caveat). Equality is +// excluded: entry `=` reduces through `eql_v3.eq_term`, not `ore_cllw`, so the +// ore_cllw btree cannot serve it. +// ---------------------------------------------------------------------------- +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] +async fn jsonb_entry_int4_index_engages(pool: sqlx::PgPool) -> anyhow::Result<()> { + let sel = SELECTOR; + let pivot = ::fixture_values()[0]; + let payload = + eql_tests::scalar_domains::fetch_fixture_payload::(&pool, pivot).await?; + let lit = payload.replace('\'', "''"); + + let mut tx = pool.begin().await?; + sqlx::query("CREATE TEMP TABLE entry_idx (value eql_v3.ste_vec_entry) ON COMMIT DROP") + .execute(&mut *tx) + .await?; + sqlx::query(&format!( + "INSERT INTO entry_idx(value) \ + SELECT (payload -> '{sel}'::text)::eql_v3.ste_vec_entry FROM fixtures.v3_doc_int4", + )) + .execute(&mut *tx) + .await?; + sqlx::query("CREATE INDEX entry_idx_ore ON entry_idx USING btree (eql_v3.ore_cllw(value))") + .execute(&mut *tx) + .await?; + sqlx::query("ANALYZE entry_idx").execute(&mut *tx).await?; + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx) + .await?; + + for op in ["<", "<=", ">", ">="] { + let query = format!( + "SELECT * FROM entry_idx WHERE value {op} '{lit}'::eql_v3.ste_vec_entry", + ); + eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + "entry_idx_ore", + &format!("entry op {op} (domain-cast RHS) must engage the ore_cllw functional btree"), + ) + .await?; + } + + tx.commit().await?; + Ok(()) +} From 49836c669527ff71eed6a4580b0c207140d18390 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 14:53:30 +1000 Subject: [PATCH 159/599] feat(v3): add min/max aggregates on ste_vec_entry; cover via shared matrix eql_v3.min / eql_v3.max over eql_v3.ste_vec_entry: SteVec document entries extracted at a selector aggregate like ordered scalars, ordering through the entry's oc (CLLW ORE) term via eql_v3.ore_cllw. plpgsql STRICT state functions (per the footgun rules), PARALLEL SAFE with combine function. Turn on the aggregate / aggregate_group_by / aggregate_parallel drivers in jsonb_entry_matrix!; 53 entry tests pass. CHANGELOG + snapshot updated. --- CHANGELOG.md | 1 + src/v3/jsonb/aggregates.sql | 86 +++++++++++++++++++ .../snapshots/matrix_jsonb_entry_tests.txt | 11 +++ tests/sqlx/src/matrix.rs | 17 ++++ 4 files changed, 115 insertions(+) create mode 100644 src/v3/jsonb/aggregates.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index dc5f6d0f6..e1938cccc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) +- **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) ### Changed diff --git a/src/v3/jsonb/aggregates.sql b/src/v3/jsonb/aggregates.sql new file mode 100644 index 000000000..0f3d564dd --- /dev/null +++ b/src/v3/jsonb/aggregates.sql @@ -0,0 +1,86 @@ +-- REQUIRE: src/v3/jsonb/types.sql +-- REQUIRE: src/v3/jsonb/functions.sql +-- REQUIRE: src/v3/sem/ore_cllw/operators.sql + +--! @file v3/jsonb/aggregates.sql +--! @brief min / max aggregates over eql_v3.ste_vec_entry. +--! +--! SteVec document entries extracted at a selector (`doc -> 'sel'`) order by +--! their CLLW ORE (`oc`) term, so the extremum is picked by comparing +--! `eql_v3.ore_cllw(entry)` rather than the scalar Block-ORE `ord_term` the +--! generated scalar ord aggregates use. Same STRICT + PARALLEL SAFE shape as the +--! generated scalar `min`/`max` so partial/parallel aggregation is available on +--! large GROUP BY workloads. +--! +--! Per the encrypted-domain footgun rules the state functions are +--! `LANGUAGE plpgsql` with the pinned `search_path` — a `LANGUAGE sql` body would +--! be inlinable and the planner could elide it. + +--! @brief State function for min on eql_v3.ste_vec_entry. +--! +--! Keeps whichever entry has the lesser CLLW ORE term. STRICT, so NULL entries +--! (and entries whose `oc` is absent, yielding a NULL `ore_cllw`) are skipped by +--! the aggregate machinery / fall through to `state`. +--! +--! @param state eql_v3.ste_vec_entry Running extremum. +--! @param value eql_v3.ste_vec_entry Candidate entry. +--! @return eql_v3.ste_vec_entry The lesser of the two by `ore_cllw`. +CREATE FUNCTION eql_v3.ste_vec_entry_min_sfunc( + state eql_v3.ste_vec_entry, + value eql_v3.ste_vec_entry +) +RETURNS eql_v3.ste_vec_entry +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF eql_v3.ore_cllw(value) < eql_v3.ore_cllw(state) THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate over eql_v3.ste_vec_entry. +--! @param input eql_v3.ste_vec_entry +--! @return eql_v3.ste_vec_entry The entry with the smallest CLLW ORE term. +CREATE AGGREGATE eql_v3.min(eql_v3.ste_vec_entry) ( + sfunc = eql_v3.ste_vec_entry_min_sfunc, + stype = eql_v3.ste_vec_entry, + combinefunc = eql_v3.ste_vec_entry_min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.ste_vec_entry. +--! +--! Keeps whichever entry has the greater CLLW ORE term. STRICT, mirroring +--! `ste_vec_entry_min_sfunc`. +--! +--! @param state eql_v3.ste_vec_entry Running extremum. +--! @param value eql_v3.ste_vec_entry Candidate entry. +--! @return eql_v3.ste_vec_entry The greater of the two by `ore_cllw`. +CREATE FUNCTION eql_v3.ste_vec_entry_max_sfunc( + state eql_v3.ste_vec_entry, + value eql_v3.ste_vec_entry +) +RETURNS eql_v3.ste_vec_entry +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF eql_v3.ore_cllw(value) > eql_v3.ore_cllw(state) THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate over eql_v3.ste_vec_entry. +--! @param input eql_v3.ste_vec_entry +--! @return eql_v3.ste_vec_entry The entry with the largest CLLW ORE term. +CREATE AGGREGATE eql_v3.max(eql_v3.ste_vec_entry) ( + sfunc = eql_v3.ste_vec_entry_max_sfunc, + stype = eql_v3.ste_vec_entry, + combinefunc = eql_v3.ste_vec_entry_max_sfunc, + parallel = safe +); diff --git a/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt index 9108011d1..2119d2bc9 100644 --- a/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt +++ b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt @@ -1,6 +1,17 @@ jsonb_entry::jsonb_entry__fixture_shape jsonb_entry::jsonb_entry__index_engages jsonb_entry::jsonb_entry__ore_cllw_injectivity +jsonb_entry::matrix_jsonb_entry__entry_aggregate_group_by_max +jsonb_entry::matrix_jsonb_entry__entry_aggregate_group_by_min +jsonb_entry::matrix_jsonb_entry__entry_aggregate_max +jsonb_entry::matrix_jsonb_entry__entry_aggregate_max_all_null +jsonb_entry::matrix_jsonb_entry__entry_aggregate_max_empty +jsonb_entry::matrix_jsonb_entry__entry_aggregate_max_mixed_null +jsonb_entry::matrix_jsonb_entry__entry_aggregate_min +jsonb_entry::matrix_jsonb_entry__entry_aggregate_min_all_null +jsonb_entry::matrix_jsonb_entry__entry_aggregate_min_empty +jsonb_entry::matrix_jsonb_entry__entry_aggregate_min_mixed_null +jsonb_entry::matrix_jsonb_entry__entry_aggregate_parallel_safe jsonb_entry::matrix_jsonb_entry__entry_count_distinct_extractor jsonb_entry::matrix_jsonb_entry__entry_count_path_cast jsonb_entry::matrix_jsonb_entry__entry_count_typed_column diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index ed686b796..59a933cd5 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -337,6 +337,23 @@ macro_rules! jsonb_entry_matrix { // flattens to native `jsonb < jsonb` (no ore_cllw, no index) rather than // the entry operator. The hand-written `jsonb_entry_int4_index_engages` // test in the suite probes index engagement with the domain-cast RHS only. + + // Aggregates: eql_v3.min/max over ste_vec_entry (src/v3/jsonb/aggregates.sql). + // The aggregate leaf cases compare extrema via the ord-extractor seam + // (eql_v3.ore_cllw for entries), so the entry min/max route through the + // `oc` (CLLW ORE) term exactly like the comparison operators. + $crate::__scalar_matrix_aggregate_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], + } + $crate::__scalar_matrix_aggregate_group_by_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = "../../fixtures", + domains = [(entry, Ord)], + } + $crate::__scalar_matrix_aggregate_parallel_outer! { + suite = $suite, scalar = $scalar, + domains = [(entry, Ord)], + } }; } From 614998001b9a247310895f0d65f46ff6f5d9c6e7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:00:19 +1000 Subject: [PATCH 160/599] style(v3-tests): apply rustfmt to jsonb-entry suite files Whitespace-only rustfmt normalization of the files added across this branch (v3_doc_int4, jsonb_entry view type + suite, scalar_domains seam) so test:lint (cargo fmt --check) passes. No behaviour change. --- tests/sqlx/src/fixtures/v3_doc_int4.rs | 6 ++---- tests/sqlx/src/jsonb_entry.rs | 6 +++--- tests/sqlx/src/scalar_domains.rs | 10 ++++++++-- tests/sqlx/tests/encrypted_domain/jsonb_entry.rs | 5 ++--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/sqlx/src/fixtures/v3_doc_int4.rs b/tests/sqlx/src/fixtures/v3_doc_int4.rs index 78c227593..4002c73f1 100644 --- a/tests/sqlx/src/fixtures/v3_doc_int4.rs +++ b/tests/sqlx/src/fixtures/v3_doc_int4.rs @@ -78,10 +78,8 @@ pub async fn generate() -> Result<()> { .with_values(&plaintexts); let working = spec.working_table(); - let config = cipherstash::column_config_for( - spec.indexes(), - ::CAST, - )?; + let config = + cipherstash::column_config_for(spec.indexes(), ::CAST)?; let payloads = cipherstash::encrypt_store(&working, cipherstash::PAYLOAD_COLUMN, &docs, &config).await?; anyhow::ensure!( diff --git a/tests/sqlx/src/jsonb_entry.rs b/tests/sqlx/src/jsonb_entry.rs index 02ece6dd8..e60299ac8 100644 --- a/tests/sqlx/src/jsonb_entry.rs +++ b/tests/sqlx/src/jsonb_entry.rs @@ -31,9 +31,9 @@ impl sqlx::Type for JsonbEntryInt4 { impl<'r> sqlx::Decode<'r, sqlx::Postgres> for JsonbEntryInt4 { fn decode(value: sqlx::postgres::PgValueRef<'r>) -> Result { - Ok(JsonbEntryInt4(>::decode( - value, - )?)) + Ok(JsonbEntryInt4( + >::decode(value)?, + )) } } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index f1e810ba5..612ceef87 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -797,7 +797,10 @@ mod seam_tests { (spec.eq_extractor)("value"), "eql_v3.eq_term(value)".to_string(), ); - assert_eq!(spec.placeholder_payload, crate::helpers::PLACEHOLDER_PAYLOAD); + assert_eq!( + spec.placeholder_payload, + crate::helpers::PLACEHOLDER_PAYLOAD + ); } /// The Eq variant routes through the equality extractor; Storage has none. @@ -805,7 +808,10 @@ mod seam_tests { fn scalar_eq_and_storage_extractor_routes() { let eq = ScalarDomainSpec::new::(Variant::Eq); assert_eq!(eq.sql_domain, "eql_v3.int4_eq"); - assert_eq!(eq.extractor_expr("value"), Some("eql_v3.eq_term(value)".to_string())); + assert_eq!( + eq.extractor_expr("value"), + Some("eql_v3.eq_term(value)".to_string()) + ); let storage = ScalarDomainSpec::new::(Variant::Storage); assert_eq!(storage.sql_domain, "eql_v3.int4"); diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index 22e3e085b..88f07c875 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -154,9 +154,8 @@ async fn jsonb_entry_int4_index_engages(pool: sqlx::PgPool) -> anyhow::Result<() .await?; for op in ["<", "<=", ">", ">="] { - let query = format!( - "SELECT * FROM entry_idx WHERE value {op} '{lit}'::eql_v3.ste_vec_entry", - ); + let query = + format!("SELECT * FROM entry_idx WHERE value {op} '{lit}'::eql_v3.ste_vec_entry",); eql_tests::matrix::assert_index_scan_uses( &mut *tx, &query, From a70d60f620052582fa91acaa4a00a04f1b852a13 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 18:41:40 +1000 Subject: [PATCH 161/599] fix(v3): address code-review findings on jsonb blockers and v3 build wiring - jsonb blockers shadowing native operators with non-boolean results now return the native type (#> -> jsonb, #>> -> text, - / #- / || -> jsonb) via new typed encrypted_domain_unsupported_jsonb/_text helpers, so a composed expression resolves and the body raises 'operator not supported' rather than failing earlier with a misleading 'operator does not exist' on a boolean intermediate. - CI: run test:matrix:inventory:jsonb_entry (was defined but never invoked, leaving the jsonb-entry matrix snapshot unguarded), and clean before build on all build steps so tests validate freshly generated SQL. - ore_block_u64_8_256 <>: drop meaningless HASHES, use neqsel/neqjoinsel to match the v3 <> peers. - build.sh: track v3 release artifacts in #MISE outputs. - docs: remove self-contradiction on per-type reference SQL files. - tests: fix duplicate T7/T8 labels in sem.rs (-> T9/T10). --- .github/workflows/test-eql.yml | 7 ++- .../adding-a-scalar-encrypted-domain-type.md | 6 +- src/v3/jsonb/blockers.sql | 58 ++++++++++--------- src/v3/scalars/functions.sql | 34 +++++++++++ src/v3/sem/ore_block_u64_8_256/operators.sql | 5 +- tasks/build.sh | 2 +- .../sqlx/tests/encrypted_domain/family/sem.rs | 4 +- 7 files changed, 77 insertions(+), 39 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 14178c254..732a132b6 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -267,7 +267,7 @@ jobs: - name: Clean-DB v3 install smoke (Postgres ${{ matrix.postgres-version }}) run: | - mise run build + mise run clean && mise run build mise run test:clean_install_v3 schema: @@ -376,7 +376,7 @@ jobs: shared-key: sqlx-tests save-if: false - name: Build EQL - run: mise run --force build + run: mise run clean && mise run --force build - name: Assert eql_v3 is self-contained run: mise run test:self_contained_v3 @@ -405,6 +405,7 @@ jobs: - name: Verify the matrix test-name inventory run: | mise run test:matrix:inventory + mise run test:matrix:inventory:jsonb_entry mise run test:v3-jsonb:inventory git add -N tests/sqlx/snapshots git diff --exit-code -- tests/sqlx/snapshots \ @@ -434,7 +435,7 @@ jobs: mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" - name: Build and install EQL run: | - mise run --output prefix --force build + mise run clean && mise run --output prefix --force build cat release/cipherstash-encrypt.sql \ | docker exec -i postgres-${POSTGRES_VERSION} \ psql -v ON_ERROR_STOP=1 \ diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 8e159c476..e530f172c 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -47,7 +47,9 @@ To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): runs the generator first). One run regenerates *every* catalog type; there is no per-type codegen task. The generated `*_{types,functions,operators,aggregates}.sql` are gitignored and never committed. -5. **Snapshot the matrix inventory** — `mise run test:matrix:inventory` (§3). +5. **Snapshot the matrix inventory and commit the reference SQL files** — + `mise run test:matrix:inventory` (§3), and commit the per-type reference SQL + files under `tests/codegen/reference//` (every catalog type must have them — §4). 6. **Verify** — `mise run test:codegen`, the relevant SQLx suites, and the PostgreSQL matrix (§4). @@ -57,8 +59,6 @@ Things you do **not** do: `*_operators.sql` / `*_aggregates.sql` are gitignored; the catalog plus the renderers are the source of truth. Change the catalog and rebuild — never hand-edit generated SQL. -- **Don't add a `tests/codegen/reference//` baseline.** `int4` is the sole - reference (§4). - **Don't edit `mise.toml`, the CI workflow, `pin_search_path.sql`, or `splinter.sh`** for an ordinary type — they recognise the generated surface intrinsically (§5, §6). The exception is a brand-new *term* whose extractor diff --git a/src/v3/jsonb/blockers.sql b/src/v3/jsonb/blockers.sql index 7690040a0..6fe5faaea 100644 --- a/src/v3/jsonb/blockers.sql +++ b/src/v3/jsonb/blockers.sql @@ -15,9 +15,13 @@ --! --! Each blocker is LANGUAGE plpgsql (NEVER STRICT — a STRICT blocker would let --! PostgreSQL skip the body and return NULL on a NULL argument, bypassing the ---! exception) and delegates to the shared eql_v3.encrypted_domain_unsupported_bool ---! helper. The bound operator must resolve before native fallback, so the ---! firewall fires. +--! exception) and delegates to the shared eql_v3.encrypted_domain_unsupported_* +--! helpers. Each blocker's RETURNS type matches the native operator it shadows +--! (#> -> jsonb, #>> -> text, - / #- / || -> jsonb; the rest are boolean) so a +--! composed expression resolves and the body raises 'operator not supported', +--! rather than failing earlier with a misleading 'operator does not exist' on a +--! boolean intermediate. The bound operator must resolve before native fallback, +--! so the firewall fires. --! @brief Blocker: ? (key/element exists). --! @param a eql_v3.json Left operand (encrypted payload). @@ -122,14 +126,14 @@ CREATE OPERATOR @@ ( --! @brief Blocker: #> (path extract, native returns jsonb). --! @param a eql_v3.json Left operand (encrypted payload). --! @param b text[] Native RHS operand. ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return jsonb Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_path_extract(a eql_v3.json, b text[]) -RETURNS boolean +RETURNS jsonb IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '#>'); + RETURN eql_v3.encrypted_domain_unsupported_jsonb('eql_v3.json', '#>'); END; $$ LANGUAGE plpgsql; @@ -142,14 +146,14 @@ CREATE OPERATOR #> ( --! @brief Blocker: #>> (path extract as text). --! @param a eql_v3.json Left operand (encrypted payload). --! @param b text[] Native RHS operand. ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return text Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_path_extract_text(a eql_v3.json, b text[]) -RETURNS boolean +RETURNS text IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '#>>'); + RETURN eql_v3.encrypted_domain_unsupported_text('eql_v3.json', '#>>'); END; $$ LANGUAGE plpgsql; @@ -162,14 +166,14 @@ CREATE OPERATOR #>> ( --! @brief Blocker: - (delete key, text RHS; native returns jsonb). --! @param a eql_v3.json Left operand (encrypted payload). --! @param b text Native RHS operand. ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return jsonb Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_delete_text(a eql_v3.json, b text) -RETURNS boolean +RETURNS jsonb IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '-'); + RETURN eql_v3.encrypted_domain_unsupported_jsonb('eql_v3.json', '-'); END; $$ LANGUAGE plpgsql; @@ -182,14 +186,14 @@ CREATE OPERATOR - ( --! @brief Blocker: - (delete index, integer RHS). --! @param a eql_v3.json Left operand (encrypted payload). --! @param b integer Native RHS operand. ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return jsonb Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_delete_int(a eql_v3.json, b integer) -RETURNS boolean +RETURNS jsonb IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '-'); + RETURN eql_v3.encrypted_domain_unsupported_jsonb('eql_v3.json', '-'); END; $$ LANGUAGE plpgsql; @@ -202,14 +206,14 @@ CREATE OPERATOR - ( --! @brief Blocker: - (delete keys, text[] RHS). --! @param a eql_v3.json Left operand (encrypted payload). --! @param b text[] Native RHS operand. ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return jsonb Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_delete_array(a eql_v3.json, b text[]) -RETURNS boolean +RETURNS jsonb IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '-'); + RETURN eql_v3.encrypted_domain_unsupported_jsonb('eql_v3.json', '-'); END; $$ LANGUAGE plpgsql; @@ -222,14 +226,14 @@ CREATE OPERATOR - ( --! @brief Blocker: #- (delete at path). --! @param a eql_v3.json Left operand (encrypted payload). --! @param b text[] Native RHS operand. ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return jsonb Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_delete_path(a eql_v3.json, b text[]) -RETURNS boolean +RETURNS jsonb IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '#-'); + RETURN eql_v3.encrypted_domain_unsupported_jsonb('eql_v3.json', '#-'); END; $$ LANGUAGE plpgsql; @@ -242,14 +246,14 @@ CREATE OPERATOR #- ( --! @brief Blocker: || (concatenate, encrypted on the left). --! @param a eql_v3.json Left operand (encrypted payload). --! @param b jsonb Native RHS operand. ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return jsonb Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_concat(a eql_v3.json, b jsonb) -RETURNS boolean +RETURNS jsonb IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '||'); + RETURN eql_v3.encrypted_domain_unsupported_jsonb('eql_v3.json', '||'); END; $$ LANGUAGE plpgsql; @@ -262,14 +266,14 @@ CREATE OPERATOR || ( --! @brief Blocker: || (concatenate, encrypted on the right). --! @param a jsonb Native LHS operand. --! @param b eql_v3.json Right operand (encrypted payload). ---! @return boolean Never returns; always raises 'operator not supported'. +--! @return jsonb Never returns; always raises 'operator not supported'. CREATE FUNCTION eql_v3.jsonb_blocked_concat_rhs(a jsonb, b eql_v3.json) -RETURNS boolean +RETURNS jsonb IMMUTABLE PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.json', '||'); + RETURN eql_v3.encrypted_domain_unsupported_jsonb('eql_v3.json', '||'); END; $$ LANGUAGE plpgsql; diff --git a/src/v3/scalars/functions.sql b/src/v3/scalars/functions.sql index 532730239..adc6c83c2 100644 --- a/src/v3/scalars/functions.sql +++ b/src/v3/scalars/functions.sql @@ -24,3 +24,37 @@ BEGIN RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name; END; $$ LANGUAGE plpgsql; + +--! @brief Shared blocker helper returning jsonb. Identical to +--! encrypted_domain_unsupported_bool but typed for blockers shadowing +--! native operators whose result is jsonb (#>, -, #-, ||), so composed +--! expressions resolve and the body raises rather than failing earlier +--! with a misleading 'operator does not exist' on a boolean result. +--! @param type_name Domain type name (eql_v3.*) +--! @param operator_name Operator symbol (#>, -, #-, ||, etc.) +--! @return jsonb (never returns; always raises) +CREATE FUNCTION eql_v3.encrypted_domain_unsupported_jsonb(type_name text, operator_name text) +RETURNS jsonb +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name; +END; +$$ LANGUAGE plpgsql; + +--! @brief Shared blocker helper returning text. Identical to +--! encrypted_domain_unsupported_bool but typed for blockers shadowing +--! the native #>> operator whose result is text. +--! @param type_name Domain type name (eql_v3.*) +--! @param operator_name Operator symbol (#>>) +--! @return text (never returns; always raises) +CREATE FUNCTION eql_v3.encrypted_domain_unsupported_text(type_name text, operator_name text) +RETURNS text +IMMUTABLE PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name; +END; +$$ LANGUAGE plpgsql; diff --git a/src/v3/sem/ore_block_u64_8_256/operators.sql b/src/v3/sem/ore_block_u64_8_256/operators.sql index beca9da86..d2e670b72 100644 --- a/src/v3/sem/ore_block_u64_8_256/operators.sql +++ b/src/v3/sem/ore_block_u64_8_256/operators.sql @@ -130,9 +130,8 @@ CREATE OPERATOR <> ( RIGHTARG=eql_v3.ore_block_u64_8_256, COMMUTATOR = <>, NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, + RESTRICT = neqsel, + JOIN = neqjoinsel, MERGES ); diff --git a/tasks/build.sh b/tasks/build.sh index 98dee8db7..1ee2d0c08 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -2,7 +2,7 @@ #MISE description="Build SQL into single release file" #MISE alias="b" #MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] -#MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql"] +#MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql","release/cipherstash-encrypt-v3.sql","release/cipherstash-encrypt-v3-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" #!/bin/bash diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index da4a748d5..29ce6a26f 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -450,7 +450,7 @@ async fn ore_comparators_are_immutable(pool: PgPool) -> Result<()> { Ok(()) } -/// T7 — Bloom-filter SEM extractor (`eql_v3.bloom_filter(jsonb)`): reads the +/// T9 — Bloom-filter SEM extractor (`eql_v3.bloom_filter(jsonb)`): reads the /// `bf` array out of a payload. Inlinable SQL mirroring `hmac_256` — NULL on a /// missing key, not a raise (the `match` capability is tied to the domain, /// whose CHECK guarantees `bf`). @@ -515,7 +515,7 @@ async fn bloom_filter_extractor_empty_array_is_empty_not_null(pool: PgPool) -> R Ok(()) } -/// T8 — `eql_v3.has_bloom_filter(jsonb)` presence predicate. Mirrors the +/// T10 — `eql_v3.has_bloom_filter(jsonb)` presence predicate. Mirrors the /// `has_hmac_256` / `has_ore_block_u64_8_256` coverage in T5: its two-part guard /// (`val ? 'bf'` AND `val ->> 'bf' IS NOT NULL`) is exercised across present, /// absent, and json-null cases. The `{"bf":null}` → false case pins the From 9b153af9677bb347171521fbb602acda883135c7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 22:32:20 +1000 Subject: [PATCH 162/599] test(v3): guard the pinned jsonb-entry SELECTOR against fixture drift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The entry suite is bound to one CipherStash workspace: a SteVec selector is a keyed MAC over (workspace keyset, STE_VEC_PREFIX, path), so regenerating v3_doc_int4 on a different keyset re-pins the $.field selector. Add jsonb_entry_int4_selector_matches_fixture, which reads the live oc-selector from the loaded fixture and asserts it equals v3_doc_int4::SELECTOR — turning a wrong-workspace regeneration from ~40 confusing NULL-extraction failures into one self-explaining, copy-pasteable re-pin message. Snapshot updated (53 -> 54). --- .../snapshots/matrix_jsonb_entry_tests.txt | 1 + .../tests/encrypted_domain/jsonb_entry.rs | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt index 2119d2bc9..40428b98b 100644 --- a/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt +++ b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt @@ -1,6 +1,7 @@ jsonb_entry::jsonb_entry__fixture_shape jsonb_entry::jsonb_entry__index_engages jsonb_entry::jsonb_entry__ore_cllw_injectivity +jsonb_entry::jsonb_entry__selector_matches_fixture jsonb_entry::matrix_jsonb_entry__entry_aggregate_group_by_max jsonb_entry::matrix_jsonb_entry__entry_aggregate_group_by_min jsonb_entry::matrix_jsonb_entry__entry_aggregate_max diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index 88f07c875..fa548920e 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -89,6 +89,49 @@ async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<() Ok(()) } +// ---------------------------------------------------------------------------- +// Selector drift guard. The whole entry suite is bound to ONE CipherStash +// workspace: a SteVec selector is a keyed MAC over (workspace keyset, +// STE_VEC_PREFIX, path), so regenerating `v3_doc_int4` against a different +// keyset (rotated/changed CS_WORKSPACE_CRN / CS_CLIENT_KEY) re-pins the +// `$.field` selector. This reads the LIVE selector from the loaded fixture and +// asserts it equals the pinned `SELECTOR`, so drift surfaces as one +// self-explaining, copy-pasteable re-pin message instead of ~40 confusing +// NULL-extraction failures across the matrix. Supporting multiple workspaces +// would require runtime selector resolution, which the static +// `ScalarType::column_expr()` seam cannot do — out of scope here. +// ---------------------------------------------------------------------------- +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] +async fn jsonb_entry_int4_selector_matches_fixture(pool: sqlx::PgPool) -> anyhow::Result<()> { + // The `$.field` ORE-CLLW entry is the sv element carrying `oc`. Cast the + // `eql_v3.json` payload to bare jsonb FIRST so `-> 'sv'` is the native array + // accessor, not the custom `eql_v3.json -> text` selector-lookup operator. + let live: Vec = sqlx::query_scalar( + "SELECT DISTINCT elem ->> 's' \ + FROM fixtures.v3_doc_int4, \ + jsonb_array_elements(payload::jsonb -> 'sv') AS elem \ + WHERE elem ? 'oc'", + ) + .fetch_all(&pool) + .await?; + + anyhow::ensure!( + live.len() == 1, + "expected exactly one distinct $.field oc-selector in v3_doc_int4, got {live:?}", + ); + let live = &live[0]; + anyhow::ensure!( + live == SELECTOR, + "v3_doc_int4 $.field oc-selector drifted from the pinned constant.\n \ + pinned v3_doc_int4::SELECTOR = {SELECTOR}\n \ + live fixture selector = {live}\n\ + The SteVec selector is keyed by the CipherStash workspace; if the \ + workspace/keyset changed, re-pin SELECTOR to the live value above and \ + regenerate the matrix_jsonb_entry_tests snapshot.", + ); + Ok(()) +} + // ---------------------------------------------------------------------------- // ORE-CLLW injectivity. Distinct plaintexts must produce distinct ore_cllw // terms. Compares `eql_v3.ore_cllw(...)` outputs directly — NOT entry `=`, which From d497dddad13c0fa2a4d06866e2f2e84396bb989e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 22:51:37 +1000 Subject: [PATCH 163/599] fix(v3): harden ste_vec_entry min/max over oc-less entries; cover blocker/ORE-<> review gaps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #2 (behaviour): eql_v3.min/max on ste_vec_entry now ignore non-orderable (oc-less) entries instead of letting an oc-less STRICT seed pin a wrong extremum. ore_cllw(entry) is NULL without an oc term, so the naive ore_cllw(value) < ore_cllw(state) was NULL whenever the running extremum was oc-less. The sfuncs skip oc-less candidates and replace an oc-less seed, the same way the ore_cllw btree NULL-filters such rows. New test jsonb_entry_int4_aggregate_ignores_oc_less_entries feeds a forged hm-only entry in the SEED position and asserts the correct orderable extremum. #3a (coverage): v3_jsonb_blocker_return_types_match_native pins each jsonb_blocked% function's return type to the native operator it shadows (#> jsonb, #>> text, -/#-/|| jsonb), and v3_jsonb_blocked_composed_expression_raises asserts composed exprs resolve and raise 'is not supported' (not 'operator does not exist') — guarding aa13065's blocker-return-type fix. #3b (coverage): ore_block_comparison_operators_declare_correct_selectivity (T11) pins ore_block_u64_8_256 <> to neqsel/neqjoinsel with no HASHES, and = to eqsel/eqjoinsel/HASHES. Snapshots: matrix_jsonb_entry_tests 54->55, v3_jsonb_tests 72->74. CHANGELOG: note oc-less entries are ignored by entry min/max. --- CHANGELOG.md | 2 +- src/v3/jsonb/aggregates.sql | 47 +++++-- .../snapshots/matrix_jsonb_entry_tests.txt | 1 + tests/sqlx/snapshots/v3_jsonb_tests.txt | 2 + .../sqlx/tests/encrypted_domain/family/sem.rs | 51 ++++++++ .../tests/encrypted_domain/jsonb_entry.rs | 83 ++++++++++++ .../tests/v3_jsonb_operator_surface_tests.rs | 119 ++++++++++++++++++ 7 files changed, 295 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1938cccc..908888fa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) -- **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) +- **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) ### Changed diff --git a/src/v3/jsonb/aggregates.sql b/src/v3/jsonb/aggregates.sql index 0f3d564dd..252d29dd8 100644 --- a/src/v3/jsonb/aggregates.sql +++ b/src/v3/jsonb/aggregates.sql @@ -15,16 +15,27 @@ --! Per the encrypted-domain footgun rules the state functions are --! `LANGUAGE plpgsql` with the pinned `search_path` — a `LANGUAGE sql` body would --! be inlinable and the planner could elide it. +--! +--! @note **Only `oc`-carrying entries are orderable.** `eql_v3.ore_cllw(entry)` +--! returns NULL when an entry has no `oc` (CLLW ORE) term — the same entries a +--! `eql_v3.ore_cllw` btree NULL-filters from range scans. The state functions +--! therefore IGNORE `oc`-less entries (they never become or survive as the +--! extremum), so `min`/`max` is well-defined over a mix of `oc`-carrying and +--! `oc`-less entries and is not corrupted by an `oc`-less seed. A naive +--! `ore_cllw(value) < ore_cllw(state)` would be NULL whenever either side +--! lacks `oc`, pinning a wrong (`oc`-less) extremum when the first aggregated +--! row is `oc`-less. An all-`oc`-less input has no orderable extremum and +--! returns the (arbitrary) STRICT seed. --! @brief State function for min on eql_v3.ste_vec_entry. --! ---! Keeps whichever entry has the lesser CLLW ORE term. STRICT, so NULL entries ---! (and entries whose `oc` is absent, yielding a NULL `ore_cllw`) are skipped by ---! the aggregate machinery / fall through to `state`. +--! Keeps whichever orderable entry has the lesser CLLW ORE term. STRICT, so SQL +--! NULL entries are skipped by the aggregate machinery; `oc`-less (non-orderable) +--! entries are skipped explicitly (see the @note on this file). --! --! @param state eql_v3.ste_vec_entry Running extremum. --! @param value eql_v3.ste_vec_entry Candidate entry. ---! @return eql_v3.ste_vec_entry The lesser of the two by `ore_cllw`. +--! @return eql_v3.ste_vec_entry The lesser orderable entry by `ore_cllw`. CREATE FUNCTION eql_v3.ste_vec_entry_min_sfunc( state eql_v3.ste_vec_entry, value eql_v3.ste_vec_entry @@ -33,8 +44,17 @@ RETURNS eql_v3.ste_vec_entry LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ +DECLARE + value_ore eql_v3.ore_cllw := eql_v3.ore_cllw(value); + state_ore eql_v3.ore_cllw := eql_v3.ore_cllw(state); BEGIN - IF eql_v3.ore_cllw(value) < eql_v3.ore_cllw(state) THEN + -- A non-orderable (oc-less) candidate never replaces the running extremum. + IF value_ore IS NULL THEN + RETURN state; + END IF; + -- Adopt the candidate when the running extremum is itself non-orderable + -- (e.g. an oc-less STRICT seed) or strictly greater. + IF state_ore IS NULL OR value_ore < state_ore THEN RETURN value; END IF; RETURN state; @@ -53,12 +73,12 @@ CREATE AGGREGATE eql_v3.min(eql_v3.ste_vec_entry) ( --! @brief State function for max on eql_v3.ste_vec_entry. --! ---! Keeps whichever entry has the greater CLLW ORE term. STRICT, mirroring ---! `ste_vec_entry_min_sfunc`. +--! Keeps whichever orderable entry has the greater CLLW ORE term. `oc`-less +--! entries are skipped, mirroring `ste_vec_entry_min_sfunc` (see the file @note). --! --! @param state eql_v3.ste_vec_entry Running extremum. --! @param value eql_v3.ste_vec_entry Candidate entry. ---! @return eql_v3.ste_vec_entry The greater of the two by `ore_cllw`. +--! @return eql_v3.ste_vec_entry The greater orderable entry by `ore_cllw`. CREATE FUNCTION eql_v3.ste_vec_entry_max_sfunc( state eql_v3.ste_vec_entry, value eql_v3.ste_vec_entry @@ -67,8 +87,17 @@ RETURNS eql_v3.ste_vec_entry LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ +DECLARE + value_ore eql_v3.ore_cllw := eql_v3.ore_cllw(value); + state_ore eql_v3.ore_cllw := eql_v3.ore_cllw(state); BEGIN - IF eql_v3.ore_cllw(value) > eql_v3.ore_cllw(state) THEN + -- A non-orderable (oc-less) candidate never replaces the running extremum. + IF value_ore IS NULL THEN + RETURN state; + END IF; + -- Adopt the candidate when the running extremum is itself non-orderable + -- (e.g. an oc-less STRICT seed) or strictly lesser. + IF state_ore IS NULL OR value_ore > state_ore THEN RETURN value; END IF; RETURN state; diff --git a/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt index 40428b98b..3b6eb8224 100644 --- a/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt +++ b/tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt @@ -1,3 +1,4 @@ +jsonb_entry::jsonb_entry__aggregate_ignores_oc_less_entries jsonb_entry::jsonb_entry__fixture_shape jsonb_entry::jsonb_entry__index_engages jsonb_entry::jsonb_entry__ore_cllw_injectivity diff --git a/tests/sqlx/snapshots/v3_jsonb_tests.txt b/tests/sqlx/snapshots/v3_jsonb_tests.txt index 0064a7215..42133d883 100644 --- a/tests/sqlx/snapshots/v3_jsonb_tests.txt +++ b/tests/sqlx/snapshots/v3_jsonb_tests.txt @@ -4,6 +4,8 @@ v3_jsonb_arrow_accessors_supported_null v3_jsonb_arrow_integer_index_on_array v3_jsonb_at_at_blocker v3_jsonb_at_question_blocker +v3_jsonb_blocked_composed_expression_raises +v3_jsonb_blocker_return_types_match_native v3_jsonb_concat_blocker v3_jsonb_containment_hm_only v3_jsonb_containment_mixed diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 29ce6a26f..7518f6d26 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -546,3 +546,54 @@ async fn has_bloom_filter_detects_bf_presence(pool: PgPool) -> Result<()> { } Ok(()) } + +/// T11 — Planner-selectivity metadata for the `eql_v3.ore_block_u64_8_256` +/// `=` / `<>` operators. `<>` must use the inequality estimators +/// (`neqsel` / `neqjoinsel`) and must NOT declare `HASHES` — an earlier revision +/// copied `=`'s `eqsel` / `eqjoinsel` + `HASHES` onto `<>`, which is meaningless +/// (you cannot hash-join on inequality) and mis-estimates selectivity (#267 +/// review / aa13065). `=` is the contrast: it keeps `eqsel` / `eqjoinsel` and +/// `HASHES`. A catalog pin (deterministic, no plan dependence). +#[sqlx::test] +async fn ore_block_comparison_operators_declare_correct_selectivity(pool: PgPool) -> Result<()> { + let (eq_rest, eq_join, eq_hashes, eq_merges): (String, String, bool, bool) = sqlx::query_as( + r#" + SELECT o.oprrest::text, o.oprjoin::text, o.oprcanhash, o.oprcanmerge + FROM pg_operator o + WHERE o.oprname = '=' + AND o.oprleft = 'eql_v3.ore_block_u64_8_256'::regtype + AND o.oprright = 'eql_v3.ore_block_u64_8_256'::regtype + "#, + ) + .fetch_one(&pool) + .await?; + assert_eq!(eq_rest, "eqsel", "= must use eqsel"); + assert_eq!(eq_join, "eqjoinsel", "= must use eqjoinsel"); + assert!(eq_hashes, "= must declare HASHES"); + assert!(eq_merges, "= must declare MERGES"); + + let (neq_rest, neq_join, neq_hashes): (String, String, bool) = sqlx::query_as( + r#" + SELECT o.oprrest::text, o.oprjoin::text, o.oprcanhash + FROM pg_operator o + WHERE o.oprname = '<>' + AND o.oprleft = 'eql_v3.ore_block_u64_8_256'::regtype + AND o.oprright = 'eql_v3.ore_block_u64_8_256'::regtype + "#, + ) + .fetch_one(&pool) + .await?; + assert_eq!( + neq_rest, "neqsel", + "<> must use neqsel (not eqsel — it estimates the inequality fraction)" + ); + assert_eq!( + neq_join, "neqjoinsel", + "<> must use neqjoinsel (not eqjoinsel)" + ); + assert!( + !neq_hashes, + "<> must NOT declare HASHES — hash joins are meaningless for inequality" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index fa548920e..1429b0b61 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -211,3 +211,86 @@ async fn jsonb_entry_int4_index_engages(pool: sqlx::PgPool) -> anyhow::Result<() tx.commit().await?; Ok(()) } + +// ---------------------------------------------------------------------------- +// Aggregate robustness over non-orderable (oc-less) entries. `eql_v3.ore_cllw` +// is NULL for an entry without an `oc` term, so a naive `ore_cllw(value) < +// ore_cllw(state)` would be NULL whenever the running extremum is oc-less — +// pinning a wrong result when the FIRST aggregated row (the STRICT seed) is +// oc-less. The min/max sfuncs explicitly skip oc-less entries. This feeds a +// forged hm-only (oc-less) entry in the SEED position alongside real oc-carrying +// entries and asserts the extremum is the correct ORDERABLE entry, never the +// oc-less seed. The whole-suite matrix never exercises this (every v3_doc_int4 +// entry carries oc). +// ---------------------------------------------------------------------------- +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] +async fn jsonb_entry_int4_aggregate_ignores_oc_less_entries( + pool: sqlx::PgPool, +) -> anyhow::Result<()> { + let sel = SELECTOR; + // A valid eql_v3.ste_vec_entry that is NOT orderable: string s, string c, + // exactly one of hm/oc — here `hm`, so `eql_v3.ore_cllw(entry)` is NULL. + let oc_less = r#"{"s":"forged","c":"x","hm":"00"}"#; + + let mut sorted: Vec = ::fixture_values() + .iter() + .map(|e| e.0) + .collect(); + sorted.sort(); + let low = sorted[0]; + let high = *sorted.last().expect("fixture is non-empty"); + + let mut tx = pool.begin().await?; + sqlx::query("CREATE TEMP TABLE oc_mix (value eql_v3.ste_vec_entry) ON COMMIT DROP") + .execute(&mut *tx) + .await?; + // SEED position: the oc-less entry is inserted FIRST, so the STRICT seed is + // non-orderable — the exact case the sfunc guard must survive. + sqlx::query("INSERT INTO oc_mix(value) VALUES ($1::jsonb::eql_v3.ste_vec_entry)") + .bind(oc_less) + .execute(&mut *tx) + .await?; + sqlx::query(&format!( + "INSERT INTO oc_mix(value) \ + SELECT (payload -> '{sel}'::text)::eql_v3.ste_vec_entry \ + FROM fixtures.v3_doc_int4 WHERE plaintext IN ({low}, {high})", + )) + .execute(&mut *tx) + .await?; + + // Expected extrema: the orderable entries for the smallest / largest int4, + // NOT the oc-less seed. + let expect_min: String = sqlx::query_scalar(&format!( + "SELECT ((payload -> '{sel}'::text)::eql_v3.ste_vec_entry)::text \ + FROM fixtures.v3_doc_int4 WHERE plaintext = {low}", + )) + .fetch_one(&mut *tx) + .await?; + let expect_max: String = sqlx::query_scalar(&format!( + "SELECT ((payload -> '{sel}'::text)::eql_v3.ste_vec_entry)::text \ + FROM fixtures.v3_doc_int4 WHERE plaintext = {high}", + )) + .fetch_one(&mut *tx) + .await?; + + let got_min: String = sqlx::query_scalar("SELECT eql_v3.min(value)::text FROM oc_mix") + .fetch_one(&mut *tx) + .await?; + let got_max: String = sqlx::query_scalar("SELECT eql_v3.max(value)::text FROM oc_mix") + .fetch_one(&mut *tx) + .await?; + + anyhow::ensure!( + got_min == expect_min, + "eql_v3.min must ignore the oc-less seed and return the smallest orderable entry;\n \ + want {expect_min}\n got {got_min}", + ); + anyhow::ensure!( + got_max == expect_max, + "eql_v3.max must ignore the oc-less entry and return the largest orderable entry;\n \ + want {expect_max}\n got {got_max}", + ); + + tx.commit().await?; + Ok(()) +} diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs index d6a06addd..810d12a33 100644 --- a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -358,3 +358,122 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> ); Ok(()) } + +// ============================================================================ +// (4) Each blocker's RETURN type matches the native operator it shadows, so a +// COMPOSED expression resolves and the blocker body raises 'is not +// supported' — rather than failing earlier at type resolution with a +// misleading 'operator does not exist' on a boolean intermediate. (#267 +// review / aa13065.) +// ============================================================================ + +/// The non-boolean blocker functions and the native result type they must +/// shadow. Every other `jsonb_blocked%` function returns `boolean`. +const NON_BOOLEAN_BLOCKER_RETURN_TYPES: &[(&str, &str)] = &[ + ("jsonb_blocked_path_extract", "jsonb"), // #> + ("jsonb_blocked_path_extract_text", "text"), // #>> + ("jsonb_blocked_delete_text", "jsonb"), // - (text) + ("jsonb_blocked_delete_int", "jsonb"), // - (integer) + ("jsonb_blocked_delete_array", "jsonb"), // - (text[]) + ("jsonb_blocked_delete_path", "jsonb"), // #- + ("jsonb_blocked_concat", "jsonb"), // || (json on left) + ("jsonb_blocked_concat_rhs", "jsonb"), // || (json on right) +]; + +#[sqlx::test] +async fn v3_jsonb_blocker_return_types_match_native(pool: PgPool) -> anyhow::Result<()> { + // Every eql_v3 jsonb_blocked% function with its declared return type. + let rows: Vec<(String, String)> = sqlx::query_as( + r#" + SELECT p.proname, pg_catalog.format_type(p.prorettype, NULL) + FROM pg_proc p + WHERE p.pronamespace = 'eql_v3'::regnamespace + AND p.proname LIKE 'jsonb_blocked%' + "#, + ) + .fetch_all(&pool) + .await?; + assert!( + !rows.is_empty(), + "expected eql_v3 jsonb_blocked% functions to exist" + ); + + let non_boolean: std::collections::BTreeMap<&str, &str> = + NON_BOOLEAN_BLOCKER_RETURN_TYPES.iter().copied().collect(); + + for (name, rettype) in &rows { + let want = non_boolean.get(name.as_str()).copied().unwrap_or("boolean"); + assert_eq!( + rettype, want, + "blocker {name} must RETURN {want} (the native operator's result type) so composed \ + expressions resolve and the body raises; got {rettype}. A boolean here would make a \ + surrounding operator fail with 'operator does not exist'." + ); + } + + // Cross-check: every name in the expected non-boolean list is actually present + // (guards against a renamed/removed blocker silently dropping the guarantee). + let present: BTreeSet<&str> = rows.iter().map(|(n, _)| n.as_str()).collect(); + let missing: Vec<&str> = NON_BOOLEAN_BLOCKER_RETURN_TYPES + .iter() + .map(|(n, _)| *n) + .filter(|n| !present.contains(n)) + .collect(); + assert!( + missing.is_empty(), + "expected non-boolean blocker(s) absent: {missing:?}" + ); + Ok(()) +} + +/// Assert a COMPOSED expression that wraps a blocked operator fails with the +/// blocker's `is not supported` (proving the composition RESOLVED and the +/// blocker body ran), NOT `operator does not exist` (which is the regression +/// signature of a blocker reverting to a boolean return type). +async fn assert_composed_blocked(pool: &PgPool, sql: &str) -> anyhow::Result<()> { + let err = sqlx::query(sql) + .fetch_optional(pool) + .await + .err() + .ok_or_else(|| anyhow::anyhow!("composed blocked expression must raise: {sql}"))?; + let msg = err.to_string(); + anyhow::ensure!( + msg.contains("is not supported"), + "expected the blocker's 'is not supported' (composition resolved, blocker fired); \ + got: {msg}\n SQL: {sql}", + ); + anyhow::ensure!( + !msg.contains("operator does not exist"), + "composed expression failed at TYPE RESOLUTION ('operator does not exist') — a blocker's \ + RETURN type no longer matches its native operator, so a surrounding operator cannot \ + resolve.\n SQL: {sql}\n err: {msg}", + ); + Ok(()) +} + +#[sqlx::test] +async fn v3_jsonb_blocked_composed_expression_raises(pool: PgPool) -> anyhow::Result<()> { + // A valid eql_v3.json document literal (empty sv array satisfies the CHECK). + let j = r#"'{"i":{},"v":2,"sv":[]}'::eql_v3.json"#; + + // Each case wraps a blocked operator (whose return type was boolean before + // the fix) in a surrounding operator that only resolves against the NATIVE + // result type. With a boolean blocker these fail to type-resolve; with the + // correct return type they resolve and the blocker raises 'is not supported'. + let cases = [ + // #> returns jsonb → wrap with native jsonb @> + format!("SELECT ({j} #> '{{a}}'::text[]) @> '{{}}'::jsonb"), + // #>> returns text → wrap with native text || + format!("SELECT ({j} #>> '{{a}}'::text[]) || 'x'::text"), + // - (text) returns jsonb → wrap with native jsonb @> + format!("SELECT ({j} - 'a'::text) @> '{{}}'::jsonb"), + // #- returns jsonb → wrap with native jsonb @> + format!("SELECT ({j} #- '{{a}}'::text[]) @> '{{}}'::jsonb"), + // || (json on left) returns jsonb → wrap with native jsonb @> + format!("SELECT ({j} || '{{}}'::jsonb) @> '{{}}'::jsonb"), + ]; + for sql in &cases { + assert_composed_blocked(&pool, sql).await?; + } + Ok(()) +} From fdce721cdd9d51586329e3af931d45535a22bbbc Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 21 May 2026 18:02:05 +1000 Subject: [PATCH 164/599] feat: eql-types canonical types crate (prototype) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prototype of a single-source-of-truth crate for EQL payload types: one Rust definition per shape, generating TypeScript (ts-rs) and JSON Schema (schemars). Two tiers — frozen eql_v2_encrypted v2.3 contract, and the capability-encoded eql_v2_int4 variant family. Draft for review; not wired into the build or CI. --- crates/eql-types/.gitignore | 2 + crates/eql-types/Cargo.toml | 11 ++ crates/eql-types/README.md | 48 +++++ crates/eql-types/bindings/EncryptedPayload.ts | 36 ++++ crates/eql-types/bindings/EqlEncrypted.ts | 8 + crates/eql-types/bindings/Identifier.ts | 16 ++ crates/eql-types/bindings/Int4.ts | 19 ++ crates/eql-types/bindings/Int4Eq.ts | 27 +++ crates/eql-types/bindings/Int4Ord.ts | 28 +++ crates/eql-types/bindings/Int4Tagged.ts | 10 + crates/eql-types/bindings/SteVecElement.ts | 18 ++ crates/eql-types/bindings/SteVecPayload.ts | 20 ++ crates/eql-types/bindings/SteVecTerm.ts | 9 + crates/eql-types/schema/EqlEncrypted.json | 182 ++++++++++++++++++ crates/eql-types/schema/Int4Eq.json | 56 ++++++ crates/eql-types/schema/Int4Tagged.json | 125 ++++++++++++ crates/eql-types/src/int4.rs | 125 ++++++++++++ crates/eql-types/src/lib.rs | 47 +++++ crates/eql-types/src/v2_3.rs | 102 ++++++++++ crates/eql-types/tests/conformance.rs | 96 +++++++++ 20 files changed, 985 insertions(+) create mode 100644 crates/eql-types/.gitignore create mode 100644 crates/eql-types/Cargo.toml create mode 100644 crates/eql-types/README.md create mode 100644 crates/eql-types/bindings/EncryptedPayload.ts create mode 100644 crates/eql-types/bindings/EqlEncrypted.ts create mode 100644 crates/eql-types/bindings/Identifier.ts create mode 100644 crates/eql-types/bindings/Int4.ts create mode 100644 crates/eql-types/bindings/Int4Eq.ts create mode 100644 crates/eql-types/bindings/Int4Ord.ts create mode 100644 crates/eql-types/bindings/Int4Tagged.ts create mode 100644 crates/eql-types/bindings/SteVecElement.ts create mode 100644 crates/eql-types/bindings/SteVecPayload.ts create mode 100644 crates/eql-types/bindings/SteVecTerm.ts create mode 100644 crates/eql-types/schema/EqlEncrypted.json create mode 100644 crates/eql-types/schema/Int4Eq.json create mode 100644 crates/eql-types/schema/Int4Tagged.json create mode 100644 crates/eql-types/src/int4.rs create mode 100644 crates/eql-types/src/lib.rs create mode 100644 crates/eql-types/src/v2_3.rs create mode 100644 crates/eql-types/tests/conformance.rs diff --git a/crates/eql-types/.gitignore b/crates/eql-types/.gitignore new file mode 100644 index 000000000..4fffb2f89 --- /dev/null +++ b/crates/eql-types/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml new file mode 100644 index 000000000..deb841da1 --- /dev/null +++ b/crates/eql-types/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "eql-types" +version = "0.1.0" +edition = "2021" +description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" +ts-rs = { version = "10", features = ["serde-json-impl"] } +schemars = "0.8" diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md new file mode 100644 index 000000000..1c18cefef --- /dev/null +++ b/crates/eql-types/README.md @@ -0,0 +1,48 @@ +# eql-types (prototype) + +Canonical wire types for EQL payloads — **one Rust definition per payload +shape**, intended as the single source of truth for: + +- **Rust** — consumed directly by `cipherstash-client` / `protect-ffi` +- **TypeScript** — generated via [`ts-rs`] into [`bindings/`](bindings/) +- **JSON Schema** — generated via [`schemars`] into [`schema/`](schema/) + +> **Status: prototype / draft for discussion.** Not wired into the EQL build +> or CI. See the pull request description for full context. + +## Why + +Type information is lost at every hop of `EQL → cipherstash-client → +protect-ffi → stack`. protect-ffi hand-writes its TypeScript types; they drift +from the Rust they describe; stack widens them further. The result is bugs +like the `protect-dynamodb` search-term check that validates a payload shape +EQL v2.3 never actually defined. A generated, single-source crate removes the +hand-copying. + +## Two tiers + +| Module | Tier | Rule | +|--------|------|------| +| [`src/v2_3.rs`](src/v2_3.rs) | `eql_v2_encrypted` v2.3 wire contract | **FROZEN** — in production; mirrors `eql-payload-v2.3.schema.json`; must not change | +| [`src/int4.rs`](src/int4.rs) | `eql_v2_int4` variant family (#225) | **Design freedom** — capability-encoded types | + +## Capability-encoded types + +`eql_v2_encrypted` is one type with every index term optional, so consumers +must guess at runtime which terms are present. The `int4` family instead has +one type per capability — `Int4` / `Int4Eq` / `Int4Ord` — each carrying its +index terms as **required** fields. The capability is the type identity; +`Option` never appears. + +## Develop + +```sh +cargo test +``` + +Runs the conformance round-trip tests and regenerates `bindings/` (TypeScript) +and `schema/` (JSON Schema). Both directories are checked in so reviewers can +see the codegen output without running anything. + +[`ts-rs`]: https://github.com/Aleph-Alpha/ts-rs +[`schemars`]: https://graham.cool/schemars/ diff --git a/crates/eql-types/bindings/EncryptedPayload.ts b/crates/eql-types/bindings/EncryptedPayload.ts new file mode 100644 index 000000000..3c037f710 --- /dev/null +++ b/crates/eql-types/bindings/EncryptedPayload.ts @@ -0,0 +1,36 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; + +/** + * Scalar storage payload (`k = "ct"`). + * + * FROZEN imperfection: `hm`/`bf`/`ob` are independently optional. A consumer + * cannot tell from the type which terms are present — it must inspect at + * runtime. This is precisely the gap the `protect-dynamodb` bug fell into. + * The fix, for *new* types, is [`crate::int4`]. + */ +export type EncryptedPayload = { +/** + * Schema version — always [`crate::EQL_SCHEMA_VERSION`]. + */ +v: number, +/** + * Table/column identifier. + */ +i: Identifier, +/** + * mp_base85 ciphertext. Required. + */ +c: string, +/** + * HMAC-SHA256 equality term — present iff a `unique` index is configured. + */ +hm?: string, +/** + * Bloom filter term — present iff a `match` index is configured. + */ +bf?: Array, +/** + * Block ORE term — present iff an `ore` index is configured. + */ +ob?: Array, }; diff --git a/crates/eql-types/bindings/EqlEncrypted.ts b/crates/eql-types/bindings/EqlEncrypted.ts new file mode 100644 index 000000000..3e7bd8edd --- /dev/null +++ b/crates/eql-types/bindings/EqlEncrypted.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { EncryptedPayload } from "./EncryptedPayload"; +import type { SteVecPayload } from "./SteVecPayload"; + +/** + * `eql_v2_encrypted` — the EQL v2.3 storage payload. Discriminated on `k`. + */ +export type EqlEncrypted = { "k": "ct" } & EncryptedPayload | { "k": "sv" } & SteVecPayload; diff --git a/crates/eql-types/bindings/Identifier.ts b/crates/eql-types/bindings/Identifier.ts new file mode 100644 index 000000000..5e976dbea --- /dev/null +++ b/crates/eql-types/bindings/Identifier.ts @@ -0,0 +1,16 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Table + column identifier — wire shape `{"t": "...", "c": "..."}`. + * + * Shared by every payload in both tiers. + */ +export type Identifier = { +/** + * Table name. + */ +t: string, +/** + * Column name. + */ +c: string, }; diff --git a/crates/eql-types/bindings/Int4.ts b/crates/eql-types/bindings/Int4.ts new file mode 100644 index 000000000..ffddccf3d --- /dev/null +++ b/crates/eql-types/bindings/Int4.ts @@ -0,0 +1,19 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; + +/** + * `eql_v2_int4` — storage only. Carries `c`; every operator is blocked. + */ +export type Int4 = { +/** + * Schema version. + */ +v: number, +/** + * Table/column identifier. + */ +i: Identifier, +/** + * mp_base85 ciphertext. Required by the domain's CHECK constraint. + */ +c: string, }; diff --git a/crates/eql-types/bindings/Int4Eq.ts b/crates/eql-types/bindings/Int4Eq.ts new file mode 100644 index 000000000..de28becea --- /dev/null +++ b/crates/eql-types/bindings/Int4Eq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; + +/** + * `eql_v2_int4_eq` — HMAC equality (`=`, `<>`). + * + * `hm` is a required field. There is no `Option`: the type *is* the + * equality capability. A payload without `hm` cannot be deserialized into + * this type — the Rust analogue of the SQL domain's CHECK constraint. + */ +export type Int4Eq = { +/** + * Schema version. + */ +v: number, +/** + * Table/column identifier. + */ +i: Identifier, +/** + * mp_base85 ciphertext. Required. + */ +c: string, +/** + * HMAC-SHA256 equality term. Required. + */ +hm: string, }; diff --git a/crates/eql-types/bindings/Int4Ord.ts b/crates/eql-types/bindings/Int4Ord.ts new file mode 100644 index 000000000..c0e15301e --- /dev/null +++ b/crates/eql-types/bindings/Int4Ord.ts @@ -0,0 +1,28 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; + +/** + * `eql_v2_int4_ord` — equality + ORE-block range (`=` `<>` `<` `<=` `>` `>=`). + * + * Deliberately carries no `hm`: ORE over a full-domain `int4` is lossless, so + * the order term `ob` doubles as an exact equality term. + * (`eql_v2_int4_ord_ore` in #225 is the same shape under a scheme-explicit + * name — structurally identical, so it is not a separate Rust type.) + */ +export type Int4Ord = { +/** + * Schema version. + */ +v: number, +/** + * Table/column identifier. + */ +i: Identifier, +/** + * mp_base85 ciphertext. Required. + */ +c: string, +/** + * Block ORE term. Required — serves both range and equality. + */ +ob: Array, }; diff --git a/crates/eql-types/bindings/Int4Tagged.ts b/crates/eql-types/bindings/Int4Tagged.ts new file mode 100644 index 000000000..09a90e430 --- /dev/null +++ b/crates/eql-types/bindings/Int4Tagged.ts @@ -0,0 +1,10 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; + +/** + * **Proposed.** Self-describing int4 payload — `x` is the capability tag. + * + * Generates a clean TypeScript discriminated union (`switch (p.x)` with + * exhaustiveness) and a JSON Schema `oneOf` with a per-branch `const`. + */ +export type Int4Tagged = { "x": "int4", v: number, i: Identifier, c: string, } | { "x": "int4_eq", v: number, i: Identifier, c: string, hm: string, } | { "x": "int4_ord", v: number, i: Identifier, c: string, ob: Array, }; diff --git a/crates/eql-types/bindings/SteVecElement.ts b/crates/eql-types/bindings/SteVecElement.ts new file mode 100644 index 000000000..3446c7a70 --- /dev/null +++ b/crates/eql-types/bindings/SteVecElement.ts @@ -0,0 +1,18 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * One STE-vector element. + */ +export type SteVecElement = { +/** + * Tokenized selector — deterministic per (path, key). + */ +s: string, +/** + * Per-entry mp_base85 ciphertext. Required. + */ +c: string, +/** + * Array marker — true when the selector points at a JSON array context. + */ +a?: boolean, } & ({ hm: string, } | { oc: string, }); diff --git a/crates/eql-types/bindings/SteVecPayload.ts b/crates/eql-types/bindings/SteVecPayload.ts new file mode 100644 index 000000000..eeae7992d --- /dev/null +++ b/crates/eql-types/bindings/SteVecPayload.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { SteVecElement } from "./SteVecElement"; + +/** + * STE-vector storage payload (`k = "sv"`). + */ +export type SteVecPayload = { +/** + * Schema version. + */ +v: number, +/** + * Table/column identifier. + */ +i: Identifier, +/** + * Per-selector encrypted entries; root document ciphertext at `sv[0].c`. + */ +sv: Array, }; diff --git a/crates/eql-types/bindings/SteVecTerm.ts b/crates/eql-types/bindings/SteVecTerm.ts new file mode 100644 index 000000000..fe6778f45 --- /dev/null +++ b/crates/eql-types/bindings/SteVecTerm.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * SteVec element term. FROZEN as **untagged** — this is the v2.3 wire shape. + * + * A consumer must narrow with `'hm' in term`; there is no literal + * discriminant. A *new* type would tag this — see [`crate::int4`]. + */ +export type SteVecTerm = { hm: string, } | { oc: string, }; diff --git a/crates/eql-types/schema/EqlEncrypted.json b/crates/eql-types/schema/EqlEncrypted.json new file mode 100644 index 000000000..8df7b1ad6 --- /dev/null +++ b/crates/eql-types/schema/EqlEncrypted.json @@ -0,0 +1,182 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "EqlEncrypted", + "description": "`eql_v2_encrypted` — the EQL v2.3 storage payload. Discriminated on `k`.", + "oneOf": [ + { + "description": "Scalar ciphertext payload.", + "type": "object", + "required": [ + "c", + "i", + "k", + "v" + ], + "properties": { + "bf": { + "description": "Bloom filter term — present iff a `match` index is configured.", + "type": [ + "array", + "null" + ], + "items": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + } + }, + "c": { + "description": "mp_base85 ciphertext. Required.", + "type": "string" + }, + "hm": { + "description": "HMAC-SHA256 equality term — present iff a `unique` index is configured.", + "type": [ + "string", + "null" + ] + }, + "i": { + "description": "Table/column identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "k": { + "type": "string", + "enum": [ + "ct" + ] + }, + "ob": { + "description": "Block ORE term — present iff an `ore` index is configured.", + "type": [ + "array", + "null" + ], + "items": { + "type": "string" + } + }, + "v": { + "description": "Schema version — always [`crate::EQL_SCHEMA_VERSION`].", + "type": "integer", + "format": "uint16", + "minimum": 0.0 + } + } + }, + { + "description": "STE-vector payload (jsonb / structured values).", + "type": "object", + "required": [ + "i", + "k", + "sv", + "v" + ], + "properties": { + "i": { + "description": "Table/column identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "k": { + "type": "string", + "enum": [ + "sv" + ] + }, + "sv": { + "description": "Per-selector encrypted entries; root document ciphertext at `sv[0].c`.", + "type": "array", + "items": { + "$ref": "#/definitions/SteVecElement" + } + }, + "v": { + "description": "Schema version.", + "type": "integer", + "format": "uint16", + "minimum": 0.0 + } + } + } + ], + "definitions": { + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "type": "object", + "required": [ + "c", + "t" + ], + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + } + }, + "SteVecElement": { + "description": "One STE-vector element.", + "type": "object", + "anyOf": [ + { + "description": "HMAC term — boolean leaves, and array / object root placeholders.", + "type": "object", + "required": [ + "hm" + ], + "properties": { + "hm": { + "type": "string" + } + } + }, + { + "description": "CLLW ORE term — string / number leaves.", + "type": "object", + "required": [ + "oc" + ], + "properties": { + "oc": { + "type": "string" + } + } + } + ], + "required": [ + "c", + "s" + ], + "properties": { + "a": { + "description": "Array marker — true when the selector points at a JSON array context.", + "type": [ + "boolean", + "null" + ] + }, + "c": { + "description": "Per-entry mp_base85 ciphertext. Required.", + "type": "string" + }, + "s": { + "description": "Tokenized selector — deterministic per (path, key).", + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/crates/eql-types/schema/Int4Eq.json b/crates/eql-types/schema/Int4Eq.json new file mode 100644 index 000000000..9bde81c00 --- /dev/null +++ b/crates/eql-types/schema/Int4Eq.json @@ -0,0 +1,56 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Int4Eq", + "description": "`eql_v2_int4_eq` — HMAC equality (`=`, `<>`).\n\n`hm` is a required field. There is no `Option`: the type *is* the equality capability. A payload without `hm` cannot be deserialized into this type — the Rust analogue of the SQL domain's CHECK constraint.", + "type": "object", + "required": [ + "c", + "hm", + "i", + "v" + ], + "properties": { + "c": { + "description": "mp_base85 ciphertext. Required.", + "type": "string" + }, + "hm": { + "description": "HMAC-SHA256 equality term. Required.", + "type": "string" + }, + "i": { + "description": "Table/column identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "v": { + "description": "Schema version.", + "type": "integer", + "format": "uint16", + "minimum": 0.0 + } + }, + "definitions": { + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "type": "object", + "required": [ + "c", + "t" + ], + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/crates/eql-types/schema/Int4Tagged.json b/crates/eql-types/schema/Int4Tagged.json new file mode 100644 index 000000000..86c54cd7a --- /dev/null +++ b/crates/eql-types/schema/Int4Tagged.json @@ -0,0 +1,125 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Int4Tagged", + "description": "**Proposed.** Self-describing int4 payload — `x` is the capability tag.\n\nGenerates a clean TypeScript discriminated union (`switch (p.x)` with exhaustiveness) and a JSON Schema `oneOf` with a per-branch `const`.", + "oneOf": [ + { + "description": "`x: \"int4\"` — storage only.", + "type": "object", + "required": [ + "c", + "i", + "v", + "x" + ], + "properties": { + "c": { + "type": "string" + }, + "i": { + "$ref": "#/definitions/Identifier" + }, + "v": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "x": { + "type": "string", + "enum": [ + "int4" + ] + } + } + }, + { + "description": "`x: \"int4_eq\"` — HMAC equality.", + "type": "object", + "required": [ + "c", + "hm", + "i", + "v", + "x" + ], + "properties": { + "c": { + "type": "string" + }, + "hm": { + "type": "string" + }, + "i": { + "$ref": "#/definitions/Identifier" + }, + "v": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "x": { + "type": "string", + "enum": [ + "int4_eq" + ] + } + } + }, + { + "description": "`x: \"int4_ord\"` — equality + ORE-block range.", + "type": "object", + "required": [ + "c", + "i", + "ob", + "v", + "x" + ], + "properties": { + "c": { + "type": "string" + }, + "i": { + "$ref": "#/definitions/Identifier" + }, + "ob": { + "type": "array", + "items": { + "type": "string" + } + }, + "v": { + "type": "integer", + "format": "uint16", + "minimum": 0.0 + }, + "x": { + "type": "string", + "enum": [ + "int4_ord" + ] + } + } + } + ], + "definitions": { + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "type": "object", + "required": [ + "c", + "t" + ], + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/crates/eql-types/src/int4.rs b/crates/eql-types/src/int4.rs new file mode 100644 index 000000000..ab1f0fd58 --- /dev/null +++ b/crates/eql-types/src/int4.rs @@ -0,0 +1,125 @@ +//! # `eql_v2_int4` variant family — NEW (targets EQL 2.4) +//! +//! Where [`crate::v2_3`] is frozen, this module has design freedom. It mirrors +//! the SQL domain family from `encrypt-query-language#225`. +//! +//! ## The idea: capability-encoded types +//! +//! `eql_v2_encrypted` is one mega-type with every index term optional — so a +//! consumer must runtime-check "do I have an `hm`?". The int4 family instead +//! splits storage into one type per **capability**: +//! +//! | Rust type | SQL domain | Required keys | Operators | +//! |-------------|---------------------|---------------|----------------------------| +//! | [`Int4`] | `eql_v2_int4` | `c` | none (storage only) | +//! | [`Int4Eq`] | `eql_v2_int4_eq` | `c`, `hm` | `=` `<>` | +//! | [`Int4Ord`] | `eql_v2_int4_ord` | `c`, `ob` | `=` `<>` `<` `<=` `>` `>=` | +//! +//! The capability is the **type identity**. There are no optional index-term +//! fields: hold an [`Int4Eq`] and `hm` is present — guaranteed by the Rust +//! type, and (on the SQL side) by the domain's `CHECK` constraint. The runtime +//! guard the `protect-dynamodb` bug reached for becomes impossible to need. +//! +//! `Option` does not appear in this module. + +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +/// `eql_v2_int4` — storage only. Carries `c`; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +pub struct Int4 { + /// Schema version. + pub v: u16, + /// Table/column identifier. + pub i: Identifier, + /// mp_base85 ciphertext. Required by the domain's CHECK constraint. + pub c: String, +} + +/// `eql_v2_int4_eq` — HMAC equality (`=`, `<>`). +/// +/// `hm` is a required field. There is no `Option`: the type *is* the +/// equality capability. A payload without `hm` cannot be deserialized into +/// this type — the Rust analogue of the SQL domain's CHECK constraint. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +pub struct Int4Eq { + /// Schema version. + pub v: u16, + /// Table/column identifier. + pub i: Identifier, + /// mp_base85 ciphertext. Required. + pub c: String, + /// HMAC-SHA256 equality term. Required. + pub hm: String, +} + +/// `eql_v2_int4_ord` — equality + ORE-block range (`=` `<>` `<` `<=` `>` `>=`). +/// +/// Deliberately carries no `hm`: ORE over a full-domain `int4` is lossless, so +/// the order term `ob` doubles as an exact equality term. +/// (`eql_v2_int4_ord_ore` in #225 is the same shape under a scheme-explicit +/// name — structurally identical, so it is not a separate Rust type.) +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +pub struct Int4Ord { + /// Schema version. + pub v: u16, + /// Table/column identifier. + pub i: Identifier, + /// mp_base85 ciphertext. Required. + pub c: String, + /// Block ORE term. Required — serves both range and equality. + pub ob: Vec, +} + +// =========================================================================== +// PROPOSAL (beyond #225) — a self-describing wire discriminator +// =========================================================================== +// +// On the wire, an int4 payload is discriminated only by *which key is present* +// (`hm` vs `ob`). The SQL domain name carries the rest — but once the JSON +// leaves SQL (into protect-ffi, into TypeScript, into a log line) that +// information is gone and a consumer is back to sniffing keys: the same +// untagged failure mode that produced the original protect-dynamodb bug. +// +// While the int4 family is still pre-release, a one-field capability tag `x` +// makes every payload self-describing and gives Rust / TS / SQL a single +// literal discriminant. This is the tagged-union lesson applied to a type we +// are still free to change. + +/// **Proposed.** Self-describing int4 payload — `x` is the capability tag. +/// +/// Generates a clean TypeScript discriminated union (`switch (p.x)` with +/// exhaustiveness) and a JSON Schema `oneOf` with a per-branch `const`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "x")] +pub enum Int4Tagged { + /// `x: "int4"` — storage only. + #[serde(rename = "int4")] + Storage { + v: u16, + i: Identifier, + c: String, + }, + /// `x: "int4_eq"` — HMAC equality. + #[serde(rename = "int4_eq")] + Eq { + v: u16, + i: Identifier, + c: String, + hm: String, + }, + /// `x: "int4_ord"` — equality + ORE-block range. + #[serde(rename = "int4_ord")] + Ord { + v: u16, + i: Identifier, + c: String, + ob: Vec, + }, +} diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs new file mode 100644 index 000000000..5382ebfbe --- /dev/null +++ b/crates/eql-types/src/lib.rs @@ -0,0 +1,47 @@ +//! # eql-types — canonical EQL payload types (prototype) +//! +//! One Rust definition per EQL payload shape — the single source of truth for: +//! +//! - **Rust** — consumed directly by `cipherstash-client` / `protect-ffi` +//! - **TypeScript** — generated via `ts-rs` (run `cargo test`, see `bindings/`) +//! - **JSON Schema** — generated via `schemars` (run `cargo test`, see `schema/`) +//! +//! ## Two tiers +//! +//! - [`v2_3`] — **FROZEN.** The `eql_v2_encrypted` wire contract, in production +//! use by customers. Mirrors `eql-payload-v2.3.schema.json`, imperfections +//! included. Nothing here may change. +//! - [`int4`] — **NEW** (targets EQL 2.4). Design freedom. Demonstrates +//! *capability-encoded types* — the pattern that removes the runtime +//! index-term guessing `eql_v2_encrypted` forces onto every consumer. +//! +//! ## Codegen rules (learned from the ts-rs spike) +//! +//! 1. **Field names ARE wire names** — no `#[serde(rename)]` on fields. ts-rs +//! silently drops a `rename` that is bundled into an attribute it can't +//! parse (`skip_serializing_if`); having no rename removes the footgun. +//! 2. Every `Option` field carries `#[ts(optional)]`, so it generates +//! `field?: T` rather than a required `field: T | null`. +//! 3. `serde`, `ts-rs`, and `schemars` derives travel together on every type. + +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +pub mod int4; +pub mod v2_3; + +/// EQL wire-format version. Hard-coded to `2` for every v2.x payload. +pub const EQL_SCHEMA_VERSION: u16 = 2; + +/// Table + column identifier — wire shape `{"t": "...", "c": "..."}`. +/// +/// Shared by every payload in both tiers. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +pub struct Identifier { + /// Table name. + pub t: String, + /// Column name. + pub c: String, +} diff --git a/crates/eql-types/src/v2_3.rs b/crates/eql-types/src/v2_3.rs new file mode 100644 index 000000000..6c7957f71 --- /dev/null +++ b/crates/eql-types/src/v2_3.rs @@ -0,0 +1,102 @@ +//! # EQL v2.3 wire types — FROZEN +//! +//! `eql_v2_encrypted` is in production use by customers. The shapes here are +//! the v2.3 wire contract and MUST NOT change — not field names, not +//! optionality, not enum tagging. They mirror `eql-payload-v2.3.schema.json` +//! exactly, including its imperfections: +//! +//! - [`EncryptedPayload`] carries `hm`/`bf`/`ob` as independent optionals +//! ("any subset" — a column with several indexes carries several terms). +//! - [`SteVecTerm`] is an **untagged** enum — a consumer must sniff keys. +//! +//! New design work goes in sibling modules (see [`crate::int4`]), never here. + +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +/// `eql_v2_encrypted` — the EQL v2.3 storage payload. Discriminated on `k`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +#[serde(tag = "k")] +pub enum EqlEncrypted { + /// Scalar ciphertext payload. + #[serde(rename = "ct")] + Ct(EncryptedPayload), + /// STE-vector payload (jsonb / structured values). + #[serde(rename = "sv")] + Sv(SteVecPayload), +} + +/// Scalar storage payload (`k = "ct"`). +/// +/// FROZEN imperfection: `hm`/`bf`/`ob` are independently optional. A consumer +/// cannot tell from the type which terms are present — it must inspect at +/// runtime. This is precisely the gap the `protect-dynamodb` bug fell into. +/// The fix, for *new* types, is [`crate::int4`]. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +pub struct EncryptedPayload { + /// Schema version — always [`crate::EQL_SCHEMA_VERSION`]. + pub v: u16, + /// Table/column identifier. + pub i: Identifier, + /// mp_base85 ciphertext. Required. + pub c: String, + /// HMAC-SHA256 equality term — present iff a `unique` index is configured. + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional)] + pub hm: Option, + /// Bloom filter term — present iff a `match` index is configured. + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional)] + pub bf: Option>, + /// Block ORE term — present iff an `ore` index is configured. + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional)] + pub ob: Option>, +} + +/// STE-vector storage payload (`k = "sv"`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +pub struct SteVecPayload { + /// Schema version. + pub v: u16, + /// Table/column identifier. + pub i: Identifier, + /// Per-selector encrypted entries; root document ciphertext at `sv[0].c`. + pub sv: Vec, +} + +/// One STE-vector element. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +pub struct SteVecElement { + /// Tokenized selector — deterministic per (path, key). + pub s: String, + /// Per-entry mp_base85 ciphertext. Required. + pub c: String, + /// Array marker — true when the selector points at a JSON array context. + #[serde(default, skip_serializing_if = "Option::is_none")] + #[ts(optional)] + pub a: Option, + /// Exactly one equality / ordering term, flattened onto the element. + #[serde(flatten)] + pub term: SteVecTerm, +} + +/// SteVec element term. FROZEN as **untagged** — this is the v2.3 wire shape. +/// +/// A consumer must narrow with `'hm' in term`; there is no literal +/// discriminant. A *new* type would tag this — see [`crate::int4`]. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export)] +#[serde(untagged)] +pub enum SteVecTerm { + /// HMAC term — boolean leaves, and array / object root placeholders. + Hmac { hm: String }, + /// CLLW ORE term — string / number leaves. + OreCllw { oc: String }, +} diff --git a/crates/eql-types/tests/conformance.rs b/crates/eql-types/tests/conformance.rs new file mode 100644 index 000000000..8d13fbb41 --- /dev/null +++ b/crates/eql-types/tests/conformance.rs @@ -0,0 +1,96 @@ +//! Conformance fixtures — the real guarantee that Rust / TS / JSON Schema and +//! the wire format agree. Codegen guarantees *shape*; these round-trips +//! guarantee *behaviour*. + +use eql_types::int4::{Int4Eq, Int4Tagged}; +use eql_types::v2_3::EqlEncrypted; +use serde_json::json; + +#[test] +fn v2_3_scalar_round_trips() { + let wire = json!({ + "k": "ct", "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let parsed: EqlEncrypted = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); +} + +#[test] +fn int4_eq_round_trips() { + let wire = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let parsed: Int4Eq = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); +} + +#[test] +fn int4_eq_rejects_missing_hmac() { + // The capability is type-enforced: an `int4_eq` payload with no `hm` is + // not representable. This is the bug class — a search term missing its + // index term — closed at the type boundary, before any consumer runs. + let no_hm = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext" + }); + let result: Result = serde_json::from_value(no_hm); + assert!(result.is_err(), "Int4Eq must reject a payload with no hm"); +} + +#[test] +fn legacy_payload_silently_accepts_missing_terms() { + // Contrast: the frozen v2.3 scalar type accepts a payload carrying no + // index terms at all — `hm`/`bf`/`ob` are optional. Nothing is wrong with + // the payload *as v2.3*; the point is the type tells a consumer nothing + // about which operators it can support. Hence the runtime guard. + let bare = json!({ + "k": "ct", "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext" + }); + let parsed: EqlEncrypted = serde_json::from_value(bare).unwrap(); + match parsed { + EqlEncrypted::Ct(p) => { + assert!(p.hm.is_none() && p.bf.is_none() && p.ob.is_none()); + } + EqlEncrypted::Sv(_) => panic!("expected Ct"), + } +} + +#[test] +fn int4_tagged_proposal_round_trips_and_discriminates() { + let wire = json!({ + "x": "int4_eq", "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let parsed: Int4Tagged = serde_json::from_value(wire.clone()).unwrap(); + assert!(matches!(parsed, Int4Tagged::Eq { .. })); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); +} + +#[test] +fn dump_json_schemas() { + use schemars::schema_for; + std::fs::create_dir_all("schema").unwrap(); + let schemas = [ + ("EqlEncrypted", schema_for!(EqlEncrypted)), + ("Int4Eq", schema_for!(Int4Eq)), + ("Int4Tagged", schema_for!(Int4Tagged)), + ]; + for (name, schema) in schemas { + std::fs::write( + format!("schema/{name}.json"), + serde_json::to_string_pretty(&schema).unwrap(), + ) + .unwrap(); + } +} From 8be88b19d1402ff8e7a79e1621f319767ffd26f8 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 9 Jun 2026 21:59:31 +1000 Subject: [PATCH 165/599] fix(eql-types): correct bf signedness and accept k-less scalar payloads MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two wire-fidelity bugs in the FROZEN v2.3 types — both diverged from the canonical eql-payload-v2.3.schema.json they claim to mirror: - `bf` is stored by EQL as `smallint[]` (signed i16). A `match` filter sized above 32768 (configurable up to 65536) emits upper-half bit positions as negative signed values, which `Option>` cannot deserialize. Changed to `Option>`. - `EqlEncrypted` required `k` via `#[serde(tag = "k")]`, but the wire contract and `eql_v2.check_encrypted` make `k` optional on the scalar form (required: only v, c, i) and discriminate on c-vs-sv. Kept the tag for serialization and codegen (TS discriminated union + JSON Schema oneOf) and hand-wrote a tolerant Deserialize that mirrors check_encrypted: key off `k` when present, else fall back to c/sv. Also corrects the `bf` range in the canonical reference schema (minimum 0 -> signed smallint -32768..32767) to match `smallint[]`. Regenerated bindings/ and schema/ from the updated types; added conformance tests for k-less scalars, negative bf, and the sv path (the previously-untested flatten + untagged SteVecTerm route). --- crates/eql-types/bindings/EncryptedPayload.ts | 5 ++ crates/eql-types/bindings/EqlEncrypted.ts | 11 +++- crates/eql-types/schema/EqlEncrypted.json | 7 +-- crates/eql-types/src/v2_3.rs | 53 ++++++++++++++++- crates/eql-types/tests/conformance.rs | 59 +++++++++++++++++++ .../schema/eql-payload-v2.3.schema.json | 4 +- 6 files changed, 129 insertions(+), 10 deletions(-) diff --git a/crates/eql-types/bindings/EncryptedPayload.ts b/crates/eql-types/bindings/EncryptedPayload.ts index 3c037f710..838d2c8c6 100644 --- a/crates/eql-types/bindings/EncryptedPayload.ts +++ b/crates/eql-types/bindings/EncryptedPayload.ts @@ -28,6 +28,11 @@ c: string, hm?: string, /** * Bloom filter term — present iff a `match` index is configured. + * + * Array of set bit positions. EQL stores these as `smallint[]` (signed + * `i16`); a `match` filter sized above 32768 (configurable up to 65536) + * emits upper-half positions as negative signed values, so this is `i16`, + * not `u16` — a `u16` cannot deserialize a real large-filter payload. */ bf?: Array, /** diff --git a/crates/eql-types/bindings/EqlEncrypted.ts b/crates/eql-types/bindings/EqlEncrypted.ts index 3e7bd8edd..3e4b42998 100644 --- a/crates/eql-types/bindings/EqlEncrypted.ts +++ b/crates/eql-types/bindings/EqlEncrypted.ts @@ -3,6 +3,15 @@ import type { EncryptedPayload } from "./EncryptedPayload"; import type { SteVecPayload } from "./SteVecPayload"; /** - * `eql_v2_encrypted` — the EQL v2.3 storage payload. Discriminated on `k`. + * `eql_v2_encrypted` — the EQL v2.3 storage payload. + * + * **Serialization** always emits the `k` discriminator (`"ct"` / `"sv"`) — + * this is what drives the internally-tagged TypeScript union and the JSON + * Schema `oneOf`. **Deserialization** is hand-written (below) because the + * v2.3 wire contract makes `k` *optional* on the scalar form: + * `eql_v2.check_encrypted` and `eql-payload-v2.3.schema.json` discriminate on + * the presence of `c` vs `sv`, not on `k` (the scalar form requires only + * `v`, `c`, `i`). A `#[serde(tag = "k")]`-derived `Deserialize` would reject a + * schema-valid scalar payload that omits `k`. */ export type EqlEncrypted = { "k": "ct" } & EncryptedPayload | { "k": "sv" } & SteVecPayload; diff --git a/crates/eql-types/schema/EqlEncrypted.json b/crates/eql-types/schema/EqlEncrypted.json index 8df7b1ad6..fe28cc9e4 100644 --- a/crates/eql-types/schema/EqlEncrypted.json +++ b/crates/eql-types/schema/EqlEncrypted.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "title": "EqlEncrypted", - "description": "`eql_v2_encrypted` — the EQL v2.3 storage payload. Discriminated on `k`.", + "description": "`eql_v2_encrypted` — the EQL v2.3 storage payload.\n\n**Serialization** always emits the `k` discriminator (`\"ct\"` / `\"sv\"`) — this is what drives the internally-tagged TypeScript union and the JSON Schema `oneOf`. **Deserialization** is hand-written (below) because the v2.3 wire contract makes `k` *optional* on the scalar form: `eql_v2.check_encrypted` and `eql-payload-v2.3.schema.json` discriminate on the presence of `c` vs `sv`, not on `k` (the scalar form requires only `v`, `c`, `i`). A `#[serde(tag = \"k\")]`-derived `Deserialize` would reject a schema-valid scalar payload that omits `k`.", "oneOf": [ { "description": "Scalar ciphertext payload.", @@ -14,15 +14,14 @@ ], "properties": { "bf": { - "description": "Bloom filter term — present iff a `match` index is configured.", + "description": "Bloom filter term — present iff a `match` index is configured.\n\nArray of set bit positions. EQL stores these as `smallint[]` (signed `i16`); a `match` filter sized above 32768 (configurable up to 65536) emits upper-half positions as negative signed values, so this is `i16`, not `u16` — a `u16` cannot deserialize a real large-filter payload.", "type": [ "array", "null" ], "items": { "type": "integer", - "format": "uint16", - "minimum": 0.0 + "format": "int16" } }, "c": { diff --git a/crates/eql-types/src/v2_3.rs b/crates/eql-types/src/v2_3.rs index 6c7957f71..2cc578ad9 100644 --- a/crates/eql-types/src/v2_3.rs +++ b/crates/eql-types/src/v2_3.rs @@ -16,8 +16,17 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; -/// `eql_v2_encrypted` — the EQL v2.3 storage payload. Discriminated on `k`. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +/// `eql_v2_encrypted` — the EQL v2.3 storage payload. +/// +/// **Serialization** always emits the `k` discriminator (`"ct"` / `"sv"`) — +/// this is what drives the internally-tagged TypeScript union and the JSON +/// Schema `oneOf`. **Deserialization** is hand-written (below) because the +/// v2.3 wire contract makes `k` *optional* on the scalar form: +/// `eql_v2.check_encrypted` and `eql-payload-v2.3.schema.json` discriminate on +/// the presence of `c` vs `sv`, not on `k` (the scalar form requires only +/// `v`, `c`, `i`). A `#[serde(tag = "k")]`-derived `Deserialize` would reject a +/// schema-valid scalar payload that omits `k`. +#[derive(Clone, Debug, PartialEq, Serialize, TS, JsonSchema)] #[ts(export)] #[serde(tag = "k")] pub enum EqlEncrypted { @@ -29,6 +38,39 @@ pub enum EqlEncrypted { Sv(SteVecPayload), } +impl<'de> Deserialize<'de> for EqlEncrypted { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use serde::de::Error; + // Mirror eql_v2.check_encrypted: key off `k` when present, otherwise + // fall back to which body field is present (`sv` => STE vector, + // otherwise scalar `ct`). `k` is optional on the scalar form per + // eql-payload-v2.3.schema.json (required there: only `v`, `c`, `i`). + let value = serde_json::Value::deserialize(deserializer)?; + let is_sv = match value.get("k").and_then(serde_json::Value::as_str) { + Some("sv") => true, + Some("ct") => false, + Some(other) => { + return Err(D::Error::custom(format!( + "unknown EQL payload kind: k = {other:?}" + ))) + } + None => value.get("sv").is_some(), + }; + if is_sv { + serde_json::from_value(value) + .map(EqlEncrypted::Sv) + .map_err(D::Error::custom) + } else { + serde_json::from_value(value) + .map(EqlEncrypted::Ct) + .map_err(D::Error::custom) + } + } +} + /// Scalar storage payload (`k = "ct"`). /// /// FROZEN imperfection: `hm`/`bf`/`ob` are independently optional. A consumer @@ -49,9 +91,14 @@ pub struct EncryptedPayload { #[ts(optional)] pub hm: Option, /// Bloom filter term — present iff a `match` index is configured. + /// + /// Array of set bit positions. EQL stores these as `smallint[]` (signed + /// `i16`); a `match` filter sized above 32768 (configurable up to 65536) + /// emits upper-half positions as negative signed values, so this is `i16`, + /// not `u16` — a `u16` cannot deserialize a real large-filter payload. #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] - pub bf: Option>, + pub bf: Option>, /// Block ORE term — present iff an `ore` index is configured. #[serde(default, skip_serializing_if = "Option::is_none")] #[ts(optional)] diff --git a/crates/eql-types/tests/conformance.rs b/crates/eql-types/tests/conformance.rs index 8d13fbb41..9d13cd70b 100644 --- a/crates/eql-types/tests/conformance.rs +++ b/crates/eql-types/tests/conformance.rs @@ -64,6 +64,65 @@ fn legacy_payload_silently_accepts_missing_terms() { } } +#[test] +fn v2_3_scalar_without_k_is_accepted() { + // The canonical v2.3 schema makes `k` optional on the scalar form + // (required: v, c, i) and check_encrypted discriminates on c-vs-sv, not k. + // A scalar payload that omits `k` must still deserialize as `Ct`. + let wire = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let parsed: EqlEncrypted = serde_json::from_value(wire).unwrap(); + assert!(matches!(parsed, EqlEncrypted::Ct(_))); + // Serialization always re-emits the discriminator. + assert_eq!( + serde_json::to_value(&parsed).unwrap(), + json!({ + "k": "ct", "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }) + ); +} + +#[test] +fn v2_3_bf_accepts_negative_smallint() { + // `bf` is stored as smallint[] (signed i16). A `match` filter sized above + // 32768 (allowed up to 65536) emits upper-half bit positions as negative + // signed smallints; the type must round-trip them. + let wire = json!({ + "k": "ct", "v": 2, + "i": { "t": "users", "c": "email" }, + "c": "mp_base85_ciphertext", + "bf": [-1, -32768, 32767, 0] + }); + let parsed: EqlEncrypted = serde_json::from_value(wire.clone()).unwrap(); + assert!(matches!(parsed, EqlEncrypted::Ct(_))); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); +} + +#[test] +fn v2_3_ste_vec_round_trips() { + // Exercises the `sv` path: SteVecPayload plus the flatten + untagged + // SteVecTerm (both `hm` and `oc` elements) — the crate's most fragile serde + // construct, and the route the hand-written EqlEncrypted::deserialize takes. + let wire = json!({ + "k": "sv", "v": 2, + "i": { "t": "users", "c": "profile" }, + "sv": [ + { "s": "selector_root", "c": "ct_root", "hm": "deadbeef" }, + { "s": "selector_name", "c": "ct_name", "oc": "00cafe", "a": true } + ] + }); + let parsed: EqlEncrypted = serde_json::from_value(wire.clone()).unwrap(); + assert!(matches!(parsed, EqlEncrypted::Sv(_))); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); +} + #[test] fn int4_tagged_proposal_round_trips_and_discriminates() { let wire = json!({ diff --git a/docs/reference/schema/eql-payload-v2.3.schema.json b/docs/reference/schema/eql-payload-v2.3.schema.json index 0b1e5741f..02df122a1 100644 --- a/docs/reference/schema/eql-payload-v2.3.schema.json +++ b/docs/reference/schema/eql-payload-v2.3.schema.json @@ -184,9 +184,9 @@ "bf": { "title": "Bloom filter (bf)", - "description": "Bloom filter representation as an array of set bit positions. Used by `LIKE` / `ILIKE` (`~~`, `~~*`) via `eql_v2.bloom_filter` and the corresponding GIN index.", + "description": "Bloom filter representation as an array of set bit positions. Used by `LIKE` / `ILIKE` (`~~`, `~~*`) via `eql_v2.bloom_filter` and the corresponding GIN index. Stored as `smallint[]` (signed `int2`): the filter size is a power of two up to 65536, so positions in the upper half of a filter larger than 32768 are emitted as negative signed values (two's-complement of the unsigned position). Consumers must use a signed 16-bit integer type.", "type": "array", - "items": { "type": "integer", "minimum": 0 } + "items": { "type": "integer", "minimum": -32768, "maximum": 32767 } }, "ob": { From c2995c62f33be5b971657eb6ae86dd104ead3247 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Wed, 10 Jun 2026 20:21:33 +1000 Subject: [PATCH 166/599] feat(eql-types): v3 domain payload types, parity-gated against the catalog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the eql_v2_int4 prototype tier with a v3 tier covering every eql_v3 encrypted domain: one capability-encoded struct per SQL domain (23 across int4/int2/int8/date/timestamptz/text), stamped by the eql_v3_domain! macro from reusable term newtypes (Ciphertext, Hmac256, OreBlockU64_8_256, BloomFilter). Index terms are required fields — Option does not appear in the tier — mirroring the generated domain CHECKs (envelope v/i/c + term keys, envelope version still v: 2). tests/catalog_parity.rs dev-depends on eql-scalars and asserts the v3 registry exactly covers CATALOG (every domain, catalog order) and that each type's schemars required keys equal envelope + catalog term keys, so the crate cannot drift from the generated SQL surface. ts-rs bindings land in bindings/v3/, JSON Schemas (with injected $id) in schema/v3/, both checked in; mise types:generate / types:check plus a CI step in the rust-crates job keep them fresh. eql-types joins the workspace and the lean test:crates set. The Int4Tagged self-describing proposal is removed from code (the x tag is not on the v3 wire) and preserved as README prose. --- .github/workflows/test-eql.yml | 19 +-- Cargo.lock | 85 ++++++++++ Cargo.toml | 4 + crates/eql-types/Cargo.toml | 6 + crates/eql-types/README.md | 68 ++++++-- crates/eql-types/bindings/Int4.ts | 19 --- crates/eql-types/bindings/Int4Eq.ts | 27 --- crates/eql-types/bindings/Int4Ord.ts | 28 ---- crates/eql-types/bindings/Int4Tagged.ts | 10 -- crates/eql-types/bindings/v3/BloomFilter.ts | 11 ++ crates/eql-types/bindings/v3/Ciphertext.ts | 8 + crates/eql-types/bindings/v3/Date.ts | 20 +++ crates/eql-types/bindings/v3/DateEq.ts | 25 +++ crates/eql-types/bindings/v3/DateOrd.ts | 25 +++ crates/eql-types/bindings/v3/DateOrdOre.ts | 25 +++ crates/eql-types/bindings/v3/Hmac256.ts | 7 + crates/eql-types/bindings/v3/Int2.ts | 20 +++ crates/eql-types/bindings/v3/Int2Eq.ts | 25 +++ crates/eql-types/bindings/v3/Int2Ord.ts | 25 +++ crates/eql-types/bindings/v3/Int2OrdOre.ts | 25 +++ crates/eql-types/bindings/v3/Int4.ts | 20 +++ crates/eql-types/bindings/v3/Int4Eq.ts | 25 +++ crates/eql-types/bindings/v3/Int4Ord.ts | 25 +++ crates/eql-types/bindings/v3/Int4OrdOre.ts | 27 +++ crates/eql-types/bindings/v3/Int8.ts | 20 +++ crates/eql-types/bindings/v3/Int8Eq.ts | 25 +++ crates/eql-types/bindings/v3/Int8Ord.ts | 25 +++ crates/eql-types/bindings/v3/Int8OrdOre.ts | 25 +++ .../bindings/v3/OreBlockU64_8_256.ts | 9 + crates/eql-types/bindings/v3/Text.ts | 20 +++ crates/eql-types/bindings/v3/TextEq.ts | 25 +++ crates/eql-types/bindings/v3/TextMatch.ts | 25 +++ crates/eql-types/bindings/v3/TextOrd.ts | 26 +++ crates/eql-types/bindings/v3/TextOrdOre.ts | 26 +++ crates/eql-types/bindings/v3/Timestamptz.ts | 20 +++ crates/eql-types/bindings/v3/TimestamptzEq.ts | 25 +++ crates/eql-types/schema/Int4Tagged.json | 125 -------------- .../schema/{Int4Eq.json => v3/date.json} | 82 ++++----- crates/eql-types/schema/v3/date_eq.json | 73 ++++++++ crates/eql-types/schema/v3/date_ord.json | 76 +++++++++ crates/eql-types/schema/v3/date_ord_ore.json | 76 +++++++++ crates/eql-types/schema/v3/int2.json | 60 +++++++ crates/eql-types/schema/v3/int2_eq.json | 73 ++++++++ crates/eql-types/schema/v3/int2_ord.json | 76 +++++++++ crates/eql-types/schema/v3/int2_ord_ore.json | 76 +++++++++ crates/eql-types/schema/v3/int4.json | 60 +++++++ crates/eql-types/schema/v3/int4_eq.json | 73 ++++++++ crates/eql-types/schema/v3/int4_ord.json | 76 +++++++++ crates/eql-types/schema/v3/int4_ord_ore.json | 76 +++++++++ crates/eql-types/schema/v3/int8.json | 60 +++++++ crates/eql-types/schema/v3/int8_eq.json | 73 ++++++++ crates/eql-types/schema/v3/int8_ord.json | 76 +++++++++ crates/eql-types/schema/v3/int8_ord_ore.json | 76 +++++++++ crates/eql-types/schema/v3/text.json | 60 +++++++ crates/eql-types/schema/v3/text_eq.json | 73 ++++++++ crates/eql-types/schema/v3/text_match.json | 77 +++++++++ crates/eql-types/schema/v3/text_ord.json | 76 +++++++++ crates/eql-types/schema/v3/text_ord_ore.json | 76 +++++++++ crates/eql-types/schema/v3/timestamptz.json | 60 +++++++ .../eql-types/schema/v3/timestamptz_eq.json | 73 ++++++++ crates/eql-types/src/int4.rs | 125 -------------- crates/eql-types/src/lib.rs | 10 +- crates/eql-types/src/v3/date.rs | 35 ++++ crates/eql-types/src/v3/int2.rs | 33 ++++ crates/eql-types/src/v3/int4.rs | 41 +++++ crates/eql-types/src/v3/int8.rs | 33 ++++ crates/eql-types/src/v3/mod.rs | 80 +++++++++ crates/eql-types/src/v3/registry.rs | 72 ++++++++ crates/eql-types/src/v3/terms.rs | 71 ++++++++ crates/eql-types/src/v3/text.rs | 44 +++++ crates/eql-types/src/v3/timestamptz.rs | 20 +++ crates/eql-types/tests/catalog_parity.rs | 63 +++++++ crates/eql-types/tests/conformance.rs | 66 +------- crates/eql-types/tests/export.rs | 40 +++++ crates/eql-types/tests/v3_conformance.rs | 158 ++++++++++++++++++ mise.toml | 50 +++++- 76 files changed, 3104 insertions(+), 469 deletions(-) delete mode 100644 crates/eql-types/bindings/Int4.ts delete mode 100644 crates/eql-types/bindings/Int4Eq.ts delete mode 100644 crates/eql-types/bindings/Int4Ord.ts delete mode 100644 crates/eql-types/bindings/Int4Tagged.ts create mode 100644 crates/eql-types/bindings/v3/BloomFilter.ts create mode 100644 crates/eql-types/bindings/v3/Ciphertext.ts create mode 100644 crates/eql-types/bindings/v3/Date.ts create mode 100644 crates/eql-types/bindings/v3/DateEq.ts create mode 100644 crates/eql-types/bindings/v3/DateOrd.ts create mode 100644 crates/eql-types/bindings/v3/DateOrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Hmac256.ts create mode 100644 crates/eql-types/bindings/v3/Int2.ts create mode 100644 crates/eql-types/bindings/v3/Int2Eq.ts create mode 100644 crates/eql-types/bindings/v3/Int2Ord.ts create mode 100644 crates/eql-types/bindings/v3/Int2OrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Int4.ts create mode 100644 crates/eql-types/bindings/v3/Int4Eq.ts create mode 100644 crates/eql-types/bindings/v3/Int4Ord.ts create mode 100644 crates/eql-types/bindings/v3/Int4OrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Int8.ts create mode 100644 crates/eql-types/bindings/v3/Int8Eq.ts create mode 100644 crates/eql-types/bindings/v3/Int8Ord.ts create mode 100644 crates/eql-types/bindings/v3/Int8OrdOre.ts create mode 100644 crates/eql-types/bindings/v3/OreBlockU64_8_256.ts create mode 100644 crates/eql-types/bindings/v3/Text.ts create mode 100644 crates/eql-types/bindings/v3/TextEq.ts create mode 100644 crates/eql-types/bindings/v3/TextMatch.ts create mode 100644 crates/eql-types/bindings/v3/TextOrd.ts create mode 100644 crates/eql-types/bindings/v3/TextOrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Timestamptz.ts create mode 100644 crates/eql-types/bindings/v3/TimestamptzEq.ts delete mode 100644 crates/eql-types/schema/Int4Tagged.json rename crates/eql-types/schema/{Int4Eq.json => v3/date.json} (50%) create mode 100644 crates/eql-types/schema/v3/date_eq.json create mode 100644 crates/eql-types/schema/v3/date_ord.json create mode 100644 crates/eql-types/schema/v3/date_ord_ore.json create mode 100644 crates/eql-types/schema/v3/int2.json create mode 100644 crates/eql-types/schema/v3/int2_eq.json create mode 100644 crates/eql-types/schema/v3/int2_ord.json create mode 100644 crates/eql-types/schema/v3/int2_ord_ore.json create mode 100644 crates/eql-types/schema/v3/int4.json create mode 100644 crates/eql-types/schema/v3/int4_eq.json create mode 100644 crates/eql-types/schema/v3/int4_ord.json create mode 100644 crates/eql-types/schema/v3/int4_ord_ore.json create mode 100644 crates/eql-types/schema/v3/int8.json create mode 100644 crates/eql-types/schema/v3/int8_eq.json create mode 100644 crates/eql-types/schema/v3/int8_ord.json create mode 100644 crates/eql-types/schema/v3/int8_ord_ore.json create mode 100644 crates/eql-types/schema/v3/text.json create mode 100644 crates/eql-types/schema/v3/text_eq.json create mode 100644 crates/eql-types/schema/v3/text_match.json create mode 100644 crates/eql-types/schema/v3/text_ord.json create mode 100644 crates/eql-types/schema/v3/text_ord_ore.json create mode 100644 crates/eql-types/schema/v3/timestamptz.json create mode 100644 crates/eql-types/schema/v3/timestamptz_eq.json delete mode 100644 crates/eql-types/src/int4.rs create mode 100644 crates/eql-types/src/v3/date.rs create mode 100644 crates/eql-types/src/v3/int2.rs create mode 100644 crates/eql-types/src/v3/int4.rs create mode 100644 crates/eql-types/src/v3/int8.rs create mode 100644 crates/eql-types/src/v3/mod.rs create mode 100644 crates/eql-types/src/v3/registry.rs create mode 100644 crates/eql-types/src/v3/terms.rs create mode 100644 crates/eql-types/src/v3/text.rs create mode 100644 crates/eql-types/src/v3/timestamptz.rs create mode 100644 crates/eql-types/tests/catalog_parity.rs create mode 100644 crates/eql-types/tests/export.rs create mode 100644 crates/eql-types/tests/v3_conformance.rs diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 732a132b6..39ace3d46 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -103,16 +103,15 @@ jobs: echo 'shards=[1,2,3,4]' >> "$GITHUB_OUTPUT" fi - # Compile the test binaries ONCE. Runs in the queue and on workflow_dispatch - # always, and on PRs only when relevant files changed (docs-only PRs never pay - # the ~4-min compile). - build-archive: - name: "Build test archive" - needs: [changes] - if: >- - github.event_name == 'merge_group' - || github.event_name == 'workflow_dispatch' - || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') + # Freshness gate for the eql-types codegen output: regenerate the + # TypeScript bindings and JSON Schemas and fail if the checked-in + # copies differ. Reuses the build artifacts from the step above. + - name: Verify eql-types bindings and schemas are fresh + run: | + mise run types:check + + codegen: + name: "Encrypted-domain codegen" runs-on: ubuntu-latest env: # test:sqlx:archive depends on test:sqlx:prep, which copies the built EQL diff --git a/Cargo.lock b/Cargo.lock index 54be696d0..285062eca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1125,6 +1125,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -1179,6 +1185,17 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "eql-types" +version = "0.1.0" +dependencies = [ + "eql-scalars", + "schemars", + "serde", + "serde_json", + "ts-rs", +] + [[package]] name = "eql_tests" version = "0.1.0" @@ -3366,6 +3383,30 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.108", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -3457,6 +3498,17 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "serde_json" version = "1.0.145" @@ -3983,6 +4035,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "terminal_size" version = "0.4.4" @@ -4320,6 +4381,30 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ts-rs" +version = "10.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" +dependencies = [ + "lazy_static", + "serde_json", + "thiserror 2.0.18", + "ts-rs-macros", +] + +[[package]] +name = "ts-rs-macros" +version = "10.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "termcolor", +] + [[package]] name = "typenum" version = "1.20.0" diff --git a/Cargo.toml b/Cargo.toml index b7d177577..9a5a596e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,9 @@ # crates/eql-codegen — the SQL generator binary (stub here; Plan 2 fills it in). # crates/eql-tests-macros — proc-macros expanding the single scalar-harness # list into the per-type SQLx-matrix wiring. +# crates/eql-types — canonical wire types for EQL payloads (Rust → ts-rs +# TypeScript bindings + schemars JSON Schema); parity- +# tested against the eql-scalars catalog. # tests/sqlx — the existing `eql_tests` SQLx integration crate. # # resolver = "2" keeps the heavy test-crate feature set (sqlx/tokio/cipherstash- @@ -20,6 +23,7 @@ members = [ "crates/eql-scalars", "crates/eql-codegen", "crates/eql-tests-macros", + "crates/eql-types", "tests/sqlx", ] default-members = ["tests/sqlx"] diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml index deb841da1..d20219986 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-types/Cargo.toml @@ -9,3 +9,9 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" ts-rs = { version = "10", features = ["serde-json-impl"] } schemars = "0.8" + +[dev-dependencies] +# Parity oracle: tests/catalog_parity.rs asserts the v3 registry exactly +# covers eql_scalars::CATALOG, so the types here cannot drift from the +# generated SQL surface. +eql-scalars = { path = "../eql-scalars" } diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index 1c18cefef..20e705f7c 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -1,4 +1,4 @@ -# eql-types (prototype) +# eql-types Canonical wire types for EQL payloads — **one Rust definition per payload shape**, intended as the single source of truth for: @@ -7,9 +7,6 @@ shape**, intended as the single source of truth for: - **TypeScript** — generated via [`ts-rs`] into [`bindings/`](bindings/) - **JSON Schema** — generated via [`schemars`] into [`schema/`](schema/) -> **Status: prototype / draft for discussion.** Not wired into the EQL build -> or CI. See the pull request description for full context. - ## Why Type information is lost at every hop of `EQL → cipherstash-client → @@ -24,25 +21,68 @@ hand-copying. | Module | Tier | Rule | |--------|------|------| | [`src/v2_3.rs`](src/v2_3.rs) | `eql_v2_encrypted` v2.3 wire contract | **FROZEN** — in production; mirrors `eql-payload-v2.3.schema.json`; must not change | -| [`src/int4.rs`](src/int4.rs) | `eql_v2_int4` variant family (#225) | **Design freedom** — capability-encoded types | +| [`src/v3/`](src/v3/) | `eql_v3` encrypted-domain families | One struct per SQL domain, parity-tested against `eql-scalars::CATALOG` | -## Capability-encoded types +## Capability-encoded types (the v3 tier) `eql_v2_encrypted` is one type with every index term optional, so consumers -must guess at runtime which terms are present. The `int4` family instead has -one type per capability — `Int4` / `Int4Eq` / `Int4Ord` — each carrying its -index terms as **required** fields. The capability is the type identity; -`Option` never appears. +must guess at runtime which terms are present. The v3 tier instead has one +type per **SQL domain** — `Int4` / `Int4Eq` / `Int4Ord` / `Int4OrdOre`, and +likewise for `int2`, `int8`, `date`, `timestamptz` (eq-only), and `text` +(which adds `TextMatch`) — each carrying its index terms as **required** +fields. The capability is the type identity; `Option` never appears. + +Shared wire fields are reusable newtypes in +[`src/v3/terms.rs`](src/v3/terms.rs): + +| Newtype | Wire key | Inner | Backs | +|---------|----------|-------|-------| +| `Ciphertext` | `c` | `String` | every domain (envelope) | +| `Hmac256` | `hm` | `String` | `_eq` domains | +| `OreBlockU64_8_256` | `ob` | `Vec` | `_ord` / `_ord_ore` domains | +| `BloomFilter` | `bf` | `Vec` (signed!) | `_match` domains | + +Note "v3" names the SQL schema generation (`eql_v3.*`); the JSON envelope +version is still `v: 2` — the generated domain CHECKs assert it, and the wire +field names are unchanged from v2 (the purpose-named rename in +`docs/plans/eql-payload-scheme-discipline-rfc.md` is deferred). + +### Drift protection + +`tests/catalog_parity.rs` asserts the [`v3::registry`](src/v3/registry.rs) +exactly covers `eql-scalars::CATALOG` (every domain, in order) and that each +type's required JSON keys equal the envelope keys plus the catalog's term +keys. Adding a scalar to the catalog without adding its types here fails the +build; so does accidentally making a term field `Option`. ## Develop ```sh -cargo test +mise run types:generate # clean-regenerate bindings/ and schema/ +mise run types:check # regenerate + fail if checked-in outputs are stale ``` -Runs the conformance round-trip tests and regenerates `bindings/` (TypeScript) -and `schema/` (JSON Schema). Both directories are checked in so reviewers can -see the codegen output without running anything. +Both wrap `cargo test -p eql-types`, which runs the conformance round-trip +tests and regenerates `bindings/` (TypeScript, via ts-rs) and `schema/` +(JSON Schema, via `tests/export.rs`). Both directories are checked in so +reviewers can see the codegen output without running anything; CI runs +`types:check` to keep them fresh. + +## Future direction: self-describing payloads + +On the wire, a v3 payload is discriminated only by *which key is present* +(`hm` vs `ob` vs `bf`) — the SQL domain name carries the rest. Once the JSON +leaves SQL (into protect-ffi, into TypeScript, into a log line) that +information is gone, and a consumer is back to sniffing keys: the untagged +failure mode that produced the original protect-dynamodb bug. An earlier +prototype here carried an `Int4Tagged` enum with a one-field capability tag +(`"x": "int4_eq"`), which generates a clean TypeScript discriminated union +and a JSON Schema `oneOf` with per-branch `const`s. It was removed because +the tag is not part of the v3 wire contract (the generated domain CHECKs +know no `x` key) — but it remains the recommended shape if a future payload +revision adds a discriminator. See +`docs/plans/eql-payload-scheme-discipline-rfc.md` for the wider payload +evolution plan. [`ts-rs`]: https://github.com/Aleph-Alpha/ts-rs [`schemars`]: https://graham.cool/schemars/ diff --git a/crates/eql-types/bindings/Int4.ts b/crates/eql-types/bindings/Int4.ts deleted file mode 100644 index ffddccf3d..000000000 --- a/crates/eql-types/bindings/Int4.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Identifier } from "./Identifier"; - -/** - * `eql_v2_int4` — storage only. Carries `c`; every operator is blocked. - */ -export type Int4 = { -/** - * Schema version. - */ -v: number, -/** - * Table/column identifier. - */ -i: Identifier, -/** - * mp_base85 ciphertext. Required by the domain's CHECK constraint. - */ -c: string, }; diff --git a/crates/eql-types/bindings/Int4Eq.ts b/crates/eql-types/bindings/Int4Eq.ts deleted file mode 100644 index de28becea..000000000 --- a/crates/eql-types/bindings/Int4Eq.ts +++ /dev/null @@ -1,27 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Identifier } from "./Identifier"; - -/** - * `eql_v2_int4_eq` — HMAC equality (`=`, `<>`). - * - * `hm` is a required field. There is no `Option`: the type *is* the - * equality capability. A payload without `hm` cannot be deserialized into - * this type — the Rust analogue of the SQL domain's CHECK constraint. - */ -export type Int4Eq = { -/** - * Schema version. - */ -v: number, -/** - * Table/column identifier. - */ -i: Identifier, -/** - * mp_base85 ciphertext. Required. - */ -c: string, -/** - * HMAC-SHA256 equality term. Required. - */ -hm: string, }; diff --git a/crates/eql-types/bindings/Int4Ord.ts b/crates/eql-types/bindings/Int4Ord.ts deleted file mode 100644 index c0e15301e..000000000 --- a/crates/eql-types/bindings/Int4Ord.ts +++ /dev/null @@ -1,28 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Identifier } from "./Identifier"; - -/** - * `eql_v2_int4_ord` — equality + ORE-block range (`=` `<>` `<` `<=` `>` `>=`). - * - * Deliberately carries no `hm`: ORE over a full-domain `int4` is lossless, so - * the order term `ob` doubles as an exact equality term. - * (`eql_v2_int4_ord_ore` in #225 is the same shape under a scheme-explicit - * name — structurally identical, so it is not a separate Rust type.) - */ -export type Int4Ord = { -/** - * Schema version. - */ -v: number, -/** - * Table/column identifier. - */ -i: Identifier, -/** - * mp_base85 ciphertext. Required. - */ -c: string, -/** - * Block ORE term. Required — serves both range and equality. - */ -ob: Array, }; diff --git a/crates/eql-types/bindings/Int4Tagged.ts b/crates/eql-types/bindings/Int4Tagged.ts deleted file mode 100644 index 09a90e430..000000000 --- a/crates/eql-types/bindings/Int4Tagged.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Identifier } from "./Identifier"; - -/** - * **Proposed.** Self-describing int4 payload — `x` is the capability tag. - * - * Generates a clean TypeScript discriminated union (`switch (p.x)` with - * exhaustiveness) and a JSON Schema `oneOf` with a per-branch `const`. - */ -export type Int4Tagged = { "x": "int4", v: number, i: Identifier, c: string, } | { "x": "int4_eq", v: number, i: Identifier, c: string, hm: string, } | { "x": "int4_ord", v: number, i: Identifier, c: string, ob: Array, }; diff --git a/crates/eql-types/bindings/v3/BloomFilter.ts b/crates/eql-types/bindings/v3/BloomFilter.ts new file mode 100644 index 000000000..a1ac0d7cb --- /dev/null +++ b/crates/eql-types/bindings/v3/BloomFilter.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Bloom-filter match term — the `bf` wire key. Backs the `_match` domains + * (`~~` containment via `@>`/`<@`). + * + * **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, + * and filters sized above 32768 emit upper-half bit positions as negative + * signed values (same rationale as `v2_3::EncryptedPayload::bf`). + */ +export type BloomFilter = Array; diff --git a/crates/eql-types/bindings/v3/Ciphertext.ts b/crates/eql-types/bindings/v3/Ciphertext.ts new file mode 100644 index 000000000..7beff648e --- /dev/null +++ b/crates/eql-types/bindings/v3/Ciphertext.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * mp_base85 source ciphertext — the `c` envelope key. + * + * Required by every v3 domain CHECK; present on every payload. + */ +export type Ciphertext = string; diff --git a/crates/eql-types/bindings/v3/Date.ts b/crates/eql-types/bindings/v3/Date.ts new file mode 100644 index 000000000..12f801e59 --- /dev/null +++ b/crates/eql-types/bindings/v3/Date.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.date` — storage only; every operator is blocked. + */ +export type Date = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/DateEq.ts b/crates/eql-types/bindings/v3/DateEq.ts new file mode 100644 index 000000000..db4b23c3d --- /dev/null +++ b/crates/eql-types/bindings/v3/DateEq.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.date_eq` — HMAC equality (`=`, `<>`). + */ +export type DateEq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/DateOrd.ts b/crates/eql-types/bindings/v3/DateOrd.ts new file mode 100644 index 000000000..8eb619224 --- /dev/null +++ b/crates/eql-types/bindings/v3/DateOrd.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type DateOrd = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/DateOrdOre.ts b/crates/eql-types/bindings/v3/DateOrdOre.ts new file mode 100644 index 000000000..8e6496fc3 --- /dev/null +++ b/crates/eql-types/bindings/v3/DateOrdOre.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. + */ +export type DateOrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Hmac256.ts b/crates/eql-types/bindings/v3/Hmac256.ts new file mode 100644 index 000000000..22cefc000 --- /dev/null +++ b/crates/eql-types/bindings/v3/Hmac256.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains + * (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. + */ +export type Hmac256 = string; diff --git a/crates/eql-types/bindings/v3/Int2.ts b/crates/eql-types/bindings/v3/Int2.ts new file mode 100644 index 000000000..5457a00ff --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.int2` — storage only; every operator is blocked. + */ +export type Int2 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int2Eq.ts b/crates/eql-types/bindings/v3/Int2Eq.ts new file mode 100644 index 000000000..1563906d2 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2Eq.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). + */ +export type Int2Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int2Ord.ts b/crates/eql-types/bindings/v3/Int2Ord.ts new file mode 100644 index 000000000..b0720d69b --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2Ord.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Int2Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int2OrdOre.ts b/crates/eql-types/bindings/v3/Int2OrdOre.ts new file mode 100644 index 000000000..7b2c3416e --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2OrdOre.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. + */ +export type Int2OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int4.ts b/crates/eql-types/bindings/v3/Int4.ts new file mode 100644 index 000000000..0918e410e --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.int4` — storage only; every operator is blocked. + */ +export type Int4 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int4Eq.ts b/crates/eql-types/bindings/v3/Int4Eq.ts new file mode 100644 index 000000000..98c7ccc4c --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4Eq.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). + */ +export type Int4Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int4Ord.ts b/crates/eql-types/bindings/v3/Int4Ord.ts new file mode 100644 index 000000000..0e36e3621 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4Ord.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Int4Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int4OrdOre.ts b/crates/eql-types/bindings/v3/Int4OrdOre.ts new file mode 100644 index 000000000..a77c4a950 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4OrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), + * scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. + */ +export type Int4OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too — ORE over a + * full-domain `int4` is lossless, so no separate `hm` is carried. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int8.ts b/crates/eql-types/bindings/v3/Int8.ts new file mode 100644 index 000000000..c2ef0fe2f --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.int8` — storage only; every operator is blocked. + */ +export type Int8 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int8Eq.ts b/crates/eql-types/bindings/v3/Int8Eq.ts new file mode 100644 index 000000000..435e66dde --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8Eq.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). + */ +export type Int8Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int8Ord.ts b/crates/eql-types/bindings/v3/Int8Ord.ts new file mode 100644 index 000000000..ae4b81821 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8Ord.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Int8Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int8OrdOre.ts b/crates/eql-types/bindings/v3/Int8OrdOre.ts new file mode 100644 index 000000000..ec33282b8 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8OrdOre.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. + */ +export type Int8OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts b/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts new file mode 100644 index 000000000..5701b17fb --- /dev/null +++ b/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the + * `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless + * over the scalar's domain, so it serves equality too. SQL-side constructor: + * `eql_v3.ore_block_u64_8_256`. + */ +export type OreBlockU64_8_256 = Array; diff --git a/crates/eql-types/bindings/v3/Text.ts b/crates/eql-types/bindings/v3/Text.ts new file mode 100644 index 000000000..fa65aeb23 --- /dev/null +++ b/crates/eql-types/bindings/v3/Text.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.text` — storage only; every operator is blocked. + */ +export type Text = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/TextEq.ts b/crates/eql-types/bindings/v3/TextEq.ts new file mode 100644 index 000000000..5a5f10f43 --- /dev/null +++ b/crates/eql-types/bindings/v3/TextEq.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.text_eq` — HMAC equality (`=`, `<>`). + */ +export type TextEq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/TextMatch.ts b/crates/eql-types/bindings/v3/TextMatch.ts new file mode 100644 index 000000000..c6cacd059 --- /dev/null +++ b/crates/eql-types/bindings/v3/TextMatch.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { BloomFilter } from "./BloomFilter"; +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.text_match` — Bloom-filter containment match. + */ +export type TextMatch = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Bloom-filter match term (signed smallint bit positions). + */ +bf: BloomFilter, }; diff --git a/crates/eql-types/bindings/v3/TextOrd.ts b/crates/eql-types/bindings/v3/TextOrd.ts new file mode 100644 index 000000000..fbf73e9c6 --- /dev/null +++ b/crates/eql-types/bindings/v3/TextOrd.ts @@ -0,0 +1,26 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.text_ord` — full lexicographic comparison + * (`=` `<>` `<` `<=` `>` `>=`). + */ +export type TextOrd = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/TextOrdOre.ts b/crates/eql-types/bindings/v3/TextOrdOre.ts new file mode 100644 index 000000000..218423f27 --- /dev/null +++ b/crates/eql-types/bindings/v3/TextOrdOre.ts @@ -0,0 +1,26 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; + +/** + * `eql_v3.text_ord_ore` — full lexicographic comparison, + * scheme-explicit name. + */ +export type TextOrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Timestamptz.ts b/crates/eql-types/bindings/v3/Timestamptz.ts new file mode 100644 index 000000000..860055a16 --- /dev/null +++ b/crates/eql-types/bindings/v3/Timestamptz.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.timestamptz` — storage only; every operator is blocked. + */ +export type Timestamptz = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/TimestamptzEq.ts b/crates/eql-types/bindings/v3/TimestamptzEq.ts new file mode 100644 index 000000000..3db0d7208 --- /dev/null +++ b/crates/eql-types/bindings/v3/TimestamptzEq.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "../Identifier"; + +/** + * `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). + */ +export type TimestamptzEq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + */ +v: number, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/schema/Int4Tagged.json b/crates/eql-types/schema/Int4Tagged.json deleted file mode 100644 index 86c54cd7a..000000000 --- a/crates/eql-types/schema/Int4Tagged.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Int4Tagged", - "description": "**Proposed.** Self-describing int4 payload — `x` is the capability tag.\n\nGenerates a clean TypeScript discriminated union (`switch (p.x)` with exhaustiveness) and a JSON Schema `oneOf` with a per-branch `const`.", - "oneOf": [ - { - "description": "`x: \"int4\"` — storage only.", - "type": "object", - "required": [ - "c", - "i", - "v", - "x" - ], - "properties": { - "c": { - "type": "string" - }, - "i": { - "$ref": "#/definitions/Identifier" - }, - "v": { - "type": "integer", - "format": "uint16", - "minimum": 0.0 - }, - "x": { - "type": "string", - "enum": [ - "int4" - ] - } - } - }, - { - "description": "`x: \"int4_eq\"` — HMAC equality.", - "type": "object", - "required": [ - "c", - "hm", - "i", - "v", - "x" - ], - "properties": { - "c": { - "type": "string" - }, - "hm": { - "type": "string" - }, - "i": { - "$ref": "#/definitions/Identifier" - }, - "v": { - "type": "integer", - "format": "uint16", - "minimum": 0.0 - }, - "x": { - "type": "string", - "enum": [ - "int4_eq" - ] - } - } - }, - { - "description": "`x: \"int4_ord\"` — equality + ORE-block range.", - "type": "object", - "required": [ - "c", - "i", - "ob", - "v", - "x" - ], - "properties": { - "c": { - "type": "string" - }, - "i": { - "$ref": "#/definitions/Identifier" - }, - "ob": { - "type": "array", - "items": { - "type": "string" - } - }, - "v": { - "type": "integer", - "format": "uint16", - "minimum": 0.0 - }, - "x": { - "type": "string", - "enum": [ - "int4_ord" - ] - } - } - } - ], - "definitions": { - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "type": "object", - "required": [ - "c", - "t" - ], - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/crates/eql-types/schema/Int4Eq.json b/crates/eql-types/schema/v3/date.json similarity index 50% rename from crates/eql-types/schema/Int4Eq.json rename to crates/eql-types/schema/v3/date.json index 9bde81c00..fcbe8e71e 100644 --- a/crates/eql-types/schema/Int4Eq.json +++ b/crates/eql-types/schema/v3/date.json @@ -1,46 +1,13 @@ { + "$id": "https://schemas.cipherstash.com/eql/v3/date.json", "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Int4Eq", - "description": "`eql_v2_int4_eq` — HMAC equality (`=`, `<>`).\n\n`hm` is a required field. There is no `Option`: the type *is* the equality capability. A payload without `hm` cannot be deserialized into this type — the Rust analogue of the SQL domain's CHECK constraint.", - "type": "object", - "required": [ - "c", - "hm", - "i", - "v" - ], - "properties": { - "c": { - "description": "mp_base85 ciphertext. Required.", - "type": "string" - }, - "hm": { - "description": "HMAC-SHA256 equality term. Required.", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, - "i": { - "description": "Table/column identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "v": { - "description": "Schema version.", - "type": "integer", - "format": "uint16", - "minimum": 0.0 - } - }, - "definitions": { "Identifier": { "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "type": "object", - "required": [ - "c", - "t" - ], "properties": { "c": { "description": "Column name.", @@ -50,7 +17,44 @@ "description": "Table name.", "type": "string" } - } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.date` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" } - } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Date", + "type": "object" } \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_eq.json b/crates/eql-types/schema/v3/date_eq.json new file mode 100644 index 000000000..8aae8ef3d --- /dev/null +++ b/crates/eql-types/schema/v3/date_eq.json @@ -0,0 +1,73 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.date_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "DateEq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_ord.json b/crates/eql-types/schema/v3/date_ord.json new file mode 100644 index 000000000..d3253e3e1 --- /dev/null +++ b/crates/eql-types/schema/v3/date_ord.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "DateOrd", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_ord_ore.json b/crates/eql-types/schema/v3/date_ord_ore.json new file mode 100644 index 000000000..d2471cef4 --- /dev/null +++ b/crates/eql-types/schema/v3/date_ord_ore.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.date_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "DateOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2.json b/crates/eql-types/schema/v3/int2.json new file mode 100644 index 000000000..36c48d29e --- /dev/null +++ b/crates/eql-types/schema/v3/int2.json @@ -0,0 +1,60 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.int2` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Int2", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_eq.json b/crates/eql-types/schema/v3/int2_eq.json new file mode 100644 index 000000000..84e122b8c --- /dev/null +++ b/crates/eql-types/schema/v3/int2_eq.json @@ -0,0 +1,73 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.int2_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Int2Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_ord.json b/crates/eql-types/schema/v3/int2_ord.json new file mode 100644 index 000000000..9eeee77f4 --- /dev/null +++ b/crates/eql-types/schema/v3/int2_ord.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int2Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_ord_ore.json b/crates/eql-types/schema/v3/int2_ord_ore.json new file mode 100644 index 000000000..632d62a19 --- /dev/null +++ b/crates/eql-types/schema/v3/int2_ord_ore.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.int2_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int2OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4.json b/crates/eql-types/schema/v3/int4.json new file mode 100644 index 000000000..25d616482 --- /dev/null +++ b/crates/eql-types/schema/v3/int4.json @@ -0,0 +1,60 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.int4` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Int4", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_eq.json b/crates/eql-types/schema/v3/int4_eq.json new file mode 100644 index 000000000..0f9204ba2 --- /dev/null +++ b/crates/eql-types/schema/v3/int4_eq.json @@ -0,0 +1,73 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.int4_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Int4Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_ord.json b/crates/eql-types/schema/v3/int4_ord.json new file mode 100644 index 000000000..a45f5298a --- /dev/null +++ b/crates/eql-types/schema/v3/int4_ord.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int4Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_ord_ore.json b/crates/eql-types/schema/v3/int4_ord_ore.json new file mode 100644 index 000000000..191843c4c --- /dev/null +++ b/crates/eql-types/schema/v3/int4_ord_ore.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too — ORE over a full-domain `int4` is lossless, so no separate `hm` is carried." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int4OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8.json b/crates/eql-types/schema/v3/int8.json new file mode 100644 index 000000000..3892f8ba2 --- /dev/null +++ b/crates/eql-types/schema/v3/int8.json @@ -0,0 +1,60 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.int8` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Int8", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_eq.json b/crates/eql-types/schema/v3/int8_eq.json new file mode 100644 index 000000000..8f970b646 --- /dev/null +++ b/crates/eql-types/schema/v3/int8_eq.json @@ -0,0 +1,73 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.int8_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Int8Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_ord.json b/crates/eql-types/schema/v3/int8_ord.json new file mode 100644 index 000000000..a7ca295d8 --- /dev/null +++ b/crates/eql-types/schema/v3/int8_ord.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int8Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_ord_ore.json b/crates/eql-types/schema/v3/int8_ord_ore.json new file mode 100644 index 000000000..a86d1b8c4 --- /dev/null +++ b/crates/eql-types/schema/v3/int8_ord_ore.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.int8_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int8OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text.json b/crates/eql-types/schema/v3/text.json new file mode 100644 index 000000000..1d2605c06 --- /dev/null +++ b/crates/eql-types/schema/v3/text.json @@ -0,0 +1,60 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.text` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Text", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_eq.json b/crates/eql-types/schema/v3/text_eq.json new file mode 100644 index 000000000..abbf3a6f5 --- /dev/null +++ b/crates/eql-types/schema/v3/text_eq.json @@ -0,0 +1,73 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.text_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "TextEq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_match.json b/crates/eql-types/schema/v3/text_match.json new file mode 100644 index 000000000..4cf7c4f91 --- /dev/null +++ b/crates/eql-types/schema/v3/text_match.json @@ -0,0 +1,77 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "BloomFilter": { + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`~~` containment via `@>`/`<@`).\n\n**Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values (same rationale as `v2_3::EncryptedPayload::bf`).", + "items": { + "format": "int16", + "type": "integer" + }, + "type": "array" + }, + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.text_match` — Bloom-filter containment match.", + "properties": { + "bf": { + "allOf": [ + { + "$ref": "#/definitions/BloomFilter" + } + ], + "description": "Bloom-filter match term (signed smallint bit positions)." + }, + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "bf", + "c", + "i", + "v" + ], + "title": "TextMatch", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_ord.json b/crates/eql-types/schema/v3/text_ord.json new file mode 100644 index 000000000..1758e763b --- /dev/null +++ b/crates/eql-types/schema/v3/text_ord.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.text_ord` — full lexicographic comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "TextOrd", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_ord_ore.json b/crates/eql-types/schema/v3/text_ord_ore.json new file mode 100644 index 000000000..3b467f14c --- /dev/null +++ b/crates/eql-types/schema/v3/text_ord_ore.json @@ -0,0 +1,76 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "description": "`eql_v3.text_ord_ore` — full lexicographic comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "TextOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/timestamptz.json b/crates/eql-types/schema/v3/timestamptz.json new file mode 100644 index 000000000..e1cd070ab --- /dev/null +++ b/crates/eql-types/schema/v3/timestamptz.json @@ -0,0 +1,60 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.timestamptz` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Timestamptz", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/timestamptz_eq.json b/crates/eql-types/schema/v3/timestamptz_eq.json new file mode 100644 index 000000000..6d1759f8d --- /dev/null +++ b/crates/eql-types/schema/v3/timestamptz_eq.json @@ -0,0 +1,73 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + } + }, + "description": "`eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", + "format": "uint16", + "minimum": 0.0, + "type": "integer" + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "TimestamptzEq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/src/int4.rs b/crates/eql-types/src/int4.rs deleted file mode 100644 index ab1f0fd58..000000000 --- a/crates/eql-types/src/int4.rs +++ /dev/null @@ -1,125 +0,0 @@ -//! # `eql_v2_int4` variant family — NEW (targets EQL 2.4) -//! -//! Where [`crate::v2_3`] is frozen, this module has design freedom. It mirrors -//! the SQL domain family from `encrypt-query-language#225`. -//! -//! ## The idea: capability-encoded types -//! -//! `eql_v2_encrypted` is one mega-type with every index term optional — so a -//! consumer must runtime-check "do I have an `hm`?". The int4 family instead -//! splits storage into one type per **capability**: -//! -//! | Rust type | SQL domain | Required keys | Operators | -//! |-------------|---------------------|---------------|----------------------------| -//! | [`Int4`] | `eql_v2_int4` | `c` | none (storage only) | -//! | [`Int4Eq`] | `eql_v2_int4_eq` | `c`, `hm` | `=` `<>` | -//! | [`Int4Ord`] | `eql_v2_int4_ord` | `c`, `ob` | `=` `<>` `<` `<=` `>` `>=` | -//! -//! The capability is the **type identity**. There are no optional index-term -//! fields: hold an [`Int4Eq`] and `hm` is present — guaranteed by the Rust -//! type, and (on the SQL side) by the domain's `CHECK` constraint. The runtime -//! guard the `protect-dynamodb` bug reached for becomes impossible to need. -//! -//! `Option` does not appear in this module. - -use crate::Identifier; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use ts_rs::TS; - -/// `eql_v2_int4` — storage only. Carries `c`; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -pub struct Int4 { - /// Schema version. - pub v: u16, - /// Table/column identifier. - pub i: Identifier, - /// mp_base85 ciphertext. Required by the domain's CHECK constraint. - pub c: String, -} - -/// `eql_v2_int4_eq` — HMAC equality (`=`, `<>`). -/// -/// `hm` is a required field. There is no `Option`: the type *is* the -/// equality capability. A payload without `hm` cannot be deserialized into -/// this type — the Rust analogue of the SQL domain's CHECK constraint. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -pub struct Int4Eq { - /// Schema version. - pub v: u16, - /// Table/column identifier. - pub i: Identifier, - /// mp_base85 ciphertext. Required. - pub c: String, - /// HMAC-SHA256 equality term. Required. - pub hm: String, -} - -/// `eql_v2_int4_ord` — equality + ORE-block range (`=` `<>` `<` `<=` `>` `>=`). -/// -/// Deliberately carries no `hm`: ORE over a full-domain `int4` is lossless, so -/// the order term `ob` doubles as an exact equality term. -/// (`eql_v2_int4_ord_ore` in #225 is the same shape under a scheme-explicit -/// name — structurally identical, so it is not a separate Rust type.) -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -pub struct Int4Ord { - /// Schema version. - pub v: u16, - /// Table/column identifier. - pub i: Identifier, - /// mp_base85 ciphertext. Required. - pub c: String, - /// Block ORE term. Required — serves both range and equality. - pub ob: Vec, -} - -// =========================================================================== -// PROPOSAL (beyond #225) — a self-describing wire discriminator -// =========================================================================== -// -// On the wire, an int4 payload is discriminated only by *which key is present* -// (`hm` vs `ob`). The SQL domain name carries the rest — but once the JSON -// leaves SQL (into protect-ffi, into TypeScript, into a log line) that -// information is gone and a consumer is back to sniffing keys: the same -// untagged failure mode that produced the original protect-dynamodb bug. -// -// While the int4 family is still pre-release, a one-field capability tag `x` -// makes every payload self-describing and gives Rust / TS / SQL a single -// literal discriminant. This is the tagged-union lesson applied to a type we -// are still free to change. - -/// **Proposed.** Self-describing int4 payload — `x` is the capability tag. -/// -/// Generates a clean TypeScript discriminated union (`switch (p.x)` with -/// exhaustiveness) and a JSON Schema `oneOf` with a per-branch `const`. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -#[serde(tag = "x")] -pub enum Int4Tagged { - /// `x: "int4"` — storage only. - #[serde(rename = "int4")] - Storage { - v: u16, - i: Identifier, - c: String, - }, - /// `x: "int4_eq"` — HMAC equality. - #[serde(rename = "int4_eq")] - Eq { - v: u16, - i: Identifier, - c: String, - hm: String, - }, - /// `x: "int4_ord"` — equality + ORE-block range. - #[serde(rename = "int4_ord")] - Ord { - v: u16, - i: Identifier, - c: String, - ob: Vec, - }, -} diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index 5382ebfbe..5a5a2af1e 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -11,9 +11,11 @@ //! - [`v2_3`] — **FROZEN.** The `eql_v2_encrypted` wire contract, in production //! use by customers. Mirrors `eql-payload-v2.3.schema.json`, imperfections //! included. Nothing here may change. -//! - [`int4`] — **NEW** (targets EQL 2.4). Design freedom. Demonstrates -//! *capability-encoded types* — the pattern that removes the runtime -//! index-term guessing `eql_v2_encrypted` forces onto every consumer. +//! - [`v3`] — the `eql_v3` schema's encrypted-domain types: one struct per +//! SQL domain (`eql_v3.int4_eq`, `eql_v3.text_match`, …), *capability-encoded* +//! — index terms are required fields, never `Option`. Mirrors +//! `eql-scalars::CATALOG` 1:1, enforced by `tests/catalog_parity.rs`. +//! The wire envelope version stays `v: 2` — see the [`v3`] module docs. //! //! ## Codegen rules (learned from the ts-rs spike) //! @@ -28,8 +30,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; -pub mod int4; pub mod v2_3; +pub mod v3; /// EQL wire-format version. Hard-coded to `2` for every v2.x payload. pub const EQL_SCHEMA_VERSION: u16 = 2; diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs new file mode 100644 index 000000000..be7dc0688 --- /dev/null +++ b/crates/eql-types/src/v3/date.rs @@ -0,0 +1,35 @@ +//! The `date` encrypted-domain family — an ordered, non-integer scalar. +//! Same four-domain ordered shape as [`crate::v3::int4`] (ORE compares +//! ciphertext, so dates order like integers); see that module for the +//! capability table. + +use crate::v3::eql_v3_domain; +use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; + +eql_v3_domain!( + /// `eql_v3.date` — storage only; every operator is blocked. + Date, domain = "date"); + +eql_v3_domain!( +/// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). +DateEq, domain = "date_eq", +terms { + /// HMAC-SHA-256 equality term. + hm: Hmac256, +}); + +eql_v3_domain!( +/// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. +DateOrdOre, domain = "date_ord_ore", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); + +eql_v3_domain!( +/// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +DateOrd, domain = "date_ord", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs new file mode 100644 index 000000000..a573033c7 --- /dev/null +++ b/crates/eql-types/src/v3/int2.rs @@ -0,0 +1,33 @@ +//! The `int2` encrypted-domain family. Same four-domain ordered shape as +//! [`crate::v3::int4`] — see that module for the capability table. + +use crate::v3::eql_v3_domain; +use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; + +eql_v3_domain!( + /// `eql_v3.int2` — storage only; every operator is blocked. + Int2, domain = "int2"); + +eql_v3_domain!( +/// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). +Int2Eq, domain = "int2_eq", +terms { + /// HMAC-SHA-256 equality term. + hm: Hmac256, +}); + +eql_v3_domain!( +/// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. +Int2OrdOre, domain = "int2_ord_ore", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); + +eql_v3_domain!( +/// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +Int2Ord, domain = "int2_ord", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs new file mode 100644 index 000000000..7a2350a33 --- /dev/null +++ b/crates/eql-types/src/v3/int4.rs @@ -0,0 +1,41 @@ +//! The `int4` encrypted-domain family — the reference scalar. +//! +//! | Rust type | SQL domain | Required keys | Operators | +//! |----------------|------------------------|---------------|----------------------------| +//! | [`Int4`] | `eql_v3.int4` | `v` `i` `c` | none (storage only) | +//! | [`Int4Eq`] | `eql_v3.int4_eq` | `v` `i` `c` `hm` | `=` `<>` | +//! | [`Int4OrdOre`] | `eql_v3.int4_ord_ore` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | +//! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | + +use crate::v3::eql_v3_domain; +use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; + +eql_v3_domain!( + /// `eql_v3.int4` — storage only; every operator is blocked. + Int4, domain = "int4"); + +eql_v3_domain!( +/// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). +Int4Eq, domain = "int4_eq", +terms { + /// HMAC-SHA-256 equality term. + hm: Hmac256, +}); + +eql_v3_domain!( +/// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), +/// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. +Int4OrdOre, domain = "int4_ord_ore", +terms { + /// Block-ORE order term. Serves equality too — ORE over a + /// full-domain `int4` is lossless, so no separate `hm` is carried. + ob: OreBlockU64_8_256, +}); + +eql_v3_domain!( +/// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +Int4Ord, domain = "int4_ord", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs new file mode 100644 index 000000000..e550c8c1a --- /dev/null +++ b/crates/eql-types/src/v3/int8.rs @@ -0,0 +1,33 @@ +//! The `int8` encrypted-domain family. Same four-domain ordered shape as +//! [`crate::v3::int4`] — see that module for the capability table. + +use crate::v3::eql_v3_domain; +use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; + +eql_v3_domain!( + /// `eql_v3.int8` — storage only; every operator is blocked. + Int8, domain = "int8"); + +eql_v3_domain!( +/// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). +Int8Eq, domain = "int8_eq", +terms { + /// HMAC-SHA-256 equality term. + hm: Hmac256, +}); + +eql_v3_domain!( +/// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. +Int8OrdOre, domain = "int8_ord_ore", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); + +eql_v3_domain!( +/// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +Int8Ord, domain = "int8_ord", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs new file mode 100644 index 000000000..c8ffdd8b5 --- /dev/null +++ b/crates/eql-types/src/v3/mod.rs @@ -0,0 +1,80 @@ +//! # `eql_v3` domain payload types +//! +//! One Rust struct per **SQL domain** in the `eql_v3` schema — the +//! capability-encoded design from the [`crate::int4`] prototype, formalized: +//! the SQL surface is generated from `eql-scalars::CATALOG`, and these types +//! mirror it 1:1 (enforced by `tests/catalog_parity.rs`, which fails if the +//! catalog and this module ever disagree on domains or required wire keys). +//! +//! **Versioning.** "v3" is the SQL schema generation (`eql_v3.*` domains). +//! The JSON envelope version is still `v: 2` ([`crate::EQL_SCHEMA_VERSION`]) — +//! every generated domain CHECK asserts `VALUE->>'v' = '2'`, and the wire +//! field names are unchanged from v2 (`hm`/`ob`/`bf`; the purpose-named +//! rename in the payload-scheme-discipline RFC is deferred). +//! +//! ## Shape of every payload +//! +//! Envelope (required by every domain CHECK): `v`, `i`, `c`. Then the +//! domain's required term keys — `hm` for `_eq`, `ob` for `_ord`/`_ord_ore`, +//! `bf` for `_match`, none for storage-only. `Option` does not appear in +//! this module: the capability **is** the type identity. Hold a +//! [`int4::Int4Eq`] and `hm` is present, guaranteed by the Rust type and +//! (SQL-side) by the domain CHECK. +//! +//! ## Why there is no discriminated enum +//! +//! Cross-token: impossible — an `int4_eq` and an `int8_eq` payload are +//! byte-identical on the wire (`v`/`i`/`c`/`hm`); nothing discriminates them. +//! Per-token: deliberately omitted — an untagged enum over a token's domains +//! would discriminate by key-sniffing, the exact `v2_3::SteVecTerm` failure +//! mode this tier exists to retire, and `_ord` vs `_ord_ore` are identical +//! shapes that no sniffing can separate. Consumers read from a typed column +//! and already know the domain. + +pub mod date; +pub mod int2; +pub mod int4; +pub mod int8; +pub mod registry; +pub mod terms; +pub mod text; +pub mod timestamptz; + +/// The PostgreSQL schema every domain in this module inhabits. +pub const SQL_SCHEMA: &str = "eql_v3"; + +/// Defines one `eql_v3` domain payload type: the required envelope +/// (`v`, `i`, `c` — mirrors `ENVELOPE_KEYS` in `eql-codegen/src/consts.rs`) +/// plus the domain's required term fields. No `Option`, ever — a missing +/// term key is a deserialization error, the Rust analogue of the SQL +/// domain's CHECK constraint. +macro_rules! eql_v3_domain { + ( + $(#[$meta:meta])* + $name:ident, domain = $domain:literal + $(, terms { $( $(#[$tmeta:meta])* $tkey:ident : $tty:ty ),+ $(,)? })? + ) => { + $(#[$meta])* + #[derive(Clone, Debug, PartialEq, ::serde::Serialize, ::serde::Deserialize, + ::ts_rs::TS, ::schemars::JsonSchema)] + #[ts(export, export_to = "v3/")] + pub struct $name { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: $crate::Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: $crate::v3::terms::Ciphertext, + $($( + $(#[$tmeta])* + pub $tkey: $tty, + )+)? + } + + impl $name { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = concat!("eql_v3.", $domain); + } + }; +} +pub(crate) use eql_v3_domain; diff --git a/crates/eql-types/src/v3/registry.rs b/crates/eql-types/src/v3/registry.rs new file mode 100644 index 000000000..928440a35 --- /dev/null +++ b/crates/eql-types/src/v3/registry.rs @@ -0,0 +1,72 @@ +//! Runtime registry of every v3 domain type — the one hand-maintained +//! mapping from SQL domain name to Rust type. +//! +//! Three consumers: `tests/catalog_parity.rs` (asserts this list exactly +//! covers `eql-scalars::CATALOG`, so it cannot silently go stale), the +//! generic round-trip loop in `tests/v3_conformance.rs`, and the JSON Schema +//! exporter in `tests/export.rs`. Public so FFI consumers can enumerate the +//! protocol surface too. + +use schemars::{schema::RootSchema, schema_for, JsonSchema}; +use serde::{de::DeserializeOwned, Serialize}; + +use crate::v3::{date, int2, int4, int8, text, timestamptz}; + +/// One registered v3 domain type. +pub struct DomainType { + /// Unqualified SQL domain name (e.g. `"int4_eq"`) — matches + /// `eql-scalars` `ScalarSpec::domain_name`. + pub domain: &'static str, + /// The Rust type's full path (via `std::any::type_name`). + pub type_name: &'static str, + /// The type's JSON Schema. + pub schema: fn() -> RootSchema, + /// serde round-trip through the concrete type + /// (`Value` → `T` → `Value`). + pub roundtrip: fn(serde_json::Value) -> Result, +} + +fn entry(domain: &'static str) -> DomainType +where + T: DeserializeOwned + Serialize + JsonSchema, +{ + DomainType { + domain, + type_name: std::any::type_name::(), + schema: || schema_for!(T), + roundtrip: |value| { + let parsed: T = serde_json::from_value(value)?; + serde_json::to_value(&parsed) + }, + } +} + +/// Every v3 domain type, in `eql-scalars::CATALOG` order (token order, then +/// each token's domains in manifest order). +pub fn all() -> Vec { + vec![ + entry::("int4"), + entry::("int4_eq"), + entry::("int4_ord_ore"), + entry::("int4_ord"), + entry::("int2"), + entry::("int2_eq"), + entry::("int2_ord_ore"), + entry::("int2_ord"), + entry::("int8"), + entry::("int8_eq"), + entry::("int8_ord_ore"), + entry::("int8_ord"), + entry::("date"), + entry::("date_eq"), + entry::("date_ord_ore"), + entry::("date_ord"), + entry::("timestamptz"), + entry::("timestamptz_eq"), + entry::("text"), + entry::("text_eq"), + entry::("text_match"), + entry::("text_ord_ore"), + entry::("text_ord"), + ] +} diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs new file mode 100644 index 000000000..26067df55 --- /dev/null +++ b/crates/eql-types/src/v3/terms.rs @@ -0,0 +1,71 @@ +//! Reusable wire-field newtypes shared by every v3 domain payload. +//! +//! Each newtype serializes as its inner value (serde's newtype-struct +//! default), so the wire shape is unchanged — but the *name* survives +//! codegen: ts-rs exports a named TS alias (`export type Hmac256 = string`) +//! that every domain binding imports, and schemars registers a named +//! definition that every domain schema `$ref`s. A plain Rust `type` alias +//! would vanish in both outputs. +//! +//! Names follow the SEM constructor names in `eql-scalars` (`Term::ctor()`): +//! a future scheme change (e.g. a 12-block wide ORE term for timestamptz +//! ordering) is a new newtype, not a hunt through `Vec` fields. + +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +/// mp_base85 source ciphertext — the `c` envelope key. +/// +/// Required by every v3 domain CHECK; present on every payload. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Ciphertext(pub String); + +/// HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains +/// (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Hmac256(pub String); + +/// Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the +/// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless +/// over the scalar's domain, so it serves equality too. SQL-side constructor: +/// `eql_v3.ore_block_u64_8_256`. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct OreBlockU64_8_256(pub Vec); + +/// Bloom-filter match term — the `bf` wire key. Backs the `_match` domains +/// (`~~` containment via `@>`/`<@`). +/// +/// **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, +/// and filters sized above 32768 emit upper-half bit positions as negative +/// signed values (same rationale as `v2_3::EncryptedPayload::bf`). +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct BloomFilter(pub Vec); + +impl From for Ciphertext { + fn from(value: String) -> Self { + Self(value) + } +} + +impl From for Hmac256 { + fn from(value: String) -> Self { + Self(value) + } +} + +impl From> for OreBlockU64_8_256 { + fn from(value: Vec) -> Self { + Self(value) + } +} + +impl From> for BloomFilter { + fn from(value: Vec) -> Self { + Self(value) + } +} diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs new file mode 100644 index 000000000..6fb52c6a5 --- /dev/null +++ b/crates/eql-types/src/v3/text.rs @@ -0,0 +1,44 @@ +//! The `text` encrypted-domain family — the ordered shape of +//! [`crate::v3::int4`] plus a `_match` domain backed by the Bloom-filter +//! term (`@>`/`<@` containment for `LIKE`-style matching). + +use crate::v3::eql_v3_domain; +use crate::v3::terms::{BloomFilter, Hmac256, OreBlockU64_8_256}; + +eql_v3_domain!( + /// `eql_v3.text` — storage only; every operator is blocked. + Text, domain = "text"); + +eql_v3_domain!( +/// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). +TextEq, domain = "text_eq", +terms { + /// HMAC-SHA-256 equality term. + hm: Hmac256, +}); + +eql_v3_domain!( +/// `eql_v3.text_match` — Bloom-filter containment match. +TextMatch, domain = "text_match", +terms { + /// Bloom-filter match term (signed smallint bit positions). + bf: BloomFilter, +}); + +eql_v3_domain!( +/// `eql_v3.text_ord_ore` — full lexicographic comparison, +/// scheme-explicit name. +TextOrdOre, domain = "text_ord_ore", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); + +eql_v3_domain!( +/// `eql_v3.text_ord` — full lexicographic comparison +/// (`=` `<>` `<` `<=` `>` `>=`). +TextOrd, domain = "text_ord", +terms { + /// Block-ORE order term. Serves equality too. + ob: OreBlockU64_8_256, +}); diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs new file mode 100644 index 000000000..ba93835f5 --- /dev/null +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -0,0 +1,20 @@ +//! The `timestamptz` encrypted-domain family — **equality-only** (storage + +//! `_eq`). There is no ordered domain: cipherstash encrypts timestamps at +//! native 12-block ORE width, but EQL's only ORE comparator is hardcoded to +//! 8 blocks, so an ordered timestamptz domain would silently mis-order. +//! Ordering arrives with a future wide-ORE term (see `eql-scalars`). + +use crate::v3::eql_v3_domain; +use crate::v3::terms::Hmac256; + +eql_v3_domain!( + /// `eql_v3.timestamptz` — storage only; every operator is blocked. + Timestamptz, domain = "timestamptz"); + +eql_v3_domain!( +/// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). +TimestamptzEq, domain = "timestamptz_eq", +terms { + /// HMAC-SHA-256 equality term. + hm: Hmac256, +}); diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs new file mode 100644 index 000000000..64a977dd4 --- /dev/null +++ b/crates/eql-types/tests/catalog_parity.rs @@ -0,0 +1,63 @@ +//! The drift gate: the v3 registry must mirror `eql-scalars::CATALOG` — the +//! same catalog that generates the `eql_v3` SQL surface — exactly. Append a +//! scalar to the catalog without adding its types here and the first test +//! fails; let a term field become `Option` (or carry the wrong wire key) and +//! the second fails, because schemars `required` reflects the real serde +//! contract. + +use std::collections::BTreeSet; + +use eql_scalars::{Term, CATALOG}; +use eql_types::v3::registry; + +/// Mirrors `ENVELOPE_KEYS` in `eql-codegen/src/consts.rs` (`pub(crate)` +/// there, so restated here): the keys every generated domain CHECK requires +/// before its term keys. +const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; + +#[test] +fn registry_exactly_covers_catalog() { + let expected: Vec = CATALOG + .iter() + .flat_map(|spec| spec.domains.iter().map(|d| spec.domain_name(d))) + .collect(); + let actual: Vec<&str> = registry::all().iter().map(|e| e.domain).collect(); + assert_eq!( + actual, expected, + "v3 registry must list every CATALOG domain, in catalog order" + ); +} + +#[test] +fn required_keys_match_catalog_terms() { + let entries = registry::all(); + for spec in CATALOG { + for domain in spec.domains { + let name = spec.domain_name(domain); + let entry = entries + .iter() + .find(|e| e.domain == name) + .unwrap_or_else(|| panic!("no registry entry for {name}")); + + let schema = (entry.schema)(); + let object = schema + .schema + .object + .as_ref() + .unwrap_or_else(|| panic!("{name}: schema is not an object")); + let required: BTreeSet<&str> = object.required.iter().map(String::as_str).collect(); + + let expected: BTreeSet<&str> = ENVELOPE_KEYS + .iter() + .copied() + .chain(Term::term_json_keys(domain.terms)) + .collect(); + + assert_eq!( + required, expected, + "{name} ({}): required wire keys must be envelope + catalog terms", + entry.type_name + ); + } + } +} diff --git a/crates/eql-types/tests/conformance.rs b/crates/eql-types/tests/conformance.rs index 9d13cd70b..bc68086ab 100644 --- a/crates/eql-types/tests/conformance.rs +++ b/crates/eql-types/tests/conformance.rs @@ -1,8 +1,9 @@ -//! Conformance fixtures — the real guarantee that Rust / TS / JSON Schema and -//! the wire format agree. Codegen guarantees *shape*; these round-trips -//! guarantee *behaviour*. +//! Conformance fixtures for the FROZEN v2.3 tier — the real guarantee that +//! Rust / TS / JSON Schema and the wire format agree. Codegen guarantees +//! *shape*; these round-trips guarantee *behaviour*. +//! +//! v3 conformance lives in `v3_conformance.rs`; schema export in `export.rs`. -use eql_types::int4::{Int4Eq, Int4Tagged}; use eql_types::v2_3::EqlEncrypted; use serde_json::json; @@ -18,32 +19,6 @@ fn v2_3_scalar_round_trips() { assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); } -#[test] -fn int4_eq_round_trips() { - let wire = json!({ - "v": 2, - "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext", - "hm": "deadbeef" - }); - let parsed: Int4Eq = serde_json::from_value(wire.clone()).unwrap(); - assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); -} - -#[test] -fn int4_eq_rejects_missing_hmac() { - // The capability is type-enforced: an `int4_eq` payload with no `hm` is - // not representable. This is the bug class — a search term missing its - // index term — closed at the type boundary, before any consumer runs. - let no_hm = json!({ - "v": 2, - "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext" - }); - let result: Result = serde_json::from_value(no_hm); - assert!(result.is_err(), "Int4Eq must reject a payload with no hm"); -} - #[test] fn legacy_payload_silently_accepts_missing_terms() { // Contrast: the frozen v2.3 scalar type accepts a payload carrying no @@ -122,34 +97,3 @@ fn v2_3_ste_vec_round_trips() { assert!(matches!(parsed, EqlEncrypted::Sv(_))); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); } - -#[test] -fn int4_tagged_proposal_round_trips_and_discriminates() { - let wire = json!({ - "x": "int4_eq", "v": 2, - "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext", - "hm": "deadbeef" - }); - let parsed: Int4Tagged = serde_json::from_value(wire.clone()).unwrap(); - assert!(matches!(parsed, Int4Tagged::Eq { .. })); - assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); -} - -#[test] -fn dump_json_schemas() { - use schemars::schema_for; - std::fs::create_dir_all("schema").unwrap(); - let schemas = [ - ("EqlEncrypted", schema_for!(EqlEncrypted)), - ("Int4Eq", schema_for!(Int4Eq)), - ("Int4Tagged", schema_for!(Int4Tagged)), - ]; - for (name, schema) in schemas { - std::fs::write( - format!("schema/{name}.json"), - serde_json::to_string_pretty(&schema).unwrap(), - ) - .unwrap(); - } -} diff --git a/crates/eql-types/tests/export.rs b/crates/eql-types/tests/export.rs new file mode 100644 index 000000000..08f78ade3 --- /dev/null +++ b/crates/eql-types/tests/export.rs @@ -0,0 +1,40 @@ +//! JSON Schema export — runs during `cargo test` (alongside ts-rs's own +//! export tests, which write `bindings/`). Output is checked in; freshness is +//! enforced by `mise run types:check`. v3 schema files are named after the +//! SQL domain — the protocol identity — not the Rust type. + +use eql_types::v2_3::EqlEncrypted; +use eql_types::v3::registry; +use schemars::schema_for; + +#[test] +fn dump_v2_3_json_schemas() { + std::fs::create_dir_all("schema").unwrap(); + std::fs::write( + "schema/EqlEncrypted.json", + serde_json::to_string_pretty(&schema_for!(EqlEncrypted)).unwrap(), + ) + .unwrap(); +} + +#[test] +fn dump_v3_json_schemas() { + std::fs::create_dir_all("schema/v3").unwrap(); + for entry in registry::all() { + let mut schema = serde_json::to_value((entry.schema)()).unwrap(); + // schemars 0.8 emits no $id; inject the canonical one. + schema.as_object_mut().unwrap().insert( + "$id".into(), + format!( + "https://schemas.cipherstash.com/eql/v3/{}.json", + entry.domain + ) + .into(), + ); + std::fs::write( + format!("schema/v3/{}.json", entry.domain), + serde_json::to_string_pretty(&schema).unwrap(), + ) + .unwrap(); + } +} diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs new file mode 100644 index 000000000..51aa8cb5a --- /dev/null +++ b/crates/eql-types/tests/v3_conformance.rs @@ -0,0 +1,158 @@ +//! Conformance for the v3 tier: explicit per-domain tests for the reference +//! token (`int4`, plus the term shapes it doesn't carry), then a generic +//! sweep over the whole registry — every domain type round-trips its wire +//! shape and rejects a payload missing any required key. + +use eql_types::v3::int4::{Int4, Int4Eq, Int4Ord, Int4OrdOre}; +use eql_types::v3::registry; +use eql_types::v3::text::TextMatch; +use serde_json::{json, Value}; + +#[test] +fn int4_storage_round_trips() { + let wire = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext" + }); + let parsed: Int4 = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); + assert_eq!(Int4::SQL_DOMAIN, "eql_v3.int4"); +} + +#[test] +fn int4_eq_round_trips() { + let wire = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let parsed: Int4Eq = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); + assert_eq!(Int4Eq::SQL_DOMAIN, "eql_v3.int4_eq"); +} + +#[test] +fn int4_ord_round_trips() { + let wire = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "ob": ["ore_block_0", "ore_block_1"] + }); + let parsed: Int4Ord = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); + // `_ord_ore` is the same shape under the scheme-explicit domain name. + let parsed: Int4OrdOre = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); + assert_eq!(Int4OrdOre::SQL_DOMAIN, "eql_v3.int4_ord_ore"); +} + +#[test] +fn int4_eq_rejects_missing_hmac() { + // The capability is type-enforced: an `int4_eq` payload with no `hm` is + // not representable. This is the bug class — a search term missing its + // index term — closed at the type boundary, before any consumer runs. + let no_hm = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext" + }); + let result: Result = serde_json::from_value(no_hm); + assert!(result.is_err(), "Int4Eq must reject a payload with no hm"); +} + +#[test] +fn int4_ord_rejects_missing_ore_term() { + let no_ob = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let result: Result = serde_json::from_value(no_ob); + assert!(result.is_err(), "Int4Ord must reject a payload with no ob"); +} + +#[test] +fn text_match_round_trips_signed_bloom_filter() { + // `bf` is signed i16 (smallint[]): filters sized above 32768 emit + // upper-half bit positions as negative values. + let wire = json!({ + "v": 2, + "i": { "t": "users", "c": "email" }, + "c": "mp_base85_ciphertext", + "bf": [-1, -32768, 32767, 0] + }); + let parsed: TextMatch = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); + + let no_bf = json!({ + "v": 2, + "i": { "t": "users", "c": "email" }, + "c": "mp_base85_ciphertext" + }); + let result: Result = serde_json::from_value(no_bf); + assert!( + result.is_err(), + "TextMatch must reject a payload with no bf" + ); +} + +/// A synthetic wire value for a required key, by key name. +fn synthesize(key: &str) -> Value { + match key { + "v" => json!(2), + "i" => json!({ "t": "users", "c": "field" }), + "c" => json!("mp_base85_ciphertext"), + "hm" => json!("deadbeef"), + "ob" => json!(["ore_block_0", "ore_block_1"]), + "bf" => json!([-1, 0, 32767]), + other => panic!("no synthetic value for unexpected required key {other:?}"), + } +} + +/// The registry sweep: every domain type round-trips a payload synthesized +/// from its schema's required keys, and rejects the payload with any one +/// required key removed. (That the required keys are the *right* ones is +/// `catalog_parity.rs`'s job.) +#[test] +fn every_registered_domain_round_trips_and_rejects_missing_keys() { + for entry in registry::all() { + let schema = (entry.schema)(); + let required: Vec = schema + .schema + .object + .as_ref() + .expect("object schema") + .required + .iter() + .cloned() + .collect(); + assert!(!required.is_empty(), "{}: no required keys", entry.domain); + + let full: Value = required + .iter() + .map(|k| (k.clone(), synthesize(k))) + .collect::>() + .into(); + let round_tripped = (entry.roundtrip)(full.clone()) + .unwrap_or_else(|e| panic!("{}: round-trip failed: {e}", entry.domain)); + assert_eq!( + round_tripped, full, + "{}: round-trip not identity", + entry.domain + ); + + for key in &required { + let mut partial = full.clone(); + partial.as_object_mut().unwrap().remove(key); + assert!( + (entry.roundtrip)(partial).is_err(), + "{}: must reject payload missing required key {key:?}", + entry.domain + ); + } + } +} diff --git a/mise.toml b/mise.toml index f7ff6bde7..0b21da899 100644 --- a/mise.toml +++ b/mise.toml @@ -143,11 +143,12 @@ description = "Compile, lint and test the std-only Rust workspace crates (no dat dir = "{{config_root}}" run = """ #!/usr/bin/env bash -# eql-scalars / eql-codegen / eql-tests-macros are the lean workspace members. -# Scope explicitly to them (NOT --workspace): a workspace-wide test would drag -# in tests/sqlx, whose suite needs Postgres + CS_* secrets and is already -# covered by the `test` job. eql-tests-macros only pulls syn/quote/proc-macro2, -# so it stays in the lean set. clippy is likewise scoped — a workspace clippy +# eql-scalars / eql-codegen / eql-tests-macros / eql-types are the lean +# workspace members. Scope explicitly to them (NOT --workspace): a +# workspace-wide test would drag in tests/sqlx, whose suite needs Postgres + +# CS_* secrets and is already covered by the `test` job. eql-tests-macros only +# pulls syn/quote/proc-macro2 and eql-types only serde/ts-rs/schemars, so they +# stay in the lean set. clippy is likewise scoped — a workspace clippy # recompiles the heavy sqlx/tokio/cipherstash-client tree for no added coverage # of these crates. # bash is pinned via the `#!/usr/bin/env bash` shebang above (mise honors a @@ -155,8 +156,43 @@ run = """ # /bin/sh (dash on the CI images). set -euo pipefail cargo fmt --check -cargo clippy -p eql-scalars -p eql-codegen -p eql-tests-macros --all-targets -- -D warnings -cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros +cargo clippy -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types --all-targets -- -D warnings +cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types +""" + +[tasks."types:generate"] +description = "Regenerate eql-types TypeScript bindings and JSON Schemas from the Rust types (no database required)" +dir = "{{config_root}}" +run = """ +#!/usr/bin/env bash +# Clean-then-regenerate: ts-rs and tests/export.rs only ever ADD files, so a +# renamed or removed type would otherwise leave an orphaned binding/schema +# behind. The rm lives here (not in the tests — they run in parallel). +# v2.3 outputs at the top level of bindings/ and schema/ are frozen alongside +# their types and are regenerated in place, not cleaned. +set -euo pipefail +rm -rf crates/eql-types/bindings/v3 crates/eql-types/schema/v3 +cargo test -p eql-types +""" + +[tasks."types:check"] +description = "Verify the checked-in eql-types bindings/ and schema/ are fresh (regenerate + git diff)" +dir = "{{config_root}}" +depends = ["types:generate"] +run = """ +#!/usr/bin/env bash +set -euo pipefail +git diff --exit-code -- crates/eql-types/bindings crates/eql-types/schema || { + echo "eql-types bindings/ or schema/ are stale — run 'mise run types:generate' and commit the result" >&2 + exit 1 +} +# git diff is blind to brand-new files; untracked output is stale too. +untracked=$(git ls-files --others --exclude-standard -- crates/eql-types/bindings crates/eql-types/schema) +if [ -n "$untracked" ]; then + echo "eql-types has uncommitted generated files:" >&2 + echo "$untracked" >&2 + exit 1 +fi """ [tasks."test:matrix:inventory"] From 119dc7c75b6c23bff26216fb572b498efc3f6a80 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Wed, 10 Jun 2026 20:43:11 +1000 Subject: [PATCH 167/599] refactor(eql-types): unroll eql_v3_domain! macro into explicit structs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The macro hid exactly what a protocol crate exists to show — the struct definitions. Its only real guarantee (envelope uniformity) is already covered by the catalog parity tests, rustfmt could not format the invocations, and 'pub struct Int4Eq' was un-greppable. Each domain is now a plain hand-written struct with the same fields, derives, doc comments, and SQL_DOMAIN const the macro emitted; bindings/ and schema/ regenerate byte-identical (verified: empty git diff after types:generate). --- crates/eql-types/src/v3/date.rs | 89 +++++++++++++++----- crates/eql-types/src/v3/int2.rs | 89 +++++++++++++++----- crates/eql-types/src/v3/int4.rs | 89 +++++++++++++++----- crates/eql-types/src/v3/int8.rs | 89 +++++++++++++++----- crates/eql-types/src/v3/mod.rs | 51 ++---------- crates/eql-types/src/v3/text.rs | 110 +++++++++++++++++++------ crates/eql-types/src/v3/timestamptz.rs | 47 ++++++++--- 7 files changed, 407 insertions(+), 157 deletions(-) diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index be7dc0688..be820930c 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -3,33 +3,82 @@ //! ciphertext, so dates order like integers); see that module for the //! capability table. -use crate::v3::eql_v3_domain; -use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; -eql_v3_domain!( - /// `eql_v3.date` — storage only; every operator is blocked. - Date, domain = "date"); +/// `eql_v3.date` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Date { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl Date { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.date"; +} -eql_v3_domain!( /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). -DateEq, domain = "date_eq", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct DateEq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// HMAC-SHA-256 equality term. - hm: Hmac256, -}); + pub hm: Hmac256, +} + +impl DateEq { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.date_eq"; +} -eql_v3_domain!( /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. -DateOrdOre, domain = "date_ord_ore", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct DateOrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl DateOrdOre { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.date_ord_ore"; +} -eql_v3_domain!( /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -DateOrd, domain = "date_ord", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct DateOrd { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl DateOrd { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.date_ord"; +} diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index a573033c7..a587d2f2e 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -1,33 +1,82 @@ //! The `int2` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. -use crate::v3::eql_v3_domain; -use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; -eql_v3_domain!( - /// `eql_v3.int2` — storage only; every operator is blocked. - Int2, domain = "int2"); +/// `eql_v3.int2` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int2 { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl Int2 { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int2"; +} -eql_v3_domain!( /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). -Int2Eq, domain = "int2_eq", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int2Eq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// HMAC-SHA-256 equality term. - hm: Hmac256, -}); + pub hm: Hmac256, +} + +impl Int2Eq { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int2_eq"; +} -eql_v3_domain!( /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. -Int2OrdOre, domain = "int2_ord_ore", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int2OrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl Int2OrdOre { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int2_ord_ore"; +} -eql_v3_domain!( /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -Int2Ord, domain = "int2_ord", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int2Ord { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl Int2Ord { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int2_ord"; +} diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index 7a2350a33..e1768156d 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -7,35 +7,84 @@ //! | [`Int4OrdOre`] | `eql_v3.int4_ord_ore` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | //! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | -use crate::v3::eql_v3_domain; -use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; -eql_v3_domain!( - /// `eql_v3.int4` — storage only; every operator is blocked. - Int4, domain = "int4"); +/// `eql_v3.int4` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int4 { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl Int4 { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int4"; +} -eql_v3_domain!( /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). -Int4Eq, domain = "int4_eq", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int4Eq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// HMAC-SHA-256 equality term. - hm: Hmac256, -}); + pub hm: Hmac256, +} + +impl Int4Eq { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int4_eq"; +} -eql_v3_domain!( /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), /// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. -Int4OrdOre, domain = "int4_ord_ore", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int4OrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too — ORE over a /// full-domain `int4` is lossless, so no separate `hm` is carried. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl Int4OrdOre { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int4_ord_ore"; +} -eql_v3_domain!( /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -Int4Ord, domain = "int4_ord", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int4Ord { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl Int4Ord { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int4_ord"; +} diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index e550c8c1a..7b906a6ac 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -1,33 +1,82 @@ //! The `int8` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. -use crate::v3::eql_v3_domain; -use crate::v3::terms::{Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; -eql_v3_domain!( - /// `eql_v3.int8` — storage only; every operator is blocked. - Int8, domain = "int8"); +/// `eql_v3.int8` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int8 { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl Int8 { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int8"; +} -eql_v3_domain!( /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). -Int8Eq, domain = "int8_eq", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int8Eq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// HMAC-SHA-256 equality term. - hm: Hmac256, -}); + pub hm: Hmac256, +} + +impl Int8Eq { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int8_eq"; +} -eql_v3_domain!( /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. -Int8OrdOre, domain = "int8_ord_ore", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int8OrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl Int8OrdOre { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int8_ord_ore"; +} -eql_v3_domain!( /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -Int8Ord, domain = "int8_ord", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Int8Ord { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl Int8Ord { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.int8_ord"; +} diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index c8ffdd8b5..2d0f78479 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -1,7 +1,8 @@ //! # `eql_v3` domain payload types //! //! One Rust struct per **SQL domain** in the `eql_v3` schema — the -//! capability-encoded design from the [`crate::int4`] prototype, formalized: +//! capability-encoded design from the original `eql_v2_int4` prototype +//! (PR #236's first cut), formalized: //! the SQL surface is generated from `eql-scalars::CATALOG`, and these types //! mirror it 1:1 (enforced by `tests/catalog_parity.rs`, which fails if the //! catalog and this module ever disagree on domains or required wire keys). @@ -14,12 +15,14 @@ //! //! ## Shape of every payload //! -//! Envelope (required by every domain CHECK): `v`, `i`, `c`. Then the -//! domain's required term keys — `hm` for `_eq`, `ob` for `_ord`/`_ord_ore`, -//! `bf` for `_match`, none for storage-only. `Option` does not appear in -//! this module: the capability **is** the type identity. Hold a +//! Envelope (required by every domain CHECK, mirroring `ENVELOPE_KEYS` in +//! `eql-codegen/src/consts.rs`): `v`, `i`, `c`. Then the domain's required +//! term keys — `hm` for `_eq`, `ob` for `_ord`/`_ord_ore`, `bf` for +//! `_match`, none for storage-only. `Option` does not appear in this +//! module: the capability **is** the type identity. Hold a //! [`int4::Int4Eq`] and `hm` is present, guaranteed by the Rust type and -//! (SQL-side) by the domain CHECK. +//! (SQL-side) by the domain CHECK. A missing term key is a deserialization +//! error — the Rust analogue of the CHECK constraint. //! //! ## Why there is no discriminated enum //! @@ -42,39 +45,3 @@ pub mod timestamptz; /// The PostgreSQL schema every domain in this module inhabits. pub const SQL_SCHEMA: &str = "eql_v3"; - -/// Defines one `eql_v3` domain payload type: the required envelope -/// (`v`, `i`, `c` — mirrors `ENVELOPE_KEYS` in `eql-codegen/src/consts.rs`) -/// plus the domain's required term fields. No `Option`, ever — a missing -/// term key is a deserialization error, the Rust analogue of the SQL -/// domain's CHECK constraint. -macro_rules! eql_v3_domain { - ( - $(#[$meta:meta])* - $name:ident, domain = $domain:literal - $(, terms { $( $(#[$tmeta:meta])* $tkey:ident : $tty:ty ),+ $(,)? })? - ) => { - $(#[$meta])* - #[derive(Clone, Debug, PartialEq, ::serde::Serialize, ::serde::Deserialize, - ::ts_rs::TS, ::schemars::JsonSchema)] - #[ts(export, export_to = "v3/")] - pub struct $name { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, - /// Table/column identifier. Required by the domain CHECK. - pub i: $crate::Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. - pub c: $crate::v3::terms::Ciphertext, - $($( - $(#[$tmeta])* - pub $tkey: $tty, - )+)? - } - - impl $name { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = concat!("eql_v3.", $domain); - } - }; -} -pub(crate) use eql_v3_domain; diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index 6fb52c6a5..a60655846 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -2,43 +2,103 @@ //! [`crate::v3::int4`] plus a `_match` domain backed by the Bloom-filter //! term (`@>`/`<@` containment for `LIKE`-style matching). -use crate::v3::eql_v3_domain; -use crate::v3::terms::{BloomFilter, Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; -eql_v3_domain!( - /// `eql_v3.text` — storage only; every operator is blocked. - Text, domain = "text"); +/// `eql_v3.text` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Text { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl Text { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.text"; +} -eql_v3_domain!( /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). -TextEq, domain = "text_eq", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct TextEq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// HMAC-SHA-256 equality term. - hm: Hmac256, -}); + pub hm: Hmac256, +} + +impl TextEq { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.text_eq"; +} -eql_v3_domain!( /// `eql_v3.text_match` — Bloom-filter containment match. -TextMatch, domain = "text_match", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct TextMatch { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Bloom-filter match term (signed smallint bit positions). - bf: BloomFilter, -}); + pub bf: BloomFilter, +} + +impl TextMatch { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.text_match"; +} -eql_v3_domain!( /// `eql_v3.text_ord_ore` — full lexicographic comparison, /// scheme-explicit name. -TextOrdOre, domain = "text_ord_ore", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct TextOrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl TextOrdOre { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.text_ord_ore"; +} -eql_v3_domain!( /// `eql_v3.text_ord` — full lexicographic comparison /// (`=` `<>` `<` `<=` `>` `>=`). -TextOrd, domain = "text_ord", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct TextOrd { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - ob: OreBlockU64_8_256, -}); + pub ob: OreBlockU64_8_256, +} + +impl TextOrd { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.text_ord"; +} diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index ba93835f5..89cae9548 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -4,17 +4,44 @@ //! 8 blocks, so an ordered timestamptz domain would silently mis-order. //! Ordering arrives with a future wide-ORE term (see `eql-scalars`). -use crate::v3::eql_v3_domain; -use crate::v3::terms::Hmac256; +use crate::v3::terms::{Ciphertext, Hmac256}; +use crate::Identifier; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; -eql_v3_domain!( - /// `eql_v3.timestamptz` — storage only; every operator is blocked. - Timestamptz, domain = "timestamptz"); +/// `eql_v3.timestamptz` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct Timestamptz { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl Timestamptz { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.timestamptz"; +} -eql_v3_domain!( /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). -TimestamptzEq, domain = "timestamptz_eq", -terms { +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +pub struct TimestamptzEq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). + pub v: u16, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, /// HMAC-SHA-256 equality term. - hm: Hmac256, -}); + pub hm: Hmac256, +} + +impl TimestamptzEq { + /// Fully-qualified SQL domain this payload inhabits. + pub const SQL_DOMAIN: &'static str = "eql_v3.timestamptz_eq"; +} From 6749345376ee362d36286b848d8a29fe2f4045a3 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Wed, 10 Jun 2026 21:01:11 +1000 Subject: [PATCH 168/599] refactor(eql-types)!: drop the v2.3 tier and split codegen into stacked changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scope the base crate to the Rust contract only: - Remove the frozen eql_v2_encrypted v2.3 tier (v2_3.rs, its tests, bindings, and schema) — EQL 2.3 won't consume these types; the crate targets the eql_v3 surface. - Remove the ts-rs and schemars dependencies, derives, generated bindings/ and schema/ output, and the types:generate / types:check mise tasks + CI step. TypeScript bindings and JSON Schemas return as two stacked changes so each lands as a small, reviewable diff. - Rework the required-keys parity test to be behavioural instead of schemars-based: a payload carrying exactly the catalog's keys (per eql-scalars ENVELOPE_KEYS + Term::term_json_keys) must round-trip identically, and removing any one key must fail deserialization — the same drift guarantee, proven through serde alone. The crate now depends on serde + serde_json only. --- .github/workflows/test-eql.yml | 7 - Cargo.lock | 76 -------- Cargo.toml | 7 +- crates/eql-types/Cargo.toml | 4 +- crates/eql-types/README.md | 54 +++--- crates/eql-types/bindings/EncryptedPayload.ts | 41 ---- crates/eql-types/bindings/EqlEncrypted.ts | 17 -- crates/eql-types/bindings/Identifier.ts | 16 -- crates/eql-types/bindings/SteVecElement.ts | 18 -- crates/eql-types/bindings/SteVecPayload.ts | 20 -- crates/eql-types/bindings/SteVecTerm.ts | 9 - crates/eql-types/bindings/v3/BloomFilter.ts | 11 -- crates/eql-types/bindings/v3/Ciphertext.ts | 8 - crates/eql-types/bindings/v3/Date.ts | 20 -- crates/eql-types/bindings/v3/DateEq.ts | 25 --- crates/eql-types/bindings/v3/DateOrd.ts | 25 --- crates/eql-types/bindings/v3/DateOrdOre.ts | 25 --- crates/eql-types/bindings/v3/Hmac256.ts | 7 - crates/eql-types/bindings/v3/Int2.ts | 20 -- crates/eql-types/bindings/v3/Int2Eq.ts | 25 --- crates/eql-types/bindings/v3/Int2Ord.ts | 25 --- crates/eql-types/bindings/v3/Int2OrdOre.ts | 25 --- crates/eql-types/bindings/v3/Int4.ts | 20 -- crates/eql-types/bindings/v3/Int4Eq.ts | 25 --- crates/eql-types/bindings/v3/Int4Ord.ts | 25 --- crates/eql-types/bindings/v3/Int4OrdOre.ts | 27 --- crates/eql-types/bindings/v3/Int8.ts | 20 -- crates/eql-types/bindings/v3/Int8Eq.ts | 25 --- crates/eql-types/bindings/v3/Int8Ord.ts | 25 --- crates/eql-types/bindings/v3/Int8OrdOre.ts | 25 --- .../bindings/v3/OreBlockU64_8_256.ts | 9 - crates/eql-types/bindings/v3/Text.ts | 20 -- crates/eql-types/bindings/v3/TextEq.ts | 25 --- crates/eql-types/bindings/v3/TextMatch.ts | 25 --- crates/eql-types/bindings/v3/TextOrd.ts | 26 --- crates/eql-types/bindings/v3/TextOrdOre.ts | 26 --- crates/eql-types/bindings/v3/Timestamptz.ts | 20 -- crates/eql-types/bindings/v3/TimestamptzEq.ts | 25 --- crates/eql-types/schema/EqlEncrypted.json | 181 ------------------ crates/eql-types/schema/v3/date.json | 60 ------ crates/eql-types/schema/v3/date_eq.json | 73 ------- crates/eql-types/schema/v3/date_ord.json | 76 -------- crates/eql-types/schema/v3/date_ord_ore.json | 76 -------- crates/eql-types/schema/v3/int2.json | 60 ------ crates/eql-types/schema/v3/int2_eq.json | 73 ------- crates/eql-types/schema/v3/int2_ord.json | 76 -------- crates/eql-types/schema/v3/int2_ord_ore.json | 76 -------- crates/eql-types/schema/v3/int4.json | 60 ------ crates/eql-types/schema/v3/int4_eq.json | 73 ------- crates/eql-types/schema/v3/int4_ord.json | 76 -------- crates/eql-types/schema/v3/int4_ord_ore.json | 76 -------- crates/eql-types/schema/v3/int8.json | 60 ------ crates/eql-types/schema/v3/int8_eq.json | 73 ------- crates/eql-types/schema/v3/int8_ord.json | 76 -------- crates/eql-types/schema/v3/int8_ord_ore.json | 76 -------- crates/eql-types/schema/v3/text.json | 60 ------ crates/eql-types/schema/v3/text_eq.json | 73 ------- crates/eql-types/schema/v3/text_match.json | 77 -------- crates/eql-types/schema/v3/text_ord.json | 76 -------- crates/eql-types/schema/v3/text_ord_ore.json | 76 -------- crates/eql-types/schema/v3/timestamptz.json | 60 ------ .../eql-types/schema/v3/timestamptz_eq.json | 73 ------- crates/eql-types/src/lib.rs | 48 ++--- crates/eql-types/src/v2_3.rs | 149 -------------- crates/eql-types/src/v3/date.rs | 14 +- crates/eql-types/src/v3/int2.rs | 14 +- crates/eql-types/src/v3/int4.rs | 14 +- crates/eql-types/src/v3/int8.rs | 14 +- crates/eql-types/src/v3/registry.rs | 15 +- crates/eql-types/src/v3/terms.rs | 25 +-- crates/eql-types/src/v3/text.rs | 17 +- crates/eql-types/src/v3/timestamptz.rs | 8 +- crates/eql-types/tests/catalog_parity.rs | 63 ++++-- crates/eql-types/tests/conformance.rs | 99 ---------- crates/eql-types/tests/export.rs | 40 ---- crates/eql-types/tests/v3_conformance.rs | 68 +------ mise.toml | 37 +--- 77 files changed, 136 insertions(+), 3158 deletions(-) delete mode 100644 crates/eql-types/bindings/EncryptedPayload.ts delete mode 100644 crates/eql-types/bindings/EqlEncrypted.ts delete mode 100644 crates/eql-types/bindings/Identifier.ts delete mode 100644 crates/eql-types/bindings/SteVecElement.ts delete mode 100644 crates/eql-types/bindings/SteVecPayload.ts delete mode 100644 crates/eql-types/bindings/SteVecTerm.ts delete mode 100644 crates/eql-types/bindings/v3/BloomFilter.ts delete mode 100644 crates/eql-types/bindings/v3/Ciphertext.ts delete mode 100644 crates/eql-types/bindings/v3/Date.ts delete mode 100644 crates/eql-types/bindings/v3/DateEq.ts delete mode 100644 crates/eql-types/bindings/v3/DateOrd.ts delete mode 100644 crates/eql-types/bindings/v3/DateOrdOre.ts delete mode 100644 crates/eql-types/bindings/v3/Hmac256.ts delete mode 100644 crates/eql-types/bindings/v3/Int2.ts delete mode 100644 crates/eql-types/bindings/v3/Int2Eq.ts delete mode 100644 crates/eql-types/bindings/v3/Int2Ord.ts delete mode 100644 crates/eql-types/bindings/v3/Int2OrdOre.ts delete mode 100644 crates/eql-types/bindings/v3/Int4.ts delete mode 100644 crates/eql-types/bindings/v3/Int4Eq.ts delete mode 100644 crates/eql-types/bindings/v3/Int4Ord.ts delete mode 100644 crates/eql-types/bindings/v3/Int4OrdOre.ts delete mode 100644 crates/eql-types/bindings/v3/Int8.ts delete mode 100644 crates/eql-types/bindings/v3/Int8Eq.ts delete mode 100644 crates/eql-types/bindings/v3/Int8Ord.ts delete mode 100644 crates/eql-types/bindings/v3/Int8OrdOre.ts delete mode 100644 crates/eql-types/bindings/v3/OreBlockU64_8_256.ts delete mode 100644 crates/eql-types/bindings/v3/Text.ts delete mode 100644 crates/eql-types/bindings/v3/TextEq.ts delete mode 100644 crates/eql-types/bindings/v3/TextMatch.ts delete mode 100644 crates/eql-types/bindings/v3/TextOrd.ts delete mode 100644 crates/eql-types/bindings/v3/TextOrdOre.ts delete mode 100644 crates/eql-types/bindings/v3/Timestamptz.ts delete mode 100644 crates/eql-types/bindings/v3/TimestamptzEq.ts delete mode 100644 crates/eql-types/schema/EqlEncrypted.json delete mode 100644 crates/eql-types/schema/v3/date.json delete mode 100644 crates/eql-types/schema/v3/date_eq.json delete mode 100644 crates/eql-types/schema/v3/date_ord.json delete mode 100644 crates/eql-types/schema/v3/date_ord_ore.json delete mode 100644 crates/eql-types/schema/v3/int2.json delete mode 100644 crates/eql-types/schema/v3/int2_eq.json delete mode 100644 crates/eql-types/schema/v3/int2_ord.json delete mode 100644 crates/eql-types/schema/v3/int2_ord_ore.json delete mode 100644 crates/eql-types/schema/v3/int4.json delete mode 100644 crates/eql-types/schema/v3/int4_eq.json delete mode 100644 crates/eql-types/schema/v3/int4_ord.json delete mode 100644 crates/eql-types/schema/v3/int4_ord_ore.json delete mode 100644 crates/eql-types/schema/v3/int8.json delete mode 100644 crates/eql-types/schema/v3/int8_eq.json delete mode 100644 crates/eql-types/schema/v3/int8_ord.json delete mode 100644 crates/eql-types/schema/v3/int8_ord_ore.json delete mode 100644 crates/eql-types/schema/v3/text.json delete mode 100644 crates/eql-types/schema/v3/text_eq.json delete mode 100644 crates/eql-types/schema/v3/text_match.json delete mode 100644 crates/eql-types/schema/v3/text_ord.json delete mode 100644 crates/eql-types/schema/v3/text_ord_ore.json delete mode 100644 crates/eql-types/schema/v3/timestamptz.json delete mode 100644 crates/eql-types/schema/v3/timestamptz_eq.json delete mode 100644 crates/eql-types/src/v2_3.rs delete mode 100644 crates/eql-types/tests/conformance.rs delete mode 100644 crates/eql-types/tests/export.rs diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 39ace3d46..ecb24e4d7 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -103,13 +103,6 @@ jobs: echo 'shards=[1,2,3,4]' >> "$GITHUB_OUTPUT" fi - # Freshness gate for the eql-types codegen output: regenerate the - # TypeScript bindings and JSON Schemas and fail if the checked-in - # copies differ. Reuses the build artifacts from the step above. - - name: Verify eql-types bindings and schemas are fresh - run: | - mise run types:check - codegen: name: "Encrypted-domain codegen" runs-on: ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index 285062eca..dd9a5f47a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1125,12 +1125,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - [[package]] name = "either" version = "1.15.0" @@ -1190,10 +1184,8 @@ name = "eql-types" version = "0.1.0" dependencies = [ "eql-scalars", - "schemars", "serde", "serde_json", - "ts-rs", ] [[package]] @@ -3383,30 +3375,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.108", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -3498,17 +3466,6 @@ dependencies = [ "syn 2.0.108", ] -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.108", -] - [[package]] name = "serde_json" version = "1.0.145" @@ -4035,15 +3992,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - [[package]] name = "terminal_size" version = "0.4.4" @@ -4381,30 +4329,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "ts-rs" -version = "10.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" -dependencies = [ - "lazy_static", - "serde_json", - "thiserror 2.0.18", - "ts-rs-macros", -] - -[[package]] -name = "ts-rs-macros" -version = "10.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.108", - "termcolor", -] - [[package]] name = "typenum" version = "1.20.0" diff --git a/Cargo.toml b/Cargo.toml index 9a5a596e6..e4a2b1be3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,9 +7,10 @@ # crates/eql-codegen — the SQL generator binary (stub here; Plan 2 fills it in). # crates/eql-tests-macros — proc-macros expanding the single scalar-harness # list into the per-type SQLx-matrix wiring. -# crates/eql-types — canonical wire types for EQL payloads (Rust → ts-rs -# TypeScript bindings + schemars JSON Schema); parity- -# tested against the eql-scalars catalog. +# crates/eql-types — canonical Rust wire types for EQL payloads, parity- +# tested against the eql-scalars catalog. (TypeScript +# bindings and JSON Schemas are generated from these +# types in stacked changes.) # tests/sqlx — the existing `eql_tests` SQLx integration crate. # # resolver = "2" keeps the heavy test-crate feature set (sqlx/tokio/cipherstash- diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml index d20219986..d37a417a4 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-types/Cargo.toml @@ -2,13 +2,11 @@ name = "eql-types" version = "0.1.0" edition = "2021" -description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." +description = "Canonical wire types for EQL payloads — the single Rust source of truth (TypeScript bindings and JSON Schemas are generated from these types in stacked changes)." [dependencies] serde = { version = "1", features = ["derive"] } serde_json = "1" -ts-rs = { version = "10", features = ["serde-json-impl"] } -schemars = "0.8" [dev-dependencies] # Parity oracle: tests/catalog_parity.rs asserts the v3 registry exactly diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index 20e705f7c..07ce73312 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -1,11 +1,12 @@ # eql-types Canonical wire types for EQL payloads — **one Rust definition per payload -shape**, intended as the single source of truth for: +shape**, the single source of truth for every tool that produces or consumes +EQL payloads (`cipherstash-client`, `protect-ffi`, CipherStash Proxy). -- **Rust** — consumed directly by `cipherstash-client` / `protect-ffi` -- **TypeScript** — generated via [`ts-rs`] into [`bindings/`](bindings/) -- **JSON Schema** — generated via [`schemars`] into [`schema/`](schema/) +TypeScript bindings (via [`ts-rs`]) and JSON Schemas (via [`schemars`]) are +generated from these definitions in stacked changes; this crate is the +Rust contract only. ## Why @@ -13,24 +14,18 @@ Type information is lost at every hop of `EQL → cipherstash-client → protect-ffi → stack`. protect-ffi hand-writes its TypeScript types; they drift from the Rust they describe; stack widens them further. The result is bugs like the `protect-dynamodb` search-term check that validates a payload shape -EQL v2.3 never actually defined. A generated, single-source crate removes the +EQL never actually defined. A generated, single-source crate removes the hand-copying. -## Two tiers +## Capability-encoded types -| Module | Tier | Rule | -|--------|------|------| -| [`src/v2_3.rs`](src/v2_3.rs) | `eql_v2_encrypted` v2.3 wire contract | **FROZEN** — in production; mirrors `eql-payload-v2.3.schema.json`; must not change | -| [`src/v3/`](src/v3/) | `eql_v3` encrypted-domain families | One struct per SQL domain, parity-tested against `eql-scalars::CATALOG` | - -## Capability-encoded types (the v3 tier) - -`eql_v2_encrypted` is one type with every index term optional, so consumers -must guess at runtime which terms are present. The v3 tier instead has one -type per **SQL domain** — `Int4` / `Int4Eq` / `Int4Ord` / `Int4OrdOre`, and -likewise for `int2`, `int8`, `date`, `timestamptz` (eq-only), and `text` -(which adds `TextMatch`) — each carrying its index terms as **required** -fields. The capability is the type identity; `Option` never appears. +The [`src/v3/`](src/v3/) module has one type per **SQL domain** in the +`eql_v3` schema — `Int4` / `Int4Eq` / `Int4Ord` / `Int4OrdOre`, and likewise +for `int2`, `int8`, `date`, `timestamptz` (eq-only), and `text` (which adds +`TextMatch`) — each carrying its index terms as **required** fields. The +capability is the type identity; `Option` never appears. A payload missing +its term key fails to deserialize: the Rust analogue of the SQL domain's +CHECK constraint. Shared wire fields are reusable newtypes in [`src/v3/terms.rs`](src/v3/terms.rs): @@ -47,26 +42,23 @@ version is still `v: 2` — the generated domain CHECKs assert it, and the wire field names are unchanged from v2 (the purpose-named rename in `docs/plans/eql-payload-scheme-discipline-rfc.md` is deferred). -### Drift protection +## Drift protection `tests/catalog_parity.rs` asserts the [`v3::registry`](src/v3/registry.rs) -exactly covers `eql-scalars::CATALOG` (every domain, in order) and that each -type's required JSON keys equal the envelope keys plus the catalog's term -keys. Adding a scalar to the catalog without adding its types here fails the -build; so does accidentally making a term field `Option`. +exactly covers `eql-scalars::CATALOG` — the same catalog that generates the +`eql_v3` SQL surface — every domain, in order, and proves behaviourally that +each type's wire keys are exactly the envelope (`v`, `i`, `c`) plus the +catalog's term keys. Adding a scalar to the catalog without adding its types +here fails the build; so does accidentally making a term field `Option`. ## Develop ```sh -mise run types:generate # clean-regenerate bindings/ and schema/ -mise run types:check # regenerate + fail if checked-in outputs are stale +cargo test -p eql-types ``` -Both wrap `cargo test -p eql-types`, which runs the conformance round-trip -tests and regenerates `bindings/` (TypeScript, via ts-rs) and `schema/` -(JSON Schema, via `tests/export.rs`). Both directories are checked in so -reviewers can see the codegen output without running anything; CI runs -`types:check` to keep them fresh. +The crate is also part of the lean `mise run test:crates` set (fmt, clippy, +test — no database). ## Future direction: self-describing payloads diff --git a/crates/eql-types/bindings/EncryptedPayload.ts b/crates/eql-types/bindings/EncryptedPayload.ts deleted file mode 100644 index 838d2c8c6..000000000 --- a/crates/eql-types/bindings/EncryptedPayload.ts +++ /dev/null @@ -1,41 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Identifier } from "./Identifier"; - -/** - * Scalar storage payload (`k = "ct"`). - * - * FROZEN imperfection: `hm`/`bf`/`ob` are independently optional. A consumer - * cannot tell from the type which terms are present — it must inspect at - * runtime. This is precisely the gap the `protect-dynamodb` bug fell into. - * The fix, for *new* types, is [`crate::int4`]. - */ -export type EncryptedPayload = { -/** - * Schema version — always [`crate::EQL_SCHEMA_VERSION`]. - */ -v: number, -/** - * Table/column identifier. - */ -i: Identifier, -/** - * mp_base85 ciphertext. Required. - */ -c: string, -/** - * HMAC-SHA256 equality term — present iff a `unique` index is configured. - */ -hm?: string, -/** - * Bloom filter term — present iff a `match` index is configured. - * - * Array of set bit positions. EQL stores these as `smallint[]` (signed - * `i16`); a `match` filter sized above 32768 (configurable up to 65536) - * emits upper-half positions as negative signed values, so this is `i16`, - * not `u16` — a `u16` cannot deserialize a real large-filter payload. - */ -bf?: Array, -/** - * Block ORE term — present iff an `ore` index is configured. - */ -ob?: Array, }; diff --git a/crates/eql-types/bindings/EqlEncrypted.ts b/crates/eql-types/bindings/EqlEncrypted.ts deleted file mode 100644 index 3e4b42998..000000000 --- a/crates/eql-types/bindings/EqlEncrypted.ts +++ /dev/null @@ -1,17 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { EncryptedPayload } from "./EncryptedPayload"; -import type { SteVecPayload } from "./SteVecPayload"; - -/** - * `eql_v2_encrypted` — the EQL v2.3 storage payload. - * - * **Serialization** always emits the `k` discriminator (`"ct"` / `"sv"`) — - * this is what drives the internally-tagged TypeScript union and the JSON - * Schema `oneOf`. **Deserialization** is hand-written (below) because the - * v2.3 wire contract makes `k` *optional* on the scalar form: - * `eql_v2.check_encrypted` and `eql-payload-v2.3.schema.json` discriminate on - * the presence of `c` vs `sv`, not on `k` (the scalar form requires only - * `v`, `c`, `i`). A `#[serde(tag = "k")]`-derived `Deserialize` would reject a - * schema-valid scalar payload that omits `k`. - */ -export type EqlEncrypted = { "k": "ct" } & EncryptedPayload | { "k": "sv" } & SteVecPayload; diff --git a/crates/eql-types/bindings/Identifier.ts b/crates/eql-types/bindings/Identifier.ts deleted file mode 100644 index 5e976dbea..000000000 --- a/crates/eql-types/bindings/Identifier.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Table + column identifier — wire shape `{"t": "...", "c": "..."}`. - * - * Shared by every payload in both tiers. - */ -export type Identifier = { -/** - * Table name. - */ -t: string, -/** - * Column name. - */ -c: string, }; diff --git a/crates/eql-types/bindings/SteVecElement.ts b/crates/eql-types/bindings/SteVecElement.ts deleted file mode 100644 index 3446c7a70..000000000 --- a/crates/eql-types/bindings/SteVecElement.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * One STE-vector element. - */ -export type SteVecElement = { -/** - * Tokenized selector — deterministic per (path, key). - */ -s: string, -/** - * Per-entry mp_base85 ciphertext. Required. - */ -c: string, -/** - * Array marker — true when the selector points at a JSON array context. - */ -a?: boolean, } & ({ hm: string, } | { oc: string, }); diff --git a/crates/eql-types/bindings/SteVecPayload.ts b/crates/eql-types/bindings/SteVecPayload.ts deleted file mode 100644 index eeae7992d..000000000 --- a/crates/eql-types/bindings/SteVecPayload.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Identifier } from "./Identifier"; -import type { SteVecElement } from "./SteVecElement"; - -/** - * STE-vector storage payload (`k = "sv"`). - */ -export type SteVecPayload = { -/** - * Schema version. - */ -v: number, -/** - * Table/column identifier. - */ -i: Identifier, -/** - * Per-selector encrypted entries; root document ciphertext at `sv[0].c`. - */ -sv: Array, }; diff --git a/crates/eql-types/bindings/SteVecTerm.ts b/crates/eql-types/bindings/SteVecTerm.ts deleted file mode 100644 index fe6778f45..000000000 --- a/crates/eql-types/bindings/SteVecTerm.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * SteVec element term. FROZEN as **untagged** — this is the v2.3 wire shape. - * - * A consumer must narrow with `'hm' in term`; there is no literal - * discriminant. A *new* type would tag this — see [`crate::int4`]. - */ -export type SteVecTerm = { hm: string, } | { oc: string, }; diff --git a/crates/eql-types/bindings/v3/BloomFilter.ts b/crates/eql-types/bindings/v3/BloomFilter.ts deleted file mode 100644 index a1ac0d7cb..000000000 --- a/crates/eql-types/bindings/v3/BloomFilter.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Bloom-filter match term — the `bf` wire key. Backs the `_match` domains - * (`~~` containment via `@>`/`<@`). - * - * **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, - * and filters sized above 32768 emit upper-half bit positions as negative - * signed values (same rationale as `v2_3::EncryptedPayload::bf`). - */ -export type BloomFilter = Array; diff --git a/crates/eql-types/bindings/v3/Ciphertext.ts b/crates/eql-types/bindings/v3/Ciphertext.ts deleted file mode 100644 index 7beff648e..000000000 --- a/crates/eql-types/bindings/v3/Ciphertext.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * mp_base85 source ciphertext — the `c` envelope key. - * - * Required by every v3 domain CHECK; present on every payload. - */ -export type Ciphertext = string; diff --git a/crates/eql-types/bindings/v3/Date.ts b/crates/eql-types/bindings/v3/Date.ts deleted file mode 100644 index 12f801e59..000000000 --- a/crates/eql-types/bindings/v3/Date.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.date` — storage only; every operator is blocked. - */ -export type Date = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/DateEq.ts b/crates/eql-types/bindings/v3/DateEq.ts deleted file mode 100644 index db4b23c3d..000000000 --- a/crates/eql-types/bindings/v3/DateEq.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Hmac256 } from "./Hmac256"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.date_eq` — HMAC equality (`=`, `<>`). - */ -export type DateEq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/DateOrd.ts b/crates/eql-types/bindings/v3/DateOrd.ts deleted file mode 100644 index 8eb619224..000000000 --- a/crates/eql-types/bindings/v3/DateOrd.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). - */ -export type DateOrd = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/DateOrdOre.ts b/crates/eql-types/bindings/v3/DateOrdOre.ts deleted file mode 100644 index 8e6496fc3..000000000 --- a/crates/eql-types/bindings/v3/DateOrdOre.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. - */ -export type DateOrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Hmac256.ts b/crates/eql-types/bindings/v3/Hmac256.ts deleted file mode 100644 index 22cefc000..000000000 --- a/crates/eql-types/bindings/v3/Hmac256.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains - * (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. - */ -export type Hmac256 = string; diff --git a/crates/eql-types/bindings/v3/Int2.ts b/crates/eql-types/bindings/v3/Int2.ts deleted file mode 100644 index 5457a00ff..000000000 --- a/crates/eql-types/bindings/v3/Int2.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.int2` — storage only; every operator is blocked. - */ -export type Int2 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int2Eq.ts b/crates/eql-types/bindings/v3/Int2Eq.ts deleted file mode 100644 index 1563906d2..000000000 --- a/crates/eql-types/bindings/v3/Int2Eq.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Hmac256 } from "./Hmac256"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). - */ -export type Int2Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int2Ord.ts b/crates/eql-types/bindings/v3/Int2Ord.ts deleted file mode 100644 index b0720d69b..000000000 --- a/crates/eql-types/bindings/v3/Int2Ord.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). - */ -export type Int2Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int2OrdOre.ts b/crates/eql-types/bindings/v3/Int2OrdOre.ts deleted file mode 100644 index 7b2c3416e..000000000 --- a/crates/eql-types/bindings/v3/Int2OrdOre.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. - */ -export type Int2OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int4.ts b/crates/eql-types/bindings/v3/Int4.ts deleted file mode 100644 index 0918e410e..000000000 --- a/crates/eql-types/bindings/v3/Int4.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.int4` — storage only; every operator is blocked. - */ -export type Int4 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int4Eq.ts b/crates/eql-types/bindings/v3/Int4Eq.ts deleted file mode 100644 index 98c7ccc4c..000000000 --- a/crates/eql-types/bindings/v3/Int4Eq.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Hmac256 } from "./Hmac256"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). - */ -export type Int4Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int4Ord.ts b/crates/eql-types/bindings/v3/Int4Ord.ts deleted file mode 100644 index 0e36e3621..000000000 --- a/crates/eql-types/bindings/v3/Int4Ord.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). - */ -export type Int4Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int4OrdOre.ts b/crates/eql-types/bindings/v3/Int4OrdOre.ts deleted file mode 100644 index a77c4a950..000000000 --- a/crates/eql-types/bindings/v3/Int4OrdOre.ts +++ /dev/null @@ -1,27 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), - * scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. - */ -export type Int4OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too — ORE over a - * full-domain `int4` is lossless, so no separate `hm` is carried. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int8.ts b/crates/eql-types/bindings/v3/Int8.ts deleted file mode 100644 index c2ef0fe2f..000000000 --- a/crates/eql-types/bindings/v3/Int8.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.int8` — storage only; every operator is blocked. - */ -export type Int8 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int8Eq.ts b/crates/eql-types/bindings/v3/Int8Eq.ts deleted file mode 100644 index 435e66dde..000000000 --- a/crates/eql-types/bindings/v3/Int8Eq.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Hmac256 } from "./Hmac256"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). - */ -export type Int8Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int8Ord.ts b/crates/eql-types/bindings/v3/Int8Ord.ts deleted file mode 100644 index ae4b81821..000000000 --- a/crates/eql-types/bindings/v3/Int8Ord.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). - */ -export type Int8Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int8OrdOre.ts b/crates/eql-types/bindings/v3/Int8OrdOre.ts deleted file mode 100644 index ec33282b8..000000000 --- a/crates/eql-types/bindings/v3/Int8OrdOre.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. - */ -export type Int8OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts b/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts deleted file mode 100644 index 5701b17fb..000000000 --- a/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the - * `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless - * over the scalar's domain, so it serves equality too. SQL-side constructor: - * `eql_v3.ore_block_u64_8_256`. - */ -export type OreBlockU64_8_256 = Array; diff --git a/crates/eql-types/bindings/v3/Text.ts b/crates/eql-types/bindings/v3/Text.ts deleted file mode 100644 index fa65aeb23..000000000 --- a/crates/eql-types/bindings/v3/Text.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.text` — storage only; every operator is blocked. - */ -export type Text = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/TextEq.ts b/crates/eql-types/bindings/v3/TextEq.ts deleted file mode 100644 index 5a5f10f43..000000000 --- a/crates/eql-types/bindings/v3/TextEq.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Hmac256 } from "./Hmac256"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.text_eq` — HMAC equality (`=`, `<>`). - */ -export type TextEq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/TextMatch.ts b/crates/eql-types/bindings/v3/TextMatch.ts deleted file mode 100644 index c6cacd059..000000000 --- a/crates/eql-types/bindings/v3/TextMatch.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { BloomFilter } from "./BloomFilter"; -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.text_match` — Bloom-filter containment match. - */ -export type TextMatch = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Bloom-filter match term (signed smallint bit positions). - */ -bf: BloomFilter, }; diff --git a/crates/eql-types/bindings/v3/TextOrd.ts b/crates/eql-types/bindings/v3/TextOrd.ts deleted file mode 100644 index fbf73e9c6..000000000 --- a/crates/eql-types/bindings/v3/TextOrd.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.text_ord` — full lexicographic comparison - * (`=` `<>` `<` `<=` `>` `>=`). - */ -export type TextOrd = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/TextOrdOre.ts b/crates/eql-types/bindings/v3/TextOrdOre.ts deleted file mode 100644 index 218423f27..000000000 --- a/crates/eql-types/bindings/v3/TextOrdOre.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; - -/** - * `eql_v3.text_ord_ore` — full lexicographic comparison, - * scheme-explicit name. - */ -export type TextOrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Timestamptz.ts b/crates/eql-types/bindings/v3/Timestamptz.ts deleted file mode 100644 index 860055a16..000000000 --- a/crates/eql-types/bindings/v3/Timestamptz.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.timestamptz` — storage only; every operator is blocked. - */ -export type Timestamptz = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/TimestamptzEq.ts b/crates/eql-types/bindings/v3/TimestamptzEq.ts deleted file mode 100644 index 3db0d7208..000000000 --- a/crates/eql-types/bindings/v3/TimestamptzEq.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ciphertext } from "./Ciphertext"; -import type { Hmac256 } from "./Hmac256"; -import type { Identifier } from "../Identifier"; - -/** - * `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). - */ -export type TimestamptzEq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - */ -v: number, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; diff --git a/crates/eql-types/schema/EqlEncrypted.json b/crates/eql-types/schema/EqlEncrypted.json deleted file mode 100644 index fe28cc9e4..000000000 --- a/crates/eql-types/schema/EqlEncrypted.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "EqlEncrypted", - "description": "`eql_v2_encrypted` — the EQL v2.3 storage payload.\n\n**Serialization** always emits the `k` discriminator (`\"ct\"` / `\"sv\"`) — this is what drives the internally-tagged TypeScript union and the JSON Schema `oneOf`. **Deserialization** is hand-written (below) because the v2.3 wire contract makes `k` *optional* on the scalar form: `eql_v2.check_encrypted` and `eql-payload-v2.3.schema.json` discriminate on the presence of `c` vs `sv`, not on `k` (the scalar form requires only `v`, `c`, `i`). A `#[serde(tag = \"k\")]`-derived `Deserialize` would reject a schema-valid scalar payload that omits `k`.", - "oneOf": [ - { - "description": "Scalar ciphertext payload.", - "type": "object", - "required": [ - "c", - "i", - "k", - "v" - ], - "properties": { - "bf": { - "description": "Bloom filter term — present iff a `match` index is configured.\n\nArray of set bit positions. EQL stores these as `smallint[]` (signed `i16`); a `match` filter sized above 32768 (configurable up to 65536) emits upper-half positions as negative signed values, so this is `i16`, not `u16` — a `u16` cannot deserialize a real large-filter payload.", - "type": [ - "array", - "null" - ], - "items": { - "type": "integer", - "format": "int16" - } - }, - "c": { - "description": "mp_base85 ciphertext. Required.", - "type": "string" - }, - "hm": { - "description": "HMAC-SHA256 equality term — present iff a `unique` index is configured.", - "type": [ - "string", - "null" - ] - }, - "i": { - "description": "Table/column identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "k": { - "type": "string", - "enum": [ - "ct" - ] - }, - "ob": { - "description": "Block ORE term — present iff an `ore` index is configured.", - "type": [ - "array", - "null" - ], - "items": { - "type": "string" - } - }, - "v": { - "description": "Schema version — always [`crate::EQL_SCHEMA_VERSION`].", - "type": "integer", - "format": "uint16", - "minimum": 0.0 - } - } - }, - { - "description": "STE-vector payload (jsonb / structured values).", - "type": "object", - "required": [ - "i", - "k", - "sv", - "v" - ], - "properties": { - "i": { - "description": "Table/column identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "k": { - "type": "string", - "enum": [ - "sv" - ] - }, - "sv": { - "description": "Per-selector encrypted entries; root document ciphertext at `sv[0].c`.", - "type": "array", - "items": { - "$ref": "#/definitions/SteVecElement" - } - }, - "v": { - "description": "Schema version.", - "type": "integer", - "format": "uint16", - "minimum": 0.0 - } - } - } - ], - "definitions": { - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "type": "object", - "required": [ - "c", - "t" - ], - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - } - }, - "SteVecElement": { - "description": "One STE-vector element.", - "type": "object", - "anyOf": [ - { - "description": "HMAC term — boolean leaves, and array / object root placeholders.", - "type": "object", - "required": [ - "hm" - ], - "properties": { - "hm": { - "type": "string" - } - } - }, - { - "description": "CLLW ORE term — string / number leaves.", - "type": "object", - "required": [ - "oc" - ], - "properties": { - "oc": { - "type": "string" - } - } - } - ], - "required": [ - "c", - "s" - ], - "properties": { - "a": { - "description": "Array marker — true when the selector points at a JSON array context.", - "type": [ - "boolean", - "null" - ] - }, - "c": { - "description": "Per-entry mp_base85 ciphertext. Required.", - "type": "string" - }, - "s": { - "description": "Tokenized selector — deterministic per (path, key).", - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date.json b/crates/eql-types/schema/v3/date.json deleted file mode 100644 index fcbe8e71e..000000000 --- a/crates/eql-types/schema/v3/date.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/date.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.date` — storage only; every operator is blocked.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "v" - ], - "title": "Date", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_eq.json b/crates/eql-types/schema/v3/date_eq.json deleted file mode 100644 index 8aae8ef3d..000000000 --- a/crates/eql-types/schema/v3/date_eq.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.date_eq` — HMAC equality (`=`, `<>`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], - "description": "HMAC-SHA-256 equality term." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "hm", - "i", - "v" - ], - "title": "DateEq", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_ord.json b/crates/eql-types/schema/v3/date_ord.json deleted file mode 100644 index d3253e3e1..000000000 --- a/crates/eql-types/schema/v3/date_ord.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "DateOrd", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_ord_ore.json b/crates/eql-types/schema/v3/date_ord_ore.json deleted file mode 100644 index d2471cef4..000000000 --- a/crates/eql-types/schema/v3/date_ord_ore.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.date_ord_ore` — full comparison, scheme-explicit name.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "DateOrdOre", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2.json b/crates/eql-types/schema/v3/int2.json deleted file mode 100644 index 36c48d29e..000000000 --- a/crates/eql-types/schema/v3/int2.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int2.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.int2` — storage only; every operator is blocked.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "v" - ], - "title": "Int2", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_eq.json b/crates/eql-types/schema/v3/int2_eq.json deleted file mode 100644 index 84e122b8c..000000000 --- a/crates/eql-types/schema/v3/int2_eq.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int2_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.int2_eq` — HMAC equality (`=`, `<>`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], - "description": "HMAC-SHA-256 equality term." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "hm", - "i", - "v" - ], - "title": "Int2Eq", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_ord.json b/crates/eql-types/schema/v3/int2_ord.json deleted file mode 100644 index 9eeee77f4..000000000 --- a/crates/eql-types/schema/v3/int2_ord.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "Int2Ord", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_ord_ore.json b/crates/eql-types/schema/v3/int2_ord_ore.json deleted file mode 100644 index 632d62a19..000000000 --- a/crates/eql-types/schema/v3/int2_ord_ore.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.int2_ord_ore` — full comparison, scheme-explicit name.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "Int2OrdOre", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4.json b/crates/eql-types/schema/v3/int4.json deleted file mode 100644 index 25d616482..000000000 --- a/crates/eql-types/schema/v3/int4.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int4.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.int4` — storage only; every operator is blocked.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "v" - ], - "title": "Int4", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_eq.json b/crates/eql-types/schema/v3/int4_eq.json deleted file mode 100644 index 0f9204ba2..000000000 --- a/crates/eql-types/schema/v3/int4_eq.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int4_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.int4_eq` — HMAC equality (`=`, `<>`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], - "description": "HMAC-SHA-256 equality term." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "hm", - "i", - "v" - ], - "title": "Int4Eq", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_ord.json b/crates/eql-types/schema/v3/int4_ord.json deleted file mode 100644 index a45f5298a..000000000 --- a/crates/eql-types/schema/v3/int4_ord.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "Int4Ord", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_ord_ore.json b/crates/eql-types/schema/v3/int4_ord_ore.json deleted file mode 100644 index 191843c4c..000000000 --- a/crates/eql-types/schema/v3/int4_ord_ore.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too — ORE over a full-domain `int4` is lossless, so no separate `hm` is carried." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "Int4OrdOre", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8.json b/crates/eql-types/schema/v3/int8.json deleted file mode 100644 index 3892f8ba2..000000000 --- a/crates/eql-types/schema/v3/int8.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int8.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.int8` — storage only; every operator is blocked.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "v" - ], - "title": "Int8", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_eq.json b/crates/eql-types/schema/v3/int8_eq.json deleted file mode 100644 index 8f970b646..000000000 --- a/crates/eql-types/schema/v3/int8_eq.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int8_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.int8_eq` — HMAC equality (`=`, `<>`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], - "description": "HMAC-SHA-256 equality term." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "hm", - "i", - "v" - ], - "title": "Int8Eq", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_ord.json b/crates/eql-types/schema/v3/int8_ord.json deleted file mode 100644 index a7ca295d8..000000000 --- a/crates/eql-types/schema/v3/int8_ord.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "Int8Ord", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_ord_ore.json b/crates/eql-types/schema/v3/int8_ord_ore.json deleted file mode 100644 index a86d1b8c4..000000000 --- a/crates/eql-types/schema/v3/int8_ord_ore.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.int8_ord_ore` — full comparison, scheme-explicit name.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "Int8OrdOre", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text.json b/crates/eql-types/schema/v3/text.json deleted file mode 100644 index 1d2605c06..000000000 --- a/crates/eql-types/schema/v3/text.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/text.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.text` — storage only; every operator is blocked.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "v" - ], - "title": "Text", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_eq.json b/crates/eql-types/schema/v3/text_eq.json deleted file mode 100644 index abbf3a6f5..000000000 --- a/crates/eql-types/schema/v3/text_eq.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.text_eq` — HMAC equality (`=`, `<>`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], - "description": "HMAC-SHA-256 equality term." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "hm", - "i", - "v" - ], - "title": "TextEq", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_match.json b/crates/eql-types/schema/v3/text_match.json deleted file mode 100644 index 4cf7c4f91..000000000 --- a/crates/eql-types/schema/v3/text_match.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "BloomFilter": { - "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`~~` containment via `@>`/`<@`).\n\n**Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values (same rationale as `v2_3::EncryptedPayload::bf`).", - "items": { - "format": "int16", - "type": "integer" - }, - "type": "array" - }, - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.text_match` — Bloom-filter containment match.", - "properties": { - "bf": { - "allOf": [ - { - "$ref": "#/definitions/BloomFilter" - } - ], - "description": "Bloom-filter match term (signed smallint bit positions)." - }, - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "bf", - "c", - "i", - "v" - ], - "title": "TextMatch", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_ord.json b/crates/eql-types/schema/v3/text_ord.json deleted file mode 100644 index 1758e763b..000000000 --- a/crates/eql-types/schema/v3/text_ord.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.text_ord` — full lexicographic comparison (`=` `<>` `<` `<=` `>` `>=`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "TextOrd", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_ord_ore.json b/crates/eql-types/schema/v3/text_ord_ore.json deleted file mode 100644 index 3b467f14c..000000000 --- a/crates/eql-types/schema/v3/text_ord_ore.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "description": "`eql_v3.text_ord_ore` — full lexicographic comparison, scheme-explicit name.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlockU64_8_256" - } - ], - "description": "Block-ORE order term. Serves equality too." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "ob", - "v" - ], - "title": "TextOrdOre", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/timestamptz.json b/crates/eql-types/schema/v3/timestamptz.json deleted file mode 100644 index e1cd070ab..000000000 --- a/crates/eql-types/schema/v3/timestamptz.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.timestamptz` — storage only; every operator is blocked.", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "i", - "v" - ], - "title": "Timestamptz", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/timestamptz_eq.json b/crates/eql-types/schema/v3/timestamptz_eq.json deleted file mode 100644 index 6d1759f8d..000000000 --- a/crates/eql-types/schema/v3/timestamptz_eq.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "Ciphertext": { - "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", - "type": "string" - }, - "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", - "type": "string" - }, - "Identifier": { - "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload in both tiers.", - "properties": { - "c": { - "description": "Column name.", - "type": "string" - }, - "t": { - "description": "Table name.", - "type": "string" - } - }, - "required": [ - "c", - "t" - ], - "type": "object" - } - }, - "description": "`eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`).", - "properties": { - "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], - "description": "mp_base85 source ciphertext. Required by the domain CHECK." - }, - "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], - "description": "HMAC-SHA-256 equality term." - }, - "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], - "description": "Table/column identifier. Required by the domain CHECK." - }, - "v": { - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`).", - "format": "uint16", - "minimum": 0.0, - "type": "integer" - } - }, - "required": [ - "c", - "hm", - "i", - "v" - ], - "title": "TimestamptzEq", - "type": "object" -} \ No newline at end of file diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index 5a5a2af1e..ff654f615 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -1,46 +1,32 @@ -//! # eql-types — canonical EQL payload types (prototype) +//! # eql-types — canonical EQL payload types //! -//! One Rust definition per EQL payload shape — the single source of truth for: +//! One Rust definition per EQL payload shape — the single source of truth +//! for every tool that produces or consumes EQL payloads +//! (`cipherstash-client`, `protect-ffi`, CipherStash Proxy). TypeScript +//! bindings and JSON Schemas are generated from these definitions in +//! stacked changes; the Rust types are the contract. //! -//! - **Rust** — consumed directly by `cipherstash-client` / `protect-ffi` -//! - **TypeScript** — generated via `ts-rs` (run `cargo test`, see `bindings/`) -//! - **JSON Schema** — generated via `schemars` (run `cargo test`, see `schema/`) +//! The [`v3`] module holds the `eql_v3` encrypted-domain types: one struct +//! per SQL domain (`eql_v3.int4_eq`, `eql_v3.text_match`, …), +//! *capability-encoded* — index terms are required fields, never `Option`. +//! It mirrors `eql-scalars::CATALOG` 1:1, enforced by +//! `tests/catalog_parity.rs`. //! -//! ## Two tiers -//! -//! - [`v2_3`] — **FROZEN.** The `eql_v2_encrypted` wire contract, in production -//! use by customers. Mirrors `eql-payload-v2.3.schema.json`, imperfections -//! included. Nothing here may change. -//! - [`v3`] — the `eql_v3` schema's encrypted-domain types: one struct per -//! SQL domain (`eql_v3.int4_eq`, `eql_v3.text_match`, …), *capability-encoded* -//! — index terms are required fields, never `Option`. Mirrors -//! `eql-scalars::CATALOG` 1:1, enforced by `tests/catalog_parity.rs`. -//! The wire envelope version stays `v: 2` — see the [`v3`] module docs. -//! -//! ## Codegen rules (learned from the ts-rs spike) -//! -//! 1. **Field names ARE wire names** — no `#[serde(rename)]` on fields. ts-rs -//! silently drops a `rename` that is bundled into an attribute it can't -//! parse (`skip_serializing_if`); having no rename removes the footgun. -//! 2. Every `Option` field carries `#[ts(optional)]`, so it generates -//! `field?: T` rather than a required `field: T | null`. -//! 3. `serde`, `ts-rs`, and `schemars` derives travel together on every type. +//! Wire rule: **field names ARE wire names** — no `#[serde(rename)]` +//! anywhere. The struct definition reads exactly like the JSON payload. -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; -pub mod v2_3; pub mod v3; -/// EQL wire-format version. Hard-coded to `2` for every v2.x payload. +/// EQL wire-format version. Hard-coded to `2` for every payload — including +/// the [`v3`] tier, whose generated domain CHECKs assert `VALUE->>'v' = '2'`. pub const EQL_SCHEMA_VERSION: u16 = 2; /// Table + column identifier — wire shape `{"t": "...", "c": "..."}`. /// -/// Shared by every payload in both tiers. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] +/// Shared by every payload. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Identifier { /// Table name. pub t: String, diff --git a/crates/eql-types/src/v2_3.rs b/crates/eql-types/src/v2_3.rs deleted file mode 100644 index 2cc578ad9..000000000 --- a/crates/eql-types/src/v2_3.rs +++ /dev/null @@ -1,149 +0,0 @@ -//! # EQL v2.3 wire types — FROZEN -//! -//! `eql_v2_encrypted` is in production use by customers. The shapes here are -//! the v2.3 wire contract and MUST NOT change — not field names, not -//! optionality, not enum tagging. They mirror `eql-payload-v2.3.schema.json` -//! exactly, including its imperfections: -//! -//! - [`EncryptedPayload`] carries `hm`/`bf`/`ob` as independent optionals -//! ("any subset" — a column with several indexes carries several terms). -//! - [`SteVecTerm`] is an **untagged** enum — a consumer must sniff keys. -//! -//! New design work goes in sibling modules (see [`crate::int4`]), never here. - -use crate::Identifier; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use ts_rs::TS; - -/// `eql_v2_encrypted` — the EQL v2.3 storage payload. -/// -/// **Serialization** always emits the `k` discriminator (`"ct"` / `"sv"`) — -/// this is what drives the internally-tagged TypeScript union and the JSON -/// Schema `oneOf`. **Deserialization** is hand-written (below) because the -/// v2.3 wire contract makes `k` *optional* on the scalar form: -/// `eql_v2.check_encrypted` and `eql-payload-v2.3.schema.json` discriminate on -/// the presence of `c` vs `sv`, not on `k` (the scalar form requires only -/// `v`, `c`, `i`). A `#[serde(tag = "k")]`-derived `Deserialize` would reject a -/// schema-valid scalar payload that omits `k`. -#[derive(Clone, Debug, PartialEq, Serialize, TS, JsonSchema)] -#[ts(export)] -#[serde(tag = "k")] -pub enum EqlEncrypted { - /// Scalar ciphertext payload. - #[serde(rename = "ct")] - Ct(EncryptedPayload), - /// STE-vector payload (jsonb / structured values). - #[serde(rename = "sv")] - Sv(SteVecPayload), -} - -impl<'de> Deserialize<'de> for EqlEncrypted { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - use serde::de::Error; - // Mirror eql_v2.check_encrypted: key off `k` when present, otherwise - // fall back to which body field is present (`sv` => STE vector, - // otherwise scalar `ct`). `k` is optional on the scalar form per - // eql-payload-v2.3.schema.json (required there: only `v`, `c`, `i`). - let value = serde_json::Value::deserialize(deserializer)?; - let is_sv = match value.get("k").and_then(serde_json::Value::as_str) { - Some("sv") => true, - Some("ct") => false, - Some(other) => { - return Err(D::Error::custom(format!( - "unknown EQL payload kind: k = {other:?}" - ))) - } - None => value.get("sv").is_some(), - }; - if is_sv { - serde_json::from_value(value) - .map(EqlEncrypted::Sv) - .map_err(D::Error::custom) - } else { - serde_json::from_value(value) - .map(EqlEncrypted::Ct) - .map_err(D::Error::custom) - } - } -} - -/// Scalar storage payload (`k = "ct"`). -/// -/// FROZEN imperfection: `hm`/`bf`/`ob` are independently optional. A consumer -/// cannot tell from the type which terms are present — it must inspect at -/// runtime. This is precisely the gap the `protect-dynamodb` bug fell into. -/// The fix, for *new* types, is [`crate::int4`]. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -pub struct EncryptedPayload { - /// Schema version — always [`crate::EQL_SCHEMA_VERSION`]. - pub v: u16, - /// Table/column identifier. - pub i: Identifier, - /// mp_base85 ciphertext. Required. - pub c: String, - /// HMAC-SHA256 equality term — present iff a `unique` index is configured. - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub hm: Option, - /// Bloom filter term — present iff a `match` index is configured. - /// - /// Array of set bit positions. EQL stores these as `smallint[]` (signed - /// `i16`); a `match` filter sized above 32768 (configurable up to 65536) - /// emits upper-half positions as negative signed values, so this is `i16`, - /// not `u16` — a `u16` cannot deserialize a real large-filter payload. - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub bf: Option>, - /// Block ORE term — present iff an `ore` index is configured. - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub ob: Option>, -} - -/// STE-vector storage payload (`k = "sv"`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -pub struct SteVecPayload { - /// Schema version. - pub v: u16, - /// Table/column identifier. - pub i: Identifier, - /// Per-selector encrypted entries; root document ciphertext at `sv[0].c`. - pub sv: Vec, -} - -/// One STE-vector element. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -pub struct SteVecElement { - /// Tokenized selector — deterministic per (path, key). - pub s: String, - /// Per-entry mp_base85 ciphertext. Required. - pub c: String, - /// Array marker — true when the selector points at a JSON array context. - #[serde(default, skip_serializing_if = "Option::is_none")] - #[ts(optional)] - pub a: Option, - /// Exactly one equality / ordering term, flattened onto the element. - #[serde(flatten)] - pub term: SteVecTerm, -} - -/// SteVec element term. FROZEN as **untagged** — this is the v2.3 wire shape. -/// -/// A consumer must narrow with `'hm' in term`; there is no literal -/// discriminant. A *new* type would tag this — see [`crate::int4`]. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export)] -#[serde(untagged)] -pub enum SteVecTerm { - /// HMAC term — boolean leaves, and array / object root placeholders. - Hmac { hm: String }, - /// CLLW ORE term — string / number leaves. - OreCllw { oc: String }, -} diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index be820930c..607dffc08 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -5,13 +5,10 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::Identifier; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; /// `eql_v3.date` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Date { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -27,8 +24,7 @@ impl Date { } /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct DateEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -46,8 +42,7 @@ impl DateEq { } /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct DateOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -65,8 +60,7 @@ impl DateOrdOre { } /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct DateOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index a587d2f2e..3c894fb87 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -3,13 +3,10 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::Identifier; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; /// `eql_v3.int2` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int2 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -25,8 +22,7 @@ impl Int2 { } /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int2Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -44,8 +40,7 @@ impl Int2Eq { } /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int2OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -63,8 +58,7 @@ impl Int2OrdOre { } /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int2Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index e1768156d..672067fbf 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -9,13 +9,10 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::Identifier; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; /// `eql_v3.int4` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int4 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -31,8 +28,7 @@ impl Int4 { } /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int4Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -51,8 +47,7 @@ impl Int4Eq { /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), /// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int4OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -71,8 +66,7 @@ impl Int4OrdOre { } /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int4Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index 7b906a6ac..a92dd8c6e 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -3,13 +3,10 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::Identifier; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; /// `eql_v3.int8` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int8 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -25,8 +22,7 @@ impl Int8 { } /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int8Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -44,8 +40,7 @@ impl Int8Eq { } /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int8OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -63,8 +58,7 @@ impl Int8OrdOre { } /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Int8Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, diff --git a/crates/eql-types/src/v3/registry.rs b/crates/eql-types/src/v3/registry.rs index 928440a35..d94727656 100644 --- a/crates/eql-types/src/v3/registry.rs +++ b/crates/eql-types/src/v3/registry.rs @@ -1,13 +1,11 @@ //! Runtime registry of every v3 domain type — the one hand-maintained //! mapping from SQL domain name to Rust type. //! -//! Three consumers: `tests/catalog_parity.rs` (asserts this list exactly -//! covers `eql-scalars::CATALOG`, so it cannot silently go stale), the -//! generic round-trip loop in `tests/v3_conformance.rs`, and the JSON Schema -//! exporter in `tests/export.rs`. Public so FFI consumers can enumerate the -//! protocol surface too. +//! Consumed by `tests/catalog_parity.rs` (which asserts this list exactly +//! covers `eql-scalars::CATALOG`, so it cannot silently go stale) and by +//! the binding/schema exporters added in stacked changes. Public so FFI +//! consumers can enumerate the protocol surface too. -use schemars::{schema::RootSchema, schema_for, JsonSchema}; use serde::{de::DeserializeOwned, Serialize}; use crate::v3::{date, int2, int4, int8, text, timestamptz}; @@ -19,8 +17,6 @@ pub struct DomainType { pub domain: &'static str, /// The Rust type's full path (via `std::any::type_name`). pub type_name: &'static str, - /// The type's JSON Schema. - pub schema: fn() -> RootSchema, /// serde round-trip through the concrete type /// (`Value` → `T` → `Value`). pub roundtrip: fn(serde_json::Value) -> Result, @@ -28,12 +24,11 @@ pub struct DomainType { fn entry(domain: &'static str) -> DomainType where - T: DeserializeOwned + Serialize + JsonSchema, + T: DeserializeOwned + Serialize, { DomainType { domain, type_name: std::any::type_name::(), - schema: || schema_for!(T), roundtrip: |value| { let parsed: T = serde_json::from_value(value)?; serde_json::to_value(&parsed) diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index 26067df55..ddad74bf4 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -1,39 +1,33 @@ //! Reusable wire-field newtypes shared by every v3 domain payload. //! //! Each newtype serializes as its inner value (serde's newtype-struct -//! default), so the wire shape is unchanged — but the *name* survives -//! codegen: ts-rs exports a named TS alias (`export type Hmac256 = string`) -//! that every domain binding imports, and schemars registers a named -//! definition that every domain schema `$ref`s. A plain Rust `type` alias -//! would vanish in both outputs. +//! default), so the wire shape is unchanged — but the *name* survives into +//! generated artifacts: the TypeScript bindings and JSON Schemas (added in +//! stacked changes) emit these as named aliases/definitions that every +//! domain type references. A plain Rust `type` alias would vanish there. //! //! Names follow the SEM constructor names in `eql-scalars` (`Term::ctor()`): //! a future scheme change (e.g. a 12-block wide ORE term for timestamptz //! ordering) is a new newtype, not a hunt through `Vec` fields. -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; /// mp_base85 source ciphertext — the `c` envelope key. /// /// Required by every v3 domain CHECK; present on every payload. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Ciphertext(pub String); /// HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains /// (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Hmac256(pub String); /// Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the /// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless /// over the scalar's domain, so it serves equality too. SQL-side constructor: /// `eql_v3.ore_block_u64_8_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct OreBlockU64_8_256(pub Vec); /// Bloom-filter match term — the `bf` wire key. Backs the `_match` domains @@ -41,9 +35,8 @@ pub struct OreBlockU64_8_256(pub Vec); /// /// **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, /// and filters sized above 32768 emit upper-half bit positions as negative -/// signed values (same rationale as `v2_3::EncryptedPayload::bf`). -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +/// signed values. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct BloomFilter(pub Vec); impl From for Ciphertext { diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index a60655846..728dc2442 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -4,13 +4,10 @@ use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::Identifier; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; /// `eql_v3.text` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Text { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -26,8 +23,7 @@ impl Text { } /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct TextEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -45,8 +41,7 @@ impl TextEq { } /// `eql_v3.text_match` — Bloom-filter containment match. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct TextMatch { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -65,8 +60,7 @@ impl TextMatch { /// `eql_v3.text_ord_ore` — full lexicographic comparison, /// scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct TextOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -85,8 +79,7 @@ impl TextOrdOre { /// `eql_v3.text_ord` — full lexicographic comparison /// (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct TextOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index 89cae9548..74b5b1be5 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -6,13 +6,10 @@ use crate::v3::terms::{Ciphertext, Hmac256}; use crate::Identifier; -use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use ts_rs::TS; /// `eql_v3.timestamptz` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Timestamptz { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, @@ -28,8 +25,7 @@ impl Timestamptz { } /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] -#[ts(export, export_to = "v3/")] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct TimestamptzEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). pub v: u16, diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index 64a977dd4..129d3cd32 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -2,19 +2,32 @@ //! same catalog that generates the `eql_v3` SQL surface — exactly. Append a //! scalar to the catalog without adding its types here and the first test //! fails; let a term field become `Option` (or carry the wrong wire key) and -//! the second fails, because schemars `required` reflects the real serde -//! contract. - -use std::collections::BTreeSet; +//! the second fails, because it exercises the real serde contract: a payload +//! carrying exactly the catalog's keys must round-trip identically, and +//! removing any one of them must be a deserialization error. use eql_scalars::{Term, CATALOG}; use eql_types::v3::registry; +use serde_json::{json, Value}; /// Mirrors `ENVELOPE_KEYS` in `eql-codegen/src/consts.rs` (`pub(crate)` /// there, so restated here): the keys every generated domain CHECK requires /// before its term keys. const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; +/// A synthetic wire value for a required key, by key name. +fn synthesize(key: &str) -> Value { + match key { + "v" => json!(2), + "i" => json!({ "t": "users", "c": "field" }), + "c" => json!("mp_base85_ciphertext"), + "hm" => json!("deadbeef"), + "ob" => json!(["ore_block_0", "ore_block_1"]), + "bf" => json!([-1, 0, 32767]), + other => panic!("no synthetic value for unexpected catalog key {other:?}"), + } +} + #[test] fn registry_exactly_covers_catalog() { let expected: Vec = CATALOG @@ -28,6 +41,13 @@ fn registry_exactly_covers_catalog() { ); } +/// Every domain's wire keys are exactly envelope + catalog terms, proven +/// behaviourally through serde: +/// +/// - a payload carrying exactly those keys round-trips **identically**, so +/// the type requires nothing more and emits nothing less; +/// - removing any one key fails deserialization, so every key is required +/// (no `Option` has crept in). #[test] fn required_keys_match_catalog_terms() { let entries = registry::all(); @@ -39,25 +59,38 @@ fn required_keys_match_catalog_terms() { .find(|e| e.domain == name) .unwrap_or_else(|| panic!("no registry entry for {name}")); - let schema = (entry.schema)(); - let object = schema - .schema - .object - .as_ref() - .unwrap_or_else(|| panic!("{name}: schema is not an object")); - let required: BTreeSet<&str> = object.required.iter().map(String::as_str).collect(); - - let expected: BTreeSet<&str> = ENVELOPE_KEYS + let keys: Vec<&str> = ENVELOPE_KEYS .iter() .copied() .chain(Term::term_json_keys(domain.terms)) .collect(); + let full: Value = keys + .iter() + .map(|k| (k.to_string(), synthesize(k))) + .collect::>() + .into(); + let round_tripped = (entry.roundtrip)(full.clone()).unwrap_or_else(|e| { + panic!( + "{name} ({}): catalog payload rejected: {e}", + entry.type_name + ) + }); assert_eq!( - required, expected, - "{name} ({}): required wire keys must be envelope + catalog terms", + round_tripped, full, + "{name} ({}): round-trip must be identity over the catalog keys", entry.type_name ); + + for key in &keys { + let mut partial = full.clone(); + partial.as_object_mut().unwrap().remove(*key); + assert!( + (entry.roundtrip)(partial).is_err(), + "{name} ({}): must reject payload missing required key {key:?}", + entry.type_name + ); + } } } } diff --git a/crates/eql-types/tests/conformance.rs b/crates/eql-types/tests/conformance.rs deleted file mode 100644 index bc68086ab..000000000 --- a/crates/eql-types/tests/conformance.rs +++ /dev/null @@ -1,99 +0,0 @@ -//! Conformance fixtures for the FROZEN v2.3 tier — the real guarantee that -//! Rust / TS / JSON Schema and the wire format agree. Codegen guarantees -//! *shape*; these round-trips guarantee *behaviour*. -//! -//! v3 conformance lives in `v3_conformance.rs`; schema export in `export.rs`. - -use eql_types::v2_3::EqlEncrypted; -use serde_json::json; - -#[test] -fn v2_3_scalar_round_trips() { - let wire = json!({ - "k": "ct", "v": 2, - "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext", - "hm": "deadbeef" - }); - let parsed: EqlEncrypted = serde_json::from_value(wire.clone()).unwrap(); - assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); -} - -#[test] -fn legacy_payload_silently_accepts_missing_terms() { - // Contrast: the frozen v2.3 scalar type accepts a payload carrying no - // index terms at all — `hm`/`bf`/`ob` are optional. Nothing is wrong with - // the payload *as v2.3*; the point is the type tells a consumer nothing - // about which operators it can support. Hence the runtime guard. - let bare = json!({ - "k": "ct", "v": 2, - "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext" - }); - let parsed: EqlEncrypted = serde_json::from_value(bare).unwrap(); - match parsed { - EqlEncrypted::Ct(p) => { - assert!(p.hm.is_none() && p.bf.is_none() && p.ob.is_none()); - } - EqlEncrypted::Sv(_) => panic!("expected Ct"), - } -} - -#[test] -fn v2_3_scalar_without_k_is_accepted() { - // The canonical v2.3 schema makes `k` optional on the scalar form - // (required: v, c, i) and check_encrypted discriminates on c-vs-sv, not k. - // A scalar payload that omits `k` must still deserialize as `Ct`. - let wire = json!({ - "v": 2, - "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext", - "hm": "deadbeef" - }); - let parsed: EqlEncrypted = serde_json::from_value(wire).unwrap(); - assert!(matches!(parsed, EqlEncrypted::Ct(_))); - // Serialization always re-emits the discriminator. - assert_eq!( - serde_json::to_value(&parsed).unwrap(), - json!({ - "k": "ct", "v": 2, - "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext", - "hm": "deadbeef" - }) - ); -} - -#[test] -fn v2_3_bf_accepts_negative_smallint() { - // `bf` is stored as smallint[] (signed i16). A `match` filter sized above - // 32768 (allowed up to 65536) emits upper-half bit positions as negative - // signed smallints; the type must round-trip them. - let wire = json!({ - "k": "ct", "v": 2, - "i": { "t": "users", "c": "email" }, - "c": "mp_base85_ciphertext", - "bf": [-1, -32768, 32767, 0] - }); - let parsed: EqlEncrypted = serde_json::from_value(wire.clone()).unwrap(); - assert!(matches!(parsed, EqlEncrypted::Ct(_))); - assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); -} - -#[test] -fn v2_3_ste_vec_round_trips() { - // Exercises the `sv` path: SteVecPayload plus the flatten + untagged - // SteVecTerm (both `hm` and `oc` elements) — the crate's most fragile serde - // construct, and the route the hand-written EqlEncrypted::deserialize takes. - let wire = json!({ - "k": "sv", "v": 2, - "i": { "t": "users", "c": "profile" }, - "sv": [ - { "s": "selector_root", "c": "ct_root", "hm": "deadbeef" }, - { "s": "selector_name", "c": "ct_name", "oc": "00cafe", "a": true } - ] - }); - let parsed: EqlEncrypted = serde_json::from_value(wire.clone()).unwrap(); - assert!(matches!(parsed, EqlEncrypted::Sv(_))); - assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); -} diff --git a/crates/eql-types/tests/export.rs b/crates/eql-types/tests/export.rs deleted file mode 100644 index 08f78ade3..000000000 --- a/crates/eql-types/tests/export.rs +++ /dev/null @@ -1,40 +0,0 @@ -//! JSON Schema export — runs during `cargo test` (alongside ts-rs's own -//! export tests, which write `bindings/`). Output is checked in; freshness is -//! enforced by `mise run types:check`. v3 schema files are named after the -//! SQL domain — the protocol identity — not the Rust type. - -use eql_types::v2_3::EqlEncrypted; -use eql_types::v3::registry; -use schemars::schema_for; - -#[test] -fn dump_v2_3_json_schemas() { - std::fs::create_dir_all("schema").unwrap(); - std::fs::write( - "schema/EqlEncrypted.json", - serde_json::to_string_pretty(&schema_for!(EqlEncrypted)).unwrap(), - ) - .unwrap(); -} - -#[test] -fn dump_v3_json_schemas() { - std::fs::create_dir_all("schema/v3").unwrap(); - for entry in registry::all() { - let mut schema = serde_json::to_value((entry.schema)()).unwrap(); - // schemars 0.8 emits no $id; inject the canonical one. - schema.as_object_mut().unwrap().insert( - "$id".into(), - format!( - "https://schemas.cipherstash.com/eql/v3/{}.json", - entry.domain - ) - .into(), - ); - std::fs::write( - format!("schema/v3/{}.json", entry.domain), - serde_json::to_string_pretty(&schema).unwrap(), - ) - .unwrap(); - } -} diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index 51aa8cb5a..2610fa76f 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -1,12 +1,11 @@ -//! Conformance for the v3 tier: explicit per-domain tests for the reference -//! token (`int4`, plus the term shapes it doesn't carry), then a generic -//! sweep over the whole registry — every domain type round-trips its wire -//! shape and rejects a payload missing any required key. +//! Conformance for the v3 tier: explicit, readable tests for the reference +//! token (`int4`) plus the term shapes it doesn't carry. The exhaustive +//! catalog-driven sweep (every domain, every required key) lives in +//! `catalog_parity.rs`. use eql_types::v3::int4::{Int4, Int4Eq, Int4Ord, Int4OrdOre}; -use eql_types::v3::registry; use eql_types::v3::text::TextMatch; -use serde_json::{json, Value}; +use serde_json::json; #[test] fn int4_storage_round_trips() { @@ -99,60 +98,3 @@ fn text_match_round_trips_signed_bloom_filter() { "TextMatch must reject a payload with no bf" ); } - -/// A synthetic wire value for a required key, by key name. -fn synthesize(key: &str) -> Value { - match key { - "v" => json!(2), - "i" => json!({ "t": "users", "c": "field" }), - "c" => json!("mp_base85_ciphertext"), - "hm" => json!("deadbeef"), - "ob" => json!(["ore_block_0", "ore_block_1"]), - "bf" => json!([-1, 0, 32767]), - other => panic!("no synthetic value for unexpected required key {other:?}"), - } -} - -/// The registry sweep: every domain type round-trips a payload synthesized -/// from its schema's required keys, and rejects the payload with any one -/// required key removed. (That the required keys are the *right* ones is -/// `catalog_parity.rs`'s job.) -#[test] -fn every_registered_domain_round_trips_and_rejects_missing_keys() { - for entry in registry::all() { - let schema = (entry.schema)(); - let required: Vec = schema - .schema - .object - .as_ref() - .expect("object schema") - .required - .iter() - .cloned() - .collect(); - assert!(!required.is_empty(), "{}: no required keys", entry.domain); - - let full: Value = required - .iter() - .map(|k| (k.clone(), synthesize(k))) - .collect::>() - .into(); - let round_tripped = (entry.roundtrip)(full.clone()) - .unwrap_or_else(|e| panic!("{}: round-trip failed: {e}", entry.domain)); - assert_eq!( - round_tripped, full, - "{}: round-trip not identity", - entry.domain - ); - - for key in &required { - let mut partial = full.clone(); - partial.as_object_mut().unwrap().remove(key); - assert!( - (entry.roundtrip)(partial).is_err(), - "{}: must reject payload missing required key {key:?}", - entry.domain - ); - } - } -} diff --git a/mise.toml b/mise.toml index 0b21da899..157650485 100644 --- a/mise.toml +++ b/mise.toml @@ -147,7 +147,7 @@ run = """ # workspace members. Scope explicitly to them (NOT --workspace): a # workspace-wide test would drag in tests/sqlx, whose suite needs Postgres + # CS_* secrets and is already covered by the `test` job. eql-tests-macros only -# pulls syn/quote/proc-macro2 and eql-types only serde/ts-rs/schemars, so they +# pulls syn/quote/proc-macro2 and eql-types only serde/serde_json, so they # stay in the lean set. clippy is likewise scoped — a workspace clippy # recompiles the heavy sqlx/tokio/cipherstash-client tree for no added coverage # of these crates. @@ -160,41 +160,6 @@ cargo clippy -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types --al cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types """ -[tasks."types:generate"] -description = "Regenerate eql-types TypeScript bindings and JSON Schemas from the Rust types (no database required)" -dir = "{{config_root}}" -run = """ -#!/usr/bin/env bash -# Clean-then-regenerate: ts-rs and tests/export.rs only ever ADD files, so a -# renamed or removed type would otherwise leave an orphaned binding/schema -# behind. The rm lives here (not in the tests — they run in parallel). -# v2.3 outputs at the top level of bindings/ and schema/ are frozen alongside -# their types and are regenerated in place, not cleaned. -set -euo pipefail -rm -rf crates/eql-types/bindings/v3 crates/eql-types/schema/v3 -cargo test -p eql-types -""" - -[tasks."types:check"] -description = "Verify the checked-in eql-types bindings/ and schema/ are fresh (regenerate + git diff)" -dir = "{{config_root}}" -depends = ["types:generate"] -run = """ -#!/usr/bin/env bash -set -euo pipefail -git diff --exit-code -- crates/eql-types/bindings crates/eql-types/schema || { - echo "eql-types bindings/ or schema/ are stale — run 'mise run types:generate' and commit the result" >&2 - exit 1 -} -# git diff is blind to brand-new files; untracked output is stale too. -untracked=$(git ls-files --others --exclude-standard -- crates/eql-types/bindings crates/eql-types/schema) -if [ -n "$untracked" ]; then - echo "eql-types has uncommitted generated files:" >&2 - echo "$untracked" >&2 - exit 1 -fi -""" - [tasks."test:matrix:inventory"] description = "Verify the matrix test-name set against the single canonical snapshot (or its derived eq-only subset), catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" From 26ddcd78ae18fcdf793e6709ddb1c31c884f34ab Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Wed, 10 Jun 2026 21:44:08 +1000 Subject: [PATCH 169/599] fix(eql-types): pin the envelope version, reject unknown keys, derive registry domains, share ENVELOPE_KEYS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four review findings closed at the serde layer: - v is now SchemaVersion, a validated newtype whose deserializer rejects any value other than 2 (including the string "2" that the CHECK's ->> coercion would admit) — the Rust analogue of VALUE->>'v' = '2', failing at the type boundary instead of at INSERT. - Every domain struct (and Identifier) is #[serde(deny_unknown_fields)]: a payload carrying keys outside the domain's set fails to deserialize rather than being silently stripped on the next serialize, so a pass-through consumer cannot lose terms it didn't know about. - The registry derives each domain name from the type's own SQL_DOMAIN (new V3Domain trait) instead of re-typing 23 string literals — two same-shaped types (_ord vs _ord_ore) can no longer be registered under each other's domain. - ENVELOPE_KEYS is hoisted into eql-scalars (the catalog) and consumed by eql-codegen's CHECK generation, eql-types' parity tests, and the sqlx harness's payload_required_keys — collapsing three hand-synced copies into one definition. codegen golden parity stays byte-identical. The catalog parity sweep gains unknown-key and wrong-version rejection legs across all 23 domains. --- crates/eql-codegen/src/consts.rs | 9 +-- crates/eql-scalars/src/lib.rs | 11 ++++ crates/eql-types/src/lib.rs | 43 +++++++++++++++ crates/eql-types/src/v3/date.rs | 47 +++++++++------- crates/eql-types/src/v3/int2.rs | 47 +++++++++------- crates/eql-types/src/v3/int4.rs | 47 +++++++++------- crates/eql-types/src/v3/int8.rs | 47 +++++++++------- crates/eql-types/src/v3/mod.rs | 19 +++++++ crates/eql-types/src/v3/registry.rs | 70 +++++++++++++----------- crates/eql-types/src/v3/text.rs | 58 +++++++++++--------- crates/eql-types/src/v3/timestamptz.rs | 25 +++++---- crates/eql-types/tests/catalog_parity.rs | 35 +++++++++--- crates/eql-types/tests/v3_conformance.rs | 38 +++++++++++++ tests/sqlx/src/scalar_domains.rs | 5 +- 14 files changed, 336 insertions(+), 165 deletions(-) diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index af0cd309a..3b8fb1a9b 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -13,10 +13,11 @@ pub(crate) const AUTO_GENERATED_MARKER: &str = "-- AUTOMATICALLY GENERATED FILE. /// the core types at. pub(crate) const SCHEMA: &str = "eql_v3"; -/// Always-present payload keys checked for presence in every domain CHECK, in -/// order: envelope version (`v`), ident (`i`), ciphertext (`c`). Term-specific -/// keys are appended after these by `context::domain_block`. -pub(crate) const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; +/// Always-present payload keys checked for presence in every domain CHECK. +/// Term-specific keys are appended after these by `context::domain_block`. +/// Defined in the catalog (`eql_scalars::ENVELOPE_KEYS`) so the CHECKs and +/// the `eql-types` payload structs share one envelope definition. +pub(crate) const ENVELOPE_KEYS: &[&str] = eql_scalars::ENVELOPE_KEYS; /// Escape a string for use inside a single-quoted SQL literal by doubling /// embedded single quotes. diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index e5b9ee0ea..bc38d7d27 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -73,6 +73,17 @@ pub enum ScalarKind { Timestamptz, } +/// Always-present payload keys required by every generated domain CHECK, +/// before the domain's term keys, in order: envelope version (`v`), ident +/// (`i`), ciphertext (`c`). +/// +/// Lives here — in the catalog — because it is cross-schema contract data +/// consumed on both sides of the generated surface: `eql-codegen` builds +/// every domain CHECK from it, and `eql-types` builds its payload structs +/// and parity tests against it. One definition, so the envelope cannot +/// drift between the SQL and the canonical types. +pub const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; + /// A fixed index term known to the scalar materializer. /// /// `Hm` provides equality; `Ore` provides equality plus ordering. The diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index ff654f615..9232bdd91 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -23,10 +23,53 @@ pub mod v3; /// the [`v3`] tier, whose generated domain CHECKs assert `VALUE->>'v' = '2'`. pub const EQL_SCHEMA_VERSION: u16 = 2; +/// The envelope version field (`v`) — always exactly [`EQL_SCHEMA_VERSION`] +/// on the wire. +/// +/// Deserialization rejects any other value: the Rust analogue of the domain +/// CHECK's `VALUE->>'v' = '2'`, so a wrong-version payload fails at the type +/// boundary instead of at INSERT. The inner value is private; the only +/// constructible instance is the current version. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize)] +pub struct SchemaVersion(u16); + +impl SchemaVersion { + /// The current (only) wire version, `2`. + pub const CURRENT: Self = Self(EQL_SCHEMA_VERSION); + + /// The wire value. + pub const fn get(self) -> u16 { + self.0 + } +} + +impl Default for SchemaVersion { + fn default() -> Self { + Self::CURRENT + } +} + +impl<'de> Deserialize<'de> for SchemaVersion { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let v = u16::deserialize(deserializer)?; + if v == EQL_SCHEMA_VERSION { + Ok(Self(v)) + } else { + Err(serde::de::Error::custom(format!( + "unsupported EQL schema version {v} (expected {EQL_SCHEMA_VERSION})" + ))) + } + } +} + /// Table + column identifier — wire shape `{"t": "...", "c": "..."}`. /// /// Shared by every payload. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Identifier { /// Table name. pub t: String, diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index 607dffc08..721e099da 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -4,30 +4,34 @@ //! capability table. use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::Identifier; +use crate::v3::V3Domain; +use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.date` — storage only; every operator is blocked. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Date { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } -impl Date { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.date"; +impl V3Domain for Date { + const SQL_DOMAIN: &'static str = "eql_v3.date"; } /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct DateEq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -36,16 +40,17 @@ pub struct DateEq { pub hm: Hmac256, } -impl DateEq { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.date_eq"; +impl V3Domain for DateEq { + const SQL_DOMAIN: &'static str = "eql_v3.date_eq"; } /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct DateOrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -54,16 +59,17 @@ pub struct DateOrdOre { pub ob: OreBlockU64_8_256, } -impl DateOrdOre { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.date_ord_ore"; +impl V3Domain for DateOrdOre { + const SQL_DOMAIN: &'static str = "eql_v3.date_ord_ore"; } /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct DateOrd { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -72,7 +78,6 @@ pub struct DateOrd { pub ob: OreBlockU64_8_256, } -impl DateOrd { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.date_ord"; +impl V3Domain for DateOrd { + const SQL_DOMAIN: &'static str = "eql_v3.date_ord"; } diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index 3c894fb87..7e0b10298 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -2,30 +2,34 @@ //! [`crate::v3::int4`] — see that module for the capability table. use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::Identifier; +use crate::v3::V3Domain; +use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int2` — storage only; every operator is blocked. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int2 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } -impl Int2 { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int2"; +impl V3Domain for Int2 { + const SQL_DOMAIN: &'static str = "eql_v3.int2"; } /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int2Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -34,16 +38,17 @@ pub struct Int2Eq { pub hm: Hmac256, } -impl Int2Eq { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int2_eq"; +impl V3Domain for Int2Eq { + const SQL_DOMAIN: &'static str = "eql_v3.int2_eq"; } /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int2OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -52,16 +57,17 @@ pub struct Int2OrdOre { pub ob: OreBlockU64_8_256, } -impl Int2OrdOre { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int2_ord_ore"; +impl V3Domain for Int2OrdOre { + const SQL_DOMAIN: &'static str = "eql_v3.int2_ord_ore"; } /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int2Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -70,7 +76,6 @@ pub struct Int2Ord { pub ob: OreBlockU64_8_256, } -impl Int2Ord { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int2_ord"; +impl V3Domain for Int2Ord { + const SQL_DOMAIN: &'static str = "eql_v3.int2_ord"; } diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index 672067fbf..7f2cb57c4 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -8,30 +8,34 @@ //! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::Identifier; +use crate::v3::V3Domain; +use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int4` — storage only; every operator is blocked. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int4 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } -impl Int4 { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int4"; +impl V3Domain for Int4 { + const SQL_DOMAIN: &'static str = "eql_v3.int4"; } /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int4Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -40,17 +44,18 @@ pub struct Int4Eq { pub hm: Hmac256, } -impl Int4Eq { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int4_eq"; +impl V3Domain for Int4Eq { + const SQL_DOMAIN: &'static str = "eql_v3.int4_eq"; } /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), /// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int4OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -60,16 +65,17 @@ pub struct Int4OrdOre { pub ob: OreBlockU64_8_256, } -impl Int4OrdOre { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int4_ord_ore"; +impl V3Domain for Int4OrdOre { + const SQL_DOMAIN: &'static str = "eql_v3.int4_ord_ore"; } /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int4Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -78,7 +84,6 @@ pub struct Int4Ord { pub ob: OreBlockU64_8_256, } -impl Int4Ord { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int4_ord"; +impl V3Domain for Int4Ord { + const SQL_DOMAIN: &'static str = "eql_v3.int4_ord"; } diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index a92dd8c6e..6d3f45160 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -2,30 +2,34 @@ //! [`crate::v3::int4`] — see that module for the capability table. use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::Identifier; +use crate::v3::V3Domain; +use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int8` — storage only; every operator is blocked. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int8 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } -impl Int8 { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int8"; +impl V3Domain for Int8 { + const SQL_DOMAIN: &'static str = "eql_v3.int8"; } /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int8Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -34,16 +38,17 @@ pub struct Int8Eq { pub hm: Hmac256, } -impl Int8Eq { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int8_eq"; +impl V3Domain for Int8Eq { + const SQL_DOMAIN: &'static str = "eql_v3.int8_eq"; } /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int8OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -52,16 +57,17 @@ pub struct Int8OrdOre { pub ob: OreBlockU64_8_256, } -impl Int8OrdOre { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int8_ord_ore"; +impl V3Domain for Int8OrdOre { + const SQL_DOMAIN: &'static str = "eql_v3.int8_ord_ore"; } /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Int8Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -70,7 +76,6 @@ pub struct Int8Ord { pub ob: OreBlockU64_8_256, } -impl Int8Ord { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.int8_ord"; +impl V3Domain for Int8Ord { + const SQL_DOMAIN: &'static str = "eql_v3.int8_ord"; } diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 2d0f78479..46f1a4263 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -24,6 +24,13 @@ //! (SQL-side) by the domain CHECK. A missing term key is a deserialization //! error — the Rust analogue of the CHECK constraint. //! +//! The types are also **strict**: every struct is +//! `#[serde(deny_unknown_fields)]`, so a payload carrying keys outside the +//! domain's set fails to deserialize rather than being silently stripped on +//! the next serialize (a pass-through consumer must not lose data it didn't +//! know about), and the `v` field is [`crate::SchemaVersion`], which rejects +//! any version other than `2`. +//! //! ## Why there is no discriminated enum //! //! Cross-token: impossible — an `int4_eq` and an `int8_eq` payload are @@ -45,3 +52,15 @@ pub mod timestamptz; /// The PostgreSQL schema every domain in this module inhabits. pub const SQL_SCHEMA: &str = "eql_v3"; + +/// Implemented by every v3 domain payload type: the fully-qualified SQL +/// domain the payload inhabits (e.g. `"eql_v3.int4_eq"`). +/// +/// The [`registry`] derives its domain names from this constant, so the +/// type ↔ domain binding has exactly one definition per type — there is no +/// second string to keep in sync, and two same-shaped types (`_ord` vs +/// `_ord_ore`) cannot be registered under each other's domain. +pub trait V3Domain { + /// Fully-qualified SQL domain, e.g. `"eql_v3.int4_eq"`. + const SQL_DOMAIN: &'static str; +} diff --git a/crates/eql-types/src/v3/registry.rs b/crates/eql-types/src/v3/registry.rs index d94727656..8ebcf56cb 100644 --- a/crates/eql-types/src/v3/registry.rs +++ b/crates/eql-types/src/v3/registry.rs @@ -1,19 +1,22 @@ //! Runtime registry of every v3 domain type — the one hand-maintained -//! mapping from SQL domain name to Rust type. +//! list of types in catalog order. //! -//! Consumed by `tests/catalog_parity.rs` (which asserts this list exactly -//! covers `eql-scalars::CATALOG`, so it cannot silently go stale) and by -//! the binding/schema exporters added in stacked changes. Public so FFI +//! Each entry's domain name is derived from the type's own +//! [`V3Domain::SQL_DOMAIN`], so the type ↔ domain binding cannot be +//! mis-registered (there is no second string to typo or swap). Consumed by +//! `tests/catalog_parity.rs` (which asserts this list exactly covers +//! `eql-scalars::CATALOG`, so it cannot silently go stale) and by the +//! binding/schema exporters added in stacked changes. Public so FFI //! consumers can enumerate the protocol surface too. use serde::{de::DeserializeOwned, Serialize}; -use crate::v3::{date, int2, int4, int8, text, timestamptz}; +use crate::v3::{date, int2, int4, int8, text, timestamptz, V3Domain}; /// One registered v3 domain type. pub struct DomainType { - /// Unqualified SQL domain name (e.g. `"int4_eq"`) — matches - /// `eql-scalars` `ScalarSpec::domain_name`. + /// Unqualified SQL domain name (e.g. `"int4_eq"`) — `SQL_DOMAIN` minus + /// the schema qualifier; matches `eql-scalars` `ScalarSpec::domain_name`. pub domain: &'static str, /// The Rust type's full path (via `std::any::type_name`). pub type_name: &'static str, @@ -22,10 +25,13 @@ pub struct DomainType { pub roundtrip: fn(serde_json::Value) -> Result, } -fn entry(domain: &'static str) -> DomainType +fn entry() -> DomainType where - T: DeserializeOwned + Serialize, + T: V3Domain + DeserializeOwned + Serialize, { + let domain = T::SQL_DOMAIN + .strip_prefix("eql_v3.") + .expect("SQL_DOMAIN must be qualified with the eql_v3 schema"); DomainType { domain, type_name: std::any::type_name::(), @@ -40,28 +46,28 @@ where /// each token's domains in manifest order). pub fn all() -> Vec { vec![ - entry::("int4"), - entry::("int4_eq"), - entry::("int4_ord_ore"), - entry::("int4_ord"), - entry::("int2"), - entry::("int2_eq"), - entry::("int2_ord_ore"), - entry::("int2_ord"), - entry::("int8"), - entry::("int8_eq"), - entry::("int8_ord_ore"), - entry::("int8_ord"), - entry::("date"), - entry::("date_eq"), - entry::("date_ord_ore"), - entry::("date_ord"), - entry::("timestamptz"), - entry::("timestamptz_eq"), - entry::("text"), - entry::("text_eq"), - entry::("text_match"), - entry::("text_ord_ore"), - entry::("text_ord"), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), + entry::(), ] } diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index 728dc2442..ef4d9b14d 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -3,30 +3,34 @@ //! term (`@>`/`<@` containment for `LIKE`-style matching). use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::Identifier; +use crate::v3::V3Domain; +use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.text` — storage only; every operator is blocked. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Text { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } -impl Text { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.text"; +impl V3Domain for Text { + const SQL_DOMAIN: &'static str = "eql_v3.text"; } /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct TextEq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -35,16 +39,17 @@ pub struct TextEq { pub hm: Hmac256, } -impl TextEq { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.text_eq"; +impl V3Domain for TextEq { + const SQL_DOMAIN: &'static str = "eql_v3.text_eq"; } /// `eql_v3.text_match` — Bloom-filter containment match. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct TextMatch { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -53,17 +58,18 @@ pub struct TextMatch { pub bf: BloomFilter, } -impl TextMatch { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.text_match"; +impl V3Domain for TextMatch { + const SQL_DOMAIN: &'static str = "eql_v3.text_match"; } /// `eql_v3.text_ord_ore` — full lexicographic comparison, /// scheme-explicit name. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct TextOrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -72,17 +78,18 @@ pub struct TextOrdOre { pub ob: OreBlockU64_8_256, } -impl TextOrdOre { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.text_ord_ore"; +impl V3Domain for TextOrdOre { + const SQL_DOMAIN: &'static str = "eql_v3.text_ord_ore"; } /// `eql_v3.text_ord` — full lexicographic comparison /// (`=` `<>` `<` `<=` `>` `>=`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct TextOrd { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -91,7 +98,6 @@ pub struct TextOrd { pub ob: OreBlockU64_8_256, } -impl TextOrd { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.text_ord"; +impl V3Domain for TextOrd { + const SQL_DOMAIN: &'static str = "eql_v3.text_ord"; } diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index 74b5b1be5..79f2c8c0d 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -5,30 +5,34 @@ //! Ordering arrives with a future wide-ORE term (see `eql-scalars`). use crate::v3::terms::{Ciphertext, Hmac256}; -use crate::Identifier; +use crate::v3::V3Domain; +use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.timestamptz` — storage only; every operator is blocked. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct Timestamptz { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } -impl Timestamptz { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.timestamptz"; +impl V3Domain for Timestamptz { + const SQL_DOMAIN: &'static str = "eql_v3.timestamptz"; } /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct TimestamptzEq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`). - pub v: u16, + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. @@ -37,7 +41,6 @@ pub struct TimestamptzEq { pub hm: Hmac256, } -impl TimestamptzEq { - /// Fully-qualified SQL domain this payload inhabits. - pub const SQL_DOMAIN: &'static str = "eql_v3.timestamptz_eq"; +impl V3Domain for TimestamptzEq { + const SQL_DOMAIN: &'static str = "eql_v3.timestamptz_eq"; } diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index 129d3cd32..b96d55d8f 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -6,15 +6,10 @@ //! carrying exactly the catalog's keys must round-trip identically, and //! removing any one of them must be a deserialization error. -use eql_scalars::{Term, CATALOG}; +use eql_scalars::{Term, CATALOG, ENVELOPE_KEYS}; use eql_types::v3::registry; use serde_json::{json, Value}; -/// Mirrors `ENVELOPE_KEYS` in `eql-codegen/src/consts.rs` (`pub(crate)` -/// there, so restated here): the keys every generated domain CHECK requires -/// before its term keys. -const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; - /// A synthetic wire value for a required key, by key name. fn synthesize(key: &str) -> Value { match key { @@ -47,7 +42,11 @@ fn registry_exactly_covers_catalog() { /// - a payload carrying exactly those keys round-trips **identically**, so /// the type requires nothing more and emits nothing less; /// - removing any one key fails deserialization, so every key is required -/// (no `Option` has crept in). +/// (no `Option` has crept in); +/// - adding a key outside the set fails deserialization +/// (`deny_unknown_fields` — no silent stripping on re-serialize); +/// - a wrong envelope version fails deserialization (`SchemaVersion` +/// mirrors the domain CHECK's `VALUE->>'v' = '2'`). #[test] fn required_keys_match_catalog_terms() { let entries = registry::all(); @@ -91,6 +90,28 @@ fn required_keys_match_catalog_terms() { entry.type_name ); } + + let mut extra = full.clone(); + extra + .as_object_mut() + .unwrap() + .insert("zz".into(), json!(true)); + assert!( + (entry.roundtrip)(extra).is_err(), + "{name} ({}): must reject payload carrying an unknown key", + entry.type_name + ); + + let mut wrong_version = full.clone(); + wrong_version + .as_object_mut() + .unwrap() + .insert("v".into(), json!(3)); + assert!( + (entry.roundtrip)(wrong_version).is_err(), + "{name} ({}): must reject envelope version other than 2", + entry.type_name + ); } } } diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index 2610fa76f..7896231fe 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -5,6 +5,7 @@ use eql_types::v3::int4::{Int4, Int4Eq, Int4Ord, Int4OrdOre}; use eql_types::v3::text::TextMatch; +use eql_types::v3::V3Domain; use serde_json::json; #[test] @@ -62,6 +63,43 @@ fn int4_eq_rejects_missing_hmac() { assert!(result.is_err(), "Int4Eq must reject a payload with no hm"); } +#[test] +fn rejects_wrong_envelope_version() { + // The SchemaVersion field is the Rust analogue of the domain CHECK's + // `VALUE->>'v' = '2'`: any other version — including a string "2", + // which the CHECK's `->>` coercion would accept — fails at the type + // boundary instead of at INSERT. + for v in [json!(1), json!(3), json!("2")] { + let wire = json!({ + "v": v, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let result: Result = serde_json::from_value(wire); + assert!(result.is_err(), "Int4Eq must reject v = {v}"); + } +} + +#[test] +fn rejects_unknown_keys() { + // deny_unknown_fields: a payload carrying keys outside the domain's set + // is not silently accepted-and-stripped — a pass-through consumer must + // not lose data it didn't know about. + let wire = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef", + "ob": ["ore_block_0"] + }); + let result: Result = serde_json::from_value(wire); + assert!( + result.is_err(), + "Int4Eq must reject a payload carrying keys beyond its domain (here: ob)" + ); +} + #[test] fn int4_ord_rejects_missing_ore_term() { let no_ob = json!({ diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 612ceef87..6ce407f7c 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -541,7 +541,10 @@ impl Variant { /// matrix `payload_check` arm iterates this to assert each key's /// absence is rejected at the cast. pub fn payload_required_keys(self) -> impl Iterator { - ["v", "i", "c"].into_iter().chain(self.required_term()) + eql_scalars::ENVELOPE_KEYS + .iter() + .copied() + .chain(self.required_term()) } pub const fn supports_eq(self) -> bool { From 2bc6ce5b58a34c854c86d03533a6c7ba43ba989d Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 11 Jun 2026 14:08:29 +1000 Subject: [PATCH 170/599] refactor(eql-types): reshape DomainType as an object-safe trait The fn-pointer registry struct becomes a trait with one blanket impl on PhantomData, so Vec> entries are zero-sized type-level handles and V3Domain::SQL_DOMAIN stays the single per-type anchor the impl reads from. The separate registry module is gone; the inventory (all()) lives in v3/mod.rs. --- crates/eql-types/README.md | 5 +- crates/eql-types/src/v3/mod.rs | 96 ++++++++++++++++++++++-- crates/eql-types/src/v3/registry.rs | 73 ------------------ crates/eql-types/tests/catalog_parity.rs | 37 ++++----- 4 files changed, 113 insertions(+), 98 deletions(-) delete mode 100644 crates/eql-types/src/v3/registry.rs diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index 07ce73312..447c2613e 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -44,8 +44,9 @@ field names are unchanged from v2 (the purpose-named rename in ## Drift protection -`tests/catalog_parity.rs` asserts the [`v3::registry`](src/v3/registry.rs) -exactly covers `eql-scalars::CATALOG` — the same catalog that generates the +`tests/catalog_parity.rs` asserts the domain inventory — +[`v3::all()`](src/v3/mod.rs), a `Vec>` of zero-sized +type-level handles — exactly covers `eql-scalars::CATALOG` — the same catalog that generates the `eql_v3` SQL surface — every domain, in order, and proves behaviourally that each type's wire keys are exactly the envelope (`v`, `i`, `c`) plus the catalog's term keys. Adding a scalar to the catalog without adding its types diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 46f1a4263..3625831d5 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -41,11 +41,14 @@ //! shapes that no sniffing can separate. Consumers read from a typed column //! and already know the domain. +use std::marker::PhantomData; + +use serde::{de::DeserializeOwned, Serialize}; + pub mod date; pub mod int2; pub mod int4; pub mod int8; -pub mod registry; pub mod terms; pub mod text; pub mod timestamptz; @@ -56,11 +59,94 @@ pub const SQL_SCHEMA: &str = "eql_v3"; /// Implemented by every v3 domain payload type: the fully-qualified SQL /// domain the payload inhabits (e.g. `"eql_v3.int4_eq"`). /// -/// The [`registry`] derives its domain names from this constant, so the -/// type ↔ domain binding has exactly one definition per type — there is no -/// second string to keep in sync, and two same-shaped types (`_ord` vs -/// `_ord_ore`) cannot be registered under each other's domain. +/// The [`DomainType`] blanket impl derives everything else from this +/// constant, so the type ↔ domain binding has exactly one definition per +/// type — there is no second string to keep in sync, and two same-shaped +/// types (`_ord` vs `_ord_ore`) cannot be enumerated under each other's +/// domain. pub trait V3Domain { /// Fully-qualified SQL domain, e.g. `"eql_v3.int4_eq"`. const SQL_DOMAIN: &'static str; } + +/// Object-safe view of one v3 domain type — what [`all`] enumerates. +/// +/// Implemented once, by the blanket impl below, for `PhantomData` over +/// every payload type: a `Box` is a zero-sized type-level +/// handle, not a payload instance. (The trait cannot be [`V3Domain`] itself: +/// an associated const is not object-safe, and [`Self::roundtrip`] needs +/// `Deserialize`, which is `Sized`-only — so the dyn surface lives on the +/// handle, and `V3Domain` stays the compile-time anchor it reads from.) +/// +/// Consumed by `tests/catalog_parity.rs` (which asserts [`all`] exactly +/// covers `eql-scalars::CATALOG`, so the list cannot silently go stale) and +/// by the binding/schema exporters added in stacked changes. Public so FFI +/// consumers can enumerate the protocol surface too. +pub trait DomainType { + /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"`. + fn sql_domain(&self) -> &'static str; + + /// Unqualified SQL domain name (e.g. `"int4_eq"`) — [`Self::sql_domain`] + /// minus the schema qualifier; matches `eql-scalars` + /// `ScalarSpec::domain_name`. + fn domain(&self) -> &'static str { + self.sql_domain() + .strip_prefix("eql_v3.") + .expect("SQL_DOMAIN must be qualified with the eql_v3 schema") + } + + /// The Rust type's full path (via `std::any::type_name`). + fn type_name(&self) -> &'static str; + + /// serde round-trip through the concrete type (`Value` → `T` → `Value`). + fn roundtrip(&self, value: serde_json::Value) -> Result; +} + +impl DomainType for PhantomData +where + T: V3Domain + DeserializeOwned + Serialize, +{ + fn sql_domain(&self) -> &'static str { + T::SQL_DOMAIN + } + + fn type_name(&self) -> &'static str { + std::any::type_name::() + } + + fn roundtrip(&self, value: serde_json::Value) -> Result { + let parsed: T = serde_json::from_value(value)?; + serde_json::to_value(&parsed) + } +} + +/// Every v3 domain type, in `eql-scalars::CATALOG` order (token order, then +/// each token's domains in manifest order) — the one hand-maintained list of +/// types in the crate. +pub fn all() -> Vec> { + vec![ + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + ] +} diff --git a/crates/eql-types/src/v3/registry.rs b/crates/eql-types/src/v3/registry.rs deleted file mode 100644 index 8ebcf56cb..000000000 --- a/crates/eql-types/src/v3/registry.rs +++ /dev/null @@ -1,73 +0,0 @@ -//! Runtime registry of every v3 domain type — the one hand-maintained -//! list of types in catalog order. -//! -//! Each entry's domain name is derived from the type's own -//! [`V3Domain::SQL_DOMAIN`], so the type ↔ domain binding cannot be -//! mis-registered (there is no second string to typo or swap). Consumed by -//! `tests/catalog_parity.rs` (which asserts this list exactly covers -//! `eql-scalars::CATALOG`, so it cannot silently go stale) and by the -//! binding/schema exporters added in stacked changes. Public so FFI -//! consumers can enumerate the protocol surface too. - -use serde::{de::DeserializeOwned, Serialize}; - -use crate::v3::{date, int2, int4, int8, text, timestamptz, V3Domain}; - -/// One registered v3 domain type. -pub struct DomainType { - /// Unqualified SQL domain name (e.g. `"int4_eq"`) — `SQL_DOMAIN` minus - /// the schema qualifier; matches `eql-scalars` `ScalarSpec::domain_name`. - pub domain: &'static str, - /// The Rust type's full path (via `std::any::type_name`). - pub type_name: &'static str, - /// serde round-trip through the concrete type - /// (`Value` → `T` → `Value`). - pub roundtrip: fn(serde_json::Value) -> Result, -} - -fn entry() -> DomainType -where - T: V3Domain + DeserializeOwned + Serialize, -{ - let domain = T::SQL_DOMAIN - .strip_prefix("eql_v3.") - .expect("SQL_DOMAIN must be qualified with the eql_v3 schema"); - DomainType { - domain, - type_name: std::any::type_name::(), - roundtrip: |value| { - let parsed: T = serde_json::from_value(value)?; - serde_json::to_value(&parsed) - }, - } -} - -/// Every v3 domain type, in `eql-scalars::CATALOG` order (token order, then -/// each token's domains in manifest order). -pub fn all() -> Vec { - vec![ - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - entry::(), - ] -} diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index b96d55d8f..376822bf5 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -1,4 +1,4 @@ -//! The drift gate: the v3 registry must mirror `eql-scalars::CATALOG` — the +//! The drift gate: the v3 domain inventory must mirror `eql-scalars::CATALOG` — the //! same catalog that generates the `eql_v3` SQL surface — exactly. Append a //! scalar to the catalog without adding its types here and the first test //! fails; let a term field become `Option` (or carry the wrong wire key) and @@ -7,7 +7,7 @@ //! removing any one of them must be a deserialization error. use eql_scalars::{Term, CATALOG, ENVELOPE_KEYS}; -use eql_types::v3::registry; +use eql_types::v3; use serde_json::{json, Value}; /// A synthetic wire value for a required key, by key name. @@ -24,15 +24,15 @@ fn synthesize(key: &str) -> Value { } #[test] -fn registry_exactly_covers_catalog() { +fn inventory_exactly_covers_catalog() { let expected: Vec = CATALOG .iter() .flat_map(|spec| spec.domains.iter().map(|d| spec.domain_name(d))) .collect(); - let actual: Vec<&str> = registry::all().iter().map(|e| e.domain).collect(); + let actual: Vec<&str> = v3::all().iter().map(|e| e.domain()).collect(); assert_eq!( actual, expected, - "v3 registry must list every CATALOG domain, in catalog order" + "v3::all() must list every CATALOG domain, in catalog order" ); } @@ -49,14 +49,14 @@ fn registry_exactly_covers_catalog() { /// mirrors the domain CHECK's `VALUE->>'v' = '2'`). #[test] fn required_keys_match_catalog_terms() { - let entries = registry::all(); + let entries = v3::all(); for spec in CATALOG { for domain in spec.domains { let name = spec.domain_name(domain); let entry = entries .iter() - .find(|e| e.domain == name) - .unwrap_or_else(|| panic!("no registry entry for {name}")); + .find(|e| e.domain() == name) + .unwrap_or_else(|| panic!("no domain inventory entry for {name}")); let keys: Vec<&str> = ENVELOPE_KEYS .iter() @@ -69,25 +69,26 @@ fn required_keys_match_catalog_terms() { .map(|k| (k.to_string(), synthesize(k))) .collect::>() .into(); - let round_tripped = (entry.roundtrip)(full.clone()).unwrap_or_else(|e| { + let round_tripped = entry.roundtrip(full.clone()).unwrap_or_else(|e| { panic!( "{name} ({}): catalog payload rejected: {e}", - entry.type_name + entry.type_name() ) }); assert_eq!( - round_tripped, full, + round_tripped, + full, "{name} ({}): round-trip must be identity over the catalog keys", - entry.type_name + entry.type_name() ); for key in &keys { let mut partial = full.clone(); partial.as_object_mut().unwrap().remove(*key); assert!( - (entry.roundtrip)(partial).is_err(), + entry.roundtrip(partial).is_err(), "{name} ({}): must reject payload missing required key {key:?}", - entry.type_name + entry.type_name() ); } @@ -97,9 +98,9 @@ fn required_keys_match_catalog_terms() { .unwrap() .insert("zz".into(), json!(true)); assert!( - (entry.roundtrip)(extra).is_err(), + entry.roundtrip(extra).is_err(), "{name} ({}): must reject payload carrying an unknown key", - entry.type_name + entry.type_name() ); let mut wrong_version = full.clone(); @@ -108,9 +109,9 @@ fn required_keys_match_catalog_terms() { .unwrap() .insert("v".into(), json!(3)); assert!( - (entry.roundtrip)(wrong_version).is_err(), + entry.roundtrip(wrong_version).is_err(), "{name} ({}): must reject envelope version other than 2", - entry.type_name + entry.type_name() ); } } From 555dd25f10947e0d9e334c72b3abf57c8332596a Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 11 Jun 2026 14:18:07 +1000 Subject: [PATCH 171/599] refactor(eql-types): drop roundtrip from DomainType; slim the parity gate to inventory order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The behavioural required-keys test was the only roundtrip consumer; that gate is schema-based in the stacked schemars change (schemars required reflects the serde contract), with per-type strictness spot checks in v3_conformance. serde_json moves to dev-dependencies — the lib no longer touches Value. --- crates/eql-types/Cargo.toml | 8 +- crates/eql-types/README.md | 11 ++- crates/eql-types/src/v3/mod.rs | 25 ++--- crates/eql-types/tests/catalog_parity.rs | 115 +++-------------------- 4 files changed, 30 insertions(+), 129 deletions(-) diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml index d37a417a4..d01b6a0a8 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-types/Cargo.toml @@ -6,10 +6,10 @@ description = "Canonical wire types for EQL payloads — the single Rust source [dependencies] serde = { version = "1", features = ["derive"] } -serde_json = "1" [dev-dependencies] -# Parity oracle: tests/catalog_parity.rs asserts the v3 registry exactly -# covers eql_scalars::CATALOG, so the types here cannot drift from the -# generated SQL surface. +# Parity oracle: tests/catalog_parity.rs asserts the v3 domain inventory +# exactly covers eql_scalars::CATALOG, so the types here cannot drift from +# the generated SQL surface. eql-scalars = { path = "../eql-scalars" } +serde_json = "1" diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index 447c2613e..f3256e16b 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -46,11 +46,12 @@ field names are unchanged from v2 (the purpose-named rename in `tests/catalog_parity.rs` asserts the domain inventory — [`v3::all()`](src/v3/mod.rs), a `Vec>` of zero-sized -type-level handles — exactly covers `eql-scalars::CATALOG` — the same catalog that generates the -`eql_v3` SQL surface — every domain, in order, and proves behaviourally that -each type's wire keys are exactly the envelope (`v`, `i`, `c`) plus the -catalog's term keys. Adding a scalar to the catalog without adding its types -here fails the build; so does accidentally making a term field `Option`. +type-level handles — exactly covers `eql-scalars::CATALOG` (the same catalog +that generates the `eql_v3` SQL surface): every domain, in order. Adding a +scalar to the catalog without adding its types here fails the build. +Wire-key strictness (required term keys, unknown-key rejection, envelope +version) is covered per-type in `tests/v3_conformance.rs` and pinned against +the catalog by the JSON Schema parity test in the stacked schemars change. ## Develop diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 3625831d5..1ba085e54 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -5,7 +5,10 @@ //! (PR #236's first cut), formalized: //! the SQL surface is generated from `eql-scalars::CATALOG`, and these types //! mirror it 1:1 (enforced by `tests/catalog_parity.rs`, which fails if the -//! catalog and this module ever disagree on domains or required wire keys). +//! catalog and [`all`] ever disagree on the set or order of domains; the +//! catalog-derived wire-key gate is schema-based and lands with the stacked +//! schemars change, with per-type strictness spot checks in +//! `tests/v3_conformance.rs`). //! //! **Versioning.** "v3" is the SQL schema generation (`eql_v3.*` domains). //! The JSON envelope version is still `v: 2` ([`crate::EQL_SCHEMA_VERSION`]) — @@ -43,8 +46,6 @@ use std::marker::PhantomData; -use serde::{de::DeserializeOwned, Serialize}; - pub mod date; pub mod int2; pub mod int4; @@ -73,10 +74,10 @@ pub trait V3Domain { /// /// Implemented once, by the blanket impl below, for `PhantomData` over /// every payload type: a `Box` is a zero-sized type-level -/// handle, not a payload instance. (The trait cannot be [`V3Domain`] itself: -/// an associated const is not object-safe, and [`Self::roundtrip`] needs -/// `Deserialize`, which is `Sized`-only — so the dyn surface lives on the -/// handle, and `V3Domain` stays the compile-time anchor it reads from.) +/// handle, not a payload instance (there are no payload instances to box; +/// the trait cannot be [`V3Domain`] itself because an associated const is +/// not object-safe — so the dyn surface lives on the handle, and `V3Domain` +/// stays the one-line-per-type anchor it derives from). /// /// Consumed by `tests/catalog_parity.rs` (which asserts [`all`] exactly /// covers `eql-scalars::CATALOG`, so the list cannot silently go stale) and @@ -97,14 +98,11 @@ pub trait DomainType { /// The Rust type's full path (via `std::any::type_name`). fn type_name(&self) -> &'static str; - - /// serde round-trip through the concrete type (`Value` → `T` → `Value`). - fn roundtrip(&self, value: serde_json::Value) -> Result; } impl DomainType for PhantomData where - T: V3Domain + DeserializeOwned + Serialize, + T: V3Domain, { fn sql_domain(&self) -> &'static str { T::SQL_DOMAIN @@ -113,11 +111,6 @@ where fn type_name(&self) -> &'static str { std::any::type_name::() } - - fn roundtrip(&self, value: serde_json::Value) -> Result { - let parsed: T = serde_json::from_value(value)?; - serde_json::to_value(&parsed) - } } /// Every v3 domain type, in `eql-scalars::CATALOG` order (token order, then diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index 376822bf5..94ff8eb74 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -1,27 +1,15 @@ -//! The drift gate: the v3 domain inventory must mirror `eql-scalars::CATALOG` — the -//! same catalog that generates the `eql_v3` SQL surface — exactly. Append a -//! scalar to the catalog without adding its types here and the first test -//! fails; let a term field become `Option` (or carry the wrong wire key) and -//! the second fails, because it exercises the real serde contract: a payload -//! carrying exactly the catalog's keys must round-trip identically, and -//! removing any one of them must be a deserialization error. - -use eql_scalars::{Term, CATALOG, ENVELOPE_KEYS}; +//! The drift gate: the v3 domain inventory must mirror `eql-scalars::CATALOG` +//! — the same catalog that generates the `eql_v3` SQL surface — exactly: +//! every domain, in catalog order. Append a scalar to the catalog without +//! adding its types (and their `all()` entries) and this fails. +//! +//! Wire-key strictness (required term keys, unknown-key rejection, envelope +//! version) is covered behaviourally per-type in `tests/v3_conformance.rs`, +//! and pinned against the catalog by the JSON Schema parity test in the +//! stacked schemars change. + +use eql_scalars::CATALOG; use eql_types::v3; -use serde_json::{json, Value}; - -/// A synthetic wire value for a required key, by key name. -fn synthesize(key: &str) -> Value { - match key { - "v" => json!(2), - "i" => json!({ "t": "users", "c": "field" }), - "c" => json!("mp_base85_ciphertext"), - "hm" => json!("deadbeef"), - "ob" => json!(["ore_block_0", "ore_block_1"]), - "bf" => json!([-1, 0, 32767]), - other => panic!("no synthetic value for unexpected catalog key {other:?}"), - } -} #[test] fn inventory_exactly_covers_catalog() { @@ -35,84 +23,3 @@ fn inventory_exactly_covers_catalog() { "v3::all() must list every CATALOG domain, in catalog order" ); } - -/// Every domain's wire keys are exactly envelope + catalog terms, proven -/// behaviourally through serde: -/// -/// - a payload carrying exactly those keys round-trips **identically**, so -/// the type requires nothing more and emits nothing less; -/// - removing any one key fails deserialization, so every key is required -/// (no `Option` has crept in); -/// - adding a key outside the set fails deserialization -/// (`deny_unknown_fields` — no silent stripping on re-serialize); -/// - a wrong envelope version fails deserialization (`SchemaVersion` -/// mirrors the domain CHECK's `VALUE->>'v' = '2'`). -#[test] -fn required_keys_match_catalog_terms() { - let entries = v3::all(); - for spec in CATALOG { - for domain in spec.domains { - let name = spec.domain_name(domain); - let entry = entries - .iter() - .find(|e| e.domain() == name) - .unwrap_or_else(|| panic!("no domain inventory entry for {name}")); - - let keys: Vec<&str> = ENVELOPE_KEYS - .iter() - .copied() - .chain(Term::term_json_keys(domain.terms)) - .collect(); - - let full: Value = keys - .iter() - .map(|k| (k.to_string(), synthesize(k))) - .collect::>() - .into(); - let round_tripped = entry.roundtrip(full.clone()).unwrap_or_else(|e| { - panic!( - "{name} ({}): catalog payload rejected: {e}", - entry.type_name() - ) - }); - assert_eq!( - round_tripped, - full, - "{name} ({}): round-trip must be identity over the catalog keys", - entry.type_name() - ); - - for key in &keys { - let mut partial = full.clone(); - partial.as_object_mut().unwrap().remove(*key); - assert!( - entry.roundtrip(partial).is_err(), - "{name} ({}): must reject payload missing required key {key:?}", - entry.type_name() - ); - } - - let mut extra = full.clone(); - extra - .as_object_mut() - .unwrap() - .insert("zz".into(), json!(true)); - assert!( - entry.roundtrip(extra).is_err(), - "{name} ({}): must reject payload carrying an unknown key", - entry.type_name() - ); - - let mut wrong_version = full.clone(); - wrong_version - .as_object_mut() - .unwrap() - .insert("v".into(), json!(3)); - assert!( - entry.roundtrip(wrong_version).is_err(), - "{name} ({}): must reject envelope version other than 2", - entry.type_name() - ); - } - } -} From 79234d413cbdb2b0b8990d345ec232ceaa0221bd Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 11 Jun 2026 14:27:11 +1000 Subject: [PATCH 172/599] refactor(eql-types): implement DomainType per type; drop the V3Domain const trait MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sql_domain() is implemented directly on each type's PhantomData handle in its token file — the domain string still has exactly one definition per type, and the catalog parity test still catches a typo'd or mis-ordered domain. The const-trait + blanket-impl indirection (and type_name, which only test messages used) is gone. --- crates/eql-types/src/v3/date.rs | 28 +++++++++---- crates/eql-types/src/v3/int2.rs | 28 +++++++++---- crates/eql-types/src/v3/int4.rs | 28 +++++++++---- crates/eql-types/src/v3/int8.rs | 28 +++++++++---- crates/eql-types/src/v3/mod.rs | 52 +++++------------------- crates/eql-types/src/v3/text.rs | 34 +++++++++++----- crates/eql-types/src/v3/timestamptz.rs | 16 +++++--- crates/eql-types/tests/v3_conformance.rs | 12 ++++-- 8 files changed, 128 insertions(+), 98 deletions(-) diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index 721e099da..4fcfd8788 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -3,8 +3,10 @@ //! ciphertext, so dates order like integers); see that module for the //! capability table. +use std::marker::PhantomData; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::v3::V3Domain; +use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; @@ -21,8 +23,10 @@ pub struct Date { pub c: Ciphertext, } -impl V3Domain for Date { - const SQL_DOMAIN: &'static str = "eql_v3.date"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.date" + } } /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). @@ -40,8 +44,10 @@ pub struct DateEq { pub hm: Hmac256, } -impl V3Domain for DateEq { - const SQL_DOMAIN: &'static str = "eql_v3.date_eq"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.date_eq" + } } /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. @@ -59,8 +65,10 @@ pub struct DateOrdOre { pub ob: OreBlockU64_8_256, } -impl V3Domain for DateOrdOre { - const SQL_DOMAIN: &'static str = "eql_v3.date_ord_ore"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.date_ord_ore" + } } /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). @@ -78,6 +86,8 @@ pub struct DateOrd { pub ob: OreBlockU64_8_256, } -impl V3Domain for DateOrd { - const SQL_DOMAIN: &'static str = "eql_v3.date_ord"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.date_ord" + } } diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index 7e0b10298..9a365d213 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -1,8 +1,10 @@ //! The `int2` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. +use std::marker::PhantomData; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::v3::V3Domain; +use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; @@ -19,8 +21,10 @@ pub struct Int2 { pub c: Ciphertext, } -impl V3Domain for Int2 { - const SQL_DOMAIN: &'static str = "eql_v3.int2"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int2" + } } /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). @@ -38,8 +42,10 @@ pub struct Int2Eq { pub hm: Hmac256, } -impl V3Domain for Int2Eq { - const SQL_DOMAIN: &'static str = "eql_v3.int2_eq"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int2_eq" + } } /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. @@ -57,8 +63,10 @@ pub struct Int2OrdOre { pub ob: OreBlockU64_8_256, } -impl V3Domain for Int2OrdOre { - const SQL_DOMAIN: &'static str = "eql_v3.int2_ord_ore"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int2_ord_ore" + } } /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). @@ -76,6 +84,8 @@ pub struct Int2Ord { pub ob: OreBlockU64_8_256, } -impl V3Domain for Int2Ord { - const SQL_DOMAIN: &'static str = "eql_v3.int2_ord"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int2_ord" + } } diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index 7f2cb57c4..f27377061 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -7,8 +7,10 @@ //! | [`Int4OrdOre`] | `eql_v3.int4_ord_ore` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | //! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | +use std::marker::PhantomData; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::v3::V3Domain; +use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; @@ -25,8 +27,10 @@ pub struct Int4 { pub c: Ciphertext, } -impl V3Domain for Int4 { - const SQL_DOMAIN: &'static str = "eql_v3.int4"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int4" + } } /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). @@ -44,8 +48,10 @@ pub struct Int4Eq { pub hm: Hmac256, } -impl V3Domain for Int4Eq { - const SQL_DOMAIN: &'static str = "eql_v3.int4_eq"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int4_eq" + } } /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), @@ -65,8 +71,10 @@ pub struct Int4OrdOre { pub ob: OreBlockU64_8_256, } -impl V3Domain for Int4OrdOre { - const SQL_DOMAIN: &'static str = "eql_v3.int4_ord_ore"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int4_ord_ore" + } } /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). @@ -84,6 +92,8 @@ pub struct Int4Ord { pub ob: OreBlockU64_8_256, } -impl V3Domain for Int4Ord { - const SQL_DOMAIN: &'static str = "eql_v3.int4_ord"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int4_ord" + } } diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index 6d3f45160..721c50ce0 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -1,8 +1,10 @@ //! The `int8` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. +use std::marker::PhantomData; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::v3::V3Domain; +use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; @@ -19,8 +21,10 @@ pub struct Int8 { pub c: Ciphertext, } -impl V3Domain for Int8 { - const SQL_DOMAIN: &'static str = "eql_v3.int8"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int8" + } } /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). @@ -38,8 +42,10 @@ pub struct Int8Eq { pub hm: Hmac256, } -impl V3Domain for Int8Eq { - const SQL_DOMAIN: &'static str = "eql_v3.int8_eq"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int8_eq" + } } /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. @@ -57,8 +63,10 @@ pub struct Int8OrdOre { pub ob: OreBlockU64_8_256, } -impl V3Domain for Int8OrdOre { - const SQL_DOMAIN: &'static str = "eql_v3.int8_ord_ore"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int8_ord_ore" + } } /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). @@ -76,6 +84,8 @@ pub struct Int8Ord { pub ob: OreBlockU64_8_256, } -impl V3Domain for Int8Ord { - const SQL_DOMAIN: &'static str = "eql_v3.int8_ord"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.int8_ord" + } } diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 1ba085e54..fe4220f83 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -57,32 +57,16 @@ pub mod timestamptz; /// The PostgreSQL schema every domain in this module inhabits. pub const SQL_SCHEMA: &str = "eql_v3"; -/// Implemented by every v3 domain payload type: the fully-qualified SQL -/// domain the payload inhabits (e.g. `"eql_v3.int4_eq"`). +/// One v3 domain type — what [`all`] enumerates. /// -/// The [`DomainType`] blanket impl derives everything else from this -/// constant, so the type ↔ domain binding has exactly one definition per -/// type — there is no second string to keep in sync, and two same-shaped -/// types (`_ord` vs `_ord_ore`) cannot be enumerated under each other's -/// domain. -pub trait V3Domain { - /// Fully-qualified SQL domain, e.g. `"eql_v3.int4_eq"`. - const SQL_DOMAIN: &'static str; -} - -/// Object-safe view of one v3 domain type — what [`all`] enumerates. -/// -/// Implemented once, by the blanket impl below, for `PhantomData` over -/// every payload type: a `Box` is a zero-sized type-level -/// handle, not a payload instance (there are no payload instances to box; -/// the trait cannot be [`V3Domain`] itself because an associated const is -/// not object-safe — so the dyn surface lives on the handle, and `V3Domain` -/// stays the one-line-per-type anchor it derives from). -/// -/// Consumed by `tests/catalog_parity.rs` (which asserts [`all`] exactly -/// covers `eql-scalars::CATALOG`, so the list cannot silently go stale) and -/// by the binding/schema exporters added in stacked changes. Public so FFI -/// consumers can enumerate the protocol surface too. +/// Each token file implements this for `PhantomData` next to the payload +/// type `T` it describes, e.g. `impl DomainType for PhantomData`: +/// a `Box` is a zero-sized type-level handle, not a payload +/// instance (payload types have no instances to box, so the dyn surface +/// lives on the handle). The SQL domain string is defined exactly once, in +/// that impl, and `tests/catalog_parity.rs` cross-checks every handle +/// against `eql-scalars::CATALOG` — a typo'd or mis-ordered domain fails +/// there. Public so FFI consumers can enumerate the protocol surface too. pub trait DomainType { /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"`. fn sql_domain(&self) -> &'static str; @@ -93,23 +77,7 @@ pub trait DomainType { fn domain(&self) -> &'static str { self.sql_domain() .strip_prefix("eql_v3.") - .expect("SQL_DOMAIN must be qualified with the eql_v3 schema") - } - - /// The Rust type's full path (via `std::any::type_name`). - fn type_name(&self) -> &'static str; -} - -impl DomainType for PhantomData -where - T: V3Domain, -{ - fn sql_domain(&self) -> &'static str { - T::SQL_DOMAIN - } - - fn type_name(&self) -> &'static str { - std::any::type_name::() + .expect("sql_domain must be qualified with the eql_v3 schema") } } diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index ef4d9b14d..00f61f65d 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -2,8 +2,10 @@ //! [`crate::v3::int4`] plus a `_match` domain backed by the Bloom-filter //! term (`@>`/`<@` containment for `LIKE`-style matching). +use std::marker::PhantomData; + use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; -use crate::v3::V3Domain; +use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; @@ -20,8 +22,10 @@ pub struct Text { pub c: Ciphertext, } -impl V3Domain for Text { - const SQL_DOMAIN: &'static str = "eql_v3.text"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.text" + } } /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). @@ -39,8 +43,10 @@ pub struct TextEq { pub hm: Hmac256, } -impl V3Domain for TextEq { - const SQL_DOMAIN: &'static str = "eql_v3.text_eq"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.text_eq" + } } /// `eql_v3.text_match` — Bloom-filter containment match. @@ -58,8 +64,10 @@ pub struct TextMatch { pub bf: BloomFilter, } -impl V3Domain for TextMatch { - const SQL_DOMAIN: &'static str = "eql_v3.text_match"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.text_match" + } } /// `eql_v3.text_ord_ore` — full lexicographic comparison, @@ -78,8 +86,10 @@ pub struct TextOrdOre { pub ob: OreBlockU64_8_256, } -impl V3Domain for TextOrdOre { - const SQL_DOMAIN: &'static str = "eql_v3.text_ord_ore"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.text_ord_ore" + } } /// `eql_v3.text_ord` — full lexicographic comparison @@ -98,6 +108,8 @@ pub struct TextOrd { pub ob: OreBlockU64_8_256, } -impl V3Domain for TextOrd { - const SQL_DOMAIN: &'static str = "eql_v3.text_ord"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.text_ord" + } } diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index 79f2c8c0d..9cd7544ce 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -4,8 +4,10 @@ //! 8 blocks, so an ordered timestamptz domain would silently mis-order. //! Ordering arrives with a future wide-ORE term (see `eql-scalars`). +use std::marker::PhantomData; + use crate::v3::terms::{Ciphertext, Hmac256}; -use crate::v3::V3Domain; +use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; @@ -22,8 +24,10 @@ pub struct Timestamptz { pub c: Ciphertext, } -impl V3Domain for Timestamptz { - const SQL_DOMAIN: &'static str = "eql_v3.timestamptz"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.timestamptz" + } } /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). @@ -41,6 +45,8 @@ pub struct TimestamptzEq { pub hm: Hmac256, } -impl V3Domain for TimestamptzEq { - const SQL_DOMAIN: &'static str = "eql_v3.timestamptz_eq"; +impl DomainType for PhantomData { + fn sql_domain(&self) -> &'static str { + "eql_v3.timestamptz_eq" + } } diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index 7896231fe..48346f35c 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -5,8 +5,9 @@ use eql_types::v3::int4::{Int4, Int4Eq, Int4Ord, Int4OrdOre}; use eql_types::v3::text::TextMatch; -use eql_types::v3::V3Domain; +use eql_types::v3::DomainType; use serde_json::json; +use std::marker::PhantomData; #[test] fn int4_storage_round_trips() { @@ -17,7 +18,7 @@ fn int4_storage_round_trips() { }); let parsed: Int4 = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!(Int4::SQL_DOMAIN, "eql_v3.int4"); + assert_eq!(PhantomData::.sql_domain(), "eql_v3.int4"); } #[test] @@ -30,7 +31,7 @@ fn int4_eq_round_trips() { }); let parsed: Int4Eq = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!(Int4Eq::SQL_DOMAIN, "eql_v3.int4_eq"); + assert_eq!(PhantomData::.sql_domain(), "eql_v3.int4_eq"); } #[test] @@ -46,7 +47,10 @@ fn int4_ord_round_trips() { // `_ord_ore` is the same shape under the scheme-explicit domain name. let parsed: Int4OrdOre = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!(Int4OrdOre::SQL_DOMAIN, "eql_v3.int4_ord_ore"); + assert_eq!( + PhantomData::.sql_domain(), + "eql_v3.int4_ord_ore" + ); } #[test] From d518954c06929fcfa01335c46d7cce3090287d48 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 11 Jun 2026 14:56:55 +1000 Subject: [PATCH 173/599] refactor(eql-types): implement DomainType on the payload types themselves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consumers holding a payload value can now ask it for its SQL domain directly (payload.sql_domain()). The Box inventory keeps its zero-sized PhantomData handles via one blanket impl that delegates through a transient T::default() — allocation-free, since every field defaults to an empty string/vec. Default exists on the payload types only to power that; a default payload is structurally complete but semantically empty. --- crates/eql-types/src/lib.rs | 2 +- crates/eql-types/src/v3/date.rs | 18 +++++++-------- crates/eql-types/src/v3/int2.rs | 18 +++++++-------- crates/eql-types/src/v3/int4.rs | 18 +++++++-------- crates/eql-types/src/v3/int8.rs | 18 +++++++-------- crates/eql-types/src/v3/mod.rs | 32 ++++++++++++++++++-------- crates/eql-types/src/v3/terms.rs | 8 +++---- crates/eql-types/src/v3/text.rs | 22 ++++++++---------- crates/eql-types/src/v3/timestamptz.rs | 10 ++++---- 9 files changed, 74 insertions(+), 72 deletions(-) diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index 9232bdd91..4a2c9b855 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -68,7 +68,7 @@ impl<'de> Deserialize<'de> for SchemaVersion { /// Table + column identifier — wire shape `{"t": "...", "c": "..."}`. /// /// Shared by every payload. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Identifier { /// Table name. diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index 4fcfd8788..5c07010e7 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -3,15 +3,13 @@ //! ciphertext, so dates order like integers); see that module for the //! capability table. -use std::marker::PhantomData; - use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.date` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Date { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -23,14 +21,14 @@ pub struct Date { pub c: Ciphertext, } -impl DomainType for PhantomData { +impl DomainType for Date { fn sql_domain(&self) -> &'static str { "eql_v3.date" } } /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct DateEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -44,14 +42,14 @@ pub struct DateEq { pub hm: Hmac256, } -impl DomainType for PhantomData { +impl DomainType for DateEq { fn sql_domain(&self) -> &'static str { "eql_v3.date_eq" } } /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct DateOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -65,14 +63,14 @@ pub struct DateOrdOre { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for DateOrdOre { fn sql_domain(&self) -> &'static str { "eql_v3.date_ord_ore" } } /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct DateOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -86,7 +84,7 @@ pub struct DateOrd { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for DateOrd { fn sql_domain(&self) -> &'static str { "eql_v3.date_ord" } diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index 9a365d213..b31dee01a 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -1,15 +1,13 @@ //! The `int2` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. -use std::marker::PhantomData; - use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int2` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -21,14 +19,14 @@ pub struct Int2 { pub c: Ciphertext, } -impl DomainType for PhantomData { +impl DomainType for Int2 { fn sql_domain(&self) -> &'static str { "eql_v3.int2" } } /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -42,14 +40,14 @@ pub struct Int2Eq { pub hm: Hmac256, } -impl DomainType for PhantomData { +impl DomainType for Int2Eq { fn sql_domain(&self) -> &'static str { "eql_v3.int2_eq" } } /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -63,14 +61,14 @@ pub struct Int2OrdOre { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for Int2OrdOre { fn sql_domain(&self) -> &'static str { "eql_v3.int2_ord_ore" } } /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -84,7 +82,7 @@ pub struct Int2Ord { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for Int2Ord { fn sql_domain(&self) -> &'static str { "eql_v3.int2_ord" } diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index f27377061..9533d17c1 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -7,15 +7,13 @@ //! | [`Int4OrdOre`] | `eql_v3.int4_ord_ore` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | //! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | -use std::marker::PhantomData; - use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int4` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -27,14 +25,14 @@ pub struct Int4 { pub c: Ciphertext, } -impl DomainType for PhantomData { +impl DomainType for Int4 { fn sql_domain(&self) -> &'static str { "eql_v3.int4" } } /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -48,7 +46,7 @@ pub struct Int4Eq { pub hm: Hmac256, } -impl DomainType for PhantomData { +impl DomainType for Int4Eq { fn sql_domain(&self) -> &'static str { "eql_v3.int4_eq" } @@ -56,7 +54,7 @@ impl DomainType for PhantomData { /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), /// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -71,14 +69,14 @@ pub struct Int4OrdOre { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for Int4OrdOre { fn sql_domain(&self) -> &'static str { "eql_v3.int4_ord_ore" } } /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -92,7 +90,7 @@ pub struct Int4Ord { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for Int4Ord { fn sql_domain(&self) -> &'static str { "eql_v3.int4_ord" } diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index 721c50ce0..97d445909 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -1,15 +1,13 @@ //! The `int8` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. -use std::marker::PhantomData; - use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int8` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -21,14 +19,14 @@ pub struct Int8 { pub c: Ciphertext, } -impl DomainType for PhantomData { +impl DomainType for Int8 { fn sql_domain(&self) -> &'static str { "eql_v3.int8" } } /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -42,14 +40,14 @@ pub struct Int8Eq { pub hm: Hmac256, } -impl DomainType for PhantomData { +impl DomainType for Int8Eq { fn sql_domain(&self) -> &'static str { "eql_v3.int8_eq" } } /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -63,14 +61,14 @@ pub struct Int8OrdOre { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for Int8OrdOre { fn sql_domain(&self) -> &'static str { "eql_v3.int8_ord_ore" } } /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -84,7 +82,7 @@ pub struct Int8Ord { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for Int8Ord { fn sql_domain(&self) -> &'static str { "eql_v3.int8_ord" } diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index fe4220f83..62afaabee 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -57,16 +57,14 @@ pub mod timestamptz; /// The PostgreSQL schema every domain in this module inhabits. pub const SQL_SCHEMA: &str = "eql_v3"; -/// One v3 domain type — what [`all`] enumerates. +/// One v3 domain type — implemented by every payload type, so any payload +/// value can report the SQL domain it inhabits (`payload.sql_domain()`). /// -/// Each token file implements this for `PhantomData` next to the payload -/// type `T` it describes, e.g. `impl DomainType for PhantomData`: -/// a `Box` is a zero-sized type-level handle, not a payload -/// instance (payload types have no instances to box, so the dyn surface -/// lives on the handle). The SQL domain string is defined exactly once, in -/// that impl, and `tests/catalog_parity.rs` cross-checks every handle -/// against `eql-scalars::CATALOG` — a typo'd or mis-ordered domain fails -/// there. Public so FFI consumers can enumerate the protocol surface too. +/// Each token file implements this next to the type it describes; the SQL +/// domain string is defined exactly once, in that impl, and +/// `tests/catalog_parity.rs` cross-checks every entry of [`all`] against +/// `eql-scalars::CATALOG` — a typo'd or mis-ordered domain fails there. +/// Public so FFI consumers can enumerate the protocol surface too. pub trait DomainType { /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"`. fn sql_domain(&self) -> &'static str; @@ -81,6 +79,22 @@ pub trait DomainType { } } +/// Type-level handle: lets [`all`] enumerate the domain types without +/// payload values to box — `Box::new(PhantomData::)` is zero-sized. +/// +/// Delegates through a transient `T::default()`, which is allocation-free +/// (every field defaults to an empty string/vec). `Default` exists on the +/// payload types only to power this: a default payload is structurally +/// complete but semantically empty — never serialize one. +impl DomainType for PhantomData +where + T: DomainType + Default, +{ + fn sql_domain(&self) -> &'static str { + T::default().sql_domain() + } +} + /// Every v3 domain type, in `eql-scalars::CATALOG` order (token order, then /// each token's domains in manifest order) — the one hand-maintained list of /// types in the crate. diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index ddad74bf4..6ee36b22f 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -15,19 +15,19 @@ use serde::{Deserialize, Serialize}; /// mp_base85 source ciphertext — the `c` envelope key. /// /// Required by every v3 domain CHECK; present on every payload. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Ciphertext(pub String); /// HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains /// (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Hmac256(pub String); /// Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the /// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless /// over the scalar's domain, so it serves equality too. SQL-side constructor: /// `eql_v3.ore_block_u64_8_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct OreBlockU64_8_256(pub Vec); /// Bloom-filter match term — the `bf` wire key. Backs the `_match` domains @@ -36,7 +36,7 @@ pub struct OreBlockU64_8_256(pub Vec); /// **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, /// and filters sized above 32768 emit upper-half bit positions as negative /// signed values. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct BloomFilter(pub Vec); impl From for Ciphertext { diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index 00f61f65d..16ecd60cd 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -2,15 +2,13 @@ //! [`crate::v3::int4`] plus a `_match` domain backed by the Bloom-filter //! term (`@>`/`<@` containment for `LIKE`-style matching). -use std::marker::PhantomData; - use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.text` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Text { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -22,14 +20,14 @@ pub struct Text { pub c: Ciphertext, } -impl DomainType for PhantomData { +impl DomainType for Text { fn sql_domain(&self) -> &'static str { "eql_v3.text" } } /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -43,14 +41,14 @@ pub struct TextEq { pub hm: Hmac256, } -impl DomainType for PhantomData { +impl DomainType for TextEq { fn sql_domain(&self) -> &'static str { "eql_v3.text_eq" } } /// `eql_v3.text_match` — Bloom-filter containment match. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextMatch { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -64,7 +62,7 @@ pub struct TextMatch { pub bf: BloomFilter, } -impl DomainType for PhantomData { +impl DomainType for TextMatch { fn sql_domain(&self) -> &'static str { "eql_v3.text_match" } @@ -72,7 +70,7 @@ impl DomainType for PhantomData { /// `eql_v3.text_ord_ore` — full lexicographic comparison, /// scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -86,7 +84,7 @@ pub struct TextOrdOre { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for TextOrdOre { fn sql_domain(&self) -> &'static str { "eql_v3.text_ord_ore" } @@ -94,7 +92,7 @@ impl DomainType for PhantomData { /// `eql_v3.text_ord` — full lexicographic comparison /// (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -108,7 +106,7 @@ pub struct TextOrd { pub ob: OreBlockU64_8_256, } -impl DomainType for PhantomData { +impl DomainType for TextOrd { fn sql_domain(&self) -> &'static str { "eql_v3.text_ord" } diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index 9cd7544ce..628c35f69 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -4,15 +4,13 @@ //! 8 blocks, so an ordered timestamptz domain would silently mis-order. //! Ordering arrives with a future wide-ORE term (see `eql-scalars`). -use std::marker::PhantomData; - use crate::v3::terms::{Ciphertext, Hmac256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.timestamptz` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Timestamptz { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -24,14 +22,14 @@ pub struct Timestamptz { pub c: Ciphertext, } -impl DomainType for PhantomData { +impl DomainType for Timestamptz { fn sql_domain(&self) -> &'static str { "eql_v3.timestamptz" } } /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TimestamptzEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -45,7 +43,7 @@ pub struct TimestamptzEq { pub hm: Hmac256, } -impl DomainType for PhantomData { +impl DomainType for TimestamptzEq { fn sql_domain(&self) -> &'static str { "eql_v3.timestamptz_eq" } From 2cabdffeb2c9ea424d31b65519dc74cb002dc1d7 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 11 Jun 2026 16:36:35 +1000 Subject: [PATCH 174/599] fix(eql-types): drop Default from payload types; power handles via a Sized-bounded static Review finding: Int4Eq::default() was a constructible, serializable payload (v:2, empty i/c/hm) that passes the generated domain CHECK - and empty hm terms all match each other under encrypted equality. The PhantomData blanket impl now delegates through sql_domain_static() (excluded from the vtable by `where Self: Sized`, so the trait stays object-safe) and no payload instance is ever constructed. Default comes off the 23 payload types, the term newtypes, and Identifier; SchemaVersion keeps its CURRENT-valued Default. --- crates/eql-types/src/lib.rs | 2 +- crates/eql-types/src/v3/date.rs | 32 ++++++++++++++----- crates/eql-types/src/v3/int2.rs | 32 ++++++++++++++----- crates/eql-types/src/v3/int4.rs | 32 ++++++++++++++----- crates/eql-types/src/v3/int8.rs | 32 ++++++++++++++----- crates/eql-types/src/v3/mod.rs | 30 ++++++++++++------ crates/eql-types/src/v3/terms.rs | 8 ++--- crates/eql-types/src/v3/text.rs | 40 ++++++++++++++++++------ crates/eql-types/src/v3/timestamptz.rs | 16 +++++++--- crates/eql-types/tests/v3_conformance.rs | 10 ++---- 10 files changed, 167 insertions(+), 67 deletions(-) diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index 4a2c9b855..9232bdd91 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -68,7 +68,7 @@ impl<'de> Deserialize<'de> for SchemaVersion { /// Table + column identifier — wire shape `{"t": "...", "c": "..."}`. /// /// Shared by every payload. -#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Identifier { /// Table name. diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index 5c07010e7..00cb706af 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -9,7 +9,7 @@ use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.date` — storage only; every operator is blocked. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Date { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -22,13 +22,17 @@ pub struct Date { } impl DomainType for Date { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.date" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct DateEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -43,13 +47,17 @@ pub struct DateEq { } impl DomainType for DateEq { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.date_eq" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct DateOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -64,13 +72,17 @@ pub struct DateOrdOre { } impl DomainType for DateOrdOre { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.date_ord_ore" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct DateOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -85,7 +97,11 @@ pub struct DateOrd { } impl DomainType for DateOrd { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.date_ord" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index b31dee01a..b641408d1 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -7,7 +7,7 @@ use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int2` — storage only; every operator is blocked. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -20,13 +20,17 @@ pub struct Int2 { } impl DomainType for Int2 { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int2" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -41,13 +45,17 @@ pub struct Int2Eq { } impl DomainType for Int2Eq { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int2_eq" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -62,13 +70,17 @@ pub struct Int2OrdOre { } impl DomainType for Int2OrdOre { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int2_ord_ore" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int2Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -83,7 +95,11 @@ pub struct Int2Ord { } impl DomainType for Int2Ord { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int2_ord" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index 9533d17c1..44dbcf34c 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -13,7 +13,7 @@ use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int4` — storage only; every operator is blocked. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -26,13 +26,17 @@ pub struct Int4 { } impl DomainType for Int4 { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int4" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -47,14 +51,18 @@ pub struct Int4Eq { } impl DomainType for Int4Eq { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int4_eq" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), /// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -70,13 +78,17 @@ pub struct Int4OrdOre { } impl DomainType for Int4OrdOre { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int4_ord_ore" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int4Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -91,7 +103,11 @@ pub struct Int4Ord { } impl DomainType for Int4Ord { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int4_ord" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index 97d445909..4ab0a232f 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -7,7 +7,7 @@ use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.int8` — storage only; every operator is blocked. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -20,13 +20,17 @@ pub struct Int8 { } impl DomainType for Int8 { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int8" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -41,13 +45,17 @@ pub struct Int8Eq { } impl DomainType for Int8Eq { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int8_eq" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -62,13 +70,17 @@ pub struct Int8OrdOre { } impl DomainType for Int8OrdOre { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int8_ord_ore" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Int8Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -83,7 +95,11 @@ pub struct Int8Ord { } impl DomainType for Int8Ord { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.int8_ord" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 62afaabee..972627785 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -66,7 +66,18 @@ pub const SQL_SCHEMA: &str = "eql_v3"; /// `eql-scalars::CATALOG` — a typo'd or mis-ordered domain fails there. /// Public so FFI consumers can enumerate the protocol surface too. pub trait DomainType { - /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"`. + /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"` — the + /// per-type fact everything else derives from, defined once in each + /// type's impl. + /// + /// `where Self: Sized` keeps the trait object-safe (the method is + /// excluded from the vtable); through `dyn DomainType`, use + /// [`Self::sql_domain`]. + fn sql_domain_static() -> &'static str + where + Self: Sized; + + /// Fully-qualified SQL domain name of this payload value. fn sql_domain(&self) -> &'static str; /// Unqualified SQL domain name (e.g. `"int4_eq"`) — [`Self::sql_domain`] @@ -80,18 +91,19 @@ pub trait DomainType { } /// Type-level handle: lets [`all`] enumerate the domain types without -/// payload values to box — `Box::new(PhantomData::)` is zero-sized. -/// -/// Delegates through a transient `T::default()`, which is allocation-free -/// (every field defaults to an empty string/vec). `Default` exists on the -/// payload types only to power this: a default payload is structurally -/// complete but semantically empty — never serialize one. +/// payload values to box — `Box::new(PhantomData::)` is zero-sized, +/// and the delegation goes through [`DomainType::sql_domain_static`], so no +/// payload instance is ever constructed. impl DomainType for PhantomData where - T: DomainType + Default, + T: DomainType, { + fn sql_domain_static() -> &'static str { + T::sql_domain_static() + } + fn sql_domain(&self) -> &'static str { - T::default().sql_domain() + T::sql_domain_static() } } diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index 6ee36b22f..ddad74bf4 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -15,19 +15,19 @@ use serde::{Deserialize, Serialize}; /// mp_base85 source ciphertext — the `c` envelope key. /// /// Required by every v3 domain CHECK; present on every payload. -#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Ciphertext(pub String); /// HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains /// (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. -#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Hmac256(pub String); /// Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the /// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless /// over the scalar's domain, so it serves equality too. SQL-side constructor: /// `eql_v3.ore_block_u64_8_256`. -#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct OreBlockU64_8_256(pub Vec); /// Bloom-filter match term — the `bf` wire key. Backs the `_match` domains @@ -36,7 +36,7 @@ pub struct OreBlockU64_8_256(pub Vec); /// **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, /// and filters sized above 32768 emit upper-half bit positions as negative /// signed values. -#[derive(Default, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct BloomFilter(pub Vec); impl From for Ciphertext { diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index 16ecd60cd..9e11fc4d1 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -8,7 +8,7 @@ use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.text` — storage only; every operator is blocked. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Text { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -21,13 +21,17 @@ pub struct Text { } impl DomainType for Text { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.text" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -42,13 +46,17 @@ pub struct TextEq { } impl DomainType for TextEq { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.text_eq" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.text_match` — Bloom-filter containment match. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextMatch { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -63,14 +71,18 @@ pub struct TextMatch { } impl DomainType for TextMatch { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.text_match" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.text_ord_ore` — full lexicographic comparison, /// scheme-explicit name. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -85,14 +97,18 @@ pub struct TextOrdOre { } impl DomainType for TextOrdOre { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.text_ord_ore" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.text_ord` — full lexicographic comparison /// (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -107,7 +123,11 @@ pub struct TextOrd { } impl DomainType for TextOrd { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.text_ord" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index 628c35f69..6c4621b7c 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -10,7 +10,7 @@ use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; /// `eql_v3.timestamptz` — storage only; every operator is blocked. -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct Timestamptz { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -23,13 +23,17 @@ pub struct Timestamptz { } impl DomainType for Timestamptz { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.timestamptz" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). -#[derive(Default, Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TimestamptzEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -44,7 +48,11 @@ pub struct TimestamptzEq { } impl DomainType for TimestamptzEq { - fn sql_domain(&self) -> &'static str { + fn sql_domain_static() -> &'static str { "eql_v3.timestamptz_eq" } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } } diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index 48346f35c..9b899ed8f 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -7,7 +7,6 @@ use eql_types::v3::int4::{Int4, Int4Eq, Int4Ord, Int4OrdOre}; use eql_types::v3::text::TextMatch; use eql_types::v3::DomainType; use serde_json::json; -use std::marker::PhantomData; #[test] fn int4_storage_round_trips() { @@ -18,7 +17,7 @@ fn int4_storage_round_trips() { }); let parsed: Int4 = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!(PhantomData::.sql_domain(), "eql_v3.int4"); + assert_eq!(Int4::sql_domain_static(), "eql_v3.int4"); } #[test] @@ -31,7 +30,7 @@ fn int4_eq_round_trips() { }); let parsed: Int4Eq = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!(PhantomData::.sql_domain(), "eql_v3.int4_eq"); + assert_eq!(Int4Eq::sql_domain_static(), "eql_v3.int4_eq"); } #[test] @@ -47,10 +46,7 @@ fn int4_ord_round_trips() { // `_ord_ore` is the same shape under the scheme-explicit domain name. let parsed: Int4OrdOre = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!( - PhantomData::.sql_domain(), - "eql_v3.int4_ord_ore" - ); + assert_eq!(Int4OrdOre::sql_domain_static(), "eql_v3.int4_ord_ore"); } #[test] From 49d817db34fa0deed2c3a1df5828a50af059881d Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 15 Jun 2026 16:22:28 +1000 Subject: [PATCH 175/599] test(eql-types): cover wire shape of every non-int4 v3 domain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit catalog_parity.rs checks domain names only, so the 18 non-int4 payload structs — hand-written copies of the int4 template — had their wire field names exercised by nothing; a typo like `hm` -> `hmm` in int8.rs would ship green and only surface in a downstream consumer. Add serde-conformance tests in v3_conformance.rs: - non_int4_tokens_round_trip_every_domain: roundtrips storage/_eq/_ord/ _ord_ore for int2/int8/date/text and pins each catalog domain name. - timestamptz_round_trips_and_enforces_equality_term: roundtrips the equality-only token (storage + _eq) and keeps its hm term required. - rejects_missing_envelope_keys: a payload missing any of the v/i/c envelope keys fails to deserialize, mirroring the missing-term negatives. Addresses review comments from @auxesis on #236. --- crates/eql-types/tests/v3_conformance.rs | 113 +++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index 9b899ed8f..d8eecb548 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -63,6 +63,29 @@ fn int4_eq_rejects_missing_hmac() { assert!(result.is_err(), "Int4Eq must reject a payload with no hm"); } +#[test] +fn rejects_missing_envelope_keys() { + // v/i/c are the shared envelope contract every domain CHECK asserts. The + // missing-term negatives cover hm/ob/bf; these cover the envelope itself — + // dropping the version, identifier, or ciphertext fails at the type + // boundary, the Rust analogue of the CHECK's NOT NULL envelope columns. + let base = json!({ + "v": 2, + "i": { "t": "users", "c": "age" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + for key in ["v", "i", "c"] { + let mut wire = base.clone(); + wire.as_object_mut().unwrap().remove(key); + let result: Result = serde_json::from_value(wire); + assert!( + result.is_err(), + "Int4Eq must reject a payload with no {key}" + ); + } +} + #[test] fn rejects_wrong_envelope_version() { // The SchemaVersion field is the Rust analogue of the domain CHECK's @@ -136,3 +159,93 @@ fn text_match_round_trips_signed_bloom_filter() { "TextMatch must reject a payload with no bf" ); } + +#[test] +fn non_int4_tokens_round_trip_every_domain() { + // int4 is exercised exhaustively above; the other ordered tokens carry the + // *same* wire field names but were serialized by no test, so a copy-paste + // field typo (e.g. `hm` -> `hmm` in `int8.rs`) would ship green — + // `catalog_parity.rs` checks domain *names* only, never the wire shape. + // This sweep roundtrips every non-int4 domain and pins its catalog name, + // failing the instant a token drifts from the shared envelope/term contract. + use eql_types::v3::{date::*, int2::*, int8::*, text::*}; + + // Wire builders for the three shapes the ordered tokens share. + let storage = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct" }); + let eq = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef" }); + let ord = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "ob": ["b0", "b1"] }); + + // Roundtrip a payload byte-for-byte, then confirm the catalog domain name. + macro_rules! round_trip { + ($ty:ty, $wire:expr, $domain:expr) => {{ + let wire = $wire; + let parsed: $ty = serde_json::from_value(wire.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); + assert_eq!(<$ty>::sql_domain_static(), $domain); + }}; + } + + round_trip!(Int2, storage("a"), "eql_v3.int2"); + round_trip!(Int2Eq, eq("a"), "eql_v3.int2_eq"); + round_trip!(Int2Ord, ord("a"), "eql_v3.int2_ord"); + round_trip!(Int2OrdOre, ord("a"), "eql_v3.int2_ord_ore"); + + round_trip!(Int8, storage("a"), "eql_v3.int8"); + round_trip!(Int8Eq, eq("a"), "eql_v3.int8_eq"); + round_trip!(Int8Ord, ord("a"), "eql_v3.int8_ord"); + round_trip!(Int8OrdOre, ord("a"), "eql_v3.int8_ord_ore"); + + round_trip!(Date, storage("a"), "eql_v3.date"); + round_trip!(DateEq, eq("a"), "eql_v3.date_eq"); + round_trip!(DateOrd, ord("a"), "eql_v3.date_ord"); + round_trip!(DateOrdOre, ord("a"), "eql_v3.date_ord_ore"); + + // text_match is covered by `text_match_round_trips_signed_bloom_filter`. + round_trip!(Text, storage("a"), "eql_v3.text"); + round_trip!(TextEq, eq("a"), "eql_v3.text_eq"); + round_trip!(TextOrd, ord("a"), "eql_v3.text_ord"); + round_trip!(TextOrdOre, ord("a"), "eql_v3.text_ord_ore"); +} + +#[test] +fn timestamptz_round_trips_and_enforces_equality_term() { + // The one structurally-distinct token: equality-only, no `_ord`/`_ord_ore` + // (the 8-block-ORE limitation). The int4 template was copy-pasted to + // produce it, so an accidental extra `ob` field or a dropped `hm` would + // pass `catalog_parity` (domain names only) but is caught here. + use eql_types::v3::timestamptz::{Timestamptz, TimestamptzEq}; + + // Storage-only: envelope, no term. + let storage = json!({ + "v": 2, + "i": { "t": "events", "c": "occurred_at" }, + "c": "mp_base85_ciphertext" + }); + let parsed: Timestamptz = serde_json::from_value(storage.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), storage); + assert_eq!(Timestamptz::sql_domain_static(), "eql_v3.timestamptz"); + + // Equality: envelope + hm. + let with_hm = json!({ + "v": 2, + "i": { "t": "events", "c": "occurred_at" }, + "c": "mp_base85_ciphertext", + "hm": "deadbeef" + }); + let parsed: TimestamptzEq = serde_json::from_value(with_hm.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), with_hm); + assert_eq!(TimestamptzEq::sql_domain_static(), "eql_v3.timestamptz_eq"); + + // `_eq` is the only searchable shape this token has, so its equality term + // cannot silently become optional. + let no_hm = json!({ + "v": 2, + "i": { "t": "events", "c": "occurred_at" }, + "c": "mp_base85_ciphertext" + }); + let result: Result = serde_json::from_value(no_hm); + assert!( + result.is_err(), + "TimestamptzEq must reject a payload with no hm" + ); +} From 25c389c49e577edcece2ff447f9cea3a6f622d64 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 19:36:10 +1000 Subject: [PATCH 176/599] feat(eql-scalars): add Term::provides_ordering per-term capability --- crates/eql-scalars/src/term.rs | 8 ++++++++ crates/eql-scalars/src/tests.rs | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-scalars/src/term.rs index ebdba91f1..461a17144 100644 --- a/crates/eql-scalars/src/term.rs +++ b/crates/eql-scalars/src/term.rs @@ -63,6 +63,14 @@ impl Term { Term::Bloom => &["src/v3/sem/bloom_filter/functions.sql"], } } + + /// True when this term provides ordering operators (`<` `<=` `>` `>=`). + /// A per-term *capability*, distinct from [`Role`] (the whole-domain file + /// role derived from the first term). New ordering terms opt in here, so + /// `is_ord_capable` never hardcodes a single ordering term. + pub const fn provides_ordering(self) -> bool { + matches!(self, Term::Ore) + } } impl Term { diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index f9cd51f38..c74a89e93 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -519,6 +519,15 @@ mod catalog_tests { assert_eq!(m.terms, &[Term::Bloom]); } + #[test] + fn provides_ordering_is_true_only_for_ore() { + // Per-term ordering capability — distinct from Role (the whole-domain + // file role derived from the first term). Only Ore provides `< <= > >=`. + assert!(Term::Ore.provides_ordering()); + assert!(!Term::Hm.provides_ordering()); + assert!(!Term::Bloom.provides_ordering()); + } + /// The three temporal matrix pivots must be present verbatim in DATE's /// fixture strings — `fetch_fixture_payload` fetches each one's ciphertext, /// failing loudly if absent. The integer `fixtures_include_min_max_and_zero` From 315fc30ad1d7bad00a67ded2020829514daf8255 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 19:38:25 +1000 Subject: [PATCH 177/599] feat(eql-scalars): text equality via hm; add text_search [Hm,Ore,Bloom] domain --- crates/eql-scalars/src/lib.rs | 22 +++++--- crates/eql-scalars/src/tests.rs | 91 +++++++++++++++++++++++++++++++-- 2 files changed, 104 insertions(+), 9 deletions(-) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index bc38d7d27..b9f87c704 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -353,10 +353,16 @@ pub const TIMESTAMPTZ: ScalarSpec = ScalarSpec { fixtures: TIMESTAMPTZ_FIXTURES, }; -/// Domains for `text`: the ordered shape plus a `_match` domain backed by the -/// `Bloom` term (`@>`/`<@` containment). The ordered subset (`""`, `_eq`, -/// `_ord_ore`, `_ord`) is identical to `ORDERED_INT_DOMAINS`; `_match` is the -/// only addition, so text still runs the standard ordered matrix. +/// Domains for `text`: the ordered shape (with exact `hm` equality on the +/// ordered domains), a `_match` domain (`Bloom` containment), and a combined +/// `_search` domain carrying equality + ordering + match in one type. +/// +/// **Equality always routes through `hm`.** Every eq-capable text domain leads +/// with `Hm` so `=`/`<>` resolve to `eq_term`/`hm`, never the ORE (`ob`) term — +/// ORE is not exact for `text`. `Term::Ore` keeps its kind-agnostic `=`/`<>` +/// claim; it simply never wins because `Hm` precedes it (Option 1, catalog +/// ordering). Integer kinds keep `[Ore]`-only `_ord` domains — ORE equality is +/// lossless for them. const TEXT_DOMAINS: &[DomainSpec] = &[ DomainSpec { suffix: "", @@ -372,11 +378,15 @@ const TEXT_DOMAINS: &[DomainSpec] = &[ }, DomainSpec { suffix: "_ord_ore", - terms: &[Term::Ore], + terms: &[Term::Hm, Term::Ore], }, DomainSpec { suffix: "_ord", - terms: &[Term::Ore], + terms: &[Term::Hm, Term::Ore], + }, + DomainSpec { + suffix: "_search", + terms: &[Term::Hm, Term::Ore, Term::Bloom], }, ]; diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index c74a89e93..b344da9f8 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -509,7 +509,10 @@ mod catalog_tests { let text = scalar("text"); assert_eq!(text.kind, ScalarKind::Text); let suffixes: Vec<_> = text.domains.iter().map(|d| d.suffix).collect(); - assert_eq!(suffixes, vec!["", "_eq", "_match", "_ord_ore", "_ord"]); + assert_eq!( + suffixes, + vec!["", "_eq", "_match", "_ord_ore", "_ord", "_search"] + ); } #[test] @@ -528,6 +531,73 @@ mod catalog_tests { assert!(!Term::Bloom.provides_ordering()); } + #[test] + fn every_eq_capable_text_domain_resolves_eq_through_hm() { + // ORE is not exact for text: `=`/`<>` must resolve to eq_term/hm on every + // text domain that advertises equality. `text_match` ([Bloom]) never + // advertises `=`, so it is excluded. + let text = scalar("text"); + for d in text.domains { + let supports_eq = Term::operators_for_terms(d.terms).contains(&"="); + if !supports_eq { + continue; + } + for op in ["=", "<>"] { + assert_eq!( + Term::extractor_for_operator(d.terms, op), + Some("eq_term"), + "text{} must resolve `{op}` to eq_term (exact hm), not ORE", + d.suffix + ); + } + // And the payload requires hm for these domains. + assert!( + Term::term_json_keys(d.terms).contains(&"hm"), + "text{} must require the `hm` payload key", + d.suffix + ); + } + } + + #[test] + fn text_search_domain_carries_all_three_terms_and_is_ord_capable() { + let text = scalar("text"); + let search = text + .domains + .iter() + .find(|d| d.suffix == "_search") + .expect("text must declare a _search domain"); + assert_eq!( + search.terms, + &[Term::Hm, Term::Ore, Term::Bloom], + "text_search must carry [Hm, Ore, Bloom]" + ); + // ord-capable: some term provides ordering. + assert!( + search.terms.iter().any(|t| t.provides_ordering()), + "text_search must be ord-capable" + ); + // Required JSON keys are hm + ob + bf, in term order. + assert_eq!( + Term::term_json_keys(search.terms), + vec!["hm", "ob", "bf"], + "text_search CHECK must require hm, ob, bf" + ); + // Equality still routes through hm; ordering through ob; match through bf. + assert_eq!( + Term::extractor_for_operator(search.terms, "="), + Some("eq_term") + ); + assert_eq!( + Term::extractor_for_operator(search.terms, "<"), + Some("ord_term") + ); + assert_eq!( + Term::extractor_for_operator(search.terms, "@>"), + Some("match_term") + ); + } + /// The three temporal matrix pivots must be present verbatim in DATE's /// fixture strings — `fetch_fixture_payload` fetches each one's ciphertext, /// failing loudly if absent. The integer `fixtures_include_min_max_and_zero` @@ -603,11 +673,25 @@ mod catalog_tests { ("_ord_ore", &[Term::Ore][..]), ("_ord", &[Term::Ore][..]), ]; + // text's current shape: equality is exact on the ordered domains (they + // lead with `Hm`), plus a combined `_search` domain carrying all three + // terms. `=`/`<>` route through `hm` on every eq-capable text domain. + let text_search: Vec<(&str, &[Term])> = vec![ + ("", &[] as &[Term]), + ("_eq", &[Term::Hm][..]), + ("_match", &[Term::Bloom][..]), + ("_ord_ore", &[Term::Hm, Term::Ore][..]), + ("_ord", &[Term::Hm, Term::Ore][..]), + ("_search", &[Term::Hm, Term::Ore, Term::Bloom][..]), + ]; for s in CATALOG { let shape: Vec<(&str, &[Term])> = s.domains.iter().map(|d| (d.suffix, d.terms)).collect(); assert!( - shape == ordered || shape == eq_only || shape == ordered_match, + shape == ordered + || shape == eq_only + || shape == ordered_match + || shape == text_search, "{} has an unrecognised domain shape: {shape:?}", s.token ); @@ -619,7 +703,8 @@ mod catalog_tests { // Pin which catalog tokens carry which shape, so a row silently flipping // ORDERED_INT_DOMAINS <-> EQ_ONLY_DOMAINS is caught. timestamptz is // equality-only (12-block ORE vs 8-block comparator); the rest ordered - // (text adds a `_match` domain on top, so it is not eq_only either). + // (text adds `_match` and `_search` domains on top, so it is not + // eq_only either). for s in CATALOG { let is_eq_only = s.domains.len() == 2; let expect_eq_only = s.token == "timestamptz"; From 15ab850e26c7880f169ffd5bc6b93d582e788f7c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 19:40:05 +1000 Subject: [PATCH 178/599] fix(eql-codegen): gate aggregates on any ordering term (provides_ordering) --- crates/eql-codegen/src/context.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 027dc4cf2..15aeacc35 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -2,7 +2,7 @@ use crate::consts::*; use crate::operator_surface::Operator; -use eql_scalars::{DomainSpec, Role, Term}; +use eql_scalars::{DomainSpec, Term}; /// Build the minijinja environment with the embedded templates: one whole-file /// template per output file (`types`/`functions`/`operators`/`aggregates`) plus @@ -268,13 +268,12 @@ pub const AGGREGATE_OPS: &[AggregateOp] = &[ }, ]; -/// True if the domain carries a comparator term (any term that supports `<`). -/// Unions across the terms — consistent with `Term::operators_for_terms` — -/// rather than reading only the first, so a future mixed-term domain that -/// carries an ord term anywhere is correctly ord-capable. Port of -/// `is_ord_capable`. +/// True if any of the domain's terms provides ordering (`<` `<=` `>` `>=`), +/// gating `min`/`max` aggregate emission. Asks a per-term *capability* (not the +/// whole-domain first-term `Role`), so a `[Hm, Ore]` domain — first term `Hm`, +/// `Role::Eq` — is still correctly ord-capable and emits aggregates. pub fn is_ord_capable(terms: &[Term]) -> bool { - terms.iter().any(|t| t.role() == Role::Ord) + terms.iter().any(|t| t.provides_ordering()) } #[cfg(test)] @@ -287,9 +286,12 @@ mod tests { } #[test] - fn is_ord_capable_matches_role() { + fn is_ord_capable_is_true_when_any_term_provides_ordering() { assert!(is_ord_capable(&[Term::Ore])); + assert!(is_ord_capable(&[Term::Hm, Term::Ore])); + assert!(is_ord_capable(&[Term::Hm, Term::Ore, Term::Bloom])); assert!(!is_ord_capable(&[Term::Hm])); + assert!(!is_ord_capable(&[Term::Bloom])); assert!(!is_ord_capable(&[])); } From 8ba575cce89a23b1fa1842cf42ee0da920e07d4e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 19:42:14 +1000 Subject: [PATCH 179/599] test(codegen): regenerate text reference files for text_search + hm-routed ordered domains --- .../reference/text/text_ord_functions.sql | 21 +- .../reference/text/text_ord_ore_functions.sql | 21 +- .../reference/text/text_search_aggregates.sql | 63 +++ .../reference/text/text_search_functions.sql | 408 ++++++++++++++++++ .../reference/text/text_search_operators.sql | 252 +++++++++++ tests/codegen/reference/text/text_types.sql | 20 + 6 files changed, 773 insertions(+), 12 deletions(-) create mode 100644 tests/codegen/reference/text/text_search_aggregates.sql create mode 100644 tests/codegen/reference/text/text_search_functions.sql create mode 100644 tests/codegen/reference/text/text_search_operators.sql diff --git a/tests/codegen/reference/text/text_ord_functions.sql b/tests/codegen/reference/text/text_ord_functions.sql index 7bd872fc0..f07e8b64c 100644 --- a/tests/codegen/reference/text/text_ord_functions.sql +++ b/tests/codegen/reference/text/text_ord_functions.sql @@ -3,12 +3,21 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/text/text_types.sql -- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql -- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql -- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql --! @file encrypted_domain/text/text_ord_functions.sql --! @brief Functions for eql_v3.text_ord. +--! @brief Index extractor for eql_v3.text_ord. +--! @param a eql_v3.text_ord +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_ord) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + --! @brief Index extractor for eql_v3.text_ord. --! @param a eql_v3.text_ord --! @return eql_v3.ore_block_u64_8_256 @@ -23,7 +32,7 @@ AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; --! @return boolean CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord, b eql_v3.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord. --! @param a eql_v3.text_ord @@ -31,7 +40,7 @@ AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; --! @return boolean CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.text_ord) $$; +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_ord) $$; --! @brief Operator wrapper for eql_v3.text_ord. --! @param a jsonb @@ -39,7 +48,7 @@ AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.text_ord) $$; --! @return boolean CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) = eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord) = eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord. --! @param a eql_v3.text_ord @@ -47,7 +56,7 @@ AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) = eql_v3.ord_term(b) $$; --! @return boolean CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord, b eql_v3.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord. --! @param a eql_v3.text_ord @@ -55,7 +64,7 @@ AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; --! @return boolean CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.text_ord) $$; +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_ord) $$; --! @brief Operator wrapper for eql_v3.text_ord. --! @param a jsonb @@ -63,7 +72,7 @@ AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.text_ord) $$; --! @return boolean CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) <> eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord) <> eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord. --! @param a eql_v3.text_ord diff --git a/tests/codegen/reference/text/text_ord_ore_functions.sql b/tests/codegen/reference/text/text_ord_ore_functions.sql index f1353486e..58e1abac2 100644 --- a/tests/codegen/reference/text/text_ord_ore_functions.sql +++ b/tests/codegen/reference/text/text_ord_ore_functions.sql @@ -3,12 +3,21 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/text/text_types.sql -- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql -- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql -- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql --! @file encrypted_domain/text/text_ord_ore_functions.sql --! @brief Functions for eql_v3.text_ord_ore. +--! @brief Index extractor for eql_v3.text_ord_ore. +--! @param a eql_v3.text_ord_ore +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_ord_ore) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + --! @brief Index extractor for eql_v3.text_ord_ore. --! @param a eql_v3.text_ord_ore --! @return eql_v3.ore_block_u64_8_256 @@ -23,7 +32,7 @@ AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; --! @return boolean CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord_ore. --! @param a eql_v3.text_ord_ore @@ -31,7 +40,7 @@ AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; --! @return boolean CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_ord_ore) $$; --! @brief Operator wrapper for eql_v3.text_ord_ore. --! @param a jsonb @@ -39,7 +48,7 @@ AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; --! @return boolean CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) = eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord_ore) = eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord_ore. --! @param a eql_v3.text_ord_ore @@ -47,7 +56,7 @@ AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) = eql_v3.ord_term(b) $$; --! @return boolean CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord_ore. --! @param a eql_v3.text_ord_ore @@ -55,7 +64,7 @@ AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; --! @return boolean CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ore, b jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_ord_ore) $$; --! @brief Operator wrapper for eql_v3.text_ord_ore. --! @param a jsonb @@ -63,7 +72,7 @@ AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.text_ord_ore) $$; --! @return boolean CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) <> eql_v3.ord_term(b) $$; +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord_ore) <> eql_v3.eq_term(b) $$; --! @brief Operator wrapper for eql_v3.text_ord_ore. --! @param a eql_v3.text_ord_ore diff --git a/tests/codegen/reference/text/text_search_aggregates.sql b/tests/codegen/reference/text/text_search_aggregates.sql new file mode 100644 index 000000000..2b03122a1 --- /dev/null +++ b/tests/codegen/reference/text/text_search_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_search_functions.sql +-- REQUIRE: src/v3/scalars/text/text_search_operators.sql + +--! @file encrypted_domain/text/text_search_aggregates.sql +--! @brief Aggregates for eql_v3.text_search. + +--! @brief State function for min on eql_v3.text_search. +--! @param state eql_v3.text_search +--! @param value eql_v3.text_search +--! @return eql_v3.text_search +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.text_search, value eql_v3.text_search) +RETURNS eql_v3.text_search +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.text_search. +--! @param input eql_v3.text_search +--! @return eql_v3.text_search +CREATE AGGREGATE eql_v3.min(eql_v3.text_search) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.text_search, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.text_search. +--! @param state eql_v3.text_search +--! @param value eql_v3.text_search +--! @return eql_v3.text_search +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.text_search, value eql_v3.text_search) +RETURNS eql_v3.text_search +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.text_search. +--! @param input eql_v3.text_search +--! @return eql_v3.text_search +CREATE AGGREGATE eql_v3.max(eql_v3.text_search) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.text_search, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/text/text_search_functions.sql b/tests/codegen/reference/text/text_search_functions.sql new file mode 100644 index 000000000..21dd57936 --- /dev/null +++ b/tests/codegen/reference/text/text_search_functions.sql @@ -0,0 +1,408 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/bloom_filter/functions.sql + +--! @file encrypted_domain/text/text_search_functions.sql +--! @brief Functions for eql_v3.text_search. + +--! @brief Index extractor for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_search) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Index extractor for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @return eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_search) +RETURNS eql_v3.ore_block_u64_8_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; + +--! @brief Index extractor for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @return eql_v3.bloom_filter +CREATE FUNCTION eql_v3.match_term(a eql_v3.text_search) +RETURNS eql_v3.bloom_filter +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.bloom_filter(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_search) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_search) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a::eql_v3.text_search) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_search, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_search, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::eql_v3.text_search) $$; + +--! @brief Operator wrapper for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a::eql_v3.text_search) <@ eql_v3.match_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param selector text +--! @return eql_v3.text_search +CREATE FUNCTION eql_v3."->"(a eql_v3.text_search, selector text) +RETURNS eql_v3.text_search IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param selector integer +--! @return eql_v3.text_search +CREATE FUNCTION eql_v3."->"(a eql_v3.text_search, selector integer) +RETURNS eql_v3.text_search IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a jsonb +--! @param selector eql_v3.text_search +--! @return eql_v3.text_search +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.text_search) +RETURNS eql_v3.text_search IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_search, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.text_search, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a jsonb +--! @param selector eql_v3.text_search +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.text_search) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.text_search, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.text_search, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.text_search, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.text_search, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.text_search, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.text_search, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.text_search, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_search, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_search, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.text_search, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.text_search, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b eql_v3.text_search +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_search, b eql_v3.text_search) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a eql_v3.text_search +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.text_search, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.text_search. +--! @param a jsonb +--! @param b eql_v3.text_search +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.text_search) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_search'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/text/text_search_operators.sql b/tests/codegen/reference/text/text_search_operators.sql new file mode 100644 index 000000000..869889f2e --- /dev/null +++ b/tests/codegen/reference/text/text_search_operators.sql @@ -0,0 +1,252 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_types.sql +-- REQUIRE: src/v3/scalars/text/text_search_functions.sql + +--! @file encrypted_domain/text/text_search_operators.sql +--! @brief Operators for eql_v3.text_search. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_search, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.text_search, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_search, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.text_search, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.text_search, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.text_search, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.text_search, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.text_search, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.text_search, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.text_search, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.text_search, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_search, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_search, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.text_search, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.text_search, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.text_search, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.text_search +); diff --git a/tests/codegen/reference/text/text_types.sql b/tests/codegen/reference/text/text_types.sql index e0043d823..c7bde459c 100644 --- a/tests/codegen/reference/text/text_types.sql +++ b/tests/codegen/reference/text/text_types.sql @@ -65,6 +65,7 @@ BEGIN AND VALUE ? 'v' AND VALUE ? 'i' AND VALUE ? 'c' + AND VALUE ? 'hm' AND VALUE ? 'ob' AND VALUE->>'v' = '2' ); @@ -81,9 +82,28 @@ BEGIN AND VALUE ? 'v' AND VALUE ? 'i' AND VALUE ? 'c' + AND VALUE ? 'hm' AND VALUE ? 'ob' AND VALUE->>'v' = '2' ); END IF; + + --! @brief Encrypted domain eql_v3.text_search. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_search' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.text_search AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE ? 'ob' + AND VALUE ? 'bf' + AND VALUE->>'v' = '2' + ); + END IF; END $$; From bb409afa39260c2fb77c8c538ad72e4c19e59a57 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 20:15:17 +1000 Subject: [PATCH 180/599] refactor(tests): derive Variant term sets from CATALOG; add Search variant + resolution backstop --- crates/eql-scalars/src/spec.rs | 7 + crates/eql-scalars/src/tests.rs | 10 + tests/sqlx/src/matrix.rs | 2 +- tests/sqlx/src/scalar_domains.rs | 200 +++++++++++++----- .../tests/encrypted_domain/family/support.rs | 38 +++- tests/sqlx/tests/lint_tests.rs | 7 +- 6 files changed, 203 insertions(+), 61 deletions(-) diff --git a/crates/eql-scalars/src/spec.rs b/crates/eql-scalars/src/spec.rs index 2d9ae7ea2..11dfd076b 100644 --- a/crates/eql-scalars/src/spec.rs +++ b/crates/eql-scalars/src/spec.rs @@ -28,4 +28,11 @@ impl ScalarSpec { pub fn is_eq_only(&self) -> bool { !self.domains.iter().any(|d| d.suffix == "_ord") } + + /// The domain on this scalar with the given `suffix`, or `None`. Centralizes + /// the `domains.iter().find(|d| d.suffix == s)` lookup duplicated across the + /// catalog tests and the SQLx harness. + pub fn domain_by_suffix(&self, suffix: &str) -> Option<&DomainSpec> { + self.domains.iter().find(|d| d.suffix == suffix) + } } diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index b344da9f8..017de2174 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -559,6 +559,16 @@ mod catalog_tests { } } + #[test] + fn domain_by_suffix_finds_declared_suffixes() { + let text = scalar("text"); + assert_eq!( + text.domain_by_suffix("_search").map(|d| d.suffix), + Some("_search") + ); + assert!(text.domain_by_suffix("_nope").is_none()); + } + #[test] fn text_search_domain_carries_all_three_terms_and_is_ord_capable() { let text = scalar("text"); diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 59a933cd5..83ccaad48 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -908,7 +908,7 @@ macro_rules! __scalar_matrix_payload_check_case { let baseline = $crate::helpers::PLACEHOLDER_PAYLOAD; // Each required key must trigger CHECK rejection when stripped. - for key in spec.variant.payload_required_keys() { + for key in spec.payload_required_keys() { let sql = format!( "SELECT ('{baseline}'::jsonb - '{key}')::{d}", ); diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 6ce407f7c..06c02d74c 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -10,6 +10,7 @@ //! `T::fixture_values()`, and the `Variant` enum. use anyhow::{bail, Context, Result}; +use eql_scalars::{Term, CATALOG}; use sqlx::PgPool; use std::fmt::{Debug, Display}; @@ -494,24 +495,36 @@ mod text_value_tests { } } -/// Per-domain capability + payload shape. Storage carries no terms, `Eq` -/// adds `hm`, `Ord`/`OrdOre` add `ob`. `Ord` and `OrdOre` are deliberate -/// twins — same operator surface, different SQL domain names — for the -/// scheme-explicit vs converged-name migration story. +/// Per-domain capability + payload shape, resolved from `CATALOG`. Each +/// variant maps to a domain suffix (`Eq` => `_eq`, `Search` => `_search`, +/// …); its terms, required payload keys, supported operators, and +/// per-operator extractors are derived from the catalog row for a given +/// scalar `token`, never hardcoded. This is the SAME single source codegen +/// renders from, so the harness routing cannot drift from the generated SQL. +/// `Ord` and `OrdOre` are deliberate twins — same operator surface, +/// different SQL domain names — for the scheme-explicit vs converged-name +/// migration story. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Variant { Storage, Eq, Ord, OrdOre, + Search, } impl Variant { - /// Every variant the family currently materialises, in declaration - /// order. Tests iterate over this rather than hand-listing variants - /// so adding a future variant requires no test edit. - pub const ALL: &'static [Variant] = - &[Variant::Storage, Variant::Eq, Variant::Ord, Variant::OrdOre]; + /// Every variant the family can materialise, in declaration order. Not + /// every scalar declares every variant (only `text` declares `_search`), + /// so iteration sites that span scalars must filter with + /// [`Variant::is_declared_for`]. + pub const ALL: &'static [Variant] = &[ + Variant::Storage, + Variant::Eq, + Variant::Ord, + Variant::OrdOre, + Variant::Search, + ]; pub const fn suffix(self) -> &'static str { match self { @@ -519,54 +532,80 @@ impl Variant { Variant::Eq => "_eq", Variant::Ord => "_ord", Variant::OrdOre => "_ord_ore", + Variant::Search => "_search", } } - /// Term key the variant requires on its CHECK constraint. `Storage` - /// requires nothing beyond the envelope; `Eq` requires `hm`; - /// `Ord` / `OrdOre` require `ob`. Read by tests that need to know - /// "what term does this variant carry?" — not by payload builders; - /// see `PLACEHOLDER_PAYLOAD`. - pub const fn required_term(self) -> Option<&'static str> { - match self { - Variant::Storage => None, - Variant::Eq => Some("hm"), - Variant::Ord | Variant::OrdOre => Some("ob"), - } + /// The fixed index terms this variant's domain carries for scalar `token`, + /// from `CATALOG`. Panics if the `(token, suffix())` pair is not declared — + /// the resolution backstop test guarantees every instantiated pair + /// resolves, so a panic here means the matrix and catalog drifted. Guard + /// cross-scalar iteration with [`Variant::is_declared_for`]. + pub fn terms_for(self, token: &str) -> &'static [Term] { + CATALOG + .iter() + .find(|s| s.token == token) + .and_then(|s| s.domain_by_suffix(self.suffix())) + .map(|d| d.terms) + .unwrap_or_else(|| { + panic!( + "no catalog domain for ({token}, {self:?}) suffix `{}`", + self.suffix() + ) + }) + } + + /// True when scalar `token` declares this variant's domain in `CATALOG`. + /// Use to filter `Variant::ALL` when iterating across scalars that do not + /// all declare the same variants (e.g. only `text` declares `_search`). + pub fn is_declared_for(self, token: &str) -> bool { + CATALOG + .iter() + .find(|s| s.token == token) + .and_then(|s| s.domain_by_suffix(self.suffix())) + .is_some() } - /// Top-level JSONB keys the variant's domain CHECK requires. - /// Storage requires the EQL envelope (`v`, `i`, `c`); ord-capable - /// variants additionally require their term key (`hm` / `ob`). The - /// matrix `payload_check` arm iterates this to assert each key's - /// absence is rejected at the cast. - pub fn payload_required_keys(self) -> impl Iterator { - eql_scalars::ENVELOPE_KEYS - .iter() - .copied() - .chain(self.required_term()) + /// Top-level JSONB keys the variant's domain CHECK requires for `token`: + /// the EQL envelope (`v`, `i`, `c`) plus each term's payload key + /// (`hm`/`ob`/`bf`), in term order. Catalog-derived — `text_ord` yields + /// `[v, i, c, hm, ob]`; `text_search` yields `[v, i, c, hm, ob, bf]`. The + /// matrix `payload_check` arm iterates this to assert each key's absence is + /// rejected at the cast. + pub fn payload_required_keys(self, token: &str) -> Vec<&'static str> { + let mut keys = vec!["v", "i", "c"]; + keys.extend(Term::term_json_keys(self.terms_for(token))); + keys } - pub const fn supports_eq(self) -> bool { - !matches!(self, Variant::Storage) + /// True when the variant's domain supports `=`/`<>` for `token`. + pub fn supports_eq(self, token: &str) -> bool { + Term::operators_for_terms(self.terms_for(token)).contains(&"=") } - pub const fn supports_ord(self) -> bool { - matches!(self, Variant::Ord | Variant::OrdOre) + /// True when the variant's domain supports the four ordering operators. + pub fn supports_ord(self, token: &str) -> bool { + self.terms_for(token).iter().any(|t| t.provides_ordering()) } - /// Function name of the discriminating extractor for this variant, - /// or `None` if the variant carries no extractor (`Storage`). Returns - /// just the function name — call sites append `(column)` themselves so - /// the accessor is decoupled from any specific column-naming - /// convention. `Eq` resolves to `eql_v3.eq_term`; `Ord` and `OrdOre` - /// both resolve to `eql_v3.ord_term`. - pub const fn extractor_fn(self) -> Option<&'static str> { - match self { - Variant::Storage => None, - Variant::Eq => Some("eql_v3.eq_term"), - Variant::Ord | Variant::OrdOre => Some("eql_v3.ord_term"), - } + /// The `eql_v3`-qualified extractor that serves `op` on this variant's + /// domain for `token`, or `None` if unsupported (or `Storage`). Derived via + /// `Term::extractor_for_operator` — the SAME single source codegen uses, so + /// the harness routing cannot diverge from the generated SQL. For + /// `text_ord` `[Hm, Ore]`, `=` => `eql_v3.eq_term`, `<` => `eql_v3.ord_term`. + pub fn extractor_for_op(self, token: &str, op: &str) -> Option { + Term::extractor_for_operator(self.terms_for(token), op).map(|f| format!("eql_v3.{f}")) + } + + /// The `eql_v3`-qualified extractor of this variant's first + /// extractor-bearing term for `token`, or `None` for `Storage`. Used where + /// a single representative extractor is needed independent of any operator + /// (e.g. the `COUNT(DISTINCT)` deduplication arm). For a multi-term domain + /// this is the first term's extractor (`text_ord` `[Hm, Ore]` => `eq_term`). + pub fn primary_extractor(self, token: &str) -> Option { + Term::extractor_terms(self.terms_for(token)) + .first() + .map(|t| format!("eql_v3.{}", t.extractor())) } } @@ -583,6 +622,10 @@ pub struct ScalarDomainSpec { pub placeholder_payload: &'static str, pub eq_extractor: fn(&str) -> String, pub ord_extractor: fn(&str) -> String, + /// The scalar's catalog token (`T::PG_TYPE`, e.g. `"int4"`, `"text"`). + /// Carried so the delegating capability methods can resolve the variant's + /// terms from `CATALOG` without the call site re-supplying the token. + pub token: &'static str, } impl ScalarDomainSpec { @@ -594,31 +637,48 @@ impl ScalarDomainSpec { placeholder_payload: T::placeholder_payload(), eq_extractor: T::eq_extractor_expr, ord_extractor: T::ord_extractor_expr, + token: T::PG_TYPE, } } pub fn supports_eq(&self) -> bool { - self.variant.supports_eq() + self.variant.supports_eq(self.token) } pub fn supports_ord(&self) -> bool { - self.variant.supports_ord() + self.variant.supports_ord(self.token) + } + + /// Top-level JSONB keys the domain CHECK requires (envelope + term keys). + pub fn payload_required_keys(&self) -> Vec<&'static str> { + self.variant.payload_required_keys(self.token) } - pub fn extractor_fn(&self) -> Option<&'static str> { - self.variant.extractor_fn() + /// The `eql_v3`-qualified extractor serving `op`, or `None` if unsupported. + pub fn extractor_for_op(&self, op: &str) -> Option { + self.variant.extractor_for_op(self.token, op) + } + + /// A single representative extractor (first term's), independent of any + /// operator. `None` for `Storage`. + pub fn primary_extractor(&self) -> Option { + self.variant.primary_extractor(self.token) } /// Extractor expression for the variant's discriminating term applied to /// `value_expr`. Routes through the per-type `eq_extractor` / `ord_extractor` /// seams, so scalars produce `eql_v3.eq_term(...)` / `eql_v3.ord_term(...)` /// and a SteVec-entry view produces `eql_v3.eq_term(...)` / `eql_v3.ore_cllw(...)`. - /// `Storage` has no discriminating term and returns `None`. + /// `Storage` has no discriminating term and returns `None`. `Search` (the + /// combined `_search` domain, which provides ordering) routes through the + /// ordered extractor like `Ord`/`OrdOre`. pub fn extractor_expr(&self, value_expr: &str) -> Option { match self.variant { Variant::Storage => None, Variant::Eq => Some((self.eq_extractor)(value_expr)), - Variant::Ord | Variant::OrdOre => Some((self.ord_extractor)(value_expr)), + Variant::Ord | Variant::OrdOre | Variant::Search => { + Some((self.ord_extractor)(value_expr)) + } } } } @@ -821,3 +881,39 @@ mod seam_tests { assert_eq!(storage.extractor_expr("value"), None); } } + +#[cfg(test)] +mod catalog_resolution_tests { + use super::*; + + /// The runtime `(token, suffix)` lookup behind `Variant::terms_for` fails as + /// a panic. Backstop it: every `(scalar, Variant::suffix())` pair the matrix + /// could instantiate must resolve in `CATALOG`, and the resolved term set + /// must agree with the catalog row — a drift between the `Variant` model and + /// the catalog would otherwise only surface when that specific DB test runs. + #[test] + fn every_matrix_variant_pair_resolves_in_catalog() { + for spec in CATALOG { + for variant in Variant::ALL { + let suffix = variant.suffix(); + // A variant is instantiated for a token iff that token declares + // the suffix; only assert those pairs. + if let Some(d) = spec.domain_by_suffix(suffix) { + assert!( + variant.is_declared_for(spec.token), + "{}{} declared in CATALOG but is_declared_for is false", + spec.token, + suffix + ); + assert_eq!( + variant.terms_for(spec.token), + d.terms, + "{}{} term set drift between Variant and CATALOG", + spec.token, + suffix + ); + } + } + } + } +} diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index f571ca4e6..359fe7b02 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -12,30 +12,49 @@ use sqlx::PgPool; #[test] fn variant_derives_consistent_sql_domain_and_capabilities() { + // Capabilities are catalog-derived for the scalar's token (`int4`). int4's + // ordered domains are `[Ore]`-only — ORE is lossless for integers, so `=` + // routes through `ord_term`, unlike text where `=` routes through `eq_term`. let storage = ScalarDomainSpec::new::(Variant::Storage); assert_eq!(storage.sql_domain, "eql_v3.int4"); assert!(!storage.supports_eq()); assert!(!storage.supports_ord()); - assert_eq!(storage.extractor_fn(), None); - assert_eq!(Variant::Storage.required_term(), None); + assert_eq!(storage.primary_extractor(), None); + assert_eq!( + Variant::Storage.payload_required_keys("int4"), + vec!["v", "i", "c"] + ); let eq = ScalarDomainSpec::new::(Variant::Eq); assert_eq!(eq.sql_domain, "eql_v3.int4_eq"); assert!(eq.supports_eq()); assert!(!eq.supports_ord()); - assert_eq!(eq.extractor_fn(), Some("eql_v3.eq_term")); - assert_eq!(Variant::Eq.required_term(), Some("hm")); + assert_eq!(eq.primary_extractor().as_deref(), Some("eql_v3.eq_term")); + assert_eq!(eq.extractor_for_op("=").as_deref(), Some("eql_v3.eq_term")); + assert_eq!( + Variant::Eq.payload_required_keys("int4"), + vec!["v", "i", "c", "hm"] + ); let ord = ScalarDomainSpec::new::(Variant::Ord); assert_eq!(ord.sql_domain, "eql_v3.int4_ord"); assert!(ord.supports_ord()); - assert_eq!(ord.extractor_fn(), Some("eql_v3.ord_term")); - assert_eq!(Variant::Ord.required_term(), Some("ob")); + assert_eq!(ord.primary_extractor().as_deref(), Some("eql_v3.ord_term")); + // int4_ord is `[Ore]`-only: equality routes through ORE (lossless for ints). + assert_eq!(ord.extractor_for_op("=").as_deref(), Some("eql_v3.ord_term")); + assert_eq!(ord.extractor_for_op("<").as_deref(), Some("eql_v3.ord_term")); + assert_eq!( + Variant::Ord.payload_required_keys("int4"), + vec!["v", "i", "c", "ob"] + ); let ord_ore = ScalarDomainSpec::new::(Variant::OrdOre); assert_eq!(ord_ore.sql_domain, "eql_v3.int4_ord_ore"); assert!(ord_ore.supports_ord()); - assert_eq!(ord_ore.extractor_fn(), Some("eql_v3.ord_term")); + assert_eq!( + ord_ore.primary_extractor().as_deref(), + Some("eql_v3.ord_term") + ); } #[test] @@ -120,6 +139,11 @@ async fn placeholder_payload_satisfies_every_variant_check(pool: PgPool) -> Resu // future scalar) lands, wrap this in a per-type loop so the // PLACEHOLDER_PAYLOAD cast is exercised against every scalar. for variant in Variant::ALL { + // int4 does not declare every variant (no `_search`); skip the ones it + // lacks so the cast targets a real domain. + if !variant.is_declared_for("int4") { + continue; + } let spec = ScalarDomainSpec::new::(*variant); let sql = format!("SELECT $1::jsonb::{}", spec.sql_domain); sqlx::query(&sql) diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index a7f9152db..f5768d3b6 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -330,8 +330,13 @@ async fn scalar_family_inlinable_operators_are_clean(pool: PgPool) -> Result<()> if matches!(variant, Variant::Storage) { continue; } + // Not every scalar declares every variant (only `text` declares + // `_search`); skip variants this scalar does not carry. + if !variant.is_declared_for(pg_type) { + continue; + } let domain = format!("eql_v3.{pg_type}{}", variant.suffix()); - let supported_ops: &[&str] = if variant.supports_ord() { + let supported_ops: &[&str] = if variant.supports_ord(pg_type) { &["=", "<>", "<", "<=", ">", ">="] } else { // Eq variants support equality only; ordering ops on `_eq` From b790ec64f83612df02d92deb951cbaa63aad5e31 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 20:21:24 +1000 Subject: [PATCH 181/599] test(tests): bf in PLACEHOLDER_PAYLOAD; catalog-derive fixture_shape bf check --- tests/sqlx/src/helpers.rs | 12 +++++++----- tests/sqlx/src/matrix.rs | 14 ++++++++++++-- tests/sqlx/src/scalar_domains.rs | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/tests/sqlx/src/helpers.rs b/tests/sqlx/src/helpers.rs index 2e111e559..cb242b3eb 100644 --- a/tests/sqlx/src/helpers.rs +++ b/tests/sqlx/src/helpers.rs @@ -7,17 +7,19 @@ use serde_json; use sqlx::{PgPool, Row}; /// Sentinel payload that satisfies every encrypted-domain CHECK in the -/// `eql_v2_{,_eq,_ord,_ord_ore}` family. Carries the EQL envelope -/// (`v`, `i`, `c`) plus *both* term keys (`hm`, `ob`) so one bind value -/// works for any variant's cast. +/// `eql_v3.{,_eq,_match,_ord,_ord_ore,_search}` family. Carries the EQL +/// envelope (`v`, `i`, `c`) plus *all three* term keys (`hm`, `ob`, `bf`) so +/// one bind value works for any variant's cast — including the combined +/// `text_search` domain, whose CHECK requires `hm` + `ob` + `bf`. /// /// Used by blocker / null-result tests where the payload is bound but /// never decrypted — the blocker raises (or the STRICT wrapper /// short-circuits) before the term values matter. **Not a representative /// payload.** Real encrypted payloads come from the fixture -/// (Proxy-encrypted). +/// (Proxy-encrypted). `bf` is a `smallint[]` (bloom-filter bit positions); a +/// small integer array satisfies the key-presence CHECK. pub const PLACEHOLDER_PAYLOAD: &str = - r#"{"v":2,"i":{"t":"t","c":"c"},"c":"sample","hm":"sample","ob":["00"]}"#; + r#"{"v":2,"i":{"t":"t","c":"c"},"c":"sample","hm":"sample","ob":["00"],"bf":[1,2,3]}"#; /// Fetch ORE encrypted value from pre-seeded ore table /// diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 83ccaad48..0c9901e5d 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1456,11 +1456,21 @@ macro_rules! __scalar_matrix_fixture_shape { anyhow::ensure!(plaintexts == expected, "plaintext column must match FIXTURE_VALUES in order"); - for (label, predicate) in [ + // The proxy emits `hm` + `ob` for every scalar's fixture, plus + // `bf` for scalars that declare a Bloom-bearing domain (only + // `text`, via `_match`/`_search`). `bf` is thus catalog-derived + // so a `text_search` fixture additionally asserts its bloom term. + let mut term_checks: Vec<(&str, &str)> = vec![ ("hm string", "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'"), ("ob array", "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'"), ("c string", "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'"), - ] { + ]; + if $crate::scalar_domains::token_has_bloom_term(<$scalar as ScalarType>::PG_TYPE) { + term_checks.push( + ("bf array", "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'"), + ); + } + for (label, predicate) in term_checks { let missing: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(*) FROM {table} WHERE {predicate}", )).fetch_one(&pool).await?; diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 06c02d74c..5941016ec 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -683,6 +683,21 @@ impl ScalarDomainSpec { } } +/// True when scalar `token` declares any domain carrying the `Bloom` term — +/// i.e. its proxy-generated fixture payload includes a `bf` (bloom-filter) key. +/// Catalog-derived: only `text` (via `_match`/`_search`) declares a Bloom +/// domain, so only text fixtures carry `bf`. Note the proxy always emits `hm` +/// and `ob` for every scalar's fixture regardless of the declared domains, so +/// those two are asserted unconditionally; `bf` is the term that actually +/// tracks the catalog. +pub fn token_has_bloom_term(token: &str) -> bool { + CATALOG + .iter() + .find(|s| s.token == token) + .map(|s| s.domains.iter().any(|d| d.terms.contains(&Term::Bloom))) + .unwrap_or(false) +} + /// SQL string-literal escaping for direct interpolation. pub fn sql_string_literal(value: &str) -> String { format!("'{}'", value.replace('\'', "''")) From 694ed21a94c9613e1eb38792f8bf955cae1c7fa4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 20:27:08 +1000 Subject: [PATCH 182/599] test(tests): make ord_routes_through_ob term-aware (eq via hm for text ordered domains) --- tests/sqlx/src/matrix.rs | 100 ++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 33 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 0c9901e5d..f6d3ac2f6 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1546,37 +1546,74 @@ macro_rules! __scalar_matrix_ord_routes_case { async fn []( pool: sqlx::PgPool, ) -> anyhow::Result<()> { + use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; + let token = <$scalar as ScalarType>::PG_TYPE; let table = concat!( - "matrix_", stringify!($suite), "_", stringify!($dom_name), "_no_hm", + "matrix_", stringify!($suite), "_", stringify!($dom_name), "_routing", ); let index = concat!( - "matrix_", stringify!($suite), "_", stringify!($dom_name), "_no_hm_idx", + "matrix_", stringify!($suite), "_", stringify!($dom_name), "_routing_idx", ); - let fixture_table = - <$scalar as $crate::scalar_domains::ScalarType>::fixture_table_name(); - let pivot: $scalar = - <$scalar as $crate::scalar_domains::ScalarType>::fixture_values()[0].clone(); - let pivot_lit = - <$scalar as $crate::scalar_domains::ScalarType>::to_sql_literal(&pivot); + let fixture_table = <$scalar as ScalarType>::fixture_table_name(); + let pivot: $scalar = <$scalar as ScalarType>::fixture_values()[0].clone(); + let pivot_lit = <$scalar as ScalarType>::to_sql_literal(&pivot); + + // Equality routing is kind-dependent, and this arm proves it: + // - hm-bearing ordered domain (text `[Hm, Ore]`): equality is + // EXACT via `hm` and must NOT route through ORE. `hm` AND `ob` + // are both CHECK-required, so neither can be stripped; instead + // we build the `eq_term` functional btree over the intact + // payload and prove `=` engages it. The planner only matches + // that index if `=` resolves to `eq_term` — so a green scan is + // positive proof equality is hm-exact, never ORE. + // - non-hm ordered domain (int4/date `[Ore]`): ORE is lossless, + // so `=` legitimately routes through `ord_term`/`ob`. `hm` is + // NOT CHECK-required, so we strip it and prove `=` still works + // via `ob` on an hm-free payload (the original invariant). + let carries_hm = spec + .variant + .terms_for(token) + .iter() + .any(|t| t.json_key() == "hm"); + let (extractor, value_expr, caveat): (&str, &str, &str) = if carries_hm { + ( + "eql_v3.eq_term", + "payload", + "= must engage the eql_v3.eq_term functional btree (exact hm), never ORE", + ) + } else { + ( + "eql_v3.ord_term", + "(payload - 'hm')", + "= must engage the eql_v3.ord_term functional btree with no hm", + ) + }; let mut tx = pool.begin().await?; sqlx::query(&format!( "CREATE TEMP TABLE {table} (plaintext {pg}, value {d}) ON COMMIT DROP", - pg = <$scalar as $crate::scalar_domains::ScalarType>::PG_TYPE, + pg = <$scalar as ScalarType>::PG_TYPE, )).execute(&mut *tx).await?; sqlx::query(&format!( "INSERT INTO {table}(plaintext, value) \ - SELECT plaintext, (payload - 'hm')::{d} FROM {fixture}", fixture = fixture_table, + SELECT plaintext, {value_expr}::{d} FROM {fixture}", fixture = fixture_table, )).execute(&mut *tx).await?; - let with_hm: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM {table} WHERE jsonb_exists(value::jsonb, 'hm')", - )).fetch_one(&mut *tx).await?; - anyhow::ensure!(with_hm == 0, "test rows must not carry hm"); + + // For the non-hm kind the routing proof must be over an hm-free + // payload — assert the strip really removed it. (The hm-bearing + // kind keeps `hm`: it is required, and `=` engaging the `eq_term` + // index is itself the proof equality is hm-based.) + if !carries_hm { + let with_hm: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM {table} WHERE jsonb_exists(value::jsonb, 'hm')", + )).fetch_one(&mut *tx).await?; + anyhow::ensure!(with_hm == 0, "test rows must not carry hm"); + } sqlx::query(&format!( - "CREATE INDEX {index} ON {table} USING btree (eql_v3.ord_term(value))", + "CREATE INDEX {index} ON {table} USING btree ({extractor}(value))", )).execute(&mut *tx).await?; sqlx::query(&format!("ANALYZE {table}")) .execute(&mut *tx).await?; @@ -1584,23 +1621,22 @@ macro_rules! __scalar_matrix_ord_routes_case { .execute(&mut *tx).await?; let pivot_payload: String = sqlx::query_scalar(&format!( - "SELECT (payload - 'hm')::text FROM {fixture} WHERE plaintext = {lit}", + "SELECT {value_expr}::text FROM {fixture} WHERE plaintext = {lit}", fixture = fixture_table, lit = pivot_lit, )).fetch_one(&mut *tx).await?; // The fixture plaintexts are distinct, so the pivot row is - // unique: `=` via ob must match EXACTLY one row, not "at - // least one". A weaker `>= 1` here is not independent of the - // `<>` check below — `expected_neq` is `len - eq_count`, so an - // `=` that over-matches inflates `eq_count` and deflates - // `expected_neq` in lockstep and both assertions still pass. - // Pinning `== 1` makes both this and the derived `<>` count - // load-bearing. + // unique: `=` must match EXACTLY one row, not "at least one". A + // weaker `>= 1` here is not independent of the `<>` check below — + // `expected_neq` is `len - eq_count`, so an `=` that over-matches + // inflates `eq_count` and deflates `expected_neq` in lockstep and + // both assertions still pass. Pinning `== 1` makes both this and + // the derived `<>` count load-bearing. let eq_count: i64 = sqlx::query_scalar(&format!( "SELECT count(*) FROM {table} WHERE value = $1::jsonb::{d}", )).bind(&pivot_payload).fetch_one(&mut *tx).await?; anyhow::ensure!(eq_count == 1, - "= must match exactly the pivot row via ob with no hm present (want 1, got {eq_count})"); + "= must match exactly the pivot row (want 1, got {eq_count})"); // Derive from the pinned `eq_count == 1`: every other fixture // row must be `<>`. Kept as `len - eq_count` (not a bare @@ -1608,8 +1644,7 @@ macro_rules! __scalar_matrix_ord_routes_case { // relaxed the two assertions cannot silently compensate for // each other — the derivation stays honest regardless. let expected_neq = - <$scalar as $crate::scalar_domains::ScalarType>::fixture_values().len() as i64 - - eq_count; + <$scalar as ScalarType>::fixture_values().len() as i64 - eq_count; let neq_count: i64 = sqlx::query_scalar(&format!( "SELECT count(*) FROM {table} WHERE value <> $1::jsonb::{d}", )).bind(&pivot_payload).fetch_one(&mut *tx).await?; @@ -1618,12 +1653,11 @@ macro_rules! __scalar_matrix_ord_routes_case { ); // VALIDITY, NOT PREFERENCE: this runs with - // `enable_seqscan = off` (set above) on the ~17-row fixture, - // so the planner picks the only usable alternative. A green - // assertion proves the `eql_v3.ord_term` functional btree is - // *usable* for `=` with no hm present, NOT that the planner - // would *prefer* it at realistic scale. Cost-preference lives - // in the `*_scale_preference_*` tests + // `enable_seqscan = off` (set above) on the small fixture, so the + // planner picks the only usable alternative. A green assertion + // proves the chosen functional btree is *usable* for `=`, NOT + // that the planner would *prefer* it at realistic scale. + // Cost-preference lives in the `*_scale_preference_*` tests // (`#[cfg(feature = "scale")]`, OFF in PR CI). See the module // header on `assert_index_scan_uses` for the full caveat. // @@ -1636,7 +1670,7 @@ macro_rules! __scalar_matrix_ord_routes_case { &mut *tx, &format!("SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}"), index, - "= must engage the eql_v3.ord_term functional btree with no hm", + caveat, ).await?; tx.commit().await?; From 91967a5544672347dcb34d0bf73b87be12c3e645 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 20:49:05 +1000 Subject: [PATCH 183/599] test(tests): wire text_search matrix arms (eq via eq_term, ord, full bloom match) --- crates/eql-tests-macros/src/lib.rs | 40 ++++- tests/sqlx/src/matrix.rs | 238 ++++++++++++++++++++++++++++- tests/sqlx/src/scalar_domains.rs | 44 ++++++ 3 files changed, 315 insertions(+), 7 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 1c0b76d57..771f55391 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -101,6 +101,17 @@ fn is_eq_only_token(token: &str) -> bool { spec_for_token(token).is_eq_only() } +/// True when `token`'s catalog row declares a combined `_search` domain +/// (currently only `text`). Consumed by [`matrix_suite_for_entry`] to route the +/// token to the `caps = [eq, ord, search]` arm, which additionally runs the +/// `_search` domain (equality + ordering + bloom match) through the matrix. +fn has_search_token(token: &str) -> bool { + spec_for_token(token) + .domains + .iter() + .any(|d| d.suffix == "_search") +} + /// The comma-separated list (optional trailing comma). struct ScalarList { entries: Vec, @@ -266,11 +277,20 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { /// not support. `eq_only` is passed in so this stays a pure function of its /// inputs and both arms are unit-testable without an eq-only row in the live /// catalog. -fn matrix_suite_for_entry(token: &Ident, rust_type: &Type, eq_only: bool) -> TokenStream2 { +fn matrix_suite_for_entry( + token: &Ident, + rust_type: &Type, + eq_only: bool, + has_search: bool, +) -> TokenStream2 { let token_str = token.to_string(); let eql_type = format!("eql_v2_{}", token_str); let caps = if eq_only { quote! { caps = [eq] } + } else if has_search { + // A token declaring a combined `_search` domain (text) additionally runs + // that domain through the matrix (equality + ordering + bloom match). + quote! { caps = [eq, ord, search] } } else { quote! { caps = [eq, ord] } }; @@ -295,6 +315,7 @@ fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { &e.token, &e.rust_type, is_eq_only_token(&e.token.to_string()), + has_search_token(&e.token.to_string()), ) }); quote! { #(#mods)* } @@ -488,7 +509,7 @@ mod tests { fn ordered_entry_emits_scalar_matrix_with_eq_ord_caps() { let token: Ident = syn::parse_str("int4").unwrap(); let rust_type: Type = syn::parse_str("i32").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, false)); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, false)); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq , ord]")); assert!(out.contains("suite = int4")); @@ -501,13 +522,26 @@ mod tests { // ord_domains), never the ordered `caps = [eq, ord]` arm. let token: Ident = syn::parse_str("timestamptz").unwrap(); let rust_type: Type = syn::parse_str("chrono::DateTime").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, true)); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, true, false)); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq]")); assert!(!out.contains("caps = [eq , ord]")); assert!(!out.contains("compile_error")); } + #[test] + fn search_entry_emits_scalar_matrix_with_eq_ord_search_caps() { + // A token declaring a `_search` domain (text) routes to the + // `caps = [eq, ord, search]` arm, which runs the combined `_search` + // domain through the matrix in addition to the ordered shape. + let token: Ident = syn::parse_str("text").unwrap(); + let rust_type: Type = syn::parse_str("String").unwrap(); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, true)); + assert!(out.contains(":: eql_tests :: scalar_matrix !")); + assert!(out.contains("caps = [eq , ord , search]")); + assert!(out.contains("suite = text")); + } + #[test] #[should_panic(expected = "not in eql-scalars::CATALOG")] fn unknown_token_fails_loudly() { diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index f6d3ac2f6..1158961ff 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -222,6 +222,79 @@ macro_rules! scalar_matrix { scale_default_combos = [ (ord, Ord, "eql_v3.ord_term", "btree"), ], + // No bloom-match domain on a pure ordered scalar (int/date). + match_domains = [], + } + }; + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal, + caps = [eq, ord, search] $(,)? + ) => { + $crate::scalar_domain_matrix! { + suite = $suite, + scalar = $scalar, + eql_type = $eql_type, + // See the `caps = [eq, ord]` arm for the fixed-path rationale. + fixture_path = "../../../fixtures", + // `_search` (combined `[Hm, Ore, Bloom]`) rides the eq + ord arms + // like any ordered domain, plus the bloom-match arms below. `_match` + // is deliberately absent: it supports only `@>`/`<@`, so it cannot + // ride the eq/ord arms, and its behaviour is covered by the sibling + // `encrypted_domain/text/text_match` suite. + all_domains = [(storage, Storage), (eq, Eq), (ord, Ord), (ord_ore, OrdOre), (search, Search)], + eq_domains = [(eq, Eq), (ord, Ord), (ord_ore, OrdOre), (search, Search)], + ord_domains = [(ord, Ord), (ord_ore, OrdOre), (search, Search)], + ord_ore_domains = [(ord_ore, OrdOre)], + pivots = [ + (min, <$scalar as $crate::scalar_domains::OrderedScalar>::min_pivot()), + (max, <$scalar as $crate::scalar_domains::OrderedScalar>::max_pivot()), + (mid, <$scalar as $crate::scalar_domains::OrderedScalar>::mid_pivot()), + ], + eq_ops = [(eq, "="), (neq, "<>")], + ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + // Equality on every text domain routes through `eq_term` (exact hm), + // never ORE — so the `=` index proof targets `eql_v3.eq_term`, split + // into its own combo (distinct dom_name) from the ordering ops, which + // target `eql_v3.ord_term`. The `_search` domain gets both. + index_combos = [ + (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), + (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), + (ord, Ord, "eql_v3.ord_term", "btree", + [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), + (ord_eqidx, Ord, "eql_v3.eq_term", "btree", [(eq, "=")]), + (ord_ore, OrdOre, "eql_v3.ord_term", "btree", + [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), + (ord_ore_eqidx, OrdOre, "eql_v3.eq_term", "btree", [(eq, "=")]), + (search, Search, "eql_v3.ord_term", "btree", + [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), + (search_eqidx, Search, "eql_v3.eq_term", "btree", [(eq, "=")]), + ], + blocker_combos = [ + (storage, Storage, [ + (eq, "="), (neq, "<>"), + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + (eq, Eq, [ + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + // Ordered text domains block bloom containment (no Bloom term); + // `_search` is omitted — it SUPPORTS `@>`/`<@`, proven by the + // match arms below (they would raise if `@>` were blocked). + (ord, Ord, [(contains, "@>"), (contained_by, "<@")]), + (ord_ore, OrdOre, [(contains, "@>"), (contained_by, "<@")]), + ], + // Selective `=` on a text ordered domain prefers the `eq_term` + // functional index (equality is hm-exact), not ord_term. + scale_default_combos = [ + (ord, Ord, "eql_v3.eq_term", "btree"), + ], + // `_search` carries the Bloom term: prove `@>`/`<@` containment + // behaviour + GIN index engagement through the matrix. + match_domains = [(search, Search)], } }; ( @@ -269,6 +342,8 @@ macro_rules! scalar_matrix { ], // Equality-only scalars have no ordered functional index to prefer. scale_default_combos = [], + // No bloom-match domain on an equality-only scalar. + match_domains = [], } }; } @@ -378,7 +453,11 @@ macro_rules! scalar_domain_matrix { // Curated combo(s) that get an ALWAYS-ON cost-preference test (#239 // thread 17). May be empty (e.g. equality-only scalars have no ordered // index to prefer). - scale_default_combos = [$($scale_default_combo:tt),* $(,)?] $(,)? + scale_default_combos = [$($scale_default_combo:tt),* $(,)?], + // Domains carrying the Bloom term (`@>`/`<@` containment). May be empty + // (only `text`'s `_search` declares one). Each gets bloom-match + // correctness + GIN index-engagement arms. + match_domains = [$($match_dom:tt),* $(,)?] $(,)? ) => { $crate::__scalar_matrix_sanity! { suite = $suite, scalar = $scalar, @@ -467,6 +546,10 @@ macro_rules! scalar_domain_matrix { suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, domains = [$($ord_dom),*], } + $crate::__scalar_matrix_match_outer! { + suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, + domains = [$($match_dom),*], + } $crate::__scalar_matrix_ore_injectivity_outer! { suite = $suite, scalar = $scalar, script = $eql_type, script_path = $fixture_path, domains = [$($ord_ore_dom),*], @@ -1680,6 +1763,149 @@ macro_rules! __scalar_matrix_ord_routes_case { }; } +// ============================================================================ +// Bloom-match category — for domains carrying the Bloom term (`_search`), +// `@>`/`<@` containment is true for a value vs itself and vs a shared-ngram +// sub-token, and a deterministic miss for ngram-disjoint inputs (a bloom +// filter admits false positives, never false negatives). Plus a GIN +// functional-index engagement proof on `match_term`. The three containment +// plaintexts come from `MatchScalar` (only `text` implements it). Match is +// asymmetric/probabilistic, so it lives in its own arm, not the ordered ops. +// ============================================================================ + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_match_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + domains = [$(($dom_name:ident, $variant:ident)),* $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_match_case! { + suite = $suite, scalar = $scalar, script = $script, script_path = $script_path, + dom_name = $dom_name, variant = $variant, + } + )* + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_match_case { + ( + suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::MatchScalar; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let hay = $crate::scalar_domains::fetch_fixture_payload::<$scalar>( + &pool, <$scalar as MatchScalar>::haystack()).await?; + let hit: bool = sqlx::query_scalar(&format!( + "SELECT ($1::jsonb::{d}) @> ($1::jsonb::{d})", + )).bind(&hay).fetch_one(&pool).await?; + anyhow::ensure!(hit, "{d}: a value's bloom filter must contain itself"); + Ok(()) + } + + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::MatchScalar; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let hay = $crate::scalar_domains::fetch_fixture_payload::<$scalar>( + &pool, <$scalar as MatchScalar>::haystack()).await?; + let needle = $crate::scalar_domains::fetch_fixture_payload::<$scalar>( + &pool, <$scalar as MatchScalar>::needle()).await?; + let hit: bool = sqlx::query_scalar(&format!( + "SELECT ($1::jsonb::{d}) @> ($2::jsonb::{d})", + )).bind(&hay).bind(&needle).fetch_one(&pool).await?; + anyhow::ensure!(hit, + "{d}: haystack bloom must contain its shared-ngram needle"); + Ok(()) + } + + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::MatchScalar; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let needle = $crate::scalar_domains::fetch_fixture_payload::<$scalar>( + &pool, <$scalar as MatchScalar>::needle()).await?; + let disjoint = $crate::scalar_domains::fetch_fixture_payload::<$scalar>( + &pool, <$scalar as MatchScalar>::disjoint()).await?; + let hit: bool = sqlx::query_scalar(&format!( + "SELECT ($1::jsonb::{d}) @> ($2::jsonb::{d})", + )).bind(&needle).bind(&disjoint).fetch_one(&pool).await?; + anyhow::ensure!(!hit, + "{d}: needle bloom must NOT contain an ngram-disjoint value"); + Ok(()) + } + + // VALIDITY, NOT PREFERENCE: `enable_seqscan = off` on the small + // fixture forces the planner onto the only usable alternative. A + // green assertion proves the bare `@>` operator inlines through + // `match_term` to the native array containment the GIN index + // supports — NOT that the planner would prefer it at scale. The + // assertion is node-type-aware (a genuine Bitmap/Index Scan node + // referencing `index`), not a plan substring match. + #[sqlx::test(fixtures(path = $script_path, scripts($script)))] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use $crate::scalar_domains::{MatchScalar, ScalarType}; + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let table = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), "_match", + ); + let index = concat!( + "matrix_", stringify!($suite), "_", stringify!($dom_name), "_match_idx", + ); + let fixture_table = <$scalar as ScalarType>::fixture_table_name(); + let needle = $crate::scalar_domains::fetch_fixture_payload::<$scalar>( + &pool, <$scalar as MatchScalar>::needle()).await?; + + let mut tx = pool.begin().await?; + sqlx::query(&format!( + "CREATE TEMP TABLE {table} (value {d}) ON COMMIT DROP", + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "INSERT INTO {table}(value) SELECT payload::{d} FROM {fixture}", + fixture = fixture_table, + )).execute(&mut *tx).await?; + sqlx::query(&format!( + "CREATE INDEX {index} ON {table} USING gin (eql_v3.match_term(value))", + )).execute(&mut *tx).await?; + sqlx::query(&format!("ANALYZE {table}")) + .execute(&mut *tx).await?; + sqlx::query("SET LOCAL enable_seqscan = off") + .execute(&mut *tx).await?; + + let lit = needle.replace('\'', "''"); + $crate::matrix::assert_index_scan_uses( + &mut *tx, + &format!("SELECT * FROM {table} WHERE value @> '{lit}'::jsonb::{d}"), + index, + "bare @> must engage the eql_v3.match_term functional GIN index", + ).await?; + + tx.commit().await?; + Ok(()) + } + } + }; +} + // ============================================================================ // ORE-injectivity category — for OrdOre variants, distinct plaintexts in // the fixture must produce distinct ORE blocks. Pairwise self-join over @@ -2639,14 +2865,14 @@ macro_rules! __scalar_matrix_aggregate_typecheck_outer { }; } -// Dispatch on variant ident: ord-capable variants (Ord, OrdOre) emit no -// typecheck test — they DO declare min/max. Non-ord variants (Storage, +// Dispatch on variant ident: ord-capable variants (Ord, OrdOre, Search) emit +// no typecheck test — they DO declare min/max. Non-ord variants (Storage, // Eq) emit one test per aggregate op asserting the call fails with // SQLSTATE 42883. #[macro_export] #[doc(hidden)] macro_rules! __scalar_matrix_aggregate_typecheck_dispatch { - // Ord, OrdOre: no typecheck test — these variants declare min/max. + // Ord, OrdOre, Search: no typecheck test — these variants declare min/max. ( suite = $suite:ident, scalar = $scalar:ty, dom_name = $dom_name:ident, variant = Ord $(,)? @@ -2655,6 +2881,10 @@ macro_rules! __scalar_matrix_aggregate_typecheck_dispatch { suite = $suite:ident, scalar = $scalar:ty, dom_name = $dom_name:ident, variant = OrdOre $(,)? ) => {}; + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = Search $(,)? + ) => {}; // Storage, Eq: emit min + max typecheck tests. ( suite = $suite:ident, scalar = $scalar:ty, diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 5941016ec..d98a6fc08 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -169,6 +169,29 @@ pub trait SignedScalar: OrderedScalar { fn origin() -> Self; } +/// A scalar with a **bloom-filter match** capability (`@>`/`<@` containment) — +/// currently only `text`, the one kind that declares a `Bloom`-bearing domain +/// (`_match`/`_search`). Provides three fixture plaintexts with known +/// containment relationships so the generated match arms can assert true hits +/// and a deterministic miss. The bound gates the match arms: a non-match scalar +/// never declares `_search`, so the `caps = [eq, ord, search]` matrix arm (the +/// only one emitting match cases) is never instantiated for it. +pub trait MatchScalar: ScalarType { + /// A "haystack" plaintext whose bloom filter contains [`needle`](Self::needle) + /// (they share n-grams). Present verbatim in `fixture_values()`. + fn haystack() -> Self; + + /// A "needle" plaintext that is a sub-token of [`haystack`](Self::haystack). + /// Present verbatim in `fixture_values()`. + fn needle() -> Self; + + /// A plaintext n-gram-**disjoint** from [`needle`](Self::needle), so + /// `needle @> disjoint` is a deterministic miss (a bloom filter only admits + /// false positives, never false negatives). Present verbatim in + /// `fixture_values()`. + fn disjoint() -> Self; +} + // The per-type `impl ScalarType` blocks for the **integer** scalars (each // carrying its `PG_TYPE` token, `fixture_values() = eql_scalars::_VALUES`, // and `min_pivot()`/`max_pivot()` = `Self::MIN`/`Self::MAX`) are generated from @@ -437,6 +460,27 @@ impl OrderedScalar for String { } } +impl MatchScalar for String { + /// `"aardvark"` — its bloom filter contains `"aard"` (shared 3-grams + /// `aar`, `ard`). Matches the haystack used by the sibling `text_match` + /// behavioural suite. Present verbatim in `TEXT_FIXTURES`. + fn haystack() -> Self { + "aardvark".to_string() + } + + /// `"aard"` — a sub-token of `"aardvark"`. + fn needle() -> Self { + "aard".to_string() + } + + /// `"zzzz"` — 3-gram-disjoint from `"aard"` (`zzz` vs `aar`/`ard`), so + /// `aard @> zzzz` is a deterministic miss. Kept disjoint in `TEXT_FIXTURES` + /// precisely for this assertion. + fn disjoint() -> Self { + "zzzz".to_string() + } +} + // `String` is deliberately NOT `SignedScalar`: lexicographic text has no // numeric origin / sign boundary. The signed-only sign-boundary test bounds on // `SignedScalar`, so a `String` instantiation of it would not compile. From ea096e72ce99a2d4ecadf9373b64d62a69720068 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 20:50:47 +1000 Subject: [PATCH 184/599] test(tests): regenerate int4 cargo-expand snapshot for term-aware matrix bodies --- tests/sqlx/snapshots/int4_expanded.rs | 2299 +++++++++++++------------ 1 file changed, 1194 insertions(+), 1105 deletions(-) diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/int4_expanded.rs index f2997d2af..7cc4126fa 100644 --- a/tests/sqlx/snapshots/int4_expanded.rs +++ b/tests/sqlx/snapshots/int4_expanded.rs @@ -9,9 +9,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 454usize, + start_line: 541usize, start_col: 26usize, - end_line: 454usize, + end_line: 541usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -86,9 +86,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 454usize, + start_line: 541usize, start_col: 26usize, - end_line: 454usize, + end_line: 541usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -163,9 +163,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 454usize, + start_line: 541usize, start_col: 26usize, - end_line: 454usize, + end_line: 541usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -240,9 +240,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 454usize, + start_line: 541usize, start_col: 26usize, - end_line: 454usize, + end_line: 541usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -319,9 +319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -341,10 +341,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -418,9 +418,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -440,10 +440,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -507,19 +507,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_eq_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness", + "scalars::int4::matrix_int4_eq_eq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -528,21 +528,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_eq_eq_pivot_mid_correctness()), ), }; - fn matrix_int4_eq_eq_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_zero_correctness( + fn matrix_int4_eq_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -566,7 +566,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -602,7 +602,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -616,9 +616,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -638,10 +638,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -715,9 +715,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -737,10 +737,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -804,19 +804,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_eq_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness", + "scalars::int4::matrix_int4_eq_neq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -825,21 +825,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_eq_neq_pivot_mid_correctness()), ), }; - fn matrix_int4_eq_neq_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_zero_correctness( + fn matrix_int4_eq_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -863,7 +863,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -899,7 +899,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -913,9 +913,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -935,10 +935,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1012,9 +1012,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1034,10 +1034,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1101,19 +1101,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_eq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1122,21 +1122,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_eq_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_eq_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_zero_correctness( + fn matrix_int4_ord_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1160,7 +1160,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1196,7 +1196,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -1210,9 +1210,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1232,10 +1232,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1309,9 +1309,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1331,10 +1331,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1398,19 +1398,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_neq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1419,21 +1419,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_neq_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_neq_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_zero_correctness( + fn matrix_int4_ord_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1457,7 +1457,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1493,7 +1493,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -1507,9 +1507,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1529,10 +1529,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1606,9 +1606,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1628,10 +1628,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1695,19 +1695,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1716,21 +1716,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_ore_eq_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_zero_correctness( + fn matrix_int4_ord_ore_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1754,7 +1754,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1790,7 +1790,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -1804,9 +1804,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1826,10 +1826,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1903,9 +1903,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1925,10 +1925,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -1992,19 +1992,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2013,21 +2013,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_ore_neq_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_zero_correctness( + fn matrix_int4_ord_ore_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2051,7 +2051,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2087,7 +2087,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -2101,9 +2101,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2123,10 +2123,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2200,9 +2200,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2222,10 +2222,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2289,19 +2289,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_lt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2310,21 +2310,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_lt_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_lt_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_zero_correctness( + fn matrix_int4_ord_lt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2348,7 +2348,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2384,7 +2384,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -2398,9 +2398,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2420,10 +2420,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2497,9 +2497,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2519,10 +2519,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2586,19 +2586,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_lte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2607,21 +2607,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_lte_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_lte_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_zero_correctness( + fn matrix_int4_ord_lte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2645,7 +2645,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2681,7 +2681,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -2695,9 +2695,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2717,10 +2717,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2794,9 +2794,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2816,10 +2816,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2883,19 +2883,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_gt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2904,21 +2904,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_gt_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_gt_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_zero_correctness( + fn matrix_int4_ord_gt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -2942,7 +2942,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2978,7 +2978,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -2992,9 +2992,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3014,10 +3014,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3091,9 +3091,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3113,10 +3113,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3180,19 +3180,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_gte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3201,21 +3201,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_gte_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_gte_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_zero_correctness( + fn matrix_int4_ord_gte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3239,7 +3239,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3275,7 +3275,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -3289,9 +3289,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3311,10 +3311,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3388,9 +3388,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3410,10 +3410,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3477,19 +3477,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3498,21 +3498,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_ore_lt_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_zero_correctness( + fn matrix_int4_ord_ore_lt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3536,7 +3536,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3572,7 +3572,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -3586,9 +3586,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3608,10 +3608,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3685,9 +3685,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3707,10 +3707,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3774,19 +3774,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3795,21 +3795,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_ore_lte_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_zero_correctness( + fn matrix_int4_ord_ore_lte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3833,7 +3833,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3869,7 +3869,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -3883,9 +3883,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3905,10 +3905,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -3982,9 +3982,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4004,10 +4004,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -4071,19 +4071,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4092,21 +4092,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_ore_gt_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_zero_correctness( + fn matrix_int4_ord_ore_gt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -4130,7 +4130,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4166,7 +4166,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -4180,9 +4180,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4202,10 +4202,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -4279,9 +4279,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4301,10 +4301,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -4368,19 +4368,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_zero_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness", + "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 590usize, + start_line: 677usize, start_col: 22usize, - end_line: 590usize, + end_line: 677usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4389,21 +4389,21 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_zero_correctness()), + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_ore_gte_pivot_zero_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_zero_correctness( + fn matrix_int4_ord_ore_gte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let predicate = ::alloc::__export::must_use({ @@ -4427,7 +4427,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_correctness", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4463,7 +4463,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_zero_correctness; + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -4477,9 +4477,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4499,20 +4499,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -4643,9 +4643,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4665,20 +4665,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -4799,19 +4799,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_eq_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_eq_eq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4820,31 +4820,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_eq_eq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_eq_eq_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_zero_cross_shape( + fn matrix_int4_eq_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_eq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -4925,7 +4925,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4961,7 +4961,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -4975,9 +4975,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4997,20 +4997,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -5141,9 +5141,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5163,20 +5163,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -5297,19 +5297,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_eq_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_eq_neq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5318,31 +5318,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_eq_neq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_eq_neq_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_zero_cross_shape( + fn matrix_int4_eq_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_eq_neq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -5423,7 +5423,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5459,7 +5459,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -5473,9 +5473,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5495,20 +5495,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -5639,9 +5639,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5661,20 +5661,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -5795,19 +5795,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_eq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5816,31 +5816,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_eq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_eq_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_zero_cross_shape( + fn matrix_int4_ord_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_eq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -5921,7 +5921,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5957,7 +5957,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -5971,9 +5971,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5993,20 +5993,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -6137,9 +6137,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6159,20 +6159,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -6293,19 +6293,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_neq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6314,31 +6314,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_neq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_neq_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_zero_cross_shape( + fn matrix_int4_ord_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_neq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -6419,7 +6419,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6455,7 +6455,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -6469,9 +6469,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6491,20 +6491,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -6635,9 +6635,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6657,20 +6657,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -6791,19 +6791,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6812,31 +6812,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_ore_eq_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_zero_cross_shape( + fn matrix_int4_ord_ore_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_eq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -6917,7 +6917,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6953,7 +6953,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -6967,9 +6967,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6989,20 +6989,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -7133,9 +7133,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7155,20 +7155,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -7289,19 +7289,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7310,31 +7310,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_ore_neq_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_zero_cross_shape( + fn matrix_int4_ord_ore_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_neq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<>", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<>"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -7415,7 +7415,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7451,7 +7451,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -7465,9 +7465,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7487,20 +7487,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -7631,9 +7631,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7653,20 +7653,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -7787,19 +7787,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_lt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7808,31 +7808,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_lt_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_lt_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_zero_cross_shape( + fn matrix_int4_ord_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -7913,7 +7913,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7949,7 +7949,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -7963,9 +7963,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7985,20 +7985,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -8129,9 +8129,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8151,20 +8151,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -8285,19 +8285,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_lte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8306,31 +8306,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_lte_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_lte_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_zero_cross_shape( + fn matrix_int4_ord_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_lte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -8411,7 +8411,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8447,7 +8447,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -8461,9 +8461,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8483,20 +8483,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -8627,9 +8627,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8649,20 +8649,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -8783,19 +8783,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_gt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8804,31 +8804,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_gt_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_gt_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_zero_cross_shape( + fn matrix_int4_ord_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -8909,7 +8909,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8945,7 +8945,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -8959,9 +8959,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8981,20 +8981,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -9125,9 +9125,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9147,20 +9147,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -9281,19 +9281,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_gte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9302,31 +9302,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_gte_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_gte_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_zero_cross_shape( + fn matrix_int4_ord_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_gte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -9407,7 +9407,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9443,7 +9443,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -9457,9 +9457,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9479,20 +9479,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -9623,9 +9623,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9645,20 +9645,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -9779,19 +9779,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9800,31 +9800,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_ore_lt_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_zero_cross_shape( + fn matrix_int4_ord_ore_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -9905,7 +9905,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9941,7 +9941,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -9955,9 +9955,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9977,20 +9977,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -10121,9 +10121,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10143,20 +10143,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -10277,19 +10277,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10298,31 +10298,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_ore_lte_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_zero_cross_shape( + fn matrix_int4_ord_ore_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_lte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( "<=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op("<="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -10403,7 +10403,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10439,7 +10439,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -10453,9 +10453,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10475,20 +10475,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -10619,9 +10619,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10641,20 +10641,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -10775,19 +10775,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10796,31 +10796,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_ore_gt_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_zero_cross_shape( + fn matrix_int4_ord_ore_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">"), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -10901,7 +10901,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10937,7 +10937,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -10951,9 +10951,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10973,20 +10973,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::min_pivot(); + let pivot: i32 = ::min_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -11117,9 +11117,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11139,20 +11139,20 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::max_pivot(); + let pivot: i32 = ::max_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -11273,19 +11273,19 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape"] + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_zero_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_ord_ore_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape", + "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 631usize, + start_line: 718usize, start_col: 22usize, - end_line: 631usize, + end_line: 718usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11294,31 +11294,31 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_zero_cross_shape()), + || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_ore_gte_pivot_zero_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_zero_cross_shape( + fn matrix_int4_ord_ore_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_gte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let pivot: i32 = ::default(); + let pivot: i32 = ::mid_pivot(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, - >(&pool, pivot) + >(&pool, pivot.clone()) .await?; let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); let forward_count = ::expected_forward( ">=", - pivot, + pivot.clone(), ) .len() as i64; let commuted_count = ::expected_forward( ::eql_tests::scalar_domains::commute_op(">="), - pivot, + pivot.clone(), ) .len() as i64; let d = &spec.sql_domain; @@ -11399,7 +11399,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_zero_cross_shape", + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11435,7 +11435,7 @@ pub mod int4 { }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_zero_cross_shape; + let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; @@ -11449,9 +11449,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11542,9 +11542,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11635,9 +11635,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11728,9 +11728,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11821,9 +11821,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11914,9 +11914,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12007,9 +12007,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12100,9 +12100,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12193,9 +12193,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12286,9 +12286,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12379,9 +12379,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12472,9 +12472,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12565,9 +12565,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12658,9 +12658,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 683usize, + start_line: 770usize, start_col: 22usize, - end_line: 683usize, + end_line: 770usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12749,9 +12749,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -12884,9 +12884,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13019,9 +13019,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13154,9 +13154,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13289,9 +13289,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13424,9 +13424,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13561,9 +13561,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13698,9 +13698,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13833,9 +13833,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13966,9 +13966,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14099,9 +14099,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14232,9 +14232,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14365,9 +14365,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14502,9 +14502,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14639,9 +14639,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14776,9 +14776,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14913,9 +14913,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15050,9 +15050,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 747usize, + start_line: 834usize, start_col: 22usize, - end_line: 747usize, + end_line: 834usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15187,9 +15187,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 814usize, + start_line: 901usize, start_col: 22usize, - end_line: 814usize, + end_line: 901usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15211,7 +15211,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Storage); let d = &spec.sql_domain; let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; - for key in spec.variant.payload_required_keys() { + for key in spec.payload_required_keys() { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -15327,9 +15327,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 814usize, + start_line: 901usize, start_col: 22usize, - end_line: 814usize, + end_line: 901usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15349,7 +15349,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Eq); let d = &spec.sql_domain; let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; - for key in spec.variant.payload_required_keys() { + for key in spec.payload_required_keys() { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -15465,9 +15465,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 814usize, + start_line: 901usize, start_col: 22usize, - end_line: 814usize, + end_line: 901usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15489,7 +15489,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; - for key in spec.variant.payload_required_keys() { + for key in spec.payload_required_keys() { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -15607,9 +15607,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 814usize, + start_line: 901usize, start_col: 22usize, - end_line: 814usize, + end_line: 901usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15631,7 +15631,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; - for key in spec.variant.payload_required_keys() { + for key in spec.payload_required_keys() { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -15749,9 +15749,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 887usize, + start_line: 974usize, start_col: 22usize, - end_line: 887usize, + end_line: 974usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15850,9 +15850,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 887usize, + start_line: 974usize, start_col: 22usize, - end_line: 887usize, + end_line: 974usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15953,9 +15953,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 887usize, + start_line: 974usize, start_col: 22usize, - end_line: 887usize, + end_line: 974usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16056,9 +16056,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 887usize, + start_line: 974usize, start_col: 22usize, - end_line: 887usize, + end_line: 974usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16159,9 +16159,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 944usize, + start_line: 1031usize, start_col: 22usize, - end_line: 944usize, + end_line: 1031usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16248,9 +16248,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 944usize, + start_line: 1031usize, start_col: 22usize, - end_line: 944usize, + end_line: 1031usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16337,9 +16337,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 944usize, + start_line: 1031usize, start_col: 22usize, - end_line: 944usize, + end_line: 1031usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16426,9 +16426,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 944usize, + start_line: 1031usize, start_col: 22usize, - end_line: 944usize, + end_line: 1031usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16515,9 +16515,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 997usize, + start_line: 1084usize, start_col: 22usize, - end_line: 997usize, + end_line: 1084usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -16886,9 +16886,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 997usize, + start_line: 1084usize, start_col: 22usize, - end_line: 997usize, + end_line: 1084usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17187,9 +17187,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 997usize, + start_line: 1084usize, start_col: 22usize, - end_line: 997usize, + end_line: 1084usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17348,9 +17348,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 997usize, + start_line: 1084usize, start_col: 22usize, - end_line: 997usize, + end_line: 1084usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17509,9 +17509,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1078usize, + start_line: 1165usize, start_col: 22usize, - end_line: 1078usize, + end_line: 1165usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17673,9 +17673,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1078usize, + start_line: 1165usize, start_col: 22usize, - end_line: 1078usize, + end_line: 1165usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17837,9 +17837,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1078usize, + start_line: 1165usize, start_col: 22usize, - end_line: 1078usize, + end_line: 1165usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18001,9 +18001,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1078usize, + start_line: 1165usize, start_col: 22usize, - end_line: 1078usize, + end_line: 1165usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18165,9 +18165,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1078usize, + start_line: 1165usize, start_col: 22usize, - end_line: 1078usize, + end_line: 1165usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18329,9 +18329,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1644usize, + start_line: 1918usize, start_col: 22usize, - end_line: 1644usize, + end_line: 1918usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18406,7 +18406,8 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::fixture_values()[0]; + let pivot: i32 = ::fixture_values()[0] + .clone(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -18503,9 +18504,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1644usize, + start_line: 1918usize, start_col: 22usize, - end_line: 1644usize, + end_line: 1918usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18580,7 +18581,8 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::fixture_values()[0]; + let pivot: i32 = ::fixture_values()[0] + .clone(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -18677,9 +18679,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1644usize, + start_line: 1918usize, start_col: 22usize, - end_line: 1644usize, + end_line: 1918usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18754,7 +18756,8 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::fixture_values()[0]; + let pivot: i32 = ::fixture_values()[0] + .clone(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -18971,9 +18974,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1644usize, + start_line: 1918usize, start_col: 22usize, - end_line: 1644usize, + end_line: 1918usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19048,7 +19051,8 @@ pub mod int4 { .execute(&mut *tx) .await?; sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; - let pivot: i32 = ::fixture_values()[0]; + let pivot: i32 = ::fixture_values()[0] + .clone(); let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, pivot) @@ -19265,9 +19269,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1266usize, + start_line: 1353usize, start_col: 22usize, - end_line: 1266usize, + end_line: 1353usize, end_col: 86usize, compile_fail: false, no_run: false, @@ -19302,8 +19306,8 @@ pub mod int4 { error }); } - let filler = values[0]; - let pivot = values[values.len() / 2]; + let filler = values[0].clone(); + let pivot = values[values.len() / 2].clone(); let filler_payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< i32, >(&pool, filler) @@ -19446,9 +19450,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1344usize, + start_line: 1431usize, start_col: 22usize, - end_line: 1344usize, + end_line: 1431usize, end_col: 55usize, compile_fail: false, no_run: false, @@ -19524,20 +19528,35 @@ pub mod int4 { error }); } - for (label, predicate) in [ - ( - "hm string", - "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", - ), - ( - "ob array", - "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", + let mut term_checks: Vec<(&str, &str)> = ::alloc::boxed::box_assume_init_into_vec_unsafe( + ::alloc::intrinsics::write_box_via_move( + ::alloc::boxed::Box::new_uninit(), + [ + ( + "hm string", + "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", + ), + ( + "ob array", + "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", + ), + ( + "c string", + "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", + ), + ], ), - ( - "c string", - "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", - ), - ] { + ); + if ::eql_tests::scalar_domains::token_has_bloom_term( + ::PG_TYPE, + ) { + term_checks + .push(( + "bf array", + "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", + )); + } + for (label, predicate) in term_checks { let missing: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -19609,7 +19628,7 @@ pub mod int4 { }); } if !expected.is_empty() { - let probe = expected[expected.len() / 2]; + let probe = &expected[expected.len() / 2]; let probe_lit = ::to_sql_literal(probe); let expected_id = (expected.len() / 2 + 1) as i64; let ids: Vec = sqlx::query_scalar( @@ -19701,9 +19720,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1447usize, + start_line: 1544usize, start_col: 22usize, - end_line: 1447usize, + end_line: 1544usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19720,24 +19739,42 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; - let table = "matrix_int4_ord_no_hm"; - let index = "matrix_int4_ord_no_hm_idx"; - let fixture_table = ::fixture_table_name(); - let pivot: i32 = ::fixture_values()[0]; - let pivot_lit = ::to_sql_literal( - pivot, - ); + let token = ::PG_TYPE; + let table = "matrix_int4_ord_routing"; + let index = "matrix_int4_ord_routing_idx"; + let fixture_table = ::fixture_table_name(); + let pivot: i32 = ::fixture_values()[0].clone(); + let pivot_lit = ::to_sql_literal(&pivot); + let carries_hm = spec + .variant + .terms_for(token) + .iter() + .any(|t| t.json_key() == "hm"); + let (extractor, value_expr, caveat): (&str, &str, &str) = if carries_hm { + ( + "eql_v3.eq_term", + "payload", + "= must engage the eql_v3.eq_term functional btree (exact hm), never ORE", + ) + } else { + ( + "eql_v3.ord_term", + "(payload - 'hm')", + "= must engage the eql_v3.ord_term functional btree with no hm", + ) + }; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( "CREATE TEMP TABLE {1} (plaintext {0}, value {2}) ON COMMIT DROP", - ::PG_TYPE, + ::PG_TYPE, table, d, ), @@ -19750,9 +19787,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, (payload - \'hm\')::{2} FROM {0}", + "INSERT INTO {1}(plaintext, value) SELECT plaintext, {2}::{3} FROM {0}", fixture_table, table, + value_expr, d, ), ) @@ -19760,33 +19798,36 @@ pub mod int4 { ) .execute(&mut *tx) .await?; - let with_hm: i64 = sqlx::query_scalar( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", - table, - ), - ) - }), - ) - .fetch_one(&mut *tx) - .await?; - if ::anyhow::__private::not(with_hm == 0) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!("test rows must not carry hm"), - ); - error - }); + if !carries_hm { + let with_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", + table, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(with_hm == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("test rows must not carry hm"), + ); + error + }); + } } sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "CREATE INDEX {0} ON {1} USING btree (eql_v3.ord_term(value))", + "CREATE INDEX {0} ON {1} USING btree ({2}(value))", index, table, + extractor, ), ) }), @@ -19805,9 +19846,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT (payload - \'hm\')::text FROM {0} WHERE plaintext = {1}", + "SELECT {2}::text FROM {0} WHERE plaintext = {1}", fixture_table, pivot_lit, + value_expr, ), ) }), @@ -19832,15 +19874,15 @@ pub mod int4 { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "= must match exactly the pivot row via ob with no hm present (want 1, got {0})", + "= must match exactly the pivot row (want 1, got {0})", eq_count, ), ); error }); } - let expected_neq = ::fixture_values() - .len() as i64 - eq_count; + let expected_neq = ::fixture_values().len() as i64 + - eq_count; let neq_count: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -19881,7 +19923,7 @@ pub mod int4 { ) }), index, - "= must engage the eql_v3.ord_term functional btree with no hm", + caveat, ) .await?; tx.commit().await?; @@ -19939,9 +19981,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1447usize, + start_line: 1544usize, start_col: 22usize, - end_line: 1447usize, + end_line: 1544usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19958,24 +20000,42 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { + use ::eql_tests::scalar_domains::ScalarType; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; - let table = "matrix_int4_ord_ore_no_hm"; - let index = "matrix_int4_ord_ore_no_hm_idx"; - let fixture_table = ::fixture_table_name(); - let pivot: i32 = ::fixture_values()[0]; - let pivot_lit = ::to_sql_literal( - pivot, - ); + let token = ::PG_TYPE; + let table = "matrix_int4_ord_ore_routing"; + let index = "matrix_int4_ord_ore_routing_idx"; + let fixture_table = ::fixture_table_name(); + let pivot: i32 = ::fixture_values()[0].clone(); + let pivot_lit = ::to_sql_literal(&pivot); + let carries_hm = spec + .variant + .terms_for(token) + .iter() + .any(|t| t.json_key() == "hm"); + let (extractor, value_expr, caveat): (&str, &str, &str) = if carries_hm { + ( + "eql_v3.eq_term", + "payload", + "= must engage the eql_v3.eq_term functional btree (exact hm), never ORE", + ) + } else { + ( + "eql_v3.ord_term", + "(payload - 'hm')", + "= must engage the eql_v3.ord_term functional btree with no hm", + ) + }; let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( "CREATE TEMP TABLE {1} (plaintext {0}, value {2}) ON COMMIT DROP", - ::PG_TYPE, + ::PG_TYPE, table, d, ), @@ -19988,9 +20048,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, (payload - \'hm\')::{2} FROM {0}", + "INSERT INTO {1}(plaintext, value) SELECT plaintext, {2}::{3} FROM {0}", fixture_table, table, + value_expr, d, ), ) @@ -19998,33 +20059,36 @@ pub mod int4 { ) .execute(&mut *tx) .await?; - let with_hm: i64 = sqlx::query_scalar( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", - table, - ), - ) - }), - ) - .fetch_one(&mut *tx) - .await?; - if ::anyhow::__private::not(with_hm == 0) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!("test rows must not carry hm"), - ); - error - }); + if !carries_hm { + let with_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", + table, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(with_hm == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("test rows must not carry hm"), + ); + error + }); + } } sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "CREATE INDEX {0} ON {1} USING btree (eql_v3.ord_term(value))", + "CREATE INDEX {0} ON {1} USING btree ({2}(value))", index, table, + extractor, ), ) }), @@ -20043,9 +20107,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT (payload - \'hm\')::text FROM {0} WHERE plaintext = {1}", + "SELECT {2}::text FROM {0} WHERE plaintext = {1}", fixture_table, pivot_lit, + value_expr, ), ) }), @@ -20070,15 +20135,15 @@ pub mod int4 { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "= must match exactly the pivot row via ob with no hm present (want 1, got {0})", + "= must match exactly the pivot row (want 1, got {0})", eq_count, ), ); error }); } - let expected_neq = ::fixture_values() - .len() as i64 - eq_count; + let expected_neq = ::fixture_values().len() as i64 + - eq_count; let neq_count: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -20119,7 +20184,7 @@ pub mod int4 { ) }), index, - "= must engage the eql_v3.ord_term functional btree with no hm", + caveat, ) .await?; tx.commit().await?; @@ -20177,9 +20242,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1581usize, + start_line: 1855usize, start_col: 22usize, - end_line: 1581usize, + end_line: 1855usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -20277,9 +20342,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2099usize, + start_line: 2374usize, start_col: 22usize, - end_line: 2099usize, + end_line: 2374usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -20304,10 +20369,10 @@ pub mod int4 { let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() - .copied() + .cloned() .min() .expect("FIXTURE_VALUES must be non-empty"); - let extremum_lit = ::to_sql_literal(extremum); + let extremum_lit = ::to_sql_literal(&extremum); let expected: String = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -20441,9 +20506,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2157usize, + start_line: 2432usize, start_col: 22usize, - end_line: 2157usize, + end_line: 2432usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -20553,9 +20618,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2182usize, + start_line: 2457usize, start_col: 22usize, - end_line: 2182usize, + end_line: 2457usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -20652,9 +20717,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2208usize, + start_line: 2483usize, start_col: 22usize, - end_line: 2208usize, + end_line: 2483usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -20694,13 +20759,19 @@ pub mod int4 { } let mut sorted: Vec = values.to_vec(); sorted.sort(); - let low: i32 = *sorted.first().expect("non-empty after len check"); - let high: i32 = *sorted.last().expect("non-empty after len check"); - let expected_plaintext: i32 = low.min(high); - let low_lit = ::to_sql_literal(low); - let high_lit = ::to_sql_literal(high); + let low: i32 = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: i32 = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: i32 = low.clone().min(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); let expected_lit = ::to_sql_literal( - expected_plaintext, + &expected_plaintext, ); let mut tx = pool.begin().await?; sqlx::query( @@ -20828,9 +20899,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2099usize, + start_line: 2374usize, start_col: 22usize, - end_line: 2099usize, + end_line: 2374usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -20855,10 +20926,10 @@ pub mod int4 { let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() - .copied() + .cloned() .max() .expect("FIXTURE_VALUES must be non-empty"); - let extremum_lit = ::to_sql_literal(extremum); + let extremum_lit = ::to_sql_literal(&extremum); let expected: String = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -20992,9 +21063,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2157usize, + start_line: 2432usize, start_col: 22usize, - end_line: 2157usize, + end_line: 2432usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21104,9 +21175,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2182usize, + start_line: 2457usize, start_col: 22usize, - end_line: 2182usize, + end_line: 2457usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21203,9 +21274,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2208usize, + start_line: 2483usize, start_col: 22usize, - end_line: 2208usize, + end_line: 2483usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21245,13 +21316,19 @@ pub mod int4 { } let mut sorted: Vec = values.to_vec(); sorted.sort(); - let low: i32 = *sorted.first().expect("non-empty after len check"); - let high: i32 = *sorted.last().expect("non-empty after len check"); - let expected_plaintext: i32 = low.max(high); - let low_lit = ::to_sql_literal(low); - let high_lit = ::to_sql_literal(high); + let low: i32 = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: i32 = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: i32 = low.clone().max(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); let expected_lit = ::to_sql_literal( - expected_plaintext, + &expected_plaintext, ); let mut tx = pool.begin().await?; sqlx::query( @@ -21381,9 +21458,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2099usize, + start_line: 2374usize, start_col: 22usize, - end_line: 2099usize, + end_line: 2374usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21408,10 +21485,10 @@ pub mod int4 { let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() - .copied() + .cloned() .min() .expect("FIXTURE_VALUES must be non-empty"); - let extremum_lit = ::to_sql_literal(extremum); + let extremum_lit = ::to_sql_literal(&extremum); let expected: String = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -21545,9 +21622,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2157usize, + start_line: 2432usize, start_col: 22usize, - end_line: 2157usize, + end_line: 2432usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21657,9 +21734,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2182usize, + start_line: 2457usize, start_col: 22usize, - end_line: 2182usize, + end_line: 2457usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21756,9 +21833,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2208usize, + start_line: 2483usize, start_col: 22usize, - end_line: 2208usize, + end_line: 2483usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21798,13 +21875,19 @@ pub mod int4 { } let mut sorted: Vec = values.to_vec(); sorted.sort(); - let low: i32 = *sorted.first().expect("non-empty after len check"); - let high: i32 = *sorted.last().expect("non-empty after len check"); - let expected_plaintext: i32 = low.min(high); - let low_lit = ::to_sql_literal(low); - let high_lit = ::to_sql_literal(high); + let low: i32 = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: i32 = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: i32 = low.clone().min(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); let expected_lit = ::to_sql_literal( - expected_plaintext, + &expected_plaintext, ); let mut tx = pool.begin().await?; sqlx::query( @@ -21934,9 +22017,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2099usize, + start_line: 2374usize, start_col: 22usize, - end_line: 2099usize, + end_line: 2374usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21961,10 +22044,10 @@ pub mod int4 { let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() - .copied() + .cloned() .max() .expect("FIXTURE_VALUES must be non-empty"); - let extremum_lit = ::to_sql_literal(extremum); + let extremum_lit = ::to_sql_literal(&extremum); let expected: String = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -22098,9 +22181,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2157usize, + start_line: 2432usize, start_col: 22usize, - end_line: 2157usize, + end_line: 2432usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -22210,9 +22293,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2182usize, + start_line: 2457usize, start_col: 22usize, - end_line: 2182usize, + end_line: 2457usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22309,9 +22392,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2208usize, + start_line: 2483usize, start_col: 22usize, - end_line: 2208usize, + end_line: 2483usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22351,13 +22434,19 @@ pub mod int4 { } let mut sorted: Vec = values.to_vec(); sorted.sort(); - let low: i32 = *sorted.first().expect("non-empty after len check"); - let high: i32 = *sorted.last().expect("non-empty after len check"); - let expected_plaintext: i32 = low.max(high); - let low_lit = ::to_sql_literal(low); - let high_lit = ::to_sql_literal(high); + let low: i32 = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: i32 = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: i32 = low.clone().max(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); let expected_lit = ::to_sql_literal( - expected_plaintext, + &expected_plaintext, ); let mut tx = pool.begin().await?; sqlx::query( @@ -22487,9 +22576,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2387usize, + start_line: 2663usize, start_col: 22usize, - end_line: 2387usize, + end_line: 2663usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -22531,16 +22620,16 @@ pub mod int4 { let group2: &[i32] = &values[3..5]; let group1_extremum: i32 = group1 .iter() - .copied() + .cloned() .min() .expect("group 1 is non-empty"); let group2_extremum: i32 = group2 .iter() - .copied() + .cloned() .min() .expect("group 2 is non-empty"); - let g1_lit = ::to_sql_literal(group1_extremum); - let g2_lit = ::to_sql_literal(group2_extremum); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -22555,7 +22644,7 @@ pub mod int4 { .execute(&mut *tx) .await?; for v in group1 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -22572,7 +22661,7 @@ pub mod int4 { .await?; } for v in group2 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -22733,9 +22822,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2387usize, + start_line: 2663usize, start_col: 22usize, - end_line: 2387usize, + end_line: 2663usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -22777,16 +22866,16 @@ pub mod int4 { let group2: &[i32] = &values[3..5]; let group1_extremum: i32 = group1 .iter() - .copied() + .cloned() .max() .expect("group 1 is non-empty"); let group2_extremum: i32 = group2 .iter() - .copied() + .cloned() .max() .expect("group 2 is non-empty"); - let g1_lit = ::to_sql_literal(group1_extremum); - let g2_lit = ::to_sql_literal(group2_extremum); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -22801,7 +22890,7 @@ pub mod int4 { .execute(&mut *tx) .await?; for v in group1 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -22818,7 +22907,7 @@ pub mod int4 { .await?; } for v in group2 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -22979,9 +23068,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2387usize, + start_line: 2663usize, start_col: 22usize, - end_line: 2387usize, + end_line: 2663usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23023,16 +23112,16 @@ pub mod int4 { let group2: &[i32] = &values[3..5]; let group1_extremum: i32 = group1 .iter() - .copied() + .cloned() .min() .expect("group 1 is non-empty"); let group2_extremum: i32 = group2 .iter() - .copied() + .cloned() .min() .expect("group 2 is non-empty"); - let g1_lit = ::to_sql_literal(group1_extremum); - let g2_lit = ::to_sql_literal(group2_extremum); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -23047,7 +23136,7 @@ pub mod int4 { .execute(&mut *tx) .await?; for v in group1 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -23064,7 +23153,7 @@ pub mod int4 { .await?; } for v in group2 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -23225,9 +23314,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2387usize, + start_line: 2663usize, start_col: 22usize, - end_line: 2387usize, + end_line: 2663usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23269,16 +23358,16 @@ pub mod int4 { let group2: &[i32] = &values[3..5]; let group1_extremum: i32 = group1 .iter() - .copied() + .cloned() .max() .expect("group 1 is non-empty"); let group2_extremum: i32 = group2 .iter() - .copied() + .cloned() .max() .expect("group 2 is non-empty"); - let g1_lit = ::to_sql_literal(group1_extremum); - let g2_lit = ::to_sql_literal(group2_extremum); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); let mut tx = pool.begin().await?; sqlx::query( &::alloc::__export::must_use({ @@ -23293,7 +23382,7 @@ pub mod int4 { .execute(&mut *tx) .await?; for v in group1 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -23310,7 +23399,7 @@ pub mod int4 { .await?; } for v in group2 { - let lit = ::to_sql_literal(*v); + let lit = ::to_sql_literal(v); sqlx::query( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -23471,9 +23560,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2302usize, + start_line: 2578usize, start_col: 22usize, - end_line: 2302usize, + end_line: 2578usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23580,9 +23669,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2302usize, + start_line: 2578usize, start_col: 22usize, - end_line: 2302usize, + end_line: 2578usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23689,9 +23778,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2543usize, + start_line: 2823usize, start_col: 22usize, - end_line: 2543usize, + end_line: 2823usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23834,9 +23923,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2543usize, + start_line: 2823usize, start_col: 22usize, - end_line: 2543usize, + end_line: 2823usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23979,9 +24068,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2543usize, + start_line: 2823usize, start_col: 22usize, - end_line: 2543usize, + end_line: 2823usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24124,9 +24213,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2543usize, + start_line: 2823usize, start_col: 22usize, - end_line: 2543usize, + end_line: 2823usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24269,9 +24358,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2644usize, + start_line: 2924usize, start_col: 22usize, - end_line: 2644usize, + end_line: 2924usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24397,9 +24486,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2677usize, + start_line: 2957usize, start_col: 22usize, - end_line: 2677usize, + end_line: 2957usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -24501,9 +24590,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2644usize, + start_line: 2924usize, start_col: 22usize, - end_line: 2644usize, + end_line: 2924usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24627,9 +24716,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2677usize, + start_line: 2957usize, start_col: 22usize, - end_line: 2677usize, + end_line: 2957usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -24731,9 +24820,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2721usize, + start_line: 3001usize, start_col: 22usize, - end_line: 2721usize, + end_line: 3001usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -24756,7 +24845,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Eq); let d = &spec.sql_domain; let extractor_fn = spec - .extractor_fn() + .primary_extractor() .expect("non-Storage variant must expose an extractor"); let extractor = ::alloc::__export::must_use({ ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) @@ -24871,9 +24960,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2644usize, + start_line: 2924usize, start_col: 22usize, - end_line: 2644usize, + end_line: 2924usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24997,9 +25086,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2677usize, + start_line: 2957usize, start_col: 22usize, - end_line: 2677usize, + end_line: 2957usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25101,9 +25190,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2721usize, + start_line: 3001usize, start_col: 22usize, - end_line: 2721usize, + end_line: 3001usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -25126,7 +25215,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let extractor_fn = spec - .extractor_fn() + .primary_extractor() .expect("non-Storage variant must expose an extractor"); let extractor = ::alloc::__export::must_use({ ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) @@ -25241,9 +25330,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2644usize, + start_line: 2924usize, start_col: 22usize, - end_line: 2644usize, + end_line: 2924usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25369,9 +25458,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2677usize, + start_line: 2957usize, start_col: 22usize, - end_line: 2677usize, + end_line: 2957usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25473,9 +25562,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2721usize, + start_line: 3001usize, start_col: 22usize, - end_line: 2721usize, + end_line: 3001usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -25498,7 +25587,7 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let extractor_fn = spec - .extractor_fn() + .primary_extractor() .expect("non-Storage variant must expose an extractor"); let extractor = ::alloc::__export::must_use({ ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) @@ -25613,9 +25702,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -25632,19 +25721,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "all" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -25666,8 +25755,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "ASC" == "DESC" { expected.reverse(); @@ -25748,9 +25837,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -25767,19 +25856,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "all" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -25801,8 +25890,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "DESC" == "DESC" { expected.reverse(); @@ -25883,9 +25972,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -25902,19 +25991,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "gt_zero" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -25936,8 +26025,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "ASC" == "DESC" { expected.reverse(); @@ -26018,9 +26107,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26037,19 +26126,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "gt_zero" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -26071,8 +26160,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "DESC" == "DESC" { expected.reverse(); @@ -26153,9 +26242,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26172,19 +26261,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "all" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -26206,8 +26295,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "ASC" == "DESC" { expected.reverse(); @@ -26288,9 +26377,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26307,19 +26396,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "all" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -26341,8 +26430,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "DESC" == "DESC" { expected.reverse(); @@ -26423,9 +26512,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26442,19 +26531,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "gt_zero" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -26476,8 +26565,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "ASC" == "DESC" { expected.reverse(); @@ -26558,9 +26647,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1782usize, + start_line: 2056usize, start_col: 22usize, - end_line: 1782usize, + end_line: 2056usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26577,19 +26666,19 @@ pub mod int4 { pool: sqlx::PgPool, ) -> anyhow::Result<()> { { - use ::eql_tests::scalar_domains::ScalarType; + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let fixture_table = ::fixture_table_name(); - let zero: i32 = Default::default(); - let gt_zero = "gt_zero" == "gt_zero"; - let where_clause = if gt_zero { + let mid: i32 = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( " WHERE plaintext > {0}", - ::to_sql_literal(zero), + ::to_sql_literal(&mid), ), ) }) @@ -26611,8 +26700,8 @@ pub mod int4 { let mut expected: Vec = ::fixture_values() .to_vec(); expected.sort(); - if gt_zero { - expected.retain(|v| *v > zero); + if gt_mid { + expected.retain(|v| *v > mid); } if "DESC" == "DESC" { expected.reverse(); @@ -26693,9 +26782,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26869,9 +26958,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27045,9 +27134,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27221,9 +27310,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27397,9 +27486,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27573,9 +27662,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27749,9 +27838,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27925,9 +28014,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1892usize, + start_line: 2167usize, start_col: 22usize, - end_line: 1892usize, + end_line: 2167usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28101,9 +28190,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28204,9 +28293,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28307,9 +28396,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28410,9 +28499,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28513,9 +28602,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28616,9 +28705,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28719,9 +28808,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -28822,9 +28911,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2009usize, + start_line: 2284usize, start_col: 22usize, - end_line: 2009usize, + end_line: 2284usize, end_col: 87usize, compile_fail: false, no_run: false, From 5f031c06377f507e88c748c6f964e5296ffe213e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 20:58:01 +1000 Subject: [PATCH 185/599] test(inventory): add committed text matrix shape (text_search superset) --- mise.toml | 48 +++- tests/sqlx/snapshots/README.md | 43 ++- tests/sqlx/snapshots/matrix_tests_text.txt | 294 +++++++++++++++++++++ 3 files changed, 362 insertions(+), 23 deletions(-) create mode 100644 tests/sqlx/snapshots/matrix_tests_text.txt diff --git a/mise.toml b/mise.toml index 157650485..87de5790e 100644 --- a/mise.toml +++ b/mise.toml @@ -161,11 +161,11 @@ cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types """ [tasks."test:matrix:inventory"] -description = "Verify the matrix test-name set against the single canonical snapshot (or its derived eq-only subset), catalog-cross-checked (no database required)" +description = "Verify the matrix test-name set against the canonical snapshot (its derived eq-only subset, or the committed text superset), catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" run = """ #!/usr/bin/env bash -# Two committed, token-normalized snapshots. The canonical one +# Three committed, token-normalized snapshots. The canonical one # (snapshots/matrix_tests.txt) pins the set of macro-emitted matrix test names # for the ORDERED scalar shape. The second (snapshots/matrix_tests_eq_only.txt) # is the equality-only shape: an eq-only type's name set is exactly the ordered @@ -173,9 +173,14 @@ run = """ # DERIVED from the one baseline — but it is also committed and PINNED: the gate # re-derives the subset at runtime and asserts it equals the committed file # (step 3 below), so a change to the baseline or the strip filter that alters the -# eq-only set must be re-committed deliberately. Each discovered type must then -# match either the full baseline (ordered) or that derived/pinned subset -# (eq-only). One baseline drives both shapes however many types exist. +# eq-only set must be re-committed deliberately. The third +# (snapshots/matrix_tests_text.txt) is the TEXT shape: a SUPERSET of the ordered +# baseline (every ordered arm PLUS the text-only `_search` / `_eqidx` / `_match` +# arms). It is not derivable by a strip filter, so it is committed directly and +# pinned as a strict superset of the baseline. Each discovered type must then +# match the full baseline (ordered), that derived/pinned subset (eq-only), or the +# committed text superset. One baseline drives the ordered/eq-only shapes however +# many types exist. # # Steps: # 1. List the encrypted_domain binary ONCE (deterministic; reused below). @@ -184,8 +189,8 @@ run = """ # 3. Derive the eq-only subset from the ordered baseline and assert it equals # the committed snapshots/matrix_tests_eq_only.txt (pins the derivation). # 4. For each discovered type, normalize its token to and assert its set -# equals EITHER the canonical snapshot (ordered) OR the derived eq-only -# subset. Assert at least one type is present. +# equals the canonical snapshot (ordered), the derived eq-only subset, OR +# the committed text superset. Assert at least one type is present. # 5. Completeness cross-check: assert the discovered type set equals # `eql-codegen list-types`. A catalog type added without its matrix wiring # (no scalars:::: tests in the binary) fails here. @@ -197,6 +202,7 @@ set -euo pipefail test -f snapshots/matrix_tests.txt || { echo "snapshots/matrix_tests.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } test -f snapshots/matrix_tests_eq_only.txt || { echo "snapshots/matrix_tests_eq_only.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } +test -f snapshots/matrix_tests_text.txt || { echo "snapshots/matrix_tests_text.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') @@ -230,8 +236,22 @@ if ! cmp -s "$eq_only_expected" snapshots/matrix_tests_eq_only.txt; then exit 1 fi -# Per-type normalize + compare: each type must match EITHER the full canonical -# snapshot (ordered shape) OR the derived eq-only subset (equality-only shape). +# The text shape is the THIRD committed snapshot: a SUPERSET of the ordered +# baseline (every ordered arm PLUS the text-only `_search` / `_eqidx` / `_match` +# arms). Unlike eq-only it is not derivable by a strip filter, so it is committed +# directly. Pin the superset invariant: every ordered-baseline arm must be +# present in the text shape, so an edit that silently drops a baseline arm for +# text (regressing coverage) is caught here, not just at the per-type compare. +missing_from_text=$(comm -23 <(LC_ALL=C sort snapshots/matrix_tests.txt) <(LC_ALL=C sort snapshots/matrix_tests_text.txt)) +if [ -n "$missing_from_text" ]; then + echo "snapshots/matrix_tests_text.txt is missing ordered-baseline arms (text must be a superset):" >&2 + printf '%s\\n' "$missing_from_text" >&2 + exit 1 +fi + +# Per-type normalize + compare: each type must match the full canonical snapshot +# (ordered shape), the derived eq-only subset (equality-only shape), or the +# committed text superset (text shape). checked=0 while IFS= read -r t; do [ -n "$t" ] || continue @@ -241,18 +261,22 @@ while IFS= read -r t; do shape="ordered" elif cmp -s "/tmp/matrix-norm-${t}.txt" "$eq_only_expected"; then shape="eq_only" + elif cmp -s "/tmp/matrix-norm-${t}.txt" snapshots/matrix_tests_text.txt; then + shape="text" else - echo "Matrix test-name set for '${t}' matches NEITHER the canonical snapshot nor its derived eq-only subset." >&2 + echo "Matrix test-name set for '${t}' matches NEITHER the canonical snapshot, its derived eq-only subset, nor the text shape." >&2 echo " vs ordered (snapshots/matrix_tests.txt):" >&2 diff snapshots/matrix_tests.txt "/tmp/matrix-norm-${t}.txt" >&2 || true echo " vs derived eq-only (ordered minus _ord/order_by/routes_through_ob):" >&2 diff "$eq_only_expected" "/tmp/matrix-norm-${t}.txt" >&2 || true + echo " vs text superset (snapshots/matrix_tests_text.txt):" >&2 + diff snapshots/matrix_tests_text.txt "/tmp/matrix-norm-${t}.txt" >&2 || true exit 1 fi echo " ${t}: ${shape}" checked=$((checked + 1)) done <<< "$discovered" -[ "$checked" -gt 0 ] || { echo "No scalar type matched the canonical snapshot or its derived eq-only subset." >&2; exit 1; } +[ "$checked" -gt 0 ] || { echo "No scalar type matched the canonical snapshot, its derived eq-only subset, or the text superset." >&2; exit 1; } # Completeness cross-check against the catalog (the single source of truth). catalog=$(cd "{{config_root}}" && cargo run -p eql-codegen -- list-types | LC_ALL=C sort -u) @@ -264,7 +288,7 @@ if [ "$discovered" != "$catalog" ]; then exit 1 fi -echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot or its derived eq-only subset; catalog reconciled." +echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot, its derived eq-only subset, or the committed text superset; catalog reconciled." """ [tasks."test:matrix:inventory:jsonb_entry"] diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 833211e7c..5c8cf7a49 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -1,11 +1,12 @@ # Matrix coverage inventory snapshot -This directory holds two committed snapshots. The canonical one is -`matrix_tests.txt` — the token-normalized list of every `scalars::::*` test -name in the `encrypted_domain` SQLx binary, with each type token replaced by the -literal ``. The second, `matrix_tests_eq_only.txt`, is *derived* from it (see -below) and pinned. Both are **committed test baselines**, not gitignored -generated SQL — keep them in version control. +This directory holds the canonical committed snapshot, `matrix_tests.txt` — the +token-normalized list of every `scalars::::*` test name in the +`encrypted_domain` SQLx binary, with each type token replaced by the literal +`` — plus two shape variants derived from / committed alongside it +(`matrix_tests_eq_only.txt`, `matrix_tests_text.txt`; see below). They are +**committed test baselines**, not gitignored generated SQL — keep them in +version control. The per-type `_matrix_tests.txt` files are gone. They were byte-identical modulo the type token (the matrix tests are macro-generated from one @@ -29,6 +30,25 @@ shape. Regenerate the eq-only snapshot with: grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt | LC_ALL=C sort -u > snapshots/matrix_tests_eq_only.txt ``` +For the **text** shape there is a third committed snapshot, +`matrix_tests_text.txt`. A text scalar (`scalar_matrix! { caps = [eq, ord, search] }`) +runs the combined `_search` domain (equality + ordering + bloom match) through +the matrix in addition to the ordered shape, so its name set is a **superset** +of the ordered baseline: every ordered arm PLUS the text-only `_search` / +`_eqidx` (equality-via-`eq_term` index split) / `_match` (bloom `@>`/`<@` +containment) arms. Unlike eq-only this superset is **not** derivable by a strip +filter, so it is committed directly. The inventory gate pins it two ways: each +discovered type must match it exactly (after `` normalization), and the gate +asserts it is a strict superset of the ordered baseline (no ordered arm may be +missing for text). Regenerate the text snapshot with: + +```bash +cd tests/sqlx +cargo test --no-default-features --test encrypted_domain -- --list \ + | sed -n 's/: test$//p' | grep '^scalars::text::' \ + | sed -e 's/^scalars::text::/scalars::::/' -e 's/_text_/__/g' | LC_ALL=C sort > snapshots/matrix_tests_text.txt +``` + The "no per-type variation" property is preserved by design: every ordered scalar sweeps the same three `OrderedScalar` pivots (`min`/`mid`/`max`), so the `_pivot_mid_*` arms are identical modulo token across `int`/`date`/`text`. The @@ -59,11 +79,12 @@ The task (`mise.toml`, `[tasks."test:matrix:inventory"]`): `cargo test --no-default-features --test encrypted_domain -- --list`. 2. Discovers the set of scalar types present **from the binary's own output** (the `scalars::::` prefixes) — never a directory glob. -3. Normalizes each type's token to `` and asserts that type's set equals - **either** the canonical `matrix_tests.txt` (ordered shape) **or** the derived - eq-only subset (`matrix_tests.txt` minus `_ord`/`order_by`/`routes_through_ob`). - Prints each type's resolved shape (`ordered` / `eq_only`). Asserts at least - one type is present. +3. Normalizes each type's token to `` and asserts that type's set equals the + canonical `matrix_tests.txt` (ordered shape), the derived eq-only subset + (`matrix_tests.txt` minus `_ord`/`order_by`/`routes_through_ob`), or the + committed `matrix_tests_text.txt` superset (text shape). Prints each type's + resolved shape (`ordered` / `eq_only` / `text`). Asserts at least one type is + present. 4. **Completeness cross-check:** asserts the discovered type set equals `cargo run -p eql-codegen -- list-types` (the catalog is the single source). A catalog type added without its matrix wiring — no `scalars::::` tests in diff --git a/tests/sqlx/snapshots/matrix_tests_text.txt b/tests/sqlx/snapshots/matrix_tests_text.txt new file mode 100644 index 000000000..3bd0f4c5a --- /dev/null +++ b/tests/sqlx/snapshots/matrix_tests_text.txt @@ -0,0 +1,294 @@ +scalars::::matrix__eq_aggregate_typecheck_max +scalars::::matrix__eq_aggregate_typecheck_min +scalars::::matrix__eq_contained_by_blocker +scalars::::matrix__eq_contains_blocker +scalars::::matrix__eq_count_distinct_extractor +scalars::::matrix__eq_count_path_cast +scalars::::matrix__eq_count_typed_column +scalars::::matrix__eq_eq_pivot_max_correctness +scalars::::matrix__eq_eq_pivot_max_cross_shape +scalars::::matrix__eq_eq_pivot_mid_correctness +scalars::::matrix__eq_eq_pivot_mid_cross_shape +scalars::::matrix__eq_eq_pivot_min_correctness +scalars::::matrix__eq_eq_pivot_min_cross_shape +scalars::::matrix__eq_eq_supported_null +scalars::::matrix__eq_gt_blocker +scalars::::matrix__eq_gte_blocker +scalars::::matrix__eq_index_engages_btree +scalars::::matrix__eq_index_engages_hash +scalars::::matrix__eq_lt_blocker +scalars::::matrix__eq_lte_blocker +scalars::::matrix__eq_native_absent_ops +scalars::::matrix__eq_neq_pivot_max_correctness +scalars::::matrix__eq_neq_pivot_max_cross_shape +scalars::::matrix__eq_neq_pivot_mid_correctness +scalars::::matrix__eq_neq_pivot_mid_cross_shape +scalars::::matrix__eq_neq_pivot_min_correctness +scalars::::matrix__eq_neq_pivot_min_cross_shape +scalars::::matrix__eq_neq_supported_null +scalars::::matrix__eq_path_op_blockers +scalars::::matrix__eq_payload_check +scalars::::matrix__eq_planner_metadata_eq +scalars::::matrix__eq_sanity +scalars::::matrix__eq_typed_column_blocker +scalars::::matrix__fixture_shape +scalars::::matrix__ord_aggregate_group_by_max +scalars::::matrix__ord_aggregate_group_by_min +scalars::::matrix__ord_aggregate_max +scalars::::matrix__ord_aggregate_max_all_null +scalars::::matrix__ord_aggregate_max_empty +scalars::::matrix__ord_aggregate_max_mixed_null +scalars::::matrix__ord_aggregate_min +scalars::::matrix__ord_aggregate_min_all_null +scalars::::matrix__ord_aggregate_min_empty +scalars::::matrix__ord_aggregate_min_mixed_null +scalars::::matrix__ord_aggregate_parallel_safe +scalars::::matrix__ord_contained_by_blocker +scalars::::matrix__ord_contains_blocker +scalars::::matrix__ord_count_distinct_extractor +scalars::::matrix__ord_count_path_cast +scalars::::matrix__ord_count_typed_column +scalars::::matrix__ord_eq_pivot_max_correctness +scalars::::matrix__ord_eq_pivot_max_cross_shape +scalars::::matrix__ord_eq_pivot_mid_correctness +scalars::::matrix__ord_eq_pivot_mid_cross_shape +scalars::::matrix__ord_eq_pivot_min_correctness +scalars::::matrix__ord_eq_pivot_min_cross_shape +scalars::::matrix__ord_eq_supported_null +scalars::::matrix__ord_eqidx_index_engages_btree +scalars::::matrix__ord_gt_pivot_max_correctness +scalars::::matrix__ord_gt_pivot_max_cross_shape +scalars::::matrix__ord_gt_pivot_mid_correctness +scalars::::matrix__ord_gt_pivot_mid_cross_shape +scalars::::matrix__ord_gt_pivot_min_correctness +scalars::::matrix__ord_gt_pivot_min_cross_shape +scalars::::matrix__ord_gt_supported_null +scalars::::matrix__ord_gte_pivot_max_correctness +scalars::::matrix__ord_gte_pivot_max_cross_shape +scalars::::matrix__ord_gte_pivot_mid_correctness +scalars::::matrix__ord_gte_pivot_mid_cross_shape +scalars::::matrix__ord_gte_pivot_min_correctness +scalars::::matrix__ord_gte_pivot_min_cross_shape +scalars::::matrix__ord_gte_supported_null +scalars::::matrix__ord_index_engages_btree +scalars::::matrix__ord_lt_pivot_max_correctness +scalars::::matrix__ord_lt_pivot_max_cross_shape +scalars::::matrix__ord_lt_pivot_mid_correctness +scalars::::matrix__ord_lt_pivot_mid_cross_shape +scalars::::matrix__ord_lt_pivot_min_correctness +scalars::::matrix__ord_lt_pivot_min_cross_shape +scalars::::matrix__ord_lt_supported_null +scalars::::matrix__ord_lte_pivot_max_correctness +scalars::::matrix__ord_lte_pivot_max_cross_shape +scalars::::matrix__ord_lte_pivot_mid_correctness +scalars::::matrix__ord_lte_pivot_mid_cross_shape +scalars::::matrix__ord_lte_pivot_min_correctness +scalars::::matrix__ord_lte_pivot_min_cross_shape +scalars::::matrix__ord_lte_supported_null +scalars::::matrix__ord_native_absent_ops +scalars::::matrix__ord_neq_pivot_max_correctness +scalars::::matrix__ord_neq_pivot_max_cross_shape +scalars::::matrix__ord_neq_pivot_mid_correctness +scalars::::matrix__ord_neq_pivot_mid_cross_shape +scalars::::matrix__ord_neq_pivot_min_correctness +scalars::::matrix__ord_neq_pivot_min_cross_shape +scalars::::matrix__ord_neq_supported_null +scalars::::matrix__ord_ord_routes_through_ob +scalars::::matrix__ord_order_by_asc_no_where +scalars::::matrix__ord_order_by_asc_nulls_first +scalars::::matrix__ord_order_by_asc_nulls_last +scalars::::matrix__ord_order_by_asc_with_where +scalars::::matrix__ord_order_by_desc_no_where +scalars::::matrix__ord_order_by_desc_nulls_first +scalars::::matrix__ord_order_by_desc_nulls_last +scalars::::matrix__ord_order_by_desc_with_where +scalars::::matrix__ord_order_by_using_gt_rejects +scalars::::matrix__ord_order_by_using_gte_rejects +scalars::::matrix__ord_order_by_using_lt_rejects +scalars::::matrix__ord_order_by_using_lte_rejects +scalars::::matrix__ord_ore_aggregate_group_by_max +scalars::::matrix__ord_ore_aggregate_group_by_min +scalars::::matrix__ord_ore_aggregate_max +scalars::::matrix__ord_ore_aggregate_max_all_null +scalars::::matrix__ord_ore_aggregate_max_empty +scalars::::matrix__ord_ore_aggregate_max_mixed_null +scalars::::matrix__ord_ore_aggregate_min +scalars::::matrix__ord_ore_aggregate_min_all_null +scalars::::matrix__ord_ore_aggregate_min_empty +scalars::::matrix__ord_ore_aggregate_min_mixed_null +scalars::::matrix__ord_ore_aggregate_parallel_safe +scalars::::matrix__ord_ore_contained_by_blocker +scalars::::matrix__ord_ore_contains_blocker +scalars::::matrix__ord_ore_count_distinct_extractor +scalars::::matrix__ord_ore_count_path_cast +scalars::::matrix__ord_ore_count_typed_column +scalars::::matrix__ord_ore_eq_pivot_max_correctness +scalars::::matrix__ord_ore_eq_pivot_max_cross_shape +scalars::::matrix__ord_ore_eq_pivot_mid_correctness +scalars::::matrix__ord_ore_eq_pivot_mid_cross_shape +scalars::::matrix__ord_ore_eq_pivot_min_correctness +scalars::::matrix__ord_ore_eq_pivot_min_cross_shape +scalars::::matrix__ord_ore_eq_supported_null +scalars::::matrix__ord_ore_eqidx_index_engages_btree +scalars::::matrix__ord_ore_gt_pivot_max_correctness +scalars::::matrix__ord_ore_gt_pivot_max_cross_shape +scalars::::matrix__ord_ore_gt_pivot_mid_correctness +scalars::::matrix__ord_ore_gt_pivot_mid_cross_shape +scalars::::matrix__ord_ore_gt_pivot_min_correctness +scalars::::matrix__ord_ore_gt_pivot_min_cross_shape +scalars::::matrix__ord_ore_gt_supported_null +scalars::::matrix__ord_ore_gte_pivot_max_correctness +scalars::::matrix__ord_ore_gte_pivot_max_cross_shape +scalars::::matrix__ord_ore_gte_pivot_mid_correctness +scalars::::matrix__ord_ore_gte_pivot_mid_cross_shape +scalars::::matrix__ord_ore_gte_pivot_min_correctness +scalars::::matrix__ord_ore_gte_pivot_min_cross_shape +scalars::::matrix__ord_ore_gte_supported_null +scalars::::matrix__ord_ore_index_engages_btree +scalars::::matrix__ord_ore_lt_pivot_max_correctness +scalars::::matrix__ord_ore_lt_pivot_max_cross_shape +scalars::::matrix__ord_ore_lt_pivot_mid_correctness +scalars::::matrix__ord_ore_lt_pivot_mid_cross_shape +scalars::::matrix__ord_ore_lt_pivot_min_correctness +scalars::::matrix__ord_ore_lt_pivot_min_cross_shape +scalars::::matrix__ord_ore_lt_supported_null +scalars::::matrix__ord_ore_lte_pivot_max_correctness +scalars::::matrix__ord_ore_lte_pivot_max_cross_shape +scalars::::matrix__ord_ore_lte_pivot_mid_correctness +scalars::::matrix__ord_ore_lte_pivot_mid_cross_shape +scalars::::matrix__ord_ore_lte_pivot_min_correctness +scalars::::matrix__ord_ore_lte_pivot_min_cross_shape +scalars::::matrix__ord_ore_lte_supported_null +scalars::::matrix__ord_ore_native_absent_ops +scalars::::matrix__ord_ore_neq_pivot_max_correctness +scalars::::matrix__ord_ore_neq_pivot_max_cross_shape +scalars::::matrix__ord_ore_neq_pivot_mid_correctness +scalars::::matrix__ord_ore_neq_pivot_mid_cross_shape +scalars::::matrix__ord_ore_neq_pivot_min_correctness +scalars::::matrix__ord_ore_neq_pivot_min_cross_shape +scalars::::matrix__ord_ore_neq_supported_null +scalars::::matrix__ord_ore_ord_routes_through_ob +scalars::::matrix__ord_ore_order_by_asc_no_where +scalars::::matrix__ord_ore_order_by_asc_nulls_first +scalars::::matrix__ord_ore_order_by_asc_nulls_last +scalars::::matrix__ord_ore_order_by_asc_with_where +scalars::::matrix__ord_ore_order_by_desc_no_where +scalars::::matrix__ord_ore_order_by_desc_nulls_first +scalars::::matrix__ord_ore_order_by_desc_nulls_last +scalars::::matrix__ord_ore_order_by_desc_with_where +scalars::::matrix__ord_ore_order_by_using_gt_rejects +scalars::::matrix__ord_ore_order_by_using_gte_rejects +scalars::::matrix__ord_ore_order_by_using_lt_rejects +scalars::::matrix__ord_ore_order_by_using_lte_rejects +scalars::::matrix__ord_ore_ore_injectivity +scalars::::matrix__ord_ore_path_op_blockers +scalars::::matrix__ord_ore_payload_check +scalars::::matrix__ord_ore_planner_metadata_eq +scalars::::matrix__ord_ore_planner_metadata_ord +scalars::::matrix__ord_ore_sanity +scalars::::matrix__ord_ore_typed_column_blocker +scalars::::matrix__ord_path_op_blockers +scalars::::matrix__ord_payload_check +scalars::::matrix__ord_planner_metadata_eq +scalars::::matrix__ord_planner_metadata_ord +scalars::::matrix__ord_sanity +scalars::::matrix__ord_scale_preference_default_btree +scalars::::matrix__ord_typed_column_blocker +scalars::::matrix__search_aggregate_group_by_max +scalars::::matrix__search_aggregate_group_by_min +scalars::::matrix__search_aggregate_max +scalars::::matrix__search_aggregate_max_all_null +scalars::::matrix__search_aggregate_max_empty +scalars::::matrix__search_aggregate_max_mixed_null +scalars::::matrix__search_aggregate_min +scalars::::matrix__search_aggregate_min_all_null +scalars::::matrix__search_aggregate_min_empty +scalars::::matrix__search_aggregate_min_mixed_null +scalars::::matrix__search_aggregate_parallel_safe +scalars::::matrix__search_count_distinct_extractor +scalars::::matrix__search_count_path_cast +scalars::::matrix__search_count_typed_column +scalars::::matrix__search_eq_pivot_max_correctness +scalars::::matrix__search_eq_pivot_max_cross_shape +scalars::::matrix__search_eq_pivot_mid_correctness +scalars::::matrix__search_eq_pivot_mid_cross_shape +scalars::::matrix__search_eq_pivot_min_correctness +scalars::::matrix__search_eq_pivot_min_cross_shape +scalars::::matrix__search_eq_supported_null +scalars::::matrix__search_eqidx_index_engages_btree +scalars::::matrix__search_gt_pivot_max_correctness +scalars::::matrix__search_gt_pivot_max_cross_shape +scalars::::matrix__search_gt_pivot_mid_correctness +scalars::::matrix__search_gt_pivot_mid_cross_shape +scalars::::matrix__search_gt_pivot_min_correctness +scalars::::matrix__search_gt_pivot_min_cross_shape +scalars::::matrix__search_gt_supported_null +scalars::::matrix__search_gte_pivot_max_correctness +scalars::::matrix__search_gte_pivot_max_cross_shape +scalars::::matrix__search_gte_pivot_mid_correctness +scalars::::matrix__search_gte_pivot_mid_cross_shape +scalars::::matrix__search_gte_pivot_min_correctness +scalars::::matrix__search_gte_pivot_min_cross_shape +scalars::::matrix__search_gte_supported_null +scalars::::matrix__search_index_engages_btree +scalars::::matrix__search_lt_pivot_max_correctness +scalars::::matrix__search_lt_pivot_max_cross_shape +scalars::::matrix__search_lt_pivot_mid_correctness +scalars::::matrix__search_lt_pivot_mid_cross_shape +scalars::::matrix__search_lt_pivot_min_correctness +scalars::::matrix__search_lt_pivot_min_cross_shape +scalars::::matrix__search_lt_supported_null +scalars::::matrix__search_lte_pivot_max_correctness +scalars::::matrix__search_lte_pivot_max_cross_shape +scalars::::matrix__search_lte_pivot_mid_correctness +scalars::::matrix__search_lte_pivot_mid_cross_shape +scalars::::matrix__search_lte_pivot_min_correctness +scalars::::matrix__search_lte_pivot_min_cross_shape +scalars::::matrix__search_lte_supported_null +scalars::::matrix__search_match_contains_needle +scalars::::matrix__search_match_contains_self +scalars::::matrix__search_match_disjoint_miss +scalars::::matrix__search_match_index_engages_gin +scalars::::matrix__search_native_absent_ops +scalars::::matrix__search_neq_pivot_max_correctness +scalars::::matrix__search_neq_pivot_max_cross_shape +scalars::::matrix__search_neq_pivot_mid_correctness +scalars::::matrix__search_neq_pivot_mid_cross_shape +scalars::::matrix__search_neq_pivot_min_correctness +scalars::::matrix__search_neq_pivot_min_cross_shape +scalars::::matrix__search_neq_supported_null +scalars::::matrix__search_ord_routes_through_ob +scalars::::matrix__search_order_by_asc_no_where +scalars::::matrix__search_order_by_asc_nulls_first +scalars::::matrix__search_order_by_asc_nulls_last +scalars::::matrix__search_order_by_asc_with_where +scalars::::matrix__search_order_by_desc_no_where +scalars::::matrix__search_order_by_desc_nulls_first +scalars::::matrix__search_order_by_desc_nulls_last +scalars::::matrix__search_order_by_desc_with_where +scalars::::matrix__search_order_by_using_gt_rejects +scalars::::matrix__search_order_by_using_gte_rejects +scalars::::matrix__search_order_by_using_lt_rejects +scalars::::matrix__search_order_by_using_lte_rejects +scalars::::matrix__search_path_op_blockers +scalars::::matrix__search_payload_check +scalars::::matrix__search_planner_metadata_eq +scalars::::matrix__search_planner_metadata_ord +scalars::::matrix__search_sanity +scalars::::matrix__storage_aggregate_typecheck_max +scalars::::matrix__storage_aggregate_typecheck_min +scalars::::matrix__storage_contained_by_blocker +scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_path_cast +scalars::::matrix__storage_count_typed_column +scalars::::matrix__storage_eq_blocker +scalars::::matrix__storage_gt_blocker +scalars::::matrix__storage_gte_blocker +scalars::::matrix__storage_lt_blocker +scalars::::matrix__storage_lte_blocker +scalars::::matrix__storage_native_absent_ops +scalars::::matrix__storage_neq_blocker +scalars::::matrix__storage_path_op_blockers +scalars::::matrix__storage_payload_check +scalars::::matrix__storage_sanity +scalars::::matrix__storage_typed_column_blocker From ab10131d93bae5c64f3b2f178b0c0f9a50751569 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 21:00:49 +1000 Subject: [PATCH 186/599] docs: update wrapper/blocker table + framing for multi-term domains --- .../adding-a-scalar-encrypted-domain-type.md | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index e530f172c..6c760f4fe 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -490,11 +490,17 @@ onto inlinable wrappers; everything else carries minimal metadata backing onto blockers. Path operators always back onto blockers — neither current term enables them — and the native `jsonb` operators are blocker-only **except `@>`/`<@`**, which back onto inlinable containment wrappers (`eql_v3.contains` / -`eql_v3.contained_by`) on a `Bloom` `_match` domain (e.g. `eql_v3.text_match`) -and elsewhere stay blockers — matching the per-domain table just below, where the -`&[Term::Bloom]` row carries six containment wrappers. - -The wrapper/blocker split per domain (the 44-operator total never moves): +`eql_v3.contained_by`) on any domain carrying the `Bloom` term — the +single-capability `_match` domain (e.g. `eql_v3.text_match`) **and** the combined +`_search` domain (`eql_v3.text_search`, `[Hm, Ore, Bloom]`) — and elsewhere stay +blockers — matching the per-domain table just below, where every `Bloom`-bearing +row carries six containment wrappers. + +The wrapper/blocker split per domain (the 44-operator total never moves). A +domain's wrappers are the **union** of its terms' operators +(`Term::operators_for_terms`), so a multi-term domain advertises every operator +any of its terms provides; the rest stay blockers. `Functions` = +`44 + ` (one extractor function per distinct extractor): | Domain terms | Extractors | Wrappers | Blockers | Functions | Operators | | ----------------- | ---------: | -------: | -------: | --------: | --------: | @@ -502,9 +508,17 @@ The wrapper/blocker split per domain (the 44-operator total never moves): | `&[Term::Hm]` | 1 (`eq_term`) | 6 | 38 | 45 | 44 | | `&[Term::Bloom]` | 1 (`match_term`) | 6 | 38 | 45 | 44 | | `&[Term::Ore]` | 1 (`ord_term`) | 18 | 26 | 45 | 44 | +| `&[Term::Hm, Term::Ore]` | 2 (`eq_term`, `ord_term`) | 18 | 26 | 46 | 44 | +| `&[Term::Hm, Term::Ore, Term::Bloom]` | 3 (`eq_term`, `ord_term`, `match_term`) | 24 | 20 | 47 | 44 | Six wrappers for `Hm` = `=` and `<>` × three shapes; six for `Bloom` = `@>` and -`<@` × three shapes; eighteen for `Ore` = six operators × three shapes. +`<@` × three shapes; eighteen for `Ore` = six operators × three shapes. For the +multi-term rows the wrapper set is the **deduplicated union**: `[Hm, Ore]` is +`{=, <>, <, <=, >, >=}` (Ore's `=`/`<>` collapse onto Hm's — only the *extractor* +differs, so the count stays 18, but `=`/`<>` now resolve through `eq_term`, exact +HMAC, not ORE); `[Hm, Ore, Bloom]` adds `@>`/`<@` for 24. The extra extractor +functions are the only thing that grows `Functions` past 45 — the operator total +is always 44. **Untyped-literal resolver edge.** PostgreSQL's operator resolver still prefers the built-in `jsonb` operator for untyped string literals in forms such as From d5ee615a1c854e3510e1b70739061ca88529796f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 21:01:45 +1000 Subject: [PATCH 187/599] docs(changelog): note text_search domain + hm-routed ordered text equality --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 908888fa5..88814a49c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,7 +29,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) - **`eql_v3.timestamptz` encrypted-domain type family (equality-only).** Two jsonb-backed domains for encrypted `timestamptz` columns — `eql_v3.timestamptz` (storage-only) and `eql_v3.timestamptz_eq` (`=` / `<>` via HMAC) — generated from the `timestamptz` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast. Index via a functional index on the `eql_v3.eq_term` extractor, not an operator class on the domain. **Ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) is deferred:** cipherstash encrypts `Plaintext::Timestamp` at native 12-block ORE width, but EQL's only ORE comparator (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so ordered timestamptz domains would silently mis-order. There are no `eql_v3.timestamptz_ord` / `_ord_ore` domains and no timestamptz `MIN` / `MAX` aggregates until a wide-ORE (12-block) term lands — tracked in [#241](https://github.com/cipherstash/encrypt-query-language/issues/241). Why: a type-safe, equality-searchable encrypted UTC-timestamp column, stacking on the `date` temporal-scalar foundation; ordering follows once the comparator supports the native ciphertext width. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) -- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) +- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) From 7debb34aed265eddec2455414c609f2371b65255 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 21:06:30 +1000 Subject: [PATCH 188/599] style(tests): rustfmt support.rs (assert line-wrapping) --- tests/sqlx/tests/encrypted_domain/family/support.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index 359fe7b02..a9271dad6 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -41,8 +41,14 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { assert!(ord.supports_ord()); assert_eq!(ord.primary_extractor().as_deref(), Some("eql_v3.ord_term")); // int4_ord is `[Ore]`-only: equality routes through ORE (lossless for ints). - assert_eq!(ord.extractor_for_op("=").as_deref(), Some("eql_v3.ord_term")); - assert_eq!(ord.extractor_for_op("<").as_deref(), Some("eql_v3.ord_term")); + assert_eq!( + ord.extractor_for_op("=").as_deref(), + Some("eql_v3.ord_term") + ); + assert_eq!( + ord.extractor_for_op("<").as_deref(), + Some("eql_v3.ord_term") + ); assert_eq!( Variant::Ord.payload_required_keys("int4"), vec!["v", "i", "c", "ob"] From 8325ffda8df7bade95992e9d6b12eb8f46baa25d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 13 Jun 2026 12:15:09 +1000 Subject: [PATCH 189/599] chore: mark generated snapshots + codegen reference SQL as linguist-generated GitHub collapses these in PR diffs and excludes them from language stats. They are CI-verified machine-generated artifacts (parity gate, cargo-expand snapshots, matrix-coverage inventory), never hand-edited, so collapsing keeps reviews focused on source. Display hint only: files stay tracked and diffable, and nothing about Git, CI, or the build changes. --- .gitattributes | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..b132fa9e2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Generated artifacts. Marked `linguist-generated` so GitHub collapses them in +# pull-request / commit diffs by default and excludes them from repository +# language statistics. They are machine-generated and CI-verified — never +# hand-edited — so the collapsed default keeps reviews focused on source. +# +# - tests/codegen/reference/**/*.sql : parity baseline, byte-for-byte verified +# against `cargo run -p eql-codegen` by crates/eql-codegen/tests/parity.rs. +# - tests/sqlx/snapshots/*_expanded.rs : `cargo expand` snapshots of the +# scalar matrix macros (the start_line/end_line churn is location drift). +# - tests/sqlx/snapshots/matrix_tests*.txt : matrix-coverage inventory pinned +# by `mise run test:matrix:inventory`. +# +# This is a GitHub display hint only: the files remain tracked, diffable, and +# reviewable on demand, and nothing about Git, CI, or the build changes. +tests/codegen/reference/**/*.sql linguist-generated +tests/sqlx/snapshots/*_expanded.rs linguist-generated +tests/sqlx/snapshots/matrix_tests*.txt linguist-generated From 5cdea3b48ab948ec5059781a074b18c0163e215d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 13 Jun 2026 19:22:31 +1000 Subject: [PATCH 190/599] test(matrix): dispatch aggregate-typecheck on supports_ord() at runtime The aggregate-typecheck dispatch branched on the variant IDENT at macro-expansion time, with empty arms for Ord/OrdOre/Search meaning "emit no test" and a fallback arm emitting the 42883/42725 rejection assertion. Every new ord-capable variant had to remember to add an empty arm or the test silently did the wrong thing (asserting min/max are rejected on a variant that actually declares them). Replace the ident-literal dispatch with a single arm that emits one min + one max test per variant whose body branches at RUNTIME on spec.supports_ord() (catalog-derived): ord-capable -> assert eql_v3.min/max(value) RESOLVES; non-ord -> assert the call is rejected with SQLSTATE 42883/42725. A new ord-capable variant now needs no macro change. This emits aggregate_typecheck min/max tests for the ord/ord_ore (and text's search) variants that previously emitted none, so the committed matrix_tests.txt / matrix_tests_text.txt inventory snapshots and the int4 cargo-expand snapshot are regenerated (purely additive: no existing test name removed). eq-only snapshot unchanged (new names contain _ord, stripped by the derive filter; eq-only types have no ord variant). --- tests/sqlx/snapshots/int4_expanded.rs | 1072 +++++++++++++++++--- tests/sqlx/snapshots/matrix_tests.txt | 4 + tests/sqlx/snapshots/matrix_tests_text.txt | 6 + tests/sqlx/src/matrix.rs | 111 +- 4 files changed, 990 insertions(+), 203 deletions(-) diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/int4_expanded.rs index 7cc4126fa..fae1faeca 100644 --- a/tests/sqlx/snapshots/int4_expanded.rs +++ b/tests/sqlx/snapshots/int4_expanded.rs @@ -23778,9 +23778,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2823usize, + start_line: 2821usize, start_col: 22usize, - end_line: 2823usize, + end_line: 2821usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23828,7 +23828,6 @@ pub mod int4 { .bind(payload) .execute(&mut *tx) .await?; - sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -23837,44 +23836,68 @@ pub mod int4 { ), ) }); - let err = sqlx::query_scalar::<_, String>(&sql) - .fetch_one(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "eql_v3.{0} on non-ord variant {1} must raise but succeeded", - "min", - d, - ), - ) - }), - ); - let db_err = err - .as_database_error() - .expect("expected database error from typecheck probe"); - let code = db_err.code(); - if ::anyhow::__private::not( - code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), - ) { - return ::anyhow::__private::Err( - ::anyhow::Error::msg( - ::alloc::__export::must_use({ + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "min", d, - code, - db_err.message(), ), ) }), - ), - ); + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; } - sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; tx.commit().await?; Ok(()) } @@ -23923,9 +23946,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2823usize, + start_line: 2821usize, start_col: 22usize, - end_line: 2823usize, + end_line: 2821usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23973,7 +23996,6 @@ pub mod int4 { .bind(payload) .execute(&mut *tx) .await?; - sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -23982,44 +24004,68 @@ pub mod int4 { ), ) }); - let err = sqlx::query_scalar::<_, String>(&sql) - .fetch_one(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "eql_v3.{0} on non-ord variant {1} must raise but succeeded", - "max", - d, - ), - ) - }), - ); - let db_err = err - .as_database_error() - .expect("expected database error from typecheck probe"); - let code = db_err.code(); - if ::anyhow::__private::not( - code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), - ) { - return ::anyhow::__private::Err( - ::anyhow::Error::msg( - ::alloc::__export::must_use({ + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "max", d, - code, - db_err.message(), ), ) }), - ), - ); + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; } - sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; tx.commit().await?; Ok(()) } @@ -24068,9 +24114,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2823usize, + start_line: 2821usize, start_col: 22usize, - end_line: 2823usize, + end_line: 2821usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24118,7 +24164,6 @@ pub mod int4 { .bind(payload) .execute(&mut *tx) .await?; - sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -24127,44 +24172,68 @@ pub mod int4 { ), ) }); - let err = sqlx::query_scalar::<_, String>(&sql) - .fetch_one(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "eql_v3.{0} on non-ord variant {1} must raise but succeeded", - "min", - d, - ), - ) - }), - ); - let db_err = err - .as_database_error() - .expect("expected database error from typecheck probe"); - let code = db_err.code(); - if ::anyhow::__private::not( - code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), - ) { - return ::anyhow::__private::Err( - ::anyhow::Error::msg( - ::alloc::__export::must_use({ + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "min", d, - code, - db_err.message(), ), ) }), - ), - ); + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; } - sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; tx.commit().await?; Ok(()) } @@ -24213,9 +24282,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2823usize, + start_line: 2821usize, start_col: 22usize, - end_line: 2823usize, + end_line: 2821usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24263,7 +24332,6 @@ pub mod int4 { .bind(payload) .execute(&mut *tx) .await?; - sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -24272,44 +24340,68 @@ pub mod int4 { ), ) }); - let err = sqlx::query_scalar::<_, String>(&sql) - .fetch_one(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "eql_v3.{0} on non-ord variant {1} must raise but succeeded", - "max", - d, - ), - ) - }), - ); - let db_err = err - .as_database_error() - .expect("expected database error from typecheck probe"); - let code = db_err.code(); - if ::anyhow::__private::not( - code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), - ) { - return ::anyhow::__private::Err( - ::anyhow::Error::msg( - ::alloc::__export::must_use({ + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", "max", d, - code, - db_err.message(), ), ) }), - ), - ); + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; } - sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; tx.commit().await?; Ok(()) } @@ -24348,6 +24440,678 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2821usize, + start_col: 22usize, + end_line: 2821usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_typecheck_min()), + ), + }; + fn matrix_int4_ord_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_int4_ord_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2821usize, + start_col: 22usize, + end_line: 2821usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_aggregate_typecheck_max()), + ), + }; + fn matrix_int4_ord_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_int4_ord_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2821usize, + start_col: 22usize, + end_line: 2821usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_typecheck_min()), + ), + }; + fn matrix_int4_ord_ore_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2821usize, + start_col: 22usize, + end_line: 2821usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_aggregate_typecheck_max()), + ), + }; + fn matrix_int4_ord_ore_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; #[rustc_test_marker = "scalars::int4::matrix_int4_storage_count_typed_column"] #[doc(hidden)] pub const matrix_int4_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { @@ -24358,9 +25122,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2924usize, + start_line: 2937usize, start_col: 22usize, - end_line: 2924usize, + end_line: 2937usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24486,9 +25250,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2957usize, + start_line: 2970usize, start_col: 22usize, - end_line: 2957usize, + end_line: 2970usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -24590,9 +25354,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2924usize, + start_line: 2937usize, start_col: 22usize, - end_line: 2924usize, + end_line: 2937usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -24716,9 +25480,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2957usize, + start_line: 2970usize, start_col: 22usize, - end_line: 2957usize, + end_line: 2970usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -24820,9 +25584,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3001usize, + start_line: 3014usize, start_col: 22usize, - end_line: 3001usize, + end_line: 3014usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -24960,9 +25724,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2924usize, + start_line: 2937usize, start_col: 22usize, - end_line: 2924usize, + end_line: 2937usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25086,9 +25850,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2957usize, + start_line: 2970usize, start_col: 22usize, - end_line: 2957usize, + end_line: 2970usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25190,9 +25954,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3001usize, + start_line: 3014usize, start_col: 22usize, - end_line: 3001usize, + end_line: 3014usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -25330,9 +26094,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2924usize, + start_line: 2937usize, start_col: 22usize, - end_line: 2924usize, + end_line: 2937usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25458,9 +26222,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2957usize, + start_line: 2970usize, start_col: 22usize, - end_line: 2957usize, + end_line: 2970usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25562,9 +26326,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3001usize, + start_line: 3014usize, start_col: 22usize, - end_line: 3001usize, + end_line: 3014usize, end_col: 78usize, compile_fail: false, no_run: false, diff --git a/tests/sqlx/snapshots/matrix_tests.txt b/tests/sqlx/snapshots/matrix_tests.txt index 46cb39264..8c7097e0e 100644 --- a/tests/sqlx/snapshots/matrix_tests.txt +++ b/tests/sqlx/snapshots/matrix_tests.txt @@ -43,6 +43,8 @@ scalars::::matrix__ord_aggregate_min_all_null scalars::::matrix__ord_aggregate_min_empty scalars::::matrix__ord_aggregate_min_mixed_null scalars::::matrix__ord_aggregate_parallel_safe +scalars::::matrix__ord_aggregate_typecheck_max +scalars::::matrix__ord_aggregate_typecheck_min scalars::::matrix__ord_contained_by_blocker scalars::::matrix__ord_contains_blocker scalars::::matrix__ord_count_distinct_extractor @@ -116,6 +118,8 @@ scalars::::matrix__ord_ore_aggregate_min_all_null scalars::::matrix__ord_ore_aggregate_min_empty scalars::::matrix__ord_ore_aggregate_min_mixed_null scalars::::matrix__ord_ore_aggregate_parallel_safe +scalars::::matrix__ord_ore_aggregate_typecheck_max +scalars::::matrix__ord_ore_aggregate_typecheck_min scalars::::matrix__ord_ore_contained_by_blocker scalars::::matrix__ord_ore_contains_blocker scalars::::matrix__ord_ore_count_distinct_extractor diff --git a/tests/sqlx/snapshots/matrix_tests_text.txt b/tests/sqlx/snapshots/matrix_tests_text.txt index 3bd0f4c5a..56d7a3f00 100644 --- a/tests/sqlx/snapshots/matrix_tests_text.txt +++ b/tests/sqlx/snapshots/matrix_tests_text.txt @@ -43,6 +43,8 @@ scalars::::matrix__ord_aggregate_min_all_null scalars::::matrix__ord_aggregate_min_empty scalars::::matrix__ord_aggregate_min_mixed_null scalars::::matrix__ord_aggregate_parallel_safe +scalars::::matrix__ord_aggregate_typecheck_max +scalars::::matrix__ord_aggregate_typecheck_min scalars::::matrix__ord_contained_by_blocker scalars::::matrix__ord_contains_blocker scalars::::matrix__ord_count_distinct_extractor @@ -117,6 +119,8 @@ scalars::::matrix__ord_ore_aggregate_min_all_null scalars::::matrix__ord_ore_aggregate_min_empty scalars::::matrix__ord_ore_aggregate_min_mixed_null scalars::::matrix__ord_ore_aggregate_parallel_safe +scalars::::matrix__ord_ore_aggregate_typecheck_max +scalars::::matrix__ord_ore_aggregate_typecheck_min scalars::::matrix__ord_ore_contained_by_blocker scalars::::matrix__ord_ore_contains_blocker scalars::::matrix__ord_ore_count_distinct_extractor @@ -205,6 +209,8 @@ scalars::::matrix__search_aggregate_min_all_null scalars::::matrix__search_aggregate_min_empty scalars::::matrix__search_aggregate_min_mixed_null scalars::::matrix__search_aggregate_parallel_safe +scalars::::matrix__search_aggregate_typecheck_max +scalars::::matrix__search_aggregate_typecheck_min scalars::::matrix__search_count_distinct_extractor scalars::::matrix__search_count_path_cast scalars::::matrix__search_count_typed_column diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 1158961ff..e7fd94a9c 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -2842,10 +2842,14 @@ want ({}, {:?}), got {:?}", } // ============================================================================ -// Aggregate type-safety category — for variants that do NOT support ord -// (Storage, Eq), `eql_v3.min()` / `eql_v3.max(...)` must -// resolve to "function does not exist" (SQLSTATE 42883). Pins that -// codegen correctly omits MIN/MAX wrappers for these variants — a +// Aggregate type-safety category — one min + one max test per variant whose +// body branches at RUNTIME on `spec.supports_ord()` (catalog-derived): +// * non-ord variant (Storage, Eq): `eql_v3.min/max()` must +// resolve to "function does not exist" (SQLSTATE 42883 / 42725). Pins that +// codegen correctly omits MIN/MAX wrappers for these variants. +// * ord-capable variant (Ord, OrdOre, Search, …): `eql_v3.min/max(...)` must +// RESOLVE — these variants declare min/max. +// Catalog-driven so a new ord-capable variant needs no macro change — a // SQL-level regression test complementing the codegen unit test. // ============================================================================ @@ -2865,27 +2869,21 @@ macro_rules! __scalar_matrix_aggregate_typecheck_outer { }; } -// Dispatch on variant ident: ord-capable variants (Ord, OrdOre, Search) emit -// no typecheck test — they DO declare min/max. Non-ord variants (Storage, -// Eq) emit one test per aggregate op asserting the call fails with -// SQLSTATE 42883. +// Emit one min + one max aggregate typecheck test for EVERY variant. The test +// body branches at RUNTIME on `spec.supports_ord()` (catalog-derived): +// +// * ord-capable variant -> assert `eql_v3.min/max(value)` RESOLVES and +// returns a value (these variants declare min/max). +// * non-ord variant -> assert the call is rejected with SQLSTATE 42883 +// (undefined_function) / 42725 (ambiguous_function). +// +// Previously the dispatch branched on the variant IDENT at macro-expansion time +// with empty arms for the ord-capable variants, so every new ord-capable +// variant had to remember to add an empty arm or the test silently did the +// wrong thing. Branching at runtime on the catalog removes that footgun. #[macro_export] #[doc(hidden)] macro_rules! __scalar_matrix_aggregate_typecheck_dispatch { - // Ord, OrdOre, Search: no typecheck test — these variants declare min/max. - ( - suite = $suite:ident, scalar = $scalar:ty, - dom_name = $dom_name:ident, variant = Ord $(,)? - ) => {}; - ( - suite = $suite:ident, scalar = $scalar:ty, - dom_name = $dom_name:ident, variant = OrdOre $(,)? - ) => {}; - ( - suite = $suite:ident, scalar = $scalar:ty, - dom_name = $dom_name:ident, variant = Search $(,)? - ) => {}; - // Storage, Eq: emit min + max typecheck tests. ( suite = $suite:ident, scalar = $scalar:ty, dom_name = $dom_name:ident, variant = $variant:ident $(,)? @@ -2928,38 +2926,53 @@ macro_rules! __scalar_matrix_aggregate_typecheck_case { "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{d})", )).bind(payload).execute(&mut *tx).await?; - // Savepoint-isolate the probe so the failed lookup - // doesn't abort the outer transaction and tx.commit() - // can succeed cleanly. - sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; let sql = format!( "SELECT eql_v3.{agg}(value) FROM typecheck_table", agg = $agg_fn, ); - let err = sqlx::query_scalar::<_, String>(&sql) - .fetch_one(&mut *tx) - .await - .expect_err(&format!( - "eql_v3.{} on non-ord variant {} must raise but succeeded", - $agg_fn, d, - )); - // 42883 = undefined_function (no overload defined at all); - // 42725 = ambiguous_function (multiple overloads resolve, - // none specific to this variant). Either confirms the - // variant carries no MIN/MAX of its own — the generic - // eql_v2_encrypted overload is reachable via cast but - // can't be resolved unambiguously from a domain-typed - // column. Both outcomes are acceptable "not supported". - let db_err = err.as_database_error() - .expect("expected database error from typecheck probe"); - let code = db_err.code(); - anyhow::ensure!( - code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), - "expected SQLSTATE 42883 (undefined_function) or 42725 \ + + // Catalog-derived runtime branch: ord-capable variants DECLARE + // min/max, non-ord variants must not. + if spec.supports_ord() { + // Ord-capable: eql_v3.min/max(value) must RESOLVE. + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + anyhow::ensure!( + res.is_ok(), + "eql_v3.{}({}) on ord-capable variant must resolve, got {:?}", + $agg_fn, d, res.err(), + ); + } else { + // Savepoint-isolate the probe so the failed lookup + // doesn't abort the outer transaction and tx.commit() + // can succeed cleanly. + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err(&format!( + "eql_v3.{} on non-ord variant {} must raise but succeeded", + $agg_fn, d, + )); + // 42883 = undefined_function (no overload defined at all); + // 42725 = ambiguous_function (multiple overloads resolve, + // none specific to this variant). Either confirms the + // variant carries no MIN/MAX of its own — the generic + // eql_v2_encrypted overload is reachable via cast but + // can't be resolved unambiguously from a domain-typed + // column. Both outcomes are acceptable "not supported". + let db_err = err.as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + anyhow::ensure!( + code.as_deref() == Some("42883") || code.as_deref() == Some("42725"), + "expected SQLSTATE 42883 (undefined_function) or 42725 \ (ambiguous_function) for eql_v3.{}({}), got {:?} (message: {})", - $agg_fn, d, code, db_err.message(), - ); - sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + $agg_fn, d, code, db_err.message(), + ); + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } tx.commit().await?; Ok(()) From befb34ed89bf900fe458d3794e5412d2051fc29b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 13 Jun 2026 19:39:04 +1000 Subject: [PATCH 191/599] test(matrix): derive index-engagement extractor from catalog, not literals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The index-engagement / scale-preference matrix combos hardcoded the functional-index extractor as a string literal ("eql_v3.eq_term" / "eql_v3.ord_term") restated per combo — a fact the catalog already owns via Term::extractor_for_operator. The [eq, ord, search] arm in particular hand-split `=` -> eq_term and `<` -> ord_term into separate combos with the extractor written out each time. Replace the per-combo $extractor literal with a runtime lookup: * index/scale combos now derive the extractor from the combo's ops via a new scalar_domains::combo_extractor(spec, ops) helper, which returns the single eql_v3-qualified extractor serving every op in the combo and ERRORS if the ops would need two extractors (one functional index cannot serve both) or if an op is unsupported. * the scale-default combo derives its extractor from the `=`-serving term (spec.extractor_for_op("=")) — ord_term for an [Ore] _ord domain, eq_term for a [Hm, Ore] text _ord domain. This deletes the redundant extractor literals from all three scalar_matrix! arms while keeping the combo TUPLES (which encode the name-bearing dom_name + op structure). The emitted test-name set is unchanged — matrix_tests*.txt inventory snapshots stay byte-identical and the int4 cargo-expand snapshot diff is body-only (no rustc_test_marker changes). The text arm's `=`/ord split into distinct _eqidx dom_names is RETAINED: text `=` routes through eq_term and `<` through ord_term, so one index cannot serve both — combo_extractor asserts exactly this, and three new catalog-resolution unit tests pin it (no DB needed). Steps 2-3 of the planned refactor (deriving `@>`/`<@` blocker/match EMISSION and unifying the caps arms) were deliberately NOT done: which blocker/match tests EXIST is name-bearing and fixed at macro-expansion time, while catalog terms are a runtime concept, so driving emission from the catalog would change the pinned test-name set. Removing the extractor literals (step 1) is the de-duplication that restated catalog truth without touching names. --- tests/sqlx/snapshots/int4_expanded.rs | 909 ++++++++++++++------------ tests/sqlx/src/matrix.rs | 100 ++- tests/sqlx/src/scalar_domains.rs | 77 +++ 3 files changed, 620 insertions(+), 466 deletions(-) diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/int4_expanded.rs index fae1faeca..1bd7d1322 100644 --- a/tests/sqlx/snapshots/int4_expanded.rs +++ b/tests/sqlx/snapshots/int4_expanded.rs @@ -9,9 +9,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 541usize, + start_line: 553usize, start_col: 26usize, - end_line: 541usize, + end_line: 553usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -86,9 +86,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 541usize, + start_line: 553usize, start_col: 26usize, - end_line: 541usize, + end_line: 553usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -163,9 +163,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 541usize, + start_line: 553usize, start_col: 26usize, - end_line: 541usize, + end_line: 553usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -240,9 +240,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 541usize, + start_line: 553usize, start_col: 26usize, - end_line: 541usize, + end_line: 553usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -319,9 +319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -418,9 +418,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -517,9 +517,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -616,9 +616,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -715,9 +715,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -814,9 +814,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -913,9 +913,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1012,9 +1012,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1111,9 +1111,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1210,9 +1210,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1309,9 +1309,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1408,9 +1408,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1507,9 +1507,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1606,9 +1606,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1705,9 +1705,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1804,9 +1804,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1903,9 +1903,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2002,9 +2002,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2101,9 +2101,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2200,9 +2200,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2299,9 +2299,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2398,9 +2398,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2497,9 +2497,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2596,9 +2596,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2695,9 +2695,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2794,9 +2794,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2893,9 +2893,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2992,9 +2992,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3091,9 +3091,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3190,9 +3190,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3289,9 +3289,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3388,9 +3388,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3487,9 +3487,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3586,9 +3586,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3685,9 +3685,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3784,9 +3784,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3883,9 +3883,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3982,9 +3982,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4081,9 +4081,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4180,9 +4180,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4279,9 +4279,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4378,9 +4378,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 677usize, + start_line: 689usize, start_col: 22usize, - end_line: 677usize, + end_line: 689usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4477,9 +4477,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4643,9 +4643,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4809,9 +4809,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4975,9 +4975,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5141,9 +5141,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5307,9 +5307,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5473,9 +5473,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5639,9 +5639,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5805,9 +5805,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5971,9 +5971,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6137,9 +6137,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6303,9 +6303,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6469,9 +6469,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6635,9 +6635,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6801,9 +6801,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6967,9 +6967,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7133,9 +7133,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7299,9 +7299,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7465,9 +7465,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7631,9 +7631,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7797,9 +7797,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7963,9 +7963,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8129,9 +8129,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8295,9 +8295,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8461,9 +8461,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8627,9 +8627,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8793,9 +8793,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8959,9 +8959,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9125,9 +9125,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9291,9 +9291,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9457,9 +9457,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9623,9 +9623,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9789,9 +9789,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9955,9 +9955,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10121,9 +10121,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10287,9 +10287,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10453,9 +10453,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10619,9 +10619,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10785,9 +10785,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10951,9 +10951,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11117,9 +11117,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11283,9 +11283,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 718usize, + start_line: 730usize, start_col: 22usize, - end_line: 718usize, + end_line: 730usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11449,9 +11449,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11542,9 +11542,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11635,9 +11635,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11728,9 +11728,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11821,9 +11821,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11914,9 +11914,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12007,9 +12007,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12100,9 +12100,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12193,9 +12193,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12286,9 +12286,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12379,9 +12379,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12472,9 +12472,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12565,9 +12565,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12658,9 +12658,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 770usize, + start_line: 782usize, start_col: 22usize, - end_line: 770usize, + end_line: 782usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12749,9 +12749,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -12884,9 +12884,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13019,9 +13019,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13154,9 +13154,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13289,9 +13289,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13424,9 +13424,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13561,9 +13561,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13698,9 +13698,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13833,9 +13833,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13966,9 +13966,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14099,9 +14099,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14232,9 +14232,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14365,9 +14365,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14502,9 +14502,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14639,9 +14639,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14776,9 +14776,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14913,9 +14913,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15050,9 +15050,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 834usize, + start_line: 846usize, start_col: 22usize, - end_line: 834usize, + end_line: 846usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15187,9 +15187,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 901usize, + start_line: 913usize, start_col: 22usize, - end_line: 901usize, + end_line: 913usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15327,9 +15327,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 901usize, + start_line: 913usize, start_col: 22usize, - end_line: 901usize, + end_line: 913usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15465,9 +15465,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 901usize, + start_line: 913usize, start_col: 22usize, - end_line: 901usize, + end_line: 913usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15607,9 +15607,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 901usize, + start_line: 913usize, start_col: 22usize, - end_line: 901usize, + end_line: 913usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15749,9 +15749,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 974usize, + start_line: 986usize, start_col: 22usize, - end_line: 974usize, + end_line: 986usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15850,9 +15850,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 974usize, + start_line: 986usize, start_col: 22usize, - end_line: 974usize, + end_line: 986usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15953,9 +15953,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 974usize, + start_line: 986usize, start_col: 22usize, - end_line: 974usize, + end_line: 986usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16056,9 +16056,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 974usize, + start_line: 986usize, start_col: 22usize, - end_line: 974usize, + end_line: 986usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16159,9 +16159,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1031usize, + start_line: 1043usize, start_col: 22usize, - end_line: 1031usize, + end_line: 1043usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16248,9 +16248,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1031usize, + start_line: 1043usize, start_col: 22usize, - end_line: 1031usize, + end_line: 1043usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16337,9 +16337,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1031usize, + start_line: 1043usize, start_col: 22usize, - end_line: 1031usize, + end_line: 1043usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16426,9 +16426,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1031usize, + start_line: 1043usize, start_col: 22usize, - end_line: 1031usize, + end_line: 1043usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16515,9 +16515,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1084usize, + start_line: 1096usize, start_col: 22usize, - end_line: 1084usize, + end_line: 1096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -16886,9 +16886,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1084usize, + start_line: 1096usize, start_col: 22usize, - end_line: 1084usize, + end_line: 1096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17187,9 +17187,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1084usize, + start_line: 1096usize, start_col: 22usize, - end_line: 1084usize, + end_line: 1096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17348,9 +17348,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1084usize, + start_line: 1096usize, start_col: 22usize, - end_line: 1084usize, + end_line: 1096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17509,9 +17509,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1165usize, + start_line: 1177usize, start_col: 22usize, - end_line: 1165usize, + end_line: 1177usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17673,9 +17673,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1165usize, + start_line: 1177usize, start_col: 22usize, - end_line: 1165usize, + end_line: 1177usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17837,9 +17837,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1165usize, + start_line: 1177usize, start_col: 22usize, - end_line: 1165usize, + end_line: 1177usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18001,9 +18001,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1165usize, + start_line: 1177usize, start_col: 22usize, - end_line: 1165usize, + end_line: 1177usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18165,9 +18165,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1165usize, + start_line: 1177usize, start_col: 22usize, - end_line: 1165usize, + end_line: 1177usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18329,9 +18329,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1918usize, + start_line: 1948usize, start_col: 22usize, - end_line: 1918usize, + end_line: 1948usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18351,6 +18351,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["="], + )?; let table = "matrix_int4_eq_idx_btree"; let index = "matrix_int4_eq_idx_btree_idx"; let fixture_table = ::fixture_table_name(); @@ -18389,7 +18393,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v3.eq_term", + extractor, index, table, ), @@ -18504,9 +18508,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1918usize, + start_line: 1948usize, start_col: 22usize, - end_line: 1918usize, + end_line: 1948usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18526,6 +18530,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["="], + )?; let table = "matrix_int4_eq_idx_hash"; let index = "matrix_int4_eq_idx_hash_idx"; let fixture_table = ::fixture_table_name(); @@ -18564,7 +18572,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "hash", - "eql_v3.eq_term", + extractor, index, table, ), @@ -18679,9 +18687,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1918usize, + start_line: 1948usize, start_col: 22usize, - end_line: 1918usize, + end_line: 1948usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18701,6 +18709,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["=", "<", "<=", ">", ">="], + )?; let table = "matrix_int4_ord_idx_btree"; let index = "matrix_int4_ord_idx_btree_idx"; let fixture_table = ::fixture_table_name(); @@ -18739,7 +18751,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v3.ord_term", + extractor, index, table, ), @@ -18974,9 +18986,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1918usize, + start_line: 1948usize, start_col: 22usize, - end_line: 1918usize, + end_line: 1948usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18996,6 +19008,10 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["=", "<", "<=", ">", ">="], + )?; let table = "matrix_int4_ord_ore_idx_btree"; let index = "matrix_int4_ord_ore_idx_btree_idx"; let fixture_table = ::fixture_table_name(); @@ -19034,7 +19050,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v3.ord_term", + extractor, index, table, ), @@ -19269,9 +19285,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1353usize, + start_line: 1370usize, start_col: 22usize, - end_line: 1353usize, + end_line: 1370usize, end_col: 86usize, compile_fail: false, no_run: false, @@ -19293,6 +19309,20 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; + let extractor = spec + .extractor_for_op("=") + .ok_or_else(|| { + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} declares no extractor for `=` but is wired as a scale-default combo", + &spec.sql_domain, + ), + ) + }), + ) + })?; let table = "matrix_int4_ord_scaledef_btree"; let index = "matrix_int4_ord_scaledef_btree_idx"; let values: &[i32] = ::fixture_values(); @@ -19364,7 +19394,7 @@ pub mod int4 { format_args!( "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", "btree", - "eql_v3.ord_term", + extractor, index, table, ), @@ -19394,7 +19424,14 @@ pub mod int4 { ) }), index, - "with seqscan ON the planner must PREFER the ord_term functional index for a selective =", + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "with seqscan ON the planner must PREFER the {0} functional index for a selective =", + extractor, + ), + ) + }), ) .await?; tx.commit().await?; @@ -19450,9 +19487,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1431usize, + start_line: 1461usize, start_col: 22usize, - end_line: 1431usize, + end_line: 1461usize, end_col: 55usize, compile_fail: false, no_run: false, @@ -19720,9 +19757,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1544usize, + start_line: 1574usize, start_col: 22usize, - end_line: 1544usize, + end_line: 1574usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19981,9 +20018,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1544usize, + start_line: 1574usize, start_col: 22usize, - end_line: 1544usize, + end_line: 1574usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -20242,9 +20279,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1855usize, + start_line: 1885usize, start_col: 22usize, - end_line: 1855usize, + end_line: 1885usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -20342,9 +20379,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2374usize, + start_line: 2414usize, start_col: 22usize, - end_line: 2374usize, + end_line: 2414usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -20506,9 +20543,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2432usize, + start_line: 2472usize, start_col: 22usize, - end_line: 2432usize, + end_line: 2472usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -20618,9 +20655,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2457usize, + start_line: 2497usize, start_col: 22usize, - end_line: 2457usize, + end_line: 2497usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -20717,9 +20754,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2483usize, + start_line: 2523usize, start_col: 22usize, - end_line: 2483usize, + end_line: 2523usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -20899,9 +20936,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2374usize, + start_line: 2414usize, start_col: 22usize, - end_line: 2374usize, + end_line: 2414usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21063,9 +21100,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2432usize, + start_line: 2472usize, start_col: 22usize, - end_line: 2432usize, + end_line: 2472usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21175,9 +21212,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2457usize, + start_line: 2497usize, start_col: 22usize, - end_line: 2457usize, + end_line: 2497usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21274,9 +21311,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2483usize, + start_line: 2523usize, start_col: 22usize, - end_line: 2483usize, + end_line: 2523usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21458,9 +21495,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2374usize, + start_line: 2414usize, start_col: 22usize, - end_line: 2374usize, + end_line: 2414usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21622,9 +21659,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2432usize, + start_line: 2472usize, start_col: 22usize, - end_line: 2432usize, + end_line: 2472usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21734,9 +21771,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2457usize, + start_line: 2497usize, start_col: 22usize, - end_line: 2457usize, + end_line: 2497usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21833,9 +21870,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2483usize, + start_line: 2523usize, start_col: 22usize, - end_line: 2483usize, + end_line: 2523usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22017,9 +22054,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2374usize, + start_line: 2414usize, start_col: 22usize, - end_line: 2374usize, + end_line: 2414usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -22181,9 +22218,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2432usize, + start_line: 2472usize, start_col: 22usize, - end_line: 2432usize, + end_line: 2472usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -22293,9 +22330,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2457usize, + start_line: 2497usize, start_col: 22usize, - end_line: 2457usize, + end_line: 2497usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22392,9 +22429,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2483usize, + start_line: 2523usize, start_col: 22usize, - end_line: 2483usize, + end_line: 2523usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22576,9 +22613,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2663usize, + start_line: 2703usize, start_col: 22usize, - end_line: 2663usize, + end_line: 2703usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -22822,9 +22859,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2663usize, + start_line: 2703usize, start_col: 22usize, - end_line: 2663usize, + end_line: 2703usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23068,9 +23105,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2663usize, + start_line: 2703usize, start_col: 22usize, - end_line: 2663usize, + end_line: 2703usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23314,9 +23351,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2663usize, + start_line: 2703usize, start_col: 22usize, - end_line: 2663usize, + end_line: 2703usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23560,9 +23597,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2578usize, + start_line: 2618usize, start_col: 22usize, - end_line: 2578usize, + end_line: 2618usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23669,9 +23706,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2578usize, + start_line: 2618usize, start_col: 22usize, - end_line: 2578usize, + end_line: 2618usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23778,9 +23815,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23946,9 +23983,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24114,9 +24151,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24282,9 +24319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24450,9 +24487,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24618,9 +24655,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24786,9 +24823,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24954,9 +24991,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2821usize, + start_line: 2861usize, start_col: 22usize, - end_line: 2821usize, + end_line: 2861usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25122,9 +25159,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2937usize, + start_line: 2977usize, start_col: 22usize, - end_line: 2937usize, + end_line: 2977usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25250,9 +25287,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 3010usize, start_col: 22usize, - end_line: 2970usize, + end_line: 3010usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25354,9 +25391,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2937usize, + start_line: 2977usize, start_col: 22usize, - end_line: 2937usize, + end_line: 2977usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25480,9 +25517,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 3010usize, start_col: 22usize, - end_line: 2970usize, + end_line: 3010usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25584,9 +25621,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3014usize, + start_line: 3054usize, start_col: 22usize, - end_line: 3014usize, + end_line: 3054usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -25724,9 +25761,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2937usize, + start_line: 2977usize, start_col: 22usize, - end_line: 2937usize, + end_line: 2977usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25850,9 +25887,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 3010usize, start_col: 22usize, - end_line: 2970usize, + end_line: 3010usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25954,9 +25991,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3014usize, + start_line: 3054usize, start_col: 22usize, - end_line: 3014usize, + end_line: 3054usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -26094,9 +26131,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2937usize, + start_line: 2977usize, start_col: 22usize, - end_line: 2937usize, + end_line: 2977usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -26222,9 +26259,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 3010usize, start_col: 22usize, - end_line: 2970usize, + end_line: 3010usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -26326,9 +26363,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3014usize, + start_line: 3054usize, start_col: 22usize, - end_line: 3014usize, + end_line: 3054usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -26466,9 +26503,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26601,9 +26638,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26736,9 +26773,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26871,9 +26908,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27006,9 +27043,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27141,9 +27178,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27276,9 +27313,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27411,9 +27448,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2056usize, + start_line: 2096usize, start_col: 22usize, - end_line: 2056usize, + end_line: 2096usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27546,9 +27583,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27722,9 +27759,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27898,9 +27935,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28074,9 +28111,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28250,9 +28287,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28426,9 +28463,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28602,9 +28639,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28778,9 +28815,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2167usize, + start_line: 2207usize, start_col: 22usize, - end_line: 2167usize, + end_line: 2207usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28954,9 +28991,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29057,9 +29094,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29160,9 +29197,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29263,9 +29300,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29366,9 +29403,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29469,9 +29506,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29572,9 +29609,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29675,9 +29712,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2284usize, + start_line: 2324usize, start_col: 22usize, - end_line: 2284usize, + end_line: 2324usize, end_col: 87usize, compile_fail: false, no_run: false, diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index e7fd94a9c..a4682abc2 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -195,12 +195,17 @@ macro_rules! scalar_matrix { ], eq_ops = [(eq, "="), (neq, "<>")], ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + // The extractor per combo is NOT restated here — it is derived at + // runtime from the combo's ops via `Variant::extractor_for_op` + // (the same `Term::extractor_for_operator` codegen uses). Every op + // in one combo must share a single extractor (one functional index + // serves them all); `combo_extractor` asserts that. index_combos = [ - (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), - (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), - (ord, Ord, "eql_v3.ord_term", "btree", + (eq, Eq, "btree", [(eq, "=")]), + (eq, Eq, "hash", [(eq, "=")]), + (ord, Ord, "btree", [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), - (ord_ore, OrdOre, "eql_v3.ord_term", "btree", + (ord_ore, OrdOre, "btree", [(eq, "="), (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), ], blocker_combos = [ @@ -217,10 +222,10 @@ macro_rules! scalar_matrix { (ord_ore, OrdOre, [(contains, "@>"), (contained_by, "<@")]), ], // Always-on cost-preference proof (#239 thread 17): the recommended - // converged ordered domain, ord_term btree. One curated combo keeps - // PR CI cost bounded. + // converged ordered domain, btree. One curated combo keeps PR CI + // cost bounded. The extractor (`=`-serving) is derived at runtime. scale_default_combos = [ - (ord, Ord, "eql_v3.ord_term", "btree"), + (ord, Ord, "btree"), ], // No bloom-match domain on a pure ordered scalar (int/date). match_domains = [], @@ -255,21 +260,25 @@ macro_rules! scalar_matrix { eq_ops = [(eq, "="), (neq, "<>")], ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], // Equality on every text domain routes through `eq_term` (exact hm), - // never ORE — so the `=` index proof targets `eql_v3.eq_term`, split - // into its own combo (distinct dom_name) from the ordering ops, which - // target `eql_v3.ord_term`. The `_search` domain gets both. + // never ORE, while the ordering ops route through `ord_term`. Because + // a single functional index serves one extractor, the `=` proof is + // SPLIT into its own combo (distinct `_eqidx` dom_name) from the + // ordering ops — they cannot share an index. The extractor itself is + // NOT restated; `combo_extractor` derives it from each combo's ops at + // runtime (and asserts the combo is single-extractor). The `_search` + // domain gets both an ordering combo and an `_eqidx` combo. index_combos = [ - (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), - (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), - (ord, Ord, "eql_v3.ord_term", "btree", + (eq, Eq, "btree", [(eq, "=")]), + (eq, Eq, "hash", [(eq, "=")]), + (ord, Ord, "btree", [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), - (ord_eqidx, Ord, "eql_v3.eq_term", "btree", [(eq, "=")]), - (ord_ore, OrdOre, "eql_v3.ord_term", "btree", + (ord_eqidx, Ord, "btree", [(eq, "=")]), + (ord_ore, OrdOre, "btree", [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), - (ord_ore_eqidx, OrdOre, "eql_v3.eq_term", "btree", [(eq, "=")]), - (search, Search, "eql_v3.ord_term", "btree", + (ord_ore_eqidx, OrdOre, "btree", [(eq, "=")]), + (search, Search, "btree", [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")]), - (search_eqidx, Search, "eql_v3.eq_term", "btree", [(eq, "=")]), + (search_eqidx, Search, "btree", [(eq, "=")]), ], blocker_combos = [ (storage, Storage, [ @@ -288,9 +297,10 @@ macro_rules! scalar_matrix { (ord_ore, OrdOre, [(contains, "@>"), (contained_by, "<@")]), ], // Selective `=` on a text ordered domain prefers the `eq_term` - // functional index (equality is hm-exact), not ord_term. + // functional index (equality is hm-exact), not ord_term — derived at + // runtime from the `=`-serving extractor. scale_default_combos = [ - (ord, Ord, "eql_v3.eq_term", "btree"), + (ord, Ord, "btree"), ], // `_search` carries the Bloom term: prove `@>`/`<@` containment // behaviour + GIN index engagement through the matrix. @@ -325,9 +335,11 @@ macro_rules! scalar_matrix { ], eq_ops = [(eq, "="), (neq, "<>")], ord_ops = [(lt, "<"), (lte, "<="), (gt, ">"), (gte, ">=")], + // Extractor derived at runtime from each combo's ops; see the + // `caps = [eq, ord]` arm. index_combos = [ - (eq, Eq, "eql_v3.eq_term", "btree", [(eq, "=")]), - (eq, Eq, "eql_v3.eq_term", "hash", [(eq, "=")]), + (eq, Eq, "btree", [(eq, "=")]), + (eq, Eq, "hash", [(eq, "=")]), ], blocker_combos = [ (storage, Storage, [ @@ -1330,7 +1342,7 @@ macro_rules! __scalar_matrix_scale_case { suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, combo = ( $dom_name:ident, $variant:ident, - $extractor:literal, $using:literal, + $using:literal, [$(($op_name:ident, $op:literal)),+ $(,)?] $(,)? ) $(,)? ) => { @@ -1343,6 +1355,11 @@ macro_rules! __scalar_matrix_scale_case { use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; + // Catalog-derived extractor for this combo's ops; see + // __scalar_matrix_index_case. + let extractor = $crate::scalar_domains::combo_extractor( + &spec, &[$($op),+], + )?; let table = concat!( "matrix_", stringify!($suite), "_", stringify!($dom_name), "_scale_", $using, @@ -1374,7 +1391,7 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", "INSERT INTO {table}(value) VALUES ($1::jsonb::{d})", )).bind(&pivot_payload).execute(&mut *tx).await?; sqlx::query(&format!( - "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = $extractor, + "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = extractor, )).execute(&mut *tx).await?; sqlx::query(&format!("ANALYZE {table}")) .execute(&mut *tx).await?; @@ -1386,7 +1403,7 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", index, &format!( "with seqscan enabled the planner must prefer the {extractor} {using} index for a selective =", - extractor = $extractor, using = $using, + extractor = extractor, using = $using, ), ).await?; @@ -1431,7 +1448,7 @@ macro_rules! __scalar_matrix_scale_default_outer { macro_rules! __scalar_matrix_scale_default_case { ( suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, - combo = ($dom_name:ident, $variant:ident, $extractor:literal, $using:literal) $(,)? + combo = ($dom_name:ident, $variant:ident, $using:literal) $(,)? ) => { $crate::paste::paste! { #[sqlx::test(fixtures(path = $script_path, scripts($script)))] @@ -1441,6 +1458,16 @@ macro_rules! __scalar_matrix_scale_default_case { use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; + // Catalog-derived: the scale-default proof exercises a selective + // `=`, so the preferred functional index is the one serving `=` + // (`eql_v3.ord_term` for an [Ore] _ord domain, `eql_v3.eq_term` + // for a [Hm, Ore] text _ord domain). Same source codegen uses. + let extractor = spec.extractor_for_op("=").ok_or_else(|| { + anyhow::anyhow!( + "{} declares no extractor for `=` but is wired as a \ +scale-default combo", &spec.sql_domain, + ) + })?; let table = concat!( "matrix_", stringify!($suite), "_", stringify!($dom_name), "_scaledef_", $using, @@ -1472,7 +1499,7 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", "INSERT INTO {table}(value) VALUES ($1::jsonb::{d})", )).bind(&pivot_payload).execute(&mut *tx).await?; sqlx::query(&format!( - "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = $extractor, + "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = extractor, )).execute(&mut *tx).await?; sqlx::query(&format!("ANALYZE {table}")) .execute(&mut *tx).await?; @@ -1485,7 +1512,10 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", &mut *tx, &format!("SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}"), index, - "with seqscan ON the planner must PREFER the ord_term functional index for a selective =", + &format!( + "with seqscan ON the planner must PREFER the {extractor} \ +functional index for a selective =", + ), ).await?; tx.commit().await?; @@ -1994,7 +2024,7 @@ macro_rules! __scalar_matrix_index_case { suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, combo = ( $dom_name:ident, $variant:ident, - $extractor:literal, $using:literal, + $using:literal, [$(($op_name:ident, $op:literal)),+ $(,)?] $(,)? ) $(,)? ) => { @@ -2004,6 +2034,16 @@ macro_rules! __scalar_matrix_index_case { pool: sqlx::PgPool, ) -> anyhow::Result<()> { let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + // Catalog-derived: the extractor serving this combo's operators + // (the SAME `Term::extractor_for_operator` codegen uses). Every + // op in a single combo shares one extractor (one functional + // index serves them all); assert that here so a future combo + // that mixes eq + ord ops in one tuple — which would need two + // indexes — fails loudly instead of silently indexing only the + // first op's extractor. + let extractor = $crate::scalar_domains::combo_extractor( + &spec, &[$($op),+], + )?; let table = concat!( "matrix_", stringify!($suite), "_", stringify!($dom_name), "_idx_", $using, @@ -2026,7 +2066,7 @@ macro_rules! __scalar_matrix_index_case { SELECT plaintext, ({col})::{d} FROM {fixture}", col = &spec.column_expr, d = &spec.sql_domain, fixture = fixture_table, )).execute(&mut *tx).await?; sqlx::query(&format!( - "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = $extractor, + "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = extractor, )).execute(&mut *tx).await?; sqlx::query(&format!("ANALYZE {table}")) .execute(&mut *tx).await?; diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index d98a6fc08..8d544e25d 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -727,6 +727,42 @@ impl ScalarDomainSpec { } } +/// The single `eql_v3`-qualified extractor that serves EVERY operator in +/// `ops` for `spec`'s domain — the value codegen would put in a functional +/// index for this combo. Catalog-derived via [`ScalarDomainSpec::extractor_for_op`] +/// (i.e. `Term::extractor_for_operator`), so the index-engagement matrix never +/// restates the extractor as a literal. +/// +/// A single functional index serves one extractor, so the matrix combos that +/// drive these tests group only operators that share an extractor. This asserts +/// that invariant: if `ops` mix extractors (e.g. text's `=` -> `eq_term` and +/// `<` -> `ord_term` in one combo) it errors loudly rather than silently +/// indexing only the first op's extractor. An op the domain does not support at +/// all is likewise an error. +pub fn combo_extractor(spec: &ScalarDomainSpec, ops: &[&str]) -> Result { + let mut chosen: Option = None; + for &op in ops { + let ex = spec.extractor_for_op(op).ok_or_else(|| { + anyhow::anyhow!( + "{} declares no extractor for `{}` but it is wired as an \ +index-engagement combo op", + spec.sql_domain, op, + ) + })?; + match &chosen { + None => chosen = Some(ex), + Some(prev) if *prev != ex => bail!( + "combo for {} mixes extractors ({prev} for an earlier op, {ex} \ +for `{op}`) — one functional index cannot serve both; split into separate \ +combos with distinct dom_names", + spec.sql_domain, + ), + Some(_) => {} + } + } + chosen.ok_or_else(|| anyhow::anyhow!("combo for {} has no ops", spec.sql_domain)) +} + /// True when scalar `token` declares any domain carrying the `Bloom` term — /// i.e. its proxy-generated fixture payload includes a `bf` (bloom-filter) key. /// Catalog-derived: only `text` (via `_match`/`_search`) declares a Bloom @@ -975,4 +1011,45 @@ mod catalog_resolution_tests { } } } + + // `combo_extractor` replaced the hand-written extractor literals in the + // index-engagement matrix combos; these pin the catalog-derived results the + // matrix now relies on (no DB needed). + + #[test] + fn combo_extractor_int4_ord_serves_all_ops_via_ord_term() { + // int4 `_ord` = [Ore]: every op (eq + the four ord ops) resolves to the + // single ord_term extractor, so the combo is single-extractor. + let spec = ScalarDomainSpec::new::(Variant::Ord); + assert_eq!( + combo_extractor(&spec, &["=", "<", "<=", ">", ">="]).unwrap(), + "eql_v3.ord_term", + ); + } + + #[test] + fn combo_extractor_text_ord_splits_eq_from_ord() { + // text `_ord` = [Hm, Ore]: `=` routes through eq_term, the ord ops + // through ord_term. A single index cannot serve both, so each must be + // its own combo — proven here by `=`-only and ord-only succeeding while + // a mixed combo errors. + let spec = ScalarDomainSpec::new::(Variant::Ord); + assert_eq!(combo_extractor(&spec, &["="]).unwrap(), "eql_v3.eq_term"); + assert_eq!( + combo_extractor(&spec, &["<", "<=", ">", ">="]).unwrap(), + "eql_v3.ord_term", + ); + let mixed = combo_extractor(&spec, &["=", "<"]); + assert!( + mixed.is_err(), + "a combo mixing eq + ord ops on text _ord must error (two extractors)", + ); + } + + #[test] + fn combo_extractor_errors_on_unsupported_op() { + // `@>` is not served by any extractor on int4 `_eq` ([Hm]). + let spec = ScalarDomainSpec::new::(Variant::Eq); + assert!(combo_extractor(&spec, &["@>"]).is_err()); + } } From 916fc88c3e533c750e2fc4e9f487a0893158cc53 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 15 Jun 2026 09:55:46 +1000 Subject: [PATCH 192/599] test(scalars): cover has_search classifier + MatchScalar fixture invariant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a direct unit test for the has_search_token catalog classifier (text true; int4/date false) rather than only exercising it via codegen output, and a text_value_tests assertion that MatchScalar's haystack/needle/disjoint plaintexts are each present verbatim in fixture_values() — the invariant fetch_fixture_payload relies on, so a fixture change that drops one fails here instead of at query time. --- crates/eql-tests-macros/src/lib.rs | 11 +++++++++++ tests/sqlx/src/scalar_domains.rs | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 771f55391..aba3ebaa6 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -480,6 +480,17 @@ mod tests { assert!(!is_text_token("date")); } + #[test] + fn has_search_is_read_from_catalog() { + // The `_search` capability is read from the catalog row's declared + // domains, never from a `[marker]` on the dispatch entry. Only `text` + // declares a combined `_search` domain today; ordered/eq-only scalars + // do not, so they must route to the non-search arm. + assert!(has_search_token("text")); + assert!(!has_search_token("int4")); + assert!(!has_search_token("date")); + } + #[test] fn text_entry_skips_impl_and_stamps_text_fixture() { // No marker: `text`'s shape is read from eql-scalars::CATALOG. diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 8d544e25d..7cedada6f 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -508,6 +508,31 @@ mod text_value_tests { ); } + /// The `MatchScalar` haystack/needle/disjoint plaintexts must each be a + /// fixture row present verbatim, so `fetch_fixture_payload` can resolve each + /// one's ciphertext when the `_search`/`_match` arms run. The doc comments on + /// the trait promise this invariant; pin it so a fixture change that drops one + /// of the three fails here instead of at query time. + #[test] + fn text_match_pivots_are_in_fixture_values() { + let values = ::fixture_values(); + let haystack = ::haystack(); + let needle = ::needle(); + let disjoint = ::disjoint(); + assert!( + values.contains(&haystack), + "haystack {haystack:?} must be a fixture" + ); + assert!( + values.contains(&needle), + "needle {needle:?} must be a fixture" + ); + assert!( + values.contains(&disjoint), + "disjoint {disjoint:?} must be a fixture" + ); + } + /// The harness value list matches the catalog `TEXT_VALUES` in order — the /// oracle cannot drift from the catalog the fixture generator encrypts. #[test] From 0c7cb3cfa2c8efb7d2a7ca6ee7104c51739fde2e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 15 Jun 2026 09:55:46 +1000 Subject: [PATCH 193/599] chore: union-merge CHANGELOG.md to avoid [Unreleased] conflicts Every user-facing PR appends under [Unreleased], so concurrent branches conflict on the same region constantly. merge=union keeps both sides' added lines; order/dedupe is tidied by hand at release time. --- .gitattributes | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitattributes b/.gitattributes index b132fa9e2..694175c85 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,3 +15,9 @@ tests/codegen/reference/**/*.sql linguist-generated tests/sqlx/snapshots/*_expanded.rs linguist-generated tests/sqlx/snapshots/matrix_tests*.txt linguist-generated + +# Append-only changelog: every user-facing PR adds an entry under `[Unreleased]`, +# so concurrent branches conflict on the same region constantly. `merge=union` +# keeps BOTH sides' added lines instead of raising a conflict. Order/dedupe is +# tidied by hand at release time, when `[Unreleased]` is cut into a version. +CHANGELOG.md merge=union From 27c697f2d5c6121acff1e570b137906071ba153d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 15 Jun 2026 10:24:56 +1000 Subject: [PATCH 194/599] style(tests): rustfmt combo_extractor anyhow args --- tests/sqlx/src/scalar_domains.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 7cedada6f..16e5a088a 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -771,7 +771,8 @@ pub fn combo_extractor(spec: &ScalarDomainSpec, ops: &[&str]) -> Result anyhow::anyhow!( "{} declares no extractor for `{}` but it is wired as an \ index-engagement combo op", - spec.sql_domain, op, + spec.sql_domain, + op, ) })?; match &chosen { From 2c523b649ab131a6a07f496f830cbc4d37cba267 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 16 Jun 2026 12:09:54 +1000 Subject: [PATCH 195/599] fix(eql-types): mirror text_search + hm-routed ordered text in v3 registry The eql-types crate (from the dan/eql-types-crate merge on eql_v3) was written when text ordered domains were [Ore]-only and there was no text_search domain. This branch routes text equality through hm ([Hm, Ore] for text_ord/_ord_ore) and adds text_search [Hm, Ore, Bloom], so the rebase left v3::all() out of sync with eql-scalars::CATALOG (catalog_parity's inventory_exactly_covers_catalog failed on the missing text_search domain). - Add TextSearch (hm + ob + bf) and register it in v3::all(). - Add hm to TextOrd/TextOrdOre so the Rust types match the SQL domain CHECK (text routes = / <> through hm, unlike the [Ore]-only int domains); a TextOrd without hm could not deserialize a real text_ord payload. - Update the v3_conformance round-trip sweep with text-specific ord/search wire builders and a text_search arm. - Refresh a stale matrix.rs comment referencing the removed Variant::required_term(). --- crates/eql-types/src/v3/mod.rs | 1 + crates/eql-types/src/v3/text.rs | 46 +++++++++++++++++++++--- crates/eql-types/tests/v3_conformance.rs | 12 +++++-- tests/sqlx/src/matrix.rs | 6 ++-- 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 972627785..316f53e71 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -135,5 +135,6 @@ pub fn all() -> Vec> { Box::new(PhantomData::), Box::new(PhantomData::), Box::new(PhantomData::), + Box::new(PhantomData::), ] } diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index 9e11fc4d1..ed905ca2a 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -81,7 +81,9 @@ impl DomainType for TextMatch { } /// `eql_v3.text_ord_ore` — full lexicographic comparison, -/// scheme-explicit name. +/// scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), +/// text routes equality through `hm` rather than the ORE term, so the domain +/// carries both `hm` and `ob` (`[Hm, Ore]`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextOrdOre { @@ -92,7 +94,9 @@ pub struct TextOrdOre { pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. + /// HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. + pub hm: Hmac256, + /// Block-ORE order term. pub ob: OreBlockU64_8_256, } @@ -107,7 +111,8 @@ impl DomainType for TextOrdOre { } /// `eql_v3.text_ord` — full lexicographic comparison -/// (`=` `<>` `<` `<=` `>` `>=`). +/// (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` +/// (ordering) — text routes equality through `hm` (`[Hm, Ore]`). #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct TextOrd { @@ -118,7 +123,9 @@ pub struct TextOrd { pub i: Identifier, /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. + /// HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. + pub hm: Hmac256, + /// Block-ORE order term. pub ob: OreBlockU64_8_256, } @@ -131,3 +138,34 @@ impl DomainType for TextOrd { Self::sql_domain_static() } } + +/// `eql_v3.text_search` — the full text search surface: HMAC equality, ORE +/// ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The +/// superset domain combining `_eq`, `_ord`, and `_match`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct TextSearch { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// HMAC-SHA-256 equality term. + pub hm: Hmac256, + /// Block-ORE order term. + pub ob: OreBlockU64_8_256, + /// Bloom-filter match term (signed smallint bit positions). + pub bf: BloomFilter, +} + +impl DomainType for TextSearch { + fn sql_domain_static() -> &'static str { + "eql_v3.text_search" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } +} diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index d8eecb548..d6c7e1fbe 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -174,6 +174,13 @@ fn non_int4_tokens_round_trip_every_domain() { let storage = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct" }); let eq = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef" }); let ord = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "ob": ["b0", "b1"] }); + // Text routes equality through `hm`, so its ordered domains carry both `hm` + // and `ob` (`[Hm, Ore]`); `text_search` adds the Bloom-filter match term. + let text_ord = + |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef", "ob": ["b0", "b1"] }); + let text_search = |t: &str| { + json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef", "ob": ["b0", "b1"], "bf": [1, 2, 3] }) + }; // Roundtrip a payload byte-for-byte, then confirm the catalog domain name. macro_rules! round_trip { @@ -203,8 +210,9 @@ fn non_int4_tokens_round_trip_every_domain() { // text_match is covered by `text_match_round_trips_signed_bloom_filter`. round_trip!(Text, storage("a"), "eql_v3.text"); round_trip!(TextEq, eq("a"), "eql_v3.text_eq"); - round_trip!(TextOrd, ord("a"), "eql_v3.text_ord"); - round_trip!(TextOrdOre, ord("a"), "eql_v3.text_ord_ore"); + round_trip!(TextOrd, text_ord("a"), "eql_v3.text_ord"); + round_trip!(TextOrdOre, text_ord("a"), "eql_v3.text_ord_ore"); + round_trip!(TextSearch, text_search("a"), "eql_v3.text_search"); } #[test] diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index a4682abc2..45a1bb027 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -965,9 +965,9 @@ macro_rules! __scalar_matrix_blocker_case { // ============================================================================ // Payload-check category — per variant, the domain CHECK rejects payloads -// missing required keys (envelope `v`/`i`/`c` plus `Variant::required_term()`) -// and rejects non-object payloads. Required keys are derived from -// `Variant::payload_required_keys()` so future variants pick up coverage. +// missing required keys (envelope `v`/`i`/`c` plus each term's key) and +// rejects non-object payloads. Required keys are derived from +// `Variant::payload_required_keys(token)` so future variants pick up coverage. // ============================================================================ #[macro_export] From 9ed8c8b75bc03f92b3790c75d0488c68715fc98b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 16 Jun 2026 13:09:14 +1000 Subject: [PATCH 196/599] style(tests): rustfmt v3_conformance text_ord/text_search closures --- crates/eql-types/tests/v3_conformance.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index d6c7e1fbe..a20e6e997 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -176,11 +176,8 @@ fn non_int4_tokens_round_trip_every_domain() { let ord = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "ob": ["b0", "b1"] }); // Text routes equality through `hm`, so its ordered domains carry both `hm` // and `ob` (`[Hm, Ore]`); `text_search` adds the Bloom-filter match term. - let text_ord = - |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef", "ob": ["b0", "b1"] }); - let text_search = |t: &str| { - json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef", "ob": ["b0", "b1"], "bf": [1, 2, 3] }) - }; + let text_ord = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef", "ob": ["b0", "b1"] }); + let text_search = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct", "hm": "deadbeef", "ob": ["b0", "b1"], "bf": [1, 2, 3] }); // Roundtrip a payload byte-for-byte, then confirm the catalog domain name. macro_rules! round_trip { From 0362eb26059140ed3233e3d923481d9be3a60eb5 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Wed, 10 Jun 2026 21:03:36 +1000 Subject: [PATCH 197/599] feat(eql-types): generate TypeScript bindings via ts-rs Stacks on the Rust-only eql-types crate. Every v3 domain type, the term newtypes, and Identifier gain a TS derive with bindings to crates/eql-types/bindings/v3/ (28 files, checked in). Term newtypes export as named TS aliases (export type Hmac256 = string) that every domain binding imports. mise types:generate clean-regenerates the bindings; types:check regenerates and fails on any diff or untracked output, wired into the rust-crates CI job as a freshness gate. --- .github/workflows/test-eql.yml | 7 +++ Cargo.lock | 34 ++++++++++++++ crates/eql-types/Cargo.toml | 3 +- crates/eql-types/README.md | 16 ++++--- crates/eql-types/bindings/v3/BloomFilter.ts | 11 +++++ crates/eql-types/bindings/v3/Ciphertext.ts | 8 ++++ crates/eql-types/bindings/v3/Date.ts | 22 +++++++++ crates/eql-types/bindings/v3/DateEq.ts | 27 +++++++++++ crates/eql-types/bindings/v3/DateOrd.ts | 27 +++++++++++ crates/eql-types/bindings/v3/DateOrdOre.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Hmac256.ts | 7 +++ crates/eql-types/bindings/v3/Identifier.ts | 16 +++++++ crates/eql-types/bindings/v3/Int2.ts | 22 +++++++++ crates/eql-types/bindings/v3/Int2Eq.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Int2Ord.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Int2OrdOre.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Int4.ts | 22 +++++++++ crates/eql-types/bindings/v3/Int4Eq.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Int4Ord.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Int4OrdOre.ts | 29 ++++++++++++ crates/eql-types/bindings/v3/Int8.ts | 22 +++++++++ crates/eql-types/bindings/v3/Int8Eq.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Int8Ord.ts | 27 +++++++++++ crates/eql-types/bindings/v3/Int8OrdOre.ts | 27 +++++++++++ .../bindings/v3/OreBlockU64_8_256.ts | 9 ++++ crates/eql-types/bindings/v3/SchemaVersion.ts | 12 +++++ crates/eql-types/bindings/v3/Text.ts | 22 +++++++++ crates/eql-types/bindings/v3/TextEq.ts | 27 +++++++++++ crates/eql-types/bindings/v3/TextMatch.ts | 27 +++++++++++ crates/eql-types/bindings/v3/TextOrd.ts | 34 ++++++++++++++ crates/eql-types/bindings/v3/TextOrdOre.ts | 35 ++++++++++++++ crates/eql-types/bindings/v3/TextSearch.ts | 39 +++++++++++++++ crates/eql-types/bindings/v3/Timestamptz.ts | 22 +++++++++ crates/eql-types/bindings/v3/TimestamptzEq.ts | 27 +++++++++++ crates/eql-types/src/lib.rs | 18 +++++-- crates/eql-types/src/v3/date.rs | 13 +++-- crates/eql-types/src/v3/int2.rs | 13 +++-- crates/eql-types/src/v3/int4.rs | 13 +++-- crates/eql-types/src/v3/int8.rs | 13 +++-- crates/eql-types/src/v3/terms.rs | 20 +++++--- crates/eql-types/src/v3/text.rs | 19 +++++--- crates/eql-types/src/v3/timestamptz.rs | 7 ++- mise.toml | 47 ++++++++++++++++++- 43 files changed, 888 insertions(+), 45 deletions(-) create mode 100644 crates/eql-types/bindings/v3/BloomFilter.ts create mode 100644 crates/eql-types/bindings/v3/Ciphertext.ts create mode 100644 crates/eql-types/bindings/v3/Date.ts create mode 100644 crates/eql-types/bindings/v3/DateEq.ts create mode 100644 crates/eql-types/bindings/v3/DateOrd.ts create mode 100644 crates/eql-types/bindings/v3/DateOrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Hmac256.ts create mode 100644 crates/eql-types/bindings/v3/Identifier.ts create mode 100644 crates/eql-types/bindings/v3/Int2.ts create mode 100644 crates/eql-types/bindings/v3/Int2Eq.ts create mode 100644 crates/eql-types/bindings/v3/Int2Ord.ts create mode 100644 crates/eql-types/bindings/v3/Int2OrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Int4.ts create mode 100644 crates/eql-types/bindings/v3/Int4Eq.ts create mode 100644 crates/eql-types/bindings/v3/Int4Ord.ts create mode 100644 crates/eql-types/bindings/v3/Int4OrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Int8.ts create mode 100644 crates/eql-types/bindings/v3/Int8Eq.ts create mode 100644 crates/eql-types/bindings/v3/Int8Ord.ts create mode 100644 crates/eql-types/bindings/v3/Int8OrdOre.ts create mode 100644 crates/eql-types/bindings/v3/OreBlockU64_8_256.ts create mode 100644 crates/eql-types/bindings/v3/SchemaVersion.ts create mode 100644 crates/eql-types/bindings/v3/Text.ts create mode 100644 crates/eql-types/bindings/v3/TextEq.ts create mode 100644 crates/eql-types/bindings/v3/TextMatch.ts create mode 100644 crates/eql-types/bindings/v3/TextOrd.ts create mode 100644 crates/eql-types/bindings/v3/TextOrdOre.ts create mode 100644 crates/eql-types/bindings/v3/TextSearch.ts create mode 100644 crates/eql-types/bindings/v3/Timestamptz.ts create mode 100644 crates/eql-types/bindings/v3/TimestamptzEq.ts diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index ecb24e4d7..151b049d5 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -319,6 +319,13 @@ jobs: rustup component add --toolchain ${active_rust_toolchain} rustfmt clippy mise run test:crates + # Freshness gate for the eql-types codegen output: regenerate the + # TypeScript bindings and fail if the checked-in copies differ. + # Reuses the toolchain from the step above. + - name: Verify eql-types bindings are fresh + run: | + mise run types:check + codegen: name: "Encrypted-domain codegen" needs: [changes] diff --git a/Cargo.lock b/Cargo.lock index dd9a5f47a..3d11116e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1186,6 +1186,7 @@ dependencies = [ "eql-scalars", "serde", "serde_json", + "ts-rs", ] [[package]] @@ -3992,6 +3993,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "terminal_size" version = "0.4.4" @@ -4329,6 +4339,30 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ts-rs" +version = "10.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" +dependencies = [ + "lazy_static", + "serde_json", + "thiserror 2.0.18", + "ts-rs-macros", +] + +[[package]] +name = "ts-rs-macros" +version = "10.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "termcolor", +] + [[package]] name = "typenum" version = "1.20.0" diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml index d01b6a0a8..15768b75e 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-types/Cargo.toml @@ -2,10 +2,11 @@ name = "eql-types" version = "0.1.0" edition = "2021" -description = "Canonical wire types for EQL payloads — the single Rust source of truth (TypeScript bindings and JSON Schemas are generated from these types in stacked changes)." +description = "Canonical wire types for EQL payloads — the single Rust source of truth, with generated TypeScript bindings (JSON Schemas are generated from these types in a stacked change)." [dependencies] serde = { version = "1", features = ["derive"] } +ts-rs = { version = "10", features = ["serde-json-impl"] } [dev-dependencies] # Parity oracle: tests/catalog_parity.rs asserts the v3 domain inventory diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index f3256e16b..440531664 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -4,9 +4,9 @@ Canonical wire types for EQL payloads — **one Rust definition per payload shape**, the single source of truth for every tool that produces or consumes EQL payloads (`cipherstash-client`, `protect-ffi`, CipherStash Proxy). -TypeScript bindings (via [`ts-rs`]) and JSON Schemas (via [`schemars`]) are -generated from these definitions in stacked changes; this crate is the -Rust contract only. +TypeScript bindings are generated from these definitions via [`ts-rs`] into +[`bindings/`](bindings/); JSON Schemas (via [`schemars`]) follow in a +stacked change. ## Why @@ -56,11 +56,15 @@ the catalog by the JSON Schema parity test in the stacked schemars change. ## Develop ```sh -cargo test -p eql-types +mise run types:generate # clean-regenerate bindings/ +mise run types:check # regenerate + fail if checked-in bindings are stale ``` -The crate is also part of the lean `mise run test:crates` set (fmt, clippy, -test — no database). +Both wrap `cargo test -p eql-types`, which runs the conformance tests and +regenerates `bindings/` (TypeScript, via ts-rs). The directory is checked in +so reviewers can see the codegen output without running anything; CI runs +`types:check` to keep it fresh. The crate is also part of the lean +`mise run test:crates` set (fmt, clippy, test — no database). ## Future direction: self-describing payloads diff --git a/crates/eql-types/bindings/v3/BloomFilter.ts b/crates/eql-types/bindings/v3/BloomFilter.ts new file mode 100644 index 000000000..280f4c7b5 --- /dev/null +++ b/crates/eql-types/bindings/v3/BloomFilter.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Bloom-filter match term — the `bf` wire key. Backs the `_match` domains + * (`~~` containment via `@>`/`<@`). + * + * **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, + * and filters sized above 32768 emit upper-half bit positions as negative + * signed values. + */ +export type BloomFilter = Array; diff --git a/crates/eql-types/bindings/v3/Ciphertext.ts b/crates/eql-types/bindings/v3/Ciphertext.ts new file mode 100644 index 000000000..7beff648e --- /dev/null +++ b/crates/eql-types/bindings/v3/Ciphertext.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * mp_base85 source ciphertext — the `c` envelope key. + * + * Required by every v3 domain CHECK; present on every payload. + */ +export type Ciphertext = string; diff --git a/crates/eql-types/bindings/v3/Date.ts b/crates/eql-types/bindings/v3/Date.ts new file mode 100644 index 000000000..06002db6e --- /dev/null +++ b/crates/eql-types/bindings/v3/Date.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.date` — storage only; every operator is blocked. + */ +export type Date = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/DateEq.ts b/crates/eql-types/bindings/v3/DateEq.ts new file mode 100644 index 000000000..9bad29675 --- /dev/null +++ b/crates/eql-types/bindings/v3/DateEq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.date_eq` — HMAC equality (`=`, `<>`). + */ +export type DateEq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/DateOrd.ts b/crates/eql-types/bindings/v3/DateOrd.ts new file mode 100644 index 000000000..c9ff2efd2 --- /dev/null +++ b/crates/eql-types/bindings/v3/DateOrd.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type DateOrd = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/DateOrdOre.ts b/crates/eql-types/bindings/v3/DateOrdOre.ts new file mode 100644 index 000000000..ccf48568f --- /dev/null +++ b/crates/eql-types/bindings/v3/DateOrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. + */ +export type DateOrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Hmac256.ts b/crates/eql-types/bindings/v3/Hmac256.ts new file mode 100644 index 000000000..22cefc000 --- /dev/null +++ b/crates/eql-types/bindings/v3/Hmac256.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains + * (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. + */ +export type Hmac256 = string; diff --git a/crates/eql-types/bindings/v3/Identifier.ts b/crates/eql-types/bindings/v3/Identifier.ts new file mode 100644 index 000000000..d8914e8f8 --- /dev/null +++ b/crates/eql-types/bindings/v3/Identifier.ts @@ -0,0 +1,16 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Table + column identifier — wire shape `{"t": "...", "c": "..."}`. + * + * Shared by every payload. + */ +export type Identifier = { +/** + * Table name. + */ +t: string, +/** + * Column name. + */ +c: string, }; diff --git a/crates/eql-types/bindings/v3/Int2.ts b/crates/eql-types/bindings/v3/Int2.ts new file mode 100644 index 000000000..9e0d8f17d --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int2` — storage only; every operator is blocked. + */ +export type Int2 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int2Eq.ts b/crates/eql-types/bindings/v3/Int2Eq.ts new file mode 100644 index 000000000..eb44df041 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2Eq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). + */ +export type Int2Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int2Ord.ts b/crates/eql-types/bindings/v3/Int2Ord.ts new file mode 100644 index 000000000..1cf345dde --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2Ord.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Int2Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int2OrdOre.ts b/crates/eql-types/bindings/v3/Int2OrdOre.ts new file mode 100644 index 000000000..3e3f5464f --- /dev/null +++ b/crates/eql-types/bindings/v3/Int2OrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. + */ +export type Int2OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int4.ts b/crates/eql-types/bindings/v3/Int4.ts new file mode 100644 index 000000000..3ab94a30e --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int4` — storage only; every operator is blocked. + */ +export type Int4 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int4Eq.ts b/crates/eql-types/bindings/v3/Int4Eq.ts new file mode 100644 index 000000000..7510a83e1 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4Eq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). + */ +export type Int4Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int4Ord.ts b/crates/eql-types/bindings/v3/Int4Ord.ts new file mode 100644 index 000000000..6463698f8 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4Ord.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Int4Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int4OrdOre.ts b/crates/eql-types/bindings/v3/Int4OrdOre.ts new file mode 100644 index 000000000..54e05a761 --- /dev/null +++ b/crates/eql-types/bindings/v3/Int4OrdOre.ts @@ -0,0 +1,29 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), + * scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. + */ +export type Int4OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too — ORE over a + * full-domain `int4` is lossless, so no separate `hm` is carried. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int8.ts b/crates/eql-types/bindings/v3/Int8.ts new file mode 100644 index 000000000..b8df9f2fe --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int8` — storage only; every operator is blocked. + */ +export type Int8 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Int8Eq.ts b/crates/eql-types/bindings/v3/Int8Eq.ts new file mode 100644 index 000000000..c2633feee --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8Eq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). + */ +export type Int8Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Int8Ord.ts b/crates/eql-types/bindings/v3/Int8Ord.ts new file mode 100644 index 000000000..97abe2e0d --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8Ord.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Int8Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/Int8OrdOre.ts b/crates/eql-types/bindings/v3/Int8OrdOre.ts new file mode 100644 index 000000000..38f5c435a --- /dev/null +++ b/crates/eql-types/bindings/v3/Int8OrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. + */ +export type Int8OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term. Serves equality too. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts b/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts new file mode 100644 index 000000000..5701b17fb --- /dev/null +++ b/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the + * `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless + * over the scalar's domain, so it serves equality too. SQL-side constructor: + * `eql_v3.ore_block_u64_8_256`. + */ +export type OreBlockU64_8_256 = Array; diff --git a/crates/eql-types/bindings/v3/SchemaVersion.ts b/crates/eql-types/bindings/v3/SchemaVersion.ts new file mode 100644 index 000000000..a3f59cc8c --- /dev/null +++ b/crates/eql-types/bindings/v3/SchemaVersion.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * The envelope version field (`v`) — always exactly [`EQL_SCHEMA_VERSION`] + * on the wire. + * + * Deserialization rejects any other value: the Rust analogue of the domain + * CHECK's `VALUE->>'v' = '2'`, so a wrong-version payload fails at the type + * boundary instead of at INSERT. The inner value is private; the only + * constructible instance is the current version. + */ +export type SchemaVersion = 2; diff --git a/crates/eql-types/bindings/v3/Text.ts b/crates/eql-types/bindings/v3/Text.ts new file mode 100644 index 000000000..e506a5a45 --- /dev/null +++ b/crates/eql-types/bindings/v3/Text.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.text` — storage only; every operator is blocked. + */ +export type Text = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/TextEq.ts b/crates/eql-types/bindings/v3/TextEq.ts new file mode 100644 index 000000000..e6650c6d3 --- /dev/null +++ b/crates/eql-types/bindings/v3/TextEq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.text_eq` — HMAC equality (`=`, `<>`). + */ +export type TextEq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/TextMatch.ts b/crates/eql-types/bindings/v3/TextMatch.ts new file mode 100644 index 000000000..400812f51 --- /dev/null +++ b/crates/eql-types/bindings/v3/TextMatch.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { BloomFilter } from "./BloomFilter"; +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.text_match` — Bloom-filter containment match. + */ +export type TextMatch = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Bloom-filter match term (signed smallint bit positions). + */ +bf: BloomFilter, }; diff --git a/crates/eql-types/bindings/v3/TextOrd.ts b/crates/eql-types/bindings/v3/TextOrd.ts new file mode 100644 index 000000000..a5fefcd03 --- /dev/null +++ b/crates/eql-types/bindings/v3/TextOrd.ts @@ -0,0 +1,34 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.text_ord` — full lexicographic comparison + * (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` + * (ordering) — text routes equality through `hm` (`[Hm, Ore]`). + */ +export type TextOrd = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. + */ +hm: Hmac256, +/** + * Block-ORE order term. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/TextOrdOre.ts b/crates/eql-types/bindings/v3/TextOrdOre.ts new file mode 100644 index 000000000..1f427cdec --- /dev/null +++ b/crates/eql-types/bindings/v3/TextOrdOre.ts @@ -0,0 +1,35 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.text_ord_ore` — full lexicographic comparison, + * scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), + * text routes equality through `hm` rather than the ORE term, so the domain + * carries both `hm` and `ob` (`[Hm, Ore]`). + */ +export type TextOrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. + */ +hm: Hmac256, +/** + * Block-ORE order term. + */ +ob: OreBlockU64_8_256, }; diff --git a/crates/eql-types/bindings/v3/TextSearch.ts b/crates/eql-types/bindings/v3/TextSearch.ts new file mode 100644 index 000000000..51b296eab --- /dev/null +++ b/crates/eql-types/bindings/v3/TextSearch.ts @@ -0,0 +1,39 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { BloomFilter } from "./BloomFilter"; +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.text_search` — the full text search surface: HMAC equality, ORE + * ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The + * superset domain combining `_eq`, `_ord`, and `_match`. + */ +export type TextSearch = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, +/** + * Block-ORE order term. + */ +ob: OreBlockU64_8_256, +/** + * Bloom-filter match term (signed smallint bit positions). + */ +bf: BloomFilter, }; diff --git a/crates/eql-types/bindings/v3/Timestamptz.ts b/crates/eql-types/bindings/v3/Timestamptz.ts new file mode 100644 index 000000000..62ddc82ec --- /dev/null +++ b/crates/eql-types/bindings/v3/Timestamptz.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.timestamptz` — storage only; every operator is blocked. + */ +export type Timestamptz = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/TimestamptzEq.ts b/crates/eql-types/bindings/v3/TimestamptzEq.ts new file mode 100644 index 000000000..e27254734 --- /dev/null +++ b/crates/eql-types/bindings/v3/TimestamptzEq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). + */ +export type TimestamptzEq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index 9232bdd91..c11e398a7 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -3,8 +3,13 @@ //! One Rust definition per EQL payload shape — the single source of truth //! for every tool that produces or consumes EQL payloads //! (`cipherstash-client`, `protect-ffi`, CipherStash Proxy). TypeScript -//! bindings and JSON Schemas are generated from these definitions in -//! stacked changes; the Rust types are the contract. +//! bindings are generated from these definitions via `ts-rs` (run +//! `cargo test`, see `bindings/v3/`); JSON Schemas follow in a stacked +//! change. The Rust types are the contract. +//! +//! ts-rs rule (learned from the original spike): ts-rs silently drops a +//! serde attribute it cannot parse, so keep field-level serde attributes +//! out of these types — which the wire rule below already demands. //! //! The [`v3`] module holds the `eql_v3` encrypted-domain types: one struct //! per SQL domain (`eql_v3.int4_eq`, `eql_v3.text_match`, …), @@ -16,6 +21,7 @@ //! anywhere. The struct definition reads exactly like the JSON payload. use serde::{Deserialize, Serialize}; +use ts_rs::TS; pub mod v3; @@ -30,8 +36,9 @@ pub const EQL_SCHEMA_VERSION: u16 = 2; /// CHECK's `VALUE->>'v' = '2'`, so a wrong-version payload fails at the type /// boundary instead of at INSERT. The inner value is private; the only /// constructible instance is the current version. -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize)] -pub struct SchemaVersion(u16); +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, TS)] +#[ts(export, export_to = "v3/")] +pub struct SchemaVersion(#[ts(type = "2")] u16); impl SchemaVersion { /// The current (only) wire version, `2`. @@ -68,7 +75,8 @@ impl<'de> Deserialize<'de> for SchemaVersion { /// Table + column identifier — wire shape `{"t": "...", "c": "..."}`. /// /// Shared by every payload. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Identifier { /// Table name. diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index 00cb706af..d9b1776fa 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -7,9 +7,11 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; +use ts_rs::TS; /// `eql_v3.date` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Date { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -32,7 +34,8 @@ impl DomainType for Date { } /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -57,7 +60,8 @@ impl DomainType for DateEq { } /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -82,7 +86,8 @@ impl DomainType for DateOrdOre { } /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index b641408d1..968784e72 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -5,9 +5,11 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; +use ts_rs::TS; /// `eql_v3.int2` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -30,7 +32,8 @@ impl DomainType for Int2 { } /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -55,7 +58,8 @@ impl DomainType for Int2Eq { } /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -80,7 +84,8 @@ impl DomainType for Int2OrdOre { } /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index 44dbcf34c..e0a804e6c 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -11,9 +11,11 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; +use ts_rs::TS; /// `eql_v3.int4` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -36,7 +38,8 @@ impl DomainType for Int4 { } /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -62,7 +65,8 @@ impl DomainType for Int4Eq { /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), /// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -88,7 +92,8 @@ impl DomainType for Int4OrdOre { } /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index 4ab0a232f..5d50fe70b 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -5,9 +5,11 @@ use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; +use ts_rs::TS; /// `eql_v3.int8` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8 { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -30,7 +32,8 @@ impl DomainType for Int8 { } /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8Eq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -55,7 +58,8 @@ impl DomainType for Int8Eq { } /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8OrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -80,7 +84,8 @@ impl DomainType for Int8OrdOre { } /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8Ord { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index ddad74bf4..b66b3ea70 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -2,32 +2,37 @@ //! //! Each newtype serializes as its inner value (serde's newtype-struct //! default), so the wire shape is unchanged — but the *name* survives into -//! generated artifacts: the TypeScript bindings and JSON Schemas (added in -//! stacked changes) emit these as named aliases/definitions that every -//! domain type references. A plain Rust `type` alias would vanish there. +//! generated artifacts: ts-rs exports a named TS alias +//! (`export type Hmac256 = string`) that every domain binding imports, and +//! the JSON Schemas (added in a stacked change) emit named definitions +//! likewise. A plain Rust `type` alias would vanish there. //! //! Names follow the SEM constructor names in `eql-scalars` (`Term::ctor()`): //! a future scheme change (e.g. a 12-block wide ORE term for timestamptz //! ordering) is a new newtype, not a hunt through `Vec` fields. use serde::{Deserialize, Serialize}; +use ts_rs::TS; /// mp_base85 source ciphertext — the `c` envelope key. /// /// Required by every v3 domain CHECK; present on every payload. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] pub struct Ciphertext(pub String); /// HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains /// (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] pub struct Hmac256(pub String); /// Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the /// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless /// over the scalar's domain, so it serves equality too. SQL-side constructor: /// `eql_v3.ore_block_u64_8_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] pub struct OreBlockU64_8_256(pub Vec); /// Bloom-filter match term — the `bf` wire key. Backs the `_match` domains @@ -36,7 +41,8 @@ pub struct OreBlockU64_8_256(pub Vec); /// **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, /// and filters sized above 32768 emit upper-half bit positions as negative /// signed values. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] pub struct BloomFilter(pub Vec); impl From for Ciphertext { diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index ed905ca2a..77d51d57a 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -6,9 +6,11 @@ use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; +use ts_rs::TS; /// `eql_v3.text` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Text { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -31,7 +33,8 @@ impl DomainType for Text { } /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -56,7 +59,8 @@ impl DomainType for TextEq { } /// `eql_v3.text_match` — Bloom-filter containment match. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextMatch { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -84,7 +88,8 @@ impl DomainType for TextMatch { /// scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), /// text routes equality through `hm` rather than the ORE term, so the domain /// carries both `hm` and `ob` (`[Hm, Ore]`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextOrdOre { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -113,7 +118,8 @@ impl DomainType for TextOrdOre { /// `eql_v3.text_ord` — full lexicographic comparison /// (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` /// (ordering) — text routes equality through `hm` (`[Hm, Ore]`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextOrd { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -142,7 +148,8 @@ impl DomainType for TextOrd { /// `eql_v3.text_search` — the full text search surface: HMAC equality, ORE /// ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The /// superset domain combining `_eq`, `_ord`, and `_match`. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextSearch { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index 6c4621b7c..e3775edec 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -8,9 +8,11 @@ use crate::v3::terms::{Ciphertext, Hmac256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use serde::{Deserialize, Serialize}; +use ts_rs::TS; /// `eql_v3.timestamptz` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Timestamptz { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other @@ -33,7 +35,8 @@ impl DomainType for Timestamptz { } /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TimestamptzEq { /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other diff --git a/mise.toml b/mise.toml index 87de5790e..6fe2235d4 100644 --- a/mise.toml +++ b/mise.toml @@ -147,8 +147,8 @@ run = """ # workspace members. Scope explicitly to them (NOT --workspace): a # workspace-wide test would drag in tests/sqlx, whose suite needs Postgres + # CS_* secrets and is already covered by the `test` job. eql-tests-macros only -# pulls syn/quote/proc-macro2 and eql-types only serde/serde_json, so they -# stay in the lean set. clippy is likewise scoped — a workspace clippy +# pulls syn/quote/proc-macro2 and eql-types only serde/serde_json/ts-rs, so +# they stay in the lean set. clippy is likewise scoped — a workspace clippy # recompiles the heavy sqlx/tokio/cipherstash-client tree for no added coverage # of these crates. # bash is pinned via the `#!/usr/bin/env bash` shebang above (mise honors a @@ -160,6 +160,49 @@ cargo clippy -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types --al cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types """ +[tasks."types:generate"] +description = "Regenerate eql-types TypeScript bindings from the Rust types (no database required)" +dir = "{{config_root}}" +run = """ +#!/usr/bin/env bash +# Clean-then-regenerate: ts-rs only ever ADDS files, so a renamed or removed +# type would otherwise leave an orphaned binding behind — we need a clean dir, +# not an overlay. But we must NOT rm the checked-in bindings before the build: +# a failing or interrupted `cargo test` would then leave the working tree +# missing them. Instead, export into a throwaway temp dir (ts-rs honors +# TS_RS_EXPORT_DIR as the base, and every v3 type uses export_to = "v3/", so +# the temp dir mirrors crates/eql-types/bindings exactly) and only swap it into +# place after the tests succeed. The swap stays out of the tests themselves — +# they run in parallel and can't safely rm. +set -euo pipefail +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT +TS_RS_EXPORT_DIR="$tmp" cargo test -p eql-types +rm -rf crates/eql-types/bindings +mv "$tmp" crates/eql-types/bindings +trap - EXIT +""" + +[tasks."types:check"] +description = "Verify the checked-in eql-types bindings/ are fresh (regenerate + git diff)" +dir = "{{config_root}}" +depends = ["types:generate"] +run = """ +#!/usr/bin/env bash +set -euo pipefail +git diff --exit-code -- crates/eql-types/bindings || { + echo "eql-types bindings/ are stale — run 'mise run types:generate' and commit the result" >&2 + exit 1 +} +# git diff is blind to brand-new files; untracked output is stale too. +untracked=$(git ls-files --others --exclude-standard -- crates/eql-types/bindings) +if [ -n "$untracked" ]; then + echo "eql-types has uncommitted generated files:" >&2 + echo "$untracked" >&2 + exit 1 +fi +""" + [tasks."test:matrix:inventory"] description = "Verify the matrix test-name set against the canonical snapshot (its derived eq-only subset, or the committed text superset), catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" From bfd3a310f00ebe6bbce137ff5a96a7fcb245910a Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 16 Jun 2026 17:07:55 +1000 Subject: [PATCH 198/599] =?UTF-8?q?chore(eql-types):=20address=20#268=20re?= =?UTF-8?q?view=20=E2=80=94=20drop=20unused=20ts-rs=20feature,=20note=20in?= =?UTF-8?q?-place=20regen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Drop the `serde-json-impl` ts-rs feature: no v3 type carries a serde_json::Value/Map/Number field, so it only pulled serde_json into ts-rs's build graph for nothing. Bindings regenerate byte-identically without it (verified via `mise run types:check`). - README: note that a plain `cargo test` / `mise run test:crates` regenerates `bindings/` in place as a side effect — only `types:generate` isolates the write via the temp-dir swap. --- Cargo.lock | 1 - crates/eql-types/Cargo.toml | 2 +- crates/eql-types/README.md | 6 ++++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3d11116e6..bd29da0cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4346,7 +4346,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" dependencies = [ "lazy_static", - "serde_json", "thiserror 2.0.18", "ts-rs-macros", ] diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml index 15768b75e..8e644068a 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-types/Cargo.toml @@ -6,7 +6,7 @@ description = "Canonical wire types for EQL payloads — the single Rust source [dependencies] serde = { version = "1", features = ["derive"] } -ts-rs = { version = "10", features = ["serde-json-impl"] } +ts-rs = "10" [dev-dependencies] # Parity oracle: tests/catalog_parity.rs asserts the v3 domain inventory diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index 440531664..01bfd2a95 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -66,6 +66,12 @@ so reviewers can see the codegen output without running anything; CI runs `types:check` to keep it fresh. The crate is also part of the lean `mise run test:crates` set (fmt, clippy, test — no database). +Note that ts-rs writes to `./bindings` by default, so a plain +`cargo test -p eql-types` (and therefore `mise run test:crates`) regenerates +`bindings/` **in place** as a side effect — it can leave your working tree +dirty if the checked-in copies were stale. Only `types:generate` isolates the +write (it exports into a temp dir and swaps it in after the build succeeds). + ## Future direction: self-describing payloads On the wire, a v3 payload is discriminated only by *which key is present* From 0b46585848e958730e7c450b303b0328c5b43d92 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Wed, 10 Jun 2026 21:06:06 +1000 Subject: [PATCH 199/599] feat(eql-types): generate JSON Schemas via schemars Stacks on the TypeScript bindings change. Every v3 domain type, the term newtypes, and Identifier gain a JsonSchema derive; the registry regains its schema fn; tests/export.rs writes one schema per SQL domain to crates/eql-types/schema/v3/ (23 files, checked in) with a canonical $id (https://schemas.cipherstash.com/eql/v3/.json) injected at write time (schemars 0.8 emits none). Term newtypes appear as named definitions that every domain schema $refs. catalog_parity.rs gains a third gate: each domain's published schema 'required' list must equal envelope + catalog term keys, pinning the artifact schema consumers validate against (the behavioural serde test already pins the wire contract). types:generate / types:check and the CI freshness step now cover schema/ as well as bindings/. --- .github/workflows/test-eql.yml | 6 +- Cargo.lock | 42 +++++++ crates/eql-types/Cargo.toml | 7 +- crates/eql-types/README.md | 25 ++-- crates/eql-types/bindings/v3/BloomFilter.ts | 2 +- crates/eql-types/schema/v3/date.json | 69 +++++++++++ crates/eql-types/schema/v3/date_eq.json | 82 ++++++++++++ crates/eql-types/schema/v3/date_ord.json | 85 +++++++++++++ crates/eql-types/schema/v3/date_ord_ore.json | 85 +++++++++++++ crates/eql-types/schema/v3/int2.json | 69 +++++++++++ crates/eql-types/schema/v3/int2_eq.json | 82 ++++++++++++ crates/eql-types/schema/v3/int2_ord.json | 85 +++++++++++++ crates/eql-types/schema/v3/int2_ord_ore.json | 85 +++++++++++++ crates/eql-types/schema/v3/int4.json | 69 +++++++++++ crates/eql-types/schema/v3/int4_eq.json | 82 ++++++++++++ crates/eql-types/schema/v3/int4_ord.json | 85 +++++++++++++ crates/eql-types/schema/v3/int4_ord_ore.json | 85 +++++++++++++ crates/eql-types/schema/v3/int8.json | 69 +++++++++++ crates/eql-types/schema/v3/int8_eq.json | 82 ++++++++++++ crates/eql-types/schema/v3/int8_ord.json | 85 +++++++++++++ crates/eql-types/schema/v3/int8_ord_ore.json | 85 +++++++++++++ crates/eql-types/schema/v3/text.json | 69 +++++++++++ crates/eql-types/schema/v3/text_eq.json | 82 ++++++++++++ crates/eql-types/schema/v3/text_match.json | 88 +++++++++++++ crates/eql-types/schema/v3/text_ord.json | 98 +++++++++++++++ crates/eql-types/schema/v3/text_ord_ore.json | 98 +++++++++++++++ crates/eql-types/schema/v3/text_search.json | 117 ++++++++++++++++++ crates/eql-types/schema/v3/timestamptz.json | 69 +++++++++++ .../eql-types/schema/v3/timestamptz_eq.json | 82 ++++++++++++ crates/eql-types/src/lib.rs | 32 ++++- crates/eql-types/src/v3/date.rs | 27 +++- crates/eql-types/src/v3/int2.rs | 27 +++- crates/eql-types/src/v3/int4.rs | 27 +++- crates/eql-types/src/v3/int8.rs | 27 +++- crates/eql-types/src/v3/mod.rs | 11 +- crates/eql-types/src/v3/terms.rs | 58 ++++++++- crates/eql-types/src/v3/text.rs | 39 +++++- crates/eql-types/src/v3/timestamptz.rs | 15 ++- crates/eql-types/tests/catalog_parity.rs | 53 ++++++-- crates/eql-types/tests/export.rs | 36 ++++++ mise.toml | 33 ++--- 41 files changed, 2378 insertions(+), 76 deletions(-) create mode 100644 crates/eql-types/schema/v3/date.json create mode 100644 crates/eql-types/schema/v3/date_eq.json create mode 100644 crates/eql-types/schema/v3/date_ord.json create mode 100644 crates/eql-types/schema/v3/date_ord_ore.json create mode 100644 crates/eql-types/schema/v3/int2.json create mode 100644 crates/eql-types/schema/v3/int2_eq.json create mode 100644 crates/eql-types/schema/v3/int2_ord.json create mode 100644 crates/eql-types/schema/v3/int2_ord_ore.json create mode 100644 crates/eql-types/schema/v3/int4.json create mode 100644 crates/eql-types/schema/v3/int4_eq.json create mode 100644 crates/eql-types/schema/v3/int4_ord.json create mode 100644 crates/eql-types/schema/v3/int4_ord_ore.json create mode 100644 crates/eql-types/schema/v3/int8.json create mode 100644 crates/eql-types/schema/v3/int8_eq.json create mode 100644 crates/eql-types/schema/v3/int8_ord.json create mode 100644 crates/eql-types/schema/v3/int8_ord_ore.json create mode 100644 crates/eql-types/schema/v3/text.json create mode 100644 crates/eql-types/schema/v3/text_eq.json create mode 100644 crates/eql-types/schema/v3/text_match.json create mode 100644 crates/eql-types/schema/v3/text_ord.json create mode 100644 crates/eql-types/schema/v3/text_ord_ore.json create mode 100644 crates/eql-types/schema/v3/text_search.json create mode 100644 crates/eql-types/schema/v3/timestamptz.json create mode 100644 crates/eql-types/schema/v3/timestamptz_eq.json create mode 100644 crates/eql-types/tests/export.rs diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 151b049d5..034f7a2c9 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -320,9 +320,9 @@ jobs: mise run test:crates # Freshness gate for the eql-types codegen output: regenerate the - # TypeScript bindings and fail if the checked-in copies differ. - # Reuses the toolchain from the step above. - - name: Verify eql-types bindings are fresh + # TypeScript bindings and JSON Schemas and fail if the checked-in + # copies differ. Reuses the toolchain from the step above. + - name: Verify eql-types bindings and schemas are fresh run: | mise run types:check diff --git a/Cargo.lock b/Cargo.lock index bd29da0cb..92723c937 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1125,6 +1125,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -1184,6 +1190,7 @@ name = "eql-types" version = "0.1.0" dependencies = [ "eql-scalars", + "schemars", "serde", "serde_json", "ts-rs", @@ -3376,6 +3383,30 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.108", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -3467,6 +3498,17 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "serde_json" version = "1.0.145" diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml index 8e644068a..82c70efa7 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-types/Cargo.toml @@ -2,15 +2,18 @@ name = "eql-types" version = "0.1.0" edition = "2021" -description = "Canonical wire types for EQL payloads — the single Rust source of truth, with generated TypeScript bindings (JSON Schemas are generated from these types in a stacked change)." +description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." [dependencies] serde = { version = "1", features = ["derive"] } +# Direct dependency again at this layer: SchemaVersion's manual JsonSchema +# impl pins `const: 2` via serde_json::json!. +serde_json = "1" ts-rs = "10" +schemars = "0.8" [dev-dependencies] # Parity oracle: tests/catalog_parity.rs asserts the v3 domain inventory # exactly covers eql_scalars::CATALOG, so the types here cannot drift from # the generated SQL surface. eql-scalars = { path = "../eql-scalars" } -serde_json = "1" diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index 01bfd2a95..aff5f5f9c 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -5,8 +5,8 @@ shape**, the single source of truth for every tool that produces or consumes EQL payloads (`cipherstash-client`, `protect-ffi`, CipherStash Proxy). TypeScript bindings are generated from these definitions via [`ts-rs`] into -[`bindings/`](bindings/); JSON Schemas (via [`schemars`]) follow in a -stacked change. +[`bindings/`](bindings/), and JSON Schemas via [`schemars`] into +[`schema/`](schema/). ## Why @@ -56,21 +56,24 @@ the catalog by the JSON Schema parity test in the stacked schemars change. ## Develop ```sh -mise run types:generate # clean-regenerate bindings/ -mise run types:check # regenerate + fail if checked-in bindings are stale +mise run types:generate # clean-regenerate bindings/ and schema/ +mise run types:check # regenerate + fail if checked-in outputs are stale ``` Both wrap `cargo test -p eql-types`, which runs the conformance tests and -regenerates `bindings/` (TypeScript, via ts-rs). The directory is checked in -so reviewers can see the codegen output without running anything; CI runs -`types:check` to keep it fresh. The crate is also part of the lean +regenerates `bindings/` (TypeScript, via ts-rs) and `schema/` (JSON Schema, +via `tests/export.rs`, with canonical `$id`s injected). Both directories are +checked in so reviewers can see the codegen output without running anything; +CI runs `types:check` to keep them fresh. The crate is also part of the lean `mise run test:crates` set (fmt, clippy, test — no database). -Note that ts-rs writes to `./bindings` by default, so a plain +Note that both exporters default to writing under the crate dir (ts-rs to +`./bindings`, `tests/export.rs` to `./schema`), so a plain `cargo test -p eql-types` (and therefore `mise run test:crates`) regenerates -`bindings/` **in place** as a side effect — it can leave your working tree -dirty if the checked-in copies were stale. Only `types:generate` isolates the -write (it exports into a temp dir and swaps it in after the build succeeds). +`bindings/` and `schema/` **in place** as a side effect — it can leave your +working tree dirty if the checked-in copies were stale. Only `types:generate` +isolates the writes (it exports into a temp dir and swaps them in after the +build succeeds). ## Future direction: self-describing payloads diff --git a/crates/eql-types/bindings/v3/BloomFilter.ts b/crates/eql-types/bindings/v3/BloomFilter.ts index 280f4c7b5..6861ce1c5 100644 --- a/crates/eql-types/bindings/v3/BloomFilter.ts +++ b/crates/eql-types/bindings/v3/BloomFilter.ts @@ -2,7 +2,7 @@ /** * Bloom-filter match term — the `bf` wire key. Backs the `_match` domains - * (`~~` containment via `@>`/`<@`). + * (`@>`/`<@` containment). * * **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, * and filters sized above 32768 emit upper-half bit positions as negative diff --git a/crates/eql-types/schema/v3/date.json b/crates/eql-types/schema/v3/date.json new file mode 100644 index 000000000..706e4b566 --- /dev/null +++ b/crates/eql-types/schema/v3/date.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/date.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.date` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Date", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_eq.json b/crates/eql-types/schema/v3/date_eq.json new file mode 100644 index 000000000..d7cf20d1b --- /dev/null +++ b/crates/eql-types/schema/v3/date_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.date_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "DateEq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_ord.json b/crates/eql-types/schema/v3/date_ord.json new file mode 100644 index 000000000..03315ea1f --- /dev/null +++ b/crates/eql-types/schema/v3/date_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "DateOrd", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/date_ord_ore.json b/crates/eql-types/schema/v3/date_ord_ore.json new file mode 100644 index 000000000..dfff74031 --- /dev/null +++ b/crates/eql-types/schema/v3/date_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.date_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "DateOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2.json b/crates/eql-types/schema/v3/int2.json new file mode 100644 index 000000000..118cfbf2d --- /dev/null +++ b/crates/eql-types/schema/v3/int2.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int2` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Int2", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_eq.json b/crates/eql-types/schema/v3/int2_eq.json new file mode 100644 index 000000000..2b3616d7f --- /dev/null +++ b/crates/eql-types/schema/v3/int2_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int2_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Int2Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_ord.json b/crates/eql-types/schema/v3/int2_ord.json new file mode 100644 index 000000000..5073b3a40 --- /dev/null +++ b/crates/eql-types/schema/v3/int2_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int2Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int2_ord_ore.json b/crates/eql-types/schema/v3/int2_ord_ore.json new file mode 100644 index 000000000..83b375876 --- /dev/null +++ b/crates/eql-types/schema/v3/int2_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int2_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int2OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4.json b/crates/eql-types/schema/v3/int4.json new file mode 100644 index 000000000..4e8506272 --- /dev/null +++ b/crates/eql-types/schema/v3/int4.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int4` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Int4", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_eq.json b/crates/eql-types/schema/v3/int4_eq.json new file mode 100644 index 000000000..cf88e7f7d --- /dev/null +++ b/crates/eql-types/schema/v3/int4_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int4_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Int4Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_ord.json b/crates/eql-types/schema/v3/int4_ord.json new file mode 100644 index 000000000..cbacaa324 --- /dev/null +++ b/crates/eql-types/schema/v3/int4_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int4Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int4_ord_ore.json b/crates/eql-types/schema/v3/int4_ord_ore.json new file mode 100644 index 000000000..b8cdb95f9 --- /dev/null +++ b/crates/eql-types/schema/v3/int4_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too — ORE over a full-domain `int4` is lossless, so no separate `hm` is carried." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int4OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8.json b/crates/eql-types/schema/v3/int8.json new file mode 100644 index 000000000..be50c73b5 --- /dev/null +++ b/crates/eql-types/schema/v3/int8.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int8` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Int8", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_eq.json b/crates/eql-types/schema/v3/int8_eq.json new file mode 100644 index 000000000..3a7d30424 --- /dev/null +++ b/crates/eql-types/schema/v3/int8_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int8_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Int8Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_ord.json b/crates/eql-types/schema/v3/int8_ord.json new file mode 100644 index 000000000..9adc8520e --- /dev/null +++ b/crates/eql-types/schema/v3/int8_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int8Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/int8_ord_ore.json b/crates/eql-types/schema/v3/int8_ord_ore.json new file mode 100644 index 000000000..174e68af7 --- /dev/null +++ b/crates/eql-types/schema/v3/int8_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.int8_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term. Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Int8OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text.json b/crates/eql-types/schema/v3/text.json new file mode 100644 index 000000000..4b4e34d95 --- /dev/null +++ b/crates/eql-types/schema/v3/text.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.text` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Text", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_eq.json b/crates/eql-types/schema/v3/text_eq.json new file mode 100644 index 000000000..71a0f15e0 --- /dev/null +++ b/crates/eql-types/schema/v3/text_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.text_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "TextEq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_match.json b/crates/eql-types/schema/v3/text_match.json new file mode 100644 index 000000000..cedacf786 --- /dev/null +++ b/crates/eql-types/schema/v3/text_match.json @@ -0,0 +1,88 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "BloomFilter": { + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", + "items": { + "format": "int16", + "maximum": 32767.0, + "minimum": -32768.0, + "type": "integer" + }, + "type": "array" + }, + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.text_match` — Bloom-filter containment match.", + "properties": { + "bf": { + "allOf": [ + { + "$ref": "#/definitions/BloomFilter" + } + ], + "description": "Bloom-filter match term (signed smallint bit positions)." + }, + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "bf", + "c", + "i", + "v" + ], + "title": "TextMatch", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_ord.json b/crates/eql-types/schema/v3/text_ord.json new file mode 100644 index 000000000..6b059e2ae --- /dev/null +++ b/crates/eql-types/schema/v3/text_ord.json @@ -0,0 +1,98 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.text_ord` — full lexicographic comparison (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` (ordering) — text routes equality through `hm` (`[Hm, Ore]`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "ob", + "v" + ], + "title": "TextOrd", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_ord_ore.json b/crates/eql-types/schema/v3/text_ord_ore.json new file mode 100644 index 000000000..d4899142b --- /dev/null +++ b/crates/eql-types/schema/v3/text_ord_ore.json @@ -0,0 +1,98 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.text_ord_ore` — full lexicographic comparison, scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), text routes equality through `hm` rather than the ORE term, so the domain carries both `hm` and `ob` (`[Hm, Ore]`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "ob", + "v" + ], + "title": "TextOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_search.json b/crates/eql-types/schema/v3/text_search.json new file mode 100644 index 000000000..87188f4b3 --- /dev/null +++ b/crates/eql-types/schema/v3/text_search.json @@ -0,0 +1,117 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/text_search.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "BloomFilter": { + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", + "items": { + "format": "int16", + "maximum": 32767.0, + "minimum": -32768.0, + "type": "integer" + }, + "type": "array" + }, + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlockU64_8_256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.text_search` — the full text search surface: HMAC equality, ORE ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The superset domain combining `_eq`, `_ord`, and `_match`.", + "properties": { + "bf": { + "allOf": [ + { + "$ref": "#/definitions/BloomFilter" + } + ], + "description": "Bloom-filter match term (signed smallint bit positions)." + }, + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlockU64_8_256" + } + ], + "description": "Block-ORE order term." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "bf", + "c", + "hm", + "i", + "ob", + "v" + ], + "title": "TextSearch", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/timestamptz.json b/crates/eql-types/schema/v3/timestamptz.json new file mode 100644 index 000000000..72a154d8e --- /dev/null +++ b/crates/eql-types/schema/v3/timestamptz.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.timestamptz` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Timestamptz", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/timestamptz_eq.json b/crates/eql-types/schema/v3/timestamptz_eq.json new file mode 100644 index 000000000..90fc71d48 --- /dev/null +++ b/crates/eql-types/schema/v3/timestamptz_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "TimestamptzEq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index c11e398a7..82d1b5030 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -3,9 +3,9 @@ //! One Rust definition per EQL payload shape — the single source of truth //! for every tool that produces or consumes EQL payloads //! (`cipherstash-client`, `protect-ffi`, CipherStash Proxy). TypeScript -//! bindings are generated from these definitions via `ts-rs` (run -//! `cargo test`, see `bindings/v3/`); JSON Schemas follow in a stacked -//! change. The Rust types are the contract. +//! bindings (`ts-rs`) and JSON Schemas (`schemars`) are generated from +//! these definitions — run `cargo test`, see `bindings/v3/` and +//! `schema/v3/`. The Rust types are the contract. //! //! ts-rs rule (learned from the original spike): ts-rs silently drops a //! serde attribute it cannot parse, so keep field-level serde attributes @@ -20,6 +20,7 @@ //! Wire rule: **field names ARE wire names** — no `#[serde(rename)]` //! anywhere. The struct definition reads exactly like the JSON payload. +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; @@ -72,10 +73,33 @@ impl<'de> Deserialize<'de> for SchemaVersion { } } +/// Manual schema: pins `v` to the literal `2` (`const`), mirroring the +/// domain CHECK — the derive would emit an unconstrained integer. +impl schemars::JsonSchema for SchemaVersion { + fn schema_name() -> String { + "SchemaVersion".to_owned() + } + + fn json_schema(_: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { + schemars::schema::SchemaObject { + instance_type: Some(schemars::schema::InstanceType::Integer.into()), + const_value: Some(serde_json::json!(EQL_SCHEMA_VERSION)), + metadata: Some(Box::new(schemars::schema::Metadata { + description: Some( + "The envelope version field (`v`) — always exactly `2` on the wire.".to_owned(), + ), + ..Default::default() + })), + ..Default::default() + } + .into() + } +} + /// Table + column identifier — wire shape `{"t": "...", "c": "..."}`. /// /// Shared by every payload. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Identifier { diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index d9b1776fa..ffd0bbbb9 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -3,14 +3,17 @@ //! ciphertext, so dates order like integers); see that module for the //! capability table. +use schemars::{schema::RootSchema, schema_for}; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; /// `eql_v3.date` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Date { @@ -31,10 +34,14 @@ impl DomainType for Date { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Date) + } } /// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateEq { @@ -57,10 +64,14 @@ impl DomainType for DateEq { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(DateEq) + } } /// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateOrdOre { @@ -83,10 +94,14 @@ impl DomainType for DateOrdOre { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(DateOrdOre) + } } /// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateOrd { @@ -109,4 +124,8 @@ impl DomainType for DateOrd { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(DateOrd) + } } diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index 968784e72..8e2fc939c 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -1,14 +1,17 @@ //! The `int2` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. +use schemars::{schema::RootSchema, schema_for}; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; /// `eql_v3.int2` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2 { @@ -29,10 +32,14 @@ impl DomainType for Int2 { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int2) + } } /// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2Eq { @@ -55,10 +62,14 @@ impl DomainType for Int2Eq { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int2Eq) + } } /// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2OrdOre { @@ -81,10 +92,14 @@ impl DomainType for Int2OrdOre { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int2OrdOre) + } } /// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2Ord { @@ -107,4 +122,8 @@ impl DomainType for Int2Ord { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int2Ord) + } } diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index e0a804e6c..752ddbf1b 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -7,14 +7,17 @@ //! | [`Int4OrdOre`] | `eql_v3.int4_ord_ore` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | //! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | +use schemars::{schema::RootSchema, schema_for}; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; /// `eql_v3.int4` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4 { @@ -35,10 +38,14 @@ impl DomainType for Int4 { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int4) + } } /// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4Eq { @@ -61,11 +68,15 @@ impl DomainType for Int4Eq { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int4Eq) + } } /// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), /// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4OrdOre { @@ -89,10 +100,14 @@ impl DomainType for Int4OrdOre { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int4OrdOre) + } } /// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4Ord { @@ -115,4 +130,8 @@ impl DomainType for Int4Ord { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int4Ord) + } } diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index 5d50fe70b..ea0f57148 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -1,14 +1,17 @@ //! The `int8` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. +use schemars::{schema::RootSchema, schema_for}; + use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; /// `eql_v3.int8` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8 { @@ -29,10 +32,14 @@ impl DomainType for Int8 { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int8) + } } /// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8Eq { @@ -55,10 +62,14 @@ impl DomainType for Int8Eq { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int8Eq) + } } /// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8OrdOre { @@ -81,10 +92,14 @@ impl DomainType for Int8OrdOre { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int8OrdOre) + } } /// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8Ord { @@ -107,4 +122,8 @@ impl DomainType for Int8Ord { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Int8Ord) + } } diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 316f53e71..e2681bc68 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -46,6 +46,8 @@ use std::marker::PhantomData; +use schemars::{schema::RootSchema, schema_for, JsonSchema}; + pub mod date; pub mod int2; pub mod int4; @@ -88,6 +90,9 @@ pub trait DomainType { .strip_prefix("eql_v3.") .expect("sql_domain must be qualified with the eql_v3 schema") } + + /// The type's JSON Schema. + fn schema(&self) -> RootSchema; } /// Type-level handle: lets [`all`] enumerate the domain types without @@ -96,7 +101,7 @@ pub trait DomainType { /// payload instance is ever constructed. impl DomainType for PhantomData where - T: DomainType, + T: DomainType + JsonSchema, { fn sql_domain_static() -> &'static str { T::sql_domain_static() @@ -105,6 +110,10 @@ where fn sql_domain(&self) -> &'static str { T::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(T) + } } /// Every v3 domain type, in `eql-scalars::CATALOG` order (token order, then diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index b66b3ea70..0c9e006bb 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -4,26 +4,27 @@ //! default), so the wire shape is unchanged — but the *name* survives into //! generated artifacts: ts-rs exports a named TS alias //! (`export type Hmac256 = string`) that every domain binding imports, and -//! the JSON Schemas (added in a stacked change) emit named definitions -//! likewise. A plain Rust `type` alias would vanish there. +//! schemars registers a named definition that every domain schema `$ref`s. +//! A plain Rust `type` alias would vanish in both outputs. //! //! Names follow the SEM constructor names in `eql-scalars` (`Term::ctor()`): //! a future scheme change (e.g. a 12-block wide ORE term for timestamptz //! ordering) is a new newtype, not a hunt through `Vec` fields. +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; /// mp_base85 source ciphertext — the `c` envelope key. /// /// Required by every v3 domain CHECK; present on every payload. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] pub struct Ciphertext(pub String); /// HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains /// (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] pub struct Hmac256(pub String); @@ -31,12 +32,12 @@ pub struct Hmac256(pub String); /// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless /// over the scalar's domain, so it serves equality too. SQL-side constructor: /// `eql_v3.ore_block_u64_8_256`. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] pub struct OreBlockU64_8_256(pub Vec); /// Bloom-filter match term — the `bf` wire key. Backs the `_match` domains -/// (`~~` containment via `@>`/`<@`). +/// (`@>`/`<@` containment). /// /// **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, /// and filters sized above 32768 emit upper-half bit positions as negative @@ -45,6 +46,51 @@ pub struct OreBlockU64_8_256(pub Vec); #[ts(export, export_to = "v3/")] pub struct BloomFilter(pub Vec); +/// Manual schema: bounds the items to the `smallint` range — the derive +/// emits only `format: "int16"`, a non-validating annotation in draft-07, +/// so an out-of-range bit position would pass schema validation and fail +/// at the database. +impl schemars::JsonSchema for BloomFilter { + fn schema_name() -> String { + "BloomFilter".to_owned() + } + + fn json_schema(_: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { + use schemars::schema::{ + ArrayValidation, InstanceType, Metadata, NumberValidation, Schema, SchemaObject, + }; + let items = SchemaObject { + instance_type: Some(InstanceType::Integer.into()), + format: Some("int16".to_owned()), + number: Some(Box::new(NumberValidation { + minimum: Some(f64::from(i16::MIN)), + maximum: Some(f64::from(i16::MAX)), + ..Default::default() + })), + ..Default::default() + }; + SchemaObject { + instance_type: Some(InstanceType::Array.into()), + array: Some(Box::new(ArrayValidation { + items: Some(Schema::Object(items).into()), + ..Default::default() + })), + metadata: Some(Box::new(Metadata { + description: Some( + "Bloom-filter match term — the `bf` wire key. Backs the `_match` \ + domains (`@>`/`<@` containment). Signed i16: EQL stores the filter \ + as PostgreSQL `smallint[]`, and filters sized above 32768 emit \ + upper-half bit positions as negative signed values." + .to_owned(), + ), + ..Default::default() + })), + ..Default::default() + } + .into() + } +} + impl From for Ciphertext { fn from(value: String) -> Self { Self(value) diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index 77d51d57a..a0008947a 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -2,14 +2,17 @@ //! [`crate::v3::int4`] plus a `_match` domain backed by the Bloom-filter //! term (`@>`/`<@` containment for `LIKE`-style matching). +use schemars::{schema::RootSchema, schema_for}; + use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; /// `eql_v3.text` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Text { @@ -30,10 +33,14 @@ impl DomainType for Text { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Text) + } } /// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextEq { @@ -56,10 +63,14 @@ impl DomainType for TextEq { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(TextEq) + } } /// `eql_v3.text_match` — Bloom-filter containment match. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextMatch { @@ -82,13 +93,17 @@ impl DomainType for TextMatch { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(TextMatch) + } } /// `eql_v3.text_ord_ore` — full lexicographic comparison, /// scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), /// text routes equality through `hm` rather than the ORE term, so the domain /// carries both `hm` and `ob` (`[Hm, Ore]`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextOrdOre { @@ -113,12 +128,16 @@ impl DomainType for TextOrdOre { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(TextOrdOre) + } } /// `eql_v3.text_ord` — full lexicographic comparison /// (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` /// (ordering) — text routes equality through `hm` (`[Hm, Ore]`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextOrd { @@ -143,12 +162,16 @@ impl DomainType for TextOrd { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(TextOrd) + } } /// `eql_v3.text_search` — the full text search surface: HMAC equality, ORE /// ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The /// superset domain combining `_eq`, `_ord`, and `_match`. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextSearch { @@ -175,4 +198,8 @@ impl DomainType for TextSearch { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(TextSearch) + } } diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index e3775edec..3deb51a28 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -4,14 +4,17 @@ //! 8 blocks, so an ordered timestamptz domain would silently mis-order. //! Ordering arrives with a future wide-ORE term (see `eql-scalars`). +use schemars::{schema::RootSchema, schema_for}; + use crate::v3::terms::{Ciphertext, Hmac256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use ts_rs::TS; /// `eql_v3.timestamptz` — storage only; every operator is blocked. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Timestamptz { @@ -32,10 +35,14 @@ impl DomainType for Timestamptz { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(Timestamptz) + } } /// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS)] +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TimestamptzEq { @@ -58,4 +65,8 @@ impl DomainType for TimestamptzEq { fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } + + fn schema(&self) -> RootSchema { + schema_for!(TimestamptzEq) + } } diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index 94ff8eb74..b068e5cf7 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -1,14 +1,14 @@ //! The drift gate: the v3 domain inventory must mirror `eql-scalars::CATALOG` //! — the same catalog that generates the `eql_v3` SQL surface — exactly: -//! every domain, in catalog order. Append a scalar to the catalog without -//! adding its types (and their `all()` entries) and this fails. -//! -//! Wire-key strictness (required term keys, unknown-key rejection, envelope -//! version) is covered behaviourally per-type in `tests/v3_conformance.rs`, -//! and pinned against the catalog by the JSON Schema parity test in the -//! stacked schemars change. +//! every domain, in catalog order, and every domain's wire keys, pinned +//! through the published JSON Schema (schemars `required` reflects the real +//! serde contract, so an `Option` term field or a wrong wire key fails +//! here). Per-type strictness (unknown-key rejection, envelope version) is +//! covered behaviourally in `tests/v3_conformance.rs`. -use eql_scalars::CATALOG; +use std::collections::BTreeSet; + +use eql_scalars::{Term, CATALOG, ENVELOPE_KEYS}; use eql_types::v3; #[test] @@ -23,3 +23,40 @@ fn inventory_exactly_covers_catalog() { "v3::all() must list every CATALOG domain, in catalog order" ); } + +/// The *published* JSON Schemas must agree with the catalog: each domain's +/// schema `required` list is exactly envelope + catalog term keys — the +/// artifact schema consumers validate against cannot drift from the SQL +/// surface's CHECK constraints. +#[test] +fn schema_required_keys_match_catalog_terms() { + let entries = v3::all(); + for spec in CATALOG { + for domain in spec.domains { + let name = spec.domain_name(domain); + let entry = entries + .iter() + .find(|e| e.domain() == name) + .unwrap_or_else(|| panic!("no domain inventory entry for {name}")); + + let schema = entry.schema(); + let object = schema + .schema + .object + .as_ref() + .unwrap_or_else(|| panic!("{name}: schema is not an object")); + let required: BTreeSet<&str> = object.required.iter().map(String::as_str).collect(); + + let expected: BTreeSet<&str> = ENVELOPE_KEYS + .iter() + .copied() + .chain(Term::term_json_keys(domain.terms)) + .collect(); + + assert_eq!( + required, expected, + "{name}: schema required keys must be envelope + catalog terms" + ); + } + } +} diff --git a/crates/eql-types/tests/export.rs b/crates/eql-types/tests/export.rs new file mode 100644 index 000000000..3fb4e2d3f --- /dev/null +++ b/crates/eql-types/tests/export.rs @@ -0,0 +1,36 @@ +//! JSON Schema export — runs during `cargo test` (alongside ts-rs's own +//! export tests, which write `bindings/`). Output is checked in; freshness +//! is enforced by `mise run types:check`. Schema files are named after the +//! SQL domain — the protocol identity — not the Rust type. +//! +//! Output base defaults to `schema/` (relative to the crate dir, where +//! `cargo test` runs), so a plain `cargo test` regenerates the checked-in +//! tree. `EQL_TYPES_SCHEMA_DIR` overrides it — mirroring ts-rs's +//! `TS_RS_EXPORT_DIR` — so `mise run types:generate` can redirect output to a +//! throwaway temp dir and only swap it into place after a successful build. + +use eql_types::v3; + +#[test] +fn dump_v3_json_schemas() { + let base = std::env::var("EQL_TYPES_SCHEMA_DIR").unwrap_or_else(|_| "schema".into()); + let dir = format!("{base}/v3"); + std::fs::create_dir_all(&dir).unwrap(); + for entry in v3::all() { + let mut schema = serde_json::to_value(entry.schema()).unwrap(); + // schemars 0.8 emits no $id; inject the canonical one. + schema.as_object_mut().unwrap().insert( + "$id".into(), + format!( + "https://schemas.cipherstash.com/eql/v3/{}.json", + entry.domain() + ) + .into(), + ); + std::fs::write( + format!("{dir}/{}.json", entry.domain()), + serde_json::to_string_pretty(&schema).unwrap(), + ) + .unwrap(); + } +} diff --git a/mise.toml b/mise.toml index 6fe2235d4..bfece3d4f 100644 --- a/mise.toml +++ b/mise.toml @@ -161,41 +161,42 @@ cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types """ [tasks."types:generate"] -description = "Regenerate eql-types TypeScript bindings from the Rust types (no database required)" +description = "Regenerate eql-types TypeScript bindings and JSON Schemas from the Rust types (no database required)" dir = "{{config_root}}" run = """ #!/usr/bin/env bash -# Clean-then-regenerate: ts-rs only ever ADDS files, so a renamed or removed -# type would otherwise leave an orphaned binding behind — we need a clean dir, -# not an overlay. But we must NOT rm the checked-in bindings before the build: -# a failing or interrupted `cargo test` would then leave the working tree -# missing them. Instead, export into a throwaway temp dir (ts-rs honors -# TS_RS_EXPORT_DIR as the base, and every v3 type uses export_to = "v3/", so -# the temp dir mirrors crates/eql-types/bindings exactly) and only swap it into +# Clean-then-regenerate: ts-rs and tests/export.rs only ever ADD files, so a +# renamed or removed type would otherwise leave an orphaned binding/schema +# behind — we need clean dirs, not an overlay. But we must NOT rm the +# checked-in output before the build: a failing or interrupted `cargo test` +# would then leave the working tree missing it. Instead, export into a +# throwaway temp dir (ts-rs honors TS_RS_EXPORT_DIR; tests/export.rs honors +# EQL_TYPES_SCHEMA_DIR; every type uses the v3/ subdir, so the temp tree +# mirrors crates/eql-types/{bindings,schema} exactly) and only swap it into # place after the tests succeed. The swap stays out of the tests themselves — # they run in parallel and can't safely rm. set -euo pipefail tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT -TS_RS_EXPORT_DIR="$tmp" cargo test -p eql-types -rm -rf crates/eql-types/bindings -mv "$tmp" crates/eql-types/bindings -trap - EXIT +TS_RS_EXPORT_DIR="$tmp/bindings" EQL_TYPES_SCHEMA_DIR="$tmp/schema" cargo test -p eql-types +rm -rf crates/eql-types/bindings crates/eql-types/schema +mv "$tmp/bindings" crates/eql-types/bindings +mv "$tmp/schema" crates/eql-types/schema """ [tasks."types:check"] -description = "Verify the checked-in eql-types bindings/ are fresh (regenerate + git diff)" +description = "Verify the checked-in eql-types bindings/ and schema/ are fresh (regenerate + git diff)" dir = "{{config_root}}" depends = ["types:generate"] run = """ #!/usr/bin/env bash set -euo pipefail -git diff --exit-code -- crates/eql-types/bindings || { - echo "eql-types bindings/ are stale — run 'mise run types:generate' and commit the result" >&2 +git diff --exit-code -- crates/eql-types/bindings crates/eql-types/schema || { + echo "eql-types bindings/ or schema/ are stale — run 'mise run types:generate' and commit the result" >&2 exit 1 } # git diff is blind to brand-new files; untracked output is stale too. -untracked=$(git ls-files --others --exclude-standard -- crates/eql-types/bindings) +untracked=$(git ls-files --others --exclude-standard -- crates/eql-types/bindings crates/eql-types/schema) if [ -n "$untracked" ]; then echo "eql-types has uncommitted generated files:" >&2 echo "$untracked" >&2 From 68625e2d9cb64cfa823a3516ac3b3d9b16ff8e03 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 11 Jun 2026 16:41:14 +1000 Subject: [PATCH 200/599] test(eql-types): pin schema strictness per domain, not just required keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review finding: the schema parity gate checked only `required`, so a future token file losing #[serde(deny_unknown_fields)] or declaring v as a bare integer would regenerate a permissive schema that types:check commits as the new baseline — with behavioural spot checks existing for only 5 of 23 domains. schemas_are_strict now asserts, for every domain: additionalProperties: false at the root and on the nested Identifier, v $ref'ing the SchemaVersion definition, and that definition pinning const: EQL_SCHEMA_VERSION. Drilled: stripping deny_unknown_fields from DateEq fails the gate with the targeted message. --- crates/eql-types/tests/catalog_parity.rs | 55 +++++++++++++++++++++--- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index b068e5cf7..10b199d6a 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -1,15 +1,19 @@ //! The drift gate: the v3 domain inventory must mirror `eql-scalars::CATALOG` //! — the same catalog that generates the `eql_v3` SQL surface — exactly: -//! every domain, in catalog order, and every domain's wire keys, pinned -//! through the published JSON Schema (schemars `required` reflects the real -//! serde contract, so an `Option` term field or a wrong wire key fails -//! here). Per-type strictness (unknown-key rejection, envelope version) is -//! covered behaviourally in `tests/v3_conformance.rs`. +//! every domain, in catalog order, and every domain's wire contract, pinned +//! through the published JSON Schema. schemars output reflects the real +//! serde contract, so per domain this catches an `Option` term field or a +//! wrong wire key (`required`), a struct that lost +//! `#[serde(deny_unknown_fields)]` (`additionalProperties: false`), and a +//! `v` field that is not [`eql_types::SchemaVersion`] (the `$ref` and its +//! `const: 2`). Behavioural spot checks of the same properties live in +//! `tests/v3_conformance.rs`. use std::collections::BTreeSet; use eql_scalars::{Term, CATALOG, ENVELOPE_KEYS}; -use eql_types::v3; +use eql_types::{v3, EQL_SCHEMA_VERSION}; +use serde_json::{json, Value}; #[test] fn inventory_exactly_covers_catalog() { @@ -60,3 +64,42 @@ fn schema_required_keys_match_catalog_terms() { } } } + +/// Every published schema must be *strict*, not just complete: unknown keys +/// rejected at the root and inside the nested `Identifier`, and the `v` +/// property pinned to the `SchemaVersion` definition whose `const` is the +/// wire version. `required` alone (the test above) would stay green if a +/// struct lost `#[serde(deny_unknown_fields)]` or swapped `SchemaVersion` +/// for a bare integer — both regenerate a permissive schema that +/// `types:check` would happily commit as the new baseline. +#[test] +fn schemas_are_strict() { + for entry in v3::all() { + let name = entry.domain(); + let schema: Value = serde_json::to_value(entry.schema()) + .unwrap_or_else(|e| panic!("{name}: schema does not serialize: {e}")); + + assert_eq!( + schema.pointer("/additionalProperties"), + Some(&json!(false)), + "{name}: schema must set additionalProperties: false \ + (struct lost #[serde(deny_unknown_fields)]?)" + ); + assert_eq!( + schema.pointer("/definitions/Identifier/additionalProperties"), + Some(&json!(false)), + "{name}: Identifier definition must set additionalProperties: false" + ); + assert_eq!( + schema.pointer("/properties/v/allOf/0/$ref"), + Some(&json!("#/definitions/SchemaVersion")), + "{name}: the v property must $ref the SchemaVersion definition \ + (field declared as a bare integer instead of SchemaVersion?)" + ); + assert_eq!( + schema.pointer("/definitions/SchemaVersion/const"), + Some(&json!(EQL_SCHEMA_VERSION)), + "{name}: SchemaVersion must pin const: {EQL_SCHEMA_VERSION}" + ); + } +} From dd72cdc6a8d4628be4932103283f7ce32e14d3d9 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 16 Jun 2026 18:13:35 +1000 Subject: [PATCH 201/599] =?UTF-8?q?chore(eql-types):=20address=20#269=20re?= =?UTF-8?q?view=20=E2=80=94=20pin=20$id,=20flag=20manual-description=20dri?= =?UTF-8?q?ft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Factor the published schema `$id` into `DomainType::schema_id` (`{SCHEMA_ID_BASE}{domain}.json`); `tests/export.rs` now injects that single source of truth, and a new `schema_id_is_canonical` parity test pins the URL shape with independent literals (wrong host / dropped `v3/` / wrong domain now fails a test, not just the freshness diff). - Mark the `BloomFilter` and `SchemaVersion` doc comments as the canonical source for the descriptions their manual `JsonSchema` impls hand-copy, so the two can't silently drift (the derive copies doc comments automatically; these manual impls can't). Schema artifacts regenerate byte-identically (schema_id matches the old inline format) — verified via `mise run types:check`. --- crates/eql-types/src/lib.rs | 4 +++ crates/eql-types/src/v3/mod.rs | 12 ++++++++ crates/eql-types/src/v3/terms.rs | 4 +++ crates/eql-types/tests/catalog_parity.rs | 39 ++++++++++++++++++++++++ crates/eql-types/tests/export.rs | 15 ++++----- 5 files changed, 65 insertions(+), 9 deletions(-) diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index 82d1b5030..1f87f95ac 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -85,6 +85,10 @@ impl schemars::JsonSchema for SchemaVersion { instance_type: Some(schemars::schema::InstanceType::Integer.into()), const_value: Some(serde_json::json!(EQL_SCHEMA_VERSION)), metadata: Some(Box::new(schemars::schema::Metadata { + // KEEP IN SYNC with the `SchemaVersion` doc comment above — it + // is the canonical text. A derived `JsonSchema` would copy the + // doc comment automatically; this manual impl can't, so this + // hand-written copy must be updated alongside it. description: Some( "The envelope version field (`v`) — always exactly `2` on the wire.".to_owned(), ), diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index e2681bc68..deb3b297f 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -59,6 +59,11 @@ pub mod timestamptz; /// The PostgreSQL schema every domain in this module inhabits. pub const SQL_SCHEMA: &str = "eql_v3"; +/// Base URL for the canonical `$id` of every published v3 JSON Schema. +/// The per-domain `$id` is `{SCHEMA_ID_BASE}{domain}.json` (see +/// [`DomainType::schema_id`]); `tests/export.rs` injects it at write time. +pub const SCHEMA_ID_BASE: &str = "https://schemas.cipherstash.com/eql/v3/"; + /// One v3 domain type — implemented by every payload type, so any payload /// value can report the SQL domain it inhabits (`payload.sql_domain()`). /// @@ -91,6 +96,13 @@ pub trait DomainType { .expect("sql_domain must be qualified with the eql_v3 schema") } + /// Canonical `$id` for this domain's published JSON Schema — + /// `{SCHEMA_ID_BASE}{domain}.json`. The single source of truth for the + /// identity `tests/export.rs` injects; pinned by `tests/catalog_parity.rs`. + fn schema_id(&self) -> String { + format!("{SCHEMA_ID_BASE}{}.json", self.domain()) + } + /// The type's JSON Schema. fn schema(&self) -> RootSchema; } diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index 0c9e006bb..d12cfad4f 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -76,6 +76,10 @@ impl schemars::JsonSchema for BloomFilter { ..Default::default() })), metadata: Some(Box::new(Metadata { + // KEEP IN SYNC with the doc comment on `BloomFilter` above — it + // is the canonical text. A derived `JsonSchema` would copy the + // doc comment automatically; this manual impl can't, so this + // hand-written paraphrase must be updated alongside it. description: Some( "Bloom-filter match term — the `bf` wire key. Backs the `_match` \ domains (`@>`/`<@` containment). Signed i16: EQL stores the filter \ diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index 10b199d6a..465a51396 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -65,6 +65,45 @@ fn schema_required_keys_match_catalog_terms() { } } +/// The published `$id` is the schema's identity URL — `tests/export.rs` +/// injects [`v3::DomainType::schema_id`] into every written file. Pin its +/// shape with independent literals (NOT the helper, which would only test +/// itself): a regressed host, a dropped `v3/`, or a wrong domain segment must +/// turn a test red, not merely shift the freshness diff. +#[test] +fn schema_id_is_canonical() { + let entries = v3::all(); + let id_of = |domain: &str| { + entries + .iter() + .find(|e| e.domain() == domain) + .unwrap_or_else(|| panic!("no domain inventory entry for {domain}")) + .schema_id() + }; + + // Fully-literal anchors — no interpolation, so a typo in the helper's base + // URL or path cannot match. + assert_eq!( + id_of("int4_eq"), + "https://schemas.cipherstash.com/eql/v3/int4_eq.json" + ); + assert_eq!( + id_of("text_search"), + "https://schemas.cipherstash.com/eql/v3/text_search.json" + ); + + // Every domain follows the same canonical pattern. + for entry in &entries { + let id = entry.schema_id(); + let name = entry.domain(); + assert_eq!( + id, + format!("https://schemas.cipherstash.com/eql/v3/{name}.json"), + "{name}: $id must be the canonical eql/v3 URL" + ); + } +} + /// Every published schema must be *strict*, not just complete: unknown keys /// rejected at the root and inside the nested `Identifier`, and the `v` /// property pinned to the `SchemaVersion` definition whose `const` is the diff --git a/crates/eql-types/tests/export.rs b/crates/eql-types/tests/export.rs index 3fb4e2d3f..bb95244a1 100644 --- a/crates/eql-types/tests/export.rs +++ b/crates/eql-types/tests/export.rs @@ -18,15 +18,12 @@ fn dump_v3_json_schemas() { std::fs::create_dir_all(&dir).unwrap(); for entry in v3::all() { let mut schema = serde_json::to_value(entry.schema()).unwrap(); - // schemars 0.8 emits no $id; inject the canonical one. - schema.as_object_mut().unwrap().insert( - "$id".into(), - format!( - "https://schemas.cipherstash.com/eql/v3/{}.json", - entry.domain() - ) - .into(), - ); + // schemars 0.8 emits no $id; inject the canonical one (the URL format + // lives on DomainType::schema_id, pinned by tests/catalog_parity.rs). + schema + .as_object_mut() + .unwrap() + .insert("$id".into(), entry.schema_id().into()); std::fs::write( format!("{dir}/{}.json", entry.domain()), serde_json::to_string_pretty(&schema).unwrap(), From eb30ceb7d4d27c610589a2cec55db1d4002851a4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 16 Jun 2026 13:26:06 +1000 Subject: [PATCH 202/599] refactor(v3): rename ore_block_u64_8_256 -> ore_block_256 (SEM type, repo-wide) Behaviour-preserving rename of the self-contained eql_v3 SEM index-term type to its width-agnostic name, ahead of the N-block ORE comparator work. The eql_v2 public API (eql_v2.ore_block_u64_8_256, src/ore_block_u64_8_256/, v2 operators/docs/tests) is deliberately UNCHANGED. Scope (eql_v3 only): - src/v3/sem/ore_block_u64_8_256/ -> src/v3/sem/ore_block_256/ (dir + symbols) - eql-scalars Term::Ore ctor + REQUIRE paths; eql-codegen doc/assertion - committed codegen goldens (int2/int4/int8/date/text incl text_search) - eql-types: OreBlockU64_8_256 newtype -> OreBlock256, SQL constructor doc - tasks/pin_search_path.sql (v3 block only), splinter.sh (v3 rows only), clean_install_v3.sh, drop_operator_classes.sql (v3 opclass only) - v3 SQLx family tests (sem/mutations/inlinability), preserving the eql_v2.compare_ore_block_u64_8_256_terms parity reference in sem.rs - v3 docs (CLAUDE, adding-a-scalar, eql-functions, sql-support, analysis), CHANGELOG eql_v3-qualified mentions Covers the new old-name references introduced by #280 (text-search). Verified: codegen:parity (byte-for-byte), test:crates (fmt+clippy+tests), clean build + v3 release artifact carries no eql_v2 symbol. The DB-backed clean_install_v3 gate runs in CI (Docker unavailable locally). Deliberately NOT renamed: tests/sqlx/src/index_types.rs ORE_BLOCK_U64_8_256 (crypto wire index-term identifier, not the SQL type name). --- CHANGELOG.md | 4 +- CLAUDE.md | 6 +- crates/eql-codegen/src/context.rs | 2 +- crates/eql-codegen/src/generate.rs | 2 +- crates/eql-scalars/src/term.rs | 6 +- crates/eql-scalars/src/tests.rs | 10 +- crates/eql-types/README.md | 2 +- crates/eql-types/bindings/v3/DateOrd.ts | 4 +- crates/eql-types/bindings/v3/DateOrdOre.ts | 4 +- crates/eql-types/bindings/v3/Int2Ord.ts | 4 +- crates/eql-types/bindings/v3/Int2OrdOre.ts | 4 +- crates/eql-types/bindings/v3/Int4Ord.ts | 4 +- crates/eql-types/bindings/v3/Int4OrdOre.ts | 4 +- crates/eql-types/bindings/v3/Int8Ord.ts | 4 +- crates/eql-types/bindings/v3/Int8OrdOre.ts | 4 +- .../{OreBlockU64_8_256.ts => OreBlock256.ts} | 4 +- crates/eql-types/bindings/v3/TextOrd.ts | 4 +- crates/eql-types/bindings/v3/TextOrdOre.ts | 4 +- crates/eql-types/bindings/v3/TextSearch.ts | 4 +- crates/eql-types/schema/v3/date_ord.json | 6 +- crates/eql-types/schema/v3/date_ord_ore.json | 6 +- crates/eql-types/schema/v3/int2_ord.json | 6 +- crates/eql-types/schema/v3/int2_ord_ore.json | 6 +- crates/eql-types/schema/v3/int4_ord.json | 6 +- crates/eql-types/schema/v3/int4_ord_ore.json | 6 +- crates/eql-types/schema/v3/int8_ord.json | 6 +- crates/eql-types/schema/v3/int8_ord_ore.json | 6 +- crates/eql-types/schema/v3/text_ord.json | 6 +- crates/eql-types/schema/v3/text_ord_ore.json | 6 +- crates/eql-types/schema/v3/text_search.json | 6 +- crates/eql-types/src/v3/date.rs | 6 +- crates/eql-types/src/v3/int2.rs | 6 +- crates/eql-types/src/v3/int4.rs | 6 +- crates/eql-types/src/v3/int8.rs | 6 +- crates/eql-types/src/v3/terms.rs | 6 +- crates/eql-types/src/v3/text.rs | 8 +- .../adding-a-scalar-encrypted-domain-type.md | 12 +- docs/reference/eql-functions.md | 4 +- docs/reference/sql-support.md | 2 +- src/v3/schema.sql | 2 +- src/v3/sem/bloom_filter/functions.sql | 2 +- .../functions.sql | 56 +++--- .../operator_class.sql | 16 +- src/v3/sem/ore_block_256/operators.sql | 180 ++++++++++++++++++ .../types.sql | 8 +- src/v3/sem/ore_block_u64_8_256/operators.sql | 180 ------------------ tasks/pin_search_path.sql | 8 +- tasks/test/clean_install_v3.sh | 2 +- tasks/test/splinter.sh | 18 +- .../reference/date/date_ord_functions.sql | 10 +- .../reference/date/date_ord_ore_functions.sql | 10 +- .../reference/int2/int2_ord_functions.sql | 10 +- .../reference/int2/int2_ord_ore_functions.sql | 10 +- .../reference/int4/int4_ord_functions.sql | 10 +- .../reference/int4/int4_ord_ore_functions.sql | 10 +- .../reference/int8/int8_ord_functions.sql | 10 +- .../reference/int8/int8_ord_ore_functions.sql | 10 +- .../reference/text/text_ord_functions.sql | 10 +- .../reference/text/text_ord_ore_functions.sql | 10 +- .../reference/text/text_search_functions.sql | 10 +- tests/sqlx/fixtures/drop_operator_classes.sql | 4 +- .../encrypted_domain/family/inlinability.rs | 18 +- .../encrypted_domain/family/mutations.rs | 16 +- .../sqlx/tests/encrypted_domain/family/sem.rs | 105 +++++----- 64 files changed, 461 insertions(+), 466 deletions(-) rename crates/eql-types/bindings/v3/{OreBlockU64_8_256.ts => OreBlock256.ts} (81%) rename src/v3/sem/{ore_block_u64_8_256 => ore_block_256}/functions.sql (76%) rename src/v3/sem/{ore_block_u64_8_256 => ore_block_256}/operator_class.sql (53%) create mode 100644 src/v3/sem/ore_block_256/operators.sql rename src/v3/sem/{ore_block_u64_8_256 => ore_block_256}/types.sql (79%) delete mode 100644 src/v3/sem/ore_block_u64_8_256/operators.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 88814a49c..f60f4903d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,14 +23,14 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added - **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see `docs/decisions/2026-06-10-eql-v3-json-type-kind.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) -- **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_u64_8_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) +- **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) - **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) - **`eql_v3.timestamptz` encrypted-domain type family (equality-only).** Two jsonb-backed domains for encrypted `timestamptz` columns — `eql_v3.timestamptz` (storage-only) and `eql_v3.timestamptz_eq` (`=` / `<>` via HMAC) — generated from the `timestamptz` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast. Index via a functional index on the `eql_v3.eq_term` extractor, not an operator class on the domain. **Ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) is deferred:** cipherstash encrypts `Plaintext::Timestamp` at native 12-block ORE width, but EQL's only ORE comparator (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so ordered timestamptz domains would silently mis-order. There are no `eql_v3.timestamptz_ord` / `_ord_ore` domains and no timestamptz `MIN` / `MAX` aggregates until a wide-ORE (12-block) term lands — tracked in [#241](https://github.com/cipherstash/encrypt-query-language/issues/241). Why: a type-safe, equality-searchable encrypted UTC-timestamp column, stacking on the `date` temporal-scalar foundation; ordering follows once the comparator supports the native ciphertext width. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) -- **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) +- **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) ### Changed diff --git a/CLAUDE.md b/CLAUDE.md index 6005f72db..34149104b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -53,7 +53,7 @@ This project uses `mise` for task management. Common commands: This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for searchable encryption. Key architectural components: ### Core Structure -- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4` and future scalar domains) live in a separate `eql_v3` schema (see below). The `eql_v3` surface is **self-contained**: it owns its own copies of the searchable-encrypted-metadata (SEM) index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_u64_8_256`, hand-written under `src/v3/sem/`) and has no runtime dependency on `eql_v2`. `eql_v2` is unchanged and remains the documented public API. +- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4` and future scalar domains) live in a separate `eql_v3` schema (see below). The `eql_v3` surface is **self-contained**: it owns its own copies of the searchable-encrypted-metadata (SEM) index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, hand-written under `src/v3/sem/`) and has no runtime dependency on `eql_v2`. `eql_v2` is unchanged and remains the documented public API. - **Main Type**: `eql_v2_encrypted` - composite type for encrypted columns (stored as JSONB) - **Configuration**: `eql_v2_configuration` table tracks encryption configs - **Index Types**: Various encrypted index types (blake3, hmac_256, bloom_filter, ore variants) @@ -64,7 +64,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search - `src/operators/` - SQL operators for encrypted data comparisons - `src/config/` - Configuration management functions - `src/blake3/`, `src/hmac_256/`, `src/bloom_filter/`, `src/ore_*` - Index implementations -- `src/v3/` - Self-contained `eql_v3` surface: `src/v3/schema.sql`, forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_u64_8_256`), and the generated scalar encrypted-domain families under `src/v3/scalars//` (plus the shared blocker `src/v3/scalars/functions.sql`) +- `src/v3/` - Self-contained `eql_v3` surface: `src/v3/schema.sql`, forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_256`), and the generated scalar encrypted-domain families under `src/v3/scalars//` (plus the shared blocker `src/v3/scalars/functions.sql`) - `tasks/` - mise task scripts - `tests/sqlx/` - Rust/SQLx test framework (PostgreSQL 14-17 support) - `release/` - Generated SQL installation files @@ -78,7 +78,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_u64_8_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 15aeacc35..d5b928f32 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -133,7 +133,7 @@ pub struct FunctionsContext { /// Build the inlinable index-extractor entry for a domain term. /// /// The `RETURNS` type name equals the constructor name (`hmac_256`, -/// `ore_block_u64_8_256`); qualify it with `SCHEMA` — the same schema as the +/// `ore_block_256`); qualify it with `SCHEMA` — the same schema as the /// body's constructor call — so the declared return type and the call stay in /// lockstep. `Term::returns()` is intentionally not used. pub fn extractor_entry(term: Term) -> FnEntry { diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index af6c9cbca..49af8967d 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -468,7 +468,7 @@ mod tests { let sql = render_functions_file(s.token, domain(s, "_ord")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)")); - assert!(sql.contains("RETURNS eql_v3.ore_block_u64_8_256")); + assert!(sql.contains("RETURNS eql_v3.ore_block_256")); assert_eq!( sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") .count(), diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-scalars/src/term.rs index 461a17144..5db834b8f 100644 --- a/crates/eql-scalars/src/term.rs +++ b/crates/eql-scalars/src/term.rs @@ -28,7 +28,7 @@ impl Term { pub const fn ctor(self) -> &'static str { match self { Term::Hm => "hmac_256", - Term::Ore => "ore_block_u64_8_256", + Term::Ore => "ore_block_256", Term::Bloom => "bloom_filter", } } @@ -57,8 +57,8 @@ impl Term { match self { Term::Hm => &["src/v3/sem/hmac_256/functions.sql"], Term::Ore => &[ - "src/v3/sem/ore_block_u64_8_256/functions.sql", - "src/v3/sem/ore_block_u64_8_256/operators.sql", + "src/v3/sem/ore_block_256/functions.sql", + "src/v3/sem/ore_block_256/operators.sql", ], Term::Bloom => &["src/v3/sem/bloom_filter/functions.sql"], } diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 017de2174..853413375 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -193,14 +193,14 @@ mod term_tests { let ore = Term::Ore; assert_eq!(ore.json_key(), "ob"); assert_eq!(ore.extractor(), "ord_term"); - assert_eq!(ore.ctor(), "ore_block_u64_8_256"); + assert_eq!(ore.ctor(), "ore_block_256"); assert_eq!(ore.role(), Role::Ord); assert_eq!(ore.operators(), &["=", "<>", "<", "<=", ">", ">="]); assert_eq!( ore.requires(), &[ - "src/v3/sem/ore_block_u64_8_256/functions.sql", - "src/v3/sem/ore_block_u64_8_256/operators.sql", + "src/v3/sem/ore_block_256/functions.sql", + "src/v3/sem/ore_block_256/operators.sql", ] ); } @@ -277,8 +277,8 @@ mod term_helper_tests { assert_eq!( Term::term_requires(&[Term::Ore, Term::Ore, Term::Hm]), vec![ - "src/v3/sem/ore_block_u64_8_256/functions.sql", - "src/v3/sem/ore_block_u64_8_256/operators.sql", + "src/v3/sem/ore_block_256/functions.sql", + "src/v3/sem/ore_block_256/operators.sql", "src/v3/sem/hmac_256/functions.sql", ] ); diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index aff5f5f9c..a38d2d40f 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -34,7 +34,7 @@ Shared wire fields are reusable newtypes in |---------|----------|-------|-------| | `Ciphertext` | `c` | `String` | every domain (envelope) | | `Hmac256` | `hm` | `String` | `_eq` domains | -| `OreBlockU64_8_256` | `ob` | `Vec` | `_ord` / `_ord_ore` domains | +| `OreBlock256` | `ob` | `Vec` | `_ord` / `_ord_ore` domains | | `BloomFilter` | `bf` | `Vec` (signed!) | `_match` domains | Note "v3" names the SQL schema generation (`eql_v3.*`); the JSON envelope diff --git a/crates/eql-types/bindings/v3/DateOrd.ts b/crates/eql-types/bindings/v3/DateOrd.ts index c9ff2efd2..c81eb642a 100644 --- a/crates/eql-types/bindings/v3/DateOrd.ts +++ b/crates/eql-types/bindings/v3/DateOrd.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -24,4 +24,4 @@ c: Ciphertext, /** * Block-ORE order term. Serves equality too. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/DateOrdOre.ts b/crates/eql-types/bindings/v3/DateOrdOre.ts index ccf48568f..4baf81f67 100644 --- a/crates/eql-types/bindings/v3/DateOrdOre.ts +++ b/crates/eql-types/bindings/v3/DateOrdOre.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -24,4 +24,4 @@ c: Ciphertext, /** * Block-ORE order term. Serves equality too. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Int2Ord.ts b/crates/eql-types/bindings/v3/Int2Ord.ts index 1cf345dde..38e23008e 100644 --- a/crates/eql-types/bindings/v3/Int2Ord.ts +++ b/crates/eql-types/bindings/v3/Int2Ord.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -24,4 +24,4 @@ c: Ciphertext, /** * Block-ORE order term. Serves equality too. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Int2OrdOre.ts b/crates/eql-types/bindings/v3/Int2OrdOre.ts index 3e3f5464f..1193826a4 100644 --- a/crates/eql-types/bindings/v3/Int2OrdOre.ts +++ b/crates/eql-types/bindings/v3/Int2OrdOre.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -24,4 +24,4 @@ c: Ciphertext, /** * Block-ORE order term. Serves equality too. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Int4Ord.ts b/crates/eql-types/bindings/v3/Int4Ord.ts index 6463698f8..ee25c6707 100644 --- a/crates/eql-types/bindings/v3/Int4Ord.ts +++ b/crates/eql-types/bindings/v3/Int4Ord.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -24,4 +24,4 @@ c: Ciphertext, /** * Block-ORE order term. Serves equality too. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Int4OrdOre.ts b/crates/eql-types/bindings/v3/Int4OrdOre.ts index 54e05a761..17be0f8e3 100644 --- a/crates/eql-types/bindings/v3/Int4OrdOre.ts +++ b/crates/eql-types/bindings/v3/Int4OrdOre.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -26,4 +26,4 @@ c: Ciphertext, * Block-ORE order term. Serves equality too — ORE over a * full-domain `int4` is lossless, so no separate `hm` is carried. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Int8Ord.ts b/crates/eql-types/bindings/v3/Int8Ord.ts index 97abe2e0d..7199defdb 100644 --- a/crates/eql-types/bindings/v3/Int8Ord.ts +++ b/crates/eql-types/bindings/v3/Int8Ord.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -24,4 +24,4 @@ c: Ciphertext, /** * Block-ORE order term. Serves equality too. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Int8OrdOre.ts b/crates/eql-types/bindings/v3/Int8OrdOre.ts index 38f5c435a..6dd492db2 100644 --- a/crates/eql-types/bindings/v3/Int8OrdOre.ts +++ b/crates/eql-types/bindings/v3/Int8OrdOre.ts @@ -1,7 +1,7 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. import type { Ciphertext } from "./Ciphertext"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -24,4 +24,4 @@ c: Ciphertext, /** * Block-ORE order term. Serves equality too. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts b/crates/eql-types/bindings/v3/OreBlock256.ts similarity index 81% rename from crates/eql-types/bindings/v3/OreBlockU64_8_256.ts rename to crates/eql-types/bindings/v3/OreBlock256.ts index 5701b17fb..0361c1ed2 100644 --- a/crates/eql-types/bindings/v3/OreBlockU64_8_256.ts +++ b/crates/eql-types/bindings/v3/OreBlock256.ts @@ -4,6 +4,6 @@ * Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the * `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless * over the scalar's domain, so it serves equality too. SQL-side constructor: - * `eql_v3.ore_block_u64_8_256`. + * `eql_v3.ore_block_256`. */ -export type OreBlockU64_8_256 = Array; +export type OreBlock256 = Array; diff --git a/crates/eql-types/bindings/v3/TextOrd.ts b/crates/eql-types/bindings/v3/TextOrd.ts index a5fefcd03..e3e1de7d6 100644 --- a/crates/eql-types/bindings/v3/TextOrd.ts +++ b/crates/eql-types/bindings/v3/TextOrd.ts @@ -2,7 +2,7 @@ import type { Ciphertext } from "./Ciphertext"; import type { Hmac256 } from "./Hmac256"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -31,4 +31,4 @@ hm: Hmac256, /** * Block-ORE order term. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/TextOrdOre.ts b/crates/eql-types/bindings/v3/TextOrdOre.ts index 1f427cdec..7aed3dd52 100644 --- a/crates/eql-types/bindings/v3/TextOrdOre.ts +++ b/crates/eql-types/bindings/v3/TextOrdOre.ts @@ -2,7 +2,7 @@ import type { Ciphertext } from "./Ciphertext"; import type { Hmac256 } from "./Hmac256"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -32,4 +32,4 @@ hm: Hmac256, /** * Block-ORE order term. */ -ob: OreBlockU64_8_256, }; +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/TextSearch.ts b/crates/eql-types/bindings/v3/TextSearch.ts index 51b296eab..e95709378 100644 --- a/crates/eql-types/bindings/v3/TextSearch.ts +++ b/crates/eql-types/bindings/v3/TextSearch.ts @@ -3,7 +3,7 @@ import type { BloomFilter } from "./BloomFilter"; import type { Ciphertext } from "./Ciphertext"; import type { Hmac256 } from "./Hmac256"; import type { Identifier } from "./Identifier"; -import type { OreBlockU64_8_256 } from "./OreBlockU64_8_256"; +import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** @@ -32,7 +32,7 @@ hm: Hmac256, /** * Block-ORE order term. */ -ob: OreBlockU64_8_256, +ob: OreBlock256, /** * Bloom-filter match term (signed smallint bit positions). */ diff --git a/crates/eql-types/schema/v3/date_ord.json b/crates/eql-types/schema/v3/date_ord.json index 03315ea1f..3e5e3ad17 100644 --- a/crates/eql-types/schema/v3/date_ord.json +++ b/crates/eql-types/schema/v3/date_ord.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too." diff --git a/crates/eql-types/schema/v3/date_ord_ore.json b/crates/eql-types/schema/v3/date_ord_ore.json index dfff74031..5d4189362 100644 --- a/crates/eql-types/schema/v3/date_ord_ore.json +++ b/crates/eql-types/schema/v3/date_ord_ore.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too." diff --git a/crates/eql-types/schema/v3/int2_ord.json b/crates/eql-types/schema/v3/int2_ord.json index 5073b3a40..ac9c8333e 100644 --- a/crates/eql-types/schema/v3/int2_ord.json +++ b/crates/eql-types/schema/v3/int2_ord.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too." diff --git a/crates/eql-types/schema/v3/int2_ord_ore.json b/crates/eql-types/schema/v3/int2_ord_ore.json index 83b375876..fa294b308 100644 --- a/crates/eql-types/schema/v3/int2_ord_ore.json +++ b/crates/eql-types/schema/v3/int2_ord_ore.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too." diff --git a/crates/eql-types/schema/v3/int4_ord.json b/crates/eql-types/schema/v3/int4_ord.json index cbacaa324..847ee38e2 100644 --- a/crates/eql-types/schema/v3/int4_ord.json +++ b/crates/eql-types/schema/v3/int4_ord.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too." diff --git a/crates/eql-types/schema/v3/int4_ord_ore.json b/crates/eql-types/schema/v3/int4_ord_ore.json index b8cdb95f9..89b5bc205 100644 --- a/crates/eql-types/schema/v3/int4_ord_ore.json +++ b/crates/eql-types/schema/v3/int4_ord_ore.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too — ORE over a full-domain `int4` is lossless, so no separate `hm` is carried." diff --git a/crates/eql-types/schema/v3/int8_ord.json b/crates/eql-types/schema/v3/int8_ord.json index 9adc8520e..e16021472 100644 --- a/crates/eql-types/schema/v3/int8_ord.json +++ b/crates/eql-types/schema/v3/int8_ord.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too." diff --git a/crates/eql-types/schema/v3/int8_ord_ore.json b/crates/eql-types/schema/v3/int8_ord_ore.json index 174e68af7..cbe486560 100644 --- a/crates/eql-types/schema/v3/int8_ord_ore.json +++ b/crates/eql-types/schema/v3/int8_ord_ore.json @@ -26,8 +26,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -60,7 +60,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term. Serves equality too." diff --git a/crates/eql-types/schema/v3/text_ord.json b/crates/eql-types/schema/v3/text_ord.json index 6b059e2ae..4f2306ae5 100644 --- a/crates/eql-types/schema/v3/text_ord.json +++ b/crates/eql-types/schema/v3/text_ord.json @@ -30,8 +30,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -72,7 +72,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term." diff --git a/crates/eql-types/schema/v3/text_ord_ore.json b/crates/eql-types/schema/v3/text_ord_ore.json index d4899142b..848c37743 100644 --- a/crates/eql-types/schema/v3/text_ord_ore.json +++ b/crates/eql-types/schema/v3/text_ord_ore.json @@ -30,8 +30,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -72,7 +72,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term." diff --git a/crates/eql-types/schema/v3/text_search.json b/crates/eql-types/schema/v3/text_search.json index 87188f4b3..ea7b2ce12 100644 --- a/crates/eql-types/schema/v3/text_search.json +++ b/crates/eql-types/schema/v3/text_search.json @@ -40,8 +40,8 @@ ], "type": "object" }, - "OreBlockU64_8_256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_u64_8_256`.", + "OreBlock256": { + "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -90,7 +90,7 @@ "ob": { "allOf": [ { - "$ref": "#/definitions/OreBlockU64_8_256" + "$ref": "#/definitions/OreBlock256" } ], "description": "Block-ORE order term." diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-types/src/v3/date.rs index ffd0bbbb9..1da37028f 100644 --- a/crates/eql-types/src/v3/date.rs +++ b/crates/eql-types/src/v3/date.rs @@ -5,7 +5,7 @@ use schemars::{schema::RootSchema, schema_for}; -use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use schemars::JsonSchema; @@ -83,7 +83,7 @@ pub struct DateOrdOre { /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for DateOrdOre { @@ -113,7 +113,7 @@ pub struct DateOrd { /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for DateOrd { diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-types/src/v3/int2.rs index 8e2fc939c..6ee64e5af 100644 --- a/crates/eql-types/src/v3/int2.rs +++ b/crates/eql-types/src/v3/int2.rs @@ -3,7 +3,7 @@ use schemars::{schema::RootSchema, schema_for}; -use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use schemars::JsonSchema; @@ -81,7 +81,7 @@ pub struct Int2OrdOre { /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for Int2OrdOre { @@ -111,7 +111,7 @@ pub struct Int2Ord { /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for Int2Ord { diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-types/src/v3/int4.rs index 752ddbf1b..74296f495 100644 --- a/crates/eql-types/src/v3/int4.rs +++ b/crates/eql-types/src/v3/int4.rs @@ -9,7 +9,7 @@ use schemars::{schema::RootSchema, schema_for}; -use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use schemars::JsonSchema; @@ -89,7 +89,7 @@ pub struct Int4OrdOre { pub c: Ciphertext, /// Block-ORE order term. Serves equality too — ORE over a /// full-domain `int4` is lossless, so no separate `hm` is carried. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for Int4OrdOre { @@ -119,7 +119,7 @@ pub struct Int4Ord { /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for Int4Ord { diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-types/src/v3/int8.rs index ea0f57148..0bd46fd29 100644 --- a/crates/eql-types/src/v3/int8.rs +++ b/crates/eql-types/src/v3/int8.rs @@ -3,7 +3,7 @@ use schemars::{schema::RootSchema, schema_for}; -use crate::v3::terms::{Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use schemars::JsonSchema; @@ -81,7 +81,7 @@ pub struct Int8OrdOre { /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for Int8OrdOre { @@ -111,7 +111,7 @@ pub struct Int8Ord { /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, /// Block-ORE order term. Serves equality too. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for Int8Ord { diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index d12cfad4f..086dd0907 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -31,10 +31,10 @@ pub struct Hmac256(pub String); /// Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the /// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless /// over the scalar's domain, so it serves equality too. SQL-side constructor: -/// `eql_v3.ore_block_u64_8_256`. +/// `eql_v3.ore_block_256`. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] -pub struct OreBlockU64_8_256(pub Vec); +pub struct OreBlock256(pub Vec); /// Bloom-filter match term — the `bf` wire key. Backs the `_match` domains /// (`@>`/`<@` containment). @@ -107,7 +107,7 @@ impl From for Hmac256 { } } -impl From> for OreBlockU64_8_256 { +impl From> for OreBlock256 { fn from(value: Vec) -> Self { Self(value) } diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-types/src/v3/text.rs index a0008947a..2d6b05987 100644 --- a/crates/eql-types/src/v3/text.rs +++ b/crates/eql-types/src/v3/text.rs @@ -4,7 +4,7 @@ use schemars::{schema::RootSchema, schema_for}; -use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlockU64_8_256}; +use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use schemars::JsonSchema; @@ -117,7 +117,7 @@ pub struct TextOrdOre { /// HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. pub hm: Hmac256, /// Block-ORE order term. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for TextOrdOre { @@ -151,7 +151,7 @@ pub struct TextOrd { /// HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. pub hm: Hmac256, /// Block-ORE order term. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, } impl DomainType for TextOrd { @@ -185,7 +185,7 @@ pub struct TextSearch { /// HMAC-SHA-256 equality term. pub hm: Hmac256, /// Block-ORE order term. - pub ob: OreBlockU64_8_256, + pub ob: OreBlock256, /// Bloom-filter match term (signed smallint bit positions). pub bf: BloomFilter, } diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 6c760f4fe..76d987dcd 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -13,7 +13,7 @@ A scalar encrypted-domain type is a family of concrete `jsonb` domains in the an `eql_v2` uninstall. Their extractors, comparison wrappers, and MIN/MAX aggregates also live in `eql_v3`; the searchable-encrypted-metadata (SEM) index-term types they return (`eql_v3.hmac_256`, -`eql_v3.ore_block_u64_8_256`) are **also `eql_v3`** — hand-written under +`eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/`. The whole v3 surface is self-contained: it owns every type it needs and has no runtime dependency on `eql_v2` (CI gates this — see §6). @@ -124,7 +124,7 @@ behaviour change, not a refactor: | Term | JSON key | Extractor | Returns | Operators | | ------- | -------- | ------------ | -------------------------------- | -------------------------- | | `Hm` | `hm` | `eq_term` | `eql_v3.hmac_256` | `=` `<>` | -| `Ore` | `ob` | `ord_term` | `eql_v3.ore_block_u64_8_256` | `=` `<>` `<` `<=` `>` `>=` | +| `Ore` | `ob` | `ord_term` | `eql_v3.ore_block_256` | `=` `<>` `<` `<=` `>` `>=` | | `Bloom` | `bf` | `match_term` | `eql_v3.bloom_filter` | `@>` `<@` | A type that needs a non-ORE equality term on an ordered domain needs a **new @@ -558,8 +558,8 @@ CREATE INDEX ... ON table_name USING btree (eql_v3.ord_term(col)); CREATE INDEX ... ON table_name USING hash (eql_v3.eq_term(col)); ``` -`ore` depends on `src/v3/sem/ore_block_u64_8_256/functions.sql` and -`src/v3/sem/ore_block_u64_8_256/operators.sql`; `hm` depends on +`ore` depends on `src/v3/sem/ore_block_256/functions.sql` and +`src/v3/sem/ore_block_256/operators.sql`; `hm` depends on `src/v3/sem/hmac_256/functions.sql`. ### Extension files @@ -623,7 +623,7 @@ edits: extractor names (`eq`, `neq`, `lt`, `lte`, `gt`, `gte`, `eq_term`, `ord_term`, the `Bloom` term's `match_term` extractor and its `contains` / `contained_by` containment wrappers) plus the generated `min` / `max` aggregates and the SEM - `hmac_256` / `ore_block_u64_8_256` / `bloom_filter` constructors are already + `hmac_256` / `ore_block_256` / `bloom_filter` constructors are already covered by `eql_v3`-schema entries. A new scalar type inherits coverage; **a new term needs splinter entries for each new name it introduces — both its extractor and its comparison wrappers** (adding `Bloom` required `match_term`, @@ -665,7 +665,7 @@ recognises exactly these two forms; any other argument is a usage error. The generator targets the `eql_v3` schema throughout: `SCHEMA = "eql_v3"` (`crates/eql-codegen/src/consts.rs`) qualifies both the domain families and the SEM index-term types the extractors return (`eql_v3.hmac_256`, -`eql_v3.ore_block_u64_8_256`), so no generated SQL references `eql_v2`. +`eql_v3.ore_block_256`), so no generated SQL references `eql_v2`. `tasks/build.sh` runs `cargo run -p eql-codegen` at the start of every `mise run build`, so the generated SQL is never checked in. (The build first sweeps every diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index b610349cb..91c4013f2 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -435,8 +435,8 @@ SEM index-term types. ```sql -- int4 — generated for every scalar type's eq / ord variants. eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v3.hmac_256 -eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v3.ore_block_u64_8_256 -eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v3.ore_block_u64_8_256 +eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v3.ore_block_256 +eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v3.ore_block_256 ``` **Example:** diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index 82770ad9b..9cd7e5449 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -61,7 +61,7 @@ Use the equivalent [`jsonb_path_query`](#jsonb-functions-and-selectors-enabled-b ## Encrypted-domain scalar types (`eql_v3.`) -Scalar encrypted-domain types (e.g. `eql_v3.int4`; see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types are the self-contained `eql_v3` SEM types (`eql_v3.hmac_256`, `eql_v3.ore_block_u64_8_256`). +Scalar encrypted-domain types (e.g. `eql_v3.int4`; see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types are the self-contained `eql_v3` SEM types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`). Each scalar type `` generates one storage-only variant plus eq/ord query variants: diff --git a/src/v3/schema.sql b/src/v3/schema.sql index 41be4d404..7ec2f51f2 100644 --- a/src/v3/schema.sql +++ b/src/v3/schema.sql @@ -4,7 +4,7 @@ --! Creates the eql_v3 schema, which houses the self-contained encrypted-domain --! type families (eql_v3.int4, eql_v3.int8, and future scalar domains): their --! jsonb-backed domains, the searchable-encrypted-metadata (SEM) index-term ---! types they use (eql_v3.hmac_256, eql_v3.ore_block_u64_8_256), the index-term +--! types they use (eql_v3.hmac_256, eql_v3.ore_block_256), the index-term --! extractors, comparison wrappers, blockers, and aggregates. The v3 surface is --! self-contained — it owns every type it needs and has no runtime dependency --! on another EQL schema. diff --git a/src/v3/sem/bloom_filter/functions.sql b/src/v3/sem/bloom_filter/functions.sql index 291ba736d..d4c782c53 100644 --- a/src/v3/sem/bloom_filter/functions.sql +++ b/src/v3/sem/bloom_filter/functions.sql @@ -16,7 +16,7 @@ --! @return boolean True when the `bf` key is present and non-null. --! --! @internal Defined for parity with the eql_v3 SEM index-term predicates ---! (`has_hmac_256` / `has_ore_block_u64_8_256`); it is not currently called by +--! (`has_hmac_256` / `has_ore_block_256`); it is not currently called by --! the extractor below, which gates on value-shape inline, nor by the generated --! domain CHECK, which tests `bf` presence via the envelope-key skeleton. Kept --! as the canonical presence test for callers that need one. diff --git a/src/v3/sem/ore_block_u64_8_256/functions.sql b/src/v3/sem/ore_block_256/functions.sql similarity index 76% rename from src/v3/sem/ore_block_u64_8_256/functions.sql rename to src/v3/sem/ore_block_256/functions.sql index 2a13ef317..7d5bce885 100644 --- a/src/v3/sem/ore_block_u64_8_256/functions.sql +++ b/src/v3/sem/ore_block_256/functions.sql @@ -1,12 +1,12 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/crypto.sql -- REQUIRE: src/v3/common.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/types.sql +-- REQUIRE: src/v3/sem/ore_block_256/types.sql ---! @file v3/sem/ore_block_u64_8_256/functions.sql +--! @file v3/sem/ore_block_256/functions.sql --! @brief ORE block construction, extraction, and comparison (eql_v3 SEM). --! ---! jsonb-only subset of src/ore_block_u64_8_256/functions.sql. The +--! jsonb-only subset of src/ore_block_256/functions.sql. The --! encrypted-column overloads are omitted; the helper jsonb_array_to_bytea_array --! and pgcrypto encrypt() are reached via the forked src/v3/common.sql and --! src/v3/crypto.sql so the whole closure stays under src/v3. (Doc comments @@ -16,7 +16,7 @@ --! @brief Convert JSONB array to ORE block composite type --! @internal --! @param val jsonb Array of hex-encoded ORE block terms ---! @return eql_v3.ore_block_u64_8_256 ORE block composite, or NULL if input is null +--! @return eql_v3.ore_block_256 ORE block composite, or NULL if input is null --! @note Inlinable `LANGUAGE sql` IMMUTABLE form (no `SET search_path`) so the --! planner can fold this per-encrypted-value helper into the calling query. --! This deliberately diverges from the v2 plpgsql equivalent (intentionally @@ -25,15 +25,15 @@ --! NULL here instead of raising. The sole caller passes `val->'ob'`, always an --! array or JSON null, so the divergence is unreachable in practice; JSON null --! and empty array still return NULL exactly as before. -CREATE FUNCTION eql_v3.jsonb_array_to_ore_block_u64_8_256(val jsonb) -RETURNS eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.jsonb_array_to_ore_block_256(val jsonb) +RETURNS eql_v3.ore_block_256 IMMUTABLE AS $$ SELECT CASE WHEN jsonb_typeof(val) = 'array' THEN ROW(( - SELECT array_agg(ROW(b)::eql_v3.ore_block_u64_8_256_term) + SELECT array_agg(ROW(b)::eql_v3.ore_block_256_term) FROM unnest(eql_v3.jsonb_array_to_bytea_array(val)) AS b - ))::eql_v3.ore_block_u64_8_256 + ))::eql_v3.ore_block_256 ELSE NULL END; $$ LANGUAGE sql; @@ -43,24 +43,24 @@ $$ LANGUAGE sql; --! SQL-function inlining. It takes a bare `jsonb` arg (not a jsonb-backed --! encrypted DOMAIN), so the structural skip in tasks/pin_search_path.sql does --! not recognise it; this marker is the documented manual opt-in. -COMMENT ON FUNCTION eql_v3.jsonb_array_to_ore_block_u64_8_256(jsonb) IS +COMMENT ON FUNCTION eql_v3.jsonb_array_to_ore_block_256(jsonb) IS 'eql-inline-critical: per-encrypted-value ORE helper; must stay inlinable (unpinned search_path)'; --! @brief Extract ORE block index term from JSONB payload --! @param val jsonb containing encrypted EQL payload ---! @return eql_v3.ore_block_u64_8_256 ORE block index term +--! @return eql_v3.ore_block_256 ORE block index term --! @throws Exception if 'ob' field is missing -CREATE FUNCTION eql_v3.ore_block_u64_8_256(val jsonb) - RETURNS eql_v3.ore_block_u64_8_256 +CREATE FUNCTION eql_v3.ore_block_256(val jsonb) + RETURNS eql_v3.ore_block_256 IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN -- Declared STRICT: PostgreSQL returns NULL for a NULL argument without -- entering the body, so no explicit `val IS NULL` guard is needed. - IF eql_v3.has_ore_block_u64_8_256(val) THEN - RETURN eql_v3.jsonb_array_to_ore_block_u64_8_256(val->'ob'); + IF eql_v3.has_ore_block_256(val) THEN + RETURN eql_v3.jsonb_array_to_ore_block_256(val->'ob'); END IF; RAISE 'Expected an ore index (ob) value in json: %', val; END; @@ -70,7 +70,7 @@ $$ LANGUAGE plpgsql; --! @brief Check if JSONB payload contains ORE block index term --! @param val jsonb containing encrypted EQL payload --! @return boolean True if 'ob' field is present and non-null -CREATE FUNCTION eql_v3.has_ore_block_u64_8_256(val jsonb) +CREATE FUNCTION eql_v3.has_ore_block_256(val jsonb) RETURNS boolean IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public @@ -83,18 +83,18 @@ $$ LANGUAGE plpgsql; --! @brief Compare two ORE block terms using cryptographic comparison --! @internal ---! @param a eql_v3.ore_block_u64_8_256_term First ORE term ---! @param b eql_v3.ore_block_u64_8_256_term Second ORE term +--! @param a eql_v3.ore_block_256_term First ORE term +--! @param b eql_v3.ore_block_256_term Second ORE term --! @return integer -1 if a < b, 0 if a = b, 1 if a > b --! @throws Exception if ciphertexts are different lengths ---! @note Marked `IMMUTABLE` (the three `compare_ore_block_u64_8_256_term(s)` +--! @note Marked `IMMUTABLE` (the three `compare_ore_block_256_term(s)` --! overloads all are). This deliberately diverges from the v2 originals, --! which carry no volatility marker and so default to `VOLATILE`. The --! comparison is deterministic — its only crypto call, pgcrypto `encrypt()`, --! is itself `IMMUTABLE STRICT PARALLEL SAFE` — so `IMMUTABLE` lets the --! planner fold/cache these in ordering and index contexts. NOT `STRICT`: --! the NULL-handling branches below are load-bearing for the array overload. -CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_term(a eql_v3.ore_block_u64_8_256_term, b eql_v3.ore_block_u64_8_256_term) +CREATE FUNCTION eql_v3.compare_ore_block_256_term(a eql_v3.ore_block_256_term, b eql_v3.ore_block_256_term) RETURNS integer IMMUTABLE SET search_path = pg_catalog, extensions, public @@ -170,10 +170,10 @@ $$ LANGUAGE plpgsql; --! @brief Compare arrays of ORE block terms recursively --! @internal ---! @param a eql_v3.ore_block_u64_8_256_term[] First array ---! @param b eql_v3.ore_block_u64_8_256_term[] Second array +--! @param a eql_v3.ore_block_256_term[] First array +--! @param b eql_v3.ore_block_256_term[] Second array --! @return integer -1/0/1, or NULL if either array is NULL -CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256_term[], b eql_v3.ore_block_u64_8_256_term[]) +CREATE FUNCTION eql_v3.compare_ore_block_256_terms(a eql_v3.ore_block_256_term[], b eql_v3.ore_block_256_term[]) RETURNS integer IMMUTABLE SET search_path = pg_catalog, extensions, public @@ -197,10 +197,10 @@ AS $$ RETURN 1; END IF; - cmp_result := eql_v3.compare_ore_block_u64_8_256_term(a[1], b[1]); + cmp_result := eql_v3.compare_ore_block_256_term(a[1], b[1]); IF cmp_result = 0 THEN - RETURN eql_v3.compare_ore_block_u64_8_256_terms(a[2:array_length(a,1)], b[2:array_length(b,1)]); + RETURN eql_v3.compare_ore_block_256_terms(a[2:array_length(a,1)], b[2:array_length(b,1)]); END IF; RETURN cmp_result; @@ -210,15 +210,15 @@ $$ LANGUAGE plpgsql; --! @brief Compare ORE block composite types --! @internal ---! @param a eql_v3.ore_block_u64_8_256 First ORE block ---! @param b eql_v3.ore_block_u64_8_256 Second ORE block +--! @param a eql_v3.ore_block_256 First ORE block +--! @param b eql_v3.ore_block_256 Second ORE block --! @return integer -1/0/1 -CREATE FUNCTION eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) +CREATE FUNCTION eql_v3.compare_ore_block_256_terms(a eql_v3.ore_block_256, b eql_v3.ore_block_256) RETURNS integer IMMUTABLE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN eql_v3.compare_ore_block_u64_8_256_terms(a.terms, b.terms); + RETURN eql_v3.compare_ore_block_256_terms(a.terms, b.terms); END $$ LANGUAGE plpgsql; diff --git a/src/v3/sem/ore_block_u64_8_256/operator_class.sql b/src/v3/sem/ore_block_256/operator_class.sql similarity index 53% rename from src/v3/sem/ore_block_u64_8_256/operator_class.sql rename to src/v3/sem/ore_block_256/operator_class.sql index b367c8f67..04018d318 100644 --- a/src/v3/sem/ore_block_u64_8_256/operator_class.sql +++ b/src/v3/sem/ore_block_256/operator_class.sql @@ -1,9 +1,9 @@ -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/types.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/types.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql ---! @file v3/sem/ore_block_u64_8_256/operator_class.sql ---! @brief B-tree operator family + default class on eql_v3.ore_block_u64_8_256. +--! @file v3/sem/ore_block_256/operator_class.sql +--! @brief B-tree operator family + default class on eql_v3.ore_block_256. --! --! Gives the composite type its DEFAULT btree opclass so the recommended --! functional index `CREATE INDEX ON t (eql_v3.ord_term(col))` engages without @@ -11,16 +11,16 @@ --! variant by the `**/*operator_class.sql` glob. --! @brief B-tree operator family for ORE block types -CREATE OPERATOR FAMILY eql_v3.ore_block_u64_8_256_operator_family USING btree; +CREATE OPERATOR FAMILY eql_v3.ore_block_256_operator_family USING btree; --! @brief B-tree operator class for ORE block encrypted values --! --! Supports operators: <, <=, =, >=, >. Uses comparison function ---! compare_ore_block_u64_8_256_terms. -CREATE OPERATOR CLASS eql_v3.ore_block_u64_8_256_operator_class DEFAULT FOR TYPE eql_v3.ore_block_u64_8_256 USING btree FAMILY eql_v3.ore_block_u64_8_256_operator_family AS +--! compare_ore_block_256_terms. +CREATE OPERATOR CLASS eql_v3.ore_block_256_operator_class DEFAULT FOR TYPE eql_v3.ore_block_256 USING btree FAMILY eql_v3.ore_block_256_operator_family AS OPERATOR 1 <, OPERATOR 2 <=, OPERATOR 3 =, OPERATOR 4 >=, OPERATOR 5 >, - FUNCTION 1 eql_v3.compare_ore_block_u64_8_256_terms(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256); + FUNCTION 1 eql_v3.compare_ore_block_256_terms(a eql_v3.ore_block_256, b eql_v3.ore_block_256); diff --git a/src/v3/sem/ore_block_256/operators.sql b/src/v3/sem/ore_block_256/operators.sql new file mode 100644 index 000000000..525ecc943 --- /dev/null +++ b/src/v3/sem/ore_block_256/operators.sql @@ -0,0 +1,180 @@ +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/sem/ore_block_256/types.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql + +--! @file v3/sem/ore_block_256/operators.sql +--! @brief Comparison operators on eql_v3.ore_block_256. +--! +--! The six backing functions are inlinable single-statement SQL so the planner +--! can fold the eql_v3 comparison wrappers through to functional-index matching. + +--! @brief Equality backing function for ORE block types +--! @internal +--! +--! @param a eql_v3.ore_block_256 Left operand +--! @param b eql_v3.ore_block_256 Right operand +--! @return boolean True if the ORE blocks are equal +--! +--! @see eql_v3.compare_ore_block_256_terms +CREATE FUNCTION eql_v3.ore_block_256_eq(a eql_v3.ore_block_256, b eql_v3.ore_block_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_256_terms(a, b) = 0 +$$; + +--! @brief Not-equal backing function for ORE block types +--! @internal +--! +--! @param a eql_v3.ore_block_256 Left operand +--! @param b eql_v3.ore_block_256 Right operand +--! @return boolean True if the ORE blocks are not equal +--! +--! @see eql_v3.compare_ore_block_256_terms +CREATE FUNCTION eql_v3.ore_block_256_neq(a eql_v3.ore_block_256, b eql_v3.ore_block_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_256_terms(a, b) <> 0 +$$; + +--! @brief Less-than backing function for ORE block types +--! @internal +--! +--! @param a eql_v3.ore_block_256 Left operand +--! @param b eql_v3.ore_block_256 Right operand +--! @return boolean True if the left operand is less than the right operand +--! +--! @see eql_v3.compare_ore_block_256_terms +CREATE FUNCTION eql_v3.ore_block_256_lt(a eql_v3.ore_block_256, b eql_v3.ore_block_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_256_terms(a, b) = -1 +$$; + +--! @brief Less-than-or-equal backing function for ORE block types +--! @internal +--! +--! @param a eql_v3.ore_block_256 Left operand +--! @param b eql_v3.ore_block_256 Right operand +--! @return boolean True if the left operand is less than or equal to the right operand +--! +--! @see eql_v3.compare_ore_block_256_terms +CREATE FUNCTION eql_v3.ore_block_256_lte(a eql_v3.ore_block_256, b eql_v3.ore_block_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_256_terms(a, b) != 1 +$$; + +--! @brief Greater-than backing function for ORE block types +--! @internal +--! +--! @param a eql_v3.ore_block_256 Left operand +--! @param b eql_v3.ore_block_256 Right operand +--! @return boolean True if the left operand is greater than the right operand +--! +--! @see eql_v3.compare_ore_block_256_terms +CREATE FUNCTION eql_v3.ore_block_256_gt(a eql_v3.ore_block_256, b eql_v3.ore_block_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_256_terms(a, b) = 1 +$$; + +--! @brief Greater-than-or-equal backing function for ORE block types +--! @internal +--! +--! @param a eql_v3.ore_block_256 Left operand +--! @param b eql_v3.ore_block_256 Right operand +--! @return boolean True if the left operand is greater than or equal to the right operand +--! +--! @see eql_v3.compare_ore_block_256_terms +CREATE FUNCTION eql_v3.ore_block_256_gte(a eql_v3.ore_block_256, b eql_v3.ore_block_256) +RETURNS boolean + LANGUAGE sql + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT eql_v3.compare_ore_block_256_terms(a, b) != -1 +$$; + + +--! @brief = operator for ORE block types +--! +--! COMMUTATOR is the operator itself: equality is symmetric. Required for the +--! MERGES flag — without it the planner raises "could not find commutator" the +--! first time an ore_block equality is used as a join qual (e.g. via the inlined +--! eql_v3._ord_ore equality wrappers). +CREATE OPERATOR = ( + FUNCTION=eql_v3.ore_block_256_eq, + LEFTARG=eql_v3.ore_block_256, + RIGHTARG=eql_v3.ore_block_256, + COMMUTATOR = =, + NEGATOR = <>, + RESTRICT = eqsel, + JOIN = eqjoinsel, + HASHES, + MERGES +); + +--! @brief <> operator for ORE block types +CREATE OPERATOR <> ( + FUNCTION=eql_v3.ore_block_256_neq, + LEFTARG=eql_v3.ore_block_256, + RIGHTARG=eql_v3.ore_block_256, + COMMUTATOR = <>, + NEGATOR = =, + RESTRICT = neqsel, + JOIN = neqjoinsel, + MERGES +); + +--! @brief > operator for ORE block types +CREATE OPERATOR > ( + FUNCTION=eql_v3.ore_block_256_gt, + LEFTARG=eql_v3.ore_block_256, + RIGHTARG=eql_v3.ore_block_256, + COMMUTATOR = <, + NEGATOR = <=, + RESTRICT = scalargtsel, + JOIN = scalargtjoinsel +); + +--! @brief < operator for ORE block types +CREATE OPERATOR < ( + FUNCTION=eql_v3.ore_block_256_lt, + LEFTARG=eql_v3.ore_block_256, + RIGHTARG=eql_v3.ore_block_256, + COMMUTATOR = >, + NEGATOR = >=, + RESTRICT = scalarltsel, + JOIN = scalarltjoinsel +); + +--! @brief <= operator for ORE block types +CREATE OPERATOR <= ( + FUNCTION=eql_v3.ore_block_256_lte, + LEFTARG=eql_v3.ore_block_256, + RIGHTARG=eql_v3.ore_block_256, + COMMUTATOR = >=, + NEGATOR = >, + RESTRICT = scalarlesel, + JOIN = scalarlejoinsel +); + +--! @brief >= operator for ORE block types +CREATE OPERATOR >= ( + FUNCTION=eql_v3.ore_block_256_gte, + LEFTARG=eql_v3.ore_block_256, + RIGHTARG=eql_v3.ore_block_256, + COMMUTATOR = <=, + NEGATOR = <, + RESTRICT = scalargesel, + JOIN = scalargejoinsel +); diff --git a/src/v3/sem/ore_block_u64_8_256/types.sql b/src/v3/sem/ore_block_256/types.sql similarity index 79% rename from src/v3/sem/ore_block_u64_8_256/types.sql rename to src/v3/sem/ore_block_256/types.sql index f7e44dd06..b77c57338 100644 --- a/src/v3/sem/ore_block_u64_8_256/types.sql +++ b/src/v3/sem/ore_block_256/types.sql @@ -1,6 +1,6 @@ -- REQUIRE: src/v3/schema.sql ---! @file v3/sem/ore_block_u64_8_256/types.sql +--! @file v3/sem/ore_block_256/types.sql --! @brief ORE block index-term types (eql_v3 SEM). --! --! Self-contained eql_v3 copies of the Order-Revealing Encryption block types @@ -10,7 +10,7 @@ --! --! Composite type representing a single ORE block term. Stores encrypted data --! as bytea that enables range comparisons without decryption. -CREATE TYPE eql_v3.ore_block_u64_8_256_term AS ( +CREATE TYPE eql_v3.ore_block_256_term AS ( bytes bytea ); @@ -21,6 +21,6 @@ CREATE TYPE eql_v3.ore_block_u64_8_256_term AS ( --! in the 'ob' field of encrypted data payloads. --! --! @note Transient type used only during query execution. -CREATE TYPE eql_v3.ore_block_u64_8_256 AS ( - terms eql_v3.ore_block_u64_8_256_term[] +CREATE TYPE eql_v3.ore_block_256 AS ( + terms eql_v3.ore_block_256_term[] ); diff --git a/src/v3/sem/ore_block_u64_8_256/operators.sql b/src/v3/sem/ore_block_u64_8_256/operators.sql deleted file mode 100644 index d2e670b72..000000000 --- a/src/v3/sem/ore_block_u64_8_256/operators.sql +++ /dev/null @@ -1,180 +0,0 @@ --- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/types.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql - ---! @file v3/sem/ore_block_u64_8_256/operators.sql ---! @brief Comparison operators on eql_v3.ore_block_u64_8_256. ---! ---! The six backing functions are inlinable single-statement SQL so the planner ---! can fold the eql_v3 comparison wrappers through to functional-index matching. - ---! @brief Equality backing function for ORE block types ---! @internal ---! ---! @param a eql_v3.ore_block_u64_8_256 Left operand ---! @param b eql_v3.ore_block_u64_8_256 Right operand ---! @return boolean True if the ORE blocks are equal ---! ---! @see eql_v3.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v3.ore_block_u64_8_256_eq(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) = 0 -$$; - ---! @brief Not-equal backing function for ORE block types ---! @internal ---! ---! @param a eql_v3.ore_block_u64_8_256 Left operand ---! @param b eql_v3.ore_block_u64_8_256 Right operand ---! @return boolean True if the ORE blocks are not equal ---! ---! @see eql_v3.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v3.ore_block_u64_8_256_neq(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) <> 0 -$$; - ---! @brief Less-than backing function for ORE block types ---! @internal ---! ---! @param a eql_v3.ore_block_u64_8_256 Left operand ---! @param b eql_v3.ore_block_u64_8_256 Right operand ---! @return boolean True if the left operand is less than the right operand ---! ---! @see eql_v3.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v3.ore_block_u64_8_256_lt(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) = -1 -$$; - ---! @brief Less-than-or-equal backing function for ORE block types ---! @internal ---! ---! @param a eql_v3.ore_block_u64_8_256 Left operand ---! @param b eql_v3.ore_block_u64_8_256 Right operand ---! @return boolean True if the left operand is less than or equal to the right operand ---! ---! @see eql_v3.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v3.ore_block_u64_8_256_lte(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) != 1 -$$; - ---! @brief Greater-than backing function for ORE block types ---! @internal ---! ---! @param a eql_v3.ore_block_u64_8_256 Left operand ---! @param b eql_v3.ore_block_u64_8_256 Right operand ---! @return boolean True if the left operand is greater than the right operand ---! ---! @see eql_v3.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v3.ore_block_u64_8_256_gt(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) = 1 -$$; - ---! @brief Greater-than-or-equal backing function for ORE block types ---! @internal ---! ---! @param a eql_v3.ore_block_u64_8_256 Left operand ---! @param b eql_v3.ore_block_u64_8_256 Right operand ---! @return boolean True if the left operand is greater than or equal to the right operand ---! ---! @see eql_v3.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v3.ore_block_u64_8_256_gte(a eql_v3.ore_block_u64_8_256, b eql_v3.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3.compare_ore_block_u64_8_256_terms(a, b) != -1 -$$; - - ---! @brief = operator for ORE block types ---! ---! COMMUTATOR is the operator itself: equality is symmetric. Required for the ---! MERGES flag — without it the planner raises "could not find commutator" the ---! first time an ore_block equality is used as a join qual (e.g. via the inlined ---! eql_v3._ord_ore equality wrappers). -CREATE OPERATOR = ( - FUNCTION=eql_v3.ore_block_u64_8_256_eq, - LEFTARG=eql_v3.ore_block_u64_8_256, - RIGHTARG=eql_v3.ore_block_u64_8_256, - COMMUTATOR = =, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - ---! @brief <> operator for ORE block types -CREATE OPERATOR <> ( - FUNCTION=eql_v3.ore_block_u64_8_256_neq, - LEFTARG=eql_v3.ore_block_u64_8_256, - RIGHTARG=eql_v3.ore_block_u64_8_256, - COMMUTATOR = <>, - NEGATOR = =, - RESTRICT = neqsel, - JOIN = neqjoinsel, - MERGES -); - ---! @brief > operator for ORE block types -CREATE OPERATOR > ( - FUNCTION=eql_v3.ore_block_u64_8_256_gt, - LEFTARG=eql_v3.ore_block_u64_8_256, - RIGHTARG=eql_v3.ore_block_u64_8_256, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - ---! @brief < operator for ORE block types -CREATE OPERATOR < ( - FUNCTION=eql_v3.ore_block_u64_8_256_lt, - LEFTARG=eql_v3.ore_block_u64_8_256, - RIGHTARG=eql_v3.ore_block_u64_8_256, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - ---! @brief <= operator for ORE block types -CREATE OPERATOR <= ( - FUNCTION=eql_v3.ore_block_u64_8_256_lte, - LEFTARG=eql_v3.ore_block_u64_8_256, - RIGHTARG=eql_v3.ore_block_u64_8_256, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - ---! @brief >= operator for ORE block types -CREATE OPERATOR >= ( - FUNCTION=eql_v3.ore_block_u64_8_256_gte, - LEFTARG=eql_v3.ore_block_u64_8_256, - RIGHTARG=eql_v3.ore_block_u64_8_256, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql index d00e34267..bfbd702c7 100644 --- a/tasks/pin_search_path.sql +++ b/tasks/pin_search_path.sql @@ -259,13 +259,13 @@ BEGIN n.nspname = 'eql_v3' AND ( (p.pronargs = 2 - AND p.proname IN ('ore_block_u64_8_256_eq', 'ore_block_u64_8_256_neq', - 'ore_block_u64_8_256_lt', 'ore_block_u64_8_256_lte', - 'ore_block_u64_8_256_gt', 'ore_block_u64_8_256_gte')) + AND p.proname IN ('ore_block_256_eq', 'ore_block_256_neq', + 'ore_block_256_lt', 'ore_block_256_lte', + 'ore_block_256_gt', 'ore_block_256_gte')) -- Inner ORE-CLLW comparison helpers backing the `<`, `<=`, `=`, `>=`, -- `>`, `<>` operators on the eql_v3.ore_cllw composite type (registered -- via the DEFAULT eql_v3.ore_cllw_ops btree opclass). Same precedent as - -- the ore_block_u64_8_256_* helpers above and the eql_v2.ore_cllw_* + -- the ore_block_256_* helpers above and the eql_v2.ore_cllw_* -- helpers: PG only carries the inlined operator wrapper through to -- functional-index match if the inner backing function is also -- inlinable. They take the composite arg (not a jsonb-backed domain), diff --git a/tasks/test/clean_install_v3.sh b/tasks/test/clean_install_v3.sh index cb9e9d02d..07553f670 100755 --- a/tasks/test/clean_install_v3.sh +++ b/tasks/test/clean_install_v3.sh @@ -36,7 +36,7 @@ echo "==> smoke: domains, SEM types, extractors, opclass functional index (D4)" -- Domains and SEM types exist in eql_v3. SELECT 'eql_v3.int4_ord'::regtype; SELECT 'eql_v3.hmac_256'::regtype; -SELECT 'eql_v3.ore_block_u64_8_256'::regtype; +SELECT 'eql_v3.ore_block_256'::regtype; -- A real ordered-domain column + the documented functional index. This is the -- D4 proof: it fails outright if the ported operator_class is absent. diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index fcf53e8cc..97383be05 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -108,7 +108,7 @@ function_search_path_mutable eql_v2 grouped_value function Aggregate: same as mi # they need their own rows. The plpgsql blockers are pinned by # tasks/pin_search_path.sql and do not surface here. function_search_path_mutable eql_v3 eq_term function HMAC equality term extractor for the eql_v3 *_eq domains: returns eql_v3.hmac_256. Must inline so `eql_v3.eq_term(col)` folds into the calling query and matches the functional hash/btree index built on the same expression. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). -function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v3.ore_block_u64_8_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). +function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v3.ore_block_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). function_search_path_mutable eql_v3 match_term function Bloom-filter match term extractor for the eql_v3 *_match domains: returns eql_v3.bloom_filter. Used inside the inlinable @>/<@ containment wrappers and as the functional-index expression USING gin (eql_v3.match_term(col)); must inline so the GIN index engages. SET search_path would disable SQL function inlining. function_search_path_mutable eql_v3 contains function Containment (@>) comparison wrapper on the eql_v3 *_match domains. Inlines to `match_term(a) @> match_term(b)`; must reach the functional GIN index on eql_v3.match_term(col) for bloom-filter match to engage Bitmap Index Scan. function_search_path_mutable eql_v3 contained_by function Contained-by (<@) comparison wrapper on the eql_v3 *_match domains. Same rationale as eql_v3.contains. @@ -120,16 +120,16 @@ function_search_path_mutable eql_v3 gt function Greater-than comparison wrapper function_search_path_mutable eql_v3 gte function Greater-than-or-equal comparison wrapper on the eql_v3 ordered domains. Same rationale as eql_v3.lt. function_search_path_mutable eql_v3 min function Per-domain MIN aggregate on the eql_v3 ordered domains (splinter labels aggregates type=function): ALTER AGGREGATE has no SET configuration_parameter syntax, and ALTER ROUTINE/FUNCTION reject aggregates. The aggregate's SFUNC carries a pinned search_path. function_search_path_mutable eql_v3 max function Per-domain MAX aggregate on the eql_v3 ordered domains. Same as eql_v3.min. -function_search_path_mutable eql_v3 ore_block_u64_8_256_eq function Inner comparator for the eql_v3 ore_block_u64_8_256 type's `=` operator (self-contained SEM fork). The eql_v3 *_ord comparison wrappers inline to `ord_term(a) op ord_term(b)`; the planner only carries that through to the functional ORE index if this inner function is also inlinable (no SET, IMMUTABLE). Mirrors eql_v2.ore_block_u64_8_256_eq. -function_search_path_mutable eql_v3 ore_block_u64_8_256_neq function Inner comparator for the eql_v3 ore_block_u64_8_256 `<>` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. -function_search_path_mutable eql_v3 ore_block_u64_8_256_lt function Inner comparator for the eql_v3 ore_block_u64_8_256 `<` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. -function_search_path_mutable eql_v3 ore_block_u64_8_256_lte function Inner comparator for the eql_v3 ore_block_u64_8_256 `<=` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. -function_search_path_mutable eql_v3 ore_block_u64_8_256_gt function Inner comparator for the eql_v3 ore_block_u64_8_256 `>` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. -function_search_path_mutable eql_v3 ore_block_u64_8_256_gte function Inner comparator for the eql_v3 ore_block_u64_8_256 `>=` operator. Same rationale as eql_v3.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_256_eq function Inner comparator for the eql_v3 ore_block_256 type's `=` operator (self-contained SEM fork). The eql_v3 *_ord comparison wrappers inline to `ord_term(a) op ord_term(b)`; the planner only carries that through to the functional ORE index if this inner function is also inlinable (no SET, IMMUTABLE). Mirrors eql_v2.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_256_neq function Inner comparator for the eql_v3 ore_block_256 `<>` operator. Same rationale as eql_v3.ore_block_256_eq. +function_search_path_mutable eql_v3 ore_block_256_lt function Inner comparator for the eql_v3 ore_block_256 `<` operator. Same rationale as eql_v3.ore_block_256_eq. +function_search_path_mutable eql_v3 ore_block_256_lte function Inner comparator for the eql_v3 ore_block_256 `<=` operator. Same rationale as eql_v3.ore_block_256_eq. +function_search_path_mutable eql_v3 ore_block_256_gt function Inner comparator for the eql_v3 ore_block_256 `>` operator. Same rationale as eql_v3.ore_block_256_eq. +function_search_path_mutable eql_v3 ore_block_256_gte function Inner comparator for the eql_v3 ore_block_256 `>=` operator. Same rationale as eql_v3.ore_block_256_eq. function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.eq_term. Must inline so the functional hash/btree index on eql_v3.eq_term(col) engages. Mirrors eql_v2.hmac_256. function_search_path_mutable eql_v3 bloom_filter function Bloom-filter match extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.match_term. Must inline so the functional GIN index on eql_v3.match_term(col) engages. Mirrors eql_v3.hmac_256. -function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_u64_8_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours. The eql_v2 copy stays plpgsql (pinned) by design. -function_search_path_mutable eql_v3 jsonb_array_to_ore_block_u64_8_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_u64_8_256, carries the `eql-inline-critical` COMMENT marker. The eql_v2 copy stays plpgsql (pinned) by design. +function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours. The eql_v2 copy stays plpgsql (pinned) by design. +function_search_path_mutable eql_v3 jsonb_array_to_ore_block_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_256, carries the `eql-inline-critical` COMMENT marker. The eql_v2 copy stays plpgsql (pinned) by design. function_search_path_mutable eql_v3 ore_cllw_eq function Inner comparator for the eql_v3.ore_cllw composite type's `=` operator (self-contained SEM fork, DEFAULT FOR TYPE btree opclass eql_v3.ore_cllw_ops). The outer same-type operators back the opclass; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). The plpgsql FUNCTION 1 comparator (compare_ore_cllw_term) stays pinned by design. Mirrors eql_v2.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_neq function Inner comparator for the eql_v3.ore_cllw `<>` operator. Same rationale as eql_v3.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_lt function Inner comparator for the eql_v3.ore_cllw `<` operator. Same rationale as eql_v3.ore_cllw_eq. diff --git a/tests/codegen/reference/date/date_ord_functions.sql b/tests/codegen/reference/date/date_ord_functions.sql index 8c2adf487..99fa57eb8 100644 --- a/tests/codegen/reference/date/date_ord_functions.sql +++ b/tests/codegen/reference/date/date_ord_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/date/date_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/date/date_ord_functions.sql --! @brief Functions for eql_v3.date_ord. --! @brief Index extractor for eql_v3.date_ord. --! @param a eql_v3.date_ord ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.date_ord) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.date_ord. --! @param a eql_v3.date_ord diff --git a/tests/codegen/reference/date/date_ord_ore_functions.sql b/tests/codegen/reference/date/date_ord_ore_functions.sql index 1fe590738..d65e3d9d1 100644 --- a/tests/codegen/reference/date/date_ord_ore_functions.sql +++ b/tests/codegen/reference/date/date_ord_ore_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/date/date_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/date/date_ord_ore_functions.sql --! @brief Functions for eql_v3.date_ord_ore. --! @brief Index extractor for eql_v3.date_ord_ore. --! @param a eql_v3.date_ord_ore ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.date_ord_ore) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.date_ord_ore. --! @param a eql_v3.date_ord_ore diff --git a/tests/codegen/reference/int2/int2_ord_functions.sql b/tests/codegen/reference/int2/int2_ord_functions.sql index 58c977d2d..a9a375a89 100644 --- a/tests/codegen/reference/int2/int2_ord_functions.sql +++ b/tests/codegen/reference/int2/int2_ord_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/int2/int2_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/int2/int2_ord_functions.sql --! @brief Functions for eql_v3.int2_ord. --! @brief Index extractor for eql_v3.int2_ord. --! @param a eql_v3.int2_ord ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int2_ord) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int2_ord. --! @param a eql_v3.int2_ord diff --git a/tests/codegen/reference/int2/int2_ord_ore_functions.sql b/tests/codegen/reference/int2/int2_ord_ore_functions.sql index ab200402a..f28400bd7 100644 --- a/tests/codegen/reference/int2/int2_ord_ore_functions.sql +++ b/tests/codegen/reference/int2/int2_ord_ore_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/int2/int2_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/int2/int2_ord_ore_functions.sql --! @brief Functions for eql_v3.int2_ord_ore. --! @brief Index extractor for eql_v3.int2_ord_ore. --! @param a eql_v3.int2_ord_ore ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int2_ord_ore) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int2_ord_ore. --! @param a eql_v3.int2_ord_ore diff --git a/tests/codegen/reference/int4/int4_ord_functions.sql b/tests/codegen/reference/int4/int4_ord_functions.sql index 4b170fcbe..b4c67732b 100644 --- a/tests/codegen/reference/int4/int4_ord_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/int4/int4_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/int4/int4_ord_functions.sql --! @brief Functions for eql_v3.int4_ord. --! @brief Index extractor for eql_v3.int4_ord. --! @param a eql_v3.int4_ord ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int4_ord. --! @param a eql_v3.int4_ord diff --git a/tests/codegen/reference/int4/int4_ord_ore_functions.sql b/tests/codegen/reference/int4/int4_ord_ore_functions.sql index e93c84918..964fc4805 100644 --- a/tests/codegen/reference/int4/int4_ord_ore_functions.sql +++ b/tests/codegen/reference/int4/int4_ord_ore_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/int4/int4_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/int4/int4_ord_ore_functions.sql --! @brief Functions for eql_v3.int4_ord_ore. --! @brief Index extractor for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord_ore) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int4_ord_ore. --! @param a eql_v3.int4_ord_ore diff --git a/tests/codegen/reference/int8/int8_ord_functions.sql b/tests/codegen/reference/int8/int8_ord_functions.sql index 109dcd2b8..c86fa6a0b 100644 --- a/tests/codegen/reference/int8/int8_ord_functions.sql +++ b/tests/codegen/reference/int8/int8_ord_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/int8/int8_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/int8/int8_ord_functions.sql --! @brief Functions for eql_v3.int8_ord. --! @brief Index extractor for eql_v3.int8_ord. --! @param a eql_v3.int8_ord ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int8_ord) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int8_ord. --! @param a eql_v3.int8_ord diff --git a/tests/codegen/reference/int8/int8_ord_ore_functions.sql b/tests/codegen/reference/int8/int8_ord_ore_functions.sql index dd413fce6..6d9ac3350 100644 --- a/tests/codegen/reference/int8/int8_ord_ore_functions.sql +++ b/tests/codegen/reference/int8/int8_ord_ore_functions.sql @@ -3,19 +3,19 @@ -- REQUIRE: src/v3/schema.sql -- REQUIRE: src/v3/scalars/int8/int8_types.sql -- REQUIRE: src/v3/scalars/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/int8/int8_ord_ore_functions.sql --! @brief Functions for eql_v3.int8_ord_ore. --! @brief Index extractor for eql_v3.int8_ord_ore. --! @param a eql_v3.int8_ord_ore ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.int8_ord_ore) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.int8_ord_ore. --! @param a eql_v3.int8_ord_ore diff --git a/tests/codegen/reference/text/text_ord_functions.sql b/tests/codegen/reference/text/text_ord_functions.sql index f07e8b64c..5b67ab5e7 100644 --- a/tests/codegen/reference/text/text_ord_functions.sql +++ b/tests/codegen/reference/text/text_ord_functions.sql @@ -4,8 +4,8 @@ -- REQUIRE: src/v3/scalars/text/text_types.sql -- REQUIRE: src/v3/scalars/functions.sql -- REQUIRE: src/v3/sem/hmac_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/text/text_ord_functions.sql --! @brief Functions for eql_v3.text_ord. @@ -20,11 +20,11 @@ AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; --! @brief Index extractor for eql_v3.text_ord. --! @param a eql_v3.text_ord ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_ord) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.text_ord. --! @param a eql_v3.text_ord diff --git a/tests/codegen/reference/text/text_ord_ore_functions.sql b/tests/codegen/reference/text/text_ord_ore_functions.sql index 58e1abac2..e541eee9f 100644 --- a/tests/codegen/reference/text/text_ord_ore_functions.sql +++ b/tests/codegen/reference/text/text_ord_ore_functions.sql @@ -4,8 +4,8 @@ -- REQUIRE: src/v3/scalars/text/text_types.sql -- REQUIRE: src/v3/scalars/functions.sql -- REQUIRE: src/v3/sem/hmac_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql --! @file encrypted_domain/text/text_ord_ore_functions.sql --! @brief Functions for eql_v3.text_ord_ore. @@ -20,11 +20,11 @@ AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; --! @brief Index extractor for eql_v3.text_ord_ore. --! @param a eql_v3.text_ord_ore ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_ord_ore) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Operator wrapper for eql_v3.text_ord_ore. --! @param a eql_v3.text_ord_ore diff --git a/tests/codegen/reference/text/text_search_functions.sql b/tests/codegen/reference/text/text_search_functions.sql index 21dd57936..3146f1524 100644 --- a/tests/codegen/reference/text/text_search_functions.sql +++ b/tests/codegen/reference/text/text_search_functions.sql @@ -4,8 +4,8 @@ -- REQUIRE: src/v3/scalars/text/text_types.sql -- REQUIRE: src/v3/scalars/functions.sql -- REQUIRE: src/v3/sem/hmac_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/functions.sql --- REQUIRE: src/v3/sem/ore_block_u64_8_256/operators.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql -- REQUIRE: src/v3/sem/bloom_filter/functions.sql --! @file encrypted_domain/text/text_search_functions.sql @@ -21,11 +21,11 @@ AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; --! @brief Index extractor for eql_v3.text_search. --! @param a eql_v3.text_search ---! @return eql_v3.ore_block_u64_8_256 +--! @return eql_v3.ore_block_256 CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_search) -RETURNS eql_v3.ore_block_u64_8_256 +RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) $$; +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; --! @brief Index extractor for eql_v3.text_search. --! @param a eql_v3.text_search diff --git a/tests/sqlx/fixtures/drop_operator_classes.sql b/tests/sqlx/fixtures/drop_operator_classes.sql index 094073aa3..13d1d350d 100644 --- a/tests/sqlx/fixtures/drop_operator_classes.sql +++ b/tests/sqlx/fixtures/drop_operator_classes.sql @@ -20,8 +20,8 @@ DROP OPERATOR FAMILY IF EXISTS eql_v2.ore_block_u64_8_256_operator_family USING -- the `*operator_class.sql` suffix, so the Supabase build's `**/*operator_class.sql` -- glob excludes it as well. Without this the unqualified-name opclass check below -- still finds the eql_v3 copy. -DROP OPERATOR CLASS IF EXISTS eql_v3.ore_block_u64_8_256_operator_class USING btree CASCADE; -DROP OPERATOR FAMILY IF EXISTS eql_v3.ore_block_u64_8_256_operator_family USING btree CASCADE; +DROP OPERATOR CLASS IF EXISTS eql_v3.ore_block_256_operator_class USING btree CASCADE; +DROP OPERATOR FAMILY IF EXISTS eql_v3.ore_block_256_operator_family USING btree CASCADE; -- Drop ore_block_u64_8_256 operators (also excluded from Supabase build) DROP OPERATOR IF EXISTS = (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 922d9ee41..9c62404dd 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -89,7 +89,7 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> /// Direct guard for the self-contained eql_v3 SEM index-term functions. Unlike /// the structural guard above (which covers jsonb-domain-arg functions), these -/// take a composite (the ore_block_u64_8_256 and ore_cllw comparators) or raw +/// take a composite (the ore_block_256 and ore_cllw comparators) or raw /// jsonb (hmac_256, bloom_filter, the ore_cllw/has_ore_cllw extractors, the two /// per-encrypted-value `jsonb_array_to_*` helpers) arg, so they are NOT caught /// by the structural pin-skip and need explicit inline_critical allowlisting. If @@ -97,7 +97,7 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> /// regresses to Seq Scan — this test fails instead. /// /// `jsonb_array_to_bytea_array(jsonb)` and -/// `jsonb_array_to_ore_block_u64_8_256(jsonb)` are included here: both take a +/// `jsonb_array_to_ore_block_256(jsonb)` are included here: both take a /// bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the structural /// skip in tasks/pin_search_path.sql does not recognise them — they are kept /// unpinned by the `eql-inline-critical` COMMENT marker instead. This test @@ -113,7 +113,7 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu WITH expected(proname, pronargs, arg0, arg1) AS ( VALUES ('jsonb_array_to_bytea_array', 1, 'jsonb'::regtype, 0::oid), - ('jsonb_array_to_ore_block_u64_8_256', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_array_to_ore_block_256', 1, 'jsonb'::regtype, 0::oid), ('ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('has_ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('meta_data', 1, 'jsonb'::regtype, 0::oid), @@ -135,9 +135,9 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu WHERE n.nspname = 'eql_v3' AND ( (p.pronargs = 2 AND p.proname IN ( - 'ore_block_u64_8_256_eq','ore_block_u64_8_256_neq', - 'ore_block_u64_8_256_lt','ore_block_u64_8_256_lte', - 'ore_block_u64_8_256_gt','ore_block_u64_8_256_gte')) + 'ore_block_256_eq','ore_block_256_neq', + 'ore_block_256_lt','ore_block_256_lte', + 'ore_block_256_gt','ore_block_256_gte')) OR (p.pronargs = 2 AND p.proname IN ( 'ore_cllw_eq','ore_cllw_neq', 'ore_cllw_lt','ore_cllw_lte', @@ -148,7 +148,7 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu 'ore_cllw', 'has_ore_cllw', 'jsonb_array_to_bytea_array', - 'jsonb_array_to_ore_block_u64_8_256') + 'jsonb_array_to_ore_block_256') AND p.proargtypes[0] = 'jsonb'::regtype) OR e.proname IS NOT NULL ) @@ -173,7 +173,7 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu } /// Companion guard for the two bare-`jsonb` per-encrypted-value helpers -/// (`jsonb_array_to_bytea_array`, `jsonb_array_to_ore_block_u64_8_256`). The +/// (`jsonb_array_to_bytea_array`, `jsonb_array_to_ore_block_256`). The /// unpinned state asserted above is only DURABLE because each helper carries an /// `eql-inline-critical` COMMENT marker that `tasks/pin_search_path.sql` honours /// (it skips pinning functions whose `pg_description` matches @@ -193,7 +193,7 @@ async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result WITH expected(proname, pronargs, arg0, arg1) AS ( VALUES ('jsonb_array_to_bytea_array', 1, 'jsonb'::regtype, 0::oid), - ('jsonb_array_to_ore_block_u64_8_256', 1, 'jsonb'::regtype, 0::oid), + ('jsonb_array_to_ore_block_256', 1, 'jsonb'::regtype, 0::oid), ('ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('has_ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('meta_data', 1, 'jsonb'::regtype, 0::oid), diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index d78d55203..f2399a2b7 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -259,7 +259,7 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // 6. `_eq` equality must route through `eq_term` (`hm`), never ORE — the // mirror of #3 for the eq path. Rerouting it through -// `ore_block_u64_8_256` (`ob`) over ob-stripped rows breaks equality. +// `ore_block_256` (`ob`) over ob-stripped rows breaks equality. // // Two notes on why this is shaped differently from the plan's literal // "returns 0 where forward expects 1": @@ -267,7 +267,7 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // `=` through ORE on the RAW fixture would still match (both terms are // injective per plaintext) — vacuous. Stripping `ob` forces the // rerouted operator onto an absent term, exactly as #3 strips `hm`. -// - `ore_block_u64_8_256(jsonb)` RAISES on an absent `ob` ("Expected an +// - `ore_block_256(jsonb)` RAISES on an absent `ob` ("Expected an // ore index (ob)"), whereas `hmac_256(jsonb)` returns NULL on an absent // `hm`. So the eq path breaks via a raise, not a 0-count. Either way the // correct hm-routed equality matches and the rerouted one does not. @@ -297,12 +297,12 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { ); // Mutation: reroute `_eq` `=` through ORE. The `ob` key is absent, so - // `eql_v3.ore_block_u64_8_256(jsonb)` raises rather than matching. + // `eql_v3.ore_block_256(jsonb)` raises rather than matching. mutate( &pool, "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ - AS $$ SELECT eql_v3.ore_block_u64_8_256(a::jsonb) = eql_v3.ore_block_u64_8_256(b::jsonb) $$", + AS $$ SELECT eql_v3.ore_block_256(a::jsonb) = eql_v3.ore_block_256(b::jsonb) $$", ) .await?; @@ -354,8 +354,8 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ - RETURNS eql_v3.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ - AS $mutbody$ SELECT eql_v3.ore_block_u64_8_256('{esc}'::jsonb) $mutbody$", + RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ + AS $mutbody$ SELECT eql_v3.ore_block_256('{esc}'::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); mutate(&pool, &ddl).await?; @@ -409,8 +409,8 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ - RETURNS eql_v3.ore_block_u64_8_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ - AS $mutbody$ SELECT eql_v3.ore_block_u64_8_256(\ + RETURNS eql_v3.ore_block_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ + AS $mutbody$ SELECT eql_v3.ore_block_256(\ coalesce(a, '{esc}'::jsonb::eql_v3.int4_ord)::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 7518f6d26..fe2593b9c 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -1,6 +1,6 @@ //! Direct behavioural tests for the self-contained `eql_v3` searchable- //! encrypted-metadata (SEM) index-term functions (`eql_v3.hmac_256`, -//! `eql_v3.ore_block_u64_8_256` and their comparators). +//! `eql_v3.ore_block_256` and their comparators). //! //! These functions are a HAND-PORT of the `eql_v2` originals (`src/v3/sem/`). //! The scalar matrix already exercises the happy path of the *array* comparator @@ -13,7 +13,7 @@ //! against a faithful-port slip — see below). //! - T2: the `'Ciphertexts are different lengths'` RAISE (all real fixtures are //! equal length, so the matrix never hits it). -//! - T3: NULL-term ordering inside `compare_ore_block_u64_8_256_term` — the +//! - T3: NULL-term ordering inside `compare_ore_block_256_term` — the //! `STRICT` comparison wrappers short-circuit before these branches run. //! - T4: array-level NULL + empty/cardinality base cases of the recursion. //! - T5: presence checks (`has_*`) and the missing-`ob` RAISE. @@ -30,13 +30,13 @@ use sqlx::PgPool; /// A single term built directly from hex — no encryption needed for the /// structural/edge-case tests. fn term(hex: &str) -> String { - format!("ROW(decode('{hex}', 'hex'))::eql_v3.ore_block_u64_8_256_term") + format!("ROW(decode('{hex}', 'hex'))::eql_v3.ore_block_256_term") } /// T1 — Differential parity: the same real `ob` payload must compare identically /// through the `eql_v2` and `eql_v3` array comparators. `eql_v2` is the trusted /// oracle; `eql_v3` is the byte-port. Both sides route through the SAME path -/// (jsonb extractor → composite → `compare_ore_block_u64_8_256_terms`) so the +/// (jsonb extractor → composite → `compare_ore_block_256_terms`) so the /// schema prefix is the only variable — any divergence is a genuine port bug. /// v3 has no encrypted-arg `compare` overload, hence the extractor routing. #[sqlx::test] @@ -60,8 +60,8 @@ async fn ore_v2_v3_comparator_parity_on_real_fixtures(pool: PgPool) -> Result<() SELECT eql_v2.compare_ore_block_u64_8_256_terms( eql_v2.ore_block_u64_8_256(a.j), eql_v2.ore_block_u64_8_256(b.j)) AS v2, - eql_v3.compare_ore_block_u64_8_256_terms( - eql_v3.ore_block_u64_8_256(a.j), eql_v3.ore_block_u64_8_256(b.j)) AS v3 + eql_v3.compare_ore_block_256_terms( + eql_v3.ore_block_256(a.j), eql_v3.ore_block_256(b.j)) AS v3 FROM a, b "#; @@ -97,7 +97,7 @@ async fn ore_v2_v3_comparator_parity_on_real_fixtures(pool: PgPool) -> Result<() #[sqlx::test] async fn ore_term_comparator_rejects_different_length_ciphertexts(pool: PgPool) -> Result<()> { let sql = format!( - "SELECT eql_v3.compare_ore_block_u64_8_256_term({}, {})", + "SELECT eql_v3.compare_ore_block_256_term({}, {})", term("aabbccdd"), // 4 bytes term("aabbccddee"), // 5 bytes ); @@ -105,26 +105,26 @@ async fn ore_term_comparator_rejects_different_length_ciphertexts(pool: PgPool) Ok(()) } -/// T3 — NULL-term ordering inside `compare_ore_block_u64_8_256_term`. The +/// T3 — NULL-term ordering inside `compare_ore_block_256_term`. The /// function is intentionally NOT `STRICT`, so these defensive branches are /// reachable by a direct call (the `STRICT` comparison wrappers never reach /// them). Pins: `(NULL, t) = -1`, `(t, NULL) = 1`, `(NULL, NULL) = 0`. #[sqlx::test] async fn ore_term_comparator_null_ordering(pool: PgPool) -> Result<()> { let t = term("aabb"); - let n = "NULL::eql_v3.ore_block_u64_8_256_term"; + let n = "NULL::eql_v3.ore_block_256_term"; let cases = [ ( - format!("SELECT eql_v3.compare_ore_block_u64_8_256_term({n}, {t})"), + format!("SELECT eql_v3.compare_ore_block_256_term({n}, {t})"), -1, ), ( - format!("SELECT eql_v3.compare_ore_block_u64_8_256_term({t}, {n})"), + format!("SELECT eql_v3.compare_ore_block_256_term({t}, {n})"), 1, ), ( - format!("SELECT eql_v3.compare_ore_block_u64_8_256_term({n}, {n})"), + format!("SELECT eql_v3.compare_ore_block_256_term({n}, {n})"), 0, ), ]; @@ -137,20 +137,20 @@ async fn ore_term_comparator_null_ordering(pool: PgPool) -> Result<()> { } /// T4 — Array-level NULL and empty/cardinality base cases of the recursive -/// `compare_ore_block_u64_8_256_terms(term[], term[])`. NULL array → NULL; +/// `compare_ore_block_256_terms(term[], term[])`. NULL array → NULL; /// both empty → 0; empty vs non-empty → -1; non-empty vs empty → 1. #[sqlx::test] async fn ore_terms_array_null_and_empty_base_cases(pool: PgPool) -> Result<()> { let t = format!("ARRAY[{}]", term("aabb")); - let empty = "ARRAY[]::eql_v3.ore_block_u64_8_256_term[]"; - let null_arr = "NULL::eql_v3.ore_block_u64_8_256_term[]"; + let empty = "ARRAY[]::eql_v3.ore_block_256_term[]"; + let null_arr = "NULL::eql_v3.ore_block_256_term[]"; // NULL array operand → NULL result (the array overload returns NULL; it is // not STRICT). Typed as Option; the shared `assert_null` helper only // types Option, so query directly here. for sql in [ - format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({null_arr}, {t})"), - format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({t}, {null_arr})"), + format!("SELECT eql_v3.compare_ore_block_256_terms({null_arr}, {t})"), + format!("SELECT eql_v3.compare_ore_block_256_terms({t}, {null_arr})"), ] { let got: Option = sqlx::query_scalar(&sql).fetch_one(&pool).await?; assert!(got.is_none(), "NULL array operand must yield NULL: {sql}"); @@ -158,15 +158,15 @@ async fn ore_terms_array_null_and_empty_base_cases(pool: PgPool) -> Result<()> { let cases = [ ( - format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({empty}, {empty})"), + format!("SELECT eql_v3.compare_ore_block_256_terms({empty}, {empty})"), 0, ), ( - format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({empty}, {t})"), + format!("SELECT eql_v3.compare_ore_block_256_terms({empty}, {t})"), -1, ), ( - format!("SELECT eql_v3.compare_ore_block_u64_8_256_terms({t}, {empty})"), + format!("SELECT eql_v3.compare_ore_block_256_terms({t}, {empty})"), 1, ), ]; @@ -177,22 +177,19 @@ async fn ore_terms_array_null_and_empty_base_cases(pool: PgPool) -> Result<()> { Ok(()) } -/// T5 — SEM presence checks (`has_ore_block_u64_8_256`, `has_hmac_256`), the +/// T5 — SEM presence checks (`has_ore_block_256`, `has_hmac_256`), the /// extractor's missing-`ob` RAISE, and its NULL-jsonb short-circuit. #[sqlx::test] async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<()> { let bool_cases = [ ( - r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":["aa"]}'::jsonb)"#, + r#"SELECT eql_v3.has_ore_block_256('{"ob":["aa"]}'::jsonb)"#, true, ), - ( - r#"SELECT eql_v3.has_ore_block_u64_8_256('{}'::jsonb)"#, - false, - ), + (r#"SELECT eql_v3.has_ore_block_256('{}'::jsonb)"#, false), // json-null `ob` → `->>` yields NULL → absent. ( - r#"SELECT eql_v3.has_ore_block_u64_8_256('{"ob":null}'::jsonb)"#, + r#"SELECT eql_v3.has_ore_block_256('{"ob":null}'::jsonb)"#, false, ), (r#"SELECT eql_v3.has_hmac_256('{"hm":"abc"}'::jsonb)"#, true), @@ -206,17 +203,16 @@ async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<() // Missing `ob` → RAISE. assert_raises( &pool, - r#"SELECT eql_v3.ore_block_u64_8_256('{"foo":1}'::jsonb)"#, + r#"SELECT eql_v3.ore_block_256('{"foo":1}'::jsonb)"#, &[], "Expected an ore index (ob) value", ) .await?; // NULL jsonb → NULL composite (STRICT short-circuit), NOT a raise. - let is_null: bool = - sqlx::query_scalar("SELECT eql_v3.ore_block_u64_8_256(NULL::jsonb) IS NULL") - .fetch_one(&pool) - .await?; + let is_null: bool = sqlx::query_scalar("SELECT eql_v3.ore_block_256(NULL::jsonb) IS NULL") + .fetch_one(&pool) + .await?; assert!( is_null, "NULL jsonb must extract to a NULL composite, not raise" @@ -312,7 +308,7 @@ async fn jsonb_array_to_bytea_array_input_shapes(pool: PgPool) -> Result<()> { Ok(()) } -/// T7 — Characterization of `eql_v3.jsonb_array_to_ore_block_u64_8_256(jsonb)` +/// T7 — Characterization of `eql_v3.jsonb_array_to_ore_block_256(jsonb)` /// across the same three input shapes. Safety net for the same plpgsql→sql /// inlining refactor. Behaviour pinned: /// - JSON null (`'null'`) → NULL composite @@ -325,7 +321,7 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { // SQL NULL (distinct from JSON null `'null'`). Not STRICT, so the body // runs: `jsonb_typeof(NULL)` is NULL → CASE guard not-true → ELSE NULL. let is_null: bool = - sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256(NULL::jsonb) IS NULL") + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_256(NULL::jsonb) IS NULL") .fetch_one(&pool) .await?; assert!( @@ -334,23 +330,22 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { ); // JSON null → NULL composite. - let is_null: bool = sqlx::query_scalar( - "SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('null'::jsonb) IS NULL", - ) - .fetch_one(&pool) - .await?; + let is_null: bool = + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_256('null'::jsonb) IS NULL") + .fetch_one(&pool) + .await?; assert!(is_null, "JSON null must yield NULL composite"); // Empty array → NULL composite. let is_null: bool = - sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('[]'::jsonb) IS NULL") + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_256('[]'::jsonb) IS NULL") .fetch_one(&pool) .await?; assert!(is_null, "empty JSON array must yield NULL composite"); // Single-element array → non-NULL composite with exactly 1 term. let term_count: i32 = sqlx::query_scalar( - "SELECT cardinality((eql_v3.jsonb_array_to_ore_block_u64_8_256('[\"aabb\"]'::jsonb)).terms)", + "SELECT cardinality((eql_v3.jsonb_array_to_ore_block_256('[\"aabb\"]'::jsonb)).terms)", ) .fetch_one(&pool) .await?; @@ -361,7 +356,7 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { // Populated array → non-NULL composite with one term per element. let term_count: i32 = sqlx::query_scalar( - "SELECT cardinality((eql_v3.jsonb_array_to_ore_block_u64_8_256('[\"aabb\",\"ccdd\",\"eeff\"]'::jsonb)).terms)", + "SELECT cardinality((eql_v3.jsonb_array_to_ore_block_256('[\"aabb\",\"ccdd\",\"eeff\"]'::jsonb)).terms)", ) .fetch_one(&pool) .await?; @@ -372,7 +367,7 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { // Deliberate delta: a non-array JSON scalar returns NULL (not a raise). let is_null: bool = - sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('5'::jsonb) IS NULL") + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_256('5'::jsonb) IS NULL") .fetch_one(&pool) .await?; assert!( @@ -383,7 +378,7 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { // Same delta for a non-array JSON object — `jsonb_typeof` is 'object', so // the CASE guard is not-true → ELSE NULL (not a raise). let is_null: bool = - sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_u64_8_256('{}'::jsonb) IS NULL") + sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_256('{}'::jsonb) IS NULL") .fetch_one(&pool) .await?; assert!( @@ -394,7 +389,7 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { Ok(()) } -/// T8 — Catalog pin for all three `compare_ore_block_u64_8_256_term(s)` overloads +/// T8 — Catalog pin for all three `compare_ore_block_256_term(s)` overloads /// (term×term, term[]×term[], composite×composite). Two load-bearing catalog /// properties are pinned at the same layer: /// @@ -420,8 +415,8 @@ async fn ore_comparators_are_immutable(pool: PgPool) -> Result<()> { FROM pg_catalog.pg_proc p WHERE p.pronamespace = 'eql_v3'::regnamespace AND p.proname IN ( - 'compare_ore_block_u64_8_256_term', - 'compare_ore_block_u64_8_256_terms' + 'compare_ore_block_256_term', + 'compare_ore_block_256_terms' ) ORDER BY args "#, @@ -440,11 +435,11 @@ async fn ore_comparators_are_immutable(pool: PgPool) -> Result<()> { for (args, provolatile, isstrict) in &rows { assert_eq!( provolatile, "i", - "compare_ore_block_u64_8_256_term(s)({args}) must be IMMUTABLE, got provolatile={provolatile}" + "compare_ore_block_256_term(s)({args}) must be IMMUTABLE, got provolatile={provolatile}" ); assert!( !isstrict, - "compare_ore_block_u64_8_256_term(s)({args}) must NOT be STRICT (NULL branches are load-bearing)" + "compare_ore_block_256_term(s)({args}) must NOT be STRICT (NULL branches are load-bearing)" ); } Ok(()) @@ -516,7 +511,7 @@ async fn bloom_filter_extractor_empty_array_is_empty_not_null(pool: PgPool) -> R } /// T10 — `eql_v3.has_bloom_filter(jsonb)` presence predicate. Mirrors the -/// `has_hmac_256` / `has_ore_block_u64_8_256` coverage in T5: its two-part guard +/// `has_hmac_256` / `has_ore_block_256` coverage in T5: its two-part guard /// (`val ? 'bf'` AND `val ->> 'bf' IS NOT NULL`) is exercised across present, /// absent, and json-null cases. The `{"bf":null}` → false case pins the /// `IS NOT NULL` half — the predicate is not reached transitively by the @@ -547,7 +542,7 @@ async fn has_bloom_filter_detects_bf_presence(pool: PgPool) -> Result<()> { Ok(()) } -/// T11 — Planner-selectivity metadata for the `eql_v3.ore_block_u64_8_256` +/// T11 — Planner-selectivity metadata for the `eql_v3.ore_block_256` /// `=` / `<>` operators. `<>` must use the inequality estimators /// (`neqsel` / `neqjoinsel`) and must NOT declare `HASHES` — an earlier revision /// copied `=`'s `eqsel` / `eqjoinsel` + `HASHES` onto `<>`, which is meaningless @@ -561,8 +556,8 @@ async fn ore_block_comparison_operators_declare_correct_selectivity(pool: PgPool SELECT o.oprrest::text, o.oprjoin::text, o.oprcanhash, o.oprcanmerge FROM pg_operator o WHERE o.oprname = '=' - AND o.oprleft = 'eql_v3.ore_block_u64_8_256'::regtype - AND o.oprright = 'eql_v3.ore_block_u64_8_256'::regtype + AND o.oprleft = 'eql_v3.ore_block_256'::regtype + AND o.oprright = 'eql_v3.ore_block_256'::regtype "#, ) .fetch_one(&pool) @@ -577,8 +572,8 @@ async fn ore_block_comparison_operators_declare_correct_selectivity(pool: PgPool SELECT o.oprrest::text, o.oprjoin::text, o.oprcanhash FROM pg_operator o WHERE o.oprname = '<>' - AND o.oprleft = 'eql_v3.ore_block_u64_8_256'::regtype - AND o.oprright = 'eql_v3.ore_block_u64_8_256'::regtype + AND o.oprleft = 'eql_v3.ore_block_256'::regtype + AND o.oprright = 'eql_v3.ore_block_256'::regtype "#, ) .fetch_one(&pool) From 71ac2384b5686902d614a44dc86106b91f8b83c0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 16 Jun 2026 14:33:55 +1000 Subject: [PATCH 203/599] docs(v3): keep the v2 source path in the ore_block_256 SEM comment The repo-wide rename sed over-rewrote a doc-comment reference to the v2 source file (src/ore_block_u64_8_256/functions.sql) that this v3 jsonb-only fork is a subset of. Restore the real v2 path (the v2 SEM dir keeps its name). --- src/v3/sem/ore_block_256/functions.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v3/sem/ore_block_256/functions.sql b/src/v3/sem/ore_block_256/functions.sql index 7d5bce885..2d0c48297 100644 --- a/src/v3/sem/ore_block_256/functions.sql +++ b/src/v3/sem/ore_block_256/functions.sql @@ -6,7 +6,7 @@ --! @file v3/sem/ore_block_256/functions.sql --! @brief ORE block construction, extraction, and comparison (eql_v3 SEM). --! ---! jsonb-only subset of src/ore_block_256/functions.sql. The +--! jsonb-only subset of src/ore_block_u64_8_256/functions.sql. The --! encrypted-column overloads are omitted; the helper jsonb_array_to_bytea_array --! and pgcrypto encrypt() are reached via the forked src/v3/common.sql and --! src/v3/crypto.sql so the whole closure stays under src/v3. (Doc comments From 4ec57eb517a1d23a8c76825ed2f6935e1dea25a2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 18:31:29 +1000 Subject: [PATCH 204/599] feat(v3): N-block ORE comparator + ordered numeric & timestamptz Derive the ORE block count N from term length instead of hardcoding 8, and wire the ordered numeric scalar while promoting timestamptz to ordered. --- Cargo.lock | 4 + crates/eql-scalars/src/lib.rs | 70 +++++++++++----- crates/eql-scalars/src/tests.rs | 46 ++++++++--- crates/eql-tests-macros/src/lib.rs | 14 +++- src/v3/sem/ore_block_256/functions.sql | 32 +++++++- tests/sqlx/Cargo.toml | 7 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 16 +++- tests/sqlx/src/fixtures/scalar_fixture.rs | 31 +++++++ tests/sqlx/src/scalar_domains.rs | 82 +++++++++++++++++++ tests/sqlx/src/scalar_types.rs | 1 + .../encrypted_domain/family/mutations.rs | 24 ++++-- .../sqlx/tests/ore_block_comparator_tests.rs | 52 ++++++++++++ 12 files changed, 329 insertions(+), 50 deletions(-) create mode 100644 tests/sqlx/tests/ore_block_comparator_tests.rs diff --git a/Cargo.lock b/Cargo.lock index 92723c937..367a00ce6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1208,6 +1208,7 @@ dependencies = [ "hex", "jsonschema", "paste", + "rust_decimal", "serde", "serde_json", "sqlx", @@ -3722,6 +3723,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", + "rust_decimal", "serde", "serde_json", "sha2", @@ -3803,6 +3805,7 @@ dependencies = [ "percent-encoding", "rand 0.8.6", "rsa", + "rust_decimal", "serde", "sha1", "sha2", @@ -3841,6 +3844,7 @@ dependencies = [ "memchr", "once_cell", "rand 0.8.6", + "rust_decimal", "serde", "serde_json", "sha2", diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index b9f87c704..7607609c5 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -230,13 +230,15 @@ const ORDERED_INT_DOMAINS: &[DomainSpec] = &[ }, ]; -/// Equality-only domains: storage (no terms) + `_eq` (hm). Used by scalar types -/// that can hash for equality but cannot (yet) be ordered. `timestamptz` is the -/// first such type: cipherstash encrypts `Plaintext::Timestamp` at native -/// 12-block ORE width, but EQL's only ORE comparator -/// (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so an -/// ordered domain would silently mis-order. Ordering is deferred until a -/// wide-ORE (12-block) term exists. +/// Equality-only domains: storage (no terms) + `_eq` (hm). The canonical shape +/// for a scalar type that can hash for equality but is not ORE-orderable. +/// **Currently unused:** `timestamptz` (the previous sole user) was promoted to +/// the ordered shape once `eql_v3.compare_ore_block_256_term` generalized to N +/// blocks and could order its native 12-block ORE width. Retained — and still +/// validated as a known-valid shape by `every_type_uses_a_known_domain_shape` — +/// so a future non-orderable scalar (e.g. a hash-only type) can reuse it without +/// reconstructing the shape. +#[allow(dead_code)] const EQ_ONLY_DOMAINS: &[DomainSpec] = &[ DomainSpec { suffix: "", @@ -296,6 +298,17 @@ const TIMESTAMPTZ_FIXTURES: &[Fixture] = fixtures!(timestamptz; "2012-06-30T11:59:59Z", "2016-03-15T08:15:30Z", "2020-10-21T14:45:00Z", "2024-02-29T17:30:45Z", "2038-01-19T03:14:07Z", "2099-12-31T23:59:59Z"); +/// `numeric` fixture plaintexts — distinct by `Decimal` value, spanning sign, +/// magnitude, and scale, and including `0` plus the min/max pivots +/// (`-1000000000000` / `1000000000000`). They mirror `ore-rs`'s own +/// order-pinning vectors so the 14-block ORE edges (sign + high/low blocks) are +/// exercised. Each literal is distinct by parsed value (no `"1"`/`"1.0"` +/// aliasing) — the harness `numeric_fixtures_distinct_by_value` guard enforces +/// this, since the zero-dep catalog only dedupes by literal string. +const NUMERIC_FIXTURES: &[Fixture] = fixtures!(numeric; + "-1000000000000", "-1000000", "-1.001", "-1", "-0.5", "-0.001", + "0", "0.001", "0.5", "0.999999999", "1", "1.001", "1000000", "1000000000000"); + const INT4: ScalarSpec = ScalarSpec { token: "int4", kind: ScalarKind::I32, @@ -332,27 +345,42 @@ pub const DATE: ScalarSpec = ScalarSpec { fixtures: DATE_FIXTURES, }; -/// `timestamptz` — an **equality-only** (UTC-normalized) non-integer scalar. -/// Uses `EQ_ONLY_DOMAINS` (storage + `_eq`) rather than the four-domain ordered -/// shape: cipherstash encrypts `Plaintext::Timestamp` at native 12-block ORE -/// width, but EQL's only ORE comparator -/// (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so an -/// ordered timestamptz domain would silently mis-order. Ordering is deferred to -/// a future PR that adds a wide-ORE (12-block) term. The three "pivot" fixture -/// values are retained as equality pivots; the kind stays ordered-shaped -/// (carries a rust type, no i128 range) so the harness can parse them. +/// `timestamptz` — an **ordered**, UTC-normalized non-integer scalar. Uses the +/// four-domain ordered shape (storage, `_eq`, `_ord`, `_ord_ore`): cipherstash +/// encrypts `Plaintext::Timestamp` at native 12-block ORE width, which the +/// generalized `eql_v3.compare_ore_block_256_term` comparator orders correctly. +/// Values are UTC-normalized (cipherstash has no tz-preserving type) and encrypt +/// under the `timestamp` cast. /// /// Public (like `DATE`) because the SQLx harness reads `TIMESTAMPTZ.fixtures` -/// directly to parse the RFC3339 strings into `chrono::DateTime` at -/// runtime — there is no `TIMESTAMPTZ_VALUES` const (chrono is not -/// `const`-friendly and `eql-scalars` stays zero-dep). +/// directly to parse the RFC3339 strings into `chrono::DateTime` at runtime +/// (no `TIMESTAMPTZ_VALUES` const; `eql-scalars` stays zero-dep). pub const TIMESTAMPTZ: ScalarSpec = ScalarSpec { token: "timestamptz", kind: ScalarKind::Timestamptz, - domains: EQ_ONLY_DOMAINS, + domains: ORDERED_INT_DOMAINS, fixtures: TIMESTAMPTZ_FIXTURES, }; +/// `numeric` — an **ordered** non-integer scalar backed by +/// `rust_decimal::Decimal`. Uses the four-domain ordered shape: cipherstash +/// encrypts `Plaintext::Decimal` at native 14-block ORE width, which the +/// generalized `eql_v3.compare_ore_block_256_term` comparator orders correctly. +/// `numeric_value` returns `None` (no i128 range); ordering is supplied by the +/// harness `Decimal: Ord`, which `ore-rs` guarantees agrees with the ciphertext +/// order (equivalent scales collide, like `Decimal`'s own `Ord`). +/// +/// Public (like `DATE` / `TIMESTAMPTZ`) so the SQLx harness reads +/// `NUMERIC.fixtures` directly to parse the decimal strings into +/// `rust_decimal::Decimal` at runtime (the catalog stays zero-dep: no +/// `rust_decimal`). +pub const NUMERIC: ScalarSpec = ScalarSpec { + token: "numeric", + kind: ScalarKind::Numeric, + domains: ORDERED_INT_DOMAINS, + fixtures: NUMERIC_FIXTURES, +}; + /// Domains for `text`: the ordered shape (with exact `hm` equality on the /// ordered domains), a `_match` domain (`Bloom` containment), and a combined /// `_search` domain carrying equality + ordering + match in one type. @@ -417,7 +445,7 @@ pub const TEXT: ScalarSpec = ScalarSpec { /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ, TEXT]; +pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ, NUMERIC, TEXT]; /// Materialise an integer scalar's fixtures into a typed `&'static` slice at /// compile time. This is the **single-sourced** plaintext list the SQLx test diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 853413375..1be3a65fb 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -170,7 +170,24 @@ mod rust_tests { let date = CATALOG.iter().find(|s| s.token == "date").unwrap(); assert!(!date.is_eq_only(), "date is ordered"); let ts = CATALOG.iter().find(|s| s.token == "timestamptz").unwrap(); - assert!(ts.is_eq_only(), "timestamptz is equality-only"); + assert!( + !ts.is_eq_only(), + "timestamptz is now ordered (native 12-block ORE, comparator generalized to N blocks)" + ); + + // No catalog type is currently eq-only, so exercise `is_eq_only()`'s + // positive path with a synthetic spec built on the retained + // `EQ_ONLY_DOMAINS` shape (storage + `_eq`, no `_ord`). + let eq_only = ScalarSpec { + token: "synthetic_eq_only", + kind: ScalarKind::Timestamptz, + domains: EQ_ONLY_DOMAINS, + fixtures: &[], + }; + assert!( + eq_only.is_eq_only(), + "a storage+_eq spec (no _ord) must be detected as eq-only" + ); } } @@ -496,11 +513,19 @@ mod catalog_tests { } #[test] - fn catalog_has_int4_int2_int8_date_timestamptz_text_in_order() { + fn catalog_has_int4_int2_int8_date_timestamptz_numeric_text_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); assert_eq!( tokens, - vec!["int4", "int2", "int8", "date", "timestamptz", "text"] + vec![ + "int4", + "int2", + "int8", + "date", + "timestamptz", + "numeric", + "text" + ] ); } @@ -710,17 +735,14 @@ mod catalog_tests { #[test] fn ordered_and_eq_only_shapes_are_used_as_declared() { - // Pin which catalog tokens carry which shape, so a row silently flipping - // ORDERED_INT_DOMAINS <-> EQ_ONLY_DOMAINS is caught. timestamptz is - // equality-only (12-block ORE vs 8-block comparator); the rest ordered - // (text adds `_match` and `_search` domains on top, so it is not - // eq_only either). + // All current catalog types use the four-domain ordered shape; none is + // equality-only. (timestamptz was promoted to ordered once the ORE + // comparator generalized to N blocks — see the numeric/ORE work.) for s in CATALOG { let is_eq_only = s.domains.len() == 2; - let expect_eq_only = s.token == "timestamptz"; - assert_eq!( - is_eq_only, expect_eq_only, - "{} domain shape (eq_only={is_eq_only}) does not match expectation", + assert!( + !is_eq_only, + "{} is unexpectedly eq-only; no catalog type is eq-only currently", s.token ); } diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index aba3ebaa6..8ad495200 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -93,6 +93,14 @@ fn is_text_token(token: &str) -> bool { spec_for_token(token).kind.is_text() } +/// True when `token`'s catalog row is the `numeric` kind (owned +/// `rust_decimal::Decimal`). Like `text` it is ordered but non-integer and +/// non-chrono, so it stamps the `numeric` fixture discriminator and draws its +/// values from the harness accessor (`numeric_values()`). +fn is_numeric_token(token: &str) -> bool { + matches!(spec_for_token(token).kind, eql_scalars::ScalarKind::Numeric) +} + /// True when `token`'s catalog row declares no ordered domain — equality-only. /// Replaces the `[eq_only]` marker. Consumed by [`matrix_suite_for_entry`] to /// keep an eq-only type out of the ordered matrix (which exercises ordering @@ -224,10 +232,12 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { format_ident!("temporal") } else if is_text_token(&token_str) { format_ident!("text") + } else if is_numeric_token(&token_str) { + format_ident!("numeric") } else { panic!( - "scalar token `{token_str}` is neither integer, temporal, nor \ - text — no fixture discriminator is wired for its kind" + "scalar token `{token_str}` is neither integer, temporal, text, \ + nor numeric — no fixture discriminator is wired for its kind" ) }; quote! { diff --git a/src/v3/sem/ore_block_256/functions.sql b/src/v3/sem/ore_block_256/functions.sql index 2d0c48297..3eca4f1d9 100644 --- a/src/v3/sem/ore_block_256/functions.sql +++ b/src/v3/sem/ore_block_256/functions.sql @@ -109,7 +109,16 @@ AS $$ left_block_size CONSTANT smallint := 16; right_block_size CONSTANT smallint := 32; - right_offset CONSTANT smallint := 136; -- 8 * 17 + + -- Block count N is DERIVED from the ciphertext length, not hardcoded to 8. + -- Wire format per term: + -- [ N PRP bytes ][ N*16B left blocks ][ 16B hash key ][ N*32B right blocks ] + -- octet_length = 17*N + 16 + 32*N = 49*N + 16 => N = (octet_length - 16) / 49 + -- This serves int4 (N=8, 408B), timestamp (N=12, 604B), and numeric + -- (N=14, 702B) with one comparator. + n integer; + left_offset integer; -- ordinal offset of the first left block (1 + N PRP bytes) + right_offset integer; -- ordinal start of the right CT (= total left CT length = 17*N) indicator smallint := 0; BEGIN @@ -129,10 +138,23 @@ AS $$ RAISE EXCEPTION 'Ciphertexts are different lengths'; END IF; - FOR block IN 0..7 LOOP + -- Well-formedness: length must be exactly 49*N + 16 for some N >= 1. The + -- modulo alone is insufficient -- a 16-byte term passes (16 - 16) % 49 = 0 + -- and derives N = 0, which would fall through to the all-blocks-equal path + -- and return 0 instead of raising. The `<= 16` clause is load-bearing. + IF octet_length(a.bytes) <= 16 OR (octet_length(a.bytes) - 16) % 49 != 0 THEN + RAISE EXCEPTION 'Malformed ORE term: % bytes', octet_length(a.bytes); + END IF; + + n := (octet_length(a.bytes) - 16) / 49; + left_offset := 1 + n; -- left blocks begin right after the N PRP bytes + right_offset := 17 * n; -- right CT begins right after the 17*N-byte left CT + + FOR block IN 0..n-1 LOOP + -- Compare each PRP byte (the first N bytes) and its 16-byte left block. IF substr(a.bytes, 1 + block, 1) != substr(b.bytes, 1 + block, 1) - OR substr(a.bytes, 9 + left_block_size * block, left_block_size) != substr(b.bytes, 9 + left_block_size * block, left_block_size) + OR substr(a.bytes, left_offset + left_block_size * block, left_block_size) != substr(b.bytes, left_offset + left_block_size * block, left_block_size) THEN IF eq THEN unequal_block := block; @@ -145,11 +167,13 @@ AS $$ RETURN 0::integer; END IF; + -- Hash key is the IV from the right CT of b. hash_key := substr(b.bytes, right_offset + 1, 16); + -- First right block is at right_offset + nonce_size (ordinally indexed). target_block := substr(b.bytes, right_offset + 17 + (unequal_block * right_block_size), right_block_size); - data_block := substr(a.bytes, 9 + (left_block_size * unequal_block), left_block_size); + data_block := substr(a.bytes, left_offset + (left_block_size * unequal_block), left_block_size); encrypt_block := encrypt(data_block::bytea, hash_key::bytea, 'aes-ecb'); diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index fbdd9506a..a142233cc 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "macros", "chrono"] } +sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "macros", "chrono", "rust_decimal"] } tokio = { version = "1", features = ["full"] } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -16,6 +16,11 @@ cipherstash-client = { version = "0.35", features = ["tokio"] } # it as a direct dependency so the harness can name `chrono::NaiveDate` for the # `date` scalar (Encode/Decode/Type come from the sqlx `chrono` feature above). chrono = { version = "0.4", default-features = false } +# rust_decimal backs the `numeric` scalar. The sqlx `rust_decimal` feature above +# provides Encode/Decode/Type; this names the type directly for the +# harness impls (scalar_domains.rs, eql_plaintext.rs). Already in the tree +# transitively (cipherstash-client / ore-rs). +rust_decimal = "1" paste = "1" eql-scalars = { path = "../../crates/eql-scalars" } eql-tests-macros = { path = "../../crates/eql-tests-macros" } diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 9e85aac57..f447429b1 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -60,6 +60,7 @@ impl PlaintextSqlType { pub const TIMESTAMPTZ: PlaintextSqlType = PlaintextSqlType("timestamp with time zone"); pub const TEXT: PlaintextSqlType = PlaintextSqlType("text"); pub const JSONB: PlaintextSqlType = PlaintextSqlType("jsonb"); + pub const NUMERIC: PlaintextSqlType = PlaintextSqlType("numeric"); pub fn as_str(&self) -> &'static str { self.0 @@ -86,7 +87,8 @@ const fn cast_for_kind(kind: ScalarKind) -> Cast { ScalarKind::Date => Cast::DATE, ScalarKind::Timestamptz => Cast::TIMESTAMP, ScalarKind::Text => Cast::TEXT, - ScalarKind::Numeric | ScalarKind::Jsonb => { + ScalarKind::Numeric => Cast::DECIMAL, + ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } } @@ -103,7 +105,8 @@ const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { ScalarKind::Date => PlaintextSqlType::DATE, ScalarKind::Timestamptz => PlaintextSqlType::TIMESTAMPTZ, ScalarKind::Text => PlaintextSqlType::TEXT, - ScalarKind::Numeric | ScalarKind::Jsonb => { + ScalarKind::Numeric => PlaintextSqlType::NUMERIC, + ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } } @@ -118,6 +121,7 @@ mod sealed { impl Sealed for chrono::DateTime {} impl Sealed for String {} impl Sealed for serde_json::Value {} + impl Sealed for rust_decimal::Decimal {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -213,6 +217,14 @@ impl EqlPlaintext for serde_json::Value { } } +impl EqlPlaintext for rust_decimal::Decimal { + const KIND: ScalarKind = ScalarKind::Numeric; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::Decimal(Some(*self)) + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 6efcfa3d7..b84f0a0df 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -138,6 +138,37 @@ macro_rules! scalar_fixture { } }; + // Numeric scalars (`rust_decimal::Decimal`): ordered, non-chrono. Same + // shape as `temporal` — `[Unique, Ore]` indexes, pivot-presence asserts via + // `OrderedScalar` — but materialised from owned `Decimal` values (no `Match` + // index, no chrono). + (numeric, $name:literal, $ty:ty, $values:expr $(,)?) => { + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); + + #[cfg(test)] + mod tests { + use super::*; + use $crate::scalar_domains::OrderedScalar; + + #[test] + fn spec_is_complete() { + assert!(spec().check_complete().is_ok()); + } + + #[test] + fn spec_includes_pivots() { + let spec = spec(); + let values = spec.values(); + let min = <$ty as OrderedScalar>::min_pivot(); + let mid = <$ty as OrderedScalar>::mid_pivot(); + let max = <$ty as OrderedScalar>::max_pivot(); + assert!(values.contains(&min), "spec must include min_pivot {min:?}"); + assert!(values.contains(&mid), "spec must include mid_pivot {mid:?}"); + assert!(values.contains(&max), "spec must include max_pivot {max:?}"); + } + } + }; + // Shared expansion: the `spec()` builder + the gated generator test. The // trailing `[Unique, Ore, ...]` token list parametrizes the index set. (@common $name:literal, $ty:ty, $values:expr, [$($ix:ident),+ $(,)?]) => { diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 16e5a088a..84bf9da2c 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -485,6 +485,88 @@ impl MatchScalar for String { // numeric origin / sign boundary. The signed-only sign-boundary test bounds on // `SignedScalar`, so a `String` instantiation of it would not compile. +// `numeric` is hand-written (like `text`): an owned `rust_decimal::Decimal`, +// not chrono-backed, so it parses the catalog's `Fixture::Numeric` strings into +// a `LazyLock>` rather than going through `temporal_values!`. The +// catalog stays zero-dep, so the parse happens here, not in `eql-scalars`. + +/// Typed `Decimal` fixture values, parsed once from `numeric`'s catalog row. +static NUMERIC_VALUES_CELL: std::sync::LazyLock> = + std::sync::LazyLock::new(|| { + use std::str::FromStr; + eql_scalars::NUMERIC + .fixtures + .iter() + .map(|f| match f { + eql_scalars::Fixture::Numeric(s) => rust_decimal::Decimal::from_str(s) + .unwrap_or_else(|e| panic!("invalid numeric catalog fixture {s:?}: {e}")), + other => panic!("non-numeric fixture in numeric catalog row: {other:?}"), + }) + .collect() + }); + +/// The `Decimal` fixture values, in catalog order. Public so the `eql_v2_numeric` +/// fixture module (emitted by `scalar_types!(fixture_modules)`) can hand the +/// slice to `scalar_fixture!`. +pub fn numeric_values() -> &'static [rust_decimal::Decimal] { + &NUMERIC_VALUES_CELL +} + +impl ScalarType for rust_decimal::Decimal { + const PG_TYPE: &'static str = "numeric"; + + fn fixture_values() -> &'static [Self] { + numeric_values() + } + // `to_sql_literal` inherits the default (`value.to_string()`): a `Decimal`'s + // `Display` form (e.g. `-1000000000000`, `0.001`) is a valid SQL numeric + // literal, so no quoting/override is needed (unlike `text` / `date`). +} + +impl OrderedScalar for rust_decimal::Decimal { + /// The smallest fixture decimal. Present verbatim in `fixture_values()`. + fn min_pivot() -> Self { + use std::str::FromStr; + rust_decimal::Decimal::from_str("-1000000000000").unwrap() + } + + /// The largest fixture decimal. Present verbatim in `fixture_values()`. + fn max_pivot() -> Self { + use std::str::FromStr; + rust_decimal::Decimal::from_str("1000000000000").unwrap() + } + // `mid_pivot` inherits the default `Self::default()` = `Decimal::ZERO` = 0, + // which is a real fixture and the numeric origin. +} + +// `Decimal` is deliberately NOT `SignedScalar`: like `text`, it is an +// ordered non-integer kind. The signed-only sign-boundary test bounds on +// `SignedScalar`, so it is not instantiated for numeric. + +/// `eql-scalars`' distinctness invariant keys `Fixture::Numeric` by its literal +/// string, so `"1"` and `"1.0"` would pass there as "distinct". But they denote +/// the same `Decimal` value (and collide in the ORE ciphertext, per ore-rs's +/// `equivalent_forms_collide_in_ciphertext`), so an aliasing pair would insert +/// duplicate `plaintext` rows and break `fetch_fixture_payload`'s `fetch_one`. +/// This guards distinctness by parsed value, which is the property the fixture +/// table relies on. +#[cfg(test)] +mod numeric_value_guards { + use super::*; + + #[test] + fn fixtures_are_distinct_by_value() { + use std::collections::HashSet; + let vals = numeric_values(); // &[Decimal], parsed from the catalog + let unique: HashSet<_> = vals.iter().collect(); + assert_eq!( + unique.len(), + vals.len(), + "two numeric fixtures alias to the same Decimal value", + ); + } +} + #[cfg(test)] mod text_value_tests { use super::*; diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index a51b288db..926d363de 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -56,6 +56,7 @@ macro_rules! scalar_types { int8 => i64, date => chrono::NaiveDate, timestamptz => chrono::DateTime, + numeric => rust_decimal::Decimal, text => String, } }; diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index f2399a2b7..889293a5b 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -212,15 +212,23 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { let mut ascending: Vec = ::fixture_values().to_vec(); ascending.sort(); - // Baseline: `<` works (no raise) and ORDER BY is plaintext-sorted. - let lt_baseline: Option = sqlx::query_scalar(lt_sql) - .bind(PLACEHOLDER_PAYLOAD) - .bind(PLACEHOLDER_PAYLOAD) - .fetch_one(&pool) - .await?; + // Baseline: `<` works (no raise) and ORDER BY is plaintext-sorted. Uses two + // REAL fixture ORE payloads (smallest two plaintexts), not PLACEHOLDER_PAYLOAD + // — the latter carries a 1-byte `ob` stub that the N-block comparator's + // well-formedness guard now (correctly) rejects. PLACEHOLDER stays in the + // post-mutation `assert_raises` below, where the `lt` blocker raises before + // the comparator ever inspects the term. + let lt_baseline: Option = sqlx::query_scalar( + "SELECT (SELECT payload FROM fixtures.eql_v2_int4 WHERE plaintext = $1)::eql_v3.int4_ord \ + < (SELECT payload FROM fixtures.eql_v2_int4 WHERE plaintext = $2)::eql_v3.int4_ord", + ) + .bind(ascending[0]) + .bind(ascending[1]) + .fetch_one(&pool) + .await?; ensure!( - lt_baseline.is_some(), - "baseline: `_ord` `<` must return a boolean (got {lt_baseline:?})" + lt_baseline == Some(true), + "baseline: smaller `_ord` `<` larger must be true (got {lt_baseline:?})" ); let order_baseline: Vec = sqlx::query_scalar(order_by_sql).fetch_all(&pool).await?; ensure!( diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs new file mode 100644 index 000000000..cec07bf4e --- /dev/null +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -0,0 +1,52 @@ +//! Direct unit tests for the generalized N-block ORE comparator +//! `eql_v3.compare_ore_block_256_term`. +//! +//! The malformed-length guards here are creds-free: they construct ORE terms +//! by hand from short byte strings, so they exercise the length validation +//! without needing real (ZeroKMS-generated) ciphertexts. The wide-term ordering +//! test (added in Phase 4) uses generated numeric fixtures. + +use anyhow::Result; +use sqlx::PgPool; + +/// A `bytea` whose length is NOT a valid `49*N + 16` must raise, not silently +/// return 0. Uses a 4-byte term (equal lengths so the equal-length guard does +/// not fire first). +#[sqlx::test] +async fn comparator_rejects_non_conforming_length(pool: PgPool) -> Result<()> { + let sql = "SELECT eql_v3.compare_ore_block_256_term( \ + ROW('\\x00010203'::bytea)::eql_v3.ore_block_256_term, \ + ROW('\\x04050607'::bytea)::eql_v3.ore_block_256_term)"; + let err = sqlx::query_scalar::<_, i32>(sql) + .fetch_one(&pool) + .await + .expect_err("a 4-byte ORE term must raise, not return a comparison"); + assert!( + err.to_string() + .to_lowercase() + .contains("malformed ore term"), + "expected malformed-term error, got: {err}" + ); + Ok(()) +} + +/// A 16-byte term satisfies `(16 - 16) % 49 == 0` and derives N = 0; the +/// `<= 16` clause must still reject it (otherwise it falls through to the +/// all-blocks-equal path and wrongly returns 0). +#[sqlx::test] +async fn comparator_rejects_sixteen_byte_term(pool: PgPool) -> Result<()> { + let sql = "SELECT eql_v3.compare_ore_block_256_term( \ + ROW(repeat('a', 16)::bytea)::eql_v3.ore_block_256_term, \ + ROW(repeat('b', 16)::bytea)::eql_v3.ore_block_256_term)"; + let err = sqlx::query_scalar::<_, i32>(sql) + .fetch_one(&pool) + .await + .expect_err("a 16-byte ORE term (N=0) must raise"); + assert!( + err.to_string() + .to_lowercase() + .contains("malformed ore term"), + "expected malformed-term error, got: {err}" + ); + Ok(()) +} From 20857e44dc3bc7c11806fde3e97aeefdeb0027e1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 19:15:00 +1000 Subject: [PATCH 205/599] test(v3): cover 14-block numeric + 12-block timestamptz ORE ordering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Direct comparator tests over generated fixtures: numeric terms are 702 bytes (N=14) and order across a full 14-value ascending chain spanning sign, magnitude, and fractional scale (so the left blocks decide ordering — the regression the missed 9 -> 1+n offset would fail); timestamptz terms are 604 bytes (N=12) and order 1900 < 2099. Verified end-to-end: numeric + timestamptz ordered matrix suites (211 each, incl. < <= > >= / ORDER BY / MIN / MAX) green; full SQLx suite 2026 passed; test:matrix:inventory reconciles both new ordered types; self-contained v3 install green. --- .../sqlx/tests/ore_block_comparator_tests.rs | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index cec07bf4e..6003d6d52 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -50,3 +50,81 @@ async fn comparator_rejects_sixteen_byte_term(pool: PgPool) -> Result<()> { ); Ok(()) } + +/// Width: a numeric ORE term must be 14 blocks => 49*14 + 16 = 702 bytes. +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric")))] +async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { + let width: i32 = sqlx::query_scalar( + "SELECT octet_length((((eql_v3.ord_term( \ + (SELECT payload FROM fixtures.eql_v2_numeric WHERE plaintext = (-1000000)::numeric) \ + ::eql_v3.numeric_ord)).terms)[1]).bytes)", + ) + .fetch_one(&pool) + .await?; + assert_eq!(width, 702, "numeric ORE term must be 14 blocks (702 bytes)"); + Ok(()) +} + +/// Full ascending chain of 14-block numeric terms: every adjacent pair must +/// order `-1`. Spans sign, magnitude, and fractional (low-block) scale, so the +/// left blocks — not just the right blocks — decide ordering. This is the +/// regression the missed `9 -> 1+n` left-offset would fail; a single pair could +/// pass against that bug. +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric")))] +async fn numeric_terms_order_in_ascending_chain(pool: PgPool) -> Result<()> { + let ascending = [ + "-1000000000000", + "-1000000", + "-1.001", + "-1", + "-0.5", + "-0.001", + "0", + "0.001", + "0.5", + "0.999999999", + "1", + "1.001", + "1000000", + "1000000000000", + ]; + for pair in ascending.windows(2) { + let (lo, hi) = (pair[0], pair[1]); + let cmp: i32 = sqlx::query_scalar(&format!( + "SELECT eql_v3.compare_ore_block_256_terms( \ + eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_numeric WHERE plaintext = ({lo})::numeric)::eql_v3.numeric_ord), \ + eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_numeric WHERE plaintext = ({hi})::numeric)::eql_v3.numeric_ord))" + )) + .fetch_one(&pool) + .await?; + assert_eq!(cmp, -1, "{lo} must order before {hi}"); + } + Ok(()) +} + +/// Symmetric 12-block (timestamptz, N=12 => 604 bytes) width + ordering check. +/// 12 is the only N strictly between the working 8 and the headline 14. +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_timestamptz")))] +async fn timestamptz_term_is_12_blocks_and_orders(pool: PgPool) -> Result<()> { + let width: i32 = sqlx::query_scalar( + "SELECT octet_length((((eql_v3.ord_term( \ + (SELECT payload FROM fixtures.eql_v2_timestamptz WHERE plaintext = '1970-01-01T00:00:00Z'::timestamptz) \ + ::eql_v3.timestamptz_ord)).terms)[1]).bytes)", + ) + .fetch_one(&pool) + .await?; + assert_eq!( + width, 604, + "timestamptz ORE term must be 12 blocks (604 bytes)" + ); + + let cmp: i32 = sqlx::query_scalar( + "SELECT eql_v3.compare_ore_block_256_terms( \ + eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_timestamptz WHERE plaintext = '1900-01-01T00:00:00Z'::timestamptz)::eql_v3.timestamptz_ord), \ + eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_timestamptz WHERE plaintext = '2099-12-31T23:59:59Z'::timestamptz)::eql_v3.timestamptz_ord))", + ) + .fetch_one(&pool) + .await?; + assert_eq!(cmp, -1, "1900 must order before 2099"); + Ok(()) +} From 74052a125ecf5e120c26a16b7f53aee3edc28917 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 19:16:40 +1000 Subject: [PATCH 206/599] docs(v3): changelog + reference for N-block ORE, ordered numeric/timestamptz MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CHANGELOG: rewrite the timestamptz entry (ordering now ships), add the numeric ordered-domain entry, and add a Fixed entry for the N-block ORE comparator generalization + the eql_v3 ore_block_u64_8_256 -> ore_block_256 rename. Reference guide: document the fourth (numeric/Decimal) fixture discriminator — proc-macro routing, scalar_fixture arm, numeric_values accessor + distinctness guard, rust_decimal dep. --- CHANGELOG.md | 7 +++- .../adding-a-scalar-encrypted-domain-type.md | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f60f4903d..c5e6997a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,8 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) - **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) -- **`eql_v3.timestamptz` encrypted-domain type family (equality-only).** Two jsonb-backed domains for encrypted `timestamptz` columns — `eql_v3.timestamptz` (storage-only) and `eql_v3.timestamptz_eq` (`=` / `<>` via HMAC) — generated from the `timestamptz` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast. Index via a functional index on the `eql_v3.eq_term` extractor, not an operator class on the domain. **Ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) is deferred:** cipherstash encrypts `Plaintext::Timestamp` at native 12-block ORE width, but EQL's only ORE comparator (`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so ordered timestamptz domains would silently mis-order. There are no `eql_v3.timestamptz_ord` / `_ord_ore` domains and no timestamptz `MIN` / `MAX` aggregates until a wide-ORE (12-block) term lands — tracked in [#241](https://github.com/cipherstash/encrypt-query-language/issues/241). Why: a type-safe, equality-searchable encrypted UTC-timestamp column, stacking on the `date` temporal-scalar foundation; ordering follows once the comparator supports the native ciphertext width. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) +- **`eql_v3.timestamptz` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `timestamptz` columns — `eql_v3.timestamptz` (storage-only), `eql_v3.timestamptz_eq` (`=` / `<>` via HMAC), and `eql_v3.timestamptz_ord` / `eql_v3.timestamptz_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 12-block ORE) — generated from the `timestamptz` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast. Ordering works because the `eql_v3` ORE block comparator now derives its block count from the ciphertext width (see the comparator entry below) instead of assuming 8. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) +- **`eql_v3.numeric` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `numeric` / `decimal` columns — `eql_v3.numeric` (storage-only), `eql_v3.numeric_eq` (`=` / `<>` via HMAC), and `eql_v3.numeric_ord` / `eql_v3.numeric_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 14-block ORE) — generated from the `numeric` row in `eql-scalars::CATALOG`. cipherstash encrypts `Plaintext::Decimal` at native 14-block ORE width; ordering matches `rust_decimal::Decimal` ordering exactly (equivalent scales such as `1` and `1.0` collide, like Postgres `numeric`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors. Why: a type-safe, ordered encrypted decimal column, the first scalar to exercise an ORE term wider than 8 blocks. ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) @@ -37,6 +38,10 @@ Each entry that ships in a published release links to the PR that introduced it. - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) +### Fixed + +- **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamptz` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241)) + ## [2.3.1] — 2026-05-21 ### Fixed diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 76d987dcd..9c6c107a8 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -326,6 +326,42 @@ first added) also needs, in `tests/sqlx/src/fixtures/eql_plaintext.rs`: `Plaintext::*` variant (`Plaintext::NaiveDate` / `Plaintext::Timestamp` / `Plaintext::Text`), plus the three mirrored `#[test]`s. +#### A fourth fixture shape: non-integer, non-chrono, non-text (`numeric` / `Decimal`) + +`numeric` (backed by `rust_decimal::Decimal`, 14-block ORE — the first scalar +whose ORE term is wider than 8 blocks) is ordered but is **neither** the integer +materialiser, **nor** chrono (`temporal`), **nor** `text` (it owns a `Decimal`, +not a `String`, and has no `Match` index). It therefore introduces a **fourth +fixture discriminator**, which means touching the proc-macro routing, not just +the type list. Beyond the §3.1 `eql_plaintext.rs` wiring above (`Cast::DECIMAL`, +`PlaintextSqlType::NUMERIC`, the `cast_for_kind` / `plaintext_sql_type_for_kind` +arms, `Sealed for Decimal`, `EqlPlaintext for Decimal` → `Plaintext::Decimal`), +it also needs: + +- an **`is_numeric_token`** arm in `crates/eql-tests-macros/src/lib.rs`'s + fixture-module router — without it `scalar_types!(fixture_modules)` panics at + compile time on the unrecognised kind (the router handled only `temporal` / + `text` before); +- a **`numeric` arm** in the `scalar_fixture!` macro + (`tests/sqlx/src/fixtures/scalar_fixture.rs`) — the temporal arm's twin + (`[Unique, Ore]`, pivot-presence asserts via `OrderedScalar`), but no `Match` + and no chrono; +- a hand-written **`numeric_values()`** accessor plus `impl ScalarType` / + `OrderedScalar for Decimal` in `tests/sqlx/src/scalar_domains.rs` — parsing the + catalog's `Fixture::Numeric` strings into a `LazyLock>` (the + catalog stays zero-dep; the parse lives in the harness). `Decimal: Ord` supplies + the expected sort order — `ore-rs` guarantees the ciphertext order agrees, and + equivalent scales (`1` ≡ `1.0`) collide like `Decimal`'s own `Ord`. Add a + **`fixtures_are_distinct_by_value`** guard (parse → `HashSet`): the zero-dep + catalog only dedupes by literal string, so `"1"` / `"1.0"` would slip past it + but collide in both the ORE ciphertext and the fixture table; +- the **`rust_decimal` dependency** + the sqlx **`rust_decimal` feature** in + `tests/sqlx/Cargo.toml` (in `[dependencies]`, not `[dev-dependencies]` — the + `Decimal` impls live in the crate's library code). + +See `docs/plans/2026-06-11-ore-block-comparator-n-blocks-design.md` for the full +worked example (and the N-block ORE comparator change the wide term relies on). + ### New-capability domains (e.g. `_match` / `Bloom`) A domain carrying a capability the matrix does not model — `text`'s `_match` From f186c7ead58d560a0cebc7b1180e67b833a82c67 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 15 Jun 2026 11:06:19 +1000 Subject: [PATCH 207/599] refactor(v3): finish ore_block_256 rename + sync codegen goldens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Complete the eql_v3.ore_block_u64_8_256 -> ore_block_256 rename across the docs (CLAUDE.md, the scalar guide, eql-functions, sql-support; eql_v2 names left unchanged) and the v3 SEM file header — the @file/subset comment had over-applied the rename to the v2-origin path (src/ore_block_u64_8_256). Regenerate the codegen reference goldens for every catalog type after rebasing onto eql_v3: add the numeric reference dir and expand timestamptz to its now-ordered shape so the parity gate passes. Also address review feedback: - ScalarKind::rust_type returns the now-real numeric type (rust_decimal::Decimal); only jsonb remains surfaceless. De-stale its doc and the 'timestamptz is equality-only' test comment; add numeric_maps_to_decimal. - Correct the guide's stale 'timestamptz is equality-only' prose and a dangling link to the removed design plan doc. - Add comparator_rejects_mismatched_block_widths (8-block vs 14-block terms must raise via the different-lengths guard). - Add the PR link (#276) to the numeric and N-block changelog entries. --- CHANGELOG.md | 4 +- crates/eql-scalars/src/kind.rs | 15 +- crates/eql-scalars/src/tests.rs | 14 +- .../adding-a-scalar-encrypted-domain-type.md | 22 +- .../numeric/numeric_eq_functions.sql | 407 ++++++++++++++++++ .../numeric/numeric_eq_operators.sql | 234 ++++++++++ .../reference/numeric/numeric_functions.sql | 404 +++++++++++++++++ .../reference/numeric/numeric_operators.sql | 228 ++++++++++ .../numeric/numeric_ord_aggregates.sql | 63 +++ .../numeric/numeric_ord_functions.sql | 396 +++++++++++++++++ .../numeric/numeric_ord_operators.sql | 246 +++++++++++ .../numeric/numeric_ord_ore_aggregates.sql | 63 +++ .../numeric/numeric_ord_ore_functions.sql | 396 +++++++++++++++++ .../numeric/numeric_ord_ore_operators.sql | 246 +++++++++++ .../reference/numeric/numeric_types.sql | 73 ++++ .../timestamptz_ord_aggregates.sql | 63 +++ .../timestamptz/timestamptz_ord_functions.sql | 396 +++++++++++++++++ .../timestamptz/timestamptz_ord_operators.sql | 246 +++++++++++ .../timestamptz_ord_ore_aggregates.sql | 63 +++ .../timestamptz_ord_ore_functions.sql | 396 +++++++++++++++++ .../timestamptz_ord_ore_operators.sql | 246 +++++++++++ .../timestamptz/timestamptz_types.sql | 32 ++ .../sqlx/tests/ore_block_comparator_tests.rs | 22 + 23 files changed, 4254 insertions(+), 21 deletions(-) create mode 100644 tests/codegen/reference/numeric/numeric_eq_functions.sql create mode 100644 tests/codegen/reference/numeric/numeric_eq_operators.sql create mode 100644 tests/codegen/reference/numeric/numeric_functions.sql create mode 100644 tests/codegen/reference/numeric/numeric_operators.sql create mode 100644 tests/codegen/reference/numeric/numeric_ord_aggregates.sql create mode 100644 tests/codegen/reference/numeric/numeric_ord_functions.sql create mode 100644 tests/codegen/reference/numeric/numeric_ord_operators.sql create mode 100644 tests/codegen/reference/numeric/numeric_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/numeric/numeric_ord_ore_functions.sql create mode 100644 tests/codegen/reference/numeric/numeric_ord_ore_operators.sql create mode 100644 tests/codegen/reference/numeric/numeric_types.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_ord_aggregates.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_ord_functions.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_ord_operators.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_ord_ore_functions.sql create mode 100644 tests/codegen/reference/timestamptz/timestamptz_ord_ore_operators.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index c5e6997a7..017b05d9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) - **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) - **`eql_v3.timestamptz` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `timestamptz` columns — `eql_v3.timestamptz` (storage-only), `eql_v3.timestamptz_eq` (`=` / `<>` via HMAC), and `eql_v3.timestamptz_ord` / `eql_v3.timestamptz_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 12-block ORE) — generated from the `timestamptz` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast. Ordering works because the `eql_v3` ORE block comparator now derives its block count from the ciphertext width (see the comparator entry below) instead of assuming 8. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) -- **`eql_v3.numeric` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `numeric` / `decimal` columns — `eql_v3.numeric` (storage-only), `eql_v3.numeric_eq` (`=` / `<>` via HMAC), and `eql_v3.numeric_ord` / `eql_v3.numeric_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 14-block ORE) — generated from the `numeric` row in `eql-scalars::CATALOG`. cipherstash encrypts `Plaintext::Decimal` at native 14-block ORE width; ordering matches `rust_decimal::Decimal` ordering exactly (equivalent scales such as `1` and `1.0` collide, like Postgres `numeric`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors. Why: a type-safe, ordered encrypted decimal column, the first scalar to exercise an ORE term wider than 8 blocks. ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241)) +- **`eql_v3.numeric` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `numeric` / `decimal` columns — `eql_v3.numeric` (storage-only), `eql_v3.numeric_eq` (`=` / `<>` via HMAC), and `eql_v3.numeric_ord` / `eql_v3.numeric_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 14-block ORE) — generated from the `numeric` row in `eql-scalars::CATALOG`. cipherstash encrypts `Plaintext::Decimal` at native 14-block ORE width; ordering matches `rust_decimal::Decimal` ordering exactly (equivalent scales such as `1` and `1.0` collide, like Postgres `numeric`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors. Why: a type-safe, ordered encrypted decimal column, the first scalar to exercise an ORE term wider than 8 blocks. ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) @@ -40,7 +40,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Fixed -- **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamptz` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241)) +- **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamptz` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) ## [2.3.1] — 2026-05-21 diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-scalars/src/kind.rs index 69ab70f5a..e91813daf 100644 --- a/crates/eql-scalars/src/kind.rs +++ b/crates/eql-scalars/src/kind.rs @@ -97,11 +97,11 @@ impl ScalarKind { } /// A debug/identifier string for the kind: the canonical Rust plaintext type - /// name (`"i32"`, `"chrono::NaiveDate"`). `Numeric`/`Jsonb` have **no - /// generated SQL surface** and no catalog row, so calling this on them is a - /// programming error and panics loudly rather than returning a plausible SQL - /// token a premature caller might feed into codegen. Only call site today is - /// `crates/eql-scalars/src/tests.rs`. + /// name (`"i32"`, `"chrono::NaiveDate"`, `"rust_decimal::Decimal"`). `Jsonb` + /// has **no generated SQL surface** and no catalog row, so calling this on it + /// is a programming error and panics loudly rather than returning a plausible + /// SQL token a premature caller might feed into codegen. Only call site today + /// is `crates/eql-scalars/src/tests.rs`. pub const fn rust_type(self) -> &'static str { match self { ScalarKind::I16 => "i16", @@ -110,8 +110,9 @@ impl ScalarKind { ScalarKind::Text => "text", ScalarKind::Date => "chrono::NaiveDate", ScalarKind::Timestamptz => "chrono::DateTime", - ScalarKind::Numeric | ScalarKind::Jsonb => { - panic!("ScalarKind::rust_type: numeric/jsonb have no generated surface yet") + ScalarKind::Numeric => "rust_decimal::Decimal", + ScalarKind::Jsonb => { + panic!("ScalarKind::rust_type: jsonb has no generated surface yet") } } } diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 1be3a65fb..be5e98807 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -125,14 +125,24 @@ mod rust_tests { #[test] fn timestamptz_maps_to_datetime() { - // Temporal, non-integer, equality-only kind: it carries a rust type but - // no i128 range, so it is not `is_int()` and `as_bounded_int()` returns + // Temporal, non-integer, ordered kind: it carries a rust type but no + // i128 range, so it is not `is_int()` and `as_bounded_int()` returns // `None` — the bounded accessors are not reachable for it. assert_eq!(ScalarKind::Timestamptz.rust_type(), "chrono::DateTime"); assert!(!ScalarKind::Timestamptz.is_int()); assert_eq!(ScalarKind::Timestamptz.as_bounded_int(), None); } + #[test] + fn numeric_maps_to_decimal() { + // Ordered, non-integer, non-chrono kind (14-block ORE): carries a rust + // type but no i128 range, so it is not `is_int()` and `as_bounded_int()` + // returns `None`. Pins the now-real `rust_type` arm (it no longer panics). + assert_eq!(ScalarKind::Numeric.rust_type(), "rust_decimal::Decimal"); + assert!(!ScalarKind::Numeric.is_int()); + assert_eq!(ScalarKind::Numeric.as_bounded_int(), None); + } + /// The structural guarantee that replaces the old runtime panics: a /// `Min`/`Max`/`Zero` pivot sentinel may only appear in a `CATALOG` row whose /// kind is an integer kind. `numeric_value` would resolve to `None` for a diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 9c6c107a8..8c0bdf6e2 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -204,14 +204,16 @@ there is no `_VALUES` const; the SQLx harness parses the catalog strings into A **temporal** scalar (`date` is the *ordered* temporal reference) is *ordered but non-integer*, so it diverges from the integer path in three places — all in the catalog/harness, never the SQL codegen (domains stay jsonb-backed and -token-driven). **`timestamptz` is the exception: it is equality-only, not -ordered** — its catalog row uses `EQ_ONLY_DOMAINS` (storage + `_eq`, no -`_ord`/`_ord_ore`), the eq-only shape of §3, because cipherstash encrypts -`Plaintext::Timestamp` at native 12-block ORE width while EQL's only comparator -(`eql_v2.compare_ore_block_u64_8_256_term`) is hardcoded to 8 blocks, so an -ordered `timestamptz` domain would silently mis-order (see the catalog comment on -the `TIMESTAMPTZ` spec). Its value-wiring is still the temporal path below; only -its domain set differs. The three divergences (for the ordered `date`): +token-driven). **`timestamptz` follows the same *ordered* temporal path as +`date`** — its catalog row carries the full ordered domain set (storage + `_eq` + +`_ord`/`_ord_ore`). cipherstash encrypts `Plaintext::Timestamp` at native +12-block ORE width, and the `eql_v3` comparator +(`eql_v3.compare_ore_block_256_term`) now derives its block count `N` from the +term length instead of assuming 8, so the 12-block ciphertexts order correctly +(see the N-block ORE comparator entry in the `CHANGELOG.md` and the catalog +comment on the `TIMESTAMPTZ` spec). Its value-wiring is the temporal path below; +the only practical difference from `date` is that values are UTC-normalized. The +three divergences (for the ordered `date`): - **String-backed fixtures.** `eql-scalars` stays zero-dependency, so the catalog stores ISO strings (`Fixture::Date("1970-01-01")`), not `chrono` @@ -359,8 +361,8 @@ it also needs: `tests/sqlx/Cargo.toml` (in `[dependencies]`, not `[dev-dependencies]` — the `Decimal` impls live in the crate's library code). -See `docs/plans/2026-06-11-ore-block-comparator-n-blocks-design.md` for the full -worked example (and the N-block ORE comparator change the wide term relies on). +See the N-block ORE comparator entry in the `CHANGELOG.md` for the comparator +change the wide `numeric` / `timestamptz` terms rely on. ### New-capability domains (e.g. `_match` / `Bloom`) diff --git a/tests/codegen/reference/numeric/numeric_eq_functions.sql b/tests/codegen/reference/numeric/numeric_eq_functions.sql new file mode 100644 index 000000000..2b20d70b0 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/numeric/numeric_eq_functions.sql +--! @brief Functions for eql_v3.numeric_eq. + +--! @brief Index extractor for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.numeric_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.numeric_eq) $$; + +--! @brief Operator wrapper for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.numeric_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.numeric_eq) $$; + +--! @brief Operator wrapper for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.numeric_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.numeric_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param selector text +--! @return eql_v3.numeric_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric_eq, selector text) +RETURNS eql_v3.numeric_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param selector integer +--! @return eql_v3.numeric_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric_eq, selector integer) +RETURNS eql_v3.numeric_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param selector eql_v3.numeric_eq +--! @return eql_v3.numeric_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.numeric_eq) +RETURNS eql_v3.numeric_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param selector eql_v3.numeric_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.numeric_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.numeric_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.numeric_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.numeric_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.numeric_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.numeric_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.numeric_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.numeric_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.numeric_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b eql_v3.numeric_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric_eq, b eql_v3.numeric_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a eql_v3.numeric_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_eq. +--! @param a jsonb +--! @param b eql_v3.numeric_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.numeric_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/numeric/numeric_eq_operators.sql b/tests/codegen/reference/numeric/numeric_eq_operators.sql new file mode 100644 index 000000000..6ec235708 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_eq_functions.sql + +--! @file encrypted_domain/numeric/numeric_eq_operators.sql +--! @brief Operators for eql_v3.numeric_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq +); diff --git a/tests/codegen/reference/numeric/numeric_functions.sql b/tests/codegen/reference/numeric/numeric_functions.sql new file mode 100644 index 000000000..9c6146ab0 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/numeric/numeric_functions.sql +--! @brief Functions for eql_v3.numeric. + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.numeric) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param selector text +--! @return eql_v3.numeric +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric, selector text) +RETURNS eql_v3.numeric IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param selector integer +--! @return eql_v3.numeric +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric, selector integer) +RETURNS eql_v3.numeric IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param selector eql_v3.numeric +--! @return eql_v3.numeric +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.numeric) +RETURNS eql_v3.numeric IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param selector eql_v3.numeric +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.numeric) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.numeric, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.numeric, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.numeric, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.numeric, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.numeric, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.numeric, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.numeric, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.numeric, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b eql_v3.numeric +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric, b eql_v3.numeric) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a eql_v3.numeric +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric. +--! @param a jsonb +--! @param b eql_v3.numeric +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.numeric) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/numeric/numeric_operators.sql b/tests/codegen/reference/numeric/numeric_operators.sql new file mode 100644 index 000000000..b62f419eb --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_functions.sql + +--! @file encrypted_domain/numeric/numeric_operators.sql +--! @brief Operators for eql_v3.numeric. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.numeric, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.numeric, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.numeric, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.numeric, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.numeric, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.numeric, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.numeric, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.numeric, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric +); diff --git a/tests/codegen/reference/numeric/numeric_ord_aggregates.sql b/tests/codegen/reference/numeric/numeric_ord_aggregates.sql new file mode 100644 index 000000000..03bf02c1e --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_functions.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_operators.sql + +--! @file encrypted_domain/numeric/numeric_ord_aggregates.sql +--! @brief Aggregates for eql_v3.numeric_ord. + +--! @brief State function for min on eql_v3.numeric_ord. +--! @param state eql_v3.numeric_ord +--! @param value eql_v3.numeric_ord +--! @return eql_v3.numeric_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.numeric_ord, value eql_v3.numeric_ord) +RETURNS eql_v3.numeric_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.numeric_ord. +--! @param input eql_v3.numeric_ord +--! @return eql_v3.numeric_ord +CREATE AGGREGATE eql_v3.min(eql_v3.numeric_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.numeric_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.numeric_ord. +--! @param state eql_v3.numeric_ord +--! @param value eql_v3.numeric_ord +--! @return eql_v3.numeric_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.numeric_ord, value eql_v3.numeric_ord) +RETURNS eql_v3.numeric_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.numeric_ord. +--! @param input eql_v3.numeric_ord +--! @return eql_v3.numeric_ord +CREATE AGGREGATE eql_v3.max(eql_v3.numeric_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.numeric_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/numeric/numeric_ord_functions.sql b/tests/codegen/reference/numeric/numeric_ord_functions.sql new file mode 100644 index 000000000..5467f8349 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/numeric/numeric_ord_functions.sql +--! @brief Functions for eql_v3.numeric_ord. + +--! @brief Index extractor for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.numeric_ord) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.numeric_ord) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.numeric_ord) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.numeric_ord) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.numeric_ord) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.numeric_ord) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.numeric_ord) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.numeric_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param selector text +--! @return eql_v3.numeric_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric_ord, selector text) +RETURNS eql_v3.numeric_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param selector integer +--! @return eql_v3.numeric_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric_ord, selector integer) +RETURNS eql_v3.numeric_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a jsonb +--! @param selector eql_v3.numeric_ord +--! @return eql_v3.numeric_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.numeric_ord) +RETURNS eql_v3.numeric_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a jsonb +--! @param selector eql_v3.numeric_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.numeric_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.numeric_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.numeric_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.numeric_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.numeric_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.numeric_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.numeric_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.numeric_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.numeric_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b eql_v3.numeric_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric_ord, b eql_v3.numeric_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a eql_v3.numeric_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord. +--! @param a jsonb +--! @param b eql_v3.numeric_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.numeric_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/numeric/numeric_ord_operators.sql b/tests/codegen/reference/numeric/numeric_ord_operators.sql new file mode 100644 index 000000000..847bf6a10 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_operators.sql +--! @brief Operators for eql_v3.numeric_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord +); diff --git a/tests/codegen/reference/numeric/numeric_ord_ore_aggregates.sql b/tests/codegen/reference/numeric/numeric_ord_ore_aggregates.sql new file mode 100644 index 000000000..e78a6ffbb --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_operators.sql + +--! @file encrypted_domain/numeric/numeric_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.numeric_ord_ore. + +--! @brief State function for min on eql_v3.numeric_ord_ore. +--! @param state eql_v3.numeric_ord_ore +--! @param value eql_v3.numeric_ord_ore +--! @return eql_v3.numeric_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.numeric_ord_ore, value eql_v3.numeric_ord_ore) +RETURNS eql_v3.numeric_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.numeric_ord_ore. +--! @param input eql_v3.numeric_ord_ore +--! @return eql_v3.numeric_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.numeric_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.numeric_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.numeric_ord_ore. +--! @param state eql_v3.numeric_ord_ore +--! @param value eql_v3.numeric_ord_ore +--! @return eql_v3.numeric_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.numeric_ord_ore, value eql_v3.numeric_ord_ore) +RETURNS eql_v3.numeric_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.numeric_ord_ore. +--! @param input eql_v3.numeric_ord_ore +--! @return eql_v3.numeric_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.numeric_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.numeric_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/numeric/numeric_ord_ore_functions.sql b/tests/codegen/reference/numeric/numeric_ord_ore_functions.sql new file mode 100644 index 000000000..a62ab25a0 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/numeric/numeric_ord_ore_functions.sql +--! @brief Functions for eql_v3.numeric_ord_ore. + +--! @brief Index extractor for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.numeric_ord_ore) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param selector text +--! @return eql_v3.numeric_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric_ord_ore, selector text) +RETURNS eql_v3.numeric_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param selector integer +--! @return eql_v3.numeric_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.numeric_ord_ore, selector integer) +RETURNS eql_v3.numeric_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.numeric_ord_ore +--! @return eql_v3.numeric_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.numeric_ord_ore) +RETURNS eql_v3.numeric_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.numeric_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.numeric_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.numeric_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.numeric_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.numeric_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.numeric_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.numeric_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.numeric_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.numeric_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.numeric_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.numeric_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.numeric_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b eql_v3.numeric_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a eql_v3.numeric_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.numeric_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore. +--! @param a jsonb +--! @param b eql_v3.numeric_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.numeric_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/numeric/numeric_ord_ore_operators.sql b/tests/codegen/reference/numeric/numeric_ord_ore_operators.sql new file mode 100644 index 000000000..e449a61a5 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_ore_operators.sql +--! @brief Operators for eql_v3.numeric_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore +); diff --git a/tests/codegen/reference/numeric/numeric_types.sql b/tests/codegen/reference/numeric/numeric_types.sql new file mode 100644 index 000000000..6c9b85d39 --- /dev/null +++ b/tests/codegen/reference/numeric/numeric_types.sql @@ -0,0 +1,73 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/numeric/numeric_types.sql +--! @brief Encrypted-domain types for numeric. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.numeric. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.numeric AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.numeric_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.numeric_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.numeric_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.numeric_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.numeric_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.numeric_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; diff --git a/tests/codegen/reference/timestamptz/timestamptz_ord_aggregates.sql b/tests/codegen/reference/timestamptz/timestamptz_ord_aggregates.sql new file mode 100644 index 000000000..637fb338f --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_ord_functions.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_ord_operators.sql + +--! @file encrypted_domain/timestamptz/timestamptz_ord_aggregates.sql +--! @brief Aggregates for eql_v3.timestamptz_ord. + +--! @brief State function for min on eql_v3.timestamptz_ord. +--! @param state eql_v3.timestamptz_ord +--! @param value eql_v3.timestamptz_ord +--! @return eql_v3.timestamptz_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.timestamptz_ord, value eql_v3.timestamptz_ord) +RETURNS eql_v3.timestamptz_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.timestamptz_ord. +--! @param input eql_v3.timestamptz_ord +--! @return eql_v3.timestamptz_ord +CREATE AGGREGATE eql_v3.min(eql_v3.timestamptz_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.timestamptz_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.timestamptz_ord. +--! @param state eql_v3.timestamptz_ord +--! @param value eql_v3.timestamptz_ord +--! @return eql_v3.timestamptz_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.timestamptz_ord, value eql_v3.timestamptz_ord) +RETURNS eql_v3.timestamptz_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.timestamptz_ord. +--! @param input eql_v3.timestamptz_ord +--! @return eql_v3.timestamptz_ord +CREATE AGGREGATE eql_v3.max(eql_v3.timestamptz_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.timestamptz_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/timestamptz/timestamptz_ord_functions.sql b/tests/codegen/reference/timestamptz/timestamptz_ord_functions.sql new file mode 100644 index 000000000..518e8e8d1 --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/timestamptz/timestamptz_ord_functions.sql +--! @brief Functions for eql_v3.timestamptz_ord. + +--! @brief Index extractor for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.timestamptz_ord) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.timestamptz_ord) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.timestamptz_ord) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.timestamptz_ord) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.timestamptz_ord) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.timestamptz_ord) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.timestamptz_ord) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.timestamptz_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param selector text +--! @return eql_v3.timestamptz_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz_ord, selector text) +RETURNS eql_v3.timestamptz_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param selector integer +--! @return eql_v3.timestamptz_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz_ord, selector integer) +RETURNS eql_v3.timestamptz_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param selector eql_v3.timestamptz_ord +--! @return eql_v3.timestamptz_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.timestamptz_ord) +RETURNS eql_v3.timestamptz_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param selector eql_v3.timestamptz_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.timestamptz_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.timestamptz_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.timestamptz_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.timestamptz_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.timestamptz_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.timestamptz_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.timestamptz_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.timestamptz_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.timestamptz_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b eql_v3.timestamptz_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz_ord, b eql_v3.timestamptz_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a eql_v3.timestamptz_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.timestamptz_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/timestamptz/timestamptz_ord_operators.sql b/tests/codegen/reference/timestamptz/timestamptz_ord_operators.sql new file mode 100644 index 000000000..3a05729bb --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_ord_functions.sql + +--! @file encrypted_domain/timestamptz/timestamptz_ord_operators.sql +--! @brief Operators for eql_v3.timestamptz_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = eql_v3.timestamptz_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord +); diff --git a/tests/codegen/reference/timestamptz/timestamptz_ord_ore_aggregates.sql b/tests/codegen/reference/timestamptz/timestamptz_ord_ore_aggregates.sql new file mode 100644 index 000000000..73bae985d --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_ord_ore_operators.sql + +--! @file encrypted_domain/timestamptz/timestamptz_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.timestamptz_ord_ore. + +--! @brief State function for min on eql_v3.timestamptz_ord_ore. +--! @param state eql_v3.timestamptz_ord_ore +--! @param value eql_v3.timestamptz_ord_ore +--! @return eql_v3.timestamptz_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.timestamptz_ord_ore, value eql_v3.timestamptz_ord_ore) +RETURNS eql_v3.timestamptz_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.timestamptz_ord_ore. +--! @param input eql_v3.timestamptz_ord_ore +--! @return eql_v3.timestamptz_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.timestamptz_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.timestamptz_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.timestamptz_ord_ore. +--! @param state eql_v3.timestamptz_ord_ore +--! @param value eql_v3.timestamptz_ord_ore +--! @return eql_v3.timestamptz_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.timestamptz_ord_ore, value eql_v3.timestamptz_ord_ore) +RETURNS eql_v3.timestamptz_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.timestamptz_ord_ore. +--! @param input eql_v3.timestamptz_ord_ore +--! @return eql_v3.timestamptz_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.timestamptz_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.timestamptz_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/timestamptz/timestamptz_ord_ore_functions.sql b/tests/codegen/reference/timestamptz/timestamptz_ord_ore_functions.sql new file mode 100644 index 000000000..c93ddef7f --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/timestamptz/timestamptz_ord_ore_functions.sql +--! @brief Functions for eql_v3.timestamptz_ord_ore. + +--! @brief Index extractor for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.timestamptz_ord_ore) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.timestamptz_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.timestamptz_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.timestamptz_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.timestamptz_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.timestamptz_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.timestamptz_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamptz_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param selector text +--! @return eql_v3.timestamptz_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz_ord_ore, selector text) +RETURNS eql_v3.timestamptz_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param selector integer +--! @return eql_v3.timestamptz_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.timestamptz_ord_ore, selector integer) +RETURNS eql_v3.timestamptz_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.timestamptz_ord_ore +--! @return eql_v3.timestamptz_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.timestamptz_ord_ore) +RETURNS eql_v3.timestamptz_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.timestamptz_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.timestamptz_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.timestamptz_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.timestamptz_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.timestamptz_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.timestamptz_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.timestamptz_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.timestamptz_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.timestamptz_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.timestamptz_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.timestamptz_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.timestamptz_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b eql_v3.timestamptz_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz_ord_ore, b eql_v3.timestamptz_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a eql_v3.timestamptz_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.timestamptz_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.timestamptz_ord_ore. +--! @param a jsonb +--! @param b eql_v3.timestamptz_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.timestamptz_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamptz_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/timestamptz/timestamptz_ord_ore_operators.sql b/tests/codegen/reference/timestamptz/timestamptz_ord_ore_operators.sql new file mode 100644 index 000000000..d5b7980c0 --- /dev/null +++ b/tests/codegen/reference/timestamptz/timestamptz_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_types.sql +-- REQUIRE: src/v3/scalars/timestamptz/timestamptz_ord_ore_functions.sql + +--! @file encrypted_domain/timestamptz/timestamptz_ord_ore_operators.sql +--! @brief Operators for eql_v3.timestamptz_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = eql_v3.timestamptz_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.timestamptz_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.timestamptz_ord_ore +); diff --git a/tests/codegen/reference/timestamptz/timestamptz_types.sql b/tests/codegen/reference/timestamptz/timestamptz_types.sql index 61445e873..38930d167 100644 --- a/tests/codegen/reference/timestamptz/timestamptz_types.sql +++ b/tests/codegen/reference/timestamptz/timestamptz_types.sql @@ -37,5 +37,37 @@ BEGIN AND VALUE->>'v' = '2' ); END IF; + + --! @brief Encrypted domain eql_v3.timestamptz_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamptz_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.timestamptz_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.timestamptz_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamptz_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.timestamptz_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; END $$; diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index 6003d6d52..7fcc5eb30 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -51,6 +51,28 @@ async fn comparator_rejects_sixteen_byte_term(pool: PgPool) -> Result<()> { Ok(()) } +/// Cross-width footgun: now that N is derived per-term, comparing terms of two +/// different (individually valid) widths must raise via the equal-length guard, +/// not silently compare the shared prefix. Both lengths here are well-formed — +/// 408 = 49*8 + 16 (the int4 width, N=8) and 702 = 49*14 + 16 (the numeric +/// width, N=14) — so the only thing that fires is the different-lengths check, +/// ahead of the malformed-length guard. Creds-free (hand-built bytea). +#[sqlx::test] +async fn comparator_rejects_mismatched_block_widths(pool: PgPool) -> Result<()> { + let sql = "SELECT eql_v3.compare_ore_block_256_term( \ + ROW(repeat('a', 408)::bytea)::eql_v3.ore_block_256_term, \ + ROW(repeat('b', 702)::bytea)::eql_v3.ore_block_256_term)"; + let err = sqlx::query_scalar::<_, i32>(sql) + .fetch_one(&pool) + .await + .expect_err("an 8-block vs 14-block ORE term comparison must raise"); + assert!( + err.to_string().to_lowercase().contains("different lengths"), + "expected different-lengths error, got: {err}" + ); + Ok(()) +} + /// Width: a numeric ORE term must be 14 blocks => 49*14 + 16 = 702 bytes. #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric")))] async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { From 8786cd6ef03bc490eadc9594dffc335b5e9d251d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 15 Jun 2026 20:56:39 +1000 Subject: [PATCH 208/599] fix(v3): reject non-array ore 'ob' payloads at the extractor boundary has_ore_block_256 used "val ->> 'ob' IS NOT NULL", which stringifies a scalar/object 'ob' and reports it present. ore_block_256 then fed the malformed payload into jsonb_array_to_ore_block_256, which returns NULL instead of raising, silently degrading a structurally invalid ORE term into a NULL comparison/index term. Tighten the guard to require a JSON array (jsonb_typeof(val->'ob') = 'array'); a present-but-non-array 'ob' now RAISEs at the extractor boundary. '{}' (absent ob) and '{"ob": null}' (JSON null) remain absent (false). Adds T5 characterization cases for the scalar/object 'ob' presence checks and the extractor RAISE. Addresses CodeRabbit review thread on PR #276. --- src/v3/sem/ore_block_256/functions.sql | 21 +++++++++++----- .../sqlx/tests/encrypted_domain/family/sem.rs | 24 +++++++++++++++++-- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/v3/sem/ore_block_256/functions.sql b/src/v3/sem/ore_block_256/functions.sql index 3eca4f1d9..0cd323d86 100644 --- a/src/v3/sem/ore_block_256/functions.sql +++ b/src/v3/sem/ore_block_256/functions.sql @@ -22,9 +22,10 @@ --! This deliberately diverges from the v2 plpgsql equivalent (intentionally --! left unchanged): the `CASE WHEN jsonb_typeof(val) = 'array'` guard only --! evaluates the array path for an array, so a non-array JSON scalar returns ---! NULL here instead of raising. The sole caller passes `val->'ob'`, always an ---! array or JSON null, so the divergence is unreachable in practice; JSON null ---! and empty array still return NULL exactly as before. +--! NULL here instead of raising. The sole caller (`ore_block_256`) only reaches +--! this when `has_ore_block_256(val)` is true, which now requires `val->'ob'` +--! to be a JSON array, so the non-array branch is unreachable in practice; +--! empty array still returns NULL exactly as before (pinned by T7). CREATE FUNCTION eql_v3.jsonb_array_to_ore_block_256(val jsonb) RETURNS eql_v3.ore_block_256 IMMUTABLE @@ -67,16 +68,24 @@ AS $$ $$ LANGUAGE plpgsql; ---! @brief Check if JSONB payload contains ORE block index term +--! @brief Check if JSONB payload contains an ORE block index term --! @param val jsonb containing encrypted EQL payload ---! @return boolean True if 'ob' field is present and non-null +--! @return boolean True only if the 'ob' field is present and is a JSON array +--! @note A well-formed ORE index term is always a JSON array of block terms, so +--! this guard treats a present-but-non-array `ob` (a scalar or object) as +--! absent. That makes the extractor `ore_block_256(val)` RAISE on a +--! structurally invalid `ob` payload at the boundary instead of silently +--! degrading it to a NULL index term in `jsonb_array_to_ore_block_256`. The +--! previous `val ->> 'ob' IS NOT NULL` form stringified scalars/objects and so +--! reported them as present. `{}` (absent `ob`) and `{"ob": null}` (JSON null) +--! both remain `false`. CREATE FUNCTION eql_v3.has_ore_block_256(val jsonb) RETURNS boolean IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ BEGIN - RETURN val ->> 'ob' IS NOT NULL; + RETURN COALESCE(jsonb_typeof(val -> 'ob') = 'array', false); END; $$ LANGUAGE plpgsql; diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index fe2593b9c..fd675673d 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -178,7 +178,8 @@ async fn ore_terms_array_null_and_empty_base_cases(pool: PgPool) -> Result<()> { } /// T5 — SEM presence checks (`has_ore_block_256`, `has_hmac_256`), the -/// extractor's missing-`ob` RAISE, and its NULL-jsonb short-circuit. +/// extractor's missing-`ob` and non-array-`ob` RAISEs, and its NULL-jsonb +/// short-circuit. #[sqlx::test] async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<()> { let bool_cases = [ @@ -187,11 +188,20 @@ async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<() true, ), (r#"SELECT eql_v3.has_ore_block_256('{}'::jsonb)"#, false), - // json-null `ob` → `->>` yields NULL → absent. + // json-null `ob` is typed `'null'`, not `'array'` → absent. ( r#"SELECT eql_v3.has_ore_block_256('{"ob":null}'::jsonb)"#, false, ), + // Present-but-non-array `ob` is rejected as absent: a well-formed ORE + // term is always a JSON array of block terms, so a scalar and an object + // both → false. This is the boundary that makes `ore_block_256` RAISE on + // a malformed `ob` instead of degrading it to a NULL index term. + (r#"SELECT eql_v3.has_ore_block_256('{"ob":5}'::jsonb)"#, false), + ( + r#"SELECT eql_v3.has_ore_block_256('{"ob":{}}'::jsonb)"#, + false, + ), (r#"SELECT eql_v3.has_hmac_256('{"hm":"abc"}'::jsonb)"#, true), (r#"SELECT eql_v3.has_hmac_256('{}'::jsonb)"#, false), ]; @@ -209,6 +219,16 @@ async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<() ) .await?; + // Present-but-non-array `ob` → RAISE at the extractor boundary, NOT a silent + // NULL index term (`has_ore_block_256` reports it absent). + assert_raises( + &pool, + r#"SELECT eql_v3.ore_block_256('{"ob":5}'::jsonb)"#, + &[], + "Expected an ore index (ob) value", + ) + .await?; + // NULL jsonb → NULL composite (STRICT short-circuit), NOT a raise. let is_null: bool = sqlx::query_scalar("SELECT eql_v3.ore_block_256(NULL::jsonb) IS NULL") .fetch_one(&pool) From 333c95daf15b06918e131e42e1acd7bb1bd70902 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 16 Jun 2026 09:26:54 +1000 Subject: [PATCH 209/599] style(v3): cargo fmt sem.rs has_ore_block_256 test case --- tests/sqlx/tests/encrypted_domain/family/sem.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index fd675673d..d13847e5f 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -197,7 +197,10 @@ async fn sem_presence_checks_and_missing_ob_behaviour(pool: PgPool) -> Result<() // term is always a JSON array of block terms, so a scalar and an object // both → false. This is the boundary that makes `ore_block_256` RAISE on // a malformed `ob` instead of degrading it to a NULL index term. - (r#"SELECT eql_v3.has_ore_block_256('{"ob":5}'::jsonb)"#, false), + ( + r#"SELECT eql_v3.has_ore_block_256('{"ob":5}'::jsonb)"#, + false, + ), ( r#"SELECT eql_v3.has_ore_block_256('{"ob":{}}'::jsonb)"#, false, From 0564895cb24c9ed0b7e01c429be10f0c8373e023 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 16 Jun 2026 09:36:22 +1000 Subject: [PATCH 210/599] test(v3): always-on ORE comparator coverage + numeric scale-collision fixture Strengthen the N-block ORE comparator tests so they run creds-free on no-creds CI shards, sourcing real ORE terms from committed fixtures: - assert_orders_like_oracle: all-pairs oracle agreement + antisymmetry (replaces the adjacent-pair-only ascending chain), with a row-count drift guard against the catalog fixture order - comparator_length_guard_sweep: boundary/off-by lengths for the 49*N+16 guard across N=1..14 - wide_block_term_compares_equal_to_itself: reflexive path at N=14/12 - numeric_scale_equivalents_collide: 1 == 1.0 ORE collision via the new hand-written v3_numeric_collision fixture (the value-equal pair the catalog distinctness guard forbids in eql_v2_numeric) Also fix the stale timestamptz comment in scalar_domains.rs (now ordered, not eq-only). --- .gitignore | 1 + tests/sqlx/src/fixtures/mod.rs | 7 + .../sqlx/src/fixtures/v3_numeric_collision.rs | 77 ++++ tests/sqlx/src/scalar_domains.rs | 6 +- tests/sqlx/tests/generate_all_fixtures.rs | 9 + .../sqlx/tests/ore_block_comparator_tests.rs | 342 ++++++++++++++++-- 6 files changed, 404 insertions(+), 38 deletions(-) create mode 100644 tests/sqlx/src/fixtures/v3_numeric_collision.rs diff --git a/.gitignore b/.gitignore index 37af0cf22..98b640122 100644 --- a/.gitignore +++ b/.gitignore @@ -227,6 +227,7 @@ tests/sqlx/migrations/001_install_eql.sql tests/sqlx/fixtures/eql_v2* tests/sqlx/fixtures/v3_ste_vec.sql tests/sqlx/fixtures/v3_doc_int4.sql +tests/sqlx/fixtures/v3_numeric_collision.sql # Generated encrypted-domain SQL — regenerated by `tasks/build.sh` from the # eql-scalars::CATALOG via `cargo run -p eql-codegen` on every build. The diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 098db4f68..62e867132 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -39,6 +39,13 @@ pub mod v3_ste_vec; // jsonb-entry behaviour matrix (`JsonbEntryInt4`). pub mod v3_doc_int4; +// The numeric scale-equivalence collision fixture (`1`, `1.0`, `2`). Not a +// CATALOG scalar — the catalog distinctness guard forbids the value-equal pair +// `1`/`1.0` — so it is hand-written and registered here directly (like the +// other `v3_` fixtures). Gives the `1 == 1.0` ORE collision an always-on +// (committed-fixture) home instead of a creds-gated runtime encryption. +pub mod v3_numeric_collision; + // The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, …) are // generated from the harness list in `scalar_types.rs`. Each expands to // `pub mod eql_v2_ { … scalar_fixture! … }`, reading its plaintext values diff --git a/tests/sqlx/src/fixtures/v3_numeric_collision.rs b/tests/sqlx/src/fixtures/v3_numeric_collision.rs new file mode 100644 index 000000000..fe58c63d5 --- /dev/null +++ b/tests/sqlx/src/fixtures/v3_numeric_collision.rs @@ -0,0 +1,77 @@ +//! The `v3_numeric_collision` fixture — the scale-equivalence collision pair +//! (`1`, `1.0`) plus a `2` discriminator, encrypted at numeric ORE width. +//! +//! Hand-written, non-catalog (like `v3_ste_vec` / `v3_doc_int4`, hence the +//! `v3_` prefix), because the catalog-driven `eql_v2_numeric` fixture CANNOT +//! carry it: `numeric_value_guards::fixtures_are_distinct_by_value` forbids two +//! fixtures that alias to the same `Decimal`, and `1` / `1.0` are value-equal. +//! So the `1 == 1.0` ORE collision — that scale-equivalent decimals encrypt to +//! comparison-equal ORE terms — has no catalog home. This tiny bespoke fixture +//! is the only place those two representations can coexist. +//! +//! Rows are addressed by `id` (NOT `plaintext`): `WHERE plaintext = 1` matches +//! both `1` and `1.0` (numeric equality ignores scale), so the collision test +//! fetches `id = 1` (`1`), `id = 2` (`1.0`), `id = 3` (`2`). The `id` is the +//! 1-based insertion ordinal the driver assigns over `VALUES`. +//! +//! Gitignored output: tests/sqlx/fixtures/v3_numeric_collision.sql +//! (regenerated by `mise run fixture:generate:all`). + +use anyhow::Result; +use rust_decimal::Decimal; +use std::str::FromStr; + +use super::index_kind::IndexKind; +use super::spec::FixtureSpec; + +/// The committed fixture name → table `fixtures.v3_numeric_collision`, script +/// `v3_numeric_collision.sql`, SQLx ref `scripts("v3_numeric_collision")`. +const NAME: &str = "v3_numeric_collision"; + +/// The fixture plaintexts, in insertion order. `id` is the 1-based ordinal, so +/// `1` → id 1, `1.0` → id 2, `2` → id 3. `1` and `1.0` are deliberately +/// value-equal (the collision pair); `2` is a distinct discriminator so the +/// test can prove the comparator is not a degenerate everything-collides. +fn values() -> Vec { + ["1", "1.0", "2"] + .iter() + .map(|s| Decimal::from_str(s).expect("valid decimal literal")) + .collect() +} + +/// Generate `tests/sqlx/fixtures/v3_numeric_collision.sql`. Encrypts the +/// three decimals at numeric ORE width via the standard `.run()` driver — the +/// encryption input and the `plaintext` oracle column are the same value stream, +/// so no split (`run_with_payloads`) is needed. +pub async fn generate() -> Result<()> { + let values = values(); + FixtureSpec::new(NAME) + .with_index(IndexKind::Unique) + .with_index(IndexKind::Ore) + .with_column_type("jsonb") + .with_values(&values) + .run() + .await +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn the_collision_pair_is_value_equal_but_distinct_in_scale() { + let v = values(); + assert_eq!(v.len(), 3, "fixture is [1, 1.0, 2]"); + // The collision pair compares equal by value... + assert_eq!(v[0], v[1], "1 and 1.0 must be value-equal (the collision)"); + // ...yet is two distinct textual representations (different scale), so + // the catalog distinctness guard would reject them together. + assert_ne!( + v[0].scale(), + v[1].scale(), + "1 (scale 0) and 1.0 (scale 1) must differ in scale" + ); + // The discriminator is genuinely larger. + assert!(v[2] > v[0], "2 must order after 1"); + } +} diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 84bf9da2c..11d0ff15c 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -319,11 +319,11 @@ temporal_values! { } // `timestamptz`'s `ScalarType` wiring, generated from its catalog row by the -// same `temporal_values!` path as `date`. timestamptz is equality-only (its -// catalog row uses the eq-only domain shape), but the *value* wiring is +// same `temporal_values!` path as `date`. timestamptz is ordered (its catalog +// row uses the ordered domain shape, 12-block ORE), and the *value* wiring is // identical to any temporal scalar: RFC3339 strings parsed once into // `DateTime` behind `timestamptz_values()`. The pivots are retained as the -// three equality anchors the matrix sweeps. +// three min/mid/max anchors the matrix sweeps. temporal_values! { cell = TIMESTAMPTZ_VALUES_CELL, accessor = timestamptz_values, diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index 40db22166..dcb50c27f 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -49,5 +49,14 @@ async fn generate_all() -> anyhow::Result<()> { eprintln!("Generating fixture v3_doc_int4 (scalar-shaped SteVec document)..."); eql_tests::fixtures::v3_doc_int4::generate().await?; eprintln!("Regenerated v3_doc_int4."); + + // The numeric scale-equivalence collision fixture (`1`, `1.0`, `2`). Not a + // CATALOG scalar — the distinctness guard forbids `1`/`1.0` coexisting in + // `eql_v2_numeric` — so it rides the same pipeline as a hand-written + // `FixtureSpec`. Gives the always-on `1 == 1.0` ORE collision test + // its committed fixture. + eprintln!("Generating fixture v3_numeric_collision (1 == 1.0 ORE collision)..."); + eql_tests::fixtures::v3_numeric_collision::generate().await?; + eprintln!("Regenerated v3_numeric_collision."); Ok(()) } diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index 7fcc5eb30..5a65cd85e 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -1,14 +1,128 @@ -//! Direct unit tests for the generalized N-block ORE comparator -//! `eql_v3.compare_ore_block_256_term`. +//! Direct tests for the generalized N-block ORE comparator +//! `eql_v3.compare_ore_block_256_term(s)`. //! -//! The malformed-length guards here are creds-free: they construct ORE terms -//! by hand from short byte strings, so they exercise the length validation -//! without needing real (ZeroKMS-generated) ciphertexts. The wide-term ordering -//! test (added in Phase 4) uses generated numeric fixtures. +//! Every test here is **always-on** — it runs in normal (no-creds) CI, because +//! it sources real ORE terms from committed fixtures rather than encrypting at +//! runtime: +//! * The malformed-length guards build ORE terms by hand from short byte +//! strings, exercising length validation without real ciphertexts. +//! * The ordering properties (all-pairs oracle agreement + antisymmetry) read +//! the committed `eql_v2_numeric` / `eql_v2_timestamptz` fixtures, whose +//! catalog order is the strict ascending oracle. +//! * The `1 == 1.0` ORE collision reads the committed `v3_numeric_collision` +//! fixture — the one place the value-equal pair can live, since the catalog +//! distinctness guard forbids it in `eql_v2_numeric`. +//! +//! Fixtures are generated once (with creds) in the `build-archive` CI job and +//! baked into the test binaries via `include_str!`, so the no-creds shards +//! consume them directly. See `tasks/test/sqlx-archive.sh`. use anyhow::Result; use sqlx::PgPool; +/// Fetch two fixture payloads by plaintext literal, wrap each in the ordered +/// extractor, and return the ORE comparison. The single fetch + `ord_term` + +/// `compare_ore_block_256_terms` shape every chain/pair test shares; `lo`/`hi` +/// are the plaintext SQL literals (with cast), e.g. `"(-1)::numeric"`. +async fn compare_fixture_pair( + pool: &PgPool, + table: &str, + ord_domain: &str, + lo: &str, + hi: &str, +) -> Result { + let sql = format!( + "SELECT eql_v3.compare_ore_block_256_terms( \ + eql_v3.ord_term((SELECT payload FROM fixtures.{table} WHERE plaintext = {lo})::eql_v3.{ord_domain}), \ + eql_v3.ord_term((SELECT payload FROM fixtures.{table} WHERE plaintext = {hi})::eql_v3.{ord_domain}))" + ); + Ok(sqlx::query_scalar::<_, i32>(&sql).fetch_one(pool).await?) +} + +/// A hand-built ORE term of `len` bytes filled with `fill`. Creds-free — the +/// bytes are cryptographically meaningless, so this only drives length/structure +/// validation, never ordering semantics. +fn term_sql(fill: char, len: usize) -> String { + format!("ROW(repeat('{fill}', {len})::bytea)::eql_v3.ore_block_256_term") +} + +/// Assert the ORE comparator agrees with an explicit oracle order over a +/// committed fixture. `ascending[i]` is the SQL literal (with cast) for the +/// value whose oracle rank is `i`; its real ciphertext is fetched from +/// `fixtures.{table}` by `plaintext` and loaded into a connection-local +/// `ore_sample(rank, payload)`. +/// +/// Two properties, both over EVERY pair (not just adjacent): +/// * **Oracle agreement** — `rank a < rank b` ⇒ `compare(a, b) = -1`. +/// All-pairs subsumes totality and transitivity; combined with antisymmetry +/// it also pins the `>` direction, so a one-sided bug cannot hide. +/// * **Antisymmetry** — `compare(a, b) = -compare(b, a)` for all distinct +/// pairs. +/// +/// Creds-free: every term is a real committed ciphertext. The per-row +/// `rows_affected == 1` check fails loudly if the `ascending` list drifts from +/// the fixture (a removed/renamed value resolves to zero rows). +async fn assert_orders_like_oracle( + pool: &PgPool, + table: &str, + ord_domain: &str, + ascending: &[String], +) -> Result<()> { + // TEMP is connection-scoped and a pool may hand out different connections + // per query — pin everything to one acquired connection. + let mut conn = pool.acquire().await?; + sqlx::query("CREATE TEMP TABLE ore_sample (rank int, payload jsonb)") + .execute(&mut *conn) + .await?; + for (rank, literal) in ascending.iter().enumerate() { + let inserted = sqlx::query(&format!( + "INSERT INTO ore_sample (rank, payload) \ + SELECT {rank}, payload FROM fixtures.{table} WHERE plaintext = {literal}" + )) + .execute(&mut *conn) + .await? + .rows_affected(); + anyhow::ensure!( + inserted == 1, + "expected exactly 1 fixture row for {literal} (rank {rank}), got {inserted} \ + — the ascending list has drifted from fixtures.{table}" + ); + } + + // Oracle agreement: lower rank (smaller value) MUST compare -1. + let order_violations: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM ore_sample a JOIN ore_sample b ON a.rank < b.rank \ + WHERE eql_v3.compare_ore_block_256_terms( \ + eql_v3.ord_term(a.payload::eql_v3.{ord_domain}), \ + eql_v3.ord_term(b.payload::eql_v3.{ord_domain})) <> -1" + )) + .fetch_one(&mut *conn) + .await?; + assert_eq!( + order_violations, 0, + "ORE comparator disagreed with the oracle order on some pair" + ); + + // Antisymmetry: compare(a, b) = -compare(b, a) for every distinct pair. + let antisymmetry_violations: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM ore_sample a JOIN ore_sample b ON a.rank <> b.rank \ + WHERE eql_v3.compare_ore_block_256_terms( \ + eql_v3.ord_term(a.payload::eql_v3.{ord_domain}), \ + eql_v3.ord_term(b.payload::eql_v3.{ord_domain})) \ + <> - eql_v3.compare_ore_block_256_terms( \ + eql_v3.ord_term(b.payload::eql_v3.{ord_domain}), \ + eql_v3.ord_term(a.payload::eql_v3.{ord_domain}))" + )) + .fetch_one(&mut *conn) + .await?; + assert_eq!( + antisymmetry_violations, 0, + "ORE comparator violated antisymmetry on some pair" + ); + + Ok(()) +} + /// A `bytea` whose length is NOT a valid `49*N + 16` must raise, not silently /// return 0. Uses a 4-byte term (equal lengths so the equal-length guard does /// not fire first). @@ -73,6 +187,66 @@ async fn comparator_rejects_mismatched_block_widths(pool: PgPool) -> Result<()> Ok(()) } +/// Sweep the `49*N + 16` length guard across boundary/off-by lengths the +/// point-example tests above don't reach. Both operands are kept the SAME length +/// so only the malformed-length guard can fire (the different-lengths guard at +/// `bit_length` precedes it). Creds-free. +/// +/// Valid lengths are pinned to exact return values (verified against +/// `src/v3/sem/ore_block_256/functions.sql`): +/// * equal operands take the all-blocks-equal path → return **0** +/// (`functions.sql:166-168`; the `encrypt()` branch is unreachable); +/// * differing operands fall through to the `encrypt()` path → return **±1** +/// (`functions.sql:170-190`), which is the branch the length guard protects. +#[sqlx::test] +async fn comparator_length_guard_sweep(pool: PgPool) -> Result<()> { + // Invalid: not 49*N + 16 (16 and 4 are covered by the dedicated tests above). + for len in [15usize, 17, 50, 64, 66, 407, 409, 701, 703] { + let sql = format!( + "SELECT eql_v3.compare_ore_block_256_term({}, {})", + term_sql('a', len), + term_sql('b', len) + ); + let err = sqlx::query_scalar::<_, i32>(&sql) + .fetch_one(&pool) + .await + .expect_err(&format!("length {len} (not 49*N+16) must raise")); + assert!( + err.to_string() + .to_lowercase() + .contains("malformed ore term"), + "len {len}: expected malformed-term error, got: {err}" + ); + } + + // Valid: 49*N + 16 for N = 1..=14 (spans the int4/timestamp/numeric widths). + for n in 1..=14usize { + let len = 49 * n + 16; + + let eq: i32 = sqlx::query_scalar(&format!( + "SELECT eql_v3.compare_ore_block_256_term({}, {})", + term_sql('a', len), + term_sql('a', len) + )) + .fetch_one(&pool) + .await?; + assert_eq!(eq, 0, "len {len} (N={n}): identical terms must compare 0"); + + let ne: i32 = sqlx::query_scalar(&format!( + "SELECT eql_v3.compare_ore_block_256_term({}, {})", + term_sql('a', len), + term_sql('b', len) + )) + .fetch_one(&pool) + .await?; + assert!( + ne == -1 || ne == 1, + "len {len} (N={n}): differing terms must compare ±1 (encrypt path), got {ne}" + ); + } + Ok(()) +} + /// Width: a numeric ORE term must be 14 blocks => 49*14 + 16 = 702 bytes. #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric")))] async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { @@ -87,14 +261,17 @@ async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { Ok(()) } -/// Full ascending chain of 14-block numeric terms: every adjacent pair must -/// order `-1`. Spans sign, magnitude, and fractional (low-block) scale, so the -/// left blocks — not just the right blocks — decide ordering. This is the -/// regression the missed `9 -> 1+n` left-offset would fail; a single pair could -/// pass against that bug. +/// 14-block numeric terms must order like `Decimal`'s `Ord` over ALL pairs (not +/// just adjacent), plus antisymmetry. Spans sign, magnitude, and fractional +/// (low-block) scale, so the left blocks — not just the right blocks — decide +/// ordering. This is the regression the missed `9 -> 1+n` left-offset would +/// fail; the all-pairs sweep makes a single lucky pair unable to mask it. The +/// list is the strict ascending oracle (matching `NUMERIC_FIXTURES`' catalog +/// order); `assert_orders_like_oracle` fails loudly if it drifts from the +/// committed fixture. #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric")))] -async fn numeric_terms_order_in_ascending_chain(pool: PgPool) -> Result<()> { - let ascending = [ +async fn numeric_terms_order_like_decimal_ord(pool: PgPool) -> Result<()> { + let ascending: Vec = [ "-1000000000000", "-1000000", "-1.001", @@ -109,25 +286,17 @@ async fn numeric_terms_order_in_ascending_chain(pool: PgPool) -> Result<()> { "1.001", "1000000", "1000000000000", - ]; - for pair in ascending.windows(2) { - let (lo, hi) = (pair[0], pair[1]); - let cmp: i32 = sqlx::query_scalar(&format!( - "SELECT eql_v3.compare_ore_block_256_terms( \ - eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_numeric WHERE plaintext = ({lo})::numeric)::eql_v3.numeric_ord), \ - eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_numeric WHERE plaintext = ({hi})::numeric)::eql_v3.numeric_ord))" - )) - .fetch_one(&pool) - .await?; - assert_eq!(cmp, -1, "{lo} must order before {hi}"); - } - Ok(()) + ] + .iter() + .map(|v| format!("({v})::numeric")) + .collect(); + assert_orders_like_oracle(&pool, "eql_v2_numeric", "numeric_ord", &ascending).await } -/// Symmetric 12-block (timestamptz, N=12 => 604 bytes) width + ordering check. -/// 12 is the only N strictly between the working 8 and the headline 14. +/// Width + single-pair sanity for the 12-block (timestamptz, N=12 => 604 bytes) +/// term. The full ordering property is `timestamptz_terms_order_like_datetime_ord`. #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_timestamptz")))] -async fn timestamptz_term_is_12_blocks_and_orders(pool: PgPool) -> Result<()> { +async fn timestamptz_term_is_12_blocks(pool: PgPool) -> Result<()> { let width: i32 = sqlx::query_scalar( "SELECT octet_length((((eql_v3.ord_term( \ (SELECT payload FROM fixtures.eql_v2_timestamptz WHERE plaintext = '1970-01-01T00:00:00Z'::timestamptz) \ @@ -139,14 +308,117 @@ async fn timestamptz_term_is_12_blocks_and_orders(pool: PgPool) -> Result<()> { width, 604, "timestamptz ORE term must be 12 blocks (604 bytes)" ); + Ok(()) +} - let cmp: i32 = sqlx::query_scalar( - "SELECT eql_v3.compare_ore_block_256_terms( \ - eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_timestamptz WHERE plaintext = '1900-01-01T00:00:00Z'::timestamptz)::eql_v3.timestamptz_ord), \ - eql_v3.ord_term((SELECT payload FROM fixtures.eql_v2_timestamptz WHERE plaintext = '2099-12-31T23:59:59Z'::timestamptz)::eql_v3.timestamptz_ord))", +/// 12-block (timestamptz) terms must order like `DateTime`'s `Ord` over +/// ALL pairs, plus antisymmetry. N=12 is the only width strictly between the +/// working 8 and the headline 14, so it needs the same left-block-deciding +/// coverage as numeric. The 15 values are the strict ascending oracle (matching +/// `TIMESTAMPTZ_FIXTURES`' catalog order); `assert_orders_like_oracle` fails +/// loudly if the list drifts from the committed fixture. +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_timestamptz")))] +async fn timestamptz_terms_order_like_datetime_ord(pool: PgPool) -> Result<()> { + let ascending: Vec = [ + "1900-01-01T00:00:00Z", + "1950-07-15T06:30:00Z", + "1969-12-31T23:59:59Z", + "1970-01-01T00:00:00Z", + "1970-01-01T00:00:01Z", + "1985-04-12T23:20:50Z", + "1999-12-31T23:59:59Z", + "2000-01-01T00:00:00Z", + "2004-02-29T12:00:00Z", + "2012-06-30T11:59:59Z", + "2016-03-15T08:15:30Z", + "2020-10-21T14:45:00Z", + "2024-02-29T17:30:45Z", + "2038-01-19T03:14:07Z", + "2099-12-31T23:59:59Z", + ] + .iter() + .map(|v| format!("'{v}'::timestamptz")) + .collect(); + assert_orders_like_oracle(&pool, "eql_v2_timestamptz", "timestamptz_ord", &ascending).await +} + +/// A real wide-block term must compare equal to itself — the reflexive +/// `eq`-true path (`functions.sql:166`) at N=14 and N=12, creds-free (reuses the +/// generated fixtures). Distinct from the `1 == 1.0` collision (Gap 1), which is +/// equality across *different* ciphertexts. +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric", "eql_v2_timestamptz")))] +async fn wide_block_term_compares_equal_to_itself(pool: PgPool) -> Result<()> { + let numeric = compare_fixture_pair( + &pool, + "eql_v2_numeric", + "numeric_ord", + "(1)::numeric", + "(1)::numeric", + ) + .await?; + assert_eq!(numeric, 0, "a 14-block numeric term must equal itself"); + + let timestamptz = compare_fixture_pair( + &pool, + "eql_v2_timestamptz", + "timestamptz_ord", + "'2000-01-01T00:00:00Z'::timestamptz", + "'2000-01-01T00:00:00Z'::timestamptz", ) - .fetch_one(&pool) .await?; - assert_eq!(cmp, -1, "1900 must order before 2099"); + assert_eq!( + timestamptz, 0, + "a 12-block timestamptz term must equal itself" + ); + Ok(()) +} + +/// Compare the collision-fixture rows addressed by `id`. The +/// `v3_numeric_collision` fixture stores `1` (id 1), `1.0` (id 2), `2` (id 3); +/// rows are fetched by `id` because `WHERE plaintext = 1` is ambiguous (numeric +/// equality matches both `1` and `1.0`). +async fn compare_collision_ids(pool: &PgPool, a: i64, b: i64) -> Result { + let sql = format!( + "SELECT eql_v3.compare_ore_block_256_terms( \ + eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {a})::eql_v3.numeric_ord), \ + eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {b})::eql_v3.numeric_ord))" + ); + Ok(sqlx::query_scalar::<_, i32>(&sql).fetch_one(pool).await?) +} + +/// Scale-equivalent decimals (`1` and `1.0`) must collide in the ORE +/// ciphertext: they are value-equal numerics, so their ORE terms must compare +/// `0`. Always-on via the committed `v3_numeric_collision` fixture — the only +/// place the value-equal pair can live, since the catalog distinctness guard +/// (`scalar_domains.rs` `numeric_value_guards`) forbids it in `eql_v2_numeric`. +/// This is the positive counterpart to that negative guard. +/// +/// Asserted in BOTH directions (a scale-biased comparator could pass a +/// one-directional check); the `1`-vs-`2` guards are load-bearing — they defeat +/// a degenerate everything-returns-0 comparator that would otherwise pass the +/// collision assertions. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_numeric_collision")))] +async fn numeric_scale_equivalents_collide(pool: PgPool) -> Result<()> { + // ids: 1 => `1`, 2 => `1.0`, 3 => `2`. + assert_eq!( + compare_collision_ids(&pool, 1, 2).await?, + 0, + "1 and 1.0 must collide" + ); + assert_eq!( + compare_collision_ids(&pool, 2, 1).await?, + 0, + "the collision must be order-independent" + ); + assert_eq!( + compare_collision_ids(&pool, 1, 3).await?, + -1, + "1 must order before 2" + ); + assert_eq!( + compare_collision_ids(&pool, 3, 1).await?, + 1, + "2 must order after 1" + ); Ok(()) } From 7055a9bc754a213c9c519cb04854933f75d4e470 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 16 Jun 2026 10:22:23 +1000 Subject: [PATCH 211/599] feat(eql-types): add numeric + promote timestamptz to ordered domains The eql-types crate landed on eql_v3 (PR #236) after this branch forked, so merging the base in surfaced a catalog_parity failure: CATALOG now has the numeric family and ordered timestamptz, but v3::all() didn't. - numeric.rs: four ordered domains (storage/_eq/_ord/_ord_ore), mirroring date.rs; numeric is the first scalar with a >8-block ORE term (14) - timestamptz.rs: add the two ordered domains; the eq-only/8-block-limit rationale is gone now that eql_v3.ore_block_256 derives N from term length - mod.rs: register the six new domains in all(), in CATALOG order - terms.rs: the ob term's SQL constructor is eql_v3.ore_block_256 (renamed this branch) and is width-agnostic (8/12/14 blocks) - v3_conformance.rs: cover numeric + timestamptz ord wire shapes; drop the stale equality-only claim - README: timestamptz no longer eq-only; add numeric --- crates/eql-types/README.md | 2 +- crates/eql-types/bindings/v3/Numeric.ts | 22 +++ crates/eql-types/bindings/v3/NumericEq.ts | 27 ++++ crates/eql-types/bindings/v3/NumericOrd.ts | 27 ++++ crates/eql-types/bindings/v3/NumericOrdOre.ts | 27 ++++ crates/eql-types/bindings/v3/OreBlock256.ts | 8 +- .../eql-types/bindings/v3/TimestamptzOrd.ts | 27 ++++ .../bindings/v3/TimestamptzOrdOre.ts | 27 ++++ crates/eql-types/schema/v3/date_ord.json | 2 +- crates/eql-types/schema/v3/date_ord_ore.json | 2 +- crates/eql-types/schema/v3/int2_ord.json | 2 +- crates/eql-types/schema/v3/int2_ord_ore.json | 2 +- crates/eql-types/schema/v3/int4_ord.json | 2 +- crates/eql-types/schema/v3/int4_ord_ore.json | 2 +- crates/eql-types/schema/v3/int8_ord.json | 2 +- crates/eql-types/schema/v3/int8_ord_ore.json | 2 +- crates/eql-types/schema/v3/numeric.json | 69 +++++++++ crates/eql-types/schema/v3/numeric_eq.json | 82 +++++++++++ crates/eql-types/schema/v3/numeric_ord.json | 85 +++++++++++ .../eql-types/schema/v3/numeric_ord_ore.json | 85 +++++++++++ crates/eql-types/schema/v3/text_ord.json | 2 +- crates/eql-types/schema/v3/text_ord_ore.json | 2 +- crates/eql-types/schema/v3/text_search.json | 2 +- .../eql-types/schema/v3/timestamptz_ord.json | 85 +++++++++++ .../schema/v3/timestamptz_ord_ore.json | 85 +++++++++++ crates/eql-types/src/v3/mod.rs | 7 + crates/eql-types/src/v3/numeric.rs | 136 ++++++++++++++++++ crates/eql-types/src/v3/terms.rs | 8 +- crates/eql-types/src/v3/timestamptz.rs | 77 +++++++++- crates/eql-types/tests/v3_conformance.rs | 55 +++++-- 30 files changed, 929 insertions(+), 34 deletions(-) create mode 100644 crates/eql-types/bindings/v3/Numeric.ts create mode 100644 crates/eql-types/bindings/v3/NumericEq.ts create mode 100644 crates/eql-types/bindings/v3/NumericOrd.ts create mode 100644 crates/eql-types/bindings/v3/NumericOrdOre.ts create mode 100644 crates/eql-types/bindings/v3/TimestamptzOrd.ts create mode 100644 crates/eql-types/bindings/v3/TimestamptzOrdOre.ts create mode 100644 crates/eql-types/schema/v3/numeric.json create mode 100644 crates/eql-types/schema/v3/numeric_eq.json create mode 100644 crates/eql-types/schema/v3/numeric_ord.json create mode 100644 crates/eql-types/schema/v3/numeric_ord_ore.json create mode 100644 crates/eql-types/schema/v3/timestamptz_ord.json create mode 100644 crates/eql-types/schema/v3/timestamptz_ord_ore.json create mode 100644 crates/eql-types/src/v3/numeric.rs diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index a38d2d40f..042819016 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -21,7 +21,7 @@ hand-copying. The [`src/v3/`](src/v3/) module has one type per **SQL domain** in the `eql_v3` schema — `Int4` / `Int4Eq` / `Int4Ord` / `Int4OrdOre`, and likewise -for `int2`, `int8`, `date`, `timestamptz` (eq-only), and `text` (which adds +for `int2`, `int8`, `date`, `timestamptz`, `numeric`, and `text` (which adds `TextMatch`) — each carrying its index terms as **required** fields. The capability is the type identity; `Option` never appears. A payload missing its term key fails to deserialize: the Rust analogue of the SQL domain's diff --git a/crates/eql-types/bindings/v3/Numeric.ts b/crates/eql-types/bindings/v3/Numeric.ts new file mode 100644 index 000000000..dfcda818a --- /dev/null +++ b/crates/eql-types/bindings/v3/Numeric.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.numeric` — storage only; every operator is blocked. + */ +export type Numeric = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/NumericEq.ts b/crates/eql-types/bindings/v3/NumericEq.ts new file mode 100644 index 000000000..e3b3ff466 --- /dev/null +++ b/crates/eql-types/bindings/v3/NumericEq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.numeric_eq` — HMAC equality (`=`, `<>`). + */ +export type NumericEq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/NumericOrd.ts b/crates/eql-types/bindings/v3/NumericOrd.ts new file mode 100644 index 000000000..491295dc4 --- /dev/null +++ b/crates/eql-types/bindings/v3/NumericOrd.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.numeric_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type NumericOrd = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (14 blocks for numeric). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/NumericOrdOre.ts b/crates/eql-types/bindings/v3/NumericOrdOre.ts new file mode 100644 index 000000000..846437451 --- /dev/null +++ b/crates/eql-types/bindings/v3/NumericOrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.numeric_ord_ore` — full comparison, scheme-explicit name. + */ +export type NumericOrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (14 blocks for numeric). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/OreBlock256.ts b/crates/eql-types/bindings/v3/OreBlock256.ts index 0361c1ed2..0e200b48d 100644 --- a/crates/eql-types/bindings/v3/OreBlock256.ts +++ b/crates/eql-types/bindings/v3/OreBlock256.ts @@ -1,9 +1,11 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. /** - * Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the - * `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless - * over the scalar's domain, so it serves equality too. SQL-side constructor: + * Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` + * domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's + * domain, so it serves equality too. The block count is width-agnostic on the + * wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the + * array just carries more block strings. SQL-side constructor: * `eql_v3.ore_block_256`. */ export type OreBlock256 = Array; diff --git a/crates/eql-types/bindings/v3/TimestamptzOrd.ts b/crates/eql-types/bindings/v3/TimestamptzOrd.ts new file mode 100644 index 000000000..19b975732 --- /dev/null +++ b/crates/eql-types/bindings/v3/TimestamptzOrd.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.timestamptz_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type TimestamptzOrd = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (12 blocks for timestamptz). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/TimestamptzOrdOre.ts b/crates/eql-types/bindings/v3/TimestamptzOrdOre.ts new file mode 100644 index 000000000..a84d68088 --- /dev/null +++ b/crates/eql-types/bindings/v3/TimestamptzOrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.timestamptz_ord_ore` — full comparison, scheme-explicit name. + */ +export type TimestamptzOrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (12 blocks for timestamptz). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/schema/v3/date_ord.json b/crates/eql-types/schema/v3/date_ord.json index 3e5e3ad17..90bbfbfce 100644 --- a/crates/eql-types/schema/v3/date_ord.json +++ b/crates/eql-types/schema/v3/date_ord.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/date_ord_ore.json b/crates/eql-types/schema/v3/date_ord_ore.json index 5d4189362..9c4da4bd0 100644 --- a/crates/eql-types/schema/v3/date_ord_ore.json +++ b/crates/eql-types/schema/v3/date_ord_ore.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/int2_ord.json b/crates/eql-types/schema/v3/int2_ord.json index ac9c8333e..bb851fc09 100644 --- a/crates/eql-types/schema/v3/int2_ord.json +++ b/crates/eql-types/schema/v3/int2_ord.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/int2_ord_ore.json b/crates/eql-types/schema/v3/int2_ord_ore.json index fa294b308..14782a109 100644 --- a/crates/eql-types/schema/v3/int2_ord_ore.json +++ b/crates/eql-types/schema/v3/int2_ord_ore.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/int4_ord.json b/crates/eql-types/schema/v3/int4_ord.json index 847ee38e2..5eb0b7eca 100644 --- a/crates/eql-types/schema/v3/int4_ord.json +++ b/crates/eql-types/schema/v3/int4_ord.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/int4_ord_ore.json b/crates/eql-types/schema/v3/int4_ord_ore.json index 89b5bc205..326d2688b 100644 --- a/crates/eql-types/schema/v3/int4_ord_ore.json +++ b/crates/eql-types/schema/v3/int4_ord_ore.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/int8_ord.json b/crates/eql-types/schema/v3/int8_ord.json index e16021472..b3146c347 100644 --- a/crates/eql-types/schema/v3/int8_ord.json +++ b/crates/eql-types/schema/v3/int8_ord.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/int8_ord_ore.json b/crates/eql-types/schema/v3/int8_ord_ore.json index cbe486560..4c14eb987 100644 --- a/crates/eql-types/schema/v3/int8_ord_ore.json +++ b/crates/eql-types/schema/v3/int8_ord_ore.json @@ -27,7 +27,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/numeric.json b/crates/eql-types/schema/v3/numeric.json new file mode 100644 index 000000000..c89d356f7 --- /dev/null +++ b/crates/eql-types/schema/v3/numeric.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/numeric.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.numeric` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Numeric", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/numeric_eq.json b/crates/eql-types/schema/v3/numeric_eq.json new file mode 100644 index 000000000..8cfc98c83 --- /dev/null +++ b/crates/eql-types/schema/v3/numeric_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.numeric_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "NumericEq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/numeric_ord.json b/crates/eql-types/schema/v3/numeric_ord.json new file mode 100644 index 000000000..f4d6571b1 --- /dev/null +++ b/crates/eql-types/schema/v3/numeric_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.numeric_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (14 blocks for numeric). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "NumericOrd", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/numeric_ord_ore.json b/crates/eql-types/schema/v3/numeric_ord_ore.json new file mode 100644 index 000000000..748b2ba62 --- /dev/null +++ b/crates/eql-types/schema/v3/numeric_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.numeric_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (14 blocks for numeric). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "NumericOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/text_ord.json b/crates/eql-types/schema/v3/text_ord.json index 4f2306ae5..0b69333db 100644 --- a/crates/eql-types/schema/v3/text_ord.json +++ b/crates/eql-types/schema/v3/text_ord.json @@ -31,7 +31,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/text_ord_ore.json b/crates/eql-types/schema/v3/text_ord_ore.json index 848c37743..094f9a49d 100644 --- a/crates/eql-types/schema/v3/text_ord_ore.json +++ b/crates/eql-types/schema/v3/text_ord_ore.json @@ -31,7 +31,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/text_search.json b/crates/eql-types/schema/v3/text_search.json index ea7b2ce12..2beaeffe8 100644 --- a/crates/eql-types/schema/v3/text_search.json +++ b/crates/eql-types/schema/v3/text_search.json @@ -41,7 +41,7 @@ "type": "object" }, "OreBlock256": { - "description": "Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", "items": { "type": "string" }, diff --git a/crates/eql-types/schema/v3/timestamptz_ord.json b/crates/eql-types/schema/v3/timestamptz_ord.json new file mode 100644 index 000000000..993bc94c8 --- /dev/null +++ b/crates/eql-types/schema/v3/timestamptz_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.timestamptz_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (12 blocks for timestamptz). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "TimestamptzOrd", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/timestamptz_ord_ore.json b/crates/eql-types/schema/v3/timestamptz_ord_ore.json new file mode 100644 index 000000000..9d202d6e2 --- /dev/null +++ b/crates/eql-types/schema/v3/timestamptz_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.timestamptz_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (12 blocks for timestamptz). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "TimestamptzOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index deb3b297f..954a44715 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -52,6 +52,7 @@ pub mod date; pub mod int2; pub mod int4; pub mod int8; +pub mod numeric; pub mod terms; pub mod text; pub mod timestamptz; @@ -151,6 +152,12 @@ pub fn all() -> Vec> { Box::new(PhantomData::), Box::new(PhantomData::), Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), Box::new(PhantomData::), Box::new(PhantomData::), Box::new(PhantomData::), diff --git a/crates/eql-types/src/v3/numeric.rs b/crates/eql-types/src/v3/numeric.rs new file mode 100644 index 000000000..d7d5b08a8 --- /dev/null +++ b/crates/eql-types/src/v3/numeric.rs @@ -0,0 +1,136 @@ +//! The `numeric` encrypted-domain family — an ordered, non-integer scalar +//! backed by `rust_decimal::Decimal`. Same four-domain ordered shape as +//! [`crate::v3::int4`] (ORE compares ciphertext, so decimals order like +//! integers); see that module for the capability table. +//! +//! `numeric` is the first scalar whose native ORE term is wider than 8 blocks +//! (14 blocks): the wire shape is unchanged — the `ob` array simply carries +//! more block strings — and the generalized `eql_v3.ore_block_256` comparator +//! orders any block count, so no new type is needed here. + +use schemars::{schema::RootSchema, schema_for}; + +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; +use crate::v3::DomainType; +use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +/// `eql_v3.numeric` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Numeric { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl DomainType for Numeric { + fn sql_domain_static() -> &'static str { + "eql_v3.numeric" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Numeric) + } +} + +/// `eql_v3.numeric_eq` — HMAC equality (`=`, `<>`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct NumericEq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// HMAC-SHA-256 equality term. + pub hm: Hmac256, +} + +impl DomainType for NumericEq { + fn sql_domain_static() -> &'static str { + "eql_v3.numeric_eq" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(NumericEq) + } +} + +/// `eql_v3.numeric_ord_ore` — full comparison, scheme-explicit name. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct NumericOrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (14 blocks for numeric). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for NumericOrdOre { + fn sql_domain_static() -> &'static str { + "eql_v3.numeric_ord_ore" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(NumericOrdOre) + } +} + +/// `eql_v3.numeric_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct NumericOrd { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (14 blocks for numeric). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for NumericOrd { + fn sql_domain_static() -> &'static str { + "eql_v3.numeric_ord" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(NumericOrd) + } +} diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index 086dd0907..9a2bfc667 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -28,9 +28,11 @@ pub struct Ciphertext(pub String); #[ts(export, export_to = "v3/")] pub struct Hmac256(pub String); -/// Block-ORE (u64, 8 blocks, 256) order term — the `ob` wire key. Backs the -/// `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless -/// over the scalar's domain, so it serves equality too. SQL-side constructor: +/// Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` +/// domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's +/// domain, so it serves equality too. The block count is width-agnostic on the +/// wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the +/// array just carries more block strings. SQL-side constructor: /// `eql_v3.ore_block_256`. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-types/src/v3/timestamptz.rs index 3deb51a28..a86ad5d57 100644 --- a/crates/eql-types/src/v3/timestamptz.rs +++ b/crates/eql-types/src/v3/timestamptz.rs @@ -1,12 +1,17 @@ -//! The `timestamptz` encrypted-domain family — **equality-only** (storage + -//! `_eq`). There is no ordered domain: cipherstash encrypts timestamps at -//! native 12-block ORE width, but EQL's only ORE comparator is hardcoded to -//! 8 blocks, so an ordered timestamptz domain would silently mis-order. -//! Ordering arrives with a future wide-ORE term (see `eql-scalars`). +//! The `timestamptz` encrypted-domain family — an ordered, non-integer scalar. +//! Same four-domain ordered shape as [`crate::v3::int4`] (ORE compares +//! ciphertext, so timestamps order like integers); see that module for the +//! capability table. +//! +//! cipherstash encrypts timestamps at native 12-block ORE width. The family +//! was equality-only while EQL's ORE comparator was hardcoded to 8 blocks; +//! now that `eql_v3.ore_block_256` derives the block count from the term +//! length, the 12-block `ob` term orders correctly and the ordered domains +//! ship. The wire shape is unchanged — the `ob` array just carries 12 blocks. use schemars::{schema::RootSchema, schema_for}; -use crate::v3::terms::{Ciphertext, Hmac256}; +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; use schemars::JsonSchema; @@ -70,3 +75,63 @@ impl DomainType for TimestamptzEq { schema_for!(TimestamptzEq) } } + +/// `eql_v3.timestamptz_ord_ore` — full comparison, scheme-explicit name. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TimestamptzOrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (12 blocks for timestamptz). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for TimestamptzOrdOre { + fn sql_domain_static() -> &'static str { + "eql_v3.timestamptz_ord_ore" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(TimestamptzOrdOre) + } +} + +/// `eql_v3.timestamptz_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TimestamptzOrd { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (12 blocks for timestamptz). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for TimestamptzOrd { + fn sql_domain_static() -> &'static str { + "eql_v3.timestamptz_ord" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(TimestamptzOrd) + } +} diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-types/tests/v3_conformance.rs index a20e6e997..df3456748 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-types/tests/v3_conformance.rs @@ -168,7 +168,7 @@ fn non_int4_tokens_round_trip_every_domain() { // `catalog_parity.rs` checks domain *names* only, never the wire shape. // This sweep roundtrips every non-int4 domain and pins its catalog name, // failing the instant a token drifts from the shared envelope/term contract. - use eql_types::v3::{date::*, int2::*, int8::*, text::*}; + use eql_types::v3::{date::*, int2::*, int8::*, numeric::*, text::*}; // Wire builders for the three shapes the ordered tokens share. let storage = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct" }); @@ -204,6 +204,13 @@ fn non_int4_tokens_round_trip_every_domain() { round_trip!(DateOrd, ord("a"), "eql_v3.date_ord"); round_trip!(DateOrdOre, ord("a"), "eql_v3.date_ord_ore"); + // numeric is the first scalar whose native ORE term exceeds 8 blocks (14); + // the wire shape is identical, so the same `ord` builder applies. + round_trip!(Numeric, storage("a"), "eql_v3.numeric"); + round_trip!(NumericEq, eq("a"), "eql_v3.numeric_eq"); + round_trip!(NumericOrd, ord("a"), "eql_v3.numeric_ord"); + round_trip!(NumericOrdOre, ord("a"), "eql_v3.numeric_ord_ore"); + // text_match is covered by `text_match_round_trips_signed_bloom_filter`. round_trip!(Text, storage("a"), "eql_v3.text"); round_trip!(TextEq, eq("a"), "eql_v3.text_eq"); @@ -213,12 +220,16 @@ fn non_int4_tokens_round_trip_every_domain() { } #[test] -fn timestamptz_round_trips_and_enforces_equality_term() { - // The one structurally-distinct token: equality-only, no `_ord`/`_ord_ore` - // (the 8-block-ORE limitation). The int4 template was copy-pasted to - // produce it, so an accidental extra `ob` field or a dropped `hm` would - // pass `catalog_parity` (domain names only) but is caught here. - use eql_types::v3::timestamptz::{Timestamptz, TimestamptzEq}; +fn timestamptz_round_trips_and_enforces_term_capabilities() { + // timestamptz is an ordered token (12-block ORE) — it carries the full + // storage/`_eq`/`_ord`/`_ord_ore` shape, the same as the int scalars. The + // int4 template was copy-pasted to produce it, so a dropped `hm`/`ob` or a + // field typo would pass `catalog_parity` (domain names only) but is caught + // here. (Was equality-only while the ORE comparator was hardcoded to 8 + // blocks; promoted once `eql_v3.ore_block_256` generalized to any width.) + use eql_types::v3::timestamptz::{ + Timestamptz, TimestamptzEq, TimestamptzOrd, TimestamptzOrdOre, + }; // Storage-only: envelope, no term. let storage = json!({ @@ -241,16 +252,40 @@ fn timestamptz_round_trips_and_enforces_equality_term() { assert_eq!(serde_json::to_value(&parsed).unwrap(), with_hm); assert_eq!(TimestamptzEq::sql_domain_static(), "eql_v3.timestamptz_eq"); - // `_eq` is the only searchable shape this token has, so its equality term - // cannot silently become optional. + // Ordered: envelope + ob (a 12-block array on the wire; shape is the same). + let with_ob = json!({ + "v": 2, + "i": { "t": "events", "c": "occurred_at" }, + "c": "mp_base85_ciphertext", + "ob": ["b0", "b1"] + }); + let parsed: TimestamptzOrd = serde_json::from_value(with_ob.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), with_ob); + assert_eq!( + TimestamptzOrd::sql_domain_static(), + "eql_v3.timestamptz_ord" + ); + let parsed: TimestamptzOrdOre = serde_json::from_value(with_ob.clone()).unwrap(); + assert_eq!(serde_json::to_value(&parsed).unwrap(), with_ob); + assert_eq!( + TimestamptzOrdOre::sql_domain_static(), + "eql_v3.timestamptz_ord_ore" + ); + + // The searchable domains cannot let their term silently become optional. let no_hm = json!({ "v": 2, "i": { "t": "events", "c": "occurred_at" }, "c": "mp_base85_ciphertext" }); - let result: Result = serde_json::from_value(no_hm); + let result: Result = serde_json::from_value(no_hm.clone()); assert!( result.is_err(), "TimestamptzEq must reject a payload with no hm" ); + let result: Result = serde_json::from_value(no_hm); + assert!( + result.is_err(), + "TimestamptzOrd must reject a payload with no ob" + ); } From f70c89cc563f0e00313f143acf6de1580e364cdb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 17:26:03 +1000 Subject: [PATCH 212/599] feat(eql-codegen): add dump-catalog subcommand Emits the catalog surface (types -> domains -> supported operators) as JSON. The reusable producer consumed by the Stage 1 catalog-coverage gate and the later log-verification matcher. --- Cargo.lock | 1 + crates/eql-codegen/Cargo.toml | 1 + crates/eql-codegen/src/dump.rs | 106 +++++++++++++++++++++++++++++++++ crates/eql-codegen/src/lib.rs | 1 + crates/eql-codegen/src/main.rs | 10 ++++ 5 files changed, 119 insertions(+) create mode 100644 crates/eql-codegen/src/dump.rs diff --git a/Cargo.lock b/Cargo.lock index 367a00ce6..9d8b794b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1168,6 +1168,7 @@ dependencies = [ "eql-scalars", "minijinja", "serde", + "serde_json", "thiserror 2.0.18", ] diff --git a/crates/eql-codegen/Cargo.toml b/crates/eql-codegen/Cargo.toml index 0fb89e77b..729e3fb28 100644 --- a/crates/eql-codegen/Cargo.toml +++ b/crates/eql-codegen/Cargo.toml @@ -8,6 +8,7 @@ publish = false eql-scalars = { path = "../eql-scalars" } minijinja = "2" serde = { version = "1", features = ["derive"] } +serde_json = "1" thiserror = "2" [[bin]] diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs new file mode 100644 index 000000000..b81eb0d41 --- /dev/null +++ b/crates/eql-codegen/src/dump.rs @@ -0,0 +1,106 @@ +//! `dump_catalog` — serialize the `eql_scalars::CATALOG` surface (each type's +//! domains and their supported SQL operators) for downstream verification +//! tooling. The reusable producer behind `eql-codegen -- dump-catalog`. +//! +//! Stage 1 consumes the `(type, domain)` shape; later stages consume the +//! per-domain `supported_ops`. Blocked-operator tagging is added in Stage 4. + +use eql_scalars::{Term, CATALOG}; +use serde::Serialize; + +/// The catalog surface: every scalar type and its domains. +#[derive(Serialize)] +pub struct CatalogDump { + pub types: Vec, +} + +#[derive(Serialize)] +pub struct TypeEntry { + /// Catalog token, e.g. `int4`. + pub token: &'static str, + /// True when the type has no `_ord` domain (storage + `_eq` only). + pub is_eq_only: bool, + pub domains: Vec, +} + +#[derive(Serialize)] +pub struct DomainEntry { + /// Test-name segment: the base domain (`suffix == ""`) is `storage`; + /// otherwise the suffix without its leading underscore (`_eq` → `eq`, + /// `_ord_ore` → `ord_ore`). + pub segment: String, + /// Raw catalog suffix (`""`, `_eq`, `_ord`, `_ord_ore`, `_match`). + pub suffix: &'static str, + /// SQL operators the domain's terms support, in catalog order. Empty for + /// the storage domain (no terms). + pub supported_ops: Vec<&'static str>, +} + +/// Build the catalog surface description from `eql_scalars::CATALOG`. +pub fn dump_catalog() -> CatalogDump { + let types = CATALOG + .iter() + .map(|spec| { + let domains = spec + .domains + .iter() + .map(|d| DomainEntry { + segment: if d.suffix.is_empty() { + "storage".to_string() + } else { + d.suffix.trim_start_matches('_').to_string() + }, + suffix: d.suffix, + supported_ops: Term::operators_for_terms(d.terms), + }) + .collect(); + TypeEntry { + token: spec.token, + is_eq_only: spec.is_eq_only(), + domains, + } + }) + .collect(); + CatalogDump { types } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn int4_exposes_all_ordered_domains_with_operators() { + let dump = dump_catalog(); + let int4 = dump + .types + .iter() + .find(|t| t.token == "int4") + .expect("int4 present in catalog"); + assert!(!int4.is_eq_only, "int4 is an ordered type"); + + let segments: Vec<&str> = int4.domains.iter().map(|d| d.segment.as_str()).collect(); + assert_eq!(segments, ["storage", "eq", "ord_ore", "ord"]); + + let storage = int4.domains.iter().find(|d| d.segment == "storage").unwrap(); + assert!(storage.supported_ops.is_empty(), "storage has no operators"); + + let eq = int4.domains.iter().find(|d| d.segment == "eq").unwrap(); + assert_eq!(eq.supported_ops, ["=", "<>"]); + + let ord = int4.domains.iter().find(|d| d.segment == "ord").unwrap(); + assert_eq!(ord.supported_ops, ["=", "<>", "<", "<=", ">", ">="]); + } + + #[test] + fn timestamptz_is_eq_only() { + let dump = dump_catalog(); + let ts = dump + .types + .iter() + .find(|t| t.token == "timestamptz") + .expect("timestamptz present in catalog"); + assert!(ts.is_eq_only); + let segments: Vec<&str> = ts.domains.iter().map(|d| d.segment.as_str()).collect(); + assert_eq!(segments, ["storage", "eq"]); + } +} diff --git a/crates/eql-codegen/src/lib.rs b/crates/eql-codegen/src/lib.rs index be49bc48f..cab1eee4c 100644 --- a/crates/eql-codegen/src/lib.rs +++ b/crates/eql-codegen/src/lib.rs @@ -9,6 +9,7 @@ use std::path::PathBuf; pub mod consts; pub mod context; +pub mod dump; pub mod generate; pub mod operator_surface; pub mod writer; diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index 3f5f6680f..fe29d0b9e 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -15,6 +15,15 @@ fn main() -> ExitCode { return ExitCode::SUCCESS; } + // `dump-catalog`: print the catalog surface (types → domains → + // supported operators) as JSON. Consumed by test:matrix:catalog-coverage + // (Stage 1) and the log-verification matcher (Stage 4). + if args.len() == 2 && args[1] == "dump-catalog" { + let dump = eql_codegen::dump::dump_catalog(); + println!("{}", serde_json::to_string_pretty(&dump).expect("serialize catalog dump")); + return ExitCode::SUCCESS; + } + if args.len() == 1 { // No args: generate every type's gitignored SQL surface. match generate_all(&repo_root()) { @@ -29,5 +38,6 @@ fn main() -> ExitCode { eprintln!("Usage: eql-codegen (generate all types)"); eprintln!(" eql-codegen list-types (print catalog tokens)"); + eprintln!(" eql-codegen dump-catalog (print catalog surface as JSON)"); ExitCode::from(2) } From f69cc33c8b298abd516c428768f3141fd2eaec0a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 12 Jun 2026 20:15:05 +1000 Subject: [PATCH 213/599] ci(matrix): add static catalog-coverage gate test:matrix:catalog-coverage asserts every CATALOG (type, domain) has at least one matrix test, cross-checked against the encrypted_domain binary listing (no database). Finer than test:matrix:inventory, which reconciles only types: a DomainSpec added without matrix wiring now fails CI. DB-free: creates temporary empty include_str! stubs for --list and removes them. Runs in the matrix-coverage required job. A catalog domain is covered by EITHER a matrix-emitted test (scalars::::matrix___*) OR a dedicated module (_::*, e.g. text's Bloom _match domain in the hand-written text_match suite), since containment is not an eq/ord shape the matrix macro emits. --- .github/workflows/test-eql.yml | 2 + mise.toml | 110 +++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 034f7a2c9..b3ddd8f4d 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -409,6 +409,8 @@ jobs: git add -N tests/sqlx/snapshots git diff --exit-code -- tests/sqlx/snapshots \ || { echo "Coverage inventory stale — run the relevant inventory task and commit."; exit 1; } + - name: Verify catalog-surface coverage + run: mise run test:matrix:catalog-coverage splinter: name: "Supabase splinter" diff --git a/mise.toml b/mise.toml index bfece3d4f..09a484e5b 100644 --- a/mise.toml +++ b/mise.toml @@ -380,6 +380,116 @@ diff -u snapshots/v3_jsonb_tests.txt "$tmp" echo "v3 jsonb inventory OK" """ +[tasks."test:matrix:catalog-coverage"] +description = "Assert every CATALOG (type, domain) has matrix tests, cross-checked against the encrypted_domain binary (no database required)" +dir = "{{config_root}}/tests/sqlx" +run = """ +#!/usr/bin/env bash +# Forward catalog-coverage: for each scalar type in the catalog, every domain +# the catalog declares for it must have at least one matrix test name. FINER +# than test:matrix:inventory (which reconciles only TYPES against list-types): +# a DomainSpec added to a catalog row without matrix wiring passes the type +# inventory but fails here. Domain granularity only (Stage 1); per-operator +# execution coverage is the Stage 4 matcher's job. No database needed. +# +# Compile precondition: encrypted_domain include_str!s its fixtures + the +# 001 migration at compile time (mise.toml:104). Those are generated/gitignored, +# so a bare worktree cannot compile it for --list. We never RUN tests here, so +# empty stub files satisfy include_str!. We create only the missing files (rustc +# reports them all in one pass) and remove them on exit. Bash 3.2 compatible +# (macOS): no mapfile/arrays; created stubs are tracked in a temp file. +set -euo pipefail +root="{{config_root}}" + +# --- DB-free stub preamble so --list can compile on a bare worktree ---------- +created_list=$(mktemp) +trap 'while IFS= read -r f; do [ -n "$f" ] && rm -f "$f"; done < "$created_list"; rm -f "$created_list"' EXIT + +err=$(mktemp) +i=0 +while :; do + if listing=$(cargo test --no-default-features --test encrypted_domain -- --list 2>"$err"); then + break + fi + # Missing include_str! targets are the *.sql paths in the compile errors + # (repo-root-relative, may contain `..`). Match path chars only (no backticks + # or apostrophes to wrestle through TOML). + missing=$(grep -oE "[A-Za-z0-9_./-]+\\.sql" "$err" | LC_ALL=C sort -u || true) + if [ -z "$missing" ]; then + echo "encrypted_domain failed to list for a non-fixture reason:" >&2 + cat "$err" >&2 + rm -f "$err"; exit 1 + fi + while IFS= read -r m; do + [ -n "$m" ] || continue + p="${root}/${m}" + if [ ! -e "$p" ]; then + mkdir -p "$(dirname "$p")" + : > "$p" + echo "$p" >> "$created_list" + fi + done <<< "$missing" + i=$((i + 1)) + [ "$i" -lt 12 ] || { echo "stub loop exceeded 12 iterations" >&2; cat "$err" >&2; rm -f "$err"; exit 1; } +done +rm -f "$err" +[ -n "$listing" ] || { echo "No tests listed from the encrypted_domain binary." >&2; exit 1; } +listing=$(printf '%s\\n' "$listing" | sed -n 's/: test$//p') + +# --- Catalog surface (overridable for testing via EQL_CATALOG_DUMP_FILE) ----- +# The seam lets the fault-injection check (Step 3) run THIS exact loop against a +# doctored dump without editing the task. +if [ -n "${EQL_CATALOG_DUMP_FILE:-}" ]; then + dump=$(cat "$EQL_CATALOG_DUMP_FILE") +else + dump=$(cd "$root" && cargo run -q -p eql-codegen -- dump-catalog) +fi + +# --- Forward coverage check -------------------------------------------------- +failed=0 +while IFS= read -r t; do + [ -n "$t" ] || continue + # Segments the catalog declares for this type, longest-first so the prefix + # exclusion below (ord vs ord_ore) is well-defined. + segments=$(printf '%s' "$dump" \ + | jq -r --arg t "$t" '.types[] | select(.token==$t) | .domains[].segment' \ + | awk '{ print length, $0 }' | LC_ALL=C sort -rn | cut -d" " -f2-) + + while IFS= read -r seg; do + [ -n "$seg" ] || continue + # Longer catalog segments having `seg` as a prefix (e.g. ord_ore when seg=ord). + longer=$(printf '%s\\n' "$segments" | grep -xvF "$seg" | grep -E "^${seg}_" || true) + # (a) Matrix-shape tests: scalars::::matrix___* . The macro emits + # these for the ordered/eq shapes (storage, eq, ord, ord_ore). Strip + # longer-prefix tests so seg=ord does not borrow ord_ore's names. + matches=$(printf '%s\\n' "$listing" | grep -E "^scalars::${t}::matrix_${t}_${seg}_" || true) + if [ -n "$longer" ]; then + while IFS= read -r l; do + [ -n "$l" ] || continue + matches=$(printf '%s\\n' "$matches" | grep -vE "^scalars::${t}::matrix_${t}_${l}_" || true) + done <<< "$longer" + fi + # (b) Dedicated-module tests: _::* . Some domains are covered by a + # hand-written suite rather than the matrix macro — text's Bloom `_match` + # domain (`@>`/`<@` containment) lives in the `text_match` module, since + # containment is not an eq/ord shape the matrix emits. The `::` separator + # makes this exact per segment, so no longer-prefix exclusion is needed. + module_matches=$(printf '%s\\n' "$listing" | grep -E "^${t}_${seg}::" || true) + if [ -z "$(printf '%s' "${matches}${module_matches}" | tr -d '[:space:]')" ]; then + echo "MISSING: catalog declares domain '${seg}' for type '${t}', but no scalars::${t}::matrix_${t}_${seg}_* or ${t}_${seg}::* test exists." >&2 + failed=1 + fi + done <<< "$segments" +done < <(printf '%s' "$dump" | jq -r '.types[].token') + +if [ "$failed" -ne 0 ]; then + echo "Catalog-coverage FAILED: a catalog domain has no matrix wiring (see MISSING lines above)." >&2 + exit 1 +fi + +echo "Catalog-coverage OK: every CATALOG (type, domain) has matrix tests." +""" + [tasks."test:matrix:expand"] description = "Regenerate the int4 matrix cargo-expand snapshot (requires the pinned nightly + cargo-expand)" dir = "{{config_root}}/tests/sqlx" From 5055fe777b8f53bc401618bddec62aaf3e1b8df4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 17 Jun 2026 09:04:27 +1000 Subject: [PATCH 214/599] style: fix rustfmt violations in eql-codegen dump-catalog --- crates/eql-codegen/src/dump.rs | 6 +++++- crates/eql-codegen/src/main.rs | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index b81eb0d41..78e8098ff 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -81,7 +81,11 @@ mod tests { let segments: Vec<&str> = int4.domains.iter().map(|d| d.segment.as_str()).collect(); assert_eq!(segments, ["storage", "eq", "ord_ore", "ord"]); - let storage = int4.domains.iter().find(|d| d.segment == "storage").unwrap(); + let storage = int4 + .domains + .iter() + .find(|d| d.segment == "storage") + .unwrap(); assert!(storage.supported_ops.is_empty(), "storage has no operators"); let eq = int4.domains.iter().find(|d| d.segment == "eq").unwrap(); diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index fe29d0b9e..2a9bcb876 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -20,7 +20,10 @@ fn main() -> ExitCode { // (Stage 1) and the log-verification matcher (Stage 4). if args.len() == 2 && args[1] == "dump-catalog" { let dump = eql_codegen::dump::dump_catalog(); - println!("{}", serde_json::to_string_pretty(&dump).expect("serialize catalog dump")); + println!( + "{}", + serde_json::to_string_pretty(&dump).expect("serialize catalog dump") + ); return ExitCode::SUCCESS; } From 2d7c9e9a18449643f355502bad934461a941aa0e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 11:44:19 +1000 Subject: [PATCH 215/599] test(eql-codegen): update timestamptz dump test for ordered promotion timestamptz was promoted from eq-only to the ordered four-domain shape in #284, but the dump-catalog test still asserted is_eq_only. Rewrite timestamptz_is_eq_only -> timestamptz_is_ordered to match the current catalog (storage, eq, ord_ore, ord), fixing the Rust workspace crates CI job. --- crates/eql-codegen/src/dump.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 78e8098ff..5c4cef90c 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -96,15 +96,23 @@ mod tests { } #[test] - fn timestamptz_is_eq_only() { + fn timestamptz_is_ordered() { + // timestamptz was promoted to the ordered shape once + // `compare_ore_block_256_term` generalized to N blocks (see #284 / the + // `EQ_ONLY_DOMAINS` note in `eql-scalars`). It now mirrors int4's + // four-domain ordered surface. let dump = dump_catalog(); let ts = dump .types .iter() .find(|t| t.token == "timestamptz") .expect("timestamptz present in catalog"); - assert!(ts.is_eq_only); + assert!(!ts.is_eq_only, "timestamptz is an ordered type"); + let segments: Vec<&str> = ts.domains.iter().map(|d| d.segment.as_str()).collect(); - assert_eq!(segments, ["storage", "eq"]); + assert_eq!(segments, ["storage", "eq", "ord_ore", "ord"]); + + let ord = ts.domains.iter().find(|d| d.segment == "ord").unwrap(); + assert_eq!(ord.supported_ops, ["=", "<>", "<", "<=", ">", ">="]); } } From f7aa1d179d6c175d6593df3257c6de0a86466cdb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 14:38:21 +1000 Subject: [PATCH 216/599] ci: run GitHub Actions on Blacksmith runners Switch all workflow runners from ubuntu-latest / ubuntu-latest-m to blacksmith-16vcpu-ubuntu-2204 for faster CI. --- .github/workflows/bench-eql.yml | 2 +- .github/workflows/macro-expand-eql.yml | 2 +- .github/workflows/rebuild-docs.yml | 2 +- .github/workflows/release-eql.yml | 6 ++-- .../workflows/release-postgres-eql-image.yml | 6 ++-- .github/workflows/test-eql.yml | 36 +++++++++++-------- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/.github/workflows/bench-eql.yml b/.github/workflows/bench-eql.yml index 782ed3c35..2ca734c5f 100644 --- a/.github/workflows/bench-eql.yml +++ b/.github/workflows/bench-eql.yml @@ -36,7 +36,7 @@ defaults: jobs: bench: name: "Bench EQL (Postgres 17)" - runs-on: ubuntu-latest-m + runs-on: blacksmith-16vcpu-ubuntu-2204 timeout-minutes: 60 env: diff --git a/.github/workflows/macro-expand-eql.yml b/.github/workflows/macro-expand-eql.yml index f6411657d..1b4e5223c 100644 --- a/.github/workflows/macro-expand-eql.yml +++ b/.github/workflows/macro-expand-eql.yml @@ -42,7 +42,7 @@ permissions: jobs: macro-expand: name: "Macro expand drift (nightly)" - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 timeout-minutes: 30 steps: diff --git a/.github/workflows/rebuild-docs.yml b/.github/workflows/rebuild-docs.yml index 047b1f30f..075074e41 100644 --- a/.github/workflows/rebuild-docs.yml +++ b/.github/workflows/rebuild-docs.yml @@ -8,7 +8,7 @@ on: jobs: trigger-docs-rebuild: name: Trigger Docs Rebuild - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 steps: - name: Send webhook env: diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml index 515fa0fee..4bf336c6d 100644 --- a/.github/workflows/release-eql.yml +++ b/.github/workflows/release-eql.yml @@ -25,7 +25,7 @@ permissions: jobs: verify-changelog: - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 name: Verify CHANGELOG entry # Only real (non-prerelease) eql-* releases. Pre-releases keep their # entries under [Unreleased] until the final release is cut. @@ -48,7 +48,7 @@ jobs: echo "Found '## [${version}]' section in CHANGELOG.md." build-and-publish: - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 name: Build EQL if: ${{ github.event_name != 'release' || contains(github.event.release.tag_name, 'eql') }} timeout-minutes: 5 @@ -95,7 +95,7 @@ jobs: --data '{"commitSha": "${{ github.sha }}", "environmentName":"production"}' publish-docs: - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 name: Build and Publish Documentation if: ${{ github.event_name != 'release' || contains(github.event.release.tag_name, 'eql') }} timeout-minutes: 10 diff --git a/.github/workflows/release-postgres-eql-image.yml b/.github/workflows/release-postgres-eql-image.yml index 2c646f6c4..4b404a9fb 100644 --- a/.github/workflows/release-postgres-eql-image.yml +++ b/.github/workflows/release-postgres-eql-image.yml @@ -31,7 +31,7 @@ permissions: jobs: build-sql: - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 name: Build EQL SQL if: ${{ github.event_name != 'release' || contains(github.event.release.tag_name, 'eql') }} timeout-minutes: 5 @@ -83,7 +83,7 @@ jobs: path: release/cipherstash-encrypt.sql build-images: - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 needs: build-sql name: Build postgres-eql image (PG ${{ matrix.pg_version }}) timeout-minutes: 30 @@ -145,7 +145,7 @@ jobs: tags: ${{ steps.tags.outputs.tags }} promote-latest: - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 needs: [build-sql, build-images] name: Promote PG17 image to :latest and : if: ${{ needs.build-sql.outputs.update_floating_tags == 'true' }} diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index b3ddd8f4d..fb716fb88 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -43,7 +43,7 @@ jobs: # would either skip the merge-queue matrix or deadlock `ci-required`. changes: name: "Detect relevant changes" - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 outputs: relevant: ${{ steps.r.outputs.relevant }} steps: @@ -85,7 +85,7 @@ jobs: # from the event: PR -> PG17 x 4 shards; merge queue -> PG 14-17 x 2 shards. setup: name: "Compute matrix" - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 outputs: pg-versions: ${{ steps.cfg.outputs.pg }} shard-total: ${{ steps.cfg.outputs.shard_total }} @@ -103,9 +103,17 @@ jobs: echo 'shards=[1,2,3,4]' >> "$GITHUB_OUTPUT" fi - codegen: - name: "Encrypted-domain codegen" - runs-on: ubuntu-latest + # Compile the test binaries ONCE. Runs in the queue and on workflow_dispatch + # always, and on PRs only when relevant files changed (docs-only PRs never pay + # the ~4-min compile). + build-archive: + name: "Build test archive" + needs: [changes] + if: >- + github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') + runs-on: blacksmith-16vcpu-ubuntu-2204 env: # test:sqlx:archive depends on test:sqlx:prep, which copies the built EQL # into migrations/, applies it to a live Postgres, and regenerates the @@ -170,7 +178,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest-m + runs-on: blacksmith-16vcpu-ubuntu-2204 strategy: fail-fast: false matrix: @@ -225,7 +233,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest-m + runs-on: blacksmith-16vcpu-ubuntu-2204 strategy: fail-fast: false matrix: @@ -269,7 +277,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -295,7 +303,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -333,7 +341,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -359,7 +367,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -386,7 +394,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: @@ -419,7 +427,7 @@ jobs: github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') - runs-on: ubuntu-latest-m + runs-on: blacksmith-16vcpu-ubuntu-2204 env: POSTGRES_VERSION: "17" steps: @@ -456,7 +464,7 @@ jobs: needs: [changes, setup, build-archive, test, validate, schema, rust-crates, codegen, self-contained-v3, matrix-coverage, splinter] if: always() - runs-on: ubuntu-latest + runs-on: blacksmith-16vcpu-ubuntu-2204 steps: - name: Assert all required jobs passed or were skipped run: | From 72888d7969656696c9f140e454281aeec10b74de Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 15:50:09 +1000 Subject: [PATCH 217/599] ci: drop login shell so mise is found on Blacksmith runners Blacksmith's ubuntu-2204 image resets PATH when a login shell sources the profile, dropping the mise bin/shims dirs that jdx/mise-action adds via $GITHUB_PATH. Every step then fails with 'mise: command not found'. Switch defaults.run.shell from 'bash -l {0}' to 'bash {0}'. The login shell was a leftover from the pre-mise just/setup era; current tooling exposes mise via $GITHUB_PATH and cargo/rustup via env, so no login profile is needed. Keeps existing error-handling semantics (no new -e/-o pipefail). --- .github/workflows/bench-eql.yml | 2 +- .github/workflows/macro-expand-eql.yml | 2 +- .github/workflows/release-eql.yml | 2 +- .github/workflows/release-postgres-eql-image.yml | 2 +- .github/workflows/test-eql.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/bench-eql.yml b/.github/workflows/bench-eql.yml index 2ca734c5f..35b45991a 100644 --- a/.github/workflows/bench-eql.yml +++ b/.github/workflows/bench-eql.yml @@ -31,7 +31,7 @@ env: defaults: run: - shell: bash -l {0} + shell: bash {0} jobs: bench: diff --git a/.github/workflows/macro-expand-eql.yml b/.github/workflows/macro-expand-eql.yml index 1b4e5223c..9b4d0d8d4 100644 --- a/.github/workflows/macro-expand-eql.yml +++ b/.github/workflows/macro-expand-eql.yml @@ -34,7 +34,7 @@ env: defaults: run: - shell: bash -l {0} + shell: bash {0} permissions: contents: read diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml index 4bf336c6d..f979890bf 100644 --- a/.github/workflows/release-eql.yml +++ b/.github/workflows/release-eql.yml @@ -18,7 +18,7 @@ env: defaults: run: - shell: bash -l {0} + shell: bash {0} permissions: contents: write diff --git a/.github/workflows/release-postgres-eql-image.yml b/.github/workflows/release-postgres-eql-image.yml index 4b404a9fb..9bf17c4d5 100644 --- a/.github/workflows/release-postgres-eql-image.yml +++ b/.github/workflows/release-postgres-eql-image.yml @@ -23,7 +23,7 @@ env: defaults: run: - shell: bash -l {0} + shell: bash {0} permissions: contents: read diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index fb716fb88..f946c4fa9 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -26,7 +26,7 @@ env: defaults: run: - shell: bash -l {0} + shell: bash {0} permissions: contents: read From 7fb658154039c1155342a8732a57b7cd2a73e5f4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 13:10:58 +1000 Subject: [PATCH 218/599] feat(eql_v3): add `bool` storage-only encrypted-domain type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `eql_v3.bool`, the first storage-only / encryption-only scalar: a single term-less jsonb domain with no `_eq`/`_ord`, no SEM index term, and no server-side search surface. A two-value column has so little cardinality that any searchable index (even HMAC equality) would leak the plaintext distribution, so bool is encrypted at rest and decrypted by the proxy only; every comparison/containment/path operator reachable through domain fallback is a blocker. Catalog (eql-scalars): - ScalarKind::Bool, Fixture::Bool, STORAGE_ONLY_DOMAINS, BOOL spec - ScalarSpec::is_storage_only(); catalog tests for the storage-only shape Codegen: no generator changes (it already handles a zero-term single-domain type — 3 files, 44 plpgsql blockers, no aggregates). Committed reference baseline at tests/codegen/reference/bool/. SQLx harness: - bool -> Plaintext::Boolean wiring (eql_plaintext.rs); Cast::BOOLEAN reused, PlaintextSqlType::BOOLEAN added - hand-written `impl ScalarType for bool` (not Ordered/Signed/Match) - FixtureSpec::storage_only() — a storage-only fixture declares zero indexes, so its payload is `{v,i,c}` only (no hm/ob/bf) - `scalar_fixture!(storage, ...)` arm; eql-tests-macros routing (is_storage_only_token, caps = [storage], checked before eq-only) - new first-class `caps = [storage]` matrix arm: invokes only the surface leaf drivers (sanity, blockers, payload-check, path-op, native-absent, typed-column, count, aggregate-typecheck, fixture-shape) — no comparison/index/order categories. Shared scalar_domain_matrix! is unchanged (other 7 types byte-identical). - fixture-shape is now capability-aware: storage-only asserts `{v,i,c}` present and hm/ob/bf absent Inventory: new committed snapshots/matrix_tests_storage_only.txt (18 tests); test:matrix:inventory gains a fourth shape branch. Reconciles 8 catalog types (bool -> storage_only). Docs: CHANGELOG entry; reference guide §8 (storage-only worked example) + corrected stale timestamptz eq-only claim. --- CHANGELOG.md | 1 + crates/eql-scalars/src/fixture.rs | 3 +- crates/eql-scalars/src/kind.rs | 2 + crates/eql-scalars/src/lib.rs | 47 +- crates/eql-scalars/src/spec.rs | 11 + crates/eql-scalars/src/tests.rs | 71 ++- crates/eql-tests-macros/src/lib.rs | 87 +++- .../adding-a-scalar-encrypted-domain-type.md | 87 +++- mise.toml | 35 +- .../codegen/reference/bool/bool_functions.sql | 404 ++++++++++++++++++ .../codegen/reference/bool/bool_operators.sql | 228 ++++++++++ tests/codegen/reference/bool/bool_types.sql | 25 ++ tests/sqlx/snapshots/README.md | 41 +- .../snapshots/matrix_tests_storage_only.txt | 18 + tests/sqlx/src/fixtures/eql_plaintext.rs | 39 ++ tests/sqlx/src/fixtures/scalar_fixture.rs | 63 ++- tests/sqlx/src/fixtures/spec.rs | 52 ++- tests/sqlx/src/matrix.rs | 150 +++++-- tests/sqlx/src/scalar_domains.rs | 74 ++++ tests/sqlx/src/scalar_types.rs | 1 + 20 files changed, 1360 insertions(+), 79 deletions(-) create mode 100644 tests/codegen/reference/bool/bool_functions.sql create mode 100644 tests/codegen/reference/bool/bool_operators.sql create mode 100644 tests/codegen/reference/bool/bool_types.sql create mode 100644 tests/sqlx/snapshots/matrix_tests_storage_only.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 017b05d9c..a9a852d89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) +- **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#NNN](https://github.com/cipherstash/encrypt-query-language/pull/NNN)) ### Changed diff --git a/crates/eql-scalars/src/fixture.rs b/crates/eql-scalars/src/fixture.rs index 23208ddb2..f1e3f9acc 100644 --- a/crates/eql-scalars/src/fixture.rs +++ b/crates/eql-scalars/src/fixture.rs @@ -33,7 +33,8 @@ impl Fixture { | Fixture::Text(_) | Fixture::Jsonb(_) | Fixture::Date(_) - | Fixture::Timestamptz(_) => None, + | Fixture::Timestamptz(_) + | Fixture::Bool(_) => None, } } } diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-scalars/src/kind.rs index e91813daf..1219472cc 100644 --- a/crates/eql-scalars/src/kind.rs +++ b/crates/eql-scalars/src/kind.rs @@ -71,6 +71,7 @@ impl ScalarKind { ScalarKind::Numeric | ScalarKind::Text | ScalarKind::Jsonb + | ScalarKind::Bool | ScalarKind::Date | ScalarKind::Timestamptz => None, } @@ -111,6 +112,7 @@ impl ScalarKind { ScalarKind::Date => "chrono::NaiveDate", ScalarKind::Timestamptz => "chrono::DateTime", ScalarKind::Numeric => "rust_decimal::Decimal", + ScalarKind::Bool => "bool", ScalarKind::Jsonb => { panic!("ScalarKind::rust_type: jsonb has no generated surface yet") } diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 7607609c5..40bfef216 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -71,6 +71,15 @@ pub enum ScalarKind { /// cipherstash has no tz-preserving type, so it maps to the `timestamp` /// cast and the SQL `timestamp with time zone` plaintext type. Timestamptz, + /// Boolean (`bool`). **Encryption-only / storage-only**: it carries no index + /// term and is *not* `is_int()`/`is_temporal()`/`is_text()`. A two-value + /// column has such low cardinality that any searchable index (even HMAC + /// equality) would trivially leak the plaintext distribution, so the catalog + /// gives `bool` a single term-less storage domain and no `_eq`/`_ord` — the + /// value is encrypted at rest and decrypted by the proxy, never searched + /// server-side. Like the other non-integer kinds, the bounded-numeric + /// accessors are unreachable for it by construction. + Bool, } /// Always-present payload keys required by every generated domain CHECK, @@ -165,6 +174,10 @@ pub enum Fixture { /// stays zero-dep, so the string is parsed into a `chrono::DateTime` in /// the SQLx harness, not here. Distinct by literal, like `Date`. Timestamptz(&'static str), + /// A boolean plaintext (`true` / `false`). The `bool` scalar is + /// storage-only, so this fixture is encrypted (ciphertext only, no index + /// term) and never participates in a comparison pivot. Distinct by value. + Bool(bool), } /// One generated public domain: a suffix appended to the type token and the @@ -207,6 +220,7 @@ macro_rules! fixtures { (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; (timestamptz; $($s:literal),* $(,)?) => { &[$(Fixture::Timestamptz($s)),*] }; + (bool; $($b:literal),* $(,)?) => { &[$(Fixture::Bool($b)),*] }; } /// Domains shared by every ordered-integer scalar, in manifest file order: @@ -418,6 +432,37 @@ const TEXT_DOMAINS: &[DomainSpec] = &[ }, ]; +/// Storage-only domains: a single term-less domain (suffix `""`). The canonical +/// shape for an **encryption-only** scalar — encrypted at rest, decrypted by the +/// proxy, never searched server-side. No `_eq`/`_ord`, so no SEM index term and +/// no comparison surface (every operator on the domain is a blocker). Used by +/// `bool`, whose two-value cardinality makes any searchable index a plaintext +/// leak. Validated as a known-valid shape by `every_type_uses_a_known_domain_shape`. +const STORAGE_ONLY_DOMAINS: &[DomainSpec] = &[DomainSpec { + suffix: "", + terms: &[], +}]; + +/// `bool` fixture plaintexts — both values. `bool` is storage-only, so these are +/// encrypted (ciphertext only) and never used as comparison pivots; they exist +/// so the SQLx matrix can prove the storage domain accepts a real bool ciphertext +/// and rejects every operator. Distinct by value. +const BOOL_FIXTURES: &[Fixture] = fixtures!(bool; false, true); + +/// `bool` — an **encryption-only / storage-only** scalar (`ScalarKind::Bool`). +/// One term-less storage domain (`eql_v3.bool`), no `_eq`/`_ord`: a two-value +/// column has too little cardinality for any searchable index without leaking the +/// plaintext, so the value is encrypted at rest and decrypted by the proxy, +/// never searched server-side. Public so the SQLx harness reads `BOOL.fixtures` +/// directly (there is no `BOOL_VALUES` materializer — the two values are read +/// straight from the catalog). +pub const BOOL: ScalarSpec = ScalarSpec { + token: "bool", + kind: ScalarKind::Bool, + domains: STORAGE_ONLY_DOMAINS, + fixtures: BOOL_FIXTURES, +}; + /// `text` fixture plaintexts — curated so eq/ord give a lexicographic spread /// and the match suite has a known substring pair (`"aardvark"`/`"aard"`, /// sharing 3-grams) and a disjoint value (`"zzzz"`, no shared 3-grams). @@ -445,7 +490,7 @@ pub const TEXT: ScalarSpec = ScalarSpec { /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ, NUMERIC, TEXT]; +pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ, NUMERIC, TEXT, BOOL]; /// Materialise an integer scalar's fixtures into a typed `&'static` slice at /// compile time. This is the **single-sourced** plaintext list the SQLx test diff --git a/crates/eql-scalars/src/spec.rs b/crates/eql-scalars/src/spec.rs index 11dfd076b..a3202bbbf 100644 --- a/crates/eql-scalars/src/spec.rs +++ b/crates/eql-scalars/src/spec.rs @@ -29,6 +29,17 @@ impl ScalarSpec { !self.domains.iter().any(|d| d.suffix == "_ord") } + /// True when this type is **storage-only / encryption-only**: it declares a + /// single term-less domain (the bare-token storage domain) and no comparison + /// domain (`_eq`/`_ord`/`_match`/…). The shape for a scalar encrypted at rest + /// but never searched server-side (e.g. `bool`, whose two-value cardinality + /// makes any searchable index a plaintext leak). Stricter than + /// `is_eq_only()` — a storage-only type is also `is_eq_only()` (no `_ord`), + /// but has no `_eq` either. + pub fn is_storage_only(&self) -> bool { + self.domains.len() == 1 && self.domains[0].suffix.is_empty() && self.domains[0].terms.is_empty() + } + /// The domain on this scalar with the given `suffix`, or `None`. Centralizes /// the `domains.iter().find(|d| d.suffix == s)` lookup duplicated across the /// catalog tests and the SQLx harness. diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index be5e98807..80a2888f0 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -523,7 +523,7 @@ mod catalog_tests { } #[test] - fn catalog_has_int4_int2_int8_date_timestamptz_numeric_text_in_order() { + fn catalog_has_int4_int2_int8_date_timestamptz_numeric_text_bool_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); assert_eq!( tokens, @@ -534,11 +534,50 @@ mod catalog_tests { "date", "timestamptz", "numeric", - "text" + "text", + "bool" ] ); } + #[test] + fn bool_spec_is_storage_only_encryption_only() { + let b = scalar("bool"); + assert_eq!(b.kind, ScalarKind::Bool); + assert_eq!(b.kind.rust_type(), "bool"); + // Storage-only: exactly one term-less domain, no `_eq`/`_ord` — no SEM + // index term, no comparison surface. + let shape: Vec<(&str, &[Term])> = b.domains.iter().map(|d| (d.suffix, d.terms)).collect(); + assert_eq!(shape, vec![("", &[] as &[Term])]); + // bool is none of the comparison-capable kinds. + assert!(!b.kind.is_int()); + assert!(!b.kind.is_temporal()); + assert!(!b.kind.is_text()); + assert_eq!(b.kind.as_bounded_int(), None); + // is_eq_only() is true (no `_ord` domain), but the shape is strictly + // smaller than eq-only — there is no `_eq` domain either, so it is + // storage-only. + assert!(b.is_eq_only()); + assert!(b.is_storage_only()); + assert!(b.domain_by_suffix("_eq").is_none()); + // Both boolean plaintexts are present as fixtures. + assert_eq!(b.fixtures, &[Fixture::Bool(false), Fixture::Bool(true)]); + } + + #[test] + fn storage_only_is_exclusive_to_bool() { + // Only `bool` is storage-only today; every comparison-capable type has at + // least an `_eq` domain and must NOT report storage-only. + for s in CATALOG { + assert_eq!( + s.is_storage_only(), + s.token == "bool", + "{} storage-only classification is wrong", + s.token + ); + } + } + #[test] fn text_spec_is_in_catalog() { let text = scalar("text"); @@ -697,13 +736,14 @@ mod catalog_tests { fn every_type_uses_a_known_domain_shape() { // Each scalar's domain shape must be one of the known-valid shapes: // the four-domain ORDERED shape (storage + `_eq` + `_ord_ore` + `_ord`), - // the two-domain EQ-ONLY shape (storage + `_eq`), or the ORDERED shape - // plus a `_match` domain (text's Bloom containment). This catches - // accidental drift — a typo'd suffix, a wrong term, a dropped domain — - // without hardcoding which token gets which shape (that is the catalog's - // job; the matrix dispatch and the inventory snapshots are shape-aware). - // Subsumes the old per-type `_maps_to_*_with_four_domains` / - // `_domain_terms_match_manifest` tests. + // the two-domain EQ-ONLY shape (storage + `_eq`), the one-domain + // STORAGE-ONLY shape (storage only — encryption-only scalars like + // `bool`), or the ORDERED shape plus a `_match` domain (text's Bloom + // containment). This catches accidental drift — a typo'd suffix, a wrong + // term, a dropped domain — without hardcoding which token gets which + // shape (that is the catalog's job; the matrix dispatch and the inventory + // snapshots are shape-aware). Subsumes the old per-type + // `_maps_to_*_with_four_domains` / `_domain_terms_match_manifest` tests. let ordered: Vec<(&str, &[Term])> = vec![ ("", &[] as &[Term]), ("_eq", &[Term::Hm][..]), @@ -711,6 +751,7 @@ mod catalog_tests { ("_ord", &[Term::Ore][..]), ]; let eq_only: Vec<(&str, &[Term])> = vec![("", &[] as &[Term]), ("_eq", &[Term::Hm][..])]; + let storage_only: Vec<(&str, &[Term])> = vec![("", &[] as &[Term])]; let ordered_match: Vec<(&str, &[Term])> = vec![ ("", &[] as &[Term]), ("_eq", &[Term::Hm][..]), @@ -735,6 +776,7 @@ mod catalog_tests { assert!( shape == ordered || shape == eq_only + || shape == storage_only || shape == ordered_match || shape == text_search, "{} has an unrecognised domain shape: {shape:?}", @@ -745,9 +787,11 @@ mod catalog_tests { #[test] fn ordered_and_eq_only_shapes_are_used_as_declared() { - // All current catalog types use the four-domain ordered shape; none is - // equality-only. (timestamptz was promoted to ordered once the ORE - // comparator generalized to N blocks — see the numeric/ORE work.) + // No catalog type is the two-domain equality-only shape: the ordered + // types use the four-domain shape (timestamptz was promoted to ordered + // once the ORE comparator generalized to N blocks — see the numeric/ORE + // work), and `bool` is the one-domain storage-only shape (strictly + // smaller than eq-only). So `domains.len() == 2` should appear nowhere. for s in CATALOG { let is_eq_only = s.domains.len() == 2; assert!( @@ -893,6 +937,9 @@ mod invariant_tests { | Fixture::Jsonb(s) | Fixture::Date(s) | Fixture::Timestamptz(s) => DistinctKey::Str(s), + // `bool` is storage-only and string-backed for distinctness: the two + // values dedupe by their literal, like the other non-numeric kinds. + Fixture::Bool(b) => DistinctKey::Str(if b { "true" } else { "false" }), _ => DistinctKey::Num( f.numeric_value(kind) .expect("sentinel/Int fixtures resolve to a number"), diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 8ad495200..0a2ff8b7c 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -109,6 +109,18 @@ fn is_eq_only_token(token: &str) -> bool { spec_for_token(token).is_eq_only() } +/// True when `token`'s catalog row is **storage-only / encryption-only** — a +/// single term-less domain, no `_eq`/`_ord` (currently only `bool`). Consumed by +/// [`matrix_suite_for_entry`] to route the token to the `caps = [storage]` arm +/// (which runs only the storage-domain subset: blockers, payload-check, +/// path-ops, native-absent — no comparison or index arms). Checked **before** +/// [`is_eq_only_token`], which is also true for a storage-only type (it has no +/// `_ord` domain) but would wrongly select the `caps = [eq]` arm. Stamps the +/// `bool` fixture discriminator (storage-only fixtures carry no index term). +fn is_storage_only_token(token: &str) -> bool { + spec_for_token(token).is_storage_only() +} + /// True when `token`'s catalog row declares a combined `_search` domain /// (currently only `text`). Consumed by [`matrix_suite_for_entry`] to route the /// token to the `caps = [eq, ord, search]` arm, which additionally runs the @@ -234,10 +246,15 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { format_ident!("text") } else if is_numeric_token(&token_str) { format_ident!("numeric") + } else if is_storage_only_token(&token_str) { + // Storage-only (encryption-only) scalars (`bool`): the fixture + // carries no index term (no `hm`/`ob`/`bf`), just the encrypted + // value, and asserts the storage-domain shape only. + format_ident!("storage") } else { panic!( "scalar token `{token_str}` is neither integer, temporal, text, \ - nor numeric — no fixture discriminator is wired for its kind" + numeric, nor storage-only — no fixture discriminator is wired for its kind" ) }; quote! { @@ -290,12 +307,18 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { fn matrix_suite_for_entry( token: &Ident, rust_type: &Type, + storage_only: bool, eq_only: bool, has_search: bool, ) -> TokenStream2 { let token_str = token.to_string(); let eql_type = format!("eql_v2_{}", token_str); - let caps = if eq_only { + // `storage_only` is checked FIRST: a storage-only type is also `eq_only` + // (no `_ord` domain), so the eq-only arm would otherwise wrongly select + // `caps = [eq]` and emit equality tests against a domain that has no `_eq`. + let caps = if storage_only { + quote! { caps = [storage] } + } else if eq_only { quote! { caps = [eq] } } else if has_search { // A token declaring a combined `_search` domain (text) additionally runs @@ -324,6 +347,7 @@ fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { matrix_suite_for_entry( &e.token, &e.rust_type, + is_storage_only_token(&e.token.to_string()), is_eq_only_token(&e.token.to_string()), has_search_token(&e.token.to_string()), ) @@ -530,7 +554,7 @@ mod tests { fn ordered_entry_emits_scalar_matrix_with_eq_ord_caps() { let token: Ident = syn::parse_str("int4").unwrap(); let rust_type: Type = syn::parse_str("i32").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, false)); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, false, false)); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq , ord]")); assert!(out.contains("suite = int4")); @@ -543,7 +567,7 @@ mod tests { // ord_domains), never the ordered `caps = [eq, ord]` arm. let token: Ident = syn::parse_str("timestamptz").unwrap(); let rust_type: Type = syn::parse_str("chrono::DateTime").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, true, false)); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, true, false)); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq]")); assert!(!out.contains("caps = [eq , ord]")); @@ -557,12 +581,65 @@ mod tests { // domain through the matrix in addition to the ordered shape. let token: Ident = syn::parse_str("text").unwrap(); let rust_type: Type = syn::parse_str("String").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, true)); + let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, false, true)); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq , ord , search]")); assert!(out.contains("suite = text")); } + #[test] + fn storage_only_is_read_from_catalog() { + // The storage-only (encryption-only) shape is read from the catalog row, + // never a marker. Only `bool` is storage-only today; comparison-capable + // types are not. Note bool is ALSO eq-only (no `_ord`), so the router + // must check storage-only first. + assert!(is_storage_only_token("bool")); + assert!(is_eq_only_token("bool")); + assert!(!is_storage_only_token("int4")); + assert!(!is_storage_only_token("text")); + assert!(!is_storage_only_token("timestamptz")); + } + + #[test] + fn storage_only_entry_emits_scalar_matrix_with_storage_caps_only() { + // A storage-only token routes to the `caps = [storage]` arm even though + // it is also eq-only — storage-only is checked first, so it never selects + // the `caps = [eq]` arm (which would emit equality tests for a domain + // that has no `_eq`). + let token: Ident = syn::parse_str("bool").unwrap(); + let rust_type: Type = syn::parse_str("bool").unwrap(); + // (storage_only = true, eq_only = true) — true catalog state for bool. + let out = norm(&matrix_suite_for_entry(&token, &rust_type, true, true, false)); + assert!(out.contains(":: eql_tests :: scalar_matrix !")); + assert!(out.contains("caps = [storage]")); + assert!(!out.contains("caps = [eq]")); + assert!(!out.contains("caps = [eq , ord]")); + assert!(out.contains("suite = bool")); + } + + #[test] + fn bool_entry_skips_impl_and_stamps_storage_fixture() { + // `bool` is storage-only: the impl emitter skips it (hand-written in + // scalar_domains.rs), and the fixture module stamps the `storage` + // discriminator drawing from the `bool_values()` accessor. + let list = syn::parse_str::("int4 => i32, bool => bool").unwrap(); + let impls = norm(&scalar_type_impls_tokens(&list)); + assert!(impls.contains("impl ScalarType for i32")); + assert!( + !impls.contains("impl ScalarType for bool"), + "bool must skip the generated impl (hand-written instead)" + ); + let mods = norm(&scalar_fixture_modules_tokens(&list)); + assert!(mods.contains("pub mod eql_v2_bool")); + assert!(mods.contains("storage ,"), "got: {mods}"); + assert!(mods.contains("bool_values"), "got: {mods}"); + let suites = norm(&scalar_matrix_suites_tokens(&list)); + assert!(suites.contains("pub mod bool")); + assert!(suites.contains("caps = [storage]")); + let dispatch = norm(&fixture_dispatch_tokens(&list)); + assert!(dispatch.contains(r#""bool" =>"#)); + } + #[test] #[should_panic(expected = "not in eql-scalars::CATALOG")] fn unknown_token_fails_loudly() { diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 8c0bdf6e2..f5d1bf1de 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -23,8 +23,10 @@ rendered by the [`eql-codegen`](../../crates/eql-codegen/) crate. There is no TOML manifest and no Python — adding a type is adding one `ScalarSpec` row, validated by the compiler plus catalog `#[test]`s. The reference type is `eql_v3.int4`; `eql_v3.text` is the worked non-integer example (ordered + -equality + a `match` capability via the `Bloom` term). **`jsonb` remains out of -scope** for this materializer (see §7). +equality + a `match` capability via the `Bloom` term); `eql_v3.bool` is the +worked **storage-only / encryption-only** example (a single term-less domain, no +searchable surface — see §8). **`jsonb` remains out of scope** for this +materializer (see §7). --- @@ -292,14 +294,20 @@ the interior `mid_pivot()` — from `OrderedScalar` rather than a hand-written list, so the invocation carries no pivot argument. `caps = [eq, ord]` selects the ordered-numeric shape (all four variants; `=`/`<>`/`<`/`<=`/`>`/`>=`; ORDER BY / ORDER BY USING; ORE injectivity); `caps = [eq]` selects the equality-only shape -(storage + `_eq` only; the four ord operators are deliberate blockers). Both -expand to the lower-level `scalar_domain_matrix!`. **You never write `caps`**: -the `scalar_matrix!` proc-macro derives it from the catalog row via -`ScalarSpec::is_eq_only()` (`is_eq_only_token` in `eql-tests-macros`), so the -ordered-vs-eq-only selection is a pure function of which domain-suffix slice the -catalog row uses — `EQ_ONLY_DOMAINS` (→ `[eq]`) vs `ORDERED_INT_DOMAINS` (→ `[eq, -ord]`). `timestamptz` is the worked eq-only example: its `EQ_ONLY_DOMAINS` row -auto-emits `caps = [eq]`, no harness flag. The pivot *sweep* is uniform +(storage + `_eq` only; the four ord operators are deliberate blockers); +`caps = [storage]` selects the storage-only / encryption-only shape (storage +domain only; *every* comparison/containment operator is a blocker — see §8). +All expand to the lower-level `scalar_domain_matrix!` **except `[storage]`**, +which has no comparison/index/order categories to thread, so it invokes only the +surface leaf drivers directly (§8). **You never write `caps`**: the +`scalar_matrix!` proc-macro derives it from the catalog row — `is_storage_only` +(no `_eq`/`_ord`) → `[storage]`, checked first; then `is_eq_only` (no `_ord`) → +`[eq]`; then `has_search` → `[eq, ord, search]`; else `[eq, ord]`. So the shape +is a pure function of which domain-suffix slice the catalog row uses — +`STORAGE_ONLY_DOMAINS` (→ `[storage]`, e.g. `bool`), `EQ_ONLY_DOMAINS` (→ `[eq]`, +no live catalog type today) vs `ORDERED_INT_DOMAINS` (→ `[eq, ord]`). (`EQ_ONLY_DOMAINS` +is currently unused — `timestamptz` was promoted to the ordered shape once the ORE +comparator generalized to N blocks.) The pivot *sweep* is uniform across every ordered type (one canonical snapshot); the signed-only sign-boundary test (`SignedScalar`, `int`/`date`) lives outside `scalars::` in `encrypted_domain/signed.rs`, so a `text` instantiation of it is a compile error @@ -837,3 +845,62 @@ generated — it needs a separate SQL design beyond this ordered-scalar materializer. JSONB encrypted behaviour today lives on the composite `eql_v2_encrypted` type and its hand-written operator surface in `src/encrypted/` and `src/operators/`, not the scalar materializer. + +--- + +## 8. `bool` — the storage-only / encryption-only shape + +`bool` is the worked example of a **storage-only** (encryption-only) scalar: the +value is encrypted at rest and decrypted by the proxy, but is **never searchable +server-side**. It is the smallest shape — strictly below eq-only — because a +two-value column has so little cardinality that *any* searchable index (even +HMAC equality) would trivially leak the plaintext distribution. So `bool` +deliberately offers no search surface at all. + +What makes it storage-only: + +- **One term-less domain.** Its catalog row uses `STORAGE_ONLY_DOMAINS` — a + single `DomainSpec { suffix: "", terms: &[] }`. No `_eq`, no `_ord`, no SEM + index term. `ScalarSpec::is_storage_only()` recognises this shape (a single + term-less storage domain); it is *also* `is_eq_only()` (no `_ord`), so the + harness checks storage-only **first**. +- **Generator: no changes needed.** The SQL generator already handles a + zero-term, single-domain type — it emits exactly three files (`bool_types.sql`, + `bool_functions.sql`, `bool_operators.sql`; no `_aggregates.sql`, since no + ordered domain). All 44 functions are `plpgsql` blockers, all 44 operators back + onto them: every comparison/containment/path operator reachable through domain + fallback raises. The domain `CHECK` still pins `{v,i,c}` + `VALUE->>'v' = '2'`. +- **Kind, not term.** Add a `ScalarKind` variant (`Bool`) with + `rust_type() = "bool"`, `as_bounded_int() = None`, + `is_int`/`is_temporal`/`is_text` all false. Add a `Fixture::Bool(bool)` variant + and a `fixtures!(bool; …)` arm. No new `Term` — storage-only carries none. +- **Fixtures carry no index term.** The `Fixture` list is both boolean values; + the fixture is generated with **zero** indexes (`FixtureSpec::storage_only()`), + so the encrypted payload is `{v,i,c}` only — no `hm`/`ob`/`bf`. The + `scalar_fixture!(storage, …)` arm stamps this and asserts both values are + present and no index is declared. +- **Harness: hand-written `impl ScalarType`, NOT `OrderedScalar`.** The + proc-macro emits `impl ScalarType` only for integer kinds, so `bool` is + hand-written in `scalar_domains.rs` (`PG_TYPE = "bool"`, `fixture_values()` = + `[false, true]` from the catalog). It is deliberately **not** `OrderedScalar`, + `SignedScalar`, or `MatchScalar` — it has no comparison pivots, sign boundary, + or match capability, so any ordered/signed/match-bounded test instantiated for + `bool` is a compile error. +- **Matrix: `caps = [storage]`.** Because there are no comparison/index/order + categories to run, the `[storage]` arm does **not** expand + `scalar_domain_matrix!` (whose `+`-arity transcribers reject the empty + `eq_domains`/`pivots`/`index_combos`, and which the other seven types depend + on). Instead it invokes only the surface-agnostic leaf drivers directly: + sanity, blocker-raises (every comparison + containment op), payload-check, + path-op blockers, native-absent (`~~`/`~~*`), typed-column blockers, count, + aggregate-typecheck (asserts `min`/`max` are *rejected*), and fixture-shape. +- **Inventory: a fourth snapshot.** The storage-only test-name set is neither a + strip-filter subset of the ordered baseline nor a superset, so it is committed + directly as `tests/sqlx/snapshots/matrix_tests_storage_only.txt`, and the + `test:matrix:inventory` gate gains a fourth `cmp` branch + (`shape="storage_only"`). + +Everything else is the standard path: one catalog row, regenerate, commit the +`tests/codegen/reference/bool/` baseline (3 files), no edits to +`pin_search_path.sql` or `splinter.sh` (a storage-only type emits only blockers +— no extractors/wrappers/aggregates, so no new inline-critical names). diff --git a/mise.toml b/mise.toml index 09a484e5b..e2eea1c65 100644 --- a/mise.toml +++ b/mise.toml @@ -205,11 +205,11 @@ fi """ [tasks."test:matrix:inventory"] -description = "Verify the matrix test-name set against the canonical snapshot (its derived eq-only subset, or the committed text superset), catalog-cross-checked (no database required)" +description = "Verify the matrix test-name set against the canonical snapshot (its derived eq-only subset, the committed text superset, or the storage-only set), catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" run = """ #!/usr/bin/env bash -# Three committed, token-normalized snapshots. The canonical one +# Four committed, token-normalized snapshots. The canonical one # (snapshots/matrix_tests.txt) pins the set of macro-emitted matrix test names # for the ORDERED scalar shape. The second (snapshots/matrix_tests_eq_only.txt) # is the equality-only shape: an eq-only type's name set is exactly the ordered @@ -221,10 +221,15 @@ run = """ # (snapshots/matrix_tests_text.txt) is the TEXT shape: a SUPERSET of the ordered # baseline (every ordered arm PLUS the text-only `_search` / `_eqidx` / `_match` # arms). It is not derivable by a strip filter, so it is committed directly and -# pinned as a strict superset of the baseline. Each discovered type must then -# match the full baseline (ordered), that derived/pinned subset (eq-only), or the -# committed text superset. One baseline drives the ordered/eq-only shapes however -# many types exist. +# pinned as a strict superset of the baseline. The fourth +# (snapshots/matrix_tests_storage_only.txt) is the STORAGE-ONLY / encryption-only +# shape (e.g. `bool`): a single term-less domain with NO comparison/index/order +# tests — only the surface arms (sanity, blocker, payload-check, path-op, +# native-absent, typed-column, count, aggregate-typecheck, fixture-shape). It is +# neither a subset derivable by a strip filter nor a superset, so it is committed +# directly. Each discovered type must then match the full baseline (ordered), that +# derived/pinned subset (eq-only), the committed text superset, or the storage-only +# set. One baseline drives the ordered/eq-only shapes however many types exist. # # Steps: # 1. List the encrypted_domain binary ONCE (deterministic; reused below). @@ -233,8 +238,9 @@ run = """ # 3. Derive the eq-only subset from the ordered baseline and assert it equals # the committed snapshots/matrix_tests_eq_only.txt (pins the derivation). # 4. For each discovered type, normalize its token to and assert its set -# equals the canonical snapshot (ordered), the derived eq-only subset, OR -# the committed text superset. Assert at least one type is present. +# equals the canonical snapshot (ordered), the derived eq-only subset, the +# committed text superset, OR the storage-only set. Assert at least one type +# is present. # 5. Completeness cross-check: assert the discovered type set equals # `eql-codegen list-types`. A catalog type added without its matrix wiring # (no scalars:::: tests in the binary) fails here. @@ -247,6 +253,7 @@ set -euo pipefail test -f snapshots/matrix_tests.txt || { echo "snapshots/matrix_tests.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } test -f snapshots/matrix_tests_eq_only.txt || { echo "snapshots/matrix_tests_eq_only.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } test -f snapshots/matrix_tests_text.txt || { echo "snapshots/matrix_tests_text.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } +test -f snapshots/matrix_tests_storage_only.txt || { echo "snapshots/matrix_tests_storage_only.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') @@ -295,7 +302,9 @@ fi # Per-type normalize + compare: each type must match the full canonical snapshot # (ordered shape), the derived eq-only subset (equality-only shape), or the -# committed text superset (text shape). +# committed text superset (text shape), or the committed storage-only set +# (storage-only / encryption-only shape, e.g. `bool` — a single term-less +# domain with no comparison/index/order tests, only the surface arms). checked=0 while IFS= read -r t; do [ -n "$t" ] || continue @@ -307,14 +316,18 @@ while IFS= read -r t; do shape="eq_only" elif cmp -s "/tmp/matrix-norm-${t}.txt" snapshots/matrix_tests_text.txt; then shape="text" + elif cmp -s "/tmp/matrix-norm-${t}.txt" snapshots/matrix_tests_storage_only.txt; then + shape="storage_only" else - echo "Matrix test-name set for '${t}' matches NEITHER the canonical snapshot, its derived eq-only subset, nor the text shape." >&2 + echo "Matrix test-name set for '${t}' matches NONE of the known shapes (ordered, eq-only, text, storage-only)." >&2 echo " vs ordered (snapshots/matrix_tests.txt):" >&2 diff snapshots/matrix_tests.txt "/tmp/matrix-norm-${t}.txt" >&2 || true echo " vs derived eq-only (ordered minus _ord/order_by/routes_through_ob):" >&2 diff "$eq_only_expected" "/tmp/matrix-norm-${t}.txt" >&2 || true echo " vs text superset (snapshots/matrix_tests_text.txt):" >&2 diff snapshots/matrix_tests_text.txt "/tmp/matrix-norm-${t}.txt" >&2 || true + echo " vs storage-only (snapshots/matrix_tests_storage_only.txt):" >&2 + diff snapshots/matrix_tests_storage_only.txt "/tmp/matrix-norm-${t}.txt" >&2 || true exit 1 fi echo " ${t}: ${shape}" @@ -332,7 +345,7 @@ if [ "$discovered" != "$catalog" ]; then exit 1 fi -echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot, its derived eq-only subset, or the committed text superset; catalog reconciled." +echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot, its derived eq-only subset, the committed text superset, or the storage-only set; catalog reconciled." """ [tasks."test:matrix:inventory:jsonb_entry"] diff --git a/tests/codegen/reference/bool/bool_functions.sql b/tests/codegen/reference/bool/bool_functions.sql new file mode 100644 index 000000000..333801016 --- /dev/null +++ b/tests/codegen/reference/bool/bool_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bool/bool_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/bool/bool_functions.sql +--! @brief Functions for eql_v3.bool. + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.bool, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.bool, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.bool) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param selector text +--! @return eql_v3.bool +CREATE FUNCTION eql_v3."->"(a eql_v3.bool, selector text) +RETURNS eql_v3.bool IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param selector integer +--! @return eql_v3.bool +CREATE FUNCTION eql_v3."->"(a eql_v3.bool, selector integer) +RETURNS eql_v3.bool IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param selector eql_v3.bool +--! @return eql_v3.bool +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.bool) +RETURNS eql_v3.bool IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.bool, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.bool, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param selector eql_v3.bool +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.bool) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.bool, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.bool, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.bool, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.bool, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.bool, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.bool, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.bool, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.bool, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.bool, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.bool, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.bool, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b eql_v3.bool +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.bool, b eql_v3.bool) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a eql_v3.bool +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.bool, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.bool. +--! @param a jsonb +--! @param b eql_v3.bool +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.bool) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bool'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/bool/bool_operators.sql b/tests/codegen/reference/bool/bool_operators.sql new file mode 100644 index 000000000..22261de13 --- /dev/null +++ b/tests/codegen/reference/bool/bool_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bool/bool_types.sql +-- REQUIRE: src/v3/scalars/bool/bool_functions.sql + +--! @file encrypted_domain/bool/bool_operators.sql +--! @brief Operators for eql_v3.bool. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.bool, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.bool, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.bool, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.bool, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.bool, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.bool, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.bool, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.bool, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.bool, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.bool, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.bool, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.bool, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.bool, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.bool, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.bool, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.bool, RIGHTARG = eql_v3.bool +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.bool, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.bool +); diff --git a/tests/codegen/reference/bool/bool_types.sql b/tests/codegen/reference/bool/bool_types.sql new file mode 100644 index 000000000..a3ac3ff9f --- /dev/null +++ b/tests/codegen/reference/bool/bool_types.sql @@ -0,0 +1,25 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/bool/bool_types.sql +--! @brief Encrypted-domain types for bool. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.bool. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'bool' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.bool AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 5c8cf7a49..f94b26cfe 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -3,8 +3,9 @@ This directory holds the canonical committed snapshot, `matrix_tests.txt` — the token-normalized list of every `scalars::::*` test name in the `encrypted_domain` SQLx binary, with each type token replaced by the literal -`` — plus two shape variants derived from / committed alongside it -(`matrix_tests_eq_only.txt`, `matrix_tests_text.txt`; see below). They are +`` — plus three shape variants derived from / committed alongside it +(`matrix_tests_eq_only.txt`, `matrix_tests_text.txt`, +`matrix_tests_storage_only.txt`; see below). They are **committed test baselines**, not gitignored generated SQL — keep them in version control. @@ -49,6 +50,24 @@ cargo test --no-default-features --test encrypted_domain -- --list \ | sed -e 's/^scalars::text::/scalars::::/' -e 's/_text_/__/g' | LC_ALL=C sort > snapshots/matrix_tests_text.txt ``` +For the **storage-only / encryption-only** shape there is a fourth committed +snapshot, `matrix_tests_storage_only.txt`. A storage-only scalar +(`scalar_matrix! { caps = [storage] }`, e.g. `bool`) has a single term-less +domain and **no** comparison/index/order capability, so its name set is neither +a strip-filter subset of the ordered baseline nor a superset — it is the +storage-domain surface arms only (sanity, blocker-raises for every comparison + +containment op, payload-check, path-op, native-absent, typed-column, count, +aggregate-typecheck, fixture-shape). It is committed directly and each +storage-only type must match it exactly (after `` normalization). Regenerate +with: + +```bash +cd tests/sqlx +cargo test --no-default-features --test encrypted_domain -- --list \ + | sed -n 's/: test$//p' | grep '^scalars::bool::' \ + | sed -e 's/^scalars::bool::/scalars::::/' -e 's/_bool_/__/g' | LC_ALL=C sort > snapshots/matrix_tests_storage_only.txt +``` + The "no per-type variation" property is preserved by design: every ordered scalar sweeps the same three `OrderedScalar` pivots (`min`/`mid`/`max`), so the `_pivot_mid_*` arms are identical modulo token across `int`/`date`/`text`. The @@ -81,10 +100,11 @@ The task (`mise.toml`, `[tasks."test:matrix:inventory"]`): (the `scalars::::` prefixes) — never a directory glob. 3. Normalizes each type's token to `` and asserts that type's set equals the canonical `matrix_tests.txt` (ordered shape), the derived eq-only subset - (`matrix_tests.txt` minus `_ord`/`order_by`/`routes_through_ob`), or the - committed `matrix_tests_text.txt` superset (text shape). Prints each type's - resolved shape (`ordered` / `eq_only` / `text`). Asserts at least one type is - present. + (`matrix_tests.txt` minus `_ord`/`order_by`/`routes_through_ob`), the + committed `matrix_tests_text.txt` superset (text shape), or the committed + `matrix_tests_storage_only.txt` set (storage-only shape). Prints each type's + resolved shape (`ordered` / `eq_only` / `text` / `storage_only`). Asserts at + least one type is present. 4. **Completeness cross-check:** asserts the discovered type set equals `cargo run -p eql-codegen -- list-types` (the catalog is the single source). A catalog type added without its matrix wiring — no `scalars::::` tests in @@ -111,10 +131,11 @@ catalog cross-check) fails the job. - **Adding a new scalar type** → add the catalog row in `eql-scalars::CATALOG`, wire the SQLx matrix oracle (see `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3), then run - `mise run test:matrix:inventory`. No snapshot edit is needed: an ordered - (`caps = [eq, ord]`) type matches the canonical baseline, and an equality-only - (`caps = [eq]`) type matches the derived eq-only subset — both are checked - against this one file. The cross-check just confirms the type is wired. + `mise run test:matrix:inventory`. No snapshot edit is needed for an ordered + (`caps = [eq, ord]`) type (matches the canonical baseline) or an equality-only + (`caps = [eq]`) type (matches the derived eq-only subset). A **storage-only** + (`caps = [storage]`) type matches `matrix_tests_storage_only.txt`; if it is the + first such type, commit that snapshot. The cross-check confirms the type is wired. - **Removing a scalar type** → remove the catalog row and its matrix wiring; the cross-check then sees the type gone from both sides. - **Changing which matrix tests the macro emits** → regenerate and commit diff --git a/tests/sqlx/snapshots/matrix_tests_storage_only.txt b/tests/sqlx/snapshots/matrix_tests_storage_only.txt new file mode 100644 index 000000000..f95f6cff4 --- /dev/null +++ b/tests/sqlx/snapshots/matrix_tests_storage_only.txt @@ -0,0 +1,18 @@ +scalars::::matrix__fixture_shape +scalars::::matrix__storage_aggregate_typecheck_max +scalars::::matrix__storage_aggregate_typecheck_min +scalars::::matrix__storage_contained_by_blocker +scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_path_cast +scalars::::matrix__storage_count_typed_column +scalars::::matrix__storage_eq_blocker +scalars::::matrix__storage_gt_blocker +scalars::::matrix__storage_gte_blocker +scalars::::matrix__storage_lt_blocker +scalars::::matrix__storage_lte_blocker +scalars::::matrix__storage_native_absent_ops +scalars::::matrix__storage_neq_blocker +scalars::::matrix__storage_path_op_blockers +scalars::::matrix__storage_payload_check +scalars::::matrix__storage_sanity +scalars::::matrix__storage_typed_column_blocker diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index f447429b1..15d7bfc6a 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -61,6 +61,7 @@ impl PlaintextSqlType { pub const TEXT: PlaintextSqlType = PlaintextSqlType("text"); pub const JSONB: PlaintextSqlType = PlaintextSqlType("jsonb"); pub const NUMERIC: PlaintextSqlType = PlaintextSqlType("numeric"); + pub const BOOLEAN: PlaintextSqlType = PlaintextSqlType("boolean"); pub fn as_str(&self) -> &'static str { self.0 @@ -88,6 +89,7 @@ const fn cast_for_kind(kind: ScalarKind) -> Cast { ScalarKind::Timestamptz => Cast::TIMESTAMP, ScalarKind::Text => Cast::TEXT, ScalarKind::Numeric => Cast::DECIMAL, + ScalarKind::Bool => Cast::BOOLEAN, ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } @@ -106,6 +108,7 @@ const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { ScalarKind::Timestamptz => PlaintextSqlType::TIMESTAMPTZ, ScalarKind::Text => PlaintextSqlType::TEXT, ScalarKind::Numeric => PlaintextSqlType::NUMERIC, + ScalarKind::Bool => PlaintextSqlType::BOOLEAN, ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } @@ -122,6 +125,7 @@ mod sealed { impl Sealed for String {} impl Sealed for serde_json::Value {} impl Sealed for rust_decimal::Decimal {} + impl Sealed for bool {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -225,6 +229,14 @@ impl EqlPlaintext for rust_decimal::Decimal { } } +impl EqlPlaintext for bool { + const KIND: ScalarKind = ScalarKind::Bool; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::Boolean(Some(*self)) + } +} + #[cfg(test)] mod tests { use super::*; @@ -392,4 +404,31 @@ mod tests { other => panic!("expected Plaintext::Json(Some(_)), got {other:?}"), } } + + #[test] + fn bool_casts_to_boolean() { + assert_eq!(::CAST, Cast::BOOLEAN); + } + + #[test] + fn bool_plaintext_sql_type_is_boolean() { + assert_eq!( + ::PLAINTEXT_SQL_TYPE, + PlaintextSqlType::BOOLEAN + ); + } + + #[test] + fn bool_to_plaintext_wraps_in_boolean_variant() { + // A bool must lift into the Boolean variant so the fixture driver + // encrypts it under the `boolean` cast (storage-only — no index term). + match true.to_plaintext() { + Plaintext::Boolean(Some(value)) => assert!(value), + other => panic!("expected Plaintext::Boolean(Some(true)), got {other:?}"), + } + match false.to_plaintext() { + Plaintext::Boolean(Some(value)) => assert!(!value), + other => panic!("expected Plaintext::Boolean(Some(false)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index b84f0a0df..43f8594b1 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -13,9 +13,14 @@ /// Stamp out the `spec()` builder, the `fixture-gen` generator test, and the /// property-test module for a scalar fixture. /// -/// The leading **kind** discriminator (`int` / `temporal` / `text`) selects -/// which property asserts are stamped and which index set the fixture declares -/// — the rest of the expansion is identical: +/// The leading **kind** discriminator (`int` / `temporal` / `text` / `numeric` +/// / `storage`) selects which property asserts are stamped and which index set +/// the fixture declares — the rest of the expansion is identical: +/// +/// - `storage` — storage-only / encryption-only (`bool`): NO index, so the +/// payload is `{v,i,c}` with no term key. Asserts both values are present and +/// no index is declared (the type is not `OrderedScalar`, so there are no +/// comparison pivots to check). /// /// - `int` — signed-extreme asserts (`<$ty>::MIN`/`MAX`, `contains(&0)`, /// `any(|v| v < 0)`). These typecheck only for integer plaintexts. Indexes @@ -169,6 +174,58 @@ macro_rules! scalar_fixture { } }; + // Storage-only (encryption-only) scalars (`bool`): the value is encrypted + // with NO search index, so the payload is `{v,i,c}` with no term key. The + // fixture declares zero indexes (`.storage_only()`), and the property test + // asserts only that both values are present and no index is declared — there + // are no comparison pivots (the type is not `OrderedScalar`). + (storage, $name:literal, $ty:ty, $values:expr $(,)?) => { + /// The complete storage-only fixture definition. No `IndexKind` — the + /// encrypted payload carries only `{v,i,c}` (no `hm`/`ob`/`bf`). + pub fn spec() -> $crate::fixtures::FixtureSpec<'static, $ty> { + $crate::fixtures::FixtureSpec::new($name) + .storage_only() + .with_column_type("jsonb") + .with_values($values) + } + + /// The generator. Gated by `fixture-gen` so `cargo test` never compiles + /// it; `#[ignore]` is a second guard. Run via `mise run fixture:generate`. + #[cfg(feature = "fixture-gen")] + #[tokio::test] + #[ignore = "generator — run via `mise run fixture:generate`"] + async fn generate() -> anyhow::Result<()> { + spec().run().await + } + + #[cfg(test)] + mod tests { + use super::*; + + #[test] + fn spec_is_complete() { + assert!(spec().check_complete().is_ok()); + } + + #[test] + fn spec_declares_no_index() { + // Storage-only / encryption-only: the payload carries no search + // term, so the fixture must declare zero indexes. + assert!(spec().indexes().is_empty()); + } + + #[test] + fn spec_includes_both_boolean_values() { + // Low-cardinality but still both values, so the storage matrix + // can prove the domain accepts a real ciphertext for each. + let spec = spec(); + let values = spec.values(); + assert!(values.contains(&false), "spec must include false"); + assert!(values.contains(&true), "spec must include true"); + } + } + }; + // Shared expansion: the `spec()` builder + the gated generator test. The // trailing `[Unique, Ore, ...]` token list parametrizes the index set. (@common $name:literal, $ty:ty, $values:expr, [$($ix:ident),+ $(,)?]) => { diff --git a/tests/sqlx/src/fixtures/spec.rs b/tests/sqlx/src/fixtures/spec.rs index 5f9b952dd..0bb45ae4b 100644 --- a/tests/sqlx/src/fixtures/spec.rs +++ b/tests/sqlx/src/fixtures/spec.rs @@ -30,6 +30,11 @@ pub struct FixtureSpec<'a, T> { indexes: Vec, column_type: ColumnType, values: &'a [T], + /// True for a **storage-only / encryption-only** fixture (e.g. `bool`): the + /// value is encrypted with no search index, so the payload is `{v,i,c}` with + /// no `hm`/`ob`/`bf` term. Flips the `check_complete` index requirement — + /// such a fixture MUST declare zero indexes rather than at least one. + storage_only: bool, } impl<'a, T> FixtureSpec<'a, T> { @@ -49,6 +54,7 @@ impl<'a, T> FixtureSpec<'a, T> { indexes: Vec::new(), column_type, values: &[], + storage_only: false, } } @@ -59,6 +65,15 @@ impl<'a, T> FixtureSpec<'a, T> { self } + /// Mark this as a **storage-only / encryption-only** fixture: the value is + /// encrypted with no search index (the payload is `{v,i,c}`, no term keys). + /// Such a fixture MUST declare no indexes; `check_complete` enforces that + /// (and skips the usual "at least one index" requirement). Used by `bool`. + pub fn storage_only(mut self) -> Self { + self.storage_only = true; + self + } + /// Set the committed `payload` column SQL type. Defaults to `"jsonb"`. /// /// # Panics @@ -196,7 +211,18 @@ impl<'a, T> FixtureSpec<'a, T> { /// `FixtureIdentifier`/`ColumnType` newtypes; this method covers only what /// construction cannot. pub fn check_complete(&self) -> anyhow::Result<()> { - if self.indexes.is_empty() { + if self.storage_only { + // A storage-only (encryption-only) fixture intentionally has no + // search index; it MUST NOT declare one (that would put a term key + // in the payload, contradicting the storage-only contract). + if !self.indexes.is_empty() { + anyhow::bail!( + "storage-only fixture {:?} must declare no indexes, got {:?}", + self.name.as_str(), + self.indexes, + ); + } + } else if self.indexes.is_empty() { anyhow::bail!("fixture {:?} declares no indexes", self.name.as_str()); } if self.values.is_empty() { @@ -281,6 +307,30 @@ mod tests { assert!(s.check_complete().is_err()); } + #[test] + fn storage_only_spec_passes_with_no_indexes() { + // A storage-only (encryption-only) fixture legitimately declares zero + // indexes — the value is encrypted with no search term. + const V: &[bool] = &[false, true]; + let s = FixtureSpec::new("eql_v2_bool") + .storage_only() + .with_values(V); + assert!(s.indexes().is_empty()); + assert!(s.check_complete().is_ok()); + } + + #[test] + fn storage_only_spec_rejects_a_declared_index() { + // A storage-only fixture must NOT declare an index (that would add a + // term key to the payload, contradicting the storage-only contract). + const V: &[bool] = &[false, true]; + let s = FixtureSpec::new("eql_v2_bool") + .storage_only() + .with_index(IndexKind::Unique) + .with_values(V); + assert!(s.check_complete().is_err()); + } + #[test] fn working_schema_sql_drops_and_creates_the_working_table() { let sql = int4_spec().working_schema_sql(); diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 45a1bb027..ec0211064 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -358,6 +358,86 @@ macro_rules! scalar_matrix { match_domains = [], } }; + ( + suite = $suite:ident, + scalar = $scalar:ty, + eql_type = $eql_type:literal, + caps = [storage] $(,)? + ) => { + // Storage-only / encryption-only (`bool`): a single term-less + // `eql_v3.` domain, no `_eq`/`_ord`. The value is encrypted at rest + // and decrypted by the proxy, but NOTHING is searchable server-side. + // + // Rather than thread empty `eq_domains`/`ord_domains`/`pivots`/ + // `index_combos` through `scalar_domain_matrix!` (whose `+`-arity + // transcribers reject empty lists, and which would require relaxing the + // shared macro the other seven scalar types depend on), this arm invokes + // ONLY the leaf drivers that are meaningful without any comparison + // capability. The comparison/index/order/aggregate categories are + // deliberately NOT emitted — they have no storage-only analogue — so a + // storage-only type needs neither `OrderedScalar` nor comparison pivots. + // + // Emitted categories (all over the single storage domain): sanity, + // blocker-raises (every comparison + containment op raises), + // payload-check (envelope CHECK), path-op blockers, native-absent + // (`~~`/`~~*`), typed-column blockers, count, and fixture-shape. + $crate::__scalar_matrix_sanity! { + suite = $suite, scalar = $scalar, + domains = [(storage, Storage)], + } + $crate::__scalar_matrix_blocker_outer! { + suite = $suite, scalar = $scalar, + // The storage domain carries no term, so every comparison and + // containment operator routes to a blocker. This is the substantive + // proof for a storage-only type. + combos = [ + (storage, Storage, [ + (eq, "="), (neq, "<>"), + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + ], + } + $crate::__scalar_matrix_payload_check_outer! { + suite = $suite, scalar = $scalar, + domains = [(storage, Storage)], + } + $crate::__scalar_matrix_path_op_outer! { + suite = $suite, scalar = $scalar, + domains = [(storage, Storage)], + } + $crate::__scalar_matrix_native_absent_outer! { + suite = $suite, scalar = $scalar, + domains = [(storage, Storage)], + } + $crate::__scalar_matrix_typed_column_outer! { + suite = $suite, scalar = $scalar, + combos = [ + (storage, Storage, [ + (eq, "="), (neq, "<>"), + (lt, "<"), (lte, "<="), (gt, ">"), (gte, ">="), + (contains, "@>"), (contained_by, "<@"), + ]), + ], + } + $crate::__scalar_matrix_count_outer! { + suite = $suite, scalar = $scalar, + script = $eql_type, script_path = "../../../fixtures", + domains = [(storage, Storage)], + } + // Asserts `eql_v3.min/max(storage_domain)` is REJECTED (no aggregate on a + // term-less domain). The case branches at runtime on `supports_ord()`, + // which is false for storage — same coverage the other shapes emit for + // their own storage variant. + $crate::__scalar_matrix_aggregate_typecheck_outer! { + suite = $suite, scalar = $scalar, + domains = [(storage, Storage)], + } + $crate::__scalar_matrix_fixture_shape! { + suite = $suite, scalar = $scalar, + script = $eql_type, script_path = "../../../fixtures", + } + }; } /// Reduced behaviour matrix for a SteVec **entry** view type (e.g. @@ -1569,33 +1649,53 @@ macro_rules! __scalar_matrix_fixture_shape { anyhow::ensure!(plaintexts == expected, "plaintext column must match FIXTURE_VALUES in order"); - // The proxy emits `hm` + `ob` for every scalar's fixture, plus - // `bf` for scalars that declare a Bloom-bearing domain (only - // `text`, via `_match`/`_search`). `bf` is thus catalog-derived - // so a `text_search` fixture additionally asserts its bloom term. - let mut term_checks: Vec<(&str, &str)> = vec![ - ("hm string", "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'"), - ("ob array", "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'"), - ("c string", "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'"), - ]; - if $crate::scalar_domains::token_has_bloom_term(<$scalar as ScalarType>::PG_TYPE) { - term_checks.push( - ("bf array", "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'"), - ); - } - for (label, predicate) in term_checks { - let missing: i64 = sqlx::query_scalar(&format!( - "SELECT COUNT(*) FROM {table} WHERE {predicate}", + // A storage-only / encryption-only scalar (`bool`) is encrypted + // with NO search index, so its payload carries only `{v,i,c}` — + // no `hm`/`ob`/`bf` term. Every other scalar's proxy fixture + // carries `hm` + `ob`, plus `bf` for a Bloom-bearing domain + // (`text`, via `_match`/`_search`; catalog-derived). + if $crate::scalar_domains::token_is_storage_only(<$scalar as ScalarType>::PG_TYPE) { + // The ciphertext (`c`) must still be present. + let missing_c: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} \ + WHERE payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", )).fetch_one(&pool).await?; - anyhow::ensure!(missing == 0, - "every payload must carry a `{label}` term; missing = {missing}"); - } + anyhow::ensure!(missing_c == 0, + "every storage-only payload must carry a `c string` term; missing = {missing_c}"); + // And NO index term may be present — that is the storage-only + // contract (a term would be a searchable leak on a 2-value column). + for term in ["hm", "ob", "bf"] { + let present: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} WHERE payload ? '{term}'", + )).fetch_one(&pool).await?; + anyhow::ensure!(present == 0, + "storage-only payload must NOT carry a `{term}` term; present = {present}"); + } + } else { + let mut term_checks: Vec<(&str, &str)> = vec![ + ("hm string", "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'"), + ("ob array", "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'"), + ("c string", "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'"), + ]; + if $crate::scalar_domains::token_has_bloom_term(<$scalar as ScalarType>::PG_TYPE) { + term_checks.push( + ("bf array", "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'"), + ); + } + for (label, predicate) in term_checks { + let missing: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} WHERE {predicate}", + )).fetch_one(&pool).await?; + anyhow::ensure!(missing == 0, + "every payload must carry a `{label}` term; missing = {missing}"); + } - let distinct_hm: i64 = sqlx::query_scalar(&format!( - "SELECT COUNT(DISTINCT payload->>'hm') FROM {table}", - )).fetch_one(&pool).await?; - anyhow::ensure!(distinct_hm == n, - "{n} distinct values -> {n} distinct hm terms; got {distinct_hm}"); + let distinct_hm: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(DISTINCT payload->>'hm') FROM {table}", + )).fetch_one(&pool).await?; + anyhow::ensure!(distinct_hm == n, + "{n} distinct values -> {n} distinct hm terms; got {distinct_hm}"); + } let mismatched_version: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(*) FROM {table} \ diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 11d0ff15c..f11d5a6a5 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -567,6 +567,67 @@ mod numeric_value_guards { } } +// `bool` is hand-written (the proc-macro emits `impl ScalarType` only for the +// integer kinds). It is the **storage-only / encryption-only** scalar: a single +// term-less `eql_v3.bool` domain, no `_eq`/`_ord`, so it is deliberately NOT +// `OrderedScalar`/`SignedScalar`/`MatchScalar` — it has no comparison or match +// capability. The `caps = [storage]` matrix arm never references a pivot, so the +// absence of `OrderedScalar` is fine (and intentional). Values come from the +// catalog's two `Fixture::Bool` rows. + +/// Typed `bool` fixture values, built once from `bool`'s catalog row, in catalog +/// order (`[false, true]`). Public so the `eql_v2_bool` fixture module (emitted +/// by `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. +static BOOL_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock::new(|| { + eql_scalars::BOOL + .fixtures + .iter() + .map(|f| match f { + eql_scalars::Fixture::Bool(b) => *b, + other => panic!("non-bool fixture in bool catalog row: {other:?}"), + }) + .collect() +}); + +/// The `bool` fixture values, in catalog order. Public so the `eql_v2_bool` +/// fixture module can hand the slice to `scalar_fixture!`. +pub fn bool_values() -> &'static [bool] { + &BOOL_VALUES_CELL +} + +impl ScalarType for bool { + const PG_TYPE: &'static str = "bool"; + + fn fixture_values() -> &'static [Self] { + bool_values() + } + // `to_sql_literal` inherits the default (`value.to_string()` => `true`/`false`), + // which is a valid SQL boolean literal, so no override is needed. +} + +// `bool` is deliberately NOT `OrderedScalar` / `SignedScalar` / `MatchScalar`: +// it is encryption-only (no `_eq`/`_ord`/`_match` domain), so it has no +// comparison pivots, no sign boundary, and no bloom-match capability. Any +// instantiation of an ordered/signed/match-bounded test for `bool` is a compile +// error — exactly the guarantee we want for a storage-only scalar. + +#[cfg(test)] +mod bool_value_tests { + use super::*; + + /// The harness value list matches the catalog `BOOL.fixtures` and carries + /// both boolean values — the oracle cannot drift from the catalog the fixture + /// generator encrypts. + #[test] + fn bool_values_match_catalog_and_cover_both() { + assert_eq!(bool_values(), &[false, true]); + assert!(bool_values().contains(&false)); + assert!(bool_values().contains(&true)); + assert_eq!(::PG_TYPE, "bool"); + assert_eq!(::fixture_table_name(), "fixtures.eql_v2_bool"); + } +} + #[cfg(test)] mod text_value_tests { use super::*; @@ -886,6 +947,19 @@ pub fn token_has_bloom_term(token: &str) -> bool { .unwrap_or(false) } +/// True when scalar `token` is **storage-only / encryption-only** (a single +/// term-less domain, no `_eq`/`_ord`/`_match`) — e.g. `bool`. Catalog-derived +/// via `ScalarSpec::is_storage_only`. Such a type's fixture is encrypted with no +/// search index, so its payload carries only `{v,i,c}` (no `hm`/`ob`/`bf`); the +/// fixture-shape assertions branch on this. +pub fn token_is_storage_only(token: &str) -> bool { + CATALOG + .iter() + .find(|s| s.token == token) + .map(|s| s.is_storage_only()) + .unwrap_or(false) +} + /// SQL string-literal escaping for direct interpolation. pub fn sql_string_literal(value: &str) -> String { format!("'{}'", value.replace('\'', "''")) diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 926d363de..6b9f6b42d 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -58,6 +58,7 @@ macro_rules! scalar_types { timestamptz => chrono::DateTime, numeric => rust_decimal::Decimal, text => String, + bool => bool, } }; } From 9a11cfa567645b7ec4401537d8593f42dfe08d1d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 13:22:57 +1000 Subject: [PATCH 219/599] feat(eql-types): add `eql_v3.bool` domain inventory entry; rustfmt fixups - eql-types: add the `bool::Bool` storage-only domain type (payload `{v,i,c}`, no term keys) and register it last in `v3::all()`, so the catalog-parity gate (crates/eql-types/tests/catalog_parity.rs) mirrors `eql-scalars::CATALOG`. Commit the regenerated published artifacts: schema/v3/bool.json (required = v/i/c, additionalProperties false) and bindings/v3/Bool.ts. - rustfmt: wrap three over-width lines in the prior commit (spec.rs, eql-tests-macros, scalar_domains.rs) so `cargo fmt --check` passes. Verified: mise run test:crates (clippy -D warnings + fmt + workspace tests, incl. eql-types catalog parity) is green. --- crates/eql-scalars/src/spec.rs | 4 +- crates/eql-tests-macros/src/lib.rs | 16 +++++-- crates/eql-types/bindings/v3/Bool.ts | 22 +++++++++ crates/eql-types/schema/v3/bool.json | 69 ++++++++++++++++++++++++++++ crates/eql-types/src/v3/bool.rs | 50 ++++++++++++++++++++ crates/eql-types/src/v3/mod.rs | 2 + tests/sqlx/src/scalar_domains.rs | 5 +- 7 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 crates/eql-types/bindings/v3/Bool.ts create mode 100644 crates/eql-types/schema/v3/bool.json create mode 100644 crates/eql-types/src/v3/bool.rs diff --git a/crates/eql-scalars/src/spec.rs b/crates/eql-scalars/src/spec.rs index a3202bbbf..8d97dc453 100644 --- a/crates/eql-scalars/src/spec.rs +++ b/crates/eql-scalars/src/spec.rs @@ -37,7 +37,9 @@ impl ScalarSpec { /// `is_eq_only()` — a storage-only type is also `is_eq_only()` (no `_ord`), /// but has no `_eq` either. pub fn is_storage_only(&self) -> bool { - self.domains.len() == 1 && self.domains[0].suffix.is_empty() && self.domains[0].terms.is_empty() + self.domains.len() == 1 + && self.domains[0].suffix.is_empty() + && self.domains[0].terms.is_empty() } /// The domain on this scalar with the given `suffix`, or `None`. Centralizes diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 0a2ff8b7c..d2bb775bf 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -554,7 +554,9 @@ mod tests { fn ordered_entry_emits_scalar_matrix_with_eq_ord_caps() { let token: Ident = syn::parse_str("int4").unwrap(); let rust_type: Type = syn::parse_str("i32").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, false, false)); + let out = norm(&matrix_suite_for_entry( + &token, &rust_type, false, false, false, + )); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq , ord]")); assert!(out.contains("suite = int4")); @@ -567,7 +569,9 @@ mod tests { // ord_domains), never the ordered `caps = [eq, ord]` arm. let token: Ident = syn::parse_str("timestamptz").unwrap(); let rust_type: Type = syn::parse_str("chrono::DateTime").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, true, false)); + let out = norm(&matrix_suite_for_entry( + &token, &rust_type, false, true, false, + )); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq]")); assert!(!out.contains("caps = [eq , ord]")); @@ -581,7 +585,9 @@ mod tests { // domain through the matrix in addition to the ordered shape. let token: Ident = syn::parse_str("text").unwrap(); let rust_type: Type = syn::parse_str("String").unwrap(); - let out = norm(&matrix_suite_for_entry(&token, &rust_type, false, false, true)); + let out = norm(&matrix_suite_for_entry( + &token, &rust_type, false, false, true, + )); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq , ord , search]")); assert!(out.contains("suite = text")); @@ -609,7 +615,9 @@ mod tests { let token: Ident = syn::parse_str("bool").unwrap(); let rust_type: Type = syn::parse_str("bool").unwrap(); // (storage_only = true, eq_only = true) — true catalog state for bool. - let out = norm(&matrix_suite_for_entry(&token, &rust_type, true, true, false)); + let out = norm(&matrix_suite_for_entry( + &token, &rust_type, true, true, false, + )); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [storage]")); assert!(!out.contains("caps = [eq]")); diff --git a/crates/eql-types/bindings/v3/Bool.ts b/crates/eql-types/bindings/v3/Bool.ts new file mode 100644 index 000000000..06b4fdf35 --- /dev/null +++ b/crates/eql-types/bindings/v3/Bool.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.bool` — storage only / encryption-only; every operator is blocked. + */ +export type Bool = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/schema/v3/bool.json b/crates/eql-types/schema/v3/bool.json new file mode 100644 index 000000000..bcbad6546 --- /dev/null +++ b/crates/eql-types/schema/v3/bool.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/bool.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.bool` — storage only / encryption-only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Bool", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/src/v3/bool.rs b/crates/eql-types/src/v3/bool.rs new file mode 100644 index 000000000..0b2396a62 --- /dev/null +++ b/crates/eql-types/src/v3/bool.rs @@ -0,0 +1,50 @@ +//! The `bool` encrypted-domain family — the storage-only / encryption-only +//! scalar. +//! +//! | Rust type | SQL domain | Required keys | Operators | +//! |------------|----------------|---------------|---------------------| +//! | [`Bool`] | `eql_v3.bool` | `v` `i` `c` | none (storage only) | +//! +//! `bool` is the only **storage-only** scalar: it has no `_eq`/`_ord` domain +//! and carries no index term, so the value is encrypted at rest and decrypted +//! by the proxy but is never searchable server-side. A two-value column has so +//! little cardinality that any searchable index (even HMAC equality) would +//! trivially leak the plaintext distribution. The payload is `{v,i,c}` only — +//! no `hm`/`ob`/`bf` — and every operator on the domain is blocked. + +use schemars::{schema::RootSchema, schema_for}; + +use crate::v3::terms::Ciphertext; +use crate::v3::DomainType; +use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +/// `eql_v3.bool` — storage only / encryption-only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Bool { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl DomainType for Bool { + fn sql_domain_static() -> &'static str { + "eql_v3.bool" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Bool) + } +} diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 954a44715..79f4cb813 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -48,6 +48,7 @@ use std::marker::PhantomData; use schemars::{schema::RootSchema, schema_for, JsonSchema}; +pub mod bool; pub mod date; pub mod int2; pub mod int4; @@ -164,5 +165,6 @@ pub fn all() -> Vec> { Box::new(PhantomData::), Box::new(PhantomData::), Box::new(PhantomData::), + Box::new(PhantomData::), ] } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index f11d5a6a5..cbdaf19f1 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -624,7 +624,10 @@ mod bool_value_tests { assert!(bool_values().contains(&false)); assert!(bool_values().contains(&true)); assert_eq!(::PG_TYPE, "bool"); - assert_eq!(::fixture_table_name(), "fixtures.eql_v2_bool"); + assert_eq!( + ::fixture_table_name(), + "fixtures.eql_v2_bool" + ); } } From afd76927cb3bad815af9534e06e0f19a439c8f71 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 14:07:28 +1000 Subject: [PATCH 220/599] docs(changelog): fill in bool entry PR link (#295) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9a852d89..782324a9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) -- **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#NNN](https://github.com/cipherstash/encrypt-query-language/pull/NNN)) +- **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) ### Changed From fbf77b964003acc43e3a3868411f5f96c1c33343 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 15:51:17 +1000 Subject: [PATCH 221/599] ci(matrix): stub fixtures so no-creds inventory job compiles The Matrix coverage inventory job runs without CipherStash creds and without a fixture-generation step, but test:matrix:inventory compiles the encrypted_domain test binary, which include_str!s the gitignored, generated fixtures/eql_v2_.sql at compile time. Its sibling test:matrix:catalog-coverage already carried a DB-free stub preamble to satisfy those include_str!s; test:matrix:inventory (and :jsonb_entry) did not, and only passed via rust-cache hits. The bool / ordered timestamptz / numeric matrix changes invalidated that cache, forcing a recompile that failed: couldn't read fixtures/eql_v2_*.sql (os error 2). Extract the stub preamble into a shared, sourced helper (tasks/test/stub-fixtures.sh) and wire it into all three tasks that compile encrypted_domain on a bare worktree, so the two siblings can never drift again. Verified by moving all 8 generated fixtures aside and running test:matrix:inventory: stubs engage, the binary lists, all 8 types reconcile against their snapshots, and the trap cleans up. --- mise.toml | 52 +++++++++++-------------------- tasks/test/stub-fixtures.sh | 61 +++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 35 deletions(-) create mode 100644 tasks/test/stub-fixtures.sh diff --git a/mise.toml b/mise.toml index e2eea1c65..894c83058 100644 --- a/mise.toml +++ b/mise.toml @@ -255,7 +255,13 @@ test -f snapshots/matrix_tests_eq_only.txt || { echo "snapshots/matrix_tests_eq_ test -f snapshots/matrix_tests_text.txt || { echo "snapshots/matrix_tests_text.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } test -f snapshots/matrix_tests_storage_only.txt || { echo "snapshots/matrix_tests_storage_only.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } -listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') +# Compile the encrypted_domain binary and capture its `--list` output. On a +# bare / no-creds worktree (the matrix-coverage CI job, or a checkout that has +# not run test:sqlx:prep) the generated fixtures `include_str!`'d at compile +# time are absent, so the shared stub preamble creates empty stand-ins, lists, +# then removes them on exit. Sets `listing` (stripped of the `: test` suffix). +EQL_ROOT="{{config_root}}" +source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" # Types present in the binary, from scalars:::: prefixes. discovered=$(printf '%s\\n' "$listing" \ @@ -360,7 +366,10 @@ run = """ # pinned by this isolated snapshot (no catalog cross-check). No database needed. set -euo pipefail test -f snapshots/matrix_jsonb_entry_tests.txt || { echo "snapshots/matrix_jsonb_entry_tests.txt missing — regenerate." >&2; exit 1; } -listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') +# Stub-compile on a bare / no-creds worktree (see test:matrix:inventory). Sets +# `listing` (stripped). Harmless when real fixtures already exist. +EQL_ROOT="{{config_root}}" +source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" printf '%s\\n' "$listing" \ | grep '^jsonb_entry::.*jsonb_entry_int4' \ | sed -E 's/_int4_/__/' \ @@ -415,39 +424,12 @@ set -euo pipefail root="{{config_root}}" # --- DB-free stub preamble so --list can compile on a bare worktree ---------- -created_list=$(mktemp) -trap 'while IFS= read -r f; do [ -n "$f" ] && rm -f "$f"; done < "$created_list"; rm -f "$created_list"' EXIT - -err=$(mktemp) -i=0 -while :; do - if listing=$(cargo test --no-default-features --test encrypted_domain -- --list 2>"$err"); then - break - fi - # Missing include_str! targets are the *.sql paths in the compile errors - # (repo-root-relative, may contain `..`). Match path chars only (no backticks - # or apostrophes to wrestle through TOML). - missing=$(grep -oE "[A-Za-z0-9_./-]+\\.sql" "$err" | LC_ALL=C sort -u || true) - if [ -z "$missing" ]; then - echo "encrypted_domain failed to list for a non-fixture reason:" >&2 - cat "$err" >&2 - rm -f "$err"; exit 1 - fi - while IFS= read -r m; do - [ -n "$m" ] || continue - p="${root}/${m}" - if [ ! -e "$p" ]; then - mkdir -p "$(dirname "$p")" - : > "$p" - echo "$p" >> "$created_list" - fi - done <<< "$missing" - i=$((i + 1)) - [ "$i" -lt 12 ] || { echo "stub loop exceeded 12 iterations" >&2; cat "$err" >&2; rm -f "$err"; exit 1; } -done -rm -f "$err" -[ -n "$listing" ] || { echo "No tests listed from the encrypted_domain binary." >&2; exit 1; } -listing=$(printf '%s\\n' "$listing" | sed -n 's/: test$//p') +# Shared with test:matrix:inventory so the two siblings can never drift (a gap +# between them is exactly what broke CI: inventory compiled without stubs and +# failed the no-creds matrix-coverage job). Sets `listing` (stripped) and a +# cleanup trap that removes only the stubs it created. +EQL_ROOT="$root" +source "${root}/tasks/test/stub-fixtures.sh" # --- Catalog surface (overridable for testing via EQL_CATALOG_DUMP_FILE) ----- # The seam lets the fault-injection check (Step 3) run THIS exact loop against a diff --git a/tasks/test/stub-fixtures.sh b/tasks/test/stub-fixtures.sh new file mode 100644 index 000000000..b14068b20 --- /dev/null +++ b/tasks/test/stub-fixtures.sh @@ -0,0 +1,61 @@ +# shellcheck shell=bash +# DB-free stub preamble for the `encrypted_domain` test binary. +# +# `encrypted_domain` `include_str!`s its per-type fixtures (the gitignored, +# generated `tests/sqlx/fixtures/eql_v2_.sql`) at COMPILE time, so a bare +# worktree without CipherStash creds (the no-creds `matrix-coverage` / +# `macro-coverage` CI jobs, or any local checkout that hasn't run +# `mise run test:sqlx:prep`) cannot even compile it for `--list`. These +# inventory/coverage gates never RUN tests — they only need the binary to +# compile and emit its test-name list — so empty stub files satisfy +# `include_str!` perfectly. +# +# SOURCE this (don't execute it): it must set its cleanup trap and export the +# `listing` variable into the caller's shell. It creates only the files rustc +# reports missing (one error pass lists them all) and removes exactly those on +# exit, leaving any real generated fixtures untouched. +# +# Inputs (set before sourcing): +# EQL_ROOT - repo root (mise `{{config_root}}`). Falls back to two levels up +# from the task's `tests/sqlx` working directory. +# Output: +# listing - the binary's `--list` output, stripped of the `: test` suffix. +# +# Bash 3.2 compatible (macOS): no mapfile/arrays; created stubs are tracked in a +# temp file. Keep this in lockstep with `tasks/test/sqlx-archive.sh` / +# `test:sqlx:prep`, which produce the REAL fixtures for the jobs that run tests. + +__eql_stub_root="${EQL_ROOT:-$(cd ../.. && pwd)}" + +__eql_stub_created=$(mktemp) +trap 'while IFS= read -r f; do [ -n "$f" ] && rm -f "$f"; done < "$__eql_stub_created"; rm -f "$__eql_stub_created"' EXIT + +__eql_stub_err=$(mktemp) +__eql_stub_i=0 +while :; do + if listing=$(cargo test --no-default-features --test encrypted_domain -- --list 2>"$__eql_stub_err"); then + break + fi + # Missing include_str! targets are the *.sql paths in the compile errors + # (repo-root-relative, may contain `..`). Match path chars only. + __eql_stub_missing=$(grep -oE "[A-Za-z0-9_./-]+\.sql" "$__eql_stub_err" | LC_ALL=C sort -u || true) + if [ -z "$__eql_stub_missing" ]; then + echo "encrypted_domain failed to list for a non-fixture reason:" >&2 + cat "$__eql_stub_err" >&2 + rm -f "$__eql_stub_err"; exit 1 + fi + while IFS= read -r __eql_stub_m; do + [ -n "$__eql_stub_m" ] || continue + __eql_stub_p="${__eql_stub_root}/${__eql_stub_m}" + if [ ! -e "$__eql_stub_p" ]; then + mkdir -p "$(dirname "$__eql_stub_p")" + : > "$__eql_stub_p" + echo "$__eql_stub_p" >> "$__eql_stub_created" + fi + done <<< "$__eql_stub_missing" + __eql_stub_i=$((__eql_stub_i + 1)) + [ "$__eql_stub_i" -lt 12 ] || { echo "stub loop exceeded 12 iterations" >&2; cat "$__eql_stub_err" >&2; rm -f "$__eql_stub_err"; exit 1; } +done +rm -f "$__eql_stub_err" +[ -n "$listing" ] || { echo "No tests listed from the encrypted_domain binary." >&2; exit 1; } +listing=$(printf '%s\n' "$listing" | sed -n 's/: test$//p') From ae053d4c1773d2a012111998375393ad80bfa929 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 16:22:02 +1000 Subject: [PATCH 222/599] ci(matrix): derive fixture stubs from the catalog, not rustc errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Approach A: replace the stub preamble's compile-error-parsing discovery loop (regex over rustc output, 12-iteration retry cap) with a deterministic list from `eql-codegen list-types` — the catalog is the source of truth, so one empty `eql_v2_.sql` per scalar token is stubbed up front. A new scalar is covered automatically; any non-token include_str! target instead fails `--list` with rustc's own clear 'couldn't read ' error rather than looping silently. Verified on a bare worktree (all 8 generated fixtures moved aside): stubs engage, the binary lists, all 8 types reconcile against their snapshots, and the trap leaves 0 leftover stubs. Follow-up to eliminate stubbing entirely tracked in #298. --- tasks/test/stub-fixtures.sh | 79 +++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/tasks/test/stub-fixtures.sh b/tasks/test/stub-fixtures.sh index b14068b20..d5a784465 100644 --- a/tasks/test/stub-fixtures.sh +++ b/tasks/test/stub-fixtures.sh @@ -1,19 +1,26 @@ # shellcheck shell=bash -# DB-free stub preamble for the `encrypted_domain` test binary. +# Catalog-driven stub preamble for the `encrypted_domain` test binary. # # `encrypted_domain` `include_str!`s its per-type fixtures (the gitignored, # generated `tests/sqlx/fixtures/eql_v2_.sql`) at COMPILE time, so a bare -# worktree without CipherStash creds (the no-creds `matrix-coverage` / -# `macro-coverage` CI jobs, or any local checkout that hasn't run -# `mise run test:sqlx:prep`) cannot even compile it for `--list`. These -# inventory/coverage gates never RUN tests — they only need the binary to -# compile and emit its test-name list — so empty stub files satisfy +# worktree without CipherStash creds (the no-creds matrix-coverage CI job, or a +# checkout that has not run `mise run test:sqlx:prep`) cannot compile it for +# `--list`. These inventory/coverage gates never RUN tests — they only need the +# binary to compile and emit its test-name list — so empty stub files satisfy # `include_str!` perfectly. # # SOURCE this (don't execute it): it must set its cleanup trap and export the -# `listing` variable into the caller's shell. It creates only the files rustc -# reports missing (one error pass lists them all) and removes exactly those on -# exit, leaving any real generated fixtures untouched. +# `listing` variable into the caller's shell. +# +# The fixture set is derived from the CATALOG (`eql-codegen list-types`) — the +# single source of truth — one stub per scalar token, `eql_v2_.sql`. This +# deliberately replaces an earlier preamble that discovered the set by parsing +# missing `.sql` paths out of rustc's compile errors and retried in a loop: that +# was brittle (coupled to rustc's error wording, capped at 12 iterations, silent +# if the format changed). A new scalar in the catalog is stubbed automatically; +# if some NEW compile-time `include_str!` target ever appears that is *not* +# `eql_v2_.sql`, the `--list` below fails with rustc's own clear +# "couldn't read " error — add that file's stub here. # # Inputs (set before sourcing): # EQL_ROOT - repo root (mise `{{config_root}}`). Falls back to two levels up @@ -21,41 +28,35 @@ # Output: # listing - the binary's `--list` output, stripped of the `: test` suffix. # -# Bash 3.2 compatible (macOS): no mapfile/arrays; created stubs are tracked in a -# temp file. Keep this in lockstep with `tasks/test/sqlx-archive.sh` / -# `test:sqlx:prep`, which produce the REAL fixtures for the jobs that run tests. +# Bash 3.2 compatible (macOS): created stubs are tracked in a temp file. Keep in +# step with `tasks/test/sqlx-archive.sh` / `test:sqlx:prep`, which produce the +# REAL fixtures for the jobs that actually run tests. __eql_stub_root="${EQL_ROOT:-$(cd ../.. && pwd)}" +__eql_stub_dir="${__eql_stub_root}/tests/sqlx/fixtures" __eql_stub_created=$(mktemp) trap 'while IFS= read -r f; do [ -n "$f" ] && rm -f "$f"; done < "$__eql_stub_created"; rm -f "$__eql_stub_created"' EXIT -__eql_stub_err=$(mktemp) -__eql_stub_i=0 -while :; do - if listing=$(cargo test --no-default-features --test encrypted_domain -- --list 2>"$__eql_stub_err"); then - break - fi - # Missing include_str! targets are the *.sql paths in the compile errors - # (repo-root-relative, may contain `..`). Match path chars only. - __eql_stub_missing=$(grep -oE "[A-Za-z0-9_./-]+\.sql" "$__eql_stub_err" | LC_ALL=C sort -u || true) - if [ -z "$__eql_stub_missing" ]; then - echo "encrypted_domain failed to list for a non-fixture reason:" >&2 - cat "$__eql_stub_err" >&2 - rm -f "$__eql_stub_err"; exit 1 +# Catalog scalar tokens (the source of truth). A failure here aborts under the +# caller's `set -e` with cargo's own error — no silent fallback. +__eql_stub_tokens=$(cd "$__eql_stub_root" && cargo run -q -p eql-codegen -- list-types) + +# One empty stub per token, created only when absent — real generated fixtures +# are never in the created list, so the trap leaves them untouched. +mkdir -p "$__eql_stub_dir" +while IFS= read -r __eql_stub_t; do + [ -n "$__eql_stub_t" ] || continue + __eql_stub_f="${__eql_stub_dir}/eql_v2_${__eql_stub_t}.sql" + if [ ! -e "$__eql_stub_f" ]; then + : > "$__eql_stub_f" + echo "$__eql_stub_f" >> "$__eql_stub_created" fi - while IFS= read -r __eql_stub_m; do - [ -n "$__eql_stub_m" ] || continue - __eql_stub_p="${__eql_stub_root}/${__eql_stub_m}" - if [ ! -e "$__eql_stub_p" ]; then - mkdir -p "$(dirname "$__eql_stub_p")" - : > "$__eql_stub_p" - echo "$__eql_stub_p" >> "$__eql_stub_created" - fi - done <<< "$__eql_stub_missing" - __eql_stub_i=$((__eql_stub_i + 1)) - [ "$__eql_stub_i" -lt 12 ] || { echo "stub loop exceeded 12 iterations" >&2; cat "$__eql_stub_err" >&2; rm -f "$__eql_stub_err"; exit 1; } -done -rm -f "$__eql_stub_err" +done <" error (see header). Sets `listing` (stripped). +listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') [ -n "$listing" ] || { echo "No tests listed from the encrypted_domain binary." >&2; exit 1; } -listing=$(printf '%s\n' "$listing" | sed -n 's/: test$//p') From 54e781b22e2277fc5cb2961b7676d4f63da29d24 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 17:35:49 +1000 Subject: [PATCH 223/599] ci(matrix): stub the complete generated fixture set, not just catalog tokens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Approach A stubbed only eql_v2_.sql (from list-types), but the no-creds inventory binaries also include_str! generated fixtures that are NOT catalog tokens: encrypted_domain embeds v3_doc_int4.sql (jsonb_entry matrix) and the v3_jsonb_* binaries embed v3_ste_vec.sql. Those failed to compile in the matrix-coverage job (and test:v3-jsonb:inventory had no stub preamble at all — latently broken, just never reached before). Derive the full set from both sources of truth: catalog tokens (list-types) for the eql_v2* glob, plus the literal v3_*.sql entries read from .gitignore for the non-catalog generated fixtures. Helper now only creates stubs + sets the cleanup trap; each task lists its own binary. Wire it into test:v3-jsonb:inventory too. Verified on a bare worktree (entire generated set moved aside): all four no-creds tasks (inventory, jsonb_entry, v3-jsonb, catalog-coverage) pass, 0 leftover stubs. Follow-up to drop stubbing entirely: #298. --- mise.toml | 34 +++++++++------ tasks/test/stub-fixtures.sh | 86 ++++++++++++++++++++++--------------- 2 files changed, 73 insertions(+), 47 deletions(-) diff --git a/mise.toml b/mise.toml index 894c83058..6eb811e99 100644 --- a/mise.toml +++ b/mise.toml @@ -255,13 +255,13 @@ test -f snapshots/matrix_tests_eq_only.txt || { echo "snapshots/matrix_tests_eq_ test -f snapshots/matrix_tests_text.txt || { echo "snapshots/matrix_tests_text.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } test -f snapshots/matrix_tests_storage_only.txt || { echo "snapshots/matrix_tests_storage_only.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } -# Compile the encrypted_domain binary and capture its `--list` output. On a -# bare / no-creds worktree (the matrix-coverage CI job, or a checkout that has -# not run test:sqlx:prep) the generated fixtures `include_str!`'d at compile -# time are absent, so the shared stub preamble creates empty stand-ins, lists, -# then removes them on exit. Sets `listing` (stripped of the `: test` suffix). +# On a bare / no-creds worktree (the matrix-coverage CI job, or a checkout that +# has not run test:sqlx:prep) the generated fixtures `include_str!`'d at compile +# time are absent. The shared stub preamble creates empty stand-ins for the whole +# generated set and removes them on exit; we then compile + list the binary. EQL_ROOT="{{config_root}}" source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" +listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') # Types present in the binary, from scalars:::: prefixes. discovered=$(printf '%s\\n' "$listing" \ @@ -366,10 +366,11 @@ run = """ # pinned by this isolated snapshot (no catalog cross-check). No database needed. set -euo pipefail test -f snapshots/matrix_jsonb_entry_tests.txt || { echo "snapshots/matrix_jsonb_entry_tests.txt missing — regenerate." >&2; exit 1; } -# Stub-compile on a bare / no-creds worktree (see test:matrix:inventory). Sets -# `listing` (stripped). Harmless when real fixtures already exist. +# Stub the generated fixtures on a bare / no-creds worktree (see +# test:matrix:inventory), then compile + list. Harmless when real fixtures exist. EQL_ROOT="{{config_root}}" source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" +listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') printf '%s\\n' "$listing" \ | grep '^jsonb_entry::.*jsonb_entry_int4' \ | sed -E 's/_int4_/__/' \ @@ -391,14 +392,20 @@ set -euo pipefail test -f snapshots/v3_jsonb_tests.txt || { echo "snapshots/v3_jsonb_tests.txt missing — regenerate and commit it." >&2; exit 1; } -tmp=$(mktemp) -trap 'rm -f "$tmp"' EXIT +# The v3_jsonb_* binaries `include_str!` generated fixtures (e.g. v3_ste_vec.sql) +# at compile time, so on a bare / no-creds worktree they cannot compile to +# --list. The shared stub preamble creates empty stand-ins for the whole +# generated set and removes them on exit (its EXIT trap is the only one here). +EQL_ROOT="{{config_root}}" +source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" +tmp=$(mktemp) cargo test --test v3_jsonb_tests --test v3_jsonb_operator_surface_tests -- --list \ | sed -n 's/: test$//p' \ | LC_ALL=C sort > "$tmp" diff -u snapshots/v3_jsonb_tests.txt "$tmp" +rm -f "$tmp" echo "v3 jsonb inventory OK" """ @@ -424,12 +431,13 @@ set -euo pipefail root="{{config_root}}" # --- DB-free stub preamble so --list can compile on a bare worktree ---------- -# Shared with test:matrix:inventory so the two siblings can never drift (a gap -# between them is exactly what broke CI: inventory compiled without stubs and -# failed the no-creds matrix-coverage job). Sets `listing` (stripped) and a -# cleanup trap that removes only the stubs it created. +# Shared with test:matrix:inventory so the no-creds tasks can never drift (a gap +# between them is exactly what broke CI). The helper stubs the whole generated +# fixture set + sets a cleanup trap; we then compile + list (stripped). EQL_ROOT="$root" source "${root}/tasks/test/stub-fixtures.sh" +listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') +[ -n "$listing" ] || { echo "No tests listed from the encrypted_domain binary." >&2; exit 1; } # --- Catalog surface (overridable for testing via EQL_CATALOG_DUMP_FILE) ----- # The seam lets the fault-injection check (Step 3) run THIS exact loop against a diff --git a/tasks/test/stub-fixtures.sh b/tasks/test/stub-fixtures.sh index d5a784465..18d9c219c 100644 --- a/tasks/test/stub-fixtures.sh +++ b/tasks/test/stub-fixtures.sh @@ -1,32 +1,36 @@ # shellcheck shell=bash -# Catalog-driven stub preamble for the `encrypted_domain` test binary. +# Catalog/.gitignore-driven stub preamble for the no-creds SQLx inventory gates. # -# `encrypted_domain` `include_str!`s its per-type fixtures (the gitignored, -# generated `tests/sqlx/fixtures/eql_v2_.sql`) at COMPILE time, so a bare -# worktree without CipherStash creds (the no-creds matrix-coverage CI job, or a -# checkout that has not run `mise run test:sqlx:prep`) cannot compile it for -# `--list`. These inventory/coverage gates never RUN tests — they only need the -# binary to compile and emit its test-name list — so empty stub files satisfy -# `include_str!` perfectly. +# The inventory/coverage tasks compile a test binary just to `--list` its test +# names; they never RUN a test. But those binaries `include_str!` the gitignored, +# creds-generated fixtures at COMPILE time, so a bare worktree without CipherStash +# creds (the no-creds matrix-coverage CI job, or a checkout that has not run +# `mise run test:sqlx:prep`) cannot even compile them. Empty stub files satisfy +# `include_str!` perfectly for a `--list`. # -# SOURCE this (don't execute it): it must set its cleanup trap and export the -# `listing` variable into the caller's shell. +# SOURCE this (don't execute it): it sets the cleanup trap in the caller's shell. +# It only CREATES the stubs — each task lists its own binary afterwards. It +# stubs the COMPLETE generated-fixture set (cheap, harmless extras are fine), +# so one helper serves every no-creds task regardless of which binary it lists. # -# The fixture set is derived from the CATALOG (`eql-codegen list-types`) — the -# single source of truth — one stub per scalar token, `eql_v2_.sql`. This -# deliberately replaces an earlier preamble that discovered the set by parsing -# missing `.sql` paths out of rustc's compile errors and retried in a loop: that -# was brittle (coupled to rustc's error wording, capped at 12 iterations, silent -# if the format changed). A new scalar in the catalog is stubbed automatically; -# if some NEW compile-time `include_str!` target ever appears that is *not* -# `eql_v2_.sql`, the `--list` below fails with rustc's own clear -# "couldn't read " error — add that file's stub here. +# The set is derived from the two sources of truth, not from parsing rustc +# errors (an earlier preamble looped over compile-error text — brittle, coupled +# to rustc's wording, capped at 12 retries): +# 1. Catalog scalar tokens (`eql-codegen list-types`) -> `eql_v2_.sql`, +# covering the `tests/sqlx/fixtures/eql_v2*` .gitignore glob. A new scalar +# is stubbed automatically. +# 2. The literal `tests/sqlx/fixtures/*.sql` entries in `.gitignore` (the +# non-catalog generated fixtures: `v3_ste_vec`, `v3_doc_int4`, +# `v3_numeric_collision`). A newly-generated fixture is stubbed +# automatically once it is gitignored (which it must be — never committed). +# +# If a NEW compile-time `include_str!` target ever appears that is neither, the +# task's own `--list` fails with rustc's clear "couldn't read " error — +# gitignore the new fixture (you must) and it is covered. # # Inputs (set before sourcing): # EQL_ROOT - repo root (mise `{{config_root}}`). Falls back to two levels up # from the task's `tests/sqlx` working directory. -# Output: -# listing - the binary's `--list` output, stripped of the `: test` suffix. # # Bash 3.2 compatible (macOS): created stubs are tracked in a temp file. Keep in # step with `tasks/test/sqlx-archive.sh` / `test:sqlx:prep`, which produce the @@ -38,25 +42,39 @@ __eql_stub_dir="${__eql_stub_root}/tests/sqlx/fixtures" __eql_stub_created=$(mktemp) trap 'while IFS= read -r f; do [ -n "$f" ] && rm -f "$f"; done < "$__eql_stub_created"; rm -f "$__eql_stub_created"' EXIT -# Catalog scalar tokens (the source of truth). A failure here aborts under the -# caller's `set -e` with cargo's own error — no silent fallback. +# (1) Catalog scalar tokens -> eql_v2_.sql. A failure here aborts under +# the caller's `set -e` with cargo's own error — no silent fallback. +__eql_stub_paths="" __eql_stub_tokens=$(cd "$__eql_stub_root" && cargo run -q -p eql-codegen -- list-types) - -# One empty stub per token, created only when absent — real generated fixtures -# are never in the created list, so the trap leaves them untouched. -mkdir -p "$__eql_stub_dir" while IFS= read -r __eql_stub_t; do [ -n "$__eql_stub_t" ] || continue - __eql_stub_f="${__eql_stub_dir}/eql_v2_${__eql_stub_t}.sql" + __eql_stub_paths="${__eql_stub_paths}${__eql_stub_dir}/eql_v2_${__eql_stub_t}.sql +" +done </dev/null || true) +while IFS= read -r __eql_stub_rel; do + [ -n "$__eql_stub_rel" ] || continue + __eql_stub_paths="${__eql_stub_paths}${__eql_stub_root}/${__eql_stub_rel} +" +done < "$__eql_stub_f" echo "$__eql_stub_f" >> "$__eql_stub_created" fi done <" error (see header). Sets `listing` (stripped). -listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') -[ -n "$listing" ] || { echo "No tests listed from the encrypted_domain binary." >&2; exit 1; } From bcdf61004b1fe2add7ea635a21394835f88d5d24 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 19:37:14 +1000 Subject: [PATCH 224/599] fix(ci): portable doxygen detection so docs:generate runs on Linux tasks/docs/generate.sh guarded on `which -s doxygen`, but `-s` (silent) is a BSD/macOS `which` extension unsupported by Ubuntu's `which`. On the Blacksmith ubuntu-2204 runner the check returned non-zero even though doxygen 1.9.1 was installed, so docs:generate exited early with 'doxygen not installed' and produced no XML/HTML. The workflow default shell is `bash {0}` (no -e), so that failure was masked by the trailing docs:generate:markdown command and only surfaced later as a misleading 'docs/api/html/index.html not found' in docs:package. - Detect doxygen with POSIX `command -v` (works on macOS and Linux). - Add `set -euo pipefail` to the Generate documentation step so a docs:generate failure can't be silently masked again. --- .github/workflows/release-eql.yml | 5 +++++ tasks/docs/generate.sh | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml index f979890bf..03532aba7 100644 --- a/.github/workflows/release-eql.yml +++ b/.github/workflows/release-eql.yml @@ -116,6 +116,11 @@ jobs: - name: Generate documentation run: | + # Fail fast: the workflow default shell is `bash {0}` (no -e), so + # without this a failure in docs:generate would be masked by the + # trailing docs:generate:markdown command and only surface later as a + # misleading "html not found" in docs:package. + set -euo pipefail mise run docs:generate mise run docs:generate:markdown -- ${{ github.event.release.tag_name }} diff --git a/tasks/docs/generate.sh b/tasks/docs/generate.sh index 033bdc205..6b41a5009 100755 --- a/tasks/docs/generate.sh +++ b/tasks/docs/generate.sh @@ -5,7 +5,10 @@ set -e -if ! which -s doxygen; then +# Use `command -v` (POSIX) rather than `which -s`: the `-s` (silent) flag is a +# BSD/macOS `which` extension and is unsupported by Ubuntu's `which`, so on the +# Linux CI runners the old check failed even when doxygen was installed. +if ! command -v doxygen >/dev/null 2>&1; then echo "error: doxygen not installed" exit 2 fi From 492c2fe15f1918370634d989fadb5e5f4a4694dd Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:02:28 +1000 Subject: [PATCH 225/599] test(v3): add proptest dep + proptest-live feature for property tests (CIP-3141) --- crates/eql-scalars/Cargo.toml | 8 ++++++++ mise.toml | 2 +- tests/sqlx/Cargo.toml | 10 +++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/crates/eql-scalars/Cargo.toml b/crates/eql-scalars/Cargo.toml index ca9e5341e..45a691af0 100644 --- a/crates/eql-scalars/Cargo.toml +++ b/crates/eql-scalars/Cargo.toml @@ -11,3 +11,11 @@ description = "Scalar/term catalog for EQL encrypted-domain codegen (std-only, n [lints] workspace = true + +# Dev-only. proptest is NOT a runtime dependency: it never compiles on the SQL +# build path (eql-codegen depends on eql-scalars' lib, not its tests), so the +# "INTENTIONALLY no dependencies" rule above — which is about build-path deps — +# is preserved. Used by src/proptest_invariants.rs (Tier C catalog property +# tests, no DB, runs in the lean `mise run test:crates` / fork CI path). +[dev-dependencies] +proptest = "1" diff --git a/mise.toml b/mise.toml index 6eb811e99..e74af6a08 100644 --- a/mise.toml +++ b/mise.toml @@ -86,7 +86,7 @@ depends = ["test:sqlx:prep"] dir = "{{config_root}}/tests/sqlx" run = """ echo "Running Rust tests..." -cargo test +cargo test --features proptest-live """ [tasks."test:sqlx:watch"] diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index a142233cc..68121eae7 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -26,7 +26,7 @@ eql-scalars = { path = "../../crates/eql-scalars" } eql-tests-macros = { path = "../../crates/eql-tests-macros" } [dev-dependencies] -# None needed - tests live in this crate +proptest = "1" [lints] workspace = true @@ -45,6 +45,14 @@ bench = [] # *usable*. Off by default to keep `mise run test` fast; CI runs with # `--features scale`. scale = [] +# Opt-in to the live-encryption property tests (Tier B, CIP-3141). They +# generate fresh random plaintexts each run and encrypt them via +# cipherstash-client, so they need the same CS_* creds as fixture generation. +# `mise run test:sqlx` enables this (CI has the secrets). A bare `cargo test` +# without it compiles the live tier out, so credential-less quick runs and the +# lean crate path are unaffected. Tier A (fixture-corpus) and Tier C (catalog) +# are NOT gated — they need no fresh encryption. +proptest-live = [] # Opt-in to compiling the fixture generators. Without this feature the # `#[cfg(feature = "fixture-gen")]` generator tests do not exist, so # `cargo test` and CI never see them. Generators need a live Postgres and, From 58109130214540c849ee3dd95c9ee44803a9611e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:04:17 +1000 Subject: [PATCH 226/599] test(v3): Tier C catalog-invariant property tests (CIP-3141) --- crates/eql-scalars/src/lib.rs | 3 + crates/eql-scalars/src/proptest_invariants.rs | 126 ++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 crates/eql-scalars/src/proptest_invariants.rs diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 40bfef216..c48d77b1e 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -577,3 +577,6 @@ text_values!(TEXT_VALUES, TEXT); #[cfg(test)] mod tests; + +#[cfg(test)] +mod proptest_invariants; diff --git a/crates/eql-scalars/src/proptest_invariants.rs b/crates/eql-scalars/src/proptest_invariants.rs new file mode 100644 index 000000000..394487236 --- /dev/null +++ b/crates/eql-scalars/src/proptest_invariants.rs @@ -0,0 +1,126 @@ +//! Property-based invariants over the scalar/term catalog (CIP-3141, Tier C). +//! +//! Pure Rust — no database, no encryption, no creds. These run in the lean +//! `cargo test -p eql-scalars` path (fork CI). They assert the *catalog* is +//! internally consistent for any generated input; the DB-backed oracle tiers +//! (A/B) live in `tests/sqlx`. + +use crate::{ScalarKind, Term, CATALOG}; +use proptest::prelude::*; + +/// Strategy over the three index terms. +fn any_term() -> impl Strategy { + prop_oneof![Just(Term::Hm), Just(Term::Ore), Just(Term::Bloom)] +} + +/// Strategy over the eight scalar kinds. +fn any_kind() -> impl Strategy { + prop_oneof![ + Just(ScalarKind::I16), + Just(ScalarKind::I32), + Just(ScalarKind::I64), + Just(ScalarKind::Numeric), + Just(ScalarKind::Text), + Just(ScalarKind::Jsonb), + Just(ScalarKind::Date), + Just(ScalarKind::Timestamptz), + ] +} + +proptest! { + /// `Ore` (ordering) supports a strict superset of `Hm` (equality): + /// every operator Hm provides, Ore also provides. + #[test] + fn ore_operators_superset_of_hm(_ in any::<()>()) { + for op in Term::Hm.operators() { + prop_assert!( + Term::Ore.operators().contains(op), + "Ore must support every Hm operator; missing {op}" + ); + } + } + + /// `operators_for_terms` is order-preserving-deduped: no duplicate operator + /// appears, and every input term's operators are present in the union. + #[test] + fn operators_for_terms_is_deduped_union(terms in prop::collection::vec(any_term(), 0..6)) { + let union = Term::operators_for_terms(&terms); + + // No duplicates. + let mut seen = std::collections::HashSet::new(); + for op in &union { + prop_assert!(seen.insert(*op), "duplicate operator {op} in union"); + } + + // Completeness: every term's operators are in the union. + for t in &terms { + for op in t.operators() { + prop_assert!(union.contains(op), "union missing {op} from {t:?}"); + } + } + } + + /// For any domain term set and any operator the union supports, there is a + /// resolving extractor; for an unsupported operator there is none. + #[test] + fn extractor_resolves_iff_operator_supported( + terms in prop::collection::vec(any_term(), 1..4) + ) { + let union = Term::operators_for_terms(&terms); + for op in ["=", "<>", "<", "<=", ">", ">=", "@>", "<@", "->", "??"] { + let resolves = Term::extractor_for_operator(&terms, op).is_some(); + let supported = union.contains(&op); + prop_assert_eq!( + resolves, supported, + "operator {} resolves={} but supported={}", op, resolves, supported + ); + } + } + + /// Every integer kind's representable range is non-empty and ordered. + #[test] + fn bounded_int_ranges_are_ordered(kind in any_kind()) { + if let Some(b) = kind.as_bounded_int() { + prop_assert!(b.min_value() < b.max_value(), "{kind:?} range must be non-empty"); + prop_assert!(kind.is_int()); + } else { + prop_assert!(!kind.is_int()); + } + } +} + +/// Non-proptest catalog invariants that range over the whole `CATALOG` (a fixed +/// set, so an exhaustive loop is the right tool, not a generator). +#[test] +fn every_catalog_domain_payload_keys_match_its_terms() { + for spec in CATALOG { + for dom in spec.domains { + let keys = Term::term_json_keys(dom.terms); + // Each term contributes exactly its json_key; deduped. + for t in dom.terms { + assert!( + keys.contains(&t.json_key()), + "domain {} missing json key for {t:?}", + spec.domain_name(dom) + ); + } + } + } +} + +#[test] +fn eq_only_specs_have_no_ordering_operators() { + for spec in CATALOG { + if spec.is_eq_only() { + for dom in spec.domains { + let ops = Term::operators_for_terms(dom.terms); + assert!( + !ops.iter().any(|o| matches!(*o, "<" | "<=" | ">" | ">=")), + "eq-only spec {} exposes an ordering operator on {}", + spec.token, + spec.domain_name(dom) + ); + } + } + } +} From 89e3335492b9ecafc6544bc85654cc3498f07ebf Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:09:05 +1000 Subject: [PATCH 227/599] test(v3): shared all-pairs oracle engine for property tests (CIP-3141) --- tests/sqlx/src/lib.rs | 1 + tests/sqlx/src/property.rs | 125 +++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 tests/sqlx/src/property.rs diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 71678a176..9882bbe9a 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -9,6 +9,7 @@ pub mod fixtures; pub mod helpers; pub mod jsonb_entry; pub mod matrix; +pub mod property; pub mod scalar_domains; #[macro_use] pub mod scalar_types; diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs new file mode 100644 index 000000000..f18816b0d --- /dev/null +++ b/tests/sqlx/src/property.rs @@ -0,0 +1,125 @@ +//! Shared substrate for the encrypted-domain property tests (CIP-3141). +//! +//! `assert_eq_oracle` / `assert_ord_oracle` take a corpus of +//! `(plaintext, payload_json)` rows and check SQL operator results against the +//! plaintext oracle over every ordered pair. Tier A feeds them rows read from +//! the live-encrypted fixture; Tier B feeds them rows it batch-encrypts from +//! freshly generated plaintexts. The engine is identical for both. +//! +//! Operator evaluation is read-only (`SELECT op `), so these helpers take +//! a `&PgPool` and need no per-test schema isolation. + +use crate::scalar_domains::{ScalarDomainSpec, ScalarType, Variant}; +use anyhow::{Context, Result}; +use sqlx::PgPool; + +/// A single corpus entry: a plaintext and its EQL payload rendered as a JSON +/// text literal (the `payload::text` form `fetch_fixture_payload` returns, or +/// `serde_json::Value::to_string()` for a freshly encrypted value). +pub struct Row { + pub plaintext: T, + pub payload_json: String, +} + +/// Cast a JSON text literal into a domain value: `''::jsonb::`. +fn cast(payload_json: &str, domain: &str) -> String { + format!("'{}'::jsonb::{}", payload_json.replace('\'', "''"), domain) +} + +/// Equality oracle: for every ordered pair `(a, b)` in `rows`, +/// `a = b` (SQL, on the `_eq` domain) ⇔ `a.plaintext == b.plaintext`, and +/// `a <> b` is its negation. +pub async fn assert_eq_oracle(pool: &PgPool, rows: &[Row]) -> Result<()> { + let domain = ScalarDomainSpec::new::(Variant::Eq).sql_domain; + for a in rows { + for b in rows { + let want = a.plaintext == b.plaintext; + let sql = format!( + "SELECT ({a_cast}) = ({b_cast}), ({a_cast}) <> ({b_cast})", + a_cast = cast(&a.payload_json, &domain), + b_cast = cast(&b.payload_json, &domain), + ); + let (eq, neq): (Option, Option) = sqlx::query_as(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("eq-oracle pair query: {sql}"))?; + anyhow::ensure!( + eq == Some(want), + "eq mismatch on {domain}: plaintext {:?}=={:?} is {want}, SQL `=` returned {eq:?}", + a.plaintext, + b.plaintext + ); + anyhow::ensure!( + neq == Some(!want), + "neq mismatch on {domain}: plaintext {:?}!={:?} is {}, SQL `<>` returned {neq:?}", + a.plaintext, + b.plaintext, + !want + ); + } + } + Ok(()) +} + +/// Ordering oracle: for every ordered pair `(a, b)` and every comparison +/// operator, SQL agrees with the plaintext comparison; additionally +/// `ord_term(a) < ord_term(b)` ⇔ `a.plaintext < b.plaintext`. +/// `variant` is `Variant::Ord` or `Variant::OrdOre` (the two ordered twins). +pub async fn assert_ord_oracle( + pool: &PgPool, + variant: Variant, + rows: &[Row], +) -> Result<()> { + assert!( + variant.supports_ord(), + "assert_ord_oracle needs an ordered variant" + ); + let domain = ScalarDomainSpec::new::(variant).sql_domain; + for a in rows { + for b in rows { + let a_cast = cast(&a.payload_json, &domain); + let b_cast = cast(&b.payload_json, &domain); + let sql = format!( + "SELECT ({a}) < ({b}), ({a}) <= ({b}), ({a}) > ({b}), ({a}) >= ({b}), \ + eql_v3.ord_term({a}) < eql_v3.ord_term({b})", + a = a_cast, + b = b_cast, + ); + let (lt, lte, gt, gte, term_lt): ( + Option, + Option, + Option, + Option, + Option, + ) = sqlx::query_as(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("ord-oracle pair query: {sql}"))?; + + let pa = &a.plaintext; + let pb = &b.plaintext; + anyhow::ensure!(lt == Some(pa < pb), "< mismatch on {domain}: {pa:?}<{pb:?}"); + anyhow::ensure!(lte == Some(pa <= pb), "<= mismatch on {domain}: {pa:?}<={pb:?}"); + anyhow::ensure!(gt == Some(pa > pb), "> mismatch on {domain}: {pa:?}>{pb:?}"); + anyhow::ensure!(gte == Some(pa >= pb), ">= mismatch on {domain}: {pa:?}>={pb:?}"); + anyhow::ensure!( + term_lt == Some(pa < pb), + "ord_term ordering mismatch on {domain}: {pa:?}<{pb:?}" + ); + } + } + Ok(()) +} + +/// Connect to the shared SQLx test database. Reads `DATABASE_URL`, falling back +/// to the documented local default (`localhost:7432`, cipherstash/password). +/// Used by the proptest tiers, which cannot use `#[sqlx::test]`'s injected pool +/// from a (sync) `proptest!` body. +pub async fn connect_pool() -> Result { + let url = std::env::var("DATABASE_URL").unwrap_or_else(|_| { + "postgres://cipherstash:password@localhost:7432/cipherstash".to_string() + }); + PgPool::connect(&url) + .await + .with_context(|| format!("connecting property-test pool to {url}")) +} From 066ffbbb9d2c7380ac03f34e9faa529f19602ae2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:24:13 +1000 Subject: [PATCH 228/599] test(v3): Tier A fixture-corpus property tests across the catalog (CIP-3141) Load each fixture corpus into the shared connect_pool DB on demand (ensure_fixture_loaded), since fixtures.eql_v2_ otherwise exist only in sqlx::test ephemeral databases, not the base DB the property tiers connect to. --- tests/sqlx/src/property.rs | 41 +++++ tests/sqlx/tests/encrypted_domain.rs | 6 + .../property/fixture_oracle.rs | 140 ++++++++++++++++++ .../tests/encrypted_domain/property/mod.rs | 10 ++ 4 files changed, 197 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs create mode 100644 tests/sqlx/tests/encrypted_domain/property/mod.rs diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index f18816b0d..0827f6ed2 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -12,6 +12,47 @@ use crate::scalar_domains::{ScalarDomainSpec, ScalarType, Variant}; use anyhow::{Context, Result}; use sqlx::PgPool; +use std::collections::HashSet; +use std::sync::OnceLock; +use tokio::sync::Mutex; + +/// Per-process record of which fixture corpora have been materialised into the +/// shared connection's DB, so concurrent property-test threads load each +/// `fixtures.eql_v2_` table exactly once. +static FIXTURE_LOADED: OnceLock>> = OnceLock::new(); + +/// Materialise the live-encrypted fixture corpus for `T` into the connected DB. +/// +/// The fixture `.sql` files (`tests/sqlx/fixtures/eql_v2_.sql`, regenerated +/// each `test:sqlx:prep`) are normally loaded only into `#[sqlx::test]`'s +/// ephemeral per-test databases. The property tiers connect to the shared test +/// DB directly (they cannot use `#[sqlx::test]`'s injected pool from a sync +/// `proptest!` body), so the corpus is not present there. This loads it on +/// demand: the script is self-contained and idempotent +/// (`CREATE SCHEMA IF NOT EXISTS` / `DROP TABLE IF EXISTS` / `CREATE` / +/// `INSERT`), and a process-wide async mutex guarantees exactly-once execution +/// per type across the parallel test threads (each driving its own runtime). +/// `CARGO_MANIFEST_DIR` resolves the path independent of the test's CWD. +pub async fn ensure_fixture_loaded(pool: &PgPool) -> Result<()> { + let guard = FIXTURE_LOADED.get_or_init(|| Mutex::new(HashSet::new())); + let mut loaded = guard.lock().await; + if loaded.contains(T::PG_TYPE) { + return Ok(()); + } + let path = format!( + "{}/fixtures/eql_v2_{}.sql", + env!("CARGO_MANIFEST_DIR"), + T::PG_TYPE + ); + let script = std::fs::read_to_string(&path) + .with_context(|| format!("reading fixture script {path} (run test:sqlx:prep first)"))?; + sqlx::raw_sql(&script) + .execute(pool) + .await + .with_context(|| format!("loading fixture corpus into shared DB from {path}"))?; + loaded.insert(T::PG_TYPE); + Ok(()) +} /// A single corpus entry: a plaintext and its EQL payload rendered as a JSON /// text literal (the `payload::text` form `fetch_fixture_payload` returns, or diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 033d5afde..24157f9bd 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -33,3 +33,9 @@ mod signed; // `test:matrix:inventory:jsonb_entry` task, not the scalar inventory. #[path = "encrypted_domain/jsonb_entry.rs"] mod jsonb_entry; + +// Property-based + edge-case tests (CIP-3141). Three tiers under `property::`, +// kept outside `scalars::` so the matrix-inventory gate does not mis-read them +// as scalar types. See `encrypted_domain/property/mod.rs`. +#[path = "encrypted_domain/property/mod.rs"] +mod property; diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs new file mode 100644 index 000000000..b09bd47b5 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -0,0 +1,140 @@ +//! Tier A (CIP-3141): property tests over the real, committed fixture corpus. +//! +//! The fixture table `fixtures.eql_v2_` carries `(plaintext, payload)` rows +//! encrypted by cipherstash-client during `test:sqlx:prep`. proptest selects a +//! sub-multiset of those rows (with repeats, so the equality diagonal includes +//! identical-ciphertext self-pairs) and the shared oracle engine checks every +//! pair. No new encryption — runs whenever the fixtures are present. +//! +//! Generic over `ScalarType`; instantiated per type at the bottom. + +use anyhow::Result; +use eql_tests::property::{ + assert_eq_oracle, assert_ord_oracle, connect_pool, ensure_fixture_loaded, Row, +}; +use eql_tests::scalar_domains::{ScalarType, Variant}; +use proptest::prelude::*; +use proptest::test_runner::{Config, TestCaseError, TestRunner}; +use sqlx::PgPool; + +/// Read every `(plaintext, payload::text)` fixture row for `T`, in id order. +/// Ensures the corpus is present in the shared DB first (it lives in +/// `#[sqlx::test]`'s ephemeral DBs by default, not the pool we connect to). +async fn load_fixture_rows(pool: &PgPool) -> Result>> { + ensure_fixture_loaded::(pool).await?; + let sql = format!( + "SELECT plaintext, payload::text FROM {} ORDER BY id", + T::fixture_table_name() + ); + let raw: Vec<(T, String)> = sqlx::query_as(&sql).fetch_all(pool).await?; + Ok(raw + .into_iter() + .map(|(plaintext, payload_json)| Row { + plaintext, + payload_json, + }) + .collect()) +} + +/// Build a corpus by sampling indices (with repeats) into the loaded fixtures. +fn pick<'a, T>(all: &'a [Row], idxs: &[usize]) -> Vec> +where + T: Clone, +{ + idxs.iter() + .map(|&i| Row { + plaintext: all[i % all.len()].plaintext.clone(), + payload_json: all[i % all.len()].payload_json.clone(), + }) + .collect() +} + +/// Drive proptest from a sync context: sample `cases` index-multisets, and for +/// each run the async oracle on a current-thread runtime. Kept here (not in the +/// lib) because it wires proptest to the test binary. +fn run_fixture_property(cases: u32, oracle: F) -> Result<()> +where + T: ScalarType, + F: Fn(PgPool, Vec>) -> Fut, + Fut: std::future::Future>, +{ + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build()?; + let pool = rt.block_on(connect_pool())?; + let all = rt.block_on(load_fixture_rows::(&pool))?; + anyhow::ensure!( + !all.is_empty(), + "fixture {} is empty", + T::fixture_table_name() + ); + + let mut runner = TestRunner::new(Config { + cases, + ..Config::default() + }); + let n = all.len(); + // Each case: a multiset of 2..=12 indices into the fixtures (repeats wanted). + let strategy = prop::collection::vec(0..n, 2..13); + runner + .run(&strategy, |idxs| { + let corpus = pick(&all, &idxs); + rt.block_on(oracle(pool.clone(), corpus)) + .map_err(|e| TestCaseError::fail(e.to_string()))?; + Ok(()) + }) + .map_err(|e| anyhow::anyhow!("fixture property failed: {e}")) +} + +#[test] +fn prop_int4_eq_oracle_over_fixture() -> Result<()> { + run_fixture_property::(48, |pool, corpus| async move { + assert_eq_oracle::(&pool, &corpus).await + }) +} + +#[test] +fn prop_int4_ord_oracle_over_fixture() -> Result<()> { + run_fixture_property::(48, |pool, corpus| async move { + assert_ord_oracle::(&pool, Variant::Ord, &corpus).await?; + assert_ord_oracle::(&pool, Variant::OrdOre, &corpus).await + }) +} + +macro_rules! fixture_oracle_suite { + ($modname:ident, $ty:ty, ordered) => { + mod $modname { + use super::*; + #[test] + fn eq_oracle() -> Result<()> { + run_fixture_property::<$ty, _, _>(32, |pool, c| async move { + assert_eq_oracle::<$ty>(&pool, &c).await + }) + } + #[test] + fn ord_oracle() -> Result<()> { + run_fixture_property::<$ty, _, _>(32, |pool, c| async move { + assert_ord_oracle::<$ty>(&pool, Variant::Ord, &c).await?; + assert_ord_oracle::<$ty>(&pool, Variant::OrdOre, &c).await + }) + } + } + }; + ($modname:ident, $ty:ty, eq_only) => { + mod $modname { + use super::*; + #[test] + fn eq_oracle() -> Result<()> { + run_fixture_property::<$ty, _, _>(32, |pool, c| async move { + assert_eq_oracle::<$ty>(&pool, &c).await + }) + } + } + }; +} + +fixture_oracle_suite!(int2, i16, ordered); +fixture_oracle_suite!(int8, i64, ordered); +fixture_oracle_suite!(date, chrono::NaiveDate, ordered); +fixture_oracle_suite!(text, String, ordered); +fixture_oracle_suite!(timestamptz, chrono::DateTime, eq_only); diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs new file mode 100644 index 000000000..96e2d5515 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -0,0 +1,10 @@ +//! Property-based and edge-case tests for the eql_v3 encrypted scalar domains +//! (CIP-3141). Deliberately NOT under `scalars::` — the matrix-inventory gate +//! (`mise run test:matrix:inventory`) discovers scalar types from every +//! `scalars::::` test-name prefix, so a `scalars::property::…` test would be +//! mis-read as a scalar type and break the catalog cross-check. + +mod fixture_oracle; // Tier A: oracle over the live-encrypted fixture corpus. +#[cfg(feature = "proptest-live")] +mod live_oracle; // Tier B: oracle over freshly generated + batch-encrypted values. +mod edge_cases; // NULL / blocker / CHECK-constraint unit tests. From 790e8a950473c6a9860b18eb6978dc890b7493ac Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:29:37 +1000 Subject: [PATCH 229/599] test(v3): Tier B live-encryption property tests for integer scalars (CIP-3141) --- .../property/fixture_oracle.rs | 3 + .../encrypted_domain/property/live_oracle.rs | 131 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/property/live_oracle.rs diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index b09bd47b5..01d9c69e3 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -71,6 +71,9 @@ where let mut runner = TestRunner::new(Config { cases, + // No regression file: these cases sample committed fixtures, nothing to + // persist/replay, and it silences proptest's "no source file" warning. + failure_persistence: None, ..Config::default() }); let n = all.len(); diff --git a/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs new file mode 100644 index 000000000..dc7e5595c --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs @@ -0,0 +1,131 @@ +//! Tier B (CIP-3141): property tests over freshly generated, live-encrypted +//! values. Gated behind `proptest-live` (declared in property/mod.rs) — needs +//! CS_* creds, which `mise run test:sqlx` enables for CI/local full SQLx runs. +//! Each proptest case generates one corpus of random integers +//! (seeded with type-specific extremes, zero, and DELIBERATE DUPLICATES so the equality-true +//! branch fires across distinct ciphertexts), encrypts it in ONE batched +//! ZeroKMS call, then runs the all-pairs oracle. + +use anyhow::Result; +use eql_tests::fixtures::cipherstash::{column_config_for, encrypt_store}; +use eql_tests::fixtures::eql_plaintext::{Cast, EqlPlaintext}; +use eql_tests::fixtures::index_kind::IndexKind; +use eql_tests::property::{assert_eq_oracle, assert_ord_oracle, connect_pool, Row}; +use eql_tests::scalar_domains::ScalarType; +use eql_tests::scalar_domains::Variant; +use proptest::prelude::*; +use proptest::test_runner::{Config, TestCaseError, TestRunner}; +use sqlx::PgPool; + +/// Encrypt a batch of plaintext integers into `(plaintext, payload_json)` rows +/// via the existing fixture oracle. One ZeroKMS round trip for the whole batch. +async fn encrypt_rows(pool_table: &str, cast: Cast, values: &[T]) -> Result>> +where + T: ScalarType + EqlPlaintext + Clone, +{ + let config = column_config_for(&[IndexKind::Unique, IndexKind::Ore], cast)?; + let payloads = encrypt_store(pool_table, "payload", values, &config).await?; + Ok(values + .iter() + .cloned() + .zip(payloads) + .map(|(plaintext, payload)| Row { + plaintext, + payload_json: payload.to_string(), + }) + .collect()) +} + +/// Drive proptest: each case is a corpus of integers. Generation is in-process; +/// encryption + oracle is async on a current-thread runtime. +fn run_live_property( + table: &str, + cast: Cast, + cases: u32, + ordered: bool, + seeds: &[T], +) -> Result<()> +where + T: ScalarType + EqlPlaintext + Clone + 'static, + T: proptest::arbitrary::Arbitrary, + ::Strategy: 'static, +{ + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build()?; + let pool: PgPool = rt.block_on(connect_pool())?; + + // Shrinking is disabled for the live tier: every failed shrink attempt would + // trigger another ZeroKMS batch, and ciphertext cannot be meaningfully + // shrunk anyway. Tier C keeps normal shrinking. + let mut runner = TestRunner::new(Config { + cases, + max_shrink_iters: 0, + // Ciphertext can't be replayed across runs (fresh ZeroKMS each time), so + // there's nothing to persist; also silences proptest's "no source file" + // warning. + failure_persistence: None, + ..Config::default() + }); + // 2..=10 random values, then we append deterministic seeds and duplicates + // of the first two random values. Seeds guarantee min/max/zero coverage; + // duplicates guarantee the eq-true branch across independently encrypted + // ciphertexts. + let strategy = prop::collection::vec(any::(), 2..11); + runner + .run(&strategy, |mut values| { + let dup0 = values[0].clone(); + let dup1 = values[1].clone(); + values.extend_from_slice(seeds); + values.push(dup0); + values.push(dup1); + let rows = rt + .block_on(encrypt_rows::(table, cast, &values)) + .map_err(|e| TestCaseError::fail(format!("encrypt: {e}")))?; + rt.block_on(async { + assert_eq_oracle::(&pool, &rows).await?; + if ordered { + assert_ord_oracle::(&pool, Variant::Ord, &rows).await?; + assert_ord_oracle::(&pool, Variant::OrdOre, &rows).await?; + } + Ok::<_, anyhow::Error>(()) + }) + .map_err(|e| TestCaseError::fail(format!("oracle: {e}")))?; + Ok(()) + }) + .map_err(|e| anyhow::anyhow!("live property failed: {e}")) +} + +#[test] +fn prop_int4_eq_and_ord_oracle_live() -> Result<()> { + // Low case count: each case is a ZeroKMS round trip. 8 keeps CI bounded. + run_live_property::( + "proptest_live_int4", + Cast::INT, + 8, + true, + &[i32::MIN, 0, i32::MAX], + ) +} + +#[test] +fn prop_int2_eq_and_ord_oracle_live() -> Result<()> { + run_live_property::( + "proptest_live_int2", + Cast::SMALL_INT, + 8, + true, + &[i16::MIN, 0, i16::MAX], + ) +} + +#[test] +fn prop_int8_eq_and_ord_oracle_live() -> Result<()> { + run_live_property::( + "proptest_live_int8", + Cast::BIG_INT, + 8, + true, + &[i64::MIN, 0, i64::MAX], + ) +} From af4d554ca9213c70eb5b32d6ba3df2b9e0e886f0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:33:26 +1000 Subject: [PATCH 230/599] test(v3): NULL/blocker/CHECK edge-case unit tests for int4 domains (CIP-3141) --- .../encrypted_domain/property/edge_cases.rs | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/property/edge_cases.rs diff --git a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs new file mode 100644 index 000000000..11b00a722 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs @@ -0,0 +1,68 @@ +//! Unit edge cases for the eql_v3 int4 domains (CIP-3141): NULL propagation on +//! supported operators, blocker functions raising on unsupported operators, and +//! domain CHECK-constraint rejection of malformed payloads. No encryption. + +use anyhow::Result; +use eql_tests::scalar_domains::{ + assert_null, assert_raises, blocker_msg, ScalarDomainSpec, Variant, +}; +use sqlx::PgPool; + +/// A well-formed int4 storage/eq payload literal — has v/i/c + hm + ob, so it +/// casts into any int4 domain. Hand-written (no encryption needed); the term +/// VALUES are placeholders, which is fine for NULL/blocker/CHECK shape tests. +const WELL_FORMED: &str = r#"{"v":2,"i":{"t":"edge","c":"payload"},"c":"AAAA","hm":"deadbeef","ob":["00"]}"#; + +fn int4(variant: Variant) -> String { + ScalarDomainSpec::new::(variant).sql_domain +} + +#[sqlx::test] +async fn eq_propagates_null(pool: PgPool) -> Result<()> { + let d = int4(Variant::Eq); + // A supported operator with a NULL operand must yield NULL, not raise. + let sql = format!("SELECT ($1::jsonb::{d}) = (NULL::{d})"); + assert_null(&pool, &sql, &[Some(WELL_FORMED)]).await +} + +#[sqlx::test] +async fn lt_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { + // `<` is not supported on the equality-only domain; the blocker must RAISE, + // and must NOT be elided even on a NULL operand (blockers are never STRICT). + let d = int4(Variant::Eq); + let sql = format!("SELECT ($1::jsonb::{d}) < ($1::jsonb::{d})"); + assert_raises(&pool, &sql, &[Some(WELL_FORMED)], &blocker_msg(&d, "<")).await?; + // NULL operand: still raises (proves the blocker is not STRICT). + let sql_null = format!("SELECT (NULL::{d}) < (NULL::{d})"); + assert_raises(&pool, &sql_null, &[], &blocker_msg(&d, "<")).await +} + +#[sqlx::test] +async fn check_rejects_payload_missing_hm(pool: PgPool) -> Result<()> { + // The _eq domain CHECK requires `hm`. A payload without it must be rejected + // at the cast. + let d = int4(Variant::Eq); + let no_hm = r#"{"v":2,"i":{"t":"edge","c":"payload"},"c":"AAAA","ob":["00"]}"#; + let sql = format!("SELECT $1::jsonb::{d}"); + // The CHECK violation surfaces as a domain/constraint error; assert it raises. + let result = sqlx::query(&sql).bind(no_hm).fetch_one(&pool).await; + anyhow::ensure!( + result.is_err(), + "payload missing hm must be rejected by {d} CHECK" + ); + Ok(()) +} + +#[sqlx::test] +async fn check_rejects_payload_missing_ob(pool: PgPool) -> Result<()> { + // The _ord domain CHECK requires `ob`. + let d = int4(Variant::Ord); + let no_ob = r#"{"v":2,"i":{"t":"edge","c":"payload"},"c":"AAAA","hm":"deadbeef"}"#; + let sql = format!("SELECT $1::jsonb::{d}"); + let result = sqlx::query(&sql).bind(no_ob).fetch_one(&pool).await; + anyhow::ensure!( + result.is_err(), + "payload missing ob must be rejected by {d} CHECK" + ); + Ok(()) +} From db3f70aec613edba2282e16e0a3c32d1af07c1e9 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 15:43:40 +1000 Subject: [PATCH 231/599] docs(v3): record eql_v3 property-test harness (CIP-3141) Also commit Cargo.lock (proptest deps) and apply cargo fmt to the property-test modules. --- CHANGELOG.md | 3 ++ Cargo.lock | 54 +++++++++++++++++++ tests/sqlx/README.md | 5 +- tests/sqlx/src/property.rs | 10 +++- .../encrypted_domain/property/edge_cases.rs | 3 +- .../tests/encrypted_domain/property/mod.rs | 9 ++-- 6 files changed, 77 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 782324a9e..b73805b29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,9 @@ Each entry that ships in a published release links to the PR that introduced it. - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) +- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) +- **Property-based tests for the `eql_v3` encrypted scalar domains.** A three-tier harness asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust catalog-invariant tier (no database), a fixture-corpus tier that samples the live-encrypted fixtures and checks all ordered pairs in each sampled corpus, and a live-encryption tier (gated behind the `proptest-live` cargo feature) that batch-encrypts freshly generated plaintexts each run. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) oracles plus NULL/blocker/CHECK edge cases. Why: the prior matrix exercised fixed pivots only; property tests catch operator/oracle disagreements across the whole value space. ([CIP-3141](https://linear.app/cipherstash/issue/CIP-3141)) +- **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) diff --git a/Cargo.lock b/Cargo.lock index 9d8b794b1..05690b865 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1175,6 +1175,9 @@ dependencies = [ [[package]] name = "eql-scalars" version = "0.1.0" +dependencies = [ + "proptest", +] [[package]] name = "eql-tests-macros" @@ -1209,6 +1212,7 @@ dependencies = [ "hex", "jsonschema", "paste", + "proptest", "rust_decimal", "serde", "serde_json", @@ -1283,6 +1287,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -2762,12 +2772,16 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ + "bit-set", + "bit-vec", "bitflags", "num-traits", "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", + "rusty-fork", + "tempfile", "unarray", ] @@ -2791,6 +2805,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quinn" version = "0.11.9" @@ -3361,6 +3381,18 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.20" @@ -4040,6 +4072,19 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -4729,6 +4774,15 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index 978ad1f1f..80dc59e4e 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -275,6 +275,9 @@ Tests connect to PostgreSQL database configured by SQLx: ## Future Work - ✅ ~~Convert remaining SQL tests~~ **COMPLETE!** -- Property-based tests: Add encryption round-trip property tests +- Property-based tests: implemented in `tests/encrypted_domain/property/` and + `crates/eql-scalars/src/proptest_invariants.rs` (CIP-3141). Three tiers: + catalog invariants (no DB), fixture-corpus oracle, and live-encryption oracle + (`--features proptest-live`). - Performance benchmarks: Measure query performance with encrypted data - Integration tests: Test with CipherStash Proxy diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 0827f6ed2..332e875e8 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -140,9 +140,15 @@ pub async fn assert_ord_oracle( let pa = &a.plaintext; let pb = &b.plaintext; anyhow::ensure!(lt == Some(pa < pb), "< mismatch on {domain}: {pa:?}<{pb:?}"); - anyhow::ensure!(lte == Some(pa <= pb), "<= mismatch on {domain}: {pa:?}<={pb:?}"); + anyhow::ensure!( + lte == Some(pa <= pb), + "<= mismatch on {domain}: {pa:?}<={pb:?}" + ); anyhow::ensure!(gt == Some(pa > pb), "> mismatch on {domain}: {pa:?}>{pb:?}"); - anyhow::ensure!(gte == Some(pa >= pb), ">= mismatch on {domain}: {pa:?}>={pb:?}"); + anyhow::ensure!( + gte == Some(pa >= pb), + ">= mismatch on {domain}: {pa:?}>={pb:?}" + ); anyhow::ensure!( term_lt == Some(pa < pb), "ord_term ordering mismatch on {domain}: {pa:?}<{pb:?}" diff --git a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs index 11b00a722..df61b87c4 100644 --- a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs +++ b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs @@ -11,7 +11,8 @@ use sqlx::PgPool; /// A well-formed int4 storage/eq payload literal — has v/i/c + hm + ob, so it /// casts into any int4 domain. Hand-written (no encryption needed); the term /// VALUES are placeholders, which is fine for NULL/blocker/CHECK shape tests. -const WELL_FORMED: &str = r#"{"v":2,"i":{"t":"edge","c":"payload"},"c":"AAAA","hm":"deadbeef","ob":["00"]}"#; +const WELL_FORMED: &str = + r#"{"v":2,"i":{"t":"edge","c":"payload"},"c":"AAAA","hm":"deadbeef","ob":["00"]}"#; fn int4(variant: Variant) -> String { ScalarDomainSpec::new::(variant).sql_domain diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs index 96e2d5515..22b036172 100644 --- a/tests/sqlx/tests/encrypted_domain/property/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -4,7 +4,10 @@ //! `scalars::::` test-name prefix, so a `scalars::property::…` test would be //! mis-read as a scalar type and break the catalog cross-check. -mod fixture_oracle; // Tier A: oracle over the live-encrypted fixture corpus. +// NULL / blocker / CHECK-constraint unit tests. +mod edge_cases; +// Tier A: oracle over the live-encrypted fixture corpus. +mod fixture_oracle; +// Tier B: oracle over freshly generated + batch-encrypted values. #[cfg(feature = "proptest-live")] -mod live_oracle; // Tier B: oracle over freshly generated + batch-encrypted values. -mod edge_cases; // NULL / blocker / CHECK-constraint unit tests. +mod live_oracle; From b30645e269d20c191bfd2037a99a4feb60cefbed Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 17:36:38 +1000 Subject: [PATCH 232/599] test(v3): expand edge cases (path/containment blockers, timestamptz deferral, CHECK specificity) + clippy cleanup (CIP-3141) - Add ->/@> blocker raises + not-STRICT tests on int4_eq (the documented native-jsonb domain-fallback footgun); previously only < was covered. - Assert timestamptz ordering deferral: < on timestamptz_eq raises. - Tighten CHECK tests from is_err() to assert_raises("violates check constraint"); add storage-envelope and _ord_ore CHECK cases. - Clear clippy type_complexity (OrdRow alias) and needless_lifetimes; derive Clone on Row (drops the dead modulo in pick). --- tests/sqlx/src/property.rs | 18 +++-- .../encrypted_domain/property/edge_cases.rs | 80 ++++++++++++++----- .../property/fixture_oracle.rs | 13 +-- .../encrypted_domain/property/live_oracle.rs | 8 +- 4 files changed, 79 insertions(+), 40 deletions(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 332e875e8..78ef7d54b 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -57,11 +57,21 @@ pub async fn ensure_fixture_loaded(pool: &PgPool) -> Result<()> { /// A single corpus entry: a plaintext and its EQL payload rendered as a JSON /// text literal (the `payload::text` form `fetch_fixture_payload` returns, or /// `serde_json::Value::to_string()` for a freshly encrypted value). +#[derive(Clone)] pub struct Row { pub plaintext: T, pub payload_json: String, } +/// One ordering-oracle result row: `(lt, lte, gt, gte, ord_term_lt)` for a pair. +type OrdRow = ( + Option, + Option, + Option, + Option, + Option, +); + /// Cast a JSON text literal into a domain value: `''::jsonb::`. fn cast(payload_json: &str, domain: &str) -> String { format!("'{}'::jsonb::{}", payload_json.replace('\'', "''"), domain) @@ -126,13 +136,7 @@ pub async fn assert_ord_oracle( a = a_cast, b = b_cast, ); - let (lt, lte, gt, gte, term_lt): ( - Option, - Option, - Option, - Option, - Option, - ) = sqlx::query_as(&sql) + let (lt, lte, gt, gte, term_lt): OrdRow = sqlx::query_as(&sql) .fetch_one(pool) .await .with_context(|| format!("ord-oracle pair query: {sql}"))?; diff --git a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs index df61b87c4..c46622faf 100644 --- a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs +++ b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs @@ -1,6 +1,8 @@ -//! Unit edge cases for the eql_v3 int4 domains (CIP-3141): NULL propagation on -//! supported operators, blocker functions raising on unsupported operators, and -//! domain CHECK-constraint rejection of malformed payloads. No encryption. +//! Unit edge cases for the eql_v3 scalar domains (CIP-3141): NULL propagation on +//! supported operators, blocker functions raising on unsupported operators +//! (equality, ordering, path, and containment families — the documented +//! domain-fallback footgun), the timestamptz ordering deferral, and domain +//! CHECK-constraint rejection of malformed payloads. No encryption. use anyhow::Result; use eql_tests::scalar_domains::{ @@ -38,32 +40,72 @@ async fn lt_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { assert_raises(&pool, &sql_null, &[], &blocker_msg(&d, "<")).await } +#[sqlx::test] +async fn path_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { + // A native-jsonb PATH operator (`->`) reachable through domain fallback must + // hit the blocker, not silently return a jsonb sub-value (the documented + // footgun). The domain ships its own `->` operator that always raises. + let d = int4(Variant::Eq); + let sql = format!("SELECT ($1::jsonb::{d}) -> 'sel'::text"); + assert_raises(&pool, &sql, &[Some(WELL_FORMED)], &blocker_msg(&d, "->")).await?; + // NULL operand: still raises (proves the blocker is not STRICT, so a NULL + // argument cannot let PostgreSQL skip the body and fall through to NULL). + let sql_null = format!("SELECT (NULL::{d}) -> 'sel'::text"); + assert_raises(&pool, &sql_null, &[], &blocker_msg(&d, "->")).await +} + +#[sqlx::test] +async fn containment_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { + // A native-jsonb CONTAINMENT operator (`@>`) must likewise hit the blocker + // on a domain that does not support it (int4_eq carries only `hm`/equality). + let d = int4(Variant::Eq); + let sql = format!("SELECT ($1::jsonb::{d}) @> ($1::jsonb::{d})"); + assert_raises(&pool, &sql, &[Some(WELL_FORMED)], &blocker_msg(&d, "@>")).await?; + // NULL operand: still raises (not STRICT). + let sql_null = format!("SELECT (NULL::{d}) @> (NULL::{d})"); + assert_raises(&pool, &sql_null, &[], &blocker_msg(&d, "@>")).await +} + +#[sqlx::test] +async fn ordering_is_deferred_on_timestamptz_eq(pool: PgPool) -> Result<()> { + // timestamptz is equality-only: ordering is deferred until a wide-ORE + // comparator lands (CHANGELOG / #241). Lock that in at the SQL boundary — an + // ordering operator on `timestamptz_eq` must RAISE (and be non-STRICT), not + // silently mis-order. There are no `timestamptz_ord` / `_ord_ore` domains. + let d = ScalarDomainSpec::new::>(Variant::Eq).sql_domain; + let sql = format!("SELECT (NULL::{d}) < (NULL::{d})"); + assert_raises(&pool, &sql, &[], &blocker_msg(&d, "<")).await +} + +#[sqlx::test] +async fn check_rejects_payload_missing_envelope(pool: PgPool) -> Result<()> { + // The storage domain's CHECK requires the EQL envelope (`v`, `i`, `c`). A + // payload missing the top-level ciphertext `c` must be rejected at the cast. + let d = int4(Variant::Storage); + let no_c = r#"{"v":2,"i":{"t":"edge","c":"payload"}}"#; + let sql = format!("SELECT $1::jsonb::{d}"); + assert_raises(&pool, &sql, &[Some(no_c)], "violates check constraint").await +} + #[sqlx::test] async fn check_rejects_payload_missing_hm(pool: PgPool) -> Result<()> { // The _eq domain CHECK requires `hm`. A payload without it must be rejected - // at the cast. + // at the cast with a CHECK-constraint violation (not some unrelated error). let d = int4(Variant::Eq); let no_hm = r#"{"v":2,"i":{"t":"edge","c":"payload"},"c":"AAAA","ob":["00"]}"#; let sql = format!("SELECT $1::jsonb::{d}"); - // The CHECK violation surfaces as a domain/constraint error; assert it raises. - let result = sqlx::query(&sql).bind(no_hm).fetch_one(&pool).await; - anyhow::ensure!( - result.is_err(), - "payload missing hm must be rejected by {d} CHECK" - ); - Ok(()) + assert_raises(&pool, &sql, &[Some(no_hm)], "violates check constraint").await } #[sqlx::test] async fn check_rejects_payload_missing_ob(pool: PgPool) -> Result<()> { - // The _ord domain CHECK requires `ob`. - let d = int4(Variant::Ord); + // The _ord and _ord_ore domain CHECKs both require `ob`. A payload without + // it must be rejected at the cast on either ordered twin. let no_ob = r#"{"v":2,"i":{"t":"edge","c":"payload"},"c":"AAAA","hm":"deadbeef"}"#; - let sql = format!("SELECT $1::jsonb::{d}"); - let result = sqlx::query(&sql).bind(no_ob).fetch_one(&pool).await; - anyhow::ensure!( - result.is_err(), - "payload missing ob must be rejected by {d} CHECK" - ); + for variant in [Variant::Ord, Variant::OrdOre] { + let d = int4(variant); + let sql = format!("SELECT $1::jsonb::{d}"); + assert_raises(&pool, &sql, &[Some(no_ob)], "violates check constraint").await?; + } Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 01d9c69e3..581b45f65 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -37,16 +37,9 @@ async fn load_fixture_rows(pool: &PgPool) -> Result>> } /// Build a corpus by sampling indices (with repeats) into the loaded fixtures. -fn pick<'a, T>(all: &'a [Row], idxs: &[usize]) -> Vec> -where - T: Clone, -{ - idxs.iter() - .map(|&i| Row { - plaintext: all[i % all.len()].plaintext.clone(), - payload_json: all[i % all.len()].payload_json.clone(), - }) - .collect() +/// `idxs` are already bounded to `0..all.len()` by the proptest strategy. +fn pick(all: &[Row], idxs: &[usize]) -> Vec> { + idxs.iter().map(|&i| all[i].clone()).collect() } /// Drive proptest from a sync context: sample `cases` index-multisets, and for diff --git a/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs index dc7e5595c..035b330be 100644 --- a/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs @@ -1,10 +1,10 @@ //! Tier B (CIP-3141): property tests over freshly generated, live-encrypted //! values. Gated behind `proptest-live` (declared in property/mod.rs) — needs //! CS_* creds, which `mise run test:sqlx` enables for CI/local full SQLx runs. -//! Each proptest case generates one corpus of random integers -//! (seeded with type-specific extremes, zero, and DELIBERATE DUPLICATES so the equality-true -//! branch fires across distinct ciphertexts), encrypts it in ONE batched -//! ZeroKMS call, then runs the all-pairs oracle. +//! Each proptest case generates one corpus of random integers — seeded with +//! type-specific extremes, zero, and deliberate duplicates so the equality-true +//! branch fires across distinct ciphertexts of the same plaintext — encrypts it +//! in one batched ZeroKMS call, then runs the all-pairs oracle. use anyhow::Result; use eql_tests::fixtures::cipherstash::{column_config_for, encrypt_store}; From 9af3f71c3bd8c7c7a7caafe6ebace06b8ec06b69 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 18:55:25 +1000 Subject: [PATCH 233/599] test(v3): assert non-STRICT/plpgsql for EVERY eql_v3 blocker, not just representatives (CIP-3141) The behavioural raise tests cover <, ->, @> on int4_eq; this adds a catalog-level test that asserts the non-STRICT + LANGUAGE plpgsql contract for all 977 generated blockers across every eql_v3 domain (->, ->>, @>, <@, ||, ?, ?|, ?&, @?, @@, #>, #>>, -, #-, comparisons), against the installed catalog. Closes the gap where a blocker regressing to STRICT/LANGUAGE sql on an operator other than < would pass the suite. --- .../encrypted_domain/property/edge_cases.rs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs index c46622faf..4f2ebd9d0 100644 --- a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs +++ b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs @@ -77,6 +77,58 @@ async fn ordering_is_deferred_on_timestamptz_eq(pool: PgPool) -> Result<()> { assert_raises(&pool, &sql, &[], &blocker_msg(&d, "<")).await } +#[sqlx::test] +async fn every_eql_v3_blocker_is_non_strict_plpgsql(pool: PgPool) -> Result<()> { + // The footgun guard, applied to EVERY generated blocker at once. + // + // Codegen emits a blocker for each native-jsonb operator a domain does NOT + // support (`->`, `->>`, `@>`, `<@`, `||`, `?`, `?|`, `?&`, `@?`, `@@`, `#>`, + // `#>>`, `-`, `#-`, plus the unsupported comparison ops) across every + // eql_v3 scalar domain (storage / _eq / _ord / _ord_ore / _match). Each MUST + // be `LANGUAGE plpgsql` and MUST NOT be `STRICT`: + // * a `STRICT` blocker is skipped on a NULL argument, silently returning + // NULL instead of raising — falling through to native jsonb semantics; + // * a `LANGUAGE sql` blocker is inlinable and the planner can elide the + // call (and its RAISE) when the result is provably unused. + // The behavioural tests above prove the raise for representative operators + // (`<`, `->`, `@>`); this proves the structural contract for the WHOLE set, + // and against the *installed* catalog (catching build/install drift the + // codegen golden test cannot see). Blockers are identified by their RAISE + // body — the `'operator % is not supported for %'` message every blocker + // carries and nothing else does. + let (total, strict, non_plpgsql): (i64, i64, i64) = sqlx::query_as( + r#" + SELECT count(*), + count(*) FILTER (WHERE p.proisstrict), + count(*) FILTER (WHERE l.lanname <> 'plpgsql') + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + JOIN pg_catalog.pg_language l ON l.oid = p.prolang + WHERE n.nspname = 'eql_v3' + AND p.prosrc LIKE '%is not supported for %' + "#, + ) + .fetch_one(&pool) + .await?; + + anyhow::ensure!( + total > 0, + "found no eql_v3 blocker functions — did the extension install?" + ); + anyhow::ensure!( + strict == 0, + "{strict} of {total} eql_v3 blocker(s) are STRICT — a STRICT blocker is \ + elided on a NULL argument, bypassing the not-supported RAISE" + ); + anyhow::ensure!( + non_plpgsql == 0, + "{non_plpgsql} of {total} eql_v3 blocker(s) are not LANGUAGE plpgsql — a \ + LANGUAGE sql blocker is inlinable and can be elided when the result is \ + provably unused" + ); + Ok(()) +} + #[sqlx::test] async fn check_rejects_payload_missing_envelope(pool: PgPool) -> Result<()> { // The storage domain's CHECK requires the EQL envelope (`v`, `i`, `c`). A From ef161fc6da822987131241cc1fcae4da72a60ddc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 22:56:02 +1000 Subject: [PATCH 234/599] ci(security): gate CS_* secrets behind a fork-PR guard on the test job The repo is public and accepts fork PRs (approval policy only gates first-time contributors), so the prior comment claiming "this repository does not accept fork PRs" was false and the env block left the CipherStash credentials reachable from fork-PR runs if the fork-secrets toggle were ever enabled. Add a job-level `if:` that runs the secret-bearing test job only for push / workflow_dispatch / same-repo branch PRs, and correct the comment. --- .github/workflows/test-eql.yml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index f946c4fa9..1e37aaa3a 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -109,10 +109,17 @@ jobs: build-archive: name: "Build test archive" needs: [changes] + # This repo is PUBLIC and accepts fork PRs (the approval policy only gates + # first-time contributors). build-archive is the sole holder of the CS_* + # credentials below, so it must never run on a fork PR. The trailing clause + # restricts it to push / workflow_dispatch / same-repo branch PRs; the + # downstream test/validate shards `needs:` it, so they skip on fork PRs too. if: >- - github.event_name == 'merge_group' - || github.event_name == 'workflow_dispatch' - || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true') + (github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true')) + && (github.event_name != 'pull_request' + || github.event.pull_request.head.repo.full_name == github.repository) runs-on: blacksmith-16vcpu-ubuntu-2204 env: # test:sqlx:archive depends on test:sqlx:prep, which copies the built EQL @@ -120,8 +127,8 @@ jobs: # per-type fixtures — both are include_str!'d into the test binaries at # COMPILE time, so they must exist before `cargo nextest archive`. Fixture # generation needs a live PG with EQL installed (the postgres:up step - # below) plus CS_* creds. This repo does not accept fork PRs, so the - # secrets-on-pull_request constraint does not apply — block is unconditional. + # below) plus CS_* creds. The job-level `if:` above keeps those creds off + # fork-PR runs. POSTGRES_VERSION: "17" CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} From 12c9b9ad890dabee14db9eccd72f8424793c6928 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 11 Jun 2026 23:08:41 +1000 Subject: [PATCH 235/599] fix: apply CodeRabbit auto-fixes - property.rs: redact userinfo from DATABASE_URL in connect_pool error context so a connection failure never logs the password (CodeRabbit Major). - proptest_invariants.rs: assert exact payload-key set equality (catches extra keys, not just missing ones). - live_oracle.rs: ensure! encrypt_store returns one payload per plaintext before zipping, so a count mismatch fails fast instead of silently truncating. - CHANGELOG.md: use the PR link (#275) instead of the CIP issue link. --- CHANGELOG.md | 2 +- crates/eql-scalars/src/proptest_invariants.rs | 21 +++++++++++-------- tests/sqlx/src/property.rs | 15 ++++++++++++- .../encrypted_domain/property/live_oracle.rs | 9 ++++++++ 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b73805b29..41780d122 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) -- **Property-based tests for the `eql_v3` encrypted scalar domains.** A three-tier harness asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust catalog-invariant tier (no database), a fixture-corpus tier that samples the live-encrypted fixtures and checks all ordered pairs in each sampled corpus, and a live-encryption tier (gated behind the `proptest-live` cargo feature) that batch-encrypts freshly generated plaintexts each run. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) oracles plus NULL/blocker/CHECK edge cases. Why: the prior matrix exercised fixed pivots only; property tests catch operator/oracle disagreements across the whole value space. ([CIP-3141](https://linear.app/cipherstash/issue/CIP-3141)) +- **Property-based tests for the `eql_v3` encrypted scalar domains.** A three-tier harness asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust catalog-invariant tier (no database), a fixture-corpus tier that samples the live-encrypted fixtures and checks all ordered pairs in each sampled corpus, and a live-encryption tier (gated behind the `proptest-live` cargo feature) that batch-encrypts freshly generated plaintexts each run. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) oracles plus NULL/blocker/CHECK edge cases. Why: the prior matrix exercised fixed pivots only; property tests catch operator/oracle disagreements across the whole value space. ([#275](https://github.com/cipherstash/encrypt-query-language/pull/275)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) diff --git a/crates/eql-scalars/src/proptest_invariants.rs b/crates/eql-scalars/src/proptest_invariants.rs index 394487236..c4d1f4aec 100644 --- a/crates/eql-scalars/src/proptest_invariants.rs +++ b/crates/eql-scalars/src/proptest_invariants.rs @@ -95,15 +95,18 @@ proptest! { fn every_catalog_domain_payload_keys_match_its_terms() { for spec in CATALOG { for dom in spec.domains { - let keys = Term::term_json_keys(dom.terms); - // Each term contributes exactly its json_key; deduped. - for t in dom.terms { - assert!( - keys.contains(&t.json_key()), - "domain {} missing json key for {t:?}", - spec.domain_name(dom) - ); - } + // Exact set equality: the payload keys are precisely each term's + // json_key (deduped) — no missing keys and no extras. + let actual: std::collections::HashSet<&str> = + Term::term_json_keys(dom.terms).into_iter().collect(); + let expected: std::collections::HashSet<&str> = + dom.terms.iter().map(|t| t.json_key()).collect(); + assert_eq!( + actual, + expected, + "domain {} payload-key set mismatch", + spec.domain_name(dom) + ); } } } diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 78ef7d54b..c8880e397 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -162,6 +162,18 @@ pub async fn assert_ord_oracle( Ok(()) } +/// Replace any `user:password@` userinfo in a connection URL with `***@` so it +/// is safe to put in error context / logs (the password never appears). +fn redact_url(url: &str) -> String { + match url.split_once("://") { + Some((scheme, rest)) => match rest.rsplit_once('@') { + Some((_userinfo, host)) => format!("{scheme}://***@{host}"), + None => format!("{scheme}://{rest}"), + }, + None => "".to_string(), + } +} + /// Connect to the shared SQLx test database. Reads `DATABASE_URL`, falling back /// to the documented local default (`localhost:7432`, cipherstash/password). /// Used by the proptest tiers, which cannot use `#[sqlx::test]`'s injected pool @@ -172,5 +184,6 @@ pub async fn connect_pool() -> Result { }); PgPool::connect(&url) .await - .with_context(|| format!("connecting property-test pool to {url}")) + // Redact userinfo so a connection failure never logs the password. + .with_context(|| format!("connecting property-test pool to {}", redact_url(&url))) } diff --git a/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs index 035b330be..b22451f9e 100644 --- a/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs @@ -25,6 +25,15 @@ where { let config = column_config_for(&[IndexKind::Unique, IndexKind::Ore], cast)?; let payloads = encrypt_store(pool_table, "payload", values, &config).await?; + // Fail fast on a count mismatch: a silent `zip` truncation would weaken the + // oracle (fewer pairs than intended) and hide an encrypt_store contract + // regression. (encrypt_store already checks this, but keep it local/explicit.) + anyhow::ensure!( + payloads.len() == values.len(), + "encrypt_store returned {} payloads for {} plaintext values", + payloads.len(), + values.len() + ); Ok(values .iter() .cloned() From 5e85c72e0457a23e1e260b09a43517fd38ced419 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 17 Jun 2026 12:42:45 +1000 Subject: [PATCH 236/599] fix(tests): pass token to Variant::supports_ord in assert_ord_oracle The eql_v3 rebase added a `token: &str` parameter to `Variant::supports_ord`, but `assert_ord_oracle` still called it tokenless, so the eql_tests lib did not compile. Pass `T::PG_TYPE`. --- tests/sqlx/src/property.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index c8880e397..ccb0dd233 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -122,7 +122,7 @@ pub async fn assert_ord_oracle( rows: &[Row], ) -> Result<()> { assert!( - variant.supports_ord(), + variant.supports_ord(T::PG_TYPE), "assert_ord_oracle needs an ordered variant" ); let domain = ScalarDomainSpec::new::(variant).sql_domain; From a72274ed406a1bf9a2566400bc7d0bcdbd4fbe06 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 17 Jun 2026 22:22:04 +1000 Subject: [PATCH 237/599] fix(tests): embed Tier A fixture corpus at compile time so CI shards find it The fixture-oracle property tests loaded their corpus at runtime via std::fs::read_to_string keyed off CARGO_MANIFEST_DIR/fixtures/eql_v2_.sql. In CI's archive->shard split the test shards do a fresh checkout where those gitignored fixtures are absent, so int2/text (and every Tier A oracle test) failed with "No such file or directory". Only 3 surfaced because nextest fail-fast cancelled the shard after 93/518. Embed the fixture SQL into the test binary via include_str! at compile time, exactly like sqlx::test's scripts(...) does, so the corpus travels inside the prebuilt nextest archive. The embed lives in the fixture_oracle test target (not the eql_tests lib) so generate_all_fixtures still compiles before the fixtures exist. ensure_fixture_loaded now takes the script as a parameter. No CI or catalog changes. --- tests/sqlx/src/property.rs | 43 ++++++++++--------- .../property/fixture_oracle.rs | 26 ++++++++++- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index ccb0dd233..6917c201e 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -23,33 +23,36 @@ static FIXTURE_LOADED: OnceLock>> = OnceLock::new(); /// Materialise the live-encrypted fixture corpus for `T` into the connected DB. /// -/// The fixture `.sql` files (`tests/sqlx/fixtures/eql_v2_.sql`, regenerated -/// each `test:sqlx:prep`) are normally loaded only into `#[sqlx::test]`'s -/// ephemeral per-test databases. The property tiers connect to the shared test -/// DB directly (they cannot use `#[sqlx::test]`'s injected pool from a sync -/// `proptest!` body), so the corpus is not present there. This loads it on -/// demand: the script is self-contained and idempotent -/// (`CREATE SCHEMA IF NOT EXISTS` / `DROP TABLE IF EXISTS` / `CREATE` / -/// `INSERT`), and a process-wide async mutex guarantees exactly-once execution -/// per type across the parallel test threads (each driving its own runtime). -/// `CARGO_MANIFEST_DIR` resolves the path independent of the test's CWD. -pub async fn ensure_fixture_loaded(pool: &PgPool) -> Result<()> { +/// The fixture `.sql` files (`tests/sqlx/fixtures/eql_v2_.sql`) are normally +/// loaded only into `#[sqlx::test]`'s ephemeral per-test databases. The property +/// tiers connect to the shared test DB directly (they cannot use +/// `#[sqlx::test]`'s injected pool from a sync `proptest!` body), so the corpus +/// is not present there. This loads it on demand: the script is self-contained +/// and idempotent (`CREATE SCHEMA IF NOT EXISTS` / `DROP TABLE IF EXISTS` / +/// `CREATE` / `INSERT`), and a process-wide async mutex guarantees exactly-once +/// execution per type across the parallel test threads (each driving its own +/// runtime). +/// +/// `script` is the fixture SQL, passed in by the caller. It is `include_str!`- +/// embedded into the test binary at compile time (see `fixture_oracle.rs`) so it +/// travels inside the prebuilt nextest archive that CI shards run from — those +/// shards do a fresh checkout where the gitignored `.sql` files are absent, so a +/// runtime `std::fs` read would fail there. +pub async fn ensure_fixture_loaded(pool: &PgPool, script: &str) -> Result<()> { let guard = FIXTURE_LOADED.get_or_init(|| Mutex::new(HashSet::new())); let mut loaded = guard.lock().await; if loaded.contains(T::PG_TYPE) { return Ok(()); } - let path = format!( - "{}/fixtures/eql_v2_{}.sql", - env!("CARGO_MANIFEST_DIR"), - T::PG_TYPE - ); - let script = std::fs::read_to_string(&path) - .with_context(|| format!("reading fixture script {path} (run test:sqlx:prep first)"))?; - sqlx::raw_sql(&script) + sqlx::raw_sql(script) .execute(pool) .await - .with_context(|| format!("loading fixture corpus into shared DB from {path}"))?; + .with_context(|| { + format!( + "loading fixture corpus for {} into shared DB", + T::PG_TYPE + ) + })?; loaded.insert(T::PG_TYPE); Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 581b45f65..343fcef54 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -17,11 +17,35 @@ use proptest::prelude::*; use proptest::test_runner::{Config, TestCaseError, TestRunner}; use sqlx::PgPool; +/// The fixture corpus SQL for `T`, `include_str!`-embedded into this test binary +/// at compile time (one arm per catalog token). Embedding rather than reading +/// from disk at runtime is what lets the prebuilt nextest archive carry the +/// corpus into CI shards, which do a fresh checkout where the gitignored +/// `tests/sqlx/fixtures/eql_v2_.sql` files are absent. The path resolves +/// against the `eql_tests` crate root (`tests/sqlx`). Mirrors the loud catch-all +/// of the `generate_for_token` fixture dispatch. +fn embedded_fixture_sql() -> &'static str { + match T::PG_TYPE { + "int4" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_int4.sql")), + "int2" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_int2.sql")), + "int8" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_int8.sql")), + "date" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_date.sql")), + "text" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_text.sql")), + "timestamptz" => { + include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_timestamptz.sql")) + } + other => panic!( + "no embedded fixture for catalog token '{other}'; \ + add an include_str! arm in fixture_oracle.rs" + ), + } +} + /// Read every `(plaintext, payload::text)` fixture row for `T`, in id order. /// Ensures the corpus is present in the shared DB first (it lives in /// `#[sqlx::test]`'s ephemeral DBs by default, not the pool we connect to). async fn load_fixture_rows(pool: &PgPool) -> Result>> { - ensure_fixture_loaded::(pool).await?; + ensure_fixture_loaded::(pool, embedded_fixture_sql::()).await?; let sql = format!( "SELECT plaintext, payload::text FROM {} ORDER BY id", T::fixture_table_name() From 021c998a281014495ebd7d60ad3e28e98708e71f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 11:24:19 +1000 Subject: [PATCH 238/599] style: cargo fmt property-test fixture helpers --- tests/sqlx/src/property.rs | 7 +---- .../property/fixture_oracle.rs | 30 +++++++++++++++---- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 6917c201e..fa8b153f9 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -47,12 +47,7 @@ pub async fn ensure_fixture_loaded(pool: &PgPool, script: &str) - sqlx::raw_sql(script) .execute(pool) .await - .with_context(|| { - format!( - "loading fixture corpus for {} into shared DB", - T::PG_TYPE - ) - })?; + .with_context(|| format!("loading fixture corpus for {} into shared DB", T::PG_TYPE))?; loaded.insert(T::PG_TYPE); Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 343fcef54..f5ff55296 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -26,13 +26,31 @@ use sqlx::PgPool; /// of the `generate_for_token` fixture dispatch. fn embedded_fixture_sql() -> &'static str { match T::PG_TYPE { - "int4" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_int4.sql")), - "int2" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_int2.sql")), - "int8" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_int8.sql")), - "date" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_date.sql")), - "text" => include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_text.sql")), + "int4" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_int4.sql" + )), + "int2" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_int2.sql" + )), + "int8" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_int8.sql" + )), + "date" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_date.sql" + )), + "text" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_text.sql" + )), "timestamptz" => { - include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_timestamptz.sql")) + include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_timestamptz.sql" + )) } other => panic!( "no embedded fixture for catalog token '{other}'; \ From 82c8e37315197129b6200f254d619d61aee2b1fd Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 12:33:11 +1000 Subject: [PATCH 239/599] test(v3): rename property-test tiers to catalog/fixture/e2e (CIP-3141) Replace the abstract 'Tier A/B/C' labels with concrete names matching what each suite does and where it lives: - Tier C -> catalog (unit, pure Rust, no DB) - Tier A -> fixture (integration, committed ciphertext) - Tier B -> e2e (integration, fresh ZeroKMS->Postgres each run) Full-depth rename: live_oracle.rs -> e2e_oracle.rs, cargo feature proptest-live -> proptest-e2e (Cargo.toml, mise.toml, #[cfg]), run_live_property -> run_e2e_property, *_oracle_live -> *_oracle_e2e, DB tables proptest_live_* -> proptest_e2e_*, plus all prose in comments, README, CHANGELOG and the implementation plan. Unrelated 'Tier 1/2' usages (benchmarks, pg_stat_statements, jsonb builders) left untouched. Test-only; no behaviour change. --- CHANGELOG.md | 2 +- crates/eql-scalars/Cargo.toml | 4 +-- crates/eql-scalars/src/proptest_invariants.rs | 6 ++-- mise.toml | 2 +- tests/sqlx/Cargo.toml | 14 ++++---- tests/sqlx/README.md | 7 ++-- tests/sqlx/src/property.rs | 13 ++++---- tests/sqlx/tests/encrypted_domain.rs | 6 ++-- .../{live_oracle.rs => e2e_oracle.rs} | 33 ++++++++++--------- .../property/fixture_oracle.rs | 2 +- .../tests/encrypted_domain/property/mod.rs | 8 ++--- 11 files changed, 50 insertions(+), 47 deletions(-) rename tests/sqlx/tests/encrypted_domain/property/{live_oracle.rs => e2e_oracle.rs} (84%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41780d122..cb65ef95d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) -- **Property-based tests for the `eql_v3` encrypted scalar domains.** A three-tier harness asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust catalog-invariant tier (no database), a fixture-corpus tier that samples the live-encrypted fixtures and checks all ordered pairs in each sampled corpus, and a live-encryption tier (gated behind the `proptest-live` cargo feature) that batch-encrypts freshly generated plaintexts each run. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) oracles plus NULL/blocker/CHECK edge cases. Why: the prior matrix exercised fixed pivots only; property tests catch operator/oracle disagreements across the whole value space. ([#275](https://github.com/cipherstash/encrypt-query-language/pull/275)) +- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that samples the committed fixture corpus (real ciphertext) and checks all ordered pairs in each sampled corpus, and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) oracles plus NULL/blocker/CHECK edge cases. Why: the prior matrix exercised fixed pivots only; property tests catch operator/oracle disagreements across the whole value space. ([#275](https://github.com/cipherstash/encrypt-query-language/pull/275)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) diff --git a/crates/eql-scalars/Cargo.toml b/crates/eql-scalars/Cargo.toml index 45a691af0..819adb221 100644 --- a/crates/eql-scalars/Cargo.toml +++ b/crates/eql-scalars/Cargo.toml @@ -15,7 +15,7 @@ workspace = true # Dev-only. proptest is NOT a runtime dependency: it never compiles on the SQL # build path (eql-codegen depends on eql-scalars' lib, not its tests), so the # "INTENTIONALLY no dependencies" rule above — which is about build-path deps — -# is preserved. Used by src/proptest_invariants.rs (Tier C catalog property -# tests, no DB, runs in the lean `mise run test:crates` / fork CI path). +# is preserved. Used by src/proptest_invariants.rs (the catalog suite of +# property tests, no DB, runs in the lean `mise run test:crates` / fork CI path). [dev-dependencies] proptest = "1" diff --git a/crates/eql-scalars/src/proptest_invariants.rs b/crates/eql-scalars/src/proptest_invariants.rs index c4d1f4aec..e5303a905 100644 --- a/crates/eql-scalars/src/proptest_invariants.rs +++ b/crates/eql-scalars/src/proptest_invariants.rs @@ -1,9 +1,9 @@ -//! Property-based invariants over the scalar/term catalog (CIP-3141, Tier C). +//! Catalog suite (CIP-3141): property-based invariants over the scalar/term catalog. //! //! Pure Rust — no database, no encryption, no creds. These run in the lean //! `cargo test -p eql-scalars` path (fork CI). They assert the *catalog* is -//! internally consistent for any generated input; the DB-backed oracle tiers -//! (A/B) live in `tests/sqlx`. +//! internally consistent for any generated input; the DB-backed oracle suites +//! (fixture/e2e) live in `tests/sqlx`. use crate::{ScalarKind, Term, CATALOG}; use proptest::prelude::*; diff --git a/mise.toml b/mise.toml index e74af6a08..e046912e2 100644 --- a/mise.toml +++ b/mise.toml @@ -86,7 +86,7 @@ depends = ["test:sqlx:prep"] dir = "{{config_root}}/tests/sqlx" run = """ echo "Running Rust tests..." -cargo test --features proptest-live +cargo test --features proptest-e2e """ [tasks."test:sqlx:watch"] diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 68121eae7..4695518e0 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -45,14 +45,14 @@ bench = [] # *usable*. Off by default to keep `mise run test` fast; CI runs with # `--features scale`. scale = [] -# Opt-in to the live-encryption property tests (Tier B, CIP-3141). They -# generate fresh random plaintexts each run and encrypt them via -# cipherstash-client, so they need the same CS_* creds as fixture generation. +# Opt-in to the e2e property suite (CIP-3141). It generates fresh random +# plaintexts each run and encrypts them end-to-end through ZeroKMS via +# cipherstash-client, so it needs the same CS_* creds as fixture generation. # `mise run test:sqlx` enables this (CI has the secrets). A bare `cargo test` -# without it compiles the live tier out, so credential-less quick runs and the -# lean crate path are unaffected. Tier A (fixture-corpus) and Tier C (catalog) -# are NOT gated — they need no fresh encryption. -proptest-live = [] +# without it compiles the e2e suite out, so credential-less quick runs and the +# lean crate path are unaffected. The fixture suite and the catalog suite are +# NOT gated — they need no fresh encryption. +proptest-e2e = [] # Opt-in to compiling the fixture generators. Without this feature the # `#[cfg(feature = "fixture-gen")]` generator tests do not exist, so # `cargo test` and CI never see them. Generators need a live Postgres and, diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index 80dc59e4e..6cb403502 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -276,8 +276,9 @@ Tests connect to PostgreSQL database configured by SQLx: - ✅ ~~Convert remaining SQL tests~~ **COMPLETE!** - Property-based tests: implemented in `tests/encrypted_domain/property/` and - `crates/eql-scalars/src/proptest_invariants.rs` (CIP-3141). Three tiers: - catalog invariants (no DB), fixture-corpus oracle, and live-encryption oracle - (`--features proptest-live`). + `crates/eql-scalars/src/proptest_invariants.rs` (CIP-3141). One unit-level + **catalog** suite (no DB) plus two integration suites — **fixture** (oracle + over the committed fixture corpus) and **e2e** (oracle over fresh end-to-end + encryption, `--features proptest-e2e`). - Performance benchmarks: Measure query performance with encrypted data - Integration tests: Test with CipherStash Proxy diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index fa8b153f9..70838e435 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -2,9 +2,10 @@ //! //! `assert_eq_oracle` / `assert_ord_oracle` take a corpus of //! `(plaintext, payload_json)` rows and check SQL operator results against the -//! plaintext oracle over every ordered pair. Tier A feeds them rows read from -//! the live-encrypted fixture; Tier B feeds them rows it batch-encrypts from -//! freshly generated plaintexts. The engine is identical for both. +//! plaintext oracle over every ordered pair. The fixture suite feeds them rows +//! read from the committed fixture corpus (real ciphertext); the e2e suite feeds +//! them rows it batch-encrypts from freshly generated plaintexts. The engine is +//! identical for both. //! //! Operator evaluation is read-only (`SELECT op `), so these helpers take //! a `&PgPool` and need no per-test schema isolation. @@ -21,11 +22,11 @@ use tokio::sync::Mutex; /// `fixtures.eql_v2_` table exactly once. static FIXTURE_LOADED: OnceLock>> = OnceLock::new(); -/// Materialise the live-encrypted fixture corpus for `T` into the connected DB. +/// Materialise the committed fixture corpus (real ciphertext) for `T` into the connected DB. /// /// The fixture `.sql` files (`tests/sqlx/fixtures/eql_v2_.sql`) are normally /// loaded only into `#[sqlx::test]`'s ephemeral per-test databases. The property -/// tiers connect to the shared test DB directly (they cannot use +/// suites connect to the shared test DB directly (they cannot use /// `#[sqlx::test]`'s injected pool from a sync `proptest!` body), so the corpus /// is not present there. This loads it on demand: the script is self-contained /// and idempotent (`CREATE SCHEMA IF NOT EXISTS` / `DROP TABLE IF EXISTS` / @@ -174,7 +175,7 @@ fn redact_url(url: &str) -> String { /// Connect to the shared SQLx test database. Reads `DATABASE_URL`, falling back /// to the documented local default (`localhost:7432`, cipherstash/password). -/// Used by the proptest tiers, which cannot use `#[sqlx::test]`'s injected pool +/// Used by the proptest suites, which cannot use `#[sqlx::test]`'s injected pool /// from a (sync) `proptest!` body. pub async fn connect_pool() -> Result { let url = std::env::var("DATABASE_URL").unwrap_or_else(|_| { diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 24157f9bd..19ae7dde3 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -34,8 +34,8 @@ mod signed; #[path = "encrypted_domain/jsonb_entry.rs"] mod jsonb_entry; -// Property-based + edge-case tests (CIP-3141). Three tiers under `property::`, -// kept outside `scalars::` so the matrix-inventory gate does not mis-read them -// as scalar types. See `encrypted_domain/property/mod.rs`. +// Property-based + edge-case tests (CIP-3141). Three suites under `property::` +// (catalog, fixture, e2e), kept outside `scalars::` so the matrix-inventory gate +// does not mis-read them as scalar types. See `encrypted_domain/property/mod.rs`. #[path = "encrypted_domain/property/mod.rs"] mod property; diff --git a/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs similarity index 84% rename from tests/sqlx/tests/encrypted_domain/property/live_oracle.rs rename to tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index b22451f9e..ba200f9de 100644 --- a/tests/sqlx/tests/encrypted_domain/property/live_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -1,6 +1,7 @@ -//! Tier B (CIP-3141): property tests over freshly generated, live-encrypted -//! values. Gated behind `proptest-live` (declared in property/mod.rs) — needs -//! CS_* creds, which `mise run test:sqlx` enables for CI/local full SQLx runs. +//! e2e suite (CIP-3141): property tests over freshly generated values encrypted +//! end-to-end through ZeroKMS each run. Gated behind `proptest-e2e` (declared in +//! property/mod.rs) — needs CS_* creds, which `mise run test:sqlx` enables for +//! CI/local full SQLx runs. //! Each proptest case generates one corpus of random integers — seeded with //! type-specific extremes, zero, and deliberate duplicates so the equality-true //! branch fires across distinct ciphertexts of the same plaintext — encrypts it @@ -47,7 +48,7 @@ where /// Drive proptest: each case is a corpus of integers. Generation is in-process; /// encryption + oracle is async on a current-thread runtime. -fn run_live_property( +fn run_e2e_property( table: &str, cast: Cast, cases: u32, @@ -64,9 +65,9 @@ where .build()?; let pool: PgPool = rt.block_on(connect_pool())?; - // Shrinking is disabled for the live tier: every failed shrink attempt would + // Shrinking is disabled for the e2e suite: every failed shrink attempt would // trigger another ZeroKMS batch, and ciphertext cannot be meaningfully - // shrunk anyway. Tier C keeps normal shrinking. + // shrunk anyway. The catalog suite keeps normal shrinking. let mut runner = TestRunner::new(Config { cases, max_shrink_iters: 0, @@ -102,14 +103,14 @@ where .map_err(|e| TestCaseError::fail(format!("oracle: {e}")))?; Ok(()) }) - .map_err(|e| anyhow::anyhow!("live property failed: {e}")) + .map_err(|e| anyhow::anyhow!("e2e property failed: {e}")) } #[test] -fn prop_int4_eq_and_ord_oracle_live() -> Result<()> { +fn prop_int4_eq_and_ord_oracle_e2e() -> Result<()> { // Low case count: each case is a ZeroKMS round trip. 8 keeps CI bounded. - run_live_property::( - "proptest_live_int4", + run_e2e_property::( + "proptest_e2e_int4", Cast::INT, 8, true, @@ -118,9 +119,9 @@ fn prop_int4_eq_and_ord_oracle_live() -> Result<()> { } #[test] -fn prop_int2_eq_and_ord_oracle_live() -> Result<()> { - run_live_property::( - "proptest_live_int2", +fn prop_int2_eq_and_ord_oracle_e2e() -> Result<()> { + run_e2e_property::( + "proptest_e2e_int2", Cast::SMALL_INT, 8, true, @@ -129,9 +130,9 @@ fn prop_int2_eq_and_ord_oracle_live() -> Result<()> { } #[test] -fn prop_int8_eq_and_ord_oracle_live() -> Result<()> { - run_live_property::( - "proptest_live_int8", +fn prop_int8_eq_and_ord_oracle_e2e() -> Result<()> { + run_e2e_property::( + "proptest_e2e_int8", Cast::BIG_INT, 8, true, diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index f5ff55296..d88b5dde5 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -1,4 +1,4 @@ -//! Tier A (CIP-3141): property tests over the real, committed fixture corpus. +//! fixture suite (CIP-3141): property tests over the real, committed fixture corpus. //! //! The fixture table `fixtures.eql_v2_` carries `(plaintext, payload)` rows //! encrypted by cipherstash-client during `test:sqlx:prep`. proptest selects a diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs index 22b036172..06a23901c 100644 --- a/tests/sqlx/tests/encrypted_domain/property/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -6,8 +6,8 @@ // NULL / blocker / CHECK-constraint unit tests. mod edge_cases; -// Tier A: oracle over the live-encrypted fixture corpus. +// fixture suite: oracle over the committed fixture corpus (real ciphertext). mod fixture_oracle; -// Tier B: oracle over freshly generated + batch-encrypted values. -#[cfg(feature = "proptest-live")] -mod live_oracle; +// e2e suite: oracle over freshly generated + batch-encrypted values. +#[cfg(feature = "proptest-e2e")] +mod e2e_oracle; From 1693f2f79d7e16798278468e503c4fbf04e662b6 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 12:40:18 +1000 Subject: [PATCH 240/599] docs(v3): document property-test suite structure (catalog/fixture/e2e) Add a README for the eql_v3 property tests describing the three suites, the shared all-pairs oracle engine, why ciphertext can't be Arbitrary-derived, and the conventions/footguns (not under scalars::, e2e gated behind proptest-e2e, shrinking disabled for e2e). Reference it from CLAUDE.md's Testing section. --- CLAUDE.md | 1 + .../tests/encrypted_domain/property/README.md | 109 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/property/README.md diff --git a/CLAUDE.md b/CLAUDE.md index 34149104b..be3a36056 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,6 +29,7 @@ This project uses `mise` for task management. Common commands: - Run SQLx tests directly: `mise run test:sqlx` - Run SQLx tests in watch mode: `mise run test:sqlx:watch` - Tests are located in `tests/sqlx/` using Rust and SQLx framework +- Property-based tests for the `eql_v3` encrypted scalar domains live in three suites — **catalog** (pure-Rust catalog invariants, no DB), **fixture** (oracle over committed ciphertext), and **e2e** (oracle over fresh end-to-end encryption, gated behind the `proptest-e2e` cargo feature). The structure, the shared all-pairs oracle engine, and the conventions/footguns (e.g. why they must not live under `scalars::`) are documented in `tests/sqlx/tests/encrypted_domain/property/README.md`. - Verify the scalar matrix coverage snapshot: `mise run test:matrix:inventory` (no database required). ONE committed `tests/sqlx/snapshots/matrix_tests.txt` baseline pins the token-normalized set of `scalars::::*` test names so a silently dropped/renamed/`#[cfg]`-gated test fails CI's `matrix-coverage` job. The task discovers the present scalar types from the test binary's `--list` and cross-checks them against `cargo run -p eql-codegen -- list-types`, so a catalog type missing its matrix wiring also fails. When you change which matrix tests the macro emits, regenerate and commit the single snapshot in the same change. See `tests/sqlx/snapshots/README.md`. ### Build System diff --git a/tests/sqlx/tests/encrypted_domain/property/README.md b/tests/sqlx/tests/encrypted_domain/property/README.md new file mode 100644 index 000000000..08edb64aa --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/property/README.md @@ -0,0 +1,109 @@ +# Property-based tests for the `eql_v3` encrypted scalar domains + +These tests assert that SQL operator results on the `eql_v3` encrypted-domain +types agree with a **plaintext oracle** across a *generated* input space — the +fixed-pivot scalar matrix only checks hand-picked values, so property tests are +what catch operator/oracle disagreements across the whole value space. Origin: +CIP-3141. + +## The three suites + +The harness is **one unit-level suite plus two integration suites**. They are +named for what they operate on, not by an abstract tier letter: + +| Suite | Location | Kind | Inputs | DB / creds | +|-------|----------|------|--------|------------| +| **catalog** | [`crates/eql-scalars/src/proptest_invariants.rs`](../../../../../crates/eql-scalars/src/proptest_invariants.rs) | unit (pure Rust) | generated terms / kinds | none — runs in fork CI | +| **fixture** | [`fixture_oracle.rs`](./fixture_oracle.rs) | integration | committed fixture corpus (real ciphertext) | shared test DB | +| **e2e** | [`e2e_oracle.rs`](./e2e_oracle.rs) | integration | freshly generated plaintexts, encrypted each run | shared test DB **+ ZeroKMS creds** | + +Plus [`edge_cases.rs`](./edge_cases.rs): example-based unit tests for +NULL propagation, blockers raising on unsupported operators (including the +native-`jsonb` `->`/`@>` domain-fallback paths), `timestamptz` ordering +deferral, and CHECK rejection of malformed payloads. + +### catalog — catalog invariants, no database + +Pure-Rust `proptest` over the `eql-scalars` catalog: term/operator/extractor +consistency, "every blocker is non-`STRICT` + `plpgsql`", payload-key set == +declared terms, integer-range ordering. No DB, no encryption, no creds, so it +runs in the lean `cargo test -p eql-scalars` path (and on fork PRs). This is the +only suite where `proptest` shrinking is meaningful and enabled. + +### fixture — oracle over committed ciphertext + +Runs the shared all-pairs oracle engine over the real, committed fixture corpus +(`fixtures.eql_v2_.sql`, generated by `cipherstash-client` during +`mise run test:sqlx:prep`). `proptest` selects a sub-multiset of fixture rows +(with repeats), and the engine checks **every ordered pair**. No new encryption, +so it runs whenever the fixtures are present, and it generalises across the whole +catalog for free (every fixtured type gets an `eq_oracle`, ordered types also get +an `ord_oracle`). + +### e2e — oracle over fresh end-to-end encryption + +Same oracle engine, but each case **generates fresh random plaintexts and +encrypts them end-to-end through ZeroKMS** (one batched call per case) before +querying. Gated behind the `proptest-e2e` cargo feature — `mise run test:sqlx` +enables it (CI has the secrets); a bare `cargo test` compiles it out. It is the +**only** suite that can exercise "same plaintext, *different* ciphertext" +(equality across independently-encrypted values), because the committed fixture +corpus has no duplicate plaintexts. Integer scalars only for now (random `T` +generation is trivial for integers). + +## The shared oracle engine + +`assert_eq_oracle` / `assert_ord_oracle` in +[`../../../src/property.rs`](../../../src/property.rs) take a corpus of +`(plaintext, payload_json)` rows and check, over every ordered pair, that: + +- `=` / `<>` on the `_eq` domain agree with plaintext `==` / `!=`, and +- (ordered domains) `<` `<=` `>` `>=` and `ord_term` sort order agree with the + plaintext comparison. + +The fixture and e2e suites differ only in **where the rows come from**; the +engine is identical. + +## Why ciphertext can't be `Arbitrary`-derived + +A valid payload's `hm`/`ob` terms are real ciphertext from `cipherstash-client` +(`encrypt_eql`), which needs a live ZeroKMS handshake — there is no offline/mock +cipher. `proptest` can only generate **plaintexts**; turning them into payloads +means encrypting them. That is exactly why there are two integration suites: the +fixture suite reuses already-encrypted values, and the e2e suite pays for fresh +encryption to reach inputs the fixtures can't. + +## Conventions and footguns + +- **Never put these tests under a `scalars::` module.** `mise run test:matrix:inventory` + discovers scalar types from every `scalars::::` test-name prefix, so a + `scalars::property::…` test would be mis-read as a scalar type and break the + catalog cross-check. They live under `property::` for this reason. +- **The e2e suite is gated behind `proptest-e2e`.** Keep it that way so a + credential-less `cargo test` (and the lean crate path) still compiles. +- **The e2e suite disables shrinking and failure persistence.** Every shrink + attempt would burn another ZeroKMS batch, ciphertext can't be meaningfully + shrunk, and fresh-each-run ciphertext can't be replayed. +- **proptest + async bridge.** The `proptest!` body is sync; the DB-backed suites + run their async oracle on a per-case current-thread `tokio` runtime and connect + via `connect_pool()` (they cannot use `#[sqlx::test]`'s injected pool from a + sync body). Operator evaluation is read-only `SELECT`, so no per-test schema + isolation is needed. +- **Equality-true must actually fire.** Random integer pairs almost never + collide, so the e2e corpus injects deliberate duplicate plaintexts (plus signed + extremes and zero) to exercise the `a == b ⇒ eq` branch across distinct + ciphertexts. + +## Running + +```bash +# catalog suite only (no DB, no creds) +cargo test -p eql-scalars proptest_invariants + +# fixture + edge-case suites (needs a prepared DB) +mise run test:sqlx:prep +cd tests/sqlx && cargo test --test encrypted_domain property::fixture_oracle property::edge_cases + +# all suites incl. e2e (needs DB + CS_* creds) +mise run test:sqlx # enables --features proptest-e2e +``` From 19baf530564494d84d954712487924846e5c9059 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 14:46:40 +1000 Subject: [PATCH 241/599] fix(tests): self-install eql_v3 in property suites so CI shards pass (CIP-3141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fixture/e2e property oracles connect via connect_pool() to the base DATABASE_URL database, not through #[sqlx::test]'s migrated per-test scratch DBs. Under the sharded build-once-archive CI, a shard's base DB is a stock Postgres with no EQL installed (only build-archive ran `sqlx migrate run`, against a different Postgres), so every `::eql_v3._eq` cast raised `schema "eql_v3" does not exist`. The old per-version CI happened to install EQL into the base DB via test:sqlx:prep's migrate step, which the suites silently relied on; the rebase onto the new CI removed that, turning the suites red. (The failures looked type-specific — int2/int8/text/date/ timestamptz — but that was just nextest fail-fast + shard distribution; the error is type-agnostic, int4 included.) Make the suites self-sufficient: ensure_eql_installed() applies the embedded 001_install_eql.sql installer to the connected DB on first use, guarded by a once-per-process async mutex and an `eql_v3.int4_eq` presence check (so a developer's pre-installed local DB is left untouched — the installer is not idempotent). The installer is include_str!'d in the test target (mod.rs), the same archive-travel mechanism the fixture corpus uses, kept out of the lib so clippy/test:crates contexts don't need the generated file. Also stop swallowing the real Postgres error: the proptest runners rendered anyhow errors with {e}/to_string(), dropping the cause chain and leaving only the "pair query: SELECT …" context line — which is what made this opaque in CI. Render with {e:#} to keep the full chain. Verified: against a fresh DB with no eql_v3, all 11 fixture_oracle tests (including the ones that failed in CI) now pass and the surface is installed on demand; against an already-installed DB the presence check skips the install. --- tests/sqlx/src/property.rs | 46 +++++++++++++++++++ .../encrypted_domain/property/e2e_oracle.rs | 13 ++++-- .../property/fixture_oracle.rs | 11 ++++- .../tests/encrypted_domain/property/mod.rs | 13 ++++++ 4 files changed, 78 insertions(+), 5 deletions(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 70838e435..2351c2026 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -22,6 +22,52 @@ use tokio::sync::Mutex; /// `fixtures.eql_v2_` table exactly once. static FIXTURE_LOADED: OnceLock>> = OnceLock::new(); +/// Per-process guard ensuring the EQL surface (the `eql_v3` schema the oracle +/// queries cast to) is installed into the connected DB exactly once. +static EQL_INSTALLED: OnceLock> = OnceLock::new(); + +/// Ensure the EQL surface (the `eql_v3` schema + scalar domains/operators the +/// oracle queries cast to) is present in the DB behind `pool`. +/// +/// The property suites connect via `connect_pool()` to the base test database +/// (`DATABASE_URL`), NOT through `#[sqlx::test]`'s migrated per-test scratch +/// DBs. In a CI shard that base DB is a stock Postgres with no EQL installed — +/// only the `build-archive` job ran `sqlx migrate run`, and against a different +/// Postgres — so every `::eql_v3._eq` cast would raise +/// `schema "eql_v3" does not exist`. This installs the surface on demand so the +/// suites are self-sufficient regardless of where they run (CI shard, local, +/// fork), instead of silently depending on a pre-installed base DB. +/// +/// `install_sql` is the EQL installer (`migrations/001_install_eql.sql`), +/// `include_str!`-embedded into the test binary at compile time (see +/// `property/mod.rs`) so it travels inside the prebuilt nextest archive — the +/// same mechanism the fixture corpus uses. A process-wide async mutex +/// guarantees exactly-once execution across the parallel proptest threads, and +/// a presence check (`eql_v3.int4_eq`) skips the install when the DB already +/// has the surface (a developer's pre-installed local DB), where re-running the +/// non-idempotent installer would error on duplicate objects. +pub async fn ensure_eql_installed(pool: &PgPool, install_sql: &str) -> Result<()> { + let guard = EQL_INSTALLED.get_or_init(|| Mutex::new(false)); + let mut installed = guard.lock().await; + if *installed { + return Ok(()); + } + // Presence check: skip the installer if the surface is already there. int4 + // is the reference scalar type and is always part of the surface. + let present: bool = sqlx::query_scalar("SELECT to_regtype('eql_v3.int4_eq') IS NOT NULL") + .fetch_one(pool) + .await + .context("probing for an existing eql_v3 install")?; + if !present { + sqlx::raw_sql(install_sql) + .execute(pool) + .await + .context("installing the EQL surface into the property-test DB")?; + } + *installed = true; + Ok(()) +} + /// Materialise the committed fixture corpus (real ciphertext) for `T` into the connected DB. /// /// The fixture `.sql` files (`tests/sqlx/fixtures/eql_v2_.sql`) are normally diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index ba200f9de..01b0be386 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -11,7 +11,9 @@ use anyhow::Result; use eql_tests::fixtures::cipherstash::{column_config_for, encrypt_store}; use eql_tests::fixtures::eql_plaintext::{Cast, EqlPlaintext}; use eql_tests::fixtures::index_kind::IndexKind; -use eql_tests::property::{assert_eq_oracle, assert_ord_oracle, connect_pool, Row}; +use eql_tests::property::{ + assert_eq_oracle, assert_ord_oracle, connect_pool, ensure_eql_installed, Row, +}; use eql_tests::scalar_domains::ScalarType; use eql_tests::scalar_domains::Variant; use proptest::prelude::*; @@ -64,6 +66,9 @@ where .enable_all() .build()?; let pool: PgPool = rt.block_on(connect_pool())?; + // The base DB this pool connects to is not migrated by `#[sqlx::test]`; in a + // CI shard it has no `eql_v3` surface, so install it before any cast/query. + rt.block_on(ensure_eql_installed(&pool, super::EQL_INSTALL_SQL))?; // Shrinking is disabled for the e2e suite: every failed shrink attempt would // trigger another ZeroKMS batch, and ciphertext cannot be meaningfully @@ -91,7 +96,9 @@ where values.push(dup1); let rows = rt .block_on(encrypt_rows::(table, cast, &values)) - .map_err(|e| TestCaseError::fail(format!("encrypt: {e}")))?; + // `{e:#}` keeps anyhow's full cause chain (the underlying error), + // which a plain `{e}` would drop. + .map_err(|e| TestCaseError::fail(format!("encrypt: {e:#}")))?; rt.block_on(async { assert_eq_oracle::(&pool, &rows).await?; if ordered { @@ -100,7 +107,7 @@ where } Ok::<_, anyhow::Error>(()) }) - .map_err(|e| TestCaseError::fail(format!("oracle: {e}")))?; + .map_err(|e| TestCaseError::fail(format!("oracle: {e:#}")))?; Ok(()) }) .map_err(|e| anyhow::anyhow!("e2e property failed: {e}")) diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index d88b5dde5..23016d546 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -10,7 +10,8 @@ use anyhow::Result; use eql_tests::property::{ - assert_eq_oracle, assert_ord_oracle, connect_pool, ensure_fixture_loaded, Row, + assert_eq_oracle, assert_ord_oracle, connect_pool, ensure_eql_installed, ensure_fixture_loaded, + Row, }; use eql_tests::scalar_domains::{ScalarType, Variant}; use proptest::prelude::*; @@ -63,6 +64,9 @@ fn embedded_fixture_sql() -> &'static str { /// Ensures the corpus is present in the shared DB first (it lives in /// `#[sqlx::test]`'s ephemeral DBs by default, not the pool we connect to). async fn load_fixture_rows(pool: &PgPool) -> Result>> { + // The base DB this pool connects to is not migrated by `#[sqlx::test]`; in a + // CI shard it has no `eql_v3` surface, so install it before any cast/query. + ensure_eql_installed(pool, super::EQL_INSTALL_SQL).await?; ensure_fixture_loaded::(pool, embedded_fixture_sql::()).await?; let sql = format!( "SELECT plaintext, payload::text FROM {} ORDER BY id", @@ -118,7 +122,10 @@ where .run(&strategy, |idxs| { let corpus = pick(&all, &idxs); rt.block_on(oracle(pool.clone(), corpus)) - .map_err(|e| TestCaseError::fail(e.to_string()))?; + // `{e:#}` renders anyhow's full cause chain inline; plain + // `to_string()` drops it, hiding the real Postgres error (e.g. + // `schema "eql_v3" does not exist`) behind only the context line. + .map_err(|e| TestCaseError::fail(format!("{e:#}")))?; Ok(()) }) .map_err(|e| anyhow::anyhow!("fixture property failed: {e}")) diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs index 06a23901c..df7df6a80 100644 --- a/tests/sqlx/tests/encrypted_domain/property/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -4,6 +4,19 @@ //! `scalars::::` test-name prefix, so a `scalars::property::…` test would be //! mis-read as a scalar type and break the catalog cross-check. +/// The EQL installer (`migrations/001_install_eql.sql`, the full release), +/// embedded at compile time so the property suites can install the `eql_v3` +/// surface into their base DB on demand (see `property::ensure_eql_installed`). +/// Same embed-into-the-archive rationale as the per-type fixture corpus in +/// `fixture_oracle.rs`: the file is produced by `test:sqlx:prep` before the +/// nextest archive is built, and the CI shards run from that archive without a +/// checkout of the gitignored generated SQL. The path resolves against the +/// `eql_tests` crate root (`tests/sqlx`). +pub(crate) const EQL_INSTALL_SQL: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/migrations/001_install_eql.sql" +)); + // NULL / blocker / CHECK-constraint unit tests. mod edge_cases; // fixture suite: oracle over the committed fixture corpus (real ciphertext). From 153dfa38cac77c38d50b17c926c1cf43badc62da Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 17:30:25 +1000 Subject: [PATCH 242/599] fix(tests): install eql_v3 via sqlx Migrator, not a hand-rolled installer (CIP-3141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit c012fdc made the property suites self-install eql_v3 with an embedded copy of the release SQL guarded by a hand-rolled advisory lock. That raced: nextest runs each test in its OWN process, several hit the empty shard DB at once, and concurrent `CREATE SCHEMA eql_v3` failed with `duplicate key … pg_namespace`. The lock attempt was reinventing — incorrectly — what sqlx already does. Use the real thing: `ensure_eql_installed` now runs `sqlx::migrate!("./migrations")` against the base pool — the SAME embedded migration set `#[sqlx::test]` applies to every other test in the suite. `Migrator::run` records applied versions in `_sqlx_migrations` and skips them (idempotent, so a developer's pre-migrated local DB is a no-op) and holds a database-level advisory lock for the run, so the per-test processes serialise: exactly one applies each migration, the rest observe it already applied. No bespoke installer, no bespoke lock. The migrator is built in the test target (property/mod.rs `migrator()`) so the lib never embeds the gitignored generated `001_install_eql.sql`. Keeps the `{e:#}` change from c012fdc that surfaces anyhow's cause chain (it is what revealed the duplicate-key error in the first place). Compiles clean; CI's sharded nextest run (process-per-test) is the verification that the migrator serialises the concurrent install. --- tests/sqlx/src/property.rs | 59 +++++++------------ .../encrypted_domain/property/e2e_oracle.rs | 5 +- .../property/fixture_oracle.rs | 5 +- .../tests/encrypted_domain/property/mod.rs | 24 ++++---- 4 files changed, 38 insertions(+), 55 deletions(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 2351c2026..5bdc31fdd 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -22,49 +22,30 @@ use tokio::sync::Mutex; /// `fixtures.eql_v2_` table exactly once. static FIXTURE_LOADED: OnceLock>> = OnceLock::new(); -/// Per-process guard ensuring the EQL surface (the `eql_v3` schema the oracle -/// queries cast to) is installed into the connected DB exactly once. -static EQL_INSTALLED: OnceLock> = OnceLock::new(); - -/// Ensure the EQL surface (the `eql_v3` schema + scalar domains/operators the -/// oracle queries cast to) is present in the DB behind `pool`. +/// Apply the SQLx migrations (the EQL install in `001_install_eql.sql`, plus the +/// regression-data migrations) to the DB behind `pool`. /// /// The property suites connect via `connect_pool()` to the base test database -/// (`DATABASE_URL`), NOT through `#[sqlx::test]`'s migrated per-test scratch -/// DBs. In a CI shard that base DB is a stock Postgres with no EQL installed — -/// only the `build-archive` job ran `sqlx migrate run`, and against a different -/// Postgres — so every `::eql_v3._eq` cast would raise -/// `schema "eql_v3" does not exist`. This installs the surface on demand so the -/// suites are self-sufficient regardless of where they run (CI shard, local, -/// fork), instead of silently depending on a pre-installed base DB. +/// (`DATABASE_URL`) rather than through `#[sqlx::test]`'s migrated per-test +/// scratch DBs, because their proptest case loop is synchronous and cannot take +/// `#[sqlx::test]`'s injected pool. In a CI shard that base DB is a stock +/// Postgres with no EQL installed, so every `::eql_v3._eq` cast would raise +/// `schema "eql_v3" does not exist`. This brings the base DB up to the same +/// migrated state the rest of the suite gets for free. /// -/// `install_sql` is the EQL installer (`migrations/001_install_eql.sql`), -/// `include_str!`-embedded into the test binary at compile time (see -/// `property/mod.rs`) so it travels inside the prebuilt nextest archive — the -/// same mechanism the fixture corpus uses. A process-wide async mutex -/// guarantees exactly-once execution across the parallel proptest threads, and -/// a presence check (`eql_v3.int4_eq`) skips the install when the DB already -/// has the surface (a developer's pre-installed local DB), where re-running the -/// non-idempotent installer would error on duplicate objects. -pub async fn ensure_eql_installed(pool: &PgPool, install_sql: &str) -> Result<()> { - let guard = EQL_INSTALLED.get_or_init(|| Mutex::new(false)); - let mut installed = guard.lock().await; - if *installed { - return Ok(()); - } - // Presence check: skip the installer if the surface is already there. int4 - // is the reference scalar type and is always part of the surface. - let present: bool = sqlx::query_scalar("SELECT to_regtype('eql_v3.int4_eq') IS NOT NULL") - .fetch_one(pool) +/// `migrator` is `sqlx::migrate!("./migrations")` — the SAME embedded migration +/// set `#[sqlx::test]` runs, passed in from the test binary so the lib does not +/// embed the (gitignored, generated) migration files. `Migrator::run` is +/// idempotent (it records applied versions in `_sqlx_migrations` and skips +/// them) and process-safe (it takes a database-level advisory lock for the +/// duration), so the separate OS processes nextest runs each test in serialise +/// correctly — exactly one applies each migration, the rest observe it already +/// applied. A developer's already-migrated local DB is a no-op. +pub async fn ensure_eql_installed(pool: &PgPool, migrator: &sqlx::migrate::Migrator) -> Result<()> { + migrator + .run(pool) .await - .context("probing for an existing eql_v3 install")?; - if !present { - sqlx::raw_sql(install_sql) - .execute(pool) - .await - .context("installing the EQL surface into the property-test DB")?; - } - *installed = true; + .context("applying EQL migrations to the property-test DB")?; Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index 01b0be386..0d67c8010 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -67,8 +67,9 @@ where .build()?; let pool: PgPool = rt.block_on(connect_pool())?; // The base DB this pool connects to is not migrated by `#[sqlx::test]`; in a - // CI shard it has no `eql_v3` surface, so install it before any cast/query. - rt.block_on(ensure_eql_installed(&pool, super::EQL_INSTALL_SQL))?; + // CI shard it has no `eql_v3` surface, so apply the migrations (idempotent + + // process-safe via the migrator's advisory lock) before any cast/query. + rt.block_on(ensure_eql_installed(&pool, &super::migrator()))?; // Shrinking is disabled for the e2e suite: every failed shrink attempt would // trigger another ZeroKMS batch, and ciphertext cannot be meaningfully diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 23016d546..8ab9f203e 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -65,8 +65,9 @@ fn embedded_fixture_sql() -> &'static str { /// `#[sqlx::test]`'s ephemeral DBs by default, not the pool we connect to). async fn load_fixture_rows(pool: &PgPool) -> Result>> { // The base DB this pool connects to is not migrated by `#[sqlx::test]`; in a - // CI shard it has no `eql_v3` surface, so install it before any cast/query. - ensure_eql_installed(pool, super::EQL_INSTALL_SQL).await?; + // CI shard it has no `eql_v3` surface, so apply the migrations (idempotent + + // process-safe via the migrator's advisory lock) before any cast/query. + ensure_eql_installed(pool, &super::migrator()).await?; ensure_fixture_loaded::(pool, embedded_fixture_sql::()).await?; let sql = format!( "SELECT plaintext, payload::text FROM {} ORDER BY id", diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs index df7df6a80..5cbd719df 100644 --- a/tests/sqlx/tests/encrypted_domain/property/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -4,18 +4,18 @@ //! `scalars::::` test-name prefix, so a `scalars::property::…` test would be //! mis-read as a scalar type and break the catalog cross-check. -/// The EQL installer (`migrations/001_install_eql.sql`, the full release), -/// embedded at compile time so the property suites can install the `eql_v3` -/// surface into their base DB on demand (see `property::ensure_eql_installed`). -/// Same embed-into-the-archive rationale as the per-type fixture corpus in -/// `fixture_oracle.rs`: the file is produced by `test:sqlx:prep` before the -/// nextest archive is built, and the CI shards run from that archive without a -/// checkout of the gitignored generated SQL. The path resolves against the -/// `eql_tests` crate root (`tests/sqlx`). -pub(crate) const EQL_INSTALL_SQL: &str = include_str!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/migrations/001_install_eql.sql" -)); +/// The embedded SQLx migration set (`tests/sqlx/migrations`) — the SAME one +/// `#[sqlx::test]` applies to its scratch DBs. The property suites connect to +/// the base DB directly (their proptest case loop is sync and can't take +/// `#[sqlx::test]`'s injected pool), so they apply this themselves to reach the +/// migrated state the rest of the suite gets for free (see +/// `property::ensure_eql_installed`). The macro embeds the files at compile +/// time and resolves `./migrations` against the `eql_tests` crate root +/// (`tests/sqlx`); kept in the test target, not the lib, so the lib never +/// embeds the gitignored generated `001_install_eql.sql`. +pub(crate) fn migrator() -> sqlx::migrate::Migrator { + sqlx::migrate!("./migrations") +} // NULL / blocker / CHECK-constraint unit tests. mod edge_cases; From e9ac25e85584765fb52a55ace73b9533d6a54ee0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 19:12:13 +1000 Subject: [PATCH 243/599] fix(tests): run fixture_oracle under #[sqlx::test] for per-test DB isolation (CIP-3141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fixture property suite connected to one shared base DB via connect_pool(). nextest runs each test in its own process, so sibling tests raced on every shared write: first the eql_v3 install (CREATE SCHEMA eql_v3), then — once the migrator fixed that — the fixture load (CREATE SCHEMA IF NOT EXISTS fixtures, which is not concurrency-safe in Postgres), plus a load-vs-read hazard where a later test re-DROP/CREATEs a fixture table out from under an earlier test's in-flight oracle SELECTs. Locking each write was whack-a-mole on a shared-DB design every other test in the suite avoids. Run each fixture property under #[sqlx::test] instead, like the rest of the suite (incl. the sibling edge_cases.rs): each test gets its own migrated scratch DB (eql_v3 already installed) and loads the committed fixture corpus into that isolated DB. No shared state, no install-on-demand, no advisory locks, no load-vs-read hazard — the whole race class is gone. proptest's case loop is synchronous and can't take #[sqlx::test]'s injected async pool, which is why the suite used a raw pool originally. `drive_proptest` bridges them: the proptest runner lives on a dedicated OS thread that ships each generated case to the async side over a channel and blocks for the verdict; the async side runs the oracle on the injected pool and replies. The pool never crosses runtimes, it works under any runtime flavour, and shrinking is preserved. The e2e suite is unchanged: it batch-encrypts via ZeroKMS, runs single-process (gated behind proptest-e2e, not in the nextest shards), and keeps using connect_pool + the migrator (now gated to that feature so it isn't dead code in the default shard build). Removed the now-unused ensure_fixture_loaded + its per-process guard from the lib. Verified: all 11 fixture_oracle tests pass under `cargo nextest run` (process-per-test, the model that failed in CI). --- tests/sqlx/src/property.rs | 67 ++---- .../property/fixture_oracle.rs | 205 +++++++++++------- .../tests/encrypted_domain/property/mod.rs | 17 +- 3 files changed, 154 insertions(+), 135 deletions(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 5bdc31fdd..a3603294b 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -7,40 +7,32 @@ //! them rows it batch-encrypts from freshly generated plaintexts. The engine is //! identical for both. //! -//! Operator evaluation is read-only (`SELECT op `), so these helpers take -//! a `&PgPool` and need no per-test schema isolation. +//! Operator evaluation is read-only (`SELECT op `); the fixture suite +//! runs each property under `#[sqlx::test]` (its own migrated scratch DB), while +//! the e2e suite (single-process, feature-gated) uses a shared pool brought up +//! to the migrated state by `ensure_eql_installed`. use crate::scalar_domains::{ScalarDomainSpec, ScalarType, Variant}; use anyhow::{Context, Result}; use sqlx::PgPool; -use std::collections::HashSet; -use std::sync::OnceLock; -use tokio::sync::Mutex; - -/// Per-process record of which fixture corpora have been materialised into the -/// shared connection's DB, so concurrent property-test threads load each -/// `fixtures.eql_v2_` table exactly once. -static FIXTURE_LOADED: OnceLock>> = OnceLock::new(); /// Apply the SQLx migrations (the EQL install in `001_install_eql.sql`, plus the /// regression-data migrations) to the DB behind `pool`. /// -/// The property suites connect via `connect_pool()` to the base test database -/// (`DATABASE_URL`) rather than through `#[sqlx::test]`'s migrated per-test -/// scratch DBs, because their proptest case loop is synchronous and cannot take -/// `#[sqlx::test]`'s injected pool. In a CI shard that base DB is a stock -/// Postgres with no EQL installed, so every `::eql_v3._eq` cast would raise -/// `schema "eql_v3" does not exist`. This brings the base DB up to the same -/// migrated state the rest of the suite gets for free. +/// Used by the e2e suite, which connects via `connect_pool()` to the base test +/// database (`DATABASE_URL`) rather than through `#[sqlx::test]`'s migrated +/// scratch DBs — its proptest case loop is synchronous and it batch-encrypts via +/// ZeroKMS, so it owns a long-lived pool. It runs single-process (gated behind +/// `proptest-e2e`, not in the nextest shards), so the shared DB is fine. The +/// fixture suite does NOT use this — it is a `#[sqlx::test]` and gets a migrated +/// DB for free. /// /// `migrator` is `sqlx::migrate!("./migrations")` — the SAME embedded migration /// set `#[sqlx::test]` runs, passed in from the test binary so the lib does not /// embed the (gitignored, generated) migration files. `Migrator::run` is -/// idempotent (it records applied versions in `_sqlx_migrations` and skips -/// them) and process-safe (it takes a database-level advisory lock for the -/// duration), so the separate OS processes nextest runs each test in serialise -/// correctly — exactly one applies each migration, the rest observe it already -/// applied. A developer's already-migrated local DB is a no-op. +/// idempotent (records applied versions in `_sqlx_migrations` and skips them) +/// and holds a database-level advisory lock for the duration, so concurrent +/// callers serialise; a developer's already-migrated local DB is a no-op. pub async fn ensure_eql_installed(pool: &PgPool, migrator: &sqlx::migrate::Migrator) -> Result<()> { migrator .run(pool) @@ -49,37 +41,6 @@ pub async fn ensure_eql_installed(pool: &PgPool, migrator: &sqlx::migrate::Migra Ok(()) } -/// Materialise the committed fixture corpus (real ciphertext) for `T` into the connected DB. -/// -/// The fixture `.sql` files (`tests/sqlx/fixtures/eql_v2_.sql`) are normally -/// loaded only into `#[sqlx::test]`'s ephemeral per-test databases. The property -/// suites connect to the shared test DB directly (they cannot use -/// `#[sqlx::test]`'s injected pool from a sync `proptest!` body), so the corpus -/// is not present there. This loads it on demand: the script is self-contained -/// and idempotent (`CREATE SCHEMA IF NOT EXISTS` / `DROP TABLE IF EXISTS` / -/// `CREATE` / `INSERT`), and a process-wide async mutex guarantees exactly-once -/// execution per type across the parallel test threads (each driving its own -/// runtime). -/// -/// `script` is the fixture SQL, passed in by the caller. It is `include_str!`- -/// embedded into the test binary at compile time (see `fixture_oracle.rs`) so it -/// travels inside the prebuilt nextest archive that CI shards run from — those -/// shards do a fresh checkout where the gitignored `.sql` files are absent, so a -/// runtime `std::fs` read would fail there. -pub async fn ensure_fixture_loaded(pool: &PgPool, script: &str) -> Result<()> { - let guard = FIXTURE_LOADED.get_or_init(|| Mutex::new(HashSet::new())); - let mut loaded = guard.lock().await; - if loaded.contains(T::PG_TYPE) { - return Ok(()); - } - sqlx::raw_sql(script) - .execute(pool) - .await - .with_context(|| format!("loading fixture corpus for {} into shared DB", T::PG_TYPE))?; - loaded.insert(T::PG_TYPE); - Ok(()) -} - /// A single corpus entry: a plaintext and its EQL payload rendered as a JSON /// text literal (the `payload::text` form `fetch_fixture_payload` returns, or /// `serde_json::Value::to_string()` for a freshly encrypted value). diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 8ab9f203e..c79190d46 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -6,17 +6,24 @@ //! identical-ciphertext self-pairs) and the shared oracle engine checks every //! pair. No new encryption — runs whenever the fixtures are present. //! +//! Each test uses `#[sqlx::test]`, so it gets its OWN migrated scratch database +//! (the `eql_v3` surface is already installed by the embedded migrations) and +//! loads the fixture corpus into that isolated DB. This is what every other test +//! in the suite does; it avoids the shared-base-DB races that bite under +//! nextest's process-per-test parallelism (concurrent `CREATE SCHEMA`, and a +//! later test re-`DROP`/`CREATE`-ing a fixture table out from under an earlier +//! test's in-flight reads). The only wrinkle is that proptest's case loop is +//! synchronous; `drive_proptest` bridges it to the async injected pool. +//! //! Generic over `ScalarType`; instantiated per type at the bottom. -use anyhow::Result; -use eql_tests::property::{ - assert_eq_oracle, assert_ord_oracle, connect_pool, ensure_eql_installed, ensure_fixture_loaded, - Row, -}; +use anyhow::{Context, Result}; +use eql_tests::property::{assert_eq_oracle, assert_ord_oracle, Row}; use eql_tests::scalar_domains::{ScalarType, Variant}; use proptest::prelude::*; use proptest::test_runner::{Config, TestCaseError, TestRunner}; use sqlx::PgPool; +use std::sync::Arc; /// The fixture corpus SQL for `T`, `include_str!`-embedded into this test binary /// at compile time (one arm per catalog token). Embedding rather than reading @@ -60,27 +67,33 @@ fn embedded_fixture_sql() -> &'static str { } } -/// Read every `(plaintext, payload::text)` fixture row for `T`, in id order. -/// Ensures the corpus is present in the shared DB first (it lives in -/// `#[sqlx::test]`'s ephemeral DBs by default, not the pool we connect to). -async fn load_fixture_rows(pool: &PgPool) -> Result>> { - // The base DB this pool connects to is not migrated by `#[sqlx::test]`; in a - // CI shard it has no `eql_v3` surface, so apply the migrations (idempotent + - // process-safe via the migrator's advisory lock) before any cast/query. - ensure_eql_installed(pool, &super::migrator()).await?; - ensure_fixture_loaded::(pool, embedded_fixture_sql::()).await?; +/// Load the committed fixture corpus for `T` into this test's isolated scratch +/// DB and read every `(plaintext, payload::text)` row, in id order. The corpus +/// SQL is self-contained (`CREATE SCHEMA IF NOT EXISTS fixtures` / `CREATE` / +/// `INSERT`); since the DB is private to this test there is no concurrency on it. +async fn load_rows(pool: &PgPool) -> Result>>> { + sqlx::raw_sql(embedded_fixture_sql::()) + .execute(pool) + .await + .with_context(|| format!("loading fixture corpus for {}", T::PG_TYPE))?; let sql = format!( "SELECT plaintext, payload::text FROM {} ORDER BY id", T::fixture_table_name() ); let raw: Vec<(T, String)> = sqlx::query_as(&sql).fetch_all(pool).await?; - Ok(raw + let rows: Vec> = raw .into_iter() .map(|(plaintext, payload_json)| Row { plaintext, payload_json, }) - .collect()) + .collect(); + anyhow::ensure!( + !rows.is_empty(), + "fixture {} is empty", + T::fixture_table_name() + ); + Ok(Arc::new(rows)) } /// Build a corpus by sampling indices (with repeats) into the loaded fixtures. @@ -89,91 +102,133 @@ fn pick(all: &[Row], idxs: &[usize]) -> Vec> { idxs.iter().map(|&i| all[i].clone()).collect() } -/// Drive proptest from a sync context: sample `cases` index-multisets, and for -/// each run the async oracle on a current-thread runtime. Kept here (not in the -/// lib) because it wires proptest to the test binary. -fn run_fixture_property(cases: u32, oracle: F) -> Result<()> +/// Bridge proptest's synchronous case loop to async oracle work running on the +/// `#[sqlx::test]` runtime and its injected `pool`. +/// +/// `TestRunner::run` is synchronous and cannot `.await`; spinning up a nested +/// runtime inside the test's runtime is unsound, and the pool is bound to the +/// test's runtime so it cannot be driven from another. So the runner lives on a +/// dedicated OS thread that ships each generated case to the async side over a +/// channel and blocks for the verdict; the async side (this future, on the test +/// runtime) runs `body` against the pool and replies. The pool never crosses +/// runtimes, and it works under any runtime flavour. Shrinking is preserved: +/// proptest re-invokes the closure with shrunk inputs, which flow through the +/// same channel. +async fn drive_proptest(config: Config, strategy: S, body: F) -> Result<()> where - T: ScalarType, - F: Fn(PgPool, Vec>) -> Fut, + V: std::fmt::Debug + Send + 'static, + S: Strategy + Send + 'static, + F: Fn(V) -> Fut, Fut: std::future::Future>, { - let rt = tokio::runtime::Builder::new_current_thread() - .enable_all() - .build()?; - let pool = rt.block_on(connect_pool())?; - let all = rt.block_on(load_fixture_rows::(&pool))?; - anyhow::ensure!( - !all.is_empty(), - "fixture {} is empty", - T::fixture_table_name() - ); + use tokio::sync::{mpsc, oneshot}; + type Verdict = std::result::Result<(), String>; + let (case_tx, mut case_rx) = mpsc::unbounded_channel::<(V, oneshot::Sender)>(); + + // proptest drives cases on its own thread; `blocking_recv` is safe there + // because it is not a runtime worker. + let runner = std::thread::spawn(move || -> std::result::Result<(), String> { + let mut runner = TestRunner::new(config); + runner + .run(&strategy, |value| { + let (res_tx, res_rx) = oneshot::channel(); + case_tx + .send((value, res_tx)) + .map_err(|_| TestCaseError::fail("oracle bridge: async side hung up"))?; + match res_rx.blocking_recv() { + Ok(Ok(())) => Ok(()), + Ok(Err(msg)) => Err(TestCaseError::fail(msg)), + Err(_) => Err(TestCaseError::fail("oracle bridge: verdict dropped")), + } + }) + .map_err(|e| format!("{e}")) + }); + + // Service each case on the test runtime, where the pool lives. `{e:#}` + // preserves anyhow's full cause chain (the real Postgres error). + while let Some((value, res_tx)) = case_rx.recv().await { + let verdict = body(value).await.map_err(|e| format!("{e:#}")); + let _ = res_tx.send(verdict); + } + + match runner.join() { + Ok(Ok(())) => Ok(()), + Ok(Err(msg)) => Err(anyhow::anyhow!("fixture property failed: {msg}")), + Err(_) => Err(anyhow::anyhow!("proptest runner thread panicked")), + } +} - let mut runner = TestRunner::new(Config { +/// Strategy + config shared by the eq and ord runs: `cases` multisets of +/// `2..=12` indices into the fixtures (repeats wanted so the equality diagonal +/// includes identical-ciphertext self-pairs). No regression file — these sample +/// committed fixtures, nothing to persist/replay. +fn config_and_strategy(cases: u32, n: usize) -> (Config, impl Strategy>) { + let config = Config { cases, - // No regression file: these cases sample committed fixtures, nothing to - // persist/replay, and it silences proptest's "no source file" warning. failure_persistence: None, ..Config::default() - }); - let n = all.len(); - // Each case: a multiset of 2..=12 indices into the fixtures (repeats wanted). - let strategy = prop::collection::vec(0..n, 2..13); - runner - .run(&strategy, |idxs| { - let corpus = pick(&all, &idxs); - rt.block_on(oracle(pool.clone(), corpus)) - // `{e:#}` renders anyhow's full cause chain inline; plain - // `to_string()` drops it, hiding the real Postgres error (e.g. - // `schema "eql_v3" does not exist`) behind only the context line. - .map_err(|e| TestCaseError::fail(format!("{e:#}")))?; - Ok(()) - }) - .map_err(|e| anyhow::anyhow!("fixture property failed: {e}")) + }; + (config, prop::collection::vec(0..n, 2..13)) } -#[test] -fn prop_int4_eq_oracle_over_fixture() -> Result<()> { - run_fixture_property::(48, |pool, corpus| async move { - assert_eq_oracle::(&pool, &corpus).await +/// Equality-oracle property over `T`'s fixture corpus. +async fn run_eq_oracle(pool: PgPool, cases: u32) -> Result<()> { + let rows = load_rows::(&pool).await?; + let (config, strategy) = config_and_strategy(cases, rows.len()); + drive_proptest(config, strategy, move |idxs| { + let pool = pool.clone(); + let rows = rows.clone(); + async move { assert_eq_oracle::(&pool, &pick(&rows, &idxs)).await } }) + .await } -#[test] -fn prop_int4_ord_oracle_over_fixture() -> Result<()> { - run_fixture_property::(48, |pool, corpus| async move { - assert_ord_oracle::(&pool, Variant::Ord, &corpus).await?; - assert_ord_oracle::(&pool, Variant::OrdOre, &corpus).await +/// Ordering-oracle property over `T`'s fixture corpus (both ordered twins). +async fn run_ord_oracle(pool: PgPool, cases: u32) -> Result<()> { + let rows = load_rows::(&pool).await?; + let (config, strategy) = config_and_strategy(cases, rows.len()); + drive_proptest(config, strategy, move |idxs| { + let pool = pool.clone(); + let rows = rows.clone(); + async move { + let corpus = pick(&rows, &idxs); + assert_ord_oracle::(&pool, Variant::Ord, &corpus).await?; + assert_ord_oracle::(&pool, Variant::OrdOre, &corpus).await + } }) + .await +} + +#[sqlx::test] +async fn prop_int4_eq_oracle_over_fixture(pool: PgPool) -> Result<()> { + run_eq_oracle::(pool, 48).await +} + +#[sqlx::test] +async fn prop_int4_ord_oracle_over_fixture(pool: PgPool) -> Result<()> { + run_ord_oracle::(pool, 48).await } macro_rules! fixture_oracle_suite { ($modname:ident, $ty:ty, ordered) => { mod $modname { use super::*; - #[test] - fn eq_oracle() -> Result<()> { - run_fixture_property::<$ty, _, _>(32, |pool, c| async move { - assert_eq_oracle::<$ty>(&pool, &c).await - }) + #[sqlx::test] + async fn eq_oracle(pool: PgPool) -> Result<()> { + run_eq_oracle::<$ty>(pool, 32).await } - #[test] - fn ord_oracle() -> Result<()> { - run_fixture_property::<$ty, _, _>(32, |pool, c| async move { - assert_ord_oracle::<$ty>(&pool, Variant::Ord, &c).await?; - assert_ord_oracle::<$ty>(&pool, Variant::OrdOre, &c).await - }) + #[sqlx::test] + async fn ord_oracle(pool: PgPool) -> Result<()> { + run_ord_oracle::<$ty>(pool, 32).await } } }; ($modname:ident, $ty:ty, eq_only) => { mod $modname { use super::*; - #[test] - fn eq_oracle() -> Result<()> { - run_fixture_property::<$ty, _, _>(32, |pool, c| async move { - assert_eq_oracle::<$ty>(&pool, &c).await - }) + #[sqlx::test] + async fn eq_oracle(pool: PgPool) -> Result<()> { + run_eq_oracle::<$ty>(pool, 32).await } } }; diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs index 5cbd719df..be3f0ad53 100644 --- a/tests/sqlx/tests/encrypted_domain/property/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -5,14 +5,17 @@ //! mis-read as a scalar type and break the catalog cross-check. /// The embedded SQLx migration set (`tests/sqlx/migrations`) — the SAME one -/// `#[sqlx::test]` applies to its scratch DBs. The property suites connect to -/// the base DB directly (their proptest case loop is sync and can't take -/// `#[sqlx::test]`'s injected pool), so they apply this themselves to reach the +/// `#[sqlx::test]` applies to its scratch DBs. Only the e2e suite needs it: it +/// connects to the base DB directly (its proptest case loop is sync and it +/// batch-encrypts via ZeroKMS), so it applies the migrations itself to reach the /// migrated state the rest of the suite gets for free (see -/// `property::ensure_eql_installed`). The macro embeds the files at compile -/// time and resolves `./migrations` against the `eql_tests` crate root -/// (`tests/sqlx`); kept in the test target, not the lib, so the lib never -/// embeds the gitignored generated `001_install_eql.sql`. +/// `property::ensure_eql_installed`). The fixture suite is a `#[sqlx::test]` and +/// needs none of this. The macro embeds the files at compile time and resolves +/// `./migrations` against the `eql_tests` crate root (`tests/sqlx`); kept in the +/// test target, not the lib, so the lib never embeds the gitignored generated +/// `001_install_eql.sql`. Gated to the e2e feature so it is not dead code in the +/// default (shard) build. +#[cfg(feature = "proptest-e2e")] pub(crate) fn migrator() -> sqlx::migrate::Migrator { sqlx::migrate!("./migrations") } From 1ed0caf3aecf96ec5f802219ece60db2531d3d84 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 23:07:06 +1000 Subject: [PATCH 244/599] ci: rename gate job to ci-required to match required status check The repository ruleset for main requires a status check with context ci-required, but the aggregator job reported under display name 'CI required'. GitHub matches required-check contexts against the check-run name, so the gate was never satisfied and PRs sat on 'Waiting for status to be reported'. Align the job's display name with its id (and the ruleset context), and update .github/workflows/README.md to match. --- .github/workflows/README.md | 12 ++++++------ .github/workflows/test-eql.yml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 58236f8f9..84feae3c6 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -46,9 +46,9 @@ together — which PR-only checks never test. Per-event matrices make leaf job names unstable (a `test` job is displayed as `Shard PG17 1/4`, but the queue produces `Shard PG14 1/2` … `Shard PG17 2/2`), so leaf names can't be named as required checks. Instead, one aggregator job -(id `ci-required`, **display name `CI required`**) `needs:` every job, runs with +(id and display name `ci-required`) `needs:` every job, runs with `if: always()`, and passes only if each needed result is `success` **or** -`skipped`. Mark **only `CI required`** as the required status check. +`skipped`. Mark **only `ci-required`** as the required status check. - `if: always()` — runs even when dependencies fail/skip, so the check always reports (a never-reported required check leaves the queue stuck *Pending*). @@ -63,17 +63,17 @@ merge-queue workflows. Settings → Branches → rule for `main`: 1. **Require merge queue.** -2. **Require status checks to pass** → add **`CI required` only** (the display - name; not the per-shard leaf names). +2. **Require status checks to pass** → add **`ci-required` only** (not the + per-shard leaf names). Then verify (see `docs/plans/2026-06-09-ci-pr-feedback-sharding-rollout.md`): - **Queue a relevant PR** → `merge_group` runs the full gate — 8 `Shard …` jobs + 4 `Validate …` jobs + `build-archive`, `schema`, `rust-crates`, `codegen`, - `self-contained-v3`, `matrix-coverage`, `splinter` — all green → `CI required` + `self-contained-v3`, `matrix-coverage`, `splinter` — all green → `ci-required` green → PR merges. - **Open a docs-only PR** → on its `pull_request` run the heavy jobs skip and - `CI required` reports **Success** (not stuck *Pending*), so the PR can be + `ci-required` reports **Success** (not stuck *Pending*), so the PR can be queued. ## References diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 1e37aaa3a..5e6a40c89 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -467,7 +467,7 @@ jobs: # docs-only PRs, and a genuine failure is still caught because the FAILING # source job is itself in `needs` and reports failure. ci-required: - name: "CI required" + name: "ci-required" needs: [changes, setup, build-archive, test, validate, schema, rust-crates, codegen, self-contained-v3, matrix-coverage, splinter] if: always() From c3255a78676977ffc546cb790a9426f507bc96cd Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 12:48:48 +1000 Subject: [PATCH 245/599] test(v3): extend sign-boundary monotonicity to int2/int8/timestamptz --- tests/sqlx/tests/encrypted_domain/signed.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs index e00f92990..73f916fb0 100644 --- a/tests/sqlx/tests/encrypted_domain/signed.rs +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -1,5 +1,6 @@ -//! Sign-boundary coverage for **signed** scalars (`int`, `date`) — the -//! `SignedScalar` delta on top of the uniform ordered matrix. +//! Sign-boundary coverage for **signed** scalars (`int2`/`int4`/`int8`, `date`, +//! `timestamptz`) — the `SignedScalar` delta on top of the uniform ordered +//! matrix. //! //! ORE encrypts signed values as an offset from a numeric origin (`0` for //! integers, the epoch for dates). This suite asserts the ORE block ordering is @@ -51,3 +52,18 @@ async fn int4_sign_boundary(pool: PgPool) -> anyhow::Result<()> { async fn date_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } + +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int2")))] +async fn int2_sign_boundary(pool: PgPool) -> anyhow::Result<()> { + sign_boundary_is_monotonic::(&pool).await +} + +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int8")))] +async fn int8_sign_boundary(pool: PgPool) -> anyhow::Result<()> { + sign_boundary_is_monotonic::(&pool).await +} + +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_timestamptz")))] +async fn timestamptz_sign_boundary(pool: PgPool) -> anyhow::Result<()> { + sign_boundary_is_monotonic::>(&pool).await +} From 8638c27627a8047c971f8ab6a54f211d0ad30572 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 12:49:01 +1000 Subject: [PATCH 246/599] test(v3): native-jsonb blocker matrix arm; delete helper self-tests duplicated by matrix - New per-type __scalar_matrix_native_jsonb_blocker_* arm sweeps the 10 native jsonb operators (?, ?|, ?&, @?, @@, #>, #>>, -, #-, ||) as blockers on every declared domain of every scalar type, replacing the int4-only hand-test (omitted_native_jsonb_operators_raise_eql_blockers). Coverage 1 -> 7 types; non-storage (_eq/_ord/_ord_ore, text _search) is a new guarantee. - Symbol set derived from a new is_native_jsonb_blocker classification on Operator in eql-codegen (residual after comparison/containment/path-selector), pinned by tests on both sides. - Delete 8 assertion-helper self-tests now subsumed by per-type matrix arms; keep sql_string_literal smoke test + the two API-pin tests. Port the three-valued-logic caveat into the supported_null arm comment. - Make the PLACEHOLDER_PAYLOAD cast check catalog-driven (every declared domain of every live type), replacing the i32-only version + its TODO. - Regenerate the three matrix-inventory snapshots. --- crates/eql-codegen/src/operator_surface.rs | 40 ++++ tests/sqlx/snapshots/matrix_tests.txt | 4 + tests/sqlx/snapshots/matrix_tests_eq_only.txt | 2 + tests/sqlx/snapshots/matrix_tests_text.txt | 5 + tests/sqlx/src/matrix.rs | 143 ++++++++++- .../tests/encrypted_domain/family/support.rs | 222 ++---------------- 6 files changed, 211 insertions(+), 205 deletions(-) diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index 2445eb557..a182fd0d0 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -198,6 +198,34 @@ pub fn operator_function_name(symbol: &str) -> &'static str { operator(symbol).function_name } +impl Operator { + /// True for the native-jsonb operators that every encrypted domain + /// generates as BLOCKERS: those that are neither comparison + /// (`=`/`<>`/`<`/`<=`/`>`/`>=`), nor containment (`@>`/`<@`), nor + /// path-selectors (`->`/`->>`). Derived by exclusion so a 21st operator + /// added to `OPERATORS` is automatically classified — no literal list to + /// drift out of sync. + pub fn is_native_jsonb_blocker(&self) -> bool { + const COMPARISON: &[&str] = &["=", "<>", "<", "<=", ">", ">="]; + const CONTAINMENT: &[&str] = &["@>", "<@"]; + const PATH_SELECTOR: &[&str] = &["->", "->>"]; + !COMPARISON.contains(&self.symbol) + && !CONTAINMENT.contains(&self.symbol) + && !PATH_SELECTOR.contains(&self.symbol) + } +} + +/// The native-jsonb operator symbols that every encrypted domain blocks, in +/// `OPERATORS` order. Source of truth for the matrix's native-jsonb-blocker +/// arm — the arm asserts its hand-written RHS map's keys equal this set. +pub fn native_jsonb_blocker_symbols() -> Vec<&'static str> { + OPERATORS + .iter() + .filter(|o| o.is_native_jsonb_blocker()) + .map(|o| o.symbol) + .collect() +} + /// Comparison-operator metadata (commutator/negator/selectivity estimators). const fn cmp_metadata( restrict: &'static str, @@ -576,4 +604,16 @@ mod tests { ] ); } + + #[test] + fn native_jsonb_blocker_symbols_are_the_residual_ten() { + // The residual after removing the 6 comparison + 2 containment + 2 + // path-selector ops from the 20-operator catalog. If a 21st operator is + // added, classify it (comparison/containment/path-selector/native) and + // update this list and the matrix arm's RHS map together. + assert_eq!( + native_jsonb_blocker_symbols(), + vec!["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"], + ); + } } diff --git a/tests/sqlx/snapshots/matrix_tests.txt b/tests/sqlx/snapshots/matrix_tests.txt index 8c7097e0e..2c8928b8d 100644 --- a/tests/sqlx/snapshots/matrix_tests.txt +++ b/tests/sqlx/snapshots/matrix_tests.txt @@ -19,6 +19,7 @@ scalars::::matrix__eq_index_engages_hash scalars::::matrix__eq_lt_blocker scalars::::matrix__eq_lte_blocker scalars::::matrix__eq_native_absent_ops +scalars::::matrix__eq_native_jsonb_blockers scalars::::matrix__eq_neq_pivot_max_correctness scalars::::matrix__eq_neq_pivot_max_cross_shape scalars::::matrix__eq_neq_pivot_mid_correctness @@ -87,6 +88,7 @@ scalars::::matrix__ord_lte_pivot_min_correctness scalars::::matrix__ord_lte_pivot_min_cross_shape scalars::::matrix__ord_lte_supported_null scalars::::matrix__ord_native_absent_ops +scalars::::matrix__ord_native_jsonb_blockers scalars::::matrix__ord_neq_pivot_max_correctness scalars::::matrix__ord_neq_pivot_max_cross_shape scalars::::matrix__ord_neq_pivot_mid_correctness @@ -162,6 +164,7 @@ scalars::::matrix__ord_ore_lte_pivot_min_correctness scalars::::matrix__ord_ore_lte_pivot_min_cross_shape scalars::::matrix__ord_ore_lte_supported_null scalars::::matrix__ord_ore_native_absent_ops +scalars::::matrix__ord_ore_native_jsonb_blockers scalars::::matrix__ord_ore_neq_pivot_max_correctness scalars::::matrix__ord_ore_neq_pivot_max_cross_shape scalars::::matrix__ord_ore_neq_pivot_mid_correctness @@ -208,6 +211,7 @@ scalars::::matrix__storage_gte_blocker scalars::::matrix__storage_lt_blocker scalars::::matrix__storage_lte_blocker scalars::::matrix__storage_native_absent_ops +scalars::::matrix__storage_native_jsonb_blockers scalars::::matrix__storage_neq_blocker scalars::::matrix__storage_path_op_blockers scalars::::matrix__storage_payload_check diff --git a/tests/sqlx/snapshots/matrix_tests_eq_only.txt b/tests/sqlx/snapshots/matrix_tests_eq_only.txt index 1a66c5567..ef0a4f5a9 100644 --- a/tests/sqlx/snapshots/matrix_tests_eq_only.txt +++ b/tests/sqlx/snapshots/matrix_tests_eq_only.txt @@ -19,6 +19,7 @@ scalars::::matrix__eq_index_engages_hash scalars::::matrix__eq_lt_blocker scalars::::matrix__eq_lte_blocker scalars::::matrix__eq_native_absent_ops +scalars::::matrix__eq_native_jsonb_blockers scalars::::matrix__eq_neq_pivot_max_correctness scalars::::matrix__eq_neq_pivot_max_cross_shape scalars::::matrix__eq_neq_pivot_mid_correctness @@ -44,6 +45,7 @@ scalars::::matrix__storage_gte_blocker scalars::::matrix__storage_lt_blocker scalars::::matrix__storage_lte_blocker scalars::::matrix__storage_native_absent_ops +scalars::::matrix__storage_native_jsonb_blockers scalars::::matrix__storage_neq_blocker scalars::::matrix__storage_path_op_blockers scalars::::matrix__storage_payload_check diff --git a/tests/sqlx/snapshots/matrix_tests_text.txt b/tests/sqlx/snapshots/matrix_tests_text.txt index 56d7a3f00..89dc7f908 100644 --- a/tests/sqlx/snapshots/matrix_tests_text.txt +++ b/tests/sqlx/snapshots/matrix_tests_text.txt @@ -19,6 +19,7 @@ scalars::::matrix__eq_index_engages_hash scalars::::matrix__eq_lt_blocker scalars::::matrix__eq_lte_blocker scalars::::matrix__eq_native_absent_ops +scalars::::matrix__eq_native_jsonb_blockers scalars::::matrix__eq_neq_pivot_max_correctness scalars::::matrix__eq_neq_pivot_max_cross_shape scalars::::matrix__eq_neq_pivot_mid_correctness @@ -88,6 +89,7 @@ scalars::::matrix__ord_lte_pivot_min_correctness scalars::::matrix__ord_lte_pivot_min_cross_shape scalars::::matrix__ord_lte_supported_null scalars::::matrix__ord_native_absent_ops +scalars::::matrix__ord_native_jsonb_blockers scalars::::matrix__ord_neq_pivot_max_correctness scalars::::matrix__ord_neq_pivot_max_cross_shape scalars::::matrix__ord_neq_pivot_mid_correctness @@ -164,6 +166,7 @@ scalars::::matrix__ord_ore_lte_pivot_min_correctness scalars::::matrix__ord_ore_lte_pivot_min_cross_shape scalars::::matrix__ord_ore_lte_supported_null scalars::::matrix__ord_ore_native_absent_ops +scalars::::matrix__ord_ore_native_jsonb_blockers scalars::::matrix__ord_ore_neq_pivot_max_correctness scalars::::matrix__ord_ore_neq_pivot_max_cross_shape scalars::::matrix__ord_ore_neq_pivot_mid_correctness @@ -256,6 +259,7 @@ scalars::::matrix__search_match_contains_self scalars::::matrix__search_match_disjoint_miss scalars::::matrix__search_match_index_engages_gin scalars::::matrix__search_native_absent_ops +scalars::::matrix__search_native_jsonb_blockers scalars::::matrix__search_neq_pivot_max_correctness scalars::::matrix__search_neq_pivot_max_cross_shape scalars::::matrix__search_neq_pivot_mid_correctness @@ -293,6 +297,7 @@ scalars::::matrix__storage_gte_blocker scalars::::matrix__storage_lt_blocker scalars::::matrix__storage_lte_blocker scalars::::matrix__storage_native_absent_ops +scalars::::matrix__storage_native_jsonb_blockers scalars::::matrix__storage_neq_blocker scalars::::matrix__storage_path_op_blockers scalars::::matrix__storage_payload_check diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index ec0211064..903b6c3c1 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -605,6 +605,10 @@ macro_rules! scalar_domain_matrix { suite = $suite, scalar = $scalar, domains = [$(($all_name, $all_variant)),+], } + $crate::__scalar_matrix_native_jsonb_blocker_outer! { + suite = $suite, scalar = $scalar, + domains = [$(($all_name, $all_variant)),+], + } $crate::__scalar_matrix_typed_column_outer! { suite = $suite, scalar = $scalar, combos = [$($blocker_combo),+], @@ -931,7 +935,11 @@ macro_rules! __scalar_matrix_cross_shape_case { // ============================================================================ // Supported-NULL category — leaf for the domain × op driver: STRICT wrappers -// must propagate NULL on all three NULL positions (left, right, both). +// must propagate NULL on all three NULL positions (left, right, both). This is +// three-valued logic — a supported op (e.g. `<>`) with a NULL operand must +// yield NULL, not true and not false; easy to get wrong in domain wrappers, +// which is why every (domain, op) pair is swept here. (Subsumes the deleted +// `neq_propagates_null_under_three_valued_logic` int4 hand-test.) // ============================================================================ #[macro_export] @@ -1226,6 +1234,139 @@ macro_rules! __scalar_matrix_native_absent_case { }; } +// ============================================================================ +// Native-jsonb-blocker category — the native jsonb operators that the codegen +// surface generates as BLOCKERS on every encrypted domain (neither comparison, +// containment, nor path-selector). They must RAISE the EQL "operator X is not +// supported" blocker on every variant, with PLACEHOLDER_PAYLOAD (no fixture +// row needed — see the "blocker raises before decryption" note in the +// Critical-context section). Per-op RHS shapes mirror the native jsonb operator +// signatures (see crates/eql-codegen/src/operator_surface.rs OPERATORS): +// `?`/`-` take text, `?|`/`?&`/`#>`/`#>>`/`#-` take text[], `@?`/`@@` take +// jsonpath, `||` takes jsonb. Replaces the int4-only +// `omitted_native_jsonb_operators_raise_eql_blockers` hand-written test, +// extending the guarantee to all storage scalars. +// +// The SYMBOL SET this arm sweeps is pinned to the codegen-derived residual by +// `native_jsonb_blocker_arm_covers_every_derived_symbol` (below) via +// `NATIVE_JSONB_BLOCKER_ARM_SYMBOLS` — the RHS operand shapes stay hand-written. +// ============================================================================ + +/// The operator symbols the `__scalar_matrix_native_jsonb_blocker_*` arm +/// sweeps, in `OPERATORS` order. The RHS operand *shapes* are hand-written in +/// the macro body (they cannot be derived from the symbol), but this symbol +/// SET must stay equal to the codegen-derived residual +/// (`eql_codegen::operator_surface::native_jsonb_blocker_symbols()`, pinned by +/// `native_jsonb_blocker_symbols_are_the_residual_ten` in that crate) — pinned +/// here by `native_jsonb_blocker_arm_covers_every_derived_symbol`. +pub const NATIVE_JSONB_BLOCKER_ARM_SYMBOLS: &[&str] = + &["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"]; + +#[cfg(test)] +mod native_jsonb_blocker_arm_tests { + use super::*; + + #[test] + fn native_jsonb_blocker_arm_covers_every_derived_symbol() { + // The arm's hand-written RHS-shape map keys (operator SYMBOLS) must equal + // the codegen residual. `eql-codegen` is not a dependency of this crate, + // so we pin against the same literal 10-symbol vector that + // `native_jsonb_blocker_symbols_are_the_residual_ten` + // (operator_surface.rs) pins against the live `OPERATORS` table. The two + // pins together fail if either side drifts: a 21st native-jsonb operator + // makes the codegen test fail, and updating that test without updating + // this const makes them disagree on review. The RHS operand shapes stay + // hand-written; only the symbol SET is asserted. + let mut arm: Vec<&str> = NATIVE_JSONB_BLOCKER_ARM_SYMBOLS.to_vec(); + let mut want = vec!["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"]; + arm.sort_unstable(); + want.sort_unstable(); + assert_eq!( + arm, want, + "native-jsonb-blocker arm symbol set must equal the codegen residual; \ + arm={NATIVE_JSONB_BLOCKER_ARM_SYMBOLS:?}", + ); + } +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_native_jsonb_blocker_outer { + ( + suite = $suite:ident, scalar = $scalar:ty, + domains = [$(($dom_name:ident, $variant:ident)),+ $(,)?] $(,)? + ) => { + $( + $crate::__scalar_matrix_native_jsonb_blocker_case! { + suite = $suite, scalar = $scalar, + dom_name = $dom_name, variant = $variant, + } + )+ + }; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __scalar_matrix_native_jsonb_blocker_case { + ( + suite = $suite:ident, scalar = $scalar:ty, + dom_name = $dom_name:ident, variant = $variant:ident $(,)? + ) => { + $crate::paste::paste! { + #[sqlx::test] + async fn []( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + let spec = $crate::__scalar_matrix_spec!($scalar, $variant); + let d = &spec.sql_domain; + let payload = $crate::helpers::PLACEHOLDER_PAYLOAD; + + // (op symbol, full SELECT-able expr). The LHS is always + // `$1::jsonb::{d}`. `-` carries three arg shapes (text / integer / + // text[]) and `||` three overloads — covering every generated + // overload exactly as the int4 hand-test did. Each binds one + // PLACEHOLDER_PAYLOAD. The swept symbol set is pinned to the + // codegen residual by NATIVE_JSONB_BLOCKER_ARM_SYMBOLS. + let single: &[(&str, String)] = &[ + ("?", format!("$1::jsonb::{d} ? 'c'::text")), + ("?|", format!("$1::jsonb::{d} ?| ARRAY['c']")), + ("?&", format!("$1::jsonb::{d} ?& ARRAY['c']")), + ("#>", format!("$1::jsonb::{d} #> ARRAY['i']")), + ("#>>", format!("$1::jsonb::{d} #>> ARRAY['i', 'c']")), + ("@?", format!("$1::jsonb::{d} @? '$.c'::jsonpath")), + ("@@", format!("$1::jsonb::{d} @@ '$.c == \"placeholder\"'::jsonpath")), + ("-", format!("$1::jsonb::{d} - 'c'::text")), + ("-", format!("$1::jsonb::{d} - 0")), + ("-", format!("$1::jsonb::{d} - ARRAY['c']")), + ("#-", format!("$1::jsonb::{d} #- ARRAY['i']")), + ]; + for (op, expr) in single { + let sql = format!("SELECT {expr}"); + let msg = $crate::scalar_domains::blocker_msg(d, op); + $crate::scalar_domains::assert_raises( + &pool, &sql, &[Some(payload)], &msg, + ).await?; + } + + // `||` overloads: (domain, jsonb), (jsonb, domain), (domain, domain). + let concat: &[String] = &[ + format!("$1::jsonb::{d} || $2::jsonb"), + format!("$1::jsonb || $2::jsonb::{d}"), + format!("$1::jsonb::{d} || $2::jsonb::{d}"), + ]; + let concat_msg = $crate::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = format!("SELECT {expr}"); + $crate::scalar_domains::assert_raises( + &pool, &sql, &[Some(payload), Some(payload)], &concat_msg, + ).await?; + } + Ok(()) + } + } + }; +} + // ============================================================================ // Typed-column blocker category — pins the bare `WHERE col op col` form a // real caller writes. The parameter blocker arm uses $1/$2 binds; this diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index a9271dad6..4f87524e3 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -5,7 +5,6 @@ use anyhow::Result; use eql_tests::{ - assert_null, assert_raises, assert_scalar_plaintexts, blocker_msg, fetch_fixture_payload, sql_string_literal, ScalarDomainSpec, ScalarType, Variant, PLACEHOLDER_PAYLOAD, }; use sqlx::PgPool; @@ -114,213 +113,28 @@ fn sql_string_literal_escapes_single_quotes() { assert_eq!(sql_string_literal("abc'def"), "'abc''def'"); } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] -async fn fetch_fixture_payload_returns_keyed_row(pool: PgPool) -> Result<()> { - // Parse the payload as JSON rather than substring-matching — whitespace - // and key ordering in the serialised form are not contract. - let payload = fetch_fixture_payload::(&pool, 42).await?; - let value: serde_json::Value = serde_json::from_str(&payload)?; - assert_eq!(value["v"], serde_json::json!(2), "payload must carry v=2"); - assert!(value.get("c").is_some(), "payload must carry a c field"); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] -async fn assert_scalar_plaintexts_reports_sql_context(pool: PgPool) -> Result<()> { - let lit = sql_string_literal(&fetch_fixture_payload::(&pool, 42).await?); - let predicate = format!("payload::eql_v3.int4_ord_ore = {lit}::jsonb::eql_v3.int4_ord_ore"); - assert_scalar_plaintexts::(&pool, "eql_v3.int4_ord_ore", "=", &predicate, &[42]).await?; - Ok(()) -} - #[sqlx::test] -async fn placeholder_payload_satisfies_every_variant_check(pool: PgPool) -> Result<()> { +async fn placeholder_payload_casts_to_every_declared_domain(pool: PgPool) -> Result<()> { // The whole point of PLACEHOLDER_PAYLOAD: one sentinel that casts - // successfully to every domain in the family. If a variant CHECK - // tightens, this test fails and PLACEHOLDER_PAYLOAD needs updating. + // successfully to EVERY declared domain of EVERY live scalar type. If a + // variant CHECK tightens for any type, this fails and PLACEHOLDER_PAYLOAD + // needs updating. Catalog-driven so a new scalar type is covered the + // moment its CATALOG row lands — no per-type edit here. // - // Iterates `Variant::ALL` for `i32`, deriving each domain name from - // `ScalarDomainSpec::new::(variant).sql_domain` rather than - // hardcoding the names. Currently `i32`-only; when `int8` (or any - // future scalar) lands, wrap this in a per-type loop so the - // PLACEHOLDER_PAYLOAD cast is exercised against every scalar. - for variant in Variant::ALL { - // int4 does not declare every variant (no `_search`); skip the ones it - // lacks so the cast targets a real domain. - if !variant.is_declared_for("int4") { - continue; + // (Was i32-only with a TODO to generalize; the TODO is now done.) + use eql_scalars::CATALOG; + for spec in CATALOG { + for domain in spec.domains { + let sql_domain = format!("eql_v3.{}{}", spec.token, domain.suffix); + let sql = format!("SELECT $1::jsonb::{sql_domain}"); + sqlx::query(&sql) + .bind(PLACEHOLDER_PAYLOAD) + .fetch_one(&pool) + .await + .map_err(|e| { + anyhow::anyhow!("PLACEHOLDER_PAYLOAD must cast to {sql_domain}: {e}") + })?; } - let spec = ScalarDomainSpec::new::(*variant); - let sql = format!("SELECT $1::jsonb::{}", spec.sql_domain); - sqlx::query(&sql) - .bind(PLACEHOLDER_PAYLOAD) - .fetch_one(&pool) - .await - .map_err(|e| { - anyhow::anyhow!("PLACEHOLDER_PAYLOAD must cast to {}: {e}", spec.sql_domain) - })?; - } - Ok(()) -} - -#[sqlx::test] -async fn assert_raises_two_bind_blocker(pool: PgPool) -> Result<()> { - let msg = blocker_msg("eql_v3.int4", "="); - assert_raises( - &pool, - "SELECT $1::jsonb::eql_v3.int4 = $2::jsonb::eql_v3.int4", - &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &msg, - ) - .await -} - -#[sqlx::test] -async fn assert_raises_one_bind_path_blocker(pool: PgPool) -> Result<()> { - let msg = blocker_msg("eql_v3.int4", "->"); - assert_raises( - &pool, - "SELECT $1::jsonb::eql_v3.int4 -> 'field'::text", - &[Some(PLACEHOLDER_PAYLOAD)], - &msg, - ) - .await -} - -#[sqlx::test] -async fn assert_raises_native_operator_absent(pool: PgPool) -> Result<()> { - // ~~ (LIKE) isn't declared on int4 — error message is PG's native - // "operator does not exist", not an EQL blocker message. - assert_raises( - &pool, - "SELECT $1::jsonb::eql_v3.int4 ~~ $2::jsonb::eql_v3.int4", - &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - "operator does not exist", - ) - .await -} - -#[sqlx::test] -async fn omitted_native_jsonb_operators_raise_eql_blockers(pool: PgPool) -> Result<()> { - let cases: &[(&str, &[Option<&str>], &str)] = &[ - ( - "SELECT $1::jsonb::eql_v3.int4 ? 'c'::text", - &[Some(PLACEHOLDER_PAYLOAD)], - "?", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 ?| ARRAY['c']", - &[Some(PLACEHOLDER_PAYLOAD)], - "?|", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 ?& ARRAY['c']", - &[Some(PLACEHOLDER_PAYLOAD)], - "?&", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 #> ARRAY['i']", - &[Some(PLACEHOLDER_PAYLOAD)], - "#>", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 #>> ARRAY['i', 'c']", - &[Some(PLACEHOLDER_PAYLOAD)], - "#>>", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 @? '$.c'::jsonpath", - &[Some(PLACEHOLDER_PAYLOAD)], - "@?", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 @@ '$.c == \"placeholder\"'::jsonpath", - &[Some(PLACEHOLDER_PAYLOAD)], - "@@", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 - 'c'::text", - &[Some(PLACEHOLDER_PAYLOAD)], - "-", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 - 0", - &[Some(PLACEHOLDER_PAYLOAD)], - "-", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 - ARRAY['c']", - &[Some(PLACEHOLDER_PAYLOAD)], - "-", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 #- ARRAY['i']", - &[Some(PLACEHOLDER_PAYLOAD)], - "#-", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 || $2::jsonb", - &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - "||", - ), - ( - "SELECT $1::jsonb || $2::jsonb::eql_v3.int4", - &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - "||", - ), - ( - "SELECT $1::jsonb::eql_v3.int4 || $2::jsonb::eql_v3.int4", - &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - "||", - ), - ]; - - for (sql, binds, op) in cases { - assert_raises(&pool, sql, binds, &blocker_msg("eql_v3.int4", op)).await?; - } - Ok(()) -} - -#[sqlx::test] -async fn assert_raises_engages_on_all_null(pool: PgPool) -> Result<()> { - // Non-STRICT blocker proof — must raise even with NULL on both sides. - let msg = blocker_msg("eql_v3.int4", "="); - assert_raises( - &pool, - "SELECT $1::jsonb::eql_v3.int4 = $2::jsonb::eql_v3.int4", - &[None, None], - &msg, - ) - .await -} - -#[sqlx::test] -async fn assert_null_propagates_through_supported_op(pool: PgPool) -> Result<()> { - // STRICT supported op with one NULL operand yields NULL. - assert_null( - &pool, - "SELECT $1::jsonb::eql_v3.int4_eq = $2::jsonb::eql_v3.int4_eq", - &[Some(PLACEHOLDER_PAYLOAD), None], - ) - .await -} - -#[sqlx::test] -async fn neq_propagates_null_under_three_valued_logic(pool: PgPool) -> Result<()> { - // `<>` with a NULL operand must yield NULL (not true, not false). - // Three-valued logic is easy to get wrong in domain wrappers; a - // STRICT supported `<>` returns NULL on either NULL side. - for binds in [ - &[Some(PLACEHOLDER_PAYLOAD), None][..], - &[None, Some(PLACEHOLDER_PAYLOAD)][..], - &[None, None][..], - ] { - assert_null( - &pool, - "SELECT $1::jsonb::eql_v3.int4_eq <> $2::jsonb::eql_v3.int4_eq", - binds, - ) - .await?; } Ok(()) } From 5c03e74abc9e2f649429cf4dfec79224fe148136 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 12:50:34 +1000 Subject: [PATCH 247/599] docs(v3): correct stale 'timestamptz is eq-only' references (now ordered) --- .../adding-a-scalar-encrypted-domain-type.md | 5 +++-- tests/sqlx/src/matrix.rs | 20 +++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index f5d1bf1de..ee1c43261 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -445,8 +445,9 @@ generated-SQL drift is caught before database tests run. committed `tests/codegen/reference//` baseline, generated once and checked in (see `tests/codegen/reference/README.md` for the regenerate-and-commit recipe). The generator is type-generic, but per-type domain *shapes* differ — ordered -types carry `_ord`/`_ord_ore` + aggregates, equality-only types (`timestamptz`) -omit them, and the Bloom `text_match` domain renders `@>`/`<@` as supported +types (including `timestamptz`) carry `_ord`/`_ord_ore` + aggregates, a +hypothetical equality-only type (`EQ_ONLY_DOMAINS`) would omit them, and the +Bloom `text_match` domain renders `@>`/`<@` as supported containment operators no ordered type emits — so anchoring every type catches a regression in any shape, not just the ordered one. `reference_dirs_match_catalog_tokens` (in `crates/eql-codegen/tests/parity.rs`) fails CI if a catalog row has no reference diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 903b6c3c1..8a35dd147 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -4,11 +4,13 @@ //! //! - **`scalar_matrix!`** — the recommended wrapper. One invocation per type //! (~5 lines), with a `caps` capability marker selecting the shape: -//! `caps = [eq, ord]` for an ordered scalar (i32, i64, date, ...) where all -//! four variants are present and the full `=`/`<>`/`<`/`>`/`min`/`max` -//! surface applies; `caps = [eq]` for an equality-only scalar (timestamptz, -//! bool, ...) where only storage + `_eq` materialise and the ord operators -//! are blockers. The only other inputs that change per type are the scalar +//! `caps = [eq, ord]` for an ordered scalar (i32, i64, date, timestamptz, +//! ...) where all four variants are present and the full +//! `=`/`<>`/`<`/`>`/`min`/`max` surface applies; `caps = [eq]` for a +//! hypothetical equality-only scalar (e.g. a future hash-only type) where +//! only storage + `_eq` materialise and the ord operators are blockers — no +//! current type uses this shape. The only other inputs that change per type +//! are the scalar //! itself, the suite token (used to derive domain + test names), and the EQL //! type name (the fixture `scripts(...)` ref); pivots are derived from the //! `ScalarType` impl. @@ -146,11 +148,13 @@ fn collect_index_scan_nodes(value: &serde_json::Value, found: &mut Vec<(String, /// /// - `caps = [eq, ord]` — the ordered-numeric shape (all four variants; /// `=`/`<>`/`<`/`<=`/`>`/`>=`; ORDER BY / ORDER BY USING; ORE injectivity; -/// the ordered functional index). Consumers: `int2`/`int4`/`int8`/`date`. +/// the ordered functional index). Consumers: +/// `int2`/`int4`/`int8`/`date`/`timestamptz`/`numeric`. /// - `caps = [eq]` — equality-only (storage + `_eq` only; `=`/`<>` meaningful, /// the four ord operators are deliberate blockers). The empty `ord_domains` -/// make the order-by / ORE arms emit zero tests. First consumer: -/// `timestamptz`. +/// make the order-by / ORE arms emit zero tests. No current consumer — +/// `timestamptz` was promoted to the ordered shape once the N-block ORE +/// comparator could order its native 12-block width. /// /// Both arms take the identical `(suite, scalar, eql_type)` signature, so the /// invocation shape is the same regardless of capability — only the `caps` From 856c177936117d457f622d2cc4fbd3ca4565c049 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 13:05:12 +1000 Subject: [PATCH 248/599] test(v3): derive ordered-scalar boundary pivots from fixture_values (all kinds) --- crates/eql-tests-macros/src/lib.rs | 32 ++--- .../adding-a-scalar-encrypted-domain-type.md | 17 ++- tests/sqlx/src/jsonb_entry.rs | 13 +- tests/sqlx/src/scalar_domains.rs | 116 ++++++++++-------- 4 files changed, 96 insertions(+), 82 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index d2bb775bf..784f40a06 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -184,17 +184,10 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { } impl OrderedScalar for #rust_type { - /// Integer scalars pivot on their inherent `MIN`/`MAX` consts; - /// the fixture lists include both (`fixtures!(int …; Min, …, Max)`). - fn min_pivot() -> #rust_type { - <#rust_type>::MIN - } - - fn max_pivot() -> #rust_type { - <#rust_type>::MAX - } - // `mid_pivot` inherits the default `Self::default()` = `0`, - // which is the numeric origin and a `Zero` fixture row. + // Boundary pivots derive from `fixture_values()` (the integer + // fixture lists include `Min`/`Max` = the inherent bounds); + // `mid_pivot` inherits `Self::default()` = `0`. Nothing to + // override. } impl SignedScalar for #rust_type { @@ -439,15 +432,16 @@ mod tests { assert!(out.contains(r#"const PG_TYPE : & 'static str = "int8""#)); assert!(out.contains(":: eql_scalars :: INT4_VALUES")); assert!(out.contains(":: eql_scalars :: INT8_VALUES")); - // const→fn: fixture values is a method now, plus the integer pivots. + // const→fn: fixture values is a method now. assert!(out.contains("fn fixture_values")); - // Assert the emitted pivot bodies, not bare `MIN`/`MAX` substrings: - // the latter also appear in the doc comment, so a loose check would - // pass even if the bodies stopped returning the inherent bounds. - assert!(out.contains("fn min_pivot () -> i32 { < i32 > :: MIN }")); - assert!(out.contains("fn max_pivot () -> i32 { < i32 > :: MAX }")); - assert!(out.contains("fn min_pivot () -> i64 { < i64 > :: MIN }")); - assert!(out.contains("fn max_pivot () -> i64 { < i64 > :: MAX }")); + // Pivots are now derived trait defaults — the emitter writes an empty + // `impl OrderedScalar` and no longer spells out the boundary bodies. + assert!(out.contains("impl OrderedScalar for i32 { }")); + assert!(out.contains("impl OrderedScalar for i64 { }")); + assert!(!out.contains("fn min_pivot")); + assert!(!out.contains("fn max_pivot")); + // `SignedScalar::origin` is still emitted. + assert!(out.contains("fn origin () -> i32 { 0 }")); } #[test] diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index ee1c43261..809d35c8b 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -233,12 +233,17 @@ three divergences (for the ordered `date`): over `ScalarType` (`scalar_domains.rs`): **`OrderedScalar`** carries the `min_pivot()` / `max_pivot()` boundaries and the interior `mid_pivot()` (default `Self::default()`); **`SignedScalar: OrderedScalar`** adds `origin()` (the - numeric zero / sign boundary). Integer impls (`min=MIN`, `max=MAX`, `mid` - inherits `0`, `origin=0`) are emitted by the proc-macro; the temporal `date` - impl returns explicit sentinel dates (`mid` inherits the epoch = `origin()`) and - is emitted by the `temporal_values!` declarative macro in `scalar_domains.rs`, - which emits the `ScalarType` + `OrderedScalar` + `SignedScalar` impls together - (the proc-macro emits only integer impls). `date` is both `OrderedScalar` and + numeric zero / sign boundary). `min_pivot()`/`max_pivot()` are **derived** for + every kind — the trait default returns the smallest/largest `fixture_values()` + entry (`ScalarType` already bounds `Ord + Clone`), so a boundary pivot is a + fixture row by construction and cannot drift. **No impl overrides them.** Only + `mid_pivot()` is ever overridden: it defaults to `Self::default()` (the numeric + origin / epoch — a real fixture for the integer kinds, `date`, `timestamptz`, + and `numeric`), and `text` overrides it with a real median fixture because + `String::default()` is the degenerate empty string (issue #262). The proc-macro + and the `temporal_values!` macro therefore emit an empty `impl OrderedScalar` + (defaults inherited) alongside the `SignedScalar { origin }` impl where the kind + is signed. `date` is both `OrderedScalar` and `SignedScalar`; `text` is `OrderedScalar` only and **hand-written** in `scalar_domains.rs` (lexicographic order has no origin, so it overrides `mid_pivot()` with a real median fixture rather than the degenerate diff --git a/tests/sqlx/src/jsonb_entry.rs b/tests/sqlx/src/jsonb_entry.rs index e60299ac8..69022121b 100644 --- a/tests/sqlx/src/jsonb_entry.rs +++ b/tests/sqlx/src/jsonb_entry.rs @@ -97,15 +97,10 @@ impl ScalarType for JsonbEntryInt4 { } impl OrderedScalar for JsonbEntryInt4 { - fn min_pivot() -> Self { - JsonbEntryInt4(::min_pivot()) - } - fn max_pivot() -> Self { - JsonbEntryInt4(::max_pivot()) - } - fn mid_pivot() -> Self { - JsonbEntryInt4(::mid_pivot()) - } + // All three pivots inherit the `OrderedScalar` defaults: the boundaries + // derive from `fixture_values()` (wrapped `INT4_VALUES`) and `mid_pivot` + // inherits `JsonbEntryInt4::default()` = `JsonbEntryInt4(0)`. This is exactly + // the int4 delegation that used to be spelled out here. } // `JsonbEntryInt4` is deliberately NOT `SignedScalar` — the entry suite does diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index cbdaf19f1..efd06ca4a 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -142,13 +142,27 @@ pub trait ScalarType: /// (e.g. `String`, whose `Default` is the degenerate empty string) override it /// with a real median fixture. pub trait OrderedScalar: ScalarType { - /// The low boundary pivot. Integer scalars return `Self::MIN`; others an - /// explicit sentinel. Present verbatim in `fixture_values()`. - fn min_pivot() -> Self; + /// The low boundary pivot — the smallest `fixture_values()` entry. Derived + /// (the `ScalarType` supertrait bounds `Ord + Clone`), so it is a fixture + /// row by construction and cannot drift out of the fixture table. No impl + /// overrides this. + fn min_pivot() -> Self { + Self::fixture_values() + .iter() + .min() + .expect("an ordered scalar must have at least one fixture value") + .clone() + } - /// The high boundary pivot. Integer scalars return `Self::MAX`; others an - /// explicit sentinel. Present verbatim in `fixture_values()`. - fn max_pivot() -> Self; + /// The high boundary pivot — the largest `fixture_values()` entry. Derived, + /// like `min_pivot()`. No impl overrides this. + fn max_pivot() -> Self { + Self::fixture_values() + .iter() + .max() + .expect("an ordered scalar must have at least one fixture value") + .clone() + } /// The interior pivot. Defaults to `Self::default()` (the numeric origin for /// signed scalars); override where `Default` is not a usable fixture anchor. @@ -222,8 +236,6 @@ macro_rules! temporal_values { variant = $variant:ident, pg_type = $pg:literal, parse = $parse:expr, - min_pivot = $min:expr, - max_pivot = $max:expr, sql_lit = $sql_lit:expr $(,)? ) => { static $cell: std::sync::LazyLock> = std::sync::LazyLock::new(|| { @@ -253,11 +265,9 @@ macro_rules! temporal_values { } impl OrderedScalar for $ty { - fn min_pivot() -> $ty { $min } - fn max_pivot() -> $ty { $max } - // `mid_pivot` inherits the default `Self::default()`. Every chrono - // temporal type's `Default` is the epoch (`1970-01-01` for a date), - // which is also `origin()` — a real fixture and the sign boundary. + // Boundary pivots derive from `fixture_values()`; `mid_pivot` + // inherits `Self::default()` (the epoch), which is `origin()` and a + // real fixture. Nothing to override. } impl SignedScalar for $ty { @@ -313,8 +323,6 @@ temporal_values! { pg_type = "date", parse = |s| chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d") .expect("catalog date fixture must be YYYY-MM-DD"), - min_pivot = chrono::NaiveDate::from_ymd_opt(1900, 1, 1).expect("1900-01-01 valid"), - max_pivot = chrono::NaiveDate::from_ymd_opt(2099, 12, 31).expect("2099-12-31 valid"), sql_lit = |v| format!("'{v}'"), } @@ -334,12 +342,6 @@ temporal_values! { parse = |s| chrono::DateTime::parse_from_rfc3339(s) .expect("catalog timestamptz fixture must be RFC3339") .with_timezone(&chrono::Utc), - min_pivot = "1900-01-01T00:00:00Z" - .parse() - .expect("1900-01-01T00:00:00Z is a valid timestamp"), - max_pivot = "2099-12-31T23:59:59Z" - .parse() - .expect("2099-12-31T23:59:59Z is a valid timestamp"), sql_lit = |v| format!("'{}'", v.to_rfc3339()), } @@ -439,22 +441,10 @@ impl ScalarType for String { } impl OrderedScalar for String { - /// Lexicographic min pivot — the lexicographically-smallest fixture - /// (`"aard"`). Present verbatim in `fixture_values()`; keep in sync with - /// `TEXT_FIXTURES`. - fn min_pivot() -> Self { - "aard".to_string() - } - - /// Lexicographic max pivot — the lexicographically-largest fixture - /// (`"zzzz"`). - fn max_pivot() -> Self { - "zzzz".to_string() - } - /// Interior pivot — a real median fixture. `String::default()` is `""`, /// which is degenerate for ORE (issue #262), so `text` overrides the - /// inherited default with a genuine middle value. + /// inherited default with a genuine middle value. The boundary pivots are + /// inherited (derived from `fixture_values()` = `"aard"`/`"zzzz"`). fn mid_pivot() -> Self { "frank".to_string() } @@ -524,19 +514,9 @@ impl ScalarType for rust_decimal::Decimal { } impl OrderedScalar for rust_decimal::Decimal { - /// The smallest fixture decimal. Present verbatim in `fixture_values()`. - fn min_pivot() -> Self { - use std::str::FromStr; - rust_decimal::Decimal::from_str("-1000000000000").unwrap() - } - - /// The largest fixture decimal. Present verbatim in `fixture_values()`. - fn max_pivot() -> Self { - use std::str::FromStr; - rust_decimal::Decimal::from_str("1000000000000").unwrap() - } - // `mid_pivot` inherits the default `Self::default()` = `Decimal::ZERO` = 0, - // which is a real fixture and the numeric origin. + // Boundary pivots derive from `fixture_values()` (= ±1_000_000_000_000); + // `mid_pivot` inherits `Decimal::ZERO` (`Default`), a real fixture and the + // numeric origin. Nothing to override. } // `Decimal` is deliberately NOT `SignedScalar`: like `text`, it is an @@ -565,6 +545,16 @@ mod numeric_value_guards { "two numeric fixtures alias to the same Decimal value", ); } + + /// `mid_pivot` is the only pivot `numeric` does not derive (it inherits + /// `Decimal::ZERO`). The matrix fetches its ciphertext via + /// `fetch_fixture_payload`, so `0` must be a fixture row present verbatim. + #[test] + fn mid_pivot_is_a_fixture() { + let values = numeric_values(); + let mid = ::mid_pivot(); + assert!(values.contains(&mid), "numeric mid_pivot {mid:?} must be a fixture"); + } } // `bool` is hand-written (the proc-macro emits `impl ScalarType` only for the @@ -1238,3 +1228,33 @@ mod catalog_resolution_tests { assert!(combo_extractor(&spec, &["@>"]).is_err()); } } + +#[cfg(test)] +mod pivot_derivation_tests { + use super::*; + + /// The invariant that lets `min_pivot`/`max_pivot` be DERIVED from + /// `fixture_values()` instead of hand-written: for every ordered scalar the + /// boundary pivots equal the extremes of its own fixture list. Passes with + /// the current hand-written pivots (they already equal the extremes) and + /// keeps passing once the trait derives them — so it guards the refactor in + /// both directions. + fn boundary_pivots_are_fixture_extremes() { + let values = T::fixture_values(); + let want_min = values.iter().min().expect("≥1 fixture").clone(); + let want_max = values.iter().max().expect("≥1 fixture").clone(); + assert_eq!(T::min_pivot(), want_min, "min_pivot must be the smallest fixture"); + assert_eq!(T::max_pivot(), want_max, "max_pivot must be the largest fixture"); + } + + #[test] + fn every_ordered_scalar_pivots_on_its_fixture_extremes() { + boundary_pivots_are_fixture_extremes::(); + boundary_pivots_are_fixture_extremes::(); + boundary_pivots_are_fixture_extremes::(); + boundary_pivots_are_fixture_extremes::(); + boundary_pivots_are_fixture_extremes::>(); + boundary_pivots_are_fixture_extremes::(); + boundary_pivots_are_fixture_extremes::(); + } +} From 0ee631764b5479e4bde1e6c65143e9c0b4522d30 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 13:10:11 +1000 Subject: [PATCH 249/599] test(v3): runtime extractor check for count-distinct dispatch (drop Storage ident-match) --- tests/sqlx/snapshots/matrix_tests.txt | 1 + tests/sqlx/snapshots/matrix_tests_eq_only.txt | 1 + tests/sqlx/snapshots/matrix_tests_text.txt | 1 + tests/sqlx/src/matrix.rs | 19 +++++++++++-------- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/sqlx/snapshots/matrix_tests.txt b/tests/sqlx/snapshots/matrix_tests.txt index 2c8928b8d..fd8635912 100644 --- a/tests/sqlx/snapshots/matrix_tests.txt +++ b/tests/sqlx/snapshots/matrix_tests.txt @@ -203,6 +203,7 @@ scalars::::matrix__storage_aggregate_typecheck_max scalars::::matrix__storage_aggregate_typecheck_min scalars::::matrix__storage_contained_by_blocker scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_distinct_extractor scalars::::matrix__storage_count_path_cast scalars::::matrix__storage_count_typed_column scalars::::matrix__storage_eq_blocker diff --git a/tests/sqlx/snapshots/matrix_tests_eq_only.txt b/tests/sqlx/snapshots/matrix_tests_eq_only.txt index ef0a4f5a9..5f4d19a3b 100644 --- a/tests/sqlx/snapshots/matrix_tests_eq_only.txt +++ b/tests/sqlx/snapshots/matrix_tests_eq_only.txt @@ -37,6 +37,7 @@ scalars::::matrix__storage_aggregate_typecheck_max scalars::::matrix__storage_aggregate_typecheck_min scalars::::matrix__storage_contained_by_blocker scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_distinct_extractor scalars::::matrix__storage_count_path_cast scalars::::matrix__storage_count_typed_column scalars::::matrix__storage_eq_blocker diff --git a/tests/sqlx/snapshots/matrix_tests_text.txt b/tests/sqlx/snapshots/matrix_tests_text.txt index 89dc7f908..6fb89b71b 100644 --- a/tests/sqlx/snapshots/matrix_tests_text.txt +++ b/tests/sqlx/snapshots/matrix_tests_text.txt @@ -289,6 +289,7 @@ scalars::::matrix__storage_aggregate_typecheck_max scalars::::matrix__storage_aggregate_typecheck_min scalars::::matrix__storage_contained_by_blocker scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_distinct_extractor scalars::::matrix__storage_count_path_cast scalars::::matrix__storage_count_typed_column scalars::::matrix__storage_eq_blocker diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 8a35dd147..c92c5fe0d 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -3379,12 +3379,11 @@ macro_rules! __scalar_matrix_count_case { #[macro_export] #[doc(hidden)] macro_rules! __scalar_matrix_count_distinct_dispatch { - // Storage: no DISTINCT case — no extractor to deduplicate by. - ( - suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, - dom_name = $dom_name:ident, variant = Storage $(,)? - ) => {}; - // Eq, Ord, OrdOre — emit the DISTINCT test. + // One arm for EVERY variant — the Storage-vs-rest decision is a RUNTIME + // `extractor_expr().is_none()` early-return inside the body, NOT a + // macro-expansion ident-match on `Storage`. (A `macro_rules!` cannot suppress + // a test item at runtime, so Storage emits a trivially-passing test rather + // than emitting nothing — see Task 6C.) ( suite = $suite:ident, scalar = $scalar:ty, script = $script:literal, script_path = $script_path:literal, dom_name = $dom_name:ident, variant = $variant:ident $(,)? @@ -3397,8 +3396,12 @@ macro_rules! __scalar_matrix_count_distinct_dispatch { use $crate::scalar_domains::ScalarType; let spec = $crate::__scalar_matrix_spec!($scalar, $variant); let d = &spec.sql_domain; - let extractor = spec.extractor_expr("value") - .expect("non-Storage variant must expose an extractor"); + let Some(extractor) = spec.extractor_expr("value") else { + // Storage has no extractor to deduplicate by — the count-distinct + // case is meaningless here, so this emitted test is a trivial pass. + // (Runtime guard, NOT a macro ident-match: that is the point of 6C.) + return Ok(()); + }; let fixture = <$scalar as ScalarType>::fixture_table_name(); let expected = <$scalar as ScalarType>::fixture_values().len() as i64; From bc212141a571c9a8c756b457a055356c43d0ee74 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 14:40:13 +1000 Subject: [PATCH 250/599] =?UTF-8?q?test(v3):=20address=20review=20nits=20?= =?UTF-8?q?=E2=80=94=20fix=20stale=20comments,=20harden=20native-jsonb=20s?= =?UTF-8?q?ymbol=20pin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Folds in four-lens review feedback (all PASS / PASS WITH NITS): - matrix.rs: drop the dangling cross-reference to a non-existent "Critical-context section"; inline the "blocker raises before decryption" rationale. Correct the `-` operator RHS-shape summary (three overloads). - matrix.rs: harden the native-jsonb-blocker arm — the macro body now asserts its swept symbol set equals NATIVE_JSONB_BLOCKER_ARM_SYMBOLS at runtime, so the const is a real guard (not just documentation) and the pub const is genuinely consumed cross-crate. - scalar_domains.rs: fix the stale temporal_values! doc that still described the removed min_pivot/max_pivot params. - signed.rs + reference doc: name int2/int8/timestamptz in the sign-boundary scope (was int/date). --- .../adding-a-scalar-encrypted-domain-type.md | 2 +- tests/sqlx/src/matrix.rs | 31 +++++++++++++++---- tests/sqlx/src/scalar_domains.rs | 5 +-- tests/sqlx/tests/encrypted_domain/signed.rs | 2 +- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 809d35c8b..9a178a53f 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -314,7 +314,7 @@ no live catalog type today) vs `ORDERED_INT_DOMAINS` (→ `[eq, ord]`). (`EQ_ONL is currently unused — `timestamptz` was promoted to the ordered shape once the ORE comparator generalized to N blocks.) The pivot *sweep* is uniform across every ordered type (one canonical snapshot); the signed-only sign-boundary -test (`SignedScalar`, `int`/`date`) lives outside `scalars::` in +test (`SignedScalar`, `int2`/`int4`/`int8`/`date`/`timestamptz`) lives outside `scalars::` in `encrypted_domain/signed.rs`, so a `text` instantiation of it is a compile error and it never enters the inventory snapshot. The `matrix.rs` module header is the canonical, diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index c92c5fe0d..317942c9c 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1242,12 +1242,13 @@ macro_rules! __scalar_matrix_native_absent_case { // Native-jsonb-blocker category — the native jsonb operators that the codegen // surface generates as BLOCKERS on every encrypted domain (neither comparison, // containment, nor path-selector). They must RAISE the EQL "operator X is not -// supported" blocker on every variant, with PLACEHOLDER_PAYLOAD (no fixture -// row needed — see the "blocker raises before decryption" note in the -// Critical-context section). Per-op RHS shapes mirror the native jsonb operator -// signatures (see crates/eql-codegen/src/operator_surface.rs OPERATORS): -// `?`/`-` take text, `?|`/`?&`/`#>`/`#>>`/`#-` take text[], `@?`/`@@` take -// jsonpath, `||` takes jsonb. Replaces the int4-only +// supported" blocker on every variant, with PLACEHOLDER_PAYLOAD. No fixture row +// is needed: the blocker resolves on the operator and raises before any payload +// is read, so any castable sentinel suffices. Per-op RHS shapes mirror the +// native jsonb operator signatures (see +// crates/eql-codegen/src/operator_surface.rs OPERATORS): `?` takes text, `-` +// takes text / integer / text[] (three overloads), `?|`/`?&`/`#>`/`#>>`/`#-` +// take text[], `@?`/`@@` take jsonpath, `||` takes jsonb. Replaces the int4-only // `omitted_native_jsonb_operators_raise_eql_blockers` hand-written test, // extending the guarantee to all storage scalars. // @@ -1365,6 +1366,24 @@ macro_rules! __scalar_matrix_native_jsonb_blocker_case { &pool, &sql, &[Some(payload), Some(payload)], &concat_msg, ).await?; } + + // Guard: the symbols this arm actually sweeps (the `single` op + // keys plus `||`) must equal NATIVE_JSONB_BLOCKER_ARM_SYMBOLS, + // itself pinned to the codegen residual by a sibling #[test]. This + // ties the SQL the arm runs to the pinned set, so a symbol added + // to the const without a matching `single`/`concat` case (or vice + // versa) fails here instead of silently going unexercised. + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = + $crate::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS.to_vec(); + pinned.sort_unstable(); + anyhow::ensure!( + swept == pinned, + "native-jsonb-blocker arm swept {swept:?} but pinned set is {pinned:?}", + ); Ok(()) } } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index efd06ca4a..7bcaf8d13 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -225,8 +225,9 @@ crate::scalar_types!(scalar_type_impls); /// a `#[cfg(test)]` module asserting the parsed values track the catalog and /// include the pivots. The chrono analogue of `eql_scalars::int_values!` /// (integers materialise a `const` slice; temporals can't, so values live in a -/// `LazyLock`). `parse`/`min_pivot`/`max_pivot`/`sql_lit` are expressions so each -/// type supplies its own chrono parsing, sentinel pivots, and SQL literal form. +/// `LazyLock`). `parse`/`sql_lit` are expressions so each type supplies its own +/// chrono parsing and SQL literal form. Boundary pivots are not parameters: they +/// derive from `fixture_values()` via the `OrderedScalar` defaults. macro_rules! temporal_values { ( cell = $cell:ident, diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs index 73f916fb0..08b8b6bcb 100644 --- a/tests/sqlx/tests/encrypted_domain/signed.rs +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -3,7 +3,7 @@ //! matrix. //! //! ORE encrypts signed values as an offset from a numeric origin (`0` for -//! integers, the epoch for dates). This suite asserts the ORE block ordering is +//! integers, the epoch for `date`/`timestamptz`). This suite asserts the ORE block ordering is //! **monotonic across that origin**: a fixture below the origin orders before //! the origin, which orders before a fixture above it — through the encrypted //! `_ord` domain, with no decryption. From 8f28a74eacc6c2c2c8c66daad2c7e95b7a8f0148 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 18 Jun 2026 23:04:33 +1000 Subject: [PATCH 251/599] style(v3): fix rustfmt and clippy items-after-test-module in tests/sqlx Apply rustfmt to scalar_domains.rs assert wrapping and support.rs import, and move the lone native_jsonb_blocker_arm_tests module to end of matrix.rs to satisfy clippy::items-after-test-module. --- tests/sqlx/src/matrix.rs | 54 +++++++++---------- tests/sqlx/src/scalar_domains.rs | 17 ++++-- .../tests/encrypted_domain/family/support.rs | 4 +- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 317942c9c..0a0bc05e3 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1267,33 +1267,6 @@ macro_rules! __scalar_matrix_native_absent_case { pub const NATIVE_JSONB_BLOCKER_ARM_SYMBOLS: &[&str] = &["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"]; -#[cfg(test)] -mod native_jsonb_blocker_arm_tests { - use super::*; - - #[test] - fn native_jsonb_blocker_arm_covers_every_derived_symbol() { - // The arm's hand-written RHS-shape map keys (operator SYMBOLS) must equal - // the codegen residual. `eql-codegen` is not a dependency of this crate, - // so we pin against the same literal 10-symbol vector that - // `native_jsonb_blocker_symbols_are_the_residual_ten` - // (operator_surface.rs) pins against the live `OPERATORS` table. The two - // pins together fail if either side drifts: a 21st native-jsonb operator - // makes the codegen test fail, and updating that test without updating - // this const makes them disagree on review. The RHS operand shapes stay - // hand-written; only the symbol SET is asserted. - let mut arm: Vec<&str> = NATIVE_JSONB_BLOCKER_ARM_SYMBOLS.to_vec(); - let mut want = vec!["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"]; - arm.sort_unstable(); - want.sort_unstable(); - assert_eq!( - arm, want, - "native-jsonb-blocker arm symbol set must equal the codegen residual; \ - arm={NATIVE_JSONB_BLOCKER_ARM_SYMBOLS:?}", - ); - } -} - #[macro_export] #[doc(hidden)] macro_rules! __scalar_matrix_native_jsonb_blocker_outer { @@ -3450,3 +3423,30 @@ macro_rules! __scalar_matrix_count_distinct_dispatch { } }; } + +#[cfg(test)] +mod native_jsonb_blocker_arm_tests { + use super::*; + + #[test] + fn native_jsonb_blocker_arm_covers_every_derived_symbol() { + // The arm's hand-written RHS-shape map keys (operator SYMBOLS) must equal + // the codegen residual. `eql-codegen` is not a dependency of this crate, + // so we pin against the same literal 10-symbol vector that + // `native_jsonb_blocker_symbols_are_the_residual_ten` + // (operator_surface.rs) pins against the live `OPERATORS` table. The two + // pins together fail if either side drifts: a 21st native-jsonb operator + // makes the codegen test fail, and updating that test without updating + // this const makes them disagree on review. The RHS operand shapes stay + // hand-written; only the symbol SET is asserted. + let mut arm: Vec<&str> = NATIVE_JSONB_BLOCKER_ARM_SYMBOLS.to_vec(); + let mut want = vec!["?", "?|", "?&", "@?", "@@", "#>", "#>>", "-", "#-", "||"]; + arm.sort_unstable(); + want.sort_unstable(); + assert_eq!( + arm, want, + "native-jsonb-blocker arm symbol set must equal the codegen residual; \ + arm={NATIVE_JSONB_BLOCKER_ARM_SYMBOLS:?}", + ); + } +} diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 7bcaf8d13..2ed30c33e 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -554,7 +554,10 @@ mod numeric_value_guards { fn mid_pivot_is_a_fixture() { let values = numeric_values(); let mid = ::mid_pivot(); - assert!(values.contains(&mid), "numeric mid_pivot {mid:?} must be a fixture"); + assert!( + values.contains(&mid), + "numeric mid_pivot {mid:?} must be a fixture" + ); } } @@ -1244,8 +1247,16 @@ mod pivot_derivation_tests { let values = T::fixture_values(); let want_min = values.iter().min().expect("≥1 fixture").clone(); let want_max = values.iter().max().expect("≥1 fixture").clone(); - assert_eq!(T::min_pivot(), want_min, "min_pivot must be the smallest fixture"); - assert_eq!(T::max_pivot(), want_max, "max_pivot must be the largest fixture"); + assert_eq!( + T::min_pivot(), + want_min, + "min_pivot must be the smallest fixture" + ); + assert_eq!( + T::max_pivot(), + want_max, + "max_pivot must be the largest fixture" + ); } #[test] diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index 4f87524e3..9e58ff616 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -4,9 +4,7 @@ //! depends on. use anyhow::Result; -use eql_tests::{ - sql_string_literal, ScalarDomainSpec, ScalarType, Variant, PLACEHOLDER_PAYLOAD, -}; +use eql_tests::{sql_string_literal, ScalarDomainSpec, ScalarType, Variant, PLACEHOLDER_PAYLOAD}; use sqlx::PgPool; #[test] From 04a18d6818964d47838fef93e5d202e89023888b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 09:45:32 +1000 Subject: [PATCH 252/599] test(v3): pin ordered-scalar oracle inventory against catalog --- tests/sqlx/src/scalar_domains.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 2ed30c33e..3a4a241fa 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1270,3 +1270,31 @@ mod pivot_derivation_tests { boundary_pivots_are_fixture_extremes::(); } } + +#[cfg(test)] +mod oracle_inventory_tests { + use super::*; + use eql_scalars::CATALOG; + + /// The set of catalog tokens that should get an `eq` + `ord` fixture/e2e + /// oracle suite is exactly the ordered (non-storage-only) scalars. Pin it so + /// the catalog-driven suite macros (fixture_oracle / e2e_oracle) cannot drift + /// from the catalog. `bool` is storage-only and must be excluded. + #[test] + fn ordered_scalar_tokens_match_catalog() { + // `supports_ord` calls `terms_for`, which PANICS on an undeclared + // (token, suffix) pair, so guard with `is_declared_for` first — bool has + // no `_ord` domain and must short-circuit to false, not panic. + let ordered: Vec<&str> = CATALOG + .iter() + .filter(|s| Variant::Ord.is_declared_for(s.token) && Variant::Ord.supports_ord(s.token)) + .map(|s| s.token) + .collect(); + assert_eq!( + ordered, + vec!["int4", "int2", "int8", "date", "timestamptz", "numeric", "text"], + ); + // bool is storage-only: no ordered domain, so it is excluded. + assert!(!ordered.contains(&"bool")); + } +} From cd9280a74bb9b6835a26ac3b06178e45808a8fb2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 09:50:40 +1000 Subject: [PATCH 253/599] test(v3): add numeric arm to embedded_fixture_sql (close fixture-oracle gap) --- tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index c79190d46..a886cdfd6 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -60,6 +60,10 @@ fn embedded_fixture_sql() -> &'static str { "/fixtures/eql_v2_timestamptz.sql" )) } + "numeric" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_numeric.sql" + )), other => panic!( "no embedded fixture for catalog token '{other}'; \ add an include_str! arm in fixture_oracle.rs" From 41282361afef9bccdcbb0e4f857fefd444b7d9ac Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 09:56:44 +1000 Subject: [PATCH 254/599] test(v3): fold int4 into fixture_oracle_suite!, unify cases=32, add numeric --- .../property/fixture_oracle.rs | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index a886cdfd6..5e940ab03 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -203,15 +203,10 @@ async fn run_ord_oracle(pool: PgPool, cases: u32) -> Result<()> { .await } -#[sqlx::test] -async fn prop_int4_eq_oracle_over_fixture(pool: PgPool) -> Result<()> { - run_eq_oracle::(pool, 48).await -} - -#[sqlx::test] -async fn prop_int4_ord_oracle_over_fixture(pool: PgPool) -> Result<()> { - run_ord_oracle::(pool, 48).await -} +/// All fixtured scalars run the same number of proptest cases — the fixture +/// suite does no new encryption, so there is no reason for int4 to be +/// privileged. Raise here (one place) if a regression ever needs more cases. +const FIXTURE_ORACLE_CASES: u32 = 32; macro_rules! fixture_oracle_suite { ($modname:ident, $ty:ty, ordered) => { @@ -219,11 +214,11 @@ macro_rules! fixture_oracle_suite { use super::*; #[sqlx::test] async fn eq_oracle(pool: PgPool) -> Result<()> { - run_eq_oracle::<$ty>(pool, 32).await + run_eq_oracle::<$ty>(pool, FIXTURE_ORACLE_CASES).await } #[sqlx::test] async fn ord_oracle(pool: PgPool) -> Result<()> { - run_ord_oracle::<$ty>(pool, 32).await + run_ord_oracle::<$ty>(pool, FIXTURE_ORACLE_CASES).await } } }; @@ -232,14 +227,16 @@ macro_rules! fixture_oracle_suite { use super::*; #[sqlx::test] async fn eq_oracle(pool: PgPool) -> Result<()> { - run_eq_oracle::<$ty>(pool, 32).await + run_eq_oracle::<$ty>(pool, FIXTURE_ORACLE_CASES).await } } }; } +fixture_oracle_suite!(int4, i32, ordered); fixture_oracle_suite!(int2, i16, ordered); fixture_oracle_suite!(int8, i64, ordered); fixture_oracle_suite!(date, chrono::NaiveDate, ordered); +fixture_oracle_suite!(timestamptz, chrono::DateTime, ordered); +fixture_oracle_suite!(numeric, rust_decimal::Decimal, ordered); fixture_oracle_suite!(text, String, ordered); -fixture_oracle_suite!(timestamptz, chrono::DateTime, eq_only); From acc35216c0200b3ead348ef3d85b95582cdeb830 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 10:01:37 +1000 Subject: [PATCH 255/599] test(v3): e2e_oracle_suite! macro; derive Cast from EqlPlaintext; fold int e2e fns --- .../encrypted_domain/property/e2e_oracle.rs | 60 +++++++------------ 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index 0d67c8010..03040b019 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -9,7 +9,7 @@ use anyhow::Result; use eql_tests::fixtures::cipherstash::{column_config_for, encrypt_store}; -use eql_tests::fixtures::eql_plaintext::{Cast, EqlPlaintext}; +use eql_tests::fixtures::eql_plaintext::EqlPlaintext; use eql_tests::fixtures::index_kind::IndexKind; use eql_tests::property::{ assert_eq_oracle, assert_ord_oracle, connect_pool, ensure_eql_installed, Row, @@ -20,13 +20,15 @@ use proptest::prelude::*; use proptest::test_runner::{Config, TestCaseError, TestRunner}; use sqlx::PgPool; -/// Encrypt a batch of plaintext integers into `(plaintext, payload_json)` rows +/// Encrypt a batch of plaintext values into `(plaintext, payload_json)` rows /// via the existing fixture oracle. One ZeroKMS round trip for the whole batch. -async fn encrypt_rows(pool_table: &str, cast: Cast, values: &[T]) -> Result>> +/// The EQL cast is the type's own `EqlPlaintext::CAST` — never passed in, so it +/// cannot drift from `T`. +async fn encrypt_rows(pool_table: &str, values: &[T]) -> Result>> where T: ScalarType + EqlPlaintext + Clone, { - let config = column_config_for(&[IndexKind::Unique, IndexKind::Ore], cast)?; + let config = column_config_for(&[IndexKind::Unique, IndexKind::Ore], ::CAST)?; let payloads = encrypt_store(pool_table, "payload", values, &config).await?; // Fail fast on a count mismatch: a silent `zip` truncation would weaken the // oracle (fewer pairs than intended) and hide an encrypt_store contract @@ -52,7 +54,6 @@ where /// encryption + oracle is async on a current-thread runtime. fn run_e2e_property( table: &str, - cast: Cast, cases: u32, ordered: bool, seeds: &[T], @@ -96,7 +97,7 @@ where values.push(dup0); values.push(dup1); let rows = rt - .block_on(encrypt_rows::(table, cast, &values)) + .block_on(encrypt_rows::(table, &values)) // `{e:#}` keeps anyhow's full cause chain (the underlying error), // which a plain `{e}` would drop. .map_err(|e| TestCaseError::fail(format!("encrypt: {e:#}")))?; @@ -114,36 +115,21 @@ where .map_err(|e| anyhow::anyhow!("e2e property failed: {e}")) } -#[test] -fn prop_int4_eq_and_ord_oracle_e2e() -> Result<()> { - // Low case count: each case is a ZeroKMS round trip. 8 keeps CI bounded. - run_e2e_property::( - "proptest_e2e_int4", - Cast::INT, - 8, - true, - &[i32::MIN, 0, i32::MAX], - ) +/// Each e2e case is a ZeroKMS round trip, so the case count stays low (8 keeps +/// CI bounded). One macro line per ordered scalar; the EQL cast is derived from +/// the type, the seeds are the per-type extremes + origin. +macro_rules! e2e_oracle_suite { + ($modname:ident, $ty:ty, $table:literal, seeds = [$($seed:expr),* $(,)?]) => { + mod $modname { + use super::*; + #[test] + fn e2e_oracle() -> Result<()> { + run_e2e_property::<$ty>($table, 8, true, &[$($seed),*]) + } + } + }; } -#[test] -fn prop_int2_eq_and_ord_oracle_e2e() -> Result<()> { - run_e2e_property::( - "proptest_e2e_int2", - Cast::SMALL_INT, - 8, - true, - &[i16::MIN, 0, i16::MAX], - ) -} - -#[test] -fn prop_int8_eq_and_ord_oracle_e2e() -> Result<()> { - run_e2e_property::( - "proptest_e2e_int8", - Cast::BIG_INT, - 8, - true, - &[i64::MIN, 0, i64::MAX], - ) -} +e2e_oracle_suite!(int4, i32, "proptest_e2e_int4", seeds = [i32::MIN, 0, i32::MAX]); +e2e_oracle_suite!(int2, i16, "proptest_e2e_int2", seeds = [i16::MIN, 0, i16::MAX]); +e2e_oracle_suite!(int8, i64, "proptest_e2e_int8", seeds = [i64::MIN, 0, i64::MAX]); From 8f874af2f9cd449725f3e05dd623afc10fb44c16 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 10:02:57 +1000 Subject: [PATCH 256/599] test(v3): add kind-agnostic lazy_values! materializer macro --- tests/sqlx/src/scalar_domains.rs | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 3a4a241fa..04721e42f 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -309,6 +309,40 @@ macro_rules! temporal_values { }; } +/// Materialise a scalar's catalog fixtures into a `LazyLock>` plus a +/// public accessor, parsing each `Fixture` via the supplied closure. The +/// kind-agnostic core shared by every non-integer scalar: `temporal_values!` +/// adds the chrono-specific `ScalarType`/`OrderedScalar`/`SignedScalar` wiring on +/// top, while `text`/`numeric` supply their own (they are not signed). Integer +/// scalars do not use this — they materialise a `const` slice in `eql-scalars` +/// (`int_values!`) and impl `ScalarType` via the proc-macro. +/// +/// `$variant` is the `eql_scalars::Fixture` variant this scalar's rows use +/// (`Text`/`Numeric`/`Date`/`Timestamptz`); `$parse` maps each `&Fixture` to +/// `$ty` (and owns its own loud "wrong variant" panic). The accessor is `pub` so +/// the `eql_v2_` fixture module can hand the slice to `scalar_fixture!`. +macro_rules! lazy_values { + ( + cell = $cell:ident, + accessor = $accessor:ident, + rust_type = $ty:ty, + spec = $spec:path, + variant = $variant:ident, + pg_type = $pg:literal, + parse = $parse:expr $(,)? + ) => { + static $cell: std::sync::LazyLock> = std::sync::LazyLock::new(|| { + let parse: fn(&::eql_scalars::Fixture) -> $ty = $parse; + $spec.fixtures.iter().map(parse).collect() + }); + + #[doc = concat!("Typed `", stringify!($ty), "` fixtures for `", $pg, "`, materialised once from the catalog.")] + pub fn $accessor() -> &'static [$ty] { + &$cell + } + }; +} + // `date`'s `ScalarType` wiring is generated from its catalog row by // `temporal_values!` — the chrono analogue of the integer `int_values!` path. // Values can't be a `const` slice (`from_ymd_opt` is not `const`), so they live From 261da82207063c550e1bd0a5681d534b4735d2eb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 10:03:39 +1000 Subject: [PATCH 257/599] test(v3): collapse text materializer onto lazy_values! --- tests/sqlx/src/scalar_domains.rs | 35 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 04721e42f..8c3d80c0c 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -441,24 +441,23 @@ mod timestamptz_value_guards { // `text_values()` is public so the `eql_v2_text` fixture module (emitted by // `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. -/// Typed `String` fixture values, built once from `text`'s catalog row. -/// `eql_scalars::TEXT_VALUES` is a `&[&'static str]` const, but the `ScalarType` -/// contract returns `&[Self]` = `&[String]` (owned), so we materialise them into -/// a `LazyLock>` and return a borrow — the same shape as -/// `date_values`. (Unlike `date`, no parsing is needed; the values are the -/// strings verbatim.) -static TEXT_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock::new(|| { - eql_scalars::TEXT_VALUES - .iter() - .map(|s| s.to_string()) - .collect() -}); - -/// The `String` fixture values, in catalog order. Public so the `eql_v2_text` -/// fixture module (emitted by `scalar_types!(fixture_modules)`) can hand the -/// slice to `scalar_fixture!`. -pub fn text_values() -> &'static [String] { - &TEXT_VALUES_CELL +// `text`'s value wiring now goes through the shared `lazy_values!` materializer +// (the same macro `numeric` uses), parsing the catalog's `Fixture::Text` rows +// directly. `text_values()` stays public so the `eql_v2_text` fixture module +// (emitted by `scalar_types!(fixture_modules)`) can hand the slice to +// `scalar_fixture!`. The `to_sql_literal` / `mid_pivot` / `MatchScalar` methods +// below are `text`'s genuinely-differing bits and remain hand-written. +lazy_values! { + cell = TEXT_VALUES_CELL, + accessor = text_values, + rust_type = String, + spec = eql_scalars::TEXT, + variant = Text, + pg_type = "text", + parse = |f| match f { + eql_scalars::Fixture::Text(s) => s.to_string(), + other => panic!("non-text fixture in text catalog row: {other:?}"), + }, } impl ScalarType for String { From 2a1f2be60bbebc6ad61bfbb8bdcc75311f4c1eae Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 10:04:13 +1000 Subject: [PATCH 258/599] test(v3): collapse numeric materializer onto lazy_values! --- tests/sqlx/src/scalar_domains.rs | 41 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 8c3d80c0c..f6f91309b 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -514,26 +514,27 @@ impl MatchScalar for String { // a `LazyLock>` rather than going through `temporal_values!`. The // catalog stays zero-dep, so the parse happens here, not in `eql-scalars`. -/// Typed `Decimal` fixture values, parsed once from `numeric`'s catalog row. -static NUMERIC_VALUES_CELL: std::sync::LazyLock> = - std::sync::LazyLock::new(|| { - use std::str::FromStr; - eql_scalars::NUMERIC - .fixtures - .iter() - .map(|f| match f { - eql_scalars::Fixture::Numeric(s) => rust_decimal::Decimal::from_str(s) - .unwrap_or_else(|e| panic!("invalid numeric catalog fixture {s:?}: {e}")), - other => panic!("non-numeric fixture in numeric catalog row: {other:?}"), - }) - .collect() - }); - -/// The `Decimal` fixture values, in catalog order. Public so the `eql_v2_numeric` -/// fixture module (emitted by `scalar_types!(fixture_modules)`) can hand the -/// slice to `scalar_fixture!`. -pub fn numeric_values() -> &'static [rust_decimal::Decimal] { - &NUMERIC_VALUES_CELL +// `numeric`'s value wiring goes through the shared `lazy_values!` materializer +// (same as `text`), parsing the catalog's `Fixture::Numeric` strings into +// `Decimal`. `numeric_values()` stays public so the `eql_v2_numeric` fixture +// module (emitted by `scalar_types!(fixture_modules)`) can hand the slice to +// `scalar_fixture!`. `numeric` has no `to_sql_literal`/`mid_pivot` overrides — +// only the value materialization is shared. +lazy_values! { + cell = NUMERIC_VALUES_CELL, + accessor = numeric_values, + rust_type = rust_decimal::Decimal, + spec = eql_scalars::NUMERIC, + variant = Numeric, + pg_type = "numeric", + parse = |f| match f { + eql_scalars::Fixture::Numeric(s) => { + use std::str::FromStr; + rust_decimal::Decimal::from_str(s) + .unwrap_or_else(|e| panic!("invalid numeric catalog fixture {s:?}: {e}")) + } + other => panic!("non-numeric fixture in numeric catalog row: {other:?}"), + }, } impl ScalarType for rust_decimal::Decimal { From 8b9cd217cdaba66eaa258fb263b807487354b0e9 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 11:49:21 +1000 Subject: [PATCH 259/599] test(v3): add arbitrary_value() value-generator seam to ScalarType Required (not defaulted) trait method: a where Self: Arbitrary bound on a default leaks into the method contract for every generic caller, which the non-Arbitrary scalars (String/Decimal/NaiveDate) cannot satisfy. Integers supply any::() via the eql-tests-macros proc-macro; non-integer scalars (and bool/JsonbEntryInt4) sample their cast-valid fixture set. --- crates/eql-tests-macros/src/lib.rs | 8 ++++ tests/sqlx/src/jsonb_entry.rs | 8 ++++ tests/sqlx/src/scalar_domains.rs | 70 ++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 784f40a06..7b920b54d 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -181,6 +181,14 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { fn fixture_values() -> &'static [#rust_type] { ::eql_scalars::#values } + + /// Integers draw the full `any::()` range — the e2e + /// suite's value over the fixture suite is fresh, arbitrary + /// plaintexts, not a re-encryption of the fixed fixture set. + fn arbitrary_value() -> ::proptest::strategy::BoxedStrategy<#rust_type> { + use ::proptest::strategy::Strategy; + ::proptest::prelude::any::<#rust_type>().boxed() + } } impl OrderedScalar for #rust_type { diff --git a/tests/sqlx/src/jsonb_entry.rs b/tests/sqlx/src/jsonb_entry.rs index 69022121b..863dc7760 100644 --- a/tests/sqlx/src/jsonb_entry.rs +++ b/tests/sqlx/src/jsonb_entry.rs @@ -94,6 +94,14 @@ impl ScalarType for JsonbEntryInt4 { fn ord_extractor_expr(value_expr: &str) -> String { format!("eql_v3.ore_cllw({value_expr})") } + + // Not an e2e/property-oracle type (the entry suite runs the jsonb_entry + // matrix, not the value oracle), but `arbitrary_value` is a required + // `ScalarType` method — sample the wrapped int4 fixtures. + fn arbitrary_value() -> proptest::strategy::BoxedStrategy { + use proptest::strategy::Strategy; + proptest::sample::select(Self::fixture_values().to_vec()).boxed() + } } impl OrderedScalar for JsonbEntryInt4 { diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index f6f91309b..9f4bfed0f 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -127,6 +127,22 @@ pub trait ScalarType: values.sort(); values } + + /// A proptest strategy producing fresh plaintexts for the e2e oracle. + /// + /// The e2e suite encrypts each generated value end-to-end through ZeroKMS, + /// so the strategy MUST only produce values the type's EQL cast accepts. + /// + /// Required (not defaulted on purpose): a `where Self: Arbitrary` bound on a + /// provided default leaks into the method's contract for EVERY caller — + /// including the generic `T: ScalarType` oracle drivers — so `String` / + /// `Decimal` / `NaiveDate` (not `Arbitrary`) could never satisfy it, even + /// though they override the body. Making it required keeps the bound off the + /// signature. Integers supply the full `any::()` range (proc-macro + /// generated, in `eql-tests-macros`); non-integer scalars sample their + /// cast-valid fixture set — the only bounded strategy `Arbitrary` can't give + /// them, and always cast-valid because every fixture already round-trips. + fn arbitrary_value() -> proptest::strategy::BoxedStrategy; } /// An **ordered** scalar — one whose `_ord` domains support `<`/`<=`/`>`/`>=`. @@ -263,6 +279,14 @@ macro_rules! temporal_values { let f: fn(&$ty) -> String = $sql_lit; f(value) } + fn arbitrary_value() -> proptest::strategy::BoxedStrategy<$ty> { + use proptest::strategy::Strategy; + // Sample the catalog fixture values — every one is cast-valid and + // already exercised by the fixture suite; the e2e novelty is that + // the SAME plaintext is independently re-encrypted, which the + // duplicate-injection in run_e2e_property guarantees. + proptest::sample::select($accessor().to_vec()).boxed() + } } impl OrderedScalar for $ty { @@ -472,6 +496,11 @@ impl ScalarType for String { fn to_sql_literal(value: &Self) -> String { format!("'{}'", value.replace('\'', "''")) } + + fn arbitrary_value() -> proptest::strategy::BoxedStrategy { + use proptest::strategy::Strategy; + proptest::sample::select(text_values().to_vec()).boxed() + } } impl OrderedScalar for String { @@ -546,6 +575,11 @@ impl ScalarType for rust_decimal::Decimal { // `to_sql_literal` inherits the default (`value.to_string()`): a `Decimal`'s // `Display` form (e.g. `-1000000000000`, `0.001`) is a valid SQL numeric // literal, so no quoting/override is needed (unlike `text` / `date`). + + fn arbitrary_value() -> proptest::strategy::BoxedStrategy { + use proptest::strategy::Strategy; + proptest::sample::select(numeric_values().to_vec()).boxed() + } } impl OrderedScalar for rust_decimal::Decimal { @@ -631,6 +665,14 @@ impl ScalarType for bool { } // `to_sql_literal` inherits the default (`value.to_string()` => `true`/`false`), // which is a valid SQL boolean literal, so no override is needed. + + // `bool` is storage-only and never feeds an oracle suite, but `arbitrary_value` + // is a required `ScalarType` method, so sample its two fixtures like every + // other non-integer scalar. + fn arbitrary_value() -> proptest::strategy::BoxedStrategy { + use proptest::strategy::Strategy; + proptest::sample::select(bool_values().to_vec()).boxed() + } } // `bool` is deliberately NOT `OrderedScalar` / `SignedScalar` / `MatchScalar`: @@ -1305,6 +1347,34 @@ mod pivot_derivation_tests { } } +#[cfg(test)] +mod arbitrary_value_tests { + use super::*; + use proptest::strategy::Strategy; + use proptest::test_runner::TestRunner; + + fn draws_a_value() { + let strat = T::arbitrary_value(); + let mut runner = TestRunner::default(); + // A single successful draw proves the strategy is wired and non-empty. + let tree = strat + .new_tree(&mut runner) + .expect("arbitrary_value strategy must produce a value"); + let _v: T = proptest::strategy::ValueTree::current(&tree); + } + + #[test] + fn every_ordered_scalar_has_a_working_value_strategy() { + draws_a_value::(); + draws_a_value::(); + draws_a_value::(); + draws_a_value::(); + draws_a_value::>(); + draws_a_value::(); + draws_a_value::(); + } +} + #[cfg(test)] mod oracle_inventory_tests { use super::*; From 0d52fc5a21d0117cbf5360ea6c3631b03dc7a982 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 11:56:16 +1000 Subject: [PATCH 260/599] test(v3): extend e2e oracle to date/timestamptz/numeric/text via arbitrary_value() Switch the e2e strategy from any::() to T::arbitrary_value() and instantiate the suite for every ordered scalar, closing the cross-ciphertext equality gap end-to-end for non-integer types. Promote proptest to a regular dependency: the arbitrary_value trait method is non-test and must resolve when the lib compiles as a dependency of the integration test target. --- tests/sqlx/Cargo.toml | 6 +++-- .../tests/encrypted_domain/property/README.md | 8 ++++-- .../encrypted_domain/property/e2e_oracle.rs | 26 ++++++++++++++++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 4695518e0..231f0e442 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -24,8 +24,10 @@ rust_decimal = "1" paste = "1" eql-scalars = { path = "../../crates/eql-scalars" } eql-tests-macros = { path = "../../crates/eql-tests-macros" } - -[dev-dependencies] +# proptest is a regular dependency (not dev-only): `ScalarType::arbitrary_value` +# is a non-test trait method returning `proptest::strategy::BoxedStrategy`, so the +# lib must see proptest when compiled as a normal dependency of the integration +# test targets (`tests/encrypted_domain`), not just under `cfg(test)`. proptest = "1" [lints] diff --git a/tests/sqlx/tests/encrypted_domain/property/README.md b/tests/sqlx/tests/encrypted_domain/property/README.md index 08edb64aa..01a5ff2ac 100644 --- a/tests/sqlx/tests/encrypted_domain/property/README.md +++ b/tests/sqlx/tests/encrypted_domain/property/README.md @@ -48,8 +48,12 @@ querying. Gated behind the `proptest-e2e` cargo feature — `mise run test:sqlx` enables it (CI has the secrets); a bare `cargo test` compiles it out. It is the **only** suite that can exercise "same plaintext, *different* ciphertext" (equality across independently-encrypted values), because the committed fixture -corpus has no duplicate plaintexts. Integer scalars only for now (random `T` -generation is trivial for integers). +corpus has no duplicate plaintexts. Covers every ordered scalar +(int2/int4/int8/date/timestamptz/numeric/text) via the +`ScalarType::arbitrary_value()` strategy seam — integers draw the full +`any::()` range, non-integer scalars sample their cast-valid fixture set +(their plaintexts have no usable bounded `Arbitrary`). `bool` is storage-only +(no ordered domain) and is the only scalar excluded. ## The shared oracle engine diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index 03040b019..956df7195 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -60,8 +60,6 @@ fn run_e2e_property( ) -> Result<()> where T: ScalarType + EqlPlaintext + Clone + 'static, - T: proptest::arbitrary::Arbitrary, - ::Strategy: 'static, { let rt = tokio::runtime::Builder::new_current_thread() .enable_all() @@ -88,7 +86,9 @@ where // of the first two random values. Seeds guarantee min/max/zero coverage; // duplicates guarantee the eq-true branch across independently encrypted // ciphertexts. - let strategy = prop::collection::vec(any::(), 2..11); + // Per-type bounded strategy (see ScalarType::arbitrary_value): integers draw + // the full range, non-integer scalars draw from their cast-valid fixture set. + let strategy = prop::collection::vec(T::arbitrary_value(), 2..11); runner .run(&strategy, |mut values| { let dup0 = values[0].clone(); @@ -133,3 +133,23 @@ macro_rules! e2e_oracle_suite { e2e_oracle_suite!(int4, i32, "proptest_e2e_int4", seeds = [i32::MIN, 0, i32::MAX]); e2e_oracle_suite!(int2, i16, "proptest_e2e_int2", seeds = [i16::MIN, 0, i16::MAX]); e2e_oracle_suite!(int8, i64, "proptest_e2e_int8", seeds = [i64::MIN, 0, i64::MAX]); +e2e_oracle_suite!(date, chrono::NaiveDate, "proptest_e2e_date", + seeds = [ + chrono::NaiveDate::from_ymd_opt(1900, 1, 1).unwrap(), + chrono::NaiveDate::default(), + chrono::NaiveDate::from_ymd_opt(2099, 12, 31).unwrap(), + ]); +e2e_oracle_suite!(timestamptz, chrono::DateTime, "proptest_e2e_timestamptz", + seeds = [ + chrono::DateTime::parse_from_rfc3339("1900-01-01T00:00:00Z").unwrap().with_timezone(&chrono::Utc), + chrono::DateTime::::default(), + chrono::DateTime::parse_from_rfc3339("2099-12-31T23:59:59Z").unwrap().with_timezone(&chrono::Utc), + ]); +e2e_oracle_suite!(numeric, rust_decimal::Decimal, "proptest_e2e_numeric", + seeds = [ + ::from_str("-1000000000000").unwrap(), + rust_decimal::Decimal::ZERO, + ::from_str("1000000000000").unwrap(), + ]); +e2e_oracle_suite!(text, String, "proptest_e2e_text", + seeds = ["aard".to_string(), "frank".to_string(), "zzzz".to_string()]); From a8b99ca0f54dfff34d17a69a02697601a586e9bc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 11:56:56 +1000 Subject: [PATCH 261/599] test(v3): backstop ordered-scalar oracle wiring against catalog drift --- tests/sqlx/src/scalar_domains.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 9f4bfed0f..5b14fbcd7 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1401,4 +1401,30 @@ mod oracle_inventory_tests { // bool is storage-only: no ordered domain, so it is excluded. assert!(!ordered.contains(&"bool")); } + + /// Drift guard: the ordered-scalar set below is the EXACT list that must + /// appear as `fixture_oracle_suite!(…, ordered)` in `fixture_oracle.rs` AND + /// `e2e_oracle_suite!(…)` in `e2e_oracle.rs`. Those macro lists live in the + /// test binary and cannot be introspected from here, so this test pins the + /// expected set; a new ordered scalar added to CATALOG fails here until both + /// suite lists are updated. (The matrix tier has its own gate: + /// `mise run test:matrix:inventory`.) + #[test] + fn ordered_scalars_requiring_oracle_wiring() { + // Same `is_declared_for` guard as above: `supports_ord` panics on a + // scalar with no `_ord` domain (bool), so short-circuit first. + let ordered: Vec<&str> = CATALOG + .iter() + .filter(|s| Variant::Ord.is_declared_for(s.token) && Variant::Ord.supports_ord(s.token)) + .map(|s| s.token) + .collect(); + // Keep in lockstep with the fixture_oracle_suite! / e2e_oracle_suite! + // instantiation lists. + assert_eq!( + ordered, + vec!["int4", "int2", "int8", "date", "timestamptz", "numeric", "text"], + "a new ordered scalar must be wired into BOTH oracle suites \ + (fixture_oracle.rs and e2e_oracle.rs)" + ); + } } From 177a27e1578b1bcda60c43c3ec127cfb83ea520d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 11:58:27 +1000 Subject: [PATCH 262/599] style(v3): rustfmt the new oracle wiring (vec! lists, macro call args) --- tests/sqlx/src/scalar_domains.rs | 20 ++++- .../encrypted_domain/property/e2e_oracle.rs | 73 ++++++++++++++----- 2 files changed, 71 insertions(+), 22 deletions(-) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 5b14fbcd7..318e2e890 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1396,7 +1396,15 @@ mod oracle_inventory_tests { .collect(); assert_eq!( ordered, - vec!["int4", "int2", "int8", "date", "timestamptz", "numeric", "text"], + vec![ + "int4", + "int2", + "int8", + "date", + "timestamptz", + "numeric", + "text" + ], ); // bool is storage-only: no ordered domain, so it is excluded. assert!(!ordered.contains(&"bool")); @@ -1422,7 +1430,15 @@ mod oracle_inventory_tests { // instantiation lists. assert_eq!( ordered, - vec!["int4", "int2", "int8", "date", "timestamptz", "numeric", "text"], + vec![ + "int4", + "int2", + "int8", + "date", + "timestamptz", + "numeric", + "text" + ], "a new ordered scalar must be wired into BOTH oracle suites \ (fixture_oracle.rs and e2e_oracle.rs)" ); diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index 956df7195..905fc4d4a 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -28,7 +28,10 @@ async fn encrypt_rows(pool_table: &str, values: &[T]) -> Result>> where T: ScalarType + EqlPlaintext + Clone, { - let config = column_config_for(&[IndexKind::Unique, IndexKind::Ore], ::CAST)?; + let config = column_config_for( + &[IndexKind::Unique, IndexKind::Ore], + ::CAST, + )?; let payloads = encrypt_store(pool_table, "payload", values, &config).await?; // Fail fast on a count mismatch: a silent `zip` truncation would weaken the // oracle (fewer pairs than intended) and hide an encrypt_store contract @@ -52,12 +55,7 @@ where /// Drive proptest: each case is a corpus of integers. Generation is in-process; /// encryption + oracle is async on a current-thread runtime. -fn run_e2e_property( - table: &str, - cases: u32, - ordered: bool, - seeds: &[T], -) -> Result<()> +fn run_e2e_property(table: &str, cases: u32, ordered: bool, seeds: &[T]) -> Result<()> where T: ScalarType + EqlPlaintext + Clone + 'static, { @@ -130,26 +128,61 @@ macro_rules! e2e_oracle_suite { }; } -e2e_oracle_suite!(int4, i32, "proptest_e2e_int4", seeds = [i32::MIN, 0, i32::MAX]); -e2e_oracle_suite!(int2, i16, "proptest_e2e_int2", seeds = [i16::MIN, 0, i16::MAX]); -e2e_oracle_suite!(int8, i64, "proptest_e2e_int8", seeds = [i64::MIN, 0, i64::MAX]); -e2e_oracle_suite!(date, chrono::NaiveDate, "proptest_e2e_date", +e2e_oracle_suite!( + int4, + i32, + "proptest_e2e_int4", + seeds = [i32::MIN, 0, i32::MAX] +); +e2e_oracle_suite!( + int2, + i16, + "proptest_e2e_int2", + seeds = [i16::MIN, 0, i16::MAX] +); +e2e_oracle_suite!( + int8, + i64, + "proptest_e2e_int8", + seeds = [i64::MIN, 0, i64::MAX] +); +e2e_oracle_suite!( + date, + chrono::NaiveDate, + "proptest_e2e_date", seeds = [ chrono::NaiveDate::from_ymd_opt(1900, 1, 1).unwrap(), chrono::NaiveDate::default(), chrono::NaiveDate::from_ymd_opt(2099, 12, 31).unwrap(), - ]); -e2e_oracle_suite!(timestamptz, chrono::DateTime, "proptest_e2e_timestamptz", + ] +); +e2e_oracle_suite!( + timestamptz, + chrono::DateTime, + "proptest_e2e_timestamptz", seeds = [ - chrono::DateTime::parse_from_rfc3339("1900-01-01T00:00:00Z").unwrap().with_timezone(&chrono::Utc), + chrono::DateTime::parse_from_rfc3339("1900-01-01T00:00:00Z") + .unwrap() + .with_timezone(&chrono::Utc), chrono::DateTime::::default(), - chrono::DateTime::parse_from_rfc3339("2099-12-31T23:59:59Z").unwrap().with_timezone(&chrono::Utc), - ]); -e2e_oracle_suite!(numeric, rust_decimal::Decimal, "proptest_e2e_numeric", + chrono::DateTime::parse_from_rfc3339("2099-12-31T23:59:59Z") + .unwrap() + .with_timezone(&chrono::Utc), + ] +); +e2e_oracle_suite!( + numeric, + rust_decimal::Decimal, + "proptest_e2e_numeric", seeds = [ ::from_str("-1000000000000").unwrap(), rust_decimal::Decimal::ZERO, ::from_str("1000000000000").unwrap(), - ]); -e2e_oracle_suite!(text, String, "proptest_e2e_text", - seeds = ["aard".to_string(), "frank".to_string(), "zzzz".to_string()]); + ] +); +e2e_oracle_suite!( + text, + String, + "proptest_e2e_text", + seeds = ["aard".to_string(), "frank".to_string(), "zzzz".to_string()] +); From 456f4905231dd09e59aed6b242fe36d0bec7aba7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 20:06:29 +1000 Subject: [PATCH 263/599] feat(v3): add float4/float8 catalog rows + codegen reference SQL float4/float8 ScalarSpec rows (Float kind/fixture) in eql-scalars::CATALOG and the committed codegen reference baselines the generator parity gate checks against. --- crates/eql-scalars/src/fixture.rs | 1 + crates/eql-scalars/src/kind.rs | 12 + crates/eql-scalars/src/lib.rs | 73 +++- crates/eql-scalars/src/proptest_invariants.rs | 4 +- crates/eql-scalars/src/tests.rs | 116 ++++- .../reference/float4/float4_eq_functions.sql | 407 ++++++++++++++++++ .../reference/float4/float4_eq_operators.sql | 234 ++++++++++ .../reference/float4/float4_functions.sql | 404 +++++++++++++++++ .../reference/float4/float4_operators.sql | 228 ++++++++++ .../float4/float4_ord_aggregates.sql | 63 +++ .../reference/float4/float4_ord_functions.sql | 396 +++++++++++++++++ .../reference/float4/float4_ord_operators.sql | 246 +++++++++++ .../float4/float4_ord_ore_aggregates.sql | 63 +++ .../float4/float4_ord_ore_functions.sql | 396 +++++++++++++++++ .../float4/float4_ord_ore_operators.sql | 246 +++++++++++ .../codegen/reference/float4/float4_types.sql | 73 ++++ .../reference/float8/float8_eq_functions.sql | 407 ++++++++++++++++++ .../reference/float8/float8_eq_operators.sql | 234 ++++++++++ .../reference/float8/float8_functions.sql | 404 +++++++++++++++++ .../reference/float8/float8_operators.sql | 228 ++++++++++ .../float8/float8_ord_aggregates.sql | 63 +++ .../reference/float8/float8_ord_functions.sql | 396 +++++++++++++++++ .../reference/float8/float8_ord_operators.sql | 246 +++++++++++ .../float8/float8_ord_ore_aggregates.sql | 63 +++ .../float8/float8_ord_ore_functions.sql | 396 +++++++++++++++++ .../float8/float8_ord_ore_operators.sql | 246 +++++++++++ .../codegen/reference/float8/float8_types.sql | 73 ++++ 27 files changed, 5713 insertions(+), 5 deletions(-) create mode 100644 tests/codegen/reference/float4/float4_eq_functions.sql create mode 100644 tests/codegen/reference/float4/float4_eq_operators.sql create mode 100644 tests/codegen/reference/float4/float4_functions.sql create mode 100644 tests/codegen/reference/float4/float4_operators.sql create mode 100644 tests/codegen/reference/float4/float4_ord_aggregates.sql create mode 100644 tests/codegen/reference/float4/float4_ord_functions.sql create mode 100644 tests/codegen/reference/float4/float4_ord_operators.sql create mode 100644 tests/codegen/reference/float4/float4_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/float4/float4_ord_ore_functions.sql create mode 100644 tests/codegen/reference/float4/float4_ord_ore_operators.sql create mode 100644 tests/codegen/reference/float4/float4_types.sql create mode 100644 tests/codegen/reference/float8/float8_eq_functions.sql create mode 100644 tests/codegen/reference/float8/float8_eq_operators.sql create mode 100644 tests/codegen/reference/float8/float8_functions.sql create mode 100644 tests/codegen/reference/float8/float8_operators.sql create mode 100644 tests/codegen/reference/float8/float8_ord_aggregates.sql create mode 100644 tests/codegen/reference/float8/float8_ord_functions.sql create mode 100644 tests/codegen/reference/float8/float8_ord_operators.sql create mode 100644 tests/codegen/reference/float8/float8_ord_ore_aggregates.sql create mode 100644 tests/codegen/reference/float8/float8_ord_ore_functions.sql create mode 100644 tests/codegen/reference/float8/float8_ord_ore_operators.sql create mode 100644 tests/codegen/reference/float8/float8_types.sql diff --git a/crates/eql-scalars/src/fixture.rs b/crates/eql-scalars/src/fixture.rs index f1e3f9acc..431f4871a 100644 --- a/crates/eql-scalars/src/fixture.rs +++ b/crates/eql-scalars/src/fixture.rs @@ -34,6 +34,7 @@ impl Fixture { | Fixture::Jsonb(_) | Fixture::Date(_) | Fixture::Timestamptz(_) + | Fixture::Float(_) | Fixture::Bool(_) => None, } } diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-scalars/src/kind.rs index 1219472cc..4e83aed93 100644 --- a/crates/eql-scalars/src/kind.rs +++ b/crates/eql-scalars/src/kind.rs @@ -72,6 +72,8 @@ impl ScalarKind { | ScalarKind::Text | ScalarKind::Jsonb | ScalarKind::Bool + | ScalarKind::F32 + | ScalarKind::F64 | ScalarKind::Date | ScalarKind::Timestamptz => None, } @@ -97,6 +99,14 @@ impl ScalarKind { matches!(self, ScalarKind::Text) } + /// True for the IEEE-754 float kinds (`F32`, `F64`) — ordered, non-integer, + /// string-backed-fixture scalars whose `impl ScalarType` is hand-written in + /// `scalar_domains.rs` (like `text`/`numeric`). Keeps float classification in + /// the catalog crate alongside `is_int`/`is_temporal`/`is_text`. + pub const fn is_float(self) -> bool { + matches!(self, ScalarKind::F32 | ScalarKind::F64) + } + /// A debug/identifier string for the kind: the canonical Rust plaintext type /// name (`"i32"`, `"chrono::NaiveDate"`, `"rust_decimal::Decimal"`). `Jsonb` /// has **no generated SQL surface** and no catalog row, so calling this on it @@ -113,6 +123,8 @@ impl ScalarKind { ScalarKind::Timestamptz => "chrono::DateTime", ScalarKind::Numeric => "rust_decimal::Decimal", ScalarKind::Bool => "bool", + ScalarKind::F32 => "f32", + ScalarKind::F64 => "f64", ScalarKind::Jsonb => { panic!("ScalarKind::rust_type: jsonb has no generated surface yet") } diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index c48d77b1e..3773ee469 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -80,6 +80,16 @@ pub enum ScalarKind { /// server-side. Like the other non-integer kinds, the bounded-numeric /// accessors are unreachable for it by construction. Bool, + /// 32-bit IEEE-754 binary float (`f32`, Postgres `real`/`float4`). + /// Ordered like the integer kinds via ORE, but with no i128 range + /// (`as_bounded_int()` returns `None`) and string-backed at the catalog + /// layer. Encrypts through the single f64 float crypto path + /// (`Plaintext::Float`) — the f32→f64 widening is exact and monotonic. + F32, + /// 64-bit IEEE-754 binary float (`f64`, Postgres `double precision`/ + /// `float8`). The native width of the float crypto path (`F32` widens into + /// it); otherwise classified exactly like [`ScalarKind::F32`]. + F64, } /// Always-present payload keys required by every generated domain CHECK, @@ -178,6 +188,12 @@ pub enum Fixture { /// storage-only, so this fixture is encrypted (ciphertext only, no index /// term) and never participates in a comparison pivot. Distinct by value. Bool(bool), + /// An IEEE-754 float plaintext rendered as a string (`"0.5"`, `"-inf"`). + /// The catalog stays zero-dep, so the string is parsed into `f32`/`f64` in + /// the SQLx harness, not here. Distinct by parsed value (the harness + /// `float_fixtures_are_distinct_by_value` guard enforces this). NaN and + /// `-0.0` are deliberately excluded; `±Inf` (`"inf"`/`"-inf"`) ARE fixtures. + Float(&'static str), } /// One generated public domain: a suffix appended to the type token and the @@ -221,6 +237,7 @@ macro_rules! fixtures { (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; (timestamptz; $($s:literal),* $(,)?) => { &[$(Fixture::Timestamptz($s)),*] }; (bool; $($b:literal),* $(,)?) => { &[$(Fixture::Bool($b)),*] }; + (float; $($s:literal),* $(,)?) => { &[$(Fixture::Float($s)),*] }; } /// Domains shared by every ordered-integer scalar, in manifest file order: @@ -488,9 +505,63 @@ pub const TEXT: ScalarSpec = ScalarSpec { fixtures: TEXT_FIXTURES, }; +/// `float4` fixture plaintexts — IEEE-754 strings parsed into `f32` in the SQLx +/// harness (the catalog stays zero-dep). EVERY value is exactly representable in +/// f32 (powers of two and halves), so the `real` round-trip is lossless and the +/// f32→f64 widening before encryption is exact. The three pivots MUST be present +/// verbatim: `"-inf"` (min_pivot), `"0"` (origin/mid), `"inf"` (max_pivot). +/// NaN and `-0.0` are deliberately excluded (see the `float_special` suite). +/// Distinctness is enforced by `Fixture::Float` (above) and its guard test. +const FLOAT4_FIXTURES: &[Fixture] = fixtures!(float; + "-inf", "-1024", "-2.25", "-1", "-0.5", "-0.25", + "0", "0.25", "0.5", "1", "2.25", "1024", "inf"); + +/// `float8` fixture plaintexts — IEEE-754 strings parsed into `f64` in the SQLx +/// harness. The native width of the float crypto path; values span sign and +/// magnitude including subnormal-free interior points. The three pivots MUST be +/// present verbatim: `"-inf"` (min_pivot), `"0"` (origin/mid), `"inf"` +/// (max_pivot). NaN and `-0.0` are deliberately excluded. +const FLOAT8_FIXTURES: &[Fixture] = fixtures!(float; + "-inf", "-1e300", "-1000000", "-1.5", "-1", "-0.001", + "0", "0.001", "1", "1.5", "1000000", "1e300", "inf"); + +/// `float4` — an **ordered**, non-integer scalar (Postgres `real`). Reuses the +/// four-domain ordered shape (`ORDERED_INT_DOMAINS`); only kind and fixtures +/// differ. Both float widths encrypt through the SAME f64 crypto path +/// (`Plaintext::Float`), so `float4` vs `float8` is purely a Postgres-surface +/// distinction. Public (like `DATE`/`NUMERIC`) so the SQLx harness reads +/// `FLOAT4.fixtures` directly to parse the strings into `f32`. +pub const FLOAT4: ScalarSpec = ScalarSpec { + token: "float4", + kind: ScalarKind::F32, + domains: ORDERED_INT_DOMAINS, + fixtures: FLOAT4_FIXTURES, +}; + +/// `float8` — an **ordered**, non-integer scalar (Postgres `double precision`), +/// the native width of the float crypto path. Reuses the ordered shape. Public +/// so the SQLx harness reads `FLOAT8.fixtures` directly to parse into `f64`. +pub const FLOAT8: ScalarSpec = ScalarSpec { + token: "float8", + kind: ScalarKind::F64, + domains: ORDERED_INT_DOMAINS, + fixtures: FLOAT8_FIXTURES, +}; + /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[INT4, INT2, INT8, DATE, TIMESTAMPTZ, NUMERIC, TEXT, BOOL]; +pub const CATALOG: &[ScalarSpec] = &[ + INT4, + INT2, + INT8, + DATE, + TIMESTAMPTZ, + NUMERIC, + TEXT, + BOOL, + FLOAT4, + FLOAT8, +]; /// Materialise an integer scalar's fixtures into a typed `&'static` slice at /// compile time. This is the **single-sourced** plaintext list the SQLx test diff --git a/crates/eql-scalars/src/proptest_invariants.rs b/crates/eql-scalars/src/proptest_invariants.rs index e5303a905..503e32c00 100644 --- a/crates/eql-scalars/src/proptest_invariants.rs +++ b/crates/eql-scalars/src/proptest_invariants.rs @@ -13,7 +13,7 @@ fn any_term() -> impl Strategy { prop_oneof![Just(Term::Hm), Just(Term::Ore), Just(Term::Bloom)] } -/// Strategy over the eight scalar kinds. +/// Strategy over the ten scalar kinds. fn any_kind() -> impl Strategy { prop_oneof![ Just(ScalarKind::I16), @@ -24,6 +24,8 @@ fn any_kind() -> impl Strategy { Just(ScalarKind::Jsonb), Just(ScalarKind::Date), Just(ScalarKind::Timestamptz), + Just(ScalarKind::F32), + Just(ScalarKind::F64), ] } diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 80a2888f0..b19d13d41 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -42,6 +42,8 @@ mod rust_tests { assert_eq!(ScalarKind::Jsonb.as_bounded_int(), None); assert_eq!(ScalarKind::Date.as_bounded_int(), None); assert_eq!(ScalarKind::Timestamptz.as_bounded_int(), None); + assert_eq!(ScalarKind::F32.as_bounded_int(), None); + assert_eq!(ScalarKind::F64.as_bounded_int(), None); } #[test] @@ -80,6 +82,8 @@ mod rust_tests { assert!(!ScalarKind::Jsonb.is_int()); assert!(!ScalarKind::Date.is_int()); assert!(!ScalarKind::Timestamptz.is_int()); + assert!(!ScalarKind::F32.is_int()); + assert!(!ScalarKind::F64.is_int()); } #[test] @@ -93,6 +97,8 @@ mod rust_tests { ScalarKind::Jsonb, ScalarKind::Date, ScalarKind::Timestamptz, + ScalarKind::F32, + ScalarKind::F64, ] { assert!(!k.is_text()); } @@ -171,6 +177,8 @@ mod rust_tests { assert!(!ScalarKind::I16.is_temporal()); assert!(!ScalarKind::I32.is_temporal()); assert!(!ScalarKind::I64.is_temporal()); + assert!(!ScalarKind::F32.is_temporal()); + assert!(!ScalarKind::F64.is_temporal()); } #[test] @@ -523,7 +531,7 @@ mod catalog_tests { } #[test] - fn catalog_has_int4_int2_int8_date_timestamptz_numeric_text_bool_in_order() { + fn catalog_has_all_tokens_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); assert_eq!( tokens, @@ -535,7 +543,9 @@ mod catalog_tests { "timestamptz", "numeric", "text", - "bool" + "bool", + "float4", + "float8" ] ); } @@ -896,6 +906,102 @@ mod values_tests { } } +mod float_tests { + use crate::*; + + fn scalar(token: &str) -> &'static ScalarSpec { + CATALOG + .iter() + .find(|s| s.token == token) + .unwrap_or_else(|| panic!("{token} missing from CATALOG")) + } + + #[test] + fn float_specs_are_in_catalog_with_ordered_shape() { + for token in ["float4", "float8"] { + let s = scalar(token); + let suffixes: Vec<_> = s.domains.iter().map(|d| d.suffix).collect(); + assert_eq!(suffixes, vec!["", "_eq", "_ord_ore", "_ord"]); + } + assert_eq!(scalar("float4").kind, ScalarKind::F32); + assert_eq!(scalar("float8").kind, ScalarKind::F64); + } + + #[test] + fn float_kinds_are_not_bounded_int_temporal_or_text() { + for k in [ScalarKind::F32, ScalarKind::F64] { + assert_eq!(k.as_bounded_int(), None); + assert!(!k.is_int()); + assert!(!k.is_temporal()); + assert!(!k.is_text()); + assert!(k.is_float()); + } + } + + #[test] + fn float_rust_types_are_f32_and_f64() { + assert_eq!(ScalarKind::F32.rust_type(), "f32"); + assert_eq!(ScalarKind::F64.rust_type(), "f64"); + } + + /// NaN and -0.0 must never be fixtures: NaN is unordered/unspecified in the + /// encoder; -0.0 canonicalizes to +0.0 and would duplicate the +0.0 row. + /// ±Inf MUST be present (the boundary pivots). + #[test] + fn float_fixtures_exclude_nan_and_negative_zero_and_include_infinities() { + for token in ["float4", "float8"] { + let s = scalar(token); + let strings: Vec<&str> = s + .fixtures + .iter() + .map(|f| match f { + Fixture::Float(v) => *v, + other => panic!("{token} fixture must be Fixture::Float, got {other:?}"), + }) + .collect(); + for v in &strings { + let parsed: f64 = v + .parse() + .unwrap_or_else(|_| panic!("{token} fixture {v:?} must parse as f64")); + assert!(!parsed.is_nan(), "{token} fixture {v:?} is NaN"); + assert!( + !(parsed == 0.0 && parsed.is_sign_negative()), + "{token} fixture {v:?} is -0.0" + ); + } + assert!(strings.contains(&"inf"), "{token} must include +inf pivot"); + assert!(strings.contains(&"-inf"), "{token} must include -inf pivot"); + assert!(strings.contains(&"0"), "{token} must include 0 (origin)"); + } + } + + /// Distinct by parsed f64 value (the catalog dedupes only by literal string; + /// the fixture table keys on the value, so an aliasing pair would break + /// fetch_fixture_payload's fetch_one). + #[test] + fn float_fixtures_are_distinct_by_value() { + for token in ["float4", "float8"] { + let s = scalar(token); + let parsed: Vec = s + .fixtures + .iter() + .map(|f| match f { + Fixture::Float(v) => { + let x: f64 = v.parse().unwrap(); + // total_cmp bit key; -0.0 already excluded so +0.0 is unique. + x.to_bits() + } + other => panic!("non-float fixture: {other:?}"), + }) + .collect(); + let mut sorted = parsed.clone(); + sorted.sort_unstable(); + sorted.dedup(); + assert_eq!(sorted.len(), parsed.len(), "{token} has duplicate fixtures"); + } + } +} + mod invariant_tests { use crate::*; use std::collections::HashMap; @@ -936,7 +1042,11 @@ mod invariant_tests { | Fixture::Text(s) | Fixture::Jsonb(s) | Fixture::Date(s) - | Fixture::Timestamptz(s) => DistinctKey::Str(s), + | Fixture::Timestamptz(s) + // Float fixtures dedupe by their literal here, like the other + // string-backed kinds (every float literal is distinct; the harness + // `float_fixtures_are_distinct_by_value` guard pins value-distinctness). + | Fixture::Float(s) => DistinctKey::Str(s), // `bool` is storage-only and string-backed for distinctness: the two // values dedupe by their literal, like the other non-numeric kinds. Fixture::Bool(b) => DistinctKey::Str(if b { "true" } else { "false" }), diff --git a/tests/codegen/reference/float4/float4_eq_functions.sql b/tests/codegen/reference/float4/float4_eq_functions.sql new file mode 100644 index 000000000..faf8b30fa --- /dev/null +++ b/tests/codegen/reference/float4/float4_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/float4/float4_eq_functions.sql +--! @brief Functions for eql_v3.float4_eq. + +--! @brief Index extractor for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.float4_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.float4_eq) $$; + +--! @brief Operator wrapper for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.float4_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.float4_eq) $$; + +--! @brief Operator wrapper for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float4_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.float4_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float4_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param selector text +--! @return eql_v3.float4_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.float4_eq, selector text) +RETURNS eql_v3.float4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param selector integer +--! @return eql_v3.float4_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.float4_eq, selector integer) +RETURNS eql_v3.float4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param selector eql_v3.float4_eq +--! @return eql_v3.float4_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float4_eq) +RETURNS eql_v3.float4_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param selector eql_v3.float4_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float4_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float4_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float4_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float4_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float4_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float4_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float4_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float4_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float4_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b eql_v3.float4_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4_eq, b eql_v3.float4_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a eql_v3.float4_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_eq. +--! @param a jsonb +--! @param b eql_v3.float4_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float4_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float4/float4_eq_operators.sql b/tests/codegen/reference/float4/float4_eq_operators.sql new file mode 100644 index 000000000..b86f7f5e0 --- /dev/null +++ b/tests/codegen/reference/float4/float4_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/float4/float4_eq_functions.sql + +--! @file encrypted_domain/float4/float4_eq_operators.sql +--! @brief Operators for eql_v3.float4_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float4_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4_eq, RIGHTARG = eql_v3.float4_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_eq +); diff --git a/tests/codegen/reference/float4/float4_functions.sql b/tests/codegen/reference/float4/float4_functions.sql new file mode 100644 index 000000000..f444a4b76 --- /dev/null +++ b/tests/codegen/reference/float4/float4_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/float4/float4_functions.sql +--! @brief Functions for eql_v3.float4. + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float4) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param selector text +--! @return eql_v3.float4 +CREATE FUNCTION eql_v3."->"(a eql_v3.float4, selector text) +RETURNS eql_v3.float4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param selector integer +--! @return eql_v3.float4 +CREATE FUNCTION eql_v3."->"(a eql_v3.float4, selector integer) +RETURNS eql_v3.float4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param selector eql_v3.float4 +--! @return eql_v3.float4 +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float4) +RETURNS eql_v3.float4 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param selector eql_v3.float4 +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float4) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float4, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float4, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float4, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float4, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float4, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float4, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float4, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float4, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b eql_v3.float4 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4, b eql_v3.float4) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a eql_v3.float4 +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4. +--! @param a jsonb +--! @param b eql_v3.float4 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float4) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float4/float4_operators.sql b/tests/codegen/reference/float4/float4_operators.sql new file mode 100644 index 000000000..fed4f8c45 --- /dev/null +++ b/tests/codegen/reference/float4/float4_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/float4/float4_functions.sql + +--! @file encrypted_domain/float4/float4_operators.sql +--! @brief Operators for eql_v3.float4. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float4, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float4, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float4, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float4, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float4, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float4, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float4, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float4, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4, RIGHTARG = eql_v3.float4 +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4 +); diff --git a/tests/codegen/reference/float4/float4_ord_aggregates.sql b/tests/codegen/reference/float4/float4_ord_aggregates.sql new file mode 100644 index 000000000..45eab28a6 --- /dev/null +++ b/tests/codegen/reference/float4/float4_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/float4/float4_ord_functions.sql +-- REQUIRE: src/v3/scalars/float4/float4_ord_operators.sql + +--! @file encrypted_domain/float4/float4_ord_aggregates.sql +--! @brief Aggregates for eql_v3.float4_ord. + +--! @brief State function for min on eql_v3.float4_ord. +--! @param state eql_v3.float4_ord +--! @param value eql_v3.float4_ord +--! @return eql_v3.float4_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.float4_ord, value eql_v3.float4_ord) +RETURNS eql_v3.float4_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.float4_ord. +--! @param input eql_v3.float4_ord +--! @return eql_v3.float4_ord +CREATE AGGREGATE eql_v3.min(eql_v3.float4_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.float4_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.float4_ord. +--! @param state eql_v3.float4_ord +--! @param value eql_v3.float4_ord +--! @return eql_v3.float4_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.float4_ord, value eql_v3.float4_ord) +RETURNS eql_v3.float4_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.float4_ord. +--! @param input eql_v3.float4_ord +--! @return eql_v3.float4_ord +CREATE AGGREGATE eql_v3.max(eql_v3.float4_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.float4_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/float4/float4_ord_functions.sql b/tests/codegen/reference/float4/float4_ord_functions.sql new file mode 100644 index 000000000..b036db6c5 --- /dev/null +++ b/tests/codegen/reference/float4/float4_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/float4/float4_ord_functions.sql +--! @brief Functions for eql_v3.float4_ord. + +--! @brief Index extractor for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.float4_ord) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.float4_ord) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.float4_ord) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.float4_ord) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.float4_ord) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.float4_ord) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.float4_ord) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float4_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float4_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param selector text +--! @return eql_v3.float4_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.float4_ord, selector text) +RETURNS eql_v3.float4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param selector integer +--! @return eql_v3.float4_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.float4_ord, selector integer) +RETURNS eql_v3.float4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a jsonb +--! @param selector eql_v3.float4_ord +--! @return eql_v3.float4_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float4_ord) +RETURNS eql_v3.float4_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a jsonb +--! @param selector eql_v3.float4_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float4_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float4_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float4_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float4_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float4_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float4_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float4_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float4_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float4_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b eql_v3.float4_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4_ord, b eql_v3.float4_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a eql_v3.float4_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord. +--! @param a jsonb +--! @param b eql_v3.float4_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float4_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float4/float4_ord_operators.sql b/tests/codegen/reference/float4/float4_ord_operators.sql new file mode 100644 index 000000000..151595782 --- /dev/null +++ b/tests/codegen/reference/float4/float4_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/float4/float4_ord_functions.sql + +--! @file encrypted_domain/float4/float4_ord_operators.sql +--! @brief Operators for eql_v3.float4_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float4_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4_ord, RIGHTARG = eql_v3.float4_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord +); diff --git a/tests/codegen/reference/float4/float4_ord_ore_aggregates.sql b/tests/codegen/reference/float4/float4_ord_ore_aggregates.sql new file mode 100644 index 000000000..5ec53ecc8 --- /dev/null +++ b/tests/codegen/reference/float4/float4_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/float4/float4_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/float4/float4_ord_ore_operators.sql + +--! @file encrypted_domain/float4/float4_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.float4_ord_ore. + +--! @brief State function for min on eql_v3.float4_ord_ore. +--! @param state eql_v3.float4_ord_ore +--! @param value eql_v3.float4_ord_ore +--! @return eql_v3.float4_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.float4_ord_ore, value eql_v3.float4_ord_ore) +RETURNS eql_v3.float4_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.float4_ord_ore. +--! @param input eql_v3.float4_ord_ore +--! @return eql_v3.float4_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.float4_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.float4_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.float4_ord_ore. +--! @param state eql_v3.float4_ord_ore +--! @param value eql_v3.float4_ord_ore +--! @return eql_v3.float4_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.float4_ord_ore, value eql_v3.float4_ord_ore) +RETURNS eql_v3.float4_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.float4_ord_ore. +--! @param input eql_v3.float4_ord_ore +--! @return eql_v3.float4_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.float4_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.float4_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/float4/float4_ord_ore_functions.sql b/tests/codegen/reference/float4/float4_ord_ore_functions.sql new file mode 100644 index 000000000..b2edffc7e --- /dev/null +++ b/tests/codegen/reference/float4/float4_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/float4/float4_ord_ore_functions.sql +--! @brief Functions for eql_v3.float4_ord_ore. + +--! @brief Index extractor for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.float4_ord_ore) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.float4_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.float4_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.float4_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.float4_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.float4_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.float4_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float4_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float4_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float4_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param selector text +--! @return eql_v3.float4_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.float4_ord_ore, selector text) +RETURNS eql_v3.float4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param selector integer +--! @return eql_v3.float4_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.float4_ord_ore, selector integer) +RETURNS eql_v3.float4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.float4_ord_ore +--! @return eql_v3.float4_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float4_ord_ore) +RETURNS eql_v3.float4_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float4_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.float4_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float4_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float4_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float4_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float4_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float4_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float4_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float4_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float4_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float4_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float4_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b eql_v3.float4_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a eql_v3.float4_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float4_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float4_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float4_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float4_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float4_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float4/float4_ord_ore_operators.sql b/tests/codegen/reference/float4/float4_ord_ore_operators.sql new file mode 100644 index 000000000..b3e4f87ee --- /dev/null +++ b/tests/codegen/reference/float4/float4_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float4/float4_types.sql +-- REQUIRE: src/v3/scalars/float4/float4_ord_ore_functions.sql + +--! @file encrypted_domain/float4/float4_ord_ore_operators.sql +--! @brief Operators for eql_v3.float4_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = eql_v3.float4_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float4_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float4_ord_ore +); diff --git a/tests/codegen/reference/float4/float4_types.sql b/tests/codegen/reference/float4/float4_types.sql new file mode 100644 index 000000000..56ef6e7b7 --- /dev/null +++ b/tests/codegen/reference/float4/float4_types.sql @@ -0,0 +1,73 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/float4/float4_types.sql +--! @brief Encrypted-domain types for float4. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.float4. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float4' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float4 AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.float4_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float4_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float4_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.float4_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float4_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float4_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.float4_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float4_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float4_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; diff --git a/tests/codegen/reference/float8/float8_eq_functions.sql b/tests/codegen/reference/float8/float8_eq_functions.sql new file mode 100644 index 000000000..a5d592cf3 --- /dev/null +++ b/tests/codegen/reference/float8/float8_eq_functions.sql @@ -0,0 +1,407 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/hmac_256/functions.sql + +--! @file encrypted_domain/float8/float8_eq_functions.sql +--! @brief Functions for eql_v3.float8_eq. + +--! @brief Index extractor for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @return eql_v3.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a eql_v3.float8_eq) +RETURNS eql_v3.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.float8_eq) $$; + +--! @brief Operator wrapper for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.float8_eq) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8_eq, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.float8_eq) $$; + +--! @brief Operator wrapper for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float8_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a::eql_v3.float8_eq) <> eql_v3.eq_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8_eq, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float8_eq) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param selector text +--! @return eql_v3.float8_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.float8_eq, selector text) +RETURNS eql_v3.float8_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param selector integer +--! @return eql_v3.float8_eq +CREATE FUNCTION eql_v3."->"(a eql_v3.float8_eq, selector integer) +RETURNS eql_v3.float8_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param selector eql_v3.float8_eq +--! @return eql_v3.float8_eq +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float8_eq) +RETURNS eql_v3.float8_eq IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8_eq, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8_eq, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param selector eql_v3.float8_eq +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float8_eq) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float8_eq, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float8_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float8_eq, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float8_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float8_eq, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float8_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float8_eq, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_eq, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_eq, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float8_eq, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b eql_v3.float8_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8_eq, b eql_v3.float8_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a eql_v3.float8_eq +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8_eq, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_eq. +--! @param a jsonb +--! @param b eql_v3.float8_eq +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float8_eq) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_eq'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float8/float8_eq_operators.sql b/tests/codegen/reference/float8/float8_eq_operators.sql new file mode 100644 index 000000000..83f8cf276 --- /dev/null +++ b/tests/codegen/reference/float8/float8_eq_operators.sql @@ -0,0 +1,234 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/float8/float8_eq_functions.sql + +--! @file encrypted_domain/float8/float8_eq_operators.sql +--! @brief Operators for eql_v3.float8_eq. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8_eq, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8_eq, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_eq, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float8_eq, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8_eq, RIGHTARG = eql_v3.float8_eq +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8_eq, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_eq +); diff --git a/tests/codegen/reference/float8/float8_functions.sql b/tests/codegen/reference/float8/float8_functions.sql new file mode 100644 index 000000000..cc6c50f82 --- /dev/null +++ b/tests/codegen/reference/float8/float8_functions.sql @@ -0,0 +1,404 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql + +--! @file encrypted_domain/float8/float8_functions.sql +--! @brief Functions for eql_v3.float8. + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float8) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param selector text +--! @return eql_v3.float8 +CREATE FUNCTION eql_v3."->"(a eql_v3.float8, selector text) +RETURNS eql_v3.float8 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param selector integer +--! @return eql_v3.float8 +CREATE FUNCTION eql_v3."->"(a eql_v3.float8, selector integer) +RETURNS eql_v3.float8 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param selector eql_v3.float8 +--! @return eql_v3.float8 +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float8) +RETURNS eql_v3.float8 IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param selector eql_v3.float8 +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float8) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float8, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float8, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float8, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float8, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float8, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float8, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float8, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float8, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b eql_v3.float8 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8, b eql_v3.float8) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a eql_v3.float8 +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8. +--! @param a jsonb +--! @param b eql_v3.float8 +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float8) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float8/float8_operators.sql b/tests/codegen/reference/float8/float8_operators.sql new file mode 100644 index 000000000..472b9095b --- /dev/null +++ b/tests/codegen/reference/float8/float8_operators.sql @@ -0,0 +1,228 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/float8/float8_functions.sql + +--! @file encrypted_domain/float8/float8_operators.sql +--! @brief Operators for eql_v3.float8. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float8, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float8, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float8, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float8, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float8, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float8, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float8, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float8, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8, RIGHTARG = eql_v3.float8 +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8 +); diff --git a/tests/codegen/reference/float8/float8_ord_aggregates.sql b/tests/codegen/reference/float8/float8_ord_aggregates.sql new file mode 100644 index 000000000..64bd7f47d --- /dev/null +++ b/tests/codegen/reference/float8/float8_ord_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/float8/float8_ord_functions.sql +-- REQUIRE: src/v3/scalars/float8/float8_ord_operators.sql + +--! @file encrypted_domain/float8/float8_ord_aggregates.sql +--! @brief Aggregates for eql_v3.float8_ord. + +--! @brief State function for min on eql_v3.float8_ord. +--! @param state eql_v3.float8_ord +--! @param value eql_v3.float8_ord +--! @return eql_v3.float8_ord +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.float8_ord, value eql_v3.float8_ord) +RETURNS eql_v3.float8_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.float8_ord. +--! @param input eql_v3.float8_ord +--! @return eql_v3.float8_ord +CREATE AGGREGATE eql_v3.min(eql_v3.float8_ord) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.float8_ord, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.float8_ord. +--! @param state eql_v3.float8_ord +--! @param value eql_v3.float8_ord +--! @return eql_v3.float8_ord +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.float8_ord, value eql_v3.float8_ord) +RETURNS eql_v3.float8_ord +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.float8_ord. +--! @param input eql_v3.float8_ord +--! @return eql_v3.float8_ord +CREATE AGGREGATE eql_v3.max(eql_v3.float8_ord) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.float8_ord, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/float8/float8_ord_functions.sql b/tests/codegen/reference/float8/float8_ord_functions.sql new file mode 100644 index 000000000..0591e66cd --- /dev/null +++ b/tests/codegen/reference/float8/float8_ord_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/float8/float8_ord_functions.sql +--! @brief Functions for eql_v3.float8_ord. + +--! @brief Index extractor for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.float8_ord) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.float8_ord) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.float8_ord) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.float8_ord) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.float8_ord) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.float8_ord) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8_ord, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.float8_ord) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float8_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8_ord, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float8_ord) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param selector text +--! @return eql_v3.float8_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.float8_ord, selector text) +RETURNS eql_v3.float8_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param selector integer +--! @return eql_v3.float8_ord +CREATE FUNCTION eql_v3."->"(a eql_v3.float8_ord, selector integer) +RETURNS eql_v3.float8_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a jsonb +--! @param selector eql_v3.float8_ord +--! @return eql_v3.float8_ord +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float8_ord) +RETURNS eql_v3.float8_ord IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8_ord, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8_ord, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a jsonb +--! @param selector eql_v3.float8_ord +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float8_ord) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float8_ord, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float8_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float8_ord, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float8_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float8_ord, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float8_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float8_ord, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_ord, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_ord, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float8_ord, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b eql_v3.float8_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8_ord, b eql_v3.float8_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a eql_v3.float8_ord +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8_ord, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord. +--! @param a jsonb +--! @param b eql_v3.float8_ord +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float8_ord) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_ord'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float8/float8_ord_operators.sql b/tests/codegen/reference/float8/float8_ord_operators.sql new file mode 100644 index 000000000..86e04b34d --- /dev/null +++ b/tests/codegen/reference/float8/float8_ord_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/float8/float8_ord_functions.sql + +--! @file encrypted_domain/float8/float8_ord_operators.sql +--! @brief Operators for eql_v3.float8_ord. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8_ord, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8_ord, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_ord, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float8_ord, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8_ord, RIGHTARG = eql_v3.float8_ord +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8_ord, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord +); diff --git a/tests/codegen/reference/float8/float8_ord_ore_aggregates.sql b/tests/codegen/reference/float8/float8_ord_ore_aggregates.sql new file mode 100644 index 000000000..816201086 --- /dev/null +++ b/tests/codegen/reference/float8/float8_ord_ore_aggregates.sql @@ -0,0 +1,63 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/float8/float8_ord_ore_functions.sql +-- REQUIRE: src/v3/scalars/float8/float8_ord_ore_operators.sql + +--! @file encrypted_domain/float8/float8_ord_ore_aggregates.sql +--! @brief Aggregates for eql_v3.float8_ord_ore. + +--! @brief State function for min on eql_v3.float8_ord_ore. +--! @param state eql_v3.float8_ord_ore +--! @param value eql_v3.float8_ord_ore +--! @return eql_v3.float8_ord_ore +CREATE FUNCTION eql_v3.min_sfunc(state eql_v3.float8_ord_ore, value eql_v3.float8_ord_ore) +RETURNS eql_v3.float8_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value < state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief min aggregate for eql_v3.float8_ord_ore. +--! @param input eql_v3.float8_ord_ore +--! @return eql_v3.float8_ord_ore +CREATE AGGREGATE eql_v3.min(eql_v3.float8_ord_ore) ( + sfunc = eql_v3.min_sfunc, + stype = eql_v3.float8_ord_ore, + combinefunc = eql_v3.min_sfunc, + parallel = safe +); + +--! @brief State function for max on eql_v3.float8_ord_ore. +--! @param state eql_v3.float8_ord_ore +--! @param value eql_v3.float8_ord_ore +--! @return eql_v3.float8_ord_ore +CREATE FUNCTION eql_v3.max_sfunc(state eql_v3.float8_ord_ore, value eql_v3.float8_ord_ore) +RETURNS eql_v3.float8_ord_ore +LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE +SET search_path = pg_catalog, extensions, public +AS $$ +BEGIN + IF value > state THEN + RETURN value; + END IF; + RETURN state; +END; +$$; + +--! @brief max aggregate for eql_v3.float8_ord_ore. +--! @param input eql_v3.float8_ord_ore +--! @return eql_v3.float8_ord_ore +CREATE AGGREGATE eql_v3.max(eql_v3.float8_ord_ore) ( + sfunc = eql_v3.max_sfunc, + stype = eql_v3.float8_ord_ore, + combinefunc = eql_v3.max_sfunc, + parallel = safe +); diff --git a/tests/codegen/reference/float8/float8_ord_ore_functions.sql b/tests/codegen/reference/float8/float8_ord_ore_functions.sql new file mode 100644 index 000000000..4ba856710 --- /dev/null +++ b/tests/codegen/reference/float8/float8_ord_ore_functions.sql @@ -0,0 +1,396 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/functions.sql +-- REQUIRE: src/v3/sem/ore_block_256/operators.sql + +--! @file encrypted_domain/float8/float8_ord_ore_functions.sql +--! @brief Functions for eql_v3.float8_ord_ore. + +--! @brief Index extractor for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @return eql_v3.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a eql_v3.float8_ord_ore) +RETURNS eql_v3.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.eq(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.float8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord_ore) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.neq(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.float8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord_ore) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lt(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.float8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord_ore) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.lte(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.float8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord_ore) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gt(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.float8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord_ore) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.gte(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.float8_ord_ore) $$; + +--! @brief Operator wrapper for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a::eql_v3.float8_ord_ore) >= eql_v3.ord_term(b) $$; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contains(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a eql_v3.float8_ord_ore, b jsonb) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.float8_ord_ore) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param selector text +--! @return eql_v3.float8_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.float8_ord_ore, selector text) +RETURNS eql_v3.float8_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param selector integer +--! @return eql_v3.float8_ord_ore +CREATE FUNCTION eql_v3."->"(a eql_v3.float8_ord_ore, selector integer) +RETURNS eql_v3.float8_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.float8_ord_ore +--! @return eql_v3.float8_ord_ore +CREATE FUNCTION eql_v3."->"(a jsonb, selector eql_v3.float8_ord_ore) +RETURNS eql_v3.float8_ord_ore IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param selector text +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8_ord_ore, selector text) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param selector integer +--! @return text +CREATE FUNCTION eql_v3."->>"(a eql_v3.float8_ord_ore, selector integer) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param selector eql_v3.float8_ord_ore +--! @return text +CREATE FUNCTION eql_v3."->>"(a jsonb, selector eql_v3.float8_ord_ore) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text +--! @return boolean +CREATE FUNCTION eql_v3."?"(a eql_v3.float8_ord_ore, b text) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?|"(a eql_v3.float8_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text[] +--! @return boolean +CREATE FUNCTION eql_v3."?&"(a eql_v3.float8_ord_ore, b text[]) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@?"(a eql_v3.float8_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonpath +--! @return boolean +CREATE FUNCTION eql_v3."@@"(a eql_v3.float8_ord_ore, b jsonpath) +RETURNS boolean IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#>"(a eql_v3.float8_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text[] +--! @return text +CREATE FUNCTION eql_v3."#>>"(a eql_v3.float8_ord_ore, b text[]) +RETURNS text IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_ord_ore, b text) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b integer +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_ord_ore, b integer) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."-"(a eql_v3.float8_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b text[] +--! @return jsonb +CREATE FUNCTION eql_v3."#-"(a eql_v3.float8_ord_ore, b text[]) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b eql_v3.float8_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a eql_v3.float8_ord_ore +--! @param b jsonb +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a eql_v3.float8_ord_ore, b jsonb) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; + +--! @brief Unsupported operator blocker for eql_v3.float8_ord_ore. +--! @param a jsonb +--! @param b eql_v3.float8_ord_ore +--! @return jsonb +CREATE FUNCTION eql_v3."||"(a jsonb, b eql_v3.float8_ord_ore) +RETURNS jsonb IMMUTABLE PARALLEL SAFE +AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.float8_ord_ore'; END; $$ +LANGUAGE plpgsql; diff --git a/tests/codegen/reference/float8/float8_ord_ore_operators.sql b/tests/codegen/reference/float8/float8_ord_ore_operators.sql new file mode 100644 index 000000000..f4a63f611 --- /dev/null +++ b/tests/codegen/reference/float8/float8_ord_ore_operators.sql @@ -0,0 +1,246 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/float8/float8_types.sql +-- REQUIRE: src/v3/scalars/float8/float8_ord_ore_functions.sql + +--! @file encrypted_domain/float8/float8_ord_ore_operators.sql +--! @brief Operators for eql_v3.float8_ord_ore. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR -> ( + FUNCTION = eql_v3."->", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR ->> ( + FUNCTION = eql_v3."->>", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore +); + +CREATE OPERATOR ? ( + FUNCTION = eql_v3."?", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR ?| ( + FUNCTION = eql_v3."?|", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR ?& ( + FUNCTION = eql_v3."?&", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR @? ( + FUNCTION = eql_v3."@?", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR @@ ( + FUNCTION = eql_v3."@@", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonpath +); + +CREATE OPERATOR #> ( + FUNCTION = eql_v3."#>", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #>> ( + FUNCTION = eql_v3."#>>", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = integer +); + +CREATE OPERATOR - ( + FUNCTION = eql_v3."-", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR #- ( + FUNCTION = eql_v3."#-", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = text[] +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = eql_v3.float8_ord_ore +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = eql_v3.float8_ord_ore, RIGHTARG = jsonb +); + +CREATE OPERATOR || ( + FUNCTION = eql_v3."||", + LEFTARG = jsonb, RIGHTARG = eql_v3.float8_ord_ore +); diff --git a/tests/codegen/reference/float8/float8_types.sql b/tests/codegen/reference/float8/float8_types.sql new file mode 100644 index 000000000..8ff718e58 --- /dev/null +++ b/tests/codegen/reference/float8/float8_types.sql @@ -0,0 +1,73 @@ +-- REFERENCE: hand-maintained parity baseline for crates/eql-codegen - see ../README.md +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/float8/float8_types.sql +--! @brief Encrypted-domain types for float8. + +DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.float8. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float8' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float8 AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.float8_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float8_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float8_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.float8_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float8_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float8_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; + + --! @brief Encrypted domain eql_v3.float8_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'float8_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.float8_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND VALUE->>'v' = '2' + ); + END IF; +END +$$; From 32a15e871a06ceaf8ba9ae39e3c06258a6971b28 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 20:06:29 +1000 Subject: [PATCH 264/599] feat(v3): eql-types float4/float8 payload types + bindings/schemas float4/float8 v3 domain payload types in eql-types, with the generated TypeScript bindings and JSON Schemas for each domain variant. --- crates/eql-types/bindings/v3/Float4.ts | 22 +++ crates/eql-types/bindings/v3/Float4Eq.ts | 27 ++++ crates/eql-types/bindings/v3/Float4Ord.ts | 27 ++++ crates/eql-types/bindings/v3/Float4OrdOre.ts | 27 ++++ crates/eql-types/bindings/v3/Float8.ts | 22 +++ crates/eql-types/bindings/v3/Float8Eq.ts | 27 ++++ crates/eql-types/bindings/v3/Float8Ord.ts | 27 ++++ crates/eql-types/bindings/v3/Float8OrdOre.ts | 27 ++++ crates/eql-types/schema/v3/float4.json | 69 +++++++++ crates/eql-types/schema/v3/float4_eq.json | 82 +++++++++++ crates/eql-types/schema/v3/float4_ord.json | 85 +++++++++++ .../eql-types/schema/v3/float4_ord_ore.json | 85 +++++++++++ crates/eql-types/schema/v3/float8.json | 69 +++++++++ crates/eql-types/schema/v3/float8_eq.json | 82 +++++++++++ crates/eql-types/schema/v3/float8_ord.json | 85 +++++++++++ .../eql-types/schema/v3/float8_ord_ore.json | 85 +++++++++++ crates/eql-types/src/v3/float4.rs | 137 ++++++++++++++++++ crates/eql-types/src/v3/float8.rs | 136 +++++++++++++++++ crates/eql-types/src/v3/mod.rs | 10 ++ 19 files changed, 1131 insertions(+) create mode 100644 crates/eql-types/bindings/v3/Float4.ts create mode 100644 crates/eql-types/bindings/v3/Float4Eq.ts create mode 100644 crates/eql-types/bindings/v3/Float4Ord.ts create mode 100644 crates/eql-types/bindings/v3/Float4OrdOre.ts create mode 100644 crates/eql-types/bindings/v3/Float8.ts create mode 100644 crates/eql-types/bindings/v3/Float8Eq.ts create mode 100644 crates/eql-types/bindings/v3/Float8Ord.ts create mode 100644 crates/eql-types/bindings/v3/Float8OrdOre.ts create mode 100644 crates/eql-types/schema/v3/float4.json create mode 100644 crates/eql-types/schema/v3/float4_eq.json create mode 100644 crates/eql-types/schema/v3/float4_ord.json create mode 100644 crates/eql-types/schema/v3/float4_ord_ore.json create mode 100644 crates/eql-types/schema/v3/float8.json create mode 100644 crates/eql-types/schema/v3/float8_eq.json create mode 100644 crates/eql-types/schema/v3/float8_ord.json create mode 100644 crates/eql-types/schema/v3/float8_ord_ore.json create mode 100644 crates/eql-types/src/v3/float4.rs create mode 100644 crates/eql-types/src/v3/float8.rs diff --git a/crates/eql-types/bindings/v3/Float4.ts b/crates/eql-types/bindings/v3/Float4.ts new file mode 100644 index 000000000..73752d78e --- /dev/null +++ b/crates/eql-types/bindings/v3/Float4.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float4` — storage only; every operator is blocked. + */ +export type Float4 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Float4Eq.ts b/crates/eql-types/bindings/v3/Float4Eq.ts new file mode 100644 index 000000000..d734162b5 --- /dev/null +++ b/crates/eql-types/bindings/v3/Float4Eq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float4_eq` — HMAC equality (`=`, `<>`). + */ +export type Float4Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Float4Ord.ts b/crates/eql-types/bindings/v3/Float4Ord.ts new file mode 100644 index 000000000..658564a0d --- /dev/null +++ b/crates/eql-types/bindings/v3/Float4Ord.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Float4Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (8 blocks for float). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Float4OrdOre.ts b/crates/eql-types/bindings/v3/Float4OrdOre.ts new file mode 100644 index 000000000..9daebc7c3 --- /dev/null +++ b/crates/eql-types/bindings/v3/Float4OrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float4_ord_ore` — full comparison, scheme-explicit name. + */ +export type Float4OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (8 blocks for float). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Float8.ts b/crates/eql-types/bindings/v3/Float8.ts new file mode 100644 index 000000000..71f064d6e --- /dev/null +++ b/crates/eql-types/bindings/v3/Float8.ts @@ -0,0 +1,22 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float8` — storage only; every operator is blocked. + */ +export type Float8 = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, }; diff --git a/crates/eql-types/bindings/v3/Float8Eq.ts b/crates/eql-types/bindings/v3/Float8Eq.ts new file mode 100644 index 000000000..217146375 --- /dev/null +++ b/crates/eql-types/bindings/v3/Float8Eq.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float8_eq` — HMAC equality (`=`, `<>`). + */ +export type Float8Eq = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * HMAC-SHA-256 equality term. + */ +hm: Hmac256, }; diff --git a/crates/eql-types/bindings/v3/Float8Ord.ts b/crates/eql-types/bindings/v3/Float8Ord.ts new file mode 100644 index 000000000..209b1c2ed --- /dev/null +++ b/crates/eql-types/bindings/v3/Float8Ord.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + */ +export type Float8Ord = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (8 blocks for float). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/bindings/v3/Float8OrdOre.ts b/crates/eql-types/bindings/v3/Float8OrdOre.ts new file mode 100644 index 000000000..9fd0d7184 --- /dev/null +++ b/crates/eql-types/bindings/v3/Float8OrdOre.ts @@ -0,0 +1,27 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `eql_v3.float8_ord_ore` — full comparison, scheme-explicit name. + */ +export type Float8OrdOre = { +/** + * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + * value fails deserialization. + */ +v: SchemaVersion, +/** + * Table/column identifier. Required by the domain CHECK. + */ +i: Identifier, +/** + * mp_base85 source ciphertext. Required by the domain CHECK. + */ +c: Ciphertext, +/** + * Block-ORE order term (8 blocks for float). Serves equality too. + */ +ob: OreBlock256, }; diff --git a/crates/eql-types/schema/v3/float4.json b/crates/eql-types/schema/v3/float4.json new file mode 100644 index 000000000..747728d8a --- /dev/null +++ b/crates/eql-types/schema/v3/float4.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float4.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float4` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Float4", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/float4_eq.json b/crates/eql-types/schema/v3/float4_eq.json new file mode 100644 index 000000000..e81332781 --- /dev/null +++ b/crates/eql-types/schema/v3/float4_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float4_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float4_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Float4Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/float4_ord.json b/crates/eql-types/schema/v3/float4_ord.json new file mode 100644 index 000000000..76d06d29e --- /dev/null +++ b/crates/eql-types/schema/v3/float4_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (8 blocks for float). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Float4Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/float4_ord_ore.json b/crates/eql-types/schema/v3/float4_ord_ore.json new file mode 100644 index 000000000..1ecbcb1e3 --- /dev/null +++ b/crates/eql-types/schema/v3/float4_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float4_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (8 blocks for float). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Float4OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/float8.json b/crates/eql-types/schema/v3/float8.json new file mode 100644 index 000000000..671d7996e --- /dev/null +++ b/crates/eql-types/schema/v3/float8.json @@ -0,0 +1,69 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float8.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float8` — storage only; every operator is blocked.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "v" + ], + "title": "Float8", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/float8_eq.json b/crates/eql-types/schema/v3/float8_eq.json new file mode 100644 index 000000000..a83bfa1ca --- /dev/null +++ b/crates/eql-types/schema/v3/float8_eq.json @@ -0,0 +1,82 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float8_eq.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float8_eq` — HMAC equality (`=`, `<>`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "hm": { + "allOf": [ + { + "$ref": "#/definitions/Hmac256" + } + ], + "description": "HMAC-SHA-256 equality term." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "hm", + "i", + "v" + ], + "title": "Float8Eq", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/float8_ord.json b/crates/eql-types/schema/v3/float8_ord.json new file mode 100644 index 000000000..2753c67cb --- /dev/null +++ b/crates/eql-types/schema/v3/float8_ord.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (8 blocks for float). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Float8Ord", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/schema/v3/float8_ord_ore.json b/crates/eql-types/schema/v3/float8_ord_ore.json new file mode 100644 index 000000000..ea2153a74 --- /dev/null +++ b/crates/eql-types/schema/v3/float8_ord_ore.json @@ -0,0 +1,85 @@ +{ + "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord_ore.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "definitions": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "c", + "t" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 2, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + "type": "integer" + } + }, + "description": "`eql_v3.float8_ord_ore` — full comparison, scheme-explicit name.", + "properties": { + "c": { + "allOf": [ + { + "$ref": "#/definitions/Ciphertext" + } + ], + "description": "mp_base85 source ciphertext. Required by the domain CHECK." + }, + "i": { + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ], + "description": "Table/column identifier. Required by the domain CHECK." + }, + "ob": { + "allOf": [ + { + "$ref": "#/definitions/OreBlock256" + } + ], + "description": "Block-ORE order term (8 blocks for float). Serves equality too." + }, + "v": { + "allOf": [ + { + "$ref": "#/definitions/SchemaVersion" + } + ], + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + } + }, + "required": [ + "c", + "i", + "ob", + "v" + ], + "title": "Float8OrdOre", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-types/src/v3/float4.rs b/crates/eql-types/src/v3/float4.rs new file mode 100644 index 000000000..10d841f5e --- /dev/null +++ b/crates/eql-types/src/v3/float4.rs @@ -0,0 +1,137 @@ +//! The `float4` encrypted-domain family — an ordered, non-integer scalar +//! backed by IEEE-754 `real` (`f32`). Same four-domain ordered shape as +//! [`crate::v3::int4`] (ORE compares ciphertext, so floats order like +//! integers); see that module for the capability table. +//! +//! Both float widths encrypt through a single f64 crypto path +//! (`Plaintext::Float`): a `real` is widened to f64 before encryption, so the +//! wire shape here is identical to [`crate::v3::float8`] — an 8-block `ob` term +//! (`f64::ENCODED_LEN == 8`, same as `int8`). `float4` vs `float8` is purely a +//! Postgres-surface distinction (column type, domain name). + +use schemars::{schema::RootSchema, schema_for}; + +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; +use crate::v3::DomainType; +use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +/// `eql_v3.float4` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float4 { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl DomainType for Float4 { + fn sql_domain_static() -> &'static str { + "eql_v3.float4" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float4) + } +} + +/// `eql_v3.float4_eq` — HMAC equality (`=`, `<>`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float4Eq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// HMAC-SHA-256 equality term. + pub hm: Hmac256, +} + +impl DomainType for Float4Eq { + fn sql_domain_static() -> &'static str { + "eql_v3.float4_eq" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float4Eq) + } +} + +/// `eql_v3.float4_ord_ore` — full comparison, scheme-explicit name. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float4OrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (8 blocks for float). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for Float4OrdOre { + fn sql_domain_static() -> &'static str { + "eql_v3.float4_ord_ore" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float4OrdOre) + } +} + +/// `eql_v3.float4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float4Ord { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (8 blocks for float). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for Float4Ord { + fn sql_domain_static() -> &'static str { + "eql_v3.float4_ord" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float4Ord) + } +} diff --git a/crates/eql-types/src/v3/float8.rs b/crates/eql-types/src/v3/float8.rs new file mode 100644 index 000000000..fd8c24325 --- /dev/null +++ b/crates/eql-types/src/v3/float8.rs @@ -0,0 +1,136 @@ +//! The `float8` encrypted-domain family — an ordered, non-integer scalar +//! backed by IEEE-754 `double precision` (`f64`), the native width of the float +//! crypto path. Same four-domain ordered shape as [`crate::v3::int4`]; see that +//! module for the capability table. +//! +//! Both float widths encrypt through a single f64 crypto path +//! (`Plaintext::Float`), so the wire shape is identical to +//! [`crate::v3::float4`] — an 8-block `ob` term (`f64::ENCODED_LEN == 8`, same +//! as `int8`). + +use schemars::{schema::RootSchema, schema_for}; + +use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; +use crate::v3::DomainType; +use crate::{Identifier, SchemaVersion}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use ts_rs::TS; + +/// `eql_v3.float8` — storage only; every operator is blocked. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float8 { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, +} + +impl DomainType for Float8 { + fn sql_domain_static() -> &'static str { + "eql_v3.float8" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float8) + } +} + +/// `eql_v3.float8_eq` — HMAC equality (`=`, `<>`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float8Eq { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// HMAC-SHA-256 equality term. + pub hm: Hmac256, +} + +impl DomainType for Float8Eq { + fn sql_domain_static() -> &'static str { + "eql_v3.float8_eq" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float8Eq) + } +} + +/// `eql_v3.float8_ord_ore` — full comparison, scheme-explicit name. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float8OrdOre { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (8 blocks for float). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for Float8OrdOre { + fn sql_domain_static() -> &'static str { + "eql_v3.float8_ord_ore" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float8OrdOre) + } +} + +/// `eql_v3.float8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct Float8Ord { + /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other + /// value fails deserialization. + pub v: SchemaVersion, + /// Table/column identifier. Required by the domain CHECK. + pub i: Identifier, + /// mp_base85 source ciphertext. Required by the domain CHECK. + pub c: Ciphertext, + /// Block-ORE order term (8 blocks for float). Serves equality too. + pub ob: OreBlock256, +} + +impl DomainType for Float8Ord { + fn sql_domain_static() -> &'static str { + "eql_v3.float8_ord" + } + + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + + fn schema(&self) -> RootSchema { + schema_for!(Float8Ord) + } +} diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 79f4cb813..e8a05fe85 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -50,6 +50,8 @@ use schemars::{schema::RootSchema, schema_for, JsonSchema}; pub mod bool; pub mod date; +pub mod float4; +pub mod float8; pub mod int2; pub mod int4; pub mod int8; @@ -166,5 +168,13 @@ pub fn all() -> Vec> { Box::new(PhantomData::), Box::new(PhantomData::), Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), ] } From 76f7db6bcc09aebf8ef42ed2346851296ea6656d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 20:06:29 +1000 Subject: [PATCH 265/599] test(v3): wire float4/float8 into the scalar matrix + oracles Fixture routing in the matrix proc-macro plus the float4/float8 arms of the fixture/e2e oracle suites, the sign-boundary monotonicity sweep, the float_special NaN/+/-0/+/-Inf regression suite, and the storage-only matrix snapshot. --- crates/eql-tests-macros/src/lib.rs | 44 ++- .../snapshots/matrix_tests_storage_only.txt | 1 + tests/sqlx/src/fixtures/eql_plaintext.rs | 74 +++++ tests/sqlx/src/fixtures/scalar_fixture.rs | 32 +- tests/sqlx/src/lib.rs | 9 + tests/sqlx/src/scalar_domains.rs | 298 +++++++++++++++++- tests/sqlx/src/scalar_types.rs | 2 + tests/sqlx/tests/encrypted_domain.rs | 9 + .../tests/encrypted_domain/float_special.rs | 132 ++++++++ .../encrypted_domain/property/e2e_oracle.rs | 78 +++++ .../property/fixture_oracle.rs | 10 + tests/sqlx/tests/encrypted_domain/signed.rs | 16 +- 12 files changed, 698 insertions(+), 7 deletions(-) create mode 100644 tests/sqlx/tests/encrypted_domain/float_special.rs diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 7b920b54d..f0a5edc9c 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -101,6 +101,17 @@ fn is_numeric_token(token: &str) -> bool { matches!(spec_for_token(token).kind, eql_scalars::ScalarKind::Numeric) } +/// True when `token`'s catalog row is an IEEE-754 float kind (`F32`/`F64`). +/// Like `numeric` it is ordered but non-integer and non-chrono, so it stamps the +/// `float` fixture discriminator and draws its values from the harness accessor +/// (`float4_values()` / `float8_values()`). +fn is_float_token(token: &str) -> bool { + matches!( + spec_for_token(token).kind, + eql_scalars::ScalarKind::F32 | eql_scalars::ScalarKind::F64 + ) +} + /// True when `token`'s catalog row declares no ordered domain — equality-only. /// Replaces the `[eq_only]` marker. Consumed by [`matrix_suite_for_entry`] to /// keep an eq-only type out of the ordered matrix (which exercises ordering @@ -247,6 +258,8 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { format_ident!("text") } else if is_numeric_token(&token_str) { format_ident!("numeric") + } else if is_float_token(&token_str) { + format_ident!("float") } else if is_storage_only_token(&token_str) { // Storage-only (encryption-only) scalars (`bool`): the fixture // carries no index term (no `hm`/`ob`/`bf`), just the encrypted @@ -255,7 +268,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { } else { panic!( "scalar token `{token_str}` is neither integer, temporal, text, \ - numeric, nor storage-only — no fixture discriminator is wired for its kind" + numeric, float, nor storage-only — no fixture discriminator is wired for its kind" ) }; quote! { @@ -552,6 +565,35 @@ mod tests { assert!(dispatch.contains(r#""text" =>"#)); } + #[test] + fn float_entry_skips_impl_and_stamps_float_fixture() { + // `float4`/`float8` are ordered, non-integer, non-chrono: the impl emitter + // skips them (hand-written in scalar_domains.rs), and the fixture module + // stamps the `float` discriminator drawing from `float4_values()`. + let list = syn::parse_str::("int4 => i32, float4 => F4").unwrap(); + let impls = norm(&scalar_type_impls_tokens(&list)); + assert!(impls.contains("impl ScalarType for i32")); + assert!( + !impls.contains("impl ScalarType for F4"), + "float must skip the generated impl (hand-written instead)" + ); + let mods = norm(&scalar_fixture_modules_tokens(&list)); + assert!(mods.contains("pub mod eql_v2_float4")); + assert!(mods.contains("float ,"), "got: {mods}"); + assert!(mods.contains("float4_values"), "got: {mods}"); + let suites = norm(&scalar_matrix_suites_tokens(&list)); + assert!(suites.contains("pub mod float4")); + assert!(suites.contains("caps = [eq , ord]")); + } + + #[test] + fn float_classification_is_read_from_catalog() { + assert!(is_float_token("float4")); + assert!(is_float_token("float8")); + assert!(!is_float_token("int4")); + assert!(!is_float_token("numeric")); + } + #[test] fn ordered_entry_emits_scalar_matrix_with_eq_ord_caps() { let token: Ident = syn::parse_str("int4").unwrap(); diff --git a/tests/sqlx/snapshots/matrix_tests_storage_only.txt b/tests/sqlx/snapshots/matrix_tests_storage_only.txt index f95f6cff4..2ee0819a8 100644 --- a/tests/sqlx/snapshots/matrix_tests_storage_only.txt +++ b/tests/sqlx/snapshots/matrix_tests_storage_only.txt @@ -3,6 +3,7 @@ scalars::::matrix__storage_aggregate_typecheck_max scalars::::matrix__storage_aggregate_typecheck_min scalars::::matrix__storage_contained_by_blocker scalars::::matrix__storage_contains_blocker +scalars::::matrix__storage_count_distinct_extractor scalars::::matrix__storage_count_path_cast scalars::::matrix__storage_count_typed_column scalars::::matrix__storage_eq_blocker diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 15d7bfc6a..d5d0b5176 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -62,6 +62,8 @@ impl PlaintextSqlType { pub const JSONB: PlaintextSqlType = PlaintextSqlType("jsonb"); pub const NUMERIC: PlaintextSqlType = PlaintextSqlType("numeric"); pub const BOOLEAN: PlaintextSqlType = PlaintextSqlType("boolean"); + pub const REAL: PlaintextSqlType = PlaintextSqlType("real"); + pub const DOUBLE_PRECISION: PlaintextSqlType = PlaintextSqlType("double precision"); pub fn as_str(&self) -> &'static str { self.0 @@ -90,6 +92,8 @@ const fn cast_for_kind(kind: ScalarKind) -> Cast { ScalarKind::Text => Cast::TEXT, ScalarKind::Numeric => Cast::DECIMAL, ScalarKind::Bool => Cast::BOOLEAN, + ScalarKind::F32 => Cast::REAL, + ScalarKind::F64 => Cast::DOUBLE, ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } @@ -109,6 +113,8 @@ const fn plaintext_sql_type_for_kind(kind: ScalarKind) -> PlaintextSqlType { ScalarKind::Text => PlaintextSqlType::TEXT, ScalarKind::Numeric => PlaintextSqlType::NUMERIC, ScalarKind::Bool => PlaintextSqlType::BOOLEAN, + ScalarKind::F32 => PlaintextSqlType::REAL, + ScalarKind::F64 => PlaintextSqlType::DOUBLE_PRECISION, ScalarKind::Jsonb => { panic!("EqlPlaintext is only implemented for the wired scalar kinds") } @@ -126,6 +132,8 @@ mod sealed { impl Sealed for serde_json::Value {} impl Sealed for rust_decimal::Decimal {} impl Sealed for bool {} + impl Sealed for crate::scalar_domains::F4 {} + impl Sealed for crate::scalar_domains::F8 {} } /// A Rust type usable as a fixture `plaintext` value, carrying its EQL cast @@ -237,6 +245,24 @@ impl EqlPlaintext for bool { } } +impl EqlPlaintext for crate::scalar_domains::F4 { + const KIND: ScalarKind = ScalarKind::F32; + + /// A `real` (f32) is widened to f64 before encryption — there is no f32 + /// crypto path. The widening is exact and monotonic, so the oracle holds. + fn to_plaintext(&self) -> Plaintext { + Plaintext::Float(Some(self.0 as f64)) + } +} + +impl EqlPlaintext for crate::scalar_domains::F8 { + const KIND: ScalarKind = ScalarKind::F64; + + fn to_plaintext(&self) -> Plaintext { + Plaintext::Float(Some(self.0)) + } +} + #[cfg(test)] mod tests { use super::*; @@ -431,4 +457,52 @@ mod tests { other => panic!("expected Plaintext::Boolean(Some(false)), got {other:?}"), } } + + #[test] + fn f4_casts_to_real() { + use crate::scalar_domains::F4; + assert_eq!(::CAST, Cast::REAL); + } + + #[test] + fn f4_plaintext_sql_type_is_real() { + use crate::scalar_domains::F4; + assert_eq!( + ::PLAINTEXT_SQL_TYPE, + PlaintextSqlType::REAL + ); + } + + #[test] + fn f4_to_plaintext_widens_to_float_f64() { + use crate::scalar_domains::F4; + match F4(0.5).to_plaintext() { + Plaintext::Float(Some(v)) => assert_eq!(v, 0.5_f64), + other => panic!("expected Plaintext::Float(Some(0.5)), got {other:?}"), + } + } + + #[test] + fn f8_casts_to_double() { + use crate::scalar_domains::F8; + assert_eq!(::CAST, Cast::DOUBLE); + } + + #[test] + fn f8_plaintext_sql_type_is_double_precision() { + use crate::scalar_domains::F8; + assert_eq!( + ::PLAINTEXT_SQL_TYPE, + PlaintextSqlType::DOUBLE_PRECISION + ); + } + + #[test] + fn f8_to_plaintext_wraps_in_float_variant() { + use crate::scalar_domains::F8; + match F8(1.5).to_plaintext() { + Plaintext::Float(Some(v)) => assert_eq!(v, 1.5_f64), + other => panic!("expected Plaintext::Float(Some(1.5)), got {other:?}"), + } + } } diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 43f8594b1..788b54fa2 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -13,7 +13,7 @@ /// Stamp out the `spec()` builder, the `fixture-gen` generator test, and the /// property-test module for a scalar fixture. /// -/// The leading **kind** discriminator (`int` / `temporal` / `text` / `numeric` +/// The leading **kind** discriminator (`int` / `temporal` / `text` / `numeric` / `float` /// / `storage`) selects which property asserts are stamped and which index set /// the fixture declares — the rest of the expansion is identical: /// @@ -174,6 +174,36 @@ macro_rules! scalar_fixture { } }; + // Float scalars (`F4`/`F8`): ordered, non-chrono. Same shape as `numeric` — + // `[Unique, Ore]` indexes, pivot-presence asserts via `OrderedScalar` — + // materialised from the harness float newtypes (no `Match`, no chrono). + (float, $name:literal, $ty:ty, $values:expr $(,)?) => { + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); + + #[cfg(test)] + mod tests { + use super::*; + use $crate::scalar_domains::OrderedScalar; + + #[test] + fn spec_is_complete() { + assert!(spec().check_complete().is_ok()); + } + + #[test] + fn spec_includes_pivots() { + let spec = spec(); + let values = spec.values(); + let min = <$ty as OrderedScalar>::min_pivot(); + let mid = <$ty as OrderedScalar>::mid_pivot(); + let max = <$ty as OrderedScalar>::max_pivot(); + assert!(values.contains(&min), "spec must include min_pivot {min:?}"); + assert!(values.contains(&mid), "spec must include mid_pivot {mid:?}"); + assert!(values.contains(&max), "spec must include max_pivot {max:?}"); + } + } + }; + // Storage-only (encryption-only) scalars (`bool`): the value is encrypted // with NO search index, so the payload is `{v,i,c}` with no term key. The // fixture declares zero indexes (`.storage_only()`), and the property test diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 9882bbe9a..4d3acb381 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -2,6 +2,15 @@ //! //! Provides assertion builders and test helpers for EQL functionality tests. +// Self-alias so this crate can be named `eql_tests::…` in paths that must resolve +// identically whether they expand inside the lib (e.g. `scalar_types!(fixture_modules)`) +// or inside an integration-test binary (e.g. `scalar_types!(matrix_suites)` in +// `tests/encrypted_domain/scalars/mod.rs`). Local harness types like +// `scalar_domains::F4`/`F8` are referenced from the `scalar_types.rs` dispatch list +// via the absolute `eql_tests::scalar_domains::F4` path — `crate::…` would resolve to +// the test binary's own crate root in the matrix-suite expansion, not to this lib. +extern crate self as eql_tests; + use sqlx::PgPool; pub mod assertions; diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 318e2e890..8cf43ab27 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -780,6 +780,292 @@ mod text_value_tests { } } +// `float4`/`float8` are hand-written (like `text`/`numeric`): the proc-macro +// emits `impl ScalarType` only for the integer kinds, and `f32`/`f64` are not +// `Ord` (which `ScalarType` requires), so the newtypes `F4`/`F8` carry `Ord` via +// `total_cmp`. Both widths encrypt through the SINGLE f64 crypto path +// (`Plaintext::Float`), so `float4` vs `float8` is purely a Postgres-surface +// distinction. The newtype + trait impls are necessarily per-width (different +// inner primitive, `PG_TYPE`, pivots, and `as f64` widening), so they are +// hand-written, but the value materialiser is the kind-agnostic part and reuses +// the shared `lazy_values!` macro (as `text`/`numeric` do). + +/// Harness newtype over `f32` for the `float4` scalar. `f32` is not `Ord`, which +/// `ScalarType` requires, so `Ord` is derived from `total_cmp` — safe because NaN +/// is never a fixture (guarded in `float_value_guards`). `#[sqlx(transparent)]` +/// delegates `Type`/`Decode` to the inner `f32` against Postgres `real`. +/// `Default` is `F4(0.0)` (the numeric origin / mid pivot). +/// +/// `#[derive(sqlx::Type)]` + `#[sqlx(transparent)]` already generates the +/// delegating `Type` AND `Decode` (and `Encode`) impls for the newtype, so we do +/// NOT also `#[derive(sqlx::Decode)]` — that would be a conflicting impl. +#[derive(Debug, Clone, Copy, PartialEq, sqlx::Type)] +#[sqlx(transparent)] +pub struct F4(pub f32); + +impl Eq for F4 {} +impl Ord for F4 { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.0.total_cmp(&other.0) + } +} +impl PartialOrd for F4 { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} +impl Default for F4 { + fn default() -> Self { + F4(0.0) + } +} +impl std::fmt::Display for F4 { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +/// Harness newtype over `f64` for the `float8` scalar. Same design as `F4`: +/// `Ord` via `total_cmp`, `#[sqlx(transparent)]` against Postgres +/// `double precision`, `Default = F8(0.0)`. Like `F4`, the transparent +/// `sqlx::Type` derive also supplies `Decode`/`Encode`, so they are not derived +/// separately. +#[derive(Debug, Clone, Copy, PartialEq, sqlx::Type)] +#[sqlx(transparent)] +pub struct F8(pub f64); + +impl Eq for F8 {} +impl Ord for F8 { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.0.total_cmp(&other.0) + } +} +impl PartialOrd for F8 { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} +impl Default for F8 { + fn default() -> Self { + F8(0.0) + } +} +impl std::fmt::Display for F8 { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +// `float4`/`float8` value wiring goes through the shared `lazy_values!` +// materialiser (the same macro `text`/`numeric` use), parsing the catalog's +// `Fixture::Float` strings into the newtype. Rust's `str::parse::` accepts +// `"inf"`/`"-inf"`/`"nan"`, so the ±Inf pivots parse natively (NaN is excluded by +// the catalog guards). `float4_values()`/`float8_values()` are public so the +// `eql_v2_float4`/`eql_v2_float8` fixture modules (emitted by +// `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. +lazy_values! { + cell = FLOAT4_VALUES_CELL, + accessor = float4_values, + rust_type = F4, + spec = eql_scalars::FLOAT4, + variant = Float, + pg_type = "float4", + parse = |f| match f { + eql_scalars::Fixture::Float(s) => F4(s + .parse() + .unwrap_or_else(|e| panic!("invalid float4 catalog fixture {s:?}: {e}"))), + other => panic!("non-float fixture in float4 catalog row: {other:?}"), + }, +} + +lazy_values! { + cell = FLOAT8_VALUES_CELL, + accessor = float8_values, + rust_type = F8, + spec = eql_scalars::FLOAT8, + variant = Float, + pg_type = "float8", + parse = |f| match f { + eql_scalars::Fixture::Float(s) => F8(s + .parse() + .unwrap_or_else(|e| panic!("invalid float8 catalog fixture {s:?}: {e}"))), + other => panic!("non-float fixture in float8 catalog row: {other:?}"), + }, +} + +/// Render an f64 as a Postgres float SQL literal. Finite values use the numeric +/// Display form; non-finite values use the quoted `'Infinity'` / `'-Infinity'` +/// special-input form (`'inf'` from Rust's Display is NOT a valid SQL float). +fn float_sql_literal(x: f64) -> String { + if x.is_infinite() { + if x.is_sign_positive() { + "'Infinity'".to_string() + } else { + "'-Infinity'".to_string() + } + } else { + format!("{x}") + } +} + +impl ScalarType for F4 { + const PG_TYPE: &'static str = "float4"; + + fn fixture_values() -> &'static [Self] { + float4_values() + } + + fn to_sql_literal(value: &Self) -> String { + float_sql_literal(value.0 as f64) + } + + fn arbitrary_value() -> proptest::strategy::BoxedStrategy { + use proptest::strategy::Strategy; + // Sample the cast-valid fixture set (no NaN/-0.0/non-finite novelty + // beyond the fixtures). Every value already round-trips through `real`. + proptest::sample::select(float4_values().to_vec()).boxed() + } +} + +impl OrderedScalar for F4 { + // Boundary pivots derive from `fixture_values()` (= ±Inf); `mid_pivot` + // inherits `Self::default()` = `F4(0.0)`, a real fixture and the origin. +} + +impl SignedScalar for F4 { + /// Floats are signed about `0.0`; fixtures straddle it. + fn origin() -> Self { + F4(0.0) + } +} + +impl ScalarType for F8 { + const PG_TYPE: &'static str = "float8"; + + fn fixture_values() -> &'static [Self] { + float8_values() + } + + fn to_sql_literal(value: &Self) -> String { + float_sql_literal(value.0) + } + + fn arbitrary_value() -> proptest::strategy::BoxedStrategy { + use proptest::strategy::Strategy; + proptest::sample::select(float8_values().to_vec()).boxed() + } +} + +impl OrderedScalar for F8 {} + +impl SignedScalar for F8 { + fn origin() -> Self { + F8(0.0) + } +} + +/// Guards for the float value wiring: the runtime properties the fixture table +/// relies on (catalog parity, no NaN/`-0.0`, pivots present), plus the f32→f64 +/// widening contract the single-crypto-path design rests on. +#[cfg(test)] +mod float_value_guards { + use super::*; + + #[test] + fn float4_values_match_catalog_and_are_finite_non_negative_zero() { + let vals = float4_values(); + // Parsed from the catalog, in order. + let want: Vec = eql_scalars::FLOAT4 + .fixtures + .iter() + .map(|f| match f { + eql_scalars::Fixture::Float(s) => F4(s.parse().unwrap()), + other => panic!("non-float fixture: {other:?}"), + }) + .collect(); + assert_eq!(vals, want.as_slice()); + // No NaN, no -0.0 (the encoder canonicalizes -0.0 -> +0.0; a duplicate + // would break fetch_fixture_payload's fetch_one). + for v in vals { + assert!(!v.0.is_nan(), "{v:?} is NaN"); + assert!(!(v.0 == 0.0 && v.0.is_sign_negative()), "{v:?} is -0.0"); + } + } + + #[test] + fn float8_values_match_catalog_and_are_finite_non_negative_zero() { + let vals = float8_values(); + let want: Vec = eql_scalars::FLOAT8 + .fixtures + .iter() + .map(|f| match f { + eql_scalars::Fixture::Float(s) => F8(s.parse().unwrap()), + other => panic!("non-float fixture: {other:?}"), + }) + .collect(); + assert_eq!(vals, want.as_slice()); + for v in vals { + assert!(!v.0.is_nan(), "{v:?} is NaN"); + assert!(!(v.0 == 0.0 && v.0.is_sign_negative()), "{v:?} is -0.0"); + } + } + + #[test] + fn float_pivots_and_origin_are_fixtures() { + // min/max/origin must be present verbatim (fetch_fixture_payload fetches + // each pivot's ciphertext at test time). + assert!(float4_values().contains(&::min_pivot())); + assert!(float4_values().contains(&::max_pivot())); + assert!(float4_values().contains(&::origin())); + assert_eq!(::origin(), F4(0.0)); + assert!(float8_values().contains(&::min_pivot())); + assert!(float8_values().contains(&::max_pivot())); + assert!(float8_values().contains(&::origin())); + assert_eq!(::origin(), F8(0.0)); + } + + #[test] + fn float_min_max_pivots_are_the_infinities() { + assert_eq!(::min_pivot(), F4(f32::NEG_INFINITY)); + assert_eq!(::max_pivot(), F4(f32::INFINITY)); + assert_eq!(::min_pivot(), F8(f64::NEG_INFINITY)); + assert_eq!(::max_pivot(), F8(f64::INFINITY)); + } + + /// The whole single-crypto-path design rests on "f32→f64 widening is exact + /// and monotonic". Every catalog fixture is exact-in-f32 (powers of two / + /// halves) and `arbitrary_value()` only samples those, so the property is + /// otherwise untested for f32 values that have NO exact f64-of-an-f32 quirk. + /// Exercise a deliberately NON-representable-in-decimal f32 (`0.1f32`, whose + /// nearest f32 differs from `0.1f64`) and confirm the f32 ordering survives + /// the widening to f64 — i.e. `a < b` as f32 iff `(a as f64) < (b as f64)` + /// for the EXACT bits the crypto path encrypts (`to_plaintext` does + /// `self.0 as f64`). This is a pure-Rust guard; it does not touch the DB. + #[test] + fn f32_to_f64_widening_is_order_preserving_for_non_representable_values() { + // Spread of f32 values that are not "nice" in decimal, straddling 0. + let xs: [f32; 7] = [-0.3, -0.1, -0.0625, 0.0, 0.1, 0.2, 0.3]; + for w in xs.windows(2) { + let (a, b) = (w[0], w[1]); + // f32 strict order matches the widened f64 strict order, bit-for-bit + // on the value the f64 crypto path actually sees. + assert_eq!( + a < b, + (a as f64) < (b as f64), + "widening {a} -> {} reordered relative to {b} -> {}", + a as f64, + b as f64 + ); + // total_cmp (the newtype's Ord source) agrees with the widened cmp. + assert_eq!( + a.total_cmp(&b), + (a as f64).total_cmp(&(b as f64)), + "F4 Ord (total_cmp) disagrees with widened F8 Ord for {a} vs {b}" + ); + } + } +} + /// Per-domain capability + payload shape, resolved from `CATALOG`. Each /// variant maps to a domain suffix (`Eq` => `_eq`, `Search` => `_search`, /// …); its terms, required payload keys, supported operators, and @@ -1344,6 +1630,8 @@ mod pivot_derivation_tests { boundary_pivots_are_fixture_extremes::>(); boundary_pivots_are_fixture_extremes::(); boundary_pivots_are_fixture_extremes::(); + boundary_pivots_are_fixture_extremes::(); + boundary_pivots_are_fixture_extremes::(); } } @@ -1372,6 +1660,8 @@ mod arbitrary_value_tests { draws_a_value::>(); draws_a_value::(); draws_a_value::(); + draws_a_value::(); + draws_a_value::(); } } @@ -1403,7 +1693,9 @@ mod oracle_inventory_tests { "date", "timestamptz", "numeric", - "text" + "text", + "float4", + "float8" ], ); // bool is storage-only: no ordered domain, so it is excluded. @@ -1437,7 +1729,9 @@ mod oracle_inventory_tests { "date", "timestamptz", "numeric", - "text" + "text", + "float4", + "float8" ], "a new ordered scalar must be wired into BOTH oracle suites \ (fixture_oracle.rs and e2e_oracle.rs)" diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 6b9f6b42d..9a9d5abf1 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -59,6 +59,8 @@ macro_rules! scalar_types { numeric => rust_decimal::Decimal, text => String, bool => bool, + float4 => eql_tests::scalar_domains::F4, + float8 => eql_tests::scalar_domains::F8, } }; } diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 19ae7dde3..585895856 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -27,6 +27,15 @@ mod text_match; #[path = "encrypted_domain/signed.rs"] mod signed; +// Float edge-case behavioural suite (NaN / ±0 / ±Inf). Creds/e2e-gated: it +// encrypts the special values FRESH at test time, so NaN never enters the shared +// float8 fixture table (where it would corrupt the all-pairs oracle). Deliberately +// NOT under `scalars::` so the matrix-inventory snapshot does not mis-read it as a +// scalar type (same rationale as `signed` / `text_match`). +#[cfg(feature = "proptest-e2e")] +#[path = "encrypted_domain/float_special.rs"] +mod float_special; + // SteVec jsonb-entry behaviour matrix (the reduced `jsonb_entry_matrix!`). // Deliberately NOT under `scalars::` — `JsonbEntryInt4` is not a catalog scalar, // so its names live under `jsonb_entry::…` and are pinned by the separate diff --git a/tests/sqlx/tests/encrypted_domain/float_special.rs b/tests/sqlx/tests/encrypted_domain/float_special.rs new file mode 100644 index 000000000..263cfe336 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/float_special.rs @@ -0,0 +1,132 @@ +//! Float edge-case behavioural regression suite (CIP — float4/float8). +//! +//! Captures the NaN / `-0.0` / `+0.0` / `±Inf` behaviour that the shared +//! all-pairs oracle deliberately excludes from its fixtures (NaN is unordered +//! and unspecified in the encoder; `-0.0` canonicalizes to `+0.0`). It encrypts +//! the special values FRESH through cipherstash at test time, so NaN never +//! enters the `float8` fixture table. +//! +//! IMPORTANT: the NaN eq/order outcomes asserted here are an **artifact of the +//! canonical NaN bit pattern + deterministic index terms (hm/ore are pure +//! functions of plaintext+key)**, NOT a supported guarantee, and they diverge +//! from IEEE (`NaN != NaN`). They are discovered-and-locked on first run. +//! +//! The `-0.0`/`+0.0` equality below pins the `orderable-bytes` ORE path, which +//! canonicalizes `-0.0 -> +0.0` before encoding. A dormant alternative encoder +//! (`cllw-ore`) instead distinguishes them; if float ORE is ever routed through +//! that path this test flips from "equal" to "`-0.0 < +0.0`" — it is the canary, +//! so keep this comment pointing at the orderable-bytes canonicalization. + +use anyhow::Result; +use eql_tests::fixtures::cipherstash::{column_config_for, encrypt_store}; +use eql_tests::fixtures::eql_plaintext::EqlPlaintext; +use eql_tests::fixtures::index_kind::IndexKind; +use eql_tests::property::{connect_pool, ensure_eql_installed}; +use eql_tests::scalar_domains::F8; +use sqlx::PgPool; + +/// Encrypt one batch of f64 special values into payload JSON strings, one +/// ZeroKMS round trip. Mirrors `e2e_oracle::encrypt_rows` but returns only the +/// payloads (these tests key on position, not plaintext). `encrypt_store` +/// encrypts through cipherstash-client directly — it needs no `PgPool`. +async fn encrypt_specials(values: &[F8]) -> Result> { + let config = column_config_for( + &[IndexKind::Unique, IndexKind::Ore], + ::CAST, + )?; + let payloads = encrypt_store("float_special", "payload", values, &config).await?; + Ok(payloads.into_iter().map(|p| p.to_string()).collect()) +} + +/// Cast a payload literal to `eql_v3.float8` and read it back, proving the domain +/// CHECK accepts the encrypted special value. +async fn cast_passes_check(pool: &PgPool, payload: &str) -> Result<()> { + let sql = "SELECT ($1::jsonb::eql_v3.float8) IS NOT NULL"; + let ok: bool = sqlx::query_scalar(sql) + .bind(payload) + .fetch_one(pool) + .await?; + anyhow::ensure!(ok, "payload failed the eql_v3.float8 CHECK: {payload}"); + Ok(()) +} + +/// Compare two payloads under an operator on the `_ord` domain, returning the +/// boolean result. Used to pin the discovered NaN/±0/±Inf outcomes. +async fn ord_cmp(pool: &PgPool, a: &str, op: &str, b: &str) -> Result { + let d = "eql_v3.float8_ord"; + let sql = format!("SELECT ($1::jsonb::{d} {op} $2::jsonb::{d})"); + Ok(sqlx::query_scalar(&sql) + .bind(a) + .bind(b) + .fetch_one(pool) + .await?) +} + +/// Equality under the `_eq` domain (HMAC). +async fn eq_cmp(pool: &PgPool, a: &str, b: &str) -> Result { + let d = "eql_v3.float8_eq"; + let sql = format!("SELECT ($1::jsonb::{d} = $2::jsonb::{d})"); + Ok(sqlx::query_scalar(&sql) + .bind(a) + .bind(b) + .fetch_one(pool) + .await?) +} + +async fn setup() -> Result { + let pool = connect_pool().await?; + ensure_eql_installed(&pool, &crate::property::migrator()).await?; + Ok(pool) +} + +#[tokio::test] +async fn nan_encrypts_and_passes_check() -> Result<()> { + // Encrypting f64::NAN succeeds (no panic) and yields a structurally valid + // eql_v3.float8 payload. This is the one universal NaN guarantee. + let pool = setup().await?; + let payloads = encrypt_specials(&[F8(f64::NAN)]).await?; + assert_eq!(payloads.len(), 1); + cast_passes_check(&pool, &payloads[0]).await?; + Ok(()) +} + +#[tokio::test] +async fn two_encryptions_of_same_nan_bits_compare_equal() -> Result<()> { + // ARTIFACT, NOT A GUARANTEE: index terms are deterministic functions of + // plaintext+key, so two encryptions of the SAME canonical NaN bit pattern + // produce the same hm/ore terms and compare equal under `=` — diverging from + // IEEE (NaN != NaN). Locked on first run; if the encoder's canonical NaN + // handling changes, this fails loudly and the comment must be revisited. + let pool = setup().await?; + let p = encrypt_specials(&[F8(f64::NAN), F8(f64::NAN)]).await?; + let equal = eq_cmp(&pool, &p[0], &p[1]).await?; + assert!( + equal, + "two encryptions of canonical NaN compare equal (artifact of deterministic terms)" + ); + Ok(()) +} + +#[tokio::test] +async fn negative_zero_and_positive_zero_compare_equal_and_share_ore() -> Result<()> { + // The encoder canonicalizes -0.0 -> +0.0 (byte-equal), matching IEEE + // (-0.0 == 0.0). So they compare equal under `=` and are not `<` either way. + let pool = setup().await?; + let p = encrypt_specials(&[F8(-0.0), F8(0.0)]).await?; + assert!(eq_cmp(&pool, &p[0], &p[1]).await?, "-0.0 == +0.0"); + assert!(!ord_cmp(&pool, &p[0], "<", &p[1]).await?, "-0.0 not < +0.0"); + assert!(!ord_cmp(&pool, &p[1], "<", &p[0]).await?, "+0.0 not < -0.0"); + Ok(()) +} + +#[tokio::test] +async fn infinities_order_correctly() -> Result<()> { + // Redundant spot-check of the boundary ordering: -Inf < 0 < +Inf through the + // encrypted _ord domain (no decryption). + let pool = setup().await?; + let p = encrypt_specials(&[F8(f64::NEG_INFINITY), F8(0.0), F8(f64::INFINITY)]).await?; + assert!(ord_cmp(&pool, &p[0], "<", &p[1]).await?, "-Inf < 0"); + assert!(ord_cmp(&pool, &p[1], "<", &p[2]).await?, "0 < +Inf"); + assert!(ord_cmp(&pool, &p[0], "<", &p[2]).await?, "-Inf < +Inf"); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index 905fc4d4a..3fce0980a 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -186,3 +186,81 @@ e2e_oracle_suite!( "proptest_e2e_text", seeds = ["aard".to_string(), "frank".to_string(), "zzzz".to_string()] ); +e2e_oracle_suite!( + float4, + eql_tests::scalar_domains::F4, + "proptest_e2e_float4", + seeds = [ + eql_tests::scalar_domains::F4(f32::NEG_INFINITY), + eql_tests::scalar_domains::F4(0.0), + eql_tests::scalar_domains::F4(f32::INFINITY), + ] +); +e2e_oracle_suite!( + float8, + eql_tests::scalar_domains::F8, + "proptest_e2e_float8", + seeds = [ + eql_tests::scalar_domains::F8(f64::NEG_INFINITY), + eql_tests::scalar_domains::F8(0.0), + eql_tests::scalar_domains::F8(f64::INFINITY), + ] +); + +/// Both float widths encrypt through the SINGLE f64 crypto path +/// (`F4::to_plaintext` widens `self.0 as f64`; `F8::to_plaintext` is the +/// identity), so an f32 value and its exact f64 widening MUST produce identical +/// index terms — this is the byte-identity the CHANGELOG claims. Encrypt the +/// same value both ways (an f32-exact value, so `x as f64` is lossless) and +/// assert the `hm` (HMAC equality) and `ob` (ORE) terms match across widths. +/// Creds/e2e-gated like the rest of this file. +#[test] +fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { + use eql_tests::scalar_domains::{F4, F8}; + + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build()?; + + // f32-exact value: `x as f64` is the same real number, so any term + // difference would be a width artifact, which is exactly what we forbid. + let x: f32 = 2.25; + + let f4_payloads = rt.block_on(async { + let cfg = column_config_for( + &[IndexKind::Unique, IndexKind::Ore], + ::CAST, + )?; + encrypt_store("xwidth_f4", "payload", &[F4(x)], &cfg).await + })?; + let f8_payloads = rt.block_on(async { + let cfg = column_config_for( + &[IndexKind::Unique, IndexKind::Ore], + ::CAST, + )?; + encrypt_store("xwidth_f8", "payload", &[F8(x as f64)], &cfg).await + })?; + + // Pull a string index term from the EQL payload JSON (`hm` / `ob`). + let term = |p: &serde_json::Value, key: &str| -> Result { + p.get(key) + .and_then(serde_json::Value::as_str) + .map(str::to_string) + .ok_or_else(|| anyhow::anyhow!("payload missing string `{key}`: {p}")) + }; + + // HMAC equality term: identical plaintext + key => identical hm, so the two + // widths are equality-interchangeable at the term level. + assert_eq!( + term(&f4_payloads[0], "hm")?, + term(&f8_payloads[0], "hm")?, + "float4 and float8 of the same value must share the hm equality term" + ); + // ORE term: same f64 input => same ORE ciphertext, so ordering is identical. + assert_eq!( + term(&f4_payloads[0], "ob")?, + term(&f8_payloads[0], "ob")?, + "float4 and float8 of the same value must share the ob ORE term" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 5e940ab03..cf5d86454 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -64,6 +64,14 @@ fn embedded_fixture_sql() -> &'static str { env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v2_numeric.sql" )), + "float4" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_float4.sql" + )), + "float8" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_float8.sql" + )), other => panic!( "no embedded fixture for catalog token '{other}'; \ add an include_str! arm in fixture_oracle.rs" @@ -240,3 +248,5 @@ fixture_oracle_suite!(date, chrono::NaiveDate, ordered); fixture_oracle_suite!(timestamptz, chrono::DateTime, ordered); fixture_oracle_suite!(numeric, rust_decimal::Decimal, ordered); fixture_oracle_suite!(text, String, ordered); +fixture_oracle_suite!(float4, eql_tests::scalar_domains::F4, ordered); +fixture_oracle_suite!(float8, eql_tests::scalar_domains::F8, ordered); diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs index 08b8b6bcb..19b822ae3 100644 --- a/tests/sqlx/tests/encrypted_domain/signed.rs +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -1,9 +1,9 @@ //! Sign-boundary coverage for **signed** scalars (`int2`/`int4`/`int8`, `date`, -//! `timestamptz`) — the `SignedScalar` delta on top of the uniform ordered -//! matrix. +//! `timestamptz`, `float4`/`float8`) — the `SignedScalar` delta on top of the +//! uniform ordered matrix. //! //! ORE encrypts signed values as an offset from a numeric origin (`0` for -//! integers, the epoch for `date`/`timestamptz`). This suite asserts the ORE block ordering is +//! integers and floats, the epoch for `date`/`timestamptz`). This suite asserts the ORE block ordering is //! **monotonic across that origin**: a fixture below the origin orders before //! the origin, which orders before a fixture above it — through the encrypted //! `_ord` domain, with no decryption. @@ -67,3 +67,13 @@ async fn int8_sign_boundary(pool: PgPool) -> anyhow::Result<()> { async fn timestamptz_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::>(&pool).await } + +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_float4")))] +async fn float4_sign_boundary(pool: PgPool) -> anyhow::Result<()> { + sign_boundary_is_monotonic::(&pool).await +} + +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_float8")))] +async fn float8_sign_boundary(pool: PgPool) -> anyhow::Result<()> { + sign_boundary_is_monotonic::(&pool).await +} From eba02dab72b619a8cf60fc7b0dd44d1823af316e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 20:06:29 +1000 Subject: [PATCH 266/599] docs(v3): changelog entry for float4/float8 encrypted domains CHANGELOG Added entry for the float4/float8 families, with the IEEE-754 caveats (NaN ordering, +/-0 equality, f64 widening) folded inline. No docs/upgrading/ note: this is additive eql_v3, not an eql_v2 release. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb65ef95d..56cb547ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) +- **`eql_v3.float4` / `eql_v3.float8` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.float4` / `eql_v3.float8` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `float4` / `float8` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `float4` vs `float8` is purely a Postgres-surface distinction and the ciphertext / ORE term are byte-identical. Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `int8`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299)) ### Changed From b16dde8f1c5d717d6e6795a130b91e9c2933404a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 20:08:23 +1000 Subject: [PATCH 267/599] =?UTF-8?q?docs/test(v3):=20float=20review=20follo?= =?UTF-8?q?w-ups=20=E2=80=94=20dyadic=20fixture=20invariant,=20NaN=20cavea?= =?UTF-8?q?t,=20order=20tripwire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - eql-scalars: correct the FLOAT4_FIXTURES comment — the values are dyadic rationals (n/2^k), not 'powers of two and halves'; add a keep-it-dyadic warning so a non-f32-exact fixture (e.g. 0.1) can't silently desync the oracle. - eql-types: document NaN/-0.0/+-Inf special-value behaviour on the float8 module (and point float4 at it) — NaN is never rejected server-side, so the caller-facing 'reject NaN client-side' guidance lives next to the types. - float_special: add nan_order_position_is_deterministic_and_total, a tripwire locking the total+deterministic order the Block-ORE index relies on (without pinning NaN's unspecified direction). - Drop the dangling reference to the removed U-001 upgrade note. --- crates/eql-scalars/src/lib.rs | 8 ++- crates/eql-types/src/v3/float4.rs | 4 ++ crates/eql-types/src/v3/float8.rs | 14 +++++ .../tests/encrypted_domain/float_special.rs | 53 +++++++++++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 3773ee469..899573c69 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -507,8 +507,12 @@ pub const TEXT: ScalarSpec = ScalarSpec { /// `float4` fixture plaintexts — IEEE-754 strings parsed into `f32` in the SQLx /// harness (the catalog stays zero-dep). EVERY value is exactly representable in -/// f32 (powers of two and halves), so the `real` round-trip is lossless and the -/// f32→f64 widening before encryption is exact. The three pivots MUST be present +/// f32 — each is a dyadic rational `n/2^k` (e.g. `2.25 = 9/4`, `0.25 = 1/4`, +/// `1024 = 2^10`), the value class `real` stores losslessly — so the `real` +/// round-trip is lossless and the f32→f64 widening before encryption is exact. +/// Keep new fixtures dyadic: a value like `0.1` is NOT f32-exact, and the +/// oracle's expected order (parsed `f32`) would then disagree with the value the +/// `real` column actually rounds to. The three pivots MUST be present /// verbatim: `"-inf"` (min_pivot), `"0"` (origin/mid), `"inf"` (max_pivot). /// NaN and `-0.0` are deliberately excluded (see the `float_special` suite). /// Distinctness is enforced by `Fixture::Float` (above) and its guard test. diff --git a/crates/eql-types/src/v3/float4.rs b/crates/eql-types/src/v3/float4.rs index 10d841f5e..4af550230 100644 --- a/crates/eql-types/src/v3/float4.rs +++ b/crates/eql-types/src/v3/float4.rs @@ -8,6 +8,10 @@ //! wire shape here is identical to [`crate::v3::float8`] — an 8-block `ob` term //! (`f64::ENCODED_LEN == 8`, same as `int8`). `float4` vs `float8` is purely a //! Postgres-surface distinction (column type, domain name). +//! +//! Special-value behaviour (`-0.0`, `±Inf`, and the **NaN is not rejected +//! server-side — reject it client-side** caveat) is identical to `float8`; see +//! [`crate::v3::float8`] for the full note. use schemars::{schema::RootSchema, schema_for}; diff --git a/crates/eql-types/src/v3/float8.rs b/crates/eql-types/src/v3/float8.rs index fd8c24325..de2ebba3c 100644 --- a/crates/eql-types/src/v3/float8.rs +++ b/crates/eql-types/src/v3/float8.rs @@ -7,6 +7,20 @@ //! (`Plaintext::Float`), so the wire shape is identical to //! [`crate::v3::float4`] — an 8-block `ob` term (`f64::ENCODED_LEN == 8`, same //! as `int8`). +//! +//! ## Special values (caller-facing) +//! +//! `-0.0` canonicalizes to `+0.0` (equal under `=`, IEEE-consistent) and +//! `±Inf` order correctly (`-Inf < finite < +Inf`). **NaN is unordered and +//! unspecified in the encoder**: it can be encrypted, stored, and pass the +//! domain CHECK, but it carries **no comparison guarantee** and does NOT follow +//! IEEE semantics (where NaN compares false against everything). The domain +//! CHECK validates only the envelope — it cannot inspect the ciphertext — so a +//! NaN payload is never rejected server-side. **Reject NaN client-side before +//! encryption** if your column must not contain it; otherwise a NaN row sorts +//! at an arbitrary (but deterministic) position in an encrypted range scan +//! rather than being excluded the way native Postgres `double precision` would. +//! See the `float_special` regression suite for the locked behaviour. use schemars::{schema::RootSchema, schema_for}; diff --git a/tests/sqlx/tests/encrypted_domain/float_special.rs b/tests/sqlx/tests/encrypted_domain/float_special.rs index 263cfe336..f7af74b0e 100644 --- a/tests/sqlx/tests/encrypted_domain/float_special.rs +++ b/tests/sqlx/tests/encrypted_domain/float_special.rs @@ -130,3 +130,56 @@ async fn infinities_order_correctly() -> Result<()> { assert!(ord_cmp(&pool, &p[0], "<", &p[2]).await?, "-Inf < +Inf"); Ok(()) } + +#[tokio::test] +async fn nan_order_position_is_deterministic_and_total() -> Result<()> { + // TRIPWIRE for encoder drift — NOT a direction guarantee. + // + // NaN is "unordered and unspecified" by design, so we deliberately do NOT + // pin WHERE NaN sorts relative to finite / ±Inf values (that position is an + // encoder artifact and may change). But the Block-ORE index the `_ord` + // domain rides on requires a *total, deterministic* order: the same + // plaintext must always land at the same position, and every pair must + // resolve to exactly one of `<` / `=` / `>`. If a future encoder change + // makes NaN's position non-deterministic (same bits, different sort slot -> + // btree corruption) or non-total (a comparison that follows IEEE and returns + // false both ways), this fails loudly. The NaN==NaN equality artifact is + // locked separately in `two_encryptions_of_same_nan_bits_compare_equal`; + // this guards the ORDER side of the same deterministic-terms property. + let pool = setup().await?; + // Two independent encryptions of canonical NaN, plus a spread of references. + let p = encrypt_specials(&[ + F8(f64::NAN), // 0: NaN (encryption A) + F8(f64::NAN), // 1: NaN (encryption B) + F8(f64::NEG_INFINITY), // 2 + F8(0.0), // 3 + F8(f64::INFINITY), // 4 + ]) + .await?; + let (nan_a, nan_b) = (&p[0], &p[1]); + + for (label, r) in [("-Inf", &p[2]), ("0", &p[3]), ("+Inf", &p[4])] { + let lt = ord_cmp(&pool, nan_a, "<", r).await?; + let eq = ord_cmp(&pool, nan_a, "=", r).await?; + let gt = ord_cmp(&pool, nan_a, ">", r).await?; + // Totality: exactly one of < = > holds (NaN is NOT IEEE-incomparable here). + assert_eq!( + [lt, eq, gt].iter().filter(|b| **b).count(), + 1, + "NaN vs {label} is not a total order: (<, =, >) = ({lt}, {eq}, {gt})" + ); + // Determinism: a second independent NaN encryption lands identically. + let (lt_b, eq_b, gt_b) = ( + ord_cmp(&pool, nan_b, "<", r).await?, + ord_cmp(&pool, nan_b, "=", r).await?, + ord_cmp(&pool, nan_b, ">", r).await?, + ); + assert_eq!( + (lt, eq, gt), + (lt_b, eq_b, gt_b), + "NaN's order position vs {label} is not stable across re-encryption \ + (deterministic index terms broken)" + ); + } + Ok(()) +} From e6bd7a9855cd416fcae7f77341c3a5032f787216 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:04:03 +1000 Subject: [PATCH 268/599] fix(v3): hand-write F4/F8 PartialEq via total_cmp for Eq/Ord consistency Derived IEEE PartialEq (NaN != NaN, +0.0 == -0.0) was inconsistent with the manual Eq/Ord impls built on total_cmp (NaN == NaN, +0.0 != -0.0), breaking Eq's reflexivity contract and Ord/PartialEq equality agreement. --- tests/sqlx/src/scalar_domains.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 8cf43ab27..b8071309c 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -799,10 +799,18 @@ mod text_value_tests { /// `#[derive(sqlx::Type)]` + `#[sqlx(transparent)]` already generates the /// delegating `Type` AND `Decode` (and `Encode`) impls for the newtype, so we do /// NOT also `#[derive(sqlx::Decode)]` — that would be a conflicting impl. -#[derive(Debug, Clone, Copy, PartialEq, sqlx::Type)] +#[derive(Debug, Clone, Copy, sqlx::Type)] #[sqlx(transparent)] pub struct F4(pub f32); +// `PartialEq` is hand-written via `total_cmp` (not derived) so it stays +// consistent with the `Ord`/`Eq` impls below: derived IEEE equality breaks +// `Eq`'s reflexivity for NaN and disagrees with `total_cmp` on signed zero. +impl PartialEq for F4 { + fn eq(&self, other: &Self) -> bool { + self.0.total_cmp(&other.0) == std::cmp::Ordering::Equal + } +} impl Eq for F4 {} impl Ord for F4 { fn cmp(&self, other: &Self) -> std::cmp::Ordering { @@ -830,10 +838,16 @@ impl std::fmt::Display for F4 { /// `double precision`, `Default = F8(0.0)`. Like `F4`, the transparent /// `sqlx::Type` derive also supplies `Decode`/`Encode`, so they are not derived /// separately. -#[derive(Debug, Clone, Copy, PartialEq, sqlx::Type)] +#[derive(Debug, Clone, Copy, sqlx::Type)] #[sqlx(transparent)] pub struct F8(pub f64); +// `PartialEq` is hand-written via `total_cmp` (not derived); see `F4` above. +impl PartialEq for F8 { + fn eq(&self, other: &Self) -> bool { + self.0.total_cmp(&other.0) == std::cmp::Ordering::Equal + } +} impl Eq for F8 {} impl Ord for F8 { fn cmp(&self, other: &Self) -> std::cmp::Ordering { From e5b315450e919566e5644a9d12cb105dbbe38817 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 16:09:02 +1000 Subject: [PATCH 269/599] test(v3): activate dead scale feature via bench (bench = ["scale"]) + fix false comments --- tests/sqlx/Cargo.toml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 231f0e442..13970e0fd 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -36,16 +36,19 @@ workspace = true [features] default = [] # Opt-in to slow benchmark / regression / scale tests. Without this feature -# they're #[ignore]'d so PR CI stays fast. The `bench-eql` workflow enables -# it on push to main and on a nightly schedule. Run locally with: -# mise run test:bench -bench = [] -# Opt-in to the matrix's per-(variant, index) scale tests. Each builds -# ~5000 rows of filler plus a single selective pivot and asserts the -# planner *prefers* the functional index with `enable_seqscan` left on. -# The default index tests force seqscan off and only prove the index is -# *usable*. Off by default to keep `mise run test` fast; CI runs with -# `--features scale`. +# they're #[ignore]'d or #[cfg]'d out so PR CI stays fast. Enabling `bench` +# transitively enables `scale` (below), so the `bench-eql` workflow — push to +# main + nightly, via `tasks/test/bench.sh` (`cargo test --features bench`) — +# is the runner that exercises the per-combo scale-preference matrix tests. +# Run locally with: mise run test:bench +bench = ["scale"] +# The matrix's per-(variant, index) scale-preference tests +# (`#[cfg(feature = "scale")]`). Each replicates ONE real fixture payload to +# ~5000 rows plus a selective pivot and asserts the planner *prefers* the +# functional index with `enable_seqscan` left ON. The `*_index_engages_*` arms +# force seqscan off and only prove the index is *usable*. Off in fast PR CI +# (`mise run test`); activated transitively by `bench` (above), so the +# `bench-eql` workflow runs them. Not enabled directly anywhere else. scale = [] # Opt-in to the e2e property suite (CIP-3141). It generates fresh random # plaintexts each run and encrypts them end-to-end through ZeroKMS via From 5771650900d1f1f41a6a9e6e07a41439e7359c43 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 20:23:45 +1000 Subject: [PATCH 270/599] =?UTF-8?q?test(v3):=20extend=20shared=20scale=20m?= =?UTF-8?q?acro=20=E2=80=94=20ordering=20ops,=20both=20RHS=20forms,=20op-c?= =?UTF-8?q?lass-aware=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends __scalar_matrix_scale_case! to prove the planner PREFERS the functional index at scale (5002-row table: 5000 MID + 1 MIN + 1 MAX, seqscan left ON) for every op a combo carries (=, <, <=, >, >=), each anchored single-row-selective. Asserts both the natural operator form (both ::domain and bare ::jsonb RHS) and the explicit extractor form. The extractor form runs with the ::domain RHS only: a standalone eq_term/ord_term call on a bare-jsonb argument is ambiguous across the overloaded extractor family (`function eql_v3.(jsonb) is not unique`). The natural operator form already covers the bare-jsonb RHS path unambiguously, so no coverage is lost. Verified PG17: 39 *_scale_preference_* tests pass. --- tests/sqlx/src/matrix.rs | 139 ++++++++++++++++++++++++++++++++------- 1 file changed, 117 insertions(+), 22 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 0a0bc05e3..09c3b75e5 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1587,42 +1587,137 @@ macro_rules! __scalar_matrix_scale_case { ); let values: &[$scalar] = <$scalar as ScalarType>::fixture_values(); - anyhow::ensure!(values.len() >= 2, - "scale test requires >= 2 fixture rows for distinct filler/pivot"); - let filler = values[0].clone(); - let pivot = values[values.len() / 2].clone(); - let filler_payload = - $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, filler).await?; - let pivot_payload = - $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, pivot).await?; + // Distinct, sorted fixture values so MIN / MID / MAX are well + // defined regardless of fixture order. ONE data shape serves + // every op-class a combo can carry — equality combos hold `=`; + // the ordered combos hold `=` plus `<`/`<=`/`>`/`>=`, all sharing + // a single extractor (so one functional index serves them): + // + // 5000 identical MID rows (the bulk) + ONE MIN row + ONE MAX + // row = 5002 rows. + // + // Each op then anchors its predicate so EXACTLY ONE row matches, + // making the predicate ~1/5002 selective and the functional index + // the cheap plan with `enable_seqscan` left ON (Fact 4). A single + // MIN-bulk table cannot do this for both range directions at once + // (`value > MIN` would match every non-MIN row); a MID bulk with + // one MIN and one MAX pivot makes every op single-row-selective: + // `=` anchor MIN -> the single MIN row (bulk is MID) + // `<` anchor MID -> the single MIN row (MID < MID is false) + // `<=` anchor MIN -> the single MIN row + // `>` anchor MID -> the single MAX row + // `>=` anchor MAX -> the single MAX row + let mut sorted: Vec<$scalar> = values.to_vec(); + sorted.sort(); + sorted.dedup(); + anyhow::ensure!(sorted.len() >= 3, + "scale test requires >= 3 distinct fixture values for \ +min/mid/max single-row selectivity"); + let min_v = sorted[0].clone(); + let max_v = sorted[sorted.len() - 1].clone(); + let mid_v = sorted[sorted.len() / 2].clone(); + + let min_payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, min_v).await?; + let mid_payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, mid_v).await?; + let max_payload = + $crate::scalar_domains::fetch_fixture_payload::<$scalar>(&pool, max_v).await?; let mut tx = pool.begin().await?; sqlx::query(&format!( "CREATE TEMP TABLE {table} (value {d}) ON COMMIT DROP", )).execute(&mut *tx).await?; + // The bulk: 5000 identical MID rows. sqlx::query(&format!( "INSERT INTO {table}(value) \ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", - )).bind(&filler_payload).execute(&mut *tx).await?; + )).bind(&mid_payload).execute(&mut *tx).await?; + // The two selective pivots: exactly one MIN row and one MAX row. sqlx::query(&format!( - "INSERT INTO {table}(value) VALUES ($1::jsonb::{d})", - )).bind(&pivot_payload).execute(&mut *tx).await?; + "INSERT INTO {table}(value) VALUES ($1::jsonb::{d}), ($2::jsonb::{d})", + )).bind(&min_payload).bind(&max_payload).execute(&mut *tx).await?; sqlx::query(&format!( "CREATE INDEX {index} ON {table} USING {using} ({extractor}(value))", using = $using, extractor = extractor, )).execute(&mut *tx).await?; sqlx::query(&format!("ANALYZE {table}")) .execute(&mut *tx).await?; - - let lit = pivot_payload.replace('\'', "''"); - $crate::matrix::assert_index_scan_uses( - &mut *tx, - &format!("SELECT * FROM {table} WHERE value = '{lit}'::jsonb::{d}"), - index, - &format!( - "with seqscan enabled the planner must prefer the {extractor} {using} index for a selective =", - extractor = extractor, using = $using, - ), - ).await?; + // enable_seqscan LEFT ON — this is the cost-PREFERENCE proof, not + // the usability proof (the sibling `*_index_engages_*` arm forces + // seqscan off over the ~17-row fixture). See Fact 1 / Fact 4. + + // Both RHS forms (`::{domain}` and bare `::jsonb`) and BOTH the + // natural operator form and the explicit extractor form are + // asserted per op, mirroring the validity arm + // (`__scalar_matrix_index_case!`) minus the forced seqscan-off. + let rhs_casts = [format!("::{d}", d = d), String::new()]; + $( + // `<>` is never index-selective over 5000 rows and is not a + // member of any index combo; guard it out defensively. + if $op != "<>" { + // Per-op anchor giving a single-row match against the + // bulk-MID / one-MIN / one-MAX table (see the header). + let anchor: &str = match $op { + "=" => &min_payload, + "<" => &mid_payload, + "<=" => &min_payload, + ">" => &mid_payload, + ">=" => &max_payload, + _ => &min_payload, + }; + let lit = anchor.replace('\'', "''"); + for rhs_cast in &rhs_casts { + // Natural bare-operator form: `value {op} `. This + // is the inlinability tripwire — a broken inline flips + // it to Seq Scan. + let natural = format!( + "SELECT * FROM {table} WHERE value {op} '{lit}'::jsonb{cast}", + op = $op, cast = rhs_cast, + ); + $crate::matrix::assert_index_scan_uses( + &mut *tx, &natural, index, + &format!( + "scale: natural-form `{op}` (rhs {cast:?}) must PREFER the \ +{extractor} {using} index for a single-row predicate (seqscan ON)", + op = $op, cast = rhs_cast, + extractor = extractor, using = $using, + ), + ).await?; + + // Explicit extractor form: `{extractor}(value) {op} + // {extractor}()`. Complements the natural form; + // a divergence between the two surfaces an inlining + // break. + // + // ONLY the domain-cast RHS (`::{d}`) — never bare + // `::jsonb`. A standalone `eq_term`/`ord_term` call on + // a bare-jsonb argument is ambiguous: the extractor is + // overloaded across the domain family, and bare jsonb + // implicitly casts to several of them, so Postgres + // raises `function eql_v3.(jsonb) is not + // unique`. The natural operator form above already + // exercises the bare-jsonb RHS path (the operator + // signature pins the domain), so skipping it here loses + // no coverage. + if !rhs_cast.is_empty() { + let extracted = format!( + "SELECT * FROM {table} \ +WHERE {extractor}(value) {op} {extractor}('{lit}'::jsonb{cast})", + extractor = extractor, op = $op, cast = rhs_cast, + ); + $crate::matrix::assert_index_scan_uses( + &mut *tx, &extracted, index, + &format!( + "scale: extractor-form `{op}` (rhs {cast:?}) must PREFER the \ +{extractor} {using} index for a single-row predicate (seqscan ON)", + op = $op, cast = rhs_cast, + extractor = extractor, using = $using, + ), + ).await?; + } + } + } + )+ tx.commit().await?; Ok(()) From 6771f67ac3d5b69b4094f73110f46384cbcb0de1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 20:23:45 +1000 Subject: [PATCH 271/599] test(v3): scaled cost-chosen jsonb containment GIN test (replicated real ciphertext) Adds v3_jsonb_to_ste_vec_query_gin_is_cost_chosen: replicates one real v3_ste_vec document to 5000 rows + 1 distinct pivot, builds the to_ste_vec_query GIN index, and with enable_seqscan left ON asserts the planner CHOOSES the index for a single-row-selective $.hello oc containment needle (matched == 1). Complements the sibling *_gin_engages usability arm (which forces seqscan off). Verified PG17: passes. --- tests/sqlx/tests/v3_jsonb_tests.rs | 116 +++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index 8c16a3369..42ab67958 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -1148,6 +1148,122 @@ async fn v3_jsonb_index_to_ste_vec_query_gin_engages(pool: PgPool) -> anyhow::Re Ok(()) } +// ============================================================================ +// D11-scale — jsonb containment GIN is COST-CHOSEN at scale (seqscan ON). +// +// The sibling `v3_jsonb_index_to_ste_vec_query_gin_engages` (above) forces +// `enable_seqscan = off` over the 10-row fixture: it proves the GIN index is +// USABLE, not that the planner PREFERS it. This test replicates ONE real +// fixture document to 5000 rows (the bulk) plus a single DISTINCT pivot +// document and, leaving `enable_seqscan` ON, asserts the planner CHOOSES the +// GIN index for a single-row-selective containment needle. Same pattern as the +// scalar `*_scale_preference_*` arms, and `#[cfg(feature = "scale")]` so it +// rides the bench workflow, not fast PR CI (matches the scalar scale arms). +// +// Real ciphertext only: both documents come from the generated `v3_ste_vec` +// fixture, replicated via generate_series — no new fixture, no static blob. +// Selectivity comes from the distinct-per-row `$.hello` oc leaf +// (`SEL_HELLO_OC`, whose load-bearing distinctness is asserted by +// `v3_jsonb_containment_oc_only` / `v3_jsonb_fixture_structural_invariants`): +// the pivot's own oc term matches ONLY the pivot row, never the 5000 bulk rows +// (whose oc term is the filler document's, a different value). A precondition +// check below fails loudly if the two leaves ever collide. +// ============================================================================ + +#[cfg(feature = "scale")] +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] +async fn v3_jsonb_to_ste_vec_query_gin_is_cost_chosen(pool: PgPool) -> anyhow::Result<()> { + // Two DISTINCT real fixture rows: the filler (bulk) and the pivot. Their + // `$.hello` oc leaves differ (distinct per row), so a needle for the + // pivot's oc isolates exactly the single pivot row. + let filler_payload: String = sqlx::query_scalar( + "SELECT payload::jsonb::text FROM fixtures.v3_ste_vec ORDER BY id ASC LIMIT 1", + ) + .fetch_one(&pool) + .await?; + let pivot_payload: String = sqlx::query_scalar( + "SELECT payload::jsonb::text FROM fixtures.v3_ste_vec ORDER BY id DESC LIMIT 1", + ) + .fetch_one(&pool) + .await?; + + // The pivot's own `$.hello` oc term — the same extraction the oc-containment + // oracle (`v3_jsonb_containment_oc_only`) uses — which the needle searches + // for. The filler's oc term is extracted only to assert the two differ. + let pivot_oc: String = sqlx::query_scalar(&format!( + "SELECT (payload ->> '{SEL_HELLO_OC}'::text)::jsonb ->> 'oc' \ + FROM fixtures.v3_ste_vec ORDER BY id DESC LIMIT 1" + )) + .fetch_one(&pool) + .await?; + let filler_oc: String = sqlx::query_scalar(&format!( + "SELECT (payload ->> '{SEL_HELLO_OC}'::text)::jsonb ->> 'oc' \ + FROM fixtures.v3_ste_vec ORDER BY id ASC LIMIT 1" + )) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + filler_oc != pivot_oc, + "fixture precondition: filler and pivot rows must have distinct $.hello oc \ + leaves for single-row selectivity (distinct-per-row oc is the load-bearing \ + W1 invariant); got identical terms" + ); + + let mut tx = pool.begin().await?; + sqlx::query("CREATE TEMP TABLE v3_jsonb_scale (payload eql_v3.json) ON COMMIT DROP") + .execute(&mut *tx) + .await?; + // The bulk: 5000 copies of the filler document. + sqlx::query( + "INSERT INTO v3_jsonb_scale(payload) \ + SELECT $1::jsonb::eql_v3.json FROM generate_series(1, 5000)", + ) + .bind(&filler_payload) + .execute(&mut *tx) + .await?; + // The single selective pivot document. + sqlx::query("INSERT INTO v3_jsonb_scale(payload) VALUES ($1::jsonb::eql_v3.json)") + .bind(&pivot_payload) + .execute(&mut *tx) + .await?; + sqlx::query( + "CREATE INDEX v3_jsonb_scale_gin_idx ON v3_jsonb_scale \ + USING gin ((eql_v3.to_ste_vec_query(payload)::jsonb) jsonb_path_ops)", + ) + .execute(&mut *tx) + .await?; + sqlx::query("ANALYZE v3_jsonb_scale") + .execute(&mut *tx) + .await?; + // enable_seqscan LEFT ON — this is the cost-PREFERENCE proof, not the + // usability proof (the sibling `*_gin_engages` arm forces seqscan off). + + // Selective needle: the pivot's own `$.hello` oc leaf. With distinct-per-row + // oc, exactly the single pivot row contains it. + let n = needle(&[(SEL_HELLO_OC, "oc", &pivot_oc)]); + let query = + format!("SELECT count(*) FROM v3_jsonb_scale WHERE payload @> '{n}'::eql_v3.ste_vec_query"); + assert_index_scan_uses( + &mut *tx, + &query, + "v3_jsonb_scale_gin_idx", + "jsonb containment `@>` must PREFER the to_ste_vec_query GIN index at scale (seqscan ON)", + ) + .await?; + + // Row floor + selectivity: exactly the single pivot row matches (not zero — + // which would make the index-scan-over-nothing pass vacuously — and not the + // bulk, which would mean the needle was not selective). + let matched: i64 = sqlx::query_scalar(&query).fetch_one(&mut *tx).await?; + assert_eq!( + matched, 1, + "the GIN-engaged containment needle must match exactly the single pivot row" + ); + + tx.rollback().await?; + Ok(()) +} + #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn v3_jsonb_index_ore_cllw_btree_engages(pool: PgPool) -> anyhow::Result<()> { let mut tx = pool.begin().await?; From 5412fadf67931bacefc5aa61274407ac166322d2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:16:15 +1000 Subject: [PATCH 272/599] fix(ci): bench-eql must generate fixtures before compiling (reuse test:sqlx:prep) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bench.sh hand-rolled build+cp+migrate but never generated the gitignored per-type fixtures. #[sqlx::test(fixtures(...))] include_str!'s those .sql files at COMPILE time, so once fixtures became generated/gitignored the bench binary stopped compiling: 'couldn't read tests/sqlx/fixtures/eql_v2_numeric.sql'. bench-eql has failed every nightly on main for 8+ days as a result — pre-existing, unrelated to the scale tests, but it blocks them from ever running. Reuse test:sqlx:prep (build + cp + migrate + fixture:generate:all) so bench stays in lockstep with test:sqlx. --- tasks/test/bench.sh | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tasks/test/bench.sh b/tasks/test/bench.sh index 890997eb3..0f5890736 100755 --- a/tasks/test/bench.sh +++ b/tasks/test/bench.sh @@ -15,14 +15,15 @@ echo "==========================================" "$(dirname "$0")/../postgres/check_container.sh" "${POSTGRES_VERSION}" -echo "Building EQL..." -mise run --output prefix --force build - -echo "Updating SQLx migrations with built EQL..." -cp release/cipherstash-encrypt.sql tests/sqlx/migrations/001_install_eql.sql - -echo "Running SQLx migrations..." -(cd tests/sqlx && sqlx migrate run) +# Prep the SQLx test DB exactly like the standard suite (test:sqlx): build EQL, +# copy it into migrations, migrate, AND regenerate the gitignored per-type +# fixtures. The fixtures are include_str!'d into the test binary at COMPILE time +# by #[sqlx::test(fixtures(...))], so they MUST exist on disk before `cargo test` +# compiles. This script previously hand-rolled build+cp+migrate but omitted +# fixture generation; once fixtures became generated/gitignored the bench binary +# stopped compiling (couldn't read tests/sqlx/fixtures/eql_v2_*.sql). Reusing +# prep keeps bench in lockstep with test:sqlx and prevents that drift recurring. +mise run --output prefix test:sqlx:prep echo "Running bench tests (cargo test --features bench)..." (cd tests/sqlx && cargo test --features bench) From b0251422ff9d7786e4186a3772ce70fc373b1c9a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:19:20 +1000 Subject: [PATCH 273/599] fix(ci): provide CS_* creds to bench-eql for fixture generation With bench.sh now running test:sqlx:prep, fixture:generate:all encrypts via cipherstash-client and needs ZeroKMS auth (CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN) plus a client key (CS_CLIENT_ID + CS_CLIENT_KEY); without them it fails with 'Auth strategy error: Not authenticated'. Add the four secrets to the bench job env, mirroring test-eql.yml. (bench-eql triggers are push:main/schedule/dispatch, all main-repo, so no fork-PR creds exposure.) --- .github/workflows/bench-eql.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/bench-eql.yml b/.github/workflows/bench-eql.yml index 35b45991a..1a6b1644a 100644 --- a/.github/workflows/bench-eql.yml +++ b/.github/workflows/bench-eql.yml @@ -41,6 +41,15 @@ jobs: env: POSTGRES_VERSION: "17" + # test:sqlx:prep regenerates the per-type fixtures by encrypting plaintext + # through cipherstash-client, which needs BOTH a ZeroKMS auth credential + # (CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN) AND a client key (CS_CLIENT_ID + + # CS_CLIENT_KEY). Without them fixture:generate:all fails with + # "Auth strategy error: Not authenticated". Mirrors test-eql.yml. + CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} + CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} + CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} + CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} steps: - uses: actions/checkout@v4 From 1f1d8d6a252cf802a8ed6822756ad30dae3fda1a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:54:44 +1000 Subject: [PATCH 274/599] fix(ci): scope CS_* creds to the bench step, not job env MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Job-scoped secrets are exposed to every step, including third-party actions (actions/checkout, jdx/mise-action, Swatinem/rust-cache) referenced by mutable tags — a compromised tag could exfiltrate ZeroKMS/client creds before the bench script runs. Move the four CS_* vars onto the 'Run bench tests' step that actually needs them (fixture:generate:all). Least privilege; addresses PR review. --- .github/workflows/bench-eql.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/bench-eql.yml b/.github/workflows/bench-eql.yml index 1a6b1644a..70a7060a4 100644 --- a/.github/workflows/bench-eql.yml +++ b/.github/workflows/bench-eql.yml @@ -41,15 +41,6 @@ jobs: env: POSTGRES_VERSION: "17" - # test:sqlx:prep regenerates the per-type fixtures by encrypting plaintext - # through cipherstash-client, which needs BOTH a ZeroKMS auth credential - # (CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN) AND a client key (CS_CLIENT_ID + - # CS_CLIENT_KEY). Without them fixture:generate:all fails with - # "Auth strategy error: Not authenticated". Mirrors test-eql.yml. - CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} - CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} - CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} - CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} steps: - uses: actions/checkout@v4 @@ -70,6 +61,17 @@ jobs: mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" - name: Run bench tests + # CS_* scoped to THIS step only (least privilege): test:bench -> test:sqlx:prep + # -> fixture:generate:all encrypts via cipherstash-client and needs BOTH a + # ZeroKMS auth credential (CS_CLIENT_ACCESS_KEY + CS_WORKSPACE_CRN) AND a client + # key (CS_CLIENT_ID + CS_CLIENT_KEY); without them it fails "Auth strategy error: + # Not authenticated". Kept off job scope so checkout/mise/rust-cache actions + # never see them. + env: + CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} + CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} + CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} + CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} run: | export active_rust_toolchain=$(rustup show active-toolchain | cut -d' ' -f1) rustup component add --toolchain ${active_rust_toolchain} rustfmt clippy From f2061acf0eeb7f59d0c48b1e4dbe4863ffe8615a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 23:29:37 +1000 Subject: [PATCH 275/599] test(v3): assert scalar scale predicates are selective --- tests/sqlx/src/matrix.rs | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 09c3b75e5..eae042a9c 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1670,10 +1670,13 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", // Natural bare-operator form: `value {op} `. This // is the inlinability tripwire — a broken inline flips // it to Seq Scan. - let natural = format!( - "SELECT * FROM {table} WHERE value {op} '{lit}'::jsonb{cast}", + let natural_predicate = format!( + "value {op} '{lit}'::jsonb{cast}", op = $op, cast = rhs_cast, ); + let natural = format!( + "SELECT * FROM {table} WHERE {natural_predicate}", + ); $crate::matrix::assert_index_scan_uses( &mut *tx, &natural, index, &format!( @@ -1683,6 +1686,17 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", extractor = extractor, using = $using, ), ).await?; + let matched: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM {table} WHERE {natural_predicate}", + )) + .fetch_one(&mut *tx) + .await?; + assert_eq!( + matched, 1, + "scale: natural-form `{op}` (rhs {cast:?}) must match exactly \ +one row", + op = $op, cast = rhs_cast, + ); // Explicit extractor form: `{extractor}(value) {op} // {extractor}()`. Complements the natural form; @@ -1700,11 +1714,13 @@ SELECT $1::jsonb::{d} FROM generate_series(1, 5000)", // signature pins the domain), so skipping it here loses // no coverage. if !rhs_cast.is_empty() { - let extracted = format!( - "SELECT * FROM {table} \ -WHERE {extractor}(value) {op} {extractor}('{lit}'::jsonb{cast})", + let extracted_predicate = format!( + "{extractor}(value) {op} {extractor}('{lit}'::jsonb{cast})", extractor = extractor, op = $op, cast = rhs_cast, ); + let extracted = format!( + "SELECT * FROM {table} WHERE {extracted_predicate}", + ); $crate::matrix::assert_index_scan_uses( &mut *tx, &extracted, index, &format!( @@ -1714,6 +1730,17 @@ WHERE {extractor}(value) {op} {extractor}('{lit}'::jsonb{cast})", extractor = extractor, using = $using, ), ).await?; + let matched: i64 = sqlx::query_scalar(&format!( + "SELECT count(*) FROM {table} WHERE {extracted_predicate}", + )) + .fetch_one(&mut *tx) + .await?; + assert_eq!( + matched, 1, + "scale: extractor-form `{op}` (rhs {cast:?}) must match \ +exactly one row", + op = $op, cast = rhs_cast, + ); } } } From f4f88e5846697c8eb1521e2a74092d392c219bb4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 15:10:57 +1000 Subject: [PATCH 276/599] test(sqlx): function-double oracles over committed fixtures (CIP-3141) Adds the eql_v3 encrypted-domain property suite over the committed, curated real-ciphertext fixtures: - shared all-pairs operator oracle (property.rs): = / <> on _eq and the ordered comparisons + ord_term sort order, checked against a plaintext oracle over every ordered pair of fixture rows; - function-double oracles: the generated eql_v3.eq/neq/lt/lte/gt/gte functions across all three overloads (domain-domain, domain-jsonb, jsonb-domain) plus term-extractor identity (eq_term==hm, ord_term==ob); - bloom match smoke for the text _match domain; NULL/blocker/CHECK edge cases; - the e2e suite (gated behind proptest-e2e) over fresh ZeroKMS encryption. Fixtures are generated from the curated catalog values via FixtureSpec::run(). --- crates/eql-tests-macros/src/lib.rs | 16 + tests/sqlx/src/fixtures/driver.rs | 102 +++-- tests/sqlx/src/fixtures/scalar_fixture.rs | 3 +- tests/sqlx/src/property.rs | 351 +++++++++++++++++- .../encrypted_domain/property/e2e_oracle.rs | 4 +- .../encrypted_domain/property/edge_cases.rs | 15 +- .../property/fixture_oracle.rs | 207 ++++++++++- .../encrypted_domain/property/match_smoke.rs | 41 ++ .../tests/encrypted_domain/property/mod.rs | 5 +- 9 files changed, 672 insertions(+), 72 deletions(-) create mode 100644 tests/sqlx/tests/encrypted_domain/property/match_smoke.rs diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index f0a5edc9c..a2cf480aa 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -288,6 +288,8 @@ fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { let arms = list.entries.iter().map(|e| { let token_str = e.token.to_string(); let mod_ident = format_ident!("eql_v2_{}", e.token); + // Every scalar fixture is generated from its fixed curated catalog + // values via `run()`. quote! { #token_str => ::eql_tests::fixtures::#mod_ident::spec().run().await, } @@ -690,6 +692,20 @@ mod tests { assert!(suites.contains("caps = [storage]")); let dispatch = norm(&fixture_dispatch_tokens(&list)); assert!(dispatch.contains(r#""bool" =>"#)); + // Every scalar fixture is generated from its fixed curated catalog + // values via `run()`. + assert!( + dispatch.contains( + r#""bool" => :: eql_tests :: fixtures :: eql_v2_bool :: spec () . run () . await"# + ), + "bool must dispatch to run(), got: {dispatch}" + ); + assert!( + dispatch.contains( + r#""int4" => :: eql_tests :: fixtures :: eql_v2_int4 :: spec () . run () . await"# + ), + "int4 must dispatch to run(), got: {dispatch}" + ); } #[test] diff --git a/tests/sqlx/src/fixtures/driver.rs b/tests/sqlx/src/fixtures/driver.rs index 766b712ec..bff0995b9 100644 --- a/tests/sqlx/src/fixtures/driver.rs +++ b/tests/sqlx/src/fixtures/driver.rs @@ -120,31 +120,49 @@ where /// working table unconditionally once it has been created, and /// propagate failures in causal order (insert error first). pub async fn run(&self) -> Result<()> { - let config = DriverConfig::from_env()?; + let mut direct = self.connect().await?; + // Encrypt exactly the spec's curated values. + let result = self.render_values(&mut direct, self.values()).await; + let _ = direct.close().await; + let lines = result?; + self.write_script(None, &lines, self.values().len()) + } - let mut direct = config + /// Open the single direct Postgres connection the pipeline uses for + /// schema / insert / render / drop. Encryption happens in Rust + /// (cipherstash-client), so there is no second connection. + async fn connect(&self) -> Result { + let config = DriverConfig::from_env()?; + config .direct .clone() .connect() .await - .context("connecting to Postgres (direct)")?; + .context("connecting to Postgres (direct)") + } + /// The shared generation pipeline: apply the working schema, encrypt + insert + /// `values`, render the committed INSERT lines, then drop the working table. + /// + /// Honours the teardown contract: once the working table exists it is dropped + /// unconditionally (success *or* error), and failures propagate in causal + /// order — insert error first (root cause), then render, then drop. Returns + /// the rendered INSERT lines in `id` order. + async fn render_values(&self, direct: &mut PgConnection, values: &[T]) -> Result> { self.check_complete().context("invalid FixtureSpec")?; sqlx::raw_sql(&self.working_schema_sql()) - .execute(&mut direct) + .execute(&mut *direct) .await .context("applying working-table schema")?; - // Insert directly on the same connection used for schema/render/drop. - // The earlier two-connection design existed because `run_with` borrows - // `direct` mutably across the closure call; production has no such - // need — `insert_direct` is the only caller of cipherstash-client and - // can hold the same `&mut direct` for its duration. - let insert_result = self.insert_direct(&mut direct).await; + // Insert on the same connection used for schema/render/drop. `run_with`'s + // two-connection shape exists only for the test seam; production holds a + // single `&mut direct` for the whole pipeline. + let insert_result = self.insert_values(&mut *direct, values).await; let render_result = if insert_result.is_ok() { sqlx::query(&self.render_rows_sql()) - .fetch_all(&mut direct) + .fetch_all(&mut *direct) .await .context("rendering fixture rows") } else { @@ -153,22 +171,31 @@ where let working = self.working_table(); let drop_result = sqlx::raw_sql(&format!("DROP TABLE IF EXISTS public.{working};")) - .execute(&mut direct) + .execute(&mut *direct) .await; insert_result?; let rows = render_result?; drop_result.context("dropping the working table")?; - let lines: Vec = rows - .iter() + rows.iter() .map(|r| r.try_get::(0).context("reading rendered INSERT")) - .collect::>()?; - - let _ = direct.close().await; + .collect() + } + /// Compose the committed script (preamble + optional extra header + the + /// rendered INSERT lines) and write it to `tests/sqlx/fixtures/.sql`. + fn write_script( + &self, + extra_header: Option<&str>, + lines: &[String], + row_count: usize, + ) -> Result<()> { let mut script = self.fixture_script_preamble(); - for line in &lines { + if let Some(header) = extra_header { + script.push_str(header); + } + for line in lines { script.push_str(line); script.push('\n'); } @@ -176,40 +203,37 @@ where let path = fixture_script_path(&self.script_filename()); std::fs::write(&path, script) .with_context(|| format!("writing fixture script {}", path.display()))?; - println!("wrote {} ({} rows)", path.display(), self.values().len()); + println!("wrote {} ({} rows)", path.display(), row_count); Ok(()) } - /// Encrypt every plaintext value via cipherstash-client in **one - /// batched call**, then INSERT each ciphertext into the working - /// table as plain JSONB. The committed `ColumnConfig` is built once - /// from the spec's indexes + cast — the fixture name is fed as the - /// table identifier so the resulting payload's `i.t` field matches - /// the working table, preserving the shape Proxy used to emit. + /// Encrypt every value in `values` via cipherstash-client in **one batched + /// call**, then INSERT each ciphertext into the working table as plain JSONB. + /// The committed `ColumnConfig` is built once from the spec's indexes + cast + /// — the fixture name is fed as the table identifier so the resulting + /// payload's `i.t` field matches the working table, preserving the shape + /// Proxy used to emit. /// - /// Batching means one ZeroKMS round trip per fixture run regardless - /// of value count; the INSERT loop is per-row because the working - /// table is local Postgres and the per-row execute cost is in - /// microseconds. - async fn insert_direct(&self, direct: &mut PgConnection) -> Result<()> { + /// Batching means one ZeroKMS round trip per run regardless of value count; + /// the INSERT loop is per-row because the working table is local Postgres and + /// the per-row execute cost is in microseconds. A repeated plaintext in + /// `values` is encrypted independently here, so a repeated plaintext lands as + /// a distinct ciphertext row sharing that plaintext. + async fn insert_values(&self, direct: &mut PgConnection, values: &[T]) -> Result<()> { let config = cipherstash::column_config_for(self.indexes(), T::CAST) .context("building ColumnConfig from FixtureSpec indexes")?; let working = self.working_table(); - let payloads = cipherstash::encrypt_store( - &working, - cipherstash::PAYLOAD_COLUMN, - self.values(), - &config, - ) - .await - .context("encrypting fixture values")?; + let payloads = + cipherstash::encrypt_store(&working, cipherstash::PAYLOAD_COLUMN, values, &config) + .await + .context("encrypting fixture values")?; let insert = format!( "INSERT INTO public.{working} (id, plaintext, {col}) VALUES ($1, $2, $3)", col = cipherstash::PAYLOAD_COLUMN ); - for (i, (value, payload)) in self.values().iter().zip(payloads).enumerate() { + for (i, (value, payload)) in values.iter().zip(payloads).enumerate() { let id = (i as i64) + 1; sqlx::query(&insert) .bind(id) diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 788b54fa2..29ced09a3 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -271,7 +271,8 @@ macro_rules! scalar_fixture { /// The generator. Gated by `fixture-gen` so `cargo test` never compiles /// it; `#[ignore]` is a second guard. Run via - /// `mise run fixture:generate`. + /// `mise run fixture:generate`. Generates the fixed curated catalog + /// values via `run()`. #[cfg(feature = "fixture-gen")] #[tokio::test] #[ignore = "generator — run via `mise run fixture:generate`"] diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index a3603294b..cf1286403 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -1,12 +1,18 @@ //! Shared substrate for the encrypted-domain property tests (CIP-3141). //! -//! `assert_eq_oracle` / `assert_ord_oracle` take a corpus of +//! `assert_eq_oracle` / `assert_ord_oracle` take a set of //! `(plaintext, payload_json)` rows and check SQL operator results against the //! plaintext oracle over every ordered pair. The fixture suite feeds them rows -//! read from the committed fixture corpus (real ciphertext); the e2e suite feeds +//! read from the committed fixtures (real ciphertext); the e2e suite feeds //! them rows it batch-encrypts from freshly generated plaintexts. The engine is //! identical for both. //! +//! The `*_fn_oracle` helpers complement the operator oracles by calling the +//! generated `eql_v3.*` comparison **functions** by name across all three +//! [`Overload`]s, and `assert_extractor_oracle` checks term-extractor identity +//! (`eq_term` == payload `hm`, `ord_term` == payload `ob`). `assert_match_smoke` +//! is the example-based bloom-containment check for the text `_match` domain. +//! //! Operator evaluation is read-only (`SELECT op `); the fixture suite //! runs each property under `#[sqlx::test]` (its own migrated scratch DB), while //! the e2e suite (single-process, feature-gated) uses a shared pool brought up @@ -14,7 +20,8 @@ use crate::scalar_domains::{ScalarDomainSpec, ScalarType, Variant}; use anyhow::{Context, Result}; -use sqlx::PgPool; +use eql_scalars::Term; +use sqlx::{PgPool, Row as _}; /// Apply the SQLx migrations (the EQL install in `001_install_eql.sql`, plus the /// regression-data migrations) to the DB behind `pool`. @@ -41,7 +48,7 @@ pub async fn ensure_eql_installed(pool: &PgPool, migrator: &sqlx::migrate::Migra Ok(()) } -/// A single corpus entry: a plaintext and its EQL payload rendered as a JSON +/// A single fixture row: a plaintext and its EQL payload rendered as a JSON /// text literal (the `payload::text` form `fetch_fixture_payload` returns, or /// `serde_json::Value::to_string()` for a freshly encrypted value). #[derive(Clone)] @@ -64,6 +71,13 @@ fn cast(payload_json: &str, domain: &str) -> String { format!("'{}'::jsonb::{}", payload_json.replace('\'', "''"), domain) } +/// Render a JSON text literal as a bare `jsonb` value: `''::jsonb`. The +/// jsonb-side operand for the `(domain, jsonb)` / `(jsonb, domain)` overloads, +/// where the generated comparison function casts the raw jsonb itself. +fn jsonb(payload_json: &str) -> String { + format!("'{}'::jsonb", payload_json.replace('\'', "''")) +} + /// Equality oracle: for every ordered pair `(a, b)` in `rows`, /// `a = b` (SQL, on the `_eq` domain) ⇔ `a.plaintext == b.plaintext`, and /// `a <> b` is its negation. @@ -149,6 +163,335 @@ pub async fn assert_ord_oracle( Ok(()) } +/// The three generated overloads of every binary comparison / containment +/// function: both operands cast to the domain, or one side left as raw `jsonb` +/// for the function to cast. Exercising all three covers the overload set — in +/// particular the jsonb-cast convenience paths the `_eq` / `_ord` operator +/// oracles never reach (they always cast both operands). +#[derive(Clone, Copy, Debug)] +pub enum Overload { + DomainDomain, + DomainJsonb, + JsonbDomain, +} + +impl Overload { + /// All three overloads, for the per-pair fan-out. + pub const ALL: [Overload; 3] = [ + Overload::DomainDomain, + Overload::DomainJsonb, + Overload::JsonbDomain, + ]; + + /// The `(left, right)` operand SQL expressions for JSON literals `la`/`lb`, + /// casting the domain side via [`cast`] and leaving the jsonb side bare. + fn operands(self, la: &str, lb: &str, domain: &str) -> (String, String) { + match self { + Overload::DomainDomain => (cast(la, domain), cast(lb, domain)), + Overload::DomainJsonb => (cast(la, domain), jsonb(lb)), + Overload::JsonbDomain => (jsonb(la), cast(lb, domain)), + } + } +} + +/// Shared all-pairs driver for the **named-function** oracles. For every +/// ordered pair `(a, b)` in `rows`, emit a single `SELECT` whose columns are +/// `eql_v3.(...)` for every `func` in `funcs` across every +/// [`Overload`] (a 6-column query for the two eq functions, 12 for the four +/// ord functions), then assert each column against `expected(a, b, func)`. +/// Collapsing each pair to one round trip keeps the only cost this family adds +/// (`SELECT` volume) in check; ZeroKMS cost is unchanged (the rows are already +/// encrypted). Complements — does not replace — the operator oracles. +async fn assert_named_fns( + pool: &PgPool, + domain: &str, + rows: &[Row], + funcs: &[&str], + expected: F, +) -> Result<()> +where + T: ScalarType, + F: Fn(&T, &T, &str) -> bool, +{ + for a in rows { + for b in rows { + // One column per (overload, func); `meta` records the expected bool + // alongside its label so a mismatch reports which overload/func failed. + let mut exprs: Vec = Vec::new(); + let mut meta: Vec<(Overload, &str, bool)> = Vec::new(); + for &overload in &Overload::ALL { + let (l, r) = overload.operands(&a.payload_json, &b.payload_json, domain); + for &func in funcs { + exprs.push(format!("eql_v3.{func}({l}, {r})")); + meta.push((overload, func, expected(&a.plaintext, &b.plaintext, func))); + } + } + let sql = format!("SELECT {}", exprs.join(", ")); + let row = sqlx::query(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("fn-oracle pair query: {sql}"))?; + for (i, (overload, func, want)) in meta.iter().enumerate() { + let got: Option = row + .try_get(i) + .with_context(|| format!("reading column {i} of: {sql}"))?; + anyhow::ensure!( + got == Some(*want), + "fn eql_v3.{func} on {domain} ({overload:?}): plaintext {:?} vs {:?} \ + expected {want}, SQL returned {got:?}", + a.plaintext, + b.plaintext, + ); + } + } + } + Ok(()) +} + +/// Equality **function** oracle: `eql_v3.eq` / `eql_v3.neq` across all three +/// overloads agree with the plaintext (in)equality, for every ordered pair. +/// `variant` is the eq-capable domain to run on (`Eq` normally; `Search` for +/// text's combined `_search` domain). Complements `assert_eq_oracle`'s operator +/// checks by calling the named functions directly across the overload set. +pub async fn assert_eq_fn_oracle( + pool: &PgPool, + variant: Variant, + rows: &[Row], +) -> Result<()> { + let spec = ScalarDomainSpec::new::(variant); + anyhow::ensure!( + spec.supports_eq(), + "assert_eq_fn_oracle needs an eq-capable variant, got {variant:?} for {}", + T::PG_TYPE + ); + let domain = spec.sql_domain; + assert_named_fns( + pool, + &domain, + rows, + &["eq", "neq"], + |a, b, func| match func { + "eq" => a == b, + "neq" => a != b, + other => unreachable!("assert_eq_fn_oracle func {other}"), + }, + ) + .await +} + +/// Ordering **function** oracle: `eql_v3.lt` / `lte` / `gt` / `gte` across all +/// three overloads agree with the plaintext ordering, for every ordered pair. +/// `variant` is an ordered domain (`Ord` / `OrdOre`, or `Search` for text). +pub async fn assert_ord_fn_oracle( + pool: &PgPool, + variant: Variant, + rows: &[Row], +) -> Result<()> { + let spec = ScalarDomainSpec::new::(variant); + anyhow::ensure!( + spec.supports_ord(), + "assert_ord_fn_oracle needs an ordered variant, got {variant:?} for {}", + T::PG_TYPE + ); + let domain = spec.sql_domain; + assert_named_fns( + pool, + &domain, + rows, + &["lt", "lte", "gt", "gte"], + |a, b, func| match func { + "lt" => a < b, + "lte" => a <= b, + "gt" => a > b, + "gte" => a >= b, + other => unreachable!("assert_ord_fn_oracle func {other}"), + }, + ) + .await +} + +/// Term-extractor **identity** oracle: the generated extractor returns the exact +/// term stored in the payload. For `variant`'s domain, drives whichever +/// extractors its catalog terms declare: +/// - an `Hm` term ⇒ `eql_v3.eq_term()::text` equals the payload's `hm` +/// string (`eql_v3.hmac_256` is a domain over `text`, so the hex comes back +/// verbatim — no `encode`/`decode`). +/// - an `Ore` term ⇒ the `ord_term` composite, re-rendered to a hex-block array +/// (`encode((t).bytes,'hex')` per block, ordinal order), equals the payload's +/// `ob` array. +/// +/// `text_ord`/`text_search` carry both terms, so both identities are checked on +/// the one domain. The `hm`/`ob` values are read straight out of `payload_json` +/// with `serde_json` — no typed struct. +pub async fn assert_extractor_oracle( + pool: &PgPool, + variant: Variant, + rows: &[Row], +) -> Result<()> { + let spec = ScalarDomainSpec::new::(variant); + let domain = &spec.sql_domain; + let terms = variant.terms_for(T::PG_TYPE); + let check_eq = terms.contains(&Term::Hm); + let check_ord = terms.iter().any(|t| t.provides_ordering()); + anyhow::ensure!( + check_eq || check_ord, + "assert_extractor_oracle needs an Hm or Ore term, got {variant:?} for {}", + T::PG_TYPE + ); + for row in rows { + let value = cast(&row.payload_json, domain); + let payload: serde_json::Value = serde_json::from_str(&row.payload_json) + .with_context(|| format!("parsing payload_json: {}", row.payload_json))?; + + if check_eq { + let hm = payload + .get("hm") + .and_then(|v| v.as_str()) + .with_context(|| format!("payload missing string `hm`: {}", row.payload_json))?; + let sql = format!("SELECT eql_v3.eq_term({value})::text"); + let got: Option = sqlx::query_scalar(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("eq_term identity query: {sql}"))?; + anyhow::ensure!( + got.as_deref() == Some(hm), + "eq_term identity on {domain}: extractor returned {got:?}, payload hm={hm:?}", + ); + } + + if check_ord { + let ob: Vec = payload + .get("ob") + .and_then(|v| v.as_array()) + .with_context(|| format!("payload missing array `ob`: {}", row.payload_json))? + .iter() + .map(|v| v.as_str().map(str::to_owned)) + .collect::>>() + .with_context(|| { + format!("`ob` is not an array of strings: {}", row.payload_json) + })?; + // Re-render the ORE composite to its stored hex-block array + // (lower-case `encode(...,'hex')`, in array-subscript order, which is + // the order `jsonb_array_to_ore_block_256` built `terms` from the + // payload's `ob`). `eql_v3.ore_block_256_term` is a single-field + // composite `(bytes bytea)`; a `WITH ORDINALITY AS u(t, n)` column- + // alias list expands that single field to `bytea` (so `(t).bytes` + // fails to resolve), so index `terms` with `generate_subscripts` + // instead — that keeps each element a composite and gives explicit + // ordering. `ord_term` is evaluated once. + let sql = format!( + "SELECT array(\ + SELECT encode((ore.terms[i]).bytes, 'hex') \ + FROM generate_subscripts(ore.terms, 1) AS i \ + ORDER BY i) \ + FROM (SELECT (eql_v3.ord_term({value})).terms AS terms) ore" + ); + let got: Vec = sqlx::query_scalar(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("ord_term identity query: {sql}"))?; + anyhow::ensure!( + got == ob, + "ord_term identity on {domain}: extractor returned {got:?}, payload ob={ob:?}", + ); + } + } + Ok(()) +} + +/// Bloom-filter **match** smoke (text only, example-based). Bloom containment +/// admits false positives and the plaintext oracle is substring, not equality, +/// so this is curated rather than a random property: three fixtures with known +/// n-gram relationships (`haystack` ⊇ `needle`, `disjoint` shares none). Asserts +/// `eql_v3.contains` / `contained_by` respect **left-contains-right** `@>` and +/// that `match_term` yields a non-empty `bf` array. Operands are the payload +/// JSON literals cast to `domain` (`eql_v3.text_match`). +pub async fn assert_match_smoke( + pool: &PgPool, + domain: &str, + haystack_json: &str, + needle_json: &str, + disjoint_json: &str, +) -> Result<()> { + let haystack = cast(haystack_json, domain); + let needle = cast(needle_json, domain); + let disjoint = cast(disjoint_json, domain); + + // `contains(a, b)` = `match_term(a) @> match_term(b)` (a's bits ⊇ b's); + // `contained_by` is its mirror. Each row: (label, sql, expected). + let cases: [(&str, String, bool); 6] = [ + ( + "contains(haystack, needle)", + format!("eql_v3.contains({haystack}, {needle})"), + true, + ), + ( + "contains(needle, haystack)", + format!("eql_v3.contains({needle}, {haystack})"), + false, + ), + ( + "contains(haystack, disjoint)", + format!("eql_v3.contains({haystack}, {disjoint})"), + false, + ), + ( + "contained_by(needle, haystack)", + format!("eql_v3.contained_by({needle}, {haystack})"), + true, + ), + ( + "contained_by(haystack, needle)", + format!("eql_v3.contained_by({haystack}, {needle})"), + false, + ), + ( + "contained_by(disjoint, haystack)", + format!("eql_v3.contained_by({disjoint}, {haystack})"), + false, + ), + ]; + let sql = format!( + "SELECT {}", + cases + .iter() + .map(|(_, expr, _)| expr.clone()) + .collect::>() + .join(", ") + ); + let row = sqlx::query(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("match-smoke containment query: {sql}"))?; + for (i, (label, _, want)) in cases.iter().enumerate() { + let got: Option = row + .try_get(i) + .with_context(|| format!("reading column {i} of: {sql}"))?; + anyhow::ensure!( + got == Some(*want), + "match smoke {label} on {domain}: expected {want}, SQL returned {got:?}", + ); + } + + // Each fixture's `match_term` must yield a non-empty bloom (`bf`) array. + for (label, value) in [ + ("haystack", &haystack), + ("needle", &needle), + ("disjoint", &disjoint), + ] { + let sql = format!("SELECT eql_v3.match_term({value})::smallint[]"); + let bf: Vec = sqlx::query_scalar(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("match_term query for {label}: {sql}"))?; + anyhow::ensure!( + !bf.is_empty(), + "match_term({label}) on {domain} returned an empty bloom array", + ); + } + Ok(()) +} + /// Replace any `user:password@` userinfo in a connection URL with `***@` so it /// is safe to put in error context / logs (the password never appears). fn redact_url(url: &str) -> String { diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index 3fce0980a..a93c03856 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -2,7 +2,7 @@ //! end-to-end through ZeroKMS each run. Gated behind `proptest-e2e` (declared in //! property/mod.rs) — needs CS_* creds, which `mise run test:sqlx` enables for //! CI/local full SQLx runs. -//! Each proptest case generates one corpus of random integers — seeded with +//! Each proptest case generates one batch of random integers — seeded with //! type-specific extremes, zero, and deliberate duplicates so the equality-true //! branch fires across distinct ciphertexts of the same plaintext — encrypts it //! in one batched ZeroKMS call, then runs the all-pairs oracle. @@ -53,7 +53,7 @@ where .collect()) } -/// Drive proptest: each case is a corpus of integers. Generation is in-process; +/// Drive proptest: each case is a batch of integers. Generation is in-process; /// encryption + oracle is async on a current-thread runtime. fn run_e2e_property(table: &str, cases: u32, ordered: bool, seeds: &[T]) -> Result<()> where diff --git a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs index 4f2ebd9d0..bcb180a41 100644 --- a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs +++ b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs @@ -1,8 +1,8 @@ //! Unit edge cases for the eql_v3 scalar domains (CIP-3141): NULL propagation on //! supported operators, blocker functions raising on unsupported operators //! (equality, ordering, path, and containment families — the documented -//! domain-fallback footgun), the timestamptz ordering deferral, and domain -//! CHECK-constraint rejection of malformed payloads. No encryption. +//! domain-fallback footgun), ordering blocked on the equality-only `_eq` domain, +//! and domain CHECK-constraint rejection of malformed payloads. No encryption. use anyhow::Result; use eql_tests::scalar_domains::{ @@ -67,11 +67,12 @@ async fn containment_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { } #[sqlx::test] -async fn ordering_is_deferred_on_timestamptz_eq(pool: PgPool) -> Result<()> { - // timestamptz is equality-only: ordering is deferred until a wide-ORE - // comparator lands (CHANGELOG / #241). Lock that in at the SQL boundary — an - // ordering operator on `timestamptz_eq` must RAISE (and be non-STRICT), not - // silently mis-order. There are no `timestamptz_ord` / `_ord_ore` domains. +async fn ordering_blocked_on_timestamptz_eq_domain(pool: PgPool) -> Result<()> { + // timestamptz is an ordered scalar on the `eql_v3` base (its `_ord`/`_ord_ore` + // domains order via the wide-ORE comparator). But the equality-only `_eq` + // domain still must NOT answer ordering: an ordering operator on + // `timestamptz_eq` must RAISE (and be non-STRICT), not silently mis-order — + // exactly as `int4_eq` does. Callers order via the `_ord` twins, not `_eq`. let d = ScalarDomainSpec::new::>(Variant::Eq).sql_domain; let sql = format!("SELECT (NULL::{d}) < (NULL::{d})"); assert_raises(&pool, &sql, &[], &blocker_msg(&d, "<")).await diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index cf5d86454..9c3b9c034 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -1,4 +1,4 @@ -//! fixture suite (CIP-3141): property tests over the real, committed fixture corpus. +//! fixture suite (CIP-3141): property tests over the real, committed fixture rows. //! //! The fixture table `fixtures.eql_v2_` carries `(plaintext, payload)` rows //! encrypted by cipherstash-client during `test:sqlx:prep`. proptest selects a @@ -8,7 +8,7 @@ //! //! Each test uses `#[sqlx::test]`, so it gets its OWN migrated scratch database //! (the `eql_v3` surface is already installed by the embedded migrations) and -//! loads the fixture corpus into that isolated DB. This is what every other test +//! loads the fixture rows into that isolated DB. This is what every other test //! in the suite does; it avoids the shared-base-DB races that bite under //! nextest's process-per-test parallelism (concurrent `CREATE SCHEMA`, and a //! later test re-`DROP`/`CREATE`-ing a fixture table out from under an earlier @@ -18,21 +18,27 @@ //! Generic over `ScalarType`; instantiated per type at the bottom. use anyhow::{Context, Result}; -use eql_tests::property::{assert_eq_oracle, assert_ord_oracle, Row}; +use eql_tests::property::{ + assert_eq_fn_oracle, assert_eq_oracle, assert_extractor_oracle, assert_ord_fn_oracle, + assert_ord_oracle, Row, +}; use eql_tests::scalar_domains::{ScalarType, Variant}; use proptest::prelude::*; use proptest::test_runner::{Config, TestCaseError, TestRunner}; use sqlx::PgPool; use std::sync::Arc; -/// The fixture corpus SQL for `T`, `include_str!`-embedded into this test binary +/// The fixture SQL for `T`, `include_str!`-embedded into this test binary /// at compile time (one arm per catalog token). Embedding rather than reading /// from disk at runtime is what lets the prebuilt nextest archive carry the -/// corpus into CI shards, which do a fresh checkout where the gitignored +/// fixtures into CI shards, which do a fresh checkout where the gitignored /// `tests/sqlx/fixtures/eql_v2_.sql` files are absent. The path resolves /// against the `eql_tests` crate root (`tests/sqlx`). Mirrors the loud catch-all /// of the `generate_for_token` fixture dispatch. -fn embedded_fixture_sql() -> &'static str { +/// +/// `pub(crate)` so the sibling `match_smoke` module shares the one source of +/// truth for which fixture SQL is embedded. +pub(crate) fn embedded_fixture_sql() -> &'static str { match T::PG_TYPE { "int4" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), @@ -79,15 +85,24 @@ fn embedded_fixture_sql() -> &'static str { } } -/// Load the committed fixture corpus for `T` into this test's isolated scratch -/// DB and read every `(plaintext, payload::text)` row, in id order. The corpus -/// SQL is self-contained (`CREATE SCHEMA IF NOT EXISTS fixtures` / `CREATE` / -/// `INSERT`); since the DB is private to this test there is no concurrency on it. -async fn load_rows(pool: &PgPool) -> Result>>> { +/// Load `T`'s committed fixtures into `pool`'s isolated scratch DB via the +/// `include_str!`-embedded SQL. The fixture SQL is self-contained (`CREATE SCHEMA +/// IF NOT EXISTS fixtures` / `CREATE` / `INSERT`); since each `#[sqlx::test]` DB +/// is private to its test there is no concurrency on it. `pub(crate)` so +/// `match_smoke` (which then fetches specific rows via `fetch_fixture_payload`) +/// shares the one embedded source. +pub(crate) async fn load_fixtures(pool: &PgPool) -> Result<()> { sqlx::raw_sql(embedded_fixture_sql::()) .execute(pool) .await - .with_context(|| format!("loading fixture corpus for {}", T::PG_TYPE))?; + .with_context(|| format!("loading fixtures for {}", T::PG_TYPE))?; + Ok(()) +} + +/// Load the committed fixtures for `T` into this test's isolated scratch +/// DB and read every `(plaintext, payload::text)` row, in id order. +pub(crate) async fn load_rows(pool: &PgPool) -> Result>>> { + load_fixtures::(pool).await?; let sql = format!( "SELECT plaintext, payload::text FROM {} ORDER BY id", T::fixture_table_name() @@ -108,7 +123,7 @@ async fn load_rows(pool: &PgPool) -> Result>>> { Ok(Arc::new(rows)) } -/// Build a corpus by sampling indices (with repeats) into the loaded fixtures. +/// Build a sample by selecting indices (with repeats) into the loaded fixtures. /// `idxs` are already bounded to `0..all.len()` by the proptest strategy. fn pick(all: &[Row], idxs: &[usize]) -> Vec> { idxs.iter().map(|&i| all[i].clone()).collect() @@ -183,7 +198,7 @@ fn config_and_strategy(cases: u32, n: usize) -> (Config, impl Strategy(pool: PgPool, cases: u32) -> Result<()> { let rows = load_rows::(&pool).await?; let (config, strategy) = config_and_strategy(cases, rows.len()); @@ -195,7 +210,7 @@ async fn run_eq_oracle(pool: PgPool, cases: u32) -> Result<()> { .await } -/// Ordering-oracle property over `T`'s fixture corpus (both ordered twins). +/// Ordering-oracle property over `T`'s fixture rows (both ordered twins). async fn run_ord_oracle(pool: PgPool, cases: u32) -> Result<()> { let rows = load_rows::(&pool).await?; let (config, strategy) = config_and_strategy(cases, rows.len()); @@ -203,9 +218,9 @@ async fn run_ord_oracle(pool: PgPool, cases: u32) -> Result<()> { let pool = pool.clone(); let rows = rows.clone(); async move { - let corpus = pick(&rows, &idxs); - assert_ord_oracle::(&pool, Variant::Ord, &corpus).await?; - assert_ord_oracle::(&pool, Variant::OrdOre, &corpus).await + let sample = pick(&rows, &idxs); + assert_ord_oracle::(&pool, Variant::Ord, &sample).await?; + assert_ord_oracle::(&pool, Variant::OrdOre, &sample).await } }) .await @@ -250,3 +265,159 @@ fixture_oracle_suite!(numeric, rust_decimal::Decimal, ordered); fixture_oracle_suite!(text, String, ordered); fixture_oracle_suite!(float4, eql_tests::scalar_domains::F4, ordered); fixture_oracle_suite!(float8, eql_tests::scalar_domains::F8, ordered); + +// --- function-double oracles (CIP-3141) ------------------------------------- +// +// The same fixture rows, but calling the generated `eql_v3.*` comparison +// functions by name across all three overloads and asserting term-extractor +// identity (eq_term==hm / ord_term==ob). Free of fresh encryption — read-only +// SQL over the already-encrypted fixtures. int4 is the reference family with +// explicit tests; the other types go through `fixture_fn_oracle_suite!`. + +/// Function-double property driver: like `run_eq_oracle` / `run_ord_oracle`, but +/// the per-case `body` runs the caller's named-function / extractor oracles +/// against the per-case sample. Shares `load_rows` + `config_and_strategy` + +/// `drive_proptest`, so each fn-oracle test gets the same isolated `#[sqlx::test]` +/// DB and the same synchronous-proptest → async bridge as the operator oracles. +async fn run_fn_property(pool: PgPool, cases: u32, body: F) -> Result<()> +where + T: ScalarType, + F: Fn(PgPool, Vec>) -> Fut, + Fut: std::future::Future>, +{ + let rows = load_rows::(&pool).await?; + let (config, strategy) = config_and_strategy(cases, rows.len()); + drive_proptest(config, strategy, move |idxs| { + let pool = pool.clone(); + let sample = pick(&rows, &idxs); + body(pool, sample) + }) + .await +} + +#[sqlx::test] +async fn prop_int4_eq_fn_oracle_over_fixture(pool: PgPool) -> Result<()> { + run_fn_property::(pool, 32, |pool, sample| async move { + assert_eq_fn_oracle::(&pool, Variant::Eq, &sample).await?; + assert_extractor_oracle::(&pool, Variant::Eq, &sample).await + }) + .await +} + +#[sqlx::test] +async fn prop_int4_ord_fn_oracle_over_fixture(pool: PgPool) -> Result<()> { + run_fn_property::(pool, 32, |pool, sample| async move { + assert_ord_fn_oracle::(&pool, Variant::Ord, &sample).await?; + assert_extractor_oracle::(&pool, Variant::Ord, &sample).await?; + assert_ord_fn_oracle::(&pool, Variant::OrdOre, &sample).await?; + assert_extractor_oracle::(&pool, Variant::OrdOre, &sample).await + }) + .await +} + +/// Function-double counterpart of `fixture_oracle_suite!`: per-family +/// named-function + extractor-identity oracles over the same fixture rows. +/// Parallel (distinct `` from the operator suite) so each family can be +/// added without disturbing the operator arms. `ordered` runs eq on `_eq` plus +/// the four ord functions on both ordered twins; `eq_only` runs eq alone. Each +/// arm is a `#[sqlx::test]` (its own migrated scratch DB), matching the operator +/// suite. +macro_rules! fixture_fn_oracle_suite { + ($modname:ident, $ty:ty, ordered) => { + mod $modname { + use super::*; + #[sqlx::test] + async fn eq_fn_oracle(pool: PgPool) -> Result<()> { + run_fn_property::<$ty, _, _>(pool, 32, |pool, c| async move { + assert_eq_fn_oracle::<$ty>(&pool, Variant::Eq, &c).await?; + assert_extractor_oracle::<$ty>(&pool, Variant::Eq, &c).await + }) + .await + } + #[sqlx::test] + async fn ord_fn_oracle(pool: PgPool) -> Result<()> { + run_fn_property::<$ty, _, _>(pool, 32, |pool, c| async move { + assert_ord_fn_oracle::<$ty>(&pool, Variant::Ord, &c).await?; + assert_extractor_oracle::<$ty>(&pool, Variant::Ord, &c).await?; + assert_ord_fn_oracle::<$ty>(&pool, Variant::OrdOre, &c).await?; + assert_extractor_oracle::<$ty>(&pool, Variant::OrdOre, &c).await + }) + .await + } + } + }; + ($modname:ident, $ty:ty, eq_only) => { + mod $modname { + use super::*; + #[sqlx::test] + async fn eq_fn_oracle(pool: PgPool) -> Result<()> { + run_fn_property::<$ty, _, _>(pool, 32, |pool, c| async move { + assert_eq_fn_oracle::<$ty>(&pool, Variant::Eq, &c).await?; + assert_extractor_oracle::<$ty>(&pool, Variant::Eq, &c).await + }) + .await + } + } + }; +} + +fixture_fn_oracle_suite!(int2_fn, i16, ordered); +fixture_fn_oracle_suite!(int8_fn, i64, ordered); +// date, timestamptz, and numeric are all ordered scalars on the `eql_v3` base, +// so each gets eq/neq functions + eq_term identity plus the four ord functions +// on both ordered twins. The committed fixtures already encrypt the whole +// catalog, so this is full function-level coverage at zero marginal ZeroKMS cost. +fixture_fn_oracle_suite!(date_fn, chrono::NaiveDate, ordered); +fixture_fn_oracle_suite!(timestamptz_fn, chrono::DateTime, ordered); +fixture_fn_oracle_suite!(numeric_fn, rust_decimal::Decimal, ordered); + +// text is bespoke rather than `fixture_fn_oracle_suite!`: its ordered domains +// carry both [Hm, Ore], so they support the FULL six comparisons (eq/neq route +// through `hm`, the four ord ops through ORE) — the generic `ordered` arm only +// runs the four ord ops on the ordered twins. text also declares `_search` +// ([Hm, Ore, Bloom]), which `Variant::Search` reaches but the generic macro +// never instantiates. The committed text fixture is encrypted with +// [Unique, Ore, Match], so its payload carries hm+ob+bf and casts cleanly to +// every text domain. The fixture rows excludes the empty string (issue #262), +// so no generator filtering is needed here. +mod text_fn { + use super::*; + + /// `text_eq` — eq/neq functions + eq_term identity. + #[sqlx::test] + async fn eq_fn_oracle(pool: PgPool) -> Result<()> { + run_fn_property::(pool, 32, |pool, c| async move { + assert_eq_fn_oracle::(&pool, Variant::Eq, &c).await?; + assert_extractor_oracle::(&pool, Variant::Eq, &c).await + }) + .await + } + + /// `text_ord` / `text_ord_ore` — full six comparisons (eq/neq + the four ord + /// ops) plus eq_term(`hm`) + ord_term(`ob`) identity on each ordered twin. + #[sqlx::test] + async fn ord_fn_oracle(pool: PgPool) -> Result<()> { + run_fn_property::(pool, 32, |pool, c| async move { + for variant in [Variant::Ord, Variant::OrdOre] { + assert_eq_fn_oracle::(&pool, variant, &c).await?; + assert_ord_fn_oracle::(&pool, variant, &c).await?; + assert_extractor_oracle::(&pool, variant, &c).await?; + } + Ok(()) + }) + .await + } + + /// `text_search` ([Hm, Ore, Bloom]) — the eq/ord function facets plus + /// eq_term + ord_term identity (the bloom `@>`/`<@` facet is covered by the + /// example-based `match_smoke`, not a random oracle). + #[sqlx::test] + async fn search_fn_oracle(pool: PgPool) -> Result<()> { + run_fn_property::(pool, 32, |pool, c| async move { + assert_eq_fn_oracle::(&pool, Variant::Search, &c).await?; + assert_ord_fn_oracle::(&pool, Variant::Search, &c).await?; + assert_extractor_oracle::(&pool, Variant::Search, &c).await + }) + .await + } +} diff --git a/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs b/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs new file mode 100644 index 000000000..b263fb8e4 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs @@ -0,0 +1,41 @@ +//! fixture-suite (CIP-3141) bloom-filter **match** smoke for the text `_match` +//! domain. +//! +//! Unlike the eq/ord oracles, bloom containment is not a random property: +//! `@>`/`<@` admit false positives and the plaintext oracle is *substring*, not +//! equality. So this is an example-based smoke over three curated fixtures with +//! known n-gram relationships — `"aardvark"` ⊇ `"aard"`, `"zzzz"` disjoint from +//! both — pinned by the `MatchScalar` trait and the +//! `text_match_pivots_are_in_fixture_values` guard. +//! +//! It reads already-encrypted fixture payloads (no `encrypt_store`, no fresh +//! ZeroKMS), so it lives in the `fixture` suite — un-gated, running wherever the +//! fixtures load, exactly like `fixture_oracle.rs`. It is a `#[sqlx::test]` +//! (its own migrated scratch DB), so the fixtures load into an isolated database. +//! The `Variant` enum models no `_match` member, so the domain +//! (`eql_v3.text_match`) is named directly. + +use super::fixture_oracle::load_fixtures; +use anyhow::Result; +use eql_tests::property::assert_match_smoke; +use eql_tests::scalar_domains::{fetch_fixture_payload, MatchScalar}; +use sqlx::PgPool; + +/// `eql_v3.text_match` — the bloom-filter (`bf`) domain (`@>`/`<@`). +const TEXT_MATCH_DOMAIN: &str = "eql_v3.text_match"; + +#[sqlx::test] +async fn text_match_smoke(pool: PgPool) -> Result<()> { + // Match payloads come from the committed text fixture (encrypted with + // [Unique, Ore, Match], so each carries a `bf`); load it into this test's + // isolated DB on demand. + load_fixtures::(&pool).await?; + + let haystack = + fetch_fixture_payload::(&pool, ::haystack()).await?; + let needle = fetch_fixture_payload::(&pool, ::needle()).await?; + let disjoint = + fetch_fixture_payload::(&pool, ::disjoint()).await?; + + assert_match_smoke(&pool, TEXT_MATCH_DOMAIN, &haystack, &needle, &disjoint).await +} diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs index be3f0ad53..e52b891c6 100644 --- a/tests/sqlx/tests/encrypted_domain/property/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -22,8 +22,11 @@ pub(crate) fn migrator() -> sqlx::migrate::Migrator { // NULL / blocker / CHECK-constraint unit tests. mod edge_cases; -// fixture suite: oracle over the committed fixture corpus (real ciphertext). +// fixture suite: operator + function-double oracles over the committed fixture +// rows (real ciphertext), plus term-extractor identity. mod fixture_oracle; +// fixture suite: example-based bloom match smoke over the text `_match` fixtures. +mod match_smoke; // e2e suite: oracle over freshly generated + batch-encrypted values. #[cfg(feature = "proptest-e2e")] mod e2e_oracle; From 10fd7e4a266b6598b4c5a17ef7e3930ab4b82524 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 15:11:09 +1000 Subject: [PATCH 277/599] ci: gate e2e property suite + unconditional source doc validation (CIP-3141) Adds a dedicated test:sqlx:e2e mise task and CI job for the proptest-e2e suite (needs ZeroKMS creds; the credential-free shards run the fixture suite), and runs source doc validation unconditionally. --- .github/workflows/test-eql.yml | 79 ++++++++++++++++++++++++++++++++-- mise.toml | 16 +++++++ tasks/docs/validate/source.sh | 21 +++++++++ 3 files changed, 113 insertions(+), 3 deletions(-) create mode 100755 tasks/docs/validate/source.sh diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 5e6a40c89..4150ba6ef 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -268,9 +268,13 @@ jobs: run: | mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" - - name: Validate SQL documentation (Postgres ${{ matrix.postgres-version }}) + # Source-only doc checks (coverage + required-tags) moved to the + # unconditional `docs-static` job so they run on every PR (incl. docs-only) + # and exactly once, not per-Postgres. This step keeps only the DB-backed + # SQL-syntax validation, which genuinely needs the per-version Postgres. + - name: Validate documented SQL syntax (Postgres ${{ matrix.postgres-version }}) run: | - mise run docs:validate + mise run docs:validate:documented-sql - name: Clean-DB v3 install smoke (Postgres ${{ matrix.postgres-version }}) run: | @@ -460,6 +464,75 @@ jobs: run: | mise run --output prefix test:splinter --postgres ${POSTGRES_VERSION} + # Source-only SQL documentation validation (coverage + required Doxygen tags). + # Deliberately NOT relevance-gated: it runs on EVERY pull_request — including + # docs-only PRs that skip the heavy jobs — so documentation is always + # validated. DB-free and creds-free (the psql-backed syntax check stays in the + # per-version `validate` job). + docs-static: + name: "SQL doc validation" + runs-on: blacksmith-16vcpu-ubuntu-2204 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests + save-if: false + - name: Validate SQL doc coverage + required tags + run: | + mise run docs:validate:source + + # The e2e (fresh-encryption) property suite. Encrypts random values through + # ZeroKMS at run time, so it needs CS_* creds and is PG-version-independent — + # one PG17 run, never the matrix. Compiles the `proptest-e2e`-gated binaries + # (which the default-feature sharded archive excludes) and runs only the + # e2e oracle. Like build-archive, it holds CS_* and so carries the same + # fork-PR guard to keep the secrets off fork runs. + e2e: + name: "e2e property suite (fresh encryption)" + needs: [changes, setup] + if: >- + (github.event_name == 'merge_group' + || github.event_name == 'workflow_dispatch' + || (github.event_name == 'pull_request' && needs.changes.outputs.relevant == 'true')) + && (github.event_name != 'pull_request' + || github.event.pull_request.head.repo.full_name == github.repository) + runs-on: blacksmith-16vcpu-ubuntu-2204 + env: + POSTGRES_VERSION: "17" + CS_CLIENT_ACCESS_KEY: ${{ secrets.CS_CLIENT_ACCESS_KEY }} + CS_WORKSPACE_CRN: ${{ secrets.CS_WORKSPACE_CRN }} + CS_CLIENT_ID: ${{ secrets.CS_CLIENT_ID }} + CS_CLIENT_KEY: ${{ secrets.CS_CLIENT_KEY }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4 + with: + version: 2026.4.0 + install: true + cache: true + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + workspaces: . + shared-key: sqlx-tests + save-if: false + - name: Setup database (Postgres 17) + run: | + mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" + - name: Run e2e property suite + run: | + mise run test:sqlx:e2e + # The ONE required status check. Stable name on every event, so branch # protection never references an event-dependent leaf name (which would # deadlock). Passes iff every needed job is success or skipped. Treating @@ -469,7 +542,7 @@ jobs: ci-required: name: "ci-required" needs: [changes, setup, build-archive, test, validate, schema, rust-crates, - codegen, self-contained-v3, matrix-coverage, splinter] + codegen, self-contained-v3, matrix-coverage, splinter, docs-static, e2e] if: always() runs-on: blacksmith-16vcpu-ubuntu-2204 steps: diff --git a/mise.toml b/mise.toml index e046912e2..3b5600c02 100644 --- a/mise.toml +++ b/mise.toml @@ -89,6 +89,22 @@ echo "Running Rust tests..." cargo test --features proptest-e2e """ +[tasks."test:sqlx:e2e"] +description = "Run ONLY the e2e (fresh-encryption) property suite — needs ZeroKMS creds" +# Prep builds + migrates + regenerates fixtures (the latter needs CS_* creds, +# which the dedicated CI `e2e` job supplies). The e2e suite is the only one that +# encrypts fresh values through ZeroKMS at run time, so it cannot run from the +# credential-free sharded archive; it gets its own job. The fixture suite (which +# DOES run in the shards) is intentionally excluded here via the `e2e_oracle` +# filter so this job does not duplicate sharded work — it only compiles the +# `proptest-e2e`-gated binaries and runs the fresh-encryption oracle. +depends = ["test:sqlx:prep"] +dir = "{{config_root}}/tests/sqlx" +run = """ +echo "Running e2e property suite (fresh ZeroKMS encryption)..." +cargo test --features proptest-e2e e2e_oracle +""" + [tasks."test:sqlx:watch"] description = "Run SQLx tests in watch mode (rebuild EQL on changes)" # Same prep as test:sqlx so watch mode starts from a migrated DB + fresh diff --git a/tasks/docs/validate/source.sh b/tasks/docs/validate/source.sh new file mode 100755 index 000000000..5829a7f60 --- /dev/null +++ b/tasks/docs/validate/source.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +#MISE description="Source-only SQL doc validation (coverage + required tags, no DB)" +# Build first so generated encrypted-domain SQL exists under src/. +#MISE depends=["build"] +# +# This is the DB-free subset of `docs:validate`: coverage + required-tags read +# the `--!` doxygen comments out of src/**/*.sql and need no Postgres. It exists +# so CI can validate documentation on EVERY PR (including docs-only PRs that skip +# the heavy, relevance-gated jobs) without standing up a database. The +# `documented-sql` syntax check (which needs psql) stays in the per-Postgres +# `validate` job. + +set -e + +echo +echo "Checking documentation coverage..." +mise run --output prefix docs:validate:coverage + +echo +echo "Validating required tags..." +mise run --output prefix docs:validate:required-tags From fa1bef78b0fad68bd1d6f013f0b445c814ecf761 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 15:11:09 +1000 Subject: [PATCH 278/599] docs: property-test suite docs + changelog (CIP-3141) Documents the three property-test suites (catalog / fixture / e2e) over the committed curated fixtures, the function-double oracles, and term-extractor identity. CHANGELOG entry under [Unreleased]. --- .github/workflows/README.md | 165 ++++++++++++++---- CHANGELOG.md | 2 +- tests/sqlx/README.md | 8 +- .../tests/encrypted_domain/property/README.md | 80 ++++++--- 4 files changed, 199 insertions(+), 56 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 84feae3c6..95e287266 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -1,11 +1,41 @@ -# CI: `test-eql.yml` +# CI workflows + +This directory holds every GitHub Actions workflow for EQL. This README is the +authoritative **inventory** (what workflows exist and when they fire) and +**coverage map** (which job runs which checks, and where each test suite +actually runs). + +- [Workflow inventory](#workflow-inventory) +- [`test-eql.yml` — the merge gate](#test-eqlyml--the-merge-gate) +- [Coverage map: job → task → what it checks](#coverage-map-job--task--what-it-checks) +- [Where each test suite runs](#where-each-test-suite-runs) +- [Known gaps](#known-gaps) + +--- + +## Workflow inventory + +| Workflow | Triggers | What it does | Gates merge? | +|---|---|---|---| +| **test-eql.yml** | `pull_request`, `merge_group`, `workflow_dispatch` | Full test/lint/validate matrix; the one required check | **Yes** — `ci-required` | +| **release-eql.yml** | `release: published`, `pull_request` (paths), `workflow_dispatch` | Build release SQL + docs; PR runs everything **but** the publish step | No | +| **release-postgres-eql-image.yml** | `release: published`, `workflow_dispatch` | Build & push the Postgres+EQL Docker image to GHCR | No | +| **bench-eql.yml** | `push: main` (paths), `schedule` 02:00 UTC daily, `workflow_dispatch` | `test:bench` (bench cargo feature). **Never runs on PRs** | No | +| **macro-expand-eql.yml** | `schedule` 03:00 UTC daily, `workflow_dispatch` | Regenerate the int4 `cargo expand` matrix snapshot; needs pinned nightly | **No — explicitly non-blocking** | +| **rebuild-docs.yml** | `push: tags` | Fire a docs-site rebuild webhook | N/A | + +Only **test-eql.yml** gates merges. Bench regressions and stale `cargo expand` +snapshots surface on the nightly schedule, not on the PR that caused them. + +--- + +## `test-eql.yml` — the merge gate Fast PR feedback + a thorough pre-merge gate, using a merge queue and a single aggregated required check. -## Two run shapes +### Two run shapes -`test-eql.yml` triggers on `pull_request`, `merge_group`, and `workflow_dispatch`. `setup` derives the matrix from the event: | Event | Trigger | Matrix | Purpose | @@ -16,47 +46,120 @@ aggregated required check. The PR run is feedback only. The merge-queue run is the gate. -## Relevance skip applies to PRs only +> **No `push` trigger.** Under a required merge queue, push-to-main validation is +> redundant — the queue already validated the exact merge commit, and branch +> protection blocks direct pushes. + +### Relevance skip applies to PRs only -Each job runs when: +Each heavy job runs when: `merge_group || workflow_dispatch || (pull_request && relevant == 'true')`. -So the `changes` relevance filter (`relevant:` paths) **only gates the -`pull_request` event** — a docs-only PR skips the heavy jobs on its PR run. On -`merge_group` (and `workflow_dispatch`) every job runs **unconditionally**: a -queued PR always pays the full gate regardless of which files it touched. +So the `changes` relevance filter only gates the **`pull_request`** event — a +docs-only PR skips the heavy jobs on its PR run. On `merge_group` (and +`workflow_dispatch`) every job runs **unconditionally**: a queued PR always pays +the full gate regardless of which files it touched. -## How the queue works +The relevance filter (`changes` job) marks a PR relevant when any of these +changed: `.github/workflows/test-eql.yml`, `src/**`, `sql/**`, `tests/**`, +`tasks/**`, `crates/**`, `Cargo.toml`, `Cargo.lock`, `mise.toml`. Note `docs/**` +is **not** in the filter — see [Known gaps](#known-gaps). + +### How the queue works 1. Click **Merge when ready** — the PR is queued, not merged. 2. GitHub builds a temporary branch = `main` + this PR (+ any PRs ahead in the - queue) and fires `merge_group`, so CI tests the **post-merge state**, not the - stale PR branch. + queue) and fires `merge_group`, so CI tests the **post-merge state**. 3. The full PG14–17 × 2 matrix (plus the single-run jobs) runs and feeds `ci-required`. -4. `ci-required` green → the PR is **merged into `main` using the queue's - configured merge method**. Red → the PR is **removed from the queue**; `main` - is untouched. +4. `ci-required` green → PR is **merged**. Red → PR is **removed from the + queue**; `main` is untouched. This catches semantic conflicts — two PRs that each pass alone but break together — which PR-only checks never test. -## The `ci-required` aggregator +### The `ci-required` aggregator -Per-event matrices make leaf job names unstable (a `test` job is displayed as -`Shard PG17 1/4`, but the queue produces `Shard PG14 1/2` … `Shard PG17 2/2`), -so leaf names can't be named as required checks. Instead, one aggregator job -(id and display name `ci-required`) `needs:` every job, runs with -`if: always()`, and passes only if each needed result is `success` **or** -`skipped`. Mark **only `ci-required`** as the required status check. +Per-event matrices make leaf job names unstable (`Shard PG17 1/4` on a PR vs. +`Shard PG14 1/2` in the queue), so leaf names can't be named as required checks. +Instead, one aggregator job (id and display name `ci-required`) `needs:` every +job, runs with `if: always()`, and passes only if each needed result is +`success` **or** `skipped`. Mark **only `ci-required`** as the required status +check. - `if: always()` — runs even when dependencies fail/skip, so the check always reports (a never-reported required check leaves the queue stuck *Pending*). - `skipped` counts as pass — a docs-only PR skips the heavy jobs on its PR run but must still report Success so the PR stays eligible to queue. -This is the well-known "aggregate / final gate job" pattern for matrix + -merge-queue workflows. +--- + +## Coverage map: job → task → what it checks + +All jobs run on `blacksmith-16vcpu-ubuntu-2204`. "PG set" follows the event +(PG17 on PR / dispatch, PG14–17 in the queue). + +| Job | mise task(s) | Checks | DB | `CS_*` creds | +|---|---|---|---|---| +| **changes** | — | compute relevance | no | no | +| **setup** | — | compute PG × shard matrix | no | no | +| **build-archive** | `test:sqlx:archive` | Build EQL, run prep, **generate fixtures**, compile every `tests/sqlx` binary (**default features**) into a nextest archive; upload archive + `release/*.sql` | yes (PG17) | **yes (sole holder)** | +| **test** (sharded) | `test:sqlx:partition` | Run the archived sqlx binaries (default features), hash-partitioned across shards | yes (per PG) | no (replays archive) | +| **e2e** | `test:sqlx:e2e` | The `proptest-e2e` fresh-encryption property suite (`e2e_oracle`) — PG17 only, version-independent | yes (PG17) | **yes** | +| **validate** (per PG) | `docs:validate:documented-sql` + `test:clean_install_v3` | DB-backed SQL doc-syntax check; clean-DB `eql_v3` install smoke | yes | no | +| **docs-static** | `docs:validate:source` | SQL doxygen coverage + required-tags (DB-free); **unconditional — runs on every PR incl. docs-only** | no | no | +| **schema** | `test:schema` | v2.2 / v2.3 payload JSON-schema validation | no | no | +| **rust-crates** | `test:crates` + `types:check` | `cargo fmt --check`, clippy + `cargo test` for `eql-scalars` / `eql-codegen` / `eql-tests-macros` / `eql-types`; verify TS bindings + JSON schemas are fresh | no | no | +| **codegen** | `codegen:parity` | Generated encrypted-domain SQL matches the golden output | no | no | +| **self-contained-v3** | `test:self_contained_v3` | `eql_v3` surface has no `eql_v2` dependency | no | no | +| **matrix-coverage** | `test:matrix:inventory` (+`:jsonb_entry`, `:v3-jsonb`) + `test:matrix:catalog-coverage` | Scalar-matrix test-name snapshots are not silently dropped; catalog surface is covered | no | no | +| **splinter** | `test:splinter` | Supabase/Splinter lints over the installed EQL | yes (PG17) | no | +| **ci-required** | — | aggregator: every needed job is `success`/`skipped` | no | no | + +--- + +## Where each test suite runs + +The `eql_v3` property-test suites (see +`tests/sqlx/tests/encrypted_domain/property/README.md`) land in three different +CI jobs: + +| Suite | Job | Trigger coverage | DB | `CS_*` | Notes | +|---|---|---|---|---|---| +| **catalog** (`eql-scalars` `proptest_invariants`) | **rust-crates** (`cargo test -p eql-scalars`; proptest is a dev-dep) | relevant PR + queue | no | no | pure-Rust catalog invariants; shrinking enabled | +| **fixture** (function-double oracles, extractor identity, `match_smoke`, `edge_cases`) | **test** shards (default features) | relevant PR (PG17×4) + queue (PG14–17×2) | yes | no | oracle over the **committed** real-ciphertext fixtures | +| **e2e** (`e2e_oracle`, `#[cfg(feature = "proptest-e2e")]`) | **e2e** job (`test:sqlx:e2e`) | relevant PR (PG17) + queue (PG17) | yes | yes | oracle over **fresh** ZeroKMS encryption; PG-version-independent, so one PG17 run | + +The wider sqlx suite (everything under `tests/sqlx/tests/`) runs in the **test** +shards, which replay the default-feature archive — so any +`#[cfg(feature = …)]`-gated test that isn't in the default feature set does not +run there. The `proptest-e2e` suite is the one such gate, and it has its own +**e2e** job (it can't reuse the credential-free archive: it both compiles with a +non-default feature and needs `CS_*` at run time). + +--- + +## Known gaps + +1. **bench + macro-expand are nightly / non-blocking** — a bench regression or a + stale `cargo expand` snapshot surfaces on the daily schedule, not on the PR + that introduced it. Accepted trade-off. + +2. **`docs/**` markdown is not content-validated.** The `docs-static` job + guarantees the SQL `--!` doxygen comments under `src/**` are always checked, + but nothing lints the prose/links in `docs/**` itself. A docs-only PR now runs + `docs-static` (so it is no longer un-gated), but that job validates *source* + documentation, not the markdown the PR changed. Adding a markdown + linter/link-checker is a separate, unfilled capability. + +### Recently closed + +- *The e2e (fresh-encryption) suite never ran in CI.* Now covered by the **e2e** + job (`test:sqlx:e2e`), PG17, on relevant PRs + the queue. +- *Docs-only PRs ran no doc validation.* The **docs-static** job now runs the + source-only doc checks unconditionally on every PR. + +--- ## Operator setup (one-time, GitHub UI) @@ -68,13 +171,13 @@ Settings → Branches → rule for `main`: Then verify (see `docs/plans/2026-06-09-ci-pr-feedback-sharding-rollout.md`): -- **Queue a relevant PR** → `merge_group` runs the full gate — 8 `Shard …` jobs - + 4 `Validate …` jobs + `build-archive`, `schema`, `rust-crates`, `codegen`, - `self-contained-v3`, `matrix-coverage`, `splinter` — all green → `ci-required` - green → PR merges. -- **Open a docs-only PR** → on its `pull_request` run the heavy jobs skip and - `ci-required` reports **Success** (not stuck *Pending*), so the PR can be - queued. +- **Queue a relevant PR** → `merge_group` runs the full gate (8 `Shard …` jobs + + 4 `Validate …` jobs + `build-archive`, `e2e`, `docs-static`, `schema`, + `rust-crates`, `codegen`, `self-contained-v3`, `matrix-coverage`, `splinter`) → + `ci-required` green → PR merges. +- **Open a docs-only PR** → on its `pull_request` run the relevance-gated heavy + jobs skip, but `docs-static` still runs; `ci-required` reports **Success** (not + stuck *Pending*), so the PR can be queued. ## References diff --git a/CHANGELOG.md b/CHANGELOG.md index 56cb547ab..598040d6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) -- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that samples the committed fixture corpus (real ciphertext) and checks all ordered pairs in each sampled corpus, and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) oracles plus NULL/blocker/CHECK edge cases. Why: the prior matrix exercised fixed pivots only; property tests catch operator/oracle disagreements across the whole value space. ([#275](https://github.com/cipherstash/encrypt-query-language/pull/275)) +- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`int2`/`int4`/`int8`/`date`/`timestamptz`/`numeric`/`text`). The e2e suite — which appends fresh duplicate plaintexts each run — is the one that exercises equality across two independent encryptions of one value. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index 6cb403502..346a7dd57 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -277,8 +277,10 @@ Tests connect to PostgreSQL database configured by SQLx: - ✅ ~~Convert remaining SQL tests~~ **COMPLETE!** - Property-based tests: implemented in `tests/encrypted_domain/property/` and `crates/eql-scalars/src/proptest_invariants.rs` (CIP-3141). One unit-level - **catalog** suite (no DB) plus two integration suites — **fixture** (oracle - over the committed fixture corpus) and **e2e** (oracle over fresh end-to-end - encryption, `--features proptest-e2e`). + **catalog** suite (no DB) plus two integration suites — **fixture** (operator + + function-double oracles, term-extractor identity, and bloom match smoke over the + committed real-ciphertext fixtures) and **e2e** (oracle over fresh end-to-end + encryption each run, `--features proptest-e2e`). See + `tests/encrypted_domain/property/README.md` for the full structure. - Performance benchmarks: Measure query performance with encrypted data - Integration tests: Test with CipherStash Proxy diff --git a/tests/sqlx/tests/encrypted_domain/property/README.md b/tests/sqlx/tests/encrypted_domain/property/README.md index 01a5ff2ac..bed3ae047 100644 --- a/tests/sqlx/tests/encrypted_domain/property/README.md +++ b/tests/sqlx/tests/encrypted_domain/property/README.md @@ -14,13 +14,19 @@ named for what they operate on, not by an abstract tier letter: | Suite | Location | Kind | Inputs | DB / creds | |-------|----------|------|--------|------------| | **catalog** | [`crates/eql-scalars/src/proptest_invariants.rs`](../../../../../crates/eql-scalars/src/proptest_invariants.rs) | unit (pure Rust) | generated terms / kinds | none — runs in fork CI | -| **fixture** | [`fixture_oracle.rs`](./fixture_oracle.rs) | integration | committed fixture corpus (real ciphertext) | shared test DB | +| **fixture** | [`fixture_oracle.rs`](./fixture_oracle.rs) | integration | committed fixture rows (real ciphertext) | isolated per-test DB (`#[sqlx::test]`) | | **e2e** | [`e2e_oracle.rs`](./e2e_oracle.rs) | integration | freshly generated plaintexts, encrypted each run | shared test DB **+ ZeroKMS creds** | +The `fixture` suite spans two files: [`fixture_oracle.rs`](./fixture_oracle.rs) +(the operator **and** function-double oracles + term-extractor identity) and +[`match_smoke.rs`](./match_smoke.rs) (example-based bloom containment for the text +`_match` domain). Both are un-gated — they read the already-encrypted fixtures, +no fresh ZeroKMS. + Plus [`edge_cases.rs`](./edge_cases.rs): example-based unit tests for NULL propagation, blockers raising on unsupported operators (including the -native-`jsonb` `->`/`@>` domain-fallback paths), `timestamptz` ordering -deferral, and CHECK rejection of malformed payloads. +native-`jsonb` `->`/`@>` domain-fallback paths) and CHECK rejection of malformed +payloads. ### catalog — catalog invariants, no database @@ -32,33 +38,49 @@ only suite where `proptest` shrinking is meaningful and enabled. ### fixture — oracle over committed ciphertext -Runs the shared all-pairs oracle engine over the real, committed fixture corpus +Runs the shared all-pairs oracle engine over the real, committed fixture rows (`fixtures.eql_v2_.sql`, generated by `cipherstash-client` during -`mise run test:sqlx:prep`). `proptest` selects a sub-multiset of fixture rows +`mise run test:sqlx:prep`). The fixtures are the curated catalog values for each +type (`Min`/`Max`/`Zero`/pivots). `proptest` selects a sub-multiset of those rows (with repeats), and the engine checks **every ordered pair**. No new encryption, so it runs whenever the fixtures are present, and it generalises across the whole catalog for free (every fixtured type gets an `eq_oracle`, ordered types also get an `ord_oracle`). +On top of the operator oracles, the fixture suite runs the **function-double +oracles**: it calls the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` +**functions** by name across all three [`Overload`s][overload] +(domain–domain, domain–jsonb, jsonb–domain) and asserts **term-extractor +identity** — `eql_v3.eq_term` returns the payload's exact `hm`, `eql_v3.ord_term` +returns its exact `ob`. [`match_smoke.rs`](./match_smoke.rs) adds the +example-based bloom containment (`@>`/`<@`) for the text `_match` domain. + +[overload]: ../../../src/property.rs + ### e2e — oracle over fresh end-to-end encryption Same oracle engine, but each case **generates fresh random plaintexts and encrypts them end-to-end through ZeroKMS** (one batched call per case) before querying. Gated behind the `proptest-e2e` cargo feature — `mise run test:sqlx` -enables it (CI has the secrets); a bare `cargo test` compiles it out. It is the -**only** suite that can exercise "same plaintext, *different* ciphertext" -(equality across independently-encrypted values), because the committed fixture -corpus has no duplicate plaintexts. Covers every ordered scalar -(int2/int4/int8/date/timestamptz/numeric/text) via the +enables it (CI has the secrets); a bare `cargo test` compiles it out. Covers +every ordered scalar (int2/int4/int8/date/timestamptz/numeric/text) via the `ScalarType::arbitrary_value()` strategy seam — integers draw the full `any::()` range, non-integer scalars sample their cast-valid fixture set (their plaintexts have no usable bounded `Arbitrary`). `bool` is storage-only (no ordered domain) and is the only scalar excluded. +Defence in depth over the fixture suite: the fixtures are encrypted once at +`test:sqlx:prep`, so they pin behaviour against a *frozen* ciphertext snapshot; +the e2e suite re-encrypts on **every run**, so it catches a live crypto-path +regression (a `cipherstash-client` / ZeroKMS change) that leaves the committed +fixtures untouched. The e2e suite is also the one that exercises "same plaintext, +*different* ciphertext" (equality across independently-encrypted values), via the +fresh duplicate plaintexts it appends each run. + ## The shared oracle engine `assert_eq_oracle` / `assert_ord_oracle` in -[`../../../src/property.rs`](../../../src/property.rs) take a corpus of +[`../../../src/property.rs`](../../../src/property.rs) take a set of `(plaintext, payload_json)` rows and check, over every ordered pair, that: - `=` / `<>` on the `_eq` domain agree with plaintext `==` / `!=`, and @@ -68,6 +90,13 @@ corpus has no duplicate plaintexts. Covers every ordered scalar The fixture and e2e suites differ only in **where the rows come from**; the engine is identical. +The same file also holds the **function-double** helpers the fixture suite layers +on: `assert_eq_fn_oracle` / `assert_ord_fn_oracle` (the named `eql_v3.*` +functions across every [`Overload`][overload]), `assert_extractor_oracle` +(`eq_term`==`hm` / `ord_term`==`ob` identity), and `assert_match_smoke` (bloom +containment). They take the same `Row` set, so they ride the fixtures at +zero marginal ZeroKMS cost. + ## Why ciphertext can't be `Arbitrary`-derived A valid payload's `hm`/`ob` terms are real ciphertext from `cipherstash-client` @@ -88,15 +117,23 @@ encryption to reach inputs the fixtures can't. - **The e2e suite disables shrinking and failure persistence.** Every shrink attempt would burn another ZeroKMS batch, ciphertext can't be meaningfully shrunk, and fresh-each-run ciphertext can't be replayed. -- **proptest + async bridge.** The `proptest!` body is sync; the DB-backed suites - run their async oracle on a per-case current-thread `tokio` runtime and connect - via `connect_pool()` (they cannot use `#[sqlx::test]`'s injected pool from a - sync body). Operator evaluation is read-only `SELECT`, so no per-test schema - isolation is needed. -- **Equality-true must actually fire.** Random integer pairs almost never - collide, so the e2e corpus injects deliberate duplicate plaintexts (plus signed - extremes and zero) to exercise the `a == b ⇒ eq` branch across distinct - ciphertexts. +- **proptest + async bridge.** proptest's case loop is synchronous and can't + `.await`. The **fixture** suite (including the function-double oracles) runs + under `#[sqlx::test]`, so each test gets its own migrated scratch DB; + `drive_proptest` runs the proptest runner on a dedicated OS thread and ships + each generated case to the test's async runtime — where the injected pool + lives — over a channel, so the pool never crosses runtimes and shrinking is + preserved. The **e2e** suite instead connects via `connect_pool()` to the + shared base DB and drives proptest on a current-thread runtime (it + batch-encrypts via ZeroKMS and is feature-gated, so a long-lived shared pool is + fine). [`match_smoke.rs`](./match_smoke.rs) is a plain `#[sqlx::test]` (not + proptest-driven), loading the fixtures into its own isolated DB. +- **Equality-true must actually fire.** Random distinct plaintexts almost never + collide, so the e2e suite injects deliberate duplicate plaintexts (plus signed + extremes and zero) each run to exercise the `a == b ⇒ eq` branch across + *distinct* ciphertexts. The fixture suite's curated rows have unique plaintexts, + so it exercises the equality-true branch on self-pairs (same ciphertext); the + cross-ciphertext case is the e2e suite's job. ## Running @@ -106,7 +143,8 @@ cargo test -p eql-scalars proptest_invariants # fixture + edge-case suites (needs a prepared DB) mise run test:sqlx:prep -cd tests/sqlx && cargo test --test encrypted_domain property::fixture_oracle property::edge_cases +cd tests/sqlx && cargo test --test encrypted_domain \ + property::fixture_oracle property::match_smoke property::edge_cases # all suites incl. e2e (needs DB + CS_* creds) mise run test:sqlx # enables --features proptest-e2e From 347fd3699571f09c053ec5fea1858242eae1cb71 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 23:36:43 +1000 Subject: [PATCH 279/599] fix(test): extract ob ORE term as array in float cross-width e2e oracle (CIP-3141) The float4/float8 shared-index-term e2e test pulled both `hm` and `ob` via `as_str()`, but the ORE `ob` term is a JSON array of block strings, not a scalar string (only `hm` is a string). `as_str()` returned None on the array, raising "payload missing string `ob`". Split the helper: `hm` stays a string, `ob` extracts the array and compares directly, matching the canonical extractor in property.rs. Latent until the gated e2e suite started running in CI. --- .../encrypted_domain/property/e2e_oracle.rs | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index a93c03856..eeefacf9d 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -241,25 +241,33 @@ fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { encrypt_store("xwidth_f8", "payload", &[F8(x as f64)], &cfg).await })?; - // Pull a string index term from the EQL payload JSON (`hm` / `ob`). - let term = |p: &serde_json::Value, key: &str| -> Result { - p.get(key) + // Pull the scalar `hm` index term (a JSON string) from the EQL payload. + let hm = |p: &serde_json::Value| -> Result { + p.get("hm") .and_then(serde_json::Value::as_str) .map(str::to_string) - .ok_or_else(|| anyhow::anyhow!("payload missing string `{key}`: {p}")) + .ok_or_else(|| anyhow::anyhow!("payload missing string `hm`: {p}")) + }; + // Pull the `ob` ORE term. Unlike `hm`, `ob` is a JSON array of block + // strings, so compare the arrays directly rather than coercing to a string. + let ob = |p: &serde_json::Value| -> Result { + p.get("ob") + .filter(|v| v.is_array()) + .cloned() + .ok_or_else(|| anyhow::anyhow!("payload missing array `ob`: {p}")) }; // HMAC equality term: identical plaintext + key => identical hm, so the two // widths are equality-interchangeable at the term level. assert_eq!( - term(&f4_payloads[0], "hm")?, - term(&f8_payloads[0], "hm")?, + hm(&f4_payloads[0])?, + hm(&f8_payloads[0])?, "float4 and float8 of the same value must share the hm equality term" ); // ORE term: same f64 input => same ORE ciphertext, so ordering is identical. assert_eq!( - term(&f4_payloads[0], "ob")?, - term(&f8_payloads[0], "ob")?, + ob(&f4_payloads[0])?, + ob(&f8_payloads[0])?, "float4 and float8 of the same value must share the ob ORE term" ); Ok(()) From 3512cab21d61569f9155590f608dbac5953d287c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 00:55:46 +1000 Subject: [PATCH 280/599] fix(test): compare cross-width float ORE terms via the SQL ORE operator (CIP-3141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `float4_and_float8_share_index_terms_for_the_same_value` asserted byte-equality of the raw `ob` ORE arrays of two independently-encrypted payloads. That can never hold: a BlockORE term is `Left (deterministic) ++ Right (16-byte random per-ciphertext nonce + nonce-masked truth tables)`, so two encodings of the SAME value — same width, same cast — are byte-UNEQUAL by construction. Ordering is decided by the ORE compare function, not raw bytes. (The cast is irrelevant: `real`/`double` collapse to one f64 `ColumnType::Float` in cipherstash-client; the deterministic Left halves are byte-identical, which is what proves the two widths share an encoding.) The bug stayed latent because the e2e suite is feature/creds-gated and, when it did run, an earlier `ob`-as-string extraction errored out before the assertion; fixing that extraction (fe52d428) unmasked the wrong assertion. Compare the extracted `ord_term`s through the SQL `eql_v3.ore_block_256` `=` operator (the only correct ORE check) and keep the deterministic `hm` equality term as a direct byte comparison. Also correct the CHANGELOG claim of a "byte-identical ORE term" to "equal under the ORE comparator". Verified: the test now passes against fresh ZeroKMS encryption. --- CHANGELOG.md | 2 +- .../encrypted_domain/property/e2e_oracle.rs | 63 ++++++++++++------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 598040d6e..7d04e1cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) -- **`eql_v3.float4` / `eql_v3.float8` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.float4` / `eql_v3.float8` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `float4` / `float8` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `float4` vs `float8` is purely a Postgres-surface distinction and the ciphertext / ORE term are byte-identical. Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `int8`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299)) +- **`eql_v3.float4` / `eql_v3.float8` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.float4` / `eql_v3.float8` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `float4` / `float8` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `float4` vs `float8` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `int8`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299)) ### Changed diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index eeefacf9d..cad7694f7 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -209,10 +209,19 @@ e2e_oracle_suite!( /// Both float widths encrypt through the SINGLE f64 crypto path /// (`F4::to_plaintext` widens `self.0 as f64`; `F8::to_plaintext` is the -/// identity), so an f32 value and its exact f64 widening MUST produce identical -/// index terms — this is the byte-identity the CHANGELOG claims. Encrypt the -/// same value both ways (an f32-exact value, so `x as f64` is lossless) and -/// assert the `hm` (HMAC equality) and `ob` (ORE) terms match across widths. +/// identity), so an f32 value and its exact f64 widening are the SAME real +/// number and are equality- and order-interchangeable across widths. The two +/// index terms behave differently and so are checked differently: +/// +/// - `hm` (HMAC equality) is a **deterministic** keyed hash of the value, so the +/// two widths produce a **byte-identical** `hm` — assert that directly. +/// - `ob` (ORE ordering) is **probabilistic**: each encryption draws a fresh +/// per-ciphertext nonce (the random Right half of the BlockORE term), so two +/// encodings of one value are byte-UNEQUAL *by construction* — even same-width, +/// same-value. Ordering is decided by the ORE compare function, never by raw +/// bytes, so the ONLY correct cross-width ORE check is the SQL +/// `eql_v3.ore_block_256` `=` operator over the extracted `ord_term`s. +/// /// Creds/e2e-gated like the rest of this file. #[test] fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { @@ -222,8 +231,8 @@ fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { .enable_all() .build()?; - // f32-exact value: `x as f64` is the same real number, so any term - // difference would be a width artifact, which is exactly what we forbid. + // f32-exact value: `x as f64` is the same real number, so both widths encode + // the identical f64 — any *value* difference would be a width artifact. let x: f32 = 2.25; let f4_payloads = rt.block_on(async { @@ -241,34 +250,42 @@ fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { encrypt_store("xwidth_f8", "payload", &[F8(x as f64)], &cfg).await })?; - // Pull the scalar `hm` index term (a JSON string) from the EQL payload. + // `hm` (deterministic HMAC) is byte-identical across widths — compare directly. let hm = |p: &serde_json::Value| -> Result { p.get("hm") .and_then(serde_json::Value::as_str) .map(str::to_string) .ok_or_else(|| anyhow::anyhow!("payload missing string `hm`: {p}")) }; - // Pull the `ob` ORE term. Unlike `hm`, `ob` is a JSON array of block - // strings, so compare the arrays directly rather than coercing to a string. - let ob = |p: &serde_json::Value| -> Result { - p.get("ob") - .filter(|v| v.is_array()) - .cloned() - .ok_or_else(|| anyhow::anyhow!("payload missing array `ob`: {p}")) - }; - - // HMAC equality term: identical plaintext + key => identical hm, so the two - // widths are equality-interchangeable at the term level. assert_eq!( hm(&f4_payloads[0])?, hm(&f8_payloads[0])?, "float4 and float8 of the same value must share the hm equality term" ); - // ORE term: same f64 input => same ORE ciphertext, so ordering is identical. - assert_eq!( - ob(&f4_payloads[0])?, - ob(&f8_payloads[0])?, - "float4 and float8 of the same value must share the ob ORE term" + + // `ob` (probabilistic ORE) is NOT byte-comparable — the only correct check is + // the SQL ORE operator over the extracted `ord_term`s. Cast each payload to + // its width's `_ord_ore` domain, extract the `eql_v3.ore_block_256` term, and + // compare with `=` (eql_v3.ore_block_256_eq => compare_ore_block_256_terms = 0). + let pool: PgPool = rt.block_on(connect_pool())?; + rt.block_on(ensure_eql_installed(&pool, &super::migrator()))?; + + let ord_term = |p: &serde_json::Value, domain: &str| -> String { + let lit = p.to_string().replace('\'', "''"); + format!("eql_v3.ord_term('{lit}'::jsonb::{domain})") + }; + let sql = format!( + "SELECT {} = {}", + ord_term(&f4_payloads[0], "eql_v3.float4_ord_ore"), + ord_term(&f8_payloads[0], "eql_v3.float8_ord_ore"), + ); + let ore_equal: Option = rt + .block_on(sqlx::query_scalar(&sql).fetch_one(&pool)) + .map_err(|e| anyhow::anyhow!("cross-width ORE compare query ({sql}): {e}"))?; + anyhow::ensure!( + ore_equal == Some(true), + "float4 and float8 of the same value must compare equal under the SQL ORE \ + operator (eql_v3.ore_block_256 `=`); got {ore_equal:?}" ); Ok(()) } From 579f6cd06194d325123e91326f529ff02f1f4836 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 00:04:47 +1000 Subject: [PATCH 281/599] test(v3): cover eql_v3.contains/contained_by by name, mixed overloads, and STRICT NULL (G3 4a) --- .../tests/encrypted_domain/text/text_match.rs | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index d903da78f..caa66e23e 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -203,3 +203,107 @@ async fn contains_and_contained_by_are_commutative(pool: PgPool) -> anyhow::Resu ); Ok(()) } + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn direct_contains_function_matches_operator(pool: PgPool) -> anyhow::Result<()> { + // Exercises `eql_v3.contains(a, b)` by NAME (not the `@>` operator), and pins + // that the function and the operator it backs agree. `aardvark` contains the + // substring needle `aard` (shared ngrams); the disjoint `zzzz` does not. + let hay = payload_for(&pool, "aardvark").await?; + let aard = payload_for(&pool, "aard").await?; + let zzzz = payload_for(&pool, "zzzz").await?; + + let (fn_hit, op_hit, fn_miss): (bool, bool, bool) = sqlx::query_as( + "SELECT eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match), + ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match), + eql_v3.contains($1::jsonb::eql_v3.text_match, $3::jsonb::eql_v3.text_match)", + ) + .bind(&hay) + .bind(&aard) + .bind(&zzzz) + .fetch_one(&pool) + .await?; + + assert!(fn_hit, "eql_v3.contains('aardvark','aard') must be true"); + assert_eq!(fn_hit, op_hit, "eql_v3.contains must agree with the @> operator"); + assert!(!fn_miss, "eql_v3.contains('aardvark','zzzz') must be false (disjoint ngrams)"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn direct_contained_by_function_matches_operator(pool: PgPool) -> anyhow::Result<()> { + // Exercises `eql_v3.contained_by(a, b)` by NAME (not the `<@` operator). `aard` + // is contained by `aardvark`; `zzzz` is not contained by `aard` (disjoint ngrams). + let aard = payload_for(&pool, "aard").await?; + let hay = payload_for(&pool, "aardvark").await?; + let zzzz = payload_for(&pool, "zzzz").await?; + + let (fn_hit, op_hit, fn_miss): (bool, bool, bool) = sqlx::query_as( + "SELECT eql_v3.contained_by($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match), + ($1::jsonb::eql_v3.text_match) <@ ($2::jsonb::eql_v3.text_match), + eql_v3.contained_by($3::jsonb::eql_v3.text_match, $1::jsonb::eql_v3.text_match)", + ) + .bind(&aard) + .bind(&hay) + .bind(&zzzz) + .fetch_one(&pool) + .await?; + + assert!(fn_hit, "eql_v3.contained_by('aard','aardvark') must be true"); + assert_eq!(fn_hit, op_hit, "eql_v3.contained_by must agree with the <@ operator"); + assert!(!fn_miss, "eql_v3.contained_by('zzzz','aard') must be false (disjoint ngrams)"); + Ok(()) +} + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn mixed_jsonb_domain_overloads_agree(pool: PgPool) -> anyhow::Result<()> { + // The (text_match, jsonb), (jsonb, text_match) overloads cast the jsonb side + // internally; they must agree with the fully-cast (text_match, text_match) form. + // `aardvark` contains needle `aard` (shared ngrams). + let hay = payload_for(&pool, "aardvark").await?; + let aard = payload_for(&pool, "aard").await?; + + // $1 = haystack, $2 = needle. Each column leaves one operand as bare jsonb so a + // DIFFERENT overload resolves; all must equal the all-domain baseline. + let row: (bool, bool, bool, bool, bool) = sqlx::query_as( + "SELECT + eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match), -- baseline (domain,domain) + eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb), -- (domain, jsonb) + eql_v3.contains($1::jsonb, $2::jsonb::eql_v3.text_match), -- (jsonb, domain) + eql_v3.contained_by($2::jsonb::eql_v3.text_match, $1::jsonb), -- (domain, jsonb) + eql_v3.contained_by($2::jsonb, $1::jsonb::eql_v3.text_match) -- (jsonb, domain) + ", + ) + .bind(&hay) + .bind(&aard) + .fetch_one(&pool) + .await?; + + let (baseline, contains_dom_json, contains_json_dom, cby_dom_json, cby_json_dom) = row; + assert!(baseline, "baseline eql_v3.contains('aardvark','aard') must be true"); + assert_eq!(contains_dom_json, baseline, "contains(domain, jsonb) must agree"); + assert_eq!(contains_json_dom, baseline, "contains(jsonb, domain) must agree"); + assert_eq!(cby_dom_json, baseline, "contained_by(domain, jsonb) must agree (commutator of contains)"); + assert_eq!(cby_json_dom, baseline, "contained_by(jsonb, domain) must agree"); + Ok(()) +} + +#[sqlx::test] +async fn direct_functions_propagate_null(pool: PgPool) -> anyhow::Result<()> { + // STRICT: a NULL operand short-circuits the body and returns NULL, not false + // and not an error. Covers the by-name functions (the operator path is covered + // by text_smoke::match_null_propagates) including a mixed (domain, jsonb) form. + const BF: &str = r#"{"v":"2","i":{},"c":"x","bf":[1,2,3]}"#; + + // $1 NULL, $2 a real payload — and the reverse — across both functions, both + // operand positions, and a mixed jsonb overload. + for sql in [ + "SELECT eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match)", + "SELECT eql_v3.contained_by($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match)", + "SELECT eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb)", // mixed (domain, jsonb) + ] { + eql_tests::assert_null(&pool, sql, &[None, Some(BF)]).await?; + eql_tests::assert_null(&pool, sql, &[Some(BF), None]).await?; + } + Ok(()) +} From a1d5aad99ce4ee5422c045bdf03d9f697cfd2e9b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 00:28:05 +1000 Subject: [PATCH 282/599] test(v3): lock in bloom-vs-LIKE semantic divergence (G3 4b) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Engineered fixture pair (NEEDLE's ngrams ⊆ HAY's ngram set, yet NEEDLE is not a contiguous substring of HAY) plus a creds-free catalog contiguity guard that pins the plaintext invariant. Strengthen the divergence test with a raw-bf subset assertion: assert needle-bf ⊆ haystack-bf directly on the stored `bf` arrays via native jsonb containment, independent of the `eql_v3` domain `@>` operator and the `match_term` extractor. Previously the subset was only inferred from the domain `@>` it was meant to validate (circular); the direct check localizes a future tokenizer change to a precise 'bf arrays no longer a subset' failure instead of an opaque @>-false. --- crates/eql-scalars/src/lib.rs | 13 +++- crates/eql-scalars/src/tests.rs | 44 +++++++++++++ .../tests/encrypted_domain/text/text_match.rs | 61 +++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-scalars/src/lib.rs index 899573c69..58e5543e0 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-scalars/src/lib.rs @@ -493,7 +493,18 @@ pub const BOOL: ScalarSpec = ScalarSpec { /// median value, not `String::default()`. const TEXT_FIXTURES: &[Fixture] = fixtures!(text; "aard", "aardvark", "alice", "bob", "carol", - "dave", "erin", "frank", "mallory", "trent", "zzzz"); + "dave", "erin", "frank", "mallory", "trent", "zzzz", + // Divergence pair (G3 4b): every contiguous 3-gram of NEEDLE (`abcabd` → + // {abc, bca, cab, abd}) is present in HAY (`qabcqbcaqcabqabd`), yet NEEDLE is + // NOT a contiguous substring of HAY (the `q` separators break the run). So + // bloom `@>` is true while `HAY LIKE '%NEEDLE%'` is false — the deterministic + // bloom-vs-LIKE divergence locked in by `bloom_matches_where_like_would_not`. + // Verified against the real cipherstash bf term sets (contiguous 3-grams, + // k=6 hashing): bf(NEEDLE) ⊆ bf(HAY). Both are 3-gram-disjoint from the + // `aard`/`zzzz` disjoint pair and sort interior to the min/mid/max pivots, so + // they perturb no eq/ord oracle. Keep them diverging if edited (the pure-Rust + // guard `divergence_pair_is_contiguity_diverging` in src/tests.rs enforces it). + "qabcqbcaqcabqabd", "abcabd"); /// `text` — an ordered, non-integer, unbounded scalar. Adds a `_match` domain /// (the `Bloom` term) on top of the ordered shape. Public because the SQLx diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index b19d13d41..0f2e54eac 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -904,6 +904,50 @@ mod values_tests { .collect(); assert_eq!(TEXT_VALUES.to_vec(), from_fixtures); } + + #[test] + // The divergence pair (`HAY`/`NEEDLE`) added to TEXT_FIXTURES for G3 4b must + // stay diverging at the plaintext level: NEEDLE's contiguous 3-grams are all + // present in HAY's 3-gram set, yet NEEDLE is NOT a contiguous substring of HAY. + // That is exactly the bloom-`@>`-true / `LIKE`-false condition the SQLx test + // `bloom_matches_where_like_would_not` relies on. This guard is creds-free and + // fails fast if anyone edits the fixture words so they stop diverging. + fn divergence_pair_is_contiguity_diverging() { + const HAY: &str = "qabcqbcaqcabqabd"; + const NEEDLE: &str = "abcabd"; + + // Both must actually be present in the fixture corpus. + assert!(TEXT_VALUES.contains(&HAY), "TEXT_VALUES must contain HAY {HAY:?}"); + assert!( + TEXT_VALUES.contains(&NEEDLE), + "TEXT_VALUES must contain NEEDLE {NEEDLE:?}" + ); + + // Contiguous 3-grams of a string (the documented bloom tokenization: + // contiguous 3-grams, no padding). + fn trigrams(s: &str) -> std::collections::HashSet<&str> { + let b = s.as_bytes(); + if b.len() < 3 { + // Sub-3 strings tokenize to the whole string; not used here but keep total. + return std::iter::once(s).collect(); + } + (0..=b.len() - 3).map(|i| &s[i..i + 3]).collect() + } + + let hay_grams = trigrams(HAY); + let needle_grams = trigrams(NEEDLE); + + // (1) needle 3-grams ⊆ haystack 3-grams → bloom `@>` would match. + assert!( + needle_grams.is_subset(&hay_grams), + "NEEDLE 3-grams {needle_grams:?} must be a subset of HAY 3-grams {hay_grams:?}" + ); + // (2) needle is NOT a contiguous substring → `LIKE '%NEEDLE%'` would NOT match. + assert!( + !HAY.contains(NEEDLE), + "NEEDLE {NEEDLE:?} must NOT be a contiguous substring of HAY {HAY:?}" + ); + } } mod float_tests { diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index caa66e23e..bc28811de 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -307,3 +307,64 @@ async fn direct_functions_propagate_null(pool: PgPool) -> anyhow::Result<()> { } Ok(()) } + +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +async fn bloom_matches_where_like_would_not(pool: PgPool) -> anyhow::Result<()> { + // Locks in WHY v3 dropped `LIKE` for bloom containment: the two are not the same + // relation. The needle's ngrams are all present in the haystack, so bloom `@>` + // matches — but the needle is NOT a contiguous substring, so `LIKE '%needle%'` + // would NOT match. This false-positive / order-independence is the deterministic + // divergence from LIKE (bloom has no false negatives, so the reverse can't happen). + // The pair is engineered for exactly this property in TEXT_FIXTURES; see the plan. + let hay = payload_for(&pool, "qabcqbcaqcabqabd").await?; + let needle = payload_for(&pool, "abcabd").await?; + + // 1. bloom DOES match. + let bloom_hit: bool = sqlx::query_scalar( + "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match)", + ) + .bind(&hay) + .bind(&needle) + .fetch_one(&pool) + .await?; + assert!( + bloom_hit, + "bloom @> must match: needle ngrams are a subset of the haystack's" + ); + + // 2. Pin the *structural* reason `@>` matched, independently of the domain + // operator. The domain `@>` is `match_term(a) @> match_term(b)`, i.e. + // smallint[] array containment on the extracted bloom terms — so asserting it + // again would just re-run the operator under test (circular). Instead assert + // needle-bf ⊆ haystack-bf directly on the raw stored `bf` arrays via NATIVE + // jsonb containment, which routes through neither `eql_v3.match_term` nor the + // domain operator. This localizes a future tokenizer change (e.g. honoring + // `include_original`, a different ngram width) to a precise "bf arrays no + // longer a subset" failure instead of an opaque `@>`-returned-false. + let bf_subset: bool = + sqlx::query_scalar("SELECT ($1::jsonb -> 'bf') @> ($2::jsonb -> 'bf')") + .bind(&hay) + .bind(&needle) + .fetch_one(&pool) + .await?; + assert!( + bf_subset, + "needle's raw bf terms must be a subset of the haystack's (native jsonb containment)" + ); + + // 3. LIKE would NOT match the same plaintext pair — pin the divergence directly on + // the cleartext so the assertion documents the contract independently of any + // encrypted representation. + let like_hit: bool = + sqlx::query_scalar("SELECT $1 LIKE '%' || $2 || '%'") + .bind("qabcqbcaqcabqabd") + .bind("abcabd") + .fetch_one(&pool) + .await?; + assert!( + !like_hit, + "LIKE must NOT match: the needle is not a contiguous substring of the haystack" + ); + + Ok(()) +} From 1d619c60ffb882354febb419cf9de3b2819f4204 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 13:12:04 +1000 Subject: [PATCH 283/599] style(v3): rustfmt text-match tests; drop stale plan reference in comment --- crates/eql-scalars/src/tests.rs | 5 +- .../tests/encrypted_domain/text/text_match.rs | 74 +++++++++++++------ 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 0f2e54eac..44559d56e 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -917,7 +917,10 @@ mod values_tests { const NEEDLE: &str = "abcabd"; // Both must actually be present in the fixture corpus. - assert!(TEXT_VALUES.contains(&HAY), "TEXT_VALUES must contain HAY {HAY:?}"); + assert!( + TEXT_VALUES.contains(&HAY), + "TEXT_VALUES must contain HAY {HAY:?}" + ); assert!( TEXT_VALUES.contains(&NEEDLE), "TEXT_VALUES must contain NEEDLE {NEEDLE:?}" diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index bc28811de..29dbe0890 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -225,8 +225,14 @@ async fn direct_contains_function_matches_operator(pool: PgPool) -> anyhow::Resu .await?; assert!(fn_hit, "eql_v3.contains('aardvark','aard') must be true"); - assert_eq!(fn_hit, op_hit, "eql_v3.contains must agree with the @> operator"); - assert!(!fn_miss, "eql_v3.contains('aardvark','zzzz') must be false (disjoint ngrams)"); + assert_eq!( + fn_hit, op_hit, + "eql_v3.contains must agree with the @> operator" + ); + assert!( + !fn_miss, + "eql_v3.contains('aardvark','zzzz') must be false (disjoint ngrams)" + ); Ok(()) } @@ -249,9 +255,18 @@ async fn direct_contained_by_function_matches_operator(pool: PgPool) -> anyhow:: .fetch_one(&pool) .await?; - assert!(fn_hit, "eql_v3.contained_by('aard','aardvark') must be true"); - assert_eq!(fn_hit, op_hit, "eql_v3.contained_by must agree with the <@ operator"); - assert!(!fn_miss, "eql_v3.contained_by('zzzz','aard') must be false (disjoint ngrams)"); + assert!( + fn_hit, + "eql_v3.contained_by('aard','aardvark') must be true" + ); + assert_eq!( + fn_hit, op_hit, + "eql_v3.contained_by must agree with the <@ operator" + ); + assert!( + !fn_miss, + "eql_v3.contained_by('zzzz','aard') must be false (disjoint ngrams)" + ); Ok(()) } @@ -280,11 +295,26 @@ async fn mixed_jsonb_domain_overloads_agree(pool: PgPool) -> anyhow::Result<()> .await?; let (baseline, contains_dom_json, contains_json_dom, cby_dom_json, cby_json_dom) = row; - assert!(baseline, "baseline eql_v3.contains('aardvark','aard') must be true"); - assert_eq!(contains_dom_json, baseline, "contains(domain, jsonb) must agree"); - assert_eq!(contains_json_dom, baseline, "contains(jsonb, domain) must agree"); - assert_eq!(cby_dom_json, baseline, "contained_by(domain, jsonb) must agree (commutator of contains)"); - assert_eq!(cby_json_dom, baseline, "contained_by(jsonb, domain) must agree"); + assert!( + baseline, + "baseline eql_v3.contains('aardvark','aard') must be true" + ); + assert_eq!( + contains_dom_json, baseline, + "contains(domain, jsonb) must agree" + ); + assert_eq!( + contains_json_dom, baseline, + "contains(jsonb, domain) must agree" + ); + assert_eq!( + cby_dom_json, baseline, + "contained_by(domain, jsonb) must agree (commutator of contains)" + ); + assert_eq!( + cby_json_dom, baseline, + "contained_by(jsonb, domain) must agree" + ); Ok(()) } @@ -315,7 +345,7 @@ async fn bloom_matches_where_like_would_not(pool: PgPool) -> anyhow::Result<()> // matches — but the needle is NOT a contiguous substring, so `LIKE '%needle%'` // would NOT match. This false-positive / order-independence is the deterministic // divergence from LIKE (bloom has no false negatives, so the reverse can't happen). - // The pair is engineered for exactly this property in TEXT_FIXTURES; see the plan. + // The pair is engineered for exactly this property in TEXT_FIXTURES. let hay = payload_for(&pool, "qabcqbcaqcabqabd").await?; let needle = payload_for(&pool, "abcabd").await?; @@ -341,12 +371,11 @@ async fn bloom_matches_where_like_would_not(pool: PgPool) -> anyhow::Result<()> // domain operator. This localizes a future tokenizer change (e.g. honoring // `include_original`, a different ngram width) to a precise "bf arrays no // longer a subset" failure instead of an opaque `@>`-returned-false. - let bf_subset: bool = - sqlx::query_scalar("SELECT ($1::jsonb -> 'bf') @> ($2::jsonb -> 'bf')") - .bind(&hay) - .bind(&needle) - .fetch_one(&pool) - .await?; + let bf_subset: bool = sqlx::query_scalar("SELECT ($1::jsonb -> 'bf') @> ($2::jsonb -> 'bf')") + .bind(&hay) + .bind(&needle) + .fetch_one(&pool) + .await?; assert!( bf_subset, "needle's raw bf terms must be a subset of the haystack's (native jsonb containment)" @@ -355,12 +384,11 @@ async fn bloom_matches_where_like_would_not(pool: PgPool) -> anyhow::Result<()> // 3. LIKE would NOT match the same plaintext pair — pin the divergence directly on // the cleartext so the assertion documents the contract independently of any // encrypted representation. - let like_hit: bool = - sqlx::query_scalar("SELECT $1 LIKE '%' || $2 || '%'") - .bind("qabcqbcaqcabqabd") - .bind("abcabd") - .fetch_one(&pool) - .await?; + let like_hit: bool = sqlx::query_scalar("SELECT $1 LIKE '%' || $2 || '%'") + .bind("qabcqbcaqcabqabd") + .bind("abcabd") + .fetch_one(&pool) + .await?; assert!( !like_hit, "LIKE must NOT match: the needle is not a contiguous substring of the haystack" From 3d28fdec76d5b6f091b9ec0ee125bc625bba9a5c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:42:19 +1000 Subject: [PATCH 284/599] test(fixtures): add per-type doubles fixtures (plaintext encrypted twice) --- tests/sqlx/src/fixtures/eql_doubles.rs | 103 +++++++++++++++++++++++++ tests/sqlx/src/fixtures/mod.rs | 4 + 2 files changed, 107 insertions(+) create mode 100644 tests/sqlx/src/fixtures/eql_doubles.rs diff --git a/tests/sqlx/src/fixtures/eql_doubles.rs b/tests/sqlx/src/fixtures/eql_doubles.rs new file mode 100644 index 000000000..d4f15bb9c --- /dev/null +++ b/tests/sqlx/src/fixtures/eql_doubles.rs @@ -0,0 +1,103 @@ +//! Per-type "doubles" fixtures: each plaintext encrypted TWICE, so the table +//! carries equal-plaintext / distinct-ciphertext rows. +//! +//! Hand-written and non-catalog (like `v3_numeric_collision`): the catalog +//! `eql_v2_` fixture is the curated `fixture_values()` set exactly (the +//! `scalars::*` matrix asserts that), so it has no room for duplicate +//! plaintexts. These tiny sibling tables (`fixtures.eql_v2__doubles`) exist +//! only so the credential-free fixture suite can prove "two independent +//! encryptions of one value compare equal" without any fresh test-time +//! encryption. Read ONLY by `property::cross_ciphertext`, never by the matrix. +//! +//! Plaintexts are the FIRST THREE of each type's curated `fixture_values()` +//! (guaranteed catalog-valid: text already excludes the empty string per #262, +//! temporals/numerics are already in-range), each duplicated once → 6 rows, 3 +//! equal-plaintext pairs. Each value is encrypted independently by the driver, +//! so a repeated plaintext lands as a distinct ciphertext row. +//! +//! Gitignored output: tests/sqlx/fixtures/eql_v2__doubles.sql +//! (regenerated by `mise run fixture:generate:all`). + +use anyhow::Result; + +use crate::fixtures::driver::FixtureValue; +use crate::scalar_domains::ScalarType; + +/// The comparison-capable scalar tokens that get a doubles fixture. `bool` is +/// storage-only (no equality domain) and is excluded. +pub const DOUBLES_TOKENS: &[&str] = + &["int2", "int4", "int8", "date", "timestamptz", "numeric", "text"]; + +/// How many distinct plaintexts to double. Small on purpose — the test only +/// needs a handful of equal-plaintext pairs. +const DISTINCT: usize = 3; + +/// Repeat each value once, preserving order: `[a, b, c] -> [a, a, b, b, c, c]`. +fn doubled(values: &[T]) -> Vec { + values.iter().flat_map(|v| [v.clone(), v.clone()]).collect() +} + +/// Generate `fixtures.eql_v2__doubles` — the first `DISTINCT` catalog values, +/// each encrypted twice. Generic over the type: the fixture name, the plaintext +/// source, and the bloom-index decision are all derived from `T` (and the +/// catalog), so there are no per-token strings to keep in sync. Indexes mirror +/// the type's catalog fixture so the payload carries the same terms (`hm` + `ob`, +/// plus `bf` for `text`) and the doubles cast cleanly to every comparison domain. +async fn generate_doubles_for() -> Result<()> +where + T: ScalarType + FixtureValue, +{ + let name = format!("eql_v2_{}_doubles", T::PG_TYPE); + let head: Vec = ::fixture_values() + .iter() + .take(DISTINCT) + .cloned() + .collect(); + let sample = doubled(&head); + let mut spec = super::spec::FixtureSpec::new(&name) + .with_index(super::index_kind::IndexKind::Unique) + .with_index(super::index_kind::IndexKind::Ore); + // text carries the Match (bloom) index too — derived from the catalog, not + // hardcoded — so its doubles cast to `text_match` / `text_search` as well. + if crate::scalar_domains::token_has_bloom_term(T::PG_TYPE) { + spec = spec.with_index(super::index_kind::IndexKind::Match); + } + spec.with_column_type("jsonb") + .with_values(&sample) + .run() + .await +} + +/// Run the doubles generator for one catalog token. Loud catch-all so an +/// unwired token fails generation rather than silently skipping. +pub async fn generate(token: &str) -> Result<()> { + match token { + "int2" => generate_doubles_for::().await, + "int4" => generate_doubles_for::().await, + "int8" => generate_doubles_for::().await, + "date" => generate_doubles_for::().await, + "timestamptz" => generate_doubles_for::>().await, + "numeric" => generate_doubles_for::().await, + "text" => generate_doubles_for::().await, + other => anyhow::bail!( + "no doubles generator wired for token '{other}'; add it to \ + fixtures::eql_doubles (DOUBLES_TOKENS + the generate dispatch)" + ), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn doubled_repeats_each_value_once_in_order() { + let src = [10i32, 20, 30]; + let out = doubled(&src); + // 3 distinct plaintexts, each appearing exactly twice. + assert_eq!(out, vec![10, 10, 20, 20, 30, 30]); + for v in src { + assert_eq!(out.iter().filter(|&&x| x == v).count(), 2); + } + } +} diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 62e867132..f4d5683a5 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -46,6 +46,10 @@ pub mod v3_doc_int4; // (committed-fixture) home instead of a creds-gated runtime encryption. pub mod v3_numeric_collision; +// Per-type "doubles" fixtures (each plaintext encrypted twice) for the +// cross-ciphertext-equality test. Non-catalog, like `v3_numeric_collision`. +pub mod eql_doubles; + // The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, …) are // generated from the harness list in `scalar_types.rs`. Each expands to // `pub mod eql_v2_ { … scalar_fixture! … }`, reading its plaintext values From 1ed19bcfb0f185a90a0c5a4dd85f37dcd32c9c46 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:42:47 +1000 Subject: [PATCH 285/599] test(fixtures): generate per-type doubles fixtures in fixture:generate:all --- tests/sqlx/tests/generate_all_fixtures.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index dcb50c27f..bc4191441 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -58,5 +58,17 @@ async fn generate_all() -> anyhow::Result<()> { eprintln!("Generating fixture v3_numeric_collision (1 == 1.0 ORE collision)..."); eql_tests::fixtures::v3_numeric_collision::generate().await?; eprintln!("Regenerated v3_numeric_collision."); + + // Per-type "doubles" fixtures (each plaintext encrypted twice) for the + // credential-free cross-ciphertext-equality test. Non-catalog (the catalog + // fixture is the curated set exactly), generated through the same pipeline. + for token in eql_tests::fixtures::eql_doubles::DOUBLES_TOKENS { + eprintln!("Generating fixture eql_v2_{token}_doubles..."); + eql_tests::fixtures::eql_doubles::generate(token).await?; + } + eprintln!( + "Regenerated {} doubles fixture(s).", + eql_tests::fixtures::eql_doubles::DOUBLES_TOKENS.len() + ); Ok(()) } From 8a8d1cce0206df0814153684bb9c12af09214a7f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:44:48 +1000 Subject: [PATCH 286/599] test(property): add doubles-fixture loader to the fixture oracle --- .../property/fixture_oracle.rs | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 9c3b9c034..60edc6032 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -85,6 +85,52 @@ pub(crate) fn embedded_fixture_sql() -> &'static str { } } +/// The `_doubles` fixture SQL for `T`, `include_str!`-embedded at compile time +/// (one arm per comparison-capable token). Same embed rationale as +/// `embedded_fixture_sql` — the prebuilt nextest archive carries the gitignored +/// fixtures into CI shards. The table is `fixtures.eql_v2__doubles`; the file +/// is `fixtures/eql_v2__doubles.sql`. `bool` is storage-only and has no +/// doubles fixture; the cross-ciphertext test never instantiates it, so its +/// absence (caught by the loud catch-all) is correct. +pub(crate) fn embedded_doubles_sql() -> &'static str { + match T::PG_TYPE { + "int2" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_int2_doubles.sql" + )), + "int4" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_int4_doubles.sql" + )), + "int8" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_int8_doubles.sql" + )), + "date" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_date_doubles.sql" + )), + "timestamptz" => { + include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_timestamptz_doubles.sql" + )) + } + "numeric" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_numeric_doubles.sql" + )), + "text" => include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/fixtures/eql_v2_text_doubles.sql" + )), + other => panic!( + "no embedded doubles fixture for catalog token '{other}'; \ + add an include_str! arm in embedded_doubles_sql" + ), + } +} + /// Load `T`'s committed fixtures into `pool`'s isolated scratch DB via the /// `include_str!`-embedded SQL. The fixture SQL is self-contained (`CREATE SCHEMA /// IF NOT EXISTS fixtures` / `CREATE` / `INSERT`); since each `#[sqlx::test]` DB @@ -123,6 +169,30 @@ pub(crate) async fn load_rows(pool: &PgPool) -> Result_doubles` (NOT the matrix's `fixtures.eql_v2_`), so it +/// carries the equal-plaintext / distinct-ciphertext rows the cross-ciphertext +/// test needs. +pub(crate) async fn load_doubles_rows(pool: &PgPool) -> Result>>> { + sqlx::raw_sql(embedded_doubles_sql::()) + .execute(pool) + .await + .with_context(|| format!("loading doubles fixtures for {}", T::PG_TYPE))?; + let table = format!("fixtures.eql_v2_{}_doubles", T::PG_TYPE); + let sql = format!("SELECT plaintext, payload::text FROM {table} ORDER BY id"); + let raw: Vec<(T, String)> = sqlx::query_as(&sql).fetch_all(pool).await?; + let rows: Vec> = raw + .into_iter() + .map(|(plaintext, payload_json)| Row { + plaintext, + payload_json, + }) + .collect(); + anyhow::ensure!(!rows.is_empty(), "doubles fixture {table} is empty"); + Ok(Arc::new(rows)) +} + /// Build a sample by selecting indices (with repeats) into the loaded fixtures. /// `idxs` are already bounded to `0..all.len()` by the proptest strategy. fn pick(all: &[Row], idxs: &[usize]) -> Vec> { From 8928ec707a18e9e1f84cd8112444d01f9b7f8d9c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:44:48 +1000 Subject: [PATCH 287/599] test(property): cross-ciphertext equality over per-type doubles fixtures (hm + ORE) --- .../property/cross_ciphertext.rs | 114 ++++++++++++++++++ .../tests/encrypted_domain/property/mod.rs | 5 + 2 files changed, 119 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs diff --git a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs new file mode 100644 index 000000000..a6c52dc41 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs @@ -0,0 +1,114 @@ +//! fixture-suite (CIP-3141) cross-ciphertext equality test. +//! +//! Proves "two independent encryptions of one value compare equal" using the +//! committed `fixtures.eql_v2__doubles` tables — each plaintext encrypted +//! twice, so the table carries equal-plaintext / distinct-ciphertext rows. No +//! fresh encryption, no creds: it reads the already-encrypted doubles, so it +//! runs in the credential-free `mise run test:sqlx` path. Distinct from the +//! matrix (which reads the curated `fixtures.eql_v2_`) and from the e2e suite +//! (which re-encrypts fresh duplicates each run). +//! +//! Each type asserts, on its doubles rows: +//! 1. a distinct-ciphertext pair exists (an equal-plaintext pair whose +//! `payload_json` differs) — so the equality assertions below are non-trivial; +//! 2. `=` TRUE / `<>` FALSE across every pair through the `_eq` (hm/HMAC) domain +//! (`assert_eq_oracle`); +//! 3. the ordering operators agree with the plaintext oracle on both ordered +//! twins (`assert_ord_oracle`), PLUS `=` TRUE / `<>` FALSE on an equal pair +//! through `_ord` and `_ord_ore` — the ORE (`ob`) equality path, which routes +//! `=` through `compare_ore_block_256_terms(...) = 0` (GUARANTEED equal for +//! two independent encryptions of one value; see the ORE finding in the plan). +//! +//! `#[sqlx::test]` per type (its own migrated scratch DB), like the rest of the +//! fixture suite. + +use super::fixture_oracle::load_doubles_rows; +use anyhow::Result; +use eql_tests::property::{assert_eq_oracle, assert_ord_oracle, Row}; +use eql_tests::scalar_domains::{ScalarDomainSpec, ScalarType, Variant}; +use sqlx::PgPool; + +/// Find two rows with equal plaintext but DIFFERENT ciphertext, or fail. The +/// doubles fixture encrypts each plaintext independently, so an equal-plaintext +/// pair is expected to differ in ciphertext; a failure here means the fixture +/// was not regenerated. +fn first_distinct_ciphertext_pair(rows: &[Row]) -> Result<(&Row, &Row)> { + for i in 0..rows.len() { + for j in (i + 1)..rows.len() { + if rows[i].plaintext == rows[j].plaintext + && rows[i].payload_json != rows[j].payload_json + { + return Ok((&rows[i], &rows[j])); + } + } + } + anyhow::bail!( + "doubles fixture for {} has no equal-plaintext/distinct-ciphertext pair; \ + regenerate via mise run test:sqlx:prep", + T::PG_TYPE + ) +} + +/// Assert `=` TRUE / `<>` FALSE for one equal-plaintext distinct-ciphertext pair +/// on `variant`'s domain. Used for the ORE path (`Ord` / `OrdOre`), which routes +/// `=` through `compare_ore_block_256_terms(...) = 0` — the assertion the +/// plaintext ordering oracle does not itself make on the ordered twins. +async fn assert_pair_eq_on( + pool: &PgPool, + variant: Variant, + a: &Row, + b: &Row, +) -> Result<()> { + let domain = ScalarDomainSpec::new::(variant).sql_domain; + // `''::jsonb::` for each side; escape single quotes the same + // way property.rs's `cast` does. + let a_cast = format!("'{}'::jsonb::{domain}", a.payload_json.replace('\'', "''")); + let b_cast = format!("'{}'::jsonb::{domain}", b.payload_json.replace('\'', "''")); + let sql = format!("SELECT ({a_cast}) = ({b_cast}), ({a_cast}) <> ({b_cast})"); + let (eq, neq): (Option, Option) = sqlx::query_as(&sql).fetch_one(pool).await?; + anyhow::ensure!( + eq == Some(true), + "cross-ciphertext `=` on {domain} must be TRUE for equal plaintext, got {eq:?}" + ); + anyhow::ensure!( + neq == Some(false), + "cross-ciphertext `<>` on {domain} must be FALSE for equal plaintext, got {neq:?}" + ); + Ok(()) +} + +/// The full cross-ciphertext check for an ordered scalar `T`. +async fn assert_cross_ciphertext(pool: &PgPool) -> Result<()> { + let rows = load_doubles_rows::(pool).await?; + + // (1) the doubles really are distinct ciphertext. + let (a, b) = first_distinct_ciphertext_pair::(&rows)?; + + // (2) hm/HMAC equality path across all pairs. + assert_eq_oracle::(pool, &rows).await?; + + // (3) ordering oracle on both ordered twins, plus the explicit ORE-path + // equality on the distinct-ciphertext pair. + assert_ord_oracle::(pool, Variant::Ord, &rows).await?; + assert_ord_oracle::(pool, Variant::OrdOre, &rows).await?; + assert_pair_eq_on::(pool, Variant::Ord, a, b).await?; + assert_pair_eq_on::(pool, Variant::OrdOre, a, b).await?; + Ok(()) +} + +macro_rules! cross_ciphertext_test { + ($name:ident, $ty:ty) => { + #[sqlx::test] + async fn $name(pool: PgPool) -> Result<()> { + assert_cross_ciphertext::<$ty>(&pool).await + } + }; +} + +cross_ciphertext_test!(cross_ciphertext_int2, i16); +cross_ciphertext_test!(cross_ciphertext_int4, i32); +cross_ciphertext_test!(cross_ciphertext_int8, i64); +cross_ciphertext_test!(cross_ciphertext_date, chrono::NaiveDate); +cross_ciphertext_test!(cross_ciphertext_timestamptz, chrono::DateTime); +cross_ciphertext_test!(cross_ciphertext_numeric, rust_decimal::Decimal); +cross_ciphertext_test!(cross_ciphertext_text, String); diff --git a/tests/sqlx/tests/encrypted_domain/property/mod.rs b/tests/sqlx/tests/encrypted_domain/property/mod.rs index e52b891c6..cb6ff6515 100644 --- a/tests/sqlx/tests/encrypted_domain/property/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/property/mod.rs @@ -27,6 +27,11 @@ mod edge_cases; mod fixture_oracle; // fixture suite: example-based bloom match smoke over the text `_match` fixtures. mod match_smoke; +// fixture suite: cross-ciphertext equality over the per-type doubles fixtures +// (each plaintext encrypted twice) — proves two independent encryptions of one +// value compare equal through both the hm (`_eq`) and ORE (`_ord`/`_ord_ore`) +// paths. +mod cross_ciphertext; // e2e suite: oracle over freshly generated + batch-encrypted values. #[cfg(feature = "proptest-e2e")] mod e2e_oracle; From ddd4a110c3af736a41c4395dc910634c3bea4790 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 22:49:43 +1000 Subject: [PATCH 288/599] docs: describe doubles fixtures + cross-ciphertext test (hm + ORE) --- CHANGELOG.md | 2 +- .../tests/encrypted_domain/property/README.md | 45 +++++++++++++------ 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d04e1cc1..a7cde1519 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) -- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`int2`/`int4`/`int8`/`date`/`timestamptz`/`numeric`/`text`). The e2e suite — which appends fresh duplicate plaintexts each run — is the one that exercises equality across two independent encryptions of one value. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293)) +- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`int2`/`int4`/`int8`/`date`/`timestamptz`/`numeric`/`text`). Equality across two independent encryptions of one value is exercised credential-free by the fixture suite via committed per-type *doubles* fixtures (each plaintext encrypted twice — `property::cross_ciphertext`), through both the `hm` (`_eq`) and ORE (`_ord`/`_ord_ore`) equality paths, and additionally by the e2e suite via fresh duplicate plaintexts each run. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt-v3.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt-v3.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.ste_vec_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) diff --git a/tests/sqlx/tests/encrypted_domain/property/README.md b/tests/sqlx/tests/encrypted_domain/property/README.md index bed3ae047..823af27cf 100644 --- a/tests/sqlx/tests/encrypted_domain/property/README.md +++ b/tests/sqlx/tests/encrypted_domain/property/README.md @@ -17,11 +17,13 @@ named for what they operate on, not by an abstract tier letter: | **fixture** | [`fixture_oracle.rs`](./fixture_oracle.rs) | integration | committed fixture rows (real ciphertext) | isolated per-test DB (`#[sqlx::test]`) | | **e2e** | [`e2e_oracle.rs`](./e2e_oracle.rs) | integration | freshly generated plaintexts, encrypted each run | shared test DB **+ ZeroKMS creds** | -The `fixture` suite spans two files: [`fixture_oracle.rs`](./fixture_oracle.rs) -(the operator **and** function-double oracles + term-extractor identity) and -[`match_smoke.rs`](./match_smoke.rs) (example-based bloom containment for the text -`_match` domain). Both are un-gated — they read the already-encrypted fixtures, -no fresh ZeroKMS. +The `fixture` suite spans several files: [`fixture_oracle.rs`](./fixture_oracle.rs) +(the operator **and** function-double oracles + term-extractor identity), +[`cross_ciphertext.rs`](./cross_ciphertext.rs) (proves two independent +encryptions of one value compare equal, over the committed per-type *doubles* +fixtures), and [`match_smoke.rs`](./match_smoke.rs) (example-based bloom +containment for the text `_match` domain). All are un-gated — they read the +already-encrypted fixtures, no fresh ZeroKMS. Plus [`edge_cases.rs`](./edge_cases.rs): example-based unit tests for NULL propagation, blockers raising on unsupported operators (including the @@ -55,6 +57,16 @@ identity** — `eql_v3.eq_term` returns the payload's exact `hm`, `eql_v3.ord_te returns its exact `ob`. [`match_smoke.rs`](./match_smoke.rs) adds the example-based bloom containment (`@>`/`<@`) for the text `_match` domain. +Cross-ciphertext equality — "two independent encryptions of one value compare +equal" — needs equal-plaintext / distinct-ciphertext rows, which the curated +matrix fixture (unique plaintexts) has no room for. So each comparison type +carries a tiny sibling table, `fixtures.eql_v2__doubles` (generated by +[`fixtures::eql_doubles`](../../../src/fixtures/eql_doubles.rs)): the first three +catalog values, each encrypted twice. [`cross_ciphertext.rs`](./cross_ciphertext.rs) +reads ONLY those tables and proves the equality holds through both the `hm` +(`_eq`) and the ORE `ob` (`_ord` / `_ord_ore`) paths — credential-free, no fresh +test-time encryption. + [overload]: ../../../src/property.rs ### e2e — oracle over fresh end-to-end encryption @@ -73,9 +85,12 @@ Defence in depth over the fixture suite: the fixtures are encrypted once at `test:sqlx:prep`, so they pin behaviour against a *frozen* ciphertext snapshot; the e2e suite re-encrypts on **every run**, so it catches a live crypto-path regression (a `cipherstash-client` / ZeroKMS change) that leaves the committed -fixtures untouched. The e2e suite is also the one that exercises "same plaintext, -*different* ciphertext" (equality across independently-encrypted values), via the -fresh duplicate plaintexts it appends each run. +fixtures untouched. The e2e suite also exercises "same plaintext, *different* +ciphertext" (equality across independently-encrypted values) via the fresh +duplicate plaintexts it appends each run — but the fixture suite already covers +that case credential-free through the committed per-type *doubles* tables +(`cross_ciphertext.rs`), so the e2e run is defence in depth on it, not the only +home for it. ## The shared oracle engine @@ -129,11 +144,13 @@ encryption to reach inputs the fixtures can't. fine). [`match_smoke.rs`](./match_smoke.rs) is a plain `#[sqlx::test]` (not proptest-driven), loading the fixtures into its own isolated DB. - **Equality-true must actually fire.** Random distinct plaintexts almost never - collide, so the e2e suite injects deliberate duplicate plaintexts (plus signed - extremes and zero) each run to exercise the `a == b ⇒ eq` branch across - *distinct* ciphertexts. The fixture suite's curated rows have unique plaintexts, - so it exercises the equality-true branch on self-pairs (same ciphertext); the - cross-ciphertext case is the e2e suite's job. + collide, so both DB suites inject deliberate duplicate plaintexts to exercise + the `a == b ⇒ eq` branch across *distinct* ciphertexts: the fixture suite via + the committed per-type *doubles* tables (`cross_ciphertext.rs`), and the e2e + suite via fresh duplicates (plus signed extremes and zero) each run. The + matrix's own curated rows have unique plaintexts, so they exercise the + equality-true branch only on self-pairs (same ciphertext) — which is why the + doubles tables exist. ## Running @@ -144,7 +161,7 @@ cargo test -p eql-scalars proptest_invariants # fixture + edge-case suites (needs a prepared DB) mise run test:sqlx:prep cd tests/sqlx && cargo test --test encrypted_domain \ - property::fixture_oracle property::match_smoke property::edge_cases + property::fixture_oracle property::cross_ciphertext property::match_smoke property::edge_cases # all suites incl. e2e (needs DB + CS_* creds) mise run test:sqlx # enables --features proptest-e2e From 826586ef6b6c17c7615f7e7c0579cb713b52e5ce Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 19 Jun 2026 23:17:39 +1000 Subject: [PATCH 289/599] style: rustfmt eql_doubles DOUBLES_TOKENS --- tests/sqlx/src/fixtures/eql_doubles.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/src/fixtures/eql_doubles.rs b/tests/sqlx/src/fixtures/eql_doubles.rs index d4f15bb9c..a51b046c3 100644 --- a/tests/sqlx/src/fixtures/eql_doubles.rs +++ b/tests/sqlx/src/fixtures/eql_doubles.rs @@ -25,8 +25,15 @@ use crate::scalar_domains::ScalarType; /// The comparison-capable scalar tokens that get a doubles fixture. `bool` is /// storage-only (no equality domain) and is excluded. -pub const DOUBLES_TOKENS: &[&str] = - &["int2", "int4", "int8", "date", "timestamptz", "numeric", "text"]; +pub const DOUBLES_TOKENS: &[&str] = &[ + "int2", + "int4", + "int8", + "date", + "timestamptz", + "numeric", + "text", +]; /// How many distinct plaintexts to double. Small on purpose — the test only /// needs a handful of equal-plaintext pairs. From 6314aa77f83f296a9566918e84be5d8030c3150e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 11:34:46 +1000 Subject: [PATCH 290/599] ci: relevance-gate the docs-static job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs-static (source-only SQL doxygen coverage + required-tags) ran on every PR, unlike the other heavy jobs. Its inputs are a strict subset of the changes-job relevant filter — src/**, the crates/** codegen build it depends on, and the tasks/docs/** validator scripts — so a PR that leaves relevant false cannot change its outcome. Gate it on the same flag as the other jobs: consistent, and drops a redundant codegen build on markdown-only PRs without losing coverage. A narrower src/**-only filter was rejected — it would risk a silent false-green (ci-required counts skipped as pass) by skipping on a real input change. Sync .github/workflows/README.md (coverage map, known gaps, recently- closed, operator-setup verification) and the stale validate-job comment. --- .github/workflows/README.md | 31 +++++++++++++++++++------------ .github/workflows/test-eql.yml | 8 ++++---- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 95e287266..c38d69184 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -107,7 +107,7 @@ All jobs run on `blacksmith-16vcpu-ubuntu-2204`. "PG set" follows the event | **test** (sharded) | `test:sqlx:partition` | Run the archived sqlx binaries (default features), hash-partitioned across shards | yes (per PG) | no (replays archive) | | **e2e** | `test:sqlx:e2e` | The `proptest-e2e` fresh-encryption property suite (`e2e_oracle`) — PG17 only, version-independent | yes (PG17) | **yes** | | **validate** (per PG) | `docs:validate:documented-sql` + `test:clean_install_v3` | DB-backed SQL doc-syntax check; clean-DB `eql_v3` install smoke | yes | no | -| **docs-static** | `docs:validate:source` | SQL doxygen coverage + required-tags (DB-free); **unconditional — runs on every PR incl. docs-only** | no | no | +| **docs-static** | `docs:validate:source` | SQL doxygen coverage + required-tags (DB-free); relevance-gated like the other heavy jobs (its inputs — `src/**`, the `crates/**` codegen build, `tasks/docs/**` — are a subset of the `relevant` filter) | no | no | | **schema** | `test:schema` | v2.2 / v2.3 payload JSON-schema validation | no | no | | **rust-crates** | `test:crates` + `types:check` | `cargo fmt --check`, clippy + `cargo test` for `eql-scalars` / `eql-codegen` / `eql-tests-macros` / `eql-types`; verify TS bindings + JSON schemas are fresh | no | no | | **codegen** | `codegen:parity` | Generated encrypted-domain SQL matches the golden output | no | no | @@ -145,19 +145,26 @@ non-default feature and needs `CS_*` at run time). stale `cargo expand` snapshot surfaces on the daily schedule, not on the PR that introduced it. Accepted trade-off. -2. **`docs/**` markdown is not content-validated.** The `docs-static` job - guarantees the SQL `--!` doxygen comments under `src/**` are always checked, - but nothing lints the prose/links in `docs/**` itself. A docs-only PR now runs - `docs-static` (so it is no longer un-gated), but that job validates *source* - documentation, not the markdown the PR changed. Adding a markdown - linter/link-checker is a separate, unfilled capability. +2. **`docs/**` markdown is not content-validated.** The `docs-static` job checks + the SQL `--!` doxygen comments under `src/**`, not the prose/links in `docs/**` + itself. A markdown-only PR leaves `relevant` false, so `docs-static` is skipped + along with the other heavy jobs — and that loses no coverage, because the job's + inputs (`src/**` `.sql`/`.template`, the `crates/**` codegen build, the + `tasks/docs/**` scripts) are all in the `relevant` filter, so a PR that doesn't + trip `relevant` cannot change its outcome. Linting the markdown the PR actually + changed (prose/links) is a separate, unfilled capability. ### Recently closed - *The e2e (fresh-encryption) suite never ran in CI.* Now covered by the **e2e** job (`test:sqlx:e2e`), PG17, on relevant PRs + the queue. -- *Docs-only PRs ran no doc validation.* The **docs-static** job now runs the - source-only doc checks unconditionally on every PR. +- *`docs-static` ran unconditionally on every PR.* It is now relevance-gated like + every other heavy job. Because its inputs are a strict subset of the `relevant` + filter, gating it both makes the workflow consistent (one uniform `if:`) and + drops a redundant codegen build on markdown-only PRs without losing any + coverage. A narrower bespoke `src/**`-only filter was rejected: it would risk a + silent false-green (`ci-required` counts `skipped` as pass) by skipping on a + real input change in `crates/**` or `tasks/docs/**`. --- @@ -175,9 +182,9 @@ Then verify (see `docs/plans/2026-06-09-ci-pr-feedback-sharding-rollout.md`): 4 `Validate …` jobs + `build-archive`, `e2e`, `docs-static`, `schema`, `rust-crates`, `codegen`, `self-contained-v3`, `matrix-coverage`, `splinter`) → `ci-required` green → PR merges. -- **Open a docs-only PR** → on its `pull_request` run the relevance-gated heavy - jobs skip, but `docs-static` still runs; `ci-required` reports **Success** (not - stuck *Pending*), so the PR can be queued. +- **Open a docs-only PR** → on its `pull_request` run every relevance-gated heavy + job skips (`docs-static` included); `ci-required` reports **Success** (not stuck + *Pending*) because it counts `skipped` as pass, so the PR can be queued. ## References diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 4150ba6ef..a4bcbd619 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -268,10 +268,10 @@ jobs: run: | mise run postgres:up postgres-${POSTGRES_VERSION} --extra-args "--detach --wait" - # Source-only doc checks (coverage + required-tags) moved to the - # unconditional `docs-static` job so they run on every PR (incl. docs-only) - # and exactly once, not per-Postgres. This step keeps only the DB-backed - # SQL-syntax validation, which genuinely needs the per-version Postgres. + # Source-only doc checks (coverage + required-tags) moved to the dedicated + # `docs-static` job so they run exactly once, not per-Postgres. This step + # keeps only the DB-backed SQL-syntax validation, which genuinely needs the + # per-version Postgres. - name: Validate documented SQL syntax (Postgres ${{ matrix.postgres-version }}) run: | mise run docs:validate:documented-sql From fb051d016a90376b5a40257b50c96832f153ca65 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 12:14:13 +1000 Subject: [PATCH 291/599] fix(ci): stub per-type _doubles fixtures for no-creds matrix tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The cross-ciphertext oracle include_str!s eql_v2__doubles.sql at compile time, but stub-fixtures.sh only stubbed eql_v2_.sql and the literal .gitignore *.sql entries — neither matches the _doubles glob. So the no-creds matrix-coverage / inventory jobs could not compile the encrypted_domain binary to --list it (rustc: couldn't read eql_v2_int4_doubles.sql, ...). Stub eql_v2__doubles.sql alongside eql_v2_.sql for every catalog token, consistent with the helper's stub-the-complete-set policy (harmless extras for storage-only tokens with no real doubles fixture). --- tasks/test/stub-fixtures.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tasks/test/stub-fixtures.sh b/tasks/test/stub-fixtures.sh index 18d9c219c..510cbd93c 100644 --- a/tasks/test/stub-fixtures.sh +++ b/tasks/test/stub-fixtures.sh @@ -16,9 +16,13 @@ # The set is derived from the two sources of truth, not from parsing rustc # errors (an earlier preamble looped over compile-error text — brittle, coupled # to rustc's wording, capped at 12 retries): -# 1. Catalog scalar tokens (`eql-codegen list-types`) -> `eql_v2_.sql`, -# covering the `tests/sqlx/fixtures/eql_v2*` .gitignore glob. A new scalar -# is stubbed automatically. +# 1. Catalog scalar tokens (`eql-codegen list-types`) -> `eql_v2_.sql` +# AND `eql_v2__doubles.sql` (the per-type doubles fixture the +# cross-ciphertext oracle `include_str!`s), both covered by the +# `tests/sqlx/fixtures/eql_v2*` .gitignore glob. A new scalar is stubbed +# automatically. The doubles variant is stubbed for every token, not only +# the comparison-capable ones that have a real doubles fixture — a harmless +# extra under this helper's stub-the-complete-set policy. # 2. The literal `tests/sqlx/fixtures/*.sql` entries in `.gitignore` (the # non-catalog generated fixtures: `v3_ste_vec`, `v3_doc_int4`, # `v3_numeric_collision`). A newly-generated fixture is stubbed @@ -42,13 +46,15 @@ __eql_stub_dir="${__eql_stub_root}/tests/sqlx/fixtures" __eql_stub_created=$(mktemp) trap 'while IFS= read -r f; do [ -n "$f" ] && rm -f "$f"; done < "$__eql_stub_created"; rm -f "$__eql_stub_created"' EXIT -# (1) Catalog scalar tokens -> eql_v2_.sql. A failure here aborts under -# the caller's `set -e` with cargo's own error — no silent fallback. +# (1) Catalog scalar tokens -> eql_v2_.sql + eql_v2__doubles.sql. +# A failure here aborts under the caller's `set -e` with cargo's own error — no +# silent fallback. __eql_stub_paths="" __eql_stub_tokens=$(cd "$__eql_stub_root" && cargo run -q -p eql-codegen -- list-types) while IFS= read -r __eql_stub_t; do [ -n "$__eql_stub_t" ] || continue __eql_stub_paths="${__eql_stub_paths}${__eql_stub_dir}/eql_v2_${__eql_stub_t}.sql +${__eql_stub_dir}/eql_v2_${__eql_stub_t}_doubles.sql " done < Date: Sun, 21 Jun 2026 14:27:33 +1000 Subject: [PATCH 292/599] test(v3): constraints suite for eql_v3 encrypted-domain columns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Salvaged from local-only wip branch (eql_v3-wip), the genuinely-new, non-superseded subset: - tests: encrypted_domain/constraints.rs — UNIQUE / NOT NULL / FOREIGN KEY coverage on eql_v3 encrypted-domain columns (the v3 analogue of v2's constraint_tests.rs), plus its `mod constraints;` wiring in encrypted_domain.rs. Kept outside `scalars::` so the matrix-inventory snapshot does not mis-read it as a scalar type. - docs: explanatory comment on the load-bearing `::text` cast in eql_v3.compare_ore_cllw_term (NULL-component composites must fall through to the RAISE, not silently return NULL). Comment only — no behaviour change. - changelog: document the already-shipped eql_v2.ore_block_u64_8_256 `=`/`<>` COMMUTATOR fix (#239), which was undocumented. --- CHANGELOG.md | 2 + src/v3/sem/ore_cllw/functions.sql | 6 + tests/sqlx/tests/encrypted_domain.rs | 7 + .../tests/encrypted_domain/constraints.rs | 254 ++++++++++++++++++ 4 files changed, 269 insertions(+) create mode 100644 tests/sqlx/tests/encrypted_domain/constraints.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index a7cde1519..e8004c343 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,8 @@ Each entry that ships in a published release links to the PR that introduced it. ### Fixed +- **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v2_int4_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) + - **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamptz` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) ## [2.3.1] — 2026-05-21 diff --git a/src/v3/sem/ore_cllw/functions.sql b/src/v3/sem/ore_cllw/functions.sql index bd34ac8ce..51ed535c5 100644 --- a/src/v3/sem/ore_cllw/functions.sql +++ b/src/v3/sem/ore_cllw/functions.sql @@ -124,6 +124,12 @@ DECLARE common_len INT; cmp_result INT; BEGIN + -- The `::text` cast is load-bearing, not a stylistic choice. For the + -- single-field `ore_cllw` composite, `ROW(NULL)::ore_cllw IS NULL` is TRUE + -- but `(ROW(NULL)::ore_cllw)::text IS NULL` is FALSE. Casting to text first + -- means a NULL-component composite falls THROUGH to the RAISE below (the + -- extractor-invariant violation) instead of silently returning NULL and + -- masking it. A plain `a IS NULL` would reintroduce that masking bug. IF a::text IS NULL OR b::text IS NULL THEN RETURN NULL; END IF; diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 585895856..e365155c7 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -36,6 +36,13 @@ mod signed; #[path = "encrypted_domain/float_special.rs"] mod float_special; +// Table-level SQL constraint coverage (UNIQUE / NOT NULL / FOREIGN KEY) on +// `eql_v3` encrypted-domain columns — the v3 analogue of v2's +// `constraint_tests.rs`. Outside `scalars::` so the matrix-inventory snapshot +// does not mis-read it as a scalar type (same rationale as `signed`). +#[path = "encrypted_domain/constraints.rs"] +mod constraints; + // SteVec jsonb-entry behaviour matrix (the reduced `jsonb_entry_matrix!`). // Deliberately NOT under `scalars::` — `JsonbEntryInt4` is not a catalog scalar, // so its names live under `jsonb_entry::…` and are pinned by the separate diff --git a/tests/sqlx/tests/encrypted_domain/constraints.rs b/tests/sqlx/tests/encrypted_domain/constraints.rs new file mode 100644 index 000000000..d1b621f0d --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/constraints.rs @@ -0,0 +1,254 @@ +//! Table-level SQL constraint coverage for `eql_v3` encrypted-domain columns. +//! +//! The v2 surface covers UNIQUE / NOT NULL / FOREIGN KEY on `eql_v2_encrypted` +//! columns in `tests/sqlx/tests/constraint_tests.rs`. This is the equivalent +//! coverage for the jsonb-backed `eql_v3.` domains (the reference scalar +//! `int4`). The domains are jsonb under the hood, so a table-level constraint +//! constrains the *raw jsonb payload value*, NOT the semantic plaintext or the +//! `eq_term` / `ord_term` index term — see the documented findings on each test. +//! +//! Like the sibling `signed.rs` suite it lives OUTSIDE the `scalars::` +//! namespace, so the matrix-inventory snapshot (which pins the uniform per-type +//! test set) does not mis-read it as a scalar type. +//! +//! All ciphertext is REAL: every payload comes from the committed/generated +//! `fixtures.eql_v2_int4` table (Proxy-encrypted, HMAC + ORE block terms) via +//! `fetch_fixture_payload::`. No synthetic / hand-written encrypted blobs. +//! +//! ## What a constraint on a jsonb-backed domain actually constrains +//! +//! The fixture table stores ONE fixed payload per plaintext. Two reads of the +//! same fixture row return byte-identical jsonb, so "insert the same fetched +//! payload twice" deterministically collides on a UNIQUE jsonb domain column, +//! and an FK referencing that exact jsonb value resolves. This is the same +//! deterministic-test-data property the v2 FK test relies on (see its PRODUCTION +//! LIMITATION comment). In production EQL encryption is non-deterministic at the +//! envelope level: two independent encryptions of the same plaintext produce +//! different jsonb (`c` differs), so a UNIQUE/FK over the raw jsonb domain value +//! provides byte-identity integrity, NOT semantic (plaintext-equality) +//! integrity. The hmac `eq_term` is what carries semantic equality; a UNIQUE +//! constraint on the bare domain column does not consult it. + +use eql_tests::{assert_db_error, fetch_fixture_payload, sql_string_literal}; +use sqlx::PgPool; + +/// Fetch the real fixture ciphertext for an `int4` plaintext as an +/// escaped SQL string literal ready to interpolate as `'{lit}'::jsonb::`. +async fn int4_payload_literal(pool: &PgPool, plaintext: i32) -> anyhow::Result { + let payload = fetch_fixture_payload::(pool, plaintext).await?; + Ok(sql_string_literal(&payload)) +} + +// =========================================================================== +// NOT NULL — on the storage-only `eql_v3.int4` domain column. +// =========================================================================== + +/// A `NOT NULL` column attribute on an `eql_v3.int4` (storage) column rejects a +/// NULL insert (SQLSTATE 23502) and accepts a real encrypted value. +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int4")))] +async fn not_null_on_int4_storage_column(pool: PgPool) -> anyhow::Result<()> { + sqlx::query("CREATE TABLE v3_not_null (id bigint PRIMARY KEY, val eql_v3.int4 NOT NULL)") + .execute(&pool) + .await?; + + // NULL into the NOT NULL column is rejected. NOT NULL is a column attribute, + // not a named constraint, so `constraint()` is None — pin only the SQLSTATE + // (matches the v2 `not_null_constraint_on_encrypted_column` convention). + let err = sqlx::query("INSERT INTO v3_not_null (id, val) VALUES (1, NULL)") + .execute(&pool) + .await + .expect_err("NOT NULL must reject a NULL eql_v3.int4 value"); + assert_db_error(&err, "23502", None); + + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_not_null") + .fetch_one(&pool) + .await?; + assert_eq!(count, 0, "no row after the rejected NULL insert"); + + // A real encrypted value is accepted. + let lit = int4_payload_literal(&pool, 42).await?; + sqlx::query(&format!( + "INSERT INTO v3_not_null (id, val) VALUES (2, {lit}::jsonb::eql_v3.int4)" + )) + .execute(&pool) + .await?; + + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_not_null") + .fetch_one(&pool) + .await?; + assert_eq!(count, 1, "real encrypted value satisfies NOT NULL"); + + Ok(()) +} + +// =========================================================================== +// UNIQUE — on the equality `eql_v3.int4_eq` domain column. +// +// `_eq` is the interesting variant: equality routes through `eq_term` (hmac). +// But a bare UNIQUE constraint on the domain column does NOT use `eq_term` — it +// uses the base type's (jsonb) btree equality on the WHOLE payload. The test +// documents this: identical payload bytes collide; distinct payloads do not. +// =========================================================================== + +/// A `UNIQUE` constraint on an `eql_v3.int4_eq` column rejects a second row +/// carrying the byte-identical fixture payload (23505) and accepts a different +/// plaintext's payload. +/// +/// FINDING — UNIQUE here constrains the RAW JSONB payload value, not the +/// semantic plaintext nor the `eq_term` hmac. The constraint resolves against +/// the domain's base type (`jsonb`) btree equality over the full payload object. +/// Because the fixture returns one fixed payload per plaintext, re-inserting the +/// SAME fetched payload is a byte-identical jsonb and collides. Two DIFFERENT +/// plaintexts have different payloads and are both accepted. In production, two +/// independent (non-deterministic) encryptions of the SAME plaintext would NOT +/// collide on this constraint despite being semantically equal — UNIQUE on a +/// bare encrypted-domain column is byte-identity uniqueness, not +/// plaintext-uniqueness. +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int4")))] +async fn unique_on_int4_eq_column_constrains_raw_payload(pool: PgPool) -> anyhow::Result<()> { + sqlx::query( + "CREATE TABLE v3_unique (id bigint PRIMARY KEY, val eql_v3.int4_eq UNIQUE NOT NULL)", + ) + .execute(&pool) + .await?; + + let p42 = int4_payload_literal(&pool, 42).await?; + let p100 = int4_payload_literal(&pool, 100).await?; + + // First insert of the 42-payload succeeds. + sqlx::query(&format!( + "INSERT INTO v3_unique (id, val) VALUES (1, {p42}::jsonb::eql_v3.int4_eq)" + )) + .execute(&pool) + .await?; + + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_unique") + .fetch_one(&pool) + .await?; + assert_eq!(count, 1, "first encrypted value inserted"); + + // A DIFFERENT plaintext's payload (distinct jsonb) is accepted — UNIQUE does + // not reject distinct payloads. + sqlx::query(&format!( + "INSERT INTO v3_unique (id, val) VALUES (2, {p100}::jsonb::eql_v3.int4_eq)" + )) + .execute(&pool) + .await?; + + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_unique") + .fetch_one(&pool) + .await?; + assert_eq!(count, 2, "distinct encrypted value accepted under UNIQUE"); + + // Re-inserting the BYTE-IDENTICAL 42-payload violates UNIQUE (23505). The + // constraint name is `__key` per PostgreSQL's auto-naming. + let err = sqlx::query(&format!( + "INSERT INTO v3_unique (id, val) VALUES (3, {p42}::jsonb::eql_v3.int4_eq)" + )) + .execute(&pool) + .await + .expect_err("UNIQUE must reject the byte-identical payload"); + assert_db_error(&err, "23505", Some("v3_unique_val_key")); + + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_unique") + .fetch_one(&pool) + .await?; + assert_eq!(count, 2, "count unchanged after the rejected duplicate"); + + Ok(()) +} + +// =========================================================================== +// FOREIGN KEY — child referencing a parent `eql_v3.int4` PRIMARY KEY column. +// +// FK on a jsonb-backed domain IS feasible: a PRIMARY KEY / UNIQUE on the parent +// column resolves against the base type (`jsonb`) btree opclass (jsonb has a +// default btree opclass), so the referenced column has the unique index FK +// requires. This is distinct from the "no operator class on a domain" footgun, +// which is about adding a *custom* index opclass to a domain — a plain +// PK/UNIQUE uses the inherited jsonb btree opclass and works. +// =========================================================================== + +/// A FOREIGN KEY from a child `eql_v3.int4` column to a parent `eql_v3.int4` +/// PRIMARY KEY column: a matching (byte-identical) reference is accepted, a +/// dangling reference is rejected (23503). +/// +/// FINDING — FK on a jsonb-backed `eql_v3` domain is FEASIBLE. The parent +/// PRIMARY KEY resolves against the inherited jsonb btree opclass, giving FK the +/// unique index it requires; no custom domain opclass is involved (so the +/// "no operator class on a domain" footgun does not apply to a plain PK). As +/// with v2 and with UNIQUE above, referential integrity is over the RAW JSONB +/// payload (byte identity), not the semantic plaintext: the child reference +/// resolves only because the test reuses the exact fixture payload bytes. Under +/// production non-deterministic encryption, a re-encryption of the same +/// plaintext would be a different jsonb and would NOT satisfy the FK — so FK on +/// a bare encrypted-domain column does not provide plaintext-level referential +/// integrity. +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int4")))] +async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> { + // Parent with a PRIMARY KEY on an eql_v3.int4 (jsonb-backed domain) column. + sqlx::query("CREATE TABLE v3_parent (ref eql_v3.int4 PRIMARY KEY)") + .execute(&pool) + .await?; + + // Child referencing the parent encrypted column. + sqlx::query( + "CREATE TABLE v3_child ( + id bigint PRIMARY KEY, + parent_ref eql_v3.int4 REFERENCES v3_parent(ref) + )", + ) + .execute(&pool) + .await?; + + // Sanity: the FK constraint exists. + let fk_exists: bool = sqlx::query_scalar( + "SELECT EXISTS ( + SELECT FROM information_schema.table_constraints + WHERE table_name = 'v3_child' AND constraint_type = 'FOREIGN KEY' + )", + ) + .fetch_one(&pool) + .await?; + assert!(fk_exists, "FK constraint must exist on v3_child"); + + let p42 = int4_payload_literal(&pool, 42).await?; + let p100 = int4_payload_literal(&pool, 100).await?; + + // Seed the parent with the 42-payload. + sqlx::query(&format!( + "INSERT INTO v3_parent (ref) VALUES ({p42}::jsonb::eql_v3.int4)" + )) + .execute(&pool) + .await?; + + // Child row with a byte-identical reference resolves (deterministic fixture + // bytes), so the FK is satisfied. + sqlx::query(&format!( + "INSERT INTO v3_child (id, parent_ref) VALUES (1, {p42}::jsonb::eql_v3.int4)" + )) + .execute(&pool) + .await?; + + let child_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_child") + .fetch_one(&pool) + .await?; + assert_eq!(child_count, 1, "matching FK reference accepted"); + + // Child row referencing a payload NOT present in the parent (different + // plaintext → different jsonb) violates the FK (23503). + let err = sqlx::query(&format!( + "INSERT INTO v3_child (id, parent_ref) VALUES (2, {p100}::jsonb::eql_v3.int4)" + )) + .execute(&pool) + .await + .expect_err("FK must reject a dangling reference"); + assert_db_error(&err, "23503", Some("v3_child_parent_ref_fkey")); + + let child_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_child") + .fetch_one(&pool) + .await?; + assert_eq!(child_count, 1, "count unchanged after the rejected FK insert"); + + Ok(()) +} From 80b9e2e7624bd5f851cf8790c3172b90cf62f6e5 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sun, 21 Jun 2026 14:45:05 +1000 Subject: [PATCH 293/599] docs(test): fix int4_payload_literal doc-comment quoting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sql_string_literal already wraps the value in single quotes and all call sites interpolate as {lit}::jsonb (no surrounding quotes); the comment's '{lit}'::jsonb implied double-quoting. Comment only — no behaviour change. Review note: CHANGELOG #239 attribution for the ore_block COMMUTATOR fix verified correct (clauses introduced in 601538f9, merged via #239). --- tests/sqlx/tests/encrypted_domain/constraints.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlx/tests/encrypted_domain/constraints.rs b/tests/sqlx/tests/encrypted_domain/constraints.rs index d1b621f0d..a05762bb0 100644 --- a/tests/sqlx/tests/encrypted_domain/constraints.rs +++ b/tests/sqlx/tests/encrypted_domain/constraints.rs @@ -33,7 +33,7 @@ use eql_tests::{assert_db_error, fetch_fixture_payload, sql_string_literal}; use sqlx::PgPool; /// Fetch the real fixture ciphertext for an `int4` plaintext as an -/// escaped SQL string literal ready to interpolate as `'{lit}'::jsonb::`. +/// escaped SQL string literal ready to interpolate as `{lit}::jsonb::`. async fn int4_payload_literal(pool: &PgPool, plaintext: i32) -> anyhow::Result { let payload = fetch_fixture_payload::(pool, plaintext).await?; Ok(sql_string_literal(&payload)) From 17f78f3ecb91380e505c17a2b7f3de8d79a7749e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sun, 21 Jun 2026 14:47:07 +1000 Subject: [PATCH 294/599] fix(ci): install cargo-binstall via prebuilt aqua backend, not source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every CI job runs mise-action, which installs the mise.toml tools. The bootstrap tool `cargo:cargo-binstall = "latest"` used the cargo: backend, compiling cargo-binstall from source. The latest cargo-binstall now pulls vergen@10.0.0 (MSRV rustc 1.95), but the toolchain bootstrapping mise's cargo backend on the runner is older, so the build fails with exit 101. Because cargo-binstall bootstraps every other cargo tool (sqlx-cli, cargo-nextest, cargo-expand), its failure cascades and `mise install` exits 1 — taking down every workflow before any real work runs. Switch to the registry name `cargo-binstall`, which mise resolves via the aqua backend to a prebuilt binary (aqua:cargo-bins/cargo-binstall). A prebuilt binary has no compiler/MSRV dependency; the downstream cargo: tools are then fetched as prebuilt binaries through it. --- mise.toml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 3b5600c02..45db8c820 100644 --- a/mise.toml +++ b/mise.toml @@ -9,7 +9,14 @@ [tools] "rust" = { version = "latest", components = "rustc,rust-std,cargo,rustfmt,rust-docs,clippy" } -"cargo:cargo-binstall" = "latest" +# Use the registry (aqua) backend to download a prebuilt cargo-binstall binary +# rather than `cargo:cargo-binstall`, which compiles it from source. A source +# build now fails in CI: the latest cargo-binstall pulls vergen@10.0.0 (MSRV +# rustc 1.95), but the toolchain bootstrapping mise's cargo backend is older, +# so every job that runs mise-action dies before any tools install. The +# prebuilt binary has no compiler/MSRV dependency. Downstream cargo: tools +# below are then fetched as prebuilt binaries via this cargo-binstall. +"cargo-binstall" = "latest" "cargo:sqlx-cli" = "latest" # Installed via the already-present cargo-binstall (fast in CI). Drives the # sharded sqlx suite: `cargo nextest archive` builds the test binaries once and From c6343d4e1508c079c0ea0fc7a4dab0b2dd2901d5 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sun, 21 Jun 2026 16:07:33 +1000 Subject: [PATCH 295/599] docs(changelog): fix stale eql_v2_int4_ord_ore spelling in COMMUTATOR entry The renamed domain is eql_v3.int4_ord_ore (post schema-namespace move), matching the spelling used elsewhere in the same [Unreleased] section. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8004c343..1eeb6bd50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Fixed -- **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v2_int4_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) +- **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.int4_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamptz` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) From 546f4c60856ad77280a84efb6d16f62cc4c5aabf Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sun, 21 Jun 2026 17:50:06 +1000 Subject: [PATCH 296/599] style(test): rustfmt wrap over-long assert_eq! in constraints suite --- tests/sqlx/tests/encrypted_domain/constraints.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/sqlx/tests/encrypted_domain/constraints.rs b/tests/sqlx/tests/encrypted_domain/constraints.rs index a05762bb0..ef4665134 100644 --- a/tests/sqlx/tests/encrypted_domain/constraints.rs +++ b/tests/sqlx/tests/encrypted_domain/constraints.rs @@ -248,7 +248,10 @@ async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> let child_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM v3_child") .fetch_one(&pool) .await?; - assert_eq!(child_count, 1, "count unchanged after the rejected FK insert"); + assert_eq!( + child_count, 1, + "count unchanged after the rejected FK insert" + ); Ok(()) } From a33ea417cff2efb716d98123d3e39fe95c397d49 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 13:23:31 +1000 Subject: [PATCH 297/599] ci: publish eql_v3 installer + uninstaller as release artifacts --- .github/workflows/release-eql.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml index 03532aba7..7f0c17826 100644 --- a/.github/workflows/release-eql.yml +++ b/.github/workflows/release-eql.yml @@ -73,6 +73,8 @@ jobs: path: | release/cipherstash-encrypt.sql release/cipherstash-encrypt-uninstall.sql + release/cipherstash-encrypt-v3.sql + release/cipherstash-encrypt-v3-uninstall.sql - name: Publish EQL release artifacts uses: softprops/action-gh-release@v2 @@ -83,6 +85,8 @@ jobs: release/cipherstash-encrypt-uninstall.sql release/cipherstash-encrypt-supabase.sql release/cipherstash-encrypt-uninstall-supabase.sql + release/cipherstash-encrypt-v3.sql + release/cipherstash-encrypt-v3-uninstall.sql - name: Notify Multitudes if: github.event_name == 'release' From 0f99e28c91b715cfb4b5bc3cf7eaba39bed9ccda Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 13:23:48 +1000 Subject: [PATCH 298/599] docs(changelog): note eql_v3 installer is now a published release asset --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eeb6bd50..bf775f463 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added +- **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([release-eql.yml](.github/workflows/release-eql.yml)) - **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see `docs/decisions/2026-06-10-eql-v3-json-type-kind.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) From c9241dbb67f76dfbd85f02727f0d584b27fc9384 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 13:39:51 +1000 Subject: [PATCH 299/599] docs(changelog): link eql_v3 installer entry to PR #307 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf775f463..95c440d57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added -- **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([release-eql.yml](.github/workflows/release-eql.yml)) +- **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) - **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see `docs/decisions/2026-06-10-eql-v3-json-type-kind.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) From c39bb3179f9a1b77c6c1e847ab66047b8aef32fe Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 20 Jun 2026 13:45:13 +1000 Subject: [PATCH 300/599] docs/ci: add release:preview task + alpha runbook for eql_v3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds `mise run release:preview` (tasks/release/preview.sh): derives the next `eql--.` prerelease tag, clean-builds and verifies the v3 installer/uninstaller, then cuts a GitHub prerelease (triggering release-eql.yml). It does not touch CHANGELOG.md — previews keep their entries under [Unreleased], matching the verify-changelog prerelease gate. Adds docs/development/releasing-an-alpha.md documenting the scripted and manual paths, the flag set, and the "push the branch; no merge required" prerequisite. Anchors the .gitignore `release/` build-artifact pattern to `/release/` so it no longer also ignores the new tasks/release/ task directory. --- .gitignore | 4 +- docs/development/releasing-an-alpha.md | 120 +++++++++++++++++++++++++ tasks/release/preview.sh | 89 ++++++++++++++++++ 3 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 docs/development/releasing-an-alpha.md create mode 100755 tasks/release/preview.sh diff --git a/.gitignore b/.gitignore index 98b640122..361dc3aed 100644 --- a/.gitignore +++ b/.gitignore @@ -204,8 +204,8 @@ cipherstash-proxy.toml # turbo repo .turbo -# build artifacts -release/ +# build artifacts (top-level dir only; not tasks/release/) +/release/ # Generated documentation docs/api/ diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md new file mode 100644 index 000000000..4ea4a754a --- /dev/null +++ b/docs/development/releasing-an-alpha.md @@ -0,0 +1,120 @@ +# Releasing an `eql_v3` alpha + +A concise runbook for cutting a **prerelease** (alpha/beta/rc) of EQL — primarily +the standalone `eql_v3` surface. For a final (non-prerelease) release, follow the +**"Cutting a release"** section of `CLAUDE.md` instead; the difference is called out below. + +## What ships + +The release workflow (`.github/workflows/release-eql.yml`, triggered by `release: published`) +builds with `mise run build --version ` and attaches these artifacts to the GitHub Release: + +| Artifact | What it installs | +|----------|------------------| +| `cipherstash-encrypt.sql` / `-uninstall.sql` | Full EQL (`eql_v2` + `eql_v3`) | +| `cipherstash-encrypt-supabase.sql` / `-uninstall-supabase.sql` | Supabase variant | +| `cipherstash-encrypt-v3.sql` / `-v3-uninstall.sql` | **Standalone, self-contained `eql_v3` surface** (no `eql_v2`) | + +The `eql_v3` installer is the one an alpha consumer wants: it installs the `eql_v3` +schema into a database with no `eql_v2` present. + +## Why a prerelease is different + +The `verify-changelog` job is gated to **real (non-prerelease) `eql-*` releases**: + +```yaml +if: ${{ github.event_name == 'release' && contains(github.event.release.tag_name, 'eql') && github.event.release.prerelease == false }} +``` + +So for a prerelease you **do not** promote `[Unreleased]` → `[]` in `CHANGELOG.md`. +Entries stay under `## [Unreleased]` until a final release is cut. The `build-and-publish` +and `publish-docs` jobs still run (they only require `eql` in the tag), so the artifacts are +built and attached as normal. + +## Scripted path (recommended) + +`mise run release:preview` (`tasks/release/preview.sh`) does steps 1, 3 and 4 below: +it derives the next preview tag, does a clean build, verifies the v3 installer/uninstaller +are present and non-empty, then creates the GitHub prerelease (which triggers the workflow). +It does **not** touch `CHANGELOG.md` — previews keep their entries under `[Unreleased]`. + +The tag is `eql--.`. "Preview" is the umbrella; `--channel` picks +`alpha` → `beta` → `rc` and `` auto-increments per channel: + +```bash +# Derive the next eql-3.0.0-alpha.N tag, build-verify, and cut against the current branch: +mise run release:preview + +# See what it would do without creating anything: +mise run release:preview --dry-run + +# Override the base version / channel / exact tag / target: +mise run release:preview --version 3.0.0 --channel beta # -> eql-3.0.0-beta.1 +mise run release:preview --tag eql-3.0.0-rc.1 --target v3-publish-release-artifacts +``` + +| Flag | Meaning | Default | +|------|---------|---------| +| `--version` | base SemVer (the `` in the tag) | `3.0.0` | +| `--channel` | preview channel: `alpha` \| `beta` \| `rc` | `alpha` | +| `--tag` | exact tag to cut, bypassing derivation | (derived) | +| `--target` | branch/commit to tag | current branch | +| `--dry-run` | print the plan, create nothing | off | + +It refuses to reuse an existing tag, requires an authenticated `gh`, and requires the tag to +start with `eql-` (otherwise the workflow's build/docs jobs are skipped). After it runs, jump +to **"Confirm the workflow attached the artifacts"** and the smoke test below. + +## Steps (manual equivalent) + +1. **Pick a tag.** It must contain `eql` so the build/docs jobs run, and use a SemVer + prerelease suffix: + ``` + eql-3.0.0-alpha.1 + ``` + +2. **Sanity-check `[Unreleased]`.** Confirm the v3 entries you expect are present and coherent. + Do **not** rename the section — the prerelease keeps them under `[Unreleased]`. + +3. **Verify the build produces the v3 artifacts locally** (the same files the workflow attaches): + ```bash + mise run clean && mise run build + ls -la release/cipherstash-encrypt-v3.sql release/cipherstash-encrypt-v3-uninstall.sql + ``` + Both must be non-empty (the installer is ~750KB+; the uninstaller is small). + +4. **Cut the prerelease.** Target the branch carrying the v3 surface and mark it `--prerelease`: + ```bash + gh release create eql-3.0.0-alpha.1 \ + --target v3-publish-release-artifacts \ + --prerelease \ + --title "eql-3.0.0-alpha.1" \ + --notes "Alpha of the standalone eql_v3 surface. See [Unreleased] in CHANGELOG.md." + ``` + (Adjust `--target` to whatever branch/commit the v3 work lives on at release time.) + +5. **Confirm the workflow attached the artifacts.** Watch the run and check the release page: + ```bash + gh run watch + gh release view eql-3.0.0-alpha.1 + ``` + The release should list all six `.sql` artifacts, including + `cipherstash-encrypt-v3.sql` and `cipherstash-encrypt-v3-uninstall.sql`. + +## Smoke-test the alpha + +Install the standalone v3 surface into a clean database (no `eql_v2`) and confirm it loads: + +```bash +gh release download eql-3.0.0-alpha.1 -p 'cipherstash-encrypt-v3.sql' +psql "$DATABASE_URL" -f cipherstash-encrypt-v3.sql +psql "$DATABASE_URL" -c "\dn eql_v3" # eql_v3 schema present +``` + +## Promoting to a final release later + +When the alpha graduates to a real release, follow `CLAUDE.md` → **"Cutting a release"**: +rename `## [Unreleased]` to `## [] — YYYY-MM-DD`, add a fresh empty `[Unreleased]`, +update the link references at the bottom of `CHANGELOG.md`, then cut a **non-prerelease** +GitHub release whose body is the new versioned section verbatim. The `verify-changelog` +job then enforces that the `## []` section exists at the tag. diff --git a/tasks/release/preview.sh b/tasks/release/preview.sh new file mode 100755 index 000000000..b04c7c3b7 --- /dev/null +++ b/tasks/release/preview.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +#MISE description="Cut a preview (prerelease) of EQL: derive tag, verify build, create GitHub prerelease" +#USAGE flag "--version " help="Base SemVer for the release, e.g. 3.0.0" default="3.0.0" +#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha" +#USAGE flag "--tag " help="Exact tag to cut (overrides --version/--channel derivation)" default="" +#USAGE flag "--target " help="Branch or commit to tag" default="" +#USAGE flag "--dry-run" help="Print what would happen without creating the release" + +set -euo pipefail + +# Cut a PREVIEW (prerelease) of EQL — alpha, beta, or rc — primarily the +# standalone eql_v3 surface. "Preview" is the umbrella; --channel picks alpha/beta/rc. +# +# This scripts steps 1, 3 and 4 of docs/development/releasing-an-alpha.md: +# - derive the next preview tag (eql--.) +# - verify the build produces the v3 installer/uninstaller +# - create the GitHub prerelease (which triggers .github/workflows/release-eql.yml) +# +# It deliberately does NOT touch CHANGELOG.md: previews keep their entries +# under [Unreleased] (the verify-changelog job is gated to prerelease == false). + +# mise exposes USAGE flags as environment variables; default for bare `bash`. +version="${usage_version:-3.0.0}" +channel="${usage_channel:-alpha}" +tag="${usage_tag:-}" +target="${usage_target:-}" +dry_run="${usage_dry_run:-false}" + +err() { echo "error: $*" >&2; exit 1; } + +command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)" +gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'" + +# --- Derive the tag -------------------------------------------------------- +# If an exact --tag was given, use it. Otherwise find the highest existing +# eql--. tag and increment N (starting at 1). +if [[ -z "$tag" ]]; then + prefix="eql-${version}-${channel}." + # Highest existing N for this base+channel, or 0 if none. + last_n=$(git tag --list "${prefix}*" \ + | sed -n "s/^${prefix}\([0-9]\{1,\}\)$/\1/p" \ + | sort -n | tail -1) + next_n=$(( ${last_n:-0} + 1 )) + tag="${prefix}${next_n}" +fi + +[[ "$tag" == eql-* ]] || err "tag must start with 'eql-' (got '$tag') or the build/docs jobs won't run" + +if git rev-parse -q --verify "refs/tags/${tag}" >/dev/null; then + err "tag '${tag}' already exists" +fi + +# Default the release target to the current branch. +if [[ -z "$target" ]]; then + target=$(git rev-parse --abbrev-ref HEAD) +fi + +# --- Verify the build produces the v3 artifacts ---------------------------- +echo "==> Building (clean) to verify v3 artifacts for ${tag}" +mise run clean +mise run build --version "${tag}" + +v3_installer="release/cipherstash-encrypt-v3.sql" +v3_uninstaller="release/cipherstash-encrypt-v3-uninstall.sql" +for f in "$v3_installer" "$v3_uninstaller"; do + [[ -s "$f" ]] || err "expected non-empty build artifact missing: $f" +done +echo "==> v3 artifacts present:" +ls -la "$v3_installer" "$v3_uninstaller" + +# --- Create the prerelease ------------------------------------------------- +notes="Preview (${channel}) of the standalone eql_v3 surface. See [Unreleased] in CHANGELOG.md." + +if [[ "$dry_run" == "true" ]]; then + echo "==> DRY RUN — would create prerelease:" + echo " gh release create ${tag} --target ${target} --prerelease --title ${tag}" + exit 0 +fi + +echo "==> Creating GitHub prerelease ${tag} (target: ${target})" +gh release create "${tag}" \ + --target "${target}" \ + --prerelease \ + --title "${tag}" \ + --notes "${notes}" + +echo "==> Done. The release workflow attaches artifacts on tag push." +echo " Watch: gh run watch" +echo " Verify: gh release view ${tag}" From 1826c60064620ceb1ab55a1a5af3849b6bc67ba3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sun, 21 Jun 2026 14:52:00 +1000 Subject: [PATCH 301/599] ci: validate --channel against allowlist in release:preview Reject any --channel value other than alpha|beta|rc before it flows into the derived tag prefix and release notes, so an invalid channel fails fast with a clear error instead of producing a malformed tag. --- tasks/release/preview.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasks/release/preview.sh b/tasks/release/preview.sh index b04c7c3b7..667c444d2 100755 --- a/tasks/release/preview.sh +++ b/tasks/release/preview.sh @@ -28,6 +28,12 @@ dry_run="${usage_dry_run:-false}" err() { echo "error: $*" >&2; exit 1; } +# Validate the channel against the allowlist before it flows into tag/notes. +case "$channel" in + alpha|beta|rc) ;; + *) err "invalid --channel '${channel}' (expected: alpha | beta | rc)" ;; +esac + command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)" gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'" From 543ddcb75a07fdf9e72e66981d69ce016e39ee83 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 08:54:14 +1000 Subject: [PATCH 302/599] docs: add language identifier to fenced code block (MD040) --- docs/development/releasing-an-alpha.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md index 4ea4a754a..a8c860b04 100644 --- a/docs/development/releasing-an-alpha.md +++ b/docs/development/releasing-an-alpha.md @@ -69,7 +69,7 @@ to **"Confirm the workflow attached the artifacts"** and the smoke test below. 1. **Pick a tag.** It must contain `eql` so the build/docs jobs run, and use a SemVer prerelease suffix: - ``` + ```text eql-3.0.0-alpha.1 ``` From b8d4184b39dc0bc44392f9964f1886b3a1c47f70 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:18:10 +1000 Subject: [PATCH 303/599] test(fixtures): rename scalar fixture prefix eql_v2_ -> eql_v3_ in macro --- crates/eql-tests-macros/src/lib.rs | 44 +++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index a2cf480aa..1132d00c5 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -221,18 +221,18 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { quote! { #(#impls)* } } -/// Emit one `pub mod eql_v2_ { ... }` per entry. See +/// Emit one `pub mod eql_v3_ { ... }` per entry. See /// [`emit_scalar_fixture_modules`]. fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { let mods = list.entries.iter().map(|e| { let token_str = e.token.to_string(); let rust_type = &e.rust_type; - let mod_ident = format_ident!("eql_v2_{}", e.token); - let fixture_name = format!("eql_v2_{}", token_str); + let mod_ident = format_ident!("eql_v3_{}", e.token); + let fixture_name = format!("eql_v3_{}", token_str); if is_int_token(&token_str) { let values = values_const_ident(&e.token); quote! { - #[doc = concat!("`eql_v2_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] + #[doc = concat!("`eql_v3_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] pub mod #mod_ident { use ::eql_scalars::#values as VALUES; // `scalar_fixture!` is `#[macro_export]`ed by `eql-tests`; @@ -272,7 +272,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { ) }; quote! { - #[doc = concat!("`eql_v2_", #token_str, "` hand-written scalar fixture — generated by `scalar_types!`.")] + #[doc = concat!("`eql_v3_", #token_str, "` hand-written scalar fixture — generated by `scalar_types!`.")] pub mod #mod_ident { use crate::scalar_domains::#values_fn as values; crate::scalar_fixture!(#discriminator, #fixture_name, #rust_type, values()); @@ -287,7 +287,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { fn fixture_dispatch_tokens(list: &ScalarList) -> TokenStream2 { let arms = list.entries.iter().map(|e| { let token_str = e.token.to_string(); - let mod_ident = format_ident!("eql_v2_{}", e.token); + let mod_ident = format_ident!("eql_v3_{}", e.token); // Every scalar fixture is generated from its fixed curated catalog // values via `run()`. quote! { @@ -328,7 +328,7 @@ fn matrix_suite_for_entry( has_search: bool, ) -> TokenStream2 { let token_str = token.to_string(); - let eql_type = format!("eql_v2_{}", token_str); + let eql_type = format!("eql_v3_{}", token_str); // `storage_only` is checked FIRST: a storage-only type is also `eq_only` // (no `_ord` domain), so the eq-only arm would otherwise wrongly select // `caps = [eq]` and emit equality tests against a domain that has no `_eq`. @@ -344,7 +344,7 @@ fn matrix_suite_for_entry( quote! { caps = [eq, ord] } }; quote! { - #[doc = concat!("`eql_v2_", #token_str, "` matrix suite — generated by `scalar_types!`.")] + #[doc = concat!("`eql_v3_", #token_str, "` matrix suite — generated by `scalar_types!`.")] pub mod #token { ::eql_tests::scalar_matrix! { suite = #token, @@ -386,10 +386,10 @@ pub fn emit_scalar_type_impls(input: TokenStream) -> TokenStream { scalar_type_impls_tokens(&list).into() } -/// Emit one `pub mod eql_v2_ { ... }` per entry. +/// Emit one `pub mod eql_v3_ { ... }` per entry. /// /// Invoked via `scalar_types!` in `tests/sqlx/src/fixtures/mod.rs`, so the -/// modules land at `crate::fixtures::eql_v2_` — the path the matrix and +/// modules land at `crate::fixtures::eql_v3_` — the path the matrix and /// fixture dispatch reference. Each body is a `use` of the catalog value const /// plus a `scalar_fixture!` invocation. #[proc_macro] @@ -470,10 +470,10 @@ mod tests { #[test] fn fixture_modules_emit_named_mods_with_scalar_fixture() { let out = norm(&scalar_fixture_modules_tokens(&sample())); - assert!(out.contains("pub mod eql_v2_int4")); - assert!(out.contains("pub mod eql_v2_int8")); + assert!(out.contains("pub mod eql_v3_int4")); + assert!(out.contains("pub mod eql_v3_int8")); assert!(out.contains("crate :: scalar_fixture !")); - assert!(out.contains(r#""eql_v2_int4""#)); + assert!(out.contains(r#""eql_v3_int4""#)); assert!(out.contains(":: eql_scalars :: INT4_VALUES as VALUES")); // Integer entries stamp the `int` kind discriminator. assert!(out.contains("int ,")); @@ -489,7 +489,7 @@ mod tests { assert!(!impls.contains("NaiveDate")); // Fixture-module emitter stamps the temporal kind + harness accessor. let mods = norm(&scalar_fixture_modules_tokens(&list)); - assert!(mods.contains("pub mod eql_v2_date")); + assert!(mods.contains("pub mod eql_v3_date")); assert!(mods.contains("temporal ,")); assert!(mods.contains("date_values")); // Matrix + dispatch emitters include the temporal entry like any other. @@ -556,7 +556,7 @@ mod tests { // Fixture-module emitter stamps the text kind + harness accessor. The // `text` discriminator drives the Match index (payloads carry `bf`). let mods = norm(&scalar_fixture_modules_tokens(&list)); - assert!(mods.contains("pub mod eql_v2_text")); + assert!(mods.contains("pub mod eql_v3_text")); assert!(mods.contains("text ,"), "got: {mods}"); assert!(mods.contains("text_values"), "got: {mods}"); // Matrix + dispatch emitters include the text entry like any other. @@ -580,7 +580,7 @@ mod tests { "float must skip the generated impl (hand-written instead)" ); let mods = norm(&scalar_fixture_modules_tokens(&list)); - assert!(mods.contains("pub mod eql_v2_float4")); + assert!(mods.contains("pub mod eql_v3_float4")); assert!(mods.contains("float ,"), "got: {mods}"); assert!(mods.contains("float4_values"), "got: {mods}"); let suites = norm(&scalar_matrix_suites_tokens(&list)); @@ -684,7 +684,7 @@ mod tests { "bool must skip the generated impl (hand-written instead)" ); let mods = norm(&scalar_fixture_modules_tokens(&list)); - assert!(mods.contains("pub mod eql_v2_bool")); + assert!(mods.contains("pub mod eql_v3_bool")); assert!(mods.contains("storage ,"), "got: {mods}"); assert!(mods.contains("bool_values"), "got: {mods}"); let suites = norm(&scalar_matrix_suites_tokens(&list)); @@ -696,13 +696,13 @@ mod tests { // values via `run()`. assert!( dispatch.contains( - r#""bool" => :: eql_tests :: fixtures :: eql_v2_bool :: spec () . run () . await"# + r#""bool" => :: eql_tests :: fixtures :: eql_v3_bool :: spec () . run () . await"# ), "bool must dispatch to run(), got: {dispatch}" ); assert!( dispatch.contains( - r#""int4" => :: eql_tests :: fixtures :: eql_v2_int4 :: spec () . run () . await"# + r#""int4" => :: eql_tests :: fixtures :: eql_v3_int4 :: spec () . run () . await"# ), "int4 must dispatch to run(), got: {dispatch}" ); @@ -720,7 +720,7 @@ mod tests { assert!(out.contains("async fn generate_for_token")); assert!(out.contains(r#""int4" =>"#)); assert!(out.contains(r#""int8" =>"#)); - assert!(out.contains(":: eql_tests :: fixtures :: eql_v2_int4 :: spec")); + assert!(out.contains(":: eql_tests :: fixtures :: eql_v3_int4 :: spec")); // Loud catch-all preserved. assert!(out.contains("other =>")); assert!(out.contains("no fixture generator wired")); @@ -736,10 +736,10 @@ mod tests { // (and the snapshot) are unchanged. assert!(out.contains("suite = int4")); assert!(out.contains("scalar = i32")); - assert!(out.contains(r#"eql_type = "eql_v2_int4""#)); + assert!(out.contains(r#"eql_type = "eql_v3_int4""#)); assert!(out.contains("suite = int8")); assert!(out.contains("scalar = i64")); - assert!(out.contains(r#"eql_type = "eql_v2_int8""#)); + assert!(out.contains(r#"eql_type = "eql_v3_int8""#)); } #[test] From 1c8385d8c193f2b151d9ed1137cbbfc434eac975 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:18:24 +1000 Subject: [PATCH 304/599] test(fixtures): rename fixture table + doubles builders to eql_v3_ --- tests/sqlx/src/fixtures/eql_doubles.rs | 10 +++++----- tests/sqlx/src/scalar_domains.rs | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/sqlx/src/fixtures/eql_doubles.rs b/tests/sqlx/src/fixtures/eql_doubles.rs index a51b046c3..22a2e19c9 100644 --- a/tests/sqlx/src/fixtures/eql_doubles.rs +++ b/tests/sqlx/src/fixtures/eql_doubles.rs @@ -2,9 +2,9 @@ //! carries equal-plaintext / distinct-ciphertext rows. //! //! Hand-written and non-catalog (like `v3_numeric_collision`): the catalog -//! `eql_v2_` fixture is the curated `fixture_values()` set exactly (the +//! `eql_v3_` fixture is the curated `fixture_values()` set exactly (the //! `scalars::*` matrix asserts that), so it has no room for duplicate -//! plaintexts. These tiny sibling tables (`fixtures.eql_v2__doubles`) exist +//! plaintexts. These tiny sibling tables (`fixtures.eql_v3__doubles`) exist //! only so the credential-free fixture suite can prove "two independent //! encryptions of one value compare equal" without any fresh test-time //! encryption. Read ONLY by `property::cross_ciphertext`, never by the matrix. @@ -15,7 +15,7 @@ //! equal-plaintext pairs. Each value is encrypted independently by the driver, //! so a repeated plaintext lands as a distinct ciphertext row. //! -//! Gitignored output: tests/sqlx/fixtures/eql_v2__doubles.sql +//! Gitignored output: tests/sqlx/fixtures/eql_v3__doubles.sql //! (regenerated by `mise run fixture:generate:all`). use anyhow::Result; @@ -44,7 +44,7 @@ fn doubled(values: &[T]) -> Vec { values.iter().flat_map(|v| [v.clone(), v.clone()]).collect() } -/// Generate `fixtures.eql_v2__doubles` — the first `DISTINCT` catalog values, +/// Generate `fixtures.eql_v3__doubles` — the first `DISTINCT` catalog values, /// each encrypted twice. Generic over the type: the fixture name, the plaintext /// source, and the bloom-index decision are all derived from `T` (and the /// catalog), so there are no per-token strings to keep in sync. Indexes mirror @@ -54,7 +54,7 @@ async fn generate_doubles_for() -> Result<()> where T: ScalarType + FixtureValue, { - let name = format!("eql_v2_{}_doubles", T::PG_TYPE); + let name = format!("eql_v3_{}_doubles", T::PG_TYPE); let head: Vec = ::fixture_values() .iter() .take(DISTINCT) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index b8071309c..8401d7175 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -4,7 +4,7 @@ //! float8) is one ` => ` line in the `scalar_types!` list //! (`scalar_types.rs`) plus an `EqlPlaintext` impl and a catalog row. //! The `impl ScalarType` below is generated from that list. Everything -//! else — the four `eql_v2_{,_eq,_ord,_ord_ore}` domains, per-domain +//! else — the four `eql_v3_{,_eq,_ord,_ord_ore}` domains, per-domain //! payload shapes, supported operators, index extractor expressions, //! ground-truth result sets — is derived from `T::PG_TYPE`, //! `T::fixture_values()`, and the `Variant` enum. @@ -53,9 +53,9 @@ pub trait ScalarType: /// the row is absent. fn fixture_values() -> &'static [Self]; - /// `fixtures.eql_v2_`. + /// `fixtures.eql_v3_`. fn fixture_table_name() -> String { - format!("fixtures.eql_v2_{}", Self::PG_TYPE) + format!("fixtures.eql_v3_{}", Self::PG_TYPE) } /// SQL domain the comparable value is cast to. Default: the generated @@ -344,7 +344,7 @@ macro_rules! temporal_values { /// `$variant` is the `eql_scalars::Fixture` variant this scalar's rows use /// (`Text`/`Numeric`/`Date`/`Timestamptz`); `$parse` maps each `&Fixture` to /// `$ty` (and owns its own loud "wrong variant" panic). The accessor is `pub` so -/// the `eql_v2_` fixture module can hand the slice to `scalar_fixture!`. +/// the `eql_v3_` fixture module can hand the slice to `scalar_fixture!`. macro_rules! lazy_values { ( cell = $cell:ident, @@ -371,7 +371,7 @@ macro_rules! lazy_values { // `temporal_values!` — the chrono analogue of the integer `int_values!` path. // Values can't be a `const` slice (`from_ymd_opt` is not `const`), so they live // in a `LazyLock>` behind `date_values()`. `date_values()` is public so -// the `eql_v2_date` fixture module (emitted by `scalar_types!(fixture_modules)`) +// the `eql_v3_date` fixture module (emitted by `scalar_types!(fixture_modules)`) // can hand the slice to `scalar_fixture!`. temporal_values! { cell = DATE_VALUES_CELL, @@ -462,12 +462,12 @@ mod timestamptz_value_guards { // `text` is hand-written rather than driven by `temporal_values!`: it is an // owned `String` (not chrono-backed), so it materialises its values from the // `eql_scalars::TEXT_VALUES` const slice rather than parsing catalog strings. -// `text_values()` is public so the `eql_v2_text` fixture module (emitted by +// `text_values()` is public so the `eql_v3_text` fixture module (emitted by // `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. // `text`'s value wiring now goes through the shared `lazy_values!` materializer // (the same macro `numeric` uses), parsing the catalog's `Fixture::Text` rows -// directly. `text_values()` stays public so the `eql_v2_text` fixture module +// directly. `text_values()` stays public so the `eql_v3_text` fixture module // (emitted by `scalar_types!(fixture_modules)`) can hand the slice to // `scalar_fixture!`. The `to_sql_literal` / `mid_pivot` / `MatchScalar` methods // below are `text`'s genuinely-differing bits and remain hand-written. @@ -545,7 +545,7 @@ impl MatchScalar for String { // `numeric`'s value wiring goes through the shared `lazy_values!` materializer // (same as `text`), parsing the catalog's `Fixture::Numeric` strings into -// `Decimal`. `numeric_values()` stays public so the `eql_v2_numeric` fixture +// `Decimal`. `numeric_values()` stays public so the `eql_v3_numeric` fixture // module (emitted by `scalar_types!(fixture_modules)`) can hand the slice to // `scalar_fixture!`. `numeric` has no `to_sql_literal`/`mid_pivot` overrides — // only the value materialization is shared. @@ -638,7 +638,7 @@ mod numeric_value_guards { // catalog's two `Fixture::Bool` rows. /// Typed `bool` fixture values, built once from `bool`'s catalog row, in catalog -/// order (`[false, true]`). Public so the `eql_v2_bool` fixture module (emitted +/// order (`[false, true]`). Public so the `eql_v3_bool` fixture module (emitted /// by `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. static BOOL_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock::new(|| { eql_scalars::BOOL @@ -651,7 +651,7 @@ static BOOL_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock::n .collect() }); -/// The `bool` fixture values, in catalog order. Public so the `eql_v2_bool` +/// The `bool` fixture values, in catalog order. Public so the `eql_v3_bool` /// fixture module can hand the slice to `scalar_fixture!`. pub fn bool_values() -> &'static [bool] { &BOOL_VALUES_CELL @@ -696,7 +696,7 @@ mod bool_value_tests { assert_eq!(::PG_TYPE, "bool"); assert_eq!( ::fixture_table_name(), - "fixtures.eql_v2_bool" + "fixtures.eql_v3_bool" ); } } @@ -875,7 +875,7 @@ impl std::fmt::Display for F8 { // `Fixture::Float` strings into the newtype. Rust's `str::parse::` accepts // `"inf"`/`"-inf"`/`"nan"`, so the ±Inf pivots parse natively (NaN is excluded by // the catalog guards). `float4_values()`/`float8_values()` are public so the -// `eql_v2_float4`/`eql_v2_float8` fixture modules (emitted by +// `eql_v3_float4`/`eql_v3_float8` fixture modules (emitted by // `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. lazy_values! { cell = FLOAT4_VALUES_CELL, From 41685a50722cb3ffbd327e20237a7e6c885b1495 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:20:29 +1000 Subject: [PATCH 305/599] test(fixtures): align harness-library fixture refs to eql_v3_ --- tests/sqlx/src/fixtures/cipherstash.rs | 2 +- tests/sqlx/src/fixtures/mod.rs | 6 ++--- tests/sqlx/src/fixtures/scalar_fixture.rs | 4 +-- tests/sqlx/src/fixtures/spec.rs | 26 +++++++++---------- .../sqlx/src/fixtures/v3_numeric_collision.rs | 2 +- tests/sqlx/src/fixtures/validation.rs | 8 +++--- tests/sqlx/src/jsonb_entry.rs | 2 +- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index 77a92dca0..b48e5d633 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -299,7 +299,7 @@ mod tests { /// `CS_CLIENT_ACCESS_KEY` / `CS_WORKSPACE_CRN`. Each test is /// `#[ignore]` so it only runs under /// `cargo test --features fixture-gen -- --ignored`, mirroring the -/// `generate` test in `eql_v2_int4.rs`. +/// `generate` test in `eql_v3_int4.rs`. /// /// These complement the structural fixture-tests in /// the `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs`: those assert over the diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index f4d5683a5..9253a1001 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -28,7 +28,7 @@ pub mod driver; // The v3 jsonb (SteVec document) fixture — a hand-written `FixtureSpec` // over `serde_json::Value`, generated through the same pipeline as the -// scalar `eql_v2_` fixtures. Not a CATALOG scalar, so it is registered +// scalar `eql_v3_` fixtures. Not a CATALOG scalar, so it is registered // here directly rather than via `scalar_types!`. pub mod v3_ste_vec; @@ -50,8 +50,8 @@ pub mod v3_numeric_collision; // cross-ciphertext-equality test. Non-catalog, like `v3_numeric_collision`. pub mod eql_doubles; -// The per-type scalar fixture modules (`eql_v2_int4`, `eql_v2_int2`, …) are +// The per-type scalar fixture modules (`eql_v3_int4`, `eql_v3_int2`, …) are // generated from the harness list in `scalar_types.rs`. Each expands to -// `pub mod eql_v2_ { … scalar_fixture! … }`, reading its plaintext values +// `pub mod eql_v3_ { … scalar_fixture! … }`, reading its plaintext values // directly from the catalog (`eql_scalars::_VALUES`). crate::scalar_types!(fixture_modules); diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 29ced09a3..4b68f20f2 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -1,6 +1,6 @@ //! `scalar_fixture!` — collapse a scalar fixture wrapper to one invocation. //! -//! Every `eql_v2_` scalar fixture file (`eql_v2_int2`, `eql_v2_int4`, …) is +//! Every `eql_v3_` scalar fixture file (`eql_v3_int2`, `eql_v3_int4`, …) is //! the same three items differing only in the fixture name, the Rust plaintext //! type, and the generated value list: the `spec()` builder, the `fixture-gen` //! generator test, and a small property-test module. This macro stamps all @@ -33,7 +33,7 @@ /// extremes), plus a third `Match` index so generated payloads carry `bf` for /// the `text_match` containment surface. Indexes `Unique` + `Ore` + `Match`. /// -/// - `$name` — the fixture name (`"eql_v2_int2"`), drives every derived path. +/// - `$name` — the fixture name (`"eql_v3_int2"`), drives every derived path. /// - `$ty` — the Rust plaintext type (`i16` / `chrono::NaiveDate` / `String`). /// - `$values` — the value source: the catalog const (`eql_scalars::INT2_VALUES`) /// for integers, or the harness accessor (`date_values()` / `text_values()`). diff --git a/tests/sqlx/src/fixtures/spec.rs b/tests/sqlx/src/fixtures/spec.rs index 0bb45ae4b..b89504dd7 100644 --- a/tests/sqlx/src/fixtures/spec.rs +++ b/tests/sqlx/src/fixtures/spec.rs @@ -238,7 +238,7 @@ mod tests { fn int4_spec() -> FixtureSpec<'static, i32> { const VALUES: &[i32] = &[-1, 1, 42]; - FixtureSpec::new("eql_v2_int4") + FixtureSpec::new("eql_v3_int4") .with_index(IndexKind::Unique) .with_index(IndexKind::Ore) .with_column_type("jsonb") @@ -248,9 +248,9 @@ mod tests { #[test] fn derives_paths_from_the_name() { let s = int4_spec(); - assert_eq!(s.fixture_table(), "fixtures.eql_v2_int4"); - assert_eq!(s.working_table(), "_fixture_eql_v2_int4"); - assert_eq!(s.script_filename(), "eql_v2_int4.sql"); + assert_eq!(s.fixture_table(), "fixtures.eql_v3_int4"); + assert_eq!(s.working_table(), "_fixture_eql_v3_int4"); + assert_eq!(s.script_filename(), "eql_v3_int4.sql"); } #[test] @@ -312,7 +312,7 @@ mod tests { // A storage-only (encryption-only) fixture legitimately declares zero // indexes — the value is encrypted with no search term. const V: &[bool] = &[false, true]; - let s = FixtureSpec::new("eql_v2_bool") + let s = FixtureSpec::new("eql_v3_bool") .storage_only() .with_values(V); assert!(s.indexes().is_empty()); @@ -324,7 +324,7 @@ mod tests { // A storage-only fixture must NOT declare an index (that would add a // term key to the payload, contradicting the storage-only contract). const V: &[bool] = &[false, true]; - let s = FixtureSpec::new("eql_v2_bool") + let s = FixtureSpec::new("eql_v3_bool") .storage_only() .with_index(IndexKind::Unique) .with_values(V); @@ -334,8 +334,8 @@ mod tests { #[test] fn working_schema_sql_drops_and_creates_the_working_table() { let sql = int4_spec().working_schema_sql(); - assert!(sql.contains("DROP TABLE IF EXISTS public._fixture_eql_v2_int4;")); - assert!(sql.contains("CREATE TABLE public._fixture_eql_v2_int4 (")); + assert!(sql.contains("DROP TABLE IF EXISTS public._fixture_eql_v3_int4;")); + assert!(sql.contains("CREATE TABLE public._fixture_eql_v3_int4 (")); assert!(sql.contains("id BIGINT PRIMARY KEY")); assert!(sql.contains("plaintext integer NOT NULL")); // The working table's payload is plain jsonb — encryption happens in @@ -365,12 +365,12 @@ mod tests { // header assert!(preamble.contains("AUTO-GENERATED")); assert!(preamble.contains("DO NOT EDIT BY HAND")); - assert!(preamble.contains("mise run fixture:generate eql_v2_int4")); + assert!(preamble.contains("mise run fixture:generate eql_v3_int4")); assert!(preamble.contains("HMAC + ORE block terms")); // schema + table in the fixtures schema, jsonb payload assert!(preamble.contains("CREATE SCHEMA IF NOT EXISTS fixtures;")); - assert!(preamble.contains("DROP TABLE IF EXISTS fixtures.eql_v2_int4;")); - assert!(preamble.contains("CREATE TABLE fixtures.eql_v2_int4 (")); + assert!(preamble.contains("DROP TABLE IF EXISTS fixtures.eql_v3_int4;")); + assert!(preamble.contains("CREATE TABLE fixtures.eql_v3_int4 (")); assert!(preamble.contains("id BIGINT PRIMARY KEY")); assert!(preamble.contains("plaintext integer NOT NULL")); assert!(preamble.contains("payload jsonb NOT NULL")); @@ -398,9 +398,9 @@ mod tests { #[test] fn render_rows_sql_projects_format_l_over_the_working_table() { let sql = int4_spec().render_rows_sql(); - assert!(sql.contains("INSERT INTO fixtures.eql_v2_int4 (id, plaintext, payload) VALUES")); + assert!(sql.contains("INSERT INTO fixtures.eql_v3_int4 (id, plaintext, payload) VALUES")); assert!(sql.contains("%L, %L, %L::jsonb")); - assert!(sql.contains("FROM public._fixture_eql_v2_int4")); + assert!(sql.contains("FROM public._fixture_eql_v3_int4")); // payload is already encrypted JSONB in the working table; no // composite to unwrap. assert!(sql.contains("payload::text")); diff --git a/tests/sqlx/src/fixtures/v3_numeric_collision.rs b/tests/sqlx/src/fixtures/v3_numeric_collision.rs index fe58c63d5..0eb1a017c 100644 --- a/tests/sqlx/src/fixtures/v3_numeric_collision.rs +++ b/tests/sqlx/src/fixtures/v3_numeric_collision.rs @@ -2,7 +2,7 @@ //! (`1`, `1.0`) plus a `2` discriminator, encrypted at numeric ORE width. //! //! Hand-written, non-catalog (like `v3_ste_vec` / `v3_doc_int4`, hence the -//! `v3_` prefix), because the catalog-driven `eql_v2_numeric` fixture CANNOT +//! `v3_` prefix), because the catalog-driven `eql_v3_numeric` fixture CANNOT //! carry it: `numeric_value_guards::fixtures_are_distinct_by_value` forbids two //! fixtures that alias to the same `Decimal`, and `1` / `1.0` are value-equal. //! So the `1 == 1.0` ORE collision — that scale-equivalent decimals encrypt to diff --git a/tests/sqlx/src/fixtures/validation.rs b/tests/sqlx/src/fixtures/validation.rs index 1b25bc3a8..d929bc676 100644 --- a/tests/sqlx/src/fixtures/validation.rs +++ b/tests/sqlx/src/fixtures/validation.rs @@ -102,7 +102,7 @@ mod tests { #[test] fn accepts_valid_identifiers() { - assert!(FixtureIdentifier::try_from("eql_v2_int4").is_ok()); + assert!(FixtureIdentifier::try_from("eql_v3_int4").is_ok()); assert!(FixtureIdentifier::try_from("a").is_ok()); assert!(FixtureIdentifier::try_from("x9_y").is_ok()); } @@ -136,8 +136,8 @@ mod tests { #[test] fn identifier_renders_via_display() { - let id = FixtureIdentifier::try_from("eql_v2_int4").unwrap(); - assert_eq!(format!("{id}"), "eql_v2_int4"); + let id = FixtureIdentifier::try_from("eql_v3_int4").unwrap(); + assert_eq!(format!("{id}"), "eql_v3_int4"); } #[test] @@ -145,7 +145,7 @@ mod tests { assert!(ColumnType::try_from("jsonb").is_ok()); assert!(ColumnType::try_from("eql_v3.json").is_ok()); assert!(ColumnType::try_from("text").is_err()); - assert!(ColumnType::try_from("eql_v2_int4").is_err()); + assert!(ColumnType::try_from("eql_v3_int4").is_err()); assert!(ColumnType::try_from("eql_v3.jsonb").is_err()); assert!(ColumnType::try_from("jsonb; DROP TABLE x").is_err()); } diff --git a/tests/sqlx/src/jsonb_entry.rs b/tests/sqlx/src/jsonb_entry.rs index 863dc7760..811671fa0 100644 --- a/tests/sqlx/src/jsonb_entry.rs +++ b/tests/sqlx/src/jsonb_entry.rs @@ -57,7 +57,7 @@ impl ScalarType for JsonbEntryInt4 { &VALUES } - /// The scalar-shaped document fixture, not `fixtures.eql_v2_int4`. + /// The scalar-shaped document fixture, not `fixtures.eql_v3_int4`. fn fixture_table_name() -> String { "fixtures.v3_doc_int4".to_string() } From 1e01e6e3660e1ade4eb7feaa2113bc53b4bf63fc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:21:30 +1000 Subject: [PATCH 306/599] test(fixtures): point scalar test suites at eql_v3_ fixtures --- tests/sqlx/tests/aggregate_tests.rs | 2 +- .../tests/encrypted_domain/constraints.rs | 8 ++-- .../encrypted_domain/family/inlinability.rs | 2 +- .../family/jsonb_operator_surface.rs | 2 +- .../encrypted_domain/family/mutations.rs | 28 +++++------ .../tests/encrypted_domain/property/README.md | 4 +- .../property/cross_ciphertext.rs | 4 +- .../property/fixture_oracle.rs | 42 ++++++++--------- tests/sqlx/tests/encrypted_domain/signed.rs | 14 +++--- .../tests/encrypted_domain/text/text_match.rs | 28 +++++------ ..._tests.rs => eql_v3_int4_fixture_tests.rs} | 46 +++++++++---------- tests/sqlx/tests/generate_all_fixtures.rs | 8 ++-- tests/sqlx/tests/lint_tests.rs | 2 +- .../sqlx/tests/ore_block_comparator_tests.rs | 28 +++++------ 14 files changed, 109 insertions(+), 109 deletions(-) rename tests/sqlx/tests/{eql_v2_int4_fixture_tests.rs => eql_v3_int4_fixture_tests.rs} (77%) diff --git a/tests/sqlx/tests/aggregate_tests.rs b/tests/sqlx/tests/aggregate_tests.rs index f942a51e1..b1659c626 100644 --- a/tests/sqlx/tests/aggregate_tests.rs +++ b/tests/sqlx/tests/aggregate_tests.rs @@ -3,7 +3,7 @@ //! Covers native `COUNT` / `GROUP BY` on `eql_v2_encrypted` and the //! `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates //! on the composite type. Per-domain aggregates -//! (`eql_v2.min(eql_v2__ord)` etc.) are additionally covered by the +//! (`eql_v2.min(eql_v3__ord)` etc.) are additionally covered by the //! encrypted-domain test matrix (`tests/sqlx/src/matrix.rs`, instantiated per //! scalar type from `tests/sqlx/tests/encrypted_domain/scalars/.rs`). diff --git a/tests/sqlx/tests/encrypted_domain/constraints.rs b/tests/sqlx/tests/encrypted_domain/constraints.rs index ef4665134..1e0c14422 100644 --- a/tests/sqlx/tests/encrypted_domain/constraints.rs +++ b/tests/sqlx/tests/encrypted_domain/constraints.rs @@ -12,7 +12,7 @@ //! test set) does not mis-read it as a scalar type. //! //! All ciphertext is REAL: every payload comes from the committed/generated -//! `fixtures.eql_v2_int4` table (Proxy-encrypted, HMAC + ORE block terms) via +//! `fixtures.eql_v3_int4` table (Proxy-encrypted, HMAC + ORE block terms) via //! `fetch_fixture_payload::`. No synthetic / hand-written encrypted blobs. //! //! ## What a constraint on a jsonb-backed domain actually constrains @@ -45,7 +45,7 @@ async fn int4_payload_literal(pool: &PgPool, plaintext: i32) -> anyhow::Result anyhow::Result<()> { sqlx::query("CREATE TABLE v3_not_null (id bigint PRIMARY KEY, val eql_v3.int4 NOT NULL)") .execute(&pool) @@ -104,7 +104,7 @@ async fn not_null_on_int4_storage_column(pool: PgPool) -> anyhow::Result<()> { /// collide on this constraint despite being semantically equal — UNIQUE on a /// bare encrypted-domain column is byte-identity uniqueness, not /// plaintext-uniqueness. -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int4")))] async fn unique_on_int4_eq_column_constrains_raw_payload(pool: PgPool) -> anyhow::Result<()> { sqlx::query( "CREATE TABLE v3_unique (id bigint PRIMARY KEY, val eql_v3.int4_eq UNIQUE NOT NULL)", @@ -184,7 +184,7 @@ async fn unique_on_int4_eq_column_constrains_raw_payload(pool: PgPool) -> anyhow /// plaintext would be a different jsonb and would NOT satisfy the FK — so FK on /// a bare encrypted-domain column does not provide plaintext-level referential /// integrity. -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int4")))] async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> { // Parent with a PRIMARY KEY on an eql_v3.int4 (jsonb-backed domain) column. sqlx::query("CREATE TABLE v3_parent (ref eql_v3.int4 PRIMARY KEY)") diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 9c62404dd..f91180fff 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -253,7 +253,7 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( // appears as an argument type of at least one inline-critical // function. // - // Storage-only variants (the bare `eql_v3.` / `eql_v2_` domain, + // Storage-only variants (the bare `eql_v3.` / `eql_v3_` domain, // with no capability suffix) intentionally have NO inline-critical // surface and are excluded from the eligibility set. let unbound: Vec = sqlx::query_scalar( diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index 70abb64d1..50a5e9f9e 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -44,7 +44,7 @@ async fn every_native_jsonb_operator_is_known_to_the_generator(pool: PgPool) -> // Exclude EQL's own cross-type operators on the legacy `eql_v2_encrypted` // composite (e.g. `eql_v2_encrypted ~~ jsonb`, `jsonb ~~ eql_v2_encrypted`). // They take a jsonb operand but are NOT native plaintext-jsonb operators and - // are unreachable from a storage scalar domain: a `eql_v2_int4` operand + // are unreachable from a storage scalar domain: a `eql_v3_int4` operand // resolves to the domain / its jsonb base, never to `eql_v2_encrypted`, so // `col ~~ x` finds no operator (asserted by the matrix `native_absent_ops` // arm). Matching on `typname` is search_path-independent and a harmless diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index 889293a5b..e78687af7 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -118,18 +118,18 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( // 3. `_ord` equality must route through `ord_term` (`ob`), never HMAC. // Rerouting it through `hmac_256` (`hm`) over hm-stripped rows makes `=` // stop matching. Proves the `ord_routes_through_ob` arm has teeth. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Result<()> { // Strip `hm` per-row inline; the `_ord` CHECK only requires `ob`, so the // cast still succeeds. The pivot is likewise hm-stripped. let pivot: i32 = 42; let pivot_payload: String = sqlx::query_scalar(&format!( - "SELECT (payload - 'hm')::text FROM fixtures.eql_v2_int4 WHERE plaintext = {pivot}", + "SELECT (payload - 'hm')::text FROM fixtures.eql_v3_int4 WHERE plaintext = {pivot}", )) .fetch_one(&pool) .await?; - let count_sql = "SELECT count(*) FROM fixtures.eql_v2_int4 \ + let count_sql = "SELECT count(*) FROM fixtures.eql_v3_int4 \ WHERE (payload - 'hm')::eql_v3.int4_ord = $1::jsonb::eql_v3.int4_ord"; // Baseline: with `hm` stripped, `=` still matches the pivot via `ord_term` @@ -203,10 +203,10 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // Crucially, ORDER BY routes through `ord_term`, NOT `<`, so it must stay // green here. This is the #5-vs-#7 split: #5 attacks `<`, #7 attacks the // sort key. Blocking `<` alone must not disturb ORDER BY. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { let lt_sql = "SELECT $1::jsonb::eql_v3.int4_ord < $2::jsonb::eql_v3.int4_ord"; - let order_by_sql = "SELECT plaintext FROM fixtures.eql_v2_int4 \ + let order_by_sql = "SELECT plaintext FROM fixtures.eql_v3_int4 \ ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) ASC"; let mut ascending: Vec = ::fixture_values().to_vec(); @@ -219,8 +219,8 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // post-mutation `assert_raises` below, where the `lt` blocker raises before // the comparator ever inspects the term. let lt_baseline: Option = sqlx::query_scalar( - "SELECT (SELECT payload FROM fixtures.eql_v2_int4 WHERE plaintext = $1)::eql_v3.int4_ord \ - < (SELECT payload FROM fixtures.eql_v2_int4 WHERE plaintext = $2)::eql_v3.int4_ord", + "SELECT (SELECT payload FROM fixtures.eql_v3_int4 WHERE plaintext = $1)::eql_v3.int4_ord \ + < (SELECT payload FROM fixtures.eql_v3_int4 WHERE plaintext = $2)::eql_v3.int4_ord", ) .bind(ascending[0]) .bind(ascending[1]) @@ -279,18 +279,18 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // ore index (ob)"), whereas `hmac_256(jsonb)` returns NULL on an absent // `hm`. So the eq path breaks via a raise, not a 0-count. Either way the // correct hm-routed equality matches and the rerouted one does not. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // Strip `ob` per-row inline; the `_eq` CHECK only requires `hm`, so the // cast still succeeds. The pivot is likewise ob-stripped. let pivot: i32 = 42; let pivot_payload: String = sqlx::query_scalar(&format!( - "SELECT (payload - 'ob')::text FROM fixtures.eql_v2_int4 WHERE plaintext = {pivot}", + "SELECT (payload - 'ob')::text FROM fixtures.eql_v3_int4 WHERE plaintext = {pivot}", )) .fetch_one(&pool) .await?; - let count_sql = "SELECT count(*) FROM fixtures.eql_v2_int4 \ + let count_sql = "SELECT count(*) FROM fixtures.eql_v3_int4 \ WHERE (payload - 'ob')::eql_v3.int4_eq = $1::jsonb::eql_v3.int4_eq"; // Baseline: with `ob` stripped, `=` still matches the pivot via `eq_term` @@ -339,9 +339,9 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // returns ascending order — which can never equal the descending // expectation. Asserting against DESC therefore detects the collapse // regardless of heap order (the ascending-fixture caveat from the plan). -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { - let order_by_desc = "SELECT plaintext FROM fixtures.eql_v2_int4 \ + let order_by_desc = "SELECT plaintext FROM fixtures.eql_v3_int4 \ ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) DESC"; let mut descending: Vec = ::fixture_values().to_vec(); @@ -387,12 +387,12 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { // `lt`) and #7 (collapse `ord_term`) do not exercise, since both run on the // NULL-free fixture. A UNION ALL subquery supplies the NULL rows inline, so no // session-local temp table is needed and the global `mutate()` stays valid. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Result<()> { const NULL_ROWS: usize = 3; let order_by = format!( "SELECT plaintext FROM ( \ - SELECT plaintext, payload::eql_v3.int4_ord AS value FROM fixtures.eql_v2_int4 \ + SELECT plaintext, payload::eql_v3.int4_ord AS value FROM fixtures.eql_v3_int4 \ UNION ALL \ SELECT NULL::int4, NULL::eql_v3.int4_ord FROM generate_series(1, {NULL_ROWS}) \ ) s \ diff --git a/tests/sqlx/tests/encrypted_domain/property/README.md b/tests/sqlx/tests/encrypted_domain/property/README.md index 823af27cf..60db921a5 100644 --- a/tests/sqlx/tests/encrypted_domain/property/README.md +++ b/tests/sqlx/tests/encrypted_domain/property/README.md @@ -41,7 +41,7 @@ only suite where `proptest` shrinking is meaningful and enabled. ### fixture — oracle over committed ciphertext Runs the shared all-pairs oracle engine over the real, committed fixture rows -(`fixtures.eql_v2_.sql`, generated by `cipherstash-client` during +(`fixtures.eql_v3_.sql`, generated by `cipherstash-client` during `mise run test:sqlx:prep`). The fixtures are the curated catalog values for each type (`Min`/`Max`/`Zero`/pivots). `proptest` selects a sub-multiset of those rows (with repeats), and the engine checks **every ordered pair**. No new encryption, @@ -60,7 +60,7 @@ example-based bloom containment (`@>`/`<@`) for the text `_match` domain. Cross-ciphertext equality — "two independent encryptions of one value compare equal" — needs equal-plaintext / distinct-ciphertext rows, which the curated matrix fixture (unique plaintexts) has no room for. So each comparison type -carries a tiny sibling table, `fixtures.eql_v2__doubles` (generated by +carries a tiny sibling table, `fixtures.eql_v3__doubles` (generated by [`fixtures::eql_doubles`](../../../src/fixtures/eql_doubles.rs)): the first three catalog values, each encrypted twice. [`cross_ciphertext.rs`](./cross_ciphertext.rs) reads ONLY those tables and proves the equality holds through both the `hm` diff --git a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs index a6c52dc41..ccd3cad76 100644 --- a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs +++ b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs @@ -1,11 +1,11 @@ //! fixture-suite (CIP-3141) cross-ciphertext equality test. //! //! Proves "two independent encryptions of one value compare equal" using the -//! committed `fixtures.eql_v2__doubles` tables — each plaintext encrypted +//! committed `fixtures.eql_v3__doubles` tables — each plaintext encrypted //! twice, so the table carries equal-plaintext / distinct-ciphertext rows. No //! fresh encryption, no creds: it reads the already-encrypted doubles, so it //! runs in the credential-free `mise run test:sqlx` path. Distinct from the -//! matrix (which reads the curated `fixtures.eql_v2_`) and from the e2e suite +//! matrix (which reads the curated `fixtures.eql_v3_`) and from the e2e suite //! (which re-encrypts fresh duplicates each run). //! //! Each type asserts, on its doubles rows: diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index 60edc6032..b41adb426 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -1,6 +1,6 @@ //! fixture suite (CIP-3141): property tests over the real, committed fixture rows. //! -//! The fixture table `fixtures.eql_v2_` carries `(plaintext, payload)` rows +//! The fixture table `fixtures.eql_v3_` carries `(plaintext, payload)` rows //! encrypted by cipherstash-client during `test:sqlx:prep`. proptest selects a //! sub-multiset of those rows (with repeats, so the equality diagonal includes //! identical-ciphertext self-pairs) and the shared oracle engine checks every @@ -32,7 +32,7 @@ use std::sync::Arc; /// at compile time (one arm per catalog token). Embedding rather than reading /// from disk at runtime is what lets the prebuilt nextest archive carry the /// fixtures into CI shards, which do a fresh checkout where the gitignored -/// `tests/sqlx/fixtures/eql_v2_.sql` files are absent. The path resolves +/// `tests/sqlx/fixtures/eql_v3_.sql` files are absent. The path resolves /// against the `eql_tests` crate root (`tests/sqlx`). Mirrors the loud catch-all /// of the `generate_for_token` fixture dispatch. /// @@ -42,41 +42,41 @@ pub(crate) fn embedded_fixture_sql() -> &'static str { match T::PG_TYPE { "int4" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_int4.sql" + "/fixtures/eql_v3_int4.sql" )), "int2" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_int2.sql" + "/fixtures/eql_v3_int2.sql" )), "int8" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_int8.sql" + "/fixtures/eql_v3_int8.sql" )), "date" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_date.sql" + "/fixtures/eql_v3_date.sql" )), "text" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_text.sql" + "/fixtures/eql_v3_text.sql" )), "timestamptz" => { include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_timestamptz.sql" + "/fixtures/eql_v3_timestamptz.sql" )) } "numeric" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_numeric.sql" + "/fixtures/eql_v3_numeric.sql" )), "float4" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_float4.sql" + "/fixtures/eql_v3_float4.sql" )), "float8" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_float8.sql" + "/fixtures/eql_v3_float8.sql" )), other => panic!( "no embedded fixture for catalog token '{other}'; \ @@ -88,41 +88,41 @@ pub(crate) fn embedded_fixture_sql() -> &'static str { /// The `_doubles` fixture SQL for `T`, `include_str!`-embedded at compile time /// (one arm per comparison-capable token). Same embed rationale as /// `embedded_fixture_sql` — the prebuilt nextest archive carries the gitignored -/// fixtures into CI shards. The table is `fixtures.eql_v2__doubles`; the file -/// is `fixtures/eql_v2__doubles.sql`. `bool` is storage-only and has no +/// fixtures into CI shards. The table is `fixtures.eql_v3__doubles`; the file +/// is `fixtures/eql_v3__doubles.sql`. `bool` is storage-only and has no /// doubles fixture; the cross-ciphertext test never instantiates it, so its /// absence (caught by the loud catch-all) is correct. pub(crate) fn embedded_doubles_sql() -> &'static str { match T::PG_TYPE { "int2" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_int2_doubles.sql" + "/fixtures/eql_v3_int2_doubles.sql" )), "int4" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_int4_doubles.sql" + "/fixtures/eql_v3_int4_doubles.sql" )), "int8" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_int8_doubles.sql" + "/fixtures/eql_v3_int8_doubles.sql" )), "date" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_date_doubles.sql" + "/fixtures/eql_v3_date_doubles.sql" )), "timestamptz" => { include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_timestamptz_doubles.sql" + "/fixtures/eql_v3_timestamptz_doubles.sql" )) } "numeric" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_numeric_doubles.sql" + "/fixtures/eql_v3_numeric_doubles.sql" )), "text" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v2_text_doubles.sql" + "/fixtures/eql_v3_text_doubles.sql" )), other => panic!( "no embedded doubles fixture for catalog token '{other}'; \ @@ -171,7 +171,7 @@ pub(crate) async fn load_rows(pool: &PgPool) -> Result_doubles` (NOT the matrix's `fixtures.eql_v2_`), so it +/// `fixtures.eql_v3__doubles` (NOT the matrix's `fixtures.eql_v3_`), so it /// carries the equal-plaintext / distinct-ciphertext rows the cross-ciphertext /// test needs. pub(crate) async fn load_doubles_rows(pool: &PgPool) -> Result>>> { diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs index 19b822ae3..2272ef60d 100644 --- a/tests/sqlx/tests/encrypted_domain/signed.rs +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -43,37 +43,37 @@ async fn sign_boundary_is_monotonic(pool: &PgPool) -> anyhow::R Ok(()) } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int4")))] async fn int4_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_date")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_date")))] async fn date_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int2")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int2")))] async fn int2_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_int8")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int8")))] async fn int8_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_timestamptz")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_timestamptz")))] async fn timestamptz_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::>(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_float4")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_float4")))] async fn float4_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v2_float8")))] +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_float8")))] async fn float8_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index 29dbe0890..fcbe894e8 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -1,9 +1,9 @@ //! Match-containment coverage for `eql_v3.text_match` — separate from the //! ordered matrix because `@>` is asymmetric/probabilistic, not a total order. -//! Asserts against the generated `eql_v2_text` fixtures (which carry `bf`). +//! Asserts against the generated `eql_v3_text` fixtures (which carry `bf`). use sqlx::PgPool; -const TABLE: &str = "fixtures.eql_v2_text"; +const TABLE: &str = "fixtures.eql_v3_text"; async fn payload_for(pool: &PgPool, plaintext: &str) -> anyhow::Result { Ok(sqlx::query_scalar::<_, serde_json::Value>(&format!( @@ -14,7 +14,7 @@ async fn payload_for(pool: &PgPool, plaintext: &str) -> anyhow::Result anyhow::Result<()> { let p = payload_for(&pool, "aardvark").await?; let hit: bool = sqlx::query_scalar( @@ -27,7 +27,7 @@ async fn value_matches_itself(pool: PgPool) -> anyhow::Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn haystack_contains_substring_needle(pool: PgPool) -> anyhow::Result<()> { let hay = payload_for(&pool, "aardvark").await?; let needle = payload_for(&pool, "aard").await?; @@ -42,7 +42,7 @@ async fn haystack_contains_substring_needle(pool: PgPool) -> anyhow::Result<()> Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn disjoint_value_does_not_match(pool: PgPool) -> anyhow::Result<()> { // A bloom filter is probabilistic and admits false positives, so a true // negative is only deterministic for inputs that share no n-grams. "aard" @@ -65,7 +65,7 @@ async fn disjoint_value_does_not_match(pool: PgPool) -> anyhow::Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn match_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { // Explicit extractor form `match_term(col) @> match_term(needle)`. Forces // `enable_seqscan = off` so this is an index-VALIDITY proof on the small @@ -105,7 +105,7 @@ async fn match_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { /// `enable_seqscan = off` so this is an index-**validity** proof on the small /// fixture, not a cost-preference one, and uses the node-type-aware /// `assert_index_scan_uses` rather than a plan substring match. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { let mut tx = pool.begin().await?; sqlx::query("SET LOCAL enable_seqscan = off") @@ -134,7 +134,7 @@ async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn needle_contained_by_haystack(pool: PgPool) -> anyhow::Result<()> { // `<@` (contained-by) is the COMMUTATOR of `@>`; the implemented // `eql_v3.contained_by` is otherwise untested. `aard <@ aardvark` holds for @@ -155,7 +155,7 @@ async fn needle_contained_by_haystack(pool: PgPool) -> anyhow::Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn disjoint_value_not_contained_by(pool: PgPool) -> anyhow::Result<()> { // `<@` negative, mirroring `disjoint_value_does_not_match`. "zzzz" (3-gram // `zzz`) and "aard" (`aar`, `ard`) are ngram-disjoint in TEXT_FIXTURES, so @@ -178,7 +178,7 @@ async fn disjoint_value_not_contained_by(pool: PgPool) -> anyhow::Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn contains_and_contained_by_are_commutative(pool: PgPool) -> anyhow::Result<()> { // Pin the `COMMUTATOR = @>/<@` declaration behaviorally: `a @> b` must equal // `b <@ a` for the same operand pair, and both hold for the superset/subset @@ -204,7 +204,7 @@ async fn contains_and_contained_by_are_commutative(pool: PgPool) -> anyhow::Resu Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn direct_contains_function_matches_operator(pool: PgPool) -> anyhow::Result<()> { // Exercises `eql_v3.contains(a, b)` by NAME (not the `@>` operator), and pins // that the function and the operator it backs agree. `aardvark` contains the @@ -236,7 +236,7 @@ async fn direct_contains_function_matches_operator(pool: PgPool) -> anyhow::Resu Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn direct_contained_by_function_matches_operator(pool: PgPool) -> anyhow::Result<()> { // Exercises `eql_v3.contained_by(a, b)` by NAME (not the `<@` operator). `aard` // is contained by `aardvark`; `zzzz` is not contained by `aard` (disjoint ngrams). @@ -270,7 +270,7 @@ async fn direct_contained_by_function_matches_operator(pool: PgPool) -> anyhow:: Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn mixed_jsonb_domain_overloads_agree(pool: PgPool) -> anyhow::Result<()> { // The (text_match, jsonb), (jsonb, text_match) overloads cast the jsonb side // internally; they must agree with the fully-cast (text_match, text_match) form. @@ -338,7 +338,7 @@ async fn direct_functions_propagate_null(pool: PgPool) -> anyhow::Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v2_text")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_text")))] async fn bloom_matches_where_like_would_not(pool: PgPool) -> anyhow::Result<()> { // Locks in WHY v3 dropped `LIKE` for bloom containment: the two are not the same // relation. The needle's ngrams are all present in the haystack, so bloom `@>` diff --git a/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs b/tests/sqlx/tests/eql_v3_int4_fixture_tests.rs similarity index 77% rename from tests/sqlx/tests/eql_v2_int4_fixture_tests.rs rename to tests/sqlx/tests/eql_v3_int4_fixture_tests.rs index 04233f154..493b5bb3e 100644 --- a/tests/sqlx/tests/eql_v2_int4_fixture_tests.rs +++ b/tests/sqlx/tests/eql_v3_int4_fixture_tests.rs @@ -1,6 +1,6 @@ -//! Structural verification of the generated `eql_v2_int4` fixture. +//! Structural verification of the generated `eql_v3_int4` fixture. //! -//! Vanilla SQL over `fixtures.eql_v2_int4` — `payload` is plain `jsonb`, no +//! Vanilla SQL over `fixtures.eql_v3_int4` — `payload` is plain `jsonb`, no //! domain type required. The `plaintext` column is the in-table oracle; no //! Rust value constant is shared with the generator. #224 verifies the //! fixture is well-formed; #225 verifies the domain operators on it. @@ -8,11 +8,11 @@ use anyhow::Result; use sqlx::PgPool; -/// The 17 values from `src/fixtures/eql_v2_int4.rs`, in id order. Kept here +/// The 17 values from `src/fixtures/eql_v3_int4.rs`, in id order. Kept here /// only to assert the in-table `plaintext` oracle matches what was generated. /// If `plaintext_column_matches_the_generated_values` fails, the generator's /// `VALUES` and this constant have drifted — re-run -/// `mise run fixture:generate eql_v2_int4` and update this list to match. +/// `mise run fixture:generate eql_v3_int4` and update this list to match. const EXPECTED_PLAINTEXTS: &[i32] = &[ i32::MIN, -100, @@ -33,39 +33,39 @@ const EXPECTED_PLAINTEXTS: &[i32] = &[ i32::MAX, ]; -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn fixture_has_seventeen_rows(pool: PgPool) -> Result<()> { - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v2_int4") + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v3_int4") .fetch_one(&pool) .await?; - assert_eq!(count, 17, "eql_v2_int4 fixture should have 17 rows"); + assert_eq!(count, 17, "eql_v3_int4 fixture should have 17 rows"); Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn ids_are_sequential_one_to_seventeen(pool: PgPool) -> Result<()> { - let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.eql_v2_int4 ORDER BY id") + let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.eql_v3_int4 ORDER BY id") .fetch_all(&pool) .await?; assert_eq!(ids, (1..=17).collect::>()); Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn plaintext_column_matches_the_generated_values(pool: PgPool) -> Result<()> { let plaintexts: Vec = - sqlx::query_scalar("SELECT plaintext FROM fixtures.eql_v2_int4 ORDER BY id") + sqlx::query_scalar("SELECT plaintext FROM fixtures.eql_v3_int4 ORDER BY id") .fetch_all(&pool) .await?; assert_eq!(plaintexts, EXPECTED_PLAINTEXTS); Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn every_payload_carries_the_hmac_equality_term(pool: PgPool) -> Result<()> { // `hm` drives equality. Every row's payload must carry an `hm` string term. let missing: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_int4 WHERE payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", ) .fetch_one(&pool) @@ -74,11 +74,11 @@ async fn every_payload_carries_the_hmac_equality_term(pool: PgPool) -> Result<() Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn every_payload_carries_the_ore_block_term(pool: PgPool) -> Result<()> { // `ob` drives ordering. Every row's payload must carry a non-null ob array. let missing: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_int4 WHERE payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", ) .fetch_one(&pool) @@ -87,11 +87,11 @@ async fn every_payload_carries_the_ore_block_term(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn every_payload_carries_a_ciphertext(pool: PgPool) -> Result<()> { // `c` is the ciphertext. Every row's payload must carry a `c` string. let missing: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_int4 WHERE payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", ) .fetch_one(&pool) @@ -103,12 +103,12 @@ async fn every_payload_carries_a_ciphertext(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { // The in-table `plaintext` oracle: a consuming test can filter on it // directly. Exactly one row has plaintext = 42. let ids: Vec = - sqlx::query_scalar("SELECT id FROM fixtures.eql_v2_int4 WHERE plaintext = 42 ORDER BY id") + sqlx::query_scalar("SELECT id FROM fixtures.eql_v3_int4 WHERE plaintext = 42 ORDER BY id") .fetch_all(&pool) .await?; assert_eq!( @@ -119,11 +119,11 @@ async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn hmac_equality_terms_are_distinct_for_distinct_values(pool: PgPool) -> Result<()> { // All 17 plaintext values are distinct, so all 17 `hm` terms must be too. let distinct_hm: i64 = - sqlx::query_scalar("SELECT COUNT(DISTINCT payload->>'hm') FROM fixtures.eql_v2_int4") + sqlx::query_scalar("SELECT COUNT(DISTINCT payload->>'hm') FROM fixtures.eql_v3_int4") .fetch_one(&pool) .await?; assert_eq!( @@ -133,7 +133,7 @@ async fn hmac_equality_terms_are_distinct_for_distinct_values(pool: PgPool) -> R Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] async fn every_payload_declares_eql_payload_version_v2(pool: PgPool) -> Result<()> { // The EQL `v` payload-format field is checked server-side against `'2'` // when an `eql_v2_encrypted` value is inserted. Asserting equality here @@ -141,7 +141,7 @@ async fn every_payload_declares_eql_payload_version_v2(pool: PgPool) -> Result<( // loudly, forcing the maintainer to regenerate the fixture and audit // consumers for v2→v3 semantic changes. let mismatched: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v2_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_int4 WHERE payload->'v' IS NULL OR payload->>'v' <> '2'", ) .fetch_one(&pool) diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index bc4191441..62eff6593 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -6,8 +6,8 @@ //! `eql_scalars::CATALOG` for the authoritative token set. //! //! The encrypted-fixture logic itself is unchanged — each type's -//! `fixtures::eql_v2_::spec().run()` still produces -//! `tests/sqlx/fixtures/eql_v2_.sql` exactly as before. +//! `fixtures::eql_v3_::spec().run()` still produces +//! `tests/sqlx/fixtures/eql_v3_.sql` exactly as before. //! //! Gated behind `fixture-gen` (needs a live Postgres + CS_* creds). Run via: //! mise run fixture:generate:all @@ -17,7 +17,7 @@ use eql_scalars::CATALOG; // `generate_for_token(token: &str) -> anyhow::Result<()>` is generated from the // single harness list in `tests/sqlx/src/scalar_types.rs`: one match arm per -// token (`"int4" => fixtures::eql_v2_int4::spec().run().await`) plus a loud +// token (`"int4" => fixtures::eql_v3_int4::spec().run().await`) plus a loud // catch-all. A catalog token absent from that list hits the catch-all and fails // the generator loudly, so a new scalar type cannot silently skip generation. eql_tests::scalar_types!(fixture_dispatch); @@ -52,7 +52,7 @@ async fn generate_all() -> anyhow::Result<()> { // The numeric scale-equivalence collision fixture (`1`, `1.0`, `2`). Not a // CATALOG scalar — the distinctness guard forbids `1`/`1.0` coexisting in - // `eql_v2_numeric` — so it rides the same pipeline as a hand-written + // `eql_v3_numeric` — so it rides the same pipeline as a hand-written // `FixtureSpec`. Gives the always-on `1 == 1.0` ORE collision test // its committed fixture. eprintln!("Generating fixture v3_numeric_collision (1 == 1.0 ORE collision)..."); diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index f5768d3b6..025a91a72 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -305,7 +305,7 @@ async fn lint_phase_1_operators_are_clean(pool: PgPool) -> Result<()> { /// regression to plpgsql or a pinned `search_path` breaks index /// engagement. /// -/// Storage-only variants (the bare `eql_v2_` domain with no +/// Storage-only variants (the bare `eql_v3_` domain with no /// capability suffix) are intentionally excluded — every operator on /// them is a non-STRICT plpgsql blocker, which doesn't need to be /// inlinable. diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index 5a65cd85e..320c1a293 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -7,11 +7,11 @@ //! * The malformed-length guards build ORE terms by hand from short byte //! strings, exercising length validation without real ciphertexts. //! * The ordering properties (all-pairs oracle agreement + antisymmetry) read -//! the committed `eql_v2_numeric` / `eql_v2_timestamptz` fixtures, whose +//! the committed `eql_v3_numeric` / `eql_v3_timestamptz` fixtures, whose //! catalog order is the strict ascending oracle. //! * The `1 == 1.0` ORE collision reads the committed `v3_numeric_collision` //! fixture — the one place the value-equal pair can live, since the catalog -//! distinctness guard forbids it in `eql_v2_numeric`. +//! distinctness guard forbids it in `eql_v3_numeric`. //! //! Fixtures are generated once (with creds) in the `build-archive` CI job and //! baked into the test binaries via `include_str!`, so the no-creds shards @@ -248,11 +248,11 @@ async fn comparator_length_guard_sweep(pool: PgPool) -> Result<()> { } /// Width: a numeric ORE term must be 14 blocks => 49*14 + 16 = 702 bytes. -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_numeric")))] async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { let width: i32 = sqlx::query_scalar( "SELECT octet_length((((eql_v3.ord_term( \ - (SELECT payload FROM fixtures.eql_v2_numeric WHERE plaintext = (-1000000)::numeric) \ + (SELECT payload FROM fixtures.eql_v3_numeric WHERE plaintext = (-1000000)::numeric) \ ::eql_v3.numeric_ord)).terms)[1]).bytes)", ) .fetch_one(&pool) @@ -269,7 +269,7 @@ async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { /// list is the strict ascending oracle (matching `NUMERIC_FIXTURES`' catalog /// order); `assert_orders_like_oracle` fails loudly if it drifts from the /// committed fixture. -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_numeric")))] async fn numeric_terms_order_like_decimal_ord(pool: PgPool) -> Result<()> { let ascending: Vec = [ "-1000000000000", @@ -290,16 +290,16 @@ async fn numeric_terms_order_like_decimal_ord(pool: PgPool) -> Result<()> { .iter() .map(|v| format!("({v})::numeric")) .collect(); - assert_orders_like_oracle(&pool, "eql_v2_numeric", "numeric_ord", &ascending).await + assert_orders_like_oracle(&pool, "eql_v3_numeric", "numeric_ord", &ascending).await } /// Width + single-pair sanity for the 12-block (timestamptz, N=12 => 604 bytes) /// term. The full ordering property is `timestamptz_terms_order_like_datetime_ord`. -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_timestamptz")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_timestamptz")))] async fn timestamptz_term_is_12_blocks(pool: PgPool) -> Result<()> { let width: i32 = sqlx::query_scalar( "SELECT octet_length((((eql_v3.ord_term( \ - (SELECT payload FROM fixtures.eql_v2_timestamptz WHERE plaintext = '1970-01-01T00:00:00Z'::timestamptz) \ + (SELECT payload FROM fixtures.eql_v3_timestamptz WHERE plaintext = '1970-01-01T00:00:00Z'::timestamptz) \ ::eql_v3.timestamptz_ord)).terms)[1]).bytes)", ) .fetch_one(&pool) @@ -317,7 +317,7 @@ async fn timestamptz_term_is_12_blocks(pool: PgPool) -> Result<()> { /// coverage as numeric. The 15 values are the strict ascending oracle (matching /// `TIMESTAMPTZ_FIXTURES`' catalog order); `assert_orders_like_oracle` fails /// loudly if the list drifts from the committed fixture. -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_timestamptz")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_timestamptz")))] async fn timestamptz_terms_order_like_datetime_ord(pool: PgPool) -> Result<()> { let ascending: Vec = [ "1900-01-01T00:00:00Z", @@ -339,18 +339,18 @@ async fn timestamptz_terms_order_like_datetime_ord(pool: PgPool) -> Result<()> { .iter() .map(|v| format!("'{v}'::timestamptz")) .collect(); - assert_orders_like_oracle(&pool, "eql_v2_timestamptz", "timestamptz_ord", &ascending).await + assert_orders_like_oracle(&pool, "eql_v3_timestamptz", "timestamptz_ord", &ascending).await } /// A real wide-block term must compare equal to itself — the reflexive /// `eq`-true path (`functions.sql:166`) at N=14 and N=12, creds-free (reuses the /// generated fixtures). Distinct from the `1 == 1.0` collision (Gap 1), which is /// equality across *different* ciphertexts. -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_numeric", "eql_v2_timestamptz")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_numeric", "eql_v3_timestamptz")))] async fn wide_block_term_compares_equal_to_itself(pool: PgPool) -> Result<()> { let numeric = compare_fixture_pair( &pool, - "eql_v2_numeric", + "eql_v3_numeric", "numeric_ord", "(1)::numeric", "(1)::numeric", @@ -360,7 +360,7 @@ async fn wide_block_term_compares_equal_to_itself(pool: PgPool) -> Result<()> { let timestamptz = compare_fixture_pair( &pool, - "eql_v2_timestamptz", + "eql_v3_timestamptz", "timestamptz_ord", "'2000-01-01T00:00:00Z'::timestamptz", "'2000-01-01T00:00:00Z'::timestamptz", @@ -390,7 +390,7 @@ async fn compare_collision_ids(pool: &PgPool, a: i64, b: i64) -> Result { /// ciphertext: they are value-equal numerics, so their ORE terms must compare /// `0`. Always-on via the committed `v3_numeric_collision` fixture — the only /// place the value-equal pair can live, since the catalog distinctness guard -/// (`scalar_domains.rs` `numeric_value_guards`) forbids it in `eql_v2_numeric`. +/// (`scalar_domains.rs` `numeric_value_guards`) forbids it in `eql_v3_numeric`. /// This is the positive counterpart to that negative guard. /// /// Asserted in BOTH directions (a scale-biased comparator could pass a From f22bf19ed554af904e5005b7c0760cf6852f870c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:21:51 +1000 Subject: [PATCH 307/599] chore: update gitignore glob + mise fixture paths to eql_v3_ --- .gitignore | 2 +- mise.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 361dc3aed..87a473355 100644 --- a/.gitignore +++ b/.gitignore @@ -224,7 +224,7 @@ tests/sqlx/migrations/001_install_eql.sql # Generated SQLx fixtures (regenerated via `mise run fixture:generate`, # never commit — stale fixtures hide bugs) -tests/sqlx/fixtures/eql_v2* +tests/sqlx/fixtures/eql_v3* tests/sqlx/fixtures/v3_ste_vec.sql tests/sqlx/fixtures/v3_doc_int4.sql tests/sqlx/fixtures/v3_numeric_collision.sql diff --git a/mise.toml b/mise.toml index 45db8c820..6709aae3e 100644 --- a/mise.toml +++ b/mise.toml @@ -552,10 +552,10 @@ cp -a migrations "$BK/migrations" # The int4 fixture is gitignored (regenerated) and absent in a bare checkout — # back it up only if present, and on restore drop the empty stand-in if so. HAD_FIXTURE=0 -if [ -f fixtures/eql_v2_int4.sql ]; then cp -a fixtures/eql_v2_int4.sql "$BK/eql_v2_int4.sql"; HAD_FIXTURE=1; fi +if [ -f fixtures/eql_v3_int4.sql ]; then cp -a fixtures/eql_v3_int4.sql "$BK/eql_v3_int4.sql"; HAD_FIXTURE=1; fi restore() { rm -rf migrations && cp -a "$BK/migrations" migrations - if [ "$HAD_FIXTURE" = 1 ]; then cp -af "$BK/eql_v2_int4.sql" fixtures/eql_v2_int4.sql; else rm -f fixtures/eql_v2_int4.sql; fi + if [ "$HAD_FIXTURE" = 1 ]; then cp -af "$BK/eql_v3_int4.sql" fixtures/eql_v3_int4.sql; else rm -f fixtures/eql_v3_int4.sql; fi rm -rf "$BK" } trap restore EXIT @@ -564,7 +564,7 @@ trap restore EXIT # the snapshot deterministic across local and CI. rm -rf migrations && mkdir migrations : > migrations/0001_placeholder.sql -: > fixtures/eql_v2_int4.sql +: > fixtures/eql_v3_int4.sql # Expand into a temp file and mv into place only on success — a redirect straight # onto the snapshot would zero it before cargo runs, so a transient expand # failure would leave a 0-byte snapshot locally. (Under `set -euo pipefail` a From 7060b145941d42daa58787abeaa43a0318e92059 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:23:56 +1000 Subject: [PATCH 308/599] test(fixtures): fix doubles/scalar generate log labels to eql_v3_ --- tests/sqlx/tests/generate_all_fixtures.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index 62eff6593..1dbfdeae0 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -27,7 +27,7 @@ eql_tests::scalar_types!(fixture_dispatch); async fn generate_all() -> anyhow::Result<()> { let mut generated = 0usize; for spec in CATALOG { - eprintln!("Generating fixture eql_v2_{}...", spec.token); + eprintln!("Generating fixture eql_v3_{}...", spec.token); generate_for_token(spec.token).await?; generated += 1; } @@ -63,7 +63,7 @@ async fn generate_all() -> anyhow::Result<()> { // credential-free cross-ciphertext-equality test. Non-catalog (the catalog // fixture is the curated set exactly), generated through the same pipeline. for token in eql_tests::fixtures::eql_doubles::DOUBLES_TOKENS { - eprintln!("Generating fixture eql_v2_{token}_doubles..."); + eprintln!("Generating fixture eql_v3_{token}_doubles..."); eql_tests::fixtures::eql_doubles::generate(token).await?; } eprintln!( From cd52c55ec8897efd4382551125f77a3f0acd02eb Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:24:46 +1000 Subject: [PATCH 309/599] test(fixtures): fix doubles table name + no-creds stub paths to eql_v3_ --- tasks/test/stub-fixtures.sh | 16 ++++++++-------- .../encrypted_domain/property/fixture_oracle.rs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tasks/test/stub-fixtures.sh b/tasks/test/stub-fixtures.sh index 510cbd93c..953c53384 100644 --- a/tasks/test/stub-fixtures.sh +++ b/tasks/test/stub-fixtures.sh @@ -16,10 +16,10 @@ # The set is derived from the two sources of truth, not from parsing rustc # errors (an earlier preamble looped over compile-error text — brittle, coupled # to rustc's wording, capped at 12 retries): -# 1. Catalog scalar tokens (`eql-codegen list-types`) -> `eql_v2_.sql` -# AND `eql_v2__doubles.sql` (the per-type doubles fixture the +# 1. Catalog scalar tokens (`eql-codegen list-types`) -> `eql_v3_.sql` +# AND `eql_v3__doubles.sql` (the per-type doubles fixture the # cross-ciphertext oracle `include_str!`s), both covered by the -# `tests/sqlx/fixtures/eql_v2*` .gitignore glob. A new scalar is stubbed +# `tests/sqlx/fixtures/eql_v3*` .gitignore glob. A new scalar is stubbed # automatically. The doubles variant is stubbed for every token, not only # the comparison-capable ones that have a real doubles fixture — a harmless # extra under this helper's stub-the-complete-set policy. @@ -46,23 +46,23 @@ __eql_stub_dir="${__eql_stub_root}/tests/sqlx/fixtures" __eql_stub_created=$(mktemp) trap 'while IFS= read -r f; do [ -n "$f" ] && rm -f "$f"; done < "$__eql_stub_created"; rm -f "$__eql_stub_created"' EXIT -# (1) Catalog scalar tokens -> eql_v2_.sql + eql_v2__doubles.sql. +# (1) Catalog scalar tokens -> eql_v3_.sql + eql_v3__doubles.sql. # A failure here aborts under the caller's `set -e` with cargo's own error — no # silent fallback. __eql_stub_paths="" __eql_stub_tokens=$(cd "$__eql_stub_root" && cargo run -q -p eql-codegen -- list-types) while IFS= read -r __eql_stub_t; do [ -n "$__eql_stub_t" ] || continue - __eql_stub_paths="${__eql_stub_paths}${__eql_stub_dir}/eql_v2_${__eql_stub_t}.sql -${__eql_stub_dir}/eql_v2_${__eql_stub_t}_doubles.sql + __eql_stub_paths="${__eql_stub_paths}${__eql_stub_dir}/eql_v3_${__eql_stub_t}.sql +${__eql_stub_dir}/eql_v3_${__eql_stub_t}_doubles.sql " done </dev/null || true) while IFS= read -r __eql_stub_rel; do [ -n "$__eql_stub_rel" ] || continue diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index b41adb426..20b258916 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -179,7 +179,7 @@ pub(crate) async fn load_doubles_rows(pool: &PgPool) -> Result = sqlx::query_as(&sql).fetch_all(pool).await?; let rows: Vec> = raw From fd2d64a4700a743f085946b990662edd986b3ebd Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 09:32:15 +1000 Subject: [PATCH 310/599] docs: align fixture naming references to eql_v3_; fix stale prototype comments --- CLAUDE.md | 2 +- crates/eql-types/src/v3/mod.rs | 2 +- .../adding-a-scalar-encrypted-domain-type.md | 4 ++-- src/ore_block_u64_8_256/operators.sql | 2 +- tasks/fixtures.toml | 4 ++-- tests/sqlx/README.md | 4 ++-- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 14 +++++++------- tests/sqlx/src/fixtures/v3_ste_vec.rs | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index be3a36056..3756757c5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -110,7 +110,7 @@ EQL is searchable encryption; tests MUST use real ciphertexts/index terms from t never hand-curated or synthetic blobs. Fixtures are **generated** by encrypting plaintext through cipherstash-client: `mise run test:sqlx:prep` runs `fixture:generate:all` (the `generate_all_fixtures` test, `--features fixture-gen`, over `eql-scalars::CATALOG`) → gitignored -`tests/sqlx/fixtures/eql_v2_*.sql`. +`tests/sqlx/fixtures/eql_v3_*.sql`. - The SQLx suite **requires** CipherStash creds — ZeroKMS auth (`CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN`) AND a client key (`CS_CLIENT_ID` + `CS_CLIENT_KEY`); see the diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index e8a05fe85..19dfa67eb 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -1,7 +1,7 @@ //! # `eql_v3` domain payload types //! //! One Rust struct per **SQL domain** in the `eql_v3` schema — the -//! capability-encoded design from the original `eql_v2_int4` prototype +//! capability-encoded design from the original int4 scalar prototype //! (PR #236's first cut), formalized: //! the SQL surface is generated from `eql-scalars::CATALOG`, and these types //! mirror it 1:1 (enforced by `tests/catalog_parity.rs`, which fails if the diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 9a178a53f..7671e3569 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -189,7 +189,7 @@ int_values!(INT4_VALUES, i32, INT4); ``` Both consumers reference that single symbol — the fixture generator -(`fixtures::eql_v2_::spec`) and the matrix oracle's `fixture_values()` — so +(`fixtures::eql_v3_::spec`) and the matrix oracle's `fixture_values()` — so the oracle cannot drift from the values the generator encrypts. There is no committed `_values.rs`: a Rust source of truth does not round-trip through generated Rust. Pin the exact materialised list with a `values_tests` assertion. @@ -271,7 +271,7 @@ integer kinds: | File | Add | |------|-----| -| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType` **(integer kinds only)**, the `eql_v2_` fixture module, the `scalar_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | +| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType` **(integer kinds only)**, the `eql_v3_` fixture module, the `scalar_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | | `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}` and `impl EqlPlaintext for ` carrying just `const KIND: ScalarKind` plus the value-typed `to_plaintext` → the right `Plaintext` variant. `CAST` and `PLAINTEXT_SQL_TYPE` are **derived** from `KIND` via the `cast_for_kind` / `plaintext_sql_type_for_kind` `const fn` defaults, so a brand-new kind needs an arm in those two helpers — not a per-type const (see §3.1 for a non-integer kind's full wiring). Keep the three `#[test]`s (cast / sql-type / to_plaintext) mirroring the existing ones. | | `tests/sqlx/src/scalar_domains.rs` **(non-integer only)** | The `impl ScalarType` the proc-macro skips for non-integer kinds. For a **chrono-backed** kind (`date`, `timestamptz`) this is a `temporal_values!` invocation that materialises the catalog ISO/RFC3339 strings into a `LazyLock>` and emits `impl ScalarType` + `OrderedScalar` (+ `SignedScalar` for `date`). For **`text`** it is a hand-written `impl ScalarType` / `OrderedScalar` block (lexicographic `min`/`max`/`mid` pivots, `to_sql_literal` override) — `String` has no numeric origin, so it is deliberately **not** `SignedScalar`. | diff --git a/src/ore_block_u64_8_256/operators.sql b/src/ore_block_u64_8_256/operators.sql index 06a4fa65d..35117cfe3 100644 --- a/src/ore_block_u64_8_256/operators.sql +++ b/src/ore_block_u64_8_256/operators.sql @@ -128,7 +128,7 @@ $$; --! is required for a MERGES (mergejoinable) operator — without it the --! planner raises "could not find commutator" the first time an --! ore_block equality is used as a join qual (e.g. via the inlined ---! eql_v2_int4_ord_ore equality wrappers). +--! eql_v3.int4_ord_ore equality wrappers). CREATE OPERATOR = ( FUNCTION=eql_v2.ore_block_u64_8_256_eq, LEFTARG=eql_v2.ore_block_u64_8_256, diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index 04b7d5b52..688c8a006 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -3,10 +3,10 @@ description = "Regenerate every scalar SQLx fixture in one process, driven by eq # Replaces the Python-era per-type `fixture:generate ` script and the # TOML-glob `fixture:generate:all` loop (one `cargo test` per type). The # generate_all_fixtures test iterates eql-scalars::CATALOG and runs every -# eql_v2_ fixture generator in a SINGLE process. The encrypted-fixture logic +# eql_v3_ fixture generator in a SINGLE process. The encrypted-fixture logic # is unchanged; only enumeration + entry point changed. # -# Writes tests/sqlx/fixtures/eql_v2_.sql (gitignored — regenerated on every +# Writes tests/sqlx/fixtures/eql_v3_.sql (gitignored — regenerated on every # `mise run test:sqlx`). # # Prerequisites: diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index 346a7dd57..d57d4d57e 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -50,8 +50,8 @@ cargo test -- --nocapture ### Generator credentials -`mise run test:sqlx` regenerates the `eql_v2_int4` fixture before running the -suite via `mise run fixture:generate eql_v2_int4`. The generator encrypts +`mise run test:sqlx` regenerates the `eql_v3_int4` fixture before running the +suite via `mise run fixture:generate eql_v3_int4`. The generator encrypts plaintexts in-process using `cipherstash-client` (no Proxy / no Docker sidecar), so the following CipherStash workspace credentials must be present in the shell environment when you run it locally or in CI: diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index c8122b062..638e3089f 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -17,10 +17,10 @@ EQL Extension (via migrations) ├── ore table (migration 002 — not a fixture) └── bench_data.sql + bench_setup.sql (depend on migration 007) -eql_v2_int4.sql (no EQL dependency — generated, plain jsonb, not committed) +eql_v3_int4.sql (no EQL dependency — generated, plain jsonb, not committed) ``` -All fixtures except the generated `eql_v2_int4.sql` depend on the EQL extension being installed via SQLx migrations. +All fixtures except the generated `eql_v3_int4.sql` depend on the EQL extension being installed via SQLx migrations. --- @@ -189,7 +189,7 @@ CREATE TABLE bench ( --- -## eql_v2_int4.sql +## eql_v3_int4.sql **Purpose:** 17 encrypted integers for verifying encrypted-integer fixture structure. The set MUST include the signed extremes (`i32::MIN`/`i32::MAX`) and @@ -210,11 +210,11 @@ environment (they are not alternatives): `CS_CLIENT_ACCESS_KEY` + generated file; it is overwritten in place on every run. **Schema:** Table lives in the dedicated `fixtures` SQL schema (kept out of the -`public` type/domain namespace so a downstream `public.eql_v2_int4` domain can +`public` type/domain namespace so a downstream `public.eql_v3_int4` domain can coexist): ```sql CREATE SCHEMA IF NOT EXISTS fixtures; -CREATE TABLE fixtures.eql_v2_int4 ( +CREATE TABLE fixtures.eql_v3_int4 ( id BIGINT PRIMARY KEY, plaintext integer NOT NULL, payload jsonb NOT NULL @@ -235,12 +235,12 @@ CREATE TABLE fixtures.eql_v2_int4 ( **Used By:** - `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` (structural verification, generated per type) -- (#225) the `eql_v2_int4` domain operator tests, via per-query `payload` casts +- (#225) the `eql_v3_int4` domain operator tests, via per-query `payload` casts **Opt-in:** Not a migration — a SQLx fixture script. Each consuming test opts in explicitly: ```rust -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v2_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] ``` --- diff --git a/tests/sqlx/src/fixtures/v3_ste_vec.rs b/tests/sqlx/src/fixtures/v3_ste_vec.rs index 4e1a04eeb..0a76997f2 100644 --- a/tests/sqlx/src/fixtures/v3_ste_vec.rs +++ b/tests/sqlx/src/fixtures/v3_ste_vec.rs @@ -1,5 +1,5 @@ //! The `v3_ste_vec` jsonb (SteVec document) fixture — the document analogue -//! of the scalar `eql_v2_` fixtures, generated through the SAME +//! of the scalar `eql_v3_` fixtures, generated through the SAME //! `FixtureSpec` machinery. //! //! A `serde_json::Value` is a first-class `EqlPlaintext` (see From 12a1b03d65265413e030f7bc1ccec0bad8a82208 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 10:07:31 +1000 Subject: [PATCH 311/599] test(fixtures): regenerate int4 expand snapshot for eql_v3_ rename Also picks up pre-existing matrix.rs line-number drift: the committed snapshot (c611216f, 2026-06-16) predated 9 matrix.rs commits through 2026-06-19, so source spans had shifted independently of this rename. --- tests/sqlx/snapshots/int4_expanded.rs | 3621 +++++++++++++++++-------- 1 file changed, 2537 insertions(+), 1084 deletions(-) diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/int4_expanded.rs index 1bd7d1322..812d18911 100644 --- a/tests/sqlx/snapshots/int4_expanded.rs +++ b/tests/sqlx/snapshots/int4_expanded.rs @@ -1,4 +1,4 @@ -///`eql_v2_int4` matrix suite — generated by `scalar_types!`. +///`eql_v3_int4` matrix suite — generated by `scalar_types!`. pub mod int4 { extern crate test; #[rustc_test_marker = "scalars::int4::matrix_int4_storage_sanity"] @@ -9,9 +9,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 553usize, + start_line: 725usize, start_col: 26usize, - end_line: 553usize, + end_line: 725usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -86,9 +86,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 553usize, + start_line: 725usize, start_col: 26usize, - end_line: 553usize, + end_line: 725usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -163,9 +163,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 553usize, + start_line: 725usize, start_col: 26usize, - end_line: 553usize, + end_line: 725usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -240,9 +240,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 553usize, + start_line: 725usize, start_col: 26usize, - end_line: 553usize, + end_line: 725usize, end_col: 60usize, compile_fail: false, no_run: false, @@ -319,9 +319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -350,7 +350,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -399,7 +400,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -418,9 +419,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -449,7 +450,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -498,7 +500,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -517,9 +519,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -548,7 +550,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -597,7 +600,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -616,9 +619,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -647,7 +650,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -696,7 +700,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -715,9 +719,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -746,7 +750,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -795,7 +800,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -814,9 +819,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -845,7 +850,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -894,7 +900,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -913,9 +919,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -944,7 +950,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -993,7 +1000,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1012,9 +1019,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1043,7 +1050,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -1092,7 +1100,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1111,9 +1119,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1142,7 +1150,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -1191,7 +1200,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1210,9 +1219,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1241,7 +1250,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -1290,7 +1300,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1309,9 +1319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1340,7 +1350,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -1389,7 +1400,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1408,9 +1419,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1439,7 +1450,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -1488,7 +1500,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1507,9 +1519,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1538,7 +1550,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -1587,7 +1600,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1606,9 +1619,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1637,7 +1650,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -1686,7 +1700,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1705,9 +1719,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1736,7 +1750,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "=", lit, @@ -1785,7 +1800,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1804,9 +1819,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1835,7 +1850,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -1884,7 +1900,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -1903,9 +1919,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -1934,7 +1950,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -1983,7 +2000,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2002,9 +2019,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2033,7 +2050,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<>", lit, @@ -2082,7 +2100,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2101,9 +2119,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2132,7 +2150,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<", lit, @@ -2181,7 +2200,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2200,9 +2219,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2231,7 +2250,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<", lit, @@ -2280,7 +2300,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2299,9 +2319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2330,7 +2350,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<", lit, @@ -2379,7 +2400,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2398,9 +2419,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2429,7 +2450,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<=", lit, @@ -2478,7 +2500,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2497,9 +2519,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2528,7 +2550,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<=", lit, @@ -2577,7 +2600,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2596,9 +2619,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2627,7 +2650,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<=", lit, @@ -2676,7 +2700,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2695,9 +2719,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2726,7 +2750,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">", lit, @@ -2775,7 +2800,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2794,9 +2819,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2825,7 +2850,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">", lit, @@ -2874,7 +2900,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2893,9 +2919,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -2924,7 +2950,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">", lit, @@ -2973,7 +3000,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -2992,9 +3019,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3023,7 +3050,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">=", lit, @@ -3072,7 +3100,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3091,9 +3119,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3122,7 +3150,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">=", lit, @@ -3171,7 +3200,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3190,9 +3219,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3221,7 +3250,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">=", lit, @@ -3270,7 +3300,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3289,9 +3319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3320,7 +3350,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<", lit, @@ -3369,7 +3400,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3388,9 +3419,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3419,7 +3450,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<", lit, @@ -3468,7 +3500,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3487,9 +3519,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3518,7 +3550,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<", lit, @@ -3567,7 +3600,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3586,9 +3619,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3617,7 +3650,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<=", lit, @@ -3666,7 +3700,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3685,9 +3719,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3716,7 +3750,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<=", lit, @@ -3765,7 +3800,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3784,9 +3819,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3815,7 +3850,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, "<=", lit, @@ -3864,7 +3900,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3883,9 +3919,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -3914,7 +3950,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">", lit, @@ -3963,7 +4000,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -3982,9 +4019,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4013,7 +4050,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">", lit, @@ -4062,7 +4100,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4081,9 +4119,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4112,7 +4150,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">", lit, @@ -4161,7 +4200,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4180,9 +4219,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4211,7 +4250,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">=", lit, @@ -4260,7 +4300,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4279,9 +4319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4310,7 +4350,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">=", lit, @@ -4359,7 +4400,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4378,9 +4419,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 689usize, + start_line: 861usize, start_col: 22usize, - end_line: 689usize, + end_line: 861usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4409,7 +4450,8 @@ pub mod int4 { let predicate = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{0} {1} {2}::jsonb::{0}", + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, &spec.sql_domain, ">=", lit, @@ -4458,7 +4500,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4477,9 +4519,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4516,14 +4558,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -4535,7 +4579,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -4544,7 +4588,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -4624,7 +4668,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4643,9 +4687,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4682,14 +4726,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -4701,7 +4747,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -4710,7 +4756,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -4790,7 +4836,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4809,9 +4855,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -4848,14 +4894,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -4867,7 +4915,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -4876,7 +4924,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -4956,7 +5004,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -4975,9 +5023,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5014,14 +5062,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -5033,7 +5083,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -5042,7 +5092,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -5122,7 +5172,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -5141,9 +5191,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5180,14 +5230,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -5199,7 +5251,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -5208,7 +5260,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -5288,7 +5340,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -5307,9 +5359,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5346,14 +5398,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -5365,7 +5419,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -5374,7 +5428,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -5454,7 +5508,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -5473,9 +5527,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5512,14 +5566,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -5531,7 +5587,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -5540,7 +5596,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -5620,7 +5676,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -5639,9 +5695,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5678,14 +5734,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -5697,7 +5755,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -5706,7 +5764,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -5786,7 +5844,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -5805,9 +5863,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -5844,14 +5902,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -5863,7 +5923,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -5872,7 +5932,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -5952,7 +6012,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -5971,9 +6031,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6010,14 +6070,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -6029,7 +6091,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -6038,7 +6100,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -6118,7 +6180,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -6137,9 +6199,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6176,14 +6238,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -6195,7 +6259,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -6204,7 +6268,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -6284,7 +6348,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -6303,9 +6367,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6342,14 +6406,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -6361,7 +6427,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -6370,7 +6436,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -6450,7 +6516,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -6469,9 +6535,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6508,14 +6574,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -6527,7 +6595,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -6536,7 +6604,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -6616,7 +6684,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -6635,9 +6703,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6674,14 +6742,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -6693,7 +6763,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -6702,7 +6772,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -6782,7 +6852,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -6801,9 +6871,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -6840,14 +6910,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "=", + col, d, lit, ), @@ -6859,7 +6931,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), ) }), forward_count, @@ -6868,7 +6940,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), ) }), commuted_count, @@ -6948,7 +7020,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -6967,9 +7039,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7006,14 +7078,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -7025,7 +7099,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -7034,7 +7108,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -7114,7 +7188,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -7133,9 +7207,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7172,14 +7246,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -7191,7 +7267,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -7200,7 +7276,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -7280,7 +7356,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -7299,9 +7375,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7338,14 +7414,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<>", + col, d, lit, ), @@ -7357,7 +7435,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<>", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), ) }), forward_count, @@ -7366,7 +7444,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<>", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), ) }), commuted_count, @@ -7446,7 +7524,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -7465,9 +7543,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7504,14 +7582,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<", + col, d, lit, ), @@ -7523,7 +7603,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), ) }), forward_count, @@ -7532,7 +7612,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), ) }), commuted_count, @@ -7612,7 +7692,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -7631,9 +7711,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7670,14 +7750,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<", + col, d, lit, ), @@ -7689,7 +7771,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), ) }), forward_count, @@ -7698,7 +7780,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), ) }), commuted_count, @@ -7778,7 +7860,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -7797,9 +7879,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -7836,14 +7918,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<", + col, d, lit, ), @@ -7855,7 +7939,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), ) }), forward_count, @@ -7864,7 +7948,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), ) }), commuted_count, @@ -7944,7 +8028,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -7963,9 +8047,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8002,14 +8086,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<=", + col, d, lit, ), @@ -8021,7 +8107,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), ) }), forward_count, @@ -8030,7 +8116,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), ) }), commuted_count, @@ -8110,7 +8196,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -8129,9 +8215,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8168,14 +8254,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<=", + col, d, lit, ), @@ -8187,7 +8275,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), ) }), forward_count, @@ -8196,7 +8284,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), ) }), commuted_count, @@ -8276,7 +8364,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -8295,9 +8383,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8334,14 +8422,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<=", + col, d, lit, ), @@ -8353,7 +8443,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), ) }), forward_count, @@ -8362,7 +8452,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), ) }), commuted_count, @@ -8442,7 +8532,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -8461,9 +8551,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8500,14 +8590,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">", + col, d, lit, ), @@ -8519,7 +8611,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), ) }), forward_count, @@ -8528,7 +8620,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), ) }), commuted_count, @@ -8608,7 +8700,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -8627,9 +8719,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8666,14 +8758,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">", + col, d, lit, ), @@ -8685,7 +8779,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), ) }), forward_count, @@ -8694,7 +8788,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), ) }), commuted_count, @@ -8774,7 +8868,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -8793,9 +8887,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8832,14 +8926,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">", + col, d, lit, ), @@ -8851,7 +8947,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), ) }), forward_count, @@ -8860,7 +8956,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), ) }), commuted_count, @@ -8940,7 +9036,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -8959,9 +9055,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -8998,14 +9094,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">=", + col, d, lit, ), @@ -9017,7 +9115,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), ) }), forward_count, @@ -9026,7 +9124,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), ) }), commuted_count, @@ -9106,7 +9204,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -9125,9 +9223,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9164,14 +9262,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">=", + col, d, lit, ), @@ -9183,7 +9283,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), ) }), forward_count, @@ -9192,7 +9292,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), ) }), commuted_count, @@ -9272,7 +9372,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -9291,9 +9391,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9330,14 +9430,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">=", + col, d, lit, ), @@ -9349,7 +9451,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), ) }), forward_count, @@ -9358,7 +9460,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), ) }), commuted_count, @@ -9438,7 +9540,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -9457,9 +9559,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9496,14 +9598,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<", + col, d, lit, ), @@ -9515,7 +9619,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), ) }), forward_count, @@ -9524,7 +9628,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), ) }), commuted_count, @@ -9604,7 +9708,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -9623,9 +9727,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9662,14 +9766,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<", + col, d, lit, ), @@ -9681,7 +9787,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), ) }), forward_count, @@ -9690,7 +9796,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), ) }), commuted_count, @@ -9770,7 +9876,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -9789,9 +9895,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9828,14 +9934,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<", + col, d, lit, ), @@ -9847,7 +9955,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), ) }), forward_count, @@ -9856,7 +9964,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), ) }), commuted_count, @@ -9936,7 +10044,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -9955,9 +10063,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -9994,14 +10102,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<=", + col, d, lit, ), @@ -10013,7 +10123,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), ) }), forward_count, @@ -10022,7 +10132,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), ) }), commuted_count, @@ -10102,7 +10212,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -10121,9 +10231,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10160,14 +10270,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<=", + col, d, lit, ), @@ -10179,7 +10291,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), ) }), forward_count, @@ -10188,7 +10300,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), ) }), commuted_count, @@ -10268,7 +10380,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -10287,9 +10399,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10326,14 +10438,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", "<=", + col, d, lit, ), @@ -10345,7 +10459,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", "<=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), ) }), forward_count, @@ -10354,7 +10468,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", "<=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), ) }), commuted_count, @@ -10434,7 +10548,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -10453,9 +10567,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10492,14 +10606,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">", + col, d, lit, ), @@ -10511,7 +10627,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), ) }), forward_count, @@ -10520,7 +10636,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), ) }), commuted_count, @@ -10600,7 +10716,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -10619,9 +10735,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10658,14 +10774,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">", + col, d, lit, ), @@ -10677,7 +10795,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), ) }), forward_count, @@ -10686,7 +10804,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), ) }), commuted_count, @@ -10766,7 +10884,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -10785,9 +10903,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10824,14 +10942,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">", + col, d, lit, ), @@ -10843,7 +10963,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), ) }), forward_count, @@ -10852,7 +10972,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), ) }), commuted_count, @@ -10932,7 +11052,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -10951,9 +11071,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -10990,14 +11110,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">=", + col, d, lit, ), @@ -11009,7 +11131,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), ) }), forward_count, @@ -11018,7 +11140,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), ) }), commuted_count, @@ -11098,7 +11220,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -11117,9 +11239,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11156,14 +11278,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">=", + col, d, lit, ), @@ -11175,7 +11299,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), ) }), forward_count, @@ -11184,7 +11308,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), ) }), commuted_count, @@ -11264,7 +11388,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -11283,9 +11407,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 730usize, + start_line: 902usize, start_col: 22usize, - end_line: 730usize, + end_line: 902usize, end_col: 96usize, compile_fail: false, no_run: false, @@ -11322,14 +11446,16 @@ pub mod int4 { ) .len() as i64; let d = &spec.sql_domain; + let col = &spec.column_expr; let shapes = [ ( "d_d", ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "payload::{1} {0} {2}::jsonb::{1}", + "({1})::{2} {0} {3}::jsonb::{2}", ">=", + col, d, lit, ), @@ -11341,7 +11467,7 @@ pub mod int4 { "d_j", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("payload::{1} {0} {2}::jsonb", ">=", d, lit), + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), ) }), forward_count, @@ -11350,7 +11476,7 @@ pub mod int4 { "j_d", ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1}::jsonb {0} payload::{2}", ">=", lit, d), + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), ) }), commuted_count, @@ -11430,7 +11556,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -11449,9 +11575,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11471,7 +11597,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -11542,9 +11668,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11564,7 +11690,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Eq); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -11635,9 +11761,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11657,7 +11783,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -11728,9 +11854,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11750,7 +11876,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -11821,9 +11947,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11843,7 +11969,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -11914,9 +12040,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -11936,7 +12062,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12007,9 +12133,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12029,7 +12155,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12100,9 +12226,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12122,7 +12248,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12193,9 +12319,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12215,7 +12341,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12286,9 +12412,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12308,7 +12434,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::Ord); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12379,9 +12505,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12401,7 +12527,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12472,9 +12598,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12494,7 +12620,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12565,9 +12691,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12587,7 +12713,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12658,9 +12784,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 782usize, + start_line: 959usize, start_col: 22usize, - end_line: 782usize, + end_line: 959usize, end_col: 79usize, compile_fail: false, no_run: false, @@ -12680,7 +12806,7 @@ pub mod int4 { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, >(::eql_tests::scalar_domains::Variant::OrdOre); - let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let payload = spec.placeholder_payload; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( @@ -12749,9 +12875,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -12884,9 +13010,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13019,9 +13145,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13154,9 +13280,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13289,9 +13415,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13424,9 +13550,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13561,9 +13687,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13698,9 +13824,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13833,9 +13959,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -13966,9 +14092,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14099,9 +14225,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14232,9 +14358,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14365,9 +14491,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14502,9 +14628,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14639,9 +14765,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14776,9 +14902,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -14913,9 +15039,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15050,9 +15176,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 846usize, + start_line: 1023usize, start_col: 22usize, - end_line: 846usize, + end_line: 1023usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -15187,9 +15313,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 913usize, + start_line: 1090usize, start_col: 22usize, - end_line: 913usize, + end_line: 1090usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15327,9 +15453,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 913usize, + start_line: 1090usize, start_col: 22usize, - end_line: 913usize, + end_line: 1090usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15465,9 +15591,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 913usize, + start_line: 1090usize, start_col: 22usize, - end_line: 913usize, + end_line: 1090usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15607,9 +15733,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 913usize, + start_line: 1090usize, start_col: 22usize, - end_line: 913usize, + end_line: 1090usize, end_col: 67usize, compile_fail: false, no_run: false, @@ -15749,9 +15875,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 986usize, + start_line: 1163usize, start_col: 22usize, - end_line: 986usize, + end_line: 1163usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15850,9 +15976,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 986usize, + start_line: 1163usize, start_col: 22usize, - end_line: 986usize, + end_line: 1163usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -15953,9 +16079,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 986usize, + start_line: 1163usize, start_col: 22usize, - end_line: 986usize, + end_line: 1163usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16056,9 +16182,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 986usize, + start_line: 1163usize, start_col: 22usize, - end_line: 986usize, + end_line: 1163usize, end_col: 70usize, compile_fail: false, no_run: false, @@ -16159,9 +16285,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1043usize, + start_line: 1220usize, start_col: 22usize, - end_line: 1043usize, + end_line: 1220usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16248,9 +16374,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1043usize, + start_line: 1220usize, start_col: 22usize, - end_line: 1043usize, + end_line: 1220usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16337,9 +16463,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1043usize, + start_line: 1220usize, start_col: 22usize, - end_line: 1043usize, + end_line: 1220usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16426,9 +16552,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1043usize, + start_line: 1220usize, start_col: 22usize, - end_line: 1043usize, + end_line: 1220usize, end_col: 71usize, compile_fail: false, no_run: false, @@ -16505,20 +16631,20 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_typed_column_blocker"] + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_native_jsonb_blockers"] #[doc(hidden)] - pub const matrix_int4_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_int4_storage_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_typed_column_blocker", + "scalars::int4::matrix_int4_storage_native_jsonb_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1096usize, + start_line: 1295usize, start_col: 22usize, - end_line: 1096usize, - end_col: 74usize, + end_line: 1295usize, + end_col: 75usize, compile_fail: false, no_run: false, should_panic: test::ShouldPanic::No, @@ -16526,11 +16652,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_typed_column_blocker()), + || test::assert_test_result(matrix_int4_storage_native_jsonb_blockers()), ), }; - fn matrix_int4_storage_typed_column_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_typed_column_blocker( + fn matrix_int4_storage_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_int4_storage_native_jsonb_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16539,171 +16665,1067 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Storage); let d = &spec.sql_domain; let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; - let mut tx = pool.begin().await?; - let create_sql = ::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", - d, - ), - ) - }); - sqlx::query(&create_sql).execute(&mut *tx).await?; - let insert_sql = ::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", - d, - ), - ) - }); - sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; - sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; - let sql = ::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT * FROM typed_col WHERE value {0} value", - "=", - ), - ) - }); - let err = sqlx::query(&sql) - .fetch_all(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1} column {0} must raise", "=", d), + format_args!("$1::jsonb::{0} ? \'c\'::text", d), ) }), - ) - .to_string(); - let expected = ::eql_tests::scalar_domains::blocker_msg(d, "="); - if ::anyhow::__private::not(err.contains(&expected)) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!( - "unexpected error for {0}: got {1}, want {2}", - sql, - err, - expected, - ), - ); - error - }); - } - sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; - sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; - let sql = ::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT * FROM typed_col WHERE value {0} value", - "<>", - ), - ) - }); - let err = sqlx::query(&sql) - .fetch_all(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ + ), + ( + "?|", + ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1} column {0} must raise", "<>", d), + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), ) }), - ) - .to_string(); - let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<>"); - if ::anyhow::__private::not(err.contains(&expected)) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!( - "unexpected error for {0}: got {1}, want {2}", - sql, - err, - expected, - ), - ); - error - }); - } - sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; - sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; - let sql = ::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT * FROM typed_col WHERE value {0} value", - "<", - ), - ) - }); - let err = sqlx::query(&sql) - .fetch_all(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ + ), + ( + "?&", + ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1} column {0} must raise", "<", d), + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), ) }), - ) - .to_string(); - let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<"); - if ::anyhow::__private::not(err.contains(&expected)) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!( - "unexpected error for {0}: got {1}, want {2}", - sql, - err, - expected, - ), - ); - error - }); - } - sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; - sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; - let sql = ::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT * FROM typed_col WHERE value {0} value", - "<=", - ), - ) - }); - let err = sqlx::query(&sql) - .fetch_all(&mut *tx) - .await - .expect_err( - &::alloc::__export::must_use({ + ), + ( + "#>", + ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("{1} column {0} must raise", "<=", d), + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), ) }), - ) - .to_string(); - let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<="); - if ::anyhow::__private::not(err.contains(&expected)) { + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "unexpected error for {0}: got {1}, want {2}", - sql, - err, - expected, + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, ), ); error }); } - sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; - sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; - let sql = ::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT * FROM typed_col WHERE value {0} value", - ">", + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_storage_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_eq_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_int4_eq_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_eq_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_eq_native_jsonb_blockers()), + ), + }; + fn matrix_int4_eq_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_int4_eq_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_eq_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_eq_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_int4_ord_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_native_jsonb_blockers()), + ), + }; + fn matrix_int4_ord_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_int4_ord_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_int4_ord_ore_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_ord_ore_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_ord_ore_native_jsonb_blockers()), + ), + }; + fn matrix_int4_ord_ore_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_int4_ord_ore_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_ord_ore_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_int4_ord_ore_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_int4_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1398usize, + start_col: 22usize, + end_line: 1398usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_typed_column_blocker()), + ), + }; + fn matrix_int4_storage_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_int4_storage_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">", ), ) }); @@ -16886,9 +17908,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1096usize, + start_line: 1398usize, start_col: 22usize, - end_line: 1096usize, + end_line: 1398usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17187,9 +18209,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1096usize, + start_line: 1398usize, start_col: 22usize, - end_line: 1096usize, + end_line: 1398usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17348,9 +18370,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1096usize, + start_line: 1398usize, start_col: 22usize, - end_line: 1096usize, + end_line: 1398usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -17509,9 +18531,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1177usize, + start_line: 1479usize, start_col: 22usize, - end_line: 1177usize, + end_line: 1479usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17673,9 +18695,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1177usize, + start_line: 1479usize, start_col: 22usize, - end_line: 1177usize, + end_line: 1479usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -17837,9 +18859,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1177usize, + start_line: 1479usize, start_col: 22usize, - end_line: 1177usize, + end_line: 1479usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18001,9 +19023,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1177usize, + start_line: 1479usize, start_col: 22usize, - end_line: 1177usize, + end_line: 1479usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18165,9 +19187,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1177usize, + start_line: 1479usize, start_col: 22usize, - end_line: 1177usize, + end_line: 1479usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -18329,9 +19351,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1948usize, + start_line: 2392usize, start_col: 22usize, - end_line: 1948usize, + end_line: 2392usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18377,7 +19399,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, &spec.sql_domain, fixture_table, table, @@ -18489,7 +19512,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -18508,9 +19531,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1948usize, + start_line: 2392usize, start_col: 22usize, - end_line: 1948usize, + end_line: 2392usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18556,7 +19579,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, &spec.sql_domain, fixture_table, table, @@ -18668,7 +19692,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -18687,9 +19711,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1948usize, + start_line: 2392usize, start_col: 22usize, - end_line: 1948usize, + end_line: 2392usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -18735,7 +19759,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, &spec.sql_domain, fixture_table, table, @@ -18967,7 +19992,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -18986,9 +20011,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1948usize, + start_line: 2392usize, start_col: 22usize, - end_line: 1948usize, + end_line: 2392usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19034,7 +20059,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {2}(plaintext, value) SELECT plaintext, payload::{0} FROM {1}", + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, &spec.sql_domain, fixture_table, table, @@ -19266,7 +20292,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -19285,9 +20311,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1370usize, + start_line: 1794usize, start_col: 22usize, - end_line: 1370usize, + end_line: 1794usize, end_col: 86usize, compile_fail: false, no_run: false, @@ -19470,7 +20496,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -19487,9 +20513,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1461usize, + start_line: 1885usize, start_col: 22usize, - end_line: 1461usize, + end_line: 1885usize, end_col: 55usize, compile_fail: false, no_run: false, @@ -19565,85 +20591,140 @@ pub mod int4 { error }); } - let mut term_checks: Vec<(&str, &str)> = ::alloc::boxed::box_assume_init_into_vec_unsafe( - ::alloc::intrinsics::write_box_via_move( - ::alloc::boxed::Box::new_uninit(), - [ - ( - "hm string", - "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", - ), - ( - "ob array", - "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", - ), - ( - "c string", - "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", - ), - ], - ), - ); - if ::eql_tests::scalar_domains::token_has_bloom_term( + if ::eql_tests::scalar_domains::token_is_storage_only( ::PG_TYPE, ) { - term_checks - .push(( - "bf array", - "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", - )); - } - for (label, predicate) in term_checks { - let missing: i64 = sqlx::query_scalar( + let missing_c: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload->\'c\' IS NULL OR jsonb_typeof(payload->\'c\') <> \'string\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(missing_c == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "every storage-only payload must carry a `c string` term; missing = {0}", + missing_c, + ), + ); + error + }); + } + for term in ["hm", "ob", "bf"] { + let present: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'{1}\'", + table, + term, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(present == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "storage-only payload must NOT carry a `{0}` term; present = {1}", + term, + present, + ), + ); + error + }); + } + } + } else { + let mut term_checks: Vec<(&str, &str)> = ::alloc::boxed::box_assume_init_into_vec_unsafe( + ::alloc::intrinsics::write_box_via_move( + ::alloc::boxed::Box::new_uninit(), + [ + ( + "hm string", + "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", + ), + ( + "ob array", + "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", + ), + ( + "c string", + "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", + ), + ], + ), + ); + if ::eql_tests::scalar_domains::token_has_bloom_term( + ::PG_TYPE, + ) { + term_checks + .push(( + "bf array", + "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", + )); + } + for (label, predicate) in term_checks { + let missing: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(missing == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "every payload must carry a `{0}` term; missing = {1}", + label, + missing, + ), + ); + error + }); + } + } + let distinct_hm: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT COUNT(*) FROM {0} WHERE {1}", + "SELECT COUNT(DISTINCT payload->>\'hm\') FROM {0}", table, - predicate, ), ) }), ) .fetch_one(&pool) .await?; - if ::anyhow::__private::not(missing == 0) { + if ::anyhow::__private::not(distinct_hm == n) { return ::anyhow::__private::Err({ let error = ::anyhow::__private::format_err( format_args!( - "every payload must carry a `{0}` term; missing = {1}", - label, - missing, + "{0} distinct values -> {0} distinct hm terms; got {1}", + n, + distinct_hm, ), ); error }); } } - let distinct_hm: i64 = sqlx::query_scalar( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT COUNT(DISTINCT payload->>\'hm\') FROM {0}", - table, - ), - ) - }), - ) - .fetch_one(&pool) - .await?; - if ::anyhow::__private::not(distinct_hm == n) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!( - "{0} distinct values -> {0} distinct hm terms; got {1}", - n, - distinct_hm, - ), - ); - error - }); - } let mismatched_version: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -19738,7 +20819,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -19757,9 +20838,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1574usize, + start_line: 2018usize, start_col: 22usize, - end_line: 1574usize, + end_line: 2018usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19999,7 +21080,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -20018,9 +21099,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1574usize, + start_line: 2018usize, start_col: 22usize, - end_line: 1574usize, + end_line: 2018usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -20260,7 +21341,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -20279,9 +21360,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 1885usize, + start_line: 2329usize, start_col: 22usize, - end_line: 1885usize, + end_line: 2329usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -20362,7 +21443,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -20379,9 +21460,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2414usize, + start_line: 2862usize, start_col: 22usize, - end_line: 2414usize, + end_line: 2862usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -20403,6 +21484,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() @@ -20414,8 +21496,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", extremum_lit, + col, + d, fixture, ), ) @@ -20427,8 +21511,9 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", "min", + col, d, fixture, ), @@ -20458,13 +21543,27 @@ pub mod int4 { } } }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "min", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); let ord_terms_match: bool = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", - "min", - d, + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, fixture, ), ) @@ -20524,7 +21623,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -20543,9 +21642,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2472usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2472usize, + end_line: 2922usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -20655,9 +21754,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2497usize, + start_line: 2947usize, start_col: 22usize, - end_line: 2497usize, + end_line: 2947usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -20754,9 +21853,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2523usize, + start_line: 2973usize, start_col: 22usize, - end_line: 2523usize, + end_line: 2973usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -20778,6 +21877,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { @@ -20827,10 +21927,11 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", low_lit, high_lit, d, + col, fixture, ), ) @@ -20842,8 +21943,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", expected_lit, + col, + d, fixture, ), ) @@ -20919,7 +22022,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -20936,9 +22039,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2414usize, + start_line: 2862usize, start_col: 22usize, - end_line: 2414usize, + end_line: 2862usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -20960,6 +22063,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() @@ -20971,8 +22075,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", extremum_lit, + col, + d, fixture, ), ) @@ -20984,8 +22090,9 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", "max", + col, d, fixture, ), @@ -21015,13 +22122,27 @@ pub mod int4 { } } }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "max", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); let ord_terms_match: bool = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", - "max", - d, + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, fixture, ), ) @@ -21081,7 +22202,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -21100,9 +22221,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2472usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2472usize, + end_line: 2922usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21212,9 +22333,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2497usize, + start_line: 2947usize, start_col: 22usize, - end_line: 2497usize, + end_line: 2947usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21311,9 +22432,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2523usize, + start_line: 2973usize, start_col: 22usize, - end_line: 2523usize, + end_line: 2973usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21335,6 +22456,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { @@ -21384,10 +22506,11 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", low_lit, high_lit, d, + col, fixture, ), ) @@ -21399,8 +22522,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", expected_lit, + col, + d, fixture, ), ) @@ -21476,7 +22601,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -21495,9 +22620,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2414usize, + start_line: 2862usize, start_col: 22usize, - end_line: 2414usize, + end_line: 2862usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21519,6 +22644,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() @@ -21530,8 +22656,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", extremum_lit, + col, + d, fixture, ), ) @@ -21543,8 +22671,9 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", "min", + col, d, fixture, ), @@ -21574,13 +22703,27 @@ pub mod int4 { } } }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "min", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); let ord_terms_match: bool = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", - "min", - d, + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, fixture, ), ) @@ -21640,7 +22783,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -21659,9 +22802,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2472usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2472usize, + end_line: 2922usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21771,9 +22914,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2497usize, + start_line: 2947usize, start_col: 22usize, - end_line: 2497usize, + end_line: 2947usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21870,9 +23013,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2523usize, + start_line: 2973usize, start_col: 22usize, - end_line: 2523usize, + end_line: 2973usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21894,6 +23037,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { @@ -21943,10 +23087,11 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", low_lit, high_lit, d, + col, fixture, ), ) @@ -21958,8 +23103,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", expected_lit, + col, + d, fixture, ), ) @@ -22035,7 +23182,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -22054,9 +23201,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2414usize, + start_line: 2862usize, start_col: 22usize, - end_line: 2414usize, + end_line: 2862usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -22078,6 +23225,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let extremum: i32 = ::fixture_values() .iter() @@ -22089,8 +23237,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", extremum_lit, + col, + d, fixture, ), ) @@ -22102,8 +23252,9 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.{0}(payload::{1})::text FROM {2}", + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", "max", + col, d, fixture, ), @@ -22133,13 +23284,27 @@ pub mod int4 { } } }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "max", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); let ord_terms_match: bool = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT eql_v3.ord_term(eql_v3.{0}(payload::{1})) = eql_v3.ord_term($1::jsonb::{1}) FROM {2}", - "max", - d, + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, fixture, ), ) @@ -22199,7 +23364,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -22218,9 +23383,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2472usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2472usize, + end_line: 2922usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -22330,9 +23495,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2497usize, + start_line: 2947usize, start_col: 22usize, - end_line: 2497usize, + end_line: 2947usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22429,9 +23594,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2523usize, + start_line: 2973usize, start_col: 22usize, - end_line: 2523usize, + end_line: 2973usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22453,6 +23618,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { @@ -22502,10 +23668,11 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT payload::{2} FROM {3} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", low_lit, high_lit, d, + col, fixture, ), ) @@ -22517,8 +23684,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", expected_lit, + col, + d, fixture, ), ) @@ -22594,7 +23763,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -22613,9 +23782,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2703usize, + start_line: 3154usize, start_col: 22usize, - end_line: 2703usize, + end_line: 3154usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -22637,6 +23806,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { @@ -22686,7 +23856,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -22703,7 +23874,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -22718,8 +23890,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g1_lit, + col, + d, fixture, ), ) @@ -22731,8 +23905,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g2_lit, + col, + d, fixture, ), ) @@ -22840,7 +24016,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -22859,9 +24035,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2703usize, + start_line: 3154usize, start_col: 22usize, - end_line: 2703usize, + end_line: 3154usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -22883,6 +24059,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { @@ -22932,7 +24109,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -22949,7 +24127,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -22964,8 +24143,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g1_lit, + col, + d, fixture, ), ) @@ -22977,8 +24158,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g2_lit, + col, + d, fixture, ), ) @@ -23086,7 +24269,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -23105,9 +24288,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2703usize, + start_line: 3154usize, start_col: 22usize, - end_line: 2703usize, + end_line: 3154usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23129,6 +24312,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { @@ -23178,7 +24362,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -23195,7 +24380,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -23210,8 +24396,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g1_lit, + col, + d, fixture, ), ) @@ -23223,8 +24411,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g2_lit, + col, + d, fixture, ), ) @@ -23332,7 +24522,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -23351,9 +24541,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2703usize, + start_line: 3154usize, start_col: 22usize, - end_line: 2703usize, + end_line: 3154usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23375,6 +24565,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; + let col = &spec.column_expr; let fixture = ::fixture_table_name(); let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 5) { @@ -23424,7 +24615,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 1, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -23441,7 +24633,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO group_test(group_key, value) SELECT 2, payload::{0} FROM {1} WHERE plaintext = {2}", + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, d, fixture, lit, @@ -23456,8 +24649,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g1_lit, + col, + d, fixture, ), ) @@ -23469,8 +24664,10 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT payload::text FROM {1} WHERE plaintext = {0}", + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", g2_lit, + col, + d, fixture, ), ) @@ -23578,7 +24775,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -23597,9 +24794,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2618usize, + start_line: 3069usize, start_col: 22usize, - end_line: 2618usize, + end_line: 3069usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23706,9 +24903,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2618usize, + start_line: 3069usize, start_col: 22usize, - end_line: 2618usize, + end_line: 3069usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -23815,9 +25012,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23983,9 +25180,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24151,9 +25348,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24319,9 +25516,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24487,9 +25684,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24655,9 +25852,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24823,9 +26020,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -24991,9 +26188,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2861usize, + start_line: 3313usize, start_col: 22usize, - end_line: 2861usize, + end_line: 3313usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25159,9 +26356,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2977usize, + start_line: 3429usize, start_col: 22usize, - end_line: 2977usize, + end_line: 3429usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25202,7 +26399,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, d, fixture, ), @@ -25268,7 +26466,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -25287,9 +26485,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3010usize, + start_line: 3463usize, start_col: 22usize, - end_line: 3010usize, + end_line: 3463usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25315,7 +26513,12 @@ pub mod int4 { let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), ) }); let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; @@ -25325,7 +26528,8 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, d, fixture, expected, @@ -25372,7 +26576,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -25381,6 +26585,144 @@ pub mod int4 { ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; + #[rustc_test_marker = "scalars::int4::matrix_int4_storage_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_int4_storage_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::int4::matrix_int4_storage_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3507usize, + start_col: 22usize, + end_line: 3507usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_int4_storage_count_distinct_extractor()), + ), + }; + fn matrix_int4_storage_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_int4_storage_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + i32, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::int4::matrix_int4_storage_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_int4.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_int4_storage_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; #[rustc_test_marker = "scalars::int4::matrix_int4_eq_count_typed_column"] #[doc(hidden)] pub const matrix_int4_eq_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { @@ -25391,9 +26733,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2977usize, + start_line: 3429usize, start_col: 22usize, - end_line: 2977usize, + end_line: 3429usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25434,7 +26776,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, d, fixture, ), @@ -25500,7 +26843,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -25517,9 +26860,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3010usize, + start_line: 3463usize, start_col: 22usize, - end_line: 3010usize, + end_line: 3463usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25545,7 +26888,12 @@ pub mod int4 { let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), ) }); let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; @@ -25555,7 +26903,8 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, d, fixture, expected, @@ -25602,7 +26951,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -25621,9 +26970,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3054usize, + start_line: 3507usize, start_col: 22usize, - end_line: 3054usize, + end_line: 3507usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -25645,12 +26994,9 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Eq); let d = &spec.sql_domain; - let extractor_fn = spec - .primary_extractor() - .expect("non-Storage variant must expose an extractor"); - let extractor = ::alloc::__export::must_use({ - ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) - }); + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; let fixture = ::fixture_table_name(); let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; @@ -25670,7 +27016,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO distinct_count(value) SELECT payload::{0} FROM {1}", + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, d, fixture, ), @@ -25742,7 +27089,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -25761,9 +27108,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2977usize, + start_line: 3429usize, start_col: 22usize, - end_line: 2977usize, + end_line: 3429usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -25804,7 +27151,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, d, fixture, ), @@ -25870,7 +27218,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -25887,9 +27235,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3010usize, + start_line: 3463usize, start_col: 22usize, - end_line: 3010usize, + end_line: 3463usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -25915,7 +27263,12 @@ pub mod int4 { let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), ) }); let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; @@ -25925,7 +27278,8 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, d, fixture, expected, @@ -25972,7 +27326,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -25991,9 +27345,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3054usize, + start_line: 3507usize, start_col: 22usize, - end_line: 3054usize, + end_line: 3507usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -26015,12 +27369,9 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; - let extractor_fn = spec - .primary_extractor() - .expect("non-Storage variant must expose an extractor"); - let extractor = ::alloc::__export::must_use({ - ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) - }); + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; let fixture = ::fixture_table_name(); let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; @@ -26040,7 +27391,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO distinct_count(value) SELECT payload::{0} FROM {1}", + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, d, fixture, ), @@ -26112,7 +27464,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -26131,9 +27483,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2977usize, + start_line: 3429usize, start_col: 22usize, - end_line: 2977usize, + end_line: 3429usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -26174,7 +27526,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO typed_count(value) SELECT payload::{0} FROM {1}", + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, d, fixture, ), @@ -26240,7 +27593,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -26259,9 +27612,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3010usize, + start_line: 3463usize, start_col: 22usize, - end_line: 3010usize, + end_line: 3463usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -26287,7 +27640,12 @@ pub mod int4 { let expected = ::fixture_values().len() as i64; let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( - format_args!("SELECT COUNT(payload::{0}) FROM {1}", d, fixture), + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), ) }); let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; @@ -26297,7 +27655,8 @@ pub mod int4 { ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "COUNT(payload::{0}) on {1}: want {2}, got {3}; SQL={4}", + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, d, fixture, expected, @@ -26344,7 +27703,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -26363,9 +27722,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3054usize, + start_line: 3507usize, start_col: 22usize, - end_line: 3054usize, + end_line: 3507usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -26387,12 +27746,9 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; - let extractor_fn = spec - .primary_extractor() - .expect("non-Storage variant must expose an extractor"); - let extractor = ::alloc::__export::must_use({ - ::alloc::fmt::format(format_args!("{0}(value)", extractor_fn)) - }); + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; let fixture = ::fixture_table_name(); let expected = ::fixture_values().len() as i64; let mut tx = pool.begin().await?; @@ -26412,7 +27768,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO distinct_count(value) SELECT payload::{0} FROM {1}", + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, d, fixture, ), @@ -26484,7 +27841,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -26503,9 +27860,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26541,14 +27898,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "ASC", where_clause, + ord, ), ) }); @@ -26619,7 +27984,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -26638,9 +28003,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26676,14 +28041,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "DESC", where_clause, + ord, ), ) }); @@ -26754,7 +28127,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -26773,9 +28146,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26811,14 +28184,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "ASC", where_clause, + ord, ), ) }); @@ -26889,7 +28270,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -26908,9 +28289,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -26946,14 +28327,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "DESC", where_clause, + ord, ), ) }); @@ -27024,7 +28413,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -27043,9 +28432,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27081,14 +28470,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "ASC", where_clause, + ord, ), ) }); @@ -27159,7 +28556,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -27178,9 +28575,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27216,14 +28613,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "DESC", where_clause, + ord, ), ) }); @@ -27294,7 +28699,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -27313,9 +28718,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27351,14 +28756,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "ASC", where_clause, + ord, ), ) }); @@ -27429,7 +28842,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -27448,9 +28861,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2096usize, + start_line: 2540usize, start_col: 22usize, - end_line: 2096usize, + end_line: 2540usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27486,14 +28899,22 @@ pub mod int4 { } else { String::new() }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0}{3} ORDER BY eql_v3.ord_term(payload::{1}) {2}", + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", fixture_table, - &spec.sql_domain, "DESC", where_clause, + ord, ), ) }); @@ -27564,7 +28985,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -27583,9 +29004,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27629,7 +29050,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -27654,13 +29076,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "ASC", "FIRST", table, + ord, ), ) }); @@ -27740,7 +29164,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -27759,9 +29183,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27805,7 +29229,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -27830,13 +29255,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "ASC", "LAST", table, + ord, ), ) }); @@ -27916,7 +29343,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -27935,9 +29362,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27981,7 +29408,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -28006,13 +29434,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "DESC", "FIRST", table, + ord, ), ) }); @@ -28092,7 +29522,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -28111,9 +29541,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28157,7 +29587,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -28182,13 +29613,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "DESC", "LAST", table, + ord, ), ) }); @@ -28268,7 +29701,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -28287,9 +29720,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28333,7 +29766,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -28358,13 +29792,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "ASC", "FIRST", table, + ord, ), ) }); @@ -28444,7 +29880,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -28463,9 +29899,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28509,7 +29945,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -28534,13 +29971,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "ASC", "LAST", table, + ord, ), ) }); @@ -28620,7 +30059,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -28639,9 +30078,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28685,7 +30124,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -28710,13 +30150,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "DESC", "FIRST", table, + ord, ), ) }); @@ -28796,7 +30238,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -28815,9 +30257,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2207usize, + start_line: 2654usize, start_col: 22usize, - end_line: 2207usize, + end_line: 2654usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28861,7 +30303,8 @@ pub mod int4 { &::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "INSERT INTO {1}(plaintext, value) SELECT plaintext, payload::{2} FROM {0}", + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, fixture_table, table, d, @@ -28886,13 +30329,15 @@ pub mod int4 { ) .execute(&mut *tx) .await?; + let ord = (spec.ord_extractor)("value"); let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {2} ORDER BY eql_v3.ord_term(value) {0} NULLS {1}", + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", "DESC", "LAST", table, + ord, ), ) }); @@ -28972,7 +30417,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -28991,9 +30436,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29017,8 +30462,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, "<", ), @@ -29075,7 +30521,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -29094,9 +30540,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29120,8 +30566,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, "<=", ), @@ -29178,7 +30625,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -29197,9 +30644,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29223,8 +30670,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, ">", ), @@ -29281,7 +30729,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -29300,9 +30748,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29326,8 +30774,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, ">=", ), @@ -29384,7 +30833,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -29403,9 +30852,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29429,8 +30878,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, "<", ), @@ -29487,7 +30937,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -29506,9 +30956,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29532,8 +30982,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, "<=", ), @@ -29590,7 +31041,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -29609,9 +31060,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29635,8 +31086,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, ">", ), @@ -29693,7 +31145,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], @@ -29712,9 +31164,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2324usize, + start_line: 2772usize, start_col: 22usize, - end_line: 2324usize, + end_line: 2772usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -29738,8 +31190,9 @@ pub mod int4 { let sql = ::alloc::__export::must_use({ ::alloc::fmt::format( format_args!( - "SELECT plaintext FROM {0} ORDER BY payload::{1} USING {2}", + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", fixture_table, + &spec.column_expr, &spec.sql_domain, ">=", ), @@ -29796,7 +31249,7 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v2_int4.sql", + path: "../../../fixtures/eql_v3_int4.sql", contents: "", }, ], From af34e719822b86f3c29e3796b27bab7b5c0341e2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 10:23:35 +1000 Subject: [PATCH 312/599] docs: correct stale v3_ste_vec 'committed exception' note MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SteVec document fixture is now generated through FixtureSpec (tests/sqlx/src/fixtures/v3_ste_vec.rs, since 3640e2a9) and gitignored/regenerated like every scalar fixture — it is no longer a committed blob pending a generator. Also reword two 'committed' doc-comments (NAME / PAYLOAD_TYPE) to 'canonical' to avoid implying the gitignored .sql is tracked. --- CLAUDE.md | 13 +++++++------ tests/sqlx/src/fixtures/v3_ste_vec.rs | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 3756757c5..e97e3f66f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -54,7 +54,7 @@ This project uses `mise` for task management. Common commands: This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for searchable encryption. Key architectural components: ### Core Structure -- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4` and future scalar domains) live in a separate `eql_v3` schema (see below). The `eql_v3` surface is **self-contained**: it owns its own copies of the searchable-encrypted-metadata (SEM) index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, hand-written under `src/v3/sem/`) and has no runtime dependency on `eql_v2`. `eql_v2` is unchanged and remains the documented public API. +- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, `float8`) live in a separate `eql_v3` schema (see below). The `eql_v3` surface is **self-contained**: it owns its own copies of the searchable-encrypted-metadata (SEM) index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, hand-written under `src/v3/sem/`) and has no runtime dependency on `eql_v2`. `eql_v2` is unchanged and remains the documented public API. - **Main Type**: `eql_v2_encrypted` - composite type for encrypted columns (stored as JSONB) - **Configuration**: `eql_v2_configuration` table tracks encryption configs - **Index Types**: Various encrypted index types (blake3, hmac_256, bloom_filter, ore variants) @@ -79,9 +79,9 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; future scalar types such as `int8`, `bool`, `date`, `float`, `numeric`, `timestamp`, `text`, and `jsonb` follow this materializer pattern. `text`, `numeric`, and `jsonb` are planned but have no generated SQL surface yet — `jsonb` in particular needs a separate SQL design beyond the ordered-scalar materializer. The `eql-scalars` fixture catalog (`crates/eql-scalars`) already models their fixture values ahead of the SQL surface. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, and `float8`, all following this materializer pattern. `jsonb` is the only catalog scalar with no generated SQL surface yet — it needs a separate SQL design beyond the ordered-scalar materializer, and the `eql-scalars` fixture catalog (`crates/eql-scalars`) models its fixture values ahead of that surface. -Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `text` and `jsonb` are out of scope for this scalar materializer. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` is out of scope for this scalar materializer. **Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. @@ -116,9 +116,10 @@ cipherstash-client: `mise run test:sqlx:prep` runs `fixture:generate:all` (the `CS_WORKSPACE_CRN`) AND a client key (`CS_CLIENT_ID` + `CS_CLIENT_KEY`); see the `test:sqlx:prep` comment in `mise.toml`. CI has them. This is expected, not a reason to avoid generated fixtures. -- Do NOT add static/committed fixtures to dodge the creds dependency. The one committed - exception, `tests/sqlx/fixtures/v3_ste_vec.sql`, is a gap pending a SteVec-document generator - (`docs/handoff/2026-06-10-v3-jsonb-fixture-alignment.md`), not a pattern to copy. +- Do NOT add static/committed fixtures to dodge the creds dependency. There are no committed + fixture exceptions: the jsonb SteVec document fixture `tests/sqlx/fixtures/v3_ste_vec.sql` is + now generated through the same `FixtureSpec` machinery (`tests/sqlx/src/fixtures/v3_ste_vec.rs`) + and gitignored/regenerated like every scalar fixture — it is not a committed blob to copy. ## Project Learning & Retrospectives diff --git a/tests/sqlx/src/fixtures/v3_ste_vec.rs b/tests/sqlx/src/fixtures/v3_ste_vec.rs index 0a76997f2..448847bbb 100644 --- a/tests/sqlx/src/fixtures/v3_ste_vec.rs +++ b/tests/sqlx/src/fixtures/v3_ste_vec.rs @@ -21,11 +21,11 @@ use serde_json::{json, Value}; use super::index_kind::IndexKind; use super::spec::FixtureSpec; -/// The committed fixture name → table `fixtures.v3_ste_vec`, script +/// The canonical fixture name → table `fixtures.v3_ste_vec`, script /// `v3_ste_vec.sql`, SQLx ref `scripts("v3_ste_vec")`. const NAME: &str = "v3_ste_vec"; -/// The committed `payload` column type — the `eql_v3.json` DOMAIN, so the +/// The canonical `payload` column type — the `eql_v3.json` DOMAIN, so the /// domain CHECK runs when the fixture loads. const PAYLOAD_TYPE: &str = "eql_v3.json"; From 9bdd5ffc47763223ab642eb6acc0185349909570 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 10:44:10 +1000 Subject: [PATCH 313/599] ci(fixtures): fix build-archive guard glob eql_v2_*.sql -> eql_v3_*.sql tasks/test/sqlx-archive.sh asserted the fixtures existed via an `ls eql_v2_*.sql` glob that the rename left stale, failing the build-archive job with 'eql_v2_*.sql missing'. Also updates the matching comment in bench.sh. These glob refs were missed by the token/{ sweeps. --- tasks/test/bench.sh | 2 +- tasks/test/sqlx-archive.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/test/bench.sh b/tasks/test/bench.sh index 0f5890736..691ba0a68 100755 --- a/tasks/test/bench.sh +++ b/tasks/test/bench.sh @@ -21,7 +21,7 @@ echo "==========================================" # by #[sqlx::test(fixtures(...))], so they MUST exist on disk before `cargo test` # compiles. This script previously hand-rolled build+cp+migrate but omitted # fixture generation; once fixtures became generated/gitignored the bench binary -# stopped compiling (couldn't read tests/sqlx/fixtures/eql_v2_*.sql). Reusing +# stopped compiling (couldn't read tests/sqlx/fixtures/eql_v3_*.sql). Reusing # prep keeps bench in lockstep with test:sqlx and prevents that drift recurring. mise run --output prefix test:sqlx:prep diff --git a/tasks/test/sqlx-archive.sh b/tasks/test/sqlx-archive.sh index 7bd6465cf..7f20ba0c6 100644 --- a/tasks/test/sqlx-archive.sh +++ b/tasks/test/sqlx-archive.sh @@ -31,8 +31,8 @@ test -f release/cipherstash-encrypt.sql \ || { echo "release/cipherstash-encrypt.sql missing — run via 'mise run test:sqlx:archive' (it depends on test:sqlx:prep)" >&2; exit 2; } test -f tests/sqlx/migrations/001_install_eql.sql \ || { echo "tests/sqlx/migrations/001_install_eql.sql missing — prep did not run (needs a live Postgres)" >&2; exit 2; } -ls tests/sqlx/fixtures/eql_v2_*.sql >/dev/null 2>&1 \ - || { echo "tests/sqlx/fixtures/eql_v2_*.sql missing — fixture:generate:all did not run (needs Postgres + CS_* creds)" >&2; exit 2; } +ls tests/sqlx/fixtures/eql_v3_*.sql >/dev/null 2>&1 \ + || { echo "tests/sqlx/fixtures/eql_v3_*.sql missing — fixture:generate:all did not run (needs Postgres + CS_* creds)" >&2; exit 2; } # Compile every tests/sqlx test binary with DEFAULT features and pack them. The # migration + fixtures (embedded via include_str at compile time) are baked into From ba05b3b0ac58fa07942d4b365271266fe9eac64c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 13:41:36 +1000 Subject: [PATCH 314/599] docs(fixtures): correct FIXTURE_SCHEMA.md for generated eql_v3 family - Split fixtures into committed (eql_v2-era) vs generated/gitignored (eql_v3) - Replace int4-specific section with general 'Generated eql_v3 fixtures' (int4 is the bootstrap reference, not a special case) - Fix false 'no EQL dependency' claim: v3_doc_int4/v3_ste_vec use eql_v3.json - Document match_data.sql and aggregate_minmax_data.sql committed fixtures - Point eql_v3 fixture additions at eql-scalars::CATALOG, not hand-written SQL --- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 174 ++++++++++++++++++++------ 1 file changed, 135 insertions(+), 39 deletions(-) diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 638e3089f..69b5dc589 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -2,6 +2,16 @@ This document defines the structure and dependencies of test fixtures used in the SQLx test suite. +There are **two classes** of fixture in this directory: + +1. **Committed, hand-written** — the `eql_v2`-era fixtures listed in the graph + below. These are git-tracked SQL files that depend on the EQL extension + being installed via SQLx migrations. +2. **Generated, gitignored** — the `eql_v3` scalar surface (`eql_v3_*.sql` plus + `v3_ste_vec.sql`, `v3_doc_int4.sql`, `v3_numeric_collision.sql`). These are + produced by the Rust fixture framework and **never committed** — see + [Generated eql_v3 fixtures](#generated-eql_v3-fixtures) below. + ## Fixture Dependencies ``` @@ -9,6 +19,7 @@ EQL Extension (via migrations) ├── encrypted_json.sql │ └── array_data.sql (extends `encrypted` table from encrypted_json) ├── match_data.sql + ├── aggregate_minmax_data.sql ├── config_tables.sql ├── constraint_tables.sql ├── encryptindex_tables.sql @@ -17,10 +28,19 @@ EQL Extension (via migrations) ├── ore table (migration 002 — not a fixture) └── bench_data.sql + bench_setup.sql (depend on migration 007) -eql_v3_int4.sql (no EQL dependency — generated, plain jsonb, not committed) +Generated eql_v3 fixtures (gitignored; .gitignore:225-230) + ├── eql_v3_.sql (jsonb payload — no EQL dependency) + ├── eql_v3__doubles.sql (jsonb payload — duplicate-value variant) + ├── v3_numeric_collision.sql (jsonb payload — no EQL dependency) + ├── v3_doc_int4.sql (eql_v3.json payload — depends on eql_v3 surface) + └── v3_ste_vec.sql (eql_v3.json payload — depends on eql_v3 surface) ``` -All fixtures except the generated `eql_v3_int4.sql` depend on the EQL extension being installed via SQLx migrations. +All committed fixtures depend on the EQL extension being installed via SQLx +migrations. The generated `eql_v3` fixtures are described in their own section +below — most carry a plain `jsonb` payload and apply standalone, but the two +SteVec/document fixtures (`v3_doc_int4`, `v3_ste_vec`) store `eql_v3.json` and +therefore require the `eql_v3` surface. --- @@ -72,6 +92,61 @@ CREATE TABLE encrypted ( --- +## match_data.sql + +**Purpose:** Creates the `encrypted` table seeded with bloom-filter-indexed +values for `LIKE` operator tests (`~~` and `~~*`), exercising +encrypted-to-encrypted matching. + +**Dependencies:** +- Requires the EQL extension (`eql_v2.add_encrypted_constraint`, + `create_encrypted_json`, `seed_encrypted` from migrations) + +**Schema:** +```sql +CREATE TABLE encrypted ( + id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + e eql_v2_encrypted +); +``` + +**Data:** +- 3 records seeded via `create_encrypted_json(1..3)` — real EQL payloads, with + the production CHECK constraint applied so malformed payloads are rejected. +- Plaintext structure: `{"hello": "world", "n": N}` for N = 1, 2, 3. + +**Used By:** +- like_operator_tests.rs + +--- + +## aggregate_minmax_data.sql + +**Purpose:** Test data for the `eql_v2.min()` / `eql_v2.max()` aggregates over +encrypted columns, including a NULL row. + +**Dependencies:** +- Requires the EQL extension (`eql_v2_encrypted` type) + +**Schema:** +```sql +CREATE TABLE agg_test ( + plain_int integer, + enc_int eql_v2_encrypted +); +``` + +**Data:** +- Rows pairing `plain_int` with an `enc_int` whose decrypted value equals + `plain_int` (the in-table oracle), plus a `(NULL, NULL)` row to verify + NULL handling in the aggregates. Each `enc_int` carries an ORE block (`ob`) + ordering term. + +**Used By:** +- aggregate_tests.rs (MIN/MAX over encrypted columns) + +--- + ## order_by_null_data.sql **Purpose:** Creates `encrypted` table with NULL and ORE-encrypted values for ORDER BY NULL ordering tests. @@ -189,56 +264,71 @@ CREATE TABLE bench ( --- -## eql_v3_int4.sql - -**Purpose:** 17 encrypted integers for verifying encrypted-integer fixture -structure. The set MUST include the signed extremes (`i32::MIN`/`i32::MAX`) and -zero — they are the matrix comparison pivots, which is why the count grew from -14 to 17. Unlike its neighbours, this is a **generated** fixture — produced by -`mise run fixture:generate:all` (the Rust fixture framework in -`tests/sqlx/src/fixtures/`) and **not committed** (see `.gitignore`). It is -plain SQL with **no EQL dependency**: `payload` is `jsonb`, so the script -applies standalone. - -**Regenerated every test run.** `mise run test:sqlx` invokes the generator -before `cargo test`, so a stale committed fixture cannot mask a payload-shape -regression. The generator encrypts in-process via `cipherstash-client`; it -needs a live Postgres plus **both** CipherStash credential pairs in the shell -environment (they are not alternatives): `CS_CLIENT_ACCESS_KEY` + -`CS_WORKSPACE_CRN` for ZeroKMS auth (AutoStrategy) **and** `CS_CLIENT_ID` + -`CS_CLIENT_KEY` for the client key (EnvKeyProvider). Do not hand-edit the -generated file; it is overwritten in place on every run. - -**Schema:** Table lives in the dedicated `fixtures` SQL schema (kept out of the -`public` type/domain namespace so a downstream `public.eql_v3_int4` domain can -coexist): +## Generated eql_v3 fixtures + +The `eql_v3` scalar surface is covered by **generated** fixtures, not committed +ones. They are produced by the Rust fixture framework (`tests/sqlx/src/fixtures/`, +driven by `eql-scalars::CATALOG`) and **never committed** — `.gitignore:225-230` +ignores `eql_v3*`, `v3_ste_vec.sql`, `v3_doc_int4.sql`, and +`v3_numeric_collision.sql`. + +`eql_v3_int4` was the first of these and is the bootstrap reference that the +codegen was built against; it is **not** a special case. Every scalar type the +catalog generates (`int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, +`text`, `bool`, `float4`, `float8`) gets the same generated fixture family. + +**Members (all in this directory, all gitignored):** + +| Fixture | Payload type | Notes | +|---------|--------------|-------| +| `eql_v3_.sql` | `jsonb` | One row per catalog `Fixture` value for type ``. No EQL dependency — applies standalone. | +| `eql_v3__doubles.sql` | `jsonb` | Same value set, each plaintext emitted **twice** (distinct ciphertexts, identical `hm`/`ob` terms). Exercises equality grouping and MIN/MAX tie-breaking. | +| `v3_numeric_collision.sql` | `jsonb` | Numeric values that collide under normalisation. No EQL dependency. | +| `v3_doc_int4.sql` | `eql_v3.json` | Document-shaped payload; **depends on the `eql_v3` surface** (the `eql_v3.json` domain must exist). | +| `v3_ste_vec.sql` | `eql_v3.json` | SteVec document fixture (formerly the committed `v3_ste_vec.sql` blob; now generated through the same `FixtureSpec` machinery). **Depends on the `eql_v3` surface.** | + +**Regenerated every test run.** `mise run test:sqlx:prep` runs +`fixture:generate:all` before `cargo test`, so a stale fixture cannot mask a +payload-shape regression. The generator encrypts in-process via +`cipherstash-client`; it needs a live Postgres plus **both** CipherStash +credential pairs in the shell environment (they are not alternatives): +`CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN` for ZeroKMS auth (AutoStrategy) +**and** `CS_CLIENT_ID` + `CS_CLIENT_KEY` for the client key (EnvKeyProvider). +Each file carries an `AUTO-GENERATED ... DO NOT EDIT BY HAND` header and is +overwritten in place on every run. + +**Schema:** Every generated fixture lives in the dedicated `fixtures` SQL schema +(kept out of the `public`/`eql_v3` type namespace) with the same column shape — +only the `plaintext`/`payload` types vary per the table above: ```sql CREATE SCHEMA IF NOT EXISTS fixtures; CREATE TABLE fixtures.eql_v3_int4 ( id BIGINT PRIMARY KEY, - plaintext integer NOT NULL, - payload jsonb NOT NULL + plaintext integer NOT NULL, -- the per-type plaintext column + payload jsonb NOT NULL -- jsonb, or eql_v3.json for the document fixtures ); ``` -**Data:** -- 17 rows, ids 1-17; `id = N` is the Nth generated value. -- `plaintext` values: `i32::MIN, -100, -1, 0, 1, 2, 5, 10, 17, 25, 42, 50, 100, 250, 1000, 9999, i32::MAX` - — the signed extremes and zero (matrix comparison pivots) plus - small/medium/large magnitudes. +**Data conventions:** +- One row per generated value; `id = N` is the Nth value, in catalog order. +- For `int4`, the value set MUST include the signed extremes (`i32::MIN`/ + `i32::MAX`) and zero — they are the matrix comparison pivots. Other types + follow the same "extremes + zero/empty + representative magnitudes" shape + from their `CATALOG` `Fixture` list. - `plaintext` is the **in-table oracle**: consuming tests filter `WHERE plaintext = N` directly, so no Rust value constant is shared. -- Each `payload` is a cipherstash-client-encrypted JSONB object carrying - `c` (ciphertext), `hm` (HMAC equality term), `ob` (ORE block ordering - term), an inert `i` metadata object, and the EQL v2 root discriminator +- Each `jsonb` `payload` is a cipherstash-client-encrypted object carrying + `c` (ciphertext), `hm` (HMAC equality term), `ob` (ORE block ordering term), + an inert `i` metadata object, and the EQL v2 root discriminator (`k = "ct"`, `v = 2`). **Used By:** -- `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` (structural verification, generated per type) -- (#225) the `eql_v3_int4` domain operator tests, via per-query `payload` casts +- `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` + (structural verification, generated per type) +- the per-type `eql_v3.` domain operator tests, via per-query `payload` casts -**Opt-in:** Not a migration — a SQLx fixture script. Each consuming test opts -in explicitly: +**Opt-in:** Not migrations — SQLx fixture scripts. Each consuming test opts in +explicitly (by file stem): ```rust #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] ``` @@ -283,6 +373,12 @@ async fn fixture_ore_data_has_99_records(pool: PgPool) { ## Adding New Fixtures +This applies to **committed, hand-written** fixtures only. To add or change an +`eql_v3` scalar fixture, **do not write SQL by hand** — edit the catalog row in +`eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) and let +`mise run fixture:generate:all` regenerate the gitignored file. See +[Generated eql_v3 fixtures](#generated-eql_v3-fixtures). + 1. Create fixture file in `tests/sqlx/fixtures/` 2. Add header comment explaining purpose and dependencies 3. Document schema in this file From a002accc7074cc8bc2d97d8ec9bebc902bc9beb6 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 13:46:05 +1000 Subject: [PATCH 315/599] docs(v3): replace dangling json-type-kind decision-doc refs with json-support caveat The eql_v3 encrypted-JSONB surface referenced a decision doc (docs/decisions/2026-06-10-eql-v3-json-type-kind.md) that was never committed, in 4 places (operators.sql, jsonb_test.sql, v3_jsonb_tests.rs, CHANGELOG.md). The full rationale already lives inline at each site. Redirect those pointers to a real, user-facing home and document the caveat there: add an 'eql_v3 encrypted JSONB - typed operands' section to docs/reference/json-support.md explaining that bare untyped literals resolve to the native jsonb operator (the domain flattens to its base type for unknown-typed RHS), with correct/incorrect examples. This is intrinsic to the domain type-kind, mitigated by the Proxy always passing typed parameters; no separate decision doc is needed. --- CHANGELOG.md | 2 +- docs/reference/json-support.md | 21 +++++++++++++++++++++ src/v3/jsonb/jsonb_test.sql | 6 +++--- src/v3/jsonb/operators.sql | 2 +- tests/sqlx/tests/v3_jsonb_tests.rs | 4 ++-- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95c440d57..1299a6f01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added - **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) -- **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see `docs/decisions/2026-06-10-eql-v3-json-type-kind.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) +- **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) diff --git a/docs/reference/json-support.md b/docs/reference/json-support.md index fe662a099..35fafa27e 100644 --- a/docs/reference/json-support.md +++ b/docs/reference/json-support.md @@ -333,6 +333,27 @@ The actual encryption and selector generation is handled by CipherStash Proxy or --- +## `eql_v3` encrypted JSONB — typed operands (important) + +The `eql_v3` schema provides an encrypted-JSONB document type (`eql_v3.json`, built on SteVec) alongside its scalar encrypted domains. It supports the same searchable operations without decryption — document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_*`), and entry-level equality/range on extracted leaves. Every other native `jsonb` operator (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and root-document comparisons) is **blocked** — it raises rather than silently running plaintext-jsonb semantics on the encrypted payload. + +> **Caveat — operands must be typed.** `eql_v3.json` is a PostgreSQL **domain over `jsonb`**. PostgreSQL resolves `domain OP untyped_literal` to the **native** `jsonb` operator, because it flattens the domain to its base type when the right-hand side is an unknown-typed literal. A bare literal therefore **bypasses the encrypted operator (and the blockers) and silently returns native jsonb semantics** — typically a root-key lookup that yields `NULL` — instead of querying the encrypted document or raising. +> +> Always give the operand a known type: +> +> ```sql +> -- ✅ correct — typed operand resolves to the eql_v3 operator +> WHERE doc -> 'email'::text = '' +> WHERE doc -> $1 -- a text parameter (the CipherStash Proxy interface) +> +> -- ⚠ wrong — bare untyped literal resolves to native jsonb -> text, returns NULL +> WHERE doc -> 'email' +> ``` +> +> This is **intrinsic to the domain type-kind**, not a bug: the only way to remove it entirely would be to make `eql_v3.json` a base type (losing free `jsonb` interop). The CipherStash Proxy always passes typed parameters, so applications routing through the Proxy are unaffected; the caveat only matters for hand-written ad-hoc SQL. + +--- + ### Didn't find what you wanted? [Click here to let us know what was missing from our docs.](https://github.com/cipherstash/encrypt-query-language/issues/new?template=docs-feedback.yml&title=[Docs:]%20Feedback%20on%20json-support.md) diff --git a/src/v3/jsonb/jsonb_test.sql b/src/v3/jsonb/jsonb_test.sql index be8064df4..5622e532c 100644 --- a/src/v3/jsonb/jsonb_test.sql +++ b/src/v3/jsonb/jsonb_test.sql @@ -46,9 +46,9 @@ BEGIN -- -> extracts an entry by selector. NOTE: the selector literal MUST be typed -- (`::text`). A bare untyped literal (`doc -> 'sel_hm'`) resolves to the native -- `jsonb -> text` operator because PostgreSQL reduces the `eql_v3.json` domain to - -- its base type during operator resolution of an unknown-typed RHS — see - -- docs/decisions/2026-06-10-eql-v3-json-type-kind.md. Typed operands (the Proxy - -- interface) always resolve to our operator. + -- its base type during operator resolution of an unknown-typed RHS — see the + -- "Typed operands" caveat in docs/reference/json-support.md. Typed operands (the + -- Proxy interface) always resolve to our operator. entry_a := doc -> 'sel_hm'::text; IF eql_v3.selector(entry_a) <> 'sel_hm' THEN RAISE EXCEPTION '-> selector mismatch'; END IF; diff --git a/src/v3/jsonb/operators.sql b/src/v3/jsonb/operators.sql index 2cb1bbe3f..171267608 100644 --- a/src/v3/jsonb/operators.sql +++ b/src/v3/jsonb/operators.sql @@ -25,7 +25,7 @@ --! domain to its base type `jsonb` when resolving an unknown-typed RHS, and the --! native base-type operator wins the exact-match tiebreak. This is intrinsic to --! the domain type-kind and applies to the native-jsonb blockers too. See ---! docs/decisions/2026-06-10-eql-v3-json-type-kind.md. +--! the "Typed operands" caveat in docs/reference/json-support.md. --! --! @param e eql_v3.json Root encrypted payload. --! @param selector text Selector hash. diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index 42ab67958..dd1263bdc 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -16,8 +16,8 @@ //! `->`/`->>` selector operand and every blocker RHS operand below is //! explicitly typed (`-> 'sel'::text`, `? 'x'::text`, `@? '$.sv'::jsonpath`, //! `|| '{}'::jsonb`, …). A BARE literal would resolve to native jsonb and never -//! reach our operator/blocker, giving false results. See -//! `docs/decisions/2026-06-10-eql-v3-json-type-kind.md`. +//! reach our operator/blocker, giving false results. See the "Typed operands" +//! caveat in `docs/reference/json-support.md`. use eql_tests::matrix::assert_index_scan_uses; use sqlx::PgPool; From 0637ae3f9866e2a5f812a1308a116cbf36db9994 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 14:27:43 +1000 Subject: [PATCH 316/599] build(v3): add self-contained search_path pinning for eql_v3 artifact --- tasks/build.sh | 3 +- tasks/pin_search_path_v3.sql | 102 +++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 tasks/pin_search_path_v3.sql diff --git a/tasks/build.sh b/tasks/build.sh index 1ee2d0c08..1fe69b79f 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" -#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] +#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/pin_search_path_v3.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] #MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql","release/cipherstash-encrypt-v3.sql","release/cipherstash-encrypt-v3-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" @@ -222,6 +222,7 @@ cat src/deps-v3.txt | tsort | tac > src/deps-ordered-v3.txt verify_deps_exist src/deps-ordered-v3.txt cat src/deps-ordered-v3.txt | xargs cat | grep -v REQUIRE >> release/cipherstash-encrypt-v3.sql +cat tasks/pin_search_path_v3.sql >> release/cipherstash-encrypt-v3.sql cat tasks/uninstall-v3.sql >> release/cipherstash-encrypt-v3-uninstall.sql diff --git a/tasks/pin_search_path_v3.sql b/tasks/pin_search_path_v3.sql new file mode 100644 index 000000000..9eb8e067d --- /dev/null +++ b/tasks/pin_search_path_v3.sql @@ -0,0 +1,102 @@ +--! @file pin_search_path_v3.sql +--! @brief Post-install: pin search_path on every eql_v3.* function. +--! +--! Appended verbatim by `tasks/build.sh` to the end of the v3-only release +--! artifact, AFTER all src/v3/**/*.sql files have been concatenated. It lives +--! outside src/ so it stays out of the dependency graph. +--! +--! Iterates over functions in the `eql_v3` schema and applies a fixed +--! `search_path` via `ALTER FUNCTION ... SET search_path = ...`, satisfying +--! Supabase splinter's `function_search_path_mutable` lint. +--! +--! @note A SET clause disables SQL-function inlining. The inline-critical SEM +--! helpers (ore_block_256_*, ore_cllw_*, ore_cllw/has_ore_cllw, +--! hmac_256, bloom_filter over jsonb) and the encrypted-domain family +--! (recognised structurally) are deliberately left unpinned. +--! @see tasks/test/splinter.sh +--! @see tasks/build.sh + +DO $$ +DECLARE + fn_oid oid; + inline_critical_oids oid[]; + jsonb_oid oid; +BEGIN + SELECT t.oid INTO jsonb_oid + FROM pg_catalog.pg_type t + JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE n.nspname = 'pg_catalog' AND t.typname = 'jsonb'; + + IF jsonb_oid IS NULL THEN + RAISE EXCEPTION 'pin_search_path_v3: type pg_catalog.jsonb not found'; + END IF; + + -- eql_v3 SEM index-term functions that must stay inlinable for + -- functional-index matching (no SET, IMMUTABLE). Mirrors the eql_v3 clause + -- in the legacy combined pin_search_path.sql. + SELECT pg_catalog.array_agg(p.oid) INTO inline_critical_oids + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE n.nspname = 'eql_v3' + AND ( + (p.pronargs = 2 + AND p.proname IN ('ore_block_256_eq', 'ore_block_256_neq', + 'ore_block_256_lt', 'ore_block_256_lte', + 'ore_block_256_gt', 'ore_block_256_gte')) + OR (p.pronargs = 2 + AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', + 'ore_cllw_lt', 'ore_cllw_lte', + 'ore_cllw_gt', 'ore_cllw_gte')) + OR (p.pronargs = 1 + AND p.proname IN ('ore_cllw', 'has_ore_cllw') + AND p.proargtypes[0] = jsonb_oid) + OR (p.pronargs = 1 + AND p.proname = 'hmac_256' + AND p.proargtypes[0] = jsonb_oid) + OR (p.pronargs = 1 + AND p.proname = 'bloom_filter' + AND p.proargtypes[0] = jsonb_oid) + ); + + FOR fn_oid IN + SELECT p.oid + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + WHERE n.nspname = 'eql_v3' + AND p.prokind IN ('f', 'w') + AND NOT EXISTS ( + SELECT 1 FROM pg_catalog.unnest(coalesce(p.proconfig, '{}'::text[])) c + WHERE c LIKE 'search_path=%' + ) + AND NOT (p.oid = ANY (coalesce(inline_critical_oids, '{}'::oid[]))) + -- Encrypted-domain family — structural skip: LANGUAGE sql, IMMUTABLE, + -- taking >=1 argument typed as a jsonb-backed DOMAIN in eql_v3. + AND NOT ( + p.prolang = (SELECT l.oid FROM pg_catalog.pg_language l + WHERE l.lanname = 'sql') + AND p.provolatile = 'i' + AND EXISTS ( + SELECT 1 + FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) + JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + WHERE dt.typtype = 'd' + AND dt.typbasetype = jsonb_oid + AND dn.nspname = 'eql_v3' + ) + ) + -- Comment-marker fallback for hand-written inline-critical extension + -- functions that take no domain argument. + AND NOT EXISTS ( + SELECT 1 FROM pg_catalog.pg_description d + WHERE d.objoid = p.oid + AND d.classoid = 'pg_catalog.pg_proc'::regclass + AND d.description LIKE 'eql-inline-critical%' + ) + LOOP + EXECUTE pg_catalog.format( + 'ALTER FUNCTION %s SET search_path = pg_catalog, extensions, public', + fn_oid::regprocedure + ); + END LOOP; +END $$; From 9ce4789ad8acc4d36d4d4e5934db49ca623f7f58 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 14:28:03 +1000 Subject: [PATCH 317/599] test(sqlx): temporarily install the v3-only artifact into the test DB --- mise.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mise.toml b/mise.toml index 6709aae3e..42f9677e7 100644 --- a/mise.toml +++ b/mise.toml @@ -64,7 +64,7 @@ dir = "{{config_root}}" run = """ # Copy built SQL to SQLx migrations (EQL install is generated, not static) echo "Updating SQLx migrations with built EQL..." -cp release/cipherstash-encrypt.sql tests/sqlx/migrations/001_install_eql.sql +cp release/cipherstash-encrypt-v3.sql tests/sqlx/migrations/001_install_eql.sql # Run SQLx migrations and tests echo "Running SQLx migrations..." From 371fe215efe97e573f0a46a0ec3231de270496fa Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 14:28:20 +1000 Subject: [PATCH 318/599] test(sqlx): drop v2 data + helper migrations (002-007) --- .../sqlx/migrations/002_install_ore_data.sql | 1008 ----------------- .../migrations/003_install_ste_vec_data.sql | 59 - .../migrations/004_install_test_helpers.sql | 559 --------- .../005_install_ste_vec_vast_data.sql | 518 --------- .../migrations/006_install_ore_text_data.sql | 109 -- .../migrations/007_install_bench_data.sql | 27 - 6 files changed, 2280 deletions(-) delete mode 100644 tests/sqlx/migrations/002_install_ore_data.sql delete mode 100644 tests/sqlx/migrations/003_install_ste_vec_data.sql delete mode 100644 tests/sqlx/migrations/004_install_test_helpers.sql delete mode 100644 tests/sqlx/migrations/005_install_ste_vec_vast_data.sql delete mode 100644 tests/sqlx/migrations/006_install_ore_text_data.sql delete mode 100644 tests/sqlx/migrations/007_install_bench_data.sql diff --git a/tests/sqlx/migrations/002_install_ore_data.sql b/tests/sqlx/migrations/002_install_ore_data.sql deleted file mode 100644 index 833a94f2f..000000000 --- a/tests/sqlx/migrations/002_install_ore_data.sql +++ /dev/null @@ -1,1008 +0,0 @@ -DROP TABLE IF EXISTS ore; -CREATE TABLE ore -( - id bigint, - e eql_v2_encrypted, - PRIMARY KEY(id) -); - -INSERT INTO ore(id, e) VALUES (1, '{"ob": ["15151515f6eeeede892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459566a38fb0164812735b9ce4762d248f9e042828d5f5e5ab36a181f67fe2cf1deeb559ba7a4e0c95e8cdac00581ef610f44a0610ba86a6e37c28a0d978f6414328622904b65d5dbe57f04216537a5fb0316c03334385e89352079f07b9b1515563bddc3a903098177d8dd8d8a133e51c5597e48c65cf87c6027255b89d41964ed41d32c9f5d707ace4add7e7e27825e15a4c262fd799c7628d80292bd456928a3acb25653ae2b4d86a045948cc3b12240bb82cce84ef19e7c3820701d5a59ceff916390ebe4604a3ca2cc257e41ab85f2deef83882b4100010f13065bedf42a40a8cf862174a8959146fcf13b36f790ab85a413d8aa32c6cd4e5e09d77e68873cf5f2764a2f317d9043a97effd655e898e67c30e1aae2614b3f6c4268a1b9c02db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (2, '{"ob": ["15151515f6eeeedb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459555330775216ba1a1ca7c3bed393f5e7f8498eb60e3743a3e8acf4187cf2f8a955dd022bf28052090364fabee376634b658842bdacf91470d07fdedb8771d49c3a1aebc513ff3829c1eea14db7e60ca4a280e4906b4cab5cdec31ef9ee8f32dece31404e0031923846307020db9c29a9e297459bbc556793ce0833628adcf3b26a4a64deccb3e61c4ff8609dfe92944efc92e575081489863f0b80776617f857a82714e6978848be707f65a3318d1ce65b97aa03b70febd66c7223f5f74d5583e020e69d054d41ca2c09c514a089288e133cbca643c0af7650a02ad2b018813a1108ff9c89e557563f1c2b4657f04ad4e837cfa8784acf734d7f9d63b02b795118f9410a909be3cd01a42c0909afdec3310a2714cc6c6522665b891d210fc3c3b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (3, '{"ob": ["15151515f6eeee44892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595978fb7181a9413b506a48176075e1dc9cd57588f9ed3c796416cfab05a94fc1d8ccd7616094c01ea012c4ba64fdc98068bac7d71fcb39e058818641404ba4629bb018d67d81d292c2fcff860b91e0386c66f2eb7320195a238025b32704956fa55e31583a81f3b06c1a87490d3607b5f9b81b3b422a253f42552edc8bbd634b175ced03ce13f3bc4abd27adda845734120ece66aa72a20fdadd0fa9dd8dda07ae8512d8c90990a8201828c48c115c000f2a4706382a92b964445688e737c6228d47d9482b478e60e4c40210d171aad54f514da8da2d8dfd428318a975bdc8c571ffddb6c175906f7e2e42740f8b37ca1ee9ccb3440692d18660e8aab2398849010763cd94086fb9a1babe8ff86cf53f3cc796cf1ab84d14281d72c7b368ea863"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (4, '{"ob": ["15151515f6eeeef9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c8ef6c3cf2fd8bf3d1ed58c22a20fa3ab93a6a3fa0fcf2ba0f86919b35fa7c63a3854ee08d6c7fb74af2cf429440417241bb5f18b3b9d152184b280fd7e67526e9d7c366e34f99c71aad26034d1463f7d33d0dfdbb9d97d93041eeef7bb80aafa378b59e9b8ef721517678ab6b6f002a99a0a5a079bb9df253d9f4921852f238b747741d877e942f797ba5cbb0a6a626d774bef9dd5cbc8aeba7b46b28b421ed50d09490ed0278ee96433337fe8347df28258bccfc926c321512917841ba304f1f59b48271f7c8c5596677f6b7f115d798c4b91b5dbe076a7f9a60f750cf9445e21ce01abc54dc2fbdcead913d5df6588b73c3d7bc55923b20781266203862d2a7fa34cb18e6ec84ed239f38f9fb90e50cecbfa99b818deb1901a7bfa67c6fb8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (5, '{"ob": ["15151515f6eeee0d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459551126361b4abe9279d8d96148d34398137355d580ea448162d599f20def34818c5b35ba155ccf347cf2545524257579df0909c846d39ec9118a3c96ffa79d2626517b5db74e67158fcb5008612fb73eae4c89891e375e9a018c1183abf566c648d5d13c7ea561e0b491f1d0665713a225899b55729c31fa14e0f2e63d2508e9e8b94f1e0654c5150623b3c3e156b2e5dd89df101881ae091a7f1fc62b0be7e42512ce966b5b168f88dae69e9441899d55f587cd371753b3ab37c9c44953d58319653d87c8fefa98b4274aeb6bce73d4ac9637a4d21c04f822b3cbcc5bf2cecca01bef28224e3e5d755ee084700701a8b4d750c681dc94e24b32f7bc2ff0cbae311b633f9f58aa084cba5ea687475aef9c57908f4b19ce33e6405e7a9047c91eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (6, '{"ob": ["15151515f6eeeec8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459519836e9014d076e55a49e4743d6ea2609980e8f93176b0f185db76f0f407b238a66e06dc5c1af45a648650015f8b216edaddf2da35aef3871d09b7cc9aa021aaa6cc2d3cb52a8449d474b025599eae411e38107e780b064cd420125c2b1d542a690863023f2d868e137fc896d6d114df0eff239babbadd297a1178175de1452eae371bc1355efe233d98ba61af8e650434be207c24b40c821b5dbbe11556df2ded979fb5d448e251d3637a8e64fff5f4ec4bd0436441b135e0d0b6a56b2e1132d8d3c8e4a7d6d6b184ac359b9ac358a22c164949189ccf345d8b123a1b6f05f25a7e0b27a224924eab9e16555112cab20e4ca672ce36b9cbdd702fc141ca2a5db4c38be1d2005809cbbe8fbe6dc3ea28017781fe800b8c31145ab0f63876df40"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (7, '{"ob": ["15151515f6eeee2f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595860d13519b4e8cf4a0195135e8f668a02ab343c022b8620b24ac15ef2c251bf6e5f13211dccc662c09d546684960c8cae17bf207f9dbf40ef6d9f0a8028704e26c2974d11cfa0a443e84c63cefd135f309619674eff5ecd4f7ca358dff7950a7232c94f87b29a5df340575090b5ec84525f1a3d615a5a76e23af09be9ce9a8de5196876c1f2946aab7ed48afbe16d9d3fc67daf4c9111a1fceb113b72e63133745c628e945e5998247cfa772a35e26b1565e0797584df653fb99cf23cc1e591cfe8b1fdc4b4b6c16e8533c6cca51815bda9f6be844065e33bdb41afeb79bf45ae60fed64db7c0f313e3f68809e96529bf4bae9801832e89d98624f52998fccf0360d802bd6006d69c7a6ef3f252a102b521cf69b88302febfe5bf19d6ba04412"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (8, '{"ob": ["15151515f6eeeef8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952c7c49d3ef865b131c6eb0bc45125deb625647e09bed855cd7bb333f9fca422d3bb7f3aaeed5a608048ac5566880dca375f899ac9acb38b32cf0d9a54a91203a2085f825107cda6146bb91963ddaf8e3df270b7f25d458b846a868ee2f301aff7dcd5441ae3b0a4e13865315eca5c3b0119ea9349b7a7df557fa5e02ba48c01e3113b94de3546c297d06c9edcf8a76d25c8ca115ef8beac43cb161dc508bac223090c031cf113165b94c9077e71baca00aa007d0d0de35c889b99f9b2481e08f349afeb0ec98c5f0e02c147d557e259f457b8607cd9d60ee24f3a4fe6195cd00ab407fdde45dec02a179e43038fd12b1eb8490192fbaa1c0465f627da4665f421c4844a32d2229959b243d2977b03be426c51e1474544fc204a02de06a607ea9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (9, '{"ob": ["15151515f6eeee20892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a899a6b43d4f640b09a13a1d8c82057ddad61a7e761f86d706c5ea35a27a4878d36ab203913fe66cf6a8509ffdb5d5367070fbb80cf39c80cb6f3aa367d1698bf5847d0b83de9e8dca38a0fad5a14ea650792af76ed2df5a5e12b6c799d3d4f46af0ba2a272d3e273374bc74c28516e9e809ca87155dfbada5ae3a7abb83eff8d38f608bc792055b02af93ae24dfea11a262892854b4b236bf2edb3f97de89438368254923b80553e1129cac4c608330785a1322d98d0cc05db804e40274c8738fc136d27f3b40e80c096d94c4b1f56f65574f3ae104384da9ba0e21297cfcb946ff8fa1c1ccbe53051dcbc1eae288675e4fe7f20f035e52708938088bd2fa1aacf44e3a647b8e533457528aa81b06ca1e5a06679147b834bb69d55788ab050e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (10, '{"ob": ["15151515f6eeee42892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957e0121afba1eef66a7660d0b5b4143ab7b4ab8d2e48dba9206ea1942be9dea44fa23b7477d6ccc873bdf2e7a3fff7cd5db02a2a2d4bf6e3b8232aa9147d620953e84ad2b6578a275435377565f30a234f0015f6a45ea7d49e24e083a5ae4757c090c62a5a0bba16208f7f4caad5d04bcf1c361baa9d4ddf8d30a4759ad316c3e0f610c90a9a76e7174aa9904cc562d8987f3925db3fd9f589fa8b76fbb78155adb1f682ac7fdde600d107e56e60f4521ff5eb93d8bd0e47502e7bcf1ba14277a53710b1b153a14bed4e2d1d088b5bcdc387f1937257555244a3e8936740a006660767f8c7e8e271885835a049209a649fbaba49f6ca09b5ebaf573cb0445485f6fa29a2cc06eabefb99e0b6f22a2c39baa84878d6422d3c578c7941f5a709d0e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (11, '{"ob": ["15151515f6eeee76892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ecf33aef15a9c971dc44fa5c797a8358badd6e0cb2ac0430b52929f8a80aabc152280f6c9b746a6ea7229e5d1df4aa172daaef66c0e2752d751eda72561a23cc771ae289dc19d2572d861ea00c67b11935e144ddb281fe2059cdcdd9c8f4dc91bf70e44f1643f043fd033cd47262e09bf68cbe7799daad10d2ffb6802f9d6a8eed4d0df1d11e6b72260f79750a82fe4c634b01f85b5c1af96f1fbd123045b80c807bac0597da39a85b1d270610aaf12577218deff04de3e5ca13325fc63a19c9f8a8c59ed542df532d93ef0c593554fc12708ed6af26120075f6d2f076cf01679b5add48f6980d5ed6a914adf8527fee373e06ecd1ed76e00e03d065b363bae04f340565026060e9ac7221c79723034e2ad76096ee326a02e73f34f1fcb4128a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (12, '{"ob": ["15151515f6eeee82892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595857f767832acb87fed279ce8ef17706ae84c16cc18d271cbe0d8b971f8fab69bd96e317c72c7fbd12047a529e58dc43a83873158e5f566631b57e07eb8b59347adf2f36d5001ac4e63cf06b52884059c0975e883071f3888b703d5ee6947622233bea99ecd761dece515b9215ae541e57510eab55d32b2480f3473ad93637788fb26c4f42cc992f344e12d084c5af60c5ec6e7d3d8a47db7c2839c73162f027b1ee0070d7551f72ad54c9e7fb9c7ef865d3c1e4b2b90096fa2e069244d5ef2abf5a6062e66322545531dc17619d62877eb21aa00fc1a862cb3b7576d9e553a3b567605d06ba94938145800be22b309a18d49122a1d898a2e464d1f882f9787546f651efb44fad1e8b94de11293dc3ed49ab0c6d3f60942a98be3831801a51c5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (13, '{"ob": ["15151515f6eeee7a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c1e6a04d906d968448767459d6f133ee8ce97a264ae0e4942eb950432ec5c208a681e518faf3042a771a8c651388e154955fdd34ad00b578cbc3589142117ff1c3d6bdd013388c588a3c551dc62f193320e1ab0dfff18fa05486a2fc39c42733a3ef05bde21c137d0fc666cbf68f4d55029748d60c20e6d0d39195d5369a299e9fc57d4b2a6e7fb4ecb04655880efcca2d37a2e1ad56aee9950405074c82c5a7336bfd84566ec19fe188513da73eb7fcf2598754fadbe3c030a25665ee2d7e3859de507ffce122691774d954baffc72f9604b03a0cbded9b02169656efaa939637e9a5b7bc8d3bbde64e28e8f835dc3fd9c891bd471c1493b9ce053a9349a3d387fde4972ae8461b5d5722e789a8ff3d19e7932d28263cedca663ab0c673577a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (14, '{"ob": ["15151515f6eeeee6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459560f964f9b68cfbd0f809dc0635e8f68aa6d698a7de6a60ae65df5b8db514d6f71f4c58672ace888db61edea153c4092e45f31624e2f88a08b6628d443a1cf419c92097521da937e2620098ca89363b3247f99c9cb0860d1fda68e1a83a0ab44f0d3feb0455a1834cd1f9f5aa2cdecd81453c39ad1bb980c4358441361bc554000eaebf9eedad7f8bd22bc7eaeedc91004e6507de78a96b19b59c7832def6228ec6cba17a5aac2da58675451f1a1dc9c16c1760536438a6bc2facee77b79cd7ee36f2ef29788fdb372bf672fe570a5e67e22f04b444a8729b08537b4be4efbd7e28d389631b319adea279643286a816b5f64b8296d67600f9f821f164a66ae633adc0684ebf6eca2307236ab662b20a1330285fdc0986f4f060dae3067595775d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (15, '{"ob": ["15151515f6eeee27892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957bfd29121035de48a78b43b952bafeaebb2f13ef92ca98210d84e884c72f771b2b79a4046c7ec70cb98aa323aa455fa194716f5171f2f94037813ac32f5cbe5e2b42f64a706105f9b94989613a384f5041ec5080b13fb69113993f84f4f9f61f1dc57eb75d11f669dc19bd8dfa76f96ec0ab0e9909687e011ae77bd23b94dc2501b75bcc053d8d097f0509976baeb15c56acdaa0ccfa6f561d59df4b029814f073565c994b25295eb4feac11ae34ca11e880e35c74027b89d5df3c9d0f8fa0f2ef062d4cba57f947c78adad6b3628eb4c22ea09eddc1165415aae66587caa6dc4af8f32ecf0c44c555b192fad75a1b7d54ec5e72cbbe71f5c38b4dc270d87dfc7fbe9245fe1f19336c7dd9cf43a60183217891c28fa13cce3a043c87e559350d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (16, '{"ob": ["15151515f6eeee2c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952fd12691d2439e54869c5ea1b06538666b2a6bd19bdb2cef9ec4bc3451e457ecda94b2178bfd928032b30719f1961b5ca5cd0ebd720713043e2f66b308a75b6be673adff422ca6b063851e74ce467da5df8dbeb74f3d6d79beae5d4411756d0d255a46f93660bc18eb2104b74175188a3ea73229eea9d074b88a433ef181fab78cdf191b813e4b5461fdeb4d266f37bf8aee0088277a99e8318842d926cd7cd98efcaeb8a382b7517bf28c3e87ff54345af4ff6bb060791e52614f3bc3fe4dbda48a3c2847efca848c92e280e0c75a3ee3b42cc917189b6b267a49ab4e68a9be9e950ed57d27db905b05425cf9193ac5b196f5cd5831bb5db86faee021ab1cd4671b54e0d2c4a8c1f2622368795016879f3bebc1515c135207904edfe57e0ff3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (17, '{"ob": ["15151515f6eeeebf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b1b5b37c313b70de5a0379e14478d8551728d0cb701b8af3cdcfb341f1111e88ea46f463a43bdb60f83f646c024af73119892913678d6fdf4bfc51bddad28270e4358045aa602cc414b29c10dcac21b994d0a5580435acc1d7b16e0f596a0eafdba325f23d558bbfc5bfded49a237f3479ef3fe3a6bd0c0359dfa34662485c3356c0a0515522f711977414b5104e0c079f7508bab6c56269d17b8eb255c7f5f1cb8505e3d7da37b9efcc7d11bf08daea9f09c8fff7598e129b6da1d5f217e80e38eac1ed1ec125892358fb403332a09c2a0fb27cddb4a19cc0f505ec33447d850843c18f7b8cba05c68d69fbc632b5bc1c98670b97cbbc30c81157f72fc689f69423cfb093e7c2a1d3cd9a7d2a9b3781f9824ac6550a4c8b6c14438f4335f858"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (18, '{"ob": ["15151515f6eeee75892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d400c8e5adde39418ffcfa5c18ba90d215210906e3ac996a12f5a2b8a3206b21df7f8887ea953dc34649d7c5e2c706d7da02753b5c398e24994e4970aae5881cecce7e4e62b89935c1ae9d5a991dd7984884fa054396a8aea01ca4b5ca3dd65f9357835606ac60168677db59ceecaf0333ad4744cacca59cf60bec8d5e2f37820bc9d28f8d79e7a4fe557f845998e3c10ce854bfe24ce4a2e72df35e2fa408d57013a105211f6212b320f53e0e5bd4d4e5b069d9f97d5269c53d46669e3bdb2f4e90eaeb72c06951b8a6e22245d4ea55b2a89812a7a46eb74694b60823db7dd6658dd064aa005071e3734cc395a6f3bdd089f460f5453d4d7bdb2dff25fbfcdf9b0a9905a0927b14bab259f118ca9e9f700e18b04bec307c0cc8f55cc96df5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (19, '{"ob": ["15151515f6eeee56892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957b87c59e5c5f3d3f2aeabd17548459b3707b47a218966eb1f91c6c75a0117fbf9aac54499f02d2c81529b251b24ac01195a4899d5f06452b32d5915b3d1931cce8b5c39bd195cbd5e7ae075c638743a2f9ea21a261743b8e50a4f42619196c1fb8970abc51c714bc286b805c919bb42a4028f3f67e7d0f18ea0e6d6df049b88732514f426d5c170fd7d347ee4d2eac9930f68ed5e55aa5fd4a05260d732be9bb0e001f5c9089b5b8e9f147a574b6b2ffa02b165b3fc119c851fcf2b43d7d21021549f9318eb7eec11ac9cc1411f20dbd3da23c2bf586b9dfd04a817e56e64ebddbbf0bf615d2d06702494d321bc5bfde5ad15c75e0ede02d7949560f1eb7549ac979ca8dddeb4764d9a8363c878b0eca499de01d0969bab684fe48cca8a6aa41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (20, '{"ob": ["15151515f6eeeeb0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595da9317daf8e5352dce494d1bbfeeaa10f5d473628cc519d93c39cccbc801e22dccdc85ae3cc3ccff5566f9b7a11f56c6e5a79c4867616850ac2b9083a1f7c556b84dc640b15cc7094503db0e01fff59405e02103d159d8723989e1c0a377a6e36d716fccec20eef08a94407f24b1c5ecbbf5e19c24a73bd23b803611418aa33d2f7519027ed23b48f964210b8400f65fb6471d3d2eda6e396f4590c846a1ec9d16a755abfb29495b9c5ac0653a84d498fa0477c3bea701927ed88d71dbde1cc97ecb7f3c39458a8cbc9e4d0ef63ce1f497a9e2fb8ce6a86b77dfedbf7553d0b4ef201391d44baedbc0514a09f5c39273c1559401a14b50c5de45ccb751a469d7b9ec6b3e4a52a0c6db790a02f07303d96e2a095a1894319cc3a1ab1a61d2a29c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (21, '{"ob": ["15151515f6eeee1d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f043011724b9891eb88ea279d9dc2429f70aed1c6ab6a004f0787bf1cc53391175c96e08a32eeca26f047329386091394d2c55272f8a0cf43fb0f050e28afd5bc505fd76d3e6e3bd4b9a86c5fd98336db2a9602d2c3040e597bc56525614879de0e1a52bf39ac5e85f602058e3701fb7da87e0e8d2b3abd272f28f000725648ebeae90bc88a02bbd3cc43e845eacfbdc7f67a422241377f7ac25f3747318ec006a667023605d76b09c0d92500d542218b38c72da0739b2dc4a1988434c60701116f4714cf7864be54105edf5cada43c763daadef89e980e47eb51506a1b3e027259a6a8156b2f975fb026c3c52c9a9db56388e3baf704d2cb121e5eab00ce509d3901ed20ab95fec3f6af7aa2df189e787832881d16df1fa092d0dcf7cbd12d5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (22, '{"ob": ["15151515f6eeee1a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b02c6e2d163bedca74fe6bc69b75798808362ad437497ef7c5eb3bec19d1c1caa814d2e2dd004b6293cb3ca0bde62302b4b5d9f83c68145f9e6c2452c8e99e691513ee1e25a0c6bdfc7eeffe94ccda7520188325a664b4d3f1e2ee33ce07315d7cfca178b7c3e60040043f7dd14825b1da1c3074be5e398145d6d922dd8a50c4d6b7aa908314dfc06fb5fc1dbfd03cc383fd5202559ab0ffa5548d934b2ba6f024f8e43b50da351e21783f57c6090eb64c21ca8932dc4e02edb035d2a15f668c679aeeb214bb6106ad8027b99b380ada8590bffdefa8237cc5fa13447eeb260dfe419b21b5665429b9bee2da34e9772882d58619a5b47e72c435d75f85b060bbce9a26fd99ab22523fe775445fb5e711723c170786331d5141e766a9153b7b4c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (23, '{"ob": ["15151515f6eeee8a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459582e68bdca9a43671d9300a6ac3618410e0ae63faee2599fd7832e5cfb3119de805ff8704c44955d4bb2f4c195a8d434dcb5418ca8b3308be2f7add812642329dd4e685b4a90079d6c65228f619a2df8ac065a1f8f845ea6c107fb022c6fafebe772dae4adf0bf882a034c512869f1f280b20adfa665572efac8e65ee30c00b08f53a51dd49b7193a79fcdc47f87e50b26a20c43997528ef4fbcdd1d6564552ece344eb20debd4d10366954c77447ae4421b730f89ad52ca7325d85b5ccc241a7f07819291c84d9481e07a32cee9f4dee4d550111a36f51973ea74ed53d0504fa9f313ab2d5cf80e104eee12ac341afa7cd0b8cade520e10e40864bbd772619bfb4504af78781c24082b3ad3d1bca18be03e6c3982e2b3b59c636e823e82e6034"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (24, '{"ob": ["15151515f6eeeec4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595071d797ba381f6262f1ddf79d75a0cb1d7bf49ba72f115d31da059b820fc91f3f0137614c6c30a863206ab408b914b68d4e3b6b3f54525fc74af084467f5b122813841c4f4d8399940631a6130b2c2e35039872f373bbe0a5c5b40ff9c7b82dc3d1adad3e814fe59253c25975081afc830bbce8b40bec95843b91ed875e4aca0fcde55eab286b490fded3c17af26114d8d302876fa8b029fc365b7163206d051090eef9ebfcfa8a6f4a717ec7b1bddcd905a03d269f2fbf66c99c409276a33e940113dc8260dfa9d563cf5ad64255cfd8c567e0b2607ad214a74435fc4281b22d32eb69854a2a20dcba08c449a69737f13b8b055f51b3667766ad51dd23c6820fdcde4fc366ae9f064e12631c6c2fc4e33c4b58ec23ddcb769366f2f049b99f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (25, '{"ob": ["15151515f6eeeec7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459536cc2552de9feb19ee625379a2a417f603e837683d9a088b604902abffe319a56bb25292c2287f20ec2b7306de4912299a68f973a794f2a48c26dd5d3e8558558e980519872684a4ef25d404b7b193f5396d9034b456e9cd6418f9d47edc296eb000592434a467758502aa9b699670fc1c3980829d0e5720129c636862b52c0ac03d8d97a43bdbc16a6160e046c4c4e4dfe81b6c29af693b0b3c81d04ed69cd1ea147f509baeb928627af69a311aca2d3af30e2d53542b6a2493fd6d967b3050298ca92bdc50f867d30e99daf026bcd8faa9f5db16579474a67d23642e2e1af44be6e2c9b4abad7261c8f10967bbf711420e84bae65b0bf1367a2a0f8f20860155dea88c8cfa0e26525a2d4280a038db0d15bee4172fc4591d41e08973b750cd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (26, '{"ob": ["15151515f6eeee7f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f3852f81ace89ed9cbc3ebb34212fc6b0228ea83894e5cf7a89373e864ad690719358ecc65cf8a1dcd90b5a3aac2595fcec5b34b5b5f7b18d706dd39c1ca5015e240fc8cb66e08bd0179528369f15920428b65cd61ef009e286c87c087fd5a6a492dc1b237febdde1834ea794282aa0d787521b6e2b043b23d00af94f6cc7058e5c70a6f3e9622130b66db8da812fb6688530d57d10363b1158ef78dab5af2606ca5f0bbea002b173d5cb733c2883631bdf6f27b6f77da894dd50ca2c26f5d59e0caa1e3af299f04db27208ccee56b05854577b54bf84e8ac1f588fb680fea9005db4418c12e9a396c543c0b95f4c6e44f6e86f52878ac3534ce886409c4ed922e593e5eb8c285430ebbf3fca48f9e748ebb00e8d07b5c16608a3db76b1e17ff"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (27, '{"ob": ["15151515f6eeee97892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595204073085bafed44a8a0a08badef653c3b81a6621e094d20a8f40be7026c9f8877619d52fb3fe023ff04f3a65aa9b51fae697205f7879f94c7fac48c0b75c8ce835b204fb4b8e22246c312f45cba24209f6838176aa6de4497437b129e57676000968c775cefc8a9d405b7524e527b3fed3ee9f6308093a325fbb5c65d5cb2a92c37004f6d979cf7c314a432b2768911fdfc789bbc1dbd646ef742b466370c1778325fbc5b8fdeb8e2addfe3aecf24ace5a4457f75d44f599d139ce434deb44d5f6f74c5430915942f568e0dbed0ad129ece916bf13fd2ff4a5413b1a9aca2b1611241fc9aa5a217f9b5bcda6e6d2b35f45b23b6311ab8a6cc7ee349c05d617ed33e6a466e03b7cb827b1ba056a3db51779624c9ab1b1c28aae112a1d70f966c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (28, '{"ob": ["15151515f6eeee3f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954c0cea02a84e0ee9c121398485d9d2c6030f15b1f7ad5d14e3c8f9eeadbc50260f35f6bca7d484676545a19e0ead2011ea104e2d34007991b536d83e759548d5ab6771e77512100ae1be9ae75220de85624118631d7f473ea5f5c862531743ddc0c745346e092ef6eea387485938df2d56035b29b6adde9205012ebfecc9385aecba8973ddbcfa53d4ab1cef232fdbf3372b848f2d5425ac442fffc5ec147f8b7c8d5f7e6c8b64df0b7bdf69c7723fb0de8fd633b624a648f427520fe9bac113d9538d3ad73514110d1d94cc58f57c4504f3836554d8d7e26ab30feb9624d8f3daae450a29ca3db6e3970b5201d92a199b5d7245f027c21ce82d5d4816c2c2db117cc0557962f9a1285b4534a16f421a4862f9bab628035f3e3d3cadb990fcb5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (29, '{"ob": ["15151515f6eeee9b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459571dcf5c85ad767a0d2566462ebc361a3c0dc181bf68d1861009851730de40445d680fdcc8aaf638455d1280e543b1ccdfa99a5bfab0b50f0617d891bcd64aac6c094634e781d5fa09c097a254bc53596691c3f2475e900457bf0dd74e77cec31f2c6929289dae1d22b783eb47e3b3e0be4699ee50202169871292d08fc577800e04e7e28aa59fd4df01234a9d7dbb2f3e14f454a2879c64c5d7af833ab18bb476d68c00eea868229c8a9c6bb20b7fac9b5faadcc2fa73f749980483a9ac544546f16768e4157b30b11c06c1ea3ae6262f96cf5658449504ce9f4d3d487ebe0ec320090fe1f1e9dbbaf78eedf59b6732b61d88e4ffeb6558ffa5ef1210423b3859ec88508449dfa6567720b4cd69de496c90d91c4a101d415c61b496cc159ab05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (30, '{"ob": ["15151515f6eeeef5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951373d00cc97808990cd803093e4e5ceb781dd58b3f238f337f6463f36ed83e481f8ab5dedd92209cc356a3dac1a740f76fe17625382303bc4798d432d8b17820ba6eb1c7da2bea73922cbe285857633994b21a5b142e7dfd91fbe25cb77d7e66f1b3b1e9c8f60c5d91dd499ff133e193b5b2ed79a320bbf8c57c60e3bb05221c3c92a9c2911a2e7b4fee97245cb8b8120b64a0d5218946bf8ecb447ad830c7b60402cdb9f17c272ee8fcc3f5b4e55519b8b759a40ab9847d725ecca7577ba72ef8b45662b68f78d6d027c22b747fdc04db2a704054bce2cbfd02f693a0ca013d3450b4bce817c56cd9b2438b50231283aca78876880b64bb6e2968fb56083d3a7f645605826291ac038cedbb0f57904a73e78a141d744fa67ae2dc1b38138e67"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (31, '{"ob": ["15151515f6eeee40892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459584e6a6c6414d1a52216e7c7fc6ad8153dc97ffa8e8179cac626acbbc1c7dfe3877375de6445d4b2e6c08502563a978fd5ec72111f8ea2389eade133f79cc56b2d3ec9241633dcdd47e79e28bdd59faf731c6be2849595b2259284a49e5e305346bfb8e23d5b213d0a756da10c314b005970b905a42a20f659da82706adf0dbb622406c93233c59663c054cfb291ef022ea9609f0716e2d2e0a757a9cee45a55fd754efd58ee9f1fe6c884daf6d3b09a065ada5b87e56941faf531069b1e8d4038c99801cbe177db6bff0658eaffc3c8edca661879b3264508a8ae77118abc922455c139c67a66f96eef472e8f6577894c7e4c6c53a3bd51fa8e1bd40e78ba8566b4377221a29eff2bcdae184afe4ae6209842d1fbc413455eff0d0fd68b1966d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (32, '{"ob": ["15151515f6eeee23892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952b2c19aa9f48bd2ccc836dd359dd8ab2141a31523715b4124d9d16b24c55e7571f23c994f285d0e006e9619fd49862ebc9fea699f111688309975990338aae891689c656dfeb9a631540f89e5ab1aaa2169ea3af0230eaf874c83bc0ac3ed8733597ec1289e739cda49f4dd1d0a0df3faef8daa03d543d8a5898658b25827ded69b3523094002fa82c2796f993be87e27e3fac2365514448c21288b23bb578ef62793ef95ce9ea871551fed3f7d70a1445e791296f33ba2184150174fc26c401f97ddefce9248d233749066d51ffafb2adaf78f964267b6c337bf4a86c78a31f94a73435e2e2097b89f4ef4bdb25709cc2337ae5722925468a7228207311c15a1bfe73e3e40ffcadaf035fdc1bdf54f5059c1fd00622e8b4a9ac459ebadd6766"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (33, '{"ob": ["15151515f6eeeea0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952335ba0c53d6ecac1a21fd1d6744dd999c68d66df52336a815e742482ba3171589de65baedabe147209be3514c706454bde118b10754837258995046fd1c6e5cf2d3d0cb5a23313e1806ebc0ac4b5cfba3cb392ec64d59a93d0e0ec653b010a96c13ebe00a87259b087d2e42702af0eb696d26fc9822ae22f32bfb6364b2ce2d067e08313ec5f89d0ed174b24418ab904c5b6ff4da5dc3c2e8df62f64bf0c44e98f640969541abb92a438734fbe7a0c208916acbf72e0fb4dda8d26bdbc03f1f0b204668bf720c4c20d871a5f0790d25eccde1932a2871f3450e9e9d55c1f59450332c09a743ab098aef3a9dbdc57da60b8be8af9ef21ea5f1e0f597741e7f9ece5a3adb5a36baaf3e4c894b811e234e9138f08c7c32b346d6ba68d028fcbb87"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (34, '{"ob": ["15151515f6eeeea6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a9ae24e9c4be3d68db6ccf6ad5f902916b468817a59e132c66a0e658324f0f0321fd716a96f4dd091761940888dda097c5d1f475232891427bc0bcd4954feb460d0f35076078a293f52e987b9445e995a3090ddf001198726754ea213d61033496683b374f847815d70df795a3ac4889abdb1b7006d391ea13fcafa1a81c5cb2fc54be753e3df736b3dbcf477f0a668f7ea37f7f080ec510c4f618d9ef651b0b8b5da976898c267022cf1439a47ee4fd99ce10a72d14aa79d818e5d20ccc93472e31db1fbaa6086db7be0f3566fcb0d1b38d49eb0534f9c537a17c0e140374a6eabdcc5a31a5cd7c37b04efbdbfcf42a86b8ea4dab421cf566b9a2b223ba892a20e63fa58e2413cd0dfd203a9faa0a454fc61f802563279267a4a9662ce5646f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (35, '{"ob": ["15151515f6eeee57892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958279b88e3057fdb820b43f5cb529a423b3d63d114cef5e982e3cd35d769075c4eb081c50bef9d5466e349eb8e8aadb0b5b3cfd2c991930e2ca65c4a7aa25ee079860e13f28cefb5892f22e25c0c23ea57670d2f6e352c3d5e04b4d4804e1aa9f5c589af757fd913bf48de5cbdba8baefc1e61a96b0f5f99f5af1804d0bdc732135b31b6e4e68098b27a5d8fbcd2ebe7f8d91782423a1a20293dee0a65fcd4afff0213d26e42c4fb9f1d896a03a6eb228cc8831e2bf36cc98f941b8e3258448c1cb8695bc82c9fc0327570dc6b374e008a833f6113609fe9d84f1604faf763671b2cc8a1f91986ad673d2e63981311a952a2732ad418e22faedadc4e3dfe6e6801631ae632467814e1350fc98166ca8b820f1963bc7d7b0b76d3a2642a1bc5aba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (36, '{"ob": ["15151515f6eeee36892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954d2d761cac9636dbe56c7bd736dcea250edda32f1c5f87da883329233b30838baba93430c854e11978dd902736a27f32a71d92ae2e620cd52dea33c6e30f75c4e22b8dde3e47f16053754ca2783f82e052e8a011f24d7f269abe5dcf4a04d4f860c543723c86026161ae85d71aeeb3e094adf66f20b0709b5e0a8e4606a3a876f2bea26c09d68d8522f9b66dbb4c40d51637d1d1af4440311b0263e0b736c2fba60012a927d97b32cec353f8c7c616da7c8e68e95aec38b05a8d27726285ae0aa1f675428e465288fd442255c7dbb2e711dd81e0160381dc35e53013c734956a8824f257a6abcfa49a26a675ecc952c886890b147f0c230309a5184921b0e834fc6bcabdca0371193b1fb27ef88dd0a2a9e7bf60e8a5bbda4b072437f21523c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (37, '{"ob": ["15151515f6eeee77892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c3415686290cf3f37ef3c76b3743ae3e42c5928d1f260b588ee6a631ab44ece1d7344643c75041be77fb4c5b406a74fa4d08494a50cf284a0cd3efae9caefde501df1f336084e7354097fd4cfc374ea0a32535cd1998fe283d93aade3a689ac9a5e834a7ac804045f026118869a2b47ee161ffb3fdd44993adfcd397d01e1311099350e27a3124f207c00acb660d1b663197bb03e209d479e36bfa16973556f16a009689999b4a2149137c38393e4334fe932d81904e156a0fe6be46d649f251f36a75cc3ba58d7ae9e3822fa532222d753679293ee2d4df1b8a09e4b00d165ddeb73c961e292fa29b020ae27039dfcc6d3c9e66e945fd413b13d90262adff887bba655291614bcd395b944a87fed86fa13d9b860770043574de8662c71154e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (38, '{"ob": ["15151515f6eeeeed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952f0aba1d28f03f82c454b190914f8dfe55234a6bff6d5d9492ef2f41cfe4841091543315876ef6d26387c5e4b388233fd51b4aa4c4909fc81365068b6d46a1c88b7217d8510e985ee1ec27908538a350cc1f0e92f68a3ac620766b023f5411e3085ab898d394cb635fb19a86b61565ebc6d8010c62166940c44b558f74304262290b1bdabdae8cf920b9754531a63293a84e0fa2132b5473bb100e6184a1bd26608d57e12699722c57cbd78d3acf5d84be08a680aa7fd3d22a1e4c3fecad40f95dabbe1804135e945a613a0d2b0c018871f8894aeb1ec0adddd3f4c8431623a1e06b98cb94eb5b8a66eac4f3b9e3ed649ef70925a020058f1e3a2aec8ce80892cf051f6259e215add0d06693811a01c63c3ae876551ed65794628486a9ed49a5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (39, '{"ob": ["15151515f6eeeee4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bde7dd54628b320a8484cccec959bdc42fa22cb790a52da641383cc05537b9a75d7140eb31ac26b3f8e98b422a142809d3bec746301859719fb58760f16f7bf403901ead2c5053b9c88e6680d98b3e456b03eb6775e1e5cb9dd58a2cbdfa7f300aad1e05e050a2abc4fbe513380a8913164dd98ca73fa798733b2937b57fc66519914a67394dc4e8dec67c5816848dad5636e81fca368c3d6f8f6dbb03682be0d870072e0806c6d15ccd7562339145a92f6171d9de9f148e98ec3bfeff2586a499618f613ccb8ab0387ffba06a9f6c0299de48976e37b415b691da63b3173579b4aec7e226604d856a57697473c7e946cf9c6582ca36a12fefd56a4eef9d7b16403d2914d15bdbeb99bb43e7a4fff5e195e28cf857d34e1951bfe940dfb26c1d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (40, '{"ob": ["15151515f6eeeeb7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595355eef3f683414d60c333ef2a21ee17d356eb68a819a3bb9fa101f21d15febb96eebc86e79fcd883122caeeecf36b6057195c4a82b266a9c21591e3f89c2570050c54f964d9936e14d683b97225110862edd98982e50eb3fc25d93a75c68fad943c5646fa8e00807856e3128a53983589a968b2d7fe43fb6c749d3d5da87f4c1f79be08f547763efdc8a4c2612f12e0a2c5c6b153f850d25ba68db0f9e5d3a3ecdf5f36ec1ace2125f1e65eebc87b9b22d9301db8a2754968c30407ae291ab133c6538d7f76c7895940932aadd9e166a4fac01773d447b5b2607eaaacbfd96d9dd4952a55fda7004d36715574328e2afe0bc84dcbf6773ae58fede9873c70c4f11164dfefd61ef036bcfebdcee1b1711ccae5fdfc5fed7d29338cb031d9a7d0f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (41, '{"ob": ["15151515f6eeee14892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ccf481f84b4edc55f6060b579513635ea8908c08020100b7caf6a4e57331a0413020b1d57bdd1436dc4e9d8551e422f5bb546a25ce41d87c135dbaeff4a9b1ad02522805d902cb51e1ccff897e93b9f5b691d1c8b89b7c9c02b7368fe50ee80b8be0cd8ea0c62b77da4d32916a3bdf2c93557986d7bd10842a069978e28511c12c4095a4ed3120a09b095c1c907273f2ac66010761aca8738c0686adf04233758e47821cd4b1d10482789a2df16f18aa33aca3f32919a5a178edcf747a35dbf627443c83c9979bab65e6d1354ad2ae3e6013f6cbbb53055d01b8138b8459035bd7b19f03acdd38ed6bc81a5424bbc472b7776fafb9f2a7ac14e35ba07a809348e220bf304555035e674a424d2517c3091149e3582298c5b695b30594f5159618"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (42, '{"ob": ["15151515f6eeee9f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459540c428ba76bd5881f6cb54fc9a021c8ad3c6f85cf878bd3878d3051806e09e68076c78464b4e67f042b17b31cabc3ec617be16d4b2ae9ed86d0a76386381464b82d6287bfe5a4681656af1033abe3d6f01d7c56270530e8718296f36084b155d7151a2c46815f3bb276eba7b58e64b61dbc3b7e57c41ceb47f5490926b6e015660cfde3ccce6214b81fabafb00883abb2800454dc23f642d36ae9d6678d04961d465506244c982b255f339633b42c7270fafc2cfc9c9c308dc5d6d21df682a73f8d02f1acedacc5c47d158bf55525b5fd2910924b793d50f5b72b0304e6731bae90ea6c083a6ac9221a2b38d27f26746b2bc4e4f63c52abf8c13d5eb74fd2b3d9e62dfe5698c5219b8f16c0195eb68d0ed5c2aada063b9f7ddd9d5751a84b069"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (43, '{"ob": ["15151515f6eeee79892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957b7289c29b291db1d1277f55f39d1f32758aab1583e5d88875d002ef0ed3c4c49838869ee27154a2bf7b3f64cee3e8dfac72ba414edd82f36eca678b040a0c639536559c5a972eb6b17440f2bca979d6097add147ffa09564ab556e3c958ec071ff6418600569b1ef5d46e9278785771382fa96182a310fa6c79a41dc28939c1b9910e7b8e5903ee61747781c66b0c1347649b29a53dcfc99565343b93ab35813331661dde6dabe5f81beec329501ed1e9a41c6e2d8662e854af4dc9cf3e0a863ddae04e59973552a1bffacba77897805e24051eb9c366c80e41c418c9f01c9a4d9b65691d6824057353fd90021470603d753828a6e4508cb442684aca48e6e98c862dbdd5c8d39bc9155c6388173e2d56ebf99f62788e978a9babf77b6976b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (44, '{"ob": ["15151515f6eeee45892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951064e9db846535203f3b9396133c01c682c60dadfcfa91c365c859756245018b53e29f6c43bd91c412d98b99c7322390a6d37da02a1458c50846ecd60c80e5eff4f0da49fa3ade28a4022722eb3ef052786054c095bf88569229e892200a301ddc450b6bca529be136a56cb2448629fbaed700f730fe1c81580ba81c553d9e7d3796db20f6e234a2117b2f06847aa8f5adc88e771d1ca3744fd6b10e10973e67650c738520b29408e05ae840e432c6d1dad70948af81a39ee15011deae1fa3df59428fdad724e217a35bee05a64a3f9887a4cf6cd7d9c101091807eac3067781f6d8737678ef5fbc4b9207d68ed38f3685542a2e9b154dd845a22b111faf24856025deab2ee4bb5f92f417061d8a50e4e4badcfb60103a6a80f00b5de8d19c68"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (45, '{"ob": ["15151515f6eeee2a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595fd6dccf3d0de9bbdfa4b428337382972aa009a710e7c8080bc2290aa1899e8ad8b070be237d43c6ca2ba6dbffd1736f1cc17e4213efe7d6574aeb636ea3fd3e30ea97744802bf2603fc73b03099be0e980b5b3bfa78ee7c47698ab484063dd33179f703732cb7002b87bfb436a47278b45158a7a32ad93ac79105c8ab163bff9c29e6ed1155699cef09ca7ef3eb17d091832990c24ada804f18ba20361788cdd687cfc62ed7f12938e5a10fa5d8b6ab32d4e5f066769fb2b7152a9448907962aa9c6a10844475051ec77f8ea5e7e02a9039d472e8ab866f26480964abc9084182593917a5428eddfd6224c68d0d6a25d3045ec4aa534bce3c4d4afc43fd14fd25279e6091d2ebaf7ce583dc00ec1ffabd41b8bb3315dc6128682b964c8c91b3c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (46, '{"ob": ["15151515f6eeee8b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595fc842bf40323f9d67e58cd2c5abdd544a499988f6047cd149dfa099236f648e6651e85a978727af341dd335d0972633577c83606f3ab278fb9d10165762089dce5aacbb8d20024b92256c709310fade6877e37185bcf2d2bfa953c9d44d5d4917eec46502f4753b1cc97497057d4cd60c775c389c99f40d763d0a69dca34a0082550a111105b7b140fb00afdbe8ac5e560624bf8593e874425f78128fce3c62a2d024323f0a5bd43203e022d0e011337b2c56eb57689e541ad829c60eadcc175464f037a573d80b948f3ef5dc8366f704178a1775d1a0181db83225d4cde094704b2574e76a7d2811c451bac20db874edba3f83b23c26481f1a69461f278d45412dff6fd684c79e0c18186cd4989a85cc177cdeeb66c2c0fb067302c5fc3c439"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (47, '{"ob": ["15151515f6eeeee5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e2c848458b66f7951394b4933897ae06d2783083d8099c38e68c4b3cd39bbb38aa5393cdb1b876f374583f993e233765c016e7aea413eded77d23693442b577a082f2a241851ebc81012a9a8125fb5da3c9a9f4d3ea1af78b651b28324801477cec06b91fadb6375ba678eec61e51d6c0e7a9678095d288e50eed6c2a433495c66be83bd72186e1cf73781b15cbb03c73f86daaed1830d24865e57dd5befd50b2163731420671167b26f3c7fcc71dd122a5d61091f7acedf4da7f89f8c5f2f8b652a85a5cc350a6b3026171cc1c1243de10f4c1722239e322646d18f00ddaab5fd9ca8d9e1ae71975de1a48e143eb3bd68a0a4130f56ed6c551e04f0d283599ce1821e7722b3047248e2efc7114f3158d749cea2e452f1623f3bd0f8181b6277"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (48, '{"ob": ["15151515f6eeee49892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595266c0fdab1b2aff1e3132a8147cd3512d583c10f3a60c5daa5633647fea1ef280d32425fa98e13ef8057b663f7802b5c5a5edd76a6e0e4c6135bd72ce17f9bf93ee7e62d83cd32700274a25b58aef9aa3cd70b6455226618aeab62ac1cecab70daf1cd1311872c50f893c53b056702679fec1c622d1b0323757431e8ec4e52173cd2f24a330dbcc0e759a4f92a21599751e64a961fd21ffb51f73b9ab99ab5aa94a599b1b5c53767d8d7c750a31b765e4b29fbe7ff2a3e149cbd541150ed28241512f7261f89a14837d08656e5191dbd11406a8aa4b12ebf99672587c3b7c80bd2c3bbcd57f1cf74ba486993490f91e0eb1196be7fee4dec9b08d55b3a76b2933513677576005e8b67dc17c113dbefeee43804e09203d37ff72085e57058e2ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (49, '{"ob": ["15151515f6eeee6b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957e2099813dbdaadbf23cacf963e922383097e3146aa6e7cafe25671366045c39c71fbb550034f2c462007f6101f543a9c60d3ff2edd0394bb21db25bc250df29569e6f93cd03aac0fa6027c23e76975d03cc91c3e206408e4a312ca16d1f39537eb06a29d9f92559c2ecfbebb654327c5f0781ee99f3c22dc478d1ce47b522664bf2ce10d2ecae22b3114415cc5ff8a4179b1b5d9a142ccddacf3704ad965007a190ee4a85e90579ee18af7bdace5102408f22ba39716e699be9c190b33f83dcbd0c48349404f75780b8f2c18ebf5fa102a0b62936c82b9d0370af2ee9980c61fd220e1ed9bdb946e1808c8ffa4d67420ad5f933b097ff2eca79b1c63dd7be11674c7553aa58a7e520df52b794b102d27c5bc95b23662df74d053161310f1aa0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (50, '{"ob": ["15151515f6eeee07892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bcdab7a57461d15f0a81d55e8f809eff888c751fdba1780a2c192c6d998687e3b5750ece4a8ab90e9067418f502f9f6a789e00f803412499292428fadce6e2db63abf64337ca54aa928ce6dbcaa726c11727767dde0bc036bfd8373836b9eb218664609235f4e4d27b391c7e917aedbe284c399dd179caf02c16b685d32d67dffe087fd88183bf700e397e80fa9a9aab9a77bdaefc02143cdfe81186ec404a79fdf17dbbdfc367b693f7f4711a4948e4d56d7ba40cc0fd33abedd3a0e76bce9e0dcf4f0ba2f1a6f25bfc7eaca8f3911f4e2bbafee6d14b9fc68facf07c7586db8fa6b90015d9137eb6b72e78fb01988b0eb05bdeee861877eae00374ebf424609f214c9fa1e872d9e3f06c44d5257b917cfec25c9874082867fafc9cb150cc39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (51, '{"ob": ["15151515f6eeee8f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f0617222b7b962605c3ae6b3580aece04a054e10c157b35aef6f4ec153e4c14ae6b0353924acc70fd27a3d3645bc949a007b0b94266e3ba70fa086d205cd13990f0d7103a7fb1365e48a7bb351b4408c168c367e899ac1445bf2285b31df7dc5fe23d48202f81e683cd2b52ba31b9200051c595d8d3990c92b914beac402b508c45d61630cee7b92a7edc7b60ef93c6b3d3ae1276632ee2bce5547223f42bade81a2cf437bd080fad22af97c1d38ea728f99050916dd9db5fb12e36aaf9b3a40cc7ddfb7fa37ee2de39aaa5e73d68c1dfdb2545c851f7b61fe0028759d19c12feffc37629ebb6da0e82d94f866629d4e33e9534771aa569647f4c61aff8c11c1e4c057b023c03950974ba669e9fa7c1c3bb0f328f38834bdb2f7d1385f30a4c0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (52, '{"ob": ["15151515f6eeeefa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957a5a3cb8d5fc4389b9ce1efccb0b7e15896f3088b3edd7929521a6aba447a6c4cfca0da4d6fcc4b6fd604d2b76e2ad4c7791c987a634884ba75c15787c15cc7cbb67d75dab4ae3e855a17da6c5ddc35415b7a77c90a933c5456b5f8d9d872a6c551a094580b42393ab19dffa135e654d3f6bb18ba7a8984f8cd8923e9bcdf14038e2991b19d898db43461958ff0f93192caf0bae5f69783a789ede82c52c75815b9d7197544c4e9796143fcfb9ef2ecb26f3bd3e56c9abbfc7a55304bf18e2b71a0848f76595f114ad8ff0b8248489b018477306637d4f1ef2583a035c52306e23aac9480adec1aed764c016d28cec52b5f9c4d0c8520cfa5a62e7b243dc8cad57e3bcdf1ae6d57c7708c024efbc0843150434cb232a0c2b781cdf457e466ea3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (53, '{"ob": ["15151515f6eeee61892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957f3218b541c50eaa82a25f38b0c2892d5bc400a49d6119f6ca21a3539ab001e3b973deb0eb9bbd042436e10a85d93b642dfdd2391bfe413ecdf1b966d9499a0be5db0f36748e83ebdda36dba2a08294c98953cbd32cfeb409c7c813d60860ee71e4bdb244a7ff459314b99ae140a68d55a86a59c79dee8eee87ce94e5ea4ed2d472c2aaa21b5afa2a5978d3da6c89022f3d3a219b9bdc134608e013fb8f94f0c956bb32488db2855337883a2c00bb163b29ff0dd7ddd347f299f151e0308a8dee3ccf94e3aa34d8367eb0d56510ea4b00e7ac0a23fcfecc9a419637ad0debea527bff945a50bbbd3cbc2d38016c782e5a3f8a941f26db29357371f4e3047d74ae501408c80950430af8b1151880435d53585c5bf73d606edd418d6a097d67cf4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (54, '{"ob": ["15151515f6eeee2b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459594db6fbb4e6d8e1f9f21d857ce8fbf8720e0e7723de2fa49e2641ab7406ccdc6b88dd53e0ea2cacddc48385110cbe1546470b4b77c310f5c2c2d5a5ae6545de9b8ded048797cfadc8cf4e278447e374bd937d47ce8c4b8567ca481d44ba9cbe35059ef0127709927e880dd2dbfc3802c97571af976a7fe47d61fbf7c92dc48f34996cbdad6fbb1de4390e3ae8d37c3dd274293daa4165a244e02a4bd1c57a8c89f0cba8ddc7d7ad28fc3357f65e0feebe2932775d22fe1abe0620f2d5c2d25f2c8a5b905ccc5099abb806bbd3534e7ec9ee7628e92f39c08b78293611a11f2a400487553aaba1f81eaf20183e94e8e9278ccffc7ab923a7078eff33185a4bfc871539bbe8adecd9a4668ea70db377dc776beddb624ce0e66022beeb1b11fc477"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (55, '{"ob": ["15151515f6eeee38892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956c583f61fba77f7670c28a7c0f0b56d0e5a7c80025ae9d0654022515f4bc87d74cc6c3ba62ec96c175fa8ff11f73dace64f6008883fb50c447de09405a1ca7d091b1f7f131bb2f6d76c09d6d794fe9485ae4a519be034b59878892480acc6e10965d987dde18e16d2aa31827ed9b39096393578349621c8153199d8277b1eebc6732997a9de68b19d1ae788d56a17996c19efaa3272a666af6ca59954669bde7682c793e242a718a03345bb6fc4df6366557f56d7fff0db69977e024af4115fe7d5d13e0737c7be4a2dd4c06f5db2701e633f3c566e7d6555e340b5fa8e30bd7e69517db00ff482c00e6d59613cafda7d2883deb7478fc8dcdec174abbea318041f20e90a6e17cdb3f1fb96c4c399a06ff63ea8035e4730b8c3adb115bd8de47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (56, '{"ob": ["15151515f6eeeefb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952eda00cbfdf6555abedce1ae459317e687453ca0b15f27e15a594589e993c2b6d823406e447b8604585e2e0ab4b3171aec6309287c189b9d3ce99dcd1f637b60ee1fae923ac740d4daa713fd62d042da0bd9be818970a33b24185754b7e1f709515096b3e6cb3ecb8573021b65d27fb2521062b4c509e37a022d59ac0b8528bf1747c00be8b9a12f95ff4ffd2aceabfd794c87696d7231c7c2e5eeefcca047044ba05d2ede735456418a8c1978fa20e6051b462c468fbc9bdb8667f138fcdaf90a12f5eba9ebf5790e692ffa3b75881134a10362f643ae34295fb02380d95a2da9ee63071002c0609d977382ee60aac3fc47926ada81475a4ed28b07ae420be132716d9035b36327bffc50b5226228a6e0290b4c93a669e1d8e0fa8f0e9e8cf3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (57, '{"ob": ["15151515f6eeee9c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d546608ea0bbb0bcfb0028b9f18790a7762094137e26166aeb87094d9dd167b3ddfe611409db4a964260aec46aedd6dfc1e749922065df2cf4f3492b8faf4f9be3f15d786ff2f6cda4987ac840d82720a66a8cfb3df2232f3a77568dd0e984b79765320c46d5be8b9b51121bc3c3f6c3bdc69e0c2c8e81dc6b8f0fb9c6d9a6cea7e1f36738d31335a605fc562a0fb44071b8e21aa31f432fa4b6155e85a06d8ae8c782eb169f586fa4d998bf0680d14fcaa51b8854416163f1ddca436aa52be4e6bb1bd6d683f80f7de79eb15b7da1fa6e206574ba770c2fc81ef44aa6f0c55b43fbad756e485adc0f8746f16b67f8a47c1f251c59ca5c20ea0ee4d7e4c77a827a01e72e2695fad8ede4b16dced069cee35f3ece4ba9eb2e32a9e06dbed797ad"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (58, '{"ob": ["15151515f6eeee66892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dff6187965d4d68875b2cd5b7366699db5678bab70f4ff324d0d0c35b39d831bff50ae979bb272018b91920a9fae5d6855574d879f4c77e769769d87b001ef9b21767fcc7504206ee57b360d43bf77a0ff2f5d3a974e542c1e2693bc09d8df95550667b3fde5108d604c61729fe91817885a822307cf322c3178bee4bf8e7e5fede9a89a4d919eb8cd7d7fc059a818b4ff2a1505c965e2dc5de0116453db2c5fc90858fe88ec0bba6b77d7401a3977bd27c4bba77f8f733be053ccf39ec0691d4465e2fd00f425849d63ddffc11c0704879318e2c52bbe95efb2bf1d4155b49a50a96422338ee3e69a70834700b74f9324c9d741a4ce37da559c5563407fe2ecaa0158817d633374e6303402d6ffe365d5d3d162d008ad6d83e7f556d4a51d32"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (59, '{"ob": ["15151515f6eeeee9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956e7ad0f7c5d490e046078c456d8f35d2e4c5722ff29a0b9949161f165a73d5a78869794b42dfa1b669c6e3c1e3d97b2c165d2eedab9d8f8bf9e8b83091c88152bd7ed427e79778828d0c444aad2ba88ab89a3fd45bf853d0de69118c3589fff21cd9382b7520af2d70510ba8a888628cf98040e9c3173c4367a346780ef4122f6cc71f45594a4d6c3b1227428605e75111a69be3c7691ffa00707e0d1242fc10620fa36f4a8d2a294a27f12beac6b98f2503da59d4d3a9cfe7a80f99002d9d91b3ef9ec54817870b60d5ffe9bc5bcb6d8a12f804ba6a96fe052f3ad910db917d73fa793393f5bc9285ec55f29a9cae76989c2d462e2920ae0b6da8b1aa02cb20bb56608a7faaa8c46a09272407558b03848fa3174e3a6a8e3978742269414fbf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (60, '{"ob": ["15151515f6eeee7d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459502fa92ac8aad6056b0b178926ce1b5542d2e3fd4a9f8c3ef3cfd2d79699a357c113d1931fc08ebcd596ac4c899615d65509e7110cc7725df5f76755aedddad59cbde33439f36e55378df7688285e889f56b98793314dbd859a3228e9167b8c3b899a13a26785649d5cab269aea2288edae1880d9259b5c026fdfd81de66a7593eb5906fa134d14bdd78343ee0eae23ba38e3b1318c020082f7e596aca4c19688dc550a42d6da878fd718b2d88d6241a2d0bdf870dd87da45e7107465563f261e9aa9d81bfd0ef462084d4e74d0006fb5909d7288551375d3a766166d937819988d358c65a2ba0b6e44c29556d69bfeb3f284f5184c32782b7d5b2138b969f42769f5b45296982d8b2aa6360b196962abd23f9cd31c619f70e7c4b9b7d515c24e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (61, '{"ob": ["15151515f6eeeebb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595824e7eeec148c02ddab8f20c77e96fa8a49c35811d7850f21bc6bcdbf0afea4501f41e0ccd0f7181254701cf2a5b4f201777e80c27ab0ac15408b7336dba2a9a184fc7b9a34566a0ef2a4417778e76864ff49fc617d7ec89ef62abec72de40310eb176bf5f116a4018aee51e8a718d1e259e5f02c1ae3653db7f70ab7a0ed973ca6f5099035c731e2862c1f0842a0d3451687302ffc1a6f32c5685757fc05ca2c8122a56f54bd1cfd02902039b5967e4254bb13973e39d118dfd843e2d44a3e8991b16c9b0ea216622d697443880dee13d172d43d9a54d7785622d7f0fad01d4942f9d04023b18f7c8ef13c3549136551bce8e2f1aef67bb30e9cccf5fccc0da10c51884745d6401643e8ae64dd6e82c520d07bc92e203d5a61c501b5897948c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (62, '{"ob": ["15151515f6eeee1f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d9feec78cb5dec95e703717c287ab051b5f9cd7e9c27f2d5c23b3e4ed07a5ae58b6b47a4db082566b94501ec4d819e2ffdf98afc592089e985d0bcd902adbf5a3690f5122a411dc11dfb804893e37ae8e8e6c06ab09db9a7459eb5d564269239b0a0387ddef656a74164286bbd0e9e11e62df6ef15ac399a529069f20f9358c1d8087a5a120e79a2c5b6f8232786a2110419b5b5999554d91dc89c35f25f33297ad14435f850ece1b77a3d9dd51d8ebad10edaf2e9436b8bb475feea814551cb2d8edb654ce045790943ca8202dea6c0f49cd9fccf40c7272c3593438a8659120559164a256a48972a00ba9e0346390f3804bef3b841946e90e99dd9d48f233156efb90475c28db5f7318384bf19d72eb29a6722557f7df50cb54ac95593bf9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (63, '{"ob": ["15151515f6eeee3b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f3456e9edeccb3bd2494072e9a394efa5d1675b4dc87835421bafc42be553b7970b8547b63334b067125b44788a11ae0b1b3daf7843a24d0cf603d8352cc262f277bde192d09f027cf7318e64ddcbd66b47d5b30c44ff13a570748a90a34fa3657bb865e1d092961e4e020d547dfc00c06272394a36b27a17bbd0b44e14531e804663452455f5d9f2c396f9a9c6c409976d450ce45c7a9381167ca6ef56175ad655d16d51f677ad5eb2e0347fbe907bbe21d41b2610fca8b5e7c12790f8535c7eb40a3c8490f64339ed16d136de1afc5109a3b773722183054cb2868f8c7e380c87c6daf8b39179a85938d3fe46b381696d16ce54685542aa2cfdb2f2c3e3dcb618018174ae28329df73b978b5c70d9d94e21d61d30b3eed5b972f3ec89ea080"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (64, '{"ob": ["15151515f6eeee5b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595539c9677b67d4aa02ae951fc8e4ce72be074b45662fcd8b2fb87a0ac3ef29b2e5045fe0f5a1c49da16639f518d427a0d0c02c5f67df822e4a5c1e19dab79a1a753a395c4b6cd4c16e9c82ec8ce597ef293e53b5fbac7af66be8bf918c9963750cec6d5af42400006019054f46339f9c5b85004270945a7e36eb28760b1e6d23d861a47c7910ae79294736bd7711f322c405d10b342afa2bf25080c9169af0a6ca6602426875d948feefe67bc3afeedf7ac21bbd0792e1dc5b287a8847ce98a1f3f4e4291d7a7d33cc5f8d81da2c6d42f1f4bd797e19a8c42d9478d7eeb207ebdd621b7b75e39b6fcf4222c4138df523ec28139ba0231ebe79234cee024303ee2d1fb4349ff42d48e115ab6ba9cf29419ce38accc5462e1e554016c4c7ef4a4b5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (65, '{"ob": ["15151515f6eeeed7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952407754dfdb014cd2476e7adac8296d1b3e9907e897c939d749f54fb869085d6e33b05ca3e96ad17196de22d844626bf827983e1d08b530b693eb13be363f54373a14287daca7bddb1ffc9aec8b1197390e7ee5fda2f7c5057daf40817591f83f47c1f1ccf265f93e98a921361f6d0bd70c028993f8701a33c7d7bb08605a8569aaeccdef076032bf8fcf796f3381b8c8e68bb595f486f3014bb32fd2d41119d788b6ade5da639777f4f0a04aae173c52dca0e05809c5f357b7a9d804ff7062a0faeedaa339f29870d2e135e6a6058780fc9edc55a7583f1a248850ebd0cce6a81773c9e32ecae8d493b85b6c2cb9cbd8020515650bdb7d73c1ac98fc6892fcb8158158cc1ba49d1aa3a50c24a1ccf72ded2d8232a9a1ec9c648c4ded8dbcfe0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (66, '{"ob": ["15151515f6eeee46892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45950c41e5ad049306489d47c41ed2767ad4085092b8d42d002684ef07888a7a157fe0a3c50771b78887fe04a8e9d316639fa5fd791d8473e4e66560e83a6b230d2af0d6c3d128b15ee4ba0acd1fa739ee225fecd2e51fe52b45e9029992f5f6c574a7e9f14b603419a3bc4f0605a0e1ad5084e66495aabdf593e5843622e5970af2556e94fcefcf5859a10d4460c54202b9c946f7d65d1cb96e1cd03764f9198d8192cc784b1914c5952dea098a677554c1592422ea1bb268430e9f0491c8d5667019657c396412b7b833fcbae208a70c5b8f5b5f0a718404c931c3920d5e93b61666315752329b1138a7d6c8b2c486cb91bf746e1ac099372673d9c92672b80d9fc631555ac5c0b927406623fe7310d1d8a5be8080cadf1a53fdd21e29c8489af9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (67, '{"ob": ["15151515f6eeee16892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953df430892afda958d4aed7f37c972731e69e69daa46d9b13384265a5b7a275913438e2bd98c524f5d8a5d2ca69640212f1977a731a300087084aa0a5ef9bc2097f95fecd68e125dd2d9c3323377531620454f9a9d3ed66cc35213e6d51d7034d9e4b615ed11268481ad730dd2c85310145aa85c64a95293fdbc79e10cde84831e9c7e70a727f0403d378d66e0ae95caf903988429c49fb3492a9848b96e84ee4ca3b81220c40000b6996de6fbed4ac92292228f685c90d7770793471e20a63d26dab5f256742af0423ecd20ffad40521a5c013b7ab053553623e4b9e3773f9d950c80046e17558199bbbd63f8993fbadc5a10681fa4ca616aeb9caa28286aba089b4c2d03d52835a7993255982b0a494e6ad405bb68bc228350839675b0dd94f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (68, '{"ob": ["15151515f6eeee7e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b0af0621029aea45654cd6d68875e4ebbaa7734b16ac661dbb8da3ac779102e15cdcf5bfe19bc98bff15de0c61c6fad40fe536814c007afa96fd1dec3109dc1b041f2495532a813bd33f71ded5dc56575cb9ebfbd6de5a587ffca74328ec458e5d0426a4e511216324723215ac184688348a5f65b9a485327565971cc859b2b99df8827381f4e5eb280987e50945996a66f3fbe29e1441eab412a204dc4917c4dcca50dd1ec8cadfeea4c1165dfb63679d93fd70d5645a5b817d83597d12835a59127ffc135d5e8d17ff890b9e1980c9377efb2c965c86f289fcff9733b2e1414d38403aa6ca43a227797a831cf1d9250a74608909a8b268fc94f8879652e2919b0c14a324774b7c1202f7127fe9785af91d9958a3c203f250bd3ccc35311a97"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (69, '{"ob": ["15151515f6eeeefe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459564fd95cbf63d4794b1292be9469ec3e2ac3efef8f109977a33793ec9e58f263c7283861d42edd20139518fc3eb7350308a736a2000ebad3bdf31eac44c43f5f9eca6a5053628a1b093dfc3d20e299d9e41c1b0f1f3e995ae0284f55d51d52e8addf71530e3e42dc68022d2af36ef4b6491da30cfa4008d56cfa2c010237aae357c006e6e54b2a17ce86934843f7c53806a624aa87f3790784a5413aa4ec6cac6f151597ba9763186e238a047ae75d4fe00be2b46673eeb15c4ba25859c9521817459d2a34adcdc3e1393f5c54d545489075fe38aa9a5f87b9c8db99d5890b9319f78bd228db9d47c670dd3d74748a1ade16f8e4976bcf940dfda8debee0b8cd6ccab0a1d0f68339034aea50689ab798b68df5e241cee02bef94d7401cf937392"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (70, '{"ob": ["15151515f6eeee17892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956f2073e234b7955cce71718ce298ff36ecbe15d075fceb270c6cdf24b38f3877350ac07d113828ed9cc03b8a728c3bcc2f3ddfcfda5af24e626e7f83bd4cb71a6047448cf666581ae644a7abf9b34e690f2861d891abd7af9dff22d3e733db763df978b3a2070fb64e6af752386bbd5ea60abe302609d2b629847e8180ef9726da79b16b7117b324e4c65ac85fa645f8cf88773724dabc4d167af887a457c83535271ac2d11f4c932ac4ae3c3d568a50cb1beeb8e75bedfb3c5e5f5debe439f3bd12b6288fcb298eedc01e330881c60702362e504636435f033b7f8dd1c76b31a1e698787fef87a8febb63937db0130cb0112192ee5444f5ea3e139e7524dce6a1861ac9d77cc8bc55eb338c9a83558819d25d0e46ff155350942ea683ee1b34"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (71, '{"ob": ["15151515f6eeeeb9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955914e6242a8c14203016faa4704c02124c8c2628dd5e0f0a51fb3df82cf3e3dec81b2bf6f295423462b523d155a37ee55791552bdff6758b57e7348374270d92557153b9c42e96f7d2733f46b37ea0bf1630c8e4ff7cc3c3fbd7a30fd3cd88c49068411ee2f537b196543533cfa1c64ab62fd4dd906f6d484a1cff62ed760d30ea1c2cb908b7f986953670247ad54c114b94a9321ff536a172bc676b6aeb80fb8cfc54ba357d4e1d1c60f8a9eeb2ab78c16be5ce449fb19dc314cd487ffd9c4dda73b53529474d9c9dadf459091077fc698ccc2febadbc828ba9d40101b188a76c2da2bb2e0a18d96877f68007fb607ce64a2585922a98bbabaa33c33e2463a8955a39e88d1c7f2ec543fc6e2700ffd326970c3c4ac478fa5185b97f9e7fc867"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (72, '{"ob": ["15151515f6eeee6a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595149534d2ac2821f00b75d0b46a1fa2c4d97e384c64abd715b5340f80f1fbd2cd315067102239874bc75c9a269a00c3d64674e936076c8a2439b626018fcc1e2faaff2e2244780c2a2992cc6adb5a14dd4c6bf1f01789a96f56bc6e4564df2970faf4a81670f9aaf21dcd2a9e3c6efb193b82d6ebe472c81b54cc697997dc714983fa56b3dc879b6fe4a6094a7ccc948357e3b2338ad3fb55c6bc46d29b4487ebbbc7013e16ede9a47c3aff783143fbf2067e706d975c6df1b420bdd86dedf7c3adaf66a17b432c31142f72f59be499fe96ef519deb5dc2708b653b52182149a3ab2ca796109c54ff07d4501225aa1654bd7125f774eaccdce1eac0199294e44a0ba33a42484b334d3a4a6cb581cdd7d04e68ff5d4495353e6c52d3f53087b4fc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (73, '{"ob": ["15151515f6eeee41892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f192ed84001d77bb3f9a0f8768044326ffbd96e4bffc328637fbf83b6a29241d58707b506d6d49d0c2654b5cbb55f2dd0d050940a8079ed2bf4d4f75d807091d7307df2da60f1dbd2a37973caec61e79108d81b1bc0b245b4c1fef01d959dfc1aba1d73f715a03be8475a79d48c5aaa9860d7f5ecacaea0aa2140b23f2f6234b862f31f1b83427528a224f8511c11ec838a1d13b4c20f61fc084c7f22dc4e67c712670dca008ce442ca70d0bdcab2e2a9984bae9542fddbee275ed2cac9277828e238004186acc9f89c615fab45432a17216921475ceee3d218ceb135101065fa55a5930351c49f3fd1139c999d4cf1f8ccaffb5ea1a40e4b0bac0ebba27d28b9c6cc6fe53f31642a9d6977aaa642ff81e7147af297c701653a54cb4d84fc70e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (74, '{"ob": ["15151515f6eeee96892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d25cfedc1caa671967f1370d2aeb5606fce6b6f8ceeef6840b50c68c6f3873b5345d435adcc84ad229171d35e3961a26ca599b479f95bfbb2fd4ff7c8031911ab5d02f24b6388fd75588a281b22634eeaeda20fceb886568e53bd6ba4ab6f3b646150c78959c53b8ae5380e00f5abcb85413b591233365815166096fdecf6eb58c71571694697f4a350d050ae155f332384799062cab94dfb41b02208bb8cd4b2c3b531fcf916c8dd0daba599497a4c78613d74059ff50b69750521f2bdc9dfd87b0c64e02955a6697379e18d4c49a6e3411c76ecdc597cf6802483a8fe830891b7e558da881440ca799006a9e08f6030a57cd44133cf31273bfbfabc47485267360c4c09d50c6ee50e37f721391d37dbbef49a54b8334a85b4a08b27d6c72bb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (75, '{"ob": ["15151515f6eeee71892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459569f17f2e14dc4c409b646a100d5e6e82ec7dc075f34877caff98b9190dc065d77a8f3e393988aeb92c210270befd47c3c0a69ffa6ac1903d3df371c9e3e930cdfdbb0bf0dbfd049a45a884a94ef89e82bf54e2f4bdbb31527fdb5cf1f778f9621554afcda3f93ff973375b32c9e59a3a65ce2c0ccd507944cee910c787e33bcbc61bcff058e61da1e71a4cc59d2e690493f6ded4211b051b95eb1475a42a0539e93aa1feaefbf314df0656f718d282e2f0bfdb61a6642469ad3628623abf72e2990657c4843cb1d46bd7b8280915fc6a4f4f297ca60678e5a01a6c2318870d04360323afa272fb8134c6c22e1eeac2334e58f6c8eea6ecd50f5e36eec23a68c3f67fc328bc2bbd004eb40f8882f60d678aa106034decef4eb80edc6c0d29607d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (76, '{"ob": ["15151515f6eeeeec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459570ec8169f1afeb287b33fcc648205802b3622ec94c76e138352e67e580e53a5ef28d95487664a5ec76331a91c9ce8f4595d000e1887a045061976d4bf709f6f70ede7747db88e59e037b9bb68486fbbafbd85cb4ecc168bee5e1d3893b46a4d179e92aeabc0004015d905753aef5c6c664c81f67635b90cfe3ac8f9671a2f97e51cfccb6956da679c987adac747944a830c7f223c7e2daa77c02e434616622dcc1187e10cc7d448699464da055842943636534ec3567a5f06bad8550822f695957bc298fea8b62fed2c2104f4cf1d8eb4a02082fab31397d28d5e69b57c8df8f150119cb6636170edf4e56660da214eca158d4d6a591b733832bd9875feb422da92ea5507efd0d6edf96e69866e1b6535851a134dc1f4d3aee49c3b397c1cfc4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (77, '{"ob": ["15151515f6eeee4b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e90730dfb42dc76a63f84093cb4b6c701df93ae1c8631226d0fd740f5a504603d3a2ba8bf81c3157f8fd9aceeb53af3364fa1dcbae2febc147f2f3e3f6fc7127b3b14ab762964bf7207b3480b6fcc9159808f034ee08184daea6da269cd6ca8a8364dbd9dd09ac1732bd508346c163085a407550081f3123f8e75b14f5bbce0fe66ce8566045ebccb1285af3e70d381a177ca9c14f52d39097cff12915be66d7e0fc3c7953db439efcc7eb650030093af81b9a0211c2ebb7310feaf85f257ac55d91356a270e6f13ded85510cb02388d103aa2926dcbbcd9a6b91dbd9fc4e9335cd1edbf2e788e51678e232d86871b84d4e769ca1a02769ece5325c1d6170d76cab87e65221dbf2a89407c4b3ae8e76fe06638182aafceaedf1929cce40d6111"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (78, '{"ob": ["15151515f6eeee5f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459512dd6bd96dab0386ce8c1be77c58478c4e6ed285e143cae4195d5d6361d2ab2a43e1d617954324d7d659e9995b077b989b4969b31dc050d8d8dc3fcda41e8e17ab82dd8f6c148daa39290415fb03bb9983ad0c33e1036f67b78b6c69c667881af6d2adc1e1b5ee96b216afa84711000043a3238ceabfaabe30003fc1d253671976eb955cf698fe54253ca5ada6e7ab54d1e14094ba53b43bf1dd0f1308a19e1e4e05ce82f70e2a5459f71c09a9f9084f79748c2849d6cd93bf53c6822fbda8965da88f1e4a94a85b040826690f700028fe142348925e6c85c3f10034aabe262d5c3a37577924bbe0b0939197c437f824cd19d2192ec24606d78fd008662b45c374fb37e3657f1644534c9fc9485f78f7a063250915cd6cb6af51989223af135c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (79, '{"ob": ["15151515f6eeee1b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d15f0f4178a1a9686754c47e33ef90e24d13e0be3810b1c705fef03e2eb7bb94f97e30b71c90645dc813533364007a5aa8a5396f4431b9dd926a30dafe6bece6a41470ac264664637e5f168f079d88dd2bb5a909ac4b8cc95b65884b573dc3d910358bfef8a13c9ab7d709838f302587469bfa3ac40055f540d9b3b6239b76a25bdd5ba392bc76191d2bad272cb3dc971a4187e8a4ff616e2b648f193979d08404b81e21b29221356726e293b2b43a8f6c620f50cd101468bce4f848f39588b14bfd437f5262cda55ae795231f60816141ccea02325e7703408a05ac405df708490ed8d6b2f3b12a3f137a74739ea3c3f400f816d882213e624f70ac853dbcf0ad9e33a52c86495d2d3d132b05fbe5e4e1ca477131215f784483f0326b9431a8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (80, '{"ob": ["15151515f6eeee9a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595aa34fe0a2ff2e20b0d44f5fb0555c450f6b3b9b538e16ead91afb29e01956d1fc55b6aef754bed13a34007f6c62c9c1894e547193a440affcdd1369b09996dcc71333d129a8de333a0d6f8776287d223cc9dfa8d80f9c90f88a24dac19f4209fe2ea548002fc24de6a4abec6cc1d1f25de9ebcbe2eaa652f3d6bb06365503fd4f6de60a98de39e1204aee693526ddf7db75999400a85dc2e7720b3a6a079968a3e3afd87501d8b506e9e1ec9f4d4d33a05e3a6c8211b934dfd41efc687ac18eac2f61beffe0bcced26fb0da4e91ea459552af4ed3ac6c1359867e2aa12119961ee6bf250c53466ab15a5b13f71de2fb1a0558df86ab0b13439c0e3c46293fb7f519d5030ec2a02a7dd74b2efefe7a264d6fc6da41a25461751b0dcef02c21891"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (81, '{"ob": ["15151515f6eeee93892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dc36bbef52baaf33e3f15fe37b487194b66d586e72d4062adc36516741eed5908bd3d188f0e08e46fcc64c5d2a3f177959b3d0774781cb326a9462d486971b9a0b6f2499889f283bfd2f4c97f1ddb5363a9998e733e7e90f571be4bc80a08c09e17e081c1df9815007e32d651f312a1d3468d4a91f17f640a2c324233cd259cd1ca8e84b9c6f0869fae4fe6b4bf1adaa8435c71b538ee8e68e1cf2e6d5757a4187ae5f46ff700c7012c308211c3660288101cc41f3b730728658fcb57251d5fbb08923a665436637c3ab732f2428a11f886af00eab773edb7b722d36881b62d2a8b2484178ae6277c5b88192fd54822eb38bdae5506702c215386305458f05501985df240f69302a0465dc72cc271dd5681dcff6caaae47a8935888f5f7750ed"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (82, '{"ob": ["15151515f6eeeeb3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f028fd2321a43241a78f42dc50512bedb8f00db30626556225923df6e864c932b7b0db3a7419784a89ba1f13d244f262e05fdbc82551d345a4cd2ecec158c54e62f80420445d75969c45620ea3eeff627ba9afd0b9a4b9c9a029c04d4b90f0f7a0e7b918524808fe0883faaa07a49feec0170bd3d66cfdb565074d78ff65887444852c044d523e285ed652b7d7590103ae17ce72c64e187124a4f73e171d5b8934da91a937972fb6973488bf0b272d5811940850567b303591258c4a31049d39e80f10219514cc42e7161ea445261c285cc29eec7ae024f994fd9704b4d20161ab6a01499469be7d628a4e5abbfb17149e23b5abb56b855251226eb8f8cbcddc0b6a8bc89224779b44df661f31ae6754a4324fd73714519f734f652840e6b106"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (83, '{"ob": ["15151515f6eeee02892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459535d3f4ea74595b8a9d649cba1cb1c61d86e11f08d6707924a69db8e557bd5615c9c95b265db7ef2d291c7829cea9c47fbe4972e245d2d7a7744d10a46b314b5b31e3fbbc5f606b0d060e99e81711b6937584d32ec6e13fa025c545885c2d1dd82617477b53149abd9c0d1c2017ea3a407bff59af89f5dad130313bd04a5a75fab1bdef15db95e7c819163ebeef8d8449de45526b0e58e646c0264fb420b0c456746f1a7af261c32fb81ca51de3ed2f651f30c1eddba66cb215d474c4e7555abdcc97629826df8ce98fee7ad89791904ed0bc1b6fbba0ee93882729f858067740c768fb83924c29278ef8a25aa3d3ff5192bd2664cfad2edca89465ed9053b243de1ededea227730bd363947d19f5140ddf474c383cc68df0c19de0ca9560ec1e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (84, '{"ob": ["15151515f6eeeef4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a0435ed3879023590fee69b1ca553b37aa9570c41cc23c006dbb73ec6fe574223c4540cc7d82fbeb193bc918d624d0231dacb18c43a01cbb2d2a18897514193339869b98061fee89dca1d32ecb7e06ecb9a6bf92826d8cef2e77af48f8d49cf06de7c20bb0520dc9bc4a6792044a240a25f77bf95e81117121d4e6c8b26ae6ac9d53975fbce0d2a5e32d84e30969706e8d4c5a80ba968927e0b150a5de52f6fb43f71099c9e927218c73aa83df4b3e55750a282b8c16a1d0d560c631ffc4e1f55326491ea1b40cb30eeb4e170c385c2bd4484b6e108798a801c3aaa0da01907512e8a19f60a9bfd43177ddf3099da3887fa5e8e3654a1095f585f36c6a88634040468ab83b46033950f9b74fa461f0bfb5e290a53b27d1792d60c5257603d00d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (85, '{"ob": ["15151515f6eeee90892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d072b2702b2fff614208a34d678eee33d126c6bd104770c5650f9172b96d5bf40eee0d93a9ee04e49ed0bd6d6e2f1d3fde7e2062b48fe5a4e1a2a7cb5b9a87ea4f9794c49d8cd18b6c65392aa49e663f15165a8a3e490c4518f9172bd796dd791d971ce2c8df6e0f17c66632decfd68b4f8f5cc2fa686d620c347b2859f4c3b8aa9cfedd1ae91e7b5d2cafea6141fbe33c14e56e81cf8146e0df9c8e84701eca4b8c908e5b05d59af6a76eec3a63c9baf4c84cb1020f2bdbb25b2ce3329b1512508400a6c235bfd46160db678514f2ea951c0d03dbefcb59e380879c71187991d8d1d5b3c48181260b5c6fbd80e4f899b0b3f50105b6b382d67551c4afe5d9be740d970e6502769023b6a7a59ba144e3515018c9634b96483b8c51ce01a514f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (86, '{"ob": ["15151515f6eeeed0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595626171e8b7c68cce54a20a00b7c6eb10fc9638d091e309874d7084b771d9d0c4fe5a571465e056a7f4ccde5d9264c9c35cb346d206aaae3e44023e1a82b28b00421a13cdcfbcbfed9e6da09231159328ea221f7a9ecb8d5eaf7ce5b7e2fe6fe982e5291150111b8fd0589ef0b4f3ce30058d4c9683050fa332718373e3b05f8c9545cd688a50f6716d569a770993401717ed641062972596ec52119824026241109e0b041321e83d8401274a2b52e520279311d5465d6eeb828cd06d31754bdaf9fa79c2333088f31e586d456c6747ba8c7b7f870b19203736ce5ee93ea0fc1b751d0c9ffe0812bef536aa61c968365fc55f45de0f41b1ea68935d81ec3952ecd19efe57e07f16507e382a9006eaffd2e80d17bc16dd12a731869c9abac1a843"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (87, '{"ob": ["15151515f6eeeea9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459523dec75503ffcfb0bbf3cb15348eab1d45e9fe83c16c5fbbaac297c94d0f20bda2392460258919453b98d8c9d3ac7acf21c59492054716c96eebb18fc4dbf0e78c225f2ac6c3d5e240bbeb5bb7cc396d1a3c5ec2e122250431b10b46c9c696b8379989968ec99249734a786144422383084f3ef36502b22bc0c5f3114cc2bcaf58dd07550082b6cbe3106c035b806c04460fd4757effd28a4a28446c2ff4364593ca2b1251510b082a179db40425e8085e4b3de8baf13d42a103953f6ebdd1a956f7b1e3be01d839fd86ae10c604cbcb94a492beea0b935f713857f1d7ef23afd5b1a76ad008d296751d759d0438a7628e2a7bae720368659b00c056da5f174ea600f1c9dd2c5f5d43a7324352fb1de49c750ce67f57aae3aec4484e7a7a6b69"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (88, '{"ob": ["15151515f6eeee3d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954e2147f065aabdfb25a711f4dd0bb7ca049ea3f9b278084e68d6c55bb83473dbbb4b02f84d3c2c224935e303bd82ad33c29f6524d2cc379ea3f996983b8fb24065a18ede3e792a294ae8b6bf2f9d5358d29ef7493ed620e0c98687224c66537a98ee241a1b507b892752c38051d96a85d1862c8e89a8e09d8317f843c65c900a7271864239d37e2a903aae84ebe4e675b37596986a248ecfdbfc8595e0f4bcf7f1856b18a64c47d826aacf1ed4a716b7b0266a6001381576069c6eee9a3148d301e02f8c9a3e1a7ad5b05c867c9a4137d277afd9014a6806610dabdd4ba4795cbcd934653d1b157ff3340ce0ec330334eaa20d03f9371741b8e6c1751963e10cf822ad986bd2d9f4c133f2047937906c27d18f174b86df3f8fcb2a7a09585e36"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (89, '{"ob": ["15151515f6eeeeb4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595115eec4445d6dc6d0b29274da639301eb30b23bcd756087e90759ee79b51c00ed58941d737d0476448ea1d10ee4959cfbf0eaea3407063c1281721ab38aee0accf18e0fbac8a4098e1e8138e5e4f024110780d6258a956ed96dd24b24cfc05d386d2113a9df491f42103412af1a64ac2dea164381f8ddae3257b8cf3a5c69966e52c5e04143f271dec8e2bc35e00878edb0f60bc9e8c975eba6d1b54e8212a822fb6b39086938b6899b2d6af881d8c17d0faffb20b5c9486506c1597cb4a6d101e532d14cef7ec37da0e62a093d375943870284301f936fda5e1653313309cb50eb38820af50a02291184f8b0e5bc7ee1236fbeacbdd673651af7c4e7dadaec545602bfe0cca1fdfa70ea7ff04ea3434538b86bdb927c0fc1e223e4eb292d39c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (90, '{"ob": ["15151515f6eeeeb5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459599df1a64e60c5f1c171a18876ead141fd44f3709394778e3788df549b576537dd6d299b3b8203ce748fbbedd8624dfb948dd2807e404b5c3ee2f8effba164fd556a897be3d96bde963cc0792737544c009e03b53d9d67ab0edee998ec518e27627f3825ec4a26cbbd110d4c2b1052fd565e93d0faee90c7bcdf498b954e0ddb16159f28b9cbb07ff1f6c2fcff058309609d12630ddb04e64fa6838c054e15682d56ef303a47c52bfbbcaff4f27dc642e91cecc69a9b8d832d3a1e20f047b799e226bed5fd8d0274fe5f00011349ef6cc549f2fef309463bc7ea6d2d42e0c56b76ef60ba23405cb44cb7030e06c5b3d6adff46957f3e2b1dc109a873a2bd0730a8c0680c0a95ef623589fc53e9152d71f1a037a5aecd47b3d645fa8a82a28f9e7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (91, '{"ob": ["15151515f6eeeed8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459531704a5a14d7bfdc2dd903166e72346fc8e1baeb039760132f444c999a060d45a1df850c37237098557bdff8eb13ca1298ab4f5c72a7b337bda6871a346f0e3ecf36df66c70bbfa7514cd847eea9ec5897fdcdad933fce803808f6b96f2c0cdfdfc16bb49b53ce94d36f64e4fc4b821e2776a07dbd5d15d6714a4a742e2ab74e26b3b9b2fb185661aeb8b23e13a65940a9ce8a39c3c4026b5f643480beb2141fc46e8c7aa1d0d7f1742ec1c57e5d1deed6a942e60a4ef6e218cfb3d0b4fcdfcd4655aebb8e487a987b70ecc7b91182db62d67e9e3c7a6214ac469aea5643fa5e74b296753ebaca5d699a4bc28e1f13d75ab7c95832fcb1d14f01111211673afa31b8fb65304144fbdfee04c21026ded4878055778b84f4ad6cb5dfd84d90c4a2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (92, '{"ob": ["15151515f6eeee50892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595386eaa1933499cbac6cdb139a7c34b2fddb131bcde10e0cc4145b64a658933de8438d63fa4b017398cbb7c70873f9da6f1d0b825546b802f34e943efac3d911c7ffc06dbba2fc4b3871c34fb27528026c8da24701d2e8030fb63f8281a68b671932ed566ab0055bd3c61519929987f790df4924dfd9ed64776c4de85d2bfab0232fa18c165fc17bfbe247cd1e53628e7b8e6e7d6a035091f58302b8778194553bf37766dcce9328dbbcc7fb03a235d9a7e69d80e557290b499224147c653ca5ba40071c60b7828772c35d6c72d3836c7c72ab39fbaf135e09c674841861872b07ac8f92b87f891161ee6df7d43a4b4694b25742cccf77b80df85a1e13b215a5a7ccb018eaa1e1f990d6ba75f016e2e5f04faf98400e09ccb60c1672641c06741"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (93, '{"ob": ["15151515f6eeeea3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954542bcfa2b5106537310bd19a160238e17505529e4cf73389bb5b6c6b025f9c8b7ab187de21432fb04334e5a0e86795982be61780921dcacb560cd5a41c595fb80b95746b11a66fc2d01d76a869ce620acd5394f2ac2a3bddfd46e8c5d8e22c0a6e044777a05f3155b860d85b19a611458610b0b0b9a1248d210060782bb6f4b08e07770253c5a41fd90c22a18353e2f1443de6a3a927851d82cebce8ad6234345f04be92fcea12ddb3f544dd94a092b5b455cef21dcbe521f1f7087310930bf3d7f84fdedab176017bceea4068b7b980a3f1575eee46d40ecd29c624f9c4a32d0e2151c55d5905553a59483f15ecf6f282bec5708b376e1bb05d17a1a3920837021fa0e6b2a86b46d8adf4f9e76622bbafdfcd929a043a3922e05a870e9e555"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (94, '{"ob": ["15151515f6eeee88892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952b3854bb3a1fb0e04ddf49381d0a29ea60508d326402a93eb7060fa1b6ceae0d1a07829329339620abf3b41ddacd2af94d1a237b9d58ffc4cd04f9a4d4ae0d8838c3ab04600fa954f72d26ba5967d141e05ac776cd7d99101862f6011cc60da440bd99dfbaaf1ab721995a3738a5b3bf6578374518b71386237559f5b2ac3b4fad2ba66a8c5de093c93e678762ceb71c37f12cb102f893a1afd7f6e75987e4b1cac634dd0fa8b38b6b8ff89b504fb636a960036d875af35ce3e7146517191781eb651a2686842a79f48cae968dfeff7c6edf2b785e703d006e54213eeae15c8cd7e4174fa37cabbe39da2ab3792341571ed2c108d6e5606847a666f639dcb7a518b298f00ed3b17950e1943674257e4e870a315f8b18130532eb275339872289"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (95, '{"ob": ["15151515f6eeee8e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956119e4d49591e2b3d16c328be300ea2c73c2ce2569d9cf7d2c3f4fcab2e62667e8994bebe0f61416ff3a311f615b6cd0729047b181b43470b532efedec2d7ef6eb494913e9b6e5768bd95a7b30ff6c8d0d7cb8ec64cda1030684fc56e7419e046f8dc52d5e7115963f6a8e2642af931df73798f07f0d78bfbbc1706257c1020ff7dda9b3103bdf7378bd633b95f84d9e3bde531517066e9cc14588e4688d143236b08360bed20bf18b1bf50ec688b5500524046431397dc422a79b677b9e9a394627c8f3f4ec44b5612bf65a291c025559c4263f038f8ac9579da92aa79966af00a8ef8354c9299d7f2004789d69f929a6741103ea875e1ba3515b47d5e36b52d37e48d890c1d0e612b2ffe3b142b32d1ec8bce6195d6fba7b1e48dd405ed8a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (96, '{"ob": ["15151515f6eeee8d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c75f7bd640da984b8786b98792075c4f7fa55b0ef9e1e15f0dd16d030e1b91863f501037a3d71bd5839752b44b04ec2e076a11db575aca50bdc92293fee999df6f396a3446c6e18fad2f9aa58e41b3cd7cdffcf8f2b094ac4d023431c96ecef0e6cf6e969de7d643a1a439700b210020808a6e5dcc71e951a6e1026a55d3d4fcd34847274c6467604656fa8e821003ec43bdd1b5ba91123902aa5e912a9f5ad8fb85520f618a214a6688053010d0defe12aa869f2b69649c124a9bf3fe8cf7479499ce0c6098111164ff3e4884bdc67465763fba92e0ce340de3a2189db7b7afc77a6afe324bd3f215503cfbcf694b2018ee09030358b759ed3d8fe8c8975f55620426ad7ccf7135ec018e3c92f6532d70a50216aad58955e52e5237bf0880f5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (97, '{"ob": ["15151515f6eeee53892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459570f23cbc00d0426fdc6ff07e4990e7a2bc88f90d60edec4e00de1f9897fbdb8363caee11279d37860739c003732f6110a65b6141b80cb24fddd2f7f5ad77837e953f142f05bce717a20ac8a044a88b3518518ac50f3f52a8b451eb78111d3f1e41fd4c8265912e9124e39081b2f13e586fbbc21f39f662ff072f9ed618e4d26a7d271b6064ca20659d6b449837f5c385464cfb3bb632440edc82f36beb799b80f2b6cd2679d939c6081d1205b1de90c51246c09c7410d3deeadeea2aea63b0e51c2cfad71505081a7f42cc0553e2d528cc55f00b652c3bea51091a2fcbbfe86aaa6ae49ba4643dd3524553963b9bfe706ec3a1da4f2d58b307a5b251ae437ec1cae6ade0664cc39799292b02b4dbd4823b44b28ac5ce5a63aa805964c9ad5608"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (98, '{"ob": ["15151515f6eeee84892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951445cd67de5f5f59568a5fd4b0376bc6726c77d8926b318c639dd0743b3da700a5d621d63d0b9e16f1cdecf783d5b76bd03772c4f214acd0772c006a1546e5b75a6c6c6532808d10d36882d4ff750e27d0d8ca32cec4033756e9286e9bc10b6b6b6b412a53ce1f82cf6fe6323c3121d71c112e2c17097b0bb8d7046e74849aa2330bc386fec0626af91251a94e2cce2e9025b484b8543f2748cec3d285b4c56ce62e029d84c9e2d61cc6f68af09b912a9f2d087ca650492ecd7648a9ca4b68f18f06d9c78b79786e102da0015c08bef0ab9faf788c1f112775a0b1ea6a5e37bd5fd4b875350061ff5bb4f3b9c84eebb66f0b8f9d856806c81bb53514df227a504bd61b4819057f30858c5035948b941f5f09d9ac2c180c8ded4d2e0e24fc7c17"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (99, '{"ob": ["15151515f6eeee0e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b587eb9f17c279b399c77aac31cf83d848588f2187240c6ac9fea7d13ae6261361d36e8834fb137a71f8de7b8178e4884e0b4e26a9d1f3f5aa36f0a77ba6cbd08505d6ea94074d7c4f1640e9e27caa88511bf7a65d4d88594c69762870620eb656fb06ef59befb04114819cdfe9059e6395ab0d9eacc883e25ed815896c8f1477fed7f97cf98db197ad972feb5e3c700a494dec8a04737f91059cb7f3c364185475d4f809a919430cd3343cc9fdbca688ca22c33038f8a17b8b3809fba8e21bf219657b151b39542039a231314819b9a5d92413139c58c42c39c9d0dd17b71d571c68630789c2b824bcd7427bc91235ec4183e40f441808f07b5dbe8f3ba33383850f0cc283273429ec2564d43d7e8b67c06f465b0920f7d0fbc247101045928"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (100, '{"ob": ["15151515f6eeeeba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459550f6c0dffad3ca0d8539e681ccd3ba9b26e500211003481a9701cbde6c04e6088f8eef34711d2141b99e7befe2a3c3e6b101af02403caaa2c8c503c3eb87e62ee0b5b53e87b5f3175c66633d03c944221b8a9efb35bee97579f7a9026a8264d8c0aa2b7a3782e211e9916cea44e3a1cfcd6d5d332ed9601c5cc10107956412cf1b8ecd3adf17de36e3b27bfab12d3ff603ae4b47c29c2dbcdbb38c60e557c7a7e82bd65c9ffd7a889600f8810c6d2fcb7de74633e68bd38077e1da17ff02afcd37ae454251ab4e4465b946f5c162c4b6395cf7164c9b98d4d3b332522f7876a40c5afdc6665a8967386de69399d78fd6aa926d6d2e72b0c3e112e6dcdcf679c3d92a30e85d6517d81d56f90e41b1b8890de3d9c6f6971f0405cd36252d8f1ee7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (101, '{"ob": ["15151515f6eeee29892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958ba2cfca121e1be2609a0693373d205a0d18ef8687a871279e469077bb9a33ac3d49e85c61a8f25a7c05900809678056fbbd0e4884ab13291788d671b5f9e303d93649e01b235a47101ebc014c14d00485788f5109ce67fecf294730f043fd0c58db71bbfeacf5f45561883af19557c003937b3df865fa5d751f2a7275951d07dcf5817a2a062b5eebc1dd615fbfa594c478d8ab9e81311c97fcb94fb3e22f4c8532f67fa34d7d1ad83bedd8a03ad3eb662082d7459b7f61b9983b2c1bf5196b3f99c80fba7967db20eff4d9e107fee34f20c5e9a93fbc14bf01319432f86ba771f48b6045d3cff9e4aae700ebc51b9ec155618230acc0d3f1608128258dfb8e5cd41fda7d079eb83d6319016efc666bba64ec7649821a5a5b489bdf436aaed0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (102, '{"ob": ["15151515f6eeeeb8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459509e9099469b1db46b9721276212cd4ad15a96a252c26b77a6088fce6d85d14926d7dd8ee88ddc50de80aef6d37c45e4558fdadc0e43dc00e4f0486b8f3931f9429c2d9983cdfb6350afe7edd425104f9c7885be1dfc024ba9fd135a0035cbad904abca4815dc9e8df8aa65e262a370bfd87e60ad2aca0d7437ba29b4a8e956c2911ab480400529b4035b989bdfb0026cc9906be515f09f6caa70bdd092862147b109d621866401a1ca18cc9d0ddea9661e67c8674485094f4f83f984d7d5725130bd2528f84a3e64bb1402013ca364ef183b38a80cb92469444e6019446f5c5f3ac176a83a546ef4981ad8af17a7c0c6c9136a639391ee275b5588b5032578a2e71c508fb2d3a7e7310ff8cc3fe5103fe64579bbaf1698ac94c5385640bc67fb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (103, '{"ob": ["15151515f6eeee4c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958b7631cd7663af86e98ba646665a8db69eabfd94b575da80111317263ba24bde931bfea240d4925cd64aa253bbc6a55d2b66b175c0e6d7d402029d139cb411ac4c0b0ab224311d1440eb86ac3eb029db277c09aa496aaef2285d4e40dfca00c415fa598adfd2fb7771e59e27a45cd2670d9d8f5de79b34b8a4b24f581c3ce6d19c81acacce2995654254cbc5fb29926b043730942b5f825eeea11a0da4f94fdcfcc365d4f8ee178be37db86f949890e92b71aa32fc3d7650466e34aa6d5c3ef99e10277cac96998dadb943ca63bca0867d3fbc6926b1d332c54935559f4b3e2e44157c9e26d57acb7a09d8fff1ecb898478a771aba6db4c531069256c77ff6f1aa6862062a34ab69cdff663d8ac74d84c8b1c15b2da64bff9e9f06ba65e9e958"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (104, '{"ob": ["15151515f6eeee5d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459509049fe634bced87d1d90a41c7fb3c8669c3e7c9bee3f9a15f2dc434c940900ec30c035f6a7deb6b4447447e66b16bfb9f3b92b7f54ee74ab7d90ac31de5772b87fd1f9a907e2b37afb67fba51bb4fb10f7b0a6f3db7e96fd02f7798ee10d1ece40e71bf33e8e33fc03970ae7feeda339c4f1d3b7c8fe2b91e4f028162076ef981a32a81dd5cc0627bf4665939085b480b9ed12d816e15e1eedb7dd58bdaee4346c0b757944c61a682242c885c0068a7aef80a8d7892cd192c36923e608fdf220a8759bd81bd79d70dd7ea9e0ee3527dbcb7f312861d9f6324bd0fe0a84d4c0d0c3c7cca8de9bc6a60aec36bffc203dee3033f1ccc93bcd8b297e063d7198cb675d9adb453546384bd34df0a79442e225f0f34c19129f0026d5251f35e850bd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (105, '{"ob": ["15151515f6eeeef7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c46c160f1948278168e11478f9f8bf0cda8dbddd977ca459a6468de267a9ce008b374a7a655d195d3abd3f39e9ad2b30a9d0572507c0eeb3d1646debdec9393026fcd5ed37c891075b10d73b213673e995acaf2354444680b09d22809109299125345bb4443ca7c60e915ad54efb01e8a4d6cc25ae32e5ce7d8c902511ac9737ecf11993843a479ca894766ec70e328b8a55d2d79ed89aa94b99f74d0d15868000208ddca44712ae9af716330981ea6033aa5d35646db9d034618186bc3c0476b86fabff1b71591f67d3fc8bfee05ffabaf172f80c53601d28a605b4d0d254e8aa97a3d3b0b8eec4b46c2d77e513d10cb347dc3d24188735fa2bcd7404c2229ebb75779f3ed625786f3c70088f334ded7db85bfa6a5d509b630e7f3e6cb999e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (106, '{"ob": ["15151515f6eeeec1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459544896e26220309f879a83647d5e311bc27556651bc0281a9765e9aca573e89513d23eae2e1158e322c34e29f962e92ad2feef3ca0c247401a3823972f01ccc2c04fcb4d2a104c9fe52020c40e19216a9ab284bb06a453bbe310acb7a5f9ece20b9c61f51a8dcb40948d2c1b5e8eb41b7b02db304cb995dd40ae93462838121d463d4a1a3094cc8d3f2c9e6a0413f97cc0f8131350b37e591f25ebed1d50fd4eab6169dd429bb3cc5bb09832516634925e52323481073e51e414d327619ebf4e2a80a933904b830625c795394fe47be471739a75d2a1b7da0fca4fe573eff10514c05000a7207133d86430fff97916f8114c8a8a876d391007c62ca3879903ba52bf488a77a95ab289418d914c8161e74e7448e38171c11548eaa2cc4f9c988e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (107, '{"ob": ["15151515f6eeee0b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459548e53ed07888b61ef9a6d8b3851bdbf70580f2e72229010a496f2ff292672a11e10b01931be42584371ff95bb0357698a29317e21336e8e70914bdfca294f41369222cfd07b5887ca51d73afa3311a2b7395322887f148ede6c4a68ef5422fb69cf46b10065f3fdc58da2277c8b84c82cd3424389adbddd868c0c167536ba432239f44bf0e13a5e729e26259c21d089a06bc0a576f08bfe5e271dd69a16a624afe10ed9e4809d6f2634b89b6d2697b3e65b1609742622dcb4f5bb9eb8fab4e1a4f3212f19d926a2ad5ed8ea98e7a2447da28bbab5ec60a6632104936830176163a8dd2cbeb66deaac57fe8306cbad9e6ac4bb7c3cc40aa24f77ff447b2b0e46b659c92cd3d8e2edc6285abba8af05850aba8f89b1ad60be444207cc03b6fd02e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (108, '{"ob": ["15151515f6eeeeab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595661f323973db653639f7e3d0600dff61677d25dfa30f7d44c4eb037e90621fcc8b842797dd2d1dd35c377f6804ec817edd042f9f9a428bc2d02b21b7c6085786f385fc805a99759fcf722e76317f8173e751a13710237c09c95c2aabecb3634ceae66c8732033192872378261358f45ea087d2d932e264654ba684ae1bd8bd0b96540dae5e512f0062de789839f2c079bf1789f2e2369969499c73500c60fd3e287840e7c4231a371ef972ffaf293a6fbde2a8c2dbb37c5849c57dd1512ce87c9928410e27512e2fa235a547cb4b175449b8968446d62e0b09102da6d906f57aa1f5660ea5bc73454bd73cc58fd66c769da8596154b65209799ded4d8109a8a6658769779f45c39a43e0a686fcb8e471314e55dc270b5d4a529a2a5993d048e4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (109, '{"ob": ["15151515f6eeee06892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e4cc058ae7d7f1f6cadd8745a763b26b735ab7f495801994a9ca3a671f72f31818c1d215d8fd2914d796bfc425840ed6b05711791874984a76817cba4e6fce40bbff07f684b0775bc76a3d06fc9a9e8ec40c2af24ac7786857fc2e5d1f3609af9cc61e88934f6fddd40657faccfe474981909ff607fc85fbe9693ccfce04e77f3e7ab186ed2efa3ad2d91340f039dac75e9f8971aab7db56b3a87f0f1e2f7b87f88ebb007a7344c1c6ef220fcdb191bd159308fb7efc3d05450409e4bdc7a079971e9a925e1eef3bddaf9ed14e84e70f12f58716a2f24f66f8f494ecff898a6e0f8c527a728ed3babb03aefcb2de760aace78bff58ef131f6fff403aa0a36ec88ed58e9c640fc3c6f2b95ca2a7c968ba30d29ff9315a8db4503bc741e8684750"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (110, '{"ob": ["15151515f6eeee1c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954f49a6f04ba3fb77d56911a61e9faa4dfe47d98e58edd52220f3c158aa947391eb85162b885362e63853c4cd8df3ecb4ca8cd003c340352be08de89fdceddd2e03ed027f82ef449411a6247aa06b113970dc8ab607f4aa5cea1ebd544226452f1f31f35bbe7bd204ca167c57b5471e00090113dee8424c80a5524b0ab289e418be49cc900b7021618be048a1b9e8a1e6632467c963769d1e7374b1ab32464b176828e0cd924c33b203c829bfbf4b959f2c1583bc0f42dbdb92cb7762c791f07edc45711b9aac987e20c03d4f28f34d7fd92398532bc433ad72ba4076cabd5526146d6c70e5126f8129e44796518c42ca763ac81636c6a0b20d7afa8a7cc9f31f090f1021e1735ae4971f7bc956b95663356db5119fc6e0d75ae5a59adc426514"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (111, '{"ob": ["15151515f6eeee6d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a600757fe317599977525cf717e3cdd85d5f950a72b8db8d382b7811c5e665702d09e9a80a5d37bfdea9005e38e91ebaf59a972f13e18d07bd4403cbef302a0a53526083c038b95e68c954f010097da0ed2d62606a533974a0d94767518e059dc86789df3f2a0d17de65a22ba7244de643a300abeecfff8564de26b4382353537dda3f87b6549877b5a4fe536f4601dbdaaa5c84deec7f74a6e2b22fec4f48c130536f091417c7d7c33ccbf979f5437b8b812b7bec9d37b1582cc8251c32cb4a91ccc22d6fd292617a4bf956cff69a64645d597aa4848c91bd298045b14e831abb213d87b15a3f8247c1a3cc88b147561022ba12f4070ce22cf496f3df5dfdd4c9721ed50b28f98c4df8709fe51c2d3bc4620974eaf07eff17c69b97d6c41f89"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (112, '{"ob": ["15151515f6eeee65892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955e6b82e0cd88cb27e2d14e41a70366ea99e61bb5edad2a9fa2badf346b13653098fd4817232abfaff5bed422a1fec06fc58360ec98dd523ffc6373b1382951742b2147be3c7a6788157c84d319e98e0c7542bfbf217811ac03a76e3e740d7f653eb09fcb7d339e5551f11bcacba8f1fdb01dd33272ee2566c74bda6031fa7e8aa05d03edebb9f75beae92203c793f3c3de12d2711d01bfbdf7f2233996a5b41f3ab76e66196a1491d0c6523e5d476394089de5203d1d20c789d05f76cffc6ba10b213987c23288c3d0ea79b6729fdc7356fa05a5bcbbb27687653dae27a7b777914c3f9a9138b59a1d21ca440db01f4487bcee2effa74cf4d022b7179a97352cde115b6ab4b778c7fd047693d862ee9467c8e11accc5eeacdce7f98f810627d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (113, '{"ob": ["15151515f6eeee7c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952ef3b4b3fd5ac5b5a9dd68c21f52a60f087ae2abc96007fba75e1a15ab98ee0013a8cc7e2cd21e2df8b7465ab757508f06b74c0b4b026fa89d2421dfd3fbfd54471947d3c74d5d381ba2d3b0cb26e5e71bb051568c918cbdbbe3d98b50e2744e9de56ca45cb6c51877ccb9be959426b3f4ae145f3ab335da51a1dce161bba3bf85242eae48e25f2a92a0b4e87b74a12153a7417d945cc30433a6de160ab60f5b8ece9078f5b797c7ee2407fb9da4d1ff26f06e1c59cad88311cbe7b9946319b5af077548f6a312f7f79f24e7b67c9cc897ca0b0837c4ba6773ff38ef9d3402b1b5ca11c5aca8bbaffa484db2fb34b842c9f15ead3d92955fe4e95a58d97259a960b36a704029ebf4bb7413149e501bd23b4b3b431e9ab63339e731e992efab2a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (114, '{"ob": ["15151515f6eeee18892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595969c14de7efc0fc40ac26deacf833c15a400996fabf5ecb8d7e0a099bc82bab0e23e618971bb78cefc4261fc824452bd6791cce8a56fd2966d4974124a3b99d4aa856740a91ad3577912afca8b6e0e2e8a9d8e6f462d7faf8c7bf4dc5746f9f39eb6e7290b6c97a4ed71645066e6cbee6775188543964317eea7e3feda157064208b787585a1eac2d9fab4857ff032f819645c90358ed59d6f1a9ce251ff29ea782f1546d060acbfde8209fd0664cc7d554692ca3180f4a4cdfe0099e0fc736bc4fa6333eb09b17d7b2dce46aa0131b1814a6187400550a73f0e11769e72f0b11cb6dad9e14c3eafdb0c0b57e01dc174a8c3b6ea01121236e31dcbf79243b9fc57592db6829354b609f2c077bd822cdac455a5595b651ff8dec2069ee1a380c6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (115, '{"ob": ["15151515f6eeeeea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459528d5ee951c12546d4709e6bde1a242678e34d1916623fe7a97befea70881d18496571b05a019f0ce73939dc53aeee4692ebb155b73a0a985b08a4e933a335f6efe070cee1f105d7e5ce828e5331abfe6a1df43edfcb7bac842353f75b996afc20cdc56d7eae2ad234b4b7f6c4578a862b7e78c144473b9c1d6266c0819cc697e8b2eb82092467c6ce4d7bd3676655f5e0f67251a63b6b8d1371d4578880e669d2e48c1cf9051fa22db3959fa93aed7be7504bc3caa653493f15a51d7bcfd8a0db4b52254ed1a7446aeb42d4e07d29176d4ae409c83f4de7589d82411511c97060b0dca4ac22e73cca55e63f79158800e440e1f9e33e591aa52f6338bd7d5f2a12273b3e55baa7a495926d8b44e0881f9f44e53ec727b9a5667448d3481d147da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (116, '{"ob": ["15151515f6eeeeef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f17548208d335e5ebcb41daa2bb95c85577e04bbc25c3c8790c9dfcd840596947fe7e67b822e0972f587d36b8e026047e17ae794b6c239ebb445d3262e84d06edd867436fbe130b9f64190e3df470f2f4379013c72c55ac61c43d21778756adf17381a8584c3138215c39df177505c297cc627b0c64e35b9c05d2d08c72efb3630543abaf85aa266c0fa43e91fde027684d18fb21c7a7b962a9208c1b6a4a84b98ad46b79c2bddd1a3326381e44a400a816c117be0b1254c416be525d3d2b14cacd4b630403b1d783f446747ef1c2da5a70f77b6574f031cd24b38bbc066061fb2da6e257aec15853d668385ec354bd765d93da0222c12cf1602878bb9fd7e61f9b9ac16769ae84ac8c6ea90c9ae1df7c3f36af75ebb6205d815c566d81be700"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (117, '{"ob": ["15151515f6eeeed9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f17d2d664107f509ec5f8655f3f9fb41e6682810464e71f8fe54083d194ed918b5703222cd4e64bc5431b0782b0ea726cee196898affadf44adc3d4d2b11ddbebb1bf719843220897b1c6f468f2e7d215e3946f4ba4340b6b6b44bbcb71ae23f8dfad899026aeaf5abdddecf4769d6f9096b661806fef760203eca6591e748139a98fe28d173bc6c811fc51ea2d75fe8a2f819b433c3f700154ff4ab684024e077f4de079dfd0106b0d771de0b4a0432047c4b0774a9c678edcd3dfc1e26827e1935a35ae7c9b28a8a443f7507055b53d84346186db969b3d61cea1643188ab294f1e1665d38cfe97a09bd9d140cb7cdd83c01fa42109c2be334fd73b768d1706adb116e562966ccd7abfff0ee33e3e366ca71b5ff22508f1ad2688267902f85"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (118, '{"ob": ["15151515f6eeee73892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459550551028f26529566ee6c3f02723378bbf5e25ab799c7d2d290dd115a69086b8753040755cdba288f0d0834fa032f7c489ec5aef704aa8972751c1f6b9f0c2274275821236e028a25defebc7643ea3196e865444b71441dd0625c609d50f3688e83bd7bb9e1cb3adebb68608b83605a5dea8b0a6c3679757f653f972c3957d0637f6906490778463b9fc1e61579cccadcdbe0e5e4c7fc981491b11ee9ffa386826344b9ee647a3a6d0fc5221b20275f3893b779b59af7ec974c075ef35189783e476506c52321118fa0e0e6b7a73cad3c8d1421176157491d04a82a591c5f12edfb9ce96be54bcb2d91da33cc041912fc8f4973f162eb753b2e7ddc834a4e858791e00c31940aad9184d4a6ae910ff46f267e45705f9e01e338d954fa688d0cf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (119, '{"ob": ["15151515f6eeee2e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595499b121bcbd2e529d41244ed9568cc1ee59e1ae28cdd75899e0580d2c899085a2c395f28178f0dba56d1ebbd0bfc563a507182ebdd73c436e16f455e84f335ed698863c07bdc026ba31ddd284adfaf721a3dfbf607884a575d5b5fb06e702e401e76ea261532a634f871307859f0e8a48eaedc1a6dc96c7f6231be1fff56e48af1bade3ac89914ab0393c39c599e39b2f99b54b83e34c430bd08cb1a5b4c331c2a40f3bcf12e0b63dd26b411c41edf69010a75db0f0fe8d56f79aefc8df181cddcc15d853fc079b24380ec80bffaef973a2b3c40351c9e3a31089376137fce27ae15e5baed6cdfa434c74ea46c7ead1b679201fcd031123b68dc4792e74d11852fd258873665cd0c565252f82f4541fab88cb008bfb45834d120a5dbdc094e18"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (120, '{"ob": ["15151515f6eeee59892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459586902228110251424c899fa7361c9d94d1d61f947aaf977ce50c77f00c3b0abc734cda901e452e7bccd4716ae99bf5fa4f0a9e93c022bb154cb2afbce3dd501a66d33a11c3895f79d47d0e77f21a37786d6ac3e982723fb7d45ea239aea60c29a75b9fc407b0cfda194d52c079b10ce760210c9a987d11bd6e92bbf6ca1d707a787d50acfa7c1ecebc3b79535913e953da1c575b2ccf851bf958e6cd0b8a624467db7d9aaef1dcfb00cb392314278badb4bdba61f2b6593ecd8757a879685b5618b76ad9b829a372f45012e094e25fe3bc350f0af658755de7347b1deba6beec0542b30ad5b5d04e8be7df543225a41e5f6bc2eb084ee828171e4c0110f211d40a725faf14943fb9aa9ef80b17de9f7c69e05e845cda2f42dee7e95a52843f45"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (121, '{"ob": ["15151515f6eeee83892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459574b5cefb90eab51edcb546915d763bcdf85f81c75b3fb767c290207a146ea289b38e7309c305898b55c562f019bbdcff50d74643fbf5eab346fe2b11691ac1b9876ccc291120cf3cb5916c774a57d0ec9f598be34212bda5ad3f86d8028b2338db84c284c5dc899882ab555f42e2dff4a16ce34e725245f73fb041e2a2ec4e6466eedbac3881a32ffe8772628d0e0e2dbc1c39eda8829bf34a2836ada47e67060401911a9898a53c4fd5423251f95653c57d89ddad5565de0167221757e94a5db957c1f9bfc84258c6bafe114e4882ef4b76d82238754323be3aa52a16a022e6fda73adc904c17abe113bcd2de8b3dba33373a2d0e82da54d95fc1ff8740211b299c8d854439c97d1ba1173870271512738810bdc5629fc97a74226a71a8815a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (122, '{"ob": ["15151515f6eeeeff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459591936e526b9f377a84568139c8d0f44a72cb6a4bde910c5a63bfb09bbd3da6131a0bd660956d5609e2b62a521b5911609a2536e2f28843eb6019bbba018bd6e0498054ccd1573de04b77bbc92b269681557129cd332f590d6768fcc7a6b5b1a308c41218556717e2d7448430723d47ab98a333a5493aa2f8e89dcc26f4c4796c59739c43d7a7242c787303997f1c2be4a7c8fc0e3f58752d4126deb2cff7bd2b0fb9cfdcd23faca0e680dc7ab0326ff55c9315dfa46d0265dd3232b0d51376d2ea9f5d769d6d1891f7c5ba695afa7593df00a7e14fb3e4aa35f581618d0aee827f7beb89723e1b40a8908f08d6244f3effd7eaea7869d8590714bf09a39cde927187c17c848baaef1a77f0c717f262ded030b21ec699d8ed31327a309c2d0d7e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (123, '{"ob": ["15151515f6eeee68892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f9a116e4835d04ae10b7a399342cdbe530e19d82e044ff68fcc7a4105b9107ebf4974198947e3e744ecdae22bb20a43dc89e60a5091e26531a1b5daa90cf1fa447f9aaa3b3ead996f49672cc1fb701f0ad811c98825ee8ab6e36f5ef96d6a36b92e46471a8aa925a8475f55cfe09ee679d4675c5d020b1ec363dd5c8bd931dcba90749265c16b6169aabf8304e39b38b77fda8c9090740f54c93f28e5d1858d25b73c51e8aa64544b6544817c2a52afc8c76261509757a467ba1bb4f23429264dbf7be8b31c625946f7ff9a86777f4dc0a4bd3591f3abfabd06205e167a2ed6d148c29203589b9c1cdaa3d2469accd78f2977784a823b0094483495074f1925ca8f4a0aef3d6cc8938e4dc7ab5fe9004a52d22dcb2bf85e8cab4689c810fa70d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (124, '{"ob": ["15151515f6eeeed2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459503feb362b2bc47a73aa10873b15d255a19eb1857ecd59615a24b48aea3c0693467e31affe29854b2110a77053569a640a524a322b618e0a473157cc738f39baf99d5bc990278d697040f3efd90644373e9ac51755b4a18a5beb4e57266631c7b5376aad9e25f35244750b60f71197ac42def6ad477f439148d9bfc6c1ae36bd456ed939eaaaded611a158c6ed72df1ad4a6af7e7cfc170a1a47e5ac2f9c92af1bc38b5308c12d2aa25c27d3f0f02982e152801cb6827ff1c3752c69cc6ea8cceecc63225e472938782574fab846a3a18bfd72d613db99a4841b58810b4ada8e8b55f95034f2d8aad95c16c4324d99b9b5e0b3d6f53712819dd7cab8a77629567c28df8bce2f6faac3dce2f7b1cdc6882ca7d76c96a0d576aa50cf5aaa5240c00"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (125, '{"ob": ["15151515f6eeee0f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595777412638169195651a35eb73b112e331667c1feb7eb15a480a8b070c4e3303444089bda0deb00af1817deeaab0319d56888ec8158afd7e54ccf4c75aa1f92df6225df924a77f7c36232cde14e162cf2a5ad44cfbcadac54a45c25974e512f061c750582936ab0bd12991ffe0df7712e7cf4c061eba9779d5181f5d505844ae945516166992759d999a0a8155ba60473ab92bd3f069da9157ad3b84c237147f9f619803a7e74ada5b92f70d44abe8db39d1f4cef3339d429a56bac73db8388fb69ca057e8e171edaffb01abde7b0afc55366d714dfde8036994705953971f1f2ccffe9497deddd72eb5c3180774d594087253a23f02b56d2120349989038e2a6ba95f8ac931660016952b70a5c46c65a0acd2da5816d90555dc2b9246e62872a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (126, '{"ob": ["15151515f6eeeea1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595806c98c85cca5305062d506880a058251638d93d1d6b9066856baa2a9c67be8d6be1f86ec3cd76c5a7572b3d946d08e0d5192ab57e7a978d17009ee2a03982e205243a7a9ae81d00c456b746abc7fde266ba3a91a792febf519794b529f54a312663f879ac4a51942c4f66da9864b4cb90b4cdc74c869f7bf3f8a336a7e7029860a6f3b9829701edb4ba68359ed68f91f3551744cfcacb875b3b1ea888c6e19817c7b468e126b31c253b2880e165b65e24600365c8d7079f1e12f89133fadc3a172f565188c06ab58fc16c45e3b0a4e750ae4fef640f0cf3360364c3ae367e0d7a0c7f470a80e69d54351e6df8be0c8f821737fe35608cacaf2567f66809a811b89ad14f5bbee0e524ec65fdf33b059174655aed1bf88824577ff24968adba5d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (127, '{"ob": ["15151515f6eeeebd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45950cff7f8aac95a66d8ff928c4b5f9c90371bcf7cf397624a92d15ea859b2c3a97836f98e59361c4e1012da2b80d18eded8f6b38e3050ceee602b950adde199294f2007224c57d2daa32079efe8749e6a432ba45e77355cabe4df22314306ff1e88ff5fb7ac02d5e75e53e33fbd5cbedabe5228832449cb153ee047b805bddff857116e27a5a3de3f309838fc3af3e12f4d2b4f9974c37c262de660f8fadba8660688eb223716c0924f8ed26aac43c4a0ff8c515f90dc9807b7a06b0f60f8851df75a185aefe9cb3bc8f28a04a50a2173bd6fd50c57819b7bc34ebc00bfccdb6f0a8f59ae2cc13d24f54155d4cfeae0ce7ba9bda2c618ab4ee628255e29990c1fc687fa6796f0b9333c8fdd6906dd44eb04a7cc4c22b395e94d01e5c98feb90276"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (128, '{"ob": ["15151515f6eeee0c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459563f5c2be54dae4ef24b6adad4d70e02bb8dd5438271cef8ce8e9a332f33242dfeea29cdc672fc22db48e3e30663147b8f93d0b77082b5bdb22a02987b981b8af2af3e7fa7c7010c2035e9cfc9509bdd9d4b74b81d9a109ae707fff8522930a3d1e8e96f00821f868487f9c5ee55e464fbbb1f60ed3ce168b4f36fd3d191903202d0395379797c04573271bbe70bb4abaa025695ff3d3df75903ea9328e1a38a957b968ddf97282a1ad60d3797ce83b4905e2fe9758fe08c545d1eee50408224faf0566b8df5b960d67a7c050e4240105de78416223364f991f30b788d45f2813889c4bf2242aa46ad0612ffa4c68a923dab84f64aac9a99b75bebd3fea33bac1284473c7c71959637b65cbaee01ce57ce4de38e17099a641aac1c4c65a863aa3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (129, '{"ob": ["15151515f6eeee31892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dedcf6216bb58bddba7d6a6d6bb66151552a9ba923119357541333f3a81792dec938ffc152b3c94fc8e70b00ac989a8189b23b204da11424d693fa6fa43bd048893ffa2114bbf488bc506cfb04d9ea34711bc5f595e820a253ed2f74e02ec2e1138b8e117080e0388e2e7633bd4b4c98525d7add4207c2909d03a67ebb29315a6af6c88a66104232342371451899322689f23769a68b670d2103da210b95da212a9ef5078f596d05d42b3ce4ecc9761df7c9c75cb0126ece9452c05128d05b4e31d666714b33d59082ca596ab5ce9e7162923c55da41ee4ff336d5e4706a66aeeffb4fbb6f8fcfef244390dde9cf29d1e20e036b8fcf05caa6c6a905526f820b585218953055ee7e53170ff6d6da576caa3aa8093f61654900736c0d0bed4449"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (130, '{"ob": ["15151515f6eeeed5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956939ad30aa435403b0e1e5b737cbc5f939673430a4cdaac503de4cd16301fe665accbfdb4353aef8e601db733166a4206fff6b9a85228ccd8cf5584eea3e3d49af9dd203f3881b9227babd48fe34c72f4876c7aa46e56121146aa278b75e53d818726264355cbb9c1090bf7b628f2ca55e801a251baef317ab129d2631795fdafd005c5b101a56bf36bd0dbf620bf222172f6b04dc0fe57efdc29eeae9f03396cd005a9fdb9fdca7fb11b5008b43989b362175165a6677e196c98d7423c07d59a5fac0566c59b5eed161231b50ae381fbe48a00838a7eba2f361c32ec1ed3dff6d73ffb1c7e56f747a1acc62b36a5ce83b221d9111b77f85445ce6f7374079e497109a0eab5326dc1318e0e9b5b9b9035750dabb7fa5169e5862486a404b2d47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (131, '{"ob": ["15151515f6eeee99892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459578c64aefdd7d3d001e69efbdb533a165f1d59bd1293e52bb80827b642e91bf7fede4b402a376aaa084d8f78201ebee9637cd5a3a4c623921331f76086d9f0e81a1c16ce573aa434cab9733ef72cdc00caa18f8c062a23b04f220938aa057e42ec2330bd2f22c1ed993b6e0848aabe7152d22b6a28d4a555069899444f05bb498a48a264421b5445f323adf34306e69d4ba59f91e9cb521cde1c50a7abfab0023059314d97827edc3f2119367691566c65d54b002e8ebf329f3e304d6092cd0b47215ae13de8f2c6011cbbdbe1b73fc1ea28c83e122f60e4d65ccce9ebe7970801dd5d5c131e6e7d0e8955c0557ad355e3af2fead0b16182e51f151fd2584b244d20d911b555c7ac4aa26410499e556f03c7b3eb8b89193483ea217b4ba090677"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (132, '{"ob": ["15151515f6eeee70892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595af019d7faee5d65aa6a9524a7d1fc2a3b9c9da1679fe159832b22ba071d3e72b4e52672def6ad8ac03217215bf311a070a51eb02b5083b67b95949074f15009fbd5ac14db35aceb96c973cac709029daa3df59995906eb4554147c74c2bfc7be2bf48712e3f23111fdf84d8bbeb949e88304ad31480189432c11db83556b4210bc0eccd824690c963190300819fd1536e56e2e61012866ac2324cdd9bd55c8613063b6c5fd8fa654be5e5129f640d6096d23de4d1adb4a88b0ef09d280c3b313ea8c1f00c6dc642b6fff7ecb2a6c7a7cee935e7a4d2f01892f1a940fe69a1052bf65cef7d1f2c2beb42f9eabc00805959f781b237370e8b97ab0cd2abb1c2b3379afd69346d9e633577a6be0058face9a78f21ee3f3e2bd05ffe6824a3387318"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (133, '{"ob": ["15151515f6eeeecf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c7c7a140836bc72186f967d66b7685f28bb5cb83bb71eb0c8445f28dfcc2fd9e378cb5cb246b0c71ce2886b4edf6a36770b150bf7093c1322341008c85108d807d0d2b232f57f06f233905e3b7d8cc56a8c4aeb3535b9f5fbb8e0015159c161380e62831f985ada437c4e2b0b272267ad0416b2804d15abd14e4d1dc1a27b38c149cb66c77ffb0529189c41294ec7295676fbaf6e1d7fccd6a6808cd4cfc2c0a2734af9993fd1cd6853051bf436957f8e419ca1f27d0c9394166237f0ffaac642e444c06b97bbba6fb4e7de9ee9e27c743a7ea497ec6725ad8c9847151c9cf0cfbb0f4b06d6cb6a5456efa5bcf6bced31307250259394d5a6a4017a72b45ccd8c0b61756468aaf152b204f873ac8761b33856e29ae9abb6f5a3a3f2eb12a3079"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (134, '{"ob": ["15151515f6eeee92892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459514373094f6b24e6845876d8b1d95b74de54c84fcf86ff03db04b9a44e27c743a6a968c35ec8ba610c0fe8afbf07d826a1a132e2042deed56b7a0b69e87bbd767ad1435bc819862a082ce5534471d5b83a595b30026efae7be7c9442ef8ec8a559936ba0fb12e798825f72f1af9d26f6f2cc0d3fd7a861cb1c2cc0bd9267a10473780a4e1e6fbc01032578886a80ce14a03d8a74f2560f59c31a1b35e8d92b08a5c73bde7f3dbf0e16b34dfbe734fee61fef3864a2172a654abcf17f398b6e1e44923d507fc0bab4ca6ae3c769555ef222025eb9e9261000610863b111ef595bcc7241e92a7156c2ac8ecf70b4d5ecbeb7950cd44c7f7560a7d7bf53094ac8c9e355ec6a99b8154e03c7cbe2297a8d60358d375e30c9784bf25fba1cec3355a81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (135, '{"ob": ["15151515f6eeee4d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959fc02dc19dd6ab458e06b8fc4ffceec62112565a541095ff7af2a54b86f70128fc8c8cbd62d6f66ae4bbff518e10d050d040477e3439281e51daf6e9430cc00e5815d6818c2a211edd772a19ced18b5cd802e7235c11a34303bc669280b3dc62d93f6b2b967ff0bc618be9a9354950c968dfc801b1f242e4c4a9c05f48a3a2bfeeae740fa33bbd030005a6238fc2f4b1bf58f538d47779bbd17d052e66e58456532c1ba8a42d015c0daf229dccf88d01750d700ea5183064ec59829710c465b5b5ce305b7a3db0dae14e0881bf22ee647d314f2585beec7eb234f97f4bf8533ee03362b585228f1dfe3091d87f369ae8410a76791448315193e043dc89d22eec5da524739cf97e362c4569a071b171ad47544f619f46d11bb3775be9b957548e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (136, '{"ob": ["15151515f6eeee4e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595109a614d533024e612b36e6e6429e8829117e4e9022377a260c8c47947f488cbb97e7d08e0f812682ab07803bc7c7cefc03a80d6c308ca2add01e6c8f08e830edde970bd1c34ebea4ee6afcef82042c74ce7cf4834cfa83640362918e7d46c982e998371c10502bb961a6259330270b42202c0a0ff74e7012b478dc29ecf4802c672b713bffa93734156aed217c309f8f80ff66743094ff4995a180897d212c6f30cb068c39db61dc6154301d42058d642cf4270240c913af250c1ee982b23683ef7ae4c7ba29bbc299409dd91231ec660a2b134a2121d34fae548916edf564d01ba3d476aae2454c338aa40f58d6ad855d177f3dff81ef3792f911e6190b54fd41086693133f0325edfa78bc54390d0b0ffa3797db0dc30835d5eb960f30eeb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (137, '{"ob": ["15151515f6eeee60892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459514cba44ba24e0440329881b9e8e82381cd8bede3ca07d573c6d0c549bd471afa985ca3a6a30804b0e7ba69e7fa3f04ebd5ec67cdb953ee7934ec20a482879ca9f60b710e814274d2d5f1e3890dddbf1138d70c2594a9e5d3a1032b7051e7b6e4ddae165ff5204083d2c80a1f298d8376789e701ec45239524799a3b0ceb0d11bc56de2e250760c3a0c70079b341d22be096e6af48f85d7091a76dd237e45696ee71a1ecbc58e09418f2859abc5da616a6e03ec8b3d8bfd0c7a35e0188c703236e7c56c3f8c2a62d20771e2dc7004d8a63ce776d9e8d4e3d94314b149e5657614d177e08b548971e300dcb1cf9c46f2afde2bd059035402242f82f9447e6fc397ba6b1c32530edc1dd431821a1936d1c8f16279ab37593c347737a28ebbf0035a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (138, '{"ob": ["15151515f6eeee72892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b067a120c79c248e457ccfc0855e3cca479ea18d34552e613f582af2bcffade7fff329bad06066e246e30833d32323403eb936fd97fd1618b19584692622522a2a8fff75ba38353d1ed5ee584982079ac2a15bf2cc8060fea4d2f590e5311e287f4294c1d34664f97578a05408550b52939bc5b5ebf24bf7ef162d807c9a44cd383771b825e83e2da2dec4900df16a72a21d2a70bae36f80c585f0d058dad53af147e0edb9c03529619cce6f7c0cfa3ba48143f91e2c2953c4850f2811a7281f6056eba1bf0fb7c6c33fbecbef6649ede9b7e80c40c73021024517dc60b60f1647cede8bb027abd45414af83acbf24e3151e8137ad0177627c1004d0ea4943cdbf812e51608d09eaedbf1373449245a87208c8cc3ff21ee35abf6abc32741130"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (139, '{"ob": ["15151515f6eeee67892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956c31a0624bc8009f30ae8bd6226fcd5f3a502d0f3991b092f5174f6cec64841404e3a508f8fa7d819f4a5e4397f7844969b4038ef52012a034fb5bb2ddc4d3a05fd44264fd263c2742278bd9213fe13cf6996ec44d3a86c163672d32a2914b3d316d31eccc202df77a1364b021de8bcaaec1ae8420bd256a782f54266e7539b09e24bf0c71e9e158546dff64d53773463922d9e9359c50e7b740a86878271ef51aa01134d39b1f93b5ac0968b63b3c827572e2ff78d1bae2f50a421840b9ee39c82260a62f30ad8ead6a65b7259ea42d723cb950932652cf715cd746d930c373038e0e3bc37884dbe008b5d5eb1f6d0a9a18b65294ce428448096287c1f7baaada2e6e17b93321bcc9d852b571afc829c9ffe7edd1b6625477919dab49f6377d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (140, '{"ob": ["15151515f6eeee55892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955e16cebaee7bc00d0e1f2bb9ab68529668a35e09f87cff7b23c4d184f229acad02a954d2909d57034608a04dbc8d0a658ed083f7c2f82a877898b2ddbfb715f01f18e451180dd6208255a87d8fb0a020293e7ac3fe68848b97b5cd351ce97c99e45bf723e4557a3a4c1fa82e370e37f7b498ca879e5ce32655402041c2910636a234175809b8d9e41148c6159192151479bfd7de64785bfacbc4d63a5888be51683de4e077590c64fe630dc33319d4d1997b79cc7d339b8860ed87b7644f89c934983094434cb8d92624ba7554b41d50937966c9757aeebb89b57fe66a069fc76989ce7dd67b78e3c2cd068541a4e34fc3cd8bf751282cfec04edab082076ebe537e36d9cdb4dcb31ae606963f59e3e3921d239904afea9d59992169a1678ac9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (141, '{"ob": ["15151515f6eeeeaf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a935f1843279fed514d5d51d114afc9a6f906ac69abef2fe4dcbb5407267b7622a39d614a439dd9215d444e1f9decd0bc9490f468e115897dde03d3e5adfab366dcf55504bf652daf438b4ddc98098f8b762ba98f8ac222564bf1d218d131b014db3e08d83fab26f834c28f4d0e348a206a25d444119b651613ec2e15f0e36a9e92a1911b78863ed8a375db550f5277aac189f4be3996f512fbdf0a09017a873709374863edb3589e781e02eab2d3a36e4fbb94ec1389d9695fb915d88981be590c48ffdadf03671cd13b40fe74aa7e5cde329af6998ed3b92cc3f354ef3cb4688f4e155884d311824632c48a7844fd2ae2fbb61d6cf0828beab22c2d62305ff8794456384f64747eac3689f25b9edaaece3549cfb5d2e87dbb4b2bef1d01c74"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (142, '{"ob": ["15151515f6eeeec0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595fec7f7c383179143541a502df8c3362f907ca52eab292ebdb010d7f9e85a8f6f9409c42b7bd2e1a6d4b7dc3cbb56b1efe51c3f15abe020b1f468398462f716c6511d603aed9ba83cc4db62f1e9247a63e7e02863250869b12a30639ffbb58208a6c2173959d561806d91dd235622d17a282c54a38107863e9096232a6d865bd46efbd7a9268b42a0f8ccec40f616fd0b264dca39bb0b9ed5bea5b49ccc9ff20f8c8bbf3f25fb48c90d563ad1a6977ce6a0381f48e687adc34c63dcef33385d7ceeadee60f646cbeef1d6de1d23b75205d3feb264b60981724fa2ec54089c21012ecc90c21f1ac1399626409cc237df2c7d43f1aa9f82f3966780a82226bca88be9dceb8e8de6895cdad2cc3d064d70bc0b99ec5986e67dcf9d8827e96a9021ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (143, '{"ob": ["15151515f6eeee62892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e36660b05331fe7c9ded81755719145b08daba83f10e43897e85f8cac9206a27fd2363ff77506a421cb3a961d059639fd69990ed62378f1c1f9727f33ccc1c48a6ebe4bd44ce7b30fc44a825848aa1c4debc8f09644f956e1f21956480b2efc982e500229a7413b432972103aa669eaecb1edc51c471b1bba36e8df433489896cbbb431ce9f36112f47829866454414e228abd7dfa494a95d24a0f73adf1999df74ca16df959d31acb9db9e61749fc1cff2042800a7abd58750f3e39ff9758d445ee5c21f160f2174176c66b6692c6c91cfa5dc34b1ffae61922156a8bb285c997cfbb6eea1d29df76b6c23bbc24dcf7c8bec2ee63cee2bfc49e299e04fea193cf829431ffc26d1eba2ea01455ea8828a790302d702852ba0ed2a381937a2a49"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (144, '{"ob": ["15151515f6eeee03892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459544c9fd4e80edfc11e06d2a8d38e246695998fdb4a1ca2655c2631ff1b8d4b4ccf315f82091e730e9d31613d00b0f0e830f85dfb92f80479d2933d79a3e070e655cb5769d10126ca3c9b4792f2e3e0a26bf306299b0e443983b7bc5a7abcb2e160f275c9e068f1bae27f8475b17519b4f7f283b77eab0168a5bd4d42353bf1b1f142cd1fc7704a5ddef4666e3da8f39cdea3abcfd920306a0b7e9b72dd4fba75665157145a6369a3e8bfabd6e8dfeb02a5bc47a23b617d3fd295bbd932591b81b1a1243fb412063d1e05a6c256ba911a7c28a8fe52079d9dd1685a1aeff41b0bac5430351f2bec95bba2f15bb19b1d0e2fe3eb88dd9c05cd36737bbaa6aaa05ed113ff42b3b30e3ef15071f2246358d55cfd08e33a6b04e3bc31f721e6e73210c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (145, '{"ob": ["15151515f6eeeeb2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c636c28d5b06bd0ebf76eaecc2684f3c752813d5811e93607a23eff363f012992a40aa1183c3df5a0d392616edf0eb5c2304de2c1c365f70bdeaf52373668324e8979d9c1841e10f8795f99f97308533290f7b2dbc0cce075010a0e728fddd93532e9a0f13447e6c8e4aa9905769bdda2e29242485a5e7d3bc8a129ef09357f849dc5ee8841588e803906ed27bf36a8f0062aa69e4ff0c7fff8a3201c723646374a4236040e1d308b9cfdbaaf0f94cb3100bd4fbad3ad43e6b7e5bac7b2216c359a0684dd84582d9b48cf1208db39fa01d3373d6aef47ee6791cf9361c98bec32088bb6c64b77f50c293f24c8db1ffece4c466d2a656687f672bc20f344baa63f15de2c9bd7edf0bd13ea8104e4601d2f1f86a0f967311c28fbf9465188f4800"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (146, '{"ob": ["15151515f6eeee01892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ce2cfd50d2f155429426af80079c31d90c71b130749ad8fbb129f91bcaa46b072864fdb4a4346825ae18d47d0fe3622ae80802e8d5d1d59f5ed77a429980722e49f4508171272969c3539d90baabce7b3b968bb81a414d30cde31e2ad5e999d15bc5b774d0584bdf6c0f5afb7b11fa13386ba226c39115e0a34ef0135aaee9cd709f4a95d01be7d72ad1334fb0a9bf38471a4b3b413e5f91c027ffb0e6f6339dcf5c1b8f7833cff05c0ff2e0d24ccefbdeb97ea7c1469ef4aa5494ecb7e941b4b81a1614f17af08d5de19631b1abc7a8ff231e3af48b68054e4933d18fd79387b0353e87f82d083a053718818ff4cd4beb26ce09943bbef18cec679de4188e080808cb17e101afede7b40dd3314c6701a1a796f4d8df0a7a012543695fcb5bd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (147, '{"ob": ["15151515f6eeee89892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a2b1fab67ad76d18fbd78fd40e4134461d062753d3098e91c8ea25efea6dd3a4239a02be3f4c1b863f7149d2874774dbbce2897548e35cc309bdbf40a1149da8fc719c1646056ea943708820c094dedbf6e07a4477150ed63b25a9350d2d0955394c48079f4691fa5540abcbd12a68e7f06d17cb9ebec0d967430e5022905111c8ef285b6b6ffefc4af706defb0e0dbbf9e466a3944cddf3e1e5d8601cb934d5a5d75f06fae4eaa6cb47292c1fa52d93a2338e4a1e194de7606c7857601a0c6de928a348b50c773b30e8a01cc9700591c9a8a7ec3759e8bfb7e65555e005e0b830219befcf59bc4b43ee3b769a08e09259c2b9660c03a4cf4934c22988b20cde60e4f9e2319e1c646628da31092a16804d0b4198c77a01395c01bc69f7039073"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (148, '{"ob": ["15151515f6eeee28892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595356e01349f6a40784ddc3e01d799194879513669c5ce9c6622b4b68225155f740ce25dcdff978e9971988f74c46abfa0549431a66ada918b5cf78acb86c877eeb215c96f52611c88bb2d928092383fdc79b96e12ddf534ae185a5bdaa766b3880e1e9990282276d5aee931e941896247f34f9627db1d33b485d0a30adf370468b0a174c6d02e68e81ca0504cf9b990f4042668fb0a959f083aea25781461cc0867d2cc9fc50b6733dd3e8317b19e81688d967eba870d680f1f781852e11146dc56ded4d3f733a317e47ee2a283387c969404df4d511c660a8e6011d90591253a9dfa79009e79497b4719ff8a2c2383e4dcd7ea5f566a0f1e314639ed33098b440431cc87ec47c847a538a4ea9bb174986ae0434fb45d0c5d17a28c2d6c52d932"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (149, '{"ob": ["15151515f6eeeea7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d7caa1d069e765b087f21e5bbcc1607a5fdc82a752c38d937a9a6dd03480d5f548f40d521a7784225b1d11a7c6c90c4e5e6e9e338b2902cb77e7a3285f312dd2040cfd14d08a73534637e56bb5b0be5394604cc4e2ff3aa11a7b4cbc5fca81e364c3d9c42adf2bdd49ba2981dbbf1f177fa11cdf5f1a966a81b8eabfc03f5d9002018ee56ec55ebddd53618063e5becbbc0a612cc353526497e54f9d5d37dabfc435ef48c7314021298ec655d055c8dfb862d979763d24d782c5165240c4f8b0615c224a2dd4af3876b0439557b2540a5f043272e7b6afa8d99402a57de6d1d855dffc762af43118776b7563753d2aec245c5de248a397abf22b6b4e533faa6c683eb22311dc9d381b8faf358f20e96ba919a3e7f64bbed4dde16a14924d1af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (150, '{"ob": ["15151515f6eeee08892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952e9da35459918af1f52a2bffa4755a414cb57321cfa0d438cfffc8ab77203b5705c2f68221e11a56dcc0440fd3c5892522a22f4d7ed8e07307d639559f29237358a42bdd43fd391511826d06fb75057c0fc98ba69ca5ed7e836ad73b66fddf040d6a2494b0f55ef552ac8da94542710e2ba1f7ad8b7c144bde0dd25c470d28566145fb5aa8707071453c52ae7d1fd6f4b01fdecafa7cd8e7213a94aa2c68100d8d61b4657a6dca7fe7499d8e500a6e893fd31dc2547cbece8d1b51ac3c5ff5643bd6351ce3c9ee5def98dee67dc241505690055c2dd37987b2d72fa909dc4d19726c734b437796a1364f0037a4813bad1faef952f3e4782cba46d13d4528f32d23e8a1529f1ac3f6d089f2ddcea9afdcce5bd647cbbc988f7f41649e20f17a12"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (151, '{"ob": ["15151515f6eeeea5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a37e2e6d27d0f895ca1e864958394098a665d0d823e7e98b1a5366b8d57150f8eac3ef2555034510bfdcf0ffcf5909116bf8c0985bf419c59de6a8285a798abdf0c43f5896c1af5a38916117cb3d87625b5c3f731d9ac09cd7756a64ae9a14d2e69ef1e306c921ad6079c4f2ca4dccdc1f76de19848e2efb5810b635d0a5d223cf63d245f9918533673e4ba0079e2be0e82ab1faf20f102772024cb456e1f8ed27a183fa0a4da509de0203850cc69224c4d0e19436c805bbe700965237591d0f6f937d1c603cb4d4edfc7d8d947d3c34c2f32fbd382f225e7e1ec37fea1b82e010fbc5605f60211c7c3a56bf717380fe4555449b11a8cb969b379724b72b6d9bba0f2ec7acb508259b29d776a49f4b2b458ec2045eda92aa0b7d72e99ecd0849"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (152, '{"ob": ["15151515f6eeee48892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954ada477205e5d71b15bd7e1ce7bc456f5a34710346d97d45a35af35dfdea82dfb3008570f2e14c31f314d2eef8c8dd3340a5d5fdbc507b47d2dd34a8a4b940c0b4c636a98b58bc287e66d539894c10eace95ecfc6689b6dceca4fd4cfd70ae8d8223c05f15051414336ac7c918274c0be8a975660a49eb9f934b66deb6a91f8f50dd2333972c5066e11adea275c5e6ab210d772eccc52571c2707d27195ea0277d7729902371f49a96a640b85b565e3f5ae284a4ff2e8be291aa94fa99fe91c9edf63f85a44d51c2c1a2fe18ea9ee2bff77dd9f9c2859bb2e6e3612f6c998ac78873324917237db2ca9dbc6c0bd9596e29b262cc4b10e510c4f46b5ea36fd0ccfbc376eccf3b1f2ec4e5e67ba846d00c235050791238dc979eb15a335acb8b14"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (153, '{"ob": ["15151515f6eeee81892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954da29ff829b34bb4833abc967af846c0230fcb756f82d3dbc056f2307942c414818a33dd7bb87b5ad62b4896682448c9b75055ab384408d9f1ce1fc0a9cc74c2c0a9f921537db6d343dcff065e0e8033e2c97072ddca88a16c212de46a0af2583f4a00daaaaf42188843e7999664d3a017e0d40f8e0749a8318048a606d01616d9ea87a09e59540d8492503e7102a9ec36f20523db5565e3875aeeb25a0146a3d96861c151e6d6a82fa4ee16e9154c40f1be2544db9bba9502667c3007e033ab2a15c49acc34892b16c9f7af7240c9dd845e8f21943e700b6a48d7206cabed7053c36debb9a925d2971d5410eacea3498c62d8decbdd3779bb4dc1e8c1e341e9328042d1c4ccd07d625c92f36358dc5a9931c72b2277f5bb33239d751006cb68"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (154, '{"ob": ["15151515f6eeee91892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459595d00b761ccc3b736aabe3bdd389cdcf29d75f174ff095c6347a73d8bb09e61b3a6c6313c1de3830e553bb0dc56e01d2d63a951913bf4eeda9fe9e05a810da873c8113e1bdb3aba3e276907446905dbbbf5ecc884c444470e026c1bcd47cb50bac0d7cbdf781d4dd37007409f8f582166c1e56340208c4836e116abef0c093fba3f9bc5880ae95fe3a582c50d48348f4f37bcc1cb042b2d989c0ea525f22fb14c6f76fa6bce1fc677a74ba8479a610efea72475f09b5891e776355f0c401308b6ffa550a86750e0073c1339ebcfb3b545d5dddadf1e0dd1c7820b7af4c58b9007f080b26d362a667dd3190cc2593fd5cedf8fc38b17e8762858a85020f094547bd82192505dc25cd83622114532739062513805dc09f78a5ce775fc09ac2bece"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (155, '{"ob": ["15151515f6eeeead892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951e9906712ab3312c2b586aa2cb9fa7dbe98b798c3190b4ca311f8d8a0fbac392d53c8b45c8f0f35d34402b2306762fdea7ac076fb76e2a3bdce297036c0761ca582b34a96a8cf5999b19646e1100d9633134d50e086ae3cb502232cc31230c213f7e1e55eda801c7def22c518762eff5ca1ce75b6bbaf813f3a7620f60442dff24689f19fbd1f34806df3c7ff5a4ee53c74c9ebf409439e9d3a92ac6719abb135d00fc36594d197c9659212a67630d4c4c15d310a3df595a1a1d3335c832a28457cda6ee196fd121bdb9243498b013b47bda4e00e7ceca296f9bd3f86bfb039e9d78b5970803f354ba9767fa825590b1f5922ef5343eb7c0f5dfc04a6b2b257c7485133930d103b36b8925d65d195b03cd7eefc0080a8f9ab82a2e16c589ee82"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (156, '{"ob": ["15151515f6eeeef3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595606e651cbcc776bf26f05e55ac04f0174259e1bf6b1ce49530b6a5f72f1b8c1d5a6ac5dd917b4e3f6f6622ff7d5edbf5eb2e9e9c3d51f6a54a679377a13193d9df77aa3808aedd7bdaa719a002fec425c2cc7018a5b75d2d58c181887dc35dc2451f9cf0b2b5570a3c5664f3eb2006fbcfcecf5ed06d7593775f6a310d48612706314263db489dfe66decb680667207fdd9c738ffee3f64ecf88e20c23495fed30bc3d43318ff32afa2f313717c3fd2d83690c3bcb355cac920261d8eaea2f4d322767ecc5a6b778ff888960cbd03c63fc6551579cd304f5998a7edfc15a16daacca9cb6d6d65ea7ad58f14f5bebf3597e33b74ed9cb4cc7806910ed3aba0127d231f6e9c25304748ba95e0e73daf051bef12e6b6255c8e88edf47d77b96a3df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (157, '{"ob": ["15151515f6eeee8c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e3d10501ce419eb65959edb16f142fd29a63a5241f3fb8186244867ce282ade67e8e4d91da38bfc1f1e2f59bc3bbe91eb0a141b12863bdfcfbdd68105d9a5fff11b3e44fea3a1a56ed90041851d27180f95284ee0e7a30cab75fbe7ef78cb8859817e1855bbcf2114f0b31717e5bcfcec415d54dd8edc097776ffc09fe3e485b2b3d7c6b1674e6d07aa2dc5c1ae2f120a86d20a8ffd0838a74b9d5e262f66cf33a85bd07f55561bc4c9c87cef266b14080605ddca12c5c91cac0f0c788fa918e06cf7a3791e49a71d310030338f52a916a91d08169396d354b4a9b3aa6c2325d9a2a0947dda2c33bdc90c59e6c1d50916acdab47381ef42538b1e4b18ad1b3c187ded9baae643806ca175830e6da3be9a32c2bc8234643b834e7801d921a88bb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (158, '{"ob": ["15151515f6eeeebe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459541b3e23f91ae948473fd716a867544a05ec758578780fc3aaa8e1731cb075c7b1251a5f64af4f98a6cf99f75f829767afa6ba2e57df4b79cbaa63e5cb23fa081cd5b52a3309f7271bf459c35ad596187960e62b7652684e75ec1cdafa26a815eeecc5ca4bc493d3c1461cbcdafed4ec7df2c8616b6e0f63fa06fcbe7a5c810917b91ddb87fc9b6da37a616ce855ca9db2877a5520a1e4f77561b000bbac641d1ea26e37d66f254e55451e21038b836b1fbf863260d11b847fcd4459efe66fa22b6a9cfc5f23e9eb597df04bbedbc69ed6ad344525a5c082be486f58c7379ac382dd13fd3220862de41893587924cdc812d7e0816b4fb5547369e4f19e0ace575c7465b7ca9009d217c2ba68a496c306a9129c29698eebbf38186c505ac39ca13"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (159, '{"ob": ["15151515f6eeee43892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d8bd39110d47b2b0a05f93d73ecf614437dc40eef4f7d2787be9259e62e35c4ccea8f7b332b58f88c4e9b50e1d9234e67d361f1ae6a5457d7004579401ba1edb5283046ea5c6b697ff7ddc0d9cfd5fbc4fa9be5330b71c9a0e0000eb2fea26d02e0c8cfe3a7d629c63393f73c9449299bd1fa4ae59c294caa9a44589cfba4e0690c6c9c682924c2b8a3478b3e6ee08467901927d71f2e77ee8322337a4e2e100eb30aed01382ab163e4def2a3099b89699e15c0e754e99efc33b5d35496333eb9997ace9a423ae784925cbdcac7ec63cad144f88c6e507479ac829738e7fd84146627f6f78069acd16860ddf1d8eb6f889537f10906097b504863372a917ada57d782c390857fc5e897100c08374f6b3c89ad58c4393f30e34d596193a7640bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (160, '{"ob": ["15151515f6eeeee0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459513b4f0b8e4260d71eab692c14d1bcc87361d8644448d489100fa65b1d77b4e35d6b3cfad4648c74f2d081876d3c6dd0f17263136fbf764a4c2b7210a464a987f9eb8df548a753dab3b7184114049c2b3dac40599084ed4d88f086d853cfca9d27b8ee29eb26eb53b005fed55ce654284accc570bc4851e4ce7bd5467031156998e4da271f4d6d519f9ecc2c371a88825698a50c020de6e73113e93a7e934d49432e8ecf4d398484d849b1c92e8f13f5998b1455855efab4a9644adf4d214e7c78d9288bca6b8b58aa471ee8fa55dff038c8896e7053a39995202f2350f4d64ffcc6d3b0356504a6508069f308b2328767ee4583aa869d782356eaf39dd7480715b371a6068344be58773aa3d993c4980156e507436fa2be27859d1a000b36ff2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (161, '{"ob": ["15151515f6eeeecd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952df80dc4782644f6c2be78391912dc244b20bddb6f4fb534ea708f93bbf748cdeb05bf878ba281a4e6d3a56c0e3d08a8a28ecc4e27c7bceb6542226de1444cd229965214486556c89d7c0a2667659a109b824c4ff7474ddec402fe7d9bc0b003d53f22928ab8466c9e8978dfe1caadafebdd6dc13e3162b2622161890b881d326bc8aad876b18eb2d9e3b494c79303efbc82b0b31a0ce4430651e2bb848e3e4b6659b2e139f375b646b77dd477684e2a4aa03452913701eb3d6432d1b6a0236beb811399b115892cb278415c216aa394d19e1996948a0bcce2e783fcd443fc636e2b0096ed0b6fd147c41fe27aeefe4ee068030ea73310eb1ee0a9cb1af1fcf7805d83ac1461392e060cbc92836b2ef12fcdfcd1e726c32a8f4c99cf493fb13a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (162, '{"ob": ["15151515f6eeee98892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958b707fdae30e4537df586bccb52a9b18b599bb274f6060d65e655c513276d0df6019091ad9cb5fa4cf7679b5326e0fd940850e68510814a58e62f2a600a01a2a2587a936758d8ce7ed00d3e38dc75fb24628b35467e2ae3087a328609e6b82be98f13664d661bee2b3a5ed40f6be45a4d10587161609091d2c3b40a8abc2bbdf1ecd71b58db91148059db81498af088035879d8343fc71716c09a8985cabfcbcab29e26ff43f269417a9a347b2038f7302bfcc533f7883a5d2450204ada1f83fc0a9203f1d12f0dbd0d4a07f2a3107d40f74992a45e21c133a88fc7afc64c5c5ae9e5a7cc1048482a5995b4c0382c38ce5acacca1a9814ee0ccd764f544ede7afffc4f8be7f7343d06f88f060afb99496a1a17723b7194afb372f1c61d046e9f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (163, '{"ob": ["15151515f6eeee2d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952b1ecbf015282bf469a285989e66926763faae56f87b7c8012a53a9b98461d3cc9c9164140829a772b6d17fde3539e2dd1535b8469de6f6b7e58eae5313b2b92699f671df3db138630a960388aad081d10dcbfb3c92bc3f788ecb32b9bf501b4be57af9b980ec281d6c9242b9952449ce3035fd31d6d3fbae582c968cd6c63433f0ebe4605692976095aad60a486feddd335ddbd485c1168097d1becc26aeb439f553912bf95940574e11196542119d900db24b3f8d27404e705b4522fd7a39768843843492d25c9418083a3464e641b04f87f3aee656e216819ac527ecedeea2080bcd90d618b7d6cee236ce3a713f47e828baf00dcee20e4886557b7d25e1bd62d9a6f6bcd87a7eda56659f3011970e0f988650f20cb29ac7d6abbecdae916"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (164, '{"ob": ["15151515f6eeeeaa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459583844f0cee1003907adc8084df769a03182da5bd8cea9599eb6af609eb2ae8c8181047e93e045d8973e76492f7aed660494f0b5093d892199e26cfe1e00f3a4aee2b1ffb9e1fc73fcb6c9efce3dee933c8b2c25ffc54d4cffcaf33228fe73fc02fd44db9c41de725a3017df9fb1dbaa011b42a48e2f3403596a04c7400671c3815fc3a61d48b00e6e3ca382db9bfddf69fd16df6af0c73d265ec5b918db0f7c09eb87c214976da4fd18409b2a4944de2801b5b452aa4e74463b0efb7bbd09d2acb5cf877e16ab38ec86247532d84829ddef46d2763534813b0cf3cbcd9d3efd0f832b9dcc4f066eedab71d61beb1e30f474a7265c30c4974268e22ede7c4df1868be382ace16d15ad20c6a892c69146d1b24e8857ff39bb33b592ac13e7e208c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (165, '{"ob": ["15151515f6eeeee8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ad5209d441b6e02e0c662d9368027cc619253313778324dfe634b6a7c9b2045a4f20217ac2e6ab9dc21120be071ee04efeba270ffd920b446496bd3612ad129e1ddf9cde2eb6ac743630c9b9c862c33b768903542d81784c3940f2957017ff8fb53a88cabb21f204cd08664c1a56cebd38b70e9039ad274069b00034d8dbc6054a8730147ec654e637607c366d3ce88642eac2e161f759a763e8430cd82b425d33ac4d2fae81924c49d05dc8554130190f63926ed354247dc5672f793a24c851bd0a898d314422419c1bffaad3fe58b7fc9938e344a55a64624dad459031142349af870b753d11f8b5edcac46e594079f8d82fd547f292b385ac1ec2a2906275c5f8aeae379a94daa7027bbd7a62ae3dbf6c14e83f8c254c256ddfb195a94f09"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (166, '{"ob": ["15151515f6eeee6e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ddef0bfa6be7224a0802d6fcd72a9c0090af4c3df68244af6a3481aa1f07181cb440297bb24e11d62d66e96d4d6ad732691e41184dbb508da0466a7fdab1a49ca2889c3e9c0afd067f0fc6844910157a43387e779daa9c6305568c41366df0cfd021720ef1fa04a4fe0d74c66a915b61266dd5efb23f0e556f4850ee8a2be49ace9e2f9a99e54c3bd2890f033ca555b15e6bed1557d831449465506412291358471474f4c518fe49d1627f66d43451e1542732785a62d67eb0b80ee301bc4a2d31d99bf0a077a178c485061887efb3bbc0d1dab0d4b9dfc8493c7eac821253111f3dde3688c0edf115b30650ed84ba5b39540e3f661b92aa57d30b33dff2c0a7e165d406b2c80842bba2cc3c5149a64021cbb1c54ceb474f5cfc147c2307bfa3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (167, '{"ob": ["15151515f6eeee58892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953e9f80a8cf19ba5bddc34e2abd82ff1f89efd6582f64ebdc4af042a6ab6a4164255826a594d721fde47d96ca167c8d05fc572437bc1366821fadfdc803a8b223618ef723b88f39439ac4cbe0f712c92237b4a25d61541a315ac9c4b79d550f924249c81c704817c000f927c7be35c0c1ab328ab0df203d4d558184058a951ee39a242965bacc8438c293dd0d8a60bd0d9ac63ccb6a1a0a73ee93642c86e2cdcda513222e96f1cd97c066440bc2c1fad6804138c16794c3168c7d31a68f07a329bba4d13f7948a093e72e2fede3d525afc559962c6c030f753db3b5c9853ff8aa8f5779badb1fb36056db1170ac79ff866d868e40d070d4eda536c0c226a4cb4866a05ee31205660bdb10f66d02ced38c19f4c6873da8d8ea895d32d659b75b53"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (168, '{"ob": ["15151515f6eeeedd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952f182738405e5f9cc73dd8644fbf398de44f921c1b083f9b7f4cc01f9a0ea1d414eacb82f88ac505bc2f44ba3dfa404c0c183e0f186de20b7ef1f6845f4c3458e733af400cfd1d86d817c643879fb05b37bb4279c3baa45c9daf800df91d13a28ae8567dd1748a562fbaca541588c73c19dd2b6240968ef9ca6bafce475e356e704c1538e5054b5bbf15ed2573a04d358d0aac8222e13d77bbc0ef0ce60749e66013706925652da4e6f3a70460816d5a419ba57aea8e16c6f2e73bb798ae99797e18cf0a18202c16c0fad5cff33123afaceef9f20d447d429389cc3f355b7e30973aca8d2a6be465db9f7dc8764fd755d936c829ca2011eb4c22b60b16687a8477d86e0f4f4632a8f1c360b67e69e900aacee67ad897eb5b4f31affa7e1c9ee1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (169, '{"ob": ["15151515f6eeeec6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595774a4ee724ceb330c2603c699d7779085c59fe92cd6d9d10bdfe3a7f239d41efcfa72a6dfd6f65f3fb8fe7f0ad9620febc1e8b70a2a766b2b36beca5883cbbac00ab8113e7fa7d7449154298812fb450ffac72301cb9bf54dc6e155a3fd7f3d66911e6b20eb1ee59b60ccb3d7567fab9372d4495758ee73aa399efd8793346ffc9217f6d30de80b77216742a2b62e2c77eaa9c1c0c95228710690909b724570532571249b37013872e0ff0ede79619c98f22de625b4c0a252390c4f7c28edbaa9aab567509abc8ea2f24f43a04d4f57104aba47313ba57431a9073479622915bdebd0be2071e79fbb928766da1deef9a13803908ec683dee061d0bb5aa6940e03a382a76543ca30b05ebd5c532c0edb0be8f4f07a1a150de1c25cf87c2247045"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (170, '{"ob": ["15151515f6eeeec9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f0e51f738a9365c09e3712f1f89f44111946da6d2966caa60d4cb970296448e94877ff04ed9bc2282e1548e5e951dca5aed22f0104a30fad16990986339de1e3c10825c302024e267111f6c6618ca9abf43a8fc07006ba6de9bfa2621ef168478ed6e926e059d27288910d1c862056cedc0ae2d807c07e4d948ad2c87383743a4e1634f6c03eb8e0ee34a6efffe37c3f3981bc628867c0bfd19436f22004c7a65a41e19f2c9f0bc13665aee44cc0aad97a1d52d766c7e8a623e2b984ca99b12b5371a7060c81bbfee254163e6e3e66a03c10df618fa580c5c11625f3b34cd7a9848327317a50c3cf82d71652c6ff993bc0b150d1ab54a644c64e5918b73cb777db0962900205564ab88cdfee1a79c365b1525e743c6b8099680819a810f9cb64"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (171, '{"ob": ["15151515f6eeee10892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e40685fe27c30971f8cc02ac660198e41037769270eb2b0c0f47edc2e59c4777be8a28d9ca2a7d30164d971b9cf88803606801e5b0cb0a5372e1a91469bdbaa544bedeb2c3611eeb83f9bbe49da33c0e9b113823b86c0c031772242db7911aa7ec636e844f9de87783a150e5df8d1dc1059c2d21e794472ffb0cae910321e1a6a089179d7c9c9a280f6b6a43ccf49b8c652a99e3600de00b271edeba015d7e3277885175de614c201913c253cadffecfc296da8b7b9a8dbc4ab59dc381ad947fcbeff45fe6697638bf57b0c747f5efe9aeaae9cb306a0da292c8a55c6dc2637d4b2d72876827ca953fa05391da7c12e3090634c335f5cbf16a9f650d6579870d3e87f704820c40ff7d27fbd9a237e8576f5671acfc61deae3dc6e3d624e91077"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (172, '{"ob": ["15151515f6eeee74892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958af6d632afa737695bfcfc8d2657a392fc67f555efa457ead46f23699014e26313b87692a6984397b7f3ed7956dd31347276911beb4eff8477f959c2afcc22f5a47aa29e0e3b6955f8f02da242eadfd096d4ed613ef162e3e6a3d1e187f2f7a02b073b2e5b46134cb4f5aa8d8d4e0a78f76b279b978de66c806015de18d2f12955e512a642c16f8fcb69cc40a40e94f00b04aaf682a43c7f714ba44be001d54da561dd3fe86f937ae39bad7da16a82d6adbca972f0b251708b48d9ec611feb3421edfcc65fbea9e48dcfa89378f0cc025f96dc6e013711f2df48217e5207bca0a09db76ce8ed134e306f018aa8cb23b49836e06e817448a6cb2644e248b527f579a6d94b473c769bbd9a3c14dc8a70506fb982142cc42ae2ad7456123e576a05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (173, '{"ob": ["15151515f6eeeec2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595184e3f2a577c0efa178f9d768779ab378df89d83c9607e0ca46e6ae11fc3eadbf3c5c0d4081d3dd9997854a006a595605a081b9c88d6d2d2b8e05c3dc9ef9d2bc62054da99f098ac2351696a3c43465953020cf681070cfec1746ad8bead605711483c14357f6e00a7829404ef4fed8ab254f87bfcff8a9a431eb42e83b03be6d8b7f837d7e7f8b15774b57d9fc77c82687c2f3f23bc140ff6ef354a40b56aa6f2d882f94f62df470026c654e1dfaa2ac31b66c0c5b6204c51075a33e5436fee913966b39209da0670ff729bdb447bf6c51370a8b2626f35232e2ac8e4b3f2aaf04757bb17a4ed102a4b894df7b01a7e85349ab123b81d1b41056c98f5a11355e9e567a90acc65a8f0055399cfb26560a51aaca451e4d093f1a29048161efc80"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (174, '{"ob": ["15151515f6eeee4a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954e0aacbc56e3bf6271b9d52df06d8875d75346a84b4e8a0ded854bb3bfb1bb146e7e331ad031bc863af001d4f79dcfd62685008a4191ff7f14192a60255f9deaa05cbacc3b8bcb4ef8dd727faac94a363351009cf077970be679c9f5fad58bde79e4496e3bff27c8cc15cb44dd3d52c0b8a9650ad512ef83805def28e51dfbb622e34db4e6da25d4d506c64646d9d33f1047abb8a72025d57ddf909b294c5ec7b61ed952f17a2f28eb256211ae07346ad8f1248f1260754a0865ab44b5cced6e3fe4f67afc783b5cdbddc5e761026215f410514690541abdecd09c60f20176449aeeec4b5ec7ead03bda3300661ef847080b3f33fa978a6d9b1e461566a21b714d280af6726f0bed870da3edcb45cf6dd4b4a72b5211f74705a327686d4723ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (175, '{"ob": ["15151515f6eeeea8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595deb8ff976f14f67396cbddce6b05e9f83c3b616389a20043744332f5d448ef7ca25b4671e7030f5c60af1d495e3c0a3f12cfc991f8bc3d726b0600db8ace012f7545b1a2bb5c1fe04dabe8f58db9fad2d946032c578a71a1006af9ebbafb2c7b48cb8f3ebbdf4b29d0c7b4f5261b06433e6c81f971aebf3825460ae7a187a772c1884d248bce7cae52145c7195dada918e3ef4f81da2b4918d345cc62e7183c6cc46a9b94d3547dea5d84cf2a6eb8567c83efb502c081e784d6deddd008718ddb45622f7c8d7cacbba9db104e7d6bda3ad3477596679e4f99ff46afcab19e792d81aef61f49d1c0ebb50e491edbc7cd4f6beadf64257889dc72a73c9ddb3ba76504c879f7fb2a0e3d4f45e249a8df15e6aa5aad1c5dfdc91849e816bd7bb9e56"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (176, '{"ob": ["15151515f6eeee64892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c10a9f2ece1ed54ac605d7154ff410778d45fc545ce354aefe473b3d952fa3a966be36315a0266dd179d9b02d4ce25544bfc80ceb52666fca9ca2abda0109687e51f6447b20abae8097187bda369159e01824eab77e0ed7782485a2def0e59e6cd478542a90fbaac866b9ba9f280c3a85ac650f6e6454d3f2259d2e8d4ecab15009409fbe8f738471cf46d3dc86bd4c69a130ddb81b68ac170540d2234257513b0d1cc6f8b97ef9531e1212ac6a6e594c6a4fde32bbaf72f3d5fc88633b9e7852d376e92892d1644ee380fb44be8a6bc7408122015e9e3a1398961b3139994a61b459fd8b7a877ffbb448c87556cde8d3f70ff7d7779c69bf0b10761d0d1cc816b8f3e339837a1848723406b4955666d14d1634f7644147691e367d2b14a6e95"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (177, '{"ob": ["15151515f6eeee13892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a1829778ae2dbdc6fd38158a11b61d692883ccc9b4257cce7818b8c79a19bc9432e074ce758c29c290c04fdfc2030ec04fa875c3578e86f5f7663dd4e12d6f293560e5d326f33e0e52d8ba338e8721a6831d37a82e25082fade6f9e4b832b062410edb6d60d4dacd77437853f7489799b177effd564c241c336790d00178a0e44f7dc4b9858c24bcc765f7e3a6f280b62b94dc3adc1a9bcdc863f29c5207ab8bcf9c25bf77373c366acfa2ed0574df8c36d00df13c66dcb50439cb0cb7687864aaa9d309731af9e661b9cb14ace8703b361f836e58dc8a0a75224fc3d24f769919447ade4231a151668061d532c3468db052826dd3c502dfaaa87aadfbcbfc87aaf99ab51026771ba82acc6924c6482db109705791db6438d54a504024a65562"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (178, '{"ob": ["15151515f6eeeefd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959920ff923e212119b4d9e27b119636d95afcf09cb57e2c54cc1416f09e8021a7720f6c0eb7fa41b549bbcd82ef1111531c15b1bee3d3f077eedd104e90b322c7a11d9201c85610c6ba48139e041daa837839f300be1317d6f648d808c08d6caf01876ac6ea4ae165631e93d63be1e387cdb04bce829424fa08fcc6e79ade0a5b9671e99be009b301b219255e812dd8d256572ed7e558f64e0719ae1e4e73d3208052760394c7e6b21fb30880d7360efbf0a3a74ce9f599e9b6a3883d2de1a1d59f283445286fd845882edfecf675186402e1b32f0dfc044de410df903f986f11bc29d47e6178848b624395cb527063a8bc14ec3d8e52fd3dad5206daa027981310ce09d1780e8f0942d7e967f88093d2efeb114ab5175dbc4560f9e7a30b6a42"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (179, '{"ob": ["15151515f6eeee1e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bfc2eb07c5076ba7f54f1f41d501dbc7ef0ea2fa73c3befafa8af867a3657ca3e9815743af2d7cb8ac09ddcf889c4f103c0cd8a2b3268fab2dd7089109d4c9df00c9e066dff187b70b7ee97f9c2c8c3a4b6629e228ec67a39d13f1ebdc747dfd515661c9c251ffcd590d96c1684bb4a197700b841d370c97b9a0ef0324863282508e8abb2298ca9236c6063edceed0597d7ce85483400b642b04319e9d0aff331d1f96d5209db0380a78ecb4a26090a24ab7b066fc359444772e009ab090f29a2e1b3d51e8b458164a4f2c2e6f60c9cfd5f6f76a903c4f36cbc7b372ec421944940673d3450c7f780158b2c583296eea3239290cd57b4f0c25598a4a8e1fe7ce1f1f08e25c7fd80af7c6969aca466a177de03f38ce9be0725ad82b06a7cb7ae9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (180, '{"ob": ["15151515f6eeee37892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954c7c82a060d26e0319c5164ad18ea2dcb67ff4b0880d2f1c6d466d422327179b1d97123444158e08d78b3fa9a9e26add0eed0a75f0ae3600ee098de7de00a9e92098462ee6f7cba5cced832727c5e011a6047f21497833b82a5fc14cfc0f4f1e547b6aea622b6c103f3eec99939e5447922733648b9d3ecae27fefacbe8bc3358ef407986ca565731efd2b97a2f12dcf220c8760924308e533263160148d1aecb97b0bd0c0b83f2c442f5637872a976e43529fb3bfb04c18f57d076ef1d9ba77f00aabf57fe1910320772b2be23c459b3dfd33da66a7f163c3870a021eed041672d82bddf80e4d40c6938e49bce9d804a930ffeeb001dcebe01e6d7c7992ab90d5d3c7e4b9f6816a8ccc85d135535baea4f9fd02eaac0006e94bafae9ef9d7c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (181, '{"ob": ["15151515f6eeee9e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595591bb851033682a1774e74afbccc2af043482f3adefe065ee4be3f24992f57eeb11f6e8b546c934e0053e76cacf53c52a9c3a83edfdbc9d4817a6ddb0be573c6bbf2888db64daf96299a1b1e166c58c19c19200ee5ed75419f5c180e3513e5c8d76e5dfc0d444865048c89d857e790bbe721d7bfb7f6c58a5f9804e982d7ab3c5672eed3703c8defb1d41588e196e658fb838701752e11dc0b68bf966053370fdde0fea7cf3f1c22c0b6c8ebb7ca980063f72656705ad52987cf1b16fe3ac8c122727235fd52aaf44deb28e02662654a6dc98afe32fd4dd6672caef28975174abce5b9902ae0ff7cce36b8c26f007bbb6f5f39ea88d7fc7691d75c1a08f502019a878e05746e1c535ff9dcc9ea77eeaf87cf533a712f35fd2aeb776fa6172b94"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (182, '{"ob": ["15151515f6eeee5e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d06d8a4ae7adc04b4bc40b84183ec71535f07ab3ac639e2c9c87d072bc6d79caa4b0a4e33bd6f453c84022e2b1564b5e56c2bbe33bc2ddde87fc57f537b43cf314168b70e953d54a5213babfaa74b71c16c5609bea7ad71abde8d1140085c5660a6b3cb614237c9483b414ef436c3d056ef05024add0def78980a3b8d3a9276b01bee9f9e7f9eed6f3c9845f98c4ab41c4328df9b88fc880c15007cfd5de8beba25f0f55e3a9bada6cb95b8de668a91f546bb1e942201b134ae0d77f3e2c590ee693eebb4e20be7c140b4bf4b58f1353c4bf3a18e5f7fd3885be6a4a5af87ec8094ad1e4c56ea2e344457167d9d33f676b70cbb589fc0fa1c02506d3c4143858278ec960d2e6963625105e9fb3e1299841e730a99fff6745d046bf8e6a3829eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (183, '{"ob": ["15151515f6eeeeb6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954972efcc1a7376de19f6b2eaf76cf9ffd61fa6e490c46ed7617d22917deb0fdd2f7e4662b33f4e3af8af139bf8477f0d32288cf6d00612b1860aefbdbf20b8efee9df84a81000a7c861783354174f6ff1a0743c04c1f2ccdce00215a3955600908fe61839b5e58a0613d4560796a2adeac8bbdc63f5fda5b8d42799bc48c099d0569bb4fb7496df501532a09ad6528a6022a0f2a32ce3655ab91b5f9c217f5da6e6a3db3505572eb3ef77e5e2de7b284eeb473358b3057a6f4d8eb2e423caa326938d1fe037e60a073283681e5b2f6586147ccde12965763f7fa410b4004502229b3434471a76c7e09a5a9cab47ab330fa62604866fd2230b1b8027e5f8bc6b968428c2dbcbcfdcf0073b183f6e41541c89f04156846549d128615d8696f6695"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (184, '{"ob": ["15151515f6eeee86892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c30afa9a0a241894239bb055df80ca32c786256b5b17cb97defa6dafb5cdabab6481b8c996aed5b4bfa059c7f4c13d5f0d7bb5bfdf0661211d6c89efcb1ef14b44952ea824fa922ef21cd555cbbe5c197917be26e29399e8c659ab50e9870b9c6929d6c868bc86c69bfc3e2048edc73477b4d0092ab10168f6912b387d1f7aed026b0131422a7b1256376183183b6971c0f6c8662b53b0bb297f9f0dac1433329fac3013267edc6c15755063ec88d20c3a77df6f215dbc95676ca83b731a5d9cf5cd6dbaf8d2f0465c2aea1618cf55902803fe76614d9c0bf2113831cad79d2f8c16f1b526ba182fa06fe2d927e30bdca56499cc8dea9419dc7ee07760f2141813b9f072144051b95daae8ec4ce684f8cfdad81183e9953ceee270649edddb3a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (185, '{"ob": ["15151515f6eeeed4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b63b6f8e220e0f9e8d8209a7286647673cc6118e56c53852657b5e7f96966902789e06b918ccef89e28023929b04122c7ba4b3db938d41a963962ab784c89ab262bc60eacb420417c54b04d5c353108c2ef8a2784212ade37a37ead08cb4c4cd7e8bbfbc975b7ad6164a8a965ad2a41a13da9dc6169d49f6b7c630f695408852e89bf24e69363ac2daf4c87c161a0413b2ce13f9a8252063dce6b71a230ac902fa77b07f20edbe5937acfc9f579b3eaf96d95bcf8f2445470b8637e2e3ae9776caa43792518374a46362a5387cfe99f1bb6f648d735edcce46cb209f9396113bd0aea48b475270cbfb6b8c1ed59718f41a36dceef1831b48869f7d412dc09773aa0714f46362f1cbd4da793d53fd192a2d99d18b7db7e47c692d9e43d8cefd8c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (186, '{"ob": ["15151515f6eeee15892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d03750c003b0ee6c69dacf1a18efcbb39570024c33e1963fb5fe1641346dad6e4fec0871a1e465da8e97925881872731bbea30dd3f42de8b1827a58e5db5ca67a92759f840cceccfb712a27e1d8b4d0127dc481c3b08c9e19b8075a457f37b3b27ec148c730b82d6af84f9a0e42df3767900d9a89aaa17f2c79bbf0585d20ed06b6e9f99cc166a0c074ed49fb5b27a3bae3515efc661f7fbcf3803f512644cc43d49f65650e7d3b9da0015afcb20ffa56b95cfeff22911ab2690c52b91af0fbc96d5acec79170e79cddf927b6b934fa57439891a560501d292b8dd2b22485d19c9e0d3ad1c46e8e788681d4966e89e920bd20bbf0ea0218fadb1cf727aa5bbd9b4476ed2f14dc2d9bed8730a2c46d329e00a83d6939e5f9f2daacf2d7990f54d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (187, '{"ob": ["15151515f6eeeee1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595475bd419bacde493c98b73ba43d259c6d8942aecccc63f36885e1d1c06b0104bced99dd95396f5d300e00f7a84918dff2eb256ff3013b1fb4d8d48167d6bdb00f606907ab20f7fd9c482996c5af6533830df382d5febc879b457347b7fcab696f88425d02847832d78e4afcf2aac66b394eb76eb7d7ce3b77770505de652b3f7c69127d463a9a3d2e6fe1df5a7c1f9f82aef18543f47ddab9a89b13d7f2fcce105a4dd794ab353796fcc538e07e5cad1056e4f04fd0292daa8d3b9b7ceb295085586ebdc895219ae2002d1300a0e109d5de6b1a716e2341d8d7ee082351494c2eb94096d889d42ffd659e19b7dd838931549c2d34f4f4da236e1402e8ed8efef849efa335ff88b966b4897ac633ddc56edf585458d870c76d86a4a656f904da8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (188, '{"ob": ["15151515f6eeee6c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459511c77aeec739b1d69a5cafcdd8835a828c923be55525aefa60294eee0774391d4f78ae827f2b2ff0d91907891eddcce5308604629dc0b956beb4f62cd082ef807bed09fda642f3b1455359b828b3107fc12c4d3c2dd62dfe6a9d1f6a5ee56cc5260effe182894ec7e722a0d0aa89ae679c0abf66f0b6e50de5ef25b1f8c7b7acce424c8fa5142ab0d713816d01fbe95cfcab0ff0b45084c8cc6eccf796a90b2e7b5cfca260e029aa66bde9ee6330ff1672def5bd33d577d8954cc114daaf6d7b78567d8fb3d583fcb893832680a951739553b6591869ff8040fe50794def2b7cfc47ffa18ddda87bc3136e602b31af2127fdf4e968f910dfd1f50b86b5a8ca775b109fbb0bbc9c2c40a4f7e69e71c13fefde4777f5e7f5a5acd478d674d10406"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (189, '{"ob": ["15151515f6eeeeda892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955f02b2a7caa6e4e2d4fb601521aa8c64e67d0ac850da905c2e70e4a7811c0eea4f3b957f6e31c512498378243d62a7ea909fa062ec895821d3f101c9f9cc5d03d9142c2833a8408e24205bc923ac24028187232e780aa60c54188ca7c49661ffa65a628ff1f4fe92d0798bfef9f020b605318edfd33731836e076fe10cd919ffdc4da88c16c9c4384cc7c5fbb6489fb6ffb069f0b4af5b2e8b265e037f784e0666815b7e69e22a253fd216c660203bda2cb3f990fe2c6e4f33434ae64f4d493ac89d88728927081c2fe2997da0613df531989fb77cfeab90961b545b0676ac30aa0d9ab84810d5b15097a3a3f36cf7e392c3480e14699e22c546505e5fd4a4ef2b2cca4a4916f5734e56a6f0c38be08a0b0b810a14cb53760c78ea192dcddeae"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (190, '{"ob": ["15151515f6eeee5c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b23b00e94bf2305b1c2d5642cd30f435401dcf5af32bba979b17b88877b41dd8c9c6d7c9b7a91ee75546db70fc05e4b3b11f2e1c78a8334c27e476cf5ab740614c92614820266bda94e867bbfee1ee7e3e6b3e6461c48cab707fcd066271ba35ad5774160e0f9bf93fc66e03ccbc9c508fad8d9b13b869e778e04b6f487aa96f5f77ea6f20674866cf93b1c13911919787ad7de50dee5c8894081ce4d5c81efac634805f57daa4af4457e0c221d28a542173dc6a83b56c7e7907a352c0e6dac7f7393373d274046a5204abbadd018babb788e0f0d56f2d840aa73a0c1acd06e51419b42bb00e16315983dae1edd624a287b91688bc30dae20c8caf33edb423b9ef6b80b8abe03d64e9e3ee7486e4e4dbc170dbe68927bac84414e4dd93c6a1e7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (191, '{"ob": ["15151515f6eeeee2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951158ff8cf4115c0601a8ecd92d27ff055893a72ae98d427e8549d3c7b7b9630331546fdd648c299bc11ebf7e4b0f2935a5911c41a82fa60955ed92d7de37847ab6bbb819f0d2abcd2cf1eb714a6b219513458a259a6686570773d0aefc9c6ae11f4fa835683b7b5ec8bcbcb39bfefdc153cf6e772ee8defcc09bf44fbf906a8cfc43d8f835bf9e642c816d06a80aee131a6d8dab8c9b0365f3f5c883f6274cbd0fe3c7c5422f964c33d058b77624b1ce9119af5d39d66d5a288cb36ef7b651403f9aef67e864c6bb29124d0aedf964c19251d8ca6e38aef098829770db261f1e132a2ba15682dd7f9787c0c7821de2441666d2671afe2fa0a7e9921087b8e11d6a2aa17b1e45eab6dcccd5e0339a283e936148abfc3dec46b926605b707ba49d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (192, '{"ob": ["15151515f6eeee87892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955f0ef344b9336527ffd371dc7be36cdf5d42a2f330fa5a28a4a237eded4fd99c9575f25e389beebb794c2daba548880b5628050361780734599a2b7edae7b303c499f38e971ffdbc6939e82646351ec34397b8cc429f25d9243abb82b66ab554e6b91fd9c94e3986e6127d9eae7acaf5499e8baa007d49acac78004ee0802a33640d621a79ba84d09679fab808a6f53aae308ee7eb3f5200fdae54b99c995e5fd70854a8f0df15a6818bf135bfdc279190ca835c278ceb8897ed887792cb25ea6d9af31b27d38a510a3b7094d0073891bd753b77b3c4c7b0be1a101e1fc8560c66a3a4a5dd6a8cc1e514340b6fb1217e720bc9b34bc0579d318b05e158007d1ce111740ce420ea19f0cb8cbbd9b19f00ca25877ec3d9cf3183b5556a7b04bde7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (193, '{"ob": ["15151515f6eeeeca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f84fb9ecfc81e4504c15f53f1c08e16daf769e0f07006b6d7eddd7e1a49f84f6fcd837772295d7d33d7b5581d07442ffedd2569394912fc46ddbdbd9dffcf29d964d1c29b0734caf621f6e62d79f93e45363d5153893f9ca31fb24eb2508eb992f7b937bbc4eb772400d69b9b3854aef82b17bb616109aeeaba3c2b81ece6c37f4045c10d4409a00965ddd145854d331e43b29a35d98e8745d6ceb61b1947369f0dd47f3a6418ecff2cd3ba8b49fe4f5bb3b066ee48edfbf5711f5e5a8486f0ee37f1145eb6f5a9908603330c7f3e09795ca386840f6cb3867138452a815f2b1520dfe7777a6191dc7d0da3a51aa713aa09924402d74c8401cd0268b1ee5effc500226dadabfb5e7589e0f55ca2087c1b7d1a4f7ab938a6316d3d64c6fb16da4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (194, '{"ob": ["15151515f6eeeeb1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d837ad233e359390f761a9c9678f849bfc282e5d71bb51f19168339ed1a604d3eeb3ebb75fd7ea9213003edd8a7c0b5d66273c90041c1b003d5a26da2cc68be6c7be365714957f7e7eae7f6a105cdeff8eb3ebe14c7153ec08546b5dd3c1c58108063fead728006f9f3512448294e2b77a78e1a6317a50b23c0aff74473e26d597611cc77784c116c343e0773a706fe367de5a821c47b21f751dbbda4ccabdd11d7e712c411884b8041a5ca8077089136e5ff15fd95afb5be877d75550569d45d5f0e2d1c8a4f5b4e77705ca7f1342d1404d12419c9ba3eeb0b02e95106adbe04a01de5db66464d9b902200509b066559c4ad7b1a7e5cb530cd032cd2814856bc605dbdb7a9ca7cfb852cca0e0d2e334c8a1c21ff361e1b4d539816b3f26daeb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (195, '{"ob": ["15151515f6eeeef2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459537c8138d06100b7b27a702a2207d13853ea57cd0d22c76fa552461e6b50b334443eb8a50078bb478fca0ca1bd9f3e5f3235d4cee97f8034e3940a6ed6b3390899d8d9367860c72eee7794eaccc08b395e05096321344e13c131fec305906d64404013a57f747b8f57a6032765d739937f07ccf1344983ed8eba7b84f0149bcfa29620c327331b79fce70b218592904ffd6cf5f8684f66dbe99111e8a182ea4d690d4d093c2a574ff1a54ca1c58a7ae9880ec967bbf666bf9be8311d8a930d73811675985c3c4e5251adbca59b9a7f60dc9cad166ebeaf2f1d274ef431356deb450c708b8b3dbdc393d057b4e51b4a970159f34f83bc9b2e4bd67fed80d6482e37e75211fc8ac76459e491a2c1bd157d51fbdef2b49c12978c1919065bf04c095"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (196, '{"ob": ["15151515f6eeee7b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bb4c30b53e54429be19f5e9411411ed6732f9657c6173fc79932e53d46d0bf78ea287d680d5545bbbf299a2e053449e2d861297c915a21b05776f0a12a683600d28aee885e7ec4bb81cb78fd668fc4a7bd92880bf877e64cc866d94622d6812e02d2e954355908654e04b3c521335dd564910f8c3e547d208b126e1f781aa57cca1cfdba3fd93ae6b628052dacf23f9ddcb54116c05437f5c9902582ac5127f231385c371da3f853b6a32e566dcde0e1b9417a8946547c8df98072031d8ba2e90ceab4d2a007cf0321b64725a78ce1b6ef82bcf9a0ec56b79d3a4cad52b95c897f5bfd4c6cec0aeb0e4ea49d6b0aef6d677f1224411ebc74088f62e8cc4cbe73fd08f05a3186fe8d57898fd95ce109c2b373d9a662089db309234ef1bc9f9cef"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (197, '{"ob": ["15151515f6eeeee7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595990e4c0fed2d2a5e24759210215f3433fe17a5d3f3d89bd58a83e2ccb4e917d209b3e704e498383a2c8ac802d9af5442d6f8d53b821acf0c9368e7442773610a92c6e9f86d9ee7f6b165989c8c8e629a73270d6f1f858a9d74af6ed13d1cbaef3850b63379e3fb553322d8540ddf0429603c8a116251aa54f8efc101fe4a63e3d87e445f2b126aa4210d928d172f97b437314252875ffee2fde5f1cc18bf5833353057b6c1906140a81ee4dd01f99649e43cb019a93b87b9838757dce5ec0b08270a987253f70d2e2e2ef54721d618c2f1f70c90eb5de2a7e6d87525f9d3af04c376345d948737a5f371dcd4ba9b15c84df18015d2fbfebfc6b2c680dcdbc3317066b97309b1ec14117373a6e1f88d857fb0d501e8d5dd71ed927472336eacbb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (198, '{"ob": ["15151515f6eeee34892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459513dcc1ffc55786ae1592b3a8ec2dea80415cd46ecab20b372e44365a8c18fa9a5c4820c136ccda300e62a26c7fe87475fc228d5af587604e0a22b23bbb0f390aff854156870ffd4111e251a45aac6709eb5ed8ceeb90db8458150e3675b16d3dea4fb29672841ebf4024335d987336053f3d5b6f17b0237f80e095ed6c4daa832df8008038d4fefdb0871638885efa8a00b4fd68fb28c8aa1fd66f5dcd1e7cb1e7cc30639a4d1618e797b316d1230dfe317cd1de9ed7e83176da2715810fe15226dbbbdb5121ee3537b8671f28a71ddf56980756260b7a5410b348be71b1ac74da949917e24db5eba1b59469040e1e470e63326f27bf5ff3248be899c948bd2c3a961c45e5b127a9025d93792fd4d1fa431f233ea4290f9a0f292ae527b22e62"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (199, '{"ob": ["15151515f6eeee52892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953240ed15294ae5096a2bdb65536196496c8add123a1a73de21aee5c8dfdcab6d29c8b6501c3e3b72fa362a943ee9f939a935fc37b1e1d0e2d56f177c242ea225aa98c4188193cb4f4d5dd87e9b18a5d57da8424eaaa4da0e46bbed1a011f76d4df1e1893e691de77da4754b6dcc32475311f342f792d5a652120cf7e914139cd23d9e4cc91ba46c7b46338543fcbc3ed4c8e3e11bf743216f1fcc1f26a935545f73548f931b56a5a77554845cea9d3e0cf4f1f7ec06694f3454ab90e5ad7b9eb1ad083251ddf720c5ac1bca686c3e1863e5cdcb755bfa9ca1d5ffae865b52f4e4f391c7fddf9fd3de2c1bde59fbb5549904428fa3ae93872f05b48b125a0c818148b68e1e54fa3bc81b56bf5e857de35a5dc743f59322fc79f00280d36f46bc8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (200, '{"ob": ["15151515f6eeee85892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459540935168931b41fbf3e30bf0d91a4ae1b121082313832dbd726bf5b3ac794950592713e376fd813148b23d7c92b03ddf1db4cd742ec172e22343e390cb55cf621e185ea6f430f05b9356e934c3d97df1a70ba1b949db891e7ca759e146f317d7074fc868e619365617e62252610bfb4a973937cc7fff3336adb743dac49fbbeef8607fcb52e45fd03754e8350a490d6088ed771a3707ecc9e7d26a34bcbc21debf4eb36175c84ed1bba38e851807a224d217fab7f28f893e4a65517024dfc82278f93b1078fe7750a80c8927653bba87e96cf6c3ad210525a12e4ac073fc7eb51de3597322d4e3042521114e9cbaf84c546c7e69a5f8f4ad841281e89d914c6e797375807857cf7bd89dacfcac2065cb9764ff55bb522df3134dd1a76fc8fd87"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (201, '{"ob": ["15151515f6eeee3a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954ec0a5793fc654df093405a1f4058194f92afaa413374ef692b53ce8f318635a5370bd1748af4e20e7db5f36e8a84b8bb6deaee24dc16e0d9ba2ab62a62fa29f4925aafce6032d025cca28d6faee4c399fba2a4dc5e59ca0f4bb9d049e1971b0e0fed9a244477e0340947bc18b907a0d90faeba6bf24b0f62a67fb0c71712c1d1b791c072219a7b81e463f797ea182f4206f0434f7783a80f83c00bac105ef2778bb0726846345b0e5faab6925fcc4d35f0117894962073dd16b10481ce724b95c73d044ed525ed2e1ce717563b224dac75bc7cb066bcb3e134b530a47b805d6c33a9f88fd6b2de9ef2dade53aa68bebe102a27c4ee72ea1d623ac3227a36be85f58b7ea992ab37d36320afd8888849e00ff769a96e9ed3dbf3e851ed4ac2a80"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (202, '{"ob": ["15151515f6eeee4f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958f8fc9253df1a0bd9cb2b5c8c8ac24226ac2673946ba701c7c440b95a3bea04897ae5f785053f640b4d1d6c0287ff799f4de3616fd7178c1747883ca26af8526f8c2dbf6f5a2e042768282d0ce27fd57d03c2eef729e361cc75132493e2ce99a99d3b0663df4bcd93e11c7e933d6dcb054616764bbebaaa86337a5286eeddc970719afb31b497456659e6afeff98a1edd7de48e6d3dfc3ad8b1da3820fa0c3b431e1a08932b987e9968fa95b7bafa75dc8a551311b14bf0567a422ede2e90890b26e3461d2130e9149bfd97669879f5a9d13fd2d8ef1b68d5f2431a82afe0f884d08360fe7d032b71758aebc89498403d2b584b491e01343171c3a94660e69621a78519fb49fc19ee6cd37fecbfd5c173e8532e2b4047b6a6d3fd36bf1c5622f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (203, '{"ob": ["15151515f6eeee6f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459522eff2c7ffc4fba1fc7439369b16b94b9de6b668acc807e70ac0c24eb8688e446160b43a5277675232ece1e6bf78290d11fd373c5f4b6f7c6067b6b3180e3a6f7b441a3adb68847a64f4485b529508e9d4949b2e412939a017b86efd55501b2242c298df7134cc092debdcf3b73796f0b9b060f938f5881356691eca270ea39311c00c83dfa0b19873bf5ce2bbe44ed7009e8a9ecff0652aa68b391e525d312e01b209946dc3fb71220f9212c063e49248ede7562a27acc4ce2b9c190150d0b6ac7af523f1a70ea678607aaf03c4d303c6e6c6d2fb427788e4bf3804c773350c431a1b28ce61672ba80800bd9c1f4dce63acb0c5fd9ca90ab089f4b2eabd4b05ede8d89966ee61976cda9fec33429df35551d3ebfe3a4a7f01339faf4356f0e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (204, '{"ob": ["15151515f6eeee11892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459587674e8f4e998e1cd201c675d102025d1f9fc672e434ec8b3dcd0dd49b722e542ee1254dfdb9626d946a3f22766389d20ec8c1089623703698667a30fef89df8f1b64cacbcb784091a0df78000b1e8275b2f521a3ba4ca8450d38909c2ddaaa1a2fa3eb23da3f5da3781754d1e8bf44c9823c9abfb12eeae34656dcfae96b788163f1f093cdac2d7db8d57d039c40fa83b9aab5e323a5ebbd8c052ae99def2b7f4ec0d16a2454be7dc316c561d7e271c43ebcd42ccb9cb74032fdc79948cf277eeb236987df173c6c74e91cd83966037584b9df512b716c299de7ae779a60b3532b6f618af4ec8c36aa1546955a24bd08ef58c77c19049d032a94a50b3f6cc12381844709684ffb1bf9531790b5fd1d2b5fe55878edadbca32f13bcc2c9c2b10"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (205, '{"ob": ["15151515f6eeee94892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459584a5d69eabb489ac8c8e2aec93daddc0909e25fd8c4bf7f8a4b11ede721c0271a8532fdf89843710cffec682f9933c55c1df83dd3d394e2095e6548e722ae441f41a2cca9ec01818075c93fb18d8d3ea4f775fb18c9de341b334f2047d2af07f42f434fd65de93c6cc71c57157fe5beefef50ec79550ec13009324365f52a02c2c3be13bd89a3f41085b141b20d93fa3c5003fdd6ef3b018fa4593c0d60cb61106f45419fd374ee6d5712885fc424f4d493c2d53a52c9a9836a55ad25c3d3f07961e5bace7fa51a2aaae4c106d80a98aadbbd771ddf405701ad6c4097178c4be22dc0a5a645f10413e2feedbb98f448b46205a94d735f4ada345768a6bb2b7253c78d8bb2e57591b519ae0e1c9891a88c1b61fff97ab20439df8b47b02bb16c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (206, '{"ob": ["15151515f6eeee32892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459533a0441c8f44946e3cd19b8283fc95064302cee3515c5cc90fad14727d073648b9793294c1c7ff6a31f2edbe94f40b354d9ad2a9fb3532fa28e77777b2ee354aa5ad08050fb85bce67009592ff37c1db226871dcd74c6591ddbf201e920cb90768c7271bfc9473ae85bc028d2ccbcaca375d496396b0646aa04d41202705fc7e1b60548571e769b8f17b2660202bce6c7d97beeacec3e40e05af881157edcb9566daaa2b26e93e3f8b548df13db585171434de74f434f1e8ac584111c86010b4fcb2e130cd7421dcd99378cb675c75ed9ba191ec1862a9ab4a0ca2614b1525357625c950f63088b96d8732b36464cfc646d80b4cca64e0c0b5dab0acce5f2f41bb81faeec9caa2c1c313e5dcf337ada69ed848e98f6fb737b652bb6f103a19c6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (207, '{"ob": ["15151515f6eeeeac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ab820cf583b705435370afb493a408adb0aca9db88269efdf6ebcd6c84da1d87e185ead82e350c102727e082cf26f52a644ccd1a312f3202ae765f09d0404ee091e2daf493699d510a6b13dc9c533617c2188c19bdc222c13240a805cd1f46449660d51005cc1d2645875064494438f4240a7c848b062e0c7b488e1fa88d677d064ac1853908a0c76d3b86af6032b33caa008cf8107464343078a16b57f6345da2ea9a72ca1b7db4cee200d167b2007d61728d89743cbfb894c742aec2154db1c80664d011d305a5d5ca532c85bd650ab91e0f43c4ffd1a1613368e29a56bd922ead73ef22751871403610c4bfdaf47e46846208ae1c73c70c2aae879badcba1752e511762a89a1837237cfe5eee943e40f17edaf67f6946f4055e1a0a28c3e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (208, '{"ob": ["15151515f6eeeec3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dceccc4c8c8ff9b749a50827764c55be0113a0854a417def8ab9b64525bd0a05baf11953614dc2d3ef866b5e767ddfd48264c18d37549ce7f37d3f8438eb12ce69db1ccd7c760e8cb8b847cec39e58b38588114ed7881910733802c9f911a47a88c2b844b27c86757ab71c144ddf2e1bef8e9bbc1681e2e9a1055141be352effb4e3c0a24bba4910da835eabbb94802d519864f3565c15fc30403dc053dc93dbef8aacecb3937690ce68b6395c73a814503a71eefced361925b021bd4578af7c6bd23458836abde4a9df584e1ff38fbf97f35706798f8d2df181ea3f783e13f319b27360bce13cac19358550fa37aa28fb916ebbdf968206390482f1a8bf33c65b184f992621b54dff09f6bbb1aadca2027dcd447b1f22faf0476c3df57f8602"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (209, '{"ob": ["15151515f6eeee51892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c6176c962e14dab5d0d3584cb4089559a43372ec279a126ee324ae18d61d22904de2b0e31b4eebf6dbfb3b56880f6b31df1619d63b4a24a14e97fc566a2922259130c4615dd3717fc2f5aff75576b9553682a76607497da6f2401f1a9c2940ae51991cbd0193bb66834ea1b43cc6b9781f76aa0f475051525caf58354f39ca3d3c428b1adc48f418c5830ec09a7e79183ef7cc787ffef7dc5258cb479baaeb632a1b223672d39e4c324de95af26e34be7de1e704e92922a857ea3926ba81c6cfd5b7aa824fd69212cdb350d488ed79af8ebb471485fb876158913ef2454a60bbd48d1d77d739f3be41048ff12fe37eaa8221c4b860039fe4c414954a4b95475896f3c440ce7254ecba126415a3dcdff0211f08ac37251ef9ed43de96abcb2eb0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (210, '{"ob": ["15151515f6eeee5a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a1de441090706fed57497367870cb24579e7156022face167e2a581d278efbeec963878a121e91cbb8310949dc6f12ae479763f87482e3e77cc34fe557edf9c49d98f3268e6a064a05bef23f134a43cdeaedbcd400843d2d849f4c47b60032a4a156bb2f225a0f31c19a19e5c77a86b26e9f6e0d8d45a2b0fb7c5dad87dc92584c88f6b4e88156a90d6ba7bfc61d7c43e47c6991a6fba7955ae52670a94af893156e4aad35f7d90bf3282f7b95d3a4b2c958ad15298cacdf35238ed0d3b2a2a044cca3e69fe1cf7ce513de56e4b2b3d0c593073bdd8a3e195e178c41a94aa00bdea0823ad4bb990de23059ba53f3b1fef9711a3899ca22d91023c8d57cafc00032be8ae8407bd88d625fffd1ce7e20cb78850ae40dc318cdf472a16fac7a30ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (211, '{"ob": ["15151515f6eeeebc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595edc4b21040425917576dc0b67cf96ee52aad2f6ec312a0d3fc19fe4d46d1ea01bdd5c4e6bb1d5323718bf60d19c5998c0551b7d6b498a90217fbd7b189e1990a181ca7eecd9f8c210c8954ab35cc11d6ee7217566b9d9790f0a51a1520e694f7921a8e8b6dcbdffedd527c43db0f71e4705bebc279ee395043eab9e6db1461fbf2eea40a29deed8fe49bcb3a6440de8d987eb0f1443c9912995ff245a4e594a01e7d321a51c217091f4eb26ef9534e246e74769269b75d95d24c0d12ce459c1ab3d40ea1e7bec427073edadbf7309500c13a24edb3dd43d96c72c4ce9b5d17ae814b906ae51dc8ffb9f68dd680ef32d1d04d7950ab0c50e8dd2aa8ed36aad1388b6182fc7aabf1e673a3fe5c320df8b06a166c12a841ac924211271934680ee5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (212, '{"ob": ["15151515f6eeee22892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459505d0f4099fe36b28510aff36ceb44db1d7b23142c18e34a5a46e59ef38efe52c3d27f655d4bc5b504d0e3fcb8bc7c2f8f27aaab74b65d58fc6496a6d2825a7d90169c9b8d05c985c7aea088d0e6b83e970b9f1f4e105aa87b43abdc4505761d9d87e914d4c9f8f2a5a39c3a032cc892aaba6092bc55e270a00d75338571e469bb297b8e285c52560b1f0216e1e50ad26997acd55abaae0bcb28963f7e46e4680f0c673a33059887eca37962a953d942ee994b4fcb44e105cb1d123705a646ed28649b44495e04a1e6ca6b219a2f69e45d3ba0680d690ffa7ea3e62cd7a5ac3772a632360228e66cf00a7115c9ab0e9e692249fe21159c9be7a62f6910d556f140d584012b52b33d3b7a9623453eea9e1220983ca833afb3ff070baa94491e761"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (213, '{"ob": ["15151515f6eeeeae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952d9930fb7f009de883c933028d3bd404c03a66e50975da87d27d0a765679de58950366243d6aac04b08a8449682be031032ce37d747cfc171b1551cc2f53d841a1e58a5ecfa6ddf6e8ce1f3961a8ccf1a9b5373bca1bd607f3cb382f390379449365e245a499f539ec3e5cd662a3365e6a639627fb84ef58da2cbadc006ecb799eb25794621d61a3c53a61f52920c699a0020e7a26867897267a8c821b30646f36fedf63f30a377fa560eac78e57e73678f1ca7874a1c8571d94720a6fbfb04f2657e077895e3306d015725f3eed0e364724784c74fc02a399e0049e2f24bddac10661086bee30cc9f0f633e0827c3db7f529063a0df519f6ee0f08082c526bf94fc6aa28047e2e26ecab7b6a5e66c722aeddd57ec79a19d4d16cad1e2f2bf3e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (214, '{"ob": ["15151515f6eeee04892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a86ffe502e6db97f74312454f241c5d664ba2ad97fdb5c69bc19a713698530d49850bf6000f1e6cf7073a0f01e52436569060b4463187b935c21fd47d766e6c5086e2213034540eae55031529fe7a7ad17eca6d57c8ed6e5dea463cb8d5a56a299e99840e9f05129ea4515f09d042c224da972f0c8ff462ba48e3d4c1773522b86c6b3febfb07f46537f5052ec0e8d459fb9249dcfcd6af13000446979d8733841412ae25ce1748d5475619636b688042dc50135edee5235b7812dfe044c7911bfe269f6feba126236c05d91ac99b0be9ac148ea2313c8013c6ff18c5f6d8169eebbbd4f71d100ba422c45775c09f2b1f146e275a10060f40abf29a650618429523cd85f2f85cff7378def9f596e91632c79e9aaf70bc36364b8e3297fcd8f23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (215, '{"ob": ["15151515f6eeeea2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459527188fd70a601ae2d2d97671e096814f3e3e4644e3e54d6895a3c45d5908151680629e42bea36f41da2d935e77fdbb559c9acad605f01c9c6024711cf2811c9eeca5e22835bed83605c31e873cc029028c89c9219ad422ddfed37c3241a74a7222edf9dff1a063ed93ba57454d7e790287827688981bdd5f7359d52d9edd7183a6945775c5dca29839c6f7c8d54005e0cc6491ca50d27f2ef430402d7875e918eeffda9ce278b6524310ae0f4ed3586553bc114e3b411bd44a002b28d56c097091f35f0e4f4661dbf8e9c98bf1f18e460b5445b411ffb5d5fcb3b4b63166e745cea5a0b1076b26b12f420c3faa53cd23d2f8db93bf35a27c251edc9538f3841dc6e5ff37b1373c40db9e1d0200f1d3da94c157e50479302152bfea06cc0ad204"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (216, '{"ob": ["15151515f6eeee33892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bf77b1fc8bb77f62f7d590dd3698ca76ef96076e517252a06fb475e40c4049648af5278c69208606327f700567372833c7ad9045493663483a12dd1d964d88c55734196f59cb11a64b3e373bd825ddae9972c6c5895935497da4ff81f66e3ecec2f5b3b87e834937b50629a03c5cc18f777b32bc9b57c5b9c8b1d18d0363ddf0d0786e2fb0d80984eb0fec9f4704de2996236ed84151abe848197ac4a8347fba56fd9e38ab10547df2b359b0c6b1437b016a33298c74ccf1c3e1db3be77539367377f1376757142a3f95cf41f0ef2b0c2a1e33bb9a025f597049e9820c6904fb1b2acc4e6d459310b1c9ee6580d844c7ec3da27fd6bfd358c5161accf7ec6dfdfe3b6b6e4daa863d8c33ee31472813d112fb80bad0d3a72a2d4cb68bfc1352a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (217, '{"ob": ["15151515f6eeeee3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953d8b556d1b80ed1f53aa84551ae6fbc655d944401891c03dcdd280e0b935b32192fd55cd2134d18e5d7c999830e227b12fbe98ed9ef671598cf4298648137477e5b0d8be377c51df908af0f6abb76b479f0249a6becb707a9857b3c76b3c8c67211b5c895ba284f720b8f926e491f2d5d2524c19513f2f15a1b1d5e97d4a94f20ae998e4ed52633e0725bfe0a15b4619e00d3367245b74da475292225fa5f1652dc01a8ad34a78976e6780a96afc88b87a4a8ec1484e8be71d9db3cf23c782914052422eaefef22e33ce5000007d467f65842c90c203eb53d26caff2f7ba39d29ff1734fe48d8f4b2cbca87600772067c3733b020089e420201fd3f77e3a8d73b2c6e700c169dbdb70ebcc5447b12499d34b57c27395e3a92bcc3add1f3c8aab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (218, '{"ob": ["15151515f6eeeefc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595adb22cc04a3baead80c1e3f08481b0e4809cb5299a9f0017ce39786bc2c7c7cf5a2a5969520bd2a8dcb04c37c79270a1494f29a0e89a9d1c78bf54e166ae2141dba60d5fb01c67606fcb7cddc77362946a7e1e6b02fbf4131e73dfa46d18fed4e340e1b638f9d436a3292caf3c5ac0740fc0aaffac65ef016e3447d3c21716e0b7e65e784a243a3339392a10bc63462232543b98a35b48ea5aa8c8243446b4458ddb1bd8618b547dcef0445c9c8879c0d8a792dd7bb2c3d7238437db330b30286a86677c34e7c458bc332412e5576effe02ac8be3bc0ecabdb009c3553649368d10c335221cc46e6900c91d745021e7af463820cee2cc18d74bc1e4a2c9bdfa2e6300c8ad3ff1be0fcbab907c3e51d9ab74b2d3c3bdef3407bd3daf8dca980c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (219, '{"ob": ["15151515f6eeee3c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459575f3664f0027e5161a6ed0ef0cb678146a2bd237304dd70c2dc4033b8f41be2120350310fdfad2c1eeb12c81fb2fc798cfc7412df0ed66b2ea2b3cdc1755d70f025cf2af4ec3874e7a4465922ad90611ae56f08920657f4926d4765c622518773b0f2dbe208a999d0553b8ffcf5712834e18779b97898ccc0694a4964dbfd43f802ca311a22d775ab167ddd9b4c091d3e41fc74b4c5bae87d361f45bc24a4aa8e816730213d0e2a381de111fd8e0e15f2cfe21565113e014e2d33944b708b2b9a8ae5843471aa25ace30ae8681811d2e10d09c89118acc23150d6518ac90b406093102f15c51336751d1e0deb9979bf741280f4ba26a949a57ad771818693dbc79e500ad99f81a95ca35fd94146833cb4a792426ee0759b3b5cafa1d0ba6486e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (220, '{"ob": ["15151515f6eeeea4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958e65e48512930c256943135def1afcdec2be39cd208bc08313b0e39231ba0c6720cf4e4ce7c31cb6fa599611bf45da11c85abb4f54e7739e4dd66b5e53847095cc38b265484e67da5059722a230e6bf5882cb77d9ae30b2736790cb3ad1dfe91a9309e791facca298fda0378232e1a3358425e77fe535d8dac907dabb7923887e08805e2b76361e78e2d89cd380175c5ba9a0264baf3a60577366e9784f5e77780c355678dc255925412a971b96d11a1fb77f19b6bcec54e1d80d1b2a174942caf009aaf2140f60ac235c4b49737c2ba6fc818dbbe8963310546f7b7b16c5487c7d41cee01391f2a46ba698b398ec8d6dc590fd7c6ba0771390cc6a2e65631f0532176302ee207466564e358f67f74c2af1d2fec4d87a738fd3ea3400136ac37"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (221, '{"ob": ["15151515f6eeee30892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952476f8e24e2e25a8c8f0b9d431c6df0ed7a842d3ba364cb6db786b7dfafd5749b48ba47d04f66e284143a1c6495e2aced891a6e72921832a2ecada8564656aec5575f08a2f67d2867e754d901c44560418c721dfccf321c55605f4349c5b47f65ce9a9de1d6ddd6b8044f4bc8b3976cbb26507339fb356501c816b6357c98ac6e869cfdd9f444051992bb8dde3502809e4f6cb4bdc52ed937e819bed56906b86816c89c07dc0418998275d030760df3a8bf560b05ad2be6859bb761c49ccd88b75b0a527bb2f042b560101b069276369de8830c1379d87c18c00b82fa37df3ddd2f01038edeb07a45d49c8e4b08571bed94b033e2aee8f89f24ce9dbc0c03d5ae0cd853868cb18ac1ea91317ac374404621b4a2989b96a27fab92f8e61b502a6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (222, '{"ob": ["15151515f6eeee69892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952ac454ff2d8f08f4c069434dcba5af185266268cf0a71fa6781696ace23579e0b8063cb9fd4168c81e1733a7569680456850f89c83f29a574cb2f5ffef348a7049be2f5b2b7c56b7327ad75523aee662a60137f344ab1f62f660d7cd6b46a39a642197723f5abd5d92dc1057b82ea4ffca999ec684226ef68adb3bbb612bb0c06f3b104fc1d7a6c841de184773e7ab8796325d13484c7c68186175ee39307c8009102b698f7db3e780b9734e383d5b1315e46f58bb392b1aed51240412797c263a9657d11839e21cbab6fb1945ee7a29498b00f97468315993ea63bca88c9c8d7eb2482a45417e040cac91f1d0e4da8d6d903d79521d1a8eea2e52e9fc803da4241aee0beeb1eedc7a29831037424bf8d33dd79b7510deb18568d8899a8ba13a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (223, '{"ob": ["15151515f6eeeeeb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dd397c0477f94c578a3ef650c7c6688d5bb0e8841e1ee1fa3fabedd7c8fbf448f89bb08bf44c7ea128240a00e110545ea1b5c63feaa28447b2e682d5e75d39415832f20b528770c8bc7ced0d2f9eefd36fde8b821626ed85fc3519b903e8d95d719f7093f0c8b83b679591dbd28ad5d265fd4975c55cb06efe8e221807ae437c6e974e63f1fdf1262507e7b6b440a18320a7c1e500cc1eac33f05e69aa6b326007e633ea07dfb7658e0d2dc429a8abeb31c64cff7eef3c60fbf6941ca18bbbd6786235f946767d74c71440b5085d403dfb3e850038e22cff26a593978161dcde463786597b05146ef2cef410f09fad9e83bed421fc8c13f05433fef871e8ca365485cd32c23d5e21e0dc3c4c78413d565ccf0f06c6d67d36f5a6f3a24a0afb4f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (224, '{"ob": ["15151515f6eeee47892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595829c523d242ad9be80529c8260041b3bdc730509ab935276c7257263685f68a062b6cdede42bca170395a176a6cd00b6765c17c731082472bc3f1084e93c4ac64c8d5ee84c5a168db53804e53b726a4e105c824e32f6b33a6b83bbdcbcfdfaaf24d868d9c361562952afcdeb413c0cdf69ada241a68f55b9c3c3daa49722e01ac4d38881be8599bdf379e798853192c6c39dd078d52ef07620e16bcad357fdb5b78de60b6c4db4584773df0e4749a880ef270aed59c11368da0dd291c1b9d8dd5cd1a0ffc196f5451c782c07f968a1263860c74118ef5c5d56715f353f2b3d729f77ade1d597efc701a998fa3dac0f03f3fadccde82424bdcabf0305a9dfdffd5328bc0dccf594a73c5ddcd2d5c187c9e7f6231d281f2003cd983b0395f4fc88"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (225, '{"ob": ["15151515f6eeeedf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459558e68761a0aa77dedfed497113e14c8dd7c5007796afa394e7c203e5dc76f446e54918f275757e4595f4e6ceb728a244228b66093d01afbec2310df83d42ac08a3780ba8be255e27e976603fc4ca22db8d0535efae1d55fdf2f03c1be0b87569aac9911dd036737713235c0ae8dcdb340a080f168f1612917bbf8e6eeec3fef1890932b721646fe9d38ee0e4132a2ecf5cceabcbe98e4e5a4edea2f04be0321a24512c3433a25e961f23a90d724204b6daec00f0200904dfc1b032e258539af2d6c2bdfe4cbef5142a12dd3a8013a7014832ed8d3ec875326647e2427340dd793d1d8d033d4b643e987aa35abafe6930aef81600faa1b71d44ddee2543ceeb6bf7cc6f76e1c0a877daddf1fc30c4ad7ace1d4d3c092f1c2295787fca11d144e9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (226, '{"ob": ["15151515f6eeeef0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595126c1788a95a820d0e375f437a2fddc1010a34d4db4e1c1f79d89d6736daa1eff2917db0a6c06c457bc82e795a0b93a228a217e72ec1db062c5889543abd2fe9072ee79087f4a481a0d9d32c9b25d34fc99fe68edaa2074d7669796537f1d12837028eb567a017fb472d38788247004dacecd614e8dc63458ad6c43f15ec15626f7ebd08ba0531326f5a4f9097e76f82407fa7192f0067d3bb8bc3672e2cccb15a0ce0c00f4f96adb1b32995e49c05aea2e9f8f66aa5fe0cd469f50b256da31dee711acc455bb487229e7f5187c814735ceb43064eecbb50cac24c4e798e73381d3f4a6cce396966e8a48629182b9785fde22b040b8607b5e878bc4d02243381211c5de373dad311e6ed60e22f11a093df88cef8bd0254706e50db8351998f58"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (227, '{"ob": ["15151515f6eeee19892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956eb136934c40a76745ce0286e1ad21b1df5342ae03860649021c65921673e292361e08b7207e1fd15376658f00e84758ffe8d3f428b61fed6e1caa57761996a5b18834525c5f215f3f04ed12627894e4ad64654023f477c5fba9f4856f66f5d4c6aa70fdedca70778f3150533b55f438651a19c76aa7291b7e2e21db862256537e41841c15547809652d06544095c5073f34617b9cdc52841c972a965def2964d9759fde98b243726115391a9e38569c307728108543d6032698b413ce607b8d14d95c5b84608159eeca055a2cc0a9d53e601d44d231e28187699c73de6b3a16f65887fbadfa3c531fe24f7c16c82e643fc5916c74c9a546959e63d26d2bff3208b50e9cfbb7d8970ee1d30f82eeb7a6d30a2127c58bd88366e4f4fb11c5a468"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (228, '{"ob": ["15151515f6eeee26892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952ef7293b123421d33f1b4de7a06dddf9f9a31a71f8bff9ea4ca7f06c88406bae54eeab29421ec185630ff5a3c237be38a291bfc6e2304100468ef68d0604aa61686dc71c213231a4a790d5c07b789912bf271148635ec76925f69f84c2399e155055af259d284d9439c6e2f26fa4d334255feda94ef1191b3624e7c5c028f4b65bcab4f5e30170979160119b9cb1a2b28d19762d8410f4ee31184ecfe0876a62a42666869643e9746340321d3a404292c1f40d9e16c72a71a3f142109aaa600d6512c2fd674df042b57b8393f25f6f6a6991af4073365e98052f3782aa7646b6f86f202135bd414e1791f07a81002c0f2a9608ee654d862699098d9e072567aedbe756aeefc67577e6467b429b89114870ffaee8b7ba5ae253e893490fdb6b51"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (229, '{"ob": ["15151515f6eeee54892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ad9a3f41d97d500cae1f7c802b120345ae2d22a119dc62a48a0c0a934cc6bbc94c9e69b438c875056be65c6853e53f0a3b63bd946d2f0b60afa7b435440756e2c49cd911267d20a0eb6b5bcb1a8b27832dab72aee741e4f423672b04fc69e81b7485d1c647ba981e55444ecb44ebb4a5e1e7a3a18fe9ae3fca9f9b4a1a36b98580143858e70ff8f6e116a5ed617c13ee83e620f83a3535144af9d29011821ecda30ed5e4a9df826ccb732fd4a04ef28b261d4878c6af0a7f346697adbdcff0c71a6ac803b03556441ce19f8d55eb308f28d9495e092d20923c22b3506550ebf950fef7b825d47b433f47209326129abf5d621b2788b995ccb39e8c49bc451818a33c8fe080d78a11eb1cd6ea885da1dee13cf40fd445eb26aa69c4f95e0a6d6a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (230, '{"ob": ["15151515f6eeee78892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459547bdb506eaeacbf91556333136ea181a6773135c5aa0aa60c1cdca0ebf3c590a025ba56d40baa7dc4ebd7115f44bfc1b9007bde7a00bd2c9f399b95b05b1cfe533b2a0b57bbfc1d15d193b14cc0d43cb6623758e66d1b83834476fe3cfc773c00fc457e0e24a4b23fd333283c0ee8e93a01ca1e2805284561a2135deefb7bcb01f2712eed61f9ac9a58eeefb6ce867fd12906483e47bcdb2841246fde4b922c59dc15bb29ea919d16dcab619b972e657c82504e62722958586f42d8baffa81ce9f70e76967026590cd3ae5899febb452e72b11d3918d6785f644b8fef0e2e165deebcb108f0b5e0a3612fe2ff8ba9c51cac603581a46e0251ee6aef8b6419c0bffb766c5393ba1a2581b172f2dcb69f48a27c60b01c1fad253ce0713ac9921c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (231, '{"ob": ["15151515f6eeee95892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a605d2f5cf3319bddd1e5ad4c8b4d86e82d2e7181f0ae2a2a6063fe27cc4d4a98433dccd1d050ed95505c898a7a78641dd2be987dfbe48a1562e46ca0c1c5de2c91de8483f31c120c32b614dadcf6844a9f83a807a3980f87bdfa12ddf9915fd4943a32233366fe34f0d4ce28721e51d294e83db252162903b3c869e27ba5a3b13155f8d7d1f3eae008741d8164aed9a04ec8658425859770ff51d23f257040118e907ae401bb1164eaa0bc9d46b72bce282bbe630e13acb88361c42bb14438e060df7629316eff13e9d4fbb67e24fa7c86c4eb4a8283972b4173c1e0db2b071ca3f19ad00c1cec1d5ebb820b52c396a7fa268dfec6a189e192cd6e2c25f0b7427324a590a066bbbb898c6baded5542f826ca13d1437a3c13be7d4463be32d8d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (232, '{"ob": ["15151515f6eeeed3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954a1b110fa191705832c1e41b5cc76032b5be28c452e1cf2afa482cb7b07cd4402263bfb3e9c9b741afd9dd17b95475dcdd73f8432760fc0db9220a4a10fd2205c19eaa14292c6895199a88705d5b83f65a695bbc1660990af3ea40b977c095a2531b506d46da085a7e6306b7000fff421a9c95ad4a6f269b7eb9b5b045a4ef0381ee50654c0e7e40daf19dd088ad650cb0ae9ea191268ab4444f183cc6dec5499e14634b4d9bbb18a53bc92a9b86210bf0a59a047cd83a561681ec6135e9c3f3e2af3408592462768ff948e7f11655b3159342cb76afc48d9ae07e26c6ddd0e9fda360abfbd86f5922a6c927d4d7e5a564c305f4ed0139fe096fb3c73c4b49cefe70e32a1d16e60bc4dfc48da792ed21400ac762aeb0cedeccae5055db199ff5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (233, '{"ob": ["15151515f6eeee05892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958efe72b9d7ba4bd08315cc07118c653fd9067fc49a4a25423ba9652b17270befe95b2325b8beedc6873c4a4f17777cba2676861b34cc2d5eff3aa377cc0d6a56a0b2f9acc347669dc351b08607014c7bf021a31ee2f18e1b8432e1055b4058fa9f43b8aa7b6fc3fcd92ffca0852aeead76f8bd8ec9fb30d90259a6e4d9d14f029992b5e365cde73377aacb2fe66d32bcf373869962cc8d215f58bc7120d7839cea9972f68ba394539533bef91ec320921a9f425dc7d310ce3ff8c147363f09a8175cc25fd7e2341e761cc232d3821b28b033f48ab880591e08d3e019ccda5be2cb45d6c64b47e1b988f070ce5b26ad077f5a75dbd96a1e3799b33e0c7d36ec9dfff0ccaf0c63021b052eb32ea2402ce6bb9abfaa3dfc8c4ab3536626e27477af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (234, '{"ob": ["15151515f6eeeef1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f987b127b382d63c79ea2f6556412d3b53c9d0f2a8974edd8c43aca1264887d7f7a9f01f6c3aac4d8ff3e78bcc62eb0f011b6f02d65f3aae3e550dda19ca6fa600a433a943551d72e176de011071724108cd033ced94ce9b95c6f51e32fa6642844bb76f6fe2cc4dd5490ec6d416cc30a7a5c297ef14f8ff155e8916c341792944cb0eb43116ed1027aea0ecbc4d84ae69637f46b0ed1c657bb2f53e038eda9558585c54c8db4f96562be401a08b190b04f713638248fa6be8737a24b3d6c1deef8887a2110cdfed54b543c0f62eb0dd26b2180007da123c5de760ebe05fe763fb123a0677479043c4453ab353455d5aada0e458d6ac38b71f397bcdb75dc64425a2eea17669f79fbe92fdef48f2c5f632c2aa6b2343c0edac855f848406c394"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (235, '{"ob": ["15151515f6eeeece892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e8d810de66eab80fff0d2022f72e72792a1a71311dab5a98297fba28cd907271cf0219df6de20125e125323faead64c8bc7e9077d3b6659cfee771a18e9738b11ceda2d269868cef80b9b17454ea29a85356aba652186d8378c04ddce4a0d97becf9477631cb1e951bdbf903433dfab4458fd879d78638ca6048c27f0d0461ac595ef93f6214af346bfeb6359bbf1d2345ba03179fb12b4c46866c5d6479845ebab4c0e7c8a00d199e4ddfa97e84600a1a989cda2905bdd0a7c8db5c729a8fffee2868bb35dd9f15cceaba967aaf59d572f1e3b10e4e5c4c4eafd5cbbf4a6a84540617380e6701d7fcb7279be5d72451889dd150244ac000d6ca5b3159bd7937bce5e72abb2451771a593ae83b712465229622b0d207c37e40e6c8ced41921a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (236, '{"ob": ["15151515f6eeee21892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f3adaeb6b324fbc51dc5029a4aaeb313dd18d31a927e26ed6a99da091126b6846cd9ec66946883b19066a06cb8972a3e77d177c8a752642e4093d4b6fc71b3d948d68533c35152a0cc6370097df8a2fab73a42fa552ce20fe02ada2eccd5d544188c0192c40baf69369198632979ac585fd4110876d104f5c75a5d17dd13545107fc30e525e570cc0f71f6b19c00c3a63b3fb4405481048d90ad16b94dac720b151ea06a3f924c7d97715b116e059b8a6b32dd144b13a0c0906ddf0c73ee031751e2e9ef87ab7981aff342c3f7c0ea758cfe8a87952953f473de2627b700adb9b2b166c2a4b5e63b500da6bd03cd77373c1dc4acc822a3a0c29104dd9d0efef3a9c52d5645b141becccb3f3854aa6d308456a44ccbfd1391e63bf1aaca91e4e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (237, '{"ob": ["15151515f6eeee0a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b44d1cb53cb84bb337fdad8825dd2e2119835d3c58dc69124b43de8428291e29ca56e7337219cd5226d3be4c19acfbc655abd1f6f935d2f6f9db404606c8e8c00b5c9e25a75549d8a117303ecb6a204fd01458655df55c4f8b315951833a0b07f424f2360309dcfb6daa2b42d966cac059f326b57f76d9f84ea5b2032a1115a29ad6441a9f5f49ca3225625801af7a8cab14d8fc6f0563f6d173ba7929961bd292d4be813191998332e4154b0603239120ed2a83dc1ed8674fefb1d2b517cfa9811650ca05aa3cf488477dfa2a7156990e7aefc05b9c0de2169f7c77419d6043e5cc5bb3671223f0387d785ad3e2990191124efaa53a8f7b6bdd39b24d44b5fcdf85e16edb8202d84f8aa1e173f71b94889f45a838c1b3c0a5e1dabdee002b9c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (238, '{"ob": ["15151515f6eeeed6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595545dcbcdc04fc43b47943757cdd9c2e4b7e4383645d14cd663f2a5de90210a6f5cc1a1ef2f735ea16e78ae26e2b54cb99de710214bd75e4d883ce1aa12db55ada9361b117b57168cd9d9dbb071825e8ced50f53216b868e6e63f297f557e4b24d755eab0311fb73b2e044cd059d40a041e78d84f08da4096174e3706d55343456b5f2998027c23b22f2cef3d03a7cc9b10dfd0d611c9662aed96a96aa93f95af92702fc689335d6bc92f034c12ada0fc0c62a8e72a63b9edb408478c9b10a7b5e935104268a6dfffe250519103a80e2c71a32572b683bcea8579609dbadc596c2d04b63500f2cddf4ad884ed0d2723cf5b29a33538ccd9f151d4b0a69400c35f6cd26364258adbdf25296293e112c7097603ad268f908cce06af45254fe2a54b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (239, '{"ob": ["15151515f6eeee00892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d2dcfaee1b94b57de203582130b624579316585b53146f0640490dbd14c23c53958585b9e45f00a19d6aec17ee3075faebf7c32c53eb1dc00592633ce7bd79b7085bfd9e8f02559092af1e7cdccae31bc3dfc2de2b8d3ba5a6a30eb1b022b7187c5a819a1f548ee61442e12fe4fb1c3466195e860e98d66ddd98465c8b7c16b8f5a038eb268498933f02698a87ed4130f916b4d9d159204c3854496026520ed6e035db1f9a669c8d87a61675397e281d3417d8fd443198bd37cae3d9b1e5a1fb289b1ecb17894fd3334e579946cd61edbc7ce67ffb3c938ed71dc7ac77c00762d6f0d34837a443569b70370778e77efa1d20788f8d6df066e4986c3b13e1883b70ca60a2cb4d993fe3f451fb1fb0c1a9231cf2b35d74355ee4d723ff22dbccc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (240, '{"ob": ["15151515f6eeeef6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953de72ff73093caac7b7e73431e33aef8c5f760375676808916fd282a567b032e1b69ca718606bbb2686194888e4e10e6a0e3ae99beafad5db2d603087e77965736702576ba7187b5b1d13233dbe3594703f92c60982f93c6b08ee5d75cb84382d7d1062be8b4bd7dfb2c2fc0c70866d1f74aba50c5bfd9f92314e04eaa57266ccec4109e6c2967833914af8d884dd92045a13740b7c33d68f0982cadadff2ad165e19baf4a88df21e5a1289803d569389080b4d800096f3bedfa6120e1dfaba7c05950864af5929b7ed80456dec379aacbeaaaaf470658b7f2231ac49c5b54e470e23f7e1e5ab5eff581363b0169b109e5f9530526dcd1dd6832b5bdfb634d7f3742a96ce827aa2d9069610f10a76415bbc51f82c25cad27a68ad5471549e839"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (241, '{"ob": ["15151515f6eeeed1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45950c8c6cd0c753844ebf202a56babecf8e13ca92fef661cc95be025dbf03a965cdd278056ca70b0677324ca36f1b1944821fed215a591e3f0872a5349ff65054e1077432df1f79d98bbbfa3d9521fd07fdebc12a65cab2dfb96a54cf5837037043ff291577a10d43287c355f933ee14ce1400024ca1345ca9f6bf7a0e456f88104464953ed0f318966213b64f1b67b50309f6b5b67eed5503da4e3be2b8fb1aedd9878b2cf78e42b5ebc486a7e08937095b8c05f76c31326714674ec65bb346aeedd843777046e21156f6af2af6e80273b1449d0742e73fc8442a70f4ff44d40d118c1a97c7c0bdd454e4c98f8875b1a439ef1634f9f290a7fbd323b7fce4ddc160385b26aa09e7d3bbe10664a3c355cae74c45fee35c77253b27a8b9dae248dd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (242, '{"ob": ["15151515f6eeee3e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955a4b5a84a91ed3892c828a8f4e31c68cc1cba7df176d7ecf5eacd682562964925c3f1e1f2b5dd4cc5db9315b3c29e6d779addcb7dde637b1398873958f8ea1d1149a147caa2393a2b7a36bc48e1fb7a62d42450612a9424a3b131e32a573940305f939a63f6fbbfd67d295571a5f5d1cd50d02364c7a20342fe9298627a01366fbce8b4869ac3500a66cadc4c0e31ed0655168d6360345514277f7ad894e82d33cf0ac44b14f07240e3694816009232a6b226801a4f0e6b20ebd4dbeb6a0216df200dd8ed22e0227432cf8619ddae7077e04f53db3987df5671a0818ba0f124b964571d1d0882c8c2ee5465ddb3478f1d9c76eff8a6b9dc0c7e334ce7f82817145fa7f0b05793f735f663541454d770c44e66f612b5012fba9aef7469f10dbae"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (243, '{"ob": ["15151515f6eeee35892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595caee8370ab79f461766cee6b98d9eaf3a265e4060be7d353b8fac0f7b32a91501ef1d7ae4c70d928902b186dd5d285ebf8e80ba75cbef34eb80bc287bf3ed8b5b69d1d6595f8ba148d0712e01ac7226cb4865d70708a3bdad02f3a0fc1351ca1f173f20491151c4716d1f494a5d2a0ea8fed4daba31a83f89d7ff42286e4b0083243430c3a2ecffb91a87ab20cb8990f83f9005ae1294bddd48dd3e8eaac44d4fe389c8a8d02ad4ef5934cf5db284a3554f416e59c7b33b8e49dc97c2f23a2b6fe1fe2f3cafe467acb8bb5b5cf1c5d5a39c8b6fbc78361c66a48e1e371e8a11ec29824adfe75d20a27a4e39bc811ab7c76a7452d24067103d6197d9f92201d0879b8dd938df1db8eb217fea127129145c716e7b61d56cde9842db3ce286f64cb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (244, '{"ob": ["15151515f6eeee63892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959e3d10291407dacd9095fc0e3c9a74b47783456b2123aea3fa9609a0d937c83c83994327cd7ae3fa832be391ba47a2b5bc29c711bccc11318156ad427f4b8b97b74b0e4820ceb3b624f0401d4b93e6eac0e06f02f1ba213e9b9d4e4d250c71e510514bc273c64b9d5ef42c41dfe58f33a3540e93b3faa632a7b45b7a4c59ff005733dcfe9b7d9921a40f8d5dd27e9e0aa5735e55ed5e8c3a57cfac87193bdd18577dad4214b063a15fc3596b7bae6b1f266d966be3ab3b394fa7572ebe8814150a8080e56a15de6cb614857204821de4ad1f76038c322e7333069d93d43358611d0f50c221452ce4a171560bca63d4f87a8cc33446e532673d7242d05dc3227eb49de28742fddeac1b81725ae9ba642feada89bee346e7c6d85a7fc54a3d4989"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (245, '{"ob": ["15151515f6eeee12892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954490291a82c89a87e78ba0cef3d9d84f62afa8141a62bac59a6b43acfeb5a93d59865c6e3155e7370099e1e48fe8e34f39a227050029dff6bf69b02559406c7a7054b0a2aaea286ffa4e57efa7014a2d3242bb8a70f36122724b092a4cab1beb76e00d9bc48d337fa742afd3fabeb804ff625acc0f8b50d0ad438d7d2bbb610b0b2a116d4ce7192d3e07311ae81cd89332fe3551eead24c74d0901722945c3449309355b9c05fc44985e700343bdee3c08007a4dbcd71a55c10f27a00c6199bdaf7b49b3baa0351f567f2dbcb230b2beda3f6c34ede9369bc3cd26fa382a6c31ce72cd5ef1281a27384de8ff635a4fbef2f8064520028b638477f6ea324bdc360c99a99d089c7627ec59b113d1dbd950f9658b2bef16855caa90b2a92e8d664d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (246, '{"ob": ["15151515f6eeee80892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959896e241a5a48f4870b77a32bf03f6e124f92b8b395eecc9167de85fdc34941da7c9298d85d4cd98a5e861775a16eeea5bb26445ae936ef87bbe61c2eae1940722590204867d7d6c6c9d5bc6cedbba496a47aa46fefe96a26727c1496f5cdf3fa179cd2578e34779217ba0d91d521ec051b9dd5751ba9016da75be2688a0d998c95ed8c4f832021afb8857b340033f84ce5223ae0f266e41eaed3d30f962beec0737be5bc8b113cc277365376ecda9a07678b634894941d9e03056f2949b03e1d463a73ba024f9dc0d4dfc104a3b2214d6fde0420679bafeffd2a59571f4bd17f0ff6d4f1f14c2d82faae6d41c1f6a7ac450ee7c789e367b1c08068dc08632f58deb048985fafa197fc03646946f91f0dc6784c37eef4cf70e14c9b272d03267"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (247, '{"ob": ["15151515f6eeeecc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595be7a07fc216f45281467d414e753bda281579307598edf17768ec9297ffdbee4dd55a6f1bae70ae93d40af78b841c2e42a3e4fc3f80696905356b505e67238dac64edf80237169332393863a1471ef6158b7d5e56081d680ade10d208060446a940c84b7f610b21b84913adac023ecf9b721dfa61d9313bd71c411285e4082668c5494e665724673efbc632b1c8cb7a8cb9fca7ce052c0fd6eab22393d4e4c0ad2cfe057717ffd999b91bcec969bcdbfae1d1ec6b1b56066bcfcd34d85a8d48fdea92572e15d14fc933e7b8c8ac82a72afa57ed762d8936aea40a50200ee0e54749ed634ebe1a45109923ade621b9a8e9fa7d6ba57dbdf408e52d5eee423a4bb3683984a34dd59cbbd5a0f6d4ae50aee3cef0dd86ec5133e988ee217f403f7b0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (248, '{"ob": ["15151515f6eeee25892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a38b6b7beb102200d48232f5b118395c4d01aea835dca3c210bef1f8f321d68d0eae36f1c29709f130e8da0bd2e5bdb296b53bcf740c3b782f0c1fe4d5aa033ace1003d6985a2c70823b15c67cd2e54499853324f9e8bb241fc1daeb0e3538db13b90ae6b5127de40dc8612a268e346507a17d9fadfec32ea8cef28ca65bd1e07bf443c785070579b39c1dacfe73853680fc22e749eaf46b431092aaadf57f14856738ba42de6f90135d35bf8d46baa9c0ad243c84616691b74bc79b5ae2588077ea8e8513329dc51eb2f195da8745a311423767bdab1ac58c08271e28f4d39dcd08126cce2f828262689ddc0ead4944e27725272e414a281bf968a8a2b985c59304ab6de38073cb9dfc982d62db5849f93d5ff023901e631c964d4c8e75ec16"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (249, '{"ob": ["15151515f6eeee39892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ca1af228a158482007d2cce72894de695e45836923b6033f8f20a3f815c71775bee2d54584adf580c27d56dbfa72ada3f3a061efdafd3d2bd38e71f5b10bc4026f2e2bdcdcd297f1171f020186af874768328fb3da5978fd242dcd48747f8767f278bd893d4de40c9a66bb44a8c9170874be614c39402e4dcf0a272984e71eaa4b3aae6822a032eb1ec9d948c4b5e67ea440f471b5ea0e4754288789c29bd7d0bdf82b4e4c57ca3054853b67010ff259be3be6e7d28dbafcece4e5bc0ca327c8dd80694e2485d75e91044a178c6c2d6dff410b85ce76ca064eb46501547182ead25f05b9a0e7d46ce04be4c4c7d895d8c8ff23d60509c7f38a3cbe8c9ea00a38c572ae04751b3e1934af92120b842d790f310b73be6b2c4f98350515c0783ef4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (250, '{"ob": ["15151515f6eeee24892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f60e083cb287cd5f620d9bb77e88c93d71edd5891000c8491272bc381392c00326abd920b5b4425b2331416014e8a961ff3ccdccbcb873b87be44ced2418a2bbe8660a8e325891137b0f1fa21226decf061415ba9ab2400725336d77b29ceff355d15019742000109f08e4cad6748e5424d7ae73103eca8597011aeae015b6418754cc80de68f59cc44a11711ceae503bd9499a6f13007b91e6408e0afb980a81aa7a2e992cfa1144c9c45c8ee2ae9bedf5099d04712855f37cedd74b75d7b2f056651eda985f41ba9f3bdf08563834711d77a9c1c4faccbff3d67adc850dae3937ab4855c31ea4bf73aa3d2c4537a2f8cbdba0e8a9b48effd48c7bf93aa2c162ba615d157f05622a668ba1a67857674bf167d0b955bf43e47cd04d7ab03f3fe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (251, '{"ob": ["15151515f6eeeedc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c296e2ad15b0becc51f89b37540bc11563309e72e1aebe7674b477f4a8841d2d0401d01a8cc1c17d010db8e729643560a132fa6028acef8a73e4201083684c6b387d3cad8fe8b254f967c8c9f15d9f6e7aea0c82fc7fdfa3281f4d4aa664c12a77d945fa3eca40dc9b9338422e90160dce10cdbc601aaa96223b09c8ab82e10c925a77da0b460ded18542d0212782dd169ed0c2df72abefed9327d7ce4caec5ed68f11ae773c6a7c2af6688a6a4533dc187a8e110c84276bd695d6630ad59bf6cefb0b7e87b309b434500bc31e0e6ac242398282658ef1049df6bce703406449e6410ee11d43a46684830d754c1d05529ae663a76eeda0dfdb706a7d7fe7975ef1612784b275ea63b813b8ee18484f8a8f3c5b759dda557d8bed05d1260361f1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (252, '{"ob": ["15151515f6eeee9d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d4937a85acc788dbdc76f046bdc1a0988354c6144967963c6e82b81b4fbbc8f97a91c6b97f320c724ef92f332a0951e25b65d4d4bbda070a1168758cf2204987bdb699f0c1114828b503397248b35438a880fd384ebed41a41b4b96b886705c34827234c60ae04187a56db9c14ad71c9c31f3b8b9c9d33103e38fb92eb75046554e1bd9eb6b24168af9b85abe1cb4cf98b52cb81152c4ff1491f2488f407e48d314116eb92fab96f0e274c02b2bbbb3d6c8076e9d31c98570860174ebc483e3f3f98ddd76ea9c48ea39949063e527b5bb994dcd72633846c796748f7b13adaa158b7d8ae05ebaf78d14087338c57080aa2837b4f821039a4487eb6828ba61b4a21fbb6d4f758f5533e30777925c2ad9ec49791fa426e697c7209fbea10bba5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (253, '{"ob": ["15151515f6eeeecb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e70377ded48851851ad061a70ac6aec58cd0713c8e694bc8f2a44db4bff545e7daac3b0113032793263d13aa5f3c36491f0399b6e430f73b6448e277554783f54fd5e537fead6114506b3d735766e21ab45d9ef25d0b4420bb95bb40a17a944fab6a029b1d12412f62580f693e7448b749849b11d5566e62c536248013f5cffb77c7a36d6c8542697b5464d8ce3809134f78b374ee5faf132773ff11a2f0bb37c4b1253748d639c705883c83533b8f873e001d84aca9a3a2876a6006d6968d54d9c76d61af1cd17b973ce7c83201feec2d3289771d15a851dc2dcd9997b3929a380271804f44d2ad63905f02a97ca87430c7b420c9dbec1ca2ee368e7b43bb5a2afb4abc1281db4da109110a9b5447995bb7ee5002e19b654e20aa56b979980f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (254, '{"ob": ["15151515f6eeeec5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a735e245b61eeceb62b12886f1c8f6d0422832e6b6796fff505fa77be87ea6312053507c8e02413aa321367c7c8442967e1a5a24dc944f91795c47ad18961cae7c67249e0527502648db5f594de2ac8a2c3a5e416617e792b3de37025a4b4cbea4f8e86e5f76ae2ec5b6892e6714d8faa05d60cb0b0dc22de13a2ffbd3a62e75fd62898b748c0dcb7811a6754bf9c851e1c63e482ffa3d8a9aa3fe42914f1378ef4525c2455c2fb81562dcc68baa3f133ca7d0fe80fb6e1cfaeabcb3933cbaa6f349d22b44df5d7e8563bea2f1c146aa436214a536ca91089042604f3506ec853d690f904c9c112b06aa1ead3413d446747abad1883bcccb888fc926893b546b522bb4be5cae0eeee885421ae94358b9bd1e7f1aa71bc8b1655dee28effbabe0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (255, '{"ob": ["15151515f6eeee09892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954c740c8843470ae38d72563b29c9cb84a8dfea9a7a25633d3173ac642a87c1f5b59a4f5ff80faaad4c107325c3f20c6a1f45feacb2a481578b6a438028a1e03d94d3a0b6ce16e8f9c2673fd94c2fc2733811beaad96f6791e2117947885ec03cfd777bfa6cb05256ae4562566c70c6712f3cae3273622171a54ed7924d86e7428fcafbaab11c15a30f3005c60889b95954f5380889699b20b40aa83219d9f2ed9082af8878b8b3b05fff2cbc5fb2c3f0ad3bcd690f5771c6447f808f2d1b9c124234e77438292d9774f36da319cb500dfdda2ccbd506d47ac234b0102c97a03487e67df3addf1a56b33343c81440fd982c16bdcdcf997aef0278287995fbeb36d5055981c8f796be58a8da654d76b72ded7f87199eeb0322e629801b90d37cd3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (256, '{"ob": ["15151515f6eede81892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ccde76883df21132a93afcbf972fe2b0c5c1bd5abd96a13003425cd265a56617ca5a2fe67f400c38dc16e335e9db8b36bbde9d08ad48c77e42027824ae9d88f5f0e979e95b907233a8131fd1dd1c06751b021d599d78739e4d88a6c16cbacb03b1eb51baad45f74f564a5edfba6dfde4ff2c6c89608fdcee0a4c4d61dba08203ffe480a6617b5fcd9ab1d58e39d578aff3e21aa68a7a96a51d8c169a6957c6c696daf20cbd66873430333cb02744892425906a17d89eaa476d7a9d2445bc68b8fb39ed68d22b438e4e93b3f66bab556cd61499565b5d0231bbdf5f692fca94cdb3eef656e2af0722ce1c6e917e88ee0a7b60ca9ac82327deb9a42c95b19f68749ef4f9fae2d38f31cfba0469d25f285e9352f5b1209792b90f0b59a12b2e04abd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (257, '{"ob": ["15151515f6eede2e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c01b29ff55ca7c6628ea34ecc3d6d97a2f599783f85301919142e0216b6f77682109c09730fe94583d15c85a5631c1724e74ac80434b25ef7a4a5e5b178a147c7ac7906eaca49fd548b2546dc4d646396839c582ac7ea91986b4d23d70f1957f8971721feb5791b856d99f3fc417ce4001d7e0a96d4d3adcf765ff1e448a032a69488fe6cf499777e944b03201d96ccd1b03d0d5c009fc03cddc6bf01e0b30be7be753e361eba2f33153a5c3a21e5e7bf30f77406281bd3055b698c6457ca09e085861ca3216870da057e4bcae64477e9b4c48e5b992294f5cb294d99c942d996521e6ac1abef3509844cdac8ec8c1616853ec2bc81d12d1d636ec625ae8e9db7d2e7ad20af52c6971d46a59312fd162d15548efe23dba5fb4500528912bb1c7d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (258, '{"ob": ["15151515f6eede96892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c60c2d1dbc08ced4ddf9bdbb14536eaea17d70d2d8c73df5da998427a4ea51959952b4313c3803ffd803d9a7bf4d8eb68b7bc4b4a37044b1b8127ce4a5783f5f2e9482c18376b10660e38b51089d2b491847c31b39bcc51879087f10ab0be5ef010a2089860ffb718ce62effa17bc5a1aaf9a17724df07d647357e3411e5056d31b6f63b4f671513259a25c1b5440b2689958a2f8344bf12fc5f15c9f6db1546f070660a5575f1b9d72373cb31c9cc8165d9ee481339c84a51b54d04769a8ae89bcd5c8723c88134a1f68f72e98c4934326b30c39f5e1c2a6237fb16f525c15eb737aa3509fdc5965ee76a66b015c60c807c8a276d03582c190f8dd8a2920a631c4623baf5ad09ef2f0d3824c9e714d2ce989adce85d21b722d5e1f499eaa5ac8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (259, '{"ob": ["15151515f6eede2c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0a8413ab6580276cb7f5cc45935d53c19ec4d200ed6c2167946d8792f993e4abe318a4581856c2de2041b1a7f9041b76d7492f4af7da70e7ac1329cdda0c9bf625022df13f2339f5f5438ea30cc418740e4be4cde8bf3f952bf1749387ddf4000c6e1014b9ed4e9686905c054768aa86769994ea74494304d606424996957069832a02aba9e3a61aee481af49beb89235e10698f34a808f0acb7d5e9c66ba667d668e8b51f5bd418453e258790dd8b8202e73b58a91a9fee00402542e86cb7b51648f4425b1be5f6622e5a90354f2b188d03d5c55b1ce968f2d3bf575097618a0b582112a95165bde0c1ef6b79bad5b048434c6593cdeba8c2b7bc9eb8ba895fac9b39f044f096b346ee518b7b62e821148cfb2ae1fb9923b86d94c87dab40b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (260, '{"ob": ["15151515f6eede9c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cda1fddb12e210e0d5e4664827aec675e0e7183e4e216cb46d01b14ae4b0a8407ebd47bc684e8fffb4f2f1e092b8c54d48e6de5d394a4c112cc9e5075e100b51ef85049a1ebaacde16524220a837cdb121c57127b17d0f3061cc766f9208773af864bc0dfa2ca16f252e2ed2f8317ad0a7503a41bf077d998f7fdff85a3dd5e91cb57a0ad29fdc8bb01db5ea3b2e70edd8b2a8bb87a9a2b401f58dc07ac42c5a8fe0a9f0cf09980761f21a72f3f46feb59d59b718ebde5a6bfaee43c7f1b7dc82e08bd6ebfd71a323cfa7885f303201f4bf4f22a01967f2a52e9b3f87ff9a88861a57424c22aec8c2de98c60ab50ca530388f42ee526fb6725a5f1d743b35cab17755fa160ddb3bf4297f72c7743c5c920df9ddfb58997827a465900ab78cc81a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (261, '{"ob": ["15151515f6eede00892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c819ad523f9e56c3da219f773e81c9939e37603cad3527bc6957cd92d64fa4e5aa814a30eb9dd419f28c3b4badd1a653eaadbfc97800522e18bd4620ca1f26687ae8f5acf1fd5558e29a55832b7d3f04a15868815c8c319595d844ee4897bd0cb4ac73dbfe1d4354644cc64a08cfe9128f190052cfdff33d70757c4d53a0a3db734c1ee2a245ff00d1a388642ea030db9a5c4f7a05a14a29649b5242c1ad706c74f29b504731acb67d8921178704787a8d8e1662e17737a9260e4ed776bd3ce7559d717a4bab5caa2e28ebdd3bb58c93538bf001c5a6d131449ff1b5d69180486312c95093fa19b42ea88fbc791b02af1334316b39a0f605e457248c7a12c6433e53eb75cba3f811800e27a553d39aeb7a8189320af64a74b13c0b10edac86980"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (262, '{"ob": ["15151515f6eedeba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf7814630e3d04e8410ccd46a8f110a9c5bc5608a855ce9bf4d14300fda071d05dd28ae0db747de5ff85a893dc94bb9abdb53b04e5b12f8eb2cc4b0b06811b0550c1fc878f45e95e86865be22a28ba4b303f19defbfde587feda16845c45d674941d1f5134153bd488a6bf6e86f22b80b46886ddd49724b96fabc50d7f3a610c34248d4cb14d4fd008378083152ea83d48c26a30a3d85f95ceb4fe3a422d108df2556abea22fd433f99da5a7cfd4e198828570b29b29808e0954527048e6b69f97640d107656bc63aab771da1b7933a3ff5ed0b73632f2c45a71cd2af87bff7dc64797ef5a6a6fbb1c6372fc4759dc6547a80f46bdd568016c28387c87da2c1a22cec6b9643c565fee3471c1c16cc6abaabf3b9f38dd9a2e7145bef7537b0c113"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (263, '{"ob": ["15151515f6eeded8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2a71317a78be32e91078d7fa9fc2356e3c8151c00fd16a2a04fc18b9adc12606accfdfcd82638cf1fc9355cd953e179980f8816e453d43dadb4eb09872ee34ea99bf93c7124e3b54068dc3cc6b92d2efde9ead0e7661ea94ae43e5caed573a41bf95281f9b407500671c88de65625cc02167dfc593c66dcc1448ed148702198b2009bc2aaf59505bfe8ad329f814bb4202fd78ef1e9789fbeac2ca10859c10bacbc6d77394bd9901a57ce32dc8659141010673c9e956305527fe0b0766fca4b2cff1642b023603eda00d11522ef7ec139767bcd4c7cd5183bdb827778454f75c476031d29116c9b7d548d56b0b980ce7a4f064546f77c78b10895b066f223fd464d19238b1b8031ba31a32fd7f997a51226ae213ac4460c9b456d90e97cbed75"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (264, '{"ob": ["15151515f6eedec7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0243545db60392ffd43b737b83c1dff0ec89d3fc5773524d85ad816094c2ac93449a96eae6e21c0f39431ec7b41eeb2fc0b5ddace9cfe222458c871e9cd95362398f0a586e62d5a79bc1fb3af28acd571cd5ebf144bed76a2db8dbebc7ac7d62998aff4e539ebc242071abb5ad0d5216c9a73664b9be65c0c033e5f2899e2b92bed6d95dc32d66ebc438b99f0d3de9a9751445b816318ece642c852cf9723a54cf3026209f093c107eeab8353dfe8772d9ff8de6cb53322a1de5ef298b925d8760f0e0ec78c4e5f19d1eaf0f6fbf64900d901fd69f09df676b8367a71925ed92d25f8e438353984ac0d27fe409655473ff410cfc4d6a4e790d3ae2b1ed92cef9171d1a7aa15e7fc00fd0f512db870da4e15aaba0fd1af5ddbc01e17192e2dd99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (265, '{"ob": ["15151515f6eedeef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5b3b2de8fa1bce92e1611312aeb4d085deb7818010b8cbdc9f740e9c22d07bcb1e99538903bdf1886d778b0a2b7f8f8a79d4fb2704be4463bb3155bb312e0ab139b38c08d91ded4e75961b831010ccd580b8a8402d9aa25d4d2d1fe8ffa82af5ffc832faf6eb5ede912c41c6f1e909cfffc9b57d5faac717160904ad38a37d59290c2d7ce89ede68a23205d7895dca837ade9cd7e84066fd0012cebefdccd1d53f18b6faf971770fe24b9f6ba8a9f40c2120cd75e50838fb26f603ab40ac2aa6d08ba254ae5f748efc399bdc4ab10e08d0533e880d8fe797a3eb6667ae8e01788f80d14259a557ab546f6f70f578bd48eb47ea10ce9d67a6f17204e205b340b3b9800b030121bad86a5d30bb8d02d2082c26d2fb90433430ee76d2a8b18a06ed"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (266, '{"ob": ["15151515f6eede21892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2ded4a760a60787a87c7ae7986f6a9defb79199fd3e3677a8b90ba359baf526809c93c233678ce631df8aabca4d7795f074fdfd3eacf3c6530db1cb67102a1cd71a418fbcfa35508569e36a73ba017805e6e8be217853fd868791aff1af5e7fc792718974500e3fb7aa84c804c901ab58c9b6eed2f38e7882005dad370cdf0ee0f168225797c2842fde2c8a5fbf1da021a07ad07e529a071b27035751d8f4db611e1a2c37ecfb38688e8802a5cd2d2d601493eaf5e8e93f4a98393989e4ad2415ff634c789aa1eff1dbc8f462eee353ea25789c5ea95dd07bb9369d025f6cfa72b6d1bb6211ad82be42702c791064282ba0224d3c188d485214006032b8b5b87ec43894a15f0225c5860baf289b2ce99aff99daa08e1817c12e09741561ea05c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (267, '{"ob": ["15151515f6eede5d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c891d47b5341c4d20f74e1a7b109a2c963afd13b8df1aba285af334c2c0ac6a1e7722f951bf9c946b6a34ce24758a52d9197e74630c8b5a1f2e17de9ea59e8268c7a1bbb13ac7a6cebceb0deabad178d849024594c2dbeb365a443683930724c4826b344a80fe61ea1220208f998104b0a5dd7fc1af265dfbdf4e838e319328e1ade2453d7d1cc0a73bf7a51eb66238b889cf4c8e5f80cd06aa504004e5b5eee23eeecd01f8bfec88aff5469a782d8dd5062454c58f3166669a74e68fa9647ee9d9adfa55bf35b9a61425e42b0f921932984200db503b146bc41448306b341e0b20e0680ab8ca06c8caabf92746200296d68bc7d0cefe7eb43d5a7208a5f24b8027917208614ad3afccd640ec7c79d8da7b831b121f879c910ae4153ad71921f2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (268, '{"ob": ["15151515f6eedee1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7aeab2e84fab2294c70771299a3f8de28092914c169585f2ff6ddde7191b5b558cace65d4862e7cddba391b79f2e3b7d6d292e53950f15fd13ea7b932df88fbad7dbfb010a209053a94dcf8c841b676f1051cf95f0048a724d21a30f18c7c0b86484a84ea37ba21f90c55ca7735abbdbba7dc519e5cfbd1549a70dc64160b0aff42536d6545b21c6ced04317f1ae2f5d3d5fe367bd6e17017dde06aa800eb2bee98228f61a9472cf181cb70c16b408367d85f5a1ee204061e0aa8c086988fb55186286b5b2504d5ad2ab89be4509943998690692fcd519ad558f4e719b795accf9570aa4dd4e70f37bf9895026845a839ab7f5efa20e93597e1a34757bc91ae4a7cefdf688537fe45bc691396dbbfb58f5bab29ee3e6783129969db5238fda0c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (269, '{"ob": ["15151515f6eede41892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc85fedb40ea0abbfd02ba46bcc394a735b168d05f4686c04f81ad985cbbc8da918d0280df13ef3f5064710ac0e55cf9b9c072d925a8fe22eb1b39624ba4abeaeede6b954dc03d7b4fc238d0d3d99351604c91c7bfeb4c07cd84e51cf9e07d45b638ac93f0afda5493e6de30f49b3fa6810b7a9396da27a196310530a24cbf437f40ccb56fef699083832649a392882b570b3eba9912b4de021d9249b38597b3fcc2f5952526738c80b62b22eb5b944d82ee0e74b595ff52bb9e7e24c5edb3f9f111ca77b80d643bab312167b146877d7e5144f6bb36c21c2bf21cc8250cf0d5aa06ee9a45379caa53afd49d9abb8ab661beb4d26b8c5d16d780144675b2d18797f625649cd9fe86f81d5468c59cfa60f022941cbce5d92bede68fb671b541375"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (270, '{"ob": ["15151515f6eedec6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5df1155dcf3178231a9b5351e15aeefdb1460224f5d7f7ccf48f8dd8db8b8f9aa3d9e8105e70d652a6512cac34e766f42f322ae95f896d358ac4be3bae8fe504e7b54cab07ff56417d0a5735d6fe70113e750a4e48653d6c93387508601fb81949f6511e6bc4926873330d7d3db6c30a9eef63f8eafe5367b2ea5a7625a5131b14e611c80596d89be9ec9f6cb9eedf3e2b026f45abf3f48e602bd848b2bdc562291616e24b367b03d10cc5caa5b0e147e12a9d163b9648c0f658c3657e7f313ed531b782618e5afc104593153b2c8d18ba5dce7fcd1bc758f6786964569854d347ffbb39dcd8b77f984b69b237dbab2fce449cb9f0933881ea017650ba8ba00d437c692b18d1585802cfbc0617962010b73bbb51b4e3cc7a243521922080fc5c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (271, '{"ob": ["15151515f6eedeb9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5f8ff58b79353d7ddf9b4a4be424f77f596bc85e67067a3fe4d1825b48bb11500070857795c04c0dee78b4f21a5dee5240e6467ae5237a713dcbf59cd9974d7240079853b519dd05c7bb9f65ef97deba4950ebad32d328019a899aac1a1a38ea2e2ff774de228795ebfbdaf4e4e94f5907ec7d4bbdbb72af87c4808615a483d27e81d818cb1cf8895fc8c66289cab65e03b82a82e002bcc90a10616d79a68e3d2478aff9d8aaa71b2a6687fde81df9ad3d76fb3d5ef92a6615086bf3475f18682c7c31f0f10bd115897c12225aef5c785816a4961921a5860748af079a1ca4354b4442bda3ded598efe95f62a8d093617f9de338f6a0322cc940710f917d9887994e0adcd8a22b3333d9a76fb341c041018e27d2a81a95ef528eac89c01cb17c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (272, '{"ob": ["15151515f6eede70892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce369caf3bf9c597e09c8e8cce0edb66bc620b3e548c3cb465589bf0754f023a1f52d79049704fee7beea461b872c8cedc2585b42a873cbcc9ca7f50cca191ccb705fca237b6d9c51fc0535038d5f1d48228488def28d5a9d37053a795b2f29f81e29b17f7cab636daadfe91bc43150c68911fef18b817c84fe21f5bf048ee31d26f35e7c67f89782ed4e57ad76704741b01f9b32588690b7d1c68bde6d8af806a02e0ddb555abeed99b9d3dbb1ffc3c0700efeb723a42d4de38bdbc583fbac812d6105f996c3cd6b7853e02c1556ae0ae0dec80d422f42dff6ce555dede84676a51cf3e1dc8aa9403164347e7789f2f4ff011383d796cd3606884e44e1cc399d97f5737fa51bd56de66bf28b7d5cfde0e2e7e19f1dd013874073bb00325aaabf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (273, '{"ob": ["15151515f6eede78892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1f068a147340c1657e46ed94dbc3e23e0fc205b696ab2eaa72fa108a8c7a9625612ee9b7f4af03521cb1a546aaa7eb62b49b504ad4138b2d6ce1aaa6dfd5bb912de93101bb0891968bb73c4103610e91374953a27e72dbdce559992ad3ecbe2cbc6695a020fd79b556b98569411b84acb44948c054184d181baea13fa28f9f5b4ebf0f5c33e966530dbee3e2dfb70767585d94190c5ac4fc2c710c694ba059609c7a9cafbdd9ea430d10a7511db6a70a81fe610584093da6352168b918b7c31ef034fd2871e893bee4891bf65d07bb5346b1aeef5b3101e8df4b2b8133c5e384724207fe9c55ce0ff83c6736cdc47c8a168845b476bb45dc3ff531a74c4b13c8d58d8e00305976a78702ff97d21a6f1183686a239ffbf3b1fc2c5d6c39cb53dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (274, '{"ob": ["15151515f6eededf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7fba661a7bf4a5cba7a03e742a8303c068fabd7fd726b9128201f3677b846c750d8ce301a75bcc597209742be1be7ca76460a7ca2be411d446dd0d0fc05daec3502545594ccb684c4c42e31ecaa8be8f8e868d4fcb490920a0774f9c505f636b17487542668601dbc100ed4b5d082ab2c56792a41c614070353124a8cdb59e17ec2bcc9ed909f3ccdbb68d5a9fb1f6941000f9667ee128f6e521200402fa6308ebc992c23cfc84d61e082b3e2442be238a34d09804467c0a79af2fab01dee73fb8cad1e6f13542514637396af945806157e4b723a16255f0bb68c43aaff8786cf599e0b43d6b0329830f6836ea3196dee597c8227199bd78b673ef845d6e5b4c478d4b4ce93ed08ae6761688478d6a93c44e8b344b96fe65fd7a27f4127e0ef9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (275, '{"ob": ["15151515f6eede38892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cfc111c303ff9af0f68cfeb8383160101461838af2d3b60150ece96ca1dcbe82ebf438121025e0595aa35fbac23b6a7f410c14b9d31e00441e2596cce2a38340204f2207622c668f61757a49fa51e53965b46f144231370a93f777bec31fa299fbb6b00a982ae9f4c99600822ac1f3097b8e8d2f0bc6403fb4a12fc32f22fb57a59f5c3606c1b8bff96147a086cbf6ab07a26d772229f193ddd764f0102ebce01a6288d0f90d57607009244cd1fb4aa3298b0a83be9f94552de59dd000100246a47078afabcd34f10006dee7d1645d94bb24e0d5ab4d54479844915cf050be19040266fc9510a45197037631f056f69632e9f6061f1ec721bbb148046bc221b1d1ad63399751081a1bbb75e2203ffbe05ffaa0c1bb3c1105da576e3237ea36bee"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (276, '{"ob": ["15151515f6eedeee892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c604dc3746bc0e2a9ab42d53f1c6f93c4d3cee786f59b3dea034c535ce07c0cfb9368e0b165ce25f0e290dd8a15dc54ea0581745f877f2517a446cbb50ca61e1817c84e31e417890bf7528c8d0b67fcbbe07b96271419edefc4414bd7f813017d00de1562033b4f1f5a80a42b894dd2ec534d6f37b9e31bf3460c4d9cc4c9e1f0e33cc9d2f74d19c17442082af54430b0a6ecf3e144e16bd7a6bfc206c3e8e70cc1728860fd02e3370cd5645425df57a529757a414bfd4154816905bee132046228b417e402a4e54eec7c1ec9ac084e1d1ea5e5df9990721e925122f02ceb795da8f213ca9458c5b4e0e153e73ab49ff888b9d6d00318e02b447baa044c860bd2abecda02487ce62b948f08fba5213eb34e920cdc4fe495683ba6cfd9f0270b9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (277, '{"ob": ["15151515f6eededc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca4dbbd9f26d4c03435f2478614d393bd7aaf0e4250bbbc737a28033dc99fad8590f4774ffae3caa49b2150fd5af74087ad0c7683f7821ea5a6e71954b6e4d9eb953f1b1e76343c1c95822cecdcab3d9ea120b8c6cfab47472b1c431e2f925dfbd10e96435f63384a4e68aa9ae3dd2109a5c5a2e0b4389d70f485f248970ab692b8e728030aeeb4362ff890710529c9626b2ff84af63aaa21812c2a1e9e551225169e21a48c519c9fd6dcb74fd9601433e005e75fe61ceffb3d7ecb21ea29421b8f697a14dbd2e2342ab79ae3dfc766987a946de56348a5a513877819a7f8be669caf3a7f891ffb5b4e4c179063de7eb3544760bd7461edf3e7788575f09ba911db3051023a91b51d8f9296efc126356b97e8f37e92dc3a3f3d488f602e012f5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (278, '{"ob": ["15151515f6eede3d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf372f7a271a9377393f904ae6de90e698ccdaae14861137a4e249c5c3f6c7e809ad6483a2a67b132027ff8f51069d73c39e262356340ed62074da31334d1ab44a607b59a165cab5f57e1f166621068383082c361e170d9c3aeb0be333b087bc8414fab6675ca5e2b3a4a6cdeeb210ea3c674e803a7c85a3a37adf371958d7e7d19c1091e179f5c4e163b1d14de57d2e9e7a16ee461de6590321c599cfaa5994b2c5fd626f1db455063b1275e6feb35f717d7633bec880379615a9c16b2dadf61f06c18df569b0ca3597aaff9128dd8ecafacb8996617b5d2f17b16ff4ba7d7679e53c90c05c0fcedc080bd135a90807262d960b8926bd6fac4a28a58199707bbce47034ef4789cd01335fc6222103892e54171de5e39fb84079f0d00bb7e388a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (279, '{"ob": ["15151515f6eede31892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2f0951a883e4b359f911df591653d41a94f4591f96926693872e06b0be7d36f9e6118dc8dc99f4758fb05b614cd5234167c24c435827ceaa847984056a63ae4424c86465694db6e0479f0403fc221998c54d2b22f3f630a410dd137831b8f0847cdcac24f2049931da6806afaefd67b7975888ef8c01cc0db9a768673099411d07990c9ab015fae88a137dce3dc5d53fd24f6d376a628a52f60184b5fe8f18c89c21e3895dedfec3507ec49064c02a0c84f45474d2486a28b73bc6c9dd47893b101634a16445df7fbcb6c144510a0add0d2b7f025e9548dfb0740b6175e65ed76c39614a02528216415514337f85d48a76bf1a55423c950af14cdd617c2963a53ced7ba8ff52c85f5ff6953b5e0942923a907cbc717ea7eeff94b840a39e15c9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (280, '{"ob": ["15151515f6eedea8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb8e611f0ebf9cd30f6cd927dca2f90a93fdf9630eb9018a6a0af63969f1122e85eef94ace3546a98cbd3c05ef9d7ce42f679a7e09260634c43667eac023efdb7e96557ae57a97de250e81be45483c772d7fae99a65a6c0f2cfb94853e2add5f26a179085e038ff560a7227f76a0270986f642f599224a9b59f7bc285a0c1c7675a408d73321cf80f6432e0d32d39ed8087608f1ad5a1668d6175bdd002c2c1631c274899101b5827cb11985bd04a8c473dd22fcf89a10475f7e8977e61b4e32be30c8e0055a789e209f9d237e24f462c6bc8be181feab47a0f0d1c023878607afa2b1f49c054a3d2d6b91da8fddc1b80297b7fd7f0710dd7214cad1bbc4891f1d45d085b2032fc4370c7fb96677e6ce0e033a64e807676ade4b6718691d66699"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (281, '{"ob": ["15151515f6eedebc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbfd4fe4f9c11a25534db6f1745dcef31bd8761fcdddf64b64b0d5e43ab94e78652750704d45867acdee2d0586a436dec57b7588e3b056286ca113108b9aa493e6dfc848eef211466943e19a9d9acf929a9e97f57dd3c8731129ec470673c4b746e93ad24f0e104762af3c70850afce7e888484bfc4bb9dc6363f4b5935244c073edc0f5f6e83e852e89a2b18ef872cf9fa17a16809092be24478a93f3521a989937a516ac9d1d063f9974586e36bef2ea09e68cdf6d6d604930d7f4da6b906d16189e312c287291a06cd857393d2bc3ae7b2c93758481dd88170f552c2554e7ce9f7645e7abc43a1c252c2f08e94bdb00dc6638ef1fa15a45327e3cbf9c2f5db57c34bd6373b13439eabd42b464d216fd8eb098c1026e2a84d69774f0b7c4a9a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (282, '{"ob": ["15151515f6eedef7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0616d29befd94076d23a0d1ec9a1cde412413706c8368c52ded0b1a93fb98399d74f9b28f40f2e1e59f6ac29c2dae582350d3f0fb799724bc8b3a811030ae6e1f6396ff2473f4fd94388ee4f0e90189893fb98eda76dfb19d4e6ff9a184a60f229e4138ae7eb4c7bbec33c0b6a3f4611337c874f5c2d451ff177bebd0a5315bf55614e11c1130bf81a6aed618fb2f9cc822de9a28e106eb7a2e0875e065159f8dae286602bbbad9a33b2d077a87ea2cbace21208f8d93c8f3495adf3c54d393a70de41159ca1adf4539b5ec4ea3be453d785b08b35d16ee1646334d701cb9db9305cae41c2f7f7edc82ce24ae78fcacb21a521f743a831693c4cf8b4b1bd31268743c9f7bfdc2be5f24449af1785e0f4f19a2085cacd509e4b426cc8da9d6fa4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (283, '{"ob": ["15151515f6eede17892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c33e2b01da0fb5a61453f5f5ec7f93466a1da66865c990dcd73c70700d5a5e9e0fd066a2d0a07bb04e990b2deed27088060384d7a2f192a458ce37f41790c5cb3e93d4b423b8df8a95b66a915fc04675173b933d55da9cbeab3cf3032873978d6492d6f6120b9a8295979ee39b11af067c7fb715d98299e5ae95f9f07a13be69062f5ea89545c5ba99c784cdab1e21d6e8328e1f3199827bb6c1a6e1690d5d6dcf70dc0341d6226f8adbf2e7162cb6b9c8bbfb69b3d127df71b991cea62b0c8c90ded6c8421db1d3352d72e0467d4ba06e869436f540a3f4025ac04c4475d2ebc80e8ee5bb855c23a096b6145fcb3e6e68fe01c6de63eede5078e3fa1369a56225b576c904119e30a777193c44f080fd38d417a15210cc5e56f3dd931e98dc156"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (284, '{"ob": ["15151515f6eedec0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cef7dd86555504939071ce279aef05bd6ff453d0fbe678e38d4e114cb5ee8dfb565035d7795ac84deba6c73d9042e5a710076f3d4874bcc8a47033192ddadf3b025be0ca4dce16522ac0d957dfb877e1876a8f71f10b8e294b569af334547cf1e20221daa607fda2a1357f001241616c97d84091cacddb85eae1be91587096e5091a923d949f0656bf3552d9186e5b36f1ba47c8b018c128328458341cfe24538d851a84b4b13f2d3e89dcbc22801a5c82bdd49656deb8d9c5b652137b5939ebbde757f00ff9edd16313f5595788bae4701b2e64d5c04fa3aaa831c08a3141caff764275806c0dedfada8ca21d223046883da2d7ba5cd05b8021dfd3fe2ab9421d7f3e6928db2c43d621c759bc0660ba2f7ad48f350d097fdccbbae0b03cadfa7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (285, '{"ob": ["15151515f6eedeb4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6b8582d94a5ebc59a02ae7c145225ab02edede333ef269ea86ff224ceffe73798f482ce6fbb5348d78141d772b6473fe11e48e8450969c86ff44908ce870120fb7c7fcc3d5efb5857f6bc301dd3522408a51064a3e7a9db5968a1005807dc6c75342a35cf9b09204df2bcdbe6000a8d33018469f0e645f1adab5a3fbd1953645598cbf122466b0ebfb480f581d80bbb5007ab764d4e63d2bfa8f96c44b883f2eb65aaa454b96a97e575e93579bb2fe4d28a2d4c0f9b3484f363ce57b9db0c75eb127fba6ff459d6a0ff27fd315060ba2ca466bf46cd77eedd68ef84d4e9fb33fe5fe3a7d1fcf08bfbd412184c541345ae016ad1f6648466003405cbfef2d04096c8a211b67b8e34e086ccec039308cfbca767e6cff442ddc844cbe0b3528a355"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (286, '{"ob": ["15151515f6eedee2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6f72f07142c61a1ed17e8ebce93885d3154b62839a9b3769c9c72be6a76572717caac7b4fcca8b411e7311c8e80225aa3d10bb4d6ab3ac54be69eb25cfaa66b3418dd16aba231f6497fe5a648f6da2e0730183aa200d9ab1bd97d315dc93ba1c81efe408805473fce0835c65ab1ea602f49573fea51fd18c1c1593725d7edf6bdebc5def7c2ee6231c7719149fface5cdcb3b1800624b36973d03e66f30057becb25405779ec2c73d90a75f2523dc59c70a9c3c0eeadb140f83df9a79b83ce381d85a77cd48a290e8834c22a86f61bbd3d4c37ea012c488d66259a7b297afb55142d13f1bd97bfac98e3bcc0a091144c81bb6e4957f0524958691838eb01eddd462660619e0170eb6ec608fe3af77a61fed9cb48fbba54759a97e52019942a57"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (287, '{"ob": ["15151515f6eedea9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc16f2ff6bba45942d7620bfcae41579f9d352b3b4dd0a01253601dcd356e10ae2a8f392cf7e3b76475800630f7f070d6240bd78ea37704462190f27c4bba859163775d7a4c8f7baae0e99c2540d081cb925259ab208ffc5ba887cc76c1cb24e11a3d0ab11844241c52f5da5d844317444fd8b122bb856af8039c54f1ff220b2e8a550d5e8cb08ba4f44e77510cb0f5e14eee16c47e54ebb77d2fb77fcc16c489ea277e1175537204967621e7d67e7e68d0a5e2a30b7e1a52fa37778ecdc79a2cef3dd9f20a056715504d3dd7347a122cd7b7172905b5f3d5d7a763655cabe5b2f5605eb615c9dacf98c9e925654a0307a79b5be1dde884e43085d9a564ea943a8c350ae619d48a58c7e0f2191f25c14313d6ecf1bac07b7905d31b3219b9455e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (288, '{"ob": ["15151515f6eede87892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c78e581eef77b0849cfb054a2b24bc9c5ee004a9d80249c1c3abfde3b88bd21afb7cbfea804bc22f4dd67bf731fe13a83b4331610cd0c8d3ac4b01a7f39b1679c8a0dbe3d3a52c1841d97c224bceb04f54c48c90f2168049dc95893e1ee9caabda61f10f03004af4684ff19fecd0a91c85fc57608d33b16cc2f1fbccedf1647c5625004432755cee4b137f5928ad1e0fb10b0e86c3d1a5d4168023b6bbd02ac806646eb497bf12f02c2924c364b6293a6e6e988cab29fd6724fdb51fa2e350d8becf63483c1a39c7ac84b892c48d585f8ca2f44ba3169d71d23c8676e87e789ad72ae81860dded6e3dd38d8b9372548865f7713ba0a068194f118cecafe7fe593989447cd5412eac5218d5376b44cbd90cb391f3a70bef8eeee897296ad0da9f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (289, '{"ob": ["15151515f6eedeab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0bd4568f0ee009f6b34570846f904ff649921f9f43a5442c7d28f407aa85470ea0222428dee0a2a4a8ca435386c83c7d2452f9a8b290b09956405972d9bf4992b94a36496e921743c48fa86245adbd88f414d9973e5f36af92c86f06d0a810239edfd4d3ef64e1b98077b18f1c52b21df5ca5627995877e3af3797d2c40ccebd8e15c59aa475bc9cb8e5469f43ed03e51382bb669ba761bbb3d2568a67cdecdadc43c97cfefdb569ca77b57bac71be0f16b64f682995ff3edcc6db5587edf8eddf356b51161f3730294d25e418227a82a5636fb3b9d6d70f483c7996f253eebaf83d61a310ea493752a7315891c6497b133e71b6b51cdd3f4a5884b566ba6f0181412008824dbbea3ec9596c8e0aa4f9df0ee3cc66f17b1595e86105978cab4b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (290, '{"ob": ["15151515f6eede79892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7aa6b73637d6c9225b1469118f9fcfe6458dae49c3fb42ef12d78c396bdb873716961c54bb2ba9901b6b4bf01b877d0dcf18230d2eb4a2da0d2a01e23f43682f35efb25375333d1ebdf5cf2c0d777e06059eaeb1a644c64bf9d0b9bea3a7f60340971b364946dba88e175a49fcdfc5f95215fe9cfdd16f9b0df72700dba8f013a672dff913bbf268026e1a3e5a7ab172249ae6d2e9593c441dfc875028b7d0a7bf4b6537b4aacf294562d202d8aaefe6ed2e931002707b91c2c0f0add066ecb28725d3a96d4b5ae80724514643c672b9e033d1f70711a60e66be31e3e33c2401620f4c6fede841d1bf08789626f68d5019c308b17ccb6207cc49451e6042c97be0c265281c0637340d96cfeebdcad63ce9bfe68f8830bb0da720df7c6108a1a6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (291, '{"ob": ["15151515f6eedea3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5338e71d593c6401a50466237aa76e46ffd8c25afd9d53d540728d7b6ea8c0912cff879eefa02cd258515cec98632cf66db887ab3f760ea91c99787718c0848354f207b7151afbc9fa807fcf0e76965ae410152bcae8274a25285cde580d6b49af4e13a9e39cee80f4ca7c70d68482d88ff6044857969747f603150ef8b8581cadd91aa0c61d77b4998caa958f084ae6d283ca6f15ea99cc62dfdf986a1a6cdb3dc2a9676a7dc84ce747d752ab1a4e6bd3c93311dd7165c06899353f3c20853ea1ec989d94c9b5f102000c0492e906928646790d74189b12df644ab64d917cac90ee294ee3a921b67a5f35c5d61cd849967f29c30cea393a9aafe84bbe7c95f70340077f349226b2aa49f1fbccba15acca32028d64bc9350ec5b2da06d327c60"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (292, '{"ob": ["15151515f6eede4e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4224758b66ed2752ce25177a94d9fec0ec1afa79523781c06b904663e8142579eec5731082ae925d9ba237c7fe2ae93dd541b63dd9cac727f31a068d67853eb924c244a17b87453694e7f0a8feba8d052ac08c24f74c1f299b6000ed06fb605134e4a39a99672e45241a17d4129887922da1407ecffebdab5c79aceeaa1e0a80ae12820fc2d93ddca318e82d1b9b3524637d622e9f09181ea3680d463733bd67203e4e827ce21b791dee2a63bdd2f71d5c2c33f7092bafbdc63b48b850e2eeb31c5dcffe3b8608217054a502098254d259244d66369019605f37d3d306acff07aff2e0b6cf4836a994ef2da6f682f8df78af35278c6e4ed78ffabc4026c2552dcef903e63474b41e0eb46eec860615709595cf7280f0cc00d828d3a808cd57e3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (293, '{"ob": ["15151515f6eede85892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf8f46a4ac5f7d0d605b70f503231b4810ce738f93cd7f358525875d67247f32a768d23d143dac388324a74bfddc29d475a6e03715b9fd8834ba1aef83f5731253e1b92a013a986fc4652d185f526f41e3dd757655f023083e6e5ba833ffba86565bf8c34bafae64e50d4e6e368460e1184932cbb7e0370561b20ec9876d3975c8b90ffa52c508d05799b6107a0c15374a30147d85dea8891642442a33fc73285e3f796cff56be2a8d4070a4b59cf7959eac103871fe0082d1dc63dc90aefe147efdb23e2cdd7f69defa8be68de8d27cb4e4c558a5623a8f10835e66c97f04cd545ce2bd20cba8554d62aa000bdad6ff1f867e7f680b4b1a685f309911456f33f5185698ead46e1eec03ee92695c39cf9214e6b4b62b56bfc581a41690da89787"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (294, '{"ob": ["15151515f6eede5c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce0efdd6881b6cc034d6a1f52462d2abfe2cf7027642ce3e92ec3683f298bb992647583704681a4b1dc216e338c324a084755a028c4761d5774cc705d88d2c3bd3a199ec72b8b035eb4cf0489390773921d7abdd05fd0ff77a9b447e0ff9f6b1e6112a650b0cd12110071adc1d25980777c6219b6b8b80f73640756018bea13109b0132cc9f3c1821900a37008a26129b4fca513ee91ac78c9f3a4fac63d718cb710185f09bf0d659511c3d7488ef64f31179155b95ab333baf0228631a904e08f7865d341fb7ce625fbe5b24f9852165c50121dfba26a56a9110755fcfa1b2c05cefaaf7cb59aee6530beecb932dc00074ef4504775cfa1d23ecd57ebc6a97f013f54fb2b67c0513bb8486ad6d71ca831014f06e440f92c7f79c746d16cdb189"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (295, '{"ob": ["15151515f6eedee7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc66f2d61fb96c5f3c54aa238256c077defa3754004070f665869c160def59cf15160082b0ac5f148bda1521b90f28b867a2234325df2cd315a9d2cdd6f35979b9879fb0be2d5e271d7793ccbac30f8db0f9c31aed37499ad92e6714f43df742dada478aff94ea5da8dc85e3940e8fbbcd9fd00e850f7779f1a39d04d165ffd0139c927a70299d4435617558163db66ab1b546a88dc7be6641befa2fcf9a019cfaa5caf3f524cb3dc1d9c2b8ef92ac0b9f7078f4b6e94778e61a5b11730134b879d7a7c25933efdc839e22f3c55108a44fb551d0e784870fd25a5b7a28953cda38088e5941aa4c2e7d6cd6fa21ac155fd142cc499505d449d3a2d2eec66542ba821a0c92927b7635871dacf271cb58d65bef4d1d93eda49b592c5272299135930"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (296, '{"ob": ["15151515f6eedeaf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c86c2feda3c3ea4de020ca73f34d54a46eb499ad73216cd16a7364b251ea7edcf6dae829b99aa5cbb0e0668c30709e36a28f27e123ec9cd63592accaf23bc67a2b414aa42d4a56df6ef9e7cb41ce7c8d5f5a354d5f277bc862c2a56de07c856cd5e01545c1603dc2acafed9061f0695925e5bce92ab3a3a7c62f9e7a608f419ae6b9928aec7a5212726abecf8bd07c451cbe3da66edc004d035e7685862ed5160874aae33e6b4005dd688938908810530d227f7302a0808cabab7c8697e187882bdfd272fa5acc142f5faf86313449625de3910dd9e8eede25787cfbaa064d64877410d5981e9b4ad5acc6e45eccda862057b963db9fee8017cc18890c08ce1f070833140613d977efed067eca05e1618a8e98c25fced556064e114af99dfbabb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (297, '{"ob": ["15151515f6eede73892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce2ca32f2b0d837e3c590ce5dc38fe51f9814eed2bac48c6cd194f3d5e0431ce8ce7c6e227abc8aa1150ad2b8e99cf429f592de09bbfbdfc280e9c6a73d8d5f193f4c0d70139e66d89b4b3b0488ee088352cb07d1760633aa4797ad2ddc91952a9a3d1f1e9239ae6aff163679184cffaf54564e96c2b3852fd8a6e5fec2115ecbfc3ec6ab26378bca6626a978ece04d58358b6c6f1ddf200accbd0d0874144dfbc604400c73fbeab61fe37a53842fdd73031064552f3157f9e44dd4c56678c58dda68bc80c84dd9d3cbd3bc61f10b8f095db6de56cadc954704367a0e01d372c42d4fd94d93c851b64cb9d1e17039ef230d020747c6a11445ca6d1f8dd2f4db3ccdc0b12ab7fef6d8c6a849fdc58bd91567649542508eb9fd631accfad2b15cf7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (298, '{"ob": ["15151515f6eede11892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2b2bb7de79dd121dd2a00c10039b690199580f18c855a789054789451fc3841755b0b141855dc27d0374ecb51f476c5d63f03439167dd601b97e78129437be70b01df4e88d7814804026f6bbe4b635493b0f8e1bd0ca0f73bacbaa4199c8fe10c3792c3f527f75bb74db565ec98fc87d846dc5f018a1c5b3de91cb78bff3b9a44d9f872c27f7d2b10f4c11491249a3c5d09e2b4751f232d4c84d03e94980cd35a8ce2c5db0d02b8bad29811c143b18d714931b07291210a0073fba49dda1b4dbf376d1fe09489355ffb78136ae29dcf1be47af4835353cd7f7a5a48cb2304801937bdd73b6b08051bccd72ae9593516f98deed0156ec7dc91430d4f80d7492924c99f02694ba58a7081de37cdbb7139a535f838a9740ea15e421714c66a77f19"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (299, '{"ob": ["15151515f6eede4a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c38df4ff3d87edf5cf2f6299b28220f89ec08a7cbe419b5e9116edf1d57649d7121ba59aef6de255e3b1d524c8fc64d3b48b6f7cfe5b01d7ab44558154778815b9b5e4d62ffef107a11776af16593121fc4269ac08303959ba069edf70af52f624d3c862eae96005f7b9132d67a20ab3251b12cfa7a9ac2b44fde46e11736faa8a5dd094563abde37c29416e15ba4ea866ded40d83ea0cdc76f78b5dc5ba73e03c80d5c284dc5977f1103d31a1b7c65eece8466256810e292520b662af8e20ba02f1c5f2ff00747b302fc0a2509ac098b7e5d67078187581c68b5f4f4b8b1ea4bfc7ad92dc94de959ddb48d305a2728a0829528d1c3982191ff836d960c417f9905df0bf78f7d9260d32b13b5309f21aece2916c9696663526baca34f41dfc001"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (300, '{"ob": ["15151515f6eede9d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca46ae0536dfce5e351107912191558dd331977967ebb2446a5730eff06090ca9f06cd92dbd25313b387514d23bfd2ab7db4e6903c1bdcf7fc77d877a562e89444eaed12172bf48857accb0a4c008b84d2e39adcdc807b085839de5dda16d6a0b4fe69eef090cb68a9018516117650e81f0d8fbed3bc2ebc1f648742382cabcf81083327110656d55216ccbfd0899cc6b7ef7a074fcaf4a47eb5e07c744b8ce12219488e3859b968fb56b5541e12c12cb953681e98c7266dcc546c48e26d07fde3a185e56cdae2cdaeda4d6a74821fb5f45e205c49f39abbf3e94cad5c044627fcd134b220195a4592b64b80ea5cc1c974a5ae3c54a24c4fcd9ce11c08028c2e1944c44b6cac776c07484ca89174a8a742e2fbdac5e05ffcbf4ec2e124ead7c0e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (301, '{"ob": ["15151515f6eede8d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1739681e4604056af19b185d690267062be738c2a17eaf39930ee223f9f1c870e9f2db951a0820c79564503697f563ada502ec23b23b7cd75bf804e3ee947b6e8a080b0e9986424ac001168be49c94560a052d6d8ceea455c68007a2457d4abea79178522e5c37d65ea65d7f2fd310d6c6be65d3f9029eba82a111cc2721ce67eb915dba2d5fee1eedce5906c71d44d9085ade14b5b0a9c1f5707d78d62a6a996960b69a31efd4db07aa66db065c31edfb8f22b83a5aac21c7a85825abef99eff3fec7bbb141e3dcd6191b30415664b22ddd6318594a109dcbe03091ce5f56866594c9381d0f64acb42033bad635ee1086c5de2c0a6efa27dc8a604ae6092d2b39eacbdbf3a40fda8956898d84fcc61f38be2cd0276020a0b84da500651b2abc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (302, '{"ob": ["15151515f6eede08892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4e6e051c596652b9f82982e6d08e0dbf10a15660576a799d639bc9b7e7e53fa421a7f32079603609a075c901eedf07d503752edcbe9d9e5e66d6f46b8655b70768b4b9cf46d9cf93415d3bcf90519da3109114d09ae740c964eaa9ef7b02d7aa1afbb0c69f43344a4abf11c1de52c8792e57438867c0f44f4d8c0bbf5a6b2bc4b20e5cf55b479e6bf0f0be0ba5a99ca430ea0073bbb39cb9a0bf5ae5a61d8b94bc2139f735836ae03ca7b131afc8897419cd539bb2d3d3a37f0c160a1c1103ec6f368629c8a8a0fa37918e0caf3a1a8e8247e2c5c7ca39f9679a70e1f19496887737413a6e35a75123ba6c6338e0f3d6cfbd447f555df24bc06b626a950b850c5aa3e733b5e6e84b02f360deb602caaf2ce9d8cb0a89b67ee8db271204c83518"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (303, '{"ob": ["15151515f6eede72892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cdc94cfb1b543631fe51d627f244dabd48f485d7eb05515b9d5b5cccb10f5b235aa64bd123a98d93222601b8fe19d892ea048b2b7308f1fd7d220b4e37a184652553da1c94366ae716436cfae6f93a4695e1bd194ff8eb5b3c8cd6d0791e4d508cc795fe108e07cf6c31e09cc937401648aac3042b696817ef6d4d4c083d5cf906b4ad87a26e50de5e92685b0ed1b6929198f020de29421303c728743345ac5dbc9d16d58a02474877de2072fdc9d1714c63c137c79fea76bee7b28db5b105f9fdb5412bda7c81464a47017abeccc8572f14fd1fb219906759e3f41177ad2e1ecfe1b01da32f7a4caaf65ec4e47c1cbb0f1b65ceb66c4fda574d3680fb9cf79bd42151d8626b21719ee8bfdbadf1b8881dfaceaa12b5623b620c321c104b8526c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (304, '{"ob": ["15151515f6eedee4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbb7aada9fe02bb43cc57628fc9efff145ba882bb8a86b152964195b6393557a0b1ac6a3d2e932d7cd5993fb62a6a55d55d476f4286def1c63baf3258702dc47cf000276f57d24ca9595841fe173e07b2180f0ee032b7841088ef9c65320f57e4f2fa0281d4434837eaae3b38d7bc4c1a21c4afe5ddc6cd290f4ea4680c4fbaa41fd592c597575dea995543c38449b147650878c245d182ee40abe1c9ed402a5abb92897812ee192c3ed39ce8bfe4ba8d82ed2598835000f0e31a22cfdbde438f79710b950d48b3433df3cdd9b26cd30e1ebac673f1525eac605816ba813a3f40878fc5c437d38d806532ac57fdb401e2c53d9c942d438d68ec567a803a60ff9c35c340d288d62a2e870690a2ad3ed5685b59d9f8994563f32dcbeca4b4967acc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (305, '{"ob": ["15151515f6eede52892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c702a366fe74b2f55a97a6862c983362c98a5f371d5f7e4ed9fa958c34784b9a5054940caa1bed67073480307450ec865add2d635b9fe831ec7aa5e6ad91c2b9ed51842f73f0022d940bdec7a93db78338a4c5cde71d518979c9007126ce315a21490d35cae2592465fbdf963ec084fde87e781e30f570a36cb5772e8b3e70434572509fda6833a6e1ba72e52e2770887a099aab42fe22796ef7d6c4e19bf2df788dde96b0639e2f872ce829c887e9b7164b87ee6572ec0fa9edc4cb89cea47c8df28785e50d2810e785cbca1fc89c3abdf52e1a59a79d4bcd1e6359001e8b4132f68a4ff9e3fc1c364a97cf18f6f4a030dfa39a705a25af05a478c477c268acb0d10b496723118190be4ecad036bad0fa54eed9a2a442f8abc86e49d357f4e44"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (306, '{"ob": ["15151515f6eedebb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8d24879d27ebf2d8eb2dcf6d1354d378d8be6014f7349481abfdc5e3cb5fe819868eba948d13d28f9db331157a802400ef8fae9b84f8ee1cf37c7a888ed62604b993e76fff90077bb904303c82cd874a32490304d19e56d221fe82248a7c3a4b2c8b057cf237d970e98e12993a000527d9c6a85e3ed518db44298c1c50be76caf3378426b8bae95c29ec15b0b43cc847c42f7cb2747500be5370c53d55f67665caef52484cbad2dfba52af0e0bde891e2570fa1c6ac3c8e29cda2a8a86b115abde5aea680af78b7245f4ed621caa77419f969874e12dd69ed3c09bfff882614691d1225953213ef6df380b69d3516dc6ba12ffe518ab48480ea5f8eed9b5374aa1dcaafaab722c1a4fc9757df3f4f1533b1b4b464a5a3c5588ef6e77c31ec649"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (307, '{"ob": ["15151515f6eede7a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c995f75f8b6124086a980a0ac76302b57c8e1bb80bf02f4baa7c2dfb55dc22a140c219e2656be1eb147425915262749390a5e593dee7fc4157df826a601aeaf136ba29ffffe951d92835e62bce29d5edf1cd3ed401a0ce59b1a441c46b00bdd5d9cd72078e5aa3179ed7230cbdf47a2be2359e79a05034b8c1a357c3f9629d0fcc15b7b4b5e707838e876b29115e721cd6b3a7c2081d14ff151914ed820cfd5eff8aff320e1766e825d191c750ec462b4099674cc6b008755f68f543c3807b78643e1c2c1491a11cc3d1f2425fe97bec1899e198cd1b39a513266c6ba62b912955059d09f4f42a45096c546fd492a5d1dc4be52d30500b5bdc1fcdf4165eccf12afd99bf33f0a98b5462aa1dad8ee2eaf53c6e44e7b68928c6e1a28e6d3c548d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (308, '{"ob": ["15151515f6eede20892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c625768c57a0539d9ca52d1ce1cafa1e27c11482bbee4f5f45187a1e2fc12fa2deb58e19339dbf55a8ee8b38df1530e95f72b4093440395b62bf916bb97e78ca5d409f6c1410bea829ddacc27b5600adcc2844018aab9e835e37ac6328e1381a83b657b61a0e99bd2e1be99e1f805fb445bbc1e98f6f53018c08465407c5b56e11b7062b075265fb0db6f6e7f51ffa036eecd8821f74881f44440be36a8907075c0d41943bd2d15e1b4bc30a9991aedd6bf6025de901621ed0c27a29f66bb9909f2389151ebea8b482da8ef31fc71edaa50ebfeaf1f1bdc05dd2fe64cb3d17923ea555b2a731d462aa6277d95a51128b70f917d68cd5026e04d369f65dc35319a2d70987932534536661cd352264de2d623dca723ba6c5e61a369f1e055b3b10c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (309, '{"ob": ["15151515f6eede8a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9f07494cce5fd1718f5968871bdfbae1f6d40b52658b794e427cb41508cdf60c6df75fea571faefe949043c91ef92d05140e7de17d66dce29ef2cdb7f18d947ec20dd4d8d62ead54f4cabeed645c6998f6acfa806f7efeda03d85a1c483eedc2c7e4bafb94763768338199e81a0940adf068dff3f435a3a37ff704ecfbd9c0153c31b3a6319079ca5a4064cda42413667f24fbc282275d84f0c8475c918b9fb58fe2a9c885f45a9acb5c51676b93212ece3d04298de685d65c32350fa12357417bf33b93cf83d512f5fa7fc404bed7605e012980bb8cf6a0a43b13568e59aa54c6d00f493cbc65fbc214f04263a24277ea702907f7992d7db24d7f9a9cf6cf021ea417653f6137453e9724ebcc85c9be5130f4582ca65c31e340381a5c3d1771"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (310, '{"ob": ["15151515f6eedeb3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3f4424a608a38ca37e3f0474be81c10eda6cba259f0bccceaac2004408414ce4649dce803e4fc2fe6f3fd02e525782f33c72fcc4015d00f043b880071c00991e610d03e10b68c43065aa3eb7335a53f85d079d9117ab9c915a153f8320aa6f0e5e5234bd3a382b1025e3681182b52d791e4b82b213ab4f905a68a201a363f813237d136a7db3d64da4e11d4d15b5f6f9666dc1d42497c76e3fe08556e848a703239b5c7514c5b8330b281108434d09708e0f4818a78fd566f226912e4fe783e446e7f59fea1632fd7c13f7c40c69f6846450094a42d5e6283d59055b3c5dd014af6820d5a9111db59535bfa071267c884a6b81bbd278c34d45f735e88f84875d7d194980bbe4f2d2f08a8f5b0e3f524b7db47804860e683ab05bb93a4a7654e9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (311, '{"ob": ["15151515f6eedef9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c32b407d6213ce219d0ce1571fdb87cc0a56b213005a5b29c724c0d8b5015baf683276dc21c2f567ed0a053419168ba223bdb3e6bc79193fdb153ec5b2af3056309150cfefd90fb5a2002b2cd0e8bc77349f23d787158976e2c904404c302121ff063b8c3c059602b141bc87e6d0ba23827352061ba3a17d1602b65038a2fefc420d5f1ac6d18f526d5e7da3c224ae8a1bd289ac9b92e04f26fd559f7a2a5c1eb59cb697bd705732c5255b385285f66878a319005ed98704f4baa6affb3326018f4d9b93d121d0ee16fbb5a8e53c4722289cf1b0fedbf1aaf9493c3f30c17cec7751170110807fbe2cb503584e920fc76a2ef325035f50f4dcbb77da9a9297e3ab88e8fa6d52dfcfaab30f005f2dfa106273d2b627fdc377431dc115c5b7e44ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (312, '{"ob": ["15151515f6eede8b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c166cb96a9ec423ff66c74d026c6162322e5440dd5378a358bb1436e8ba4b0a6f9b39be3e3e51a58a5510d34692b119d5f8d9f9a1b40c2292a076bd4753d330e8c9b5404cc4f4f8c47121591e612293bfc79ec19d30c4b0452477e14e4dc6d364cb37fa155933db1719c0e28bbaf0a3e3a125ca28d2e25c93d6127bde010d25e84038393babf42fe90137f0c751c81c681bcf6b3a4d44bcdaae1584796b4d05da18248ba26b06f2591df0291cc533678a3cfa15f8ed71f61625284994b8710f3a3c260866aa786d2419cdad22061b5b1b55a8647b62c7876a1247af97d3d50da0f7689564076674e565823b9d5aa39008521abe3ea5545ac3bee111e1349a9420152e659f9d07ca261188e19eac8e6d8e1544b41438a591d639f52219ab0b7c25"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (313, '{"ob": ["15151515f6eede67892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caa48296d77697100535e0d922149cd86902e4794b64d99ac6e45d5c371ee522a28fbe29d37747400c64536cc2f14c4c1c053d9c0c6a1fd9df022c150962f97af33c825b28ee1e520f5183a7079dc4ce256dee1f580e2d5a2b0854d7bc2d76e29fbd34268b9ccf417ec5214920e53cbc2ac1bd209325c04de0adc72a72a015578fe4e36c8d48b73a7cc86f7441a50ff066b1bccf43442e11b5adc1425c9ea1b4640b7f004155019851d8c632e8a28462d317c4d5fd88286c308e9f30997d354c9956b3535e6dbac6408259074e2022ddf30d46d888b3a264bea363b62d4db9baf81e112f56c276f2a8fe4acf4a148a6ac4122d82f59d50b31ec6999958ea8dbfa94fe93091df13efba4b18f494e5785847fa80b5782d05a96d021d31780eb892a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (314, '{"ob": ["15151515f6eede2d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceb9b2c1f062bd67f5cb4faa4a2a20c04eb85cf9fabecf3acc72be68725f1eddcb47943e685b082ca07ae099e8cb8b4b882fa43a35ea6f8954ae8038b365104e4893602e1153399f593c4404838c141ffe8dcb3ed3d184da8071b79517f88081629a796c24162d575da7e162b005ca9b7298850dd65aab3b5f6de3efee580ea481e71edd0c19f973b5e86f07fc9d946f1581df715c00accbaaf8318850d9861d049b8daa11407fedb27c579edc7863046bf593d12c1675c795d5b1867e03df8d4b1567064dceecb855e261d0b4286dda1cba64a1c81a9087a4cef0b92bad3d249f4f4527c18f7b75454a7b7b8125dc9c729d20f4bdc533bf9415aac4e7fcb8d5755749415416c723f9025af2b070cb519e8aade87ba6ee20bd5339a972a6983d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (315, '{"ob": ["15151515f6eede37892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c77cc577d66f7be9c3590eb84ca034cf5c79d7505df0a6db64c355bf2cf2f2fa26d952e2d274f006cff99fcd709eb9f228671ff03a790de0c61a6b024330cd12b29da7cdb6eb8ab49575b6775a1073c73d5b8ff9b6c5af5e7e5742152944b8aea0b0b8d7286ecfcfe7ce28f1338013c07e66612e34df21b48f347381256d32eb110c716f534ea1fda78eadb8459e9fa5af5825e4888e35466f58241fe04a3ccdd067b16e2da72580f0dd5ef2ed7b472aec711f999cc596d31dc1c66797598f8a16a2b9df6fb5502320345c044782444d9ba70258cd89ec91cc6d4f46b59914eccf6e1b6c28d9ca37bfaf7e23bdc9b3194c40bf2b67c396a2675de76db44fd5b1fc9bed6077bed75142a972723edb0b7e840866a073270d616573cc8b7434f2048"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (316, '{"ob": ["15151515f6eeded9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce6f9a247679238b7c60678115a5190919f178878cddd91e3858a398e0a2c2e28f293524793fd1e9e25f40204fa503b884f3e5f0e7fe6d7a3586bd9b64f446b2770bb23a4d9a25c9bd340c0414ed693a20ebe477ddff39d823a384758f4b91b0aadacbcde5e83a401092958febb28adf3440eeb2461aaf2df7307aea7b10a67709e8cb8e0923cb8c2089a9b2aba284e2f290fcb64d0985be3841d1f2364a71085ca7911aaf073509a5fa6fee85caa2719c22ca95a2535faea12807f65510a71d0a965938d01c458d07c775757a57d8b5e66b5a7190d3117a4c278874ea560e2a778abaca39a1034b1e9222eec98baccfd92cab72ebd2b6733ac5120f1b3710dde8d9f49aa640b2cd36037ccf278fe19104bb6fc06b35861831e122135060e1fe4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (317, '{"ob": ["15151515f6eede93892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca97bc59f23b2b9e072502973541a2a123f4da219e293b93f05e3ba2b9445a8817825031cd2d10a2eb8443822f3398653fd4b79cd27c75bd712dff77345a6a7b01b3b4095cd74f9f486334a4f79c61e2e4c3a2c616aac34eef65ae775267eaa13698d330da39da6cb55c0e01399e3419363e43363e84cffb1644110384ed862a4a37c0fd88b997d8d3a96f8b9fe326580919d2b3017d3d805f2c3bfdf7189a1669fd7776c93329e3d2c5111cffbf994c11c94a17ce09af53d8dc0d4b2dfdf133f0dbe60a780578e5978be4e1672f4e0b311d9b0830057eb5d390b5e879dba401611338b2791d023401224da82bed60bdb267908e1de5c3e101364f354de53a8886c28f7a2262d1fb9fe4fda9dabd40aaacf9e4aa8a2309d625fdcd2b402246209"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (318, '{"ob": ["15151515f6eede24892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca7f2b9d31ffe185adcae066340c780706c1e01326625d6a64951a44c2788407cdfc9b575919aa63f093af15599ddf023c96d8338484b4a8106d7307bfc2c52c781bce3ddd382ecca34e0b9b6992ae4d08436d689fbbc0e32cfc6fab441a16a627ab6de8d02a0dd3ce94eae607ec1bb54d1e83f6197b95e66c91435ee60aa5d0b215c3e43a1801323ab59993d9d08050dc6295e76d371232fdec8381823944928d54160e578b099d7180766f9034ce717248dc772776ceebacc6f2de2dfd978f01d29f0237c49fce25845c4816c73c8df4e752138f72cdeb199feb4b67ddd2c00204c25fee5229817e2ab075a9b4670e3498be96072af1a7e3eeaa259564d904cddf108a5e8bc152b555bfe7af5adc4367208029048e5b3e8727d271176c84762"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (319, '{"ob": ["15151515f6eededd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7dbf735036c1fce647b74ee2f3cd5194defa13b427f1b7cbbc883ff79981bdaa877fdc705c2a3baad2a40c2674f529bc9e321c135abdf717b9f93bba78217d177d4e336de5d219e8fce8e75a1f02bdef00c6c72b81b3c33577225ebc80ac30900d0730c93b9ac3621f3aa5cbbc4ec46d90a0c8a8fc83e98aae636c4dab2891f5dec3e7f1224ffd90a36f1e5b5194303a7cd3d376b1e06fea3635d0c88542c40ee65e29aa7084ba9fa316f9000d3a6796a277b6f049bc6f9acf8a89fe1db55f2026b5f6184a877bc0c90fcdd714a262e3030eb734d1cc0d24329dfc6cc0db4f2fcbddf9a99609abe60dd93d65d1e7cfb64b5e6afd2606fc951d63e57c90525e1749ed8434c96435381218631d29791180e467b99fd77e6da982a46c18d6f1ed29"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (320, '{"ob": ["15151515f6eede60892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9394ffe7ab878c015251b9001a140e235cd133f0ce5bb1531946069cf92e291a3c6c102c6497b59f753fc508069638ce6ddf2d10ef1cd145ab1492794a745a57d65f7124115d921862e262b5e4c6e584f7efa91979490f638a424c4faf4efcb6fdae22bd97e8ef5582e3160daafc4618412a06b7ad9a86c05688900a7a8d6028c7625249e903af5e8f51795ef7a460cbe3c127f5174e99b6bdb42706a1be28d36f2daf17216a1753a0bf577b864b88dc00b621ebd9bd413d27ec7b7b8b7cf4e171c96099fbb3267fcdfe917b31c2b3dbd7159b41a97fd8e52b9aceb8614e6613d78751e0f25118c7325518101c05d754da8d5f2b2a0031bc5eaf85ce8f3f516a65e1421b6d783eecddbe5c309d2076010e6e0997576be5710d36488293a3a235"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (321, '{"ob": ["15151515f6eedeed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9ea21f3826202e9569ae0dc7a8ba3e087cdaf5b2120860908c1a252638fa8e9e86c067e85b0eb6601e3a5bf5527e549c98c14f73454776f612e09bc2578634a31b604089f625e6742a681e93df975f819d1b15e00102c6ae57bbede205f4a8169f66ac329f9668dd8b7cd1cf1dca0510285bed63e18284f5e6d99fb06a16e313589afa9a1247e5da1a7178ccec9174a2a0f755869c713867d7f858d3cea2a44c826a412a05f716a6c9c02d2aeed2c067ebb1a697dd1379ebf8b10acd37cf740da74932a90210b4e463b28f08b897ff55e2fd26d75e2b6cacb8170175e8ebb45cc4a872e58c12b568498dd86733725aed38a259a448d7f113cd298a686d6c99fe5c2860dbca592a023e447ccbd0dceb273647a8125e33db055ac53e3ae070f8f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (322, '{"ob": ["15151515f6eede9f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4dac53729db02502d10ea9f4bdbbff967aa85987de8c55a2bfa5d4a0f603a01f9fbbf6fcb2f0a8bdf308439b050670c71549a42ecca46a012034e2feadc757b97fb15f46696f06ec1fdfe54c30b64b53030ba472ff7788368e672ec5504d053920b7613bf923fe49c7ab627448885bb7dae83277d2f87c0002ba2c1592828ad217016196445a521e07f70e10efc3b8c8180d7410bdc7252362d22382e8c8a9fa309a1a68a7580282842a8b79f8c57729c69961479b40ec5ad5fcda927181ecd202817b996cdf1928fef017bfc1547f9009bbc6d4c3704b86a6cf2629abc7943136fc9ce01f90fb74c2be18543c5e212a9f61b8e0fd3e5273e74bd4b31aeee0a3572dbfe5cb04a0571cacda18d94503429ccebc6bf142c5c8bc500dd7f68cda86"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (323, '{"ob": ["15151515f6eede6c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9614321d520b2f64487faee08b8aca76fa4e43660aebe538bb5d564ba73149e244562d361b0062478972e39824d540be8b2b75c54adcbb49bb63691f87d134fd7c48d08e23c1945f94e720123e3b695d4677e229b6b6d0d8fbab00586893873b06b282d66fc5941a52ba0fc426d16f32178cc4a14a0750c8c8f4ebb259efde06d7fa37227640c1e2d8eda448ace0c2bd1351f3ac8156308964182efd2302d1e105b9594f768b437926a2f725b12556efbcb9825a2b1c1f370e76454641373d3f4f92edf4550c7bac8ce6472a0442de4eec1f614292258e3e69fd12fab4bce43d60e75e7d366772e43d2fcfb725d10cea69c8cda7c7a9531908e3a2ca9ec2920927363ad7a4dac979e739247b143da67661582b491d7dde8743e56f36274ce04a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (324, '{"ob": ["15151515f6eede7e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0313e088ed39ac084ee372c449d6e58bdac052da8231c5745caa7405d3d6c511080f96086d8a1ca405396e6ebb0fd60a8de6df286f94665a2e3414da8db7ee7e94d9f1b347246951de57af02309124d1c14641e0a72d771a3ad4d5189a067ab5dde1290b6b45f28a4e656281bdec6ca6855aac83be82094693bde787d7f9c4233553e79a049870f2c5e84bb38106c036d191db947eab892e66535d40d8efbdf9a6635276408fbac5c918d81a28a371109384bbea7a35077b1d62e62a6bcac6b49bb9c7b1b700f64225e2f448f2e7ec7af5793bf1a20cdfa76724b4fae21eb8f6583a4cfc66db9d6b692b16a9eeff279b912afb45f5fc32831f17dc7270aace546f049a110d667ea9ca8786f3bb3a06517b199d276a3752222d8667362b72644b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (325, '{"ob": ["15151515f6eede76892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2d39b96bc4e3ea710d5148db2696f10e94bbe83ea154023cc04720624cd794c51252c6d30d240d74592945179903fb75581a0925514e7150524b023b193e817489104ea63e00077b24671efa4d863c02535a5ea429a929252c3d20145818d9f7e4b699eab4a3d9634f101e93601020251d9ee71252757312aa1ee826c08770f961e321461158e4909f9ec7cfb13160082af1d58bae39ffd00f7366abb98125a02ee028094c6db186a04c4fd28a5a64170fbc2789407d497bd58ecd4dbcd51e60a2bd08ff91f38619ce5733d4bfe9a9e973b378a81bd3ca4e2757119924f8d1db63218ce57fcf8d9eca63b4ea2226a070dd4f91b45d278c87992c1732bcce8fb6ffd35afab7a31dffd3e71c6af41a948e3c263c47e2929ea9359a5acb85a095bc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (326, '{"ob": ["15151515f6eede92892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c567b54bd7f6b00e2478bba36e8d32d25b2c1d32d9192396d8c18a2edd8eaa688451833133e4236475d6c7a15906fe80f7ccc7ccee7663263694b19a6c0ea8d17273b07cf2aec19f06b79ef1a50eda25f7f62294f4194ae9232415a2ef64c1e3320dd21be74cf35bb6864a4f2cdb07bbcc972c08991b0b1a2763b3759ebfb81a394fa2654f0c60e13558087873ce9d22dde91792e2143ad94b2f46ce617986b4063eb7b24d492fec40bb9d572cbc7a3d2f5f9b41f0a5ed8a1929d8cca826193309f574620a83d26de1c8ba9a542d212b6f22fc43064a7de91d540d0e1a3dc3facfb95bb9d25dbbc8e32b09e815b63eeb46d27806524d4925e6f4adc9929d3bd38a448ea8ae200b876f2bd5102dac7c989b6df853178b25b9c88a39c47bb88e610"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (327, '{"ob": ["15151515f6eede80892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1762acf2f3023d45cca56ac38062c282b8503f52241ea2ef14a8a62aca1bf670ad067ae12aadc9cc155263032ad31ad0191253572f9be12e191dd00e32e961e6986575a36b4989d4785e18a131ff14d8e188d7c8fafc089508101cde43db875c4ce00cf7050070531d0a3408423af4775a560fa081fb90cf48b04fbe475d0f1b1d123275d187e27942b10ba7323b4066ddfef4bd534a363989e05b1382d4c0a9ddab40c2f6b4970366c26fbb3fae5e4074942b8a4cc38975788f63e2d83b5ee5e5e4deca612207ba9e86688ef5614828c1413a7c090f853d8eec10e3de5ce34068765358f9d0dff46369c37d9cb38e45aaf4e0f4733ba8bcafa2b2dc4f8434b621216538774d5965843dbfb4f14fce994bb6dd9dac9ed825d90f0ba4f911a20e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (328, '{"ob": ["15151515f6eedeb8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce01ed6070c2b0f77a8e116a7d1e864e4b29bb46f09da86f50a9067faa6a7897254716fd477d7aa7491fe4e70f0e3c5cf9ea7eb729e359b757979f3efac19a4f09e0e3d7483e191b80a0434ba8ddb17375dd56d90fe743ab8c0673ac9fe97677ed52b61054129b39b6ba2dd9699042b0e59a2dc83d7599d5ef77b79d35cc984d12e2c0d1724e982d384e4775e5f5b1b1d95614c2a9802ea425b6af4aa1b8a6219895b4ed48b5f023a6d02ba8a396280561d003f04f4df6cac138902dfbd424db39103a6e0bc21a94f4c784f2144550756084320fbd1582702c9d412a35ef7e18b7f6b2685f2de0e46000b01eb7c71d28e5aece2ce327a0756959b61790cccd1f74b63db53da43ff785d15df942679635c9cc2e44c87e103d073b42b197ca1ce1a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (329, '{"ob": ["15151515f6eedeb7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd8f4cc5176f436b10e68bc91c7fc1bcdfe216c91f2f58242465086879ed78dfb5b9ae2f5e5c6e9898a3f0664a9f38c0c9f2a76366f9db51f5962dbbc2768ad0ffb6ac31a0154daf5af1bc80029c84126959e066afd2170abe0f2862defab10950430a274d080e279a4f79a1420fc74154b7aecc59f2adab05fed997a2d4f17bbb3396475b8745c152534d8dfc7caa351ca61c3587f173f0ee3e6761107ad8a1737a915485693ba8b39f69ee2dd6e95e32717a6259e3fb564ee59895c242e2cb5b26acb6bf9ef402aa7cb43f50e475272ffb1dd566c31498cd15480775d0be5d8a8bc093fe3dd4c0ede3be9d4bbc35aa2403fc8508a509a6a196ad83934cc876f9e6b921b7dadc1f0b03f88078a0fde55c887a89ef8bc4b7a8ace05c1c59ecba5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (330, '{"ob": ["15151515f6eedef8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6663abb4793c8585b40eb824ebc3862bcda047f6b193b3fa3f144c6f938adccfee5f5e8810e889413314bf029c7d475c71f4cc87a7a935c55903c19a302118fc9da96c0947a15cb01558710bc4d8b76b32a45a32754d254f81390374c6d839df61bdf994b64c65f5bea81e17fce47dfee62c9f09776d8e91692a811ac1734a584bde3b864e3c6e93efa9c867cfcaee9512ec5feadb32919c92ea194aa8911f3b96b6eec633988deb0ab35515be077c82c00e9bcdb1067e1f51b75776ab35a055d38080b082f9d35a8495546c7f923c322f0ecf4750888059eead02c85bfb393579e83a4b9792e1d32ba1aa878b7009acc9cbd2c5d1bc0b6e80c00f18fca61d0a2ef8d75d3677bcdefa45a1bf89c4bc883f0235e032694361355cc122766544bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (331, '{"ob": ["15151515f6eedef1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c433f5371ab0edbbfc34af222a07c344b503fa827beede824657cacbd8e5a5144005a277afab27dc843e135d41c8e94d016a2979992336c453f70a6e1855899e40a5eb8afc962f01979d89de45aaf61b24d3da7fc8912da87c764a3e56baa4884c0d8260484635cca151242248ebc084c22e4c2cb3cc084c3eb8d785f8f5ee8d7d44d519932d6e32845af9e68666d3b03f1c19aa5ac760d7c739be58e1b8c2735cc73e689561660bf2ac761d51f84827e10b94c2e87da1fef3c031754edff229a9255f7ea630d4e9925fb6559f750d9832fd0aca26db7f3c4f5c11a4661441ccc78ec0e199ea3efb252da67322ceb7ae9d36c33863fddc0e600584db9f13a30449cb5e6584cce2820c1045c7cce8f9b340727f0379985ac298309e78d5ee2e44c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (332, '{"ob": ["15151515f6eedec2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce32ff60b50e8afbb2a4d6f59c17a8c794eb37a168bb4083596d8fea9b38b5e5f471bc5fcf4302a9d2a1c1ebaa677a3d681cbc07eb619aca270f3313dd0310837903ed5d8ebb877877ca5c5374c4ee8103f5aac7ffd60ae4ebe18bf570fcbff26cc7372b60640d09f68987dd22ce83c733b4e9e95b34a0eab826469e94741b5bc0410df56df21a4fcbde96852fea1ddcf082bd9f5ef5af80026d9947f7130299da7bdc9d06af04df03c099eccbd1f83045391e72462df2764855d38be73b2ed87744b8ba6f3689eaa3ae07306987e7167db535e439515fbf55087ad125e32ed269c641c150044d3f26b6c7a5eb9be8b956ef9b5ffe9ab9664f84b7515da77e60e6b467422fc719a84dc8df0f5f4138ba5b08ceb1f29051249051f63a9156d390e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (333, '{"ob": ["15151515f6eede0e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cedf1c330c8bb6fa33af3b02fa39a6d0d5d9cc48958ba3226db9c6b781de976d34f7893a36ba089b2df807ee931be68ebd5d882a4897a30cf44805d9904c66b8011f21164153206f6a02e8604354153151ca2f09518a6d6ea777dda7780126f848037bc1cf72c68706476d7d801bcad2a4966d8eab0e2fdc2e2f449fcd245bdfd1e7cd4ac5ffe799090192d998b36078fd59bad343205a681d0d45bf880ca08ee48ea2262e1deb40ab71e8575a1b791f33de43c58e072f02f147fa3337a36c929769b3aa875efbfe6d032f15f1ff635daea75a8c7f1fcd1d39c75e20a08041ac96fdd73a459fcc7d1d03e7fa2796a5f8b79f68285734e99c718a4a2744f9811011ad62fafba4aeea99c9936a432d453f36d1af235abb54a745594aad0d147bbb3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (334, '{"ob": ["15151515f6eeded1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca6c335664dcacd7f0a1c9a92a8d77539dd70c78258e0782ff0cea78dea3cf243dbc8443a941d46f3d79bacd6a61a5c950779e08a611628323bfbc7e5abece3a5b41562217cf784f933013d15d66c2cbc00e370d078c12d7afc772432ad17937341dba08275a1b5fd330a1f39e6a8fd11e9de76481297431be3f376bd7cad67b69345e91c5f9bf626d6d37f05c982f7152103daa606f27b3f0c3bbe28f09ca4226241a84bc716a1baf935dbccaf19914f982be964c23eed9382891d501874bf6fa6604531f21ae2f1f4357051f08d02f5e488ee01bde7344ab5a6b902e01d279cb63945b8b0ca7333ecc160d69cc6d4e40cb16493d7b3e048494844ce861e256ba89eeccdf4ddc04240efd2c8f665d0dd5f4702901916b9c0ebaf88f8adfb40df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (335, '{"ob": ["15151515f6eedeea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb4f2211c3e24859ab4a3f02195ca3c10137b20f1ca13c1cd2a99d52d04cd433c8d3255c78d61f464627057ef48f1cc34d3325c81995de310a4266a0f315d6f45292ff18eff3e92d05bf95d8ccead800abdd2ee0da78045d5628d43985c494669390b963e8d82a3eecc831b2196e2304ff14cf03b9bc64d35b05a2494b11bf1ec7534cf3409c41f4d9ddd8bf3a5221267d759af09ae7f8c8b7a3f55df13bdc34326e234a4fde93986e689f65cecadd478497bec0ff34fb23f9af9b79c344bd64605f9ecb42118f92d62acddd36a3b3d8997a72845668623a2e8a6a5e2f3ff88509c295779d03b4909826a158fe6a03a4603b634d135ecdc28be54934df543f9dc6bc68ff0698dd000a8f61fd1d73c066579c8625d4a47e7641499a833938c736a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (336, '{"ob": ["15151515f6eede5b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c06e08ff76a48eb81c3d61725f54e6b7b23255fe3e875947335d647f21f6bcc01944ad8368586a4ec9f1805270f12999d8e5cbf2273e327810d3cc5860d6931b2863663cae0d08ba53814830239cec0209aa6c19b78bb512f61f19fc44ff980fceb0c9c1134bb2c43829a8730ed14bca707001b804e7dcda3f020a806070c7978afa2c4e06097bcebc7c3691062a9db7d5568c9a50d7e97ae077614c61995e72d43344fde6e91b444085bdc51685a2c6776fd5d24b9e2aed30870f2f770d77364dc843e469dc2926d5140899167bc87adc98d1e8a3415aff509ddd8518b448534e3cecabe959c90482fedd6d8cc74bb24c9321b631067582bb844a8f1ad70a75d85afb293b7bbfa272c552d6e0455916f2a8ea1b4408db1449c8a62d22c00ed7f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (337, '{"ob": ["15151515f6eede0b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce5273f56ba99cffd06f38ae1a9849560006695561637c025c771eafc927242cd5db9db29d42075e31b40a20f9bd64db99332da8b3d704710e470efd8defca3cc90509e18e6ae7ad3d143f8cf979dd9c1d6f86e1b65fafa3a86d869ef91f3c23acae39d74053486a407fd12401580d65ae2ef10e81af4ad5f9f77ed415cd51f8f52e1f5e51d2b0afbed234c63586cc384361a0e37a68c781695da2023e6059e8e1c450f6e898275b9602d52cf01c853cbff06c0aa7151d5f719e81514ce600b27b4ec88c92c152ebac0e8f7aabd34c4b7508e30644b107b38d602d4b278e8a16d5349ffe1be312fd705aff74a248c51d0c1fff88d8556d03bd44d48394629a9299108ae20dbbb8788e5b7200c8ad6a5a92b5579c6a9a8013c8ccba64b7ade0684"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (338, '{"ob": ["15151515f6eede55892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5303d5332d44e124913517df31ea80eeb2ac5e6c6585b10788e246d2eb19170d2b7ca6bc072c8171b55e0c71b8fc0f429b8addbe465175a8792d0e8ed2dde50869ecb73dcca62b2603f9b87f7785e5056d83cbaa2594715c3ac7b5377b3754708db34f9c5508516d516c008315447ee8a28a3ebafe857f6fb62cca6dcc0ec7040929b02be118179bd10eca0828005eeb5cd8fc2ec5a7ff60dfebeaf3dd3d68ad02828603b853924cb51376a29e9136c453e9070d325309e053aac824c3c0da7e2150e3144178b04de4fb010926344f629e78c21d2f46c32ca66aaaea9b4b1eb8605c596f5b099eb82f13e9fc5ccacc8431ea80ff503c812b286647e265fff1b8fdf6542ebf46cf32071d0436e7876fb393d67a05d0cfcd467b9883a2055fc764"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (339, '{"ob": ["15151515f6eede6d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8668b500e7e2eb557f9d30bd3ae4cccd7f082b28606f34d80b188b6c0d12f6a34d0b83c97e635e45d6eff8494a5f8034648dc7b86121658cfe7b4b16727b1cf5841012e842fba86cc1760d04f4e52fabb8833fdece16444a2fa1001ff42db55683da6f15c8fe365539cab88b7b8d737defdf92387493416941c3b9b26a1aca4c1f619092cbae7ebc6ad11450c190651b35322be9b40d0f1b461f529538fa3efb3409e0b73d847a55e830f9e1a85b546099e861fe040f5774c038933dc03c0da532df80840a5f55f516086f7935befba809194fd45dfa8a696ff56e1ca52063cd926b65c7db88fb0447a3fd0acdf8483667b2adbc28680b5667c345c9a750e6eeebe5d3513bd5d532283f346658aadec2f634e8faf0b26f0396c05e3920ef8e37"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (340, '{"ob": ["15151515f6eede7c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5c2d779f1493d191f3428c0f45eec6268cf2749d27f5023bb2f7a9cb9a1853e43df2b14de6bd0a7280574981fd8c1830879607fc9da0e612896358b4deae5e55eae4f6b95f3a5ed3d920b9a60dcc29d933066c1c9332bb39833050557f7e0a350196aeb4b19a930dc89ad0c553561bf6289d8da7c46f725d37ebae9f6652373cf9d68deccbbf5b2449965d4270c0632e18df6333ceaa54a3796fd519726becf36f2352e87409d64cd78a7ad65c302e165439a5eb08f387c6fb1f50d40aef279c2806c5a3b347cec92b37e7a7513b2ae53e292cefa0c27217c85191dc805b0da171abc5c4ace90d36e1baa5499a36236bf074eeb64ac4f799cefe25d3ed93cba25e9034e9a1fb6ec1fb920a3da888faf77febd94ca9e88689cacbb9269c8bfd94"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (341, '{"ob": ["15151515f6eede1f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4eaa1a635fdca92ab9c3ed7faecf56ff0b0a927441172a5244c1417d380e28ba4ab4120dd4459309bd4011dd9f920393535c1ab6ac4d4b1c904a73692a893cf09204bf384a89e9a03c805f7e7fdaf096ecae3648b7a48d07dc58bd8c1de61f7233ac170495920bb2a13f696cd28896daa3d6718e171af42be3a003fce9f77eb6718ffc2697905a1c24af1b910c4163724adfa0f44e75028f87d9cfd9e36987abc5b4d4dad59c1e33bb939a5ee541ba65f4fcf1254d9f0f818bd43b36804e39cc2b6cc201ae68c7c5cd1a9a181fd67dabb485daa25280df17631f91245ec2d71dcfa6f5274356bc451a1a08622da2e2be29cece54fa856b5553c1a3ca57721edb38c7dc76b11fb70fba95bd8b74707142e66a5948506982f17f7a2f05f87dd1ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (342, '{"ob": ["15151515f6eede30892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbbb936fe8dfceb64b2b84a5b8a1c5268b49b590bb61a4f25617e8eede7582ae2c6a0a946594e855c358d8baf17e26f47b806ab4d177b3f607f2f420889cbad2034ab1c9a7143eb8d44d745c53eb412cf0d7fc20f6f7dab9f331383e7079ccc2442c5b0eaf39e7c59a34ee5bb562f549c4b664e66f272dc167a00e59844e0310dbe9020859a206c96896ff8a7d4d19164c5e0d11c96e1473d793dc54de277c15059c53ac0c283fe183eeed21d00a4dfb999f460637116e24656804b52a9cdeda976c4266012e4bf3cd3b5c038fed6060ecde57b2c17093dd16c0a686ca57038ec0c801bd7e3670833ffa6c7bd5a7d99ff36682ac0513a4d4cc331865cf0290d17b213d0f120fea5872d0add76d190ec9ec9de5169e02db183e283cac3f12a6a91"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (343, '{"ob": ["15151515f6eedef6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2faeddd5dd0628b60baa2a5db57e5aa4f87c4c5169ff0daf1a4dd1165fca003d313c0ef0b78fa7d735f79c4b3d8deae4392ae7bf09ca600f3e1813829e4fccd12b179d7be60b9cd9a4b2c58c2f4464c260d43c7a078bd9eb3e36ceb3636bfd2ac8f4f99f2d382039f23d0ed992f538fcf42a65c2f2030b8ed16544b8e6eab337fb3236496add45742997d8d73c4bdbf74ebc950eb6f241fdf50cdd3b3d394d24391c3b9a5f7b12264af70e40b82b72a7cbe4a89cf337a73e25933400ea7496a0bf0b388249d7701b919977e9378a0a46f7aeea78f88cbc32da105eabc62367d5135aa2c053956f3a006b19bc0f98f08d41a7995ee61ab37dd2e598ba525b93c454f1176c1ac53d26453c9b1e207ce4b76777750feee925a0d76304446587e5ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (344, '{"ob": ["15151515f6eedede892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c710b3246d830cd0e741b864d11975b1951f82e39044b4a91b0548b00eae3e71c57bc962c66c9c50ab3bab90dde24fb03d5a656860cfc1d91a109b4e2a860192e167c492ab1af07f947b233757b1df70f952e13b918caa0b8c50f0ede7cf9045489162d6a7ec3f888f89b574ff063ca07eb89b633d8692fe97ee9217c6c99628051778e2275388e083c5393d4fa45a1ebe59780ecbdd860a207b425a730ee01fff9a92fb84462cdd095bc173bcc57753296fce1dd570845ef7a6c04235d9dbff6400610c89e218aac06ea3e869b699ebcd5720050222408f936ad9ef6bc99d304ab330ee7504b08c3893d5b3db1ff7753002d6cf9ff94dfc935077389fd737500cc2588877c4b1a0a11a109670581e2bcc1cc6291d34492eacdae73c24ac7e571"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (345, '{"ob": ["15151515f6eede0a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3326b7dac23adfc49909d851872844ece8c98ba17d24548b27d04880c7d0da236325e14a5b0af98dff2bc38778b59f5bc661f0ef139f48286cb6f7b0acda4b23f27e00b2e202c59d62e71d7ed2bf712a34239b2301b2a99db5e22c7afb1d032534a5aaadcccecbf7bdcba14cbf76ebd03b24f9a48f0efdec5b23eee414670e3c6cc4b0903a1b7b72a682daa5d7a21ad60409270479644eb7ad92ab02c2765d14819df064b28ae7a929e9c5dc0ac3b09234f7c199eecc41fbadcc74da0e17d0d4a801901f444cd04237c3788ef7383af779afac4c99f01c8c2143eb26627a997e642efa000b0a3df3452481562cf36e9850c1b6fe30d2360b30ae07bfd06b9f516d9963d423e8c1bd1a64a109462ac866771508b9af80f3287ec1f67ac021ee3e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (346, '{"ob": ["15151515f6eede27892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7970a738cc80ec31b32f9d35c9efd4c4004b24b95e859dc9caa7625cbafee92276e2fb426300da3e7d0e5f2b6fe33b0139eb3c5567e2ef0f3719e0ae0117980bfae3da3588394b87c35273c0f5f0935f722f85ae51d80a16e76a88acb8cca458ad2536e7080cbf7932b0f6fbef984c28812eefb90bb2dafd424308d1c932e65ac77d3a94dad23029879b4bcdc9be59eafce9cee332a1a5bdd47249cbd9b6dc74769e6697a2c114a5546a8fd18207b35e51580a84c3b4a90da498b3bde78e28a3a356331f04b1d98ea5b867b8ee20bfc400a94ec916c75b22e9755fe37d682a24037fea6c048d1ad1c7b3fac39f8954f46e21c1dcf3122a740d6ef26470cfb25c5a1c6ab11335f2f6a3b2bb3a92475153b656f7417074a7effbcac3232e9c752d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (347, '{"ob": ["15151515f6eede04892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c76bacc223df118fc6dcdae2c9cdeeea42e2afade0cf0779336fa83309ae8d651af9e476695e271fec627fe57b2bb666aac1cce6e04103937c76045d72d7a6148f3d994500cc65470eb33f5944f9510d80d37cea003034a6c880b4eaa09d2ba569b4a746cecfb73fc4404f9fa78acd6446e6b8f46a7fa56c8d789d829c567be4c98674f264b263503cf9025698cc6405600d60469033e05d6ba9fa884511bbfc2a0776d091b4b46e17c12bf431213a2abe07e60e62c5d909a4dd9702666c082aab76119ebd89e14cab8e302e5fb0268fb51324460d6f376a688826a616749e1d8e33521f46c983da22ddaf1bd0e90076fdd71dfb8f8908b8b2566ac025243fd597c9dac93b847fe33ee79730a3fa4204d35ed5ad3b12c373f5bd0f39ad1db0ad8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (348, '{"ob": ["15151515f6eede6b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc7ecb907fd79611ad15bbb30db58a58499f8e400cd148d666752f0920c02fed46c594d0077ee9230fb1ccc6bf3fa1be02bf885869aedce28535ea95a58f34ad2b6901444be7f0974fbbf76951619a822e3eb43174bc20fc9cd3ee9df3f5c5b89d7f5062bbd5c847b4aa313cc81988931254d783f3da5feb49d0d2c898f5a2a38ea394d1e0ad15d391824a10699597e108115967875d4c72c4068e418059c1dedafc932c4d99ec2d97b427a4b6a5e892eb855757f64ae24fdb0ca22a1eacef071b133175f0d94885cc45469b4f6ba4f8915e90ba50419b6e3072479e4294f8a7c7c4991e768154d7cab0244a11999e084bb9a3ce0a22aeb388e7e0405a87c2abb50d0094bfc328ea19cd8621f23df19e3f77b3fcddc70c24b4062d86ed7ac150c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (349, '{"ob": ["15151515f6eede5e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc453299651df86fd5a2265b73e08c5f0d3f63d5327ae9d09ddc0d3983167c61abe2ad4263e6adf3904e16503c111b668ec1f41c86156169ba0dcbfe169fd6ee3f51a5d8de9e5d807445487872a665dcffcc5274d6cd9e1b493579f3e08846ab7257e85207c31f56ad7f748b387c8a77d83f13095f25c532cde6caf4d769828c978e6b5b3a37a65841589ef2b52e2b4828d21b411f44bf946426d7567d886ee0dd0f0191f72e5eb39b40983d84c822af1b3085f06294f8b297430837ade3d59e67f97ba2c26b12a0490d8c143cdb80a6508409a10e1e47bc98b0e4ed6a6f8db8286fa1908b90efc1bef9d0211e5ddf170aa5426994f95ba1dc373981b3b6586aa5c9c68b5c5cadf77daa2b59b1e50dbc03a9234a98f897bfab40759257d4ea3b4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (350, '{"ob": ["15151515f6eeded3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbcc2825d046c8f46eb1c519f901a52ac0de36825bc5364d2afd464d17ecb8cd13bbcc1348bcb166d0f1464038fc0e849b2f9788e426979adaf4c845de2be150518648780bb337d1e6aa1e59deaddce620562fdcaec3ff21a39b9b918c49d038e93fbdb594e117f07a8451d026c1953c268277776b758b82d8feab8c475f2a187d4466500909a96dfcc2df73e67208ee873b9fc73a677a6c97e6ec483be94097d79534f295207056eee717bd04655228dff5351c459722536ba88b850c0bcda2666e2a5af6629ef166829b2e8271534c1ef2f157f9970d0ec5f96ac7a0629683cf01aee518c283c65909fd09f76e5a43f05ce6acff9f97f3dc8b6244bfef93cb38047daf0b705d7a119c87bfa8334ea59cb8810cb494d514ea1c58a9f268ad08f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (351, '{"ob": ["15151515f6eede4b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc15d96aaa355766802a5e2d7f651e208133cbe276476aca5b890b70ebf7dec31d12a10bc8b0b3664dc6587ab21a755287d932eebf2f3b090babe3cd9fd15c046a8ab6911ecc045d347bbe19c39d2b226a063a2d62a2bdb08ef3d1d607c74218d0ef98ee23b510000dcde75f6d5a4a6ee5f20127282aa1226e83be0d0343e25a4ad64548c898d85e25f7d7cba9f725d1faad73458412bcc5918fce97fe0ad6d5d1c3da1da813d0157fe7018cfc81b85ac498d8f070f19a4f5fc73d73d0e3a7229b7e72e6b88e94d6f3822979367c6fa38c826732d0a552db21e1018313c901f5e18518f0f9b42f0a852de3733280d442bb0f55a580b4725b4d1690a83be872c3368f963afbae0f3a824edca0f25780de3f71c40c5b64ba06297c51609b324502a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (352, '{"ob": ["15151515f6eede23892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cdc821be1dd61237cc38d90ec7e76da315cc4029e167bd6d573c7cacd28a2dfc776367a75db769ed5de5b1e1788f0861e693629a3a31027d04cd6c788841ce5e447c2f5257fa5fa9a43f3dc287d0b1e03b2e935cb70ad1c3463e4d6ebe47f7a46a627fd54a8089ee9e544fcaf267067b15007fcbd61803d62e71c253fed33796e9c969953f43f8167862c9c7d9bf656ef7ca6cd7e347c84052f1208c6b50a5f4275076d2006fa5c9164449f8c624c93a05c9f07e23ee3e74d65b8e9ee1f5ff2ce7092633a220a8b8d98eec6e8f8fa7b7d72801b60b0c2a2b961f52ce3f72ac37066f5f78b1d69b4fe4c9cb2acfae71838db19ae86ff38792382a617f6fff71e7b2a23bc039203f75437de193a3dbf9a2fdc1e3e68830e6b3ede5af2527be80867"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (353, '{"ob": ["15151515f6eede43892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8458c527e72bb22818aa55f1f9329c2a76d64f03bede90c0849a5902dc579aac29472c14a99e6d166bdb48633d729834c043a53fa0b46d17e73a02ee383d9a14a28cc8f29aca5fc22ab32ca89dd5d4f75d1d84a45d1d16493fdee7720ee58c9c9af0f0403df99c33cb3daedf6d9dc673231b1a2330f2653df1542a5d9c5a6744bdb84dfbca7cdb298ed460c18fc01002d464638dd2d2e9f65d3a1f1f1e93c5ce6eb7d83d46fd6668bb93def5c52d5990630a734b9894b2ab66bfd04d4f614b6bfcdf7aca96c3f6caff66c63f7124fbfb9fa608477dc56b975952a3b10faed095c9ae8609c2bb7db01f39f4624dcee18e93965e2c28d04d8ab8753c4800ba6ec71915ed206af2dc5760086cb932b95315ab7817c408c7785c12390ef4719dd98a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (354, '{"ob": ["15151515f6eede71892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c59a49dbf50cab51eadeadd9c69197d682febc3745c11dfd7236a28a067421dc8dac413537e224015cdcd3ca17eeb973d8225c91ba0240706615e3366e0901984af1145060ad5cf0d9072874291cba2c789efca828a6dbb86c77309c6bb245368d53a819fcfbe0cdc9ef152f54cd5dc451eeef7efad7b5fbefd4ce6123818c6f31207a6068c922a606969b17bfdbaacd000fba48d393e48f768bc5e6d97bccfbe61fc304ccc36d4562d662d091ad831217f2f3fd28d73d6b6cd5b023e1e914cb8d6d1095fa05f646ffa4453ef5c5215bc6fa3ac5412832c6ce2405fb853d64ad2e8a08363d1d0d4a85b89f3ccc88c3f77d4080f04890cb8d2e3b84a2f216dd89caf3d9649ef6c818b8540e9766a95215dd40a017c4d4c2e020414b71217d0b820"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (355, '{"ob": ["15151515f6eede75892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8ff6599e41a39853ff8609e4a761705edc6067401610904a2b07324e33956a9471e534ad722846a5c4de7d76fce4fc9ef5d05e284bc41f05be94e8a44105cde89ae18f7e0c0cec9e50a54434b8b0ed54052920d0759d42ecefe4002b2862708870c00f572134d48ea21f0dac31213ecccb800ae6d7678d3f1ae7e1fdf17d81e76f620d2be76c42e9bc9a1c7e73c70933539f8843b44db6c0118421f5bf32c9730b3fae811fedb99c9371a3c566054916f8ba906230e1d4771b23115e516277129a27b1713fd100ace7781a5602db2622dd023e8084a246b1bf20c65a14f8adf64ca7025d38bc30e32fc42a065d240279273144229aa398a9e3f5075f4d740f465aa18d2842c29a53e16f9ef74ce4b036107cff87de5de2db0e1a89930abc670a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (356, '{"ob": ["15151515f6eedec5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca6766f4b1cb45f958d9216a872169a790d34b25e5a32f773f44c7ef4b75030e90ca9910b90421290f0418e53f6e08a116dbe73b73809820e69dac917d8be22415a2f18310170f207e4305f1809a9a29cab01986fcef20878cc1119c6a053a0ccf3b0a06e43fe133dbc70b87d0cab3ac4aceb7d43394df4d7c58e1ecd1ad3c202ab29e6ffd2d49b5fd45cf154d2b7408b6e237e49f418dcb1bc2e2aefdbe0120c8af12aed65ffdfab38dbebcf88806673042e57d59ac731ec3af188fc14461f48e3bd0bba6f78f618d4f4f407a2c66ebf23b3221638f7c8777107508ffc9ff29367752a9fc6d5579fa6da2a276f52907a5360a590161dda872636bc9bf44c0ca24dfae11bb36004dafae9b3d538a0df5e38ba3539d5fe06cf8d08b1f7caecedf2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (357, '{"ob": ["15151515f6eede8f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7ee65e3f234a46a0a060212de73ee5d51b590c39582774db9f6526337045aa5cc2ef1f3712c903677fe6f5ceb8619297c76b274c898c50ee8c7f970712368dfa31f08fca64959924aa42c09745604e8d077412d813c9dcb030fa1da1f2568abfa20934700cc7bbeed8dc052c23c9269daeb791c7da5a46efafe18091ffd8933259b6bc8ebaae78d3604d03db71a68af3c82530708aa09b69c1adee02c61793022c24e4d6aaba42a17452b4384cf16fef05014a8f8d9f4234830f4690e164374c80f8d40b91d8757e2eadffb7bee22f5aa7fd3a3b39e424bdbc40e4c7eb33f26ceecaffc9ff7acd54f99c93c9e85c78c33cf606f19d3e78b3e7f05dd60891d493b3a09ea8e786e48af596251dbaaf684321458cd836efa785e450fdbd22c9b052"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (358, '{"ob": ["15151515f6eede86892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd0337d766d49af863c7f606363abd8805bfaba5bbd3ebec81c719a017236625f292388c14c6b57471ab666f28fb714f1cb097d137bf3fbee9c9164974e8cf49e174288661520da4e5ac872b3bb982dc51c93b9fbe61b4295261b528d4048c8bac3d7159c6bb9828a659aaf8d581b8db58cd60658aacda4b65d1abf7d74221739df043a7cb626e16ccf1d036f6d5562b38d15c2b52d5c3616d442efa9a66813e35bd85ca2bf6f84e4ff6173c9ae1f5d0895d378eeb121dede43fcc3814a4fd03ae5656477829ea26bde802acfc196702a2442c7c047fb40a6dd405df8d6b244a8577e253cbdd2de7db7e0f3335d3aeb5a694f71b404d1e0506b3374e05b81b868ec211728528362d9f0a5c7766a8192aaa605e828424ba32b085fe04549b25a39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (359, '{"ob": ["15151515f6eede63892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8cef11c15be5390a901c4727c20bd06b136bd87589ff7f4ea960c67dd01f88eb415bc552f83bb99fe37135dbc6725bf5272e3b63a10cc39020665d03273e68e5db6bf488ab35cc73dc6cebcf32f79f5be686a02a65ab4102d0be504b10e2f3af524b1c28904dbf73f7f5e273ef400c20135c7e2b714188d8949cacf03c4ed74820370bfb9ae8ba4e3c7fcf866f6335efc37fca1eee0d1d7704e820f8dc6b7d8bde481d02e69bf4aa00516d93251c0aff829c5a9c0ea025b6a091ebe8acc1e9731c8a723825489992bf6c383fff1ab2dd81bb113b5fc8f77b6a9cf4693df43cd2e7d0b0ef4e164a230a5b46fc1db4740201e55929a74091d6f8a4b19d99b402711eaa17c9ef675d64e7d7aba5270997dea55b875f862208d78503f4e70c965245"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (360, '{"ob": ["15151515f6eede61892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c056a16bd9d859e60bb10b68a298077749c7b87365ce0247ad096f86048bea82835ddaa13b9e4fd7cfdde74f0aaeebfacb05bc5c934faf31a034ca4ec5c235512f33d2f4a456178d4a3f6e0187749fd158526345987ac9273dcac782c6be40f4aed357cabcc23645f0ba54b4d372c26ac7bd57808fdf08c66cf025f34cf6fc086dae1f1009f7480fa6d70431166bb59c2e6eb0ae3715c689ca235a1e851ae1d09407c3a2f2a74902f586487c24b9d0f95ccffb370c623da15796b8e31a21039f3148b498da62c03dc650659e4783a59423b43090e4b783e7b9bd7b8ada4367fcd6fd76199793f5e0f3814c261b3fab2bd1363f5efe9bd1ab52b7a845f8e72b387cd4c20a1de8c1e5f184c1af6a991351d8cbf4de223b5faf4b55cffb0f36b72fe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (361, '{"ob": ["15151515f6eeded0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c49f270e1fb030d8ee5e47e6bffa9e394f1154cac26086e722b8abf9f7dad575eaafeb93a33613cd94d42dc7a1cb26a13b241edaf937ab248a9c90ac68a79cf90566403a350a2ec832c89de33d514cf054eaf99437d7cbba9cc3ca06f050de312a13c554451611fd39d5a646afc34b82097c017ce37e3981dad4718fccf68f5a47b7e4d103d6471ac85f136df073204b87da2e2ac9abb41506b1c8e7510597343879a126dfddb1991f67d116a364fb13b869be8238f8f8863a2ff71cf7c5c437b375d3b54edef6d3377347001af776a3c4cfcbd413b0c3ab1d13f660e10d3710074f4e5c215ed52d9a9c0b99f0d42e1b44596d7232988183213071979f404d2c75cedca3c27a2fd2a3133d5c08d04ddf8c5eb664699f5032781f3082e2eb90355"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (362, '{"ob": ["15151515f6eedee6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc8b04d6a3470cfde0de1ed2f339f3c17198d07866eed89ae3e3fe62e0d9e732d57642c75e36200bdc405598f9112c39259e10e8c95cae37a6932cf607fb2c21afe80c42b9bdd3c7e3d663bc383375c6b671dfb8ef60d7f8a5a02203f1af41c3ee8031d15045533e2ef8417a4fb2e3824eaac9c400ee42ad44b49ecc99614610fb6e16a73e6bb6517e5762d3bf391ad6d72cb26e12bdc73b3c466d88a66e2617535336bab2515c271f8a17fc14aa6aa6fbf442ab594164feb325447822dd5cd098a970708b7011eee785b8019c7a5e797505c6ee22a8131c5539375ec81b3f4025f475f20a408d0135d808fe23d172889cc9c64cf8486a87f245ced7356ab32f40956db6933726b52bfca9e8f9cbcf52d52242aa5e87084f9af8b8ba2337e63d2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (363, '{"ob": ["15151515f6eede88892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c18abfa77b4245cea00ec18bff266fc21fedbd64f8d273576a9bd28af9c9ee5ab220d22d0454757095945774024e7f2f9d71155d501c7e313381c49d5f3215ae9056f27bdb8c4e3373b113d1309a1b2f6f043dac3b00f4356ca1e98117075d603dc3f22ec7e0609464f0583d07a1a80ecaeefb3e6e1864775a8e11ffdecdfacff005207e8397ed6e9c054260d7e488d41ba95a84db351be971ea9ee07ec5200072c5e946b42e314055b93d55d1bcfacf4c1a21f7c69e42aee8e6b85700c5b8a035e156a1d9f818dae474e3628e3e660dbe4ae2c01134a74c8c4df6b5f66a443d06f9d6e6a6a2da64cd372619f2f9f1916023430693f883056feaaafdd149b5253c31acd59b5fa14a1856afa57568679e430c5aa18374d8375933fb5880b87fd0c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (364, '{"ob": ["15151515f6eede83892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb2901c153da6ed64bbe901273bbfd2e20816dcdaedf2dcba7ba1bbc9111bdb077e30d622364f5293d57cdd0f956d8836d2a8dc90c00d0a0283527db7d041b429ca75153f4d438f1e4115514d99d1577acf18b3610426f3fdd180474d37083a97392c40958aa174d2e3371398f52d232780d610abd198776e9b52575edce5d1d0072c353afa5268e346d7e821f3eda98da788535f9a6911b23d39c88506407ce7316a48039d90316fe53258dc5b8feb767def1986e3f87341c361a83f6f04eb1cc5ad69eef6884a26d88b8a4f53bf85846736fe7c1af9955dbc40fde955f83a19ce33cbd54e9243ef292018a7b94ad0a389bb1b9b1b176def0011dc9ede477d64782a10333bc73a1c5e3005bc290d0fd589fd32b14a4a428a61d5bc152378da47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (365, '{"ob": ["15151515f6eedebd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca986972746f9a031710270e60e135283a8cf67b66a6cba843a382bc2f39fa0d846145d808db93e2bf69419c6d036c9e95e6d9c73ac4de20e85071815113a9144b503679de3da4447bdd9d11013bd3b07cdb2a3cfdcc59e90a9f74aa525c2cff7d847768346117eb91b33b61507af7b0b13b69efb0537ff36afbb5584518fb6780bb81ae650dbf5dd15a110657542c2d1dac188a8b34213b29295bdb2961092b3e20dfcf52db9c4670b7dda9208c6992e09ecf9a81008a30502df36fbd845d5e8349a9901d6f0b6c570c1b5b3859441ab81522114940a8f021abc8bc9d79d8cf65827dd51e1c732aa931768c7f5c4dcced1dc15e553a1cd3a9695f79572d65580d4460fc48d156ff23d77756e178bd316155cb4d85355a98c724d68babdaef61b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (366, '{"ob": ["15151515f6eede64892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cefe87a1ad012983b13e3abff424804ee2f5d0c8afb4613d769af190210f0d40c65844debdebcf061c6328d1f50aa0bd93d526bb4b79073687873353422391a9f25d5970cd3355b7c280a68d0f8f4afe973eda7f5389c9b22cc1f49f2f76cad691a8a2878bba5889ebeb3dba575f39ee8763fd5171b48cb440fc534936c4728162b97c83605e435f4c7648075ac18cb3a8b91413af86bc3c5ede5dc3bf20c68f694bab8253346d2c40a25d467046de6c3b22d74dc41c40a3331d47ab8d660512eb960e62e1788220da1f3085c5717bd7724bd775acea341f44d87e844c6251ddff3d8545a351df30167e68fec2b72ca867d742ec65b2c17a501da5f34c96088c726b1bd8506c3a5d4214c76c8bb9a6c988c36f3257f87cd704eaed5475ac1b3e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (367, '{"ob": ["15151515f6eede91892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c844a938baebc009b4efc4e86609a9f804cc0391b25e6010f70a23cbbbaa7d81b125a83cfc28a0cb7df956b2261ff176aaaa06a057151f8bd0e3a7546829f4f24156affb8e32d0ab2a9a86674ed9c4807ec4658d49a6f79897d9e58b8d3c0a28908c6cd433eba38181fe3a356bef5e6f3ec4442ce16c276bfdfe10f007b775db29724ee6f6ce973ff5fe41d659d092da200b854aabd23e634fa8aeebea37bed0be9d64c9249d68d4d4f06c4431a9549055735b13b024776403e0164117664990299309cf305af564b182850a62cde2e1e6ad46bb11b0cfdfeec2bb5d36f6957751003ee34ad0f17c8daa5f99d60242ba114ebd9980dea941f8b83d45dca6eb6371201200f1ec19081372a5be39e88f98b2e04c040647030e684e8ec02d7dcf4c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (368, '{"ob": ["15151515f6eede3e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbd2c70fc5bd4fa595d7bf3c5f199943f78b35ab1a6035ed4f71c01c2d08011ea0a02ed246cbeb00728f95c399a86916f7ed0a14a86ff4ff5175d377f46f017a1ac9a3d0a95cb7159c07066ff037febf9df336c417cf0a6b491684baac7472f224f588ee7df6a9244a2ee20c87c40b2579524eb0da3ebf002fdbca88288b4d2c4f4f2ae359467bca0443c57165c2e85e63325d2ecc16bf47b70ff3a0a41ce060f9664b7c1399f96568a5c63fded619cc57d0f3ff747dbfe6d30b72d90f2055ff91740a6031be25095e1b7bcb4e36788dcafbf1891b774e0ec8999676c0da55f1b4dce47b122be88687f4b23e8ecbde566ff190028d5e41f0a2e77edaa5eb4f5fbde8e143baa49ec4a8c37813fa38c10b37569aa0c8403caedc2701403bf3b4f20"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (369, '{"ob": ["15151515f6eede29892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9922496a604e283bef9b9633fb74d5d19d19d139a6f5eb7041b7600c4e52af61982f49c008795bdd2a4ce9d36a79653c9380579e81d7589d841b41fdeb3add32157faddb82ba3b20f299e8294a3bb027bef7f06954b783f1bee83dec975de04359501b7029f62d85e75da2bb031ec4cea7ddff40aa739bb1266e7196054a4909c1812df84bc17ed21858be88401a105faff6b2653622199021bec3c64bfcc0f3a6342a18aa919cc4f6e0606ec85cd76be716537f5cb2aab5be5ff81f40c1fa09a686b1d294f6dcb1397ff7310131c466b5a858a82ea4bc111527f8ea6375495ec1c607a6ddadc7f7ce4185c6b8b63af301e795d3709c1336a8953b3b787e7207733b018dd4d93ccafa491a63062f869b63f83c1617bc631f4ad810f11db2877a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (370, '{"ob": ["15151515f6eedeac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4706e0c2884bfafb8220964ed011567622cc941c69c4586f32c24d5a26d2207e06b6ddc99d88c931f41b3302c5093625f7042a302e3af5e21bbc417d84d6d297116c5bc3a0001e1402e43d0e3e470c22f1b04ecbd18881edf38e449fdac8a4a7979956710791b477839636eb6fed7a63a68140bb05cbc94ec40d1f687b988a54bc2f8fac8776d166485a3b0a7f89374d279e1a4bf960d86e91e424c93270fb77fc064bcedca4805d3a823d1d624c04ea5bb087b2af1aad66e35bff543a7974caadbbfbdb9b5f69a792abe1b35fdbd81827495f47958dcd5be8bbfbe71aead157f931f2e5e4fde5c3cf87b09099ab6e8314fa61c5330b784c160535fcbe69f743c994cc3fa09aed770c415d27e428f3838ff1bbaba4b8207c0b435d998b950ebb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (371, '{"ob": ["15151515f6eede8e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c517e35b9b4a272f20d0b7dd8d809d41828b994e5b14c3f6fc6cc3205220c187df380a5b97febac3ce6dad6192f66df28d94da84b51ad9c59f3faae51f142b445c7c8e6e50f82cb452d75f8304fb8a58b41f59665f956cef5b312808ac1adaa4e32757b9757532abbd645a1b6795ff2a209a285b2a2771b3e4590a806926938a100507a182b31ae62bc492739c9d6964a1a418a4f258ab99743223e7758c10583292fe3d0dd2659d99a10ef54309c7818bb1d3f9cff4d4411456c70dca2d3667570c8989ab6a9c45c2bce1c162b7c32d34c64f21644acd57fe834a6864c2e95808241e31b969c98db60265bc40610bc8d509609b1c3d6d5c6963aefd5c8c8245fefde559fc04b5f032fa97bcf085b2013de04d0036eac3d90e547ef95978c9f24"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (372, '{"ob": ["15151515f6eede4d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc170921ad70ae87916170f835d8a87b1c8cd3fbac097cdcbe6ffb47b0f5b4fa3f4ccb243419b3c4be97de4d61635e678f849c9d90e6c86bd5a456f3dc0fc48a849a266f5c93a91926a2fb3c6d2670b8ced2d3222c1da24ed5a80915097211f8124d0b536dc04da110b8cadfebe18d50ed688548722cd45668715bc97260bd66e2a0f453f9e389db4298320c8cd6921efb7697e4ef3fc6c2ed7ea361f87708923bc2a5ceb3d5962bb209a2819b90940987780e71f0949f9457c3cc27c9d74bd07d875e2515d6fa66100bb45c703f18d0d789accfcd3faf6a7d40e83f97cd1e8917dbf2d8cb7e5db7e5ee189125e6b3e6af542af6380ca707086a48fa01a0b5d7431139d392550d5229ff4eeeb6c968de31662db94b4013b3e6c3f173ab7bef1c2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (373, '{"ob": ["15151515f6eedeaa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbfa33bb6162b1c5068299c3ff461d8e8708cd416b7d314ff953655516e82b4b86fb93adf49a688a1edaf32fecf3bfc401538999ba75b0fcc438bcd92e8eb05564e90b3debc270d055896d37c9b27e737e22818609bfcb7c9481ba9ab43c7ab46d347b5bb433a82e8e4c0177e203332ecdc91e77ea70cfd74d99e4cb396f8a895e2434c009180aed5d9bd9b7c221e8ace4a44f69e838f2a7eaeb3ab653a86d3feb431403a7095ecea54c86424f61d6639ebff0537168957dde17f0e669b09a048ec0144811a3e27e00b3e3c5855976ebb672be57fe69f56d3075909f7a7b2ab5db20b65c39939c9425ce733edf999c5ad484fb7e9dcd52f63b4487a9805cfaa5ef41c024058e5a71f5e972802adbc6f5960ead3d091b527a492f09439934260d4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (374, '{"ob": ["15151515f6eede2a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0291a22162c4756c72d93ee3748f141799a1aae7e89d5bb8160951092c1b4d425ccca8c7059dc93db560945a0bcb7477789969d016f6078c38092f7c42244b24f5c07bd8d6cce0b5733baf11c8c916d8d025cc69f1cbbad9948ab88de05b86323aedcaccda47cab3a4fb230140fad4f1e240e81456e1d43134efd04a9d025353f365738362bf8ab233904fe58670724777b50b8b79fba0b774c1942fbf937d02221f1e0e1520b434f1a72ef4ef9447a3382a4f24747aa728755d608fc3b9d308ac5c19a2c9916dc259529ac9742aca48a61471fbd47e23dc5c03304cd10a1cce76dbd381d1ce3eafdc932ff846eebca5b152e9c96000ed771b6f177a107ded9567ec54c9f0415f46d668a658dabe951aab700ef76820ff0c00479cb1587ec714"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (375, '{"ob": ["15151515f6eede13892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cef7e5d0f77f54fbdc44bd9d18d8d7d85207d190667b8977169eac4027aeb622ff1a1dbdba6a97b77a18d6cd49e3d533091da925ec2c8dd6e0f70fc02edc3c102d48a50e240fec9a90007d4faa5fcc33e0832b374e9d78a4e985acfeaf086cc9c89850ccfe7d27f3c3922b89be837753d167184d62e21bbceee50b55b0d142c7d02ef9830c9946b8f5584750fbbc615baffdf70b2c200154a97c9679073f30d532171af924f8eaf222c8eb348dd0baa570a072766cabb62cd713757ed74dc17b6f178fabbbecdcdfe14ca0116c48495392306cf4b33a8a25fe359e0491d5df4eaa65894fe3a3756b3d5f9274845efa9c6e6acaba94624791b75e34d021f17622b0360046c6d00e991f289e77952d13b2a2edd8f004bffed2021839a5ab25004ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (376, '{"ob": ["15151515f6eede18892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cef896b32381597911f086a44f698bc2caf3e2bf87da636c406134fccd3e2f1bd05892cde30cbaa92f3103a550f16090a737eb13c5cb0c68d905d9f3dfc3ea6f8e3e207cb9a829ee91ab451d3d4632f83b1cd0a8385ef4960beb8edd544b6e62ec0b08d5d5c558ae1f23f4bf5754fc7683a738b5d251b9b411358b33643082cacf00de8a8fb7d3681dea3902bc901b6f7862eb08fdae4e341905fc0d696d124ef632ce619aa68b0a46287c8abdb0281f5b594f3e482dbf23381742d9efff650342f16f43260229510be3ea397a1a28c2650b63ed89c8359236f20642e2a2b866880c3f319777a0686408751144b5346f0c70b11d36d9c46dbcb6a49c59e45eb3b16295bef6decc3769971b309b53c262f849bc795cd76691a5a70df5451b5337b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (377, '{"ob": ["15151515f6eedea6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cee5b4b5e8c8ba273baf058903eb0b0f1102b00d9eb61f00e42c1a127fba77a6a859351ce3c3cc0b4ee23f498ea6717e5d6735b038ee6feea4bae2bd8ed62cbc9a966f4f333dec036463f99ce6012b92c5eb8b822eafbc8bffacb1e250e7a8b861e5160e99f4d78760b046019055a79fc798d75837101065590af66e153889ce68560eb6a294e822fa6dcafcd7784482dabdc5f33b4cf224f3ffa626482af185b66ebc70357a240bf9e03e1370dddd889f7d6b4ff70061e4200b1fe0973d5cca3578ab9a641ddcad5ddecaaf0c735c484cf8ce200c69e00988d07b1b797f3808a78f2421022dbb285df615e23f1c6dec8cc3cd87d0483f3a337dd3cb8239ef6584f1be916754d6494dfa14806ca823177c4fcd76f108f1d1d0507f395c3608ebc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (378, '{"ob": ["15151515f6eede1c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c732a83f111845594c575a7bc206aa125289c01a1376a3c3effeac85d96f96501b041e02c6c04fd66ec0995b81eacfd9fe9e42e95c53ab877c9a9e91a418f15c477091d47ddaf629f3cdeebd560a5126788a83330cf597f6f356fd5bd69a4db50acecc2ce49fa437382ea4be7844cd543fe1143c4828d82f1d767829818fd27c4d2d550bd1d47fcef005abccd0a865b62d6260ba9bfc129998e229cb3c7cf2a21fe8d5b19a6bc4fa2fef2af5b261d458b052d1f8912967b7785cc9026a3f6b87e01bc738f2b5ebdc393092173f48ea5e0974cfb3dfd685af8a2e0fbd3f155f47002a527103e58e2a035f75047e0c1d66d1df957b28e1c62ff02f859b68e3ce67e179486493a3432dd090b538cb253851a39191393f8c0493c3257d20e59717c58"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (379, '{"ob": ["15151515f6eedeb6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c24edfde845e2df08729c52feb5b01a4a5a2cd32d6da70a024b21298203b9242b97afca0a863b428136e27477d47f0f96d0440f07859f08ed1b41371a9d6c3898fe4051aa77f896028baed5f3e7e59faa1c7d0f8b9d1065622b04388081bb18b8fe69d6981fbc549af80deaff3ef326c09840edb640954ce0b00e2ec139aa2412956e7c99d77e0663009e30e713fdfb531e472fe7da7563a5e6992b66172f554ba46ecf6c4dca7cb5333824419d386a08539a8084b95b097ae08c1f4778c152719083762bccfdd848c0319ad941e50fe20ae107b403abdadc8421cea261ce956ca79d7570cb10e3313b7b6deed6bd5c7f16e37c9e5648cfb5a26442bd9ae671fc56fbe5e484d1602c4152d8759cb176c88db0732c0f3ad41d2f6e9317cfcf4405"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (380, '{"ob": ["15151515f6eede51892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c28e8f8a3864a7d88e5f97951ef62adaa176abafe4450e5949e166eba114e9a0aadd7cb2bafde9d12a047edf58f79f5d6f467a5063ff6a5f11bbdd737aa778b003c42007d870ac3033d220b04f3ca8450f5960f0b143a51eb8560f595389d11f2db93fa5146f907626f28277fd7961fc71b49150ddda7813db48f84f62713a86a8acb2703e4a49d46d85b62d65ef1f5e039edf53f5d7c986604701dcf63b6f7e09670b66227fa01ead0733efd29ac591909285afe013531806cb56dac22396118497226141a87bc3b86e66ed036f60d307ffa1900fd775f02363f18030d304acbdff29e67262d4353710666448f18edf619547a9027522c6b1c60bb913f4aeae3c19a7725def390ccf9d82bc7198b284ea9273a94b12d8730638f554ca72920a6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (381, '{"ob": ["15151515f6eedec1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c94de30237a6ca29bceb5d69c3d50a749eb20f2b6134a3ed33c885187094388fdb8fb252a3f7ff8e4ce49fc96ea900180e3f7085fc05e4b93677265239c5ce3b4830f62b69d9a3d40beec236643f9a88558013a682f442f43d9a916982f15c78a4ae906fa38002336cf4731666de2c10c8c7495eca8a8abe5a8b220ebfdb1933e6d4249b83ad7471234eda4af6d1d818061336f1a0ec3445245a492d28aba47b6f5714e2451666b5c6e9d55701bd499cf0ec977581dde36bae345f6ccc140f76866e25bf7460084402eb6245deee70eaaadc507908ff71292db77da62113733077dec5d2a49d516968bb784386f3a66a5297a77a500d99656963057010bed5552abad64f4f9054a19efc48ff757010cf51efd39e0a396f5c08f6f8c0eab9fe988"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (382, '{"ob": ["15151515f6eede1e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9f181e4a146d349e7ac2472574b5305575e089aba4d3e3ab00be4394fcda9acbf4c0b58e13a0005a8238f0d391f3f2fe9d14b5d965a134eea9f1adf3d914b9eee1e7bd93273438e2db7de3742d54d696069ac192cc6322a38387501b5d2f974ac2ee1b1e7491ef9d66f50da74611784cb1d1d2b8036f5d54f87bcbd1b15b40437347507fa258f60c8c81f914081c03af1a21790c11ef539c20ff721e05b4169d79f8f4d82eddfede3002313547a079f5620dd318e560dd03c616a094a9f7ce9672c6ab01f2055db28505fdbb25ba15a141470612c568bdc9205430612a2d6adec341d591435dc3857f937e4cff56957932e310014d87468ccfebc476f9159cc2a6fa834ab678abdb5d43266b31dd71784a011f374f992edf688d75dd71705ec0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (383, '{"ob": ["15151515f6eede2f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c496f05c55e376e122367f9951c061b18fb1ba440dbe0f5e3fb324ecde772e5652025925dda896dd23bcf02ae5824102c219bbd0a4ed4ffd8700a98337afcf30c5b3d95ec026aa691cbc7cf72bb29c289bb5a2c1856553f53f3df2132f2074aabe7a06b1fe09146e11e501b2981820a619257ac1e870d6b960cf8eb187a857bbd98997afbd08415e031611480595bbc55569c5031bc131be0db524d2227c937692536765901b265725708e907a0b0e47f46ed9f699499ed25681163e8fd6ec614fe414c24c9890174c6c8fa978f9c845a0606f5f1b3eec4dd1661a971e51ba256aa77678c072043cc06e3bbf0c6a64a255f84f6f0224e0c0449bad54e98b3a2c4705e175ee989f681facf98f85deb7c412cbf5d734326c0222b51cb577ea42e6b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (384, '{"ob": ["15151515f6eede65892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c276342175e541eef13cbf187d167c69025e5baa025441d223f68f3a732d52f7a52714824f2bdd7bf383394dad48fed4303249284f2e15b7d1a9b3c8aedc38045c555e8799761eb07f8e0b62caaf6e026f12eb549c1e52454ddcf2d860ba88e7f99f53ee2098608b9f598162a46c53d33259515c3b6dfecb0e780d7ed3962d9760bf57da528d65de8a11671ae2e0a5226cb1e5ceb08a475734fd3d9b4ef492c06007fa303ddf15c530793d3b940155e51c6704dc4e9442efadbfb8eae1b71aaa332a5cf57a9d1275c758942e085538597b210cc84bb45ba135c9f02ce8dab1385ef1175decacba882a88930e5a7478d682dd1298defc0846deeeab064e333496151c544f99607a9d7cce93f882773f5e6cc7748a33d2bf19fe6a7ee7092ee09db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (385, '{"ob": ["15151515f6eedefb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc41cd12111c8ca1d5dd5be1a6fd605b2600dec5b4f2a685abe2ec26300b4f5df66a60cd07dbbd65fab3a2d2d69f11c6900ebf7a7d04786fa954932a18fc2091c438179dca4d6147037b3717e8e665a8c001377bd33799a2e017e7c453196633fee3a05c238d3df5ef6970bc1678596f8d3a352427c0c3610435277ff5932ccd4eb1ca031a3952b1ed7b22d235673cbb6f2d93b336d165f47d123355181b6d478b0b2bb0bd06baff1128efe313949c6ca6eeb9774f7ce7191a1b8ce81b9e273a33a5aa5f05da698f388d7c577c72e2962bf3bce5933e766050089d43b30c19547d481cc1ba5c54a46a2f86f195d33f11d37a16f9a01d6ef86dcb2fec00c8696a6d9e6cd78c4b8d1d4f1644b27c3f38752faabfcf3679534da0d41d006c2f0b9e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (386, '{"ob": ["15151515f6eede97892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c06a9fce31e9700f99776e45a39d948f23992417c4ee4f46910bc7b78bdaca7d25f3f2c85eac73f0d76cd484a8a3f118ef918fcc313b7384471c4740cda1aa748eb872621319cf7f790e1dc8e47bc2ce931d535b3743cdd023317d3395935bb8885df4bf4b105af8b8c70bfdb798393b266c17563011ecdc9d3438fab30ab4ebfcd5c6b1df1a22e36cc77b69355725be7ba3784dcf812af5c167dd5d1b120f398d4facba1ffa6dcc1788ba66235fbe7b838f3c4d537f3001b9aaf9deefe36506e73dc88acd897c7615f7f47f65fb66a534e99451e2ad2a2bdfaa2a61c255a68e509faf2d0fe34edc29720a169ed9f2048bdda2fdbf4dfbaa0142137c8c9fa5cf6bac29f4af35c7a55c6b4c10352eb6a92659f9c583d7330a91388d485c0e52e40"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (387, '{"ob": ["15151515f6eede84892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c953e7887619c3935fff13f90643400d01ed9e5d04a151a3616849212d27abbee9a9b09fe3e443ab188221a796e0a79ea06f9ae1767fd438f5fe7c4057af473ce1877fb6ea0ebb2bda322c162512d15f46c5ac2bafa12fb92c320f06c503557bb17110118a25682bf155bfa6abe40c036c8ceff7f97e20788964c84a9f6d8c38e7038bd4f782cd5a98b1b5e22875bf01759c4c2e7947b7044930521ce454e7553fa80386da432f6aa00020e8761aa6c6962088552b83c2efcfd2a38c52a5fa104e204ecd40bf606ecfe3dd9edbb0b6a4827c542b83f5325f746dd2afb8e04cdb4d4a9651344f0589b52b4cf16c4d9a03c3b18a47a5ff467f9b338781b034437209a06ad4be2ba39ef948c72c0479d9b9fb17e5961bb7a8b87ffcbdffb447f9830"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (388, '{"ob": ["15151515f6eedecd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce9d2d02233bbe61ecb21dea2b3a75eeea99255039aa97bcf34359cb82895a226f56b07ac4123adc2831a46629a3498cb74a0155a20ae8cdcbb492e762b46e1e3381fe696252356c7214ed7be602c3dada7c0946230b3a7476d5ea6b8b480cdb22a82b2cb9cd8e35b2c995052a075f8900705f12b25d7edc05b60cb214195264c074120ef4cc4a54420a50db546d859fdd6a618ad57126ac2029257d3397390ada146bc7a93341cbd8284624e5fa5a2c59a68d9378b58dcad14e4acf2c07d2226af746b21ef8aea282dc1105c1dc6a4470da712694f48b379797e240e3c1c8ea24186d39ded314701947ab83a35738637924a3affa0d014856df99a379ff76bd42746eb6637b92d096be5147e8c2c4b5165ce77d1f831dd371926ddf4b780e264"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (389, '{"ob": ["15151515f6eede3f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c62527b1e812d396dfc5e36a88f2bc90e76aa649245303eba46cb334cef7f689683604b1256c615561697d6e4c3165d1efb09cdb33c6e8851dcd7e8f4b9094033bb49c2c93d907b3610a1c7fe954bdf0f957bdc11234043cc08435a1f42ae07bc91fcb417b9c03a07ea60d5d4f6c51d972d0266841cb4d9d3fd881b63e711ccb4d574a7fee6e088ac2aee883c984a6eca5847b5445a1968bbed4fa34a82a09bec7448897187b0c70f58d07c783fdc01f5d609e5e6498aea468637bcb167903e9e2eaabc16635ed22747aeb7870c593111107a73f1b4827089af9f7fb3b89c99653cc8b40942f19f5bfbfc206c32554ee2f4e0b67c59285a6d1992de426619478acdae86a0a8ec2f5e80719b2addffd6f4d83f7399776a6b6654c60e8cec10d998"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (390, '{"ob": ["15151515f6eede0d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9caa230a382b00e12ae9978af939a18d31ba99c67d83e6858465562156da8ff97a8c4dd2653685a7635b6dbb3213e176fe1441c1a7279f9d283bc24bc76a847bfed6b93f4bc5d2ba1335d80c26543d7921bde1f0b5b49c49afba60a621ee50e377baf21c2c038939a851fa31b6609a4a59ef54cac47061da02fefdea689d0e103ea0d516faf11d64c876471e98b617f937b14e9d904f989d47750b3c1a9fbde84a467734c16e99c75d78bf633899cae573495c1b6487a94d02d1aa37a8f795d2e4faf349005695802d83cc0c82a3e25107150c529912de854d2bf8937bc406c413c143a0cd9c7e29a9c1d09afde1140c72ffb79da8a9760cd948784ad3f6095d362fdf7c23939542a81f3f3d9559add44cf8a32acf5538375b2350dafc4ad8ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (391, '{"ob": ["15151515f6eedefd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbcde24205d119d6c78cf73e2057630d19226a11e88a62ef398b856ca289af7e72ff23286f6811caff98e862e2ec82a485ab4091deeeae8f2c366d377ae6d3c6bcf533d9fbbeab17b1a71981d133cd8d4cdb5e3755ff1c5e30c94423f8f76093b9e5b87f517bfb9c98261d1c9a24886c16a447971c6c6c98501151117b7170bf21d72480252a1a6171d716d99a273204eb3c197dff03fabc0885f2faf49755f9394d97d1cc19ee2c95370d69548c4ae0945c2dd4c5c9a4ea3aecf982cf519ddf997887b63e4252eb7b943855ed62c23db33ee96ec2e3961b11b2cb23cc4f8039668986ddb56d4f31d4ec77cb0fec33a963d25da8690315bd6bcb971e1ce0ccce9f12852bbe855049e8bf913bfafdac978430c52de9db3ccb12b72a0fee1d4d7ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (392, '{"ob": ["15151515f6eede28892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c157f792c95d4c967b19efefdae271fae9a9c3e3408bcbf8af63be772ae82154f3bf0f25c1329d1b72ab781bfa1c9f695ca88a762d4a9d276105158ca75aa91a4c78e4077acc5da931df0b88e0a2caf575946b6daea98b863642e30253563382cdacf686383344736f50d252778b3004c9b6f02065f38e79a5bb2d60bce87aed7fbecb3135fb35dadadad67d0c2be119bd91899841e55665b4b65b65badf530aa8dc4f9f5474866cda2f99b180c0f0c17b4395e75c6aff83fcb620d3b25d384d808b53b6587e86e397a477b4deb65a7c5e0db1fe1aadd93db8544a0d6082fe1396bd09f99fb756e917c46b978c54c443c13ad2cd1161f12899d2cc6ff509220beca3e6d50df0f57c3efe2b752366c0f55d41891d18026763cfb7777d21c5b71f5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (393, '{"ob": ["15151515f6eede14892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9c16d87e86f927a5f2b9d42b46f96bea41b5dcf9253eed52e3815a1edff35991059b0c4f4eed56c05d5bd81e9bf088c36c59270ce8a590667b5b224d71bcb9b2d2a0b93abcf52617705e54e1deb95fb850f4076b49d41894377cfa89e6c3d821df6032a0c2923c118062eec2d06e8efe4e54953d2bccca6d3371dcaa234e05e555a94c18247f4c15114a3da9b6718d8b48e074fb1dd2598649dc8ff8edd62a7c6890ac4511fa037e622ae4b17948198ae0ba92574ae5c04d69ab66dc5d4a9f9d6076029a8d5c53430a0af974dee0026813195f9bc4609a7701da36434cfffc2bb32b6baaccb652ac00ad7fbd43a17525ec8002d6d6a274ad6e845d67dd78f7ad9488afc34f24fa016940f9e45ba0885446e28e06d63b9bb3264af9214a61e530"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (394, '{"ob": ["15151515f6eede40892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca8557e5688c909f7eb37d3c823498423acd7ff6973f4933947145c53f25f7ef7faddd72c2bbbb029e2bca53c20ff40054702204dfcb0176cd3d66c6a67af53591e490fb199b4042401da79f2073f3827a046cac003e7cac83e49927b71c7aa641a83e343cdc802e5e633d58729f05d8323a602f54433e2fd5fc4e1ec98d2d5e838dcda2041361a4aed465e26872dcc0f0bb39b5a4f3a23a629282f540aef3d365d34481a2da6ffef0331c421eca3310fb814390d6f76b4481304336df328fda2449a70169b884b3cf8178e035ca21e14897485314182bfae732d99c80e5d19d048050190654d7271dd9ac7c2df7c4337a1877e51f265b0237213527c377178257124e52a447d8380122f8acc3bc1e90263094c39d09d97473542f31e459cf1b2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (395, '{"ob": ["15151515f6eeded6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2ee8bd893f0435577da0abd01959a56de172e2e5aa70d53c73dda59925e59f3ecbcfa60e998bc645ea5a8a91e6995b857689b4d64b3449a22174d0bb7f3c61de09973c887332637af5727b2d6a95bbdcc46a90fe2cb6e3cfd7ffac59d77dbd1058fe6bcf1073a52e8d85f8511a2bc68d84a2c8df5e71bc5435d576f48be94684442a73f4c7900c620a4522c23a93ff2da0e91f71caa5e985d04447920e0db56c35eadb55c082518b9134f8d0f115b2af7f91ec1a14668b17342b6090dbcbdf52f0e474685847d0b6d44afd07ad4c6b18dd53cfbda818763acc02337b82c750e758cff6a4f69c09a14543b4e7a6ffd6b26048e42e268bff0cf961e30ec2b760459a5f3d6eb63ecef5befc617cdf9d85a7388859e166c81944eacb35f6d120f17d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (396, '{"ob": ["15151515f6eedecb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8ccd216ba9e60db37811ce7210b252a4d0acaca3c65ee4c1b05aa5112adee9e5c298c73a260c37cfcc51e55c9947907e40d822d30ad6d5567e0cb99595521dde6c3c9ffd7e2fdd77f694114a3ac584305bfeba4226071af13e79e8fda3c2955ca091735fa55627a89b6a544d2dc83fb044adc97a0cfbd311ce818a5ad1d31444c8a29e8e158a1e5b629af12f5ad4e43b6ce2b429ab36e8178eb5d6048cd7532773f4d9da3b334f9a517582cde49c892340faa1375026f5849f889fe3833fdcd40fe2f013573143c61b4458937479c2377599c6af31f8b998ca86384c66b3fb9f583192f5e682da9a9090240ac2f99718076c0d061c73606d82c013b6ded7c9166037f7535cdb27a020a7ca491f80864a4135ef388c8002bbcd746d91e3b103df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (397, '{"ob": ["15151515f6eede1a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2b60253c80ce70bf39607dcf37a1a5b110f2c21c3b04f0e77f99244fe9ed2c9a5cc58b5ea92461b600c67d57fc2b1475cfc0fa21d8bd207c8d53de72cce3258d8b77f98972a6c026b512ef9eedf7f61d8cea12829991334ff7ebaa0ff744c1caa87d95f4fd8ef478eb3b97e535317a42e70df88c30dc233ac434bdadad0dff8d73c15d2e5bf7f43a2620b32e27864bc8c71cba6e749c9e27ce5ebd27d85b1a634ab68841aa1368a598fc6915cb258fb683366a2688c4bdcc6185ccbfe2772a6e98bdf89b34145dd4e9966ab99ec81e7f8c7ddad9917dc275456b84c36c10a98949ebedf555ba10818eb960fa20acab094d83da56135e8ebfeeeb229bf419d414ccbe4c2d23edaf97e28a6f188975e65a9eaa742419aff38bc1c4c16c7d341360"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (398, '{"ob": ["15151515f6eede58892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c40a82d30026df9f943510cb6d2ed656af8c69bf2cfb5a9e5525b6e86c5b4db2ef1bb625932a7be594455158b4a6e3198a413029c80791731873a3ba61dc3aa7def792e8e02f03dc66587712bdf478541acf1707c43902c6a818c088dcca78d51fc09b92d8acf86815d5dd7241957bd6232b84b445cfdde8c2709643c86b52e88fbb16b28e699e020f18511fb350825db08de24360b14dfd5094e968878244e6ed21c5267a2740ddb6682f912283c9d68b421acbc1e8f5302d293195cfdd2efa6c736c7f2c9fcd2902640c1f2779c10f0b31835f4f5009b765dff7bfddb63542cd4b1ba53130ecf0fa6e668e8bc315b3478eb2e02f56e1e077db8a6ca9c2c877ad6560f4611e33ef09a32a1ab98c4286a2a6d53466b6ec02335c52826724a8fa8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (399, '{"ob": ["15151515f6eede77892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceaf369e06aaf2f8204abff296265fff6bb5976fe887d2ce4442636aa7235649f3a0a3ee20c2b8d45c6d476390e06261651e17b7fda2feb9c4d2d30ead768ee7225c856204c0ca955292056a5399fafbc88e3179e1cd34036e9fc5e5e7ec01310e3e6beb15d131b547b814b100a29b1e62d61df793aa8e8b3a4db2c76deb2cdd84588c4fa149597d6d001f3117d19c4dce2c5b3b084a169a81339eda45c91690903ceebc70f32857b7faf590fb28f6ff1700550088b5f2f312e532ed560d9964f34f0d8ddac1934676695359a149374d7523901d3e603c1e4ebe2493ecf4ddd117b8a95fcb3913cb4c83de71dd8fa08fb9ff387f2916507e903ac0c432d311843cafc4f68bd12f84ed74613476ae47dd0ce4d261f11412f57f6a4d2a31117440f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (400, '{"ob": ["15151515f6eede7b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9805cae4e0679a782fd388dce8a579d602c51c30ad769a60b0bdfc97113e0d0006942125d9eabb8e3578e37c74e5f1cd35aea9971c0caa2b8449a64e86d2a4051ebfe4f5a49e1db7d5bb3907e5a48543f6dbb8d5c125b0d70b4c8eb327b235e812c69b3295dd913cf4f2e2e33210d16a5d725e94b56d18cb797ff6796cd25f08d65fba293937a2cb9040525e64799c3f6b71fa600ac8b9a9156a94f9b5c3dc1247e17a4c75a238c824c5bd13c62d1d3eb9f30b5784b22e6d0b636649961ae9002603a8a1ef53ba108ce767585f696eb74ffa13a613395a55aadd3ba72b2cb540ab1022f2c0ed2f983bf2fc84b293a9970c283fc2b12e26e940896caac4d480ec719f07dc86884cac3b2c8963a552fd727860ca28ec5a57a7c5daa5be6e78418e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (401, '{"ob": ["15151515f6eedea2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9ab0c94b519d73dc41162c933a40db167b53fa4eeb87c5feaffbf58e10a255c35376f540ce900574ba3d522d72a8dfa2e3a1207e2c04b9484a55e986198bf045044a49523325f4dca581af281ac7da67c0298d699740441dc61cc848e7eb6e786f572064881cd3b9f13466db21eeaa7617da3fa11c10f9a008b6cb62a04c4da9952451e5bf1fee5e0785c80025c767b84ec3f20ee4b3fd71cb515cee92a9074b595703a9d697329e85e5061a808ebec60cda4862a586e68c1da0c5f1ff3a3a33b79191ca1794b5fda2ec0b2fcc1d050bf5cfe337b1a62eff6acafd45c9bce4974c405d98cf77ba0a14d5f467eeee24533db33debe9bfaead7ecbe0dd54d178cd5fbfa05d130d746ac0ca9dec832064f97b987cfdc513b27bd2bc84dfa315ed9a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (402, '{"ob": ["15151515f6eede39892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c661dda43e2a95c2529b35266b8ffc610039ebb58bc648e46a6163181e82094e63e256e41b661690b89718e7a3d87a0949ff5aecad5dc6ef3ac6a4fe60445911061886f1e7f2e3cfd0a1c97cf30aff7ef3cf2b3fb31b089067bab37a49a75adcb3865ed0691c864cef63697e74cbae599786191e8b0ba9bf84e7b503540045c0b53e55350dc5a738bafcaba65e9aad3f3b44d0c1d9d441a1d8e348217ffa4e7a95a6a9ada78898b1cee7e49de7f657f9b6c0482d6240eaa3bb6149eb6885c14166347fa05f2955125d0167e71bc8bcc22a7d5c933c484247c2ce7b5ab93973a55991008f70f74c2d3a6d4f121f108cb2df4a6a5c589d9b3da30faa23d3b0a720f4f6690e42a60221c6cae8a6e705a89d0fa2acf3ad0c017b5de5f5ef87dbbec5a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (403, '{"ob": ["15151515f6eeded2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cfe986741155420d2f4d7628649fc7df1688539a6bc7447bec790e2cca80ac6c52a9f846e9c83ce32854b5c7b3454f114578478b47752e5940cb09465f8b187aa176222d7fae73168bf0ffa73276b1533490c7327a0ed007b00a9743f8ffe2bdeeb440d16f0571c3c7843c12624f06360a38380fd33c73ab27ca5d37ee21dcbe96dc9299146f254d82cbef089734f9358f2d6664cfe0ba8f4b715c9ef69041918be280c5f7ea15a82235b6b0a270a1f15e0b721e0e07f7d586ada181ad7db24d1bbca434300142efb4f63de748d26f1062ecf17097e981aced7ccf9b92075cd5b20cfafa28454510342ca97a987506ee603b279777f1b9d4a6770372488c48925607f082fcf782150fdcf6602b7422a573d44c26e4b554826966142b718855094"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (404, '{"ob": ["15151515f6eede12892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3f866be59ce26f2e42432ca34e39a0a1aedcbb00dded5629b3f4c49ee119320522b5fb6197ca3011fefa79d5725f038e5c94d3cfdbcfe811316756fde864154bdc6dae551da56ed91c32ecd71b47981eeaae2f54c6a6c151e645ff31a6573f8415d1e60661e6fb81e159531af01051fe2aebe8b6fda30d155e70fc27ebdd1d72003aa6aef9e07147deca9b9e3f1eaef9ea317d2fb549101c944cbed91e3197b823b5fb2b0cd5e9fa4abb82385cee7af0bd5f780a5cb355b2d5c14aeb33522d166f35ce72035ab759a49150bd664954e69311992e393152ef1c46eea572b4b908ca96e95a212f0f85bc8704660a5382cd0a9103067482a3be65a2e2ffd44ef34efa48be596dba33ec98d4b6f70f4a599525d07d65db5f0691803ff8a98e943568"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (405, '{"ob": ["15151515f6eede0f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce6ef62d98fa72dda0f2cef64e2c6ef627a457a987f2621533d72f92f9125c4f8e7b0898ada9200b413965517fcfd94a39fb7893c643ea76b4d1773b061d9fd28847e2e6fed30444c19c7750941bed90ec5a8b65230a6ec057d11e2a1e814ab4dd3641cf667877af644a32a2a8fec8fa1b6d33d908cbebbd8e48464e4b51cb29d8764264364de019ef5eeb8c6badd89cd7763a12f75a59cc96309e3480a24ade7f0af0d183b3d2a42b0dcc958484cc71427abd29057d817616460df1fb1ef89bb85a4246f2718832114d38e9278690a5aa0fba9c8b4a3e55bf5b57206d48762e8d939123688513c7083f7c7297c5a50a7373903a90bdfa46480bc0b2d89f8364d9837c2b5624536a9deba5c5d8f57de12af13c4a4729e9569c57f12fa28a5097d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (406, '{"ob": ["15151515f6eede32892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7ef24dd45fe9ce8e17726f62ea04be7564591caf430f95b4d7e3161f510ab09cd3d32f6e8a7ede5b083b8d0951181ab1060329b992a0ebfacb411ac9c8103792efae909cb72c87f5479f12f49abd3a3ea1237145a2387f928bbfd833257f855717caf030b8bf01bdeb069b0373713eb70ecb82706719b9dac625cb2943c645fc828ee768c4b2801e449e8a613d74e6d2b965fea08f55e8adc783eb1c9890963539799c822df7c8129374c7ef0876092afe55021ea5fa38ea91f8f27e6a41b52770da48eda0a440aca21b0aeda1d8e2e08a1f8248f94d5f0ba0f5856255ac795d6f84d3267f44791f45f20471e9b765b06d1f8a0a92fc5a55aad3e65699db0826ef41796a69c936ce571bd3f0b0256a77ce8ca2bc20c55423f9c4cb2f8bacfbac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (407, '{"ob": ["15151515f6eede05892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0d4f94af806c2af31fc80c44ecfa8c2c2921b0c74181af9b663c3fc84d46c530e0a023ff12c4f804e14981e730489a4128eae0148ad81865b090b65697830ed4cb43e33316aa15fcc7dd6a9bb8fdc235dde5ede982368f621faf6d34193cda7a2b7b6814bf70ae12cf51b897975db9fd1f4948262b7f8cdf21804bd4bc2fa51dd76bfcfca39b35a08798728c3f9d5dc975c7a769925a3e06210ea1950a133b0aabac1261c7a05dd0b28856c7df01e4cf9d9dea62743c8384f82100a312bdef96f154e7d6522959d5b681651e557b3449c2f61f6206af4395e23e1936583a57455af14e5e27edf6f9c6c11fdcadca70c83f1154d6816f5af80f9c9ce9d7bdd852e02a99a8def021f001cac86c8d09a70123340425d75d548154fe40a685cc9fe8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (408, '{"ob": ["15151515f6eede47892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c46f117ef781fd33355b1454d01679e05ba90be00197850017e305a99fb2e5ef999309866b4958664327a0f295cb30a508a51666da4132060c7635eab5ff45cee8f71544a86d34827bfdb40c1bf041dc73cb713613fcaf3a8939c3f2fa9d26a88e4a84561ff0458d485b965f52caa33e29dd446b44e62813fe1b7db3f87b441a82b9f1713ced0f8b0a54f2cdd82ec867eb28ffa3228d92cf4dff71c9640c48bd8e1d22bd49fe1c0f981ea23f58eb50c2515bf2169ecd039b22307d6b67d04cfdd023a787f03c97c5e1c4efbda1a874acb72a3a8f0acade6adfdb6fdb6e3f7c353ea276ce4258c35550e840c6ca5d19929e0085581e2566452c004a575296e514bccbd0e42865c1cd4cd0556c1da16de558613f50ef3b5a12b2bb411af3a4f14a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (409, '{"ob": ["15151515f6eedef5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb2fc1a0cf9d423a0cd1f9fd0a5f6e4fe9744e8d864e1d25db15127b2161ef9685872d86ef383f291aa08a6fa4dc8c61c4f679e3979f87aa72a9fd39c8a76585159aa6a17c07f52ab7884eb103ce415d0adec859f90b492376dcdaa9223b1dd2be4c8a7c2236a50cd5910d3365eb66dee8685d9789c2b564613a204b9cdb6bb5c426c3abaa58c637b561c10d1ec3d209919593dd92318690aca8896e53522ceda28c5630b4460aa860e119a2ca31002ccf077b22564fea3e53a8de593ba517aeb80a37ffe825dedceae406a63b4a68709c7d2bc149bce69991b625c88c214dc026d62b9fbc05b8e1454a98a554f038a68144c2e80487cbf87c0596f7c232235e45a95b2c88b755c12167ae85e79466d0bf386b85fa9615cd5756547a59e3bbd6e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (410, '{"ob": ["15151515f6eedec4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c47a345f3d7b2135db5301aa21834c7bbe682a6c3e0dfcbe706acf4d1f33644f6cc7b911ea5ec21732b684497a86371f4b7f018709db7d958f73e4c23cfcb2d46fe45b2a50440bed894bb683d352c79b01fcebb49e22705e9a3adf1b4a621ea04d9ca4fdf8b7dd8b05fdf847e2846d72131b34fd2b7bc019795ef35a1602c52a621b079b1426b6624779f1135b0883dfe2e00c34aac8f460c877660b7cec38a93758b7bde2699ba4f35051d97d04e25e0519bf48a9c937f48d7f4cc2333235b513d53366e13b58ca6fdb47d6197aaade4b63604e7be3e917ff40c989e7fcff1bb86c08c437640a0617a1ccff52d45e454ea936749a50499cfacb3bee33580e8851b78da33eef45e7c3e286929a156d4993755109645c60143f992aaf3e6e2d13b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (411, '{"ob": ["15151515f6eede8c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cad844d8e400efb3f0b6efa6452d25a6705e025cfe9f1539b5d26f24cc64c6f129c9a0cb86826ccd2d069c2afaced8a8eedaaa34b484e83b5c50fdc81d8245457db72356092ee26cc413cc15727262ded1664308a0886e4061b5221723d807c50247234f9f9d729fabf473193b5ac8cc951f35a41376b3cc06bbe6e01c3d240bded0eee37507cb3cf88a629d1fc017cb5807c9391e696c486de09b6054e614d45fb7d14d7f247bb3fe2fe856e91f15801bd4440e9d6ee1c2996fbd7787b76532a6d9f8075f0b3ba8609fdbfd2b16f567ae269371d5af6fb85e81465685004b3a51eabb64869b5d3af3645216e4e5f6ff8a3812a59c003ed6534e2391de665f02f8239f40275427fc39473e581852c6f5fbfcdccaf17d956797e3079d46c16cd6f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (412, '{"ob": ["15151515f6eedeca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf82eed599731b721d0eaa7c1a1e5276f33f8bd332b1e9707459db0ee16c94dc343e29b6005cc25e9a679327c52610758c232b5786d3990925b967b52c74dc583cc31570d13013eaf0acc0e99d8d51706c623cca37495b8e61039f4e85bcc4dc063cc75a1fbf19a01b1ea0fc638fa4317dabe832d8a050405d2d6faf2666304024c67480f9fe991901b0e8119c273c43e9e052f5fe711740025ba60acc359d2ad9b70ca7f2d18da8138e952c46cd0677ff33c94d729e4ceafef81ace82b2e088a2f638643bbc9ba09bf32092316a7e9670aaf893ec386971adbb785202a26d7367c941fa1f7ffc2afa42ddd56bb0dea2496ca6495d6ebdf5972e307f797e066e7f5ae91e82aa12c1329f3c5308ef155dce3450bed6633d69b7d114e7cf8906275"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (413, '{"ob": ["15151515f6eede48892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c684d7974e7dd9dcfebb133e2b006b408fee9cc9acef3f0f9d82e81db7d9fc6926105a411c589b4913a83dac55d61b465aa8e4012ec54560f5212482d03d141df5a9372aabc545400d07ed19db12b5cd93d2fc150b6685df3e3980e32ecc06e26478d4c00ea0aace9ff18cbe922409f6b38571ba94e990e3a3305b2fd9c3ca8a454d2bc2a0e6a8ed222c72f05fb7ce4fc660f89ea91e96080bd3564d83be7a09995aeb1d517f6e123dfcd9bd39aa6be5390be7ac72597dcaa7b4344552709fe26433bd71a976b3be67a5dba15957bafe93ef557698c8617ed536d657fa53a9f798b0375ec1844cf12367b15123621bced20bdce8d37414a911b45679b30670b93c2f64e37cf056a75d3b95660998aabcd14a8de3d99233a8d709896f20ee30cb9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (414, '{"ob": ["15151515f6eedefc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caa78815a2e1a9390d360024c50c256858cf0543aace725810ae95743145935e08f53faa3feb6dd774f5600610728bf0428f47903a2c38450a2813a39180262dc042b08d9839d292fc91099e8275dbac4599c2dd20f6c756b83c9a44eb2d64fcfe8ec38f0ba4df00646179cee2ba8dd9fa35794195630fb6a997ace75391f9e1aff567db1b803d146e179e6c4df54517d3eae47df7ae31f4678e970286fd5bc5c373085fe7f3666521c5d2cbf489b4b73e57754c920e22819ad1f196bc891e45b71645b036811c74da0f5fc7829967d1979d156f9b6c6b21324a91b1a5d6a74cc50f404c42bdbf94c5ee6fbc5f0733759595760020d84b9526fe983a34565cf388f6419e2b6d78d4157b00d4c8c82e5a750df9d39763d7dc54c478194125496ec"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (415, '{"ob": ["15151515f6eedee8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cafa73a1f4f56b4e5cfb4700d4963e50a5a95d71d186274e4507e690342a460f40964d0ca49892e01488b3e314a3f25074bca1f1009ea914e09a6f4b0db658b102859308cd2560c72094bf849e2808a75da979aa105cfc7ffc35e57fbaccd7f795b5d4387b0feff06e6a1dcf6bc0e082bf0fd5900e55d7eb05919b194c37e4573843abfc61bfd2f35a301b7cf9798d645830536290f0a3ccacdf3a03fdff18760fae7da01158cffa27478f1138e6a6ce9032e98558b1ec24dac813caeeb224622fe7d1ce307d4dec3ac354a0326dd089d6e8b179f9dfdd29649577b6ddee4cc7a1c0bca3d97dcc2e604efe4ba5109ede7596edb53afe64b5fe559fd6f8db000092888371a2447214702038ef981050e05fa5f82b9c54f4480a6498095abe119c8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (416, '{"ob": ["15151515f6eede07892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0d34dc1839f33f83bea851689bbef58a0dabcd175948059824f7c3b54ba84bdf2b2d2b7f59dd73aa0241167550e0fe29290516cf2775035efaa7ed45c050b208ce200cfb62e7ef21efb1c2009b252ab2a917951f1f54642c57a5a4cf149acde3ee7f7ad636827f2d40bcffd713f87bd30414b4c79f4fde1fa59cb2bc7103f2c697a5a4b013ca5d29a439278cb2f007946f76c80f8a0e8dcc8e8260caacb125582ebfdec0b8068b7c68adc5a91e77a3f566c6f23fb5aaada53fbe4e16d98cef217f188a503a9474dde0c20d48cd39b39ed4d233139d00a06bc55c36932b63ae69ccbeb4a45d2aa84b987486ca8cb6b3ce4461eb2dbd8656c95f34b12dbf0109e5cd67e9be3ec6ead9cab95ab5d5405eb438513083bf9d3775de57631c80e335f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (417, '{"ob": ["15151515f6eede7f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1573e4684617e3c42abcecbe952081c3cedbd6c72492a378644f92675d594c48d8157326e574c14a8e02f40c91edaf23da0e997bc0a3a475ab55aaef77cf01ba0207a6c8a2cf02823b27fa162e6a4f058ae736f9c46eb0384e9941feb55cb33b8f86c91773567fe50c46906468b208b96eb4bcdea75f1b1c85790529f17e3885d0fc42c4ad5c39ac9c06a55c3c631bf3cad58f76473e24f69a8d1cd1618dea832a6a5e9a4e5f6b247bc8515eccc0cecf113d4f22bd3ca5e11abe519c04e04770c59dfab55dca644911fbeb8ec305aa87028fd2c0b5b052a6a16f7da64e67ea2d9fd39213b11229a82e4ea84c2cbda978004f6c9a99f06b0534f79db02adae73dfc621512c2a724ff39ad93129993107b4a29c73c9b6818f0f70dd90e4e1fef3a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (418, '{"ob": ["15151515f6eede54892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cfef790e6364a1793b1f1ac4052f2002abc43e414a2576cc81cb299fcc23ac8005ad85e19bc93a2464568d43f314921466396527de0a4c52a7f884090b09b10579c89563fe6fd949831639f51be5e449e43675c3e7e522619f87103be42527a7ee1a3e3672cb2c40e8b614aa9c6e972a1bc038853cab54a24c37ed649512fe22a32547df3626abc7b462e9ca1fbb4c6d80224ace2c7fffd23f861bedf1f13fe602c8c259eef50737538f76fe9e6fc3fc291325c487bbb86a1dc13e0b28573e21e11541bdaa0129f7f27d43216c43f534ba0e2178a835bd5f866054246ff80e81d22b212e90f8ff94ea9d5c37d42cdfa26bbb05c85abe86a9db32f1a10dc68d13dbf04d8b22aa737d46786145d014388c9ab6e69e1688c2eac901e601e3e13fe88"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (419, '{"ob": ["15151515f6eede22892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1f6542e939cde4c9e5399aae9945135f8535e3753b5b6e4e6f60ad53d0888e4747b8cae59f820ee4398311f13f1da78c4ece37be93e678696728858684c68f512f426284706c762632c78d47f00babaf08476d392ece1529e0ef78e2d2abb379e8754cb2250a1025f8f15865f45a2d22ee01c0fb51842fb27cd7a4c3fd168a13f3f493698762e3407104d6386fbd13799f213d91a31f0845342e0bd9b9d74c88c63f9281ca374b6a68fe5b7b7627df3effe5f979d960c096a53979bee04c9e60bf01265bdabd61e1fafadd269c14d33045f7d7b869fdd71cdb025f34819372c5a2d34e922c1b6d2372217d191b53dad0d3b9b9b8abbc98785e641136f46a2c301dd980c2583f42af5cff2c57c462ad631e964f2641132ce21923033b3a18f2e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (420, '{"ob": ["15151515f6eedea0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6739e7611cff4e8b8a96921d790f216ee089dff5bbc7f7dd1c2e436abbed0e0e379c5c9f6c397959f4ea5affecf01a98bec8414591f6fbe7ea0f474633a2100df9c9617001e6d12fd262bf1eb3e7bd74cd96a4f0757f13a12170495608eb0c34b1e4dc62bbfbb8994c4f2645fd5a3e9916025c0be546b3867dca539cab8af64e0763118fc395557deef8596f19c9e8da65c964892f2083a138b3d5f4906c75ac87277a6cc76c9f4c66c70611f4024c0625b76c7961acaf123faeef0de01c2e94456708f937b61b162285d8fb2d3c00c659fddb11cc49cf7d0e8cfdefa5e13263a754a32cf3bcdd1235ff0c0125cd6df37cffb52240d1e83123524433a45adca0de058547d17973de9c33c749360ce03de89ba4d27ad7f1ff832233db33c1c626"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (421, '{"ob": ["15151515f6eede10892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c34dadc77d8b00a2eda0f404ff8e1b30ccea12afea03e9cffd88b4fc960dfc80e168662aa4ee4d6018bef1490d8cde677eb3e260d8d540b6c067b396e5cc5b8f882dfb954e42734438f2476e942b01affac1fbb24d95bda6eea10f3bb82928685903cb83d968a2335aa65d04238dd8d5694c0b6177338820cb490b661bcf3a8c195283c82992c94ccdb977ad57d1706dcdf34ce4d76ddf42bb4381c4731f12cdba052dbd9adcae4ba2289855a05100f5f7b422152e24f977bf7fb985b48cae6170e4ede86b081ec46843a3927c917d37b25121b957229914ec76b6ac090a414d6cea9ef1b329646e530b8db1335327e597aae832da586630bb4a0cd569dab37c97477462b20ceabee0b48b85f4773790e908fe2684a342096d5a2e247a863306c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (422, '{"ob": ["15151515f6eedec3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c290215f47e771b12ff2cadb89b90d48d858df5165881aa3907d5c5983d0b8c9ccd9cd944ec39a3621735912dfcf2f86dd64bc8c74b1c9babd77f85353af1fe0a9f8cbb2d1154a37ca591869ada56217479807d1006aba34efb7a760ee7939122e472ebbe52433f4b6ce33909a8688dd282c4dcee9112da4fb8ee275ac47eaef8392228194a5c14771d30e7a73ac1c1b1f4816e434329f349f7393265cd334e1fc2e95adf0a650bb8f70893d260826b127e0a09339762fc9335219b5f6bf618ec9f5a8f654673ff03c70af63b5813c0184178ee66479f86ef78b52e4dac448d969af5fb913722c2941b1c36a6e056213e2be3cab72cf672ef56952a0cf9fa16913cef4a9b977b244cd222b528e42d1d923fce348c452cf8e831fc59642920b0da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (423, '{"ob": ["15151515f6eede74892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4a477c044f8e42e5cea86eea96491f90936f3a471b2fcd72112a42d35b9009733fdeffc6d0c12e244e33260c1e366a27aee048b41a04bf785aee2cf5694872d09ffef139e4055a9b528a14a8a25bce9feff52378f9ba920f81412e4a081952c391277335f5d92b345f75750eb18856306aaab07fa2b3ffda687d27efc2072c77f94993f0e1a81c823862f44a9524ae275d6c31331a6443e8bdb385542ab6587b45c1b012599e77ece4cb318ffb30d09785f7ed3ad077dc96f2138e99f46ece2136831ba7c096e02f45ea72468207d6fada498fd76e377f41db192f8763281609be859f03f5b9ded7c6acfbf7398e8ddc57984330ad6f81e0e373d83fac57c724748b5b1788a90d76f21220a0e5ec3ca9ec49465d44c709e5add55c25546baa55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (424, '{"ob": ["15151515f6eedeb5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc5ce18f1a8f8bab8e268019ad92643de2edc594d9b2e7e4073a1319f3212f1b1e6eef8c70e6a8fdb681545cf6e1376c53a4e2fedb21490b16638938ea3b576a138ded5609f01f36bad4e880a3235ebf2738a3bd5bb38b44f9f2743cf10bf0f770a53e53b7d9934590b59c680b9e09321bb40790cabda9a95e64b16631f9913d202f9ad1b3a7c867a2fb84441cfd31d8af3ad4e3cb6b269a7ec8a8adfdb12220b325b9691ae65b85b37388b5c3828e961bd487f2b8a7925505676a449f65d398effcf5016e78c2407d4e05260e81c22f2aafe1ca7a0d36c547f078125bec97dc66afa9cb4d6a06abd4fdd2e49f9baadbc2fbbbdd8cb6f460c8268380b23d89eafa3f0648beb8a80531d7cf00e624ae714c9701e6e37b09672e975fc678db3820b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (425, '{"ob": ["15151515f6eede3a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8e4c5ad361fc239bf86aaf31fa3e8c781db547db9aff7044fd9f3d18437745c5d2f61cc1a28f97ef25e222aa1b46c1df64419df2e9e3217c91b2eb5ba2aa9377b2034631761ff082f60d9dc86d72150ed83c509a9a4bead39b5adcd578dccfdbe46dc96af98c30344017ad5a171c0e0f30dda06643a7b8ae1146b6836a0b35abaf91afa686a85c3c482564c60832b5646e134c6cdf71cc57cb609c41b5d60b801ae136cff0ffd4c7bb02364c9e35060f8367ce39947525c32088d5f08fc381db4e7123b9793a61556d5d3a9096b0527ce1294a5f12083be8a7bbdd006960bf40b5e1c8b06d2ea5282cbeb3b28f11432838fae5eeafc198f71b555446e16c9f8b08fd33b1800337a84827a4ae0bb37d39f530a3507e963c4891f50142d2717940"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (426, '{"ob": ["15151515f6eede25892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceb7507ef592418fb04504e26f7aa4d9b418868a60b544fe6e6041a7a59674901189bda754b794a8f5ace0f34457f5f667b995bc90e40a32637fc8520804df68dd5011d53de216cf9e85466e08da1d98bd1495d69dedafb89e2075b271707cf162185bfc0cca8284250f2060e9dfb35ef8f9a106337699e86efadddc2c67000111c3a69c151a1a8e26e2b8dd3143baefc206bafa36fe39b2cc1d06b29570e4dc818b62a9bcec45c6383d8a7012cb706f9bab7bf55f28fcfcc7e32ffd47de7de158e5910a8b86c10e313eea72759b0705d5cf61b0cb61f3226b85ee6bc11e4b8e7e67a14016c92f886b4644016abbd040919dd53c68150510336adee7e476ee0048a540e0067781314d516d1f14f8d5a3e6fd707d04a9af3224401d80fb13f3771"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (427, '{"ob": ["15151515f6eede44892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c13efa923d135de6e5fc7c42b39f3c2aa883f0fd36adf007900186e25b2576c17be07d9ea5bcd2c59acac667f73788908166540c1fb5671513ae013afc84436a40c3026429486fe0b3d827a6a0b9601c4652c16e53f4c51029e099b023e9c4d1b5940a414108985db482cae495f94837d98759da791ad2cfa0cc0c1062f6f3f38c6cb973eb81a89a6c9251d76c7eb876559d082920b8758af418c839254e11d8cbaa63c0d7dfeeaf62a2860c730218cf66b8827d5e3520f95f201454bfc0dca5fa3dfb486f9f6565f6a144a40e32b123d9e477d20d6bbd7ba438340783d31d62768fa797ce0b9dc28c344b01598fc89e3363f4c794d44a003e0b00bbc33b97807a9d19e9641e608028a36efa6f1347895bd5f5ed83299233b2cb38129bef0ce6a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (428, '{"ob": ["15151515f6eede3c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c401d63b07a9bcd4833720b15b5255a5c741ed16036fc54890028b099876ee456d9988d50ef120bce3284ba2812f9e4fe50dff30f5a84460e8accaca57a6e6d582a0a53628011eff3ca145ecc28257924c5fa059d1d467729bab3640bd2a5b9e69b93afd554e147760619c55a6a8a1c20b6083ae1de137271aecd2b5f5f1b4cc02e27d229293cba4aa573137bcfe1c16f4e11ce1f35462c5a4763f800382e4076f284b3dd93a0e815a60559415455da349f8503273a8b67069947127836558f3f8ff62a06a2ce0644c5214e2121d324781cf47f1ef709a432f1c24a56d2d5ee6a381ddc53b21ba2c176624b3de564c50727d907e8a8c478e45a0f7dc70b2c8704f5fae4159a5b714df3cd383e1177624689546f33a79b845568dbdf4ab33e43d7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (429, '{"ob": ["15151515f6eedefa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca6297233f36ef507f8254e915b4f7464a6405cf71b7f0626d1ac4e356ccab22e3cc92ea785eaa2713a007a114a05acb24fc29e0e5f453d10e62fe7d5802755f27c42b2e80184ecd15ed29d39d14ec9a48e0be0fb042465b57fb803a1af3637b00eff058e7c3957d9e0c86d7408d6ae66c662648147623d1ea1e4d3eb414c8a93cf97c9f93448785a57b0b6cb80f3f107d6fa3ac3ef3b24ca556e32c54b2215fdcd36dacb33da52c64e20414d4305160c8135f1a7557736d73ff75ae6edbd64182f710250330ad1378a9fae3a551e4d2c660f0d889238cccdc8c53a14f5a81b195374035309ac0eed3417eb1e3b0edd20b0bb73458d53fdcad78d0285a5f816fbb36e3545c7c30cd651595721d734b9a24015b447c9eaffd6d34d692431300bf7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (430, '{"ob": ["15151515f6eedeb2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2ee2e30e61248155abed7ebdab59546a5419388ecbe47b010a6c3049c22a03f0ae1695d75163b98f85c3824e40b3f21e87c9c2ed5aa7329bd1c4a4c508bd5fb91a955d8b1ca685e7b57f1a4af0ca204a9e97cbfeaeac85b36db74a3c682817b0285bedb5beefbe6864a778c254f5a6893ed38b32948200dae2739f5226d96db033617363a7b58df8866424d12553e45ea1f127e621c33e264e4314810e1ba8e69716466d41061cbd4925b5ee2a23f90029a5a42e1018c10c6ead8d9b1140fe54cf2f866174599bc98408e2b28ff75fd9ccccb21e371dfa7732fb016e71bced263b3c0a380e593c3c967b71cc526abb291f1cda5ca2aa62d818d0f2a32bf011d9f5e196da66e49522d3ffc794558d42c7e3e19d356c6e0952a68fe8b7353756c7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (431, '{"ob": ["15151515f6eedee5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3592c435fd91499163ece00997a075c1aa454f8197d4e4ba807c0de3f292c3df61bff1db6596dbfdd56834dd9502a3a75780a49b62215ab173c9515ef95bbebfc9cbf31c1b80fedef78600f68a3898125f4e7e38263b6979dddd267004bfede300650d2b8d8e9a72e694e80fc33f1ae7633205d8595f65b975bd012fed9d03b168e1842ee176f43764c5fc37b7ed5c715e93a67b60bea7376475403ee153c113ed01618dde333ef4fe7c224014b494ad87aaab5dd6185c049c56e0d4f610d736bea71ec25cc21bc15aa47ca00a5798064c7c006f137ef85a9e5d30109c6dc4f7767864dfdb61b423f2ed8528f005f658dde73f93440d30007d91584db19cfcf8977c1364b1858afb0ccc5d00cceb545f2db77496f4e53d029877e7f513e9b142"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (432, '{"ob": ["15151515f6eede9e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca28f8d2c8bed510235a396d70c4dac45b624985b571bd5d0a728b0292febe97c41e10ba1fd608979c74960d268b1c6241c97ca33cd96d4a2fd4c3a338fd94910b9041e17a6b14cdd8ebe9ce3d93bf264c1d6485e532b133c00fd57efaed74f20b696ba0fd939f0c7718468e2ae882b96c3e741a20e45fbb488799a31ed363c0ceaaae447a7a1fd07162f997bc84c705a26323f4c7075b00d002c6e5b21bbe7c52cdc3f4355d67ee4c0241ec98df49930186280871e3e980d0c4ad497cc34b168051fc8313028e811177a164d246da2d98540423e071e163d4ac290d100adc4c5157c95ed115503f927ea96e911afd225ea3f99a0baac8479b24baa79f0e3e40ca739b09cf6fddd71a1740046d6dafc28bb79551f8dd8487c817c3d4216220ac1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (433, '{"ob": ["15151515f6eedeeb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8cc6d74141e92dd5fb88a0135c5a935871dfcd667f1e921dae1acfe0d99e64abbe4b2d257066cee5ecf63daa947ceda54bb42c566977f3ac4f539142fad63dfc59be6cb2b6cc720d4c45c4f510dbaa7fce6e94ea24b311c4e712aeb097b4b56f3343cdb81b8aee5d1b525228be652c276e4da5b42ad6ba7fb3dfa519de379e21bc3c3d3949cc62d6ac4cf20615d7c68a7e63b6e43c12a1963a96eeacd209b9c1fbabd8a36acfd9ed97f42724c5db49dba5616879913af1bb9d1823e646b2609b93700af4f51d9865608a418cd30dc4293cae1e4dc97ea416ec79d0b17ac24500f9981711471f44e5b0116a35b67b6e997b79eb3dcadde5c56dd3648c0e7b2b85f92ef076ace3020eba76c7f3fc22f18d77218d58a787fdd93cf2d86e2ca0ad99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (434, '{"ob": ["15151515f6eedef3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c471cb7401ab3b76f361cdc166ee46e5174e8ef0f3e5752977550849bd9b0fedc63cd88e05a8e6160d7cef75a23401bc59491d115bfcc6a6d7a4edd62262e54439772fc1a5038793aacb96e931faebec6b334414e8dd73232e3cd57ffae7c5a399747b17f979da6e6caa7784265913f4bd1ee37fc7769ba52218501a42e675b5cf71330d0480e0fa9774ca0722c694195adbf5976b34ab49e85ed0413c34cb11754c7aa62c83219d07c6e6f7b3ad7d87da54d2e167473ee79fd3449b56ba37d9956700bcdf5e2b9c9856442b25c8355d61ed026be3b861b99ed95e7b0b7618855deccd3bf9d40a153efce3907fde75bbd2f4add393de82e557b5bdb9b2654b4cbd83b6961fbf26ee4ab10657ea5870fcbda278a9ffc6686d18e804b260c72a366"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (435, '{"ob": ["15151515f6eede01892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9b311822e3da7fc872f86b79a09dcbc6be382f8c057af371740cab052936f6de09ce3a017ed9abb5729624766571523e9ee39c0e588248eef168ad088bf1008c0df27559be0ff4e92599d8a1acfcc35605a1bd20a81c27ec56bb2771d425cedf4131ac8af137afd9d717934eebb537cbab7a0fb57611e3eaa082f673c5768f3d656d57ad2936e1216d9c3703ef113d81ee8cb30a248cf41359e331d25dbfa9633a1811625dbb9eb200dd90bb3f34411b8d4581999190b951eec5472fdbdf8d6e15ac4f6c880305f8d8b9e4d67e22a37a5a753c178b7eac24679f978b04b5a3403a13b189e4183944fcb68e3053b0e8718e945518909eed51c3764a7211d4ef64e0e2184d720f7e36194e174202d7a141728d81d1082177e32dbda6b6666e7b81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (436, '{"ob": ["15151515f6eedeb0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb89801e085650831abbb2ca30535e59522ad758255a4b74bd7a2375e78b3fca9acbb171dde99809d858df5a3500c8eb96f9573af59ef5b2153f8faeb51d45f7ca147ab0b38b3d27f53916d709325e60b28a07b56d967c9a9aecbbbd377c9539e684d02fd54a1ba8e80f4915e31383028733d31b7ead386b47aba6a13f9b06ef2928c6cfa254b242db81d6628721190667980f6d2abb3f785073e281d7676bc46cc6b1d21e865e404a2611935ea078a80ca853a7692fa1b17a465b06519e3779e9687fc2a7afb2dea95fb752ab59d435b54a6aef264d12d6d582e7eb68abfadd028c00b9c29615aee3d8d6d8e5d01e53289ac0df910eecee95c3b0aee58934bd0bbfa9fc4a9e248ce19fa4613e525be939b1ca3aabb8798dc18650a9c4e7e225a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (437, '{"ob": ["15151515f6eede6e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c56af77a62ff41fce29cc3c26493d32787083b95d9bdf45eefe148c698c713a35f18ffdd4df5bd8d5b463e6a2a27ed12df6722090dab8de017cbce11282cede23c9945b378f58d7db3ede33a041073a3c4831550f0396eab7e60821605b0f5e039d3a6cfd947d5540fc220ab73ea9e718f5f12c5e6a7859e356a7b59656a2ad49e228623922120e7ee6519f6ad1b0cb0a8c898b3c2e102f9abebf44ce00212f1f879353014a3fe1a8dea38f12d5013b976a58a69824979ea1e54b0046dd86970d1e51515277a364aa49d7bd19259646ddab1db2026b8b7b4df04705b465a0db0055e4e160cc176ac7ade5243d849e9bc7d0c900b57993c10fe6a03056e70ea4beee9706ad52dd7392c799076ea66e00a7ef0dd86fdc4f3a2e7df699cc98233117"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (438, '{"ob": ["15151515f6eedee3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9696353a417e6f3420f5345b3cd6c3deb5baf70886c5674461da7e8290834da908f0eaa5995e991197ea714a2d413ceeacd725574d3aaea665b7cb925bb2cb8cb49ac5c9c86b5657f8bd2d0c738e2243be76bdfd414278c9e1c29d4964677d6a1ebca47d6041faf1af65778edc60e94ca3da74de7286b1d72a83d4ccbce8dbbf9725ee4cff5b8657c412819367a6381811757511ffc6173a05837cf80607eaf760932ae6e7c5d1e527c33b970ad9d771ae70edeaf7865ae7e9159d2f6d0f6f7852ef3bc3b137ece66c0f4494d1acc87b0dbcbaf95ecae528abbb7954f0c6749055713b11038a7dcd6c5d681ca26e875a76633fd688292c9e2f720070f3c0396347dc49f657716761d0b2ee594c6a71d106a74b15a8e343f5ff4c8d1a6bc38e4d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (439, '{"ob": ["15151515f6eede68892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2755f4b5777d21a8182fd9596f57f47c7a277400de19c691436d88c5e22a29235d54eb839e78c2e46d38860bf74286b63a07c0198501e040f8f8b5546e4d920f7e7d0f9b9bbb0e4b274f3d82a8af5152cb2e82945150e23300937ea0dbffc8f0ab599e9afacce23cb95d80190d8cf634fb45fbf07f1d70aa9d6927bbf058aee8f4f071abca1ee7a7b4fafbce606d953bc02d9c2245ec53d55f6fc33a96c8e7759cad16115696b84cf08286e8ed1a84765466400bb9baebde464b218e74ef4a2b093c0e9d32f470e21dc360c1a2c9d4fe1cada5dfdadf2bbabe8d988272a9b028dddafd7c284c92f2f4508eb6b42473fb7cb5b032c52bf14ec59ac94b336a79aab074cf05d446ca04183381fa2920a457ef7e5d512c4f5ede4d9dcc9681bcb5ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (440, '{"ob": ["15151515f6eede02892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c745a1a4da7312f90a06398b1864bdbea74cfd30f2cd4a7046bae97558af235b378776220653f400734cdb4d0d9bc6d178300cbcbf2b63294801544c1fc46f96afde71477a9548b512e83d48954478cae0cc3f8db3833ddbc2e91cd23fe6750e965698b8ab956dbb172fa0889c34310ec29e27ece414f3ac708f2786c4660402a73c6cabf376464d922542b4948796a2c63bb3ee9492696f416dbefc86c4195408a749c1be95680ad38e729f70d115e0f2abc7f974f8954c3b20e76c550d951ff4065eac4d9ca8119ba9ada3e7eaf043091c6df29c58d3b06ad324424ff7910fb2c36cfd5d1791d07eaeafa2c3ddbee654f624f88db9e5e89f2c922bbf741677fd14dac6ad62b91b7598783a0511893d105b6716da10d98bfafc5ab2365e4e39c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (441, '{"ob": ["15151515f6eeded4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c98486a2619d27db6315b523307012151d25880811d2220089a990adc6d2fbd8fb87d33e1477032efaa05f98b1041e7fffef3e821f34dadd6c26979fbbdc6e5741f120d537139c62ee6c4704abdb13859f2649afb6c2533fba81f53a19c26ed75e83c64b15f72d165cfc98d3cf79e5a85841366698a867f351ee75717ea1d3fff117c63f059a8f835ae7ded546f86d33e1ac34f185f4c1f0ae7e820d2b497059c54e9ded3172dca78d1211e36f19fad11eb41aded62c05828e10f9698060edd4a7b595554c548c69400634fb3ca0256a06a71652b0605485ef994686653f2df967589a7d2e83103125011095cf94d289cf2fed2882af0c584cf8b88f50b388463011807fe4d94ad843b5f5d9913c743caf3705a621cbf81cd3c8ad65783b05418"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (442, '{"ob": ["15151515f6eede1b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8c42c3dc1b0ff1af4c1d95b17c674344f931cee8dc89fdb08570089dc9505d3e5fece9960f0c46893ba42eaaaa6786dfca61476d45f0f7b57a2c57eecb71fb4a71f99e6e7ef3a14b3cfa8307b8ebf0dc5d1eac06af3e86988183032cda3aea61a36d0d647eb9740824f1a056e938e5aabc658c471c7540610660745790535dc8aabdb69c67e3eca7cfc4b4e43d3da455f207022ba80f11f7ce93cb8138f52b02d45232b2a408427c6ca548631a8107f113c980418ba957c756afd000c027379e8d3913587fddaf7acc9fd98c69cf7cdbc4d5ead99bf4e4289885f3549214c5025dab5b378ebec13733b032a1c874eb3f6d6071b136b81a1b789956ad3383b82439634bcbd6570d5a58efc5293b32a7f714cabb399c48d85c568003755e4156da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (443, '{"ob": ["15151515f6eede45892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf24e53267752ec0a1fcc2724b57b3192b82b3e69ddb7a5cac4c9784ffec7acc97c04626105d9c8ab243707b0f4832067e5b8266831701f84a47871587758aa019922600b6c453f222f29d7e2146c5352f9f54aef7b0a4307ac4ed3270a75144c89671a1c49f1de4a0d491ae0b8e4177e0a0915dcca48618123fe13c7e0b64a01ffd2b2b6490c66b168eb852721beb572c0762ed7fa5bbaaa0241f6206e8a502f8c0a95b063bd6c36e2bf26ad150533ea3edaab981bee64a629af6024e2b82ff09844ab48f36653e4571e8506e7fd2cfdb451b0ab19e2cad6865c30462dada98875d0130894ca61d383c28bac93a6e075e59f88520fef6cd47adbe47fc5eafa263218a2fe9ca5f7e5743d88fcba49ed30d032ec1d2cd583679c2057f94b849469"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (444, '{"ob": ["15151515f6eede53892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c99561b52fa8432f94efd46876a47812f0d0c887310589d2baba455c07b870d692c9012930ab6f77639bfd1987f56445c1dced9e6912bcc3592832a7a4fa2839e4e29ab866d99c725f6ce15a094a21949025645fc0514ce3d759f1958381a3bbb142e3062cc2fe047a270636deefeaf493eebe7812632d0763f3b5ff0f795a7af6e6fe3f315a6a2a3fbc90da4e67b8b4959e7931b6323590474d242b2883608c6a149ecd332374c9fb8652d5e6d661c76f322cb8d60646d302e155fc14bfe8be5ba53cc9ba1b297419995af043ac7218c1887092c22877c3b9b1f852996b5f7ddf2286f138126a8b59ab04df0f1c32a7577849f6e3b964b47fc959e7aaa630bde78cf64595044c0225d5e2618475b2b8b5aabcb4fd676a89ec391a87e2e9ab2c5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (445, '{"ob": ["15151515f6eedebf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c221711be1af74e59082d6673e78d50821a5d59637c7301e0f13162c65b299510c729432b57aa3375d7e02040df65ecf9208fd455bc8ef9db9895a82cc368be87874873e80c2c90feb61a647c11732a3b6c89ec8e753ffd2c33e8daee2a5ffb285609cf38015ca00c1a594c7820047624a7dccf019ee8855ed1ef62fefd6adb18763f625d1c75ddf6f03cd6d185ae9f914a77b3e4219a148cf2301f5870fd66d4f961c4f7dc52e5bcfa88892ffda52c23176aef84f0b73e767c4c548c3cf0bd5a02e57ae165b9c3c27ca12e669da97d23d4fa3ecd9833b117270f36684e3fa4038969e2dbd78fc2ae374085513fb4a48cba2c72382d0cd3114b850d38745309973eba224ad519da667df8dac5012fbde4ffc7b6938a3d8ac4227f430bdc607e8e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (446, '{"ob": ["15151515f6eede69892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9e0f8a9a82ac3d797cf60fbd98642a8da98baeefb37941d287e1b1ec52884b5a56391332a26b1df4d2f499ec1406217cf5a753fc76d653d3cd20460d8272689c077a8ca1a05c597fc182653424ed89320d2da6683f9a3a296ca9c08caa2781b6116c2c76c29f1600ed6c070e7a9b43217d4c71d7a1f0c88cd4ddc7b56a1157f7beead2c0aa07af786bde65141dd2158826062703ad164f28b03614e5e7296dd8091052d6b3f2e7879e5b1acadda446dd684b1955b0ca14199d2480859c356681941ea35cd480b9b4919482c06e960b27c26920fbde4601e0a84078bfe4b2dd8a0f0d6a8875cb31a181b03d54f7e32903cdcaffd97fb9b9cc897c9138679da4971fdb8ec2ca239afea2e03d3257fa45c7ca770caa8441a30e2b89ce1b5dd322f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (447, '{"ob": ["15151515f6eede89892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c71a3f859a1e623c640134f079e21026344225cd5e8044fcba9007fd38b8dc5ad54b96ba00e1e362aa39e1e24be754e2fc387aee22b2e97eda4a4a87e0d81c48aaee061a742a14660289b578107f7af3dee00c95caa5016a48c653b437d3b07bee8913b1489dcb23eea67bc99dce2a0fbef8d93b9ce2446adcb8abddd2caddf89972a6f0d00fea0d573fbfe59926e4aad01b59ed2d79cf94c8c69640997b25aac1bf03eda5fd1f169769b6dd4ac25c83cd574d8e24fb408b8ceaa252a9b5c5c8fe6282e35caadde794571515a388cce2873f138ef6fea795242fc6b3b17a64826482571aacc71c867091c43648ad196d0ec1f4ab3508d1fa786991f5d8ab3cc4df9cbff9a451c449165b56b5757f82bb0c680bc52d446b270a666334077d70a15"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (448, '{"ob": ["15151515f6eedeb1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5de53ba799cb89c740d79a8981f1c87a122a70235808475208948f1bb645c318a27c3fcb01623ee1930ef3ac7c22b2bfd0039dfa747be51576454b81db5fe5e5561306f06577fcaf47e9c72026988e8a80c597771be2f3e44cb2be694f260353ab67b3cc65e87cab6ddea63f4eefe80bca72a71cf655aa02d692cc8478efa71a401c9a922cc8ebf8ecc41434ee436886d00097a6376c2080d77fc52b74cfeaed8f43860471726667440385af42ff631ca2d1fe38ec4d1fdb3d51003a95599dc8b287cf29cdc793254e75b072042f0dd34d885fa2a6bb63a73b83b53b6fdf088f231850ad3c41d731fce7d51cbab643cadd2699463f544a622d8341d46b2c011ea9337d77818ae4b632035f11fe2a18458eb882fd70319a28b9cd95ecddacc931"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (449, '{"ob": ["15151515f6eede9a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd846c5c871d8cb8439f4e67e210f5dc23e675ea28721e71d2b1da7bdd8891c3f09d36019fe2ef7ad502440aa01d9dafbdeb41bbc6d8d9035d3432eda1ec9790f1dbf87401b2d7850ca2b22ff67d46df5b4033e4b037d7fb2e31f715d9aff67f8402e12c4f6873a97169f492a7cb6da781888c14310276bd05abefaa8b7a9cb1d83c62c92727cd0d63b7d65213962fc4e1fc868700598cd2347298eaa99d1675055773e988fd592cdc5590b10a4c8e95fb41c1953b30715d16b021d3e51474a1c25dbf23e25f8da7688fc70752518c97335f31f3e5674a8bb46fca1f9687b06da8d3c8a150ea82a099e81fa5b3ca8ec583b2ea1c9904b813519223bf88d7e6050604ad7c8a8ea7d321e881c98e2a45c29c3d2b401fe97dca747312a2599bee71e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (450, '{"ob": ["15151515f6eedee0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c51ecf1980e9ca395b7e08b00afab1dc6b07ae87cbb7fca43712c010214e2565b59b99a2f5f6f38d86d248bda793d2fac933db7a37755fee8a9fd9023860c29f5e4ab2b1d466e5fb7b8b82a255ca0f5a480432ca6faa828dc042cae4d88e91836f86b0c21fdb9732274361136bad5504bb24d1f2fcc456d77518175beeba8dc7ad7ddba40f79cad1cc702e7c2a6100a158f9ceaf250f647e97189d7b949d39fc6cffa152b8ee6d2f89c7691fc2e3c71a86b6b70c6684f15fff193276d633a8354a09564466520181ed2d3a199ffeaf21a1d2740823f017adb8944d9b0133d78b00d23abbc7919d847f120e1973e87a3ecea610ac1267b78e0b99f70530ed1bdc922f965c0eb54db76df164f845b947e1b25fb208523c8e93fb9f8d8bf1117d4b2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (451, '{"ob": ["15151515f6eede09892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c12429f6d076cbb95cc581501101dfc0be8b11dee300c8ae29b2049aa7be74719027cb8375d16efb6b841c489d8e210ae6e0fc2102d01fa7a4a2f95191407467c38c964925b053b0325ff9b4e51f49bc38ba1966c734fcbf224415a6082362fac756de93f18c44ec3050a00fbbce7f7794257e44f9c8bba13af5faa4c2e46e1e631aa3b921513656741782d32a93faa3c76da628da8feedd836d7a78d0ac0bb3fd52aee8c1ae72744b0789e66c57020352be44213e15690a81886bf4f5185ead74ea82a1d7ffae4db99f05096f23e0ea97847098869627a12fd0bfaf0abf0754f2852e32a9a2c214fb8a203d430d0cf058d19627ff0dc0edb5d33115f7fccff19cd83e9f09a1a5bc17346317d26c239ae1bbf60e63068bf56ad89400edfe0fd78"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (452, '{"ob": ["15151515f6eede4f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb5f4d11baab83b5115d54e4a7dec7301b39177c97394be3cf91e58d134cb32bdeca3e9eae4f8a4cd7954070dce986587c2d2934d890dc8b058f44257c27b77c209116f0a772afbd3740de02a2cd2629f53b85e2d5f437a1e26e97f46d3bd57d44d01bc42c4fe36a1508a9134b00608908836902d12c86d3afd7b0653dbbe7eb31904f6929488be2665b610ede9d403c042d7fb97e6734162e52348ae14351b7bde0a13d84f4cbaaa3d9e068a80797c6f63b75096bb841ef1b18711cb343920e1cb60e650be5f95f2214d7021084b0cb7d2b531312f377bcf4039248761608323e4e3a60254e648d67e207c68b2ee71d5c779070c46c6d78dcf4d5d49495dacfcfbde9d467e1d44ea53ac07afb1dd104803c4c011a7eb181fa154417e628906a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (453, '{"ob": ["15151515f6eede19892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cba5b5bc8a6a25c7a93ff47912137109d18d3fe41eff3ca4ea5a80df11d5edfb11541a59348907f575a6e94cebdca2e06ff2f2aa0318431afd4e88da6fa04416fd3aff6781a98b2fd853a74f96e0f54888ae85922b4056b7f74933d76b98db613ddf24a683004c1373bab0b5ab973bdb56a7dbe170690b67ba5b8e5a669d3b5ee615a3d63e8c31d313366dccb999102768c48c54d737a3c151056c6aa46f96cab1ba533916b9ec81c989cf256f498e58ba0feb5dabed83f32174975529f29ba62572098c38230dec356e68dfdb3b8c1639576bcc22ff98459dbedce4e621a6762135a24fa30a2f893089d4d0f35f56decd936b4dacd659049fa9e41c4c5ed96dad55141b76a05e1bb507c53b8e9b3e2b315bb4683ee5e6d3cba677d3fdd39d23f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (454, '{"ob": ["15151515f6eedecc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb022cf36110a17e339d8638d8cff32d1966681ce3b677a493f2b379776b8e8c528192c65bb01fda0bb80b96ada8eca82152fd2fb027258b0fa3de708f2f88c9e40b2576e5a253cc8dc3cca5434cdac3c28a83806341f94c82b11c2b5ce6dcde910914785798db4f38960bdeb577db76bee68ff17bb5f85218abcbf88d8366933083df99f2990346d802836e9aeb26e972f2fdcaea2d5de8f8d4f5299c903631fa65896441c664d108cca303fd22682c8dfec73303341e04a5139fceb0d548a6f474bf1d2ed0a7b699b34a35b7a912dd492e4353a60b141cd2c7fa7ea9d9c296c79ab2b94de2c472bc74b28e5af69e9e1c283ef07c3335c8594fb5934df3439c8afaf76a906a86df7d27028122ab7b1813bc2fbaf8d3c7c33609cb8da9c87cdbc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (455, '{"ob": ["15151515f6eede90892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce1d147e28c026c299ec46a7b55741644658a346fd3491273a62205dde565a127a372360030ea19f9ff6e2ba5e8aadcc985769e30b48e64d812344ba0ce6d18efe7880113071093f441d02b0c5c141af41e63e4a14ce0a171c478fd00d605a4da8fb793e22e429daa775dfdf6ec2c302d7cbc32016ebad655119016e2f82ea0c9854d27bc7f58b0fa724cf4f9ece92b437f222da0088b1516826ef134de54ef9a89163c2c4efe2949b8c0b013b93b53b26eb379e377495069636c71e356965950565034b5623898bf5b0cfaa1e4bc39b5a1af32254875fd9bbffeb274174cb7b41aa16a83cc57d1db7f61ce5a51ca4b37087d219241f6b4426fd7eda4f55590b09c61ac118fb14ed7f1dcb86ae593a6ab4e9283599fe597682960b2eb4ed7486d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (456, '{"ob": ["15151515f6eedef4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9728618d0f6db596974af95fba0ea2492b3a555e4678e2711fed2b9351e39100b4e0e87bd154c29dc34e5b8eb40b20e99fd612a28d9d51669ad7ee370aa7aaaeb12ea68f8cad7435e12481b8c301637893ed1e63550aee04f57cb69693e76eccbbebf53a27c8cd9e871f807f1d43b20f5cc18e655ae7ee509a20c80e9844bfa71f5d8e0bf82f7f5891d3b5521d9eb99637daeb9bc17f622ad095f95af4a68b765387646f7e29132d35d74b9ffff2251ed38321ea8489fe73cf49d961f04535c6a3fd0694849c9ecb11821d13f1a408c1909d76e777be24dc3b2d440b27fa720f92ad0f7d8c11d2858c5ce2f19b0b5d616dbdd94640927a16832edcc2b0e506004c646c39423a79ec3057e38bd7b1be4247b4c157615e1559b506683f577d770b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (457, '{"ob": ["15151515f6eede6a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1d20cbdf0ac9aa80ed999bb98eb0fe3ee4077f1c1939c9e5c08ca171fc7076c5b272486f1bff5aaa6a2ddc868275970f3e060f4dabf8e41222ac1d598a46a1497e130ae6ce923a16fe81960358d037df5a0927366cb3771ce776c1471efe8a1396c9ac4d2d2c6cefbed4d075e5df980c3e6870aaeedc69084efd39cfb4e3f7cd9527af930a5b2343ecc825d2781a226d33e59c0b5d5835ab4909dd3dac6a6c811120f1cdc14299921fd06d70373dcc87d9f7ae4a5aba03c14d148b9364c3fc67f677a5eb30cf75255b51d29cfa0b0389a17bb0c4091bddfc748bf80602cba39e6d5ef2bd5d41126a6a63b1a71af670ee304b958765063c64cf148fd6ef7b0540a6be0129dadc44dcb785a560a6e6b06713255a2120ab9b986eaf42fec0559b41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (458, '{"ob": ["15151515f6eedead892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cebfa924003eae4b857948bd66a1884297089744e8f4795e8805e05d6b22d35206c5d201bd6b7584672a057b5bf652553c86734ce16ed1ae9c2fbc48619cf550a6d8daa08c815cfdfc1181c9daffaf5d490d8602fad07c63e941b554d2c47658dbb5450e28c01b89e2663650a59cad830be67bfb37b88b081780620f89eece9e0f48513845165608fd56c7e7159416ba71cb4f6c7334bf419170b8ca3fe6fc13efd05b237ab5f0fb15c925b38692b992b27a7d6dfed9a038b93422aba321cc84cd6674192499a0b5fea0576e48ec4247b704916090e23e26521922202d42e7bc76bd739a3f89c60968cef017d5c2f8144a45ac53ea528a9ada1e5a97c1db1792455fcf923912a2e5ac1c48a576083cf2ee2a8dae01f0ae1b6294eede85860eb08"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (459, '{"ob": ["15151515f6eeded5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceec2dba1152ac7384097ffe827bc90fbd187fec9cac86c2b674b365efb25cb6dd51d71a37798a78f5f2f9bdda91cbdcb7bd48fa25f46f31e2ec31e1a0d02a6effbc1ab8e3604de499cb84c7675a0c80968906a58aabff244fefe1d844cbd85ae9cea3aba76cbcd416ade8afb4c060791bc907657be2362c0ca418627aa2817d4d9547c69f7375cc3a9dfdafaa76b1ffe6fbdbe0969783dd7894eba046cbf419e98fab0fbd1cbc0ee7cf13b704377177b796796b75d1b44d05e72983c2a0b1b3384688d1a79dc046a38465dcc6ca5c47130a744da968602918d9cc02cd224b0075130769bc1553ba86d75941df21d04bff59928cf5549745ae2eac8e1e3dcf87cb7f6d389159de9281c3cb33b3938fdd4056889e50f773399400c374fd080ebbd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (460, '{"ob": ["15151515f6eede06892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c11832a6055974d73d680bf981c7f48d6c5d9e74386cbbe92548b5577ff6e9de17211d8389abe3c107c15aff1848f7b0025ca0eb2486474e6edd717e391b532800bb6d7e8df693fcc53c80a5d653549c27a7b03b023647236baa6259b8c278ea3207f46d17a84bfe73da6dd9b0d04105d79082c579574dbf88fa2add7a133fd56b85918202795d167238f00cc8e0626efe6ad6b580ec5c94514c4efc218e875df3599d45a80c17e8c04e9c59c783ed9f25210c2232fbc5fbfc9ebbf3cb702cea608217d79d0ca5defa3162f0cb5575c0518b4936df62a109c09c51f0418f1ac0348cd209e864b8932d34aa038c2ffdbe341abde730bcc3580ed4eebf3bd5a3254fa73ce6294e3c287be626b972565914041c80a6b3eecc4486700d54b5205f797"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (461, '{"ob": ["15151515f6eede5f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c914b3ce2b38c603c384a546aa7b9c6a4ca1f2232366b1cb48ade083805ec3c8eac7424524d42e29b6509baac9fd47ad3d06087fc5e72f6fdd8b175bef6955a5569a895753bcc016ef0829b51c8e36ea28d973e9550b13c361dc6444860ce2dab8c9bb78f3edb197479c61618ebf6778f623b66885c86b8a19d2ba31e6be25d1beaa2c06f9e92458d4713cf4279a9cca1f096a5b988acfaf54db7529bab8b57c0ba534fe1dd9590de6a3cb92b3cddbf9f32ece29ff80ca641940d3cacad2f802f89b017c1aa616e2c7e2a85f223dd071556c927fa7e22a9312aae4e27d8d0f587940c832e1936f3b3f2f37d0791a9d679805454ea3d5012c6c1dbc1072d3fc140ef7d96c92d024957df2db8d1dff259dde28fd1c0914a8ff2c810d83e611930b7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (462, '{"ob": ["15151515f6eede66892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5edca9f3ff64342852d6d5115fed19e6745786725546f14dc925affea322d4c02e63d60562db62b66029ba710b25b334ef46fead0bd3ee97b3d92b2f13aa6eca66799832b52a27f35b1c1277cb56e30bc231e68c8dacd507c436da29764c452089f607c2eb8e0d6c8d2021ecfde6b8150defaabec6f4e968c090137a3cdf9c78f299b7ded8a04aced028abf3c24acac5484358b81bd331f36c635caed5a398abaae4b21d5e099272ba303de06002d64c7d710196e97ea930ddfd370556414671510063c8c37d6d93e81243cd05a6cf300bb07b131c35e6598d15fc8228681dcf514584aa08fd5e546b56a0ef827733d82dfd37ec0d4f1d1b6d976d72adda71f96d72288720b893493d1aa528f2763ab3d6c17df7b9df48594352263890fbc878"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (463, '{"ob": ["15151515f6eedefe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7ea5211d43afc0eb3485b07cdaacef967d5e71ef5a51e83a8a3e37cae2b26920f9ba50b3a718ca2e887bc346773f59e9050e32a2c12e3fbd5231cadf0fb2fd9c9cd5c33635ef625520c839a16aca16ddafce50b26634c39ec99c9eed2375e13019044c27c242347968e9c711d469ff166bc6521f53e4cd78384dea22fe25d0d0104facc9ddc8bb95385fb3358fc496549b68b7cb4192cdcba98cdea07d2c8784a7ca4f7bcbcf2361db126fd250219ef0f62273656c6c61bb3550baaca15cee288d5818d501dfaf3e627135b58dce22540391369905074c7850da8482aa4d45b685c972fb0c223ef21137cd3666c119374d9d47f79511cd73bd2406a33d1409a46900006661fe7969a7934e389b711b2d29c34af5110080eddee60ddddb595f8b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (464, '{"ob": ["15151515f6eede50892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c06939339093af18c65eea9a0e19840730731b0ce0a580c3aacf28447e82eabc0d4bfb7e8a7daddb071870cda1a820394948c387b5180c71f8603cc6c7065b495b1a6f058204d78ec52c9030688761105f47f55bfd8668c08af29af7ec3d2fb3178fbf29a4a8ae03f7fc43790304ef8cee4dbc70f0f14a42ce4eb9765593320318bf5bb221cf5131b903dcfb42153816975d12277b2c7095e7f78ede51fd0d9ac8dfba902c9e7a1d53945dc812bb7229d89e97724728ee6457fa4568a63866fdc7355d406011090e8517b511bfe4657d8f056f4b6c3ceca874e248f5f8a9405b9d0b815cc1a9441b3ea1c5dc2d3f78013adfbbb6a0803c721047ccbc8a5efb2b42294c6f723d7c72708027a23d6f3eb01811a6539716d7e69867caf6d7e5bd59b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (465, '{"ob": ["15151515f6eede59892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c630458feaaf1c7f4820510d1b6000b9b3f72defb92ee6d179cac4908f5e7230585bb0019ba0acb09117009f465934c12b797ffd685b02fd45265d9092621bc963e5a7ccc6a49163d68f0564ebd2e362cd92e96c6b0aa6efa50ba1312e78aacea2f55a547c1548d0fc91cba41aa56f388e7f9ae2667fa5b9aac6c965f322cc185270479bf52f5621257fbb09ca5022c1eeabde493cfa2cb7950eb0a758915f9d17b024c0f95f06c8e0b85d471a92b29857eaf2211f8fd5ee12553482f218692a05190a0491ea103a5136ebf388c4371401b4b501ef6ce0bb8d7eb5ae55ee6cd05ff7c5616eae982d077199c74ad5b38d9dc27936be79058d949c65d69af57c98b5cf9d80abb87a14283a811bb7abb9e660a67e0db302d6e4ac59ad4d137a4b36c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (466, '{"ob": ["15151515f6eedea1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c88761d474f2ed4e1e41f1b00873d7b2dad2e5ce61aadd1be93327c110bb2c878c3cbeea144961bcd7ef3780ada5b9798848147a15d8b7f79737abd9d9e6af935540d738275766d885731d1106b0aafd5736e7c1dfc5663f22382cfdcb4dfc5dd5fc7b45e351b8d73b264147c408b9b0eb299e831c84f0f31464e3d41ea8b9cc9117a32b758b8f5e1afb3e01857019666fa865c3ef050304d7afaca15129e0ba8ac410136abfe4b3021677c3d68860567f7fdb04621afc109ac9627df85f57a459518b1e1133baf314699c436f3a437d87c2f1c2f31ffc38e6070ecae8909e5a49009faa6605f9fd7314b7088c40409d93a5ff5e19223d5fcca11610410a794a7deedaa39e288b7f20476725aa9ae4a9be8db3545635040419e842a26c59ca02e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (467, '{"ob": ["15151515f6eede03892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca720ebda7920937a0b6c2b767699f7754d8c203abee88870e43df2c27ca5dea3de19dc794901649100be34f04c9d51e4f4ddd6c6c9734c4c9ed80cbe3bd014508df9799e8b01217990315daa06b7918d39f58d9cb7671031940a7eb7f2e40e26be1806e3f22d91f5ec79a3edcd88d070cbf0920821159911092529cc1a75d4b8ccd303612feb6d912e1857c68118fd73e8fdc528cbb71fc714793090a1db28136a1636ece04caf5539dd0c3c0d42a8826c8bb3f2cc439f727e68d671b23c7ccc75cd14c5ebe503c7e138bce4f3691c0e5fe3433d3e576e632a59c753fd3c1dbb6456faa3f916a14953d5b8612d941418203d7e3340bbee716704c610b41b8136f0521f8a803e8bf001977186f5a5c5091cce9f4c0319c9573069adab04c5c050"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (468, '{"ob": ["15151515f6eedef0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca1086d3dcdf338d0bdcbe48c9a1be862cce88bd74dcbb0067423765220c435c1950e728fb2e5701a23552d2b5fc77d11cef15df0b4a903dba1fefb4f2717ee91ce875bb6c6eb20247227c18c5bb8466078718c100398bbd4714cc6034789325e67b90a7834c0f95c34c09402ce81a10ceefad79ac65b15aa6f296393c621ed0db164e7d7470f211d5b306af8206d74c7bf3108fc28a285ec526983b8824fa90a228db1a57fb8294ee88d992a1962eb5fea1bdd16fac3350d4e3d6835ba81123868cc9b788943bd96aa13a3ed73fa5f71ebfc1432a8347b173c531c3fbca0b166d861124c040f2a359429299136d50bfdc077a3266c91fc6c81cb475e9a1ac18ab843ce0c7bc15c7f3bf0eb3cd158d355eaf6c3047aa3b2366f64db1cba431a9a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (469, '{"ob": ["15151515f6eedece892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca51411e9d35a835979f0e5af6ad2b014c1ae000a6c26d443f3e9f66c200251305226f5a00972d7ae2973f11b51b04afa279fdb3db2deb1abaf72011c63c5d44483360cf968bd279c91abdd3dd8170f379491419456ef2cd27327770aaba271c12687f71296f8c94afcc6a9088e9b6b970861ce08d95219636d2522a1583a4863785eef2c5f523bfad115c76482d32a954ffe2788c9fe4e4aa7d566e300094dfb754b29c335329c73386f575862fd80689a201ec494886e720f695d9b2f21401406c0ea88f370aeda290f6294f0c0f85b21e06c710ebabf42cc9d3438687be4a3cf3d8277fde7a558506c6fbdf2f1b4b4e634d9b85651aa1e1426c93733d832ebdaaaa49e8adb73aae1e09f5a34b5a4b93083bcba32c492819d57129a61cb4475"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (470, '{"ob": ["15151515f6eededb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc4cd6da7f4ed8ba81c9d8f8be7080f40dc954f136bd40b0b7012645d9cfa220c93fb9cb7f8b8a4499c21129672413483f0ed7407e2880559ff70a60719f169faf762963d5c4d5d83750b6df6ed60d8a8e700ed7bd3096f4a08d79681923be088227396d3c0b21920af92fedccd99938c71f8b890ed21859776b19253ad5fba730df48ab866677fe492c268ce3cd674fdb6dbf0c1a91f45133a79c5f3b27e489c745ca9005c5c5ab27d179f960d8cc71d5b506ffee39bab0924293dccdec0c340a341781d2781ed04d4ab3f9f5a2fbab4e1e78bd5904fdbd0350619f2cdbcfc9d4241bc7b8812841c0ab73911b89443f14c8e3a5bc5a16a013f3b1b3b7a0c15e5d3c9869c1e3bea5afaac36d053f172ec063d5b0d711f2174d02c577224c04499"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (471, '{"ob": ["15151515f6eedea4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c85c55e24e3e57b460f1a448da5c21080a962ec530aa6681f0ff020c610d4b20362d2764cc8e8f5b066aba3484f739c6237b287a1384a4342e35359e13c3ed8496e1b434c33f10e1bc2611cd0f19942cb28839d58a784439a9ce01f89457c0dd171a566f3510744913f065821a63c745415da5b45dfa093cd1e04cc345915ca9f97f012902c2fe02b918c7cf4577b8400c9312826237211668400b7c8e46408ffaba394d843e3a53ad97355f280fb5fdb6ce0226b817e28b817eb4245be6e01b61a2ab224bd56ab4d439c14594eb046949994b72ac4ad9c625ebe2ac3a02ddc1961fc2e8ae7067d10f11469406394697df14d6fce4523424beb2d7fc4c4bfed0d874f38b17cc44022f73045e3f0bd98b7d8e21bd1624fe393fd411881f74e13dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (472, '{"ob": ["15151515f6eede35892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3e27a8d1de1ecdf988b6c1b5d2d508abfebfbe66491829ad1e864b3f848853682685d2d1744315a72af63b05057450d4a778ce16651a8a71019818bc84d053b750201ebd402566b2598f1a3f36b50d23531f5cefa7e182e8b0be1ac1218e775c162a4860f32dab1501ada40fa335d531fac1d5e4b4acb091c4ca07dff07477579027fd850573a7067615c4baca232c56d48b8cc1930869c0415372b189c400c4a43a94b81174cc84825e068593806bd2cc590581c193137098500d786cc89109554d7a3f224744d9e51bb1e726f1a1ce285f48e688cb0a7feeceac4783b78ea12a28448d9fabab042881c76f092eb3fb2ca8a4f990bde55381853acdfd554619c27880fd58a58e6815db09a2ee17e7660434a9d0884e3ba8bb09aae93fbb1aa0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (473, '{"ob": ["15151515f6eede5a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c09d68584cafa1effc5ef3f46b45fc657dc87cf09c331a985d5612e72c23cda3fcbcbe7fce113a1743bc50d60d7206fcf00a132f343bf123068bf8ee4a031887cc31d04b0b2299bab032dc853c71b569d3aa5639772192d5b926bf81ecae3d365ab0494709357ab6a0ccd48830a036fb97cf60795c1fa5454ec8c97ef2325718510dab3702f435bd5de49480c7c6e3c880716a6ee467a0196a50ba3084bf7029988fe2660225916781f3a6382216b1f1aa6281180d3ae5b7e03ff4a01575f649f0a8a220dc3be7c98a8b464d9af99f7c52947fca7e900619421f54c43b9d3706ad0cc5b49a5306a93f963d8d2dba7f7bfdb9ebc2ac11991c1ef399a668021feba5cdeca92759d5a8b0a899893da1ea1988be3ab6be1aa3dda279d1e68aa9e9497"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (474, '{"ob": ["15151515f6eedecf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c883c9d3b0ed7eccd4ecaa6c54eb0c003aabbaa621aa225f8214387078d74b69593df87d5cbf4ad09304abb688ff69de0ac64cb938249f0d7aa6470ae5c85979ccd3e1c53929c558c768de2a68fd48e9028b04c9aab3f5970cc1c17322a504e54b46d00bf08f485c9e0389b3b389b4ce0e487631fe49d383f77754c76c532cb7c51b2cc75932687ec74f10701c4b9dec5eaae2fe691426f31bd4497762da5ee123cdb8d35f7f40dbc26bbbf83c33d409b5d35c1dc65f10d000d27e2a086613648eda8e053816a375587035926b7c7776187d41b0b1d03a68ad0e7cfd8a034c86109518e7ea80f40dfbe8a091a288cfd1b7d678b56fdd3ebf4419148f1852ef14af6bac2aeb9e4cd04cbcf6c859cc820d3dd24c0e75a670f1c79198343c64d7630"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (475, '{"ob": ["15151515f6eedec8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c81e0b2d1ecfb8c31ba4c91231777171a9e018d2bbaa83d2904b12e5644387bd84c94b2f94b9f1f7f41a9cafb06093d09abe162ed84aba82c972e665b056fe6530ce69d0a2932556427ed3515c592006459df2d9095a22aec720afe0ae3854e1353e9e55a4d39cbaed112d3969f1d68849464f07d58ee763520e46c69ea08d2133857f03e16264fa599921dfef88dfbf260ec1f0e87ed7efdd78e21784a1727a72a1597ab64d1abe3dca1047e0eff2c2d492d7ea0bc593c949f21c9529f2cbc1810f8d02577bb37ac5088da2879393d172b59b4ccaa6b20f832956e594ba0340e0741b697e04e33296af84bd695a20c0caa9a9b4dee4844afecffada73d2113b22b06b46dad06835e92c9d2a86bf82eeb2537e9ba712f9cd9eeefdf115dbf59f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (476, '{"ob": ["15151515f6eede0c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c24d50c2196108efe5528d86a882b614ce26247c9bf7743d68e8b13feca0d10f008b41c76dc8ee97ad4e45638ba398a203b7c5fad71218193b5683df7e6efcf2ccb62b5862d1565fa278584794d5980e1223d11cb2cd5117755db0011398e52ed0ef1b32684ea4896065b396fef10ce3195b3ad79569c725c4e1a9c459a3ff5106a7be5abb52210a316930b33e02a9b9c384bc92828d940b531e6a5a84bd0e67e4a435355a0721f1eae2c1e398f753a4105e5e64de9b7871d1f856d27f9364cd4777dd662a468cac6d987492cd7e993ae1784f9e5dabd5465afe8b33a475313297a6b932d08103d770772ff7d4fe5089c2c54c14832be0f76a9591a22f40160a93ea982203e76f2b4bc66d6c44052be934df3386059db33d11187a7e80505ec5c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (477, '{"ob": ["15151515f6eede49892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5ed57603956c5b69b51ee3e427ccee58a3ea7344543511950e2e7928fa8576dbf2e7f7d63490197e085bf1682aa95e7fa311f18d7bf9e7e3f05265cb547d196b1652588a6422f10c6e3bdca82e84d9b1f384d407ebbc5b40ef560a0facf12ddd19260f63ada29841ffa8c0bcc256848bc0618c989c4f5d5787bfdc1e652377c69ac85bb15fd466f4673f17f6d5428a380d001e79335fc5610ae1fc3801a4efa73789874de43e40f44ba75bea7693c25c074306273862a1ff3067d430bc36b2fccc5426d1be25a648b3c3e43fd27e384f43d12e26314c4ffe03e2bf8b88e730f19a0a79276986c9137f52b43022b11db4e7f5dda5d9e2eb38a120d429fe1aaea2be4e66025422762cbf365a50b74616215f65998f13c9160a708f1e31b38f5e14"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (478, '{"ob": ["15151515f6eedeff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7204fd7f723fcf45deda53ba45e78aee6473654d959181da90bf69486bfc95535c950ddd3c72d577eed49c26579a009711ebfab0a870446af7de745255ad726e102650a628caa27781d7fa27b53928603be97e518bc98507b5c37a15a6898c539c65fd7b38d08a335e0eff3faf05e62e12fb913c12dd5c2b176bd3e6edda3c59a7721643a97997ba9ca7e5173727764757b9890fcf1649b1a3affd018609531e79b1c74e894b84d6ae7c61067df6b7aed52e79f97840292aee1e356e06788a310367d1d0d2d24c151171bd503d8cc98258f6b93dee4113553306cb9c93b1ef149c7f19e8c002a39bb77465ce72d36bb6b9e183b973a1a19abc935200c9bcce3e5500ebb4dd15f50d66dcff448ea82b9fe586e2e44c72666b509d65a62f2711d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (479, '{"ob": ["15151515f6eede94892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbfd7568c1a0540cc426a2dfa8777a93a1607541e049d56afc8f4de06f1a98c7da0ae8a9ae1344bf3aeee4e473a4a45869b8d7c71a8b6506a7fc60bf6835c76c44827b82e6ee4b2dca7faeaee44f91fbb680e467ee402ef2ee41a1f10d82a424c7e7674d582795b1de0826d09d7f1cacc87f13bcd382f86d5a34c57f4096d3e9b504bfcf8fb6fbeb256c0f419e21462f62afb8db072e195fa4adbe1f79e5593c43aa923bc540bc5aebdfb6be53f39761a1a053efe4fd84bd2fe8083a0f951afa77874eccc3670d0db71c66802735e13c2f42c0608726828f72c9bb4a73abcf080095de9472901afc8d52e949c0dae47e6a379f217e3ad9e45dc39b4b1b8f3ee15da7daf31a2afd2099b537affe0825599d17f8e3960b13769a569f12cb7b97fee"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (480, '{"ob": ["15151515f6eede15892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8fbe1356438f21e3d66293905ffc4ec2b797bf842b8df2fb35bf3de2e9684fde09533729568e6785b158a019224385dd5a398ed8d943ccd0fd8b6cd6fa471ec82c65395787bfeb8d19c677783a4fbbeaf430a7f28221737327647a6391902d53b52e3f32a853474b095cde471ebb4b12bc4bca4371d475f790afe74d39d0da0019431afef8ec52c3cc1d9758e18cdbc89cc5882204008f6e546cb60deefc5fc894c2e8e5d4026d25435270422975d5734ebde729edf273b9048b6234d9d21bdf82c8a67ba0031365b2a45b5c5976d12f94f8b940b01b33ba7eacd01fc2c61a77f69321bf1ee1d1798142554fd5e15cfc500fa9833b4839b42f62e4635730b85f6e30ae6e813f83aea5e53013dd35f3cebca5c3a5ec6ee92a0429ff4314f00ea4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (481, '{"ob": ["15151515f6eede4c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9d2888cdc360db9803c3498686e4ef3ab4a3a96e92e3d307e5c1b0015172f9ddd578926de2e9fb9f030adeac63f03aaa952dbd4d977b68f168d1f83441565458f00143f59f81693594b692fd04f95ebb6a2de0382c18103d00ec4203d6e8b8df0e7add3253ae1c28568e3f76267e4ab393cf3739fa9dd5168acb185f6e4e827efcc3aa35898ded2623ca00c4b7f7c21d3fbc50f70ccf0cb7651c72fc8341eafef3f03a160af8ea3be2659e6219fb5868e1681bed8efa80096d23d2ae08ded718fed947a3ab6f434e459420ab754aa8ba609607655c0a8c77d9ce642b05babd42c96f97c20a96eccbc1816b5128319377010c809d43f363ebea630826c782a2f5d69fba02f596eece0fa55942ecaf8df36fa03f5cb3d2d3e890ad865515d6d34a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (482, '{"ob": ["15151515f6eede6f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c13088c4cb185612ff6bccfb95f1a09e1af93a763c897270e8b65f18078b8f20cbef62dedd5706ebb99fea98cdb64059efdf1eff65670d8e7945dfba4d06483ab371fd1b3ff7f58aaf24f11079003d615c5bebc741b298c5be368906e171d928590a926e8ced57ef61440c6776b056059aa6a282b7dfff14479b50e97bed9997595a67973980d74e4b1fb79d348d729104481b68aa6e7fa3c89ac8af0060667543d7f9c14159666f037c786f7bd4aad50bbdb99ee59adf955d7097b35120cd886bd4e59dd480b6859facf47b710e4de50c373878fc5b28f23660a62156a0876768b45a5fdc2d232148ca6e613fe0ac443a70f7b33afb5ce073f354a74ecde493b5aab9774c123901e1a78d25cddef67c39d2337aea72697fe8bdf8d39866ef2a7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (483, '{"ob": ["15151515f6eede26892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cce33ecd089445d4b37f427607fb56e22dcb4a7a5ad01c5aedc3a7a2e30c18fa0f4476d56d06b21ff6cedc1fbf4b3e1d66e5841b40f59ca5ace41f475f99d333adee40168b123ec9431065fb66efc4ed7d3d852a8ed6bfa300644caafa560bcb391c7a89ad3e8648189555505d14dca0b2b16024c03783b2686a010a45539fdc266c8c3db2c7284be3659446ff01a807858a4558409897ba6e5e44ff7efde852f4dc5d03907d19564fb550d7e611387b6a3cacd995cae5b86c526c96d152094fc95ff47261290f259f85541913767cfb09714955cb62166be03cada8765f3f70f3af31016be8d77865ff5cd6287eea199bb166736a183fc268f84a22650e00c36bfaac7ae68130e674544ed3749c96a566218b9ad7187fe0a14b11ed5f9e670cb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (484, '{"ob": ["15151515f6eede2b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce4817c8591a7e960ad9177eb95ee0fba7fe6783c79ecc9a0cdd8511f8a64ef62287605f89bc1e4a9466fa4fcb0b086287f43ef08f78faa5eec06f3797f9108e64a2e9fda0ce6ebc5a70e4cd692c45e75b1d3868417f10e33c1303cc8f5b2ea9c5bf5a5ff52f204d35d38ae2bdafcb2d3ec3f2243d901320f1f95024714e14e63e6b7a1350ba0e013463fa9f0e2d2f0b1a3a4bfbaee84fc3aeae738ee45d004505d088a6e90d711e99500bdcda4845775dce5dc1bd230ea4d8696d9d20bf5d0b88fa6e83f69acca173d96578b7aead617509d0d0ae8c26654338c6264598a56a220031c4e5d59c75f52615dcd99fe6c29a9d553aed2bf312fbfd04d9a31d84515c8ab8b019568d45f6dd35182772b273784e0172b1b9513f1be4e347c78526faf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (485, '{"ob": ["15151515f6eede33892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c72708b8e487c8736a56a6fa324d28c1ed06463645d92f313497821596a657e04b26f9d76e858aa180ea767637209d3f451832460bc7ebdd1051db2ff3b36ceaffc83f349e288aeb29946856b8865b19ea6916540f2b78379b4b003d4ab603e2378b25338e210006bd6bf13a8e3a1ba23ca0d6000f49b74698d2bd30feab810adcc7adeb25e61c04da76bedaae995aaa0b4574e6378f2083a6c0a5f4cc1eee566ccb19753c81f37fd71eaa73cc7802eca54beb77b31a7ca673edcb8337834e5beba308617d93991aa1e4f3230c112e4400e35aa918f7b2d21d8ae6d69af42cd436d9af9b61f640f2f6649632ed135cb68af083fe9a5d95cd520007674206acb982c0586a840e85b72c2344861f99d1049177b6332de3a0c9ed420bbdf3971d7b1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (486, '{"ob": ["15151515f6eede62892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd9051d32cc0951a65c9ee217e2104ee76e4fedb03ecdd80417322d92cd02e726403b72f6997e796c8341cdeb1dfa9d5924a2e36c37f400fca2fa5934b28651babb1e3a8f68b1b041a9829112937067e9828069ac4303210a4cbd1ebf8ae310839dd44eb9b94c16adefc61c1ac4b2793d55d71fb9aaf021f91cb83feadb0108c06bef6c7904f059081a6a48fa21803a2c1b0ca463a7d9d9fde5734aaee94995a152e2f08dfd987d8547903d9244d47b5f4b597a20bc3bc665de8fcd12e877c91db77eec2c6743ae0f4778f181d06e85755afecbb2a8e8597d5781d47c47f1ccb3defbae1d7e8b3600b8d1ccaaafac96b8800f48cf150587e2ab568d94c92f88b13b3ce7aae32b18396db0784bb8573ec7f7cceae6d7f3a8406d2b9266af2629aa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (487, '{"ob": ["15151515f6eedec9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c13c886a30bd7eb8d236cb544d3866b62704a3efac7b03563db59ba67ade74d27f3d4f22b68c2bd5ffd89cb4b3e10529abd8052a6e99483a6cc348f7d41fb6686d28684c89d1f246c48abe41d2e0a11ea75987f12ca207351f81a15e763e70063b1e5cba1be9394994d7d57e642f4194baa567a22c174fd70d17087b6a142fcc9be15cd109fe844b21e74de8235b98e873e4ad0277b47c77c9009067617c8dfda17a2e127f4bc11d4e0ffcb1d144b2d18669dacb94bd96ff30c6fdb429e9cd853ac92d5e839b41ce4f360744319e5b8ed43b127abeab391c02b0ae04be35cd9c60962352d5556178affb8d13afd870431497305f2eba01b95dc4efcba0736bb1a153ad63c0a2b278641ec0db8a1298e2327aa1d00201eedb73ecccf2ef7b3b6af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (488, '{"ob": ["15151515f6eede98892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0c64582641b81fab33a41205e661069a42d4e58e6f3672b7ee6dee9527ea5bb8c1100f0506b4455c2b741ae57f70167ae31be041a4077ec7cf1fd8619265b87ebeba0571fdcc4962a548899d5334d577074fdb8174b542bb143730c52fee326053d49f3a22d5ee88ce82bec2517352c61698415d81644e8438d8cea9793d294c536db2afd95d62aebb7a1c11f698625b53eaa051dac69340927727459d10b7e0b06dbf17f715387be84332e950f5bccbaaa7e6bd9ad96062311e6933ae1a372d7d3696c74babef44fa42ea387b5a405d2395eca808d4cea8550dee8dc9e0ccdf8834c68185d63ff92562b6b4e3bfb3047d3147f8a228c4463659af6aa1f5b6139f528fcc0fa5e9aa3f6ad62eb5edbc2e4827dd0f314aecfd56d51cac1b61927f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (489, '{"ob": ["15151515f6eedea7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc320ecbe78b0031c19d798627b029c314e91747735d24abb76d01ca630804294df51b1988459ab4e07058439320aee816902ce9657ae9094397c7dc1dc7a49a6a09ef8ea418c55a5e19599eaa627c8b5d9249687dd9d700f4fb57d678f6ce8e546b502b41aa92efbbd55a911d8274f0d730f122bd012be3e3404c286b3e751157d36f4936bd135a6ee4523c75eb3bb7bccc5db99db6252ee18b4eff30e3dee2ececf64b4d6c0cf8a2c1ab7224499709e68c3f72661a914a44698740d7a831862d9e3b05fa8cea9beef7034f437851312430477e5ee63507fcd07fc354aeccf06280dd1570c22b41acc17c3b9e26eaaf11743234fc92ccac23b448be26d122f563731234b3fdb6ced84d4f8d30e0b57e964d3b2418de65ffc674016648a3684dc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (490, '{"ob": ["15151515f6eede7d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c85f9090b96835559a6f49b584a7698167b31c01470d3d5670a6fa84de4a8de6888eb90c19a5c7a6b913cc8db4b838224e8f7f281e005e7de4c3807cb002304959e7dcb55e75d3fff1208b0bbabb4b5d99ca382470c117c5dd18ddccedeb5e7bcf538d5a7bacc03230cdc18604a54f509c9a115d61d2719e0228ac0f96d4a5252df07b60fff688c58934c3e73f6e3337c6c6170ee2fda3822ebcc884e1a1b2de88f65217b6a52f635da1a75744ff643f880cef62f6f6e4242b4da8d0b520419154bfc6e015350ce4873c1d876582f1c6939da527249ee60709e82c6eafe7f88cacd7d6a4d0c2b80db205c65067626119a56a28d2266195c9596b5e58f0546cf497bc0d640bce58e6a124d54d0939f08f7bbd108e2a08912ee95ce459aab87e356"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (491, '{"ob": ["15151515f6eede34892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c84cb34ef51a7e243285c8d748b56ee7c301c7ebb8c0d86a655f208114c79d0e722a21b6111cf8e035ded0a3035ece3a23edcbea85dc0e03944385254e342ca2a4d740170d648140087c64933dffd891bec6d0e7182e1c77f3b9aac75a0a7df84bf16a699f353aa4c8c268755eec84908db179441050a1724e351cb4fea171756ef6f53e008eb9f5643b711db077706134b7aa33793f690541b18fe640856bb0825eaedcf91abfec468366dbabf83b1dd6639657c352724eda158a2e2c2aa318f0b456b25dabd9082d8219c399fe54a4865b5a9cbef0e94eb6f22570f40bb443ad2b6b05c15ff05d37dae1ead8aa240dc5b211ceaf97cc54d1885fe4155bfa4475d21d0d68070cf9245c0f13832707138bdc83ecdb719ca42acc045db86b93c16"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (492, '{"ob": ["15151515f6eede1d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf25a00acc976f82a8a8e7ca5cccc1e5805bb3933bd69cb802871c8de828adda82b7f30a736306c8bc1494ed747bf7940cdcba35c66addaec3a7d42a98be7dbedbff21803e3900921e9a152a49df661a939ce63e38036a2fd8f827d3869ddd83157a1f50f916367a0d147483986bb7736069b309aa572018427c088869697a95ed79dda9b5ce916f1468996eda57edfeb75c1c7cb891ad6c56abb579b7947ba340f1bd8a9c3aff89dbdf9aadcd5194b3c5c627cff2191ea47eb48f63d3fbe10ec37b409a1a8c82ea14ab213dc6cba5a01645a58dbc6d1b380c8d9afa0cd15b41fee262b797534ff5d6d44deb4cf3ba083bd1803647b385b6cb22c8b142fb9f2caa000a2e4d40d187630a53f6828724dbd80b1817ea14197085907d9fdb442e505"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (493, '{"ob": ["15151515f6eede99892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c09ab1782bbcc1fc4c3a5fe79cba7ea1639b35183830e32e81d30eb5f31a2dc54ee7b8229cbb77fb55e3e0b73baabb808fa7920235490e5bdba7f90ad37cddce7cfe66cc15e2eb59801edc08ddd00683ac32c89652ddb92ab9eeeb1e3eba42409431bfbbe1bb43e3400ac6180b9c8d95dae8eb7a287f8962915337f40939ef06a403f6d47582e8bdda57903bf27223b0490137c67c6583f71d2c5044597a82e1d43707a686ca1ac2130ec097cd59bbd0c2ce7e58153083ecdc22c24c1e9dad87f7014c402413add0e6c3a209c1f8960891e4943ebeb216d5a7708d94d13494f2b4c38d39e91a3c1d4e81bd311d72510448e4356590a56c0ccef0ab0259b45c6a4fd35128d8f935aae74fc7015b208af0cffef28ae1a1903087e7c055c5653c83e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (494, '{"ob": ["15151515f6eedeae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caade3eb5d0b41882287d74503e01a8cfe4278e6c5eafed31019f00fe8707f459c36d96ed79d70fd51a67e63eee32883c12175555f1e262645b99977ba152de860cb3eef6c7e2f925b6d7987065a1bf4dce870c20feac8b4a5fe4674f2351df3c334fc8ef8dc151d3d3b49e4a5231027ea9b651ddbd512ad4dfe73159ef8475b73a8b4c9950222d4358efedf2c51dd558a0918fd6ffc811a4b9d930f630f6cfb4d2cf3ca3d54205d1f7c88b1afa59fa8f17f0aafdc5acdcfb04d6875ad3c994ae456d7fa86790d19618b2cdd5d8e3fd0b82161dc41988360762804f6f9d0b9cedc45b228f3d1fa0938e362df43086b3c38985764a15146e53f53888d3b0557ad339b0ba7129141af3d65726c96ebadc3bee7bc6c08694629495dbc17ebbf5cdb5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (495, '{"ob": ["15151515f6eede56892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6fe2b4f5a777b1b6213c959f2fc704cf4dfa0103d4a29ba2a9a2aad171cf858b8f500e9d800fca3b503a86970c70c18901e539e1dd284bdacebd180bfedbb985e8418fa0f6ab1e175a47fae197fc417dca69e2da7c2a560a1df2aadd3919fd5ca0c6f1c05f82a88ec191ee97c9c3619dba19aabeb7d80a692b16a932d2253fb78d4f4189d470fa38a1852ae4eae235fefc30f4e76b8b71524b63b7512913de5f3fa5eb99cd0fabe62fd52aaec2dc5678e5fe1f7a1a1533119d4fb98d95da5632bbdc4cb2c1f6f36ea7752a4a25beb43efc9ef8eae4625dd63bb9a28767e6a4ff79839891873cab5746ed2e07123cb8013762a9c0b53ba04b9bf8e9c4bb1442f282bfa9abcbbb984e1440a1c5b276ec2c44f235d71d02a426e8c48f3babee526f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (496, '{"ob": ["15151515f6eede95892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6afc248b17dd5612753c8c553ab27da7133a9139c33ef4da146e900f78cf7b82b048bcb8b6782ca5551460aa89ccb27ff5691b985390e4daae669aa75b783d85612f812bc8de58bc18ef3ee875c307cbd90f615fb9f7e9451cd568200e29eea351046db24ffce3cf4008b699e8952300d61cdb8bcdc9c5927875d9de19ea8a482f74cd0b4a0ff698e5f093f91aebe8955285ebd52ce561a5a00521117b64de83d68bc842629cfb761752b48f4f43884ee0b37d45029620ddee2cac48346de34db70c2ae6c1096ad0a8f1469fd8cc7340429cccce9406f2b7b4121f53e6bcd9eee92c40a944224d1c20b8339f8a26d987b3703bf498e2deddd0b08f883d8b837fc376ced89fba5b80b2251074725a9aef017157d6ac8e8306dbf7c3a84b3906e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (497, '{"ob": ["15151515f6eeded7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c87a0dfc02d5d8997ef18a48ce4c0b36c69ccd5162015573085193f5c8ad3332e8d244683386d3a45ded99e25eea4c6c02ff203aac7590e973b266887ad7419da2a45ee5cd39ec6fbe7f62361fae70ef21ed5c19dcf520a45fae467d20347512612db8a35bdbd9ba764f4db9adab50da6fba73799a68b486cc4cc59ce354d7720c4a34880d3e04c383763daf8e840e4fb9d852a0f76a4dce10f81f9bb151947bf0fc20d7d80d321c860f5e11e2dce7330eeb82356d26a1cb31de45e8f5206283035839a07dced09137667a842901001cac812ddae45f784db463ab5be25f97dfdde5c048ed3bc0adb344e2956dee5362f08d9d7d67049bb06e584f1de0fb8901e84553f58c353840cd9e9059a6259d0a25d9cb6ff2b66f22fd59653be4e82ffa6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (498, '{"ob": ["15151515f6eedee9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8c3eb771df0a23f04f0fff93374cadf1098febe3a3d902cbf965e5a55c5483aacaf0d00cf994a369173f8325cd41ab1f098192d83f3b03b166ca56e221eac45542929db37f6ab43e081ea84a44b45ba0c054f49cb3fbc2eb96fcef4c82b5bf6fcd04ad9d256014cccdb8cd63340190a1dd368a1c3cfba083bd9cb42b3e94707d625cebe3319f69ea928484039da70f55ed1ddc2e6f71c6f7762d765148f5b36710ffab41ff3b6714629799d3c4d757c9b03b1437be7d2a6e2d1b976b4965437033841512c807e0b68ecd799a1607043b5f7edad1c41c7e91b5035adec5ee8cf2c64c478f8e281c6b27f0aba6e605b07e3edaed962bd83676ef5fb93fd30cf0bb5474b7d7b084493ce600c6f8cd5bf145989b7395510f7758cc7ae7af50e30a54"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (499, '{"ob": ["15151515f6eede42892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce4ce3a1931b0e5a1142e70cb696a6a8057d32f3a027a92f014d8344c2bd1d2c6330a134af9b0293dc34ad8fe61b7b33548d40fa4cd11d494b3d8caa0359f5d06567217fa9a9e84dac0b87ead2530b5a0c382ecd8493cc99867a7a411d7939f040c81e138f696174f494beb1ac8874d8d91cf30b32418f95fd10aea04e997a4abce6f4fff03ce3398686e477f1d83451852147aac4abd3d69a776c5370eeaae53d50dba3096bfdd342a93b06483ed0f66670995c9079f0ab8e18dccd5f67b3908c08aadf862549ac0899a9ab337cb0168352aca357562e2988e70e8f6b26a7cf9d8e57f21ff2eb7f4b0fba4ed743166f86a4107cd33ef1083fe9375ac4b3c2d13a9be6adbb3f4fdb76576eba4737e9c79384c01781321d000492ab7216acd26b5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (500, '{"ob": ["15151515f6eede9b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4064a0f054888b12e9661780b6e55ae1f448ea77e6ec17b151d381a3b52999827f183b99a37fdc3ffd976bcbef9d020772fe51d539c25962ef1270de148170fcf8f55771b64eb25d1279dbda4f50f0954a1754d3b485c902e24338e690130f8284eda9bafdbe7c6391f87ce7897c3f3d92d1a78c207ce3da9d2741530b25be7aa0c765b56483712d2ac6a0131dc0c518beef60571fb0f179593817bae7ebf25f8e49047ab669ce344f78d264c5d9b3753fb19629748c2fd935001f786e1cd52def89c205168a76717ac3a2b82dd91a7470275fd3b5d4af53ec8b2043a5f4b2f305f22ca7a31454d8aa3aa61900e09acfc58eb24676c93edbd32ee14d6bf37212bfd4c392029b47ba8ec956bf0ef418505dc4b23f5863f75bfb7294e8b53035df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (501, '{"ob": ["15151515f6eede16892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c32e10b52e07c5de772fde9da08931552c8ffe3a6d030a0657399f9c10e89a71aad48ccc91594a2ed88364c0b084354e7655ed2638c35569be7feb76db4b696ca21683a7c030f151dd965c8c4112520c0b2108e826e21046deddf6e7c768340769a45682d8f4e9f39f3e47533cb5f465e80d54e90b814440db12d97d7f3dd3b926223feb08ef40ef7fd4c40df4e53c7d53c12b6af4563eb16283128364b249387673f71ca078fb546199ec3807976e0aeeb67bcc4b165a0c0f2667a97e3b1635ba4d62f4d1d4d2471ab7a4a98149240b7559c878c96a31e55fa72a712e7ea44fdde162ab1cfad750e3852029a279b71b3f571dbfa0f0093e6fae0855840eb02cf1182cb8fdfb2a64d8f4b6cd0c7185c00049905c1fefc7e35f82fc79e0128dabc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (502, '{"ob": ["15151515f6eededa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce502fdaf28b920ca162b3102e736a60a07790d497880d2066d4fd2b1dd21620c6760c1b06f00c3da02e938a4521165b26044257988eb3c75813f42fed95860ad1b0b8119922831e7cbc1031b670dc3918c218586818f9d411ca6809ac819a439ba6caa4a2a7f1368a884bcf4cca3cb097c616230d9ad985e1ede5add78e74cf7b61737615c918c2091fa44262daf83fcae274e9defb4a2263f6dfaf0bf44e03d7c3907bb8b85caa54942d89114aa2b02255099a494fe25ffaad8bbe43faade71d56e2f8baf105cc448f6a16922652a07b1e7b9afea5b4cd2766b448013824976beefedaa0f61b52f04770354cf8c5a2c8e0b071c59f263051fa3bbab59d923f72f19700703959f939acfe1e8065a8bc10ce839aaab23ddb2d867bcfc19dbfa4d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (503, '{"ob": ["15151515f6eede46892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c20762c45de967e33d405e521084c1925b39d94c1712b2be1480720f668f51f4b659b1f2994a4093a429d0bdc164652b31b5dedbb5d20d1e0d9622f15f3898dd2377df62189c12febb06427aeae790d90a0ed265a4bea62d17f8a053a412a50b3d6bccda746f45c6f8aea6ca2c31ce2fc47100ab610663434e1dc52cd83f518b071ae1b899173d3a429f1a4fc350fc46d900dc85845a77d26a7fb40295553cd040e3f7ac7794808b8c4970c1ced64cfa30905938b5225b348481742268599a23eb5a7d3c91e239503a448dde827ce9e22f04f607fa30a66fc072830bcd3c14f12bb594b1086db875b34f482e9419ca0d8a276628fc88e7ae01b78e4bf4a55f92260f8c6ce4156b010a3e9ad10450f1a6a1a999f3587a485856d50960a757ce6db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (504, '{"ob": ["15151515f6eedebe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9be6e4ff001f551204ad847f3ab3b781fd53835dd61f1526162c3db2b6648df836db112358600489b9f489a4519a4e8ac2ddf34b0fbe19b2a001b9975205eb057ec2af1119879f4d0f955afef053e84340803abcd5359e7e68e62383bf02810e4b243ef2966da13d557c05f4662597e402c62be6bb2bd93de70144b82524dc1d814bc39ca3a4a976db5a1d6fd1924e85ec6ece8fe008c7ee8f9fbcb51fb916910f182d14423c711d1a30fa2afff159c513a5e04b297c3fd4eb5fec707cfbdf963b52db5b43ec2550dce83a1884a7ee3e934d048c08ed918928bdfea6f84703cb462981d090fa22d769e7db88ae1d637d8a2b59915b53d62a7250fe14ac6a7b872a4904b0d6856898a016d4b3991b18d74b8f9584c80f62169caa39b38138fe90"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (505, '{"ob": ["15151515f6eede82892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caf4c3dbe39a1be27027754aac1a54fc8f0b6c0580e657d4003a5580ce19b21fcd5e31368bff390b620663258fd712a5c64952234458f83bf81e52d28cf06c589d9d6b058f26420e653e7e8630ed5e1dfef6c808d97a0da68518e0151541f519010353d1de4c9098a6e93cb4d98a80c22195bf94d951c6245f3b5592d3882c5337225dfe315b984a3b7e34a328e3e12fe8a4b5dbc5e9ed47eb02d7f903f2d7513390af2c446dcb3286b206d851fda49d8d08145280e508c10e3b092c9c65e8b76f7c13292ff2499c4af9c94cfc78221e53f80d00ccbbbe0f1b6aba223be056647e55e09cd57a2ac81946202fdbd7a4ead2bcf4377f70fb0d4753a03afb09787586b1949b112cda8c7df564a3e629d4172532ce3798c65cae740c1029f2a1ae502"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (506, '{"ob": ["15151515f6eedef2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c54ed1c81b0c4202267285b50d0cb6e0474fdc645de637238828a32f4a3f28716b4ca84490e79c4f64e1782c3b7a193ae38a6f6951c1784cd2979dadabee6545710cebd5b6611cb29e2858a3784345ce21fb994fd77dbfcc4b1522c6299ec90b89582e1cd32622532633b039a85277d59761ee37a88f4914cf9c782ec962893e20a3e4220b4ba85377638baab22c86a609adb0096911af3385e8cc89551809d380cd5e12aebea65d7f3dd8a095acf2111350c2846e3209a400e1e5ae4e146229514ae70716dbb03052c338206cdf0c4b9d4cff6c981f84361165901f4f338810fbf58b8738bcb56b1418c27038a255df995106728f99ebb17b6a0a230fdd336c58d55fedc35a34e51246c33503f37d79be0f21f8b509d4034248bd875faffa025"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (507, '{"ob": ["15151515f6eedeec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cad846294fddaeece971eef421e4042117e3193e10082514f540042eb5e3c6944b101e2f635e2213191ef05fc3408de20aacc6f163239e54de5c2079a15610ff65de973c98e12be2e15a30be4d6896b16e2f2f14215fe345b6138f37dd9c8734ba22b08fa73c9816381b9cfcd9c8cee777b7e05372b6a6b608e1de12b39073775c3071caf9025852f2c3d1aafde2471fcd7ff47fd33a1c003c13e9c7b34b72ed6debeb9ea94a50542ab302de3f5e3c8f52c0fb0ad7b7e3d0f2eb33b575388b6e28b16edce1d9a44c46d3c141bd4a13e1991ab8d8513ba83b8569451a279fc7b90143f817d30ab0e4379ae0f62058c0313b7cda727be8d8a2db60080e5e58095b6c4dadffbbed77c0464ca544f5c7a1a058819193fbeccfa5d2de307504effaef3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (508, '{"ob": ["15151515f6eede36892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c36f89c48de0322a9ce8fa25e33e9a2265f5ee94eeaafc39fe13661cc530022510aa836b6c921e70d9009ac37550f9515660a244fd0c4b98c3d66ccacf71312055e01dffe030e1010365e3251aca0da0802badf47724579958a640b2fdc5a4911e4c5f9696abb172dbfb22d71965bcb8941a63a0129318f1b28940bfe3f232236ee904e3095ab40a2227bad19f5ccc766a062852dd457e1811bb9aa49041d7bf594d216c94a1561c1326f4b0e8150d29add71126da2c4a4c8991eafbc9750f5176e3e7e23e60ab28afa17a49190431681ae68298e49c16ccc30cdaf1659eca05dcce7f493a0c024161d82f2f25496d3f49bde2e778010b728b8193fb7b148f660c96ac29d4999b9eadb4596637bcf06221ebdf18e37e013b6af1b9a90eddb96ee"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (509, '{"ob": ["15151515f6eede57892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caec1d93a823a5590fa6ca289b77facbde1e9ebbd38defd32f51baa5858c87080abf26c938445a7fb8d616bc8f38db4e32b314ad92085fb851865e479e4a7042aab42628da2af5a1d5dbaa34bc5c8fbc29b5345d8548508cbab6e5053004c13f2fe0159eb8397d9461f71ba6978ec18264bcc51ec46f7d688c59954b744ae42c48c74be78df941ce332030bc753aaacb30195a1faa6d7c07a8ce4fb1f9aba090d2d771ca1af2680a14400490c4d524a9e32ca13fc85b61c7ee209562eb822feb18a1b6cb67d700af7ad43a647f289026d4ff0e9071d096939999562d2898d42e5298b9e9f2dafb52e94eb6ea45fd3dc7bd5e0322e416c2b2bf14e6d6fc089e110d5e3b7d407536a17f1c9bcbf8848ccd65e2fe1d4001baf70f2f748c1f3c1ca81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (510, '{"ob": ["15151515f6eede3b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c030e3d1a50c49459540a49f5989e7a5bc336a20c2bc0589700990e3e8220638a7383251f28ebb2ba60a3997b82212044040418a454b36b944c9315736c7d9bd3c37aba755c8ae92886165ab0ad1a2e73499da5177b44b6c86c5844435a9f78833045fb6717097cdbecaca776604ff8a6dd10e55c74fcd9aa6b2164644cc07234055d51815349f2e8a82267a2e3518eb44ed6cf79aed441847bc5b2455028589c9b75170131337abc9ccab67dfddf39f389c002445454f8d48cf420a0fb4913fd1257bd51e59f7defb81860f9896e7bf069ce215e9331c61d70cb6361a1d3ac658f7d7a9ce7e2191560ca0420961b86523acd5a1b1c7665380a8d36faaabd8d735977660d2bcaba975387f6f12b6a1b2de8237ca75de314828e1dc86099565394"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (511, '{"ob": ["15151515f6eedea5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8989dfaf3c9c781a93a499b992803fda1e54132801c42f6c665404ab58a2f060bd5b1b8ae3ef40cf0e8a5b21a5cf8b96f624c28291b4bb54a09d4f6cb73a46bc19c9d45c7daf38504ac86d8dcf0a6bb0637da830abcab94168ea88a7ef7b17f449281975bf30df07bbfb69b6b5c704d7f33d11d511d145e3cc772ded4c75411a583e71bbbeeeec05a384d8d9d13f3a0d613e37311a0e011061c6ac2f9d45ddfdd010f654903acb69fae76329fa0916b81d82864336037bb4ccdb722856fd287a23595b8826e5c585949d3aeb6cadb591b840c1531b26587d1ef3099ca23d31da12cadac4f3bfe19527a13660aee6914a88aa5f9ab69a054621d185c57184383c5e593f8468cf43a9445f44651130a70b89fbe25d4c9ecafdff430eb9b1ee3ba1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (512, '{"ob": ["15151515f6eedb47892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85794550cf1e3f6de74dd2478aaa4fe9d5d91ea484fc694bdc73c426e5240e6dd5e150dc3f1f1ee1446c8a1fb3aa558f6b1cfc2a963606df16bc0a7c215b013b5a641cb02a7069c7f78c026ee6a58bd2c4822b11cb72f95a7238b029778d63832af1962e37349e14a1073be54d7a048c9b9ccdbfdfcf8aefedcf5c38c345c4f7dbc03b204a27cc431e538df4eb62c7343ddd8c7c3239265cc7986f57f20ec190b4e119affb74ef80bd0e0475e3f42b99342ae5e9f6440b1e2e89fa9ae04775cb7aadba7c31ae2fd8b6bef6b9775a3a66b9cf839ca4dca01d57c28f0ba1fad2ae3611fad5ef9cc300d0c6b4983270f4360dcde1b7479ae82e765cf151b2d9db559483c1ccca3d90baaf8cd31bd4f6a042477a77aaa165da23cc01407307c4eb9338"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (513, '{"ob": ["15151515f6eedb79892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85816b9f881e1c19e82f81a7551ad000169e875d91c98b6b8209a3f163a8fd2538443b1c55071b9d9597d1e4e697529dbf1dafd9a87cc60a5df2f592eeb8803bdaa28c981673b4ee18d888b6917a45a78635e0ce48d2cdf722e71e8e56fea6ab7a81d0ad97849291ff6dfc8ac6bba6a40d5c64927570e1e8cda590e588f66441bb24b62a734f32a38803ead6599d4944cd711bf8f6e677cc45d55716a88cb62e3ea5371664281a85d006248201fa61e524c9962fa8c8278dee89dbb57703a01e5b5e046cfbdc48e3d5042cccf071b2a74182804552ea24eec42f77d0e306d7894e5322f0c5399627eb89ad94cfed021547bf1241802171053c624fd66d6c39d22f3e9427e58c1dae86b5259489d452afe42b0930b788ee02413d2c697028232ed0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (514, '{"ob": ["15151515f6eedb74892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cfb6c509dd7ad0a69172f9e691c3c54ca4a0a914d24f8d395619f6c857d01fe4c644ab552538af7928dfc85dcadfbd202c52deaafa4dc77e353db702b68ae191773680e2594fcc9f15e67466e02afacad4a96a7a5863856c411f7439b6ce6657d822acb51f2763c4498d3ef03163b4725ad5dd8c5fd9b2fbaa8c68493fb20f065b0d4b27f40ad014560d6e081be15dfa90c278e05f15969f0a52b698d6fd3f382a9cac56efdc96095e452ef64a1b8d02fe9601d9937e7f965d3beeefce83ff5bcafa0dc46e0f6d60825d4482b2907baf9cdf557bce44e0d38923f015731fcbeb7ba676d25ba635d6ec4fc7346dfff3a1e1c4889caef4cb74145f3a052a58c7b62bd2f614083d3f1311565a702c825ce4b4079e3a9d9b1c3e55674fc42ca9e6ea"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (515, '{"ob": ["15151515f6eedbac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85194f9762e9af3d2efa17d35d92a0471635cb5ee8e9503826e10937ed88d207f43191cd587ebef9cb8866a625c4190b1f5372224c4ab66ac217157f1391c07b955c7de1c8b058a7e1aca33c444294a9225606204ab9def49330ef65713eaed6a20657a1089d7fd7adce3e970333caa518da560a14bea6d4bb562d5597cc6fab001d53e1235063075b30b15fe629903230a846cbf301a627fee1bf0fa7acc5d525f13f2a1ac23ad19d4def57f70206941c2b3e0b68925affaab3034719fbe88d7043ffd70284e15e71bc4624b1cd4ace102ecac6b8dd2f30feef1587146b09110512710797351528c92db6b06ffdd46a3f87713adb0f84e5d4d364d9a740a79cceba24ac0f92640a16e3b98874abf907963f5b4716f04ea0d5585dc8b3b7c5c533"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (516, '{"ob": ["15151515f6eedbf3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c1f06cabb3b2a502b184e9019bb6851d17b1338a86cc2f20144d0d4ab074a2622791b45546c7a49ecba14efbda4bb572b7a9da61d779455ae49e619b0291da46ea14c1665b39262e35a66d3d8f113d88642ee43e338f38de421f4f7322b2b9d5190ab935a7b2cb552d2cf1d508d37b484679afdb240e4bc6b80ce02e1c4771859873e57b586e589f91be7dc20a03b3ca115cf26b6b57cb9e77829e710ec0f7a9347193c7d3ab68218648fff8a817384557d8c8d787590d64936cb2d3d60976e9d3dd32ba49c4d3bc895e81eaec98b1960fbf2755062cb91081b324228f7eda0c4d5209ec663bb5a2fa0e94816fdf0d67d1c6ecc445833a1abf18fb4545bf3ebcd076451d69a771189065af9df49e68d1ddb12655b76b534bb0de276b99d96cc6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (517, '{"ob": ["15151515f6eedb15892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8560f9c27d849b631dd0b01c84151ad4b30ff8ee2a96f80abc0d179a86a8dff144744cc25d60852ab2cffa917a0a01d940339e79f0ffe9329e2ecb2363130177943b1a89c963cd28565b99b62ffda55609f919fdba3f3bb3302c4169dd70cc6927d9790b6199070b98d744df79fbd38691f9bf48bbc71bef5be345965f9f28da3cf7e10ceee369c15ba4a54fbc925cd52f676f2ba3c850476a80083a713bbbac124ae0da8e2fd2d6677f71b04283d8105f46b4bcadfaa40f8d7c48ac5f2244628ff074cc2bfff1466492b23141a7c44f4868e16ccf7824f8152dee41dc234262e6573f5d23e222e8835afc7c8e35c18fbfef15383b1458e7a6e0a7e77950c66158b760dee8d2b45ee880728e16d3045fab5a76003b73e8a9c34c5bd6298365479f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (518, '{"ob": ["15151515f6eedb6e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f2914492570c9a104e83e97185672993e4a61b9714baffb3332721e2b7cf07337e387d39a99bd09e790f4ef0048d47ad3eb2f939a58bc84baea4a66fd9ded6b9392a69a42ecb82342b35502c0fb1ea6d761874687cb2b61381586dd24017bfd206486f7cddc4bf861d12dc09f7d476d6e7332b44ecc3f6ee41187e40a4e3a19cf35130d0b4c2b7e8b1424edf1e7804ada7ee4624ab87df6dfca3b5c48cf35993cbccaa642dbbdc874ffc18c695a3205193aa3fac0910b10afd232cad170cebf345b662bc6878edb025d5c7eaa9115d02774125acc0d89a02123e5c6a7961ef61856431c8b0d8080e90c76ff638e1da3125439bce1669974ba10204a4174f2391ec81dcb44af5a16bbc12f0a6b4868780f8dbf401885c6c519743e5b99c7efa72"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (519, '{"ob": ["15151515f6eedb6c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850a1624e88fa02af49cc46a6f7bb4ae37491b114d9bfdf50b73f5d7340e30debf7a85cb7d61e97cd2113cfaeea565113c6c9660b9267ae86479588db255805acb66ea9d14c42bb7a7debdd0d87ea78357c06234433702a9e1ea5d4d4a2a3b94a16e285ab919239e27d42152adc5c24f7ec726b21e5092751df1942051c79b0b11ceb53ab35c303048e44546d1aeaba7ab5dae744a89dfc761486f066a03200799aaeebe5619899daacfea2a54be4316ebe7325f439052f876fb9e1c578c7cc4e431f55b89a3fadd43769a06b6e3dc582c11c4ffd88ce0ce55e440c6dd286013b50779f893f46b320eceebd1f800fc4a631b00ad60c469e28a5140e723d96c3b1e2cfa985ae993b27026fe6d2bc730f51e727dc87df2aaee0bc36e3e9eefd37756"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (520, '{"ob": ["15151515f6eedbc3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857b510bbf000c42eb7a83e561744a63d6aa245f8557af28dbfba40451c73f60dadf9430209610c42efc9552e848738af36b78065d45ec6ff0b644878b8a3ad21bca0e81791179d151be745f00d4a23940acb6b27cad7d0036ef1941208858ba67b7058dac44b9ce3b445587237beb8bc0dbb653a278203b91977005738d5baddda5570ff4717863c334549c945a5b6fd296f7b53029542c6ac38c9534a535cb0e72d154dfe56122089b5bc3404ab4eba652da80a5646adac02a588200d5b62e67a58ba45be42e6f9f8daf2ed795d41421f00248bbcbd2432953e0d2ec762ad91fdf1af82da6e4b2cb55ea05f436955dc86288936003e2f81bef19896acec2a7384dcad328cd8a0a9b7ee5eb094dd59a5fc210530e81be557d3838fbbf79f26753"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (521, '{"ob": ["15151515f6eedbd6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8532755a4f6a9216f8d6863a0517000ba8e269e5b12604a2e400deefea508d48ce04c5323e0520335116c1054e72d71b530b1fd43bd66c4dd4328274da388a36542131818dfe3e021535c1e6bc3aaef634fbfd49aa2c95eab3aaec880b2fef23ebcb9d078c20d74d389af858bffb8dbcd02f5c1d94e7eaf8025a6a2bb829f5b88194142699765e56f4cdc9000de2c1b008c735e81c028091005a17c7f1a6c0d9fd8df90203b6c445f5d11a38e717359b9c7b177fd222c7a07870f96856adf7268c4bd810b00c7fcfdeddd1d8c8d7464c28cdb06f1c2d122b06627dd073544f383bf24531ba191ee939e767fec1222ba61601c9ce34f89260208ed7e325de493fb5a99d136d9e24eecbae1d772f04a96ef440c40cf6947ecc81f71602dbf82741ef"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (522, '{"ob": ["15151515f6eedb44892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854af925c29db30b8784cb8d91d04c5e11888046ecde3a246d82e987639980683d717192d37931a8c3bc43f3409475557872288a3e63ab452811050c5a831ec2dd0f67c2cb68381827f93524ef07ede31865ed07339cf3af092a25108ac9fc6194599fb38a2f98420b5431079f7428e0fe68ae04005381ee75d4691a3fa65021436b091a19f76a09dd9bce78a9beb762085b2bd7a14e58d7cffb096fcf8e6f4690c3302143dd417a6b725064f2c52839bf4ecdc72a57965a78e74ceebec541d38ff21c10a35769763a5add25b6cdcfe094f889f041da1b3aa8eddc590074c1c75545aaeae982a9fb581e4e1cc8b51fa81ddc366a1b8677ae36d6b1ce723be5ef6e7ef0c185858096a8828873cb727b0c5a493fe7a4cb7948d48bfbd2671e55f7f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (523, '{"ob": ["15151515f6eedbba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ea34aecda568b1540fa6d77fc2029da238252bc30f8cb195e30f00d4b895200ed15abab968e1308d11c63490a3f80b4f1f1d8b17af41aec2da90a83fda288134d9cacb2667f0f1132db243a937e7706e412f61d9e21c9ba4cc9074a5b7edc3a9b3f6acae4e1e918f4e7ce4ba6090317b2b3246d744cf1f4fbbf4d276e13068c20272bd967fb0098da710ed6c213cebc782a88b503a0cf8bb8de3a187372a849ace9dee66274b0269ea403f2a8fe48eff4f7d70006876f5c26272234c368b54866ee37299fe381d3741d23a62f68a15352230c94c0cc8e72bd15af50c16931055511081a03c18e492deb5c514a7045b7b5770acd2a4b087cf6b00ac7d2649aa20d0272f26b4ac8632e78387a4ae89dbe853e2c0b5b9e37840fac64b5ab1fe26b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (524, '{"ob": ["15151515f6eedbed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85201d5677cd4b0b941bfe320dd36eaf13b88140e2f26a8aeab8ae0f990e854b9abf91e32feea6bea3b3e574d913492c5365a5a2427f7f2bcd3a616cf6c0d91db43fd45244592e0b1b596c0e8884a580aec12910a57facfd76340b47223299b99199c438707ab32a8d76882cfd57e105e68a99d8283f2c5e33fd6e9ab4bfc9c29d1166a115a0adb6ab82da88cbdc9a2c9f713f1f12f98de9db11e77d3f0842d3fb09a14991fcf0f5315e916831e1a483b63dcfb22d9699b2de99646983ea8c70bb52b59b9c439d15794eb3d727cbffb501387b7e6686657f9682d965a3fe7cce13da6f4cd3f93aa559c48d6e4a17b4e12500df41e7050b60fede8aa131a414c32d9707e4e6c7abde6ae66c93c8943a5d279a4daf9fd07168df97e2f62ed267dc68"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (525, '{"ob": ["15151515f6eedbaa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856639ec90ef5b32ad275cc767bf7c20d2ee7bf6c23d01cb4dd96efebb3b9ec9c64ec0b90615f1020639c04e2a3860c73cd6d76fd57b5268024c52cecf04573e6bd34434844a8abfe74ddace9cce72de6a8a03343bf99d8d5a07a7fd0be8775ae78cf2ad62bfeed951b5d00cfcfa79b69c87b3b88edf8d7e9a2166e4129db97a67784262568f7835744403cab0347e9088a0dbca128cdfae254b261d642c5dfa9f1b8213915739d92180e7fb247f6f022923816ff454f62ccf97b53ffc01dc729947ee0772b58b24b0a03b42252a9e2c5483be4bb1c681bdec32423a9291b248fe72ea9120870822dbd736b7976c9420461a048239d9d4d1ff8412a6e626846de7d84039379bdb03d4701ad8f20ab8470f1f519185a1e98d27ebc0b7c710912fe2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (526, '{"ob": ["15151515f6eedbc0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ff2871dec84d21f3c6b6db1fcd4d6c244bbe7de38cc2ca5cfbdfb066fa358ceb3537e0fa2a2c49ce8865c8e75fc47d24fa32da90fba9e4e652aaeeee482911b6e7125d23037cde5e77d062a3f5235bd1f20ea4838c1695e9096ffbfe3b213d1789ebb9f3a4f43ec8e6cc90722e32d27c0a801b91fea84407eaf79a4a43c360448d7e15900050785d17a92df5574e1b571e47722b868db38d984b6204ce7b8a03b0baa2d98e7940faf9297c2d7f1e88665097849006fb1932ed505480238ccf847d4e83ff082ce6144134b35c1620b39cd82dabe7331fcc08e3d7a3a3ba17941523635e0384e537deb1a9c39193c9edf296cfff3d8b12337cbb1b65118836ace4efcfc262c8378c5ef3fec1844beb8bb72d1a94b2cbc0c6b483ee46391027c6ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (527, '{"ob": ["15151515f6eedb76892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c48980e8ff1ef73b5958d61de894009476137b2fcc98dee9c784538028d0afcad882ca7afc36f7db266f9267bd143c48c4055e926259d78f60e6c7c7dec1217347e1f12060737668d36d96ff7b17493b075ba5e49fc602e73082ef8d7e5de20d39b422984944c1a3fe3d9b1fc4cb7c40a3d465c0b959a850b176f4eaeb16c152c82ffdd9dfcec21ee929d652390aa8e7d70605be7cf2802341d146b6b4e4ced6291917a05af8bb87d090e490df1071fa510870951c452b5f4d7d35de729b9c5178aa41774ba731a439292a4b137f892a5c6d22ead256bcf8c5ac75f4181502bc2d2622a2070b34951b18a3b9191f198f74983137e24231998e3fb6a8bde81829d4aa7c6d0d96e303df7ca23fbacb1b2e3871b4185f06d0e9d77da11c69d35235"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (528, '{"ob": ["15151515f6eedb28892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d61ceae6360ecf4ada00fbf6651183ef241e61e4b0a0ea0c5f6dba77919a4e413b437dcda8f71308182f9d8518d97d35f459d1d229dd763a8a2a5d15940170467d6d234c9eb0db4fd3aa3d25b14a6682d360ea2f6e53051dd290ae8557923138db8210ba802fdac9c5487c351e7ac2d0771fbc25bc83bdb270a8ffdbb4e97a719683915cf9d0c6af6c7af00a798ea73240d6238e90a41c3e72556388e445c27b8387f636bdac6466afee9d17c4d4c48156cb8993c108c458f682fe8a040041a7a71508f3341a77308c473fa6b5fa443891872ddd009c84b883309067d3a0dc23f559dff061efef24647028855081fc6e3305d39bc31115f2296aaa31fb81c3d3ea7eb18873552b12aeec2a70ea6797eadbda0032054b08bee379244f37d82df5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (529, '{"ob": ["15151515f6eedba4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a351ccff6fdab7056d03c042753c7f9ae20d3b925ebf6eadc1ff3027a6963052fe39b14d0ec982dd71dafd5143e7acd087592ac7e1130c71593f17be3306fdbea1bb08e6060775d7483a2afb4a9dbf9e4e37ddbe740e7004e012a15e7fd9a779a87552eb779989e9956022bd51a261134e89fd0ea4a2e9a06318d4a97165b070a1df93d8354e6772351bacbf110fa3ee8ae265b3fa666daac10c79e898c2e48bcc1658ac1f89997dfda6d3449260ea0957eada45e56ed55c6624305a8aed40cf8b7fba0e93ed0a72af64b93f4f4650af13cfd1fffd921e59d922587fed8856afe224c5552b1103dc784d7912f5623d73885f5e5a2e7a8dbb1009946c77fd1fa2a5228ec472bc40f47d3d12eaa636700644ec23c450b471ee8e167d39c47638a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (530, '{"ob": ["15151515f6eedb31892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85741d7844859780e689665ce1fb020cbac04bd0f306784d1d8f34222457992e583f41b23ed84c13f0cc31a8c3aa81d0a201915a8c0882b568e580571cc6acef70e905298eda625e20c3d4880a4bab7b05c1fe3d076433b1901eb766138d5e64c38751ddc107a022839beba9ade516273f1a73e12417c1d5eaebf45740370064d6f6c700f46d68983a520c013133fb671ec50110d4d87dc164a3d7f8a16e967508e74be10e96850bcb7dbc8e8534cda35a6c7197e5916d5d7666b868aa0f6b627f80fbd9852fc0b44473679a62e366b6540bea5b809308bd0df7183b9b4f8c57e4d4211ab2fb79d921cbeeb7516ffa039c4825eac64a6be3432e64d4bc31d463edf625aeb6d2e8f1d0319dcb0d91737d5070f4d75d049d0272d5ad9c7b1b7e75f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (531, '{"ob": ["15151515f6eedb83892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858d39d433c430240366b963ca090393e74c189150ad4b2bdf8658f38fa5194337c320a47aecd82ea6e2cd9b3c54a47cf2a38bb2bcbf98a425832ca4fb2033e955f1b2fbc21905bf7cda2bf216da3302381ee416a5b7184cb2917135d7a889c88b5cc3e253cb6678b1950154212bf29d12a1fcf38fc3c41305e105f5ee2b3cfffc1cdd810a4c676faddb44092dc012d6d99a13373ea11074aeba23d6c314c689b3fcffffa54a6b6875b504ff614f00b287a1479cf82db3d70fa2b07a0be95e87a7fe5004560169f0a07c5b8e9ff2f516acd80545e96160805211e32b7ddf861f25dfe13761bb848710af8b69bff44fb33dc6db8a5ddb951547a23984d84f2051d5312280bd153d1f1f54db2efe76fbb20b2549597ac3dd01a0fc3ea460e000ffcd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (532, '{"ob": ["15151515f6eedba9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cda2e6a287b0387e727bd665423f55dd91fdb2d64244502552f53dbbd256c6f73a8dedfe2eaef29bd7c8e0a65737a45a17c065e6a07ac94a3a8482077b75a098069e5593b90bc6b6c35bb3e7bb56f0cfb0f7e4a794a2e9c6fbdb6cb5e59ee4e4c6d92ace262a140970d6dfcbc11a0c9573935bb0b6e922f9b2871b32f5b7615ab2ca3f08b2759fe5a159eba558f4a45234a1b58c258bc1d0f33f475a4b89afa0b837cc1d8c4ac1fe4e810f50af8617d801fa08af2ead77254b2306c421a945cfc86f1ac933b047663e8bb76a345a39fd447d85c297133fc42e8c898fcb2c7cba53ce967e1c43f6d5b53cb4497e6cc64db8b3aba4633543db8092bf89126a8223f96815b7af392bef95840d5c83bb45107590246ede421f34cb3d87254b1e1574"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (533, '{"ob": ["15151515f6eedbcb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b8739babc3b539fb9779032bed79b76c8bae7ef1aa9eaf246798e15a3a3a0068c67df6cb173783adfccb2bb16a817f6154b79844d25cc7e8eb5c0a470acb429f744aa68b417b30dd7f3fc1934dd58ee6a0c1cc3c89b7a4e408a62fd9ce4e519873916437541d6317d36f0cfa58247a2dda69d044c02bcb601973bba70a8118375895e3fb2de6e60eba84f012e21dd4ff1d70c8aeebbbeebade1c79709c6843d95bd4620d50bcad3024edece8b764e36e7129d54dc3c67c1ddb81a9085aea460b5728d8efa68bf7581c37a4188f99002a4531f41776ec7ec535812763970054b9c18ec291a03e6adba3714418123865b3dbe119e9d92968ff3b8dd27aaedc61340bab208fff30f2476ba98ea5253d7eeeeb7c38457f0032c14acb82b06ba7fcb6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (534, '{"ob": ["15151515f6eedb89892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856f6b785f7f1e123307c9a736f7ef64a6d367b8a856257dbadd390776d52391980f3143046a61cfa0713e95b419c3369ed30c27a7f89161df35c9a08b8c32fc397d32cd003a7baa4856e74163e9cb1938696f0fd4eb6c0a67a3c2a56e2327628d4ef313bfc5f2a3aec92444a09b742805be5494c235b1117a34fb8e49d36ec3953fc2e74c700b989aa0b9d7aad62cc36c0e20f790683bfa3df9fa3c56134017d4aa4e7204f7d30eb9dfadaca032d39a9651b2edf8a5884740b9fd69688d299aaaa36d2a9611a8f92a38ba85aefcc0f3c5efd54e522c1f3f7b37d3c8b1c11434a23fdbbcb52221d4a02ae331979799974396af5afdd318d502c23d0639648a9671db7a571b7f8cb0f5ba98acf1dff9cf86cfea99dbf2827cdbe2b4a2315f21d788"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (535, '{"ob": ["15151515f6eedb96892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f4763667adbf3e176304f0db682025abf537be030d0a923f932693f7a138bcbb6169c040c639662bc2111c2fb2cd562b2a1cf8aa87ff24c42963fc29291206decf87f36d645b4e78cd599fc002426d0a900852a17fa6c89681fe01857396b20aaf9c23d20fec2c2be04804d950c6be6a79bd91a586c4759426a1355e5db5a46395ede71f5b6a1feb903a60717ca6f1f24359a8071217a16b47c0a8ec521fc6a6ea1c98ed34b262be4a95fd9f042269533a62b92557dc2680c3f66c949a0fad2d58890a8199ac32b8ed53aec068a26880f0c054c7906028434ef76620a9e43bd0fec1f968b6bffbd2351f0b4b7f2d443a6abd243fe4802a53057002a13cb38951b739730059cfb91f53fa9bd8a92c219941cb076718f923b5866afa5c0237f448"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (536, '{"ob": ["15151515f6eedbcc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ecf45ebaf73a027bb31aadc66d1514a4b8ce62ee1be6a9b993746f60277c2dd5252d8de530bd0d50521aee30cccda4b473262f6a0ec819486cb784dc2bf87caf052b497bf869183d257b67ec59108dddb4e0c8273d3f2fad3883d68dcfba29a7601c547e967b1ffdf0d35163dac675b3b89b340b6dcfa61cf62ce2546a86b2f000bbd9390873ee04eaede61361fac42167b87383991a6911ac8ec89ca068b809d58416b0e8631b6bd3fa57763ce163f380fb84f478ba2ba36f10946e8a19a75c832ebe878c92426b29ea7194456f821c51e1cd5d98c04c75148b8f935165458176d9aea9d3fc5036f305c393e7da65c26ffd29e49a6c3b9dc8ba40a5f32c7f2b962703b99f9b70c73e8e7f5203d657aaa08ffc4c7e2371bd84417fd964fdc028"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (537, '{"ob": ["15151515f6eedb3d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854d7d5e5ff95989a323dc775e79794403afb5cff9c4322e56f294c9c31cc3927ff6ceacf60198797fe3ca043638ecc9b29b18a0a57c6f48031c46b3ede7683245d4dfb2650295894986dd80df0978238640ef8bcb2d10c693d6263bc674f8622cdfb69baab5c79bcb8fec4262d6eaf8e2abf431ea00bb723644eab9893564e791b8f14d6b77d16f0b901d0bb5a6336a84753745c94dcfb5c134991aa1643c02fd91b7c786b32415687648aed6345f6a76974054c37e36dbe16035aa2f9df71618c990c80ec6a35405e49b9011d37f2598f1335acde47a7da406812958dc833c96bdd0bda2d34a6ee1e5cfed9d5fd3a117b038303be33bb650dc943028e0888a42bc9b12af3fc43b26b2475c624d6c3ca02b78d9ff25fa983aa679cd19a099bf81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (538, '{"ob": ["15151515f6eedb10892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855ef30fd6aa06438c46b532dcfe1a8180513d000bbf6b89a88f644ecf5047fba3fe3222977e248b38aed856ef4a76b304aee59b6f575780330d15f14df4beabf0a47f26b87bc3bd45a0764ab1fa99c174c6a201d867fe0dae58e5ed9ed2f7beb24011f27983a637f752dc9d8dc4dfbee30667d83cff7980c8bd649f69da6301d548894217f671744508dc0e1a30be16ada1137bd957064b8a84e500da18fad359e89ebd584c818c5b6b15b29a1d7f8c7b44797083c67383a74703b8f4ca24a9073496087d2b941e5135dfab72a1286c9f4e6cfa2b91c9d163e43f4ce3c265a72ffa14610dec1a4e7be46c1ab690ebc0bf225d66a5af48296fbedc0657c9ae52de2f63d4a74081f0a036642a87f6f2ef4157245c7e3f67ac2c2d617a23e00e1654"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (539, '{"ob": ["15151515f6eedbae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8588371d65ac2a4062d606f5af29a94a6cecb967f96a457e2040702efea7e2baf27598c1d1f9b25a6fe4dd05d74ea6f72d231b0f000e821d5a55a4db7b50f5dc8b54d72923bab45fd581fc26c34e66fe9717200f5438fd197ca18ac3bb8805426ca9ec2c33ab71860b71a2c6f8091210f36369b9b9e09899498a4533042e0d48807a49b1d7c7f2110c69e9a10ef361b1b932cd8a0191022c0e31d1929f2369113837a503d092e655ecf47903cfa4fe57d6d18aeb53f34df451c9c26b6a20c8fb71d3e5d9e79432b832e565eb513b59e4096025b958dda0b9033e952f4a921de93310af3c6ce364aa24b41f4c7918c75dc0beb765debb2db6dbac9747f3eea4603d194d3dc6e4afdae4eb5392765cec294b344a14a84d31b0ce247fa71c3e546294"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (540, '{"ob": ["15151515f6eedb50892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ff70ac782a4965feb0fc36a33050b61d98fe9f78b64032ede1cd91a8a8a96f53deb54a05c615626dd0c3a820fc76d7d29544b7f2a5a9a747076675284424aeb5bd6c5a9f642bd0be3a01e2e0cd28122c77481d7fa3e4eba19edbdf7645f3fda43b73842c397f0eb0afe87189cb2e74e4616488b114213a2814060def227477df563f147cb1cb8a4023b1bfdf9afdf39847785942df8ce05b84486eeeac6f462fcfecfc3082661a545d888e7fb9534d7f42a41b8f8882de7dd46e593e4baff10d74882b955f3752fa20eab751b241f865dc3ea7d9b0e204afcb2fd06002d0cc8efc17187851fa4933c8dd25509ed3feb2673730d2fcd7164474a8eef121e4da0eeef8f0b4fa4b4471e5821f5fa62b66e8ce250ed3ab8ea1985b7766d488eccd2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (541, '{"ob": ["15151515f6eedb4e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f925fd0bdc18744f330a59403d7b8a66364043c7d14ddaeec23f91a34d79538f6d19d64cfcd02736476f829b6c3dde9d4ecf915df7e99b0e0b9c968acbcbf3f7a16eea03a77732629b87b8f9669a1a1519167ef6c9be7d6419b18ce5ad5e4ef834b393a12c56fc50f51a812f96e43a331b9515667382a4beaa556a7f31b058135cc82e0d2a90c423e7ed772b250befc819fb7ee9159fde0e20b284433a28c32811bd3a5fd1d6f189abb93cecbb1424f701dfb7434591ba87ccb17f1c6560ed1093ed75d4c4a7da6991141e985264c00a83e166b18242e64887d9673e5aed3cf5f24a5e242dd6043a320bcaab85160da1e68bd34801d18cef4eec859cfd2ad6ffd7898d11aafe2d4a5d73abe3a4f9de5b4ca87afa7cedecfbe4924e07de7e41d9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (542, '{"ob": ["15151515f6eedb01892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858f66d37044c19f5e5fd9dfc53670218da700048d22883b27f5c4e4001f7459caec9874200631b8d5f988359b4d289c022fa8b0f74557a4b00cd7f280c45059216be0c9915fb319f237a8a5ff99827bfd41039abb7cbeb7eda61adab567de244a7876d472e575f19362ae5c0b401b2bd82ac03bfe61a0bb2547383e8ba85e5fb491baad82a1c3f000a2eb6544301add7f919e31ce75e224236962e86a4a0dbd9c8751d4194548a7bb9caca0873cde54292a4644587ed6ae43dd83683c59aa40f8a80b56516e90a789da87f91dba5541a5eaf75ef39db5ab6b592f02331ef3cb0df4091d7b395f4e0baf53b649cfc33cc67eaf0cade4503f87b384d6a6a7d23060b5d95e86fb26b65853f7cb9737b6239582478878ca5b708bf64aef688ffa9bdd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (543, '{"ob": ["15151515f6eedbe0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850a76de7d908aff75dc18ba68501bdda03cf14d038bab8ce4fe002a83dfdfcb2479515e8f70c6816a90b6d310c87ee0a2391a51437edc35e656753baa5af9d999eafd9c8669451072b95125913fedf1fb8a8141ae3095c95b336bf9ce846cb9df343857e5bc6869a0e2035cec3270d8bbece89c9e24ad18c99a1d548258b24c9df04f0fd6d834b2665f332e302733365d18134efbe7e3e404649412b070c57b7be32723fcdab159291ee786b4bffedbd28c2eb3f60a49049384ac628db6854b1405d883cdebff80892a89ca7a34f9614e9a244bb103a6a7d5793bcc0d71abe0266d870d0ab9e92e193da126a22262626194994ca0346ff19d031d66c522c8663452f5fea151f28cf24ced50ebd8f36698538db2e2772d8c47c9a22d3472415829"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (544, '{"ob": ["15151515f6eedbbd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8566b0420edd566d110fbd8349b8bf6cf4b5567bb3197da14587fa6f10ce5e939575dec4d975dc5f6acf2cc3c6c9b58e106adf7e3629f184943d418934b989fda2c0e8f2a1c9bc187c3143915f5233be95955003a6aa010bbd5bf5a2b6d39ed4fc95ece343d725fee0e18f7cddea88816aff72453905e94fdd1243a0a865a0a19112f8e8c38bc5755a25d6db376bdea97ef37b05f3a40e7c7d32db1600e518282ece073b1bcc91ff0a2319dc093cc0a85c197ff319de4d72af7c9fd49e9c18d2e80c63c82a5a1e9e32dd74702bbbcde43c6aab5cdf35b63406d3f111ca1c0e70ec846669f9aee5c605bdb96c62c8468c365d6014da09c8791ffca18a5ba3cba62e55856f2f378db436458f87a646d87cbc5c1c3055ca4efec55a89089cdb4eb1eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (545, '{"ob": ["15151515f6eedbb6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859be4cc6c126aa84b293f9a1e387f13011f2ed300f2521699e969ebda8b73efacabf9dbeaec50665c39ee4ee5495254dea345d52a36f16c3a025627a28710210a19d29618c9a1b69dfcc861d8e2faa6966be0d7f14ad71f8a0c93c2c3e115ce032f73f8d5a4d3b5aa078b3a0c6a1a60ce0dc63da2bb6b7daf8f649867969949110f501625b0ec6f05222a5271a42f45b2b07801ab85b792d75d21f38725a9d02e75e57ebbbc8bc0b54e4c3ca1a527b4f4359421b9d29ae9c1cd4fbb4d6a1e2b00ba4535bbb9feb50459ce563b7f3df95fe3dc167ebd2b7d68da30ff44eee310b1c57f30734b69e49748438178ad906e6be5e6cfd66abc42ab34b99e5116774a0226d5639ec5e808890c6694d4b01331fad76b8a73663f374109b859bfc0dcf967"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (546, '{"ob": ["15151515f6eedb58892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c7f4e858e8084dc8fac376da8faf13c4f56a08c66bf098a41bab5c5f9578f7991e14334ed41d00c490a5c47bb647924b9d110c550ee230f438da772cf36f9c5157ff32e9e7705eae11481aba4754929cea8779bf1537518d8c9b7520441df3d9b9e0c8ae10e4e29097c15ca345a35034dc898f49365639579a9731d03b4774bc7add77cc50bca6d3e05df69bfb316abc5aa1e8fac2f9f0a97447e84cc91deae3629a4090d8680619ed8270365ab7805e9afe6acfde55ee4dcb162547525ae2af93e2d0e6f0e7e2f3a901e2bf56070d43b725a038131fb6be9d8e1b77f786340f822e2c1deb18191b7bd050761696598cf673b2edeffc5b787fa8c7197bc01a4668e01206cc573d3f452c60e4994aea638ef527125264ee5e63211031089f32bf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (547, '{"ob": ["15151515f6eedb3c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d3be28699a60e6efda1f2d5c22e70a24f485e14fa91ce8a84e65e2b67e269a8ebc7061019bbb4fd28547821e59067a4d83ece094c6f58a691bdf7b14071436571b339d73cd4957e9bca54ece24ae28a7dff779406d98d048cf96e1a7cc9533b1c7158946c566c9e28b508a4e9a59d439138bf667752a283cd495f5f8de6e4cd36dcd5498801ae3a7bc15a7800008b59c6697eaf12c5876d1e9dc604e80e409bc611daf3bb239b0fb33b9e8142bccb98ffff830b7a54fba76640f6a85d874de3b083d9a57e6a8d44af73f5e135b4efcaa82a207c0593ad442ae17fb9f0f5f972c61f0313abd271eb9bd473147c1cf77cf39bbb8078d41dfda2394b01ad47e50b10315800f157839f7f0e9670512d83aba76588e4f70218a87c1500e1d7ef70343"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (548, '{"ob": ["15151515f6eedb00892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c5a6ce2eabd9688cae923b2d2ebd954b2d8d3166b6216cc0219c6d7b31d8184fce2bec066d22fddd38a704a2902e810d83d815ca0fd5827b1a49e83abdf8b6ee63f9ff8d797973a291c33ae8f1cac871ad920f08b7eadf43f7afaf55780db96e5da17492e543cecf4898bf292cd928b5fdd4c4fde6a6b7b95a57bda4d2ac73a2181e67c99f619c7ff0161637af221885ba8bbe86bcfbe85dca73b78872ca3e1cf5922ca280d8c4b6400e8a2c6da71012c85dfdab56dcbbf60a81ecbc5c42a13dddf3616691d11de8fc52682a4e24f37fe3ec385ed1d8ff1a609b25309e48c993d5ed4676aca32d12084dd5619ce0ecdfa5335eab9f03fbffb2b2036d0eadcbac278fd022ce7b6cda33d8a8ea9d4ad26e5304adec722f5607142286cf404c7184"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (549, '{"ob": ["15151515f6eedb4d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857a7e582b22f3bbbf23ad3f6e84183595c8eb979c7b008303a94bd74be9bec27ad7fdae37de88b61b7fb5443d0abb8624fc81c978bd074fc873543344638c3d57ce3247642188a74c1c75ba791ac859ff429bb0afa535fca93d4498ff7a5e25fd70bfa9eb62a9b0f80c2bdf25130926ba11c9addddfd00300a23913c2bb1d00750000c6e56a24a940cdae14ff5fb48873e685f199ae7cd0d4f5b00ff3bf3ca2c64b55b6811d279401b60448173c50759ffe1ea7848d0751dc67b09910b91c27bce184232237d0789484db9cd74ab96edfaab1d7ce8f8356655066d77ad272f560310ebfa9b6167c64a52dae22c6f9309843488e10164c2eddfeedea0708f40cf61ee3132bf40dc4fad6a13f09445a7217cd0c33b0b02cc64c8126b9a475e9c649"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (550, '{"ob": ["15151515f6eedbfd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857bf90f7c850bfd74151de088900db3735e474b28011b00a15c3e9e5d354f7e9c422a288d8233874b85391359681a203b4d77fb9bd70c14a3ed188430819923ee8fbfe867bf42e2005fae10cd1d8a973158e0351f04a92dc9c5e6955774e7901cf3071dd225a0d1f8fa70ba0804f37727eed4ea72d57ee1af389624339160e0e72653c8d69118b75f4e61f3ee597fc21450d929a07b9cdee17e0f8333070fe5b94ae4d91bdb6d97518fa5f3cc125214966eb1117af611723654692263619e76bcb3355b02b2f665b30af81192f0639d5b52004d3dd354620adcf296f9ab87f589e945a63166b232a7b8d8a1010a3d7f21fb69524564746661fdee0ae53d7edb8109ddf3f5e250de88edfa9412a4759d1cba6b3cbaeb49f244d928d4fda3f26f7c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (551, '{"ob": ["15151515f6eedb52892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857f4c971c3a5f283e4daaced7ab753b12a8bdfa1f8ada06c38faf9c33d266058403f90364229e1445e8f113375b8e1d1470e2c5c510a5fb20e502ff0879fee99580a0a59358e9c94bc57d8b576ee7b7ea2385bf06b4832e5e7e3b40c78486c1f54c84f40c367fb04edf645206d52aea416d378c121dc175118f87f52dc173bf261d289775b9b8ff274faf4e6a215001edec73b427a4ed0b6d396cd8b1402e1287512e6c34a49e4c523693df0f3071512d1540ddf4391d367f837449263c5dfde7827f59ecdcf78bb20c6d3185bbc77267dfc12e74e0efcc59e96eb679061d15a39976b01e67ce1d7486d21b68e81a677b05b920d0a81e7cd5de2dfed8cf5c27ae2302a5a7ad89d033d22381b40a4862c0ec62e4d34d4b3f759c4dd35ea9b18f17"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (552, '{"ob": ["15151515f6eedb46892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85006bd81694a5f5e1199b58f86d68661dc0ed586672ec90023329000671a4b62d210969364001ab31b505ca7579f65e6d628f95c5a0dd45bd3852c3e3d3969c000d63e8b2e0fd3f4ce286d6e6d5b3ca72c73d74943c1dc03c7e6d840dbcc873f2686066b625fd4eeaac75fd30795f2f5df71d78897a1b10305e55a6d483a70409a246b518840c34ccaecf002d2004c59cc58d9bf11b62da4caa7b19b5c6ba9cd004a7e7d14e515bfda8ab7134edff9ee1a5832416f62c5eac9c382dc5817e05f34b2fbb697b7644a32bd93fc24cd7b6db785bfcc03ef32367454a29344210ac488306198a88ae0bec1110fba8f8a015d003c2e8852ed6343e9fe574c1236b8de8fc0962104dead6e3821fa8a61ffefc2beccf7a0dbad37e63dd6df6171b19da65"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (553, '{"ob": ["15151515f6eedb90892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858d970c22e607eee9762cff8a20b5bf705ad2f6cc1ef565001959b39f32f34d7cdb1c3adf84b0a91527401d15cf10fd7e0a1b913d6ef46c0f5bdbeda8b8d3cb1fefd86a8b470d3928c810a8c3757b1e5911788a2b7fe7aae2a804bd98c080dd22ce52fc0f7c442aefc3b1f96b0dc39cb3a1232f345456c8354039e06ff321fe3124b7ebccf3d4aec2cef2306f87e3ae65c6ad88860931e64e18382d2d9f3dfd81553e81b94d423fa9c3c0207da033d15d53110eab27636c08c39e018591fc0b7c3ea66c416a9b6025c75a5f38c99ce86715bbdddfd8dd691398ae27a3045248b4b16b9208603f364cc43e24bb68e8fbe952adf7c1e5eb3a8f702c497f9f73f2b5b0969c5692c9dd0e3e9b63a88f91132bf20852b1747aeba43d809036287b3bb5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (554, '{"ob": ["15151515f6eedbb1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853042a10a785133f79436f3080fe70df611974df8c8c2f140d9af3a656f8c81e517669a1b00c0e116e41ed826b2e6c90f7c7de37fda6877f21e988640d85aee710c3722b93ad0bd05168d00ae2c435909b9484d557423df22484540d0c034f3befb8c20cf2f9b1f2b7e4d955e2d494dadcb822d59464e7f70f8e3e4c91028100b7c9d8a4883a0a54835dba45b7b52eaa60c1f72a09e03e41013d8c532e43682fc42a90ff9808d390f3d3a8e273ab363e18ae3ac88455b2acee4e529a2c7ac0a9a5da96ae0c6922a4932b075119ce41a74dc88517b1e9c1cba83f8be277de282112393c923baf1eae94fb558f4f8174c25518c3e8b472af9d06d9c6bb6201b67ed5894b28a2c05f98b440f9a9241c290a0709c1f505e5928917a93c049db2d13f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (555, '{"ob": ["15151515f6eedb7a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85821440f105467d02050f72f7d5da85c151f5ecd13015e0fac6ff03129cf9b8e38e10e9aeb4cef1ca6790aec5f67f535e5fca40b0e14321ebc0b615516b2c03aae53bca9b7ce71bb6ef5eeace5247e0f81cadd42cfcd25cc891a339ff2ba8bc2bd7427a3bcca199d33dce00ed68ee2bca0fa2376618e1bbd346c5c38f0b7b82e7c42648da1974ccd3dda5d301b40ffb05cdb17d7b26230f629e177e24fed36da035da5d353287681b48d5f0d70eccf9c7da3b5ccbe0a8660dad6ddc8fc2ab50e73b3d5babf001c16299b26609f4d3b0b342c716c16d5d485c5d9f1312fac9a07d5f383787812ca6470b8c4a21d8a9a1520867b0bc4918740b99a4bc0d4122fbf7f46c1a1d6ce7d8b6f43de03c9b4dd955459d18ce717a4a4306ae6d4215236e12"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (556, '{"ob": ["15151515f6eedb29892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85aee760732342c7b87015b46ec8d5d6b7e68cb30b557abe80e7e03ec6878587bdc99c34b9436e278dc89816764336f428530a4557fb046b5e21e04aff4299565480e4aeebd15e784c96d6a28ac7c1f5d3d6e5eb6ab7c6a292697ee4c932dbe7bc81882d7a947c7257ae0410ab256c4a7c51a92dc83817de0cbc4b0bee0cbbe712c62db2d311589ec416c3abb799ed6c239ccc82652d60ae56fad86f781c446b1aa9863c4a9259cb8425a65548ee62eadea5fcad5e7eee82eb1f0166e3917481e81c0e33e645c546e6813f1d84e322d7aada192538c03f87a680b6bc350c268cc8ce2ef0d5f477d85517f225177afff13fc6c4b672632f37664d4e58c30db6cf6038d62f4f200b14967a8cce068a7b6beb26a11c388123812f9bf9deadb3a9af41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (557, '{"ob": ["15151515f6eedba7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85eba064aeaac5f4f2b4f6b4dae5df4ee38b62ac651d8f941fe95347b81263c7e17a67d23894801fc78aaa1246301f6dfc2e5bd4e936fbde120a72213adb19c44b96dc6aa9b2e5efe5a58a5d7a366314e694cb07173c9430894203dd5a5a5c5e68fd0e7d10dd7ae0b489b0c28693e24fac196e5ec4046337173bccaf73cb089b21263f4eb0adf46d646a55e401c0c699254a14eddcdd9ac62af9ca7585fea5a33bd2947fb503c1bb20e2e1ac1a930679ac738538b7048e8fb5114f9dc115b1cd47786560a7095ef02148b75decc2de2c83c3673e4708c3254622a92d5bb700658bc300c22883d95919755da72e066abf8b9d76d76b504dd7ff5a808cf915aca405b6fac2c79700ccccfc388b0198ccb32fea73eb4ad4365f2beaba2f4aecc9b38b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (558, '{"ob": ["15151515f6eedb6d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ffb9037627ba3b01c4bd84f59297f9159a8f0643f1898c3721dde4da1103318983539297b78bb1866c0454f42e78cbe2660c032b0a4426cd8be06ad921f8cbb7c53b43924df06fd38c84912f49cf8d5655def7c31e40efba607e70d976989d25ab119bd884ba8944f6ad5388b546cd7fa3e10f0a82a701155b3fa847cdca50f7bd74736dd83bd54a9dd719ca1c0b786df00d1f2d3dc4b2acccf0f928cecce303c3b86b8a88be462b7a583143c432fc1d5d6ea79c3ffd1979bf09d873332862110ccb7452f98108fd524f12a480d781a8387ad602fdf37260f6ec7d7ae103cf018e40864b61387eac5d8d2a07811c3069ae3ad4ac821dfb7d639d0f06a629378807361216de89ca2a456e86d4da5b1645d51215e603f33bb33307d1a68106db8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (559, '{"ob": ["15151515f6eedb6a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d315599b007223ab7926e9081e155845359959790558692d123b0bf3bc7f80fda6c099016b621b5d51ad3271e4d712728b820f91bf5e1cb03745c5b1380651351ec04103222d6d6fe92337428d381820cd10c4bac4309bfeaac9b70da9a1eb0ff860c045a8e8e1864f4d581fc3008a0f829aab31eabe36ddb440825c4ec0acdb1a1b8832c0667a66abcb60a77ea9f1b071cd32146d0a90c9c0470381a0a457275c47151bd633468f3567b1735e5d20745f1e5d73f0fef3670388c0847a01f263463992042bf82111299f7106d656eb978d751fe94454a91c5fc1ef9b1e0024c0935b77dc79800e7c2a98f8d1661a9416f7fc89d70876d0559ca3a11f86745ba641820285f4a9b0e7f9491b926be8474798744e1afb44e9f3dbdb5a5ca54f79f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (560, '{"ob": ["15151515f6eedbe3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8509b5e7c4089aae494e1626c5de19df9f6cd41eb75f0e575dfbf01b09014f7322d24bbf75ec89dd8158a5aa1fa5f490ba7b7fbdf5e0f7800f1a7c1c7c7edee12a93522f4140d22921aeb1c677f546b2993c00372865107ac96643a91a3547b1b36be10ae2107cf456d73c81aaae6994b76628e0fd2f94ba4ee17c7b3712ca6775da8543f1bdef1a386ff599d3fdc4c784691d353707d5fe68c1f028551e9337749d2549ea3f6c1aa29f4265fa418d4dcc3016f35c3ebfbecb3d0d4de393bc71a54fd458a50203f748e763d9a3f38ce0ba2f729331161255ec2ba2a573ae84958e4fdad73666c36de8d66a0738bfb7068f417200a9674456fd1b2757957169290aa2b0f8ae6297bc4240e85862734fccbbcecd4b495f91b0fa086c176d1a105920"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (561, '{"ob": ["15151515f6eedbeb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85caafe9ee3211b618a643cbd41849c1d98cb56233a8db575170f3b7b84bc9a33533248151e4c24141bc29e347edb3b420d14320a13d6c56779b6892457de10d0a4cab21d4a7dedac95a53c28f3137f6833d45946e491902b279060ad43e6042b9d10384167dfb8ed5ed56ba59dec1f5f4febf64e3803be3df2018e12e77eea4740eb1c2e3ff6405895c6fdefab78851596bc344aa815f5c12149dcc26015144fa41b0eb0f5ba62b257d38825d7cbb349ce126f76008d9e0e909d80a9cb10d77b90ffaa3657e4121f8f14d00a8790afe5be761497ef1034ab128e8c31c47d449eace89f15f8d3ee6fb535a444034788a8cf9de784a4462b01f2ce248249c8ca2a074e61c22da918d484eb851efa342ac4b18d3395ef7a95dd1a0d93644ae0d5c81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (562, '{"ob": ["15151515f6eedb70892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85164dee2dc9e3b128c82aeea160b386d1bb59c418914bf81d5bf261f3412356f2c6149ebb566beb810cb0908cbd312e85815576e41bf01a61b354d7924cfc3a5c0c3aaf5886cbead677ab0866380219a0973f72f4150725da217304d85ffc1b6ab3e45376ac439d8552e5fa80cf03b703e3684e7d8e20cca76cdf6b6bf1afdec4b2da710e4c6a81764a389503daf99313408416d35f1f2431eb4b7781d75eb2977d56389d0386c7d8455cd964b5fb525340c6728baee72554e1a83fe16bdad2fb464db988e0b0966b44e0383027823ce3aba86415861ee3ac40771445b56912a4402e005e494c006b229fdba85ab33688d25c939da740cd20853f449e57babaa3d502963970aa4e9c6adb52a94be32c6da6d93a34a6e7c6d61bae0e6a88a0a486"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (563, '{"ob": ["15151515f6eedb8b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8530c1cc1eb8049bf7f0f16cf9c4c792ca1fb617bcd55a4e04b475c54e66dfc213e38bbe7f6f27ee47a57ce8e4f7a688c489df452ab4d7b64b8b24d8e604af4551980fbc060535371743bce782d2d8d85be86bbcbec4f094ee5b3609911763752399b61658ef431a112e339e07a131f7c9875ed6909636a8627b3cbe3cf6a20cc7d99edc454c9b37a215cd4d8def5f442b03d17b180f1c4652a4e5d6991340878e8314e9a14035ca37af6bf47c099e3aa4823609692c9642fbbd6c48660a16ea8186293f02560b73af0ad032ad73f1d30234802535dac0628882d1b66f11e09a608846427e601aa21eb5a3bc5d07b11393b4db76a74506338ed9a7a751780252bef74fc278ed785c876749121e9f65f96c683a15cb3b222684857600b226afa965"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (564, '{"ob": ["15151515f6eedbef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85be07e530c72f6acb151e26547b04c9bc52a28d533da59f568593d4509a3594dffcf4ee526689a0e43487e67fd616839757d8fe8f73a93b1e1047168b722ff5e95350835a43e8ac62a507b1f3ce5a5ab4914e106e0f56b07effea34f5aa2b81c6c5456c50c3df75fde7b2e2248b609fe434a6dcbeb35315d109d645d20aad22499d2b05b2245d8fd2bd3cc3c80572a6685fe61e94fa609f8273475ef68a176bda33786586080c4a249c4bde47e3ba051a82aa835e92626ccd287c46c0caf5de3b6c36589cedde8c57d5f24b0e0f911d66d3a2c9d1630fe82091f7b3a90c2aedd1702ef72015ac820a8b398e490190cf73dad54f349c0ecfd74a1c18fe4bb74082866567e77f5aa386aa287c26d2ee851cb202965d3b79bf0be4fdb5b550379c56"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (565, '{"ob": ["15151515f6eedb25892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852328ef4fd4f2130dfdeae291795c0b0c2a1ec4672dc4fc5316348fc4a0fb8a6325fc9f63e4d8eb5461b871315f153743ad2dd5e8388c435b147e50e1a78a29d46fbef2377dbdd43627f0322fdcd8aba50dda22c56a0a58bbcfa34e5f980b4a5b64ea6127602d9e1cf77fbab2fd834ccbfd697767956b7ceaddc44580fee711549a9afc23cccc8a9afe13c3e09a3b9d7af793fe1fd84aac113b93ab1f6cc37977ae24b8831548c60bf4ff209e941b3f8de37698b33174d6e880d96dd3b77c2f16c8a1ecbbea189fc56b57b832c735fefdcdd76cb778c735ee1c5c9645ff9019dfa7a5e2d69eec90eb1d3c4179075b431b5aca722c9cbec0f56355e43b56a77b14502ec41cfd2117e1afc9e741085dd47c0549ee1c8a91bb29002ea5bd54e27154"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (566, '{"ob": ["15151515f6eedbc1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85510c65ab6853de41cfb30611af77d0e435a685840d6799404f3cc8962e3ae64142069ec88194b1d72e954686d34625201f391d3ca8b6a91a6de7935a32307bdba47a9606ca4b9be5d365390feaf647e7b41bd4857a76f0c56870dbbcdb077ce8ab30da03911d3cd35a7652446adc7c3c01baae3e809996f0382a378dfcbf557f59282628fc221e01b26132abc60235b299d84e767e8242ec07a64f8e02d76e4363265f37de6abd6d1048b88b5b8f52a406029d146d7172647a4d62867eefeda61cc66d0c1d232529f75dae8e8c981b409422a52c0f3067c67561be26a47ce37f8ee2f7c33382dc17bde0c10593cee8042856ab7a7345a87c4764c538c2f0af2bb77b016ae5e660db78452771b3843bba796b66c0b26876b6692546b54ed7fa32"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (567, '{"ob": ["15151515f6eedb32892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850087d2b5f6a3f64caa3660c26a93dc1ed62a3b6f4b409e9ac17fd01fb1f893a6f551a8d92cef5f2a0e5e8c69998f5882f825ee6a420d5c8c7a2d57035db220f447b28f49fc59377357f09849f1935de3cbd928731250cecfe7c37d59fee9962d7e23af1fd53882c6caf6d261da3d791698ba1120659cb52f0ab566960ae0917c4843aef9e7dd1eb872fa7a34970aa68a4366354bb9d57bd224fc1d0658a5e6d1814a4dcb7ac5e3f39a3640ca38451fe7a7d148d241048770cc66c66ed5a0064362a459e713f0dea7f1e2336c42683f90a3c43cc9fd4fd3583a471f9cdc0c5dc2e069d641c598db4e4a6fb0e5e9b0a2cabf6c1f57875842484b4d88a6598fee77008e8a184ab7ceab3e6f5b871d4658f7275eb7ac6e259ccdd8406cff99239d97"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (568, '{"ob": ["15151515f6eedb9d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857fdc13928a54613a478c1e5a34984d6176c145a2efd65dbbf0b656f3ecc6c2cb97f2f572c39f5bb366f8c29af1e9fe66c5642e21bbfa39c4be991657efaf197c5ae06267bd6f9ad053068d6ad7351871f86ce1c14ae872ed8de1951d75e7fa6bab6a125a207669d44580fda4b04d101dd2ef7e0653e147ba655c1edb9933cec0fcedd5b5099b7aad5e452808652a75616a637988aafba47e589e6d095dfc13eab28bee1909aaed72be90e24dd417cb1e503f28a7e2ce9db2580bebcce8c667b68c795d5bcea20f4f9e01c86ff157a437d88b8165d146b3e3034db9a17bd0084590e6ba449692bf9064d64fed83b623c6218696b215fd20327eb5f73b5fe3015519716a4cba0379ef4e19627f4bcffd3fb2b6a53598501f7031746c6a913ed0b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (569, '{"ob": ["15151515f6eedbc5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85055542d3061ef084b0409594d486b1dfba2e7148b770a3bef29b57ca5ea49ec7e2c4f38d223a328a50f4a7c1010e166410ac50b86864599bbbf29b2acedec8141f712a00250c74157e3f3148f69398f56214438aac9517a39a9b3f8b9a53a7a8fbf8ff8c36e56c3fdd556eda9b07e001a2d8480513c094876c504ece8580d07413c7c783ba0e715c47324d79eeaf1174ea359afe7d4882208e1ce754e1a57cb197468397cd8d2350ce31d67bc6c5ab56107d29cfa9a722d8e627c83c1a03fd069118eb0cc328cfae7006976f55852232d8f04d78fe749bd3b24056cb4fedccd9b0a9b1ab526300f96e580b3dbe9b25827ccef5bc9d8a7dae6600eb82ad31d1da5d8b5f53d2b4d766016b1b6cd6701506a7d7042daa03e5bd4aad18fc0dc5af8b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (570, '{"ob": ["15151515f6eedb4f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85665ada031e850c78db0e884d89d9b48d8cdaf9bc0522caf399799815a0825c3033e70075d2ac61b97c215ea8f8ee7568550ab9bd02ea6e128a0992421eee529818da104cf76dc6987a7d5dad76891d2f5687256b904b0d6b4e7c6c8e696bf878a90e7078f5cd434ee2c7f2f6852a8c91eaef227966147a8461e8044418db50f894b5a0e8d8509d97f333ffbc844a59549c8fa0dabfa0ec0d04c2c29320527301de1aad760061687be4e839b2bfde3cb0f907e14c02058588a6abc840264b45add19d922cddc6681628e38325b7f63d2164f440975828fab8b895fee7ff06d54c1dac30bc263a1c3390e8d34ec52e26d863eba9d199529d57bc2c8834944d8f83375ebc0fb287f90cb983a2f66f62db50f8531695ccb03a832c18dd0bc58fc3f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (571, '{"ob": ["15151515f6eedbf0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857c054a46f275afe8023ab6883e4950cc7b33feeee88aebff64d58fb4fbbfb4b4a0376b5084b043c42a4c04a6848121ba2ae27dd1ba4d32bcb781778803e4d7ef82937b4bd1b78241f70304fcaecd75f4e6f86839f1738e20bc7e2758c1d45348a40b1801a59501e22e4fce98ee24a8faf9b4c906b9a9260bad454f086c1d13398d09bcdc1df07b9eb14d90a2d0f835c35ca6e0f43370033e32cb4885f9bd112624636b97930d9812834f96b94eb88ccc0335eb78000d689bdde233f7582a32148f135dc4e9f33992538167f6e1576e0f88d84d7b593d26cc86561334e31b9fe503bb751e78ca7e855a84eeab4a1c627978a4876e86ffc68d2c0c9ce57b53744b34fcb04db2e534175e7de056d996a44fb8fc459ab3ea92a16fc88866703cd51c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (572, '{"ob": ["15151515f6eedb7c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85487a7a8743ce6ced6b103f0ff1793b479c5fb935b9a4267d6cb1a2b06b0619b4e2691ab56ceb093ecb6503f6ee306b02837022221d8d2f82ed3586a69ec436d4ceab8654c9dc117385be231f4c84a63e70cdd6a8c23aec9ff1c2988fef53d46dca924ac83ac0049c33d9b3f73a27c524f18fb00926ec83e2ffd6f3d9facabf125315e8170a1d32930db1a9f9d282f1fca741af1740288511726c376b3bbe9dcac53088ce774b39b847f28c77375007ce608c27d2f2698cc8677491d7cf2b98b0ecc8bdc5ca58d213602e73c5c1dca3488fd1224acf1d0460a64745f94719695d0047ed15e15a4d79926fa7443705a506986138d07798534f8b7444d139ee361b6ebd981d9c46a3eca0679fd9cf855acf9e95bbf2da91e7923c835c67fb35c23f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (573, '{"ob": ["15151515f6eedb2b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8539619e6f2001ca8c08ef574ba01453feae405dba14fc4b921e4d82acee2613e14b21d769b4a91d640270a4a925313d26cba5d8f5bd74b31cc7aaa919cb973c39018c4b6408fe048dc5e58317ab2cd5a4afbb6a1322855f7c1b23ac97248bc63d479aad790f7dd129d1741f8bafed84bab6aec0dd1f63bf8fa3dae6d10520a018f0c4c721dde859655982d576f22915c0015b8e43968377ed271b042fa190b732d8049793adcc97b85c7f6e9197ac9f28e47115c605516d196a2fd0c531f5ca546ac0a7feb4168148d530f27714bde1b44024e1d9b6ce912e328587f73ccb6af464c2fe8e584a2a7356120296134069863e0faf4e95242f7ea66739d4e1081b1a12e8d112163a5163e5ad938d93f580aac8b78c00477b1aab1809d802794beaa3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (574, '{"ob": ["15151515f6eedbf6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f0ed4192557c3a0bad71caa4a49a15afb27b89b6a185966c75aa0b29c8a831050a43eeb19939a129acc59506a865735485653b918fbfa5fb9acb14ea4b5dc46d4fb69ec97594ac3fa6e35eb0c5663f40ddfbaf525f14a895c4f0177647ab3b8aa047bb46a30ad85a1de6c54e0d02e5f07dfcb576efc579649827185067a07c95ea8301b7f1fc9098141b239f0d4e5fd4340b9527d5eb866251bdccb1746dfb7c7c2ba89223f9f9cd178d9fe52650af1d0024a097363cac4ea8ae70369fe8ea06841e83f7bbeaf8e81eda9b61e354b1119da9a80b4354031a9eef2c1a5bd52e0d8efe7e200731f01b5c2fea0bc235517cdc550108e4d5acf686abfd7d1b66ad42f11e64b2aac60bac4905cbf997090706b523c287e0185223140ef6d2defcfce1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (575, '{"ob": ["15151515f6eedb27892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85301f9e6293f0138c157c9dde73c4ec1571f9802c2ece36ddd9cfdadccef95d5d5ad67b0c4dbbfc966feacd95370fc48493c2059ed29c2c1d807f14478fcab2dd8438e24758c1d1d25ede7ec57a629c22d6641180441ecad13a1efbbc934dc230a20b111b8c988ebd26a847b236414b845b1d7b2e56f82c54ffa36c4dc6544c8b1df34dc85ef3192b5ba9633f6288203b1823c8cf1ddc70415e807f3a9c8f8fd0195fdc303661fdb7ac69ddbeae682135875e4e44f8b4b228b03dbbb6c85063d050009650080466ba553caee6b39d0beb05a92991fb2cab8e8477cfc5412e420443e92b20c4253cd04562a36952a4eb28b4cb04e4ec7adc89e4c3a120950cbfee611b0f2bad8e99212cc1d8e6d49926f71bed167ebc88855839c4bf4752f9fdc1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (576, '{"ob": ["15151515f6eedb40892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8534cb4f9a732f5a0c77e032942ede1167478e086fd09e1da4b9aeeb7c16fbd2e2fc8887bd4463b1bf320b8fae536ba2f224caad775bfbaaf39e308e0cac3a58da238a4542068db4fe8e4bf7ed10aa7d7ebbc4959e0bab2b27b7c5772837990f37a609c740971ac3810c76408a0b773208d4e5f8caf9fd810b6477e55e9476d36ab96293931f871a56d7638234728a6a20e5a10bcade9243c99eadd66f1cf198118d77bfc6a025ed09197ed758a020ff96fa3709b13c2d8dfc74ff1d41824b79f36e1fbde2eaeaba71101ab8e71d37568bf861943f29c56ddd9b876495a26b6ff96df49ef5d75248067df68f732fa564f31895dfe79f5ccdbaa5803713d8781fac3653d8d1816ad8fa0654f3f5004a8111acf3ba701cd2def0ef5c120616563a55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (577, '{"ob": ["15151515f6eedb2c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8540d41852591d02b0c0d6b08d7f53706119a525abb5777b7f1ba676bbd839f07147075c44c93646ac5bc0fdf6440980d28033f0120b561e81a94805232fab75afe68d5feb59405bb92ea5b1dc1602a83a908e9ac77fbde90ae6585378797abb24816365cebc2e564cd90aa89c90ee436fa55f9e75a409ae8c07b8f5570fb9cda91c95ab6034673ecb5336eb099c880f2f9ea6c4e9eb09538fc93883f8a0f7b9fcc91195e0726e85aafb13506585c90623ea7d2a1483b511d28fd8aac43e820142dcb7740463bad8c9d823cdc6df4bb927b618845feb2e7808a2e99d2233eb3bb851eaa25798704a57a7e95ef3bbf064a9af8163f2860c97303198fdd860dbd362f74e4391d67bad29af03ca917b36136f4683b6cee057c86dadd4427ce8b3b645"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (578, '{"ob": ["15151515f6eedb55892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8588cdfe5fe8dd15ea5594d34f65ae48a81fcd8b36a9dced0662a07f1a3347ec761fb21f948a7c743a87c296677b976f34fa08a2ac5937231512843b0e6daecc4c23107c22484ce62e787149c0523e9c9a9728126040b772b08b30414f1b5fab77ec9244152fe056813afca65108e61ebf7955eafb59280cecf292726339824da153c61b96e5f5871f6865c275ca1c01e123de030e23067d7fb6cc9ccc3ab5c0b999b3b9253cef6e14035d0832c97f12c55ddc0711eb07841db757fe4f964dc9eafb1a18d8fa653fd57f4e818a15b213d05f04ba86fe8d3e0eef8cc3313f86f1bf763e29d54ca31ca4ef82daf85942f3a5557a43fdd4a27fb25ee7195229948767e9bcf9c3ede9e4975da303cb00f7f2cf45f8f2dc216210f2aac04baf59ff938c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (579, '{"ob": ["15151515f6eedb48892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856596cadca54bef4ac46764760835484bb755de7f4b290f4499a61055aed82e257706a4827f6e64e3d6ecba15cb6eb70fb59abdf71f85ed7c92cf5fbf6db5bf6772445b479c2c1a64fac7b479f4185fc9c677cf2bd996aa77e872a70b8923c5b08b1b7ee7e2acefe512639d4dac43be4f8173d3d10481104d75bc6b8d3ce3c6aa26ea85eb93592084998152261cd3de891f36cebc61e4d2080e351c290c36b4683e097e4e8c5dd1041618ae604c830243bae41e4976c99d0b7d5dfab53f2939c2f21b367b557bbac6c4fab5351858f2d5bd68fe1298965554ced115d2d55e9291874b72d92c33cdabdb0f73d6fa21d496076857dc145adea3fd7a787f3e3de8f8f9585c21d5b06c83b06e1dae94149dd064dbb4213fd2b8c62171aaa11c650922"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (580, '{"ob": ["15151515f6eedb65892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8582f817a196f48a31df618988f43967a37caf84d5522631b5b7520592f94699627e0df2c31e7ce47965dcd21a50c618052e568555b8e43188b763fba9d11b98f5fb56ac3ba171c732d981e663c1f493e09c433072db4914a079dce354584750db5e84dbe2b48e12440121103021d3749010d98a095d901de1482f27dac280b1c61de31f25f52b51eafab8e96dbb70c135b748f5a7b55a96b636190779050b0baa4d09f5acdb3fcb6c74a54da820a4e6358ec47e37bd63c1ce02c48c3cd04cfdb5ae4c738b07ba149b419d3623401b2db32cfc3b2ec71d44ff1c9fe5b39003f1f707cc2d47120e549e416c604d0c8e7c85b8ca818bc3f8055bb789dec2d5395d4c873729b0ac7ccd3262aad7d46e3187164e18047d1f4d48d2e9d6cfff713a0298"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (581, '{"ob": ["15151515f6eedbc4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d5233bc64037c6608bb17d4952f1e47b517d9541414c6cb283f30d57d9e731e9cb2a20d9939b0c1ee9ce4d4e8dbe87efa214ee66448a458d75ef6bad13c59bc934fa951f4434ce3c7cbc9b1b179f33f34c6995cfe8df945af112337aed0aa7917dd7c1e5de68b57691f6615fb0f27abc3d2db2fe437f869bc415332fbeea61208adaaae4a95321fd8752abadf5d0e93335a035dab549db91a57c6857653798a55eeded6a020e58dfb9deaef49008669b501738f68fd764292506ab3da78601cb5ca7b9407262bc98b9387829badafce65a608709b0516c21a6c6f920cc96a49c052e1c580f020dd23718eec8d0c47eb8ff76b78559acdd349f95b894f0a3ab289f2f2f0b79cd4c3d4880fb84629cf3017ad61954cfbb9bd9bcb53ef7601cfc00"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (582, '{"ob": ["15151515f6eedbe4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853bd3ebb1aab9e278ee188dcef32d0c1280fe42aadcfb35b67855174c85ae8cb96ff48ab79c98ba334292a16d39873796f8780b56e64ddfeb6a4bc7419d801d4f7c4d8a58dce0090ef56e78b2644baa99a18c5d8ad49eaae7f3f38f0836a933d3bb1af9a1de1c481079fa98c43f2d9bb24a516c3f96345f1a4a45f73130e8cf1076e60c4b42c08855a67004741e7185535f0c65c4a0ebe00939d6f5039f655ccbb005bbc519038d42e3bd0341d8a75a7632b5e8340267987ef621f2ee4bcbdc8a220710728496ba131aa1c09afbbdd69e5b71ea2a61d91fd007c01526fa652cac16c9d267892bafd7b2393a645f4bc53195a940493c96df6b042a83ddb787b72c63191ca6eac204fbb7bfe28e424c5a9ac052fde3f3fbfdc02235df8561de8cc1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (583, '{"ob": ["15151515f6eedbb7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856990003f0b1a33b95fc4aed85e37a5d8719fcfe6a91a7369b328cf9c3c647cc77dc8c751e93d0cefcd27ae7c90c759a1dd37f80fa02007c738729f5fa30ed5120bc67aa8a3b338165d3d6a6dec2f1bfc667a308809c92ad5066a5770fc3de5ff902417658f2712bdff2a603f0546895e7a5315df4ef957cf445fa7dacfba23ab90a424b76f64a8a6e717d7d6086e57049b57487ba7813f154bd3b5d7faf82ad7b4676004936d1420fe2cdabfa2e6b8c0514721211c92acb2943f291699a2f4822008a7da19a5627cf201d0acc99be75c6a6631a8b021904438eb0b302c6ed62a3c0e92d585c7d217b273655b8e82d8629ccabd169a4d8b7dce71806b0e9fb8f4587fcf027269987fe4288ca19facf92ab404304446fd1f40598270aae7e5c8dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (584, '{"ob": ["15151515f6eedb26892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85edb36922106c73534b845c8e73b40e435845a861e12c3a3389421db9ff898a15c480c00c5426da810e356c670c4b1bef4d56ede664ce3fe7e04bf87b01a678f8e77d8c8adbd686b7d5730d23617695be34ad8a1d043c4103cacea1884da984f0d65e08b4e5e128aeb365c4422a4998083bd68e0d8328c5c079257259d61717f1cf076858c7eecea83f4b003d67feaa70935648cf4ec6180ba48106c67486fb7fe3eff780b3a07e2ca660251c627f215533ada9b8f6477957493650862773f4e8193967c14e5e8dc31865c314ac17ad695f85fd1f8cc8559c744912aed6807bec6e379bea19e4c4bb94916958d6749d71b30a61702fd13d85b2cbda403fa0dfaec57650af70f06b000c39d118bad4d5ae4de9863393312cbab2ed195ca46d937f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (585, '{"ob": ["15151515f6eedbec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8546159bc3a4c466b7404e22caf24da34b04d3115412a30cf6da9d6a568fd9c8a34cec5a1d2d71d037ec794c7d40dcf89ce64ca9f81f69896893190d0fa9750755ec6ae1186ebcee0e81278859113a49b665c7805f9bbcf1d5d8a5bbde6631188647035e3916ddafa8fb1f698cacc627caf956ddf41bb20c3175a4c8c2a640f612e5f0853265686a4bc124a7094570baf041c3407b78d0daf8668fd22146253e82ada8f3b87fba6f96046cf8b01156f4ed74af6f6b006f7efe29d6b16c3e2e1b9b3c629df274ac86f27760b9523c06bc99cf0cfda770e0f53fde82f656239447d994e136aada305aa45e79b3852c8c463d56741f2999e840bdc0d8470be0dc2b5f107982741167a6ab35f1e4ebd24494307afad607a420d8fea53220bf15ea59e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (586, '{"ob": ["15151515f6eedb94892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856b374dc6d4c36d659a74b2893fd6d399c2fdc9f276a94cd5d5c2b5a8a69c225fb46dbcbc094374a793a141e5756c44bd8d5a6f6c6f8b66fdb28a154336ba8cb03b31678bc54e4b7f6794e314bcbf92b373d88796f79d0fc3e48887ffe57acc90fbfcbda6c10316248330a3f581026e68255691ff989922d6ca92eb72e9653716e31ce410de266e76db18afb03b7fd7ebbcc23cbc5bdaffc87ac988524477ca213cd0261dbc60176df8e6a18a5197101689a15b83412024bcc763f9efdd7b23e3cf261166f837f533739d9349e0796ee2505879cdc867f764619f87fb9817e4acba7b5fd724ab69d7ee3b72fab0fe3747ff85072458d1fd539dbd80afdbf505b4b58daa6b27876dbe3573d1c7b3daf3cc3a42116de12de90d0f3676c11df19448"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (587, '{"ob": ["15151515f6eedb68892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d268c47356801f022b8d0c968d9489da44fd04539ea901a6f32ea7c0df6429b5bbaa372e325aa99b80a53d9649761e219c10dfc76abefc2b3d469af1b407e6e0eb4fc836dc4da52abd4f46db9ee56f8db67f812bbd428dfae8c6a207889207c5756e8bca69ddb5e9688dd2cff4502856a7bc1f77de6e1b904be0f470f69a9e7ac0581a9c7d99da7e0acfcdbe41347ac062ed699e737165eb3ef00f7c810e3bea6a0d18bca7de1a4d2eafd5a8c866f0158c136879dd5acb26c4b734e01de51c3aa6b40a832e4a29e627e95216082740ac2de2ed3851fb2305c338c7f56c6e01c4dbe5597d60e1b5ec353af09c8efbf85e8d6e178b63986f75504b03d69a7b6e079ee47df23847257d2bea241addba70ccd11d8ce754f0a5deef99066821deb321"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (588, '{"ob": ["15151515f6eedbad892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a7e94c61777950cb42c7a7c0393534280934d76511bbc461f9b5f96c02143d9780286f9b51d6d652a7f3005905fbec457d9b6e3d7eea0929e44c3c8cb5179cc466d475985400681598faf0c7b8228f93dcecdd9be91bd26f51cb3c8e2bfdabf752c4226ab103f8cdee4452aefc9fe4b154b3e527818a25c061aafc7f6cd28e09ef295c47971121cfbd2d2e36869c871e7361d7d4dd6a13b0e5ccc21f5bdb148906ab4dbd61d9ecd945b6531f3cf4eaad823dd093a324c46bf3361654d28a95bb80c9bba97d50f694fc945fda468d24913e2dfa8dacb455ccd37e035e5d0f712e1fe2697f84840e3aa2c7ed08ff91d4bb325fe2a61d7801be2326ecf11a07ad14db8d6e3323bc26122189a2c3018d6053110a0c940502d11c3fa4834d2ad3b7ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (589, '{"ob": ["15151515f6eedbb3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851de4beb911d9fc03d1e80962db1270a1ee62a2e1ee4a4c27987ba2d88bc44b161acd0cc679c4db4befdb3c90c6a3102c2709667bf7057f2186838d66d6e5e3afc78b7e806e70aa64259b1eb77206fc09e58be6d7a25040e00e751d669684e5e5fe94509f39db4f2aa60d71db9fb633ca4a3ff362cf863e4cebee67a45d6090c74f060c194da2ebc4e4e33b48a782b10eca5ab5fece0e72832838e5a96e56885db0215ed90de02effc5fb76d60f3f00efcae55e7ce63db5d51b3fbe2d89913b0e448f544dc6f2b4f41592a0c4fde2219a5e55b9b6a791550166ca45607ac6c0b7ef93cfb56afe3f1a0fabb18b20fd7eb96b503e9ed39e7888f921bc9b7e6ef0a9a49f5346fd84cce29e80ffdcd8f95379dacb9fc35ca8f19949df6105de765877"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (590, '{"ob": ["15151515f6eedb77892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8576ae91be7d9fd59adca6b5907d2d1f43f64cbf208f9186346b6d86437a1023193c0942994a70d49ff3782490063dcaa95746e0e26eae133f9bfab84bc0cc17151878e0f1b734f8c776cd8a23ce2151f6b1ca9bb212cdaed7978282dc377e6ca36e1a68b4c617e78af3af3ce4cf6a52edc3e8d4f252967de387c9eba229d685010dda4fb0ea2a41e70b7270295a1f7035deacb8635f59820cc17ac6f98dfdb871736966d1675895b5eda93eb83035647e9116694e21f21b14c94c1db5dbb8a3b6261c5f1cb258893093d231e7282aabb29e736a930f17a32442dc6b7558b9fb8b328e27dd9645a9abc96d7a5f8824fc9d08d749573e12c22612263d3eb71251d5123d332838340cc0f4697dbfb52cf5bdbe685eb2c4b5bb3c5387bec38313049f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (591, '{"ob": ["15151515f6eedbd1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85fcc264b1223ac3aeecff97cc25b9c08012e59ad13b1810788d7e44ca8a9371ff55bcc01f18412d2a742adc6d0d5520832c7fec2c55204b374c2ff62ee7b8fbf80999993c1247b76530ad397bc764233173ffce56180f56c6de42472601025489d8de57c24cdae01745afc279ba0134a8bc13a5bda1a30ca6f648a4560d033acadf3ea6a3e2db71d5fa3b28621ddad9d57bdba2bb266b2fe709ce9e4154b6eb24dcc84b90ca16ed7e7f61b6b5fd911a723af630971c4f584c1064963811ca7f5be9e4b650d36ccff1aa49bc6b385fdf6fd7d0f38b35e1c61929bd0257c431d5ab85ba4ca2cdbe94b97f4d22741f8e6bc25276cc2a561f4d50f50cffe3fab183fef54767825d3b77733919d4de5fa4cfbb8b64535d334de6a445288d5a2c2b9e5b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (592, '{"ob": ["15151515f6eedbb4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850b61ed4d6cc1c8f6653536c030c2c66fe6312d633326210d8ff9d8c3fed0b2d1c1d902d9f44580d91b76acef8da9c7cfd77dfcfc686129f783e8769e8b3ec5bc7504346e35d3a4eedac5acd58f12a0ed1d016590378cf22ae55b784a27f908c99653dc347132448a3fe408a47b59ec8d967bb71813bf5d538292d40137cb7ea3cc5a5ece5ca5f06efc1eb115e877798a2846854a56b05eb5b4ef0e16d140abb0763ae5828c86d02a45dac16eea56021c4cfe505a45802dc4c81d9df20d76fd3c575e0f9bcc8285819059dc24fb76c090c5f47fc0bf40c6fb4dee4c13d5fb72da8ae9df768ad45b2080ecaa50cdedb374c462197bac8d7177838a7bac6023766e7ecf6942eb221d049773d735b2020e815549ccd50743033ced496a7ef69ce31b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (593, '{"ob": ["15151515f6eedbe1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a9590028c3db3cbe9112b66275d97c6e15aa795265174c99198d92d6894309d2ce30931c99eae822457021dbb76938eb46e39fd4cb2bc1188ff54d0987ea8f0e36b9331ef80628bf7314a492ff959d2b7de59f194cdc7e8390a422a9beadcd28773e0bd62672d53b41ece996940aa1ea1291ed44339f353546808f7e2e2a19f6f7b050ec9e4febcdd4b6942789270e7759e11df733e5100ee0b2bc7a2cc84c3f2aaaa6607f03c6a6577bc67c90dbcadd06745da58a5ef51602e2388285c006e6c665e56393ebf13b79924fd07542ebd2a1eeac1cadba0eb23acb1a720baa4b40318343ce0891ddc48bf84f8b0a71374ea6bd7416589e3f30316b6d6f42e3f3939c79acb41a632e0ca03bee72a244c755c1ca0431d2d6a97ad8f3e80922623880"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (594, '{"ob": ["15151515f6eedb5c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b1d3bcdf7c6512108501a5d4b454d2cd282fa06fb6c815c40629d798ba866e710219d570efc2ec696fdb358e77678711425b6f3dff865e010b8e0410ebbf57d71646299a49d0f63ac05c2e04d4af283d3b4bfcfed952655842350754d78b5e2bed292314aef5307f15b58fec5847100f2c3299b5d18911e1be6c767a38df1c8f9d3fe3204bed7e193e425bd1ed0338381a4c2184fa9d41a680a4fea02a64bee596e39730b60a53b3341c394517fd7165046ad14856f2666cdfaebf7bb84d4aa35e231e5d8889fe250e9e91c9ef0054ab8a36c18bad2f119a07a9742a02209cdc45f11947d2f741e1906cc33d21fb734ea60f5ee73dddf3fa6a2580495b16747c31bede3bacff4614294d0b27212e41776889b1c802700a37027722ff8f7380c9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (595, '{"ob": ["15151515f6eedb7f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b1d02e56aa500fbe3ac89bbda6081247192f3670dca50135c063bba0e0865d967db4fc8c642ef2a7c712413af8244351d6d9eff05c54d67312a840ed9ae050044c42138c5b69a2801f71e618d5294889bdcbc80d6c92c8d4b01634b619e28bb2c849c1649a4155af4253ec5132ac7ca20681dc2c68c2cde6ac1413d795f70f6e6284c2e04f0a6f178174817a6a869bcc16aeb4967acc7b74363faea310b23c4a4647ad91104cf3e5d777c2894b1c3fb952b32fb9ed0162e2a8303976605024f03be7c71272a29087e804b2eac76a985faf2ca073d935834a9d2e957d4ba641d9c159b4704b3e7912093e0aa1b9e32289b9b72a47511eef05993dfd4a85a42c4b9cac5c6726dc4b03c8ef77be08b9bceca2afdb18567aec6717c2aab974ae85d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (596, '{"ob": ["15151515f6eedb64892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856e9862d44af613cc0a2ba5e3e9706bccb35599919e25a8d5a52b2b9bd1095641bf666c0ab517e8101367fbbfd1e52dc94878dd958e67d6d8590af53d415932d04fbd49b1b38d12962d5d90cf9db7b5ef13f924f92731023eba731bb74aa4ad7fc503ebebd09eeafd3917dbdf3d030dff2d8739377304600c16fa16d66a5a1de14ced79091babf59be3e6ae5b994c6cba5b6bbc38b06c2c47f5c1636e3b228ab262fe2293ef0686fa9f72ad3ff062099250fe49368e1c9aaf00341039686d727ecc46cc0b24b2afe222efa67d769e14d295cbd79a61867b74b966ecbd187d50346169d20a10f211a1a64ca9efd2ca2946ec9f0dfb11cea11ed03505a8e238eda94589007dc930480346735fa42032a1ba9d9d6f54dae5b0ad3e2597cc77653281"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (597, '{"ob": ["15151515f6eedb7b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853e8547ee44a6eb9bd389d95c4cafe004f4a65a142bb28fd2e5f2519762cde3686b9ad38ad79d0bbe6b40112a0fff8cb0b93997626500391bbcb2f306b06b5a123b64ac95cb1bf5dbffb5c587cc210996509e712eed28e9b6df4b4b3eb15ad57a023b61bb7f127884f2ee61748372c988c6621074e5ff1c94dc321c708a9dc8ef59dc97d061ae0acf10196fa9c260dcd6e4489cf41c4c1e2c471d24dbdc98181669af5444f781f9e8578aaa0b1a1cab6d4c7d4d43d0ea6abdb1084229873b12e1bba29dff81fde8e593994b3aed96f0b1a642764ef700dc5bb28142be2935977b36bb680bdd42fe8643f336571f2a47201bf1e3f751e28c6fac17612f983cafde6e44f48914b4637e46c4226ecf274272700e2aca4722eac1d5a9f3e5080132d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (598, '{"ob": ["15151515f6eedb43892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c09ad54c193c292a19f49b350d2d084777f4b54368a07ad1aa3e948c7c9372cb0b6fbc9f8689e1304ca972885613f7055e969ca8ebdc278f44bd8e070c4c30b17c33227bd709ed6ca5fcb9fd581333ef0d0ebc6ec15dd9db28a2e313396371ed2e99521c40bc326b80fa4b93fbc6a67d14b19dc780dcf8a0516408c562240177e1c6852a9638dcf9255070a8432e1a0400d5f54f219b8d0335d7ea00c6037470407454265f3f1b2dbba56e96e7119a9e0c2dcff81210f29c4ede44ef94889b302adaf63182953077d2213a5310652be41eef9bc4d848ac9c1ade2f04d970da98799922ef9ab065f9b962bb3b67f6836366597df7d83c13b54bd76dac99da3935064c8892eefdac6204026bec8d56c9d7616c5f2ccba2bdff59f7f6c2d5df8c93"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (599, '{"ob": ["15151515f6eedb63892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858ef538f15ba92f54989e91ba26c85c01f686eb67e8bfd82cc5bc0c2a4d0d66d6187d7a05a66f3d51f5d95bfc0a8dd0568945db07c03328d600f27feb25ef3bd3e8bf8f60b923ec51232de86dde4f3676a997c62a4dee43dfe261991f9602bad3177049cc381a5f8f515676290d968d6ed4397c545f61b5a446b11a842c876d9ab641aed9463d2760d922944bfa8b067932ade70c7ce5f1bccde5d2e068932d3d5409531983541e93dbe7762fea4d840da5f589202082678f8405ba7f47c196bc696a0a4eaec1835af8dc44993c435d9ebeb53d4d4d52dd03b3fc929bec0701324f9742749546aadee8d78c0e2dee9134765fc989ac1c056bc3c48aec887514561ae2ec9e34ef6bc493ba1aa4b7f2b9d2d0c4acb6f9b53c28c8395725a9a530d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (600, '{"ob": ["15151515f6eedb0d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858c197e498a8361022b01972d61dcb067c413fd71d8bab28f1a12e58050c58663476ec8f719d51de69babaf90a5c43a9a997536962864e51760580fcc0111041264f088ec37501cc639b7342f4255bce540c271c10a02ba1ece290cc9f6dac7a0cf803bf3c5236fbcc33e64e8f3b02ad293312d5624aac2ecb5a1dc1be5a24efbbbc0b918e0f4d1bb227cfd70b0df873415aaa22005e0c21d11ec6a44036f2df677e8c53c5aa3c31100f73e32f11116482445aed66ff98304d5c8f43d51d761b03e695fa4de8afccf1de6b3c9c29e86e5cdd04f449fc23ef12ae56d2e871cd58a3c4c4ca082859ab20390a2834820942e473fbd0104dc111519f9438120991d71246b90eeaa4b15eafdd25e9c7f00392462d31b6d4e3b97558b4cd9b9d68e9e47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (601, '{"ob": ["15151515f6eedbf4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca39c0a5dd2a42490256e13553735eacf08234b352d3498765bc385632eb9ba8c926501bba4f2b968dd0e0e28eaf3b96c1a81fc720a0d3b0936a8f04141da93a4278e1d23de6fa94ba8282e7b4247f0c50677026eecb91a37e7c389b11c13eafffe1d4651baad1a91f39edc737ffd0546bf483b8f2d013ff6b473c88ff4562c7aca678bed8262108eda99d0e4bc8e0eb6dec5be42c5700073818c6c69544203f476005c2c9a59b0f6b7e4be04bf10579ce2374ee3e265bfb57beb9ec2f71b0bffff7518addcefed45deb4a4089926494f601e9ecd6835094057af5b96f86dff6f32102feefc947dcd58e7591a6c4a88a0ea8cc09d9645b62614e7a979d0c2c142f7357d7260718c6129b902aa5c24c05c944ab2f19a63291e2a123b078bc5ca7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (602, '{"ob": ["15151515f6eedb37892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e60211a56270d2b84f33105d1ea8cf007778443c200d332f80534adc4d6b7bbee9e08c6ad9022bed7512be8f1235b09db1b77da0ecaec44ea700a71dfa7b518531a6b1c927f734f3fa924d7b6c749d6f2b49703c154b9b0db759cbbbc648442711d63d6f3d519e91f5ce4c53e0fc9282e5b1aae2c826480d5654b2eb1f2722d2631bce88f94fdc816cb5650d2601423534961c0a9efb8a3a85d1f3c4bf6aae515bf9b4fd7917968acbe0a97543b957a0bb6f9c359299f5f561b80aa54b2dd5cbef48d2ce5a65d248c0071c7699cafe8c2bfa7a673f7d7a5a2458112fef6e3c019ccec6dfe93020046107278adc202c02bcc94969a7b47206b8d6937bfd43f0dd187b5563ed13f701a51d8dbacedc9cd8b6ed521862f6582ed69077a1b7cc28a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (603, '{"ob": ["15151515f6eedbf1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8563f0d04f85b0353da7a0464ed8f4059473ba008b34316b0e7fd4fe5ee13fa989e7e444e6c2f3e631b08b7f4b77ce404a0380308afad31b7f6e914e946caac94dce352b1f7d888e4c7fcf0cb37a2f39c31e25b08eba0ed084e25295a45ecc79072a228978c39dba5e1aab467d004ab1247f245aae0c3143291c4213b5598ca3a7b330464e03f9e30b1d844b7ce919e917f1c58b5bca2f4ab73d7677b5775f101503d46ff995cfcd1edf6de104e70c49ebbeaacadf048ff76f1a1ed5de0f458c2a59f66c35d9363d8a55d7ca0be702eed54553e3b7678cc9347660ab3d225467487b3d8485d6f81f064b93902099087dae2329acfadca239691f696bb53e0d2d24eeef4c7a93075136e4c088993dfdb9ae61f4c623483508b5b5d27db6accca28c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (604, '{"ob": ["15151515f6eedb8a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856720631ab7cfaa78ee3ffdc9424691f9328964f86b653322c402ad54b232d4928afb0f74c42a0b32208d9315e45e246ca0cf698b5380f5cf2c5c39bf81d1a044282cc53e2500fa375d655a84975a97d7e874a3ae0c03663a901ea93686e9007468bebacc09a0d160fde0ad22a73090510a2d0e3aebcc1fdaab5ef21901cf5c5c9f4c1612e45d37ff7fa050aa536220b8251ed6a541218bb0aef4e11c4686b838f71755b4e6c445d30df01286e39bc01459fac8d03eeb23be6246fbb8cd8c94c4be751aa3f0f7824fc14e5a83480231e05ed6b6c3e4174dad7e2462d4904e54d1f30eed7359ece5903e57eedcb569c56b66b4dec0aefeab4ed0f717b58c37275e2611e7b200a91b20336a037935e82926bebe01bbcca133695514b0b37f0ff7b9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (605, '{"ob": ["15151515f6eedb99892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857041feb15f472614b64b46f66e7f88cb606476a97ca64d67212b6b0566ec979ccaa0ff3d0be516a280e043696809816aa66c8c24baf761bb5196aa457a1fbd22498f17115b50a68b1f60fa9ded9388181ea78e982ac0c19d29a4b76580a844ebfacb9954b54997313eca66fecb0f888e54cddb9fc903de62c61d7777bae7c85a60a61ebd53f4080ae7033c837f19c7033f3445bcc13a3d25686780411d80e81662018b6b596907d83b03ccaf79c193c6a0d9c05432c61fbb1d9b0f720d4ae3998bc9938cb153b9336de1f1ffe63476b3e2db2a98d82a7eadc8682fb2ac37d9bd3ebdd2eddf92b01a4cb911ee8033ce13a0898760724c910c0171adb0c79ac65094d8ee52b23230d95771e3ef5a423659912a6bbd0ec78b0ddcbfd20a66da604d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (606, '{"ob": ["15151515f6eedb7d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c6aa5de5706676f3ae7ff0f2b5908f11fbb44c12e03579c6904e3753fb78e82c600339d89af03fb2229b096f5b9707a8f65f5b3a2fc51cf5d4bae143c320cd5a9a10b2d67cafcfef31f9ab004f0b3fab1ecc4deec2ca122b5414ed489fe33939216fd207b363df011e1455278f789a1c5add4a5c548161a30550367d71eb53d11cf2c5cf27c9fb187e62b6a359e57fce5997381786d557badf8a9c5ee57c79c134914b31fa7bc82dd617b6bfbbaf919e754e283e79214d03c00283c0538f70f9004b387c1a8ca3c2e75cd24472462544ea3709c1050573061b6e884a4179eb7f2ae9b2e15b83cb4a8381c9f4e7d4d746d5a634cd9840f0314da0550dcec8a82265862696745e33cf41ee4618852a36e2aa93d8b26c8ced80aa9f8f88385fc1db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (607, '{"ob": ["15151515f6eedb8e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85adda607c126c3eaefca5bef4142de2e984af2dde10ec07d49d0faf48b99fdba46491d249d1150ea7e87e7b5e2e8c4bbee95d2a33165b196b5d6e0a67688bf98c23dca8c33927247559daf5e6ff7e85fdb8f2ef67cf80c0bbfd2faf19b9c8670ff2e247afdfc1e96de088f352bafac5065a062a29eafb1c9a0b34bfea178cd69150cab234d06dd6bb58018229985da92ea017ae1b0293363803193a1a8d616c2eedc7d7422fee15487209075de80a8aacf4bedc7b1f104c60ae06f783b926b284df40dfc13708b59a1a0cf15b708fb9d4071804261ecd59cc062fdc58ef22f98590dec0542d01a1e3014d7f8d5479a7624f8862aa4450933d28be60c9024f6df0a97783193203e3e04c819f649bad07bd84fdc97fc644b04c16e0bc573d0b2042"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (608, '{"ob": ["15151515f6eedbdf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c88ad3e0046e0ce8fe8094ae43020ee58a34df81b8f536e7baf3c50579ced4e92c5344ed0e0276cbcd8e768e2fcb33e240681140472a6b47e80df2af7a7c0703e8f1e9d0d544ee60e03646410597f60e25183f9b3676bed50fde69c04449f3aa2a2765cdbf891c3237eca5a0ee9144da5be7c6e46fde43b6fab96bacdf6578dd6d8825d77b28556b5d7b47af0cac9dd1f800d1c5fdb2104d27d732cbecc6e36ce71f4fe00feb7f89b7e571736b92dabdb26882dec63c0ffaeafa05cbbb672cb42a0db470faf129e73ccaf4104b299311223bfc5532bcf79886932717c77b01af7d9c010ec9e3dc806ddb64b94b6d0c3649bb5d265b753f4494dc10e51f7fc7478a39b67ed79967a926b760e5526405804c4357c56248c36b0fd6833dfcee4cec"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (609, '{"ob": ["15151515f6eedb1c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852c7a4682956b3ae88db7fdbac70605b3e98436f1bb5289d2e8c0c3b663bd375a68ec932f56b24034bdb77bd8d207a834acd06923cbae170ec49d1b731bb1ed61155c9ab556769c3542254ef7ea17d85afdf5e9522b7898322b75e4053c965c4b6263a8b6afd55b4d41ba3e022862f771315567adf425da71683759b6994a9fd456ffa12aaabfefc04468feab0a1918b4372016e56ef3ecf390c35e9fc6771ba9b4e615d4270588e65d4e4c11f7778b7169eefbc06400ae95b39b9fc3032987fafce7f8ffe6a77102d580829afe209fd9851bcea3e516082c3ebc9a7b0d67ad7b4c34428b2a0ba183dba9efdaed5537ce8371a9328961e89c37826eb62766189a446005082d672a8c516a42724d9878bd22d40487112bbb45f5d3b2b57ffd20d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (610, '{"ob": ["15151515f6eedbb5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8533b931c318465d6a7da4873d0f3beede9774a84c51520f95b6c528839570f8bc096b5b9a7fb97b05eb178710d7d329a6fcf169b22d82e7a081e26ed7724b26aa5fdecc1e3092a84c49211352f05190c35b15933ca417be33a4b0ab596c0d0780ea3815c2ef6b3fc4d88f62b53b13d499d6967cabb383f9832eb70ef353d6b25e9ff5ab927c130a9cfa344403fb64c1edc61a949f7679d6e3a539e02aff00a2efc367c0ae690802d264bafd6f39c157f3941a051aa46fa9f53812340a120ddad9c01e306661ff5f1c31b5429ecb0580fc49c74f2538cd0ac5ead5ac8c96fab9c2736d51948f89568813e002a7b3d3afe9ccdb4137e0b5fa3746b353025580deda749e18064b54cbb28381a38eb8f3beaa796952489d72802f76fde040f77b5b99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (611, '{"ob": ["15151515f6eedbe9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85323456f0a5efa6e2fad87fb9a05a01fd79519a1f9fa032e7fd54524f0dce60101072c5b6107bfec8d129b936b915ffb119eb38460dcb9f2451e70dd350ab971c73e7dde9a5ff99c8e16a4b9a861e607d68b0a5d99e1db27d497a057884d71172044e220964912da956595e4694f319ce9108c4dbcbbc547c297447240108111db61f3d0315a60bbf77c07e05d470a12ea203398c04124153595c3bbb6b7dd82437ef5e40f75ce463ed6481e7e8c9445523ab02e412c9898fa89d4ddd5877caff61f7fd5b24ef13eb905c590a85a44c19a1d64fc46fc5369cdb6b7bc636e4c868e0e4453598eabd44c9188aca347f33532fb466aaa575610af1b1b0f8a5d3bdf80f0374d79e29784e468b18c680889467cf52b31fc5980113a0e84b37f550610a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (612, '{"ob": ["15151515f6eedb02892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851b3fdb3259d281020a6525caa32e0c9bdaec4a6e6881f754dcd72901a281ffa9acc97c8993abbeec516e6fb2215104669d2a743691376e03d57b5dd264d04091c633d5658708ed57fc73f1b6502ba197b0e46167de35140796c9e34571cc383c1ac8412e8c2d011e85d3a51c4b06377013297da435b93eaaa7290209cd4460ace781e2342db8a1fbd27d8d26f7b2218eb4b986eacd90de4e8baf2dc88680f7e8ce625d1b4294bfa46eefa7474f9ca260e3b3d5675261cfb6f08802908aedffea65075b26649e30c981b9cdc9e4e60b8328d38917fa728cc02e8fc5d321086136808cb5d41b0ddb307abe78e08d8fb4d87c422c463e35cc8ccb7fb5a38f6a233c79b950460809b5a618d75df37476abdfe95100ea1467603620ad80b21038e0da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (613, '{"ob": ["15151515f6eedb57892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8512a1c7b692c2047803d123fd9c7cf56f09a5f0c3968a5c2100d094744450d9bfd1bc434a3b9ee9cdbe017d40d29b4a59b1b9578e78bb2729efba768e62abda0b93932b5ba3fb77958414b4f4308da7462dc7f25a7ff73f427d41c12dd64018d9f711a134172a3456d0779980489db7e607990b06633bf4328bcd1ce53612f061274e133545fdcfa5e4e4b93e56498f2416988fe70ffb4cceac99a0b4ff38feaca588da5e160c60ec4bbe72c9b10c76c19caf6e13be91f4b13e83302bb7a6aeffdc33c246263e5350c0133ade02696959769bdae48acd763a350a7885d6626793ea690869b5b670f718ab0127120ab7da5a8beb07b94960924d64b069e671f5bafc7e7c83901ee1f119edc309a327fe35e84f4a1e9fedcbec8c30ff433c429775"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (614, '{"ob": ["15151515f6eedbfa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8518be2738e9595209b2a112f8dac6e7c35fe873a339f7282b080e907fc72d096a572bff8a65a7511593a64405b0ab559267ed2a0bc8564ba1861c39e4fa413cc41e5ecadb616c6347a612b750d4f35593b4cca2c56dbf131b9e90895c524e7a514c55f289fcfd9dffe283f653bce6714a53b38c51b30d13a7e0bc8d521159a0538cf173ba244e7aca10e81f1d1fb4a2fa719a32c48569f35e5c7dce2993efb18885e1709d22dbb16b3edc8ab0097d9e557f6ea070fddc1c8587f6cd9d8ad9985ab88bd7b789c6b2773a7957c9f3365a68f9cfd01e52283dad8587fc3d2bc550d24dea0b1f531a0344fe987bce434c3b0de3a4ac75d22403e7186ce549807ea376f9df8a16c098eaed76c61dcc98f0f3859e00521ca4d2055dcc9ad380afe634a2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (615, '{"ob": ["15151515f6eedb86892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85626bdf05566985a5cfa108a2a041ca79892a4fbfc606ef00b8385343b541557c981746bc136c875963a2c9071a838245f0db34bb371729dd054ebc104fc535d65b6065185cef2c07ebb8f65328e02c9a9d1cc018d40fafaa9a2c09f7f5edf60cbc6ac1d1456c79530b92c06af35ea971cc2717332bc2105a15c766f1d0edd58d2c8edc706111553e76cc8d0087241c0b8ff5a9a6576b26424b0c26e4e00707c96c489411399b6f37519b0ef0562c6183fd4a06a2f2d9006ceabbd592bb13205ce5d46dd02cd6ef9f4a5ee4d0ca8e285ac29d35dbadc400848fdad639f0c45331ff2e611e2f6091c59a097f9d7c5e8c57b183e73dbf864fab183082fbbb046eab52743917c27be4ffa2c5e6165d9a41532ff9c88a96cc380efe858c3b5ba04286"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (616, '{"ob": ["15151515f6eedbc8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8526f6c96deb4537450d1a1fc5b67d375e08ae6008d0d1bf6b0a24b6cd776735860dbf327ec347c0621965252091e4b493eb2b232c7223aac11a22b321d61c20fa65138821567fafec3309bd61ad64340c017570aad7f01f898b6e3ced99844a5f8e1a4b8cf8ee09261048e3a54b0f82d27df7131123349d199c88801fb2e088cac5a30ad93d1b06797fac0548719a61688d95cf899379342917b7c1eadc615d53588e56d704c063a7215ba0617b1ddb11fca7cab9d16de84b5904588268be6049a2a9257ce20b10313ebb6af873cfa2f6f1cf1e3d8ec24ef46042ee79f7c7c378608a7d636bde56dfc313469d585e7d69de6e07b9259fc26ab959ce314df014bc7036d34e6ef2583206bc08b3cb694855fea850306a36d2c462bb31e0ff42fafd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (617, '{"ob": ["15151515f6eedbc2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8577186b8bfd01adfd9cb1708ac5ab250e0ca6102e91bedbe5a12148715bdb54b9a5e1e27c8a2c30a1bf27c769e90102bbb2aac7a933d02c6f4fd97c4ade9a04b31d08a4d85828f0be3b9593e84c156ff4bac2919f50c2135624d4c75f9de69dfd4e62df22d01b02a0b98526041a704c9289bb284cb2b3d468114017bc1e68b31a9f2c51dd472116f1b90e450c32b1985465f3ede9e1af66803ba488c245cfcd4c502414418de2ead9ba7870f7ec121565c48e8068d4fbc22589ec0f7ed46d11d1d83f7b0991dbfec143c274a6947f513b4d685d9347093ffc69c8dbd21fa236e7801be7018215f772bcd01bed709830d0e221f05eb37c831813bc0798058c1bec3bebdbf5cdaee51a2fd041181347697be0f5164fd79582aedeb23d124aed1797"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (618, '{"ob": ["15151515f6eedb49892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d9ebfa04cb59ae6af26b8ec52f79da74fde317ce7f457145b3ec926119ce8513a7b9303e3e1ac41eed69587292eebbf2e1c64dceee670affe8bb863f869952e4d3a99f1f133213d4e4b249448d52f191d4cabd4d88d3e1919fd308d0b21d89ff0cc37b9704583cff774e973c3e14f658ceb8721cc72f2b5073d57120402a7b64d81a019602868adf60019516967acbbb994a6ea49d4ad8833723c4c84b9ae20be723516e13df52e5e8be9deaf63a9d9a05232a3ad051387129bc48847d3b0fce3d459baf81a4c2e0f070a8664894a0d770ad62be5140399cc8954a78aee0379137721120c34fd542bf0a9642d5e5b06e09a9c1cfcf9ddb1e71cd585f921795e00c60c7e8bd38095c73857fa818801da429ed071d94fde3d81312c994f0db0852"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (619, '{"ob": ["15151515f6eedb66892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a05616a89c65ea696e08a466bcbf71d2e2a28f76ab8efc713c8faa485d89c715dbbf925c7a6b3e06ec5d037a32f59b722f83a43ada0b6a165bf667cefe96c1b591baebaa838e051714ac4043059b4454b5ced8e5205467cc833e18c81e8f2e4520d0c9dd708298e085e26a5cedb49b82f021125aeaa369b099cbce5b87834a7a3b585c2908c5b9ea0757e036ffceb1c8dfe5d31096e38b5c2fb97854bf01a875531fefeb4790dfb000865a92d2f6c187f21d7afb401a690a9699c898a4d8aadf539b365b9a749af3b7526d2a89485f6dd1f2832683dd923625804ed49e7506a053b09ccf42f0c0b343b3bc3ab5d55e3cae405bb7bfced16a8b0f7006b01fc093cb32697d52729ca8338976cd982e5b85c72bf47374b89088c4291a5c56e551d0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (620, '{"ob": ["15151515f6eedb9c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c8d31288df910e9f819048d3268cb954fe4e805cf339ebb091db851c9066130146569fa5eb5e40d00711181cfe0b7a3b7ad99f26c3a665560e7810ab17b3ec63f5d8671f992f4bc09dda3e7990146a679f29c1ef20c6046c3afc5d302b4a566c69a81db730ff841d9a94ec81f48438558ecc9f44c3b29b59a3eb20cc65221e9b2ae9ba03a5514873e7925806cd8c23b2e224ebe1966db9571455189417ccf8b375a6a9e5d625ad5c4971cfeb26c50274b8d8d70ebb5b57c4b7c0cd5cc1cf1b50f513948eeaebea71577caec02a2379e7d455edba238441aff256378a8e5c7c8dde6e51080fb57b459388a775c7236ff16b391c8b1d4d6f21ffd900a0bcb7e67d77eb309c2ef2260a8c59a47db020dcfa914f3c057bc897c4ab4adab0c79eccbf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (621, '{"ob": ["15151515f6eedb5f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8593b5b1fba33c5a00a8442bbf7d3dca2a51061a57279dcbb5184b96e52a51dca97817109a6364c3a7fae4388817b8414eb3ab69cfb8e0717baa237a860a0c8b7b8cd1c97a8c1383f1145c298875640b59e00ff46ae4fbc5da9348c5efeedc99134d587581b1073b24269a4f75758322b633915b852aa5c8d230b42b03f8f86ccee9f76a4592dbc2a8513e495735837ff411345ff6d44616bad3aedf925cdee4de18a02e901579df301351f50d3032ce54554703393c88ddfdda52103a809ccde9d2ca0a5441f0f3976fdef466445f10e40436e9fa6052de2254790839aedfde063c1a164a3178337a0c438f54342849eaf873c1028379083ad2a936cf65d7ebc7be560259fe82c56ddfa6ed0e472c4bfcc316e751dd788b1b240b5a756280b002"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (622, '{"ob": ["15151515f6eedbcf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856ce884ec6d9581ec1494035c916b3dae305cf9433cd7a7c60011ddfc69af68490921f9a5168d1c2e6bc2d0234869493392f5e744c86e809155cce6ba445990a01249cf6cb980739a62f8297fd7ea97d8e67ea05de065f982e6638c94098cece788aedfda8de8a6b3101663e6e78be1d7355f8c9bc59b640256c3ece5b35b5925fb0134e1d6cae49e182e6500f2c8aa12d89482a021c9b585eebbf639057b7eebdd6fbb5c0108d82d5aa54dee1717b60e37a63ad8c59f3b6564e563520a653d029b8b04c5da613b61a251daa7d45ca2298c0485fb59157de2e4ff20759655d9248280da1c463ad596f2a3a0c08e528e16a0a22954363230ec8d37fa856f6d1bd47cedc1244a6685824357f447dc1c312be82d92a1629fc3ac29575b897e592ed7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (623, '{"ob": ["15151515f6eedbde892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8546ce7cdbdee6f9341ae97c4cf10fa120ed6d7e93aa4ff48ca85df74855df0fab8d2b55569961a3c030aee5c3dcef40612c42457fe425314efaa3ce0d4ee5c75f3a519356ae8c353db557da776ba4e1c08c281ec97757c988c58c3f4e972bc1f6c4ee21307a4260da032998acdd7cd789c1d4658b0f9de37e437df1b6e3cf6834f8bef74277d4dc789db513d285c5f2c3f991b3f31ca85b45c350c1c2cbf6e60a0249aced59afe641a1d26f2bf3965d2f57e09b5faf12643054b4627e688188c32c282693df58065d8b350b2895422f13fa36eeb9f4c9c8db06e59677733cf6f6078e00386ffa2b00ec5550217ea394f2b01f8f41ead7fef1a1a5ce83547846646196ff0a713c6adb93d1df38819da6bbb2ce231ab5a5422d32390667a0a67525"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (624, '{"ob": ["15151515f6eedb3a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856a163887a617a40e5a083101c7015491fd4a5cd632e8af1e2597098a61f3acd7ba29ccd20812f5f67e45e423854efac38d17e684137c6dbeb9a35f6b6d67086df8a4826978a762be23986a3a5814bb3e4d22e2eacecbb18a634e3fd4e027ec1a566cd568df3b0f99d4cfc462e821cf34fa99782fdb22f5106a19ae71211313d0f1bd124c7d6662f3d671db31cc4318c93d4ea392f9400224f29e1eba9329e1ac0bfdd8b6aab89ca0bc187390e26fb86766fe424b7e23bbb204485ab4db3fa0ea87c53f8860e4853d541b61d706c4dbf5f410e26419a4b9888abf550556b6148abbd1024c28b730d2d33a434b8bb9eef6cd59bf045a3105d8399c7dd39b815df2468365b1005084adf92adee08d9c8862e69b5fed84d42829d600a2ab54408ba4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (625, '{"ob": ["15151515f6eedb95892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857446b895f9c3496c4daa10837f3978e8e786a1344b706f7097c392383c648ee38c8b22776e951fff15aa1c3ff06229b4efea420496b7b5f694e42c9fead528c0513fd3ca77075656b99c67a5cd712eaa812101c50698f7995aafe629ce200ddc0a05ebc06a536e7fea2f4b03e2915e239c6335877261e95cf10c7f63726774ad910b181dac791f720765e98288ba7f4dbe4111c9ac321dac1a538e88f8df785f195d6b9f7c0779b6c9abb8380a89cd5eccfbd90d2073f5d167d7067e9af7d48de498dd8857f32b3cfc3fff10e2172581238711646c93dca331d10e76eb9adb903806feed5e78070634cf466ae8b9d1397376acb8d90ba97d918daa4d3a3c91b42d0e1e2aa9cd001dfc101860e008e121612eac5713d2364e8e8235b33d93263a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (626, '{"ob": ["15151515f6eedbdd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85440d864a2ba1f14c58ed5504314be2676e5d5c0440648810d6c1bf1106217f08a7231a276702b8e20f4567f1ce097e8f377604970f2242c8dd7fbcb0d25e5d3c4b1748067c9598157abeec1e5bf8941ead9a405986228de6a9ca29050a064e6f13a41b0ae073ad8b87bdbdc938c035dec09f3a24907d862284074db84eff026acebb5a1f376457d08219a143feca21410d8a43acac7ec42c00c41b41e82ccba61236bb846eb70292e49d8a3fc98d3654b2d2449cfc751c991909b7609d75e56a5e119754db84681406e9fd15ad3172263c5898120630b08d54d0d818d83148faefc41cee59fa14a0aac2a58be72215c0ca1180480bb62316cdf8cf9bf8576b97256e595809c8404df2abdf87b812a846a4e3aed1d1ff826c71edff3c924edff1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (627, '{"ob": ["15151515f6eedb5a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853c3ab292a2dfa27f4fa20f23c90d87e5709265ca397a7cdddba7795b67f9131ae3903896f9c8d2d4ab04dfc4add67d481c4a8a3596bdd41fa375081bbfe4c8264077f6823511f93f1e5010506e25f7eb2779e88c23c188f3d3b68205ad4576b3223b8200d83478befc03c9cb08cbb4ff4413cced4525d83a133cc26b661e8087019fef5e2ce711bf02b6abce9cf4f13958f6c2a50b1a304f461da789ca3f8fc2d84b0ea8ee79037d0c0fb66510eb728e8fb43d469af8214c772019705740819810f58cddd0b06812ee668f25012e563ac069a050c537caee338613977a8329924059622bd5bffab38ef8070934290ba74f544bd26dc868dee2fa0d5052946cbcdfb2cbfdd96336cd50c89c40d22cea098800d6c4c88ee673e1c0bb1b8bf3124b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (628, '{"ob": ["15151515f6eedba0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d8500a31a28d07d59f77035da3ae4c179827704a613853f771204a9fa8e2a26953045132939db5d228a65e2b1e8d0e2e3c67ad580f34d924b8beb9bc7843b3d7eed9e88ffb18f15713747d3d2d94059cf0b847b02d9467e746b03cfdfa6e2e24dd970c75fef4a52a47b7b186632095b50c7d2d524198afd95d40800ccfe6f657714ef5993bcefeda6ef1ad1e9dec3641593af5f717145a72ce104a90236797b86a97927406ee1d9a3f378518cca8b155eb00aed4348a5eadb75b27cf063b22aabd93b7bf1c9c06dbddd936582b7aa40454e254d672381f34e0537787bad1d099eeff7df614170fe9a6f137af16176ad041a29858526f7d90c3bbacb12496d752b2c299d7bdfd3f10930bdf58cdef4e52f08628e22eb8f5c7f074123702927777"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (629, '{"ob": ["15151515f6eedbce892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c5ec694f4eaaadf58d9f4a096a8fa68b1ee9b96c22eee4909f10a4c14d2969b7a4546ea1a078dedf06215185de27a6b9779ad59eb9394a49f735574438ff51b09b26c686adc5fa18d13de4ee4748745c563aba6966595d987311d71f5b066b76bec34ee990f22dd5de64e7378ed46f5936992043c6fa1a119916f4a787a706125fb201cc8fc41a8ee5823d498b516962c98bea94b8b85608845ecc8f5d116bccbda42105cc44dce74eae2e4183d1265e9e5921ba693cc3d1d7aca748311eec232e9afadbabe9e4c7829ac7e9ff429165231a9e9efca40ed9b8a96730a35265f0408fb2efc83394fadf184cd2f0f1e239851765c683d66fa2e2bc53bb30a0bda76b76f7836b971a1108642643e7936caef451a938589608ae64773b1014a6b3fc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (630, '{"ob": ["15151515f6eedb3e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d8ac6c45bc400dab53c158b27c666ccf87b76f2ee659ce583888025b8d795210a7a22d6bc2e530e268c33c62365e7dcd11f474b5540cc4bab5f52e2aa0775615c0caff1dd85a187fd6177a1a192d5e70bc3c9dfb1e8c2f4cec88e9f315e792a3008ba5f027420ee76d39021524a72757bd904c9d7183a8d7c88343d8601181edffee58c38f4bebff12c2d10e14e5a51a209f1d3c4ef57057db701033cbfa72b488c587330ae783b93565dae2ffb4477ecc3eda47227e66a845a1164dba80a446a9d5929ac59b01fe384da6a442c06aacfb75cbff593486d900969a8a14b0fdf6b819ffb15a666c323d24f8383a960248bc20e0487258fcd45d189b84c5663727b622616b8fd92ac5115bc1d69d1323ffc885790083678fc41411750d5417eb58"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (631, '{"ob": ["15151515f6eedbfc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a6b7633015b8b54ba061b0370c3a9196d869aa4b7818661449338ff742eef59c61ca9342c30f31cef0595d87994b736d41dd266e8488f687adf1d806b9b1e62924036af99468d4c2491a95c5f29d11354c263059dd8f6b2bedc24e3cb22b06bb6ed2ebe536cadb3c43fa090002f97693925b36340f9e55c8b9367c3e70d57f2b99c9e11a976db89976ea70b759260082d1a5da088122957feb03d93e6d33702afe55dd600b8998dbf7c20e7f34d54d20570b668ee891ecd2b1818711d0173b06ad9b72c3779999bce51430587fb0b1448aaeb1d21f6216d79196c90dcfa649efca0d7bb64c8e32cf8db205b8e12acb0ddc71a59b90b56b02f26598d8dbc4f4d9a667ddb9f31330b032be1359136c4f2e7ab68e2f35c2818647e232ec896610bb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (632, '{"ob": ["15151515f6eedbe5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b01a91e2be7f99b05b4846a91b6b5cf3e3be0c572289a2c49353ee808e86db55e70619e200e540e858da84a38b17eb9972b716fe4b78a541cf41cb71f6f9e3833c72a024584657fb91f140648ecca57a6f459f071e14ddd7f075bf36509ab15a0163165e482ba3d79bb1ff9c6559a52f9909728a803298056972e9c2a0e0c75c8cb03ae1b21bce17cfe0d5037c086f2be712d32ef90b2e38f17ed3649596a11703b90a81727263d877d0fdefea9de31e794a0574d1724fbb41ca78f2da877353d578eb17df5c4452cbf6e626dc2cd029eecac12b920a9bea740dc226a37abdeeccf02d2a0a5a2a948816927daf37ff5fbb935bae7fa37b23fd1a0b78f9ed901e5f3adbb611810196012d21659ac38adbdd6727098b6a1bc9ead6d9592fbc52f3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (633, '{"ob": ["15151515f6eedb82892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85bc4ddfadefffc52a8c9df4288a82e2a18fa828d14f99db528b464a633e2576b94b88214d3bc9f2e94799b0b348d75f8f91ade5b717d90576646c0d9a1181ab7982fd9f78b5d3c5e78c1a9b1ba11ffb82a0ca1df8ea05eb2a475c2dc1f99135bb288e392acca7fc780278ef938217f885044384c4b61e04ac3b5c7ba5689a0396a7b4fbab4443564323a669b5701c487b70435dfac8a69e9cc61ed4967eb9663ead80c44ac68e65f6bd9eef17e5e16e89e2a0266ba6f014b360b1a3f513ef90c2a55dc0c5cb8a36490e6d879aaeec70e971816ce409c6dae4462d7d17fb754a3aceca04bc21f356464ac604f2d35588eb0b7ead2d48a11cea696ed23b72f8f8432e2ba52717c47744a02560c96bf4c40806367ded145c5bdc0a1e8fb52f9d1ce3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (634, '{"ob": ["15151515f6eedbbe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d401da41e14dd9c20e6ac22d626faad2154932c4f43686c636abf16a767eb284e5bb182c552d74f2bedb78a86ee1bd1a1bfda19ad5eca1bd9cf5fa4dae2f79f51dc992a4d28a8397c4ace0894b380416c9f426fa2dfee40a4e68d55d31ff562c6931e9750d3bb1fbea050855b906ab4151d45e2b852ea2df769c6879cf5eb17115aa54fc587748b2e5202cc6386f8eef81b146d71acd4e08d61fdd5d5385c71ad367810c6e2f7004f502948c94cf220a27780813a68cfb70c2fec58969138c03ff537b7fe86c874ebe25f24a689127cb81ebf3dd9dd97ad921519a086b246ae5ddc941741a2fc8b3c0796343314e8424587afe19828fac794a09268fa628bb0d248c59d66ea2dfe8fee11c0ff1c6f46814f91d515a1b0e82cf0cc354a64b4491"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (635, '{"ob": ["15151515f6eedbe2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8566e6745bd72b42e0da0343eba8cd8b97d40985641fba79f14ced28b37d5c87e6327ba55c82c7911ad4daa8301b896645f0a029e1a2e8c3997903828ccbef5432b00a5ee13d8aa58d88d5740156f31dce441feea78af278b5e40d5cef37592d0a317b38423958152b862191e6dc46ec6123cca087c7a36e86e35d5725e28b3350aee5fafa227c284c9cfb255f4cea6e1b38602740c410a2358e760073516991658e2dcc9eab08c65f89fa195b6e227ed9e5c1c69d7aa57c94921dddb6d9de1d288701e56a7f66d72c0e7bea4b2eec4b7a3079f89c4a8e13a6581d322fdf46143ba22424fa87884823e7e56d9fbc97e4d49c9c9551cd63ac563b6d1740490e0dd8bbacb5fd3303a8626f0debf5b602736b0f4124be9a432eb4ae322085ec6387c8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (636, '{"ob": ["15151515f6eedbcd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85be3a6e69295f000b1b336112c7979f9922aa00796c84b138bd40d7c0436fc7d79878133daef7f12f8ac6eea7894b2c343f521cff1f0651bdc84618372a475625af5e20575b3297778c74b7fe7e66e7c3765b57af30af8de52eb036d2bb69394bcbdad86a4fab334ade93fe54e5bb4172b99ea65f7fa2a7e2236af07b0d3a8decbe150cd5261e8ff9e3a4d75e84d94aac8f5eed87877e1a166d8a5309c30365f2811226dbce67acd9f918297a2dc4f2751f4a5b530c008fdae9992a5fe54a69802cd81f21ef0f360943f8f1ed9a00985595e6625a3e482ba5226005387c60a00b98e562c49224a5ef3c879a3cad3eb7d68467157fe3bbf4bbc5e552dd070faf0b6ab0a13be16857a4cfffe53d0421bd597367c9bd5dc75d64bd004aa93c4a01dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (637, '{"ob": ["15151515f6eedb5e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a74c7ddffd6159db4fd53e122a070eaf47a49821ba88d7fdbcb3d8bc0f92ef95031e5bbd9a4259a505f914fbf7b449beb9f64e41c4b6291fa97ed8c5c9049f81a1436bf54e97687a8c37e5ac5d4647cf7ef9ed39713e16d00be3adec44feba17fa936065aa7c07db1bd670d91cebd64d6c1246bf7956f6517043e1e102ff8ff79212c7c4a1ce39ae9af4d7854fc3ccc7fa401cb846d9ed7ec1e10ce23ac62d733918883c3b29447525ed5e1be219f14ca431a72dd057f77816799737807443d38d5e620a28cd520b188243420c4bdb9f9ee3742245d6dc85d0e1f95b684b67234f1f457bce628d38325d14aaa90a1fa7dbfa9d6c6ab72da06739ce862414ea1d070f838ebb89c78367c08c791cc0969f7045ed2c1034dfcbf6f849b72507a8e7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (638, '{"ob": ["15151515f6eedb97892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d79f46186a5b62065a6aabf2099a2c4e35df48e3bedd2e201a7f0ba440fac9fbb197226c6eaede573e0c3ea787d6c3210800494ed9c3d8f138022e6a251f8a1d4ca94c840196557a7426e2993b83186210f885c8485b57d38fe426d3bce5b6c3df04b4d62f54ec04d33c0548e00410b1e8c32cb5ba11a14b663f5b19ebc409ee8f0135aa01e5755bbcb65c9f92a495152144a8d9fe2ce6cf34a9982159771278f29a4132cd0787ca465f728ed6f7ee9cf6e4d1c037f32b374e4bd03f01122fc31da630589c48ea84eae93298398e439c8e16923fca39a648ef9fa70b7b7a31d3f8ce8cd2274e16805d0cf7932752c37a9637ced3ef37609f87ea0a5cb55a8130b2f70c9ecaf49449dd6da8ca468ade3815d70b273af3dd126331040764cec901"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (639, '{"ob": ["15151515f6eedbea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dbc0fe635538ee133dfa2b1d702fb318d80cbd4752d0621361735e191f12f90706f595a410b8d0ae10c76e4549c9b20e2d572d91fa5e8fd2eda82be9ce35979a0d5f9d2d1668ae5116b3a1f91d2e66e5a68ff3d38d652f41f9f0c110c0c65c01d20b970a9993d629fe91e864d388102913b9f7a990ec16f3c19e940a293921e9f326445609ee40776ddc72b48db0f6d51b61e4c3bff7f8f6a13d879e8d1629d92b80e69bf0b2b0680b0322023781bba914134c2ee9e083c910e0939b44a8416153ea4a87900e1807333b30f87e4fdbbf6f4472a8566730ab9d307b1eab38cf44568e517625df77f6519b0bea3f67a203f455ec47921d3c16a66a466a848e25fb70a1d5f9dfbb4db9560d2483dd3fc1c47c3f4e19214d57514a4fa993288aa97d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (640, '{"ob": ["15151515f6eedb8c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858695fb416ca24bf0b25fa93bd8327d6d3c445c373d21b81ac210f7f3ad57864df67532b7734381cb40b10b4c334bc7aaaf17667a678f5c79500f5eca2373240c588273b8a3a3e165f8728b4a0e62e0d4b1b136470066dd5e0ecddc7b0947a3811cc1680e7fb322e63a766931efd653de37c5829e50e991095ead1acf7e09e1b0266ba6e2fa7e4645443088b881fa2dfdb916b9745621f35f73917961e000c81fd2acf356902c10f89711e3b5c92397ba535e2a98bb3155edbce23c1d264aa5e7f1a95d1b31386cc95ddb44837973e8ecaf91299b16904f05814f1e0027a941945e0ea088ca4337d59152cb1f2ea645b51d14b4b50e4478b060e2359adcb8ba2e5a563a48282e70b64f35486f52925cd1bbf40e6e51dbdd1b930592e5efd53449"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (641, '{"ob": ["15151515f6eedb75892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e8b77cfa5f6840082b56e6d3461915f896e1df8ef59f99c9cf6e7eef78d2a4ecb037349b210d68ec1916705baeea8c7f1cceaf6e1e05a770803b21e91ba91746c2e32eeedcd6f843ed3be0d883f06f8e7e61987ae7741efe26d1c6e8c4c9c93e3de928b0821b8764b6f596371641f31e1023df46ad958e533411180491f48b0d469fee51aadc234846f62ec25fa9e7955a37c10dafcae5891eb52f3669fec96f724d07f68b822a0aa72d9e5a4921c7f342d5436a3be864b7a99ffd9a5011f628a5671bd5829c17e42b74ebb17461b59e6c6c949db3b05d8660a8836bbd001d1321f02fb7a2cc0e1d11837fed98eb9b6860dc98e7307169344fbe1acd5fff780a992463b0db9ee8f1c457fcc4fa911e19448ea94bb9601920a0dd2f493f44c3f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (642, '{"ob": ["15151515f6eedb0f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855ba1c113eedaec6ce1458e649cec01ee46467e00f4e4d9e1a5a334432f5b1e9a7cbe6ef32245ee500014ec3ce51c6a3c1df94680bb2a08aa8573f0e1bb31c45e5645c0d261e4637f733f8c46222cb2fe7cfacc03bcfa401d0d34fcfff45da3c4645c818477c82f6992a62b7c1e47ad7a8d05923348972720bbcf59ce77c859f9ad53938f9a5bbfc74e11820de7b850027372be3905964f4a96854c8e4da8c07ecd5eeb485973960e5e9414928a47c80210200466a5b289a5c35431bbdb26292b03b5c169a92fb9959f84458f03e3d3d823f958f8a750fe66be3d5804e86129730666923ce1f4902457ab1a749f71dccffe322ed81ac409f80458822c1d97b1eed7e25d245367bedde1c0c9ca04ad071d0e43f744cfb963edf9580ff2348c3d91"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (643, '{"ob": ["15151515f6eedbc9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cbd3fb3119df68a804dd53a9b35517df563c9f0702613a98dd1ba055f8936154c05231a8d1847f069db89e253edd0245637db088364041a13cf0f07d6ab31a803fed87608aaace70d90dc88368ba8c74e9d33a3947736c3457cd9bdd02437593971aa3b94601ecb608976f0fb8dbd63022b221b223d4292a53a8e67b2a3768a5bdac924bf05a7fa823fadcde80bc6abcf73ae6cf648e3ba9c61454da4f12c95bd4005bc4661f5ab4f48eebb8d517c48b59ebcf7269ef67e6d09869116c86bd900f2d56ca463634703a7078754834eddbf7c565c545b49e5a651c741cf8a860a4f0c6a4f334ed95d7a2157ecd802a885c2ddc38e7d9e8f2102b71e913292e7e2872cc7683d0857821f5ef8b3e286f130b6e9039a641dd928493adaa1ae4f3ad7d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (644, '{"ob": ["15151515f6eedb36892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8570da295dc95c504e27dfbd4128f710acab2c649ff262706d1108829378d41d8e4e97b462bb241ef517641839f1604ff154aeb55a750919d75626e99bb02ec4963232306ef99b2778456ed24afac82ce5829e484dc653395d11d9fcc77c0a64d14e896d090bfd626963758a92b9b859cf04db6a1d5bb572a1188aa2fe8f28e076e3ec1938c73bcf397495b781e3ffb7b465c305737ae82aeeb86947180e8a8d5e458f59ed57353c9173bf55dc58e0bf2d5d29abe9be46291107e7e58fe5b95c5073c7d714a9c1e613a2a4548cbfca6455ae60b0ae908150d657f549a6569f9f73b1fb2a1d240dc6573a7656eaf78d0c7eb4dac73e17be728f0a0efb3cd04c995d162825a599845da55d22441977ca569377c578af33edae5a53310b0342be4ce9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (645, '{"ob": ["15151515f6eedb4c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8591c381a1cc4fa49f1b72138270c3168f8b27d91b0606ff056f2d95cf0bec92c10f8ed7a5b19e24e647cecdc391f404861ec89e873a229e5c680b9e002a9e487eb41c770ff739b856914c781146337e6331d54a54c3475ca5bff5c0b6db15ef97ebc372d596ee77cd05d1dc79accca6a7ef85f3879625316d8adf7612e8702e04d65dd980bed7f357bc4b0d16fc53eb7b39cb33ac3ba392d79341026de8479e71b72c594f3457e90cdc1251d5b2f1788ac3f86575dc7ac05a7fa36ffb5e3876f7263d6370adc3ef74133b3d0c3d04181c350aa183a480fb807784af669f21fe621a5f49b4763f7a436cb5c8cea83de2b73c27b84490f88276c11901cffcb635009a4c16e7e7af28aad246669f5ca90b1adf122410f9b75d5cfec349887cd150a0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (646, '{"ob": ["15151515f6eedb4b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8559cab3266b5546385c62f1a1d3b5220998ae74dea8244ab7e8bd7a090d9736c4d3193b6a85e77c6062a2a0092f8d20cee14f03add68c6c7dce4b1c501b228d367f6ccab906df8fa012729b60be82f216f3733b995a0fbe7e52d523e94833bc569dcc1308fa9754c14c3c3cac79cf28e2079601b6adadcf76d3ae8fc96c9d808d1adf9e442503ddbf4c858f80596896a68a1179f424d74e8ef066a8d43332a317620b7f14e122b0afcdceb5b1a45fa8de372dfa0c60532e211445f0bb8fd6013a623d0cac73eff515da703c804378e9a4989751c94ca9e72a4b50c58cc93c843675dbf005ffcfce557937a27add10b3c8b6f6d9ee4ac5cb558a261c2015a9a8d453c1014c76068db29f7684cd7b395fd4eed4cf491e24e7af5b65c1964d25840d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (647, '{"ob": ["15151515f6eedbaf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dcb795b6e69fc2838847d6bcb63affe3ec31c29dd23b65be96b678499f653fc0a7185f9b67fb680ba4c89875e2dcfd03dc600e1edcbc9fe8996d033b50018835ccab9064e9e24a4daa2b75af2825b7ceeb57d3254698ba8270cde1bd4c73c18e7a9ad2cdf0bc4b50538309fe402db74ffb31042c9e3b31509222d319fea4f8abe6ed3be04fdf696f3bebd2013c0943a037ff2673454a150a1a4e0ef17eee8797fe7cdff4bb9139040b15b83e1c4a9cc38894dac9287a9ff675555960612f3b8aae4bbfc463197e2c9b46d8057a20bd1375d0aac712c94ed4b8067b2ce91d173cd387ee163dffa23e500e247ddfc7753950dbf145598891e98fb375599029789174a960f7a0a6338f8669a7e283ff6306401f995e2376353337b4d2152983bfa4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (648, '{"ob": ["15151515f6eedb16892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8599d1f63c6290ab977150709160e3eac9b08aab48da8da5fd63348fda7879525361bd2463b94b2548846619485aa8580b2d381d6b1ca2e9aaa6e379c76dc9e7a1b710e987064f1e3bebe41ff6bc99980dcb075bf1c907712ea7ca8fca731e27de407d6d2c5841a493822bd87c8ec3c7118b76bfea30389f940af0c6d67386510679ed86b9d150d6bacaef08893e7de978c1d48149ebc06c73a5108bf6a142ebcf91b52ccbfa889fa09ae297e0314f71ef3299b266a39131ba6e2ecfbaafcc995515aef304bd5db2cf0afc57b0dd13c9efc5c03192b7650b031f165a256d59b0a83ff0d75b76161b481d34be5d8a1f72d5bb66715cf99f970d92f4d97a4a4363632e281fbc5f3de0806415edaafb7aa58f0b11027dab3c255a3eadb996a783782a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (649, '{"ob": ["15151515f6eedb9b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85628d9246a2c14f9092ea7949a359694fe7d2d2131446e21f25db68a39a6208f9a295d629317e5da96fba589007cb7161b5262984f4ca27480e4b2d109428ba54bd95ea03e3322a8e006d3958ad6890e23c62a480b7951ce197288a39aaea65f844eb286941f9b84dda4114d61fda13228c6c9e35aa908ac577ca41844f65273a43a5e8c62b57aef88f29c67b303a3579aded67aca17b03ee1e6c8b7dff518291c62d8a8809c19afcaf8603b45b45ca846b4b4f96ed942485c18e6b0e915efe5abcd8bf326c20478210795901f903531e2f4be2c0f2ce25ff395c075afd7f728653351ee4d6d4ea16127fcc965064eb71def68f6bcc577e4fb1de6d4fd5b088f07c89c9c963981b11acb086251a127078b38da19519a46a2cf00a63892e5953d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (650, '{"ob": ["15151515f6eedba6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8527522df403a8be08b0c0b100a0902657394dd11d1cae3f7b22fa406182041dcdb726ffbd026d34c7d494690ccb109e5a5b4aaf0eef8d65a32cdde88a46cb5ec29cb7aa0e01ac7fdb78aae368adad06669a3199341bd4597583565f6a3d361eee83a5d074c5d95971113eb6e6a7cfed1df0509770f244471126f283533cab1287c15d3998729004e0fdbbc54fc4777bf5c6e82bff3ec6e784d858542eae69fd434f167d24139d2f161577e722788a518e750df8bfc88eb3982879bc26d62f21720753da721c25b4cd53560074edb61f0c6f8b3c2a9982daaaa6537b8001454277d60edce5938ec307ac573dff6f939a18cbcd4706c89af97e3eb50212ed9bb65445fb8ffab559fcb33c2aabe93e1fe9785d699e8c67525cf2bac29ddddf580b05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (651, '{"ob": ["15151515f6eedb12892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca7c2e2c9d0a9e039793167759ed2208303b824d1226a9367d56ce48254cf59d112bada91c99f43e7300fffb50987ac4e5bab4d63a3473b28a737a936f78541e896843cbaf31e554c555de58a78966ba187d90b25fe64f4f485c09d90298b5d0998819c1e2344ac9c5e18669d6651f846e4d0dc7f6c3f81213688c6a2de9c91517d6691cbdfe59fd89f72fe6673f72c5fc72f58ddf01afb52e49a1e0a828aeb9434a1fdcc03e3f034ae1240a948d8bc3ea74e66d891799734f36fb40a93504eedb21b5f645c91376a61706df7a538ace7a62271d8c337bb6c290ec9a074c05ee8c483115a0fd5f8d0e0b9f1269d95c0bb367479d2422c7d1a916fb2cf20ae7d74d58cadda095fd7541f4c221bb581db5885256983ddc03d03606691011077000"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (652, '{"ob": ["15151515f6eedb53892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852203ba402e8fc77732da4d587b4ddcafe21155175b42f5bbf462be8792df43f4273e78dc2f29f87b531c71d6b1dc0142b3a968d0e8d49d895f7d176c79a17766ed3c872fa2f61556a44720f63592db53265232e7eb2c476ffbf29dabe2eb57d979b80eaa34b80ae8a7465679636c0fc026d730fa261c7cd19baeee0c6d050d1febb6e40cb0d78339f20e892405ce02ddac0b404cc0a3e5db3aaf05625063c424a1eb5cd86569b216016d81db38defb66243a626d53c74f92bcac7fe08bbc0961ac7d0e1953a5ea62f2eb78419590cfb66685c356df5800dc87969419776d6cd3761a0b0967e648077e6b39f675a0b61f243b0bf47aa64fc9e6c20ea81726ef0a0aaf134dd1d363e71dfca8412bb26c3dc1797b1a371cd084b89ebf9b400729d7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (653, '{"ob": ["15151515f6eedb23892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85708af67ff84be8f80a9fbde50119cb1eb8eedec9c8ffa4f0c522369e558e8d7ead9b057d44b111a4c3085d156dbaf07f4237383473a28963d18bbe625799395dbee5ca98d1a77a8028865aa109e62458aec9ecde2e5b5f13a668f5f3f665bdb327774a83bee178b2ddf9c64cae345de11da1db15d3038924cb41f793be5188ad6dc9daac41ebf720b0f96484dca33df8c2029a28de082c1c8da1e66c2f353ea2da0dea8729453e4690715aa5b7a465c84804b24c94e3c9b55d54772e0e52b9c9e73d4fbc6200e4ea1eced0376feeb36e6869474454642a45f453f5ed9c2d156e0401466c7e746b5b559c1dfdca27f64ccdaf402dfab3e6102165bad4cc3d4df3b6968c26d1362395c4bd7f99b5815fb041c2607216c81e3b2ac489121bce6e23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (654, '{"ob": ["15151515f6eedb05892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ae1575e1c7b21a8db9fb42e5fcee1ec4bf43306203d6ccc75db4037bd83765c0005cca95546f15123138f039fc0e3cedaeb69cd828b3c17f36eb5c15bc807291d4e02d77ea488f51fc0bf7b1bea79e7d494cdaade7b489b490278eec1e66e0556bafd3f9d6d6df86f6e30ece1830596f2b3cb9327fe67e9e32a88f343804f48d70f82e898f15dc0b071271578d136c2118797aabe9946414a92400550b4da6127d74ae2073f7cf6ec08304d1103e977f5bc1032ad857464150b7b5a30c33dcf49e9a9454bda795d6fce88a4177ebee48500bf6be2899bf99dfce4b0e33fcaa17f913b43faf0251caa3593ed0e40df19f582abf027b3e785324aa2b2b515410ab182bbce181a8ff4a1e3a0003f7b9ef73b9e06ee27404af6ad6ba233ca549b51f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (655, '{"ob": ["15151515f6eedbee892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851fca05f0d6cec7423948cab86c4dff53f534f45ba63aba335871b93abc4580081f22cd1456220e9c31884a710989b8b5762b808c9ee5c27e3d6dbd98fd1e121bcf7c73cb815c0232b18c9ca02adecd857e352ef4f954627be4aa7f92f502513bab9d188e765c4ab757876804f0ef8e688ce4aeff21ec9a79f27dba5bc08ffda6e5e26fcb50c2a4e1b2a2037c767d9989c6e974835644fd9bd5221d0440e24284333cb6ea8e9e443548a655c960a80375cb8a4599e03bdf89dc085fa88f2ca7d888500cfe5bbdac44c4c35ab6bd3babe8990f3cd46bf5874861cf4543b5c197c99316a5a1baefb49024907ebbb359129137aaf1874afe0be7802c2938b1024948458a848f7a56364348f2d195acfb476c311ea299686a8849ee24f940ee68c59a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (656, '{"ob": ["15151515f6eedb38892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859b850fc9d5a07d429aef3b73d0df31a7facee4f7ead7f0433dda966d466c86f706fe753adc2c9262937f33df785d4ad5c0905ad5fcf939580c42756cc558ca1b841bd520a6f382edf2083dd5a911a1b9d034844609ed17c9f0779ab8870d83341cb2fdf8016b78e295d45215eadaaf32152eb9fe64bcd83a25ea033c55ef6a08b1ae018228fe7bdda2e3b5d79e4ccb1f724d699aa957da56818bce0eac5c2492b399efdc9b24ee311f03a9df04f66b7e82681c62cdf9a403d8836557b01279b6e639b2505a1dd9c54542b028683744d3dcba317a02f8fbe4253140982ca13c66b515957e0421a9e751b1cc59f3c5fd65e7fea9ae20be59d32428e93ce0c95662ec196c99772b1a55aa47943813859954d80587774c16ec7aff486b6aca5a2a03"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (657, '{"ob": ["15151515f6eedb2e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8553677c3f673cfa73621ac2c36e4cabd0117ec95fe9010108edeb7bfad7cd0c6bdddceb3a86a5cbfbb07de5db096732b275189b0b40867f298cf99588595f65d4f07314066b78818ee73220a271c7bbbbcd9fc05c1c0cfce1c906af6601e5d0d64820a01dca65f6b1bea00042baf45aae82956d68d7a642e1bd5f1cca51d39d362637b7d0ee6ccf1d00b96f87c86d0291781ce67961ed9fe52790225a7642f4b53a977208dd7431e064ebfbed1153e9c9190f6344a80e44922204f1dc29cb11d3fa020e2b1c6432e1bd1de891c5cbd5e8b16fcd65f6a13f61e0813740a0ebf50de447dfa796b192c712bffd83f03efd8149d5628e9bb04e9f628bf80fba75900b024c217349c8b4341ac1019c7a356dca6f874fcc9dbc29eebfa40e5438d20c63"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (658, '{"ob": ["15151515f6eedbe8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8576fb875e27c6d1f3b55c5f1defaee31cb33710eb554aca3865b8018ec3305c8d484f5db345d127af95453acbb98de69874b8564c98b770264bc2048605d16a22c94c681ffbd2b8a5ecbb860ae8968939d3c8d725a896bc37062bcabe36a165fd9aed51a0f7854234d64899a05c82518f917c6582ab04e609aeb7abb9959c4f7bc11370dee338b0d3d3784084149e141c72aae4f3a877f5d5b2e9e6009bbe39b2025a7bb54fba15fe9e40a1f8aaf7230940d6a63cd8fd8e645708e2f3188dfd86caaf73f369c5d4a1a2794de1738da11d30d3b7d6513e279100080a4e657af82a92369518331d61a4c1b9c62820c8fe3f7bd464597cccb02ae4b93a06f79ea39118fa0bb7084194ae92db1a91f0e3f06521501790fce46a6a63a2ffd27bd336b5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (659, '{"ob": ["15151515f6eedb0a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855bb5608edfc6cd9648adf5378c5a91008a211fd96556141982bc928ce0992a5e1f58a1de618512d2b207ffd590b250f589d05ee8e2aa1cd6338b7551686952a9c43cad526d1ba1e6f87360a8005e72fa0dcbfbd4daee8e0b3c92bc6372241e40dcdef24613ea315894093f881eebad1cdd2d0536ad3fa2aa41e1090cc8e083213ab7e657caf394c784f46e36f1499b647b64ff664f12429563c105236ad910decef56640c8f6cb30ccaf058fd44302b589f6b2b4fdd356bc6201eb3cda5bd47075baf6823862cfaf8577c32da0178521a80d0efcee32cca192f8f8f05f5f72df53b6d6f9ad51a336e92ce00f70114de7e67ea022540a38f8aa4d68ac6368d1a641a8762dbe1ac47376d4e7bacd234c5940504ba4c7377fb9628a96a5aa71398d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (660, '{"ob": ["15151515f6eedb42892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c0f289ae8450f54974213877fee2f3ce89d75fb62d0fe590441f8ced106f460a6e900e894ad95baeda61b5514713d0cd84cb9111e032f38305f52d93ae675ec0b45cbf29f76ccddc8890d01ebfdfd903ff544837a8366fe2ce11149dcc7b80297d91a6f1bb553ab1bd70c017a771d0d34ea1eca22d981ff232f41b93f189e599374a3e86cd37dcbfbfa4fd20c50a550603ca61ef79ca6a2a35c6625bc5c830fe90201f0dce10282df477b81bf09cbe818a065e4c78853e0d7224a532d544ba9a7507dfce0501f4be8de8fecaf07b010048c06d237ba397a015ac2e7500d3aed62e00a89a74c0c7d58d1c9e7a0c7b2f86d53fec18f988cbd07908cdfe725772c9886dea5026b170ce18d90f02f91856560087602029ada23e9c6db7c7241a2f9d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (661, '{"ob": ["15151515f6eedb92892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cbedcbf43d8d44c39d82c8e504e01a0503fbb7e09bba47a9480e7de26c46e49256640aefa1f36a4119302f5db298ad5d98d6627e4fd68683f6d571160507cfe9c1cab459729344b1750a96f776dc8e42c4ebe28d715c3da33f63bf28201369fef2b4dda5c8de9891072519825aff4c39b8321bcb3e0cb62cedfe01b4deb522b265e7071deba46651cd9ab741a246982fdad58a6b50abf8a69f6268dcf6047f86dcf203ab65aa7c6cb3de4d3e91c125c3344a5cc896051d8630ce36a70e3968b00a6cee56f7b92b148a3014caf4faf7282f9c4fbbdb793ea502f5b68a833057b92106d775a15dbd0a03edb3390487846fc00ddd64b4e6d6c0d996e7c5d6178c56570c24a57afa84f10c5b8acc4fe360b1ed227bdfe33170d1cd84355ca1c2bc70"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (662, '{"ob": ["15151515f6eedb7e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a26b35ec2f0a23707923b2f6a273b6039ccc3ebea84f383aa23c9ce45096bb09d200219b121712fc5a58e8802471fd04874c7bb46045aa47d555ff80de134b9a5119e5ff8d88e27fdcc111b0d7cd1bbc3139c140a6bb20fe7e96d94e8438156fa52daa4c68e206fe846a4ebe5f306a9d3ab4a44eeebc1cf7b3247b2113304cadbd8bc948377dd24c141164d055c7b4fea6c34d69dddc6a15cae1c5513195389e97e888368f091754ce6c56727fa4f3029689a6b8190c0f55c473157c9e102710ef5612059c3e480b4fe32dc2a56463ec99976266d784b6871c526f6ccce81a182b7837601f415aa686ee7af1eb6cff1ec330637b71788822c6aacc02ed3e949983fc8630a459d9967beb0ca0478944c31ceff568c0bf6c41d2d1822e9dd9c4e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (663, '{"ob": ["15151515f6eedb45892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8502a4653477f514cb1bafe8f61250b4954b23e44316f288ecea1493dfaabebd9609f16f753cd66020bd49d84b02909147bb0155714627e7c82275220b5fc22ca7ffc822a9acdffbd27ef71979be5804d9460db5069b9c50e1bc0cdb774b17ff3a01efd4ece129c778ed5411b4ed2510b41ed40e29fd1f720485d7bb169b5b03d92d133123fed3888fc2e2de6719bd61ede28c89e2ffd2a75ba4b69f1119adce6dcb70f6236524eec6e78f6c6bc75038584b3e6dee916d3838b4f5a0ebbd0611fcd69d06dbd410eeaa25ff2509e69be4c3704bf55480a3e38ab4381b7ee7d3ff6383ecc40a4b82dc9bd8e304a8fe5e7020ad3aa068cd13ced44035ca725b562a5d9bbd7cfdb1f05ba884eef92141b29b63d2b5372049e9bbad43c184ffe248620b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (664, '{"ob": ["15151515f6eedb11892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8514b8089ab7946eecd49a739be7dfc31b9bfb6fc759df7d78fbb18f22bb9e09f750e5aa5833342fdcd34f9d16c908859b7c83939675da3b6550813c2759f28c1fdce63daca1e62cd6c71d78c65c2b2f75a4aef491f5dab70b35f565cc838aa3d05e5e49c15ceb784ac4a7905d51c44f238561a06244cc950055b9c9c2c12e100c5f8a6f78f4e0dcc66fe0191f77ce0893ce88da926770144810fc73ea5f73d31f4cb59f43b05a4667693af1d517f0f4b92363bc6a3b8b90d14e90f641b6efca46bbe02b9c968ced160f8287039caddd4f2ae013e5ea0112c3003a58ce7d37dbcb0830afd1b21c2fb55849a7d82e54040cd020703b4d46ad56afe565b7f68f8b5e09b3e48910a82cbefc210a46fb47c2457cdc02235688ba61f90ba928b7dbadfd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (665, '{"ob": ["15151515f6eedbbc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e2886ac2c6b9d36c4248af7e367cc84555336052c6dc29a9070f862ee6cf253d89f44492766c70c3cee44e6615242672364721356050c96c83583337c26762ffe2d4e39269be68e14d4ab9c31168b2095bd094fec0af769513c8c6066cc9380a508ad5511e78f61953bb9fdd2b3a3d08da77da7e9c21e5a3856c695eac31aaaa31516b3e533b25c748f7ffd6219812bf8fb416e870d0eaa5d544a39bc54bd2d02c89363f74621ea098ecee819ef9f74e21a0538d65da911f7ff7733db5b30da8b1d8113b910e4924799d141ae5e19d96d64d0e7278b3a626de613b239a2fcdc2cf7bc9d728ce0d20ed86cb1729faf27cbb49393fca0ce9c5dbbb4ef3d39fc76a32a7f28952feb8c4460fe422b0135dec0bf8ec63db8e79fb26810009a5928369"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (666, '{"ob": ["15151515f6eedb67892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854e3d8270bff4f029660d2b6c7de1d3c9779f72bb0bbe1c7801a6f935948170412ee9d38fa690baf90902d88eb8ff29e6ad16fcdfdb82bdc141f00ca7787a0b86f83d716ec54c35361465c1dcfe65873f4e52715854cb4358cafad4c3b892c84c163cccb9087d58784116fb82c784b028b62dba52cc151b117134595c560b89a8c5dc041b1d6de503c3493e2edc7a6fa103dc97a02dc55b0355105c57becad91cde597a8cc169897e2cc20bd66b9ac1b3af7a85381c6df9dcfbdc137fe221cecd395ae63bb725bf2e242e213bc14866f6d38e9fbc8b753f342bb9359c50d3296947e41fe78ea87336548056ba0936097c196c9fec77c3ee0ab3187b7182e91ece8cbeea42cdce1ce1f804b32fc454f52b9067ed7a25f7f284efd238e89fd22c39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (667, '{"ob": ["15151515f6eedba1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850f37e94ac122e06a561676109b91b491840c3eac772cf2f77d8b1895e30f4f7db549b312bb9d9ca14c5052f51ce52ff772c5e04db0e7a1f5182196b84bd80072d468b5cd364227bf2daf8fb1fb4dd64bbba801c511efe2e7d8daae61132297232cf82f2c223fc106cf89f9fb660b7a046fb10b5c173756b5133d31922251a218ecfb838629fbf00c764a6b4a74911c5aa5745951496e289af8aead91bfcc2d69b732748704fff380a4a74a1b01ed309abf6976e35ddffd999d562cf6433e9ee65a11a6fcb55a245f3886b4f411eafe92dfcc1cd3da9ac9af28b17e5e53f9839c919631665d9a829cb213d098ce70a05293defab1b7f999db3b118b95a0ac6c4d8a5173335f6409a7bd3507b0eaa7d6443c09a174d6528975ac3eedb6e9f80704"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (668, '{"ob": ["15151515f6eedb4a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ce21843a9602cc75b1fb4822464a9b0f0b1a2b09d377647ccf22e6e11ca2208982f904da4ff95bb7e9400ddfa96ded2cb8085ef0a6602fb2165d5ef38587c3c2278e9db4f64aea79d1b0969acd7edfd7d9548c2eedaa8817e41165278ea5b2957156dca20775d3ccf5ed42321c44e0b7c1d9090e7f3bc2312f4520b6c9748eca41a008d2919ac4057831147d528e07e4f844fd52bc36256f7c32beba37fb7032deb6ce9eb3f23ff063288d15530a9ad1aaea67936917e9ea3c188787a035aa9713183ccd78f97cabfe968fd454e774063665e0b8b05d1700d7222e976398e681169d308d513ae7a6ceed7a1bf0fde1c013e225a9c22db6bb6df913dc59ebb3f0c1c47ab67a7842b69c6987b6f54e40dce476e01141c55cfaa11c6521161ff97"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (669, '{"ob": ["15151515f6eedb13892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856758221f22a0826a8ce7112adba389cec1fd828676c432fb1fd478d68be0e7a5512713d1c8ff37a0abf10465134a1ec9ec4e01e23d53fbac43420785fb5d7c85ea96eed51d25b68b06932fb17b67d0f3790fa39e53cecac072e91ee826daf91fc0ac3c5ef8536f6527bf7a9774d12c7bc619147ef4a9607215647daee0903449e734105972c4241cb774142e60622956dffa2e88d4e8351799775e06651a657e077781b258c9ba37d3a93b3cd565e6e31c4446eb09ab4a2f3d09a3bacd97d82547740fd156e2fd4f2fd0078170d8d0960db205317f91fa457cbc68c52d3919c0e9041b6ce77a5848f660e2cd1baf73e7acad7009aca12992f9ee368bdf4f5138a6a28c28af27e8354ff893431e5bbd9b5edf9569d6dfa0f935331e79504a98c6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (670, '{"ob": ["15151515f6eedb78892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854f42a5303c49b6de200adf5d5e435be7d072a949707f288b14a17842073fdd61a6c17b964da81d80df5921c85f7c8a8922590ed05d162e0f6eb1b464145a8628c768422077e96f1b80598fc9810c55500d1efa30950ceea71f8ad1c1c771de7abbcd11f2c324620ea6abe22ee6efd73a7ce2347428e4c5abdaf6cb69a482f4ceffbd96240d3917eab2c9a0684595846d1e624908b54792665c84b7893db4ee0dbeee5292689f066817cb9b1dbd09fb6562724df11401d87336cb27f1ffe647a159bfb14929e60b92c5c13f2d8721548f3fc42ac79384526abba2f3ac90a1b94e3d9e31d65b406e03843611f9c58d6c99abbb5c21406057b989f232c27fab398dcd85f49ddd6776de13d97db09f4e10d539d247f33009959e5501a099da166a38"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (671, '{"ob": ["15151515f6eedb84892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c54df8b9dbb5ecc95be1f9ede41a798b1b78e9c478867885a1ff6574c61f57648ffdab76baac7907202faffbd2b47ddc8d2663b7f43239dc586d1594872ab21621ec7b5a7bebb3ec5ae8733549f35e4c688e435ae522c9bdcc9a05d7cf01d6c89c20eec7eee4cdcafedd6263edf5a5222d044ee7acf9a244104891ee70b61b8a529f6992983544a718e63bb053806c2f1ab27ee483cc93e0e1827269abb3e463649ad25946846476a100804d767c8259c73dd8fa4ce267cbf790f82436059c91dc801433a6e702b151554e39c479c86ce08ae60a283e3e6a99d8fc78989e31fee460a4bd5b864bdc38f536c855b60ceb91366c26de8128da391673491647433ef077df847e4947ea8116da801da63a5f25478592da45082d5821de131cc80925"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (672, '{"ob": ["15151515f6eedb41892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a864e1c153a4d64296a378c02486df491f8bf4dadbf108a25a81efe78e602262d596e33f897c863b7c47e2107fca9ad5d11a6e65590f23ce5dfde4f08c8864534725407c1342b076a4de8a91528230d8a8f7191f11506c71741202f580300ac7dddd23237a80ec7ef248c3415fcee38feba2e310edd626be1210f2f31f82aff52a4091372da222b572219199d6cbba79fbecd884883097ea1bbeb24b73c7fa7e1d905c2ca8e40d31fde87e6acb02e3351e09d79fe73f444a1e626b655300c3b5c539688999e2e6f6d2c5c8a8796b209f411d816d706674256384ca785dcae6e488d6b1d5e1e5607a057c5813a0809a20e3f0f429cdb545b2decc4e1dc3a9b13001d463f18f4573cddbe03323d5b160ffdc2f2d9721fe19fbd221c6b1eeb3245d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (673, '{"ob": ["15151515f6eedb1a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8568fd72fd948d1b50ad31a01ceaf26351883a426e9424c299cdf6721ff5e18ec9106e28e50735551c27687bf34bd08f989b6b1376e9a5193c0018449450b4b5223412f16fb4f71f116de60d2dd721c7cbe43113b3c965c339bdd4fce98ce8725908532b759019d063e7df89f7270e93f6ae155085a2fb4c5e53929711ea891d8074b33c6eb0d20e8c0d78734152c50fe6bdf0798dc181df22cef881cc8486dd47a353b2c8f5f66b4cc2a56e4399a92d74dc712507b102c7bacc175834b3a656bbde3f98797d5ccce630ca982c0d78584155ba28611acb1b801c0501faeb62315a4cb2f80ee4d2f8a506b239e9fd60fc0255f19e765bb6577946df97b14f24163bcb06d7730e3b497d6b7275af81f741f441d41a5ecbde11c89315447b8e047395"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (674, '{"ob": ["15151515f6eedb59892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca53086aa6a59fddda70bff64b2b5eb5c4bc87f9d3d8d9add0505e7186a913d6d31ed7355d48c7a1851254abf15d401750dac6d2ea03a3f8a78b2b77a5d2758edd798a311448d72dd82cd7ee2b8e6282a69dd8e6303db4f7a2d37b83ce4592c1c1591a2e1c22033d514b2da05a6307f0d2218f77eb36dc5f4e642cb59479cc45e34cdc05cfad5d1f200779dc1a3928fd9511d9f0fb7400eef16ad54f0c5edeb485da4f57f0ed53305f2dbaf442f5dc3247fd3170b80282797ee4d243a56935ec06f5d37c1eb6c4de7daa2507f31829818cdb7248c7bc3a81bf648511749e9f3942aad5ef29c462bac46f71eebdb237f39ee9d2484d68b140d60fe5e78684ecb649a798d6aa78eb7fe63d7389bed83a4b41a261b33f53297852127184186c3763"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (675, '{"ob": ["15151515f6eedb56892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8553678cacf1fcdfaadd08a2409bc6d8f4adf65608b554715a1c9b9cfb55de7ad511b99b419d8832b8920fb940ceadce67335033e529045593ed2e766ef01f32e58c9ac28d6e05d18549fe96db472ebcb2e9aefb9e5f79a0949c85df5d9ae86b7ebee94a384f22118945a228acee4f8e0cc0b5199fb305ed1ccf216214e355ec7c9d77cea5e63fa228b385b214a7f10af98b7e4c4509df7778f97c3e531a01df615fcb043f3587e74b53299211c5fd4432aad17bb4d58b20b1067ada5eb2dd6c4f889d072b77f0667fbaf51b5bcf20e60164faaa538c3f8ecc5ee679bffa2e711de22805823c714824127e099c514c15dade793adec922ea3caf72dd80a4d687a8cc481e2e2186349e7f271b8da99fee3588c570ac969f7b68f34c623dd0c35ece"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (676, '{"ob": ["15151515f6eedb1f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851aeeb3cf68932057077e59f3fee33e8f5c1532e9f7a45781f6c2b163f407c883da88a384aae9ce1a302ff0ae3fc306146769c4bdc9aa0aaecafce2fd8cd091c0d0d4c27eaaf466b2c90ad62c811f8bef512e02ebcd273cca9b520d8587c43eab409651aa88a5d803fb6ee587132a5e88b8e4246637ed6badd126c3441cf21b9be9d028235f4ab928d57c153e498357530bce1248e6be9046837371d813b12f70b47b4371663944045d01b820bce0b7ee09fcdf1234da9ce1d7731d09f7590fbc515b58269d9d7fe6d41b21906406afff76be77d59254cc542e507f5076de1820a3e8990001e8c620a55b45b04b0da84b2a12961c0f31052b2a6914d20ae9e9e28c0e9dfd3ed43c96738b43cf6756b39d8201ca8de3ce0a131c7fe54c779754bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (677, '{"ob": ["15151515f6eedbf9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854396724a70a0f7c15c48c9b28250530b1f9c8744a6f892be2c8c03a56be7d1592c0e917f26ad1e2d9ea8c6472c245504ee75955b8a7ad0d415e3360d46a9ede4dbc2968d55bee293e2394f1845e2194017ba685ebc62cb2eb86c137a4d08ee63ec4136461bd1396bdd0ab87002990d6eb2fd9722784efb2d717f4aa8839d60a11df83ab4821c55bd2b9226e70d33302f26896850ce2a3054b2f629656818c4eeb21ba425e39b6de2f3a2a96b32894b6d92cefab282c37ba7713d17025b9d4daab836433e3b7d9ff8b4faa3cbd872ebff6609d6093af9e4d687073faffdc0e689e8ba49fe1debd8801c31affa9fca0fb61957943eeea2755d7981a93b0bab023b8d4f47e38b7d359aba4aeb8169c412c7a680a820e5c4b46586af7a21aca58764"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (678, '{"ob": ["15151515f6eedbfb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851e49a9a8bc04f9a0119128dc07bdfeb3e3ef98389f9dce55e0c0a8306324feb508242e348f09470b88b87cd05f384e029f8b021d7faaefc57464a5fd1d0e92e2d9c9b938ac719baf5fc177d122bd0f4a7f0938759acd3198af1ce1f9f2b1a8dde420b5c84a922ea981165e44e9e3e49552a410a957b6e765827fe47d4607581ab649c24c4a819f837554dac006b17fc09f76bb50a2d84803f7b902ebed0310c711f8ebdb53af0c21860cc51410c96a5273f4ad974c0bee96d31c0966aaf28676b002e4a00319e4afb747366e93912a98e91093ca9b89792d5f49dc541fc3764a6acf6b7e2f3c7c5490cb4614022eadbc8a5cc3b524f9d59c257a41f5c65f0f11c21dbf81a4215a6c11ae42645df18243067867c6c176dd97a1a2383c40cfe86e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (679, '{"ob": ["15151515f6eedba8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856df9d9054caaf54165e0edda690e0998403ceecee06d5f49db0a9ede815186335c587cb2a3602e9c219bcc2e8dc11961a856d89fc917c1ab00ce9f67c0023ff1419c5736ca390a14f5a3ab87acfb259704e91dc69bb807dd775dc6023634f61d2659ce992459c9e6a6250b711ea8951ee355020dce964f280f34922807766df13de5fd178abe3dc7e697c95f4534b02895ded6ba2b6d206dd2b0606334f24e705f34a90fb6b28bc023bece2e09097f6a397ed6cf84b2a160b661a9472666c9a56375653d97559ff7f66909a0ccb9a53955b01ebba07949167ff34c626389d491a47c448c05706bf4a21bb083e0f163fc70a90051bd1dd21f4bdaec83ea6e0491eae09e70e8be668e10bc1376affecf9d98f88aa15dd896cbfb74596dc578d93f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (680, '{"ob": ["15151515f6eedb51892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8547ec634dbc3e52762acedb79301f337e8e2a283c139176e982b0b6aa5a60fc19adc23d75b370e4ea7dfe872510b442f91132abdcad54927360e201d9426bfdd313634f2406ebce99e69a4bf129f6dbb5aa27f2dd16670d1434adcc43098ecaac14fe26f4af19c58fb65d8fd50d485f0d0c718819d77f970e2a6fa4e460590c713c00c5b6a01b3d97a0e4efdf9de1ff2532645bb9dc5c0838338c07f2b72b8b15fb08a70de1202f4544aa20f031297e65ca9065d6cc9d0a9fa26e89ee66214522ca643c27e1a6496f9c492fb6bae875852d994e4be740ef4736cde026ff7c30fb4aa138fe28c7c1c20b616af4307a0bd151e2fec2db0086dedfdffe4e3e81171f23c9bce76c3b0d8c0b0ea1adac2a1c51aff21ef0146d518dab7837a54c349fb4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (681, '{"ob": ["15151515f6eedbd3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f7536cbeec5668b75ff529a5a550a1acda972070b55d6d4388f78c9cb21d7589c9ed7a02e1a84e11e7bad524efd34525022df8a7bbf6324c7ee4035821a779bed7c5547f5feb3c3914083bdf08ba2eda755ed6a1b5936640eb20cc1997a479241c8e06f0c9c49d7de262bbef0fd1dcd0179a4336493db49bf36cbdb4c62c50a025b5a12bfc36a5f88fabee8212540d211446cb3e1297911ff8809a16ceb73e5c4f3a7dee1b46ca1fe8dd611fa9cc5d0c4c5274730c2820caa7aec44449b64339c7858901cab4daf5ec3bc8ee519ce58ef68041cab1b2f8822f30a77e44679907f08b66e29128c9d986bcf5edce9ed862aacd04e0bf672c4e7b1e4102a90aff702da7a758ee95b3443380cbe7d5023aa4be762e3a4702ab95560472e0284d87f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (682, '{"ob": ["15151515f6eedb03892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850120f6e5844767a471cbb320444814fc7b146c563998127deb416a749c5fcb4037691b041cc45bcff5ee5f402b790ed26b5b83e4106c5c0111314353b0e6b9681f96c8c26a29135b41a8ab115c87177487af1eda9df06d659bd3e050891f75539d37fae9a7bc9c7f1a4eaf8f042e5e130be3abbdf9cd53c76e0bc0d3efb3f8b4bfcc69a7c2591eeb832941f45f67533cb02610e6034a169db9340d202107e15411716148122e13b820ad509384605cc16811077daae92a041778c739c62152b0cb8e2df9d00d955fee5da5c7ba6047917334a08cc18af7e05029a4ac54702bea0872c9c01952932d68b9300a836a753280636d6bdd46c8fbba48bd1e62283d7c8790d732dcc5926b2afe3b083a608a0eb6f9352c8f4f5981cda1b7e4053bd798"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (683, '{"ob": ["15151515f6eedb2f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85edbe3972d1106aa4461ceb35368eafe53402412ce5ab3acd3d93bb24f971dcaad69dee2bb4897a6c902f3b42955090c9da56c627d5aa2d696588808b5c7425adb8c713dd28d2470f727cd73773192aa871d000716cbcb06149f22a748d5bae83c8f22674bf7012e45520714b5fb08836dc0cd9b053da70a2a774bf4a436ef67b94171b53c296607c2c933710d5fd1f62adb5d706116b8454d4cdd413b884ba89e475112a69220360fd3c3ce220bf9816256d6f6870f3511d8237c7293071a6cd61e8260e38c1e9772bc46e2fd00bbbc4bf88187dfaeb2a03e7a370e8c20388dd011f7d0ee1941c39384cca0d6209910ad8dae625ba94d9c9f2878fe3c4c5b115889306033f33e8b4baca2185fb8bb319ce04c13e91219323e16c93abca035c0a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (684, '{"ob": ["15151515f6eedbb9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a57eb056ad4dd103e81dbe956ef8ecd9e6934bc8cf70b8ba857b047d2de07f6ba572785575a8bc20dd7eb2c0f72a64f4cb913a32c413a0d77e43a1b96b9df4d5106e9b8512411f5ab95eea462a4a1b91994055463f2ea3076a673a74a603f6a6590ebcb4c1c99382e2a7cb3688187eea416a3a668be69d7d9c713ed46ed85445787ed8f65f6537a6abdc8c76bc8f05b15510bb6e37b66f16249bb641ea52e89bcd2460848f0f9babcf3c466c969fb05cc7bf57a9c622c2440c04a760efe5990ced97978d9ab904817c45f77304d47cc5c2d893dbe1f59f446833e852e370ad8114e41c4d101c91c9b0a65919766accdc2259919e5f79d73b4947b405344b8420e3ce0c9e0df3390751ebe524b7ecfdaa7ae0e3413d5744e563202882dfff0884"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (685, '{"ob": ["15151515f6eedb14892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85043af31f3343549fcd6ddc7c4c65942af8f4c92a06046ddfab6f5567978a316c65690e7d969b04aaadaf93528bb2365ee286015d5205554956c25034360763f71bc51553f7261d0d86bae0190bd4b02df2a83400ae379ac7bf320a88cbba39d19653b4ec4b4c865ff664516c1045c5427a6f72659bc3b8a6befa72f8dea13a0f25a92bc14c2ee016800675696287c0c865e4d4b1767ec4d1b95f8523e7983cccd21171345e72ec99792242dd5ca8774bf34ab89bed16608cfb1175e8709922413682121beb0cb540a0af89e4602513c41c8cb8afec2e47580e40d4953a0ad2087e2e4fb705c27ce397700b00e6cbb2b9ebd5d4640b064f74174e7334a5a12cb75d173dea9c38526fe515028594d6498ba63a7e291c0158473c01d7cd776678d0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (686, '{"ob": ["15151515f6eedbda892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f6f06a1dfb1f20cbd26f40bd0cdd0e0669aae56871bea7a65eae6414ece8dd96156e7579e0373714132d25f74f6a5442cbd522fdcf936bbc208823f81d49a1ec3e47b2e968625ef3fec4b1386372e2637bef7638f84a86ae96f009b12cb8461425c9e56362f5300e4e2dff2f67bc650dca0d650002fc53f4f43929b06528a4568bcd060e46d7b5c6c3a9eabf80a179ed55d6d6d38eea1f110a15dd9ef3961034696a3fd74db3f917522cf729e658574516c16f7247fcd2a960f15c86b93ec3aad0bf50ffc9f6b669a41a16429847d7bf8a7726f36ddbac2dd32698a65022344066baf2f36f719c6fbb05f77d53ad9756273639d81dce4007e15f75f7f4ec8be23ab3ae33dde8444e553f684be7c1694cf1a02894b404e0f16e3f495b5da23a2e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (687, '{"ob": ["15151515f6eedbfe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852fdbeda43cb09955bf13c8f20c75fc4ba50ee307662697f0a52ef528dc53048d93006b55913768ba42dda1ac42196de3d307323734978e27c0aff99df7fe3d5ebdbc3fb554f0656440f30d4bbdd9e2280c34d030a890dc65a2e49e5c98eefed5f69e14c06f6c14f717a7371ed28e643a1a09bb3a5fb53daf9434c5c553ed77a8359b3c1cdcd056e1895f5e2443183a42b9db82f1159d94284e6aa4da78da668548976b5f4705d6d8a32587af6dbcbcdddc9b26181fc4dfb66434f9beeb02dfcc037e105ddd778f952b28f3630b67d4d3fea298e63f05ef9d2239313053eb4de882ce436d2ad1fbaa9a62ac0a6d89c0cbb4dde135ef9d0acc56b4f4aa67e38a343b9988a6126da21da4b133787de8131771595a65a4a90dcf1258b9fde7c68265"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (688, '{"ob": ["15151515f6eedba2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854a5d218d3c0dbe4a22e24087fc41158f19502fef51e028df664c75ed15dc450e70397b52cb53902fbf1f8ff41c3fbb6833fcb17a93458d331ae384ccf99d2dd6bf683a6b89bd1154d9c915ebe0edcaad6278b3f357043c573dcb3437156b4ce8777bcbd35056a1a08f66e467dd30750d9ae78030749be4f6cb7f65cd3ac6bf61efe6f14e63ee95c1c09d79c72fed82880d01926a9951efb58ec70a2367bda09b35fb86ed3f55d4b9deae715b6accfd7896bee18277e6cfaf0e5e107a6ab3b645862d3920b7f0c93df146de5e79f9ca83f83911bf6b1a020252454e55dd2a6f77d77a7f502221a5d792e93a010a9a121ac4639c04c3374b9c53c8db34fe2d9b9b0e250c14c895f4b52b50467c347ecca831d99e52f83451bf45b9befadec953ca"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (689, '{"ob": ["15151515f6eedbf5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8506f366c26221c5b52ab57d6a6e4aa4a7e5d744b7fe31daa26f473af7cc9cbe84753cbcb9833d22021d72f5d93d01f57ce1c6be3f61beca14200c8ade48ed756d9d0721340b05efeb82dc681416d0071fef771348cef2a4aa464820efbc84784c184a276f40a23bbff03b751a18f2b88f9b2c33c92ecd87a1cc2135a9de603b8b7c85f808217c8c3f1320eb6fda3bb3ed81f24298f36f750087f156583bc017a6ff7ce199601a87ce93cf98531354c677f7e97195dc9aa7b586fdb715c883c6d506a1e2b7062fab53ef16e096d59ad0bcd36a47b5a8f8e1b33c3aad175a0335a075ad6ecd766e840c6176d48268389b5f7c245a4dc16901ae95d486fba2743ac4496f734cdb8fda12d65e78a7dcd875b7d39e04c6a823d9a1095bc39c565ec6c9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (690, '{"ob": ["15151515f6eedb07892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854c8fecb3c3b64cb190ff3b236240c698639730f2a14e043b50379f5775f6474e0a1bb49182cb1a483510a58b767eb4637726bb7b972f5f8b83d543d151f07fe9d2da65eadf62d148e2d221fe09a547efac613463c3185002b8a15d6a8f5b32d6b2172ffbaed62db1fff3a8d3cc1ba8e23ee95c6e737b84ec366a9b137cd57a2e41d5678294a31a1a01670468648404d9c369d68f2538de6f0b4198a0e7347f3a7a00b0a6f2cbb824d41a56a80b06f4fef6681760632b69309455eebb6e31fc27511f87729da2f3263ada467a967fa4e9433d70c02f37684dddbe08608ab84e7a454afd550fcccfadb1c09a117f8d2bfa38e1ece8837622a9561f296de4de43aae4aea2ee3c4f3c3bd38a356633fe89e5f414fff216df5a2196adc960c076015b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (691, '{"ob": ["15151515f6eedb9a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c876dab29a4222ffe2232a7d58a2c2f119a708f57426c049203123c6f21bcce1f41d3a60a71b2cbc2d668537c03764dc07c00510841ff559b0209661190b1c1001c731d3a85852931605eeb8b2e02459cba47c3910491ad6ec3561b20401b08422c5131bab971a04c51d90269c9cdfa0cac097aba9384cb40125eb7dd317174c772c1c78cc2531c6a4803051ff2797351f2eaa76d0671dfd2192f073b72f13e61527834bfe4fb977ef7fed15036755590a5cfa6af438c86ad2c15c75452d8dffe1d6d4b4b1a26ab2a542eec9356843d06160112fa1fe5d7e952395c9aa126b4a13cb292545591e7c6f48715b66b75154f00b3f9985aeaa320c9d73addb147553747ded7af216c7301aabeaae0b75e07a22315ff2c23596bb23374b1b5e17b4b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (692, '{"ob": ["15151515f6eedbd4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f901716c072b9d76b83c985431e4c9a6c549bbf1626e9ac892673296affe69adbf8f4bd264302dd4804d5f3f2eef9ce0aafcb46b3726f03df60836c28905bcf4c760dfd14d0fe20a845495a89a56a30f584bd59704c6b35c27db421f2167092abffb76289b77c688c3ee94669bd2134f02453413b270bbca4b4106366b3591c6a11a3c099fe052f2d0eef019a5b0a1f63d3a9da9f6e36366cbf5272987f5cb9c9a62c22f06857e1d553b8469d493eaf52a05637b428990af4dcd352f87fa88b96380d09c2be8c5bca4b5563259f67d027fd20d887e5d227d812db86d2199db3cfac3ebdc4cbc0fb4725b2cbca164d178a7bbba01a61a913d7996f2c2bba8edcfd568734db74ecd1495698f51e6fd4a10a06fb81bfc68a5fb5907b7575bd74348"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (693, '{"ob": ["15151515f6eedb21892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8554b6de13f413e850f9b55cb585e87ff00b363a8df4d4f178eab5b95204ffd78a3d4a2189540ef54a0adc24b85773a61d5903646408857cb307794e3a00ea82b9bc229b1f69c87d7662026b966bf65b09d5234e8b93cb24c4541f1ecfaa6a6a4f59456f98ecf82e9ae7ff56fa42768508307fccac0870b36dd1cf9bdb842258ed5d7ee2c78948ee6656a19f95d787d88b54d7c8a201d7cfe704e65fb2b1dd5bbe99a94eebffd939662e3d26eed2b806737e1235475ad8270daedc11f0de9f074c2e52f62ab087a617c05e094f82c1d9d21a0ea310457216f5dc0b62acc100a3d81362d113172b09f3b5d04404fec5b63ca1d82abd691371eb2cadfc874616051a3b163030fa28955e2f4f7156df2efb4deb77898a67f3c55f452fbd35d9d08685"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (694, '{"ob": ["15151515f6eedb6b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d698ef702df87c2ebcdf6fe11b224e5e5bc8579077032a7f5c54cc08d67d79ee6593c6ec8f13154e5af78cc66316fb6d3fdaf73a2d91f07705395cc7002e066aab1a8ad534bf054473bb327cc16e01742c06e7a0190b95f963a7848ca00647bc683c32c0d3c830bddda0fe9ea587be4f5926e4218a3cc55e646076679ff2dce84e72f7c972b5f37c2a2b8e4164324e66b1681ef40a50e2cfc9cdf1292bc20122be7e735617b05215ad43185c628d7c8f765ad7e9b34f9510abfe5cd6a2d69b40538bb3656c2d1295999fc21f4c9f8337672ffb475b337b9c4fd0f0edb7ead83830ee1990d75c5cc30ae43938c787513c18919cdb46d0d2b91c584d9cfe0a5e425ef17123142f6c54c80b3b298925d38ebc54331a2de1162e097282af246cb375"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (695, '{"ob": ["15151515f6eedbdc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8538051b3f0c91ae12033380ca6b508b6b3003bf928d065d3e42d88afd71954759e0bdde3e3f18ec4e329b7bdb49f55319ddea32aca10bbb5894c63878dfcf9872e93dc51bd7b44f932f373bb2f9ab474cd03b38e78b02ee9ef7258fbca522c9f314d36096fa537774b7a10b54bfb980e27f5e5c58bb09b46dd0c20084f4988cc0f696273fede412ad4a069d0e672a31b29d19c0b804e15f3d1bf718d631a23c7c3243f25e83b6bf6350472e08c130fcc81a93dc72821ea2a9281aed97536807e748cf3cd5e66dde750ff6348c9402e8382e452ad09c3f7a320339641d30fc18c55b49462159f7e69d5238c8c3060d99115e4fd8ae0aea4949411b263658a872ba4a6a610388c0f0c1a5b6ce1b9276080a398c04a90f7e0313c21eb8654c4dc455"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (696, '{"ob": ["15151515f6eedbbb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85eb8743d2363ddf274dc5999f282b5aa0ba998b86d9dc6e321f88f80239976a9f7b3e72ed8230cb4d7409801414b2edbfd9c7420d090ba2df301608cb004efedef0373254fb2b8d9aace5d8d2d44cb7f3bc34c1e900aaeb2101a8d35b73e848ae283c2ad6eb80459bec482175033c5169b913f8866803adf5bc6d221867829f57df4d0f049b0202561f053f3eccdd7870070d69a82d1f1420f454ab999540eea7924c6fed08bc149ed14755662e08567bc7293428300e80b61e9470875c37c7ef83e17c93f698b6f038dab49ddfd44d767d16421a213a286956be60e98676a3c5cadd00d7eab5fc549a6ca0f98b746e86062c8a8366684c62821034299e8c6141bd6239915dd22b0113c5a0e12f928400694257436af2c42a9e517c69939fc20c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (697, '{"ob": ["15151515f6eedb81892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857b1d8a93ee365d55d5fb9a6a52b15ad884aedd996a9f2916fa46dcf99e5e8e3615ec1d394961a0bc8ad7c3a164f9b8fd43964cf96d0e97b03f3f50f6599867563549faad4d507d90ece9dcd098c470fcac709f19ad9fe20f4c6ec78c71bcc6045175b450c2e4005710a5c9015fdf33f14681eb7689b91d7faebe6eabc5e98482f318aab89875661fe24e75a4e05e770c84a0caa2effae9f9cab3ee79fcf20de9ede9842a75f13ed692fe320161848b94d3c76e54e0eb6abbc06fc2305a9b2ec52032125642a4e76fc725316ba944fd2d291e633255d50d8a0c2355957df48f5392e282c0d822e66b541a3fc0439c9a926acb1147bb293e2c1f8bbcac2b2544d3fe82c86ced1b303312deb92eeef9d705393920ff37ea5b54c402ce4e20d44d64"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (698, '{"ob": ["15151515f6eedb06892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853bb47f2266e403dfead43ae478cb01e5271a64ff65efca5e85c34801801745a9860e673dc4a9e8d962fe460c43cbd63c33cea3f7f8252dbba339632e1e8642b40c5791ac338e589491812ce0f1a190bdc8c2a8431f65946e8e979e7c634bdc25ee33aa2b23fd894775a459420490dfa6fbe9995f330d36a5500d2e05d1b479d7ac74ff2fbd7f3c1a25dca3ac40667eb931d63808598d4a9d66cd5173cbf1bb4d96ba00ad71570f9f871a7d3039428eceb942173f16b467b7f9ff03ab3b1d8052b5d1796865d0022f597a0b2514f55f5d4b31936f5acad268001c6d42bd8be7ec87b876233928d7c381cb360e3e72f1a81e3bf30c3e4ba60b6aec53bc8383821cc4e91be0feb53a174b5c44d51d7c135dffccf0aeb3bc4d3c80c64919181b7d8c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (699, '{"ob": ["15151515f6eedb39892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856f62502b25607932f5db38359ad53b67b028f4d1c66ee534732d683709c1298e9390d1adf75a1cc5e0f264d3b376533f9be3f5cd943444451d8ca6c3d3dc54d2e56a21c025a61aaf4dea8cb46f8269e928684c9202324753cc227532ec7be56a07a8279f272991a8d3e48d2827a0b51c02033508200c1584026c125ae7f14bbfbec4dd2e45eea3bbc6dede69985b3b70c652bf0a29719c36c26d1d299ec852909d864abcbfc8a43203961d9cacc84466ddb8de20fdbe68dbcca333ceca7e152e4a53f8408a489d09af90437335b6e395455247a6df58421746071999c8647ba9eed599304a8d2656aad037fbc8c63c2d892db8fbb42fca41b2a7f8106ad32dd3aa6dbe23664291b91a29d4c8c40c51e628f0fca03677ab0c334cc8cf6e5a218d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (700, '{"ob": ["15151515f6eedb09892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ed59c9fa98b3742a9c0734401ee4e2a547c82664111496ff25fa00d89b4e7cf145bfd2e367ee9946940eb93c710fb685408e9343edd842c375612202b9fa366256a33e6901ec5fbd72dba9dbf1b276c3aed8bfed7684d90691ee6c623d7407fba7bf87c125af7de7325c63506c6f76200faca15f4eb86e1ea8091897b1c926c110b7a155eb7cd09824cd0bca29ebdb33104ee1a7d432d8c198486d7c18b3d0eff1df3bdf5aa499ba7eb7bce98aa11167d120c2a98e537e45ef79fe430dae5d6fcb53c4f312876b0471d84e77de9dc6b5eabe96749d07ec3af7ed4d11bedb6be2cb274634f5e9462890372641e27f76e2f0fb65a4be2ccd10d49aa9965c14454691093b6f36071933f8a94f567efc0b65b48dd6ee5b749f74629b0aeadc8b6655"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (701, '{"ob": ["15151515f6eedbc6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85da472d4d2949e9caad42327639de0834d0bb3d97246406da54d96ceeffe3ee39d6ec12168746036357a616062ac278527816e88b980929ed9372a5bc325607b1c0f7f2ba63bd95efcfe98a972df4b4703d79f5b3fce2b3a42ec5273489d5a439ff723691a9f099f03bda4106ad70a82402ae7605ba3cd50c73ff85fdbe091d8ca0e333721a9744a01a325ca248f9a5ce0301289850a8d61efcf4b5816c856f75f4e1e7429ffa0b54cfe9bd77a6cf8053116cf2bbef0158f12060422c374c9ef9669ae08d81d7199d6e0169a4265b3038f5c82b379241cf3f6ec040dac3e6d4e788d91ac3c89a33a902f53b4b5ed26f9e19b9b1a1073eafed9334d80f72648c328f22a6b9043a2ae1a5086b4e494d82f8335ffa3c826261d308d6fde5806ccaa0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (702, '{"ob": ["15151515f6eedb72892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8550d152c70d12ca7edd759bdc56fc5f9d863e0affa379ed6189a08f00860f769e46341e871f37d1451f0e808e29528338a1878f10b189740e171d7cfb9fafb8bf5d909bce4ed84fd66f092eb64b1c42ada112816d3efcdec20392ac805b1150fec8b10e02fcdb9da3bf8827cb1d94e81911a58db3d08ef1ae417db62558cbb39c9ae324012aed3dfa506734e4c81b1ab7aa28657773b8f80d43cdb6890dfb355562e8d143db9af870293a4a272c9f2c482b35793e3caaf5ae9ff68677f6bd7770a9503b28ee761dadc736f159809484e06c9250c3653d17e8b9ed2677a60a8c96ac3fc34cdb6da5e7594444cf3fdd45248e6408bc40a810249515475a402f3fe7509bdd6de87f34c0a3a5abb6fea8937033b091d5bbeab6fcc00bfab25a71aab7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (703, '{"ob": ["15151515f6eedb91892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b7a7c39c6d9dacdaf46c431bffecb441de284a2329089bee3d03e9967d93c71a9f8ccbf1cb990a5b88ea01416b33aeffdf71916afa47ad5003aab8896eefb9eed890773aa07c84e78b426db201e0a524b44c8966a3245d3825ad25970a023ca32a45131071d0727b7d60b50a489594dda8496c582838128a80a47ba1bc4035a650f00b85d2a0609372fcd9dd904543513087c8516113cc0639a9f575f571dba730dcae263d8758fb2c394680d2563dfd8c40499c5fd16ee45d76e9c2fbf4fd777d6e8181b3a6b9219df0d7e884860b420410ad276f866f0821c4ec17a26f917b46f43a4198632f11e08589e7f781dad6eeb9cc7d8fc45f7d58fe8a07f1ee14c7b5ac31183052202a7f08cb2a44df581af731e084d7f770d65e1b99cf8418f574"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (704, '{"ob": ["15151515f6eedb0c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d2be91405a6f0f18e76d479bbc9e886e15ee8b680d33becc684b37b130fa0b54ea46390a37854c60c53b07eb71d77fcf92397b58065ac6cc7cfb9965fcaa003dad73fdc964332090b682b1811905648cde12760e314a527791ca1883c943d4a3442f6dee5399ea43b158e895b4ee2b3d5e61730343edba7c9de99b353470b46ff0441b4720941f63a15bcce0f5e17246014ef486ea58b81cba1f858ba9e1460bd55858ce95a0cadb088bb077d2f13f735e81c12114a00d3eee818fab24a419581b2f347ffd2eb833137cedade747526fb3dc7bd4c665878e9326ac29d9c9f2f12fb35e3be0d69680134c335354f22656f52fea1ae6a8b03252c00ebef1169392ad1bd212303389dacfbfa6e319e5636d5babb4e1a3ab4b2b13fe48a968edabdc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (705, '{"ob": ["15151515f6eedb69892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85bedc96f2dfe612406df5f1fad426a3af030d20ac9e8750589b2f7505beb7b23347cf7f81d35426d1e362217ad8a01489d890a669b42cd66bcc43a12e4a4a239aa918e1040d4b870bada988499971130c8548d0333b626f86227e02c1499de9ce07c48f1231fced4954efcc2dbef6512cb2ec9a1b3f80e6a8e7a147f9c341f2518b92f1f27035d4aa5cdb9e4750163cd13c27d7f3618006c2158c465b53b64af1487b63dd44df8cfac6fd02dbd695653bff20b690668d6eae57749a8f5b53a8c3a7499296053bb49f50d7e11427a6342e73378140fd9275cffb81f72e61805fc55ec9862214da4e5267ed49af7a7845eb2939d0c8f69175ebe843c53e37e4f1bece562feee92bfb1caae33b1071beb247656f066281aa4b5589431111ecce41e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (706, '{"ob": ["15151515f6eedb0b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8542c383cc01a477b681c07b51fd7dd604db60efe1fa209c2263a1209568c3f37f44f3fc4ef62b4a21645b17dc9c37603cfebc1374f82a216cb0c042a30e50d40c2546751266e17f13ff87ba172da022efcb683be88c721212dccdfd6fd306db549bf6b121a0d746a9aab1c7394f5a1777d93d74326b9e96c1f2a4b0f6b6da6ffe67ffde46d8a8b1fb744013b42493f8d4f78971f6f26a303e2e4debb0f8abf326b09834d261812fc0a52fff24108a6f6b9bc39de9e35e21c4cbb28e3fad1996d2a091b4862685b28fefd42dc2814af1b460358a688cb7948869c3334dab017e25e4417b437557b10226af607fadd2ef07403b05f433a49a3edc30fc40ea8fbada27e5284b3a47623893c8a1e932c7816d21ae67306daa12d08ed449e22f0ecece"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (707, '{"ob": ["15151515f6eedb2a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859b53e9b02628d3ca675a3ce21a5dd4244fc95bb0911c8c7e484eea040b99f600e8f2786e92bd43c7db5e35b113fe2a0a0a675fbb6c7ddda7cc0f50574b03caa19718beea50e248f78a0d6d07476f976b3eaca6bf39dedb2ccf0baf5729235aac06c993cd6e60db1e1052509c7c19e23c567c9f7cb2ec1fb8a8ad60a29bd3e106baa06af1319aea671259ae43f1b0b9ad4a755d0637768751e2d5ef04f77a7e1b400fa1efaed11c4505a7044f5c8ceaa7630314af445b5cd16174b5c00890e1f1c22d332515c96300e6abbceda75de86522da843beda5a50b0f5591b0be9786545f77bb5b26a3b655dd1a707761735a8d8a258abab88dd22e955ca94b1a0595d82ac125727926df4461aad9da18b4f972646a521000125f8deb43d13a8d415ca9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (708, '{"ob": ["15151515f6eedbe6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8501db47a42c37bcd8235d044bb2d041217315694cab2a18edb866ba99e33b4a413415239d051799029909b90a56f1701cc43cde112168852b4fac10ce7a22a5ea83aa3e991f47035235013b48848e5cde20b446508ca5260eb043d9d609bd372f4d975401f4d47380d41a42071f04675bd1d657c758d40d49cfb956eaff49dcdee4afc96000226d5b64160479a0ab21d417dd9ee885603c5d0f7d6a664468ea3f6b6e8970ecebaf8a35e1cc3eb5b1ada1abd4a0585ef34cc4580ffa2eb1ff78e7bfc04e464c87f0d12e0ec2c16e1d3cdde7aa620caeef2e3759fdb59784db120cba77d9fc9602c961b783a0c040b7c32297c91c86fdd070c376947f77d608e42cf0e88b73e27797e3b094bad1e92b839fd97ddf6daeeecb5f6196d07ad5786a76"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (709, '{"ob": ["15151515f6eedbd5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855ff54dbe582c543f4a55dac12dbe49da233492db44ed76890401c841edb23ee9d115f4c795ccf50a29f241745ac35307604cabf8f036cb6553c853e9cabc9791c975da7fcf498c0a7bd4e888102f03cfac3f796638dfd6133051c74110aeb3f2b8ed810d9ce067648a7b9335cfa26c34ef1dad82b666a1e4b5e94d8667c2cc196c38e41e2b50e4abf8edded85598ad2d147355878bac8c8c659204e07166c500c72d908548e1cc4dbe4d2c8cc0b1e9d10500eb66ac815d4b1837bc9c4c1abbc3dae45187f83043eb0a5c3d542e665368b39baca80cc41482ba4578ad83a58ed18f81884579781b68f1ed3b12f93e7cc3a3db8c656ecc4f6be3c047ae9024848db2992271eb1ca120d83a2106fd2e2f7ecf8face6c82e9bd7dbaf609e5736b2e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (710, '{"ob": ["15151515f6eedb54892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858428548fd3cf3d03e55905c38c8a3ec210d2dccb06f3a3a9119ad3ece531e01d26af95f05be39623120f04e6120c987a2aa5e3b27a963e8fad9c39bcfefb92df1f3f0bccbd4397ee2165aa68df359d2f348d47c5ece05f48a1d9693d3806142d555dcabddeb1d9ccf441b6afbc9e4e54564f0d180c4a988b5c4e560e5391b7071e94f3a3aab0e2b584e2bf4784fb84d89f4525d0790922f26b3f21335f02239cf7151b30b7764c6d396e18ce5e291aeb8b4ed75044a0a462708a1203c7dc7fdd1480a6d220e8fcefd1cc2157b43411429d4d5d475a1e4cefaa153531d6637dc1d50adf1dcb7027325c69c6e1eef5066d581b5566a0b591e746a3cdcc3d7bbd81388ab8bd20dd03d17c540885127a7bf70527bfffa6c780b4202d1c986a492e63"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (711, '{"ob": ["15151515f6eedb18892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ea1e8148931f776ac462110bb8309abdf9c421ec46530628e25095c0ee6a40a8101eb6b7368b654286a41df238f2c794048c57090e4f8cb633487d64c361f3dfba76d40a5f3c30f0799076e98b992c5fdf0f2cecc0873e528bfb1ee144854e7fae18d5241b4f745aa7dc8c02c9c2a805d0bb1a7356af6bc2f2e930f84490f756b254c0332f7dc07afdc8f2e1f25d06c788df533c15040002f993460368dbb00cd44649df5936f78293ac8c32ea4e06520cc401ed1e331d6586b96492130f53eb536c22641ab2a34c6fac933496b57b2e772377653da97ea0a645125677b96c730b9f40a77439ac72cf919c2f026d67bd16e0f372dbdf14f14e0c3693a8b210f1aa4e053400cb2aeb3fc08d7d25eb791fa065ddfe2a23831c04673f57c77b710f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (712, '{"ob": ["15151515f6eedb3f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c34c549b85de8961fed57925208839f08905c1be5eb207e40889a604f03acf1cba0b186d2adeef108503c2de2ececa9b882a80cb8951c3d34d4292f122d32b872f2567a687a913305936e105bfc76fdbd60fe3559afca1c38e61529e1f2fde701ea482fc283cc7bd2eb2e2fee5b212de60ec6079de597bd17edf6f6cf9d714d5514cc2c43c28402561f46344ba4f58b46538f81dd56c363696910beb220ef37e65d09ab267a9baab4abbd4272237863301b0833818e5f54d3ed4f8da40716f30cf2d302013d113e0ba41a81d47e338fa5eebce3c7a2322aa65370eba76295ed1df5f0248375fa7ee23a7f9934af33d6db51a707041dd7389f301cd8ced586ed5c283df19d17f102198475af1803ab729a71e53e1959aa4e0ae4c814d4e128cd5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (713, '{"ob": ["15151515f6eedb20892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854eb6cf7f253fad6ebbd28221889d4cc5c0365b34068667bcb4ffe570dcc9609832c007ab179c7b8399ef88bdcec735b69760cf05121922f9d26b50332a17076a412a34f7da73d2e58ffa1fd555771e898f8fb88fa393b1eccb38349cccefdd4c2fc2751b899026960092ca7fda76b447332365c74418962f8347468c0fcc5966cbaac2428c5d45a47b135092af4b303995b7942e907008c61a9118bc68e854e9041b3c445c6132d4f333cb6849089c186b0303e4ebf6ceb8d780217c85af5e79aac3f00b7041d1666e6e1ac264d4100d67d07ffc14034cbc388290f0c18b301e1f151f5eef62c29830b4d3c8a75978654238775e562734d1af4cfb85b39bba268a1660bb776323e9e8ea6c062159e2f77d41250f3dd7a6c7aedbb19df4d3adba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (714, '{"ob": ["15151515f6eedb5b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85142e8f78f762bfd444b5e1fa825f255eba6943cbdf1c3e1c3a0fa5afa65a1839f06f507495bc31855e1742b9bcefb013ab89e40ca1230555e0c337089c992c1478759c304b5bba17362fa8032997be2508efdb76011dfbc09bfc5941cfa5f254df9ab049fade5e615739791d85a36ae7fce284a0bf86e09f65e0906bd1da46ad1f7804f1b5b13e6722d308f03408ba86e5be192a45242b4edfbdaf9cb100c74fcbf73d5714694988a3942cbb7e9f98ba411b9c2660c5ce3da572e5509ec2eee21e07420fef3551660f7379e705e1249f30d57af029c34aacd8129d373b2027f356eb97e0dba5d9208f4e3896d71bcb4f720a68cc64e9eb2edd99be901454b8c5495079eb9eb83df3a325a77bbd72f21484be5d3e02d9daaeabeb47cb9b0db0d9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (715, '{"ob": ["15151515f6eedbf7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85290e1aca06a4e0caf3999de4bc18a4cb78351b5f9d8f94165574950c885810313028783c470fb0021d3ce8b2780b7fecc4c4fa23953372340cad0f14636ffbfe07cebc48af7b0c5bc4ea0d0318ff453516512ad27c3c27306ef57e4492597000a9401ec591882282d2af28973f866e56315cf43f0519c77041361b79839c08a9da26e2c95f61d58cd2301736817fcc41713fa9524d9e67ff0e15c0b189a699f139a2456b30615c7c1368bd61ded79ab99a87a99bcaea937fc124e699353aafc2dd1c105ccaae37aef94f2e80150cef9f045daf549f0883ef5b4b25fbf43cd5c615535b7e335ed201d2de64edb2518a627fa1633fc06b9e3e51d5e0234ed890e595c380f8aba6a2ef22e0dd948b38f39c9b58fb23bfd9cb8f16f3fd0b6bc16743"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (716, '{"ob": ["15151515f6eedb3b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8510929f91e6cb1b584cd86f42d578ac28bd63ae20393ddfd40f4a4968eda868f8baf22ba0df9b4d6e93efcede3fe7f6be4d911b6651b725c565184d2f5d68edb47c40dfd361744c9f3460e45bd280dafcad8004a03b86728c7f65765ce7e7f9fe52ea53172c1ac27e1fbeb648b84b4d944cf4227f50858648cba9dde73b7643e71418d3327f83f6dc9899c75131b8871fe0c17952a99df10381488250f51cc138b571e9aad20395c8ae72fe9978913ea79aa3b48f98ef1b680068cc58a5f3c9120981b5b3e565bc32b996ac12aad327d17318e6d60f560d143226d265b4309326d32a7f2478e5fa84b3ef93fc2b3eec3ffef2906efeb98a4f0d2729a6d905eeb4895fb95e7eaa1904a64fbf3e4f4838f9533d3c80c55857249899c535f3a33968"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (717, '{"ob": ["15151515f6eedbd8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857ad58c9c7fe4f9198d004c81cf4707400b1813a8b923044a25a56f0b9e056d1119c5aa855fcb40f2a5b9050f781db9d4a40be8f4b6b7c525d1c3e014e3cedf37b31d6023c062232fb2738696f95398bf7f7c6e0ada064d64110380b7ace4d840f5828ffd284b6cd7de82a942b673fbb4b49643d8043be04a25d1f802ec6f68e23dbf88938f27c0617e14591589aefd8d0eb0cefb6770fc4ec5ef280ad91e9ce08470519b8014631cfb9336ebbefb6a3e04c24e2a396c99f8e6f9a19593a1ddb89003655c532718a112f1449900b1da207dca69316e7322522577b2d28909b4a72f4bd77f7c71a3261ad0016a7df1b212ce28dad20efeec53e939a16903d34fd2c9b83b176519fe468d8fb90707e0f1d8568fb0c04f77ecfa6b1338df905e3303"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (718, '{"ob": ["15151515f6eedb08892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85682c89e48db3e52eb8025978f266ae344ef828ede22faace465136d45edd2257d5f82aa24ad6488599c2d5f86a37459e8d35a67f18f736c37ce87697fbd6a91cfdea63cd1fa14d604fd4630496905d2e43f85c27a254e963a494bea338c8a87c4ad65f8be58f2e2a0dfbf784f1eeaa75778e774287f84c4f2cc6860a6ac6279609480a31529cf40d5281c67dc68a312add39ee77d8c67734d4512e53cd850dbfa0ae14e37b45c197ec08526872ff6ec59a31a34f5873fdc423ac009d59c60769d685c5047cb4da003158f3de7f7f314a98b72044658f47f1b64b07fc6510cd4a8c0daa05529ba48acb9477686aac6b9da971abeefb66826a64694ff89f2bed8c65b80b0efbbd1f5abc3db0c964828c93625abff60bbe37b1a8562ba845c2d4b7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (719, '{"ob": ["15151515f6eedb2d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c2b5a9995f775aee2104a363f0a228fab5f2d66544dc6ab5411109914d1caf69ba75903933de618013780759fdc5373d80e07602c7f3773c629585a62d67d6ada625018fc35b358aeabbd9ba49b7b6d4f9919ff0e2ccb5b977f828aafd5f8715a522c138271d77acb12058bcfb6b0c87d432ed7a8fafb12ceb6957760f4a35ab4321c3553ac143bd81172ca8e15dc55ba7fe31dcab7ec83ff48a8da37f16466414b88ebb50e15e230cdacba4835a970c99493c720533ab3f0138fb7b87f52a8c1884aa62b158d43ff98228c23c6e4ee5677416c33e9a2766dcfeb7eeaa089e29cca6842fe32ed0333c524ffa232afb1224efe7cc6acf2b9db95c8fdd822808402431f9d54da77d0997a84b03f2b7d668bb1bc760c6c42d24a055618db39c774e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (720, '{"ob": ["15151515f6eedb9e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85129b3e6716f27d62286e459a9d0061d829dc998956e0cf72247edac20f887e285e74e4481e9d09c58f5ead702868e65bba190ae8f53e62c212a240178d6829e5b3bda73073d6444dfeb93553a9eb4db370ce56b3d0428de6bb0866d4ccbed46e3d31511f97823b92791558756eb26465984fca9d7b831e4d56bac71f5b721c5bb0eef874e92d3371da4b8067a45070b726678fbc7c7ebe3e78a65052c3a432ca9506255044f37b5f8de3d82e8c7a8962e4b98132fd4c0bc45d411e8433994cf95ae58218c111584ed78bdb47df805539cb1569300b027bcb3d853a4181b6bc4033a2395f88a6429ff372986eb3ec6da4f286532f4014081829e262f7efbd2be7c8065274055840d466e76305558fabd99c70ffc7dacd096e540c0207e193bd16"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (721, '{"ob": ["15151515f6eedb62892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8526b262f63862aca5845c3ad2be2a3cfc8a3df0ffe169d49f916d1866abbb9bc64c4037335c6d9e1dc2139716e1154ae8cd8d01e1dc11944f70e7c81557cf59ddd586020e10973d04d10c14c657561ec15515bd8ae40370678443fd512113305799a152ff900b9f04cc835b33ff1042026ef0a0a33e81f343df4c8576977983eca868bafa4c89f1a725740b0c089ffda925be0c8cdec06bb47136e3d7303db59db1c82094eb33074d4722ff4a2f872edd4f7aeda1b0bf54484f53588b15ee6c78cb649b7afb259a121cfeb4a6150690e2c25c33e8b3e850772a31b7c5c3b00b6f27d40e8c706a6a89364e814274a60c7aeb78a67324fc40c135e7e110807ab54c529f4ec9d582f410997005000aca5b7fc03f63f4aa8aed676adf715ba032fd2e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (722, '{"ob": ["15151515f6eedb73892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dfb0128be5790ef49c4ddb8903a1133b4a52c75829f38cdd263e877675029c1e6d06a8429f59b77f4ed7b22c04c1d1ee84f6959bf947d7196a91b006943f35419ce7d63707eb1ba60104e5ede1d5a6503147351d51a51e6d6fc725fa1711ac4cdca319ec7cca9e149ad42a50c84a520d4f987553b59b426d4930fe03ed198c99c1e888a33ec7863b2ac256bd8effeaa323d3513bd03af6a3d226aa987aba0d85e951aebb5261eaa869b3ff119a74bf956db141ee8c301c0b5dba6213fb07030c51df70709dbc9e023181f1ae6fcc307b11261615cd743a7bbc3943b7911bb27237666f690fd02a1b613c57e0b40f6b597c79c3397958792d83266ead82e4c642090f50878bb9461e2850c4c8ba5272eda0a17afbfba3b866bf4842f5c3eab752"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (723, '{"ob": ["15151515f6eedb0e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a737ead56e92fa2f22c1303994d5ae8b24b71ca1fe75ce5576db5ba7d40525eb9862090f594aada8bd1113b91674aab6568d556c38c2c3fed9ff0c22e7990d679c771d34523a465e7f73a3abee14c774623cb149fd82aa4a12f80f51a2805c73a19b043a930d070b007ccfec616c8cccaf238cf15088c9db99c2f9367ad4439965260bd4968433f3890c0e86ca280169b932ccbd34ee55021a3908f061095a25d9fa6ccf2e4426273e864d2b3f606098cd69643811f8c78afeba5e060a7628b375561da9bcbe51001e80c980d4d65fdf8cf102ab9ae77e2397f59673f492d2dd0e68fe60b648601d3379cfc25dc9d631224c8b3b16dd2743f7ca3a2c2c36c5cb9750780fd715ec480af76afad7782cd701835492c46c61bb8bc5abe8ce1a5787"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (724, '{"ob": ["15151515f6eedb98892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85170bf8ba1d2f769f09d774ddce1b6e762e11be134697c1364c515c767c151108ce8ef069ee0f2e186e07c2e28b63a241dcee3e7ae3d2f94d0e1932bea7f8cc502a0a096ea33e674ff8e2229f0147b3533a89a6a1ff64d46cc0a90f357c3b5391b6441be0f8238b210a98384e10690e8f6de09775644d3366f7b41c1a61d8ac482dc81fc18a2e9d7a2b8596b8ed1f165881097e5f2732e04ac4359ae032843274401ebc54e78989cc1c6d4ac15686d6be19aeb30b20a89925078b9c9191c6d656d69537d806eb38cd420d013e6e6152b4b57e45bea1968da889edd48ca2247e92e9aab183246cb72005d1fa8b3330ac19336b48db000522890b9e39db9577880bf2102f9c610026100243053073995e868ee6dee2e5bbba7bbd8ec3066d5865b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (725, '{"ob": ["15151515f6eedb04892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8528b48aa04335f28312953904ab526c43a8ceea40e1d86179c32b03db602b3da8c62b397cc3541520143094d72c5eca93d3d4bcd337883f1192fb72964927cb1eb4791371b59b3f800a2cb729c34e7c8fe2bcbefacfb9cf8e41aa1183940a5864d076305fc4716230c43a99ae82d1a2daaaa192f40ac7de92ee15b2194f4f76d43268cbab0711643fd687741fe034a7bc934cf31f93e73ac5a57cdbd251625f1cfe1c2fdc325f3c8f9ff93014db942388bf4ee882cbc73061240487ecb25bab007f7ca463edb281ead8847991d8d409bd071cee98b374c6ea90109c14eaaf961afb9e5f8838c1561be28c989d59b5bd725403a26a1d2e5c8bafcd85a41486457ae7ec33af9f23aae2384ffcc341a58d13f25b112b7a107b24bb4cc7698aff2912"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (726, '{"ob": ["15151515f6eedba3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85af2ed5868be63e59572177382617e94f44559a523ab83d7d62da4ab8d0f8983e28283f43c525369874740823e80ab2335f110ce3c54b7ee9a0f59dd14f9af3376d7a73e0c54f5c72b321abc804ee4790d266885a2f8c3135466046350406247a1da9c754b0adf27dddb604f657258980c3ab57de13a720b1af2384d3320d2f84d2de789062f16d1669f02ea4768d9734756bde281bcc492df94ca8b19a23f63e552f342cd783a92d21b138494ff548cd0d9d8295e04ab00c1f8ad5e14049de7209ec08c279a5e8e351d8be178722fb53030dc4fcf8f6e3544c398cfbb347968e280e576c9335f753e770b33f1b1f97b2e03e6996251fb0ae1d45dff195632b07d1b673a7ed74bc409d15f613e94bd911c5fa21a9f6b6e66f8395819f234146db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (727, '{"ob": ["15151515f6eedb34892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855fbabeecf91f3c4e152f6564f083e86842bbf90678b5695266dbed13f5375f084b79cab512e726e1a446c8a429b88a4102e1919b24f3a0466c90136ccd152cb915b1f0186f97c45c0478f6cbb396ae1bb9a694c16ce1892652be2c72641060a3b3f8b131310846a92f1f0829fb81d6d7cabb8b5ef0cf16bb5d8da17d0fcd11c47d97e9049d4a551efaccda968c5603d73b49b4c256110c4e42946681c2ff8b91fbf2eb30759fdbc095b3791f2cb4d9b40065b869b298418f366e03a45ca56dc30fc86a82c7cdafc0e7b5caae78ed51b67e73a31ccf66dbe8d82f72ceb74c8f57838b1cf1128860a2221396520deffe4db279476d84a7dc0eb1317f9fc15085d2ad0f8beabb4b0e2982496e40458f7c67d7a136a9a2140615a44f1e8373369cfa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (728, '{"ob": ["15151515f6eedb35892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a2bb506c23ad557fb1cc08dc8dd974f4d117605c6150bcbb5abebdb61858a7873706f41eb7093fcaf7bdbc7cf00823200baa69a8eb589b44bb66c9c851f31c64486792080a93d9fb94ee2ebd34ed8ad5660d552d2e038d4ad7dcb1901086376c225a3e8c4526ce3e3852515e4b9138f54767b9863c1290e06e6b1bee3fd7ccaff58a85e153bf77e5a35dba9ab5cdb681db2dd49e1ff8291a80d8037b63277013ac95b11597f614911538ed84cc3548c0e295f92e8470c6332a6d708f9b30fea266a6510b1223cf00e910bb988fa49a4ffda7456d28d178ef33ea0000a4be9b973b718db7834c491efe3e9c23609425661b0da5111fc1deb6a867e95e8907b0265b6f041a7a0ae80218de8e333913e7ef019a04114cf03e1d22114da59f24c57e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (729, '{"ob": ["15151515f6eedb8d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85fd18ee98e6ca511056dc7e53bb44bf3175725666eb3ac35b412808fa114045c3bbcbe413b4f0cf4e8a6dc136fc92c895a0502140430bd614b42d206b1b50bf04b8c78a0f4e9cd28dfbeb9e1de40827a2301825f810f5fb1e92f9daf4c4ca3494e96797166dbd26348d2a7630b2a0bdc14ea6aaab38c9ad6d626ce0e3457f451cba1987bdab00cb98f0a2ee2f01de39f279c0f92b73678d58946dbd112dbe5b5d3ec7e26c711656a7661915c0cb15d8ed263ad4b3e829d892b4d173848eb1795eb97ce1ace2c58bfc0e2a24c9634ea4eadd07cc246c8bbdefcc661389c00eeed1c531b44b05fd96f2e62696d15ad103d440fb091e340f415bdbc737d0ca6cbf189c68f8a378e4216779c5fbeb81c1a97d461a856bb8f7b451cb0215372a642034"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (730, '{"ob": ["15151515f6eedbab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8575a1d57950a971e12e43874ae6ad574502bab93f93aeceda35a7d26e59f9036367560d20e862415026b910dc9f9be3603b31905958079aaeab62c6aefc09fa5e9536ad723fd3911733eb9ff062e1c41408204761ebdeac0b2e54ca205844f4c25cdf8344722f98c19ff4116e0600f752bf46f627f73e8010b5328a4651c5c097c8c03cc1b8b6a0a00c85b3771c69b139e73a4f77b4481b271201ff64186069a8915a60cad19347229c7f93a13424bee8f1f7b4e8361ffae7680d165810e17f38359eca644b5d5790bec013460fcf16d1ec32c1a42ca27ea91148f4da5c71f0798a810ae712a7d391360d1523374bf3fbf641c14e47d9cfebbfea7ca5f6b1c5be254f4a5fc67606982b3857cf3e4dbd43e6cf85ef8ac05975a062e3b1540837fa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (731, '{"ob": ["15151515f6eedb80892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c841b3a6120d76f6954829972344a8397f9dc8ed07df2b0a2c33a9c3b96c418f585aa944da9017e95b2680f5008e88c654f570e51d98a3cda448fb6fb771f91a790e8f9126f2c62b61ab8ea4b76a20d0a9648133f05f57931811bbe68b2f67d297cad3c01c5bc46078a0d6c0bde8359c3753ec57a18c8c0c28ebe20a310e4f11df8e1a7ac4c13a2748e1097b0c7f08d75427f7cd8f0178e0c196004726b373daa4a2196b0c66472ceb0b546131fe72d7ab407957da733825f0ed5569388037b4dbfa052dd8035c66869ae9de11f549a956fd5710e59315ba5a83816bfc00f35d5e80afc243357415d6997a02e68b25dbc2fa21c51c9019b618d0123a6100589e4f17ff98a57ab03b8743087ff85175c150bf190c2fa7acbb5f3fd30b5494598f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (732, '{"ob": ["15151515f6eedb93892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851661eb4e97b69c61f0c547f0d762c5444810ca3f0465554a2629c9fa6e63ae1021bd1e3676c76cba0732f8d31449470362a6d65a23bba011ceeb5528f109ccc0451aed08aa375f11e2343dccf9b6ef58b76419368f6c7e0316ee367c07946a54b475042d5fd1efe2ef3a65ede907bec35bf290d926bbb17240594b5716532da5fa74395abdeb76638c3d0d5a5a671a72c4ef50a9375b612727a603f52b6c8622736d6d330fddd99fa0fc15d59a57bfe58997f307ee2d194fba5f9c62c74b4e7113268f393b7904dabe8fcfbc22cdf9db1f85d777909ceca556c127d08f90ef9db955d879a3813e8bf8be321203894886a321f859a4cd89c75facc58299e0e01283fdaacf177f406eedb9c442a5a411d812063357bd9f5980bc7f7a8fb38cb384"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (733, '{"ob": ["15151515f6eedbd9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8594d7c393a108aa218010c8b66e7170ccf36e635db53061c06373927332e094c7bdf59bd44a79d88d7cbfb52e091072e84261e527c7d29a9508e4efddb9bc5b0eaea22b1ec913b3dd44b271d44689d101fca72a1c3ce2c52187254e4b937c96b18d04170ec7de907edb8b8f62188ba17cb7b579372473740203307a376ed7db05344134599583890d3d9668403f55cf2b21aa7280b2e76d7a4b0ad1325ee42457fe01f848ec952da5060a8860e01589990ad8f6385ca4aee9b33cc94a6a2f7d527bd3efa1403a4b407c9856224dce6ab64c4b445ba3741bc35d267cd629755ae78afd71a2264594d638884245949c85fe2ee810b8bd9e9384a8b7ed5f68a3841ce3cf19efdf0e16be1c1c7eaf81bc698335d80f58a8dc80216933bc3b8b76456f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (734, '{"ob": ["15151515f6eedbd0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85029622786ce7687fa8a4ca842a082a608deeec8a25097fcb6925fdcee57638986c26b98625b50b0692acba119447b3825d977baf5af5e0dde32edcb77dc3c421b0dc211f1115e6f8179d13779c09380dd1f279449745f5bbdc72468aca0076d815df0a6809e2cf3a51d169d83b14bf703ed4f1a1d7a3f52c8920e6621c4e4d8f6d097f9963d36ad826e775fe0bc0ef983cf0c220f8d7c93aecc934c7774e04d71d2dd9e14ef25b43fc7aada706bbcf5b6aed0ee2e0c3e65124d3f803c664e1101c307f8e96c6e75293fa7af2f26d43589a1dda926f8d77591189e7633c7a74d5ad0b02b4649875f71e07e65e398613ff9401cf13830464f6a7ab6ded6de605d3d7b1cff2fb7068515484b6c351eb5845b71f8802ff2e464e3cd6c2bce19a76b8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (735, '{"ob": ["15151515f6eedbd2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d3f68248482127f63950b35044801c6e7ea043ebf14fd02551b645b8bef1c7662185c26fb73b267211cf0bf19c023b7a786b8ead22fed94f09c5abb26fb47270a8f650d5a8ccdfa192916ebff7937bcc7c24f22628e2de634d6fd39583b0fff9ec331ef27e5c258325913d9a8cba32a3bb66ba064339f6d95cb4fdd31b2bc501294bdd14e6d2c2b13707b09845d050d6131d7230050e3556abb280d8a28b586d6dc0bb748f41bf1516de13364f95a25bc13d932232ca8bf672fd0772687745954b98612821d3f51269bce198b8574c59e816ae974af0e793ef92049daa1bbd256c39f6fab463fd6367c8832d128be4eb49241dcb4305cea779b1a973dc77bf00cbde96dcd92245af102049f3742c0aee6479dcfdd37a7f00a30d3b59b67e6c7f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (736, '{"ob": ["15151515f6eedb1b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851bf84da5b6a1179e433b4cc92129e0c8dddc2414b3a029157184f3ae104992a925c9ba023104776b13faf58228f1635541e183e2e4af8d9149cb5d83a5d8c06c356bda5d0889f3a54da2ee1ade8cec4f1aa7b4ec124aa5c21d784e6fcb23767908688f28d06beb297cdb4fe58c24bca95c885c93375fb4a4717d5a2a8a8f87d481150a3cae126afc471143dba8981523dcf807b33e3fae7c30cfae62dabe34f5feaaf1601f6f01eda629d4944adb172c9a8c651690889cf8b0a47c5527474daf71ad785c2433f9dc2790be3cc4a1a848312e7635c265d429a92dcda133ac9bfd2cfc98cae580f8bbc6bba0c475b86e7edd01337f4d907670fcfbf2486482f2d7da66972a92fb803e48281019e4b97f2e70915bbcdb0b5566702efbc7b53fc1e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (737, '{"ob": ["15151515f6eedb71892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dd4ada168d4eca7e7dbd2fd48df94a8d5051989dcb76ef288dbd347f97f02731e661a0ec72001a9827dd831733172743dd0a7ed1ecd46064c49bb05c184bbea736da82ce863eb58467612c4a9b657156c8c97229251441cca1ee4c2919c1705b7a3d72385c304c43aefee2dbf21bbcc7712b6f2bf652d7da44b213662a920bfeb6f60f442127d46d7c1c724fab55911f843fc3f5bee7c904a23bf0ec955c54669ffb6e842f8b77f79a9fe7378f40a2f95d21f1c1a86e7ac76813dfd3efbd61c989f4bb30d5ec497a3e21fa1ae2f8f757b7bcf700b9e18897c805cd1804753607a0c4e7478823bfdb0611d6deb774647bc62c0898dcc08184686f742ab715ec60ac2f0630bec45864fe1af6110f370376c8ac4af79dd68b0d46513a15ac222a19"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (738, '{"ob": ["15151515f6eedbb0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8508acf3a37de7dac07a3e37233fa3c9536379f20b845869cd9facee9447ff6813c70a02cd26328e5aea22ffaad546d340f81a36f00b4c1dc71b2238cb8e13d954ad26a2ec34a7bbfe3504cd6ab353b1283e55e934467fac029dfeaa7c0febdfbf67a6b03e719cc35f2af3cfac14afbd3f59b35f8b30d1a34a86f1fd03dc435e0ae7e0f4ec13ce665c1b35f6b4dfb610fe1c11d7aeb30399d3b328e9f4dabc667f7af9cdf7bb76b76b49944c906b24bab928635f2a02edf24d233cd21c7f96b3da58595541e9d10cb60df8275cb8f8a33e8bfb1fad911bca9ea244c421546b2c6d991f5c975b63a5254df0702b1ce6373ec0d57b967cecb61f7ff4291dec8ee778b1d3a56545a49d80c37f6930c997e1dea49ac77537952d0ad953fb2dd2ca136d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (739, '{"ob": ["15151515f6eedb60892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857e8bd2d366826e981970e2b11f163eeac772966722850e9776a32f8e29718982897786079df2542037f074bce0890a4aa61b72c53aa3ca0368529428f7dbd374a25b4f63190639fb8105793c7013cf546210a6bae64166d1c5f8c691f4b40507cfbdb0d7f446857f2107399489f437f9977660e32a27d10e05a9f8128c56758c026a67aa525aaea43baf1319fa64c4dd0cdf59414674aa0d71ae0d1cae1e6512696f3f38475581a0f83b0d7f4e864f277103cc873bac1716fc09cf6dc00939fff7501f51130b4cdbb14ff3a29168f3e7994aadf714639cb9cd90508e790127729fad7c15ee8816638402dcffab49ce13bb40730d5d2b55ea18469a0fe5e1498da7a730e19db02583b9df728768b16c3e1d7d5fada28366ac691ed0fd74cd7974"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (740, '{"ob": ["15151515f6eedb19892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a84971129aa2809ca8f3169bbbb15403889ba8899e91afdb1a14ac284cd51f80b6ea2519f0f7bf3f7c2f83ee90d897c450144b5ab946e2030e313bf1f2073afd033fd23b8f62be3d89034c713970efcdfc01e5e649de80f6371a3ecbf310e2e91abd4889d08ab88a5a7e358cad312682ece27e4b18eeeae03a2d99fc22bdb9cc1b229b423736702b3dc361d5c21a0014f777e5ac11dd6703c550e05061a3138ac7c453b8e89d2a8eeb2f6862e844dd000c36047dfe9a2bfde9f3dedd6c5b5e6bece87936623e25cb76da31d873e33cbf16bb21892c8dcb9f755f2dba1d37793b9e9516154480939dc0b3d985b3c1f2c24c295f13e47c7310fe839a8bea52fa99bd63b557ca6c6abf5f0e44ac76f1b5e70f89e892a3d81d17da1d822ba4445475"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (741, '{"ob": ["15151515f6eedb88892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8527443cf5ce6f9a5d9a89a6a4b94dde030a1651d30caae39b107db125e9f4bf50cd4c732ed161e732be052f196bbfded11a12b58257c6c8a43058f9d4965c161fb79fec78a786d3a29e9001a74a9cacaa7091e02df0e2195e5927e900b57b9a49a9f424be0ec88cc43aa9f6e14b47b7258dc281112cd21dc08cc64df34413b15d8f1a66902f7759e8e9bc9e9e754960ca15d2c4b061ed4af6609ff783d43b157cb5bad3ff61c33189552a364d061c9fb5d071ccf2c9fcdd0c6f84e2544aeee3f5f11c646c0acab80f2b4c28e6f945a70c104195efc0131a7d564222bad24bb3d91e165ccea6bf8eb254be78650d2bbd8c37be3f61175d82d3935d2608c03a0c6285ede856f3a67a67589da6d0745b41edbbaa6752dca18309be7bf7ad268f28ad"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (742, '{"ob": ["15151515f6eedb30892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85eb1c62b0c5044a1e95263c9b9ec8973d46bc898a8a86f17c8bfde48482aecfadf7794eb9db1407e76fdbb366fc22528ec371cabb344b3fddf1967fe4ae41d51fa027b4d240b939325d51db4f81e0a18bdbeeacd4b979d9baf365c1c9af80a234a855ada27b776daee1f0dcafcb00be54d5c91b2fba8bf24ab81b1f7e4b33b894bbc6168bec28fbd7b31f0c9ea476c06ad2d4d3a8f004cfa595a8b500b8ee3c6271f86346675c601aa067243326429dd2b3a883cdb1aed43fa123ea3e5910b326eee47cb8033010231b84a9beac38012841c8fb7e063b128b4d2a24b575c974437cf7d054f85c331934da61f742c2a0b0409977af159ac9c75423386bbb27041bbd5774f37947a50c9421fead5896baf29ec4b47c94a1fd453fb8d66ae3d8d581"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (743, '{"ob": ["15151515f6eedb22892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca86eb79819e459b3df2ffc2e89cabb7504dbd8119ee4560a47745f8c192cb23001a1acee81779ff855de64b9541aea22572371e46f76c6ed0700c180ab388b56f208414ed9e9a03a903d4884fb30aafc2dd625caf4f111bcbd1cb91d8edcd722d342276695425d200140f53112f1d2b893eba6d6fa09729d67162938d097b0ef2b084fc5c8544c0f993b13a9311271a6369cee1f13f4849794c84568575f75098bfcbd6c06d6db105a3639e167c45800dc4c2024c40e014ba87096d83dd212b9daec381d70b82ba352b3a64d920cd02ceb8fafa63f78d0d03e3e5acdda089c16f924d824d970f0c470089437ab5704e9dea7cded07c9ed98d0cc470c657e7b068abf0defa9bb66a22c86c8a24b6e732a07068234d92252208d4ba2a3657e144"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (744, '{"ob": ["15151515f6eedbf2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85378e88c0aac1070cc51419b4345581b503d7744025272dd9dcd85a8b22bef7705e1ac20a0ec7260f18ad69c0d3dd726a173709af0afea9ccb89c88981a5d7558ebd5115fcb25f692d1efb30b1ac68fb9c35d27c21e4bbe902ef7a002bda2eede85703ccb0310ccb9f26f9857d380874b4e9a40c138f6296f7a70067e8b33787b8e80cd46684467e17dddc313f13b4a44658462175784b78bb65dfa14803fdde2ca4f009e1b2d59b1fc01b0d486852d029831cd0ddc999af79248107bff635006923549fa5a43151741bae914f2fe97136a0fa8a89c4bbd42d45c05260568eaa89a03b89f0482055b869574cd10a754b4af7a6d77b02f04354cfa5f7048a0870abc5f9e4192c983504d2608b6243a250d1ac87871e3f95fd3b3018f598804c83f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (745, '{"ob": ["15151515f6eedb24892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ee578c846e872a1d7f020bc602d1ee2d6455b1d6249d050c9ab63dc69846a422445d55b22026121dfdedf7e4a69c737153918f939b587a3b84a959a95c0ea24219b6c18934a31186245dc3ed41d837dbd50b9ec9589317c67d75a1fa3d7d3032ad522934a488514f89036ca9584604be619adc26128f7a7c19eaefacd115548b4991b9a1b9f8ed9b1a7515431f5f00c236e2b181f8b9d9dfddae807edec8c4e3c3b387b87558fe86435778dfac0650949ccca16324efd547b9df2624a8da94ec329c297af6d8387af39db9bf0bc9e97fa14d8637a15856c1e4c4c047bb77b0345f3d2a2b29817429152e8b2994eac995f4614812ed7df536368e07dccf9eb63fff629d39a25de986a069bd29646aefd591afeb968d64ad5d2b148ba47e66efde"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (746, '{"ob": ["15151515f6eedb5d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e474ef091acab9136da58f5946bbb6f4f036c533d748e2ee2463ed8428c9826c0c899fe31aa88112ac434586e18c242d33aa611202e4f064cd8641eea2d4a09847d9b8ac487894c4f57ea52b22e9f6adf4eef6d8a2767c4654ce2b851b447b8cca9eda180ba9e5b66320369f54c49760c165189a725d9048d447fb00a28c06893bc1b5ef366dd435df7b76abb46dd2d69ae94a80b86ff213f52a15aafdd6bc6bca042d2477aa1eb5bb9c6817263219ee94c4f315593673aa8fd2b7fc07c9d7543d2fa727271e785cb70f2915b1091e53c53f685a99e6c7dbb45cfcb8557c2d3590f1a3be2d6cb874d4f3a6ed31f684b2f23ba95948b1fc5461a8f5804599ec288a37922382dc1bfba5eda198dad301429083420342717cb21c1889ca8d8f9efc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (747, '{"ob": ["15151515f6eedb61892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c0727be8645fd892beaa90a879ab3b8976d33afe9d8b893c6753d78eabbae91706bc91219f18cffcb9afc036c345e5705e3e4791fb1c1f3a0d413615c3c6421d62c960b7328815abb60f6c3523f132dfa279daf4039e82adc48168418ae6f6e6de57e9b4d22c967bc31c08c3499ff672c501d11ba06770f77cef42a4188d0d0aeabcb30ae887a761a3152c9a0ce1cd7681888fb149bc5b874c517ac4eec2f817b120f5bd2d46fa17f3b6ac2792a35c56845fb0af0a4280b6836cc0b43544b2d63e29faec027a034254c0f0eb11f68e978769e3127960fc583a6f5783fa90632e9817f13371174eabbb956d422f9b271a6cf5a84b84a911675bc4280f07a0c2e3fc779ced38181c5b134a833176cc4a09b789a2c1189e9f77c68080d7d4675799"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (748, '{"ob": ["15151515f6eedbff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855aa8abd85c9dac068c40fa2f13bf64b01009f55d000b50c1cc4bb9d9b88d2646119717daf2bd680c5467efc4a8f21dfc2e6f6810faabfc6e53cf0c5020a3a31f413a3cce2cef35643d2697195d11dee895e7a1bddefc81289d2eaea6a13086a8a550e9e78c7a5ded56ffb655a7d9b4930c7eec4f8fc851399a458d08246f830e0f54e43ad65f72fe88e19476bcc87e98510d1202526efd7aa5fe25d37c3badad5a3ff76d416487a8f782170166723d06aa65d29333be60d01ffe783a442d4a2f15e419f22e6cd4f14d8075b981d23533104c2be8befa2dee062403ded14449969293402247db97aee91b1e68eb1042eba6b5a620608ff2d7e246c730132d489aa46711243ba8e17aa18e544e86cd6c2b92aca68eabb3b71e2a222ce35c81ff38"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (749, '{"ob": ["15151515f6eedb8f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853dcbb25f29959e85fe30949aa4f127aafcc60065bc541d74ba36051f25fc5d451db71d08f3e9e9c6eb9f3eff0c63fa24d4e0466295478875d260301f274c9fdd6e630e189e3538ddb87e9433806b6c373e4b1d27f90c08b13ce3fde7626a76e986caac31d040015e5444e33742773765895bc8aac6aed27440bd66f65804e3afdb3033e9e7a5ac6d9fc83ac2c19becf6cc82b6a79baac0175e21ecec2bdfdfff7ca836e7b7934f0434602ce08080ab6630b8381ee9a894c32e9cd6b2da61cc33f721fa4d34f05234ac21f2473f03e4533c69ca0c2f0985dd5b2d1dd2321278f8da0207916872c57f4f3127021e475ccc73c770d8966ad320fbe092bd427cce79a7f6d20127a92e7098240c34b7be1d4ff9ff92487f72dae509b18629b0605367"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (750, '{"ob": ["15151515f6eedb85892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855c7382d9544f6920d5e080b4d1341ff2df37a6c9ffb7e73f1db48587731d445d931df7aa6342a0653661540cf52ba025872f511b9bede5fb0d70b2cf4d59bd9339bae9c41418c1f7e32519ae44efd6137dfcd3ee80a6b013e9620633e9368faddce0955382d2b8c2190b93de6e1bf2f7c933fa9f716a9a56b962ff87762af6f923e57c96ba53122ccd3f40919820af1803f00428591c44ec355020c9b2d8ae95df6c66dad1c8717663eb68fc96c95c0a33e2d5629ce1d11aa6636b074fd597f5c4fa581909dd312acaa9af54187ca2e4a23478be6721decef7646107bebcf59da86a4810d4cdb80bd083a236b036b712a036b13021ac1fd74d3fa005a4b1a75c7894f4ef2903ba07dcbd5d03af2e29c9c9688a50b7074b9214f2c674baa79ebb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (751, '{"ob": ["15151515f6eedbb8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850a019171a5b47f52e9178fe4998b56a15a8810940120018ce6d5abbe94af25b50b89debe44f521b68443f4fc87171e5f95e99aa6b8608a6bfeb74d9a54e3147eaefe1d2b2780021e1ae66810252f582f2de392a728779357bee5a16f46ec3d842e8d3bd150d71edcdd1a45b914226539e31261800594bb2741339b0fbc700be769219f4128b2fc7c3a003c5b4e18b8c8aa90075298309876149c128036eb471a6d63ff94f8bc21c1013c85aed34b115a77e855273f096a65487063c0bc2299bce21a3b41ea9dda09ca02e57aa84c8f9950a8c50e608aba36537841c3ccee5653727e17efdc17a165b3a83735c078dd3eb4cca7e625a975d36fcaf9f28d6cc539c550d270fa86c6b296dad0805421f24efec5dac0541b8431f7bc6f1966f468e1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (752, '{"ob": ["15151515f6eedb87892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e2c956579da8e73e2b074423308a8580b8b56328f868a2a32f70464e143f437f4cda9c4c312aad57d16fdf3c4fe90d746128b21cbb7d50bdceec9c20779322bb2e50a39f70d65147375c2840d44ff2d47f534a5365b35e4b1a5fce7f638337aac4f3ccf1f709a004e5c2c981ebc9737a623e8ec8b32abe8a12c83ef964158aaf52423eeb5032225614d6953f23c4776f2c467cd880bd4f1cb1e95ed494ee966b4f765f21369023e950b5671eb385b9b2cc015ac611f56302c7ce292bfe146f38200b58cd5349a214b2945b8b27196c0d308a2ceb6152612b1f74803e160b30c8c51c2552ba348b8758a984511b226dbb3f98e24549998a939b87bb63927e39fe2da6eafc622d9312baa0fc68e090a61649bc0ecf7c08a69b6c2a58c577c58b43"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (753, '{"ob": ["15151515f6eedb1e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857856a3206d284ff9bc27221ac300391803743431e35121cccc9cf6f36d4f2a72476db28ebd45b8c20e4d6b6ce20a738470c2d5e31e7b2af18ecad78a11911da87f64c15629b9390ccb7c98f2d123cb08edf5871734541209c2f61a6d1dd4e188c7520b635e2c7bd143e75aea07f1f11e9c72db183f9cadae7c41b64061c7c66136e8afe475c4511d360ec5bef2e43a6a761b569ea573f717e6217daa25e8f1cd6c1065ea6aff4eb702ab685e562f51f35957124713183de74205deaedc7497400d59ad0f511758afd0990ef88701ee33e8275a7ba27b11b7de4fd8ddda2fdccd25d56cbff84a06455ecc1760e921727da8b3823c94137e87d7ac8f8438ca5d509fecd1c88769e7974ee729634daddb74e4ab2c62b4f99ee5868b07c3756a6577"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (754, '{"ob": ["15151515f6eedbb2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8539eb566dde2412abc82fad7ec83590839a96cdaf93e65e2adfba6783661b4d5a5c1100a61b28d056ec88fbedc7e5e47e93b3b791d56428a247f2e2a8bfdab72ff024ae650e262b501b41065414eb347e3720a28788c0c805f9ed68cbbc5b4064da6eae3ec8d748cbf7773e7bfcc7aeca5e5006695c40db484c3b7c59f614f2dc5945004b7133d158bbe027c8391d320fe8df4dfcc8f28fac00ea758f72e548a2b358906317177eebf31ae3bd3d29820e62cf7c51ea97a27a4c5173c1f7cf68e3a28b1b205018073eecd09f567a99532b26093092ab06d760a3198fb98dda725d6aa5fca6848413e768a26dc7976d707e2c2e2bd0750f7f32dd5369b14ceb465fccc365546ab605417a6db3b4e7aa50dfdbe84369eb10e945122875bd385f68c7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (755, '{"ob": ["15151515f6eedb9f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853ce91af62fc701020c8ad692087b8eb91eeec6b1cc5d73f0deda01e901ad1ca3db078ac0e45b172ffba988171a38c9fd4e7d6a4d70ef16ffc2e803a374efbdbabc0f24ca1a6ccd6d973a2b88695c52948a86d2dfb4d4bfa9ee189abee6548b32355989467a4d8b0a302ddea1970fc23281fcb45d40d9ea39e8a9116053ffdc729fb23365db671c957f23405d2e02c661b33385100f12616c06b622e156dac0d85ed29d15826649ba297fc5daddf3c92b5452e99a40fca868dedcb77122502f4760f26c2773d28065d043b406a643625922970bf2e72bdf2b0ab5bb310a88720422a25dcbcf1437231cddf22c38bd0bb238320287132e51462822aac14e1c8239618c1508d6849dd20697a684ac94ea3b60b771d61a4267e439642a35b50e1c55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (756, '{"ob": ["15151515f6eedb6f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858f7f8fa07dea42963afbba2446b87c3a7b2e3cbcfdd21e2fbf62fa969ce332f6eb20762f713da462804f9b130d079522c691799afb7440f92aca504ce49f9adbbe4f3e89355fe885b4e7dc203d56b28995256cce5fedc26e671d460936f22b448b5ed9438584a14f95b4beb6cda139bb1978e6c66894227ddb828aa4e4928f54cde690350cd04a8a5c19c842914050ead42d3ea56b5fdf6127d232378ecd7a37fc16b1d32daa5efc5aa96fe47dda94b90d81a1837dbaaa9eba01c4344502d2b050a725d0d1ae8d7e13bd7ff6acc6cdae7ab6c80225abc5b8ac93eaea5006dfdb1957ab17e8bd77d9a39d9ee3727b6399759ebd45fea044ae8602622841aab972eebd2ff412ca6be3a68d7b9a713dbb7efce78a51037c70baa20541ce66ef23ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (757, '{"ob": ["15151515f6eedbdb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c1afe866727c7a8ff07597894d91d669b51cc2d2918e23d934ce71e4b15d1aac91efaab9c6354d17ba6a5a59d9629920358debb3c0d2ef5d9979397cd05e7ca09f37a4b4c200e8324375a459bd682979cfbf1b099340b269dc36d3ab8aa42f05747008fee99bbaa9c0bbf485153e3ba11315ff358f7881abd4c45b2215bb134b9e45fbaea53543b76613c5c00e5098414d17e423d61eb68a45d6de53a406ef9d5109eda9a4a788fc03372fd618d0dabcf93e4ae4ee336f1d4bdb95a011d8abdfd8fd96988678a109caf4f92f0d94b781ca1bf26919624d4eb75802253e251a6af3eb927cb4974dadb7afe800fed66ceb4cea2ce4fc66c36fe2d67ddfcd593a92d89954b8f61c6afea0a8942d57c34687b61ffff671f2668611477b2c7b6a79fa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (758, '{"ob": ["15151515f6eedbbf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e1c23c7c3167d00cbb07112a24e67ab01f0f9cce20e6ceac9dc01cb93b6cbc1c4c0869df92ddd7f991b82fd5368b304fe4ca73146e69c5903372e70bf12eb0ccc23f8cdc1ad55099b6a80287ee5ec8916bd9f38730a3b3b3504aa56eea209ee376ddf70c880b413f44e8db62867114b8c7e00728e402058a591be16229c3a9a7ccfd5a90b21fadfa4ff99510eec4cca224d81498eb01dee9b4db2898d76479be522910305e18ebac3e69762ac442357b4fd265d45e02ff6996d289492f1c52999654a5d163459d49490d771bcea6bca64a1e87c7d6977f98353c8fd0c104dc7a263a12ffbeaa2005cfbfb7e4f12156fef5d25102554afc4554351cf91c9fea5bc8549278aff35448428a0e3b51414d73ee1cc341eee357934514ed3bb935ad81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (759, '{"ob": ["15151515f6eedbf8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851bdb46281b6ae971d5d281f8914fc232ad408e063b1e61e41987a44f74221e95ecf0e7f8ff6c2969a84c6e9adb00ebb32b586f44a6db9489169916576d3bfe64feea7c0542b9efb898d399efe15a4e47a4b6a4578fc012f90f8efa5e07ab9a437419bd50bd0a04e648674f5f4f43e0d18dc290646e1a6b6fdfee0865e779a52f4e47799542e44e7bf1978fe1c4eeff347c0486040052edb2cf3d555b6b992f96cbc04d0169848f876190db2cac8170f2e1706287fd86ba372670e1a3e60ec43e34a7957ca90dff9ed1c968477ca09426a21b5d3200bfa451799c9d371b22322417c5d03c3b3f57411a29a57a9ddc7268cd207a8457433cee5497c9d3910d5b6f7ef70e9fbc9b020e74e9676f12dbe8785bb371ebf2d98b76295605e39328979f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (760, '{"ob": ["15151515f6eedbc7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850db9124de250409c6915392257f93fdff084ab3d3100a4078744f2ce4d75150e972154bbdea686ad45fa13d6558f516f7def026ebe4b3ea4374297ed5f1e1dce04ec7339500fba84596374fc3ff46b8bd6cab10e0a390acdd00b2c67820efc4dd79498d0c1eb46fdcdcb1183ae38e37af257cd011ec51bb9fea13f4d091ea62fbf7b7db4708bf64139c36a14099bdbc08447644007eb352bb459dd62cb27805876625761d8dbfc2f794c3d7193d08150f7f095238c39672f5e292f71f38f74580394e0caef0067aecc291b5ff60b8394d17b401151464f9228c3672f5b1e7f1b326d3a2fe1522a2a784b266346be2d925765f992ef1814b2b38f0f25366836b8cd0885fe629aa5b0aeec0908acab6d1c0da1d61c41e64f310cc088fbfdf6cf46"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (761, '{"ob": ["15151515f6eedbca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852e1e64124f20c104e6c5baa3a6c0d1205f1b2331e12e9ad761c468b341b4b67e6cd50613bc8902551c178042a0c935fe0993c32673d4fcdfa1732f8c33cc4e8c4e33ff7842b980a0b9a57dfd70eb6dc1390d724addd96d95e54760a71a57deec292e530af38632c21a5d7ba47b247116d4be1025f4e3ff8563f239f37da5a88ea4743c3464cf302596efa3e56507849188eaebe8d3e08a0751ed2acc914142ef166a4922d6a7b0a9cbec09ec628b9b85a2c957a7aae4cce5e68258b63f62391bbdc65b19702c6ef63d490b9280ddb156f3f3899148859120158d592e0dc90656d5ac27695845076b31b124900f48bfb61e5fed0d2be1945004152c2a886f71e203aee28add30a84ed524ca1cdd8e110707a9bec5710cd34a4a2538e594f41818"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (762, '{"ob": ["15151515f6eedba5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c28daa319b128de55a48757605381fe9649a96c53d125303e5ccaae0edb66a70b2505c49cc187975c04a75925f96d296f1a91fd62316c846aff0b77adae7ae20f2dba045cf42aa2afd360ae04895b5f2d672e08d24778b9ed34b2296a66861ec747309861c9dfea98186ef7c3a834100eb4720f77953c248ba7a3f26df3c93d8d2e2c6f5f7bd1d7d70be0252b0728e8c3b120594e4440fed345784517c3b16af2c3bbca4dd15bdddd529bbeda94f020533e51ef2c8cff7d9df2c1a04d6e879e7b5951e7d4e95c30a9fc408a0a589354d85edc7a24efc903d2799a03f06bbb969c65b6dfecd3ebff0887c21d7fc5f45faddcffbd7d24cc1ff5349d8a02888cc5f042c125511c910d1a6862d0efd3999fbeb7b892856d313ab5320124c7c148dca"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (763, '{"ob": ["15151515f6eedbe7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859f3216f5a869aa0c1f8b18fac499deacd71fc60b9bffec603d3f3e04942409bd3b15090f06fb41547bc44ef54ff98fae32caf041676478cff23dcff10d47a0afb9d18b2be03b2c25a6fce01532685f323088a06d9cd32b2183d4280d5789bffb553b6b920ae1e46c02f9dbd094d8907f6e6dacb59cdf744181bacc60cadb35cf1228d1abdec11bd125496c847fa68c35d531e5827ffcaf0f3b43d6ca8164a10eb94bcc2a2afce7ce39d07ca4446a40ecd97568f0d43ff47ab354b2a4d0d971c70ff60749e2448e21612bedccecaa21a85b72ecfa0b1bc607057d47960dd180b35d02083400e7335df28b7e15b8696f663021117ca1b9ce27903b94bc827578ccfef8ad3456f2b20c5303793b4b9c9caf9044afa0b2b672aa6eeeadd0659dc614"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (764, '{"ob": ["15151515f6eedb1d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d585b415481b38d5b65849c40861ba0f9260e815c52748222f417e45d61f7e39e5f240116b7e7f26073d7cc59a2bd23311d78def153eb43fb7393b8a2824ab4c72b76b8273a29eae1b62dae4855c54dbc811d6443458f6adcc71c81407f6f6d67a249fdb864e8794bc5b5d5b4443ed534662d2d0dc7283f2ac0946fda0ba0356c5aa912566db98b3391d6c8fefb8c9712e2ab24dd092b468d4fdd6b2ce4e412de0fe99cb23bc74ed7243bd4a1d2793add6824740207d53e209e9203906d98edb647175e2d94cdefa44d486a7905878e85c91817b50c714c32691519a07b64239167fadc357f600f5ed3bede92baadbca0691a8b6d9970330b9e18930b92cef8c1d849a32c7322daced537913f5a3c968afeb434caff926b50c425f43c0284d28"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (765, '{"ob": ["15151515f6eedb17892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ab5ca28ef06196d3d9a787a4ebdc1ff6a3680c033d8d101935ae149e857e69e3792d4af14177b1aedf90677b7b2630557f13312800295051e38d665bd5d5c0f74a6f8d555a6f8ccff0596b148204c2c9a3f8797bf19e8e9ac7327064547abd0c5cb88bb96382294c7105e58977691489337d31366fdef151349abe7a82fe3ad3dc1f566cb4541e4fd573e80c5a267129fb9a47ce76e83d91087d6b222317b26d40d38639673806b830ca746b6d3299d501c2ddf80955f3a1a80965dfd77344944a710824619fde89650f93d6967817c2ac295c23c03bcb96434b011cbe2d8729ae19b1df0aeade07599325b3c540823c10a8c7339f40f77511880879bae7a4267180554abd25dbba105c817c3d6dcaad2bb9d3db532a8cb33b51e4a80a09669c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (766, '{"ob": ["15151515f6eedb33892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8589ab5cc639e08c4cc8a9746ad80bb8e011d8dde752762f3c1a569bc63d58a1f37027874c7e255f96840b32d8ef6c60ab00800cf544de666a95c310a3f5cea62b9e69276c0e045049f275d7e1b155a3e27aefe14589162adec84b44b28627e20599d200f3e14ac9ddfdde3d310e4e0c2a079f729fe490ed4746364fc298248a88e3870d7f9b6dcc434142e42a8eecd5eba92a3168d44d28f89dffaaf28dee5033c5777accf6374a3e01b978e30e784dfc03cdda6a4f98b1e511377f54a7fe1dfd9b78036f7c74319b6439efb1781f5dc453b1ef4722475c959f372758bbd2867a5be87f365bb8a66d510aac4e6eb901d24ee25f7325f027e5d066d9ee25ec94a68ce2d2b487fc5c0fce30ce6ba62372a280c99c74da21a4417d3f2578f61de874"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (767, '{"ob": ["15151515f6eedbd7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85302c56a4b53ecdf02452b39dab5921d0a7bfa75431f5ea2757f60533b8fa71246f603b6fd967a47da441c8cef828b7853e4cfaefebd28edcb8a440dfb384379d8c486e2c6c7f7b046e0c1bd6792b023e2a43b1bfceab172c9131b26a773974f23ee39a42c7ed302a447375831c6046e0f9c2b7f918833436424e373416b0d93e2f9778c61d2ea0b65eb79849f68909daa79793d9904903926d8d73d570233387851052191b8e507923402af80ad7f8a5933d6a3bb1d027c5652d4935fcc082bdfb9947881a11d9c738feae0f07f88d842ef72d6b8ec7df5f2337567cbe43d91731016cc4c29fd4531742b6fbfc8e29c5b933e7e62098e1cb27d9fb5ba770ae025026000f780272ecf94a9cbdb71d63d55467003065214f6e93c3d8c2804b2535"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (768, '{"ob": ["15151515f6ee4482892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135847a728d5b88b829684f0356e3299677d2576d2c5e3d6c40d5882ca39d7e984f5c5500d2e2ed9006a1c9fcdc28e7554842efb05d2b70a6df067c54fbb833489a08554a1a54895fbd2a709cebf9f0a21fb028fd61df2daadfaac323941fa6fe4f080d2caa502fbbc0ece33159a958a3339a464971350db7a73703fd0ca418c835791f170357d0399de38f22f8df706ea5f43a2adbea5b948d11444e0d1b8e8037dea4f0227e3c6db809cbe2f48a6f32996e6d3bc13c1f4cdbf4805d414a8c595d7dbadd76315e2ed9463e575ccb3b52b120729e9cdf3d8e2f6ac008e2bf656666c5a3065b101de88be3e8dee47c5821152d6cd078f5174b8e65bd03a77053e60cdb78e08ad220904674f57d633124d984e30a6dffa7745d685e71612c6b0541520"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (769, '{"ob": ["15151515f6ee448e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135876b323c164ef4db0b8cbac77b391383792cc0cf0d35a3e49967887a0560020e8f1b0edb20b6518e579a79cd3ebfa734f888416d06a35e7a725730b5cd8c56973df5e41bd100f5b30e2199410cd283bc7d6679b79f64d68bd8c312f70a48ec1c89e791dab1d337274f322fb542cf2fcd1dea7cbb90a9b3e093607c0e8b492c2ac73e0c0c40bc069f6736993182d3ecd924e36145da4424813f00a4316d8a74684a4e490cc13b74fecc1dc9eb18561b54676d4264b68a16eb8d31b7d79a3896f1451b25017990de8efb713eff162ee6792f78363311093be8296622a68de03fc91aa599471dda1bfd7840770804f953f9344fb811468332e514ecd9a5bab7a01233360db2489ce179ec418382e700722d0f626eac5543248b4a249369270387f2d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (770, '{"ob": ["15151515f6ee4462892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589957a329ada278b57c965043fb211a97194b758036f141994feb94ca4567fa94c28082af74afd637b818c86484ef01b0fdb4e48369dea36c6e75de19a0cf04e88e44184b86ff670599d5bd77fd17f72b8707123f48d58aed7bdb1defbbda61e0ce2aef5c7bba851f8815d5c6c3eacc863bb7e0c54ec7cbbf7d94b11e72078d43ebcf4604d931e91465fe8dfea6a055e541c3140db74d761213a8458e6e507f21f59f4502344d7d952df5db7cea563411d6591898544f2eab7544a1b0607be0e117ec03b5a7028ccfa3cae73fa79496c9c9045c54fdeaaf60953c8da2f2f894099e0afde5962b316b187436a3d38f9fd831e0417af232113ebd6a75689574907aecb0d02f562a33bc27edfd7dd34ba724ff3f2af42a9ef65ccf04551cd4bfdb71"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (771, '{"ob": ["15151515f6ee44b1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b9d6ac02cab42990b5883d3c67bc3ef4a5ab59906cebe45af783768ec3018350472961c7eee7db65f0da2592ab4094fe1269eb16cc8141ec9c4405346226675c62e103feafd8e32ab0cc9ed8dd978206449b95db32ac30bd868f6ade69013e5d4ca8f4137366935f98372e79e3b8dde18e3aa05c0b9fb9da7df4c6fd6ed4297a9cef752ac5aefdd3e2e2032e5591db43734d73af10e425dc895544dc05312747e51e9fac10b9049c1548f3d6dbabf58e2b06e1d55ea2476c8389e9a6930ec2bc185fbcf6be70956309e4852091e3cfca7b5e9d7ec6f41f3e1031b1eeafe009caa5a1426baeeea22d5a9873718a6a1397e1c3fb28458e706f2f7f7ff1df353c4ed5686efeeeffd8c8bfe60b6c4b81787a145854a71cbcb311187dc27d678d23e9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (772, '{"ob": ["15151515f6ee4490892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583712599d47e10ce4dd6f64295b09c51a15ed4245f9418ffc0b132fed55a26121a82b9c2cf197f85b217d1ab78baa82d12e09233f96d9cd7f315056913dcfa311b3f6735a1fda1c4887ce7af567d46a4067274e1aa7f5c87d5965fb89825dff43c1b0f43c7f09049fcec37e74791845c48e1905f5a8d95b471e4a8426cb5951b2a84598930f880fcbfa7fb4ed4ad027efd3a7be49c8a69db8cea7226d6e53ba95d2adc3d5d3fd65d28f0255cf96c9ad0c8abce4d21cdad2dff286f4b6e127e6c226e81cbcf7e97dd9015eb66d5ce14782cd08db6b64789fdea5946a84b5d0daeb9516e749e0a6c876594179f93b028b66692653800fe7d372c6d606c00b65835eace7a6f5739e62de89e79e4682e9bb7eef8ee824a2e1678872c44296f1d06ea7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (773, '{"ob": ["15151515f6ee44c0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589e03964aa139365d346d3ca8925759198072cccae5e2a802cb59dbbce58eda4265b369421c560f4e2283ea9d6cdaff7ecc0fb8e35f2027037de999ea35670430690a34dc40556aded3d37a045e2a58414d5466c5474cf1773304e84d898f3c0c6672fe28004279264ebe460b24ec864772eff063ae703d998d137307a553c859533757081a7578be611581c2f656fc1c59f0021897b9bfb9deab91ee0d77154582c6ebaf82ac550faece1d4ac82a9e93a22df821107d6a7e185b353006642bef023e37e12c182dd5f575c1e1537cdfa6c19722654409cf0aefe0dbb40ac681fb7828a76147be19803f5548ed3baf87eaacf2dbcc1e3c236af604bdcff8e7e4c1278231a470259012376316a3c4b937580a2e4791d2e0942903133c0391b890d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (774, '{"ob": ["15151515f6ee44a7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358afc875231b8d751b07e0b7fab5624cb823fb538d021cadf283e06fe6272a0c25c0c57567f0dea06541b545bbdd86603ae0be4af4cfb13ce97f6e5b47527a394dd5ef9a3bced6c4ce606fa80681ac71172d111c2f2d53c6f821e360a0a1e9ad95d87afbb16e77d96e3665e8cd65f81b0e56d249eaba1fae2eeba35118fb76c729d0e06f004a8f957afb36bb74195fd393c7eea73435ef95218a4255211632fae14c3ccc2f187babe8ab3b7744395cc474aa6f4ac86066ffe75b95b281dafc7b4aac703550fa68afb018937f0dc0d384b0d832d551fd8a773de2f15b7eebd2e67f29166a1a7b69d64d1bf6533dd9337525734198ef3035180a6dbff4a2859162d20985bd93aaf9c912be5c90236c3142b08bf5e3bc874cedaa5bec3068fbf9c0d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (775, '{"ob": ["15151515f6ee447d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f2ac8f22ece25646a8b5c04e10447e19ac4b262ec1c67d847483708f46e3c8b3b3b2b9e516b8a4dfa7caa2f682e3e579f1b76a5ff3c209fb644c82f6efe7277bf2274246a303bd9626e8401c8b8c44bfbc26e30b571adee24ac57423ed6ae8b9559dc2e06bb1929db6447231fa076b5fa9e8099d14bd1b07ca8f9e2137ffecb06564d17f3c2063d8e7d7cf2f2cbb1e3cce89b90cb9dc337c0640db8336d862680fc77c0e764a63d42b6011eaa20b67c082fd6fd94e950959cf8b6da11b7f44b88ac5dd9a905ceaf32810f9cf249bd711a8331e03097cb52b14ebc15f5804dfb96d734a40d8f6723b8cd10d8b233658717fa7813328a4ae5357f7b46d313dba3e456e6aa07030d93fbba095a9b8d67c0f516fe873826e5dd3ba373077378a6b23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (776, '{"ob": ["15151515f6ee4487892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587ae3ee18134a0546aa9f00c8a4c316d751a30779cc195eb66fd31536b07e108bfbadf494fbfe9932f9833ce71c215d10b9f928e1a8fb279bc5374f108506e46f91d54bf67b90710ba05ff6ca0352e6a5ce63632c64bf56d7ef64f08d0b464be7d8453e2d454fe940538baee8a50f639213a88bbad4ed05574fd8c88aa0e3b3e61392e82c956eeb2f6284fa8d0582aca5ae35ea14a405e129f5778068c2eefdeab92ee43936bddcd882a7a47fca599e4840b63e98ad9d25af6cab3f0863281261ea92e2963f8c38fadb2e0a81b0373a28b4a573878cc6a0c5892b12e16aee37081001a808c39a7e1ed855762f37b6fa74d13859c8792b64a28cac07e471a38a8ba65be3239c289bcf793686e554f42e0d67e5ef81f593bece5753b73954bd4cd1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (777, '{"ob": ["15151515f6ee44fa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e856a244da3b33c568663465aeba9ef0e5a983dcbb4af2562140079f3913def0a02b8a23562b1d3f22e1993a706a5d4b16ce1830ba561c8aac577ad3a9bab4ea20ada388c8c8e0ff0693625917675ab29f65c5a04c9f843e18e9211ddcc5478f0cfc42e3d1d52854b085b04caae9c47f823f418fe306b3c7983873feadb0132a8313df255a657b33f45a7da12d1bb36b3e69ed8e373efb462a14d7bb31e7808974d8cad14726fd28bdc39fd187de72e5f88a172c02965983f0809cd9c33cbc810e2b9387925b40350c3dbd42b3cd432c38dfbcc73bee5ca64234844500ec99f8c99e8776e1a4f521b35f84f35609db9641d2ffdc878228d5519f339aef5af19a2b784509ea0a720a25066905c09dec41cc6ad36a9fd6226edc6eae75f5fd2e3f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (778, '{"ob": ["15151515f6ee4460892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b259fbde5b59e32ff5a1dadc257dcf2568929bfc2767c79277434a7022272e6aa40e1b00b9bcc1e06fd0fdcac3d705c592df1cb079785f0007be42d5a737810d906a3d540e65f940b12d3f017e74216d82133066b5b119249ee9a29d4856f45175de8b5acf41ac74666f83db92a4e300a6a0ddbe1f7cb41ebe61b27f56f562aa2ff9b2e84a4de46eb8a425312a5672c1c3d60fb7ff242f420f91f9b767c818785906ad9657a31040fcf88f89d35b5395f3802a76f75d1ecb2842a3575e2bcfb61946a0218a7e9d231df12e0622160c5d5761901dca02a187b30b1f6e619bddc671d599e05f5415d988130f008bf94a120593d796949514bab331c734f37d02a5b03a7748c6e253e1a4d3a99081b7b036f97f70cb991b6c5520bd78baba355aed"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (779, '{"ob": ["15151515f6ee4416892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f5bb2b068a7918717c1672e3182f3e4f33ee373500b899aff9491730a6a4b83832f9a2de12988b4e9209070216200e512d88be04f3543523541ad910f3ce0804b18781fea97c8c1a18245a2adf2a80d3c71473c257078592a60ec2d290748b0c91f061c7b304a08ff40e28e57e67aade67787a866ca790b5890b85acb960b0f328b2f4fb9d75c5e3760ca26d929b089b682c4cfb0bfcee49e834f84226d495ae330b9929c308da7ca0de0eba734993ddd50ea2814357c1bac8f89684710d7d44959d0c80a43b1caeec38a2bd2a577035183229487e3fe0190586581e6989ee316e1b70c25de34b0fc701cee74c7b9348ba519075b17b4ba0af6d952fa92d611a47d0299084d9a9f294dcba2698c27e750a02ae2f0798c5f183f44fa987863f96"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (780, '{"ob": ["15151515f6ee44b4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358176745a4e90897ce9fcb06a563ff35d44986e0d592dcf939aa2ab402d336e39ae1401328a6557e509eb7f5f7e3a44f4ff43abea1b161246d669d57b894c52ee13a8288704da1b961c961121c936cdee8d645f7e8609af8557ae741449bfb28a73663798e58b4497bf5349eb599bd927740e4569b0373d7fddf5642bf8ac38ae3f33aa38d08c9b2ab80e47d241ac7397d1c9a66e1859f3b7faefb7d91fcf6ee8ee42242633979be07fca60a3eb905b752b8db5f500c58b6f640d7d49bfa27731171325524298988c2ec2d1298bab3142a9bfbdc6c382532a33092067eb16ee1968de80f7b8b57c9f3e88c5722b1e010dae13c94aa5b9de93e485a4ed1e0a7771a9ab5d65d1a43af693fcaf5834937b3f658e0c72998abf4c506915bf69025b5cf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (781, '{"ob": ["15151515f6ee44df892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586c44161c21d301b7bbf5ecaf55caee24a0cb3200524331a8ecaa9c88a059a9a56cf8d1b0dec03badbcf4124ea4bdd7f5023fedf81096c6a2fd6082b0a652aeea707fb5847910393d0637958c9c21c08d7f075a8756c0abb231302fe77868dc6297f449599da74dfd4fcfdbb83bcd0c9c9637065bbc224f6065bacfe7786dbdee11650d1393a20d557ea1da292c44385727e9494f7fd287350a1c3991378f16726457afe89bfd0a25039994c786b637ba58f5d9369957bfeef06f16a112c1d625341eff20b884b7fb543293e1d78ed70ace185d21860372e6aabc7676899aaee60d8326cfc14c91e9979cdee92c63c4ba11ccd7d8a21c317122c7fa32b70f7757ab7e3f262ede595341b847ff763f548825754a479ea6d77190f8a50f9acbe70b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (782, '{"ob": ["15151515f6ee4408892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135843aa9ead5e37b34db03e0dabd184fdb9a7bad0e5d83bd7cc59fe6af8f80d4e60d012aeb9b0b29739b249dfbc20f90e48df81c53f3ae287081dc4352638039a2a9965d9d33fbd50be63772d7550b7d1dfbd3d3030afb208a3124f60b1b66db5615759f47e8b09887ac99bcae31da3ada460b67ea2795175261b1eaef85d6901d8f297d986696223717b89a6eaf00937dc43ca12535ee3110dd8d2ec152f05138c220163e834ddee3339ce60af88372c43184ba368b8ec18b6cffe0f165d4713d1e69e141dcd044da1dad9def13f0a97d6c16e3f9907362badfcd3d5c926c601bc31a9336e1aa103e8fee8d5017b7f538a022774220c552565a823cda83da487e687016662cd781969a4c480e2091face55086357e0b09ca85cccd8cf87ba35928"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (783, '{"ob": ["15151515f6ee44f9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a3ea059b3154ebf87f30eab3802ebc27fb05bdf7ff7b2e086a73c6544221092faf3b6513ed252bf98984cf56b38131a04f8d97a2378a5d070efb1c5cfd41ea02591b141fc0f7cb89c834bca3e21154ef9c7cd896305a34f2bdebd527ceda15c968beaaa2adab2f71d53ccc09f301ec6d5c561e5c5c36174e0b9b9bc207fabb1385548982362394b1e0d0a11be9911246b16cd6b0aea8fda1c88fce8fb3e515b98dc34ba0bef1a5853f7891269b3c0de73cb81560a3c11af5d5a21118b3914ba8d5a4126d8e7faa2e6b6e93a82634f97fd34cdb50bc549f28345cc52c935a895193724ec166dc11bf4f274a0f3b8403212fe8d3a9e1aa61f7294368947c39f080b045b192a03ec4810d555ad49bdbfce826bf613b13f60e897467954d8a50bb3b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (784, '{"ob": ["15151515f6ee4471892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ad3c5470047d13bc5ee3d9e52854ff6b30c1d50f26698fa28a7ea741c5e0fa7b02dbc003f8e25c45e240ad09c01f0e4a455fd4ca2177a6833412003f43e8b17a2d7db57ce3f65763a1db509001b1d8242516b4a764d9ed86a3b905d011f5b6bd3871e801b429b447b4718750dad745271354452b7dc65988a003c9adc97eaebc03ba8983bee1c70fc913b88388a50b7b31e49bc696705ed86e647ec424f79a3366c9f9669b7d7542e2da26fe4ee5f35c5e8df4d8bb37712d7ce36029cc1a6608567ca3ae6d5b876f2f2ddb8eb01e3df26e9c465faf80b80c986d5e7a09a449841a04cedd0a3d5ee410f30b02b242518b7eb0b2d55dc1a2d761402b1b1e8d17426e08f12ee4770345136330a2d1366264b95e32245375e6b8bb9968a94c71cdfb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (785, '{"ob": ["15151515f6ee4409892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b1862a6513410390b8686f97223c9a2663f477a516e66955c4c2a99e853eaaca52664af9c3731519f96820c3b8cbc0f993e5225d1202e0e0a3cc6e636fe6012d8560abc63118165f2a7e49ba9e3f3ad5d688bc477bcf61c9dfda3c7a7cf3283892cf484099aeaef441fb068aba39d1c7ca7f91beeefe090b8ac66b2c04210e6c1807369e4b6ce1c64ef7e62db2145d66afc688ae3d5896eccdc6c20fd8f1c557b01ee4030118c11765c31079805d0c349f35b52f29390dcfdaa1bd5e35e2047116b7c0568f46e1168e64803a9c9cb21b36da16009ec580df948981c0d930c5f58682712cfce0535a57d09091dd75127bca23894440f52571862c35763966ff8837d9ebd7adff32c0c6f69f23bf06ce0b68cbbf56e1222cd2ed5639f6ffad344d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (786, '{"ob": ["15151515f6ee4412892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e4fe1479676921549594b94cb1f9dbfbfbfc7ce990f706624c7c7a4f3b7f31e9ece3c905aeddee30e2331622dd22e8ba7c7d93dd3d2e48e0130488d0b1bc4f12e681025e5362a6439117315d393a5d4e7e7f4800fd8d4a1d05a25a2ca95158b0a241e99fe320ac704f2b563077f12ebc4700573537ad725b15a76af00a71e8137eada1834f13da04dfe58f829e2475760b5405b6765326ed366966fcfb83f0979c110805eb1a67fa133d75a3780601db77afe20bb20380d5484a59f6d855d94b9259e8b578ab532946df2afe496374f6e22fd3f3ebb740ca9ca2171f1618dde526f1f04dcf586f782acf61c80ce46cee94aeea12c70ede008fc57171b1eecd3b22ae17505441c055b8ec8a03e04bcc38553f370070c417915acfa27d34fda8dc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (787, '{"ob": ["15151515f6ee44ef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586e8e236e54614b0167f598c707fa63b27350bb068060f68ad80bd0fb106632a1b43380aae958c43df9d9b3851b8ed6c347491d1f6bba490cbd1527a57bedbb50f4f499423bbc066ece7cb1caebbcbba2623d17aff07994437020132ba0007d47c1ddea6c7c6e50dfe8af6d90d43b300fe89a1e1b605c750252a3518b7055bea0d2e51c6d9cd9697610d1f469bcdd79e9ad61df220e304861da859f801378282bf37a9eee78c89a809d35d63e7ccaffe48d51260c9cfcce3bf99e1e587e1d2c6d3d2f8c3405ed1c8876600866c6fd5e2116b84ee9432af03b8460f13864b190f2db91dda36294701240d2a181d9f2e2a2d3c3581fd7a323a8df9b102b069f3101adfabd1710a02d29d847274883ac07930ab60093925007801f9a00d44ed61b0f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (788, '{"ob": ["15151515f6ee4401892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589aff892206cc685f31db4b2c751ea361b21dcaeca89c9a295f922c8a9bafe7ac88ed2fb605b54a8c057d4f21dfd6e08480cae629ba91c85e306f8978fb769d880c80ffd4f70acd9645d21fa3468ff24fd2a8f0faeb51471c84716389b3e930df710cf08cc3b2079d4a4368b95057e37c97143a70d19b0b4a462a26bf5350dff81db897ce6f0b3a4a18727d8653a456824feb6f73a6f5ce5230facec90caaa02f52fd6e737498e2cee3f78d345b7b1e73fbaada247ae1994ebb439d60d73038677dfd12caca0b94a82a4eb4f21636dffa20a77242d3d8b56b2503ec1e335d1a580c61d64d9bb9ad6db3a00e47b461067708b364450c21881d0200f8f297148207100d6d8fcb412357db060dee67292c2c7ca400c10f911156d3ad734feb731c44"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (789, '{"ob": ["15151515f6ee44b7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a8a676060c4ae79deb0e06c0111f2a33758674a1e12703fbfe5e9c6a675af59ee93245791132c92cf501fc6ffa9c2540437efb0fc41f5d8ee147e54ea68b65ed88c7ccac83780d69d4fab117d7083c83ac128b362b7303f4fdcef4f91c10f2842a0d8bcef664abc04f139e2813662414f154add0e49736f72ca4d4359d3cd2b4bb9343b94d32740bbf3dc9fd03f192f2d1f29d4f98f90a22b0d939bb2daa1fa0f13d3073e5dddbe911c217afb9ebc27083956402cb7b905839fbbad561f7b06aafd5f3ab2ce5ba0d71e79098efd8b609a90ff340b412314af92222f15fefd0667a69c40770dcf463a778f24dc78edbc89c6a07992bd2711b7ab9ba2241fac72525dbb7e20b665a02a36cab172dd9f65fc309c38533c319e09beace17e617c862"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (790, '{"ob": ["15151515f6ee44e1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135884a4132e69d007ed567c6665c797743631b7c0efa74f6eeb2478ec667993f9b01f47eeb6dc0db608691addd9caae39844b50d8eb4bbd9616b3f196a200b0efec471554eb9e4f364c6db9de88364f6d52cebffcd41c356c3dd461759a6337ba4e11feb0fb6c1f4ea28ff60ed8e99ef7faeee78efa2cfb4297d799d7faa86d1787ecde1db1e5fe963d1f94f847b48f378b8ab0c41a8b0a2c05779467351e09ce82a7a847aab4cb85e07af940d2f0b25c45554a4fcd7d1cf544dffdc9c67e8822bab36ed7653f56d71d67ce7f2d036b2d8462a84634a2ba1867e83725469341cb8cd69e8e2ec52d8d3248f18537828fc14e476098cc64069f93b02e127af5edb0b04579f7046b8e4f9ab816ab53f62cfc47ed90a779fdd6543cc3e31c7657d1c264"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (791, '{"ob": ["15151515f6ee44f6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586a06c7a16432b005a310840921bd2757b8b84fc78270ad0bbfc5dfc13981ec66f46a97d9c067f8da9ec3e285968ba995375f68d3179d6eea08b3e122e292df34a7c0abb43448ca0cf44dc641e7e2c6715c2257a44a06cae6d6b2e37fa334c9d1ba77b4eae71797bfba7034ca0d822cb8bebb44eec8626459ad602c2395514ab727aacc64ab1f5bab4645964a65a692ffd4891c632ef6031d6417a9b34118fea9cec9a53cc3f88a0ac60efaf50aca2c07c20a43308686b3c4fab66c52cc0d9640011ebea008516151710488f3d51cf0f54ef006389c7cd92ee21d0c387c04db86903aa62ca1cfef6a6cf73ad7e063582c36abcbd6dd65218d1304de1e85ccde196e77ea1b4ce5bd1458fbe5e6e7eaec74b32db8d98ea0994485333a4b32e2d824"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (792, '{"ob": ["15151515f6ee44b2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135864122d9f35a129f9cb5bf9a6d45237d218bb997e2508ae43c5dde4e313c0b27387829db96f3213f3affec564596e21f3622800e4ea3da0f6172511a4fa35dd28ac8c55fd5c6441bf426375516e04de984f7b2dbcc4f4ef2dcf5f60660a0e573726df9eb426970adb4667cd761cc278fe4847025bb41c9170e74d67ca5dc7efa4dab6de96ab8f5547fd094d6caaab1416ba6f6f33cacf84c8aa60d881d29762759472272b74090331693e74c56e0ad4ff13d5df087341efb35e92a5817c5fc99efd613264273a837eff1271b14f63dc337113d6eb1c2b50ee1cf2deb33bb5d360135b90d76da2efe12f154fa873bd13bcdacdf90448c6733809ef6017983076dcd0d0b2377a5555a4756b746156342b845404cd226123d25cb4bf1a926be0f4ff"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (793, '{"ob": ["15151515f6ee4440892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584ef2b20d718dc803b17fb98823f32a8481439536b307e670259ef1854f08b48104b0aac9066880cbfb99b4af22fa1707874508741bbd238c8ec01b74f80d19bf55ea24ba4fdce0f53af1c7401a99ef4d1c351b832f5ceffcb2154cde61cf7d3c0c60e64ed8084a048d4f3b32eae0ba05804b83bb95dbfd6da681ffe6734bb99335f0bd146718ece978570deab9b60707e78a5fbaa2b69c0e12a47e9abc23d3feabf1a6431cb358ea43c3fa42fa195f21df171d1676f910cae43c7cb0f005775ec625dfba2f08a106380cb2b27c0ed01f893cf912ea10deed5e5e69df2fb6a330c8fb446de86ba7c68edde316fb3f23b37bbc129feaa41c56fbbfcaeab4d29784a1f2e5f8448f2e446df537efcbbf80af7d28db6af928dd3e94d4f6792c964eda"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (794, '{"ob": ["15151515f6ee4476892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135860ef6327d72bcb579313b51abd0237bed9bac560e576c1bae8a8745a34a1ca0970f1e3f01186f0da584ffc0bd833e08b4be08173ca47bcb7b1430545fd7c786c8c1a6e7efc7b43a7f777b62f82e5450a176c8d028a83632ddca6fbb2f6135a5613885a0a345ce15f7d4166d2a7848590229321ff35c924ebb4156451a8c5e33bd1ef967c9faf9d6e88680c2bb0d7d5cb37172a2bf91f36da06d4c9ef48d64386b96e4eb9457ff7d4753f803c7b87f74f0a8919308a3bf9283aea480e74f132d233e0d32c7a44813e2bcda1f0399cbb9e4e1e2e05cc66c8421121e573cd7689ac9cc9aa428995fb117690555e0469bb8ba1cac884ce1bfa38feb78dc9f8aa89e4f6ae5065cd7acbc1e7708b802f2f6a2b32476771246c7ba57bbcb8a6f0dd6948"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (795, '{"ob": ["15151515f6ee4425892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135857deb5047c6d4e018fcc34ddba9ac5ee48e0045ea3c0d655082121c511ed30f0a7cbe0c26bb1fd862f576249ce036a7124681b27a5f78b4fd2ceb4cc9925f279fbcd5910ec5ab3bacd5e61232467fa112dc0ef74c1d01bdd1abc1729ba4c0683e8c876fe85e558a63f2dd48ca2df8102f30664794e8459a83675c99c79d5cbda6348525687ccb5836711e053ff9f8a52b046f18c347d6d57927bb4658dd232740c134f578d68153273e2ff6fc060f2f6ec6bdad1e66300c3632e9e1636894433c2145e698031930800bca4b0e5a6eeb087ea3502144e46c0017a01d550a1c66d12a91c2f359589fea349a1cb4e1260d5bae2aa05a3c81cab6e9f55c54621aadeee032c0e7542b92ab63425d27b8ea70aa999e10e52ba60d4c8bb667ad724e6c8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (796, '{"ob": ["15151515f6ee4453892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358bb5f5ac13a0a115e0b70b65bf131b02b75fe758e34df0552be4f5f8a9670ea5bcaae9cccc830afe89b26f81b144f95a63acd83da1d7560e8cdc8b3a710336a5847bc96d475eec523f772e0b5b86475bad28008948916b0e9428b10b95e0f799da1ac0824fcd0582ff1265b5d5a4e2910cea1a1e50bd1ecad10dbb918c43a1fb4f8df9fa47e9d522bf7b721f05a0986a02eca7f795cb14fa776e9826e761708e52f343ce30fff4336554449d8c577f7af48fff17998e58022e716ad1cdbc1d1562744f41a067b8fdee5fd310a4fae2c6414bcd40afddb4aa185c637ab982ef2e4cbcb5dca8d033ca7327ca6370ff4a724505dae7acb1ddc9739489baf21057472db605ac8dc251d3c052d1baada0abd0c4b1bff4d3d438253f3224a7565be3c17"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (797, '{"ob": ["15151515f6ee4413892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135884cb59c8bdf60b8e1c99e3e70c86552a01d188c9b662c0e2db177c4a2bd60af73440dc277ccff947e99ffcaf48541cd3a704ef621f5260a282302b3d2e07ed6fbbf2cf66411e65b373d76bac751f3daa00fdf51e3c400d9fe646f4c985087a90b81cc3572eb2cf6181ca144d155c7818d6fc7c2a08d5da6d5f4404140ead69d75c7828397a45dae69e7636717f23ac0a184f5fc671d0a28fed4b136ef66744071506493c30cede275db6e23bc2afffe7c26393c7cb63534a4f7aaaa5ad9735afa6835a08887e0a759e128bcf202d129719a9c075d507f54ff35264ccea86090c994558308842f0c790646308c213b3c3fba7653ae8931337cfdb1e079c6cf3504ac082948bbbf8a639248ab273b7245a023abe7a5dc1f02268f0d9d833150626"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (798, '{"ob": ["15151515f6ee4405892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135808246be846216d8e1d8c0873e9b60e100baf16deaadb101b57ba0ab4693d5d96765c0c1c407831ecfc90965d0ca0b55334da27b8ffafc0adcad737151e1fce98c9d62027935460b2b63b6a1bc6fd980b15e893f81213630fa01378adb7db9e07262d447ae74b480aebaeca0416739202b1ec10bec299428a3297ed90b0c8b3f5f8f2048d62cd88c0d14eaebaeb2452ade5ff2ea7bb52cb96b581241570d20a2efeaa7efcf5781b3bcf7bee34cc586832e54a9ca16f88043b507dfa5105fa7aa7f0cd1b33d92dafc6f9777136305f17ae784f36257840d6686c0edf21f6e0160c3480e6670bbf47d1d8de42521360948975499a501c95c7ec40a7ad2727f4df12f133249c90d76a2f5862af45e09fff4460a5520a7792deff26ecb187e3bf4fe4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (799, '{"ob": ["15151515f6ee448c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587356e8ca6daf09f8ff7a180f780c43e256f41fc6c011efe530b9eb3fe1d79a3c61885ca84e63244d412d1cc11942aa9d1864064458b84245925231d1b0ff3526b04165951b890ba8565c607b17216628a7581322cb14eb69951bdf3f63bed7badbffecf3e04881bdce1b0f02c9f10614fd9228da405429e524a7b3f57ca92f580644615b611ff34c80fc3d98ecfec769eb453544d64a782173d0a503e2cba8d549b8da123ba70c3cb945e49036530cac8907158e01c02ceb9c668520bed10e449ff12b08cf98dd0b49eca4e2e9bf4e1d3fe9ed73679dc4cf0e3faf942557833b2fec43be1fcb7272f8e46340182376cbb09fb3d16378907bfae78f948771991e64459f5d2b2c0c4dd2ab75888413031ea33d7a515bb7ed7ba1e43f2dd25a68b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (800, '{"ob": ["15151515f6ee4432892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135840ea17012d4d9ba54687305bba2bffd44584ac9dd17658a23c3538a5dfc025d28118059220aa1f0d8fc86ae306af0acefb28aad05591844e67656eb93258b57a6eeb659e30e9dfb9efb1407d44519feeb97aa5ba8d93bcd0fa32488fb9e837af0667079ab0b25ca46a3955faceb5e903c798428d81a32bb8d2bb4cbde381cd89f8ac89e785e78fa22d697458d8f70bc0148a38a0863cd852da898a8911ebc4e201a192cad9a80dbf05ae6180e297c1df8325683c2b457fbac081ff40727cbdbb0f3109a4eb2deceb16bf5897eaabbbcaee9fff734e6972f8b375e2f7c2d6bfe4e50219e9b7ed33bee72c2098921c459bc19a835f58f3faedcdf9863ad1a3da3fc9a30a067d4d85fe0591267a89dcfa2574b0486db47aa28d86d42059434e625c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (801, '{"ob": ["15151515f6ee4407892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b28f0ca69acffe05e0a1fc3cb1d24e92467ac126c4c82c8efd5318e64220d4057a2e269715b768891ab7c633fdd682395feae015faef46537692e32ee8914a966d249a6545bda621f593dbd819a938e93221f11627088b6faf2b3cecbffc82c7930bc489385e2f2829bdad52d5512f7f3e9f54f4daf44291597ffc0251b9508c3d325dba7b22de042913e9b71a4b79cc0f88de199e4e6cf3edafa0ab4161cf141b628bf5263f1ca01e9ce8dce7ff0ead3d06468a1c792c1d604dba89b3906259a36ca0cb7e1dde06af77fb495259fbb035bb4505e1ffb4b1fe98f922c537bc27d27af92f445494b13e1bda70d0944f80d89913cf89e96a78c5b1ee42ce0e3e8b778f485eb50af09693617ca26427ea117387b6308596de277d45783cfb0b8fcf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (802, '{"ob": ["15151515f6ee44c2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c5d32b1653711f6cfdfdca1c6e5bce5acc144bfd2d42c54b698dfeee258dead3e7e76674de2cbc1cb9e2953c7f74b52bfa64f51a2cfba7e9f7f4e27be838cc29b3a366cd74c99bf8b6819cdee2fb4d15343d04f1d7a8833b481454b12b5f7bbc36c3ede2b1dac8851078f0e4fb0b14fe2d5afd01e383ca950d297d643002d52fe7dba87ec137e3289ba4b05c6dda84535a002948eb854cf8df170da8ea8bad1c5b2d69a4a7d5678677927737f2523073d6b6ad1f54d810d03b22c2f02bf0e5c089fe84f573c191b06441ad85298ed3ea1c7ecb352351830ca8322b2ed1b461e6137ad2973ac0fdee7df3b8a47fe778b8bc3d319685738e64fc50dafce93c3e26ce369fb419a5f4ac8365cede55d4efb7fa8ba9b5095d286a394cf13fbd2f68e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (803, '{"ob": ["15151515f6ee44ce892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b502998eba48f2b46190071ebc35eefb0c02eb3ddd61fc27d64a97977fcb37663d40c5465e11ba63b2fe9ddcf1678498323267e3f2a28851ede662d9b0efd623cfc1b5e8368b3b32cf8c605e9c5268855788172114e24ec1974d03488519243433bb7eb239f8f4587c2c05e346846d6fc32ee0c55be4210670fdff70a82e22ac55c734cbcf220328fbd5356bd7897ea578664fb79db11a5ffd17d28ca930b1b4231dfb98c2948f4503bb6a4365c863ad806a639e2931f9a0d0c05abae0f3ea05ecbf45b73007979bf7ff5e2726bbae53520d086f6e007178f992467e07afb4eb5bc8a950b9841fc046610fc58fd7947e490a20533608622ba662def11964770a26f15264aad45033e88630d9687f67ec97dbac7a59e527b356fd6696eea4005a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (804, '{"ob": ["15151515f6ee444a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584a1a86245673f52ba7438720fc72d0af81ffd894948514e76f600d6f1bb3bccfb2ef062c74ef0f46d688a7b522e246e2f734e7701930942fa12044813b254ea42768b8ab6fbb73e2b0c72e55ad38667f39a4ffc08875e35f6d8ea24ac9067ae7776cf1e2f142c0087c46d2aebd116035b0babc82bdf047650e9182d454633ceb7edc2ebcd79799c825a025610e2152b2fa3e19f62480a0cd98fe22a33c4cd35c48c7e06e84ff5ed0a65ec2f8528b7d22e103a4dbd42a12cc6dd3a3f806cf995b1c817cce7d503946e1d1b85693cec02f518a19fd289f93c0e51595a0f94df7feb533f0417b62da4771dde1a920e66448c260c06fa23366b72e9916e173354a0304be160959e991b070ec34f32cd90a37d29cb6caf0e5b1d557c07db877daf363"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (805, '{"ob": ["15151515f6ee44f2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dd3e1b72ecdd195bedc0278966962456434861a27762a64e42552e122de67bb4437cddc7d5cdc6cd48447415f1c228b47a28e8fddf0fb3e7759c926164e2fc78513b48d8b1dbdf8fd2359dd9c350ebc8276f6e83166376c7ebeea634c750798243995e32fb9770ff02bfa5d83736b554f30233569aebf2f0d9863864064d7502157a2a0a959a7d74b99772afb820a5d53751d7b0ad37885cd19433b2b79466651123d1eac390573622b3914e729cd71e0fb1693c28066b91420c83ecdc6e5cbaab2d011ef5977a85a9a09e93d568b205cd316ea41bc81c5320d4b0a11690fa70f9865aa62d2f36d64a3a924784b0d5f361742954137a805c432fdcf9555717cdbe3f2139a2cbd3fb46f4a86bf62a525343397611ac41106046e04c749625415e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (806, '{"ob": ["15151515f6ee4488892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dbcd55420c163b103c4468d05eb26886b3cf4c5dee7029c9ac23fa43bd85613bbf36632e055d82eabc824fbe0ac52230db05d7f20a760fe934b1da5247b465dc7f798ef63f68156bd2c9a95d4c64793e612e00e1d4d2a6a1c43ec6f784c6bd1133ef9232508c0565fa45e6e6ba53be76cfc7b9412c7ecbc91fb498315eef5117e3cca58907fe953483e3097821011d848aab2bea066f3b1209c0f411e638b433946c0454949c8406ba7dc9a136b6f2a5c2c2b8a5cd276e718c6a85d45dad98c2516131101f037fff418c75f006d76600453b6238f513cc8f93e7011f7f2fa14f6b24f6556d31f2295e5b08889f057763bb857eee3c0bdddd57a3f52816f2565f93a63c4587e946c1d04c132f0f6d9fedfc9a89cd0f43415d9cabb39d88d7feeb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (807, '{"ob": ["15151515f6ee44ed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586086890eb5ea1fc65dac33ff6feb1eaa1b55f04d78ba851174fed89b19ed52e18ecbcb87b332e6daa4b2800aede13f2315d62912ec315355b42a1cf5e867023648e9c76d2b3446de4bb8f716365edb7168cb8c4b38ced40a834a1140aec7eaf58dd2673e92a1fd8cc5789959235b545d2f709eb2b73ca0378e1e42d6ae4f533661b9a672ec82023a57f8453475a9f7c2e89108b9d96622af183451a26d41cd4a6f59d3b2fa6691c4e2e38cb077886942fd4ebad1d343d4cc93ef878bf19b075103796b2f7e9268d9cca2e1d0f3e461c008150edb9dfa1d669a50224231b93d807027eeb2aba4d705afb3a60a02d056353cdeaa9e2fefb846d315ff7219b98b797e086f943cb50cdc16a1d12a58cac9a3db428894bfe86a68d61529568912ac4a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (808, '{"ob": ["15151515f6ee443f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135851e3a413f77be36776f4dad8f53222372dc3747909509ddc4ec9820422ac892d4ec59d7b669f12ff9a4bf60948e922b0ae24a5b92c4379381bc58ad1c696e36efa4a98c36757c5a742abee4e30740e347a9e721470c03037fb9684018e7f17651273cfc9f50b768d0a9056aae97a8f456bf5a34c5a8aaf61a4286ccccfcb8307dec88ab8941c90a30319509846c788fdb44d77d04a1a86c0f9c14d034e9b881d66fa242303e3be1439f2e4fa61dab5ad3e61d98ca6d631f8fb2cfe79ddbd8df64d53e517f834b1469a45de61fc68bd2cfaaf09c98366a0e6bed3805e41ef86140546e8e64ead14670ba517d5975b8afc2d75202917546aa07b3409e4ce7dd4f530743b665dc7bf02849288da6346e76fc63fe8a63084301919620d64ad084fb7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (809, '{"ob": ["15151515f6ee440e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588040f5b6993d3f255dae4140285786d3c484cb3c8b4bbb7a9a93eda264a41686150eb8ef658d84ef6a864096d162293e15da56307a32810788bfeff2936fde85a4cead8487e08e13b8d4b78e45aab5591a8046173eb1d179727071f3fd9962dac4e53a813c90e0a01e1124d756dab99a5e86d449b007a90c4e270c2aef84c7eb3562b4e22e01d53378c24b4f5ece231a9098e5ca4668fbd50e0b4e0e89758765c64d629cc1bb3bd7e6dbbf3a84559daafd6fd470f3de0e53db812c64c0a89c553bea238ff89dd6ffb068dacc3f39ff9e843f465773e31da52d5964a6b05e9ba9928351537a3635652133b2ec65d25941c8dc069c9b9699a0d8f04e1efe79be1ebe51432592ed6a9f64a9558318edb042ae493ae88ead6eec3336d5f14efe585d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (810, '{"ob": ["15151515f6ee4442892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c4df45371da2b5077bbdd017123d8057f4e706c1ebbc8a44cc59f44988f6280b1440114edd5710400dc8d4d3ceefc79cbb193f4e420e9c7bb495b6e4f56a72fd7b553afa0c12b8a711cdb964ba70287271d4aa39544b2a450c0e609d83991ff993501e3839167b7f53bfc97dbf4ef74c56626e11e6e20f0f154511a4480abc8828a5046565ca5abb7267a9573542b60456f2153e94680e919cf357ac2d3250bdc3fbd725081ab6b8bab4642617fa67129b183072a7f65fcd3c86411b0984ad9269e08c600dc0f949ebc0fa1b69b8af3403b435a271a8e4cf08923b681749e67595806c6979267a124d7c8298f6781fe05f1592dd7da437b3a89ead34f9ca356b14ccaf1f8f879cfd7bd5eb923c31fb1b7813fb70dd5bf1d094aa2160ae81343a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (811, '{"ob": ["15151515f6ee44e7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f810ff6e306650f39a46a3447093dfdfe48a179473612d41f1551905c3503313b268e9a2382585c5374878e2c29793aefd4b3ae88b9597a295fbb7479b149a8ce0236d97844e38f51c53ee86163f9128b9ef984a58b6590b7b9d210b84558f0b6f58f04153a3f0f5d4738d77facd9128917f0e8d9e2be9a18f7ac1efaeaea9b2d91ba0b793df5310960fd52cbc8045d940a076248bcb848385eee35729a81258c64919721c2b4d7a59c87ab38c6a71fbd7748636ef7c9f5852af03cb536b8ec3149b9a7c523090def2c85e8fb881333ffc2a02da758005ccbbb1d467e07ac576c5d8751aa6a0096b9d97d2665955671b0e1fd6d9a6bef59683dc508e68bf191aed5ad67fe842c628503bf2ceb47d084ead119c54681b805af431135c088899bf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (812, '{"ob": ["15151515f6ee4411892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580ec77c9cc2c95db63d1bcf01596e8f64147f7053fe592bca62d8260cd4c956e49c1e4495bfada12ed1681c7f1da944522e683d9b32c9545b4d9bec82b1c618bb18a614d80f0ce19e9b805aae1648849f851f96ca4a23bdb7a57c7a82da4a484f85bb9b410be5b5c9025081d6c7f3a791d7103030319785401f0584ed500b1ae5d31cb3e01797e3a8a199359dda75feaef4080ffb4dd5dcd3807b422eb4d22f32e788e0fc528ff8ed97829d91eedec580c3d034f63fce032a7687348ca71dd300e6139ea82585913d821a893b811e0f435d6e779df14693b92fd79837b110a4fa630aa2155c1a37ce368f9781e2932da7f5525aa5d62e8a61af37182e425e62c1a1ae234c4c7ee7fca1d31af3fc1e2933f6d0d7b0fece3fec40158be4915fc381"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (813, '{"ob": ["15151515f6ee4423892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135897fdae926c6f400fe062ed1e5a033246490cf4b06a9d7b3b9b2a51436c38eb462a037fecbb91a54dc48feeb84c5928dab3c83df9d19e1b429bf7bf5fe57e6524bfba9b1729e5e917763ca06e5c3c3515e2b41f2ecdf011c98be13e782b974edde01adbcc432468878fa521576c346087f69a405e883316a0dbefda4a406ea4bc790bcce56832c917cf768d602b17a7cf44d75b11724286f31fe5ef73fb8db45bb1424f3f736854c6dcc9eb359e4d259165c06e42d09a96119edcba7aa621536b0186631ba76d4170e71d2a14d139140880323e83e5157d81d5fb8c06e18d9acf0ee3aa34631b322006a03a1a0d73b2689a5413ff2fc373cf0d305080b1a9a968dd7bf296fdb61daa7c7de5959d28bdb4a1aea69a6729523c18fd79e44bd2d3f2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (814, '{"ob": ["15151515f6ee4428892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c5eb1caef2a05092935f69a41cf9a0e5364bcd9b4b0f8fda4d1633f76fd4ef8bf86e05485db66a525c7ca7d2a65256a2c417db448e6114873cdcaba2637b5e96740fb2ab356f8bef493ee980b457aae9a6b648f1059dd12640d3445a376d005d3314188a5784d4d2c58149c10b880943e7b0474c3e0589b6ca231b2309abc072389387ebb336e9d72410611dbc7c0b55162a0a86b0d97f0f5e2434c4be2c5d317c7cb68e2d097270b14148f68e78d4d6fb7eda565c31e6a97198f5ea2dddefb45f62bc6247e32e83f19d6e92f195f56f321ffe5c6dbfcf7381fea3b27133e925476cc870bc29ece67a7c3e3a1affef7a79931410ff488da8d55ef0129d9cb19b9470c782476a92b4f57c8730e25a484b815fe50ef2fb4738e84cf7ed0a5b9fcf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (815, '{"ob": ["15151515f6ee44a9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584c19e42189253c9c9e81227a3ffc5b51f3ef71b4e42c94f88579b49db5690def7f5cbb6c5476681e172abe52f16b737804261b4bbe5bfbd46be1708a8a168434a372af9dc19496890bafc92d82029d626c8d3059a1e1dbceff670984e2dc3b46ec6ef89d5e974bda5162110ecd5cd78c358f136b3bb4bff0088ca18188341f9460d2700fc8245f7931d2d5af119ddc7e13595a21d8e1e3321349586a3e2cd3caa2fb2458d4e9bbd1b8c8acb77ec26a18ddb2f7d8bde2b9cea2320670c0fe332691c08cdeff5e7abe527927a4ca098ba356b13dce7b871d3b4f2236673f61827fbf6eab152019dd014d12083c223889eb20df3605ef8303375f3da79f95a41ba6abacb946be96f9617262b54eff69964325511a35350902d2cfcf0191e75d733a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (816, '{"ob": ["15151515f6ee445d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586de335e6a407611ee22b8a41e3d6ae11039104ce4beecff9f432fb3af6b3b65b5a04ef0709a9d728a796e2bddfdaaaadaf35e86c3750c9a272af31a97f0098782637bfdaa990fc3268ff04062ee6f623a6c1ee324b5c9ab56e6a08f31b0fb7c365342c78628843ac2f2dabbb39e2cd0da4e320d11a25b2ef70c9cd2a9dffb0a03d167f1e36d60c59767d23a6a17c9291968c5bd29c6cb0a7a2932e259eb63850f7ab951b06ff3a81106adfd030c762815274bdb5a87eecb8b4b5e78425c676a94e2866dcf8956301faf0988dbc54afe73e64940fd8a0eced1431145e0b518088937396b3ca90cbcb834f588d80395b4f0922c7cf1423b29625052d254f1d9a5ddd2fdafd9b857ea8b74e216e2e376c30a0d9f5914ce18b27e38de9c3e910aa77"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (817, '{"ob": ["15151515f6ee4429892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358154e162ca1c8c51318a0d3cbc40e56f876690b4a170b77865173e837f407cb575a3ec8b9c47968818be327539b36092a457d86aa3411ee1225052e621a070033bd544b3e8d25a62f5601b64e55ca09a47328ccd1f3ddd8bff6bd89cd1177268c362168a59f8b4dd3115b2dacd2bed972876f835870e1e59fbb6201a895d08e4d341fd1c0bdbb3aab73dac983074325e3899bdf50e9555658d325d1a0e04d85d3b36c34b26adf07025ac54bc5429a5c44f647e69a8c646d20c0872bf02ad0ee0b3724d465b8a4667f186382132a6716d55979a394b75e78583e56a75020a0f431c307fda72861821e978c8578614faaa9a551734d172ce4a79202df809f9fba3120f9833317a16fed5aa2b4b885b6e29a507c285444366d1d771b7fc7c74b8409"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (818, '{"ob": ["15151515f6ee446f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589a5df242f1c38f9a6e94a221a11fcc2032ddd876cc3e79ec151f9731ced9059406152e2b0c95e08d0cb0808afc1310db3b35f4c9bae339090d0616c2b755c646ed40ac4f0e7415c44bd1b8f73589d9f0fc7cdbbdf7f98d2da92199c3923a4e6ee8a56e2946dce0a88735068a32627e32792cde30cab2c6f6dab05229f1a97aaa4f35d4396a9f8922c6defd04559bb016969f3ee748b5cd4beae5897c074989d0987aaa84aed9ddbc5e2ae4b1d67a4690c2231970ff262141439e015c90b323e931176f25f9570ac6fc4a27e2ef9eaddbc7022fb9d00ed24f9ae564648ada78d66253b276d6cb6baafcc9104e6bc11a81867e682d94e4a5198addaa3cf221924de34317a4e61a41d9006c60ecd5e8e968d1ada348e8dff2ef922ecbf1165ff6c0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (819, '{"ob": ["15151515f6ee44c4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358260b23b11669c13a843a681182e9b6cc23ad57c838ba5ea520a810f0a9185ef7111c2a03a64ea6e36fcedfd94694fccaa32dcdb38acba8f6ee4f7cc66c9204ea3b18e2078e1d7d99b4f69374146cee65b69090f092d99e8f6c86f6c426e92ff1dd9b680e60ba6416367c9957a08eae711aceb0856104d6a4b9809c0754709ed20592e23a18dc2559b856ba1396fd268924b79856b547f7d8b9345e96a9c39b7e3280f9088ef13b6ccf042115dfeeb741ffc0a64cb3c594106a28a09cab574029ab5e9e0e8fc4b24d591eff7e8bf7e2e6a41794bc1c96513f8a07a07d94dbdfe0a3442679b1111c9d58237e68d7b2be7c2a7e054344eb3ba1af4e4903fe442986041af14cd1078be2fbc63feba7bc32c87041f612d122cd56a9e3306cfcb44d41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (820, '{"ob": ["15151515f6ee44da892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fd52b321b372f42bc6b2fd7fd1df08e702d1f906e2583a6019e0dd481e580ee8971d736ef61e20294f4bb72bc0f089c2bc178f3c4beddfa72624708b6687c14c1f18d98a2dfc777ce2c1dd153fe0459eadc6b1aab8dfebabdda0f21b87467f0a46db9969541b22897648e4a7e30850ede67e04f1458c6926bc9f59096842fb9b7aa41398c11817979f31e94c534a453e4f93b552a376a4b72c7f81b6256053fd3c4c1b91532887adc8495eb9b671652b02257c7e7640184ee98aa20079590d280e4ef14fea52bb0113005249d2c50ea3da4206f1786d957ccbcaf363da8ba67a8f13afa721ddfea82e3fb547dfb475876b0cc61bea97cc5c751f71c6db214cf0a183bd1aedd6ecee3be7142377f48f041e9ef4556ab7ed7e8fac221b2b2cb519"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (821, '{"ob": ["15151515f6ee442c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581fa9d76df560af2dcb1c7bda561db28512191e8c94245376b65b20864c11af79acfa832b65b0045eb968420b4e16359f322fb34c518cd7694fdfcb8075399ca3b129189a614a6980e5ffe8694e6a80895821a12f2b58f8a5c48ab2cbad03b45b2ab41869da0082c86719a938af3b599809163a10f17affebe0a242adadc5ebb0f7725d6d3a0c9d227889a56c28545143c24c2792e0b9e1a7f3af54faff1bbac442ab7348fd71cffa6f6ee3b9e334f4d2eb9778f9edc95cbcdb668b41d50e111654fd4812ad6e9923d76ac832fc9f8d600ad07969cf45771e39c33d00770f5bb95396eb9eb9c1ab3faf9f9d3ab7f49ebe786690301a55f2253b87fe3e4405cfc262f932b535e172287266e94b362c596af24dd203018431e9a8212e01900b1191"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (822, '{"ob": ["15151515f6ee44dd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358acd31c10238fd7dd38c6290d2dc23cbfda471ea49b65eecf1da80bd8a5552416c728a3815be23d3cf0328086e3a01c6985ea1782f9c0cdca52856accc300c50d6afc9575680a7ba4e32fc6f1ac44b2a327f539b9e5b6285d9b4767b525343f678b90b4ba013c34a4fb152b70c4d55713eb0a26eb27e5e67e1e8858f3d3ff061388655b7b2faecf66fcca3aee347d542d93030dd3fac692c35013c4846c632cdb15334dca5fb30a7e91f65c336298b0802f39a8d564c01e6664c931229fe2fa74debe089a4f9598273bcbae67d7f954f867f81f496bbcb12b846123ba218291548eb38d417baf0ae3e52ff78ef0fd557d0eeb131cc415c5593d790b8e10a8f8737ecb1196dc9738220e8652d5d9bf0bdb24f72436f81f78d0bd9077392acb030e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (823, '{"ob": ["15151515f6ee4459892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f6a39d20e3bcbac0a3885ee0b406f582e241681b8a14fa026c4ba964efff16c0eb1e2c0614a8e5c4537279c5c5eb839d38b024441dddae200e5eeda12825f655c96cd463253063fc3e3c2da0b834fdb5e9ab01d6bdc91bba2a1d38edd1442083fe875c3702a00ad01a68d6cb2d4e205ce4fbc6a6f07dd82054b5f54a134d5442a8b2612d4f4e42f3b8396be9f256b0f93d543eb7b4846d67c9536b101dd09398d8d700f3349cf4cc1acee2c3b92781e3c0a508d42179cd180569de17d5c5ebb0d6556ec8cf1b386be0bb394c2a59d00b268f8c70b7cab22d57cad10473a1570e11af4ca0b5dbf98af48bc302e99d6eb239dc09c42a0f6831dd7ff90f873e25508cda7bf8a3eeb7c2856348d7a6a1b60194c24b663c3d00aaf68fa031aefe20cb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (824, '{"ob": ["15151515f6ee4463892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ac2216b035c999dbbe9fc3281f3db416a1e8081b07b0048dfddc2082e8d0c27bc7540c68acaa3e49701ce0c070bec35983fef1115620367e9869dea9f6a2527f625d8534b7ea06bb99cf7854fda6fe10b89bb7f2ac9728d6e6d96a721c5cdb6c89822b84878675c43ef31842e2c20d7991a8dce355220bf055fad8e06687bb3f9046291e88a9171328ffb8cec3783cd18023ca4325e8c6592d08c5707a3ab191c78db39833f76627e98fd764c866eff1b03313231544d4a49caec6dc42d67fdce8723f551746d4b49afc052dac479e674e94b45359d15846f88978e20cb8725a583c89aa43b0baf13b34e8d5aa89fb86a930a30d8cd3936ed620dde3c2ccf70942ee027918ee3ffefa593972e920306c3d8a70f6df7334143c5fa8974f684946"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (825, '{"ob": ["15151515f6ee4422892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584e4d32e0e039fe9ec3d9deead5b38e6e895f19f52a0d46fea853cb676850cfb9b407ca9bed85277c352a97d2b9c949c492ee9fe9774ec76bca5b83bba2cf20f2f5fdf904e5525800d2c21849cdb3529da6de3f2d598bf322ba1cd4be2d00736ee41edd7b2803d5bcae12741a80a2f0f08c6595943f01ab82f577cb21e7641ef7eba180f14e71f25fd3f5dab62727d68aec6a037c8c5e51e3f4eed034b7161928a8a913c63df740ac564d1df80f5f01e40d67d4fc3c8987e56f68e0fa795775f62d357db2c029b99b0455bd1151f784d1c86174736eab214d3481dde3d74e3a840b8e6170a2afc81b675c06896a8755f6fa82eed9e8d3bcb1b43f72c0b91cf1ce681c77c5435e80a4d1463a39dd9568da3f2e99ba727afa448a159f66ce680fcb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (826, '{"ob": ["15151515f6ee4479892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c72737b5b144b1a9cfb113225742bbcaea83c93e77471d227d9df65d406912967217ebcd3ce34b7dfa47bf6c46bb3662a03c39289e690f19f99d3d3f4bfad3f459b457257bba50adb355bfc81abd81371356208016eb27742bd0facbc3204ea98167ac0fde8f74c6e1cad1b845488c62875100095fa6eba5cfa18f4cbc343d8f541af89cf902ae34578f44e0fece4a13e6a5cf353980764d75512bffed9ceb535ffe00358deb5b9fd20409e948daa9a0cf2d779e1a6709f57c7688eb975cb95a65f4d5196c4e97a63c0ed400a1b00e59348715d27258ca87844317efeab46570eed688d071aaeb05efbebffb92f77518042e18378b7352ef00af856b105888147638cb5392d447cff62edebeba90b8dea5644953374848c5a636757b8db743e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (827, '{"ob": ["15151515f6ee4496892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358501638a701d4109f52c73d8689dc241f5a106a7a009d4bb87e906efc4bd4ecd3f93efa7567d4af94722c53fca90bc78b7840f3cd8eaa443f19d28f1c553434c422bcb0b180f78259f2560963f95aa4eb4234a1f401913ec6e28316fd4ad5a69ff2d68f2f07d39e2a6552d369a7ead6da6e740f9e8ada87461185be6af86e296544cbcef6606acd728b4c66b4b742d76d0dc63b391f105192d819843b1ac5e3d22c911f5fe4d6cea890d407a202a29486379485da82b5400aac60740de384d6dd69f49eed781d5e4e7672693ca55da845724b38a04b53bf1213daac8239e86eedfa8111d6a214cbfa72d398e52162263a43da4bf74dac88550407c90fe8291cbe5a7dab127bc2fd85a166cfc02e881dc673f9ab4738014e662e302acc086e6c69"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (828, '{"ob": ["15151515f6ee4418892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586cf25349653983faba483e2e7806d295cee794a5580903b7446676cc24b9d98ababf04276aa8156da96386161e1ab50c0afc96c5f72e58fbadd9003b312cfc5c203bda5404eadc414682b90debe35019563e298c65fafefac19049d2031605369eec77465edbc2448d4cc06b8f8091314cb774d233ed0945d779053ec0c02075b06736bf386d4b50e80d637050f6b03b4ba9a0decaf4a676ea2a69dfccdd241d56824a9c30f81f9dc5431f7d5f475d7e6463dfbd7f0846c310034d1cd2b2e5ac36cef8615fd9c20e975e0354aca8148fa5b8121569417ac954fde2c0fc24978d96e04a0d274135fb6b416f0a2ffd734817ca1d112f357ac854c7cd7f5f92bcef054e424bdc1fae15594ad33b6444c60b7ba9cf9988699570ec2438334e657988"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (829, '{"ob": ["15151515f6ee4427892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f52805285bdc28fb9ebde023cf7db1a0f6b709b8f5b188d2324ca4426f33a62a3da2182beec80401bea9a985adbec505c2dba49d568624d67058c064080f43c0b5982f0a51f8eba017fd6600589bb849397ca99922194bf5ad1ea7b684cf23d77da1460ffa601bfa4e933e36e3c0077b624813895a6a34b20e6239f4d4ef6044f355c7543b2d3ff365222910b41d5d6fd84d086799c949dd95246d5bfec96f28a03e8f295c8a4f13935ed62f2d9ad3c5ad3f50c01added467a9375edb5e10d2063d34836341aa4c7307ec2df7a3256acb7fc009dcac911a9c16c37ed005a2b5c44f1fc9020f4a7a49cf890c7e7a78f3f9bf43d4852bed6c6e0ceb6782d49ce08853bfc5a9309186dbf09d60a58f2ef55d5fa4d7b499b3820f87cfe4720dc7b3b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (830, '{"ob": ["15151515f6ee440a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b6e09ca737fbcd2a6a98373228ffdea96a2e8f7800d273fa381d4ad18053cbe73c954e2fbc03e0f2f19b26d8aedc0b6974272daf27d1c5f74f43d6f25bb7f8ef93aa6b9dded500ca215a6d7907378662b3b4a56ca2c1a8732dc46bd2cfbd119059cdeeeeb1935ab5e620026f1adc0a099750aa0573a3c2d37bb144c29567ae6fda6751f9364b904a652b3e30f358fd9be6e9c04c80e4d44883da57ee0c3d31741f9e7b45c7808ff25cb32e413f163d7dbb520435b40a8aefaa096e02ac96c1bbf6cdefed9e0174bdd30bfd3a55e2ec242ec2a5081639461c73aa4fa5774242fe5acd97a97f037d271e35a85636000e7a419985194c7b5ca3d099f1484f0471ae8fdc11a35b5aea6d8a8fd37cb5b60a72161b5aa69f887b2355c64017b79a5c4a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (831, '{"ob": ["15151515f6ee4472892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358764d3ed95052e9fee25125d848f9979bfab0ed8e340ed4dda7603e084881d416935afd5dc7c571b8e1b99a3680fe8400c126f39cd54f324269c1c013378b1176eedb2e5b542e141cc204cd192e46ac278b4d87f5269b7a167b53c91dca8ee6ed7b18d18a8ae1f3f8d2e3ac8b1615e6b77a137907eb6e336d838697e812e068204c9c70cf8e5c7f4907857921f5fd4896a50f80b11995499b330034dd2baf48e2751daf9c72d70045c6ed1c835adfcf6eda0c3cfb79acf84387a54128f251c0ac650ae8e3fecd9d4226a64e03346504ef25f910d9d532a9a99c19edce1fdd357944397988f9261933b53b6b608ed3ddbb8e59692893c7e83428652ac4ab62890b7948191582b6a1e8c42d50b3f5e0b99ae9b7df8f645dc99854150ab52cdbadba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (832, '{"ob": ["15151515f6ee4464892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135834acc813470cb465ec2742478360c20f49bba0bd4801fd1a37cb5ad23306f3e0ffb6498fb3e190f9cd286948149c50a048c2c9e22291c9980c57211ef01bf943fc5ed07d1c9977bdf4faf6c4111e8b57f579c09b6bfcbcf6d5e2bfd0af25f867df7a945b58bd54e8e5d27c5377230564fdbf663cdbed2ed51ee2180fcb9efcde0f6e125243ce6f8b841719bfb48d0638f41d7b753c5b2eb7952b0489618c597c034fe108c45c1dae6cbb1c844904f6d7c6c9ef09245f6f3a25e0282c5ccabfec1dccbae52ec6cb41677e1e022cc3a26b10caffbb0b56411a9bf331c091a6ae19abaf69479bf10f073e2962904143f168c7699f1e92a6cee2a2e5b167d122e83a45f4e709a997caa708e9c2807b809d49bd68a8ac0ca186e23a2e6c671dc525ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (833, '{"ob": ["15151515f6ee4441892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358916becc6ba92fe5777c2251b73392f790b8ca906d190342029b96aa79edaca14207595e3752a4fb91fb5633944231d12274945b9af34236e7c6318d239699a2451cc1fc40e73b2686f635d79f5007e1e8613bad4c28d45344da7c9cec988ef0f759545a4609fb6f69bdd79315b6a34f843a048c815868e7aaba946d680a72a4accfae4c92e8b9e0d4c15aa372433c2fcdfbfdfb5add67f025179e867769d62f00916961fd3fcd8326845981f3e8eb39655038561ae34149f399e128124713f3c4599cbc7331f0c4c77405686ff18e97518a13eec8a22d23642c8cbe751bab9ca7ae8b5144fabe5fcafe2fa62f9673e70887e37483bbbe918128253d956b2dc75590ecd924153c0a6c26fb257a032c279f8bc7e5bf16c8c502e03bed1f475aa77"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (834, '{"ob": ["15151515f6ee44e5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588a72d15727e75bcb3f87a90e7e1e90e6c326b38c7caa21bd154d6d74e2aafc3a4d0ea0ba1a5f9a667d1ed65cdde445a58e1960d532ddbb7c882ae8e3c20e1b7a4dd753ca36571c18ef69a9b3a8e490ed761df25117dd6cb887b7083fba20b54f8264674a50d06911800bf34f14da7441aca6bc0b00d8a2fe3357dd41e707b7cbee619a43024673ed0bff774bca474a3c338d4f4fe0acad1929a22a0ba65eee31202b4a9f07953bf8be60be879c2a2fb37c4c3ce5b0ea21f1ba4b4717bd5d2fea85d9b5eb5115979ac6a7f39dcd5d1e2628f621fa1dba799f1d3ff7fc140635e8d019ce0d176c175ef30a2025536592e5edcc6546ce3df8d14e823a41e18fbfa63c1342cd0a4911ed3e9ac36ef59b1a9470c4e80d4a6d5ecd6ffab20973e2475a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (835, '{"ob": ["15151515f6ee4403892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358bf5f7f7b429a586528c6a9422e117028128342fb6702c334ec6b33cec6f41ab31a012b26dcf18ca9a98ccdbb1dc9440d13f9eadcba047933c92d03d412a488e5909ba1c55591c56dd872971c0293a3f3d7546242852ffe0659329c5284880aa74b5092fe60537e25c2368428151e3e6e8dd0f9cfc9af18862105f92fc9925d4546d624cc3eb7cceef7b8fccf9c86d80379987661685839bb38224962ac182411f6430f8e1834588b7972dee846e06c9ea44d570fd0606c2f8477dda4d31548f09f40d516647ccba9e25fa05a552b11cbe055c28900391505456df08404e8ddaecd6a0d5ccae11eecd9d7a98e11c11b660690e0f5fb2f592841bf78aac68a54f03a8b8a67cc4db77b5ddde9369b107d90695a85d54381759a82fb8adac1395e66"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (836, '{"ob": ["15151515f6ee4452892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e2ce6e27755b422b0a5708379ba23da40e2e6edcf5dc4dbc3cdabc23a59bb67bd36f633a61f68772296de55286f33f9fc176fce807fe522ff0de4b303228c64009f1338ebf726b372684abf335a8a437b16ba19cfba86039c7c9238f34c83fdc30448569cdba6189b15eb868bb97cafdeea75b91ff05ebbbfe646a1df6ecc9fecc55dbf7b3d94c596e946d5f2279cc37b3d14374ee0eccaf970eb9de13bd1f763f5a867acd981b14f1ea58fe97d7828fd614e86d471bc3775308fc6e846d4789c778c8185596fd816cf05b43a1bb1d13373e10d55d6622278fc179cd1216161d2170346c0c8a370f53a1017a55625c8508f00b5fc9fd595594c178ef07c6421d3dc625d5a7e63980813f34385ce20fdb4d3c012d32f6ea96d21d86d1f0c2c3ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (837, '{"ob": ["15151515f6ee44e2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135876c0e2145601a2627a3126b3415fe2793f33be93beeef87b68f5cd8c531ec5e00aef5008936e3829be4444ec33514b1a0dde82856c62b12117d57c117ff8323002b131d0af931c6df848c52ecefed7f4e0fef94d705dbe623c61e29c1f3d11ec79ee2b094203029d5da537e090921b1891b09b84a93e050af3843b2c19a65cd8f8cf349c315b814d1d34f78798c4c114b125f49b7498fb071b54da00ca9fe512b568883c4d636a5c5c25253f09cc2ed55567057f76fa97e8f2fb02a85bf71fa59ecb00f47eff45b7b8d337c4c884e9af544bb8c3632191db15b3a825a6c40a70398a82b700b9e56127eb4125354e22772dfd33480bbbbb8507a4d3eb377b6efe40e44c6f5a9ff427e2dbd299382b18fd1f1827507a8eff899fa7200606561a05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (838, '{"ob": ["15151515f6ee44a1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f79af12d8420c227ad2c17abe6377b59257bf40d2e3da7e34e83bf40cd3b4c26ced03b9d117f9e066827ed399ad250859f43fa51f8db7e561c94794879147fbfb1411ab12bd1dbb8d0b2a53054c295564da56d2f03511063b6e480aac010035b0168affde7f206b0599fbadbd049f2efc0337895605a8ec867c060040749800d5887a85c5699a03b68470d8e1f1f96dd72569de7cc5a723f6affad67df75604dfea670e3e8fa3674151586faf36978a3015535391257c41b7cc190636370dd90751482f370a24ed619c3b1c4101006d7e5eb5508a843e214819211e25ecf2a0280df661db5344590ebfab6d55cf34f0bac61af3f54b28845edcd1001330ff1503a5276f7f4b19161068f064af1f44a1550b6e2e58a89d112f57e4ab716c5f9b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (839, '{"ob": ["15151515f6ee44a3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d91a2c4b9b7a9e09b6fac9bd253c4d860b9758d7b148621b2ace4500924bd99da7cc96af112a49f171b1b24b1adf7b6dff5f7bd2a432e92eed488eb1c4ee0682d1d26da859cad3d205d5c16c0a0c2a7d79fdc41cae79098b504de0d9fd300bfd368bac6c07a13597635c773e690bdd94ec8a68f5b90c1b63b06cc65b8eb6986fd7be51c2670e58afcb50791e545b1249a8ea2d440eb80bfc1ff1da137a1e3a3475fea720dc6f8418c984d33ca1fc17dddd7c6e72917078a4308b931d335b94db6e9372d2645d25c5f5ad76981e0f901a0a2787e7fa962491a6bcee614dd4fe15492459e878ccc669113485a760d636fd79b0fe448b981256a8f7a07288c4f74968824bc24478c0f9df5621688b0870c2ec69145e82ce0d0c572780461b03f41e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (840, '{"ob": ["15151515f6ee4474892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358129d1df49f44722e586e7be420e20f3ec151bda07d23151387435f655d0f1356a7cafd75fa6cecdb4a1e67e3ed0f1ac7eaacf3ed4cfe58b6b62f028340adebdfd294e83638fbcbb9cabd59e1d1afa57148379bbbecd75b804830044dad6640a0c0a58ecbd4e6e56d1c3715db9a999c6e2df27368938efabde750afffc940ce06c8e89af619e13704d6c68461b92c0aa3df663a9502aa8977f218a69efffe99f58c11bd704830e32742df300309137ed89355639f9a619d574a619d967e6af82040acb22cc4bac2896b02b286030f344187a7cbd43cbc05e80010fe07cada61204e5128d31de5cf4784287b1a132f534968a6a72654c8b7716f483a4d5d8fa9c5697316281ec747885af137f94200a00a497125c52810537c785e4ca158ae7019"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (841, '{"ob": ["15151515f6ee442a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d1ad5c15b7d75500afe6cd1e984fe24915c2a9532f9336f137da63bf7f8aa7238ed5d9f2d0cc1734d423fd6e3cb105cf973976c71234c2872ffd0fe49294e39cebfb36605c77479c7a6f4e5aa8f58d3ddcf5ca3c8377d8b5c893f2b9f783067d8e1a91642a469de71864a9523c0f13abbd7dc4f588fa4cd469e267acaa4a1598bfeffec720044cf3abb473d215f923510be1fcafc27ea01640a2d06e8ab5a89ddb47583856b8ffc78610291731013c827ed505aefd2163f34e488592b67c6ffab91b7714c3356a1a3fbee67d9bb356dbd33c454e1c3733553fd9b85813cd82608d8f74a3f97f41826615023d303c8b1ac3ca3fdca21720862f33659cf69340ccd6ce19f02a0db198f13468d4418f1af6c786784b0437315b1a061ab567509308"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (842, '{"ob": ["15151515f6ee44cc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b536231f668159bd0025657f8d4b74fcf60778cc531dbb76ab40e05a675316ee03c6acded4e46c480d987c7a5fa3942369b95d134480867754a58b607fbb31023c362cc79f3488eb3d459c3b67e6f85332ad24f2ab2f19393fc815fbdfc3060fec5f62c978a1ed41a655c89eb943963a3079cbfc95c9060bfff87ac24a7b3018a66312f9c8ca625cd3047de1b60740540e58f70035fd2981a1da8d872fc22f940a767626a9863486192ce7a2e5bb160fc0986f2253e9716bb32a455d173b403bc9de475af7b2b0edccf799bb4bd4e2bae468491d7055a6218fe9b590a0576234712d8f0d1229570babdcea443cb6d5c834329ef8d858262fc877d3ee0952c92c71862fe4962b3da9a48469ca915e9436c9b7e78f1029b2587504c6d96cc7eacb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (843, '{"ob": ["15151515f6ee44fb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358374e80065150464cc74901f6ba9f00c8e06ca9a6fd25d553dd49ba369193c8af4e568d6eb85942e341d75dcb1213f025e0d29c2f626182077c244951fa48f78ff5c7861b259778b5c0688a469ca46e364b468d5a5cbc0e59603babad71604f457cde59bbea085fb1f9182882731d69a1dd380211a50f03fbdbd9c08f92331a17abf3f1644136854bba535fe406dea4d9aa9c5050e8679cce772324b4023eb7cd7263b64898a65145f75a767a0a4430813737180124e7a96b7b745c418bbc36cfc8cee2ff1d82a365ad62941312bd18e94da938bb57f8fe627069352859687b38b9a1e5ec03fc23814d2e86922b14dff7a2889b2fc351a0f913908412842b29ed6528b268f4228b62d4f238038ea6a77345b3b144172d6ff12f78ecb3074ff069"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (844, '{"ob": ["15151515f6ee446a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585a1f714b7b9fae03452e54193ef11735c24f3ab803e63701f949eefb0f30619fc680bb853ceb516e65c90c4f09a141890c824da116bb49abc4dc07afa088075f5ef8c5fcd366b1a1385216bd8328059f2eafb165f6e629be82b314b368dedd111f3391cf6c085e3597f2450719d694ddc397fb4f9a34070c3ade0337590c3ed1224a9e33d6fa8e4ab5d4701614963b2707bceb53f2654b97156e867803f669d7f256fb814687268b4c33a3fc73545e657680ab7c2e4cc724836f07fe925acffb7c2d73859fdf092eeb0da67485a897464a9fe353524b84373e2e381e52e682def8bb169aef735e191ece8a95875032485a76d01772ded4f8e1d77ab3c06118857e678d81cb66987a9bbaaa784eefe6eef9a3a3bb567f12ff8be14af7465e3f6a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (845, '{"ob": ["15151515f6ee444f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f84bbfdaba7f595a92264a4f76d18e18d7f675b545d0ef6972a74636e3ed1c9943ce49fd9eb22a594df50d27032d0ffa77ca485d4b575f760be30f2400942f7b313c7664171f9ce466468526fcb8a38584f939d7eb2223483d55a9bdeab727e69efd305ecb09bdd38d71a8f020e792d936f0f48501dcf51d1b486dfedbc5f5ee6dc573c4cc5e0c5debdff0eef3dfe16c4523ed7f6aaad6be0246cee47b0782c1c61bcf2686d8bf01805f26011fca4d8cea7451c78e8af32fb3451fc837ccfe45d6bee9716c104e3b3063ebb674b041dfeefc63cc564c5a567c6b76ca11b78097955e43d945670dc975c9657243c1fd741923ecfc7e5f181f1a81326214f792849637a485f014e9f034c04c169a79d6ae1493b64a7aaa0989372072053860d86"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (846, '{"ob": ["15151515f6ee44cb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580a112b040611a4ac3f65509dd3d24eefd49a0425ceca66966979c346c9f3ffdb2e22af5e7678bfa008f0e8c06e855d5474de5a8e3b26ffa59f1f57bdce7186ccd27157e5ff5fe5ca0ef52bf4a132fbae97bdc0fb0f3d04c16112d41cb1b571494fb7b6d02c1d1bccd90c8ac35776cfa79c2a1d50db18c24853cca5204fc9dc29f7df4518e12d93d0d27b5c8b6defd413c5c005b6b0112394689332558cb65cca8623e8d5180b20a3d245bef5344a5077533971c6866dcfd4b02d51d47c0157390b13d8a86727a07ff7f53e69bcdf1147505568726fa64b32280fb70a06d5dcb538e630e85023e1980ef6fc3e52c40633a2aa758c15b0945154f6bad00412890f643ef1df456edd6e0613634fb69e06ba5161cd966398397a8ea4433b4e6459cf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (847, '{"ob": ["15151515f6ee446b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b20873956074b2ca1ca248a5bb791b085691eb701a142e032c7286612f7ff94ac5968b9ac82f81289eacb66e146c64ae3239850905b5cc07df82b0cc70f0bfdb4d44c1a34ebbba7096d47e67c39e2383f12d8ae36f2e933c5f08a89c448c30ca2aad0970eb7218799ad004b1422cecb4ead6a415911685b5b32ce548125a7d0875661a0d86528ff7b7e4b2af8c6f29679310fb659cc4745d7b06f71a6f6c22349c3b8591d992cc0a95696b08764064b288c614d468bd3a37963e6b167aa1562d977b02c8d57a5628681c1564af494d63ed83d4c8c7a397be9784ca25ac7e7c1fae7a6e4797cc16775789b50a62c3dcfd41f2435b46276b43d04c15547a6e7df2798e7aa07fa0cddd576d86250e093511f902c43e5ab1af8cbca14a1dee01d44b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (848, '{"ob": ["15151515f6ee448d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135864e28b1113df2bda36af8cf8da8b8100867110e3dd73d654d1aa849b898f8fb1b75ad56a63d266a01e5941e98ad6d2fe827313686d3457f91a6306e20b3dbc9428104b01879feeffbc5f8cd583c7c703ecf0da478762c1b831248959b43fd7e233b7dc4f8fb5afb86113aaa3f70cfac1645b6b333503029073be4b1568ec7f217471ada3afaf8fb92fe5b285595b81a5c18afd8b399ec291f2213f43395d097ef9150e7195b6f74ca5c3592432860e5a9782043b04eb3f9a1abaf9e1bc3d11b27fd966ea616b27ed7873d9411d155000611a0b0f8b7d4b442ff0ab8fe52e99a12f9a8a3135b6b085764d070767dfd7f5b3c8736b216ae9197f82ad7e55d04fc2b2f6d1c5c2c37a672a0ab98b97915b5f8a8ce812a42033c2ed414a8e19db104a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (849, '{"ob": ["15151515f6ee4410892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358967132720c4e8c69e385708c4e9a2e809be4ab48e79183656b5dc04e8630425ca368abe7173385daeca71365cfafa4ab1d9a10369d36c3b0de753849a11d980a192b7d4ceb3be870ba3be338ae0815e1254b2f288a4c66794d0cf55cc9015b3202b320e650ae03ca5a0c2274fa741e4c1d1a2ef9f876b46af8d1fd096848e71fc10e7d780da58cb01605ddaacefc0202a910bf3ff70c362dc64827fae6795b8376546876ad80e75fa3691d01377974cefe6f2128257bac5b3ffcd1a88cf07ea338d49120283cb61f35177b1d7c651882c7feb9f19b9dd4d65dcb81d2be49ef12fae042291e72a745e0d93241d5abec361bad815504742ae8c4ab672f2681dbd02e3ac85f70ec2f0fb98a9efdd2a3b878193bcb0a10e536351e8398c48284f5b1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (850, '{"ob": ["15151515f6ee444d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135892a0c4e5874246b5ebe768dfcacb946fc6921f8b8bf9cf6285a9d030b9771d9b7b8bd8a9cdc0739beecb706c08519a8dfba3611e84cbc88a505ff0b13766726084aa6ef6214189c8202e8da1a9fbb4d365657ab20ca6110b665e67a71aaefb2691573b25ce6da9fb1db9bb363e63275db626b00b42a4120e2514c1fbb1f4f930f91d9861145363e43a84cfca3c7d116e502f17923b9eb12cc158026bdc0f9d5841da31730f7c06039fb61bda20871f7bf8788ec21943b852e5968b9628803371f0ffc446cb18a091b69e1343dbc04906747e07c66520c8d58567ca9151490237333e0734cdb5baefd105b092b4d31b17139b266e09b47810fbc51fa911b6ac7ced102e1b20fc7876090457d23e4bc9f92f96049dc676af3ab03739a15b809584"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (851, '{"ob": ["15151515f6ee449e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f4d4c0d5c4f5945ff597913ccc755ebd2a62bffa3beadbd78550a764192f62f2de5ef905c15ab208467ed11359da22aef2e8abcacbb5d1447178d4c4efc89739f40f4834f0c3e9fed5f271a54c85abe545b956cbcab0bd2216c2f63028a67d975ff49841f038d26fbc7282f4d0cdf1bc25b9bf0c7eb45d550753814cf68bc4fe5a26a831706c8d2e496f0bdc5230836f84fbe5192c39c1096a83aed9172be89d8102eb6daf528c483ffe2b9dbe06b060604a13f1ac59a8110e9f6a2178ea2c499d46d65c457221b780b6dd8c440df09382163c9179734fff92bdcbfb6fdc6a3b0763104a95e4714e67da5e85fbdf1bf0d255dcea5f90aa1b50e58aad767c816b07b4a1dd9b4afc6b1277f97d96ff05533de73af0769e37641078b9f32af92594"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (852, '{"ob": ["15151515f6ee44e3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fb7c35fe4522415a2d98f56fadbd0388f88e98c5328beacce4874567f1f72a97cc7c41b4ce3cde0fa5fedc508aba177dc0d0a9de8cf4db27ee0c13542ae1240ceb1e42310efde32aab0c78b4d855c82b5170b490c29ce77f01994a901035dbc63a3f8ca97ea24c01ab1a5dca364bbed48093e5d37ef13abfb47f193b966c5bacfe4afe0c45d69216fa004ce8c9de3967742598649a863eca6878385576656966783eec35e1f0a00568569ffaa636a7ae3126d74cbccb0d43c05c0f62bcb900c598c6dea7d3437ca0c286ca766c048cf4b786ce3a2a1b63fe792ff819f254b2385ab3e097d6d239e641a4ef28ea4a40efc1eb4324af72ae7c3e7a2c0eecd2d78daa302f7ebda51b686e45d1659389c42dab05ba6ee6dfb7f6371f9aa269905ddc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (853, '{"ob": ["15151515f6ee44a6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582ba69fc79692279e7a7908392246958a178f909cc3005386902f5b748b0d1ee93e0fc41a40a68bd0cda75cabb3de440a0635f815d60d387becd64ab32c90b3b2ff4000bf09881d6512d592d6c0e203f2b5f4d0d96995c4d0cbd7b231d0cbb70689dedfba781cc3954bf881435143594628d56304b5435006e90588311af9b1c84544c75ac1bb350bc59f8ba36d1e8cc75f4c7de8dc67828af250f08750389500b07f1e6f539049648dd33f30514c8760338393093e1aa17619281bd3cf312534a63e0aa90caaebb134c834dce302c83c727a37fc312c640c963f3002028d495022385f77cc313253486f0a53ba123003b9cdfc6cdc0993fac56a48e8bc43ce1db18bbfb9c4b84830371a41e123c34088f0300ef8e5eba2acb0bda6ee7c274383"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (854, '{"ob": ["15151515f6ee4486892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586aa16751a156628a3b85d9ab7680bc47dc8eb913965e63c2f47288b7aaa9438ba55c15b036b65191172738aad0adeea567620efbe66d7583da4278087bf913e2a250693c68f0d37bae286043b93161f5f4da12c75774d752ff302e2f73786c6992b1d0b7ea683b0364f49dff317175e9422884f8969df03b23ee1ca2fd493e166e75e4fa84c853f67f9ece4fcfad864faa60c49fd336008bea0f3eea98170dc5a3bc7646d9266814fadb6a0748de412510825fef743b9de035b85e9d4d2d0ebc90aaa7e55d776e26d7c1cae1048c5c18c1f037a0461eff94ce7e3fedb9e6fc9cc8426b9908f32475481139cd949f5b6ea8e76b81997685a3addd2732255f70b765c42232b6443ec9949e301700e807c00a7c56b8d95fde151acc89095740a045"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (855, '{"ob": ["15151515f6ee4498892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587db1987c7aed5055591d61b3396a8fc357178dace5251c4122643ea564a8e6fa851e860790a555bd51fcda27f839b5a2cb1fe73794e09f07a916442b2a152f8db64f3a97ce4d2fc7e89ec2b251a95d34af0a4d27cd79932b3391008ee4b32d44ea3ec51da59cc0894cadc5ba657cf911fb038aff47b00df0c1568df6064eb8ba2fec1f2c0868b5b344fed1d6c8cb2354e82535c5340667a768bbe36e80e4842afeaec8c2b99fa00918e60aaf6a3105b109296f5de1124ce55d328ff52382c9070dbbfd70face84d0f58d8da33a4fb3dec4807f2344f2be250aa6603f176e1666a9f0721644f6a55b86acc61b277dd4bd2df13e3a6d9add7e12c9a07605d267b3dc602d960bddc22dbd6bf92053cb9891ad82bbfa0a7eb843cfa9551b7a094a32"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (856, '{"ob": ["15151515f6ee4480892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358274fb92e7fde440ef11136b4b89f91a30fe648a787f64b7d9bf10127ce7123f132e93d764a72bbabaa1b7005ed840f3b929b43e5286d498b344b91c48e6b75be4cb3b65b359415fb5be1406c8a7dbc8fe3e5c69c5584fa71e1fc9370c19f664b956beb08dbd5139b8ece72417507651de8ab01b9b2008528a9cc35e6c154b542b93066e43342d515b2b545339ea79e91c5b7be4950368fb51a8fed8354ecf168d997bc6bcf98dee3697ec57fd4e5f0a499d0a67ab4f8dede0f570f065f1e538dc9f07b9ef73751e60a91bb3e6af2ce6419241af4d308a53fb1e0753694f9144f375b239808b5335f3b9a9f0d1525934fa74ffa1f8218af939717348731e781d1de395265ffa51b6cc890ca054d4dc189758d829c649d3574b7d0c5c002fcfd34"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (857, '{"ob": ["15151515f6ee4495892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580ec145ed63bd59fbcafe813b54605c553630bc4626a51b80289fee175203d212f5f875064b48e0de6226bcf23872ee419adf8a85b549a738ff0b2490fa46a3a027e962bd61f02113fd56e2ea7257e9f9b6eb3189b42deb4c9d11c4113d91112e057cbd420b035aac43c7243bcd9496155d99157dbc4976f5794f6807ce644e6d6b21b3a9a39818c92bda9574be2fc3d7b5bd016db0c21637892f2cda59e94ac17956f711a346611ea68bf8327fe8b923ebcff833f82310d1a5cc10c64b07ad4802a8feda58f8f29de072377daef8f22664ef94719eb86423345f1ac0f58d681f582aad5fefc0ceb3ebb9044c63ffd2561f49c6efc9481599aab363857f2c1f4e31fb6106767f3ee645c7dfcfa47f167986b61cf6f92785cf9f75900b9fa3601f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (858, '{"ob": ["15151515f6ee44c7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135815a64c0e898158eb3e09dbc6e8a88122fbde2e38c599d15a1e6a44dd9f74ba42a5ed8acd4a2ade50b12298717e449571932fa2f1632646f24c561b5c7ecb9f40203ad4de8adf28f7c203eadc69be827379da43d87be65ea9f7a8ba8e94dddaba6acc670e364762307870c064eae5dbc9c55c0d183ddcfd076c17fa372c1a29b33627bbfb9fea5f88692203738c5084475598298a657cfc375d3c1b9a54b69830bfece3470048aed1d4b07b6295f6e21593462d72c6f1582b70cff6e0e3724a54c7155fbe5fd0c5b1e0e6b3b36c21066f997c0309f382fa7822ecef8e1b3c975df0a859e12bec2197001a365311ab07421e507ae51f0024a7e425ba8f7cfdef0e659d3074777adb33c6c5ec6c2372657e6195f0afb2dddbac5d9945cdb435323a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (859, '{"ob": ["15151515f6ee44f3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fa26f1df1bc80cae5cc902aedd4a4cb34dac6afadfc53e894d39e085c9e0f0eb9df9289c3cf824a9baf675278248f889cb5dfc528e364618c77deb94ef9dbc80c4798dbc788fceb0ba64c631120f80cefef3e3701f289c2199988b57a8aaa8c46cd35380a12bd5da97bd551495ca0e9ebfa36ea3221259ec437143f05c6f632e33f66acbeec05fce7639206bac90c29df0810e0f53e0b8f1a318912c98c54e09995e2782292a09bcc3d9cddfc7578bcfdee2f5dbe92ccf8a24ad7deccfc7166a3522b47fc11d48a3c2d581cc647363e29fa6d88cafcf39ba08c61329d9547592792f794fd182967ed81ccd00295133a17e76a3cc52961d6d14b26ee291a688b78b4731de45cad1ccec1d44aa08e8a4aadebc6979828596c210105f82e27f7628"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (860, '{"ob": ["15151515f6ee44dc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135898988b6bc5b7b2dba63a388220529d7ca767a749b6f0f5a03859c1e629da3aa01e0f2691dee008f54ebbaf5639575b5e9ffd49b984882885ce06776fc9d393d248a990c6431a42a591408ca752991eb565a0b36cd20865068a5ea9950fb602b8af7db5b09f9d5edfb0f22a925ef6fd4c251d2b489207bee3313065c30abc6efa5c7f923bc29338136ae36d04db0e8df8a16ddb63fb5f0f21e135ebf2a981f13d23b1332303ba3ccb21a82b158a9469e032da1ee9d6f82c9fd270fb26b4d4f4628b5cead40e3ad3e7c4751f754447254c84c8d3ac9fca27bddb7b35aadd4eb2617caf68af73868f031b73861212a9032344fa208f734cec8fbdc77c18953d9a550161c4c8c5b85e0a0e0b9692acbd5bb59408cbdb680b6f3b47277c0a702095cd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (861, '{"ob": ["15151515f6ee447c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a97a35e9b154de25b6dfebc410061518f7646d618379b61107f771e3bd12276691ecf19898830ff3ca4501d519e1dc8ec866ca9288b0aa6eda1c454345807f753f584f82155605dd97218d72ebd7a8f257d4641abda28c459586d06f093e442c96436e24fad0be337c7462b3749e5135c64d0785282a87b0a7ef832b779d396eabf9a6d60d3d01a9f52f325f7004ac659d894558f98f4ed2bc2b1cbf1686f748dc63f3b8e1e6f04e2ef58e3d0b96fad126f5b5586caa3da2f3a4f02ff779339eafa2e7b0b052026f911be5f802d15dde0a59ec7f150f87f88c9c0e8d93e1a7f7a7ff26f0c19e876ac931423a2e9c9f1f9aecbf08f07c5a70b240662e0d339bed29ef64c096da4db2331f7ba84a7293d9a1001f94259ae7af5255cbb8f4825ea0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (862, '{"ob": ["15151515f6ee4419892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358916ffc6222854ce9e09b1eb39b83961fc67b9debc2982f360c65bcd8a77de514cbd4ab78ef547229a95fb7c51b0ba77ec9163d7f72891a4710f0486cb27d171e2707d452b9a93ce63b528e735cc4c36c0bb41d76265d8fa79edfe1f81ba92b542f6b8ff4503be6cd193230222e18f6792a7ef21bcd84babc428c20af72b36e163cae8b65ce833d509b049d23c8682641373ec852f8288e1c33de5c704621c67b5f86f0f4c7554bc54bcb16a81df4ca0b6112e0cb7743ae3261d4efe6ab5f4d3d3ec19cbece21009f4b50dbeefeb6efa7136f36b0db4332f5cbdd7e424cc57dd467afa8d459a80b394befab7d80cc5de705978429b4b2769c136bc4914bf7aad9885e334b6ddc92a6383946659903d199c9237282570169723841be1a056462af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (863, '{"ob": ["15151515f6ee4485892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580585fc75c0f6b5526c43a96ec81409db9af7c6f1e103653915166d1c62340245e4bcde0d05ef36e815030e460fe1a817ee31da0e34fe899f3060c1bd2d22b1a5c59cbecfe373518d924f2c3a8ecb5d29fc1617aa97656355195a2745317926166e6edbb88a76c0c1bad82c9eb4d1e421d6a3a7dc6a752d054421ede7c51cc5b44ebf50985481ee8b0f1d5509098b11df5da503d8ea6c89672eb5acfd8bcb05541e3f8afa43068d2620a344bbe10408c85db0e79ca16c5518eeddd01fcc5f79b2c11f4b91077b87d5d966274e6619c12ec723dcd5a6dcd807d4a3a9e970546c162134848183a56dad7e73e2e0a464fb801ced898893bab5d22903c35b0278333a044915f13fb6112b1344cef51be21513cabe558458dd722476f4d49c2b27d9f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (864, '{"ob": ["15151515f6ee44b9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fc2acd32ba44758af65efe146711de63ad6f625085b1bf2391511a558112167dce04a6207b49f1412a4eef16c642799ad117aac26cfceeafd3f82ac623a144cb9ae543cb1fe8511602ef88d84a899c0a3c5944a319cc6bbd8466655e8302cedfbc956ac38958ac76ffadfc0a1b296de5d81be76e560885f065d09bacc4d23f11c6440a317dc411aa4f5aa52884ded2e8829831128da7188b00eee40ba7b3a40ad5a2eeb5ee6e78d9c8aafd4e1f439a406b8271171b35507852b26eda7fcddae16b16359811ff0c01803ca25470138ab4da2fff74e1bcc73c1fd787757f9f651332174e67dd18f6bcbe0db41bd97d61782e15d60b63f73b2efa3cf4d1a1af401f0041b5805c935f4d67175200aaaffb01dc320a7cd2a268fb92def897720422ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (865, '{"ob": ["15151515f6ee4400892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b5aa6a9a0d48783be7d43bfcfadf4df8f772a1889fc0b094fe0fd9254c1159833b162688b658efc2db7cd9ae2072af22daf007ab7141b66b5b422a7ae96199a906cea6aa60361f3e20698610613140089bf15fff8e684b5d0f803396c1a049954fbf34b0b9dd38f1308c0e66bc3ac3bc0a36b87e088f77e18f46252f2a10712f392670294b81240ca828c8d72b41ad1c0d46d76a8f75ef9d9d208363eba3c0593d0da84b5fa481abe3a5ebd29aba3592aca0a55e43f7edc3623f6c23cf82f2829541c93594ace6496469dce0df61df27268139f5d95f972d3e14037d26787f72e63d5a6c3bd20f17832a20f540f767f39abdddddff53fc027bdf7e4060a29eee8550accb61dbc76f29b6f52cc627b74c71378b2cec2b61f9820ef5901cbcdecb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (866, '{"ob": ["15151515f6ee4456892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358bcdcdedd69e6dfb82b117515dce68bcf3ade1ef25a0eda431965de69e62fa0169d23088ff9a719becc2ea3053622aa4bf44a97345e2c6983f2c7339d9cc40ed715c6977629dfef699595bd7ac67e0446f951d5a366f5d44e0d0c62a328d12f597b2efff2d4973a0b2b4af540fd4fad2780a210517cb363068b32406e6150cf26d57383fa58eaf262274c4ab280b0fe2f8ae547db705ac02cb377a356717cea15a48abadf963c7c8fc64323ac5cc911684e267711bcdc2478c65031dfb609f00f933d32ea5b15228ea9f05e9573cd7e76aaeff271a080e2c123c0b201ffad18f5e99c3335f7027b12ead5d0d4e236afa12f0f66bb38c9578e75703d5234645ae8c9b0fa41f1f0d953cf5140903943dd1bda2a768fbc895af700775c2f1ebf2762"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (867, '{"ob": ["15151515f6ee44bc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b88bf644c33d822ee1e2ab79ba40adf5b1d75b4daffcd33bd31d7ab45b1b73ece47a828061cbfed627acf431e1b628b71d64dc5ea00d261530c4b81e31207c28450aee33f5f597f1df541533ae5e65c33ddf57a464c222351933177475c842faef0f7e999b722924b75dc3abb7aaac5901f15bf6c85e459edd90f69a6b577000fe7a45759745b842ecdcf5be9f72e496a9334ab07ddf81d6f32dc3783a6b831685e744cc273cf3d331d5b2d025040d7ed69fd29d662025a968bd41d3f20f07967f07d638d60fa7261a328027456bddc97f5d33d1b502748c56be78fe5f14c478a9a265284357ff08c1469acdb882134a9288315bb3fcb1785b2c1e8e83154e90c80e977a7972669ca0773b31c82b4de272a48227df4668be15f9dbc9652997e5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (868, '{"ob": ["15151515f6ee44d4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358cb64f1802e2d8ae84f631f9891508ba0f8b8c4f9f7f8247b15c205ae94c17cc99c1e2376398ea146f34e634998d3298e6999c5dd233393d571ef9402ed558715c58c818cf42e200144e58e05565361234bf2a48ca33f79917c2534041baf6b6c048ad4b27aeb13743d1d75ac08f0c6ad80a45d9f83431445feaf134d0213c21f358ac06b5f74496801a5b22bc1e683de16f01385d247f0daf44f8bf21db4179934e9486872859157166caf286675063fdead3aa45c1c236d0d155c39a74ee14ca160ad0b1e7a071f9401ad683767d785a2d35ab5e046f59ec450e34f274230ed8ce480fff589c2fb12d60dc4e9659fb9caeabcb65a865d6b7a54550b6290d3c900aa99ee106a8ea99917c2c52070cdf52bbf38551e1914b11f6bf2d75889250d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (869, '{"ob": ["15151515f6ee443d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582eae78f69481667881af9ed382a7cbeb25dad9ffc54c659fc76919b6d6ef22f8ce347101e14c3ffd2c3518e6d3c89e07ed88f611d4e72ac2d905c83167aa87947b25ca9ea312c82d5fa981f9a62565ba17c055ad450346851015703b51253714544e92e9b84a79317f6b79cd18e521d08ee9a092c8f90c1e7d319046d5d1ed8ec41f63e136156bf76b161450fb0b71c641947a02c18caf7b8d32231706935f6fad44a469e81d923bd460a60c563698ce161a04dc39bdd25fe0559858be3b75b66c6689d64f1052f5349d8750e4167e123ee510e39f4213405a7f4cbed3e6f46229754e4a8b1e615f95fdc2adc941af6e8c296cf88a2ae2a961eeefb8085a25bdaff0b00f3daddf90ac76d39a5e243f002a6dc77589a136be29893d824737380c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (870, '{"ob": ["15151515f6ee4466892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586969c34558982f3e54387f66aa463cb931313edd1835648451a8ad4fa54de22821bccf225ac2490177cfba93b5047f4bcade6116eb25d0b54af5412603fd4898216114b0da70485df5e174515fe78b853aa9d352ae3c5f63d749ede1f70b6874fe08eb0f79bbf74fb091705ec4b3448f249813aa501a05c7c09b38c80bcacbdda0e753e341d5ed35e78db00280adc1c5e7ec634ec4a5bf6bb4b6820bd80146ca332d0aeca6c23000d174e4de9801fb7dce4200762306dc6895a563704f3eeb4983d843b12749c0ea9526dfc8bf0ff8a3f5911c5e90e9d71cb7be50330914803842ea154cd00588bc2dd1efe5ac99e6f0cf231355e5c0bc84e71afdec960897b8e10df819a8dcb4468bea9e8b2755fd7394d6e5ee44d7ceffe73ebf65328ae530"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (871, '{"ob": ["15151515f6ee4494892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135810b5ecf450d833c6c485b148d967a089f14b9e060bdf55c78e4ef72cac0a848d3770a350415c747dd38adac070fd42d4deaf53c800fdc19b069f1f9c5098a80b3286ed158cf6dfaef8ae9114832473004b1fe6c47555aaa62884e429e5a469527ad82e8dbab21827e5e0a69738993d4dfdb552d7e3bafc003bd81b4df221a6d008a109e3b9a38f5ca28e6a8f417da568a528e6263e03167ac7a6267423c06578421df0581afa4c8faf98502d117c4e93ea512165b6123dde74fa108d3bfc775e78a8d524cd73686b524648a26bf73e6e8f63a722080187f8500d00caed9b767905067683f0e344567310add52290159856d6f8a3cca1217ce35ba2d7efb721e96efba9ab4df83f1d2e144ba0ec2219e3dcecd28ec66a2132d9ee5b0007052ca7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (872, '{"ob": ["15151515f6ee4443892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f651b1c11719fdeb7e0c7ab162c33f7e9f9455f54a7cf89d13e5c831ae463276dec2ff1686e848d15588f3263fa0cfa761ee9f5d42bf2528f0227734f847875dd43265378209247fe5f1841df5d366a93966c26894b7d1b04d12962cb7c569368317f3783fb0504b94db27f013095523a451c0d90abfec229a90d9edda1feb65c6162499196b9b809d7f9497621762e40a1acc07dccec342b452825e5990c78161d3793af988db61a0ffd371c22c8949724bc28556ee33d66cfcddd35ef28b1c49a122d2eb785dfd04a72fe39b45d597567edff5ec31d5a3a28d36f869dc89738132ee23b6f04495dda3bb5e9ed88f4bd6c6cc5b7c8bdf49984ef70849f59402e06cdfa2ecf7ba8f1b82c7698312df1ef0305008cd8f2cf1a85a0bdab49e62ca"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (873, '{"ob": ["15151515f6ee448a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135871bc26a55f77c3f66d1f09f2e96b1a32dbdc2ff068ccc4ba24e9a6f950394df196229f545d9285e38ad278bbc72d078f1dd3ba882acae4e61aa80054ed827e4e1d7e21107effb39eb6c5c37917d76ecbd4e91db7977bcc125a091b27a4320c505e115916df144ca3b9a2284fd92778e53bcacb92fcc6428e9b80beb6918e92579a0745ac032d06ac3c10ff995750a047571a7db875438d991384b802128e71271b492b1f0549ef9571f6dcc71a2812a1ea7a4255bac8b4a9e1be4dd7659510ffddb62904b3b1ed2a6d8b24da8d7590001fbb7b33983fa8e71aa275723664e60f3dcd34cd0f75da02d69ef6db77fc349007ae901cf8c2fc70f22bbce6aa2652c912374a0f98ad8e242dc1c87f3f4437b2eac3007a30b694f8d3eaf51e5453de05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (874, '{"ob": ["15151515f6ee445c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c141b4ee51a9f56f96c31ba6cc857466651afdf2af95cd80763db4df881d8a65428360abf2c7bce58479e51b2db774a02d7ec32fd771dcaee49005c0896883ff4f324d54a8b787e1c8ddeebdd28600ef700a0ea2cd38a1f35f8b1ed2a51e047270e04391ff9aa716961c9bc3327a5a636345a18725bcb2d151b148cf5fda94152eb3e06f6aa8b8139c85ec58777800de4f43f5f8eeb2019066952b9ac96f290ea9b5b66faf0b4b63386c87ca6652ed5f5340e6e1b6e2f439a513dce5f6adb3230f90253ec45c3e335ef4f848c6131bedfce6a6ffabbd7bf6ec51839f90bd5632aca72f86cf6b451469005505040a130cb3dca583c5bb1922f1bdd4ef2261be84330d061e911eccff970a4986bd390e22b58a866a5ebcf1ef4eb30b0b617c83bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (875, '{"ob": ["15151515f6ee444c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583c7dc5a0f50916e6b1d1ff627e3915ecd881d806294b787ec945745d74d8992db95e1f8f5f4208d07c645b8c1253a745ac129fa0d32b1793216608f0d06b3f64236834567de60529012dd01605d29886e97c2bf8c22666a0e7069b453cbea5bdfdc7cfa512ad0efec2f1a8cdd9e5215dd42c7c7388aba5801e793e51eb94e2d39fa93ee81f5f9ee593f85390aff66711c14a16b35cd4416f60c4671fc51436a87847bca824a30e2b2ad070c3e8c3c51a998f771f735f082edc24bd9b927da132c38db130a2be89f7877812d645277d7bad8de91ffc0e86da2ed6c23461a8090e768264e194354e1a29218db28b28b30a67c9b41ade4dd353ff423d0b97cc332683829bce9fad90015013797504aa82204e4c91efe9d56a34af3eafb9c04f0dba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (876, '{"ob": ["15151515f6ee4455892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589eff9467143c3c659d668871954d18b6478423d9ce22c42a2fe182e5dd879f80f4409f00a6b963f20c9132a8c1dee08188a8bc02b19a181973d539c753b8f64226e0d85b56a7d69b77b38abef8216c389a0199ab56b0b0b4536a4cfbc9c9ea8003a1e256978a6d715b61ddc1e132d66d8c6a8bdf7aa7e193031f1f5e63f3653abb48dfad141e0fc1e027e0c969c6ecd61f4ef48b3a111276efee82d72a41b4aed96835bd6447be75c63b82b07773e2df2e49f7f61874ee120a9fa8d205b3b43f7dbc6f8f060ab867ce22f0733cd47c5da873935d596d2eb4d471290c03d01ccd2279174ec11db6871504cf00a4ec70888655f7ce6cae7b8d4413e576197acc08d11c38040aef98b263a65b6e3d811b2e8dbc8ef5b0ea04c2fcf103afc4f57320"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (877, '{"ob": ["15151515f6ee44d6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b27122014040aa53f965e569bf3b1461d28e3fe6a25a4b90eb9fd601699f72d1da8ba63c9e7abb162b663f4757fd9edc3184f2eaa14e3e63ba75a6a7905bfe15dbed222d7b95db90decb0de6b7f146c72f8fd63c55a7a91483eb0bb8496d137fc1297932d259d10ed29dab720c9496c05636ccdaaa50c1c58105d3f4a93e242f535bd06728f4e590eedc3d1deca20120dd2d58dbd9096f1544a46a3fbcb3b145a4a329a11ba972690633a7332c23bf586cdb65577e21c7391a8f984732ae1ccd176b0af350cf8d12eb504878780dcfd9195366920525d4d02455e018136d532769a4ec644076c05ac02ceb064cacfeeb1ddfa4e18d0f4cd6c7ed3e96ee865739ac9e8253bf0052083793f004a301ef0709c0a15d6d0ecfc36abb3757409a2c9c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (878, '{"ob": ["15151515f6ee441e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583c07a9714b44887e083a24e224f529b8c28a713c85e7774d3b8ba179f73bf9b6c6294bff4240353d82cd6ec79ec3dfcbf8b9a0f96c682af111b8eabe08cb457663cb228affa41d383309349a5932c2622cf0f66928eb089157f16bf39e0820c18778969426a0988fa2941d406cdd425bbdafb91285907a2c6f8369cb541dda544bbd4e3d5ecbe95200875ceca3101d44dcf204b3df5196eea6c7491203c582ef519f820562fb84a6103533e1b5b582d2295a6c5b776dd94bd23a8a0892b56c313cbaedcad4c90b6b14170e8b2c42675ad821504936b842b06b93c67341bb6c0f05a25d73c05d28206e8e4ad740cdccb480c8bb1593f77a49b3e87fae895827496cd8d106d8560b6bf03e26add4d381de54ab250d316e658cf54fb4c97dbce843"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (879, '{"ob": ["15151515f6ee447f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582a10287180d21037ee35ee6461d1c685f2843a7bef288211eb0940af38626c382cb7d2ec5c0b9295cf002446b063633ede3289cd9b3e8c115924373f985843a1d45491342ccdd67d829da881f3292a0199bf895c035e228f1e3aba9353c4d810c3be4cf80559e7cce1e6b59543393c2d1981b19db18bb72973e9a7537d3cc96ad123beda76463db727f38202d5e5f319c00539485768de8a88284de78bf1bd4e0dd10fdafae2b2ee72f851226b9b20baf479f872bb2e332fad267a8d1c55faff3a4b7914d6cde8c6d3bb64ff9a8a6f86452407b242deb506c3d29c06e4da5c8c742b04a63358c8cedd58f7d0167c60f6d4b82d444ac5c4f7a2dae99fb294153a590b8d72009315352708fe7111a38adf32d543f422a599ef87737b389c5dde70"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (880, '{"ob": ["15151515f6ee44a5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a56756d87b8dec14576b806665077b6b7a991a7166293c6f1d4e335c1475fae3e2ee2482d58bb29bd0aceea8257793de44199f0724238c20c50d4ea8357ae9a01dc4542651aa50d3e2b12e315fea1b13d525c6a0533c3cbaea388f5125ba5393ed2f22e2834895670ffbf016dca944870aabd347db6a5f36994ef27c68cda2149f10bd7a8bb0d1210d313e74513af7581f381dc2e638c0f07c596bbb4e1b0cc7720df11a0c04840ebb25bf178ebc07f7c15f7b748659744e540146f1453b752adbccddc374e33810ec2c8cd3dec6d2ae7ccf16d4dc72c3aac9c87887ef35262e60e2bdd125b97bad18773508690dda57788758b68141e51665f1cdbf79df1f681a6acad72610dc4984298dd9b1356ca7d245f458b721971402c36a4ec80ad817"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (881, '{"ob": ["15151515f6ee4431892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b17b3d12abd24c379492ccf610c1a1be0d940f90545de11a9dea7c1af04f9f2442fe4ed01c90cd98c90f1e8f58da78dba61516c0c3e0227bf17b0c61ed17414ed5495c4ce2d9073cab0f9cc39f1b15843e9144032d769125c1b2192972c68376ab0cef0bf462a95857a7fa626b1fce994f724664dd3811ba41dbb2f3bfd083fbf392d1fd6fab1d0b9ab3c8956bd9c8f615944b8b8bec6102ef9e9756160424821c9d408ffb81625492eee7d41c2384c9f0209179dc311220ad84144010cdf54036635ac7ca53be61bcc8193a5275632897aac669f8f24beff2768f822de10cf78eaa46b3db47214cea6ae20cb76936ebb4b5c9151d373cdd24bc445ddeed5b05798fbe11184aa06e1736fe37a201bbe8183d786b7e84556c51d7b452bf7df8bc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (882, '{"ob": ["15151515f6ee4417892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b5f478cba3899a668b5b70e528ee09145814f579acb90d2c6422da82bebab3d104d37059c5e56c7fcbae5749367179fd9655ee3b6bd425c37d534b4fc10af7bc10f1c95e29db9d4dfacce2246d4988563b673a0cbd8a9091bc007a6d4d61f10a51baf1be93b883cf03700f0cd228472ee26a9321e2223878242df69c8c3f215656433a7ffbde36b41dfeb6d6f175749b81c1fb2d57f8bf8a5465edc8c6866ebb3e3bf715895a76e3f5af4b81a26cdace99f299237d10e0ed25a6f3f42d57f675a7faf88b4acfc6587eeef81378b76d143ed319fb58b57964e68c15a8a4696f114371884d7f46f3e5e146fc31a41ebc0ae674e0f866446701e94db0c2734cb098d0ebf1461239c21a0560b08c50eeae86dab7c58102d89dc097b29e4d71929d40"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (883, '{"ob": ["15151515f6ee4481892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583b58dc960aaf9ac893a6e4bbc533b5ab40898e30f5884829d35c6793be673c7605a5e8c464b20700845a74158415f306cfec2b4363710719498dae5766822ee4f9cce878b77b1f36054ba9ffac58bf615dc7df961b7b41fec19d2c6b2cc7248cec9c5c198d2aff8fd2adfe41cc7ee210958aa01a5d5bba7e89decd90cf8a4f11d50abb2c87eaf545ead4ace3189f02d2b8a8a5c0b4259d91c66de17ab780897982bb1d1068a690abf7f09691fdb37beb1727543fd9971dc87a838ead78ffe3e8e3732b709e3a933e4e121ef13a5ea946319f0b068a9b1d2d8989c8aec25312cdcc1931937e28c41167dd368dbd9dbe313600badb420ba85709ade52dcd1bb1504b590a15af012ad28dc65dc13fc4e092e51f7449164059c016f54dd0eed6b031"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (884, '{"ob": ["15151515f6ee44c5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588354015d00e09459aa6d1e9365f579d9ce03b670a1d56045f6007b8eaff17c4b569adaee624cfcba17515580d0f36188ab6ace675a27cdaed4a2d17dbb86f79831292fbb0b29ad0fc862082088ef7902d3f39434c19fe28cf69f4a4de0554f66d89a3d5e985caa5603c7e0119b5719d2c5bd81efdac8c6f3034ff182bbd428b8e19450746567fa6a5e933157991de362769781f4b1b8a91c3b1fdb42696bd127c602c37863835bc58bf1c99b13181123f33c03abbb438d4ea5199ab4f6d99fce0fe3ed1fdf1ef2799951cc5ee806401a5315b654571f83eed3a6caa8e90f8a27344e63a147b5e1eacf7ee8c9e15a4d5ee5fa067f3cb4ce1c4604f02fe4ba87b959db5cd0fbb57b8ce06ec8870dbe0bae362e6489db4389cb4885fc149bdb8b82"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (885, '{"ob": ["15151515f6ee4435892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f9cb08296dbf0ff1ac10e4934278d80f33d2a964b29fec3ca29e75655514210eb90f57ad72bfe6434c7f9e8d18b3516e87c55dfedb043703cd9c635bfb1b2878d7644bbf0cfc7611e31422441e111efa1b3c606977485870e7824bd686df4459b328c78ab9a3acb65959d1d154f5191b054a26f317693d61903c136aa54e8382ac991d26fbed21b8ef4ed12bec47ddf3e2c3d0ce3f631fd50c6b6f9096bfe1db65f883bb158fb197ad4928bd3fcb20ceeff4c130020d43a2aa44c25494e1c84afb46288a231243f52afcafb0bfa5a24c65fb84bdec6a9b47ad70e6a490ccc27c41f8b15d5ccca53c33e1895bc137546932a8e9e68b7be6e830ad1e73ad9a7a626003ca172aae8f054cc3a7e837ba7d52b0881714c8e0892c1af804ac54286724"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (886, '{"ob": ["15151515f6ee44b5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584cf91282073bc45bfc73406184321f92075121390eceaaca721552b316a6b35994f324b4433c68596b7038e4cc29a9d1e724f3d4d3b2528c47099c9255d2bab1e97965bdfb13b1450ac9de3dd1b5d7174737b6d891fd51446440dff1369dcdb806df69c2a7cd57470d5c23e58e6d66d6e3a8268bb2f28b305076f098f3ea0844dd7c5cc8b013023e449bb112a938b0635ddca31694d04cdf5728c2392db285af5666fdd23ef00439480f1066e8a3c5988f2484ccbe788b93c88ca05dae66b087f3758f0f11114414ad4682acbcc1c13c893b3f5d3b8b2a23cfc130422b7245f6355d67337b260154f414b255e1504454b4c7fc06d7601e829d31e450065f81272cee3e3e2cefa3d19ea221f2e724e978b7e971752a7c135ecbb7814f70d61846"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (887, '{"ob": ["15151515f6ee44c6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358788f0793a5eb52759f0dbcc48e997a44b706853fcc94131cb601bc1d39a6783180558ae32770fb9d6556ecae103d1593159709caa561549432b2a0b2b6fddcc4620e2671d7b500312bb292cc88867b75451057ff039c3942f73605f040a0d138bf32b87f099d8e25016af20afc140cb09634c415e952135e2efd908b6af9e39f13aa892cf2d5c2c2bbb50e845facef4c56005aa44c31820ca4fad458bcdcc57a1de1a62b0bbace91c894d50cd81f0bee75893875d2e37332a68a62c36ab0a2d3310d9b62ec68a74b6afddc96ffaae7184cb2a504e4eb5e9c229ef103f95747227bafebf8f4826d883c9ef4d2d5a323ee11fd5288a12b747983f53c14c91c57b2cf6ad2ed8a8b36e31fa83f996bf860c3178f6623d8b47ade04c2b3cd48a2d4ae"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (888, '{"ob": ["15151515f6ee4424892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358897dcadeff325b8c2a1a64e88a1cf58dbbd62481ae4f6c20e819468062cfa88352c294a44bf1bc63aad898b72a00baffa642b43659956f74d0c46b7fac51d7d130a1d868daa567c103f91d6addb19ce3fea343edd33789a79d5ae4275ad6b5afc3e2150a23c8704686fbf45c54eb2a7beb1e5965b1c81eb6c30d31ba3ab74b27d6ceab24f1916e1a135b61d74413b63b9cbc1663406ac29826890c3e9a802fb8bb56a930df3ec4bbd87c1fc6489eb12e705c5b213d0ae24c0f38821b630ae91f2a930be7b818bbfd5035b048a06f2c96d2059f0b5b0f024d02179b76dffeb0a1e868d1e139dd5b20aa10ba4335debeacc97ec0beadcec9d160666196a967dc78dac77a0b7d9f7905cdb695e89e76f21eb3f374aaccd68324bd027730ce816950"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (889, '{"ob": ["15151515f6ee444e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135815fc0d4c6536b2be66e7e00223e92986a736fa85f2657997fbc661a17b9e81ae2b6e027f3c7fab2e6d6a8a8988ad375dd5c2c81e63116c3ed714718b14a224b51d821ab7bb8f965b41264656b94199862900029faed0232ccf3b80307aaeb74ddf1b02e7ebefaaa44c292f0f33da18c9b3ea6c395cd91cd57876c2ca27c582e155309ca188ab0e098c81ecfce156aab4e073c1c2f5a6839674da4329417d52790dffb238c3497ac0bc2dcffba3ebd83a6cb866e727fb6cf5fd5d169b9e8ef3bd8279fe981c46784716ff4d22e844fb469a6bbbcc02fcb186cf8373c57c7d513284e16e4e6078a47eb540cbd0d78afa9d84111b80b779d95dadf04bfcf2a72c445e51f5c8503c2f618e56b533505d808b8b793d9185e6e5fb0a13b751abedfc14"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (890, '{"ob": ["15151515f6ee44aa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358eedc65fa4f5b64f87a8f1951e39004c55ac482c96db271e9d7b822491e69962016552254c453d85e9dcc21e4d7aeeae9337973b01504fe21ff1a57504993d4e66c56a345dc5a71c2b908b0aae29bf425194453004d449cf2103f1110478df7f861ff04b7135468878ad94b553c81cfc69156c3200b9bf383de8261e4f747b60b913c2039fee233de108fd0e414f676c322e74a1013164ad6f8030e0f140d8fd3efa3085d1d5de206110e0011c46f35269d7d4f99e2f45260776f38fdeb83443254d50ebc71e4dcc1769bd01df34e712db0ea9b4237eb11f8e9917300f17f1b6aa1fa49e7c9bd331c54ec2b74989805ac39c1dec4e05c2ec70b901131c8e39c5c8e25bb93fc91c73057d3e5840de20856e75d3a04c25acb41bb46f616b83b7a47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (891, '{"ob": ["15151515f6ee441a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581283646479370cb3d38bcde0a31c52cdbab41df948fcc33052d0273a2a11de7a9c57ea06b522d96a64e6a223176dd42df94f0b0f2e43fd447578580c4ea0562aa085921bc1bd67906acd9cf89dac4aae7ef346fdbd09c881cf87d661eaa723cc3332edf24ae54576d827c80f3ad0427117a1cea6bba2c3fff70435d8e105a7dbc108f09275e0beedc3c894a5d769c26106c33ae758863c053294d9e232d9f149eb629e0c0653f656e2165e2bacdb9d6204da92b9fd85b442da2dcba7c44d14a6330c9051288ae634d48670dc4201e53630348fb63821e821d30a429ecffe993a4f6acfc440dcd3ea7a9f36eefa64771b6d9ab3e246eb247d3a0558ebe20c522e45c1300e76628be052f0af13b92fd9ff658b88e71df41a96b650bedd5ed94241"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (892, '{"ob": ["15151515f6ee4415892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ef9e6c4cbdf394aad94dfc4695dc0bbb1b80edd1340cdd19a57cdaeceeaa2c47351f5c9b66269a788d89f8193c83a26867b5dcad223094a2d710023fe0066079adea420585a1a866d82ec274a47ba6b955f76493ea663f3582c387d8c7eba48b6e94c36e88347a59d09bdcee1c8bb08861ee2fcb952df8fdafaa4a207af7a2a2919295c6f91e0a926bc2e15d41d4364c4177e5b7cdebaa975f7dab468268768a2b2d5e49fdb59ebe8d36f2dccb591dd70dad934a33ece75d4321141cdc5c46c08ddadd54ff49395dd72294a108f5cda24faecb51065dcf625cb14ab17981203fbfe7574f3efed10d2b18dbb63237524a4bd493bc743d5e3b76fe84d73eee80056bda520c26747085e14212b9f093c8a6ec0a88cf9bf2011b093050b0e61b461f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (893, '{"ob": ["15151515f6ee445f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358967378ed0bf43ddc87fa7e517211c6eca346ddf0a5e27cb38ea8f4845e671dfa90ac30ab49a85cee1de4cf4387b14c248033f92739d9b1a22bebd173236873594a9b06a703c5003b91da3e7985e5a6ca4d70d709afab7aa3eaa687cd41f8fcc4246926cfd35a843e2dc0ba78179ead8afee837909c8dc2b1e2ec4ba3f2bac17962fd567dedba72179304a20aa6791aa85d1c928cc47a00a1f9924fbeb687ac5c72960fff1f280058c3280e4fcc2fb8c9c745e450d8186e9eadeebcc0852e2519ae0348ddc0afc1a48784775f79a24382bc8e1c5955296a66046ea1c5eb8bee2a35a28d31abfcc45610a80f79a6d8276abbda21392eb28dd576734a321db1e7e8859c0b62847a45d7316e210676a2b1452f0e6fdf8151590f463b3f9e52aefa99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (894, '{"ob": ["15151515f6ee448b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ea9dd96561ddae814020402711ced31bc49df01b804845e27c19d6f52bfc7c5d000af891173e881e054f438b198e8128f76745dbedc6e66f7ce22767a7d1c1503c84402710582651924862a0471d5c96815fb81d13b7b3eb98cc2ddc9b41f1569d56cd5d130b48a04fdf811587136a047bdebb831d42830d7a7e3a715e15ce76cb6e12b8251dec7d676ed95b40dd502874581f8c721ce35479f077f40f935b2de02d634b5a5f0f7938da06286deae7a28d0a8763669c5e4279192e57300ea2fc27e1143c872ce9b873fcc067f42b15888c6413dc906f8ed4a0374bdfdb4ef90c05ce1d77292f571c2b0f199ef16875c3a2e9b1e1bfc1bd8a0356c60c4c66c5a2640fa0aa13f72e7c33f3b76a2a6716a61c82cadcc394afb521240103c6160d9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (895, '{"ob": ["15151515f6ee44d2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135843b3fd10033cfb1d8759560e7ee9395c6bf36a447717f594b96775e0ce3360bc5279633a62596de3a6742967dd5e543c9f77b3eb58ae5e51b62930332d92673ad7b2d0a52b42c3e3497e368c84f049354fb2a83e969357d1097d10803af779bf96a77b31251accce377d0cc2181b9076d93b1956c2c7daca1f6537b2565a806c37d57e2f46b877ea6efb56b350124bd4c9af3f4dc42d55e94694624341fed51f23dbd25e7b8b425a23c27b475151697069e19c44f715854384672ba4772eec98807e630ee0ae66629744b24c584e02e69bf5e51031b85355bbb899a457b3290339599f65951c3d6d8cd8aec0af73ffb06e8d2edcf70268f8ef4bca029c71abbfc51ca54c3f57da7e218a1ea45c8bfce781927324bead43af34cd47ddb9a4bdbc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (896, '{"ob": ["15151515f6ee44fe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c0f530ab6d747c874fa03728f30c31a50ef61bb5d7f8c5f17ec627148828d8f27da95ac862699722cb12c241a01520f91b30804aab21e9cfbe0939d6fdcfe4dffd3d40f4219fd323ea1a1e027c03922f2d9917a1e76004e6bc20795898a003a9fda561fd7891abb6602f71910d0a9f5bc3aaf0e32b95f5c2632a1624736b434a1fb6a06a02c63b2d64fbf7ece1ae9d9b2561ffde98e3d3d2c06c3a444f7a418a1a561b80b27fc6b30df5cdc658a136c8871b6037317651fa0bdc2c6cae0537eb32b6281435d5d78c664908ac792853154f213c5eba057b11c96b7e72f3735b845d23a8f02eacc50299313369cd761b4f9b987a80e59faa3d41eb7e756bcefd1a9ac735b6977b78e14accba687359d6520a4b1b5d9fb8dc7a2f179502c922a602"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (897, '{"ob": ["15151515f6ee4475892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358aa181c0de10e6051a142f83a0b68d7cf625c45cc5a1cc89483e1ba62ec6b035c89437410d55b87b64162bc698728135f0c405f49acc765ef476d3bd0fa6acb72844ef2f2405832d8219cea1a603aa1b4f1bbac1bb601f1db5e9d8627e5f9a056a45857bc61d8191ee97571ca8d691ae702e50613259a8560607bd037088dc8f049448353461901f9ec77f561fd87825cc1579788a0de2ae5e20a712634e4f47ebd3e7bd46138841f590cb9cd61bc5bfd83987f0494e0bdfd112f8141f56771a59d5dc1dd98e9f25304f771ff360517838ec42dab873105b5bfc711f25b53760045ce2d0ab6f5f74e29155e24d62029c99a1c35135411745ff23ddb55fee2338615e245e039ea8ba9d530c8547d6cd846eb442d32b3500d5854436a87b3414efa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (898, '{"ob": ["15151515f6ee446c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e102b79af62a6eac7f738ad7dd29e328a179d83e39a82e165abb4b45ea4686cc69c456d38e4dcc1f80d28ca90a1cfa377360ac38bb2a83e722fb1b9bc901e97d8f87d82f236a01c1dab1459611f5e8f559f0c0736f1de47ea785ad3a48012d29fedeaeb1754bee091f99214becc2632fb89debe5d252e79c6baa49ff436981505debcc32677a3ef9345b65cc35bbbc1cd60ba9923f56287fd8eaff99fba0904c362ff7438fbbca5fb2891815d5296caabd6b484ce3514d1bd16a241f6f645184a0875d6ab96ac09cece290dcd8ef55aea0566b524e22de02e22c0d6ec5a6a73a86fb3caf7700a082159687de4a8bf1eae2cf8ffb92c6c9fc7facab09a8d3c027dad6a1c57d08ed833a14ddfe18e5f0012c6ed0b58c16fee2c9348214667f4e55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (899, '{"ob": ["15151515f6ee44db892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f570befbb56047cbd176aa9211c1100214b95e0b85dc09fc562b82daac0a5e965ce84cb5a40ba462c8d39ac3a73698b300252ddbe9df754a56676cdc0cd43ff3398d83d33063f2e9706aa16ca222b7ab9225b226f2812c896f4cebba7d3c5b7c4f4d821a32518aa625950683500edf61dbcafe57cb8842f5d9727c014d296db8318610213ff09ed0c4068c7edf032059240ad2a5a2b9553da6d4b84650f9526a57faebcbacf8290acef54c483468491661d2043f811c553da8cd34e2d2385b92ba03ffffac40fad75b8639d5e950a63bc00dca43a5290551f162f83b3a1c0634615f78a1f2e5e1e1f648c7be4bfbffc75854bd3a697dac278bf942df17081739466e552f7cb34c576169de00325dde8f1ca5e01d0967e344533e8defe270d2d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (900, '{"ob": ["15151515f6ee44ad892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d1debb85a6dde4e3757fe688dcc3869faa77bbf4b5b58f71d13bacae3eaff36e5c19302a0572f0e73fabf58f9b10062af1f748fec8aafea12e66a6b3641c196318433e8c2cb7f881d29b3a61d4f211f4b44d87746a2ddd8da983c894af90ac37f63e309adada461688c420440734b8f8f7747de007d358cd32b54dc86d406a1671579fec3f996abe790ae7c0ddf2e0f682a01ff216fd91e105a3e03ede51df0cf927d4c56b5378de6c0eabb3202599da5bce2e9b5eab04738bf2da676b1e540de4538538a525b6e6d0beb9cf24ad264f504d71a83e92d14862a96d3aa112c6e79f8584275cc345c6a94326f99ba8ca139cbcafee5dca65c59a3beacfdc4504261069976ba26bb7e03c89ef7f13291de6d4dbecb3b4e43df8165d08216a6d82b0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (901, '{"ob": ["15151515f6ee4461892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358437f329fba477761405a9fdd7a8648c4f4c36d73ccd6d09b2c9e00fb8de7ebe1096caf5f9a30a60a2ee530ccf15bd244e85da6d46151092a5802fcb5d06eb88aec127d5af2a24f0fba75ef10b589cf88758547911bbab7beaf486074313a64b45d156e7752705c900eddc86408caea603893d4062a3885f0abfdebccd23e4500acfa673f232c68045f8f97b1b440662e2ee2930444d5fba95a43c4ac5bda1daa56eaaa39b301e9909c017cfaad550571a41d8bff7184b53590859c09bb405cb9f61667acf99370e59e70c307c0ecf9676444ed4a3d4b064582cf3133a04247c3c309c240fec9e3806683895135788d88a0a1933cd3f660f128626e8a7b210c2318b1474af58a897608897b3b93fb460cf00d00827307f974efd312103417d673"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (902, '{"ob": ["15151515f6ee4492892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135805778db44a62439489bb95fedd58f48d119504053bcf5105ae708fc5350b6ae8cae5293a9ed5663cd3a6c7f40a57654b93cde835f2a952fa74c6e248ee3b914f306493a310d916164a1a3ba4a3c13da75c944c4388c917265f892a40c09feef7b07dfac6fb189783ec973fe7caea4edd8a24094230e1ab626f695b517c7efdd66dc750df3c260d8110ef4b2fb808e9d5a9a1b74875a760a3e713725ffc03d584f2eb9b1918c176c5576211724e801acdb0153ce356f47bc8e0d9cbb15e27adb8bf618d4c561089f60e8976c88a76ea5ce1a47a3045304e23a99fa87a4961dfdb8ee72703c58b265c12439695559abfdfa4142b8de3f8710041dd1264c0a12097fd628d82016b98c89be3fc8daafc88571f84081140fc17411ba7632177b81a52"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (903, '{"ob": ["15151515f6ee4430892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ef61530b336d856c2c27f1fb27879ec02f1791703bc3b6baf2b19b7672d08961ea326eb23b5eb937004da1d006681bbe9ab14b44f4d36b0d1a345235ea9a669c4755c862fce578bda61b7c9c7ce9f9ca75c146bee559d005eb7b2f9cab0317421dcc96af6031a8528e281abf4eb5d020b3fb098444e6b2aa3fc324828863f0b1d0db6041b0e08fe8a6a197cafc88b06b0ef8e79226d1c51f7f32c28bb68e7d2f62e8b42e7b87c8588fc4a5b083063850a9f3a19b2c89c48698d60dc916496ef0eb2b72952338a95484e7514c0d06b621b63ea0a7e145adf549e51c9f695fece670fa630fa0fd8c6481960612f13d6ed0ba9df99373a601f17e4303298f640b289dbaf0c142738c767b1d7aac35801d979194959e4d1c6e9e5ef2bcc8778a7dbf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (904, '{"ob": ["15151515f6ee44b0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585f36079bd6bd1cdd918c995a9d1ebe54dbfc2993eea12d6b323a4721b878df8be07b492cb805a5a61d4c6e67bb30eff8356b33decd1004567076fbebf27d55e52089580d8c2930b185b7c11c8360e88f61482b9317fbb09372596d4b9066700456fe637c59170be53edfa546a54582cbbad1d5b206e32e85487ecc320694586ac6531e18c668a6b747d483d3b2f9a1a9793cb1a14c9ddd816b671f8a0075f4a73358507d78249fb891980bf45fdd0656af5152e50438e049e3e9a98d1684794e528bfd7abee6490eeee33f37f4324fd3958fdb190be0326652a9d4b5291d5251724047e3e1be6323ea3704729ed76d69a0f30076b16529c9de1390f60eb2e84343b3e11570b7d3e2bb3fc43d8691b3782c335a8ca36a17ccb37d7f22c29ac7d7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (905, '{"ob": ["15151515f6ee44f1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587137a3e780e6b0de1fb0ff446480a501a9e62e1308654d0bf86d3ddd4fe76d4247a838065b5d5a5c2cace8dac6d1f15e43caf61d3d4bbd34f6298b8ad818f069c95eb6714fa6d0a6fdc4e73e0bac624280f36471dc4efdc7ce1e9cee96b1eaa6b8647012cd7b07e915ba60dfdf33a8a1425380a5d5d63bd823ad731ee060145f249ab3d64100069a5d93a0a303b5adae24181e3fabe12e2a29d2feeb7cd7994c5cf996ff7739a20b36716d31862da80cc1ef238bd2d08bbfcc2768cb447d19409cbb36fec1192ef75793cc0a03b69c85d7fb4365810beccd34c92ee9e23210c7aaec25126c82a83bca3b3293997c199fe3e0c95edd06e7ab699fbdd446ad92ad147ad2ab5135462e58f44ec5cdce834633ea3958690cf7c85e463ae95a32ad43"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (906, '{"ob": ["15151515f6ee447e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582079fbab2f6dc6b34d46132ab7d5c61dab46ce6e4ad3417f052eab8338f1fce81d83a1e55a40de9c4df30a246eee767dbe42c1756a7bfc921a0fcb5a6c9ad00510ec15937d9d6cde8e9716c493e98bfa634ceaadb5a69a62dafa097e34288aa66f04eccee8b91f9758fbaad2205f714a29b9e9350ea0f93526bfbe030286230aec4f18f6bee6198c451f35cf8e4fd6500182becceff87436a5cfc18527ce456b0e29f951c2ab6dc97b8c4eeb57fe779a171c497ac4744d9962e0708599a8bc74a62c9b59c2bcfb0e88b1924f4bddc30deb6f0d94dc20a39f58ea70e67938d9e4409ff35a6fed5aeedbac4aae0b5e9a077d0b7faa75991c7ac3be51f53adaa83473a38b9d6b96a840e3365b4375facf82ab07d9b55a181c6a8ffe1b2a814a0f8f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (907, '{"ob": ["15151515f6ee445e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588f69df6cf43f3b529428628eb1dfc90c1c10a375d85f18dec1bdb1950a012d2c47b2eac2d397f48f997d0fdfed2728f4cc9289f0270e9f7161f07e5f095c99501b11804d81088ef6316c99542a8ed91d6e214902ff7053aa18e4748cec561b6eaa6d2a854938423931329a2d6417e4980d326134f5f4bd81e7d5eb0e3cb78a9ba9fc98effccfcd6c2a23b2cb0626bd4dfc5d0eb7488850307caa8e524cf9af8f0f559be3df0c42b2f312bddb62fee9cabe32778b0083244328eae8ff793341ef34206de32494bb2c7ec05ad0c3170ef9d62b44299f29f89267ad6e62eda6e4ea0a80062ae701758455498e2ff9da972dceaec55c3c4b05ea62e12ba1e6c60a10f18628cc546a815a82f798512480bd3d3357478f16924e5c8ed3969fed24a997"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (908, '{"ob": ["15151515f6ee4447892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fa2c074795e39acc315e5b6c67c6ed519523faa380abb0baf7c7249a097a953795c86761a82fc0dbced6dd0097b840f47705b685e5533302bb2cf059a9e5e0505182ef40fec5d3110a6942b2ae7ed4da08403cc72a1609026212265468fa3e0dc1719093ec3583c3db2d81652f94ecc397ce95fb64c96f80cbd059fc9c17d6304ac7f23aec2d1103286e0fc9b2620a90ba58973093481402c348f7b32b0d3f81c5a4d51caa4b318e8276f8acd6883a251f0582b826a27ef89210d59387cd22ce3f60bc2c8f833330b9ba0d17acf95fa8fde072cbaf06dde03ea3ffd6d908c9bb356ef7d4182d03a2435c370b45ab6dc046ebe6a4d1128baca15a686dd554a746fea585f73891d5a25acc39f019b0e965ba030e464e779bd2aadcdc1c78f5cd06"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (909, '{"ob": ["15151515f6ee449b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585bfdde271f17636183fe89a12b7c325f27bc04729fd7c73b774eb9c5ea5bc3035ab8fd574061771df589e179a52e911d2b0c91ebdc3f1c34a781500d2a55d3d6da474551360d13bda397582ad5f5b57d5e092d0a5c1a3b721a50174f633b8a0e33f93a875fe6e814854e9cfecd65ab7ca4d7eb5168a31a598aa066f2d7218916ae028b77da454189ec61b4b36c7842b770a6599465cc518f81a74f52c98f7abdb0ad39b552de0dd919c82724d4ec6c4828e9e90a34219d71134faaf22287a023e3c54306c35476a290e3e14174f6698a0ef2c05778c065e6e4368e436c42ee4c2b1690ba31054c2d13368ef97c1866cbc3baa80c9b459ded15cf37a634822a974fa26d80d88d2ccb03c7cff02316f0e391cf19fb7342ca8b32af123565e1d542"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (910, '{"ob": ["15151515f6ee44a0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f5337908b684b4cb6cb9dcbf475602ead85a1f1749f09ea8efb3fcd4c57e01ce008400f56e38b70a1ca1a7afda37b818d97e3952fb45b1785e4f51b9df0e5c9a93521d9429ace18b6edcca85c303ee17e6919a1b4181a33d92d0a0b4741c53f12fa8462863dd7cfb01e73bfac37dfa4907cf910cde81175fa1892727e0367ace73764c81df6a903eaf21f9856218025c3f9617e354acbdcf8a34f42a88f98db8788e2f5b6e259d58bde829abdfb4ad63af07ad8c11793f412e30431e0947f6fc09772062202957a3846a2babfdad5509f44021b2faf0d876afb3bc804fbf1689f88c27923a6a7d9da7301bffe2243dcf850faca969c2eb3f32b551bd638ee31759fc49f3c981b5215127b226a6b8ae1f118643dd829f2ac4c8a102edc9b0090"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (911, '{"ob": ["15151515f6ee449d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582858a44174313d82ebdc17d0379a1c2982211ac938bf3ff1a6065e5b31a502f4d7a8a3b11144cf69eaaaf39c67fa9c212ff9e6e3f63b31561d1d94e872ae52a86e329197ba70581fcc02501f0af7af62af9bc501c4746a0deec5bbe1b82966a1245c08043537e6d9c60eb162914637d356dda87bb2492850be14c004b276f1d648d88e8f69e334d9cc7b76215f69a9ccf9bb5075f40aaa88172ecb863e4b596c04c6e52aecd9a63e6ac750274b2151934982cff0013ae9a1a6b932787cdd46f563a15067af088718a5cf1d7e001d4645cb7330ecd4d5bd0135e076bac47d34a726ef64d1e2658c3413c36a8b37e76f1301743737e6b647d0f8d8ce505429d146250ff1a305291e971ae2113afefa5f278c4a6bf2eab6c980dc562b636466429b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (912, '{"ob": ["15151515f6ee44bf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d9055d7bd64d346d7fbb963ae7faa7624d3aeb876bc2c26c56cef0834c1727ebfe3bcf0f1eeb5a4b64a3d2a36331ede6ce227885a0d4f5f72216f41d936a14551e3866d370413672dd7b0d9af6801c767979214fa9d71b9f942f19fbd2b2d5cfa2dd789a963326bcc8594f98ca925351f4f775d7c7060b290db3fa3730902874c849f7ff28794718b18ebf17fef7df97697501ca9ce1d1e8c1511e27378d4bdd01dd71636a2c1ce2817de1107bc51c14cb8bddd555cb9ac407d0f97cb95f4d4c2d42a79be5fbac12e408d95ab3a0930c289d82fcf27ed2b55331df2e04f7bf1240adb8cee32d45dd47111192dd3cf14212696d176bc0fdc4391d2f6131187e9c196a6128ddc5a319ecc74fc292aa9047e9fd7831a878c06fed938c7ea680a102"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (913, '{"ob": ["15151515f6ee4478892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358999405ac3575b8a7618d3e303d591260bc32a4ba7726d713b3d40421727661feb71f03e7d5a5c1f3f8f3b87d8af986f468cb7429073fd57d9ee4b90acde4a1788041a73d9c5598c5dd54db0b560b7a62db5333fad1fff89d4264ee8b7eff15bc67837a0405a6be71c8933e2ee73f704e00258fbb84a38d3115f0baecfb95a906edeb0ea9b2631d8413f1d54e19a2cc64fd69e430f2a62a6a5ec4b77b68edf8ed289c67d41e22db582c9704cd087c0020bc4251b0ae5bc5d1bda720d385457944797c6ec5cf357c38b7acf066c7ee903071bc1e6931687358c28183588419ed3f3ef0976ba2ba77e9b9793ee30769632c2447298e9ba0f5a2ccf36fb315599c1ed60aebb4a8c207519e64e1984a2e154235d5d936804c3321d6260e838e7a5153"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (914, '{"ob": ["15151515f6ee4467892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135825e75de08a89fc7a972d82b662e37c688775e2be096d509569709da6264f57caf6591e51d505f2fc9e256dca4dcd7dd90dae84457bb7048c0db5237da2056dc089b9110054fa1de6b271c5f45a325f90b0972c79445f818c76568fd7987581de8622d798aa9c1999ade510dfed33206814b03fcf8ee12a47c69785ef3f2f78a336d9a53c4ec89a4becd9abf35390315f0f936ff9ab6142563c767eaf8be0bec404e35291c2b3f972977326971342483476879f0c608b182238bbaba61b708e562d735fa57a0f5892629140335ac41101c22d1d1449229bb7403f270515cc2a62e406f8afcdececf3fd7e3520543ecc1fb19611ab07568beb86a60a313ec5e7945408d20f16fb18f565525a351fa550cf521fe5e3dbaca8112853f9e633a14e2e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (915, '{"ob": ["15151515f6ee4404892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358149b13143779a8f156d22e33776630fa1e594f58d5366433f28e527d32a9234d4623cfbcb2ce04c4ec294637491b88a29380488d6fe3247de2c36836706b5b8d3b086b21f1d98f8cd887cd4e490a963804cedacaf4baa97db6db7bbb791fd9a2470f2ff3bfac8a2d917843746f7c056d4a0d62aa41d65dc171b94e72b342811b608656d3fe51ad783949b6ac21831df59e00b439543cc9636c078e86a40c9fa2bcff524245d7b695debabaa28f757445dc99df2654e6ade2a431a545128ce8436705ba8cc7d60c9e5c399398b49caf88af69b0c0309421f8d7a64c3a40ffb4c275e992ce05aba1eb9826909433e4645a0bc2e7110ceaee9c2e6f6ccdaf81345ad2a8e9b405ce1bf6c777a6ec02daab8a343b4813822ab31ed7a6cfc96e0b429d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (916, '{"ob": ["15151515f6ee44bb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358471e83188689c31013a092e78ccc31aa435b8bf1af2160bf264c78dff944f5e549771fe5209ab09e53920a4295ac07d0d1e867652e9c9cce10ad822739322172f315a6a0ba6b7df51d455801ccc892c751cc396d08780870c02af371089c1d51d80a0c2c2f3e20968cef2c71fa49dd96108ad98feaead8245e224ac1d545689ff6040df9b1a6647ddbef60ad9f25b7e5a5318f235d8a2aadcdc2ab083fdfab35b5b11dd5a96af780cb24a67f9b74d51d26f1a4ef8e7c1495b1b5939e32ec82d321d2752249584587155c2287bb69982db963213234cf5476f00b87cb8fa7428134f99033766db7eddf74c7e3c75bef1b8b7953b023cd35cd8e714295d6b6a8691cd75f6f65ec6532511325c2e96ded002081a9cbb6d08234c44f45066362d41d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (917, '{"ob": ["15151515f6ee4473892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fa23bf3606c82b030f9670b2aa1d15105dae68f003c473418bba9a41f9be02f85743a619a47fbfe0782c8be7ffbec5f718e9a91ab5d71f6b758da5253c5be2f2d51f20e7929c365d8245567b8389c57adb79c3590cd5fd723aa34b5cd73b46f4a045347e33cdd53370a3a832c2473cd2bec5313581e44b667a68bb35f35e11b2291601283d1dd7548c5750f15ea59b751aeaeae05919ca7c1ddf756e04d57ca3a5d534e0990ab90071b669a3510100afb6c9c1d48e84b959956af5652d7ac5e3d78fcfed13c15dbd68647b18374f88d4ff5978bf1904c45db69d0cdd0880971bd79cfc16e5ac0c10bb2e707bfb3a6fde480e170023d9694ad21e9882e6088fa7d99ee037e7117e5fedd8e1c537dce99f8be1548c17872418a94fd027d50d0029"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (918, '{"ob": ["15151515f6ee441d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581ee5337a79bf438037c986e798468530fc2df89dd54d8e73e5b5ca4e15bedc43cc152ee9db1ed437758216d18b97c85a392f7a5d6dac75f9c4113206481ea45e2ec67ff478a1741841ceeaddc971725de4ec22063a193fd3f40e653ec09715bdf95c6c93ead101bf4b6bf94a2f49953ec25e7aa7fecfac2f95bf2a0030122b072bdbccd53117ac86f324b60b036c60840dbbf2f11b2bf3e786b1dfc5d182f99f4dd678dbc1dd5b6ea7b7f33c49f4a2be9ffc0302a66cc1e4f66b77dd3f7b0d298c3591cdcadda36c72132e5f9bec5cfa7db469f1ddf09f34e22d7b623bfa65f12cacf5ba794ad373166c835aa9b34064b84098528f5b28003268e1aecb1d55a71f4cb2d0cde1255ac16ab34444fade66b1fcb3327abf79de886734ca2e6d0b63"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (919, '{"ob": ["15151515f6ee443c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135861f78a8b8685558fff79d8736b970fa54d0cbb5cb0711b4dc45045e425c8e8dc07a6e95b3da6d9414d20f0ae1c2d5d54663fefda018218ddd32aec20c23a371e9a73bc509e64e5b9694ccd7a3257f81d6a5fc72a5e1f4c26e34c668e727620e5cd31c7abef775d45131ccd5b21473ff81d3336f662401734083e85a34b7e195affa74b4301390dac21af9ef3ae9e5c03b626fd991389ff677740d143fbbde32445530c2317ddb76bbf8ffeae6c30af1a7d976b0d465513ea05dbec1824a79f1dfb1af9ed8258d1db1cf1a9412f5bab1723270bf75894309f409edfc863328d3d6309b8a680fc6e07995e8668eb40d5e81851dd8f60d0ea153e88b3b17bbcb3b017e6fbce43917a6d31a27eca0d71c8846456fb398bd9ca28b380adcec177a65e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (920, '{"ob": ["15151515f6ee44c3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135888b873f5da0c6740124e5b14e890cc62179a93d29fce9ba4a9ac3751995d90c7277c18122dd501c147b3d8a6497577dbe4db491fcfad4a8a1296c25dc81cdcf0a7b110764582fa60b84bf1069380c3e5db6268fc7250c95e4e26bbe4e20363250e429e59cf790d4f3243dbfe643e32cadd874ba7d6eb1a24114f9449343cadbe016c8b1363358b86bbfa4fee6fe5d38f60112dc9814cad046b6d9571f5b18b05cc7140825a0f21995a425d6b4c179cc3e70347ad4747de91f7d0e1b64cb9ace19e2aa7104cc55b7bd93e335aeb7489f541142490a85b33cd4adeb91d9ef5a65b3df71a41fe93fdb99071f0890392d4a75879c780bde110644eed7c0e100f5fe3ad802136a30be7f4e9474755173b6001ec8f75766102d0b81e0a7e6975c55756"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (921, '{"ob": ["15151515f6ee4484892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587099f7a6335d8cf035ceb967c03b16b6780b66b9a1e46901d65015f293a83f234403cc1492fe0dc7e890a88e6c72a77da757a2180d175901e9fcb66960ca8a4b660a7e8d47f6cd1b7283787bf48e3a93777b8b7c4fa7f04919f971c82effcce1781bbd94da42ca8c4cc242f6081553a34badc8bc218641439897fe485605d1d53183bf55c14b8dab101d55494064ef7f39d72dc6b3cd04011017c8ffa25b14177eaad042acb85190b023a00c28f28f8557ef4b5e67392bc074034a4618d82ca1905c5993b624d895333e2cf46ad08d69990d0666375f3782fd99de6816b5bf7df537ad9622a71903866acc9247e93dbed72fe495b40b8144b545b3104ec9f167f4605e356e893272e8293dbbe54dbc966f35dd858074e2901c37371c3bd34075"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (922, '{"ob": ["15151515f6ee449c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b2fb211f2ed4b165c359fb632a38853cdad276f07ffff56ff9016a20cd73ad03e9db810bc757688b1e4e2040afdb12f7460d77feca9b1a379c99253f3e8b109f7f3252b989111ba1a10773f7b958e647fd6f17b55a29e16731dc4caffe8e262103d5e2b1d07f89a3ca0f3b02ef9cae266359685cf4e711e03f40c7bbacbc4d514031071909cd3eee9c51365557de02a39c2f51831c3f9c62d305603763613493bf174f6aa51502ca7a2166c7ede7619fc976ecbc1b1d4718b6bb27dbfe92b9b69fde2e4bcd7f87f5e603dd47750fd709e6ff057f862ec3cec1cf99a547778bf4adb3001fc51fb069b1ff15bcc48106c819992b740018ae53fbe8f93288b0ad5e507f357adff0424f7e4426b13c578be312a4c3ece82c9f71ca89c0750d99d13e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (923, '{"ob": ["15151515f6ee4406892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d5318f8e6afedb1ef94bb49e4393758f8b77b14f8c02c6db027d6c74ee2b283ad14ddfc5316902b844916ec927e8a5ecff7497a35b94b268a1cd2cad9a754c1fee99c3f0a965244eb38fd0719c44f38bd62f02feccce4598eaf98c4be4c4e55841bbcb0bac380d00b8e382292e35820e6f291d3c62be6c5261f70fb37c7786c98d15fd5ac5e7a05b14c41be7120072b6b8c8f7990b6e1ffb35bc73d96090caa8cdb86eb4fea9bb15e2247f977530a3b9c140330be14ae1e68b20f75ea73c9b5b1d7e6861b187e2330a61dfc00c89734ee17a6d99e1b8ee4f139564b5b04408e1d5c9ff519d78fba7bbfcc499f96617fe9b64504c5c1fc638daa7620ff3c5f48fec71c784da3e49c79edfc01b8ed9ad19e9b2951cc34af582d518ed08d1c43cfe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (924, '{"ob": ["15151515f6ee44e0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358953b6748949b4275b30a05e49d6619f0c49a853ad39025e5a6aabe0f538bc8552401d5899b290d9b4627675257da0dad0aebd58c19d5207918b08ae1d90de610d89deeb0aa2749867e655c6d4b355d5b173766906daf9837d93fea39d4085ee6694886bdd9c06b23e49b2c6e9bff5980653df77395f707b797ce3709f8b2df2ee29f169d0313d48b70131e268cb41b3ba4c86c41ad87b69adbbb6f903355af4900f5fde4747abe61ab590dfa1f3f99c8df0100a6177f44b0145701b6c6b12ce1b3f84bddfeda4f544684de31b15622baa380023d71c3245c2b1c01412d8acdec6dd0fb13360a5f5e74b67ca29daac3504c9e3467c78cf83157aa57e2c4fd1e30c7df316a2d1528715c9817c146562868db696a91720f7c8fa0ffd2cfb7b1808c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (925, '{"ob": ["15151515f6ee44ee892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583d62f3cd59130bd9e78ee5fe291899f12ea1b5a6c30cfe79a271b8d200e96986de8d891d50a1f436c5586e900c8f4c3b986d402fafa08fcd23877e84202f1fef4c43041cae57679d60ae4dce1424795b867260381e742e34c8e12cc75fdccee5e22b4e34eeff9af5581bfa5abc40f6526d6a543213fe2879ac6340bda0d431208de104b60303631325dda4b19956d361d01456fdef9bc9f10832be888554c65d3ad8b4d17d6cfab0bf865bfe5f10e5bf5ae84c591662f90d2cf2045834e9281dd4cc3a3e6f6ecc66b6fe71b7c077b610619eef2a5e03233832c08a265e7be72233826f3dbedc4ca2eb8b9a87fe36d945b5c355f9ce38e18b4df4322472cc13fcfcf76cf1c69b8202b4605872b1fc63a4e73a816b2ab6c3eae079366c528f7fe1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (926, '{"ob": ["15151515f6ee4477892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582c300e282214d463baa7390f7caad4efa12174f9a0a078be530c799f9c0a88ebd67b480b92befba98261cf911699a81cb66857bc3a67b2afa149ab1720bb9899e47e710c71f364b9df82116ce64980bc7add341b4adfc973a70a5c49bb234f5b74f787afa1256070bf664cfaf2bb5835059eca2c3500a1380cc33cb8885abbea79232a42b6057d6c5077e9b383f4efa0dc0f1707737dd9a29fb98fb05c651d802bca1f6bb7a10373ff11266f27532bb9400f5878ddfba05c866e47e7e29de1da4851e3991d631bfbada2ffc27a11f318cb638935b81231fa7925548eb19b402c92a0870f61e69a39a4fdb49c17625fea1cc03f86afb2cd2c5038eba01a95e0556c8fc021502fbf2381c4c9a9c7816f1bc39aa16eb508c63af74a12b10f27211c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (927, '{"ob": ["15151515f6ee44cd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358daf7de6748a851677c6d371e5c1676b939239428579c9e7f4707e9e3e090f6685598b26bbcdc60bdb234987c87e5577fc6cfc25b43f0bb8209ebe8dc255dbe21bec3116ca92edff4f024b55b6bef4dfeac751d2fd2cab6d55ccebfdc630bcf531213e7257c68d3887530477e3c9d91fe2bfd4f945c126ca4b60ae89044355fb15368f547f97cdfc30f5ac587268a9f970fbc93136c4899e4cc84680a0827d6807ee73562136fd488abd129702205434f67a81b9042196e8cb6d5547b9cdf8b3837bc10a913b7ac372aeedcf45fe167abccdccdaa3cff6609f55e1fb6315335fb6a34bb35849e31db494e4e758a02b2896644a55751c64c266a0e5ee690fc02e9fd7b2d28991cc02e330c9c4275f4b4d9d11e95d08ef4b73aa1cc8ca212056b34"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (928, '{"ob": ["15151515f6ee44d9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135851da8119e9ed93b302e723ecf7cbd9770caaf5a4cf81930803a532fcff188b7a57596625e8d935a1873ff28c772dd4b3836c6a24fa68e16e0e5d259c09a00e2f6876b8e34066869234d59dacb35274eee324a5685093f4b8e2747f2009a19cc934324fafc149085866e41721f8ac9d70cb720a16770c9b56efca0f9a6aceed3ff5f06d633d71606de4cc19e07bd1b25d4ba314e01068151c48bfa1f24eb6060961a85d37f98aeb077951f6b600cb46023764d3da6a4b309838279bd341b7a996018d112a83b8d6d7bf229260788a2525f7abadaa1a39cdc6b2ad4cfd8518ee30e60e8485f423e7ec5622b2133b83d607fac256e66bf5de68ec557717b6887bd6c8f991c3258a0688d7fe30b7a5096e00c29a67d0c157c48683d8e84983f06ec0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (929, '{"ob": ["15151515f6ee4499892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b701c5ab175218b23e56694f103ee41dbcd295ea1c094178309de6210f04acf533837b99571689950511fe1a3316f74c15bfef63c1d911932af491ff091668399a00042a59001ab049d761fd2a539b3679d3ade1e3eb3bc4001bd8597988ffdba9d3db9fdba1609513e52ac5b891c46de849c35a199bc2c3c13b7947743f56059c711c1f7da201c8ca6745f02256b0d1d24c6ba6e8e3fae8a816e4403718fe187d7fe6dea5ee3a74b491a97ccd7ff3b834b82fc734b58dc5a63b29d7c229a6cf9c7e4cee433f0d0de0aeb847f47ca1b1df53b2a0770967a6806d0f1f3a0a1a0ceec9537b3834709d3381326c4f47131657bde2a1b4536b243b5330ce38ac46e84bde4b97ba2107bc4c6e67d05669f506fcc7e9b2b85b7c11866bc7b45633e81c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (930, '{"ob": ["15151515f6ee44cf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358216de5e30325da8efcee4b724c7710d6f65bb7cb1f408860adefebc21fcfddf63325c88e0572f0cbe6eb5932d4305eebfed2b678fd71f079b67385b06d0fb68e8ed73cb98e75d42dd4cda23f0a77ef7df544a6820e4649e40af5706e93dd8de8a8a3289ba8225e6158e67f372386ab008c0e5579fc277e2ced2ad474160a61b3d6f11c5799e232de2ae1464f2713d68edc96f94c7a3010afacbf7b2651d3908d623dc01a27e56a16e61f84d8d922ed43ecd88a9bbdb1de07cfa9f67371416032b428bde62139f93dddcbbd56ceed38668aef8d7a1c86d819cd435c0b6862c84863c40c9fe08c50cfd4c46e0b5b5287eb67e130f6c918b9e32cc14e5ade5db351f59d9929abd1450b0c53da249322c6f1a23d53310cb09a990c05ee3d29be0a3d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (931, '{"ob": ["15151515f6ee44e8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135851e497889d78440f08aa377506c0ebc9fef81369e8b94d348791a0e53d6953e061910808ad4a6a248ed0690d7f6db98068a847245a0f550977dd638f57c56ced1b5296b9c20f1162e14a39698bd7ac09d708e3b28fb7e91450e0a21e48d31716b05b8caf8b67e4e270469e175b8266c20ee75a731834977276fbf74265426c7f2ae7311e4ea810ebbb39860613b96dce692b38142b36ae412eadc32bc1b0603edad06f98a11e8d03752738d8b6d84c9365d14efab800d916334395f72b5e29b06c0f086fa3d1f5134562a59272ebd73d8ddc620c742cc7fce635c5eec18a42a2781fd3d25748e0b37173f752486ee1ece4c85561c54c441d639cc3e74d0b5ea924f05e5152c1e0f89817d109f9953e58125f99549d7e7470e48aafe905f669fe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (932, '{"ob": ["15151515f6ee449a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358109f8de4c5db656db504558b8c153cb8c467985fbc8eafe2e2c93191a3c982ce74a3b82bf9cd9d5df7385278666739c32037bb25e9db5050427119b65ead5f19202b908926a2dd7e5c1de4eb795cbad3f190e923a3ce3cf97c19fc86968bd49b6a334eb8397af42e74ca7d4acfabf1f2f394522987b72b38ce4052921487891190de8e68ee01a770ab3fe4937a733c9405b9becd5130a349d42de7a64b32840538f039a6e2c59cab60a413693a5cc80339d761204680434737d8f15938d77bb4ba356740e8bc39ae5c91e0e3f0d33278db77a7806c94b8225eef60957c25115620f57764e37bf61692b9f84e2ecfc2c53ced0e65b57d221416b2f34883649d21769b0258d52baf8d5d27c9c1ae9e9a262ffbf855b76d6badceea29bdfaf7fceb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (933, '{"ob": ["15151515f6ee44f7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c0693d77a1f9e44e901986baf3efbbf80f4427865a3b39db83032d6f9ad784a9069935103b657b317c53aae5a65639ef24a84f926c52f869907c21792fe5757ca6b17389204bf15a73726d424213dab9bf4c2e20e1bbf2291cf67e3cee8482e8aca20aa35bbbb37faaedf48648cd83ae50acce27311f73d8d38f4f929f6166bbf472320cad378593ed500123caea2d7606a296a840f9e573b27b7e626206142b2b093654600595eeae89015efc97bcac6ecc09b4cecd3122ad41df27eeec54395586d7fe358caabf9cb1ed35b014e8f63045a08e66d204fa60f186a70e601a56082a263e5b01176b3670e311f974204fbb69de2dacc3232cce4aed88856e82b392e98119f9ab2525182b93ee8c47e704070f86191c72e6b04d4441a49746fec6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (934, '{"ob": ["15151515f6ee44b6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135837797deae715c170c00fb96fbedd72e5463c97b6dc43958e10fd3acbcc001ca9eaab088ba3cf8a99b89af66f5b4b1d7f1c988c67e841bb1c0a2b520b4bd9c0f304df4bb27c1001b5c50862b8933e229d9c5de26391150dd3b53ed81a42d39f9f674439cc7dfd166d9b5091b3a4fbc4b5659cccb3bb8557cb9c1b5eef9a7d8fa0a74d8dbb3e0872f03628e4809d5d72d8be6cc548031d8b9a39a10f1d12765a8a59417ec185687a582000f0cea8acdbb6bda213d34f2b3332a849ba11d6606fdc6c5c757012aec1c51106d400cedd391cf6da51a7a8750059431be48965a80b0012d217e8be94a775a5fdc5eaa83825059e66aa3577919d817f365905e414d40bc46e6351d35bf287ca20fc5b775891338f0da4be8f99511508dddab7517d0eaf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (935, '{"ob": ["15151515f6ee44ea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c49ed2fd1d9b4116ab7d65c69a61f8ccda607f1ed56adab9c650bc65e3ad7831d1b9beb70480487c33d4535f961deb9afe3b87ec95b17634e4b96c7a238705b546184ea0375b80c39dd627983902006fad2ad31a651436069f15f254f8f4cd0792eedd60c93c35776f52768e228d590d38a4eab92e67f86a4c11bd37c64348cc81e24151c8e39b2ce954b755810d441966a466c78c774439524ab383e2571da77773d510eba282281f5c08004bb2f31ecb1806d962e66746a952c6817f31b7a2162f5056e08d8737883f6eab9e3e0d65e515d04d259df6acd30cf42d4ef8175d90d0a2af98cd2019efba034b897733133e1bda193639c7202ea1393b913a0c7f5697b63745b310f11f447c0ea116d66e7069e3338cdedc0b4a33b7061d60f543"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (936, '{"ob": ["15151515f6ee4438892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135833fb92cebebd7939c49dd7dc301f5d957fbe1ac7d9136fc7ad349e7cbae06df8a7ac42a42c11c76b6d9a9beac5c4889b02074781d5eab9e37d18294dda5f3a3daedae158a4855c746f33cc45dbc88458086a07d2b1a9ee6db41df457dc80bb79a22653573b7dcc5776bf30c9aa4ca22dbf71fcdbca9e64d17a07f8108751dad59800b85567646fc49b805df409ae5cf14a69ff76cddaa95f70b0019b439ef3002e6306ca551e6e4ad278a9325cb61e15766f7ef64ecc49a8995ec27394553e6a5e8de2a9302c5f16645d05977fe8d3ee0e2a5b7fed4a634e399183f86ada25cf41839babe23cb4e30e62e446b4cca0db4fd30ba393c72eb664bdc855bc358d5841ecea201b306bd9bb601c21272e50d324a532c8a58bd8e138dc48c27ca8772c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (937, '{"ob": ["15151515f6ee4483892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d9db409d1c4c42fc20dc89fbbc3f61bc3cdc7353c6861128504454253aa033a54ab91b4a8931ab710a7a27f13106a4ac9cfe025feec6360c552f199337efdeaea9bbe71bcbe5d889718e0311355726d6d5e984efea1323f146fc7269de1062f0ab3cdd80bc225f34779f38a3990c18cebfccaa541473e7f35f2e82f4f15cb6fad5d48f657ce5f110fa18f6ed054709d19398c7a1a42e7db9af5dfdd6a9ef0371dc635e62e88e681bf6846fcfe9b454cb380ac3e8b4da92ec6ccc10a4b5e9cd1a598bdb01c7ac965c13c0a7545eef43b9db8a9def7d5a7c3dd6f9bc0fd4d50a2d0879362cc45af084c2523c880cd0439fc865d0c0f4f50c87c40a339eebd80a1ffd012274fcb722c90c53a5daf700ce1f39024642c43f36bd56cac1154e678c33"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (938, '{"ob": ["15151515f6ee447b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a22dcb618473c52ca432663652f198847f203a3ebcdf8fbc6b8591c2851c9860a0ad3df1f28172de861a1805c413667049b52f06f39ece2ba047bfc94d1f0e2a9a03f0f1401f579b860b8be2b9ea2cc808b21703f458173792bd7949971d1edc12c0fccb19f3cc8c39b67804f81e4787bb5fd77b00ade37232e9364e718ec7d5efc01d81ca4d7328188a562e470692f84398e2b24f26c728348dd395fff893ccd64844c6fe9436d67bdaa5ed91a5a7a03a073a05f6095b53ff94d464f59a799564a040010b734a5fca68377f711de6b4b4c6aba35166b2ebc3529c2d0389f22c1ccceec7cb00f9a5b0fad6b6ca1a137564204910eb44f605eb497f41eed231dc0a07fbd9ff39bd74e1bd85e2d17785e20346f4baf0181d2e4f689b17780290dc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (939, '{"ob": ["15151515f6ee4445892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135826833bafb28395a8630a186455e3d150d814f3b57edc5607bfdfb057375c66fe73e21740205071ca19917bf6a7c0dfa9e8eea47c7e2f00f0db75b8f63d539858b207e6c6f4ce1842c6f375fbd1a29ba76d1242905868d6467c2501e4684060648f42ca82973570b6f3634d281d40458fa23112449067854de7874a4db9de603a569a0dc3f87920b98472f578e68c3737861ee685fe7533843336bc16f557d6318b6503f22a1d1f7af688952890485be13409a641b8a41611b997f49eb0305f811d0a84fcfa45aad89a4f32e2766cd4cfbf2aeee4697019e70600232fbbaccff0760c84621ffe75343801a0f57a39ee9f33ccaa3b09951a862cdf7a0c980360a3a467445566d90d3033faaa9383c4b3b834a56f629a35dd9e96dc0f80e3de52bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (940, '{"ob": ["15151515f6ee44f0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ffbff5d1514fd3f6e9ca80b8806771d58b7cc5d86c84ae619cb97090ba5df488ea5958fa02df2d2ceb73063b77d7eeb25e97cdf298378841c8a1c1bbb0d0330d12383d586fe95d6bd0e0cc0b071d5c17ad8f6036dd34a7b63bc5b34dd56524bf90d5a1a10ed7b9e601c37347d207df90c70dda1b9e02f171155e32f9592e1996c91ee73b9a879dbbf871d54d7460a93af1b9203eabca7fa6ed8ec223920e4af87290dea62cecb877628b956e79bb5f57a099a591d67dd4322b4ef3331712ef07726373555ac85283f191602ca7bff00f5a7bc41421daef9a156b663d604027d8b4677fea0107093da2e5d1ea996b3f91a1030589d6989ea262d77b55088ec3825295994869531c03713a06e5496b58d7fac232045f3190a4fb25e969928f4109"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (941, '{"ob": ["15151515f6ee442d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583668f13862e8e153704a5e088e09db65626333fef2a39184760a57c4f38bf8fc2fb39d64a0d3a2f6b1757b1d9aa524e7c336483e46be2b47be414eca49b52bdb06e6f7c1e3c9c399393226a72cce7a37d0f1ae2d52abab65532495793f983b64b7a0042ccd2ff00e2e964ac523c888565a724f9c24a02ec0bf3deca3646d145f6eff5ef46753541c42a4731c973f3f6219f8b485a42679b72ac941fec6ef9e9c5fff1d5be38147fcf350415fb7d0b8567e1610209b23651d9d29b77368d24ac3ce9dacffc544902aab801568b8e11cf3c3a017ea376dafca39d4b0cfe0d7d9d6750ae129ada29733cf6e6496b4f16619126712a904c7d5edc8d45c5684d3fe60552d8ad5737d7939276242f88f2f37bb543248e2a61c23e6ff48e2b5820424fb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (942, '{"ob": ["15151515f6ee443a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c9146ed1a4e4fc958376fb5783668fb5ee1284026d17cd987b181f86b2be5fd4018b6ed222fcfbdd7863e09d7c1a81f17adf227ee135397bb898dea8649b083985433e4bdd45f8399b12059cc47f3d90019b7e60befd920e917868697bda2d6c384f065faff83abac793a56d2f01bc45996e3b41707234c0bedd24ed3a065d370a80c9aa4fc4b0401fcd6f5c488fe2999b21e1673ba73dfd6f03d85e41682f53845be66a83957d0b20bb0048a3f75f468b748c23fe9155318ecf16297b7def175138eb2d076f3ce837810d724168f5dc206d36a5afa0f5fc7d16e6b68acd1c6b52bdabfbce7436370854bd92ae7f5008e3d1dc4be052c2b1e1683d5f7d37574f7b9865aca61e214df5a72521031142fef12f75e8b81fe03ff4227c4efda3f7eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (943, '{"ob": ["15151515f6ee447a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c4499ac860eb569a54c49ef43a4634b14d36c29e8621d01208bb8666e0b88fab68a5fe97b1870fe6ef183658cdde196f62e391c3ff01d6adc515a5c4d1b20883a0f8df4d242dfd94997461d6d7536a9e44de1995b654fb05d9065c7590da3dca5ce717f5b9984966067c161524634e00020bc99306e1e673158d13a2ca2bd4d48053979ed33c144de225ea3451ee37ffbcd86076032d9c801706a07ce3b2f4effbf38b38ea7d131477d08e3ac92179dc24e2d942ac690c1ee23cca89465f59c03486668ed58987dd1f69d5eb61d78473f1808fff57cb845ffe78bde3e50ccbd70409eb23a7119211a3b89f1fe019ffc6c01af06b9c4577fe63e9ed9268df5eee9fc8ee556a8780b28894b9a9a9fd1b8f7b9f6027e737a7a76c4a60524d335b51"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (944, '{"ob": ["15151515f6ee44be892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135817810650f905ee64256665eae061eeb060912f15fb175e67b2acedd040acc073c7c2f86bab4c984a0e77b967a269739b055957e0e76b7e19b4bbdea69124b93f148858bd6074058b979b50efa0573744dc581eb966f24f06eda3968022a68628adfc3887f3bf9069b8581f7476034015592ec8999ec3cf329c4f36d6d53b44802720ae429c6380504904b9e42a6dbde6b8fba05d2db181b336510d6047923c8e6b5913d28101a3c03d4ea8087eae53b7aff32589951ac5b56609580a8765457e9eff1aa76819bafed5351dba1eb4a03d6b6b64caf25e7ad03377867b8e3ac121c0a9ff51bba62ace12260c335a17b1296f53e4d1fd091c0a1db532c0a2100bcd8af22733e99b1e3130233417510dbdb8d7bca74e25f6e532670495864800658b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (945, '{"ob": ["15151515f6ee4446892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135833d87e9fd4b6c06f39f35a6893ee98a06c281594e4743a2aafc9e86d6cabf6325994150c7ad201a4f699bff9aece6482ad09516e425236468147d2bae92a0818b42a6b4f82f87ab77feb5b133fa486f1b2974d8228d7eee6d38c69ae60928fe2f3f7debfc60a851858656a27d5af8fa4cc275c8910cc0cd4d20470525b4f6afcadf31f9d98456674385e121c23e0d58b89af374f7cf0f55a499524abc4456e1e102a7d450211aecafe15f1908fe70e21190ba6654a4f1095d81b7f53199c289492836a55cab65a63598d73bcc1852e4ba43c5887d64047ace2fa4aa623fca3059b734d4f6fe6fcfa51a1de3778b200d746d27cc6fda1424abacbd74cefe5c3ba82d30fcf1d8c9c9d6d614eb4dd2a65726237bc81e75f27a6a6be50b083ddba46"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (946, '{"ob": ["15151515f6ee44d5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358515bfd0eabd4735336dc84d41e8399c42ffd2a45615814134f1d9dbf5a0d29e60bdee8a0d210c7edf5696e3c9bdf4541109fc437e015f1605864daf6149f62f55069b78cf5936fe679baccf8445e8bd2311fdef343f28f2f93fd00d29efa1221c417645a173e428c533f90945e07e1b3fca60ac4a3a4ef36217058fe31dc31177d723dbcd77df1d7ea69f28b66934cf94a44cce32324b7a0250c91096cbde000fff0cb477ff2042ee45b11c18bbfcf5566d4dfc38c66ac7898dde9ab12546cfa42173bd15461413a3b6e97ef7e40b0ed33200819276e473266153fe2a992f4a6e5eab7b6cd806770fecbd7188faf46a49370b0f640de616713fd271a92db8aaf533c24413c540747e032387a37e835e60886bc31b1ca5c1b8decfd628e87ae8a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (947, '{"ob": ["15151515f6ee442e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358211e7767916fa9432f884599307fc48ed086b7fe6f9228367a090c6ae608c04bd41592e13d9c96ce7316e43c9ef256727ed9e25d24aad2b176ba5983658ced1dbd9d95783cc578bbd2bff547a4b56cf03606b02a2dc4753e11fb57d7a8a843c95a8261ef9afeb6c4133ac9a2c41f6c11066ad15fa2b636717806b1a91adee72cac2d026e21624d85b0433cb3c051e68ca418e897eafd0ff1e729bb61163a5273eeec390844cf12ea6788d6f5594cd2fb45857b483a3677e528aa09cad043f44b8455601ebc1c49c186786982b0f9431ded4cf9eae616d2994b39be32e736eb462068fe3488707573e854b97dd7cb9ef72c490e2b791720b92010aa17f9b399702cfa81ff7d2ebcbd79eabb849e5e4a04e458aaab3cff08cbbc8854aee8b5a59d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (948, '{"ob": ["15151515f6ee4436892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584e9820cf2d0aa0782cefa5a58705154e5ebc12c6fc44fc4a02a2a5065fc52a271bfc983c7db4f5a2be3710d09de50b62006f682da02821f58805131c24bd9416d6e29d33a44367ea61711d1403ec7fb6de98af100c03d1380ad85912c01e38bf23e61b15c5e95b9b4cacb36fbf7b9ef17f332a9556bc43311d59659598ed5a927e42f7ef7abe99b7820cef83a40c29fe3279409f8a7bc598a917d4aab542859b2546309956cfebe1015353c89078805b287bc7f9d6447b0ebf32dd61d04bc034b26f914fcba448cb90a4fa72ce9808749ed76a6aed68f29c47f2a85a51a15b37d3ca942e58903545896cf7ac6193a6ffa8eeb32f3559b54a262b752361241cb78f178901972f8c6401b8900bc90afc4e0be92bc4e9160873c292c51b2ba196b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (949, '{"ob": ["15151515f6ee44c1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587f7422960d7344f626c3a54ded6e9128469f3bf579f9a1c5fd0d9dacc7a6f04c64a388185fd72ead44a2acf607baedfda559d9b09ff75f735bd05c8a2f21e1e31c99c27e1259dfd18d5e0441b7dd91a62994c0dc31e18524e56e4a31f65c4c9d857db280a8dba4adb25d9c7eca1f128d6230c768fa2e3b89c2a0b568cf8dc21369e2e9e4b7ff7b7b23f159068798758e41c6ec99b1a8daf5e3ea3adcddaaf74d48dbc5ee1a9f8779c053d671ef09a5f6e43d3ba5fc4feae76ce5d9bc2e58fcf07aa268de754b31679eeaed0fbb42f3ae0fdb0949e3f75df9c34b9bd4d01435d4438b424f1716a781d3fe540f0dc2a09255fc7f372da5ec7c7704ae3942ed015615ae7b0dc4c0036947467c252cdcccaa836b82ba116d9a50a3a03c1902010d47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (950, '{"ob": ["15151515f6ee442b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ee7db62ae7a8c21fd3ae52ad39b8e1b23301ed1487b5e70f05655c322367dccb04797fb38d88255eb875b0964a73ad895d4f2ab2a7fd921a5e29c882332c3625679d086692597ee5ce802d147be3f57f31ccf8be249f07c2777575f76bfd8a06070c0d318e583daecd8f550c7f73014140601f59ae3e31b9bede38dd031691f84136e979b429a7b381c3f8eccb18316f06e75c9a67237e27959c3e736ac8a65e07d0ba6afadbac650acc2e6268b17d7e3e4dbb421d89b2fae7f66e2ed81e0b412c96c4d11b758280cc082f794fbdcfdccce16cd0c9babb11bbcec999e801dbeb079da9cc819c31ac63c548bcc97dc40aff653f3ed4f7533be87b1a054fba3ef76868f50e2d6cc846f7b1fd07934fe9bded409bb334d8c6db7f652a6e1b521b20"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (951, '{"ob": ["15151515f6ee44fc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135805177167570d9e9293e95483c2a09b6bf89a4da62c6260bdc4f33ecb91e52a6c51be7a4beb3d5c14eb773a5500a71ac1167de5f8d9f1dd2d298b09d89b8554688b1c37cdbb76f2a4cc959aed2ac9b2962ec35651d898ffc606af509d5d8c6fda2e066a1edec9f352c9e620d1a0d0ce82d1d821837ea2781712144b0aa04148c605748085717640dcf9ff79722e1cc6445a9aa5f295fe41a2d0b1c51e6d1d7b41e1d999c4301470c9988e6052815bc3ef79f36076e0bfdc37bb131dec7689789611423d78f0238aff72f1e9b080c3f27b383f5f112e7699800c8285b39d5c0314d3e731a8d6d5431258afd56e9efceb64dc9a5e9c8e938244c0801d11677818be7b9df850525213ef34e63583e9485a7f08cfc20d72b82f45e51b5fe5720b2899"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (952, '{"ob": ["15151515f6ee44b8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f0800d456c71877d20e52494ddcc31eff5e26cd459e4d6fcc062471acd26b5dd00b3caccb877768376756ff93976382e8bf4175eb0aa788ff5be6244806bb1423c617534174324759034ae9ae89e57c948b8118c588660ce28ab2a223d724ae0876df29e4aea92849a06b7a5fdc33e45f916e6a9047d9b4444408330471488bef4f3286c5036cf1ddb4815e3fc474f6d09faf607721194714a96d26f2cde6a4c1dd4b39b1de1f9b6a4d217ae550cdf6b7da2639c0f66476ce0ac4b14a444d03f2d9d760bc66968450e5cacb4a65d44e1fbcd4d570c1fb48b622724f65c36dcf8a0512b48f846f0cced19aec9a5a578aadffe84ee53328fd9dac016f9dd3834df1ee0f497b6a81530bca2be18e9544d92223c6fb4ecc1e308b767e9aeb449a123"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (953, '{"ob": ["15151515f6ee443e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588416afc7aec41ae46a54bcbeb06ac6e9baaec405aa971663552ba8833e5b59888501c81cc5f09e85056b3b71e49f93976308cc12a22a358a42d69969fc076b68cbfb188c06d83b42ed5212f4566252bbe86bf7fb6065a63a75dcc9fe1d6872970b184cf47e1db7c03595813ccc3d5027f3159f9866ba06c4388a474a388f863a42701d00ef6a2202f7241a82c0029aa002dff10639cf7b896b863743c8b40e4884d594f993b2034df161c4af4073ebe1f5c2ac03ca712ac5b6245ce960d51d38c033d84fe0e20cd5b43536c3f8a1c8b1d7467586c21620549d6363d6643a493e58e979c2eade8c6af395f0464a4ea1831bbfb273d2cb823d2f4ed6a744036b5dc4835662e4c58049d9d18956ce30974e3e04c1dcbd69b20846fcf6aee1e3f003"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (954, '{"ob": ["15151515f6ee441f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358de55213c9ec3a614cf7bdcdef501b7e331b1acee0748204ad727c9636a5abcf153e2399189f33ca0fdd42b109cef704232e4ea2996a4a1b06136e9551d5827582e92c5e68af2a0828ec7c06ef492f962a3a2957cbd405555ce70d3fefd45ead2a3e70e785846d55844369b994405df77151b4e5ca71190f98d967cc490d63f4088477a36e10271e56b4dcf1aee6210a221ebbc0fda76369acd87f8b14fdf94a627be16b3996b0e5a8315ea1e974c7325c200a5c66cdeb81267b40125b9a357639d47a545e4d1e3a6900b5b51c369cb9bfb127a1f011f3d6f3beb06f2a7937d792d788f1c1e92c46404a764d433cc1d6de2a3ff4251d7bfa5d6bfbf3563073a1bbc69190cfa7489e2002ba4a8502cdcf9304a515399522c06757cebc96f692dbe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (955, '{"ob": ["15151515f6ee4420892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586facc660ccb5569d24388e02debf91ab721afd22c6b9a6f4ea99ab0a478a95b3f066f07680a6b9d8991cc77c1046290def54899607e376f46a0c49e0eed3f591d0403f4628f65fb3d9f96da51568bfae69908e0faba2cdcf544346b4e04911f382d067ac4c17c1020d819f9308886c845824ee52952393599f4a263c455d078110d610eb2cc689f9b8686a6040b3dbd13092ad5662681793bc2910c2dc5cc6eb8dd9102f7a6eb662459e492bd118d91c0eb8867a7df75410a736d4393aa71716327766131d863f705ad9a5fee981e1478935b8fe1081e02aac4e4d90ec68aa893bf885ba2b99c999a4c2f905d25adece9ecf084607e88ad389d997afe2309a9d9abff9789b4982866062b8ac343c9dcd8a61e4c3ad8637a8cc2b9c21aa3cbf57"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (956, '{"ob": ["15151515f6ee44ff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588d720c6c2a1190664f5f7ba4ff5ed4fe0696632b86f8ad200a04b09bf0bfb029e9bc243d9f1e20e5428050dbe100baf27f12dcdf879c84a74ff473df7f0fa466813ca3174047a85ba1b2562eb3caf60d1ddee919c3d7bd729d66edddab03e7e7bb1fcea2746a7ceba95ae88bf7bab9198c1803cae744d006a96cc7537c1a6f2ff1465c1b917a29685043e615e7349e745b0389a5a10ced3cbbefd94c8f4402051f518030b598ac47a11693b77853677255353172bce2ea4fb991663ab555d878c90f6092f81f0333507b1a78d5a5b3e4c39d8759f847c365cb03e13befa97bcaf9ad188c4a0ff2e4a24533cc3993cf41321e587188160d929822503dbc1d29540066836a08e9f395a9ec4157496182379c19b17be7c58cf469756b3a32af6188"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (957, '{"ob": ["15151515f6ee443b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135819ddbe204521dfd71ea773b7828b49c27430d827d5fb1723d1889fe9061842fcfb30ded49c7b0f0cb4a01636aff104826281185bffbe399412bab16192111a441f300894b95badce9ea9aae5b90e964536e157af6849061811f4a85f1aacf448c0252048bf973ecf4983102e7d53e11bb3ebd7d258ec55c8e8808184b0e93da03a5998a66975195293824be936aeffbc9163f8a4f58e0d1e63df1d859e6304c8cbe893b18ec6b35a86c55c1b12c760cbcd8465bfa32a09675644e2736362f85e835ed19c7007055213ea15a6379571d11a4ba6f2635d7af702e95216ff8e4a1772825c4e19c40a35b9af0610032f93ecf1eed2449c42d7406e342993404e7134993998b1174897d14e509f8a04e1a6e83248676e50cc76de75734099fcc671c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (958, '{"ob": ["15151515f6ee44f5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dcac4509c57890657307f1f6386fc4d92aaf60990067fb57b4f6d2f78b3a7e46603c05426b4dc9f781af63274f91c0c87afbccbe27db2ec8bf5ddc5cbd15abe097fbc3ba2ef1c70f6d89f1b9ac6622e5543bdb1da3c443ab52436f3ef8012662bda21b7e5ab00ae64eadecc2cd46b4fc61ab7f53323d3660d9f1308895c962caa4ebba5509746c750cea7df83b3da14bcdae02e0fac3aba644c5e56878bdc50a2e75956ad2d117847460449a79f22e6f484e0837088bc3c0b6fe16fdf17f24df3335eb4479cb27ca80124209165e136c49b8b484ad2d16b279329da00df31e203d646affcf0e69605a03588f27872539bde4a252b542f856f5b8b9a02f03b614ec1f7ce91ce12ca5c56d2887f10e0067ed87f44f77858603bf472824caaf9de0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (959, '{"ob": ["15151515f6ee4426892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588e818c00863a9b5028f67832c1f60af05ca7c4e7111e7b884f8a967d642dc168e70ead184e72d0d3ac84aa979dfa3bccb3c5d4979f4cafa6584dc850e7b8650a921f1d92ca86a2b586292310282825c6a0082c32eac24d888313405ccb76fdc56ac8ab2158ffe16050e68acf5d7e0ed4388418186607c51bd75c8062ee7d8f27bdcc7c9b3d38f264267384f2a6b05a91bae6505de382aeb98e46e829ba9e0caf392f6190bc0b30fa13d973680c0aef1dcc3c1051ce4f52f3c419fd840e31b1b85ed4e598198050ccdb6b1b2bd96696c0cb8b69132de6d8f23af39b1f1a696e00ede281927e62de97c01030c122e2d0c430a6088f70e2ea28f07dd17a768d45dd49b06f231e0f2fe9f945068c1e38cc5983f2d6639bff64785b951b2d36f67ede"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (960, '{"ob": ["15151515f6ee440c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fc6be320cd1479b17ee0b80a96d1b35bd94575926e59b8b42ad104b5b5a997f18d38118c01128b5bee40e36e4cd298d05836086d4e74ddb719aa5e3bca2700a5b0b4cedc1e5d6b5057bf1ccb66353a309fafb8aa9c17b7c85425adf6bb4369a3f39bd1ecc731acee285dd0da48900b5315ad4e2194f3077d098e60e01a89e58f00a126e949b5f4d21a32c860f7fe5fc225eb8030fe48eb28792e7fb349ebc42ffe4c7f7fc89b85cec49cefd2ba03166de00d54a2842caa06c759fbac3299145a17b022f0f6dc6f53592d47a625dec1329e70514d2a8b557ed3cbd535ebddee94c2874e9433d51ba9a15a574703c4606bbc6b5565bab363cca7dfb161cd46d678c29ddc2088e1378d613c2edfcf00835c92c619d2aee2a932dcee7f78a10b53da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (961, '{"ob": ["15151515f6ee44bd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135837544f621d44eaf067c1660e1cb13eee7f8deab65b54420534ea32f2a4289faab00f25741a6e87d741d6e8618ab3166a9a8230aee7c8a31e9129f9fd4cfc7bc8ca41b8483086e69046898a54fc423d989df4c2acdc9a1631c7c446a53db82a752f18a167340aceecc3e76749792d78c6b62eda4218d9cb60d09811b75f590c7d7d25281ad3174074db529e7c6345c41d14cc10b423e0bd2025a495d397993ddb42c50e73aeee3965a02aa6c7ee3d314ce70509b8fc2682c2afed1e346dff225c2aab15ff98fdea99f6df9ebd62468804e38f504e8dcf4257c6ca23a772b6384eecd9e7a1145f9d69fb3fd2e791d83a9dcf8e76b0321850e67fba11aa79c3f2c7214be55b0a351309ca802ac4f6c51e73be90a3e983c9057ac0dd480fe31c8c9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (962, '{"ob": ["15151515f6ee444b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358203155700f9f0c06c08fface7952876599d2dd1a5922ed0145bcf153d487d4ce06f1ec0b73484d3999b61ee0805483bef3aed4509bce59507acb0e43421ab22b4165664d19957804d474705b0e71e75a7d7859e2197fd62596a26daa4afb78f4088f9aab98138ba516978d5446435667cbf6ae3d66538f365267678173e265283bf721260a5bf50b7c8e614ff8bf409a51b8a51ae3fcc45ef12db2dbbeedbfb8f35d538b9acb2cfe3456d788e1e0928d91c2792b00dd25da3184cc1d4b0b413f177f5d6036332802ce47339ef83970165d0b3e9556e99111c9407fa78eec35f629a290f75e12abb4c9978695a916505a852786504a5d7f5df6e9abbbf5cd847364da073cd48604a6ba795a1b1a55276644327ab84393d8c8a0c26882f91f7a93"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (963, '{"ob": ["15151515f6ee445a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581bfb8857ca4d37a46a5639f1c2b279d3242b885ae52179a62f3a4f844b9f154bf516f2504b6aa58d2fd8f44a0a089124d3fa9d10ee4041be50a0521fcdad14f862da1fc423461aec29e8f32baf83fa6efba65d66bc575d1f40d49a580d09ed52aed6281c21e4d56e744df08cdaeaae7b58c19e8a082ff0bfe88f80daedeef07074ae2af1bd53963d4ce5c5157b40aa76c89bb78b82b36a248517f5a9b47e74b4f319315be6742db59bd6f908e872a3a2322f78187bfc0a38d278ccf1282bb1799751203e3c759807a389f86d33c70ad18a9c41cde6809fed71587ebd85371026ad8d2bfc93ec55c1f38783c9f6af6bf492c20a60cc2a90a540b3dbe47b84418786d201091f0f9d628f0b0a14b834e03169bd180f195beeaa92987188e7cc783a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (964, '{"ob": ["15151515f6ee44f8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e0ff969710d4fd76fa354e393ea6acd09517a6dc007f51251087ea81ba40af5a5913f0ce1a70cc07f083573daf1b4f87e1354ee0318cb729f3d0c2d50a4e018acf4359bb05f197e1c7199cf19781f89f41e6beb8df975e4badc32ac0556ad1d8c3683d4fa0330d27b7064e463565c567f336fbc16d795866b15d1e5a16aa9e418c4a26e9fa107c17d967e467582b2fa11cceb07554c25e881f2cb79e19cd2caaccca42826e46978041d3821b7ba88f8bee5079b8e978b7ac6a97c3daca4b1d360611e2ea8545489d8d2f6b092819edb4628e6367e6817bb0719cc291cbe695a26610f742e11fc22ebeaaf25929bd80c4dc38a83529b391e0a91f6599de6ee2fa71eff49bd2c1c5145a198a715d105528af6ea75beebfaf0e95adcda05cd559d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (965, '{"ob": ["15151515f6ee44e4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f2cae8dc65af5d230d830b7f69b2ecf0fbc50b62a3bc13cbc7dc5cfa08e2deced13252b95ee85208527482c59190181c2d54c7702325982217ee822d494711acbf1005480195e0c41ef431a1790422b4bcca8691af8125c0a12ce1789f92ee666c6a43f5bd08a2c98001b4750ba6e49a766aec6621edc2102a8f0508cf40d2677b797f0fadb129cd39996982de89b56bad2c0d8a610a4e19bc997bd5c18d37e8e43b65aa5d0fb6b0236036539d1c7b09f0be4f39d0c84ccd014a20fb99c0c27202e1a5309c9e9fb1123e3413b6861b29ff1f65a3540b23b81c357d65957d8e3898447ecf13140443ea02e7d3b99a505e59a76a780a4ad9a5668613ab23e7183872301e75eac3be8a28160c1ee70069302a8be2d52a55179fd39f483aaa66821e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (966, '{"ob": ["15151515f6ee4493892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584af828cd73aa7fd80c916bfba975f6ebfe49b2a5099c333d5d4b48a1cf7803ed568defeae1ec3dc955886191853de82cc0e176e31828e261a760425cc4a6c98c36fe19da9ed85515240c4c70c134e3082fa18ab39acacd68b337e3f370e5190fef9ad9c361b003006252d9caebcd2490b86d609831e2ddb8a2898d8751048595d0248a08e21b2a477c2b53e92eb14458d9ed86c2d99ec165c21c6233b12dfaa1441df6f7a055d89efca22974cf55ec3c5068fa7932e6da833e218821677121e503411d40a5b770cb6984dc2d83aae2e76234abde1b614f5e3368ff7b9a2b5a4199da68d784596d3b458cb16b7418cb80c18a5a346723bdb36bf59590de24326b6987667dab666bc3e4b3afedf2ae93af5cc8bdf4d22515ffab4c2c97cdc5af23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (967, '{"ob": ["15151515f6ee4444892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580630a0fc641d0efc8a356abc6af05f25860906ace4132d3698d5a6b187a906ba4c56d09247eb3560a6094be95b1f194577554def75b085bcbe79e8495da44c21a1580c89ee2fd923869a661fc68cf1737154dec184a5c08e0fa27a737d79799defa1b081d22b0468d004e62aa55efb65c361ef1b8599a0593bfd1a137a915b70cf03a054d44088e02dc86219e16df3e46c6908e7fe54dff065b32bda179139d8ad5cbb07b69f383ba3a70b8986545ee2841ddbafd82dc97cd19c5833abda675e60f1e303020400bc8cceb79804815b9fa251bb587fe84475c97f0c0fb07f99375e6c181337ae2be359a55efc601ce9e4e3a4fee8943e26af804747a5add2e06c7558efb510c4b309cbc4213363d4bdf6f8f56de952f9524e9d2551fcfacedc1d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (968, '{"ob": ["15151515f6ee44ac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358856653241c74b1c5d575cec8df7944e2f0bf3f69a41109423d654fa87c0f314b3648c331a1183c1f4d3c2a0f9a8fb14360e54a97a8c5be7696f7e7cd4d73c5c9a7bf6f5450b0a3d2b81e71b65639496ed903250d4cb3b437dfcdc567a52410d1c3766eb40d139d453ea818e10c46dee2568e10582506023b510974d6b436e8b27551abe553ed6e07c3122ef363af6de17516482baaa31f3eb0feb8f4fed35f3a5afd8280d50c61de9b5f8da0c05a86f5a4ea2a0b67ddd1d169d607978bcb6a4f5a899f1841237786b1546371bff5659338bf11453a2b2bbe056606c5fe5620a413b42d6d5909504071cfce7439f0634b5690487ffb3a023b4607d45479af4514a02782193cb0dafd7c726d21cd362020d69a88523065e8286e50a928d0dd8f64"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (969, '{"ob": ["15151515f6ee44eb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e184d84adf664394926fd5e9f5e93c21441c3a81bee5fd7a8d4fd2d5bbc5ab6311320fc9ea4825bb75053e33d3c80159ce6be585ccb36194c475547a0ebd7875ff5833a68dffec750b4a5bd1a08318332aaf24d3b8644c093da26bdeff25044378dfcca9e52096e5d1ef434da9dbdf24e636ca9f006e0dc60ef2f533d83531263ee6d8a72ae5d0df74139fdab59360165bd7fb645c4cc129df9470b438607aa77de4ae02751a11f7e1de68c417a7d83224d2d48bc5ec6c478cef3a5e2001307ff893a79d5cb2603c4304c45e8bed06d68f5c52ef1bef7e2e5c400c3c8473798a14391967288d7ad2ebe4625716e24d0c68e7a9102e2b730888ec5e895e85290843c0b7de64ab92d0bacd5e0c00ff1516670fe47e40d9209e2bb878153409c2a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (970, '{"ob": ["15151515f6ee4491892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582abbf58649f8c50a2bdf678195379578341d0d811ffde812236fb47535b5003e7628d221f7c68c7fede884e98a36baf71b2972455347919603b1ea95a59dba51ca0ce82c8013537254cba4c8f6b3502fd9f7b166f4f8a9c5f1bb4f260a1418ecd8cb011b9b395c2288fe2b79800769ddaa8de3154d4275ef5a41c77eac97e2cc353a9439741e5a92c1b09a22bf99973e1ccc86326f5e06a431b902957dc4c99d5259dcb3b1f58501d116a158276fe11eb95503f77daba945227a4d880f024cc51b8859702e2fa3495f54ead830da980f7663840f987162c09ab3b8711c9b27e9f36afeabc1cbb59ee0fd46344c59a780c33cc8e866d2f48df5aea19d599e83ad492aa26cb53d7576745089ffe5e8272074b908f096837a3cf8d826a829b2ddea"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (971, '{"ob": ["15151515f6ee4449892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d11e1856b04811d53d0f563bfe6278121630815899b73fb267a6c93f0f678910fd2504ce44f1c7bc14d31131569d6585d7c43e07f04cc67650853acb7424157c8d78aced209487a2742ae7bfa2208d35fdcf4ab2cde842ad29199e390a9d2dce9505378e1e24553de387cb2ccc28e140d62256763e071a67d5347eedded932776523f50ac3577e9fbf0aba39da42aabbd6206bcbc9b2a796734b50bc51eb53de9183fb94f0a8a443fabda0b79413ea1ae5d9be68a6a6e2a57da4e270f01659086792a7160d1f0d279232f26a48e556f9acff5fb40193ea30af7d255adf27549b6a9633fa8217964b9699fdcf09729fbd61227f0b3c5c0dfc012e64f115c113e1c748f11ea76761c1bf48248f12158a7754e0a4e1363aee87a1e57c010338c1bc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (972, '{"ob": ["15151515f6ee4414892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588efd8df4cc1ffc9b59c0e9711e3815d7499157eeb2673915c260feb24af904c194cf6e9dbfd18c92b3557247b50bb295cd3ec1bd63f2ac44f5b52fa54cc83dc6b783ae75e7c380fbfd8633436db5515847c1a7d90dc5722c3d3ff8651952dc6d8894c18b8b698dc9cf6b4e9e780f52380abf61f0054fe23629a05abdbda1d4535fedfcde39d118c7ca8e55e6e4930cd6cf25536e55b17b965b4358de4b3609b719e2fed0705925bed2bae6a1c167800afd5d3749c17785aadf4d9d40eea6c66ba075603a3e4c022bbf4c6ab81a6e5fad9319e2fa3f10c4bdaa2335f3483e45ae654ac8a8dfc70d8396cf13e02cdc4081c24da208cdbe898370b45c4117c3fd3e424b6ac327d439c03ac7e4c3115e73301aa6e51c26a61b6ba06b0a69632af7f2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (973, '{"ob": ["15151515f6ee44ab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c3bc38c38b4b787ac10bddca796a833dac41b452fce0ded73faccc7178b577a94c83c2ba67464dbf216ad7518b2447882e6db93fa361bcce60d2c1da40eb29f9c58b2bacf56015bd840aff66a396e5b6fb02529ed46033bec3b1965415a3a6f2c597edf2d71cc9ee15174312b6e8742dbab78a4cd8439093df00c7c7740de39dddd835c92cb1b190d3c17daa87165a81085e6897c315493c0289f5a031b6b01c4ff36e231a2a26c954b9e3bfd0c31c7b10d236d7937b4afb38997866ff2dadace12d04fc6d38e8029e1e3e06e574c5a7e8877113c4bc5b329c8d55120eaedda4060aaa6ac9cc3d884ba4458581bf40650d2d02c14414fdf0072a4e25d1607e7fb9fd53a89176faafc7dc7b0a1be2b1b88be489d41b19201a9b42694df18e3b0d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (974, '{"ob": ["15151515f6ee4454892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135854c66f78e3157df309891c6ec4d6a3413b76e57b462b91d3fa1a46b1a85e05dd5fcc7f7edf4526c6a4e9ed7cc4735c49dde817bff15a066763bd4718583651c1041fefc28c7e144e50f01d43edcfd0f66094601e7e75fcebee52afc22d51561f1741abd1b6a464c1516f6444d89e2b30efc10a5186877381d9cea7a0f1967dd6b86a0922b42ca549d8eabaa4e68de09d86adb2ed13713c8f82abb27b8c5ebb41f5a680a41bf3226a3c2b33e12b0b8132c9df4a5e9d83379794292e365cbb99cef84219f7ff59664457f434744a4a88db7eab2429bd0f179cbfc5bc85d08d879f5d8e7499a03e2a29612a07d07dc0f990ee2e68c85b4e91e074a36c4113276367da924928bc338d8dd6ab6aae6ca05ef4f1ccba86710fd767414abf093c69bfd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (975, '{"ob": ["15151515f6ee44fd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135889a21e8c77b14a57efbee2d57155065721485afb5ad09996e468e6668439e1774552f9e428314de223126a8763dee4e47859db697fc785b5d717b6df30dbf0517f32dc95040fb6222a693cc8eab39b4914ede54898d548c4d9b17eb86ab5a72d996689da9f6d37e05c2ac7066683124a2460cd7f563382c4958cecce65a20e2864a427f875970c3d82bdee2e4552f29a91ef7997fa29358de3606ce62988e90ce3ec1ba7ac438348447325f7779c0de146c92b66c46528f63452b7f8c6984c6bce527730b0d0cf4799cd72e72e4fa0355e1b7e0331e1d1a2d3b236e7c9d156306b911889f81c53082541b58b5b601d5c45e15bddc593285bc108406b9a92eec569239bae71aeadc96ecf7aac1861316159143acb2acaf1a7f246035b2a53b19a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (976, '{"ob": ["15151515f6ee44e6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135887b7a5c17a1eaf53074d65edcb9daed22331619f1822d51663852f9076ca8115e588698d149f5e16de7bab949d1c2924a47e6cad18f20f848a043d6eb0510644b07b3a1a31428f736772d8679d011bf567663862b4bff1509b8f4322684ad21d412caf6443766d02cbba73e18d6d76f29ad7fd1ebf713a9069760ad52547cd055fe0dc91b4f60b83963be0db7bb5d4945b99e8be38d04cddf7133bc9380d0a64f0bfd3be3547e79fa826d287ac8f3ce9c40cc077e3cf0e44bf860a28709d9e9c8d90a2b0e9ceca3e92473b712fb39477cc9875c315196437df50f9fe4498dfbfa535edc4a6d44848a7d00be7cf12adc1c81f9a9f766c4609fc327d0d9724f7adcce4fb470bfe6b3a438ad72aa989e276e3e09458c5d0948f0393ad2d4ee49631"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (977, '{"ob": ["15151515f6ee44de892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f61eaa9a8a6f539630c56298b477a812b0cf17cef56537521ff57fd90fb80a7c05ae1329488739be245a39f5b82692fd1827de770b0955b30642c22b7ee562b7daf9a2c0fc6af1372e1120b2c268be341cb65da8ea05412e8fb31576350fcfc010e3a31443fb326e49481b62a8e86b10258deff7007c110b3181a6d9ad02941cb50724c31f29d3efd92682ba34fa6a21fa65bb2b1a92cf8147829943daf785388019877ae7188ba2c41e889a022cad0837cbc62dbfff153e981d493d35e116caea2889b706bb58c5bc5017699f417cd7670cfa6161aa531e8d96905cb0a09dc88f5c4a9c56cdef10f29d8f4e01ebce771aef7cf5443bb1a5be0424c6507ceab1539c720d8df9413648c8022aa2ae5afebb5a38328a82d773fb9f99bf308d9ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (978, '{"ob": ["15151515f6ee4450892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e6df98430be55c6416e4f030b34dc3142b8423a4a319fc7de06912294bb76e966d54cc554559d01215b6cc6573eeed0ba4981273b6bb1dd41955875d7a08676ce7ff15f5751583e7527c8418c8edb69163d8cfd88bc46a05e7ab4b67f1dfad2c4c5a2eb40db011bfb2d5679922abebce0e8358df295e84fd1486eac67dbb9f43c27b678a63184c8e8258db43c23eaaf7906fe1dc792a0f628a375e54492c86cad3c1e3c5c27969c5a1c4658d0cf50abf2dbb78a196c754445089204b1d719aed0208fb0bc32c1b27145560a57c62fa2c1d5daec1aa27028e317e2877bd68ab79a328602d2b6e0d613d98210d2ab2ec39337237b649689e5edad375977e473aa11beba8ae56a61ac2df5f82d206a5c6b48cc5f8f2e7cd81fc1b6e1d34dacb87d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (979, '{"ob": ["15151515f6ee446d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588e108406efe989185191a398ff3af1cb86b20371e4e7144d719f88b764afd8f23a253ea89273dc073b56aa9fa7b4d1c2de9fc416a69a4b7ac58703b6e931d5ee8aaf9dc17acbe14e5758e2e79146f780f79957999734f6b99296edee6724e891634aebf54f31cfc2e76bfe41814b27072e63917470f4451c530ed63a272f430cb6ec04ef1c4e9be862d73fdae319dc1f874f0fe51aa3817e2874d591a4ea6046676df28fed6a3fb8e8c153f3e3721f04b57886cec2eeee91940114d7fd9cc6d2f093942ca2fa4363788970836275d3693e2fccbde1eab0eb07c07cba1ad0f9b8c6657c68cfa83885cb976431123add4317e9887374c34f842cbcdbb555448fbdaada05098f54e9f81b596c65a0ff77e9cbaf682925fbd33fb646f7d2d950818a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (980, '{"ob": ["15151515f6ee44ec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135886fc3e00ef0fd701ea9d57cbe1a6ceaf6d3e0845b855e44eec21cc240aca5f15e802de47e594db835b5945f44b4f2f83cbc664db7c735b3c214cab258c1f3850c5eb16b2cf745b0a092fc45063b5df6bd385e97b71b51fa839a8a55aead72db8e1d23707c2ade41fcc85781d60db34c7136951626d73905161d31a5847fba25bed2ae24fb340f50363e90e93732698be30936a04f50bb60a348e88c7c395c77950d9001a2ebf2d29e7f6cb69ecc6de82189efcde6776267184fabe2df14c87a1da77f00324787ddbf3728494f83ed8fa262abbfc13742cc4160470eec7da329f4cb075f5224bc41d8dae8e2fabcf446deb2a339d84d2f58c946e6401e29a26302065814dcf94993ef78d04044c6152ded407c0802398e7c09d653736014e55df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (981, '{"ob": ["15151515f6ee4458892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583b69c34524314772a3ba4a999d68962916f11d343fa3b03dc8e44c7b54eb793e37101f6057cef3c5ba745aa6d5e6180b83c113c5619c232a8596792d68bd12a89138b6f0f93fba4d12e20a27cf332ad2bc578eac0f9b4087fb08933ca6b58ddb6f625153b6f0563a9c173e64f65e19bacc56f995e9136ef37b43bc5b92acf8b56fdb2ea3e828f33e672c3a54136f59c5defe832ae1c0395ab518e8b1ed7e779ad41fa6674bdd27af5af71f596fb93813c7cb4e17b2c209582dfe0334d1d47b0b0a4ec534c790fa3e861e83b3aaac200543151ea4be02436e7f014cc8637b0271bc840397fa90ddf1af4c6534e1baf2ced7939867867f47e359f191608f2061ce7096c79fbc6e374eb072ae6a4a22725e406f14f8b9593f3aa9e2912b06a21e39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (982, '{"ob": ["15151515f6ee44ca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586b2d9153f0c79b7fb5e573ac59ef28b1b6b850e5f48954edbaf8b61e3614cb572e7829c74c77b76361fd539e57a5fddd3ae9d5695675abe5932b701dfb5ee3a3fef3cdd92a642962b33873011670888a0b6e90c2e2ae62e238f96624a5dc6525b06eb23bc32cce9f6daff97a0459c7191df91206962c1f6b8f8f113222a80b6256fe6f36c91407162c65934709e39e53c1ce3612e13252c79488af81bea5c23a74215660d411579d5dc4d224677973b3881f63ad240ff3eb9c82b3801d32b596ab975c118204a89d30a080881a0e5eee0bad2775ee0bbd88612c5f2da5d3ec8d536cca73566c0e5688943045d61949293d6fc4d452bd3dcaf2aeaa8466944062ceb6f7224c353345fb7a7e4b7f6919c1b169f554c724043c62be29c1c3d7ef4a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (983, '{"ob": ["15151515f6ee4497892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f0d7fd791f7fb65757e661b825828551eddc78639f1489f4780c9822b51a0cb425437ae598c850d20d19cbb260c2a9ac0aa0f5935c971e8ccc88208bda6652db89ccbfabd6d73bc1f9f0a54a5984165e692d43371fc28615cf9654b37dc6269dc67546a271cb839cf7e971941a97ac022412e342bc3e99785c23ef7f09c73b4333e3da0bb98e50270811f5d10ab17af8040be5ef5877f532dfb4dcf09615ffd30fa592a4bb74b81899a747c55bef5c7be15b9db5013383548be91c391f8e7e3d9f53b6988221dea841da807f61307f07622b008777521a0eeebf49b1dc7ff58a29d6dd2bb09f1c0a64a0f920ed74190aacc9436da9297008ce5e645744f0a49e14b37d2bef35943fee7658ad1a3a86c1a5e3e4d952da95781b2d70537ee75c30"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (984, '{"ob": ["15151515f6ee4434892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b4a7032e1861f99df4e8b28609c7a3232134283176b6309d12fcea076509d30a2cbded1a890e1fca5671bb4fe0cb99aaf06c75f15ad584263e8cce3da630b6a6b435b145b87178e44b9b8ccd65a723788464eb84e32fa6e094d4ce69219150f30d382ea181db41dadff075990a3ae891cd438e0b00df9de6f28806c8f82df4094a1f7e8f7e9c7d365816a2e533902a8296594425d7df1335b5f2af88fe7af999b07807fa54fb025ba24087924477928d4df0a6584b485d9b690c405de1799aa76ffc25db50e6d008da050612b4c794077ae59ab20d0efb4190c9a37cdfececcee9dee6ce6c47cda5b950ef290c095e3d44480f082b0f7abee84d9f5f364c2bf8c1acd799cce609d25a947c427f516a4ee7f63fad7578d26ab2b6f81b85a14972"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (985, '{"ob": ["15151515f6ee442f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dbb2c702017c7aeec564734e6dbed61e979a5ffb76351f6fa6e793ccf570b1b2d814954bc04ad3506ce792e0d67292bccbc7b72fcdd2c5e52b0390a695266ce288bd7eda2e4f13cdcf663ced89c2fe56164f402bf1f7184a731a855b6b344beaa071b5d61fe1318bab108c359e73edac6ef194f99b93d811266b959c09e645122cce0e2b622a15cad89eb61436812b38d3921bf0dfa4aca423c775b54243335b88b7b75997cbb1f3c538c841011646200a7ac2ae29e1979850b88bcab5495bec6a9d4ce9e0ecd60338a7ddf431574fae170762c4476935f7d4bfa00c810a1bff4dbed9132096916cb2f46d768497a6936419eb187652d244dad51a4f086f9d10e462c3b1298f7238a55e071bc9f67949789657aa32a5cf76134ae6c8d1fe443c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (986, '{"ob": ["15151515f6ee44a8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d4de3ee6e7a04a2a0219aa679319d0d5ac219ed3be559d2f50f4be7e54308d691fcd5ed4ee986a3dc3b2999e9bdbfbe7709e738acb733969d56a5f6e595555b719e735fc4ccc7b6adeafb8b4367c9add6e2241c78eaa0cd866eabfc3cd8feb18950eb4887200757bbba72b5e056ba03cf6e8a5ceb85c4de4262b0f43ee485c819f573108388de17f397791972c3956173951971b4416783ae52fb175cd31c4c13ff884450c10b455406badec8b38ed3b1b96f3de1161b0aee6babee2e22c3a3bdabdd2823ebc0214ae621e02282648a73e6ba90a72addab092a99228000e773cbc00047624cd5c2072324b497ab0760b815f15e98837cb9d1bc2916a71ce2310d77f240e0c739f6366186a9df84fc5da7cd94a52afe6e482ff23ef79c1285862"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (987, '{"ob": ["15151515f6ee449f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582ff7aefa915ea000cfb45f95aa8d3734ccbd27be094f3c08325f21b2541ddb6fd7526f43443cba475c122dca4ece0c87a7f585a99842373539aaa1b4f487f2412dec48218b01a544f2d591a8b98f38249d845255c291d069709c90d2e22552e59238b7bd7e742080dc0443f96c42d44559d8776f76a4296aca49ffc14b402d9832eb3796c04a8343bf8d4c5c092e0baeb2f88165d1cffaa1d11c46c1ee04428e132fcca7e2c3827fba87173511d05b8eecab65f702a067ace201e34fe4fc1d6025dc0234a5b363054f4ef2f7921f16a09ca2dd936b911c50214fcce0f8f0c9f3413bc7984da7ddf1774d5a865b1d16089e992f505fa96141512a01204338160e4b80157b8b1e70ae3733e32dc03c23efc02da74c273ceb69f7f2c62f34b9428a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (988, '{"ob": ["15151515f6ee44d3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358df5b0fa9303f8bce078d9c4f181896f7ed365ca10bb5f835391f6b2f568878aec4b671402d07a85ae5df99d8c2dc80ace6db56c562e4f6f08d058f4f6dea4bc5fb3d259ff19e93e3ac01f1bf71bb350a406f2292d1166a721e3138e8918d7f54d6adf55fe843d48d687cae7e144b3a98d2fce7e33b317a1196cacaa3e0aeeeb0c16f4eac04ffc88a91b58ca9fde3c4560f3c11e137bb59fc680f8d09cef1b1eb969202c6561295aceebc695790c0d68505836cdaa1efef5bb475564937762d27ba01cc6e1fa770289062159cb2b77a8cabd8fd654df0caf5ed8f4fa036da531194aba7ea1c0c09819f6890cc7298dcaa36a5a0fa2a34a1f073ca74edbd464bc5e89896b365b2052569948a166a33d3e9051bf7cddb892deeb5343089a280858a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (989, '{"ob": ["15151515f6ee44d8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588d8790c56afb92b22d35ecedb2be5428e5d6b1ee6c5b8c5c2be729e69198fc503c28ef2fafcba3a87f2ddc22c2bf742a47b0d031e49dda71ef644345ae8101a16cb2b0bdfd24ef5abbbec7ad9571788e5ed351974d9469e546fafb3846de35b1262b2c4f8c14d063c031d65f17078eeaf4f0d99433bd9ce29414de86e3f68639e930c7fbea1eaeacf8579816e29055bc9706b346f952c46f62d5b0b3488f0f0fa6a44982eda6ecaf6cd48effcc9ca4b600e048096633712cdd2f891996313574fae5d3dc93f1363e94deff230a7906b25ce8d1c4651c0a5c856db91717e280cdad4f65766bffa09ab15d75ddeb95139d4fcaa12be13012204b46ba27fca5eadef0e0820336f2da5fa9c3233e481b6dfaa1b29b56d8c1f782ccb0353f9813f98b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (990, '{"ob": ["15151515f6ee44b3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f9b587f4fbe5505bcbf6305715d349379e11b08e7d359843aa06244639d422ae0e0f7fa92caabb4537bd68356bd8712604a94b3ddb4a17e557573e4b2a20b712379afb819daed02bbf4fc851a1dbcaad6476aedfa5b0585065613a7de035fe6507eae7d45927ff2805cd4e2adff3b7e2112116485bbd6da55a253d617a82b67cbbb0f76b5ef4f598ef8f4a42638de2b8f8fc75a386c910f79e25c6f13a3d875fc4844882aa1f3dcac9e969a244dece1df3968c1100b724338911635b9d1b9bd661b2598c1158a2cd719ee0a35f792be46085d16c4797e50d0ce1d1437eaf8c308256b6f08eb85cd6a87fcca885e90ce26852b5da20ec1e252dad885b0e2d59dc4f08bf69cfeec6ce89a78885a5d1f81ba72cf7953907713cc413d7d4f63cc5cd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (991, '{"ob": ["15151515f6ee441c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358035e115480859b9617f97f23678219cf97235eedb31fd8c5ab722800ee47e00e1fc02bec142066d505bc4851403562821bbb5e0f74a2850e2b3dcf5d9cebad43732bd5935569ce463ffa0e64a07b6ff1480e6940bad7fd49bf834e8ec211b4830df129f0cbe4abbea8eb5ddb1379c07094e2c36790ce57e11c9efbd78d616685d70340ce130d66b1be8c7edcda74a2fecaab9453707bca907fe189842d61786bd6688c24c043a117feb6077330fdcdd23fc2ddc87398bb4d1443d1dc3b43ca1ef4c8ce2606a03580e90e0915c75ab92edaa0272dfe0fe434604b4c8d6c001ace8e6bf063a5057964d73fa5f5aff6edcc04a59b91cb783268220ff0f5c9fd0e2a76974b9a4081c9964fae11c5a2f6b6050b304c6a399f2ccc1e27c068994b2c2b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (992, '{"ob": ["15151515f6ee440b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d34db04a83efa9ea75c4d4b9484419619b389a09ce3439a8dde2c2ca49f91941ce192370c675b4ffb7f1e5916ea33e021849acbec91f9eb0e0d4e9e802de4028593ac728201d349f8a1ca12e6e59ee689f3fd320b981ee09b1b4ea4a6b697aeb6d9f49d760a42e221f86952f38a2be767f9dab66748b09b78f1d1688b715050ae61391b4b435f3a065aa64f0b411a286598fcc7a7be0c7ef8ea1c7006eb7567e409887ef993536d7a5bdaa190374924f02466a30f49fc976d672be36ae9d04f609f7a1ea348843b90e72e80f43176811766ceb3afb98ea0ee0c91df5455320e768a079d0f322e97a8de375eee78769c4aba30b18010d73639566703a90d0e88251d1cb731a39f87b46f4684a301492c43640160ffb940156a56887099e5400fb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (993, '{"ob": ["15151515f6ee4421892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585683bf26668912c16f358d4dd6e6ada5b4d3dad1eabc9f99b88e212299fe80a41bf4b7ac93180223d172aa24dfef6e5225e013816cf5c3a891ce30502ea9268c13d9a412215027a266a3a20881f85dbe14a4c9475d6bd9d58632982d08259ba5b28b8657538eb12658cd5d259c9b37a1df7ba705945f6f010e8ac1b1f85aaafa00484fd5d4dde339825a1d55e315f6e6c7ba98f00bb9e4c683f97dead3796cfc881d3d2426c7d4b043a3c7c1754678ebb702fcb3c33e26089c53f08fddb8dd663a66633bd7910fe3dde833750cf404ae861ea4a733097995897731720aca1112cd426a1c86851de353b3cdd803a849f92ad2dc7fed6096dded16fe32eaef35a0a3ece8d81ecf92f58664c5db9033702783065aa47f202c3146f29c510b1161a1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (994, '{"ob": ["15151515f6ee44ba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135804030333caf195a22b043a8954aadb11080a05850d4904fd46a714cca8d4c1353ce1779fcf59b9af273a40fff6ea22ad2468ef4949638c7c6666583f582cfbee4703c1bc347c75b0732a8bb62592059bd2752ff41abe9c5b5558f7c408f41621dea2d55e4f37d3a37456bb5512688399a6356f1fbcc9fe2c75831d4236db60ac3f9209debf03ae26466b3f0e8eac1722fa0660ae5afee7f57ca7bd21377d7133e5e2070b84600fe98d8bfd2cc02a8e1e9971d45e925f5dfca6657f2d4ba708a99e1583598e9bd77f09350929102030ad1cab43c0f0679a4e626ca5b678efe1240c59e57f70c884ff1c3a4fc63a7e623b7dd307dd31f7aa612b88c995986c321e0deb41f7de9450dadf59a0a8e77dd6ff7d5880ee4f7153ca16beb4a8b57cf631"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (995, '{"ob": ["15151515f6ee44d7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a8667a57e846b509257b2a1e56ff8d30fb37bab4d358eac52c4e60646b42fa0a84ecec6ed8ff120f0b756bf5045edc74fc35813f8c2e6f181db7f3491ea3be07beefed9bd3db1ae6b82018b8d101c044138e6fee7ea6349e47934a0fef41a385e25ea88e7df688798fb89b0a8f136b581addd827aef2a873880312a199f846a68ee8c19428564462ac9f205ea5cd75bd3733b2526057c35c8f8951b565bd66e0d48243f99c3b061693154b7a300be17cf97c79ef18f2400a22bc510629d79340ff4a0cedeba6a04a2eba3fa7ad8b83fa68390845a0fcb4f4be761a21bd4cdcbea9e7b93c99e71c5f7b3968d8e85f6a555bf04d1cefb81db8916f72bd96ff17246be6355b58c68e2ecb7a61e18476b66ec27597b9a9ca4c5b24654fc032b83387"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (996, '{"ob": ["15151515f6ee4448892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f24221ffd3a8b2b3928c71ed9ff0ba0c82d1cac0832fef367c61d96a9d53a5ae24bc56d2d4114812a4f5c99224c0f25e78623f8dd04c16e3ad985a03cc21b8c5b4c167a3fbe6be4d378325cff0a20b365afbb6a0699955eb54d1a5944859b001b4c63faa963b5a4cc62ffcceed92d99abf661f519ca6f2799400c16f962b08dc6233c55934ed8367ae7b46f963937cf6bee364290d0879b7dd533eac0d6cc80699b09f92652b6ee2270b4469e9c26ca7f2518ea0291fbd2a24237b23d5651da40ce7bdd2aee628fbfaa1deec265d46824033c121552aa364a2a4091a306217adab50c0f50f34d691c3baa83aacd76c2a506e4cb7753ac6ee34180245d38a6f960672de78dbb113c86c00b0f5cdfb9fb8e399d9efce32c54565117e312be16f37"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (997, '{"ob": ["15151515f6ee44d1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585222498e7a62d20fcd9a7a27b8e3d085030a9c87420119ac5427c29f50396af09051ba8079b884632e3c18899e2373a5f44fa475a42cef92dd680ee6dd3cc998a6792fc5b9a28d3fc043ab6279d3f54f0b427a3b1f13137c75345789eb5cc834f45f46718dbfe80de2b39d32e3128f62b487fad3d6be7e05c1c2ad5eb63b988bfb334bd5c1967bcc57c43927f5b583cb07bd866defba14ff0d30b6df0aeeed05867fe2b5e0b7ec9d5b63353c6d20bf55e42a9ae44d8013049eded4f33940ec14640a1b504ac1c77930590e581b5efbf4284dc0da8e9dde53172df8fe0ada58c806417f16e61a99436ae017522027b8c6e02c0464417dd5ef1ae1e0b475e24b6ee15750f61edb7536bb307d0259fc1bc3a3d7ca32cb44d47f3bc4209aa4b15675"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (998, '{"ob": ["15151515f6ee4489892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358cb41a525ebf161267377d9e0a08425bf2007afe80724bee7917fba2d7038c74202d3180ef6732d8b4611e0ac2bd446144dfdc2cf181b8e9aeec4e03f2259a7c5627a994b393df003e22454ff702de93e4a73fdcf56967ec5f16fbd151b81c6f34cb2298d3dafbbc28768f469e1f3a3e288a353b4bee25758e61efa590d31a74e628da9965e9d47fd0bf86120b06b67b81a1bf5d18c56d9a90ffe333dd30a1b39e847cbd9c73e52403ac1cb5373617938c490782d88c011e87f6ada3d0cf1a362080a8b7f437247abc8165b4c3666ab81ee74bfc10babedfbfa29a8b5ad4cfe733a0778190df7bd82d83fd2b8de2489e3bcf2eaf21eba048e8e97fff3cc15587f4fcd87d16957f7bf44fa18043419e01553cbf11ff28ed5896670240985e5a3c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (999, '{"ob": ["15151515f6ee44ae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135894025bc28e4a00626dc09acf2957e4794221bf9ba89fc5d9fa41189f58951dc273610dbe4e4b952619a8cce930d6d77cd1f3bac690652a428c324356d4304926fb605f1e1263e0ee8fa3d2a532fe45ff1777a105de45dacd3e82fe87d1c2c2c705f5c99890d9568c7d952d45f8a08ffe3086f5c3dedcc04399f75f2c408845c38f4f90f4f566561791c56649f34b831bcb0b204204483fc5963cb507becbc8bf67531ca82292e302fc91582acd82b83c48cf13601a8c520c6799a4a8774df41078632172aec5af6133b3b9cae3482ad92cf20633911c953251ad14d968a364887447800b26be559600c4961c28dcfc2baaf6ae1a3d82b386b85b43d07b2ddf41f0755f9af6fa31c018535f72d5ec098fe85e09123049879a3ddc9e0b3d6ff1fa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (1000, '{"ob": ["15151515f6ee4437892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b7069f50040acec34ee8ffca6859c2c5697978a3eeec9ace0acffa5f77f44eab3d9ee1817893f843d4144c5b212b15cf34dff842ce6ba77abd6ef14a40419c071ec726d84123472ec808f3b22fbd3a612c31cc4f0bcc94f1927df9c3fef38230703f4d6e57821171bfa334406469a5febb16d6ce129a54dce3e5ab321df89ddb2fcac911151501463a9a9f931a65868d05c426edbc95bd0a2cd83d0d93c3d1ccc3eb0f4ae75fba5d90f1056a0d89ee2299f8e7519f2c4b6ee552a78782a806a10669beda49c2acb8330c0b061f8878917503df38d50f7ed8884e5772e0dd57bf3f4678788790044c24b50772764dbba51aba331ccde2847b37e435ba735cc90ca5817ac7c6a6de0ac656dc39526341df0aede187bf285876adef316dd8a24fc0"]}'::jsonb::eql_v2_encrypted); diff --git a/tests/sqlx/migrations/003_install_ste_vec_data.sql b/tests/sqlx/migrations/003_install_ste_vec_data.sql deleted file mode 100644 index 76d06d913..000000000 --- a/tests/sqlx/migrations/003_install_ste_vec_data.sql +++ /dev/null @@ -1,59 +0,0 @@ -DROP TABLE IF EXISTS ste_vec; -CREATE TABLE ste_vec -( - id bigint, - e eql_v2_encrypted, - PRIMARY KEY(id) -); - --- Apply the production `add_encrypted_constraint` CHECK to the fixture --- table. Every row in this file is a real v2.3 SteVec payload (root `sv`, --- no root `c`), so the constraint also acts as a regression guard against --- #232: under the pre-fix `_encrypted_check_c` (which required `val ? 'c'` --- unconditionally) every INSERT below would fail. If this fixture loads --- cleanly with the constraint applied, the check function correctly --- admits both `EncryptedPayload` and `SteVecPayload` shapes; if it loads --- cleanly with `add_encrypted_constraint` somehow not wiring the CHECK, --- something more fundamental is broken (h/t @coderdan). -SELECT eql_v2.add_encrypted_constraint('ste_vec', 'e'); - --- Inlined v2.3-shape ste_vec records (10 records, ids 1-10). --- --- Plaintext shape (for reference): --- { "hello": "world {N}", "number": N, --- "nested": { "number": , "hello": "world {N}" } } --- --- Changes from the pre-2.3 fixture: --- - Root-level `c` field removed (invalid on SteVecPayload per the --- v2.3 schema; root SteVecPayload is `{i, v, sv}`). --- - Each sv entry now carries `hm`. For entries that previously had --- `b3` (Blake3) it's renamed to `hm` with the same bytes; for --- `oc`-bearing entries (ordered terms), `hm` is synthesised as --- `md5(s || record_id)` — opaque to callers; what matters is --- per-record equality semantics for ste_vec_contains. --- - The `oc` ciphertexts are kept verbatim from the pre-2.3 fixture --- — they're real cipherstash-suite CLLW output whose byte --- structure satisfies the `compare_ore_cllw_term` rotation rule. --- --- Selectors (path -> column-name HMAC): --- $ -> 9493d6010fe7845d52149b697729c745 --- $.hello -> d90b97b5207d30fe867ca816ed0fe4a7 --- $.nested -> 3a9a5d5601369d00a92e851b5490d2d1 --- $.nested.hello -> f3b937817818610f955b6bbbc337aa2b --- $.number -> fa6f99753674e2e0db242dd805eacac8 --- $.nested.number -> 3dba004f4d7823446e7cb71f6681b344 --- --- `tests/test_helpers.sql` also exposes `build_synthetic_ste_vec(id)` --- which returns the same row for a given id (use it in test code that --- needs to generate a fresh row dynamically). - -INSERT INTO ste_vec(id, e) VALUES (1, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqX%JhW0ZKZ^G?lNn$CfXJH|W!V*=irNa@z{OfN`tJKpjgX(7ToG`HWORpeL^$zO*^J`x7KRuY0gW#{2OV?F-Z2rNIo9CWCgDOt!Fg2d-I_cW7ljFiM641$Ej6!A<1h!E%%1I5$YIE}thw=uucU|IEwG+k8(puh", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq8w1tsgI>{D^0s{k=Kwcv$GK=wXj973J#%Qi#2^fUgv1o_OazD!=oJIS)7m(VzEQU^ztUh?^@=oIRR^HJ", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqK@;r|K5qT&!~f=;IrFg2#bT?wQ2^uT?MQ1vb$M{qdKJ&)IM{5qYVEjR-wUOWau*19aKGAhNSrAja?iC`)BMCB41$Ej6!A<1h!E%%1I5$YIE}thw=uucU|IEwG+k8(puh", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq8w1tsgI>{D^0s{k=Kwcv$GK=wXj973J#%Qi#2^fUgv1o_OazD!=oJIS)7m(VzEQU^ztUh?^@=oIRR^HJ", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqBor4+`y>b|qoX{uNXP2XSf9UacD`690sM|6wY5xR^!82|E5slSf`r5r@k|7W5a<;H#nak2jlNO0F~8DaS@nuET~!C5zy", "oc": "fc6a9c6533b34219a300d82916e71a4955a48b208969eaf4dec0b88477b753fce8e31613f296a3ebc3dc428912fffa10ad58ef698631b5a3a8ec0a53593fbae5", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq6X0HB3o?jM)H&5-v7zt=j&nB7f>vGiA$|Xx3CMyn3~nC&!m2n|FsTD7A$Vznv5KN&ZD;2AYnEe)S~DtWX{85Bby<_1V+JAQ#4iCfmE5R8de-4qZ}xLQgnq2A0{V^??Z>lfCrxAE3Y", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbKA;2~_|&h787#WXU&=nqH48zV_I^FE9E$Tx^Bh>*L$Z3UaiidiIG8f6-J#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbca", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbKA;2~_|&h787#WXU&=nqH4LKI%yI#+SZ>%7r@cMkI#>B`Y@g%m&?_;qLaZhOY{yIKN|aPs2dC}n9ugdf8Jtw6L@OO2~2$4fWO5Ld;)=aR3)AQ#4iCfmE5R8de-4qZ}xLQgnq2A0{V^??Z>lfCrxAE3Y", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbKA;2~_|&h787#WXU&=nqH48zV_I^FE9E$Tx^Bh>*L$Z3UaiidiIG8f6-J#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbca", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbKA;2~_|&h787#WXU&=nqH4C6`I)f|7H0_iUN!sI%p|PD^%)I3u@>Lo)l>D^FTEHMX_T`5(j}7si7o+q;}pQBYA1T~d8QPdI7@mf5KFfe9d!z4Y`Spuh", "oc": "fc6a9c6533b34219a3018e1c9ce9330c0e754864cd7341d488ae3fc464cdd85f73b1e9aabab2d18c8de2de82052d5ec9e8c906ef5d082a34b5a4e63234a2f831", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbKA;2~_|&h787#WXU&=nqH46KPW9$J3a=|Jqzg_kinIG(B$L#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fc6a9c6533b341a3bbe1d7eefbfe3457e74c9c4dcde2c1d40fafa6fe7bfe1cf225871f30f428f65a348062433db703d77583587a42443a1808d112f0514f0262", "a": false}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec(id, e) VALUES (3, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#YUj70Cz_B24U3#W#b#KGw1<@cS7(S0Ce|x{!!At-Epo5#C-8ZJATrn?7A$@`(u>=$?2X*e1UcJ`#2{On(Eq~PZP7^Gu{SL7X*)sN#Y!JpxT_uu4UfmrWp|*!", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbcb", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#Li)6dAJoLZZs|CbiZstYT&vn}P=yVCm1M9YnMJisIv8CoL6Tzth(-874C)8j_qYuX4Fv>J<<09@x_=DyfRUxdAX}Tz|H9gB(Ma8~H!SgKJ3-sUN*`Ics~!stkH^qucc8!", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#8-dM231ayoGQIzTv|n<6^Uo7QSi`z>1UcJ`#2{On(Eq~PZP7^Gu{SL7X*)sN#Y!JpxT_uu4UfmrWp|*!", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbcb", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#B}MUqDEGI9$OIF8zdRu#08c>I+EsdWf96+dkZC%<3u9$EKb~W)de42&14s2=>FoXlMb%ApcgZX1WmCNxJ>3Blt#*(|HBayw2*id#80AgNqT0K#327xtY*3p+DW?ot0VYEjnjDr(d5XNQ4npH3R?^aEq$QC", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9f41f8", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbM9-awLU6awLQJTS5Buj8R|QNY+p4aeSYRGzixBKRP(>$YGm-@6u=+OF_wtB8QA|boP=&$^#B;c1>9aoy)SsApcgZX1WmCNxJ>3Blt#*(|HBayw2*id#80AgNqT0K#327xtY*3p+DW?ot0VYEjnjDr(d5XNQ4npH3R?^aEq$QC", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9f41f8", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbM9-awLU6ac?Hqr$d^$NZI=pL3Kt4RJ*8LO2XQqL+Pqd_9s0vN<&V}uKTbz)(?Kb4+xpBxMa;Y2+`wxSdOU}4O~cKwn`(-AcBj{+j{1przTWjt<01cd^h(Fa;pBD=0k9``h@8OPcTs5t(bz$Ve*;3X1KV6FnhAWrE)*M{J-nozAcDun97I9)DC61}WC4g$Z=r!U$ho1nk", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbJZA|9c2`{Osnrra?Hj)cv`8vu0{XK}SSyw%$>)p?C8#My;w6W3&4h>M!|#2`-TLDz=hvYJq>I4Xqd!Z=+nND{rQIt~KA&!;ciB%7eX", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9f41f9", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbJZA|9c2`{Osnrra?Hj)cv`LjQ)X$p_~llv&x~<)hiIe5|*>Hc1Zkglk(`D>cnLbBrE07YBC9SR?ZTg}77_!tjaq#%1r4K6AOUpGDKT5L`OMAWrE)*M{J-nozAcDun97I9)DC61}WC4g$Z=r!U$ho1nk", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbJZA|9c2`{Osnrra?Hj)cv`8vu0{XK}SSyw%$>)p?C8#My;w6W3&4h>M!|#2`-TLDz=hvYJq>I4Xqd!Z=+nND{rQIt~KA&!;ciB%7eX", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9f41f9", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbJZA|9c2`{Osnrra?Hj)cv`C06PttDegliI%ijveChO?CCfOY;nXOPU%6{hTyWAP^~yBgzCaLT`ouxy{tM80>96vFWMxVpuh", "oc": "fc6a9c6533b34219a3018e1d533343a282b879ce470722cfe6ae36688b2de8d685a395d6c555b720db3eed0042fdaa8ee6403fc3ba8c3f7d423f8821a1228fd7", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbJZA|9c2`{Osnrra?Hj)cv`6LBDt#>7UH2q|VZbg%~lyV4vB#2`-TLDz=hvYJq>I4Xqd!Z=+nND{rQIt~KA&!;ciB%7eX", "oc": "fc6a9c6533b341a3bbe1d7ef077cf858f5582688ede7a88e44522be9ea2a62f87707519a1c76b54b5da3193f77db9531dc887dcedafebc8135ccf8028cf38614", "a": false}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec(id, e) VALUES (6, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbKU&X2H2TUi~T2sQBASNTOjoiQuI`BLc){G*FR;1W;<^)-g>TjwP+P;@y+w6)=8kCzp#2_Xku8rKl4La~V6xNI)iB_+`Tn8b$&_I`G&=n39;1W;<^)-g>TjwP+P;@y+w6)=8kCzp#2_Xku8rKl4La~V6xNI)iB_+puh", "oc": "fc6a9c6533b34219a3018e1c9ce932bd1929ff8bed603031286d87dd98008307deac134ba0759bedd4b72bdb6c469b0c9bba850f0b9d6de69f941801d901593b", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbKU&X2H2TUi~T2?knzEr&IQ4C}9_BKS`w@y=ZxMI61!?)?c%KqJ9^_Qhgfj$2Nd3!8skzc`58ed?&hAZ_oqHcY^@#&Q*hTu^_7Of|hoElmzGI;5NP!2kG~rl7z", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbLWIPx0`a~GhoFvD#SK|+DV8)c(L(X9VOZ->csIkThDI`VV6a}NV%eDmLo#2{_&wl++_w8nB3hg?v9g-kWQNG(kcGCHK2^T7Z3nx>$@", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9f42bb", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbLWIPx0`a~GhoFvD#SK|+DVLVlEEd!}1mw5-+>Q)|48N1ODPT`={zO||cAxQ=}b+yt(ANAX*$QWW-pHFGi-2HP^n=gIYsiH{C*(7KhBGYnV6AZ_oqHcY^@#&Q*hTu^_7Of|hoElmzGI;5NP!2kG~rl7z", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbLWIPx0`a~GhoFvD#SK|+DV8)c(L(X9VOZ->csIkThDI`VV6a}NV%eDmLo#2{_&wl++_w8nB3hg?v9g-kWQNG(kcGCHK2^T7Z3nx>$@", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9f42bb", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbLWIPx0`a~GhoFvD#SK|+DVCCe8R*C3LA0=X>OcfeqR8^WMRfsewr$X@D%aU(5LdkQQ9)o{chZSS@=Ou)3pautVMP=AF?HN8kJO%5_Tq?_}=|M;4wpuh", "oc": "fc6a9c6533b34219a3018e1d524d118ab347ae240e626857d0111d7f917bb3cd5339df72bafa18d30abbb947a81ad55fd0bd2482e24cb814470c42c13e06c5e8", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbLWIPx0`a~GhoFvD#SK|+DV6UNb%E^11oJovsVsxVKcuBCqS#2{_&wl++_w8nB3hg?v9g-kWQNG(kcGCHK2^T7Z3nx>$@", "oc": "fc6a9c6533b341a3bbe1d7ef08cc248ae8d903e2c5b3872108e910e5e1abfd12b864110cf8c3f96068c2e22a91bd4a31fd576d914ab6f592b510a5d09303a113", "a": false}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec(id, e) VALUES (8, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbLU1c41)W9q|644h(&;v|K{Y9^G7d5DAJM-UtmtvJFD-rpm|!bIFbJ_38g6>L4JxCAzZqg;J~zXCHw&~>@%Qg;jo1i6*=>!NvDVAeB%BPNh0)fUgx(>_IJTLdje%|Tm3t350kkPVz)R1@HjcJH#rF5b0<0458>AfMQ%t`tCz*iE%8Q=~zakT$5-;E$Vz8_*^me1YEm>!82", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbLU1c41)W9q|644h(&;v|K{8(5Xe9m`5OZ4)XL??yheX-WGqH8&DwuvUEG#2}y8sIC-1kJwGMEK{UGm5?^5*Wizvh8xf(9(;k`{p+B>", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cae77a9e6", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbLU1c41)W9q|644h(&;v|K{LTk1A!h2L`pi*@*IAxKZWEp&PvSNIeN9`O-dc<1;`<{tm3Q%w*bvChnGw`dMo9fQ$%6M)m|ANzcy^dAfMQ%t`tCz*iE%8Q=~zakT$5-;E$Vz8_*^me1YEm>!82", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbLU1c41)W9q|644h(&;v|K{8(5Xe9m`5OZ4)XL??yheX-WGqH8&DwuvUEG#2}y8sIC-1kJwGMEK{UGm5?^5*Wizvh8xf(9(;k`{p+B>", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cae77a9e6", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbLU1c41)W9q|644h(&;v|K{B`tAY7D@4_eh%C5;rHRnV+K)h-PvUiIy1vhxx%(@YHIJ|V0^?NpV+9b6hM#IO|>jjq(POCHmKL&kDG=Y&?X*yf!_V=puh", "oc": "fc6a9c6533b34219a3018e1c9dcaac4823035131d63437a90de98995d0a5f44efc2ec0a4768c718c7c76ffbc7cc5c79e3efe6333415f581fc6a9e9467c8bb509", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbLU1c41)W9q|644h(&;v|K{6BUWiJXM;%", "oc": "fc6a9c6533b341a3bbe1d83c495c498ccdb757c8461e519fb5ad2db6ab3d3a7bd2c87b41fd9dcc07fb922e3f1defe81d04c975f73ca873531646f9693340d169", "a": false}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec(id, e) VALUES (9, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbK%Ks*MeKDAAsr>I~keTZAcYM9b4|8fb~$D>=F@t{DFHgI0-uESoh1vX`JD2W}wLQ{zT)bJN2)s~oVF-)ubVZ$cQL3PHK6aW_Imq>t*L5uP2iiJQ>>yrXQ9$79k+Csetm7#?HK9lde?+IWkkO%6dKy3qG&U^U8AUq1dArOMF>P%C%>Rmq|o~0(Ggse6t_Yr4zuoAT&_@KZ", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbK%Ks*MeKDAAsr>I~keTZAc8$p9%O%q$urm@mN+n39d89A;-u7l&A-BbZG#2`Ehz#$NVuI~keTZAcLZs-pqE$l0=C-c5Dk)f~Ku%D4tHX*hf84+p-cokD(@z`M>on8TdKv!5a%!P+7AP%C%>Rmq|o~0(Ggse6t_Yr4zuoAT&_@KZ", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbK%Ks*MeKDAAsr>I~keTZAc8$p9%O%q$urm@mN+n39d89A;-u7l&A-BbZG#2`Ehz#$NVuI~keTZAcCGfIP%Q;QOtEFX-SyMqY)3lx;8sAp`hPTa2z0mDr@O?=HAWOs`JPN=e5Q4DkOjEY%T|Xe6r6#3>tTrY05odR>615-rpuh", "oc": "fc6a9c6533b34219a300d82a7272762b196c2cd4b0f0e1ef45ddea7f90879fd920fc926b97be039fdee7d2b633ae2744617d375f677e3d62bfebbec1501e8f55", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbK%Ks*MeKDAAsr>I~keTZAc6Gz~_22KC1k~e`Y-54&aG;cYK#2`Ehz#$NVuf@e%>;NishD;H2XykHX^>azaF#hKvJ%zy", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbK(pyr$AQACXmOIVmOi}Ihu96ceUg9XV?28@M-tz#Br;^6<3WFOjd2ER8q=fogcYM1<KvJ%zy", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1be531d84f87aabfa9", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbK(pyr$AQACXmOIVmOi}IhuLJr=wKvitTn15T2HK9Gf9WP-@uChztE?QZTtZ``BA3^P-GzWm8T=`6b9{?DB2co}A!JgDzI*_|{%^1GO{WxpHAX#dc{GYTtk;F|W6Vz*6{=fXB?_pGy!(2dzD!=L+nV`S", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbK(pyr$AQACXmOIVmOi}Ihu96ceUg9XV?28@M-tz#Br;^6<3WFOjd2ER8q=fogcYM1<KvJ%zy", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1be531d84f87aabfa9", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbK(pyr$AQACXmOIVmOi}IhuBte;>Ow0vKyBL-0I##N^GXA#daWCrO$8*Bk)0K=lmV1F2cf=rBYM1<KvJ%zy", "oc": "fc6a9c6533b34219a300d7db65baa7226274d27d53fb941bb5b8884a18e181a5773acc25bb4dce3e38bfc174f4a91c87b5b22f7e0f9f422b3ad17d6b401590db", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbK(pyr$AQACXmOIVmOi}Ihu6n`j}Ff83O>k4Ho>^0_=jmcM`uf!l(YM1<KvJ%zy", "oc": "fc6a9c6533b341a3bbe1d83c495dd234910130aae562de01247783fd038b94cd6af81089bcdc20b296b09b4475b9dad037051408640ec5d07b716141a05044f3", "a": false}]}'::jsonb::eql_v2_encrypted); diff --git a/tests/sqlx/migrations/004_install_test_helpers.sql b/tests/sqlx/migrations/004_install_test_helpers.sql deleted file mode 100644 index 529057951..000000000 --- a/tests/sqlx/migrations/004_install_test_helpers.sql +++ /dev/null @@ -1,559 +0,0 @@ - --- --- Various Helper functions --- - - - --- --- Creates a table with an encrypted column for testing --- -DROP FUNCTION IF EXISTS create_table_with_encrypted(); -CREATE FUNCTION create_table_with_encrypted() - RETURNS void -AS $$ - BEGIN - DROP TABLE IF EXISTS encrypted; - CREATE TABLE encrypted - ( - id bigint GENERATED ALWAYS AS IDENTITY, - e eql_v2_encrypted, - PRIMARY KEY(id) - ); -END; -$$ LANGUAGE plpgsql; - --- --- Creates a table with an encrypted column for testing --- -DROP FUNCTION IF EXISTS truncate_table_with_encrypted(); -CREATE FUNCTION truncate_table_with_encrypted() - RETURNS void -AS $$ - BEGIN - TRUNCATE encrypted; - END; -$$ LANGUAGE plpgsql; - - - -DROP FUNCTION IF EXISTS get_numeric_ste_vec_10(); -CREATE FUNCTION get_numeric_ste_vec_10() - RETURNS jsonb -AS $$ - BEGIN - RETURN '{"sv": [{"c": "mBbLGB9xHAGzLvUj-`@Wmf=IhD87n7r3ir3n!Sk6AKir_YawR=0c>pk(OydB;ntIEXK~c>V&4>)rNkfF eql_v2_encrypted[] --- a [ --- 1 --- ] --- - --- ORIGINAL $.a encoding --- { --- "b3": "8258356162d2415d55244abf49e40da3", --- "c": "mBbL9j9(QoRD)R+z?=Fvn#=FR9iI)K4Nzk-ea`~#Lx@wBSDPSmkp-h+tNEHoo@T@#vwh?Ejvk%78G}b+je+xufQA5mSwHSid)iEOkg@>mpuh", --- "s": "f510853730e1c3dbd31b86963f029dd5" --- }, - -DROP FUNCTION IF EXISTS get_array_ste_vec(); -CREATE FUNCTION get_array_ste_vec() - RETURNS jsonb -AS $$ - BEGIN - RETURN '{"sv": [{"c": "mBbL9j9(QoRD)R+z?=Fvn#=FRIg79JJM`MCq+nE0*U^ca-cViL884d-TInfY&E9HW@X>!U&lkYne2!EecKG8xwLYb0X#y7|05rrPvwh?Ejvk%78G}b+je+xufQA5mSwHSid)iEOkg@>mpuh", "s": "bca213de9ccce676fa849ff9c4807963", "hm": "7b4ffe5d60e4e4300dc3e28d9c300c87"}, {"c": "mBbL9j9(QoRD)R+z?=Fvn#=FR6Z{(4c^$CD^7q>z{xl^%5S4=m#2~YMW7y15TC<^_oBO-6ni$TotY#2~YMz{xl^%5S4=m#2~YMW7y15TC<^_oBO-6ni$TotY#2~YMoG#B*Y-IedG9!9-X`ygGXYGf%A%hh5&w9KkiR^+DvtjvHG(8jjwtt=6Wr{!%WJ?vt(v&0~?edG9!9-X`ygGXYGf%A%hh5&w9KkiR^+DvtjvH'$.n' -> '2517068c0d1f9d4d41d2c666211f785e' - -- e->'2517068c0d1f9d4d41d2c666211f785e' - -- e->>'2517068c0d1f9d4d41d2c666211f785e' ciphertext/c - - RETURN '{"sv": [{"c": "mBbM0#UZON2jQ3@LiWcvns2YfD7#?5ZXlp8Wk1R*iA%o6cD0VZWqPY%l%_z!JC9wAR4?XKSouV_AjBXFod39C7TF-SiCD-NgkG)l%Vw=l!tX>H*Pjq@SFR7iRajU#?{(K%x=#2^Zs|F~fm*&w!wSjZQIUaj-XX01=c??f8cq8*Vf?zEu5", "s": "a7cea93975ed8c01f861ccb6bd082784", "hm": "af96e1dabbec581f36d71e3a48ffb427f54832851b4fefa6989887ccaf7e038f66f8cb40e6959458"}, {"c": "mBbM0#UZON2jQ3@LiWcvns2Yf6y3L;hykEh`}*fX#aF;n*=>+*o5Uarod39C7TF-SiCD-NgkG)l%Vw=l!tX>H*PkiFH&De7C+d}sDugsc?JuI*>$AsG83nsXvrND0-(S", "s": "bca213de9ccce676fa849ff9c4807963", "hm": "7b4ffe5d60e4e4300dc3e28d9c300c87"}, {"c": "mBbK0Cob5dQ5Jki69vRd75f9k8Rn)lVSgZ9Q3jQYu)}sv8};==6AExb8MwqC=TCnxQeQ_FKiJQxgbDw71`CJTb)@Vv6Q`bN$sH2{puh", "s": "a7cea93975ed8c01f861ccb6bd082784", "hm": "af96e1dabbec5913707844664eb160923982fdec75bda4bcd063e26b4254a9f334ce7ebc2612713c"}, {"c": "mBbK0Cob5dQ5Jki69vRd75f9k6yc;BV`COqamPOX6P`g5TMr)AeZ(N=Pk%%2`Uq=={*w3hh3IBNp3y0Ztr0g;ir=DoZ9TNhezy", "oc": "b0c13d4a4a9ffcb2ef8629d60d5e32db453fad8792b2450d02f37ec5fe207b42da30093fd14c4975c9b192ecbf939b2d5a56a7ae2db1254e6532aa7569971462", "s": "2517068c0d1f9d4d41d2c666211f785e"}]}'::jsonb; - END; -$$ LANGUAGE plpgsql; - - --- -- --- -- --- --- Creates a table with an encrypted column for testing --- --- JSON -- '{"hello": "world", "n": 42}' --- --- Paths --- $ -> bca213de9ccce676fa849ff9c4807963 --- $.hello -> a7cea93975ed8c01f861ccb6bd082784 --- $.n -> 2517068c0d1f9d4d41d2c666211f785e --- --- -- --- -- -DROP FUNCTION IF EXISTS create_encrypted_json(integer); -CREATE FUNCTION create_encrypted_json(id integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - s text; - m jsonb; - start integer; - stop integer; - random_key text; - random_val text; - sv jsonb; - ore_term jsonb; - result jsonb; - BEGIN - - start := (10 * id); - stop := (10 * id) + 5; - m := array_to_json(array(SELECT generate_series(start, stop))); - - select substr(md5(random()::text), 1, 25) INTO random_key; - select substr(md5(random()::text), 1, 25) INTO random_val; - - CASE id - WHEN 1 THEN - sv := get_numeric_ste_vec_10(); - WHEN 2 THEN - sv := get_numeric_ste_vec_20(); - WHEN 3 THEN - sv := get_numeric_ste_vec_30(); - ELSE - sv := get_numeric_ste_vec_42(); - END CASE; - - - SELECT ore.e FROM ore WHERE ore.id = start INTO ore_term; - - -- PERFORM eql_v2.log('ore_term: ', ore_term::text); - - s := format( - '{ - "%s": "%s", - "c": "ciphertext", - "i": { - "t": "encrypted", - "c": "e" - }, - "hm": "hmac.%s", - "bf": %s, - "v": 2 - }', - random_key, - random_val, - id, m); - - result := s::jsonb || sv || ore_term; - - -- Backstop hm synthesis: legacy `get_numeric_ste_vec_*` fixtures may - -- still carry an sv element with neither `hm` nor `oc` (i.e. an - -- equality-only entry that pre-dates the v2.3 b3→hm rename and hasn't - -- been refreshed). Synthesise `hm` deterministically in that case so - -- the entry has a stable equality term for ste_vec_contains. - -- - -- Per the v2.3 sv-element contract (and the `eql_v2.ste_vec_entry` - -- DOMAIN check), `hm` and `oc` are mutually exclusive — never both — - -- so skip elements that already have `oc`. - IF result -> 'sv' IS NOT NULL THEN - result := jsonb_set(result, '{sv}', ( - SELECT jsonb_agg( - CASE - WHEN NOT (elem ? 'hm') AND NOT (elem ? 'oc') THEN - elem || jsonb_build_object( - 'hm', - coalesce( - elem ->> 'b3', - md5(coalesce(elem ->> 's', '') || coalesce(elem ->> 'c', '')) - ) - ) - ELSE elem - END - ) - FROM jsonb_array_elements(result -> 'sv') elem - )); - END IF; - - RETURN result::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_json(integer, VARIADIC indexes text[]); -CREATE FUNCTION create_encrypted_json(id integer, VARIADIC indexes text[]) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - j jsonb; - BEGIN - j := create_encrypted_json(id); - - j := ( - SELECT jsonb_object_agg(key, value) - FROM jsonb_each(j) - WHERE key = ANY(indexes) - ); - - RETURN j::eql_v2_encrypted; - - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_json(VARIADIC indexes text[]); -CREATE FUNCTION create_encrypted_json(VARIADIC indexes text[]) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - default_indexes text[]; - j jsonb; - BEGIN - - default_indexes := ARRAY['c', 'i', 'v']; - - j := create_encrypted_json(1); - - j := ( - SELECT jsonb_object_agg(key, value) - FROM jsonb_each(j) - WHERE key = ANY(indexes || default_indexes) - ); - - RETURN j::eql_v2_encrypted; - - END; -$$ LANGUAGE plpgsql; - - - -DROP FUNCTION IF EXISTS create_encrypted_ore_json(val integer); -CREATE FUNCTION create_encrypted_ore_json(val integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - e eql_v2_encrypted; - ore_term jsonb; - BEGIN - EXECUTE format('SELECT ore.e FROM ore WHERE id = %s', val) INTO ore_term; - e := create_encrypted_json('ob')::jsonb || ore_term; - RETURN e::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_ste_vec_json(val integer); -CREATE FUNCTION create_encrypted_ste_vec_json(val integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - e eql_v2_encrypted; - BEGIN - EXECUTE format('SELECT ste_vec.e FROM ste_vec WHERE id = %s', val) INTO e; - RETURN e::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_json(); -CREATE FUNCTION create_encrypted_json() - RETURNS eql_v2_encrypted -AS $$ - DECLARE - id integer; - j jsonb; - BEGIN - id := trunc(random() * 1000 + 1); - j := create_encrypted_json(id); - RETURN j::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS seed_encrypted(eql_v2_encrypted); -CREATE FUNCTION seed_encrypted(e eql_v2_encrypted) - RETURNS void -AS $$ - BEGIN - INSERT INTO encrypted (e) VALUES (e); - END; -$$ LANGUAGE plpgsql; - - --- --- Truncates and creates base test data --- -DROP FUNCTION IF EXISTS seed_encrypted_json(); -CREATE FUNCTION seed_encrypted_json() - RETURNS void -AS $$ - BEGIN - PERFORM truncate_table_with_encrypted(); - PERFORM seed_encrypted(create_encrypted_json(1)); - PERFORM seed_encrypted(create_encrypted_json(2)); - PERFORM seed_encrypted(create_encrypted_json(3)); - END; -$$ LANGUAGE plpgsql; - - --- --- Creates a table with an encrypted column for testing --- -DROP FUNCTION IF EXISTS drop_table_with_encrypted(); -CREATE FUNCTION drop_table_with_encrypted() - RETURNS void -AS $$ - BEGIN - DROP TABLE IF EXISTS encrypted; -END; -$$ LANGUAGE plpgsql; - - --- --- Convenience function to describe a test --- -DROP FUNCTION IF EXISTS describe(text); -CREATE FUNCTION describe(s text) - RETURNS void -AS $$ - BEGIN - RAISE NOTICE '%', s; -END; -$$ LANGUAGE plpgsql; - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_result(describe text, sql text); - -CREATE FUNCTION assert_result(describe text, sql text) - RETURNS void -AS $$ - DECLARE - result record; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result; - - if result IS NULL THEN - RAISE NOTICE 'ASSERT RESULT FAILED'; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_result(describe text, sql text, result text); - -CREATE FUNCTION assert_result(describe text, sql text, expected text) - RETURNS void -AS $$ - DECLARE - result text; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result; - - if result <> expected THEN - RAISE NOTICE 'ASSERT EXPECTED RESULT FAILED'; - RAISE NOTICE 'Expected: %', expected; - RAISE NOTICE 'Result: %', result; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_id(describe text, sql text, id integer); - -CREATE FUNCTION assert_id(describe text, sql text, id integer) - RETURNS void -AS $$ - DECLARE - result_id integer; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result_id; - - IF result_id <> id THEN - RAISE NOTICE 'ASSERT ID FAILED'; - RAISE NOTICE 'Expected row with id % but returned %', id, result_id; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_no_result(describe text, sql text); - -CREATE FUNCTION assert_no_result(describe text, sql text) - RETURNS void -AS $$ - DECLARE - result record; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result; - - IF result IS NOT NULL THEN - RAISE NOTICE 'ASSERT NO RESULT FAILED'; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_count(describe text, sql text, expected integer); - -CREATE FUNCTION assert_count(describe text, sql text, expected integer) - RETURNS void -AS $$ - DECLARE - result integer; - BEGIN - RAISE NOTICE '%', describe; - - -- Remove any trailing ; so that the query can be wrapped with count(*) below - sql := TRIM(TRAILING ';' FROM sql); - - EXECUTE format('SELECT COUNT(*) FROM (%s) as q', sql) INTO result; - - if result <> expected THEN - RAISE NOTICE 'ASSERT COUNT FAILED'; - RAISE NOTICE 'Expected % rows and returned %', expected, result; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - - --- --- Assert the the provided SQL statement raises an exception --- -DROP FUNCTION IF EXISTS assert_exception(describe text, sql text); - -CREATE FUNCTION assert_exception(describe text, sql text) - RETURNS void -AS $$ - BEGIN - RAISE NOTICE '%', describe; - - BEGIN - EXECUTE sql; - RAISE NOTICE 'ASSERT EXCEPTION FAILED'; - RAISE NOTICE 'EXPECTED STATEMENT TO RAISE EXCEPTION'; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - EXCEPTION - WHEN OTHERS THEN - ASSERT true; - END; - - END; -$$ LANGUAGE plpgsql; --- --- Synthetic ste_vec test data (replaces the pre-2.3 fixture in tests/ste_vec.sql) --- --- Returns an eql_v2_encrypted carrying a v2.3-compliant SteVecPayload: --- {i, v, sv: []} — no root `c` per the v2.3 schema --- --- The sv entries reuse real CLLW `oc` ciphertexts captured from a pre-2.3 --- cipherstash-suite encryption (so the byte structure satisfies the CLLW --- per-byte comparison rule that `eql_v2.compare_ore_cllw_term` expects). --- `hm` for `oc`-bearing entries is synthesised deterministically as --- `md5(s || record_id)` — opaque to callers; what matters is per-record --- equality semantics for ste_vec_contains. --- --- Plaintext shape (for reference): --- { "hello": "world {N}", "number": N, --- "nested": { "number": , "hello": "world {N}" } } --- --- Selectors: --- $ -> 9493d6010fe7845d52149b697729c745 --- $.hello -> d90b97b5207d30fe867ca816ed0fe4a7 --- $.nested -> 3a9a5d5601369d00a92e851b5490d2d1 --- $.nested.hello -> f3b937817818610f955b6bbbc337aa2b --- $.number -> fa6f99753674e2e0db242dd805eacac8 --- $.nested.number -> 3dba004f4d7823446e7cb71f6681b344 -DROP FUNCTION IF EXISTS build_synthetic_ste_vec(integer); -CREATE FUNCTION build_synthetic_ste_vec(id integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - payload jsonb; - BEGIN - CASE id - WHEN 1 THEN payload := '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqX%JhW0ZKZ^G?lNn$CfXJH|W!V*=irNa@z{OfN`tJKpjgX(7ToG`HWORpeL^$zO*^J`x7KRuY0gW#{2OV?F-Z2rNIo9CWCgDOt!Fg2d-I_cW7ljFiM641$Ej6!A<1h!E%%1I5$YIE}thw=uucU|IEwG+k8(puh", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq8w1tsgI>{D^0s{k=Kwcv$GK=wXj973J#%Qi#2^fUgv1o_OazD!=oJIS)7m(VzEQU^ztUh?^@=oIRR^HJ", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqK@;r|K5qT&!~f=;IrFg2#bT?wQ2^uT?MQ1vb$M{qdKJ&)IM{5qYVEjR-wUOWau*19aKGAhNSrAja?iC`)BMCB41$Ej6!A<1h!E%%1I5$YIE}thw=uucU|IEwG+k8(puh", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq8w1tsgI>{D^0s{k=Kwcv$GK=wXj973J#%Qi#2^fUgv1o_OazD!=oJIS)7m(VzEQU^ztUh?^@=oIRR^HJ", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqBor4+`y>b|qoX{uNXP2XSf9UacD`690sM|6wY5xR^!82|E5slSf`r5r@k|7W5a<;H#nak2jlNO0F~8DaS@nuET~!C5zy", "oc": "fc6a9c6533b34219a300d82916e71a4955a48b208969eaf4dec0b88477b753fce8e31613f296a3ebc3dc428912fffa10ad58ef698631b5a3a8ec0a53593fbae5", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq6X0HB3o?jM)H&5-v7zt=j&nB7f>vGiA$|Xx3CMyn3~nC&!m2n|FsTD7A$Vznv5KN&ZD;2AYnEe)S~DtWX{85Bby<_1V+JAQ#4iCfmE5R8de-4qZ}xLQgnq2A0{V^??Z>lfCrxAE3Y", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbKA;2~_|&h787#WXU&=nqH48zV_I^FE9E$Tx^Bh>*L$Z3UaiidiIG8f6-J#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbca", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbKA;2~_|&h787#WXU&=nqH4LKI%yI#+SZ>%7r@cMkI#>B`Y@g%m&?_;qLaZhOY{yIKN|aPs2dC}n9ugdf8Jtw6L@OO2~2$4fWO5Ld;)=aR3)AQ#4iCfmE5R8de-4qZ}xLQgnq2A0{V^??Z>lfCrxAE3Y", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbKA;2~_|&h787#WXU&=nqH48zV_I^FE9E$Tx^Bh>*L$Z3UaiidiIG8f6-J#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbca", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbKA;2~_|&h787#WXU&=nqH4C6`I)f|7H0_iUN!sI%p|PD^%)I3u@>Lo)l>D^FTEHMX_T`5(j}7si7o+q;}pQBYA1T~d8QPdI7@mf5KFfe9d!z4Y`Spuh", "oc": "fc6a9c6533b34219a3018e1c9ce9330c0e754864cd7341d488ae3fc464cdd85f73b1e9aabab2d18c8de2de82052d5ec9e8c906ef5d082a34b5a4e63234a2f831", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbKA;2~_|&h787#WXU&=nqH46KPW9$J3a=|Jqzg_kinIG(B$L#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fc6a9c6533b341a3bbe1d7eefbfe3457e74c9c4dcde2c1d40fafa6fe7bfe1cf225871f30f428f65a348062433db703d77583587a42443a1808d112f0514f0262", "a": false}]}'::jsonb; - WHEN 3 THEN payload := '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#YUj70Cz_B24U3#W#b#KGw1<@cS7(S0Ce|x{!!At-Epo5#C-8ZJATrn?7A$@`(u>=$?2X*e1UcJ`#2{On(Eq~PZP7^Gu{SL7X*)sN#Y!JpxT_uu4UfmrWp|*!", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbcb", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#Li)6dAJoLZZs|CbiZstYT&vn}P=yVCm1M9YnMJisIv8CoL6Tzth(-874C)8j_qYuX4Fv>J<<09@x_=DyfRUxdAX}Tz|H9gB(Ma8~H!SgKJ3-sUN*`Ics~!stkH^qucc8!", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#8-dM231ayoGQIzTv|n<6^Uo7QSi`z>1UcJ`#2{On(Eq~PZP7^Gu{SL7X*)sN#Y!JpxT_uu4UfmrWp|*!", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbcb", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#B}MUqDEGI9$OIF8zdRu#08c>I+EsdWf96+dkZ?0W$;<=H!>P*cm{8wStEQI>!D2kI*k=K$cv$^K=0Xj97nJcMQ@#2^fUgvLo_OazD!=oJIS)7m(-TE{U^zTUh^^@=iIRR^HJ", "s": "090a97b1257af08e8a7cad16e40fb4a7", "oc": "bb77a1f7ce1f2132c5f34c39590f280177e8d7b906ffacaea5b467939dd989b08f0d8b0ac8b5ab45c9366bb22b555417f635adf9039eda1f"}, {"a": false, "c": "TB;6@$i%dN?0W$;g)1=6?*cmqK@Kr|H5qT*v~f=;IrFg23bT?w]2]uT?>q1vb$M{qdK|&)G0S5qrVEKRfCUc)au*19aKGAONSr{ja?iC`CB:CB41$Ej6!A<1hNh%p1I5${P^0s{kv4wcv$GKjw=jY|FJ#%ji#2_fUg:1l_>azD!=oJIS)7m&VzEEJ^3tc^Z^u=oEzR^HQ", "s": "f5b9335c78186151a55beebbfa374a2c", "oc": "18e7a11fc91b240015538317a816200b52f823a2c6eec455a25a0c11d90913f684adcd9d1ab31b47453648f27c2a91aaa695746ead1edffb"}, {"a": false, "c": "*BbIkV^adN?4lx;g)1zJP*cmqxor4KVA>b0qCz{uNX@2XSf9UbcD`6D0sM|6wY5xR^!82ZE5slHf`r5rDk|}W5G<;1ynaO2jlNgq.~1DaS@nCET~QC(zM", "s": "faff9fe5367462e8bb722dd205e1c6f8", "oc": "fc6a9c641d7746992300d82c14271a4947a48d2c8969bcf59ec0b88f7558d0fce87a1c0e56d6718cc3da72d992df9a80dd5acf699638a5a85becbaa2593c4a4a"}, {"a": false, "c": "mBs-@V^%d1?0G$;gN1-J1*cmq6oTHB3o?jM)HBS-v7ztnqH4XzV!I^2~9E$8x^BhtOLwC3#aiidiIG8p6-z!x^Ubg,^U%oK4eC_z-Y6|02@[%2}T#|iH^dFeW", "s": "390b975d5e7d41f3d679af36ed0fe4a7", "oc": "fbc7d31708dfaa951573bc3e36cf1a4992d8f3ad8aa8d6f5abd466b31999eada0064f6fab9e8abf59eaab3127b4a509b56c54e6dac4edb4a"}, {"a": false, "c": "mBbK^;2~_|&h7?7#WXU9qn:rE]KI%&I#+IZj*7r@cKkD#>B`Y@g%;fw_*qL=Zh(|2SIcN|?fCjK#E3Y", "s": "3afa5e5660119d0389aed5d32290d2d1", "hm": "6bb7f4ed2adab7ff0df776cdd36fdbe7"}, {"a": false, "c": "mBbKA;2~_|&hR87#WMU&=nqH48zV9I^FMhE[n|x*<$Z3Uad3}iIG}@6-J#Q^XOgC^U;oK#Uz8WU>UeLLz-Y6R0ssP%yfAd,kHYdG$W", "s": "f7b930286838910f557b86bb5737aa23", "oc": "2bcaa112285f2a3a16a32c06a45f2af9b7d8f5a23f29b447a58aa79c1c94cd6b8ba8b64abab3a375c5346d05d3ba54a6a612c0dc5e8e7502"}, {"a": false, "c": "m1uKw;2{q|Wh7<7JWX(>=nqH4T6`l^f|XH0]iUN!sITX|MD^.)IdG.>Li)l>D^yTEH3X_T`U(j4Usi7o&[7}oQBYApT~t8QP8I7wmfPKFfe91Mz4YKS`uh", "s": "a61f957536b4e2ebdf7475da07e92acf", "oc": "7c1a585e33b34269a7718e1cc2c93e69dec736e4c77321d450aebfca23cd14cf63b169aabcb3d18c6de2de3c052d2ef9e27b41e55d6f9294c814463246aef831"}, {"a": false, "c": "mBbKA;m~u|&o783#WXLH`]q{%6KPW9xJ3a=|~qzg_rinI7mB$5#2^>+gJ^[%op#XzZ4U>d1L_z~Y6h0s!P%0fAzGiY^dF$W", "s": "05ba094fb17823446e5cb42f6c8cb314", "oc": "f5ba99e77ab3bba3b404d41ef7f83427874a9c6ddd92b2d30bef4bffabfe6f9995818b36f32776f03400b4333dc703dd7583582a12443ab8053d12f7c45f0682"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (3, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ&V+<(WNnWTGaHg#Y!CMS#Y6ji0Cz_B~413IW#b4}Gd=<@cN7)S0C>|20!-At-EpQX#,-8?JA,Pn-lA$@`(0>[b?2<*e[UcJ`v2{mnYE3~PZPN^G}{SL7X*MON#Y!JpxT_uu4UkmrWT|*!", "s": "900bcaf09fce308e360ca813ea99e4c9", "oc": "2d14ae6fc01675385212bc06c913c4c0b7d333a618aec42e764a6497159ac96ec7bdfb7a18b5aa4bc936ea02ed235456a035ce6cdd9373cb"}, {"a": false, "c": "mBbb;V+<+WNnnTGWHu#Y!;MH!Li)6cAJQzZ(s|CbiOatYT%vn}P=yVCm1`9YEMJisIv8CoLlTztfg-87QsXLj_q{u<4FO>J1M!J`#2{O[`Eq~PpPS^@u{isAX}Ws*#Y!J:xT_+u4UfmrWpMn!", "s": "23c914267a10f10b90bbabbb473fea2b", "oc": "fbc72114c8f02052755a2606a94f24013cf8f8aec69ec542a52aa99325998965ae54f08aa3737b95c5306b72128aa076a135c76aa2aed55b"}, {"a": false, "c": "mBbbMmu<+8KnwTGaHR#Y!CK7-B}MUq3]GI9a6IF89wR`#083>I+ZsdCfW6+dkZA6d>o9t+bf$Ix_Dpuh", "s": "fa63b97536a4e3e59b7c6d85b5e8c8c8", "oc": "43619cdb75b022f6b37658ada27797f635daad51f6fc4138ccffa7cbe256f4e433ebbfce7ed04231eaa28e45cb8e3bcfd4eb8a3f3d5dc3c898a196fbe8007668"}, {"a": false, "c": "uBbJfVK<,5NnWB(Eq&TZe1^Gz{S;7+*)h;#Y!JpxT_uuyUfmrWp|T!", "s": "3db9094f2d784ed46ef4b55b6e81b374", "oc": "8c6a9c2b33b291a338e1d2decbc8d2a236b451e95658266bfce4c4a6a1fe77a36a3ca5b6266e6d7d8dafde122e3905f751fe70e0ed0d7510ade23ef003f86448"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (4, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbM9aawi$6p*)^0c81h3+os2uK@4yqM@OKq.WC%Fow}~T%Apcgc|1WmCNQJ>3Blt#*({HBa<<9v%RN($VPMP&-eW1V", "s": "94b3ab0e0fea8bbd511eab6bf727c775", "hm": "ec670945e82c0b350435ea3d7e0ddf16"}, {"a": false, "c": "mBbs9-a`G~6aJ{+zn+~ra;Cw=8<`;V5mG5cf7,C@zCw;TQu*i5[8h{gF8T0K#327xt`*3p+DW?ot[VYEjnjDrbd5dNQ4npH3R?^tMq$YC", "s": "d6ec97ba2d7da0fe3677a8ffe8dee4c2", "oc": "f007b51db91f2a32e553b80ca52f2402b201a3a7c6038432953a6e7cb599996954adfd0cb3bc7ed5c2366d087b90547d3233ce6c4bbf20f8"}, {"a": false, "c": "mBmM9-awLU6a<#$On?~|a;CAdL}=-#}5R*3>lL?JTS5Bu(8R|Q~Y+p48[(KRGzixBc,P(>|YGn-@6uX+(!dwzB8QA|C*P=&$^#B;>1>9[oI)f=hpcg|XLBmCN(k53Iq$HC", "s": "83b257912881810065524bd76c37a011", "oc": "7bc7a61fe82fc634df5c3636c90f470dbad8faa7c73ec49aaea8379315998962861ff60ad9b3ab97cf366d029b2d39c6e635be6c659f71d2"}, {"a": false, "c": "m?Q19GawLU6ac?`qr$dZ$NLI=pL3~xkKpu~", "s": "f46c99754671f210d8231ce800ebbaca", "oc": "40619c1563b9c20d7e47372b95c1b4279fcbc069574af2d70be14cdd96da5166a6c5034b2edfe4c39814cc62d6d0f321db6d9103c0ff00316eadfc671a27a6bc"}, {"a": false, "c": "mFb2<-)wLUL}2`{Fs}]r_?Hj)cv`AF*>|t4}Y*YlO2XQnr+Pqd_|u0v<{TV}uK!bz)>?B_4+xpBxMa;Y2+`wxSdOU}|O~cYIn`(-AcB$Vfj{1przTWjt<01c|^}LFa;p)Q,0az``h@8OP[Ts5t]bz$V]*R3ORdV6FnhAWhE)*M>J-nozAcDgn97bb{DC6q}WCqg44X{d!i=+^Nu{rMIt~KA&!;ciS%k>X", "s": "d50a9abb2e7d3fba86fca816ed8fe4a7", "oc": "3bc7811cc81f2542755f3d07a911f40bb322fb4966aed425a51a67937898cf6e8fadf68add227b80ca311449ab275418a25cc86ca8afa17f"}, {"a": false, "c": "mBbZZA|9ab`lvsnLra?Hj)cv`L>Q)X$%_~klvkxr<)h~Ie5|*>?c1Z{glk(`DjcnBb%rE0$6BC9SR?ZBg}7y_!#|aq#%tr]K6AORpG(8T5s`kMAWrE)*8{J-+oilcwuqW7I9)DC61zWC4ghZGrf~UhoM^m", "s": "3b2a8d500b56bd10ab2e85db5490d241", "hm": "6fa85dbd76d2e71f8f75101ca3fddbe4"}, {"a": false, "c": "mBbJZA|9c2`{xsnr7a*y[)c7?8>ujdXK}SS$u%$W)pvC8#$y;w6W6&DF>M!xb,`-TLDb=hvYJasIgTqd!Z=+nND{r*Iz~aLn3ouk;{t}60E96vFDMxVauh", "s": "fa9f7985327ee2cca82ca458c5e11928", "oc": "ff54fd6774a3b274a30089fee623a01b02bbb9ce77072272e6ae3efc6b2d6ed68bfb95d4c55bb560db3eea06cffdfb6eb6c023cfba8c017d43aaf899f1225f41"}, {"a": false, "c": "|-k7ZY|9c2`{Osnrr|?HjCcM`3L1Dt#>7RH23|VZbg%~lyVEvBA2RBTYD-=hSYJq>I4^qd!Z=+n;1W;<^)-g>TjwP+|;@y+%6}=8kdzp#2(Aku&rKldLa~_6x3It|B_hJkt|Wopn^u?Ew@p{Jd+)?l;t#VT(KR3-MRb2*B=Hn`Tn8b$[_I`G&=nT&;|E;<^<-gDTjwP+P;@yUw6J=8nCzp#2!;`C8rKP@Da~V6x}I)iB_+fn6S", "s": "f3b9b78d72186a0d955a61bb3e34aa2f", "oc": "34bfa31884bf2682115f6c06599f640cda98d3a896abc44ba533639615ed3967ce3af2eab9b3324ac5366d027b2e5476863c42691d9f42ca"}, {"a": false, "c": "mBbKJ&82H2TUi~T:td8c9!nC$B?{WiO0saNt7Qgw6x6Qp(YP@rH*!([9CDzQ2{AV+=fcl{G8V)jCL^wm+`tV1bHLaOj3S9vuenVJ^XiWET5fG&_3vA3p0h", "s": "ba6a997546a42340fb6f53d605a02a45", "oc": "fc5a3c8a32efe819331184cb8c9b43bdc9edfb8bed633051581d87478fb98300deab235ba0779b3dd4670bd06c46010f7b6a56a9ab1dd7609f549801d905596b"}, {"a": false, "c": "mAbKU0X+I2TRiGT2&;^Bjfi`%ng#2_XDC8rKl4+aTJ6xNI)iB_+DsDK|+DrYWw,KQXgCt[mpM_Je~#b*?b5!OdY*(T0NMGN)z(Xa&9*-nQ)h#h>?kn@Er&IQ4C}9_BSd`F@P=ZxMI61!?^?c0jq19^_pQtfZ-2Ndd!RskzT`!fed?&hAZ_oqHc2^f#DuWhTu^y7Of|(@nlAzGe;5NP!$b|~rl7;", "s": "94b346415fe2845d52146b2277256a43", "hm": "76695b84ad46a64cc2054131b7fedf16"}, {"a": false, "c": "mBbL=IPx0[akGhoFvD#HKw+7V8)c>R(X9VOZ->csrkThDI`V^2awNV%eD*Lg#2#_&wl++_@8Xm3;o:v9e-kW4KG$kcGCHK2^T7Z3>f>$L", "s": "a9f89a2ea0fd30fe86cc4866f30f54a7", "oc": "ffc7a106c34f3ab21458bc06a30f2b4b67589319cc50c458f4b76f9312ff99493ea8f64db90ea904c534ad717a3a507ba635be6cad9442b6"}, {"a": false, "c": "mjNLWI)x0mA~GMoF7D#NKBmDV6Vl;PdX}1m[5-+>Q)=48N1jDPT`(7zO-|c+xQ?}ojyt(A(Aa*$]WW-pHFG8y2HLen=gIY!iH{C~(7MhSGYnV6AZ_ogH_Y)@#&2]hMu^_7OG|h-El]zGI;5HPN2kG~rL7z", "s": "ad9a3df40fc79d0e9524c51b51807fda", "hm": "65575dfa78deb47f86751d1b08cfd4e7"}, {"a": false, "c": "mBCLWaPx0`g~GhogvD#SKs+DV=)c(L(X.VOZc>csJkThV.`VJea}N7keDmDo82{_5=R+{;w8>B3hg?v9g-kFQNZ(kmDCHK2^T7Z3nx>|@", "s": "3eb937b87818310f954c69b153d7aa9b", "oc": "fbc7a62fc2112a94c5506c00ae172e0bbd68f32fc4ae547535b06549379b89698e04f64ad9835bb0b50dad02722b54d6a035dc0c3d37488b"}, {"a": false, "c": "m>bLWTPx~Ia~A9oSrD#_L|+DVCCeAR*CbuA0=X>Xc1e-BX^nM)f:ewrHXrD#aU(5LdkQh9)o{?hZVS@>Ou)3paUtdMr=AR?HK8kJV%5_T{X_C=8M;4wfuh", "s": "ea3f9f7f367332e0db232ad875bacac2", "oc": "fc6abc953bb9c219ab1d8e1d0efd117a734723240e626217b0105d7f91b9c3cd633cdfd1bdf8139507fab947a89ad55fd0bd8482e24c44648eac42c19e06c0db"}, {"a": false, "c": "mBbLWIPx0>{~GhoovD#SK|FDV6U*bFE^11GoovsVsKrKcG7^4V#2-_&w{++L@", "s": "4ee0dc4f4d7943449a0c5a1f6f874344", "oc": "f463346572a34cacb8e1d47f585c258ae1d9a3e255e2a72ad8e91be4e14b6b111864cd3ca843f95a68c482dd91d74d51ed876d714abafe58956c5570939dab83"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (8, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLU1wA1)W-q|6^shf&;l~K{B9^I7x5>AoMR>tStms&%Mrpmr@bIF>^_38f6*L4ixCEzZqg;J~zXCH$&#>@%!g;jo1i6*=>!NvDVteB%BPN401MUgx(l_IJTLdje;|TV3tK50kkPVz)(rfH>cJC#rF5b0<0=58>AfMQ%}{tSz*iH%8Q=~z2#TfT-;baVz8_*^me1YEm>!82", "s": "63f3f60106e7c47d5214976977294745", "hm": "84cbfb8ea548ab10c3f5df3dbe49d111"}, {"a": false, "c": "kBbLU1c81KW9q|6|qh0Z;v|Kh8(5Xe,m`5OZ4>XL?tyheX-WPqH8&DwurUEGL2}:8sIC-1k(wGM~KvUG]5^^5*W7zvh8Sf79};k`{A+B>", "s": "dd06978526c93f2e86aca8e7e60ae4f1", "oc": "f33aa21dc6d623a652c7cf56a91f240ba794c3afd6a2ca4aa5bc07e30c59896ddbad464eb9e3ab85c53e71067b2a5973a664cf0cae7cc6e6"}, {"a": false, "c": "m{bLtuc41)W9qWq44h(&;v|C{LTm-m!hML`pi*@LImxKZWw>fabSN1e(-n7B;z>9`O-Nb<1;`<{tT3Q%wObv;hjGwxdMq9}Q$%qM).|9Nzc{3d.fMQ%t`QCe*iE<8Q=|.avQ$R-;ERnz8$~^merYEm>!22", "s": "ed9add5645a49d0e2d26844b5c0062db", "hm": "6ab758bd15f2be7fcc76161c88fd2098"}, {"a": false, "c": "mB&L<1c#qbW|q|644h(&;v|6{8(5XD9m<5.{4)nLV?yh~U-VxqH8&DwXvU>Gs2}y8sIC-1k5wG7ei{hGm5A^m*WWfvh{x}@9]?k`{p+B>", "s": "7866c181771cb98f928b657b8330cd5a", "oc": "fa432f1a58112a9215531002a92f27b7b7d9f369c6b4c51ba5ba6e581d9d857986a6f64a89b4c64ac016bd027b2d5468a605de60aec19916"}, {"a": false, "c": "mybUU4c41)F9q$o{dC5&;vjjq(POrHmKL&~DG=Y0?X*yf!_V=puh", "s": "ba1fe9b5547c42e3d02427e837e0cac8", "oc": "fc6a9fe533c322e9a3018e1c30830748f30aa131f23469a90be9d99944edf4ae3c0e13a4f6f3b4fc7a79fcb576c5889a20066363f85c781026a9e0b2d38fb50f"}, {"a": false, "c": "mBbLUOc#S)W9D|6Guh(&;v|K{wBUWi3XE;%fXp3vR3|wfRRrQr#3}}NsIa]12.TGMEK{nGm5dt5A|@zv|8xf(>(K{`{pwog", "s": "3d9c05be4da8730aae80bc1ff6a3bd4d", "oc": "5f6a9c6f33b351ceb1e1d83c493c4d1cfdb7d748469e5f961fad2bb6653d3a71f2c91b427a9dcc04fbce7ef1ed2fec1614ee72f73c987383266279f931400e6c"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (9, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "PB=K-Ks>n^KDAAs3>I~VeAZAcYM95W|8fb~$F>=F@t{DvHgE*LguPIi`JQ>>y*>Qi$PRktCsetm7#HPK9lde?|IW+kO%6dKMtq2&U^U8KUq1dArOMF>PR|q|o~0(Ggse6=_Yr4z{oAw&6@K%", "s": "9493d1017fe2845d221e98345729e745", "hm": "8066db01ab5aab32c5255a7dbd46d016"}, {"a": false, "c": "cB-|%Ks*M;GDAAsr>ISkeThAc8$l9%O%P$urm@ON+n39d4|A;-uxz&A1BbZvP2BE|z#t*XuDA)f(KK%:4tHXChf8v+p-%okD(@t`M>K]8TdKt!Whd!P+MTol0XF)I<9~6fVUYm!F)kWkGAUq1dArOMF>S0C%>Rmq|o%0(Gg{rqt_Yr4z-oAM&_@KZ", "s": "5a90ab5c0a069d0469de5a154400b9d9", "hm": "2ab35d4ab2d8b7ef86a566ead7fd7b8e"}, {"a": false, "c": "-obKuws*MeKDAAsr>B>ke{ZAc8Fpw%O%($urm@mN+na9d89A;{u7l`AW+bHG#2`ohfD$<,u<3m1w(49eAfBZrrb8bg#HE0$crJzc9NZ|a", "s": "ffb1398f782061089d3b82bbc736ae2b", "oc": "fb9916cf1e8f653214531306a91db608b328f3a4cc3e8445d54a68a31b99ad5f8eabf6c4b903abe5c515bd02cb2a54661695af3cae72a90b"}, {"a": false, "c": "mHbK%Ks*MeKcd2sr>-~keTZAcCGjI{%Q+QOyEFX-3y(qY)3lx;8Hqp`hPTa2z0mDr@mW=DAWO2hJPN=e504DkOjEY%T|LeHr6#e>tTrY05o{R>615-r+<~", "s": "fe6f9977381462e69c2f91d900fac7c0", "oc": "d9d18c6f3cbd4219a31068256a7b7863176c8cf4aff0e00f7564687f90879ad9209588449d42039fdd9090b6f31e884464703708657e3d6bd03bbec10b1e8f55"}, {"a": false, "c": "ZBb_zKs*MeSDAxsr+I~ke}Z-ccGz~_22KG1k~R`YF94&a$;cYKYT`8}z#$N,}a`dF#h6vy%zy", "s": "fa9b07060fe6544d5b14914e2869c745", "hm": "a8f7324474495e925375fa34b64fcf14"}, {"a": false, "c": "mBbC(pyr$AQAeXmOIVmlKP4hu96ceU*9XV>C8@M-tf#Br;II<3WFOOF2ER)q=fo?c>M1<YTtk;F|`kOn*6<=yXB?_1G+!(2dzS!=}+nV`S", "s": "3a6a4c89003692b0990e851b5490d2da", "hm": "ea1eddbde8d8b96f877f861ad8fddbe7"}, {"a": false, "c": "mBbn(Xy>$]QACvmOxVmOv;Ih}S6cgUp3XV?68@M-tz#Br;^6<3eFsjd2G68q=nogcYM-<KpJGKvJ%zr", "s": "fcbc997596742b70eca42dd835fa6a08", "oc": "fc671b6733b34719a30dd7a963eaf22e6205de7f53f196cd75ccbe421ae1c1f5733ccce46b1d6a3598bfc176e5ab1bb3b56228a4ff9f40cb1ab1766c4a1293b9"}, {"a": false, "c": "mBdK(yy?$A#A~JmOUVzai}t]u6n`jLF983O3k4Ho>^k_=8ic>`uf!x(SMHsK!+;7>KvJVB8", "s": "37bab0af4d7ed3446ea7b81f6610b34f", "oc": "fc6f9c654ec7a153bc51f83cd956da3893c137cae5c2de09242783d00a867459b5a81a89bcdc20b0a6c5ab447cb93c5933051fb86416d1d0f081ffcca749ae73"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (11, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBDe@ks}dN?0W$Dq-1-JPLcmqg%JhW0<:Z^;SlNn$#fXJtNW6Ve=3rNa@z{*f4`tsKp@gXxpTo*%PWh*peL^qz#3EJ`x7KRuY}yW#a2OV?;-Z2rNI+9CWCgDOt!Fg2d-K=cW7ljFiM%51JEj66A<1V!@FJ1I{$]IE}thw=uuc]KWEwG+k8]puM", "s": "9413d601ed9784bd52129b92a84cc745", "hm": "1063d844afb8f952f3259a37b78ed056"}, {"a": false, "c": "a_bL,H^%sN?0W$;g)1-{P*Umq>21ksgI>:D60s^k=}.#%~i#2^fUvv1o_Oa%Dd!%JISr7m(VzEQU^ztUh?^w=oI{RpHJ", "s": "d90317b5b072c4f6497c2886e10f80a7", "oc": "fbcaa112cadd8e9213b3c706a91f241027d7f3a960a8c04fc02f64931559a9691ead764db9a32b46cc366d027b992464963ac86c8d9eda14"}, {"a": false, "c": "?4bL@V^%dN>0W+;g)1-JP^|`qK@^r|KNVT&!Vq=;IIFg##bT?wF2^uJ?{D^[q{k=K5c6IGK=wXj973J#%^i#MdfUEs1o_pa9D!QoJIS)HxqVzE]UrztU4?]u=:0RRnHm", "s": "f2be37817818659a5a53fb9a13553ad5", "oc": "4cc4a80cc87d2d321a55bc04c21f240ba74bf399c6ae444513bdb393e59919604e2dfa4a99b7ab45c5966607d12a467bf655ce6ccd93da15"}, {"a": false, "c": "xZ9L@p^%HN?@W$;g)1HJdScmqBor4+`y]*P$(X{-NX;2XSf9UacD`r9[d(|6wY}.0^!._|EBslSf{L5M@5|7W5R<;u#nak2^lNO0F?8za{FnuET~!~5zy", "s": "7a6f9b743669e2e6e2242bd207e2cab8", "oc": "bc649c603392fe3faf0ad09e1ae4ba4918af83ef896f3134de209381f7b854f0e84bb2c4f2b695fb40fc4229e2f5f290ddacefd986f195a3e3e3bac3593feaef"}, {"a": false, "c": "m7iLMV^%dN?0W$D;I=-JP~c|n6X0HU3o?jMAH&5-v7zG|L3yh=@WwNr0P9UmhuT,e>=m&nB7_>vGi?k|XxmCMys3Gnn&Amvn|~sT@7A$Vsnv5w|&`D;2HKnve)S~D-WX{8nBby<_1V+hAQ#B8C2{E5R8de-4qZ@xlQgn?3A0]V^p?ZLrfCFxAE3;", "s": "9b9016010fe1d4cd598f9169b829664b", "hm": "8967cb44a848ab32cc0d533dba45bf16"}, {"a": false, "c": "mBbsuIU~_|jE787#xX{&=nIx%8ZV_I^PE9o$]x^Bh}*L$Z3xaiidiIG8f6*Jr2I>ygC^tOoK#UzQ4U>$e|_z-Y6h0+sP%yfAd=i1^cC$W", "s": "c20bb7b0b07270f98679a8f9e60f37ac", "oc": "4b77a19fc4ffda241c531f86c91c292ab8d0c5affaaed44555ba679bc5d30fa34eadf642b9b3af4750367d027b175f26663516262e285b77"}, {"a": false, "c": "dBKKA!2~B:&.787#.XUM=RXH4LKI%y`#JSZ>%7r@;MkI#>B`Y}P%me?_;U|4ZhOm{yIKN|aPsAdl9}9ug1f8ONwDL@OO2~|$4fWn5Ld;v=aH3wAQ#4iCfmE5f8de-6qZ}xLQgnq2A+{V^?qZ>kfCrxAE3Y", "s": "3a2a56ea01f6900e999ef512544ddad1", "hm": "1a785d6ebbd2b79fb675161a841d3b62"}, {"a": false, "c": "mwbUAA2~_|&;[87#W0U&=&YH48zV_>~[E9E=Tr^Bh>*L$y3UauidiIG8f6PJ]2[>OgC^U%of#UzQ4RoFeL_m-(>)l8|^FTEH}X_Te~(O}7si7o+q;}psBYA1~~d8QPwI7@mf5K#feNd!z4Y`Siuh", "s": "fc0f39459a74af40eb945df8059a5178", "oc": "1c6a9c6536834b14a6c1a41c07c93acc087248642d7941d4887e34c45dca583fc3b9e92f5ab2d18dd215de8ba5265ec9bfc900e92d002a3d2574e63234548831"}, {"a": false, "c": "eBb(A;2~)Hhh787#WJU*=n}H4-KJR!KJ3a=|>qzgVkqnIR(B$L#2^>O|CH(%oK6.8[4:>FeL_z-Yvh3ssr!yfAd]iH^hF$W", "s": "3dbab10546c123646e7ad78f6e81b94f", "oc": "fd269cdef3b0411cbbe198ee4bf4345f221c92b4cdeab9db8aafa6bedb2e2c32d5876f30f45666e63e00d2433da303d775335b5a42443a182bd1e2e0204f0262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (13, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mo*~&V+<+WN+#TVaHg#8!C[H#YUj70CzDBQ4U3#W#b#Krw1<@UK7!SyCe|xV!!7t-E|o5#%-82rAzrp?7;B@`*uY=$?2X*e3>Vy^GQIiTvzno7U+imz>1UcJ<#2{OnvEq~MEPX^_{{S{xX*)hN]Y!JpxT_uu4UfyrWp|*!", "s": "d96bc015f0de30fe86728806dc4fe6f9", "oc": "f9c7b244c81f2d51b553b406ad70240bb70803a9c67ec415f5ba66931c996a698ead9b5d39b3694025336df295205476d4359e6cad9edccb"}, {"a": false, "c": "VBbJ&?+C%k6Tzfh0-j74C)8joq1uX4Fv>J<<09@x_=DyUcUx#AX{*z|H92B(Ma8~H}!gKJ3-s>N*~Ics~!stkR^?uk$8!", "s": "3d981d1101e69d09a92e25bb5a902bd1", "hm": "6ab7d8b7a8ed708f8e9cba1af82c1be7"}, {"a": false, "c": "mBb2&V+<+WNjWTGa-g#Y!C%<3u9$zKf~{)d{42&14s2=>F5X4Mb{ApcMZd{WmCtxJ>3Blt!*(|H$MM,-awL&6a$Y[m,g6u=+cF_NtB8QA|boP=&$^#B;cGw9aoy)SsApcg(X(W|josD>3Blt5*k|HB3$VT>Zw*7&1]", "s": "ea9a1c9601d69d3da06f881e74b0a2d1", "hm": "0cb75d8dc8d6b70f8785891af67d29d7"}, {"a": false, "c": "mf}M9-a|LUhag?+zb?~|aDCF=m7);V5uT(oTF@C>zCw>yw2*id#c0ogNqT0K#327xtY*zpbDW?ot0V^1jwjDr(d5XNQ>naH)v{[a}]2QC", "s": "f2bd3c817838f10fe94bab5bc33c9a29", "oc": "f4e7a120941f28b2dd0abc00a91e287b67dff3a9a1aedaee0554a7e31599f0638eadfc4129d3a9454d66ed02d89a5778ac36c426a0af216d"}, {"a": false, "c": "m0`M9-a|fUamcKHqr$dE$NZI=9LiQxcKp?Hj)c~`YFJ><*4RJ*8)O2?Qqp+Pqd_9q0vN<&V}unT$W)>?zbD+xpBxMa@Y2+`wxSdO1}vO~cKwn`(GAcBj{$j&-QrzT6jt<0Icd^hMFa;pBDo0k9t`h4]OPoTs5t(hz$Vh*;3X1K-6|fIoWrE)*M6J-nHzAiDun97I9)DEt1}WC4g$g=r!U$hoVnk", "s": "9493d6020fe785ad52144b64775ab741", "hm": "80675b485848ab52c3056a98be88df10"}, {"a": false, "c": "!BbtvCR9o2`{[s9*ra?|j)y}`8vu4C)p2C89(y;q6W3&4h>.@|#9<-TLDz=hvYJq4I4Xq-!Z=6n4D{~QI~~KA&!;ciB%7eX", "s": "550ed230fc2d31fee273a619ea04e4a7", "oc": "fdc0f61ac42f213d4270b5c3a91f210b47df53a96f4e2445ac9567c4604909af8eadf64ad2bddb4fcc4d7b025b2a6b24a635ee50bd99f1f9"}, {"a": false, "c": "mZbJZA|;{23{OsnFha?,jzcW`>`Q)@Dp_~ll`?<~cnLbyrE0nYBC9S2{S?g[7C_!}jmW#%|n4KQAOU)GDZTCLKOwAWrI)*M{uino%AScu(_7I9)DC61#WC4g$Z=r!U$ho1ck", "s": "399a5d5601930d08a95e851d5995d7dc", "hm": "67325db0e7a5897faa751610d8eddbb7"}, {"a": false, "c": "^BbJZ)|zc2`tOVWrr`?$j4cm`i~u0{XK}(Syw%$>)p?h8#My;w~W3&4e>>!|#2`X-LDzxhvYJq>QlXqd{46}nYD{rQIt~KA[Ruciau7eX", "s": "83d9378e781061b8455e6bbbf33d572d", "oc": "bbb7a146481f2a361d970a0ca9203f9b97d163a9c6ab374aa5586793ff9279e937bd364eb5b4a14ea5361d92722a3176a635bc851e3f41a9"}, {"a": false, "c": "mjb&EZ|9&2[NOsnrra?Mj)J3`v065t0DegdiI%ijveChO#CC?OY;n}OPE-K{hTyWAP^~yBgzCaLT`VEQy%ti80#96vFW+xV1u{", "s": "09a599153f72bfe7d72420d7059ceac6", "oc": "fcad9cb2134a12c9a30e3bdd573b43a6827879ce94077b6f36ab37027d6d3c208f1a75e6e755af20db30ed4092cd6afeb6404dc3b43cde3d423e8821f22c8f3d"}, {"a": false, "c": "mcbJOB|9DV,{OsnrrD?cm)cjr6LGDt#R7U?2q9nZ(g%~l]y4YB#2`-TL|z=h3YJ%MIaXqdWZ=+oC#{rQItRKA&!Xciy%7cX", "s": "6eb00c3dcc39226fd2b9b3d366d1ea44", "oc": "f26f956633c34ebfbb81e40f0a7c29e8fd38c8c85dabaa8ed1522bcf9a279ef87107119dfc7cb5415d13a9c37cfbd2377d886dce5afdbf4135ccf6a2a243861d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (16, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m@bKU&Xg$KTUi~Te;1W;[^)eg>TjwS+(3@yzw6)=wkCzp#4_1ku8rKl4LaNV6xNI{i~_+<~$JPpk26PyN2%%cTePE&", "s": "d90dfab54f7f3afe547c1d16e10f64a7", "oc": "8bd8a413c71fb93e1553fc06ae0f740bbc38fea936cec06535b867911507893a8eadb14ba9b1ab49ca3d6d097b29f676a61c70e9819f2dbd"}, {"a": false, "c": "mB5KU&X~H2Tg*~T2^d8cK!nC$0>BOl9A88z0VR*?-yakXd<[TGopl^d?g`@p{)-+jMl;FJg`(KI3+Mf:2}9=fA`UnAb$&_I`,%=n3n;1W;H7)-g>Tjw^+Pm@<3w6)=8kCzp#2oXku8r)l5La~`6xPI)iB_U$>?hW7O0sDNK4Dgdbx,Qp(YP@w=U!AK9{Dzb2%AD+ZfcY{G8V)OCL^E9+`[9w@H`aBJ3S9vueg6Jek#b7?be!O@7*jT0qMGN)z(Xas9*-nQ)h#h>?kIzEr4IQ4N}9_BYS[w@v=ZxMI61!?D?:%KKJ<^_thgfj$|NdG!8$kzc)58ed?QhAP_cqHcY^N#&Q*hT{^W7Op|hoElmztI;:NP!2kG~9lZz", "s": "089e8611083782ed5914ada67729ce35", "hm": "8267db440bee7552c30e1e7dbe4e8f17"}, {"a": false, "c": "-Bb:MIPx0Ja~GhoxvD<}||Q)|48!1O2PT`=sz_{|IAdQ=}b+y+(-NAX*$2WWPpHFGio2HJ^n=gIYtir{CK37KhBGYm*6AU6oqWcY^.!&Q:hT|^_7OfHhK#+mzGI;Kc]IkTQhIsVV6a}NV%eDmLo#2{M&w1++_V}1B3hg?v9{-kWQNK(kuGCTKN^T7Z3ns;$@", "s": "496cf081b818610b16726babc1edaa2e", "oc": "fb77a1df121f2aed97555b02a90514db5198a649d6ae3b42a58d97b1129ed9698e7dc35ab9b4ad48c5386d0ecbf35f76af35ceac3da4999b"}, {"a": false, "c": "3BbLWcPx0G9~Gh(&QD#+K|0_VCCe8zWZ34A0]X>Ocf>qR8^+MRfse0r$V@W%]U(5Gdk~Q9)o{EeZSs@=9u)3SautVMP=(F)HN8k0O_P_Tq+_}}^MU4wp)h", "s": "3a6b31764374dfe2d644ecd80ceacbae", "oc": "ea6a9a65dfb32589a3c1fe9d824fd119b34fae04be796853d011c67e917fb3cb0b1a8f7c53fe58d60abf3987a864de3ac0b4248262410014478342c158a5cfee"}, {"a": false, "c": "mBbLsjPh0`a_Gao?vD#SK|+tV6Ueb%<^QUoJovs^I3V&fuBxqi#2+_&wlq+_w8_B*hgBv92-kSQYG(WcRCHK2^TGZ10x>$>", "s": "25ea30de2df923441679b919d781b343", "oc": "886a9c6a03b343acb4ecd77f08ac24ae28290ea0ec238a21dbe450a587a9fd13b26c5104f0cbf9f288c8e29a72eeda8af7576dc1aabc7e59b51aa6dec359a150"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (18, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mmbLU1c41)WYq|64^h(&X|!a{YC^G785DAJM-Utm0vJFD-r{m|!bIFm[d38g6OL,JxCAzZqg;J~zXC{w&D>@%AgBjo1i6L5>!N>|VAeW%BPPh0)fUgx(>_IdTLdje%|Tm%t350Fk9Vz)R1@}jcJ^s$F5b0<0458JAhEj{t{tCz*iE%8Q=~zqkT$a-;a$Vz8m*^me1YEC>!82", "s": "9c936f040f178452521b476916276145", "hm": "84adfb44a9ddab37cb0b5a3db64edbd6"}, {"a": false, "c": "mBbLU1cZ1)W!J|6433Z&{v{g{8(OXe%O`fOZ4)XL??yheX!WGbH8&DwEPUE[#2}y?sUC-1knwGME!x.GP5?^5sWiXvh*xf;9(;,`{piB>", "s": "f90a97452ad5defeb67c1c1ded2fe4cc", "oc": "fbc2614f38ac2e3215c3b376a9802437c7a8f3a9c6aecc4535ba67e3850984a90acce63ab98310f5253f9d537b2a5d44ae3a7e6c7e7ed026"}, {"a": false, "c": "bBbLUJc41^WRy|644<(-;v|K{LTk1A!h2_`pBO@*IAPKZtEpOPZSNIeN9za-dcv1;C<{tmiQ%w+SvChnGw`dMo9fQ$%hM)m|ANzc%mdAf", "s": "667939b6718f56af955b0be33337aa26", "oc": "fbc7a115c8188a3235febbf4a91b23d9e2d8acb9cc5ec540aaf1676a109f69388e8ff26a5edcab48c7e61b057d23507f9335c86caef1a9dd"}, {"a": false, "c": "mB>L91c41SWQq@644hQ&Iv|K#BtBAW7K@4w1hhC5;PH(AV+K)Y-PvUiIy10hxn%;@8H,J%V0<+NpVd9b6hMhIO|:j5q(5VCHmK|&kDG=Y&?X*yK!(V=gu;", "s": "b4e6b975363d7210dd2429dd059a8a58", "oc": "8b6a9d4533b3ca04a3a58c3c9daecc9a190b41e55634c7a90de98905d516f64cac850ea4762c718c7876f8da7cc5c79c3bf863b3a15f5e1f8007e94d9cc7b209"}, {"a": false, "c": "EBbLO1l4.)?94|644hlP;,|K{IBUWadXM;%h8x5(9(;k`{p+B>", "s": "34baba4f7c7915946e7cb71266810344", "oc": "fedb9c6cb2333b73bb01d83c476c39accdc859c5c61e5196b5ad28c64c3d373edba9dc41f89dcf057e522e3f4d1ee8092ac075933ca37354d64ce969134041f1"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (19, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB>K7Kb~veKDhAsr>I~keT{AcYM9b4|2f]~$D==F[t{DF2,I0-uEzohcvX`Jw2)}w5Q{zk)bJNK)s@otF<)ubvZ$cQ@NPHK6aW_Imu>t*L5KP2i3CQ>>aPXQ9$c9l_CsetbJ#?H2=ld8?d>W7kO%6Rmq|o~0(D8se6Z[!r40udATlS@KZ", "s": "9093d66109e7c42d523b2b190729c04d", "hm": "8b99d15d98380d88c602809dad7ee416"}, {"a": false, "c": "mBIKI)o%Me|RAXsr>I~k^TZAx8$N94O%q$u,mTmNAx39d89A;-Oql&A-BbZ>#2-#hz#$0V>I`keTZAcGZ.^pqEVl0=C`m5Dk)f~Ku%DEtHdahf84Bp-cQjD(oz`M>o$8Tdov!51%!P+7A<}d_F)I<9~6HV|7;rFuk.kG[Uq1dArOMhQPj4zuoATa_dGDAAs~#I~keTZA+8$S9%O%q$urW@mN+nn9d89A;-u7l&1-RbZG#2$Ehz6$NVuc~keTZ0>CGe6r6#$>LTFY89odRy6Z5-r)fh", "s": "fa6f9c746424e2e4757354a415efb2c8", "oc": "ec6a9c6b07b33219d90958147272762b195c22255042a83f4ddb8a7f90875fd924ace46bd3b903ab5e5ee266321ea95e617d375f667e306ebf1bbec3e13e8f5c"}, {"a": false, "c": "mB:K8uspMeKDABJr>I~UeTDAcUGz~_42KF1knesB-54&au;cYb#2-KhzvmNVule.e^BU$Gv&5>Do#vu2PS+W@PmZ7i!^eV,qHXir[e>f@;+>|Nish^;HWXykH?>>a6aF#h<|{KwKvJ%zy", "s": "94c3d6010fe684fd5f1bab697729d7db", "hm": "e0f79f44a84ca5d52e05bb3d5b5ed11a"}, {"a": false, "c": "mBbKw0y_$AdeCYmOjVE~i}jhu96ce>g9TVC>8@@-8z#Br;JGKv+%fy", "s": "f0bf378bb818610f965b6bb8cc17fa2b", "oc": "fecea146c81d2a321e5ffe08a91490aab1d3fbe0c9eec44ea82d689317e9e9c9de47f84ab9b7ab45003f6d024b4ffe70bc35fe7cadb24a1b5036de4f07abb519"}, {"a": false, "c": "mBcK(>yr$AQADXmd>xhOi}Ih7Bte;>O6vJ%zy", "s": "3d6a224f4d8123bc607cbd1f96314448", "oc": "f26232a5c30371acbbeee82549bdd2c98121302a6ec264047e77031dad3bf10d1aff4379bcdc27c236b1954475b9d1dae70c6dfa060e11d7757d31a18860f211"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (21, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbp@6P%dNq0$*;g)1-JP$cmqX3JhW0TKZrG*lydS}fXJp|W!V*TiJ:F2gXp7(:G`HW);peL^yzOB^4`x7KRuY0gW#{2O0?F-ZN{NIo9CWRgDbt!F|2d-I}cW7AjFzMo0.$Ej6jA<1h?E%`1I5$YIP|!Iw}uuJ$|{EwG+c>(p(5", "s": "0f93dd03d3e763eb53a796e978b9ad49", "hm": "8067db44fc61aba9c3056dc1b240df36"}, {"a": false, "c": "mWQL*m`8wctsgI>{8^kp{k=Kwcv$GKlwDjZ7#lL%%i#3^dUgLvo_IazD-{oJ|Sx7m(~zEQU^)tUh?^@=o2R|^WJ", "s": "de0897b5205710eeb2dca144e30f0957", "oc": "55f0611f731faac67dad3c06e91fe10b57d4f3a936a7c625a07162f31c998abe1ea0034a2973aa45c5e6ca677b2c4e761625c34c9dfeda1b"}, {"a": false, "c": "!BbLXV^)dN?0W$;u;1&JPIcmqK@Jg|KLqT&!~f=;lr4gv#bT?wHq^ud?|Q1vEZM{qDKJ&)I+{0qYVEkQVxU~W(u*kO;gk8Aef*ceq8?1t?gIQT}>0s{LfKwcv$|K^wH=j&|H7f>vGiA$|XxTCMys3~nC&?_LnjFsT)7{$Vzfv5KN&ZD;2AYnhe)S~DaWXq85Bby5_1V+JAQ}4iCfmO5R]deH4qZFxLQAnq2A0{L^o?Z=lfCrxnj3Y", "s": "9e30d6d101e7865d6eb4ea097529c747", "hm": "8077db68a8482b74179d6a9dbe47df1a"}, {"a": false, "c": "PB0KA;2<_|Q&787#WlU&=nqS48?f_%^FE9E$Tx^B(>UL>Z3Uaivd&{G8f6-u#K^v=gb^U!oB#}zQ4U>FeL_z-Y6f0ssP%yfAd|iHrtH$W", "s": "5a2b97b57c7ad6fe83740826ed0fe247", "oc": "f8ce2b1fbc1f29e1bf53580da2271404b6d653a9d1aece45a70a3c337399fc694ef8a63bb9b3af45c951ed627b2ec496d635d5fca394fbc1"}, {"a": false, "c": "JBb=A;:~_?Mh78l#WXU&SMqH4LKI%yI#+SZ>%7r@cqkIV>B`Y)g%m0?_;qLa2hOYDyIKN,ZPs2dC}n9WgCf8JlwUL=OO2~w$4LWO5LTc)=aR3)|Q#4iCf$E_R8dD-4q)}|zZgnq2A0{V^B?0>lfCrIAE3Y", "s": "3a3a5d56a9309d80f02e851b549041de", "hm": "129752b775d25713f315164ad8fdc4e4"}, {"a": false, "c": "x8bKA;2~_D+h787#eXU&=nqH48zV_I^F}9E$Tx^Oh>*L$+3UD^[&EM5M_k`c(j}7ci7oa&;}pPBYAxT~:8QPVI7@mR5KFfe9d;74Y`Spu!", "s": "ca1a9915139ce2aad423fd6806ea9ac7", "oc": "fc919c7533977219d1018edc9ce933c41475f87420734c33c80f3f006e5d785773b4e908b0b6d38782b2f443252d5ec928c196ae5d0815f4b5a4569201a2163c"}, {"a": false, "c": "mBbK{;2~_|&W787#WXcx=nCu46KPA#mJ(gC^U%oK]UpQ4U%yeLtAsY6h0ssH%yf=$p2XLejuucc8!", "s": "3023d6219fe0882d52129d797a2bc781", "hm": "8fa7db4da868ab42c3d0618bde40df16"}, {"a": false, "c": "mB+J*V+<+WNnWTGaH.*YLCMH#8.dM2S15yGGQIIT{6M<6ZOo>@{ixzD1UcJ`#2i}n.Eq~DZP7^GO{SL7X*)sN#YzJpx._u74IfmrWp|*!", "s": "ac9c27582c7df0aef68c40d8ed0fe4c6", "oc": "ffc7aacfc51f2b3ad5d3dc1da98d240b59f4f4a95658c49515bdf09172b51969ba2ba644b9b3ab47c53f6f022baa6471a6b51da1adcef1cb"}, {"a": false, "c": "mB<%|f+j+yNn!TGSHr#:!aMHPLi}2iAXoLZ6:|CbiZ5tYT&vi}PSyVCm1Mq#n@JiHIf8CoL6_zty(x8rPK)8jvsYuX2Fv>X6<09@x_rDq!=}1dAX}Az|H9:B(Ma>FH!SdKJ3-sUN*`#0]JWst|2^qA4cW$VaHr#u!C}H#W}M.qDeGY9$O7F@zdRu#08c>3", "s": "553f987d3174e2e09f1422d805eaacc2", "oc": "fc6dc3653fb34119acd0d83a3a6877f8fadb6211fa8c9da967f677c7185c0d01131e91377fd0325feaaf8e62c5803b6adfee8a513c5cc48e6425962ed404d869"}, {"a": false, "c": "H&bJ&+<6+WNnWh3aFgWY!CMH#6TnlsnXyBmr-@x)ln{T#JvC%<3u(hE{b~DTmu42&14G2=>MWXBlb%dpcgZ[1ivCNxJ>$Blt#*(E3Ba!j1>L5N($VTMu&(eW14", "s": "98e3dc020957955406849b63e028c7fc", "hm": "1322db44a8480b3ac3e56a3db9484f26"}, {"a": false, "c": "3BTH9-awLU6ayw2lid#8m%eeEbmP=m$^#B;c1>9:oy)SsA.:gZC1WMCgyJ>3BltY*(|HBEC*;CN>{w2*i2b8VARNqT0K#bRP+tY*3p+DWAotwVlEjnjDr()5}Nx4npH{Rc^BcYHqMAd^$NZsZpL3lx5:uuh", "s": "fa1093773144e76a49251ad885ef95c8", "oc": "f64a92493bb32249a301ab159059d9ef98cab9735c1bf2e157ec0cec8fd2dc6da8cc109b22d522c7b81dc89a8dd0f2d12efd71deb0f278517fff6c171967e84a"}, {"a": false, "c": "&neM9-aZLUEa4,w%$>)F?0J7MyaQ!WO&4h>M!|#2`)TLDT=hvYJqD(4Xqd!Z=+!ND{rQIt~Ky&!;UiB57eX", "s": "0f0b9db52093f8f805fcb831eb063baf", "oc": "fbffa177a8df253215530c06a21febbb409882a9d8e98c48afbef79ae5f989118ea9264ab9b231b435f34132db5ab423a6854eaada9f31f4"}, {"a": false, "c": "GBb9c3`HOsnrmP?HWYcv`L!Q)X#p_~llvpx4<)h:Ie5|*>Hc1ZiBGkU`q>cn_bBrE07%,{[|R?ZTgR77_Sij{q#%P@4K6xO{pG8KT1L`OMAWrG)*za)p?C8#Gy;w6l5&4h>M!|#TU-TLD,=jvYJqdI4XqdNZ=Z#Nz8rQIt~KAl!;ciB#3eX", "s": "ffb958f27e9e410f904bc5bcc337aa2b", "oc": "f0c7a1eac8178c3f1cd3bcd679af280b6bd5036cc6a0c449a1b51790859f8a6e0ead064ab9442115c9a67d02bb2f8edfa2a5ce6cad8f36f4"}, {"a": false, "c": "mB?JuB|9c2`{(sJcra?ej)cv`|q6PtODegliI%ijveDhO?CCfOY;nX=[UW6{hNyWA}-~yBghCTLT`ouFy9tb80>>s^FW*x6puh", "s": "fa6f997532742ac04b7b26d838eaca78", "oc": "fc888c65539142e95a01821d5c3343a582b976ce4607583d31a736672b09afda8fa1f5df6555b7402b32bf09bd6daa87c300ffca038f457ca28388e111728f91"}, {"a": false, "c": "CBCJZA|9c27{)snrra?H|mcv&6LVDt#{+OH2q5VZbg%AgyZ4vE#$`-TLDz=hv6J{DIr@qq!Z=+nNDQsQIt~KW&Q;ciB%)eX", "s": "f748004f427c23536e9a77b3a68eb544", "oc": "5c156065d3f371a3b1e467ef0ed9f8585579259ee7e79e8ea41d2de98d21b268560761331c12b7fbde5078ffb26b9161de882d3ce15cbc674556fb078cffe6a4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (26, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK+&7nH2MUi~T2Y1W;T^)-g>TjwPV|;@y+T6),8kCzp#2_XkuTrwl4IZ~VM`<_UiN_+M?{Mvv43IVG[=n{9>C$8ygwK>;19;<^)W]^TjwP`3x@y+cZCW8kCzp`29X,<8=Kl4,a~V6x%I)i%@~|Oc`{VkPXPrl2%%cJeP`S", "s": "ed9dc7f073a0620f9d55c4bbc328732b", "oc": "e617a11ac8ff2a4225b3b4c4092f810b61d8f551569ec418a556f79d10f98f6c21fdf14a89b3abf758368df24b4a767d0c75de6c4dad42b4"}, {"a": false, "c": "mBcKU&X@H,.U;~Tr?knzEr&IE4C}9_B$S`wty=0xMI61!z)?5%KqJ9^_QhMfjJ2jd368skm4`X8ej?&sAZ_oqHcY^@#2|iF34^Z7yX3QoEl,gGI;>NP!2kG~uj7z", "s": "949ad6013de7ee5d531796e967d927d5", "hm": "8007de44a883aba219066ebfbe4e0116"}, {"a": false, "c": "mBbLWIPx0`a~(hoxvH#@-B+DV8Tc(m}X9VO@-Ec_akThZNnVY6a}NUXeDmL8#2Y_&wl+V_w8nB}jg?v9g-kWQNG(%cGC&gT^T7Z3nx&A@", "s": "d0db45a6607de0ff877a58e6bd023456", "oc": "ffc7a112c8138a0215b0ec06e939247027d8fca1c679744f62ba679445b889448ead224aa9b9ab4b253e6d44772a5476a83fc56cab7b4d8f"}, {"a": false, "c": "mBbLWIPx0>a~3+oFvD#SKe+DVm+lEEdq}1mn5.z>0v44YN1ODPT`={z[j|cVxJ=}b1.N(A`AX*3QWi-pHFBi-2HP^n&gEqAiH{C*(?KhBGSyVuAZ_oqcc~^@q_qKhTuQ_71fCh7Gsm|GI;yNP!2kG~elOa", "s": "39aa5c460e30a202382e85dbe49092d0", "hm": "1a3f7db628cfb8bf806ec61ad3fd0be0"}, {"a": false, "c": "=BbLWI$x0`a~GhoFvD#S]|+DVU)c(LLX9VOZ->csIk#hDIZVV6n}Nj%eDmLo#&e_Hw.++_w8nBRLg|+Ep-qWQ-GokcG1HZ2{d7Z3&};}@", "s": "43b9770178156300a65b4bbb533fa88b", "oc": "fbc0af1b571f273341f2bb9c09b95e0b07d8ffa9cca3c445a58267a3e19989608e5cf64c03b3fb4375d664029b7c5f56bf378eb7ad9f42fb"}, {"a": false, "c": "mQ6LWIPx0`ooGhoFvDJSCi?DVCCeYR7C{LA2=XhOcGedR8#WMRfseL#$iND%aU(5>dh!]9?N{chZSS`aO3I3pqitrMP=AF?HN8kJO%5_{9(4}[|};vweuh", "s": "f930b675367ed6eedb242dc689e1c0cb", "oc": "f06a360733b84918a3898b1d554f11757bfb842488631857d01d887f714b73c00238cfcd329a1194cabbb97c6812d55f509d2452eb4c7547390cfaca4e17cedb"}, {"a": false, "c": "aBb$WIPc0XaOGhoFfD#}s|8hVQU{b%A^11oJovsVsxNKguBCqS#2{K&Gl0+_a2nB3hg?v9g-k+QBS]klGCHKa^TZZ3nleI@", "s": "36fa00461f78204caa72881f3e8c63b1", "oc": "f4667c2e3371b1d3bcb1d7e1c8cc2422e8d9059f45b3a7210ae90d04e1a9fa18b4943fb69eb9f99b9812222560bd4a38f750bd914c4af997b519aae0230fab12"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (28, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m|bLk1c41)WHq|644-SUNv|K3Y9^G7dtD|_M-Ut}tvJFD[rpm5!^IebJ<38l6GL4JxCA!pqgoJ~zX1H.&|]s%QUfjo`i6*=x!Nv3XA`B:B>N70)fUg%6>_IJHL+j95#Qm3t350k{PVz);r@8Q[JH#rFZbE<0v58kAfMOet`tCN*iE%8{=~z8kDt5-;E$Qz8_*^mi1YEm>!W,", "s": "9497de020942ebb14b179b697549c283", "hm": "89675b4ca768ac82d8096a3a4c4bdb18"}, {"a": false, "c": "mBbB21g@1)W9q|644h(&;h|K+8a[oe9mWowZ2)XL??y]7+l~#qH8&DwuvUtG#2}y8s9`%-d?<1;`<{,m3Q%w*bvChn_v`dm;9~Z:%6M)m|mNzxyC^1;MQ%v9tCz]iE%8Q[~z8r{$C$;w$VzW_*^me1YEm1D8i", "s": "daea5f5b0ff64c03a0278aef5490ddd1", "hm": "62b7ad3d78d2b7278b787618dcfd5ba7"}, {"a": false, "c": "mBbLU1c4})W9q|6#4z(&;B|K{8(5|7&m`5OZ4-XL??yheX-WGqHg&DwuvUENt2}y8sI9-1kJwRBEK{UGm5?^5*", "s": "b3b93b817776650d5a5b4bfbc366012a", "oc": "3b07ab1f981c2136155db296a961260bc76315a926aec44fa5b29503199984698eabf6ca40aaaa45c89c4d020c2a5236dd33ce72adb7a9e9"}, {"a": false, "c": "mCb|UNc41)W9q|644F(&;|$K7@`HAl7-@<_eh%-5;rHRnVAK)h-PvUvIycvq`x%(@YHIJ|V0^RN2d+9T6qg?IO|>?jq^r)3HmKL&7rG=(&KX-cf2_V=,uh", "s": "fa6f990530d4d410db2e8dd805d3c3c8", "oc": "fc6a2c65dbcf4219a40f4ddf9dc68df823f4d4c7d6347450b6798ed5d0a5fda2fc2ec0e4368c711a722f7f1c7e25c79e68f61633215f518fc0a1e4134c89b509"}, {"a": false, "c": "mzbLUM>41XWEq|64Dhl0;f|K{6BUWaJ8M;%LXp3vR!|2fTRr)P#2ay8sIC-1>JwG}EK#U[m5?^=*WIzvj8xf(9U;9`Yp+B>", "s": "5cbe00334d4c6a043b5cb51fe681b346", "oc": "ec6a9a6936b371ab52e1ddbe4a5c178cc037579b461a519f65a626b6ab36ec7bd2987bf7fd9dcc07fb622ed5ada2588d44c935f830d87310365e8965a390d168"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (29, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "}?bK%Ks*MeKDAAsr>I~ke!{A,YM9b4|8&b~=Fpt(DFHgI0-uPSI-)vX`JD2W7wLQ{z+)r*N2)s~oVA-#u=kZ$cQL3RHKxaW$Imq>t*L5uPo@WJQI>yFXV9$79k+CsZtm7#5H`|lde?+IWkM|%&dCyKAG&U^U8CUq8d^r{MFcPPC*>Amq|o~%(G!se{<_YrLzuqAPh_@o5", "s": "2443f6010fe7c45d5014964ed729774c", "hm": "8e67eb44a8d0ab69c37e6a3dbe4ecf86"}, {"a": false, "c": "[Bb-%KX7MHXDAAIr>A~k4Tq}cm$j9%O%q$u^m@mN+n39ktgA;-G7lOA-hb@G#2`Ehz#$NVuXhExw(4F!AfBBrrGN_DC~E0Rcdpg*AN=ia", "s": "db0097bd2e7d30ebf623a31fe43551be", "oc": "fbd7a11fc80c1ab215c1bc00b9112d0b1778f3a906932c45a5ba08cca59989669ead114a85b3a7450c36650bcb2a64701635cbf1c37c8fe2"}, {"a": false, "c": "eC5K%ss*M}IDA|srrI~khL1AcLZW-pqE$l0dC>c5DE)f~Ku%D49_XthZ8[Gn8Td~v!>c%!P+7A}ld_FhI<9~6fVQjO!Kuk2ksAU[1UArOMF>Ae^%>bm3|o~PmKgse6t|`r4zuoAT&e@KZ", "s": "a59a5fa8813c8c08a22f951b50608251", "hm": "6ab7adbc78d2f57ff63c16ba08fddbc2"}, {"a": false, "c": "mBbKKK#=MeKDAAsrQI~keTZAc8$p9%O%D$orm}mN+n39dR9G;-u73kA-g;ZG#2BEhz#$NVupA@@w(4C!AiBZrrG%_DTja0$Rd!zjAb4T?", "s": "b3b23d87781661729a5b3bbbf38fac23", "oc": "0aa7a1c6881f2aa21b3ffc0be9de2cab12f3f299c6aec44d052a6cd7b5918b68809bfb1739005fa114376bee789a31a6a639e78cf727a8e7"}, {"a": false, "c": "mWbb%Ks*beKDAAVr>YPkeTZAcCGfIP%V;QOtOFs|RyM?YB3^M;8(ApVEPTa2z0mDr@i?=HAWO.`JPO=e5Q?VhTrY05bdR>{<5-rpu=", "s": "b1af09556374bc1adb24299705a9c1ac", "oc": "1cf39c9be7b38819e500d7219242764b99612cb0b333ccef70bd9ebf9a771fd920fc924697be0d96def712b633cf3744612d365a74dead32b4bb6dc43ba4875d"}, {"a": false, "c": "mBTP%ys*MeKDAAsXZ>~k$TrAc6Gz~_2hKC1k~e`Y-54&aG;cTK#~`Ehz|$NVu~g|9.G%_DCHE0{fdlzPUNZia", "s": "edba0e474d7803949e7db7df6689bf2a", "oc": "fc6a8069ffb3eaa11b210839495c4a601f90d430f83573f1709d6cd9374579322632e5434d2bd0152c14da4115c1f97c658bd4b4f025e20867701b1811232c1a"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (30, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbg(pyr$(#|%hmPIVbOi}IhuYPue&cY#apsxdX+RROT+f@e%>;NishDTH=X#kHf^>azaF#h<]XKw<1_P,MC9R?X{mly@ZktvP%%P", "s": "947b49f20257829d7224256e7724c7b5", "hm": "c0693d756848ab36d305239d2bfa3f16"}, {"a": false, "c": "mBbK(pWr$AQACXmYb4mOi}=hd]6ceng9XV?C85M-tz#Br;a6<3$TOjd2:R8q=fogcYA1UmOi}IRu^J!=wKvitTK15T2HK9Of9WP-@u]hztEdQZTtZ``vAx^P-u;`m8T(`6b9{?Dt2coMA!jwOk&*_|{%-1GO+hxpH0X#dRCGYT%k{F~{[xzjF{=fXp}^dzD1sL+KV:S", "s": "3bca5d860e364900a9d5439dc390d2d2", "hm": "6a875db078d0e57396f4161ad81dd816"}, {"a": false, "c": "mCbK:pxr$bQA&XtOnVmOi}hh(z6ceUg;XV?$8@M~tzjB(z^6<3)FOjdSCR8+=fo{-YMK<Ow0vK]BL-0I##N^GXAcdaWChO$2*Bk+)K=lmnUFFcf=rB}M1<0vg$<+O(zr7LhC`o{G{(ORF=bB`E+{[EK=3%zy", "s": "4b659cc538b657f0ab349df8f85a6ae8", "oc": "fc6b9ca533bb2d69a3f0e74b6bbaa7953720657c830bc4fbd9beb259c33131a5773acc25bb6dce622831c1a4f8a91e84b561287e009043243ad1b50b3080909b"}, {"a": false, "c": "mkIK(pyr$AQrCEmOI>mOb}Ihu6n`j}F^8aO>kmHo>^0_=jmcM`uf1lKveOe:", "s": "3d9ac04f467838446eecb71f7682b744", "oc": "f95a9c65b337d6a3bb41d8b34c56d2b495010021ed0cdae120728bf00faf92cdeaf81584b0352fb29520b64459b9daf0390590286408cdea427ef741a0c669f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (31, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@Q^%7N?0l+;g)@-JPHumqX%,hW0?KZ^G?lN{QCfXJH|N!V?Eirru@z{OF@jt3J#%Qi#2DMUg;1o_uaz#)=ouIS)7m(VzEQU^z;Uh?^@GQDRR*HJ", "s": "d90360b4207d00fe86aca9761f07e4a7", "oc": "bbc7074f38812aa35553fcc6c71f2d9bdfd4f2e966a6c446f56aa7931d45846adaadffcab633a185c5662dd2a04a577fe235c261af9cd631"}, {"a": false, "c": "mBbL@V^%dN?0W$;g)1-JP*cmqK@Vr|K5qs&n~fI!{5q9VEjRz{U{ga~o99a&IA(NSr}jIci~`)?MCB41$Ej6!A<1hHE%%$I5+YEc}thw=uuc>|IEwG+k<(pe,", "s": "ac4f5d5616ae9a16ae2c851ba49b92d1", "hm": "efb70dbd78ff5dd186d5166ad8fdc7e7"}, {"a": false, "c": "mBbL@V^*d%?0EN;g)1-JP*^mq8P1tsgI>{D&0+dkvKwcv$GK=wXj973J)+>i#2^fUgv1o_7azj!=o4ISy4b9Vz)QU^z=dhJL@MLIR:^uy", "s": "c3b9d781f83861df05206bbbcaa7a42b", "oc": "1bc7ae9ed83f36321852cc06a9bf140d8ad8f379f3aec2d5a5b764e31599391922bdf947bd80ddb485f56332d1225086f635ce6cad1e6a1b"}, {"a": false, "c": "mBbL@Vo%dN?CW$;4O1-Jn*cmqBor4+gy>b|qoi{;NMP2XSf9U>di`ae0sM|iwY5xR^!82&_5slEf`?>r|d|7z5a@;HB5ak2jl}OxF~8DTS@nu:TA!C5z^", "s": "da2d79783f74cf50dbc2fdd859edcc38", "oc": "ec6ae0053343420991e0dc4516a45a4e51644b2dfd0eeaf43ec2b884574e53f968e3b61f32968ce2cfdc498c12fff910ab91ef98b631b55a282c0a024a3fefc5"}, {"a": false, "c": "mBbLReH{", "s": "bdbb00601d3827e7d07cb71f6681bb48", "oc": "4c696b55ed0061f16e80e87a4c0b55028e0b59ae7fb75a10c8b9219294141665d9790245730631d52bf524270d190bbb503ee52f7903cd19955034aed02f98d7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (32, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb:Ah|,_|&$787#NXUndB]H4YPl7<%e}>}?ZZ8vd6{Xzl]zD4ppaKq^*k$N0hnq|!3yht@WgNE,PK4mCuT5Y>=j&gB7f>cGiX0{X?3}ny|2~nC&!L2n|FsTD7A$Vznv5K%&+D;2AYnD38S@DvWX{85>*y<_TVPJAQ#4im=mb5;CdLk4qb@]Lmgnq2_f{V^T?Z>l}CqxAE3Q", "s": "94e18a21bdd684adf214792e7839c8d2", "hm": "8267dbd03448f2f203ddea4dbe0efa16"}, {"a": false, "c": "$BXK>;2~_|&h7R7#XXU&=nqHj8{~_IIFE9<$Tx^B9>*Lg}[UaiidiIG8f6-Jn2^>OgC^9%oK#UzQ2U>FeL_z<$6tpspPQyfAd{PH^d[$W", "s": "d90b97b520763f2a8e1c29130d806452", "oc": "fbc7df1ac77f2a835553b50cbfbf2405b68870a758aec84f45b464931519868981a9fe4049b3ae4ac52662e3b92654768631115ca39310ca"}, {"a": false, "c": "mc65N;2~_|&hI8&#WXh&=3hH4LK4%9Iw+SZb%7r@cMkI#tB=Y@s%=S?_;qLaZhOrIcIKN|ai@2dCEn9ugdf8Jmw6w@OO&~2$4f-O;Ld~)=7R3)AQ_4iCfmE-R8UC44|Z}xLWgnq24>{V^*?ZVDfiUxAEJY", "s": "3a955be49f369b00b95888ee59c0d2be", "hm": "6a4b8c3d77d26c240db2166a29f62be7"}, {"a": false, "c": "mB#K]g2F?Y&h7Hy&WXU&=EqH48-V_I^IEQE$Xx^^h%*L$w3_a{[d>IG8c>-Jjv^&agC^UHo&#|zQ$U>FXL_u!Y6h0FsP%y{Qd4iH^gF$W", "s": "d3b9ec016433220155fb6bbb5237d02e", "oc": "ff37ae8bfb762f320bffb020a9bfd403b7d8f1a9c6aefd45658a6f6a15998568ddab944ebfb3bb4dcb36eb827b2a71879675c068fb9b23c9"}, {"a": false, "c": "rBbKF;2~_i&F287Af)x>k^F-EH.(~T`q(j}7sixo+q;}p@BYA1T;d^QP&=7@mf5KF]e9j.]4Y`SpVh", "s": "10cfa9cc3676e2e70b2c3dd8d6e3c5c8", "oc": "3c6a9c8b03e38b190b028e1d8cb983bc08575aa3cdb10ddfe8143fb464cd235f738f99acba22d43273e2de62053d7419e33906935d28da3485a8e60234a4b832"}, {"a": false, "c": "UBbKAq2>1|~h787#_Xo&h]PH46KPW9$JWaJ|1qzg|kP1IG(BHVb2^>cg>^U%>K#UzwKU>We]_z-Y61Hssa%:f}T|wH^dF$V", "s": "3fbe40ef757823446e8c67656541b349", "oc": "4c6a9c15339351a3bb0cd775bbf63459e62c9b49c0e2c19404df362e7bfee6f4dc870f32f448f651348062437db904d77493c872c2710a1208573c6afc0f0222"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (33, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ1V+<+WNXWTSaHg>j!CMH2]Gj70Cz_Bo4U3#W#K7KGwC&@lS7(=0Ce|K2!!At-QYZi#Cv8Z[ETrn#7AE_y&>>=$?2iXu%wo{2M_J@3MnCF+xncy}A#v1hP<*1pQM$^(%wx:1miXGicPITV>z9W|n<#^U&7QSV`z>1XcJ`#2{On(9q~P_LBfGJ{N!Y!JpxM_uu&Ufm{Xp|!!", "s": "2be881b128ab539e867caa16ef5f5fe4", "oc": "1b8700a9c85f2d221e5bb601a81b4a0bb7d8fb49c34ea445a5ba6799559883b98e89823ab9735d40873d6d0f7b8a5078c63d606ca393db18"}, {"a": false, "c": "mBbJ&V><+WNYWTGaHg#Y!CMH#LiA6:AJoLZZs~CbiZs|HT&33}P=yVCm1M9pgMJisI>8CoL6TNth(-874C)8T_qYuX47v>[Rp09@6_=hyfRUYdAX}Tz|l-gB[dy.]>!SLKJ3{sUN*`Ics~!Qtku^0ucc8!", "s": "3a975351019a9d00ae216d195091dfd1", "hm": "69b61cfd9822b7757675161a69ede2e6"}, {"a": false, "c": "mBbR-V+<+W_nWT~SHg#}!WMH#8-d6231ayoGQIzTv<<<6,UoCQSi|z>1UdJ`#B{On(Eq~PZ37^Gu{SL7X*tKN#Y#JpxT2uu44f+rbp|M!", "s": "73bd87818318214f91576cbbc3373e5b", "oc": "fbc7a40fa8c52a33eb50b70dcd7f230bbfd20369c5aee445b6b4e79316cf89cbde6df0e9b927e544c77b6d028b4a54e6a6a44e91ad7cbbcb"}, {"a": false, "c": "mBbJ&&F<+WfX_TGa%g#7!~M<#z}1UqDEGI9eOIF61dRu^w8k>@+Esdmf9<+)k[h%(;Zs2&vG^?Q6iDKrD(;)GU?2zd3$NqWo%e3=;BGaUVZC%<3uw$EFb~aOde42&14s2=>FwXlBb%A33Blt#*umHBaVj9v%5U&$vTyw2*i;#8W;HNqT0K#327xtY*Op0D3?ot0V?EjnjDr(C5wNQ4QpH3R?^dEq$lC", "s": "d923c7a320fd50fe8671f804fd0b1417", "oc": "fb87116fc8df9a32fb51b066a54f2c0b84bff61986a7c445a31ab7361a93126f3eaf5442506b6345c5e66bbd20cac522b7e5cec5adfc31f9"}, {"a": false, "c": "mB-Z9Uaw5U6an?~|8;Cw-Lf=i#GP1b3>A?zJsS5BwjoR|QNF+_4VeSY4G^^xBKhP($$Ynm-@g?=+OF_wtB8QA|noP=&<^zu-c1>8ao{)(sIpcgZX1WmNNxn#3Bzt#0(|HB`<-9v%1NC$zTaP7-eW1[", "s": "f4955dd60d379dc0a42e8c1b45d2d2a1", "hm": "67b7a6ba78a6d0b69fd4161a70fddbe9"}, {"a": false, "c": "mB5e9-M8LU6a!?+zn?~|a;Cw=8<4;V5mTSul)@y*zCwyyw2>id#>`AgNtT0K#r2swtatzVTDW?o$sVYEjnj*r(d5XNQ4npH3RY^a0q$tC", "s": "f72935817018258fa75c6bba73307a0b", "oc": "ebefa110c51fa51b15a6bcdaaf132404b878f5a9c6aecb540ab467931aa5516ab4adf443b709a64dc5366d3dfb9250d5ab35cfcc1d4d4cd0"}, {"a": false, "c": "mQbM7-O}LU6_c?HM}$d^$FZS=pLR|!Kt9RJ*8L=2XQqLTPqd_9s0vn<&a}uKt9z)V?Kb9+xnpxRa;Y2+`wx_cDunu749!De6J}W.Sg(Z=r!U$ho1nk", "s": "9c93c6014fe3e0edc2149363776ec745", "hm": "c061db1c8648ab320b4c6aa694bedc06"}, {"a": false, "c": "mBbs#R|;IE`{nhn.r[?Hj)cv1=v`{{^K}Sgy,%@>)p?C1#My;w)A3&4h>r!IZ22-UlDz=hoYJq>I4Xqd!r=+nND{rQIt~dA&ulcYB%7e}", "s": "2c00e72527c70083807b9b16ed0fb127", "oc": "fcc0a91fc80fea3aa556bcade1144b0bb2dff329c8c0241da4b132da259a836fe21d98fab98753e55196e189a82a5456a730cb6bcd41e1fd"}, {"a": false, "c": "mBbJZA|9c2`{>|,X>gLCj3cv`L|Q)X$f_~lxv[kHEnub2rET7YBC6SA?ZT,}77_!te?q#v1g4K6AKU~0DKT55`Om:Wr{A*M{9-no9Ac-Wn9y49?fC61IWtQg$Z=dmU$hoCnk", "s": "1a4aede50236425078b4851bcca0d8d4", "hm": "0ab72d0a78d1d67fe67c195ad32dfbe5"}, {"a": false, "c": "mBbJqks|Q2o{`inrra?Hj|cv`8vu1b}!}S!y~t$>)j?C8#M=;wJW3?Oh>MK|#2`-T2Dz=$ve0I>y4Xqd!ZkGnND{rQIt~JQ{!;ciB%7eX", "s": "fcb9a781392b610f95581bbbcd378a2d", "oc": "4ec7a15ece1f8adb10b4b5d4a91f94f3d7d5830f09a8744ea5a967311a99a9198eadff4ab9cbabbcb13a6de2715a5ef6aa3b256f544f43f9"}, {"a": false, "c": "mBbJQA|982<{OfnrraqP*)qv`Vb6?:tDe%liI*i~veCXu?CCfO-0nX>PU%6*-TyWAPb!yBgzCaLTIo26>90vFTM0VpSh", "s": "fa9f9bb53674ec50db58bdd8f5eac568", "oc": "fc6a9f0733532219b1038eed53e32b9ff2b8c97e373d2ccf26ae36688526e84685a395d8c3554790db32720fe2d9aa86224037c3b2bc3f5d5f2f886d4122cb57"}, {"a": false, "c": "%Bbx@5|9c215Obnrgd?Hj)cv`]LBDt#>7UHlq|VQJ5%~lyV4vg!}]VHLDz=hvYJN>I4i+d!Z`+QJY{rzIt*KAb!;ciBs7e?", "s": "3d8a0f4f4da829816e7be79e66812344", "oc": "f18adc663cbab1a5b4ea27ef777df8d8d5585688edeca87e045a1bf49e2a66185f81519c0c7bd44b8df3193f17db9c313f88edcbd0febced36ccf402fcf38614"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (36, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m9bKS-W2H2TtQ~T2Xd]c9!nC$Yi)bLn9+6jQU;N&w82}?<7rd~X5Ha9PQ^X7IebGi)VN*~Wl`Tv*AkEzuqA>Z5R3W>sQ0ASNTOjoiQuI`BLT){G*FR<^5G2lMK,H[II6qx[-Pw{lH", "s": "e49352021fd7efc25bd072697c29c24e", "hm": "7026eb45a848a658c8056a4fbab2df16"}, {"a": false, "c": ":BbKp&X2_2TU_~T2T`TP+P;@y+|6e=8kCzz#2!XkG8|Kl4%a~r6xN`$iBo+`Tn8b=,(I,:&=n39BuWRB#mC{)*F=.p*;<^)wg>TjwP+P4@yYw6)=8kCzp#2_X}uFrKl4Ua9V6l1I)iBp+3S9K:ebVJ[XiW_L5(G9_3vA>puh", "s": "3faf9dc5ec73eeeed9222ddfadeabaac", "oc": "f86aa66536a342c9e3002e5c99893cb2191bf88af16d0ee9286d27dc492083beee8f036ca97e7ded0b7e2bdbb1d60fec9b0a8508db9794e69f9418fddd1d593f"}, {"a": false, "c": "m?FKU&-bH-kk|~T2QRgCtC!pM_J_~Db*?be!Nd7*jT0q>qN)z(X:`Ur-n0)h#ha1knzErJIJ4C}9_BKh`wPy=lrkvXyx`^``q+DEzSo+>xMI61e?)+]%KqJI^__hgfj)nqd3W8skzx`58ed?&~AI_oqHcY^F#&S*hT]^_7Of{hoElmzgI[5NP!@2G~=l7z", "s": "989ad6019fe78453f2149a6d3720c735", "hm": "2067db483248bb4ed3053a3d3e0c7f19"}, {"a": false, "c": "mMrLWo(;0`a~Gh)FvDrSK|+DV87c(L(XXVOZ->cS1kThDV`V+>a}[b7ek>Lo#2m_&wa++_58n*3::|v8g-kW:N@VkcG6HK2^T7Z3nx>J@", "s": "8f0bc1b3207d30ee967c9816ed9fed25", "oc": "fbb74111d6bd4a3215f3b9daa71f14e797dec3420b7af441a58a83ed6589594e82a5542abae3ac4de4e6dd02312a53766676631c013d4b4d"}, {"a": false, "c": "m7bLWIPx0=atVhoFvD#SK|XDVLVl^Ed!81m45-+>Rw|>8=1ODPTT={{c5|cAxQ=Ob]<~(ANiuD$QWWVp)FGiaPHN^n=g7ls{H{I2(7bhBGYnE6AZGoqHcY<@#c&*)Tu^x7Op|h?ElcsSkbhDr`VD6{}qV%sDZL%92<_&wl+|_wZnB39g?v9g-]C{NS(kcGCHK2^T7Z3gW>$^", "s": "f390d881b83825cc9d5b6b0fc93f8a19", "oc": "fbe7a119c89f8a3215594c06a81f24fbbbd843cbcee3c455a5baf8139599896e8ead944a88b2a6c5c23a0df97b24a476e9e5fe624d9f4248"}, {"a": false, "c": "mRb-WIPL0`>gGqoF,D|SK|+DVgC0JR*C3LA0=XNOcfefR8%CMRfsewrrX@yFaU(5LdkQQ9)a}|h[SS@=eK).paut?M0=AF#HNJ-JU%5{TD?E}e|>;2wpuh", "s": "3b6f17ac327422eaeb24ddf5957bfac8", "oc": "8c6a9cfe89c5de79a303291d3a44d18ab3c7a0230e9cb857307b1f7feceb04cd6f59cf37abd318d80d7419c0a15a75cfd0b7a64217f267644704428c22e5c368"}, {"a": false, "c": "wBbLWpPI0`a~GhoFvD#_&|+NV5UNd%*^1EoUovsVl`VK>uBCJO%X{_&wl+6_w8nB3h&?v9u-kW;N%(kcGRyK2^TXZ3norw@", "s": "3aeed3df4d4823d46e7a10dff647d345", "oc": "f33a93b134b591a17be7675f0bc11189e03503e2c5ba03f14702a0e4e6e2f712b834108cf8c91a4588f50217c14d5c11f157bd5163be3492b590ab34930da713"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (38, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "-B-L{1ch3)W9q|644h}&;&|V[Y9^G{95DfzM-UtmtvJFDqrpm|!xIFNJp3Uo6PL4JxC<{Zqg;J~zXrHbd~t@bQ<;Go|i6`=>[NvDVAeB%lPNh0)pUg^>>q^JTL^je%|Tm)t350kkPVBKRU@MjcJH#rFWb0fnQ;t`tNm*i;%8D={HakT$5j;E$Vz8)*]me1YxV!!8|", "s": "ed2bd6010f27c2bd52133c605729c8c5", "hm": "8ba7d2544948413dc3a1673d97cdd610"}, {"a": false, "c": "mFbLU1I41)W9q|644h(&>v|K{8(~Xe9m`4#Z4OXL??yZeq-WGq?8&DwuaUEJ52}y4sI}-?a2w]MEK{PGB57^5*WGzsh8[x=9bRk|_pjBr", "s": "a90a87d3207d30fec27c2826ed4f8487", "oc": "c5c4a12fc81f9a1915533c015a17db0bbdd833ddcbaec345a3b2f493619cec9981aef86ab9b3ab3565566d007b6561baaf36cd68ab7f13fb"}, {"a": false, "c": "mBbLU>cm1Eq+q86(4h({@vfK{LTk1AEh2L`piNX*,AxK9WEp>Pv3NIeN_-Sa<1;3<{tm(F%v{bvCNn^wVdMo9f*0nMM)$jANzZ>^dafMQ{t`tCz*$Ev8Q=~zakTI5-;E$2h8>*^me1YEmC!80", "s": "319146860796cd00f922859b5491d0d0", "hm": "64ba7cbd76d820af807526172a1d4be1"}, {"a": false, "c": "mBbKU1c4<)3uq|6S4hu&Bq|l{GD5ye9muEOQ4$@L??yhd.a#GqH5&DwuvUEG#2}yZsI^-lkJw]MEK{UGm5?^3*DizOhRx7(9(;kx{v+B2", "s": "55f667667538670f955bb38caa37af5b", "oc": "fefe011f684f2a3a955cbc0ba71b277bb2d16f59c6a0c441af1bf7031f9589e94ea6ff1423b351314546dd037b2acbe15e3fcaecaea7abe2"}, {"a": false, "c": "mB=G$1c41HWoI|644hq&;v|K{}`tAY7f@4_Xh%C$qrHRnI+K)h-PBU1Iy1vQxx%(@YHIV|V0^GNp%+GbDhM#IO|#Djq(POCHmB*rkDG=Y&?{*yf!_V=puc", "s": "954f6b7e367e93e5db272d8c4580cac7", "oc": "f0965c6833b34219a30e8e0cd27aac16d103513103e4c2f62de89194d3a5f449cc2edbd4e9dc000cfb73c5bcd4c5c726defc6353475fc81ac6f9a2867c89b547"}, {"a": false, "c": "mBbLh1c41)U9q|644h#&h|3K{6sUW}J)Mq%", "s": "3ddaf0af7d70234d687fb71f6681d4c4", "oc": "6c22a5553b430ba30be178f719d0497cc7b726b8461e579fb52276461b3d37ab09483b08fd5d2cc7fb9f2e3fc3e25d16049315fb2ca82753764cabc99340dd69"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (39, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK%Kw*MsKDAAsh>I]keTZAXY,9kkQ8f[~DD>}F@t{DZHgI0-u)Soh1vX`7D4W}yLQ{z(MbAD2)s~>VmI[ub0yrXQ9$7P,mCcvtme#?HK9lde?+I!kkO%6gKy?q7&U^U8AUC}d}rO7T>P%C{URtq8q~0(~gseztDYfzzuC1T&_@KZ", "s": "f478df1100e6e4cd79141149fe794745", "hm": "80d7dca44d45a6859a006a3deb2e6f16"}, {"a": false, "c": "mBsKIj&A-w?Zw#2CZL-gZCXLZs(pqA_R0=C#c}yk@f~Ku%DrtHO*$f8C+p-co|D(@z`M~Hn8TdWv!5a+!L+7ek=d_F)I<9~6fzUjP!FukWkGA1rzd9rO}F>r%C%WRmq|=~gbGFgv6tjYr4z[(AT&_;2Z", "s": "c9aa8d58a8e6960aa26c851bb495edd1", "hm": "aa1cedbd3b624b9f8b6516d3d43d0bbe"}, {"a": false, "c": "mBpK%K>*M^KDoAsr>I~@eTZtcg(<9%s%2$urm@mN+np9d89|;-u7%&A}BbKG#2`Ehz#$NVuILmegZAcCGfI+%Q>-O*[FX-SyMqYn3>=;8sAp`hPTa2z0mDr{O4FH,tOs`J!N|e5Q4D2OjEY%T|Xm616O3>[TrY05odR>615-r$uh", "s": "fa3f99253af4e8e0db2d2d7800e55ac8", "oc": "f06b9c66c3e34319a810d0fa427449870c6c5bd4b0f0ed98d68aa27d90879f193af8c25b97be539fde69d3b6355bf7f0211d32506779b562ffebce6153fe8f5d"}, {"a": false, "c": "mBbK%Ks*OeKD(esr>r~EeTZ4[6Jz}pD2KC1k{e`Y-54&aG=pYK#2`^hD#$Neu-=hqOX7rde>3@3%>;NisnD;HPXqkHX*aazaw#hZ+Oezr7YhC`.{GE(;RF=ZBK!+;7>KvJ%zC", "s": "f90b37b520ed80fe86fca8b68d01e9a7", "oc": "fc98d1bfc81522023a53ac76c9cf740b281bd6a9c68acac5c541c7a218c78d6b8e5bf74ab414ab94ce01db0206115476abf6ceb0a9cbea1de521d8e587a33aa9"}, {"a": false, "c": "mBbK(pyr$Z^AujmOIcmOd}IhPLJrwwKv+|Tn15T$$K}Gf9WPI+_$hztE>QZTtZ``bAs^P0Gz`m8[T`6b9{?DB2c6]F!%g3z=*_c{%^-GO{CxpHAi#dc{GYT+k9F|W6VW*6{=fXB?vpGy!(2BzD!=L+n|`G", "s": "3a955586b526ddaaa62e831b5490d3c1", "hm": "6fb75dbd7a32bd7f8905f31f98eddbe7"}, {"a": false, "c": "mBb>(pyr$AQACXmO}Vm8{}fh~9RcXUgpXV?y8@p-tzw#v;^6c3WFOp}2Evz,#+%-fr7YhC}o{vv(;R`IbBK!+Z7>K@Jtzy", "s": "feb99a60781b679f954b60fdc837aa25", "oc": "3bc7ab9fceafdd321d83bc31091f2d0ad2769aa30f9ec9f545ba47831479fd698eadf5e5f982a149c1362502778a54753685ceeaa849da7cee51df0a87aab4a5"}, {"a": false, "c": "mBbK(py|$AQACXm]IV(Oi}IhpBte;>Gw0v+]k;,0<*#e^GXAgdaWCrO$8*Bk)0K=lmV112cf=rBYM1{KvJGzy", "s": "037957ff368ee2e6db242df2053cc7ba", "oc": "f16a9cc535b33219a30017d265aaa72432f4c67d5ef4941bc50c88fa184681a577ba94f55bbde49e3c1fc174f4a11c68b1822f760f9f422b3dd170e66b3490fb"}, {"a": false, "c": "mBbKSLyr%AQAC9$;ICmOi}Ihu6n`j}F=83O>k4Hy>^0_v8mcM`ux!l(YM1<<|^$Z+OY{r7YoC`+{G{X;0F=bBN!+;7>;vJ%zy", "s": "3df1f1ad137923846f6c671f6331b3b3", "oc": "fc69bc6e334340a3dbe1b8dda45d22ce9b31ec4ab5b2960bd46781fd03db94cf6a98168d6b0c20b196209bd475b9dbd33775f40868fe95d2db71e8fca0aa16f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (41, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@V^sdN?0W$;(u1-J$*Xmq|%Jur0sPN^G?lNW$CfXJH|W!V*=irNaiz{OfN}t_cW7ljGPM647i#2^RUgo1*_OazD!=oJES)(m(VzEQU^zJih?^@=oI}>*A,", "s": "3e7360a5714d62fe887c9406100fdf60", "oc": "f4c7aa15c81b2a32d9a35c00a916849dbad8f382c1ae1345ddba63fe1568896a2e3bf645f92e104547376d727b5a51daa635116cffc8ea16"}, {"a": false, "c": "mVbL@VU%zN?0W$,g)1-J+*cmqK@;r|K5H+&,Oq=;IrFg2}bTt#Q2^uT7`Q1|b$MxqdKh&)IM{uqYeEjR-wU.Waay1F-KGveNSrAjs?iC`)b+CB41$bj6!{<1hs>Y%1;5N;IE}thV=uuyU|IEwG+t5(puh", "s": "3aaa5ad601359500d92b34eb54c0dbd1", "hm": "6a2f56bd84d2b79f8655161bd8fedbe7"}, {"a": false, "c": "+Bb<@V^%dNt01$Bg)1}JP*cmq8L1t)gA>{D^0s{k=Kwc<$GKy0X{ipl^#%QiLR^fKgvgouOzzD!7RJI_)7A)m:EQU^ztUhx^@=oIfR^H1", "s": "f4b93481b8fbb19f605bfb2f2337ca4a", "oc": "1997a10a8816293e29f34708a9cf3ecc37d8f3aa862dcd45851a93f3153988688e7a62483ab7af45955d640d7b2a3476f615ce687d5adac4"}, {"a": false, "c": "mBbL@{^BdN?0e$Dg)1-kP5cUZqor4+`y>t6qoX{=NQ{JXSf9UacD`690%z|xQY5xgO7z2%85sl_f`r&j@k|UW5T<;|}nuk2jlpO0FUODaS@nu!T~!C5|y", "s": "266f96753614d3e3d5281d38007fc8c8", "oc": "6cf950953adc42c9a3c0102914e71a4954a48d30ab996ab44e30bfc477b7434ceded1613f292a3e4caf9288912fffad07df8eb69349ab5a3a3ec0a53a93725e0"}, {"a": false, "c": "mBRL@V^%dN?%W$;g11{J;k4m`6(0HB3o8BM)H&#-v@|t(V~Exa^;tUh?l@=oIRR^H<", "s": "ca7a005f1d7a9a046efcc13f6b81e9c4", "oc": "8e69e9353e20d127a320c8df310b65f54a0bb98075b54a1348bc09c9e4a4f715d376f2f97306846629f92176659908ad0cceed2be5038d8115561ea727a50eb7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (42, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKA;0~_|&hoZ7#WIU&=nqH4YPU!<%e}pr?Z5-Hd{=XLZH>D4K@Yp4E*?^NnhnqYL3*hQ@WgNEuP94mCuT}Y>=j&nB7f>pGiA$|Xx3CMyN3ZnC&!m2n|>s&p7A$Vunv|KN!Zz;2~YnEgR.~DtCX{}__fmEcO8deq4qZ}xLQgnq2A0{V^&?Z>.fnrxAE3Y", "s": "9493d67d02e7e052529fdb677729c795", "hm": "80e7f544f9fdabd2e98a643fbe4ddf46"}, {"a": false, "c": "jBbKx;2~_CMh78)9WX?&5nqHz8zV_I^BEc2$Tx^Bhe*L$I3NaiRC}IG8e6-J<(^%OgC^UL!QlUzQ4G+F||_zcY6Y]ssPnyfAd2fH^dFqW", "s": "d90bf7b931c337fb867cd846ee8feea3", "oc": "2ec6d11fc81beaa31553b706ab1f040cf7d8839ac6aeb48ea5ba63b41a1989698eadf1f3c9b9b05595d86659fb2a5482a665c09ca2be4bda"}, {"a": false, "c": "[BbKAL2~x|&h7!x#:XU&=n`t4L|)%yI#+SR>Y7r@cEkI,{B`Y@4%m&lfCrxAE3Y", "s": "ca9a5cb6c3867100ab2e8f3b599dd2d5", "hm": "6bba5ded7bc209f98175ea1a559d1de7"}, {"a": false, "c": "mGbKA;2~FFMh7E7#W=#&=ouH4]zV_I^FE;EJTxCB(>*K$Z3{aiidiIGI:y-J#2^>OgD^U%oz#KzQ4U>FdL_z-Y6F0ssP%yfXd|iH^dFNW", "s": "f37b35827418b10663cee535c38d142b", "oc": "9cc7a01f3858263215a3b836597f290ab708fe8ed6b9c0b5aaeab6531538b969eead6c6ab937b748a5ff6e827a055670a633c460adc9fcca"}, {"a": false, "c": "mb)Kz;*~_W.h78B#>}B&KwYH4d6`u)f|7c0_>UN!sI%p$PD^%)Iru9>>[llGMAFTEHMX_T`5(j$7sw70+q;}pQBYA1Tzg8QLdoKOlf8KFfe9_!J$J`Spuh", "s": "fa66997d361a81c0d7842dd205eaaac8", "oc": "fcb29cda738abd19b3e17e1c9747332c0e744874ce733ede086f3fb06861c85f23f1af422abed19cdbe2d582052d5e89e224a6ec5d0e2af4bc74eb323552f631"}, {"a": false, "c": "m7b:K;2~_|&h787Y&XU&=nqH4L6PW$$[3a=|JqzQ_kiwIG(q$L|k^>ORC^dRoKJmVQ4U|FeL_zUY6R0s{P%yD%d||a^dF$W", "s": "78ba307fbd8baa9f6579b7116653b984", "oc": "5cf99ad533b341a1fce76722f22ebe59774c3b42c6efc1341fa1a6feabf818d920275a70f42bfe7a343a61a33cb703777524777a46943a78d8d2e1fc5c440762"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (43, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbX&:+<+#NNWTGaHi#Y!CMH#YUj^0Cg_B24U3#A#%#-G*1<@cO7ZS0Ce|x{@!At-Evo5#Ci8ZPATrnelA1@E(u>+$?2X*e1UcJ}#2bOq(uT~PZP1[Gu{(L7X*)sN#Y!(pxT_u+4UfmrWp#*!", "s": "690990b5206dfbfed67c5e4dfd0894f7", "oc": "fb47b11fa8ef9af3115bbc01091df5cbbed4f389c6aec74584eabf66a59a59698fadd62ab9b3ad06650634027a64177a76d5fefca49ede8b"}, {"a": false, "c": "mBbJkV+<+1NnWZG}H9#Y!CNH.LiTedAJo7ZZD|C~iZstYT&vn}P=yuCL4F9Y~``isIX8CoL6Tzth(-874J)8j_Y4uX4uO>l<<09@x)=DtfBUxdAX}Tz|HGNG(Ma8~!!1Uc!`#G{}n(dqFoX}Mb%ACygZ31WmCNxJ>3BlC#*(|HBtKw2*pf#80AINqT0K#327>ts*30+D>?o{0VeEjnj}H(d5TNQuQpH8R?raEg$QC", "s": "d9fb97b5257d908e566ca8963d0144a7", "oc": "4bc7a1e2451f3f32152e5f024d1f247bb74823a4c5aec44556ba6d9334cf8129806dfd4ab1b32b3575366b0573715495a435c964ab5161e8"}, {"a": false, "c": "jXbM9-awkX6YVLQJTS5nuj-]|QNY+p4aeKYRGHiM,KRB(L$YMm-@6u=DDF%w9B8QX|bof=&$^g&;c1>9N[L)SsAp:gZh.WmCNdJ>3Bnt#*(|HBa]6aywg*iK{c0A>=(T0K#327xt]S3p+DW?ot0VkEj{jDrLd5e{Q4nB_nhSii0$iCzn8anr;+9p,uz%%M*sKvMQnx}6*b}LKdrI6xM^s|5iJgx)9n)y82zo_<*I>cPHnrud^[NZI=gL.Uxc^{uE", "s": "ca3649053693e2e0d134255306290a88", "oc": "7c6a9e6533331612a2014e109ec9ba229a0af873564fd2d84bbc067880cae06daaa33d3b20d90dc7f31c619a96d0f3518e1df18e204272316c9c4c2715d04e8c"}, {"a": false, "c": "mvbM9ha0LU6a<>+znH;|a;J@`pVXV;3h1KV67nyT(rO(*MG]-qobDc^un9ux9)DC615WCi%$Z4r!i|%o1nk", "s": "98e3d6310f95e15d52149c697759c440", "hm": "9e77df44d8b8a7c2cea56a31be4e7610"}, {"a": false, "c": "mBbJZ;|9Bb&>8`JrraeHj)cv`8vu0)uK}SSyw%$>)p3w8#ME;h6W3w4h>G!>#>`-TLD@EhvY_yB|4Xqd![=SnL<{r0ItKKA&!;ciB%H>X", "s": "d10b44672a7d30f98667e8162d0d17a9", "oc": "bbc4a117c811fd3a4553be05d9202409b9d854a7c6aef44685b7669815e939698eadf49749c7a340c1373d027b2c5176ab35ceb0dd9e4169"}, {"a": false, "c": "m|bJZ||%c2`7Vsn7ra?Hj)cv`LjQ)X$p_~llv&x~<)Fi+e5|&DHc1ZkZlk(`D>cn^yBrE+7YB99SR?ZTg}77_!tj|T#%1r4KlAvUpADc,5Z`OSAWoE)EM-J-noCAcDg}97I9)DC61}WC4g$Z=r!U$hoRNk", "s": "317a5d56a1366dde698e8019e4903ad1", "hm": "5ab75db956d227798672a40a6dfbdf6e"}, {"a": false, "c": "mB=JZAN9&2`{#sn1ra?Hj)cn`qv}0{XK}vCow%$>)p%C8c>y(w6Y3&4:>M!|#2`-TLDzFh:YJI>I4Xqd!Z)+$ND{rQIt~KAI%imveC96vFWMxVpuh", "s": "fa9f15753674ebc396242dd4093fcd08", "oc": "7c6a28a1bdb34219a8303e13033133a58eb879ee450720c076aeb4988b2d2b2884a625d4153a362fdbcee10022f7a7beef7c3fcdb21c8dbd42318521a1c231c7"}, {"a": false, "c": "LBbJZAu9ch`{Os?r)a?Hj)c<`GLJ|t#>7UU2q|!Zbg+~p8S4IB#2`-iLgz=h8YQv>i49}d!Z=+nND{rQI5~Kf&!;cii%qDX", "s": "2dba520f4e7c29968bf6b71c998f260f", "oc": "dc2ab96533b5c153bbe0d7ef0e0cf858f7585680a7975dbe47f8cbe16a2a682277e178c93c84bb4b5fa3193fbad695d82c88e8cc6afe1cab3cccf5f26c338426"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (46, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBgK&&XNH2TUi~TA0R*Bq5NfWj(iQu7`Bgkf{G*FR42lMKW|bIIg*$>x1WrD^0|g>TjwUS];T&+`G)=8oCEp#2UXVu8rKlJ_}>V6xKI)icq+_wy8b$&_IdGB=n39T$wPzk%=@r&{Qg9K9_BKS[w%yiZ=M[6?!?)?c%KqJ9^_Qhgfjt7Nd3!8b;|``58ed?:LlZ_oqHc1Uv:&Q*wTu)67Of|hSPlmzGI;5NP!2k}Krl7z", "s": "a993d805cde283ed12bfbbb57057c746", "hm": "3067dc6c7848abf2c375921afe76d01c"}, {"a": false, "c": "mkbjW{ci0`!~,ho{vD#Si|6|Z8)c(L(c9VO%->cJ!kT+DI`VV6a}NV%eDmLo#2{_&wl++_DPnB!~g?v9g-kDQND(kcGuHK2^THZ3nx>$@", "s": "d40e77b6807434618e7caa770d2c44f7", "oc": "2218a153c81fbf801f59cc065d0d240ab7ddf3a915a8c2f694ba67230594e5fc0f65fa1a38b0ab44b58968d2782775767650ceaba29fc8bf"}, {"a": false, "c": "mBbpWIPx0pCCvhoFvD#{4|+LxLVl#Ed)}1mw5-+>Q)|N8N1ODPTSq{zO||cPxhT}{=Xt(ANAX*$QbW-pHFGi-2cP^n^sI5siM{C*(7&h+GYnV6A>ZoqHcY)@#+Q*h=)^_7OfIzoElmGGI;ENr!2kG~yl(1", "s": "3a9a522601e6cbd061208415d430a211", "hm": "6ab6bdbf6212d75d8272131a5800d7ec"}, {"a": false, "c": "=BbLWIPx0`RQGhoF:}#kGn+-V8RccL(.9VS(y>ciI|ThDI`VV6a}N.beDmLv#2e^&Vl++_V8TB3hg?vpg-kW[NMSkrTCHK4aT7%35x>$m", "s": "f3c937317878610894726abb452e1e2b", "oc": "ffc7a80f58df2a921653dea69910710fa54f35a9f2a1c40ea2b7e933f5fe696983e0f647b0edebd5c3b667027bca342ea625ce6ca39f42bb"}, {"a": false, "c": "ZBbLW{}x0Fa~GhoFdDSNK|+DAF`eIRWC3Lj0=X>Oqfenmt^W]yfsewF:X@D?an(5L#kvQw)o38hZ+S@=OU=3pkutVMP=AF?HN8kJOg5_TH?_f=|M;,wpth", "s": "fa3f997706737516dc2420d405ea5ac8", "oc": "bc6a9c0533b3e2c9b40e8514528d118af3f7ae241e6a685750d11d9fd12133cd5333ca72bafaf8d3ba7bb947a85ad51583bd2667a25cf814a70ca4e18e9e453f"}, {"a": false, "c": "@Px@WpFS0_a~yMT@v@#SK|+4V6Uwb%{^>1oJohsVs;VK(uBC*~ya{_aWlQ+zw8nB3h*?E9g-kWQNG2*cF|HK2^~743nx>$@", "s": "7d2a00bfed3223b76e7cb91f5721d244", "oc": "ec2ae96533bb41492be1d70f07cc248a383900e745b38724c83213f6975dfd12b8647c0372b3206063c2629b90c74a3164de6dd1eab6f512171005f01303ab13"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (48, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbzU1c45)W|Ug6:4-(&;v|${Y9^G7a5DAJM-Utm>v@FD-rwm|4uIF!9_3Tg6>L4Jxg6BZqg;N~WuCHw&~>r%Sg;do1iZt=>!NvD(AetfBPQ>#pfMgxPU_I&TLz{e%|Tmyt350kkP@z)R1@H`cJHh%l5{+<0L5C>AAMQ%t`@Cz*nEl8k=~x1YEm>!5b", "s": "54609601cf2eb45c5d149e7d71b9c393", "hm": "83573befa848af7ac30fa32dae4ef216"}, {"a": false, "c": "mB(LU~c4z)W9q|644K(&;$ws^8(5Xe3m`5OZ[)XL?EyIaX-Wjqp8%x6uvUEG#>}_8MICb19JwGMEK{UF.5?^i*WiLOh8xf(P<;k`Xp+B,", "s": "d0599cb5707330fe363c4d766d0fe427", "oc": "fb1aa1462f9f2782c553bd06b91f110b771d43d9c6ae4941a5aa620315795909ae2df62bb9132b28c53e00c2771a5470a535cef2aa3702b6"}, {"a": false, "c": "mBbLU1c4ynW9k|640hjJ;v|}{L<11A!+24-piZ|*IAxKZWWB&(L(xIeN9`3-de<1;`<{tm3R%w*bvghnG}`dVo9fQ.%6M)m7yNzcy^DSfMw%txBZz*iE%zQ=~zakTR8-*`$VzT_?^mJ1YEm>!82", "s": "339a8de641362d00a92e851b5490ce52", "hm": "6a075fbd7812b77f8775160278fddb58"}, {"a": false, "c": "mBu]U1c41Y);q|a44h(&6@5K{885Xe&m.5GU#)XL??yvMX-WUqH8&DwuvUaGF,}*8srC{1kJwwMEK{Usm5?^=*Wi>Dh8xf>M(;I`{p+yz", "s": "f8b9d78e7d1d71cf993b6bdbc43f382b", "oc": "74cd9114c81f21369173580759c0540ed9e4f3a4c649e015a59ae48398e9a16987ddf2445942ab4525126db2732249769085ce6cbe773999"}, {"a": false, "c": "mBbLU1c41)W9q|644@=&{J|`jAY7D@aRjq(PO|HmKL&kDG=Y&X9*yf*vp=puh", "s": "f8e79971de7389004b2a2f7e05ea3ac7", "oc": "ec698c6533d34aa9a3018eac98c69c252383514fdda1e7f90de98847d0eff44efc2231a8768d118ccc76ff4c9c35cd9e3efe06dca1bf530f86581903779b8509"}, {"a": false, "c": "m%bLUycL1tW9q|>44h(*;vD{{6BUWiJXM;%Zcp3v>3|D{R6`TP#2!y8sIC-1kJwGMEK{U&m=?^5*Wizvhixf(9(;k`%p+W>", "s": "3db7a3ef162421446e7bf71f968ab044", "oc": "75619cb5271821a7cbe1ddb6295c4925ceb747c83117d12fbfa523b8ab363ae452d84b4e9d6d80075b37ae30bee0a47372c775f2372ab353d626f67d33410e07"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (49, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": ">#bKLKs*-ewDA|s?>I~ke{Zac~zUb4<7fb~$D>`Z@t{fF0gI0-uELDhLvX`JD2!}TLQ{z|)sJN2)s~LVF-)LHrX}9T79#+Csekm=#?HK9ldes`IWk~O)6]Ky3ql&UIU4AUq1hAROZFJP%|%>>mq|ok0oTgoeqtYY047uoAT:v@KZ", "s": "f4a3d80c09e74b3f9014eb814769ea95", "hm": "00879644283cdb39ee0b6a37b24ed81a"}, {"a": false, "c": "mBbw%SsGqeuDAHsr>Ifk~utAf>$p9MOM_$urm@mNdnf9W89A;-m7l&A!BbZG#y`Ehz#$|TuoA@xw(SC!>f#orrG%_DCfE0$cd!zvANZi!", "s": "78eb97b5207d30bed58fa815c622e1a7", "oc": "0bb7a15f681f26361553bc08a910970ffc73f3a60534c1c1a5ba659c29998c9c8babf6fb59fcbd4555360db27bb154c9a287c8ac517fc9e7"}, {"a": false, "c": "mH|K%KsTMeKDSAs@>E~keTZrcLZs-pq?$l<=C-<5DQ)f~Ku%D4_HX*hf84`R-cD,D(@z`2%cn8Td+v!5a%!P+;v]qd_F)qd7~6f?UO;#]uYW=GApq1dArOMFBP5CbTRmR|oZ0(G.se6t_Yr4zuoAT^_`$Z", "s": "3e9c5d5609369108a926951b949cdd71", "hm": "68b737ecf8d6c07fb675161a12dddfca"}, {"a": false, "c": "9BbK%Qs-MeKDVAsT>I~keTZvc8$p9%}}p$w~E@mN0I3<@89A;-u}l&n-B.ZG#2`Ekz#2?VuI~kLTZAnCG,iP|Q;QOtTFc-SyMqIthlx%8sAp`7PT~2ziGsr@O?NHAWOsIJPN=eCQ*DkgjEY%~|XeMr6OE>!T.YT5odR>615-Zpuh", "s": "a9a35c7dd66a02e6db2400d806eaeba7", "oc": "fc6a9c6b43b04019a300df217232c65b1e812cd4f0f0a0ef45c1ea7890899faeb0d89b6b974e035ef1e7e2b63fae2768a108375f67473662bfeb4ec13d0e87dd"}, {"a": false, "c": "mBbK%jA*pe#DAAsr>I~k]TRAc6Gz~_22KC1k~eiY-54&a|;czK72`Ehz>$N`>CHE0$gd!z*ApZia", "s": "3bbc004edc7f23a4697cba606f8abd14", "oc": "f4393c09331a29a3bb2cd8b06b5b4a68ef92e730f7f13398456d2cc9303593c686ffb3d0adb1c01dc024da4fa7cb28f86b0009b8e122ecf847310be2c5f7bc75"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (50, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK(vRr$AhACXm*IVQif}6h=C%De&GY~bp?=It%!sOTVondL|l-#|%BR$G@&)<}s+vuVQS7W@z}z7?qT>VhqHX7r_e>f@e%w;jishe;H2X+3HX^>azaF#h2vJ%zy", "s": "97e5da08ef61845d52fe9b097229cb41", "hm": "8067db6bcc48ab39c3b6953dae4ed116"}, {"a": false, "c": "mBbKzpyr$xQx:XmuZVVOi}Whu96te[g{=j=28@e-tz#kr;^6<3WFOjo2E|8I=f.gcYM><KvJV)y", "s": "f15c91b2207db04efcccc899ed0fe4a9", "oc": "ffc7a88fc9128f32b313bce1a915842bb7d8f3a5c68ec245a53a579315e7a9a942adf637b9e374b83d362d02b2221266a6357d6cbc9e1a94d531da4a80aa0c24"}, {"a": false, "c": ")SbK(pyO$NKACXmOgVmO`}IhrLMr=wKQit&1H!TU(K_Gf9WP-@uChztE$Q;TtZ]`EA3}PaGzWm8T=`6|a{?DB2co;a!J4DzI*_>j%sjG{{Wx>HAXAdo{GYTRk;F|R6]zL6{=f^Bo_p0yr(4d7(!=L+nV`S", "s": "3a9a495671c69db0a92eb56b489cd242", "hm": "60b263bd7891d01fc5151a1a28f6dbe4"}, {"a": false, "c": "mBbK(:;r$AQ)CXmOIVmOi}IjuW,ceU&9XF?yv@M-tz#Br;^qL3WKzDfBy", "s": "f3b9d7817110610c244b538bc337a20b", "oc": "2b47201149fa2a3d15cbbca6a9e8b5008b4de6a974ae14269fbe0fa31b9da9a91e8df64aa9b3a325c54b68077b2e54760d876e7ebd2eda1cea61d84f8d1ae034"}, {"a": false, "c": "mBbK,`yT~AQA<{mOIVdOi}5hXYte;>OF0#KyB&-0Iu#N^GXA#daICry$tsWk}0K=DmV0F2cf=rBYM1iV4Bo>W5_=jmhG`1g!l(zM1!J{pjgX(7ToG`HWORpe>^$zO*^JBH7KRuY0gM#$A|V?F-J2rNQ@9CWCgDd{!Fg2V-I_cSkljFix641DEj6VA<1h!E%%1I8$IIj}{-w=uP_~Uo{w]+k8(bLh", "s": "1498e6c204c0848bd2e8fb19b0d95745", "hm": "8063db44af48643cc0a56f33be4eab16"}, {"a": false, "c": "mBJxkT^%9N?[W?yg~1-Jo{c7q8w1t~g[>{Sy#B;H=3icvNJK=wXj973Jr0#i#2^fUgv1oE|azD!=oJIS67meyzFQU31{b=OoX{u-XP2XSJ9[aFD`690&:|6wY5xR^);2|E;slZ6`h5r`k|7Upd}>1anaV2jlN(0F~8DaS@nuET~a6,zy", "s": "f30fb965f6740256db73b2000594cfc6", "oc": "fc65df35bdbf4d59a300042a16e0fa495da413301e698af0dee05f835f475b552ae3b5c3f49eadeb39d2d28c821b1a104d35b765864cb5aeace32a5a508fbae5"}, {"a": false, "c": "3BbL@Va%dNl0T$;,|1-4P*Zmq6w0HB3K?jM)H^5UO7zt3y{Q@AgNE0P94mCuT5Y7=>|nB+f;CGiA2|X%3(Myn3~n@&!m{n{F{TD75$Vz[85KN&oDw7AYnEe|S~DkWX{85Bby<_1V+JAQ#4:ifJp5R87W~6qZ}xLQ@6qbA0{V^.fZ>lf4rxAE3Y", "s": "2b9396fa40e7844952999b6270035785", "hm": "03f71643584cab3203086a36be4f7b10"}, {"a": false, "c": "mrbF?;2~||sh787#?XU&rnqH480V_E^F!9^$Tx^Bh>*L,Z3UBii?i~Q8f6-JS2^NOgC^2*,K#Uz=45>wbL_z-YVEhUs6`yfAd|iH^dFTW", "s": "d5ebc7b5207d376ed71ca81f1d00c40d", "oc": "0bc7411ec79f23321d266c16ea5f0b4bb048f3a3c5ae1445ad2a67932219c8598eadfa4fc936754535366d07725954df1b352e64a6dedbca"}, {"a": false, "c": "WBbKAo2~_|&h787w~X+&#nqH4,6I%yI5+SZP%(r@cMfC#>B`Y@g%m&N_;^LaZhQ->WxEN|ajs2?C}n9ug7f5Jtw6L=aRT)AQ#4iOfLEg;ade-4qZDvLQgnq2A0d${_z-Y6h0ssP%yeADDb<^dR$!", "s": "f3f937b40817610f95fb2fbbd3c78e2b", "oc": "9b28ac1c284f2a321053bc067f0fb80ba743f2b972dec0a5c5fe799317b385dd66a1e24af913a5e585368d7be828647ba63ccedca90e4b56"}, {"a": false, "c": "~BFKD;du2>LoNl1D^FV]HXX_T>5(j}7si7LTq;}pQBYA1T~B8QOgC^U%oK#UzQ4U>Fep_&-Y6h%ds_yFLAd|iH^dF$}", "s": "34ba084fc7742c09d3f13e136651b34b", "oc": "fe442ca5337ed1a31fe557c2ff593957e77c434ea3e5c1db03cfa6f37bfe1cb99987a5305428f65a348e6a053d2773de75925b1aa344f75c08d192fa5d0b026d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (53, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mc>w&VX<+ENnW1UcJ`U2{OH(Eq~PZP7^Gz{S[7X*)IN#R!JpxT_uu4UfmMWp|*!", "s": "d80bb71e407e30fe862c70d6ec0ae987", "oc": "f3e7a115c319187222531c0ea91f240bb7d8f3afcb32c445a5b06891259989698e9df64bd9b8abb5c3163da2d8474b01aa51ce624d9e0bcb"}, {"a": false, "c": "mBbJ&V+<+WNn>)GaHg#YNCMH#L{)6dAJoC}ZsECbiZRtYT&vn}g=yOC<1M[YnMJisIv8CoL6$:tB8-87(C)8j_TYuX4m@>(<<0L@N_=DyfRUxd`{mT{vH9gB(Mau~H!SgKVY*sUNb(Rcsh!stkHDqucc8W", "s": "3d9a51f321569700a928891be4507221", "hm": "3a37bdbe7ad29e7f80e51e1a18fc5fe7"}, {"a": false, "c": "mBbJ&VB,+W^nWT}JHg#Y!CMH~?-d7231ayTOVUcz`#2{On(Eh~fZX7^GuESL7Xr)}NOY!`px]_uu4Uym)Wp|*!", "s": "f81993817210ba36757b77cdc3372a33", "oc": "fc57a12fd81f223c11d3c906a9e5260b50d8a079b68e9d9566aa67711b89c9698eadf66ab2b7484b85356d187e23eb76163dcefc8d1bdb81"}, {"a": false, "c": "mBaJ&%+-+wNnWTGa{|#c#CMH#B}M0qD*7I9$OIF8zdRu#083}I+6s1Wf:2)dko<5qb|2ZXC_BU;Tbt1T!rE]pKZq{7Rb(bOLEFpjApdXoft#bR$>xY}p~S", "s": "6ad9b9763b7ce2e7fb3421d80575c838", "oc": "9b6a9c7533b34019aba0d82d7222b7fc86dc3d2ab6baf9acfcd6a1c3635cfe64ff0ee1f67fb4b339eaa21e45ca8a3bb66fea87f739d4c3ceb8c2672e280ede08"}, {"a": false, "c": "mBQJVVL]+WNnWTGaHr#Y!CMH#6TIlsYv>AirIniclnaT}hv3OI#2{Ob(-q~PZP7^GuFk;lMb%[pcgZX1cmCN2J>3Bit#!(|!Ba($OTMP&DeW1q", "s": "33aedc010fe71e0652f49b667229c75f", "hm": "8066db6498e8ad52cc052a3db740d910"}, {"a": false, "c": "mBbM9-anu96ayr}*id#80AgBqT0!#U2}xp0*3D+DW?*t08YEjnsDQ(d5W:Q4n*H3W?^aEq$QC", "s": "a9abf7b7d97d30de847ca896e68ff2aa", "oc": "f86f18ca9d112a32b751ecf6093ae4b3c7d0f4b9c5aec445d54a67931599af699b0d864a79ba5b05cd9664097bcae486a6cac075a0c741f8"}, {"a": false, "c": "{7bM%$YF{-k6!=+OF_TtBZQA|boV=&$>#B&&1><2oy)S3Epcg(X1ZmCCxg>3Blt#*(|FBCKt4RJ*8@S2XQqL+Sqd_]}0gN<&V}@KT9z)(?KV8+%_Bx>J]Y2+`w~kdOUr4O~cKOn`(-[cB){+j{[p>zTWjtI1KV6FnXAhr[)*M{J-noz#c+unh7f$)DP{1}WC4g$Z=r!U$ho1nk", "s": "d400a60104e8838d324492550131ca34", "hm": "80b7dc5fab905b3cc005da3b6e4ddf1e"}, {"a": false, "c": "mBbJZA79c2ewjVnV?J`Hj)cv`cvBt{%KkS:Qwf$>Ep?.8#MyhlYW_&4u>_!|R2`-TLDz=h0YJ|+I4Xqd!Z=+d>D{rUIt~K}%!;ci-%7eX", "s": "d90a97b5e07cf0fbc68cc8cd4b05e4a7", "oc": "3bc731c7f6b2ca921553bc86c21fc40b37d810ed86aec9c5a5ba6702e5b981695eaa6c4559a1acc5c0666d247b27d778f5bfcecbad9f71f9"}, {"a": false, "c": "mBbJZrL9c2W{Osnrra&Hj_9v*)jQN$-p1~llv&(~-)IiIe54*>Hc16kg1k(`D>cnQ?crE07tBC9xRuZTg}57J!tjaq#%1rMK6AOUpGDK~5L`OMAWBE)*MwJ-nozAMD^;xfI9)DN61}W%n.yZ=r!U3ho1nk", "s": "340ffc0001329d0ca925082b5f90e2d1", "hm": "1eb7b6bb0102b77fbe86161f08cd2be7"}, {"a": false, "c": "m>b{ZA|9~2`{Osnr#aD[j>c#`8vu02XK}S}jw%$>Ip?F$#My;O6W3&4hNM!|#2`-TLZz=9YYJ,>0}XqM7gr)nND}(Ax%i!BeChODrCfOY;nXOPU%6{%TyWAP^`yYgzC96v{WMxVpuh", "s": "fa9f9975c6957c20db654ddd15eacacb", "oc": "6c6a9ca537757b19a101817313f313a482b862def70922cfe6623698fb26fe0885109518f554ba60ab3eed904224aa8ee1403f236a3abf7d4218d623a1b18dd7"}, {"a": false, "c": "l9+J>A|ScN]5]sFrra?Hj&c)`6LBDT#>7U{`q|VZb}%~l,VivB#%`-TLGZ=hdZTq>I4bqd!Z=+nND{yQI^~KG&lFciJ%70X", "s": "fbbce64f467523449e3cd89f66b1bd56", "oc": "cc68b8653fd34ea2bba172ef177fe859f51db628e4e7a88ed4664b3aea2a42f97427d1946c7db44b58b3141f75fb558189c87d7ecafe9c8335cca3528ef38614"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (56, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&X2HxTUi~T2<88c5!nCHoUIbLn3K6jQ4;No.82E?U*:dyX~H<<(T7hYlPGNULHmMeB1P`?6&?_F4FNIOvT}u%n~~l`f|>|3LzuAAEZuRbTZsQBASN[*laiQaI`+Lc){G*FRUQX2HOTwF~TT9d8c9!nC$V-2*K>;>WxTj^P8P;XyU%6)f8k#zI#2L,ku8rKl4La~+GxUI)iB8?RTn8b$&_I`t&=nFJ<}-|JotwASNTOj>iQul`BLc~{GVLR!.C48-g*K>]>W#<^C-Z7TjwP$Po@y+w6)=8kC-p#2_XmuCrKl4]a~V1xN3)iB|^CUi~T2yC8cD!nCnB?j$7.0_DNK75Cw_xDWZ(YP@zH*!j~KCDwQ2%AY+ffcf{G8Vmj|-o$-+itVw@,`aJj3a9vuonMgAX-W_L5fGz_3}6>pih", "s": "eed6997636f4c2e4ddfcc8d805eacac8", "oc": "1cba9c6c33b34219a1798e17fce372bda929f66bf1603008226c77dd120585dcfe6c1864a07592d814bfeb55684f290a97bf46dd9b7b6fe650f4c8a13108e43b"}, {"a": false, "c": "<*bKU&X2m25Ui~T2yN}B%cTePAS", "s": "adb2704f4a63333cc67cba1f6681bd19", "oc": "9ce2968533bc41a3bbe154a1deab94e7173351c5e1fa424b8694700d3a8be41eab9c89c88387d5943ae933fc19ea01ec34ab8fefed2b3fff432d447c4aaaebd1"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (57, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "q9{LWIRx#`agGhoF,D#SK|+DdYWwM#URgCtCmpM_Je~#}*?&f!Od7*jT0qMGNNz;Xa`9*-n6)h&h>?kn.yr&IQ4CF9_BKS`wyG=Z#MI61!.)?c>iqP98_Q&g4j$2Nd+{eskzc`58em?&QA7_oqHcYn@#&QnhTu^o`Of|]oElmJGI&WNPH2kG~rl7z", "s": "849ed00f0fe7856d981492641729c74f", "hm": "a6f79b494848ad12d3056aa4d0ee1e16"}, {"a": false, "c": "m>0LWIPx0`ayu^$@", "s": "d90b97bb607415f7847c6746ed0de4a7", "oc": "0bd2a11fcf1f28a3172ab954a91f25fbb798f049c64e22c53b666783159cd96f88add694b9c9ab45c178fd047b9ae326a231ce6dfddf4db6"}, {"a": false, "c": "mBbLWIPF0`a~GKoFvD#Sb]:.F^VKmEdg}1mz5]+>Q.|yUN1@DPT`iZzO||cAxQ=}b+Z}sAcAX*#ldWcpHFGiRSHP^7=gj.~iH6}*(((-BGRn[9A-_oqHcb^@#&Q*hTu^_=O~Hh$Elmz[I;5NP!ZkG~rl7z", "s": "ba9a5d66816bedb2a9268423c09032d1", "hm": "90b74dbdd89e077f86c51e6a39f0db37"}, {"a": false, "c": "+BbgWIPH0D)~GhoevD#`S|+DM8Wc&L(X9V6Z-{isIkEyzI`AV6j}NV%eDmLo#.{_&wl7x_wMpB3hg|v9g-k3QNG(kc*CHO2^T7Z3C@", "s": "f8a9a08c57a76b0f95a06fbec837aa26", "oc": "7d37a8c5c81fad021fb55c02f9cf244a7ad9f90ac6a61895a58abca3ed998c698e2df943d9f34f4fcf38633d76a45a7fa575cbcc8d9f51c3"}, {"a": false, "c": "mBbLWIPx1`a~4hoFxD#SK|+D],C>8R*C]nA@=X>OcfePQ8^WM=&seo~$P-DAaU(5LdkQQ9-o{chZD{&-Ou)3piatVMPYA0?HN$B", "s": "3d6a46424dd8234921b95dff365cb3d4", "oc": "f2aa9465e0bd2b53bb21d7e108322a29cbd903d2cdb37320a28580efe1abbd191861100c85c3f960c5526958920d47516d87b2c94ab1fc92961f7bd03343511b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (58, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB>LUV@41_WYq|644h(&;v|KvY9qG7A5DAJM-UtmtvL4JxCAz2UlgJ~zXCHw&~`nrQg;{o1i6*1w!Sv&lAeB%BPNh0RfU_IJYu*je}Y)m3*35NkmPVz)s1]HAcJHsra5be<0458>ufMQ%$`tCE**E<=^=~zakT$@-;>>Vz8_*:me1YEm>m8g", "s": "949bca010f668d5b51341b9157261ecc", "hm": "807fcb65c844a55cc3a465bbbefeef16"}, {"a": false, "c": "m+B>", "s": "d9d797852cad30f482747be0ed0f3cfc", "oc": "fbcf7e1d787fca6615d7540609bd2c0b47cef8a9c0cec3b5aab4775365d9f9698eadb647b7bfa7b5be366dd87b2a52b7a625be75a274a9e2"}, {"a": false, "c": "mB{LU1c41aW(qzi44h(&;7|K5xTk1A!h2L`pi*@*IAxKCgEpSPvS;{eNi`=-dP<1;z<{tm3;%w*bvChnuw`>Mo9fQ$%6M*m|T%zcy^:A7MQ%O`t,z*iE%8Q=~?&xT$5-;E$yz8_U^m[1YEm>!52", "s": "7dba5d560c3c0710a8292c1f544a7227", "hm": "6db755499506370f867a121ad8f41d77"}, {"a": false, "c": "m|]LU1~41)W91|849h(&27)K{8W5Xe9m`5OH4)XL??yueu-[GqH8&%w)UU6G#2}y8s#C-?8HwGMEK{UGs5?^5LWiZvd8xf`9(;:`{p+B>", "s": "d383a733761b1f8f958b0f2ba337682b", "oc": "1b14601f481f2f321653bc19a91fe66b4709b3cbc659cae585f76713c379896489f7f64ab91fbd4ec582698a7bdae47197fece6aa272e9ec"}, {"a": false, "c": "mBe~U1041#99q|?44h)&4v|KUB`tIY7D@4_0h%C5;rHRnc+K)h-PvUnI*1vh7x9u@YH3J|V0^?N)V+9b6hMn)O|>kjK(@2XHmkL&kD9=[&?X*yf!_V=pu-", "s": "b339979a3611f2e0d32b2dfab5bc5dc8", "oc": "2c6a316535395214a3019f18c9c02c4e43535139d634e9c9ad798895d1a06492fcdd10647e8c718c7976f8b496c5f79d3efe533b43a956ebcba804ad7c88b049"}, {"a": false, "c": "m[b#U1c{W=W(q|6O4ho&h$|K{6)0LiJRMc%=Xp", "s": "adbae29fe4389e439cd2b7af658d8a74", "oc": "326a9c150e3349d31b91d8e94961090cc2bb15c94f1e519fb5a2f7b6ab3e0a7b72c87b41fd9dbc482d72bf33245468120b19e5f132c2fbe1197ff96a3440d16f"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (59, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbU%Kz*_eKDAAsr>rbkeT5ARYf9l428fb~zD>EF@tSDFHgI0-uESo,1vXRJD2<}`LQ{CTSbJ~2)s{*LAyrXQ9$ohk+Csetmz^3HO9lde?mIWT3O%zd|o3qG&9^U9AUq1{AHOMF>P%|%>Rm:|o~0UGgsA6p_Yr|zvoATu_@KZ", "s": "94a3dbb109e7145d5214934f7720c845", "hm": "18d7df14ac8bb4b297055a3d1ee1df16"}, {"a": false, "c": "NybT%Ks|I~keTZAc8%g}%Oxq$eq>@mE{J3NY83A)y17l&AvBbZG#2`Eh^#$NVuRKq|Z~U9}gse5t_Yr4zuoAT&}@KZ", "s": "3a9bad56d466a870ab9f44d95493c214", "hm": "6cb75db97ad4b372d675567dd8bedb07"}, {"a": false, "c": "mBbK%Kt*MoKDAKdr>I~keTZAc8$p9AOoq>urm@9N+n3,d89A;-unl&A-BbZG82`>KsIMeKDAAlr>K~k7TZVc*GQI[%8;Qj#EFY-SqMqi#Ul|7VsAp`1PTa2z0mDr@O?=HHWjs`JPN=6}94D[OjEY%U|Xe6:6#B>tTrY05odR>61m-rpmh", "s": "f5df996536e4e295dfb34ed805eaca72", "oc": "f068966538c543f9b10b182d42727c2bc65c2cdf00b06126cdad8a7fc7879b99f0fc92abfb6e0f9f9fc72257e3de20446132e7bf67de3d6cffebb5c8e5108f55"}, {"a": false, "c": "mEbK%KX}OeK&AAsr>I~JST{Ac6Gz~_22KC1kGe`Y}54OBG;cYK#2`Ehz#lNVuVmOi}ehuY%D0&eY~aDDtIX%R7_T!onNL4leDe%BR$G^&)M)zshD;H2r0(HX^>azvF#hrvtHz7", "s": "669e140107073457541b7b67f773b73e", "hm": "3d675b413841bb32430a663d944edf16"}, {"a": false, "c": "mBbKIp>r$IQA+hmORVmOi}IFu96cexg9XV?28@M-Bz6Br;^6<3WFOFd2ER8q(foXcYM7<civJVzy", "s": "d1fbc8652076009ea13c2d2b5b44e4a0", "oc": "f8371e2f7d1f2a02155ab30cd757240ab74dfc797641cbf5a5b3679e189544698ecdff4ad9b3abc5c63561026b265e38a4f0ce98ac99c2b8e96f674fd31abf29"}, {"a": false, "c": "{BZK%pyr$AQAlXRO3.mOi}IhuLJr=wKXitTn1YTVHK9Gf9WP-@uChz;E?QZEtZ``BA3nP-GzWm8T=`6b9{?DB2|o}A!-EDzI*>|r%^CGO0WxpHA}#dc{5YTtk;F9W6Vz*6euf,O?_pGY,f2dCDA=LK?Jnzh", "s": "9d6131547a18c6bf971b61b6d33efa2b", "oc": "ffc7119f49efe23415b3cc06b12fae066028f3dec6aef44a35bf679b159989418ead564ad7dd105555d697c2b42b440616d2ce6c1d7e2ece1934d8535bcaefa9"}, {"a": false, "c": "2BcP(pyZ$AP0CX7OIVkOi8JhuBte;>OwkvKyBL-0ps#N^)XA#da!zrO$8*gk)HK=RVV1&2cf=K|4M1k<<^1Z+O(zr7YIC`o{D{(LRF=bBK!+;7>KvJwzy", "s": "ff6f8f754675e2effbc44da805e5d5cc", "oc": "f86b9b61b3b3f669a307d7d190f5a722c274987d55db941bb098383a87e181a5773acb25bb12ce7e28b56b74f4ae2c872a322d7a1f42422b3ad1106740157adb"}, {"a": false, "c": "mkbK(p7DHyr7a_hj`XM`7fjl(Y$1<zr7YhC`o{dI(;SF=bB<#+;#>KvJ%zy", "s": "3dce02df4f7839446e78118f41a7b364", "oc": "fcfa9c55135e3baebbe1313689d6d5e0f10410aae062d001247783f6738b931df8f81083bc7c26b796b09b2475b8bfd53dd5347e640bc5de7ba161d1a78904f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (61, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "ae=L@}$hdLZ0eLIg)1mnP*c%{XCJhW0ZgZ^G?l@m$Cf_^HbW!V*=iSNa@z{bfN{_gawl|7h5cA%UVt4+L+IO1JKpj7X-%SoxUHWwRpeL^$pO*^JCx7KRuY00W2{2OV?<-Z2rHUo9CW}lDOs!Fgdd-I_XI7ljF`M641$Ejk!A]D^0sEk=Kwui$GK=wXj97aJ#hQi#2^fUgv1o_OazD!;o`mS)XmMdN?]M$;u)O-JP*c}qK@zd|K5qTH!~f=;I8>g2#b0>wk{^uT?MQ1vb$M{qSK*j)IM{5qYV{jR.w?5XTu*19aKGAh1bxWHa?ie`)BM&W41$Ej`!A<1h!E%%1ICnYIE}tS8~uuc=|vE&:+k8(cCh", "s": "310a555607c69a9b12068515c89252d1", "hm": "babd5db008db4d7ff76b461aa8f14bec"}, {"a": false, "c": "o{f{@_^%dN?0W$?g)1-JD*caq8N1tmgI>CD^0s{k=f:cv$fK=wX?973JA%Qi#2^fUgv1o_Of>D!=[JIS)7m(VzEQU^ztUh?^@=49RR^&>", "s": "23293f816414612d0552bd5be738eacb", "oc": "3b5704ff187fba9a1583bc56d91fd40bb8d4f5f9cca756f2a57a679315ba82f4f3adf04a49b3a14525866df27b9a841626152e6ecb9bdc1b"}, {"a": false, "c": "mBbL@`{TdN?0HrMg),2JP*@mqBorH+z)Sb|!oX{uNXP2XSf9UacD^69=sM|6wY+xR^g82|E3slSf`r5%@kD{W5ap;X#nakVjlNO0G@8DaS@nuE=~KC5zy", "s": "2aff4c7b357f92e0fbfdedd806cdca58", "oc": "1c6a9c423fba5b1e1e00882916273e3959781b0a8949eaf4d1ccbd50afb8534c9fe3461b949ea3e6c3dea289b414fab8edd2876a8451b40318220f575b3fbaef"}, {"a": false, "c": "mBbLIc^%UN?0W$;g)1`JPvWmq610l73K?PM)H&5-v7?K?<`#H>jW^fUgv1o&OaGD!=omIS)7VhVzE,U^z4UhB^@=|IRR^HJ", "s": "3da4bd4f4d742d411e1c7e106781b344", "oc": "bc7342acbc2045f52e400e27ac0295d3ae0bde2eb5b55d54bbebc9f55094a286d301c2237da6d8957ef9eb250899599d0c3e8d2ee9198fbf956712a8d8ad580d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (62, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "?fbKA;f~o|?h787kWcU&=lqvSYPl!I%e}R}?ZZ86dK}X>lHmD[+@YpwE*k$NN.nq|LGyD}@WguEcP94mCuT5Y>=j&n*Yf>vliAM(XxNmMyn3~nCKtZ2F4FsTD7A$Vz<+5YN&0<;20Jn>e)&JDtWX{8GBby<_1V+JA.w;iCfmE5R8_7-pqZ$xLQgFq2A0{V^??ZclfVrSAE3Y", "s": "c79f0651ffe4d43d401494691fd9174c", "hm": "10f72a44a64e0619c3016034bc4edfa6"}, {"a": false, "c": "mBb2A;2~_ylh787#WXUe=nqF4EzV_R^p59E$Tx^Bh>+L$Z3UaiidiIG3f6-J#2M:)gC^U|XK#UzQ4h>FeL_z-Y6h0sktkyfAdEiW^dF$#", "s": "590b9d3546a733fe8d46aa1ded08e4a7", "oc": "fb17ad26c8bfba2d455d5443ac7f290bd04cf5d9c6af9448a5bf6793139a29698eddf547bce3174845766d8b7d2a5c7bafff7e7cad35fb8a"}, {"a": false, "c": "xBbK4;2~c=vh787lWdUj=:qH4LKI%yIG+S^%%7U@cM}I#>B`Y@W%m&?_;qLaZh#Y{tI)N?uM{23C}V9ugdT8JtwrL@Oe2TD$XfW!5>d;)=aRf){Q#4i+fmr5R8deX4qZ}xLkgIr2A,AZ^}?Z>GfUrxAm3z", "s": "3a91cd76313b9d03092e801bb490c277", "hm": "20975d5d78d27b40e679b61a28d0dbe7"}, {"a": false, "c": "sBbKA;!~Y|&Z7.7#WXU&=nqH4|zVzI^FEfE*Tx^*L$63|}i?dp{G856-J#]^3OgC^U{oK#UzQ4UxLoj5>D^FTCHMV^T*5*j}rsi}o+q;}pQ,YA{T~d6QPdI7@m;5KFfe9X!k4;S.Cuh", "s": "dbc095953f89e4eeec2a2dd036ea3218", "oc": "fcaaba67f7b3b228a30b8e13dcef8f0b6e15d874cc7341de68ce3dc46461d45f74bc59c3ffb2d470f1e25683009da767eeca73dfcd04fa34b9c4563634a26b21"}, {"a": false, "c": "mBbKS;+~r|&h7*7fWXU&?nqa46DPW#$J3a=FJq>gn~i^IG(B}L#t^>OgC^>&*K|UzQ4U>u%7_q-Y6hxl%Qyyf,dJiH^dFJW", "s": "3dba05bf2d82f3446e7cb778e420b3d6", "oc": "b90ac0d539b341a1baead79efbae3a57974adc4d1d4441440fbf813e67fe11fb45f71ff0f02ec65ea440a24336a703c7b58a98cb824c4218e8d1121051468062"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (63, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBxJ&VW<+WNn6Tu1Dg#YEcM|#YUj70Cz_B+4U|viOb#KGww=$?LX>e+MA*Facn%$|Axv1hP<*1C)T$t(|+bU|uiXGic$IX)<&LZp}7e](9gBZMa8~H!SlKJh-sUN*`Ics{|stkHWqgcc8!", "s": "9a4340000f38842d52f19b6877609c42", "hm": "df47dc4e8841abb213006b30be4e521b"}, {"a": false, "c": ">BMJIV+<+|N8-5daHn#Y?CMH[8-YM231ayoarIz9v|n+6AUo7QSU~KL?&cJ`x20Ok[Eq~P{P7^GuJ<|y9@zJL%yfRIxdAX@Tz|w9gB(M+8kH!SoKJ3lsUw*`Ics~Zstkd^q1UcJE#2{On(EqtPg(7^@u4-L7X*)st#Y!@pxT_u>ZuSarWp|*!", "s": "feb94401721fb9059a5b0fb4c3374a2e", "oc": "fbc7ee1fcb0f2b324533f15fa91d240b47d843a9c6a02445d5b867f31539e569a3ad1629b9b84545cf3c64c27b8a54f6d6edc463ad9e1bcb"}, {"a": false, "c": "m7bJ,V+<|WvnWT*a!J&Y$C9<#,}MXqD.GI9$$IK8zdRu#k8c>I+EI5dfk6+dk9tc%?;Zsu&v.P?sH9I%L3u9XEUb~W)3e4N&w4s2=>FoXlMH%ApcgZX1p*CNxJ]MBlgU;(|HBa.jev%5N($V-Mi&-eW1V", "s": "9f33d101bf9274dd7a0499e17ae9c945", "hm": "48a7d244aa11db3b43e59afd25456f16"}, {"a": false, "c": "?BbM9-awL36aEUQJTS5}uv8R|sNY+p4~eSYRGzix6pRP>>$YGm-r^u=+OF_wHB8QAoboP=7$^OB;c1>9Goy)=sApXbZX@WVCNx->3B#t#*(|HB%-HwLGoa{?+Xg?~|a;Cw=g<@Q%5mTYoT7@C*zCwByw7*id#{c3gNC{0K#327xtY*3&+DW.FFgV.EjvjDE(H5GN*4npH3R?^aE>${,", "s": "11b933815408610996f4697ac2f7aa2b", "oc": "0bc70c1fd81c2a3d8f59ec4eca1f5ca9f7acf3a96d7ea45425bd679f15de89be7eadf64abeb38ba5c536dd59fb245476a635ce6cad7af1f8"}, {"a": false, "c": "m$bM9-awLU6a6IJ>^aF>e+8]NuNY%11sKvx#}&Tx*buLc?Hqr$Fi}MZI=_L3<*cK0uh", "s": "fa6f7975fb77e2e0db41cdddd6ed9acf", "oc": "fd6a9d623dd3f2a9aff1233b9dc9c22f48cafd634cf9f6dd06e20319047dd169b8c27699703a6ecf687dcfd496d9f149eb2df18e45f27231a04c2ca7fc6e5e3c"}, {"a": false, "c": ":B>M9-Vw4Uq)c%+j{1przTWjt{0?-d^0(Fa;p;D=0k9``h@8L7cTs5>(~z$Ve*;3X>^V6Fn&AWrE)*M{J)p?C8#My=w6W3&|q>M8|:0`%TLDz=hv6Jq>I+Xa.!Z=+nND{`QIt~KA&!3cW<%7YX", "s": "d9c29705203d300e8f4c4849ed25c4c0", "oc": "52ce21f4c81b5a205053b802e91fb4eb27e8f3498dc2ccc500501793659d89198ea23da5b9bbab452a36cd02c72a5976b637ce64ad9ef129"}, {"a": false, "c": "mBYJkA|9c2`{`snr{a?IjW{v`LjX2;$p[1lQ*&J,<*hi0e5|*FHc1Zkglk0`DRcnLbB$E_7YBCpawKFTg}7*4!tGaq#DWr4K)AOUpGD9T5L`OM>?rn)*O{J-nozAcahn)cIe)Dr61}WD4g$Z=r!U$ho1nk", "s": "3c9f5d56e138ed30595c8d1a54a5d231", "hm": "2ab7e2bd78db2b7f0837112ad8dedbe0"}, {"a": false, "c": "mBbJZR|9c8r{Usnrra`H_]cv8pvuj{XK}%Syw%$&.p?C8#Mb;w9Fd&4h>?!|#2`-2LD*&hvYyq)IaXqd!ZC+nND{rQI4yKA&Q;cin>^DX", "s": "f3b934f7ce15610b0557b6dcb3372a2b", "oc": "ab93a36fc81f7b3215a4bd00a91f940137abf3aeca2e54519b0af9b3352c196c9e6df445d9b3ab4ac5166d0d7b2de876a631ced1ad9f6ef9"}, {"a": false, "c": ":Kb%Z~|9c2`3Os}rratujgcv`$*{Pt7DegliptG$g0CvMg0o@!h#+}0>I%ilveChO?CCfOY;nLOPUR6{hT3wA8^~y_SzCfLTWouxy_tM80>r6iF1MxVpNh", "s": "f7e99b7c0f44e2f8d2045dd80029cbc7", "oc": "84ea2d1fcb0a4489a30681565333438287bc4ec54707627feaa73cbdc30f082658af11d6ce55b720db8e5d3042fd9a5e3f403ac78a883f7f40ff082bac22816a"}, {"a": false, "c": "{BaJFA|xc2`rOBnrI|?Hj)cv`6KBDtM>7UH2X|xfbg%~lyV4:9#J`-TLD}=hORg=>I4Xq=>Z=+L.r7rQIt~KA&!;ciB%7eO", "s": "3dbcf1b24778e39d65bcc7cf0681434e", "oc": "878c9c6533b4e1a3bfe0563667f1d89805552453e0bbab83846228daeaee69ff2707518a1a3cb54b59b7a93b77db95b1dc887dcec2441c84c6fefbb78cf38712"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (66, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbsU&X[n[(Ue~T2uQjcFBwxo}BhocPB=G9Pi^X7Ye3GioV>*~Wl`f|lA3LDuAAEA*R3qGs8BAS5TOj4iQuZ`Bjc){G*FRII;1WV<`)-8YTjwP+P!@Mlw6)88kCAfB2_ATi8K$&W2`G&=n3Sjpuh", "s": "f36f1975e604f62a6b2a2fd8035c2a58", "oc": "f5d59c6c34b34319a4a188fc9c39a3bdd2454885edc0a9a02863e6dd78008a07c7a7134ee0959be4b4e78fdb2b4694089bba8155009208f6af942107dc41503b"}, {"a": false, "c": "m_bKU&X9H24UV~T2;sGjoB`%nN#2sXk%8wKl4na~a6xNI)mB_]JO$YPp5`XP9N2B%cTePTS", "s": "3e5a76724d78bf286e7cf91f6681b397", "oc": "fcba9b6ff3b341a9bb91ddff0bcb3ae95c4e5145ebda64d0861d70969f0ee1ce5b7ce1a38a96df1e9a4afbfd763f0344385002b714df56ffe3f0457c445afbd4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (67, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "XBbLBIPx0`a~GKoF>D#SKC+DVYWjCvPRgxJCmpM_Pl~|k*?b#!Od7*jT0&MGN)z(Xa`-*-nk)h#hF?knzEh&IQ4C}9_BKS`w@y=Q<$vXyx`^`.-]?2YxMEX1!?d{c%Y}<9^_QhgTp!2.}3!^Zkz9`50edfw4^Z_oqHcc^>Q&QY&Tu^7GOf|hoEl;zGI.5-P!6kvVrl7z", "s": "2463d601dee5ff5d540f6b6987a9c74f", "hm": "8007dbf4a8b8c732c6056d3db045db26"}, {"a": false, "c": "mBU.WIP>0`ac|h`^vD#AKz+DVw2c(L(XDVOh{>OsIkThDI`VV`$}NV%eD*Lo5H{_&wl6+{h8nB1Xg?*9g-jcQNG(4c3CHK!^e7Z3nx-$@", "s": "da3b27cc207d304e8166ae19edef44aa", "oc": "8dc77c2958df2c62cd53bc0aa91f24db8ddca399c6aec485a5b5d7191ac9b9558e83f698b9b3ab0e9636a0026b2a5318ad25ce62bdffbabb"}, {"a": false, "c": "mBbQ)148N1O?Pc`8{tO||WAx}=}b+yL(AN~X*$TsWipHFGb-2|P9^vgIUOsHce$#ThJI`V+ba}Na%e>mLoFDT_JwlZ+_w8nB3pg?v%$-kW9NG(kczCHK_^T7Z3nx>$@", "s": "65b137a178c7410a05536bcb0537b073", "oc": "f8cba1efc8ef283f155fbc0a892720fbb7d8f3f4c8aec243a5ba67d3159d8ebf81adb6e5b9336245e5346d027dda5ef6a6b5c062ed9b42bb"}, {"a": false, "c": "mBbLWIPQ0vA~Gho&vB#SK|+DV@C$8R*C3PA0=r>-cfeq<8~WJRfs`Pr$X@R%aU(aL,kQ{})o{`u3SF@=v])3HUHtyMP=AF?HN8kJO%5kdq?_}]]MZ4lpuL", "s": "df6f9945367fe0608b2427d8f2ea7a28", "oc": "fc688c13c7b312192dc6771da24d118a23f62f298e6238f1f011177fa3ab539153392612baff01d00abbbc418af1d506d7022484e20cb8549e01d2c1ad06c5e8"}, {"a": false, "c": "mBbLWIYx0`a~G-oFvD#AK|+DV6U#baE^11e2ovsVsxVK8$@", "s": "74ee00094d7d54446d9cb78f6689ae89", "oc": "6c3a8c6543b941afb1efd7e10823248ae7d9bbe2cbcf826508e910a5e6abfd12a864132c92d3a96b6fe7e22a98bcc6b1cdc76f9154366a903913a7d59303375c"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (68, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": ">Bb|USc@Z)e9qQ6[4hGd;v|K{H:@G7d2DA>M-UtmtvnF4-rpm|!bIF.J_38XA>$4JOC3zZBg;J~zXLHw&~>@%[g;|o1ii*=>t*vLVAeBwBPNt0)fFgxK&_IJP%Ujm%|Tb3t<5Vk>PVz>R1vDjcEH#rF+bO*fMQ-t[tCz*iE%AQ=Qztk*$5-`EE6z._*Cm!1YEm>!82", "s": "7993d60eabef8a1dc3a49b8972e9c1f5", "hm": "83a7d3448ef8bb17c3056d3dbe4eef16"}, {"a": false, "c": "mBbQU~cd1)W9q|64Vh_&;v|K{885XJ9d`gO>x)XLdb[>JX*WGq[8>DTuv+Ey#2jN8LICY1kJwGMEK{Urn5?^5*WgzvY8Tf(9y;k`{p+B>", "s": "d90be395209d30f386ac3816ed0533a0", "oc": "fb33a1adc8fb0a3f175dccb6a99f2e06b343ffa9d6aec44549ba6693158989698ead904f76b35f45c5361d0a7c2e5476a9e4c931a571a959"}, {"a": false, "c": "m>Z.UIc4R)z9q|644h|s;v&C{?zk#A!h2L|pi*@*IAyKZWE_.PvbNIeNNgcbCdA|MQ%M`7Czci6J8Q9~zxkT95-;E$Vz89*^me1YEJ>m82", "s": "30ea3d4621369d00a92e851f4c1ee5a8", "hm": "6c785d77484cb27f86a55a1aa8fdef87"}, {"a": false, "c": "lBbLUZk41)W9q|64thT&;v|K{`(5Xe9r`5OB4zXL??yheX-WGqHW&0wuvUEG#2}T8sId-1k1wGME@1aGm5?^5*W8zvh8xf(9W@>`{p>B>", "s": "73b93d91011b6d019f586b7b6a02a51e", "oc": "fb57aca7c81f2f3303133c76191f4407b7dcf3e9c6ae7445c5ba6563957c8b618acdc84a8cb3c175c5366fad0b5a04790475264cae777ae6"}, {"a": false, "c": "mBbLw1c41Q4@>|644hcI;v|K{B`tnY7D@4_dhdC5trHRnV+jjqyPOPHmKL&kDL=Y&LC*yf!%V=pWh", "s": "996f7f799974e9f00677fdca850a1ac8", "oc": "cc6a9ef578b34279a3718eac95ca7c08fe1359e1d634b5ce0d6b8995d0b9fb25f72ec1a47f8f7bcc7c085fd17cc5c69e3efe6ca44205281fcfa505468eeb640c"}, {"a": false, "c": "xBbLYIs4f)Q9q|644h(&;v>K#6B0W9JX;;%", "s": "39b579433d26730f6e0cb316318453a0", "oc": "994a9c6533b3413cd8a0dbdd36ce468ccdbc5728768651bfb5a82b29abdd3a1d2598ca088496cc09f4dd2e365f2fe011b45999fe3fa7635e864a4b83b380d16f"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (69, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m>bK%KsVMeKDA$sr>K3keIZBcYM9bG|8fbg$Dz=F@t{DFHgI0-rESoh)vE``D2;}wLQ{MTW>Je{)sEoVF-)FbM#$UQW3PHK6mv_[gqst*f5~PYiiJQ>>crXx9y79!+1setm*#?XZ9ld1?hIWAkOV6UKy3qGwUIU8AUq1dEx~hLHZAW8$p9%ODG$1rm@AN2nggd8gA;-u7l&A-BbZG#2gEh00$N&utwdXj!:6B.rrG%_DCHEjySd!n*IN|{a", "s": "db3b329b23bf3cde467cf8eaed05e4a7", "oc": "abc5a81ec89f07321563bc04a91fad04bfd8938976ada444d57df72215298b6981a5b6aa79bac6f5f5346d029b3a5b7686e97e6cfdf489f7"}, {"a": false, "c": "OBI~keT3AcYZs-pqE$ly=4.c5DkOY~Kz%DitHX*hf84+p-cokD(@d`M>Is8T!%C%>Rmq|oV>{%gseRt_Y>2z+oAT<_@}Z", "s": "2a2a5b56a1f6bd09e9decd26c10fd2e1", "hm": "21875fb70ad2bc7f8181c23aabfdd6af"}, {"a": false, "c": ",BbKLKs*M#KDAA0nR{~kem*}(8$pc.O%qturm@mN+n3bd@9i;Qu7l&A(BbZGK2`E+z#mNV6(A@9T(<.!AkMArr]|_DCHE0$cd$Z*-NZi6", "s": "1f72a8f17488610fd5a2dbbbc327aa28", "oc": "44cb720ec8ff19e2b553b9b3eb17260b3778d3a9b8b9cc49a5bad393559343676ead495fb9b38b74d5666302312a5ee67635176aae7129e7"}, {"a": false, "c": "CB|K%Ks*MeKDAAsr>I~OdTZA]R5`Npu~", "s": "f44a9915d674eb10db242dd805eaca3a", "oc": "f9d09c3639138229f20e69236472a62ed96caad4b0f03ae4fed6e7c3fda79fd5a0fc74e497bee7943eb1d2b6b30e4c58d4fdd75d4a023dc7bfebbece55108f5b"}, {"a": false, "c": "mBPK%Ks*OR|DAAsr>I~keS<~c6Gz~_v2KC1kNeEF-#4&<(;c!v.i`Eh}#$!Vu|Atxw>4C!AfBZrrG%_{CHE0$el!zMANZiG", "s": "37855b4f4df6b1456e4ceb1396210d44", "oc": "fc6a9c0535bf714cbbc2d81c495d4a68cf93ea3d57657894758d6cd9383983aa565f6e11adde101eca744a43e66c39d247088769e122ec8b01be9d6835903efd"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (70, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "]BbK(Ryr$AQfCXm:IVmki}YhuYsDe$eY~Upf=IX|RsOT!on_LDl,ue%)RmGv&)8Do#vuVPS7W@Pm4>Nish~;H2nyQHM^>azaF5h9YMm<<|^$^qO(zr7YhC`Y{G{(;RFibBv!+{7>|vJ%%y", "s": "9b93d202efb7842d22949b2a42a90745", "hm": "0067ab44b44aabfdaf0b683dbe4edf96"}, {"a": false, "c": "mBbt(pyr$AoZ7JmOIVmOwWI;u9%csUg9XV?28@MW7z#B{2^6<3WxOjd27R8q=fZgcY&5<h0J?zy", "s": "c80b07b0207c30f78da7a816ec0a2ca3", "oc": "f0672a1f91b58a22a588b8eaa988260bb5d8f3490b30c88daa7a63932f248d199eada54abbb3ab656c0565e23b9a98926b35cb7cfd7eaf1bed35d89047cabfa9"}, {"a": false, "c": "mBUF(pyr5AQACXmOIVm@i}I{|LJr=wKvitTU15T2zK9G#9UP-.uChctE?QZTtZ``4AHiP-+hWm8R=`6b9{?D22co}%!J8DzI{_|{%^1GO2WxpHAs#d:@G|fvk;F|WrVz*p{_GuB?ipGt!(SdzD!=L+nfH(", "s": "6a965d5777369900c98e151e24d1d2d2", "hm": "64779dbd28dbb77fcda19319d9fadb77"}, {"a": false, "c": "mBbK(6!r$AEaC?wO_VmOi}Q|ur3ceUg9XV$`8@2-Wl#BXa^6g)WFOwd2ER8q=fogcYA:<,zY7CcC`ggG{([REysBK!+;9>KvJ%D3", "s": "f3b9b2e27dd2690b955d2b0bc537a123", "oc": "0b7781df380f229985f30089ae4f230cd7daf939c66e8445a244679315994562beaca64ab1b3bc41e53d2e0782eb54c6a63bce65aa55ca19b571c84c8daabfa8"}, {"a": false, "c": "mAbK(pyr#AT{CX8O~%mi;cIhABteM>Ow0vK|BL-0s,#4^GXA#daW8Vx$5*Bp)yK=l0V1F2cf=rI?41<BKU};7>KvJ%z+", "s": "da7019f986c662c0dbd4649805ea2acb", "oc": "996a0c60b50e42192ac4d7db66bfff72227380c553fb941bb558839ae6e189c5599acae5bb27ce0e387f21b4f4a9ec67b5b2b7730f8f42263ab17f6b431390a9"}, {"a": false, "c": "mBJK(My`|.QACX8OIVmO]}IXG6n`}iFf83O>k4coM^}_=>mcM`6f!luYM1<KQJYzy", "s": "0afd70944c7d4b44ae7c041f0ae600aa", "oc": "fc13916a03d4f5a32be8de87614dd932f10132aabe62df05d4789a9d498b89206aa6608c4ccf20bfeab01c4ef503030c26453108647ec5f02b61684f105044f5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (71, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@y^udN!0W$;g)1-JP*xmqXYJhWOZki^G?lNn$CwX4+`+IO>JKp|g.e7To9R?WORpeL^$zrx^JWA7K{uY0(W#+2OV?l>Z2rNIo9CWCgDO#3Fg#dn._c|7ljFNzDw1$RG6!A{D^Br{k=KOcI$GK=wXu97jJ#%Qi#m^fU&v1$_O&zD!=oJ&|)7m(V&EQU^z!Uhm|@=oIHR-HJ", "s": "f5693787b8d769efa594ed1b8372aa29", "oc": "5bceb91f881a7ae21753ba01d010e40b06d8faa9c5ae0c451dba579310f989838eeff24a99b3d14505c6fd927f252456a633ce6caa9fdad0"}, {"a": false, "c": "mBbL@V2%9A?0W$;g)1cJP*-2qBor4+`y>)|qoX{uNXPPXSf9UarD`69PsM{6eY5x8J!8q|E~(l0S`r7r@-|7W5a<;H#=ak2jlN@oF~aDaS@nqPT~!C5zP", "s": "fa689935262442cfcb2429d305eeca88", "oc": "f16a926930834619c600df4916273a4b05437ee0893490ced9c0f88179b736fce81ec513f3cf13eac3dce28912ff8810bd55e8698671bed9a84c4a5759c89ae8"}, {"a": false, "c": "mCbL@V_%dL?RW$;g)1@Jj*ceqta0PB3o?}$)[&h-v`ztbKin2e_|7h787#W-U@=nqG4YyG!1%ex~1?ZZr6dW=j&n!7f>bv$A$qX^)C%yn3(nC=!mn>|FsTD7_xVznm5Km>2D;^AY7Ee)S~0tWX{85Bby<_1V+J7Q#yiCf`w5Z8Fe-(qZ}xLQgEq4A0(gg$?ZPlfCrxAE@6", "s": "9e9308010f6584e752799ad947896745", "hm": "8087294c2846ab3dced567cdbe4fdf16"}, {"a": false, "c": "mBShA;l%_|&h78-#mXU0=]YH<8zV_I^FE9E-Tx^Bh>*L9ZSUaiizizGlf6-J#2M~OgC^JT>y#Uu.4U>Fe|_z1Ych0stPKyCAd|iH^dt$W", "s": "710ea7b8706d3afe56b10816f40f77a3", "oc": "f8c8be16bf4f2a310551bc0c791f980bbd60a9a9c6eec44ca5da6793b5908969feadf24d8913a148c9b66d027b2a8356a6d58e6f5562eaca"}, {"a": false, "c": "zBDKF;2r_|UO787#WXUB=nqH4rII%yI#+SZf%7r@cMkU,[B`YqV%m&?_;q(aZ.OY{yI=N-4qZ}xbcgnq2A0{V^?BZ>lfj|x4E3Y", "s": "7b9a4d5f5b3ab500792b84be6c3fa1d7", "hm": "6ab8503d78d2373f9d75d31a18f9cbe7"}, {"a": false, "c": "04bK{;2~_m&h787#WXw&!nqH48z3_M^FE9E:Tx^Bh>*L$Z3maicdiIGOgCXk%WK@UzQ43>FeL_z-Y{h0ssP%PfA[OiHI&Fp5", "s": "03b682816c026d6fa55960bb8a32aa2b", "oc": "f6c7416f181f25321583bc045831e40bbdd8f3cb46eec5dd25baa7ce1599c9690efdf54fb903fb45d2366d067b1a54eba635516c31f07b0f"}, {"a": false, "c": "mBdK>!5~_|&h78!#XXO&m(q=VC6`I)f|pN0giCf!s2%pHPD^%<>:u@>Lo)l>C^uFEHMXvT`5(z}79iV~,&;}pQtY717~d8QwJI7@mf5KFfe-dEz9I`^puh", "s": "0a6fcc723ea8e27adb7bbd88651acac8", "oc": "3c0c9c65d4b34719b4093e199287990c8e754811dd388172e8ae3dc46dcdd654a38ce9a7fab2d18cc6b2def7312d53c9e0cf061f5d082a76d56456b204aef831"}, {"a": false, "c": "mBbKa;}~f|&h787#WXU&-nqHI6KPS}$x3a=|$qxg_jiiIG(e$L#2^>OgC^U%KG#Uzh4lTFYL_AdpjhUMsv%>3Ad5iHY]Ff$?S<,eIfi!SgKJWi6%N*`IgU~!sak@^pucc8!", "s": "9e996602d9eaf47ae264946d7723c044", "hm": "8067d78e56482187c4d866eaa7ee4316"}, {"a": false, "c": "mBbJ&[~6+WNn}TGaHg#Y|CWH#8CdM231ayoGVu!Tv|eg6^Uo7QS1`z{1>c*`#({On(!q~P@P7^&LeSL7X*)sN!#bJpyx_uu4UfmrWP|eN", "s": "090e8b958e79c05c9d1c4c1f7d0c5469", "oc": "fb57070fd8ff95321553b30ba91f54bb69d808a9c974044b851a8795159b5e69dea9302dd9b2aa4645066d2f7b2a5476a355ce490d9abbd0"}, {"a": false, "c": "FBUJ&V+<+hNnWTGaHg6GnCMHNLi)6dAJoLZWs|CbimstYp&vn>P=yVkl1M9ynxXis4v8CoM,TVte(-u74C)8p_qYuX4Fv>JIW_Ga2g#YHCMH#?}MUGDJTI9$OIF8zfRq!08^>f+<8dnf96+dzZ.Gu{SL7X*)sN#Y!JpxT_uu4UsmXhpI*!", "s": "3daa908f3da8b24f79bcb74f6681b54e", "oc": "3cea9c653303e1a3bbe21a68f8cf22a8a6dc56e977551a480cb5c44194f1d5c3aad4abda05de5eed8d2cbee20d901df6a1faf66cd903a1d08debbe88e3b8b1a8"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (74, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m-bM.-awLU6aXo+zn?8|P;TM=YJKtITe!+6ld$+9*#5*cU1J<+od|7KI4g3E3=]TDWmD-v=GU?2zd3=&qWJ)e3`PBG+30>C%(3]9$EKb~Whdex2mu4s2=>FoXl>b%Apc9ZI1WeeNxJ>3Blt#*V7}`zyw2Iid#80AgNqT0K#327x64*3p1DW?o=0VYENVjDr({5oNQ4np;3NX^aEX$GC", "s": "c90b93b7c07235fea16da81658cfe497", "oc": "f9c7f856c81f222215537638a9f0e40077ddf35900ae5965a5ba677c00998e588eadb650b9b3a245c5061c722b2c5476577aee66a78441f0"}, {"a": false, "c": "mB^-9-aw_U6a<*hz,?}rajCED5f=-#GT1*3>wLhIkS5CujRR|QNY+p4afSYRGzhxBKRu(<$YG<-@gu=+OF_wtB8QA|boP=&$^#B;pX>>Hoy)SsApcg&X-W(C:x(|pB]t.*(|Hx-<_pv%5WG$VTM{&?eW1V", "s": "3f8a679d04259405596e1517d4e6f2f0", "hm": "f1bcadba74d2b27fb67d1fd421f9bc71"}, {"a": false, "c": "$BTM9+awLUAa<1+zn?~|tVCw=P<7;z5mTYoTdjC*zCq:dpXN-4npH3R_^BEq$sd", "s": "33b409794978234efb7777a76671b344", "oc": "fc6a9cc542834452bce1dcef084b4885cfac09ffa1f30a253a5362cbdf259d8154dec9568bda7fc0a575a6786670c42bd37c9dc159897d5631e69c9fb2cc6fdb"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (75, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "UB7J@a|9cCf{O,s=rU?r{)cv`YbJ>Kt4RJ*8FO2XQIL+Pqd_Ls0AN<&V},KT2G)(?Kb4+x{BxML;Y2+`3<}d,F}4O~cKw}`(-AMjj{+j{1przTpj8<01cdR%(Fa;p{Dh0k9``h_8+PcTs5m{bzNVe4;3X1Kl6lT>AWrE)}M{J-:ozAcGunL7I9)XC6D}WC|g$Z=r{Ufha1nU", "s": "9b936f317177e45472549b30f729c745", "hm": "5867d444a24d5932c2bf5a380e4e0f1d"}, {"a": false, "c": "mubJZK|9c<`{Osnira%Hj)cv`8vu0{|K}S#aw%$k)p?C8#Sc>w6W3J4h>M!|#2`9l@;z:h|YJt>c}Xqd!Z@Nn%D{rQIt~KA&!;ciB%(FX", "s": "d93095652014302ead0ead16ed00c45b", "oc": "ebb7abffc80fbac5a55ebcd2e6ef740fbfd6f2a4c60eb498a0b9679315795969809dcc4a75d310c555b66d07c82a542fa6b5ce64ad8f4bf9"}, {"a": false, "c": ")B}JGA|9c2${OscrravVj|p>}X1.k0%k(`D>K+LbBPE07bZH9SR?ZDg}77,!tjaq#Z1P4K$#OUpa{Kc5L`OM|MrE)*s{J2FozAHDun97D9)DC61}WC4g$^Vr!U$xT1nk", "s": "fd4a6d5601359decada785725b30d9d9", "hm": "ac2857bd7072677ff676160c77f5ac97"}, {"a": false, "c": "9BkJ)3uC8#Iy;w?W+&LhAM!|#26-TLDz=hkLJ?4I4Xqd!ZC+nNGU$get~KA&!;cii%7eX", "s": "33a9eb877818680f955b5bbacfd30a25", "oc": "0bc7a1c6983f24c4bb5ab306a91d91ac09ded309cdae9444f5b47d93a299a16d8e3dfb4fb993a4fd83f46de27b225476a8b5c0ac0d9f41f9"}, {"a": false, "c": "mWbJZA|k+2`{Osn}rY?HSYcv`CS6PEt}Xgli`QijvsCIO?CC[OYdn1OPUo6{hlypAP^@y6gzCaLO`b?xm{tZl?>96vF$h#Vpuh", "s": "541f697de7741277cbb426d905e15fc5", "oc": "da434c6531b3b218d3414e3e5833731282f875094f0322c186ee3668e02de5d68987fcd4c440872f6e41ec0061a7d00eec401798b08a3fbd443a808310238f07"}, {"a": false, "c": "I4Xjd!Z=+%OD{rQI6wK^&h;ciB%7eX", "s": "9d8a004cc47a06544e8f0f1c6a8fb344", "oc": "ac6a9c69384391a821e1dadf5e3ce85b45082f8bed37abaeaf4229b9e220628d7708562a0576b5505802193f74029b61dcc8fd75da4cc41d35c53c02d7f486cf"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (76, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mGbKU&X4.2TUi$:2R1W;[^)-gc;jwP+P;Ky,wh)=nuCzN#T_Wku8ru`4La~V6!NI)iBmpbKU&XiH~Tqi~j2pyJxxj?lY}KV((KRe+1RS>G9=H>`Tn8b$&_I>P&0nb9gDTXaPL3}%y+w6)=@kdzp#2_b4u8rKl[La~V6xNIa1B_+<3$Ygpi2XPyN2B%cTeP6H", "s": "c3b4f987a9cb712f6d54a0bb66351a2b", "oc": "f1cea17bf8102f321553b606a01c242bb7d898a9a6cec445b6da67131594315d0e3d2d0db973ab95c296fd5d74c01b91ad35d063cd9f48bd"}, {"a": false, "c": ":BbKU&X2H2TUi9T2puh", "s": "f66f197550d8e2e5d2243ddff5e0cde1", "oc": "fc6a9ce573b342c9ac54ae87996932bf798e3d893d603031f7ed77d9880f8307d15c134bf4757bed5b572bdbbc761b6c9b57ddb72a9d60129f94180af901593b"}, {"a": false, "c": ".BnPU%X2H2TUi{T2x:m|J!?b?;%2YJ92_Qhgf<$kNd3!8sk>c`5>edm&hAZ_oqHcY^O#&9*hTuM_7Ef~hoElmzZI;5Nm!21Z_C^$z", "s": "9893663108e7845a02c4bc6077895c25", "hm": "3e6751f4ac48cc72900f6a3db44ede16"}, {"a": false, "c": "ZBbLvIGx0`a@Ghosv2oSKl+DV8)6}Y(X`MO#y>csIkdhoIz2V6:}6?%e=1LoGT{A&ww++_^8nB9hg?!9g-kWQNG(kcGCdK2^T7<3nx>$@", "s": "dc0b97b5208c3b1ef3c8b8c6ed0f7cc9", "oc": "ddcbb16fc815066c2e56b20049bf2ab99ad8c3aa566ed6e5c59a37a7159bb9095eb2bc17a92e0340a53a6d6278c0e47b0239c02cdd99e2b8"}, {"a": false, "c": "mB|LWDPx0`a~GhoFvD#.K|+DnLV6EE`!}1mw5-+OD}T`<{zOgocZv0=}b+y|kU$jX*S{WW-pHY!i-2HP^n=gIYsi={C*(,nhBGYlV6AZ_oq,gY^@B#{*Ww!,_7Of|h{>Smz!H;RNP&2kG~Il7z", "s": "29989d562e3fbf00a92e81ab5410de41", "hm": "9a1b5d2dd4deb77f8a451c6fd2cddce3"}, {"a": false, "c": "mBbLWapx0|XGGyPRvD#SK|+DV8)c(L(X9VOZ->csIkT2%[PV|6g}NT%eDmLo#YV6&w,++_q8?s3D*?G9h-vWQNa(``GPHZ2^dtZZnxT$@", "s": "53b937c3771f628f9f9e69de0330aa2b", "oc": "e040a1d0c8162ef02553b0a6a914240bb7f8f38907d5e44ea55a676b3b9b89a3fea6e64aeed31385451069c6ca2571b6ac34c9dbfd9b67fb"}, {"a": false, "c": "mBb1WIPx0`v~UhoFvf#SKD+D;^C%8dBc]]qh8^WMRf!<<<$X@D%aU:7Ldk11oKovsGsxWKcuBCqH#2{_&wlQ+_D8dB3dg?D9m-kM2NH(kcGCHK2iT7Z3nx1|V", "s": "74bef14f8d58dd476a4cb61f6660b3e9", "oc": "f76aef6532b111a0bb03d9e408ca29843ed403e2ca33372f0199d5dfeaa1adfdb9e3120822c3f9206ec2e81aa1b04130fd5d9d514abee592af1ca5d09c500113"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (78, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLU#c4X2W9q||(4h(&;v>K{Y9^67d~Dj:l-UtmtvqFD-r+m|@iIFbJ_Q8g:>L4JxClzZq6;9|zXdH<&H>@%1g;9;1i6[u>!N?>VAeB%YPNh0)fuLx2!#IJ}Ldje%|Tm3t350k.]VzOr1@MjiJH#rF5b0<>{#8>AtMQ%m`ECz*i.%8>90zxkT$^-@!$V&{_*^me1Y~mf^r2", "s": "c4e336815fe7245a521d0b697799c745", "hm": "b767bbd4a8983b62c3c580747d35dfe6"}, {"a": false, "c": "xBbfU1cQ1WW94(544h(&8v|C{8(JXE9w`5O6EpX4M?d`L-dd{8(5Xb?m`5OV4)XL?%yheX-WGqCM&DQuKU6G#r}y8sIC-1kJw^M!Ko0qm5?^;*WiDvh8xf(~(;k4L0WB>", "s": "f8b937a278b72118995b6bbdd3ccbb2b", "oc": "fcc8a12f88e92a3215e3bc1919bf44cbb1d8ed0ac51dc447a540479a149969698e3df64cb94ba155c536cc2f9b2a50686a25bd6ca377adf6"}, {"a": false, "c": "|BbLL)c41$W1[|6[S~(&)v|K{wJt+Y7D@J_et%;5;rHRgV+Kcc-PrUiMy1vhxxAB@YHTJ|A0F?N#V&9b6hJ#Iw|>jjqDPOCH+{LdkD!=Ym?X*y!!_V=puh", "s": "da631e713694e3e0dbb42da424ead068", "oc": "0c3a7c6533b3f219a30b831c9ac06c4823335f01b63137bf0de9876980acf46af92fd0a1598c918cacc2ffb1d8c5769e3ea463330cb5511fc4a9dd467c8bb50f"}, {"a": false, "c": "aBbLU`>4$){9q|6442(&;v|K{6BUWiPXM;%yXp3{R3|wfRRr$P~2}y8sIC-xXJtGM8KXUGm5g^}*Wiz>h8xf(Q(;k`:p+B>", "s": "386a019f9d28304464bcdf2f68b1a54c", "oc": "dc6a9c6333b281a7fbe168b51d5bc983460727c8c61e419f744d2ddc7b363a7b12586b41fd9dd4a7f3028b3f1defe81d0c0975f89af812731440f9694f40d969"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (79, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m-8K;rfe@eKx0|sraI~keT!AcYM9b4|`fY~$D>BF@t{DFHgI0-LESoh1vX`JD2W(wLQ;zT)bJN2)skJVA@4ubVZacQLyPH||aW_ImqPt*e52P2:iJQ>>y6XQ9$7!V+Cselm7(?HK9lde?2?~kkOv6dKy3J-&K^U8ATq1dArOMF>d%|->R}qGo~0)Ggse6tDY?#oCoAT&_@QZ", "s": "9ab3d05f06e7896d52279b697bc9c745", "hm": "8087dd40a847fb321545691ee0ffdf11"}, {"a": false, "c": "m8bK%Ks*BN>DMAwT>I~;ezZAc8kpk%O%q_Hrb@*N+n39dq9A;-?7}&%-ybZ>#2`EK6#$uVu%K@Yw(4C!nfBZrrX%_DQHQ0_4N!j*A;Zia", "s": "a70be72820773efd9673a014e5df6457", "oc": "5bc7a11fc81feae21ed3bc70a94224bb17d8f0c9fcfe248ad57a67031f996b698dadf61a49b38fb535b95d02761e5477ae35ce6c3e7ba4e7"}, {"a": false, "c": "m)b(%Ks*KeKDAAs>RI~UeTZAnLZs%pqE$l&=Czc5Db8f~KI;M4tHX*hBT4+p!con+(@z`M>on8Tl_v!5aqE8+!AP%C%>Vm)wo~}(!gs+_t_Y~4z>oAT&_WMZ", "s": "3a5a5d6601e69520a22e80815d10f511", "hm": "68b75dbbf8c6b75f82eb167ad8fddb67"}, {"a": false, "c": "mBWKdKs*MeKDAAsr>I~keYZA08up9}Of|-ur@@ma$l39d8,l;-u7lUH-<&ZG9{TShz#$7VuHE<$cdKz*AcZia", "s": "f31937875c1861e595f565bf7806a42b", "oc": "0bcd511fc91f2f3411138006a91f23e9d7d8fb29b6aec42438ba47939597ad192eaa46eac1b0a14935fa2df8d75a50d6b6b5c09cee7dabe7"}, {"a": false, "c": "mBbb%Ys*CeKDCAerW#[keTZAcC|fIP%S&cStE#X-SyjqY)6cxE{rAp}*PTs6d0mD}@O?=JADUs`JPN=e5Q4DkOjEYST|$e6r6#3)tTr}0>odR>g15-r:uh", "s": "fa6fc97a46747a404b2c2db185ea66b8", "oc": "ed1af1a723ab125f5340d821f2f57614196c6cd49060e1e1a3dd4a1f90c7efde10fec66b97e8d396f2e7d3b639cef24461ed67eff71e3367b0eb67c9595689f5"}, {"a": false, "c": "mBbK!K]VMeKDUAsr>I|+eTZAc6Lz~_2tKC1%m6`Y-54&aG;cYK!2`$Gv&)<3o#{uVPS7CSPmZ5(!We.hqHX^rCe>f@e%2mNiVMDzH#Xy!{X^>a]aF#h|uXKwBJ{KvJuzW", "s": "d7d58e6320781be780a9a316798ee4aa", "oc": "8377a1f3101fea3119c3bc06a4142d0bb7d8f34676386035a5baa7536599f969be7bf3edb91f414b75486d617b2ad47656e57aabadcedf1b853bf8a08caaf6a9"}, {"a": false, "c": "JBbK(pyr$AQr^XmOIVmOi}IhNL]r=wKvit3>&>-25K#Gf~WPN@_ChzxEWQZTtZHUBA3^P-GzWa(}=`6b9{KDBSco}A!JPD;F|WqVzO6{=fXB?Bp{s!(2dzD!=F+n.}S", "s": "179a555691309dfca92c8d1bf290b251", "hm": "0a7371dd7b12f08c86f51b12ddfb2de4"}, {"a": false, "c": "mBb:(pyr$AQA*XmOIV{!^}Ih>96ceU$9iVP28@M-}:#B<;4;<3{QOj>2{R-q=fog=Yc1{%ou#Z+O(zr7YhC`f{G{([RF=bBK!+x7O>vJ%za", "s": "77b93700141c610f555565bb0357adb5", "oc": "fb25a1111815ba311943bcf6091d9455b71ff379c6a304a5a06b6793999c82bd8cadff4c64d39445c4964802729fc4f61935c66ff80a2a1bc535d84f87fab0a9"}, {"a": false, "c": "mB@K(pyr>A}A}XmiIK$Oi}Ih*Bte;9Ow0lKyBLVmI##N^GXA#da7CrO$-*Bk)4K=lmV1F2Nf=xlYMg<:3^$r[O(zr71hC`>{G{(;#FG+BK!+;7>KvJzHy", "s": "fa8259753f7430e10b2c22dc05eccac8", "oc": "f97a33bc33ea4219a3bdd78565baeb126874dd7d92fbef1b5fa5380a18608eaf715af625cd881bee174d3674c21e1189ac052f7105f140d11a117b6fd016979d"}, {"a": false, "c": "mBbK(pCr$A&ACX{OvVmfiM=hu`nZj}Ff83O>u4I[>^0|1j]kd`uf!:PYMEW?v8$Z+O(Rr7.hU`o{G{(;RF=sBKT+;7JPlcM)X%JZWrbQ0^G?lRn(C?MrHrW!V*=dOHa@T{O}N`.OKpj%d(7ToG@HnO0peLf$zO*^J`xZKSu_jgWY{y@;:|K5qg&!~f=;IcFZ2{b1?)BMCB?1|.j6!A<1h!E%G1Im$!PEl8Nw=uWIUN+EwG+k^(puh", "s": "304a5d56183c9d09a9fe191074901e4d", "hm": "6a077d14e7d1b7ef8625661ad8fbdbe7"}, {"a": false, "c": "_*bL@|Iydc408$;g)1-J#nc&q`wmt`gv>{i^%m{k>KDcv$GK=wdj973J#%Qi#@^fUgO1o_<.zD!={JIp)7P(VzEQU^ztih?m9=BIRR^HJ", "s": "fb295c217d38f59f955b6bbbceaca72b", "oc": "ebc7a4ffc81d9d332353bcd6aa8f24bcbc3123a9c3aef46595b16703859989691027e64b69b3a745f53662d5bb255cf1ae3cced42d959f1b"}, {"a": false, "c": "mBbL@V^%dNKBH$4g)1HJP*cmq>orle`y>I|qoY{u,XP.sSf9Uac|`6906|E6w45xR^b8JjE@slSc`r5e@k$VW}a*;HInYR2jlLOJF~8DaSPGu7TZ!C>ky", "s": "fa6ac9a5e67419ef44242d58005acc28", "oc": "f36a996593bd4b19a960ee2f1dd41049edb8832c89b9eafcd8b1b884f7bd53fce5ee1ebff23663eb53dea25919fff290ad524f69163eb8a3aeece55a503127e5"}, {"a": false, "c": ">BbLJ,<%W]?0W$;g)1-D2Gcml6X;HB3i1jM)H&?Kv?zt?!`p7b#2^fUg<3o_OazD!=,JIS)9B(odhQU^z]Nh?^@>oIR}U{J", "s": "33ea0a4d4d3813456a7ab2c0688cba44", "oc": "fc691fe5ec3079f875b0cf34fc010a054dbbb9a375dd3a14b8992f9df814107ed385c77f7de0f19e29a921c89592ff8dcc4ee52b6c03cd829550029837afe807"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (82, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "fBbp0;2Q%|&hM87#8ZU&1nqH4YP%!<}e}<}}ZZ:HdK=XLlomof+?Yp{E*k1Nxhnq>L3yrQAW[NE0P94`CuT5Y>=jKn)4f>vGEU$|X63ZMIn3~fC&qm2%|*L&Z3UAy,d-IG:fdRJ#2^>O3C^D%oK:UTQ4UMFeLHz-Y6r0s,W%yfAd|!H^d%pW", "s": "d9090bb440b7307e9e7aaab6fd0f5e47", "oc": "fb37c11babff2a331a5bb5a6a91f2439bad8f3a9f6ae86e5a502679315028d5e71fdfeeb8920a445c036ed6273dad426a635ce6c8b9edbaa"}, {"a": false, "c": "mBbKA82~_|&h785#WXU&)yXH4LUIuII#+SZ>%zC@tA;2~0|&h687#W.,&=nqH48w>_ICF,9EtT7^Bh>*L$Z5UaNiRfIG8V(-JM,^>OHCeM%PK##zQ4U>FGLIzfY6Y0ssP%yfZQ~iHbUF$z", "s": "63351b81781e61df955d6bb7c157ed23", "oc": "fec7611fca1f2dd29055750759646b0bb7d4a3a51ca4629515a06436e55989668e1c4666b96df775c5366d825b2b44734630ce6ced9ed1da"}, {"a": false, "c": "mBbKA)2}kN&$G8D#WXU&{&{?jC6`I)f|7H0_i*u!s7%p|PD^%)I3u@>6RXl>DiATEH&%_T`5(M}7si7o+qu}po)2+1TRd8QP-I77mf5KFfe9d!`4YDSpuh", "s": "1c0d38753677e2e9db242dd8c7eae3cc", "oc": "fc694c6503b29219a801ae1c9ce933000e75b83b8d73d1f9bbae7f2b69ec785fd3bed99a73bbd1b58fafdec1b13e1ec9b84c063fec088a34ed04e31236a2f831"}, {"a": false, "c": "m%OKA;)~R|mh787FW|Y&ynqv464PW9$JfaH|2qzg_kiDIEfB$YX2^>&.CqU%oKZ;zQ4a>SeL_z&Y6;0ssQ%HfLd_iH^dF$C", "s": "3bb4564fbd6423466874b716668133f6", "oc": "f6ca9b28b3b341a3b8f6d7eefbfe375d374a925dc4e1c1d40ba8a6bb7b1d18fa85871f30c528fe3a64f062df384733cdfaa1887ab233337808d119f0014e0722"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (83, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m,bJ&Wu,rn?7A$@b(Kn=$?2X*.(w1UcJ`#W{1p(Eq~PZP7^Gu-SL7G*)sN#Y!JpxT_u{4U|mEWp|*!", "s": "d41887b5267d34f786617876ed0aeff7", "oc": "1bc1aa1fa84f3ad99930bc82ac3f2b0b091c28a957d4c44595bd869d108979f98ea1f6ba18c8ab45c526700a7b20b4aaa837ff6ca2ee1bc4"}, {"a": false, "c": "m|bJ&V+<+WNnWTkaHg#;!fpH#L}).dJ>Bv|}<6^}]|QFi`};>UcJ`#&Wwn(Eq{PZP7TGupSL};*)sxrY!JpxT_uu4Ufm#Wd=*!", "s": "f3a030217b2861ff455b6bbbcb3aaaab", "oc": "eb27a14fc8af2a327f5078d749df740bb0d8f3a0c3976455f5bd04933a9e80a77ea2f64545d3f5419a36ad32881f5016a63514646d65db1b"}, {"a": false, "c": "0Bb<1V(<+GN{WTGXHg#Y65M;$B}MUq=EGO9+hInlsgvyB3r>ZUcJngT2*.3OFW2{On(tq.PZK7^Gu3Tj7X*)sE#Y!J{xT_uE4UVmrWp|*!", "s": "37ba00ef4d782a496b7c9615f01bb344", "oc": "406a01b530432213b391d7be0c5cd8d2368c51e951d50618e1b3c466963055a66ad4a33606de0bc111b2be532d3e06f6a1e96014b50ea1a03ce23a54c3d8be49"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (84, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBdMY-aw1U629KED(v)GUg2ud3=NuWJDe3`PbGaW0>C(<3ug5EKbzW)de42114s2=^FoX%Ml%PpcgZX1Wos<-J>3N#tms(|HBa<>9R%5N($VTMP,#uDMV", "s": "9272d79a0feb195d54f79b69f8592d45", "hm": "8243d046abc8ac35e30a6a33354bcf16"}, {"a": false, "c": "m{b=v-awpU69yw23.d#80AgNqT0K#g3$xtY*3p+DW?o6TAYZ0bjgr(d5)NQ&ypp3XzPfnN$QC", "s": "d93b977a2da4309456716472ad0aeba7", "oc": "fcc7a61fcf116a5c15337d56a7b8240bb6f8f34b85aec0455bce57931595a9102ea1f64abcb3a04535566d62dcba5473ac35cde2759fc1fe"}, {"a": false, "c": "pBbMS-awLU6aG?+zn?~|{;lw=Lf=-#wr1A<}w5QWhS5B(jQR|QNYUp4a=SYRGzixBKLS(>$YGm-@6u=+Ok_YtB@Q*|.oP=&$^#6Mc1>9acy)SsAEEg~`EWmCNxJ>3y)t#*(|HBayw2*in#80AgNqT0K#W+H?tREXp+DW?ot0VY(jnsc?(d5,%QxnwH3R?Pa]|$QU", "s": "f3b33191d8186309955b6b4bc337aa25", "oc": "dbc7a11fcf4f2a3eb6c3bbef29612a3ab2bd13a9cda4c145a5da672335e689690e42fc2cd9b3ab03d53366340b737d799285ce7ca6cf21f8"}, {"a": false, "c": "mCbM9-WR%:6ac?Hq=$~S$NZK(pL6GP}{fP3x(`jc#b2a|tx73p&OB?lD:VYE|njtr(d5XNQ4npe3RA^a=n}iC", "s": "3dbe247c4d7413762e7cb71746c1d343", "oc": "3c7a9c65439f46a30ba1178da7cef4e5cd5609c7a0f52a1e5453c2cb5f420341b381d6558b981dc0b3732fd81785c44cbf709522394d4becf3349e94277c4fd0"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (85, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mybJZA,9c2`UOsnraG?Hj)cj`Y[3BKt4RJ*8LO2XuPL+xq=_9s0vN<&V}u}Tbz)(?Kb4SxRBDMa;Y2-`;xSdOUM4OFcKwn(^-AcBj{+Pa1pfzTqjt<01cd^h(Fa;pqD=0k{``h@8OPR,sutAcz$V~*;KX1IV6FnhAWrE)*MnJ-nozAcDDn97I9)DC61}qC49$Z=r!U$ho1nk", "s": "9b98d5a428a7451e521e9ad7c7e4c0d5", "hm": "896fdb349843a492cc035a3dbe3e9316"}, {"a": false, "c": "oBbJ=f|Tc2`vts,rya?H6)ck`8vu0cXK}SSyw%$>)p?C8#My;w6W3&Bh>MG|#2`-TLDz=hvYJq>IGXQdsZ=+nND{r4I{~K|&p;=iB%7eX", "s": "d20b97b5107d71fe861ea0b6efefe4a7", "oc": "7bc7a91fc01fba311483b266c91f030158df20b9f1acd495a5baf782054985698e6d9e4a69b3af45c55663027f2ae47b5665cecca99f4c29"}, {"a": false, "c": "m|BJZ6|9h2|{Osnr}a?6j)cvILjQ)L$p_~llv&x~)p?C)#MONw6Wwx4s_M!|#2`-TLDz=hvY@q>d4$qd!Z=+nND{rQ+t~KA&!;ciB%-eX", "s": "f3493a81b8fd8bb89357bbb4c387aaab", "oc": "f0977d1fef10243216b3be0ea7afe4cdb7def32206aec38aaaba57871596299e5da5f1a879f3084ece366d0879eaa476a065ce9c5d3f91d9"}, {"a": false, "c": "mBbJZ:|9`2`{#snrra?Hj>zv`Lx6PttD3g=irtG$ghCvMg0C@2h#$|07~%i|veChO?QCfOY;nXOPU%y;ZTyDAP^OykgzqaL[zoux{%tM8#>26KWWMhVpuh", "s": "efbf59a23b73af47de96e16a054c53c8", "oc": "f26a9c6533b3424962d7ee9daf354fa231b87bce9701147f561e5b648b2de8dac1a395d6caf5c520db6eed09e21d6f8e384f380b2a84307d443b8261afb29e28"}, {"a": false, "c": "RBbJZA|]l2`{Osnr7UH2q|Vk9g%~lQV4vBL2`XT)Dz=hAYJq9A4Xqd*Z=+|ND{rQIt~K]^!*xwlo7eX", "s": "5c5ad04f4d18730f9e74e79f6231b341", "oc": "f68a966fa3ba4e43b6e1d76c0efcf84ff56856faede7588e4b822ce9ba2a62fe760df4931c3c353b5dae153f7ac395a1a7a6d4de66f7c4f135c2f2277ef38e11"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (86, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&v2H7TUi~T2OP8u9{nC$Yj)bCn3=(jjoxsow8jE-sQBASNTOjoiQRcIBLc){G*fR=,ok2lMK$HbII+qxJ|w}4l.", "s": "9423d6ab01e8548d02149a0066794d45", "hm": "0067ee3dad7fcbe2c5026a33bc3e1ec2"}, {"a": false, "c": "mBbq&&X2l2TUi~T2;1W)&^)-g>TN`P+P;@W!w6K=8.Cz>#2_Xku8_K84Ia~V;xNI)8C_+<7$YPpV2:PyN2B%|ToPRC", "s": "f96a77b5283e30ae367cb116e1cf7fac", "oc": "8b27af39f84f2a32d853b7a6a94f148457b8f7a0ccaec445538ad733b89b49688849f647eab3ac43c61313097b2a24a696353f00bdef453c"}, {"a": false, "c": "RBbqU&XaH2TUi~TU`T*8b`&_I`G&=nd9E;Wn<^)-g>TCwdz!;g^+$[)=8kCzp#2_X6ud||luQax16xNI)i7_+WO$YPfGC_UvA>z5h", "s": "fae291d53929e2e5d7222df8016acacc", "oc": "f2677c67f303421da3368e359ce832ad0276f577986c3811c99d526b9840832700a406fb5075917575b70cdb61d6910c98ba070f0b947de68f9918d115014936"}, {"a": false, "c": "vBbKUlX2H2Tviet2zQnaEr&IQ4C}99BK<1wWy=Z`^``-+G@YMoZn(ME61H?]?o%K}J9f_Qhgfj$2Nd3!6sTzcm5red?ShAZ_oqscYv@J&Q*7Tu^_7Of>hoZ(jhGI15NPx2kH~Q(7x", "s": "54d3b8000f6c465668149b627b29c445", "hm": "de599b341c487b78581575f9be4edf16"}, {"a": false, "c": "mBx0gl`ChVF4D#S8|+DFC){%L>X9%q]->csIkTODI`,V6a}NVEeDmCo#2>_&wl+Y_wkcGwHK2^T7?3nx>$@", "s": "1901975e30dd1e638fbc8820ddcc5420", "oc": "f5d7a554285f2cd2c153b5d6b9fb280b1c08f3fe66afc48557ba8d90a5a7806509a1f63239694947c9326b02bcc8f4c6bebbce61ad9f746b"}, {"a": false, "c": "OBbLWI#P0Ma~G8oFvj#7K|XDVLVl;Dd!}1mw{-2>Qm|%.N,ADP#`={zO|{cAx2=xb>ct(AxAX*MQWhepHFGi-2HPPn-gI!s=H{#*(WKhBG;ZV7dZvoqHcL^~k&Q*h`P^_7OfVhoGlm)GI95NR!NkG~rl7z", "s": "3a9a5d580556cd0fe32ed74f5430e4d1", "hm": "fa27a4b8d8deb672a975761adde2db27"}, {"a": false, "c": "mhbHWAOx0`a~GhcMv]bSK|+4V85c(L(X9Vlw-ScsIkThUI`VV6a}NV%R}mLF#Q{@4^l++_w8&B3hgq%9g-kWQN%ekcGCHv2X}7Z3(H>at", "s": "f3bed70b881db70e9fd46db23337aa25", "oc": "fbc7e911c81fba9ba503a40699962f0cb4d8febec6aec26dd5ca19f4b26c89798da8f62ab1421b35c538036e7bf0e456a5351a5caecfe2bb"}, {"a": false, "c": "oI.?WIP10`a~Gh4-z8#SK|+DVBC38E*C3cT01X>O^|eqR8]WMRfsmwr$X@L%aU(5L~kQQ9mL{ch<+S@fHh)3(autVMP=AF?HN8kJ@%5VTq?_}=XM;4wpuh", "s": "fa6e9165b67732927b2aebd8e5a8c9c6", "oc": "4c684c6577b3460ea383891f526a918ab347ac2cde696844dd111d7fca3be0c95d335fd2befd5876ea1bb94408dfd59fd09d74b6f64c98c2450c4251350685e8"}, {"a": false, "c": "nBbLW:Px0`aiMhoOv}#SK|+UV6HNM%E^1]oJAvsVs5VKcu2`pS#2{R&>l!4_n8yq3hg?v9g7d*Q;G(k}]EHt2^T7Z3nx|$Y", "s": "3db20f4247c89481657d77b166842644", "oc": "fc7a91c593b341f3e0e1d74108cae48be8d90602f2b8873800e93de5e10b4d12d864035ce873f0e068c7efda917dc931fb576d9149666492250ccd851f730113"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (88, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb9U@c4o)WBq|644~(&;d_+{Y{^Gzd5DAlM->Pmt&J><-->.||bIiPJ_38g6>L4J<.AzZqgr-~[:CHw}=8x%Qg;jo1i6a=>!NvDVA1BFBPNh0)fUgx(>VIJTLZj5%|Tm3J3J;^4GVz)R1@HOfJ+#rF5b0Af3Q%t+bCz*iE!8Q=~`akx$5Vh9$Vzmm*!m}>YEm>!82", "s": "7493d40f8fe7785d521d2063772acd45", "hm": "a161ab44a743ab32838b6a244445dfa6"}, {"a": false, "c": "mBbLU7c44)W+q`64`h(&;>|Kw.(5Xe9mq#OZ42X@9@y0eX-WGqH8&D|uvUEG#2Ly8{Iq-1LZ", "s": "c90e97a52f7d32fe89fea916edbfa3a7", "oc": "fbc7f116ce1f2a325553cca6ab1f744bb6d8d37cc2bddda5af0d64c30c9989690ea8f64ab32feb4bfec68d027b2e5dd3a5c5c661fea7a9e3"}, {"a": false, "c": "lBbLUccZ1)W9q|644h(>0@|K{LTk1A!FTL`ci*@EIA)yZWEpWn~SNI;N9`O-dc<1;`}>tm3Q%w*yMQ%t`tCz*in%8Q=~zakT$5-;v$Vz8_*^me1YEm>!82", "s": "3e9a6d599136bf0b1d2585b1549bf2f1", "hm": "1ab7579d76f2f77f83764653d4eda4e7"}, {"a": false, "c": "mBVLUp-WGeH8_hwWvUEG22s_8s2C-t+JwGMEK{U%=5?^5*Wixvh8xUq93;N;{p+B>", "s": "731a378d3b25e1ef985e6bbf29f76e2b", "oc": "fc4da5dd481b25f7e370ce06c91adbbbd746f986f4adc37575bad793a5098f1b8ea1264ab98ba3c6c5366d02743a5278d6353f8c5e7899e8"}, {"a": false, "c": "p[mLi1c41)<9qrlN4w(&;v%KNm`tAY>D@4*eh%C5;rHRnQ+K)xfTvUiIy!vhxx%(@YLIJ|V0jzqKPOjLmYLmkDG=Y&?X*Nfx_V=ouh", "s": "fe6f297fafd4eee03b2926cb08ea01c8", "oc": "f180bcd536b4121993a698cc9dceac485501f161563b37992db86a9fd0aec440473e0090e638711a7bdaf9bc7db5cdae1ef313334c5a5817c6a9e746ecc7552d"}, {"a": false, "c": "mBbLU7cG1)_9q|644h(&hv;Ks6ZNWiJX2;%@XpRvRZ|w$R{rQP}#}o8sIT-1(JwinxK|UGB5?^5*WN7vc8x:(&(;(`{n>B>", "s": "3db7704c4d18c9a4233727669681ce24", "oc": "8c6a924513b7c7e067d1d82c69cc398122b457e446ea51ff36adbde86b1e3acb52bd7b41f796cc07f3a32e6f9e97f81d0f3073b73e7873f31654f7913d211ea9"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (89, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "=BWKV!s*MeKH@AsrBI~ke_ZAcYM9b4|8fb~$U>=F@t1DFHgI0-u|S:h1vPUJD2WC*L&{zTJbJP2)s~oBF-)u9FZ$cQ,3PHK6q{_ImAHt&L_uPLiiQQ>>yrXQ|$79k+Ysetm7#?!K9l}eD+Ir7kS%6RKy3qG|*^U8AU<1QArOMY>P%C%3Rmm|o~0(]gse6t*YrqzuoJT(_keZ", "s": "949adc110fe9845d521f91197c2b2747", "hm": "8f02db944a33ab30c7f56ad44e4edfc6"}, {"a": false, "c": "rdbK}7s>#eDD4AtrIvkeTZ@c;Zs=pqdkl0=C-c5DkI7~KuqD4tHX*hf84+pncok}(@z(M>ondrCKv!5}%!P=7j<[d_F)I<906BVUj;_FdkW7GAUl1d5rvMv>s%{%hRmq|o~0(Ggse6t_pr&zu[A*&3@WZ", "s": "2a9a52553f366400a9d8f519a4707deb", "hm": "69be5dbf7f0277705475121ad5fbd8e7"}, {"a": false, "c": "mBbK%K^*M8KDAAsrvd~k;TOAcl$pk%O%q$Brm@mNhn3$d89];-u7lTA-.b>1#2`Ehz#$NVu#s>tTrF*5W!RJ6K5-ip(h", "s": "fa3f13753a7452a0d8245dda05eafac9", "oc": "f36c7c6533bc41eaa302dab451727029f95e6c16b00fe6efb8ddea7fc0fb0fd9d73c922f9cbe0bebdfe722bf17a72d4660683f5f676ef163bf6bb312f01a6c55"}, {"a": false, "c": "mBbK%KskMeKDAAc)>R~keTdncQGzJ_22{(1~~e`x-S4MPGFcYK#gSRhz#$^Vu<((xwB4C!AOBm3rG%_DCH2C$cd!z*ANZ.a", "s": "7ddd224c4defa0fbee78bd1ff851b34d", "oc": "fc7a9c650d0b4633b1e57e7c495c406a8ab2ea30f93d794c75d1239930358b42e53ff3afa624e41dca63dc771576f9fc250f2124eb72e6c2e77eab1b8e562cf5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (90, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "FBbK(pyr$LQACXmO-VAOi}I+ud%r2+e<@#ps|NXxR`iT!ondWDle#e%BR$Gk&))@eED;t:shDEz2X(kHX^>ataF#h<{XNw|J^DuMlCR[X{4@y_Zk=h|NFVvJIzV", "s": "990b9e77207d30fe9504a8168d1f8ba7", "oc": "ee57b51fcd6fda30e55c0e46942a4705b7d8f820c453c445acba6793f55982698ebf155ab9b9bc1cc5386e727bb15476a625cefca59b5dade551686e87c3b379"}, {"a": false, "c": "m38K(H-p$AQACjmO!GmOK}ILuLk>=wKvutTn15Q2HK9Gf9WP-@uChztE~QZTNZ)nMA3^P-dzWmWT=`&l9??DB2co~d!JgDzI*K|{%%14O{WxpHAX#dc{GvREk;F|P6Vz*6{=2XB?_pGye(2dzD^[L+nM}u", "s": "6a374d2661d69e61c98a2d1b26c0addd", "hm": "6bba6dd878d2fe1f82f516ca68f5dbf2"}, {"a": false, "c": "?JbKw}yF$AQxCXmOIVmOi_Ihu9%,eUg9XV?28*M-ta#B*;b-q{WFOjd2ER8q=f)z<{|5hk>Ho>^0_=jm+?`ufLlzYf1<wvJ%zy", "s": "3db343bf4d182346f179ee146681b64f", "oc": "7c689cf53173f1a3bbf4db334956d2846ca2376a2542e305b067bffd3d0b7bad8cf81389bcdccb84b6b91bf472bf89de77058238f403c5d0767b614fc05244f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (91, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "by;?@A^%dN?DW$;g)1-JP*|moX5JhW0Z;Z^G?lb`$CfXJH|W!Vu=;aNabz{yfN`4bLx,^%dN?9($;g!1VHPvc|q8w!tsgI>IMa5qEVEjR-wcOWau*19TKGqhNSjAja?zC`)B9eBK8:G^i!A<1h!EIRjI5$YIE}thw=uu7U|IEwG+kh(puh", "s": "fbaa555a71a09d00b12ee1b5549032d1", "hm": "6abe53b7fcc2397f86c866cad18d5ee7"}, {"a": false, "c": ">BcL|w^%dN?NW1;v_1-JP*cs$8w1tagIuRD^0s{k=Kwcv$GK=wsj9G3J#%S}#2^WUgv$o_})QD!zoJISE7t(^>E}U^zt:`?U@=oINR^9M", "s": "f3c63a7d76e76ae493576bbba3d70576", "oc": "3bc741efc811ca228bc3b3f2ab1a240f5cd5f6a9cb4e3342a5306c531599b9d95ebdf64a89b3ab0635c66d027bdf5476f6397666adfeaabb"}, {"a": false, "c": "NBp0~V^%df?0W$;g)v-JP*cm|Bor$1CM@b2Co:{uy2WYz&._|PhtW|OZ5Bby<_1V(JZD#piCfmE5R8der4qZ}xLrg)%2A0{.x??A>lfCrqAE6Y", "s": "989396d10fe7845d52670767b758a145", "hm": "80a7dbfe58481c32cf056a7d4e8cd3be"}, {"a": false, "c": "mBbKA;2~B94Eq87UWXU&=nqH{azV.j^Fn9E$Tx,Bh>*q$ZigqiidiCTC^U%Ec#UzQ4U>FeL_*-39:0ssP@yfAd|i]#dF$L", "s": "733bc7b5f07f8013467c7e160d0ff417", "oc": "fb97419f881f8ac11553b156a91f54092788f378c2afc846a59e6e9a559f391ca8ed4b4ab9b98b49d53dcb127b235476a637c05cf59ed1c7"}, {"a": false, "c": "mBbKe;2~2|&h-[7#SXU&?1qH4LKI%yI=~S&7%7r@cMkI#>|`Y@g%ms2dHPn9usdf8Jt{6L@OO2~WJfmaOOLdS)vab3)Ar#-iskmE)]{dE?4qZ}xLXgnqbA0{I^??ZMlfCexAE3T", "s": "39530dc104269da7a92a83105490f2d1", "hm": "3a674bbd18d27771f955d6fad82dd0ea"}, {"a": false, "c": "mBFKy%2~_|rYu#7#WX.&@[q4|8zLF~Ogr^U%oK#FzQ4^>F|X_z]n6hkrsP%ZfAd|iHbdF$}", "s": "f39830a14818618f9c5ebb46c3a7fa7b", "oc": "c1c76b1f187f3c328473bc23a5272606b70af3d96caef4fda4039893a98b49698ee7f6aabf134745ca356d183b2a66d25f35ced26d9ed07a"}, {"a": false, "c": "mBbKA;2!.W&D787#WeU&=eGH4C6`I)gs7r0_9UM!sI%p:;D^%)I,u@>L<>l>D^FTEH|X_Tg5(j}7si7c+p;}OIBYA4T%S8QPdIB@[f5KFfO;d!z4Y`&puh", "s": "ca6f9cf536b4eecabbc125d8e58778ca", "oc": "f96a9c653370421a79018e108ca9530c0e254bbecd934fd408ae3ec7646dd85f78d149aa4ab2d1788dec015225c63eaae8c90e7f5b391a9fd5a4e6b094a2f131"}, {"a": false, "c": "mBbKA;2~_|Rh7%9j<@U&=WqH46K:n9$]3a=Erqz~_k{nUGnBKL#2^>OgC5U%oKH8zQ(U]2eL_z9Y6r(s&PO~fAd|iH^&l$U", "s": "ddb500bb4dd82314ae3cc25f0119b377", "oc": "f4659c6a83bb31665be177bffb2cd447e7ec908dad8e21d39fefd0be7bfefcc881171fb044f269bb2477a34e30b24177a585527a3f4837d808f1129090592262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (93, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "qBbz&V:<+WNnWT6aHk#Y!CMH#YZj70!zt-6po5#C-8ZJAmrn?7W$@`(u>=$?2X9e>iX]icgIXVb&LAX}nz|H9gB(Ma8]H9S^s-3-sUN*eIcs~QstkH-qucc8!", "s": "9d90f61f0c07848452199b65772bc745", "hm": "5017dbd41ce88b58c31c263abead0f16"}, {"a": false, "c": "m^bJ]p8<6WNnWcdaH7#YUGMH#8-2M231ayoCQIz,v,n{6^UisQSiZz>=U$A`#24On(B*~PZP(^GutSLrc*)%NOY!JVtT_uu4UBmrWp)*!", "s": "d93b97b5cf8d30fe8676a016eaaf43a7", "oc": "1b67afafc80f2a325520b206b91f4e00ecfff6afa7aecc45b592626715da54608e38f24bbb84f175c34f69649b2a2473a6f5996c4d930859"}, {"a": false, "c": "mBbJ&{A<+WNn|TyaHg#Y!C>H#Li)6)AJ-LZZ:|,l`ZstDT&vE}P=yV1m1M9YuMJisIN8Co26Tz3Ee-,74C_&j_qYuf|Fv>DrJi2+x_=dy9RUxd4X]+z|H9gB(Ma8~H!SgKJ3-rQ:V`I=si!1*k&]quc38(", "s": "f7525d56033695b0a056891b5390d2d1", "hm": "6ab45d5d24e2b78f5115f61ddf64d957"}, {"a": false, "c": "NBbJ&~G<[W,nWTGaNH#Y[CyH#8={M2318Y!GQIzTv#n<6^Uo7lSUmz>1UcJX#t,On([q~PZP7^G]{SW#X*)sd#{!nbK*_u14UfmrIp|*@", "s": "c3b9358168186b2f95572babc330a22b", "oc": "fb67a1a3c61823fa9564b625af0d74e9bac833b96f6ec925d5b067dc2599296c81a9f405b0c3aeb5df766de245213176a605c0ecadcc77cb"}, {"a": false, "c": "mBb=bV+rCtzSVTGaHg#Y4{wH#BrMUqDEG>#$|IF8zd|_#V|4>I+EsdWf9u+dk5", "s": "33ba094f40ace3498a77f7dc2281c3d4", "oc": "f36dec61a3034da0bfe1c7d9ecc0d4a2368579e9515e16a83ce5c648960175a36a623b5ecdaa5fcd3623be2e5d6d9378f1fa7d58550e79b4d9eb38aa47d81f8d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (94, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbM9-aiLU6aYgjMR=?TDW<3UCviETi&Zf%cZvOtc%?;Z|u9v3Pmt~_DuED(v)GUd2zdT=NqWJ)CI.PrGa30>C%FoX@Mn$ApcgZXfW&C,xJf3Bl", "s": "a49cdd624f178d5322fb3d89b76cd7e5", "hm": "8be7d034a877ab92c3c35acdda4ed916"}, {"a": false, "c": "0Bb6-d^wLU6aE?+zn?Mea;7w=8<4;V5mTYoT7@A*zfZ]CwV*id#80LgNqTm6A3^KxtY*5p+DK?otD]YEj+|Dr(d5XIQ4npHjb?^aHq$QC", "s": "d807e7f68456a0e5861cf2f6950d36a7", "oc": "7257a61feb1f2a8d156d3c4da9b62b0bb71834f9bfabcea58da567aa8599895d3eedf64ab4b3af4e1db33d0f8bcaf476d6351261af2141f8"}, {"a": false, "c": "mBbM9#az?U6awLQJTS5Kaj8R|QNY+<4aeSYR%zixBKRP(>$YGI-@6I=+OF8wtB8QA|boP}&]^#B;c1>9aoy)}I]rcgZXQ1mCNlE>3B8t,*(|H*a=8tY*3pEDW?Zt0VYEjnvD|(d5XNQnsmH3Rh^aEq$QC", "s": "b3be378ecd8830bf4c5b5b14b3075bd2", "oc": "9bc1ec4cc61f28aa1553b6cca98f2b9bb7d3ba785fae8f45a5b367de151bf95b15bdf645f9bdab47c53f6d08799a54f6a035c3944d824f98"}, {"a": false, "c": "[sbM9-LwLU6{>?+z-?GZaGC8=B_nhfii0k65R*Tx*b&U}T|6{xM^sb5mJox_O])V;tvo_(]!>U^Hqr$`^$NZI=pL3{wc|1uh", "s": "fa1f5b593674e2e0d08423d805d9cacd", "oc": "f56a9f651cb34019a3048ebb92cd862f98c1f86d6b3ffcd18b150c1183da6a6ddbdb88b9f4d5dd46b31dcf9a9130f3492efdb18eb0f27e815c7768a71a6a43bc"}, {"a": false, "c": "iBbM9-awLU6aKt4RJ*_L>2GQ8)TtqdP9s0vn<&{}uyTbz`^*-b5+5rBxMa*Y2+`OxSdOB}4O~cK9nT(-kcBj{ej{1przTWjtztEcd<*(FU;pB{=e>9``M@8O*cTs5ttbz$Ve*[3b-UV6Fn,H;r5)*M{J-no3>cDun97IA)!CA1}WC4g$Z1r!m$ao1nk", "s": "b443d6010fe784ad5ee09b69c7f70ec9", "hm": "8767db44d84e8b9cbdf06d3dbe4a5412"}, {"a": false, "c": "-grJZA|yc2`IBsnrrZCMj)c``XVu0LXK}SSdw%$>)p?#A#zs6w6W3+4C>d!|#2`VBLhe=h+YAG>I4Xqd!xE[nND{fQIt~hA&!;ciB%7eX", "s": "d90bd7b02989305e862cef16c70246a7", "oc": "dbc9a1afc5172032d5531606a91c440fb738f3e9ceaecf55606a1793569989988e82f64fb9b13b65c5662b0279d954769bc80d9c1dff8c99"}, {"a": false, "c": "@BfJZT|9c2`{Osnkfa?Hj1cv`L5Q)X$pO~llv&x~1un97I9)Drd1};Csg$Z=yEsXhoEnQ", "s": "b5685d5681469006e92d351a6047f1bc", "hm": "6ab05ebd78d7d1a3867ee64dd865dfef"}, {"a": false, "c": "mBbJ5Ad9c2`{O6nr(a?Hjqcv^8v30{XK}Moyw%2>,7??8#M!ow6W9&43>M!|#2`.TLDzBheYJqrI4XpdLZ=wwND{rQIt~KAPa;etBg7eX", "s": "f279378178c8b50ff5556abbc337aae4", "oc": "8d0b0e1fc85ffa321573bc1e9b1f740bb866f4aafcaec445b5b1a7835b9b88e9f5a9419afab31c45c535b0d2164dd4768635e88fa59f919c"}, {"a": false, "c": ")j>JQA,9G2`dOsn=raE>-)Cv`C06HtCTegyixZG$zwCvMO0C@BhC$|0>v%ijveBh_?CCfSY;n*O@U[3ihTy[uPJ~VB6zCaLT`=uxy{tMm0>96vFWMxVpuh", "s": "f240e7bb977f5ee1df242bd9c5eac4e8", "oc": "6cba902382b74213a3c77f83e3df4aa7820179ce490722c0e6c23f66482de80685b695d8c0f537d8dba4ed0a48cdb88a764e32a3838c4f7da23f88f1a9c28127"}, {"a": false, "c": "mBbJZ)|9%2`{TpnrrajHjxqv`6Uwvt#c7lH2qnVZzg%IeXV4vB#yf-7LDz=hvC%x>+GXqR!Z=+oND{rQIt~KZ0!SciBe7en", "s": "3dc7f0d42d782147ce74b71d2784d344", "oc": "f394ec65336341a3bba1d77fd7ed9835f558c618b347a88ed44b2b393a8aacfae708603a9c76853853da69bf77dd955146482d3eda49c8f13fcc03ff0ac486e4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (96, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK?&X2]lTUi~T2<5lc-!%C$YUqg#f3=6jQU;xo)82E?(oXoCX~*mHHT.vYlpDcUK{PMe}mP`?6{?_F4F=IO(|}8SnlPv$#()N|5:_uQXN8B>xo}~g(F;B5G9PQLX7Yeb.i)VN*#W[&f|lA3LzuAAEZuR,]>sQBASNTojoxQ_R`BLc)~]*}R<_{|Q(MKWHbIITUJ~T2;1WVZ^)lg>T:wP+P;@y+w6)=81CzpL2_Xuu8rKn4Lf$V6xQT*iB_+;1W.<^)jg>!jw2+P;@0+w6T=8+Czp#|lXCu8r!l~La~V|xEI)i>j+wpH2TUb~T2puh", "s": "456f9975367a22e6db2495d7050cc0c8", "oc": "f36aec6553b3d519a8918e1a9c48d2bd1bf1ff25bdf0f03828ed89dd9903d00aae6c13f6a0769bedd2dd21db6c464b2cdbaaa50b08ad6de84f9418010a06593f"}, {"a": false, "c": "mBby|&X222EU>~c2}d8c9nQ}$6IRtUdBy-A|ER;&;^Bjo|`%nN#2_Xjv8rKl4LabV6xNI)7B_+<(CYPok2XPAN^B%cTelaS", "s": "31b7a040452aea046c7cb5866681b34d", "oc": "031ed6d55bb34b73b0cfd7de78cf54e7c2427115742a52ab811a85061b0dd33e5b8d209c858cdb1434e83a7095da009e3f598fb5e02a5fcc63e0447c7d583b62"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (97, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLWIPx0`a~9hoFvW#SK|+DVYWwCgQ#gCHCZYT_J$%#G*?be(fd9*jT0bMGNjz(ba`9*-nQ)h~h^?WnW{r&qQ4,}9S}X}`w@y=L<PMI61!gk?c%vqJ9z_Qhgs8$2Nd3!8Ykzc`48?p?V%JZ_oqHcY^@W&QPh?u^p`OfPhoEl<`GS;^Nq!2cG~r#7z", "s": "94f0de011ff7845d6d149b697708cd85", "hm": "8067454cd842ab32c8653a5dbe5e1a19"}, {"a": false, "c": "|BbLWI8>0utoJhoF?DxOK|GD$8)c(L(X9VOZ>>c:I|T$[", "s": "021697b510ad2afe86de7319b80be8b7", "oc": "fbc6a1ccc81f28a29653bc00a91f244bb7b7f6a9c64ed14fa5f76d93179c8a698fa2f6afb9030b4bcc366d027b2a607056c54e7cadef4232"}, {"a": false, "c": "mBbLWI~x0`a~GhoFvD#JK|FD7;5lN+d!}1mx(-k*Q)S48N4ODJc`={zNd|c4!Q=FbZyt(ATAX]$TWW-pi1#i7yHPRn0gIQsiH{C*(7KQBGSgQ6AZ_oqHcY^@#CQ*hTut_7Of|n$El>zGI;5kP^2kG~rl7z", "s": "389a50e201399d03ac20850b9b902071", "hm": "bfb7b1b37822b9f6865d9a1a1afb47e7"}, {"a": false, "c": "mB2LWIP|diV~GhoFv<[S)|+DV8.c(>(X977ga>csIkTh9I`VV6a5NV%eDm}o#*{_&il++_w>><3hg?v9g-kWQ~Gp2cGCHK25ELZ3F!>$2", "s": "81b9375e721861f1955b6ba10361ac18", "oc": "fbf74116181f2ab205c04c06a81124025728f3a9c6fecc05a54a6facb593946a8657eb4bb9b2b245c5366d527b7054dfa635c26ca42586fb"}, {"a": false, "c": "m]bLWICx0`a~GhodvD#NK|jDVCCe8R*C3LA0=F>OEfeqR*^WMR$qewr$X@DRaU(5L%BQQ>)o{c{W_K@=O#)NpautVMf=el?HNakJO%{]Tq?1}c|M;$@", "s": "3dda90609478430e6e7c272f6e8ab3ef", "oc": "0cda9c6535f44113bbe1deef98c424ea8869094fc587e7ba789911e5c1aefceabed41e0cf8c9fa606852a81ab1c34a31f3cd4d110d7a3b94b510aa76914321f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (98, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL$JxrAzOqg;J~zXC)w&~>@v,Bgjo4i6*7>ZN~DVAer%BPNh02.Ugx(>_IJTRdpe%_X]oT3X0kaPVMp;1@H}cJHK}S5b*^fMQ_I`tCQ2BEP8Q={zw-T$5-4E$Vz8dN>me1YEm>t`2", "s": "6991d1010f678e5d5214e069d029cc65", "hm": "e20fdb3ea7698dc2c6056cbd1e4edf96"}, {"a": false, "c": "mBbLU#?41)V,M|w4Uh(o9v|k{8(5Xe9m`yOB4)X$??zyex{W}q{8&D2u~UoG#29i[sjC-1!JDDMcK{UGp5f_52Wi:ve8x3Ws(;*f{p+B?", "s": "d99b9db5ba7d60fe867c948fedafe4a7", "oc": "f4c7a15ac31fca9b15a0bc66e97e2d3bb458f3a81650a440a2ba6d2e9c9a75698eadf69a66deab4545366d822b2a5470a636c76ca877a9e6"}, {"a": false, "c": "mBbLU1c,1)n9qU64(h(x;v|K{LT>11!228`p%*R*I[xKZW6p&PvSLZzk9`O-dc9m`5DZ4pXL??yee6-}wqH8&,~uv.EG:[nA8sI851+%wGMEIYUGm5,^[*Wi*vh8x-?9(Dko{p+B7", "s": "fbbf3c547816fc0fe1ab6bbbca37f0bb", "oc": "8677317fb81f2a425003ac75a9292a01c7d8b7e9edaec418756967bd1599d92a87adf44d39c3ab75c536fdd24b2a0436d435ce25e477a9e6"}, {"a": false, "c": "mBdLU1l41]J9q|644?(&;Z|J{BltAY7o@4_e}%C5WrHSnf+K)h1PvUi|y1vh9x%(@AH0J|U0^6NpV<>b6hf#IO|>j}q(P|kHwK&&kDG=Y&tX*yf!_V=puh", "s": "faaf99753636d2addb742dd405cecac9", "oc": "fc670c65fbb392112c511c199dca1c5423035351d63d37e2006b8f65d0a5649e532ec62b262c818c2574ffbc7975c5be3e03c634415f981bc6a9e9b67c8bb545"}, {"a": false, "c": "mBsLU1c41)W1qm64wh(%;v|U{}BU", "s": "3dfae04f4c78eb14b87cb21ccb8113d4", "oc": "fcfa9c65f3b651a3b1d7683c695c4ad1cbb752f846165191b5ad8db6e9c77a1bd363db41f1f4cc07db6a28311defec2da41895f7cc9847e3a626952b3dd0d139"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (99, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBUK%Ks*MeKDA+sccI~&eTRAcYL(b4(!fb~$D>=.@t{DQHkF)-uE?oh&ZX`JDFW}wLL0vT?~>N2-s~oyF-)ubVjacQm3rXK6aW_Imq>t*L5ue2iiJM>>yrXQG$79k+Csetm7#?H}9lre?1IWkkOaRdKy3qc&U^U),%C%:Rhq|o~QI)g,e3t_Yr4zuuAJ&_><<", "s": "ff9bd51129e7a45d76189b44778bc7f5", "hm": "8c6afb44ae48abe2830569ad0e4e4fdf"}, {"a": false, "c": "mBbKjqs*MHKIA}sGSlck{T}|c8$p9%O%q$u>mLmK+n@.d3]A6-&7l&A-JbZG#28Er{#$NVutA%_DCHE0$cdoz*ANZia", "s": "e60b57b5909d307e8d21a856ed08e411", "oc": "fdcba11ec60f3482c5531c66491f290b178cf5a6caebd445a4ba6193159884698ea3190ae903a878253660419b255c26c795ae65a377f1e7"}, {"a": false, "c": "mB88%8s(MeKDAAsW>E~keTJA>sZs-on8M~Wv!KK%!P+7AK~d_F4<<9~6YVU~xuFukWkGAUq1uY|OMFW?%C%>RmqDo~0(Gg:u6t_Yr4zuZAE&.@Kf", "s": "37d7ed5b41339f00a9a7850b5420d2d6", "hm": "6337cdb87732276fc67516ba681d2be7"}, {"a": false, "c": "1AbK%KsXvenDAAsk>I~keTZAe8]p9%R%qfurm@mN+n39dr94;-u7l&A#B~89#H+EDz#$:VyI~keTZAHC4fIJVQ;nOaEFXySyI+keT!wcKGz~_22KHOk~e`Y-54w4G;c*K#2`EhzX$NVu", "s": "3dba0a594d483f4e607bb71f468931c4", "oc": "ff6aac9433534118bae01b3c45506a709f979830f98319d47341fcb443228b2a583ff5774020b647ca14da44e57ba909290fc9bae922e408017e2b58b253a790"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (100, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mutKJbyr$AQACXjOo.mO&}IhVY%De&eY}apWAIX%]sOT!~ndADl;Pe%BRFGv&)fHeP>;Wis0D4H2`yCHX^>Fz7F#ho{G{(!RF=RB~!+;7pKvJ%zy", "s": "9f13ac0164e0245d5211d2291729ca7f", "hm": "8097da44a8485e33ce556834befedf12"}, {"a": false, "c": "mB}|1pyr$AQACX{WIVmOM}ICu.6cexg9XG?28@M-}z%f_;^6<}SJOjd2I|8q=fogcYM1|Xv^z9LO(z-+YhCDo{GfT;R+pbB@!+;s:KkJ%ry", "s": "d00797b2907d30d0867cb81aed6ee4a7", "oc": "fbc8a7bfcfabea52b553bc06a1cf240b5768c389c6aec69505be3b83954989658ea9f66aec53a945c7346052685d21a686d5c861ae4eddabeb3aee4f827abfd9"}, {"a": false, "c": "mBbK,py&$bQACXmOIVm{i}Ih;AJr=wK[itTh1.T2HK9Gf9WP-2EpzzZ2?QZ|t#P5BA`^P-Gzqm8T=`6b9Y?DBGcW}g!Jg8pI<_|3}zOGK{0ypHAX$BK{G7TY?hF|WtVz*6:=fXBA_VGy0(2>zK!=L+>:fi", "s": "3e9af48e09360890592e8d1b5497d2d1", "hm": "67b346bf78d9591e86f5b2fab92d90e7"}, {"a": false, "c": "mBb=*pyr$AFACL%OIVjoiGI.u}6ceU@9XV?28@M-oz#Br;{1<3lFODd2ER8q=fogWYM1![J%zy", "s": "f485378e9816693f8a0b3bb978fea3cb", "oc": "0907a4afca793a331503bc06dadff49bb7d86364c6aec645a59ae29c159b89698e1df6414db34255c5986d725c1954760e371ec1054e8a72ef5bd83f87aab4a0"}, {"a": false, "c": "mBbK(p]r$AQACXm>Uvm7iUIh@?te;>g#3v{yBL-0I##N^G1A#daWCrO$Z*Bk)0KXlmV1F2cfnrBYM1KlJ%Ly", "s": "ff6a997d3904e740db9a27d80f5adac8", "oc": "fc6b06a533b3e218ac0057f365be1622f534d77653fb441ab56680aa6de181ad97865c21b2cdcea438921144f4a92e8727422976089f622b3a61bd6c4265b5df"}, {"a": false, "c": "mBbKFpS+$AQACXmIIVmOi^Ih@6n`j}F|83OX$4Ho9^0_=jmcM`uf!<(YE1eKvXJSy", "s": "954a646f4d742344ae7cb7ffe681b344", "oc": "fcca9cc533b341a14ee1703d4dd2d2349a9a70ece3623c01080383cd018b84cd3ae819d51f9e20bc46bc524e1a79c1907107160864d1b110bb71eb41a0905010"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (101, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@%JgdN?=W$_g)-(EX*cmtpM>hW0ZK{DG?l)n!CfXJn|W!V*=irNagz{O(<`tYawl|nhWcM9UBX4.`+IOwJ?prgXL7TGG`HWORLeL^$zO*(|?17KRuY0gW#{2OVm9Rf2rNIo9ZQCgD.t$F:cd{I_cW7lj+}~6@f$Yj6;A<1C!b%%1Iy$YIE}{D^ms{k=Pw*v$GK=xXj[73J#%Q9#2UfU}=Xe_OazD!=oJIS)7*(*ujQM^Pt9h?fk`oIRR90J", "s": "190b67b322dd30de6612a81baedfe4a7", "oc": "f1c7a11fe38a2a322f5396f6c998240bb798fb49d1dec0b5e5ba6793d55989698ead3cada913acb5ca03eda60b0b5f7633352e6e7d9ad6eb"}, {"a": false, "c": "mB{xtV^%8}+%W3;gw1->PbOmqK@;r|K,qTwY#f=&-DFP2#bTjw!2&uT?MQ1vb$M{qdKe&)-MbBqGVEjZofU)Wa-*19:~GAh_)rAjaA%ClgB&CB4S$EP6!a<9hSR!%1#5xwEEeth+=hucU&IEweQk29p1h", "s": "7a7e2d5f0c369d0f39fe19ef7e99de61", "hm": "c69056bde8b3b77ea5755c6dd5f2db01"}, {"a": false, "c": "mBbL@V^%dN-0J$;S)gI[P*cmq8wxtsgI>{D^0s{k6Zwcv$>{=wXw9t1J#%QiS2^+Rgv1p_O(zDw=oJ+s)7W({uNXC2XSfdUac(c690sMA6wY5jRI!82|c5slSf`r5T@k|7W~t<;H#na$>jlNO0F~8DaS@nunTYK-jzy", "s": "f5ff997536c7e2e0d0162dd132eac85a", "oc": "fc6892b13e7342a9a310d82916eb174950aa082888692cf4dea0b634e4b75dbc1b6816169d9ca2e653dc4289422ffb10a948e26486c175a3a85c014351ad4a19"}, {"a": false, "c": "mBq:8V^4dN?0ex;g)1-J_*cmq6X0H+3o?jM)H&0-avztB!&#HUP2_fUfv1ondazDB=oJIiv7m(GIOQjKztUh?^@=oyRR^vJ", "s": "3d383fcfad7903e46a7ca70fa2816344", "oc": "9c190878055b61c81e7d1834cc0b15322e343380b1f969f1b49c09d6041411785c74c843f90ada97e1999986b21209bdfc4e3d27e1078da89560d848decf0506"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (102, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "1BbgA;2~_5&hR:X#WX>&aCqH4JPl!<%e}R}?ZZ8wdK=XLlHmDS=wYeq5*k$Nnh1q|A3yhQ@d,NEkP94mC6T5:P=j&n}7f>hGi:$|M(3CCEnn~ny&!mln|FsTD7AmVznG5KN&ZD;2AUnEe)`-DtWvR85BE", "s": "909cd6c10fef645db212686977395f45", "hm": "58e7db24a8115676c3e4ff2d734ad2a6"}, {"a": false, "c": "mCbKA;T~[|&h78f:WXU-=nqb48zV_>(FE9E$T:[jh|PL$AOUaiidyIGS;6-J#2(>OgC^U%oK#iz-4e%7r@cmkI_>B`x@g%<&?_m|L|Z)OY{yIKN~aPs2fC}n9ugdf8&)t6L@@O@~2$4f3OCsd;)+aR3~mQ#4i*fmE5R8de-:qZ}x6Qgnm2(0{V^2?Z>lO(rxzE3Y", "s": "4b2f916661062703a923b51b749f2ad1", "hm": "6abe6ddd18d2b7928c75ae13d8edcbe7"}, {"a": false, "c": "mBbKAO2~_|&{78D#WX>5=n!H48>V_I^FE9E$T[6BY>*L$Z3HaiidiYi8I6-k#2^>OgCGU%oK#UPQmU>FeL_z-YL{Il>D^pTEHMX`T`5(j;7slio+qo}pQBYA1T~d8}WdI7@mf5AFfe9d#^4%5Pp4h", "s": "4a6991813624726bfb2d2dd80aeacac8", "oc": "fcf99555030c4ac9a30c1ad978cab29c02d5c560cc0847d488a260c46edde88f7ecfe9aa97fd538988e20e9ec5fdaecdbc3906e75d08844465aa873e30224845"}, {"a": false, "c": "mBb;A;2e_|{hw87#wXUu;nqh>6KPW9&x3a=D:qzIDkinUG(>$L~,0>UgP08%.cpUMx62yKeL_N-Y6h0ssg%yfA]IiH^do$D", "s": "9db9ee4f8de3a6f40e7cbe1f6481b344", "oc": "f72a702e53b341ab0751daee6df03457e44999cdcd0582040fa8d6f97efc1c72248711340428d6585480624a3df704a36573774ad2473a1808f112f05d4f2262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (103, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m*bJ3V+<{WNn@T+eHg#:<`MH#YUjd0CY_B?4K3#@#bqKp,{<@c<7(,0ke|x{!!AxaEuo5#R-ZZJATHn?7A1@`(T>=$?2X*eJ<<0v@x_=D>fV}x<{XX8X|H}yB(ka8~H!SgKD|bDUN*`Izs~!ftkHNqucc8&", "s": "3e0a565d0106ed50a129956b54e0d821", "hm": "ba92a1bd78d2277f8375161ad8fddbe7"}, {"a": false, "c": "m5%pjV3<+WNxWTGa{y#g!CM+<8-dM23ZxyoGoI*Tv|n1Ucy`g}{On>Eq~+ZP7dG#{tLaXZ)sk#5!J]xTm_uPUfmOWp|*<", "s": "f2713781aac8610f92eb69bbc330ad46", "oc": "f8c7a12fa6082a511c93bc08acaff40b0adbf5a1c6aeb445adb7f7889359b960ceaafa4ab6b3aee5c5adfd927b9a24760635c96c07eedb8f"}, {"a": false, "c": "mwbJvV+>+hNnvTCaHg#Y!CMcj|}MUP=EzI($)uFbz,Ru#Q8069=E(c9#[6BYkZ1H3+Yd2uKI4g3?2+KDD_a%03uf]Ejb~W)de42214s6=>FoXlMb%A{c^ZX1Wm_)BJ[3Blt#*(|HZaN7@C*zCw>y#8Vi0>80AgNRs@Kb&2-xtY)}pWyW?ot0VYE0n_>+X^5XNQ4npH3H?oa<)$QC", "s": "deae9d6a607d3d326dcaaf167def6bae", "oc": "6fcfaf18288bfa121853bca6a911b202d950f321cca1cba5a5ba67c3660c89a9be90ffaa19b3ab64f6266407aba794760e4bc06c7d0f0af7"}, {"a": false, "c": "mB7M9-ayLC6az?+$n9~|a;CwRLftR$GT1*3>wLsoH;5|uj8c|QNY+pXaeShRGli:BxRZ(*$YCm-,6u=+OF_wtBoQA6boP=&w^#>;41>9aVy)S,Amcg;X1WmCN8n>3BlE#*(isnayw)*id#80AgNqB0K#327xtY*3p+KvM#Q&Cx+*HL!drIlx`2sG5mvKxC9m==89aod(qM>cjKqr$d^bNZI*pL3~cTsKt7bp$Ve*;3X1l-uFnh_WrM)*6{J]nxzAcDun9pIh)DF61}Wy4g$|=r!U$ho1nk", "s": "f19626011fb784d5eb14fc697729c74f", "hm": "8076dabdac788732c3056ae9314b18f7"}, {"a": false, "c": "mBbJZ8$9U2`#O)p?CA#MyMw6Wdo4Z>M!|#2=-tLD,=8vYJq>I4Xqd!Z#+nTD{rdIt~~A&!;c{c%7eX", "s": "df0b97c5029e30ffba7aabd1c73364ab", "oc": "fbcb3119941f53321553bc99180c140b0e1820aac0a19be5a50ae7039a997d698e2df51ac9bc6b85c0366189778a5446a628d4bc6d9f01f9"}, {"a": false, "c": "mBbJZ;|yc2SWWqnWXa?sj)-v`3jQ),wiP~llvOc~h)hiI?R&*07YBC9SR?ZT>}77_!tj5q#%1r4E6AOUpGDK|5L5m;ABr#)*={J-GozAc$un97{T2DC69}W<+g$Z{r!U$ho8nk", "s": "3a95cc2101009d0ea98ea54b541e33d1", "hm": "6897d60de8d2cb0f3de1166adafddbe7"}, {"a": false, "c": "mq=xZA`9c2%{OPLrra?H$1c-`8:u0{X2}SSyw%$>)phn8#My;w_W3$4h>M!|#2`-TLDz=hvYJ{>I4Xqd!Z=+nN~{)QIp~K~T6vfW}xVpu:", "s": "fa6f69b43674eefc1bc64db805e7c3ce", "oc": "f26a9cc533bf42c6ac016e8a53334ba582b2c93e4700626e26ae36b88bffed6687a325b6cb55b790fb331d004dfdca8e2a4f3d1eb48ab87d473f8ea1a02297d2"}, {"a": false, "c": "mLbJRA|)H2`{OsprXa]ij$cv`(=BDJ8>#UJXU|VZNgsglytMvB#2`-TLDz4hv&Jk>I^XqdCZ2XKN7rrQIt~KM&!-ciB%7X9", "s": "0daba0446d7d0c84b96db7c0b601d374", "oc": "fc6a976533a441a3b31ec73af47cf832b0732488edd5e880da5225e9ea2a02fa720769931076bea22da6b93e27d24588d7887dc6daaebc8135ccf40e7c733d1c"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (106, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mM`c<~8c9!nC$YU)D0n3F6|Qz$N*n8IE?Jord~XT<>HOT7vWl]tNUK{;]:B3Pr?En?_34}CZO:q}eh7lP2$#;)B?%zb(QjO8BsxO}BhrK;BbF9P.3X7Yeh#i.VNXEvl`i|lA3LzHA|-Eun3&>sQBASNTOjojQur{fLxA{G*FRr)W8<^)-#>TjEy+u;@y+w6)=nkCzp#2_Xku81KlsAa~VsxNI)uB_S}EabXdk*zWop0^to^JAp{e-+j]|YMqV`(8R3+MRS2G9=y>`Tn.b$&_IkG&=n3Q!c4|Jo!MASzTcj7yf2I7BLc){G*FR.F5D2lM:WKbIL!pwP+P;@y+w63]TkCzp#2AXku8rKsOL]~V6xNI)0Bd+!n$$B?hg7OAsxfK7DguXx=QpuYP@zg*`jK94DzB2%VD+{E~f&GiV0j=O^^m+`tVw@H`-Oj3S9z{enVJ^XMW=L5fGk_nvA>uyh", "s": "fc6a9074c7c4e9e040442fd8056ac6c8", "oc": "7cfadc750db34b1eaa3efe1fae49b2a6192e2f4b4b603d36e86da8dd73e0be0edea7f3eba97506eb36b4b7db6cf6f0c9ebb1950a0263fde69fd0c3d1d481fe3f"}, {"a": false, "c": "mBbGU&X252TUi~T2Gd`c9!nC$6I2bUCIyXAgMR;y|^Bjfr3Tns#2_Xku8rKl4La~K>|NzKi5_+xB`W~GhoFvD#GK|+DVYWwCvQRwftCmpn_aOKaC*?be!#d7*jT$qMG$)f{Xa`9*OnQ}l#u>?knlEr&B>4C[9lB,S`wjcFZxMb:1!?)%c%KqJ9^_Qhgfj_2Nd5!Zykxc`58ef?&s%ZUoqHc<^@6&Q*hTu^_7Df|,oElm%GI;5Nz!2kG[Il7z", "s": "6493eb117fe7f4f0f2149b32c7799d45", "hm": "e0c7334aa82d7ba7f235da34b9ded2a6"}, {"a": false, "c": "#CbLzIPx0,a&Go6Fv[#SK|+DV8)I(j(X9VO{->2s7k6hDI[>lxa&NV%@DmLoT2{_(#l+f(w8sB3+g?v9g-T|QNG(t&GCH|2^TM]3nx.;@", "s": "de09e2b5e56d00f4886cac17ea0fe4a7", "oc": "fbc7a8afc4d9da3ed5530506a56f2e0f7772f330c8aef4458cb0679c1e79e9693ea8f6ba19b3bd43c5f93d05772854724d35c06c449262b1"}, {"a": false, "c": "m>b_WeUD0`aTGhoFvD#G&|+DVLVlEQd!41mw5v+>H)|45G~rlez", "s": "337a585601248d01a52e71ab44eedcd1", "hm": "6ab75db078d6b193d17913ced81ddbd7"}, {"a": false, "c": "h^bIW=Px0`|y3xUF0P{SK|!bJ8({mL(X9VOZb>cstkThDI&VV?a}${", "s": "d33d978f781b615330526b0af33eaa21", "oc": "abc7a11fc8c68ab185e68c089c1f4407b7adf2a5c6f1c4b515da65a31699656967ad5637b9b1a065d5396d026b1254c6a7258eb72d9fa9ae"}, {"a": false, "c": "mBb[WI3x0`a~GhoFvDOcfeqR8sW@azsk6r=X@:%aUHkL7kQI))o{chZ?S@=OuK3P,ut<*PSAU?HN.kJO%5_Tq?f(=GM;4wpch", "s": "a48ff975717fea8e026032d8055a2a4a", "oc": "b06a9c6539b341f923018e125e4d372afb47a9e41e62c8570091565291dde3ad56329872bafa1bd30abf40a7a01afaffd02d1492e276b81d470c42c36266c5ee"}, {"a": false, "c": "mBbWW:Px0`%pVhoFwD#SK|+.#6aN{%E^11kJwP0:u[AK2XBCqy#N{i&8P++_38nW3^g?=Ag-kW;NG(kcAOHKh^l7Z3`x~$@", "s": "dd6a006fadf82317437cd71f1f8ebfa4", "oc": "7c619c6633b14bacfb7fddef08c3b18f987954e264e68de10fe9bcd5916bf1d2796b510379c3f960dc42122a31bd4af180576991eadc729cb510a57003e3d163"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (108, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB0}U1c41aWWLG644h(|;v|peYryG7d5DgJMhUlm6]JFn-rpm|!?IFb%_o{g6Hs4JdCAfZqg_)~zXCHc<{>@jESZjo1i+*=>!Nv7VAeB?BPN>0)fUgBUq;IJTL*jmQ|TmNt35ZkkP,6sR1@v)|JHNrF5AfMQ%z`tCK*iE%8Q=7zakT$#-`G$Vz8!*)m{1YEn>!82", "s": "969304d191bd8d5d52f43b9977229845", "hm": "896b4b24a8188b43c0077552be8edff6"}, {"a": false, "c": "mTLLU1B]1)W7>%<44h(&1v|2@v(%Xe9m`5PZ4_Xq4=y}eX-WGq;8&QwsYUEG#2zy8siCg1kJwGGEXJUGl5?^5*Wizv}4gf=9o;w&{p.B0", "s": "dc0796b85074f050077ca846edb945a7", "oc": "abc3af13cf1f2a51d533b406167f7701b708f29616aac445a5b9e34d19992a698e4df6492cdfab4529364d0276da54769625be6fae68fea6"}, {"a": false, "c": "mBbLUP^q1)W{q|344h(};v|K{LTk1A!h2L5pi*@*;AxKZWFp&PvSN9a{<*RB;Lp9`{rdc<1;`<{tm3QvT*bvPhiGw`aMo~fQ$%6M)m|ANzc*^mX!8m", "s": "3a04525601369905a92e65175690d201", "hm": "6bec5dbd6622022f8a551aacd78dcae7"}, {"a": false, "c": "mBbLU1c41)Wi||64ri(&;c|<{8(5Xewm`~OZ4)XL??yhe*-@GqK8&DwHvUEG#2}y8sIC-1kJwGMxK{UGm5?^5*WizvhPxI(9u;k`{56B>", "s": "a3db30b14a180f0d909b6dbbc337e22d", "oc": "d9c06c16c41a9a3215d9fc06a98f740bb75ef3a9c6afc76536bd6793100a99daf88db683b3539b45cd166d6f27eac4769d35be77bee0a8e6"}, {"a": false, "c": "msbVU1c4C;79q|;44h(J;v|K{B@IAhGD@4_e_^C5;6HanVi*)h-P(Utpy1vhn)%(@51br}VUDONCtF9i6hMs2O|>jjq(%OIHg|L&}DG=lC?^M7f!_V=pSh", "s": "feb5496102f44238d7242785f54253c8", "oc": "4c6a2168e3b442c6ea03b91c760ea674c3ce5d9bd634e7300de98c55d07df44efc2ec39f768a7b8c116aff8c7bc5c0ce3efc03334153581faca06d427c8b0509"}, {"a": false, "c": "mBtL~1{{1)W>qy6>{hMymv|*r6B_WiJXM;%UXp11Rp|wfJRrnP#2}|8x~=-1$lwG@]({fGm5?^5UWiBv}8xfy9J;k7{&hB>", "s": "ffb140e2ec3823446f9ea7121681b2d4", "oc": "04689365c4b441a31bb4da0c47569f8c4d21d8d7c814ff9fbb892d8eab6434fb59c87a4f349dcc0736021e3cadefe81d044ce537bc6843b3104b1d698ee02160"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (109, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "LBbK%Ks*N6KD|Asr0IlkeTZy}YM}ZD|89]~KDOTFAt{D%HgIH-uZSyh1vXG>D2q}w;Q{zT)bJNN)s~o>F-)ubVy$cQLhP8K6gWqIsq>t}L5CP2piJi>>yrXQ9Z79k+Csetm7#?HK9lde~+GWkg-%JdKy3qs&zhg8QUq1~ArOMF|P%C%>RmR|o~0hGgse6G_;L4zxoAT~_@K1", "s": "9660df020b67875d52582b39c62c1795", "hm": "8062d0b4a8417cd2ce2b6262bef3dfa3"}, {"a": false, "c": "mBmK%Ks|MeK3Addr>I]UeB4AJ8$p9%O7qPuam>mNcn39d89A;-07I&A-BbZG92`Ucz#~N{uZia", "s": "e2bb97356c7d70f289c04316edece4ee", "oc": "fb37a11fc28daa2515f34c02aab684cff268f6a9c1eec4a5a8eabb93153f2a853e4d09b390b2acdec5360b72ba4a431186b57c9c9eb0a857"}, {"a": false, "c": "mBb!xKssMeKD1As[>I~keKZAm*7_?]qEPl0=x}c%Dk)f|K2%D4tH7jhf848q-c>kB(Ez`M>gn8Td^N!5Y%_P+79CFfIP%Q;QNtEfX-ny&qY:3!x;8szq`hMT&2z08D6@O?=HA8Os`JPB=e5Q4DkbjE-%T|XeQr6#3>tTrY05odR>j6D-rpuh", "s": "aacecd7593939b30d524bbda050ac0c3", "oc": "7c6a9caca3b648d9a30fd839907314257961f5d5bb233cef15ddf6df29c69fd9e0ca926b969e639fda27ff76832e9744716d374e677e3d557feabec250158f55"}, {"a": false, "c": "|BbK$!]*MeK7.Osr>I~%2sZAc6pz~!2BKA1G~e`Y-54&a};cYK#2`Eh^=$NV|Dl+1e%BR$Gv&)f@+D>ZNishS;Hyy9kHb^>!zZF#hKvJ.}1", "s": "a92ce3b82003d30ec1cd44df8da04852", "oc": "f0cea11fc8bf2bb21f53a8f6a27fc404a9a9f5a9cf76c83535da4e931abe4b690eadf24cb9c3a945c5363de2bb6a547ad539ce6cacf2da146e9bd842877ebfa9"}, {"a": false, "c": "m[b<>pyr$}QAJXmH(V4Oin5h(L}r4wDvitT?g5T2VK9Gf9H`h@uChzd^?QZT`Z`lBA3^}UGzWm8T=`6b95?Db2{ocA)`gDzI|_|{|71GC{PdNHAX#dc{GYTtkLF|<6Vz*!{=f2B}NpG%!(zdzD!=Lon@`S", "s": "31d3e0dd0931b10ba92e8e178499d7ce", "hm": "c91c5df486fab8cc86798614d8cd2bef"}, {"a": false, "c": "mBb|!pyr$2QACX*eIVmn{}Ihuitc|Ug6XV?W8@M-t4r5r;^`BzWY7j;HvJ%zV", "s": "f0b6377c7d1561092b5b6b4acc3777dd", "oc": "f3c721efc81f22329959b406a31512febbd8f3adc5aec443dcbd6791b599bfa88da8f2eab6b33ba5c9586ff77b2aba785791ce2cc5ff941be5b1d85f87aabfac"}, {"a": false, "c": "mBuK(pfr$7QAydODI(mOiOw{vQy[L-8I##N^GXA#daWCrO$x*BkK0K=lmV1F2.f=r>YM]<KvJj,y", "s": "fa6199e5467462ecdb24871905eac3c8", "oc": "b71a96db0abe4d759300d5f964446972b275a16ea9bb947b256e034a68e18ea57c3ec0e5ba4dcf3038bfc670f12f158db5b2af7e0f7e422b3add3d0b47d5b0d9"}, {"a": false, "c": "mBbK(pyR$AQSC&EAIv;Oi}I{uc^nj}x>83Ouk4HoO^0_=jmcj`ux!l(YM1<7vJ%z4", "s": "6ab7b0bf6d1a25416e7cd01fa681ba54", "oc": "f8e9946533fbdb03bde1d83d4f8fe234810170efe56fde01c047d1f313857b5fd1fc1089bcd920b2c3773b4481babad4f905140e140e7fd242713df0a05072f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (111, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB2L@V^%rN?0W$;g)1PJe*cmqX6>h:07KZ^G?lNn$#WX`H|{!V8=irNR@DPOWN`t{aw>|7h=fAnU>XN+`+IO>J1pjgX(7Tov`HWORce#^$zO*7J`x7KauY0gW#{2OV?M-Z2rNGo9CW>gDOt!F|2d-`_:W7ljF_M6416ET6!A11h!E%%1Iw$YM|};hw=(ucI|IMwG+k8(Su=", "s": "d4a3d6e125e7545b421d3b6e37cac725", "hm": "8447d454a01f7b3453756731b99edad6"}, {"a": false, "c": "mBbL@d^%dN?D#R;g)1-JlQcmq8w1tsgI>X9^0s{k=Kwcv$GK=w.j973J#%Qi#vZfUgv1o_OazI!^oJ)S)7m(VzEPU^,AUh?^0=oIRR^HJ", "s": "d90b671c2078f362847caaf48d0fe3ae", "oc": "f2c7311f1b1fba30115ebce63914748bb71853a1368e834fa342c799f696e0ee3eabf65ab9b42745053663f27bfa5470af11ce6ca492da10"}, {"a": false, "c": "rBLa@4^%dN?1<$;g)1-JJ@cm88w1tsoI?{:>0sPkwKwcv$GK=w`j973^V3Ni#2^fUgx1Q_Oaz+J={JIS)7OZKFHQ#^z@Uh?^b=oFRR^HJ", "s": "63b937827a1841b491da6b7bce3caa2b", "oc": "ff976111c81f2a32e7517706491fb8bbb552f499e6ae44ca378a66f315d9892561d0f64ab9b39b45c4d76902eb26457da635ce62ad9edab1"}, {"a": false, "c": "mBbB@Vr%d!?)V$nV)1UJPwcmqBorT+`y>b|R{X{uNXP2XSd9UJ]|`h90sE|6wY5VR^!82|i5sdCfor54@k|v}5a<;H#nak2OlAO0F~8DaS@n!EH~!CSfy", "s": "f96fe67e3e54efe5db2f26db4593cc88", "oc": "fc8a5665acb34519aa63d82916ed1a425fb48b4f896d83b00ec0b5a47bb7f0f4e0e39f1d4299a45bc8dc72891d82fa80a75eefaa8a31c5a3a80d023352ffbae9"}, {"a": false, "c": "mBbL@V^%N1?9W$;g){~JPHcmqy<0sWao>SQ~H&z|v7z<{m2~_|&hE87#WX>&=DqH4Y=j&nB7f>vG_k$99x3FMyn3ZQ(&+m2n|FsHD7>:Vznv5_}YZD;`yM?}esS~?tWU|8iBby<_1V+JAn<40mfmE+H&de-4q8cxLQ=nq2A-{V6??ZW0$Z3vaiid9gCRy%oKsUm14]>FeH_z-Y6h0ssPbyM;9Ei2^dV$W", "s": "d90b6731227730ce8678a866e501e5a7", "oc": "4b67a81fb1e6e1d2c55cbc06a910241b6780eeaf165ec34575e2f78313938969f7a8e641ba33ab9ec53619027baa4476a3acce31ad2bdeca"}, {"a": false, "c": "mBbWAE22_|&h$87bHXUB=nqH4GFI%z.#+SO{$7r@cSkIVlY{r?AEzY", "s": "3c9a3d569030060129cecd1068d7dadf", "hm": "26b7566d78d2b97f0b7596cad7fdd567"}, {"a": false, "c": "mFbH8;2B_|X=787{WXU&=nqH4fzV7I^STPE$Tx^Bhz*L$Z3Uai]z{IG8fO-J#2^>OgC^U%o,!$zQ4U|(FR0,f%DT`5(j;7K>7oBqp79QfYAXG;d8QPdI7@mPmKFfeHd|W4Y`Spuh", "s": "f67899c53274e27e8bbd8d9855af5a18", "oc": "ac679c631cd3e206af01deec9fe9383536cec76cc9f3f9d488ae8f71bacdd25f662089aab9bece8c0d1bde32d98dce9178d90b475d079e6cb7a4e63838fcfba0"}, {"a": false, "c": "m,bK^(2w_v0j7|7#W(U&=nqH46KPW9$J3a=2J4zg_kinI)(d$7#}B%OgCjQ%oK#UzS4U>FeLFz-Y6h0ssPEyf^dPiH=$;cX*$t#cW%@}AxvEhP<*1CKM$^(+=zU:m=X6.c$IXV<&LAX}Tz|H9gY(Ma8~HQ4g?N3-sUZ*`I-s~pstFH^quXc8!", "s": "941b39fa9ba7b65d46149b5cb729c74f", "hm": "59672e44a848ab32f3056afd9e28df16"}, {"a": false, "c": "mBbNtZ+j+WN)WT~{Hg#Y!hMH#2-dre319y,gFq>J*809Ux_=3xfRUxdAX}Tz|H9gB(Ma8~H!Sg7J3FsUN*&IvR~!st!H~}u@c8!", "s": "3a9a3753d136ad0c89bf850b54eb577f", "hm": "22c75db978a2277a7c95161a3bbbd77c"}, {"a": false, "c": "mBbv&V+<+Wfn~TGaHg(Y!C1H#Z-zM2+11i[G|IzTv.n<6^Uo7Q}i`z>1}cJO#2{On(Eq~f;P7^Gu{SL7X*$[N#V9JpxT_uu4>fmrW^|*!", "s": "f3b937874818660c956b0c23c337aa2b", "oc": "cbcaa20fc6a52a381f13bc26691a540bb8d723a9e4ae844d4d0465d3059989e76e64364ab9bea88253362d0d742a577603c5ce6cfd64dbcb"}, {"a": false, "c": "mMbE&V+<+>NnWWMaPgU+Esd|f96kdpP>uqfC2ZwC{BU;Tbt1T!rEgoNBqkIEb(bOLEFVjb6dA29t#bR{SL7X*)sC#7!J+xTC=u4UfmgWp|*!", "s": "9db9a0e74d7823551e7eb3df367db346", "oc": "f916c74730884f11bbf1dfcea9ccd2ae362751e072ea15440c5ac5414af190a3aad48b86261e5fcd8d385e722d3006f4110a7f3dd32e21d2edeb4efac358bf45"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (114, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "|BbY9IawwZ6nHTlWv)GU?2C%<:4h$EK>.Z)de42Y14|H=>FoXlMb3ApcggX1WmCNxJ$3BlT#{M|HBaYj9v%5N(>VTMPq-|W?V", "s": "b99ba6c1cde4835d5d1bb66913256945", "hm": "10b7d7c4a64f403cb305613dbed8db20"}, {"a": false, "c": "RBbM=-awLU6ayw2OZI#z0AnNUT0K#-2vx_Z*vpXDW8oW0VYEjnjDvSP5XNQ4JpH3R?^aU]$cC", "s": "dc0b2720217d302e8e7c8816e00f76d9", "oc": "fbdaa21ac8af243e19a06806197a200b49c843ab268ec485a2ba4793b59e89698d1dbebbacb36b4ccb866002c92ac176ac349e8b6d7f6df8"}, {"a": false, "c": "mB3MM5a>I%6a<(+zN?~|aXNw=Lf=-#GT1$3Rw0.J|S5Buj8R|h#-+p5aGS7RG{ix^KRP(>!Yzm`@3u=+(FRvtB8,AbboPF&$.#3;c1>na%K)S}A|,TZX1WmCNxJ>3=lt#*(|HBozCw>qH2*id#8sAINqT0K#*2>x~Y*3p+DW?ot0V|yj&jDrVd5Xw+F>uM3R4^aE1$QC", "s": "c3b2376e783371af957b6fbb5437ea2b", "oc": "37c7a6ae581f2fd715830969495f550897cff3b9c4ae6a45d5b265934cca396d8e5156431e50ebf542a639027526d47623357e400d1f0558"}, {"a": false, "c": "mBbMA->wLU6<ii0k6cRomaFr;+XpNu$Z%1*6KvM#Q&T;*b}L!drIVxM^s9qm(KxV9n)y;W4o_1w#>c?|qr$d^,NZI=pL3KtCoJ*1L?6XQZ9+Pqd_9s0dN<&V}uKTbz)(?Kb4+xp_d-T;8~+8nx8dOU}4O~c>wnPM$Az,c)W){11TzTLjt<01.d^h(Fr^pBh=sp93`h@|OfcTs}b(bQ$VSJ;_X1?V*MnhAWrE)0W{J-uo~AcDun9nI9)DZ6CxW:4g$Z{r!U$rojna", "s": "901336ba4f45147d8214cb2b76987747", "hm": "800c6b44a8479b32c3056a5dbe57da1e"}, {"a": false, "c": "mBbJZ>|9c2D{OsXrr~PH4)c$`8Eu0{XobS~sq%$>)NRA8ZMy;wAW3&4h>r!|#1`-TLDz=hvYJq004X{d!{JghAR{VQ_N~KA&!;ciB%7eM", "s": "d951d7c5268d97f8f153a856ed0fe347", "oc": "fbc48513c80f0132190f6c08a913104b57d8f169a6a8c445af8c67334599926985ad9d4ada63a841c9366502db68e475ae44cb6c761ff5f0"}, {"a": false, "c": "1%b(ZA|oc2`{Osnr}a?Hx)x>`LjQ)s2t_Kllv&xYR)hiIeL&I>Hc1Zogl1(`f>cnLbBpE076BC9SRM!|I4o#7nj=+5ND}rQgt~KAy#;ciB;de>", "s": "f3bf378797d807df755b6bbb133fa74a", "oc": "7bd7de121295ca821533ac16b91f3400b7d1f336c40ec445d5ba17909547ce59bea9764dc9b7ab0f8f3f6e0e701e26a9a675ae6fad9fe1f9"}, {"a": false, "c": "mBbLZAM9cbr{isn|ra?HjVcv`#u6k|tregli96vFWMx<7Ue2o|VZbg2Sl[EuvBp2`-TIUy=hvY-q>I4Xqd!ZKm&ND{rQVW~K[&!7ciQ%sQBASNTOjoaQuI`B^c){GsqR;1W;<*p<2XPiN2BecTe96S", "s": "d30ba7f52d7d300e9577a81c960fe4a7", "oc": "46c7a41f4b1f2a421686a98c59871c07b7d8c3a9c0a16415a5b5f5131598896d8eadf84705bfab4f253180021c2a5474a835ce6cad9ff2f1"}, {"a": false, "c": "mB1BR&fpH2TUi~!2R*?g8ak=dk@TWVpl^t?gJ@p{J-+j(mYu#V<(KRjlMRSNeJEH>`Tn8bH6;I`G_Cn3[;1y;rjwP+P;@y+wn)=RICzpUH_Xku8zKl4Ll{V6>NI)i}_PfO$g]p?2XP~NcB%BTeP6`", "s": "f3b937847365517f9e5e6bc06937aa26", "oc": "ff07a1bfc86f77b4155d5305a91f2e6b00d8f3aac618c643a133673315998e6985add6eab61f5d4ac5338d06772a5a36a4356e6aed6ffcff"}, {"a": false, "c": "BBbPU&X2gsT_x~T2puB", "s": "fa6f99753f74e271dbaf1d2d0c42cafa", "oc": "7cdb1d673cc31219b7998e143cea32bb19d4ff89a26080e1bc6fb7dd7860b3078e3de34ba0756b02dbb5bb1cb1c3500aabba850b0b9d55910694a85108015837"}, {"a": false, "c": "m>bA!&X2HBTUi~Tl8d8c>tnC$6IRbh~(y-WgMR;&;q&jo7w%n]U2EXkuQrWl4La~V6xNo4ik_E<=$=<=r2tPyN#~%GNG+(Xa`$*(nQ)h#9H{kn>E^&uQ4C}9[>FS`wAS=ZA+G@YMonzxMIE1!})?c%WDJ[^bQhgZj$2Nd3!0s:zc`0jnv?&hAZ_)qHcf^i0&<*hpu^_7OfWhoElmkGI;5Nv`2}GTWa7)", "s": "8893d60338e77c59521d9b697329c742", "hm": "d0654a4438487b48c9f35e80be4edf16"}, {"a": false, "c": "m]b*WIPx0}N{GhoFvD#+ch+DV88j(LiX9VODRccsiCThDIfVypaoNy%eD;Lh#7{_&wl++_}#nBK+g?v9g-kWQNG(AcGnHK2}T7Z3n->$@", "s": "990b97152cad39ff56f73c119329e4a7", "oc": "f717a53f9d8f2c322553bcb6e56f3c0bb7d81ca9dfaec48555d26c03c5b98d6ae3bd667ab9b3ac9915362d0f7516e48da604c96cadfa402b"}, {"a": false, "c": "$B2LWCPx0V~~Gio3v9#[uM+DVL6lEEd;Wf)w5-^>c)548N1OKP63=CzO|1cAxQ9k!+y}(YNAe=$QXsI%T[DI`~V6a}NVFeD{Lot2|_Ewly7_A8nB3hp?vHgTFunNA(kcr|CK2^T7Z3nx>$W", "s": "f5c337012463610c955881b3c33779a1", "oc": "47c8d17fc81fee321553bc6759122402a7dbf0a9529ec4a5656a679f1a9984697ea4f60af8b092afc5366d0a29247ff1b635c68aa79f4223"}, {"a": false, "c": "mBb*&7Px0`a~G!XFv$#eK|kiVCVe8R*C3&AMTX(Oz<:qZ8WWM_fsesx$X=Q%aUc5}d1QQ9)o{chZrS@=Ou)3paumV6P$@", "s": "6eba004f442803046e9cd11f54fab264", "oc": "f6059cb537bf4aef1bb1d3ef0bcc4a8ae19f03e2c5f42721cef913e70fbaf112b81ed10cf8c3c96d6302942a41e24a14cd566d794ab6f592f51ea01c9408a113"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (118, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mMbVU1a41=W9q|644h(.;v|K{w?^GmdrZAJM6Ut3tvJpa-rpT|!bIFbJ_38_6>L4]kCAzZqg;J~zXCjw&&>@%Qg;jo1ill=m!N_DVSeg%BQNU0)lUgX(>_IJTY6je%|T]Nt650kkP;z)RVETjmJx#rFFb0<0458>Ao,H%t$tCz*iE%8Q(~}XkT$5-;E1Vz8)*SEe1YEX>!8)", "s": "db93560e6fc7845d5d149ac9b729ca45", "hm": "74676798a8401722ce0e8a0ab6bfee7b"}, {"a": false, "c": "8BbHUvn41C~9q|644w(&;@|KQ<(5Xe9m`5FN4)X2??yhh+-WGqH8&DwavUEG#>}y8sFC01+JwGMEK{UG65?~5>_izvh8xf(9v;kN{p+B>", "s": "d99777e52007ce5e8afcae2fbd0f90a7", "oc": "6dc7311f8816634218a32c0aa9cf04e4bc08caa9c6a7c545cbca674315998fe98ea6065ab9b27a45c53f650a9b2dfa38363f463ca396b9a0"}, {"a": false, "c": "mBbLU2641)o9qC6o4h(&TvLn{Lq!72", "s": "3a3a6616ac369d00ae25d5183499195c", "hm": "6ab7cdfd78d2be2f86551612481637e7"}, {"a": false, "c": "m(bLU1M41)W9q<64ehh&;8|K{8(5Xe9mX5_^4)XL??yhhX-WGqk8&DfuvDEG#3}g8sIC-&^JwGMEK}UG35?^Y*GvzvhUxf(90;.5{p+B>", "s": "f3bcc5813c28615e956b1abbc307d202", "oc": "2fc7ad10c818d13768b4bc03a9142106e637f3f9ceea1e4da7ba02131a998bd96baffae6299ba0415d376d03947a847f0a30ce65aab149e6"}, {"a": false, "c": "EBPLU1c41)Wwq|N44h(&;v|KVB`tAY7,@4_[hVl5>OHRnVKg8h-|vUiRh1vhxxz(@eHIJ|VBu?NpL+9#6hM}o>|>jjq(POCHmKw&hDG=m&?{*yf!_V=puh", "s": "b9df9c753673316adb2a27d8050cca48", "oc": "fcf3083633b3441ca30183be680aef08b0035011d0d43a490ded1ec3d0a5f74d3c2ac0a4f6cb717c7c767fb67cd547ce0ef16333515b57c3a4a9b9469c4905e9"}, {"a": false, "c": "mBboU1ch1@WYq|#n4e(&;.oK{6BWWiJX1;%", "s": "3252ed12897b264b5e7c671f76bfbb44", "oc": "fcca9cd5abb30ea37be1d93c39dc63492db06702c73db1e9b8ae2ab5f43d4f4dd8c87b41fb922c0afd925def1dcfe88d0486d8f7323f7b531349f86923d0d009"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (119, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mI=F@t{DFHgI0GTESo~1vq`fN2W}wLQ{>T)b|,<)hto_F-)ubVZ>cQLfJHK6aW_I=q_t*}5cl2ii+Q>PHrX$9ZY9@+QseGm7x&uK9lde?+IWkkO4J`KU3q<&U^U8AUqedArOMF>K%C%uRmq|o~:(G=6H6t_Yr4zuGATKU@KZ", "s": "909266980a77845c521c946d72091745", "hm": "80277b85a848cbd29195573fbe4edf42"}, {"a": false, "c": "mB)K%KsSMeKDAzs!>I~keTYAl8$M9?Ohq$urm@mN+~$Hd89lK-G7?&A[H&ZGr2`Ehz#$NPu_A@|w(m:UAfBZyrG%_DC3dl0|C;cLDc)R~Ku%DGtHX*hf84+p-cMDD(@zvM>anXTdKf!5d%}P+7ARld-F)I<9<6fmQj;!FukWkGAUq1TArGMF~P%WQYRmq|o~0(Ggse6z_Y|4kuoAT&_@KZ", "s": "3aea5d56003e8500a12e451bfc9022cc", "hm": "a7a775717802de788785161addfddbe7"}, {"a": false, "c": "0cb$%8s*Me0DAAsr>IaPeTR%c]$09LO%q$urm@^N+n39A89j;-@IlrA-Bb%t#WXEhz#3NVAI9ke&ZQcC}sIP%Q;{QtEFX-SyMqY)3lx;9sAp`hP|-2z0#&r@0?PHAWOsRJPNVe7B4DkI=EY%T|Xe6;6#3>HTYY0OodR>615-rp8D", "s": "fa8f4ec53664e130cb2b24d80f4abac8", "oc": "526a6b95334992190400d32a727e6c2502652cd8b40ee16f75cc31737057b1d920fcc70fe723027fde36d2b59dae268463703353934e3902bfd8b7c17051eff5"}, {"a": false, "c": "mSbK%Ks*MRKDAJ!r~IYkeTZAcmGz~_22KC1kMeZYj5G&aG;AuK#2`_hy#YNG<eDishD;H2`y}H6^>azTF#y5BE%z]", "s": "4599d1010fe78297ae4496650728c1f5", "hm": "b76f9bd4eb0ea03283b56ac4aec16c09"}, {"a": false, "c": "mBqK(py?>l`ACX2OYVmui}Ihu96ce=g9XV&2}0n-Zz#Br;*6<3WFOjd2ER8q=fogcY)1<O(zr7Xr$`oYG{(;RF=5@K!8;glKvJ@zy", "s": "07029dc820a0b07ef62ba1a7ed9ae4a7", "oc": "fbc7a118c8bc2f3265332c76a958270bb7def3a9c6b1c9e5b53e679315e91b294ea09a4ab4b3ab55076ebd027713ad96a63f5669a19edfdb7e37424f56ae89ab"}, {"a": false, "c": "|B@K(pKvJ%Wy", "s": "f36987817808910f95696335c3f7eadb", "oc": "fbccd16fcd165a52b853bf72ae1f28ebd7eef3a930ab4446a76067921bc98d898efdf740a7bbab65cbf66a127ba2fd76a682c73cad91da1b858af54d8b616fa9"}, {"a": false, "c": "mBxKXplr$luASnmOIVmOi}7huBte;>Ow0?K,BLC04#1N^GXI#daWCrv$8*BPv0KPlm=1F2cT=cFY>C<<&^3?C`(zQ7*UC`L{G{(;RF=bBK8->QQKvJ%zD", "s": "fabf89150d7f32ee07243ff8056eccb8", "oc": "d06a9c255fb3a219a310afd4557698d5d284d27753fb94d9b9b8884a1898a8a57f3acc66eb4aceae09ffc8e4f6dd0d1805742f7e0c9748644a2a70f9a06595db"}, {"a": false, "c": "MDbK(pfg$AQACXmOlVmOB}Ihu6#`j}Fs?3>>e*Ho>K0_=j],Mbuf!lVYQ}<0v^$Z+Oe{r7YhC`o{N{(3+F=bBe!j;bWKrJ%Iy", "s": "37ba0d5f4de820746e71be1d6671b3e4", "oc": "fa62996533bf4d83bb0e683c695d3434f1043b3ae563de4d24f7838d038714c46bf850b92cdc26be8ad08b4e75b97a60076514ea600dccda74856175795044f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (121, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbC@VVU=N9)W*;I)1~3P*fmqz%JhW}ZBZpG?lNn$CfX2z|W!VC@ijhZ@h{Jfm`>JQpjgXB7ToG`HWORpeL^OzO*^J[xJ|RuY0g|#{yO*?M-Z2rNIo9CWbgDOD>]gf3-I$s!7ljFi:6c1TE46IA<1h1E4%1Iq$YI-RthZ=uucB|7EwYmk8(put", "s": "9592060d1f87e4bd2eb46b637b7ee035", "hm": "5467d042a018ab3293f5e88db74b6fb5"}, {"a": false, "c": "mBbL@57JdN?0W$&g)6-J<*cmq8w1t@gI>{DW0s{#<<{Kv$G}=wX)97`J8&Q.#2jfUgv}o_OGzD!=oJIS)Zm(VYEQT^jt$h]x@ZoIR}^HJ", "s": "690bcfb5206fa0d085fca814dd2f1424", "oc": "f8c4d812c81fc572d552bc08141f2808b8d7f3a9563dc440a584d21363695169edadfa3ab9bb73452d33a7028b9a5576ab35ce60ad9bd31b"}, {"a": false, "c": "mBpLwo^%WN?0W$~tl1-Jn>cmqK@;F|K5qT&!~f=;{r|gL#16?+W*^uG?MQ1vq*M{qd9J&&IMDbqYVWjR-*UOWau*1x0KGAhNMrAja?iC`)BMCB4L$4(6dA<1h!E%%1I5$YIE}th+=12cUoIEwG+k8m@uW", "s": "3aea553302309d40af5b85dbe590d2a1", "hm": "8ab657bd78d2157f86a5f6ced8fd9bf7"}, {"a": false, "c": "m:bL@T^gd{?0W_;g)15JP*nmq8w1tsgtL{D^0s{ixKwlv)mb=wXjA7pJ|%Q=#2^f2gv1UlOaz1!=>JmSp$rHUzEQU^3t>hu^@=(ITR^HJ", "s": "53b03781087d6516955b6cb6c637dac3", "oc": "abc7a1cf986f2a321553ec06a61f293dd7d8f3a95b6dc475adba6b27c5998e6c8e1d3aabb3b3aba5cf6250027b275456ad35c28ca58eda12"}, {"a": false, "c": "mBSLZV^edN?0W$;g)1CJ+*cmqB]44+`y>b$qoX{uNXP2#SF9Uac<`KensM|6wY5x(^!82SE=klSf`r5r5k|7)jaq;H#na[2jlNZ0F~8Da-@>uut~z|5zy", "s": "fa6f70f5387d6ce3da242ba8092aca68", "oc": "dc7d9868cafb5fe5a8a0182010e71d495f94e820f969ea14e87abf82d19571fd74e3f317f293a37ac9dc48991cff7da7ed584f098d31bd63d8ecbae35936b8e5"}, {"a": false, "c": "mBzLz(^%dN?0WQ}g)1-JP*cmq6X0HB3)?jM7Hx5-v7~t<,`#HFp2^JUnv1KsOvzD!=oJSS)7s(V!EQU^ztZh?^@=:IqR^Hf", "s": "3d99405f3778f3766e7cb11766c63344", "oc": "fc4904f50c3071d82e1598ec5c0764b548cbb92acdb56a00b8da2f28e424b77eea7cc2437d0681a5297f2176a539ec4a0c4e4d7bed03cd4a21b012a6d7af090e"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (122, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK(;2~_|&h7876WXU&}~PHvYPl!)bi}R}?ZZ86dL.XLlHmDf+@Yp2Eek$1nNnq|L3y>Q@WgNEkKM4jTu>5YG=&[nBNf>v|iA$BXx3[Myn35nC&!%2>|FsTM7ASVz&v5+3bZDp2AYVE!=X~DtWXv85Bby<_1V+JAQ#=@CfME5A6-Y$2^QNgC^U~oD#UzQ4U.FeL_z-E6H0ssP%7jAd|iHlPF$l", "s": "d8079fb5208630ff366ca01aede3e087", "oc": "4cc7418fc81f2dbe65851206c91e2d0b8cc0b33944a84045f56fe793617989398e8efaba79b3ab4dca36e2027b2a5115f5d5c85e0d1e2bca"}, {"a": false, "c": "mBbKg;fT_|&h767iWXU.=nqH4gKv%yI#mkZ>%7r@[Mk{#>B`Y@gtJhL@OO2~U$4fWi1L-w<=l[P6AQ#4iCXmE5R8de+4qZ}xLQgnq2A0{V^??ZT(sCrhAtrY", "s": "3a9ad95a04391d00ab3e551b5e97d2d9", "hm": "78bbedbd29d2607c967d064a1816dbe7"}, {"a": false, "c": "ZbbKA;2~_|`h787#WXU&0nqA{8|N_I^FE9E$Tx^Bh>HL$33Ua<-diIG8f6-1#2^>O}{^XloAOUzxKF>FeL_z|Y6h0sBP%yfAY|iH^dF$W", "s": "f3303d61781d816bb75b6bbbb397ad2b", "oc": "cb3bad1e181f34321053f60ba9115c2eb728831c5bae0425adba6fb328694969c73dfb42b9b3bb45c7fb6f0b7b2fe4e6c925feec0e8e5b75"}, {"a": false, "c": "mBbeAIN~_5&hk8S#W2U&=nqN4C6`ILo}D>>^hlEklb_g`T(6}7s77oAq;FpQBYA1T_d8QP4I7@mf5KFfe9dFz4Y`Sp#%", "s": "ca6f91c53b745260d6c03ddc08e0cbc8", "oc": "bc5ab665f3bc4a79ae018e2cede43e0c0e75cc64c5734181882b46c464bf315f73b1e9aa35bed18e93d2dec1a5bc24c9e8a9760fc52e2a149c44e3dc3ae6fdf2"}, {"a": false, "c": "mBbKTJ2~ke9H>87kOgC^U%oK#UzQ4U>FaL_z-Y6h0GsP%mfAd|i=^dF$n", "s": "3db4004f4f4c53443fb1b7142620b334", "oc": "fc6f9c65d3b64128bbe8370efa7e3431e7fc9cfd1d52ccaf0ff1a66e02f316127c021ff0f44866ba20d0d29371800ad77f8358da41663a2408d112f05e4fb766"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (123, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "vTbJ&c+<+WNnWFGargwY!C$H#Y{jhFCz_B2lA^#WvbsK_t1c@_yt=$?2X}n<$,!iUV#[eE`;!0{ZJ_}@3~nC5+cn%y}Axv1hP<*1CK{$TH%+xUamiXGic$IXVwUG*9g(>Ma8~HY%gKJ3uJ;]*`Icy~!stkH^qucc8!", "s": "14939dd10fe7b1ff2210530977993745", "hm": "50c3dd44a1186b32c343aa37ce40df17"}, {"a": false, "c": "mBb+&V({+iNx)TG+mg#Y!0MH#8JbM23gayo|QIzTv|n36^UC7QSi`8l^qcJSGu&SL7X*P~N#2!,pTT_uuUYfgrWp|s!", "s": "79fd979440ad34f0d6ac12f6ed19ede2", "oc": "f8cdac1fc81b2ac2e553ba5a8473fccbb58783a9cc68343cf5956963e59187f43968564ab9c36b47c5f69d022b2a54b6f6c07eb1a225dbab"}, {"a": false, "c": "}B5J&V6<+WNn}TGaHg#Y!CMHJ<<09+7b=DyfR`)dAX<,7|H9gB(Ma8~H!SgK_3-4UW*`Ics~ozt{H^qu(p8!", "s": "132a5d56a1a69f0fa82a85a594a5b2d9", "hm": "6ab75cbd78d75775154d33f2aa6cde97"}, {"a": false, "c": "mBbJ&V+Uo(Qpi`z>mUcq`Xa|+noEq~PZP7,Gu{SL7X*zpAyY!JpxT_SuOUff8Wp0*!", "s": "f7b836110808da0f5550687bc137755b", "oc": "fbc54a1fc81f27321453da06a91f2d0b07d8b3a5c65e6fdaa58a679a129965098ecdd3eeb2b2f44525c66df3702aec74a83c10dca3f3dbcb"}, {"a": false, "c": "gBbJ&V&z+WNnW&GVHg:Y!CM}#B7MUqDEGI9$OIF8zdRb#w8c>IaEsdWf96+dkZ#vqbC2VwC_0U{krt1T|rE=o1PqHFEL(bOLE&VjA6xAo9l#bR$ItY2p~h", "s": "572c9995367ee2e08b242fd803ead598", "oc": "fc6a97a03303ed8ca30fd12f623397aec6dba251f6bcf9ac49f6276753a660a4730ec1f97f97b23104ab80598cef3b6ad9e0cafe342dc3cede22ee2de82878d8"}, {"a": false, "c": "m$bc&V+<+WRnWTGHqg8n!xzH#6Tnls:v]B3F-Zcyln{T2hv3OI#2{On(aq~adP.EGu{S}7X*)[N#MOJ$xTguu4Ufmr<=|*!", "s": "3dde009fac7893477e7cb21c66e13307", "oc": "3c29ac9fa3b63fa2bde6d7ee0cccd7126f8c51798ad5094cfcb5124696f135a0b724afbeea0e7f567d23bec20d4bb7b6a8fa7204552e7b408d9bbdfaf3d1b041"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (124, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBaM9-aw7R6a<_+|HV:|a;C8=YtK+ITe!+6l?$+9*w5*ce1J3+GdXuKI8g3M2=CTD`;Zs[&vGP?s?_DmE,lvsGU?2zd~=cPoJ,e3`PB|a30>C%m38Y$EKb~W)deV2&m4sj=>FoXl{a%ApcgZ<1WmcN7J>8BYt{*(|HBaxjg-%5N($VTO{&LeW1V", "s": "9457960b0fe7d2bb5de4906917294f75", "hm": "8027db417b93a732bd05663db87d85f5"}, {"a": false, "c": "mBjM9VawLU6Z^w2,il#n0AnNqT-K#3&7xtz*3q+DW?oy0VYE-nj2r(dCXNQ4n8H3RX^ab?$QC", "s": "d988a7b52023300a46dcf806210be4aa", "oc": "d6c7208fc61f2a3455438006a9dec40ddcd683a9c51b6f30a5ff97a3159638678ead3646bf56ab4d66766f5d7baa52765415cecca19f46fc"}, {"a": false, "c": ")|;M{XaLLU]aI?+zEi~|afCwVQf8-#GT1O3!wLgrTS5EuO8R|yNY+p4aeSYR8,ixYKR<(z$Y+mt^6u=+OF_wtB8QA|boo=&$g#B;c1^%ro1)Z@upcZZX1WmCexJ>3Blt#*W|HBa_j9v%xN($VCMP&GeWdV", "s": "faaa5d06e1969d04ac2ef61b5496d2d1", "hm": "6c2f59bef8d4f77f85751c4a7ef4db27"}, {"a": false, "c": "mUbM9-aeLU{aO0kjIR*^aFr;+8pNuz%%1*vcvM:QmTx-{Bw.grIRxM^s|5mJKy+C&wy8VvoO@TM>c?Hqr$d^$NiI=pL3<*cK_uf", "s": "2a6fe6951675bd4ed42b24d2e5ea90c6", "oc": "fc2ad085337742d9bd010e1c9dc90a21e85a11635a4ff8d68bec89288daad137a3a506eb2b2f7ac7ba18cf9a95d6f3412ef8f78ec0021271b25c6ce7ad644e46"}, {"a": false, "c": "mBbM9-awLU6aKt`RJ*K:O2XQRL+>:X_9v0v]#fV}uK1bz)(i.UV34pBzM+qY2+`wxSdOU}4O~c#wn`(-A&Bj{-j]1pKBTW>t;w6r3&4h>M!:#2`-TZDz=HvYBq>I?Xqd!Z=+nNDaLQIt~KAH!;$iB%7uX", "s": "d95ee76181bd30fe860cb817a31d64a7", "oc": "fbc7a919a5a330967755d206f91e249da727f329c46e0405ac4863939b99886980ae46fad816669dc7e631047b2a14768b346e47a31f61f1"}, {"a": false, "c": "m%b|Zdl9&>`{Ogn8r|zHj)Zx%c1Z%glP(`m>cn09B@E07YBC>Sy?ZTT}b7,!tjaq#%Cr4K6A`UpGDSTiL`OMAWr?)XM{J-nozJH1u:c7I`nD561}ZC4eQZ=X!-$ho1n(", "s": "ba998d5603379dffec2b851b549662d8", "hm": "9cbc57497823b7728d95661a39fdd947"}, {"a": false, "c": "eObJ+v|oc2`{O1a(r^PHtFck>8F{tEX~pl|(w%$>up?C8Aby;w6W3&jh|M!|T2c-TLDp=hvYKq>IdXqd!Z8+XND{rQIt~KA&!bciBp7dX", "s": "f1b9378178f368bf94096abbd407aa2b", "oc": "fbaca1af2d1f2a3f1ed35c0ba98f859b377862a9ce1e344f5a6a6c931e8603609eadf84ab9a3644cc5366d12a223a4034489273cad5f71fc"}, {"a": false, "c": "mBbJZA|9c2`{Ocnrr6?Hj)cv`C06kttfeg|iI%ijveZhO?i!#uY;n?OPF%6{hTyWAP^{ABrz4aLT`oujy{tMh0>96vFW=:VpQ}", "s": "3a649d753647e2e5da742dd805eacacc", "oc": "4caacc6533b8427968818e1155354c32b26879ce480e42b6e7be36df0b9de8c6867f95c61555b721dbb0ed2002fda8e5ec423fcab0f93fff62698d2fd3222ff7"}, {"a": false, "c": "mBbJ*A|9c}Z{q+nrra?Hjkcv`s)B+t#b7U^2q$VZNg9~l9U4vB#2S-TLDz=fvYo<>I4XOd!Z=+nND{rLYtmKH&!LciB%7eX", "s": "3d5a007c477823964bcc331f6b979374", "oc": "ff421cea3f4d41f38be178ef4a0cf150fa6826f8a1e5a68ea4522b09ea2c6af87707519afc56b54b1d0d173133ef18bed864597e51f83a513f2cf828a8f286a4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (126, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&+mH2TLi{T282E?r7rd~XnH1Pu?6&?oiQuI0BLc){G]FRUY~T2P1W;<^v-g>TjwPjP5@y+>6)=8kCzpYZ_Xku8{Kl4La~VqtNIKiP_+`TF8b$&_I`Gh=n:9~@2aUiNT2;*kn<^)-g>9RwP+P;@y+w])=8nCzp#2_Xku$rul`La~?6xN@)i{_+<0$YPpk;LPyo^P%P7eP6S", "s": "f3bfc3829338a60f950b64b6c33cda21", "oc": "cbc781ffce1f2a32177ffc06d9132492b2deafdbdfa75225b554bd9318c787698ca4f64dbdb3ab45c5cfc3547b2ae95666f66e6fa9267241"}, {"a": false, "c": "mB*Ks&X2H2TDi~T2cf{{8h)jPh?wo|`tV.@r`aO_}{9vuen1J0Xi2_x5fGe73v{>puh", "s": "4a6f9e753664e9ed0bb6d60804ea8c9b", "oc": "cb7a6c6832b34119a331681e98d982b01929ff8bed602038bf6df7de4cb02387dea20643f0769beddabe213e6c8e955c8b5385470a6dcd26ffb838d1a8015f61"}, {"a": false, "c": "m,bnU&p2HA+UiKT27d8c9!n<$6IRbUb6y-A(UTD&]=Vjo7`%9N#2_XkH8$Kl4|a~V6x3F%iBB+<|$YPpk2XPbNfovcT5[{S", "s": "6d1a004f4d7a2344eb78b73f66b1234b", "oc": "2c6f4c953805411346e787ef25cc4a17666331c49b2a522a869d60063abde431511612c8848d05c15ae9eaf7f064d1ebb05b8bf5e705687f82604c3b472aebd1"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (127, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbS[IPx0#a~GAT%vD#S,P+DVYWwCvQRgytCmpM_Je~#bPwbe!R^70jT0qMG:uziXa<99%AhQh#h^?PKzEr!fQlCR9_B:S`w@y=g<3vXyx`MN`-+G@QMtZ-xiIl{!hdh>%Kq09^_Qhgfj$BNc3!8s}xc`%8eiY1|(Z>,qHcY:@#&l*hTu^_zZR|hoQlmzGI;5NP!2TG~vl7<", "s": "949f1f0aef74447d22709b697d29c74f", "hm": "f017cec3fd424be2cc0fda3dfebeda15"}, {"a": false, "c": "HBPL#IP.0ma~Gh{Fv3#SK|8l~8)c(L(X9VOZ->csIkThDI`.Vta}NV%eDmOo#=S,fwl++_F6nB3h,?v9g-kWQNHdkc$C#|)^T7Z3|x>$@", "s": "d9079755b07ba0fd866cac19ebffe4e7", "oc": "7bc5a94fc8df2a3c655a75e6a91f24ebb5faf3d6c69ed04ea5bc6cd38a99896482a8864ab9bb5c41c23ce002732a747aa6350e8c2d3940b2"}, {"a": false, "c": "mZbFWIPx0=a3^hosvD#%K|J0V.VlEEd!}1m|53+>Q)<43NrO.PTS={zO@|2AoQx}b+aL(ANAjM$oWW-pHFGi-2HPdn=JIYs0G{C*(7KhB4>ZV6AZ_oqPcX^@V&9*;^u^_YOC|hdElM<-A;5dP!2|U@rl7z", "s": "324d5d5791e69401a92c856453b0dd31", "hm": "d0876d1d7f48be7f8a71b6fa885e9bc4"}, {"a": false, "c": "uP|LaIPx0c[IkThDb`VV6a}NV%{DiXo#2{_&wl++L|8n1uhg?P9|6kW`NH(k2GCRK2^T7Z3,x>$@", "s": "e0b967811802630f65eb6bffc637ca20", "oc": "fdc6811f09632a3b15f3d505e9cf347be4d8f3a950aed495a553179513fa8769fe76f10ac9b30bbfc7366da27c2a59467e323e6c2daf34b8"}, {"a": false, "c": "(BbLsIP!0`a~GhoFEZ#-:b+DVCve8NOC3L_i=Y}Ocfe:R8^WMR$sew0$X@D%aU(5LdkQgi)%{chZSS@$_i}3pautVMP=AF?HN{kqU@>8g6>L4JxCAs{ql;J~zXCHw:~ax%Qgavove6*T>!@GDVde^OBP8SSbfKgx(>_IcT2dje%|*m3o350kkPVzXR1@HjPJHurF5b0b8)", "s": "b693d664dea7865d3514d8694739c749", "hm": "ff4cd449d3b8ab3383056e3ace4edb11"}, {"a": false, "c": "rBbLU1c41)E9q|6o4h[&@:>K{((5XU9m`LOZ4zhL??yhi>-|GZH8&9wuvUEG#2#y8.8CY,vJwG)EK{UGm5?^5+Wizvh8xH(9(;k`{pcB>", "s": "d90b97dd22ed30fe8685aa1eed02eaa7", "oc": "fbc70cdfc80fb03915a63c86a91f250bb1d2c359c6aeca45c5b90ec3c59989698adef643bcc0a402cb204507c92a3876a83ace6ba805a7e6"}, {"a": false, "c": "mBuLU1c4k)W8qq6Ikh(&;v|T{gTkzh!h2L`p$T}*IAxK=WE}&hLSE.GN!K#", "s": "ca934de601d69900a827821b249033b0", "hm": "74bc5dbd79b2e92f3675130fd8cd6be0"}, {"a": false, "c": "mBbQ41c41)W9q|<94G(=;i|K>8(5nu9m#5OZXDX)G|%heX=WGqZ8&D", "s": "48bb378175c5660f945b612bc3971834", "oc": "bb47ac1ba82a70021550bc06a59f440cfed9f3b95692ce7ca0ba85b310b089698eaa66ea56baac4515306db22d2754768535d145ae77328d"}, {"a": false, "c": "mB}LU1c4F)W#E|Q44h(&;O|K{B`uA<7Y@45ehTb5;e:R4V+K)h-OvbiIy1Vhx:%$@YHIJ4u5^LN>VB9brhMEIO4-zj3(POC-mKL&kD@=Y&BXey`!_!]tu6", "s": "4d6f9dbca621e8eedbc4d19895eacd2b", "oc": "fc6afcee39b34203547d4e197dcaaa4a53fe0131e19731f08de98f950b79fba2002e75d25a8c71ec7671bf49dcc5c1b231097233445752de26ade9464c8baa0a"}, {"a": false, "c": "mBbCU1c41^y8OZ64Dh(&;%|K{6B$@uG;u`)y8st(-2kJwGMEK{UGm5?^C~WK0vh83fZ9(;k-{i+B>", "s": "3a5a004b2d1428f46ed95e1c6f8bbfbf", "oc": "fc952c653bb34ca3b2e158c549bf498cc24d57f84616515f30ad4d766b3538a5d11d84bfad9ecc57fa0252ff1493726d44c97cdd3c0873531346596543224e2d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (129, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKUKs+M_KD2ASr>O~],Tm9cYv8b4|8)b~)df=F@d{DLHg>5-uE@Rhr}B`JD2I}wL!&zTHbdN2msWoVFR)ubVL$)Q~3PH{:+*_Imq>tnL2ui26iJQ>jBK9Q|$79k;Cse1Xe#?[K9ldeNmIW`XL%6uKECqG&+^U8AKq1dArOMF>|%Cv>eKq|y~g(Ggse6t_Y<*z}oA:j_@KZ", "s": "132a26917fe7b65a52e6aba977b98a55", "hm": "d927db10a8489d32c8936a3dbe3ed876"}, {"a": false, "c": "mBbK%Gv*MeKDJAsYEI~keTjAc8$p9%O%qTArm@my+nd9q89A;-=ul&1-_bCG-2`VhzNVNVGP%W%>Req[W~0(Ggsa6t_Yr48uoAT&_6KZ", "s": "45992da60136cb0062ce85185be392e1", "hm": "6cb75dbd7802b7720675fddae8fddbe7"}, {"a": false, "c": "miWKpKs*Me5Dg2sm1I7keT:Ac8$p99O%B$urx@mN+n3>d8-A;-uz^&A-|bx<#N`E-z#$NVuQ%Kw*MeKDAasr>r~keTXAcCG>tP%Q;g[~EFX-STMqY)3K:|8sAp`Q!Ta2z0$Dr@O(8cgWOs`:[Nwe5Q4TkwjEY%TrXe6r6Bo>%TrY05=dR>6(o-rpuq", "s": "4a1f73059c83c470cbe64d10c5eacab8", "oc": "8e6999b33dee9963a309781a025b76db1d6c6cd9c0fce125a54de4fcb0869ed960fc806b99be06efdeacf2c6deaa6794617d377067d73d6224ecd7c1e00e8f15"}, {"a": false, "c": "mBbKXKs*>eKDArarMI~ke,ZAc6G}{I22KC1k~e`Y-5S&R+=cY,#UrE|ze$4V^lA@#w(4e!{UBZqrG%IDCHE0$cd!xayNZia", "s": "cdc2e04f4dadc3446e4ce77f628193a6", "oc": "d9635cf089b344a35be6446c495c44d0b392e2e0c7057ea4717529c63325d3af263ff237416a591dca6bfa3eeac598f86b0fc1d4e027e0b00745bb10b25dabf9"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (130, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK(l;r$AFANXmVIV4Oi&IhuYCTK&e#_8pDe%*RPGv&)W:o#vIj%B{WNPmZ7?!TWVh1HXUrHe!N@<%4BNiBhSloC`o{G{(;Rs=ABK!+7u3`~Jszh", "s": "94b9e98f0fe8848d5224fc6ce949c71f", "hm": "806f2f04386a8b82c5a197458e4e7f16"}, {"a": false, "c": "mBbn^pyr$AQ)CXmOIu1OiyIi$4c{DUg[XV?4{4M->z#Bd;^n<3WF.edjrR8qtfoXlYM3KvJIzy", "s": "d9069b85b8cd2c2f507c1116ed0fe447", "oc": "f7178114b61f2a32415fb946dd1fc4e2e7d62389c6c5c446a5bae79ed59789096ead884230fa8b4ec5e66d067b295986ac35ee91a29ea01bc73ed9290a8abb3c"}, {"a": false, "c": "mBKK(pyr$?QbCXmDI3mOi}(HiuJa=wKvwtQn1YT2HKOGf9~<-@uChztE?Q(,tZ``BA3^P-vWnN+4R[r7YhC`o{GD(;XF_b^y!+;7>KvJAzy", "s": "e3b639fbd818619fe5eb0c8fc93777db", "oc": "19471105c81f1bf2e2d5b8768e1f230b96dae39986a81443a5ba6ed39599bcfc40ad6d4ab9a4ab4560361d56db9a2466b6b5cd6aa49e67abe23dd9fd3caeb7e9"}, {"a": false, "c": "mBbK6py:~oQaC}mOIRmOi}3h^Bte;>O<0vZyBL-05O&N4GX^#d:WrBO$8*Bk.0#+lmS3m2cf=kBYl1<KvJgzy", "s": "f95d9f25e674a1e4dd307288057eaa24", "oc": "fc559c0137b352b9ff00d5db60ba872ee2142e7d4304961125b9644f18e169f5753bc345fb49ce3eabbfe1b1f3ee1c87b542dfde7f9f9e2d35d17dfb301b901b"}, {"a": false, "c": "mBbK(eyr$AQACXmOIVAOi}eyu+n`j1Ff8[7>kPHo>^0G=jmcM`uV!l(V@oKvJ%jy", "s": "ddbb007e4d7e2343ce7cb71a6684d345", "oc": "dc279c213db33aa328e1d83e930d712d910130aae562ded1247183fd530b36cd6af8c031b7a9d0b296bb9b447fca70d6c7ce1436640ecda07b71612170c543f7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (131, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "CBbL@V^KdN?0WpGg)1-JUaBmhX%JhW0ZSZdaAlNn$CfXJH|WeV>tirNa@p{OfN`tJj;jgX(7ToG`HMORpe,n$z4*^M`x7KpuY0g&z{7@V?F-Z2MkIo=dWCgDOt{Fg2ddI_cW7ljFDM641$Sj6!A+1h!E%%1IV>1I+>thw=uucUyIEwV+k]pYu~", "s": "9b7dd9410e27842b9e13a669743ce1e5", "hm": "9667db44d84ca932c3c58c7dbeded46a"}, {"a": false, "c": "mBpz@V^%$N?-W8;U)u-JPBFmq8weisgI>(6^0s>k=Kw8JxhK=w-j973J#@Qi#?^_Ug:1e_O}P%N|oJIS)7m%VzEQU^ztU=?]@oomRR^HJ", "s": "d90c93d590c33afe867c7c1de300541e", "oc": "abc7c11fd61f26fb1e545e0619b8240bb735f30906aec6e7a5baffd3159589f9e2a6f609b9b04c45c5366d727b2a57e6a255ce66ad533ae9"}, {"a": false, "c": "mNbLCV^%dN>ol$;X)1-(R*cGqK@;r2K5nQ&+ZfI;IrFC2xbT?wQ2dtT?MQ1vbZM{t3KJ&4^MV57YVEjR-wUOoau*19aKGAiZSrejh?iC`)BMCBi1{pjU!A(1h!E%%&I5]YvE}thw=K&cU|IEw|+k0(puN", "s": "3a9a59d631a5a02ba92e85be5495d2d1", "hm": "d337943d784fb215e67516bcddfdd5ec"}, {"a": false, "c": "}BbL|-=%dNh0W$Og)<-pP*cm48~o$8gI){D^0s{k=Kwov$TK>wXWd7#J#%{i#2^fLEv1o_O@zD!ooJIS)7m(V+EQUgztUh?^v=5I$R^HJ", "s": "5309a90de8e86e0395eb63b323475c2b", "oc": "fbc7e113281a22b20543bc60ab168483ea17fa8e1eaec845a5876093e8998bb98f8af6fa71c253495737f87bab245c7f3b1cc80c2f9e0a7b"}, {"a": false, "c": "mBbL$V^%dN?0W$;gCtr{P*cmqB>r|+`y>b|qo?{uNXP2Xn#>Z}5D`6d0sM|KYYkxR^!82|E5sl86`rUrEk|7W5e+dH.nan2#lN-0Fb8|3STn}.h~!C5@y", "s": "fdff997c347462e00a242dda05edca38", "oc": "6467b74f13e30842f3fbb8299617124995a481208969a0b4b4c008f182b783fce1501613e29da33b52dc4d89112fe6a0ad5eef492201bca3284c0a135938b475"}, {"a": false, "c": "QhbL@.^%dN?0W$Tg)1-JN*cmQ|X0HB3o?-M)H&5-viza&=nq+4DPl!<%e*R}{RZ36dK=XLlHmD85*YpqSCk$NnhYq|i3yh,@WgN]0`s9|CuT5->=j&nB?f>vGIvw|gx3CM-nD;2bYnIe)n~DtWX{85BbS<_1V+JSQ#4oCfmEgR8dex46Z1xLQrn(PA):V^??Z>[fCr+GEIY", "s": "82e3d0710f47855dff6353687626c7a5", "hm": "8047da42a8416b62c305653db74a2f05"}, {"a": false, "c": "mBbKg;2~_:&h7Y[nWXU&=nqH4SzV_IDFE9E$Jx^zw5|4$Z3ZaiidiI}8V6-J,2^>(YC^U?oK#dzf4H>FeL_zO5Ld;r3aR3)2Q44iCfDE5R8de#`?Z}wIQ+nq*A0{V^??X>lfCrxjE3Y", "s": "3a551d5309a69d27a3beb510109832dc", "hm": "62b85eb076a2baaf20753f5fd895dbe7"}, {"a": false, "c": "mmbKB;2~}|&h78siW)UD)n|H48zV4IoFE9E>Tx>gh>*L$Z37ai4dimG8e6.J>2^=Og>^x%oK#UzQ)g6Fe-_z-Y6P0f.P%yfAd|iH^dF$|", "s": "01b9348178181f0f95466fbb55aacaf9", "oc": "0bc7a970a8792a327573bcbdc91e54fb47d00369dceec945a71061931f99894ceef9d64a62b0ac45c5376d09ab0ace96a835ce6cad0efbc5"}, {"a": false, "c": "|gbKA;rn_|&hH27#sXU&=nqH4~6zI)f|7H0_iFk!{f%p{>D^V)<3u@>Lo)l>D=DTEHM|_G`5(j}7siuoiq;}pQBYA1T~e8V|II7@m[5KFfd4d!zwY`Gvuh", "s": "fa68da52307b1982def22dd8e7e9d368", "oc": "f3679cf533b84c19a3518e1cece5130f0e7851642d734e088ba3eb94674d5b5ff3c1c9af5a84a1f9ede6e9e20fdd53c9e8b203065da87b54bba9c3b2d332ba9b"}, {"a": false, "c": "mB:KA;2~_|&hS87#WXU%=nqH#6KPWj;GKaU|{vzg-kinIGMB$L#2^>Og[^U{oK#UzQ<*>FeL|z-Y6h0ssi%yfAd|iH^dF$W", "s": "7d3808f2447003441b7ab71f9b81464f", "oc": "436facd53cb391a3bbe1d73efb971d81e730b5405de2619b76a1a86edbfe1c3225811fe04f22f93b30c046b33da5c8d7e18c58a5f2847257dfdb1ff051450cd7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (133, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m3bc&V+.+WNnTTGaHg#Y!wMH#s~j70oz_B24h3B^ib#[Gw1k)?~X*e;#co`#gYP7^Ru{SLJXx)sN~^!JpxT_ux!U0mrnp|#!", "s": "da0b97b5520d3bfe866c9616ea2fe406", "oc": "5b37eddf889faae2d951bc0aa99bd47e71d34389c6aece45abb662d3667988ce3ead664ab9b3ab4e656361817b2ab47ca66ace8ca898d22a"}, {"a": false, "c": "C7bJ&%+<+WN1WTQaHR#9!?]5#LiR6b=.oLZZs|CbiZyt3T&kn}(=yVC}1MWYnMpisIv8Cov*Tzth(7874C)8j_!2uX4.v>Jo#Y!CMHP~!MUi3EG,Xus}F>RdR+A08cn)+Es$Wf#6ZW=0OLEgVjA6}Ao9}#DR$Ix}Wpuh", "s": "db6884993674e121df242d5495e8c1a7", "oc": "6c67944533a3a885e302782a5273c71e69dca5bbf2ec50a64cf09887634cfdac332bc7f97de4b231ea628edb1b403b6ad1e28ab53c5dc3ce18e1fe2d28115868"}, {"a": false, "c": "EBby&Vc<+WNnWTGaH@$Y?CMH#6TnlqrvCB3r4ZXSlniTnhv~OQ#2{O0(Xq4,hP7^Gu{S-7XH)oN96;JpxThuJ4Uf>r#>|*V", "s": "38bf00423d782d446e7db0a5668d9344", "oc": "8c9a116e3c2591a1b3c1d75eb3cbdda7306ad17d565525483295c4519bf161a32ad4abbe2b095fcd8423becf2d70d6b9e1fa701c555173dbd8e4f0fa7dffb190"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (134, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "YBbM9-6wLt`y#?Fzn?N|[-Cw=%JKtIae!Q6ld$+#*N5*4e1H7+0d2uK.4gMu2=wT-W&ZB1{HvOsc%y;Z}u4vGPDwH-ElEDa2)GU?2zd3=>qWj)o3,PBGa90&CmF2XlMx%A?cgZX1WmIN#J>3Blt#*(@TBl<`9vE5N($VZ4P6-eW1V", "s": "14a3afe30fe7845df2dd9069a7e8ce34", "hm": "60221b6a42d8ab35c3051a358e4a6f4e"}, {"a": false, "c": "mBbM9Iaw<76ayw2*iH#8,ATnqd0Kl3`7xtY:30+jW$oC0VYEmnmDr(d5XlQ4npH3R?^aEq,lC", "s": "e90542b926ed30f6b97ab21e4dcfe4a7", "oc": "fbc08b8fc61f2a12e256bcb6e51881a96738f4a687ae7645856a089c154983678038f6cab9b4ab47c13ead92760a8171a685fe6ead0f42f8"}, {"a": false, "c": "mBb<.&&w|P6aY?bznG.|a;|w={f=p#GT1PF>!LQJyS5BTN8R,QNC+_4|eSUR1&ix-K%|(O$YGm-@6?=TOFawd$8QA|b?2=v$^#&;c1>(ayyq>VA<]gZo1WmsaxA>3NCt#*(|#Ba<*9,%o|($|_MO<-eW1V", "s": "3088a576f2dc99a0522e057b749ad22a", "hm": "a7f353ad78e8b78e88e51a3a72f17900"}, {"a": false, "c": "mBbM9-awLUvaC", "s": "fae9378178b8c723955b6593c337a32b", "oc": "fbc7a85fe8af26371153bc067da9841bb3dcf3aa26ae9405c1ba75ceca9999b88e1af6ddb9b806e5e5361d097bfa5f76c15ac76cfe9fd464"}, {"a": false, "c": "8BVM9(rwLU6[c?Hq+$d^$NnI=pL39-awLI6aZ`7xt[*3p+Dx?otnDYEj*jwrwg5qNQLnpO3Y?^*$q$QC", "s": "30ba005f4f78230ffe85d11af6f1b344", "oc": "bc6a9c6533b84183bb81d686a67bb0e55aaf75cc72fcb822f858c98b672020b4646cd8568b7c7fc773c5d37862ab3344b2711d2eeb497be6f0e22e89b5c10ddd"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (135, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBUJZA|9c,4eOsn6raw~j)cY`YLQ>Kt-RE*8LO2XQqL+Pqd_9_pv5Ap?C8#Mybw6U3&4h2mI|#2=-IPXqd!Z=?nND{rZIt~KP&!;ciB%7eX", "s": "d90b5eb9e570304484de2815e0bf44a7", "oc": "fbc53eafcedf5a62d5a93cf6a9df940eb7de9ba9cca834a5250a6b93b5994159835df64ac9739015c5b56dd2bb8a5076af35cedca8116440"}, {"a": false, "c": "qBbJZ5|Nc2:{OTnrraVHjQcv`LjQ6Xf_z~llv&x~<)?iI@Lo*>Hc_Zktlk4~D>cn6bBhEV7Yxg9B1?Z5g}l7_!8pGDK550`,!AWrS)kZXJ-nozActe?97I}xD561}WC4&z?X8#M@;+6W3&fheM!|#2`-omDjH(vYJq>!4XJd!Z=*!ND{rQIt~KA&G;2iB%7TX", "s": "f3b88b8178a89e9e965d6bbbc347aa25", "oc": "abf7a149581b35324550bc76b91bd00bb522a3a326abc440a5b7275a15a609677ea6864a99bdaa45153661086bc18076ed34aea5ad9f41f9"}, {"a": false, "c": "gibJdA}9c2``[snrr2?Hj)cv``l61ttDGgliI%ieveChO?CXfFY{n?+P$^696vGWMxVWuh", "s": "fadf09459674e2e043342db8254a2ac8", "oc": "986a2c05f3834215c30b8e1da4334ca282d6e9ce900122cfe6a23766887d68d655b331160352fa20db30ed60425d1a54e97f3fc3b6ec3f71423f8868a3228f17"}, {"a": false, "c": "%BbJZA|4c2`{Osnr?a?Hj)Av`6LBDt!>7UH#q|VDJg|S>Iu4vB}K`hT7DD=kwYJS>I]Xaenr;feND{rMIt~KA&!;ciBV7K6", "s": "3c2a026fbd6a831e617cd71f8681b346", "oc": "fc6dec652bb341a43be1d6e4077cf85275f22be8ed97a08ec5592becea2a62f677875d0a1ccbb5db5d96297f457138e1d0817d6ed9f3ac3dd50cff82dcb38714"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (136, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m_b2U&X2H{OM*~TZsQBAS3TOjj,QLIRB`c)1L*|T$1*;Tjw:5P;@y+w6)=89Czp;2_Xxu8r0l{La~V6xJIqm<_+pk2XP;g2B%cTeP6A", "s": "490b0d15301d92ff877b28210d0544a9", "oc": "1bc2a901c811f4340583b6a6f91f84d1b7d8700c0aa3c445a5b66884946ab9693e3df64ab97aab71d5366d027efa54710885c5853d9f43ba"}, {"a": false, "c": "mBbKU&Q2HrT`iMT2Gx`Tw8b3-_I`G~=N3`w1!;<^H-g>TjIP|P5@y+w6>-8VCzp#O#Xku8rOl4La~V6xNIzirg+puh", "s": "9aee9b6a2394ba42ef2f2dd005facfc7", "oc": "1c6aa76533b342f99d518e0c2c9932bd122df45aedf02571984d8fd6f5e0890e1ece1cb2a17c9be7deb725db5ce69bac9b4a5c0f0b2e6eef9f941300e9319932"}, {"a": false, "c": "mBb_c&)2~kTUH~T2g%nN#v_Xku8;KlnSa~V6xNIbiz_.!O$bcpk2XPyNNYZcTePRS", "s": "0dba094046080ae46a75b71c128cb744", "oc": "0ccac86cdab6afa3bb0157ef04ab5a97d2435b5c7874524a869de0063add66115b8660c38354d52f3fe7bafc156a5d1538e78fbbc4863f45c3f944c84f5ae3b7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (137, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBPmWIPx`2U~Gj~FvDu|W|3DVYWwCcQRgC`|m)M_JK~Ub(?be!u>7ijT0IMGn)}(Xa`9*UnQ)h#h>!knzE<&IQtC}IiBKSMwhyiZ^``-+G@`M!+Z4VI61!?)?cRTqg9B_9Dgfj$27d3{SskzcwSied?&-}4_@+HcY^@#&QThTC^n|Of|Co4lmzGI;5Np!}>]Drl72", "s": "9663e601b0e7c25132a908ef7729cc47", "hm": "476d5bc9a8487bc285fd6aea8644d417"}, {"a": false, "c": "mBbLWIA1XrR~GhyFT*#}K|+DQ8)c8L(X9`OZ-qchIlThD)`VV6a}>VGeDILo#2{_&wl+8_wnnBUhg4vtg-aWQNG(kcGCHK2{T7G3nx^o@", "s": "610497b420dc30feb6eca91c6e04e407", "oc": "f0c7211898af2a3f7f5387e5591ff20b9cddee2ec6951445a5b16793d7998869851d664bb053ab4bc5736942552064762675ce9cba9f45bd"}, {"a": false, "c": "5BqLW$Px0`a~phoFeD#S#-+%VLVlE^D!=K0#<-<>Q)|48N1OmPZ`=bzO||c^]Q!}b;yS(AN%XsAQ$W-pHFGi-2H!)9=g]YhiH#C;U7KhvG}n$6KZjopHcj^@#&Q*OTu^_7Of=hoElmzGIV5NP!2LG~1lcz", "s": "619a7d5609369df3a42d8c1659e5d2d1", "hm": "6ab15dc376d9bf7f8675181ed8ed6047"}, {"a": false, "c": "m1sLWIPx0`a~Sho}v~#Sgo+DV8)}PLWX9WwZ0`cs7kThrIdVa6a}NV%eDmLoO2{_$@", "s": "f3ac3ce178d8e09f95528b08cd371c48", "oc": "fbc7cc1fca1f2a321fad9d06a914240b57d828afc6eec448a5aac714159319b687a4c64b49ef7b4ede5664d2e42a545638758e6f7d9d42bb"}, {"a": false, "c": "mB-TkzPy0`aTGhWFvD#S2|+DVCCe8R*CjXA0=X>O3QaBo{chZSG|0Ou)_pau.VMP=A[{HN8DJO%8_kq?_}J|M;4wdu3", "s": "facf99d11644e2f2b58b2cd80bea4ec9", "oc": "bc5a96753ff32217d3214e1d32451e8aba450dcc0e42a86750081e8f217bba2d5c39df73bafb18dc0ab23099281a7c5510b42f8b824c911447b041c1ee5bd7eb"}, {"a": false, "c": "2BbL!IPx0`a~GhoFvh@SK|+Dwv9x-khQNG(kcGCHe<^T7Z3exz$@", "s": "6dbe07294d783248b7dac71f6681b3c4", "oc": "fc607c6539b341a37b518eee18cc2eeae85f03c135b6d85190e919e5e1a2f512b8c4241838e6d9682861b94d71b5ea21ed5d81f05bb6029be215a5c090ebe3b2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (138, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "@Bb#s1c4M)W9q|6444@HGv|,{Y9^GV]5DAJM-=tmtvuFe%rpm|!bIFbJR38gf{L]JxCAz$qg;@%dg;jo1i6*=>!NvDVAgB@BP`h0)KUgxm>_}JT7gjUT|TmFto50k}P0<0453>AfDQWt`tCz*if%8Q=~MakT$d-;E$Vz8$*Zme1YEm>!89", "s": "8293460107e7845794149769d124c795", "hm": "a062d294a748ab32236c8a0d1ecedf19"}, {"a": false, "c": "6.bBU1c^1)<94|@64h(&;vDK{8(5Xe9m`dORv)XLB?yheX-k7qH8&Dwu9U`G#F=y8)Is-1kJwGMEK{~Fm5?^5*W-Pvh8xs(9(}kX{{+B>", "s": "ef3b92b580cd30f1864ca818e9cfc4ac", "oc": "0ec771e6aaa9220afebfbcffa3182d9fb7d168e01baac3429db8a12313b939dcdea2f6d2e93f7444c5334d491b27547656d50d6edd7349e6"}, {"a": false, "c": "|B=LU1c41_W9q|64*%(&;vnK{LTA1;Ah2Lmpi*@*IjxKXWEc&P8SNhDNcc+-tM4iz*iE%8Q=~zU5T$5-;*(T98_*lmekY|mc>82", "s": "239a245601869d70af7b89bd5490c201", "hm": "9abb1dbca8d2373387e5bca13efddae5"}, {"a": false, "c": "mB5LU1c4V)W1q|6d4o(&%U|2{8K>XFKm`5Oa4cXL?&wR1X-|Gqt8&ywdvUEG#Q}q8Knh31kKwGMEK{U1m5?^5*Wizeh1xf(9,;k`{p+C>", "s": "f36934e8581b811fc55b6d4413deaa27", "oc": "3ac33e5ece1f9c353153bca5a73f250f4fd8fda9abaeb173a5bfcc951579f9698eadf6444592ab42f596bd928bda54d6e652ce6cac781966"}, {"a": false, "c": "mB*L!L0t1)W9q|681+(}4?|K{g`t|Y#D@9Djq(>i{Hm{]&kDG=Y&?X@yC!L~=puh", "s": "0a9b927546dae2e0817525d8b8eac924", "oc": "0aaa9c6533960619030c8d1c971af04825136d81443e37370de88d32d00578fe9c20c0a2dd1c762e76f8d9bc7c60c76cfefe6333414c501fc7a942e6708b95d9"}, {"a": false, "c": "m_bLS1c41QP9q,Q>4h(&;v|K{3BUW!oX]-%Zmv?vR3|wjRRr>=Fa[y8s`C{1kJwGMEK{UGm5?^n*Wizvh8xMo", "s": "9d2a704f77bf2a496ebcb71f66813345", "oc": "db6a90953bb8d1e3b48dd80c99ae4a89cfb759c8456e218295a77db6a83baaa1c2c81b41fd10c40bf4926ea0ddefc81d56c936f23cae095ab64df08f46c4de89"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (139, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "nEX3%K{*SBKD*Asr>W_keTg^cYMebS|8fb~$D>}F@t{`FHg^0Fu7SMZ1vXkJD2W}wLQ{zTntJ;2)s~oVF-~ubVZ$cQL3P:06aWT>mq>tkL5uP2i<$QK>yr9n9}79k[Csetm2#YH79l|ej+IWkkO%kdKy=q`&UkU8AfqQhbrOMF>PRY{>RoqH3fl(qgse6t_Yr4zuo+T&_TKZ", "s": "a48a26090f97845fa2b492797e248f65", "hm": "f1c74bd2a845ab9db30d6a9db854dff6"}, {"a": false, "c": "m{bK%Ke*MeKDAAsW>G~]epZAc8=p9%l%q$u(m@yN!n39@89:;-k}lgAABSZG#2E~WM4&gVf>A@xwQLC@AfVZvrGD_FaHE0tc.!)*ANZ}s", "s": "d10d97b83d7d403e867ca4d6ed0f54a7", "oc": "f12383104810b7c5459eb700b87f1f0bbcd873cbf6aec147a3bb6293159e8e698ebdf66a77ccab15cbba1d47774d58589639ce6c1e7719e7"}, {"a": false, "c": "rBbK%KsiMeKDQds#yI~keTZAcLWs1p86%l0=C-c&tk)f~~u?D4tHX*hf8>+p-cokDA@{`M>vn89dvv!ba%!P+71`ld_F)I<9~6fVUF;!iukWAG`^.1dArKMF>C%CS>Rmq|oz0(Ggse|t_Yr_zuq}T&_g7Z", "s": "3c9234b901969db05637f6515490325c", "hm": "6ab45d1a7262e77f86722c16d1fddbec"}, {"a": false, "c": "k:b0%Ks*MeK.AAsr>I~keTZNc7yp9%=%q$urmmHN+n39d89A;-u7l&A-BbZf#2`+vz#$NVusA@:w(4C!AfBZ>rG%_DC.E0$cd9zODNZda", "s": "63193281782e980f9376b3bed4fea72b", "oc": "7b37a11fcd1122328a538c06a97f6523b7d6f7aaccafcf4517b969831599996c8e5dfceab9a3a1e555fb190273754473e077c0bcae776907"}, {"a": false, "c": "}BbK%KN*PeKxnAyr>IVjeTZAc5Gf?P%Q;%OtEuX-Gy7qY)3lx:8s|p`hP(ap:0mDF@6?L!:WOs,JPV=e5Q4IkOPEY%T!XezrXO3>wTrY0>xdR>H15^rpuh", "s": "fd6f9a78b67cda7b0b2526e40566c9c8", "oc": "f36adc65e3f3491653a0483af275762b844c0cc4b330e6ef45ddea88d084afb920f591349fbedd9ade21dc263f1fc24e11743dff2110fe62b7e4bf4170d48ebd"}, {"a": false, "c": "mBbK%Ks*M!iDAAa#>I~3aTZJc6Gz~_22KCek~e`Y-}>kaG;c!K{2`Ehz#$NV[^{HdX$cd!znANSN.", "s": "55b0004f4f788144427cb0196581b3be", "oc": "086a99c9e3b04ca0dbf5d231995c4a608e3b0e300a35a7f455dd2cd930ad8342503fb1920426bf89cf16984ae6cbf9fce30de6b4e02245050788eb7815670cf5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (140, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK(pyr$A~ACXmOIVmO+}IhuOIDe&VR~-pr=IX%RsDT!o)!LDlefe)BmHevJ)$So#vuEPS7W@#mZ*?!@eVkqHX!zCp>;@e%>;Ni{aD;H|Xyb#X^>a|aFmn>vJ%-y", "s": "949533089fe7f45ddcd49be9482ecf4d", "hm": "80743b74a748ac167405b0fdfe4e6f1a"}, {"a": false, "c": "8{IK(pyr$RQACImOIVmOY}IYu96ceUg9-V?28@MEtz#BY;^:a3rFEjd2cR8q=fog54Mb<K?J%zy", "s": "186b97fd2a4530fe867cb8860dbf94a2", "oc": "fe07a16fce672a7e89567c06a9102a0507d8f3a396be524aa54a673315992f69b0a8e609b96aab48c436ce02ed2a41a6a63cae5cadceda4bbe7fd84302ecbca5"}, {"a": false, "c": "mBGK(4y7$N~LbXpOIVLJr=wKvO8Tn15&2HK9G$9Re-@CCh|tE?}UTtZW`BA3^P-GzWm8Q=`6D9{?KvQ%[G", "s": "f3bd378a24186bba95c9dbbbc387a40b", "oc": "f227aa68481f233212534c06a9892900b7f8f3accb7ec047a5ba669e159ff979858dd63a69234e49e5319d01c02a5646a63e716ca29e1a56e639184f8eaccee9"}, {"a": false, "c": "^B]K(pyrFAQ`CXmOI7mOiemvDtt3;?tw0vKyW4-@9##N^G4A#daWCrOD8*Bk)0K=lm|fF2cl=ilYv1hZv^@Z+0(zr7YhCqo`G{};mF=pBd!+;7>KvJ%zy", "s": "fa3f99753673e96a512d7db807ea8ac2", "oc": "ec4a8c653db19219a000b7db750aa72262edd20dd05beb6e5428484a189181a53335cc558b1d003e0857417ff4a91a87b5b278c50f66c2183331ed6b4c7db05b"}, {"a": false, "c": "mBbK(pyr$AQACXmOIVm!M=Lhu9n`j}.f83O>X4Hoz^|m=jHchQuf3l(YMeUpvg$Z+O(%r7lhC@8pG{@;RF=bBK@+;{6K)v%zy", "s": "3c41604f4e78254a2eccb10f6e1eb041", "oc": "cc8d916e038321c4b421d83c495dd22491fdc8aa85385621127783970ccd90b56aff1b89bcd50bb49bb09b14755ed6d831030908e195576583716141ed204484"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (141, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "GBbL@VT%d7?0W$;?G1-lP*c6mX%JhW0ZKX{`^0s{k=Kuc{$G>>6X]973J#%QLi2^fogvAtROazD!o7JI}{Am(VBEQY^ztUh?^@=|HRRbHJ", "s": "538bc7d5200dc1fe00ac8816dd03e4a5", "oc": "f1c79f7ff31f5a629255bc01a51fd40b50d8f7a9ccee6cb5959263c6a3992f698aad064a26bb2a45c03a6d0a75ea7076a637ce6cad1eda1b"}, {"a": false, "c": "-BbL@T^%d7?0W=$E)1-J,*cmqK@ar|K5qT&!~8=;IEFg(#bT?wQ2^uT?MQ1vb$M{RdKJ&)I{{5qYV}?RAwUOWauOs|aKGjh(S=Aj#?iCW)BMCBBy$w)z@A<1hszjuhI5$YIE}tXw=uucU|I-wG+k8opuh", "s": "349a5d56ec769801a02e840ba490cdd1", "hm": "69a76d0578df267e366c1acad85d18ec"}, {"a": false, "c": "u+bt@V^%df?00$;gcF-JP*cm*8w1t{gIH1(^0s{_=Kwcv$GK=wXj973n#%vimP^|@gv1n_Oaz[!={dI+o7h(VzEQ5^ut7hW^{ulIR$RGJ", "s": "f34937dc788af898955b6bb019afa96b", "oc": "75a7d16fce582a3c150f6206a94f2408e7d8f3aac9de8415a60c619315998f6988adf69a69beaa4505e60d7245ba9ac65665446ca09e348b"}, {"a": false, "c": "m:bz@V^?dM?0W$;gG1-JP+cmqBQr4~%eab|qoX{*,XP{S#fUUacnf690sM|6wY5xR!!,2|E5s#Sf`r5r@k|7W5a<;H#nak2jlNO0F~8gaf@nwET~!C5(y", "s": "ff0379f5994d1bee6b24bdc5058a22c3", "oc": "f4690365a3ba9419a300d3291ee91e393aac8a20c6994007de25b884371843f6e5061613fbb8a3d2c3d362891eff9210a6387fd986af6ea3989cb157523829ec"}, {"a": false, "c": "mDgL@V^%RN?0W$;g)k8JP*cmqUj,nB:f>vGiAz<66-hqZ}xLQ1nq2Ac{V^??Z>lA9r6A83Y", "s": "9493b6000d69c4fca2168389ad63cac5", "hm": "cc1adb4baa785b32b3018a7db24ed316"}, {"a": false, "c": "|Bbak;^~_|x37870WXU&XnqH48zV_>)FE>E$Tx^BG>oLAZRUaiiRiIG8B6.J#2^>OgC^U%oK#UzcxU=oeL_M,Y6h0ssPAyfAdLi{zdF>W", "s": "40989ab5a0721c0e8d79ab17edcf91a7", "oc": "d0cb34dfcd6f2ad2c553fc06a61229ae97d8a5694ce8ba41f1ba67931d9909b98eadf64a59b9bb8565364d00bb5a54c60aeac50cad3edb8a"}, {"a": false, "c": "}4bKA;?~]Z9h787#WqH&XH#H4*oD%xI#+KZ&%7r@c2TW#>B`B@g7m&?|HqVaKhOY{yIKN|aPs2dC}n9ug2V8CQw6L@ON0~2>4f^O5Ld:)=aRe{AQ#4;C~mE5R8d@-4qZ}uUQg|qO4G{x^`?Z>lzerxAE3Y", "s": "3a2b5b360ab687e0deee861b54902297", "hm": "65b71d0d78d2bc728ff51415bbfd2be7"}, {"a": false, "c": "(BbKATq~_|&-t87#OgC^8%oK5UzQ4L>FeL_x-l6Z0sbP%yfAd|[7^dF$Y", "s": "f3bf972e7838610f9550ebd9c3c2aa2c", "oc": "f5c7a52fc89f113a475a0c06a36fb45157a8f39bc6a24495a5da7799159489668ea3f67af6b3ab4fce3e68e9fb255b77a5671e6cbd4ed5ca"}, {"a": false, "c": "m;;KS;2!_>&h76:sWXL&PFq54Ca`;)f|7H0k#UN!sI%p|PlPg~IJj@>GQmf>D^%TzHOhS^U%oK6SzQ4y1F*L_ztY6h0siP%A5JdG:y^|F]1", "s": "30b2047fe47e0344635ab71f678ab24f", "oc": "c4ba3a6233b613a32b9d2feef1fea457b7479c88cd32b1d70fafe6fe0c4f1cd2a467ae20f3a2ff5a348002433db703d175c31817f1473a180bd171e0e14a42a2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (143, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ&V+<+WNnWTGaHg#Y!CMHGGUS#0CzHB242<#d#{#l=wN<@c67(S0>e[x{!!ht-Epo5#C-8ZJA@rlUcJ`#.{En(ES~PZP7^Gu~SpQX*)xN[Y!Jpxz4ur4Uvmrop|*!", "s": "09e35735177d5bfe867dad1fedbfe4a7", "oc": "fbcf811fc81f2a321553bc92a9ef23dbb8d8f3a900aec445a5bb780315398a29feab164314d3ab45d53a5d027b672443f53fca55a298d7c1"}, {"a": false, "c": "mBaJ&V+<>Wdn-T>aHg#Y!CMH#UiLZdAJ$LZZs|CbiNs_YT&vnHP=yVjm1M9YjM}isIv8CoL6T%th(M87{3)8j_!Y2X4FZ>Jg<09@x_=DFfR|x?jX}u.|H34B(*a8~O!cgKJ3-sKN*`Ixs~!A68Hbqub$8!", "s": "3a9a5b650136fdba822ed56b5490d0d1", "hm": "1ab758b678e2a7778602001a08f874d2"}, {"a": false, "c": "mBbJ&V+R+WNnWTGqHgCY!CIH#8-d$231qyoGQ)zTC|n<6^UoYt}gUzR_U#J`#<{bG(Eq~PZo7WGy{SL7XmEsN#Y!Jp[T(uu4UCmrmp|c!", "s": "fbc9c701889491ac155b6cbfc3a34aeb", "oc": "fd84411f181fcb3c1550bc06a988343bc780f3abf621c1653fca679395e989098e8df64b69b3db46e5365d00dc0a84eda225b27f946ed8fb"}, {"a": false, "c": ":BbJ&V+<+FNnWTjaHg#Y!-MH#B}MUqDE}I6$OIFDSdRu*>|c>I+EOgWf97+dkZ_Z4)2}>i*>lL#*(|HBa:j9v)5N($VxMP&-eWoV", "s": "0864d2016fe70d562c1a909577293745", "hm": "8037dc44a8c81e3295027a3ebe44cfc6"}, {"a": false, "c": "m{bM9fawLt6a<>)>n?~|a;C~=8xL;JTS5Bjj3R|QN6+X%aeSxRGzHxfK1P(>$YGm}@6u>+$F_wtB8#t|boP=&$^9B#cfx9aoy)S[A{cgZX1WmCNxJ;3Bst#+O|(r4RJ*8L$2WQ.t+Pq{_]s0vN<&V}uZTbz)+?9{4+xphxML;Yd+`wxSdO_}4OF;Kwn>(-AcY{,+$%1przTUc}<01cdZhTFF;pBh=0=B8`h@8O!ATs5t(bz$Ve*;3X1KV6FnhAWrE)*M;J-nozAcDu.97I9)~%6?}8C4X$Z=r>x$1ojnk", "s": "749576110fa72e355214a0697759c745", "hm": "8077d44d644dabd2eac5efedf248dbf6"}, {"a": false, "c": "mB@JZA|9cg`cOsZrra?H|)cv`8ku0#XK}S(ywn$>)pH98#MyEnJW3&4@hMy{#2`-TLDz=-vYJ)PA4Xqd!v=;QNDRrdItrKA>=~ciB%>e<", "s": "d30398b581a930fe8839a10a710fea47", "oc": "dbf3a13f881fda37158f6cb6a9c9a20dead8d7c926aecbc5acf6ef9165d089793eade509baa3ab474536cd827b2a84d0a6a5cb64ad9f41f9"}, {"a": false, "c": "mBbJZA||cV`{OsT>rk?Hj)c{`{jQ9XTp_exlv>x~ZzhMIh5,x>H`1%kglk([D?mnL}Btr07]BX9SJ4Zn7}77_!eSaq#i1r4&6AOUpGDITCLrOMAWrE4*M{JhqozAcDKn9!I!,DC61}jX6g$R=9!U$hof&k", "s": "aa9856f6111397d0ac7ee5185593d2d1", "hm": "6a375db7482eb77ef73a121ad240a317"}, {"a": false, "c": "mBb9ZA|AcB`{.sn5ra?HU)cv`8vI0{XK}SSyw%$>)p?$8#My;w6W3&4|>M!|k2`-T~3z=h,Ybq>I4XXdnZt+nHwHrQIt4KA&!;ciB%7eX", "s": "f3b937017818616f18586bbbc370da03", "oc": "fbbca14fc81f39321583b606a21f2c41b7d2f7a9c0ad1a459c77179922038b298aa8f64eb9c3ab24c5366d0c7540a48616a5ce6cad9fd104"}, {"a": false, "c": "mBbJZA|9c+%zOsnrnafHj)tv`C06Pt}DeglJ1}ijveehO?C3fOY;nXzc(O6{h}y_Ad^~yBOzkaLTMouxy{ib80>q7vFW5xVpAh", "s": "0a6c91903bb4e2e0d62f434186eacac6", "oc": "f46aaf4643b34213a3018ef35d138322d3604b7e5c0022c406af33e81b2b78d682da9966c505b7cd1464e80842fda08e02a031a3be8c9f704a2d182179228f07"}, {"a": false, "c": "EBb~ZA|9cE`{fshrra%H0)cv`ELg5t#>4U&I?|VZ}g%~lyV4vB#2`-TLDz=hSYJn!I4XQd!j=+(0D{rQIt~nA&c;cs,g7cX", "s": "39ba004f4edeb34465f6b7146681b34a", "oc": "fc6a511433be2913b741d5ef0b7ce708fef8ac7815e8ff8e44622be8792b92317707519a4cc6b5ebada7192477da95318c860dded1fe6c8cf1cc0f02bcd3c696"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (146, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKUhX2,TsUieu2sQBASN*Ojoi!OIHRTUi~T2{d8U9!nC$|-:5K>;1W;$:)!g>2jwP+;hKJ+r6)=8kCzp#2_Xku8r%lYL%~VaU-,(iB_--Q$xPpk&XPy(2G%|TeP6S", "s": "e90b9ebfb17d203af67ca8d57d0fe4f9", "oc": "0bc7211f484aea30e5528106a71ff40b3758f3a9c6a0c7ba75faa735f5ec8be99307fc4ab983a845c53ccb7d7b24597a9195b5a84d9f42ba"}, {"a": false, "c": "FBnKUSX2}2TUi~TmbR8c9!nC$LSHOB9D88!^t?g~@pAJ-vj?-Yu#JW(KRv+MRSIG$=H>`^n8b$&_68G&#nT9|c-|J+tMASNTOjoiQuI`Bqc){G*FRJF5D2vMPKsbu5cWOKC$8Ng*<>s18;<^B-g>TjrP+P;@y+w6)4~gCzp_2_Xku8rKl4La~H6TNIaiJ[+wO4YPpknXPdN2n%dDeP6S", "s": "9cb357517f18616b28eb68cbc731aa5b", "oc": "fba721196614233e1f538c167d1fc4fb08dd23a9c9aca4d5a53b6793ca998969ce1d67eaa983ab4324966d027b7a59cb39954e6da8afc2ba"}, {"a": false, "c": "mBbK0&m9H2TU!~T2V+h", "s": "2b6b997d310ffde0db0f7dd8008ad0f8", "oc": "3c8a928573374f19ac016e5cccf7c27db3d98e8be26d72312869e2dd686073b7d9ac874b80254bef34ea2b0b6bd6aabc4b2ab50f37ad6decaf9d110fd0155930"}, {"a": false, "c": "1BbKU&f2j2TUi~T9+vN=zA)a`9*L8v)h#C~?nn{@rt&Q4)}sbBKs`GBy=Z>kvJyx`^~`Ce.@]M,b6xMRA1!?,?w%GqLCh{QhgfjXv_13!UXkzw`58ePT2kG~r,dz", "s": "e49fd4f70677ed4f529403897785c065", "hm": "80687746a8e81501c3253a3dc64c2316"}, {"a": false, "c": "m}bV^IPx0KboGhZFvD#S{TmDV8)c(L((9VOZ->9stz&{D``VV6a}Nm%eDmLo#2{_Kwl++Rw8nB3|_?V[g9dWGFG(3f,CHK2#T<&39BoR@", "s": "d91e29b54070b2fe207f981ca46ff4a7", "oc": "f91ba13fcd1e8a029c66b906a5172c0d47aee3a956aec0e5ad1a099ffb9689508eadf64a193aa575648b4d067b2254e665e5ce7cad9f20bd"}, {"a": false, "c": "mBVqWIPx0{M~Gh2`v7}S^T:n9LVlEE>!}1mw5-+$Q|H48V1ODe#i={zO||c}xQ=}b+yt(ANAX:DQfW-pHFGi-2]%^n=8*,siH{R*C7KhBGY=ViF%_oqHbYR@#&Qa#Tu^_7Af|hUvl4zGKm5NP!=kG~rl7z", "s": "fd9a58e00370cc00a9b3856bb49ed2e1", "hm": "9a172dbd77c1b893d6c51a1ad8fd4287"}, {"a": false, "c": "aB[LTUP!02a~GhoF6D#JK|+DV8{s(L(X9V59->cs$@", "s": "63b13781c818622f6d9b4bb1f327ba25", "oc": "fed7b11f78a12e36315aba06a818240bbdd833a2c1a1c4c5a54a689337968217feacf67a19b33a45c5362907cb8a64dfa235ce7c5c9f4a66"}, {"a": false, "c": "mBbMWQjA0Aa~GhPFKD#SB|+DVCCe8R*C3LY0=X>Owf?qR8^WMRfsDwr$<@D%aU(kLdkQQ-)o{chZ}S@=Ou)3=autVnPHAF?HN*}=|P;Owpui", "s": "fab89945ced416e0fb252dd405e1cac8", "oc": "fc6a9362a7b343165f055e1d47471beab1476e240e626707d597d67f91b073c48322ad722afab5930a2e1499882ad5afd057d4b270dce5e4d770f2c82e0dc857"}, {"a": false, "c": "m&b1WIPx|`a7~h:FvD#SY,+DV6U4E$E^11oZov2xsxV1cuBCqV#2^wkjl++_w8n{?hF?vlgXkWQNG(ecDCHK5MT7Z3ns>%F", "s": "6494e0a8737723445d75ec830aaf9674", "oc": "fc9a9ba9b3a7cea34be27c13081c2eda923959e2f2b3882148e780f6e11bf917db69d1f948c3f96ce2c2e42191bd4f31f0096d914faef262b840d94deaa98e13"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (148, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "4BbLU1}<1)W9q|6Boy(&;v|K{Y9^G7d>DATM-}tmtvJFD-rpm|@bIFbJ_,8)6>L4JxCAzZq4;J~zZCHw&;>@%Qg;}D1i6h,b!4vqDAeB%BPNh0){+gxtu_ImZLgje%=Ma3tP50kkCVz)R1e|jcJHz^Z%u0<045k>ATMsXt`juz*iE%LQ=~}5kTfA-)EXVz8_*tme3YEgq!82", "s": "a243dd060fe4865de475206c7d599bd5", "hm": "8367cbe4c836a4468505655c3e4edffc"}, {"a": false, "c": "HvbLU194~H8&?-uv7Uu#2}y8sIw-1kJwGMeK{UGm5?^T*|iz}u8xf(R(;kY=p+Bn", "s": "400c97b90dbd4995761ca818ea0feace", "oc": "fbc8612fe81f2a3215032c05a01f241773d8d3a9c5aaf247acba919391b989118e8dff45b9b0ab13c5368d027b23f786a63fce625e3889e6"}, {"a": false, "c": "mBGLU1c41)W{qp64Th(&;v|K{LT{1A!h2y`pi*@*d[xKZWEp9Yp-dc<1#`lEt`3Q%w2bvCh|Gw`dVo9fQ$%6M)g|AN[cy^dA?MQ%]`tTz*{E%zl=~zakT$5-PE$VzAi*Xme1wEJ>!8j", "s": "339a5daf10329d07ac292e1da880d4d1", "hm": "6a875deda882a79416f516dadce3dbe7"}, {"a": false, "c": "mBbLqIX,Vy&SNpV+9b6qM#IO|>fjq>P,CVPKL@k}G}d8?X*yf!_V=puh", "s": "2a6993120a54e1e0cc241db805e6caf8", "oc": "4e6a9c8533b34319a301de8baa3aac482a9581a1d6347a9c3d69894120f5f4befe7ecaa4838c71899c2950e49f15625e3bf963ff445a581f26a9f946aa8a550f"}, {"a": false, "c": "mBALw1c41)W9q|6S4|(&;v|K{6((WiJ", "s": "feb9e04f89782e46697cb713660db36d", "oc": "cc6a8c6b33b341eb7b61a7dc440e453ccbf047c1469e514205ad2583ab363a9b62a872ebddc6cc07f592fe3fddefa81517a975e73c088053164689198b44dad7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (149, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "[gbK%qs*MIKDtDTrFIUkeTYWpYM9b4|8fb~$w>=FjtZDFH|IU-dESoh1BX`JS2W}jLD}zT9bJN2),~o|Fd)ubVZ$cQLhPHK1a}ykmp>t*Lc:PW|iJn$>yrXQ5$7nk+Cs7im?s.HK9lde?+IAkkO%6dKy3qGPU^Uj_Uq1d^rtMF>gUCS>bmq|<~0(Gg|e>}>nr4zu{AT&_@KZ", "s": "94ddd65102378cd4551693e0d709c741", "hm": "805fdbf1ab4bab54c7056a9e3e1efe16"}, {"a": false, "c": "{1b?%ls#MeKDAAs|>I9keTZA38$pa%Oeq$[rm@mN+E39d83A;-A7lQA-BbZ2#2`E=z#$NVu>~#CTZAcO(J-p[Esl0WC-c5DT)f~Ku%D4tHX:4f>4+p-cok(G@z`MYon8Tdjv!:a%!PS7AkG?Uq1d{HOMF6P&e%>Rmpoo~0(Gxse6t_Yr4zuopTM_@KX", "s": "aaaaf44401168dc0498ee4c60410d2f1", "hm": "d3455d0db882bf688175161a68add656"}, {"a": false, "c": "mZbK%Ks*~e%DAAs^>]%Onq$,rm@mm+n({d89A;&u7l&AtB%Z>RE`E6z#$NV19", "s": "5a3937817b18919f25596b2e03baaf43", "oc": "dbc7b11fc8ec2a328c53fc16111f0f0faae81e0906ae842aacba69931af613612b2036433918afaed51619d21d2a04760635ce634e5e5907"}, {"a": false, "c": "mBvw%Ks*[QKDA1s!>IZkeTZAcCGf#P%bRtTrY0[o-R>61I-rpuh", "s": "ba2f0b15367de2e0dbb42d8005ea9aca", "oc": "fe6a2c6583bc4213ce00d19f72bd182b196c2cd4302281744eade57f978cefd923fcf5fbb79e039fd9ea2606c9ae2a46227d361fc779376c5fe489c6c0128f3a"}, {"a": false, "c": "mBbK%)syMe5DAAZr>I~keTZAc6Nzq2]2KCkk~e_Y-53&aG}cRK#2`Ehz|$NVudA@xI(4C!AfBZrrGLIDCHE0$cd,zR>NZiI", "s": "3d5d0f2f4f7823456b4cb74166e28d44", "oc": "2cd88c653cb364407be16b3ae95c4a62e7c8e2321e35649478dd2ea13766830c566406b99d201016ca649a86554b79f8f32f78b40ace3054c775fb186417a475"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (150, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK(pA@$A(A?XaOIVFOixIku&%De&jYXtps=JX%RsOT}UndLDlHyj%BR1gA&)v@e~|;}i)hD;H2XyUGXR>awaF#RlC}o{|{(;RF=buK!^;_YKvJAzy", "s": "9893dc000ee2845df21d9529b729c9b5", "hm": "ee61db4d684e8bcbc385483d7ac6d2c6"}, {"a": false, "c": "mBSK(uyr$ALAC^mOIV)ML}IGu{6ceCU9XV?28[M-tEnR(;F6<3WFOjd2ERTq=fogcYM1#Ty`6bR{?&B|]g}A!JgDz2*_|{%^1GO{WxpHPX#dcI<{TZk|FIW6VzO){0#XB?_pG^x(2Mz,!=L0{V`S", "s": "0a7a565601b19e00672e652b54b0d281", "hm": "6ae70ced78d2ba7f867f161ad97ddbe6"}, {"a": false, "c": "mBbK(py}$AQBQXUOIV%q#}UWuH6ceUg9DJ?28HMVtz#Br;^6<3WFOjo2Ej8q=foucYM1]]v^CZ+O(yl?YhC`o{G{l;RF=RBKo+;7>Kvu%zy", "s": "6b3d377a1d53c8109fa30bbbfde78a6b", "oc": "22c7a3dccbaf2e351553bcc6d91f270797d843d9a666c331a3bef79413b964698ea1b64ab913444505327f02ab076476a055346acd9eda4be835d84c10001fa9"}, {"a": false, "c": "SBbK(~yr$AQ-CXmObymOi}~huBtU;>Oj4n5yB}l[InAs60X(#daWCrK82;Bkf0K==mV1F2cf=rBYM1<k4Io4^|_=jmcM`uz!)(8{ob?KI{gv(7ToG`1W:Rpe%^$z!*^b3x7KRu}6g[.{QOV|F8Z2rN8,kCWCgDl=!FWl<-IZqW7ljFiM6K1QEj:!2<1hceF{1II$pIE}thwNuucP|IEwG+k8(pvh", "s": "94e380f10ee6c38dfcf49b697529c735", "hm": "7b17db52aad7cb72d30c6c31be0e0c16"}, {"a": false, "c": "miBL@V^rd}?0W$;`)1;JP*cmqVw1tcgV>{D^0sxkoKacg$U{%-Xgv7PJNZRkUCKfUg)1o_SizDT=o[IS)7m(VzNQU^+tJv?^@=oIR<^HD", "s": "b20bb7bc7a7d39fa8671af13e708a4f7", "oc": "7bc2a15fcf1f09591f5d4c05a9af98e837d11a1ba64e8945c5baf79a366d81b98eadf64ab9693b4585264dd2fbca597aa635ae69a39dd815"}, {"a": false, "c": ".BbLWVL%dI?FWR;g)0-[P*cmqKM1C|K5qT&Z~Ue9IrFgo#bT?wQ2^@T?MQSvb$M{qZKJ&)IM{5qYVSjR[wU|Wau*19RKGAhNS|Tj=biC))BM,B41$3UG!A<1h!]%s1I5$YIZ}>hw=4uc^|ISwG+k8(|yh", "s": "3a261ae671769100a9fb85127b902263", "hm": "adb0cbb620d3c07d867a361ad87904f8"}, {"a": false, "c": "m5bL@P^%wNo02$5|)1-J%*K3q8wjtkpI>{w^0s{6=Iwhv$GK=wXj97>r#%5ttX^fUgJ1o_jazD!=oJ>])7m(VzEQ!^z^Uj?^@=ZI`R^H?", "s": "7ee936017388610fc55b4fba3337ad2b", "oc": "eb279b13c80d2a5915f3bc54a96f340567d1fba976a6c4e5aeba8d96fd396ec70ecdf64ab9f3ab45c536ed02732558d6a29ccb6c679e6413"}, {"a": false, "c": "mBfJ@Q^}zN?0We;g)1]J)*EmqC%r4B`y9b|-oX{u6fP2PSf9ka=Sw690sg|6wY5xReR8z|EaslS9`P5r@kv7W5Bgv14_O:zD!=on4S`)m(pzBQUW*tHhI`@moIRR^LJ", "s": "3b2dc540437963446e3cbc1f66819144", "oc": "dc53f972098061b86e14cb344c0db50543ebbc00856550b528b3b992e4b4b2d5d3f6c8f32d0a8bd51ef2adc60499685d0c12e75be9f4cd81944fd2a8d4af340a"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (152, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB|KG;2v_V&h587#WYUu=n}z4YPIQRrW@R}?ZZ86dKsXLAtmD4+tY2qE*k|HnRnq|L3y};PWhNE7PpcmCuT5->Aj&n,7!>vGRv$HXx3CMyn3XnC&!m2n;;sTD7A$Vznv5KNOZD;2AYpEe)a~OtWX{8^.)y<_1VenA!#4iCfmi5RMde->qZ}76Qgnq2R0YVC??Z>zfCrx^B3Y", "s": "9492e68114898c5d59199463779957b5", "hm": "8067df40a8383a92c308703d134ddf06"}, {"a": false, "c": "m*DKUj8~ig&gy87#WXA<=npH48zK_I[Fv9E$TxSBh>*%$X3UAiidiBG8f6J4^2^>>gC^5`oK#xzQ4UpFe~}]9g6h0ssP9yfAd7iH^d<$W", "s": "d74bc7bb2f1d30be767a1b06adff2fad", "oc": "f664a114a26f2ca215acb8066e8124abb9d873a9c6a2025a39b06773156b89898ea97149f6bcab4cc6166d83eb2a54964cf5a4dc557ed4ca"}, {"a": false, "c": "m6bKA;2yo|&h7}7#W%7#@cMHI#qB`,@]%m&?_;qLaZhO#{yIKN|aPs2d6}n9ugdf8Jtw7@@OO2~2$4fWO@Md>)=aR3IIP?4WwamE5R8de-p7Z$xYQ|lq2A?{V^??Z>lfIrxAE3x", "s": "3a8a48560a86d1107920101b5452d316", "hm": "6ab792cf7c12b87386751613e8edbb51"}, {"a": false, "c": "mBbKA;O~_|&p<87#WXUz=nqH480V_I^FE9&2T];Bh>*^$ZlUauidiI)8f6-J#2^>RgC^@%cI#UzQ4B>FdL_0-Y6h0sQP%tfAd|I)^dF$|", "s": "a31737a1b714215f3586ebbb43373e6b", "oc": "f8caa19cc87f2a444553b8d9291f24bbb7b8ce15c6a5cd4975baf794109880b983f4f64a5abfa535a9366d5f62da547a9535cb69ad9f7bc7"}, {"a": false, "c": "mBC6oL5~_<-b787|WXM&=i:M>H6`I)eG7H3pCQN!sM]p|cD^%)I3u@>Lo)luD^FTEHMX_Tj5(j}7si7o+q;F>QBxA#WXU&=nqH46KPW9RJ3a=|8qzg_kinIG(T$LA2^SOOSNA,oK#UzS4b>FeL_kO5Eh0ss[~ydAd|{r=t$2X*e{wVscPE`;!0{Z`tn]3MnCk7cI)yOAxv1h0<*1CX7$^({+xU1miXGi5$IwVl&LApt|+|H9gB]ia8~H!S)KgN~swN5`:]s~!st(H^qu4p!4", "s": "9493d6c107ce841752049b69a7aec749", "hm": "da77db41a8484b3253646a3dbebed616"}, {"a": false, "c": "mBbJ&{+8#WW>WTGJJ|#Y!mMH#8kZ~23ea~|GQIzTd|n<6^UokQS5`,>1U3z`#2l.n(Eq~PZPJeY,{fL.X*)sN#Y!JAx1_uu)Ufmr>p|*!", "s": "d90b9eb520fd7eee867d2813eddfe4aa", "oc": "f5c7551ae04f20360552cc16f91f2558b708a3a9c690c4478ebd679e1e99896588eafd4adfbaab5b381763027226545b26354e36b5d40b8b"}, {"a": false, "c": "mBbJ&VD<+WNnrTGaHg#O!CMH{5i66dAJoLtxs|,b3Js?YTqCn}Psh(-8G4C)8j_2YuX4Fv^`F@x}{DyfRUxdHX}*z1H9gB(Ma*~U!S>#S3-sUN6`Ach~!st`<^qu?)8!", "s": "38226d56c23e8d60692835995391d2dd", "hm": "0ad65d4b7732880e8695162a65fd42e8"}, {"a": false, "c": "mhbJ|V+-kWNoWTGalgyYwC1HmZ-N1231ayoGQIzTvtn<8^Uo7QSi`z>1kSJ`#2QONZEq~PZP7^Gu{SL7X*)sN9Y:JpxT_uu4RfmrWp|{!", "s": "f8f9337ab517faff955bde5bc277ab3b", "oc": "d3b781ffc81a2a38e553d507a91f940bb0f8fca25da05875a116d7c3d9978d19c7ad8641bcb3214805365dd07f2a547526918a12ad9e6bcb"}, {"a": false, "c": "mBbJ&V+Z+>NnWT$aHgH=!CMR#B}GUqDUG8+$]IF8z>Ru#08c>I+sIdWf96+{kZfyB32-Zxcln{T2hv3>I#2{=n(EqbQ[P7}Gr{SL7X*)sN#&!JpxT>uS4VfmrWp|r!", "s": "3dbc0b4c4d7925a4ae72bb2f6e83b6ae", "oc": "dd6fbbd733b340a4bb11d05efcccd122168c51efc6571fc83cb5c0a19cf515a3dad5ab9ef65e5fc5c79d29092d3007a6916c709d550717102e1f3e6ec8d25f85"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (154, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m}VM{-|wL;6a+o{2uKZ%g3M2=kTDW6@<3u9l:Kb~W)de4C~&4h}=M7oBy_3BND#*(|HSa{xHeW+V", "s": "9ac3d6d30b6784593218ab6971c91e25", "hm": "8391fb44a843a73ecc056bd4b215d61a"}, {"a": false, "c": "m&bM9-awLU$ayLQJTS5BGj8R|KN?+ph$eSZR(zixBKaPJ>$YGm-@6u=xO~9aot)7sNpcgZX1ymYNwJ>KBut#V(|MBa{wQ*}d-80AS>[i0K*32{x:Y*3!+DW?Qt0VME,nj_4FA5XNQ4neH3R?^aEk0)`", "s": "f9b4f7897888610095596bbbc23caa2b", "oc": "ebc6875dc8cfea371552bc06a9ef910d9788f3d4966ec4dca9ba9764d594126947d3fe4a73b3ab45aba66a02ec46c470ab856becadff61f9"}, {"a": false, "c": "mBbMr-%wLUg)wLU6a~YF2>KjORJ*8LO2XQ0L+P3d_9s0vN!U|)o1:k", "s": "9353d6017cc7845d22139b6977261ca5", "hm": "8067d44b7848abf1130d5a8da08edf1a"}, {"a": false, "c": "mBbbZA|kcc`)Osnrra?Hj)cv`8vu0{XSsSS7w%^>pp?C8#Myzw6W3&4C>A!|#2`-5>Dr=hG)JevI4Xqd!l(+PYN9r;It~KA&!;ci>%7eX", "s": "d90b17052b73e03b867cf869e91f34a7", "oc": "2bc791bfb06d2bec0efb3906a91f230b4b78d0afcbadceb5154a00c487988b69e2adf74919ce4ca5c586ca377b2ad426c8358e8cad9e95f9"}, {"a": false, "c": "mBbFMA|9cC`!OsZrr~?Zj)c%`wv:)D$p_~llv8#G<)F{IH}|*>Hc1Zfglk(:D>cfhoB$E07YBC9|5?dTg}7P_!tKaqi~1r4K6AqUpJD6T5L7OMnWQa)*M{;-|oYA)Dub9MI9vDCc1&WC4grZ=r6U$ho%nk", "s": "3a901d0661a60d60a92545bb572bd201", "hm": "6a87a0cd78713e7f8672fd4a5a5ddb03"}, {"a": false, "c": "mBbJZA-5c2`cOonr>a1HjG8y`8vu0{F(}HSyw%;>)p?C,vMBBwDW3&4h>M!|#27-1L`z=hv8Jq>I40Td!A=+nND!jQIt=KI{!;Kib%7eX", "s": "fcb937e17814e104925b6bb5c73aaf2f", "oc": "0b07a51fc91f2aa21aa3bc66a91f24dcb2d2f3b9c62ee5b5f5ba4a9315998960390d995a89539b45c5362d6eb3295476a22ad96ead9f487f"}, {"a": false, "c": "mbbJI%ijveChO[I][`k;nnN$U96{h(yWAa^~yBpzclLy`zuxyjMh8u>^6vFWMxVpuh", "s": "f36419483614e3ea9f252088453acad1", "oc": "4c6a936d9b93ac16410bc912533ffeab82b741fef4972021e6ee36bc897de8a281a097d6c7559729db3ee08a49144a8ec8801fc3828dff74413280fbaa2287df"}, {"a": false, "c": "m`bJA>|9c[`{Os2rrs?HK)cv`6LBDt#>7UH2qAIZbg%HlyI4vB#2`-T5TzRhvD{X>I4$q?!Z=+lND{rQIt~KA&);c3-%7e7", "s": "1a6df0f64d3923b46e76c21f6681b644", "oc": "046aac62b3b14143bb92da39f77cbf1af92a4683eb67d8824492290996a962906f0751801946b5b35d43195f8700632f1c280d3adaf3bcbf41f9fef28df38154"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (156, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "BBbKU&$fH2LUQ~u2-d8c9SnC$YE)bLn#g6jsUyNow82E?sQBAS:T]jo*78y`fH!){H5FR<25D2l&KWHbIITjwh+P;@y+w6)=8kCzp?2_HkP8rKl4La~V6x?I)6)_~ETn8b$&_I`?P=n3k^uV|JotM|SN6OAo~QuI`BLcxTGVFR!F5D2lMKWHG`I`Dzw@kWP+Zfc7BGVV)HCm^4m+`sVw@H`aOj3S9du2nVr^&.{_[5PGCU3kZ]puh", "s": "f761937732743ce4db532b7a0b38ce38", "oc": "4c209165d3b1441d533b7e1c99e92094e9a2fe88edd03f830868771d9c80b5079aa8135170229bed14bbde2b2c28ce07c5ca85000e4dede5d79918f12fb3393b"}, {"a": false, "c": "VBbKC&ik^z4rCIQ4C}9_BK}`h@y8ZxMI61L?P=j%KqJ9^iQKgRj$2Nd3-8skzc`58]`<&hAZ7oOHcY^@#&c*hTuQR7Of|ho&jmzGI;5NP!2kG~X77Q", "s": "0c92d6010fe7da575214e7699a29c7c5", "hm": "89858b44a80babf2e315aa33be4ed416"}, {"a": false, "c": "m=&LPI|x0Oa~G)VFvD#&4|w;V8)c(J(y9VOZ-[csI1ThD[dVV69&NV%eDmoC`2{_&4(++I>}Pt3hN9v9g-kW^NG(kcGCHK2#T7A3nx$$@", "s": "05ab4d19007d30f57b61834fed0fe7f6", "oc": "fbc4ac1fec1e2362ac53bc06a91f540bb218c39926ac164da5b967481376b9758e2d664ab2e36b43b5350d822b2a5996a8355e60a20f4f47"}, {"a": false, "c": "mBbLWITx[`Q8d+o:vy#SK|+DV_VlEEdB}(mwM-=KQ)|48w1OD`T`={{>;|7A]m=}b+yt(ZNAX*$QWW-p+FGDqDHP,n=geYsiHHC*(7KhB?Y@^6Z|_oq-cY^@f&C*hTu^_7O^|hCJlmz+I;5NYp2kG~rGez", "s": "3a775d5157169d8909fe8c0150dfd2de", "hm": "eab3ddadb5d2d40b8675761ad87e9b55"}, {"a": false, "c": "mB8LWIPx0ya+{hZuvD#>K|+DV5d>TL(X9`OZ{HcsIkT-$+", "s": "33f937847854613f901d6b6bd637a77b", "oc": "22c7afdfcf1c26621503bca7391f04070fd823a902cec84aaaba679f159969648aa7f6fad9b37b42cebc5d049f20cbfea936ae65fde8222b"}, {"a": false, "c": "m-bL-IPx0`aCwboFjS#,3|+uVCe&OcneqVm^WMRfsew>$X4D%KU(rLd=QJ9)o{ahZS39=Ou)wZjutVM8=Oh?R38dJ=-Y_Tq?_}=]M;{5p_pwlg+LB8nB3j@?vIA9kPQnG(kOGCHK2oR7h3^x>$@", "s": "2d8a5d4fad78236cee7b376f6ddc4614", "oc": "f242f565d9c64ea3ab91d7ef0675ec84e26973c4c2191721fee910e58ba07d82b669116effc873100372529394edfd314f576e764ab6fc2f4f66a5d09303ac18"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (158, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "}BbLUSc41)W9q|64@](&;v|K{Y9^G94Jx2AzZw^8J~uXM2w&~>@%Qg)Co1i$*=>!NvSVAegUg3(>_IYJLWje%bTm6t3%&WkhV=)R1gHucJL#r:5b0&0458>zLQQ%t`tCz]i?%8QQ~za|Ts5-mE$Vz8_*^9e1YEm5!82", "s": "3443b5810fed4b585e6b95693324de35", "hm": "d147d444e81df734c3d56a3dbe4edfd6"}, {"a": false, "c": "{!bLU1c41)Wwq|644h4&sX|L{8(5De", "s": "56049725285db5fdf67fab3cd56304a2", "oc": "fb47a19af8e923b11e53bc06a98b200bb7d823a9567ec4fb61bae7931590826086aa365cbb8a01e5e5666bd4db4a547fa61c3e63a8878f76"}, {"a": false, "c": "UBbL<[341~W9!|>NUh(v;v|K{LTn}A2B2L`Oi*Y*IAxKZWEp&PvnNIeA^nR};L>9yO-dcA*b[ChnGw`d+~NfQu%6M)m|ANzcy^.AqMQ%t`t+%*{E%{Q=~zakT$t-;E$Vz87*^m]SYMm>!82", "s": "bb855d5d7e361d20a92e851b549070d1", "hm": "6ab14d897810877f86fe701bd7fd6b17"}, {"a": false, "c": "mB(L|1x419_)q|644H(b;v|K{8?5X=Jm55OZNa", "s": "f341374d7d18410ff52b6b81cda7ab20", "oc": "dca7a912c127a43215c2b80aa91f240db020c569a6afc2dea54ae593159909798ea5c047a9b1ad2ec73dad0276245420a6f6ea4fae7752d6"}, {"a": false, "c": "mBbL|1c41)W9q|k44h(&;v]K{BatAY7D44_5h%C58rHRnV+{)h#PvUiIy=mhxx%:@OZ`J|Vq^?NpV+9b6>M#IO9>jEq(PO+HmKu&kPG~Y&~X:yf!WVipuh", "s": "bab8971533d435e0b1a42d850516ea58", "oc": "6c69986a33b6491fa801b67b9ddabc422a035131de1a47a919e459c586c5d44ef920f0a4768cb186cc76f14574c5c4373ef403932bcfc81d82a9e9457cbe95c4"}, {"a": false, "c": "m-bLUyc41)W9qF644h(&;vGL{6BUWiXdt;%8sICe1kJw}MEK{UGm5?+5JWizvh|xf(9(;k`{p|B>", "s": "3cba0c4f4d7298446e70271f6181b324", "oc": "dc6c6c65c37311d3bbec68fc7a5c42fccbb757c0d6135596b7892f27cb5d00abd2c87b4ffd507c27fb924eff1fe8e84d16c9b5f73b778b57d865fb5f3396d119"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (159, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "YB8K%Ks*MeKDAAsr>I~keTZAct*xyu52iyJQ>>yi!Q-$^9kPC;)b87#?HK9ld$?+IWkwO%6dKy3qG&?^qJAUqadAJOMB>D%C%>Rmqi-~0(zgsext_?r4zSoATTv@KZ", "s": "64f3d3a100e644fe5f149b1b872dc745", "hm": "506fec49a448a6f2c8045533ea0e0f16"}, {"a": false, "c": ">BbP%K}*RfKD.!Jr>I~keTZAc8$p9%O%q$urm@mNN&3[d_9A6-u7l&A-cbZE#2`Eh~#$NVuvA@x&w4l!nfBZr.[%SDCH0{$cn!XqAYZi|", "s": "d90797bc209da0fe914ba816ed4f7427", "oc": "f217ac1ff88c2a331b53b2f9a9d82b0bfcd8d13cc7b5c435a56a6783249980698eadf28a6ff7a545cbb66dd22b2a5676a6d55e9cae4fa9e7"}, {"a": false, "c": "mobK%Ks}?AKDAAsr>I~keTZnGLZs-,rE$|o=j-cbDk)f~lu%D-tHX*zf84&=-cckae@hnM>on8TdKb!5a%3P[7?I<9`6fVw:;!]uFW-GAUq1dArOMF>P%2%`RmFlo~=(Lg+q6X_Yv4zyo<]lY@KZ", "s": "82aa57d651839d70422e851b544c8dd8", "hm": "60e52d7078d2373f065d161a782fde3b"}, {"a": false, "c": "mB*K%Ks*MezDAA<7>d~ke8ZAc8$p9%O%q$u9m@6N+n392896;-xkl&A9BeZu#2`Ehw#$9VuO~k|TmAcCGfIv%Q;QOtEFX-S_M&Y)3lx;ojtp`gPTabzRmDr@O?FHAWOs>JPN=e5QSDk*jEj%P|XG6r6#3>tTpY05odR1623-rp44", "s": "e8ab19753574e1c6d324bd280bea66e8", "oc": "5d63916203f83a116300d8b47232762aa9728cd4a017e1ef45dbea4f90873f0d206c986b97b3089fdee7024636aea740017d342f01ec3312bce103e1501ecf5c"}, {"a": false, "c": "`Bb~1K`*heKDAAsrGI7keTF!c);z~_O2KC1d{e`Y-54&aG;=YK#2;U:z#VNhuPm~7?IreVhqHX75|e>W@e0>;N#shk;H2XylHX^>azA5#gKv0%`W", "s": "9493d5070fa78f5d22149b627ae9474c", "hm": "10672b32af48293163869a38e97edf17"}, {"a": false, "c": "mBxK*!yOIAQAqXmOIVm|6-Ihu96We3g97.?>8@G-tz#Br;^#qEWFOjd2EJhq=IogjYM1iKvJ;zV", "s": "c963a575212536f2865ec813ec0a24a7", "oc": "a5c2521fcf1f2e3e1c4ebc92a01a240bb7f773a685b69475abba639315cc89696ea12e4ab6e3af45bd550d227f2ab47ea031c78cad97da11e52188f387dacfab"}, {"a": false, "c": "mBbr(pyb$AQACXIVIVm0i7Ih:LJr=EKvgtT<15T2HK9]>9WPFMuChzeE?2ZFtZM`Bxl-P-GzWm8Tu`6b94?DB20o}S!Jg2zIl_|{%^1wR{uRpHA}s:c{GYTQk;F|W6Vz*aEifXc?$pGy!(td>D!=v+nV`S", "s": "3a9c59ec8c7698c6a8de8e1d5050d2d1", "hm": "fab75d5d7bdeb69cf655e64ad8eddbdf"}, {"a": false, "c": "mBbK(pyTf!PACXmOI:mONJIh096keUg9XVqf!@Mttz#Brbl6<3WFOjd2ER}|XsogclM9<K=J%9B", "s": "f3b937d77878110faa5e83bbd337ea2e", "oc": "fbc73c1f5acfa0d215738c03ae1f296b47689d49e6dec425e5d46753459c89698eac234b6a139735c5396f00722c547ca8635c6ca09ed2fbe531f24f86aaa2a3"}, {"a": false, "c": "mBb)(^Lr$AQpWimODVmAi}`huBte;>owdxKyBL>*I##N^GX&#VaWCyOD8*JU)0j=lmVXF2cf=rBYM1<0v^$w+m(zO7Y`C`o{]{Y;zF6bBD!+;7fKvJ%zy", "s": "b2eb9b77008452e5db24a1df5bf4ceae", "oc": "6c6abc65a5b71219930a999b65b8bc28a074bdcd53ff94b40fb783aa08e11635777a9625bb4dc037387f4175f4a91587b0bd00fc0a9f422b3acd766b86b0908b"}, {"a": false, "c": "mByKwpyr-A`ACXmOrVmW]GIhu6n`)}8m83E#k4Ho>^0g=jmctUif!l?YM1<BX4+`+IO>JKpjgX?YToz`GROR7eL^$q8$^J6x7WRuA0]W#{2P$?F-<2rNI$N8W6gwOt!Fg.l-I_cW7M~FiM6&1$Ej6!A<1h!E%%1=8cYYY}tUw=SucU|IEwGTk8?pvh", "s": "945e29010fe7545d588a9b69612957b9", "hm": "68945a94a8afab32cce5338dbec8ef13"}, {"a": false, "c": "m|:t_V^%d2?0W$;gk1-JP*cmQT+1Bs6I>YD^{s{k=gw,3$GQ=wX39#3J#%Qi#5^gjgv1?_Syzf!=_JaS)7%(6}_QU^ztUh?^@GoIR-^HJ", "s": "78de97b6207a30fe868c2916ce0f94a9", "oc": "0ae721bff81f2a08d55abc0ca91fb2696dd880a1c6aec401f0b06773fb50d98a32a7b64abeb6ab25c53664069bbe5d7956351a33aba3dafb"}, {"a": false, "c": "mBbL@V^%]|?0W$;g)1RJP*rmTK#;<#&swT&!~`=;IOFg!2b=?NN2^ET?MS1v#@M|IdK^&)IM{5qYVEjR1wUtWau*19aKKAhKSrAja}iC.)BMCB41$Nj%!`<1h!E%%A05$Y{EaOhw=uu7>|INwGCk6vDuh", "s": "3a9a5d5601362d4ff926c2ab5999b2d6", "hm": "63375dbf72df777845757617ddfddcb7"}, {"a": false, "c": "mlb<@V^%=N?0W$0g)1^hl*c&(8wEtsPI>{D^0s{k={wcv^G|=._j9r3Jd%Qi<2^fl!v1o_OazD!=oJISb7mI:eEQU:}tUh?^@=TIyR^hz", "s": "f3a928f17811685f9d596bbbc3c8bd18", "oc": "abc7af97cc162a32d559b3bea487240bb188f3a9c60bcc7e65b477931d69296889adf24f0879a64235936de24b2b34763730cedced9e7a1d"}, {"a": false, "c": "mebL@V$%dN?QW$;g)1-qp*c~>Bor4+`yAb&qoX{uNXP2nSf9Uac;`N90s=|6wY5Sf`CBr@t|7]5a!cH#{ak2(UNODF~WcaS@WuHw~!hhzT", "s": "f76c28856674e5e1da242d28e8ead698", "oc": "0c37bb0553c63ca9a300d59d86b916495ea42b828962eaf60ed0e88437b763f9e8e31811f0b67fe7cb4ce2a112f6f51ead5b0f6936e0bbf328ec675352db04d6"}, {"a": false, "c": "mBIL@V^%dN?0W$#g)1-J1*cmq6X}HB3o?jM)H45-{7zt=+B1Y7f>a@iAA>Xx3CMmn3}nC&!U22QlsTD,4CahAE3Y", "s": "9a9fd7f10f17845d2ae40b3277267685", "hm": "bc57bbf4ab48a733c6eb6a37be41dd16"}, {"a": false, "c": "mKblA;N~J|&-787#WXUXEn]H48ZV_I^F=}y+*L$f3Uaiid:EG8f6-J#2^>LHC6U%oP#~z;4U>FeL_!-Y!h0ssT%yfAd|iM^dF$W", "s": "6a0b07b7707fb0c28c7da826edbae0a7", "oc": "22e271dfc716c8321953bc669d1f24dbbcd8f3790bad24baa5604a03159988379ea22147b9b37165c836c7044beaf4c6b12cce4cad9d055a"}, {"a": false, "c": "mBbKAX+~Rw&h<87TWKUIznqH4LK=%yBB+V8]O7r@cykI#>B`M@K%m&w_;q<={hOYd_IKN|)P,khC}!huPD#,J#76L@>O2>]$4f}O^Ld;)=;R3)AO#XiC`(E5R8de-4qZ}xCQ{nq2A01V^??Z>lfZrxAE3Y", "s": "da8a5056b0360580e92e841b5490d1d5", "hm": "66be5da70bd20a7f767410ead85ddbed"}, {"a": false, "c": "y{|WY;2~E,&h[)!fWnU&=nqH4[>V_S^FE7E$Tx^2h>>LA[3Xagid!,G^f6-u#2^>6K}^S%hK,UzQ9U>F=|_z-Y)h0ss:%yfAd|oH^dF$Y", "s": "237533817018413f45666cdfae39ad2b", "oc": "9477a16fc9ef2a3e2c5eb156393f2492b4188b96c87ec445d54a6bf3d59e8ec97efdf84689b8a10522566ff292a65a36a937a56ca65ddba2"}, {"a": false, "c": "mBbpa;3F_|&K787#WXU&=%qHLo)l}D^<<}HMX_G.5(j}7GE7N+};}pQBYT%T+d8QFdI7@8f5KFuT6d!zMY`SBuh", "s": "0a5f9c75e65ce2e0677a2dd807cacac8", "oc": "f47a9c632fb02a55e7032e9c835933d900753864c2460bd488fe4fcbbdd4c86f73b419ea621c6d8cc3b1ae61b08d51c9e8ab0bc15d88b5345cb4e3823422d85c"}, {"a": false, "c": "mBbEA;$3_|&h787#WvU&,n?H46K&|9nJ3ay|Jqzg_kinTG(B:##2F>=gC#<%oz#UzQ4U[FeL2z-K6h0sGP%yfAdjiH^AF$<", "s": "cdbab0cf457843448e7cb71f6cbc5342", "oc": "ac6a9c2533824ba3ece1d7748ffd3de7e84c943dddeff9d88fafb8fe41a91c1825821f501620f66a2c40228e383b63586589587a42447a16c8011d47e1af0892"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (163, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m!bJ&V+<+KNFWTG{Hg#YyCMj#YUj70Ch_`24U3#-#=$-.X*eUV#cPES;!0{5J_Q@Qvn^F+cn%_}AxvlhP<*11Ucf@JS{zn(rk~PZP7gGu{SL7X*2qN#YMJpxTAuOW|3mrWpd*!", "s": "d80b93bb20bd707dd67caeb6e60fec27", "oc": "ffc7031fc81f2af2c5e389eda6df15dbb3d8f8a926a92805a5ca6723c58389c58eadf6be38b3bb65ca34d0027b28b47ca63f629bad9ecbcb"}, {"a": false, "c": "mQb,2d+<>|NnWTGaVg#Y!CM2]n&)6qOJo~ZZs|CbiZstYT_C`}P=yVCm1X9YnMMisIv8CoL6Azyh(-874C)8j_qYuX4Fv>J>609@x_?DyfRgjYxC14#8-vp|[XayoIQI+cv|n<6^Uo7}Si`z>1mct`#b{OnEED~PyP*^Gm{SL7X*VsN#`!JpxT0uu;UumpWp|}R", "s": "fcb94781781861af9dd06bba734caa29", "oc": "fbc7d87f38341a32155ecc0fa91fa40ebed88ea8c0a288aef58a68937d09899c3ba4f64a0ad7324f1686ad72102ec471bf95ce65af94cbc8"}, {"a": false, "c": "m[bJ&m8P+WNnWTI+EsdWf96+kzZsvq$C28wj?mU;TbTnlRYefU3rAZx@09{z2htp|I#<{$n(Eq~PSP72Gi{SL7X*$vG`?sHUDKED(v)AUm2zd3=NKW[)e3`gB|a30>E%<^ujEEKb~+)be4H~1Es2=>8oXlMb%A{cgZXG>m_Nxq>3BVt#*(|HBa<^9v%5c(.VTMPG-RW}V", "s": "549356210ee1845b5224cbe9719b2755", "hm": "20373b04824ca63ac3d5a03dbe4e0aa6"}, {"a": false, "c": "mBb6cNawLU6Wywi*i5#80Ag0qT01#@-7xtYL3p+|W?otJVfEjnjDr(^5|!Q4npH3R<^b=q$QC", "s": "d00b979f307040f3867c5810ed0f646f", "oc": "fbc0811f181f24322b23e186491f245b87d8ff60cc6e3435aaba6603155e82692ec641c6b9b3abad4536640b7cdf54c6a6face6c8d9d41f5"}, {"a": false, "c": "mBiM9-a|LU6De?izn?~|a;Cw=Lft-#GA1*3>wLQZTS5Bu<8R|%Rn(p4aeS6[GzixtKRP9-+y)SsJp;5ZX1WUCNxJ>3BlS#*(|HfaEj9vv5N($VTMP&-eW1V", "s": "3a9a5db621389000ab2e855b5893e30a", "hm": "6eba930f78d6ba7f867610d7d8fd3bb7"}, {"a": false, "c": "mBnM9-,wL+6ayw2*id#e0?gNqT0S03(+jtY*>D+DW?o|01sEJn7}r2d5XNQ!AHH3H?^aXqwp7", "s": "f2b93c81f841670a94af00b80c3aaaab", "oc": "8bc7a11f281823321553b40ea96f247bb13843a9c1ae94c669b2479315c98f6980a3f849b7b4ab45c5366d7b29223676ab35c76c5d7a42f8"}, {"a": false, "c": "mBP9t-aXLU6aN?H8]$d^9NZIwpL3sxcKp|h", "s": "cabe29753624e2e8502429d8c5dfc152", "oc": "f06a9cccf8b34b18340a84108459bd2598ca1a635c7ff2a08ae30c2d86dac12c08c5069d04d56dc128160f1a9350c3498078f1cec0fb723d6ccc3ca71b684e68"}, {"a": false, "c": "mBbMi-awLQX>Kt4RJ*8LO2XQ||++qd<9s0vN<&V}bKTWz)c-Kb4+xpBM$|VD5-TLDz=hvYAq>IrX~d!Z=+nND{r]It~DA&!Kci~aCeX", "s": "d9bc6715c07430fe867c5316ed0fecd6", "oc": "dbbaf03ff0af2a322559b70da7190c0c8788f1e9dba05c45aeda6593159a80031e0d06adb991ab45ce668d6a992a5078ab35ce88ad9ff1f5"}, {"a": false, "c": "mBbzZh|ec{`ZOsnrr&?Hj)c<`)j8|($p_}r{v}xR<)hiIe5|*RHsSZmgl&(`D>cn7bWrE07|BV9SR?ZT-x77_(HWaq#%1pPu69~UTG`KT5L`sMxwrZ6*M!b-nFzAc3un97ID&,C6%p4X$D!Z]+nNDHrQIt~KA&!;ciB?+eX", "s": "ff7937d1781d640e456a6b974337aa3b", "oc": "fbcfa4df681f2a391553bc06299f540a77d3d39c06aeb4f5a0cae295159989198edef64abdb33b45e534dd82ab2ab4962665cd3c5d9f4ce9"}, {"a": false, "c": "vBbJZA|9cI`#OsnrraLH7)c&`C@6PttDegli<9G$g)evM20CC`h#C|<+#%~j:e#OO?CBf0m;NXOPU1S{hsyWAPD~MBgz9aLK`oux`{t.r=>96vFWMxVluh", "s": "e96c94c53683c2f0d72b24982ba5cac8", "oc": "826accc678e342e06a008e8d5003f2a282b8787f470822bf704686685b45e886733395dbed95b3009c3ee80a72fdaafee6711fc3ba81ff2d6cf3886bae228ed0"}, {"a": false, "c": "mxb9Zp|9c2D{OEnrrl?Hj)Zv`YLBDC#>7>h2q|VZbg%~lyV4YBV)`(TiDz=hvY{q>I4Xqd!ZM+wND{vQI%~sA&!sciB%}{X", "s": "3de610484a75e11a6e7cb0ce668bb349", "oc": "fc959c825cb301adc9e6d7ef037cfcdbc5a136880ee7654e84d276b9ec2a61f8e749570d0c46b84ccdafe13f477b0596dc947dc6dafeba11d006f8c280f98214"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (166, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "rsb{U4X2H2TUi$E2c>_u`wc8BwxolBh(cwB5y9PQ`X7#ebG!)VN*}W8`=cMA3~zuAAZ9u@3&cjQB@SmFOq]iQuIUTLc){G*CR<,5G2lMKWHbIIf7xPXw{4lH", "s": "7133d601035b85ed021c9b697773c646", "hm": "3967d9d4a84bc6359302f63dbe46d51e"}, {"a": false, "c": "m_mKr&XQeRFUi~T2>dQcurnC$8-g*->%1W;Tj4P+P;@y+w68=8kCz6#23X?P8rKh4La[_65NI]i[_$`T&8b$&_{`Gj=5tMA7NTO-oOQuI`BLc){G*F@<[5DeNM@rHbIII@w!+9;@m+wU)T8kCzp#2_>ku8|KG4Aa~66t!I[bB_+mUptW3@HvaOj3S9vu]nVJ^XiW_L5fGC_3vA>puh", "s": "f86d0978367d01e0602b3dfda9cabaa8", "oc": "fc9b9c7533b3c2a9ac018c1c307232bd192cff9be060ef79986de7ddf20b13f76e4cb3f8a512929edcd728dfd827930c2b2a450f0ebb6de9bb94a8f1d9095939"}, {"a": false, "c": "EubK}}T2,2TUi~TIM2`]cTePq.", "s": "7d5a0b434f7843546e73f71f7b816339", "oc": "f5a09c85937311693b7157ef0cc65eef323081c5712affcaa6ed80063a0deaa65b8525c38383d734fae83393151a73150d3bb98ce4223fffe770417c143b1b8b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (167, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m%bL-IP00za~GhoyvD{6?A-DVYWOCvQRgCtK8cM_k9W#L*nu;!Se7**T]+MGCjz(ia`9*pnQ)h#i>xSI61!?)Hc%Kq.9^_0mg{?$2N29!~skzcu58ed?&hAZ_oqHcY^Kb&GQ)|@8N1ODPT`={Zu||cA[Q=}b,ytbANAXb$QKW-]HF1u-2H.^n=gtYs=H{C*(O$hDGH5V6AZ_o^H_Yj@#&@*hZ7^_7Of|hoE$mW^IxL{P!0kG~rl7H", "s": "ee9a3c26a1366d81a9f985ab5a1ed2d1", "hm": "6afdad9df6303abf867e1612d6a2b1bf"}, {"a": false, "c": "|BbL`IP|0`a~GhV=vD#SK|+!V8rc(L(X9VOmP>csIkutD(`>V6b}NV^eDmLo#2>_&w=+)@w8nc3Wt?)agS]c}nG(9cmCH42XT7#On<}$@", "s": "a359378e7b53110f9dfbfbfa9338542b", "oc": "f6c711f108132032155f3c9ea91c22abbed8944c233fc7658ab36797459989898e7df6ebb9b3a145cf5066177b2b420da67ec16c0d924230"}, {"a": false, "c": "mAbL|>hn07_~KhpFvT#S&~YDVCC{8R*C3LA0=&>OcfeqX8.WMRfqewr$_QS%aUt5~dkQQ9)o{chZS{@=Hu)3Laug@MP=AL?HF8kJO%P_Tq?_7=XM;4NNuh", "s": "fa6f997533746db6d1242dd8090dc308", "oc": "f3689c6503d102a9a601de4d5b431380734d5e2c05ce68c7d941136f9175b3c95719ff224a8e98b308bed947a41adb6fdeb33a0f954cb2da4d034281309fc558"}, {"a": false, "c": "mBOLEY>x0`a~Gh%Fvq#dK|+DV6UNb%E$11oJ~vs6sjV!cu{CqSU2Dl&wl++_wSnB#h:?PLg-kWQNF(qc}CHK2^R7Z3nx>$@", "s": "313a07444f0530f46e73b21ff36fbd47", "oc": "fa2a9865b3fa4efabaecd2e20ec4948ae8d9afe6c513459128e9d0353ba6fd12e864711c683bafc06742ee6499718a31ad57d1914ab698d2be30a5e9370fa113"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (168, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "cBbL~1c41$W9$~644h(&J{|K{YE7c7d5DAJM-UtmWvJFD-rCm|!bIFbJ_X8f6>A=JxCA@yqg;J~(XCHw&~>@%aX;jU1i6*=>4NvDoAez%BaNh~)fUgx(>aIJT945Y>AfM{%t`tCzgiEP8Q=~j@ko$*->E$Vz8_|^me1sami!84", "s": "5593d601cfe78a5682121e49714b0745", "hm": "c2649b4fae5aace9b407badd4d4fdd41"}, {"a": false, "c": "$BbL{1c41)W9q|644W(&;-|:{8(5Xe+c65OG4)4C??yh*--WG|H8&DwuvU=}#A}y8WIC-LkJwS}EK{+Gm5i^<*Wizvhl@f(9(;k`{pkB:", "s": "d9ab97653c7d80f3be77a81ced0fb9a3", "oc": "cdc9a10558122022150db3c6a91f208bb6d8f32ac635abe9a94a07931199a9a584adf32ab8b6ae4fc5375d32bb218576a635ce6bae77efb6"}, {"a": false, "c": "m?bwU[c^1)W9I|6|40(&;v|<{LTq1A!h2L`piH@)IAXcZWE*&PvSNi=W9$Hdd{<1;`<{_m3v9n*b{C&nGw`d%o9tQ%i6MOm{=vz|y^dxfWQ%<`wkzrWE`8Q=~zaAT$5-RE}VI8_*^me1YEm>!t2", "s": "3c9a5d96e3ca980fb92ed53f579d9291", "hm": "da805df768d2bd7f5695181ad83d5b83"}, {"a": false, "c": "mBLLU1c4K),9q|644h(&hv|o48(VXe9m`5OZ4)XL?ayheQ-WGqH8&DwAvUEG#2[y8sIC-1kJnGMEK{UAg5?^?*Wi9vt8Bf(9(;k`{p+B>", "s": "f6b00d887d18e00f955b4dba8d38da4d", "oc": "f6c3361fc8ef4a32b5539c29a50f295c90d8fca9c67ceaa505bb69035c498969e8edb06cbb08bb4cc53a6da27660547628382ecbadd7a9e6"}, {"a": false, "c": "mBbLU1c41)W9Yz6*4.(&;v|K#,`[AY7D@1rLK%%5;r|RnR+7)h-PvUiIy1vhxx%(@YHIJ|V0^?NpV+9b6h}#IOF>Wjq(UOCHmKc&k_G=b{iX*yf{_q=puh", "s": "f163c9753614e5e43b3d0d97a5ca4acd", "oc": "f61a9c6533b34249b3295e189dca0cd83213aa38d60437af074584e5c0a5c4df7b20c9aa3d8c810ebb262bbc25c5520e3efe63354c5faf1bf9a9e9927c8b310e"}, {"a": false, "c": "mB|L&1c4z)WvL(M44h(vuv|.{6B%$^JX|;%MXp3dR3FwfROr4}+8sIC-1kzwGd)6{UGm5?3N*W7vvh5xf(_};k`~p+B>", "s": "0fba004a4d7423196e7c87111641b2d9", "oc": "f87a9c653dbbd3a39ba1a83cf9714886cea75744bb1e5161d5fdcdb9cba7ea9bd2380841fd480ea7fc984e3902efe81074a915f72ca87353d445f9923d45d1c9"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (169, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "%BbK%Ks*MeKDA1srNw~keTZJ#Y#9bT|-F@t{DF(lI0-uESS:8vX,JDqW}wLQ{zT$uJl8)sx`6;v)ubVx$cQL3PHK6aW_Imq>($LDuP2^>yrXQhXT9k+Csetm7s?HKEldXq+IZk;O%6NKQ3~G>U^`8F|q13IrOMF>P%C%{Ryq|o~?(`gNeRt_Yu4zuoHT&_@KZ", "s": "9499566c0fd784e75ba497a9f729c19f", "hm": "30addbb4a8283b32df256a5dfe476616"}, {"a": false, "c": "mBbK%Ks`MeFD#AIrdI~k!TZAc8$p=%O%q$rHmwlNnn39d8uA;Du7l&A-BbZG:2`Ehz#$NVu>AX;G(4C|AfB%qr{$oDCNd0)c>!zlI~keTL3_LZs-0*m$1VzC-{5Dkgf~Ku%D4tHX*$f8~+p-WokDD{o:Q}ou8TdKv!5a?!8eFAPiP%>Rmq9o>VG_g$}6t|XrZ5u)AVB_@KZ", "s": "39a7ad96015667f5a95e838e5404d2dc", "hm": "69b55dbd75d6e7cf8655f6fad4cddbe6"}, {"a": false, "c": "mBbKeKs}MesqAAsr>I|lerZAc8$$kXOiq$xXm@mN1n34d89m;-uPu&e-BbZv#2&Ehz#$gVuEFX-SyM?+)3lx;t@r?05odR#c15-rpuh", "s": "7a6f5fd13674e259d0238988450af428", "oc": "fc6accd593d97219a308d42a8472762039b52cd4bac1cd8045dde57fb06795d960f7016b77b6035fdae7d4b6738e204c6c70c75ce87e166bffecbe9159799f65"}, {"a": false, "c": "mB^K%KsgMe3DAAsX>I~k0jZAc6Gz~222KC1k~e`Y-5<~aGlcYrRi{E(QZ$oVucd!fi`NZia", "s": "3fbae0484d3d2340657c67dde3cb63c4", "oc": "716a0b3c3333343717a1283c4dfc0a6bad92ea2af723739478dd6c422f3583dffc3ff3a4ad80151d5a14daebc5dc39f3658fc9f4282fe568f07e1d48cf47aef5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (170, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "*3U@(p<.$}QACXmOIVmOi}IhuY%DebeY~.}s=.X|R|OT!ondLDlegl%BRqGtW)`;o#v+VPS7t@PmZ7?!TeVU_HXJr>e>f@`%>;PlGTaF#hKiJ]zy", "s": "9f9716a403e7b45d76979c69b0d1f745", "hm": "8b67c1c4a8481b1233045a4d3e597e66"}, {"a": false, "c": "|BbK(pj!Ihu96coUg9}Vr!fWM-tz#Br;^6.>WFOjd2E7Fq=fogcYM.KvM~Ky", "s": "d90b9795202d30f3869c1886d40cf8d7", "oc": "fb65ad4fc8ff2a3b55a13c00a0167306b70ff7a9c59dc24e9aba649e85d689ee5f0d9311b9a3bb42ca9d607afbbe7f6c86fce9da3330571d8751e14f2bae8f3e"}, {"a": false, "c": "mBbK[?yr$AQACjmFIVmWi3IIuLJ4=wKv=?ThO5}2HK9GX9W7-@uChzv{?QZTtK`_BA3^P.G1Wm8T=`6b9{?DB2co}A>>gDzIY_|{|LiGq}WTpHAX##c&Gylt+QF|W6VzxV{=fXB?#p8y!(2-zD!=#+nV`S", "s": "3a9b5da301b69d086122851b5d90a221", "hm": "6c0be7157ab167dfbf75261ad249db20"}, {"a": false, "c": "mkb44pyrsAQ6GXNhIVmOK}|hu96c<.g3VVn28@Mztz#Br;^6<|WFOjd2ER8q=fogHSM<<+o7>KNZ%2y", "s": "fd1987897e1c583b91d76edb97cffa4b", "oc": "f3c7a1e9a8112a3215502cc4221fc403b7d2bfa9caae872695ba57931e9989190e03f66d59b36b02c56d5d027bea9a76a635ce636d93da1e3b3d4b4987cabca9"}, {"a": false, "c": "mB]K(pyK$AQUBXmOIVm5i}I{ujte;FOw0vK4B}-0I##BZG3S#drWCrO|8*Bk)0+=hVV1FAcf=tBY|1<)v^_A+O()r7YhC`IXG{(;RF=.BT!+;7@KvJ%zy", "s": "ba6f9770667429d0123d29d25e7a8a73", "oc": "e06a9c5937b7463ecb90c77065bdd9c7f2f9d27d5d6d941b4ab8887f1be184a5978acc27bb451e5f313f9b74f4199c87bf72257e0f21422b35deb36b201593db"}, {"a": false, "c": "mB_K(pSrFAARCXmO4dmsi}RFu6n`}}*f83gFkmOo>^0S=jpcM`ui!l(Y]+KyyUzy", "s": "8dba004f4d7853946d79d71f6686b3c4", "oc": "fc0d95453db87c03b17b5c31f97df23ff55101aa1562bae62378853d083b94717a181d891925293794b82b43ab0941ee3c953205cb4ecad050018146a096d4a3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (171, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB=L@V^7dL?0Wxbg)G-JP*JmqX%JDWZZKZdGGl(n$CfXJH|0x.*=inN;@ztZfN`tJKpjgX()TeGt;WORpef^$zOw^8`i7KRuY0PkS{2OV?l-ZnrNIP.CWCgDOt!,*2(-I_5)7ljFiM6fC$Ej6VA<1h!Es%1IDVYIE]thw=uL_U=IEwGb08(=uh", "s": "d9d3862d0fdd545052f68b6e77397a45", "hm": "6667859b784b9b36c805ab4dbe4edf1e"}, {"a": false, "c": "mBbL`VC%dN50W$fg)1-EP^cmq8w[]sgI>{D^0G{k=0wTv[GK=#Xj973J#%Qi#2^fU=%1o_OazD!=oJIS)7m@UoEQD~%=U&?^@=oFn1^tJ", "s": "d9929ab5207c3dbd861c38b0ed0fb4ab", "oc": "fbc2a1cf341f21e21573130ea713644c3588fa7906b5c465f5ba6e211599298bdc5d864aaa73abb5cf2669127b5d55756235fe6add9eea1b"}, {"a": false, "c": "6B|L@V^%dN?0M$;g)7-JP*jR-wUFWau)11_KGA;FHrAja?iCy)vXC041$Ej6!Av1h!E%%1I5$YIE}Lhw=uXcUhIEwG+k8(puh", "s": "ff985b2601919da04923851b639052dd", "hm": "eabb5d5d78ddb1158045561ad8f1d8e4"}, {"a": false, "c": "mBbL@=^%)N60lA;g)1-JP*c@q8w1tsgI]{D^0sCk=Kwc{$GK=|>j9736N%Qi#2^f?gS1oRObzD!koJI!)=k(!zEQU?ztUh?^@=>IR]^sJ", "s": "6d1c2791780267b1975b07bb64cf7a2b", "oc": "3723a2c3851f2aa21553b7a6a912e95b64ddfea9cfaa2247e6b1679e45996969fea8017a39b3ae312a626d72722a5d1596f50e6ca7a3df1b"}, {"a": false, "c": "mBpL}V^qdN?0W$;gI1JJP*Z0q.Xr@{`yoX{u&XP2XSfDyacD`697sM|Vw^5xRpB8|ql5FlSfXU.?^@WoIRR^WJ", "s": "3dba00affe7823af6c74bf6cc35113f4", "oc": "f5651dc50c2bb1f82e40cae58c0bc10f4e0b692e75855a10d1392d9fe4141205db76cb13bd068035d7fd01b60699ce900cc93d2be90388819d575228d7af0e07"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (172, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m5bKA.2~_x&h787#BX[&=n_H4uPR!=jL(B7JaYGEA$|Xx3>Myn3~nC&>m2n|msTD7A$Vznv5YN&Z@p2AYt6eqS~_tHX*m5BbyH_1{P(AQ)4;CfUE+b8qe>DqZ>xLQg[t2?0{V}??|KlfCqxAE3z", "s": "9fc3d60bbfe4885de11e9e69770dc7bf", "hm": "d06cdb43a7415b3c23c56a3dbc484f16"}, {"a": false, "c": "m{bKPC2~G|&h78aiWmU&=@qH4_zw_IitE9E$|x^BlD*L$S3U$iidimG8f6dL##.EOgCbG%Y$pUzn4U>F4L_z-Y*10ssJuyk%_1iH^UF$W", "s": "d9b057c52073c0fff6cc01ec8b0311a5", "oc": "f3ceac55ce51da381d59fc09f91fae2ba7def3e9e0afc74eaa266fc3f19980698eedfaeaf5b3a642c9c6600b7b795676af33c46cad94d32c"}, {"a": false, "c": "mB,KD}2#_|&b7!7#WXU&=nJH4LKIqGB#+iZ>%7l@cMLI#pB`4@g%m&?_;qOaZhv!{jIKN|aP@2dF}n9]gdf7Jzw6L}s2L~2m4O&O6lfC$x|E3Y", "s": "06da55560e354d00a9ce8b1b5490e707", "hm": "6a275d4d77d9b03e5676171ad82d2fef"}, {"a": false, "c": "mBbhAK2plVKh787#WXU&=epH48zk_|^FE9C$Tx^Bh[>|vZ3USiiXiIG826-.#2^>]gC^U%oK#Uzp4[>Feq}rVY6hyV,3a)U&2|iHEdF$W", "s": "f36737807818630bc5db62bb4327a12b", "oc": "dbccd13f28ef593ee557e566a21f750067d8f3a9ceae9445a11a674335fb89608e80f74ab9b37b98ca666d928b295476a612cf1cad3491ce"}, {"a": false, "c": "mpbLoZliDe|TEHwXAT`5(j}GsM7o+K;}pQB>A1T$dNQPdI7@mf]K,m)42!{4Y`SpuR", "s": "d40f99d87d473795d4242da835c78ac9", "oc": "f86a9c6533b3d289af018b1b6ae6339cdeb54d64ed1341d458a62fc464b0185fbfa469a6c7bd218e8dbdde6257dd9ec21fc90eefdd0d2a34b599e61279a1f871"}, {"a": false, "c": "{BbKA;2~_|XQ787#WXU&=-qH46KPW9$<3a=|Jqz>ik[nIG(B$L#2]>HCCzUhoK55zQ4U>FeZtzWNnWTGaOgSY!biHTNUj70Cz=$?2X>ej7Jh<096q_vDyfRUxF!}}Hz|G9gB(MaZDH!S&KJY-fpN*`I@A~d}tkH^qucc8f", "s": "4a99c5560d360d00a99e0514589b22d1", "hm": "61c35d9643d2cb9f7c768615d8fdcbe7"}, {"a": false, "c": "mBbJ&V+QDzTv|Z<6^Uo7QSi%zqnUcJS%2]On(Eq~PZP7?Gu{SL7XS)sNwY!J,x$_uulUfd{WpL*!", "s": "33b1c2e8180861013595244b2337aa20", "oc": "2bcbae050818fb3219dddc5c252f233eb771e3adc645c475f5b66713159989693ba1f08ab913a4a5c839110b772a447dae355e12ad9fd60b"}, {"a": false, "c": "mBbJ&Vu<&7N{WTGOHg]r!CMH#B}FUq}EGI9$|Ia8zd3m#085>I+E7dWfG6OLEFVjA6dAo7t#NR$IxYWpuh", "s": "f36b99e431f4e2d234242dd3c6eadaf8", "oc": "fc68e66b33a24ef9b35098aa7ee387fe2edca241ff4cd9add8f59c77636c0374b305c2e97f94ba29ea02e245cb84bb6bdfe43f26bf4df31d6a23914e18087860"}, {"a": false, "c": "|BbJ&V+iy]NnWTG&Hg#Y`CMHl6snlsYvyNzr-Zx^l~{N2h|3OI|2{O[,Eq~PZP7N8({SL7GH)?;Zsu`vlQgsH>pTED(v)GU?2ZR3=!qWJ)S3S3kGaX0hi%<309zEK@lt),|42&1!s2;>FoXl$bGApcAzx>3Blt}}(||BqGj9v%5N($(TIPDjeR1S", "s": "9793d2713257845d9d149459772ac7a5", "hm": "902e2944b8a8db31c3a58b3d529edff6"}, {"a": false, "c": "|B4YN-awLUPa?^tEq$vC", "s": "d90b97b51b7dc00c8979a8167d0f09a7", "oc": "5efaa7cfc8df13b21f23acb6a9f4e00bb7dcf019c6aec4e575ba6fc44de589628e2bf63ae9a3a645c43661057b425486dd75c8b8139c41f8"}, {"a": false, "c": "TBbM9U(wL96aPTQJTS5BujLRmQ^Y+]4QetYRoLix4wR)q>?Yjm-@*uzbmF_wtB$Q9|bQ,=&2^#B;}8>9royHssapwgZ01WmCFxa>3%Vt#*.|7Ir?+zq?~ga;CY=Mz4(V5E,TY>#ac7x{YD`p+DW?otOVY4U5jDl(d5X[Q`nuHzRn_aKq$DC", "s": "b3e93781791e6206acea0acb63389453", "oc": "f445ab1fc81fb7b51553b83da9c32406b52ff369b68ec09ca5ca3793131989198e0d656af9bba565e536200400245476663da76cadff01f8"}, {"a": false, "c": "m9bM9-awL94aJZA|S{2c{OsnrraMHnoyv`YFJ>Kt4Rn*82I=XQCL+P]d_ss0vN<&V}uKybz-(?Kb8+xpBxMa;Y~+PwxS}71}4O~OKwn`(~ADBj{+I{q[XzTGjt<0._ddh(Fa|pBD@Wk9``hGxOPcTs+t(bz$5e*;~X1}V6FnhA9iE9*M{J-nozAcDun97I9)DC6K}WC4g$Z=p:U$So1:k", "s": "9083d6010f97845fe214aa69772910b5", "hm": "6063db6caa988ba0cf053a9c934e1b2c"}, {"a": false, "c": "mBbJZ.|icG4{OnnrrW?Hj)}v`Jvu0HXK}S4yw%=>yp.C8#Mysw6W]h4r>M!Ey2`-xLPz=*vYJq>IQXud!Z=+vjD{rXIt~KA&!__IZkglkw`D>cn}UBrYt7YBC9Sp&ZO_C77_!tV@q(}1r1K6AO6TG|KT56`OMD#7E)*M{J}nozncDzn9ybNODC6`}MC40$7=L!U$hoPvk", "s": "3a222d76013d9d0093ee8115fc20eb41", "hm": "6bb05d1d66ac0e3fe675111480fddbc0"}, {"a": false, "c": "]BbJKA|ac2`{Osnrra?Hj)cv`8vu0Zmb}qSy+%$>)p??8#,y;w7W3&Vh>M{|#2`-T!q9=hvYJ8>InIqd!m=+G!DCrQIt~5Amx;ci~%qlX", "s": "f349f7217fb8614f280bdb2bc337a150", "oc": "fbce11eac41f2c32735f4c095c3d2e0bb5d8ffb2203e5449a5ba17931599c9b78e4df93adfb3ab4ec05b65032ba05446b736c26b4f9e41ff"}, {"a": false, "c": "%ibeZA|9c2`{O4nrrqjH_)#v`C<6PtIDegli96v[WM(X~uh", "s": "ba6f99d53674ede027d4b9d8052acbd0", "oc": "fc461c91b341c2d637018e2a55d343a422bd795e071777cfe6ae38688f2b8476ed489f7aa5b5b720db0e6d4042fdda8eed423fc3ba8c3f02093fb9e9d119ff1d"}, {"a": false, "c": "mB[JZA|9t8A{Osng%)}Hj)c_`6LBDJ!>nUH22|VZbg%?*yV4vB#?G-oLDc=;vYJqqI4Xqd!2m+dND{rQ5$~KA&!nAi^%7eX", "s": "3d7a0095a1782dc6cd71b7af66edb344", "oc": "edbb9ce423234255bbe1d7e60b5c3e58f5582682d0ecf88e42522bec3a53b2d27707519a1f7db94b5da7193c7cfb983ad48574c6d3fe795135ccf80385f68615"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (176, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "{BGKU&X2H2m^i~Tx2g8c9!nC}a3)bLn3J6jQU;Now8UEaazrCce~2>sQB}o!zOjoiQFQ`rLcA<~*Fh<15!2lMKWHTIe;yW;<^(@O}TjwP+P;@6+w6O78FC-p#2_X#u8rKllLaKw6xNI)iB_X`2t2b$~_I`G&=Y39TjwPK->Ba+w6)=|kCW>]2_Gku{rpl4$a~96xNI)iB5+VcjCL^wH+`tViN{`aO7369v39n[$^X&{_L3fGCY3v$>puh", "s": "c17f646c86745230e5c42ddc0795c078", "oc": "fcdedc2533638890e301d4ac2c49c7b119263f8301a03071c81d825e980080a5dbaec344a0759bedd446dbdbac3daae69aba8d510b6d6de60f941285d901553f"}, {"a": false, "c": "m3NKU&XNH28Ui~T2D#E#1+DVYWWVLCRgCUCmpF_fe8M;=?be!Od7*jTxqMGN)z(Xa`I*-nQ)h#RoXknzEr&IQ2%d9_qHS`wQy=ZxU*V1!?)?%%K:3Sr_~}gfj$2NdX!8skzc`58ydU&hA9_}qHcY^4#&Q*fTu^_7Of|hCElmzMI;5NP!&)Gprl7+", "s": "36f5dbde8fee875752a4f0397729cb45", "hm": "c077dbb4a84804386305e0993e1e2f13"}, {"a": false, "c": "qXbL|IP)sTxrhD0`VV6a}RV%eDmLo#2{_&wl6+_i8nB3}g?:Tg-d:QNGTkc@CHB2^T7@2nW>Z@", "s": "d96b97b52f7d30ce8f70a807edffe487", "oc": "3bccf1f7c69f8aa31813b7e6a941040b7c84f3a9c66fc043e12b67d318198529b15df62a9283bbf3e53665b28dfa3336f637346ccd8f4deb"}, {"a": false, "c": "mhbLFIPxHF{~Gho~vD#{)|48y|UDUv`={zO|IwAxQ=}b+y&(AXAG*,QWu-pHFDif9Hn^n=NIYsij~C*(7KhB@Y*V6AZ_oqH7Y^@D&BOhTu^_7Of|}KElm;GI;5uP!2kGBrl7z", "s": "3a9a5d5609705dfaa14e1cfb537013ed", "hm": "1a775cb184d2bee0878fde23e8fdc2a7"}, {"a": false, "c": "[Bb7W1r`0`AcsIkphDI`VY6a}hVXeDHL7#2{_&Ql++}w8YB3hgrv9g-kW^Nk(kcGCHK2wT>Z3nx>n@", "s": "f38857f1b818419f945ea2bb01f7aa30", "oc": "9bc8f11fa8122ac6c553bc06ad10fb0bb7d8f3a9c6a6c4a3aa5ac698159bb96981acfa4abe03a725c8a6ea507b5a443aa635ce6ca09742b2"}, {"a": false, "c": "mWbLpIex0`a~GhoFvz#SKy+DVCC58R*{3tA0=XbOcfeqR8^WMRfsewr$X@D%aU[(LdklQ}bo[chZ}S@=O~)3pautVM@=AF?HN#kJO%5A?q?_F=|>[mwp?h", "s": "8a9f99b5307411eedb2b2dd866a55a78", "oc": "ac9abc6f33034e19a101fd13324724bad6370e24ae626857d0111d7f917bb3abf338dc6dbabf17dcdbbbbe97a81dd55ed0bd2182ea7e2814425c42c13e06c5a9"}, {"a": false, "c": "mB3LWIPxp`aFxCoFvD#SK@+D%GUNb2E^11oJC^sVsxVQpuBC0S#2{_&wl++_wvnB3hg?MCgbeWQN)ks7G9HK6^TZZenxCH@", "s": "cd1a0e839d482344607cb77f6b6113ec", "oc": "fc6ac96523b74db4bd91d70f96c55434e8f993e258fe82ce04e714e53b360d15b8797b06f8eff96018cf612a81b92aecf5c78d1a4a4f653e2510abd083e40a13"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (178, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB#LU1c=@SW9q|68Y9*G@d@DzJM&yt@t;JFDgrpm|!bI=w#_38g6>L;JxCALZf,]{WzXCHw&~>@%#gAjo1f6#=>!:vDVA5d%B$+$0)U!Nx(>_DJTq!;a%|TmJt35_hkPVz2R1@HjcJH#GF5bP<0458AvfMQ%tjtCz*jE08m=~>a8T$5-KE$V)82", "s": "9097d601bf87e45dd2149b6973299b76", "hm": "8c6ad4d4bf44a832330efaa98ededf5f"}, {"a": false, "c": "mBLLU1FiL)W3q}644hD&;v|K{@(5l|9m`5OZI)XL??yhPX-WGVH8&Dwuvn5G|2}!8sIM<1kJwGMEK7UBm5[^5eWizvh8Bf(9<*k`mp+H>", "s": "d91b9645c69d2a5ea6eca816ed8bae77", "oc": "f907313f359f613283a8724fa91fd4ed369863a9c6ae744cae3a6c933e9889d98c6df647b9bd7be52846cca2dcca3496a2302e6c7e74a46d"}, {"a": false, "c": "mBbL|1oB1)W`q|644h(&yv|KbLTn1{]hSL`pi**MXALKZ,Ep~P9SNj|NjlRB;L>myO.dcO1;`<{}OdQn0*bvCh9GwrdMo9CQ#%6MIm:=Nzl)^3KfMQ%o`I|z*iE%8==~makT$h-;EgVz8X*^mn1Yrm4X82", "s": "3c8a5d5f08e69d00a9ae878bd43017d3", "hm": "6a65db4db4d2eb7f86601911d63d0325"}, {"a": false, "c": "mzQLU1c4O)W9h|6dDh(4;v|K{8(WXn9m`5OZs)[L??y}eX-WGqHb&>wuvU|G#CaX8s9C-1kJgGM?i{Uxm5?^5*eizvh8xfq91_k`opJB>", "s": "f2b99e84381f608adf5b66bbe348aa29", "oc": "fbce151f69102a925504bfc3a21f4a0b78f0e1a9c6eecc45eeba67931599194381ad544a286dab4ec9661d0d7b2a5082a664cfecaee459e4"}, {"a": false, "c": "mBjLU1MQ1)W9qn644h(&;v|K{B`t7Y7D@45eh%C5?;HRnV+=)h-PvUiIyZ&WxxGu@zHI(|V7^?NpV+9b6hM#8D|>jmq({OLHmKL&pcG=Y&?X*yX!_Vqphh", "s": "fa0f90053674322fdbb4bdd81fe9bacb", "oc": "d66a99613355441ea6316e4cfdcafca82303913f10d4aaad74ee9995dba50d61e32bceb4068c81f88876ffbc7cc5c29e00fe131d415f18a9cea9f9487c2bd507"}, {"a": false, "c": "mBb{U1c11)W`qb644h(&;v|K{6BUWiPXM;[<`P3oR3|2fRR>QN#&}y0mIC-1}#FRPEKZUGm5?^x*|a#dh8x:(Q];Y`{p+B>", "s": "0db7d0464304a4149e62b41926162315", "oc": "fe3a975530b345bebba1983c39523582c7b5b5c0a614489fd5a02cb24b1d6a7ba5def7115d3dc87d519c29901878b397047970f7448c93541646f86fa64061f9"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (179, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mJbK2Ks*MewDA|s<>+~Ir#ZAcZM9b4j>fr?$DB=F@t{wFHgI0|O]o$n1[o`E5zW}wLQ{zt)b>N2)s{:VF-)ubV4zcRLfPHK60S_Imq>)*L&0P2iiJQxU>rXQ9M7_k+Csetm7{fHK9ld-?kkzkIOZ6}vyQqG&U_U86Uq1SAKxMF)P%L%>Rmq|3~0(Igse6tDY34zuoAT&_@KZ", "s": "9497d8050be7719d523c9c697d5983f5", "hm": "80675059a8483b653305613db70ebf18"}, {"a": false, "c": "mBl6%ws*.2KDAbsr~I~keTZAc8sp9%2%q$urm@mNMn39d8;A;-u7lyA-|bZG#}`Eh>#$PxA%>Rmq|o~0(Ggoe62_Yr4z[RAT&_@{c", "s": "1a9ad2e9d16b9d00a92d808be410d7d1", "hm": "5ad755b928e2b3748328c6cce7674818"}, {"a": false, "c": "^Bb^%Ks*M4YDAAsr)INkeTZac8$p9%O%W$urm@mN+n39d89A;-u75+v-!bm_#P`E0z#$NV4BbU%KT*MeKDAAcr>{~keTZ#cCGfIP%Q;yOtPFX-Sy4qY)Glx;8HAprhPTa2z0mDr@O?=HAWOs`F2N=`5G4DBOjEv2T|Xe6r6#x>t]rY05orR>615-rpuh", "s": "5a6f18731654a690dd247dd865e8cab8", "oc": "dc0a92b73357423942f1df1a82f86c2b16612cfbb9f6080f4ddd257d92f70f39a535026f92be079fdee4a2f683642f0d31c65c6a677e3e6ebfeb13c1509ee355"}, {"a": false, "c": "mBbK%Ks*MTKDA#sr>4~kAGUAC6Gz~_22HL1f~gQY-54+af;cY`JYz#>NVu<;+swt4C!AfB$xeazKF|h|~FKGJ&zy", "s": "c7965c710f2f72535f139b69072907b8", "hm": "89f7da40a84a4b32c307dbab7ebedf1a"}, {"a": false, "c": "mVbK(8yFfAQACXmO:VmOirIh~96ceUg9XV?28@j-tz%B0K^6<3iFOsd.Ez87=fYncYm1Ybviw<+C(Rr7Yh@`o{S{(;RF=bB1YIj7>KvJ%zy", "s": "062b97b1277d30fee6dbf7749d0fe4bf", "oc": "fbc7a11f48fd230526533a03a010c003bfd8eea1c6ce044f0571344306c989e925adf647b2b3eb4eb566dd0271283c78a935c43b8d95df8ba53ed49fa58abd09"}, {"a": false, "c": "m1bKrpyr$fQACXN0I}{tcsIhuQ)q;wKvftTnw5T2HT#Df:zMK@uphzTm?gZ%IZ``BA|^yRGz{m8T=`*b)W`1B2co}AGJggzI1_m{%p1Gr{nxpHAZ#dc{GYT6k;FkW6Vz*65JfpB?_p)`!(2EPF!=LhnV`S", "s": "3f5a5af00196cd7aa16e559b5cb852e7", "hm": "6ab7ed9d7802b86f165006cad3fcebe7"}, {"a": false, "c": "mBbf(pyr.*Q#Crm+I;SO&}Whu96ceUg7XJ?28@M-rA1gr;#6<3WF~ji2ETuq=fogcYv1<7YhC`o{G:<_RF=g?K!!;7>KvF%z,", "s": "f2b93381731e69ef9a526bb0c339a125", "oc": "42c7a59f131f8a3211584003a910240bb7d873a9b63ec365350a61831556896285a7f6da8873a104c43660f20b0cb426a635ce6c6d9edaafe731dc49871ac6a9"}, {"a": false, "c": "S:bK(pyr$AQ`CX_r_,2ji}lhuBte;KO30v9yBL-[a##N^GXAzdaWRJO$8*BK)rK=lPV1[^c7=ZxYk4HR>^p]=jmcM`uf!Y(YM1dK$Jg?y", "s": "3dbaf7f943481344dd7ce6118681b416", "oc": "fc0a9cc550b34ee3bb31de7a495fdd3ab10180a7eb6b3e09d42173fdd8ab932d66f81031bcdc20d296b09b44d5b9dad67d759990640ec0d07b796142c6504453"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (181, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB0L@7S%7N?0W$HgP1OJPTceqX%JhWmI{ZPG?lfn$CfXJZ?W!V*1iDNaWz{OfN`taFwlF7h5CA>UBX4]`dIO)UK}jgX(7Toc|HWU,>Nx^$1O}^J`xRKRgYE[i#{2OV?F:Z2HNto9CWCgvOt!Gg_d-t-cW7ljtii6417ELW!*<1h!E%%1I5$fIE}th!@BucU|IE>G+k8lpuh", "s": "94d9df31e5578bd4d21f9ea2db298745", "hm": "80eedbb413f8ab98c8056a34be46d506"}, {"a": false, "c": ">;?)1-JP*c(qKZ;r|K5qT&!~q=;GrFg2#bT?rQ2^uT?MQ2vbxM2qd|J&)}M{5(YVEj|-#UOWau*m9a?GAYVSKIjN?iCh)BJCO41$EjJ!u<%z!=%%1I5RY|];thwFuuc7|TEwG+k|hpQh", "s": "3f9a5d5fd13e1d00a12e651b51ab94b7", "hm": "26be58ad78d2b77f86f5d2ca7a826b87"}, {"a": false, "c": "mBbLRV^%dN?,D$;g)1-UPicmqxw1jsgIC{DE6s{k=Kw#v`GK=wXj9:%dN?0W$;e)1-J,*c$oBor4+fyDb|qoQ{uNXP2XSf9wacD`690~M|6wY5xRZ!H2NEKcX0HB3ogjM)H&@-v7ztHv#2$9ig$1o:OazD!{oJIS)7m(VzErF?0tUh9a@=oIR8^HJ", "s": "38ba0a4abd760270f7c6b71f8f8fbe2e", "oc": "ff8e62731cfeb1682610c834434ac503ce213986f5b25a1028511632e4045e00dc76c2415d06c195569931060e0d79bd0c4bed2ba4588d4b905e1b08d20f7eac"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (182, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKA;R~_qZgNEexd0mCuT5Y[=j&n|0cCvG*,$CfmE5>8de-4qZ}x>QgnqcA0{V^q?%>&8Cr4?E3Y", "s": "949cd6070f3f141d54220b65ff68f74f", "hm": "8267db44a8080bd2c0d98abdb34edd16"}, {"a": false, "c": "mBnKx;;~_|Mhw87#WXU&=iqH48zV_I^FE9EtTx^Bh_EL$$3Uziyfi`g8+6}}#2Z>O$C[UpZK{qzv48>FeL_z%7r@c}+&#>h`YFg%m&1,TqLaqhOY~yIKdOaPs2vC}n9ugdf8+t86L@OO2~2$4flk5{d4)}DR3qA{#4iCfjE5R|9?-4>1}xLQgnq2AE{V^??Z>lfS4+AE3Y", "s": "9a0a5db1816bd630292c83abbd2b82d1", "hm": "6ab7eeed98b8e792660518843716dbe7"}, {"a": false, "c": "mBfKV;2~6|#h78I#WXUZ=3qH48zz_I^FRTEE4xl_h`*~$<3>miipwI08f6}J#2^>Ogi^U%oK#Uz;4U{FeL_AxY6hZs3P%MfAd|iH^d($W", "s": "1379b767d813668f9c556b1b7f396d2b", "oc": "f7c7441fc80f2232155fbb86a9ff3b054bd8d8aa184ef241a54a4771859a89d9ae1df64ab96ec66f555b94cf7b2a582d66386e6eacaedcca"}, {"a": false, "c": "m6b0AU2B_|&}78m#WXAu=xqH4iqNI;f|}H0_iUN!@I%p_PD^%)I3|@>L5)!>D^FTEKMX|J`5Te}7sJ7Y+q:}pXBYAGT^dFQldI(@Af5K`fe9dPz4Y`S|uh", "s": "1a609041367f36efdb2424d8001bc9c1", "oc": "5a613c4529e3427940318ef349af3b6cf07ab464cd72415a8ea53fc4a7c2dda573b30caa8a42d18c889eda8075ce5ec7d6e90bef3d7825d5b9a4363a376cf831"}, {"a": false, "c": "mBbKDx2~OgCu=%oDlU*!{f>Fen_z-Y6S0ssP%yf$d|iH^d|$W", "s": "3db8204f4f572344ee7cb7136f2a9344", "oc": "9e6f6c6573b3417abb01d71efafd145ca74c38bdcde9db1e3f49a4fe3b2e1dc225880f30ffe8065a3430c243bdb778d6ae83587ac7443a75b8d10df2714f6292"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (183, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ-V+*+[O[W~DaH*#YyOMikYU!71uz_Bp4UUvW#b#KGH1,XcSH(SmCk|xP!!Af-EpoaYC-8ZtmTr}Q7A$@w(k>=$?MX*e<<=tiUD#cPE`;!0{ZJ_Q@3Mn^j+cn%y}Sxv1hP<*1eKl$^(%+x$1mi@GHc$I9V<&LAX}T!|H9t{(pa83H~S)wJq-sUN*`0&s~ostkH^qucv8!", "s": "b49bd6010f35845d52949bd97589cf46", "hm": "841bcb479818fb42c2856e6f2e29d446"}, {"a": false, "c": "mBbJ&V+<+WfnW=GaHg#Y!>WHE8YdM>.1a,oG}I=Tv_n<6^Lo7QS>wzl1UcJ`[2>On(#q4]y,7^Gu{Sl*X*wsN`Y!J5fT>?.4~fIrWp|*!", "s": "d90b1738927d08f48bac4812eb4ae9a7", "oc": "fbc9ab1ac81f763716886c06f9bc241bb7e87469c4ee94f1abba7195b54947298efdf2c593b3a725eddc0f02722d5476ac35c96c5d9dd59b"}, {"a": false, "c": "||bJ&V+<+PNnWTG6rg#Y!CJH2Liz6dAJ=LZEs!CbiZstY>&*n}PcHulm1MS!nMJ5skV8CoL6TzthS-au4])8]_qYuX4FvBdeA0r@X_=DyfqU&dAX}T*|H9gB(9aY[_!}gwt3-sUN*fKcs~!stkH^q4cc8!", "s": "ba9c7255a06299d0362e6a61be4032d1", "hm": "ba8791bdf8a8b70f867ebf1a33fddbd7"}, {"a": false, "c": "mBxJ&VQ<+`NnZ5GgHg#$RCMHD)-dMU31ayoGQIz9v|#<6ZRg7QS}`}>1UcJ`C2]O2(EqlP&P7^Gu{S97X<)sF#Y!JpyT_uu4FVmGW{|){", "s": "37b9c7716b18110b9a5b6bbdcb55ac45", "oc": "fb9aa9e7c81f4a442a521c06aeaf240bb1d8fca947aecb45018a67831399b26982a9f6ca89be1b95c5022d0b042a5476ac57c768a439dbcb"}, {"a": false, "c": "iBeJ|V+C%<=u9$EUb~W-ge42&14s2=>FoXl7C%A@$gZX1W{CN6JZ3BltK*(|HBa<[9v%5P($Vy6ek@hW1V", "s": "94e3d19a08edce5db2245b6984268645", "hm": "706efb2dae98ab37c30dba8d86c15c19"}, {"a": false, "c": "mBbM9oawLUltr1T77C*xc^>yK2yid#80AgNqT0k#F27(tY*[p+DP?otbVYE2njD^(d5XNQ4n=H3R?^aER$QC", "s": "ed00b7b5708d30fe867c4e1cbd0413f7", "oc": "fbc7a11ff91e5a33155ebe65a9f2220b1394f824c6a1c40505be6d93159989328eadb8bab953ab4dc1f67d367b561478a9e5e5ccad1f41ff"}, {"a": false, "c": "mBba|-2QLU%a@?azn1}|a;1w=Lfk-~-T1*$jFLQJ545tuj8RP2[o%p4aepYRGzixBg_C(>$YGm-@6XNyOFz@tB82A[GoP=K$^#B;K1>9a3y)KsApcgZX1WmCExO>3BlS#*(|HBac?HqrodZ~8ZI=pLvH^1RA*8LOXfQqq++qd_9s0vN<&V}uKTbz)#CK&7+xpBxMa;Y2+`wx)dvU}wO~cKwn`(HApBj{+jb1BEzTWqt^01cF^t(Fa;p*Dj,G9{e!}uOPcTs5t(bz$V6*A3X1K:6Fn!AWrE)*({J-$T}AcD@K97-9)DCvB}WiRG$Z=r!3$ho1nk", "s": "9bb3d6b15ba45b5052249bd06729c442", "hm": "8069db4ea247ab82c3065a35be47d104"}, {"a": false, "c": "mBb>ZA|9B2U{.snk2az|j)Gv`Svl0{QKTSS-U*$>)p.C8#My;w6W3&4h>M!|#2`7CLDzihv)Eq>I4XqdEZ=`,ND5AdIt~QAlc;ciB%$_>", "s": "790997b5e07d104e8efea6c6e007e3aa", "oc": "fba731afc81f7a628554b41da925240b9708e30296ae44d575bbbb1db59c89698ed3facab913ade0d53866a075ca5f2da9657e6c8d2fa132"}, {"a": false, "c": "ABbVZAD9c#`{OsnbrC?Sj)cv`LjQ)X$p_~llj&7h<)2Q}e5m*>HcxU:h~k(`D>cn[n1>n07YBC9SR?Z!<}77_>tjaq_~1r4I{A>Up!DKT5w`#M9WrEM*}{J-n,zAcDun9|I9)D]s%}AC4[$Z=d!U$ho?n}", "s": "3ad84d5606665100fe2eb51b9690dad1", "hm": "3bbadddd78d1b77756721617d7f056ef"}, {"a": false, "c": "mIbPlAt|c2`{uzV5ra?H`)c^_8vu0{fK}_SyD%<>Jp?C8#My;{!WtU4h>Mv<[{`-E`8z=UvY#q>I4Xqd!?=+rND{rQIt~QA&!;cCB%7eX", "s": "f3b93d8e491a69c2d254601bfe34aa5a", "oc": "fbc1a11ec77f2a338f50bc06891f270bb238b4a9c49ec42ca19a3d9c18d9b269beadfe4ab91f2bc18c44620c1bba9471a633bd2c9d9111bc"}, {"a": false, "c": "m~`JZA|)c2`{Osnrra?Hj)cvrl06_ttt}glietGe[yCTMg0CS`h#$|0>I|ijveChO#CCfOY]nXGP`%6{hTy&As^~yBgoC(LT`yu&yftM80>96vFWMMVpuh", "s": "966f597526e2e2701b7420d80f8adfc8", "oc": "f165c60f62be02cc630b8e18543347b2dae8790e070721cf86a2d6628b2ee1d6f5439ad98555b529de028d0b4dfbaa8ded483f93ba8c357d623e8b21ac22bfd7"}, {"a": false, "c": "mBbiEA|9c]`p.shrra?K)Iv=`6LBDE#>7UH2u3Vsbg%ylyV4vB#2`-TLDz=hB]|E>I4Xqd!Z=+nND{rQIt~Kf&!;ciB27qX", "s": "3dba0d4f4a751fa440aeb24f6d88aeb4", "oc": "fc214d653e360113f061e0eb677cfc28f539f6384d47b6be41352ee9dafac282a70115591276d7e7ada9299f772995097d8643c4aaacbc210e4cca708e23470c"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (186, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB{KU>g2H2TUi~T{>d8c9:nTEYU)9Ln.=6jQUINowu2E?<(r,~X~HstBAS.TOjoeQuI`B+c){GeFRB_E;<^)-=>TGwP+P~@y+w9)=8Ov}p#2_Xku8rKl4Sa5V6uNI#iB_+T5i]T~z1k;t^)-g>IjwP+!2}y)w6B=8%>zp7F_XKt8rKl4La~{6xNioiB_+puh", "s": "ba6e99b6387422e0dbe42dd8b23ad218", "oc": "f8671c66c30a4f39a3618ebc6c49320d3379f98bcd6b5030fc5d07702d6083c76e2c134b10a59d4dda6b2bcb6ce69b0c9bb487010b9d67e69fe9780b9f565931"}, {"a": false, "c": "m5bK_&_2H2TUiXT2uJMi;&{.Bjo7`%nj#2_Xku8rKl4LQ~V6xNl)iBaz?)n$Er&oQ4C}J_Bsl`w@y=ZxMIS~!w{uc%KqJv^FQh-fjj2Nd3!8skdc`58ydq&hAZ8oqHckZ@#&Q*hk;^_7qf|hoEimz{IM5NM!caI6ThDI`>VD8}NV%eDvLo#2{_ywl++_w8nB6hg?vrglkUQnXPkcG^HK2mo7Z3nxy$S", "s": "d9f893952f5df0fe017ca716e5031fb7", "oc": "20c7317f981fe132155cbc02192f2454b0e05da3c6ae2245a63a579155a1a9a900aa464ab9bee10505048d0dfbf24477d6a8ce0cadb9c5bb"}, {"a": false, "c": "H1b.WvPxl`a~GhoFv!#SK|DDVLPljEu!}1mw5v+Q*huu^%7Of|hoElVzGI;bNP!2kGXr1>$", "s": "3a3a5d580176936d182ea51b5886d2dc", "hm": "6ae7adb1e812fe708674241ad84dd5e2"}, {"a": false, "c": "m3bLzIPx0`a~ihomv:#SKC+fV8)c(L(X9FO;->csIk|hDI`VV6a}=VDeDmLo#E{*Bw9+v_A8n53hg`vTg-kWQQG(kcGCHK2]+hZ3nx>B@", "s": "b3b13783751861df96b56bbb46e7a72a", "oc": "fbc9a11fcef9238ca9533c06a51f240a47e8fba3c6a4cb4ba5ba0dd31599896797a7fd41fab75a47ce476d029b21e4e2a630ce6cad9fb2ba"}, {"a": false, "c": "1B_LWIPxOva~GhqFvD#SK|+)VgCe8R*C{.Z0=X>Oc]eqR8^jMRn{ewrOXegraUIoLgkQQ6)o{chZSSI=O<)3iauc>4P=AF?HN8YJO%Y_Tq>_}C|M;4|p9h", "s": "f46b9d7a3674227bee2d2d7805aacac8", "oc": "32e09cfe335a42b92d068efd526d000aa7736e241e04685dcc16c67ff17ff3cd5339f0728a331cad3a848947f81a055fd03b2488124cb814f70c92713a06c5e1"}, {"a": false, "c": "mBbLW=Pr0{a[GhoFvD#JK{HDV6UNb%Ew11oJRvsg^xVXcum=qS#2{C&wlv+_w8od3hg?v9<-W#QNG(kcGaT[yDT7Z3nx>$@", "s": "1d130741ee7c9e4e6e74171f667177c4", "oc": "ffea9165ad5381a38be1d798089c24ade5d903e2d5b388217be910e557abcd126974e21cf7c3f913a8c4a22a01294b011d5fed994ab0f752b2e0a5709343273e"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (188, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBcEU1A4GbF9_$64hh(5;v|,{Y9S,7H5DqJM-UtmtAJFD-rpm|ybI(bJ_38gBWL4JxC?z$qgeJ~buCHw&~>@%Q[;hon`6*==!N4FVKeB%B=kT0)fUguJ>_IJJLbje%|Tm^9350skUVzNR1d>jcJH#rF5b0<04B8&A07`%t`BCz*icT8>e~zakM$5-;EiVz8_*^my1YRm>!Hq", "s": "9493560f0ee78c7672249b4677fe2746", "hm": "8167f144a8f8c8328385bbfdbeeedd16"}, {"a": false, "c": "mBiLU#!u1)W3[|r44h(&;5|D{8G5Xe9m{xOh4)XL??yh6X-WGqH8", "s": "de4d17652a7d30fe869fabb69dcf7767", "oc": "2b53a11fc81f3a32e578bcf1a91f24abb7d8fca986ae14c5a5ba23931499f9099ba5f65cbc33adabc5d66d01426a5b78563546625b77a2e8"}, {"a": false, "c": "!BbjU1c41)R9@|Q4,3&5;v|K{nTl1AJl2q`pi*EvIA*7ZWKp&Pv8NIHN)`O^dc<1(F<{tm3s%w*bvChDGw`dMo9EQ$%6M5m|ANzcy^|AfVQ%t`tCz,iO%7Q=~zakTx5-;E$Vz8_*,~e1YWm>.8B", "s": "326555660ec64d09ae7ee51b54927dc1", "hm": "6ab811d37b52e71f117f163aa49ddb47"}, {"a": false, "c": "mA#LA1c41)W9q|644hG&;R|K08(5Xe9m`WOQ4r)L??yheX-WGqHo&DzuvUEG#z}y8}I@6:oJ3GM}Khh}d{?^SpWizvh(Gfc`j;^`{p+B3", "s": "f349378c7618f10fa35e6b7bc9a7da2b", "oc": "fc4761be3864f53215d3bf0627efef0fa7d85829c67e5b4f55bf8d3910ad8a69ae5efdda6ebfa09dc0366d22792d535a8675c06c4f77ef9e"}, {"a": false, "c": "mBlLU1c4@?y9q{6r4h(xX8|K{B`tAY7D@4_&h+C5trHRnV=|)hCPvUiIy1Phxx%(@Yy1JvVU^?zp]~9T6hg#IO|>jjq(POCHUKL&kDG=Y&?-5yf,_V=puh", "s": "fa3f96efceb4e7e18b342dd10ecac9cb", "oc": "fc6a9c6e5be34db63274ce1c16cae946230351d2f614f7a98de9199260a5fe40fc274034d28273803676fcb94ac5f793360e4334419f581f36ace14675fc2529"}, {"a": false, "c": "tAbAU13)1)W+q36@4O(&;?|K(6BUWiJXM;)@RRrOP|-7r8sICF1kPtG:IDytGm5n^5LWiuvE8xf(,(;P`7p>B|", "s": "34470d4ffd7f18446eecba1fab87c3c4", "oc": "fc6f2ce933b341a0bfe1883de907466ccddac9c82a1e5190d5db2d644b3d3fbba73d663f1d0c2ca7aa711e8f1d8fe81a55c4b5797c7878531666e9a9337fd169"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (189, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKlKp*MeK{>Wsq>A~keTZAcYM9=M|8fb~+6>=(@t&DFHgH<-u}@lh1vX`JM2j}wLI{zT6bJN2)s~oI*L?uP;:iJQynyHXQ9Y79k+Cspcm7S^HK9lde?FIWkMW%6dTJ3q.&UMc8}Cq1d}rSMF>P%C$>RmS|oT0(Ggse6t(Y{|zho`TC_@KZ", "s": "459bb6010f2b83555174ab6247238dee", "hm": "5068df41a148ab12d3858ab6be3e1a16"}, {"a": false, "c": "mB9E%Kj*mrKD*Asr>t~|eT+AK8$p-%~%q$u1e@mdMn$9d&|A;-u7l;A-BWZ_#2`Ehz#S.Vu~ATGwN4C!Af!Zrrl%_zCHE0lcd!S*AuZia", "s": "d98f97b5507dd5fe8873a816160fe40d", "oc": "6407a81cf81f8d721e526d260c2d6d4979d8faa9c77eb448383a0791f5939f49189ecc1549db8ba475b660b2882a54761b31ce6c2e2799e7"}, {"a": false, "c": "mBI~_eTZ3cLZs--qE$a~=)-c5DkBf~Ku%DPeHX>hf84D6-rokD(@zBM2on8wdSv!xa%!P+7ARlo_f)I<9fAfVUj;!F0kWk*AUqOdAr>^Fjy%C%>Gm-|oag(Gxse6t_Yr4zPKAe&_@KZ", "s": "3b9b5d563c460f0009ee85cb1492d2d6", "hm": "23b70d05587277f38674151918fbcb62"}, {"a": false, "c": "mBbK%Ks*Me:3AAsrp[k0TQ&[CG}IPil;QOtEFS-SyMqYgDfx;8O?phhPTaB-0mDM@|?=HA^Os`8PN>ePQ4DkOjEYtTrX05oxR>61k-rpuE", "s": "4aae2050592422e0d4d428d803e3faf9", "oc": "feda9cdcd31db21ab3e018da9b5176eb896c283203f021e745d94a759f87ffd3f18c9aae07ba749f1ee362b933a75744617d37a84c703db2cfbbbce1f01e8a97"}, {"a": false, "c": ",B|KZKs*MeKDAAsr>I~ke&ZAc6GE~_22OU1k~eFZj54&a%;cqp#2?SJz#$NVy%Ghxw(4DO_fBZr2G%dDCPE0Ycd!z*AN0iP", "s": "3db000304d35230c66a3571f3a803074", "oc": "f0ca976649c391a7ebe1d67c43153a6fbbd2c53b863c77d27a2d8cde553583cf2f3ffba7ad20731d0a129ab6e5cb89fc6503c6b4e022ec08837e1b18b1558ffb"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (190, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "lBbGCp.r$A=$CXmfIN1Oi}^hua%Dj&eY~aps=IX%RazaFMhKv6%zL", "s": "4f62e692cfe7745d52e49762a92909c5", "hm": "8067db44b82f1b3233056a3db359df16"}, {"a": false, "c": "|?Laypyr$AQ&CumOIVmO284+u96ceUg9nV?28EM-tzXBr;^6<3WF2jd2EQlq=f1gcYM1<Dvp%zy", "s": "090b97b570ed3bfe8d0678d24ebfe7a7", "oc": "0d00a91fc81f7af25591240fa91c240e06d8f829c95ec945abba6793f5047869eeade6db6973af4df52e6400792a54661035c62cad8eda8be57ad9c287ac3fa9"}, {"a": false, "c": "mBbKnRyrcAQ${Xm8IVNPi}}huL-r=@96it2+15Z4MK9sf9Wg~WuCtztE?8ZT6Q`RBAdDP-{zWm>T=`6y9{?DB2Io[A!XHDzM*_|{%^1GO{WxpH{X#dc{GYT^k;F|W6Vz*66=fXBb_pG4!(2hzj!OTR]V`-", "s": "5d9a5d1681389d05432e35db5c90ddd1", "hm": "ff0e9eb472d2b87486011611d8f6db07"}, {"a": false, "c": "|B+&(Ey^$ATACD~K=IPqi}Ihk96cNUy9XV528!M-t>RBW;^6?3WAOjd2h[8q=Rogc{M1<~vR$Z+O(z<7YhC`]{G{(;RF=bBK!+;7>KrJ%D1", "s": "f3b43e89388d13df9575b7b2cf3758ab", "oc": "fb0ead33ca2c78a075093cd6a71f240b15dc96a9c69ef3a5a7816772155989698e0d054aa970ad05cb36cd08792ad246d6c5ce6cac96da1b1531d28f874abf79"}, {"a": false, "c": "UBbK*pyvB.EACXmM[VR(i}|huywV;>JBT-0w##}DGN=#duJCrq$8*_m)0p=lmV1>2cf=r72M1<,vB$Z+g(zp7YBC`o{1{(;RFyCKvJ%zy", "s": "fa6f999ab674e2efdbe76d8ffce83a3f", "oc": "3c5a916d337342e9930bdb2b71ba72226844d24d522b246bf4b98b4a10e181af7c3a0315bbedce3638bf07e4f4a91c8e48d22f78cf6fa226a1d17dc64015967b"}, {"a": false, "c": "CBbK(pyr$sQAQXmO;VmOi}Ihu6n`_z>f83O>k4Ho>^0_=tmcM`uf!laYM1<K~1%Hy", "s": "afb4f04f42782144327cd71f6cf1bd42", "oc": "fc08d68be3bb41adbb01d8fc3213729eb3f4a0243665de0f1f778ffdb3addccd66d88a89a6dc20b296b0e92175c998905735c45b670ec5cf7b710148a079f46c"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (191, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL588%dN?nW$;g)1-JPGcmqX%Jh%0ZKZ^4?lVn$CuXJ$%a!V*=awl|7hNcAnQeX4+`+uO>JjpjgXo7ToG`HW}Rpe{^$0O<^Q`?CKR|{0g)#iu?V0~3ZfENh", "s": "5093d2310f2a845d78149b6a1729b709", "hm": "b6f7d14da948da22730a2a384f48df16"}, {"a": false, "c": "mmb=@V^9dNu0L$|Q,1-JPic(q8w1dsgJ>hD^0*{k=Kicv$GK=wXE9v3J5CQi9x^fUgv1o_7azD}=o3I!J7m6V^)QU^{tUh?^@-o0RR^HJ", "s": "d9d85a25fefd90cac7b9a81671eff4a0", "oc": "1ec70a1fc40f2adb5553bc07a9ef830cff1833f976bec445758a604355ba426d9fa8f14499b3ab45c586fd02702a7426ad34ce8cdd9edaab"}, {"a": false, "c": "mybL@V^]dkc0Wc;g)1-JR*amqK(;Y|K>9y&E~(=sIrFg2#~v?wQ2^2G?MQBvb$M{qdKF&WIM{5q%VEj-B`v@Va%dN?0W$;2)M-JP*cmq8w1tsgIrHD^0s?k=K$Gv}GK=zXja[3J#%Qi#2^fUgv1o_OfzD!=oJIS?mm(VzVQU^zt}h?^N=oPRR^HJ", "s": "73b9828f7e18f103955b4cbbf907da24", "oc": "1b57ab1092782a347595dc06191e740bb158f3f3c6a8ca90b5baf7e31f0e99a91e3dfb8ed6e3bb45ca50674f0baa5476903d1e1cad9d3a7b"}, {"a": false, "c": "mBbL@t^%*N?GW+rg)1NJP*cm6Bor4+zy.b|qkX|uNX922SfwUa;!`690sM|YzY5xR^!8GEE5%+}Re?Zw8A!K=qLlHmS%+iYpqEFk$Nnhtq|L3yh)@TgmE0Pq4mCuT5=>=j&nVbf}v=iX$|Rx3_>pn3~niR!:0njFsTE7cvVznH5KN&|N;6AYnEe)F~DtWX{85Bgylb8rLAo3Y", "s": "9423d60d5f05647d62b42b60772b5745", "hm": "8007de44ada2ab32e05b6a36b994d7f6"}, {"a": false, "c": "mBb|A;3~_|&h787#WXu<=iIG8f6bJ#2^0LtC^;%:Z-UzQ4U>FeL_z-Y6h0ssPHyfA+|gH^dF$W", "s": "d9e397b600fd60ae067cad12250fe9a7", "oc": "fecca11fc47f22321557bc0f9916140dbfe873a9764e444d1ef067836592d2666eaef413b3bca2d9e00ae4024b2c847ba135feacad6ede1a"}, {"a": false, "c": "mBbKA;2~_|&S787#WXUQznqH4LKI%y_#+NZ>%7j@cP3I#>|@e@g%m&({;q}aZ@GT{eIK6|NPs2_C}n9urgf8J]^6M@;O2~2$4fWU5%d+)laR3)AQ#RiCfTE5RNd9-4qZ}(LQgnb2(0{x^??,>`NCrxAE`Y", "s": "3a9e8556043608600221856b6592def1", "hm": "6aa750bd58d2b77f86351e18089f5f37"}, {"a": false, "c": "mBbbA;2~j|&h78{#WXU1=nqH4#S?_I<)EAE)TUjBTnCtTZ3UaAidiIG8%6-J#2^8O%C^U%oK#UzQtUmFeNtz-Y6h0ssQ%yfAd|iHZdF5W", "s": "f3b9b7007618610099afb7bfd337acab", "oc": "3b57ab1633412a311530dc06a5bf240b67daf3a90897c9e1e4ba6bd315998f378a1df616b593ab48d5926d037b285472c6324e60a5eef1ca"}, {"a": false, "c": "mBbKA;2~_|&;787#>XU&Inqq4C^`I)f|7H0*aUN!sB*KLPD^%ZI3t@>L})l>)^FfEHFX_#`2(j}7sU7o6l;}}QBrAaP~d8QPdI7@mf5?FfeWv!ztE`Spuh", "s": "ffeda9751617e2e08a242fde05ebdac8", "oc": "fc29946539b34799a30a84ec9ce9a36cee454864cd75a754a8f83e22447dd85f23b1e9a0ba1a815c8d42de420bfd5649e19906195d082a3455aeec3274a29831"}, {"a": false, "c": "6{bKl;2~_|&W75.#WXU&#nqH46KP09eJ3<=|Jqz!_ki?IG(B$L22^>OgC^U%oK#UzQ&w>Fe}_zRY6%0s#2%yfUdG0);dFT-", "s": "dde00f4f44d82344af4e3e1f4682b244", "oc": "fc67956103b3bab5bb74daeefbf13a57edee9c44c6e281da51bfa6f07bfed4f37547ef9ad428935a24cd324336270e7eea8358724d14f0b10dd1162059ef02f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (193, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m=b6&V+X+E6UWTGaHJ#Y!C,7#YUj70Cz*BE}ATv1.P8*1qKM.^(%jx-1m-XGic$;XV<}LAXCTz|;lEv(Xa2oH!SMVJ+-sR2*`A?@A!sA^H^q>cc8!", "s": "966396210fe79784f25496e9bb09c795", "hm": "8467cb4f9a45ab33c306ec20daaeb61e"}, {"a": false, "c": "1UcJ`#2{O}(Eq~b5P7^^u{StlX*)s|#YEJpxT_}u4UfOrmC|*s", "s": "7103b7b5a07d3067867c78cb4d4f84ad", "oc": "f4c7a18f1d19fa36d6e1bc8a6d0f0f0b87d8a3d98e34ce45acba6997159ef1cd9e7df9aeb6ba7204d98651027b0154645736ce6cab1c9bdb"}, {"a": false, "c": "8Bb3&E+<+WNnWTGaHg#Y!CMH#LiL|dAu,LZZB>CbiZst#Csvn}PIy]sf1M9vnMJisIv8@oL&jz)hoI87ECG8j_qY^78F}>WX<0b@x_=DGfRUjdAX}cz|H9SB(M_8~PhSjjJ3-sUNR`Icsnv{tkS^qPcu8P", "s": "3c9a9d56c1b69b00a0f6851b6398ea81", "hm": "64b75bbb72d2770f8634161a67fddd47"}, {"a": false, "c": "RB>#&V@<+WNoWYGaHg#Y!+M^lP-dM^31ayodhI*{v&E<6^Uo7QSi`z>1U~F`#2u=:(Eq~PZP_T9u_SL7X*)sN#Y!JpIT_KA2U1Hrmp|[$", "s": "f3b97a81de18f30d9055176ec380aa10", "oc": "fb87a115241f28d51255b606aa1f288eb721f3a4ca4ec445a5b94746a5968cccbeadfdd7bdb3cd156dfe6d0b7b205dffa63511623d9edbf3"}, {"a": false, "c": "mBwJ{F+<+WN>sTsaHg#KRCMg#M}MUqDkGI9uOYF8zu)uuw8c>IrEjdWf96+d@Zn{~2hv3OI#2{On(Eq~=Zo7^Gu{SL7X*)sN#Y!JpxTsu|)=jmQ)p|*>", "s": "3c3c06254d732e446e7cb71e6611b34c", "oc": "f3ea4d65332342ad4bafe4ee9d5cd2a2062c5139585e16722235c47196f1b5876bd49bbc3fdd5f578e22ba122dc006fda1020c14550e81a0cd3b3efac3ddb6f5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (194, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbM9-awLU6,]z<3&9|EKt~WQde43^#4s2=pFoXlMbk!pc3Blt]*(|H#a>oCv(5NR$VSMP&ZeW1}", "s": "94a7d6010fe74a57578498607773534a", "hm": "8c67d00ca8e8abd2c5b55239b7eddf16"}, {"a": false, "c": "sotM9*-bLU6a;Vdb2YoQ7pC*z+|>yw2*Kd#*0AgNqT0K#32G0tQ*3p+DWQot0VYEjnj?r(d5XNQ4nTpxR?OaEqeQC", "s": "d97d979540efaefe2f7c7c16fdd5f4c7", "oc": "531184175fdf6dc21fd34c0aa12f264bb7d4f1a9c52ec465a57a676315e9826928a5f64ab9bccb45c5666d2bd6255aa6a63a32e4aff1d4f8"}, {"a": false, "c": "mBbM9-awLU!{-?+gL}JeS;@Yj8RbQNY+pCaeGY,GzWxBKRPi>$~xm-^6u=??F_wtv8QA|bnP=7$^#Z;R1>9alf)SsrpcqZX1WmCNx.>3?ld#<(|H$a<)9p%5N($VTIP|-%W1M", "s": "3a7add5e013c0d9ca1250d6b2a90dcdb", "hm": "f8b733bd78dab7785613761a08add2ef"}, {"a": false, "c": "mPbM9-Yw8U6aG?+Dw?~T};Cw|8ywI&fd#80Ag,qT0K#EncxtY+Lp+}WBothVYEjnjDE(d5X~Q4t9LpR?za8q$QC", "s": "febc3781098b6f9fe09262b18937df2b", "oc": "9bcca1e338c72a32be58b00ca90f2b0ca698f3a9a8713945a33ac693156de9698fddfa4079b30b41c5329092cb2a5477a6357e6ccc6922db"}, {"a": false, "c": "mBNM9-aw@U6cv`7>J6Kt4RJ98UO2mQYL+Pqd_9snvN<&1ZuKP%z)(?Gb4+x}BxM4;Y-+`wx.`O-,4xtcKw@`(-XcdjmqE{1pLzT!{t<01cd^h(pa;pBD=Lk9+`h@8OPcWE5t(az$Ve*{}%1SGITn)AW*E8*M{J-mozAcD]:97>9)DX61}EC4g$@=r!U$ho1nk", "s": "5a2c8e9108e4020954149a6973c9c745", "hm": "50f72644a847ab3d83056a70c74f83b6"}, {"a": false, "c": "mBbJZA|9c2`lOsnrr)?,j)]v`84w0[XF}Syyw%$>)p?@8#p$AZzWB&xh>M!<#2`-TLDz>hvYJq{I4Oqe!Z=+nND{tiCt~mf&|;c!Blwed", "s": "da0b9eb52d7f3efebc77f516e6b5eca6", "oc": "fb9186cfa77f0a321a54cca0791f2401b7d813acc60e144a055dac951597c969f6ab9b4abeb3a9daa6e783023f298a96a6a0cf9c8d9f41f9"}, {"a": false, "c": "m1l>Z!|9c2`Nc6nrra?Hj)cV`vjQzX$&_~lRv&t~Hc1ik8lkl`D>&aobBrhiCYBC9SRiZT{},x_>=FYq#%1r4}6[OUpG[KT=L`OoAWrEi*P{J-Mo~A,Dumw7=9FDC6$}WC4N$Z=M!@:hoink", "s": "aa5d5ab671365d00a92e857b5492d511", "hm": "fa08ed6dc6629725d6c5165a18fe0be7"}, {"a": false, "c": "?BbAZAr9,2`{Os>rra?WH)cv`8zu0kX_}S)p`C8#My{w6W3DXp>MQ|#jz#TLUzBhvYJH>I4XqdOZ=+nND{r4I>OKA!TG9iB%=eR", "s": "fb09e7910018a00f755b9db4c3a2e07b", "oc": "fb5a443f78ed2ab215531906091fdafbb7d8f7c779a9c14747b217f7049b28688bbdf64a59b0a4452535ed01dba2347f07555f6cbdaf4ba1"}, {"a": false, "c": "mBbJ]}|=qe`{wsnrra?qj)cv`C06PttDegl|I%ij{pChC?CCfO>;nXOPUG6{hTyWAP^~yBgzCvLT`ouk({t|80>9&vl[MOVpHh", "s": "7a29969566d41ce07b412468c5ea2f41", "oc": "ac6aac2533b44c1d6391d1415534237ad6c87b1e210722c9b6ee3c6c8b8d18d6e5a0f5c8b5f54790db2ee60042894b9ee6703f735f4c3374cb2e8926a182bf67"}, {"a": false, "c": "mBbJZ689X2`uOsSrra?Hj)cv`iLBD}#;7qv.A|V$qg%~lyV4vBn28-TL-z_h-{&q>}4XqO!Z)+n@D{sQIt&KA&!;KiB{7eX", "s": "3d5a07404d681340617cbe1f6626f349", "oc": "dc0a956106b3c106bb7fd7efd27cf8e8f5982f603d67a0504464c1ece5ca60f5790751cabf75b6515430173f7dbb2931dc8b767ebabebcc3dacc88028c43de14"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (196, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mfbKU&;2H2cU>BT9E;uR5w>sjBAS&wOjKiQuw`BLc)wG*.LQF5D2l[DWHb?jhg[J7w;*lH", "s": "9221d601b137845d131d97686b39cf45", "hm": "0a68db44a8482512c7d26a6d4eecdfe8"}, {"a": false, "c": "rBbKU0XOHM&;1$;<^)>Y>rjdCvP;?,+w{)=8kCzp#2XXyu8rZLQ{n~<6xk}eiB%+c9eP6>", "s": "d9eb4ee5207dbb9d4971a0182402e9c6", "oc": "8b77c0afc41222bb45f2bca6a9cf2b0bb7dbf4a03688147305b1679a15a981ec885d364ab1baa558c03162c67bcaec96a6dfce28bd9f4eaa"}, {"a": false, "c": "MBbKU&XjH2TUi~T2xd8c9!zf$LSdCl9A>8%EVR*?!8~kX(T*T5vtl$o?~J@p{J-+34xYuW8`.KR<+MR22Gu=Hk`Tn8z$&aI`,&=n69|1WB<^)(gfBjwP+P;@q+w6)=8kC6Sm2-XkJ8rKl4La~V6x6n})Q_yf6f2GeV)Q+L^wm+`{Vw@e`aOjLS9vu`n>JBXiW_LPfGC_3P_wpUh", "s": "fe6f99753464e0c5d37a2ddc53ebea36", "oc": "acaa9355b3bec8194f0e8e1d9ae9f24d7929908bf4403231306d141d98005817d4af734af07d9be3d4bd2febb2469b0cfbb625ce0b0d63969f901d2dd952acfb"}, {"a": false, "c": "mObKUP~;(2!Ui~42?WngE2&I>4C}9;BJS`w@y=ZcWIkTsD&`_V6v}NVPQQmTo520_&ml++_I8*BhhgVv9g-@WQNG(eGG>HK2*n7Zuoa>$@", "s": "d30b971524a9303f817cc816ae0fc457", "oc": "fdc4c11456695a3d5523bc0a7914f4ebb7d8c3a9c536b445a14ab77d422fe9598eedc69ab9c5ab45ede60d0db22636a9a6353e6cad9f8087"}, {"a": false, "c": "mBbLWlPx0`L~GhoFvJCSK|+DV3VlE7d-o1mw+-+x2)|(8NPO>PT`={zO||cArq=}b+yt(AjAX*$QW?-#HFGi-2HP^n%OIYspH{C*#7KhB6YnV6AZ_oqHX)^@#^Q*hTq^_7OI|hoEGRzGI;0NPD2y$nrl7V", "s": "349a515c01369f9b899e85bbb49088d9", "hm": "3eb75d7a7fd5be7066c1c48ad8f2dbe1"}, {"a": false, "c": "mobLW,=x0`a~GhoFvD6SK|oDV83N(=(X9VOz->ceISTpQI`VV}a}NJ%1rmIo#2{_&wl++_w8ni3Cg?v9F-lWQNGCkccC~K2^z723nx>$@", "s": "b0710647e11261ef15eb6babb327aa2f", "oc": "f0a5a11fc01f8a791cdc860e3915240bb548bac19830c44025b5099d5f9989c18a1de6e5b9c3abd59a646d6a77714666a40d628cad9f42b4"}, {"a": false, "c": "mcbLWIP=0`a~GhoQsq#SKl+DVCCe8R*C3LA0={>#+f;q`8aWsBssewr$D|D%}U(5LdCQQ9)o{QhZSS@oO})3ps=tVMP=AF?RN]kJs%5_Tq?_<||M;Fwp$@", "s": "5d9a7047467a2e445372b76f6a81bc44", "oc": "ac479c653093e1a3cee877cf056e248ee4d903ffc523868208e9e035eacbfd16b8641efce2c3e906d8c2322a91bb4131f5676dc1bab4e592b120a5d3960da113"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (198, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLU1|41iW,}|64~TN&;_{;{b9tG7g5DRJM-UtmtvJ,D-;pf|!0IQbJ_38g6>SfJxjAzZqgrJ~dXCHw]~>@%Qg;jo[i6*t>!&vDVAe?%+PNh0)fU?x_>_IJTLdjex(Tm3?350kkPVQ)R1@HjcJHCrFkb.<0&58cArMZ%t`tCz*iv%nQ=~ja!Tr5-;E82)8_0^%e1SEm>!f{", "s": "44939649bfed8e5d52649b678d29cc45", "hm": "804bd8647848ab36f3332a3db549d316"}, {"a": false, "c": "mtbLU1c41uW9[|64;%(&;v|K{8(5Xe9m`5OC4)RL??yhe;-,B7H8&DwuvUEG#[+y8|IC-1kv`G}EK{n{*n?^e!Wiz", "s": "df059715b08b3c148670a816e9cf04a5", "oc": "88cea1196b39fa2e1713a306afefffebb7d8f310c5ee05d0abb0672e1d6939b9dda7f12abdb3fb9ac9368d077b2ac476b4359e63ce74f9e6"}, {"a": false, "c": "P@glD}c41)W9q|)41h(&xI|K{1TrtA!hhL`pi*@0I?xK{Wgp&PvSxaeN!n-B;L>9`v-_b!P2", "s": "3a9acd5f01365302aa2db51bb295dcda", "hm": "7ab759bd78d6bb3f36f11f1a40fd3be4"}, {"a": false, "c": "JBbLUtj4o)W9q|644h(&#v|]{8(5-e9m`5,Z4)XL??y1SX-WGvHDED+uvUEGs2}yz|Ip<9kJwGMW)qUNmH?^i$WPzhh8x>(>];k`^p+B>", "s": "f0b6570d7818610f955b65b1c7f2a024", "oc": "96c7211fc41f7a321553ecc768c6240782d4f3a9c62eb415a5ba67f005d9936985abe1dab9b3ab25623bb8027d8ad1f6a735ce6daec7a6e6"}, {"a": false, "c": "mBbL>1c41)m9G|6%4h(f;v|&{B`LSYX+@G_eh%C5;_HRpV+K#h-PvUiI`1v{#GJ!@Y5%J|V.f?NpqT!m6hG#IO|>j.qfPOBH=KLUSDGFY&?X*yH!_Vcplw", "s": "3a7b11654ae4f4006b84addf05e8fac8", "oc": "fc6f9c6533d34b19a36502119d5aac48c3b151cb4fd437a90de989f2d7accaf1dc2e20a1765c774a75b49fb15ec5c7eeb1fe149310bf5842cfaee0fd0c593fc9"}, {"a": false, "c": "mBb#U=cO1)WBq06P4h(&;v&$C3BU0iJX<;N", "s": "3de320bfad7523646e72b71f6661c34d", "oc": "fcba9c633ab311a3bbecd8834eec493ccdb7fbce72fa5b9fb3ad22b2ab3f3a7bd0cb7b4cfd596c05fb522e1f58e93c1d04c27e4720a961535447b966339b4f01"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (199, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKgKsKMeKDAAsrOI~keZZAcYMbb4|:fb~$D!=b@t{DF_g%05uEFVE1vX`vD2W}wLjG(.y[JN2)}~oVFI)TbVW$1Q)3PHKlBW_Smq>t*W5lP5iiJp>%VeXu9$79k+Csetr7#?HK9xdH%+Iak5OhmdKy3q}&*^UE>U}1dAGOMF>P%k%>Rmq|o~0(GQsf6t_Yr4_uNAT&_@gZ", "s": "9493d990af37842c53d498d974d6c945", "hm": "80c1fb44be4cab620f051a3ab5c8df73"}, {"a": false, "c": "mB}KCKs*MPKpuAsr>I~kJTRQc8$p9%O~qlurm@mNmn,9d89A;(u&l&>KBbZj#2`Ehz#$Niuon8udKI@5a?!J+mAbldQo)IP%v%>.ms*J~0(Gose6t_Y(Kzao>nT<@KZ", "s": "fa9a5d56016d930779218b1be490d2d4", "hm": "58b82db97892b7778875a11a3c23dbdb"}, {"a": false, "c": "1>cK%Ks:EjKDNTsy>(~Fe3Ztk|tp9%O%p$urW@*t+n|9d89A;-uIl}A->bZ5#2`E6z#$Njut;i^0kodR>6`,-1p3n", "s": "fa7a9679124692e0eb2422d8b46ac2c3", "oc": "fc6a9ca113931218a702b8f8a2027621156c0c9410fc11e0474dea7b70fe96d923619235977e8321de3d08263fae26449179689ff87e3963b8e8b5c1501e4f57"}, {"a": false, "c": "mBCK%Ks*c)5DAz[r>I~ke&Z+c6Gz~_&2KC1^Pe`e-54&aG;#NK~2`Ehzd$NVuc3@xw(4C!v>BZr^G%_DCHE0$cdf@?%(;L-C`{;H2E{kHX^razaF=8Kv5%zy", "s": "46e386a10f7c6f5d59147b667c89174c", "hm": "8069de44b928a036230c6a3d6e489fe6"}, {"a": false, "c": "m9bL(pyq$AQGCX>+]VmOi}Ihu9>ceUg>GVNO8yM-2z#Br*G6<3WFBjdlER8g=f}gcYM1<IVmOLNIhu5JrR]KVitPh15TgHSAGf9iP-sub.zef?QAT>Z``5A3SP-GxWT8T=`6k]{?o.2?o}S!=c0uw*_|{%eKGO{Wxp-AG#dEXGNT,k;?|WdV]*6A{(XB?4pGy<(2dz~&=L+nVQS", "s": "38e25d2601363d00a92f8e9a5a90d2d4", "hm": "64a70c9d88d9372f8673161ab8fd3b1b"}, {"a": false, "c": "mBbI(p5rE?QACXmOIVmwi}IhuT6ceUg9XV|28@[-Fz#B>`^_<3WFOjd2!RNq2NogcYMh[!m^$Z+O(zrEYhC`o:G{(;Rr=bBjES;d>KvJ%zy", "s": "18a9d786084d61afd35b68b713370d48", "oc": "dbc7a46fc81f2a3a7b83bc09a916640bb6d8f391c6aec8473a7ad79315320f6c8e3df64ab9b8ab45c5326d02fb244476a639ce6baddb7c9ada31d844e3a99f4d"}, {"a": false, "c": "mubK(6yr$AQACXmOIVmOiQIhuBt$J>Ow0v!yBL-0I##N^KyJ%zy", "s": "f397817516c4e6e0dd22256807eac694", "oc": "ecd89c6ed68345199000e77065daad226274b27d53ae243b35b88848181198a75733dc45db4dce1e48b3c171f4691c57b7b021750f98924a3a556d6b7810909b"}, {"a": false, "c": "mBbK(pur$AQACXmOIVm:i>IZu6n`j}Ff83O>84Ho>^V_=hmcM`uf!l(YM18K.lzzy", "s": "3d6a004f3f7803146e79c713664c63f4", "oc": "4c6adb5a53c34303e3c8a837496dd29b9c0139454562ee917c7a83ad038b94409e2a10d90cd1201296bdb24475198ad1377523c8600ec5407b71614ea01543f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (201, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb+@y!%dN?0yh;g)1-JP*cm+g%IhW0ZKZ^;tlNn$CfeJH|W!V*=i+Na@z{OfN`t+xpjgXmpToG>HWO>pe}|<hKwc_$GK=9Xj971J#%{ix2^WUgw1uHONqD!=o~IS)7t(VzEZU^ztUM?@@=oIMR^HJ", "s": "d90b47cf907d30f1182c751841a184b7", "oc": "f5c7a12fd34d2a7213531f36891f740bb148f3a946bacc45d5da6d9b65f489698eadf74a0903cbcec5a686027b2f3775a6b6ca6cad9eda12"}, {"a": false, "c": "mBbL@VJ%RN?0}=;g)1-wP*AmiK.;r|K57(3a~fU;yrFg2#bT?,]Hku16MQ1vbW%{qdKJ&)IM{Z8Y$E}{$wUOWaue1baKG0hNSrAJa6iCW)Z8C{41$Ej6!A4Fh!E%%~m5$YIv}thw=uvcUXIEwG+O8(puh", "s": "3ada5d960d04dd01f92e81127c46bad1", "hm": "63235df03fd20f778185b61ad8fd3ab0"}, {"a": false, "c": "iBb.@V^%dN?rW$;g~1fJ7*cmq811DsgI0{D^0s}kQKvc>1GKDwX(@73J#%vil2@fUgvSo_OazD!=o1-HI*cmqBor4+{y>b|NoX{uoXP2XSG9Uac7aG`|sM|6wl5`!AX82|`5spSf`|5r@kj7WXa<;H#n0F~8v|S@nuFT~!CWz=", "s": "fe469936337462e0c7242dd805ea0ad8", "oc": "fc6e9c65f2033269dea02829d6eb1a4954b58b2679b9e7cedec08ef67bc75af9c8371613a48143e7b3054988170f1a100d55e1f98631b688a87f04d358eff6e3"}, {"a": false, "c": "mw4q@V^%VN?hR$;@)1-JP*cm]jX0HB:o]jM)H&5Y~7zb3_OazD-=oJ3|)7m(VXWQUIJeUB?^@Po3MR^HJ", "s": "33ca00ff8d78ab46eeec8e1b6c2ab643", "oc": "fe6929c77c2090682ef057348c8bc5c54e79b98e75050a44b8b929991c1464e6d586c2437d06819523f9210605e600bb6c44ee9bef048ddf995c122cd6a02808"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (202, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mhbKmD{~_|&h787#WX-N,Gq?4YPl!<=|}9}NZZ%6(k=XL=P&HBx6>vbiA$|_xoC@yZ{~nC>!92n|FssD7A*LXZTU}iLdiIG8f6(Ju2%>ib{^U%oK#.zQ4U>&eL_z-Y6pAssP%yfA+|@H|2F$W", "s": "de9eb7b2ee7d300e0e8c02e1ed065017", "oc": "f0c4b513cf722a350a93bc06791f240bd29ff3a924a3c42eac1a5a9e1599b969ee3d06eab9d9fb45b236df0a3b2a4476f682fe8c7d9ed01a"}, {"a": false, "c": "mBjpA;Q~_|&h78D#}OQ&=nuK49KI%yIq+SZ>=7r@c@kc#{BqY@g%mg?_;qL}Z7OYoyIKN(_Py2d@}b9lfT|IhV8_1WX[&Qn4H=QzV_X^F!9E(?r^Bv>*L$*3UXiidiIGlf6-J$2^>OgC^U%oL#UzQn~:FeL_=-Y6hnsrPmyfAd|iHSd2$5", "s": "f5b9df717fb869c5955b6bcadd071a2b", "oc": "bbc7ad3c38f9a5d71f73ac62af1f2ea7b5d8f3a1cea0c4cba5bc9793189989290e7dd81a83bca245c50b660271255fa6a635caacad95a933"}, {"a": false, "c": "mnbKA;2~_<&h787oWXUa=nGH4C6pz)~|7+h_>!N!sI%pqPD^%)I3u@>LU)P>D@k-EHMXUX`5(jh7si7o+q;}{aBYAM0~H8QzdI7Nmf5KF|e_d!z4Y`SZu.", "s": "fadf94fbf6797510db8efdd8c5eaca78", "oc": "aadafc6e53b112f9ae098e77e6ec06240e6aa85fefa308a575a56dca64cdd75f7d32e9aaba0fdb91d8ed3bb235565ec928c983e551082a38e5aae62bee4cf83a"}, {"a": false, "c": "mJbS$;2}!|&K#47#WXU&`n9wP6:pW9$J3a|gyqz._kiIIG(B$L#H^>OgR^U%oKRUzQpS(reL_z-&6_0ssNByfAd|>H^;2$T", "s": "b0b4004f9d7b2744607cbc1846142344", "oc": "199a7c6921b3539eb3eed7eebb3e0c39374b9c4d01e261d46eafa06e7bf16cf225c71f37f428a4fd34f0624934b7009a3553e70a424d3e18088ce2d055ff0cda"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (203, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mpbJ&V+=$?2X*oyoGQIzTv|v<68>g7QS$`K>1Uc8`#r{On(I]~PZJ7^Gu{SV7X*ZyN]Y!Tp4T_uu4UfmrO!|i!", "s": "d90b27b3207db03fc67da616e907e217", "oc": "148e111fc71f6a3bcb53bc0679143509b7daf8ab39ae1d07a524199ad5dc987a8e7bf24fb9936247c51c1d027b8a88062625797b8fee4bdb"}, {"a": false, "c": "m7b<&1+<+WNnW(pa;.#Y1YMHWLiq6dAJoLWIs|CbibskYCBYn}P=yVCm1M^YnMJiwIv8CCL6Tzth(-87_Cy8j_qYuX4Fv>J<<0q@x_=DyfRU8dAX}fz|:9@B(Ma8A@!=gKJUVIU>*`Vcs~!rdkH^quyc~!", "s": "359fbd5a01b6adb0a1cb85135192efd8", "hm": "6bb75dbf78bbe77f847b561add4ddb66"}, {"a": false, "c": "EBbJ&V+<+WNnWTGaHM#YrPMH#8-dM23ja^o_QI>Tv>n<}2UoXQSi`z>1=cJ`#QIag(Eq~PZP<^It{SE9X*)sN#l!EpxT_uu4UjmEXpy*!", "s": "f3bae8817140c805425bb40ac337f13b", "oc": "7bc7e1bcc81fea3615c30c76a91f24bbb66fb199c6aec44225baf79a65996ba98ea2f64fb9b80b47d53862017b2b647606a5db62a290cb17"}, {"a": false, "c": "mB.4&V+}KEF}v)Gi?2z,m=Wq?J)e3`PBGaX{>C%`[u4$Eib~{)de4t&e4k2=>F|Xl3b%Ap=EuXIWm,NxJ>!BCt#*(|HBFyw2Uij#|0AgNqk0>#Z27xtY*3N+DW$7Gm-o6uJ)OF_^ta8QA|boP=&$^#u;>1b9aoy)SsA&c5ZRhW{1NlPf3Il;#<(sHBa{?Hqr$d^GIGI=pL3#W:t<01cu[h|Fa_pBDE0k9B)c<$8vu%{rK^SSyw%$F)p?C8w~yj0rW3&:h>M!|#K`>TYDzQhvY+L>I4rqd_Z=+nND{sQS%kHA&!;c5B4ueX", "s": "d06bb01580fdfbf6267cafa9ed0ae427", "oc": "c2ceb1f65e1f2a361555b978691804db57ee535f12de844fd1bac9931597890a8eaff64a78b33485c63665f27a2f547aabe5ce6e080cc0ad"}, {"a": false, "c": "m[sJZA|]c2`{OsnWrz?>a)9g`LF])XoUH$llv&x~<)ah9e5|m6H4CZkglk(`D>O~LbBrE07YBC9SR?ZTg}7__!tja{#`*rIK6AO3pVDK0~LaOM8WTE}&MXJ-n#ddcDun9789)DWn|}WC43MZXr!USho1nk", "s": "3a9854221633ed0dbf2e85df8490d0da", "hm": "7db77db322d2b2722275061fd1f5fb5d"}, {"a": false, "c": "mBbJ&<;ecXt{PsD&ra?H0)cv`!ru0aXD}SS]w%$>)p?}8NMy;w6WUP4q>M.|)2`$=hlYJqS$4Xq|~+=+nNDGrQI0~K{Va.c-B%7yX", "s": "ac04b74178188105945b6bfbc3374a2b", "oc": "ab47de17c82f28a21553b012a9cf243442d8f8e246a0c9e615b36293158be9698bafdb4a39b3cb45dff63d52de6a5066dc780e6cad7e42f9"}, {"a": false, "c": "m;bJZ+|9c2={Osnrr3?Hj)c{`C0%Ptenegld%tG$gyCvMg%C@3h#$d0>I%+zveChO?CCkO4;nXOPUD6AhT(WAPj~yBgzCaLT`ouxyi|MZ0>9!!FWI1Vpuh", "s": "556f90753604e2ecdb842d5895eabfc4", "oc": "f84a9e62e3b5a219339daafd533244a402b779c467f72ec2e6b33c685b2d28d635534d10c355b62acfe78408a2bca1f7e35036c9ba8c1f7d425d9d58a41a18c3"}, {"a": false, "c": "mBbJzY>9c2`!OsnrraYHjmcb`6XBNc(>7UH2qr-Zbgf~lyV4vB}2`-TLDz6hvYJq>[PXqdGZ=+nND{J4ItwSA&!)KiB%7eX", "s": "87ba02334dd82e4e6e4cb7d46621d344", "oc": "ecfa9c7e333515a3a4f1d7eb077af320f558268354e4a8fe240c548feb2422f867f65a9a1076b54b5e43df3f971898967c88ccce9a497a8135c9ba0be58f8b1e"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (206, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mnbKU&L2H2TUi~T2Lnd=6jQU;No;(2E?<,rd~XhH{7Oe7vYlptNUK{PMeB1g`&6??_04F=IOKB}eh|PP*$}p)N|5)_JQjz8BUxo}BD(c;G5GVPQ^X76ebGiMVN*~Wl`f|lA3LyuK+EZuV3&>sh=ASNTgjoiQwI%BLY){G+)R=F5D2XPyN-`%QTeP6S", "s": "d9ca77be709bd0fc867c48161d7fe5a7", "oc": "6b17a13ac4fc4a5b1c13b536493f24bcb4d823af36a7c440a00a639d67f987c08e9ca22f19b3ab05c536ad036b2c5756a6cd5e0ccd6bb2da"}, {"a": false, "c": "mByKU]y2H2TUi~T2!8akXdk*TWHpl^tigJYp{J-+j?uYu#V`(KR3|MRS2Z9=H>Qu^`BLc){G*FR;1W;E^)-gMtfwP+P;@yNwhv=8g{zp#2_Pku8PKl4La~V6xA@)iB6o~T3{d8cH!31$B_cW7O0sD?K7D(wOr=Qp(YP%9_*!jN9CDzQ`%AD+Z.cfK78M)jC$^w5+`tztVHuKOj3A9vue9VJ?XiW%L5f68_3vd>paL", "s": "fa9299f53674e2a0d824cdd800e0c785", "oc": "fc4ffc4435b34264ae01d9cc974939ac19171fdbf9a03439189d898e68068c0318acd38020759be3c7b72bd16d4efb097cb4bd1f0b3d6d360f0810019701e73b"}, {"a": false, "c": "]wbKU&X2H2Tti~T2+[knzcr&S04J}o_.KStw@y-HpM66!!|)|c%KqJ9NNQhgUj$2NE3!8skvb`5;ed?&hAZ_oqHcY6@4PQ*h7up_lOf8NoElmz}I;57P!2k;~rl7z", "s": "9403d60105e4ce5b4214fba9a729c7bb", "hm": "94fad22428187432c7a5631dbd4ed718"}, {"a": false, "c": "mBbLWIs&0`BxGzoFvD#SK|+D)8)c(}(x9VOZ->csIkThDI`Vu=aFNn%eDmLo#A{_&wls+_w8nB3hc?vKg-kWQNG(kc!CHK2^T?a3nxF$a", "s": "0a0be9b521adc0fe889ca816ea0fa967", "oc": "b5c7a1afa8ec9a341c5fb606aa6f0b3bb7d8bad9c6becd4546ddd7d315182e69c0adf66ab9824e4b85361da278e7a476d230c1fca24362bb"}, {"a": false, "c": "mB2LWIPx0`a~Ghoxvd#S+|+DVLVlEEd!}Hm|5-+>Q)|4bN1RDPT`=[zV||N=xQ=}^+yt(ANAX*$QWW-pH4Gi-2HP]|Ua<;siH{C*(7~h2GYnV6Ao_oqHcY^1}?QZYTr^_sJfthoElmzG`;5@P!=kXPrl2z", "s": "329f5d560030969f8901841c549ed281", "hm": "6ab755827e52b5ffd675161ad8fdd3b7"}, {"a": false, "c": "mmbeVIPx0Ga~whbFvD#S<|+%V8)m(L(X9VOZ-ucWIk^hVy`Vn6a604%NDmLo#}3_&-l+8698n(3hg?v9g-*W5NK(kcG5HK2^>7Z3nx>$@", "s": "73cd47810888620f9bdba36dd337aa28", "oc": "8bb8151f7fdf8de615a3b405a91fe00cb2e84ea076fec945a4ba887312998f393fade61d494ae069ced46b0d7aea50de562f2e3cad9d52d3"}, {"a": false, "c": "mGbLWIkx0va~9hoF-%-SK|+D2CCe8R*CJ|A0=}SOcfM%Rh.W]Rfsbwr$X@)%aU(OL|kQQ9Yo{c:8Sk@>uGT3+autVMPp$j?pN8VJO%5~`qf_}_|Re#wpu_", "s": "3a6f78653620e3e2ab66d158053acfc8", "oc": "fcaa9d6538b95211699389b686db712ab347ae2402826857dc111d0fc57b12cd833fdf82bcfa38de4abbb944a7c5d5a390b324b0924cb8194904a2ecad66c9e8"}, {"a": false, "c": "9BbLWIPx<`a`GhoF?D#S}|+DV?(Nb%E^11oJrvsVsxVKcuBCeO#2x_&w_8+_w8n|3hg?v2g?kWlSG{PcGCHK2`@7Z3:x>$@", "s": "fd49004d0d58239c6e7c541f66aeb844", "oc": "fc6ae4653df3421bbb78e16f08cc0c8ae8d903e24ab8b7b5642a1074e12b3d92b89fb10cf8c559006892829a93b5870c4d6c6d91bfb0b292b51663d97353a123"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (208, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLb1c41)W9q|6<4hg&iv|K{Y9^GNd5DAJ0%UtmtOBFD-zpmoKbIFeJF58Q6>L4Jx]AyZqg;JTzX};A&~>S%Qu;Mo1i6*=>!bvDVAeHr05Nh0)fUgxx>_Ia8L,je%Y9m3n350KkPVz)R?@Hjc5H:rp5z0<0458(TfMy%h`tCz*iE%pQ=~zakT$5!7E$?-8N*^me(YE*>v82", "s": "f473b9e43fe88459a989756947b9cbfa", "hm": "83fcd944a8c8ab3ec39e665dbd4cdf16"}, {"a": false, "c": "mBYL,1i}1)09q|6E4h(&xf(N(;kw{5+f>", "s": "19939abf207330fe8b8ba806ed0fe953", "oc": "acb7a1bf1dbf7ac61553bf06a6c7244bb75cf8a916abca4f05d597d3109d49698f68ffea09bfab45c5468d0d85fa5c75a655ce6c5e4779e6"}, {"a": false, "c": "mAbLU1c41)W9I|q44Y(&;v&KyLTx1ARh2L`p7*@rINdKZWEp&PvSpIeN9`O-dc<1;`q9iE%8t=hzVkT$5-gv$VQ8_&,me7Yom>!82", "s": "371a2156f536f49aa926561b8381adde", "hm": "b22e505d71dab8e78b7f165a871d3be7"}, {"a": false, "c": "mBbFU1c4cWWCq|644h(&;v|K{8(5Xe9d`5Ov4)XLQ?KhVU7`GqH}&Dtuv)VG#2~i8sIC-1e2[GMEK{UGm5~^wOWizvh8u{n9(;*`{:_B>", "s": "f1f9eef97b12610f985b23bfc34ef25b", "oc": "fda0610fd81f6a0215e12c46a96f2402d768f5a9c6a5d4c5ac4a632915946469ce1df18db2b35485cd96bd027e9ab176a4353a6ab07e93e6"}, {"a": false, "c": "mBhM^1c41)W9q|m44h]b;v|k{.`tA,7k@4_sh%C>;7ZRnV+K)hY5IU>Iy1whxy|(@~HIJ|V0jjqsWOCHmKi&kDG=Y&?X*yy!_V=iuh", "s": "ff4f9af536e4c2edd4243df8055aca34", "oc": "fc669cb5715672190ca17ebc92eaacd623034e313a463aa905e99295d0a2274e492e3ee4739371885c76ffb23bc587934ebeb73d418dc86ff6ab08465c81b5fc"}, {"a": false, "c": "mBbzUsc41)W9q|644((&;-|K{k!RWiJXM;%", "s": "ddbac35f497823b36ebcb1e7ecb0384b", "oc": "f59a9a607fe341ab0bcbda314950a8ac7867601a866e519fb5aa3df6a43c367bd5cc4441fd96ccbaf9922e351d2fe8104443fa373ca8738316c66de6b359d16b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (209, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "bBbEEKs{CeKDAAyrNI~>eTZAcpM9b&!8fb~qLb=F@t{DFHgI0-uESohmvR`J>2W}wLQ{zT)bJN2)s~OVF1)+bVZ$cQL3Pt*j5!PciBJQ>9yrvQ9$79k+Csetm+#?HKrlje?{IWkSJ%PdKT3qGm;DU8AX`1dArOM->P]y%>+}qmoj0(Ggzt6tvYr4z%ofT;(@Kc", "s": "94936d0109e7629f52039be07e29c746", "hm": "a067eb641840ab62bc751a5dbe2edf20"}, {"a": false, "c": "6BbK%I>*MlK9:Asr>a~kZTJ+^8$p!|n%q@urmkm:+n39d89x;-u^l&L-~blG#2`E|z#CNVuI~keTZAcLZs9pq|$l]=nQ95Wk]f~Ku%D~6sX*)}84+p-WokD(@z$C!oC!mq|=~0(Ggse*+{Yr4zXoA?&A@KZ", "s": "ce9abd5991369702f925cbfe544e02d1", "hm": "8a2c572d7d48e97f008e142ed3fdd507"}, {"a": false, "c": "mBtK%KsjM9KDAAsr>I~NeTZAc8$pQ%B%N$urm!dN+W39`}95arY}vo:R>B17S7puh", "s": "0a559915d67432e0d02cb7d905ec6ac4", "oc": "bc7a960e332129c9a577d30aef7fe92b196666d9b0b268eb44bdea79eb8890d996bc926b978b33074aeb42b62cae51c46161575f97743e16b4abbec270108f57"}, {"a": false, "c": "mB.K%|s*MeKDc{sr>I~ke`ZAU6Gzr_a2KC1k.e}Y-54&aG;cYK#2`3hz#$NVuf@e%oazaF#h3vJ%zy", "s": "9c90d6040fef845d0af49a697720d245", "hm": "80675b44a843a832c387679d39792f1e"}, {"a": false, "c": "mBug(pyr$XQAR.mO)V;Oi}Ihu91.eQg9(VLKUn5-Jz#Br{^6<*`6Ojd-Ca{qDN#agYM1@|v^BZ}WPj@hC;zaE?QlZtZ``fA>^P-GzWw8w=`Mb9{SDB*co%APJgWzI*_|{+^1G{AWxpHAX#dc{}YTt.;F|W6Vz*6{H?XBL_pGy!|2JzD!=<+nV7S", "s": "aa981d06aaee8a70ad2f85185e97c5d1", "hm": "6afe57bd28a2b67f86e51b13d8f3dd19"}, {"a": false, "c": "mEbK(pyr$|rACXmOIVHOjpPhu96cjUxnX8_j8_M-tz#~r;^hOw&vKyBL-0IH#N^GXf#daWCrO$8j9S)%cml{01F2cF{ry(M1:`o{G{<;RofbBK!+)7>KvJ%Xy", "s": "f86f9e6536749670d41d2d6ac4b1aa44", "oc": "d3235b6533b3621b2b9913077b3a07e26249f27d430bb41bb5b88fec68e181a7ec1acc258b4d1e0e33bf1a71f4e9380b1fba246e6f0fc22b3c217d6b408c90d2"}, {"a": false, "c": "mBbL(pMr$>1A6,m+IVmOx}Ihu6z`j8ur83c!kuHoh@0_=,m=QMuf!E(KM1<+O(}r7Yhp`;JG{(3+FK%4%[y", "s": "3eb3004e42d86cd46e7cb84e6d811084", "oc": "c7699c6533b341a3bbaed85c692d563951d13aaae5f25e012d77fbfa038135cd6afd7029bcdbb1bc96b095a475a9da1007010800010dc5a07b716141a0fa46f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (211, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@V2adN|0W=[g).-JP*dmqx[JhWCZKZdG?lNq$]fpJHRW!V.=irNa@z{sBN`e5KpGgX(7TokRHWORpeL^$zq}oJ|x7KR,k0gW#{2^V?F8n2rNIo9CWCeIOt!7g2d-bG>f7lCFiM641$nj6!AuChY|%S1I5$YIQethS=7qcU{Dl0s{u=K:cK$GK=wXx97,J#%$T#21fURv1o_OazDi=FJI{k7h(VzEQE^zo`.?^@:oIrR^8J", "s": "6e0b0cb5a07d88fea47ea8f6edf5e4ef", "oc": "c5a061b8c01feb3d15a383069616290bb2d8f3a9bdae9d4e4d676799d5f486be8abd56dab958a045353624077d3374a61535ce1cadc9da1d"}, {"a": false, "c": ">ab0@V^%dN?~W$;g)1-Jx*cmqK@Rr|a5qT&!~fq6I:dg2|bT?wXz^u_?MQ1vbTM{jdKJ&)IM{5XYVTj2]`_OWau*19I2Gjh-SrAja4iK61BMiB41$Ej6!A<1h&E&%1>5$YIE}Chw=u%ts|IEwG+k%(pXh", "s": "7a2a5d56a036ddebb923eb1b5116dcd5", "hm": "6ab5adb218e2817f8675168ad7fdd2e7"}, {"a": false, "c": "mBbL@R^xd=?0W$;g)1tJ+1cKk3w>tsgI>>D^0s{kaK}co$GKiwXj97CZ#%Xi#BIfUg<.u>O:mD!=owIS)7meViE;Uz|bUh?^t=9IJR^HJ", "s": "f719378170e8610f455b6b2bc3340bdb", "oc": "ebc7615f58842a3f15541c06ad4f2e01b752f3a6969ec21535db0093c599896e824df64eb0b3a345c5368d024b285492aa15b865b776d19b"}, {"a": false, "c": "mEbx@N^%dN?0Ws;g)1-JP*cmLB6r4+`!0b!qok{UNXP2XSf9UacD`690_M|6wY[>R^!8=|E5slSf`r5rp_|4WVaF~8D0S|nuET!A)5Y7", "s": "1acc99cf365412eedb242d58ed1dcac8", "oc": "f16ec96693feeb190cb948d91ee71a1445a998208989e90ede2db8857fbc213ce8e11533f18635e9c39cd22b191fca10aa58bf19246535a9f8e5e5aa533fbae1"}, {"a": false, "c": "mBbL@^^%dN?_KazDB=oYIS)7E(VzZQ(^ztth?^$=oIRR^kJ", "s": "3db20ab7198853446ee387766a888114", "oc": "f879587a0ca06bf8c710c8644c0bc7754f31fede75253990f0732092f41e121582c2b15379068195560501966599c9bd0c44b52e6d258d68c5fab225db0f020c"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (212, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "|BbJA;2~M|&h787-W{;&=]`H4YPl!<%e}RF?Z-88[K=pLlHTDB)@uGqE*k$mnhC#~L3HhQEWgNE0}94zCuT5Y>=jYnBhf>vbiA$Vdx3CMynv~AC&!S2n|UsTD7A$VJnm7K,&Z&t2AYrEe)S~DtWI{856byp_1VrJ?Q#4iCf*E5T8$e-yqZTxRNWnS2A,{V^??Z>lf7XxAE3Y", "s": "9493d601e9078a5d52bf926977a9c741", "hm": "8067d64ce8471f3213056a3d9d49df12"}, {"a": false, "c": "msb7A;K~_|&h777oWXU&=npH(8zV&I^[E9H$Dx^hh>*L$Z3Uar~diIG8f>-J#2^KOmC^U%oK#Uz{iH^kHvW", "s": "d30b3e3523bd3ff3097aa816dd27ee27", "oc": "fbcfec2a280c2a3c615c0c0ba9ef24bbbad7f3d9c6732f42cdbaf5931a9b87398eadf64b46b1ec45d53f6de2d42724c6a835cb692d9e8b1a"}, {"a": false, "c": "mB|vw@2~_|&=787#WMU&=nqH4LKI%yI#]SZ>%k$@|MkI]>B`Y@QUmc?_;qLEZhOY9yIKN|a{H2dCGn9ugdf8mt,F*@OO:~2$4fWCbLd;)=aR0)AQ#4iCfmE5R8~e-~qZ}pnQg=q2AF{V^?}1>lfkrPAE8Y", "s": "3a9a5d3605359d00a92e85cb2ab52dd5", "hm": "6abad5ba75d2b77f89d55623d87ddb04"}, {"a": false, "c": "yBbkA;)~_|&h>87#WXUP=nqv48zV_>^|E9T$T*q6h>*d$Z3UaiidipG8fhgf#2^>OgC&U%og#UzQNU>FeL_zJMzIFshP%_fzd|QH}dR$W", "s": "5229378b781b014f155bdbbbc337aa1e", "oc": "fbc7017fb218da4f11f46cb6dd12240bb7b5e3a1c7aecf4505ea6e97684939bd280df6dab36c7d78c56c6bc2702ad377e635c96cad99ab6a"}, {"a": false, "c": "8ZTKA=2LE;&h7l2cF>U&=nRHFC6`0)}|7HMSiKB!`I%~_PK^%)I3u@+Lo)llD^F_EH;7K)`d(X~[ss7o+q;}aQBYA1T~@8QPdI7_m77K[fe91=P4i`Suu}", "s": "fa4fc94b46a492e0d6932b7803ea3acc", "oc": "fc6a605730b24210a831c59ddcb0f30b0eb5b824cd7341d488de3f5f64cdd85072b6e9aa6a32d18c87e6dcd2052754c948ca064fcd08da3fb5a4e63238cbfb14"}, {"a": false, "c": "mB3K5;2~_[&;787#DX_&=HqH46KPWt$<3a=|J:zU_k-nIG(B$Lj2^>OgCe8LoK@Nfe4U>F0L_|NY670}sPh*fAd|iHMdF$W", "s": "dfbf0a6fd3cba4646e7fb7df4681b349", "oc": "fcea6c6537d85183b7e187e9f20e34e9e781dc1dcde6a1daadafa64efe471ff2a5871f1df42ef65a364e62131db0049a9583527d4044a21508de12f9514f0269"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (213, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJkVYJ3;sUN*`I$s~>stkH^qtjcxX", "s": "9b4306410fea8e5d521496d980295745", "hm": "2b674944d740ac52c20f283db147d116"}, {"a": false, "c": "mBbF&V+jTW4nWTGaHg#Y!C@H#8tlM2:Aayo-CIz)a|n<6^Uo7QSi`zF1[cE`#2{Oy(eq~P}P7pG;9sL7K*qsq#YTJ{xT7u~4Yfmh+p|*-", "s": "7b0bb7b52ac830d4867d9216e2080737", "oc": "fa67cc1fd8ae28581563bc06a8af2905bbd108a967a33b1ca9ba1198d5a08f69cfa0c640b9b83b45f6362d007be254769f3a3e8c5d22dbc3"}, {"a": false, "c": "mBbJ&>+J%9NgWTGa{g#Y!nsH#Li)`sASoL:=s|Cy4ZstYTGvnaP&y}CmmM9]GMJ&sIvZCoL6T::h(-895C)8>_ZYu+mFv>J<<09Jx_=ObfRUxdAm}ld|HpgB(]a8~H!g_KJ3Xsbi*`vcs~#s|kH^}ucK8R", "s": "3a9c055f01360b03e92f8ceb0a60d2d1", "hm": "6eb759bd78f4f77b56c5a6ea85fd46e7"}, {"a": false, "c": "m!EJ&V+<+W[n[TGaUg0:!xMFB}-d?231ayoBy{fTv|nn6^UXgwXi`z>1UU~`#2{OnIEq~IZPo^Gu{SL7X*)wN#Y!xiia_uu4d7mI+ZsdWf966d9fFoXTMp2XpcgZXnWmCaxJ>0Blt#*(K~Bx<%Kv%52($VT!Pg-e_1V", "s": "94605601efe3885d51149a69702ba710", "hm": "8462e840a7e8ab525c05633d8abab41b"}, {"a": false, "c": "9BbM9-xwLU6`.wv*id#8jAgNqV0|#32>xtk*3}+(W?ot0|.Ejn@Dr(^*XN42j^H3R?^4Eq]QC", "s": "360bb7b0207de04b85fdc512ed0fe467", "oc": "fb67910fc01f2f321508ba46a91f23055fd8b33936a92a45abf6679614f989b98ea90e8ac5f3ab427035900c7b9a5476a925ce1caa9f6138"}, {"a": false, "c": "mBbM9-awL86iF_wtB8Q*|boPe&$^#u>$d>9Loyy[AA9Q,ZX[WmCqxJ>Bay22big#B0K%Nq}0Ky3I7xtY*3p+DcTot5=oEj-jD.(d5XNX1)vM#QkT&*bA0!0rIP2N^*)5mJKx)9n$y8WvS_(qM>c?aqr$N^$NOI=pL3pO3:?|aEq50C", "s": "2db10a175ed223e06e7fb51ac600b891", "oc": "3c6a9c6c3a0341a35b31d7ef47749d4ceaec02c370dc2d5d294dc2cbdfe00e819161d6568bd59f90b375a67d6080c0046fc3ad2e3919ebd2f3362e90b5016b3e"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (215, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBR)ZA~Fc29pO9HrrB?Hj)Ne-O(J&9t4RJ*8LOzX8q-+oud_9s0vNy&V}uKTJ5(>nKbQ+YHBIMa;Y2+`w9SdOUl4O-c%t}`nIAcB`{+;|1pyz`.jm)FtCK|My;~T(3&L5>MC|#].-TLDzD`vYJh>IvXqd5Z=+nND{rQvt~v>&!MciB%Pe)", "s": "a90027f0d07d70fe867c3816ed0fe4a7", "oc": "f7c0c21fc83f2e37157abc06787fa469e7c9e303d9aed4e5a50a28d016993964851d984c19b5ab9fc536680f7bea54766b32c665ad9f91f9"}, {"a": false, "c": "mBbsZA{bcWi{Oinrrs[Hj)cv`LjQ}X$pe~llv&x~<)5iIe5|*>;c@MkjlkL`5>p>LBBr[0_YmC9SR?oTg}7)_TmjaL!81r6Z6AOUpGDKT5L`GrvHr7)*i{J-iMzAcDun9MIn)DC61}WC4Fa?H}icv`!,u0lXr}SSywE$B)pEC<#My;]6{3&|Y>Y!|#Y`[r^Dz=gmY]q>I4Xqr!|=`n{D{rSIt~*A&!;c}B%7eX", "s": "f3023d817ec8817c645b6bcbc3a7aa6a", "oc": "fb67c956c91fba396153b803a91d141bb578036116aec440aeb263c3259d894b8ead66dab0b4b34cc5366d827d2a5a91863dc96cab9f31f9"}, {"a": false, "c": "3BQJZpy9c]`{O})r^a?H#)Tv`C16PttD7rli;&Xjv9PhO?CCfNYMnXOPU%GShTyWkP=~yBg!CaLT`o{xy{MM8>>l6vFWMx|pu2", "s": "f562987536f6e2e0ee7aadd8bae1cac8", "oc": "f05a9c1a38b34a1ba201891d3333e3a487b87c0c47c7221ff67e372c4607e3d68ab3d5d2ba95b72fdb36bd3ab2fd6acc06403fcbb38ebf7d923f3d292102ef19"}, {"a": false, "c": "&GbJZA|9c,`{!snrra?Hj).]G6dBD8#>7UHPq|DZMgl~ltV4vB#2A]TLD}=hvY>r934XqdfZ=*nN1{JQIt~d]&|-cbB%7eX", "s": "3db800433d78ca148b79b6186667b344", "oc": "fca81ce4bf1341a30bafd7af177cf868f8f12988ed27a8820421cb070a2a62f8e052a1679c72f5495dd316327723e521df8fd01e21f8dc86551a180953f39818"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (216, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mubUU#X2H2TUp~o2sQBASNT+joiy@I`.dh){6sFRRy5D2kMTaHbVI<_xJ%w;4le", "s": "9493d6040fe0825d52cf9360c729c797", "hm": "80692a76f858fc32c3056a2dbed8df38"}, {"a": false, "c": "mQbKU&f2H2T.iwplTjw[+P;@y+w6)=84C3M#2_Xku8rKl4>a~V6xNI~iB{+`On8b$&_I`G&}n39@51|%NtM2SNTOjoi=u.`BQc)yG*FzF1X;<^)-g71BwP+V~@y+K6)=8kCzp#2_Hku8mKl4LaWV6x]IWiJ_+TUi~T2}d4cg!nC$B?7W7O0EDNK7D@wpx=up(YP@zH*!(K9CTzQ2%AD+ZfEf{J$V)jC`^wmg`iVw@H`aOj3?9vuefVJqXAW_L5fGv_6vP>suh", "s": "ca6f9ea6e6a4e2e9db543ddc90fa6acd", "oc": "77679c657cbc8219a7013f0e93ffa2dd1929728b89b0b931266d879da200a307dead1f4780759b5dd0b2db4b4c679bf79bba830f0b9dd7f69f940801b901593b"}, {"a": false, "c": "m,LKU&X2H2iUieT2edDc`|nCP1IRbSbBU-JgGho8vq^HK=+DVaJwlvQRg3tC|pM_>e~#b{6sGN)z:XN`?*-nf1h+h>?xn+Er&IB4C}9_BzS`9Vy=Z`MB61!?)?P@9q-9^CQqgfj$2Nd3_6,kzc>5ge7^&WAZ+o!HcYv@#&&*3TD^N7Sf|hY0c!IkThDI]VV9a}NY%(DmLoT2{)&wX++_w8fB3hg?E9(-kjQvG(xcQCrK2)T7Zrnx>$@", "s": "d83bf7b2b8fd353886b7fd66324fe477", "oc": "adc9a1eb331a8a3218532c060f6d3f9bc748f3aec4aece6ea5ba179315998c628e7df673be19ab45c5e663027b277436a531ce6aad2a42ba"}, {"a": false, "c": "mBbLWIPx0`a~GhoFvD#SK|+DVLVuEEd>}1Twq-+>Q)|48N;$DAT`*uzO4|c6x$o", "s": "91bb3e817818f16f922bdbbbcc37f12d", "oc": "1587ac07c7d0631215cabc022c0ff406b788f2b5cdae219d859c679315b78869dea6b6cabec0ca4fc5b66da67bd4a135a635cc6c2d9f48b6"}, {"a": false, "c": "mBbLWIPx0`D~3ToFvD#@KU+D8}CR8R*C3LA0=X>DcfeqR8iW]RfsewM$X@DmaU(5Ldk{<9)}{chZSS@=Qu)3pautVMP=|F?HNmkJo%5ITq?{}=|M;fGpoU", "s": "ca6f995536841b203b8f99d80a9bcab6", "oc": "fcea9c67837347e9a3514e1d57d2186db340a4240e6fe365d0111d7f897bcecd53d97472b21a0e840abb7949a865dbdf90bd2f72324cb91447844cc13906c7e3"}, {"a": false, "c": "gBbL{IPx0`c=GmoFvD#0K|+DV6UNb%Eb31CJoAs*@xVmcutCqrS>i_&wl++_w8}B3Dg-v9Vkk^QNG(0!GCHK2^77Z3nx>$(", "s": "7d1a40ca4d78f3446eacb71f6cda6305", "oc": "fe6b103f63b541a3b7f7d77f529c2483c2f903e258a28d214feb1d71efa48d1c4194e606f8c9a46068c2120891bb4a91fdb76d9da3b67592159f95b0c803a115"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (218, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "hBbLz;Q41)W9ox644h(&;v|K@Y9^GZg8DAJM-dHm(vJFDXrpm|QbIF5J_38,y>L4;xCA#ZqP;h~`XU>we~>@WQg;+o1il*=:GNvDDAeBuBPN,0)fR&x(>L>JTLdye%|Tm3tOq0>kPVz)R1|BbiJH#EF5b0^0458>rfMl%t`tC=*iE%8Q=~zakT$0-;7$Ezh4*^ms1YEm>!8W", "s": "349cd60101e7796f121b9f1f7709c749", "hm": "5067ddeaa837abeccbfd6a76b34edf16"}, {"a": false, "c": "vBbLU1c@1yaft|644h(&Xv|K{e(5Xe9mh5HZB):L??{heX-WGq`8&D_0=UWG#5}.8sIdo1k;rGMEKXUGm5?^5r_Wz]h8xf(9lwk`{dTBD", "s": "d90ba765807b38238d728c47d85fe4a7", "oc": "38f2a7efc5114c32a5534c06a91f24abba97f8a9c4a3ca452ab5329315c989f91a8d7991b90aab6065e64d0d7b3a54d67633ceccaedba7e6"}, {"a": false, "c": "hBbLU1c41)W9AO64#hI&;v|#{[TI1Aa@.L?pi!@*IAGKZWEp&0v$N1^0E%rP>{zakT$5S;E1Qz8_*^me1}Em>!", "s": "f330379134e8610f9e5b6b8bc80da15b", "oc": "bbf7a25ec11fba3215f356b6a21f840bb72ef3a7f65dc42eae1a07a6e599c8848ea2464ab983a3ef97319105fb2a5c76d695dd6cd977a9a3"}, {"a": false, "c": "mBbLU1c41)W9q|q44h(&;v|Kow`tAL{}d4_5hc|5;rHRnVof)~-jjq(PO]HmKL&kDG=Y&?X##f?_V=puh", "s": "6161997536763f50db26bad80de5cacf", "oc": "fc6a131ed3c394f173000d6cfdaaaf4823035131b6c9cca909ed829790e7fdab9c27affb468c71562d76ff8c7535c7ee37feab7341bfd81ff3a949467c8fb545"}, {"a": false, "c": "JBdIU1c41)W9;|64~a(w;vg1{$BUWiJKM;%", "s": "2bca064f4d7894443e7d971fa7bdb02e", "oc": "fc6a3c5e31b34123b5e1d83caddb1913edb75f554a18459f15ad75867b3dcf6b83c68bf58d9dc5373b42423f19e0d11d43c9156a0ca8785316cbf96d3340d698"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (219, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKFKs*VenDI%;r>I~oeT}AcYM9b4|vSb~$DZAF@t{#FHCI0-uESoh11X`JD2)}wLQ{zT|AJN2)sZ4pF-)u-Vm0cQL3PHK6q+_},z>8*k5+`2]SsQ>>P;C%>R&q|o>0(G#se6t_YrzzuoAG&_@K1", "s": "d5d3d5070fe7870308229b6927a96745", "hm": "4057dc168048abd5c398668df94e0f1f"}, {"a": false, "c": "WBbKOKsYMe}DAArQ>I~@eTZXc8$p96O%q$urm+mN+n29d^9A;->OlyABBbZG>2`Ehz#$;V~I~keTZAoDZs-pqE$?5=CUc5Hk)f~KuPDDtH6*hf8c+p-c;kDP@z`M>on8TdKv>&a%!P+7uRmq|o~P(jgseNt_(#4zuoAT&z@oZ", "s": "8a9add5421b63d0faf2e851b54c0d2d1", "hm": "67b654bdb86fb7b39615c71ad030dde9"}, {"a": false, "c": "mt!6%KG*MeKDfAsK*I~kekmAc8Kp9%O%q$@rm@mNfn;9189A;-p{l&A-BcZn#@`Ehz#$*VuWA@dw(4C!AyOZrrG;_Dg;e0$zR!zA}{Z|a", "s": "f3bf3c84781cd30105515b44cc36aa2b", "oc": "f1c7a7abc8142d3d1c534060a114246b7eddf3add64dd44aa5ba8793c599f74188fdf66abd93a10585364d227b2a5496a635ce6c8877a2e7"}, {"a": false, "c": "mBbK%K#*:eK*VA|rOIBkeTeAc[GfIP%D;3OVEFM-4yMwY)3lwF8sAp`hPTa2z0mDz@O?=`AW5+dJF9vg5-4DkyjEY%b|Xe6r6t3>sgrY05Qd->616-gpuv", "s": "fa289dc83674e090db242d4c35eaca88", "oc": "3c6b9bd518b36d053300dc2a685276cb19782cd4c034beef45d6ec859081afd920f037649b9e039fde4332b03bae274d647d375f6c2bfda2b22bbf31a01d8955"}, {"a": false, "c": "C)bK%K!QMeKDAAs}>I~keTZmc6Gf~_XAKI1k~;`YA54&nG>cY}#2`EZL#$NVunA@10(WC!Afyzrr^%_D;HE0tcd!w*ANZH~", "s": "3ccf054fbdd83253ee7ceb95a63a72f4", "oc": "5c6a9c3503b3dc130fe4d97b4e35666db01cea3f773de3d4027d2cd557a583a0f63f14916d72303dca49d64ee5cbc9fcace1c9b4e0299c010e2e3bd84557acfa"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (220, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBXK(pyr8AQbYqmOVVmOi}Ih6Y%=eveU~avs=IX%RsOC!oLdODce#]%BY$Gv&)fKe%>;NJVhDcH2X#kAV^>azaF#h=bBK!+;h>Ko0%zy", "s": "d90597b5206b00fb867ca849ee5ae2a7", "oc": "fd37b118181fd1301ac38c96a9172b0b27d803aac2ae90e535b23793759989698ea3fd48b9bdab4505257ff22e5aac76c6353e63ad4eda1befc13a368781bfa9"}, {"a": false, "c": "aBbH(:TrY1QACX0@dimOi}IhuLJT=wKf%tfn15T2HK>Gf9mP-@uChztE?QZTLZ`R%A3^P-G3BmVT=`6b9{?DB2co}AKJgDzI*>|{%^=vJQRy", "s": "93b97439c8186524e90b6bb3c307fa4c", "oc": "f392a91f181f29891b537c3218af240d677823a986aec445c29777731599156980adf643b9b3a33550364dc22b2a5476ac3acc7c2dedda1de938784f8eafb9a7"}, {"a": false, "c": "m`XK.py}$AQACfYOIVmq<}IhuB;e;>O.0vuyBL-lr##>^GX5gd5WCpO$8*Bk)0K=)5V1[:Lf=r}YL1<<7#xLn5(bh7ShC`f{o{u;RP$bB=n+;7gKvH%zy", "s": "fa0fa9d13e74e6e6db24ad1f69eacae1", "oc": "fc968c953cb74f1a9790670b65bf67826f74d47d530a14dd8ab8b15518e1811572dacc254bd6543e382fc379f4ea0c87b5722a7e350de23b1bd13d6043bb9dde"}, {"a": false, "c": "mBbH(p&r$AQACXmOFVmOi}II21`Tj}F~83Ora61o>^0_=XKcM`uf!l(YM1<<[^$ooD(Kz~Y89vJ%zy", "s": "3dba0841e27823016e3c07d916b1be44", "oc": "f3ef28259ab7a1abbbe1b83ca59df2309101a0a9ca62def6b47793bd03a994477af811e90dd980b093b4cb4473b5d21021031a14642061607bf16142ab50d6f2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (221, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbvNV^%)N,0Wa;g[1-`P*cmqv%JhW0pKZmc?lgnB[SX![|WaV*=ircpg={,fNat8G6l|7gOcAnUgX4o`+I_>JKpjgX(7TTX`HwhRUeL^$zO*^J`x&d0*Y0gW#{2OKl>7|{c8}o9CWggDOt!Fg2dcIr2Wdlu6i;6g1=>j6!Au1h!7%E!I5$YmE}|hwmuucU@IEGGjk8(puh", "s": "fd73266112e7f07882149b6077c91748", "hm": "606c1c44a1b8bb32c62560a6be4edf16"}, {"a": false, "c": "FLbL@V(Oda?|W$;gA>1JPvcmovw1hsgI>{D^Es{k=Kwcv$PK*wXjZ73C#%Qi#2^~UgvS,hOazD!no1n;)7mGVzEQU^ztUh?^@=mIJR>)J", "s": "d9c607c5ca1d30fe867ca81deddfe4a7", "oc": "31faa61ff30f2a82f5c39cb6ff1f843db746f3b0c65eca46a5b3a6630997c9b98aad547ab9bb9b456cbb27067b2a54c1a650ce63ad9eb71b"}, {"a": false, "c": "DBYL@0^%d{?r2$;g)1-JP$cmqK#;>|G5qT&!yf=;Ir9gC#b]?wbj^uT?M<1vb$M{qt>J&;=M{1)YViPX-wU^WHu*V^aKGAhNSrAja?iZ`)BJCB41$EpR!B<1h!<%j>I5DYI;}ttw=>ucU|I&MG+k8(+u6", "s": "31605276013699ba090e8e1b847f92d8", "hm": "6aaa5ebd88c2b7f4860512db9df9dbea"}, {"a": false, "c": "tB|t@|^1>>?04$;g)1-JC*cmqqw17sg9>{D^0s{k=Kwcc$Gu=bKjk73J4$Qi#2^mhgv1o$OamZ!=o&IS)7m(VzEQHPztwh?HM=oIRR^H|", "s": "fcb9d781771861bf95566b1bb9bba30b", "oc": "bbc7ac16cd1ff33215395c06ac1f9e7bb7d8f98976acc456a5ba6cc3159a68198eaff6467954eb15c53b6d167b235876eb35ceccad9ec21b"}, {"a": false, "c": "mBxP,V^%d*?0h$X;M1-zF*cm+Bjr43ey>b|qoX{uNXP2XSf9UacD`690sM^6w-5vR^A82|EKsfSU`r5p=kY7W5a<;H#PG?UjaNO0F~8bPl!=j&nB7,CvGi4$|X{2aOy|3~n?&1m?n|FsTD7A$8Xn,5@}EZB;WAYnEeqS~LtWX{8VBb<rL)63Uaiid6IG8f6HJ#2^>O#C^=%oK9|zQ4i>FeL_f]}6h0qs`]yDJd|iH^dF$W", "s": "dc7647bc207d33f38c0c6815c50bcfa7", "oc": "961ca71348376132b956bc76f9143af7e7a8232603bec445a3e064931d99596981ad1b2cb9b0ab1fcf36327c7b215476a635cebcfd19a8c1"}, {"a": false, "c": "mB*KA;2w_|&h787!WXU&=nqH9LKI%yI#+SZ>%7r@cMkP#BB`:@1%m&s};qLaZhOY{y]*N|aP}bdC}n9ugvf8J3w6L@6O6B2$4UWO5LI;<=aR])AN#TiIfmEw(8de-49ZJxLQg>+2A0{!^??Z>lfCy0AE3Y", "s": "349a107651e69d7ea96e85cb5454d4de", "hm": "60b75db078b2b9768015ff1add8c4bd7"}, {"a": false, "c": "mBbKAi2~_D&h)L7#2XU<=<}H?8zV>I{FE9{$QD-Bh2*L]Z3UaipdiI|Q^e-J#2a>xgCU~%og#Uz;4U>=eL_z-Y6h0ss.%y|Ad|i5^dF$W", "s": "f31037057360f1ffb25b82edc7371a2c", "oc": "eded211fc21f263eb5639506a91921a9b7def87964a244450d8e579f1d29c9199e4dfb1ab9b3a545c576ed07712b3a7636b5fedcad75dbc2"}, {"a": false, "c": "mBbKL;2~[|&M7nh#WfU&8nqH4C6II)n|7H0_bUN}sIFp|Pou%)I3u@6~o)l>8^69EHM?UT`5Lj}7si7VM70EpEXYA_T~`t_pd.8@mf^KFf|a)Fz42`9LuW", "s": "faff99743671e2e74b2d25d005e087e8", "oc": "9c679f6534bae0d2a32f8f5d96e933990e1285493d739ed40892314971c9485fe391e5a0b922b57c3d87b7920b2d5c7934c9066d5d77628497acfefb34af08f5"}, {"a": false, "c": "mNbKA;2~_A&h787#WXU&)~qH4FKPt9qJ3a)=Jazgvki2I-(B$L9.^>;UC^UKoK>EzQa<>FUL-r-Y6hCsxP%vfdd|iH^%F$W", "s": "3da68faf419323e94eac474f668d2b42", "oc": "fc6aec5531b3e1e352c1d74dfd4e3457d74a91ad6242c17480afcf5e786612f2cf8713375f79fac132806e43bdaa0f1eb503287782462e1807d219f0507fb268"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (223, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ&V+<+W*nW~G1HY#WBCMH#YUW70Ck_B2$U3#P#b#vtvk<@cSk(]0Cx|E{!4AtnEpo5#C-8ZJATrnR7Q$@`6u78$?2n{IES|!iUV#cP2`;!0{ZP_Q@~pdCC+ca%H}Aev[;Pg*1CKK$X(}S{U1mi,Gi{$lXV<&LAX}rk|Hr[B]M~q~H!sgKJ3-)UN*`X!O~!stkH^9ucm8!", "s": "3cee064e06e424985d788e69a02dc785", "hm": "88c7d545a8485ede2f056a3db0cedf16"}, {"a": false, "c": "0B_JvVu1UwL`#P>On(EqrP,Po-Gu8SLKX*)sN}Y!Mp%T_.wa9fmV.p-*!", "s": "d92197552023f5ce862cea86ef0fe1a7", "oc": "6fcbb117682e8a020d559306a9662a4b6b38f1a5c9a3c6452db2c2131691c6598ec2f241b9b3ab450f76613163ca5476a6e9dedc0d9ed4cb"}, {"a": false, "c": "mBbg&V~x+W$|zTGaJ{<09@x_=DstIUxduX}y8|y9gB(|a8mO!NgKJ3asUN*`Ics~!stkH^qucD8!", "s": "3aea5d2501389a00adbe850be300d2d1", "hm": "f0b75b4d57d2e7ff8e7512ba680dcbe7"}, {"a": false, "c": "uB:J?V+<+WNn^TGaHH#Y!JMp~r>dM23FIyobQIzTv|ntA^Uo7$Si`z>1UcJ`U2bOn(EqM@ZP7CGu{SL7XiisN#Y!Jp=F_u>4UqmrOp|*!", "s": "73393eb218474624155b6b8b733aaa22", "oc": "ebc8a1696c8e26e2f513bc06a9ee0e8bb748f3eb96806b4520f36293251b806d8efe068ab8b3154fc53d69027b2854561115ce6ca28eddc8"}, {"a": false, "c": "-BbC+_s<`W0vRT0apgsY!TZH#BOMUqDEGI;$OzF8BdRu#0!c>I+E>dWf96+WkZ~vq}C2Z}C>Bw;Tbt9t!rECoNZqkFEb(|O|$FVj}C%x3]Q$E0b~u)dR42&14s2=>FkXl+b@d^cgrX1VkCNxr>3BlL#*%|Hb%yw[*4d#8uAgaq<0?73Pvxt|<4M+JW>dt0VYEjncDr(_]XNH4npH^@QC", "s": "d50392b05a36309e8c79d8198d08bdc7", "oc": "f3c70c12c81f2ade865d1706ac1f2409f4d8203acdaec4e545ba68a315581939ef86f6bfb9be0a301b3632429b46cf7666a5c46cad3f46f8"}, {"a": false, "c": "mBbM9!awCMjmuKgJ3SmB7j8R|5NY+p4aeSzR{zi$]Gf=@6u=+OF_waB8QA|bQ7NQ$^#B;cT|9aoy%SsApcg<)1MmC=xJ>WTl{#*{|E$69j9t>05k$ETM5&-eW1V", "s": "0a9a5d5681319a1fab222b1d5443c591", "hm": "6aa8cdba72e2b79f86d0161458fdd3e5"}, {"a": false, "c": "mBbM9Jaw,$Layw2*id7$0A]NqT0K#327xtO*3p+TW?om0VYajnjpr(d5XNQ476>3{?^GEq}QS", "s": "73b73e817808df0f65526bf6c3ffaa2b", "oc": "fbc7611f00132e346529b7bba9a92f2dbf68faa9d68e79d5b5b2c7932796596f8aadf64eb3b3afd5e037680202225276a6365e04bd2041f8"}, {"a": false, "c": "mBbM9-awLU6N;?+zn?DZa;CwBB.nh$ii0k6IR*^aFr!+8pNuzCf1*sKvM#$&Tx*b}L!dqIlWM^s|$|)>8cQn)y8WvoM(qM>c?Hqrvd^$1ZI=pL3<2xnpuh", "s": "fa6f997556eee708db9faddc08edcac8", "oc": "f88abcb5a3b3021ca6b12dbe98193d2f98d4fdd3b04ffdd58bec0c288fd5e12ba2c549e024d4fdcced1c22aa9fd02b418efdf18ec0fe5ce1bb7cfc17117a45bb"}, {"a": false, "c": "mBbM9)awLY6a)p?58#My;wLW3o4hKM!|#2`-TLDz=hvJJq>I4Xqd!ZS+9ND{%Oh)~KA&!Cci2%7eX", "s": "9b0797b5d0eda0f15c8fac163d0fe4a7", "oc": "fbc7611f469f2a6216591506a91f940b81dcf6a9c6aec445a9b6682fb33e89c98eadf34ab2e1da45303667e274ca5476ac35cb2cdd9f41e1"}, {"a": false, "c": "mwbiZR|9c2`:O(nrra?He)cq`LjQ)X4p_~llv&x~>)hiIeUF*>Hc1Zkglk|`i>cnLbBr,07YBC6SR?ZT9h7-_!tjaq#%1rjK6OOUpGDgT5L`dMA]r%)lM{K-}ozA}Dun97I9)Ha6HPWH4g$ZWr!S3hv11~", "s": "666a5551311a9d00e92ec51bf4d8d2d1", "hm": "63075dbda892a17583754d1ad8cd2a70"}, {"a": false, "c": "&BbJZM;9ct-{}sZrraNHj|kv989uW{XK}SSyw%$>)Y^CU#MyAw6W3+4h>M!o#2`-TLD]whW7(W>I4XqU!{=gnND4*3It~KA&!;viB37eX", "s": "c3b9391b78187109915e8ea9c337107b", "oc": "f0c8a1f458192d3115839c0600c32a1aa7daf3acc86e75d5a5ea6753359c84698e9a704ab9b2054505366d02783aa476a635ce6cad9f41f9"}, {"a": false, "c": "wB(JZT|9c2`{OQnrra?Mj)}v`C0QPty0lgli~%ijv)<}O?CCf96vYMMxLj)Zv`6LBDt%82UH2||Vh#g%IqyV4sBE2`-TLrz==vgJt>I4Xqd!Z=+0ND{r+It5KA&!;ciV%7e`", "s": "3dba904f4d98432f6f3d1e1f6682b430", "oc": "fc6ac244325311b3bbe8490f0dbc365f056e87506fb7080d4f5221e5e82a6af57734609a1cd9be4bb7a31c2f835b9531dc88785eb43ebc8784ccf8068ef385b4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (226, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKg&X2H2TUiLT28BpxJ}Bh(c;o9G9PQ^X{we6Gi)VN*~Wl`f|lA3LzNLAEZf)3&!X#;1W;<^g-gX{jwP+Pi@y+w6)k{k}zU32SXJu8rKl4LN~V6xN*NyB_+_O$mhpk2oayN2B>c4eI6@", "s": "d6bbe7b40a7d30fed8457e122fa2e4a6", "oc": "fb532116c81526a875578ba629af5cfb27dcf7e9868bc44caeba6103559989698efdb64a09736b39cd3e06727bd4a176e63bce681d9b92b4"}, {"a": false, "c": "mB-OUtX2H2TUA~T2~T%opl^R-gJ@;{a*+j?lYu#R{(KM3+YRS2B<0HpATnUN$&_I`Gd=n`9Oc-|JojMASNP(joiQuI`BL0){G*}R(F5Z2lMKWHbII;1m;o})!g>TjWP+P;@7+&6)=<(Cz1#2_Xku8rJ-4aa~V6xeI}iL_+iO$YYrk2XPyN;P7cTeP6S", "s": "e3e730a1f71881069546272bc390902e", "oc": "9bcd3d58380f2a527550f94aa7af6f0bb7dcf350f6aeca2fa53a97911d9933ed9cadf4dbb91b2c45c59441027e1abf76a63fcf62beba62aa"}, {"a": false, "c": "m>bKUXk2H2Tji~T2>d8z9!nC$z?hW7O0se|K7Dgwgx=Bg(YPquh", "s": "f96fd775e67fe2006b662ed00aeb84c8", "oc": "e26f9a6b039332197001851d5c2914bde9a9ffdced6038c1f86d571d9800f362de8c7f5ba0a5db33d4b22cdb670697049c3985ef0e6669609fe418f18601599b"}, {"a": false, "c": "1B{kU&j2HrTUc~T@9!nC]6IR|UbBy]AgFRX&;^1ZCi`%nNx2Bgku8rK_4da~V6xN;)iB;J]gCtT5Ig_Je~#b*?be!Od7*j,0qMGN)zAn|i9*6nQ)h#h>?knzEr&WQ4>}9=vXSSwAy=Z@kvQyxG^H`-+G@YMonw}MI6R!?P?c%Pql9^_Tr2fj$2#dL!8sl4f`58e3?GeAZ_oOHcYg@)&Q*h?Ui_7(f|h}El[zGI`5A@|2kG-r-7z", "s": "9463d6011fb7045512020b697726774b", "hm": "206712143868eb12a3e5600db54e8f16"}, {"a": false, "c": "mrbLWnPxg`a,GhomaD_SK|KDV8Nc(L|XkVOZ->wsIk&:DXzVVga}NVp#DmLo#eCi;wl++Lw4nBhhg?v9g-kWQNG(kcGCHK2^T713nx>y@", "s": "020b975f297d30fcce7d38e6ed0f94a7", "oc": "d517a11df51ffa32175f2c07a51638b497d8f369c2ab84c735ba33a39b9c19838daef345b9c92b11b5d6447a7a2a5996a63521618d9b45b6"}, {"a": false, "c": "mB~LWIBxe`a~GhGFJD#9KN+DpLVlEfd!X1mw5-+>Q)n48N1ODST`-{zO|NcAxQ=hE+=T(ALAX*$QWW-pH3t_-2HP8n=gI&siI{C*(7K}=GYnV6AO_|qHcB^@#&eehhk^67OW|LyEwRzGI;5NP!2csIkT~DI{VV6NmDVye[mLL#[{_&wli+_w8+_3;g?vxZ-7WQNO(DcGCHK2^ivZ3Ux>$+", "s": "f6bbf781f8b8e10f95cbdbfbc3e78afb", "oc": "6808a52c68fdde387353bf06a9472c0af7d36225c3ae8431a535c7be119cb96983a5164656b3ac53c6266dc57fd87156a63c466cad9f95bb"}, {"a": false, "c": "}BbLW%Px$}a~mhoFi<#Su|+DVCx08R*x3LA0=XwOcf{&7G^WMRfsewr$X@D%aU(Du3kQQ9{g{chZSSz=mu)Wp|umV{*AAF?HN8k`:%5_Tq?_}=.M;(wpus", "s": "da600972367be8c0eb2c9d690ceacac5", "oc": "a31a2c69a309924973008e4b524d5c0ab3448ed40e126897d0114dd18808bcbf5b3fdf7285fa10e306bbe9a88810d57ea03df482e2bcbd14e7419261fe0ec5ec"}, {"a": false, "c": "mBbL*;+70vFV9hoQuD.%KH+Db6UNb%E^11oJ(v|VsjVKc}BCqST2`_&wlh+Vw8nBWhg?v{gskWQNG(kcGCHK2^T7Z1#1>$:", "s": "8d8a00cf3d79234a7074ba10d618f348", "oc": "42612265b7d3a179dd01d7af68ccdfbaefd9ab6265b3872108e0a0ea8006fd12eab4419770ca65669b74ea2b91bd4ad1ff890d911a96f39db5e085d0870eb11e"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (228, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "oBqpUycw1)W9q|644|(&Qv|3{29^?7deDAx[>UtmtvJFf-rpm|!bIAaJ_N8&6_LlJxCAzaqgjJ~z|Cbm&~>L%J4;je1i6*=>!NvDVAbB>BPN+9)fsax(>_IJULdjeYsTP3t;Z0YkPVz)R1@H}cJj&r}5P]<0}58{_!MQ%l`t@z*>n%kQs~zamT$Et;E$Ve8_*1medYsml!8*", "s": "9463d1049fe7c4265d625b69c7d9c745", "hm": "80680b44e98fabc29805c53dbf4ed011"}, {"a": false, "c": "mBkL~1m4;)(gq|<44h(&;T|K{r(5XM9>`;w`.paB>", "s": "d90b1fb560b7301e892c58393d8fe7a7", "oc": "8717a0a3c41f683215238eeaa01024056ad2f389c6aec4a3a55a3d90c59969698e2dff4a49b3ab4fc4386c02b21e5431a638ce61a77da9f6"}, {"a": false, "c": "iBKLM@c41)WLq|f44h(T;||K{LTk1AQ|2L`pi*@*I>xKZWEp&>vSNIeN9X`-dc&x;`<{t{3Q%wR4|C|ojw`dMo9FQ$%4_)u|cNzcy^dAfMQ%t`42zPwE,8@|~zakT$~-;EmVz8_*5mr1)Em>!82", "s": "8f9258520556a544a31bf51f649bd2d1", "hm": "6afa5dbd28ddb70f5b7586f4d92dfbe9"}, {"a": false, "c": "9XbRU1cC1:W9N}6(4v(&;v|K{8(5je9A`5O6y)XY~(yheX-ZGqH8B7Z?vURG#2}y8~IC-1kJwQME6{FGm5?^5*Wiz)h8xf(9(;k`{G+Br", "s": "ff79538178126c41955b6bebc4471a29", "oc": "f2c7311d5b1f2ae315d38c06a968c4f797d883a9caeebc45ae3ab7c51f9e21498ea2364499b3ab40cd3d6c0d7b2a5178a638796cce7da316"}, {"a": false, "c": "mBP}7{c4o)W9W|644ht&;[|K{B`tP<>jvq(]OCsm44h(&;e|K{k{UW)JXM;%<3p3F>3|wfRCrC|$Cmy8sUC-1?owG[i[{UGm5O35*zizvu6?}(9(;k={L+CE", "s": "f97a007fbd7e2e446e71971fe031d343", "oc": "fc1a95ad33134153bb756837085cbcdc61b759c8461ab1eb65b72be60b0d3a7bda38751b7d9adb075b923f3d3d5fe81d01c375375ca85383744679a33345d179"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (229, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mYbK%+&IMeKD#Asr*I~k}6ZA|Y`}d,|8fb~$D>=i@t{DFHg;X-ux-oh1vlmJD2a}wLQ{Y=)bJN2)s~oV*-)ubVZ$cQ53PHKl0W_Imq>t*L5uP2iiJQq>yrXV@$79k+CC4tm|;?HK9lde?+IWkk#%6dK83qT&!^^8R(qKv{0(Ggse6t>Yr4z6!A~&_@KZ", "s": "7cb3d8ac08dc846b92b6d1694d29c745", "hm": "80042df4a84ba720c335edcdbe43df16"}, {"a": false, "c": "mBbt%1:*MI~kOTZhcLZsIpQE:l0=I-U5dkgf~Wu%DqtoX*hft4+p-AJVqN@~!M.on8#dK{T5aj!P+7AIlI_zVI<9~6fpUj;!FukWkGeUqJdArOMF>P%i%>Rmq8o~~(;~sK6tuk(4zuoy3&_@K*", "s": "5ded5d56913e580a5979870f5a90d5d1", "hm": "25b75dbd27d23785464c26c988f118f7"}, {"a": false, "c": "mBfK|KsAMe-D3=sB>J~k{mZiZQnS9W3%q$u3m@mN+nU9d89>;-DBl&:OBb@G#]aNhz#RNVuIEke&tTrY0>UdR)615-rpuh", "s": "f96fb3a1081fe2d9db252ddf759a3458", "oc": "cb0c9c95b3b342195f00b22a82727b2b3db02cdab830e1ef490de81f90f84fd920fc926698b1048feee7ded6caa966357149377f576e3d6a9f9c6e815358890f"}, {"a": false, "c": "mBbK%Ks*MeKDAAscFIxkDTZ0c6]z~vl2KC1W~e`Y-54&aG;cYX#2`EDzVZsVu", "s": "5dba004f301929b46e7cba1f668103d4", "oc": "5e6a9c6633134ec38aeba83b7b5c4ac0bdb2ca70033d9ae475dd2c1eb0358faa25fb93a7aa2e0011ca73da7be55bdffc2e0fc9c430c27cb8e77eda1bb447acf4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (230, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "Ou`K(pyA$AQAlcm;IBmO6b96u0%IT&e!5!ps={XwRs4TRondqble#e%BR$Gv&)f@e;V;NishD+H2XykHR^>azwF#h4@y@+k=h|NFPj^hD7eD6mUM-bzKb9oMd<v^$Z:O(zM7)h7>oIG{>CRF=b3KF+;7,KvJ%zy", "s": "255891557d77d0f38ac1a816ef07a4d7", "oc": "fbc7a41ec8d76ad51553b606a91f445b9729fda9c6a80445a5ba67e637940966ceadf642a9bdab4534346dd57a255a73a66bce6cad913a4be5319a7d39aabfa9"}, {"a": false, "c": "mBbK(p69$>@PCXm[VVmOi}IhuLEr=pKnitTo@5J2Hi9Ga9WPX@uC`ztE?Q8TSZ`~BAF^PRGbYmGT=`(b9.}D;Bej}A!igDzIP_|{%^1GOlWxpgAXVdc{yYTtk;F4W6Iz*6{=fXI<_pGy!(]5zD!=LX|V`U", "s": "0a6a17bfd1367d53294f854b57bf2fdd", "hm": "6dc35dbd77d11abfef751e1998fe9ae7"}, {"a": false, "c": "nFbK(jyr?AQdCXm[IVRlisIhu96ceUXGXV?2&aM-t|#BD;&A<3WFQjdKvJ%zy", "s": "46b4c7814898a19f201a65d44368fa61", "oc": "fbe7a11fc8182a34a5e1b466221a148bb7d69ea3c6aec44dadba77041dc17f6781adf64aecb39bfc152a1dda7b2a544ea935cefcad97d2bbe636dc8f87f6bfab"}, {"a": false, "c": "mBbK(zfrbAQAChmG;zmOVi{huBt3;>O|0vK~BL-0IW#]7GXA#dVWIrO$8yB4l0K=l5y1Y2c1>rBYM7<5=^$Z+O(zr7YhC`o{n{(BRFLbBK!+;4>KvJ%zy", "s": "fac09a753660f2e024ca7dd805eaaac3", "oc": "fc0a956513bb4213af00d7d16aa2a922628462735c6b9314cda8884b18e1eca4179a4c28adcd9e3638bf2474fa1d1c87b5e277550b63ae2b3ae1616543ec90d8"}, {"a": false, "c": "m$b@(cyr}AtACXmOIdmOi}Ih]6s`t}F183O>%4Ho>(s_=jmcMjuf!X]YR5<KvT%zh", "s": "d6ba30574d7e23e46341b15f66ef8384", "oc": "5e1a1c6533d3c1626be1ddf249bedf3896dfa03ac565d9c5c477d52d088b94cd6da81088b51926a29db49b4375fe993077001ee1e80ec2127931ebf280504483"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (231, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBgprLJ#*oD3t!Fn2d-p_cW7l+FiM641$xj6xA<+h!E%%>I5$Y5E}thw=uucU!IEw>ik8(@uh", "s": "1493b64a1fe6b95d52149c68a729c545", "hm": "801c022be8381b32c9665a30bf43ab1e"}, {"a": false, "c": "cBbL_V^wdN?}W$%g)w-~P*cP,0w1tsg}6{D^0sSksKwcv$GK=WjO973J#%!i#2^fU>vMo_Oa}8!=oJZS)7m(VzEQU^VtUh1^+=oIRR?H<", "s": "198a17b190dd3efec677a166e68fe5ad", "oc": "fcc7941c90ef87321553bc36a71f740cb70cf279c6a51449a5bd6b93189979693ea1f671b9e3ab55e1c7690e7be9bd76a6f1c0fc9d31d11b"}, {"a": false, "c": "hB7*@V^%]N?07$;[)1}JP*cmqK@;r|h%qh&!~8=KIrFg2gbPXw:z^uf?MQ1yb$M{qdhJM)9L{5qNV%jR-wUOWaug19axGA|NS@aj*?ieZ)BMC%4J$E;I!AV1h.EU%1IG$YGE}i[{=uucU|OEwG+k8(puh", "s": "ea215d5501203da0e399cace5890f28b", "hm": "c5195c7d7802bd7f86771877a8fdd2e4"}, {"a": false, "c": "81AihV}%EN?,b$kg)1-MP*=m48o1tsgI>&D]0sFP>KPcW$)K=wv3AG9J#%+iL2^f~g${6_Oaa4!moJo[17m^VVEQU^ztyh?e@#oIRR{HJ", "s": "f9e939e3c8186f0b955b1bb7c338a674", "oc": "5bc7a1ffc8869a3c1554bc06591e249fb4d7e3abc6a534434d3a579615968969d77da64ab9e8a045c13561027b27817aa636e06a5d9edc2b"}, {"a": false, "c": "mBbL76UZdN?0W$Pg)1-GP*c0c7or4+`y)9|qoXJuNXP2X_f9UacD`}]0)MA6|YLA$^!Q2l;5slSf`r5r@k|7W5a<;H#nak2jl!=BrIS)wm(VzEb*^ztUh;^+=7I>R^tJ", "s": "3ddb063845b826548e4cb71c6681634e", "oc": "cc942975a22061f3281088314b6bc50b68947f8e75ba5a105f692892e51cc995d356c24572b6a1b526c341c2a5ac0c302c4ee12b660e32019ca0826677af0307"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (232, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKA;|~jc^t78D#WXC&}nGH;YPl!|>=janBbf>#GiA$|8x3|Myn3~nC;!B0n|FsTl7a$VSnv5fN&ZVx26Fn?e)S~DtWX{F5Ovy<_2V+JAQX{iCfm`5f>deJ4qZ}xLQgzqN40{+^s?Z>?fCrxAE3Y", "s": "dc93d6010f77442d5914cf697729a0d6", "hm": "806cdbeaa348ab3ac3056f17be1bbe96"}, {"a": false, "c": "mBgKA;22Fmnh78:*L$Zt2aiidB=G8f6-9G2^>OgCrU%oKD#zQglTfAddil^|F$G", "s": "792b97dc2a2d3300867c8f329b7f34a2", "oc": "8cc7a115c87f2a3b05335c6d691524f29538730ec64ec648a5ba6393150269ff83ad76b1beb3ab850df1fd0c2b2af77ca6a5c41ca1cedbc8"}, {"a": false, "c": "mBb&>;~~o|ih(87#WXU&=nKH4LgI%yI^[_Z>%7r@TMkI#>B`Y}gxm&?:;qLavhZY{y#Kb|aVsfdQ}n9ugd{8Jtw6L@O=gKj$OfMO5od;)=a#3?A)#4iC):E6R*de-6qZ}CL;MW52A0{V^?oZ>|fCrxAEgL", "s": "966a5d2340579d0b493e85115d2ed2d1", "hm": "6ad7503d78ddb272567b6313d04fd1e7"}, {"a": false, "c": "mBTQA;2~_|Ih787eWJU&%zq1482p_%^nE9-$Tx8Bh>BL$i3Um0iXiIG8E6-J#2^>XpC^U%oK#USQ4z>HeL_E-K6r0ssPoyfAdhiH^dF$W", "s": "f1bf2f913518b1dfa55262bb533780bb", "oc": "9669ba9f28ffa03f655e7e05a5122505b333fea476a57448a18aa7df159919698e4f1b4ab9b3ab4cb4f662037b0b5346b6358edcab9edffa"}, {"a": false, "c": "mBbKAt2Y_|&m787#&XU&=cNH4s6`I)}j7H0_iUN!sI;p|PD^h)I33@>>m)l>D^FTE_-X_T`5(l}{[i7e+Z;}hQBEQ14~d8QPdI7|mf5yFf!9d=N4Y`.puh", "s": "bab52975a6b492e0db4122dae00681c1", "oc": "d78a9fb593f14219036afebc0b1933dc2e754a6fcd7341d45b9e9fc464cd8abf6b181fadda5d111c5f980e42052d5bc9bcc906ef5d282a34b544f6d23442c43b"}, {"a": false, "c": "mBbKA;2~_|&a7(g19XU&?n~H36(P~9$J39,|2qzg_ki?&G+BNL#2!>Og{[U%oK#U@Q4N2FeL_z-YyP0ss6%yfAd|iH^dx$F", "s": "6bbab68fede827346ebc271f96a1b627", "oc": "fc9a94693fbe31a5c9c1d6ecfb6eb457274c9c4dcde2c2d40fafd6de7bfe6cf265872f33f460f355d48061e3cb27432775c358dae7445a185bdad8f01afa0260"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (233, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ&++<_WN1WTGa2{#Y!VMH#nHj70|z_(24U3#W#b;KGwDh@c074&0`e|x{)!At-Vpo5}C-8ZJuTrn?2A$@`(u>=w@2X*ey8T@3M+{F+~n1y}AxX}Tz|7}gB(}a8~H!S1KJ3-sUN~`Ic+~^stkH^qucc8!", "s": "949e29a80fc78fed591eab61d7f9c745", "hm": "be17b280a838ab31c3056a8ebe456314"}, {"a": false, "c": "xkbq&V+1UcJ?S?{OV(Mq~PZP7GGu{S37X*)sX#Y!JpxT_uuCUnmr>p|$!", "s": "790b9ee5202390fe867ca8dae80fe457", "oc": "fb37ab44c80f3a323513387aafefd44bb73810a2c6aec495abb02793f78589bf8eadcf4bd9fcab15c8e6dd097b22b476f035ce6ca1bea8cb"}, {"a": false, "c": "5Bb2|V;W+%NnWTGoHu#Y!CMH#Lj)6dfJoLZ-?~CbTZ!t~T&dg6P=yV&m1M9}J*JisI-8CoLUTDTha-8*4l)JjpwYuX^F}>M<<09@x_=DBfRU%dAj}TN|o9g&(Ma?~HPSgKJ9-4kN*`Ics~!snkH=qucc.!", "s": "d4865d560169f900a9ee28b457a0ded1", "hm": "6ab755bd7878b70f8695b67fd81aeb87"}, {"a": false, "c": "mBbJ&V|<+WHnWTGa@g_&fCMH#8-dM}31ayoGQIgT6|n<6^ZoZD#E9z>1UcJ`#2{Zn(Eq~PIP7^Gu{SL7X])sI#B!JpxT_u)4Kf0rWp|*!", "s": "f319ff7818f86baff5539b6bc326a7df", "oc": "f5caa1ef338f003115570c06870f240587a8738bc94ea417a06a0e938a9919998eadf63ab9b6eb4655346ecbab3a541e79b59e6cad90dbc7"}, {"a": false, "c": "mBbJ&q+<+WNnWTGaHg>YxCgH7+}MUqDE0I}$OA?8zdRuM08c2I+EsdI2{6+dk_NZ}kb`T&bOLE}t;A6dAo|t#bVXIxYWpuh", "s": "fa6fc3bef67de2ecab242dd5c5ee9c38", "oc": "b76a9f6536134e191bac482a057e773ef9dca551c2c3f0ac4475a7c76155fda43304c1967fc4e90ae6228545cb203b6ddfb11acf3a2493ce842fde214e00d865"}, {"a": false, "c": "9BbJ7V%VjWN>WTGaHg%}lCMH}6T[lb8vyB3r-Zxcl-{T2hv3OIX0{{>(Eq3PZP7^G~{SL%X%)sN5Y!:pxyXi{sUfm,Wp|*!", "s": "38b057974d782fa4de7cb5ff64812744", "oc": "9c689c05337f41abbb0f27aef65c09a8369c5439265512483cb5b4a8966177a38a06afbeb60b621d1d27ce522d30105aa16ace14550e51a183d43ee3d4db0245"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (234, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb^F*agL4G?C%?0)9UE4b~W)de42&140m=8FoXlMZ%ApcgZXSWaCNxl>3BQt#*(|ty;1V", "s": "b4b95a0a0fed84535bca7c6e7779cd71", "hm": "ec6ecb44e848a3b6c6063a27bf1ed216"}, {"a": false, "c": "m=bM9vawLU6aye2*i{#8qAgNqI0K#32FxmY*3p+nW?XtfVYEtnjD}Hd9dNQ4npH3R?^aECHQC", "s": "190d9bb6289210ae88bedb712b06f461", "oc": "fcc4beff521f0aeb15e3be57c91f240bc9d82329c64ec04aa5ba6a9b159a89c98b15f641c1b3ab4ee5262d02733e5476a9373e6c9b964117"}, {"a": false, "c": "m|bM9-awLJ0aBLf)-#vT#*q>wLQ_TS5BC18R|QN-+p4aeSY:GzixlKRP+>$.GA-}?u=+OF[wt|bmO;bo@$&$^#B;cF>9h3y)Ss%pc%Zi1}uC_xJr3Qltl*(RHBa<6|v%5r($VTMP&2eW1V", "s": "3a945d565180d6a0a2fee5a64d9002f1", "hm": "65b75ebd0812bfef87757f1ad8fddbe1"}, {"a": false, "c": "mBb`9>rwLU|ay(2*i&:8_AgNq205z327xtY|3p+,W?ot0VY;u5jDr(d5XNQ4npI31?^aEq$QC", "s": "f0b2377c778861af256cfbca4dd0aa2b", "oc": "fb47311fcb1ffa325254b2a7a9cf24cbb7dd53aec63544aea5ba471d559489198e82ed5ab0792b4376ff8302db2a947878e5c66aadd04bd8"}, {"a": false, "c": "mBWJ&DaHL::-c?HMr$d^$NZI=pL3!bj4PaXak!&G<8{f6dx(`Yc#32gxtY*4p+GW?ot0VYSPnj{8(dDXNQ4t&N3R?baE4$QC", "s": "7d4a074f9d722a446e77396f66815336", "oc": "fc9a9c61e34343a90de1d7ed077b42d6caa501cf7b172a60055dc2c0df200e51981f265546da6630a972d5786d10c469df7c98f0dd497bd6f2469694b5dc6ce8"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (235, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m.bcZA|9c2[{$snc-N?Hy)cv`YFJ>K34RJ*vLO2XFqO+P}E_9s0@N<&V|uKTb|)(?K}|l9pBxMa;_2+`wxSdOU}4O~cJwnt(-A(BK>+){1%rJxW+t<01cd^h($a;p6[}lC4g$&5r!U$}o1nk", "s": "9363d5010587f45d5c145b75d775c7e5", "hm": "6567d17fa0f0a93de6c5621045486632"}, {"a": false, "c": "m`>JZA|9=2`{Psn:ra?HjWco`3vu{{Xb5SHyW%$>{D?C8#MyXw64)tz7>M!|G2`-BL<$=hv7J)Hc1_kgFk8bD>cni}BrE07cBC9SR?ZTvL79_HHjkq#%gr4KIhOUpGDFT5L`N~AWgE)%*{Jlno}OcD>n97I9)DT61}W84g$Z=r_U$to1nk", "s": "a59b0d5691c6e38eaa2aa51b5c20d2c1", "hm": "6a815db30bbabcb9b65e061adcbd3be7"}, {"a": false, "c": "|BbJLb|9c2`{OsnrNa?Hj)cv`8vuF{XK{sSyZ%$>)7?C8#Mytwt]3&4upM@|#2YUTLDz=QvY5q>I4X9d!.c+nND{rQ8t*Y.K!hci8%76X", "s": "f3a43781f846d1bf935955bbc4a2aa2b", "oc": "55c7a935c8302ab595ca6c06a91614fbb7d8f3a9c6a0c146b5ba6793c59e8967beadf64429b542d4c5fc68232b205496a73bce8cafbe41c8"}, {"a": false, "c": "gBbJZI|9K2`{Osnrra?Hj)c(G=06PtuDt>liI%ij>eChO?CN6vFWoxVpuh", "s": "9a1f9915f674eeeedbd52dd865e4cab8", "oc": "f2fa9c6433b94719c30c5e1da2ae43a48ad95fcf470e2ccfed2ec56361dd91d125a1f5d6c55a9720db36e13061fa37c9b9878fc9ba8c327b423fa821f822ff07"}, {"a": false, "c": ")B)JZA|9c2={Osnrra?Mg)cX`6iB9t#>7nW2q(?Zbg%~3FV4vBs2`-}LVz=hvYHq>c4Xq%8Z=+nND{LQIe~KA&Y;ciBG}xX", "s": "3db09045f57740bade71b71f6481b647", "oc": "fc4ac16d73d9cda3bbe16fef077fb788f5589380ec5fa68ef3f20b29e12ad258a40f589a1976924b57a6183f77eb953149dc75cadaf3bc81b5fcf8984c938fb4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (236, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbNU?X2H2dUi~}2|UBASNTOjo3QuI`cLc){n*FR4lH", "s": "949706099157845d12c4fb391729ce75", "hm": "806fdb448848bb7fb36f6a3dbe46df1d"}, {"a": false, "c": "mBbKU&XkH2eUi~P2(dxB~!nC$8-g!K>;1WX%^)-g%TjwP+}s@|+wf)=8kHzp#2H]kS8rKl4ba~06IN~)TEi{yO$!dpk2XP?N2B%aaeP6S", "s": "d97c20e5507d30ee5d7c6e12ed03cd97", "oc": "3bc887ff081f21c21c538c5ba96f240ce1d8f3a55e5ecc45a91a677a159989d9820df64a17b0a145a53a5d042bbc5f77a632ce6cfd0fe4bc"}, {"a": false, "c": "LSbGU&X2Hs+Ui~T2Zd8ct>nzW!o#2>9A88SipR*+!]akXFPsTWopl^t?gJ@p{J-+j?lYH#V0!K(3+MzG2G9=*>`Tn$B$&_H`G&o63r;1W;<^)$gJT8wP[P;@y+w6)=8kC!p#6~X~*8*Kl4LaY06xNz)$HDpa2X+yN2B%cTes6S", "s": "3dbc61bf49a823446e7c6718c65f8744", "oc": "f25a9c0534034163bfe1d2efbc1c67071a135c48732a2b4a861d70083ccdc4ae6b2b61c3b68d8558fae6faf115d9a115cd5b904d45c23af83bf04472445aebab"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (237, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m?bLWIP{0Qa:GmoFkD#Se|+DVYWwCvQAgxtC1pB_=eckb*gvePOd7;vT0qMGN)z(Xa`9*;uQ)hbhJ>knzEr&IQ4C}n_)KR`5.y=Z@MIn1!?lqc%lq>97HQhgfG4%}d3!8`Vz]`5*Vda&hAZ0LTHsY|1_&I{hT~U$7O#|VoJdm!GI;5N_]2kw~rc7z", "s": "749bd60145e2843d77b4eb6377daa2f5", "hm": "1067d24a4848ab3fc3a86a3aee4c7f56"}, {"a": false, "c": "mBvLWWPx0`a,Nh<8vDx`K|mDV8)c(LDX9VOZ7AcsIkT2D]CIV6R;N`%eUmLR>2__&wlA+[p8nB3hg?vfg-?WjNU(scGMH82^T7ZUn+>$@", "s": "572bbc8b2e79c0fe467d082ced5fe7a9", "oc": "fb57511c981fda44c5b3bc26a9132c080c6e23a7c5a6c34fa58c630615988960bea64344b3b3a545c53d6d04176a5451aae7c17cadd392bb"}, {"a": false, "c": ".BrL_DPx``a~Gho0vc#SK|pDVLVlEEd!}Rmw5G+>Q)|48NxODP-`=8z}Wsc|xQ=}b+yt(ANAX@$ZWU-pH~S},2He^N=+I$siq{Cgt7KhBnYnV6AZ_oqHcYx@.&Q*hIu^_=Of|hoHlmzwJ;z*P!2SG~~Z7z", "s": "3a97ed51df669dc0392e85ebc490d5d4", "hm": "6eb24dbd78dc375f35eaa61ae472d027"}, {"a": false, "c": "bBbrWIPA0`arGhoFvD#SK|g+V8)i(L(X9VOR->p(IeTeDu`VV6a,N|%(DmL-_@wl++@wjn8Phg?v9g-z&{NG(rpGC=K!^4eZ3nx>$@", "s": "f9b837017b68a10f91d658b51f3caa0d", "oc": "fec4a842b89fb33f855e0008b799240b8b43e831c6aec44da59ab5c375d18969edadf635b9bfab40c5366dc22b7a556639355a6cfd3952bb"}, {"a": false, "c": "mBCLWI-x0`a~?hoFvD#SK|+DVCCeP|*C3QA0=X}OcleqR8^Wo8fXeqr3X@D%aU(5LdkQQ9Y={chZJ*R=OuC3pFYtVM#=U.?pN8kMO%5ncq?_s=32F4|puh", "s": "f16f999a3674b0e0dbc62d4605ea2a28", "oc": "fc6b9c55a303421907018a9da24d1e56b3974ea4806764521f111d7f9779b10d5389dd720aab62c10a8a8649c86a055fc0bd2990b24abb1243fca223457fc5e8"}, {"a": false, "c": "mBbLWIPg0`mdG?oFHDJS`|+DV6UEb%ED11$@", "s": "25ef0b4fd4425012cf43e71f6581b0e4", "oc": "fc6aa465f3d341a3b461d7e40ac52495e80903a9caaf87210eeb3060c1abfd12b3e6116cf803d50168c2e32871b64957fd576d914a76f55fe511a5df3a033113"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (238, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBkLU1ctj!W9q|64*)(&;v|KH%9rGUd5DAJM-Ut7-vON}-b,m|!}I}bY_38g6QL4Jx(AzZ{g;w~zX|jw{~>@%Mg;jX|i6ce>!NvDVAehkBPNh-),ogxCY_vJ;L)Fer>Tm3]350kk_Lz)R1@HjcJH#>F5bC<04s8}9fMQxP`]Cz*iE%8U=~z>}C$5-;EkVzp_*^k|1YEpE!8}", "s": "9f9336014fe3845dc514cbd9a73ec745", "hm": "82375c44e8a7abd432050a3d74eedf16"}, {"a": false, "c": "mBbmU1c4ROC9qi64Jh(&;vMK{A(5Xe9mS5", "s": "d90b98b5a07930fd3d7cad16ed0293a7", "oc": "fbc7ac1acde67eb11263d70dd48f2707afd8f3a9ceaee42675b6672319990b996e6df64f699aab83c535fd02b92a527da465c68cac07d968"}, {"a": false, "c": "mBODUPE4bKB~q|444l(&;m|a{LTNTA!h2L#pi*@*I1mKZPrpHVvS@a_C.tR7;L>#lS-dc<1;`,{%m3Q%w*eXChnG2`d}o9@!$%DMRm|=ezcU^dAfMQ%t)tCzM!M2", "s": "329fdd56d1169304292919905050d2d1", "hm": "6a6957b9fef7372fced51f15d824dc41"}, {"a": false, "c": "_Bb}U1c42)W9q|i44a(&;}|K{8{5Xe9mC5_ZX)X@X?yg[X-WGAH8&JwuvUEGju}y]sIVW1kJ?GMyK{UGm5?^k*WiLvrA?|{9({rM7p+Wx", "s": "f3be3d613810610f75537bbb23378a2b", "oc": "f4c7f106081f303e15a3bc06af13144bb7d8f3a9cf9ea7d5f5ba6793134989698eadf648b9b36b49f4380d04d9d1dd765615de647e77a336"}, {"a": false, "c": "mBbLU1c61=W9W|644h,&^v|t{B`#AF7D@?_ihCC5ErRR4V+K)h-PvUiIy1>Cxx%({v@IJ|V0^?Np.+9b6Em#[O|>jjg(PO_&m]L&kDG=0&?X*yf!_Q=p9h", "s": "f9ff39753471ebc0d6e42dd8955e9ac8", "oc": "f46d3cadb173421993018e9de5c1a8e523935d61d6343fa85dea3c954055f44e910ec9d4768a7eee7074171eac1dcb15befe632331528e56c5a922266c9a65a4"}, {"a": false, "c": "mt_&U1>41`Whq|F44hc&;b-u{6BUriH{=r%{Xp;MR3|wfcyrQ}#2}ybs$C-1k{wG$E0^UGm,q^5*^Dzvh8m[49(;m`{p|B}", "s": "8dbac04fd277b8496e7cd40fb6815696", "oc": "fc6a2d80f8b344735be1d838895c8b0c16b7c7c8461e5d9f85e72216aa6a0a9422ce7b5af62dbc0cf1853e5f1de0081d01d76677ece87a834b1ec989c34151d9"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (239, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m}bK%K**weKDAAsr>IykeTZA]YMB(4|8fbN=D>tF@-{DFHgID-uESoh[vX`JD2%}NWQ{zT)sJN2)svoVF-)ubVt[cQL3oHB6ZV_>mq>t*L5uP2-uJQ>>yH{59$+9d+VsetmL1?`K,ldU?+IWkkOlsdKy3qGxU^U8AUq1dArOMFcP%CEBRmq|o~0{Ggse6t_)r[zu+[T&ImKZ", "s": "9403a60184ef895c56029b9cd739c7a6", "hm": "9034d63fa888abeacda53ab6be40df16"}, {"a": false, "c": "-pqEbPF=C-c5xk)feKu%D%[HX*hfGH0p-ckpD~y}FM}on8Hdcv(5a%!PE7AZ}6z5-r6uh", "s": "fa9c9275a6d4e0e074242ed502e1da68", "oc": "fc6acc6533df43b6bc00d82a72bc96bb996c6cd48e30c6e7428dee7fb0879fa9c0f2526b208e039feeecd26633b0274c687d4ebf87ceedc2bfe6bece5b1e8354"}, {"a": false, "c": "mA!K%ls*MeKUAA,o>N~keT<<&6G+~_<2K(`kWe`s5>4Xao;cRG#2`thz#f,V@*AN@ia", "s": "8dba0808a57723446ef2e211618176c0", "oc": "ed6d97c5333161a3c2e5b33c695cba027f4fe420f7bf73f375dd8ad9533583e25610b3970e26101eca14da2be5c3b9fec2cf5997ea2d6c9b077e1b18bd27c9f5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (240, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "vjbK(pyb7AQA{:mOZQmOi}|huYCDeVeY{aps=IX%R(OTy1ndL!lj`e|BR$Gv&)n4o,v~VfC7WfPmZ7?!TeVlqHX7rVF>T@|%>gNOsBDIz2(#h<8XKw3J4KvJ%z4", "s": "849de6310fe7c656a61f90647d298cd1", "hm": "8067db44ad48eb3c2ae56a009f4edfb6"}, {"a": false, "c": "mBbK(pyr$AQACXm.I~yOi}Ihu96ceUgBXV?28(MVtz#B7;^6<3WFOjd2rR8q=fogcYMPmKvJ%zy", "s": "090267b5d59db1fb837ca871e10ce4a2", "oc": "7ac7a183781f253e1f538fe6a5d0249b2ed8f3aac8aece4c35e5972315995969ae67664ae9b5af4555b651127b2154859c3d0e6c9d39da0bed31dd4f17a9bfc3"}, {"a": false, "c": "wL5K(qyr$AQyCX|OIVmOi}Ih1LJr=wwviS^n1PT2WK9{fqWP-@uehz*E?5ZT%Z$`BA3^PCGz_m8T6iYb9r?DN2cZ}r!JXDzI|_|{A^1RDOWspHAX#dc{G3Ttk;F|<6Vhvqm=RXAg_HXy!(2dzD!=L~R*`S", "s": "359b5d5f01419110a92e8e1355d0d2d1", "hm": "6467347d70d8b04f1685163ad35dabe9"}, {"a": false, "c": "3BbX(pyP;AQA6XmOI2mOi}Ihe969+}g9IV#98@M-tT(j^;^gIv#Azy", "s": "ef89378f08389101325c498bc33dda20", "oc": "fb07b111c89f2a329f73b684aa1b24eb72d8f3b4d64ec435a5ba672018d9b9698bbdf64979eb3e4dc236f8c2f42a54068495cea6adbed89d65ecb84e81aaeaa9"}, {"a": false, "c": "mB,+(pyr$JQACXmO1?*Oi}I%GBte;>O@0g`yBL[0I##L^GXA#daWCrE$8NBk)0K>lmV1C2cf:rB(M(<<4Hoa[0_1jmcM`uuCl(|M%<:vW+Z+O(zr7LhC0${G{(;RF=bBKK+;{>K-J%zc", "s": "3dba00cf78d44f23ab97b6196671b34e", "oc": "f6629c68c1f34146bae1d9cc495ddae49469aaaaec62de012476a3fd067824396af81f69471300bc36be934175e93ad037451d21640ec510b57b6daba85093fe"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (241, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBi{LV^6jN?0J$;g:1-JPt8&qL,^|W[ZKZ@G?lN]$CDXJH|W!kN=JKpj[X&7To|`HWURpeL^Uz`*^>{D^0gvk=Kw$v$b|*oX{)|&P*XSf9.:cD&690sM_6wY5xR^!82|J5NlSI`y52@k|9W5a`;W#eak2jlNOS;[8D?0g$;g)1-J.*cmq6XKHB3o?jM)H&58v7ttuJ", "s": "38fa0e1f1d7683ee6f7c651f6fb3bd44", "oc": "fc695575022091ffee19a8348c0b25789e08b98e7555e110487920a3f31712c1207f84407d0482942ef0222677ec09bf0c21e34a2923838a9950e2a7d4a908dc"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (242, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB+KA;2~{|Hh`87%NXU&=nqH=j&nBJf>vGiA$|Xx^Cw%E3~nC&,n2n|lsTy7A$V?nviKNhZD;g(Y~8atS{DtWh{85Bb,<_1V+JAQ;3iCfm75R8de-4QZ:xLQgjqkA0{-^??ZNljArxA`lY", "s": "94c3df010397643d524e0b642729c745", "hm": "e667cbc448eb8633f3dec7bd7e160ff6"}, {"a": false, "c": "mBbK~;2~_8&$SY7#WXU~=n5H48zV8I^FE9E$Tx^Bh>*L$Ze`aiidiI~8f6-J#2}nugC@^%wK#BI84U>FeL_z-Y6h0ssP%yfAdMiH?dF$W", "s": "d90b978520723c1b267ca8a9ad0fa9a7", "oc": "8bf7a11f081f5a72155f7c060b4f243b40f8f8c1c79c0444cafd8713129989898ea5f63af63cab48c516c6037b2a54675d7ad34cadacdb77"}, {"a": false, "c": "mBTK~SF~8|&h787oWXU&=nqH4L*I}+IxrSZ>l7r@cMkI.[BZY@g%L&?1;qL_ZhuY3yGKN|a-s%dC:n9ue^W8Jtw6L@nO2~2$4fhO-Ld;j=sR))wQu4iKfmE5R@-IogLT}xLQCnq2w0{V^q?Z]lfyrx0%3Y", "s": "ca9a5f560b268500a92e8f131f78d761", "hm": "c5b75dbb7d3ab77f86c211cad8c7d2e7"}, {"a": false, "c": "fBbKA;[~_|&G787#W$a&=nqH48zq_I^&E9C$Tx8Bh>*L$Z3#atidRIG_06|(#d^1OgC;Q%XK#7zQ4U&Fe{_z-Yvh0)sP%O!A(|VH^XF$W", "s": "e35d37818ea8616195eb6e3bc7376a2b", "oc": "fbcb911f786f252215cbdc068c19c06bb738caa9f4ade545a7ba2a882500296f8eadf6ed3cb3eb348e516d027b2a547a0634ce08fd97dc1a"}, {"a": false, "c": "mJbKA;28T|&h,]7jXXU&CSqH4C6`I)f|o<0_iVN!sz%a|a1W%)I3uh>Lo)l>6AFTEHMX_T`5@j}Rsi7^n$;8pQ4YA1T~d8QPdIm@!s5KF$>9d!@.(`r:0h", "s": "fa6f29959648f61add23add895eacdc8", "oc": "9c432ce533b9e2144801eafc9ee3f30c0e7a480ecdbe61dc88a533c469ca784f74b1e9aafab2d15c852fdc12e320589848c4063f5d58273265a4180234921831"}, {"a": false, "c": "mBbKA;2~7|&9787&WXU&=nTH)6KPW}$J3a=|Jqz~_kinIG]BSW#2^x|XC^u|oo#%z)4U>FeL_zbY6i0ssP%yfAj|iH^|b$W", "s": "0dbb404f427743846eccbf7d66794344", "oc": "fc3a9c6033b6cfa5b34133eefbfed4bc374d5c4a96e2cad40e3faefe5e5f1c72b4873f35f420f622f4bfb7ae35470fd7718553fa2b8436c807d11e20b32a0a85"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (243, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ&V+<+3NnW:rTHgEYuCMq#dU570Cz_B24UzDW#b#KGw1C|%8!Y.t-EpoX#N-8ZJBTv;?ke$@`(n>=$>Pr*e}A_*1h|<*1CKY$^(%{xU1$iXGic$9KV<*LAX}Tz|x9gP(M!|~HdSgKJ3x3UN*`Ics~8stkH^qxcq8!", "s": "baf3dd0b00ef884d525d6ba97bf9c776", "hm": "8864f5b49b48a332c305ea3db3eed456"}, {"a": false, "c": "mBb*&Y+<8WNnWC+uHg^Y!CMH#8vzM231av>GQI4TvunK6^Uo7Qh(`z>1UcJ>#2{OY4hq~d2P7D5k{SL7X*)8N#Y!JW=.Uuu9UfmrW_|e_", "s": "7eeb7bb5cc5d10fe8895955624e04b66", "oc": "f39aa4116a132a3272463c96e9cf2409b7d552a9c6aece4ea54767941fb580edfebdf20abeb1db45c5866402742a5448a632ce6cadb6ddcb"}, {"a": false, "c": "mubJ$M+4+WJnBTG<_6DY!CMH%Li)6dAJjLaZ>!CbiZstrS&vM}P=hVCm1M9Ynr[isIv8Co?6T>t+(G84pC<8j_~YfX4?v>?Ht0[@x_=DyfRbUcJ`#t@On0Eq$PZ(t^Gu{JR7~*)sN#Y!JpxT_qu4UfmrWq|*!", "s": "f3303781a708e10f95fb6e2ac33a5afd", "oc": "fec7aa6f283f2a321553b10bb91fc4cdb1c8bbc4c2a2f640a56567931b49d109824d704abcb3ab15c9346df67b7a5476a635c340ad927b78"}, {"a": false, "c": "mObJ&Vq<+WI+Es3Wf96adkZNp#}", "s": "fc64999f367e42f0db2438d811d31aa8", "oc": "65609c3530b34ff9c30cd82f7545941e9ad0ae50f64cf9ac4cf6a867675cf5746835caf97fa9b2d1eab78f65cb2a0b455ee2eabf3c2da3ce6831e52e18907768"}, {"a": false, "c": "mBbz&V;<+WNnWTMa5g#b!>MHK6LnlsYv3c3r-ZLcln{T2hzdOILP#an(Eq~PZP7^GG{SL7j*+sN|Y3JpxT_uu4Uf&rWp|9!", "s": "6dfa53fa6d7323475e7cb71f6e81b444", "oc": "fc6a9c55b363e1e75bc1dbe7f7cc322239cf6d2991a4ed4b9c2059c126f2d3ae69f4abbc2dd61f6d8d24ba0b2dff660301f41018750e7cce4d6b3e7ac518b74d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (244, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBB#9PawLU,rP%<3u9$EQb~W)de47&1_s2=wvQJTr(B>a8RiQNY+Q4PeSYRGz{xBKRw(>$tim-@1u=+OF_`tB84A|b~P=&$}#B[c1G(?oygcsApc`ZX1RmCNxJ@GBlt#*(|HBay|2*idz*0%g}qT0K*325ZtY}Dp+DW?o.0VYJjxjG{(d54NQ{nbH3U?^aEq$GC", "s": "83b9e7447ae8618f954175eba1370f24", "oc": "fbcf31306ba847984543f414a99d2d0677e84d7dc1a05a95a50bb7b1159682d98c76f643b753a5439536a0830918e6c626ac6df190be4e12"}, {"a": false, "c": "mB}x9-a%LUJa_uqxG+*Hsv$d^$NZ2=5LKft2RJC8L1V[Sq8+Pq(N9s0]NF&<}uKTb>)6?KhC+x,2bua;Y2+,wxPdOUr4O6cKqn`oqocBj{+j{1p,zTWj;z01rd^h(=avsBD=0k9``h@3OP7Dj5t(w<$<+*;3X:KV6FnhA+oEN*M{{-ni)p?C8)My;w6W3&4h]b!Z#2`-T-!z=hvYJ1?B4~qdjZ:-n.03rQIh~9A;4tciB%7eX", "s": "3a4bc705f03d3dff867c2d16ed01eef9", "oc": "fd611e1f28b228f2f5d58c2d199f2c0bf7a8da79c6aeca43adba6b93139d816980adf1eab9b36e056546d34583da7476a6b1cebcbd3f41f9"}, {"a": false, "c": "_z+JZA|Bc2`{OsnrrY?Hj)s>bLjQ)X$p_~llv~xqb)hiIJ5|*>Ul1Zkglk(`D>cnLb*rE07YBC9SRcZTgX274!tjaU#%1$4K6cO97D_KT5LCOMAWr-){M{J-nodAcDun97I9)DC61|WC4g$Z=r^+$h!1y5", "s": "3a4b5f5601317d802904050b249fd2d1", "hm": "4a1d56bd17d2b7188672e0cae3f00bea"}, {"a": false, "c": "mobJTlR}c2!{Os}rra?HjItv18Ou0IXK}:S{w%$F)%MC86Mh;w}u#>4h>M!i#2]-TLDz=hvYJq>I#XYd!Z=+nND{KQIt~K9IAljvwWhO?CCfO&<]XOPU%6{hTyKAP#~yBgzCaL:`ouxyBXM80F96v.6MxVpuh", "s": "93a39935367522c0dbad25d80c1acac8", "oc": "fc6a7c1633b242efe5418e1a5a4343a288b8e9c17b0ad7c00b3e3668c72de8d68ca3b5a6b555b79a9bbe7f0f7adda280266037caba75770f44871fa1212213d7"}, {"a": false, "c": "ZBbJM$B9_2`{?in^rap@jfJW`6LBDtyH73H|q|VZbg%elcMI4XqC!Z=+n-e{rQIt~KA.!;ciB|7eP", "s": "35b4080fbd7922d36b79a7176681b364", "oc": "7c5b925cb3b341acbbb7deffd77cf35ba454dd88cf870b8e14e2ebb944fa57f3e2a7515ceca6b54a8d9119b2facc95f13c887dce57eeb38535c528028b8486e4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (246, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&X2H2TXi_T2<<8c|!nCaYU)-L,3=6jQU8Now0YE?Roaj~p~>hnl5.$dp)N|Uf_~Wl`f|lA3VzuAAEZVR3&>sQBAhNTOjCUZuI`CQc){Q+FeTj&P+Pe@E+>6)}<$0zp#2)Xeu8rKk4pp1V6x!I)iB_+A88%90R*?!8akXdk*T9op^^tqgR@1%J-+@?lYulV`(:R3+MRS2Gw=3>`Tdsb$&}I`2&=n39`@-|-otMASN(4joiQuItOLcy+G*fRd*W;<^)-gKTjw8+P;Gynw<)=8afzpC<_X9u8rKofZa~V6&dI+.B_9TO1YPpX2XPyy2B%cTeP}S", "s": "136437817818316a995b3bb8c3378fed", "oc": "45c7a42caa0f2a321463dc06a975240ba7d1f365cea0ce45a7ba6df292996e618eaef65ab9b71bd455362d02d12a4e722635ce88bd9042bb"}, {"a": false, "c": "m(bKU&i272TUi~J2d17`%n.#2_Xku}rKl4La*V6x#q)iB}+?BnzEr?IQ4C}9GCKS`w@y=Z(X*O0!n)?c%KAn9oPQhg(n$2}d3!8skO+`Fc_d?&hAZGoqHcY^v#&Q*hTu^_7Of|ho6ljzGI;QNP!2kG~rl7z", "s": "94f6d60b0fe7c4fd4a14ebef87e9e875", "hm": "8067d449a8c81bbb4303ea4db4aedf16"}, {"a": false, "c": "mBbTWaPx0`t~GhoFvD#h?|+D$8,c(?((9VOZ-&!HI~Th3q`VV6|:u,yevmLo#2{_&3l+:.w8nB3hg?Z9k-kWQNG`mcGCHKv^T7g7ni>$@", "s": "d90e27bd212d39fe0f7ca816e74ae1a7", "oc": "9547d81fd8162a321553b400ab1924dbb7db1ea9e6c95175a56a57f31596896e8e3d8cbbb1beae95c5366d027b235476a6395e6c27ffd2bb"}, {"a": false, "c": "m|b7WIP-0`a~GhoFvDlSK|+DVLVlEEd|91mw5-+>Q)[68O1.DPTR=Hz!B|cAxQ=}G+yB(8UxX*$fWW-pHFGX-2HP^P=gIY-0HkG*(7K)BGYMf6Af_.qHcY^3-&Q*hTi^w#O-|hoElmzGI#jNPi2}Kdrl7z", "s": "7afa5f5601a68d00352e853b549aa2de", "hm": "2ab832a57852076b84b1161a68dddbb7"}, {"a": false, "c": "mBb:0jPx6`a7GhU7sIkThDt`VVqa}NV%eDm*s#>{_&Mf++rk8zB3xg?v9gTkWQNGW#cGCVK2^Tp^", "s": "feb9338d781871ac685b54bbc6b79abb", "oc": "9b07d11f47102d8b155eee06a1af205318daf4e9361ecf45d5eca093f5d28e39820df64af813ad45d29668077c225432a665c264cdbf624b"}, {"a": false, "c": "mBbLWI$x0`a~~hoFvD#SK|+lVCCe8RHC3LA0=X>OVNeq78^WM7f|>wr$X@D%qU(5LdkQ|3OorchwvS@=cu)3paupVZy=AF?aN8OJO%5_Tq?_o=|Mn4wpOt", "s": "fa6c99903604efa0f25439d82570faf8", "oc": "f06a9675c31288eea30c8e1257dd1100b3ce5e5cfe62685dd0e117afa1ecfd4d5c0abfe236fa18d30a26be47821fdb5f77822414347a0e1a4c0c42c13e06c5e8"}, {"a": false, "c": "mB[LWYP*0,k~GhoTvD#SK|+?2}Ufb%E^11oJovsVsxvKcuBtqSy2{_&wl++(w8nV3hg?vfg-kW~eG(kcGCHK2Mf7Z3Ew>$2", "s": "33c3d56f9de324446aefb77e6c8bbe87", "oc": "0c6ae26533b968a46be4dccf08cce44aedd103e217138e32e8e519d5e1abfe12b874e60c185cf9f038c2e2ea91d444316cbf6d984aa695da35a0aedd9309c913"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (248, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "QBwL%1c41)G9q|644s&5;-|>Dv,^G7d5DA*M-Ut)t_J5D-npm+!0rF%J_3bb6>h4JxCA(tqg;h~zZCHw)~>@%Q1;jo1f6*=7!N@DVAR2%ByNW0)fUg~(e_IJTLdje%|Tmnt350kkPV?)R1@HjcJH#JF5(0<045J>AfMQ%J`tCz*XEtgFdPhakT[5-CE1fz8_*^me1LVm>!82", "s": "dd91d6810ab78fb85d849182612ec745", "hm": "80677864ad49a3afc3a5fac8b74edf15"}, {"a": false, "c": "m2bGU1cbe,k9qH64fh(gP>|KN8(5Xeg2`5OZ4)XD:?yheX-mGvH8&D.uvUYG#2Oy8s9C-1kKVGMEKdGG?5Q^5*Wi5vhDxr(H(;k`5pGB>", "s": "c90d97952b97c2ad8f4ca8c9e60f5407", "oc": "93f7a9178a122d12155425189922240bbe65f3c4c6aac445050348ca5b5d3079808dfa44b9bfb76705366a0578ad5f76f635ce81fc33dced"}, {"a": false, "c": "mBbLw1c41)W9q|6.Nv(N;v|K;`Tk1A!}2L`pi?@*>AiKZ;Ep&4q=NIems}RBb6F9kO-dc<1j`*i8-@Q3~zakT$D-;E$AM8_*pmh>YEm>!8$", "s": "3a938d5671168a00592e4afbf49b12c2", "hm": "63bb2fbd78d2b57f86751c1ad9dddbe7"}, {"a": false, "c": "mBbmU1c4G)U9X|~44h(%&&|K{8(^Xe9m`=OZ4)XL??yheX-WGeS8&DwsvUW*#&9t8sIC81kJ>D;EKzUGm5?o5*Wiz>m8xf(9(;k`{p+{>", "s": "f3b9371838334197905cebbbc337aa2b", "oc": "1bc7a1afcff6204265577c062915a40b98d8f38fc60ec4f9d5f864631a99096c7eadf64ab9939b2765926d657b2a5b867635ce1caea794ee"}, {"a": false, "c": "pBbLU1c41)W9||644h4?]v|<{)`tAY7D(Rph-Pvpi6y1vExx%<@YYIJ|V0^H&pVr9-6hMi9O|A{q~(POCHmKL&kHk=7ef>*Ff!_VGp=h", "s": "b86a90753774b6dfdca48dd801a9c0c5", "oc": "31833e7533b32a19b2e18e12ebc5a745200751c1d63e57a40d290ce5d055344efe2ec0a47d8cc3bc7c76420478a5c79b75f363bb47ab58bfc549ede27c7eb50a"}, {"a": false, "c": "3BbLU1c%1)Wr6[~keTlAcYM9b4|7fb~|D>=q@|{DDHgO0-BESoy1&[`JD2>{wkQ{z)MaBNN)i~oVF-hukVZzcSFrPHKwaR_Im&>BjL5u*2iMJQ>>]rXQ9b79k+CsetH7#iHK9lde?CIW*$OKS:KC3qG&>^U8eUq17ArO-F>M%C%]Rmq|o~0(I~ke%ZA-8$p9%O%q.or?@m8un!mdy9A5-C+l&A-BbZU#T`EhzF$NV>I~keTZ%cgZC-p*Eyl`XC|cFDk)f~Ou%!4wH@3hf84+q-)#kD(@z`M&?ndpvKv!~a=!P+7AP%F%{Hmq|o~o%Gvse6tL{J4zuo4T&_@KZ", "s": "32aac0560bc69d00a92e95145f7ad248", "hm": "60b4563d78e5b77846756813defdacee"}, {"a": false, "c": "mFbK%K#*Oe7DAAsr>I4`g6ZA&9up{%O%q$]rm@mN+n99b8EA;ju7{bA-BbZG#2`E6z#$N#u<$yxw(4CbkfBZrr]%3D>H_0$cw-z*ANZi<", "s": "f3b93c1ed89e010ba10b6bbb1937aa21", "oc": "afaca11f3871277de553bc0889f9c5ca08d2f3b9c1ae14a579bd5794179987897e7da64a06b3ab14c136fd027b25a476aa35ce1cae77a947"}, {"a": false, "c": "mBQK>Ks*M`nDrAsK>)~keTZAcCG9IPT|;Q@tEFX[5t$rg0:odR>6+>PrpUh", "s": "fdef997d3174e1e04b21fdd83aeacaca", "oc": "3c5ae24d31b0ad29a383d32ad272d32ba0762fb4eeb3efaf4522ea7f9824af2520fc920f39b192ffde87d29083ae874bb1dc398fa03bddb9e1eb1ec1c01c8454"}, {"a": false, "c": "m^bK%K(*MnKDAlsrFI~=eT4:c6-z~Wk2KC1k~e`G-54&aG;WPw#9`Ehz#9NHu<<@xw(4CVEfBZrSh%_kCH}0$cd$z*ANZia", "s": "3dc3394fc078514f68ccb51f66597308", "oc": "ec690ceb28b34fa3bbe109ec696c7a3c5f227230faf553e4c5034e9932a583a2d836f4a7a8f02aed150cda4b82cef9fc658fae74ee220ab807fee118a5abacfe"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (250, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "6BbK(Qyr$[Q[{XmwIVmOV4`hu^%)e&eKXais=IX`cs&T1oI@e%>[N%shD;H2Xy4Hz[{azaFkiKv9%zy", "s": "26c806013553840ddf1498498729c740", "hm": "8061c044a8285b82c9056a3b3d44bfe9"}, {"a": false, "c": "TVbK_tyr$AQAMX^OIVmOa}Ihu9gce>g=XV?w8@S-tzUB8;^J<8&;Ojd2ER3qhfo_!yM1]X#dc{GY7tk;M3WyUOe6{=fXB4_2GR!(}`zD!=L+nV`^", "s": "7e9a5d56e1369e00ab2e85145e9c8ed4", "hm": "f8bbcdb978d2b68fd775163608f84fe7"}, {"a": false, "c": "mv[K(Ryr$pZA|j~OIVmO{}I?u93keUg9XV?k8@M#tB#Br;^6<3~FOjd2E%8qmf~gcYMT<Kv6(zy", "s": "f6e12861786861e0c5fbb72bf8392a91", "oc": "9b14a11f181d2a3a1653bc06a03d2bfbb55853397228f5fda5b167c3e599b56f8efdef40b9b3b545cfea6a034b2f94765bd26e2294feee11e500d85f8caab5a9"}, {"a": false, "c": "mBb<(pVF$AQACEMOIymOi}vh=BEep>Lw0vKyPL-0In#]8G@A#daWCrOW8*Bk)0ZklmV1F2cfcrBYd1<KvJ%zy", "s": "096f09733334ebe6d5296dd825eac638", "oc": "2736ac643eb44219fb00d3d76f0017221244d25c2dfaf4bb55da850a6c8421eee72a802fbb4db98eadba616434b97c87c6362f724f9f627e61d10d6b401130d6"}, {"a": false, "c": "m>9K(pyr$AQ]CXmOIVmOi}Ihu65`j}FP8FO>{4Ho>T0w=jmcM`>f!RG%M1ndvJ%z)", "s": "bdb7194d4e78234d75d2ba3f6601bf54", "oc": "fc679365c5b3d1f3bbe9d88c499ddcb4910431a03b6ddf36b6aa0bcd028b93e46a58108eb11c207266b095041ab9d3dc37171c126d01c500b271b1418c404423"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (251, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBUL@V?%dNG8p$;g),FcP*cmqXhphQ0YKZsG?lNn$CvlJHZW!V*=H;Na@N{OfN`t+Ewo|7,5c3n.CX4+#+IO4JKpjgX17TuG`H2ORieL^|zO*;JG+Oy^puh", "s": "e0e3d6010fe6c65854140b1db3978745", "hm": "8867d444a64ea512c300ca6de44e4f16"}, {"a": false, "c": "DBbLwV=RdN?0W$;j)R-JP*cm:8w1tsgI><^^2s(k=Kwc_$GK=wnj973J#YQi#2^d9gP1o_9]z@!l!JIS)7O(VJEBU^ztUh?^@=oaRG^HJ", "s": "d91b97e0bc2d748e2670a846ed7f54e7", "oc": "ba8ce13d68182a32f525b106a97d440bb7d06da9d6fe955515ba90d2b59689b98fa9f84ac3c3ac95c9346d567b294f778605c4b4aa6eda1b"}, {"a": false, "c": "mBbL@V^WdN?0W$;g)BvJP*~mqK_mrQKBqT&!H&=;JRFg2#bq?wQ2^?T?MQ1vb$Z{qd|J&)IRpFqYVljR-w!!WauR19agCA#NSB8ja?iC`)BMCB41~r:6!A<1wxE8%:Il$oIE}th{E9icU|`E)Y+k8(pTh", "s": "369a555a01959a00ae9e85975473d6d8", "hm": "fa470d9d13d48a0f1605161d487e4de1"}, {"a": false, "c": "mHbL@!^PdN?0P$`g)>-JPj:m38h1tsgf>rD103{.=Owcv$Gb=pvuk733iAQi#$^f^gv1m_OOz;!=oJaS)7m(SzEQ-4zOUh?^@=oIRR:2J", "s": "f87938847c124b0f775a6bbb6371a722", "oc": "abc7bf9f08ccf93c4553bc06a4af220bb7d8f3a9f4cec74ca516379314c799698fad268a90466b4cc5376d027b2a5c760635de6ca1aee2c6"}, {"a": false, "c": "m>bL8:^7hNV0w$;g)1-JP*cm|soA4+`(>bqlQX{uN@P2X>f9UaQDN#90s5j6ws5xR^!-hhE5slSf4r5r@kA}WSaN;H#zaN2jTNO0F18DaS@n}ETG!rsz>", "s": "fe6c997c3897e6a07f242fdb0694cac1", "oc": "4cea8c6c3303c214a290de7a17f71af555a581248969ea9453f5b87e77be03f29b4764abfe96a3eec00f228715fdfa11fde8ef69c695f583283cca73983fcce4"}, {"a": false, "c": "m7bL@2^%d7u0WS;})1mJP[9mq@XoHrBo?jM)Z*$-v$z%Aj$pB7f>vEIA$|Xd3-Myn3~nC&!N2K|FspD7@$VcoIaKNyZD;2AYnEe#SRDN7XkK5Ply<_1V+JAQ#7NC7mE5RjdN-=m]~gUQgn62A.{-^?;Z>(,CoxAE3Y", "s": "3493d6419f70845d5213963e7d29c749", "hm": "8067db44a848ab1225e86a3d8e4d7816"}, {"a": false, "c": "mBbKA;2~_|&h{87#WXwE(nqH48zV_W^FE9z$TxmBh>*L$Z3Uai*diIz5f6|BB2^|OgC^U%o$#UzDm@>FK}qz2Y6hlssP%yfOd|i4^dF$C", "s": "d90307b9207d3dfe88ae18196a0fe1b5", "oc": "fbc7ab13c7af2a3ff55a5ffca2302444bdd8f3594ea6c94bafbc676358998929fea1be2ab947a2b383d62d0209b45bb643359d6eed49dfca"}, {"a": false, "c": "mBbK8;h~_?9h787p:XB&=uqH4LK,%yI%+Sn>[7r@cSAI#>B0x@g%m&?T;zKa`8OY{yIKN|aPs2dC}V9ujAf8JtwM>@OO2~2$2fWbxLd*)=aRz)uQ#0iCUv]5<8de-%qZ}xLQgnq2A0{V^??Z>lfirxAE3Y", "s": "5577335c01a69d00a9fe851b14a0d2df", "hm": "7a6f792d78ba677f1b7506eaf8fdf2e3"}, {"a": false, "c": "mBbKA;=~_|&*@87#WXU&=nqHMGzV_2iF{9E$T@XBh>*L$HLULFAdiIGO56M_#24>{gC^U%o?fUKQ4u>FeL_zyYdh0sXP%YCA5|iH^P]SW", "s": "035ed4312811f10d735bfbebd737942b", "oc": "fa37d11fcb1a2630c553b466a9122f02b7f8ff12466edb48afbad745567789678cf5fc67b2134cca45466d527b4ab470a635fe6dad90d3ca"}, {"a": false, "c": "mBbKA;M&_|&hxl7#WVU&=ZqH4Cg5v)ff7HD_iLNtsI%p79DN%)*3J@+H_)l>D^7TEHMX_T`5(<}7si7oqq;}pQBLA1]~d8TndIHDmfUKF(i9dnz4Y`S`u=", "s": "faaf9378317472104b242d020b0c19c8", "oc": "ccfa9cd503c122192303001890e93f0c033e4864c133712558fe38c1640dc85f6eb108aebfb01a3cede3c7a60a2d52c9edc6e6ef5d082d64b5a2e43834ab7b31"}, {"a": false, "c": "_Eb:A;2~_|&h78OtC^UsoK#Uz*4<&FeL_z-Y;S0sCP&yoAd>iH^PF$W", "s": "fdbed04f0d78239b6eecb712d28eb344", "oc": "f8419c6538b341aad4e9371efdfe54e5e74c9cfdcfe671a9060f7a6a795e81ee25871f37f428765a608052c33db71add7b63edf9af813a1471d142f853888e01"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (253, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJgV+<5hNJWTGUhgZY!CMH#LUj70CzH~24U3oWMb#R&w1<@cS7zA@je|x{LxA,-Epo5#C-:ZJ,Urn?7A$il(um{$?2X*eE8~]!SgKJ3-s?N*L4cs~!st8!", "s": "9463d64f7fe7895ab1147f69479ac045", "hm": "8067db4424b6ab3273096a22becedfa6"}, {"a": false, "c": "mB=vw}P=SVCm1M9YJSJisIv8CoL6Kg?Q(-+q4C)jj_{Yu|4Fv*J<<09gx2TD~bRU9dAX}az|,9gB(aa8~H!SgS{2nsUN*`Ics~!s_kH^qu(c8!", "s": "3a9a5d5b063b4d00a9fe951b5299864f", "hm": "61b714b328d2bd7b46435682d2fd9b27"}, {"a": false, "c": "mBBJ&V+g+WNn>TX:)%#Yr?MH#8-d1231baoGQ;zIy|n<6^UoU3S``k>IUcJn+2PFEa(bOLEFVjA&dAo9t#bR$IxYWpkh", "s": "7e6ce945b604e20dcb467df8556a7a38", "oc": "7f64a76c83b37ca9730ad8a67d7507ff41d4a2b1f6f7fc4ce3f69db7237c10a4390eb1f96fb6b231eaa28e45cbe03b22dee704023e28c3ce68123e2b6e007860"}, {"a": false, "c": "eB*J&p+7+WNn#TGaH>#Y?EiH#6TnlsY&yB|rbZxclq{f2hvgFI#2{On(Eq~PZP7]GX{S87?*asN#Y!J?xT_uu4Uq9I%p|*!", "s": "36660b4f2d786b435e7cc8e36a819344", "oc": "4a619d629eb341a3bf50a72e2c5cdfa2a6a1ac445d55b6583945c5c1b6c07a936d04a4ba2d8851c90d13bec62f1206d8730a7f34588ea0f12d0bee0a8848b145"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (254, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mQbM9-aG3yhau?+:n?~|a;Cw=|dKpn|eh+6ld!+9GM5*c91Q3+&d9uL34g3,2=K#+WC%y3-9$9nb~7Bde4!&04s2R>FoXlMk%ASegZN1WmCNxp>3Blt#*(|HBaTMWZ-eZ1^", "s": "443edd0154e7845652249b258344c735", "hm": "c067ab8cad48ebaead056a22be4e0516"}, {"a": false, "c": "-*PM9-@wLUKmQw2*id#80Ag%qT0Kc3y7xta#ap+DW?ot0VYEjnjDO0d;XNQ46pH3R?paEq$Qm", "s": "d98b77b5a075307e867cee5be00704a7", "oc": "cbc03d1fcc9f23cac532bc06a9dc290ab7d4f216cd7e4ac5a52662931599836653a3c84a79f48945754b6772862a4476cbe5c367a39f4dfa"}, {"a": false, "c": "RBbR9-awAU6fl?+wn?~4n;CH=Lf=-4&T1*3>}FQK+S5]uj841QNY|04a>SYRGSixBKRP%W$UG>-@AN=OOW_wcB8Q0|b|P=&$^[)|c199a:u)Ss?pdgZXC&mCNxJg3Blt#j(=@BawLU6ayw2*id#80ACNTT0K#3|7xtHz3.+RWZot0V)Ejnj7r(BY]NQ4npHZR?^aEq$Q.", "s": "f2ba789198088c3f957962fb80b7aa2b", "oc": "fbbba11f698f2b38b653f376980024bbb7d8c3a9cea4a8657efae99de279f26988adbaaabe13abe5c5336d077b275a5ba63b5e8ead9f51f1"}, {"a": false, "c": "mBbM&2aDLU6ac?Hqr$b^$NZk=pL,w=6B!bc7rrx?HjscvU>9J>KtmRJ*8LONbQqL+PRd_9s0vN<&V?uKtbzO(?~b4+xpGVMa;720LwxSdOUI4O~BKwv`K-AcBg{%j}1przTKjt<01cd`h(Fa;p68=0k9``Z@8!PcTs51(4zvVe*;3X1KV6FnhbXVE)*M*3-nozAcDunYo}9}Dc61}WC4E$Z=r!U#hv1nk", "s": "9425dd910fe1345dbd1428697129d725", "hm": "8664b5049848fb26e3c56a3d114cd713"}, {"a": false, "c": "mBxJZA|D>2`{twnrqa?H4))vVpvu}`oB|SSywD}>)M?CnYsy;@nW3&4h>Z!|#*`dTL(z.hv{JqEI4X|dQZh+n:D{rQIt8>A}x;corQ7eX", "s": "d70b9725207a30333e76a812199fe427", "oc": "fed7c3afc8c26a621a53ec0f926f2dbc9da9f3a4ceae3245e5b8179325e688638eacf34fbefdaba5cc3c6d02d3e95476d63dce63ad7f48f0"}, {"a": false, "c": "mBbAlA|9c2`{Usnrr:rHR)c%`LjQ)X$p_~llv&x><)hiM_;|*CHc>Z`gla}`>VcnL|BrE0AlBC9S<{tTg}770!tjaq#%1r4KeABqpGDK{5LlOMAWr8)*M{^tn3zA?Dun97IC)D~61}W9#g$2=r!BYJZB>9c2muOsnAra?HjKcv`|`u0;Q?ZSSyw%$>)p4C8~My%w_W3&4|Aq!^#2`nT~Dz=hvYJ`>I4Xqd!P=bnND{ZgIj~KA>!FciB%`eX", "s": "f3b93a8e7218d1e3955b4b87c347c128", "oc": "5bc2a61e482e2a3a155bbc06a919e25b76d4f389c66bc445a5ba30fa5c93e8698d90350ab723dd15c53d9f03649ae4e6a6355e47a71f4bf8"}, {"a": false, "c": "mBbXZH|9cipJOsnrra?HcLcv}C0MPtt?Egl<96vGW#xVpuh", "s": "9b6f29b53674e2ebdbd90d6e45e7e3b8", "oc": "fc61945539b90717a7078edd678740a226b879ee4707f2cfe61e34688b2ce70f85ae26d6ce5cbd20de3eea80d5fd6a8d16403f83baac3f81b26cd826a1e64f27"}, {"a": false, "c": "XBbJkAGJc2`(Asnrra5Hj)cv`XLBDt#&7J92q|_Zbg%4myV4vWS&`-TLDz=JvYJq>IKUqd!<=+nND{r`It~_A&!;ciB%7eL", "s": "14ba02a5f8782a444e7c571ff6fb934f", "oc": "fb6a9c03b2bb46a3b1e8a7cf154cf869fc58f388fde7ad8c44222be9ea6a17f8a7fc380a1c76b6f03d3d4a8f773695318c8874fa9af70c8135cc5802f6f8561e"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (256, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mhdKU?7><2TUi~T2wdGc9!n,$YU)yy!3=RjQU;Now8zY?C_sQBASNU?]oiQu{CB-c){GSFe*1WXg>T)?P+Pf@y+{6J6O(Cz=#2*Xku8rKlS>a~h6gNI)iB_+-|Jot6pFNT;joiQuI`zL<){G*FRapOjBS9vuenVJ^Xi3_LdmGCH)vA>$uh", "s": "8daff4e5c674ede0d4240bd8c52b6ac8", "oc": "ac6acc65373542a9a30aa624ac55bcbd822d43aa7c602031286d87dd29f98307deec133ba07594fad4272f1bb6469b0c2dfa850f0b9264e69194180ad937590a"}, {"a": false, "c": "mBbKU&X?H2ZDi~T2VyN2B%iTe|6S", "s": "3dffd02f4d08f3446102f75f6604e330", "oc": "fb687c6531bc4bb3dbe1d7ef0cc35bd71148514a8326d249662d7d02250de6f6db8cb8538386d214c1e91aeb7b0ac5e56d0b86b394293afd83f9840c495d0bd0"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (257, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLC%Pxw`aHGh4FtD#SKQ+DfYWw&vQbg:DC@cMq2#~#bO3be!Be7*jT1qM4m)z(4a`9*-nQ&h#h>?k~z#r+IY>C}EhBKSMw@{4ZxM>61!?)??%NY3!8E?z6vn8Hk?Nh|ZLobHcY^@#&)35Tu^_fUf|1o)lmsoI;5NP!2k8~rl7e", "s": "a495d6033ff08f5d62819b6f79fcd7e1", "hm": "8065d6444c46aa37c76eda3dbe45df1d"}, {"a": false, "c": "m2bLWIPR.`a~5hoFvDUSK|+DV8)+(L(X9POa*>csIk|hts`VV69zNV%eDmLo#2{_&wv++_w8nBGjg?vcsIkT_}V`O{^a2NV%eDiLo#g-_&w,Kf_w5nB3Ng?vDg-kW|NGA~cGC%K2^T7Z3#J>;@", "s": "07b9d7858421450f975859b5cfa73b27", "oc": "edcd71ac986cf8327559bc9009cf4e0bc7d2f9a9c6ae6246a5baa7833595e9efa9a2fd4dc523a2e5c536b1027bda547da655c46c3def42b8"}, {"a": false, "c": "mBbLC{P|J`a9GhoFvu#%K|+DVCCe8b0C3LA<=X>Ocfk_R8^WMRfse7r$X9D%aU(5Ldk<_9)oYchZ(z0.Ou)cIa$tVM,0RF?Hwa$JtP;_T{?_}=iMh4TpuL", "s": "fa249be5f0e4eae0dd202dd891ea7ac8", "oc": "fcdd9c6533b3421b4e01841d374d9181bd46ae141e6b9357d011187f967bc3b883f9df12b6fae8d30abbd947641aef5f40b72422ed09b30467e2a5cd31560c18"}, {"a": false, "c": "mBbLWIPx)`a~Ch^F-D#-5|+DV6UNb%E^11sVovVVaxVAx-B52A|2{_&w*++_w8jBVhggv9gXkWVNG(P:G|=r2^ThZ3nx>$@", "s": "3d6a307d0d2c83456436370f6ae1f3b4", "oc": "ac2f926033bf31a724e5d7df08cca43ae8d273b2c5948d05d8c900e5e1ab2da0ea64d06938c2f960c8b7522a81b44130f9671d511a661592377080d99da3aa13"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (258, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLc1c{1)W_q|644~B=w#8l{Y9BG7dy_AJM-UtmevJFD-r4m||dIFbJ_38~C>L4~xCAzKZg@%Qg;jo]im*57!NvDVAe%kkPVz)R(@HAt1~%Z`0!z*iE%8Q=~zabT$5z;Ee;#8l*^me1YEm>!82", "s": "2487da013feb345d75248be978291c49", "hm": "c4c7db44b447ab32e005aa31bb40da61"}, {"a": false, "c": "NbbNSrD412<98qR4&h(&;v*K{((jXe9m`qOZ4wX_}?yCeZ-WGc{]&DwuvU}oW2Gy8sI0-1k5wG4EK{UGm2?^4*WxVv,8R8(96dh`{p0B7", "s": "490b9f8820aa53fe867b6818ed0f1677", "oc": "fd47a16fcfc92ab21953bc0972d244e2b7d8f3a9ced2ce4fa5b7d33315d989697ead66a2b9baab48c9d36d017bb45746863bce68ae76a900"}, {"a": false, "c": "mBbLU1c61NW9O|6W4hwA;v|KKLT31L!h2LApi*@*IAxKZWEpoZ+xNIe3ynd-EL)9`O-Rch(&GvyKe5`tat7A@4eeh%C5;rHRnV+0)h-PvUi(R1vh`x%(@YHI^|V0;?OpS+^b65M#IO_>jj}(POCHm^L&kD{SY&5X*yf!_V=puh", "s": "f7ca9995467cdee02b74add80b7acac8", "oc": "ec342c6033bf4b39a3d18e5cf1223e4723035131f63437a90f763695d0a5fafed7a4c0ee768c71817e7940fc711cc796e9fe633ef158591fcfa9e9466c8bbf09"}, {"a": false, "c": "LBbj?1cn()W9q|644h*&;v|K{6B9WiJXM;-$$%3v>3|w6RurcPuR}y8sIC-1tJw6M{K{UG+5?^R*WYzvhxvf-3(;zK{p+Bs", "s": "fdbf0a66dc7813346e7cb7ef3681504b", "oc": "fca59c653e9f4cb81be1886c2a6dba7a7db75718461b217bbffdf5c6816dba7ed2c47b13fb948c05fe922e6f1d7f219254c9c5f73ca97b43164a6969e36cdb60"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (259, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "!BbI%tsqMeKDAAgr5I~oeTZ(}YM9b4|8fbO$z>=FBtHDQ;gI0-uLSoh1g>`JDq`}wbQ{zg)bvNN>s.oti-)ub}ZlcQLgPH{6aW_IRqZ6rI~9$79k+CPetm7K2HK9l~el+IWk|O%6sKy3q^UU^U89pq1dArP%D%>Rmqjo)0(GMse6P_&r40u_gTZa7KZ", "s": "949af6090fe7845df2549c6a7d69c74d", "hm": "20e7dbbc964eabd2c3016b5f9e4e4f16"}, {"a": false, "c": "mBbK%Ks*MemDAlMr>I~k^TZAc8Aj9[O%<$zbm@WN+}39f89A;-u7ln{-obZ|#E1k9z#XpVCCzEQ$@d!z*AN&ia", "s": "d60198bf2a0a50fe8d2c9c16004fecac", "oc": "fb21aecfc81f2aa8fb7d1c94a4562c03b7d8f779c6aec445aaba6793e5f68499ceaff64ab9f38b45f7c66400722a6776a435b863df47aceb"}, {"a": false, "c": "xBjKe)s*MeKDA8sr>I~keTaAcLZs-pqEel-=C-K5DA)f~Kux14FHX@%f8s+p-X7XD(@zpM>on8TP>v!!P87ARm2=o~l(Ggs$6&_Yr4zuovT&_@KZ", "s": "3a9a5094e2d64a03a9ab851b549012d1", "hm": "6b675db808d2c19f8685147898fdd3e7"}, {"a": false, "c": "mQbK%?s*{GK1AAk3>I~keTZtc8$p9%7%q$ur$@mN+n39H89A;-*Fl&A|BbZG#2`EO<#9NVut~keT7AcC@foPMQ;QOtEdX-t6*Y05QE1>6U5|7p>h", "s": "fa6f17053604e1c13b248fd6f4b82afc", "oc": "f2e29cf531bf421ab30ad826727f762b69672cd5b0f0e1ef41d9ea7ff0871249e04592cb9eee019dcaecd106337e272c617de75f71ce2d6202d1bec65249d05a"}, {"a": false, "c": "mBbK?KsB8eKDAAsrHU~k`TZA=6Gz2_2LhCGkre`Y-}!&aJHcYK#2`mVz#.NVu#WmPm%7?{Tz`1{G{>;R.T;Bs!+;:>Kvg%Iy", "s": "249386019f37146d5f1a92653723cc1f", "hm": "e077d6c4a8b1ab32c60d6a37b64ed4f0"}, {"a": false, "c": "mBbK|pyr!:QArXmOIVmBi}nhu96NeUgCXV?28@O-tz#Br$^5<3$FOjA2Ex8q=fog~YM1<}vJ%zy", "s": "37bfa705b07cc06e867c9f16ed0441a7", "oc": "f7c6a71fc81f443d15578c0a39e5210b92db03a6afb7c556a5d66d9315b789607e7bf3ba49331b4515c388d57ba39e52a6ea8e6b6d9e7e1bbf35d84737f1ef53"}, {"a": false, "c": "meYK(tR8@M-tz#B.;^6<3WuOFd2ER8qofKgcYM1<KvJLzy", "s": "f9b931c1b81269df955b54afc33aaa0e", "oc": "1bc97918cc45ca3ab5d3ba03a514b47bb768633965be34c5a5ba67931512396f88bdf64ab9b3a045cb5666027b2a0570a121c665469edd1a4522284f84adb889"}, {"a": false, "c": "mDbSBp)I$Ai]eXmO.VmOi}v|,Bte;>]w0hKSBL-0I##N^BX=#daxCr8$F=ub;0K>lmV1oJcf=rBYM1+k)HoF^0_=jmcR`uMMl(YMU<4v^$Z+O(zQ7|h``]{G{(;RF=4BK!S;7|#vlRzx", "s": "dd0c0f4f4d782b43ae7fb71f6ae0b3f4", "oc": "2c6cdc6548b446a36f05dd3d4e30b2329152f0aab5a2dd01247785ed958274c6cea9a019be8110b29654924b75093de0eb0519706ea2c51077716f81a02024f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (261, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@V^%dN>0W$;g)14JP*cm3*%JiW6ZKZ^G>lNn]CfXBH!W^S*=irJz8jgX(7TpG`HW#RpeN^$TO*nJ`x7KRuY0g5#-2OV?F{_F_N$o9CWCgDft!FgydvIlcG7?jFiMA41$EjF!RucU|IEcG?kD(puh", "s": "939b36040fe6745de21da8d377e9c745", "hm": "bd55dbe4a8467b92c3da6fcd2e4eda16"}, {"a": false, "c": "mBbx@V^tdN?0W$Q~)1SJP*cmq8)V,s3I)>D1ms{k=Kxcv$GK=w<<9}3K>Wwi#2kfU}vPobOazsn=oJIS)sm(VzEQ`^zt@h?^T=ogRRp~J", "s": "899588b42cc14032631caa1ce30ee487", "oc": "fbc7a15fc71f2a329f712c06a91624fbb768fca95eebc44812fa6793159909798e0dd698b9b3ab6135a26f077b2a547696ab066cad9eda1b"}, {"a": false, "c": "mBo&9K^%:!?#W$_g)1-Jl*WmqK};<|K5qT&!~o=tIrDg2#]TV6Q3^ST?KQ(Gb$49qdKJl)IM{5zYVEjR-TUOW-N*19aKGDhNSrAja6iZ`)>MCB:1zEj6!A<1h!u%%}I,eY*S|Lhy=uj$U|IEwG+k8(Yuh", "s": "3b9afd5601362d00a42e851f543263d1", "hm": "77b758bd7eddbb7686751ef0d1f8abe7"}, {"a": false, "c": "-wbL@V^J&N?0W{D^0~3k=Kwcv$GKi^Xj973q#%b|qoX{uNOP2TSf9Sd$>`69q4M|6rYSxR^!82|EB{lSf`AnrzkT7a5wo;]#nak2jlNJ0F~8.an*nbIRR^HJ", "s": "b34ac00547bcc3446e236bf56661b344", "oc": "cc6966c5ec8bf1f82e14b9344c0bc90f4e56295e7505aab0bbf9ea92e6c41875d77642437a045e950631b1d00858b9bee56e386bc903a695f5f012a8daaafe07"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (262, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBhKe;2~_|&hwm7#EjU&=nqH4YPl!=|&nB7f|v]iA$[Xx3CMCn3~nCD!m2n|4sGD7A$8znvBKr&Z];2AYBreUS~D,5X{8%Fby^??Z>ldCrxAE3Y", "s": "46a7d6130304c48d5214906374248795", "hm": "8967dc64a7aeae02b30560867e42df16"}, {"a": false, "c": "_BbKA;2Y_<~h787#WXU&=nqH48JV_IyFE9EqTx^Bh>*LbZ3eCiiziIG816-J#_^j0JCbU.o11UzQIU}FlR_z-Y6h0swP%pf0>>iH^dF$*", "s": "6c7b97d534e33bfe83ece896dd8fc6db", "oc": "9bc2a16fc81f3a2be57eb906411f24dbb4b8faa9c80dc425aaba6793356d599284af760ab931a47bc53666027f8655fab635ce5cae9e4bc0"}, {"a": false, "c": "mBbKA;2~_|oh785fWXU&=nqH>q-IbnK#+SLu%7r@g}kI#>p`Y@Yq&Ueb;ULaZhOY{y}@>=aPs2pCm)9udgf8TT{FL@OO2s2$@IP55Gd;)=aR3)A1#lfCXxAE3Y", "s": "9a9a645fed38cd0fa4bddd1b549bcfd3", "hm": "00d76d3d9121b765c675a61add2d2be7"}, {"a": false, "c": "h7bKA}9~7|&hr_W$WX{&=nqH98zV_I^FE9w+ox^m%>*L$Z3Umi7d]IG8f6-J#2^>OgC^U%oK#UzAfUtFcd_z-w6h0asf%yfAd|iH^dF$W", "s": "73b969b1783c7d0f98eb6bcb83318a0b", "oc": "1bc2de1bc12f2a021e91b936b9df24db17d820a3e6a77485a5ba579c1f99896887ad0641a29323668d67673a7b2f54768635c07ca49371c8"}, {"a": false, "c": "m{bNA;R~_*&0787#AXU&=nqHWC6`I)f{7H0_iUN!s1Np|PI^%.Iru}|Lo)v>-VFTEHMX_h`5(jb7s,6ox;;}pQBYANT~h8QP7ID@Af5KFfe9dFeL_i-5Th0ssP%$=Ad|A@^dF$5", "s": "3d6a004f45c827486e27771f6681b3b4", "oc": "f92a006633eb44e37aefd7cefcfe3657eb4c8c4dd392e1d4024fa25dbbf41752467d1d63f428f65a718e62407dc033d7758d987a35443ae89ed11e2ac14f0248"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (263, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "^?^J&VE?+WNn~TN~HgAB!CMH#Y%j70Cz0B24U3#W#,#K3wo<@#S7}S0Ce|h{!!At-Ep(5LC-8ZMATrn?7ACPe(u>=Y?2X*e1UcJ>#2{o5(Eq~PZP7}G2{SL7o*)sN#&!Jp@#_Qy4Ufm<_XYuXTFv=J<<-A@|_=DIfMUxk+XJTz|H9gB(M{,cH}S%KJbks*F*`ics~{stkH^qu@c8,", "s": "ea9a1da601369dc0297e894be29062d2", "hm": "aa6f5c26c0d2097e8673463a388ddba0"}, {"a": false, "c": "mBbJ&V+=)W.uWTGazgCY!CMu8vigM2|HayoGQIM&v5n<6^VR7*S2kz>15JM`#2{On(EqIQZz7^Gu%SL7A*lCNcY!)pxT_hU4Ufm2Wp|*!", "s": "a6b9378478186140955b63bbc229aa55", "oc": "fbb7219ac53c2a2b25635c3dafecb409b7d8f3a9c7aec475a5756a2315f989d9beadf64bb9a5ab45c589632e0522da566635ee3daf9e1dcb"}, {"a": false, "c": "mhbs&V+<+WNnIdEsKWf9Z+duZbn}-awL`~a3BlmR*(]<]a__9o%54b>VT{Py=eW1V", "s": "9497d6b10f97645e721451797b29c765", "hm": "6d277b43a83894f3c30fc23ccee4dab1"}, {"a": false, "c": "mBbM9-awLU6a80>g^qT0K#H?)OtYyuY+DW?1Z0HYEjnjD$(d5XNQ4nZH3R?^lEqzQC", "s": "d90b97972b5d30fe362dae16ed0a76a7", "oc": "38b7a71fedc13a32c513b406a91ff40bb088f7a926a31448a512659315998a158eddf647b943db44c5306dd273245075a633ce9c00d640f1"}, {"a": false, "c": "mNbMBMaw{UTarLQ)TS5B)j8R|XBY{p4aOSYaGzix_KRP(_VYGm2@6u=w.F_wt:87A|boP=&$H^B;c;>9%oy)S{Bpcg8X1WmENxJ>3B;t#*(|zBarjrv%%N({{uuP.-eW1V", "s": "7a9a5d510133929da92e321b540038df", "hm": "64b7500c72b2e75a88789618d62bdb6b"}, {"a": false, "c": "mBbd9-awLU}a^?+zn?~T$|Cw=8@4;e5mWYo^7@C*zCw#yw69id@80AgNqT0{#3w7xDY*3e+D-?otqVY_;n;Dq(|FSNQ4vpB(R?,aEB$QC", "s": "53e934410814650f90ca6b6b1b374f2d", "oc": "2bc7a11fa81f595a95d3b975acb728e1cddabca9cfae0435b0bae793159c8569de5df68ab8ba4be5c539df029b2a54c67765fe388e9581c8"}, {"a": false, "c": "+BbM9-=;LU6gR.Hq9$x^$NQI=jL3+zn?t9u2u#>s6rra?HjBcvQ8v&arNK}SSCwD$>)p?C8xMyYw6W3&]h7I!$#2Hc1^kWlk(qD>cnLbVrE07YB{9SR?Z]g})>_!tjAq{%1D4K6AOU$(DK&UL`OMmWrr)*C{J-nqPAcDYnB7n9EDE61}5C4g$Z=r!g)hoLnk", "s": "3a2a78390136d360e9ac8cccc7419cda", "hm": "aa3e5f9668cc177f8371761008bd9be4"}, {"a": false, "c": "mB-JZJP9c2`{}s[rrC?Vj)cv`8vu0,X&}Sayw%r>)D|C8#My;)6W3&Mn|#2`-CLDziBvYJq>I!lqdlZ=Pn!D@rQIt.GAI!;>iB%7eX", "s": "e3b9d7d17818610f954dabbba9e87c22", "oc": "6bc799cfcb6291e295a39c96d96fb40db8d8fea9c1aec40584ba98931550c0028e0d4f8ab9b95fd5383e69907b26e4d6862511a5ad9f034d"}, {"a": false, "c": "bq|JZ6|9v2`{csn:ra?HT)|P`y0>PttJe{Ti8%ijveCYO?C{fEr;n^OiD%[{hTyWAPH~yB<6vGWMxVW>h", "s": "f9819575304d125c23242ed7cdeaca88", "oc": "4ceae265e3be4db90003861d507f87e282b879c94f072cc0e6a631128a1de85625a845d6c21b5d407bceef46b2f5ad756920efc5b586f9fcd03f8781a22284d7"}, {"a": false, "c": "mBN}ZAQ962YJUsnrreLxj)]v`mLBDt]>7UHiL|V|}gB~lyV.vB#2:KTLDz=MvYJq>I4Xq#!Z=(nND{rQXt~GA&(;ciBY_eX", "s": "7d1a600f4201ed443e7cb71f6989b35d", "oc": "fc1a9c65d3b057331b103ca66d07fc55f5522c4aedb7a88e947218ebaa2a66f80ae8fe911c54b5995ab3393f7bdb953cd08c78befafebc80da3cf7028cfae304"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (266, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB(KU`X2H2TUi~T2J7ww4lH", "s": "9a93d601c057a488821b9c582729cd4f", "hm": "8067d6e0b845ab32c30566356e4edfb2"}, {"a": false, "c": "mBbKUXL&H2TUi~W2;cW;r^)ig>Tj,P+I;@yWwA)=8kfzp#u!Xku8rKlyL<~W6xNI)@B_P`Tv8b$&_F`G#=sH9s1s;TgMH+P;@WoC6)Q8k;zp#2_Cvu:rZl4La~VoU&X2H2GU.~T(fG1_?vA>puh", "s": "f26f5675a3d4e7e3bb2e4dae35eaca39", "oc": "ec649cd533d347bfa30f3ecc93e2373d182d9e8a5d6031716869874d9d0933082eac4d47b97592ed64b7249b7f469a0c9b8e850f019d62562f3f1834d3785538"}, {"a": false, "c": "mB,pU&Xo#2TUi~T2Vpk2Xsyd2}%cTeN6S", "s": "5dba054f41705584e2ecb00f6681bd44", "oc": "204a806534b308a3bae1d7e60cc257e7a24351ac7382de1a16ba4c04310de4add3fc61c3b38dd1d43597320c75aa099539db2fb9e02544114a608e7c42fae6d4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (267, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLWIPx06G~GhoFQD#S#|+DVtWwovQRgCtCDp4_=ej#b*}b)_;C>Wjl>qMGz)z>Xa`F*-;nShGh>?WnvEx&uQ4C}7}BKS}C@exthkvXyx`^``-+X@Y9o^>xMI61!?)?[}K;J9{_Qh$>j$2i;3!dskzc`58ed?,TAZrTqHcY^@#3QChku^_8!)|hoSlmzGI;>NP!5k^~r-3z", "s": "9493060162328455531b226977290715", "hm": "fb67dae7e64ddb321d05673e3f9e1f16"}, {"a": false, "c": "mBbLWI@x0=a#GhogVD#SK|+DV8Rc(LwXCTOZhQcs2kTwDn`VV6a}N&!eD]Lo#2S(&wl++_B8IB3qgkcrCHK}^T7ZFnx>$8", "s": "590739b8857d80f1857c81f27d0fe4a8", "oc": "fbc7e19f48ef263015c3fc7aa91a44dbb718f56466aecd1aa9e2a193d5239e0387bd004fb953abccd5d62d027b9a54062632266c6dcf41cb"}, {"a": false, "c": "QebiWI100`]~,hoF+D#{K|+DVLVlEEd!}1mR5-+>Q)|4S|1OhPT`FdU*s|OAx*=}bI~t~ANAy*${IW-pHFG?-%=DmLo#2S_&wlw+_w^nB|hgVvng;kWQNG(kcGCHK2^T7Z3nx>$0", "s": "f33ee78778f6110ff559e43b4347d322", "oc": "9bc7a18ec61324827155db0859ef56db77d8f5a9cdaec33ca5bafe93859c86930eedfe4abc4eab42ec3dbd727622367c36356eec5f6f4c0b"}, {"a": false, "c": "m:bLWIPx0Ra~G4oF:D#SK|+DV`Ce8y*y3LA0=X>Ocfe4R8^W%R)sewr$X@2%sx(5Ld)Qg9Co{c5ZSSL=duMHxaw=VMPCAFqHN8kJO%5_Tqb_}=8~;4+wmh", "s": "f2669d654ec4f270d32c2ad805d4ccce", "oc": "0c7a3c693e93421183818e1d52dd1185b382c42f04626dc4d0481d7b99abe3c83359df7eb8ea15630abbbe87a829e55fd0b92a89e247b1144f8c24c33eb9c5e8"}, {"a": false, "c": "mBbL5IPxi=t~GhoFtQ#SK|;DV|rqb%E811o$ovsSsxVFcqBCqX#2{_&wl++@w8nG3hG?vng-kWQCG(kcGC6K2^TSZ3nx>$@", "s": "3da300445d9827d42e72b71b5a81d344", "oc": "cc6e976433f351afb721d7ab08bc248a189503e255e3872d9379e5e1ecabf7128864810bf6c93f6d68c2e6c071ddaa31f80dd20d4a5af1916de9a8d4c32343f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (268, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "@%Qg;0o1dcB=pVNvDfAeB%3PNh4)iUgGZ5_IJTKdge%|Tm!B350kkPVz)R1@Hj:JP#rF5b0<045|>AzMo%!_tCi*RE%RQ{~z-k^$2e;E$Vzv_*^me1YEm>!=:", "s": "94fcc63559e7a4cab2142b68777ff285", "hm": "b6336b49a848ab71c78c7a39ee95da7f"}, {"a": false, "c": "}kbLUic4d)v9Wc644h(&;faK{8(,Xe~m`5vZ<)uCiE{%Q,~zakl$50;E$V(8`?^me1YEc>!82", "s": "3a9a505bc25dddfcad2885ee5490d8d1", "hm": "fa375d1d7ad2b77fb595d33812fdaae7"}, {"a": false, "c": "mAbLK1cJN)WxjpWE4hi&;v|=78Y1M(9mz5OZ4ZXL?,yheX+xGqH8&Dw}vUEG#2}jTs=C-1kJwGMgK{{Gm*9.WWTzz.h8>f(9@;kg{p+o>", "s": "43bdaaf17a14610835336ce793c3a365", "oc": "9b4851df3e130a271578e0e6a91ac40b0dd6fc84e3aec44fa6ea5f931bc9bf69aea2fffabcd9a14586366d01fb6a5b76c6256bfcb4799976"}, {"a": false, "c": "m*bLU1c4=-Wtq|644[(&Mv|^{B1tAY7D@^_eh%C5;rHRnVHK)Y{PvUiI|t)h*xo(@_SI{J+0^?NpV+9DqhM#IO|NLjq(PdLZ:Ko&0DG=Y&?{*ym3_!Kpuh", "s": "fa6f85ee3d7792e0da24f4480feacaf8", "oc": "f73ef56535db42196304e51cd5da7cf4230751b1d264447b6659b775d7ae24ae3e2e90a476fcd28ebc76ffe27cc5c79e3efd1339d1ac581fe6a9e97672bebd79"}, {"a": false, "c": "0BmDUlc41)r9q|644h(&Xv0KS6BUWiJXM]%5b^!kWizvh8xh(N(;kP{p-B>", "s": "5dba824fdd7816446491b71f6681b344", "oc": "f89a9c6d53275ba31bf1d83c495c5a2ccdb559c8c42e5a9fb5ad3db8a73b3aca4f3d7cf0f49dcc0c54982e0fad1f18f2855972f93ca8755014a2f4c13cf06869"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (269, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": ">CbK%Ks*M:}DA2sr>I~MeAZAcYMgR4$8fb~]DB=F@t{DFHg{0-uMSoE1vXkJPkW}3LQ{zT)b]N2)svoVF-)ubV,jcHL3P}q6aW_Im!>t*L5u~2oi{Q>ksrFQ9$7P%F%>Rmq|o8L([g=e6t_Yr4zueAT&p@>Z", "s": "97736d210d0d8e8d5213db6c37a987b5", "hm": "80f1df44a8b82b39c33efa7cbe4adf56"}, {"a": false, "c": "bBbYKDAAsr>IikedZA)[Zs4pFZ$l0aC-c@D_)ftKu%[4tHX*hfmC+p-coRDh`zqM,5n)TdKv!5a%!P+7fP%_%MRm[7o~0(c_se6t_Yr4zuoAT&_@rZ", "s": "aa94fd56033f6d00a92884b7544d237c", "hm": "65b75f0a7b07b74f8c0e112ad8fd9be7"}, {"a": false, "c": "mfbK%K}*jeKDAAsrkr~keTZAc8^u9%Z%q$urm@mNtnj9d89A;-u7l&AIBbZG#`6,hz#$dCf<I~keTZAckGfIP%E;QFt0FX8SyMqY)3lx;8sApEhPTj2s0mDrbO?=HAWOC`JP&=eIQ4BkOjEY%T|XS6ri#3ptTSY05od)=615&rpuh", "s": "758c994131f8ef103b242628556acac8", "oc": "762a88f633b3b219acebd8da72627cdb1960f7d4b677e1ef45d6e19ff0889c7e2012966b971e039edea6d94e39fe27446a583251677e8858bfeabe81501e8f35"}, {"a": false, "c": "mBb-%)!?M&KDyA|r>IF}eTZAe6Gz~Y2uRC1k~f`Dg5{w!GbcVK#2`Olz#$NKuxZuVP|yW@.mr7?!Te&>q%X7r9e>f!e%>;N%aV3;H2}ykH,^>azaF#&$uXKw-J_UuhCC]JXxY@y@ek=hUN0*KZ9YM1WJ[J%jy", "s": "a49306110ff734535724904954a5cd0b", "hm": "70d7dbb4e4427ba4c6032f5dbe4edf16"}, {"a": false, "c": "mubK(pyn{AQAq]mOcV64i}yhu96cl`h9X^?28$M,OzOBrz<6On7FOj#zEs8q7fogcOM1<<~{U:NO(fr2YhC`o{GL(ynFCbBK!s;|!dvJ.zy", "s": "d9029185d07d3830847ca536ed41e3a7", "oc": "fbc7251ac80fdaab9551b306a22f9e0ab318fd9ac8def445456e67961c2cd929eead154abcd9ab85c5366532db255788a63ba76ca597da1a1532de2f87aa2ff9"}, {"a": false, "c": "^BbK(pyz$rQA6XAOIVmCi}uhuLJ)=X(vYtTn15T2mK9Gf{W>-@u5h0tmSiZTtZ|`BA3$PgGzW+8T=pv<9{?D^2co}A!_YDzI*_|x%^1GO{NupHWX#:Gy!p2}zG!=L+nVpj", "s": "3499524b0136cdf0e8de187b5490d2a6", "hm": "bab558ba4ed2bc2f7215e61a087d0b5c"}, {"a": false, "c": "]B8K(skr$AQACXmKI~sOd}Ihu96ceUg9XV?28@MMt@#Br;^6<3WF}kd$ER8q=fogcYX17Yh}`odG{(;mF-bBK!l;7>dvJ%z}", "s": "f3fd67819c1c670f665ba7bb1337aa2b", "oc": "56c783e6c8cf6a221558fe0e491224005a47761ac6aece43adba279354998b14ceda164abc533b05cb366df6773554c37637ce0ccd7eb40be541dc0fecae6ff9"}, {"a": false, "c": "mBbm(Xy,$AQACXmZIVaSi}IhurteE>O&0vKyBL-0Iq)N_GpA;daWCrO$X*BC)0b=lmVvm}2f=r+YM1`~z^RZ+O(zr@Yh1`urG{(~R)=bBK!+;7>KvJ6zy", "s": "ff7f98163da4d2e0d01c0dc4e5eac233", "oc": "fd6a7c4533a342c9ae5097dbd5b7ad821816027c53fb931bcbb8091a884789c67a3a5d75ab473e3e28b9c114f2a213b5856dd0890d9f99eb3ad8c06349159731"}, {"a": false, "c": "mBbK(myr$AQAfXygIGm4i}Ihu6n`j}FP8BO>kOHT>-L_=jmcMxif!l(YM-<JKpjgXF7Bo^(Sb_Rper^$zOT^Jhx7KmuY0gW#{2OV?F=Z+iNIo9CWCgDO+!Fg2d-ItcW7=jqiM64l$Er@!A<1h!>%io^0shk=zwav$LK=wXj97SJt%Qik2^fl0v1o_Oky6!=oJ(S)K5(V{D^0s{k|6wrV+GK=vXj~225+%}i#2^f*gv1o_}aiD!coJ~4J7}(VeEQP{Rtyh?^@=oIRRO1-JP*cOqB0r4+!yLU|qezJH{XG2>Sf9UaM{c650mM|6nY5xR]!82|E5sk$fh-5}!k|7o5a<}H#nakajl>Y0F~]xPlC<%eV-}?HZ86dK=1LlTmD4+dYpqE*t$Neynq|Ld]hQ@WgNE0P94mHnj5Y>=j6nB79>vG<}$OXo3C)0n3~nt&!m2nF>lnHrxAE3Y", "s": "9893bb070fe784f782149bc977cac746", "hm": "54c6df4758282bb2f3c8aa42b84e2f86"}, {"a": false, "c": "mBbKAT2~O|&hj87#W;U&pnIH48Aw_I^FE9E$txr+hf*L$Z(UaiidiI78f6-~#Rq>QgCQy%sW#.zQ4,>FF+e}-b6J0}sP%yfAd|iH7d|$l", "s": "390b97b5297d3dfe8672a0198805e4a7", "oc": "3b57e11fc81b2b3c0553ce1fa91f440d17d873f9a9aed049ae4b6993cad909ffbec886455964a44505166102ab6c7d7da605b86cfd9920ca"}, {"a": false, "c": "{>+KT;2o_|&h7j7xWXU&=nqY4LK>%y)#.SZ@%L}@cMkIs8Jt-6L@OO2~2$4fWOFLd;)=aA3)81#4XCfmE5R8de-4qZ}xLQgnq2~0{Oy?wZ>8fCr]AS3+", "s": "3a92f8500136ed00b92c899b5d23d0d1", "hm": "6dbf2d2d38b8b7748675d119d83d5b6c"}, {"a": false, "c": "mByKA;2~_|&hH82L)XU&hnq{i8zV_I^FE9Y$Ty^Bh>*L$Z3UafiHiIG8f$-J`2~>Ogx^#%oK#U|Q4U>FeL_zJY6h0ssPYyiAdRiH^d6$W", "s": "04ba1a4a7b7821ef955e604bd373ae2b", "oc": "fbc7519dc81f0a3215592ce4296f67acaad1f3a9c6cee4807eda6791c50f89893d5dfa4779b3c947c436ae027b295d729e36be6cada3dbca"}, {"a": false, "c": "8pbKA;2H_rrh787#WXU&=SqL4C(`I)f|700_BUN!sI%p|P(^[)I3<@>Jo9l>D^FTEQg#_>`5(0}7si7o+q;epQB{A>T{<86PdI7@mf5vFfe@d{14Y)hTuh", "s": "f3cb99853645ebe0dfc48a570a5cc6c8", "oc": "fcca06af33ba4319f0018e1c9529330cee0748bde78e41549a9530cd6dc7d85073bfe40342b2d1acaa79de8f05fc6cc9eac90ef55f082937b5a4e63583a2f87c"}, {"a": false, "c": "mBb|o;2~T@&h787#%>I&=nqH46KPWx-Jaa=|Jqzg_k3nIG(ByL*_^XOgC^U%oK#UzQ4Ug%ep#zZYs^WsVP%yf8dtMH^dF$W", "s": "908c0114bd7fb3a19c2fb71f6681b494", "oc": "fc669caa331341d43b45176ebbf13857e7dc9a47cdebd0b4077d66feebfe1cf695b7ef1ff421f652048092c3e855eb877f8de37a424a57180ed612fe5e4f084b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (273, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m{(}fV$<+:PnWTcUHms>!CMH#Ysj70>z_B2w@3#Z#by@~G13V~?t(]ECe0-V[9AtZTpt5C<-8ZJAT.n?7A$xO({>=$l2X*e_PcJ`#f{O(*Qq~PZP7^GU{SLRX*)ZN#YF;pxZ|uu4UAmrWp|6!", "s": "290bce1199dd30f4867ca8b1897fe02c", "oc": "fbc77d14121f2a37165e4c0aa31d04ebb7c966a1bd6ec425b5fe63c43116896f8e58f463b3b3eb25c4364dfa7b1d565ed6329e6ead77d2c6"}, {"a": false, "c": "m`bJ&V+z,J<<09@x_=DyfRUxdAg}Tz>O9gP(M{8wH!SgKJ3Ks$te`ecs~!st=H^quAm8!", "s": "6a076bf6a134ad20a05c7f135695d671", "hm": "5fb75d9d78a2b77f85251b3a2dfddae7"}, {"a": false, "c": "rBbJ&V+ayomQ|[Tv|nD6^Uo7QSZBz>iVc:`#2{OnEEq~P{}v1ku{HL}}R)}NNY!J*Wpuh", "s": "166f967aca74e0c6752d26c855eab5c8", "oc": "3c6f9ca573b34219aca0d81a7873972e26dca2fefb8c69affcf687c7638cf804b3b6c1f97fd4b93c02a28e452b893bd1b9e4cf43bb22f31b6d2c922e9c0a7c68"}, {"a": false, "c": "mB,JtV+f+WT}WxGLHg#Y!CMH#6Tnl$YvyB3;-Xxc>n{T2h)32I#$UAn(.q~PZP0IGugSL7(*}sNm*!JpxT_uul3fmrfp|*M", "s": "b792c047717124443dc2176f6bb1b344", "oc": "7cda916579b24ca3bde150eefc54d21a368ea120165bb67f3c5c7f6662a195738ad4a0bcbfd95fa277069e47cd2a03ddadf270145507dfa038ab39aab2d23170"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (274, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mdbb9Taw`N6as?J*k?~|ac=w=YJ}t?Tdt+!ld1+9*wg*cp1q]YcY2dKI4@3M2=mTDWkJUx`7E!i&ZByc}vNFcE0;]{u&vxP?sI_6?EDbv)(v?2sd3=NqW3:e3xPBFa?0SL%|3u#$E)~~?5de44;i4gK=>2oXlM,>zpcCZX1vmC0xA>3(lU#*(|H)FQj9v%5T($|?MP@-eR11", "s": "7498d9270fe784f341149f697790cd05", "hm": "c0d8db4fa848ab12c30d6b2d5e0edb1c"}, {"a": false, "c": "^Bb-9-i~L~6^=?+Eh27|a;Cw=k<4xV5LcYoT7Lv*yw2*rd,80A5N%T0K#327ltY*Wp+sW^Qt0VYEjnjDrAd5XSQ4%DH3R?2aET0QC", "s": "d9179799b97d30be8faca8100d0ae7a7", "oc": "fbc7a812c8a1d83725235cbb100cf40bb525539c84a95446a5baf79315e9896a8ead5e9ab9d3614515e66508bb28adb63635146bad9f41f8"}, {"a": false, "c": "mBuM9Nar,U6aw7QJTS5vPj8D|QNY+m{aeSYRGhixB&lX2>tYGm-@6u=+OF#ktB(QA|b6PI&$t#P;cY>9aoy+Ss;pcg_XfWuCNxJ>;Olt:*(|9BH>j9>.5>($VTbP&-[W1V", "s": "3a94945601201aa05926851844f1d261", "hm": "aae05dba6826b7e786451671c6f8cae6"}, {"a": false, "c": "mebY9lawLU6`Y,jn|Dr(R5XNQ4^pH3R{^a*q$QC", "s": "3307328074586101755bcb2d2437931b", "oc": "f0cf1a19ccdf2a32f5251c06a97f2403b7d8a3abc0aec442a8ba6f9315dd806989ba764ab4434bcec5796d02e10ecf73fa30ce39a99faef8"}, {"a": false, "c": "mBbMzZawLU6fM#Q&Tx(7}L*2rMlxM7s|5mJKx)9<)y8xvA_@}Ml;?Hq~$d^+N~h=pa3Kt4RJt>Lg2X3qL+}qd_990KN<>n}uSTbz)(hKbt+xpBx6a;Y2+AsxS3OU}4Z~cKwn`J-AjBj<+j{1prz<>jt<01cd^h(oa>pBD=0k9``|@8iFnhAW60)yM~*BnozAcDun973mVDCR(}WC4g$Z){!U$Lo1Gk", "s": "64458ce90072845dd4179b69d209ca4d", "hm": "8367dbb9a94fab32c30569308830cf16"}, {"a": false, "c": "-aO1ZA|9c2`{Osnrra8H}e#v`8vu07&U}DS`w%$!up=C8fMy;p6,3&~h>|!|#2{-TLDz=#ieJqNI-Uqd!Z=onND=rQIt~KA&!;ci(%eeZ", "s": "ed0bb7b5202d3bf10eaca8100d7f1cf7", "oc": "1bc6a11fc81cea3d1583bcd6a21f242b07d8f5a948feb2457522d393419989608e16ee4a17b6ab28c5e610127bfa5716a616c2c0ad9f41f9"}, {"a": false, "c": "mBbJ>A|9cS;eOsnr-QSHj)kv`L~Q)X$Q_~clgbx~<)FiIe5|>>Hc1ZrglkZ`D>007Y`C9Sj?ZTg}77_!>jaq#%Yr4X6AOUpGDVT5L`OMTWrE)}]{JN>bzf!DunE7I9)DC61}WC4g$ZFhb#2,-T&Dz=>vYJs(I*X:d`Z=}nND{rQIt~Qh&!;ciB*leS", "s": "f3b9c031c8b8010aa55bebbb7b37aa2b", "oc": "f237f22fc8c02d301c53b856a51d1c33a928f62fc67ecb4552ba67901591f7748eada04ab9ba4b63d5369d02739be476ac35c76c081a4d85"}, {"a": false, "c": "pBbJX>|9c2G{OsnrradHjicv`yUN6ttDeg(iI%ijveCAAnFCQOY.nXOPU%<{y9yWAP^LI1VzCaLd`ouxy{tM1||96vrWMxVpuA", "s": "f0c996723674e2eadb240d7115ea5cc8", "oc": "fc649c603de362995e0ef31d567344b212b875c0490756eee5a03668647d9ad689b805d6c55fd520db3ee4a567fd2380ebb6620b6a8c3fc45e39f82171528337"}, {"a": false, "c": "Do(JZAD9N2w{Osfqra?H})cv`6mKDt#>]UH2q|VZjg%~l(V4{B#2`-qLDz=hYYJqtI_XqY!Zs+nSD{rQIt~KA,!;c|B%7eX", "s": "34e600429d7ad3c4acad471f018fb8a2", "oc": "316f996572e14163bae1d7e50783b855c8c8869aed37a83ee4532034ef2c1e48770461eaa076b71b1da31969f7d7ca3d879a7dce2aae7c8195ccb5a0e9f37604"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (276, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "zHbKU&|2}uTUi}2VptNUK{PleB1;.?6&,_FsF=IYKB}ehnePQ$#p)NA5A_uQjc8Bwxo4Bh(c+B529PQ^XdYeb?i)VNq?%l}V(lA3Lzu?sQnAS}TJ;,iQuI?}Lca{G*FR;1Wm|^)vg>TjwPNP;ey+(}eE8-Czp#2_Sk=8rKl4Na3V6xN})0:_S`Tn8b$N{I`Gf=nH95&~%H2TUi~T6<98c9(n|$8-g*K>;F:;<^+-g>TmwPoP;Cy+:65=8kYzp#<_BpuYrKe4L?Mt6hN#)iB__puh", "s": "fa6f947503efe204dbf423fbfae1aa54", "oc": "fc6c8c953fa84412af01856f7cf9a2b71829ff8b6e605038276187dd98008305de4c1ebbb87b94e3d4b0295b6d2a96ec8bb6827b0b1d6fe99f99c101230154fa"}, {"a": false, "c": "mB-KU&r2H2TU.~%DF[8c9!nCr6pN^UbBy-!3MR;&;^Bco7`JNY#2_iku8rKl4%g>V-xLB)i!Z+<-$oPpk%XPy([>^jTeP*S", "s": "3b3600444d7afd48277cb77d6086b021", "oc": "fc2a956510b34ab36be1d79408c25aee104381b679af5f47a6ed70063a0874ee9b2d6b83833bd9043ae1956ca5dac9193b2b11b5e42534ffeaf08f7e74aaebd1"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (277, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m{[LW+P00`a~FhowvD#S}dWDVY!0nzE`PIQ}C}9_BpSf_@yjZN{82kG~rl7`", "s": "949fc601c2eca35dca179ba97729d741", "hm": "80c7b3540848fb18b1056a3b4047bd1f"}, {"a": false, "c": "0BbeuIPx0`a~Gh_yQD#SK|+DVL)cUL(p1$OZ->jsI}ThDI`VV$a:~V%eD;Lo#2{_&wl++H$@", "s": "699894b560bd38ee80fff566e700e4a2", "oc": "f7f7a4eec84f5832155e8c06a97fd30be778f4a9c6a6c745a5ba9791159960695e4d494abac3a585f5fdaf0e9bfa0496a835ce6ecd9f421b"}, {"a": false, "c": "mBLLWnzxx`a~Gh{FvD#Sx|+DV^VlE3m[}>mw*-+3Q)|ylN2ODDv`=nz}HhucoQ=}bFyt(AAAX*$QJWGp+Fri-2HP|n=gI1siH{^*O7V;BGYh0{A~_#DHcY[@#&Q*$Tu^_7Of|hoyl4zGIw5NP.2kG@|l7z", "s": "3c9a2d568a307f00a924e5e97be04251", "hm": "6a775e0dada2b3788675e6ead82d7bc7"}, {"a": false, "c": "VBbLn}Px0`a~G7op+D#SK|+DVWac(L(X9;nu->+s>}ThDI`VV6a}BV%e?mL}#2{_&wl++_w8BA3hg-v9gNkWQdG(k,GC2K2^TxZ3n7>$@", "s": "f3b9a931c114620f0d5d6b03f307fa29", "oc": "f7c4a01fc61f3a324650060ea71f248b97d323a028ae544845bb47a2b5a9346988aff64ab3532240c8656dc23b5ad27da2f5ca6aac9249bb"}, {"a": false, "c": "mvbLVIPx0`a~|hqFvr#SKLzDVtC-8RpC3LA0=X>9cfeq[*^WMRfs5w2Ss@DNa7(5LdUQQ9To]chtVMPxAF*HN8kJO|c_Tq?_`=|Md4wauh", "s": "92e909167674e2e0740425d8060acac4", "oc": "10ca9c1533bc1209860a9810946d448bb9475e24be620127d0176775919bc3cd33dfd312bcfa18f3aabdb34714ba555fe1b42482524cb854e70312f13e36c5f4"}, {"a": false, "c": "mBbLhIPw0`,~Q&oVvD#SK|+]V6.Nb%E^1Vo?oAsVsMXK5uBEqS5A8_&8l++_Y8nB3hg|+9g-kyQNG(kcGCHy2^TCZfnx>$@", "s": "2df2000fd6f32d4d5e7cb12f5b81b944", "oc": "ec6c9c6e36b240a3b5e3d7cf88382f479801831b95b3d421380c10d5d190f510b864170bf8b3396388cae2ea9a9b0ffbcd576d99dab02f23757025bd2a03a11e"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (278, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m{cL&1c$1)W9q|644h(Q;v|&{Y9^G7d^DA`M-UtmtvJFD-0p$|!bIFb4s38s6>L4JO||z]qg;J~zUCtw&~>d%46;Ni1i6Y{>xxLJ`e@}BBHyh07fUgx(>_g{TLdje%|T#3t350kkEVzmRQUHjcJHjrL5|0{fMQ%B}tCwliH<8Q=Piakk$5_;G$Vz8_*^mE@YEl:|R6", "s": "9b9fb8b40bea84bd4e2deb097789b54a", "hm": "9b67d32ba848a332937c2aa0337ea818"}, {"a": false, "c": ",BbJU1cDs)W9qJ644hG&;v|K{b79Xe9m`5Oo4D~L?iyUe*;WG-@8&c}uvUEG#fJ~GMj-DU*m)?^5[Wizvh8xf(@H;k`{pLB>", "s": "a2a49ed5b0fda6fecb7ca81bec2f14a4", "oc": "fbcca11fcb1f2ad21c921b040b572a0bf738f35a76a5c44da54a679338e9b93e79adf448b9b3a04cc536a84874275e2ba6957e6c1e7789e6"}, {"a": false, "c": "mBtoUNc41)7Gq|S44h(N;v|K{LT<1A!V2v*pi*@*Il4{24EU&PvSNIeN9`sEnc<1;`<{tm3Q%w*b}%qnGw`dii9fR$%6M)m|XNzcy^bAfMQ%t8t~z*iQtBQ=~zaoT$5v;E$hz@_y^me1YEP>!82", "s": "6298572241760d000610851b4335d261", "hm": "1a68220528d2e07d0675261ad8f366d0"}, {"a": false, "c": "8BSLf1c41)W9q|64zh(<;vg%w8(lXe9m`5OZ4)XL??yheX-WGqH8&*wTvUEG#~}y8so:J13JwGMEK{UGm5?^5_WizvD8xf[9(;k`{p+B<", "s": "d5b9fc44441951ef97f78b7b9338182b", "oc": "abcfa81f88172e721656b325a9c0343b5728f3a778ae9445254aa9934599873934aec64ab25aab4465591dc2cb9a89d6a536ce6cde7ca688"}, {"a": false, "c": "mBbLU1c41WWSq|64dm(&;v|,{BptAYJD04_(hbe5krHRnV+XiP-PDUiIL1vhf|%pIYHIJ|!)^?>Os+9W6hM#IS|>jjq(QOC}mKf&zDG+Y&?X}yf&_V=pp-", "s": "9341f9753674c0e0db4241db35e1ccd8", "oc": "f66d976533d34449c5e1e81c3ddaac3668035136d13637a99de98955e44ec4ca7250cea47658667e7cb7f6bc7cc5c79e3ef83333c13a582f32abe58d628f1558"}, {"a": false, "c": "mBbKUtc{!VP9q|6@4h(B!v|K{6N-W`n}M;%", "s": "f1b600944e7e23b4be78c71f668db344", "oc": "fc6293b4302394a323e1df3c494940f02db7e7d8466ea19ab8ac2756abfd3ab3b2c87bc1fdedcd076be2243f8deae81d00597537ce08ecd51c49f2633b70d119"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (279, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK|K}*FmK$AVsrgI~keTg[i{M)=F@S{DFHgI0-uEScq1n)`JD2*L5u|4ii<9>>>rXQ9$7|-+85etm7#?HKm=d=?PIWkkO>6dKy3qG&xEU8TSqndA-`l,>P%C%>Rmq|o}0(|pse63UYL4zuYAT&_@yZ", "s": "a44cd60bfdef245d821a8b6d8729c245", "hm": "8066a044aa48ab3216046af9be3edf16"}, {"a": false, "c": "mBbK%Ks*MeK^mANr>IBkeTdAJ8$p9%O%qIur|@m^+ny9g89(;-usl&A-BiZGx2ZEhz#$NVXPuC%>R#o|{Z00@gse4t_YR4zlow&&_@yZ", "s": "7a58fd160b3e9dc8998f50eb5c20d2d6", "hm": "6ac747117bd5b70ea0f5141b18addbc4"}, {"a": false, "c": "mBb!QKs*Me*DAAZr>I~keTPA!8$Ac%O^q$ure@mw+nSZdAG,;-q7l&A-BbZG#b`wrl#$NVu<}3xw(n}!Af0ZrrV%xDCI~kRTZAPD|fQP%Q^QntEYXFS}MfY)3M%JxX4Tr;83>)OrY05odm>v15-)pOh", "s": "faef8975a174c2518b23aed802e20bc8", "oc": "f720971533b2c213a3002822721666ab196c28d4bbcef14515b1ea7990877fd9607c486bc7b1471f0e87b20833ae27a4d15dba5d614732c241ebbecaa0172955"}, {"a": false, "c": "LBbK%KsoMeKDAAsr>h[2eGZAcYqz~O22KC1X~:`Y~54OaGf@[K#,`Ehz#Uj@uYi@x>(yC!afBZrrG%_D|HE0$cd!^*AyZMa", "s": "69bc0eff4db8a34d6b2ccc14c681b302", "oc": "fc669b6539ffb1a3bbe1de3a4afa4f6039523a38f785f39470de8ed93a3683ae563ff3a7a82010119a62d6b1c5cbfddc856f9914e022e5b868721a46b557aaf9"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (280, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "{B]lXpyr$AiACbI(2VmAit@huY,DJ&eYPaps=I?%R9OTHo4`IDlD#e7vR$Gv&)<`e#vuVPS7W`JmZ7?{e;NqqHF7HC8>f@e%>;+isED;HR?XkHX^>5zFF#J<5?nwSV?28@E-qziBrC^6taWtOjdJEB8q=*ogcY>N<<0^$Z+Oi.r:YhV`o@G{(;RF=bBK!++7>KvJ%zy", "s": "093b96d5227de4fe76733806ed2f74f7", "oc": "fec75b16a8632ae2c553bc06a94f94f89778f369c9aec13545ba62931c08f9688eaf364ab9963b48c73b5d417f2ab074a730cbec830eba08e531d85f8d8abf79"}, {"a": false, "c": "mBbKBpyr]AQACXeOIVwOi}IsuLJw2wKvitTn1AZ2H#%wfMWPp@uCSzt7?QZTt6``(A3^P-GzWm|T=`6b9{?Df2Yo}L!Jgf}I*_|3i^1G3{WxpH+-#-c{`YTtk;7>W6Vz*6C|fXB?5pGy!(2ZzP!=L+n$?S", "s": "3b9a0d5604568d009928a51b5498d2d1", "hm": "6a577dad78da5e7f867b769ab1fddb4a"}, {"a": false, "c": "mtbK(py~5AQACXm!{[#OiHmhuQ6ceUg9XV)2uuM-tz#Br;^6<3WFO:d2ER8q=fogcY4k<]v^$Z}O({r7@hC`3RGf(;RF=bBK!+_j>KvH%]!", "s": "fc59378f781861c0655dd9b21b300edb", "oc": "fbe32118c0516af2d153bc2ca01f278bb4e9f0e954a7dbaca4b4649357958929cea7ec4ab973b90dc5366002c0ba0bc6a632ce62ad9edb03d53f284b82aabf39"}, {"a": false, "c": "m*.K(pyr-AQAC`mOI5NjVtVhOAme;>OwdkG}BL-0I#8N^GXp#da(CrO$8*TM)0K=lmV1F2cf=rBYf1*vJ%zy", "s": "f7ef1a754f71c2e0d0642dd805c0bac8", "oc": "fe6a946513b342194137370b15bad5226974ac8e53fb9e1bd508613a3caa81a5ea5dce25db45be9e28ad30f5d4a97c3745b2d9be0f93c27f3fd579fb40155096"}, {"a": false, "c": "mBk4Ho>|01D(mBM`uf!}(;MD{7G`K{b{(;RF+bBK!+;7>Kv|5zy", "s": "3bba0510497993446edcb71546c1b746", "oc": "fcca994f383341d3dce1d888475dd9c43101b0aae5d5fe2ee4738cfd038f9dc264951089fcdc67b28df0eda485b9ead23702f4816405cb457e71e911b6bf24f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (281, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "{BbcDVm%dN?0W$lgs1-JT*cmqX%JhW0ZsZXGqlNn$CfXJ;8W!V*=ir%Hpjg245TsG`HgOR@eL^$zO*kJ`x7KRuY0gW#{{HV?<-Z2rNIoFCWCADOt!tg(d-$_cW7l[FnD^0s*]=K5R|$rK=wXj9%|rX%Qi#2^,U4v?o_OazD@|E-LX)75hVz5Qha8fjh?^IZ_IzRbHJ", "s": "d903471920a836fe06dca812ed9fe4af", "oc": "fb3b1910a11d77161553bc764ef0240b87def3a986ae8445bebaf79395ea996c3445864abfb29c45ea3e6db97b4a5e726a37d56cb29eba1b"}, {"a": false, "c": "|Ib<@V^%dN?X>$8g21rJP*(m[K@H}|K5qTcrrf=;IrFg2#bT^iQ2^uT5M}}vb$:Q8dKJ&|aO{5qY*JjR-fUOWauiv9aKGB7RSrAjtFiCM)BMC]I1$Ej6!A21h:E%Y1I5$qGE}thw=;ucU%]`w^+k8(Uuh", "s": "3e906d5801327700ad2ed5610490ded1", "hm": "7ca716bdf8d2b77d4c76a61b48246bbd"}, {"a": false, "c": "mBb!@VD%d7?0&${)c1-JP*7m{8wBtsgI>{fFwcv$GK=wXj9T3E#%Q$#2^*Ugv1o_OazD[=oJIS)7S(VzEQH^zt{h?p@m*IRR^$J", "s": "23b238cd58ac510e954b60b30337091b", "oc": "becaaf11b8197ab2c59f1e73a61f240bbcfc938cc09e1445a5bd27a314c989698e0d9df7e8bceb4cc1569da27b2a5276a8329352adeeea79"}, {"a": false, "c": "{tbL@Z^bwqoX{u@IP-X+fPPauDK69~sM|p1Y5xR^!8D|E5slS8`r5r@k|7W5asDO}:08DaS@nu9}!!~5z2", "s": "af6799553f74cee6dba42d550ec3cec3", "oc": "fc659c6583b340191a00dd241f921949157d8bf089685ac4d6ccb884779757dcdee41622f0e65332c3cc4f49cf3ffa10ed12af69813cb503c1ac0a4d1d3fdaa5"}, {"a": false, "c": "mBbx@V^{{Na0>$;6)1-oP*cmqnX{J7H{3Jl!<%}}R}?ZZ8edK=XLlHmD_+SYpql*k$NnhnjRL3yhQ@;gNE0}9JmCuTC3w=j&6B7f>vhiK$_X_fCMy*u~+r&,m2C|Fs~D7i3VzGv5|N&fD;2A4AfCrxAE3g", "s": "b478e6e7ebe7845d521496f91129c750", "hm": "a0670b4d9608a54ec4f76ef9b940ffde"}, {"a": false, "c": "mBb+A;O?%`&h,~[hW0E&=nUH48gg_T;FE9E7gx^Bh>*L$Z3Uai0diI}+f6UJ#2^`3gv^U^QK@UzT4q>Fez_z-{6h0suY%yfAd|iH^zFEa", "s": "d55dd5bd647d30f1867cab97ed1fe8da", "oc": "fb07413dd57fca330553140637bf0467d4a85da3c1fe74a5a5ba6d93662999d989adf44a5900ab447a866da50b265846a536051cedcedafa"}, {"a": false, "c": "m`boA;2~_{dA787#WX%&w8qHtLK>%yI#+SZ>%-r>IMkN#<+JY0g%m&?_;qLaZ@OC{yIKf(uPs2dlQn9u4If8JtwZL@aO_~2$4fWO5Ld;craLf)AQ#4iCYNw5R8de-4EZuxWQgnf2!08Hn?LZ>lfC>xAES&", "s": "aa9a5aa668459d00aa1e101bafc38711", "hm": "64577db178d6b77fde701117d8fffbe7"}, {"a": false, "c": "mFbKE&f~_|Zh787#WXU&=nOHmEzW_I^{E9$$ZA?Bh>*L$Z3Uai]dH+Gcf6~J#2^>tgC}+`oD#UzQ4;>FeL_zGY9h}sZP%yfAc|eH^dF$]", "s": "f65b37d126186153905b643bce67aa2b", "oc": "fbe7a91ece1f2a3215f5bc06a9a0340bb7d3a6a9c6aeca4ba6ba6c07c19d890a4dadfa46bfc3a74525356d05ac214176a645a96ea99edf6a"}, {"a": false, "c": "#0$k);2~_|&h787#WXIx=]qHqB6^I)(|7H0EiUNXsIgp|=D|%)I^,@>L~bl>D}%TEmy%_T`5(j}7sw7opf[}qQB`p*T#djQPOIg@mfZM|fe9d!sHYv7puh", "s": "fa61dc914604ee69eb242d58c5dac3e8", "oc": "d0894cf243a342d9ae0f8e1b9c68d88c0bb53932cd7332d4f8aecfc0c4cdf2df73b1d9a0f5cd1825ed02dc658b2d5ecc7bc86eecaa720ad4d5e4e63204a28cda"}, {"a": false, "c": "+Bb|A;2~_G&h:8i*}XU&=nqHr5FPWu&i3a=KJqzg_knnIG(B$5#2J>LgC^U%o].EzQ4U>Fe6_y-Y6h0ssPH;IAd|4H^4F$W", "s": "88ba04434dd49385be1cb21f6681b34c", "oc": "bc667c6833f3ac60b7e1d1e6cbb63457e74c1245c3e231db7fdb16237b2b1cb725871fecf528f65634406d47bab71781751db8fa724f3d9888d17af0da4802b2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (283, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "CBUJ^V+<++N6WTGaNg#P!CMH#Y?$70Oz(Bs4U3#3#b#K4w1<@(]7(S0Cw|x{!!At-EpoP#C-hpJATry573m9`yu>G$C2X}uSwKmiUx#cPE`;!0{JJ_Q#MMnC{+cn%y}Axv1hPD31CxM[^V^+xf1miXlic$IXV<&LAX}Gz_t9gB(Yam~HaSg*{3-fsNT`Ics~!stkH^qu9y8E", "s": "9962dee10fcf805352149ac9072b474e", "hm": "80674b44a848a23280056a6db747df86"}, {"a": false, "c": "mgb}>G+<+s9n]T6?Hg#|!CMH#8-dM23AayBGQIzTV}n<6^Uo7qSG`z>A|:.`#2{On(aq~PZnN^4u{&L7c*)sN&<<0d@t5=DyfRFx,#X}Tz|H9gB.]avmHUSgKJ?-sUN*xI3]CUstkH^quP|8`", "s": "7c958d5901893900a120358b5992d2d1", "hm": "6a545d1d3e22567f8b1516e1d88dd7d5"}, {"a": false, "c": "m+bJ&V+<+WNnWTGaJc#z!CMH#Z-|*231oyoGQIzTv|n<67Uo7QEi}z>@UrJ`#u{On(E+~PZP7PGr{SD7X*)nN#Y!JpxT_uu4pfmtWp|;!", "s": "c0f927869b18e20f955b05bbc337a82b", "oc": "fb7e651f5361bab51053bb36a9c67e0bb779f583b66ec41595ba619315a986618eadc705c96fab4505ad0d02bffaf4763735cd62ad5fdbcb"}, {"a": false, "c": "wIgJ&V+v+WNnWTGaHg#Y!S;@#B}MUs{BII9$OGF8-dRuI089>{+~sAWO9}VdkwE=osZqkFEb(bOfkFVjA6YA>9t#bR$Ix.=pyh", "s": "5acf99e5967402eedb2d3b2d05eac7ba", "oc": "f1855a655fb342a94330292a72f397b3f6dcd252606df2ac2cfbaad5615cf6c4330e72fc9be4b23feaa28d9343607b6f5f2214ef3cd7c3c9b827fe2e58907a68"}, {"a": false, "c": "mBbS&V+<;PpnWTGaH|#U!XMH#6TnssYvyB3r-Zxc8n4$NxvM2=KTDW=JU;`VEJi&e|%cZkOtc]?;}cua|GP?sHjEK8D(vQGU?2zd<=NqW,)e3`uBGa30>C%X3u$H[Kb~W)de42!`4s2M,FoXlMbqWpcgZ^gwmCaxJ>Vblt#*B|HBay&2_idU80)gNqT0KPP07*tYi3p|DW?oew3}1.S.BujA}xQ$kG5-@6u=+OF_2^B8Q|||oP=&$^9ab3)SsApcnZX1W((NxJ>3R2t#*{EHBa<$Av%TNS$}TM|&-eJ1V", "s": "3d9a5d66d104990cab49491b5794d141", "hm": "65b707b978d2bd7b887b561ae7ffdbeb"}, {"a": false, "c": ")Bb]L-*wLU6NF?`:n?~|a;Vw=a<4;V5bBYoT7BC*jCw>yw2gxG<80AgNqT0K4J27xtY*3H6uW]ot0VYEjnjDr(d5XOQ4jpH|R?GhEq$QC", "s": "036937417c14da0f45fe6bbc33375b21", "oc": "a7c7801fc8116a39bd43be2c097fc4fcb7cb73d9c6a02441a8b1374117697849dea9efdaa9673b45c2bced3ac72f214636d5c4650dcf4d90"}, {"a": false, "c": "O@bd9-abuP6a2^+kn-~Na;Ca=B_n2Sii0k6I5*^aFr;+8pNuz%n1*sKvM#Q&TxN#}O!d8Jlxw^s|5mNKlz9n)y8WPo_%{!>c*Hqm$d^$NZI=3}]b3Kt@RJ*8LO:XQqK+P&v_9s0vf<&#}uKTbz)(?Kb4+xDBxMa;YT+hwxSdOK}yO~cKwK`(-vcBj{+j{1przT)p?n8#SyFw6)3&{p>MkP#2`-C=mzehPYJq>Hc1gk.lk(`uFcnLbB#~07YBC9SR2fTg>q7_!tjaqoV5r4K6AOU}GDKI5L`OMAWrEy*Mo2-nozA|Dun97(9)>g}1}QC4gSZ=F![$h~1nj", "s": "d9935cb501362d301f2b8512549dd4d1", "hm": "6add59b406d0ddff7b04161adef1dae7"}, {"a": false, "c": "mBbJ%A|9c_`{UsZrra?Hj)ev`3}u0yXK}SS8I%$>M!|#2`-TLDz=hvYJq>I4X-2!Z=+T4y{rQIt~KA&!iciB%ueX", "s": "9a57d7210517610f977b5bbbcb3da386", "oc": "fbc796dfc76c748205f31206092f2567b4d7f3a672acc4a5a63b57281cb159c11eadf647b910ab558533905fe6aa5226a6551e6cbd9147de"}, {"a": false, "c": "m7b=ZA|9c2`{O}n%ra{Hg)cv`F06PttDenliv?g0D@>h#$d2>I%ijv80>969yWMGVp(h", "s": "ba6f99553de4e290d2242fd79ceecec9", "oc": "fc0a9cb513b34249537c1e1d6a3343d98d6679cea7a722c4e6af36a8872de8ae639365d6c725bd2eeb6afd5f4f5d9acacc43cfb306d73c92423f8806aee2b6d7"}, {"a": false, "c": "mTbJ0A|9c0`{OInqRHDHj)cv_6zBDt#>7UH(*|VZbg%~}yV49F#2`bTLDz=#[YJq>IbXq5!Z=+oND{rQIwI$A&!;ciB?Ce-", "s": "ae1a804fbd7f2c40037cbdbf6621db8a", "oc": "c92a8b15c3737e23bcebd75f6b7cf856f59876baed77aed048582888ea9a6f7ec70c11fa1c72b54b5da31931723f9f61daf872ce4abeb4017d2ce2a68cf34f8a"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (286, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKUxX2>*MUi?TW<^8ceqnC$YU)b}n3&6jhU;-@w>2E?$1z;!^5kg>TIWD+eKr}>w?)=8kFz+-2_=CufMK}sLb~V6xNI)i9d+<#$YPp>2zPyN2B%cT5P|S", "s": "dd0b87f5207f00ff86e76816ff5fe4a7", "oc": "0033a18fc81f5fc24f83bc1bdb2f240967dd07a126501715a3bb64e118bc89200e2ddf4ab9b0a145c53666027bf7c476a661ce6ca5964b85"}, {"a": false, "c": "+Bb[K&X04cTUi~T2`Tn8b$&_I`2&=K3:;16;<^)-gWTjwPhP;54+>))=8kk9p#2;vk.8rKl4LaJV6xN[)iB_+BObY6pk2XPyN2F]cJ?P6A", "s": "f3563cd578d5914f085b6b4b5832a22d", "oc": "bbc7a116c81d257215175106be1f28ebcfdbfba9c6a1c44595b0e7936b498569cebe494ab9b3fb4af06c26077b2a5486463ccedcae7fc4da"}, {"a": false, "c": "mBYK?1i2H2TUN~W2v<8c9!na$H?hW7OD*DNK7Dgwgx=Qp(PP@z?L!jK9+ZzZ2%WDQZ|cf{G8>)j7X^wm+M3VwM;`aj:3S9vuenVJ^ViW_L5f]IC3rA>puh", "s": "fa8f987f56b4e2e38627e3d805e56a50", "oc": "a0fa0cfd61837ae91301fe919ce032bd6949ff3ced302031242aa9de9700b3236fac8342a0249beed4b71e9b6a468b9c213ac57f8bfd6be09fc48508dcb0891b"}, {"a": false, "c": "BBbK>&X2H2zUJ~TVa~GjoFvD#S,ehDVY]wCvQR|ClCmpM_qe~#b*?be!M87*jC0qjGN)z(X_`?p-nQq):F>?kn*E3TIQ4C}9_B2+`h@9=ZxMI>(!KVdc%KqJd^_Qhgfj${Vd#!8*jzc`5Eedx&GAcIoqHcY^0#&Q*+Tu^_7,f|hoElm)GIP5NP!2kGI;l7z", "s": "9683de0afde723a9c2145b6bf724c845", "hm": "8e87db44a43dab561305663eb34e2f1f"}, {"a": false, "c": "y{bLWk7xQ`arIhoFv%#SKu+DV8)c(|(X9VOZ|>!sIkThDI`8V6v0NV%ebmLo#2{_&wl++O>8nB3h[?%9t$@", "s": "920b97bb207d32f43fa6a874ec0ee1a8", "oc": "a2f7a11fc35f0e404f5bb206085ff44bb7d863a9c6a8c445a5f2379d15f989998eadfd4af2b8a2d5050d6d227f2e5536a695c6660d1d4aeb"}, {"a": false, "c": "mAbLWIPx0*a0Gzo3v+#SK|+DVLglEMd!}1mh5-c>2w|4w+OOD%T`H{zO|!cAxQ=%PXyt@ANA`*QQW}-SHF=i02HPizVOZ->cs1kThDI`~V8a}*V%*|mPoG2{_>wlM+:w8n|3hg?v9gRPWQhG({IGC?K2^TVZ3n+@$.", "s": "f3b337a18882c16b975b64dbc3a5ac2b", "oc": "bbc72112cc0ad48416032c0639ef24eb1dd70639cfbbca46a56a67927590796681a7164db9b5d6405b866ab27b255d57e6358e6cad1fb43b"}, {"a": false, "c": "mEbL6IPx0`auGhozvD#SK|+DVC6iz;*C3LL0=X>OkGeqR8zWMRfs3wO$1@**aU(5LdkQQ9)oGchZpS@8Ou)$@", "s": "40ba02eb4d3829446ea1b71f7ac1b344", "oc": "0265927f334f42a7d9e1777dc8ec348aeb8f0277c553878c0be5109ba3abfd1fda0411416843f36be8c2e2ea116d4aa1f1f7cd913ab3f5927510e5c09c0caeb3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (288, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "#HbLU1c41)W9q|644h(&;$|K{Y9^Gwd5DAJM}xtmtvJFD-rpcd=bIab3_3_g6L54J6CAzZqgeJ~zXCHw&G>@%Qg;jo1i6m=>!NvyVveB%BLkhlXfWOx7>_I~TL)te%yTm5;350kkPVz)R}@Hjc[H|rFTb0cE458>AfAQ%t|tC,!iE%ZQ=~zak[$5_!82", "s": "6d95d60f0fef85addd347b6437293745", "hm": "86b74b74fecbc362c4156c3db94ada66"}, {"a": false, "c": "mBbLU1c41)ggl|64$*(&;v%K{8(+XB9M2r>Z4)Xh??yMLXsWGqH8&DwusUEG#2}z8>{C-19JwGMEK{UGH5e^5^W>znh8xf@&ZEk`3pxB>", "s": "d91b97752d79367e6961c89fe92fe6a2", "oc": "f5bfa11fca1f2bd11b73bc051915200b775a139ac6a234dd07bbf49105aba9d38aaef6dbb9016b45c35e688661fa5411a0d5cd6ca778a9e6"}, {"a": false, "c": "mBbLU1c4[)W9q|644h(&;v|K{LTAMA!h2L`p]*?*IGx>Za%p&PaSN%eU9&O-dc<];bg{E33Qgw*KvCKnGKNtMolf1$>6M)m|A88cy^d,zMQ{t{MXz*i>%8,=~zakT$--;E$VzR_*Mme1YEm>$[2", "s": "379a4d560160d5058928831b5490d251", "hm": "6db77dbfa802be7f26930611d1fddce3"}, {"a": false, "c": "`|y*1174&)o9q(644h(&;vTK@8(5;e9}`5O24)0L|=Z$eF-WGqHM&(wsvUEG#:}y.sI)u1>V}GMEK{USn5L^5*Wdz~h8xf29(;R`{p-B>", "s": "f5b93e89f81e6101325a6dbb2337faab", "oc": "f7c6011ac81fb4321553bcb8c9922c0297a85369c65ece45a5b36ff31599896973ad834519e3c149f535b8027d2a5476a6959e5caba7ade6"}, {"a": false, "c": "pjbjb1c41)W9q|a4dh^&Kr|KEr`tBY7Dd4i8h%C51sqRb;+K)hTPvUQIo*vFxx%(@Y+IJ|V0^MNyA+4b6hM#IOh>*n4>PO(H|KLtkD.?Y&?X*yf!rV=Puh", "s": "fd6b977a06e382e53b24cfd805eaaac8", "oc": "fcc85c6539d08b1a4f0e8b9c9dcacf792c085131d63f33c5d9e929ebd6a5f545cc22c3a6778d70bc9d7ef38d7ce727953ef466f6414b781ea8c9334670db7596"}, {"a": false, "c": "m|bRUEc41{W9q|64mh(&*v|K{6BoWY.&Z;%iX03v~3|wSRRrXP]2>.MOIC-1kJTGYEK7}Hm5?d5*Wizv.8xf(9(_k8{a+B>", "s": "3d95bdbc557a2b64697cb7055981b814", "oc": "b4c49f684cb241a315e1033c4911992ccde7bc68461e5189eb0dfdbeab4a3ac7ddc0714cf49bccb6fb927edf1def384e085875972ca8e3ce1b4599393c261c67"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (289, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK%Ks*OeKDAALr>]~kjTMAcYM5b4|8fh~$D>=F@t9DFHgI0-uESov1vX`JD2W}wLQ,zT)bJN2)s~HVd-)wbVZ$cQ3BPHp6aW_IWqrt*l5iV2i1J*>>yrmQ9$7yk+I~kOTZA^8$p9%ZKq$uVm8mNJn39d89A;-uKl&A-BbZG#2`E@z#ZNVumA@xw}4O!AfBZroG%wD!HEg$|9tz#ir5ia", "s": "dbdbd7557973c04a767c087df25f7447", "oc": "fbc1211f281f2a391673b06aa18f230bc7d8fcabcbee484e58b627981d49b56acea8f14a1013ab45c8c66755f2983476ae30ce6cde7328e7"}, {"a": false, "c": "mI~keTZA+LZs-pqEll0=d-B5Dk)P~Kv%D4t3X*]f8t+m]cokD(@D`M>on8TdK@!5a@!qm7ARmq|6M0(8gse6t_YrMzuoAT&!@KZ", "s": "da3d5d560f369d00892e853be40bd1d1", "hm": "aaeb9dbe78d3b27f8720abca98ebdce7"}, {"a": false, "c": "mBbK%Ks*MeKDAAsrAI~keTZkc8$Y9%O7qRurm}}N+n}_d8>AX-u7l&A-BbjG&2`Eh0#$N5u>_kfTZAoCcfIP%Q;3OqEFX-Sy+qY)1lx;8sAp`hPTF2`0mDr@O?=YnWO&C5PN=e[Q4Dk!jEY@TKXe1r6#3>tT{BPPodR>61.-Gpuh", "s": "a06f40773674a0e0db242fd865ec0ac8", "oc": "2c6a9b6533b14212de20cd5a70787629c97d2c4315f091ebccd5e80f908770f0b0fc692b9eb603be6ee7dcb631ce88467432f72567403dc3afebb6e036378057"}, {"a": false, "c": "C|bRaKs*+eKDuAs|>I.keT_A,Fvz~_22#C1k~e`Y-5u&aG;c@>#2`Ehk@$NlundLtlH#}%BR2Gv&9Hg],d(VPS7>@PmZO?!Te:hqHh7rC>>fxeB>OqissD;H2Xy|6X(yazaW(h<2XKH>ClJXzy", "s": "949306210fe189a662749b69d5274745", "hm": "88f79b92a549ab30d3056a5db91e2129"}, {"a": false, "c": "mBbK(pyr$AQACXmOIVmOi}Ihu96ceUg9@V?28fT-tz#BrI^6q+nc`M", "s": "3a9a99b1a2961d70a73e85af5994543d", "hm": "6a11afad78e266eeb63a164b58fddbe7"}, {"a": false, "c": "m7bK|pyr}AQ!C(mOW>zO>}Ihu96}&Ug9XL{28mM-tt|Br!^$Zp+;z`KvJ%fm", "s": "7a6f99356614e9e1dc242dd823ea16c8", "oc": "f26f95a85ab3420ca1fdb7fb656ab9296231d77e53fb361bd3b0984a28313acd373a89b5174dc25038bfc134f4a9a95716bd0e7a029f072a35d6ad26f0e590cb"}, {"a": false, "c": "mCVK(Z)r7AQiCXmOIVmOL}fhKEn`Zgif4;G>kLHo>^0:=jmcl`uf!l{Lr1<JK(jgX(?Tw8`2WORpeL^6zY*^!`x7_Ru`0gWj{2OV?F-K2rN=B4DpOgDO:<9g2dUI_cW7l=aiH641$E|6!.mwh7E%%1I5$YNq}thS=uucY|ypuG+u8(puh", "s": "943536c10fe084775214efa97d397b47", "hm": "aa67ea74aeb8c23cf6050a6cb04edf10"}, {"a": false, "c": "mBnL@V^%dN|0W$=g)1-JP*lmq8w1t0gd>{D^0s{}=uwcX>HK=wXj9d3J#%mid2^f&Mv=bjOazDU=oJ,g)7m(Vz=QU^8tgh?^@={nRRmHU", "s": "f5db77b5c07a33f6015c3816b1b2e6a1", "oc": "fb72a41fcb1accdc3553bcc9ab5e540cb728f659caaec44575da1709269989695e4df84a5ea3ab3ec7366df27b2a6f7686351e6b4d93485b"}, {"a": false, "c": "mBbL@Vh%b1y0W$;g)1-FP3$mqj`;r~ujqsD!(M=;IrDg2#iTo:Q2bu[|zQ:vb+8{qdK5&2IM{8qYVEwR-w@OWau*19aKGAhNSrAj*IiC`!Bi!B}}$Ej8!Y<1h!gH%1I5$.pE}tlCctucU|IEwG+k8{puh", "s": "3a9a5d86f03a3d009973ae1bc4ae42df", "hm": "ba425d5d8892e77f8518768ed8dd93a7"}, {"a": false, "c": "mBbj@V<%dN?0W$;gt1-+P*cmq8w1tngI0{D:Us{kHKQcv$GKnb|^oX!uNXe2XSw9[acD`6S0sM|<_YOxg^!82|_MslSf`P*r@k|7(5a<;H#Cao2jlNO0F~SDaS@nuST~!C5z&", "s": "f828a9d037a404201934add8053acacf", "oc": "fc69106533e3461286f9d82916e71a445ba47896a9f57af4de30b86177e76af5bae33630f29d0eb1bbdc45891682ba30a058866984f1bfa609ee0d533bfbbae5"}, {"a": false, "c": "m1bL@VR%Fu?0W$;g)(chP*cmq$X0LB{o?ji)H&5-Q7zt=j&CBwf>{GiAn|Xx3CMyn3~nC&!m>CgFsrD7A$VznvGzN?ZD;2AYn|w)S~DOWX$J^.by#S1V+JAf#4,CVmE5R8dU;4qZ}-LQgmq2A0{V1??Z>_fCrxzEPY", "s": "9493d6d106e08f5d5d149b695029c055", "hm": "89bbab44cf4a0b02c207b73dbe47d3a6"}, {"a": false, "c": "mAbKA;2Oz|&C7pn#WXUh=*q=48z#_I^Xo9E^Ts^B]H*t$Z3UaiidiIG846-J#2^>kgC^U%oK#UzQ4U>FeL_q-Y|h0ssP%ylgd|iH^|F)W", "s": "f90b93bf2076aefe5611a876600fe4a6", "oc": "fbc7e11ec8bd2ab2155cbc06aa1de40187f80309c6ae2965a5de6cd3ea9999698465064ab5b36b423b78fd00762154b602388e6ea63ed3ba"}, {"a": false, "c": "WBbKAS2~_f&h787#WXU&B2qHVLSk%0,3+Svs%?x@cMkI#$+uY@u~Q&?.JqLaZ=OY{yIKN|aNs2dC4Z9!gIf8=tw6L@OOo~2$efWO5LdU)=aR3)AQk4iC*mZWR8de-4qZ}xLQg^92At{V^??h-lfCrxAE2Y", "s": "31fad8ab06b69dd0a9ae35f551c0abda", "hm": "68b4adbd8dd6b771467a191afdfd8ee7"}, {"a": false, "c": "m%xKA;o~{|&h707#WXU&=nIi4]zV_j^F@wEATx^B15*L1Z3Uam@diI}[fL-}#2^>OgC^UfoKKUzQ2A>JeU_z-Y6h0ssP%yfAd|YH^HFSW", "s": "5eb937813b18670ae55b2bdbcf3e6a27", "oc": "fb67a616c2322a3c1553bc57501f360bb97df208864ed483a52a67961299e7664eadda3ab9b4ab45e5116f1d7b2a56e9ac0bd28c7d93d43a"}, {"a": false, "c": "mFmKADNG]=&h{87#WDU&KnEH4C6Nq)f|CH0oiUN!s_%9aPv^%)I3u@>Lo)R>)^FUEHMXMT`T(j}7si7p+qJ}pQ>Yl1T~S8QPdn3@mf54Ffe9d!z4Y`5puI", "s": "fadf9985a668e6ec38242d9805e95cc8", "oc": "5cbafc6534634969c001b4199cea330c3e7548e7cd73411f48ae3ab563bdb256d56b95aa1498d88ccdeed1d20b01bf299dc9068f5dc8fad825e45c3435a0f831"}, {"a": false, "c": "$ObUA;2~_|.h787#WXU&=?qHPO#Pj9$J3Xq}Jm?+_kin*G(KrQ#2T>OgvLw%oK[Uzo4U9Fe,_z-Y.h>ssP%yg}d|iP^AF$W", "s": "3db6f5424d7383496e77a71f5818b344", "oc": "fc6cfc6a31be0ba35b8118d81b003457677d8ecdc7e251df0fa7a6a21b4e1c0225171803f7f4547aaa5e6e435dbb03075a8ee801d2b43ae1088912f0564f0162"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (293, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "MBbJ&V+<+WNnWTGa=g#y!h|H#{U[=ZC7#BO3U3#W#bHKGw1d{nM7+SxNe&E{!!oC-Apo5DC-8ZJ%THn?7A-|1(u>=jG>X*qg|9>iUw`cPE`;Z0{ZJ_Q@3MnCF+Ynxy2AV>:0mxj!CMH#8f%M`31ayoGQazTv|n<4dUoYQSrSX>1UcJ`#}{On*Eq.PZj#^G?{Sz7X*7sN#Y!JpxT_uu4CfmrOQ|*!", "s": "d9e09afa0e86301e8186aae6ed5fe4a7", "oc": "87b7a21b681f24621e53d50609bf22dbf7d8f3a11e7e159a05caa79ce579c9698ead3f4ab4baae49c53f13027b2a145056b2577dad9e56bf"}, {"a": false, "c": "=B$T&V+<+WNnWTGqcg#Y!C0H>Le)6*APoCZas|sbiZst>}&v!}P|yV]?1M~YnK9IsIv8CoL6Tzth(-874C)CjcUSuX4FvyJ<a8~H?S5KJP-s2N*`Ics~!stkw=qDcc(!", "s": "3a9a5e16d1669d0fa9eb85a15de0ff41", "hm": "63475d8d7f82b775a3b5151ed8f14a4f"}, {"a": false, "c": "BBb[&V+,U{Jz#2{Cn(Eqsi-P7^Au@SL7z{)OU#YuJp0T_{H4{f0rWp|*!", "s": "f339378d4838bec5e55f64bb9347a82b", "oc": "fbc74a53ce392e3815d267c6a6afd4923b3840a99ce8ca655ab0673c15e95449a8ad06d679b8ab65954865a67b2ae476ae35ceecadbe6bcb"}, {"a": false, "c": "mBbJ&VGQ!WN}WTGab{#I!CMH#B}MUqdEGI9*OIOUzdRu#iWcrI+Esd$f|6mdkZ6Bct#0N|HBZ!T9=%+e($ITMPT-Y0Vv", "s": "9bc367e10f65c41a58f49bee7749c7ef", "hm": "876bdb46a840ab22c3b06f4ebe4e5f38"}, {"a": false, "c": "mBbM9-awLU6C`|`*i!#80MgNLT|KO329At3*3p+Da?ft0h8E+njDr(A5XNQ4np73J?^a]&$Q~", "s": "7d3ba7b5277630fe866ca816ed0fe417", "oc": "fbcca11fcd527a32158e0036a916240b71d8a3a9c98ec4558eb1d39706948969a478164ab9b363416f397802b02a3475a625c8acaddd41bc"}, {"a": false, "c": "mBdM9-awLa6awLQJTS5&&j{R|QNY+p4CeSY)Gzix|wRPj>$YGm-@Iu=+O~_wMB&QA|bYP=&%^#B;c1(Laoy)rsA,cghX1WmWN]J>3BltG*(|HBarw2!idG80AgN~T0K#327`tY*3p+St?ot0|9EjHj&r(d5X_Q4npH3RN^aEqCQC", "s": "f3b2dcf1481a690f9522c9ebcd378a28", "oc": "f591a1fccc4c2531155db90b191f04dbaad84359cfae7441abb5a293159939698e2d16e0f96bad45cfc46568777e5276abac8e6caf5a9b88"}, {"a": false, "c": "mB_M9-awLM6a<:|+y?~|a;|wp*_NhSIi0_6I8a^aFr;+8N[ez%_1aRK6MTQ&Tx!b}L!d?IlZM^s|[mJgx}9n)ymWvR_wqM>J?+qr$d^$NZIJpL3&&cKpEh", "s": "a36f497e1344e9eb2ba32dd801ea72c8", "oc": "7e6a516333b6521ea304721c9af9ca2fe8c84d335c5f80d1cbec09288ada7c6da6cc067b2fdecdafa8132f9a6165fbd31ee9018ef0d2e238667c6caa1a670edb"}, {"a": false, "c": "mB$M9-jyLG0iY?.zn?~$a;Cwa6B!dcm#UX|Z!h?^a_i~QC", "s": "5fba00e0d77823310e7c17c866e1b4f1", "oc": "7c6a98665a4345a3bee1df6b3c7504e5ca5c73707ef42a2de053b2cd6f520e157d6fd0568bb27fc0a37ec6c84270c9b4605cdd2ed5497036f3bcbea4b5cc9a94"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (295, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb+Ze#.c2${Os0Ira?Hj)c7`YFJ>Kt4RJ*8gO2XQqL+Pqb_.s4XN<&V}uKTbG3(?Kb4+xpBBM6;Y2+`.QSdOu}GO~cKhn`WBAc!p{^?{gpjzVWjtx01bd^h(Fa;pBD=0k9-!|#T`RTLD(=hvYJW>k4PqH!z=+nND{HQItOKA&!;coB}7?X", "s": "85b6e77a20cd37fb2a7ca5168d0fe4a7", "oc": "57973e1fc89c2a3217514526a90f041bb9d3f34996a4c441a5fa60930599896984119d68b9bd8b48c54364f2782a58a62635a767a4bc46f3"}, {"a": false, "c": "eBbJZA|9m[`{Osnrra_HjWcv=LjQ)Xbp_~llv&x~<)hiie5|%>Hc1hkglk(`D>cnobB_E07rBC9SRwZvA}qZ_&tja0I%1JCE*AOUpGV`b5L`O!AW^CsxM{J-no+AcAuH96I94sC61}WC4g$ZRr!U$ho1nx", "s": "389a5d260a56adb0994e8718558022f8", "hm": "6ae77bbd71d207a1cb75a01aa8190977"}, {"a": false, "c": "&BbaJAJ9cA5{OsnM2|,2`4TLbz=h?YJq]I4Xqd!Z=$nND,rQIt~KV&!;ziBrVNX", "s": "d31b3491e80825245b507bcbcb3289bb", "oc": "cbf1a198e81fea34c553bc66af19d40bb7d839a5bca854e0a1fa679fa69989e2843df4f5b9019b4ec4361f02cb2a5476aa31c7dcad2e4189"}, {"a": false, "c": "zcbJBA|Pc2`{OWn1ra?Hjac~`C06ottDeglis6vFW:xV#uh", "s": "aa9f99f23806eb9abb1e2fd865ebc298", "oc": "ecba79f237b14e79a508cece2d03c37252f876ca470303bfe6a333c58b5de0d6850340d6d558b790fb34e700429daa0eb386ffc3ba8e837152ef8861d12f8fd7"}, {"a": false, "c": "mBbJdAc90j`X+sNrKa?Hj)cA`6LBD2#>7cHIq|VZbg:~lyV4vX#Gq-XLDz=+vXJ[>I4Xqd!]=+nN8{rqIt~Kc&U^c{BH7eX", "s": "392a204bdd7dac446e7677bf66d1b344", "oc": "fc6e93ca31b341a3c1e187ef0772f604fe71234dedc7a982445b8b39ea2a62fa870793901c76b5e7a06b1a3c77eb953add8e7d9ed2ffbc61e5a9d4058c732613"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (296, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb}U&X2H2TUaPT2sQ]iSNTbjoUQuI`BLc)|G)+RWH~IIzexJ&Lw9l&", "s": "7fb3669407e0825f319488697079b745", "hm": "8061db44f8a8a63c13086a4db0ced295"}, {"a": false, "c": "mubKn&X2H2PDi,TJTow:+PE4y+w6;=@BCzp#2_Xku8.Wl4L5~V6xs*6i&Z+<[=YPpkLXPyN2XCcTeP6e", "s": "a20b9712287a30f286d1362ae309e4a7", "oc": "f6a62e1fc91629921513bc06a91e240be7f824bb16adc445a5ba7ec1dd3889c38e0df6ea09b3a64dc5310d447b2a5c7d2b3ec06ccd9462ba"}, {"a": false, "c": "mBbKU&X2Hv@U&~30`TnPp$&_a`G&=n39;1W?<^):{>ZjwP+:hQ|+;6%50kXzp{2_X$u8AKl>La5V94NIJTB_+<|U&X)HVFUe~>2<*8F9pnC$B?YW7d0sDNK7Dg,gx=Qp(=PTzV*!jK9CkzQ2%AD+ZfEtOG!{)jCL^w8G`tVi@Z`aOj3S9vuenV{^XiW_L5foC_3vA>puE", "s": "f5ef197536ade2e4cb748b02a9bacac2", "oc": "29869c6583b59c1ea48c8e1cbce0320d3d69ff86eea070f46e6bc7dd78208307dede13fba0059b9dd4c21bdbdc465b0cf37cd5c6abc048a656941801d6040932"}, {"a": false, "c": "mBvKU&X2H2TUi~T2`b;G@YMo-tx{I,1!?)?c%KqJ9^_Qhgfg$2N>3!}sJzcMa8esE&hAZ_oqHcY^<#&Q*hDu^>MO{|hoElmv%I;5WP!2kG`rl7z", "s": "44fee60103b8841d72149bf977296585", "hm": "d5e74647a8285b2283086a36b64edf1f"}, {"a": false, "c": "mBbLWIPx0`a~$ho{vD#?K|+Dt8)N(L(X9VOZ->csIkThDIFV}LazNV%eDjLo#2{_=w^]+Od8nd3hg?S9g?kWQNH(kcr%Hv2^T7P3n~>$@", "s": "d3b837b5507de1fc1675a71696efe4a7", "oc": "fbc7c149883652921513b3970f1f2a8bf703f3e9cbc35442a5be8393159983812e2dfc4ab2b2afecc73666027b2a243d6695cd6e2d9f42b0"}, {"a": false, "c": "mBbL{SDx>`a~GhoFvD#SK|+DVLVlNEy!}Em?[-+{)O|48Y1OfPT`={Tv|kcAxQ:}b+Xt}g2AX*$QEW-pHFGi-2#PlwLgI!suH{C*(7KsPG(nV6AZL#qtTY)e#t$xhTuo_|O2rIoXlBz5I;5Nu!cs+0;hDI,VV6a}NV%eDmLo#2{.&wl+?_w8nB3hR?v}}-k8Q(G(}.GCHKg^T7}^:#>$@", "s": "c3e93782e812637a3e6b6b5bce37b36b", "oc": "abc7a11ecf132a921513b806a12485abb7d8f6a9c5aec300d5856890139909fe8ea28bf709bf4b75c536fd297b4a5240af6b4e6cad9c573c"}, {"a": false, "c": "mBbLWIPx0`^>Q}oFvDoSK|tDbCCJ:R5#3LA0=X>KcfQzR}^WMRfqewr&X@I%aU(5L_kQ498oZcZZSS@=!<03pautdMP=ABvHN$kJOH5mEq?2}$nvgBwpXh", "s": "fa1f997e3667ea5719242dd8b5eac0c8", "oc": "ec669c65b3434219a301800dd24dd1fe434faa340e4c65d9f0185dcf214b83c25331df726afa1b20d6b59947387ad45ff00d2462e982b48c500fa8e33e26c58e"}, {"a": false, "c": "mBbL2IPxBOudGhoFbD#SK|+DV6Urj%a^1;7JovsVsxWKc?BCqSh2?_&wl++_w}n~3hg?v9g-kW.{G(kg;CHKF<>7Z3>M>$C", "s": "3dfa6f824773234b6e2cd7ef9681d344", "oc": "f56a7c0533bd65a3bb2197e2c85b248a28e908d24a06b72c08a910e5e1ab7d1db2d4150cfec3fd5088c25d2af1254ad1fdf66195be9905d8b11575d09394ab14"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (298, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mJbL:IcZ1)W9N|6X4h(G;_|K{59^G7r5D2JM5{tmtvHF:|r:*|!bIFbJ_pX%,AL4JxCAz@qg;J~zXCHw#~>@%Qg;jo%i6*=P!NvDVAeB%BPDh0)fUgx(>^IJTLdje%|T);t350kkPIz)R1@HjcJHNr!Bb0<0sR8>A)MhNt`tCz*iE%TQ=pdakT$<%;E$>z8MR^me1YEm>!82", "s": "9493b67102388e5c56163b197729c740", "hm": "0062db44c843bd18c30561fd684ed517"}, {"a": false, "c": ",GbLU4c41)W2q|644hk&;v|q{8(5XeQm`5OZ4)XL?1[KeXkWG,H8DDNuXUEG#2}y=sIC-1kJwGMDQ{UGmJ?^P*Wiz->8x!(9(,k`{j+B>", "s": "b9f5bb502077e0fef63c3e14ed03e4a7", "oc": "5afcae1425df8a69155cbd0109b7240bb8d7430716f1444902be611a05995f695ea7f547beb8ab478535fb327588da768735c26caf77a927"}, {"a": false, "c": "mBQLU-c4n)W97|644h([fv|g{.Ge1I!h_L`pi*@JIPxKZWEp&xfSNIeNxX+-js<2;`?82", "s": "3a915b564c409d0ab72e852c54a062d5", "hm": "dabbddbd76d0b7487605167ad87ddb47"}, {"a": false, "c": "tBTLU1c83{<9q8644h(+;m|K{8$5Xe9mc5O`4?XL7?yheX-P]q`8&DwuvUEG{>}y8suC-1kJwG>EK", "s": "9769b7857838653f955b6bba22304a20", "oc": "bbc38113d8102e391357ec06a91bf40b9cd4a175c1a344e5a08a1753ea9989198ea2664a49854b95c5368c027bda44765635c100aed7d9e6"}, {"a": false, "c": "mB~LU1c41)W9q|64@h(p;v|K{B`_`Y7D@4I+h%C5;rHRnVOK)h-n{Ui*y1E,xAF(@YjIg|V0^?NpV+^b6hM#XO|>jjq(POCHmK{&2DF=Y&+X1Qf!_V>puh", "s": "fe6097753e74e210db2a1cd87554a5c8", "oc": "fc6a6f653393ef1a4b918c1c9dc9ac4ce307f101d633b9a8fde28995c0a5af6ef124ce14768171b47876fe8cb3c60998aefe644375515814c6691c46738bbc0f"}, {"a": false, "c": "mBbLU1c4U)6!q|xy4x5W;vhK{6B>WPJXGa%h8xf(9(;k`Tp+I>", "s": "1dca0d48fd7846b46e5bf7126b81bc4a", "oc": "fc9aa2e99dc3cca3bbe3d5814957fc8c5db05c684393a990b56d0dbcae513a72a2085e40f098cd072b522e429fe7e4c80462f5fb33a8a35b1646f96993e4da69"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (299, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "BB:K%Ks=Me|DAA|r>I~,eTZ{cYM9b4|8f!~9@.=F@t{DFygI0-uEaoh1!h`JbqW}wLQ{zlPbJN2)shoVF=RubVZ$cQL`PHK6ag_Imq>t*>5uP2ii+Q>>yrXQ9$79k+Cs6tUH#?H.kldf?+LWNkO%6dKyCqGy*^q=Ajq1dArOM$>q%[%>6m6|o10SGpse6t_Yr4zuoAT(vDK{", "s": "e4c3466a7ade840357c89b69a77fc742", "hm": "82675b44a6cb5b9745056a31bc22df16"}, {"a": false, "c": "mBbK%Ks*yyKkAAsr>I~keT!Aq>$p9%Y%q$lnT@mN+nJ@q89AQ-{7l&A-2bZG#*`Ehq#$NkutMc>Z>KpqE$l0=C-c5D@fn~KuxDUtHnphf8C+p-coX<1@z`E{on8nF+!~5a%!T97A<,d_F)Iuzuod5&_@KZ", "s": "3a08d756083f9540a5748213549252a4", "hm": "6a97dd6d7842b771866616f1d8fd5ee7"}, {"a": false, "c": "mBbK%|s*MeKEAAs]-k~ke%ZAc8$>9%O%q$urp@INhn99dc|A&QuX{&[-BbZG#7`zhz#$FVud!z*hNZ?a", "s": "f3898d8598186409d25b4bb4933d6a26", "oc": "f6c9a21f08862a32b578b98aa61f240c27d8f7e9c6aac4b5a5bad6931a0984298ef6f65eb9b3ebb5c1366e720b1a54a6a635ce6caec74997"}, {"a": false, "c": "mBbK%Ks*s3$`A*pr>&~h;TqAcNG>IP%QIQJtEK}-SyMqY)tlA;8sA{`hPSm2NemDQ@O?=H^WO>`JPN=e5Q4VHOjEY%TWXe6rY#3>tTrW05oUu>6m*-rkuh", "s": "da6f92a53d74efefdd252d2808ea490f", "oc": "fc6b99e563b342093308d83f747c732b417c2b0470bde1e044d0edef58494fd92004926b8ebe03cfde43c2d633b927476f7d3751607a3d62b76b3c31f01e0ff4"}, {"a": false, "c": "m&b<%[4*MeKDAAsr7R~k+T4pf6Gz~_22KC1k~p3q-51}aG>cRK&2`Ehz#$|H}", "s": "3db200c04d78214e6077b7ef6641b344", "oc": "f76a3c6834b3807bbbe4cfba71446a1cb102efeaf83f789075742cd930f583a14e6f83a7adb0e14dc2581aabe2abf9f622e5c944e01de548077e1bf80107ac15"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (300, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "HW@3(pyr$0)ACX.Ob]}Oi}IhuY]Dbi9wYap,=Ik%RsOT!ondLMle#F>pz$Gv&e<|o#v)mP,7W)PmZ7?!TeVhqgX7-Cedf@e%>;Ni8[D;H2XykHX^>$zzF;(g;7AKvJoxS", "s": "b90b9dcf5477301f767c35106dafe687", "oc": "aec0a11fc21f2432ad866639d8ef240bb96ca978c65ec445a848a79c35998c6a8e1d0f71f9d2bbc3b58667026b2a5676d635c56cad91b4dee83fd84987fabfa8"}, {"a": false, "c": "mBbL(70}$A0AUXmMIVmEisIhVu-}=wKr>tTnN5T2HKnGf9WP-yuChztE2QZ*.Z``BA3oP-Gz}A8T2c6bFP?FB2|o[A!_gDzI}%|{%^11O[Wxp5Aq#gc)GYTt};F|W6?zw;{C%XB?_p4y!(2xzD!9L+!)`S", "s": "329a0c76c1369d00a92b851b5482d9b1", "hm": "69e750bd67d2ba7fc6a5161ab551b2e7"}, {"a": false, "c": "mBbKjpyr$AzAC9mOoVmOiRfhu96c?URzX392q@}-tF#B%1^683WFFjd2ER8iifogcYy1!xv^$Z+O(2r7YhC`kdl{h;RF=bBg!{;7>hvJ%w_", "s": "f349dcd14018c65fd35589b0cc37aa2b", "oc": "fec7a176c81b523c1543b6360919548b9768f3eacba3cc47a5b1651d1999496888a44c42b7b3ab45ce356d027b2af47aa635c46cadae0a76e53bd83cd79acfc8"}, {"a": false, "c": "@BI,uTy)$QQECXmOUVmOi}mhR~#d;>Ow*zKy)L-AI#u]^;XA#YhC`o{G;NvRF=bBK!+;7>KvJ%Ky", "s": "fa1fc9253274e7757b2a2dd197e93acc", "oc": "1c7790bd35c34080930a7adb65ba6122e6badf7b53f444dbb6b888fa1ef1814197cacd65bbfd493e38bfbd7455e9de87b2b48c1eb3a2fe2b3a51ed6b404590db"}, {"a": false, "c": "iBbK(pyr$TQA.XmOIVmOQ}Ihu6J`H}>08&O>k4F{>^0_=jmcMVRfxg(YMz<1tsgI>{^Ses=U=Kwzv$GK}wXj97rJ#%Qi#2^fUgv1o_nazD!=oJIS)7m(VlE4U^ztUh,S4=8I$R^H=", "s": "19633b15207ee1de4e7ca8163b0fe4f6", "oc": "0bfa8519c8112a3d775f2c08a21e240b37daf3b2c6cedfc5a54a1543679489695aadf64ae9b3bb4ac53a8d027b2de876f43bae6cb69eda7b"}, {"a": false, "c": "EBbL@V^?d!?0WeXg,1-JP*]+qZ@;r|KoP4Q!A@lHIrFg2xbT?wQ2^uT?Mc1v6bM{j5oNC).MzKq)VEjR-wUOW@%*19[KG>hNpuA*aw>C`+BZC=4e$E=6!A<8h!E%%1IZ$YI&}_hw=uuGU|>ElG+b8oy&R", "s": "3adafd76013c9d29699e8914643045e1", "hm": "69c75dbda8dde7ff32732b1a901d3de7"}, {"a": false, "c": "@*2LYVJ%,N?hL$;g(1OJP*fBq8w1t&ZI>8D^es{k=ow8v$GKQwXK97FJ=%*is2^~Unv14xOazD!ioJIS)jm(V@EQU^f]khd^@=M?RR^HJ", "s": "b3b937828108685f985b5b3bcc37a58b", "oc": "fbcea1185a1e55c71883bc01a81f7a0b6ea8f3a9967ecb8532be0793559489f288a4b64ac9b3a345e555fd580c218c76b6380e6cad9eea2d"}, {"a": false, "c": "x48LCV.%dN?0#B;g)1-*P2cmqBx[q+>y>b|qoX{uaXP2i{f9U0cDnn90sMjBwY5xR^!82mE5slSfjr5|@k|,W5a<;ElGEk2flNO0F~8$aS@_%ET>!K5z=", "s": "fcbd99753c7a6200ddf32df175ea2ac7", "oc": "a9ca94653879425cfe5056991fb11a4955a12bb04fdfeae464c0b87417b5579ce8e377a3f2aeafebc3d9422010eff2102f5b75697691f569abee0ac578306de0"}, {"a": false, "c": "mBbp@V^%d`?0W$fg)1-JP*0mq[X0}B3o?jMZe&+4v7zt=B&v(If>vGiA$|[ER4NLn35nCC4m2n|F&TD)A$C,n@BP`&ZD;?AYnEe)S$DiWX{8fBby<_1V+JQ<#4iCbmEKR]be-4qR}xLQg1eQ80x;^?AZxlfCrJA{7Y", "s": "169bd6fa0ff78b5059a695697718ce45", "hm": "8366dbd4a848aac8ca056a227159df86"}, {"a": false, "c": "m+bY%;$~_|&h787#WXG&=n5,483`@^^FE9E$T)^aC{PL$}3r6zidiIGuf;-J#2^>jgO^U%oKAUzQ4{>`eL14-Y6?IssP%yfAd|ix^dF$W", "s": "dcca77b520aae734708c0876ed03e4a2", "oc": "eb47af1f771026c28553b287b01f24ad177825a326aef445a421572db58a79698e6d367a8db3ab05cd26ed027caa8676a634ce6c9596614a"}, {"a": false, "c": "mGbK7;2~_|&h$87#WxUl=n%7r@!Mke#bB`Y@g%4P?_&MZaZhOY{wIK]DaPt2nC6@9ugdf8Jtw6LmOO2~2$|fWs@?d;)=pV35AQ#4iCfmr6RJde>4^CHxLQc{q2,0bV^=?Z>lf9rIAE3Y", "s": "3a9a5e1e09369d50490e85cb559539d8", "hm": "15585dbdb8d2406f8675362ad8f22ce7"}, {"a": false, "c": "mBbKA;2~>R&h787wEXU!Hn0@4@`Y_I^FE9g$T{^th>8LR#3C#i7ditG#c6-%#2^>OgC^U%%KXUzQ4U>FeL_zBY6h0ssP2yfA5|(H^dFfW", "s": "f3b5e184f0b8a109f55bf83bde3aba8b", "oc": "fbe727afc61d23e21553d909a91cf40bb7d723a9c6aece95ad946383b299896937ad464ab3b7ab23c5366dd2a8175d3636f5ce5cad3e3bea"}, {"a": false, "c": "mYbKA;2~_(&hPc7#WXU!=nqH4C6`I)f|7Y0_2UN!sI%pbPDp%)I3uwD.q|46Acze$J3V=|FqzA_kEnI_(Bzg#6^>@gC^U%o-#Uz|40>4eL4z-Y6h0ssP%yfx$?2X*eZJ^Q@34nbF[cnpyxAxF1h=<*1CKM$^(%+_U[miXGic)hna?&L,:}Tz|S9gB(EI8IHNS]KJ3-sUN*`_cs~!stD`9yuc&8!", "s": "1a93c0947ae7985582139bc9773077b5", "hm": "846edb84a8c9ab32cd458331b54ed716"}, {"a": false, "c": "+h=J&o+<+WNTWTLaHg#Y!*MH#8-QM231oyoGQIzTv|H<7^Uo7Qci`^>1UcJ`*){On>Eq~PZP7,GuXyL,X*[s!#y!JpxT_u|4Ufmr+pM*P", "s": "d707a6b962730afe8d9c86169007e4df", "oc": "fb87a193c80ee93946087a86b99c2d0bb7d81aacc9aec443d9114793509b83698ea196dabdb3a762c5862f08dbeaa478a635ce6235be1bcb"}, {"a": false, "c": "m+b<&VE<]WNnWTXagg#Y!CAHcqi)6;AJ|ip+H|*^iZot|T&vf}PVyV-z1E9GnFJ^+xv$}oL6T}9~^-814C)8j_qYuX*Fv>J<<0v@x_=DyfeUx1>X}Tz1UzJ`#2{(n(Eq}PZP7]Gu{SL7^*)cNNYOJp|=_uuYUXU)ipl*N", "s": "f6b1aa31f8f8619fb55e4b8bcb371adb", "oc": "fbc7a119c8af2a301a43d106a9cf250b5798f335c647c445a1ba8b93b5e989698e9df69299dbab05c5062d9da2c85776a339ce66ad9edaab"}, {"a": false, "c": "&DbJ&V+1+>NnWTnc3g#M!CMH#B?MUqDEGI9$(IF8zFRu#iqc|I#ms!Wf96+dkZC%Dl,O$EWP~W)de42E14s2=.FrXlMb%AVRgZX1WCCH:#>3Blt#*1|HBa8j9T%5N($VTMwE-bW-o", "s": "9493d6473fe7945aa1949b617722974e", "hm": "6ce7de44f838ab32530a88cdbf48df16"}, {"a": false, "c": "mqbM9-a%XD696wx*cD#8)AgNq10*#327xtY*|p+DW?{t0VIEjnjfr(d5XNQ4npH3RLKHGq$QC", "s": "f20b9e9580bdf0d11b7cd116cd2f0c26", "oc": "6017ab0f6e1f26521ca35c060f1f2d5badd22ed906aec443b53a279645e9d9698fe10f40b163ac6515361d02749d7286a636c5cca11f41fa"}, {"a": false, "c": "mBbMt-awLU6>wSQJT15Bu8MR|QNZ+p&GBSYRGz{xBKRP(>$YGm-@6u=uO6_wt|8QA|ZoP=&h^#B7&1n9aoy)SUApcgZX1bmCNxc>3oltr*(+HBa9-awLU6aRJKxA9nXC8}v!_(qM>c?Qqr$d^$(ZI1p}><6B!qw7#_)*kFKt4RJ*YpO2?QqJ`Pi{_(s0vN<2@}uaTXz)|HKb4+xpB)7a;Y<+`w$SdOU}4`[cKg7`(-AcBj{JjWmprzIWqt<01cd^h(H|;ZBD=0k9``h`8OPcTs5t}Yz$VW,y3X1}.6FnhAWrR<*M{+-nozAcDuo97I9)&d61BWC]($:f1!U$ho1nk", "s": "94f380847927bcfef214dbccd029c745", "hm": "8261d58fa8d8ab32f3056d33bededf34"}, {"a": false, "c": "mBQJZA|9c2`{O|n?rK?7j)cv`Wv00XXK}S14_%|D)p?C8%D);V6W3&4_>[!|k2}=TLPz=hvYJq>=4(qd!ZP+nNi{rQ;t~KA&2bciB>7eX", "s": "d80bf5c9417d09ce8d7c478eed67e46e", "oc": "f727af19c16f2a3d15530e09d9f9247bb7acf5a4c69e44d5d98c689c156989cd6eadf64d39c3ebe2a538bd022f3a920637307e6cf22d41f2"}, {"a": false, "c": "mBbJZ:09c2`{ksnk>a?ej(cCHLjQ)QcK>Wlav&x~|)hiee5k*>Cc>Zkg!k((D>O@Lp!&E07YBC9SR{ZTg}77_Btj?q#%1r=Q6JO4pGDKT5L=OjAW-E)(M{J-nwzAccun97I<)D#6c}5COguC=r!U$hoQwk", "s": "3a7a555a01569d2e992e8410549562d1", "hm": "6707c4bba852b776f6721d51d8fddba7"}, {"a": false, "c": "mBb&=A!)}2`{Osnrra?Hj]c>`#)p?C83%y`w6kq&4h>M!|#2`-)LDz=hvYJqk?|Xqd!0_+jND)rQItYUN&!;ciB%7eX", "s": "43b925847838810f95d1672bc5f7b32b", "oc": "f5ceac1fc4cf24d21553dc06a91fba0d49b033afe80eb48ba53f77131591095faead324889b33b4505562c04587450bc4c25ce6cfda94199"}, {"a": false, "c": "m|bJZA|9c2`{:snrraTHj)Jg}C06Pttxegl<<}G$gyCIMg_q@mh[$o0>I%ajvoPhOZ*CXOY;nXOPU%6{hTyWA$^}yBgz+aLT`ouxy}Z280>S{vFWMxVofQ", "s": "ba6f99d6281cefe4db242bd1050a0b02", "oc": "7c64027531ba8219a3b1780d530ad3a2825874ce4c072f9bea21338d0915e78605aafbd4c55cbd9adb3ddd0e60dd3a88e645cfc6ba206b73323f6821e1128f87"}, {"a": false, "c": "m0bJZA|9c2`]Osnrra?H})cnL6`B*t#H7U22b|VZbk%~ldV4qB-2zjeLDzJWvYJqPI4zqi=^=+n~D{rSIt~Kl&!lci}%7eX", "s": "4dea034f0a74f34f65fcf71f6602da15", "oc": "ac619c4533b341a02be1d7f5071c2958fde807cfede2a88e443216e9ea6a82c891075a9a1f70384b5da3197f67d87433d4487dceeafe8c816dcbf84252538314"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (306, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&22H2TUiZT2gd8c9!_C+py)bLn3=6j+U;Now82E?UK{PZeB1c`?5&)_F4FdIO6B}evnr?^$#8)N|5&_uKjctBwxo};hUc;B5G9PQ6X7sebGV)[N*~Wl`LAjA3LzuAAEZu[3&>s_BSSNTrjo5QuIsBRw$lH", "s": "945ed6012747166d52c49b693e89c749", "hm": "8a6dba44b848a932c67e591ab4eeefc6"}, {"a": false, "c": "mBbKy&X2H2TU~ZT2;1H;bjwP+{>@y+wl[7,kCzp#2_XIu8rKl4|a~W6+vI)iB_+{q$Y@p@2XPyN2B%c|eP6`", "s": "998b9708907d33f4827c8816cd0f64c7", "oc": "bb87a4afcc217a52045db206a964250b976fbcd9cb7ea421e7ba6a9415b949698ead764af9be9b59c5d0cda2fbb85006e635376cad3943b4"}, {"a": false, "c": "!Bbaz&12j2TUi~T0td8c6.n_$LSdOl9A8{%tnR5LP8ak]dk*TWoplxt?8J@8jJ`+j?lYu[V`-KR3+M}S2G9DH>`Tz8Q$&UI`G&=n39gYfDh1W;<^)-V>TjwP+P;@y+}6)=W{Czo#H_B7u&rKl4La~Vw]NI=iB_SvO$YPpk2XPyN2B%{TePpuh", "s": "fa6c99c23674a3e069342d0b551acfcb", "oc": "b43aac6333b3b7c9a35e8e2612e9327519f9ff8bee60303a268d87d598588104eeac1f41a7739bed14b726dbaf40780c9b1a8708a31d66e67f9a18a1d7325977"}, {"a": false, "c": "{BbKU$<2HxTUiZT2D?YWw^vQRg?fCmpM_Je~7b*?b]!Od7*MT0qMW:Qz(X^,A|i+4Fh#B>?kn}Ar&I]4|h9_BKS`w@y=ZXYvXyx`^``-+f@.M.Z>xMaV]L?)?c%KqJ9:]QygEj$2Nd3^8sJz(e58e$?&hAZ_oNHeY^@#&Q*hFu^$|1#Bho)lmzGI|5NS72kG~dl7z", "s": "689379130fda8b5d82119b697521c255", "hm": "8037dbcfac0caa72e3703aedbb344f46"}, {"a": false, "c": "&Bb:WIPx0f}~GhIFHL5^K|YD{8)2(L(@9VOZ->csIwTMD>`VV6a}NV%qDmLo#u{_&w6+n_D8nB3h.?e9g]-WQLG(.cGCH(2^T7!~nx>$|", "s": "d40b97bb207f665e5671181a8d0fe4a7", "oc": "d6c7218f4c13ca5ea75c2c008be0230951d103ffc6ffc44504b1675740992e697ea3a6b8e933ae4cc5766d08742e5476a432ce6c8e9f7723"}, {"a": false, "c": "mBb}Wxvx0`a~:]oFvDHSK|+LVLVBENY!}[t,5-{>Q)|48N5+D5v`={DO||cAxQ=}b;yt(A@AX*$QW>-XH:Gi=2HZ^n8gIYs~g{C*(77hBGYnVDAZ_|qJcY^B#&Q*hTu^_7(f|hoElmzGI;5NP!2kG~rS7z", "s": "0a9a5d569fcd9100af2f8518e592dbdd", "hm": "2ab751b96bafbc788671131ad8bddbe7"}, {"a": false, "c": "mBbLWI6x0`}~XhoFvf#|KQ+,V8)c[>{EU,pZW>ckWQNG(kcUCHK2^T7Z[nxo&@", "s": "fc4937816d2e6107995b0e2bcec7ee23", "oc": "1bc1a111d8d82b317553bcb3a0fff40bb4ddf3a9cba4ce25a5b9a896059af964beada65ab9b366d5c5365d0284125479a0d97e62ad7192bb"}, {"a": false, "c": "mBbLWIPx0`a~G8oFvD#SK|+DVOc$eqR8^bMRfKew{$X@D%aU=uLdkQQ9)o{ch`OS@iCWw3Eau-8-P|AF?HN8JJ6[#_~q,_}:2M;4wp}h", "s": "fe7dc9758074585dd5642d56054349e8", "oc": "7c6a9c358ab34219a3008e193f5d118ab3fdae6a0a526855d01b157f91799e8153e2df73bbbac2a2da87b94792dad55ff2bd2412e24c3f3e470b42c8340d05e8"}, {"a": false, "c": "(BbLWIPx-`N;GPo[8DRSK|JDV6UNb%E^@1pnpv)V0CrKcuBCqS#2u]&wlV+_w8nB3hg?^96YkLQN)(knGCHx2^s7Z3nx>I@", "s": "3fdaa049697133316d78cc1f968ad3a4", "oc": "8c6f9c6e3f4be1acb1e1c6efb8c2258a08795172c5b35791cd291feee1a3f612b810012c85cff96768c222c991dd9add485a88904ab6f3d2cd1085a09ea33703"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (308, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "wBb>U1c4<5b9q|I44hjczv$KVYp^GOd5SqJM{UpOtvcFD-rpzNJbIFbJ_#8g6>>4JhnA}Yqg;J~zXCH0&~>@!QU;jo1iY1=>!td%BP)h0)fUgx(>_I$TLeje<|&m3tR50kkP?z)R1@Hj=DH#rF5=e<0}58>AfMQ%t`taK*iE%8Q=~zakgN5-;w$kz8_*QwelYEm>e!2", "s": "f45ae621d1e784cd511a34e92729c745", "hm": "d057db7a0848ab32c7d55a39f890de16"}, {"a": false, "c": "mBbLU1z4%|W9q|6Q4h(&;v|K{g>{~e9m`5r}4)XL(bYWe,-WGqH8&[whv5>Wizvh(xf(9h;kF{p+B>", "s": "890bc025807e30fe8678a216bd1fe0a1", "oc": "eeca1311c01f3a3219536c07a91f2a03b098f6a3ceae5497fc4a178317c989e98e2dfb7ab933c3f5cd312e851b2a544666b5ce64ae77c316"}, {"a": false, "c": "mBbLU=cP_Msvq|T44h(h;v|J{,TZ1+!h2L`pi*@MIA(KAWE26PvSNIeN+nBBaL3t`O-dL<1;`<{r2UH%w*bvC(nGn`dHo9fQJ%6I)m|ANzcy^dAfMQuN`dCp*iU%8:=OPakT$5-;E$V~8_`^mG-YEm>!8i", "s": "389a5d56013f1d00a92e855f3490e1f1", "hm": "63076c5d38d2570a48a1161a2dfbdb67"}, {"a": false, "c": "fBbAA1c41)W9q|vWL8(&;v12hg91Xeim`JOZ4)WH6kgheX-wDQH8NDw|vU#G#2}y!ZICX~kJ=GMEK{UGm5?c5*WiwvhPxf(a(;k`{pkB>", "s": "133c8a89781c610f608b7bd8cdb11a08", "oc": "25c7ce1ac86f2ab265b3ec0685cf740b87d723a0d0a65a45aaba6893d07589698aa7feea7219ab85c5a6bdac4c20a47b5c35ce6dd5c749ef"}, {"a": false, "c": "mB{LU1b47)W9q|:4Xh(&;v|K{B(cAY@;@4_eh%}5;rHQvV+KJh-VvUiIy)`hox%|InHIJ|Vf^?NpV+9p6hM#4Oy>jgb(POSHcKL&k~T=Fy?X*yf!_V0pEh", "s": "4a69198537744970db1420d5058aca48", "oc": "106a9a6532b20e19a40b8e344deaa0482f065161c639e7a93d678a9250a60613fc7e9074766091837c89ffbc7be2173e45fe63a54359583923a9e9f97c04b509"}, {"a": false, "c": "mBbLU1c41~W7q|1N4V(XOL8K%6BWWiJXM;%sXpovR3xeMRRryP#:}y8sIC-1kuwJMB>{1Gj5?55@}VzPN8xf(NR;ku{p+E>", "s": "dab8689d7d782d6d6ab0e74fc6a1fc44", "oc": "37dac86d3ab340a37bb1d8234786495ccff907cdf487a091b5c82de60b8db47bd3c8c74ffd9dcc075b9cbe3f1dfd587dd41645f70c0871631646f9693640d669"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (309, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbh%Ks*MdKDRxsz>I~keTZAcYM9b4|~fb~&D>=]|V{Dy!gI0-uESoh1vX`,DVWK}LQ{zT)b?N2)s~o|F-)C)VZ$cQn3gHK6aW_Imq>t*l`ui2iiJQ>lyrXQ9$7-k+2$etm7#?#K4Sde?7IWtiO%6dKy3qG&U^U8AUq1d$rLMF>P%G%>Rmq|o~0(T]seZt_Or4zuDAT&_@{_", "s": "94b3d607afe784c7521a0f697809b239", "hm": "5a883b7406474be2b6bfc60adfbae216"}, {"a": false, "c": "mBbK%Ks*MeKDAAs|I}ke{ZAcLZs.pqV$l?=C-csDk)fHKu3D4sHX**f8x+;+cok#2{p`M>on8TdKv!5a%hP+o:%ld_F)I<[8zfVUj;!FukFk%tUqTdA4O<1>PqC%>{mq|oF0Ctpse6>_Yr4zuoATRf@KZ", "s": "3a9684f6c1609d67a2be121658961254", "hm": "1a9ffb07f3d2b7afc6701410a89ddb17"}, {"a": false, "c": "mByM%O+MjeKDAAsrrQ~kesZAc8$p9%O%h$OUm@mN+n39f89=>-k7l&A-zbZG#2`EBz#$6VJfA#Zik", "s": "f5b9b78168e8370a967b5bb4c445f62e", "oc": "fd4ba3b8c81f7a3c985f2f06aa0fb40b57d6f35946aec445ad6a37e31599dd6789ad224ab313ab45c5365d00ca2a2f74a6c2c5a6dee74ae7"}, {"a": false, "c": "mB{fC;9*MeKDA]srXIXk5TZA.Z;fXP%Q;QO^EF7-[})37x;8`AVSw-TaT|05Dr@OK3HhWOsWJPN9e5QVsk}jcY%{LXK6r6#3>}GrY0&>}(>615-rpuh", "s": "49ae43b87094e2e019412bd8efeac131", "oc": "6efa9c6533e74509a328484a6272760b196526d4a450d1af45d1e6f31f77b0d65069526b64b50390a1778226d2a527d7617d385f677eed6548eaceb1554a8f05"}, {"a": false, "c": "KLbK%Ks*MeKDAAsW>I~keTZAU6xzS_2$KC1kce`Y--]BaG;WYK#q`Ehz#$NVuKj@!wA|C!AfBZrrG%_DCHEv$cdIz*ANZi[", "s": "9dba400ffd4623d46777776f66914e45", "oc": "f2548c24536541a3bbe9df34b7dc3a80b892ee30f73bba1475d22cd6ce34be7f56c94337fdc01811caab0a1235c2cc8f69bfc3b45322cc0607fe1b889559ac35"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (310, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": ".BjY@xyrtAQAsNndIVmO>}IV@Y`De&eH~aps)IX%RsOT!ondLDle#e%BR$Gv&);Nisho}HE+ykHX^>^:ai#hybXKw<__Kv0Ezy", "s": "9093d6714a67d45d52127b2977c0d345", "hm": "eea9d24a9818463dc3eb6a7dbe4cdf13"}, {"a": false, "c": "mBbK(pyr$2Q)CXUKI-mO:}Iwu2aceUg9XV?283M-t0#Br;ei<3WFO#g2ER<]qfogc>MyKvn%Ay", "s": "590297d5287d30ee862ca311e02f24ab", "oc": "9bc7a11970ff2a351953bd1fa91f2e0ed718ff49c7e07445d5b347731ec98269beadf6498983f3455a2e3d027bb75166ac35ce6ca17e9a11e534184787d8bfac"}, {"a": false, "c": "mBbK|Gyr$w}ACXmO|VmOi}I{kLJr=wKvV-Tn15TWHKc={9YP-XuChcsE?DZTtz`HeA3^>-G^Wm8T=`6K`{?DB2cR}A!JPDzc*_Z{%^1GG@`xpHA&Cdc{GYltk;F|WWVzI6{=fXB?t.cy!(2dzD!=L+nV*S", "s": "eab8585601d5984f392e8570547862d1", "hm": "6ab81abd78d387ef6d741a8adffdfb01"}, {"a": false, "c": "mBbK(pyr$AQ3CXm2%Mmfh}Ihu96ceUg9XV?28@M-ts#Br5^Ir3WR{q6YogcYM1KvJ%zL", "s": "e6b3378b7fd8610f99d04b6bc397aa5b", "oc": "facb511f0a1f4b5d1558bf02a21b2ccb60d8f33dfaae8445a5ba97908996e4278edd6a783cb3a845c5366d32732a54765735be6cab37ea0bf5d10f1f87abbca9"}, {"a": false, "c": "m|b<(pJroAQUCXmOIVmOipIhu|tZ>>O:0vKyoL-0b##p^GXA#dxWCrF$R7Bk)0K=lm$1F2cf=r@$M1<Kvf%Yy", "s": "ca6fe477b62492e2d424be08d00a9ac2", "oc": "fb989c652d434811a3e02774652aa720220ac27953f1941ea5b02843d8eb82a577dfec25bb48a52e992bcd74fea9ac87c5b09f732f8942ab3a947b4b480e90cf"}, {"a": false, "c": "mB|K(pyr$AQACRmOIV-OttI8uon`>}Ff8}7NkYHo>^0B=+mci[ui,l(YMg<PXJ?zy", "s": "05ba0249ad7c29645e7c75e5848fb347", "oc": "fc4a9c0836b045e3bbe1d8ac497ddd3b715cdc09e782de06b977121d638b64dd05f81585b0bc15a296bf9d842ce9ecd087efec0c31fe35d05473614ca05048f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (311, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@Vz%dN?0}|;gL1-JPgcmqX>ghC0+~Z}G?vN)O5fXJH|(`V*=i}Na@z{OfN`tJKs|ZX(6N>G`,WeVplL^$zO*^J`x7KRuY0$W#{2OV3F-Z2pNpE-CWCgM#Q{{D^0Csk=KwcvmGK=wXj973J#%Qti=^fUgv`o_znzD!=v6IS)7m#mzsQULztUH?^@=|ERR^{}", "s": "190397b52077002e867ca91deda824a1", "oc": "4ac7a112481c2aa21578bc06a81f241bc5baf364c09ea246a5a8b79f1535b969ceaab24a6559ab6535365d02175a1afba835ce68adbed8c8"}, {"a": false, "c": "mBbL@{^%dN?0W$mg)1-J1*cmqK@;r|K*|T&!~f=;Irif5#bB{wQ2m?T?MV1vb[M{q7KJ!)IM{5q[VEj}-wUOWaz*193KGAhNSqAj&?iC`&BMvB41*!j6!A<1h!E%%kI*JY&%}thw4uukUa&EwG+kuVpuO", "s": "399abd5ff1a09520a62e855b5094d7d6", "hm": "6ab35db35bddb8ad767517fad81c6be7"}, {"a": false, "c": "mB`L@z^%EN?0W$#g)1-EP*cAq1w18I`%>{D^)s2N=Kw-vb|qo_{uNXP27;f9U_>D}3MgsM|6wY5xRb!-8|E5VlSf`85rQX|7W5&<;H#nakAjcNO0z~8Dad@nu8T~!n5zy", "s": "e22ef960367ee23276612c1a751acae0", "oc": "fc6a6b6665b34274a3902ff9f6d7114955a48b273969eaf4d970638747be53fe8ae319d3129f93ebc3dd42b93ef63a48adf5e6a98601b5a3a8ec0aa2063fbaaf"}, {"a": false, "c": "VYbL@V^%dN?jW$;gR1?JP*c`qbX0HB3oxjM)z&5P&YztIGiA$|Xx3CMynh~1C&!m2n]FsTDNA0-z`{5#cjZg;2!YnE4)(~DtWX{9&zby231V+JAQ#BdCfmEER8dt|`-Z}xLQgnq5A0{b^??L>FyL_zfY3h0s%7r@cMdI0>^`Y@g%m&>_;qLRZDOY{yI@N|a,}wdC}n9ugdfD[tw67fOlA~ig-f0O5Ldb)&aR[)AQ#4ibf:E;R8dh-^qZpp+Qgn+2^0{V|?}Z>lfCrxAE=Y", "s": "3a9b4d599e3696f9a59e8ff15cc0d281", "hm": "64875dbd78d2277f8674162a7d3a1b7e"}, {"a": false, "c": "mobKA;2~_|&h7{7ncXU&=!H}#vzV_BEFEEE$Tp^Uh>ML$Z3UauidiIf7<6-J#2~>O8h^U%oztUzQ4U>FeLhz)Y6h0Bsq%_fA4^iHZdFU&", "s": "43b7348aafe88fef955b6f5bc437aa1e", "oc": "92c721e0c8c02c771523b706a911d43bbd2863aabb70e445a5ba67d71e9f04358e7df64ab9d39b49ccf665097bfad48fad5cca6ebd2069c6"}, {"a": false, "c": "8Sb^6l2}T|&q78?#=X_&=nJH4C6$I)N|q^0_iUN!sIey|PD^%)!3Ad>Lo,l>DSFTaHqX_T`5os}gsiSo5q;X)QBZA1T~B8QPdI7@m>5KFXe9X!>4Y`pwuh", "s": "ba18c5b53244e210db2af6d242eacd18", "oc": "f76a906604438b15d3a77e160e54330fe17748b45d33d1d485aeff94649d285d22a1b9a7ba75d58b8dea4e12057d54c9c8c901e586082e22b5af23e22492f8a1"}, {"a": false, "c": "mBblA;2~_(&hz87#W,U[=;qz46KPW)$J3a=BJqzg61$nIG(>iWA_^5OhC^U%oK#UzQy->^eL_zjY6h0sEP+yiA{|iH^dF$W", "s": "38aa0d40ed7023d83378471f168aa614", "oc": "3c3a9c3513b751a3c1f1d77abbfe34579a4c92c1c0ee03bc0fa2a51eddf813f0d5816430f4d2615a248c62bcfab907da8583382a42843d1a081523e95446626b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (313, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB4r&V+<+W&;WvGaHgUY!kM{#Y|js0}^_J24&3#Wjz$KGw1<3cS7(SQCe>xd{!nqzdpoVQ{-8ZJATin?:>o@`(C>t$?2X*q8w1VfJ`c2{OnAEqHPZq_UGu{SL7Xq)sN#YsJ@xT_,u4Ufmr{p<*V", "s": "d60fe8b520bd30f5b2be1f16ed0fe6ac", "oc": "f14ba11f081f7ad9154bbc01aa6f2408f4d2f8a9a9a6c44755ba6712559787f981d0df43f9b19b56d5366dca7b5a5496a4e5ce6cb590457e"}, {"a": false, "c": "mB{JGV[nWT3aHL#|!CNC#Li)6dAJoLZas||7iZ,tVT&vn1u,!VCw1[9Y|MgiYI~8x[96Pzth(-87^l)8j_q;8Xd+v>%<709@O_=Kyf.U*dAj}Fz|x9gB(Ma8JHBSg|63-sUv*QIcs~!stk_7Luce]!", "s": "3a94535551399500a92e8a1f44e2ded1", "hm": "62c16dbd79b2b37f96851b8adefadbe0"}, {"a": false, "c": "mBbg&X+<+WNn$TGaH6#0!CzH+8-dM231a9;4tIY`v|na6^Uo7QSd`z>15c_`22{O1(Eq~PZP>^Gu{S)DX*)&?ki!ZpCT5.5*UlmrWo|*!", "s": "938fed301898ea96751666dbc337aa2b", "oc": "fbc7211fe81fca39d753bc11a91f25fb77d8f8eec7d7c44e4b1a8a931f9989198e5df63c64b3ad45c1390d7268715476ade5c568e7aedbcb"}, {"a": false, "c": "mB}J&V7I+EsdWfz64&k<<`bbC2UwC_BUCTbt0`rWp|]!", "s": "4bfa992f45a843446e7cbc1f56313a44", "oc": "d5fa950533b948aeb541d4ec6ccccc123687b1e9f6551148eeb5e74198f173a364d4ab92268e5f7cf523bba2335706f1aa0a7016553171a08d8d3edad2d8a146"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (314, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m5zK9-aw|U6}KTDWC%o3u9yEKb5W)du4J&1Os2=>FKXl[b%mpZgZX1WmCSxJ>3BltI}({HBwDj9v%5N|yVTMP(-ef1V", "s": "94f3c6a107c7847d51649f957ab9c745", "hm": "80a7dbb4a848ab32a3baf88d0e4edb16"}, {"a": false, "c": "mqbM97awL:6aGw2*idM^0AgNqT0D]327xtY*3p+DWbot0VQEonhDS(d5O6K4np0aR?^{E<$Q+", "s": "3aebeb55217631f2807938c6dd2fd0a7", "oc": "dcc7e11fca1e2ae21711ef40d9ffb90537bb83acc8aec14ca3bc758ad5d9877985aefd46bcb39665cf3664822b2a5f78ad353063ec9e2118"}, {"a": false, "c": "m]bKhHawL46a3LQJo|}Buj8$|QGu+p4(eDYRGzfxH9IP7>$-}m-@6u=+Og_wtBqPy|h,s]g$^VBNc1>9aoy)S_ApHN1X1W-CNxJ{Eelt#*(:H_a5XNQ4npH3R?JfEq$QI", "s": "f3bed7877e14664f955a8b07c3f7ff2b", "oc": "fa0171abc8114a3219539c06a60f244bb715c35ac6372515ac8a64831d9989a9818dd14ab9b35b4f0b306804b2da32763696c56cea9341f7"}, {"a": false, "c": "mBbMX-aw{U6aiyk6Ih*$^||;+}pzuEg%1*qKmMWQ&^x*^uL!drIfx>^s|576vx)Yn)ytWvo_(4M>cSHqr$b^$kZI;p13Gxcfpuh", "s": "448a92753674ede67b4f2d78048acacf", "oc": "fc6fdc6ab3ba425fa3fb8e0fdf392a60f8caa96ab2ff9bdabbe80c2e052a816baf711d9b64d58da7146bc0cc91d043418aa4f12ec8f96ad86a7c03671a8d3e0c"}, {"a": false, "c": "nB{M9-awLU6awt4RJk8LOIXQq6+P%d_9s0vN|&V}uK:bzy(?KjV+xp?xMLOY2+`t|Sd>U(4O2cKw[`(-14XjD+j{1pRzTWjt}SSyw%$ZKp?u(#62;26i3&)h>2,|)2I-TGDz=hvWJ84I6qqd!7=+bSD{rQI!~KA&@;ciH%7e=", "s": "d60792b7207d34fe8377ab7b4df6e4b7", "oc": "f3c0a1ff7fff213615cfac07aa203404f71833a9c6ae5445afba63f81e75e63e5badf64fb953a445bb963d0a7ceaf41676b53e6b0a9f41a9"}, {"a": false, "c": "mB1JZ0+9c2`{OrS9ha?HjNcvZ7jQ)aqp6~lla&7~S)|iIe53H>Nc1Zkgls(`D>c{LbirZ07YBC9SR?ZT8}77_!t-aq#%]NRK67OUpcDKT5L`pMEWrE)*MJJksIQ,pDJn97Q9)DC61}gC|g$Z=r!U=ho1nk", "s": "1a6a595ce1e9ad0fa9238f3b059dd2d1", "hm": "0ab70db578d4177dc449161a48fddbdc"}, {"a": false, "c": "mB$JZA|9+|`{Osn43a?xV)ov`)vcT{IKDSSPw%$1)p,C8#My,O|W3h4kha!|#2`8TLY==h,MJq>IeChOgCCfDY;nXOPUw6{hT9W9i^~yBgzCaLT`ouxyxtM80>.Cv`WMx|pyh", "s": "fa2b96752854e2e0da2425d60febcac5", "oc": "fcaa6caf33b3421b53d15713534343a28228707fe7075ccf36a43ff8db24ee51853599ec05f56d8cde389d0830f10d98e6744453ba8c377d423f8821aa241fd7"}, {"a": false, "c": "mBbJZA|9c2`{Esnr!s{Hj)cv`rLBDtS>7aH2q|VZbr!flyKmvBO2`-YLDz:hvYJq>64Xqd5u=+uNDjrQIt~KA&!;^iB%7eX", "s": "35b75d4f447823446ed2e41866317044", "oc": "e4aa9c8886834c2a7be1d3efb86cf689f5681588e7577a09e45f9b79d50a62187707f19a0c7fb55bff03661777d395317ce87dce4aa12761b7fcfb028c738630"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (316, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbsU&X2H2TUi~T2w82]?;1y;<^)zg>Tj8K+P;@y*w6)=8kCzpZ(tXku8UKl4La~V6xNI)iB8+|O$Q^p.2XPyN2Bbc6eP6-", "s": "d80f91bf207430329274c516ed0f7497", "oc": "53c5ac0fc8101a317053b5acad9f8602b686fffac21a042e5bba9763039d81698b3db64a5a03c345c93f6b8caa2d57466e180e6da19f40ba"}, {"a": false, "c": "m}bKU=X=H<$Ui~T2,.8ck!,{$M}Gdx9Af8%tVH>x!AakXdk*TWopl^t?gJ{p{J>+j?lYf#Vxl`An8b$c_I=G&*.#9<%--KGtMAStTOjoi;1W9!^)`g>TjwP+P;@ygw6)q8kCe-#f_Xku8rKl4La~V6x(I)iB_+t=w@Ppuj", "s": "fd0f2f75a8784a95d0442df853eacac9", "oc": "fc6a9c6443bb491ea0c174a59c09a04d3d233f82ecb030862e6df7f7ed018307d8f71324a07159edd477224bb0c3940c72bb8ecf064d6de79a9416c5d9201989"}, {"a": false, "c": "mBb}U&XYH0TUi~>1Zd8c4!JC$6I`b2b#*~Ag^#;&;^Bao7`%&N!Q_pku8g>l4La~VN2knzVr&I54<}rlBKS`w@y2ZxMW=1!?w$>%KqgWL_E{gf>$2NW3!89kzck58e>?Q]AZ_oqHoY~d#&YwhTr[F{Of9AoEfm}@.r5NP!2kG~r07z", "s": "9309d6e10fcb845352643b697029c741", "hm": "806d6b4491f1923fb30a68ad5c5adf1e"}, {"a": false, "c": "mkbLpLPx0`a~GhG}LD#SKz|Dp8Yc(LZXBVOZ->vs_kTrDI`k76a}NV%TDMRi#2{_pwl+<_<8nBShH?NCk-kWQyG(kcG;HKq^hDZ3nx>$@", "s": "d9cc5d95217d35f48678a8a6efefbeaa", "oc": "f9c7ab1fc8af2a32a54fbc041915140bb7e813a3c654c885aeb9679d158486a22ead161af983a24fd4046d022b0554c61613ce6cb99fbf4b"}, {"a": false, "c": "mB]L{IPx0`a>GhNFvD#S>^O5JLVl1m*Uy1Q_|%8N1OD[T`={z4||cA]Q=}b+yt(ANAXM$Q2W-YH1Gi-2Hn^n=g#YNiI{C*d7KhBYVnx6AZ_oq@cY^o#&Q}hTuI_72f|foElmzGI;5NP!2kG~Hl7D", "s": "3fea290501b6ea00a9ae851253a8f0f1", "hm": "12ba365d78ebbfb86675165ad8f5dbe7"}, {"a": false, "c": "mBbLWIPG0taFjh[FOD#SK|rDV8)cRL(X7VOZ]>KsIVThDa$@", "s": "63b9d7f7c11cf00ffb5b7b2d9353aa8b", "oc": "cac6a03f88112a327e76b108a916f50bb9d8f3adc6a4b945b5ba67031e998554e6fda542b9236e945596dc02752a54770645ce9cd873d3bb"}, {"a": false, "c": "mWbLNIPx0`aEyhoFvD#[K|+DV7C|8R*Cic{}]X>O&feqR8^WM;fsewr$>@D%-Uo5Ldk;QT)c{cbZbU@=Ou)?p>uwVMPSAF:H%8kJOq5_Tq2=}<|(z4Dpuh", "s": "fec095753696d2e8c62481d863eb8b18", "oc": "acda45e533bc421db361cead224a113db367ac24fe6c6f8cd0331d7f9fcbba2d13936f7cfafb1803a4bb1940ae1adbc0d6f726f2d94cb2b9470a22443816c548"}, {"a": false, "c": "mu5RWI*x0`a~GhoFrm#SK|6eV6U]b%E^11oxovszsdV!c{BC5S#2{_G7c+u_w?nBbhg?v9g-kW%NG(k8GCHK2^T{Z3nxq$u", "s": "fab9004f45f82c146e7c671fa481b34a", "oc": "fd4e7cb539b3f743ce86d7850de65473e0da03e265d384c13be9105540abfd92c8e21cecf8fff26467cfeaba61b74a31fe870d99b126f19cb573a551990aa182"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (318, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLY1c41)WQqJ>44h(e;v|K{Y9^GLd5D[%|-YtmtgJF8-rdi|!bIFbJ)3:g6>q4Jx#6gZqg;J~zXwsw&~]@%We;jH1W6*=>!Nv=VAeBDBFNh0)fUgx?<6I^TLdjec+Tl|b3l{kkPVzgR1}HAcxH.rF5b;~0}58AAfMQ%t`+Cz*iE%8Q=!82", "s": "9813d6e140e7305d81c29bc87729c745", "hm": "856721bba14fa9bac375ba55be4eba0f"}, {"a": false, "c": "mGbLU$c41)-9q|644h(&;v|M{8(5Xg9m`5OUF)|L??yhe<-i-qH8&Dwu:}ENR2}y8sIC-1BJwG", "s": "daab97b5207d30fed18ca816ab02ef72", "oc": "fea5a133cb5d2ab2ae09ba87a55ff42bbed8f8a9cc0ec440a5b7628519b888658eabf84499b31b45a6c26d023929c47516a4ce25d177a425"}, {"a": false, "c": "mB%LU1c4*)W9*|6]zh(&;z|K{G%h1$!.hL8eF9v|-d^<1;`<{tm3Q%w*b:ChnfrHjxV+C)hoPvUi@y1shx,%(@Y{IJ|&0|?N9V+9b6hMNtOzojjq(^O;HmOc&kDG=Y&?X*yf!_cOp|h", "s": "baaf7f928077e9e0db262ac85f87ca58", "oc": "8c6aec6333b34279832b8e1c557aaf5883045154d03a356f0de0895540abf41efc7ec0ae768b718b7a760f3c7cc5c39438feff33415f181bc9a9f1bf2988bf05"}, {"a": false, "c": "4-bLp1i41|69q|64|h`&;vgG{6PvWiJ*M0|b4|8fb+$D*=F@t{EFHgIocuESoh3vX`JD2F}wL{{hT)bHN2)sXoVF-&u;5U$cHL+PHK64W_Imq>t*LJu~2iimQ>{-r6Q9$c9G+Cjetm7:,HK|lq.?(IWkk9%6dBy3qG&UmU8AUq1dArOcF>P%^%m,]F|o~0(-gsA6t_Dr4zz:AT&I@KT", "s": "95731621ede7845d581c536979efc545", "hm": "0035b0e4a841ba3dc30f6acd7e4e5ef6"}, {"a": false, "c": "mBht%KsQMeLDAAsr>Ve0eTZAc$$p9fO%qEhz#$NVudAidm(4C!AfBN(rGAzD(HE5$cgCz*CNZia", "s": "d9619db4a03df04e86718b41edeff695", "oc": "fbc4417fcb1ab73245a3b273f9cf260bb778f3a9cfa58441a52e6c93159969198ead844051b34b35e3a6bd023bec54e63f05ceefae17c997"}, {"a": false, "c": "m$bq%KatbeK-AAsrv{~SefZnc.Zs-p>&$lY=C-caonWTdKv!5a%&P+7A>ld_F)5<9~6f1rG>!FqkWkGkUq1|AtOMF>P%C%4Rmq|o~%(Ggs*kt_xr4zuoA>j_@K~", "s": "3a895980a1239d00b92f95ab5490d2d6", "hm": "6db75d4d80a2b772d575668ad2f1dbe8"}, {"a": false, "c": "mBbK%KsgMeEoAAbr;{iGeTZAc8$p9%Q%q$ur%9m++n3jd)9?;-u;l&A-BfZG#2`Ehz#$NVuI>keTZgcCGPIP%Q;QOtKFX-o6MqY)ylx;82tp`hPTc2z0>DrVO?CHNWOsRJeN=e@Q4DkZj+TrY05odx>615-rpuh", "s": "ff6e69b636741213db248e4805dac9b8", "oc": "dc6a9c6533ff4b79a3c0d82a42d2762b1d6c2c03be90e1e648ddda80988794d920f3226b07cef3c6dbecd2b8330c2244417d7750870ebe62f9dbb3c8a2ee8755"}, {"a": false, "c": "eB=]%Kk*MuKzAA,r~I~keTZAc6G@~_AwKC1k~e`Y`5p&Ca;cYK#2&Ehz#$NV2<|@xw(4C!AfBZq4U%_!CUE0$cN!j*XNZSS", "s": "3db2004d4dc8b10465a4b919e68c0387", "oc": "fc9a91f133b341a7bde1c03ff9594796bf92ea2af6357390957dbadbdd3583a20c31f3a7ad204a19cae45a4bf5cb49fc210649bddb22ec08c97e1b18b552bcf9"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (320, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m=bKTpyr$AQACX;OIVmOZ}ILuY%De&%Y~gpR=^XvRaXT!ondLLNd#e%B>uGv&[)!3#vuVPS7W@apZ7?!TyVGqHX7rCe>f@e%>;Nish;hH2XykHX6za5)F,hACXmOIVmOi}Ih]LJr=wKvit@z15T2HK9GfLSK-w5CkzPE?QZqtZE`IA3`3-KzAaeT=`6b9{?DB2co}A!#)DzI*4|<1^1GO{Wx.gAO#dc{G*;tk;F|;6r<*+{=fXB?_zMyh(2d:D(=L+OV`S", "s": "370a685601399d00c12e850b549ccf91", "hm": "62b0e39db8d581750685e610d8fd5be7"}, {"a": false, "c": "uBbKupyr$0Q4y#]OIVmOi|Ihu96neUg9$>A28@M-jm#BDa`6a10FO*d2EX8q>foScY{<<!+;Hniv7j4I", "s": "ffb93579743561f095426b6ec337b19a", "oc": "fbc4a51fc81f2a3924d32e0cbc1f540b07d8f0a90eaec547a0ba97937099896a889f36cfb0536b42ce36630b782a54869531acbcad9edf14e533da9fb8dc7fa9"}, {"a": false, "c": "mBbK(pyr$AQACX}OISmOi}IQuBte;>O?0vKmzL-0I+hN^{)A#dKvhPPF", "s": "9aaf997518d4b7e0db2f2dd705e6cac4", "oc": "fc402c6539b39a19a590dc56edbba172627cd78d59fbfa17b5b8b83233e18ca98738f450b9431c3c3fbfc194f4a91e61e12922c00d7eb22b3fb77d6b4962acaf"}, {"a": false, "c": "mwb-(pwr$AQACXmOIV~OO}Ihu6n`j}FS83O>74Hg>^r~=jmc!yufk@(YM1doTG{(JR^=bBK!+;7>KvJ%,y", "s": "f50aa34fad7c93f16e7cd11fe638e142", "oc": "fc6a9c951d01411d4be71831695d823491b235aae562ee1f7076adfd0f8694ce62a1d789b3d706b6964a0b6f75b8ca103e08b4073e916030ab786db100b028f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (321, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbH@U^%d:P0W$;g)19&h*cmqX%;KW0mKZLu?lNn$gaX_b|b!Uheir}a@z{OnN`tToG`HWOR|eL^$zO*nJ+x+hRuY0g>#{2:6?~-Z2rNIwHCWCEDOtHFg=d-5_PW7${FiM<41$Ej30A<1?!a%%&IE_YI1}w{k=uucQWIE+R+kb(puw", "s": "d409d6110c5784716a8c9b637029c74d", "hm": "a73cd0946d49ad36c30b6e01be4f0f76"}, {"a": false, "c": "m6bL@V^%dV?0W$;g)1-aP*dmq8wXtIgIp{D^0sq2=Kwc~$pK1wXj}73h#P{r#2;fUgi1oHlaz`W=okI0)7m(VVEwU7atUh?^@>oIRR^HJ", "s": "d909773a290d3fd5867c7016550934a7", "oc": "2bb1a3f2c81f56321556bb06a01f2e0bb948f3a95d6e4595a5fad7931d99c96a8672064039b3bb4b6d176d027b140076a6bf4b9c7d8eba18"}, {"a": false, "c": "j^bL@V}%]c?05~Dg)1CDP?dmqK};c|K&qTV!~f=;IrFc2#wK?wQ2^^TqMQ1vb$MdidKg&)vMJ5q7o6yq-wEO0au*U9aKGlhNSrAja?iC`QPMCB4V$Ej,!A}1hmE%%1I5-YIE}thw=xAcU|@6wG+{8Kpvh", "s": "159d5d5601369c35a92985cb7790d2d9", "hm": "aab75f7d78d2b7cf81c8c612d37dc9e7"}, {"a": false, "c": "mBbL@V^%dN?0W$og)a-JP*cbq8w16sgM^{%^0s{bL9wc,$GK=`MSL|3Jh%Qi#}^@Ugj1or9azDf=oJcS)7mRVzEQ9^itUx^^@;o7RR^Hv", "s": "f325e78178b461229c2aed0bc338da2b", "oc": "fbcd7142981f2a069513bc0bab1fd63b2275d2a98d5ecc45a55412941e49836b8184f641eeb3024585e643b27bfa5126a235ce5cae3eda18"}, {"a": false, "c": "mlbL@V^%dN?mmW;gv18J4*czqBo_K+`*O*|q[X{uNXP2XSf9Uacc`6L0tR|XwYaxR4!82|l5sl=f`rQ|Qk|PW5a<;HB2ak2jlNOwF~8Da]@!uET~!C5zl", "s": "da699985b67d32e6d6bceb5805eac3ea", "oc": "ae329c7d3fb34c79a301380913e7e14c598f81269ca9eafbd1f1b32472e75d9ccfe0b212fa92a075c306c28915fefa10ad58ed69863495ad68ec0a4359bfbaa5"}, {"a": false, "c": "#Bb!~;c%dN?0lwMg)9-JP*zmI6|0@B3o?jM)H]5-SvztZ!`#HU#e^fUgMNo_$VrD)=oJISR7m(VzEQU^ztUh!w@=o&RRzHQ", "s": "6dbd00afddd8b2646eec671f6487b244", "oc": "8c696175ec2091d62ef5c8230c80f200ce0b59e075d97a90b8b349c29a14100d887fc2a3720681c5260b56c6310907bd0c4eebdb59930d8555bc1239d75a0a07"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (322, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "PBbCA;2O_|rhS&7#WpU&=zqH>Yolk<%e}K}?Z~86dK=CL!H|[4+!Ypq^*1$NnWnqSL3yaQ@WgNMmy94mXuT~YOcj&nB7fBkGiA$|Xx3CMqn3F8C9!m8UvFsTD7A@Osnv5_N&ZV;2kNOEG)^5DtpX{8TNbyQ_1]+l+Q44i@,mETR8de-7qv}xLQgnq2A0JV^?sZ>l80>xAE3!", "s": "94dcd40804ed852d92a09b69a729c430", "hm": "8067d684a84eab32fc056331e06e7f15"}, {"a": false, "c": "mBVKA;2~_H&h7X7#W7U&=n|H48}E_I^FnXE$5x^Bh_*L$Z{Uas7diIG8f6-J#2^>Og^^U-rK(U&Q4U>F[_4$-Y6h0ssP%{fAdLiHNdF>W", "s": "690e91452075300ee5eca8d5ed0fe9a7", "oc": "fbc2a18f0d720a338553bc0619187002b0489aa9c2aec93babba6993157a6b99bcddf643b9b3ab85d2366df63b2ab2760255ce6cadfed4fa"}, {"a": false, "c": "mrbK[;2~<|&s787#WKU&vnqH{`H@g%m&?_;qL4(h2Y{y^K}|xP;2dCan4qjdf8Jtw6L7OO2^2$c!?OnLd;)=abZTAQ#7fvfmECRp7e-4q?}xLQg{q2A0HVu??ZI|nCr|AE..", "s": "3a0a545a07969884492785164990d2da", "hm": "dab75d4d6c4267797675261ab8fdd2cc"}, {"a": false, "c": "4CbKA;2~_|&<787#}X2&=nq;4>L|_I^FE9E$,x^Bh>*Y$Z3y{iidiIN8fL-|!2^>OpC^U%oK+Up$;U>FeL_a%Y(h0ss_%y0AdkaH7dFLW", "s": "f6b33e7173186703990b653bd484aa2b", "oc": "cfc7ab1fc517c432d558cc0679102509bd38f34dbc00062ce87a6795a59d820920ad66fdbdb4a155c5366d322b4a2876a65afe6aad9e1bca"}, {"a": false, "c": "mBbKA;2~_|&h7WF#WX8&=Nq[4C6+FeL_z-r6hl=$?{Xme<{>4iQVDcPEg;}0{ZH_QR+MnCF+cn%<}AxZ&QP<*1CYM|#(%+xU1muiGicwIXV<&LAaZTi|H>gB(MN8=H!SgKJ3asUN*`?`s~!sqkH^quOc8!", "s": "94d3d671df07845da21c1b6c9729f625", "hm": "413f9744af4eab02c0354e3dbefedcb6"}, {"a": false, "c": "mBbJ&V+H+WNn{TGaHg}Y!C#H#8zdZ+31ayoG*PzTv|n<6^foJQSi`z31UcJ`#2{On(Eq~P$D7Lqu{SL7X*)sN#~!JpxT_u?YUfmrWp|*!", "s": "d8a797b8bb5d304e860ca872e40fe2a7", "oc": "7ac7af1f1cbf7a4e1a53bc06a96f64eed7983bb9faa8544575ba67ba9399a96686adf9b4b3a3ab3541566da975865475ac339eaca48edbc5"}, {"a": false, "c": "mzb.WV+<+WNnWTG7ug#Y!CMH#L,)O$AJoLZB|GCbiZshYW&vn}Gf<#Cm1M9YtMJWsIvBCoU6Tz*hbRmV4C)MZ_qY^X4Fv>H<<09=EzlDy>RUx6AXEgz|X9Kq(Qa8%n!SgKN3NpIN4(IcS~!stkH)quc-8!", "s": "0a145d5a6d369d006921921b0970d290", "hm": "70b7c2cd796d007f86751818d8fc35e7"}, {"a": false, "c": "mB>J&Vo<-WNnWTGaHg#Y|CMH#8-dM23NJdoGU+zTvEn;6^po7QyfcJ{#2{On(Eq~PZaE^Gu{4L&X_)sN#Y!JpxTbhu4{m{r6p|2W", "s": "85b537207c1a617025026b3b22345a2b", "oc": "fcc72ccfc81f2a29953cb4ab791fbdf237def3a9e60dcb8d61b3c793153989898eadff47e0230645c569fddb2bbab456a625c118af93db3b"}, {"a": false, "c": "mBbJ&_+I+IsHWf960dDZ[o8lMU0ApcgZX1WmCNxJ>3Bot#*y|fm?<{9v%yN(?VTzP&-WW1V", "s": "949d7601f6e7245e52199b6977c63a47", "hm": "f7c4db4fa0487b3273256a3db04ed31f"}, {"a": false, "c": "m+.M9sawLv6MwLQJXS5B`jeR|L(Y%p4aeSYIGzlHBMuPw>$YGm`@6u7+OF{wCB8QA|6oP=&I[#S;c1>9Hoy)S$Ap(gZXlW3CNP@>3&l{#*(2HB~yw2*id#8~=gNq~0K#B27xtC*3p+D?~|aQCwcB_nhSiiHkEIR*^aFr;+8pAuz%%1*sKvMoQTTGHb}L!drIlx%^E|5mJKx)9n)y;W]o_PqM>c?HqR$dsbNAIypL37#4Nak!9``h@8OPcT`5w(bz{V{s&3XeKV6Gn0AWrE)*M{@ZnozAc,un97I9}}C61}W,4gPw=r~U$}o1nk", "s": "9499ca0ffee78455c20c956577bac446", "hm": "f0e3bb91a848a5c252c5ea22f3ff7fb6"}, {"a": false, "c": "m>bLZj|9c2kHO8nrraEHj4cv`8vu,{XK~hmyw%$L)p?W8#My;w6W3&4#>M]|#2q_T=DzYhvYJg>I4Lile5N]>Ho1Z%glk(`D>cnLbB8J0!vBC9Sa?ZTg[77_!t&^q#%]r4K6ApnA|s5N5#OOn0ra?@qnQ7`8vu0{Xy}kSIa6H>)|?C8UM;]5PW3&4O>K!|R2`q!L}zhhvsJq>I4Xqd!D=+nN!d2QIt~(A&!(]iB%mKX", "s": "8dd92531b08a910f995bb8bb2397a4d1", "oc": "fbc8ba1faf1c2273152be326a91f2dc9b7d8f7a719ace440a583e79f151184698ea6a64eb20da685c536e1029f2a5271b6f3cebdad9d16f1"}, {"a": false, "c": "dByJZA|(c2`{O=nr;a?H$Zcv`C06btbDeH{LI%i>veChO?CCfOY7nXO`U%6{1TAWAP^~:1gBCaLT`oux_{tM#hR9ivFJVsVpum", "s": "fa6f993436747840db242ad8a5edeb58", "oc": "fdea8c633fb346e9a3271e1dd94b09a2c2b87a0e4707f2cfbfae32688b2dedd29ea3c9f9b995372bd8c8ed0042ada9dee68d73cd2f8d3f7042e2882171238fb7"}, {"a": false, "c": "mBbJZA|9c~`{Os!rr`?HjScv`6LBD)#>7UHTq|VZbg%`lyV}vB#2`-TL`z!XvY2q>@4Xqd!3,+:NDZrQHW~KA&!Mciw%deX", "s": "3d2a004aed36434bbf7ca9126688b756", "oc": "47c3d665b3a32fe3bc41177f0810f25ff55029a83de0a884ef52db99ea2a52f8bfa9514e1c73653b57c3b999773bef3e798863c0ea2e3e8135c032b589f28664"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (326, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbdU&X2ajU~i~TUi)0N`~W]`f|lA3LzmAAEZuRdj>sQB:ZNpY~oiQueaBL5)DG*FR;6W;<^)-g>T=wP7`;@yxIc,58kC@p#2_XtuT5KM4LaPV3x9sW;}^b-g>@jWPf$;@w+w6)L8k*zp#2_Xkz8TKltLJ>V6xNI)?knzib&IQ|bY9_BvS`w@x=<+G@YMoZ>x2I6F!U)?c%KqJ9^_QhgRj$jqd3!msk{c958e~?jhAZ_oq%cp^w#&e*hTc^_7O>|hoE-PzG#;5NPlN)GjTl7W", "s": "3473d98101e7715d82109bc48322974f", "hm": "84674d64a4995b023d055f6dbe423f75"}, {"a": false, "c": "jBbLWIPx;`X~3hobvD#*K|+D5q)c(<1.9V])g>C!I+T:KI`VV6F}N|#eDmLo#2{_&[&|wAuCnB3Dg?=qg?kWQNG(kl!CPK_^T7.3nI>$@", "s": "d00b89ba2972cbff68a5a88ded0dd4a7", "oc": "6443aa1fc81f2aed1c575c36c94d2207bfdd1159c6ae0445f5bf6e93131969620885fa4a10b30b45c73c59247bf5547679352567adef020b"}, {"a": false, "c": "mBbLWLPx0`#~GhoFiD{SK|cDVoVtKEd!}1^w5Z+EQ)|42N1OJPw`={{O||vAzi=}b+yt(ANAXb$QSW-pHF`iL2HP4n]giYsiHBZ*U7chOGzwV6e>>->XcY(w#&Q*hTu^_DOf|hoElme3Iz5Nv5AkG6rA7w", "s": "be920d5652662d10a02d430b559bd2d8", "hm": "f346bd2fbfd2b77f6671011dd3f7b4cd"}, {"a": false, "c": "6MbLWIPn0`a~GhoFvT#S6|+Dc8)c(L(A-:{N-}cstkThG|CVV6a}NVSeBmLo#2{w&Dl++Uw}np3hgvv9g-kW4yG(kaGCHK24T7u>nxq:@", "s": "f3b93c31b818610f95db658bcd60a22b", "oc": "fb56a4ef781c2aff1b93bca8ab4f20d7bbd8f949c6ae3d0305fad79315398c478ead9648bebea14bc5316d0b7c2a5972a4368e5cd9ae42bb"}, {"a": false, "c": "0BbLv1kx0`abGhoF}DlSK|+DVCCe8R*CNPAe=X>OcfemR88WMRfsew~{t@D%aU457SSAv}B)3ppu+gMJ=AF?HNs1Js55_TqUHu=La;4wAuh", "s": "becf2975be99eab7db246ddf0598dac8", "oc": "2cd99b553eb04219b381823d224f511ab34baec4d06d6817b0114d9f90fe88c77e37aee9daf7122634f3bc45081a055dd6bd2478ee6c6d14e77ce2c17e660318"}, {"a": false, "c": ";[dL^7|x0`a~ub_FvD#SKq+4V6UNb%EL,1QJov+VsjVecuBCqS#2{_&wI++3W[nB3hgP*-UdkWQNG(kc=rHK21T7Z6Wx>$&", "s": "7e3a14d54d75f34b4212b31f6a81f147", "oc": "fb8ecc3533bc41a357ead793083c638ae9594352c5a3579198e910e76ca09218b664a17cc2c1396068cb7221914e6a311d276c914a76f5e94a5aa5d09303a113"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (328, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLt1c41)W9q(>4>~(,;,|K{@#^H7d5UAJlFUG,tg%%D-r1mX!bI}bJ{38&6>N|JxCAzZq~;q~z}}Hw&~iq%cg;j^1i6*=>!:vDVAj0%BCNh0)fU.x};_IJ^Udb{%|Tm3t350kkWV9)R1@Hj4JHlCF5f0A&MQD>:tCF}iEysQ=~za$T$5-iE$Vi8_*@Ke1YEm>>]_", "s": "8f91a60b08e784541214115936261a49", "hm": "cf07dcf4a84c4b3dc36d6c7fbe648f15"}, {"a": false, "c": "iBbL`hcQD)W9q^644h}&;v|K^8C5Xe9m`5Ol+xPL??|^15-WGn=8HDwVvPEP#26y8sICPSkJwGMyK{UGm5?^5*WAzvh8:fd9(;kj{p+B>", "s": "d9069245f57d32ee4651af16eded8e02", "oc": "fbc3a318c81daa329553ac06a66faed27cd833e9765efbd5a1b7e7936d9989a58ea2364f59b3ab48c5376dd21b2abeae7635be7d0e71c99e"}, {"a": false, "c": "mBULv1k41GW~q|644h~&svvK{lH#11!hUL`ev*@,b.&K5Wc5TPvSNIeN{n-B;O>:`O-#c?k;`<{tm3Q?w*baC2nC=BdMoafQ$%6M)m|A`zmy^dAfMQOt`@COJuE.8Q=~>ajT$5-;E>Vz8_*^me17Em>!82", "s": "3a65dd5604e65d6d991e85fa54767511", "hm": "6db03c1bbdd2b77f8c73161316484bb7"}, {"a": false, "c": "{ByLU1941)W9q|644h)&;v[K{8(5%e9mJ5OZ4)XL`,yhe7MWGqH8&Cwu]UEG#2*yosdCvR8;f(9(;kB{paB>", "s": "f5d9478c7c18000795ab68bb4337aabb", "oc": "facdc12cc8836a3912231cd6a99b190bb77890d9c6a5c4d5a51a67967599805d7ead69aabed9ab57c636690274920a750f35cfbcced4a9e6"}, {"a": false, "c": "mBbLU1cB1)Wvq|644h(&;v|K{B`tAY7D@4_*C%C5;RHAVV+K)|=PvUeIp1v2xx%(@HkRJ|V0^5NpV+9bjhM#IO|ejj`(P:CRmlLIkDIEK{Uwm5?^]*@isvh8xf]9(;k`Gp^BG", "s": "3d75104f89752342c682a7522631d044", "oc": "cd6a9c6535b66c7ab0ecd0a94551498cc0fc83c6461e5d91b5ed8d15ab9f3170dec47b4c9d9ccc07eb9a9eafafea91ad0a6774b73ca873c6c386f469c464d164"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (329, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "tBOK%KsbM6KDAAsr=F@t{DFHgA7gmTSoh1.p`J(NW}#LQ.zT)bJN2!spoVF-)AbVZxcQL3PHK6aW_It*Lnuy2iiJQShyrXQ9A79kDnsetm7#?HK9t@e?+I_zEkelZAcW$d9%~Gq$url@mftn39d89A;-uRl&@-BzZ[#P`M_N#sNVuC}v%>Rmq|&~0{Gg5@6t4Yr4zRoAT&_@Kv", "s": "3a9a8dcf01665d0ca94e851b5248f2d1", "hm": "0ab2341d2d02bf7ee6251010d8bddbe7"}, {"a": false, "c": "pBbK%5o2aeKDAAsr>I~keTZAW8$p9N.%]$:r!@jN_S3fd$2p;julZG#,`Khz#$NVI_kP6p6cCGEIQ%I;QOcE}XASyMqY)olO;8sAp`hPTa2z0mD&@O?=HAW@s`JnN=t5Q4OTOjEjSW1X&6r6#I5tTrY05oj&>615-<6uh", "s": "90efc93e367de3ee2b542db8c9eaa1cf", "oc": "ac6a9d55836bf419ad001a2a76e2762be97c56a4abf0e1fc2cd3e30f901e4fc92087603b9fbe039fd36bedf6335e2e4aba7d387f4374edd205e899c350ae8955"}, {"a": false, "c": "!BTK%Ko-M8CDA2sr>I~ke[EAc6G|~y22;C1kie`Y-&4&gG;cfu#2`EhO#`NVpBXmOIVm=*CIhu*%0e{eY~aps=IX%RsOT!BA~LDle=e%f@e%>;NishD;H*=ykHXY>azaF#hq=@8gcYM1<Kv%}zn", "s": "d2a08bff2b6d30fe851ca812e40fe327", "oc": "f697b1f7c87f2aad1553b40789f32454f9ddd379cea5cc47ac4167ad15c98689899dfa4db9b3bb4dfc34510ff32a51e6a6352e63a32eda1bee32d94f89aa33c4"}, {"a": false, "c": "[BbK(pyaPAQACAxOIVmOinIhu.J`=w|vitTn16w2HK9Gf9WP-%udh4tE?}xT)Z``fH3jP-GZW28T0`69C8?DBYcoFAxJm4zI*_h{%OrGO{WxpVAX#dc{kYTt-{F|W6VzT6{1fXBi?pFy!(2l}D!=L+n8`S", "s": "6a995d5101363db0aa6e83158290aed1", "hm": "63b756b4181bb77f96151d1dd63d38e7"}, {"a": false, "c": ".OyK(p5r$NL&CXmOIVmOi}Ihu96ceUg9nV?T(AX-t~#Br;^.<3pF0jd2EREq=JokAYM9<;{q{(;5H=bBK!+{7BKvP%6y", "s": "73e637817f88650f935b0b5ec337a59b", "oc": "b7c7511ac0bfda328b53bc82a99f4400b7d8c3a9c6de6a7eabb91c9a1e9799c98eadcf40b246684565c86d027b2a5a6ea4354e31397fc5ebb531e84f873a22a9"}, {"a": false, "c": "tvbKn;yj$HQAWXmOIEmOk}IhuUte;>Ow0|KycL-0.3#<^@XA#>aWKvJtz0", "s": "fa659670d27472672b242d2f04e5ca56", "oc": "7c6a936535b3421037e057db62efad2a6274a86b5df994d8b5888f4118d16da577cac39593c4c63428b06412f4a90ec7b5362f7e0c167a2b33d27fab42f5117b"}, {"a": false, "c": "mBm4(pB|$lQACXmOIdm9iG)du!<`j}Ff8|8>S4*o>^05^c!cM`Sf!l(YM1<(z^7Yx+`o{GU(J3Y=bBF!b;KCKXJ%zy", "s": "3b990996477823d65470f78e6d81b347", "oc": "916a986583b348a24bee483c49ed2753e1f1358c256cd801a50783ed230b94b56a011029bcd92fb5f6913b44b5b0d3c037b51a28340acd807b7c6872a0b06553"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (331, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@V^TdN?0W$bg)1-J[*cm4X%Ah)0ZK>^L?lNn%CfXTH|W!Vs|!VNa@zS#fN`tJSpjhX(7ToG`^pOcpeL^$zO*^J.x!KRuY0E$#{P}V6`-D2rN}od)WCsDfR!Ft_d-I{cW7ljXiM641$E}6!;<1L#E%%1t5eYIE}Khw=uuOO|IEwN+k8(puu", "s": "c298d20a0f6aa702e2149669772b9748", "hm": "856cdb264c08cbfdc3056e3dce4fd816"}, {"a": false, "c": "mBbz@V^%IN?}@y3gSG-JP*cmq8w1tsg~!{D^,s{k2Kw;s)1-JP*cEqM@zrch5qT&!Tu{;nrFga#bT;wQ`^1T?%Q1v%MMAqdKJ()IM{5qzV5jR-w|ORau^1oal`A0!SrAvG?BC``BMCz41$E>6!AyJVME%%1I5$YIE1thw)ulc||IEwG+k8(Juh", "s": "3a905d9d1136959ea92e7c52e49083d5", "hm": "2ae77fe888d2b57fbb75c7fa0d5dfb27"}, {"a": false, "c": "mhbL@u^[BN?vlE;g)1-J%*cjq8wttcg|>{Ds0s{#=Yw~7RGK=wX`97HJ#%QiZ,^fUgvVo_OazD5=V|qoX{4IXP2Xvf9Uac{i690sM8^0YaxRZT82|e5{kQY*r5[rkz7W5a<;i#B[k2jxNOlFs8DMSUnuAT~!C5z|", "s": "fa6f5a75e67442e0cb62edb8d5ea76e8", "oc": "956a97651213621fa816d82912ea1a2255a48e20c9592afadec2a88367b353f6e8ee1e13fce8a3ebc35c4221dcfff71a2d51e0698631eea3f8b0d3535e2fbaef"}, {"a": false, "c": "mVbG@V^%dN?m,$_g)1-JP*cmR6w0HB3o?FM)D&5-|Zzc=XLlHm>4+@q{qfVkFUnhYn|L3+hQ@WgNEHP94mC7S5YX=)&n!sq>vG3A$|XU3**yn3~nC&!m2n|FsTD~A$VBnv5KN&ZD12AYnEeyS$Dt}X?>5BbT<>Y.+]Ak#4@CXmE5y8jW-4@ZJxLQ1~qNA0{V^??[}lPCrEAEYY", "s": "d72fd211cae73e55571495697424cc85", "hm": "b053dbe49808ab6253abf267beae0a76"}, {"a": false, "c": "hBbKA;2~BM&h78<{ZcUM=nxH&8fV_%$#z9w$Tx^Bh>*LPZ3Ua]idiIw8f6-J#2J>OgC^8%~K#U*Q47uFeL_z-k6h0ssP%yfAr|", "s": "392797b506d036ae879cb50ee148efe7", "oc": "fbceae1fcb88ea321253e92642df6c96b8d8c3a9cba7c14515ba619415997e819e2bf55a18b3a745e4366d04feea54e6a735bb5aaaa9cbad"}, {"a": false, "c": "mBjKA;2~_|&h78F#OXU&onqH4.|I%y4#+S*>%7L@cMeI)>B`Y@g%m-?_:qQlZh}Y{y(K,Kfb*~|C}n9ugd28wzwXLuOO2sr^4oWVRLd;)=a|3)AQT=iCu]E5R8de-HqZ}xL}g0q%A0{9^S?Z>l@CrxAE3z", "s": "96c1bd5f01264f00af2c852bb495f2da", "hm": "6ad70dbd75ddf77f86381661dcad19e7"}, {"a": false, "c": "mBbBA;2~L|&h78NbWlU&SnqH48zV_u^*E9E$=x^B,~JL$_3Uaikdi?G8+6&=#2^q+gt8,%os#UzQ4U>]eL_z-Y6<0]sP%yfAd|&H^de$W", "s": "f3b437813818d4bf4517ebbbc337a12d", "oc": "d7c7ae1228186a32105bcc94611f240bc7d5f345c616c4bca5fac79e07b989a91badf64a39bfab151546bd5b8a2a9f661935ee6fdd4edc9a"}, {"a": false, "c": "LBo}6|X~Q|]h7o7#WXU&=nqH4C6fG);S7H0li0NusI%p|PD^z)I3u@>Lo)l>D^FT(~QX_T`bIjt9s+KoRq;}pQBYA1T~rz]DdI7@Tx5KFfe9d!zv?`dZu(", "s": "6765990e367b7de0f9245fd8fce55ac8", "oc": "f7c2109339b3421964013e1ccbe9b3bc0075488ec67d5fd488ad6f5364cd781673a9e7adbabea10c8b52ae1db5ad2cbaa8c9576f5d082895c3a4e1373faaaa31"}, {"a": false, "c": "?G0Hn)Y!CMs7NUP70C^_B24f3#WS{#Kmw1+$?2X*est[H^qucc8!", "s": "e62e4d110f26842d02c49c6b37292ee7", "hm": "8977d50b3842eb12de066930be5e6116"}, {"a": false, "c": "YBbJ+V+<+WNnWTGaq2#Y!#EH#8JCMgE1ayoGQIEkv;q1Uco`#2{5n(EqpPAP7^Gu{1F7X*)sR#YHJpxThuu4U2mrWpfq!", "s": "d93b912e20ad73fe867ca216ed8fe9a7", "oc": "f478f113c6df7a3fd1a3bfd24d1f2d0bb64bf38985fec445a5ba699612798e6e8fadf64a99d3ab85c1d26d007b2a547987357461ad2e7bc9"}, {"a": false, "c": "2BbX[D+x+?NnWTMBHNte!XMt>LXR6dAJ9%ZZs|n<6^Uu7~~u{$L74*)sN#Y!s0dT(6uYUnmrWpc*!", "s": "f3e9d1816a186a02955b9bbbc317af29", "oc": "cbe7a5dfc1f32a420e570a06abcf141b9918f672e6dec459afba2793859c8f678ead3d6a5963f9e5458960057c6a5476ac37c66cec99d0cb"}, {"a": false, "c": "mBbD&Z:<+W(&WzpaH&#Y!C|H4B}MUqDEGI9$OIF8zdMu#08A>o22sdWfz6+dkZ@vqbCAZek_5U;Tbt1T!rE=FNZq9FEbUn@iEFVjA6dA.9t>bRLIxYWpuh", "s": "fa6f9a7537c4e2e8db142dd8f20acaad", "oc": "f7699c3533bd4278a60188287c1397a9f5afa251f85df9ac48b6bbc060bcfda4630dc1f57e470a31e4120e48c5b3b06be572fa9f9cddc38e6dc2942ef20a0838"}, {"a": false, "c": "mAbJ&V+<`WNnWTGaeg!YgC0H#6T}lsYvyn3r-Zxc[Kee2hj3OIV2{8E(Eq~PZP7^G&{SJ7XY)sN#Y!v6xT_Bu6UfmrAp|*!", "s": "7e0a0003400822406e7c97dfe68113e4", "oc": "fc0e9c75f640feae4cefd74efccce2a2348c51edac75dd483cb7ab4298a105eb3cd50e0ea1fa11cd8d232ec20b1326f76dfa7016e4517660833438fa93d89186"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (334, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbM9%aeLB6as{}EJi&{B%cZ;Ot}Nt;Zsu&%GPw3H_DKET(v)GUHBzd3mN.WJFT3GPBKa30;9%<3u=$EKb~W)de42&14siM(F}XlMb%A4cgiX1u(CNxJB3yC}*id#80AINqZ0K#3R0btH*3p+L>DoR0VREjnjDr(djXW<4n;H3R?&<}q$[C", "s": "d10b97b52f073b9e866c88e6e00fe5a7", "oc": "fbcca210e01ff937c5b32c06c91ff40b53d8f3c8f6aec785a5346a932f9989e9bea2b6aab9bdab4c3c320fc27b2f5d56f6f0ce619fcf0af8"}, {"a": false, "c": "mBbM5-awLU6W$YGm-}6u=+OF_|tB8{A|boPMI3^;B;c129aoy),sApc3QX{GmCNxJ3*Blt#+(|HBaawLU6a<@|zs?v*a;I}o8<<]V8mTYoT7@C*zCwlyi2Fid#8NqgNqT0K#327xts*3u+WW_ot0VYEjnjDr>d5X}+5:pH3Ri^aEq$QC", "s": "47b67a5108f86f0881096bbbc3a79a97", "oc": "fbc7911f38692a120b53dc8ff11c240bb9d3f3a9caaec44515ba1723e69979797fadf34db0fbab79cb36bc9b7b2e5476f6a5ce6cedbf844c"}, {"a": false, "c": "{%b79-a9LU%avMmQ&TU*;OL!QrQW[M^s(5_Jhxf4n);8Wxo_(7Moc?Hqr#d^$GAI=pLH[xc(puh", "s": "eb6ff97536a48de9db112ee802ea2ec8", "oc": "fd6e9c65330bb219aa0c8e1c96c9b12f9ac6c5682c4ff6c18cefc12b80eaebbdc6f5069e6dda1ec7b865c3cae1d0f3438eadfee79006da4175fc65af1ae78e02"}, {"a": false, "c": "+BbM9-PwLUHan;Dr(d5|BQ4y4H3RjzaEMy=C", "s": "0f9bb0fa257621446e1cd71669d8b394", "oc": "fc6178e579bc4c044b41d7af073ba4e5b5ac0fff7afd9a1d1c40c2cb1f28038a28f1dc568bd84f7bacbaa838e286c444d7d194eed929b851c3ed9694b5c52fab"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (335, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbHZA|9b2`{Osnrr%?Hj)cvKYFy>g~4uJ*k:O2XQvL+5n!_9s05Ry&V}uK?bzu(?rb>+xpBx)a;YgP`wxSdOU}4O~cRwn}(2AcB.{+L{1pO|TWM[_cTs5tLbz$Ve*;fX1KV6FnhUW#E)*MDJ-nhDG2Dun9729)DCi1}WC4>UZwr!}Sho1nk", "s": "64d3d7cd06ab842d52469d19b759cc45", "hm": "a067129298f1a5b2cc066a4ebc41df96"}, {"a": false, "c": "Q^bJAA|9Z2%~Osnr!aJ,j)HL`8vu0dXK}ISPw@>2)p?08#,y;w6W3&4P>M!|#2b-CLDz=h`YJ|>I4Xq,!Z=+nNDnr)Iv~KA7!;{1B17AX", "s": "1a0b0735209e3e165f78e8669d5fe4a7", "oc": "fb02a1153d612a8215bfb306ae3d540bb7d35fa9c6aec489a59a8b4315b5b9466efdf48ab4b31b4575376708761a9476a645ce6e826f48f0"}, {"a": false, "c": "3BbJZb|962`{tsnr?a?Hj}cv=`jX)X$p#~N>v&x~_)h9Ie5|*>HcuZ*glk(`D{cILbBrE0cbVC9SR?CTg}q7_!t8a^#Xdr4K6AO-zGDKZwL`OMAWrE)0M{JPno2A$Du@97#9)DE617WCJg$Z=r!U`ao1n!", "s": "3acaad5d013a9650d129751164f3d268", "hm": "61b7cdbd68d2dcb8967a1393d832dbe6"}, {"a": false, "c": "mB7JZA|9c;`{Osnrra?ej)cv`8vt0{XK}SSyw%$+)p?C8MMy;Q6J3_4h>E<|#2`*TLDz=h|YJq>I4Xqd!Z=+0N&#rQIt~KI&hv-iB%7eX", "s": "a3b9e7817818610f95c867bbb337ab65", "oc": "e3c7a71fc81f2ab21553ca06a71f24d611dbfaadc5aec44bb5ba97ae159e53d958aef643b5108b45c4cefd057b2554d6ae35a168a79e4b99"}, {"a": false, "c": "$pbJZA|:c2`{Osnrra?Hj)c?`C[6PktDe;li`t#$g2sv?g{w@dN#$90>I%WjdeChO?CikKY;SXzXU%6{hTyWAE^~yBgzCaLT`ouxyztg80>|6vF1MxVpuc", "s": "3a6099702574d17ad1242dd805eccada", "oc": "c3009c9883b34bd13ae2214d1584456232d879de2f07f88976de3dc88b24e8d68578b5a6ca351720d38cedc04273568ee4403fc7ea8c3f7d4736c861c952ff97"}, {"a": false, "c": "mB?JZAw9YL`{OsnrrL?%j)&&`6LBD8#u7U(2q|VZyg%~lyV4v~#2`-TL)z=YvkJq+#pXqd!Z=j1LDwJ^It~KA&!!ciB%7ZX", "s": "3c8a004f537be964e47ca71167815444", "oc": "f0b2dc6eb31386a3bee137ef4914a858f55c4488ede7a8b6c422206eea2a68fad706c39d0f77b50b5fa3314f77eb95312c987fc8dafeb381d8c2f3025cf16164"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (336, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbxU@X3Q2Tq7~T2jd8h9!GCK>&)buK3=6jQ9;Nq,82E?<;rdft~DAAETj1P+Pp|P+w6z=8kCzp#2_Xk!6rKl4La~V6}NI)i0AcotlA@N}Od>iQiI+BLZ){G*FR;{Wv<^C-e>T3wowP#yy+w6)=8@C-p92_X5u8rKlWLa~,6x9I)*B_+v7U;Ppk2XPmN}%OcTxP[S", "s": "23b978817818610f95cb5b23c337acc9", "oc": "fb67a21fc81f893419907ce4921b844bbbdae311c644c145a0ba16931598896f8e971642b9bdab47c2360dd274f3a472a732ce2ca19f42bb"}, {"a": false, "c": "mBxKU&yj`2TUivT2<+8c9!nC5B?hW3O{sD{K7DXqgp(YP}zH*!jg9CDzQ2%ATE3pceQG8V)=Ca^3m+`tVw@H`aOj339ZueDVJ^Xi}_L5-`C>rvABpuh", "s": "83802f393678e2305924427708eac3c2", "oc": "2c6afcb53d234259a30d8b1c0ee938bc792cfb729da0a0982468c796b8008a47d2ac1d41af765be013b738921c4bd10c9ab0fae95b936aeed99d1801d90152fb"}, {"a": false, "c": "mBOyU&X2H2TUi~$2?k|zEb&hQ4%B9@Gam`w@ylZQ)|48j1ODPT`=5zO||cAlQ=Bg+yt^ANAX*$PWalpHsO0L2HC>n=g&YsM9I+-G7Kh%GYUV6A(:oSHTY^@#&Q*hHu^w7Of|hozlmzGf;5#P!2kG~r<{z", "s": "3b9f5d5601365d40a9248577349012dc", "hm": "6ad25cbd26db67ee567b168ad0fddbe1"}, {"a": false, "c": "m]+LWtPxp`a~}yoFPD:SU^@7sIkfhDIyVV7:}NV%eDmLo#2{_!wb>4_k8nB3hg?v9g-k>QNG(GckCHK2>TEZ3n+>$@", "s": "f1a939017d184bf38b5b6abbc33ea02b", "oc": "ebc405b4c8abf778e556ba6bae91241dc6d3f4aec50ec1a525ba661315b989c98ec6f57a59b36b46ce36770280835075c6a5ee66ed4242ba"}, {"a": false, "c": "mBbL.WPc0`>~GhoFvD#SK|+DVCCQFR*VPLA@=X>OQfeMa8MWHqf}=wrhX@D%at(CLdkQQ9L!vchZSS@=OuR5paiFVM~=)FpHG80Ja55_TqN_}=|M;5wpuh", "s": "fa4690753874e29c9f2dfd4145e5cac8", "oc": "6c6a9c7180c329fa71d18e1dc76a108ab32778200e6b60e8701382a4d9b91a5d53394f7f6a4078870ab1b907d5dad53b247d24d2224accb4355c2cc13e5de5e8"}, {"a": false, "c": "[BryWI]x0[{-GhoFvD#SK|KDV.UUb%E^1UoJovsVsUmKc&yCqS[Y{}&*l++&w8nB3[g?vNg-kWQ;G(J3;CHK2^`OZHnxk$@", "s": "dd180a4a421853546ef9be12614b3f49", "oc": "3c6aeca553b340a3c1e727ef07d2248fb3d973e6c53386b3c5c570e6e1dbfdac1874e1ac69c569499dc3e22a017c4d6effc66de14af6fc92b5df551096bb9813"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (338, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBdL>1L*1)Mlq|6O4h(&Iv|K{Y9]{pUc7AJMlUtmtvJFDDrpm|!bI!bJ_SOf6>]4JxRAsZq};J~zX{Hw&{>H%Qg{jo1i?*=.#NvDVFJ$%BPNh0)@|gx(>_IQTCd{e%|Ty3tw50kkPVz))E@%jdqH0rF%[0f0w58>Af]Q%t`tCz*ME%8QT~za$T$Y-;E?Vuy_D^m31YEm>!82", "s": "c199d6010ce5145d571fec1977282446", "hm": "8067d1440848ad323305607dda0ed916"}, {"a": false, "c": "mBb)U1c4H)W9q|644h(&;v}d{8(`4e0,`@6ZeIXL??p#eX-VG7H8&}w:zUEG#j}y6s-Q-1kJwGMEn{UGm5?^5*Nizvh8df(9(;k`{p+B|", "s": "4f0c97b52094306e863cc845ef7f6d27", "oc": "fb97a15f881f2a321a430201a81f24e5b842f31876aec4d244bae703059f896a8e2bf64a97b3ab45ff46a70b3b284770c93f0e874ed7a999"}, {"a": false, "c": "mB7LUFc41)W9q|e44hBx;gWKBLTk12!h:>fpE*n*7stKZWEeBCv$KIeB}n6B;L>AZs-`c!u2", "s": "3a3a5d560e35ad08992f856b7410ddd8", "hm": "fa1b58cd9ed2b7a58f7516cad8fd2b67"}, {"a": false, "c": "qBbLU1cC=)WMq|6`>h&*;{|1{8YbXeXL?]QhFE-WGqH5#D~?vUu`P_}y8sx7-@kJcGMEK{UGgr?^!eW_zuh8xR(9(Hf|{p+h{", "s": "faba379158180cef0e2b63eb33271a2b", "oc": "fbc7aa1f58112b3016b5bc02a90f240db7d8f7aaa6a0f445c5ba97432e9988e98eaaf6eab9b3a43bc5366d027027753ec935c16cad77f3e5"}, {"a": false, "c": "}BbLU1z4n)W9q|*4eh(Dyy|}gB`tAY}n@4_eh%x5;rHRnV+K)y-PvU9Iy1vhxx%(}YHIJ|>0^?Npl+9bMhM#IO|>jjD(POCHfK)3kDGiW&fT*(f!@VSpuh", "s": "446f697b1675efa05b245dadd5eac9c8", "oc": "f4cacccec703f228a0b1ff959dc7ab482306513e26343749cde9899ed0a9044ea32ec38486ec5e4c4c7cff193ccaf0fe3cff4633435008efc6f4e94876fe3509"}, {"a": false, "c": "mBb%l1c41)Wvq|P4Wh(&Mv+KB6B3PihXM;p", "s": "f77a8175d0a873406e7b4e2dbe81b310", "oc": "fc6a936e35b348c3bbc1d8fc095c29b118b057c84d47519ff5ad2df28c3d3a89dec83b4bed9fccc74c997e3f1de8eeed042d75573e6c9353864cf9e933407169"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (339, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBcK%Ks*MSKDAAar>I~deTZAcYi9b_|1f=1$J>7Flt}DFHg`0-POSo21E<`gD2W}wLf_zTIb4v2);~oVF-)>hVZ$cQj(P-@6aW_Imqtt*y5QP2iiJQ>>PrX2m$79k+Csex;7#?mK9lPet+0WkHW%6dKyTq.YUwU8ZUq1dA*OM;}PvC%>Rmq|U~0(2Yr?6t_Yb46u^AT&_@KZ", "s": "9473ddc10ee7c35da9049b59e7c9b9c8", "hm": "7847fb4ea8487b3fc3c4e2d8be4e4c16"}, {"a": false, "c": "mNfK%Ks*ye0DA|frD1LkeTZUc8$p9%O%<$ur}@mN,>39d89p_Bu7l&A-B*ZG#u{6%zV$NVuI~kTTZ&cLZs1}q):l0=C-@5Dk)f~Ku%+4tHr*hf84>p-co4D(@R`M>on8TdKt!5}%!P+7AP%C%jRnq|=~08Gg-e*t~;rF1umAOv_@KZ", "s": "4a5a5e5619ed9faea52e1503540bd921", "hm": "3ab75db974d27c0e82cf162aa8bdfbe7"}, {"a": false, "c": "m6bK>KP*MeKpA=srX`~KeTZA18$p9RO,q$u1m{mK+|39d87A9-u7l&X-BbZ3#2`EhzC$N*uI~k_TZAcCPfI)QQYQOtEF0-zyCQYC1l{;hsA;`hPTJ>zjmIr@H?rHAW!sAJNN=e}Q4DYOj}A%&|Xe6r6U[>UTrg05od*>UYH^rVuo", "s": "1f6499703e94ea100b59edd905ea7a38", "oc": "6c6a946536b3cd19c800382ac54376ab196c2cd2bfb0e8a4175daa790b819929406391689779e192de6cd2e33eae2943617bf75f6b2e3362bf6bbed1581ecf40"}, {"a": false, "c": "mBmK&0s*MtKDA=srJ|~keT=Ac6~|~_22Kmvk{e`Y-54&aG;cYK#i`Xaz#$NVD<5@Sw(4C!}3BZprG%_D6kEC&cd!z*AN>ia", "s": "321eb04f7d7823946adcb7106681b345", "oc": "fc66bc623ab8413bbb91d9fc4b814a7138859c3ca7357298757dac5530418daffe3af964ad2e106dca14da4be5cb20f46f0dc9bfe222ec0d077e1b777542affe"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (340, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK(pyr$AtACmm&pVmOi|EhpYHuaSeX~azs=IX%R#OT!oWdL{Te#U%[t$Gv&)s@e%>)WCihD}v2o!KEX^>a&aF#h<|XKwNvJ]zy", "s": "94ebd6062fe784555a34f5f97e23c245", "hm": "836a3ba4a2452bf2c395ea7dbe4edd16"}, {"a": false, "c": "mBbK(py~$sQn`XLGIVmni}h$u96ce{g9XV?28@M-t=#Br;^6<3W(O|d2:!$q=f?g|IMY<iv_%zy", "s": "cc049008211dbafe561ca856c11f04b7", "oc": "fbbda11fc80f9a321553f806aa1f64dbb718f329f69eca42a58a619d185e057983adf64cf9bbe44003866a026cdaf4f4a73fe96cadfe671ee53e28be27aabfa2"}, {"a": false, "c": "wmbK(=PiK2QACXmyIvmOi}Ih9H2r=wKvitsn15T2HY?GzqWP-huChzi}Ihu9oc0Ug#{V?78Uz-(zmBr;^lRSJ%zy", "s": "1eb9f1f1d61867869fb58bbb3335aa2c", "oc": "9bdca11fc8152a8245577c06a9ef246ab4d8f35dc6a7c44fa5daf8951e9ca96984a2037aaba28b445fe968427fa2347e9631976c9dbc2c1e5c3b654687aadf5e"}, {"a": false, "c": "mhbK(pyr$AQACXJOIVcOi}IhDqt2v>OwkvKyB<-}5j!2^GXA#d|BarO${*B%g0K=DmV1F2^f=1BYMo<%v^$Z+Q|z{7YhA`o{Gv(;RF-LBK!T;7>uvJszy", "s": "fafe99753f77e2e0db125dd805e995c8", "oc": "d26a9c6e73b12f194d00d7db615a8bd24260c07553fb749076c8884848e18da5675acc69b344ab3e98b7c1c4fda9dc87b5722f9337e7cea3c269ad2644f505d6"}, {"a": false, "c": "tBbK(gyr$AQACXmOIvm,i}Ihu6Zjj}Fn8{N>k4Ho>^0_=jmcM`uf{l(Y_C<|W!V*`irNa@u{OfN6tfE%T1I5$YcD}th]@uu$U|IEwr+k8(puh", "s": "9451da010fe73b5dc4949b398766c84e", "hm": "8047dab4a848cb8290c76a3dbe44d606"}, {"a": false, "c": "mBaLLV^pdE?0WQbg)1xJnycmq8w1tggI>{v^ds#k=Kwcv$8K=wXj97xJ#|Qi#2{fUg<1o_OazDU=oJIv)7m_VzEQU^z0Uh?^@=oIRRHHj", "s": "b90bf9b5ae7c308e3679a8a6e4ffe4a7", "oc": "f8c7ad1fc81f2a42b530bc06af21940b67beb305c09ec4e5e7baff841299896e8ea8464ab233ad4fcffd6d027eba5474b6c5d6fc7d01dcab"}, {"a": false, "c": "mWb2mV^Bd-wXj973J#{wi#2^fUgv1o_OaaO!?oJT|qo9{>{Xv2XSf9&acD`690sM|@2g5xR^!82|b%NlSf`:er@k>7W5]Kt*kbNahn`|}kyhz9WXNE0Pw4(jSnBbf>vNvA$|)x3mMLnH.nCMqm2n|FjT63AoVznv7lNTZD;2AY;Pe)<~DtWX{8GBby<_1-+mAQ#4iClfCrI|]3Y", "s": "943cd60137b8845dddebcbf928b96745", "hm": "72673b498d384f326302233cbe4edf16"}, {"a": false, "c": "-BbK~;2~_|&07X7#W0u&>nqH48zV_I^FE]E$RL^BhY*9$Z3Uai5di{G>feJJ#2^>OgC^U%OK#UzQ4U>FeL_:3rSHxssP%!3Ad|i^^dF~W", "s": "a90597b5ff1d30ee760c6846fd6fee8c", "oc": "70c7a89ec41f2f321854b4b2991c840bc051699ac6ae6441adba673315808929d9ae364ab079ab17c5366452782a5476e644c68cc19ecbc5"}, {"a": false, "c": "mBbKA;2~_|&h7l7#W*U&=r5H4LKI%[Ia+S>>H7r@cfkI#^B`Y@g>m&~_;zsa_WOYKyI4P|aPc2dCHn,vg*f8Atw,L@OO2~254fWO5Ld7b=qDg)AQ#4.HUmE5.0de-45ZJxkQVnj2v0{o^??Z>lfCrxkE3Y", "s": "389a954601969d6fa92205bb54903421", "hm": "c821309d7b42b77886b7761adbf7dbe5"}, {"a": false, "c": "mBbKA;2~_|{A787#Wep&=nqH4{zV_m^FE9E$T@^B>r*T$O3UaikciUG4f6-S#2^>OgCmI%oK#d,Q4UWFX>_z-S6hkEsP%yf=d|iv^dF.W", "s": "f3b9478c6895614f957b6bbb9137a822", "oc": "f5c7914fc815023217f4bcc6a3052f05b7a8f37886ae5ba26fba67c315392e608ea43845f5b3c54cc9364d621b245486a63ece65558ed5c4"}, {"a": false, "c": "9BbKA;2~_l&h787#oIU&=nqm4C6`I)f|7H0liUN!sI%p|Pu^A)I%u@>&o)l>D^FTEHMX_T`5(j}7sHboIq;}pQBYA1T~d8QRdI7Jmf5KFfe9d!z4Y`Smuq", "s": "f16f99b436dee2ed0b2f4d280de65aa8", "oc": "fc6a6c683eb2a219a308be1c9cb633290e7528f4626341d458b2722464c6d85f13b5e9aa7af2312c8de606e21c6d53c8e4d924da43082034a568e03434a2f80e"}, {"a": false, "c": "mBbKA;2~_|&k78E#~XU&=IqH4GKPW9$N3a=|Jqzr_kinWG7B$-12^>4gCMUuoK#Uz.4U>FeLoz-Y6h)ss[>yfAdplH^dFtY", "s": "3d7a704f4dc862446d78b51f8681b354", "oc": "fc629eb593b3c1ba3c51d7ee90feb457e5479c2dc802c8980aaf96a2df2eedbc258c8130f4f8ff5a3e86cfa3cdb70fd77af0547ad2481a8a8b311dc8519f026f"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (343, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ(V+=$=2X*e1z@37#2{~o(Eq~PZT7^Gu{SL7X*)sN#Y!CpxT_uu46fmrWpw*!", "s": "dd059724297d31ff147c4819ecc2eca7", "oc": "f7c7ad1fc81f073212539ce6a9188436e7d8ae29cf579c4a75ba8f93a599690983fdc94ebbbfab45653ca6027b2a6476a7c6ce67ad9444cd"}, {"a": false, "c": "mBbJ&V7<+2N-WTGiHgNY!CMC#Li)6dvJoLZZ1|>biZstY-&onxP=IVCm1M9YnMJiXIv8CoL6Tzt)d-8e4C)8>_DYNX4Fv>JM<090x_=DyfRUxd3X}TzwH9gB(Ma8AH!SgKJ3-sUv:`Ics~|stkH^Muy@8`", "s": "fb3a525686369d60a92489155498d2db", "hm": "6ab75d2d3791477d8678d61a085de5c6"}, {"a": false, "c": "mBbJ&V+|+W8nWTGF|g#Y!CM=#8RdM291aJoGQIzTv|n`w^Uo7QSi`$>pqcJ`#2{On(ER6PZP6^Gu{xLyX*)AN#Y!JpxT_uuaUfmrWpX*t", "s": "59b338467818611f9b5b6bdbe33a9c2e", "oc": "f7c2a31fc81fe2221519b406e11f610bb7d2f3a9c779c4aa6eda677334c4885986adfe46c9b0ab49b7c67dcb7d7be406a63f206cad9e3bce"}, {"a": false, "c": "m{bJ&V+<+)2n#TGaHg#B!CMH#B}xU8DE+If$O<_8zdRu#a8c>I+EsdA{q6+dZZ<5loC2ZwC_B1;TWS%T!HEPoOZq-FEb(bOLEQVjA*dAo92#-R$IxYW2uh", "s": "fa0f4976fa7ae6e0d474253e0deaca78", "oc": "ff7a0c6ee78b4b19a75a882a72fe976ef6dda940f6fcd0a4446657c8832df4a12d07aa517fd4b0721aae994da4303b67df7e5db93c05c3c7682c8aebe8007866"}, {"a": false, "c": "mBbJ&0+<+WNn>CGaH@#@!CM,#6TnlsvvyB3~-{xHln@TSzv3OI#2{Oz^R9~PZ67bsu_NL7!*FtN#YKJpxT_un4if", "s": "3db000514a182f406efc3a8f66f693e4", "oc": "fe6a2662348a76adb5e1d70afc2cd225a67411e95715194cdeb7c449961ce5a428940c642d9cafcd3a262e826de009a0a1f00b84fc4871a085e863a473807e41"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (344, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m=>}9--fLU6PCz<3uEjE#b~W)yel]&14s2m>Fobl|bP2pcDkX1WmCXxv>3Blx#*F|l1;&-eW1V", "s": "d657b6010fe78bddc21493697a29fb55", "hm": "7462db44a898ab3753996730fe4edf16"}, {"a": false, "c": "m~EF9-a5lU6ayf{|i.#80AgNqT0K#I27xtYxsp+D&?ot0V9aoZ)SsApcgZX1WmC>x|>3BltF*(|{BaV", "s": "3a955a4f9614fd19af1e857fd490d231", "hm": "2ab7576d7c62ead08875f515d83d1bc7"}, {"a": false, "c": "mBoM9-awLi9aP?+zT?~|a;Cwi8<4y[2*ij180AgNqT0K#}i7xtr*3Z+DWNot0QZ8j$QC", "s": "02b73e914811640895eb6e4843a7aa5b", "oc": "48b7ca04c8cf2e421b5bbea1511f240b2828f339c66e142aa5b36ef4659c89697e4d0d9abcb91f45cd340dfd042abf7ba6744e68a29f43b8"}, {"a": false, "c": ";BV=9-awLK6$<7+zn?_|a;Cw=8:@7Sii0k6I6*^aFn;+8pN^y%%1*BKUM#=RTxM>nL!drI-#~^V|5tJKx_c?Hqr.d^$NZ4RpL^1xcKpPh", "s": "fd6f5a7aa684e3e8fa202d34059f6a2f", "oc": "bcb5966536cf20930a018f743f99ba21580afd635c4fd2d14bc9e32b70d7d66da0c5768b24856de7877b9f0b5150fe41d0fda181c0f21211ec7c67f61a57f916"}, {"a": false, "c": "mBbM9>aCLU6P=p?~8#My;76W3q4h>n!|#2`1|LD{ihvYQ4>I!Xnd!Z=2nSy{rQIt~!AQ!RciB~7eK", "s": "d90b96b52d7d30fe8679b816ed0fcda7", "oc": "aa77ad1cc8162a3242234cdda91f240bb8d603aac6aeefc5efead79385998969f2adf64aa9e3ab4bc93653827b2a5a6fa2b55e6c1dba4108"}, {"a": false, "c": "mBbJZq!9c2`{Zynrra{H%)cv`LjQ)a$p_~llv.x~<)Fi_e5|*>HcPZkgnkn`|DcnLkBrE0", "s": "591a59f6c546cb0f732e853974f002e1", "hm": "6a675f0d78de47768a7b161cde57d6e7"}, {"a": false, "c": "mBrv|#21-TLDz=hvYdq>j4XW^!U=+nND{rs#t~KE&!;ciB%met", "s": "f1b53781c138610ff1e5e5becd50abbb", "oc": "5bc74189c010da3615531c2aac2f2a0bb6d817a926a4779c457a6999929ca9f09805e64849bf394785a66800759a7472a63dc0626d2f41f9"}, {"a": false, "c": "mBb{ZA>9SP`{OnnrAa?Hj|cv`C06]ttoegliI%ijveC!O}CCfOY;>XOPUSH{hTyWAPg~uBgHCaLT`ouxb{tM8+NILXq$!ZDBnxD{rQIt~iHU!)cit%7e_", "s": "3db1339f4d0823406e8cb118f699b349", "oc": "ac6c9c6533b347c3bbccd3ef6778f559ca6526d1e248a88241622be93a2a7af91e78518a8a75b57250a2113c964f9d32f4c87b25daf3bc9c55c2f902f1c9a914"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (346, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbgU&X[H2hm1~F2?dmc9!nCA3U)bLn&[61Q*;xow]2E?sQIASN%Wj>iQuI`?L*){V*FRkQ5D2l|KWHb9=<;MJ8ww}}z", "s": "449383410fe7542da0146b21e7d0c945", "hm": "c367de44c848fb7228866a0dbedeec16"}, {"a": false, "c": "m{b?UaX2o2T;1W;<8O,n>TjwH+P;@y+w6)=8XC5N#9}Xku8rLl4J*{Vj{NI)iB_+>Tn8b$X_I`G&#z39wk4lH", "s": "3a978216c137dd00498e856b84a0de51", "hm": "6a1531edb8d1302f8672860dd83ddbe7"}, {"a": false, "c": "(BbKL&X@#2TUiQT2;1W;<^Q-g:TrwP~P;@y+4-)M8kEzp)22Iku8jKl4La~_GxPI)iB_+B%cTeP6S", "s": "f4b03784181832b8554b6bb8c6f7a32b", "oc": "f4b471ef08082d3295f3b306cd1fa204b72873a526aecbb1a9bcea3b15b565478e22f04ab9d3abc585326a0f7b0ae4765d37c76c5def42ba"}, {"a": false, "c": "m.>Kp&XYH2TUcmT2t-8u9!nC$B?hW7OInDN6XRgXgx=Q:(%P@zH*!jK9&1zQ2q%D+Zfcf{g8VEjC#^wA+`tVw@H`HOj1(9vuenVJcc`0_L5fy343vA>pua", "s": "fe65d97936e4ee202a722dee01ddcac8", "oc": "6c669c2536534269ab318e192ce932b82023ff84cf60c348246d87da940c8cb06ea4638baef597ecd4eb20c6f0464bec2bfbf03f0b9d67e39ff4da01dd31e9db"}, {"a": false, "c": "mFbbU&X2H23Ui~T2?k#ztrtIQ=6}9_BKS`w@!=ZxGIcy!v2?>%KSJ9X=Qh}*g$2Nd3!X`I4ThDI`0V6#t#V%eDmLo#2{pR!l++tw8n=3hg?v9g-kWQNp(kc>CGu2^T7Z3nx(M@", "s": "ae0877352f6cd2fe277cf8a6ed4f54a7", "oc": "fbc8f19ff81c1e3a1fb3bd704de02406b0f8f3a9caaeb964a6be3793159969298eadf65a79f7cb43c56691c67b0b54d69486ce6d2d9f6260"}, {"a": false, "c": "pBbLWIPx*`a~Gi*)vD#SK|+DVU]lEEd,}zxw5-+[$)vM8N1@DPT`m{%OJ@eAxQk}>{y6(,NA4*$Q8W-pHFc}-2HP^n=gIdsiH{C*(#7hBG=nV6AZ_oqH7Y8@#)E*hTu^_JOfcYoDlm*iI;%NP!@kG~rl7z", "s": "3a9a5d5e01d69600a92ef5cf5430fad0", "hm": "eab7c13d7fd36d7f8276561af7f4cbc0"}, {"a": false, "c": "mBbLWIPxS:apGhRFvY#S~|gDV8)cXL(X_V^F->&sIkThD}`V#6a,NV%eDmde#23_>wlO+_Y8n>Jhgu6U,akWQNn(k]GCHK?)C7Zuna>$@", "s": "f39947814818c50f9554fbb309d79acb", "oc": "f607db1fc51f2a3316f3b306a9e5240bbcb8f1a3cfaec44e28ba65951539f0695e280f45b9f22f45c33f6d027fea5472a14fced7ad90456d"}, {"a": false, "c": "OBbLPBPx0`auPhoCvD#S>|MiVCCe8R*C>LA0=XAOcfeqR8^WMRfsewrR..D%EUk5LdkQRhQo{c%ZSSG>@u)3pCutGMP=AF?Hp#0JO%5_T$s_}=|M;EwpNh", "s": "f1af9975767d52c2db144d650eea5ac9", "oc": "fcb094119d5e0099a3d1797db4458f1a0d07a524ae93a855d09d1d7d11717e3233795f7c15fa08d0b5b359a7ae11d55faaec1449ee46b814740ce2c54e32c6e8"}, {"a": false, "c": "mBbaWIPx0(g~GhoF$D#Sb|+kV6UG}*Z^#GoJLvsV51U]SuBCqS#2{_&wlZ+_w8nB3h]?v_gh#uQNG(kcGh_K2^t7Z3nx>$z", "s": "3e0ae9385198c38d4e7cdf5fb781b34c", "oc": "bc668c653c7e8543e9e1dae306cce87038b908e2e40b8a2108ebb0e5e1ab9d1ae86f112cf8c36d0069cb322f397e7631fd8968214a36fe92d8fae3d49e097a63"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (348, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB7IU1c`1KW9q^644L(&;a|f{Y:^=Jd5DAJMaUtmtvzFD-rpm|!bIF6im<8gaVL4JxCAzZqg;J~zXTHw&~B@UQg;jj1N$*=,!NvD-AeB%~d,h0)fUgx(>_EJTLdjR%?Tnct3PvkiPVzrS2@HdcJt#rF5bI<0458>!8.", "s": "449dc6510f87845d5244906a772a914b", "hm": "8067db4fc44aab32230f8430b24e8f16"}, {"a": false, "c": "m8bLU1u41KW9P|6*4h+&;vyK{8G5.e9m`52|<)XL??y**XX?yqH8&rwuv)EG#2}s8vyC-1kJwGMEK{UH)5?^5qWI9vh8x?v9:;k`{*tI>", "s": "d90b07b52a7d384e837cc816ed03e412", "oc": "f047f11b14832a328c93b46fa9bf2d36b7d873f9c223c44555bb6a27a99934bd3a8df64b56b39b45c572ed0276bafb73864dce1bbe7739b3"}, {"a": false, "c": "m+b8U1c41)x9L|R44hp&;P|b{LT01A!~2L`ui*[*I9hO-dc<1;;<{Xm3QvwlbvChnGwKWMo4fQ$%6!)m0AIzcy(CAfM<%t`hCzOBE%|Q=~Ea4|$5-;E$Vz8rO^We1Y?0>!82", "s": "aa97665607669df0b92e9b1454c072d1", "hm": "1a0751bd78d256764675171ad6fd1be0"}, {"a": false, "c": "mB9Lucc41)A9qi644h(&dv|K{8(5Xk)m`51Z4)XT?#yheX-WGqH8}Dwu$UEG#W}98s>C-1kJwPMEK{UG|5?^5*hiovhVxf[9(*k`{p+B>", "s": "73b9da817818920f955bcbdbe877ab21", "oc": "f1db691f28cf9ac615936ca96913243b9bd863af709e3425d5586993150213698e8d564ab3a4ec40c5366d42764f74467635cf6c4ca7d9d2"}, {"a": false, "c": "mB?_UAc>q)W9q|644h(M;v#K{BHt>Y7D@4_ehnC,;CuUuV}K5h-PvUiIypvhxx%(NYHIe|V0^?FpV+9b6hM#I{|>jGYhPOCHmKL?}e+=Y&?X*{f!_V?pGi", "s": "776f9979067b9333ab242ed4b2eacaa2", "oc": "a73a0c6533b64209ab019e8e9ddaca3830035e38563837a26aee7935d5a53aaeff25d4b47c63711c9c96ffbc76f5c7963efe6933cdcf9f8476a0e946f68ba1d9"}, {"a": false, "c": "mBbtU1c_1)W98|644t{$;v|K*6B[WiJXMw%_Xp3vMT|wVRRrQP#2}q8sI&-10JJGMEK{U$m5?r5*WI~k@0ZAcYM9b>|8=4@*):|HgI0ouE}oh1vB`eD22>wLQ{zT)bJN:)s~oVK-3lYVNRAQL3PH>6aWQI.q>p*L5uP2iiiQ>uyrXQ9*7_k+Cy#tcD*?HK9eF`?+IWks}S6dKyEqG&pEU8AUq1dAZOMFH9%O%>Rmq|_H0{Gose6t_YrVNu?AT&_@KZ", "s": "942367a14ee790ad5fa7936b77d9fa05", "hm": "8267db44a842ab75cbd66a3d431ada96"}, {"a": false, "c": ",BbK%Kd*MeK7A)srgI~kekCAc8$p?}|%P$uwD@mD+n+9d8q*;-@7GgT#Bb^G#}`EhwS$NCuCZ{a", "s": "350ecbf9b07da0ff167c98168db5d447", "oc": "8a60e26fc81f2a78d9534fc6a9efaa08b5d833a9c639844e753ad7935399b9699e9e363ab9a17b85ca256d0c56d15476f6351c6c9e7da98a"}, {"a": false, "c": "mMbKyKs6TeKNAAsr>I~G}TZAcLZs-pq%?)N=C-c5DaQf~wu%D4tHX*hfS4+p-cokD(@zwM>oc8TdKv!5,%!Pp{A7ldh4)B<946yVUj;!FukWkG+UgL$Ar^;F>P%C%>Rmq|P~LHG;s=6t_Yr,@tLAA<_@KZ", "s": "3a9555569436ad060f3e05125490d2d1", "hm": "6b4e54bd98832e5f86a1d75a481ddbf4"}, {"a": false, "c": "m{bK%K0*M7KDAAsrvS^+eTZAc8$po%O%qUuNm@mNMn39d89A;-u7l&A-.bZG$e`Elz#$|PbI~keTZAcCG?IPAQ;QOt|FXA9yMqYM3lx;8sse5Q4D`OjE^GT|Xe6K6#3>tTrY01odR>Z1}-!zuh", "s": "5cf599953c74e2d0fb2426d8051866d8", "oc": "9cca474533e34f15430dd81a72f27e6d19ccbcb402f0f3714b5dea7de0453fd970fcb21b974e039eece76846544e274ae1b6b7efc38e3d620bbcbe68504fefa7"}, {"a": false, "c": "mBDK%Ks*MeVDoAsr>I~4eT0AY6G1~_22YCms~eYY`54CaGE%YK#=cEhzL$L%]f+e{>kNishBOH2Xy|HXu>a-6t#hWyiKwKva%}y", "s": "1d9366414f47765d521414992a8dc448", "hm": "8f6bdbf4c838ab32d305aabdb0bedb67"}, {"a": false, "c": "mBbKapyr$AQACM|O{Vm5i}I}uk6|eUg9XVLB8@.-tz%Br;^H<|RFOjdsE{Vq=GoXcYM1ZKvJ%zB", "s": "d90697c5267d30668771af16ed0fd8ae", "oc": "1bc7c16fc8b58722a353dcb0d910ed0cb908f30fc6ae5a07259867938ed08c78bebda64ab9c35df525386d027dca547a5765cc65526cd91be53ed87e46aa5f25"}, {"a": false, "c": "mBbC(pyu$AQECXmOIVmOi}VruLJrH1KamtT{15Tm8K9G&9WP7@uChztE?QUTFZf`BA3^UnGzYm8@=56b9{idB2co}0!PdDzI*v|{Z^1GO{oxJHAX?dB{GYT2k;81M6pz09B^fgo?_D1Lh(irzD!=Z+KvJ%ty", "s": "fc1b7d81be1d6e0f1a546bb603311aeb", "oc": "fbc7a5efc81e2e315553bb01c91fc40798d5f3aec6aec44aa52ae75c1c9a89693eadf8eaf9bf6543cdc66d02325d58a6a735ceccd699daade531e84f23aabfa9"}, {"a": false, "c": "UJQKkp#|$AQA}1l!zVoOi}IhuBte;>Wh0lK4BLa0I##NYGXR#dap!hO$z*=k)0K=lCM1F2cf=r^YM1<^0_fjccM@u2!((kM1x^v^2Z+O(zrVHhC`K{G{(&RF.bBK!+;U>DvJmz@", "s": "322a0da14478c3407e75b7fa6451b382", "oc": "fb6a9d6300b9d263bbe9683c495f46d491be3bfae582d3d154978922c302e41db8c87289b75c20d296103082840fcdd09cb5140b6404c5d0747c6178a9844453"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (351, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m|bp@V^%bN?0W$;g)1-xG*cmqX%JhW0ZK(IKclt:$CfXJH|W!F*Ri%NaMz{`sN`tJKpjgX(oToQ`t}Or=Io9kWCg}^beFgKdUI!cM>ljF0M641=Eje!E$1h!%%%1I5$Y|EX}hwp`HcU|IEwG+#8Lp?h", "s": "92993e0f02ea34575234fa69c022c336", "hm": "ead7dc4403454bb2c3059abdb94edf16"}, {"a": false, "c": "mBbd@Vg%dN?M<$Kg)2-JP*cmq8w1trgI>{D>0s{k=,wcvhGK=wXj9l3J#=Q^uREfUgv1oKOaz2!TOJI-0_m(VzEA<7h!E%61I5$YIE}thw=uuX[|WEwG+*8Npu~", "s": "ea3f5dd607b29d05e96d551b509052d1", "hm": "c1dd484da8dd5f4f9e751918d8f5db41"}, {"a": false, "c": "pBbL@V^%dN?0W];gn1-JP*cmqew1tpgI>{D^0sRk6Kwcv$~2=uXj97gJ{%Qi#2cfegv1o_OYzD!:oJIS)7m(Vz1Qx^ztUhg^@.oa2R^HJ", "s": "f3d13081181dd00f495b482bc33e5a8b", "oc": "6b87b11f811f2a321a56bc0ca999248bacd35029c639c3ccaa75679314318ed96e1d2641bbe8eb4545bb64377b2a544616beccb6bddeda14"}, {"a": false, "c": "mBb6yV^%zg<0W?>g)1-JP*3Iqvor8W`y>bEq*XeuNIP2XSf9facD`690=I|e)Y5xRP!82|E5slSf`rVr@H=TW5l&!#2n|FsO|OAyVzn1p`Q&ZD}2AYn!e)SnDtyXW85B@y<_1V+1AQ#4iCfmE5>8d5<4+`FxfQKnq2A0yV6}?*jlUErxAENY", "s": "94b309c14fe77d1b3c949b697779c745", "hm": "4c649b2ea840ae30c00560623e6ed012"}, {"a": false, "c": "mBb=A;2~_|1T7o7#WXU*=no]48nVm`^FU9X$Tx27h>*L$ZrUaiidiIA8f6-g#2S>O:C^U%oK))+64U>FeL_zIQ6R0ss(Ljfdd|+5^dFUW", "s": "d90597b52059107ef67c3b0dbb0740c7", "oc": "f4c7b91fc81f9e3515236cedac1f940bb7d8d32bdaeec4454aba67931a9439098eadf64ab9b3a775c535c7027b235e76a831fe506defd1ca"}, {"a": false, "c": "m;bKA;2~_!&h787gWX<&=nq-4HKI2ZI#+SZ*!7rlcxkI#SB`3@gkmD?_;qLaZhKY{y}KN*E$Z3-aiD}iI,8f6DJ|2^>,gC^UFoK&PzQ4U>Fh+_z-8DhTssP%yfAm|iH^dFFW", "s": "f3b9f4c1721c690b965972efc333a2c2", "oc": "ffb710afb91f2fe291e0bc6ec61fa40bb7b843a9c7aecaf5fbbaeec3259989f9eead361fb9c3ad5552365d827b262476a845ce4fa89ac65a"}, {"a": false, "c": "dB}K(;2~_>Ch88,1WCU&2nb{VS6`I)zrcH%_3UV?sIfYPdIF%yI.u=>Lo)l>DmSTEHMXxbm5(c}7s.7o+q;ap7BYA1T~=8QPdI7@mf5KFfu9d!z{Y`Spuh", "s": "c62f992bf67a5fe3db242dd165eae8c7", "oc": "6c6a916133b6221923018e239ae03d9c0d7eac64cd728124883a3f66f4c6d8e97db1e973da5ada8181eae69e312d5ea9b5c978ef5d04def3bca4ea3238347832"}, {"a": false, "c": "mBbKA;2~g|&h787#WXU&=nqH46KPW9$J3a=|Jqzg_kinA,(B$L#D^>O^U^U%oK#GzQ4U>FeL_u-Y6heqszF^fAdniHsdF$!", "s": "a2bae04f497824bd7e7cf71f068fbe00", "oc": "fd219a65ffb34dfeb251d399a8fe345737699a40cb53c1d402afa7fe7ba61cfc0f8f9f12ffa9055a307b664e41070a558d8dba2c0e413a18a4d114215143a251"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (353, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "TBbJ&<+<+WN}WTMaHg#Y!CMH#YUj70}z_B24M3$Wlb#KGw1N?vS77S0Ze|0X!!.u-0po5iC-8Z(ATrG?7A$``^u>n$?2X1e}H#8-aM231ayMGQIzTv|~<6^UE7Q>>`{>1UcJb#2{d.7Eq~PZP7RGu{Sg7X))sN#Y!@px#_uuCUfmrWp|%K", "s": "d90b9c9a2c5d3bee667cd817310feaa3", "oc": "fbcf11dfe5ef6a521155b826a9af202bb7dcf3a91daece43a2bc6f9d1ee9898e6aa311aa73b3ab35b59664027b2a5472a435ce452d557b10"}, {"a": false, "c": "3BbJ&V+<+WNM|isIv:eoL6TztA(-874E)8j_qYu{4Fv|J<<0E@x_~DB@A]HYgz(Ma8~H!S@K]|-sUN%`I@s~!stkH^qucc8!", "s": "8a9a795f51c14500b92086db4c10de4a", "hm": "60f75d757014327f84f59afa88fd2af7"}, {"a": false, "c": "3Bb7yV+?+WNKWiGaHg#Y!rMH#8-8M9?1{yoGQI-Tv|nM|@DEGM9$OIF8^dR]#08c>I+ERdWo9U+dkZNv|bC?6dC_BP;Tbt1T!rb=oNyq-FEb7bOREFVLT6dAo9t#bXwI%YWEuh", "s": "a65f8bcd3b8322ef2ba42dcb00ea14c8", "oc": "f76467643394f207a9004a2a7273e71e10dea2b1fbf8f9ace4e05d10538ffd8c334211f4af00bb21c4a24e457c8d3b68dfe2fab46c2dc0ce6822aedef8007e6e"}, {"a": false, "c": "mBiJ&V+<+!:nWTGEHg", "s": "6b4d60484c6c2d14fedcb7af66819344", "oc": "f9659f6533b34176bbe14728f4e632a2369154e9e63116180c50044192fa98b72e34ab3e34d2529d8d25cb43a0541cf6aafa70145f08b159caeb382a8388b1a5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (354, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB}y9-hLLU6?Ds`7EJivZB%civOrq%?;bsH&vGtWsH_9KED(JnG~?2zFc=hqWJ)e3`@BGal0>C%<3O9$EibMWjd442&74s}IIlt#*(|qBa<4;.5mc]o|v$C*2C)>2w2*idD80fgNqT0K#3^7xt7*3p+DW?otFVYEjnjDrid5X1k]n|H;R?^aEq$Qy", "s": "89dae7fa217939f686baa8b6ad0ae0d3", "oc": "f0cda118c81f5aa21153b55689cc7475ecd8f58ff6a6c44a8b4657e513a98768857d66649eb05ba585166db2eb2154eea53abf6cc1994132"}, {"a": false, "c": "c2b29u>wLU6f<~wLQbFS5BugyR|QNY+p4azSYcGWRxB;_P(>ZY{mF@zP++OFuwtB8QAYboP=&$;#B#U1Y9hoa}3Blt$*(r5BvcaHq0$d^$NZ)=}L30VYEjn]vr(d5X5Q4OpH3~#^av=7QC", "s": "3aba0e1f4c18232d6c72b71d6581da44", "oc": "0cfadc63f6b34162ebe13fea0f7b20edf0a301c8737c2a252a3182c3df20026f446fd6e685607fcf70e4ac78c249c434df7c9e0e3545cbe6f3e7b5ffb5cc6fc2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (355, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mF2JZA!9c2ExOsbrrKOd_9sfRPN&V}uKTbz),?,b4Nx)p?C8#My;wD|v&4h>M!|#2z-TLDz=hvYJZUI4XqdaZ=+nND{uQIt~KA&!;ciB%*ez", "s": "de0b66b5227440be96b68606ed03e4b7", "oc": "ffc1e11fa8b85a82151fbc36ab192409bc9c03cac6ff9745455a61901b9980298e5df6e2b9376c4ec5366c077b265474a6f5c46aaf6fe109"}, {"a": false, "c": "mB3JjA|9c2`{Osnrra?H1_0v`LM|)X$p_*llv&l~T)HiHe5t*>HA1Zkgbk()D>[0SbBrE47YBQ9SR?ZTg}77_;tja5>%184K6AmUpGDKT5W`?MA2rE)S~{JnnozAc?un97Im)DC611WC4g$Z=r!H$ho1nA", "s": "ea9a5d5a01f19d30e22e811b5d50d2a1", "hm": "5ab7cb6d3cd2b77c86b516141c53b3e7"}, {"a": false, "c": "mBPJaA|9c2f{Osnrwa??G)c,`)vu0M!|#2`4TLDw=hvYJq>I41q61Z=+W4D{rQI7~KA&8;~iO%(eX", "s": "f33f1c015c28e1049d1ecbdb7337b04d", "oc": "fb37e71fcaef2ab2bc539c06a28f2404addf23adc3ae8b45a5ba57b210f929896ea5964ab9bf42a5055664993be25451a965fe63a89f68fe"}, {"a": false, "c": "mpbJZX[9c2`]0wnrra?yo)ch)C06hts4eJliwV:jveChB?w:fO<;nnOPUx6{hTyW?P^~*Bgz~aLT`ojxm{tA8C>z|$FWMxV(i~", "s": "dd6f99e5a6e4e25fd1842dd805b741e1", "oc": "f9639c84e303d51993008d58562343ef888879cea702c27fe67ef6689b2de8d685ee83f685c52e20db8e3d0042fd85fee6404f53ba8c3f7d48b30c01a1253f21"}, {"a": false, "c": "5BAJZA4gc29{O*nrxa?Aj)c8`HDqdtX>7U[~q3Vtbg%~AyV4I4]qdHZN+nNK+r%IG~KI&!;crB%IeX", "s": "3bba699fdd4ac344647c776b608eb344", "oc": "f23c9b6163132fa3bbe7df26817cb8121578a882edeca7664cb24bc98a4362f2c7051f9b1c9cb8744283de3fa7db9a30de78e1ce54febc1135ccf0fe2c68d6fb"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (356, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB7~U&XtpGTUi~T2AEZuR3p>sQBASXT<}oi:uEJqLc){G*~R@F5l2lMK!HbIIa-g*(>;1W;<^)-g>ojwP+P;@^+w2n%8klzpS2tXkN8JKW4L=~V6[NI$ii<6`enbII;1W;<+)-g>TjwP+P;Wy+w6B={zTKp#2_+ku8rKlp!9~V6xNINpB|[puh", "s": "16d3f975967eee435e346cd885e6caf8", "oc": "ece00b0533b34a1923918e3c0ce8922d1999fa8b4dc03831a86d84dd880982034eac138bad1590e8c407bfdb68450b0c9bb962800c9dede69f8088210700a93c"}, {"a": false, "c": "mBb>}&S2H2TUi~T2<^8c9-nC$6IRbUr{y-A6MRT&;^BClO`jBG22_]kK8zKl4La~o6xNI)iBh%B%%oeP6S", "s": "3dba0b5f4618224467bbbd6f6681ba74", "oc": "fc6d9c3333b3f8ac1fe140b208cb22ef12b581c27347ab3a861dd03e2a04e27e7d90f1c38388d5e83ae8adac18da01113b5b8f7d03223cfa23b2827c445af58b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (357, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb|WIPx0`a~oh)Fl=#SK|5{VYWwCvtRgCtCmyM_wx-#b*?b?!O|T[Gs(<5GN)z&d1`9*-nQph#N>?knzEv&IQ4C}>_nKS`w@y@ZxMI613?)?c%S(JtX`Qfgfj$2VMw!8skzd`58|d?&hAZ%5qHmY^@`&QO*Tu^<6Of|PocTI)ThrI`VW3W}N0keD0Lo#pd_&w-++_L8nB>hg?t9g-kWQNG(k>}C4K2^TNn3nx>$@", "s": "e50e3775201c3771867ca4277d0fe457", "oc": "f9c4a19f2d1f2a321543b7561e1f2d05b79c53a488aece35dfba67741f4689f98ea9f7443903ac6565bd10027b895576a637ce417d954dbb"}, {"a": false, "c": "mBb$WIP:0`a~9hoFvD#lKkQ^|48NGOuPTI={?O||c0xQ=}<+4t(ANAX*9QWm-pMlGi-2sP^nagIrsiHGp*(GKeB}YFV6AZ_oqrc}^@#&XehTu^97OfFhoElmWY@;4NPCQk:~rl7V", "s": "e97a535d01399590a99a85fb5496dadd", "hm": "6f675aff257eb28be6751f1828fdddb7"}, {"a": false, "c": "cBbLWIPx0!a~GhoFvD#SK|vU2hZSSp=Su)3|autVEP=-F?HNXkJX%5_!P?_a=|7;?)pkh", "s": "dbbc5875360aed50cb298df805e0f3cf", "oc": "283a9d6537b342dd6d0163d4b21d11aa8c47ae2e03e22859e0111f7f747bb37353349275baf008d31b6bbb43da1e90d5d1edd18de2e31819471442e12e06a553"}, {"a": false, "c": "mBbLWIP{0`a~GeoFvm#SK|+DV6UNfDE$1P#&ovzV#xVKc5BCqS#2{_&wl++_w82i3hg?^9g-kKeNG(kcFCHK2CT7Z3nx>5E", "s": "8dbab38ec67823446f13bc134681fd40", "oc": "5c669c653fe84c63b071d7ef08ccc48d78d903e3ce538eda08505225e1a8cd18b4c4110c78ce5b20d2c2e20a913d4331f05703961ab3f592b51e25109303a1e2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (358, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBALU1!41)2Mq|6K9h(0:v|F{b9^G7D5}AJ^-Uvmtv0FDmrpm|!bI2JJ_38c6>L4J}CAzZ=_;J~zXJHw&~>6%QgUj7166*=7^TvDt:eB@IPNh7)fUgx(>_IJTLDje%|Tm3t3_0kkPn`)R1@1jcJH#r`5b0<045|>pfMT%t`tUz*i4%8Q=~zLkFB5X;E$Q{<_IImR1YEm6)q|6h>h($kv|K{Q(5s;Bm`5OZ4=XL??JheX-WGqH8&rwuvUEG#2}y8sIWO1kJwGMEK{UGm5?^5*@Wzvh>xf(~(;M)rp+B>", "s": "d99b97b5e01d50f22cef1818ed0486a6", "oc": "fbb7911fb61f4ac26753bf06691f340b377e334a295ecc663aba0f23359da9698eadd640bbb3eb4585b665764b3aac26ac354e63ab2caef6"}, {"a": false, "c": "|9bL{1W-1zW9C|644h(&;v|K}L;m1A;h2L`pi*@[I#xKZWEn&(0rNIeN9`O-dc<1;`<{tm3Q%w*b[ChqGKvZMo9{Q$%yM)3HANzc2^m^N+QFH`kCz*iP%8Q=~zakT15-;E$Oz8_g^me1jEmb!p2", "s": "d1955d5601569d0a892e85bb5c30ddd8", "hm": "dab76dbbf812171f863a911cd12fdb97"}, {"a": false, "c": "mB9Lc2c41)Wiq|Y44h(&;aBK{C(5UvWm`5>b4[X{?hyheX-WGqq8&DKuvUEGdW}y8sIC-1k~wG>E&{UG>5?^#*Wizvh8:f(apY``{p+B>", "s": "83b73e3e78876400943d6b8bda8ea52b", "oc": "7bcda11988403e92143a7f06568a2400b7112859c24ec52545196a90759189398edda64ab9b33c42c59d6d1abb7e5bc416350e6ca973a123"}, {"a": false, "c": "mB^LUnc41)&9q%64Ch(&;v|K{8`|AY0M^4_2h%CH;rHRnV+1IK-n}UiIy1vhGx%z@YHqJ|V0^?Np%+|b6hM#Iu(>Ej~(PnCHmKL&kDG=HS#X*yKf_V=pu4", "s": "77894af9397482e0817e2dd7052ecdcd", "oc": "f71f406638a54219a301804c9dcaec12c30f6c21c43401a6615e6791b6c5f453fb2ec054d681708c7376ffec7ed5c79e9efeb338315f5887b6a9ec4d7c8bb189"}, {"a": false, "c": "mBbL!1c41)W9q|64)y(&;v|K{6BUWiJ-qn%<~p3%R3NwfRm0q{#2}y!se~-", "s": "87a9224fcd68e314b5dc17166ea7d34b", "oc": "be6c4268335341a3bbe8dd5c4b78e790acba5cc7471e739f9e2060b5a83d2c7a82c873451d1dcc07401e2e381495e21d04cc75773cd8735c1c0ef9998346df69"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (359, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m]:K%K)=aeP;A%sr>G*keTjLcY^6Q4|=g@t{1FHgI0-uEAoh1vX`4D2W}XC]{zT)bUi2)spoVF-)uYVZ$cQL3PHJ6aW_Imq>P*L5uP2viJ$>>ycXi9y79iuAsEtm7u+HKS<[e$+IW>kR%>6Ky3qGZU^U8HUq1oA4OM|>P%w>E9mq|o~0(Ggse}t_YX4zu)AT&j@6Z", "s": "6473d601cdea24ed0bc49b6472792648", "hm": "8066df24f818ab9f03084a3d6eaed2c8"}, {"a": false, "c": "mB7K%KL*I&KDAA{r>ItkeTZAcK$p)fO%q7sr&@mN+no9d89o;iu7l|w:]euG#2`4hz#6NVu5AJxJ(4Y>A}BZrKG2_DWHE09cddz*ANZia", "s": "d20797f5f07e30feb9dc4b16ee0f81a8", "oc": "fbcc0171d21c4a32aa7dbc06a95fadeb58d8ffa0efa82bd5b4fa6e96359189694ea9f74a92b3a04cc5f68d72796a5bd1ca3a346cae77b577"}, {"a": false, "c": "mBbK%Ks*(etiAAsr>I~kjT{AcLZsWp1Y$lW`Lec5DA;,~KC|D4cHX*gf84+~-cHkw(@L`%]Rm9|o~0(Ggue6W_Yr4nuo5T&_WKZ", "s": "859c0d5801340d0c0a2e85615c70de8e", "hm": "dab20db67882b87f867cfd0927fdebe2"}, {"a": false, "c": "mBb3%[s*W;KDA%urFI~keYLZc8$pV%O%q$urm@4j+n3ei89D;-utl&1-UbJGv2{ED8[$&p}L~a3TZAcsGfIP%=}Q>tgWXw7=MqQ)3l>geVAp`&PTa2z0m>L@OC=VAWus`JPlge5Q4{k!jEL%T|Ye6r6#3>t`8,05odR>635,rpuh", "s": "fa6f99755674b260db972dd261aa2a49", "oc": "7cdaa1153d39e26ac304d82a72a24eb139dc2edc5082e0ee45ddf656908f43d92dbc425be7360e9fdee7f2b238aed76ab17d320f677e3af2bee532c15e129154"}, {"a": false, "c": "mBbK%Kn*3eKDcGsr>I~keTFA36Gz~_22DC1k~e|Y-84&@*;cY<-?`Ehz#$X6uF#e%BRzGv&)2Do#vcVPSiW@PmZ7X!TeVhq|X7r2e>f@er>;Ni8hD&H2XykHXf>az(FCh<`XK{Rz_KFE`zy", "s": "4457b000d3872d1c521a9b69e7226785", "hm": "810e6e49a5c8a0625e4b6e7f6d6ed511"}, {"a": false, "c": "=B5Kkik[$bQAzXmOIV[Oi}Ihus>ceUgAXV?+8@MKtz2Br;^|%<_FOjF2mR8i=JoycsM1qMv($z:O(zr7YhC`o{t{(;3a=b}K!+;7$BZJ%zy", "s": "599b96b55e72e3fe2132a5450d0fe4a9", "oc": "44c7a1c1688f7a3415d3bc06891122abe744f30e822ec64cf5ba67999999890963a8c8aab92af745e23dad287baa1176a639ce6c202ed6b34531aa4257ea9fac"}, {"a": false, "c": "mBbK{X`S", "s": "3ce06d2751368841a9efe57b5497b271", "hm": "60b952bfe0dcb76f1675b6aad4f3dbe7"}, {"a": false, "c": "mBbK(pyr$AQACXKOIVmOi}Ihu96ceUgNJV?28@4-tvZBv;^6<3EFOjd6ER8qLfogc0{1<bBK!+;7GKvz%zy", "s": "43b937dd78e8d10d95566bbbce070ceb", "oc": "f487a24fc8bfda3215531c5fa91f340ef508fec2c6aec847a55a67262898bc690eada6ca88d3a34c853069027b5a54cda63bce6bab6fd818ac31060f17aabbf9"}, {"a": false, "c": "7B@QxpOreAQ8CXm=IVmOi}IG4#te;>Ow0vKyBL-PI##w^HDAxd|WCr7$8*Bk)0K<3mV9F2cw=rBYM1<KvJ%oy", "s": "6a6fe27536c4e150db242dd881d1cac8", "oc": "25639a943bbea221032fd7dbc4bea7aca7a4dde453fb9415b5489d4a14ea885777392cf50b4e8e4b32bf6177f4d97c0740be2f7e6d9f722b3701966b931050eb"}, {"a": false, "c": "WBJ;Xpy=$APA3b?OIVmXixIhu6n`j}Ff83R>J4Hc>^0_=jmDM`u>!l(YM1d;R>dpJ%ry", "s": "3e8461efd6780374652ce7ca76c1b314", "oc": "6c8d996f2363416ab9efd8fc495d35369141fd8ae552d801247b87ba638ba83d6af81080a8bcd0b896bd734445b9dc613d07e406647e75d07b716141e3504463"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (361, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB>L!tg%dN?05$;g)1-J`Xc8qX%JhW0ZK6NG3#}O$CfXJH|Y!V*=irTa>S+OfY`zJK;jgX(7ToG`HWORpfL^0z_;^J`xOKRqY0gW#{2OV^FdZ2rNIo9C{D^+c{k=Kwcv$GKXCXj973JP%Qi=Raf6g&1eVOazD-=oJISN7]0V}^`U^ztUhFV@=oI>R^HJ", "s": "d96c6bc57075506e867f481ea70ee4a7", "oc": "3bd7a17fc8172a321553bc06c924842b68d8f37ac3aec425a31a673f159a8d6f2eadfc02b9bbbc459f307d12692a81d6363c5e60ad94eb1b"}, {"a": false, "c": "mB@}@V^%hNP0WY;V)1PJP*$_qK@;r|K5qT&M~f=;IrFg2#bT?wQ2[uT?MQ1=b$}{qd>J&)IM{5qYVE&f-wUOCac*19aKG^hNSrAj`+ii`)BMCBB1$nj6!r<1hYE%%)I5$KIE}thiAuu*UllqFXIuNXY2XSf9UacDL690sr|6FY54Rn!U2|E|{lSe`r5&@k|7W5a<;D#nck20lNLwF~8Ra<@t8ETe!C5zl", "s": "da67991c36e422e80e2867d808eacac2", "oc": "b6109f7533b34459b330d8e54ce71a44890426608969e7f4d2c048847bbf53ed5ce61873fb963deb536cd18913d5fe40ade8eff1cd33b3a3aadb3a5d38ef4275"}, {"a": false, "c": "#qbL@c^sdN?0W$hgd=-hP*cm`6XAHB3o?jM)H&5-z7ztWgNE|P94mCuT5Y>=D&2B78*8GiA$|Xx2)Mymt~n8&!@2l|FsTD7A$VznI-uN&ZD;vAHnEe)S-utWt{85Bwy<_5V+JAQ#FicfFEMh-de$4qZ}xLQgnq2#0@V^B?ZHl4CrxA#3`", "s": "9493e9d10fe7f4ed5dd497490729c75f", "hm": "8e62db47a8e8ab37c339c5382d46d816"}, {"a": false, "c": "mBbxAn:~_8&h78MoW,UM=nqH48aWGI^FE9E$*LJZXUaiJj@CG8f6-Jf2F>2g<^A%oK#UzX4C%F|L_=-&6`DMsHFyfAd|i=^dF}W", "s": "5c4b6aaeca7d09ee2f7c5815ed36d4a5", "oc": "d2dba52f083f2b321083ec06af1ab3fb8eaef3c917aef412a52a67f2959f59e159a1064ab7552b55cf3c6f82784a57774ddacd6ca0bbbb42"}, {"a": false, "c": "m{|KA;z~_|&h787#P:UN{n.14LmI%y7#+mp>%7r@cMkI#>B`Y@g%m&G_;lfC>xAE*Y", "s": "ca955d5ddb369d08a92bb21f54c0d7d1", "hm": "91a75abd7fd2b7816875161dd81ddbc7"}, {"a": false, "c": "m(b#A;2|_|&|78x#WX{&=ifH48QV,1pu79.o3.^Bh]_47Z3qaiqdiIMZ06-J#2^>O^CLU=oKcpzQ4U>Fo|^z-Y6hyjsq%y;AdAiH^<1TW", "s": "feb9d7817887680f985b6f1bc3184a2b", "oc": "43c7ac1acb1fa7bb1553ac06a96f270ab7a8f309365ec49fd4bae7971d9989098eadb64ab4b4ba47fe3e6d043b23652061360c6badf81baf"}, {"a": false, "c": "sBbQA;2~_|&S7o>#Wjo&9nqH}C6`!)W|7HF_iUN!sI%pNLD^%)I3u@>Lo)lCD^5TEHMj_Ts5(1=7si@o+q;HsQBYz1T~d_QPbIW@mf5KF)eJd!S4Y`Spuh", "s": "846f99753614c2e0dbd300d8653acac8", "oc": "fc6afd6c23b0723a84718b1c96e163727ae1486950f9af8da8ae3f24645ddc5f73b1e97abab2218c1de2b610052d8e09e8c20cff54f81a3405a43f32a4c24831"}, {"a": false, "c": "mBbKA;2#_|$hD89#WFU&xn_H^6KPxp$J3+ziJ2zg_&@?Y{(B$>#2^>O^f^U%oK#vzQ4Q>FeL_zXY6h07;P%Ef{d|iH^dd$`", "s": "304ae04f4d782e9dce5997106641a343", "oc": "5c6a9cf539a341a61beab7eb6bf1a467674c9c4dcfe201d30fa696feab351cf22d601f406428f49ba7804a74adb5653d6fe56b7a2244af1198de52f0914f0202"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (363, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "D(b<&V}<+WLnWTGmHgV2sCMH#[Uj70Cz_$24U3#W#b#uGw1=}w2d*eEw1WcJw#e{On(u4~PFz7^Gu{wP7XI)sC#Y!JpxT_ud4KfzrWp|*(", "s": "cc0b97c5035d30f0897cb606cd57e4a7", "oc": "0bc1817f55d64add1033bc86a310340bb7d858a286bd1442afba9793d70983799d4df540b9b3bf46ca306da270275436a6f6ce23adaedbcb"}, {"a": false, "c": "mB1f(V+uCWNhWTGa{g#Y^CMH#p^qkdAJoAkZs|CbiZcCYT&}n4P=yVC^1M9YnMhIsXv8ClL6TzthJ-87eC)8K_qYuXMYv3J<{b|@x_{DyfRUx&AXOTz|H9gB(Ma8ZH!SgKJ3gsUNj`Ics~!stYH^quHc8!", "s": "3aea5ddc011c9d29792cc51b59002221", "hm": "2ab75dcd7842b70fdb79161ad84d36e7"}, {"a": false, "c": "^BbJ&V_<+WNnW@Gav)#Y!C6Y,8-dM230ayoGQIzmv7n<6^UoIySi`z>1UcC`Gp{.<(E;~PZPg3G2NtLLXj|sN#Y!JpxTnuu4UfmrWp[*!", "s": "f3f92f019238b511e55e05bbc337aa2d", "oc": "fbc7afcfc8d32c321b53bc06651f9a2fb928f6a18b3ec9bcac5a4794159099696d7df64fbf23ab3ea5e645097b2e447dad35326d499edb8e"}, {"a": false, "c": "mBbJFV+K+dknWTGaHg#YvCMHOB}MU-DEyI9$OIx8odR*.0kc>I+EHd|f96+dkZFv6J_2ZwC_hU;TsD1T!rS=oNZ_kFEH(BOLEo|jW6dAo9t}FR$IxY+puh", "s": "21d8b9693694297054545d2825eacac8", "oc": "ac6afc0fb5e3b2a333601e2a327396fef60ea8c1f6fcf942a7466fca2853fd08739b01f87504b233ef020342cb40306d7bf28ebadc79c3ae68a2334ebed87859"}, {"a": false, "c": "s9bJ&bW<+WNnWTGaHg%Y!CMH#XTnLsYvyB3rDZxcln{r2h|3OI#z{OH(lqGPZPtqUugjL7X*)sYFY!xpxTNuu4Ufm>Wp|m!", "s": "3ab2464f40783e620e4cb82f0686b379", "oc": "3c6a5c6531b841339bc1d9eefcc8d2a2378351ebf65f864d36154441e6fe756c6ad482be2bde5bcd8d535b09ad3006f211faa813350d015088eb37f6c99c5475"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (364, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbM9-awLU6aO?+zn?~Ta;&[=YJK(I-d!+-ld$+9*w5`ce*-M+fd2uKc45[M2=KhDWFozHMbMr_cgZX1hmCNxJ>3Noa#*(|HBa*jFv%5N($VTM.&ZOWqV", "s": "e4da16010f97e45d52149be1e72acc45", "hm": "f067de84a888eb54ce0f5a3dbe5edf13"}, {"a": false, "c": "mV#N|[DwJU6aw=8<4;V5mT$oT7@C*{Cw#>w2*1d#80j1NqTOK#327xtY*3p,%H>oW0+YEjnWDr9h>#NQ4nxH3Rrp[Em~Qd", "s": "890b97bd007d3e4e815c38d65d0fef33", "oc": "cbc7a11fc81f8a3a614893c6a513f40bb7541390c4aec425b60a679745c98949beadf64ab9b5acffc936bd0c8c2a54768636de45ad4f46f8"}, {"a": false, "c": "ae$M9gakL40aC?Izn?Z|a;Ew=&fd-#5T1*%>>L&0lSQBu)8R|(NY+p8aeS$RozixBtRb1>$Y6m-w6uF+OF_ttB8-H|boP=k<^#C;0<>Xaoy)SsAprgZX3uYtl*(2HBa<,+v%XN($V;]P&-eW1V", "s": "3a3c5d566f369f60ad1d951bfff0d23b", "hm": "1dbd5db1c564037f813a16187ff4dbe7"}, {"a": false, "c": "mBbM94#wL$6BXw2*i4#80AgNqT0x|3!7x)Y&3N+(_?ot0VYEjnjQrNU55TQ4ns?H?Urd>NN9sj4D3(?|^4+x|1xaa;Y2+]w{SdOU}4O~cKwnx(-AcBj{+z,1przTWj[<0Kcd^h(+a;fBDx=i9,;hE8OPcTs5&(bzeVe*;3X1KVWFnhAQrl)*MyJ-nozAcsun67I9)DU62}WO4g$(=r!lAIo1nk", "s": "9494d60b29e78baa72148b697849724c", "hm": "60679b44ca08add5c3156a9dbe4e0896"}, {"a": false, "c": "mB.JZA;9c28{rsnrra?nj)^v`8vh@{XK}SSZ6%$>ppuf8#My;w623|0h>R!|#2j-TLgz=h}aJq>I4Z~d{S=+bJZA|Ec>`{Osnrra?HZ)cv`PjQ)X$I_[ll=&x~<)SiIe{|*duc1ZkerkV`>>)nLPBr-0}Y1}9SR?Z7gx77|!3%bq#%1r4b3A#UpGDKT5L`~EAWrEO*M{J5nozA-6Vn97I1)DC6>>WC4O$Zpr*U$ho1Nk", "s": "dc6a5d5d0006d600ad24851b0490cc11", "hm": "6ab75dbd78d067cf86b5661ad8fddfc7"}, {"a": false, "c": "mBbJZv)_%2`{OsnrLa?Gj@c.`8vu0{XK}S@y56$>)d?Ck#M{;r6W3#uh>M!|#2u-TLDX=h?{Jq>64Xqd!Z=+n}D{rQHrnSA0n;ciB%7eX", "s": "638937817bc8680dd79d1dbbce31a23b", "oc": "fbe2a1afc3142cbf1d5abc69591f2608bc25738921ee344fa2606791d58989838cdef24abab82f45c0136d077b2a2575a635f7ecadfd41e9"}, {"a": false, "c": "msbJZA|Qcz`{OsnrrE?H&Rc-J:06{tKDegF+_%ijveCboPCCfOY;nXOPUh6{hTxWAP^nyBa#1aLT`ouGy{@6vXWMWVpxh", "s": "fa6ac9ba3654e9e04d6422f360ea8a28", "oc": "8c8a9765a3736219b33f6e745813453884e679c2870722cfeb9936638b2dee4685a19bc6c4c5b22bdb37e2b182fd8a82e6444bd3ba2c1fd4a86b810d1a298fd7"}, {"a": false, "c": "mBbJZA|9F2`{Osnrra?Hj)cv,?LB;t#>7JH2qqVZbpJ~>y+H0B#2`!TLDz=h6Y9q]I4Xqd!Z8+lNn,rQI!~KA&!>cHc%{eX", "s": "49ba00474d7853406b24664f0031b34e", "oc": "f96a8c2a31a3c1b3cb41d7f5087cf858ee58268aea9aa805c4f212e5ea22d6f849275e961d0623cb2dad3a3f7fd8953ddf887bc0bababc45e5cc3fcc98483616"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (366, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "$EbKUT+2HJT|i.T2bGi6VNw~Wl`v|lA3Ls{BAoNTOj[iQ(;eBLc){G*F#MF5<2lMK:HbIIl2H2pOH08]?d8c9!nC$8-g*f>;14;<^)-g>>Vw3+Pv&y^26)M8eE{3#2_Mku2r{l4VPxNIUi3_+%1W;z$r-g>TjwPBP;@>+w60=9klzp#2_Xku8?K(RLa{V6-N`)iB_+puh", "s": "f66f9b7c3678d2e9db2b4ddf05e3c55a", "oc": "fcbe6c65338a42498301831c4c3632bd19298881eda03135fe1189ddeb3493047eac136ba50bbb0d94b732db5c4698ae97b68eaf076b9de695ec18e90981532b"}, {"a": false, "c": "mBbKU&X:(2aUi~T2*d8c9!8C$6IRbUbDy-}7Mj;&;^Bj>7`%iA#2.X>uS3Kl}L~~V6JN-)iB_+(X]`9*-nQ)h#h??knzEr&IQ4}}9(BKS`w@y=Z<|PXjx`^``-+b@YMpZ>xMI61!6(L(X9VOL->cs@KT`}I`*V6a}^|feDmLo>[{,&wl{+qw83B3h&?v9g-kW|G9({cGC{?2^T743nx>$@", "s": "e9fb3a2525ad30fe81236814ed0fe4a7", "oc": "dbc7715cc01f59fe115c8146af1fd8abb018f2f9c2e0c04fa8b967931499491c841df25a8db3ab4cc506ca05fd2a5796aa3bc20c4d9f4257"}, {"a": false, "c": "mBbLV8Pd0*a~GhoFvD#SK|+DN2VlEEa^F1mw5-+>Q)|4W61OD%T`=@zO||cAxQ=}b+ytcAlAX*5QqW-BHFGA-2HP^nSgIYsvH{C*27KhBG6nV6RZ_oqHc5^@#&Q,hT-^_7Of|hoElLzGIg5_T!Xk#~ro7z", "s": "3a995de60136970ba92a451457ccd8d8", "hm": "dfb72fbd7ed2677f8abf1019def2d8ea"}, {"a": false, "c": "=BULWXI<0`a6GX2VOZ(:_sIkThDI`VV6a}NV%eDmLo#27_&wNsC@w8nB3hy?Nvg8kWQ.#CkcGC<,2]TC>3nx>$#", "s": "00b9348d3718210f95716bbbc337aa21", "oc": "8bc4a11fc4df6b32c51b1cf6a716880bb7d813a5c3ae1a45a2f3d49a7629393e8cf240dab993a5e18b576de21b7ee470e195486c6d914bbb"}, {"a": false, "c": "mBbLd_,x0`a,Gho~vD#SK|+DVCCeZR*C3uA0=X>HcZeqR8UWM=fsew!$X@DgaU(5Lek}79{d{chZSS@=Ou)3pauAVMP=AF?HN8ktO%5_T3?M}=|b;4wpuh", "s": "fadf8774d65087509b24a4d805e9ca6b", "oc": "f88d0c60333fce19a2018313525d12da4346a4340e261757d0d71d7e9760b3ed5739df1f1afaf1d34abbc947c81b6250d05f2482e45fb874420c1282da06c5e6"}, {"a": false, "c": "mkbLWIPxVP0aGhoFvD#ST|+0V6UUb%$^11oJov|Vsx#KcuoCVS#{{W&wl4+_P8ncihg?R9D-kWdNL4kcVCHK2^Tkb{nx>$l", "s": "8db0e05f4a7923446f6cb73ce981b944", "oc": "fc61a66533b64fa3bbebd7ef0f782484c859935ee553852308e9d0e430abf0c258691d0cc849d9e06b92e2ea61bd2a96e59c61004ab6e5b244107040230ba6aa"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (368, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLU1c5>>w9q|644&(&;v|K{T9^JudiEAJMSUtmtvJFDL4JxnAzZqg;J~z.CHwJ~Z@%Qg)jo1ifV=>!NvDV|%B%BPNh0)fUgx(:kIJTLdje%|Kmwt350kkiV^)R1@vj^JH#rF5b0Af[QvtKWnz*|Ev0Q;~UNki$Y_;E$dz*_<9me1CEm>!82", "s": "947ad94191d788dd7211db8e9729c775", "hm": "8bc7db43a03ea106d3056a20fc4ddf1d"}, {"a": false, "c": "mBbLU1cC1)W4q|644h-&;v|K{S>5XeLm`,OZ4>{L?zySe+-KAqHZ[Qwx}UEGoy}yDsIC-1kJBGMEeXUGm5?^5*7Bzva8xf(9(;kCVpVn>", "s": "d95b671f107dc6b24e7b92169d0ab424", "oc": "8dc7214fb76f2ac8ca53bc06f9157408bed5e8b9c5abc0dd55bac103d599f9695ead3bba83b3a905c53d6d652b224448a635ce65a077c960"}, {"a": false, "c": "mB|9`I-dc<1t<<#tF3L%w*bvChJGw1dMe9fQIh6*Ho|A3|]yhdAfMQ6,`t77*Iy%8Q)~{akT;?r;E$Vz-_*]Fe1MWm>!o2", "s": "5a9a5d1e0196850aaa2ed516b4b2d2fb", "hm": "60bb81bd76dd0d70c645feaad2120e88"}, {"a": false, "c": "mBKLU5c`1UbS`|Ab4}NUhv|KN8U52enm`5pZ8)yz??Q*eX-Fxx%m@YHIz|Vu^?NpV+9b6hI#IO|>jjq(<9v;mKL&k&G=Y&?m*yf!_+=pTh", "s": "fa6f8515f574ec20db2d255805e1bdc2", "oc": "fc679c52dc934289a37be65c9dcc0c4816055136e63437aabde8b995d0af448ebfe002be768b748b3cc31fec66451b6e5e5776b743ff58ef6dc6298a73bbb55b"}, {"a": false, "c": ";7bLU1T41)W|qG4:4h(&;v|K{6BUWi}{@;%I~x_TZAcEM9bw=8bb~}D>=F@t>DbHgI0-uE%Qd1vX`JD2W*xbQ{F-)nJN2Js~oVFC)uCVO$cQY3PHK6)W{ImqGt*7}um2iiJQ>>GrX8v$E9k+Csetpnj?hK9l3e?+IKOB!C.>Rmq|o~0(Ggse6t_Yr4)1oAbUlGK@", "s": "a86c86e17f2885bd52135be96729654f", "hm": "8b48ebd4a8513bc1c70aaaad9e4f5026"}, {"a": false, "c": "!Bbn%84*MeKDAA5j>I%k@T@}c8$p-!O%q$ur}SmNwn39d89A;-u7l&@-2blG#2`EhzM!8Vue{kvTp[ctZsupqR$l0=z-c5Dk5I~KS|14tHE*&f@]{p:QokI(@C`I>F3W~d>v!5a%!Pl&{Rmq|oa0(Ggse#tOYR4zuAuT&_Q|Z", "s": "07615cb108379c06ad2ed0fbf89ad0e1", "hm": "6ab95dbd18d2b7608d75c605d8fddbe7"}, {"a": false, "c": "cIL>%K]#MeKI[is]9IrkRTZAc8Xp9%O]q$urm@mN+n3nj89A;-b7l&Q-B}Y4eTZI^C=fIP%^;8<iTr8c5o7m>61%-rpFh", "s": "f3ac29553674e20cdb2422a837e819c8", "oc": "f7034c6033b3771824d8932fad9f092a1e6c2cd41f87e18f46dded479087014d20ff25cde7e803cfd4eed2b630ae27446f7d97ef6862cd6238e2efd85b148f5a"}, {"a": false, "c": "mBbK%KV*M_KD%Asr>IIke)Z&c63zW922KC1k~eyz-54MaG;aY2h2`E{z#$Ri?&^eY5ae`=IX%RWYT5ocdLDleye|BR$Gv(Mvu>PF7v@(msh?!TeVhqH`7rCe,V*[@>|Nish,;HPXFk{X^>azaF#hKvJ%zy", "s": "e49c97e662e8f45d527492a13729e02c", "hm": "b067db47a848af32f385b82d1e1e0e16"}, {"a": false, "c": "mBbKspyr$A%ACXmOnVPOigIhu96ceUTgXV?2O@M-tz#Br;^6<3WFO7d2eR8qmfygcYM1<dwpvKyCLk0I##N^GnA[daWCr@5864k)M8=lmo1F2cf=rBYM1<KvJ%zy", "s": "7e0f997236e9e1e0dcac95d805eac668", "oc": "1cc09f6533344218a307cede9bbca7b21794026d53f29e1bb5c8785ae88181a5763fcc257b5dee6cf850c174c4a25380b5b02f74079f422b363ebd0b4b15b70b"}, {"a": false, "c": "mBsN(py8fAQACXmOfVmO;}Ihu6n`jLFf8DOik4H[<{{_=gmcMP1f!l(YM1Iv>JnpT}^(7To}`>W|RpeL&$&O*^J`2eKRlY0gW#{2OH?F-Z!0NIo95*CgDOt!Fg2dYI_9W.l@iit64n$Ej6!A{D.9<=wAjE73J#?Qis2^fU@v1o_Oa)D!loEIS)7w(Vz-Q}Kytch?^@=BIRRSsJ", "s": "d94b9cb0277c3007e66ca21674cb84a6", "oc": "46c3a11fae15266a15212c0f81192158bbd093a0f61e0245a5bae797102e896988bd664a79b3bbd0c5e4f12e4bc25456373fce6ca2a8da1b"}, {"a": false, "c": "+BbL@]^KdN?0W$;g)1-JP*cGqK@;mbK5qT&:~f1&IrF!l#bT?wQ2^uT%,Qovb$2<;dKJ&)IM{5qY0E^R8wU-WauG1haKGAhNSrAja?iC`;BMCB41$Ej6[A{c^0L{k=KwHi$f|=wX&973*#%t302^fUHv1Y_8azD!=oJISV7w(VzdDD^zz2hu^@=b|qoX{uN7P2XSf0Ua#fF6H0s3|iwY5u1^!E2*E5sf<40ET~!C?[6", "s": "2a6f9b7560dee0d0d1242db825ea9a98", "oc": "4a6a5c6133f342fca300d707f288eaebe2a88b1e94193a646edc933472b7e2fc2ae41411f276c36bc3cc628217fff716af31ef998631b540a70ceac3183fea74"}, {"a": false, "c": "mBb]SV-%dN?0Wk;g)1-=P*Tmq6X0HB3o?2M)H&Kuvqztv!`SHU#2tsUgv;g_OToD!=o|Id)$m(VzEQU^[tUh?^@=oIRR^d|", "s": "bdbf094f435813346e7c371fb4d1b370", "oc": "fc6cb9755c2061882610db340c0fc525de0bb98b774581100849292be418127e337cc243c3068d3526f90178303909bd748e642be8b3cd8c50401268c7af065b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (372, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "oBb~A;jL*|&h787]WX<4N6qH%hXD!s%e}=}?!Z86dK=XLlHmD45}YpqE*|$Nn{7q|L3yhFSWmNEgP94mCuTJY>=J&nB7OqvG;A$|zx3CMkn3~{>&!m2n.FsTD72$}cnc5~Nf.Di2QYnLe)S~WtLX{usBby9_6V+JAA|5ZC~mE5RQdej4qZ}xLegnq2ok{+^S?Z>lICrxAE3D", "s": "e8ca56090fe684515214fb0937fd7756", "hm": "d4eedb44a8987c3cc60b6a3dbe6ecc1a"}, {"a": false, "c": "mBb2A;2~W|&hS87#WXU&=nqHC)zV_<^FE9*UTx^>h>*q$ZIU(iidiIG8f6-J#2^#O,C^U`TKPU)*4->XeL_ZzY6*Tssi;yfA]|XH^dF$W", "s": "ef0a7712d03d30fe565c7816e70fe4a7", "oc": "6bc7af1bc8b92a5213539ab6a9df444bb4d8b309c6c67fd59515d0031589d966dead0647f9d6abd7c53b66d27b4a5476a535ce6ca19efbba"}, {"a": false, "c": "mB^bA;26)|&h787#WXUN=nqHoLK*%4I#+SZ>%vr@cMkI#>BTY@g%m&?^;qLiX%OY{yY-N|aPs2dCdnquCPB8Jt{6L@*L$Z3!aiid>I48f6-J#<^{O>C^U%oz#U0Q4U0HeL_{@Y6|0sslmSfAd#iH^dF$:", "s": "f3bc97816e10b83f9556622b0c37aa90", "oc": "f9c7a11f08132a3b7f5bb406a91f190bb4dd01a9c2adc449a5ba67938559886981abc23a3992abb3c5386d927b2ad41c4fa8cbfc60a2dbc3"}, {"a": false, "c": "5bbKA;2~_|ZO78TLW1@&=iqHOp0%I)!|7H0_kUNLd)lyD^NT>HMXwT`5(jH5si7o+p;XpQBY{`(~dEQP1IObmf!KF+e]d%z4Y`rp-h", "s": "fd6f597d6c77efe0db2424a803eacacd", "oc": "fc7efcd5134342107301881c9ae933350f7e4662cd7351e988ac7ff464c5d51fb3d1e9aabab251ec8da2de52c52d5afde9c974e15d112a91b564185b3be2f8d1"}, {"a": false, "c": "mOYC^U%o}#(zQ4Ur-Y650sVP%|f$m|iKGdF$;", "s": "3dba007ba788c344de8cb91f6687d344", "oc": "9c6a9c7c63b355a4beec7b907afe345596469c9dc1c2aed42c0f62cc7bfe17827dfd11309418b659340055933dbc03d7758358a942e4aad8d0d11c30a10d01b2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (373, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mDwJ&`+#b#KG01<@?S7(v0Ce|9|(!At1Epd5#C-}fJATrnO1A$@`~)>=$?2Xx*16NJ`#p{On(SIzTv{*<6^Uo7@ai`za1UcVRE2{9n(EquAZP7^Gu{SL7X*)vN#Y<vfRsaWb96udkf]9*wK*cxSH3+)<2uKI4g@LQ=KT=W%JU@`7Exm&ZB)cZvO5D%?;ZDR&vGP(s}R*K`D(v)Gt?8zd<=~?WJ)D3`PBGa3R>CF<4uz$Eib6W)Ne42&14sP=>FoXlMb%Apcg_X1WvCNxJ>3Blto*(|HYatLQJmSSB1j8RTQH)+p4agSYRGzc|BKRP(>$Y&mi_6ul+OFjwtBmQA|boP=&$^6;;01>92oy)1:)pcgZX1{#LNxJ@3B.t#*d|HYa[w2uid#803gNqT03#3-D=#Yb3V+DW?ot0FYEjujDr(A5XNQ9npH]j?^aEq$QC", "s": "f3b94786c218cc06565b8bd01337af44", "oc": "7bc7ae1fc41f26861553ba11995f280b06d8a39ac6fecaf0e59a6793159989e98eadf6dab9b0aa05c5336d029b1a7426a6753e6cadafd758"}, {"a": false, "c": "_BbM9xaw*Q6a<2+zn?~;a;mw=?.nhs+i0k6&c*^;Fr;n8pNuz]%1]=KvMBQ&Tx*;}L7drIlxM^w|5mJ{H)}n)y8Wvo%(qMhc?E#rqd^$N(IZ2Ln-amL|(aR?*zn?~|[P9w=6BUbc7#aX.?!-G<8{f63x(`in#:27x?Y*Hp+DW?otXXYEmnjDr(d5XNQ4ipH3%?^2EX$}C", "s": "3dba008aac7e23747e7cb71fe611b344", "oc": "fc659d33d3d34193bb14d19f077443e5aaf209c870fc4928ca73c79bd7100e82d46931165bdae320e355a67362f0c3440d7c3e133e454be7f5e94874558c6fd6"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (375, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mIb@.A|9!2`{Onnrra}Hj)c3`RFJ>Kp4RJ*89O2XQqL+&Sd_9savNc1V}xK8Mz)(?Kb43xSB-MaDYE+`wxt;OU}4O~mjUn`(-Ab>j6+j51prz>Wjt<01cd3h(Ff;pBD=0k9``h@uOPc1k8tPDz}Ve*A3axKV=|nhAWrE)ZM{J-noMAcDui97T9,DC61AWC4g$Z=r3UshEunk", "s": "4493db011f788f3d52145b00772dc8ee", "hm": "706ddb4ca86dab77c3656434b6ee5fc6"}, {"a": false, "c": "9ybJZA|9y2`@~2nrwn?Qj)qv:8vu0,XK}SSyb%$>)z535#8yXw6D3OJ:#M!|u2`-TLEzzhvYJq>IVXgd!Z=+n4p{=;ot)KA&|;Iio%7eM", "s": "f17b9ebb252d317e469ca811bdafe472", "oc": "f147a9cfb5e52a12f533d606a913232597d8feaec8a5c44b45bf1b936199b97b8e7d364ab9b7cb4627365d72a79a7406add56eecbd7041f9"}, {"a": false, "c": "m>bJcO|9+H`{Osn2ra?H%mbvGLjQ|X$p_~llL&x~e)h9IeWp*>Hc1Zcglk(`D>c%L[BrT07YBC9SR?ZTw>77_!tjaqn%1`|K6AOU}G&KT5L`MM6^rE)*M{JBnozA@IuI97m9)~C61}WCng$%=r!U$fo`p>^K#My;N6W3&4h>Mf|#2`-T;_m=hvYJq>x4u6d!L=+n9P{yQIM~jA&kU.iB%7+X", "s": "f3e9348d7812610f9a5b6bdb9917ae6b", "oc": "f3cc131fce1f2f422561e15689ef24eb67f8f671c6aec445155a6293c899c97e1ecd21426750a845c9fc6da4e52d34750274ce6149584df1"}, {"a": false, "c": "mBb%Z_|9V2`{9suMra?Hj1rv`C06PQbD=g9iI^ijveAhl?CCfOY;nXONU%6{hNeWAP^~yBgzCawT`ou}y6tM20>96vFWWxVpub", "s": "798d56f530f4e4ebdb2b22c803eac0c8", "oc": "fc6a9a6533bf4e49830d8e585f8343a23bb979ce4174256fe81e367a8be8f8568aa394d695cbb720db378db512fd36f6eec235d18f8a3f4d49afc82caa358f32"}, {"a": false, "c": "moSJ>AF9c2`YOsnrbgM~l&V4vB#m`-TLDz.hvY)q>I4Xtd!Z=UnND{rQIt~KAb!;ciBKxeX", "s": "371a07904d7e23946bbc571f6682b044", "oc": "fc3e076133b341a3b5ec15ea0f9c8828f55d2588ede8e88d44c220e9caea68f28700ff9a1c76b82b4d43393f7ed69291dc827dceda44b981363c0833ecc3ece4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (376, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&X2H25c.~T7C$8Lg$K>~KW;F^)-g>TjwP+Pm@?+w6)=87Czp#2[X$u8rKlUUa~V6xNI29h{+{u+V`(bR3+NlS1G9=H>`Tn8b]&_I`b&=e3P;1W;>W)-g>B%cTeP6(", "s": "79b9687172129100cfbb6bb243a7fad3", "oc": "fbc2f81f881f25326553b10c3917230cfb88b2a9e6aed4dda9ba6f901589c9324ebd064a6933a845ca36bd327b2a4472a630ce532da549ba"}, {"a": false, "c": "mBbKU&Xc_2yUi~T2puV", "s": "ba665975287432e0caab2dd3d5ea8aca", "oc": "f76a96653f9f32199101be7c9e192bbe8929fb60ed60003e58ad393d980c8487db5cc30b10757b34d41723db9c469b8c9806850f0b9d91e66fc7f831d631593b"}, {"a": false, "c": "mByKU&X|H}+Hi.T2md8c9!5C$>IRbUbByFAgMRu*c^Bjon`%n<#1_Xk68rKl^Ld~V[xNI)TB_+GM$Y%=72XPyN*B`cTAP6S", "s": "35aae448b5c820426e8c671f62ce58f4", "oc": "ec5aee6531e641a3abe187ef683b5a871a4e51c5e32a123a8e907406dd58e4a35984d13c8c8d65413a392acc14d40d147d5b8fcdec8536c3e6c044766c5be2d3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (377, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB;LWIPx0`a#GHoWv~dS%|{DVYWwCkQR#CtCmpM;JV~#b*?bef{d7*jT0qM-S):(Ua`9*xMIc1!?)=c%KqJ9^_QhZfc$2Nd!!8sk>c`58pd?&hAZ_oqHvY^@#>Q*aTu^_YOf|VsIkTmD~*V66a}qVKe9mLG#28&&wl++_w8n53(!?v9g-kWQNGjjqGT8@", "s": "d27097b7302d3089837ecff6ed0f70a7", "oc": "fbc9a31fb8ae2abf15535c26a91fb43fc794f329c0aec845d0b46b8cb591596911edf64009c3abe5d2165d02f7ca1b066695ca6caa9f42b5"}, {"a": false, "c": "mB9LWo&xy`vkGVoNvK#,K|ADVC7lEEd!}13w5vu>Qp|48W1ODP>`={zO#|cMUQ=}b+y4(vvA|*$1WW=pH06C-|a,^n=gIYsiH{C*(7KhBg`nVohq_oqHcY-@#&Q*h69i_7Of>ho^U1zG,05NP!2kG~rl7z", "s": "5a3a7ebb0a31adbca917fa161980d2e1", "hm": "ca175d3d7862677f367dc11ac8f7fbe6"}, {"a": false, "c": "LBbLWIPxZ`afLh0FvD#SK|+DV8vcjLHX#sOZ->cspkThDI`OV6a}NV%e${", "s": "fad037815858649f5504e3bb9315aa2a", "oc": "f4c7a41450692837ae3ab4b6a91625cba118f0a006dec4e5ccea60937097d8699ea49644be281545ce306801c9ca5ef686354f6cad9b62d6"}, {"a": false, "c": "mBbLWIPx0`a~G[oFxDfSKzcD&kCE8R*C3LA0jX>Oc`e}R8^1MRVsewc$X@D%aU(|LKkQ54)o`whZS{@lOu)p,autYMP=AF?HN8kJMn5_Tq?_O=|MM4wguh", "s": "0a6c9e7286b9c2e0db542bd8cfdacac8", "oc": "876a551033b344f9a3018ecd420d128afc472e40be722867b0ac6b7491adb3ae83b9f162aafc18d3e464b9afa67b2c59d0ad9f82e84cac03470c72c0020c554b"}, {"a": false, "c": "7!bL=+Px0Hg~GhoFvD#!C|+RqNd=b%h^11LJovt=>xVsq8B>>R#+>_&wp++_w8nB3hg?v9g-mWQNGykcGC-K2^T7Z3$x>$@", "s": "5fba0075477e2c44ee7c97196c84b8da", "oc": "77639c953325c1519981d7ef087dbe8ae7f733423ab38e53e20910ed21abff0b58f071c5f958f905b8c5e23e98bd4a91ff576d924ab6f5cfb548fcd09c067159"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (378, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "kBbCU1c|1)W9q|*44h(&Xv`.{Y9M)7d&XOJM-Ut>5vJF*-:SR|mbDFbJ_3dg6>L4JcE1z#qg;J~aXCP{&~s@!Qg;$h1g6v=>!%vDVAeh%BPNh0)fU{x|>_IJT.)je%|To3t3.0:xPez)R1@HjcJ^|rs5bH<0K5L>AfMQ%t`(Cz0iE%8Q=~zAkT$v-;E$VzN_Q^mo1Pbm?<82", "s": "92912c010de7e46d96149fcf103ae755", "hm": "30678b5ad7485b32c3056d3ebe4e2ff6"}, {"a": false, "c": "KBbLU1c4y)M9qf6q4h-&;p(K{c+5X;9M`kOsc)XL>?DhTu-W-q8SIDhu7UE{#2}y8sICL1kJ&%MEK{DGm5_=h*W:zv70xf(99;n`?Q+B>", "s": "290a99d5207e3b65b27c12660e0b74a9", "oc": "bba281efeacfea32fc591c21a21f260bb7da23f5c2aec645556a67d3553909398e853646b8b3abf0c53a64025b2ac4f6a637ce1bae0fa9b2"}, {"a": false, "c": "mBRLUNc41)W9ql64!h(&;v|X{LTe1^}h2L`Wf}hGISxoZWEI|&4SNIeN@*<&;L>v`O-,cw82", "s": "8aca976301563d23a92c0ebb5a90d2d7", "hm": "dab5bebd7a59b77786051119d49dd8b5"}, {"a": false, "c": "mBbLU-c41)59h|64yh(&_||K{865{e9m`5OZ4)Xl,Tyheg-W]qH8&DwuvZEG#2}l8sIU-1vJwo~kK{UGz5?^5*W`zvV8Wf(9(WkaX++B>", "s": "f3b947817ff867af9c5bdb405337516b", "oc": "6bb1a51bc82f2a3c2553bc46ee1f840bb718eea946aec495a5ba479318a08e698ead434a79b3ab55c5367d22a32acf26c035c0ec1e97a9e6"}, {"a": false, "c": "mBsLU1c}1)W9pbLU1cm1)49q|644h9&;vBm{6B9W5A#M4%", "s": "3d1a00efa478c658e77c970f6660b3f4", "oc": "f74a4cf1e36371a006e1ddbcbfedc98c1db7d7cf4c69589fb3ad8256bbbd3a99b4486541cf9ecc43fb9d483f1dbf5d190d56c554977173b21b46f9390040d162"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (379, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "#gb=%GV*M>KDq7sr>I~keTZEcYH9b4|8fR~p8>EN{k{w_HgI0-uESoh1vv`0C2W}wLQ{BX}b+N2)j~LVF-_ub{Z$cQZ3P6O+aW_Im?>8-L59X2etJQ>>yzXQ~$n9T+Csetm7#?&`9vde?+TWkk9%6ZKy3DR&UKg8DUq1d*rt.F>G%TU>Rmq|GA0JGNke6A_Yr46uo^T&{^KZ", "s": "9493db018f3d8e6d56129bbcd709f745", "hm": "ed6c2bb7a858fb32cea5661e0e4edfb8"}, {"a": false, "c": "mBeK%Ks*MNKDAAEr3h~keTZA]}$p9%O%q$Grm@mNHn39d89A;-x7l&{-nbZG|2`Ehz#cNVFh~k[TZAxL}s-g0E$yT=Czc5Dk)f~|u%D4QHX*hf8,+p-cokD(@z`M>UnxT&m{?5a%!PQ7A*ld_F)~n9o6]VUj;!FumWkGAUq?dArOzF>P%C%>R)qro~((Gg>e6t_0r>Y=o@TW*@KG", "s": "da9a5551013606c6a92ef51b539c82d7", "hm": "64e728bc73deb17ffe79101af81dabe7"}, {"a": false, "c": "EB7K%Ks*M_|DAIsr>I~#STZAc8$p9%OIq>Krm@<$+339d8NQ;-u7l&A{BbCG#BmZhz#$NVuia", "s": "f309578174166f5f96521bbbc2f369ec", "oc": "6bc701efc81f2be21553dc05a9bf24d2671823eb41af14d3a5ba17821f9785697ea1f51ab7b36b45c5336805bb47f40aa635de6c5477fe81"}, {"a": false, "c": "E^bK%`P*}6K=AAsr>I~kXeWr&R3>{.0905{D&>6_5{rpu|", "s": "f61449753974e3e0db2f2ddf0fea65c4", "oc": "f8669e6543634259c300885a1d72d82e191b2cd460f5e20e42dd937090a79a382a89360b57770959d8e656da13ae7ba7aca9373f66fb37624febbec1601e5f5f"}, {"a": false, "c": "mBJK%Ks*MeKD~0sy>4~AeTZuN-Gz~G;20d1k~e`Y-54&a~;cYK+2jEhz#$NVucd!z*ANZia", "s": "3db9024f4d79204e7e7eee1f1657b044", "oc": "fc62986133b861a7bbb1285c4e5f4a609f726a30f235425e75d5fcd9303583a2b63ff3a58ddc141dd2148aede5cbc95cb55df3b8e023ea28575b1bb5b6531cf5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (380, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK(%x[$zQ?CXm}IVmOX@IxuY%`<&yYg}p!kIX%RwO%nondL!l##eaBnbGv&)CDk|IuRvS*W@PmZ7F!TeVhqHX7rCaiH@e%^;NiQhD_azaF#$GKvJ%zy", "s": "b1b396bddfed845e921f9d147b29c7a5", "hm": "10b86b4f29b8a075c30c6a3dbe141867"}, {"a": false, "c": "m=)K(hyr$AQAC>mOIVF4i}Igu967eU79XV>28@M-tu#Br;f6D3HFODdr218q8fogf7M1<KvJ%>y", "s": "197b99b5137d30af8673aa162ddf9457", "oc": "4bc1a61fc81f6aa2a5c3bc05a9a62b0287d6f3a9727ecb45a5ea670db549a96984edd14b09aea89583386d0275fa24b6a635c5dccd9ed92bc23171bf8e8eafeb"}, {"a": false, "c": "cBbK(bF`$AQAC}mORA3Q&=khuLr7=wKv)CLn15T2HK9*f9CP-@-CrztE?jZTtZ``4A3^PyGz{|8T=`;b9{A2Brc{}6!(gD:l*_|{%^1GO,WxpHAX#dc{E5Ttj;c7W6Vz*x{JfXB?_pG;!(2dzD!=L7A;`m", "s": "3a9abdcc66369d20a952851b5450d221", "hm": "6a375dbd78b2257f8da51f7a34fddb47"}, {"a": false, "c": "6kJK(pyrz}QACMmOIVXgyNIhu9JceUg9(lr7Yhr`o{d{(7RF=b-K!g;7>KvJ%+y", "s": "f3b5c78c78d9170f955f6d3bc937a98b", "oc": "0b87e13fe82f4a627513bd01551f640b98aefdc5d86ec4257aba619315946be982fdf640b9b9abe2c9600d02722a5476a6ca736caf1eda1be53ed64687aabb94"}, {"a": false, "c": "mBbo(per$A(ACXm,IVmOi}|hIBte?>Ow0vK]<_-0I#ZF^GXA#ca7>rO$S(JY)AK=lm81F2c$=rkYz1<KDJ%zy", "s": "fc5f99764befcde94b5420d8050a9fc8", "oc": "5c6a956e3e6350b9a30877dbfbbaac021674d28b5bfb9414a5108844e80181a57132fc2b124dce5d38ffc174f4a90c69b3232f8603fe427b3a41706b664295db"}, {"a": false, "c": "m!IKlpyE$AfA#X-OIVmOi}Fhu6n`;}Ff83O>b|?oj^0_=jmcL`uH|W!V*|iQNaUz{O~Nqt]~wlY7AqC[7UBT4+`+IO>JKpjgXtqTo5pHWORj-L^$=O*We`x7wRuY0zWK{2)VpF-ZgrN>o9CWPgDOt|F~2d-I_cWPuj`0M647JE)6TA<1x!E%%1I5$YKE}thw[uu-U|ZEw&+G8ip@h", "s": "9dfad6a1cf3684bd52d49d6ee72ac737", "hm": "9d672644c84cd738c3066a30f74e9c66"}, {"a": false, "c": "m#bL@<>%dk?0g{;K)X-P*0k=Kwcv$GK=wX{D^0s{k=KK|v$GK=wXO9%wJ#%Qi#2^fUgv16_>azDK=oJTyd7d(VzmcU{zkvh?^@=oIRR^HJ", "s": "33b93521781d612f975086bf2435a05b", "oc": "fbcea8ff001f2a341557bc16a91f2708bfd8735ccdae847185b66793169289645c8d094abdd3e54489266102dbce5c77ce454e679d84d2b4"}, {"a": false, "c": "mBb~WV^&dN?lW$rm)SPJ]RcmqB0r4!`y>b|qoT{uNXP2oSfKUac0`690JMSXwY5xR^!82|O5sr@(`%!r@k|7SrLcZHq|ak2j!NO06~8&a^@nuE0~AC5zy", "s": "fc6f29253674e230cb843dd90bebcaca", "oc": "ac6a95253f33408fa3001aa9125515ae5ad48020876124f2aec0b8d464075d9ced69b81a8696a3ebcad142c912f1ff30ad58e669863bb500d87cf88359ef0a2e"}, {"a": false, "c": "mBbL7Lv%dN~0rb;g)1PJP*`mq6>0H83G?jM)aMa-}fz=8!`#Ht{2^fSgv1o_OazDa=oJ,~)7m_VzEQ+^btUh?^@=oIR*^HJ", "s": "3db40040457223446e79071f660db044", "oc": "f8676d740c206e486ec7ce140c19c505464bc3b3f5b5045ab849d9bd041ca96ad7e162d3b3b9858906f521560db902bd0c427d6009430188951f18b8f7a53e08"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (382, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB9KAh-n_|&h78*aWXU&=nnHIYPlG<%liRa|4|<(dK(XLlHUDn+@Yp3E*k$Nnh!q|L3{hw@dgN@0P94-8uTSM>=j&&B76`vGBP$|Xx3CMy{3~nC&!mo4|}s#D7t$Vznv5KN&ZDP2Agnaer.~DtWX{}yBbc<_1?+JV{#4L{f3E5RKIe-4q1SdLQg!q2A0{*~?}Z>lfCr>AE&Y", "s": "24b5d60f0ee2845952642bc2b78bcff5", "hm": "c897d434a748a835c5086a385e4ed716"}, {"a": false, "c": "mBbK>j+~g|&>7x7#WXU&&nqH4CzV_R^d*L$Z3nWiidOIG[fz-~#2^pOgCFU%oK#UzQ4U>FeL_z-Y6h0swP%#fAd|iH^d-$W", "s": "f90e07052a7dc0fe8c7c8006e441e1a5", "oc": "eb90a11fc50c2a3e655dfc0da59f249bb0b81ca9c6be7b45bf2b6a23c399896da7a5d64ab9be8615cd366d024b2a6576c638c66c0d541b4a"}, {"a": false, "c": "mBbiA;2~_|pw|?7#EXU&N]qH;LKI%yI#+SZ>%7r@`MkI#>B`{@g%mD?<;Uda(hOY{NIKN|aPs2di|n9ugm48Jtw6L@lfCrxVq3.", "s": "65c25d560148fd50a6d1a51104f0d241", "hm": "4cb78dbb68f2742e89751635dcf8dbe2"}, {"a": false, "c": "m&5KA;P~_|&hXC7#hwU&7FqH4hzVuI^FE9EaTx=Bh>*A$U3UaiijiIG7f62:#2^>=gC}U%oK#UzQ4U>QiL_zi^6h0ssP%yHAd|iH^_F$i", "s": "33b9a7b1ec186101a85b50bb3f33aa0b", "oc": "fbb7a17fc81524336f50b606a2ff24ecb774dda966aac4b555bac7b3e599a96f8eedfcdab9b21b45c5336d067b2a32f67630f26cab911b4a"}, {"a": false, "c": "m]{wA;?It|&h787#Wl2&=nqH4Cc`S)f|iH0|ZUN!PI}pvPk^%)I3*@lLoM{>DkFTOpOX2T`5Fq}7si7o+q;}pwBZA1T~*8Q_dIeemf5KFfe9h!z>Y`2puh", "s": "fa6b99759174ece0db142dd9b8ea7ac8", "oc": "97636c153ab34219c301ccec314fddbd7cb53830cdd34144980e3fcd7d84480dd5b902aafab231958dd24c82052d1ece4cd9f65fd2782a3755a49e62547aff01"}, {"a": false, "c": "mB_KA;Ei_SQUp8I;Wznt>{qH4,*P0M$E3a=Wwqzg_}inIG(B$L#2E,OqC^U%=K`UzQ4U>leL_zbY1h0scP_yfAd|iH^R+$D", "s": "3e9a004f4de123446e7cb710d985b047", "oc": "75ca9cdd33b641039b01911ebbdee457e74c7c4a9892279405fff6fe7eafdcfa05261f31f820fa5a33a0cc5a3db713d77583537a4f44a277d2d1ece011cc0262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (383, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "RBbD&*+<+W9-WTGy3g#Y!CMH#YUj^0C;_B24U{#WBb#KGw1<@=$?2X6e~*1UcJ`#2{On(E^~PZP7^G?`sL7X*m|N#Y}JpxT_eu4UzmrWp|i!", "s": "dbbb9df570fd10fe467ca516ed1f1791", "oc": "fbc7ad1eb8132aa65b139c0fa9412f0eb228ffa9a6ce4445a5ba67a31399b5698ead764a57b6ab4cf7067d32e32a547ea665caccb09ede7b"}, {"a": false, "c": "mDbJ.?c<+WNnFTGaH8#Y!CPH#Li56dAJo,ZZs.[bwZs5=T&nn}P=yV>m*MaYnM.TsIvHCoL6czth7=87+?)8j_qYrWfFM>c<<0>>x_=DyQWUx|cg}Mznk9gB4M>8~H!SgiJ3-sUM@`uc^~-stkH^q3+T8-", "s": "e81a5aa6e1981de9a92e844bce90c2d1", "hm": "6ab6f0bd78d2b6d385651d0ad83ad4e5"}, {"a": false, "c": "5B4J&V+25WNnfTGaHg#Y!CM3#}8d]x31ayoGQIzZv|n<6^Uo7QS*`z>fscJ`qL{On(}q~PZ!7^GuzSL7X*r_N#Y!(Lx|4uu4UMRrWp8*(", "s": "c3393f81b8186302305b6e1ec3f7a192", "oc": "a7c1a92ff91a6ab216a30c0a63192c8f85a853a5e5a8c44575ba7593fc95b9698e80f64b69b7aba4c3366d027b235494a6357e2cedc9d4c6"}, {"a": false, "c": "mBbd&i+8+WNnWTGaHiNY!JMHRB>MUqS?bp9$?IVkzdRu#88cuu+Esd|<^6adkZ2%1BlO#`Y|,Ba$YGm|@6u=+OF_w(B8QA|IoP=&8B#B;c1>$]oy)SsApcgZ?1WoCaxJ>3Blt#*||HBa{jLh%5N(CVIMP&%eW1V", "s": "0a9a5da207349d83a92e856bd4b0d6d1", "hm": "6a27adb388dbb776a671261ad817f0e7"}, {"a": false, "c": "mB$M`>awLUha<{+z|?~|a;Cq=8ywQ`iv#8eAgNq!bK#C2fxtYT3p+DW?oA|M*Ejnj{<(d5-[Q41pH3R?^aqy$kC", "s": "ffb93abca818670f985b6569c3e7aa2b", "oc": "fb87d1dfc91a4a32a55eb50c83af18fbb7d6b363c6a9f445895a6f9325ab41cb832df64ab353ab45ab566201772e54720635c06cad993cf4"}, {"a": false, "c": "mBbM9-gwL46a(([3n+~3a;CwzZ.5?+jn?;||;Cw=6d!bc7#<#Ak!QC", "s": "1cb070404d7c90476e7b4c6966411e44", "oc": "dc8a353533b321a3b8ede5ef57fb4428cd4c07bf30fc222d9a73cad0bc264eeda46fd65666a6f85ca4f8ab78e280c4442f7c9d8837487b6614d21e1455cc3f46"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (385, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "RBP:Z{|9Z2`~OWnr~a?Hji|A`YFs>554JJ*8LO2XQvL:.q;_9T0vNs&V}ueTb.)(?KbP+xpBxMa;z2J`wtSCO(l?O*cKsn`x-AcBj{+j`yprzTWjt<01cdl5(F};pBD=0k08`h@qOPces5o[bB$V&*tt{1K^6Fn5)W;E)*Mm&-nozA$DCn97I9,DQ6-}~C4u$Z=r!U$do1nk", "s": "94981102efe734bdbf7e9d69a7a9d16d", "hm": "8863dfb458489f3633476a0db08e5417"}, {"a": false, "c": "mNbJ2A|zcq`{Psnrra?Hjwcw`8vf0{XK}SSaw%$W)p?J8#My;w6W3&4hIMX|#2O-Tyaz=hZYJL>I4ENdfZ=+nfD{rQIt~K,&);cEB%XeX", "s": "890ba7ba203d30fe465ca82aed8bf5a8", "oc": "fbc7485f8818216e6753bc56d91d810b6758f839518ec4b8a5bac793126189691e5d8649e9b3ab4a20c66da270fd547470b5ec71ad654af9"}, {"a": false, "c": "mBbJZAr9c2N{Dsnrra?ljK=m`LjQ)X$p_~|lv`xXs)hiIe5>~8Hc1Zvglk(zD>Vn^SBrEo7YBCOSR?FTg}778!tKaqo%1)Lyw{$>a1B;8.My,w6W3&4o>Gb|#2`-Tf=z=haYCq>I4X~d!Z=+nND{r}It~KA&!;ciB%7es", "s": "f3b9c79dd84861ac358f9bbb6333aa2d", "oc": "ffbe7c1fa8bf2a3e1b55810ba94f240bb7d8f3d0ce64cc25abbac793159a89694aeaf7eab8b1a945c5e66d72772a5b76a635aeb7ad9f1109"}, {"a": false, "c": "{BeJZA|9c2n{D|nXralHj)cpVa0|PttDeglv<_G$gUCeMg0C@Kh2$vc>IcimveChO.CCfOYZncOPU%6dhTy{AP^~yBgzxaLL`@>xyWtM80>96vFWMxV~uh", "s": "fa8596783674b2efdb947dd805facac5", "oc": "f342116533b04219a58c8e4a5d3343f78eec796e4702becfe9aea6c87b3dad9613a29bdcb055b7c0db3dfd504562caa0bf4035c3b97c3d2da2340a40113285d7"}, {"a": false, "c": "mz+JEA|Kc?`{Os>rrb?Hj7cvk6LBOtx>7#y2q|1Zbgq~lyV4vB#2`-TLDH=_vYJq>I4Xqd!Z=+0ND{rQI:~?AO|;ci<%7eX", "s": "fd3a00164a7833e46e7db51f66e1e314", "oc": "486a956533b940a7be01d2efa77c3850f668284fede7ac8e34523be9ef2a69f25706949a13f6650b53f3f89fd7db9566d72870cebafeb26105cce9222c538e94"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (386, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": ":BbKUeNFHc9Ui~;2^d8r9!nC$Y%)b6n#=6+QU4Now8-E?<{rY~X~p<0OT7vY:dtNUK{PMeBgPC+6&?_F$VDAXKB}ehO([FN{p)3|5M_uQjc4Bdxo}Bh(U;K5M9IQ^X7YeKGi(IN*NW4`fX+n3LzlAAEZuR3&>sQBNA8TO5o_QuI`BLcp{G0?RoF>@]dMKvHbII;1W;<^)-g>Tj*P+P;@o+w6)=8kCz9#2_ukurrKl4La~VmxNI)iv_M%O$YPpk2XPyN2B%cT9P3s", "s": "d20b97150a79370fbd7cac3e1d9fe007", "oc": "8bc7ae16181522f3abb3bcb60434d50c57d847a9c6aecd45a5bacc931c9089198e3dfe7ab8b5cb45cbab6802782e21767535ca6ea26f447a"}, {"a": false, "c": "xHbTU&G*FR3F5D2lMvW(b&I&qxg7ww@lH", "s": "7a9a6d5661356d8a562d70165390e071", "hm": "e1ba790178d4b876e67616dad18d1bf7"}, {"a": false, "c": "VAbK.]i2HoTUibT2;1E;<^r-g:Tj2)l};@s+D6@w8yCzp#2_Xku8nKl4La~V6DNI)Ok_Ls!N87Dgwgqc5p(YP|zkD!jK9CY0Q]%ADMZfcf{7rV)jC|^wm+`{Vw@HRaO@329vuebVT^XWW_z$fGC_3vA>pu)", "s": "f76c9975567452e0de2e2bd82feadac8", "oc": "fd5a2c65f33f4919ab012e1f9ddb3ebd192aff7bec86966128cde5ad98ed8c87decc1d44087999e3d4ba5cdb1c4669021caa1c090bbd5c96917ce101d891e2e0"}, {"a": false, "c": "{B}K}&X2H2Tei~E2&d899!nC$EIRbUbBy-SgMR~K;^BEEN`N?6#2_Xku!rKl4L]~Vg#NI)i4$+<:$SPpkWXPbN2s%cTHP6S", "s": "9db8604c467bb3349c7cb315b6f8b444", "oc": "c8cb9cf533bf41644b815fe7082b5a27124351d5432e9c4a861db05f50adc4deab1cc181209d9018361a37fc156a0c153d5b88d722353df4e4f09c714e5a36dc"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (387, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb_WhIx0%a~GcoFVw#SKsg?VW1{CvQ]gCtCmFM_%e~>b*?be%Od7*5T0qM`N)z(Xa`9*-nQ(h#h>?knKE5&IQ4C}9_BKS`w@yMZxhI61G9D?c%KqJ9-_Q36fj5CNd3!gsdzF`5wedD&hAZhoq:cY^@#&@*tTu^^7$z|hoElm(GII5NP!2KG]Fx|C", "s": "9496d6e90fe7845b52143d89772dccc8", "hm": "8b603f0458480b12c30766ccb649d0cf"}, {"a": false, "c": "mPbLWIPxsYa~GhoBvj#SK|+QV8}c(L(X9VOZ#>cs&kT2DI`V466}N]%eDmLo#2{_&wm++_:Q{c3hg?v&gHkWBc-z8cGCHK#^Tx!3Ox>$^", "s": "63bae88c7e186b0fb58b6c5b933dba7b", "oc": "dbc95f1f485f67327773cc06a31fdcebc734f629cfaef455a5bf5670c09939515e6d964b2d13ab1095366f027c5a5dbdd674d2697d7946cb"}, {"a": false, "c": ",BGLWvrx0`a~GwoFvD#$K|+DV3CJBR<&&PA{=XROcfe}R8^WMRfsewr$X@D%aUB&Ldkh^9)o{FhZfS@=Ou)p$%utV0WzA]y}NIkJO%4_Tq{|e={M;ywpuh", "s": "fc64990c90cb75eb972bdac80aeac2cc", "oc": "fc7ac06933b3e719d3018e1d3264510ed2a72e220746e8574081127a9d20b1cddee92e747cfb18c3b0db6947386ad55f90b98482e7acb814450c42c9bec6c2b5"}, {"a": false, "c": "mBbZWIPx0`a~G!oFvD#SKe+lL+6abhl^11o(ovs`:xVKcfPCqS#2{_&w6{+_p8nK3hg&Y9g-]WoNA(kcRCHK2^TwZTCx($@", "s": "3032bf4f4d7923486971ba3b6d81b855", "oc": "69ba0ccc35b31aa3bb2d7def08ec251ec4ddff32c5b387dd0b79ce85eeadbb14c3642a0cf3bffe00603a022ad1ad4a3180f06a612ab7759f95106bd0933caf73"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (388, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBVLU1c41zW9q|6!4x(&;v{K%+{^G7|5DA[$-ht~tvhFD-,A<|0bIFbx_38gS>L>?xCAhZqg;J~zvCHw&~>@*Mg7jo1e6*=>NNv&gAe}%BPNh0)fUxx:>_IJTL7jZ%iTm3t350k}PVz>;1@+|I#HVr15b050458>efMQ%t`tCzNUEB2Q=~za>T$5n(E$Vzm_*^me1YEm>F82", "s": "d42ed62600e68e5d52f49b68e729c702", "hm": "8067db44a9b85b32c3056d8eb24e3526"}, {"a": false, "c": "mBbL:1c41)W9q|64{hB&,v|K{]`5Xe.m35O64)sLL%>heX}WGUH8&Dguvz,G#*Sy&s]C-1k=MGMEK$UTm58^5*s|Wv(8*f(D9;kS{p+B>", "s": "d90297b5b8bdc0e0c779a8760e353795", "oc": "fac717bf4a12fa721553bc0a691f240bb7e8f3a986aec340a7606793d53699008e2d1d4db9b3ab873533bd07dc2a5416a6350efc4b77a061"}, {"a": false, "c": "?xKL?5c41vW9q|H4{h(&;k|K{Lj:bN!h2L`pi*@*IAxiZWEp1_vShIeN<%RBmt>9`O-dc<1;`<{tLwQ%w*bdChnOuYf3o9fQ$%6M)mpANzKI9dAuGQ%D`", "s": "f4b93981c418610ff85e669bc317aa9e", "oc": "fac4a1ffc8abc3514558b706af7fd80bcb68f3a17fa77425811ae79b13d683f98aad764a8fada665f4d6c882919a0ed6a6a5de1cad77a9e6"}, {"a": false, "c": "mBjL4uc-1)W^:|64Jh(&;v[KXF`tAY7M@4_eE%C5}rHTnlo2+h-2vUiIy1vhx?%(eYHIJ|V0r?NpV+1bGhM#IO*>ijq(kOCHmKL&;DG=Yk?XL!f!_Vr<3h", "s": "f4639ed54e74e239d4642ddb073ae2c8", "oc": "fc5a9c9437b972f7a305890b9dca954213135531dbba4aa5fbe98955f1a2f4f0fc9ecda4768c382c79b67ab7dcc5baae3efe6533846f581a86d9294e4d8ff509"}, {"a": false, "c": "m>bLU1i4~)W9q|644h(&;v|K>6BUWiJ@M;%AXp3vR3|wcRRsQPTXI~]eTZAcYM@K4)8fb~$D>bF@t{KFHgI0-uE>ohrva`JeaW}*Lu{zT)*$Nh)s~UVF-)=bVZ&cQL3PuB6YM_Imq-t*d59P2ii0Q^>yrXQ9$R9k+Csetm7E(HK9{dR?+zDkkO%udKy3dy&U^UeAUq1pA@LMF>0%C%>1kq|o~0(?fBZrrGI8DCH60$cdxzAANZia", "s": "190b97b5207d30f9867ca816ec4f1d74", "oc": "cbccae129817f8391553bd06a97f24015798f9a906ae3a4965216715b5998e698eabf64d87b3ab45e5360d036bfc5e76a632ce4cae77a0e5"}, {"a": false, "c": "mAb<%Ks*MepDpAsr>I~keT7AcLZs-pqE$v7wC-h3|s)4~Ku%Dvt_XsDfw4Z|-;CkD9@z8M>oq8Rdja>5a%lEK7P^l%>lmqAo~0(9Ps06c_Yr4zuoAT&_@KZ", "s": "3a955d590b366bf0a0cf858bec929741", "hm": "ca370d907dd5b17f127de69a7a2dd314"}, {"a": false, "c": "m8bK[L3*MehDAAsrvv~-eT|`oK$p9kOc-$urm@mN+n3id8xA;}u_l&M-B5tEFX-SyMqY)3lH;8sm=phPk@`z0mtrzC?=HAW<|`JPNUe5Q4DkOjEY%T|Xe7r`#3>tTr=d5odR>6L5)rpuh", "s": "fa6b697530adeae1db569dd805eacac8", "oc": "fc5a9cb533514f195d007bce73787d20196b6cdde0f5ecef9d3d4f1712b728c120c9976c97b80f9fdd71d2f631bf29f4606ec89f377e3762bfcbba2be15f8f95"}, {"a": false, "c": "0|bKWKs*Mecjo>Vf]IYk0TZAF6Gz~s22KC1k~e`Y-5s&a[FcY3i2`Eh{#$NVNf^e%G;Ncs(DZH2XykHXh>a+aF#hKv|%zy", "s": "949cb158f1e7625d5214976cde80cd4a", "hm": "8483dbb4a5b890325306ca37b9cb9f16"}, {"a": false, "c": "mBbK(pMr$@QA;XmOIVmOp}W6uuEceUg9hRg28}M-t}RvJ%zy", "s": "d60397bd407dc0fe863c88ed1d09e07a", "oc": "f5f4a116f91f218d1d5343e6aa1c090b5a837ff9c6fe644505ba6733299a896e9eaddebab9b3eb48c6769d149baa5916c331ce6cad5eeacb66319a9f87aabfbb"}, {"a": false, "c": "mB{K8pRr$AQACXmO*o]x=}%huLNrFwKvitTa15TOHK9Gf9WP-7uC1zGE?,Z,tZU`dA3^t-GVWm8T=46j9{?CB2co}$!JNnzI*_|+%J(GO{WxpTAX#dc{GYTtk;]|W6Yz*6{=fXBob0Gy!(2dGD!=L+nV>S", "s": "3a98d4566536990092b28b11049b5261", "hm": "6c775ebd78e6527f8675861a6abdd1e1"}, {"a": false, "c": "mBbKKpyr$AQACXmOIVmO.}#du968UUg9X$?2<@M-tz}Br*^6HPWFOjd2#Teq=fdgcY41<>v^^Z+O(dU7PtB!W{GE(;RF=bBK!+;7^GvJ%ze", "s": "b3b9367998d86a0fc56b5bf4af377025", "oc": "3bc7a4ffcb4f6a826520b7d6a01a91071779f3a976a80478a2b36b3415b98960ceadfb8a39035b4ac50561b27af0e47656242e60b59e9aeeef0658da87a3fda9"}, {"a": false, "c": "mBbC(pZr$mQACXmOIImOimImuBke;>OzovKy|G-0I##NBtXy3daWC6O$4*BkY0KvlmV1F2c{=rBY#13OIk4Lom^=_=jwuMuuf!l(YR14`+1OBJKp.7X(7ToG6HWORp~L^$Or*^,`x7Omub0gW#{2O.?F-Z2rN5o9CWCgDO[!Fg2d-Ijcn7ljFiM641$Ej6!A+1h!E%%Ng5$YIE}thwhu6_U|T4DA|_8(puh", "s": "b4c3c7010fead24d580f3b6b17e93545", "hm": "8061c44668c16ba4f600694db8770219"}, {"a": false, "c": "mAbX@VzBdN?09$;g)}!JPv{D~?m{&=)wfvNG{=wX@9m8j0#Qi#2wOZgv1o_Oa}D!=oJIS)Ym(VmEQU^z)U4?>@=~rZ05kk#K>c@$(K=bXj9-3.#%QT#2yfe)v1o_?azDH=oJIS)7m(VxEFq^zp.h?^GfoIRRyHJ", "s": "d3b93f897810660a905b8bb379373a29", "oc": "22c7a116efef2a321423bc66af10740bb67af388d6aef44545ba0e939ab985c9deadde4aa9b0ab45c6366b027faa547266c5ce6cad998a1b"}, {"a": false, "c": "53bL{V^%d^?DW$;gZ1{PU*cmqB?G4+q<(Y|qoXbuNXWyXSf^UacDBy903n|6wY5x]W!82|E_slSf`r5r@A|PWbaM;H#nah2hlNs0F~8DaS@2u{Ts!B5zy", "s": "fa4f901536c4d2d1d0238ddf05fae0c8", "oc": "feaa9c6d37534219c300d82979e71a0695a4fb32f969d1a4e7c0e8a47eb781fce8c3c613a2e6d3ebd3ec4249c9c2fa1f9dacbf6f0631de19d2ec9a5c49ffc085"}, {"a": false, "c": "mB&LdZS0+$;<)1-BbRg<2Go3&a787(RXU&=nqH4Mcl7<%e}R}OZZ86c6QXLlHmYn+@=j&nB7f>vGiA$|Zx3,Myn3~nr&!m2n|F&TD7z$X+nvaKN&Z~;2AYn{.CrxA#3Y", "s": "94939601d6e7855d283404097721c385", "hm": "8567dbada858db325398ca8db14e9516"}, {"a": false, "c": "mBbKA;2~_|@h787#WX^L$p3cai-d2!K8f6}J#2.>Ogc^U%oK!9zQ4U(9eVyzTY6hFssP%yfAp|iH^dFIW", "s": "dd0bf7b520ad00fec67ca81bbd4feca1", "oc": "f7ceab1fc8173a321e231304a91521f8d4bca3b3c6aac74aa6cca69a3592d9b78efd934ab9b3a2f5c787e1027b8a5499f938cf6cad9edbc6"}, {"a": false, "c": "mBlKA;2~_^_h787#W$U&=n8H4L>7r@cMkI#>B`Y@>%m&?_QqLaZSOQ{yILNiBPs2pH}n9uyd(842w6L@LO2~2$fO:O_L*;)=;PX)AQ#4iCfqg5%Wr;-4qZ}HLQgnq7`0{V^??Z+gf-rxAE3>", "s": "bb9a505301929d00297e87f05490c2d9", "hm": "c1b9bdb373d2d71fa665b614d8fdda53"}, {"a": false, "c": "mu`KC%y~_|&h7QK#WXU&=nqH48zm_I^,EsE$TX^|hn*r$uxU!iiniIG8fPtJc?^>OgC^UvoK#Uz:4UIFiL_L-Y6R0ssp%BrEd|iH^da$W", "s": "03b4e7467818710fa5540bbbcb9baa5b", "oc": "fcc7a91ff8ce243015b38316a9f8240b978a1f39c0ae944a350a6ce35c69896980a6fcda0983abd4ef36df02725abe7656350e9cae1ebbca"}, {"a": false, "c": "WBL<)3>(^FTEHM-zs`5(&}z|i7^+q;ydQBYA1h~d8Q|dI7F&fSKFfe9f!z}l`SpRh", "s": "da6f7c5b347f42ecd52422dc458202c8", "oc": "fe63ac65d3e3463da301831792e9430d0e454864ed7a49d42ab03a84c4cd885f73b979aababefc9c8d02d362084d3d3ae4c9f6983d03aa3c9aa9c53014a2da83"}, {"a": false, "c": "8BnKA.2~O|&h58f{WXU&=nqH4PKPW9$R3a=$Jqzk_K=<3G(B$L#2^>Ogm{U%oK#UzQ4k>FeL_^NY6h0ssP%hfAdSi}^QF9}", "s": "37ba0c189d7823c46e7cb7f46681a3c4", "oc": "fc6a93693920a172ab41d14efb6e3d57e7464c35cde0c6f60157ce9e7bbe1ca225883f9cf128a7eae43467c33d5e2dd37583188c42942a157ed812c0c1ef02f2"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (393, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "b#:GZ><*cc7(SFC9|x{!2At-Epo5#8-8QJU]Mn?7A$@`(u}=$;cX*eiXGic$IWV<&AA{}Tz|H(|B(MaM~H!SWKc<-sUN*`Ics~!sPkaFqucc8!", "s": "9093a60f09e704e45214ab7daf3e3745", "hm": "52a7dc49a82ef032fb7f663ab54bdf65"}, {"a": false, "c": "LBbJ&V+<+7ZnI$|aHk#Y!C3H#7-PMVt1ayoG2Iz5v|c<6^U?7.bs`z>vUcJ`t2{On(Eq:PUP7^Gu{SL7X&)sN#}WJ>xv_uu4Uomr@i|q!", "s": "21f29bbd205430f78671a5531de5e485", "oc": "fbc7511f14846a32e5539c02a8bd220eb7de5359ccaecb8ea5bf6e9e15ca89898eadf61529cf0a8585b66ae27cba5c2cca3ece6cad9b4bcf"}, {"a": false, "c": "WBbJ&d+v+WNnRTiaHglh!C_H#LB)6~A.oLZZk|Cb(Z;tY{&En}P=yVCw1OAAnMJ{?IJ8CoL6TCth.-874TGan<#Y!CAH#8->MiH1ayoGQ>z$o|n<6^!oeQSi`Z>#UcJl#2{Yn(*5~RZP@^Ko{SL7X*)s|#DWJpxT_^i4UxmrW{U*}", "s": "f27956817855aa9f1f5b65b6a1c76a6b", "oc": "6bc0a11fc83a2a321553bf0e8b1f2406b7ddf3b8c2abc045d1f467849590896e8043f642b3b3eb43c5312d0e02139426a839ce6b58de5bcb"}, {"a": false, "c": "jBbd&V+<+WxnW|GaHv#Yr><+e}dWA}6+dA9<:8bt2ZwC_>U;Tb>1TJrE=oNCqHFEb(bOLE>+jA6dAo9&h`R$}xYWpuY", "s": "2a6f997233742690d5c4728285e7cac2", "oc": "213a9b66343bc219a300cb2ab270976ff6dcd241f6f113a145f0a779ff51fd38830ec1f979d2b231eaa28e46cb80c1639d828acf388d88ce68629e2dd745780b"}, {"a": false, "c": "KBTJ&V*<,0Nn4TiaIg#Y!CM?#6TqlBavyB3r-2xZln{.2Sv3OI#;{On(Eq~PZPz!G){SwTX*)_N#$FJp#T_uu4U+mAWpM,!", "s": "8d8f153a4d889149ec74b71ad6eb1d1e", "oc": "fe6e8c693fc344a824e117caf1ad12a636eca1e95f5cc6487cd546cd96f178a36014abbe266e5fcf8dc3be15beb006fcae6a301e2e0621608b0b3e6ed3b6b53f"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (394, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mpbM>C%<3u95`Fb+W)yX@2&u4s2=>FoXlMbEApcgZX{WmENxJ>3Blt#*(|HBU+zn?~|a;Cw=:<4;V5mTYoTm!CbzP*>y>22ih#8mN,NqT0B#327xtf*3p[DWxot0}Y@j7jDr>qYXNi=npH3`uhaKq$QC", "s": "d9db08ba267de5fa863ca7169e0bb437", "oc": "f2cfa866c83125321553b7b6881a24069bb6f1a4c6ad144aaa2d639315258969fe1396d39913ab48c56669255fea5fe697b2c130589f4b78"}, {"a": false, "c": "JBbM9}aT`U6a1*@3wLQJTSYCuAZ{|QeYbwp,eSYRGMixjlRP(>$OGm-@gu=+p0_2tB>QA}b4P=&$^#B;cC{faoy)LhApcgZXNXm}Nx>>.Bl?#7(|HBa!j9v%5N($VTM@&-eW1V", "s": "37ab5d1507e592b009dc81125b90d181", "hm": "6a6b5db572d2b7efbf651f1e067db647"}, {"a": false, "c": "mB#M^-awLU6Wvs2*.d#80AgGET0K9327xt&*3p+DW?ow0VYEjnjMT|qr$d^$NZI7pL3p_?C8TMymwu0c&4:YM!|#i`-TLDz=VvYJq>IzXqT!Z,+<<`{r=ItNY|&j@ciB`7eX", "s": "d94b0cb520cc303e66cce8a64d0febc0", "oc": "2bc81114b8df2a221583bc86f21f2490b5d85e897b2ea445a5fa477ff591996e86ad464d942e4b45c1306ee28cca54768635c364a1ef40a9"}, {"a": false, "c": "dQ:JZA|9c}`{]snrrw{ij)cD`LjQ)XVp_~l&$+xd<)hiIeow*uHc1Zk%_^y`D>cnpburE07v`-{5R?Z_gU77_3xjam&9)r4K6Ad_5GI&T5L`OMAprE**MdJ-#ozAcDan97I9}DCQ1}|C44$I=5!q$ho1nk", "s": "c9d11d2901c6bd9c6921851bba9042d1", "hm": "9aa75dbd7bd25d7d5675b6ca54aadbe7"}, {"a": false, "c": "m{bJZA|9]2`{Os0rra?Hjljv&8vu0{XI}HSyw%C>)p?9E#My;`6Wb&4p>i!|#V`-TLDz=]EYJq>I*Xqd!Z=+nND{rfId~IA&!;ciB|6e6", "s": "0ac93781f21200e9985b6be8c3777a55", "oc": "fbbfa31f6a1f2a42d577bc06a9b42e021e7af3a9e6aec4a5e5b92193f2936db98e75f2eab9c3bd75c53a030278215b7da4bf7e611d9cf169"}, {"a": false, "c": "mBbJZAm9c2v{OsnNr9?Hj)}F`C0FPttN?Yli{tGxgcC<1g0C@`h#R|0>I%Ujv}|hOFDCfOT;nXXPUA^{hTyWAP^~y8:xCaLT`oNxy{tM80>96vFWYxEpuh", "s": "536f977fe678e0e0fb23e5d80c4aca58", "oc": "fc6a142053bec219ab0f80a45cb388ae82bec9cc470e0bafe6a93565eb2de8668e9195d6c555b020db3e5d004dfeaa8ee64c9cc4ba421f1c433f862fc1128b77"}, {"a": false, "c": "mRbYZA09c2YIOsnIra?Hj)cv`6LBDt`>hUH5F|V9>g%~ly&4{n#m`uT$D7=pvYJ3vI4Xlj!ZQKnGD{rQIt~Kg&91=iB&7eX", "s": "3dfad64f4d7823442dacb1af6685536b", "oc": "fc679a6334b341bab7e987ef084c8818f55aa688ede7688e24529be02a7f62f8200e668aec75bfc3519372fe7edba581dc28da71ba5ed741a2c5580682f38676"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (396, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBKKU&X2H5TIi~T2sQ#ASKTOJo-QuICBLc)%;*FU1F5D2lMKWHbII;fW;<[)-g>KjwPbP42y+k6)=tkCzpj$_X1g8_KA4LY~V6xNI){BL+u#<((KRk+MaS2G9=H>5T>8b$&_T`G&En3{u4tBLc)pG*F)<`ADHWMKWH,II;cW;<^SZZZTjWH+P;gy+w4Ua<^Czg#t_,*28rKl4L{~V}xN}(i$_+7O0sDNK7Dgwg~=Qp(YP-XK^3jK9C}zQ2%AD+Z~c5>GWB)eCL^w$+`tVw@H`aOj3S9vuenVJ^OiWsL5fGC_3-A>p!h", "s": "f76f2875db748200db232cda05ea0ac8", "oc": "dc351cfc33ba4419af008e3346e9b2871928f5fbed603031206d87e7b587331c823c83fb20d58bad4eba2bd93a469d059b1ac5cf6bf96e66cf907601f9705931"}, {"a": false, "c": "mBbKU&B2;2TU8&TFM{{aq(X~f9*-nf)W#h>2vnzEr&IQ4CX9wyKS`G@KuZxMUM1!?)?x{s.J9^_QTgfj$2NdR!=1kzc`r8edV&hhZ_`qHcY^@#&Q*hT*^_7OY^hoElmzG.;5NP{<[G~rC7z", "s": "406cdc31c704845d5a019a9071edc745", "hm": "83b3da14aa48c830c3056a606d4edf1e"}, {"a": false, "c": "mBb&WItx0`aQMhoFv=iSK|+vV8)|(L$X9VzZ->csIkghDI`VV6a}N{%>DmLo##I_&wl++_w8nB3Fg}v9#-kWQ}GWkcqJHK)^T7Z3nxW$@", "s": "c90257b9ea7430be862ca81eed0444ad", "oc": "fbc3453f381faa3f1550bc05a2af0406bf73a3a9c53eb44215fa67ed15b7bc698ee2ff4174bca3451534ed32033a637ba035ce2ca9d462c3"}, {"a": false, "c": "1BbLWIPx0`a~,VoFI}#S6|2DV?VlEE}!}1mwnep>Q)|4EN)OD^T*={zO|NcOxQ=>b)~t(AqAX)1QUW-pHFGi3IH@^nig-YsiH{C*(7KhBG(nV6AZ[o+HcY^2#&QPh1u^uAOf}hoEqmzGIO5NP#okG~r)dz", "s": "bafa565101369b062a8e8a1b54d6d251", "hm": "66b7545578c3b772c07517180099c087"}, {"a": false, "c": "mBgLDIPx0`a?khoFvx#SK|T.Vs)((LvX9VOZ-XczIkAhDICVV7a}Nu%eD`wInB3hg8v9gckWzNGW$cGCHh2^D7Z3nxe$@", "s": "1fb9338123186107515c695673dd6a21", "oc": "f9972b14c01f3ab204510c06591a390bb758f3acc6afc4e6a57a6193d99289a9847c864dbcb3ab45d53b7d0e42295474a6e5fa6cad8f92b3"}, {"a": false, "c": "2BbLWIPx0baJGhoFvD2S]|gD*CCK8pRC}LD0QX1)Gf3!R8^W+Rf+ewrHX9Dga{(5LdkQQH).{cMf3S@=Quo3pMut_kP3AF?JBpgBO%5eF1?_}=mM;aw}uh", "s": "1e6f997e8e71e2112b242d1805acaac5", "oc": "686ae26833b4a23aa3048e6d1e4f11ea73a7a92e7e926417d011d3cf117bb3795339df02bbfa87700ab5b7f7a81ad02fd5b62f52020c2850774f427a353645ef"}, {"a": false, "c": "m<7L;I_x>O>3GhoFRE#SK|+DV6UNb%ER>1oJovsVsxVKcuBCq?#25X&wl+R=wY5d3hv5Xd,-kWQ?&(kcG%&A27T(Z3w?>}@", "s": "3d2c00054d7120449e0c411f6696b34f", "oc": "cc5c9ca533bf711cbbe0ddef0893748de1d603e065b3872132e916e63aab8d122d646a8cf8cf094068c29826fdb147315d37659244e6ad925510a5a05b075613"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (398, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbLU1m41)W9q|54?h(&;v|K{Y=^G7d5vA]MFmBm>vJ~D-^pm|M~IFbc_38g6>K)|xCA]Jyg;J~ZXCNwj~>@%Qg;Ro1i[g=>!aODmAe<0BP+d0)fUhl(V_D%iLdjeL|Tm2to50kjPVz)P%@HjcPJ#r$gb0AfMQ%,xtC-*iE18Q=~zakT55-`E$Vz8x*^me1~(.>.82", "s": "c9d2db6caf208464f2129a3933b9c3e4", "hm": "8e676be478e8f630c360643fbe4eaf36"}, {"a": false, "c": "mBbLU1c;|)99#|6W4h(3{v|Kh8(5Xe9m`WOZ4)XL?kyh=X-BGqc8&{wuvUEG#aFy8|Wizvh8NBU9(>k`sp+B>", "s": "b90b94d57f5934f6857ca41b8e5be4a7", "oc": "fc720e13c6bf27321853b897aee8240b05d15a01c5aec485d5ec66431295884b4ead364eb8bffe48f92665005b2a5c7696daceba260b05e6"}, {"a": false, "c": "mBbLU1c4a)W9a|s44|(&;v|K{ROk1Dh[AL`6i*@*IAxKZWEp&Lr+NHeNP5cwdc51;n<{tm3Q%w*bvChnGwl}Mo9fQ%%8M).|ANzcy^defMQ%tQtCz*iE%8,]~kakT{rm;ECVz8_*^me10E4>!Jw", "s": "3a9afd80c946990039507eab4490d511", "hm": "6a875db97801fa1f86d516fe48fed56c"}, {"a": false, "c": "TBbLUmcH1)W9q|w44h(26vtD{8(5Xe9m`5O_%pXL5?y3!X-xGqH8~cwuvU>G#2}y8)IC-(PJwGMEB{5Gm5?^5*Wizv~8xf([q;q`{pJBX", "s": "93b929c178b66102ab5515b9ca378a4a", "oc": "f797a61ec87328e95d5c6c032911cc0b07def5aec6fec472afba87e5159a8969d6acf650b9b4a5f68546607c7b605d792635c36c3e8ea9e4"}, {"a": false, "c": "mBbL$1c4{)W9@|j44h(s;b|K{B`OAY7D@4_eh%COjNCRhV+K)Z-PMUiIy?vVxO%(@YiIJ~U0^dNiV+9b6hM#I0|>jjq(POOHmKL&|DG#YE{6BUWWJXM;F]X$3xR3|AfRRrQP#2}y8-Ik-16J|GM5|{UGmb?.c*Wizvh8`f(9Q;^`{R+|>", "s": "fdba90b94d868f4ad37d703d66aa08f4", "oc": "2c6ffc6537744ab8ab1a685449ec998f66c757c8464e6d9fbfa52a56683daa5bd3c0b18cfd9dec03f8622ea14defe81d04c974f53858734316e8f467f44021b7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (399, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBBK%Ps*}eKGAAm5>t~keTfqcYM7b4|6fb~f{>=u@tVR?!g50-uES{h1vX`JD2HtwdQdXT)bJN2)s~oVF-DubVZncQL_PHK6aW_ImC2t*L5uP2iiJQ>cyrX)q)[9k+Cse4:7!?HKClP%CvuRmq|o;0(Gg@e6t_J>4zuoAn&_@)G", "s": "5813760c0f93b4201211e96777201fa2", "hm": "8091db4488b3ae3881056e342e4e8f96"}, {"a": false, "c": "mBbK%?s{MeeDAAsr>MFue3ZAc8$p9%HWq2urmF9#an]9d89^O#u7l&A-KbLo#2`Ehz#$NV{I@`eTZAc{Zs-pqE](L=C-cFD$)f~Do%D4HHXDhf%4+p-_okD(@zFM,on8TdKv!5a%!,|7AEld_4)I<}~HfVUj;!F2TW`GAUq1CArOMK2PG&6>RMq|r~J5GgseFt_sr>>joAT^@@fZ", "s": "8ac8ed5b313f9d82a92e8b1bb49592d4", "hm": "3abd5ffd7ced507f867516a2d0fedbec"}, {"a": false, "c": "mHbKtKs*MeKDA%)r>I~kpTZAc8$p9%O%q]prm(m-+9>9K-cA)Xu7lr>-`uZG#O`E=z#$NVZ<5@xw(?C!AfIZt{G%_PIn%J$cd!z}ANZia", "s": "b35975db7898f17b15ababbbc33e5938", "oc": "2ba410cb186f2a521553b3d6b4983a0b47dc338dc68eb44aa56e17a78a99c9f98fad9b4ab993ab45cb8b6d077b70bde6af25ca6dae77a0e7"}, {"a": false, "c": "$BbK%Ks*MeCDAAsGQIUkeTZ.cCGfIP%[;PO<6FX-SyMqY)3l5;D?Ap`hPT!Pz0mDr@O?=H2iOs6J`N=e5Q4D>OjEY:T|Xe{rk#MPtTrh098dR>615KUpuh", "s": "4fbf9f1536aae2eedf242dd8b5eaca0b", "oc": "6c1afca23fd64219a300cb20ac72762789fbe8d263f0e1ef94904a7f90f2bb39203ce21997de0e9fded766b6dbae5659617d37a8697e3df213ebbec360de1001"}, {"a": false, "c": "K>(K%KsBde+DAA3}>z~keTZAc6O>~_2>KCuk~Q`Y~54&aX;c{wd2wEuz#f@c%azaF#hV}XKo<4_qvJ%z&", "s": "9493d5ff92e7815d8d14fb69772a0155", "hm": "80b4db8f6a48af32430f1a3dbe48dfdf"}, {"a": false, "c": "mrbK(pyr$AUle|m0I@m#i}Ihov6v{Ug9^VVY8@M-*z#Br;:6zy", "s": "86cb97bc377d67fe3672aa4b4dfff047", "oc": "abc7b51f481f4a3415f3bcdaa94f240bb7d8fba9c6266495151d6f9375297266589df34db2b3004cf2866d23bbf3597ca238d1ccdd8ee71be531d04a84adbfa9"}, {"a": false, "c": ";]bK(py+$}QACXmOIgmu<}IhuL2r=wKsitTnF=a5B!+;}>KvQ%zy", "s": "9ec91781771821f9920d23bbf3d9aa2f", "oc": "fbb7e1c35317baa115d87f06895fc480b7b8f3d976be344cc5ba6394a5991969beaddaeab6a6ab45c934dd02faf68416a133200fad95d8e4ee3eaa3f20a39f6f"}, {"a": false, "c": "mBb@hpyr$u5ACPmOIV>Oi}9hu7t-;}Sw0v(yBz-0I##A^GXA#daWprO>8*Rk)0K=lmVm52cf=rB[M1<<[^$Z+O(kr#YhI`o{GL(;RF=bBK!+;W>KvJ%zy", "s": "fa6f86543f60c8e0db8b3bdf059549d8", "oc": "0c0d9cd530b3a273b3a0a7da65b0aacc5a749a6d53ab6430b3b60643a23141a4d791c1658b1dcedec86fc1e4f4a0da8965b28f5e0f9ffe1b87d17dab40e590a9"}, {"a": false, "c": "mBbK(:yr$AQACXb:IVmO`}Iju6n`j}FReaOCm4Ho>^0;=jVwV`uf!lUYM1PKCJ%zy", "s": "0bba004f0f78b3e49356076a6687b344", "oc": "ac2a9cf2335348a3be21db3c4188d234d1612053e5551e018777a390422b9ecedafc1039bcac29b246b19b4437b9dad0f7f5140a540aca550a414ced505da423"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (401, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBSL@V^%;N?kW${g)1-JP*cmq^A3hW0ZKZ^G1pNnaCfXJH|WIVw-irNe@z{O8N`tqD^0G{k=KwI?)FK=wX<9,3J#5RiY%,u{+vbo_OUz4!=oJIS)7m(VzEQL^ztUhi^@=oIRR^HJ", "s": "990297b4a45da0fe817c7876e104f4a7", "oc": "fbc7a73fe81fe37a1a795806acff544b47d8f349c7adc4c175ba6747158973497ea96f4d0e48a845c5766d0bfb2a5426169fce7fa1b9da8b"}, {"a": false, "c": "xBbL@Xl%dB?0G$;KH1-JS*cmq|c;||K5oT&!~f=;IrFg2#b^nw$|^uT?MQ1vb$v{qdKf&)IMb5qYVEjRQpUOWKu*19aK3AUP4rAm+?iG`)BMCB41$Ej6jA:1h!|%%1IG$Y|E}thw=uucU|Im)GcB8(pdh", "s": "93956a960fc69d0fa42e8e8b1430d051", "hm": "ba05bebdc890b0588679460a28f6ebf7"}, {"a": false, "c": "mBbS@V^%dR?0W$;$)1a}P*cm{lw5tsgI>{D^|s{k=!LcQ$F}=.2TP73J#%)i#P^fUgv1o_TazD!=oJIS)7m(VLEQU^ztU|?^@=,y=|^H2", "s": "33d937065268071f95527bbb2331aa7b", "oc": "fbc7c73fc6df2a31c553320c6912240bb7da23aec615c445c5b3679f4599b9695eaf664fb9b37b754436683d7baa147aa635ce6ceafbba1e"}, {"a": false, "c": "mBbL@V`%dN?0C$;$)l-cP*cmqB:r4f`yzb|qoX{u;5x@vS59|acD`|t0sM|$OY5xR?!8l|E50lSfzrur@Y|7W5a<;H#n>k2j6NOWF~8DaSEnuET~!C>z=", "s": "f5d49978366f620071242dd80e1acadd", "oc": "ac8a476298b3d234a1a4a82716ea1a49b8048b20f729ec43decb6884bed75344e8a89ba26996a384c3dc86f9eb312a10a3580ed6c101b533a80f0843f589b6e5"}, {"a": false, "c": "mBbl>V^%dN10W{;g)1-JP*cy;gX0H#3oQjM)H&*-v9^>vG8A}#X|3CUlfCrxAEOY", "s": "9d990e01f9dd8e3b5c049f6a94093049", "hm": "07beda44d848cf22cb059a3dbe4edf16"}, {"a": false, "c": "m>AB^;2eu|&0787#WXU&?!qH%QzQ1I8FE9E$T?^`h>*O$Z3ua`idiIG8f6-9#21ROgC^U%oK#UzMjU>FeL_zjY6K0ysr%yf_d|iH^dF$W", "s": "d9eb9bb5207a75fe867ca716dd0fe4a9", "oc": "fb66a1cfc8262a361553bc01a9cf24aab318e3a9c0213495a6ba62521a9939c983adf831c23aab99953fcd021c2c5476a6468e66ed06abcb"}, {"a": false, "c": "mB7sA;2l_j&h7T7#V:x&=z^HeL@IpQ[#+OZ>&1b@CMkI#>9.YIg%mQ?g;q,a#hOY{HIKHgaPF2wC@1}uXd<8(tw6L@OO2~2$4fWO5Ld;M=bRRzLQ#4izem25R8db-4qZxxxQglq2A0{2^V?ZAlfCrxLE#Y", "s": "279d5d96b036220da92e85625790a2d1", "hm": "3a375dbd78d2b379fb7a1b2fd8fd9be7"}, {"a": false, "c": "mBbK2;2~_r&m787yEXU&1nqHg`zVmI^9E9E$TT^|Q>N^$G3UaiidbIG0w6-J#2^>r=3^U4yKnUz||U[FeL_z-Yl>V)sP2yVAd|iH^]F$r", "s": "f3b731607838d456955b60bbc5b71022", "oc": "fbc7ae6f441e2e0d60037705a91f280db7c201198fbdd44d45fa639b15b989092e6d464ad9b3ab25c5366dcf7a9d7126a69f196d419e58ca"}, {"a": false, "c": "mlbwA;2|_M|h^x7#WXO&!c#0vF?:I)fWsH0_(>N!u@>0o)l>D^_TEH_X_T`K(j}7siDo+q;}@.cYAW#~dlQPdI7@|f5bFfd9d!z4Y^Ppuh", "s": "d56f8fcb36c96282d114293705ea2acd", "oc": "f8659c8f33d30b16df018e339cb9330c0fec4862c97341d238a83fc96ecdc5af7311e9aa3abb418cade2dd81082aaec9e8c9064254092e3fada4463214a1f945"}, {"a": false, "c": "{vg)A;2<_|&h#87#TXX&=nqH46N$W9$J8a=|JqzgFri+IG(^DL#$^>O|C^U|3P#UzQ2U>FeLpz-Y6h0usP%yfsd|iH^dF(#", "s": "574a0342fd7513236e7cb71f36818f43", "oc": "cc6898d53376e1131be1d7e120f035496845bc8df10411d2d3a4a6f2d8fe17f825871f3da438f99a34016749edb803d7548588ac1244da880dd102fdacfb2259"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (403, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ&VY<+}YnW%Ga@0#{]CMHB.Uj70Cz_`24w3QWwb#KGSLX@nS7(A&CS|x{!!|hwEp|5#;[8ZJAOrnF#A$x`du>=$u2nBe(z+xUM,[1G=1yM4^5y0.X}Ty|H9gB(M9~~H5S;5J3-soN*`Ics~!}VkH)qucc8!", "s": "3424d701079e804d50949ae97739ca45", "hm": "8067d44da8461532c3296d368b4ede11"}, {"a": false, "c": "mBjJ&V+8+WNn4TGaHg#YrCMs#8fdM231a{kGQIz0vZnG6^Uo7Qdiuz>1UcJiDjkOn(Eq~vZPY^G30SL7X*^sN#Y!JfxT_uu4UfdrWp|*!", "s": "3f0d90b3077624f2b6702216ed0fee47", "oc": "73b8a11780af2aca5253bc92e9ff260804326878c2aec4a76a46a793ba0889689ea5f64abe580bd5c586ed02c42a5a9aa635f8ea1d9edaab"}, {"a": false, "c": "})bJ&V`{+,NnWEGaH:q~ECMH)Li)6dAToLZZy|CbmZstYT&v)}==yV=m1M9YnMJisIv8C>L6d#th(-874:;8j_eYuX4FvcJ<<09@x[B`yfRUxdAX}T[|LG>B(ca8VHMSgKJ3-nUNp`I;g~!stkH^3ucco!", "s": "fa9f55575c329530512d951ef440dcd8", "hm": "6ab74fb57eec867f86e5301ad8f2db56"}, {"a": false, "c": "mBb:&V+<+WNnWTGa5X#FiC)I#8-d~;3{vyoG8IzTh|2<6^U``QSV`z>1UcJ`#2{On(Eq~PZI7^Au{SLh)*)sN#Y!|pxccuu48fm0Wp}*%", "s": "bebb832135cd6108a5db6bb5ce4f602b", "oc": "5dcba21fc814d6b21493bc96a9162407b6c5e1a4a7935415a53aa793c59981898eb5734ab9b35b65cc36dd0ebb2ab476a6153e6cad333bcb"}, {"a": false, "c": "mBbJ&T+++WNnWT]a>-#tVCMH#NGMbqDEGsK$OKF8zdRu#0rA>I+EscWr96+dkZdvqb<2ZYC_%U;T)t13!r9`oNZ|Us.i(bO_EFVjA6dAoVtXbR$IBYWpu_", "s": "4a1ff975367dec90a6d418d9c0e1a3c5", "oc": "f16a966e78b34d4063b0182ad2629ffefddc025ff6f9f9a64cf6a7c753628dad3b3ec2ca3fdcb4a1eac28e557e898b1ad83482b639ed56ce63e59e26d8ff88f7"}, {"a": false, "c": "mTbJ&V+k7WNEWTGa[g#Y!CMi#6T;ksYvGB_rn^xcln{T2RvVOI#2{On5Eq~:ZP7^ou{SL7X*)iN#YAJpxx_u|FUfmrWp|*!", "s": "3d6631ccfd7a37346e0cba1ff784b147", "oc": "3c4a9c658c9381a31901277efbcbfde2e68c56b9365516c8313b1241947171adb86479be26de5fcd8d2f4ec227d006f6a7c6604cd50e31aa9b5bd4f4c058bd44"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (404, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbM;-aX;U6agITe!&wld<+`*wCNce6H3+odGu>I4g|M2=KT8Yl%<329$EKbSW)7e42&1xs2=>FoXlMbLApxgZb1WmCNxiR3Blt#*1|]Hayw2*i<#z0BgNqT0K#327.tYq3p+P8Mot0VY{cnjDr(EdLQ,TS5Buj8G|QNY+34aeSYRiogxBKRP(>$YGm-@6C;EO!_wtB8QA(boP=8$^#Bqc189aHy)nsAvcgZX{WmJNxJ>3Blt*)_PHBa$w2Sid#8hPpNqTmK#327xtS*lp+DW?qt0heEjnjDr(d5*NQ4npH,R?^w&qBQh", "s": "f3b9a73c7818680f3f5bdebb89370b26", "oc": "b1d7413fcc1d2e3a1633bc0ca9d12119b7f873a0c6ffc4bcb23a67937b9889698e02e649b9a8e265ca366db18b1a54ad96d5ce6edd9f91fc"}, {"a": false, "c": "mBb]9wa0LU6a<(am4?~|a;Cw=RLS.wi20k6*R+^+ZcXHKR$d^$NZI=pL3b!|#2`-TLDz=hvDDq>I4XqdXZ=jnND{rQ4t~KA&!;ci]$7`X", "s": "310fa7eda07df8f5797ca8e8e163eda8", "oc": "abc5e1fdf8afba421ac34900597f1407b14fd3a756a4a445997e6d9e15a989b9ceadf64a69bd0b4390fe69023626547556d59b6cacaf4fee"}, {"a": false, "c": "mBbJZA|9c2`{O0nrra?TjYcI`LyTwX$p~(llv&3VNc^Zkglk(}D>cn#bBYE+7YBC(SPyZAg}7L&!tjar#%1r4k6$OUpODKT5L`O.AWrE)*M:=-nozAcD!n97I9)DC61`W-4E$<=E!U$ho1nk", "s": "379a435502361d0caf2185b7849dd1d8", "hm": "660754ba78dcb372c6451671175d6b67"}, {"a": false, "c": "mBb_d`,9cm`{Osn7ra?Hj)cv`8ou0{DgJSJy:%$>)pYC8JM,=D6W3}4|>M!P#2y-rVKz`+vYJ.>I4Xqr!}=+nND{rQIt~KA&!;ciB87eX", "s": "f3b63781784866efd45b605614704a09", "oc": "fa0d8cc9c8192ae9fa83be76a968240bee2a63c9c694c44588766703149981ba8eddf14ab653ab67cf367d0c7d2515760635cf45adbf4ef7"}, {"a": false, "c": "mBSJE*Q9c2`{{snwra>4j)cv`C06PttVeglidtd$gye}M>0C@`h>$|0>I%i|vefQO?CCoOY;nXmP6%Z{hTyWBPJ~JBgPCaLTE`uxy{tYT0>9Cv&WMuhpuh", "s": "7abf999fa670e8270b228f2305ca18c6", "oc": "ff34996a33f34f1959717da35933f3f2820879af470b1d3d06a53227167de85d83a39f16c5574730a63aeb80d9fdfa7ee6403f0c6a83417d30328421a1230fd6"}, {"a": false, "c": "mBH4Xqd!Z=+nbD{rYIt~]A&!y!iw%7(P", "s": "1dba008f3d7d7384c07cb71f8681b347", "oc": "f22a9260737241a9bb315772424cf253795822a15de8af8ed4c25ce9fa2adbf857d15f9c6b7ab58a5daed63f39df9122dc876dc9dcfeb8bd35ccf0bc8c4f1114"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (406, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB?Q}&X2H2*ki~T2>]8D!nnC$YUEb^no=6jlP;y#p)N|[-_-QjcqBwxo}Kx;cG(5GVPm^!&YebGi(~N*~Ll`f|ly3LzuAAE2eR3&U50{ASNTBj(JQuI-pVcy{G*wk;1W;<^)-g^;jwP+3;@5+w6)=8VC&p#D_XcuRrKC4LaXV67NK)iB_+2k^8[$&_I`I&=n39<,-|JotMA`eTvjoiQuX`qwc){r*FQ*F5s2l]s6!2I*f`W;<^MBgJTjw]+P~@!Aw6)=VkCzNqu_XA<8rKl4LS~!6xNn)iB_+V*;kwq_L5fGn_3vAL1uh", "s": "f86fb9758644b2e0db5527d105eacac8", "oc": "f26b96c5a6ce4c19ac510e1c9ca9c2bd1b663fe43d60703128be87dd48508708d1ac1c4bb07597f4d45421db6c4b580a91b4b5f8099efdec38945801d901528b"}, {"a": false, "c": "@BbKU&:=H2ZUi~T2Th8c9&nC$zIRbUbBy-AgM-;&;^Bjo7`LnT#D_Xka}2|}&_a&VqxZ-)i$_+OOI0PpU2ZP}N2B%9T|P(y", "s": "bdba084f4d7823410e7c971f6689b124", "oc": "fc6a6cb5337364b4bb4197ef88ca7ae7744301c313ea52da7666e9d13aade8a05b8cc32383dda51f380bcafc15dacd150d5bcfbbef253f3f80f04f7c445a0bdc"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (407, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "LB@_WIP(0zhVF*oFvD#+K|CDsfW$C=8R|CMkppM_o?~#b*?beCOd?*WT0qM*N)z(Mace*-nQ{h#)>dkXzEY&I=4C}S_B+!`4@y=Zc`58ed?&hAZ>6qw`hR)wI7On|(fEl6ziI;;tP!2kG~rl7H", "s": "c83386410fe7845b54fedb797629c725", "hm": "f3e71f14a8497332c60d6a32be52d6fa"}, {"a": false, "c": "mBbLWISx*g`~GhJFvD#SK|+;V8~m(L(X9qdZ->csIkTh]I`Vh6g}7(Me2mLo#29_&wl.+_w8nB3h:?%9g]1WQNG(9cGCHcT^T7Z3nx>$@", "s": "fd0b77b5207c30feba7ca563e70feda7", "oc": "d1dcf31fb1582aa211c3b30fada22f01d7ddb3dcc6a1c44dae9a6d937ac989298eadf60a51b3a045c5676a02712bff76af35cb54a0934fb8"}, {"a": false, "c": "7BbL^IPxP&)|4GN1ODPT`={z>wNcA%Q=}b+1t(Z}8&*WQWWep-FGi[2HP^nS~IYsiH{P*(7vhBGYnV6AZ_oEHcY^@#&QzhTuE_*Of)hoEl%zGI;5NP!2kG~r57z", "s": "4a7a5c5001869f0e692e6d1a565cd248", "hm": "6a145d0d5812b27f8975d6e548fedb97"}, {"a": false, "c": "}pbLAIPwlua~GhhFvg#S$|+#V$)c(L([9VOZ->csIkThDf?VV6a2NV%eD|Lo#2{^&jlKS_}Vnlyhg?v8]-kWQNG(AWjC!K2}T7ZhKxC$G", "s": "f6193781ee10914f5b5bcbb0c337aa20", "oc": "fbc7a1ffc71f2ab31c5eead6a91a940627d78fa9c6ae044da1b47703a59d7ca781e4f63ab76b4aa5eb39680272209e76b635f56ca3af735b"}, {"a": false, "c": "mBbyWwP60=cf8qR8^W}*fsew9lO@D%0U(vfdxQQk)o{chZSi@=xu)zh2{_&wl@+_f]nBjDA?v9&-k]QNG(kcG>5K2^T7Z2nx>$2", "s": "3ebe0b41491863e46ed4b31f3481c6f2", "oc": "fa491c6014b37f83b87117ee02ac248af8dd151a1a0387286de96035efabf723b864194698c9a96fdfc2e26a94bd4f31f85769d74a52f29ebeb00ed09bf16a16"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (408, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m1bLUhc41)W9t|6r4h(l;v|OG7d5DxhM-UtA<[JF}-rpm|!bzFbJ_38g6><4ExCAzZqg;J~zXgHn{~>@%Mg;jo1i63=>!NvDGACB%B]N@0[fUglt,__eLLdje%}To3t350kkv+zzR1@2jclH#rF54;<045)>wfMt%B`tCz*iEF8Q=~za|T$5-;&$Vz8_u^meS$t?>!8U", "s": "ae65d6070fd9845751d3cb3977991a45", "hm": "b03fdcfaf14eaf0223a5dc3ab80e5f06"}, {"a": false, "c": "wBWLUDc418W9q|644I(+Bv|m{8)5Re9m`5OB4)4Ls?yk", "s": "d80287d72d76d01b37705983543fe4a5", "oc": "bbc7a11f875f3532855abce6a9e5340b9768f899d6fefb457cba6d9b6219806d85adf665be50a545c5366d127b4fe4b6a5f5ce6cae77a1f8"}, {"a": false, "c": "mBbLU1c41)W9q|644h(&;v|h{DTk1A!h:L`pi*@*IApKZWE[&P4SN:eNf`O-dc<1;bwe5-q_Gl>&Dw0vUEG#P}y8sIC-1JJwTMEK{=vm@?^5fWi>yhlxf>9(rh`mp+B>", "s": "ffb2a76f71e86d0f955fa49bc3351a8b", "oc": "5bb2ab1f4c165a3d1ed38c1664ef146bb07cfe1c56aeceb5a5dc6a07159ef96f85adf63a896dab45123365027f225b70a6e5ce772e44a9a6"}, {"a": false, "c": "mB6LE1cw1)W9q|xbdh^&ov|k{B`tAY7D@U_rhtC5;rHRnO+K)y-PvUiIy1vh}x%(-8]:J|<0^?N6V+Ib6$M#I>|g+Qq(PrC-XKL&6DG=v&WB*yx!sV=puh", "s": "ca3f947b3b74efe0dc44251305e1ccce", "oc": "fc65cc6f23b38249a301fb6e1dca9c082d225131d6a437ac05e9b895d0a5f558fc36c6b47f5c71807c7417fc7cccb79c0efc63a3f15f3cbf8ed0e9467696b5d0"}, {"a": false, "c": "mr{LU.c41SW9q|6mwhgr;4|K{wBUWGNVM;%", "s": "0db999dfad8814446ef9b71f6681bd36", "oc": "fc6a9eb533b371a3bbe19bbc995c4b83d5d793f426fe7199652d22b07b3dca76d2987741fd30226f9f932e3ffde14e4809c57bf637a873571896ffe5c30cdd69"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (409, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "-BMK%K,({eKDAA_&><~keOZAcYM9bN|8fb~$D>=F@&ODFHgI0yuESoh1NX`5!sW}DLC{zT9EJ:2)s~DVF-)u3VZ$%QL3PHK6a?Osmq>t*L9uP2iiJG>}xrXQ9$75kqCsetm7#?5K9lde?RIWkkO%{dKy3qGFB(U8AUq1dAr6UF>O%C%>Rmq_o~0E|gG{6KMYrrzuoBD0_@1Z", "s": "343966cf6a488df3621cd469bd253745", "hm": "829adb40a846a332cea5697cbe4edf87"}, {"a": false, "c": "}}bK*Ks*,}KDAAsraB~ge;Zdc8{p9xO%q$ur0>]N+A39d8IA;rM9_DCHE0$cd2z*A-Zit", "s": "d402e7b6a07930eee6758816ed0fe40a", "oc": "cb1c98efc87f4af917536616a99f2402b79823acc9aec975f57a32b315e987698ecdff2ab953abf5b53a6d02762a5470a1a5cb67d07da94e"}, {"a": false, "c": "mB0p%Ks*beKDdJsrfIwkeTZAI-:b-8qE$l0=C-cHDk)fEKu~DGtH}*Uf84+p-cokD(@z;M>wn8Tdov!5a%!Pb7AP%?%>~Mq|o{0(,gse6t{Yr4zuoAT&_@KZ", "s": "9a8acd9604669d00af22d91ba4902ca1", "hm": "e4bde2b978fab07f867726d52cf06be7"}, {"a": false, "c": "9,bK)b{IMWGLMAZr>I~9eTZAc8$p9%O%q$urm@CN+n3_d89A;-}72mA,BbpG#G`Elz~$NVuG%_DCHE0$od!z*:NZia", "s": "23b93c0068bd6107953b62b37807fe20", "oc": "e1c3c9c432148cc21573ac01a30543bfb51832a9c6aec045e5b0d764154985698a4df694b9b4a046c5966d9c7b2052766635ce1cae75a9e7"}, {"a": false, "c": "mB6K%jsBM$KDAAPV>I8keTMAcCGfIZ%?m|OtEFE-SyMqY)3$x;8MAp`hITa2IcmDr|O?=kAJOs`JP8=e5|qDkOjGJ%TPXk6r6#9>tTr^0|edRE61PQr@`h", "s": "fa6a97753673524adb219dd8059a7aa8", "oc": "1b6a9c453f639219c30edbd87572702f5961c7d4b4fae1df47d3e6779081682a50a3326197ee0956dee7d4b6385e2a44617d3757887e356fbfe8bec1500e88ad"}, {"a": false, "c": "*B9KeKl*NeK8AACr>I~oeTZAc6GzuR22XC1w~e>Y-54&aGIc@K#2`Ehzr$N!u3A@_1(4C!AfBZV0Gf6DCHE,_c0!zYAN!ia", "s": "33ba25404de723446e7cb717360db3d9", "oc": "f25a8f613ef241afecf7d3314d18ca6bbf958ac0c7387324525d2c21803a80a2f63ff3a70120101baa84dacde5a3f9fca50fcab2ef22ec08a77e011854567525"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (410, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "@BbK>|yr$A!{CgKOlVmZinu)ua%De&eY~apsm{X%RsOWin~dLDze#K%BDJG}&)[Do$Cu%PS7W@{yZI?!T@VhqHXHrCo>A@e%>;~iBhD9H2XyHH_^,aza<#h.7>KvJRzy", "s": "5c638aa50cef8b1d82146b2272b1c745", "hm": "8067ab44c2b9a032c3054a62ee84df17"}, {"a": false, "c": "DBWKupyr$AQACjmOIVmOi}Ihu96ceUg9XVb=8@M-tz#4r;^6<3W2OJd2ER8q`fogcYM1<7>lDJ%zy", "s": "abfb27b5682b30e19672a916ed05eca6", "oc": "f1c7a11f485676321553fc964912240bb9a0a369c50e2a4bd23767530599696983a6f340b902ad79ca314d92762a8ee6aa02a82cad9ed01bed31d83f57fabac9"}, {"a": false, "c": "&BbKfxpHAX#dc{G(TtkZF|W608*v{Jf]B?_pGyZnWdzd!=L+nb`S", "s": "39985d5f8b386d0ba42d351b5490d256", "hm": "68775dbd78d2f77d8674b512f92ddbec"}, {"a": false, "c": "mY|K(:yr$A#ACXI~~O(([1YhC`o{GJR;RF]bBK!+;7>KvJ%zy", "s": "03ba37894818610d955b22bbc330a82b", "oc": "eb8caa5dcd160a32160369a69d2f950fe8d8f3f8c69eb47b1bba67931019895c2ead97babfb7abf5c5329d01701a44767632cdaaad9edd8b35a1481ed2aabfb9"}, {"a": false, "c": "m>b$rlyr7Gv:CXNpIVmOi}wh~Bte;>OwSvCyBL-0I##N^DXAMEaWq5c>tvJ%zy", "s": "cfc59f0a37e212e0a4842488459c0a20", "oc": "fc6a926c33b4cfb57c09d6c6657aa722153fd208b35694cbb5b8884929e376457733ccc80b4bfe273509c37ffaa03c0717beef740f93c6299bbc95076a9590db"}, {"a": false, "c": "DB`K(pyr$AF@C]3OIVmj#|IWu|n`S}Ff836>k)Hi>^0_=jmcM`uf!l(YME2$]VO9zr7sh0`rtG{([]FlbBm!x;7>KNJ%zy", "s": "476a01bf1178f044de7f57ffe381b363", "oc": "fc649505458351ac4be4383c493fd284a1f120ea85012ffb747a83b30fdc940dc1f88c11bcd320b496609b4582b8ddd63b0a14886909c9df7471214ca690b4f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (411, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "WBbL@b^%d^?0C$;:V1wJP*}m1T%J{W0Z>f^4?lNn$~fxVHj4!4;=&rNd@z{OfN&{JKp~+XU@roG`|WO[peL>$zO*^5F-7K=@Y0gW#k2~V?^-Z2rNIo9gD8%DOt!Fg2d-E_cW7ljF%M64hQEj_!{<1hREg%1q5$nIE8Nh<=uucS|I;wG&q@(*uh", "s": "9079d601f2e7845d09149321fb274f4a", "hm": "a0872b14a1425b37edf66c3dbe3e3b56"}, {"a": false, "c": "m>bL@|<%d*?0W$U=S|.JP*W{38w1tLgI>LD^0}.k!|wcTbGK=VXj973J#%W##2^jUg]1{#tazD!J2*coq8w1tsg)+Hw^Ys{k=Kwtv$GK,}d^?f5Jf%5iB2^fUgv1xXOS2>y=oJI$)3m(VzEQ6k($Uid^@=oIRz^HJ", "s": "dbb9670d78cb634705a56bbbc3d7aa27", "oc": "fbeba116c81f2a521553b726aa1761feb7d8f8a973aece40d538a29355952989807db6e598b3a341c136659b782ade46b635ceacaebe0d76"}, {"a": false, "c": "mobEZV^%dN?0W$;y))>OP*cmqBor4+og>b|qh6{uHoP2XSf9ra8D`690sM)6w55x;^:8b|EYslSfQHWgNm0P9,mC-T<&>uj&nB7f>vGtA#GXxg^Myn3{nC&!m2njFsTn7A$Vznv^KT.ZD32AYnfe)d~PfWX{8cBbyF_FV+JAQ#40CzmE5R(d[-yqZ};LG%nqnd3{V^??Z>l_CrxAE5Y", "s": "97a386568f67845d5e119969c529c5f5", "hm": "8062d14419d2e03dc356fadeb84e3f6f"}, {"a": false, "c": "mB5KA;2~_k&:;87#WXU{=yqH48zsuI^9E9E$T>}B]>8L$Z3Uai{d>;P8f]}M#,^>OgC}U%oK#wzQ^U>FJL&z-a6h0ssc%yfAd|iH^9F$?", "s": "3cfb97b5247d308e85f88615cd9fe4db", "oc": "310fa148c487b2341f537d09125d55744a88f3e7c9bec442359a0793149939d98ea7f64289730f625536f134762a542ea635ce66af9ed1c3"}, {"a": false, "c": "mBbKA~2~_|-h78C#WXU&=nqH4$KI%yI#+SZ>%7r@cMk:8>B`%@gsm&?1;qLaZeOY{yIKd|IPs$dCJ19egUf,FpfTL1Oa2~214fWO5LB;t6aR3)AQ#46zf)E5C8Aw-4!Z}}L,gnq2A0{wb??ZMl>Cc7kE3Y", "s": "3a9a135631313b57492e881bcac815d1", "hm": "0fb75d7d7fd5177d86ac1f1908fddcec"}, {"a": false, "c": "mB&KT;2~_|&h7875WXU&=nqX48zb_I|=E90$ri^mh}*x$Z3qaiidiIG8=9-J#2->O2CFeL.z-YJh0ssP$yfAB|iX^dF$W", "s": "2ab9e7817718680f965f667bcc5a182b", "oc": "fa77fc59211fea321e53cc09c0122c09b78aa3a9fdaed42549dae03315993a698e4d76c8b4d3ab42c23b6d0d7b2a50766139de6cad0e99f1"}, {"a": false, "c": "WBbKA;2~i|%h78`#.RU%=nqH4C6`I9O97P0_iUN!sI%pEPD,))I3uU>Lp4Cf?O<OgC^U%oK#U1QmU>Fe1_z-Y6h0sSU%yfAd|iHUdF{n", "s": "f907bb4a4a7823a7de7cbb1f665eb540", "oc": "fc6a9c6533124213cbc1d7d4fbd53457e74997a87be2c1d4ae3fa24e6b8e1cf2b5741d3e34b2f653a4f062483db713c84588583a474b3a1808d112f62644d262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (413, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJ&V+~+_NnWTGHHg#O!:MDNYUj70!3>BT4U3#W#b#K:N1-@cSM(I3Ce|x{4!At-EDo5HU-nZJATpnaGA$@-(u>rg?MX9h{wE!FUQ#WPE{;!0{7J_Q@>M4Cw+cnKyLAxv1hP<*cCNM$}(<+xA1minBac;aXV1tcJ`#2h4?@oq~P;.7^Gu{SL7X*SsN#@!JpxrLuu4UfmrVp|*!", "s": "d90d17bf40f372bc8675ab1ae30fb447", "oc": "fac8a11fc893fa62d504bcf6a71f24bbb4d8f707d9c9ee3da5bff19225942895b23d164ab842ab45c236bd011b2ad4b6cfd51e6c6d91da3c"}, {"a": false, "c": "mBbJNV+<1WNn(9GaH##Y,CML#>i)6dAooL]os}C`izytqT~vn}P=yVCt,M9YnMJisIv81bL4Tz_h<68M4C)8j_YYuX4FX>J<<09Qv)=B46RUx#AX}ThEH9gm(Ma8~y!SFKfo-s[NZ`Ics~!stkH^!uc,8!", "s": "32f05d5a01369d50a8be801b19f0d2d1", "hm": "6ab70dbd7f69f375087115ff88fdbee7"}, {"a": false, "c": "mBbJ&Mt1UcJ`#2{On+Ea~PZU7^GuYS+7F*asNDY!-p[z~_uA^cm2Wp|*!", "s": "f7bf37917538610f75566b5bc03faa28", "oc": "0ac4a41c271f0a37f1a5bc08a915210bbf58320cf6afc429c5847793150987f98ead36cbb6baab45c53a650876aa1476a6332e7cab3e3a92"}, {"a": false, "c": "mBbF&>+2+WNWWF{aH$7Y%CMHKzLM)qDEGI9$OVF}zd+u#08c>IhEsdWf96+dkHAvq6C2{wK_6lP9bt1T!&E=nNZq<[Ej?bOLgFV)A6dAo9*#bz$Ix*Kpuh", "s": "f03f85b53a7e32b0cf2d50d3f444cae8", "oc": "107e9ea5b3bb429733a0415a927097b2a8d5a2c1bb50e9acbdf0a7fa035cfd48310ea1490a44103b4aa2574acb803f867f8288bfbc2cc223cc2b69fee50898c8"}, {"a": false, "c": "nBbJ&V+<+W6n}nGh,I#Y!CfH#6TPlsYiyB3r-h}cl.{T2vv3OIf2{On(Xq~PZ-^^Gu{SL7X*)mN#Y!ZpxT!%24Uc4rtp|*!", "s": "36ba9c24ab1823e46e46e71fa6b1d39d", "oc": "fc4a89a5398961af434b662ef01cd2c2563c96e4b7501bc61f2dc494a6fdb5806ab76aba26de5f5a8b13840756340626a1fc001840b173008caf3ef916d8b245"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (414, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb~9-aW{U6(N?+7Ks~|o;Cf=YJKtITe!+6de$U9*wa*cP1<3+Hd2uKzqg3q2=*TDW0>C%Fo}l7b%AicgZ>1WmuNx[>oByt^*(}HEaM:WUwCU6a|}+zG?~|a;|M=4<4~V5moYT=7@A*zCw>yw2*i5#8}AJNq|0K#s27:tYs3p{DW?ot0VYEjnjDr(d5X*QznpH3|?^a&p$QC", "s": "d90d95b52079304e86559806e00f148d", "oc": "aefaf11ecac60a8235ebbc53791f970bb748f3a9c666c4a4f6ba87d31528cb64d73da46cb9b3a84f87d8fd827ff3c176a63ac06cb1ce46f8"}, {"a": false, "c": "m)mM=JawwU]a(>Heuzn?~|^;CmZ8yw6Uid#80$moCT0M#327NtP*fp+!W?otj}YEjnj|e(d5XNQ4npI+My^|IK$Rn", "s": "8398fa81751d640f955bdbbcc3f7da1b", "oc": "fbc7117cc0102734132ac606a21f790bb7ddf3a9ecbed7424bb0651317498348be79f24a89b3aa85c731de02962050b6a635ce69a29f01fd"}, {"a": false, "c": "mB|M9-awLWGaL?Hqr$r^$)3I*3L3b~cKpuh", "s": "f03f99c9a62499e27d2824b819dacaa2", "oc": "e06a9cc613b34219aa0a360c9dc5ba2fe8cafd6f5c4ff2d28b7cfc285aafd16da8c526a024d56d17b81def9a1760464f8af9037ec5f20431437c0ca2aad76647"}, {"a": false, "c": "mBbM@-awhU6aot0DYExNjDL2dzXNQCnpH3R?^a)q$%l", "s": "3d2a10444d7824356e7c9d1f8671bc44", "oc": "fc6decd530fa61b3bbe1d7c70f79f4e5c90c09487fec278d5853f2ccaf201181945fd65292e478cca375a6758302c5e8dfbc9dda394994e5f3b29e9e955c6fd4"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (415, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "jBvSZA|9c2`{3snrrb?Hj+cvSvFJdet4UJ;8L62XQjLqPqd_}s0vN<&b}uKT_4)(?~b4cxR-xMa;Y2+bwiSd~U}4O~cKwn`9-AcBj?+j{1przTWjt<01cs^W(F[;pB)MXk93S@{83PcTs5[|-zeV]8;uXg:V6FnhAWC}R-M{6-noTADD&nPoI9rDV61}WCrg$Z=0$+$1o11T", "s": "149ad8010fe7fc5d041496612727b745", "hm": "806adb44a8916732a5d5603db9ac2f96"}, {"a": false, "c": "BBX1ZAs9c2`>:snr^a?Hj)Wv`8vu0{tKOSSyw%$>)(?C8#My;56{3&4h>M!|#2`OTLDz=h4YmqKSr|qY!7=+nNDoSjIt~4A&!;c2B%7eX", "s": "d47b9bb59571300c8679a840ed53e407", "oc": "09c8f350c9143c3919c7bca6a905240b3ed813a8c6aecbeba5ba679315998c69d895f6bab9b33b4b655662aa7b2a52faaf3a0e6c2496d1f9"}, {"a": false, "c": "VBbJZA!Ic6`kOsnEra^Hj)cW8LWQG|Tp_~ll,&x~<)OiI:-|*>Hc1caebtrE07YhC9SR?Z%8}7,_dtjaZ#%1r4K6AOFp7DKT5L!OdA.nz?;2{v^n,zAcDu^97h})]C61}WC4g$Z=r!U$hQ`n0", "s": "39955d56b63d9df6a9236d8b54a0f2d5", "hm": "62b7574d78d2f77f367e1662d04ddee7"}, {"a": false, "c": "mBbJ|A,9c2`{_snrra?Hj)cv`@vuc{XK}SSyw%$n)pqM{8(yM!|#2`6ILDt=hv|Jq>I4Xqds%=+nNY{UQI?~KA&(vuiB%r7X", "s": "63b936815cd8615897bb5b5bcbc53a7b", "oc": "4424a1ef086f26e4055fbc05a94f290eebd8618e2462c445adfa17f11599e9a90e8d3e4ab3b6ab8547366d617a2ad47e81350c6c5d9d41c9"}, {"a": false, "c": "mBdJVAZ9c|d{OsBrra?Hj)RX`C,KPNt*eg`iZtgygyCvMg0C@`h#{|h>>6ijNeqhO?CC0OY;nXOPU%6{BTy{A<^~dBgGCaLT`ouxy{tM-0>96vFWMxVpuT", "s": "61bf59d9567942edc82d2da8b5e8cd71", "oc": "f46a7c17e1b3e2f91bf89c1d53334362839e7acbff07229ff68336688f22ed96f9a3f2dbc595d487d20ec6004223aa823670bfe7b4893f7299338f31a16e48d3"}, {"a": false, "c": "mObGZk|9c2U{}snrra?.{)cv`6LBDtg>7jH2I|V.5gY~lyVA@B#2`-TLVz=hvYJq>I4S;1W;<^)-g>TjwP+P;@y+w6)=8kCzP#b_Xku8r}l-La~V6xsI)i>_+`Tn8;g=_IoG&=n3Q<=-|J%USAS#TtjxiQuIDBL8){G*tR<05D2lMKWHb}IIdgJ7ww4lH", "s": "318a500bd3369d01872e851b6bb0d21d", "hm": "6abd80e27800387fb694161ad6d26be4"}, {"a": false, "c": "`BtKB&X@!2T}iaT2<3=H6!nC$8-L*.>;=Wg<^)-gWT$wP+P;@y+w6)=8kCz~H:_VkuGrKl4L6+V6=N?piB}+nVJ;X+x_p5ZGF_3qA>p{<", "s": "1a64997136746bd0d4249dd805eaca18", "oc": "5c6a926533b84a196cd1be2c5ce932bd1929ff8bed60373178b8e7d098018007eeacb34aa7759bc0d4b726d64c965b039ebc890f009818e82cc4a541df71593b"}, {"a": false, "c": "mIb{UiXSM2U>i~T2?knzEr^ZQ4C}96BKT`w@y=Z-^csIkThDIFVV6^}NV%e$mLj#2{_&Kl+t^.{nBFrg?dNY?kWQNG(mcG!^`2^ziZ3nx[r@", "s": "df009c97007db014867ca116edff94a7", "oc": "3537a91fc6248a3e6055dc53257f220ba7b5a3c9e82dc3e5a51267431599ad681e78f6bbb913bb40951c8e98792aa44ba63fc8732d98a2b2"}, {"a": false, "c": "mjbLWIPx0`a~@WoFv<#SZ|+DVL4lEjA!}1mw5-+E:)748NPOM2TW={zt||cAxQ=Vt+yt(zNAj*$QSW-pQFGO-2HPNn=gyY.PH{CY(7KhBGYiV6AZ_o-HcY<@#&>*hTJzN7DfUhoEl:zG!;5NP!2kG87!7:", "s": "3a4a5f56c1364d01994e8c135990a2a1", "hm": "602abe1f78d2047f4675a41716fa82e1"}, {"a": false, "c": "KdbqWIPx0`i~GWoFv@#SK|sDq8)c(L(XRVOZ->cs5kT`6c`WV-a}N`%eDmLo*2{_&wl++_w8nbyhg?>9g-kvQNG(icG$5", "s": "73b5bb8c7218612f5d5e6bdbc03756fe", "oc": "79c8a11f186f29320515bf0667d6240bb7d5f8a5c6cbc3b5a5ba6b93053981658e26f74669b3ab45853692007b2a5f79060d1e5ead9b42b5"}, {"a": false, "c": "mBbRMIPx0`a~GhoFvD#jK|+D|NCeOR*C3LA0=->Oc5Ret8^WmFfsewh7X@D%aU(5LdkQQ;)o{chZSS@=]u)~pautVMPqAFX@N8)Jl%5rTqfc}=|*;4wpu!", "s": "fa60797b00f4e26ad7fc221815403018", "oc": "f26a9c4233594b19c320fe8d92400b8ab1476a444793a857d169157f96e610424f398872bffa38430a4ba94ea82a655fd0b62485e1bc0813170c52d15e02c5c8"}, {"a": false, "c": "mBbLWIPxk`a~GhoFvD#SK|f~V662b%%^I~oYovsVsFQMcuBJqS{2~_&w+pT_w8nB3hg?v}g-?W<%G(LcG-VKX^T>ZV;x>}@", "s": "3aaa0f4f7d48f344de7cb7df6c81a842", "oc": "6c0a99f5b33348aeb6e1deb908ccc4baead2aa72c9b3876108591fe5e9a59c12b864930cf9ccf98068f24c62e0bd4e31fd9769110ab6fd9da71006d09b0fbf19"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (418, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mlTQ=;$31ik{Fh!$;DVAeB%BPNh0)BU^)(>~IJT%dje%:Ta3t35Mk2PVz)Q1@cjfRH#!F5b0<0458>L?{Q}t`tZzji#{DQ=~zakT$v-?E$VB8I*^fe1YEm>!z.", "s": "5413d6010fe7800df1d550797721d765", "hm": "a6672f43a0fb4c3252056d3db6482f96"}, {"a": false, "c": "FBbLU|c(1)U9q|644hb&;v(9{(`5XD9Yr5O74)=LhzyheXHWhhH8&|X3vUEC#2@<8sI&-8kJwGlnf{U|m5E^5*Wizvh8Hf(6(wk`{p+B>", "s": "d90b97b6207d3050567cab17e50344fd", "oc": "fb6f318f121f13371543dbcdacf042fbb71eb615c6ee143da5d562d3699899fa8cad96eab9c3fb45e537a5a37e2005d7a5a5ce2cae7d1986"}, {"a": false, "c": "TBbLU16415W9qS644h(&Yv|?{LTv)Abh2L`pi*@*In`v-dc<1;`Q{tL-QMwhb)Ch?7w>dMo9fQE%6Z)m.ANzcy^-A=MQ%t`t,1*$E>81=~pFkT$%-;E>Vz)_g^m.1MEm>!82", "s": "c6ba5d450ab69d374b2e851ff4f0d226", "hm": "8ab75ded78d2b8bfd674109503b65b1c"}, {"a": false, "c": "EBqL`1cg1`W9q|}44h5&;v|Ke8;5Xe9m`5OZ4)Xa??usfX-WG+H|&Dwu2UEG#A,y8skC-1kJ8GMEK{UGf5?^5*mizfh?xf(3(;kOVpPB>", "s": "a38167818816d1209516623b735e7e2b", "oc": "fbb20bbf9830cd3d1543b870a5ff242bb7d8fc29c6a0ca4944a06262868989698eaca7c9b9e3a845c03e620e72aa587396152fc0ae7ea9d6"}, {"a": false, "c": "mBbLU1I41)W9q|044_(&Uv|V(B`nAY7a@v_eh%C5SrIRnl+1&h-u2SiI21$gNx%(@@H!O|V078NpA+9K6hB#mOp6epq(POCHmKL&kGG=Y&KX*Tf!TV={6B-WiJXM;YOXp3vR0HwZRRrQy#2}y8EIm-1bJwdM}K,Ulm@?^5*Wi0@]8xf(9(;u4{pG4>", "s": "32ba073f8dd82342665cb71f6631f14e", "oc": "4b6b96563fb84433abdcd83c375e497cadc252c84210cb9fb6602cbdab60aa1bd2b87541a79dc9200f922e3fbc1fe19d0f8975f723a07653df88fcb93970d93d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (419, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBrv%Ks{MehD`Asr>I~ke1nAMYK9LsG+fb~aD>=}ptVDFHgIu-uhSop1vXKJDqW}wL0{z#hbLN2)s~QVF-)ubKZt`L5N{2iiJ_>>LrXU9$e9k+U8>tmT#ZHQ9ld,?+IW%kO%6d.l3qG&U^U8AUq}dAbOXo>PLC%>R_l|l~06G0s>it_Yr4zIoAT&_@KZ", "s": "f2a3b60c0fe389ede9146b712fdbf605", "hm": "906a2b43d748acc4c00b6a5dbe43cf1e"}, {"a": false, "c": "mBbK%K[MMuKiAA1r}_L,eTZAcd(p9%O%q$$U4dmN+K3ydt9)P-a7l&A-BbZG#S`Ehz;$NVuIpkeTZMcLZ^-a@{$l0*C-&,Gk)f~K>%DOtHX*hf(4+p-cokD(]z`s>og8Tdsv!5wY!>+7AR(m|XPG(Ggse6t]Yr4zuoAT&.hKZ", "s": "3e035dd6610a9d10b92ee01b54a3d2f1", "hm": "6a77ddbd7888c71086793c1aa8fd38e8"}, {"a": false, "c": "mBbK%>s:MrODAAsrVG~?eTZAc#$p9%@:q$xrm@mNPn39d89A;-g7l&A-BbZG{2`oZz#$NV~_A@Bw(Kwp{|BZrQG%>D+HE0$u8{jaANZ~6", "s": "53b608817218010c955b6bbbc437aaeb", "oc": "fbcaa0d9c4064a3a1e06bcc1a91c640eb738eca606aecc4505a796431599e57985ad965fb9b3a8b0c13d4502cbdf54a6c635cbdda577a92c"}, {"a": false, "c": "mBbK%>s*OejDA{6r>w~$eTZw.CGfHP%QHQOtEFXSSyMqY)3lx;8sAQ`h[ia2z0mDr@O?&H3Wbs`m+N=P6~5-rpuh", "s": "f27fadd03773e3e047a4c5d805ef6acd", "oc": "17c47d4533bdf21da36cb8257a754614536c2cd4bdf0e8efd5d4ea7f20b7e9d920ff94cb99ee059fd7e0db06f36e2744b60537486b7d3da498e7be31701eff56"}, {"a": false, "c": "mBbK%Kt*GegDAA@r:I~*e,ZAc6=+~8{2KG1k~A`Y-a4&aG;##Kj2`Eh}#eYVuzOw>;Nilhe;HPXyZXR1>azaF~:juX3wKvJ+5y", "s": "e493c60f0fe1845d55149a75752f7705", "hm": "8c67d949c1f8a722ccc555e7bededf14"}, {"a": false, "c": "mBbHs8yr$AQACXuUIVmpi5IU,96DeUgiTV?28@M-t^#Br;^6%zJ%zy", "s": "d20b1bb5d68e30ce863da8d6ed3f44ff", "oc": "fbd6a11fc4892a62817e9f06a95f240b49def3a2c5aef495a5c2d693169aca6d8ea5364a79d3ac35753c610a902a5476a5d5ce6fcb4cd2abb531d84187afbfe9"}, {"a": false, "c": "mBbK(pyr$AQaCXmOIom_iHX{uLJDgh2RitTn15T0;K9Tf+W{-|2+h|=E>euTtZ``BA{NG-GqWcYT=&6k9{?kB2cc{A!NgDzI*6|{%^1GO{W<B$_p4y|(2&zDk=e+nV`S", "s": "43995d5a01369f09b32e841bb396d9d1", "hm": "6ab738fd4872b77c8211d61ad7fdd9a4"}, {"a": false, "c": "mBdl(Ry,$&QACX|2IV%Oi}Ih996>MUl-%V?28@M!qz#Br;^!=3WFOjdsER8q=fojcYM0FK-E+zp", "s": "f3b93d807828d61f955b6bbd2737ea23", "oc": "f7c7c659c81a5a391d53bc06a919460bb8d953ecc6aec4aca69a67c3189989bb373ded4ab940ab1ac7496d32602b2474b175ce6cadcedaeb2f31d346974a5f5e"}, {"a": false, "c": "m7bK4p_r$AMA]^mOIVmOi}Ihu%Re[>Fw0vKRBL90IE8N^GXA#WaWZ5O$O*B,)0K=lmV1F2cf=rfYu1^5Z+O(zr75uC`o{G{(;RF=tBK&+P7>Kv0%Dy", "s": "f06f96c53374b974d0b426d6d29a64ea", "oc": "fc6a9cd73ebf4218f70fcffa2e724b22e379127e53f1951bf2c77a8a88418ca576da5cf0b94c7c5338bfcc9424901cf575b2207e3f5f442b30d28d6b491c90d9"}, {"a": false, "c": "mdbz(pyr$]6.CXROIVmOX}Ihj6Q!j}Ff83O>k4Lo>^0_MjmuY1ufDw>Y`1<P8cF:X%{hb0ZKZ^G0lNn+CfFJH|W.V*=_rNaF}{OkN9NA|gj-Xv7Tou`HWORueL^$zO*pJ`x7KKSY0gW!{2@V?F-ZNrNIoICWC:D#t!FC2d-I1cWxyjFiM6y1$EK6;A<1h!E%%1<529IEOt8w=7jcU|I}>G+k8zpuh", "s": "9f53d6049a27849d251ce4b6892ec745", "hm": "20776b64a848a882c6253d1dce471f1a"}, {"a": false, "c": "m3bJ@V^%eNj0WU;Z)1-J[*cmq8w1tsgItsD^0s{k=ew6+EGK3LXj973!#pQi_2^~Ugv1o}Oazuy&oJIZ)7mVVzEQU^ztchc^@=oIR9^HO", "s": "d90bb8b5202d33fe8633f3e68def44ac", "oc": "ffc0a616981fca3710531c06a81fe40b76d833a906aec4a4fefad9231595836bde36f44ab4b1ab9505366da97b2a579aa632ee68ad9ed01b"}, {"a": false, "c": "mtbL@V^%dNu0W$>g)1-JP*cmqlQ;~TK5qT&E~u=;KrF92#wT?wQ2!uTrMQ1vb$E{%dKu7)8@+!qgV_jR-wUOWau*19a}jIhN|rAj=?<]`)BU)B41$Ej6!A<1h!E!S1I5$PIEd#0wquc1p|IVwG+kY(Buh", "s": "3a9a58e8f1947d3cae8fbf1b1440d2fb", "hm": "eabb94ed1dd5b87f8a756573d8fda797"}, {"a": false, "c": "mB5L@(^-+N10W:IgKv-JP*cm|8wtKhyIRp>^0suk=lFcvnGn=(Xj873J#%Qi#2^fSgC1o_OamD<=oJwS)Z)(VzEQU^zt&h?^@=oIYR^HJ", "s": "6b399781751861ed955b6bb2c353a42d", "oc": "7bc96973c80d21328543f803a11f5e0b82f8f3aec67ec84b55bac843059988628e8ff44aef87a105c556ad007b2454e6a635876d9d95dac3"}, {"a": false, "c": "mBbL@bj%%;?0W$;g)1-JP*zm2Bor4+`[>9|quX{uNXPiXPf9U>cD`:a0sM96T)5}R]!3kqE5swSfSd5r@k|7X|av;H#na42=lXO0F~8D8S@nuET(!C5zK", "s": "5a6f7087c6dde2e0db12b3d8cdea6ae4", "oc": "fc6a9d6f1bb3920fb300d8091677cb4851ac8b2e892b0a94dfc0be6476b9573c98e3166ea2a6afebf3d2498372b0ca102d0feba28636b8e2a86e0a5359df0ae5"}, {"a": false, "c": "mBbh@b^LdV?X|$;g?l-JP*csq6X0HBO$zD!=mJISS7m(VWxQU;jtUh?&@=o7RR^]J", "s": "305a00464da92d54ae9abd1ff3b1bc44", "oc": "ff6969950c1b61f82e1dc5544c0b850a4ba2b98ad655b61033b9299ce7241275d85682437036de95d6f8d1290549f9cdfc4ced4be906e88175471298b70ffe07"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (422, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKA_2~_|&h787#WXUj=nyH4,Ul!<%jI6}F&Z8IdKDXLlHpo4+@YpqE*k?VnhnqeL3y4Q@WgNEGP9_s4uv5Y>F,&n>7f>=eiA$R-x3CM{n3~nC#pm2s|Fs}D7A$Sznv5KN&ZDs2AY+V@)&nD0WX{85B|<<_1V+J`Q#4ixfmF5R8de-4qZGTLQ@nq2AK?VY??Z>lfCrxAE3Y", "s": "84eadd413c9c845d529d936eb7f9ce4f", "hm": "60677b9aa868abb8c30c373d7e4adf49"}, {"a": false, "c": "LB^KA;2|_|&h7_7#WXf&=nqg[E=V_IAZF9=$Kx^By(*L,Z38aiidi.!Tf6-J<_^>Ogl^U%oK#UzQ4U>FNL_<-[6h0ssPbKA;2~_|H|787+WXL4=jqH4a|y%yI#=SZ>%,r@c^3J)>BPY@e+U&?_;qcaZhOwgyIK>|=+s2dg}n9Qgtf8JtwUL#*M2>2$4fW>7hd;)=cR%)AZ#4iCfmE{R8d,-4qZ}xFQ,nq2As[V^s|7orxA.3L", "s": "5a939a5606289db0c99042446a90c2da", "hm": "6a515bb478dfb778667516cad1fb6b43"}, {"a": false, "c": "SBbKAZ2Xm|&h}87#EXU&=nqHU8zV_I^JE9E$Tx^Z(>ML)Z6Uai`di1G8p6-J#2^>OOCmU%DK#UoQ4FbFhL_{-3Xh0sss%(Q^d|iH^dF$n", "s": "79b914b9f8e867f0204b2bbc83979992", "oc": "d9c7211fc80f213a11c2bc86a9df2a01a2c1f9a9c6a2df44e50a17951589899a83fdf02abfb3a13dc5366dd43ba85476a6e5ce8cad9edbca"}, {"a": false, "c": "mBbKA;2~7|&hkx7#WXUL=nq!4r6`Ivf|7Hq_i*N!1IOp~PD^%sI)(@[L})l>D^38}.MX_TQv(j}7siAo$1;npQHYAuE~d8QPdI7@mfG+FTe9d!zqY`8puh", "s": "26390987362463e5db4b2dd805e97ac8", "oc": "2a6a98a53393425993063e8c87793e2092c84784c07341947b5e31c463cd984ce3b1e9aab7bb81818de2de8705567ec9e7d93f0f9df02a24baffee6234b2f8e5"}, {"a": false, "c": "mB3CA;2~V|&hjM7#WXU&=nqH46KRW5$)*a=|Jqzg_k{nNG(B$L~D^>OD[2UEoK#UzQ4U>F&q_R6Y6-0jsP%yfAT5i=[:2XjeTz|RMgfLKa8sHuSgKJ3-sU@*`Ica~!sKkH)quaHpqY!CMH#KudM231tCoGQIzTv|n<6^UT7Qfi`z>XU|J`#?{OQ(}q~P(P7^Gu{=L7X*@s?#Y!{pxT_uM3UfGrWpQ*_", "s": "d90b97df2f6d00cb867cab16320986a2", "oc": "fb97351fc8194a742c73bc12391fdc4bf79ff719e4a53445818a779a1c99896f8edaf64bb9b3a608653b63924b3a546606c2de6c100ed7cb"}, {"a": false, "c": "mBbw&cG^+tNnWJ<<19@x_=D{fBUx4AN}TzCHXgadMa8~H!SgKH3-s!nz`IU{~!18KH!q|cc8!", "s": "729c5d550126dd25597e851a529032db", "hm": "67ea5d0d31c2bc7f86751616d9b012e7"}, {"a": false, "c": "?Bbv}W+<+WN1Ucd`#2{bnp]q~PZP_^G>{SL7X*)sNmY!dpxT[uu4UfmrWp|*!", "s": "a3b6372638a8b60f965f640bc41659a0", "oc": "f563914ec80f2ab21c251cf6a2e4249bbfd9ada9c6afc625a52d60933595f0498badf41fb7b3fb35e5366d328b3a53f2a615c79c5894d97d"}, {"a": false, "c": "!Ga.6#Y!CMH#m[nls1vyB3r-mxc|n*T2hN3QI#K&On(EqLPZP7^OuOS&7@*)sN#eKJgxT_uu4UfirW,N*!", "s": "2db4a0474bfdb3446e5cb7dfa681db44", "oc": "b26a9c653fb76053b2f1e1eafaecd2a2348c51e9369516883eb5c441962d7ca8dae4abbe16da9fcd8e226ec28d30b6fbf1f87014d20c71a4273d3efac858b1bb"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (424, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbMK-a`LU>aC%<3ur#EKb+W`de42Z14sbl>FoXlMb%FVcgZN1WmCNxJ>kBl@}5(|j-a%~9v%5N#$ITMP&-eW1V", "s": "4f9361c1bfe084bd52119b6947726747", "hm": "806cdb7ee8c4a43253fc6d33e448df16"}, {"a": false, "c": "mBbv~-awEi^a:?+zn?~2~;Cw=p<4;VGCTYj37n<*6bw>Kw]Zid#80AgNqTGJm3gdxtY*^x+DW0ot0VoEji7Dr(d*XNQ@np(3R?^aE=$|C", "s": "d90d0fe5247d25db86776050cd0fe4f7", "oc": "7bc7ad6dc87f2a121653340aa91644cf3761f3a9c6ee34e567ca630db5998566541d764ab9c3f845c5a6ad02780d8476d691cd62a8034af8"}, {"a": false, "c": "mBbf9-ahLU6a3Blt#*(}HB^<49$%5N($VTyw2*id#80AgNMT0KY322xyY*3(+DW?ot4VYEjbjDr(d5Xl-4nNH;R4iasq$QC", "s": "f1b9378158fd630f253b66bb7737c42c", "oc": "29f7211f68122702cf53b01ba91d280cdcdaf139c6a5c8951528d195453989698e6df64a19b0b54dc536cd22734a5e76a3ffc76cad9f4ef8"}, {"a": false, "c": "mBb00-awLs{aA:+zbu.|a;Cw=Bx|hmii{A6T3*^p,rit8pNzz%%zUsKmM#Q&Ti*~AL!d|IlxM^r|5mJKxa5n)BUWvo~(>M>c?Hq2-+^$NZI]pL36B!bc7#2TaUO<`<8{{63c(`jA#Fx7xtYI3p+DW?Dt0VGEj6jGH(d5XNQ4npH3R?SaE($>C", "s": "e44a004d4de723448b94ca1f8681b3e4", "oc": "fc379c8493b3a5a38de187bfa77b1c158a9c076f25fc2a2c5a18cacbde2a0e81926fd696fc9a7f6094e0605862404446dff39d2e99d4f9e0f3b6ceb4a9ca6f3f"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (425, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb5rAa9cl`{Osnjra?Hj)c&e0sJ>KM%RJ*8vN2XQwA+|Vd_9s0vNrE`*X{%-nozAcDrn9EI9)9C61CWZ=gZZ=g!E9ho1>k", "s": "c490580d3c73e45d08149bb977e9c519", "hm": "80d7dbd45b48e6324435643d581edf2f"}, {"a": false, "c": "xBbJZA#9c{`{OForra?HjZcv`8vu0TX;vS`y9%$>)p?28#MXC>!W1&4v>M!|#2%S)LDg=hvYJq>InNqd]Z=+nND{rDIt~KA&{;crB!7Wq", "s": "c9cb3fb5757a306e867da8e6ed0a84ac", "oc": "3bd7981f171f2332155cbf06a92f255bb7d3d3a946a5c4d57bc7679015a5896986adf66ab9bb074a76766d526b2a54768735f16ba0adf1ac"}, {"a": false, "c": "[BbJZA^9c2`ZObn%ra?7jV0J`LjQ)X$p_Vllv&3~<)hiIe5|*>Vc1Zkglo>`D>cnLwBrE%7U)p?CF#Mt;wJW3&4s>M!|#2_-TLtz=hvYJq>}4Xqa!(I+nND{rnIt~}A&!;ciB%7eX", "s": "f3b93787703b215f955fabdc73b76a20", "oc": "2bb7a11ecb112837ed7eb906a9e1d2170ed4f4a42673944fa249609fc519876d328df67a1eb9abe575356cb29b4a5496a635ce6cae4627a9"}, {"a": false, "c": "mBbJZAr7nH2q|V#mg%~lyV`vB#2`akLD*=hvYJq6a4Xqd!Z>+n|Hk0lI.9K@&!;ci)%7uX", "s": "3dbae0464fda2cbd6e7c446f638bbfb4", "oc": "fc8ac9c567b341078be11fef26e5f8bef5d82187ede7a21544f5c3f9ea2abc48d77221eb1087b50bada319ef86d09cb13cec76cecaffbc8135cef80295c88319"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (426, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&XWH1T1i~%WQIBASNTOjhiQSI`BLc){}*FR?F5D2)-KWHbII=8GCzp#4S_Z58rKl4La~^6xNI-iB1+}O$=Ppk|XPyN2B%YTeP6S", "s": "529be74a491dc14e8e7c4816dd00e4c7", "oc": "eb177118721d2abd1053bf063912a3a2b788f4a7c6ae3f1105ba66e4cea93c698eadf64a19c98bc54d3f6dd37abf7474a63e766ca7efc2bd"}, {"a": false, "c": "mBbKk&X2H2T+i~T2`Tn8b$&_I`L&=Ux9^j?|Jot6ASNTOjoiQ}I`BLk){G:FR;OWx<^)`gk:jb.+Ho@y+w6&=MkCzp#k_Xsu8r!l4La~V6xNI))%_+D_wgx=QN(YPKzX*!jC9TDzQ2%AD+ZfcY{58V)STL~!m+`tV.@R`,Mj3S9vueneJK2iWl:5IGC^3Y{Dpuh", "s": "f49f927b2b74e2e4d8142dda9beeba6b", "oc": "bc869c6133b74418a3018e5cbcd932bd1922ff17251020c12fb587fb98c03f06e29c93500075ce5ddab78b23e7469b05bbbd860d9efd6ae503142200e9d8593b"}, {"a": false, "c": "mUSWU&XcH2TUa~)2*7zj*0qMGj)zYXh`9*-nQ)K#i>?knzEV&Kr4F}9_B{S`wky=Z$kYXyHt^E>`+G&YMoZ>xMI610?)?c%KqC9^_QhlfnF2^d3!8s6zc`R8ed?&MAZ_CqYcY^5Q&V*bTm^_~ifyhoElmzQ.D5N4!IkG~(l7z", "s": "3e83d6d25fe89489526f9b667799c745", "hm": "88b72f44a84e8f3dc3056c325e0edf1f"}, {"a": false, "c": "cBsL2IPxC`S^Mh,FvD#SKX+D=D)c(L(X9VOZ->csIkThDI`Vz6a}NV%eNnLH#2@_&-l+a_w8nB3>K?v9gTIqQBGAkD%CyKv^T7Z3n|>N@", "s": "990b97b5200e3f868679aa16e9c867ab", "oc": "fb3c301fc82f2a0b1550dc05091f2420b7d83ba31ba1c25eb5b5f71395698ed984adbd43b9b3ab43c5616d422b952476ab3f3e6cab97c9b4"}, {"a": false, "c": "rBbLWIPxh*2~GRoFmX#|9|LdVaVlEEd&I1mww+|>A)|43T1ODP=`J{zO|geAxQ=}b+yt(VNA=|$QWW-pHFGi-Q}P^9=gIYsiH{C*2`mhBoYnV6AZXox[cYC@#&z2aTK^_7Of|h6qlmzG^;5N.!2|G~rlW#", "s": "359a125601373e502a9e821b59714211", "hm": "6ae7c17d3992f7bf86731f75aef4dbe7"}, {"a": false, "c": "BubLWIPx^`a~GhVEvD#SK|0DV8@)(L(X9V@Z->^sIkThLI`VV6a}NV%eD4Lonw{_&wl++_w8nB3hZIvYg-kWQNG(;c{CHK2^T7Zxnxp$@", "s": "f3b03383c818410fd8ab64128232169b", "oc": "fba2c7dac03fba3215b9bc0a741b2483b1d8044976a2c44235b0679336f889b9105dfbda9953abe53dd6e0027baa5279ab35c76cad5642bc"}, {"a": false, "c": "fBbLWIPA0-u~GhAyvD#SK|+iVACe8R4C3LA0=X>OczeqR8WW}xV^WwD$X@1_aU(5LdkQQ9)B{=hZSS@=pu)3pautVWP=Af?H78kJO%5_Tq]_}a|>;41pui", "s": "fab956756a74e8e07c2425d80582ca08", "oc": "fc6e286e30b342116f71766cd227138e579dada40ef2d857d0911defc0da33ce5b2e8f02b3fa19d39cbb5c56a85af35fd0bd24deea4cb8144a0c53c8cc05cae8"}, {"a": false, "c": "mBbPWWPx0$a~GSoF1DaSK|+DG6cpb%E^11:J9vsVsxVKc)BCqS(2{P&l6++_w8nB3hg?a9g-kWQNGAkWGCHK]^d7Z6(xj$@", "s": "b8ba00ff4858233f656ca71ff641b3e2", "oc": "5c6a9c6736e3f205dbe147ef0178318ee8d92de8eeb3800358e0f0e561ab3d12a8c41c08f2c3f9226865e2c971bdfa31faf16da1aab6f54eb587a5d003bf41a3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (428, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbovRc41ZW9N|6On<(&;-|KHY3dw7d5DAJM-Utm{vJFj-rpm|abwFb&{3Ag6>L@%}gnh<|i6*=>!NvmVA8B%BPNh0)f24x(>_%JYLd:e%|Tm3t3(0kkPVz)RG@HszJ,0rb5ICj045#>XfMQot`tFz-i4%oQ=~x.kT$5`~E$Vz8_*^me1Y3m>!82", "s": "a4540d013ea6442da9ef9b6a7729ce05", "hm": "80c45b44a8481bc2c3056a4da08e1913"}, {"a": false, "c": "mBRLU1c41G{{q|644<(&;v|K{8(Poa9m`8Ob4bXc??yNeX-FEqH8&DwuvUE;#2}y8byC-1k|wGM~K{=GK5?^5*Wizvh8If(9(nt`{p+B>", "s": "da0c13b1985db6fe86b2a816dd1f04e4", "oc": "fb67a01fa01f2a391554b9068e8e550bb7dcf31e55a1c4c5a0b2690f0591f96f8eada9987cb3bb4cc8333d02342bfa7c2795c5ace647d9e6"}, {"a": false, "c": "IBbLlut}1)X9l|664hS&;X9`O-dc<1;`<{Hm36%w*b^ChnGw`CMx9fQ$X6%}mupNzc*^%AfMx%t`tCz>iE%[Q=~Nak}$5-ZE$&z8__wmT1YET>!8D", "s": "3b5a5d140e36ed0af92ad6dd7e9bdbd5", "hm": "9bb771bd38d5c7f1a875b61218fdd497"}, {"a": false, "c": "dBbL`1c~1)WX<|64EZu&zv|O}]-5Xe9m`5:Z4)X|X?yhep-WG|^l9DwuT6mGz8}y8Ax{-1kJ|GMEKmfGm5?^5*Wi?ih8x8(9(;k`{5+B+", "s": "91b937a178f869ff0551dbb30ac34fd5", "oc": "fbc7a180281fdc021833cc2ea9bce28b7ad8f4a9c640c4b581b76393150754698e07562ab1b2ab25c4fb16027bb26b5ba839c1203e77a9d0"}, {"a": false, "c": "mBV<$1c41)W9q|f(9h(&;v|K{BStAY7D|4(eT%C59}fxnV{K)u-PvKiIy1v2xx%:fYHIJ|Vh^?TpVN9X6hM#UO|2OjA(POCH}KLBkDGDe&?X*y?!_O(Bch", "s": "fa9f987c3631e2eeda342dd9073ac4c8", "oc": "be6c9c65aba3552e52018e48fdba44484d0b5930d034b7690d641995f7896477fc2c4ba47d5c718c7c5aff0a71919a9e3e6e43e3415f48aac799e7060c84b509"}, {"a": false, "c": "mBbLU1c41)W6q|644h(&$r|K{cBU5iJXMD%", "s": "7dba074f4d780c446ea3b718668223d9", "oc": "fc699c3534804ca3d881d08c49c5eff8cd07575856b65b941f5d5d104dedda7ed228ab74fd2c9c04c5b2083ffd4f774d07c975570ca813c35646f979ba4d9a6b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (429, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m~bK%&s*2e3D#,sy|I~keUtAdZ#9b4J8fb~>h>DF@t{DSHgI)-uEno}1vX`JD2@}?LS{zqzOJN2)sPoVF-)u5V8$NQE3PH{2aW^ImW+q*B5u22[GJQ>>yrXQcs_9k+Ca3t37X?H{g]kehIIWkTO%0arn3q2&zGU8IUG1dArO,F?P}j%>Rmqyop0(Ggse6t_Yc4zup?T{_iKZ", "s": "34a3da090873842d3e142d681bd9ed45", "hm": "80d7d644f848af7c23056a3db244db36"}, {"a": false, "c": "mRbK%B:?MeKDAAsr>I~keTZTH8$S9%O%NGLI~keTZA7LZs-p1E$l0<0-cADk)f(*uCD4tHI*|f8<+}Jc}AR(@zh:>gnKzd`v!5aK8t+7;dlN_F)IL9~6fhU9;!FukWk*AUq1k@gO:F>A%C%}=mq|]~0(G1BR6t_Yr6zuoAT&s@[Z", "s": "9181595031beed00a929351b5aa05ad1", "hm": "59b7adf428d2b39f8cacc6da282d13cd"}, {"a": false, "c": "m$>K%Ks*MewDABSr;wu7l&Awa.ZG#2`Ehz#$NVu(ASjwk4,!AfQZr|G%_YCfE0Rc[I~kmTZAcCGfIP%Q;;OtTrY(5o]R>Fg`^rpuh", "s": "f06f9c7586b4e1e0892424d805e35d38", "oc": "8c6a94604b914c1daf0014ce12728f2bfa6cccd4b8f9e1ef2eb78b7f98809fd0e9ff926b97be0592d7d7d6b775c524846179375fb71e3d82262bee5dd81ee685"}, {"a": false, "c": "mBnKeKsCMeKnA^srRI~k&TZtc6Gz~_2,9C1k~e(m-54&aGfcYKS2`EhzB$mVu<7@xwq4C!AfYOrrG0_|CHE0_cd!X9AzZia", "s": "3db8338f4d7426441e7eb782e681baa4", "oc": "fc3a90d11f5b418103e1b833e25c40d1b1e1eb36e660c6947cd206d9303583a95ddff3718d20a01c8ae2cc40f5cbf9f16d08ede46022e48717701b8855d72985"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (430, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m]bKT`yr$A_AC[FOIVmOi}IhXY%DexeY~;pg}E6miMe!;K-9YM1<8q=fogc}a1<KvJ%zU", "s": "d90447b1207b7051767c581be93f73a7", "oc": "fdc7811fc89f8a8215a3dc86a91b9401b7d2d72969aedd45a52b674615997f6929aff64db7b20b45cb3c6d02dbfd9376c93fce21a3925a9be3a3d48fb7abf4ab"}, {"a": false, "c": "mBbK)pOr$u_A*XmOJ@mQi}IhuLJ;=wNvitTX15T2HJ,vc9WP-@ue5ztE?QeR8Z``BA3AP-GzWm8T=`Hbu{__*2Pt}AS>gszIE_|{%^1GO{Wx%HAX#dcYGzTtk;F|W64Q*6$=?XB[_UGy!(*KxJ%z+", "s": "f3103a81081a6bef75cb8b748b105528", "oc": "f4c70211aed02a371571bc03a85f246bbc91f3e7133e34d5155ab7d41f19d9690e8ff64ab9793be54986b9b24d2754fba1359eeda59ed61b9f31d827877eb4a9"}, {"a": false, "c": "mLbH(pyr$rQ^CXmOI^!OE}Ih|Bte;>O,0vKyBL-0|#BN^GXA`daQCrO$8_MkO0KWlmV2B2c[={BYM~<KvJ~zy", "s": "2a6fd878365478e05b2f19d9f938c878", "oc": "ff632c6543b34d10a300d05362bea7cc5274abdd53eb941bba08884a19e582ae773ac4b7b64d163c3abf2174f4491c876582d96bfecb42abf2db756b906191db"}, {"a": false, "c": "mBbH}pyrWA8ACXmhIVm|i}>hu-n*j5FfF3O>j40oD^r_=WHWM9ufpK_YM1<]vN%z#", "s": "5db9000b6d7743446e7cc6594781b394", "oc": "fc619c64325e3da2bb6ff8d9c981083c920130aa5562d641b47c53fd038b8acd6af2e889b55cd0b696ba3ba87595d5d03b0bef68640485907be16140aa7f6bf3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (431, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@Z^%dNS0W$;g)1-JP*]mqX]JhW5ZKU^GulNn$CfzJH|q7V*=irNavz{OfN}eDKpj.X(OToG`HWORpKL^$OO}^F)x7KRuY0>>#V2OV2F-ZdrNIo|Ch5ODOt!,g2d-I_c$7KbFiM641$=jm!AX1h!E%%OI5$YI[}tdw=uuk)|IEwGNk4tpua", "s": "a4b3d601efa78c5d52149b69f329473b", "hm": "8037db4ba848737cc3056b3d734ed614"}, {"a": false, "c": "mPQL@V^%dNl0W$Pg)1-JP*c{D^0stk=Kwcv$GK=wZj9,3J#%Qw?i^fUgv|o_eazD,(oJISC79(V]EQ[^XtU}?k@=oIR~^HJ", "s": "fd0a87b27b7d30fe667bab16260fe0a4", "oc": "fe8ba5cf5dbe283c1552bb6d0c74640bb748f3af267ec449a5ad64931f19a96909aed64cb91fab5155069db27b2a5276a905be6c1dc4d355"}, {"a": false, "c": "mBiL$VB:dNM0W$8SD1%JP*cmqK@;r|K5qT&!xf=DIQ}g2#bTbwQmx#@?M!1v|$M{qiKJ~)aM{5qYVEjR-wU6:ae*1PaKGAh$SrAj}?iC`)BMI84q$EjF!Sz(4|(puh", "s": "35f7535ec1e64d00892d85ab5400d2d7", "hm": "61f75dbd7b92b7dd2b9524aa9872dbe7"}, {"a": false, "c": "m{D^0sRk=KY?v$=K=XXj973J#%Qi;2h.-g>1oRq^z*!=oJHS)7m3VzEQU`ztK2?Z@PozRRzkJ", "s": "83b8e722be18170f147a30b39337aa1d", "oc": "ab87ad2fca144336125ebc76a9af2faba928f3caceaeca42aab6678111af79638ff39748b90339458eb6cd02e72aa47d66321a6e1d9edacb"}, {"a": false, "c": "DBbJ@V^tgN?0]$;g)1-+P}cmqBux4+9y>W|q>j{u)XP^_Sf|UN;D`6q0EM|6wY5xR^!82|E^Ll_f`r?r:k|7s5}|;@[naD2llpO0F~MDa]@nuET~!C5Ay", "s": "bf7590795679e205db242ed815eacac1", "oc": "f43a34be53bc4a19b300d8a916e72a45526d882c8b699a402ec0b04447b7d3cca29a16d3f298a3e07374428912fffa10af581369793135a3a8451a50093fba9a"}, {"a": false, "c": "EBbL@V(%dN?@G$;n)1-JP*c{q6X0HB3orjP)M&5-W7)tZ88dh=RLlH1D4nlpjqE*k$Nvhaq|Z3yL3@2giEiP94mYuT5Y>{j&nB7@>UGiAP|X>2mghn3SfCe!D2n|F8lDXA$VVvE5KN;&D;XABnEbgS~DrWX{o5Bb{<_vV+JFQ#4iC#m35R8dJ-4qZ}xLQGnr2A0{V^??Z>lf%rxyEJY", "s": "c89ed2010fe585ed52156b2977291748", "hm": "d0693f44a848ab3dc30c4cdd0f40df16"}, {"a": false, "c": "oBbKA(2~_|&h78I#W2e&=nqErVzV_I0Fx9E$Pq^BhS*L$Z3UaiidCIG8f6-J#2^WOgC^U%oKpUeQ4p>FeL_z-YDh0ssw%9DAddiH^dF$W", "s": "c909302bf273701e8a7ce86a1d5f6497", "oc": "f2daa11fc61f2a35155bb30b891f240656def3a9c1a3c466a9db0790f54b89428ea9fe4ab953a745d5752101fb4a5472a635fe6cc39edbfa"}, {"a": false, "c": "mBbKY;2~T|Oh78y5WXU&=rqHrlKIXyA#+SZ>%*r@cMk2n>B-Y5g%m&?_x}La[hWY9yIfN|aFs2dCVn9u|df8JawcL@OO292t$fWO5Ld;)XaRk)AQ#4iCfmEvR8d?-Dqe}x>Qgnq2A0=0^?lb>lf-rxAE3Y", "s": "329e1d5641669d043921851b719e62d1", "hm": "a9175dbf3832777fcf7328fb58cddb22"}, {"a": false, "c": "mBb9A;2~_|0=7)9_WXU&=&#?4-zV_v^F>9l%TZ^BhZ*A$.3UaiidiI}8f}-J#2O:Eg}^U%.Lo)ly}^FaEcMX_TZ5(j}7s&8QPdw7#sf6KGQe9dOzPY`Spuh", "s": "fa4713733679f2d85b20dd580f5aca59", "oc": "2c9a941c39b34a194370273d9dc933f1fe45486139736ebdb8a03fc454cd185822b14afdbab2d888f2e2de82352d5e19380e06ef2d082d84b512e63232a2f531"}, {"a": false, "c": "mBlKA|2K_:&h{87#WXU&=_qH46KPW0{53a=|Jqzg}ki5%G(B$L#L^>OgCjW%6K#UzQ4U>FUL_z-,(]0ssPEy&A`|iH^dd$A", "s": "2aba4fdf686823d66357132b62a6be40", "oc": "7c66976355d341aa4be1fdeba4fe332797f89c3dcde2c144e56f95be7bfe16fe25876c30f4a1365a31d68e830d7773b73a8c5d794e463ab867d116f0235f02fb"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (433, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB|J&V+<+5gnWTQ_Hg#Y!:MH#YUt7*C|_s24U3#u#b#KGwQ=$h2J*N!", "s": "e993d6f10f86b45152139b62d7e9b1e5", "hm": "c0e70344168c9935cc0563302e4ed516"}, {"a": false, "c": "m#bJ~V+<+WNBWTGahg#Y!CwHx8n0M23layVGQI}Tvfn1U*J``2{OnOEqhPZP7^G<{SLjX*)sN#{!JpxT_uW4kfm1Ws|D!", "s": "ddeb97ea707d3019167f5886ed0ee4a1", "oc": "fb60011f481f2bdf1253bb1b99b82506e7e8fba9cfaec94ca5b447931599895e8ebb526ebfb34b411d966d65db2a577f2634bebca496cb78"}, {"a": false, "c": "mBbu&J+<+NNnJT{aHgC9!CMH#Si)6l}JofZZsuCbii_=DyfRQxdAX}.V|M9gD1UcJ`>#{[n{Eq~PZx7^Gu{SL7X2{s%qY!Jp>T_ue4UfmrW<|*!", "s": "f3c93085771841af9e6b1beb88a773ab", "oc": "f0c9a17fc8172a311553bc85381f442f97dfff13c3a89cf5a5b9d7521ac984398e7dcfb0b9436b45153b3202752a7471a615ce1c5d0e7b7b"}, {"a": false, "c": "mBbJ&V+<+UNnWeGbos#:!CMH#B}gUaDEGI)$OIm8*dRu#08c>I+Esdpfx6+d*&|rE=FNZMkFTb(bOLEFVjA6dAo9lTbR$I;Y->Vh", "s": "fb6f9bf53f24e2a08ac4261805eacac8", "oc": "cc6a1c65335a42195300d86a92769bd9f6fca231f6f9f9dcbc96a0f8472ffec1219ebafc2f64b23b3aa2844bcb883fda4fe242df38bdc3de6f229e21a88068f8"}, {"a": false, "c": "mBFJ&V+!", "s": "67b5e04f0d77934b9672b71f66d14149", "oc": "fcfa7c6c33b341a8bb4137e05ce4d202797a81e95d0576c43bb5544d26eb78a36ab4abbe33d9763d8de3be1715c046f6affab01854077ea08deb32f353d851cd"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (434, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbgq-aaP=6^W%<3u9$3Kt>W)pe42&14s2=}FoXlGb%ApcgZ>wW*CNxb|3B4tZ*(|HB|OV|ZP&-(W1V", "s": "c42bdf2106e75f5552191b69772ae749", "hm": "f067db748818ab329a656a3ebe41df11"}, {"a": false, "c": "mBbM9-awLU6an?~|a;Cw=8,|;V5mTYoT7@C*zCw>Xw2*id980`g8q-*Y#k2pxUYm6D+DW?otzVYEjnj6r(g5D7Q4UpH3Z)^aE{9QC", "s": "d90b914b2070309e860aaf163ddfe422", "oc": "f247a26fc8bf2d3e1553bc36a91824cbd0d8f3aa162e7945557a6dc3b54989a98b5df648b946a485ce364d007be7e1a6a035ae67a49f40f8"}, {"a": false, "c": "|BbM9cawLU6nwLQJTS5Bus8CwQNYLr4}e:URGti`!KRP(_$YGu-@6u=+BA_w9LH!||&vPi&$^#B;c1>9a=y)JsApcg7X1WmCN4q(3Blv#*(%HBafw2*i>S80AgNq)0K#3h7>tY+3p+}o;otbVY.jnjD`(d5XNQXnpH3R?^aEq$DC", "s": "f20937bb791f6103995ba6bbc972aa3b", "oc": "f7f2a24ec81f2932ac509c0609182463b3aa81a281af3375e5b3f49e1fb923522eadf64abfb1a145cec887097b015038c7359ebcad8f4198"}, {"a": false, "c": "mBbM4-awLU6:c?Hqnw(^$", "s": "c26399a5265d0ce6ea242da805eac0d8", "oc": "fb6a9c6f38c34119a3017ea62d09a728e8a3fc6ba14ff7e18b1c0c220ddadd1daaee057822d56d8cb57dcf9a8bd0ff518efdf18ec0e77f716c4c7cecec674e64"}, {"a": false, "c": "jP#Pb7>IY*3p@DW?ot04,EZnjtr`d5E5M4npH3R?0aEG$QC", "s": "3dba004f5d98254bad7cb75f6621bcb3", "oc": "0f1a9c653fb346aabb48d7e407722490c1eaa97f70e99e1d5a53b2cbdf730e81616f265e05da7326e3eba6e868808f44bf7b9d5eb94c7be623e36e14bb9c6a34"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (435, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "0BbJZA|9c2MUOsnrPa?HL)#v`YFJ>KZgR1*rLO2XQqL+Pld_9s0vN<&W}uNTbz)($Kb4+?oBxMaMY2+5w{SaOU}4O*{Kgn`(-HHBj{+jy^!rzTWjt5y1JdUOyw{$>)F?B&dlyVw6W.&1L>t!|6=Q-TLD(=hv,JO>I4Xqd!y=+nND{rpIt~KA&!;ci=27e!", "s": "da0be7b5307d30fe0c71f813ed388da7", "oc": "0b1fa11f58103bd91253b676a9c622cbb7d28339c65b0a48a4ac3233154fbf4839adf64db2b3db42d5f60d517b4031e9c669ce6c367f99f9"}, {"a": false, "c": "mB2JZA|9c2`{OsnQr1?Hj)cvMLjQ)X->O~llv&xCW)h$De5|*EHc1Zkglk(`f8cCDbtrE07YUR99)Di61kWC4VCZ=r(UPh*1n;", "s": "3adb5e56a6962f008d6e751b5990d2bb", "hm": "6027549d7b8232793c75161ad88d3be0"}, {"a": false, "c": "fBbTZA|bXV>COsnrra?}j)9v@8vuJ{XK}S)yA%<1}p?C8dmHB206PttDegliI%i*veMhO?CCfOY;nyOPU%6{hTd@AP^~y[gzCaLT;oux}YtMC0>!6C>D!{Vp:{", "s": "a86f9a1566f8129ad9222df825d15a18", "oc": "5c6a9cc539bb1e69a31c8ef3555343e282b478c444074dcf66aeb6a387bd24a645ac9646c558bc504b3bab0041fea08ef543ffdcba453fddb63f8752b12e89c7"}, {"a": false, "c": "S*bJZA|6c2`fOsOI4X]d!Z=+n!#{=QIt~NAt!;JiBdKeB", "s": "8cb9004f4e7f4d4f697cb11fa688b4d4", "oc": "dd6a936539b321b4bb21d7efd779f1b84538b8847de3a88edb5e2ce9eaaad288f70751781ca6e54b5da3183f879f9b382cef79ce00b58c81fccfc90238f3e914"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (436, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU&X2Z2Tqi]T2]Tnwm$&_I%G&=n3L#c-|JpzMASNTOG{iQuI`BE<){GV~s;}`;TjwPuP;,y+t6)=85Cz>#2_XkuNxKl4L~}V6xNI)iR_+POz-Ppk2XPyN2l%cmeP6x", "s": "539937857e78016fe55b62bbcb77aa7b", "oc": "f6c6911b53232b3df5036f09a403240bb7e8a4a99daec45fea712797155b8db289adf648c913ab497b406d727f735096b2365e3c0d974b7a"}, {"a": false, "c": "[BbKU&XQH2T=i~T2_3>A>pu}", "s": "fbdf2b753674e2a1db2e1dd805ae4798", "oc": "296ca283e3a34a97a8018e196ce9004db98affceed0f30d928fd57ddfac47307ada1134910756b5544f3db856b689b0c9259f7280be16dec9964580e39c853df"}, {"a": false, "c": "!|bKUeX2k26U|~|2<7Fc9JnC$6IONUb|y-AgMR;q;[BjG7`%DNv2_Xku>V=~,La~,6mJt)=B_>BbLW#PxdSVIGhoFU<(^K|+jV$)c(r(&9V0Z-}cs8kThDK`YV67lNVA_DmLD#2=_&wl7+Q)|48N1.;P{<={u,||;)xQnbb+mt[ANAX*{=:W-p1FGi}>HP^n=gIYs(H#zBlYnV6AZR>qHcO^*9&Q*TIu^_7Of|h@ElmqGIk5NP!2kG$rl7z", "s": "ea9aa85638389d02a92e8a1d5e97e2db", "hm": "cab765131453b77f469a161878fc8b66"}, {"a": false, "c": "mBbLWIPxe9a~?hoFvD#SK|+DF8)c(L(X9VJZf>caI]ThUI`VV6a}NV%eDmw=#2{5uwlo+!v5nB:xg?v>g-,WQEG(kcGiHh2^T7Z3nx>$@", "s": "99b9b771c316010f99586bb3c35d7a2b", "oc": "1ba71a1f881f2a3296d3bc06491f2808b7c8fba9c6ae6445a592679365998969b8aee6ecb9b3abd8b5df9dff602a54cd3635ceee7d9f6bb6"}, {"a": false, "c": "m{#f9q`8KmWLfdeDr$X@D%aU:;Ldke.9)o{bhZdS@=Ou)MpautV%P=AFdHN8kJO%5_MqJ_}=7MJ4K$uh", "s": "fa6fe9cd7655e670914488d325e6c1c8", "oc": "861abc353eb34c09bd018e445281144abe97ae240e627d574711cb7f9ca7373d9399d0a2e7fda8d38abcb927a91ad65f70b22642a437a414476c12c1fe06c5e8"}, {"a": false, "c": "mBbLW}PS0`a1ChoFvDgSK|+=N6UNb%E^LAobovsVsxVod>B>)Sm2{_&Dlx+g?8nB3hR?m,g-kWQNG(k_GCHK2^T7ZLnx>$@", "s": "3dbf304f4d5ed354604f437fce81b764", "oc": "0dca975a3ab291a33b1177ef08cca4aa51d80112c5c387310db60aeb311f4df2b064110c870ad86168c2eb2a61ad4d31fdc733db4ab6fb92e030f5f003a1ac93"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (438, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "bBbLU1c4s)L&qt644h^Gx0l0XY9^G7d5DAJM-ptmtv@%Ag;jQ|]6S~>!NvD4|.B1XeNh0}Ww0x($=I=wLd.e%|Tm3t350kk8dz)R14HjcJ@#rC5=0<0458>A^My%t`tCz>iE!82", "s": "948c0ec30fe7342d521cc861a0295f45", "hm": "476adb460849a3577b656a30be491fb3"}, {"a": false, "c": "msbLUvcq&)W9q|644h(T|v|KTN(}XeFm`5OZ4)bL??y3?X-WG$H8&Dw`vUEEk2}y8sIC-QWJwiC7K{U=m5?^5*Wuzeh8xfE9(;k`{p+B>", "s": "dfde97a517473abe8cbca8a6ed0fa4ce", "oc": "8487a31fc71f2aeb2553bceda978f49b97dffb09c5b4b0e5a5bab7211b96898d1960f64ab9809b45c5266ba59b2854764435fd66ae7899e6"}, {"a": false, "c": "mBCLU1c41)Wwq|644h(-;+|K`LTk1E~h8L>ppC&*IAx|ZWE{&PvSNI-SU|;B;Z>9`s-Nc<1;n<{tm3Q%?*bv`hnGw`dg8R", "s": "3a5c5db60136d2f029ae051853c2e051", "hm": "6a375dbd78cfb771867916fa62fddb67"}, {"a": false, "c": "m}bZU(241)?9o|644h(|;v|K(8(5Pe9m`5VZ4)XL}?shev-WGxHjoXwuvUEGr2}y8sIY-1kJwGMWK{UG5e?^5*Wi+v<8xf(9l;+`mp+B>", "s": "33b5378178184b00b53868bbbd388f2b", "oc": "32cda1b3881e2a32c554bc0e5917249b87d879a7c6ae1fa255fae7971571f949eeaaf64af9b8af45c53625622f2a5dfe563587649d76a9ec"}, {"a": false, "c": "C{b1^1t41)W9Ja6Q4h}7;v|MOB`tAY7D@W_eh^C5;rHfni+K)h-P)UiIyE{hxx%(@jjx(POCH|&LckDjcY_?X*yf!uV>+Zh", "s": "da6f02757672a9e7db241dd80581c8ec", "oc": "fa4a9a653323401ca37fbc1c3dcaad1f23235935dc2437a100e68ac5f035f447fafee58f7af27d8c1c7f3fa5ea35c8940efe630e4059181fc0f9b8427c87f5a9"}, {"a": false, "c": "mB}LU1c41)+9q)6*4hn:;!_K{6BoWiJXM;%", "s": "3d4a007a4b5726746e7d0717c5007344", "oc": "dc6cbc657fb341e17fa3d837495c498ccf73ac98436e5093b6ad2db6ab3b0a761200b4411dbd2db7f09f2edf1b29e8ad76c975a533a87d5f8646f97903c80969"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (439, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mWbK{Ks*MHK]AAsr>sQkRTZA{YN9b4~80c~$D6=F@t{DFHgIr-uESohsS{`JD2]}wLQ{zTObFN})OVoVF-=ubVZpVQ63Pky6aW_ImqOt*L5uP2gibQ>>yrXQo$7Qk-C+etm7CCHl&+2e?+I@klO%6dKx-qG&UlUbA])1dAnT^F>P%S%>Gm%|o~xnGgsOKt_[r|zuiAT&_4KZ", "s": "94a3d60f17e7825dc2cc9e6c8729c745", "hm": "80f7d940f8081fe2e307aa3dbe40df46"}, {"a": false, "c": "uBbv%Os*MeIDAAsr}l~keTI$kTTZAc8Zs-pNE`l0=C-VTNk.fNKu%D4tHX*hf84+p-cokD(@E`M#3n0TdKv!|aB!P16AAldK{xI<9~6fV1c;!@YkWkGA]9;d_lOMF>P%q8>Rmf|d~0(Ggsp6t9Yr4zuoAT._@xo", "s": "6d9b792f0a1629000421823bd49ed241", "hm": "2a4a58f8281286ff86755615e8ffdb92"}, {"a": false, "c": "mBbh%Ks)!eKDKAsr>I{keTSAc8P-9%O%<$Rrm@WN+ni9dt9k;-;7l&z--bPGZ2qE7zm$N9rsr>)~keTZhXC=txP%QSQOeEFX-+yM@Y)dYxt8sAp`hPTa2z0GDx~X3=HAIOs`JPN=>5Q4DkOj(YofZX56qxC3>bIrY05odR>6158rpu9", "s": "fa749bc536d48fe2db2afd54053a4e48", "oc": "fc679c6501b3f219a9300d2a7277bb1219cc1cb3bc00c1ef15daca75ddb0ffd9304a826bfeb7e38f86e32bb63cae274e964dcd5f778e0d688f342ecd501f8655"}, {"a": false, "c": ";:bK%KsdMeKDtAsrkI~keTVIcKC1Cse`>-5b7aj;c=K#2`ghz#$NV*XmOIVtOi}Ihu)%ae&@Y^apL[&X1Rs`T!ondLDleKe%@p$Zv&)<9o#S:VPS4W@SmZ7H!qeVhqvX7rCe_!@e%>6NishD;H2Xyk{X^iz*7ehC`o{GG(;RF=bBK|+jU>Kv_%my", "s": "6d73d9010f478a5d8e149adf7c2b1745", "hm": "00ff5774a848ab39bd0e6a3d6e41afc4"}, {"a": false, "c": "mBbK(pyr&AQACXmOIVmOi}Ohu!6W%vg99VA2Z@M-tz#>r;K6<3WFYjd2ER8qefo?cYM}>fv^}1+O(zr7YhC`L{GO_;RF=eBK^+;7>K.J%zy", "s": "d9482db5207da00ec68da9e81534e4a9", "oc": "accda548c8162a8b1563b896aaf0240bb7dafcbda6ae44a5a5ba6a476599ab6c8ecfa0d3e9b30b4595f11d05751654a1623ec76fadaec71b3534d390872abfd8"}, {"a": false, "c": "mBFn(pyb$AQACXmOIVmO3}|h;LJr=oKritTi^>T2mKnRfOWP-6u2hztE?QZT>Z``BA3^P&GzWm8E,k6b9{?DB21l}0kJgLzI*_|89^ubO{WxpHAX#d@@GYTtk;FcW6VN*6{=fsBg_)Gy!(2dzD!=6t@V`S", "s": "3a0a5756073691a1a927151b249135d2", "hm": "4ab956bd05d2b71c5676161a88160bef"}, {"a": false, "c": "m]E8(U.BKAQAC>mOIVm)i}I}u96ceUA9X|?2|G;-tz#$r;^6<3WFOGd2ER8Z3foYcYM5`!w0vKyBL;0IQ#C2GXA#d-WCrKvJWti", "s": "fe6f955e0630e28dd52e24d800f2cfc8", "oc": "fc6a8c6553b8424a53ebd4db6fbca2b1663ad27d2bf593cba5688e8b18ec8fb4c76acc2543fdc13133d741c334ed1d8b95287f7e0f9472273a56d86e201f977b"}, {"a": false, "c": "hBbK(p]Q.AQAC]buIVmOi}Ih<6nlNdof83O>K.ooH*0W-jmjM`7P!l(az8!=oJIR;7mfV}E{eb]%Gh7^broIRu^aJ", "s": "f2bb00000079419e777aa813edbf1870", "oc": "0525711ff87f2a12a553f805a98d2b0eb781f3a5b6aed74ef50a6d931599896955ad764f394347252520b2027c2851569a7509269d4e1a2b"}, {"a": false, "c": "mBbL@V^%dm?0W$;j)1-2P*>DgK@Ir|K5]o&!~f8;Irbf*#bT?wQ2quT?MQ1vP$4{qdKJ&)IM)5.YPEjBSwUUWau*1[(-!A_NSrAjb{iC`)4MCBf%$Ej6,6g1h!p%%1?5$7IE}phwduucU|IEwG+k8(@1h", "s": "39ea74560a369df1a92e757b0490a7dd", "hm": "6cba521d78d1b4d6a675471a9afd8be2"}, {"a": false, "c": "m=bL@;^%dC?0W$#3}1lJP*cm1Rw+UsgI>{Dl0s{kB3wcv$GWRwX6973J#%Qi#2^fUgv1o_OazD!=%Jy|>oX{uVJP2XSf%UacDA690s.e64Y*xR^&82|E=slSf`r5r@I|7W5aR=HlZal2jxNO->~8D3S@n_Mhv!#0zG", "s": "f36f695536f4e140dbd42d3847e5c3cb", "oc": "9ca7bc35371d44e9a410d079171e1d89b5a4cf288272e9f6cdbb1d146bbf1365e8a31b4cf3f653ebc3a862b91eff9f908258ea69e67abba2a8166c53e9df93e8"}, {"a": false, "c": "mBmL@Vu%g8?0WL;gY1W.P*|.A6{9HB3-?jMGH!5-$7ztuT#gy7jtnBEj>qGQA<|X`3CMynV~nC&!}S*|F{TDVAfVz9J5pN{Zs,2AYnE@3S~DtWa{85B%y*_JV+JAQ34}C9cE5@86e-4qZ}xLwgnV2<0{V^??s>9fCrxAEE]", "s": "949314080f478a9602104c698820cb45", "hm": "8067db443848ab42cc0a6a3dbe5e9919"}, {"a": false, "c": "PebK7L$JCUJiidiIGEf6-^#26K{gC^U%.J#UzZ4U>G9,_z-Y6h0aEPOMfAo|iH^d0$W", "s": "d949013f2e7d30f5877cafa4e80d0daf", "oc": "fcf2a1996b1d2a311d57bc26a91f54db02b5f489c6aec445a5ba6ce116998f592daa174bb6633b45c546b302735ae376c6d5ce62a6ee2c5b"}, {"a": false, "c": "mBOKZ;2>_aNh787#WX=&=nqH1LKS%yIv+E#>%7h@cMkW#mB`V@gxm&sF;qLaZhOg{y.KN|&M?}eCHn9ugqh8Htw6L@f>2n2$42WO5~_M&9c87#W8Un=nqH48zV_I^FE`E$TxfBh>+L$Z3Uaii)iIGUd6-J#2U>OgCAU%oc#UJQeU>FeL_zMY6h0ssP%yBA6|iH^wF$Q", "s": "8399378248dcb965455bebb4c337a734", "oc": "faf4511fc21fe93215587c0c311819cbbbd0ffa9c6a34445a59a671c199d896437cd2695b9b7a54564c621547b5a64d6a63f9461adcedd28"}, {"a": false, "c": "l!bSAH>6*c&hT8w#WXU&=nOHn.9`I)f|7H0uiU%!sI%n|P,^M)I3u@>L})3>DGFWEHM+_T`5(b}7si7o+O;ApQ)]A1T~3}QPdm7@n-93@We{d!z4p`gpuh", "s": "3a6f9c786674e1d01b24bd5808aac5a8", "oc": "fc7d9c0abcba42195301f39cd8e973014edd48b3cd72d1d488ac3fc471c5583fa4b2eda90ab2f18cbee66edb0afd5ecaf8896eee5f222a44b092e632a48146d0"}, {"a": false, "c": "+6bKA;2~_m&hk8{OBXO&=nqH4iKPW9GJ3a=|J)zgZ4QrI!(BWL#k^>OgC^Uaox#[kQ4U>FeL_E-Y6h0sdP%yf-o|N,(>Y$_", "s": "fdba014f40782bb4690cc73fb6813844", "oc": "5e6a906533b1c1a30be1d7effbcb3427e7359c4d9deac1de0fa8a6aecffcbcfe20d7164b44d8f6a23a17c2266db205df7da7987a4956721851d112f0c1fa0262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (443, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbJNV+<+W6nWTta{g#-o@MH#YUj70gzxB24U3#W#b#$qw*<@c17(S0C;Sx{-Qvt-E^>5mC-8ZJXTrn?7AQ&;(u%8$~{X*eTv|n<|z2o7];iRzN1UcJ`#m{OnrEq~CZP7^Gu7SLvX*)sN#O!J}FT3uu4nfmpWpN*T", "s": "d70ba7582c7090d38a77a118da6d7bc7", "oc": "b6c7519bc210053215c3bc4f451f290ea7dff3a7b42817b5a5bea99ff595e95f6e5df681b9b3abf6fd360d067b7f5a7d8681eadcaf9adbcf"}, {"a": false, "c": "m^^xsV+<+aNnWTG1H<#Y!8MH#LiJ6dXMoLZ|srC|iZ,tYT&en}P=yVCm1M9YnMJi2IvxBkL}Txth(-8E4C)8y_qYuX4Fp7J<J+E-dWf96+dkZKRqbC%Zw=_BK>fb`1T!r2=_=Zq8FEb(bOL(FVjA6dAo9t#!R$IxYWpuh", "s": "f66ab0763273e3fadb222c180ab3ea89", "oc": "3c6a9c69003342a9a1b0dc93e37907fef6daae52dd37f19c4c64c7f79153020a5600c1f820d4bbb4eaa38bb5c081c797d6e38abf9d22c0cc784b91aee840786e"}, {"a": false, "c": "mBvJ&VD<[WNlWTM<*gVY!CMa##TnlsYvyB3r-ZxZXn{<2hv3O>6+{Ol(~q~PGP`^Gu{SL7X^)sNq$!BpxT_uu4Ul5UW9|k!", "s": "bd1accef82a52314667cbf948681b347", "oc": "4c309ca01ab7b1a3bb4127e6cccdd2b0367e5118565546483bb5c4e106fd75a3fad4ab022ad659026223bec42d602315a2f810f47ed7e3a9522b30fae328b445"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (444, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb|9-awLU6aC%<3ua.EKb,l)de42&14s2D>FoXlMb%Apc`ZX1WmCtTJu3Bl<#J(|HIayw2*Ud#80SgjqT0K%P2ixJd*:|+XW?oto2YEjnKDr(d5eNl!npH3R?*aEqnQs", "s": "bf0ee7b5f02d3014ac7f6d193d0685a7", "oc": "f3c7ab1e180f2937155ab906e51f2418b7d8f3acc6b0c445acb76796ae29893986aa364db993bb306e3f6d85cb2a8c78a635c36cad094608"}, {"a": false, "c": "mabM9-7wLUci9a>y%SsApcgZX1WmC=xJG3Qlf#*(|HBa~J9v%-N($,TM}&-2W1V", "s": "35e05d9606149a00a92e851b6490b3fa", "hm": "dd9f589d1822303f8e751657cd65d5b7"}, {"a": false, "c": "m>qMd-awLg6A#80A}Nq?0K#3@7JMY*!p+DW?ot9V$Ej3NDr(d{XBQ4npH3R?8aEq$QC", "s": "13b917617518710f975b6bbb5337a7fb", "oc": "dbc7611dcd2f783d7759dc06a517245bbdd8f37fa6aec449aab3679315298d908e19fa4ab9b6cb45f4366d057b212b07a635c2cfadcfb13a"}, {"a": false, "c": "mBlM>-awoU:zc?Hqr>U^&]ZI=tL3@{1przVijt<09cd^hfFi;pBD=0~c``h@kOPcTs5t]jt$V1p;3X1KV6FnhAWrE)*M{J-n8%A)p?8FyMy;>6W3&4htM!~wW`-TL(6=tvYJL+I4Xqd!Z_+nND{rQIt~eA>=LcCB$7eX", "s": "dceb07bf203dd3eb867ca8e6e80f5469", "oc": "fb71a17fddff2a3d1334bcaa19af25ed47d8c4a9c7fecf4fa5b668730599a9608ead6e3a09b3add5e536b20c7b2a54e7a622cecca78f47f9"}, {"a": false, "c": "LBbJZAqMcNw{3v+rradHc)c=`wjQdU7pV~mlv&x~<)hiIy9|*>Hc1ZkglX(6-o#nLd._E(7YBC9SR?7|g}77_!t{aq#41o4K+AOUpGDKT~6`kCAWrE)*M{JdnozA}DM`-7I9)DC61}Owh?$X(r!9Xho1nk", "s": "3e9a6b460db65598a92eb5524f9ab2cc", "hm": "eab75dbd78d7ac3f8bb57b1ad8b3db2d"}, {"a": false, "c": "mBb0ZAh9c2O{UllkraLHL.cv`lvu0{sK}|w7wJ$>Z8?C%#My$w6Wl&4hTM!?#2<-TLDz=hveJq>0MXq:!Z=+nND{rQSt~KAgo;ciB%7eX", "s": "f8663771782861133a5b6bbec337a62b", "oc": "f3c1ae1fc81f28321071ac26a9a80b0b37dfbd39b5aece45a5b75797258989698eabf6432d8b7b4a15342d927b2d5f76963bc26caddf40f9"}, {"a": false, "c": "m{NzZA|9c2`Lvsnrr~?Hj)ce`P06ottDQg|iLtG$gyqvM,0C@`h#$|0>I%ifvxChO?CCfOY;vGOPUB6ph-yWAo^YyBgzCa+~`outy{tM8r>3bvFW:xa|uh", "s": "497fa9d63bb4e9901e246dd885eacac6", "oc": "fc5fbc6d13574239a3918f5d536d6352e038692d100322cf26fe86652b2d1cd627a39566d75db7f0dafeee0b77f6fa7ee2ea3f37bbe83f6d4a3fe821a1e28fd0"}, {"a": false, "c": "mcbJZs|*c2`7gk2q|VZRg%{lyV4kB##q-TmDzkh+|J*[V4Xq9!_=+nN{{r>It~KA&!;Cir%7e>", "s": "342a004f426883446e7cb7176d81b3e0", "oc": "116a9c66eefc4113bbe077f6077c2953fa582d8fede7ae8e44b72decaa2c0240782ae50f1a284eab5d1951397c2bcd3fc098fcc1dafeb181058cf8fec6f68f82"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (446, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "2ubKUJX2HdTU$~u2;HW;TjhP+P;@y+w6)i8kC@p#2&0kuGrK;4Lu,V6xN|)iTg+<&=YPpk{XPyNvB%cT8P6M", "s": "690b46b5a57eccfe8d71ae16eda1ec11", "oc": "eb087117cba32ab22453b906a71e246bf798f6a9e687284568b06793d599398908adfcaaf9bc2b4526365d086b2abd76ab371e67ae92a2bc"}, {"a": false, "c": "WBbKU&X2H2TUi~T2Fd8c9[n5$LS#]n9A88%<!<([X!k*TWopljt?gR@p{C-+j?lYu#V`mXR3rMR,2F9=BD`T28|$&_I`Gk=nU9<}^|JDGM)SNTO5oZ7b~[3Lc){c*FR4LF~DfxNI):B_G#O$YPpk2XPyN2B%fTeP6s", "s": "d3b4978a7848eeaf955bbc2bc3a7fa26", "oc": "a6e781a3c81327e21353b266a51ff134b5ddfba9c6be645f739a67f7629506dc8e0df6aab9cbab3ac337f3077bfa5489a135ce6c1ddf423d"}, {"a": false, "c": "mBIWU&X26GT3i~T2<3?c9!nC$B1hR7OrsD(KbDgwgx=Qp(YP`HH*qjU9C|-Q2%AD+xfcf@G8V)jCN^wmv`tV,@H`d7*~I=qM:N)z(Xad9(-n?)h#h>?knoEr&IQ4C}9_BCS`w5y=ZxMIKIIT)?c%Kq39^_Qhpfj%2>Y328skzc`58ed?&hAZ_oqHc>^@#&b*hTu^o7OfCh~Elmzj};5N]!skGSYlfz", "s": "9433ff017fd780ad36f49b80b5c4c7f2", "hm": "80f51974a9dcab7dc2b56a36bc4e8f15"}, {"a": false, "c": "mBbLWI7x0`P~whoFvD7SK|+D>8)t(L(X9ROZ<>FsY%TWDI;VV66}N<$NDm%o`${_&wl5e_wcnB3hg.v9g-oWQNQ(kxECHK2^T7Z3@x>$@", "s": "d9cb97b72d7831fd864675e6ec0245a7", "oc": "2bc4a11bc8cf2a1a75d3b06fadfc84bcb609f4aec3ebc345ac9a3695f0d9e7638ea4f63ab9b6ca25c536d4727d9a3406a73fceecad9b49bb"}, {"a": false, "c": "CBbLWIPx0MauGDo$MD+S3|e^[LV+EEd!}1mwF|+>QE|#LN1OD.T`<{zO$:cAx~=}b+Ht?ABAX*$vW-NpH%G81=HP^n=gsYiiH?C*(7KPBGYnVLEg>oqH5K^Ak&Q*hTu]_7Of|hoElmzhI;eNPy2{8Jxl7z", "s": "3a9aa25600365780aad8b30be461d261", "hm": "02a307585663b87f3675361ad87dda97"}, {"a": false, "c": ";BbLWdPx+`3~Gh09LDJSK|+*V8)c(L(X9VoM-FXsIo;hDI`VV(a}]8%eDuLo#5{_&wl++_w_n;3TOcfeDR8^WM8Ks}wG_X@D%:}(5BdkQQ9>o{NhHSS@=gu)3&auM|Mn=AF?sN8kJ;%5_Tq<;}4|M;4epuh", "s": "61df990fa6dee2e0db21f00808ef9ac7", "oc": "cc6a9cb385b30209afa1712c2249abcabc27ee250e6debf3ff11117f515abccd123b42a28afb18930c3bb9a7781add5fa0c72442e20cb844790d4dc13e07cee2"}, {"a": false, "c": "!BbLRIPx0)H~XFoFvD~S~|pDV6=b|!bIfG3?38g6R$AJxCAzZog;J~zECHw&M>@%:Q!jo1i6Z{V!NSDV|*B%BPN}0NfUfj(R_sJT.duo%ETm:t350kkPVz-?1@HjIJHBuG5b0<04589AfMi%n;ZCz*iE-cQ7~zak,$5-;.$Vzl_*^m21YEm>!82", "s": "a49ac3ccb9e95152c71f745d0a29b745", "hm": "886ddb44a846af32cb16da86be346716"}, {"a": false, "c": "mox{T1c41)W9q|g|4U2Z;v|K{?(~8e9m`5&ZB)oO?8y(eX-Et2H8&Dwuv{,G#2yy{sICl1kJ3,MEK{HGm5)F5*aizk-8p@6L(;k`{p+B>", "s": "d70b5bbc807bfbfae0bc481ce537b4e7", "oc": "bc07411fc81c5a3d1133b8069f5d36042070f3a9659ecdc596ba6790f5968939d4adc640bebf3a45c5366d027cf854c2ae85ce6c1e66ade6"}, {"a": false, "c": "SBb~U1c41=D9k|n&Rh(&;v|K{LTk1A!h2L`pi*@*IMx)Z7Ep&Pv|NIeg_0RBEE%9`O-dc<1$`<{teF>%w*bZChnGw`dso9fQ$%DM)%|TNzcy^dPfMQ$+ctlzsi9%$Q=~}OkT$5-;{E($8**^m*1YEm;!8r", "s": "3a91294601ed9d00ac2e803b1597c271", "hm": "6ab779747889937f8675121ed80087e7"}, {"a": false, "c": "mBbLU5c4R|W9!|y4?+(&Sd|K{8(5Xe9VeXOt4)X6??rheX![GqH8&Ow~vrE!#2}y8s=Ch|kbwGMlK>PGm5m#5*^izv!8Bfwr(;k`Sn+B>", "s": "6abdf78b7a28610b9f5b6bbd33e7faae", "oc": "abc7a11fe8152632d5b1bb16791ffc0e259302e1c3fb2445aedabd93bf9589b28eaaf6f1bab3a64cc52b1d6a712a54eda625ce6cae734986"}, {"a": false, "c": "QB%LU!ct1)WOq|6M4h(&;%|K{B`tgY7@@4_eh}C5NrHAnc+KNh-PvU5ly1vhx5%(@YHxE|V:^?NHV+9b2hM#Ix|>jjMXPO]1mKL&kD64L3(&;v|@N6%-WDJXM;%=XpN^RHcwfR|rQP#2}y8sI,-1kJwGm5K{UGm5?35*Wizv<8xf}9|;kG{ptB~", "s": "33bf064f467235446e71a71f6981fb9c", "oc": "fa079c6533b14663bb8bb8ac49f29c8cadb717ca4e4e510faca12f46aecdaa7bd2180b4ecf93cc075692b2ef1defb313046c79f71da8135316364c5cc348dc99"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (449, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK%K0*:eKDA;mr>I~keTZAkYM9b4|8?zApDF=F@t{DFH;I0-u}y)hOvX`Ju2S}wLQ{^|)b2N2)s~oV*-)ub2Z$cGL3PHK6aW_Imm>tnL5wP[iiJr>>yrXQ9$79k+CEetm7#?df9l`e?ZIWkkO]6xKH3qG&=^D8AURZdArOM{*!DCH>RmqDo}0(:]se6>_Yt4zuoAT&_@KZ", "s": "9494d6c401bb345752149b61c7244745", "hm": "8067db74a8403b324f05683dde8e2f15"}, {"a": false, "c": "_BbK-Xs*MWK>k(sr>@~keTZAc8$p9%O)e$urm@oN+n39d89#;Ku7l&x-BbZG,2`EkK#LN(u^Agxw(4V!ATB7raG2_DCHE83cdfZ*AvZia", "s": "dcfd27b5a07d7cde847c4316eb0f74a7", "oc": "f367a11c0807da35d5341c0cd98f242b67d839a9c627c4a8a6bad293ce49687d1e9dfc2abcb3a654b5366db257aa9d76aa150e318327aa77"}, {"a": false, "c": "mBeK%{c*Mew_Afsr>I)kzTZAcLZ0-pqE$l6$C-c5Du)f~K<%Dxt{X<6~(j+p,cok={@4`J>Yn-TdK-!Ka7!P+7AGACE1:AYOMN>PQCR>R>q|o~h(Ggse6t_2r4zu(AT#_@KZ", "s": "bf510d5704f17dbcc92e521be43942d1", "hm": "6ab40dbd00de637686741681ef57dbe7"}, {"a": false, "c": ",BbTVK!FvevDAAsr>I~keT;zc&[pg%O%q$urm:md+y30d+|A;?uZl&hI~keMZAckGfvP%DJVOtEFr-nyMqL)3lx;b}Ap`h$TaKz4m^r@p?=HZWOs`JPS=r5Q4DkOjEY%!QXe;r0Sh>tTaY0fodRJ615-Wpeh", "s": "fdf5ae7dc8e4e510db23b7e815eacac8", "oc": "fc6a9c6349b34230a35ad4aa72127e2b191b2ad43096e1efb3d2fcab9f8b5b942cfc921167be03afd0e717b6e3a30b446179375f87c23d80bfabbeca50608c68"}, {"a": false, "c": "CBb=%Ks*MeK_AAsr>I~k#2`7hz#$NRu#fHB;$zZ&>f@e%>=yishD;H2XyxHX^K42aF#hd2ERNq[fogc}MOHKv(%zm", "s": "490b9a047d713789e02c1876ae6fe46a", "oc": "1bcc301fc86f2afc6e53b206a965e0cb87da83db53aee47f7fba639c1d9949c47eadf6e639b38817ea3683099b9f5682a639ce66ad9e721fe531a7498aa3915c"}, {"a": false, "c": "mBAK(px-$AQAL2JOIVxOiGIhuIJr}wKviSTn1s=RHK9Gf9WP-@uChztEBQZJ|Z`RCA&^PnGzW38(=`6b[{?wB24(}A!JgDzI*&|{GX1)O{WxpHA=#Rl{GYTTk;-|W6Vz*6{=fQB*6pGyBQEd5D!=q$vJ%zy", "s": "a3b4378f781d600f9e5b6b2bc3f7aa26", "oc": "bbc021a5c81f023f15535416a81f26dbb7d813adc5aec4d57dca6897153d69a9ae9d8642b973cb75cc8f8d026b2a2456a6857e206e9ed315e571d854701abfa9"}, {"a": false, "c": "mBbK(kyrm$QACXcOIrmOi7ILlBt[-GO$6vK<~|-OIZ#s^SIA#daWyra$8*Bk)0K.lmV1FKcf=rBYM1<=bBK!+b7EKve%|y", "s": "eab499753974ea80fbb48d0831ea5c76", "oc": "bc3e7c5b37b88219a4019aae65be3ad36a75d57cf3b59b2b2549884618e183d5876acc2ab643ce3e380fcbf4f4a98ca30eb227f80f55422b3aaabdab40e59adb"}, {"a": false, "c": "mB+K(Oyr$WQA;XmOI*]g))I90644j}Ff8vO>kDHx>20_A;~cM2uo!l3TM1<KvJ%zy", "s": "3c9a38cf437823946e5c471f6681b724", "oc": "ccda7cb54363312394bf28124905d205d1c1e0abe65c8a01447793f7039b94cd6ad81289badc20b296bf3bbc75b97ad037361d08744e95207b7e51e2a05942b3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (451, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "eBbL@%^%Nk?0W$;ga1*J**CmqX}JhW0ZaZlG?lNn$Cf`{D^09{kY&mcv$Gb=}Xj9H3J#%Q_@A^fUg5Eo_O+zSx=oJ^S)bA(4zEQU$znSh?^@qoIRR^CJ", "s": "490f27962b733efe167c2d16ed4644a5", "oc": "8eaba176384d2a321f504c76ac13f54bb7d8f3a9e9ac44eea7be270315875969841dee4abab3ac75c3b16bf07b0656e9a615fe6cac3e0a1b"}, {"a": false, "c": "sBbL@V^ydN?0W$;[c~-cP*cmqK@;r|K5qT&!JfJ;I5Jg1#bT*wQ2^uT?MQPgb$M{pdKJC)=M{pqyV!jR-wTu}au*j9aKG2;_Sr&Aa?iC`)B}yJ4u$Ej6!A{D^0s{k=Kwft$GC=IXj97ml#%QD#2^fUgv11_ObzD!=Boru+`1>b|qPX{uNXP2X2f{Uac}`b90sM|6wY5x.^!x2|E5slrm`r5r@k|7V5a5;H#ha]2jlNO0FC.TVS0nu#T~6n;zp", "s": "3a6f99246394e3c04b2d4d88050ac0c8", "oc": "1264946533f14215ad4fd52916921af920a431a08569ea26de00b8047cb75b05e831566a0936afeb33ec32e19bfffa10fd50dc6986dcb573dce00a951938ba96"}, {"a": false, "c": "7B!v@V^%dN]06$;g)1-JP*c7q6,0H}!o?ZI)H@5-[Ezhy!kxHU#2^fUgvg;_razD!=oJIt)7m6wzEQa^*t{hT^@=oIbRcHJ", "s": "9d8a0073cd722344ee85b2c4668eb349", "oc": "f6235975ec2361f9fe1ec7344c0f35054e0b538675f55af4b8392992e484b275ddb3c2637f20467d872915ba8d9700bd0cbe112be6d4b3879b507748d7a106d7"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (452, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKA;h~_|3h787#WX{&:n=j&nBjf>[GiA$|McYCMyne~Sdr!3wn|FsTf7A$VznHPLN&Zp;2AYnEe}4~D;WXw85Gby<_1VfJPQ#HiCM7LwR8d!-45ZG[L~gnqUA0{-^??Z>lfC~G9E3Y", "s": "94f3d60a0fe7845db1744b497929c34a", "hm": "f3675941ac58a61243053a3d1e4e2b12"}, {"a": false, "c": "mBb@A;g~_|_>787#WXU&=nqH48FV_I^3E9E$Tx=Bh>*L(]3Ua7iciIR8fG-J#X#>OgC^U%oK#UzQ-U>Ke<_z=D(NKssP%wfAd|iK^GF$W", "s": "190b97b5f0cd3afe8673adb6ed0288a3", "oc": "fb17a113ca18203515e38c0fa91f220b54aff3a9c6e9c84585b06792179b19603cf6f44ab9b3a84bc836bf077e6f5476cc08ce4cad9e72c6"}, {"a": false, "c": "9BZKA;2>_|&h78n#,XU&=nqH4LrI%yI#+SZ>.7r@9MkIC~B`Y@g%c&?_;qWaZhfYRyIKN|aPx2dC}v9uyIi8Jtw$L@OO2,2$4fWO5Ld;)=a]K)AQ#rZCfrEqR_dY-4qZVxLQgn62A0{V(??Z>&fCrxV(Vm", "s": "349a5d930f378d22a020881b565097d8", "hm": "64ba58bfa8b214ef86f5ca1adcf2d5e7"}, {"a": false, "c": "mB@KA*2~_|&h7q7#WXU&=nqH48fVaz^FE9E$Tx^Bh>*L)Z3U>iidiIG8%4-J#26>Bg~w^%oK^m|Q4U>WeL`z-Y6-0%sP%yf7dLi[^dF$W", "s": "f3834383e81866899eb767cb23e70a2b", "oc": "9b97a519b8c375381753bc06328f040115d8feb9c646be45e5fa07c95299bd618e3ca306b911a945ce366d027d2a5476a6c56ee4a4deeb4a"}, {"a": false, "c": "mBR<1;2~l|&h787#WXUz=nqH4f6`I)N47n0_XUV!sIhp||D^%&IMu@>Ls)b>D^FTEHMX_T`5@j}7si7I+qF>pQBGA[T~dzk{dM7@mZTKFfe9d!NgZgSpuh", "s": "fa6891057674ace0dbb42db815ea5c80", "oc": "2c669c6733b3f81d4308861c9ce503ec43737164c27341c4870ed9c47fcd581b72d869a5babfd18c8d23d5ea059d54c96a0101ef5d082a86f603b9b6baa25035"}, {"a": false, "c": "mBbKg02~_|}h78^]WXw&=nqH<6KPW9O23a=|JIzb_}inI:EBsL#2+bOgC^UboK#U9Z4&>FVL_2-Y6h0spPS}fAdaiF>dF$W", "s": "32faa34fcd7823446e8cf81f6b45c244", "oc": "fc6f9cd226ba41237be1d34efb6e6657a74cbb7d7dec73d4046fa64eabf7bcf62683c830cf08f65630d76d4d39b703031cc3568632143a1308d452fe5a1fd262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (453, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "J`_J&V+:+WNn0TGaHg#n!CyH#YUj70Oz-g24l3(W#b#gGw1a$?2Xm6.w1UcJ0#2{On(Eq~P}PQ^G@{SH7d$VsN{YvJpzauuu4Ofrrrt|*!", "s": "f3193e80f818610f95668fbb33374a3b", "oc": "2bcaac3fc01f0a2c1663bc06c9a5ab09b7d8f7a7669ec973afba67934599b0078e9cf64e0e3aab45cb96fb3e7b97587aa635ce1cad91dbcb"}, {"a": false, "c": "}WbJ&V+IJdNn!TGMHA`Y!CMH#BHMUqDEGI%7V)F8zdRc#38c>IkEsdWf96+jkZC%Q#u9$EKo~W)de42&14slR>FoXlMv%ApcgiX1Wmtwbt$*]QCBayX2EiL#8#AgNqT0K#32-xtY*H[+kW?ot0VYEjnjDr()5VN+4n9<3R?^a#I$QC", "s": "d90b90b5f07834be76ace810ed00ef70", "oc": "cb57a96f388f17421256bc04a54fd465ba6801a9c6c1c642a21067931595b165beadfb5a5923ab9565566d07772a3472ab358f2cad9a41f8"}, {"a": false, "c": "mBKJ9-awPU6Q<}+z|?~|a;CH=Lf=|#qT)*3>wLQJTS50uj8%hQNY+p,aeSYRwzIxBKRP#>$YGm-gYu=+OF_wtB#QA|*oy=&_^*B;c1)Baoy:-L>pc(Z<1TmCDxW>3Blt#I(|5taGwy%%5%4$VT|P5UeWtV", "s": "80da255107369d00ac7a85e45f90d2d1", "hm": "6ab899b478d2a77f864516ea78f24567"}, {"a": false, "c": "mBbMP-awVU+Lw>yR2*id#8=Agb%p0D#3f7x:QA3pjDWNoJ0VYKjnjgr(d5XT64npH3R?^aEq$0C", "s": "fcb937a17815678395584fbecc370a25", "oc": "9bc71a1acf4f2a32ef53ec06991f9404b2d4fda65ca3c615652a679911b949a28eadf24ab9b3079cce3f69927b2a5556a635ce6cdd0f6bf0"}, {"a": false, "c": "mnbM9-awL?6a6:+z6?jraJCw=<_4hSii>k6}R*^aFr;+8pNuz_%1*sx^M#=&[x*b}L!drIlXM^f]5mJ;g)9n);>Tv1_}XM>c?Hq+$d^$mZI=XLw)KM61}WC4g]Z=r!U$hR1n]", "s": "3993960e5fe784fd529dcb3c7129c425", "hm": "3767d3f8a84daa3213056952be4ed413"}, {"a": false, "c": ",EbJZu|9c,`{Ok{rry?Hj)cv`8v}}{Xc}SScw%$>)pB?8#M>;w683&4h>p!|#2l->LDz#hv#Jv>B4XqdyZ%4nNEfrQI5~KA`D>tnLbB.(07YBC9SRFZTg}~7_!t)aq#%or4@5AsUpGDKT5L`OM~%rve*e{--OYzAU},Ly7I9)gCp1}y>4g$T=r!;Vho1nk", "s": "ac924d56771bedad192e85146490d215", "hm": "6aa7bd7d78d14f788e75161cd8f2abe9"}, {"a": false, "c": "}B0K}Sjyw%$:)piC(#Mr;w6W?&4h>MD=#2`>TLDz=6vYJqiI$Xqd!6=+n!P{rmIrlUA&k;ciB<7eX", "s": "f3bd37517408450f955bebb5d322a24b", "oc": "f9e75119281a25f21556bc01d91f240597d0f3a9cdae7445a5b0379f19c859b18e8d7640d9b3e34cc566ee397aba5476bbeece6cad1f4369"}, {"a": false, "c": "mBbtZp|9<2`#Yhnrra?{j*~-`CT6PtQuegliMs*jveVhvMCjfWX;nXiP:%6{hTyWCP}QyxmzmaLTiouxy{tU80>9?vFWMxVpuh", "s": "256694753674e2ecdf8727d8b6eac0d8", "oc": "2cda9c6233533205a341501df3e06aa388b749ce470722c501bfe65b8b2d56d6856795d6c55eb820db39cd002bdcaa8ee6413fc3aa8c6f7c426f1821a1248fd4"}, {"a": false, "c": "mBbJZA|Ac2`{Osng{a?Hj)cv`6LZ;t#>7UH2~|Vubg%%qyVZvB#2)-60Dz=+vYM^5I4Xqd`Z=+nND,rQI{~KA9y;ciB%ge+", "s": "bd7a01a94d7623446e786711668193c4", "oc": "ffce9b6b33b351524be167ebc6acfa32f758d608fd17a88444326c7aea2132f5cf01519a6c26bf4b9410103f38db95dcbc2aad46d8fe2c2835ccf802dc33065f"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (456, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb3U3E2H_TUi>0u3jw{+PQ@y+}6)38kgOj#8_Xku8rKl4La0VaxNa)iBob`(KR3]MRS]G9=H>`kkQbT&_I}G&=n3C:k-`JptMAS;TOj+nQtI`BLc){GAFR]FtD8lMKWH}SIJ{L?4l.", "s": "605a5d6701d47284d9bb154b57932231", "hm": "7a88df1d78d2b67f86f516a735fddbe7"}, {"a": false, "c": "6BbKU;3P;<^)-g>eOwPcP?@8+k{)=8kN8)iB_+j3S9kuenlJ^XiWnL5fGC_3vA>puh", "s": "95755a1526b872ebd4b42db802ea1acf", "oc": "e38e9e63335332c773010ee298ecb2bd1929fa8ced6030322861570773d8f907de621c4ba67c1e4dd3b5e1ed6c465bccdbba855fe54d8de9bfc02801d22d2920"}, {"a": false, "c": "mIbwpFX2H[Tgi~j2?knz>r&T!4C}9_B3S`w@Ho&x-I6{!?)?c%ZqJ9^_Thgfj$2fdSUusk{c`585d?&FAcE3qH>1^@#aQ,hTu^WmOf&ho-lm(GI;5K*A2q#~rlzz", "s": "32486963cf9784cd5314cb634327da45", "hm": "80f78144a1cdab39c4006afdbe47d716"}, {"a": false, "c": "m}bLWIPL@`aiGhpFvD#S_|+DV8)cAL(7>V?Z->csvkThDo`,|6a}NX%ecDLo#2{_&wl++_28}B3hg?v9g-kWQNG(ocZCHK2^T7Z3$<`$7", "s": "992b94f2407238fe6671aeb6ed00e2d7", "oc": "bacb221fc81fdad135e8bce8a9182e09bbd59aa9caaec4440813ad231a9c89994eadd42eb9b8a605f5366a02fa265a66a535606ca95f42bb"}, {"a": false, "c": "mBbLWIPx0AQxGhoEpC#S~|PDVLVlE:d!}1mw5-+>Q}c48kCODkV`={zO0u}AxQ=}Z+_)(ANAXKNQcWupH@G$e^HYOnKgIY~oH{C*(7KhBGY}V6AZDoqHcY^O#&;)CT<^_oOu|h]EnmzGI;FNX!2*Gjrl7z", "s": "3ae02d8301089df7792e25b53490d9db", "hm": "76b75e9676dfdd7286753f4ad87ddee7"}, {"a": false, "c": "VBbQ-0lE0`!~GCoFt.#CK|+DV8)c(P(84VOZ->VshkThQIOVV6a}NV%eDmGo>1@=&$l++_w8}B34%?OW5-kWQNo(kcGCHK2CT{g3dx>Wt", "s": "33f907b270105acf895a9bdf53329a26", "oc": "1bc784a0bd1f73a215c3bcc62917210b23d8f2a1c2a5c475a50a685b159e856982a2eb4abeb39bb5b532bf024b2e5f7dac333e63ad947d8b"}, {"a": false, "c": "mB^L`IJ{0`a~GhoFvD#SK|+D=CCe8~*X5GA0=B4Oci?qR8^WA{f1ew_$c@D%aU4>LdvQQ9)o3cJZSv@=guSkpac~VMPAAF?HN8kJO%H_TY`F}4#M|4:Tuh", "s": "facf99793634722f334052680c94c9c8", "oc": "f261cc65f9bc4c0da3168b1d0517baeab240ee244e2f9852bb391d7f849bb3c7d709df77ec72c8a376cbea99b92ad5a03cbd94484262b814477442863ea635e8"}, {"a": false, "c": "mwiLNIwx}$@", "s": "3db400418db82954809cb1146581b314", "oc": "fcca9b9455234189cbe1d7ef086bbc38a6b005e2c5ef862108e9601df1a9fd121ecff10668d3bb60d842e00ab1bd303afd716d9540c7f279b710a12d632981ee"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (458, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m=bhU1]4%)69q|64*h(#;v|K{Y2^M7d5D:JM-UtmtKJFEDr?m|!bOF}J_3826>LmJxCAzZqg8J~zX}Hwa~>@%Qg;j}1i6*o>!>vDVAeB%BPNH0)U*H0Z>-.0(Jj,JHcrFhbl<0Mh|UAfMQ%t`tkz*iE%8Q=~zakT$5-;E$Vz8_*^me1YE9>-82", "s": "97035201ca6a821dd4b8d92277294c4f", "hm": "84674044a5488d320805a6c4b64edf16"}, {"a": false, "c": "mBbLU-r@1)W9v|644h(&;v|K<86$Xe9O`5OZ4)wL??EP%X-WGQH8&DwuvBEG#22y8RIC-I[x,GMEKl*Gu[xf(9(;9`{p+B>", "s": "c916f07d207d30fe8651881ae30fd8a8", "oc": "6864a11fcd1e41324e53f466a918653b37d3f31918a7bbb516b947a3a599852984ada048e9d3a561033f660276275376a3a56efb7e7574e6"}, {"a": false, "c": "mgbLU1c41^W9||J4|h(&;v=K]LTk1i!h2L`pirz*IAxoZWEp&AvShIeN3bRb;L>9`O-dc<1;`<{tm3Q%wSbvChnGw`;1o9&I$%6PQm|Aaz{y^dAfM>Z6`tCz*iE%8QQ~zak+$5-;E=Vz8W*^me1YEm>!82", "s": "315e572811363d00a92e938b75f0fa21", "hm": "6ab75db07592feaf46d51260dafd6be3"}, {"a": false, "c": "mBbFU]c4)(W9>|644L(&;vR:8&DwuvQIG#o}y8Y", "s": "f3cb3cd3c8178106c55b3bb8fb3c5e28", "oc": "1bc77ffe081f1a02c2e6bcd6a9dcad0bb7d9f3a9e646c445a5aa17941e398569595d454cb9b3ac45c9376d067b435473a335ce6c8e2e4296"}, {"a": false, "c": "mBI0e1co1)W9q|644~m&)v|&{B`tAY7D94_ehAC5;rHsnV+KXC-PvUidy1vJ>x%t@YHIJDV02?)T_+9b685#8K.>jzqZPOC`mKL&+DG=YM?X*yf!_V=kuh", "s": "fa6f0675317482d8d6d42d0817ec1ac8", "oc": "fe6a9c9203b36d79a4e88e1c9dcba348c3025b30d83821f50ce9de95d035f94eed2ec0a4e682758c8e762bbc3c2bc79e3a7e603749385818cdd91d4e0f836509"}, {"a": false, "c": "mBKkU1c41GW9q264Fh(&;v|K{6BtWiJXM%(rx`~meXZAcYM.b4Igfb~$v0=FEt{DFHgI^-uUSh91vw`JD}W}wLR{zT)bJN2Xs~oVF->ub{ZKLQL3lHV6ar_Emq>t5L5uP2iiJQ0>arXL9$79k[Cs6t.S#?AK9ldeh+IWk`OJ6dtY3q{&U^aC{UH1dxr}MF3PeC%>R,q|o~bKGgr!6t_Y+4zuoAT&_@KZ", "s": "99fab6b10be08f5d59749b75c72ac725", "hm": "8097b164a64c6b320209107dde5fd6c7"}, {"a": false, "c": "mBbK%KszMeKDAAar%4~A$TZ4Q8$g9%O%q|u|=2mM+n3bd8}A;-H7l&a-BbZE#2YEhz#$NVM_D-?qE$l0=>?-5Dk)fVKu4D4NHX*hf84+p-cokDRcz`M>on8TdKvU5a%!j+7[P:Cp>Rmq|o~*3{gsLhA_Yr4zuoATgru%9", "s": "918a53f60136928c342e812a54d1d251", "hm": "6abf54bd7822875f8c7546bdd088f6e7"}, {"a": false, "c": "mBb?O}s*M{KDAAsr>I~k2qZ9A;3u@}&Ag3IA-#2`E,z#$XVuI~;eTZAcCG%IP;Q;QJgYFY-SyMqf)3lx;8srp`h:Ta2j0mDN@`?=HAWws`C#N=e5QTDkOjEY%T|Xe6D6u3>tTrY.x[d~>615CCpuh", "s": "fa7f997b36ac7beca9862dd10fea6fc8", "oc": "986f9c653355c2191357d82a7972722b196c1cd4b5f0e1ef5c4deb7f2dc30fd9fcfc97fd1db6139fdeea81ba69ac27fcfd1d393f66711df2b8ebbec198148f53"}, {"a": false, "c": "mB}K;Ks*MbK^A]sr>I~GeTZAcHGz~_22KC1!~ZS}G544aG;c3c#G`E@e#$N-u$GvlVS7W@P3Z7TGTeVhqHS7r{5Ef@e~>;)inhI(|3X>ksX1>azaaahguX1w<.4Yus!CRJH44_y@ga=h4NF^P-Go3m8g=`@b9{rDBlcY56A3gNz$*_|{%^@Gl{WxpHAXVdc{aYTsk;FA_6V;*2{=GXq?_pGy!(-dzD!=o+nVXS", "s": "3a9aed2651749010ceeb85db5420d2f1", "hm": "69ba6dc3c862b7cf867b15da98f81bee"}, {"a": false, "c": "mEbK.}|k$A,ACX$OLVmOi}I8u96ceUg*kV?28@M-tz#nr;^E<3bFOjd2En8]efogcjMzXBtG;|Ow0vKy>L-0I#=-^GXA#daWCiO$8*Bk)0K=lmV1N2cf=r(YM1FkV6o>^va=jmcM`ufCl(YM1uP*.Rqg%JhW0|KZ^G?,Nn$Cf5JHXW!Vl^irNA@zL~fN`tJK[jAX(7!oG`H7ORpeLbKzOg^J`,7L%uY0gW#{2l0?FvZ.rN2o9CWCLPOI!Ng2d-7_q2qljFiM6-1$gD6!A<1h7E%%1I5PYIE}t07=uukU|I4wG+ki(K|h", "s": "8493da0f62a7b35b521297d9772977c5", "hm": "80e5db4eabcaab32c3f74c3abe4edf1d"}, {"a": false, "c": "5Bbk{VR^dN?0W$;g)1-JP*rmqJw1tFgI>AD^0slk=K>cv$GB=~Xj973}#%.}Q{^#Ugv1o_OazDJ=o]IS)7msVKEQU^ztMh}^@uoIRt^H$", "s": "83a057b520fd30f91609e812ed4fe4a6", "oc": "dec7311f4a17983015c3fc06a9122494f7befe4526aec45815b71493b59988658ca8fef7bcd5a74a453e3d0c79d46473e234cecc0e9cd11b"}, {"a": false, "c": "*Bb|@VjudN?iW$;g_1-JP{1^Os|&I3wcv$GK=wpj973J#%Qi#2^C1gv1o_Oaz!!=^JI&T7m(>b|ioX5NNX:2XS?9UacD`690sM|6wY5x}^!82|E<{lSf`r[r@k|{i0a<;H{nh|yjlNO0F~WDwS:nuET>!CZzy", "s": "ea6aa3d06677729054342ddf049afac8", "oc": "bc6a9835320381d91300542c16e7294755a48d408963ea6fd6c0d0a40eb752f6e8c31123f296a8c5cdd742411233fad0a151c6678b31b514b8bc0a5ac93815ef"}, {"a": false, "c": "m0RL)VC<{N?0]$;g)1-JP*~mq(X:4B3oEjMLL&5-v7zn0j&nB>fbvGIA@|>|3CMyn3~>Tq!m2nzFsHv7q>Vznv5K6AZD;2jx<>e$S8DtHX+85B.y<_1V+JAQt4iCffE5R8d!-4qZ}xLQg*q2AL{VO??[>vfC{xAz3Y", "s": "93e3d60c05e7842df27e93667729c14b", "hm": "f460db249448e32553086e3e5e6bef19"}, {"a": false, "c": "mBbKA;&~_!&hzz7#WXU&=nOH485YBI^FE9E~T*^BN>*L$ZfUaiidiIl82e-{#2^>OgC^U%o}#UzQ4UPFeL_z-Y6h0sdf%y&AK|BH-.F$2", "s": "d90965d4207d90de837cd516bc2e7467", "oc": "eba7b11141e37a3215a3b406a61f050bf7d8c3a9cf8e4565a8b664a3559988698ebda54ab9b3af48c246ed029b201409ab35ce7cca10daed"}, {"a": false, "c": "mBbQ{;2R>{&g787nWXU&=nqH4LBI%yI#+SZ>%7i@c]kp#>BsY:g%m&_H;qLaY`OY{yIANTa$s2di}nL.gdf8Jtw6L`OO0~2|^fOnZLnW3=bR3)AQ#4]CfmE5g8de-4NZ}xLQgnq2ArmV^??Z>>fCr*LEN3UaiidiIG8f6@J#2^>(|C^U%oK#W{Q4U>FeL_z}Y6h0ssP%y2ADki0edF$W", "s": "f32f6cf2b8be610f35e46babc3375495", "oc": "fbc7a11f081f9d311953a402a914220bb7cf63a88cfecec5adb897c313c919926e11f179b4733745d5366d347b2d1b66b635c68cad9cd1ca"}, {"a": false, "c": ".BbKAp{~_|(R187CW+U&=nqH8C6`|)f|7@0_At,!s)%p|PDQ0)I%u@>9on5>v^pTEv1X_]`alj}7si7++qS5p;BYA1<~d*Q`dI7FIz<Og~^UH:KEezQ4U>FeL_z<#6h0ss|%y|Ae]mH^dFK1", "s": "3bba8000ad76cc44f579b71d66814344", "oc": "fc6e2c65333346a32be647fefbfe34574efc6c47c0e281d80fafa6cefbfe1cf226e7377064989c3a848c74403db7e6d774832874e244381b04d31cf051af0263"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (463, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mB#$&V+!iU.8*&G`;!0{Zs|{@3MnCF+cn%em|xZ}c|<3Pmix&i!$IXJ<&LAX}TS7H)t{(MaH~*!zOK_3HsUN*`IUs~!utjHWkuecI!", "s": "945466010f478b8d981a704987facb41", "hm": "8077dd441955ab3bc7a26b36ae4effe6"}, {"a": false, "c": "mBbJ&V+!+WNnWTGaHg#Y!CMH_8--(231ayoRQkfCv|$<6^Uo]Qpz=zr1U*J`#2{OndEq~MZu7^Gu{6L7X*)dN#Y!Jpx{iuu4U^@r=p|*!", "s": "e90b97b5271d80fe86ac2816ed11c7a7", "oc": "f8d7a6bf581fa9a2a15dbc0619132b02b768f3a9c3aed495a68407035a994b6999a7f84ab9b5ab4ec5367dd25bcb5406d6b5ced0ad9088ca"}, {"a": false, "c": "yBblDV+<+;>n2TGSHg#YxCMH#%$:EdAJuLZZs|dbiZktYT&4n}P=4VCmWV9Y>MJisIv8CQR{azUk(-O74C)8jMq,ug4&|:J<<0M^y_=DyfRx^XAX}2z|H9gB(M58~!>SgKJ3-s|$*`Ic-~!gtG]^quc<8Z", "s": "4a98555605669d047f2e451a549a15d2", "hm": "86b85eb1c8d8094f267ee63bb5fddb27"}, {"a": false, "c": "mBsi&V`)+a>nWVcaHg#Y4C{H#|-dM231SyoGNIJTk|n<6^Uo7Q=drz>1Uc}7#2{Un([qU`ZQ7&Gu{SL7X*)sNTYMJpx},u@4Ufm&WpjF7", "s": "fdb434817a536e08255b6bbbc3771a48", "oc": "fbc7810fc112da4e055bfc0697142e1bb7d1f3a9c671c444f5bb6753b5b98169cea7f6b2b9b31d45c53f681f1b2a5481aab51e67ad90ddc6"}, {"a": false, "c": "mBbJ&V+7+WNn$T,iHg#Y!CnH#U}9U8DEGI94O5F#zd||#fac>ItEsdWf96[dkZJ2qbC2Zwy_BU;Tbt1TnrE=oNXqkFEb(lOLEF4>A7dAPjQ#SF$IxY1pu+", "s": "fb5699756574625cdee4dd18bb6acaea", "oc": "dd6a67b66353481fa30ddf0aae7347aef6dcaf51f5fc9c6c509d37e76f542da83b0e2ff11fdd1b91da358d05cb303e3420e73abffc2dd13f64120eb168088362"}, {"a": false, "c": "mBb1&V+<+WTnWAGfHg#YnCMH#6TnlkYqqB$rFZScln4I2Y=3O<#2{On(Eq~PZP7^G`{SL7X*)sz#Y!JpqT_uu4UfmrJpx*!", "s": "32bf0a5f2d7cf5446b7cb763dd8153e4", "oc": "fb6a3c6533be0f01b83dd7ee2faefaa24f8d89e98655164c3cbca450960876e020ad26bf26deffcfbd21fe928936c6f606f67014e7d872a2ad46cbb9ceb8b142"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (464, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbz9-OwiU6aZsu`vqP?RH_DKE~(N)dU62KZy=NqWJ)e3`PBGa30(SXlMb%ALcgZX9WmCvhJ:3Clt#*(VHBayw2*iy#8oAgNyT0H#m|7xtG*rp+DW?ot0V8EjYj,rEA5XNQ4VpH3R?^aE3oQC", "s": "f9b073b12dbd40fe8f7ca816edcfe4a7", "oc": "6b07ae3f548f2a32ed53bc06a118dbeab7d8c369c64ec448a5bafb331a9e81688ebe1c2bcef5ab15c7379e027baa5576a4e5cf63ad97ae88"}, {"a": false, "c": ":BbG9>awLU6awL]J)S5|oj8R|Q&Y9woy)S+ApcgZX}WmB:xJ>}Blt#*(|Hva+|n3,|L?Cw=8<4;V5mR@oT7@6*SCw>y^2*Nd#80A+NqT0K#307xt{*3p+DW?#MXVYujnjDP(dLXNQ4npf3R?^>Ef$Q{", "s": "53b90b5178146c8390946e43c337b33b", "oc": "f8c7918fca1f27321553acb6201f300bb5c18fa984aec845cc720b911999886923ae8e6ab01aaf41c6306dc2fb77247ea435ce6c9d70d158"}, {"a": false, "c": "mBbM9-aw.U>a#QNT)*2|t!drIuxM>s|5gJKi[9n)I8Wvo_(#C>c?H#r5d^$NZI#}7e:fccpuh", "s": "fa69d975ed74b2e7da242d669cefcf18", "oc": "fcca91dc44b34e1ca332de1cedc3b62d0a2a1d635c4ff2c94be30c28a6d4716da8c106fb9afa6dc7521d4f3ad1f3034e8bf0f5b0c7f49731cc7c68af1a27d457"}, {"a": false, "c": "mBbx9-awlmdyr?+=n?~|a;Cw=6B!bc7#aX+k!>Jt4RJ*8kOplQ>y|#2`-cLDz=hNE}q>w4Xqd!+=&9ND{GQ8t~KA&d;ci9%7eH", "s": "c90b9705507138ee87ccad1c881be4a0", "oc": "f3cea14da91fda34055031326965b1ffbfd8f979c6ebc4e5a5b7ad9b15ef590f8e7e274bb393bb40c23760027b2a13765635fe6c1d1b4ff0"}, {"a": false, "c": "WlbJZA|Wc2ebOs|rra?HS+c@`}jQ)z}pZ(llv&x~<)hiIe5^*>H,1Z{}T8(`D>cnLbBrE^7YBC9S+AZng}77i!t2.q#%>r4K6AOUXI|h2`~9L5{=~eYJq>IVXqd!9=+nNo{9QIt2KAfZ;,iB%7eB", "s": "f1b93781782831b295736295d3e5a32b", "oc": "7b703b1fcd162d3c1753bf76a95f249787dab099c4aec4ddafcaf793169b99598ebdf64a0cbaab4fb3a8620230ba54834b35ce7cad8f41f9"}, {"a": false, "c": "mLbJ9Af9gd`{Os9rra?Hj)cv`8W6YMtDegu|_SG$gyCvZ_nC@`h8$|0>I4ijseCh9?|CfAY;nX3PU%F{OTsWAP^^sBgz3aL3`[uYy{tMt.G96vXWMJGpup", "s": "323f9075b6f4e3e05bc72d8805e5c277", "oc": "f0679fc543b54e19a90b8e145b346378e2b3b9c5cac222df361b36288b8fed6605d89a664950b78cdb3eed0042fd3abee6403f6cba5c94ae12c688485021bfd7"}, {"a": false, "c": "mBbJZA|9c2`{Wsnrra?Oj)c@`6LByT#>7UH2q|8ZbgK$lyV4vBwgE:TLDz=hw4yqd!Z=+1ND{bjOR~KA@!;ciB%7eX", "s": "ce3a005f4d9e234ace7cb710c681c468", "oc": "4c6d5c0517b3b692b5e15455027cf4d9b5382688edc7a44e40288becea7a22247707519a1c7ac74bc49b398078d82551ab887884def5b79135c3160cd5fe3134"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (466, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "G#bKU&X+jfT6ioT2Ed8c95nC}YU)0LnP=-eGU;eoG82E#pXr[~a~Hxo}Bh(c;B5G=PQ2X~|ebYb).N!&_l`felAQLzuAAEZuR3&>sBB|SNTO^o^QuR`BLc){G*>R;1W{<^)hg>TjwP+P!@y+w6)>8kCze#q_QkuarK*4La~~6xNI)oK_z<[YYnpm2XPBN2B%cThP6S", "s": "d96e67b5a073affee6c5fa12e10fb43f", "oc": "8cc7a114cbffdd921133bc0679ae2f010d9073a1c6aea44da5ba9799159989b9bea7660876b3a198a5b36852cb2b5f767635ce1cad9a424a"}, {"a": false, "c": "mBNBU&}2H2TUiiT2<&8c9!nCWL([OlyA88%@LR-?!8akXdkTTWzpK^t?SG~p|T7+9?AYy`Tn8$cY_I`G&=]39}c{EJmoMAlzPOjoiQut`BLce{G*FROF232Y{KWHb>I}1W;L^7TjwPuP;@y+D6)=8kCzp;2_[kukr(l;LaOV6xN7=iB0+9V=C$B?%W7O5sDNK7B1wgx$Qp(xP@zH*!jIHCD_Q2%AD+ZEc_{GGN)*C`Xw,+`7a^@HK{%jaSCvuenVJ^XiWKT5fGk9HvA>puh", "s": "3a6f998c101442eb5f2aadd805e3aa96", "oc": "f1639c95a3b308b903108e1c4a8d34bd1b6988846b60303169dde7c0b8ca8307b4ac1d4b477daeefd037a3cd69551b0c9efa82df4b906d363ff47d01db814d35"}, {"a": false, "c": "mz+KUVG2H2TUi~T2;&;^Bjo7`5nN#2_Xku8rKl4Li~V6x2I)iB_+Bg1YPpk-,PyN2^%cTe86]", "s": "adba00404d103abcce7bb87f668ab338", "oc": "3c6a9d6531b349a9cbe5c6f30865594d124851c7732a5215c99f70353abde9ae7e89d5c34cced571eae230fc15da0d043d5bdf5de52238c7a3f0457c4450e0ff"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (467, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mK^LTIPx0Aa~G)oFvD#ZK|+DVYWxTvJQgCtCmpMRJP~.b*?be!rd{Mj>0qMG@{a}Xa`9+-nQ{*Ch>?knzEa&4Q4C}9_BWS`de2=ZpHm2yx`^L`-+c@{coZ>xMT61!U%?ciKqJ9^<|hgfj$2N*3j8skzc`58ed?VZAAxoTHcY^Q#&Q*CTup&7grHhoHumzGs;5NV!2kGPrlkz", "s": "9499020a03acf773221793694b29c34e", "hm": "806fd2f49e4b773e63033a3dbd4e1fe6"}, {"a": false, "c": "mBbLWIcxcs3k{hDI`VV6aqNV%eDmLo<2{_&wo+w_w)nB{KV.v9g-TIQbE(kc9C4K2^.7Z=nx>$@", "s": "da100b2b207c34a9807fa814ad046ca8", "oc": "fac70d2fc41d3adb55e74c06a61f240fbeaaa3be36ced44da581f763a599cc758ea6f64a19f35bf7252d4d0480245576a665ce6c949fd212"}, {"a": false, "c": "mBbLWIPx0`NjGhdFJD#_Kg+UVLo{EEd!}1muo*+>Q)|48N1OhPT`=#{Q|RbkxQ=}b9yt(8NM06pQsW-pHBGi-2ZP$*=gIYsiH2C*(WKhBub%V6AZ_oFkPYw@#&g*hTu^_hGP|hocsIkTJDI`VV*a}NV!fD1L}#V+_&sl5+_w8nB=hg?v9(-kWUNG(kyGCHKd^T7>3nx>$@", "s": "f3b93d817878a77f9f3b6bbb273eaa3d", "oc": "fbc2a132281f343216537409ab0c2604e6d8f164760ec54a05bbe793fb99a2e95e36f22f39b35b4beac6dd097b2a5406a435ce6ca1cf428b"}, {"a": false, "c": "mBbLKIPR0`a~Gh?FbDwSK|+DVC2e8R*C3fA0=#>Oc^e;E1^%MRfPewr$k@D%CU(5$)kQQ9)o{X,F+S!=Ou)3pmutVMP=WF?HnvkJ`%5_TI?_+3>M`AwCjh", "s": "f869a91a92a9e93e4f24c0d33aea82f8", "oc": "fce72cd5cebe4200a8078e93500d118ab34eb9948e6a980dba811d7f011fbb4d5b79df72baab14dc0bbbb94da8d1a55ff05b9499dfc033e347fb401f380ae557"}, {"a": false, "c": "JBbLWo{x-%a~G?U#vD#AKM+DV6UTb%E^IlL`or[VsxVKcuBCqC#2{`&wl++_w8D03Ug?v9]-kHQNG(kcGCHK2^T7y3nxb$@", "s": "3dc8004f47c8e41a67a1b71d668eb34f", "oc": "bc5abc655f9322337b41670f08cf272af8df03e3c5b0876e90e804e5e4abdd12d164156af0c3fa70e190ef7a2f7d4791fd574d910ab6f692d91f0ad09303a9c3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (468, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbiU)c41)W|q7t45h5[;veW{Y9^07d5>ATM63@%Qg;jo1)m*=>!NvDVAelNBPfh$)fU=x(>_IJTLdjRH|Tm3;350k_PVV)R1@HRcJH#zF5b0^045%>AfMQvt`RC7aiEN8Q=~z>kc$5-;E$Vz8_*^m**Y%m}!<7", "s": "249c3ffa4bea845dc2121b72e769c745", "hm": "576796446876aca2c30c66bdbdced31e"}, {"a": false, "c": "mBbLUGcf3tW4q|64Vh(&;stK{8(5X^9m`5Ob4)*L??ype2-^GqL8&DwuiPEh?2|yYsIC-1kJwGMEK)URz0?^(*Wizvh89f(93;+`{p+v4", "s": "290297b51bfd4bffe643a511ee6feaa7", "oc": "f7c6a6ffa88f1a3219534cf3e95f380bb04f5b79660ec572a08e67b79e4959595ead264a02b0ab45b5386d02a62a546fed95c1acee47a6ee"}, {"a": false, "c": "mB~eU1c41nW9y&D44|({;v|KvLUk1A!r2L`Ii*V*IAhKCWEp&PvSNI*N9+O-dch1;w<{th3Q%w4bv6hnGw`dMo9CQ`c6MEm|ANzcy^drfMUXt`1Zz*i*%8Q=~zKkT$5-;E`Vz+_{^mex|E<>!8(", "s": "1df43da671566200a9d985255be8d2f7", "hm": "6a952db618b2c7098575a99addfd9d07"}, {"a": false, "c": "mBbLyEc41)B9q||44h(&nv|*G8(5XeSE`5Y14)X8xfY9(hq`{p=B>", "s": "13b4fb8476f6050f95854bbb65a03a2b", "oc": "92b7c117c81b0e8242737c068914740b9038f3a976aec46bb5ba6dba1590a568b1ad321a0948a447c5316d0878225876a630bec6877caee6"}, {"a": false, "c": "JHbL|1cZ1)W9q|6T4h(&Jv|KqBot~8]|@bBah%C5;rHenv+K)h-8IUioycvhxx%(@YH>J~V0^?NpVY9b6hM#Il|>jjq(Pt(H_", "s": "3bba8d874d2577cb6d747b94ce011744", "oc": "fc26a36510b641adbe81d83cc951408cc68757f8481e5def45a82ec6ab3e1abdd4c89b212f9dbc973fa5d33f1befe81d241975f11dd873031646f10933405169"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (469, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "dBbK{Vs*MeKDAAsx>I~kfT5AuYM9b4|8fb~$D>=r@B{FqgOI0P%ESoh1vX`JD2W}wLwczT)b**2)#~o:F-)fbVZ$cQL3PGK1aW_Imq>t*L5u}2i{JQ>HyrXD93v9F+BL%t>#M?V,9l)0?HIXkk*%6dKy3qG&0^T8A}q1ZArVMF>P%C%>RL~TY~,&}|q}6t_Wr4nZoATm_@DZ", "s": "94c3d6e10fe9965d52049e1b732fc345", "hm": "6067dbda184eabf2e75e6a2cbe4ed977"}, {"a": false, "c": "mBbKuKs*McKDWAsr.I~keTZAc8H59%O%n,uWm@mN+n3!d8)A;)|7`&7-BkZbn2`lhz#$NVuoq8#Kwv!5a%}P07n^ld_!=I<9A6fX:j;P%C2nRmq|o~*(Ggse6t_Yx4zu0AT&_@KZ", "s": "97f35de2a19698e0770e8519749072a1", "hm": "ea19feb678d4a77fb6758218db16db1f"}, {"a": false, "c": "mTbK%Is*MeKDA#sr>I!keIZAc8$p9%O%q;arm@|Npn3|`89A;-u7l&B9BbZ.#2`Ehzk$NVuI~keTZawCGfvP@Pc{OtEFXfSyXqYz3lk;8.Ap`hP|a2z0mar@O?=HAWOsbJPLPe5Q!DkOj}YoTnXe1@6#3>tT+YmYodR>`|3-rbTq", "s": "0a6f99a23c7cebe078a47d1805e5cacc", "oc": "5c6a14ea33b33e29e380d4fa7378767bcf6c2c04bafa580845dfe46890679bd944dc9e06d0300b94de78a163e3aed240f17d48586a7e306228ebbeca04168555"}, {"a": false, "c": "mBbK%Kslt{KDAAsr>IWkeTgAc6Gz~_22S{1`>e`Y-54&aG;cMy#@`Enz|$NquGje>>;Ngsh[PH2-a9H4i2azaF#hKvJ+zv", "s": "6693d9225636e63d52d49064d72fa74a", "hm": "8003d346aaf8abe68d07793bbcecdf66"}, {"a": false, "c": ")AbK(pZr8AQ|CbmOImmOi}I^u96cezgMXV?28@M-Iz#br;^6<3WFOjd2ER+7FWogcYM`pKd^$Z+Gyzr7YcCmo{G{(;RF=bWK&MPh>KvJ%ey", "s": "df0597b5e67d30fe827ea1f31dcf4cc7", "oc": "f87ea7a6c86f2a821553a88da912320b47b9e8a986bc94f5a5baa7901a994d69302df64ab983eb457e362dbb7be75e76ab354e6caed2d11b5d3bdd4f87acafa9"}, {"a": false, "c": "mBmK}Pyr$AtACjm&Ihc9^ceUg9iV?2K5e-gz#BrQ^6<7WFOjdbER8q=|ogBP81<KvPozy", "s": "93bb6083745961b097545bf6730fa92b", "oc": "f3c3a405f61283327553bcd6a0de25abb928f34d36dd7a4e4dba6293154989298e40fd4ada53ac95c5316d724b2354b7a6362e61ad946a1b5864dc4f34aa9f8a"}, {"a": false, "c": "{,bK(p8r$AQACpm}~V2O#~ItuBtP,>Oe0vKyBH-0###[^GXA#dPWCra$b*BkxrK:lmL1S2cf=*iYA1<KvJ|zy", "s": "fa5f3975f674e246dfb42ed98fe2cbc7", "oc": "cc5e8c65f3b3ce4fa350f77165b027856278412d63f7941bb5b751d418e18eac7a3a0c2abb997e3e38bdc1b434ea1c87bf972ff10094442b3adf7dac61ccd05b"}, {"a": false, "c": "mBbK]pyr$AQAIXzOIGmO*FIhu6e:0[Gx83O>kiHo>(0|=ymcaBCf!l(6M1>=v^$U+O~zr7Y;C`o{G{(;RF=7BK!2,7>q:R%zy", "s": "3dca00214e7805d46ec9778f6a82b339", "oc": "fc628c052ab333a15bf0103a4958d23e9181605a2e64da0124cd8df301ad908e8af830893cdb20be95b20b4455b9e4d0322f1404aa0e1576717171b8a05a24f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (471, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "{BbLtV^8-N?SW$;G)1-JPAcmqXUaPW0#KJ^G?lp}$C>XJHV)!%*=i$Na@T{If}btEwG+ka(#uh", "s": "9493da010ee7233d251a9bcb278e6b45", "hm": "80686216a50eec39c3076a1db4aa3f18"}, {"a": false, "c": "*BbL,V^%dNy0W$Og)1MTP*c{qiw1tG=I>{D^0~{k=Dwcv$GYNwXj(73JT|Qi#(ZfUgvdv_O7zD!LoJIX)7m(WzEQU^ztUh)^Y=oXR:^HJ", "s": "69cb7755106d40fb867e4016e5d9e4a1", "oc": "3bcba11b181f2a1f812dbc56291f2170b7d8f373c620c44542ba674915998338ce2dfa4a2de0ab4321371d077b6a547f7935796c399edafb"}, {"a": false, "c": "GmiG@V=%d;?0W$;2GazJP*cmq!@&r|S5OT&]~f.;_rFg}jUT?wQ2xFT?MI1:b$X{qdvS&)IM{glYV)jR-G(.Wav*S9aKGAhNSrAjG?iC`)BfCB41$EjS!A<1h!E%%1IS$baE}thw_uuhZ|I5|.oky(pK<", "s": "3a9a5d5c51a69d60c222851f5e8ad821", "hm": "6ab7536376d1bd802f15161a90c28b3c"}, {"a": false, "c": "mBbLJV^%dE?&X$|g)1-JP8cmq8w${csI>ZD!0s{k=Kw}v$Ge=wXj9lyJ#%Qi#2^fUg]1o_OSz_!=oJR9)7m(VzEQU^}twh?^*|oIRR^HJ", "s": "11bb33037a087bcf135a6bbba3c71aeb", "oc": "7b17a11ac28f2a395fbbbce547bf4b3b08d80ab9f67ec445a5ba0bf2f791b0168badae4db7a4a07ac58768091b2c54f652327eccaddedaab"}, {"a": false, "c": "mBbLrV^%dN?0W$;g)1-J62cmqwJF4+:K>b|qow{XNXP2XSf9UacD`6T?eM|~uQ5xRs!82|E5#lwf`r5r@k|YWXaB;H#M~c2ePN([FM83;San&ETj!b5zy", "s": "2af599783671e2215b142dd10f41ca88", "oc": "2c6a1ca903334214a78dd32952e31719e59e8b208919f094d7b0b889d0b754d4eea41613c09a403b87fe1206129ff240ad58bf74f731b5a3a4ec5ad3523feae5"}, {"a": false, "c": "m^bL@V^ldh:0W*;5)1-JP*cmq6X0HM3o?jM6%>5-v7zt}R}nZZ8HdK=XLlPm@4+$YpqEWk$^nhnq|L3yhb@WgNEiP94m2u;5Y>8j&nB7f>vGija|Xx3#Mnn3~xC&!]29|FsTDs9$V8nRsKN&rD;2A*nEe)SI7tWX7;5Mby<_1V7JAQ#jPCfmE5R8d.-4U_}-]Qgnq2A0,RA???>lf<}xAE3Y", "s": "6493d6416c58845d55357b69972ec645", "hm": "8417daf4a8485b3cc6256a3db9aedda6"}, {"a": false, "c": "MBfKA;@U_|}h7}C|5XUe=LqH48zV_I^PE9]$~U^B6>*L3u3UaiidiIG;f6-J#2^>OgC8U@@KWUzQ4UoFCfHy-HN30FsP%yfAd|su^dF$i", "s": "d87292a02b7796fa117fa816ee0fe432", "oc": "fbeaa111588ffa321553ac06791a769bb755f3c976aec435ad9b6097159a8761816df142b0b5e32745366d327e275576ad398e5ba642dbca"}, {"a": false, "c": "m>bKA;2~_|&O7[7#WXU&SnqH4LeI%yIq+GZC%se@cL`I#VB`M@gZm5M);+)a?fO|{[IKN|aPs2dC}k9Rgdf8JWw6$@&w2B2${f7ODLd;)=)REU^Q#4iCjmE5=8d|-4qZo6LQgnq2p0{Vh??{>lfCr^AE3Y", "s": "3a9a1d7a03119ef0a92e811b54103241", "hm": "5aa7fdbe78d2b77f82d5160adffddbe7"}, {"a": false, "c": "mZbKA;2~_|&-787#^XUy=nqH48{V_I%FE9YnT(!Bhb*L$Z3UaiidiZG8f6-J#2^>OgC^U%oK#UzQ4U>}XL_I-Ybh0ssP%yfAd|iH^dF$W", "s": "09a0a701789f112d955b6bbba4e7ac26", "oc": "fbf7a17b089f20e315ceac0fa91f218bbfd3f3adc65e1cadac4a6783bf9982e26ccde18ab9b4ab5fc503cd727a2454564625ce6cd39e27ca"}, {"a": false, "c": "m%&KA;!~_d&A787yWXU&D^ITE8gX_S`5(j<7sibo+qv}pQBGAI^~d8QPdI7@mf5K@fQ~d!}4Y`Souh", "s": "f7f19a59e2d5e1073ea4d7d3053acf50", "oc": "fc6a919823a342503336da32cc3933010ee54864cdb3d1d4888e3f6d2431825e76b1eada355291835de4ce80062d504e2b8d06efc101cad4c5a4b6341162f832"}, {"a": false, "c": "mBHKAJ2~_|&hP87#WXU&=nqH46W8QN$J3a=|Jqz}_oonI^(|$L#2^>kgC^EzoK#Uk)4U>VDL_z-Y6h0sYx%yfAdOGH^dF$<", "s": "37ba00474de81749de70b79f6b13b57e", "oc": "f3889c651dbf4e13b9efd76f55b274c5ecac9c4d63e6c1d40faf33fe3bfe1cf625b71f3054bd965a44fd69833fb7c347720a5eeab24d31180fd1124031af4069"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (473, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb3&V+<+WNnWTgaHe#Y!CMH#-UjB0Tz_S24%3~W#b#K}wBJ@cLZ(S=Ce|x{!!AtGEIo57C-8?JA^rn?7A$Zx(u>=_voXSei@$IXie|LAX}xl|H=gBIMa8~H!Sg?J3-sUN*fEcs~!stMb^`ucN8!", "s": "94dff92e0f67c55dca745fd87769c74e", "hm": "eb677b64f8e5a3f4c2056d8da04edf1b"}, {"a": false, "c": "mBbJ&V+<+zNnWTGiHg#IhC5H#8-dm23SayoGQIzTb|n<6bUo7vS5`z>wUc.`#2}On>Eq~PZbd^Nu{SL7X*)eN#Y!JpbT_uu4UfmrWp|*!", "s": "c92257bd2b7d300ec4035811e97fefe5", "oc": "6bcba11fe74f65341503ba16a11f8f5fb76bf3a5c6ae84525512de9e129f87698e3d16bac9b3ab45c5f66d02740a85568c35ce6cfe9e836b"}, {"a": false, "c": "mBbn&V+<+WP@WqGaHg#Y1C>{#LiP632JZCZZ(!u,ies>YM&vu}2{yVCm1&9YnMJisIv8&oLG#zt}(?87Rg)Q=,qYuX4r&>J<<09@__0DybRUxdAU}TedH9g!5Ma8Cf!SgKJ3_%UN*`Icw~!ItkHaqGQIETvan<6PUo7QSi`0>1UcJ`#2{s8(Eq~PZP7^7_{SL7I*)sN#z!JpxT_|14UxrrWpm*{", "s": "f3a937817a1fc13b0b7bdeabc34faa2c", "oc": "fbc7a117c806b0f2c5037c16ac8e285b86f5e3efe6d8c51305c3b79345ba89ee8eadb38cb9b3cbd2c5e5690d7c2a5991b635ce6cad9ecbd9"}, {"a": false, "c": "mBbJHVMF+WNn{QGaHUGY!CMe#P}G=qDEGr@$OI,8zdE<#5-qoI]3sdWf$6+dkZbJ&V+<+WNnWTGaH1#Y!CMH#6tnlsYvyB3r-|ccvn{42hR9eIi2{On(Ecy$ZPRfGu{gg7X*)sNV9!JpxT}|u4UfmrWp|*!", "s": "3de6084f4d7823446e76d6196541b446", "oc": "2c95fc65e3b34fa3ac51d77ffbced4a2368c51e9767566433cbc444190f91aad0ad44b4e2691c80386aabeda2b0626d604f87021570e71a08d942a1ac3b804b5"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (474, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "PBbM9-at>ZRM|z;Cw=|sXtITC%@3u9$EKb+W)de{2&:4.7=>FoXl}b%ApcgZ]nWmCNxJs3>lt#*(|HBqyw:*id#P^ygNqTXh#329xtY*3p+DW?wLQJT`5Bui82gQNYmp4aeSYLGz|Z#KRPJDqY(H-@6.=+OF_C*B8QA|bmd=&$^.w;c1>9ahy>S2ApcUZX1WmC;;JY36lt6C(|HgaNP&-eW1V", "s": "9a96d8b5ea369d2fa92b81e999bfe2d1", "hm": "daef5d7de4de178f8685361ad5f5dfc7"}, {"a": false, "c": "mBbM9-xwLP6aW?ot0VYij>j!.(d5XNQBn>H3R?UaEq$QC", "s": "48bd3701d81c660f755b6b4f7380368b", "oc": "fb17a11f988f5a3fc553b286fb1e24071ae8cce9c7aec4b5a5da6997f5998961aefde6400de3ab358d46690bcbba597626755e427ac541f7"}, {"a": false, "c": "mBbM9c?HCr_dx$NZI=pL3YEjnjDd(dhXNQ4n|H3Rn2c2`{OQnrra?HjWcf`YbJ>Ki4RJ*8{OEJ>qL+Iqd_9s0[P<&V}6sM!|#J#-TLDz=hiYJq>I4Xqd!|=uONk{r0It_.qNo*ciB%9eX", "s": "d9a497b5263bd0fe86fca8d2ed0aeba7", "oc": "40c7a211d61fba32a50d9c026c1f7e7214d883cec1a5c445fd7a6db3159964696afdf843ba9baa47c536bd127b22b416a6e5c1d3a5c74ab9"}, {"a": false, "c": "TBbsZA#9c2`{Osurra?HS)cv`LjQ)X+b_~Llv&xw<)hiIe5|*>H[10kg(cOVD>`NAbBrE07YBC:SR?Y^b}:7_!tjaq8%1r4K6AOU>8[KT5L`>MWMrE)*)pSP8#-yaw!G3&4h>q!|#2`iTLDz=V[YJq>Iu;qd!Z=+nwD*riIt96vVWMmVpuh", "s": "5ab89875a674ed708624943635eac3c8", "oc": "fc3c9c6533bfad1903011e1d5f5a45f282a079ce87035dcee6acf658262dd9de95f39406ce9eb7d0dcfefd00d87daa5406e11f93da8c4f7da236a8f0a12dcf82"}, {"a": false, "c": "mBbJjAX9cH`{qsnrra?Hj.cv`6IBft*>7MH2qpVZbg%~ly>4v[#2`-TruzshvYJ@>I4nqXfZ=+:lDGrQItOK{&!gcxB%ueX", "s": "edba304f4d7423446e0c17196b8db364", "oc": "fc619c5793404da3dbe1f7cfe71ce8e84518b68f2d77b88e25704de9ea246af87ab7e42a1876a5fb5c4c286d37db9f3bdddf7dcb5afb3c143495f60288cd8614"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (476, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "m{bKU&XxH(TUi~T2sQBySN`OjoiQuI`tLc)Kn*FR#{5D2EMKWVbII;1W;xa)-2>Tj~h5P;@y+wB)=8ks-p#2_XJ78rzl4La~26xKI)iB_j`TP8bA9_IfG&=n39Tjo=+P;Rg+w6)=2kPzp%2YXku8rKl4Aa~VLxN.)iBVHpuh", "s": "256ff9743214e2e3dbe42dd80eeac427", "oc": "fcda2c15a3b4421ba3921c1c9cc932ad594cff503d973031ba9287bb9800e327ddac134bbf7563bd4ecd2bdf6c9d3bec9bba330fcb1b6def9d947b0159015978"}, {"a": false, "c": "m?bKO&X2NE5qi~b2W-a1MR;&G^Bjn?&%#p#2_kku8r?l4LV~V6xNIdiB}+}7.qnq&IQ4b}J_|+S`w@y=Z+kWXfc]GE`-+G@BMoZ(xMIUk!B)&c%KqJ9^_QhgzjS2Nd3!Vskzc>5wed?&hAj_oCH1Yl@#rQ*h7u^_7OfMboElmzGIA5NP!2kG~ru7z", "s": "f9c3d605df708455520c9b6977f4a74a", "hm": "80f7db58ac18a332c3756a949070df06"}, {"a": false, "c": "mQ)|48Nd+DPT`={zO||OAxQ=}bGyh9ANAX*$xWH-pHFGi-2H~Wn=g%Y:iH{C*(IKhBGhnc=AZ_oSHcY^@#CQ*h2u^+7!f|ho5lmzGIe5_bS23G|zl7z", "s": "3a906d2bf336c6dfa9ae2b1b5493d2d1", "hm": "d6b74ae6c6ffb77f8679461992c83b97"}, {"a": false, "c": "I(eLWwPx0`a~4hosCD#SKO+DV8KcoLYX96OZ->00IgxhDI`VVLa}NV$@", "s": "fbb035e1c86861de95db6f1bcf37baab", "oc": "13c7a11d580f239e1d6397b6fa1fa40b66dfa059c6a8c49c79766c631709f96ccfad3dfab1adab6745076d93cb272666f6157d6cad7ba219"}, {"a": false, "c": "ZBbLWIPx0`a~GhoFvDfSK|+DVgKe8R*Ca`A0SXUJcf}qRB^oMR^Vepr$X@&%SU(sL2abQ9w9{}hZ8S9sOu%YpxutVMP=AA?HO8k]O}5_Tq?_}=vMY4wpz^", "s": "fd45e672067497e01a242db400ea6ac8", "oc": "f06ac5e5f5ba3c19a4918e13526d1112b6cf79240e60b857df3c1d70b10bb65df3e97ff3be6a0dd83abbb927a81ad35ef2b9c483ee4cbe84470ccec13eb5c568"}, {"a": false, "c": "m-bLDgPx0`{~GhoFLD#QK|+DF6UNb%wm1|og6v6VX)SKcucTqS#2{_l=H++_w,c_3hg?s9cC>(jNG(}cGFHK2yT7Z3n|>$@", "s": "238a00ae0d7832746ed7bb1edea0b964", "oc": "cc669c47aab542a9bb78cdef03c6b5aae8d9088202a3872108e91865ecbc931738a4210b0893196368c3e7229c5d4ab1f1516d9a4ab6f5941590c6d0c333a11b"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (478, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mRbLU1U%;)#9q|6n43(&BvDK&Y9^G7d5DALM-Utm`vJFD-rp?|!bdtbJ_38gM>L4JxCAzZqg;V~zXjHroL>@%Qg;wo1{h*=f!XvDG4eB#BPE#0BfUgx;>_}[aLxOip|Tm3t350k{-Vz)R1@Hj+J2trF5bb%p4&8>ofMQ%``Ez*x8EeKQ=~XnkT$5-;3$VB8_*^me(91m>!87", "s": "7493d6012067f44d97241b6977b9c71a", "hm": "8067d848c688ae82d3279a3dbe84db13"}, {"a": false, "c": "-BbLU>K41)W9qH$44G9&;vTK}8(5=e9mT5yi0)XL?jyheX-WGsH8&wwu#UyG#2}p8sIC-1kJnGMEK{oGm??^5eW@zFI8of(F(uk!{p+B>", "s": "d30c2035f77df6be567a68c6ed0fd3dc", "oc": "fbfbac1fc81c28d21597bcc6a51f4c8b05d2f8a904cd0447a1ba6e93f599891d89f4069a54b2a545f5e6ecbc7bea3476c03bdeacae72aee5"}, {"a": false, "c": "mlbLU1c41)Wdq||44h(&ivVK{LSk>A!p2L`Fi*x*IAxKeW1cNPvS^Ie%9`O-dc<1(Z<{tm3E%w*bvCrnGw`XI@9fU$%6M)mPGSz1y^KAftQ%t%tC{fi9i_QK~=aeT$Y3:E$Vz8_*^.eEYEm>!8P", "s": "3a3aa87bd1369d00a924a5eb5496d2b1", "hm": "6db7c45e78d2b70f624512fad8edbca7"}, {"a": false, "c": "mBb|UOc4f)M92|6{4<(l;U|K{8<_X=9m5oOZ4)XL??OgeX-DGqz8&:wgveOGF2}v8sId-1kjw03E^{UGm5?^5*Wizv(=xf(9(;D`{p+B>", "s": "f4b9368d7d186baf95ab19bba3d2aa2b", "oc": "4bc7a11fe8da292d9283bc06b921240bb7b74639c61f668ba58d6710359d693b8ead766fb9b39b2d153b6a02f3622476f93ac7b5aeb7a9e2"}, {"a": false, "c": "1BbLUkb41)v9a|6T4h(n;8&K{B`tAY7D@(~ohSCA;kVRnV+e)h-P4U|wy1vh`xn(@YHHJ|70^}ypVBZb6hK#IF|Qjjq(POCH{rL`kDy=Y&?>*yf!_I=puh", "s": "f62ce875a214efec9bb4ddd86de71ac0", "oc": "f49a9c6533130f1ca3318d1c9d4ae7a213035e3e9e3134790be789c600a5f247fa98c07f424b718d567af9bc7f32c79b36ce633fff1f5b1f8b308a4b37bb7509"}, {"a": false, "c": "mBbLU124m)W9|{64Vt[&", "s": "987a004f4d7b27a46a7c67146281b7a4", "oc": "fc0a9065333b41a9bbe1dc3843514d875de55995161111a1bb9d2db6afa936bbd2c8fb41fd9acf01fb922def1def97d274e490f0bc787353d64a076f3340d165"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (479, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbi%Ks*]eKDAUerpI~kCT|AcY.9b4|8fb~.D>=&z-{DFHgH0-VESUh1:X`JD2W}wLQT,TcbJNJ)j~(VZ-$vUVZ$|QL7P.F6bW_Imq>t*LGuP2iiJQ>>wrXQ9$g9P+1=e{m7`?TKRlde?aDWk[L%6dKyP1GIp^U8hiqNdArOMF>P%C%>+6e#o~}(lgsE6tSYr4uAoA]&_@KZ", "s": "9c95d1070f58945d2c187b49f6298740", "hm": "b9722744eef1af72cd05853d0e4edfca"}, {"a": false, "c": "!=bK%ts*MzfDphsr>I~_%TZA{8${9hO%q$=rmamc+n39d89A;-g7l&AhEbXG*``[hz#$NVuhKDA)sR>e~keTcA3LZQ-;LE?l0=C-c5(kD|~K4-D4tHuIsf848pnu=[D(.;rMOZ45TdK%!5aF!;`E6PsC%>Rm<|o~0(46se6t_lr4zupAQ&_@KZ", "s": "44995d23dec69d0fb32382635421cc18", "hm": "3ac8bd4cc8b2e7d9d67126f6d8f7db77"}, {"a": false, "c": "mBbm%KUoMeKDAA^r>I~9eT5Ac8$p9[Oaq$ur[jmN+n39D8sN;-u7l&A-B}Z+B20Ehz#$NVuI~keTZAAe~fIP%`,QOtbFX5S{,qqR3R3t8JAp$hPLz2z0m$&U-?=HAPOs`lPN=e5m4gpOjEYjT|X;6r6xN>OTrl_zodR~615^rp7h", "s": "f666998103ae92e02b2422e055eac1cf", "oc": "5d2abcd07ab04219730bd82ac2727f26102c29d4b320e19149bdea7a9037e6d922fe99fb93be0330d6e70b6333a92749367cd7e167e73d62c8ebae51d01a8535"}, {"a": false, "c": "mBbKCK<*MeKDAAz?>I~ke1{AL6Gz~_y2FC1y%G`Y[54BaG;cYK#2aEhz#[N<<=IX%R6>Td|{dL>lU#(%BR$W0&)fAe%a;NiIhDGH2X-kHX^>kGsFKbMeb;KZ9zM1<DvJOzy", "s": "7b917601dfd9c44bb214936bc7294745", "hm": "886993217248fb33c3096c3fbe43df1e"}, {"a": false, "c": "mB~K(p)r|xQ5SXm>XV}ri}#hi96c=Ug9XV?28@7-%.#B+;^@<3WFMjj2]<8qFfo}cXM`<{G:(;RF=buK!+;f>!$J%)y", "s": "697b94ba877d34de8a72a81ee60f54a7", "oc": "5bcb911f276fdb32152edc06b98f24bb7708e389c6ccc08aa1ba679c15998e798e8df644e9b0bbc545366d227c2a5476b675ce68add6da17e301d24947aabff5"}, {"a": false, "c": "mGbH(pyr;=Q8%XmOIVmOi}IhuLJ:=wKii^7n15TUrT9Gf9W?-@IChj4E?QZTtZG`BA3R3-Gz2m8T$`6b9{7DB2co6A!JgD}I*_|{Lp1{-tz#Bnb^6D8WFGjn2E>8Cvf>FcY21bKpn%zH", "s": "f3b9948473387c12905b65bbf337afdf", "oc": "f1679adbca14ea5705535cbfaa1a0622b7d28339b6a30419a10d67931599546afea4f64a0b0aac46c28664067b21a47aa5c1cb5ca20ed26be331de5f87a1bfa9"}, {"a": false, "c": "mBbK(py?|AQAC!wO+VmO>}I`uBte;+~w0vpx2L-0I##N^GXA#2aW-rm$m=lrV1prcq_rXbM1<kj2o>V07#jmcM](`g+(YM1<`v^$Z+S(zr7Yd&`RHG{(tRF,b}K!+;7>yo~%zy", "s": "3eba00af4df825446e6cb71f6682bf44", "oc": "9cb5916ab5b331a3bb31d83e498de4349b0130afeab9dc4f24b4fefd83eb9bcb65f010a9bcde20b296b0d04435d8dad0b707a7f86d0dc5d00b74717e1a5044f3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (481, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbL@V}}dN?0W$zdu1-J&*c`qX%JhW0ZKZ^G?lhn$CcXJH|W!V4=irNa?B{Of@`tKq(ZX(7T(7`HWkR;e@0$g4*nl`x7K|uYRgW#{Z_V?F-Zir~Io9CWUg#nt!>m2N-I_cQ7ljFiM641$Ejf!A31h`E%%6I5$yIE}thw$uueU|IEwG+K8Jxuh", "s": "30fe83ec0f68d40c071491792cf93748", "hm": "40262b44a848053fcc556a34bf4dde46"}, {"a": false, "c": "{B(T@V^%dN?sWm;S)1-Jh*]mq8w(tsgIM{C^%s}k=vw|v$ZK=vXQ973Jc}Qi#|JfUgv1o7OaO[F[HGISf7U(-=EQY^ztUh?^c=o?RR^HJ", "s": "f9b0982c267930df86b3781cbd0f4487", "oc": "f9c8aa1f881d2a3215eaac0ca92f94b617c59989c5be9445c56a66936e138269877df64170b34b108756dd01712a9416a68ace6cad90d11b"}, {"a": false, "c": "mBbL@i^%dR?CW$;g6o-JP*cmqK@;r(K5qBg!~a=;tFFg_#bT?wQ2guT?MD1vb${{qd1J1)IY{fqYVEpR-w.OWau119a{e^0s{OpHwZvKGK_wXjo7.Jy%Qi#9^fUgvMo2Oaz,!3]|p>)4F=,zoQU^zt(h?^@=oIRR^F4", "s": "ff19378cc87869a4979b1eb1c3c6a222", "oc": "fb78310c98fa26a23d93b1055bb3c40bb7d8f3a3c600c447abb76793359e39699eadf64ab973ab42b83662025d2a1ee61d37c36aadd2ac1b"}, {"a": false, "c": "mBb;@V^%dN?0W$;g)1-J)*ceqBnr4p`=>.|qQX{u||w2XSz9UVcD`;9WsM|pwP5,R^NI7|E(slSfzru=@k|7WJU-JP*Nmq6X0.B3o?jM)H&5-vHzt=jGFBOf>vGTA$|ix3CM[n>~9L[!m2A|Qa^D7=$aIn{5Z;&_D;;AYm5e)Sr@tPz{8r76Ae_1V+JAQ#4in9mE5R4dw-4q@}xLro>B2A0{{^??Z9If}(xAEJY", "s": "94f346070fe9d40a32f496699429f945", "hm": "8e83d4b1a548ab078e055bfbd349b050"}, {"a": false, "c": "(Bw}A;&~_|&v7871WXU&=nqH4JzV_I^F=9u$Tx^dh>hO$S3Uaii(iI18f,-J#2|gWgOeUuoK#lz-4U>FeL_z-Y6h0s#P%yQxj|iHBCFiW", "s": "d91b98b2207de4fc697c9816e30fe4a7", "oc": "cbb7f117c2202ec26c221c0a197f74bbb7a87ca576fe83e5c53a50c31c93893483ad3948cbc3a425931163724b2ff476d537a4a8d090d87a"}, {"a": false, "c": "mubsA;2~_|&hb84cW`U&*nq,sLKI%yI#+SZ>%7r@cMkI#>B`Y@g%m&?_;qL~{h|Y{y-KuvaPs2dC}?9tAdf4J:wzL@OOT~2$`3WO5Ld;)=aR;Kvj#4i.f|E5R8|t7NqZMxRagnq2_0{V^|?Z>l[CrxAE37", "s": "c2ba1d550b369200392275ab5293d5bf", "hm": "6ab75d1d081eb37f8275f6ef54fbb627"}, {"a": false, "c": "m(b*A;ZQ_|&u=8{VWNUJ=1qH4|6V_I#FEtV$Tx^BhPVL$;SUXiidiSG8f6-JP2^>Oge2U%NKdUzj4t>_ej_z-Y6+0slP~yfAd|iH^dFIW", "s": "b019fe8b774862ab5a558bbbc4378a20", "oc": "5b38a41949165a391553ac56a06f240bbd9bf30ac6ae864565ba67931a9cbb212badf64430790f0cc8f66d52940d7733a61ac2b7a29e6baa"}, {"a": false, "c": "mBXF6;2~a|Hh787qW,r5=n9HdCF`Iqf|7`}_I4N!sImp|Px:%)I3f1&Lo)l>D^iTElcX_T`5wj}7sL7o+q9}=:);=;T~U8Q}dx7@mf5K7.eed!z}Y`SpFh", "s": "8e7159653651eee08b648ed805eac308", "oc": "9d669c658573f999ab019b5c9ce533900e77ca6bbdd391d4e8a7afe4648dd8cf7fd1e1beb721718c8de23e72e5e81ed7b8c925885d0f2fedb5f41e3281efd2e8"}, {"a": false, "c": "mBbKAx2~_|&h7+7#WXU&=nqHJ-KPW9$J3a=,Jqzp_kinIG(B8L#2dZOg8EU%oK#UzQms=Fe$_z-Y6j0ss:IyfAX|iv^dF,E", "s": "3db2184f4d7123446e7cb7b3212abf44", "oc": "f7653cbb33b800835b5e20e1f1f3385b044c9b4da142c6513faba6fe7bbe9cf22c171f50f47bf6576420234dd63d03d77989507a484d6418c892126ecbef02ae"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (483, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBb-&V+<+EN!W)y6H;#Y!CMH#lUj70ez_+24U3#W#b#!ww1<@cS7(S0Ce|x6!!At-!mo5|C-8ZJATwnx7j$@`(Z*=$?2X*hHw<5|UV#wP0`;!|{mJ6}@3knC>+fn%@}AVv1hb<*1|KM$^+b+eU>niG>|c$IXV<&LAXfTz|H9ZB(ML8~H!$gK-3=sUN*`&ss~!stkb^quc`8!", "s": "979fd6f10f0fac5352174b697789c741", "hm": "a687db4be868ab12c3458aa8b34fd986"}, {"a": false, "c": "mPbJ&VQ<+W{4uTGgVk}+!C:H#8FdMA3$ayoGQezT%|n%6^UvmQS$`u>SL7C*[sN#Y!LpxT_cA4Ufm$Mp|*v", "s": "290b0fb5205d10f1867ca4acea0f43a7", "oc": "f061ac6fe16f2332e554bc0cc91eaa8c1e45f3a9cbaecf4525eb71932f99d9698ec2f61abab42345c73f940c7b2584a6b63cce1ca29e06c9"}, {"a": false, "c": "mBjbL2+<+NRnWTGPIE#Y!yxH#LT)6dKJoLhHs|CbiAstYT&bN}{!*V$mf<9YnD6TTN^(-S7]C)8j7q6uX4qv}8H^quccR!", "s": "ea9a5e56c5309607a42efd1b5d90d261", "hm": "a3bc5cbd74d2b77f868c165ddf8d2be7"}, {"a": false, "c": "f>bj&V+<+WNSW,GaHg#L!CWHsg-{Jz31ayoGQI&Tv|nXY^Uo4QSc`L>9UcJ>#2|On(EWp|]X", "s": "83bf3c81a8145179366364b0cc37d3e5", "oc": "d7b5a21c980f57321550bb0baa90247bb6d8a319f9aac445a5ca8093d4e687dececdd24a92b3ac45f736cde0561a5f1636b8cede6d90a0ce"}, {"a": false, "c": "mB1lhV+<+WNX*TGzog#Y!CMH#B}MUqDE@I9$OIF8zdRu#08N(O+{=cWfG6>dG0*v2bC2Zw4_QQ;TdtyT!rE=H3LqkFEb(b>LEFVjAgdAo9L(uR$txOWpuh", "s": "46ef1cb53678e6eddb2b2ad88529cc62", "oc": "fcfad0a5e3bbc519a200dc3a727a97fe466ca241f6d3f923863aa7c7631c1d543005c1f97ff4b231bfa8ce45c8803b6adf8086bf392dc0240a2c912ee80071f8"}, {"a": false, "c": "M-bW&P+e-WNn{TGUHg##W,MH#iTnL-YvyB3r-8tNln{T2hv3EI*2.OnC}<]u9vgKb~~))q42.14sM=BFoXlMb%AUcgCX<}^CNxJ>3Bl`#*||HBayw2*ed<80AgNWT02#327xtY23YbDW?ot0VYEW@jDr(d5XNz8n$HmR?+aEE7QC", "s": "13eb9eb4fe7d3cf4867cafb5ed0f3648", "oc": "d7a7a11dc8fa2b8a155d4c0609cf2f46b718e33e06aec4455ff9d59365495d618aad364a59abab457a366d0a744a54765635ce2ca19901f8"}, {"a": false, "c": "mBbM9-awLU6oA?+zA?~|arnwpLH=?#G&1*3>w[QJTS5quj8n|QNY+v4zeSY_GziuBKVE(>$YGm-@(u=MOF_wtB8dAXboP$&$^uB~cN>9aoy)SsgpcgZ{wW&CNxJ>3BhtA*g|HBay[2*id#80AgNq40h#327xCYT3p8DW:ot9VYEjNMDr(d5SNQ4nEH3*?^aE=$P;", "s": "932c37910818110f9e5b8b9bca397a2b", "oc": "fbd3ad36881f293265c3b305a910220bf798f3a9c6b7c245a56a67f21599f8698e9df60aa9f4ab35c8666a025b2ab476b6c5cf6ccd614a98"}, {"a": false, "c": "m>bi9-awLU6a%Wzo_(qM>#vHqrKd^$NZImpL3K{4RJ*8LO2XQcLwIqd_9s0vN<&V}ujTb<)(AKb4+xp>u[nBY2>HwxSdOU}4^~ECwn`(-A}Nj{+j{1)rzTOjt101^d^h(Fa!pBD=029``h@8OPclsvt(bz6Ve*;2MLKV6XnhyWrEYzQ7J-nozAcDun9T?9{DC61}W?4gI4Xqd!l=Hd{Zkglkm`DYcnL3BrE07uwC93R?ZT_}77_!t&aLY%1r4KkAO}pGD?W5L`OMAWdE)SM{J-nozAc6un97I9)HC61}BC4g$Z=rnF$;o1nk", "s": "e4939d650f365d3f5d2e851b0e205ed1", "hm": "6a07c3ed74d58a7c89d5161ab8630be7"}, {"a": false, "c": "mYbQZA|}#P`{Os^rra+@j)cw7CtlW{XKu)p?C8#MypwGW3&4haF-|#v`OTNDz=hva?qYI4Xqd;Z=+0ND{rQI{v{A&!;ciB%7eX", "s": "b32a668bcb94610fc55b6b532337aa4c", "oc": "83cd761f581aea351557b6048e1f240b6bd877a9c6aec745a2ba6786449e8669de926643bcb6ab1ce536bdd1b02a5417a635146cb2ef41f9"}, {"a": false, "c": "mBbJZA|9}D`{&%n|raiHI%iWveshO*CCfOY;nXOPU%6{hTzHAP^~yBg3CaL&qouxy{tM80>9UvFWMd~ruh", "s": "bc3f997a3674e0e8db2dcdd860e06a18", "oc": "7f804c553fb342399d0a8e1d53b140a22eb87fcef003a2cfe6a63f688b1d886685a3d4d0c55db729dbbeed4348f1aa8ebd4036d3ba30b11b62718d2ca1c28edb"}, {"a": false, "c": "mq5JZA|9^%`{tTnrra|HN)Uv`uLBDt#>7UH2q|VZ8g~)lyV4vB#2`FNB|6=hvVJq}I4Xq=!Z;+1ND{r)!Y~KAC[XciB%7|`", "s": "3db5a0064d7d23496880de9746e7b361", "oc": "9dba9c65f3a316a5bbd047e1097ba858f5cb468877478036b6f5fc3d3a2fa4c87786d19a1c56554b57a3991f64d39234dc837dfed5eebcdc3324f8050bfb8394"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (486, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "G*b2U&X2HDT}i~T2wd=c9!aL$MU)#Ln3=6jQ5;Now8IE?0opduX~HS]T2joiQuI`,Lc){G*~RajwP+>7ey+wp1=mkq|p,~_qkuFrK64aa~V6KEI)iB_+U&12j2TUi~T2`T;8b$&_I`6&=*O9;1BUe^)-g>TjwP+PS@y+w6>=8kCzp#2_3ku8rKl4La~V6W(k)iB_+pWC", "s": "fc6e93753660e2e027642d880d2acab8", "oc": "6c6a9c1ee9b94957a3078c136ca7d3f3198c4f8be450308e28d745dd488d9407ee6ca34bbb75eb88da4729919c3697cc9bbab5af0b9dddebcfff1d46d80a59ed"}, {"a": false, "c": "&kbKx&X8H{TUi~S2Dd8c9unC$6^RbUfoi-Ag$R;A;^ljW7^%nN#2_Xk>8=Ql]La|V%xNIygypO?kna8*PIQ43}9_j+X`w@5=PxMI63S?)?w%^q:i^_p~gfE$2NdU!8GMKf`Imed?&CAZ|cFIkT9DJ`&V6a}NbIeDkL$@", "s": "a70b17b540afd0fe81cca3e7eda654a2", "oc": "5bc6d51fc8b06e42b5598c56f91f590b4888f612c67ec41405bb6798189589691e9afa9af8b34496c536dd13459a547651753c6c6dfd65bb"}, {"a": false, "c": "s#|4~V1OD}>`={|O|:NAxQ=}y+yJ(ANnX*$e7c1pHFY2A2HP^E=gIYs2H{i*^7DhBM#nVHAZjpqHZ>Y@#[RIkThDI`VV6V}NV%vWmLo#2{_&wlb+Bw8nB}>g?v9g-kWQNG(=cGfHK21yQZ3n^>$@", "s": "f729315978186301c7746bbbc3381b2b", "oc": "ffc9a11f2b9b2a921553ace62a17d42bbc92b54fc68ef441a5ba609535b480698d55e64ab8b5ab4ac50265597b2a5486b6352f6cadcf72bb"}, {"a": false, "c": "{BbLqIPx0`l~G&o5vD&SK^+DVCfe8R5C3LA0&2>Oc^#qR8^WXRfse4r$X@D%XU(5.dk)Q9&@{EhZSJ@=O*)$b", "s": "3dba001ffd7b23c42e70b7ec06b55344", "oc": "fc6a9c6b33b541a33bc1e63408cc14aa2ddd05e0c5138718085b4e25e1540d12d86f110218c6df906e04520a712d4a3c9757ba71aab7434db51035d0f37351c3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (488, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBDLU1i41)W9<|5[Qh(&1vTK{Y9VG7d5D>JM-Utm^vJFD-Lp1L!nIMbJ_38g64L4JACIQZ9w;J~zXCHw&~G@%1g;jozs6g4>!Nm4V:e;%BPNh0EfUAx_>_IJTLdje%1:h3=350kkPqz)f1@HjxJ}#rFfb{_01`8>AfMY%%~tCk*VZ%8Q=~zN8TPR-rE$Vztq*^m)@YEmuh82", "s": "1493d6060fe3826de2bf9b693c290942", "hm": "82675b41cd48e6eb4d156232be6ede16"}, {"a": false, "c": "mBb$k1a41)H9q|644h(K%5|Ko8(5p]9mh5>24MXL??yceX-WGqH8&Dwu|UEG#2}E8sIU-1kJwBMEK{T;j%~^5*Wi!vh=xf(9(;k`{p1B>", "s": "d20b9733b07d207786cf4816340f94a7", "oc": "f0c7a166a81a7a32125dbcd643472a0a27d823a9c60bb443acba714d459389091dadf64bb95aa94fc5246d02764a4447a6a5c268de97ac86"}, {"a": false, "c": "mBbL11cwP)T9@|64|h(&;I|1{LTk1Gpe2c`Ki*@*EAxKGoEVnPv:NIeNw{2", "s": "177e548661a6960bdc2185735490f2b1", "hm": "63be5dbd7072b694867516a460f26f4f"}, {"a": false, "c": "m$bL5:}41)r9q|64th(&;vLK{c(5Xe9m`5OZ4)lL??yz9X-WG[H8&DwuvUE{#2}y8sIC-3*JwG;EK{UGm5?^5*WizvhSxf(9(Ik`{p+tjq(TOCHmKd&koG=Y&-3*$f!_V=puh", "s": "fa3f99793fe1e2711b722dd803ebda78", "oc": "906a9c5537df49a623098e1f3df5ac862c0351319175f4ac11edc995c087c406f0d9c0a3668a758d2c76ffbc7cc6c13e3e518433448f48bf26a559467586a209"}, {"a": false, "c": "mBbOU1c4`vWUq|M44h(&;}!K{6B?WiRGM;%<?^5c0Azv~|xf(9(;k`s)+)>", "s": "3db5007f5bacb544c67cb76da6e1b344", "oc": "fc659cf53cb141a3f212df2c495c890fcba7d518411ed7d8b5ed1214abdd2c7428c87543f1ad2c05f592994a14bae60d2239ccb73cae7b56eabcd965334001ae"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (489, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK%K0.MeKAAo^G>U<;eT)JcVM9b4|8fb~$D>=F@2L>FOgI0-1Evo(cyRAxA$7Yk}CY5o|7#,H<9l;e?+Iykk3%6dYy3qrg({!VAUq1dArOMF{P%y*>Rm%VFG0(GKs}6t_br4(|DAT&_bKZ", "s": "8493b4310f87140db9199b6f772df72a", "hm": "0467da24ad78ab39c375033dfe4af756"}, {"a": false, "c": "dBbKItk>TZAc|$9-%OPq$urm@lN+n39d8wA;-u,V&A-VbK>#2`a>I~ke=ZAcLZ~-p2EXl0=,-c58ks`~KuIq4tyX{hf84+pncokD(%z}M)Qn8Tdhv`5aVjbYiRm:|T|>(Ggse6t_Br4zuoA#!_@KZ", "s": "6a9aad5d01369d00a92e851b3490d865", "hm": "bab75d8d4dc2e17f9577c77a9864dbe7"}, {"a": false, "c": "mMbK%Ks*M}KDAAs|oI~>eTd&cN$p9%OTqIurm@`C+.[9d8WAg-uSl&8-B(ZG$2Dqh%#$X$uI~*9TZAcCGfIP%A;QOtEEXVSy#qN)3lx;8sAp`hPZa2z0m!r@O?=HAWOs`JEN|e5P4Dk)tE`%T|Xe6t6d3>4TrY05o,R>615`rp|}", "s": "f7101975367fd200db242dd806eac738", "oc": "054a9c65a3233213a300882a75727c2b136c28d3a3f027ef4fddea2e748798d9238f92bb97eea29fd4e7d5b6dcae2745016f375f577edd12484b22c15b3a5f55"}, {"a": false, "c": "mBb}tKscM}9DKAsGO;%5eTZAcLGz~)22Q81}~e`Y-!4@aG;cYt#2`Ehz#aBVu))D2#vuV5S(wnP?Z7qIZe|hqHX7`=eYf@e%>POWYV$;F&XykH8^>a{aF}h<}XKwKipyr$AQAC`mOIVmOiVIhuLJrjfk!TtTn15T2HK9Gf9WP-@uchz;E?QZTmZ``BS3^~-Gz@!VTBm6b3{?DBgvo}A!JgDcI}_|{%^1xX{ODpHPX>dlw)YTte;FKWkV9*6X=fXB?_pez!(2dzD(=mWnVIS", "s": "3796a3d6d19afd20a9e3851f549036d1", "hm": "b7dc9d6b47d2d572d6bb3ddcd28ddd85"}, {"a": false, "c": "m|KvJ%zy", "s": "f35a378e13f1115c955b6bbac0378adb", "oc": "fbc7ab1fc81f7afb1753bc06a99424a3b755c3a6b6acd44505aac359d1990969ded4f186bac3aba9cbe46d52742ae49b4685ce579d9ed61bc839db458e3a6f59"}, {"a": false, "c": "mBbKtpyG$AbACX!O{VmOi}OhuB2l;gOw(;^yBL-0IY#N&GX(#|aWCEO$8*Bk)0K=lmVnF2cf=rBYM1<[v^$m+`()r7vhCNo{}{(pFF=bBK!+;7>KvJ%zy", "s": "6a6699946594c70d3b036dc695e4c9c8", "oc": "fc9acc0531b39219aa0027db65bfa708663442c889fb241fb5b8352a11e79d15873a172c6b4dbebe6839d174f409bc8866b15d8ad99f22253ad1cd6b481990d8"}, {"a": false, "c": "r3bK=CytOAA1CXgOgHmO%}Ihu6ndjjFf8ZO7n4po>^0_=jmcM`uM!l(YM1rL?h5`o{ag(;RF?bI9.*=]rNn@5{EJKejgX(kaoG`H-ORpeL^$8O*NJ`xes6uY@hW#{2OV0--52rNIo9CWC{8Oy!Fg2d*f_cW7lDF(M641$Tj6!A<1Z!E%~r8C$YIER{hA=uuc5JIEwV.}}(puc", "s": "9493d602a4d7030d538a9c89672bc769", "hm": "8b677b40a8466b92cc056a31c30ed00e"}, {"a": false, "c": "mBbLtVW%d7?0W$;gq1-Ji*cmf|w1t?gI>{D^ms6k=KwSv$GI0w`j9%3,#%Qi#2^fU;v1o_VazD!=oJIS)7m(VzEQU^ztUh?^.=oI{D^0s{k=Kwcv$AK=wXQ9Ro?SQqi#2^fUdv1o_uaL|ql<{u$XP{XSo9PacD`69?sM|6wY5xR^!82|35sl=T`V5q@kr7W5aF;H#n0k2jl=O0Fd8DaS@n{TTa!75z*", "s": "ff65197536c4e2dfda262dd804eaeac8", "oc": "f67aec6583b3321ca3e0082619e3c86975638b21896e1af4d8c05882061753fe170fae73f896a30ec3dc425412f8fab4a058842d4831b659a0eb385b5932b9cb"}, {"a": false, "c": "mBbL@V^%dN?0W$;g:1-J|*c@q;oZE73{?jM)H&5->7ztUg+1o_XazD!=oJIS)7m(VzEQ9^ztU4?^j-BIR:^VJ", "s": "ed4a001f9d73234ee3dcb7bf6183b344", "oc": "9c6989b58c2056ea9810c834d80bc50a4cc0b9f975b55ab228bcf99eb4b61249d3e6c28c7e16810929f02d26559997bdec4c60e194018601935006f889af0e3d"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (492, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbKU;)s_|&K78{#WS]&=nqo4YPl!<%evR}|ZZ86d-=#LlH#D}+{wP3E*kdNnhnqc@36hQ@WgNE0P9jmUu05Y>=j&6B7A>vGiA}|X6nC8yn3>nCaxm2ntFsXD7ARV9|v5KN&ZD;2SYjHe(x~@tQX{85Cbm<_XG+XA6#uiCfoE5R8de-4t@}xLIgnq*40DV^??Zxlf>rxKe3_", "s": "749e41d102278a4da2145bc9d74957c5", "hm": "8ec7d244f845ab42c325caddba48df16"}, {"a": false, "c": "CN03AcL~_|&E7G7fWXU&=nqH48z>]I^FE3E$T4^-h~*LHZ|Ua|iC=D:8J6Wm#U^>lgC9,%oK#UzQ4U>F^L]z-Y6hYskr%yfAd|iH|dF$W", "s": "c94c9eb6207f30f62650631d5207e8a7", "oc": "fbc75115c81f23324530bbf609108405b7d8f3a9f62e1445d5da67931799891c83a3a6ebb9a8a94545f66c028a7ad4715635cebc9d9e4ac7"}, {"a": false, "c": "mBbKAm2~_+&h787JWXt&=nqH4LKI%yI#+SiL%br@-Mk^#QB`HHg[m&?_vXL0MhOY{yIK^|aG>2dC}n9ugdf8Jtw6L@OO2~2Z4f*O5Lr;)rLR3)AQ#_iCfmE-R1de{JqZqxLQgnq0-0{V}??.>-fCrxAE3T", "s": "3a9a4d3601369d91a32e801b54f02271", "hm": "63ba5fbdd8d2b77488518617d8fedae7"}, {"a": false, "c": "mBbKc;2W_V!h787#t3U&5ngUT8zVx*^Fq9E$T;:B9**L$Z3UaiisiIG8>6%JQ2^>>gB3U|DKqUzQ4Uz>eL_zpY6hissP}yfAd|>g^EF$W", "s": "fc46b7827818650f917b4bbbc3563583", "oc": "fb67b184d81f2a34dd5396065c1f24c2d7df83abc6aa3d458ebea1a3151980398dad10e44fb37b45c5360d02602abe16a865bc95121ed0c1"}, {"a": false, "c": "mRbK%;V~_>ah!g7FWL35l>D|FTEHMX_T`5(H}7siOgC^vMoK*UzQ4U>FeL_z-YEh=vsPVyfkdyiH^sF=*", "s": "4deaad409d499ffdbe79ba1f7581b340", "oc": "f56a9a65ebb84aacbb0ed6e7fb9b54177b13734dad97fc146dada60e73ee1cc29f874917fd68fe2c348af2413aada3d7758f587a4384381802d1e09058cf0262"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (493, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "B_Mm8H5!SgKJ3-sUX*`;cso!<$sH5tuTc=!", "s": "17d03c0fa7a078fd5212cb697729c730", "hm": "f0610a44a948aa325d026abd3e4eed82"}, {"a": false, "c": "mBbJ&V+<+>NIWTGaHg{Y!CMH#8-dM231a0oGQ2YTv|n#6^UI7QS{FzD1UcJ`92{:n(Tq~PZP7^[u{SL71*)jNc$!Jpxo_uurUf;rDp|*!", "s": "39009aad20cd3c4e9e7ca802ec69f8a0", "oc": "02c7a396c31f2af2155e6cc6bd1fe149b9cf9d69cd0ec445ed3563531599a49956ad36aa29b64b25d5416dfd7b5a5496a2372eeca693d5cb"}, {"a": false, "c": "m*-{&V+<+bNnWJC<090x_=Dyf!nA-o8-MM221ayoGQNzT<|;<6^UolQSR`;>QqLJ`!2{On(iq}&Z<7UGH{SL70SDsN#2!JpxT%uu4UfmrW||*!", "s": "e3393a817818b1b0915b6bbd0917aaeb", "oc": "e6b7a67de81f2a33651a8c86a954f23bc7d8f3a3ca5c8440a7726793159989698680f66ab1f3ab4cc8368d0278c71476a665df6caf9edbc9"}, {"a": false, "c": "m(CS&~HgbWNnWTGaHg#Y!CMH#B}MUqDER{i$OI58]dwu#08c>IkWkdW*9B)dKZFoXNMb%Apc2ZXzWmCEcJz3Bxt#*(|HBaa;Cw=8M4;v5mTYoq7@C-uCw>yw)*iy#8*AVNq)0?#327xt5*3pKDW?Q{CySEjn%Dl(d5XNQ4n-H3%?^aEq$YC", "s": "d98b9fbb20bd5bf5062ca817ed3fe6a7", "oc": "4867aef65e1f2432a555bc01a96d240bb706fa8cc74bc440a847c92315e9e9698da086497932ab4565b66a786b2a5496e845ca6c9d9941f8"}, {"a": false, "c": "m0bMl-awLU.1m?+zn?~|a;Cw=Lf=-#GT1A3>wLQJ7S5Bxj8R|QNY+p4aeV1RGzvwBKRP(b#{Gm-qWuM+OFn0tBJQA|bPB|&$<#B;c[a9aoy)SsApcgZL1AmCL}B>3BJt#4(jHBWy,fEid#80-gNqT0K7327xtY*3p+DWDo&0VYEOnZDr(dWcNG{;pHmR?^Uxq$QC", "s": "3319b68268e5a90f0d5bdbb82d3baa0a", "oc": "fbb3e11dc86d2ac21da3b602a91f2b0db7bfb0a9c5a0c425a52a6773d39986672e0ef247b9b3a643c539ad0071dae430a935ae6c4d9f78f9"}, {"a": false, "c": "mBb~9-KwLUxaE?B]r$d^$NZI=pL=Y*3p+~D?ot^VgEjnjDrXd5XNQ41pH3:~faEq$QC", "s": "cdba054f1d71231a6071d71ca641234f", "oc": "f66d99f533b849adb8e1d7bf077b44e5c78c09c9004c2a2e5a5415c5ed700b81c36ad4568b977f90fe78a8836233cc424f2c9d2ea9902be0f3e49094c5800f1c"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (495, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "vPbJZAr9c2`{OstrraC5j*cvxYFJ(Kt4Rc*8LO2XQeMDPqd(9s0vN<&V?uKTbO)5yK14+gVBxMa;Y+,|wxSdOUM4O~&Kwn>(-llTjV+2$1[rzTWjt<01@d^h(qa;pYD=0k9``h@8>PcTE[t(bzbVeqb;XRK36FWhpW:6o*M{J-nouAcDun97IK)D)61}WC4g$Z=r!!$ho1nk", "s": "9483dc0d0f3784ff5c1f9b9857b42581", "hm": "d9671bdba848ad22c305637dbfdedf16"}, {"a": false, "c": "|7bJ|A|9cv={OsnrraY:G)cv`BvJ0{X>}Sa0w%$h)phCy#My;w6W3l4r>M!|#2;-TLDz=hv.Ji>=hKBd!Z=+nND{rD^o~KA&!]ciB%7eX", "s": "d80f97ea2eeaca2a821c1b0ded0febc7", "oc": "fbcea18bc6037b90c5539306c77e2afbb7d8131cc6a9745ca5b0738315918069819df64a9db94c4fe5166d02bb6018a6a8d5ce4cf7f411d5"}, {"a": false, "c": "!B+JZAke^2`{Tskrra?Hj)cv`JjQ)X$p_~%Pv&x`JwO>Ie5|*>HcVMkgoL(W}ScnLbBrE0.|B]9SR?ZTg}%7_$_yaqZV1r4K6AOMp!DKTa6`OMAWrE)*%{a-=o!AcDunG7I9)eC61}WC4g$Z4j>U$ho11k", "s": "fa9abd9d01374dc0a97e8f1b548012ed", "hm": "6a945d2538c2b87e8345161fd5fedce2"}, {"a": false, "c": "aBbJZA|9}B`{Bsnrr?gHj)cv`Dvu{.X&}SuTw=J>lpVh8#My;K6W3z4F{Mh|t2`rTLDz=hvYUq>]!^}0!F=+}Nr({ttTugliIMijvcChO?#CWpY*n}PP7%D{hTy6vP,~y}gzCaLT`B$e4*tZ80>96vEWKxVpuh", "s": "fe649b7536ed0d30db2929d0b59aca68", "oc": "5c6a976f5fbe4216c30e4eab513c3c56a2ba99ef20072a2f0dae3668732d68d6f56395d625900b20cb3eea00728daa9eb640a0b3bc8c09d542348821a1228fd7"}, {"a": false, "c": "7UH2q)VZbg%~lyV4vB#_`FTLDzghvYJqsP5ASNTOfo~muI`lLc){(IF#}1W;<^)#g>xjwP+Pw@J+w!)=$kO&pY2fXk48QK.zza~V6gNI*igx+yN2B%|TeP6S", "s": "ae1b9bb5207190c0568c88164bdfe5a7", "oc": "ddc6c11c981f2a321523bc06191fc38bbf48f939c6ae5e46abbc67931599fd658e6cf64ab9b3cd45294a8dbd7d2453d5063bce6ca09a49ba"}, {"a": false, "c": "mBbKU&X2H2TUi~T2B!wP+P;@!+w6)=8koz;#2_X_u8XKP?L8~V6xKI)iB_+|P$Ylpk7XPyN2hp&T|R}S", "s": "9fc956360869710e9552bbb65496cf84", "oc": "4fc7a11f7e1f233237637c06ca1f3dfcb7d0f3a6f1a5c465a5aa1a93c8c98e9986adc341bc9bae4cf5376bb27c2a527ba695496c4f9fb2b9"}, {"a": false, "c": "mBbK?&L2HdTUi~T]5d8c9!nC!B?hW7O?bDNK7fgw^*yQ1(YP@gHy!jQ9CDzQ2%AD+[fcc{G=V)jCL_wmm`pJg@H`ZO[3]9aQenfJmX8W_L5fGCn3vA>puh", "s": "6a6f9975860442c0db232d9e05cdc2c8", "oc": "f62af86033ba5f19aa608e1c8e2ea2fd1921ffdbe16f0d31286da7dd9300460ad0b3c34baa746be12cb73bdb6c469b0c93d2b6cb06c666ebcb9b151b291fa978"}, {"a": false, "c": "HBb|U&j|H2Tki~T2!Od~*jT0qMHR_z(Xa`9<-CQ)L7h>)Vnz-Z&IQ4Cu9_BlP`w@y=Z}sIk8hD1`VVJ:}|E~9DmLu#2S_&wl++rw8nBfhgHv{g8W!QN)eFH_CHA2]T7Z3nx>$@", "s": "999b97b5257430fe883ea6965d49e4b9", "oc": "fbcbae4fc0162a323d735556a912240bb721f3d9c30ec8aac5ba27a31492c9de8aaff840b9b3e040c55c5d027b12447a1b35ce12c59f43bb"}, {"a": false, "c": "hBbLWIPx0&?sGhCFvZWvhy4DVLV%EEd!}1mw5-;>Qlt48G1ODwT`={zO||cGxQ=`b+LoEANAX7$QeWXpHFOi-2HP^n=gSY#iH{C*@7KhBMc0V6AZ_oq{cY^`#YQ*h>u^_7Of-hoi>[XGIn5Nt!|kU~!l_z", "s": "e69aed461186fdb08921853b7490d2d1", "hm": "7a475dbd3bd2b77f8675761bd1fd59e7"}, {"a": false, "c": "mBbLWIPAt`|EGMoFvD>$o|+DV8)c(l(X9{PZG>dL,kThDI`VVXB}NV%vDmPo#2{_&wl++_w!BB3hg?,9g&kWQNG(6cGCHr2^T|_3nx>$@", "s": "d9b0578e781801df942b6eb21d27aa2b", "oc": "f5cb45b0c81052921551dc59894c240be6d8f33fc6afc045a501be6315b98909817dff47b9b3604535f6dd327f7a0c7ac515cbaca3914261"}, {"a": false, "c": "mBb@W;4w<3h", "s": "4a3f99dc3674d2e0d6367dc805eaaac8", "oc": "fc6e1c656e1f42e5a356aed75d4ac18aa0f7a7f63e024865d0711a6b967bb32b0c29df7cbabc37dfda2b79a96817d587d09d2472e20ab5f4a70a42c61d0acee5"}, {"a": false, "c": "mBb7WIPi0`a~G$oG>V#Sf|+D{6UNbwEA1{o|ovsVsxV2cuB-qS02{_&w<&+_F8*B3hg?v9g-kWauC(]k7CDK2{T7sInx>Z@", "s": "3daa00a54d2934488e7c9cc66e81b344", "oc": "0e7a90154603c1c30e00d7ef08cc24aa2c830ae8c5ba892358e91ca5a1abad1db867710cf8caf84068c2c02b682d4af3fdb76795da06f5f4b510a5da0303a0b3"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (498, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mZbEU1cN1!Wwqf6449O&;v|K@Y9^3,d5DAJM-7zmgvJaDz),{|!bI1x#|3Dgu>h@JxCAzZq;cJ~zXtHw&~w@wQg;uZ^i6}=v!YvDVAAq%BPNh0)f#gx(>:I,TLdje%6Tm3t350kkX0z{R1kHIcJD#}Frb0Y0458>ifM+%tWtCT*iKV8Q=~zakT$5-;E~_z8I*izbh8xcB9(Vk`H7=B>", "s": "f91b97b9207269bed797a81cea0fb4a7", "oc": "f5d46119c8142a441553b6a9291f240b63ddf30926a367b5e5b46393d519b9698c4df6c6c4a3a344f5f68d027bb35a80a679ce9cae7eade7"}, {"a": false, "c": "mpELM{cH16W9,|644hnv;vZKweTS1A!h2L1pi*@*IAxKZWEpwPvSNWeN4`w-Nc<1;`<{tmZQlw*bvCYnzw<2Mo9fQ$h6YAm|ANzk1^dRfMQ%tStCz*iE%8Q=~za*T$,-;E$V.8_*^me1YVmZ!82", "s": "3a9a5d560166903bc9de851b4490d2dd", "hm": "d7a75e1d7b96ba7f067f162a18f0de6f"}, {"a": false, "c": "+qbLUCc4])W9k|64_hF&;)|K{8y5", "s": "0354376174786506975bbbb53735a92b", "oc": "f55c511fc82f2a3f1541270baf2fd404f1dd136926a7c345e5ba6d63b9c159590e2df64ae1b3cbe590569d0f7b2a5fc6a6b5c2fca98639e4"}, {"a": false, "c": "-BrL%1c*<#W9q|f4ShY&;#[K0B`tAY`k@4_e5fC5;rHRnt+Q)jHPVliV|1vhxx%5>3HIJ|V06?Np^+986hM#V=|>uJq(tOCHmKL#kDG=Y&?0*yf!_d=;uZ", "s": "831b89355494e220bfc42dd8e57a0aa8", "oc": "fc6a2c6e2e544249331180179d0ffd182e03053bd6b467a4b269399547a5f7fefc2318f675874c8ca370f07c7cc435963ebef33241bf581fcfc9cee6757b5509"}, {"a": false, "c": "mBbLU1c41)W9q|6448(&;>|K26BUWgcXM;%@X!gvR3|wfRor<>#2}S8sUyw1LJwGtEK{UGmO?^d*WiMPh8xf(9(PUH{)+E>", "s": "3db8a0464778234d6e6c071f63813344", "oc": "f66d93a503b161a115e1d43ca5a34902fdb727c849ae8169571ecdb6abed3acb629f7b48f19ddc50fb96273f13e537ad18927ff3f4aa47fa164bf9390300d169"}]}'::jsonb::eql_v2_encrypted); -INSERT INTO ste_vec_vast(id, e) VALUES (499, '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"a": false, "c": "mBbK%Ks&8eKD]A4<>>~keTZAcUM9~q|8fb~$D>=Feh{}&HgI0-uDSoh1vX`JDQW}w)Qvz})bJN2)s~oVon)ubVZ$cQLfPHKyaW_-Rq>t*?5SP2>iJQ>myr&Q!i78k+Csetm7#?HK9l2e4aI^kkO%6d@,ZqbJD^U8Aeq.d$rO5;]PA%%>Rmt|oy0(Gg]e6t_Yrw1uo^T&_@KZ", "s": "449376230f378e5de814830947d95705", "hm": "80604b444806af323b091f36b94ddf66"}, {"a": false, "c": "P%b3%K-*[eKD$c|Y>I~keHZAc8$p9%OAq$MimZ>N+|39e89i;-u7l`AuBRZG#2`Ehz#$NF-0h@dw(4CAAfBjrEGG_DDHEI{cb5z*|NZiz", "s": "890297bd2c7d1e9ef87c1817cd0f51e7", "oc": "ffc7a11f18192a8b1a5fbd0ba9bf24dbbf68f3a0c60ef425a824b73b139949386ea076a3ba157c48413d6d023b2a54733b35ce4cad7779ee"}, {"a": false, "c": "mBbK%Ks*MeKDAAsL>&ukeTZAc9Zs-pOE!l0=C-cXDk5fjKu%D4`H6*h9H4+p-SokM(}z`M>j)8TdKn!5}%!P+7AP%v%wRI~$$T-AcCGf[P%Q-ROtEFX-SyMmT)3]x~8sAp4hITk2z0c,rJO8=NAWOsxJPN:b5Q4DkO&EY%P|Be6rH?Hm;x[Y05oDR>k15-rCXG", "s": "b66fcc35967b72ebd2722dd974e4cdc5", "oc": "c3649c6633b3421ea30ff8d9d2602d2f24142cd4b0f0e17d05dda178008abed9c00c5c66cb9b035fde9c02b633a457b8b19d3250657e3d6282ebbec95a2e8455"}, {"a": false, "c": "mB|K4KF*[eIDAA`rA|~keTZAcCGz~g2BKC1k2>VS{n&eaG;cY}#2`@HmZ7?!TeVTqR47rCePZ@e%ZzNishD;H2XykHXDka!aF#hZ9K[%%zg", "s": "4f93760a01a78fcdb256d66634f9c7b5", "hm": "840e7b43a8f9a612c0b54d39b3f80c16"}, {"a": false, "c": "NBbD(p*r$AQl!}mOIVMmV}Ih{J6ceU29jV?28=fe[z#Br;^6?3>FDji2ER8q=fogcY:1]AvG$Mzg(b%7Th`Wo{Gy(;1`=F$^!+o7>K:J%zy", "s": "fd67b9b5207a305e8278c81fa875eda7", "oc": "fbf4a41fc01f2a3705535e06a9af2e0448d6f65996a8b6a5a00a61531699b7658e9456bab933ab45c53f3e0271205946e5d5c43dad1cea1ce531d85a07a0cba6"}, {"a": false, "c": "mBbK(+yr[A#,CXmO7VmOi}xhuGJ~=wKvitWnI5w2iO9Gf9W{-@uK*ztE*QQeUB``BA3DP}rzWm8T-7d]9R5DB2co+Au(gDzI(_|8%u1aO{+EpHAX#dcVG5Ttk;)|k6Vt*({=f9BDBpGy!e%dzDcWL+ne?#", "s": "9efa5f5601b69a004a2e851b5490d241", "hm": "3abc5deef2dab771f67516dac8fddbe7"}, {"a": false, "c": "FB]A(pyr$UQAvXmOIV)Oi}Ihu9Y1eUr9%R?28V^wtz#Br:^6<3WKOj.2{a>q:#ogcYBA<KvJ%zy", "s": "f3893c8974c8510c958beebbc7e2aab7", "oc": "f9c721cf781f533728530598194f440897f8bba92baeeb45559077931b9ce9691e8df64ab9bfab454c393d875b2a2d7aeb45ee6cad940f1be53ed84f87aaefb9"}, {"a": false, "c": "oBzK(pyr$;QACXmO0VsOi}f*uBte5>Or0vKyxL-0^##NmGX~#jaWCrO$8*!b)0K=lOV1F2pf=]D&M1<7>KMJ%zy", "s": "9e0c99d5867462e91bf83788054aca88", "oc": "2cfc83635345421daa80b6d16c5aa7c26c74d2bd53891410b583884918e171a9d7aacc22bb4dce4438b1f774f4a938d7e4d3df7e0f33472b9a90b84dab12ffdb"}, {"a": false, "c": "mBbK4p2rSAQECXmWIVsOi}5h@6n`j}FfO>OUk4Hk>:0_=XvJ%0y", "s": "2d0a104f49e8ece46e7cb7af55810bc4", "oc": "fc6ade65bbae41a6c6a1d8fc49b272f4910533ba8c6c120b5450b1ff0e9b94cd6ef80a38bcdcc2ed9bf4b5494fb9dabfa31a8a275400a2687f7dd141a05044f3"}]}'::jsonb::eql_v2_encrypted); diff --git a/tests/sqlx/migrations/006_install_ore_text_data.sql b/tests/sqlx/migrations/006_install_ore_text_data.sql deleted file mode 100644 index 0257427b7..000000000 --- a/tests/sqlx/migrations/006_install_ore_text_data.sql +++ /dev/null @@ -1,109 +0,0 @@ -DROP TABLE IF EXISTS ore_text; -CREATE TABLE ore_text -( - id bigint, - plaintext text, - e eql_v2_encrypted, - PRIMARY KEY(id) -); - -INSERT INTO ore_text(id, plaintext, e) VALUES (1, 'aardvark', '{"ob": ["11a6d23d3fbdbdbd4be9b266ab390a537ecb162383a4b5a674b69fce7b127f4d08c68a2b1dcb02cc8625690560c10bba7c19d59b5bcb54c1fb23a24455accee0b754a41fb6921b19980c0fa17f7bb0ac4cee2ab7b65e9e2b5416e09aa29e596b3a1d09bf0e7282ce70cc086c82ee341d5fca91dd55ba8d2578e797c36715a1ea35c98743955f71f8e743235b72d32f7c6e5b4c325cab2ec9c95b87a3532b9bcd9ce3869c51c1f10d1f1a0d4aad19f70deefcc9e53afaade5bad1402c240f68ce55824fbfd9139a18538e2979a6bb2cf70cd79594fdb228f79fdba998e97e5adcdd0fba400c79da96b1ec8695459e0888d580cdd461a5f6748c3149caecddb907fe3f77af1874ea77fd0392d254e6e2f117061173e3f14caf8f9a103c90b2ef106c5b3c2efb7af3dfbe30471fddf1a0d7dea6e20e236c0c937ae155a56b7b569b12d6fa815c7b15826982992ad549797f1235cf28b4cd9bc8aa57367a854aa4744a4737a15c45a5e3d90787f76dd50094a4ba6e66a01ea589d2df01ccb4db3f71efaf0d2542dbeb5976071c2d62eb7fa23b0b3c9b007c60e8"], "hm": "88571e5d5e13a4a60f82cea7802f6255"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (2, 'able', '{"ob": ["11ff3de6e6e6e6e64be9b266ab390a537ecb162383a4b5a6aaafacfcd632de41dde55a43a25932b17e873516851d8780fbdf7e345292710f00fe9100052eb731c7bdff6f97f99d2afb5dfc5d10886523afe18a2a44e8e3db2aa3dcd465fc30c1069221fa11b87d24f3c792736de9dc36758d76fc975bc98e9851e9f0fd2d422ca73596e90ebd32f4e1abef3f3c9bcf98d8d1ba32e6642d4f82cb151ca1b11ae05a80dfd96ef13b4805102225e2c93f625763240382b57ec4decece68ffcbc35719af33fb257e99f27d6f972c95da4751dd13a6e165792c09a2e668ca0381288f660f0d16eb02404926826d354b67c62b81176aa1544a6e43f618c7a122df4f01803c458bc0bf7d7abaf416e5142a96409efc401455dd88129a3c141df3e7e178eb4eb3d2e76674c3cd14a4c7045168e098260ff7204a2d69dee0b5ad76c368549edb30382973f541e752ef12380d608c6e033115bd520144b607b050f13ea83c58c17f4613a2f771ea4285e1d679f11e0add00d1c31263cdf202e779f78ff1ea5f95ef5c8125eeb2c2a625d98c404a66c675027d52a76cb4"], "hm": "c0db7d4e3cbad2b18c767c659f448a11"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (3, 'abstract', '{"ob": ["11f28733959b9b9b4be9b266ab390a537ecb162383a4b5a62914535342f057889c1fad8dbf5e45d93ab80b0cef21637837a8942f435f237d9ec22b5da003cf6f8b404297eb6387601417f13a2790774d6f1a9d319afcd3add9605769659e35b12eb08225741cc90a0f0b74963326e14c2aab439d7f7cf732cd8d5a9f764e2404258b1383a77194ee0204aaff8c73cd329cbd57af2863b9048076217e3360bd707ff77553fb3bcb1a8b06ac3439b6febcc42a9c060230f3bb6abbfafa5d2e579a904052666831478eca072e0955aa1bc06a1bdc4021cc4374f04c1bc2d193d2f829cd25ecb7c9d6436a8240ec89f9b48d6c1b8a905a5bd8751c9d208e10aedebc93fac56cc5fdcf53312b10959847907e43d9c0d54aacf08a44f1eb42b686754f724cdd2a863de2262a9639b4b943ad8eaffefc6249139841db6c9f23ae136eaea408064a843657977a23f51c632a2068681f08bd889823f841d273c912efd9f17e4b8f34a38fd508b2fc106ea4b147e19d248379f49e3d6bfe2c805aec1cff9cd0e375241fbca2676274fa7fbddb7e8129a04b412ead9619"], "hm": "ce28071e1a0424ba1b7956dd3853c7fb"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (4, 'ace', '{"ob": ["119ca5a5a5a5a5a54be9b266ab390a537ecb162383a4b5a6b6367728e7ce4b064702f08441e6a5a99fd4eb80a3574b7ecf4fe5425319cd3f0ece351f3843dcd64e7150aafdba6f28d47cf8baa308ecd01c815045bc14d74a1805e118c7c60637551cda3c0739e1608bf7bd121ad94f5fe428c6e472dd23cca9aba3b22bfa42c782aa93da43a2d1c09871efe2f66435785b7abb620161424618e9d0746eda0608ee5af9b389f0110c2d7d82f27cd80e697136fbca4d45c6b524cedb799346c0e37ef273963d1e2d2ced4831c5cc01e60d941442c024d7868a3a18d0ec5434a7efe92c61442b9885eb94978c613ade0311e8b6f9b9e7e3a04ca54dcce8ff1bc1d2b96facde374438ce60a965aa492bd8c79f12887eaac0bd98ae7e3d57c3d49a1deafb441769bbcdc48ec5d52b65c1b06308b46d9122264551ab7242318fe4bcd8842ec6c939daaf876adf21381d799b4187a1bdc4715f8e33e902c91d3982394bf9614d0a4bddcebb4a1ddf80b92f64007f29b27a38a84f5dde9ddfe877f647bf72d2a8b3402450cc39f5c806b1837a413513b4d32443256a"], "hm": "360e2ece07507675dced80ba867d6dcd"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (5, 'anchor', '{"ob": ["51261de53636363664b408d8a82584994edca83d828ef7c83fd5c9a6410efbfd1efb25975631985206f51fe6b790b552d025cc353d927aca46af98e85915b26fa80010ed49f7d0e268595b06194ce7a967af1ff8c8a2e697a746177600a72bc6ef723ca769bc9680772f762ba7dc36639a35430e163dc01791d1043d03a871ec943bcf7e6d93a4424c6169592a6fed30eac2e7b11f06977b73d1639aa79ec05c6530f4bfc73dfd235380265c05d57360b43f8d219ac2d068ad882673c07cd13e14a7e9e2a03d7038ee536febf416f8631812da7f95327c6fe2b9cba9d8a9f6503ce0354cb088389b492b6937fe4d251dca6c2380c9e46c447672d00fadde9d98e39c970c4e2679db6117b349114c9b969a81b241d310fb6c29ba0423335b38eea0ec71084f794ffcd0e0bf78646c94f6f6b70f3b85f9008e4b21afd2453f8c2fa714df926324f220c8eaca5432cdcf479a3621bcc8a33f90e6688d42f5f86064a9ba2c7a0c4f602a63643aa4fc652058b3ff10a1fcf58fb99c0c03f301f1bb15352e71771f2abdffe50c8ba1bd50b0e8514f4ef2d7958e12"], "hm": "47ae9ec4c0978a1293d1030e30034b8a"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (6, 'app', '{"ob": ["69674a4a4a4a4a4a5d0a12d95724abf1702db28563e568e807a0893ada126bea52f708fe6c4427f65bbaccaf1a821bdc130ab0788e0637b2116745f2e44fec82c212fe2ad40fa600dd7211d3fdba2916b79ca9e408d5484f39dcdf7df0be85c32916895a6f0b8128a8fd806b917d2c548d71801b4d7b0ddb63abea7cda61847c110946e48891281a0b84fd041f715dc7deabee8f3da5cd9b1321b496d3f282482990a7fa2f27f68ca30430e9aa627e6614f386416d9b86f687284b0629f57eba8f84e55fab2d37723b3115ba414c09ee2e1181140e6fcbe0388cd22306b29398ef7674a9421c96de20901c4752cd5d44e5c1c18d195f885473ca925d6925a9b2bef1bba1483aedc59a2595b10c30745e8f8fd4099220ce4db9d17b0ab3330eed428ee082c2355a653ef97e672e05f7032ad631bb376705013ec85f0db9d0a320b1af96657dba9b2abc0370e8b4202f71a95db719f16de0775972bc0d552d97bfef60015b1970967d21c3a59d272bbfbf4612512a74f16266817384a1506fb699cfeea68adc868669b32baf6bdd532bde81708a5ecf53431f"], "hm": "d2a57dc1d883fd21fb9951699df71cc7"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (7, 'apple', '{"ob": ["6967b3b50d0d0d0d5d0a12d95724abf1702db28563e568e807a0893ada126bea52f708fe6c4427f69de0b0a42a36cb0d747ee9c61a6f2bc7c5e4c9a7d63b0179fa11d4b509d9cbb7025230c5b17f57c14bdfb5e218b20c66fcb2cb01834f941875c6cf60344380027d3370d42298b5c81ef284743bcac4a893c629d4ddd9de83bfdde66aade949e20e27cd7a024affcc48339fc215dd300d74d685bcf56fae2bf6146be8e92c735abed6b1658354cf3cd346598a1a99d02c7e356dd9a905bc1130bc1d73857c9705b1c0037a0d737f25045d1f0f81e27e506dfbe88a4fd3d3731b8298d1cde774fa8f2c6a2fb8d74eca4642d78f74c61f9bf8552181fbe244cc20c9d6d55bbd8a56ca282d372d3ee25216051ab1df5fc4f073808159a1f2c58a5a296f17ee806d4a97b5f75d56f044c048cd135abb018499c75c5b23711ee3dd14646a45273b6004fc4ce63d40daee2b16699bad72a084f649aba27201dbf955e05744a5ca2b27a286d11823d2fdc1647ca1ea58ab4654472e91813f4f6ee4ffad3968e435c93b7adf2263c61f57c8e3edbb6992425b7a9c"], "hm": "1f3870be274f6c49b3e31a0c6728957f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (8, 'application', '{"ob": ["6967dda831fb90a75d0a12d95724abf1702db28563e568e807a0893ada126bea52f708fe6c4427f60ad5226d98da168987fe8c78b04e92d27fbd605b95e9aa22236e1a1f05fbdcbb94dfd1cdcf816758228248ff2bab2f585252251f6dd07b10e4c81518abe7fbae15f66d81cc6e00bcba7d9668be8790619d9d9f6a812a93e64fd5612b9993c30909e37e0a8954d2ca385494774c3bea35ad4c90b04dec8f76491a295249e25cf2b4786deb39336d5a5a20c8f7147148d92cf6ee8ace3c1812fe71cf2b5f23c3627697488dac67096f953b17728ff3614fd99ee46254298d34218cc0dac92715a371136faa158395eb742155bf387191e011147866640d6f58e60c514e70d201508dcd742750f87e084d387c9a67fd4835191f7284d0dfcc2725d85c9839ff283c06d77e22397c953bdb40f2fb1ee41d1a2a76170b27dc551c3b2c9e9112ec8d3d70aa9e2505f85ea98b67f5e9a09f3e7fe6f79a6d87b37a606ab13a54e2f0c8f341d4a33b302d622cf1ff65c4a6f442eecd031c4b8aa6e898bd1e838a9117ff0be8286b2c65ac17679c2fd1d4ffbdd6b1"], "hm": "3676d55f84497cbeadfc614c1b1b62fc"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (9, 'arctic', '{"ob": ["69a553b28c8c8c8c5d0a12d95724abf1702db28563e568e8cb004498860c02350afc826f136a198bf4f3da484faa0124dd9d05eb60443305a0bcc39355de6281e6560cf3cd01a5d0a9cf99d7c7862840c659cd6e3293b7fdb9de4e1041b6e2b7adfb51af010f34e0a7b40abe0b075f6db7ab1c6234c4ea6354177809a16f70b4bba0ca0cb4bdcaa1257d134228555a661ce53ad32ca03225115a3646f600b450c9a87ad6fe881723393b6baf4dc330526a2a1235f6f6e17db9edfbeedd0a2e934497f0e85ca149ace01ae81da376c81460a0f91fdb63b96a6e934eb431ec948b0cf5da15eacb76aaa10c3020e477a473d6246356a400a37e9ec6e4b0dee0f4d650c917a61ac43510bdc59a49ba76e41afa5f0d12e4dd3606569dc1ec9f8b108070f799334c90594205650449d579f38533322cfaf7e1d6bf7d0151dc85d523b9df157f141cfb1d5d71461a309b5f4b34d27d8acefadf6ab18e4f4e739d1512b49d283dbf50fb3a01e3ad3e349c8d97ec818ecf5560561984e2e3f5b08887dcc3eb534be304bcca5c3ed88d4afb2bf38aa4f61bbb39dd4b1f"], "hm": "32343e35c68568f548cb66b3e25f1d6e"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (10, 'badge', '{"ob": ["f34135be2b2b2b2b1a3d274e8b4e4d0e949f08a402df6cc63ac8b359577c18a6d44bfd8b86bcac39589358ffc9a3e0803a15d272995d291f80d0f424d651570e56bcdd58c1fbdeae3310fa9c02da526c2ca11694084bce776f4a5d87e3202b486555451c747907ea78f9e0da5d6c946bf7a75249ac3513c29d15279841aecefeb78b2dd3e721e83426282b92856ee640ce621e08b84a6a69b089a8dcbfb4f721aba781b1acdf50eb3ece560855922817451c85fdcf7b563ec90e27b639a6a86dbd9e554e9a1faf5a934867121621600aff42b69adeff3a76437be88b915eb31cc8b1ce9c749815c713d2ba42eb5663636b978eaae1f2885f1aa249e36b7ba589ab31149f2939b7181437b7f7eb10d59f93ddf9af7f1b4fe8f7f3e7eaedc8e92e3ed31879ce5f4f2a7754de59635e035c8c87232e9719145cfd247c878f76c5082ace2f06c145a77ee9be14a65992e8ab5b860d303912a5bbe1d00f9d00c91646ba61d026de6599099e7ee0635cb86363bf22800b62db8266224af2856a4708a8346e2fc5673c7405fd874ff0d4a6502440d740de07697434"], "hm": "dcdd1274f35ac5a8573e07b0582ad92c"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (11, 'balance', '{"ob": ["f32e1ec595cecece1a3d274e8b4e4d0e949f08a402df6cc6e3178aa429e0d670fd4a9777f9b5dc719b7c4d7162266c127a418a4fcecf1cb6548f747c7ec60548ca6d6f0523982f8f1ae7aebe4c1ae21af911ca634689626b6d849ff74918849b7a63070c7fae45192090e453046b37895003e4e861a5a62d8d42f876b0fb4062500109a401fed3f25ccb4f2c6327b8867ac2c8dff54ca9d5c7de8d6b3c208c41a7ea5bf5f40cd43f6ffa3718d9b24e03cfa2c24febfe5b17d04ac6b122225d6ebeabf5b4c8dc0c9d1b40e5235967620cf708f3aa5ed290b6194ffbcf15de3b3f6f39a56098e8701a5a3c5fb9a2679068e007e8d9d2933808d241150719f1b2d8b5cb0aee9b0ac9f39b7540f8a7cbafc2111809f517f53ca0963f4b36652920a65826249d5ec388f0f32225f8a1894c397f37435fad0a73a5fffc229af60a518548b1627b12bc658adda78ebbaccad9cea0109a51138d907819499ed25206c481239a3357bdfab3d814856b02d27c32c8c8e943018100261639f034327345dbc658201b741db67b980e4e368048ae5400b9790dbb0ae10c09"], "hm": "2069ca795d8e10a6f9a92dd57d01af10"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (12, 'barn', '{"ob": ["f3227121212121211a3d274e8b4e4d0e949f08a402df6cc69cceb69ff86e37a6a35634bf94d7a3b3f2e2388d105f84e8b31639f1a941b3416949331a269c993bfffa88b162a583ed1ab78fccb64643afeb95a2bfa9b2ad089377394d5f0ce8d3b2094cadf04e183add86d90eee35e5928600af521bc7c40648049a7bf915f44d416b2a7602303ef731d44d82e3a8d6ad36b6de2db05782c77d73d4b3b89fd2171449e3727acb015ecffcdd131355c7b8fa942e3b621a67484f9fba8b4d22958e8ad0474ed5f34e148cc99e6bc4ccc8da957ea0c0120354d97bf91c4badc72b2375a65f9011acec681d20d14d499d64096e9d233bb6d4a0d3a77f42d916c620dedce6ca8b137b6fbcc5f219ea000358ee7c16073947b1f77096d007acdb683a932a48d7ca8ec07fa8908d91a23bc1cd3aa6731e83248c611a6782c0bf34394c5cae5ac2731fb79fc569c8b2cedf001542594fb1fb6ba548cb542b21830f20fc531cddaf814a20b84faef76e5549cb2e6589a7789f2e74d9916acf22f40644ca16e028140b859e471ba7308212d864ade91dee18c02261c4fd"], "hm": "5dfcc0aab2f3db925b2d51ba73e48946"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (13, 'basket', '{"ob": ["f398d2e1b2b2b2b21a3d274e8b4e4d0e949f08a402df6cc6e358733b94f2d5fbe4a6f15dc9c1be2a6c0a54dc630f901b1a66dbfece787514d6240fa2225e57069ee6aa3222b360c1d537a7d946e4b006f3beff83c60de716de46f20f4782d48b94cfb5496cd878c1fd775cf3ad9e1e6d5f319e3b0afa058202b77dfc6d37cb8d20370a9ee4b54e9966477e25208b788247c3eefb2c83a20dbffb8bfb322c389ca6c1d9c438ca8ca02b9b9190dfb6388f06a359e2815401c180c751952f9f95ccd95328ab8dea3084a5c99e50a0c12005b321230ac71465de91db05c06be5f66381446f939653b7b4d78e95ec77d4a73e32ec1fa0cb3a34c1c0b3a7511e69acc25a6e8921e30d06e3ab080b23618a5b2a14af312721a544ba549d0e294059f9eee9313871d90373b0d719481348ca979122f018ab359af2f738736c37e25c7326125e20d993447e0646e62fa9c2e4c3dd2995a05e2f0fedb000bd52a5e3228fde0e73f1e56ca6fb4c23b5a7ebb18276143b3a3bf51044ca28eff60925711d81f4d3e6800685cbbba4f9674929a3dbcb73f3d85177e2fe0ed8"], "hm": "0f6cdb621b452ac6fb994d88e674e49f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (14, 'beacon', '{"ob": ["7a8e85dce7e7e7e737deb16f553ca2477c785278a9ba6451a19e3602237075129e345b772c0f00d113a5b73dd0578ba4bf60974fa2f503dbce97766d154608592ef3a746c3e8cd8a55a1e90a60af6314ef94c169468cabe8b6cc14cd580ce1ecdd6fd5c9ec6a8a581469114888b93d06fd9242f4573fc94fb18d179eeeeebb113aaccc06082a54fe70ffbbe0fea4bb875a835355ba6e441838eb7fb696eccdc8f895d3721a9c13618b00c2af77a54bd00b052bb2def958e0c731e528b421e4d0191679e262ac6846f0b49e0b34e86cc6184e46e82ddf3fff14bcec9a65bac5e017aa67b3e8ade57be1303c7dea77bfd20f1da567f9d43def9e0e1e7855a4254b761cc638e10208b02fe0a98302ee75911e11851f4485c07af0afa625ffad5ae7cd2e28318713b8f2ec22e5c04a7b4b60b17d48d1c6d39676ecdcdd732de38dd6f6307964aaebedf98a752e60756026257d50099e9659357e00820526858088a9215fb7d00baf983cf102e021c1b24a4bf250ab5406792e3e59fce55d44d8e339f0388d01872a27f942b544a967e6948abdeb817a910306b3"], "hm": "41b89d10619cdd3e30fb6c401c17c7d9"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (15, 'blaze', '{"ob": ["626679346c6c6c6c9e73e40cbd9546f03aa66a0632e2893565b0509f84a80fc9be02075956d4a5855cf21052931dbf4f9f3cc074435485a0a49a5eddbd07228eda1c6708462e63c51c283d93c0cbb3283a3a45e4cfe906a687a54f0befedcda508fc2ac28b543b6d0523d921987f6f667a23b9b1fd36529b4912bcb8cbb67caeb20199654468317e20752934ba46132d1ed910450f7d366c30c98597df0f59424e5db48b60bd6ff1ff5a9f9b01af00ee55ceeec5a259693c2e909a553d7bf3b9cdde31ed2476821cb7260532a0d323473d5d6e8c14e3bc6873dc8d33a57f8242b63bdee9ec08a264c6b2917d72667c730e89667d3d776c0ff437eefcb93867da6427d2966eb19bdad45438a81a4f6da3b8b0adf89a6ac0f16a5379561122f5502398af41c5effeb637968690ce2097b52be644001a35b0d3744b35f7b0a27a5c54591ad93ae1b3d7aa9b5d6940474ac15af2b1ac50c8b90d9dbf3c7bf2d15cfd93a0c62fb938c7c9f83993cfd658540215790d46587f2ed1d507670038c9b3f3c53f58eb64d4fa7aa659031ca7ae119517673c862b822e7a"], "hm": "9084994342186c542e75b2fc5241c547"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (16, 'bond', '{"ob": ["62e9a836363636369e73e40cbd9546f03aa66a0632e28935aacc757dd2577a164c66770d7a2acc2b1df4854fbe8b3a538ee3723655b8733ca8cb31ed0f3d3c23c198178be212f38bd3415a9b72f3c65f7005f434f83b54ba0c0658b51985f870d91fbddea3521128e542d14b2dfa142a73e9a3e68b04e3f7c6a6722fe800733f06641a2ddbb6faa0ffac2224c5af27a119cbaf5fc788ab53eb8ead8c6c9ba778212c5fd4768f7c3636b63fa4ed8e0377c604f87f20d9a5181ca85e3a19d6eab185eeab047b596397bcc48e97d6c168ef8266d3ca8e72711ce7dba5945d345df9ec36f2c54451f9a3f3b4660eb917db1ac3893984497117be034e2355020d8ef06b8af31ec30dd693b3bd56ebe3eff24d318a4b56ad6fd93e34a179dfe229479f9cc821b1c716275a70f7a2fcfb44343c256c2a40c293b528b28138817d9088817040d037abcb61b49b9a668e0fab120c76b07935c0b62f26e14b0e477803fc03cf18dbfa799bd2cde766b4ba8659de80a6bb132dc9a93e1e9f22e36c8460dafd5ab388aaa85adba566ab832d5273533d5b7bb7e2ddaecd15"], "hm": "ecda8ff7933831de47cded3bb238b613"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (17, 'brave', '{"ob": ["b66592293b3b3b3b8ad98ab7745bb8cdde112071cf86546195c5413b28d12cd35c714f107594e03d13bb6be4c8cba4b839869ea1f69cb033cc950e1dd398f999b22589cfe8304c95199ee63f5f568335e6a0e3787f51171515c873413cb3f2334c58765c77b30b81bd07d05bdc06876c86cca436cb9d08784e93104bafef4416f75e5cce51936481f649c2623c98ebc67cece812b8be54c19ddebdd8f584898acb3198d20a123b1df124e4d1ed2e6d52d088a70ccba64698fa6d71853ed4f70115b9a5e59421a1c4073e2ab2ee063ac1b205ba196ced2cf07c9deca89b7e852d112c03412a6fd466dfd1f35a9db4b24f4f56d3cf66112a54c8609ef0c3352b592eaeaa6e6e3cde1f70a35551833a75b7531fdfaf9cd85bdec2741c589f7d6f5cb6cb5565a830d0a3498fa3bfadb8e0173b413c8708499201302d7dfebc0108d645c32f6c3c376a24b11593e40b22d272cc04da9d78fd9cb9e833789417ec3bca5054e5c6dacaf2fdd344706efa54f5c9946f5269bda292eb4414a95cb3bdabc6190a776fe55880e2d791bb7d9ea3a2f0ac6ea43066e48808"], "hm": "d18eabd76bdc6fc6ccdfdd20d40ab20b"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (18, 'breeze', '{"ob": ["b6ccc630232323238ad98ab7745bb8cdde112071cf865461ca3f09e313d2bbd3cb6e3568c413e525fad9ab1148c6ad9540dff76a9d050ef6c2be4860ab8d012e9a39aa1e9c83034bb71a00b89d9e921e6d038c51a8551f39cc759e1d21d46eb229eaebd194082a5dd897334576cdd5e906d723f9c56fcc499e0715a1d8e04b80feea2290807ab3ffd95adfe201796865146b2ffe478030c7e9a2873a10e6cf53b9cd2d47fd0d289732607718f23614a1410dd98a6e663c4409530d7c7d84716c42f82f9e14c512d175733a8732e4c322f4fc08a3d4d99a2c296c18259af3f8e26d9adf2c65728569d343f23f8b50ffd158c785f8c290676ed49f7c2f606d969b0b19f759ef4774f74b6adf6c7a952eb40373a705e76b5a3bae1f1c6a050ce5c40f02cf7f0d569975d63ae3acb40e1b521b2b6324756bf1d6a6296be0c97baa62154725e3eeeea8cdf07975af72bf9924a8dc232a4568012eec55657da526a864fae6c83f611b28f77ae6dc17ea088392d7016191de138fb1c944405c394085289cd600cfc98f996019d11bd6d07afba9b2a5a1ae269149d8"], "hm": "e97abd871ea2793ffa98f430ed268c35"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (19, 'bronze', '{"ob": ["b66a1b0d3d3d3d3d8ad98ab7745bb8cdde112071cf865461c6cf6a10499eb2a3c7db5e61deeef643e68a718839820558deb56f533daf0f5701673cd45df026a236b5656c373dd45fd4c53bc327d31a4e37378816a38344c9511043e254a818e19b2560572cdeed627dc9a46cb558bb13e6a9c948755bb4dbe50a4abab5ccb8430bc6c49d946ec78bde91bcaa037d77b65a612eeac9c57aec705447f1292101b2667cf5df4f8720fcbb76acb059d114a795c2c7ab488ecca761ee504645f171aa513198e1c2d9d5749db3425dec23669b1cb9e173114fa90d6cba3d1cd81456174a3fec5cdf6cf75bf5efe5beb5eb3b732357913cfb38c1eaf352100ca1d363c655c59386c6754fda5451800010816324557b423eefb8b651d14792ff6754f3d8605dabd5bd4b2070905b4e94b50ffce457fde86aab35504a87f9740e1324bd6d058fb1d2498ddac3f31dc7b17fcd78740b56b5aac09f8c1f085b870eb1bbdccd621cc145cb4e23f0dbe5f0cf39e8a46bc413c66c96f5f62ed53d73fa0a3d411e44b94084b3e03350d6fe32c5058f54090f09a49656066c3c"], "hm": "cab7e764b30007514145eaf2f6a7ed0f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (20, 'cabin', '{"ob": ["d26248e8e8e8e8e86debaf3c59131cecce6dc27c2efe6e908baf9c213067e70d88d5d72a5ce781c994b280531f6b91f97cb74312b398e9029839d9452e624db83a4f12ece0abf7de659cab9d7636ead344975a2d08dfe43000e2849630904bfcb5866e787acc58041b30f2e658616962412b8b37e64a31eceb69e3be20eeba9f82bd329daa3acaf726ba78c496942c6f25a9998a83fcc34253934838f657d9e20eaf3b9c1851d61c4428b8ed095f38a5e57299b60c6929cdba8cb1de0c16c015e129a95c43aea17396af3c13b0d1bd586142ac78e02e648e087f2b5c5d23126da1f7d09acc9f8d94c7dbf4d06d58cc088e5b1ae8853f779caecf4500fc729a753cbe351e8d6940e66bd1dc7307efc7f5eca741dcbf950fff5fa70f90cf768fb710a6957e41e0b27454f206ba05f6210d5c6e7f149f607b16053cc7d750fb40f2c9c98707b26a6963bbfd5c70a208ec04396726ed939690b1e524b9cbed3687aef3ffffb272066ed8a2c684431fe7a0cef12a4b2fa68e8545fc577a4e8bfa97f234172ba77f99f4aa60e382f2d44ed64f1a98b7d1283a9ba8"], "hm": "92faafe2b7a0367474b0db719553aa77"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (21, 'canal', '{"ob": ["d24deaf1f1f1f1f16debaf3c59131cecce6dc27c2efe6e905524016450c66acf93886c9a856152ac525f4d4352668d613bd34320ac34cc26dc815ed82a4bf83e32d981f223d0ea860bb0e572335e145473c4d2750ad0385be30eded52486368381a7395e41c31498af415fe1168135bc8f24ba00b7dcbce816c57dc9a20939cc1a2dbd9cd05e21cfbc45d2590aa2133844cf3b2b62d18139182a1dc40f59e39e81699e75a8ea7ba1c7cc31e33ac9a722dc20dfb228007284bb951c80c3fa729a40fce258ecebca8b734f2554154b0e2b1f568d26243c397d64df40f2a4c7d70627cabc9b0e0be453a2bb021c390ab43fc5a8aae1ed8343b210cfbca907d61709ac0be529513dd9c78b32d96e0129c08dbafd8a0c3804c3aa02dee1deea47aa9738ea3f5836651d231a485588962082bbc7e9ef98fffe89a616e7cdf92529ff1b396b526235693c741afe6739246d0ea92173ae8749ac1bc707d1e2c79be7b617fba5519a5a92e8fbb06a64b2c71468b8fa8c93b48d6d5b2587d0bb2d40c4d7c45fc8e5f0bb7454e483ffba474ad30e15ee5f3a0df430ed03"], "hm": "4709ead2b0079d2d9ae797c94baf3e2a"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (22, 'car', '{"ob": ["d246f1f1f1f1f1f16debaf3c59131cecce6dc27c2efe6e90b96e2cc43a6490291fb3e58921b2f83d78feac3b9402ce289e98522390641818494e6d9c1cc280d6aa6271f2d7836ccf8ad20d8ddd2e7d1eb8e834e579fa5d18ace97cc75463c5a6368989ac719a11e71d98ce2b4c1228da82b3d0f44bfde399506795fb51c409ee9056c6e738c9d646c5173c0b0b732d64e7d412731dd00b166e71e9c72ce3f4849c288bff4e9ccdd7e803585a57554d62db28847286e0d2b337fe74a6806eb551e79528ad238f919e0085ee063dd616f2892c5c7ba7c63c1301310857479e8d53e235a566d176da3370ead7553c5e08d5cb5d3cf513ab9eb4e629e9a93f52d86ff0566b9c2e73c19b50e339abfd92ffb416e03b0f7a2e2dd40f7573f450f119fe9b98ec00e2682e11a72b3c5f36e4a174f177ca3c7885f55b2daac1781bb1a63e67cf401df82a4d4470923fbe8e3845858819ff3a2f75c347debca9508189ceda5d0d8ff3ff1ff5408d503d04f4377bab8c9e82dba1d776c3752a4161eb23abf642e36a61c3b92b9127a60bba8f5e8e96d89a69531d3b4f45"], "hm": "e6d96502596d7e7887b76646c5f615d9"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (23, 'card', '{"ob": ["d2468642424242426debaf3c59131cecce6dc27c2efe6e90b96e2cc43a6490291fb3e58921b2f83d074b1eed1ae7669f7b4f816ac16017a6491e9628c3eade85c73d2be5c3bcb537f3b752abb045b9b8e2bc8b07bec4b0cd41f25a227d701319750537d55aa500dbc8ab34220c04569e80376c5cfdd97cf5991918ca31a5ce6bfaa56d483db4f8301f68e0f215dc20278196f94b7cde9b9d868b22bd73a35729d1590046a7877959250ea57043c33cc3118de8106722c7fdc7477dea9925d33a9d5cb5419391518871b40d83824e4330ecd6bb1e71d193893fc9e0c60d985154830b54c8f5cd60bc5bb2cc5114a0f3064b9058b159984d9ccaf59de770f5199061722a6121d00c68a94324df44560186398080c76493988136aa155252cdec0d81a189b5fe198dabb2b56a8d98e4b43e89370edddc5de9a06d8ad910f86aa0b572ed712cd60f818d2af791fc5c523d6de617f94f9394986fbd4ab04b1f8e79c514cbca158ac3b1297a74c4f2cc6b88ee2b1ad1b02f4fb45d966e5518e489afac294cdb08b344a8bcc09032ceadaff6f8d40e7fa7cfe6866b"], "hm": "5dd2199ad68327cc76d583b057aee7d5"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (24, 'care', '{"ob": ["d2463582828282826debaf3c59131cecce6dc27c2efe6e90b96e2cc43a6490291fb3e58921b2f83d60c35d0e376200811ebe987bf9291fbf3bea4ca8656d2380b37b659f79011bd4af07a8938c8d7e62cffdb90125ed1b980ccb47d6b66e052e7843db2bd9daed18e2ec063061a0b957868935836f87253003e74e88c228d065863b949ce6cbd24468e729b8ad18ed5407cd77e764862bfe74ae4956f19fd9466ae11b7f398cb13bc55db8af150e8996455de05d23d24759a8c04c8ef0b9effc032d7e3db258aeb64e98cb5c02397c148a19e86e7598a7dbb0394149795d04d986bc3f0ce20db2a237cf8bc42964ee1a1bfdfdff9e3247d7204274f858a1123e7c1bff38e13029a643507159f9967a57a58a988e369abc1115f7d3962bb0503fe88379442502bf8a39178dd647496c24a75fce0530eebfc006d4b06ddf9baabf6be85dd6ea4644c4b48bd0c28910278f1f318c8d7654f2f27f8800e9cd448124cb311593384d24d7adb57132afa4f2681e1807d17385a156d72d975412c7a7f855755a6dd6240593da006d0cfa095741da71d04758708e98"], "hm": "88d923ba797e9cafdfa4176f02bc2537"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (25, 'castle', '{"ob": ["d26b6796afafafaf6debaf3c59131cecce6dc27c2efe6e906af403b9a5b34bafd1725266b4964ca458e5c053940f2464a42435282082e700abd98d21bc52ff572af5dc7613944788ae4787b22690d2951bde937d262c1c8e34e6948d4754f364fe4ef464fa620a3e4610ff0cfa751b4eaaf02b06c2a3a98ee0436e28e15864ce1c4c6714b8265db32cb00f61f258f3131afc5e044b0a1d7892d981a3a3f645fa7deeb711c57617cf01929cb38bfd727dc746954892f0884733edb7a4d9d6c4e1da1a82124d608fa3480cccceafaaeae8b68f0b3029cf75d02fb4a3eea5680fe271137a9e3dfc47fa1dffb2d8044b1c27cb70e7724b5dfdf8f3e41bc2cdb3d04d857866da7c6e6a43d6be50d93ebf283cfb8affbd8ea5fc2e7cf90cf5a4ae35a93f0f1ca46ec07856980468075c9e0ddd130633d208348c88f316c56ff789c4da9508bb2aaafffbc88133db88e76f8ded6082fd992f05962859c228a810be9cdd0788a20a9909851b5c9edfa8748a165bac842005830a6add3bad49a0e12854811f2de98f79d01bc944b44d5e9afe081fd49dd9433a5411c7"], "hm": "9355a9f9948fa985b84e4e369b5245f3"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (26, 'cedar', '{"ob": ["801cf7b2b2b2b2b284bcf905c0efa1ba7f1f72dc6a657b9cfc26911f2c80703ba7285d047589414c2e57d28e7a4417070f6b3c5e5b1fda3792a3094e86405767fae2e3674e14d5cf24b0ae1b88cca33f3b35f73e8fc7722df01defc8fd5112d947264719f53bf1eeb9864c139e59ac2374b9deff219b6ec29253d50471b6580754360b16cd05239f40fbed1886a3f54b4f19a19f1498d8d767ae159c739625d57e82d147b92073e95b6bbc69fb247cb9c2d5b274081c6906fe9438c494b232928ce2ce83374cf2fea64699df5053689db1086b6c655149f0975510cbb48a633d930832787cc7a2d65de5ca826268d08e49de767793c97e5302e9d6c1e893b1daee5db6780f67b24078a8bb9bbde71bcb7462161b40b2cae2b1c27caed59b2c138a172e407fc812a95edf7ee902543d8e3e5fa1630cd31b0acd1dfbdfa78f8d69e74992436342db75f8b768eb9dad82014544214444d567be88ba8c08741662f3505e2224d900475998495023453401a5b28e979e7a2e952c3589770c5ae840b76fe2e7569904d2df3a7b955bba96167f4465263d1ec4299c"], "hm": "c75736af3974c97bdc88ddda946d59fa"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (27, 'chief', '{"ob": ["7e66c2414141414183f819d46cfc357be56a3394f660ca67a9b4beead81e86f36df394b94968f1a0d4644c66f01b327a97d597fee39396c8bbf35270da264f7951a9f96b6fd695d48c27f61daf5cd9af43df799c70733ffbd2d6f35f1e30a03cc83c5bbffdf11987c9c78f3e058698db5e29d1de57782190c634c7eaeee564bfe8ef0792f31be78e66aed489d0d366f01265ac81d768f5c378a397d1d4fe22553dcf9035be95ef7851c6e56d37dbdde640b904cbc750df8e041c538979d72bb244dc06f34a4c58a9fc1278cc785798431f6b4833b71ce5c118367344ca1d6799bec462856ebab77a69235cabf2526c5dc9f3bce8e449e0aa55389fd619cdda0aad90dc043fe5edeb05593d3a942cc9c822b3a364fc0bb87a9101987d149595d5ec25400b83a909acf9564b03341580e7bcf51d5f63f784a825496e8df1901d30702f2c428ae281291d34997c8bc4389be3428b61632bdccedae4eae6775f70a1bfa3a1dc401ca20f7f013787b6d8dc37941c2a25b130ed80efc9604a97cd6c74fa55697c37ca4e0813a3e908f3531920def36e55f2268c7d"], "hm": "80dbf87f21babc680482e0b37bff584d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (28, 'cloud', '{"ob": ["4589f828282828286b7508de94660f1e00d7a219d0231c190bad2c323b7a93a9b19faa5747dc59a663c4cd9299b41eff7a881f7577bf0416640fc2e9540c15515a8769bef29baec77df3185cd34a7b2baacfbae205dcc328efba3c8b807c5dfbdcfb3fcd666021b921b6ca57fe81dbd8c7322587ab0dfeb6e02247f54cbe18d4ab7bedc8d5f3dbfb304fb76683da9cef4bbe81d0e982f4fdfa5622d9952ad5546aa9262b0ec2d87128ae308ecc099fff1be96f946490dd9e544d1ada61f6ee8e022e165e954774fd900cb01c9987bb4639507145a4c3d1e28da0714587fa84de472580eb48737b20d6e49668074ac027c336e73121b7ee804d48aa07d2e7833263a5a13c129c7cd69fcdd5a225352cc5eca935090253c1c09e3a32c00d3efdd8f4f8b02089470fcf6818714ed16873138decfddcc176266a6be5fb448211d373877cbc482eb677f8cf45c07b3f1149bba9b700aa30c10bf783cc0796617ea32962c2db8ab9fbbd88f2944201c5c21fbbb26261a32f8a070e09190df60c9c2ffa7bc72e9ffb77072d05f8eb8ab1a917021017031ffa2d587e"], "hm": "a1234b3161b4fbfdfb96dd576b65bbea"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (29, 'coral', '{"ob": ["457009bdbdbdbdbd6b7508de94660f1e00d7a219d0231c19f4e2aaf54fe901ddcf164320f7e811e9b529bd87f1677bc96bae16de62baaa6106b785c82d0b2f10dcccd723ad73a7720190a44cc305e57c805e9a1547eccc7ceee59cdda21444a91c16cf0cddf43f307d36822afdd49685d1b284636e8e306c22d6a5f5e9105753966bd8933e2d87dc83cea8540c827a03136a5fd6ec0dcd09cc47d27535ffc847af2c95e51da8594ad01a574499166fa14ad7eac85ce7bf9020419dcf0d487c801a376fd429441fb5a0628f0bd78bd320921d54c8360286debf21d09eafdd7a86e4a2d4d1563a859b15d5f98b3a1e11a3c16b92786705a72ccbaace083beaab9615819e202545ac8acc70882034dad35739687823aec869675e40c8b5826ec2f75eacf35ba0be57fe3bae96ca9a4d8ea449b5ed2ef9393c2db979bf5786cdbe931a0e563b85ea5c05ff24dfa718d7da8200029e4d18dcc636e1ddf8826bc6ee237420570315e64fbd8938bc362fcf1556cfa00ae41fb41e7fa1c1aaaed99b5f124a4f515dd883af4493099945fb618543bd3383d0fc4227bc"], "hm": "d2ebed4eaf58509dcc358e1782c38fea"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (30, 'crane', '{"ob": ["6fe2c12f36363636dbe0627f2205983152e440957302feffe4aec864b015976e24997cdb83ea2a0d4f125b520e8aebd7e48b2bf0b0ff4c41ceb9382898d5480930f869cb03c7657e64aaf601ba7aac0df04c97b525a8443a0bbb815a788581e4c944ca6ce1645ca160a50b89d01a6bfc22017b029faf530941814282e76a8618dc797cd7d5bc969960cb1a709a3c3f654ca76519bba4c6aac6c9e7520e0726a78b7983357f6bff424fcdbb747c3f6bfb73d09f2cfd2287c510a8474898e9c6adc61f8884c21742ba6bfea299f049dffeebb2d4bfdb593af9d1422de5f934dba0d33087bfbb4ac2087200388c20094d4573d1620fcaf62fdfc884a9ef9813d307f9580f5694443839164d9296532f32bfb94a3f4a291147ae7607e4643c0ccf4a91094d3ead236d009b670dbceac2b64e963ba28f25c6a6768fd2d34f16e64e28f9f4c6d073a15c0e601f0fffd5fe06e21e351d28457daec0daa70f38cb879eafb78764488f1d060c9ff3095375a5a08f8df075947fbc517e8521daa543486afe216a8656e5466e3bd16df71f60f9dfbdd6e3bd09a6b37a93"], "hm": "b02673583fb6330b60064133ce6e3b1e"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (31, 'dagger', '{"ob": ["a309a6284e4e4e4e839c28ff8b38c88c894833a4a0b3ca9ee7f747459d42565364fd78376674e02a66e4b169b3def0b4e17c40d45660cfc504adbd5d223d8db34c9417faf82ca417a4e0645b91affb79edb238da4a96ca06add846c965d1a0f5ac36262ff38aff6b63b51a9f8f938706a8e611d40b9d3d48eed7b829088296c90ec94855598d4aeb556df8e39413cf5c29ca52ebcf5dde2b2940c919acad920bd921ebda3ae186f6fdef48194f9672cbf6a7f4279ccef5df3964ddb91a8065238cc3f4bfb98e7b8e563ff1f2bd2f5b59d847d5bd18e557b57387f20b52260a3a5009e28a5c2541175ee07e466a83b72c02cdc0e2b9c5523e0f3061bed865da5330b86938369cf449a79d4340ce1bf2d35b2b0367d58df815ba73e5bbdf7fcbc05a8b3d27a61d3c8fae8067c85d03fdbfcec6e845e8f943e9a3fd67419b29148c35a1b40a0bee59368314be674b407c5113a3148e3b4184aff11b5b320006ce247df7d5807b34ad4cfa8e1201517edefb1e7fd8375d5dd39741de4e358fb11c90111bf89fb1ff986b19a786afeb1604add76de6d3c87700f1"], "hm": "02abb7caff7b7a504cb291fc428dd997"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (32, 'dawn', '{"ob": ["a305f1cdcdcdcdcd839c28ff8b38c88c894833a4a0b3ca9e129876103f9ab70876d4b8f99e87cc3cd714c58508656f6e1ffdf19e45b59f766801080dbbcc83a58658de9e164d68edfe935d788f969bdf39a5230ef42d7fa0f00101b6bcb6f555a3f0d4009363c53e7fd46613d6b7f67ad1e906d769dd2abf7e3f180775491e47c8b56af9c206ff3a13fa8108e32eeec147ee0874135ac408d623b27ef83009e4c1ba46f3ce9334f016c2a4933de2b545e30e9dddae5d67a7d607036cc2993211a95c02d0bc0cc69bf3fabc7f68c1a9f3995eb3e3d70499fa3e26ca6a52333811d481c8d26d4638c2e67aa2a73355e6c5053cb0791bb88a72c0069e07dd5638e258772f356666b48688111dc4a37934300b0b6c62a4b7fb07450e9a36b04a0553046bc9e373b8dced9dd213abd73475173fb2ed2958e04257d2e01f9e67f4b9b5b0082a3fe013bc4fa76e83cc9102e63c6792cec66590c32a0d6022cc0e62584282d0b780e544a6a6ceca55105ce971d50cb97ec84256523f8bab7e79815494c306cb4198b1a7797fa06899d27b17397e4fb6e549a4646e9a"], "hm": "009f25a425c179da52a4f69b60bf81fc"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (33, 'delta', '{"ob": ["a71437a3090909093cdb39666d296c161c702ee8fcc146f2763a679530c2dc3e623c59f3be2be6292c0021256b26555b2a4119eba20aebdb1666df127d65275f6fdfdc32a931199cc831250a85a38e7c4f641e0f731d9fcdd51a50788c0d033fd2ff7140569b064bb8e2f1787b9b839fee93ded9befa9fef7f2ec03c46bb6878ae7f5da836b379d4e06106b38ecfd729f722238fda10f688c909ee34d9351c6f60dcf5bde55aa63c2fbcf3c7fa7dab10322e99de48115a3b0f59bfea662607c064158d52b919385cd8a0ad23737f66dd330dd159bda4dc1e4ac59acb288b7d7e220f40a3c2981bd1cb3cfc9315a9918c14332415527e7ee02e2e7981088139fcb31660f0e328bce06847f4cef4e1a5a15e5111dc94435cbd3c538d3f0100aa447cbb994a5afe165a47fc6233919aea800aeaee0f7a8cc0548e2e369859d0c46b3afffcc23443045e345866abff4ac6450d3c1fef3be4cd045c75129fd160b67732d6628f4c97f9295d8d3b2fd58e6ec897cf7f428500b1fec5399cb15b2c30979b3c081842b54c5574f27b8f435b222fef0dd6e1bef10c88"], "hm": "63bcabf86a9a991864777c631c5b7617"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (34, 'desert', '{"ob": ["a7ff69ec1e1e1e1e3cdb39666d296c161c702ee8fcc146f285f3df4b17033ad3b3bfd0f5125aca6a2501990760afe778e93c83f21c0f8b0b12656a98ccbbf3f476728198bcc41d5848d23ec3470077196b21971d059252f8c3b7b9264493d08d53d8a6d18c2878261c62a4fec3c3452d0ff89fe3a182eb448ece25227df0aad915421c7fcf51e8bb69d247ec01578df50f7d2b0a81182fa1ea3c86a1de7ac400ac3576e5ac018ef573a31ab8138f7538644f1791b290b210d95874401e900057cbb7a0eaf36d841d66a5e0cd39e3acfce37d67fb43837116ee2322a8818a0eb9a432eff8d8d43cf99cb79004d959af7b7f127163218c7111d7d3c627dc1a7bef3d03e9b8b428d172ce29ef19077b921cb06d2ba210340cbf3a8adacc9af07645b48107d4bbcf62b0d72375682c2696d0cbadbceacd2cd48be27f6bfe766a5458b8bf21bc7226cdb5814a4820a4f4a4051b97bd8f7b9c9ab48f521cbbc63ea3fb5756f4c245430d6112f5348eb468deca5a8bd0504f65b2e353f6df4722d71a3ad9dacad9a595c537718c6cab37aca6bc16a7f8d441b8d0c5"], "hm": "3fd6b6210e33bb046e69f256a138e28d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (35, 'diamond', '{"ob": ["1f0d7acdbc7b7b7b1eaa89b1d00d16951384311105a4751c1681b5be5fe4013a26073c32611590cecdacf5f2e59e6710c09825a9d7674e316924c77879b938ab71de1b516b1ec702f13b9999f336d046c2fb682f786e803b6474f93cb59d445e2c9905106c8eac44b77e908174fd72b451b5b983b513e2570eb9a90aa51d969dbad3d1e4c434ea194a5879049fbc40ae4de0befd1d6adc641a4b891477baf28646d651fadfa531f434c87e45557ff985735e4ce7638cf0926b3acfa7ce3e3b9748605700df045713d8f6e5b2dce8ecf82424258ec1b1ffc2e00a7fad92144b1d3e8f214c121139dd4cd735feba32f43786ba1ba98a006cc7754d376a46da3e30e8cb08bf6da026f198773e3925c4422070f3d78b1788efc4756ef2398d51db3cfcc0feab3fa974c19ab2533bfcfbd4528e0db224a2103a6a87e927c1af8b865d71dba56e6bef9571a2fad61077b9de5190eb7a95863310545e62c61fdedd8cdf53cbdcdb00c662227e817e9c4afee42464636301bcbda06cc846da064edc80e2946610262e06e189839516c9a7fcdf93ee61da3aeb43a875"], "hm": "75c6f03161d020201000414cd1501f9f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (36, 'dome', '{"ob": ["d8489d0202020202b32db188886d4b0d58b684588d42d62d26fe541e9b8d55a35b118e8035831af8641fe29434789bc826bf0179eab6165ecc2f66b1b91976e0c8d4b484f8f4809456d71094399f65da799ba39477a305133f71963548fe4a49ebfbb9d2c0d271ad1747f26454fc68dccbb57447baa20bbbb7771e91a4230f2ecf06372ae34743e68fa0fbbc4629b44260dad0e59d1b5e0e3c7d98b55d9e49e93cfeb159c87a87915ab8d615e12496c8dc31753d7e084e8cd3ec149706a4c1efb632f593f0d96b7dc70f6bd882fbef00e1b3d4e8fc35e3a8aebb43a372570725c521e98caa032bef84d62951de087c54107f1df8b5a3e10daa30deeb74ee9d55683895e9c115db2b4e5af51fbcfb6b3f8e81aa0cd64e2542bf84a6765815f03ed63a12561b61804eb168b0359c59f80e43fa6ec26d2cc19b06fc93b13123fc519a7faaa89a7fd5406dfedf54ed73c8495024159121cc0153fecdf7e0675186556d2003fd4da67d3084b1f20cdc622c1ad16ea434990f28e62baa8d3fb853d2044a0c9ee8226b50dd3667c4470d04241d56198afad8072da6"], "hm": "1b71c8e9e749753da4e8f55b029ced5f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (37, 'dragon', '{"ob": ["7cfe204114141414934430537beb15b0c9ae783713ed94efe02a1d3497a96978b037cd420bdc5826a2561bcf23fb0cd2bcb7de6679708d5373f4c2f61e87383d0ab35ee4e10b2eb6a5e115a99515a108a4e3fa019b1f9204bfd97ddfeb90c12fe8aa55039e3c37767f2cd38d6aaac4a3a41db979ce138d1f1cd359f15ab3271d4731bb279921b89de99e4e8763fd75eec1e39c4d4e28341a37dcccee6f14a098d7704676b54ae2a38c6357de25a9f4fb77e9c514747f47bd02dec71ed99a42f44ea50ecf29ddba7e933e718bead41fd8dd7208cca50a3814c1150d1df885c1690d0f1beeeae246ae532e2b74b7bc7f09789d4c92f03175d87f38d577e5a1a18d75f1effc37363dcf92ae59469b83eb6e350b219afa671fb8d0b761d814cd5661b5dcfa2ed044e62118b03ad74b194dadac1b414804d1660f14661f47db5a30fa912de9af1353afce77c7b58ccdecdb99f2953e838b6729891c75abba035491d80013b6138a29b6b0152e87e896a4528214dcde7f68b4d30660f977fe48cfaeb08e0a896cd9e59c46fcaa67709c10c0a263fdfee71f1f6b7f"], "hm": "8621ffdbc5698829397d97767ac13db3"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (38, 'drift', '{"ob": ["7c52201212121212934430537beb15b0c9ae783713ed94ef3a3f41c2fb49ccd6c191a0cc6715960df2409f121a9d211b4efe1d869f70dd997e6a479645c1b732126c33bd1ced24bfe3d3c0ef29ba87eeb5f491e19605589c3dc2fd764434ceeb17d17530cb9c0e258c45d77ebbb5d743dcf4fd34ff2579f73ae68bf5487b9e0ca236f56e62b1e896884ef1cc56711a576f8297ea75d88ab7c363fbe6fec359acfaee1d5d973f5c5942ea31bb6674086811641eab87e6ef879c3bf100d3d6693d4ea492fed494e7b4d256337d0b6b2dd5382471c9cf7c0e4554b0de729528e99bffceadc1b5456cb4f89c2ca21992fb49db4297fe229940443a667d0a38e2d2d8f982e5499f285c5ec55d00cea6984582427db4eebfe109c35499d3e99ad7a9d5862af26684498c5696ebd8e1a2b720cf1909890a817e192c8a78d4d86a98ac19f24c695c69d29dff307c0091b59fa11f19f747e779d9a40ccd40f8d265d1362c203ffafb6ed1ea8802a552f14303e67058d9479b8195e0dd3f09cc50e9257a53aa09652fa712ac707d44e3c93c18f2e08ba8fdd0b560b228"], "hm": "ce5f36294ed1e4ed9f6d27f5d1899e14"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (39, 'eagle', '{"ob": ["aeb262d7363636363c807b4da52c46d505a9c686d3b0749311c9378a6c7d32a738129735832230fb54728405e917213e71e7bd9b3e8c29951c6110e8aaeabda50e2a8f2c5493bd51db178dacebec3bb3e80e285648ac85c1343d0d09476c3a1aa9ccb4d95e2615efcef6b252c4946b0499940fd8056d0d11535585ba8198a26fe02ec614dbb617a1b048972e74211f5d5cd2a2eccd0be3706c51cbd5c7217dd261dfd1d21d876a75799aa4e5d1bbae1af6aaf626e0b61667e27ab694d07360b3e5d04bb70ab9d564aa6ad309f1c3f03e55e72324ec3db851c28a51970a7d60652814e7436ff5376226d26c42d3d609500f05d129ff218f54ad31ccead17c3734e0ff5347e2115eb8308241cbb23d2bdb16eee1ab0d2eb37653acbdd9caea95e7cac06f4df67696e28771b6d4782a7dde16a64b880ff3a1ff621aaa3d749eb950cf833fd3e4f2ea7dcb58cc3b24728e5eddb9a95f76dda1453c37e6fba423ead55e9ea791808b162383975bc65a34156b997054928d09644944a1cc53b4c13cf55a2421dc7711aa1c2e494766b2afa5686b736702aad4dca1"], "hm": "b09315ea09c6d3b5680094257f1f70e4"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (40, 'earth', '{"ob": ["aea6b2a7a7a7a7a73c807b4da52c46d505a9c686d3b0749360bb37f03434d7de47db6fd3dd0b6ffda6748ea73460814f8ed4aea35fe8af8afae1dfa75be5fe8e107c65ca11157484311b5d836c4485a4da0418a42e4b69c77b10d06647346149889f74110d1253af06005840bdd8e91dda1607bcb246b43bd99267b20738663a86a112e4ad42c057dbf09913c680f9815559bdf6dfb29dfa0b6e08fefd9ec23a7434f8ca33f65b340f43a5c18b116e2ece5d6f023395b2a677baf8549d414f90f5feefac82c3cdca4b7f2ff1172da8819de260a05c25b6b71971af9534b880789606e469c9cebec76a2c43285253ebc6e437f389cc6fd902ac4d94427ca0b3e906849635a308a61c24ad684fe7a1d24986ae401b11539fa1ccef7405d09616e7b04774efc1e481155b18a20e89f8557f318b0014813ba2a545091bafa508b4b26b1ce1bfa18f020108237f80754018f7632208f26f66a0f225c17c7c0afd71d8d1061ebedf700473e0ecb12e2d5fd1ce16b770042cce4e1395fcc9a191b8902a97579bc4ceaa8a8d52e0df3f21dd59435e4c1599b1ec9003"], "hm": "852488ddd9570bc877783bf4397563e0"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (41, 'eclipse', '{"ob": ["aeafe997c96d6d6d3c807b4da52c46d505a9c686d3b074935251e9abd299bd8771895b242922c509008cedbd96d5e1fbfbbf22ee75c5aa315ccac494c929275d1ab573b2221c1927387fb2c49c63c6c0f32d3f2546e9823bdf686a2d2294e23a7cf0e8b73b3c3dd02cd9f2a5940fa4042838ca2b1e3145a00dec453ef4c6b6de902c51f76a90bda0eff47fdbe80cb22ef46fe54e2a4df331535314e755597e6aca756011a41d7d51abe24884190d05eeb9a8e4cff0e452da2239a69ee3302fa427bf2184ec14ff2a084ab84c829961f2b98533131de202fb82f0b4288ad2cca2fc017b719726ed8efe750c685c8ac54e36787cf0bff2528f4615084f9708a0ca10cc7c663ba928fd58f49640878d1d554eb7e10bc7d75b6754c362f9600b4999482c22684486653e39419e94a229441cda695814bd7bbdde1ecb5fecc937ee1b05cc6337c88a5f52ca444e30a47cb29a61636401101a5d3e038cbc1e180ccc371bbc0f2ff8e9046e673eb8c1b1ffa8843db72537b2a591116d48d9451e1d1e1cee41859ab6aeaa7eecff7d095ba09e53eccdac83a86aabc5"], "hm": "6b7b655dd22faa3f10677c512493a8a0"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (42, 'ember', '{"ob": ["6dae5b414141414198d553c6a7b38076f2368f53bfa7831bad41dc0fd7171148f3fe4b9f3cd068cee46fd559d59515bed5ab737c886b064be3ea0dfb43e1105e3ba522d7324e26450716f521048ed0433b7f04ac7f11a8bbedf7e8e4420d534ef4fb05446e19b4959d160cd59245667f0c8442dc7498d3aa8477695ca0e27cdedbd7acca0e5aa722770b05575325ad690d89eda9f30e3054913b3afbd3c7ef8d3563083e4fb75d1c6ed7b1afa85d30af2efe81ea5033de246a33fd94f10a974550746da32a559afe4cce6a319acea81a36df1604f61efff9d8516a37ec242e74b6464d3c88ea2a09873daf686a40449f8ff8b9b1501bb7eada5f34d6048fb6a9117619971dc9d7fcb53d28de02e54eee9cb5094eac4060d78511766821c83ed066e8db3c1204204ebea4a165d5c125fd9f9a4f3dbbcf6b30f8b9f8afbd0c6ce3670e6b1299d682cf543688ba0a25b9f19e1279e2fb57f4f6076ed03608ce506cc6324b3e39437cb2201732cf52cb48ca29f2ed4c1a38686099cd4633814913a9c92b0f27e10e627b84664f9eb9a4efe9bd410dcc735c99fd"], "hm": "98e89bbbb4878ec0cc7833f0f91276c2"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (43, 'epic', '{"ob": ["c530ce00000000002cb6d1fe684856c1d963411228776125ba6978331491d8de0d0ddd7326a4c7ee9a4f8dab61c22f4ea9dc62f1bc618194cd175b6b5979542b3a2645da09c5c8f9fd48061892281d5e6f82ead287e3f9cff6b306902ca52ed56167a2809f3d17d1d65b119bbafc46d1155801eb043c67e7ab22577f17baee061922cc2e2b1e36c9924557db127da91112909f0d518dac92481591df41ccb9e9f39c1299e127dc6e514ec66ed52f0295d284b070bbbb2d90550b30d6047fcbfc94ec770d6caa690395bfeb0cbacdcc6a4ef32611a300173eb2ae4b6eba4989c1565749b06f1981070f63057ba98a7ff41db3b8d13fd8816d23ef204eb205cd2384c2355870899ce3d29f866fe7455a2dbfdd27586910afdcce347cde673d0e47ea09df9d0d1f82c52951762bdda0bc33ef376ce5612bf14e9add8f1935b8585bd2a63f2ab4b8fe3a1749bad19f77ba6ba114752e09aa04d945fc6f301557e55f3a8b1fb7dabfe31ec0c427833845cdf33a164393cc0666378e96afc1d16406d53545c6d77551c1612bd2b40a8301cf7b9f798b7aa624879d"], "hm": "020be165a3e587d7c83cb489c3ec9923"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (44, 'falcon', '{"ob": ["95cffba6e1e1e1e13ffdb22109ff8bf506f9ae8370b6ab4591631a1b706cd8c0bcd995fa68fc1b2b2f987ba2edda83042ae405f769f001c1d5d8738e85c603811b7abcc5dd6256a256f2d6ed286669c5c524a47f7b0f0116875db93789644d848f6ade5ab13c5826e93a0014b84dbddd222a586bc6776ae82e3de5cdab4ae00e59805d924740dfee639f94215fe7029a8d7d1afc0ee052bdb8da905698c6486fc2b487047e582e8f1f0965322dce3a609b94c952d56602e03119c0a6c1f4a7163ae2cf1eb76a09bdaa426fbd33b214083b8f0c6f5c9dd00704861f48553ff96558531f45ac9707d9d156676db11ed059d9a9a8922409bcdd68b707d896c4344defecd560cecb8344c70934ca312b397f5db7d6dc8452dfc67e255e230c408193e64a16c54a5c53bf4ef58546f209c151833c6f638252c649bdb4b2428a6d77c45e494705d4bf721ceeb3ef36bcb7f05232c86760e1b6f89921276801b237f10c397624b4c1e1a31df0558f6c11dad1eed973296321cfac6e398d45c3b796649d9aafd232919d2cf3afe0852606f2f8a3d30a5bdd0ad00b86"], "hm": "fa0d1a60ef6616bb28038515c8ea4cb2"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (45, 'fern', '{"ob": ["eeb430f6f6f6f6f63f38fcee569be21d1de1b8d3040269421d5a1e93ac54d1bd66ec640f768559faaae90e0df47daa56ed2dcf2a51407ec790cd945330427e930c5ef90bab256de96b1486b3623716326d20aea60b91072ef32b4e0423cbb8e7eb766682609d17a977ae274583233d1f5f6adac6b1543c374e99cd54ec7c4625b4cbce818d0d97ea68668853f2ec9e7c2caba1dbb223c8c1b7b68eb64acb66b78561a983383d37e77604640c0c2f6732cfdec22980eaf1ca7f64d409e9cb7cd8bba96cbcfbc4337de1b2e24cf0d09bfba958b90196cad05c6d37df28b0ce1a9ca39c6f54b42040355f20e7da81d754d0b1beef77abc5a477054e5f415a574147fb395cbe1ec5120ec8a13c3bbf913e5c72993ed0fcd5069b84fb0cbd6988d082aa73ff0f2391ee51b70ea3ed6df4d82c3e067fc04dcfcb923f3200d89e7df4c85b6ff666ee0a4671f43ae654b2b6b8a46e8d71413a57d5b8ba639fc1869a007797688edaa485699393e5e28186f3ea524aaad57d599387c4e0230413a96f0f5ed10e4dee631333769f2fb9eda005bbe696c37166b6f8e81f"], "hm": "dbc3af4bd3df34270247bd7f58fec14f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (46, 'flame', '{"ob": ["c8fb3c8605050505aa2887858787cc36e0e83492773abc397c2f765d925921f50d05895e171db302655f891e8fbed5907d3d5399984bc6bf9ad1a798a871b68022d8651fbca2ed9abc11a81e91e3f551923f062101397d9456d6d88e808d08f5cae8b7724cceecaabca2dc9ffe6b04074d7a19f90cbe8510ba577aafaa4d27bc450c0e34fb5cc4548975c507115e611ace175839f8c361828878fdc7dff45e0359a036be5197075608bfc3a7aa9f2c19b4a1261b0958a2e5ef6bc856886ab71df35ad52813f58ef62e620d0ea0e2235e6fa9ebd950595763129824650d804489e842130a4131f45e4981fe03e9d40c14e7c981540befdd25234e23fd0853576e9806c523af6e478e394fcbf866966ad68d3d44b2eab4e0f907ef46e7d918fa4dfe30f89daa84008109b06f05dfc0f6bce59212a066fe03180afa3cd49d67d56591af7c188ba760609d5912d0570244624b8e8fe532a549816b0bd865231b498a6169b2ca8105a64b911d09593d4744a6ebf037e5a7450c591e36c04bd44ba04175bd0d17f1801e420d33bc29cc8366d75d61c36ba23c44b7"], "hm": "599dd3c7d37cb5e2d5045b60c9b95df4"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (47, 'forest', '{"ob": ["c867ae3cb6b6b6b6aa2887858787cc36e0e83492773abc39a19e8538a9c7c260b136e820013a5711dbb15ec3781e3133d98daaa85b83934bbf9a15cea6e291af7ae7510d142a0c98561ab252719cdc5ee0719b26faafd7a734d21ca5e627e7e8a295813cb738288b8415d64ef707affbbfce9905b1ec2ea6fed1364e46b0ed9196f20812fe512c2b581b88c47b43f96eb22be74740d190e64e08414c8e97f849415c57de4b60a67a2421f72d30a90538aeae1837c0af39a0eacc3017f896efc8c07760e15381fff8dd028cd0465a3fd9e14efd4599845d712b4aa9bbe82bd1d7d99c3bc293eb78167c29882d32ad1468401cd8396fcfb792e1d447e3ba85d579fecb3949b5fa573a21d5b2747b7c67aab215cb2d8dad0f44e4c2ec75a88882657509d2ec0ada59ce397bb1335dd03d3a2c9947031531cae8d507a7e1abf7c40b96d403d450d1717f43def79d5eaa09f4e0f40f94a162985ecf50d9212c1f3b87f001f972f35a7490446bcd193fa9eeac369cc46aee7031f789703355aa6fd85be448f4fca186d555748c0aa185cfd22c67d6e3ee3a65f6b1"], "hm": "f379cfd7a55b621577a8389d1817a102"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (48, 'frost', '{"ob": ["4338959f9f9f9f9fe2759c6499e6204c999efc594b0560918de1e9eb28a0d0b0e8c93d9eb3aec55b1593bbb55c104da2162763cd56d0d632fccacb05dd34befa65aae6b01ada963e4c55a93f06ab7ccf586831f6f469e5198e006f86588c929b275bf3b703eaf854cb0bde0f82446b0b3d7ba4fb172a9bb165de62e37ac00a69e7d35989492e6af821d6d144041b7876556444dce8233bc34553f406dfbec73d8ed2b21a9db860cc0659f301e74df4aebdad99f0b90bfb50d293e8e1ad55685a8c1008e533f746d19fabe65c4bf83f29e4a9e2b71206ef52ae6ba1d0c6cbb98eb42e3e8924f9be24598503f6ba22dce41d9861bb582d40f5f434ee5ed85e8c382d38a4fd1b455a4f6b62c657ed6682124d9d85774eec9e0a0b5fe4719b2f9aa1e47843dac8781759944a82982e319ed24056e0dff055f67367b2d304adaa24404d79a38c8e5e0084fdf761da03ae217c1579e5878f7834f0f2ae5206d5c5173bec571db8267627331e724b9082aa1a2bc9c2d2c59330aed32fd48eb3fb926709f07bd825122e699ae342cc11a650b3e208dd836aefebec71"], "hm": "2b82477bcccc369d9d8ed30bb1200803"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (49, 'garden', '{"ob": ["e588e082a7a7a7a7f040b82eb4ec7e2eea3617a028b32009d2e4c8c8aa197b668f2fdb7350c1bb97b76fcb09caf9f3c4e9c6e6ec05b09941fff0a22fd60a3f175bff11d49072cd81c85afc2012f214722914e74fc641b442f7b18f0311203cda9090f7994c4699827439c7923962db287290d40be9db4c0a6ec749711d4ffd56513f4af79f8079e6adbe66af45f6b45b8c486c9ca8affdbcd65eb093aedd0821fc43195cd4ab3fca4b99f99cf02aaed760c3985935be017afd43bafd8c1f723fc4beea2401606cf8d8918cfb1f02cf9c05ab3539ca7f5707c4fcaf4569e7b3f706862e33c6daaf62d985468a0271a20d049109d9d3baec679c7ebe424ce771c9db9d143f4c344b8302ade65b4b44913c66423aa341f25b7757222718cd037b9408ea4e03e53f599625541d24f0aef7121d961cc037cb58ac0e83dae16a88c850ca8c722c82cbff207ea6d78899b83991c1bd8ecc334bf4b420788d1cbd58991a3199dd1c641f130126717acc7a758512c4ee277fde446f902094ff632c6a2774a6b79f1ec1004a5aac98274f11d58046e01afc8f57ac120a"], "hm": "e2704f30f596dbe4e22d1d443b10e004"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (50, 'glacier', '{"ob": ["09c08b88c8707070fe63773d7e573e3eafdf94605542a112f5dec2ce71d8fc2c1f074a77a45480d030ba9684fa1397152fbefbb36a1fd355e6abdd3f76cb938d4733766922d302aa4e6f2fab642e2107aaeb77994d08dcb48d39900adde41747a5abe27432b64c84a3722507267dd4fc79dd5db3de00bde0ff5806ce1c3ab969f61c9ff8e93d4ae63728328513dd90c68da3255db4897fd148653eae66ab53218b7970c550d6e54d30f106b798f12ced6eb730125968158d177112227dfe18c66bc24be0d7f9ab5143474c06f4a526198b5351fcb196cdc811668a9d824f8159d204c5b61e57c42f6beb59e734f22dd5b62332a085440b310fd36a80f15bc2d16ac50cfc9ba4c5a2893e37557d01cb2557edb578b7081846cc52183057c2570b00d5ad62847e00ec9231a7324683ee971bdc71038dc12488dbcde5b3aac85aa1d8f99164a705e521776607502b56af62add86c6630c0480bbb9a878203f5790ec4f03b9d1d159bb14cfd47383b9cace002872cb8686137a639a0fd2f749d9e515ef85004d8c5bbe4a74b9f0605225b67aa72b8104f023449"], "hm": "4326f5fa12ca85c921c7d3278cfd68d5"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (51, 'globe', '{"ob": ["09fd124fa5a5a5a5fe63773d7e573e3eafdf94605542a112f80ed62177c587b96a9a1727f3a97caa7a85b1c8b11d1a93d58018b36c43208dbf1adbe488afd749b93d3f0204de4fc0b634ae8b3c03135c540f422f6a96d3b705ba91158dc609354c0e8960d4ee813448e9817e9460bd3862c02a63a3c7cd482f56349b4836087969824c1db6dafdc3f63b6b6b73afa9d98e54650d1768960c48dba59df13ba81e41e14a2e0d0cc817609453d017737dee9c8807ecf7af7258fec26f65bfc6144f02c89fbe3284c5e5625c9330332bbb7eb76b88ead212029f88cbd8322342672b72c07a54bb05bb2eb91644cbd73ed20677da4b80e0340938de1132453fbdf131b05b4ba067dfe7615cc72419b1211d1591ff36fb88d3acc2e31c46fb1d3f748d58fbe663b8832770381e05b40a0bd2f092b20445cba9ef2d49afb25967cbdc15c7fdaa05b1a853583b8a3ff056fe61eed159ce6c6ccf3d9d5d0fd8f899989f57007ac0bc5f493b6c4ac690654b6feacbdf0d143dd33a703b49ab0b9c39e986b919065fa45daf0ae97da1763e0085031efac937775bf28610"], "hm": "78f9151935d912f37259b72c2036ec6b"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (52, 'grain', '{"ob": ["5278a44b4b4b4b4bd49f1eaa089a5d910eecc97ddb04f736dac9aa901dd893bd5042b951273fc428c1eb87ac2766233bb1de480865d40ef5eb08938c5dd0700df3202b63fbf31d5196ccddd01369b50fd670d7ab00f7f62a18bd696944ae2f9d72a038929e89aa324031e0de7c590ec3b0ba163ee18ff658cb107d0bd2c566e451846fd06676c2b8bb404848fe4cc3f86c2990df1543911017ae11540f4fee895e07bb870c1ad2ef741ee725c9f397de2d6d573e333529a5e44550ec623619e43794ffe7e04f921c15e3d2ec687a2433159953fe9b0ec2fcf5977700887e128a0b3e8225dff448a019ff03b750aef036c9fac49c0dd57139cd25e6d814df49f9376acbca2629b624c6a9a9f5ab97bf03414f3d0829417328b1a619cc2d92ecd24bbec4c9402827f8489e7cf185d435990e5018e9bd3f56385a84657eea759ec8b67902de6d30c84be3d3d66c2a5b232679c026b618b4005b07cf66c0d2a93936f972edea3746a37f4528baf3c357b3adc2e30795d869d71a436b75a87602e221df4467cb1590a7f3975d669261814947b508a1d60e05eb2a"], "hm": "c773063257201c66448c8ff50bd4ebbb"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (53, 'grove', '{"ob": ["52c04485e4e4e4e4d49f1eaa089a5d910eecc97ddb04f736447132382bac10a5761d36c1d50129a2ed422edeb247605a2fe1692f62e9830f09e881767f6ff77266dc1540b643cbb1bdd28d89c5c49567d39927c37696e91b192f87f5fe699b7413f90367fe2bd9e08727758730e1f911f7a92160cc95da33435e3c5ec6393b449178dce188c76af2e38594ea6ef50be2cc94d57e4a3c4b49753e75f4361f8a2a295a006a46f85d071af924baa9c61c685e8961bcf01d1e825f91115671ab0703f4377f52d573f29dc20fa038efeb5a50db1898037ec60537c02a5a8e4d2f23a47475cb965e97bf3d3351df2d3dbbc584bd0e9fca9ae7d5363c8a57ee6dbd96f4e7d049f0d22e957ae82a93b771ebe75ef2db69845ffc346f6bac377ad69cb2f849d36e17a4a7d8b032d22bca408bd51d541977e84dcd83d17c13f0c1218564565231167cf5031807d71cc5ff92acbe57b689adc965a32244fb3ebd97a090e35d4adbf33be45d65d62624e06f9f831838a9650b9f0192d5bf00b34550a997ff656ed17b2f18cb9e35112e69bf22baec24ffd7523fb7dab72e"], "hm": "0d559e519daf758269afa7f35cedb103"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (54, 'harbor', '{"ob": ["bc191eac36363636335058a5cc8fed09e8fdf5778312975441a2f01de3ea65de1ad8e2c2a69c077ea93c4d24eeb117fe331c6425c607a88face9a9c351b9168232849d7622723bac41066568fc66c03a96d5a030083068ef49ae1ba8c6ebdf263ccac23805593e6b1aef6d6b8c3370610d94763de959f5d31d21f26f2fd12e9bacf233e906760d7e0ddf0c32b137160c776a9a0ca0d53272f9f9b8abc02fff286d5e7b9e47250e7da3d335d6a6ad059d13ca3dd5990fd420c9b31ccf0decaaefc8bd623bc03487452c86d0d6a8abcfa5e004d387dfed8e103b5cc84df9a0331a72e43f67024e4307a2d3674b204019515a1f01b4b63d986f50006c43b0b53033dcbad8ca4403e47efa781572740a6f9e052fc2e88fd76a54ee6c2757625662e40471f74714d2465f2e95b881b501e36cfd97f4319f36e88b441bede37c29e5e4f1859290995838445322250e4b99cbcff65faa49977764fda8a047da6d72df5eac8bab165317aa986decb696e34af42702d0f2ae243e16c4d89483769b20f79bee31f3999f79a38e08a7994451fc91155837633d4a42b816"], "hm": "a3f7b4175eb3c1da2f477685808422a5"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (55, 'hawk', '{"ob": ["bc75561616161616335058a5cc8fed09e8fdf57783129754b1edd30b70a58f840d386dec9ab4e7b1a73c73a3ba37dc2055c6baf7f0cd80965a79d63a2f472d51e19e0e910afa5dbfc118384b03e02463d973f56f317eb2c5adfdcba197f89eba4855fe55ec3a94887aa2c69b86e0159967d5a6902fbcf1a7fd2e5b24ef0cc6558ce356516102375e99c0ce425f3fcbeaf226beebcd908b7a595cac1c6a762b086fb8e2cd7e37d1b051be1a45a727899aaecd86740649f40b0b16b9cd001ff7eca60971a7c715cf06229238d052d4e0e84b5167b537f37f7ebe28a1f78ebb3df07d5a383a3e560f7df3daf3078b78d3a4f45482d54a932d3f46c60ecd44337f54dd1843d39fbed6fb8b3f8b3468e4af20a25da19861a02df28f877a63fe81066b21f5b4f626a3903a370e5fa2af48a0b8bdcf19b44551abf135a2aab49353a3741a5d5790e7a833ca3f9985082995893534a7f4bf1a954b1e6b55c49cef8ebbf43655d7edcd27615f6b853f79b3b7de7aa7cf086115c9525ffb5383ceb26ca314d22b836feff500f6cd3936b0ba65104d4d1a10579ce0312b"], "hm": "39ec785d60a1b23bfda9944b9138bbcf"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (56, 'horizon', '{"ob": ["5b345fd51c323232ba202d0487558727487a64dc6be293c339f3964833384b7ddd16f2ffd74a7fbaa084fdb586b95c1c11d092f561f3f428df0a93c9bd8449321ab8c61c4f3f1b807e96b8c6db3afc1ef38cad068b45c0a573c3a2d4f1e0d86240ac52761933778a241b2fc84994e402ee4e5536404ceee3e04ee911f50a97b0744a9d23bfa1b6db0d9018d89d713e384b12da786d954c44a8e0ba28d45e6f71db06a0e03ef3f3e85bd7864de45d0342d24ffef6d0cd094f1850f9f95ee8f0f448c9402b977d045b7083493ebdb3ecbe2e533bb24a0f5d4de3ff4b3b6956df061aea1254b788449ec976b01fb9209849e674aad47dd71892433b0ed7f85c4fc794bd213549baac83f2e0fea9340393e7599dedf568a0f931b99a745c421fe7825883d2a386cd02418d316ed9aeb0b87f9ed5734b2d554e7221d12d067c0503afb7046b7f0bc9d94217a5205a0731fb1089f003e00a55883611fcc621e32724c4cd75ecc03815bf4cc4ba5eb39f892adb34cd40b4fba929005dfc39484c50bd9815d450dae678a29417d78e45c4590406143ae90d79f26076"], "hm": "407e3b6b8b88aaf095f15efeb865efd6"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (57, 'iron', '{"ob": ["019343dddddddddd8f411f9665472c2602e690074610ce26f6ef0648330cadb65c844e30c94d6347bcc8c14d54a685addfc851d0364861e7d600595d8ddd16e9bcdc11bdc84017f983de35aea4414b7c318ddea3e672288cc9a5d1d8f0305279e78ee31182657d90c12859718e00c49fc356bcee5c58b2d8eb7cd4bdf029b27da5a18a9d329f52a6a975348cb329d9761e765d6d3490a1c040b83e6f80d9ec978b94e82f4c2f286b7fde5018cbf46bdb2c9fc35851fa8c07f0cd8ffd4251746a6cf270279f4524d28f02c2a2055828c320d73ba866dd0aaa8edef7c1ac6b651a25aa515c3b2a767c76592b759683982df36215793fc3c7675e48cea76e0d2f5fc89e1b7976e1728b9e3c1cd7b60bc5e012495e1372f39cfd31550eee7644a1adaf4c489ddfda6da80ca8b786b95a8ab58698370c7013f031528df2549654fa88bee5aa3813047dd4c95954999fb1d34b03e5f6069f87ffcf6f56b5588d1a44092266a22de0457481cecab8cb5b9c6be00973908def98d34ec17845fb7e70c754810750151f5a8944181037ee4f0a593430900bddf27c3443"], "hm": "bcd31c714bca2c41ffca31bd03003311"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (58, 'island', '{"ob": ["01596f03666666668f411f9665472c2602e690074610ce269a687d5517dd0e4b84f01b309fc0bcff60f7b5a0757b7a75fa306f373d4fa9076254d197f72d2d45f6419f0a5a314a74a8ef0e2460d26c3635e7c667ed9db27a1a6afb353e7a1b1128515cb59ec843b71816cdc152ecffe5647e5b43e9833b6f71ead0bb3cfac07c3127feeb000497e38ec8eb7e91d80a2135e7ae687947f7492bc939ce028e4ce219198a7b26d6383dc444b86056e6039ce4c2a0789c4fbba31dcc10023adbe198bf05a0bfdafe37f00ad50083de9ec30dc7d2102f047fc7f748f3e12c7368629189f3425328bde92360c378c41c1ac9f126f87b0068358cc9c817b6a83e063af81e2c11564ed882eb5051f9ac5da04fa576b71e0be5971a7993219e22b20b12aa2636d17984a0fe91ee34932f3aef4b98486b9906e0eb9f44ca1c4e97de634b5062ecd3554aceeb167719ca7faeb1ea309115a9aff55a336f13339a623e98edba128100928913828461423bda9d2ce52eddba3c934de40e360ed175d8b9cefd47684d37a29c4b15749f972604c051d07fd544ca9336146066"], "hm": "3dbacfd76b0a040ccad1eacb20def4c8"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (59, 'ivory', '{"ob": ["7daedade43434343702637935b1ca7db9e0b4ae1936f2501b242f6b8f05848501df81f0eee7f06acdb73f8296b3ddb6970a06117d34c830f57b061d25f76158a9166fa837457afecdafa3cc35854cd4e65f73ad4e2c88b1cffffb5cf2e52c1f798979edf290fd72b9414455bb1f9a543c9eb38cc9ac96ee83e9cc7efacf639395ef0d3db1054e5d5bf38273a994629a62fa42d00b33cde5157dc7554cea6457258b2169fa43f19819fd337b752f853c630be33a0c16dcf82eed3aff1b859012a5cf86a6a9e6e5e3d3b0676dd7578d39411427e1ae6218058c92bdf5c6adab3c9d03882d2f5f688093f75d1b3a69b79e0707910a0d1de5fa6e17fed24f41b494ecce1ce324d6116aa648a0254299c03d5e4417d3174c078e7daaee316668f38ab24807376eca26b6ea3ef0e00f9b4a031092922c3a24bfc0a98cd188a772a8c3c8d8519311ed54f22505d624952919ce177456144ecfcf2c424ea1f26be5b59e129e988e4a0d45d118a5cc7ac497edc9dfc6846e90027bd1d365118c857190ac3bd8d61925424c866647c70fb24f250d4434cf593e7af76ca"], "hm": "c55c68625ca1da0e1d4a922fc8cb373e"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (60, 'jade', '{"ob": ["421a689d9d9d9d9dfaaff1e2a2d3aa6ea5808087a60f5fe00b5ff73f9dd1f260e74303339e2a78fc6523553b129242d3e5776b498dc4f8dae6137a3f66e90ee6f9c37959ac2b1a903670ed4d02421e78238a36e7766323ba504d0d6242f3bc58e99c81d5ccd2ee3fe10a4e859525080d7177446ea67f9379b83f4a86d690236fb9a6d49abba9aea76222e1eb54f7286ee4db671566e60a080c1b8d1535dc68edf8b64a3d340a5fb98e8cec16c476e34a309773402f051b23776428bb571cd84c90970289dfff30f7a88ba676be4c8c8805079f4608bfb7f3f70abcb4c681b47949e9085d314e9dcbffc8412289e59b03c640481f6d78b1d8d76298bc53fb253e9930e95b05023ace8f89e579b3e7f7ba6c51b1416b8a6fadaa44e1a2c462ba9eac09dc0943c119abc292758725eab17c903fcda889cf01d95af8465e347c1fd700aec25e293ea5a71e5d68a359dc6e7a1dd5d77aee6a698db4f7a1ec96d8d56c89f61381787a35216d8a57b0b64357974420304c2939a74ba3dee8e5149861655e5334972c2a14efea50d313b44d5cf1be6b394468b0cef4"], "hm": "bf17e568257ec4f32a1128167e882312"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (61, 'jasmine', '{"ob": ["42bceaaf44909090faaff1e2a2d3aa6ea5808087a60f5fe0fa65d943066cd97f73159cef8f60e9e0978661d82eaa837687de9c6b9548ea4ba4d111861de43f797da7dfaf67ef43e7237eb103ffe950b3b52c1d278b883f04f05c3c85033a052a6e59376fb18eb856ece06551f7264a8365ab5858eeef19f51762cd496bbe826f5a484b86f1dfb1ff894daf043eab16a9e22825409c8a84e8d8921303c53d65473c7638cb83d5f542723d04176008a47fdc1a3eb06a7d6a314cce5d931f1fc05d4d56562b7c2452ec7d99c572f995cc7ccc1cb4ab08d7cc0a63703d9038e8a31693f98787a48c377c81437e8c36e9f329d03eb2c535dc81d1dd7a52fe7bc97172480304948613a065efad36a6f72d12bf6673d6b0216862de751970eeeda0ce3b1c4d24ed3676cf6e828cbedebb4b0127441043e593c3616715d23fe1c4f55c62d56530a1608922f8b2ab301116d957bf8ebc2ebee5b03257e3c8781e18789cdf4c455e3c7e129711469b631a438be4677a142663ceb79e208ecfa785823d091b1a62338bab6c3f880ceb68367c60094b152058c04dc42b02"], "hm": "f21c0d3e564c7db5ccf73c095a0b9371"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (62, 'jungle', '{"ob": ["99742315797979798b1c716a1bbe7bcbaa0c97cb2c2fcd3d233a66af314305260612b0927c634421a28e7ab6bc9f4a1aab4d85cfdd01c024f0098d90d2d175788c4610257f0dde1e3fa3ef0d74c43cbec072d35a69aaaf0261150344d447e6339db045f424a0a5cd2a8c4e02918d1ab1e3667853be544bd64bda590973854325508e5e6c509ca7c4d454a2ed5c8da73a6fa1caa52489de327e275287cd5849d943f1b1ff9ba02d24055fd25cf421761c8689c25b35a59dd3d61b2ec1f06a0965f660b924cbb778b19e65fccc1d11a6401f2df761817db3cd1c9c27c2141c12ce2460d1a56d1bf7ef4dfded36e28226d5d99fc38f288994dc934e2802212adf3757dc90d148a4f2893d9b9d8bbf32b05f12faf3375e31cd47b13e208e00f7f55807aa6c451e07af55370d2c01b94f4968c198e04b032ee6d06eefa0450110058313e5ebe8c1cee64d672f32ff601d27a18f3f63ec8bbfe04984efc156317d306121179e50f66a4005b3939bf81a9baec9b986bfd347cc3639ef55478399c7cf3d13526e731e24c4a0883a2a75fbd656ff59688cb96ca9b8ec"], "hm": "5d991220a07e65eb7ab854341691ca7d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (63, 'kernel', '{"ob": ["f749fdd3f4f4f4f481bdca4c03ce93692617054ad9f1dd4a6db0d1f9d80b9682ea0ce0460027bde10a9d39e1b39a48607830efcd3bd33e5f2f8ec46024bfd17564964c5da40f34ffb2185e0c1ac9949948834eb71c670c29ff12cc271bf18c795cdcb0032865b1b2fec2654090a661261584b2d964e6f7856481cc2d9dd998e63e0fbf119b8847e40004da13d0d3ac92018d9e1273ebde6a0e3284011c28d3405e00f29ef265b767dd7266a7a255da0edf10965e9ca393bb189d6c6ca62707cdaf9819bde0f8a92f127f8bfd50c30f35e30a46e6ba55260203696c8cbd03527c1cb5d9eabe2c70a7b42a5fdcd45c8ad99b178162aefd57c907b27c059cf715e4416c515ca5d0bf33de17e1b6a0ef00924fa42cdf463ec3df5436303a928197cf01879327a5e873c22f82b3cc92161df221d3868bccad9ccfc1b6119f55a273dbfd823a8f50aeaa5aa9572f10bb8a4ce68c8723f4194f6bb788066632a95203a58b2bfb1fa3ec53dbed283dbf55d5aa282252954bbbfaff080b39801cf46a08a850088101e684a21680c834cda2558938fabcd542ea2b4ca1"], "hm": "50484c19f1afdaf3841a0d821ed393d2"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (64, 'kite', '{"ob": ["79ed3dfdfdfdfdfdb9a0a31eec17866f253af28fe6e67275dc0881620f41b1e456d130f5829fa36a9c0656e58011d9de4509ace41284089263e6bd9f073206d8580a7b7543e97994743a2005c3f24017d797465f22618d7d58cb6e8345a3aeb0e39292205d79116557a27853cda2944249920942a087c71939c869be93544af1d745c8ca6a5f7ad44a813d27f799bfad29b000e017a936fb58397468eaaea07a30314625f00bd15810a09fe587b2042ee0601316167067028d8fb244bd3d7b23f97ba52b4d2f146c1f0a49cd103bcce0a41e521eb02aa25c7c7c262fb65a2727f0dc3289ac242638f8bc9c209ed172164265268cd872dc0dc5b559efb5decabd98ff11292c8c08056fcd2372b1d73f2d610987b7d761f2d72616a72f6a370cacfbc54b0fefb69dd2d48908b6d64d36c6d7b424b3ec0d8013deefd51e2d982de0c8d472274ecdc8e520a981084e3c236326444d03c76c8982116132ff65c5d847ba59a7ed9d759baa8d43234625c556246a6909ba1d0b645167a54fbd28377e1c66d1b26ba2b1981cf4da5f2d460be1fc2936cda92bbbcb96"], "hm": "4781ac9273d3335229ca90e8e00a1c71"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (65, 'knot', '{"ob": ["1b581d5d5d5d5d5ddd8cd13b746fc287a5ccad6a1a7df89019e6f7485fc78d1fb28e4de67f6162a4478b0ad2ab70bd66444425184b73d16a8c2b12d0f95737ba45749364e1347705fd637f3fb72bdce0b9c83ae6a16dd53caedacd6e6c56426893572cf9adb82f9fe6fb84d9b0a1e45f461c3ff32a1107910aa73348f31568c3abfcef7f3751643f14591cf5ded57c3ccc20ad6311c7c92c6ad0db5279a3b86cb8c3e96f5978d7e8376cff3d8dd23a9cce5f16aa394be60aef8e83991048c1a2239847532df8da2372006b0dc2f5e5262fb3a63381c307aafecf4136c249a88ab8cc5e6932f2d2a828cf1018e1d431d59a4460afa4f88dd702f9c17895fc5df630bf0f44e8a6f62834bf143c975657ec50f65f39c4db54b543407f908bd445d6698727f11f8f93c9afc7f7b7294cb751c7bb59f663b3dfc5b3960a36ae7af4bae83f447ee3a84660bb806797bec4677c7472556bf1fab881046fd201816642f8d19a7c5f18823023a95b68aa85daa420635b1727d85e5539fbe5a159d294e1be76b19cdcddc2de987f5aadf089b2ebcbedaf89573d0852c9"], "hm": "eba478647c77836e50de44b323564bdb"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (66, 'lake', '{"ob": ["3a68d9f4f4f4f4f4d96318e2baf710c928f6c95954654e6c9b36475e0df358f9688d9f23aeba6841852c0b0f22f7112ca4588ef07803b0ac55db9e92c44e50b372ad50f9219e54868a5ddd1b5293ed8f2d60b6304c447430a4802328c5e7b940ab027883e77b8b8bc880bd51bae2e830f04e1aa6fe1087f8f4383d0bed2a7e519c07d3fcc9f21cfb008481db4640e60850c635b1b74cdb9ed75ab51c5ea7d569bcf3419aff75c49b17d13e4d46044485ea54637a50ce86bcc2e2b0f26f5ac6ab6b3df5f1702c3777a715877f0bf49f38461b033ec9916f2a256bc648ecd8142d1bc9bdf044537a0bdcabf8ca9ca7df8356c17b20764dd272520562710be51c0b7cbd4afa37c2f5ffc2b909ca0ed25d4ecd15ffac1a2696a8babaea4a1e5d778a8d181b67ace9892c6c8df184c4c3438ea319e37c5a5268057c9e29a4365a3d183cc47958354732404c6fedab35b821c1b4b17653a019e2deaffdbd4c5e7571e0447e1fcb7e8fac8efc57823a8ed9739cf9bdeca613b15c0f12f8b450a72368415b56e5eacf6a61cef0127a94a8642915fbc7cbfb8c1e632c"], "hm": "97d986e2afa2c72986972e6433fbeaf9"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (67, 'lemon', '{"ob": ["4617f61515151515880140ec7f5bb9799d132e906f79131a932482a4fbd0810a13b963a2ac7343e0898a025819cfb26ea145a5295bff3d4695a200cbe635589fbfb88efb68c61cf0b7d5274d9a9690177c1a51f8122b886847d728cc3bd6b5f0d64a8dab210efff7d9621a7610ef8bdfa685ccc0e25581ef1933da9d2e176a236f030c9f008c42c1d8b806d540e5ffe5b19a6e2286c56c225f11b90731a9f85291fbeb439eadd3ac137192699b9dfb3206b0d356028a7efbf426eae17bf57797a62f59cd4429570c88597b423f6e236f925969c3a074c85ff4aba90d75e1235db94a19706977f8aa18780a02d20e61be56e481e3184c88c0d7d2d468a170f7bd483f95b5a8e027b108054a69565f0c6dc4bc470208b7f708e31b4076d3408a7f64e98b821d4d6c785261be26e1ea2fea326befba924bc137fa86f267f1cbd269902c5a3c98559742f307108499e11ebed39f9770bd0fede6905391c22f1c69da3f8671bac137de5986beb34b14d1c31d4025c3cdf2ff52571fe5c0bab0e9b9669a0635392fbf9fec8e7929f0159ec9f4e9253f9cd44a989a"], "hm": "3f24e567591e9cbab2a7d2f1f748a1d4"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (68, 'light', '{"ob": ["474e6eb9b9b9b9b9b4096b75a631bdbf96589d81772db14ebe58f2ea19c222a0915385b7e7579361ce86c1747737d4dee433cf98e7e426e1251346200ac50ef8fefe5fd4e0f844ff4f209035ca16958afae820640fc330b21c6e284bcbb50dca5babb0d5ec8affdcaa59f976676731738e5343d1238fe86722716a773fc7085e2aa145c100003f808119e7b4a1655016cb2dcb38571e4d2a74c73c620f3dc1962f90a193e321cfbc994ade2009a1f1b0f483ec5185f9586ed3de93fa7cbfd991b5ed116b6616e23aefd208dedf83f7f4d564121ed9b714a77f04ccf48f53835ae61009118461215b227a6f99c2d8862d5473c537b5f685747b132b8903d631382b02d2748887e99e253af2066f0c89ee18bb4a026fd6683efaee709d5a8329fc1cc5b51c819725a3b799a6ee82b5c17e355a0b5479295c0a5b8162abb8919dfa7edaa51423e6fe81a62387b47c99ce43cdf16524e3e5ace31bf0b76329da3bff42bb2b1e5983a4b98d385d811663ca14135aebf5ed767dc5c0f75dc7750b6110ef056e49765070fdac37d7077b25e30bdd41182a520e3f65"], "hm": "2ac43aa43bf473f9a9c09b4b608619d3"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (69, 'lunar', '{"ob": ["33bdd704040404047b21c33072fe3e21151951aa7e8e345e12ec2930c7ed82fa8795f829e9460f6deb1893a092fdf7f3d9cde46fc7257f2e00ef1be786d60299a705c4f7aafb2b7b725f6b2f8af7f1e85e715cf8a6e5ffc673469ff0aa27c7423ac46b960279c72223c249d1bb556098295adee43acb1c3f3ac6b206f136d8c4ef7a9478971ecbafb064d7bf0803c4c6648c921e56891ff215ec5b0a6a69ccd6a642c4cf698969f8abc270bd83683cb8d36055f7fda6228afe05626ec176b2a4e18944e1fe074aaa2fde6568c23de2eaa89518ee318d5279618e6cd15949e6ccbcd157e97dcccffc7a428c88871fb6538c95a0a319173e95d955b50c39bc8c0f9883d1fe004699570f9da47c640ac67ec5d726f9a1dff1f10cb0448c469ee3c447850a2d61e56474b49487e0c25f09fbe6b841f939c0197b33b53f841399bc947f0e723451a9218c46618dc650ef6b90aae8ef85c60f39573eaa65d50dd33beacffba5c3df94fc2e39e20af8b35fcdb23c5c2022d9053f5a054fd04984937df9425c565545569b6d4aea49d4db53b3185dde8e50a478f1ea"], "hm": "52d8ff47e9081860ed7db5ba826a8ff2"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (70, 'maple', '{"ob": ["fd089f39babababa0ec0787133ea2c54810b7d0929ec3dd947e0194e0987d83ba171ebec4becfa896a8f8f6ba4990b0bcf0e883693f3c660fe295aaf1c9458457f90dd1276c302bfdaa217399208bb968fed96458b801aefe1d56012a474bf309154ac67787045f966d60edc5c2295f628197fda48a1bc216878e89fd0e5a28b96d66f7a448d19a4b3cdf779edef9aaab425ea5f0428ed1496481ac50c1ca32025684cb0680bde8cebaae8f0925cf72b4f8da0e87b3326bb741f45489d7e2425d1d1529c76cce1989f38b54e19690c9ef7f0231de92559ee3cb4f0310a6169faab2cd9b44db9f06d7b53e07008de03643fc48f6bae0f2bee5db4a3c5c80645fc56c51968c153c4ef427c1411430a9ec336e2431ed6adac14147403aa24f0d86ad80a9428205b16266d4e56598ebf1ef6c6e3b92c38cc6370c72246585e7510b86a942d0e2e56c282e8e0efe1a62b222f2402e14fd6802f7dd62fc2c314ff07c01410d81c558b88a06e6a1edea15dea277da25c0c364350a981633a8de02a5a75d20fc661a24a53bede0d6139ce87d1703d8e47b08da87be1"], "hm": "deb2fb335003a340d5b2beb970184456"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (71, 'marsh', '{"ob": ["fd511af3f3f3f3f30ec0787133ea2c54810b7d0929ec3dd96b80e520e86941d90d396d69c28c89c6b24ef70517f5dc41546cf1749e03214e0d931cedb073e97e2b01313cd33e30d2b32dc74abb9ee4414ef1b576fc6b128cd4d321f94a85c805129fe4c773b0085d3eee7b0dee1b2a0467c9bc3f05bdac1d8dc5d1538d1b70c42e80d6f535995d9af222146092c22afe1c099075d42347a55b3f3c88d9ebc026fb8e37c79324fc1674a26330138b140d167556341191ca1ab6c8bb8fd35e61bdcf31be8de3b2f1444fff79dc52144f5f5416f7f21a274a9041997804c9edbb380f0ba1e6a814177d39d576f77e2be505478b9b9ef24d2dfc76bcbaeb10d68dc248e83c96fa2a756d27f3f9ee6b39db2a70021e29e3adbc861dab67abc28da0827bad88f58e8868d50328888d61c5ce02fce760a3805203db56d5ac42cb150446c1488cbdf7089cda671d37b2e2c132199272fd3401dbd6ffd18fe4bcc21b34e53c429d9b274369703f61e76f6177b85bd7320f59d6fb7e3e660145c9fa4fd3d4a456c3fcbd5aead2446603daf3a8978751f47240d3404628"], "hm": "d3ee527baae384aad8ef4ba0e308da7c"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (72, 'meadow', '{"ob": ["82602bb678787878461f67c7097ae2cad65b75757d55b91f1c1295823adfb5c10d7789644787cec3672467aa3e710139e0a55e3c4c192b2dd742d1194da8304ab468348e7da5122d42d87b3fbdded376e22923ec259bb53c1fe354f05abfd99d96d1af06c242ec446b3f202cae04d82adbf1b44e0aae5beda973cfd7c326357400d447d5c191997aef16ef5c282a60e0bfc1a28be5759589dc81188ea554852cd5961ef8d9ccb1e09a9ef9244cff3ebc735d3523f49b87410718cb6f8a3deace62a770236c49ff0448dc2ad85fb1c7b6bfc04ebc8f7629091f1b1a41129f119e08ef8108697320747fe43231b3ec394084ab23e286f5071fef0b3482b50801203ecf1ed157fbb02d6143d8a21f8db3e45d2aeeee68e63293aa57e8f54cacfd43314c064e40ee3d7339e783998d81ace436dd28db59a9d73ea5b437741d51abb72c0ef2ae0220af2d9dd8f74ebc3c1c40832d8e1a037951059715775ab856abbf8ca4d6c79512529276874f7f8b520c56ddce205dcaff0c02f3379ddd7541138b4cca8f5509063f82afeb2ff7c1fe13a2ddc3fa9fce318a33"], "hm": "07a420357eafd0f0c1e5bdb73950d061"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (73, 'mist', '{"ob": ["fe064806060606062b3e56ee1abfaa49681cf154cd474ffe82d0d692251883ead025462f4ce384a8dcf8754bf2ffbce0de28275274ead3b646f6f3b2df71b260bd8bb23b8ffea1853daa1c28264b9eb8a28076de010534d279e5e302cd4b72bf36e3405742732dcc0d316db36c93e4f5e2fd11ac313ceb06554816aa78de7463a7a64d178e284fe7de30af88ce8af14496210641a94e22bee116966ff8fbbd25c1a90fa1d46c6c3dff567ecfd4bc6bf8b0f7fc16e0c5ed0bc1d6dbda42e5e9baf8de098cc2a71ef3b928fac8910f3454fb09e4aec389162cb01789aa4061fefec6508c0422ea6200af3e53e76ab79959ce7fffb1844b15cb7767f39a8b40c8fe69e223883a31113a1dfd628794abda35990127f3ac2f1d4da0d74e710b499c98d5c18e520b2136123f6f2af8b861953fe1deea91f5aece24cc6b46910707ec57d64bf14c028486fa1deafae27a60653e26dfa200ad468cd3b7c0cf49a48dc532171ba67f5e2069a917d5c9afd1199aefea93ac93322b03f5118c715da3362bef43015febee4f288e6db24a9a25aba5ff7ee54fd0d6e63371"], "hm": "33e16c8a3da401a5625838638cc5634b"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (74, 'noble', '{"ob": ["20ca74f8585858583fe8c3e1202bbf74f19ac5a10545022c73b1749a2f22cf484312bbe2155b8294fd06aaa8b9f6a85bac353c2e5a8af5d2194af1cb8252f00f69aac9981e7f0170dd7086de7761e87be6f8d1a13ccbb83e848620b3ea587a6b4555fbeef8d8bcc68550e3d223958ecf0058fb692950f40f89a0d78842b16a49a1a1cf784f81ca6b931a315da147eb2863f04271110e0c2b54434974fba8b78eb910015dbab1f3cceeed68c5084e3da12771a4dc45e629c6d16ef19688588abb07da3e1750d63cbcbd39903e149d47b6a0bc04b03bfb350b955a3967c40b49b29ffc8164089a8b90dc9cbe403964d32ad4a5ffff6ff21a730444ba48dabff801337a1f5bed0334734823be42e443ed08275145dda19aee28a331d828da125dcca2cedc5b4b8c0bd7d7a7c01f8a5848e0ff05e3cd4d7b406581d71dea3b2e775eb289397cd815ab0bfe57de2d1b33ccde94d9820500a704b34ac259ddeba5cb5729c657ed3f68a34ca75e8253858a4bfe0e80da18ed826ab858ae7eedcc3af796f2e4b7669b62ffc917af536e3c299b391a22424d16662be3"], "hm": "561eb2c8284bc14dea39e1a77e522e0d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (75, 'north', '{"ob": ["20e77bd5d5d5d5d53fe8c3e1202bbf74f19ac5a10545022cfcea714535770304b1ee6d086f8a44562f6f34b53b3a508e931309ea6afff71d548054bc8ba700479ad7cb4363d9ddd2deda12fb1648426172922fbdc72f8980bcbd8ce4a5f3c6c287db034b66f8e0b47329a13f7618ca67bf5d2dc32300bf9e7b971517401cb7714ad85c77c383ed70214ffe5e28b58729152fd90308041d31bd06c6f6bfd8e5a3d1367531fc2e6b79ef8e244f1ff0fe2ef2211d5651942f16af3c362d4ae91c63b6f5a1a0e029f7f577a4379f1439860c60343c5db2594426f1340f2ba73b998eef0576b443796ce2ec953a5099bc01bf43cd5f0bf49641ee990b9897edf349376d4e69d7193f3abb03b5c07ff64b48057af5b314e18f71bf0e24be6bf8d1f88e5d1b604ad57951b1b50e11f0198e8ef3c7a9f783ee3a64d447c9bdac9e037eb9b5b01ecce1120a35f4d89fbc408ecddf8ebb2521ebf55832145621add776aa7f563fdfb60832f540fc0f248a044bcc5992dc896336e20d595c4689440dbfa6872177ec0f9abad613068ef9c21cbae3e7c6f7da706f6bb96c"], "hm": "8d8d1437907bca79900ac5f0ea1f5c73"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (76, 'oak', '{"ob": ["0ea52929292929293a6776166c4cf2440994f949370bad315821d58448622e5e376d823f786fdbeb849e6f8f1d51f2b3fe7f7cddd690702587151af791415ab64c03c76f0e14ac413bcbf0f58e73df1a0546e47d470ab896286195a73553320f2b0d58360721366c0a6090ab4d486a0fd12bcd8c9ea10ab0a3cc03d3b5e7126022bf0c30f01a9d506c9ca479ee5214cf3b6412a01ae131d1f1e992b052176c8ac0cf394564bfa1243ead74cd49c07c262d142b8b3ce7d882f5a6c358aa2d9d79f3d038d9c85b78a718f09e597f7fed2f172e21c8a1c7bbb2665aafe03098a8dfe95edbd09312cb0619a2c3e2d368cf2f21361fed612643258f6a2d399e95851a53c939df1322c7f9266bdacc56fa86f050a61c14a74ec4d9a53f56e01fe49511863576b15447fc1b2774b8825d65d0de733cec372a2af65d49706c922cf913036eb56b2dea9207adafc0edf229478b14e3078f61aef89bad291b25749b30a218bb0c29f4a380618e275ac180cf93f837aff92c84579706df4f2fc2a4918d435ab1b31d8d70504e041493fe4fb3b7e5c1bd3c68d72793a301"], "hm": "0d14d8e8e1249432f0e18930c4486698"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (77, 'ocean', '{"ob": ["0ebfef7e7e7e7e7e3a6776166c4cf2440994f949370bad3196047c25d7b14f7d1c29f5a14119a94b62ca315ae8172663f3d1622b79f84cd6fad224425cafe25ec309c144215ab8ba10690440bd50048fbc4f43a65670cc01fa75ee11b1bde6b78130db8dc81c75c1dfb0cb5945d2663b5c07a1c9d41d4eb1b639ed87dfcfa63f23050e290431bcb8094d9243f9a728ca20c7ace95afb58e1562cd5ddd3b08767af6296476bcb40d029da76e8703ede3f12b9c5f1d618bfed5c8bb395b713eb25d9b2568433b890a1b46a7ea5df47d57feef3c9f1d7e912c780315519c2ee565f51a78557c65eb2039be8c6533e007faa441b440da8bb2236b5ad5b10bc822ba1b436aa634a4d1d10e8b929e2c294d9add8b956b9a6ccf819fa5908fb9dbcf46268e4cb9e585084419b4e374a67023b7b3386ff4f5bd284c0f6f45f67bc6e2e21a1e032ed69618cd1b3db582ea5a490d06c2cceb497acc4e736bfefe93e7dffeebb0801144226e330886110e5ccf4270d1d9d67f301e0d43076125f8544bced64e6ba7c1817b09564fc3ec2e2533308d9c48cf85dda9b8bc6"], "hm": "45d20b1d2cc2d52e74b3cbf1750a2e31"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (78, 'olive', '{"ob": ["c0a23d78c8c8c8c89f07dfb0f6a3fd7df4bbc3e8ed7001a51e6ddd797840c5f9374e9d52e1389b092d1e7e5e616a5762ac91a75047d11f399f689648358a7b720746059e19f274f2729c5e2dd8d3344bbea5cd16b12357d07080583be7ca6555674845e99ca8bbfe5d3e0a9d39c664330e04fca113b3a8a393caf12578ba79ddf1cf5352177103bddb0e956514c034a1e903f03072f16fe45038c4680db3d2e3683285f342e0fe1aa6567a072e652e037c8250b704017ae0cb825896ed179f74c99489eb9d2595df7525010932694e7725fb9aa21ac50c4e84b6f0c985e3558c2eddaafbda812b8b7ea34c571802723283d17994931b2a052f455f945673bc1b1f71b3fbe9a66f82dac009b19fbb495086603cde77fbc4c1d72b1e5e93505962494639a7e712323169dfe7a1aafcbdf967f0a92d62a264f7e514944841e788e777e2f4fcc807d1a4f07e8d01f85d6c1f8a260d7cdb5b8df384000097a06c811a408baa3960ec6bccc3ed3170581869538e7dfc687c7bbca26067570db9c0c7642e1ad2fee8ecfb1421f1276a6d73003b0050bf2a35f7b195"], "hm": "f431b0eea3c08186ed101e588bfb3a2f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (79, 'orbit', '{"ob": ["f117033131313131a92072ffd3bceb837402fee40939c2debd06ca8e74a9a57795b8eb0659ca0bb4d3b98f85efe4f7bc9147a7f2b56a9d12f7123f565fa22fcb6f7ab0da679da2bef08e10cba61575ee39ac10570ce54ee96d7771164b33fcfea3121f117f6e8e089cc14857fc7dac4deb9801fea375160aec7e2a1cf62c3174ce7b011c7fe71e99842e7cc215416e7251f7710aaf3a186153142406b0b7a995c2afd5a8da81e1b9f3139965dd06c5dceadd33366a2accc8371b6e93d402c1a872f198c79229ae3ce95ee814735dd8182463492d961832af2978ae7b3ed5b4fed043bde8ebd4cd44f2e0c7aa91deb55b632b61847bd91bb73b5b87780cda3ca570f84058396fdb1c8ba3da9ca20935117e56a922afeca59f79a890791008a26d4954e6d50dc4fc16352fab3c315319300b97dab9f3e69c215db5a2191aaefa7a2ba23243a6f8cd582373bd55b939cd9142eac749d262bcd9f920b0ee822a19f0c95b15e1dc89e0971a75ec7e24b54b643a5da71e3e8ce4d521817c908a38013768a0ef2567c54fa59e680ba378d2ddc8e3d648639b58f671"], "hm": "119d6ce059a84cbf83227a350594e466"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (80, 'palm', '{"ob": ["f6bae08f8f8f8f8fa0aa335bffe1053be2fa2c2c9554f7cc5d714e3c137f34a618286986be2b3663686c4d5dafa7424293d0a59586163376f265e276112abdc711a462cc514659b85be5bcb2cb0bfb101ea4aa79f7f60db7a57675cc48ee057657312f7063b6b61cad69870bfc64ceb7b3009c9e75cf5780e5157ab2922db6e1c4b9360743fb2def9e17d2c3474dd4dca919de4fff3c4a943e4c0f6f436eb86f3d63f6a158c6582487865ee2e26230c74bd8ddd2e00408a32c84bb3613799dde34eaa15d01fe4f356476bbb9c0b37d9276c41758ba1c26af0291a0017e353a2640001564754bc1ee8dbbd71c6cefa5aae445ee6ac218218ccdf6460039746369d42def501a7fa0aa595f32d4257ba4cfce8519a4dbeb2aaa91a186979bd04e76b9011d1a4d492f91f510f9e2df0b83dbaba88526997a914a21f58e2c5d8961cf93687d2a927ae236f73c372f9b2e2f8a22160ce0649576bdecb66885f74aefaf33b257f67123484ba7d3c1f79affc2e6335ec0f00974ffb110e39181ac8841206aa88adfe3a3228b8c3de58294d960327d41f193f6dc7378"], "hm": "4ab4aca1c61c78b89338c3e3804e0e9d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (81, 'pearl', '{"ob": ["22a7943434343434fd41e203aadbed6575daad8b6ebd9e68885283759c734c5dece270253aa53d71b28ed1d3baf419a27e92e4814f4ef7619e4bdc10fac91c353bfb33d0588f9af5c3a75dc1b580c52e87f032d533f374589fee63eb72640e7215787fa7311160d74c086386bd3d656396a4fc8d5c6207e57e084034bb1136730cb487896def435c945d4215ff23843590a1b08c7d2ba0867a1daa1c8c7d8027e91b93ea0bac6f686bfa4e4d9169a6dbfe062f14b6d94553a5f1900ea4765109bffa51ee89229600da335706d97effe5266a5522a1ca707f75269aedc8ce21cd8b18debd7f5232f57defe5bd14ea980593a527912067c0fb7962c6a1313781abbd8c1bef59b0deee8143961118df7f7c10521132b53caba099dea8130abef28e60c1693a5c186483b1f3919a5e3eb7c9791f13fa5b7adb4c87c6be69edef400c2381078d9122d189db7a999ac348ceecee8bfc1900c6ba59e019d8a93cb18086fb3581eaf1357b35a5b38c91f200d43084c97e292fe4b51d27bd6cb059561877a59524349df3f188f386e02997c7236fc1dcf148b1a2bdd1"], "hm": "379683511189a8ac385bd67bc3de2497"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (82, 'pine', '{"ob": ["90f30808080808087662aa81be037e61ca8c890441ce3d3a0f54240ece4555f838c35b58d184f3b5f5a7302561142431cfd37050c56338dc388277bb6e32095ddfb500a6c93b9c6d632255e0c34959ec063828bd2a774569f2b4078f457dda932fd124ae97bfb72a7256a751657a7e5dc103f8879b0f34cc786d511128b4ba478f4266dc2094ef1d66a102cca558c1f0234c17e1a1dc3eab16e108e267e228d8c97c47d63a0e89d9cf706cc5b4186d6135dee928e2e2fef7b6254b8ed2da67f300b0a1adf6823b89901e19e7d45f4466399a155e834e3091620dceec6d48bc3c9edddb3abec46526192d47711549058658e8248b6380827f62f06c9ce109dca0bbad2a028e2b892c461a2fbf2f95e09aac15ead67d9da59c8bf04935828dd9cb1638309b7e57eb636416ed9beba75dcdc08f2103c9fee7763d397019b349b0f67439b5516d43744b0030cd91b17bd9e824fbdbff3af05aa169aff9826fc9e4797ffdfa123e789b534d089d36fc8e899861a78a227446b9f0a746bf761319392700786bc0c046c7641271f5e6f38e764c9f41957dc7b4c4f3"], "hm": "15dc8bed4e380a261b7794769b97a74d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (83, 'plaza', '{"ob": ["eb2e3e823f3f3f3fdc6849a90b61ca5fa812e9a7402ed9fa3c754b7789bbfdb54791cd4fc6bc70336c01364dd58dd4ff5255715c30c389e9849ba639316f40dfe45e8c2e0bc0505369800e14c9a3351b0e9a53af586d9c90871b4b5323281ba7dad57c961578f1bd355c241301a47c44d607c300f04ca2a8db75dc1c233bec476316ab70a94bcb8f032640c6625ed59e19b5d13ff51715df46a2f9e3bd8878717d45baa7173a23b427ed7ef64c134e8d3820df84f326dbc2b1d14ad847cdd3d47182940887d1286f1c9d1f4b476e40a4b2917b8db508475b1eb9637e4859490ef133129b9a3735cb3e20e0e26943ca88d504a980908b7f23e9218547b90714f45fad41712c267dcc5be7c33e2d33dc47c8337262af9131c556c44f7244b85686c46d518300625e039b20f840498eec723d77a1f0b4764b5d3810793affc154af7695453999fa403cabf2da7e0f35faa5f177e39ae660cec9bec5324515a93bd8f4686f7e08499d4394facb4fc055a172d1411d953de496040668103d426091f7828ae0da2e5bb272d8d902d45126d47eb407d6af67ca846a"], "hm": "92b32908e8b9f9b67d4fb5d580524a7f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (84, 'quartz', '{"ob": ["d3532954d5d5d5d5bd1a9523e5e063a8cc673608241124737a3f45b4d073fa99f321d9c21e8f1e5cb782b7cec3110da8af3b5fc617e8977383402de165432e41793abd36058435677e1241e53e72388540be17ede4dba84fcce6df2796a40ef7a97bd9aa59d83dc31aeff9e8fdbbb66d132328390260ecb70f066b699ee337c184a3add8035c9324d98167578db23f7fbb9181fab227421c5ac52c8a7f4fe85028e36196a30793e6ad4f10093d2775184eac5ef4d4b6794f68daec62dd2637b543829c5a947f1049a33ae851d5f3889471d8aef34cc55190635656ff1f0ce57b6590d15cc00385b39fe47dcad31ba979dd497a39af90ad2d9043a41c0a7ba828c3312c904f20cf04ec400c4756b792ed6c72f975f431e27a5eefb159be8be849b590475576d2e2317b708ab18d798d550a287c1566721968478d98dc6ab437857b61112bbe97ff8a33b973ad3f38f70842d02737b957c8fedf2f352346fba21109e5ee77c9cbfdefed96b9a7b6cb2db672603b33bff102431655cb7507916f9e3a2a095c94aa70da2ae3892d14a78cba74456a2e4a27e161"], "hm": "1d419d26520cc8e553f4259d9a12402e"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (85, 'quest', '{"ob": ["d3224e8e8e8e8e8ebd1a9523e5e063a8cc673608241124739985b487f72e494f0764546e467c214af4c753222e51c0bd1e7934313fb26ef392cb933e460e9460f5c9cee6539cc29e16c993ff153f66bf535274539a9ac561e978e33ba88930ff8b6eeeeea34cbdbcb0b729d721e37111720bce038f602d0f15e94c3b438b372e2c7fdcc70f1fc1b988ef03855ac419c967bfa5edadc763aaa58c5fc9910ce2d5ccdb90744f2654972fc719611bdc2360c9a27656c862a1682675547d0cac616d0486d7db37ae800130eca12e61f94438c8ecee43da8f00f3bed2b932d79ebf32468b553e9de93602f6a6c17de1fa2d9bcd0e464c9772f9996f3a2649a619757dead9370d91d80519eb63d4cae7fbee79dac2d899a43b8ec4dbddde3861134b13f4cac1f025006c84254cb409a96173de8a8103db023c694af598458bc5e97d8c2d56d216fb301f81d8a8110d27ce0a679c773964c5a86764a9f0c43077420368bddec2a566a67f56f6acd57177b9642137ffb40a3bc06309b62ee08f82150e47c3330c881f65d10686f986438836c164e9838eb1a09125c3"], "hm": "322d188cb256edf960c84c23ae630e2d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (86, 'raven', '{"ob": ["8b385952525252528ff421f74943a77715eb4dd90fcfd0dac276078a6d75954f7de1cefa2e7032418cf272515b9e348313535fb092cd7ce565eb0852ef0b8eca3f619fb3129f16d9ef3eaf550feb5303077b0e850adb5efe2b17b48802ee0076dcf8322ef0184a93ab09115a5f18ed04750ec6a0babecc528a3b94781aed42e40e4f391904ae287428d33b6f48cf58ad9cea3b0d5ad726fd76668ca1012edba4564e98c2304730f64f07fbee1e1bd139baaa32c98af087499f10fd6eba5fd0ff683c5b63ee33bb1ba90b908250d19ed03d7e82e793406506877061503e9677506045893d580fdc07cc61183865d54f42740e4beb1c2ae1e23054eb57c89a7e483cf7f6b2ff7c33f0735c7e7e9b666fedca3ba5fbba2f43c423a76a9f9f61d1ee5741ab2a1947171b44f5f0c4747a92f09c60fd925744617ed19a266e88406c24635ca1911a2e231b050f7e29d649668c725c0d2f3a30cd236be0b6796861fff00cccde0eac59acef3f48fcd66b8f310d7929fe0a1aa83303273be2d66e0182d47b50046f4db8600095af88749a2dae08d09fc8d4dd8d9c2a"], "hm": "907e131eb3bf6f21292fa1ed16e8b60c"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (87, 'reef', '{"ob": ["ace2f4d4d4d4d4d44b40d5b1ea1a5f04c7230dc0786fa2df66d68de5448181dd393827820718e804707157a3e78217ac24bcb89a3796775b96673d33c2803fa3f05e68f32c2d8e0bf79fcd4ffaec22260edd8c4cae696fef50167a227e2f39773cd1e9e88d937643f11d2cfc682defffefb4cde4e90e03ca5211be83bfec0860cb8d98f2569e652ed7d9c8793b5404d9e1cb991ac05060a34e6ed235dfc782bcf595652cc13e349e23f663621690914387ee1eac143fa1148f5c242e8126569ab84a3c996bdc3220a90897b9de9b98dc4e22bc3ee5610153901e431f9b3cc78e896feb36807e364222e95c553b97cc9e43be33a92a62a409eebd08666e3da75993fa01a30514302477fcd96deeaaa60c519b01b36ce1b8503fa01fd1c0e5f3e60c9e6619c4b83f6db70e2593c167fa46f55e1edfa3ea78895cf847cf2ac2ca1b5430b45a0724d8e0aadfe21ab97dd75d501bbe71c321cac9bfebff827843473b9a8f493e283d0f1147535ffb7ca47a83331d144bf0477f716b79249e4928b5e928abbf1b3dedcfee67ebdc4f3552eabf5aeddaf2d6c7d663"], "hm": "94981b447947c1e6af5d8be1e262dd7e"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (88, 'ridge', '{"ob": ["540020c76e6e6e6ee205061106250fdaec184e8fcd52c9ab9771dbf35ada75474e18ebc36a0faf7d2de92ba4e83be10598c2d9334a4220cc063d033def26ad642533bc6c824d1ae14ddf7e63d69067d1ec5dbab57d8c506f07e4d221cebfd7952f1f5656b3db607f8510da2d0d8487d48d50609b32ee90aac176419ab78b9a4a32b0baa948f53173877737700441b6b2bb67fce3eb9f3ce60109c47f86db0746ef162f3d00a480409f9d31c7288c9960766feed9b3a1b8f762ffd5259527b865764723d1b2b0eb492ff98051b5de7faeb8ac71c9a20fc77a30b257f21a902418574c700c71714ce80d9484797401464c24f1b490833ff4d6486ea275229ad6d25b9dc3aa4f7fad8f9362245e3d40f7837bc0f27571011cd9488c06fd29b022f55a15b9ef97294e6bdd2572ebebe0e197f27c6fc180acb693b409946c3f0ba57506342ee99409a993729c793f814197a45bcd10ff88bc6134f1d879e7eb1406630ffe2e9edfd34f8f3b8624f646d55f4ff6376db5f3d3286b9f9599adef966a989a8186803451abffff53625997e48566dd3108392099fce8"], "hm": "56c97903eddc9534396c7249d2e5aa1f"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (89, 'river', '{"ob": ["5437d02424242424e205061106250fdaec184e8fcd52c9ab3e1e11b5c60a3157cc4dc83311062b1b1140f9772e46f1a25d512e78f8db9d383d0f1f6202c662ab448ca393761eb866a4626446a93ea30f71247f07316e2eefedeb251aae84d862c08c810581e4c0146ce33a357d695b8b52c535fed8b54740d00767d362240f252be823d8ec322e50bf76d94414e1d89581763b5cbbbe2e7186df6cffb7c48dadd91de17268fce6646f713510708f48624ceef542e5cc2b83a828f6b623a92cd7b8858ef3f94a642435b329c3e3204e37fa3229e3498fa4d5b8bd4507793e5bec52c307c01a5e124bed41cd2eda4d5f42879bf59cc08d153a450acd30e52a3ab603227455633d0e2c5a33c360150b90ee1494b025ad504a9908cf74730303e20a9fee00dda4cfd062717d309f79f9ab1ce2af3d498f3c7347d1d4b76416f69528c270a813fbb5a8adbb6c53ec93aef496270180bde9a08dccf950661787ea8e20d9a26bafd8e2a1ee5e858fd3d49a8743ed33a00154e5213b442cdf2c1a9cc99cdcb6749c0ce6d06474381c4c8dfe1c063ad2c6d316de6ae4"], "hm": "a5b03048ebe345c488e0ca30eff6ab0c"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (90, 'sage', '{"ob": ["92b3279c9c9c9c9cb7bd38232e5d4335475e8f36e766c1a9351b750445b8ae7905bfae4db3bdd9e39ea0fd59d1f2ac880bca8e53982364e954e2bbdcbb78d04ac4b651ada0741d0d5a1adf587a864c1a9092b4dd56a197436fd53053388724cd7ea7b704883c3e3921c9819fe79f757bd09913d25a2481314c1c082f96b8419785a16d373266d26cd7020c1726d4e14bb6413346d288db4c09b391778c450018f5ccc645c587b8a3732c5427236d394ead3ae793b9b9795c5f923d9e15a4d23f85da7594db20ed56698973817c1cdbe5d8b2ef83b890c0a207ed3e0e460a64c83df3a3c26118210aaa41337f828d291c9509e75c5cf5df941f45c064962ab330dc9a0ebf037e9d1df65a0eef2e305cbe7545e549b6acd6c9e033375f5878495e5562b17191473727dd750dc39180ebc240a1e4380e843ece4e2e21d4580053c24d533fe46523d37614f09cc683c1e1e3fc6e4ad76ccd94a89e576e8e5a76d7d25a15ad4d2e998212beabdba2521d135f61abca9b087a1e91b252d1e4edeb0d8e868a45414c054e418fd3a4695f6d5d008a403bd269b014a7"], "hm": "6aab9eb8f32e566dfa41cbd48f53c80d"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (91, 'shadow', '{"ob": ["1d63a916a3a3a3a3a43a077cdd59bb69067e9f1a70617bbae16b568192aa641052c96f41829d220ffd1834a326c2b212ac58f5fb3db624069279d9d92c7a216d3426d35b30c68c040801c1128a2b1d494067a00bbe39a9e94d05592df350ffaf85e703637c2c8b1d663828e77acc5e8315de7f781514ce2392a12535e33613982cb7ed478502c0849b38b0dac7f7efc41dd03cc47420fefc2b3605cde898f796ec1c48bdbb137543e171890e768af6c64914aaaaa54cd8a2e72816f9cb914d635e22784657194f51656103b88e0d760e3d9e5872175929e5befa9c9415c82c2d0be8aa2b63842a6a13be087926640c35c4062fc2d8d2fd39941cf8d3f238ccee8b11137bf2106b265cf5bd77360ee260dda0cb0a7a881ed06185b38c5e226f4abb05fe910047ec9d6e03c810330a2a18d5dafaf7b59bd10f196d2b3a2d303ae59832ef9ead85398f832aba8b4de11e6470bc04fb5284805a6ad351fae5c9e3d4a9b682a28c0a9fc9c9364e0f5eb43a8ef2f4543102afb35b911e905e6fcb64ca6d500151fb492ecb4c8fc1ea9f392ea14b66424c0a697021"], "hm": "3bf1114a986ba87ed28fc1b5884fc2f8"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (92, 'silver', '{"ob": ["1d0e25427a7a7a7aa43a077cdd59bb69067e9f1a70617bbad7288bc5ffb99dc474d78bc14136865755c689e50029192a83b41fb7e1ff0961122eec465339f0214e73a38b0bae69baa20ea467bd32c29f7a3151db7116b9d9c61305aded65b8ddb35ad064543514d367fa16b2ba2057068597a815c98ff43b1f95cb2925db1a9fa732945142e1989081079a270b97b7c7fa75e63c7dba81124b3b18f3248d9f64f1c6f30afaa033ff3138697551aff9e7bb119159c6628cf473080574b4d39518d3020f9dc99fb4181db2819952efa95476a7a23f4830d49cd8fea9b4c607fe4328ffcf18d5423c003659f5a70e0abd501392ed18711a3c727f7e9c54ae71c25652e8d73ffad968a9bc5084afad480ac1fd6590563666b9824ee093e8e2c34e073218f44723e3867cb8b93f7e1efdcf4a9f89b3037727cabac592148a07340e3f89ec0ece2f9fadfd7b14317cbe5268cf61e6a8e6d617978f95e12dd26516f567c4c5ea13192b6bc097eb6b4424c39b65a8ab560875fef7db7bdc7954dfcc9f461df902677b6b4f1a5971a6b36bf65f847bc779ce9113c116"], "hm": "97f014516561ef487ec368d6158eb3f4"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (93, 'stone', '{"ob": ["5d3b444e37373737dd9799ddafb5acfbe2ec1ef4141c553cb1b9911fe745c62326dee2a694cb9ebff911ea62f4848aff447b33e8b0e3a7387268ca6026e0b6fe298a649013f6a120e4b3b9f894f2dab6e2d383985951463621b599a7c3e863660fb15a7e3f30d3a7ce4028a7bc8d36bc2c941b527aa073ea10a806eba2182649d1b6b3d5a2d3baa2182835bd764f3c1f2a051123f5452fbbc79b8f43835960b1d3fc70d20af5bdcf02c7892546a8971a5beeee05990978e50d3858df6e8d12fcbb6d4f8969b7e1e16e0877312a97526b6c8ddcee7bdb1632cddd68757e1f13d0f7079101a8f002bd472ee07a7416d2a87f9675c5bd75ac5f61ec0d42ca21280deeaeff62634e45383d9e9351f4edb0f0175100a600802966e698887cf99268ec8727930bf198d553e9cdb728946c0a2a1c2e8d90cda1755f4f9f687fd03ca036e8a186b0e3596debbb5503f232a36d0bb2492f55691b710068bac4a72365e9ff22c25aa71a525301a994c48d7eac873f322b36a84b8dedb939b455ce05d677a2727e96590dcd60dbee558f0212660aba0a401c30121f8b49"], "hm": "0a840ef45467fb3932dbf2c2896c5cbf"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (94, 'summit', '{"ob": ["5d8e4ae931313131dd9799ddafb5acfbe2ec1ef4141c553c169b8ab37c26bf564e48d0ea897a01882a7d1f7ef425d68628a6605817840b02d09b434cc5770f39f59a7fd5ee9c55c06dd521038af193b25672d2146bba59f80b6cbf269deaf3c0726ac922fb5e5e396c2f85c0d1d688c03b800d59d07040166e2c5fb5a45d7fa73f97428d9bbb26e7c93b425e345dcb21286792e80dd4f7f7d0e11f188b060467d17e19c0d25b8f8f0a3e5d4d871238f1bfdee869ec316120d85456435618bee75bfe5841c583620db34fbbba69ea7e80737f6bda02f907fd5c3c214b42336453d34fdffe28b4d95511b1adcad55bf0d0eafa4c39463c8629abe72aac540cab73e1afdec6328ceb6777b6e7e63232dad0dda12ab966df93ca693c44089079db47ce6a29003dcff2c1541765b76d5c19e283876959b46699f82e5037ec64aebf4c399e8985646fbd7cd7dab81a79b90373d929ce06d8cf7e8bf69064538ba67826cb625f11cd465efcc499bc6afd810b2fb117c78d3ef3fe82f25170211ed6da58ca43052867d3da9b7e1b81939e6e4da630208e03277d3fdc"], "hm": "cc8c62879d34d166787ec074e98f73a8"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (95, 'thunder', '{"ob": ["4fedb52b879a9a9a47618e4c0c06fb0e91ef2d983ceb049c3edacd19cbd9dff43c1a175ef41c8f5750470d4e9bd7ca00da462de202df6f8946bd55ac75c92d6b6622465a700a1d0839ff6cb86cdf80f69ab81f570113ecc61fd81b4fdb1fe1a7cf165ac1dd5a67a1d1c3df86da91a1cedda197905a05aba94ab4296c0234b648afa250cf741eb8d696e1e8a2ffaf4134c1b4031d905ab424f373640de34145a06d82f1248233e18f78a4e8a5fdeea8b7f59f54ddba053a1dff83ae748f94f5c5f3063f5b2efd898dc030c6a8c623b34d480748f0467f2b75b7c224e9148a344f9962d03afb244c4b8ee962627609d642cd15c7581a7df4653b171fe8b83fdafa4c6bb356441b3d55a49d2eb14bb82087be79cfdbe750836d1dcf100269908ee605ac6106297b969cd8cda9a41460c65eb2f8a228e887a6903d64424ec8d91fef61a303b4f7141d815715f89638613b6e253d4f499363d02b5319c1925236dcc7b987fdd78f102939aed14399475895ea15c6e0ac03e369a04adaa1d710ddead783f7806c65606bc05d7111dc85c1b1f91663af4e8b57ffeb"], "hm": "5c7686c0284e0875b26de99c1008e998"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (96, 'valley', '{"ob": ["ed33e9d9181818185e6350b040f1da1679dad9e94306b6844ba829f8d9422277f09f92f68bffc7e7b1f6b1c21364334c45ee42006705f545599f29613879eba39834d46520da99ee45d81cf524de955d56aab11919c71c7d17f1683ef8b14af9e1e6a8e560837d669fc1a7a746c8ff1f925458cc43e493808ef53ea483a7e80c5f03251555057a04efa1567e52786359f1ffa5a0dd4a837077b56cfac21ee68075b3f976b3ab2483e527533d7e44160c3a44cc37c94f010e9ae55eee8564a6951d27f42db78f7cf9f532289322ea4200a8bcacce8f1d9e986d4406e82918d54d0280dfe3d228781e16beb94882ae81b905190ca6c4b424d18811d1306f2d5f55979bc71210df940b3f32a8ecba06b638de4abef67563b8ce4b8489cc0a2f1ef3fbe0966eb5576bace878dd3e18d5721f9b59c1972359ed321da8e61c44c101de6627d5229d8eb0a5b0b6d64129fa65b3c04940012c4ff3233d86d8dda9c205085fb868f88f3515f205406d32ef8ca16e04852d16d59ea3b6e7038e822a6a837c0de27a742a14a9a32b19c15f01d63a8d0903b930fb50535c"], "hm": "dd2921cc76ee3abfd2beb60709056cfb"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (97, 'willow', '{"ob": ["0c7e37e17e7e7e7e3a0f26f53dd7003cd450754f015d7ccd09c6cc8f3f6dec730dac94d792175ec0b56210f56e745be359c5e02d50d938364dfa73139c4f7baa575d002e27aab01947a1da8c0d50c8a3855acc546e14ee3ed7fe97b51ebfac94f04619880cb56b4b06b9d92d909ed432c8a7b82ccb8c8fc85ae529bc05359fee72cf2d3c6b3d7361a6d769b443eaf469ebd075421cfb7c3f37634becfae0057456c836b79f12e1023e2fe59b80b5790cba63d60439acd381bc4ebe220c24f99c8935d6cabb20b39fb3306597addbff63b7bde0d31f1a01996c705e3a146e07b2c08bfef589e4857619356a086feee9931e40d5865a8a21a7b38dabb4b3430ec6238c57dd48eefca358199a6bc81dc9c83e60acbb826b2aacac5a0c9207120cc1a8aca6c69eb58cba275641879d065d831e81a97f8c52e43ee43ac98d176a46a614565af80dd2b71d6bce0fbbb0ce7b3566d17e68055c5650ffe0707899c79b9ba13185065d61a6e630e85e06c843f3af0c35fb1513e15761d45238b099c5a9e3abd408402e2b78a8f2087201b14453872d0f178f03fc1fbf"], "hm": "592cec0a3fc4d8cf9b6e57a09bff554b"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (98, 'wolf', '{"ob": ["c16a08aaaaaaaaaaa8b2c72786b44d609cacd7e35cb0555ca1b81a3386776de6a68391ba155000a8c863f8743b176c86f05703348a80eeba6a55aa38a52a98d61a6e7d643fa670905eb34cfa89bd01e98e16136e5dfcd4cde43582aa28a6d3b3dcdd3c0399fcf79f987cd6a391b3afb031166b168e8760351d8ea7f9266335b28496a167f2981f86bdfef80acf6fdf138572d5fc561f19ecfcfcdeab83d0c74eb438847a09da20a52a6ccfdef8100079312ecb149f6e813b49323f31d8728569e495d9517c32564f61e1560b1a92c08f5d3db34fe6cee08f6fd64e8f108f65808479f7682e8a42412995ef842d06e1c69ed244a94be4155af9b8e066dba03573baf95878852908e8c3d264f7bfdc28f3e7b1a2ec1f5f02df27efc975eb5a968fed30cf351e7d96f50e40e134df0e29611a4291b067aaf71ccfbf12f3757291a25732efe24563cab4357923ebc1322a7cb7dcc1b710f6550247e7537896f56f7b0a40b1581a6e5afc60c7e7bbe4aea573e3a2be394b957aee5e35f38213364279211ede50f002bfe6f887b9781fb2aae0598218157d798782"], "hm": "bf4397d8b4dc061e1b6d191a352e9134"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (99, 'zero', '{"ob": ["968ca1e9e9e9e9e9f40be01731815b0b536ede9a3029ab111525d8c762aa782935c26cfdca6ecedd7c4b55d934d86931a973a9102f26e3b63715c26226fada986ce0e0c450da9043d89f18b65722710b5ffb011de5c90e2da94eda55c700e8eba85dfcd19cc81cbd41115c311298a23a13245dd0ce1951c7707f2fe383778ec5c954ceaff90aca03f934e61cd0db494984a94dc1db426da612576a2f1a3f869187bf5d1e0f1ae5dc4e39c53e29440e3bc190fda4181ac4e5d7479277fc2a6137ac44164f5b6ef76864c5d9e043c1230bdd0151acb027d0c504c21cf31bf558e64176963344c7447fba7dc2523b0ac062c7ac6bc6882d78af10b9620618688b6d767f2bcff6899e7f06373d2b2bba9c92dcc203cf4f8f8027250a0e2673b09ae51608cd5ad03d71ce3cff8c5c102dd7855d124c57dc2260cc20e834092df7af2697e838a6ad8338e6dbaddfeea0861fe8f6e8460c5841fc845726318c660aafdb4402774841f91a2b230d27d75fe0c1ec5d1cde0f96538dd4db04c1ad6fcd9725a1ecd4258eaf4cd2fdefc0bb8af5c5fb083feea8bd8190fc"], "hm": "d02c4c4cde7ae76252540d116a40f23a"}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (100, 'zinc', '{"ob": ["e2f9438888888888ca16e96d2cc6af1d91e15de322268c5444204359398c6ae210ccedfa25a4f736775690660c9f8ae542f9e9e3be4bee1ed2792c88146f6637fcaee5f4de4f6bfade337974925dd2e1609267d8dab264ed196036af6eee5cfbdf48cbd62972ba6dc708f548021fd12add36bf82dc5add4ac2fb8f3964537876c74647ed2740a23a2bfe0398aa7fb9d5b878a40d241b0d0c73e9992b162d3f8586aba4ec865d3b7274c9d3a9137f723647c03673f516eb5a9fa8f0c97d398fca0c7dfde60e7296ac306cd9f02c5ee1c09caf66212199202a1b98f30c205b8154377ca149b0977ad8f49db8c547129723b1146e0ce2b2c5da447c11da6991343476fc0d106803b0e7792b466d89b8f9a52e246cd72ec08a864883026c713f09430676deeb5fc27c0c9fe4a0aa020169934c4e405d72df8069248ba44b24efc82f6850090ff7ba035f7d033d1f1e830ff908cf14460c68f7649ed4360730599c9b48cf8f30da5e81f77a6848c813cb97febc1873214b0aaad7219c69408800546009ab3fccade6c68fc7255fa0cb750f276c9c2eb16642ab98"], "hm": "145dee00f81fab1ddc7aae6d51850165"}'::jsonb::eql_v2_encrypted); diff --git a/tests/sqlx/migrations/007_install_bench_data.sql b/tests/sqlx/migrations/007_install_bench_data.sql deleted file mode 100644 index a9b834172..000000000 --- a/tests/sqlx/migrations/007_install_bench_data.sql +++ /dev/null @@ -1,27 +0,0 @@ --- Migration: 007_install_bench_data.sql --- --- Creates benchmark table for performance testing. --- DDL only — data is loaded by the bench_data.sql fixture so that --- only bench tests pay the 10K-row seeding cost, not the entire suite. --- --- Columns: --- encrypted_text - text equality (hmac), pattern match (bloom), ordering (ore) --- encrypted_int - integer ORE range/equality/ordering --- encrypted_bigint - bigint ORE at scale - -CREATE TABLE bench ( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - encrypted_text eql_v2_encrypted, - encrypted_int eql_v2_encrypted, - encrypted_bigint eql_v2_encrypted -); - --- Apply the production CHECK constraint to every encrypted column. The --- bench fixture (`tests/sqlx/fixtures/bench_data.sql`) loads 10K rows via --- `create_encrypted_json()`, which emits real EQL payloads with the --- required `c`, `i`, and `v=2` envelope; the constraint catches any --- future regression that would let a payload missing those fields through --- the bench seed path. See the note in 003_install_ste_vec_data.sql. -SELECT eql_v2.add_encrypted_constraint('bench', 'encrypted_text'); -SELECT eql_v2.add_encrypted_constraint('bench', 'encrypted_int'); -SELECT eql_v2.add_encrypted_constraint('bench', 'encrypted_bigint'); From 954d0106b4a390fd23fbdb815491e43985827787 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 14:31:57 +1000 Subject: [PATCH 319/599] test(sqlx): remove v2 helpers from the harness library --- tests/sqlx/src/helpers.rs | 791 -------------------------------------- tests/sqlx/src/lib.rs | 11 +- tests/test_helpers.sql | 558 --------------------------- 3 files changed, 1 insertion(+), 1359 deletions(-) delete mode 100644 tests/test_helpers.sql diff --git a/tests/sqlx/src/helpers.rs b/tests/sqlx/src/helpers.rs index cb242b3eb..f3a483ca6 100644 --- a/tests/sqlx/src/helpers.rs +++ b/tests/sqlx/src/helpers.rs @@ -2,10 +2,6 @@ //! //! Common utilities for working with encrypted data in tests. -use anyhow::{Context, Result}; -use serde_json; -use sqlx::{PgPool, Row}; - /// Sentinel payload that satisfies every encrypted-domain CHECK in the /// `eql_v3.{,_eq,_match,_ord,_ord_ore,_search}` family. Carries the EQL /// envelope (`v`, `i`, `c`) plus *all three* term keys (`hm`, `ob`, `bf`) so @@ -20,790 +16,3 @@ use sqlx::{PgPool, Row}; /// small integer array satisfies the key-presence CHECK. pub const PLACEHOLDER_PAYLOAD: &str = r#"{"v":2,"i":{"t":"t","c":"c"},"c":"sample","hm":"sample","ob":["00"],"bf":[1,2,3]}"#; - -/// Fetch ORE encrypted value from pre-seeded ore table -/// -/// The ore table is created by migration `002_install_ore_data.sql` -/// and contains 1000 pre-seeded records (ids 1-1000) for testing. -pub async fn get_ore_encrypted(pool: &PgPool, id: i32) -> Result { - let sql = format!("SELECT e::text FROM ore WHERE id = {}", id); - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching ore encrypted value for id={}", id))?; - - let result: Option = row - .try_get(0) - .with_context(|| format!("extracting text column for id={}", id))?; - - result.with_context(|| format!("ore table returned NULL for id={}", id)) -} - -/// Fetch ORE text encrypted value from pre-seeded ore_text table -/// -/// The ore_text table is created by migration `006_install_ore_text_data.sql` -/// and contains 100 pre-seeded records (ids 1-100) with lexicographically sorted words. -pub async fn get_ore_text_encrypted(pool: &PgPool, id: i32) -> Result { - let sql = format!("SELECT e::text FROM ore_text WHERE id = {}", id); - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching ore_text encrypted for id={}", id))?; - let result: Option = row - .try_get(0) - .with_context(|| format!("extracting text column for id={}", id))?; - result.with_context(|| format!("ore_text returned NULL for id={}", id)) -} - -/// Fetch encrypted_int value from the bench table by id -/// -/// The bench table is created by the bench_data fixture (10K rows, ids 1-10000). -pub async fn get_bench_encrypted_int(pool: &PgPool, id: i32) -> Result { - let result: Option = - sqlx::query_scalar("SELECT (encrypted_int).data::text FROM bench WHERE id = $1") - .bind(id) - .fetch_one(pool) - .await - .with_context(|| format!("fetching bench encrypted_int for id={id}"))?; - result.with_context(|| format!("bench.encrypted_int is NULL for id={id}")) -} - -/// Fetch encrypted_text value from the bench table by id -/// -/// The bench table is created by the bench_data fixture (10K rows, ids 1-10000). -pub async fn get_bench_encrypted_text(pool: &PgPool, id: i32) -> Result { - let result: Option = - sqlx::query_scalar("SELECT (encrypted_text).data::text FROM bench WHERE id = $1") - .bind(id) - .fetch_one(pool) - .await - .with_context(|| format!("fetching bench encrypted_text for id={id}"))?; - result.with_context(|| format!("bench.encrypted_text is NULL for id={id}")) -} - -/// Assert sorted rows match expected sequential id range -pub fn assert_sequential_ids(rows: &[sqlx::postgres::PgRow], start: i64, end: i64) { - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - let expected: Vec = (start..=end).collect(); - assert_eq!(ids, expected, "Expected sequential ids {}..={}", start, end); -} - -/// Extract encrypted term from encrypted table by selector -/// -/// Extracts a field from the first record in the encrypted table using -/// the provided selector hash. Used for containment operator tests. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `selector` - Selector hash for the field to extract (e.g., from Selectors constants) -/// -/// # Example -/// ```ignore -/// let term = get_encrypted_term(&pool, Selectors::HELLO).await?; -/// ``` -pub async fn get_encrypted_term(pool: &PgPool, selector: &str) -> Result { - // Note: Must cast selector to ::text to disambiguate operator overload - // The -> operator has multiple signatures (text, eql_v2_encrypted, integer) - let sql = format!( - "SELECT (e -> '{}'::text)::text FROM encrypted LIMIT 1", - selector - ); - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("extracting encrypted term for selector={}", selector))?; - - let result: Option = row - .try_get(0) - .with_context(|| format!("getting text column for selector={}", selector))?; - - result.with_context(|| { - format!( - "encrypted term extraction returned NULL for selector={}", - selector - ) - }) -} - -/// Internal: fetch ORE encrypted value as JSONB from any ORE table -/// -/// Creates a JSONB value from the specified table that can be used with JSONB comparison -/// operators. ORE table values only contain {"ob": [...]}, so we merge in the required -/// "i" (index metadata) and "v" (version) fields to create a valid eql_v2_encrypted structure. -async fn get_ore_table_encrypted_as_jsonb(pool: &PgPool, table: &str, id: i32) -> Result { - let sql = format!( - "SELECT (e::jsonb || jsonb_build_object('i', jsonb_build_object('t', 'ore'), 'v', 2))::text FROM {} WHERE id = {}", - table, id - ); - - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching {} encrypted as jsonb for id={}", table, id))?; - - let result: Option = row - .try_get(0) - .with_context(|| format!("extracting jsonb text for id={}", id))?; - - result.with_context(|| format!("{} table returned NULL for id={}", table, id)) -} - -/// Fetch ORE encrypted value as JSONB for comparison -/// -/// This creates a JSONB value from the ore table that can be used with JSONB comparison -/// operators. The ore table values only contain {"ob": [...]}, so we merge in the required -/// "i" (index metadata) and "v" (version) fields to create a valid eql_v2_encrypted structure. -pub async fn get_ore_encrypted_as_jsonb(pool: &PgPool, id: i32) -> Result { - get_ore_table_encrypted_as_jsonb(pool, "ore", id).await -} - -/// Fetch ORE text encrypted value as JSONB for comparison -/// -/// This creates a JSONB value from the ore_text table that can be used with JSONB comparison -/// operators. The ore_text table values only contain {"ob": [...]}, so we merge in the required -/// "i" (index metadata) and "v" (version) fields to create a valid eql_v2_encrypted structure. -pub async fn get_ore_text_encrypted_as_jsonb(pool: &PgPool, id: i32) -> Result { - get_ore_table_encrypted_as_jsonb(pool, "ore_text", id).await -} - -/// Fetch STE vec encrypted value from a specified table as serde_json::Value -/// -/// Default tables: -/// - `ste_vec`: Created by migration `003_install_ste_vec_data.sql`, 10 records (ids 1-10) -/// - `ste_vec_vast`: Created by migration `005_install_ste_vec_vast_data.sql`, 10,000 records -/// -/// Test data structure: -/// - Records have selectors for $.hello (a7cea93975ed8c01f861ccb6bd082784) with ore_cllw_var_8 -/// - Records have selectors for $.n (2517068c0d1f9d4d41d2c666211f785e) with ore_cllw_u64_8 -/// -/// Returns the encrypted value as parsed JSON, allowing callers to: -/// - Inspect structure programmatically -/// - Use .to_string() when a literal string is needed -/// - Avoid double-quoting issues with embedded apostrophes -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `table` - Table name to query (e.g., "ste_vec" or "ste_vec_vast") -/// * `id` - Row id to fetch -pub async fn get_ste_vec_encrypted( - pool: &PgPool, - table: &str, - id: i32, -) -> Result { - let sql = format!("SELECT (e).data::jsonb FROM {} WHERE id = {}", table, id); - let result: serde_json::Value = sqlx::query_scalar(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching {} encrypted value for id={}", table, id))?; - - Ok(result) -} - -/// Fetch two STE vec encrypted values from the same table -/// -/// Useful for encrypted-to-encrypted containment tests where we need -/// two distinct encrypted values from the same table. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `table` - Table name to query -/// * `id1` - First row id -/// * `id2` - Second row id -/// -/// # Returns -/// Tuple of (enc1, enc2) as serde_json::Value -pub async fn get_ste_vec_encrypted_pair( - pool: &PgPool, - table: &str, - id1: i32, - id2: i32, -) -> Result<(serde_json::Value, serde_json::Value)> { - let enc1 = get_ste_vec_encrypted(pool, table, id1).await?; - let enc2 = get_ste_vec_encrypted(pool, table, id2).await?; - Ok((enc1, enc2)) -} - -/// Extract a single SV element from an encrypted value as serde_json::Value -/// -/// Fetches an encrypted value from the specified table and extracts -/// a specific element from its sv array by index. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `table` - Table name to query (e.g., "ste_vec" or "ste_vec_vast") -/// * `id` - Row id to fetch -/// * `sv_index` - Index into the sv array (0-based) -/// -/// # Returns -/// The sv element as serde_json::Value, suitable for use in containment queries -/// Use .to_string() when a literal string is needed for SQL interpolation -pub async fn get_ste_vec_sv_element( - pool: &PgPool, - table: &str, - id: i32, - sv_index: i32, -) -> Result { - let sql = format!( - "SELECT ((e).data->'sv'->{})::jsonb FROM {} WHERE id = {}", - sv_index, table, id - ); - let result: Option = sqlx::query_scalar(&sql) - .fetch_one(pool) - .await - .with_context(|| { - format!( - "extracting sv element {} from {} id={}", - sv_index, table, id - ) - })?; - - result.with_context(|| { - format!( - "{} sv element extraction returned NULL for id={}, index={}", - table, id, sv_index - ) - }) -} - -/// Extract selector term using SQL helper functions -/// -/// Uses the get_numeric_ste_vec_*() helper functions to extract a selector term. -/// This matches the SQL test pattern exactly. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `value` - Which STE vec value to use (10, 20, 30, or 42) -/// * `selector` - Selector hash to extract (e.g., Selectors::N, Selectors::HELLO) -/// -/// # Example -/// ```ignore -/// // Extract $.n selector from n=30 test data -/// let term = get_ste_vec_selector_term(&pool, 30, Selectors::N).await?; -/// ``` -pub async fn get_ste_vec_selector_term( - pool: &PgPool, - value: i32, - selector: &str, -) -> Result { - // Call the appropriate get_numeric_ste_vec_*() function - let func_name = match value { - 10 => "get_numeric_ste_vec_10", - 20 => "get_numeric_ste_vec_20", - 30 => "get_numeric_ste_vec_30", - 42 => "get_numeric_ste_vec_42", - _ => { - return Err(anyhow::anyhow!( - "Invalid value: {}. Must be 10, 20, 30, or 42", - value - )) - } - }; - - // SQL equivalent: sv := get_numeric_ste_vec_30()::eql_v2_encrypted; - // term := sv->'2517068c0d1f9d4d41d2c666211f785e'::text; - let sql = format!( - "SELECT ({}()::eql_v2_encrypted -> '{}'::text)::text", - func_name, selector - ); - - let row = sqlx::query(&sql).fetch_one(pool).await.with_context(|| { - format!( - "extracting selector '{}' from ste_vec value={}", - selector, value - ) - })?; - - let result: Option = row.try_get(0).with_context(|| { - format!( - "getting text column for selector '{}' from value={}", - selector, value - ) - })?; - - result.with_context(|| { - format!( - "selector extraction returned NULL for selector='{}', value={}", - selector, value - ) - }) -} - -/// Extract a term from the ste_vec table by id and selector -/// -/// Queries the ste_vec table (from migration 003_install_ste_vec_data.sql) -/// and extracts a field using the provided selector hash. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `id` - Row id in ste_vec table (1-10) -/// * `selector` - Selector hash to extract (e.g., Selectors::STE_VEC_HELLO) -/// -/// # Example -/// ```ignore -/// // Extract $.hello selector from ste_vec row 1 -/// let term = get_ste_vec_term_by_id(&pool, 1, Selectors::STE_VEC_HELLO).await?; -/// ``` -pub async fn get_ste_vec_term_by_id(pool: &PgPool, id: i32, selector: &str) -> Result { - // Extract term from ste_vec table using the -> operator - let sql = format!( - "SELECT (e -> '{}'::text)::text FROM ste_vec WHERE id = {}", - selector, id - ); - - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("extracting selector '{}' from ste_vec id={}", selector, id))?; - - let result: Option = row.try_get(0).with_context(|| { - format!( - "getting text column for selector '{}' from id={}", - selector, id - ) - })?; - - result.with_context(|| { - format!( - "ste_vec term extraction returned NULL for selector='{}', id={}", - selector, id - ) - }) -} - -// ============================================================================ -// GIN Index Testing Helpers -// ============================================================================ - -/// Create a GIN index on the jsonb_array extraction for a table -/// -/// Creates a functional GIN index on `eql_v2.jsonb_array(e)` which extracts -/// the encrypted JSONB as a jsonb[] array. Using jsonb[] instead of eql_v2_encrypted[] -/// leverages PostgreSQL's native hash support for jsonb elements. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `table` - Table name to create index on -/// * `index_name` - Name for the index -/// -/// # Example -/// ```ignore -/// create_jsonb_gin_index(&pool, "jsonb_table", "jsonb_gin_idx").await?; -/// ``` -pub async fn create_jsonb_gin_index(pool: &PgPool, table: &str, index_name: &str) -> Result<()> { - let sql = format!( - "CREATE INDEX IF NOT EXISTS {} ON {} USING GIN (eql_v2.jsonb_array(e))", - index_name, table - ); - sqlx::query(&sql) - .execute(pool) - .await - .with_context(|| format!("creating GIN index {} on {}", index_name, table))?; - Ok(()) -} - -/// Run ANALYZE on a table to update query planner statistics -/// -/// Should be called after creating indexes to ensure the query planner -/// has accurate statistics for choosing optimal query plans. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `table` - Table name to analyze -pub async fn analyze_table(pool: &PgPool, table: &str) -> Result<()> { - let sql = format!("ANALYZE {}", table); - sqlx::query(&sql) - .execute(pool) - .await - .with_context(|| format!("analyzing table {}", table))?; - Ok(()) -} - -/// Run EXPLAIN on a query and return the plan as a string -/// -/// Executes EXPLAIN and concatenates all output rows into a single string. -/// Useful for verifying index usage in query plans. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `query` - SQL query to explain (without EXPLAIN prefix). -/// Must be a trusted/hardcoded string — not user-supplied input, -/// as it is interpolated directly into the SQL statement. -/// -/// # Returns -/// The EXPLAIN output as a newline-separated string -/// -/// # Example -/// ```ignore -/// let plan = explain_query(&pool, "SELECT * FROM foo WHERE x = 1").await?; -/// assert!(plan.contains("Index Scan")); -/// ``` -pub async fn explain_query(pool: &PgPool, query: &str) -> Result { - let sql = format!("EXPLAIN {}", query); - let rows: Vec<(String,)> = sqlx::query_as(&sql) - .fetch_all(pool) - .await - .with_context(|| format!("running EXPLAIN on query: {}", query))?; - - Ok(rows - .iter() - .map(|r| r.0.clone()) - .collect::>() - .join("\n")) -} - -/// Assert that a query uses a specific index -/// -/// Runs EXPLAIN on the query and verifies the specified index is used. -/// Follows the same pattern as assert_contains for consistency. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `sql` - SQL query with `{}` placeholder for the value -/// * `value` - Value to substitute into the query -/// * `index_name` - Expected index name to find in the plan -/// -/// # Example -/// ```ignore -/// let sql = "SELECT * FROM t WHERE eql_v2.ste_vec(e) @> eql_v2.ste_vec('{}'::eql_v2_encrypted)"; -/// assert_uses_index(&pool, sql, &row_b, "my_gin_idx").await?; -/// ``` -pub async fn assert_uses_index(pool: &PgPool, sql: &str, index_name: &str) -> Result<()> { - let explain_output = explain_query(pool, sql).await?; - assert!( - explain_output.contains(index_name), - "Expected index '{}' to be used. EXPLAIN output:\n{}", - index_name, - explain_output - ); - Ok(()) -} - -/// Assert that an EXPLAIN plan uses a sequential scan (no index) -/// -/// Useful for testing that small tables don't force index usage. -/// -/// # Arguments -/// * `explain_output` - Output from explain_query() -pub fn assert_uses_seq_scan(explain_output: &str) { - assert!( - explain_output.contains("Seq Scan"), - "Expected Seq Scan to be used. EXPLAIN output:\n{}", - explain_output - ); -} - -// ============================================================================ -// Benchmarking / EXPLAIN Helpers -// ============================================================================ - -/// Statistics extracted from EXPLAIN ANALYZE JSON output -/// -/// Contains timing and plan information for benchmarking queries. -/// Used by `explain_analyze_avg` to return averaged statistics. -#[derive(Debug, Clone)] -pub struct ExplainStats { - /// Average execution time in milliseconds across runs - pub execution_time_ms: f64, - /// Average planning time in milliseconds across runs - pub planning_time_ms: f64, - /// Top-level node type from the query plan (e.g., "Index Scan", "Seq Scan") - pub node_type: String, -} - -/// Run EXPLAIN with JSON format on a query and return the parsed plan -/// -/// Executes `EXPLAIN (FORMAT JSON) {query}` and parses the result. -/// PostgreSQL returns a single-element JSON array containing the plan tree. -/// -/// This is distinct from `explain_query()` which returns plain text output. -/// The JSON format provides structured access to plan nodes, costs, and types. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `query` - SQL query to explain (without EXPLAIN prefix). -/// Must be a trusted/hardcoded string — not user-supplied input, -/// as it is interpolated directly into the SQL statement. -/// -/// # Returns -/// The full EXPLAIN JSON output as a `serde_json::Value` -/// -/// # Example -/// ```ignore -/// let plan = explain_json(&pool, "SELECT * FROM foo WHERE x = 1").await?; -/// let node_type = plan[0]["Plan"]["Node Type"].as_str().unwrap(); -/// ``` -pub async fn explain_json(pool: &PgPool, query: &str) -> Result { - let sql = format!("EXPLAIN (FORMAT JSON) {}", query); - let plan: serde_json::Value = sqlx::query_scalar(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("running EXPLAIN (FORMAT JSON) on query: {}", query))?; - - Ok(plan) -} - -/// Run EXPLAIN ANALYZE multiple times and return averaged statistics -/// -/// Executes `EXPLAIN (ANALYZE, FORMAT JSON) {query}` the specified number of times -/// and returns the arithmetic mean of execution and planning times. -/// -/// **Warning**: EXPLAIN ANALYZE actually executes the query. If the query has -/// side effects (INSERT, UPDATE, DELETE), those effects will occur on every run. -/// -/// **Note**: The first run may include cold-start overhead (buffer cache misses, -/// plan cache population). No runs are discarded — callers should account for this -/// when setting thresholds or increase the run count to dilute the effect. -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `query` - SQL query to explain and execute (without EXPLAIN prefix). -/// Must be a trusted/hardcoded string — not user-supplied input, -/// as it is interpolated directly into the SQL statement. -/// * `runs` - Number of times to execute (must be >= 1) -/// -/// # Returns -/// Averaged `ExplainStats` with mean execution_time_ms, mean planning_time_ms, -/// and the node_type from the first run's top-level plan node -/// -/// # Example -/// ```ignore -/// let stats = explain_analyze_avg(&pool, "SELECT * FROM foo WHERE x = 1", 5).await?; -/// assert!(stats.execution_time_ms < 10.0, "Query too slow: {}ms", stats.execution_time_ms); -/// assert_eq!(stats.node_type, "Index Scan"); -/// ``` -pub async fn explain_analyze_avg(pool: &PgPool, query: &str, runs: usize) -> Result { - anyhow::ensure!(runs >= 1, "runs must be >= 1, got {}", runs); - - let sql = format!("EXPLAIN (ANALYZE, FORMAT JSON) {}", query); - - let mut total_execution_ms = 0.0_f64; - let mut total_planning_ms = 0.0_f64; - let mut node_type = String::new(); - - for i in 0..runs { - let plan: serde_json::Value = sqlx::query_scalar(&sql) - .fetch_one(pool) - .await - .with_context(|| { - format!( - "running EXPLAIN ANALYZE (run {}/{}) on query: {}", - i + 1, - runs, - query - ) - })?; - - // EXPLAIN (ANALYZE, FORMAT JSON) returns: - // [{"Plan": {...}, "Planning Time": N, "Execution Time": N}] - let entry = &plan[0]; - - let exec_time = entry["Execution Time"] - .as_f64() - .with_context(|| format!("extracting Execution Time on run {}/{}", i + 1, runs))?; - - let plan_time = entry["Planning Time"] - .as_f64() - .with_context(|| format!("extracting Planning Time on run {}/{}", i + 1, runs))?; - - total_execution_ms += exec_time; - total_planning_ms += plan_time; - - // Capture node type from first run only - if i == 0 { - node_type = entry["Plan"]["Node Type"] - .as_str() - .with_context(|| "extracting Node Type from first run")? - .to_string(); - } - } - - let n = runs as f64; - Ok(ExplainStats { - execution_time_ms: total_execution_ms / n, - planning_time_ms: total_planning_ms / n, - node_type, - }) -} - -/// Assert that a JSON EXPLAIN plan does not use any sequential scan -/// -/// Recursively walks the JSON plan tree checking all "Node Type" fields. -/// A plan can have nested nodes (e.g., Aggregate -> Seq Scan), so all levels -/// are checked. Both "Seq Scan" and "Parallel Seq Scan" are rejected. -/// -/// This is the structured (JSON) counterpart to `assert_uses_seq_scan()` which -/// operates on plain text output. -/// -/// # Arguments -/// * `plan` - JSON EXPLAIN output from `explain_json()` or `EXPLAIN (FORMAT JSON)` -/// -/// # Panics -/// Panics if any node in the plan tree has a "Seq Scan" or "Parallel Seq Scan" node type -/// -/// # Example -/// ```ignore -/// let plan = explain_json(&pool, "SELECT * FROM foo WHERE x = 1").await?; -/// assert_no_seq_scan(&plan); -/// ``` -pub fn assert_no_seq_scan(plan: &serde_json::Value) { - let mut seq_scan_nodes = Vec::new(); - collect_seq_scan_nodes(plan, &mut seq_scan_nodes); - - assert!( - seq_scan_nodes.is_empty(), - "Expected no sequential scans but found {} node(s): {:?}\nFull plan: {}", - seq_scan_nodes.len(), - seq_scan_nodes, - serde_json::to_string_pretty(plan).unwrap_or_else(|_| plan.to_string()) - ); -} - -/// Recursively collect all sequential scan node types from a JSON EXPLAIN plan -/// -/// Checks standard PostgreSQL node types only ("Seq Scan", "Parallel Seq Scan"). -/// Custom scan providers (e.g., from extensions) are not currently detected. -fn collect_seq_scan_nodes(value: &serde_json::Value, found: &mut Vec) { - match value { - serde_json::Value::Object(map) => { - if let Some(node_type) = map.get("Node Type").and_then(|v| v.as_str()) { - if node_type == "Seq Scan" || node_type == "Parallel Seq Scan" { - let relation = map - .get("Relation Name") - .and_then(|v| v.as_str()) - .unwrap_or("unknown"); - found.push(format!("{} on {}", node_type, relation)); - } - } - for v in map.values() { - collect_seq_scan_nodes(v, found); - } - } - serde_json::Value::Array(arr) => { - for item in arr { - collect_seq_scan_nodes(item, found); - } - } - _ => {} - } -} - -// ============================================================================ -// pg_stat_statements Helpers (Tier 2) -// ============================================================================ - -/// Statistics from pg_stat_statements for a matched query -/// -/// Contains key performance metrics from the pg_stat_statements view. -/// See PostgreSQL documentation for pg_stat_statements column definitions. -#[derive(Debug, Clone)] -pub struct PgStatEntry { - /// Number of times the query was executed - pub calls: i64, - /// Mean execution time in milliseconds - pub mean_exec_time: f64, - /// Population standard deviation of execution time in milliseconds - pub stddev_exec_time: f64, - /// Total execution time in milliseconds across all calls - pub total_exec_time: f64, - /// The normalized query string from pg_stat_statements - pub query: String, -} - -/// Ensure pg_stat_statements extension is available -/// -/// Creates the extension if it doesn't exist. Should be called once -/// at the start of benchmark tests that need pg_stat_statements. -/// -/// Requires `shared_preload_libraries=pg_stat_statements` in the PostgreSQL -/// server configuration (see docker-compose.yml). -pub async fn ensure_pg_stat_statements(pool: &PgPool) -> Result<()> { - sqlx::query("CREATE EXTENSION IF NOT EXISTS pg_stat_statements") - .execute(pool) - .await - .with_context(|| "creating pg_stat_statements extension")?; - Ok(()) -} - -/// Reset all pg_stat_statements counters -/// -/// Clears cumulative per-query statistics so the next sampling window starts -/// from zero. Call this before the measurement phase of a benchmark case to -/// ensure `read_pg_stat_statements` reflects only the queries executed after -/// the reset — not leftovers from prior cases or setup work. -/// -/// Requires the `pg_stat_statements` extension to be loaded -/// (see `ensure_pg_stat_statements`). -/// -/// # Example -/// ```ignore -/// ensure_pg_stat_statements(&pool).await?; -/// reset_pg_stat_statements(&pool).await?; -/// // ... run benchmark queries ... -/// let stats = read_pg_stat_statements(&pool, "%FROM bench%").await?; -/// ``` -pub async fn reset_pg_stat_statements(pool: &PgPool) -> Result<()> { - sqlx::query("SELECT pg_stat_statements_reset(NULL::oid, (SELECT oid FROM pg_database WHERE datname = current_database()), 0::bigint)") - .execute(pool) - .await - .with_context(|| "resetting pg_stat_statements counters for current database")?; - Ok(()) -} - -/// Read query statistics from pg_stat_statements -/// -/// Looks up a query in the `pg_stat_statements` view using a SQL LIKE pattern. -/// Requires the `pg_stat_statements` extension to be loaded -/// (see `ensure_pg_stat_statements`). -/// -/// # Arguments -/// * `pool` - Database connection pool -/// * `query_pattern` - SQL LIKE pattern to match against normalized query text -/// (e.g., `"%FROM ore WHERE%"`). -/// Note: `pg_stat_statements` normalizes queries by replacing literal values -/// with `$N` placeholders. Patterns must match the normalized form -/// (e.g., `"%FROM bench WHERE e = $1%"`, not `"%FROM bench WHERE e = 'abc'%"`). -/// -/// # Returns -/// `PgStatEntry` for the matched query. Returns error if no match or multiple matches. -/// -/// # Example -/// ```ignore -/// ensure_pg_stat_statements(&pool).await?; -/// let stats = read_pg_stat_statements(&pool, "%FROM ore WHERE%").await?; -/// assert!(stats.mean_exec_time < 5.0, "Query regression: {}ms", stats.mean_exec_time); -/// ``` -pub async fn read_pg_stat_statements(pool: &PgPool, query_pattern: &str) -> Result { - let sql = "SELECT query, calls, mean_exec_time, stddev_exec_time, total_exec_time \ - FROM pg_stat_statements \ - WHERE query LIKE $1 \ - AND dbid = (SELECT oid FROM pg_database WHERE datname = current_database())"; - - let rows: Vec<(String, i64, f64, f64, f64)> = sqlx::query_as(sql) - .bind(query_pattern) - .fetch_all(pool) - .await - .with_context(|| format!("reading pg_stat_statements for pattern: {}", query_pattern))?; - - match rows.len() { - 0 => Err(anyhow::anyhow!( - "No pg_stat_statements entry found matching pattern: {}", - query_pattern - )), - 1 => { - let (query, calls, mean_exec_time, stddev_exec_time, total_exec_time) = - rows.into_iter().next().unwrap(); - Ok(PgStatEntry { - calls, - mean_exec_time, - stddev_exec_time, - total_exec_time, - query, - }) - } - n => Err(anyhow::anyhow!( - "Expected 1 pg_stat_statements entry but found {} matching pattern: {}", - n, - query_pattern - )), - } -} diff --git a/tests/sqlx/src/lib.rs b/tests/sqlx/src/lib.rs index 4d3acb381..c59a051f0 100644 --- a/tests/sqlx/src/lib.rs +++ b/tests/sqlx/src/lib.rs @@ -37,16 +37,7 @@ pub use paste; pub use eql_tests_macros; pub use assertions::{assert_db_error, QueryAssertion}; -pub use helpers::{ - analyze_table, assert_no_seq_scan, assert_sequential_ids, assert_uses_index, - assert_uses_seq_scan, create_jsonb_gin_index, ensure_pg_stat_statements, explain_analyze_avg, - explain_json, explain_query, get_bench_encrypted_int, get_bench_encrypted_text, - get_encrypted_term, get_ore_encrypted, get_ore_encrypted_as_jsonb, get_ore_text_encrypted, - get_ore_text_encrypted_as_jsonb, get_ste_vec_encrypted, get_ste_vec_encrypted_pair, - get_ste_vec_selector_term, get_ste_vec_sv_element, get_ste_vec_term_by_id, - read_pg_stat_statements, reset_pg_stat_statements, ExplainStats, PgStatEntry, - PLACEHOLDER_PAYLOAD, -}; +pub use helpers::PLACEHOLDER_PAYLOAD; pub use scalar_domains::{ assert_null, assert_raises, assert_scalar_plaintexts, blocker_msg, commute_op, fetch_fixture_payload, sql_string_literal, ScalarDomainSpec, ScalarType, Variant, diff --git a/tests/test_helpers.sql b/tests/test_helpers.sql deleted file mode 100644 index b3bccc40a..000000000 --- a/tests/test_helpers.sql +++ /dev/null @@ -1,558 +0,0 @@ -\set ON_ERROR_STOP on - --- --- Various Helper functions --- - - - --- --- Creates a table with an encrypted column for testing --- -DROP FUNCTION IF EXISTS create_table_with_encrypted(); -CREATE FUNCTION create_table_with_encrypted() - RETURNS void -AS $$ - BEGIN - DROP TABLE IF EXISTS encrypted; - CREATE TABLE encrypted - ( - id bigint GENERATED ALWAYS AS IDENTITY, - e eql_v2_encrypted, - PRIMARY KEY(id) - ); -END; -$$ LANGUAGE plpgsql; - --- --- Creates a table with an encrypted column for testing --- -DROP FUNCTION IF EXISTS truncate_table_with_encrypted(); -CREATE FUNCTION truncate_table_with_encrypted() - RETURNS void -AS $$ - BEGIN - TRUNCATE encrypted; - END; -$$ LANGUAGE plpgsql; - - - -DROP FUNCTION IF EXISTS get_numeric_ste_vec_10(); -CREATE FUNCTION get_numeric_ste_vec_10() - RETURNS jsonb -AS $$ - BEGIN - RETURN '{"sv": [{"c": "mBbLGB9xHAGzLvUj-`@Wmf=IhD87n7r3ir3n!Sk6AKir_YawR=0c>pk(OydB;ntIEXK~c>V&4>)rNkfF eql_v2_encrypted[] --- a [ --- 1 --- ] --- - --- ORIGINAL $.a encoding --- { --- "b3": "8258356162d2415d55244abf49e40da3", --- "c": "mBbL9j9(QoRD)R+z?=Fvn#=FR9iI)K4Nzk-ea`~#Lx@wBSDPSmkp-h+tNEHoo@T@#vwh?Ejvk%78G}b+je+xufQA5mSwHSid)iEOkg@>mpuh", --- "s": "f510853730e1c3dbd31b86963f029dd5" --- }, - -DROP FUNCTION IF EXISTS get_array_ste_vec(); -CREATE FUNCTION get_array_ste_vec() - RETURNS jsonb -AS $$ - BEGIN - RETURN '{"sv": [{"c": "mBbL9j9(QoRD)R+z?=Fvn#=FRIg79JJM`MCq+nE0*U^ca-cViL884d-TInfY&E9HW@X>!U&lkYne2!EecKG8xwLYb0X#y7|05rrPvwh?Ejvk%78G}b+je+xufQA5mSwHSid)iEOkg@>mpuh", "s": "bca213de9ccce676fa849ff9c4807963", "hm": "7b4ffe5d60e4e4300dc3e28d9c300c87"}, {"c": "mBbL9j9(QoRD)R+z?=Fvn#=FR6Z{(4c^$CD^7q>z{xl^%5S4=m#2~YMW7y15TC<^_oBO-6ni$TotY#2~YMz{xl^%5S4=m#2~YMW7y15TC<^_oBO-6ni$TotY#2~YMoG#B*Y-IedG9!9-X`ygGXYGf%A%hh5&w9KkiR^+DvtjvHG(8jjwtt=6Wr{!%WJ?vt(v&0~?edG9!9-X`ygGXYGf%A%hh5&w9KkiR^+DvtjvH'$.n' -> '2517068c0d1f9d4d41d2c666211f785e' - -- e->'2517068c0d1f9d4d41d2c666211f785e' - -- e->>'2517068c0d1f9d4d41d2c666211f785e' ciphertext/c - - RETURN '{"sv": [{"c": "mBbM0#UZON2jQ3@LiWcvns2YfD7#?5ZXlp8Wk1R*iA%o6cD0VZWqPY%l%_z!JC9wAR4?XKSouV_AjBXFod39C7TF-SiCD-NgkG)l%Vw=l!tX>H*Pjq@SFR7iRajU#?{(K%x=#2^Zs|F~fm*&w!wSjZQIUaj-XX01=c??f8cq8*Vf?zEu5", "s": "a7cea93975ed8c01f861ccb6bd082784", "hm": "af96e1dabbec581f36d71e3a48ffb427f54832851b4fefa6989887ccaf7e038f66f8cb40e6959458"}, {"c": "mBbM0#UZON2jQ3@LiWcvns2Yf6y3L;hykEh`}*fX#aF;n*=>+*o5Uarod39C7TF-SiCD-NgkG)l%Vw=l!tX>H*PkiFH&De7C+d}sDugsc?JuI*>$AsG83nsXvrND0-(S", "s": "bca213de9ccce676fa849ff9c4807963", "hm": "7b4ffe5d60e4e4300dc3e28d9c300c87"}, {"c": "mBbK0Cob5dQ5Jki69vRd75f9k8Rn)lVSgZ9Q3jQYu)}sv8};==6AExb8MwqC=TCnxQeQ_FKiJQxgbDw71`CJTb)@Vv6Q`bN$sH2{puh", "s": "a7cea93975ed8c01f861ccb6bd082784", "hm": "af96e1dabbec5913707844664eb160923982fdec75bda4bcd063e26b4254a9f334ce7ebc2612713c"}, {"c": "mBbK0Cob5dQ5Jki69vRd75f9k6yc;BV`COqamPOX6P`g5TMr)AeZ(N=Pk%%2`Uq=={*w3hh3IBNp3y0Ztr0g;ir=DoZ9TNhezy", "oc": "b0c13d4a4a9ffcb2ef8629d60d5e32db453fad8792b2450d02f37ec5fe207b42da30093fd14c4975c9b192ecbf939b2d5a56a7ae2db1254e6532aa7569971462", "s": "2517068c0d1f9d4d41d2c666211f785e"}]}'::jsonb; - END; -$$ LANGUAGE plpgsql; - - --- -- --- -- --- --- Creates a table with an encrypted column for testing --- --- JSON -- '{"hello": "world", "n": 42}' --- --- Paths --- $ -> bca213de9ccce676fa849ff9c4807963 --- $.hello -> a7cea93975ed8c01f861ccb6bd082784 --- $.n -> 2517068c0d1f9d4d41d2c666211f785e --- --- -- --- -- -DROP FUNCTION IF EXISTS create_encrypted_json(integer); -CREATE FUNCTION create_encrypted_json(id integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - s text; - m jsonb; - start integer; - stop integer; - random_key text; - random_val text; - sv jsonb; - ore_term jsonb; - result jsonb; - BEGIN - - start := (10 * id); - stop := (10 * id) + 5; - m := array_to_json(array(SELECT generate_series(start, stop))); - - select substr(md5(random()::text), 1, 25) INTO random_key; - select substr(md5(random()::text), 1, 25) INTO random_val; - - CASE id - WHEN 1 THEN - sv := get_numeric_ste_vec_10(); - WHEN 2 THEN - sv := get_numeric_ste_vec_20(); - WHEN 3 THEN - sv := get_numeric_ste_vec_30(); - ELSE - sv := get_numeric_ste_vec_42(); - END CASE; - - - SELECT ore.e FROM ore WHERE ore.id = start INTO ore_term; - - -- PERFORM eql_v2.log('ore_term: ', ore_term::text); - - s := format( - '{ - "%s": "%s", - "c": "ciphertext", - "i": { - "t": "encrypted", - "c": "e" - }, - "hm": "hmac.%s", - "bf": %s, - "v": 2 - }', - random_key, - random_val, - id, m); - - result := s::jsonb || sv || ore_term; - - -- Backstop hm synthesis: legacy `get_numeric_ste_vec_*` fixtures may - -- still carry an sv element with neither `hm` nor `oc` (i.e. an - -- equality-only entry that pre-dates the v2.3 b3→hm rename and hasn't - -- been refreshed). Synthesise `hm` deterministically in that case so - -- the entry has a stable equality term for ste_vec_contains. - -- - -- Per the v2.3 sv-element contract (and the `eql_v2.ste_vec_entry` - -- DOMAIN check), `hm` and `oc` are mutually exclusive — never both — - -- so skip elements that already have `oc`. The pre-2.3 `b3` field - -- is gone; the synthesised `hm` is just `md5(s || c)`. - IF result -> 'sv' IS NOT NULL THEN - result := jsonb_set(result, '{sv}', ( - SELECT jsonb_agg( - CASE - WHEN NOT (elem ? 'hm') AND NOT (elem ? 'oc') THEN - elem || jsonb_build_object( - 'hm', - md5(coalesce(elem ->> 's', '') || coalesce(elem ->> 'c', '')) - ) - ELSE elem - END - ) - FROM jsonb_array_elements(result -> 'sv') elem - )); - END IF; - - RETURN result::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_json(integer, VARIADIC indexes text[]); -CREATE FUNCTION create_encrypted_json(id integer, VARIADIC indexes text[]) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - j jsonb; - BEGIN - j := create_encrypted_json(id); - - j := ( - SELECT jsonb_object_agg(key, value) - FROM jsonb_each(j) - WHERE key = ANY(indexes) - ); - - RETURN j::eql_v2_encrypted; - - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_json(VARIADIC indexes text[]); -CREATE FUNCTION create_encrypted_json(VARIADIC indexes text[]) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - default_indexes text[]; - j jsonb; - BEGIN - - default_indexes := ARRAY['c', 'i', 'v']; - - j := create_encrypted_json(1); - - j := ( - SELECT jsonb_object_agg(key, value) - FROM jsonb_each(j) - WHERE key = ANY(indexes || default_indexes) - ); - - RETURN j::eql_v2_encrypted; - - END; -$$ LANGUAGE plpgsql; - - - -DROP FUNCTION IF EXISTS create_encrypted_ore_json(val integer); -CREATE FUNCTION create_encrypted_ore_json(val integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - e eql_v2_encrypted; - ore_term jsonb; - BEGIN - EXECUTE format('SELECT ore.e FROM ore WHERE id = %s', val) INTO ore_term; - e := create_encrypted_json('ob')::jsonb || ore_term; - RETURN e::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_ste_vec_json(val integer); -CREATE FUNCTION create_encrypted_ste_vec_json(val integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - e eql_v2_encrypted; - BEGIN - EXECUTE format('SELECT ste_vec.e FROM ste_vec WHERE id = %s', val) INTO e; - RETURN e::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS create_encrypted_json(); -CREATE FUNCTION create_encrypted_json() - RETURNS eql_v2_encrypted -AS $$ - DECLARE - id integer; - j jsonb; - BEGIN - id := trunc(random() * 1000 + 1); - j := create_encrypted_json(id); - RETURN j::eql_v2_encrypted; - END; -$$ LANGUAGE plpgsql; - - -DROP FUNCTION IF EXISTS seed_encrypted(eql_v2_encrypted); -CREATE FUNCTION seed_encrypted(e eql_v2_encrypted) - RETURNS void -AS $$ - BEGIN - INSERT INTO encrypted (e) VALUES (e); - END; -$$ LANGUAGE plpgsql; - - --- --- Truncates and creates base test data --- -DROP FUNCTION IF EXISTS seed_encrypted_json(); -CREATE FUNCTION seed_encrypted_json() - RETURNS void -AS $$ - BEGIN - PERFORM truncate_table_with_encrypted(); - PERFORM seed_encrypted(create_encrypted_json(1)); - PERFORM seed_encrypted(create_encrypted_json(2)); - PERFORM seed_encrypted(create_encrypted_json(3)); - END; -$$ LANGUAGE plpgsql; - - --- --- Creates a table with an encrypted column for testing --- -DROP FUNCTION IF EXISTS drop_table_with_encrypted(); -CREATE FUNCTION drop_table_with_encrypted() - RETURNS void -AS $$ - BEGIN - DROP TABLE IF EXISTS encrypted; -END; -$$ LANGUAGE plpgsql; - - --- --- Convenience function to describe a test --- -DROP FUNCTION IF EXISTS describe(text); -CREATE FUNCTION describe(s text) - RETURNS void -AS $$ - BEGIN - RAISE NOTICE '%', s; -END; -$$ LANGUAGE plpgsql; - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_result(describe text, sql text); - -CREATE FUNCTION assert_result(describe text, sql text) - RETURNS void -AS $$ - DECLARE - result record; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result; - - if result IS NULL THEN - RAISE NOTICE 'ASSERT RESULT FAILED'; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_result(describe text, sql text, result text); - -CREATE FUNCTION assert_result(describe text, sql text, expected text) - RETURNS void -AS $$ - DECLARE - result text; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result; - - if result <> expected THEN - RAISE NOTICE 'ASSERT EXPECTED RESULT FAILED'; - RAISE NOTICE 'Expected: %', expected; - RAISE NOTICE 'Result: %', result; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_id(describe text, sql text, id integer); - -CREATE FUNCTION assert_id(describe text, sql text, id integer) - RETURNS void -AS $$ - DECLARE - result_id integer; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result_id; - - IF result_id <> id THEN - RAISE NOTICE 'ASSERT ID FAILED'; - RAISE NOTICE 'Expected row with id % but returned %', id, result_id; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_no_result(describe text, sql text); - -CREATE FUNCTION assert_no_result(describe text, sql text) - RETURNS void -AS $$ - DECLARE - result record; - BEGIN - RAISE NOTICE '%', describe; - EXECUTE sql into result; - - IF result IS NOT NULL THEN - RAISE NOTICE 'ASSERT NO RESULT FAILED'; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - - --- --- Assert the the provided SQL statement returns a non-null result --- -DROP FUNCTION IF EXISTS assert_count(describe text, sql text, expected integer); - -CREATE FUNCTION assert_count(describe text, sql text, expected integer) - RETURNS void -AS $$ - DECLARE - result integer; - BEGIN - RAISE NOTICE '%', describe; - - -- Remove any trailing ; so that the query can be wrapped with count(*) below - sql := TRIM(TRAILING ';' FROM sql); - - EXECUTE format('SELECT COUNT(*) FROM (%s) as q', sql) INTO result; - - if result <> expected THEN - RAISE NOTICE 'ASSERT COUNT FAILED'; - RAISE NOTICE 'Expected % rows and returned %', expected, result; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - END IF; - - END; -$$ LANGUAGE plpgsql; - - - --- --- Assert the the provided SQL statement raises an exception --- -DROP FUNCTION IF EXISTS assert_exception(describe text, sql text); - -CREATE FUNCTION assert_exception(describe text, sql text) - RETURNS void -AS $$ - BEGIN - RAISE NOTICE '%', describe; - - BEGIN - EXECUTE sql; - RAISE NOTICE 'ASSERT EXCEPTION FAILED'; - RAISE NOTICE 'EXPECTED STATEMENT TO RAISE EXCEPTION'; - RAISE NOTICE '%', regexp_replace(sql, '^\s+|\s*$', '', 'g'); - ASSERT false; - EXCEPTION - WHEN OTHERS THEN - ASSERT true; - END; - - END; -$$ LANGUAGE plpgsql; --- --- Synthetic ste_vec test data (replaces the pre-2.3 fixture in tests/ste_vec.sql) --- --- Returns an eql_v2_encrypted carrying a v2.3-compliant SteVecPayload: --- {i, v, sv: []} — no root `c` per the v2.3 schema --- --- The sv entries reuse real CLLW `oc` ciphertexts captured from a pre-2.3 --- cipherstash-suite encryption (so the byte structure satisfies the CLLW --- per-byte comparison rule that `eql_v2.compare_ore_cllw_term` expects). --- `hm` for `oc`-bearing entries is synthesised deterministically as --- `md5(s || record_id)` — opaque to callers; what matters is per-record --- equality semantics for ste_vec_contains. --- --- Plaintext shape (for reference): --- { "hello": "world {N}", "number": N, --- "nested": { "number": , "hello": "world {N}" } } --- --- Selectors: --- $ -> 9493d6010fe7845d52149b697729c745 --- $.hello -> d90b97b5207d30fe867ca816ed0fe4a7 --- $.nested -> 3a9a5d5601369d00a92e851b5490d2d1 --- $.nested.hello -> f3b937817818610f955b6bbbc337aa2b --- $.number -> fa6f99753674e2e0db242dd805eacac8 --- $.nested.number -> 3dba004f4d7823446e7cb71f6681b344 -DROP FUNCTION IF EXISTS build_synthetic_ste_vec(integer); -CREATE FUNCTION build_synthetic_ste_vec(id integer) - RETURNS eql_v2_encrypted -AS $$ - DECLARE - payload jsonb; - BEGIN - CASE id - WHEN 1 THEN payload := '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqX%JhW0ZKZ^G?lNn$CfXJH|W!V*=irNa@z{OfN`tJKpjgX(7ToG`HWORpeL^$zO*^J`x7KRuY0gW#{2OV?F-Z2rNIo9CWCgDOt!Fg2d-I_cW7ljFiM641$Ej6!A<1h!E%%1I5$YIE}thw=uucU|IEwG+k8(puh", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq8w1tsgI>{D^0s{k=Kwcv$GK=wXj973J#%Qi#2^fUgv1o_OazD!=oJIS)7m(VzEQU^ztUh?^@=oIRR^HJ", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqK@;r|K5qT&!~f=;IrFg2#bT?wQ2^uT?MQ1vb$M{qdKJ&)IM{5qYVEjR-wUOWau*19aKGAhNSrAja?iC`)BMCB41$Ej6!A<1h!E%%1I5$YIE}thw=uucU|IEwG+k8(puh", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq8w1tsgI>{D^0s{k=Kwcv$GK=wXj973J#%Qi#2^fUgv1o_OazD!=oJIS)7m(VzEQU^ztUh?^@=oIRR^HJ", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9eda1b", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbL@V^%dN?0W$;g)1-JP*cmqBor4+`y>b|qoX{uNXP2XSf9UacD`690sM|6wY5xR^!82|E5slSf`r5r@k|7W5a<;H#nak2jlNO0F~8DaS@nuET~!C5zy", "oc": "fc6a9c6533b34219a300d82916e71a4955a48b208969eaf4dec0b88477b753fce8e31613f296a3ebc3dc428912fffa10ad58ef698631b5a3a8ec0a53593fbae5", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbL@V^%dN?0W$;g)1-JP*cmq6X0HB3o?jM)H&5-v7zt=j&nB7f>vGiA$|Xx3CMyn3~nC&!m2n|FsTD7A$Vznv5KN&ZD;2AYnEe)S~DtWX{85Bby<_1V+JAQ#4iCfmE5R8de-4qZ}xLQgnq2A0{V^??Z>lfCrxAE3Y", "hm": "8067db44a848ab32c3056a3dbe4edf16", "a": false}, {"s": "d90b97b5207d30fe867ca816ed0fe4a7", "c": "mBbKA;2~_|&h787#WXU&=nqH48zV_I^FE9E$Tx^Bh>*L$Z3UaiidiIG8f6-J#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbca", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbKA;2~_|&h787#WXU&=nqH4LKI%yI#+SZ>%7r@cMkI#>B`Y@g%m&?_;qLaZhOY{yIKN|aPs2dC}n9ugdf8Jtw6L@OO2~2$4fWO5Ld;)=aR3)AQ#4iCfmE5R8de-4qZ}xLQgnq2A0{V^??Z>lfCrxAE3Y", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbKA;2~_|&h787#WXU&=nqH48zV_I^FE9E$Tx^Bh>*L$Z3UaiidiIG8f6-J#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbca", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbKA;2~_|&h787#WXU&=nqH4C6`I)f|7H0_iUN!sI%p|PD^%)I3u@>Lo)l>D^FTEHMX_T`5(j}7si7o+q;}pQBYA1T~d8QPdI7@mf5KFfe9d!z4Y`Spuh", "oc": "fc6a9c6533b34219a3018e1c9ce9330c0e754864cd7341d488ae3fc464cdd85f73b1e9aabab2d18c8de2de82052d5ec9e8c906ef5d082a34b5a4e63234a2f831", "a": false}, {"s": "3dba004f4d7823446e7cb71f6681b344", "c": "mBbKA;2~_|&h787#WXU&=nqH46KPW9$J3a=|Jqzg_kinIG(B$L#2^>OgC^U%oK#UzQ4U>FeL_z-Y6h0ssP%yfAd|iH^dF$W", "oc": "fc6a9c6533b341a3bbe1d7eefbfe3457e74c9c4dcde2c1d40fafa6fe7bfe1cf225871f30f428f65a348062433db703d77583587a42443a1808d112f0514f0262", "a": false}]}'::jsonb; - WHEN 3 THEN payload := '{"i": {"c": "encrypted_jsonb", "t": "encrypted"}, "v": 2, "sv": [{"s": "9493d6010fe7845d52149b697729c745", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#YUj70Cz_B24U3#W#b#KGw1<@cS7(S0Ce|x{!!At-Epo5#C-8ZJATrn?7A$@`(u>=$?2X*e1UcJ`#2{On(Eq~PZP7^Gu{SL7X*)sN#Y!JpxT_uu4UfmrWp|*!", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbcb", "a": false}, {"s": "3a9a5d5601369d00a92e851b5490d2d1", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#Li)6dAJoLZZs|CbiZstYT&vn}P=yVCm1M9YnMJisIv8CoL6Tzth(-874C)8j_qYuX4Fv>J<<09@x_=DyfRUxdAX}Tz|H9gB(Ma8~H!SgKJ3-sUN*`Ics~!stkH^qucc8!", "hm": "6ab75dbd78d2b77f8675161ad8fddbe7", "a": false}, {"s": "f3b937817818610f955b6bbbc337aa2b", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#8-dM231ayoGQIzTv|n<6^Uo7QSi`z>1UcJ`#2{On(Eq~PZP7^Gu{SL7X*)sN#Y!JpxT_uu4UfmrWp|*!", "oc": "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793159989698eadf64ab9b3ab45c5366d027b2a5476a635ce6cad9edbcb", "a": false}, {"s": "fa6f99753674e2e0db242dd805eacac8", "c": "mBbJ&V+<+WNnWTGaHg#Y!CMH#B}MUqDEGI9$OIF8zdRu#08c>I+EsdWf96+dkZ Date: Mon, 22 Jun 2026 14:34:06 +1000 Subject: [PATCH 320/599] test(sqlx): delete v2 test binaries (config, encryptindex, operators, ore, jsonb, bench) --- tests/sqlx/tests/aggregate_tests.rs | 180 ---- tests/sqlx/tests/bench_data_tests.rs | 233 ----- tests/sqlx/tests/bench_plan_tests.rs | 159 ---- tests/sqlx/tests/bench_regression_tests.rs | 113 --- tests/sqlx/tests/comparison_tests.rs | 856 ----------------- tests/sqlx/tests/config_tests.rs | 866 ------------------ tests/sqlx/tests/constraint_tests.rs | 482 ---------- tests/sqlx/tests/containment_tests.rs | 220 ----- .../tests/containment_with_index_tests.rs | 819 ----------------- tests/sqlx/tests/encryptindex_tests.rs | 565 ------------ tests/sqlx/tests/eq_term_tests.rs | 202 ---- tests/sqlx/tests/equality_tests.rs | 176 ---- tests/sqlx/tests/hash_operator_tests.rs | 671 -------------- tests/sqlx/tests/index_compare_tests.rs | 521 ----------- tests/sqlx/tests/inequality_tests.rs | 189 ---- .../jsonb_containment_uses_index_tests.rs | 484 ---------- .../sqlx/tests/jsonb_path_operators_tests.rs | 228 ----- .../tests/jsonb_path_query_inlining_tests.rs | 115 --- tests/sqlx/tests/jsonb_tests.rs | 290 ------ tests/sqlx/tests/like_operator_tests.rs | 198 ---- tests/sqlx/tests/operator_class_tests.rs | 247 ----- tests/sqlx/tests/operator_compare_tests.rs | 153 ---- tests/sqlx/tests/order_by_no_opclass_tests.rs | 283 ------ tests/sqlx/tests/order_by_sort_tests.rs | 841 ----------------- tests/sqlx/tests/order_by_tests.rs | 301 ------ .../tests/order_by_using_operator_tests.rs | 67 -- tests/sqlx/tests/ore_cllw_opclass_tests.rs | 609 ------------ tests/sqlx/tests/ore_comparison_tests.rs | 106 --- tests/sqlx/tests/ore_equality_tests.rs | 80 -- tests/sqlx/tests/ore_text_operator_tests.rs | 468 ---------- tests/sqlx/tests/ore_text_order_tests.rs | 267 ------ tests/sqlx/tests/specialized_tests.rs | 415 --------- tests/sqlx/tests/test_helpers_test.rs | 31 - 33 files changed, 11435 deletions(-) delete mode 100644 tests/sqlx/tests/aggregate_tests.rs delete mode 100644 tests/sqlx/tests/bench_data_tests.rs delete mode 100644 tests/sqlx/tests/bench_plan_tests.rs delete mode 100644 tests/sqlx/tests/bench_regression_tests.rs delete mode 100644 tests/sqlx/tests/comparison_tests.rs delete mode 100644 tests/sqlx/tests/config_tests.rs delete mode 100644 tests/sqlx/tests/constraint_tests.rs delete mode 100644 tests/sqlx/tests/containment_tests.rs delete mode 100644 tests/sqlx/tests/containment_with_index_tests.rs delete mode 100644 tests/sqlx/tests/encryptindex_tests.rs delete mode 100644 tests/sqlx/tests/eq_term_tests.rs delete mode 100644 tests/sqlx/tests/equality_tests.rs delete mode 100644 tests/sqlx/tests/hash_operator_tests.rs delete mode 100644 tests/sqlx/tests/index_compare_tests.rs delete mode 100644 tests/sqlx/tests/inequality_tests.rs delete mode 100644 tests/sqlx/tests/jsonb_containment_uses_index_tests.rs delete mode 100644 tests/sqlx/tests/jsonb_path_operators_tests.rs delete mode 100644 tests/sqlx/tests/jsonb_path_query_inlining_tests.rs delete mode 100644 tests/sqlx/tests/jsonb_tests.rs delete mode 100644 tests/sqlx/tests/like_operator_tests.rs delete mode 100644 tests/sqlx/tests/operator_class_tests.rs delete mode 100644 tests/sqlx/tests/operator_compare_tests.rs delete mode 100644 tests/sqlx/tests/order_by_no_opclass_tests.rs delete mode 100644 tests/sqlx/tests/order_by_sort_tests.rs delete mode 100644 tests/sqlx/tests/order_by_tests.rs delete mode 100644 tests/sqlx/tests/order_by_using_operator_tests.rs delete mode 100644 tests/sqlx/tests/ore_cllw_opclass_tests.rs delete mode 100644 tests/sqlx/tests/ore_comparison_tests.rs delete mode 100644 tests/sqlx/tests/ore_equality_tests.rs delete mode 100644 tests/sqlx/tests/ore_text_operator_tests.rs delete mode 100644 tests/sqlx/tests/ore_text_order_tests.rs delete mode 100644 tests/sqlx/tests/specialized_tests.rs delete mode 100644 tests/sqlx/tests/test_helpers_test.rs diff --git a/tests/sqlx/tests/aggregate_tests.rs b/tests/sqlx/tests/aggregate_tests.rs deleted file mode 100644 index b1659c626..000000000 --- a/tests/sqlx/tests/aggregate_tests.rs +++ /dev/null @@ -1,180 +0,0 @@ -//! Aggregate function tests -//! -//! Covers native `COUNT` / `GROUP BY` on `eql_v2_encrypted` and the -//! `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates -//! on the composite type. Per-domain aggregates -//! (`eql_v2.min(eql_v3__ord)` etc.) are additionally covered by the -//! encrypted-domain test matrix (`tests/sqlx/src/matrix.rs`, instantiated per -//! scalar type from `tests/sqlx/tests/encrypted_domain/scalars/.rs`). - -use anyhow::Result; -use sqlx::PgPool; - -#[sqlx::test] -async fn count_aggregate_on_encrypted_column(pool: PgPool) -> Result<()> { - // COUNT on an `eql_v2_encrypted` column is PostgreSQL-native — no - // aggregate declaration is required. Pin that it still counts non-NULL - // encrypted rows on the legacy composite type. - let count: i64 = sqlx::query_scalar("SELECT COUNT(e) FROM ore") - .fetch_one(&pool) - .await?; - - assert_eq!(count, 1000, "should count all non-NULL encrypted values"); - - Ok(()) -} - -#[sqlx::test] -async fn max_aggregate_on_encrypted_column(pool: PgPool) -> Result<()> { - // Test: eql_v2.max() returns highest encrypted value - // The ore table has id and e columns where e is the encrypted version of id - // So eql_v2.max(e) should return the encrypted value corresponding to id=1000 - - // Get the expected max value (encrypted value where id = 1000) - let expected: String = sqlx::query_scalar("SELECT e::text FROM ore WHERE id = 1000") - .fetch_one(&pool) - .await?; - - // Get the actual max from eql_v2.max() - let actual: String = sqlx::query_scalar("SELECT eql_v2.max(e)::text FROM ore") - .fetch_one(&pool) - .await?; - - assert_eq!( - actual, expected, - "eql_v2.max(e) should return the encrypted value where id = 1000 (maximum)" - ); - - Ok(()) -} - -#[sqlx::test] -async fn min_aggregate_on_encrypted_column(pool: PgPool) -> Result<()> { - // Test: eql_v2.min() returns lowest encrypted value - // The ore table has id and e columns where e is the encrypted version of id - // So eql_v2.min(e) should return the encrypted value corresponding to id=1 - - // Get the expected min value (encrypted value where id = 1) - let expected: String = sqlx::query_scalar("SELECT e::text FROM ore WHERE id = 1") - .fetch_one(&pool) - .await?; - - // Get the actual min from eql_v2.min() - let actual: String = sqlx::query_scalar("SELECT eql_v2.min(e)::text FROM ore") - .fetch_one(&pool) - .await?; - - assert_eq!( - actual, expected, - "eql_v2.min(e) should return the encrypted value where id = 1 (minimum)" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn group_by_with_encrypted_column(pool: PgPool) -> Result<()> { - // GROUP BY on `eql_v2_encrypted` works natively against the fixture's - // distinct payloads. Pin that grouping by an encrypted column returns - // the expected number of groups. - let group_count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM ( - SELECT e, COUNT(*) FROM encrypted GROUP BY e - ) subquery", - ) - .fetch_one(&pool) - .await?; - - assert_eq!( - group_count, 3, - "GROUP BY should return 3 groups (one per distinct encrypted value in fixture)" - ); - - Ok(()) -} - -// ========== eql_v2.min() and eql_v2.max() Tests ========== - -#[sqlx::test(fixtures(path = "../fixtures", scripts("aggregate_minmax_data")))] -async fn eql_v2_min_with_null_values(pool: PgPool) -> Result<()> { - // Test: eql_v2.min() on NULL encrypted values returns NULL - // Source SQL: ASSERT ((SELECT eql_v2.min(enc_int) FROM agg_test where enc_int IS NULL) IS NULL); - - let result: Option = - sqlx::query_scalar("SELECT eql_v2.min(enc_int)::text FROM agg_test WHERE enc_int IS NULL") - .fetch_one(&pool) - .await?; - - assert!( - result.is_none(), - "eql_v2.min() should return NULL when querying only NULL values" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("aggregate_minmax_data")))] -async fn eql_v2_min_finds_minimum_encrypted_value(pool: PgPool) -> Result<()> { - // Test: eql_v2.min() finds the minimum encrypted value (plain_int = 1) - // Source SQL: ASSERT ((SELECT enc_int FROM agg_test WHERE plain_int = 1) = (SELECT eql_v2.min(enc_int) FROM agg_test)); - - // Get the expected minimum value (plain_int = 1) - let expected: String = - sqlx::query_scalar("SELECT enc_int::text FROM agg_test WHERE plain_int = 1") - .fetch_one(&pool) - .await?; - - // Get the actual minimum from eql_v2.min() - let actual: String = sqlx::query_scalar("SELECT eql_v2.min(enc_int)::text FROM agg_test") - .fetch_one(&pool) - .await?; - - assert_eq!( - actual, expected, - "eql_v2.min() should return the encrypted value where plain_int = 1 (minimum)" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("aggregate_minmax_data")))] -async fn eql_v2_max_with_null_values(pool: PgPool) -> Result<()> { - // Test: eql_v2.max() on NULL encrypted values returns NULL - // Source SQL: ASSERT ((SELECT eql_v2.max(enc_int) FROM agg_test where enc_int IS NULL) IS NULL); - - let result: Option = - sqlx::query_scalar("SELECT eql_v2.max(enc_int)::text FROM agg_test WHERE enc_int IS NULL") - .fetch_one(&pool) - .await?; - - assert!( - result.is_none(), - "eql_v2.max() should return NULL when querying only NULL values" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("aggregate_minmax_data")))] -async fn eql_v2_max_finds_maximum_encrypted_value(pool: PgPool) -> Result<()> { - // Test: eql_v2.max() finds the maximum encrypted value (plain_int = 5) - // Source SQL: ASSERT ((SELECT enc_int FROM agg_test WHERE plain_int = 5) = (SELECT eql_v2.max(enc_int) FROM agg_test)); - - // Get the expected maximum value (plain_int = 5) - let expected: String = - sqlx::query_scalar("SELECT enc_int::text FROM agg_test WHERE plain_int = 5") - .fetch_one(&pool) - .await?; - - // Get the actual maximum from eql_v2.max() - let actual: String = sqlx::query_scalar("SELECT eql_v2.max(enc_int)::text FROM agg_test") - .fetch_one(&pool) - .await?; - - assert_eq!( - actual, expected, - "eql_v2.max() should return the encrypted value where plain_int = 5 (maximum)" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/bench_data_tests.rs b/tests/sqlx/tests/bench_data_tests.rs deleted file mode 100644 index 0295eaece..000000000 --- a/tests/sqlx/tests/bench_data_tests.rs +++ /dev/null @@ -1,233 +0,0 @@ -//! Benchmark data verification tests -//! -//! Validates bench_data fixture (10K rows) and bench_setup fixture (indexes): -//! - 10K rows seeded correctly across 3 encrypted columns -//! - Index terms (hmac, bloom, ORE) are extractable -//! - Indexes are used by the query planner (EXPLAIN assertions) -//! - Sequential scan baseline without indexes - -use anyhow::Result; -use eql_tests::{analyze_table, assert_uses_index, assert_uses_seq_scan, explain_query}; -use sqlx::PgPool; - -const BENCH_ROW_COUNT: i64 = 10000; - -async fn fetch_sample_encrypted_text(pool: &PgPool) -> Result { - Ok( - sqlx::query_scalar("SELECT (encrypted_text).data::text FROM bench WHERE id = 1") - .fetch_one(pool) - .await?, - ) -} - -// ========== Data Integrity Tests ========== - -/// Verify fixture seeded exactly 10K rows -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_table_has_expected_row_count(pool: PgPool) -> Result<()> { - let count: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM bench") - .fetch_one(&pool) - .await?; - assert_eq!( - count.0, BENCH_ROW_COUNT, - "bench table should have 10000 rows" - ); - Ok(()) -} - -/// Verify all three columns have non-null encrypted data -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_columns_are_populated(pool: PgPool) -> Result<()> { - let count: (i64,) = sqlx::query_as( - "SELECT COUNT(*) FROM bench - WHERE encrypted_text IS NOT NULL - AND encrypted_int IS NOT NULL - AND encrypted_bigint IS NOT NULL", - ) - .fetch_one(&pool) - .await?; - assert_eq!( - count.0, BENCH_ROW_COUNT, - "all rows should have non-null encrypted columns" - ); - Ok(()) -} - -/// Verify hmac_256 index terms are extractable from encrypted_text -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_encrypted_text_has_hmac_terms(pool: PgPool) -> Result<()> { - let count: (i64,) = sqlx::query_as( - "SELECT COUNT(*) FROM bench WHERE eql_v2.hmac_256(encrypted_text) IS NOT NULL", - ) - .fetch_one(&pool) - .await?; - assert_eq!( - count.0, BENCH_ROW_COUNT, - "all rows should have hmac_256 index terms" - ); - Ok(()) -} - -/// Verify bloom_filter index terms are extractable from encrypted_text -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_encrypted_text_has_bloom_filter_terms(pool: PgPool) -> Result<()> { - let count: (i64,) = sqlx::query_as( - "SELECT COUNT(*) FROM bench WHERE eql_v2.bloom_filter(encrypted_text) IS NOT NULL", - ) - .fetch_one(&pool) - .await?; - assert_eq!( - count.0, BENCH_ROW_COUNT, - "all rows should have bloom_filter index terms" - ); - Ok(()) -} - -/// Verify ORE terms are extractable from encrypted_int (3 of 5 indexes are ORE btree) -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_encrypted_int_has_ore_terms(pool: PgPool) -> Result<()> { - let count: (i64,) = sqlx::query_as( - "SELECT COUNT(*) FROM bench WHERE eql_v2.ore_block_u64_8_256(encrypted_int) IS NOT NULL", - ) - .fetch_one(&pool) - .await?; - assert_eq!( - count.0, BENCH_ROW_COUNT, - "all rows should have ORE block index terms" - ); - Ok(()) -} - -/// Verify ORE terms are extractable from encrypted_bigint -/// -/// Both int and bigint columns use the same eql_v2_encrypted type and ob index structure. -/// These tests verify that data seeding populated both columns, not that encoding differs. -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_encrypted_bigint_has_ore_terms(pool: PgPool) -> Result<()> { - let count: (i64,) = sqlx::query_as( - "SELECT COUNT(*) FROM bench WHERE eql_v2.ore_block_u64_8_256(encrypted_bigint) IS NOT NULL", - ) - .fetch_one(&pool) - .await?; - assert_eq!( - count.0, BENCH_ROW_COUNT, - "all rows should have ORE block index terms" - ); - Ok(()) -} - -// ========== Index Usage Tests (with fixture) ========== - -/// Verify hash index is used for hmac_256 equality lookup -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_hmac_equality_uses_hash_index(pool: PgPool) -> Result<()> { - let encrypted = fetch_sample_encrypted_text(&pool).await?; - - let sql = format!( - "SELECT * FROM bench WHERE eql_v2.hmac_256(encrypted_text) = eql_v2.hmac_256('{}'::jsonb::eql_v2_encrypted)", - encrypted - ); - assert_uses_index(&pool, &sql, "bench_text_hmac_idx").await?; - Ok(()) -} - -/// Verify btree index is used for ORDER BY with LIMIT on encrypted_int -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_ore_order_uses_btree_index(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM bench ORDER BY encrypted_int LIMIT 10"; - assert_uses_index(&pool, sql, "bench_int_ore_idx").await?; - Ok(()) -} - -/// Verify GIN index is used for bloom_filter containment -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_bloom_containment_uses_gin_index(pool: PgPool) -> Result<()> { - let encrypted = fetch_sample_encrypted_text(&pool).await?; - - let sql = format!( - "SELECT * FROM bench WHERE eql_v2.bloom_filter(encrypted_text) @> eql_v2.bloom_filter('{}'::jsonb::eql_v2_encrypted)", - encrypted - ); - assert_uses_index(&pool, &sql, "bench_text_bloom_idx").await?; - Ok(()) -} - -/// Verify btree index is used for ORDER BY with LIMIT on encrypted_text -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_ore_text_order_uses_btree_index(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM bench ORDER BY encrypted_text LIMIT 10"; - assert_uses_index(&pool, sql, "bench_text_ore_idx").await?; - Ok(()) -} - -/// Verify btree index is used for ORDER BY with LIMIT on encrypted_bigint -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_ore_bigint_order_uses_btree_index(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM bench ORDER BY encrypted_bigint LIMIT 10"; - assert_uses_index(&pool, sql, "bench_bigint_ore_idx").await?; - Ok(()) -} - -/// Verify sequential scan without indexes (before/after pattern sanity check) -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bench_hmac_without_index_uses_seq_scan(pool: PgPool) -> Result<()> { - analyze_table(&pool, "bench").await?; - - let encrypted = fetch_sample_encrypted_text(&pool).await?; - - let sql = format!( - "SELECT * FROM bench WHERE eql_v2.hmac_256(encrypted_text) = eql_v2.hmac_256('{}'::jsonb::eql_v2_encrypted)", - encrypted - ); - let explain = explain_query(&pool, &sql).await?; - assert_uses_seq_scan(&explain); - Ok(()) -} diff --git a/tests/sqlx/tests/bench_plan_tests.rs b/tests/sqlx/tests/bench_plan_tests.rs deleted file mode 100644 index 2cb85ec1e..000000000 --- a/tests/sqlx/tests/bench_plan_tests.rs +++ /dev/null @@ -1,159 +0,0 @@ -//! Tier 1 benchmark plan assertions -//! -//! EXPLAIN-based tests asserting each P0/P1 query pattern uses the expected -//! index access method. Tests for known-broken patterns are marked #[ignore]. -//! -//! ANALYZE is run by the bench_setup fixture — planner statistics are populated at fixture load. - -use anyhow::Result; -use eql_tests::{assert_uses_index, get_bench_encrypted_int, get_bench_encrypted_text}; -use sqlx::PgPool; - -const BENCH_INT_ORE_IDX: &str = "bench_int_ore_idx"; -const BENCH_TEXT_HMAC_IDX: &str = "bench_text_hmac_idx"; -const BENCH_TEXT_BLOOM_IDX: &str = "bench_text_bloom_idx"; - -/// ORE range query (less-than) uses btree index -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn ore_int_range_lt_uses_btree_index(pool: PgPool) -> Result<()> { - let encrypted = get_bench_encrypted_int(&pool, 50).await?; - - let sql = format!( - "SELECT * FROM bench WHERE encrypted_int < '{}'::jsonb::eql_v2_encrypted \ - ORDER BY encrypted_int LIMIT 10", - encrypted - ); - assert_uses_index(&pool, &sql, BENCH_INT_ORE_IDX).await?; - Ok(()) -} - -/// ORE range query (greater-than) uses btree index -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn ore_int_range_gt_uses_btree_index(pool: PgPool) -> Result<()> { - let encrypted = get_bench_encrypted_int(&pool, 50).await?; - - let sql = format!( - "SELECT * FROM bench WHERE encrypted_int > '{}'::jsonb::eql_v2_encrypted \ - ORDER BY encrypted_int LIMIT 10", - encrypted - ); - assert_uses_index(&pool, &sql, BENCH_INT_ORE_IDX).await?; - Ok(()) -} - -/// ORE combined range (>= low AND <= high) uses btree index -/// -/// Uses explicit >= / <= rather than BETWEEN — BETWEEN's operator resolution -/// against eql_v2_encrypted is untested and may not resolve to the btree family. -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn ore_int_range_combined_uses_btree_index(pool: PgPool) -> Result<()> { - let low = get_bench_encrypted_int(&pool, 10).await?; - let high = get_bench_encrypted_int(&pool, 90).await?; - - let sql = format!( - "SELECT * FROM bench \ - WHERE encrypted_int >= '{}'::jsonb::eql_v2_encrypted \ - AND encrypted_int <= '{}'::jsonb::eql_v2_encrypted \ - ORDER BY encrypted_int LIMIT 10", - low, high - ); - assert_uses_index(&pool, &sql, BENCH_INT_ORE_IDX).await?; - Ok(()) -} - -/// eql_cast equality should use hash index — currently seq scans (CIP-2831) -/// -/// "eql_cast" refers to the implicit JSONB-to-eql_v2_encrypted assignment cast -/// defined in `src/encrypted/casts.sql` (`CREATE CAST (jsonb AS eql_v2_encrypted) -/// WITH FUNCTION eql_v2.to_encrypted(jsonb)`). The SQL under test uses -/// `'...'::jsonb::eql_v2_encrypted`, which invokes that cast. PostgreSQL does not -/// recognise this cast path as equivalent to the indexed `hmac_256` term, so the -/// planner falls back to a sequential scan instead of using `bench_text_hmac_idx`. -/// -/// Remove #[ignore] when eql_cast index usage is fixed. At 1M rows this query -/// takes 7.83s vs 0.4ms for hmac_256 — a 19,500x regression. -/// Passing with the 10K-row fixture confirms index usage — timing data above was measured at 1M rows. -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[ignore = "CIP-2831: eql_cast equality performs full seq scan, no index used"] -async fn eql_cast_equality_uses_hash_index(pool: PgPool) -> Result<()> { - let encrypted = get_bench_encrypted_text(&pool, 1).await?; - - let sql = format!( - "SELECT * FROM bench WHERE encrypted_text = '{}'::jsonb::eql_v2_encrypted", - encrypted - ); - assert_uses_index(&pool, &sql, BENCH_TEXT_HMAC_IDX).await?; - Ok(()) -} - -/// ORE equality via operator class should use btree — currently seq scans (CIP-2831) -/// -/// Like `eql_cast_equality_uses_hash_index`, the SQL uses `'...'::jsonb::eql_v2_encrypted` -/// (the implicit JSONB assignment cast from `src/encrypted/casts.sql`). For integer -/// columns with ORE index terms the planner should satisfy equality via the btree -/// operator class, but the cast path prevents index recognition and causes a seq scan. -/// -/// CIP-2831 covers both this and `eql_cast_equality_uses_hash_index` as a single root cause fix. -/// Remove #[ignore] when ORE equality index usage is fixed. At 1M rows this -/// query takes 18.47s vs 0.4ms for hmac_256. -/// Passing with the 10K-row fixture confirms index usage — timing data above was measured at 1M rows. -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[ignore = "CIP-2831: ORE equality via operator class performs full seq scan"] -async fn ore_equality_uses_btree_index(pool: PgPool) -> Result<()> { - let encrypted = get_bench_encrypted_int(&pool, 1).await?; - - let sql = format!( - "SELECT * FROM bench WHERE encrypted_int = '{}'::jsonb::eql_v2_encrypted", - encrypted - ); - assert_uses_index(&pool, &sql, BENCH_INT_ORE_IDX).await?; - Ok(()) -} - -/// Bare LIKE against an encrypted column engages the bloom_filter functional -/// index. Requires `~~` operator + `eql_v2.like` helper to both inline so the -/// planner reaches `bloom_filter(a) @> bloom_filter(b)`. -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bare_like_uses_bloom_index(pool: PgPool) -> Result<()> { - let encrypted = get_bench_encrypted_text(&pool, 1).await?; - - let sql = format!( - "SELECT * FROM bench WHERE encrypted_text ~~ '{}'::jsonb::eql_v2_encrypted", - encrypted - ); - assert_uses_index(&pool, &sql, BENCH_TEXT_BLOOM_IDX).await?; - Ok(()) -} - -/// Bare ILIKE engages the bloom_filter functional index — same mechanism as `~~`. -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bare_ilike_uses_bloom_index(pool: PgPool) -> Result<()> { - let encrypted = get_bench_encrypted_text(&pool, 1).await?; - - let sql = format!( - "SELECT * FROM bench WHERE encrypted_text ~~* '{}'::jsonb::eql_v2_encrypted", - encrypted - ); - assert_uses_index(&pool, &sql, BENCH_TEXT_BLOOM_IDX).await?; - Ok(()) -} diff --git a/tests/sqlx/tests/bench_regression_tests.rs b/tests/sqlx/tests/bench_regression_tests.rs deleted file mode 100644 index 2d49faa62..000000000 --- a/tests/sqlx/tests/bench_regression_tests.rs +++ /dev/null @@ -1,113 +0,0 @@ -//! Tier 1 benchmark magnitude regression tests -//! -//! Asserts execution time stays under generous thresholds to catch catastrophic regressions -//! while tolerating CI runner variance. Most thresholds are ~100x the expected baseline; -//! ore_order_by uses 4x (543ms observed baseline leaves little headroom for a 100x multiple -//! without creating a test that never fails). -//! Uses EXPLAIN ANALYZE averaged over 5 runs for server-side timing. -//! -//! Patterns known to be broken (P0 seq scans) are NOT included here — encoding -//! bad performance as "acceptable" defeats the purpose. See bench_plan_tests.rs -//! for their #[ignore] plan assertions. - -use anyhow::Result; -use eql_tests::{ - explain_analyze_avg, get_bench_encrypted_int, get_bench_encrypted_text, ExplainStats, -}; -use sqlx::PgPool; - -/// hmac_256 equality must stay under 50ms on 10K rows (expected ~0.5ms) -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn hmac_equality_under_threshold(pool: PgPool) -> Result<()> { - // id=1 maps to 1 of 100 distinct values → ~100 matching rows at 10K - let encrypted = get_bench_encrypted_text(&pool, 1).await?; - - let sql = format!( - "SELECT * FROM bench WHERE eql_v2.hmac_256(encrypted_text) = eql_v2.hmac_256('{}'::jsonb::eql_v2_encrypted)", - encrypted - ); - let stats: ExplainStats = explain_analyze_avg(&pool, &sql, 5).await?; - assert!( - stats.execution_time_ms < 50.0, - "hmac_256 equality took {:.1}ms, threshold 50ms (expected ~0.5ms at 10K rows, node_type={})", - stats.execution_time_ms, stats.node_type - ); - Ok(()) -} - -/// bloom_filter containment must stay under 100ms on 10K rows (expected ~1ms) -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn bloom_filter_containment_under_threshold(pool: PgPool) -> Result<()> { - // id=1 maps to 1 of 100 distinct values → ~100 matching rows at 10K - let encrypted = get_bench_encrypted_text(&pool, 1).await?; - - let sql = format!( - "SELECT * FROM bench WHERE eql_v2.bloom_filter(encrypted_text) @> eql_v2.bloom_filter('{}'::jsonb::eql_v2_encrypted)", - encrypted - ); - let stats: ExplainStats = explain_analyze_avg(&pool, &sql, 5).await?; - assert!( - stats.execution_time_ms < 100.0, - "bloom_filter containment took {:.1}ms, threshold 100ms (expected ~1ms at 10K rows, node_type={})", - stats.execution_time_ms, stats.node_type - ); - Ok(()) -} - -/// ORE range query (< LIMIT 10) must stay under 200ms on 10K rows (expected ~2ms) -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn ore_range_lt_under_threshold(pool: PgPool) -> Result<()> { - // id=50 is the bench row midpoint; encrypted_int uses a +33 offset so this maps - // to ore id 83, but the 10K distribution still yields ~4,900 rows below the predicate - let encrypted = get_bench_encrypted_int(&pool, 50).await?; - - let sql = format!( - "SELECT * FROM bench WHERE encrypted_int < '{}'::jsonb::eql_v2_encrypted \ - ORDER BY encrypted_int LIMIT 10", - encrypted - ); - let stats: ExplainStats = explain_analyze_avg(&pool, &sql, 5).await?; - assert!( - stats.execution_time_ms < 200.0, - "ORE range < LIMIT 10 took {:.1}ms, threshold 200ms (expected ~2ms at 10K rows, node_type={})", - stats.execution_time_ms, stats.node_type - ); - Ok(()) -} - -/// ORE ORDER BY LIMIT 10 must stay under 2000ms on 10K rows -/// -/// The design doc's observed baseline for this pattern is ~543ms at 10K rows -/// ("Full-set comparison before sort"). Threshold is set at 2000ms — 4x the -/// observed baseline — to absorb CI variance while catching catastrophic regressions. -#[sqlx::test(fixtures(path = "../fixtures", scripts("bench_data", "bench_setup")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn ore_order_by_under_threshold(pool: PgPool) -> Result<()> { - let stats: ExplainStats = explain_analyze_avg( - &pool, - "SELECT * FROM bench ORDER BY encrypted_int LIMIT 10", - 5, - ) - .await?; - assert!( - stats.execution_time_ms < 2000.0, - "ORE ORDER BY LIMIT 10 took {:.1}ms, threshold 2000ms (observed ~543ms baseline at 10K rows, node_type={})", - stats.execution_time_ms, stats.node_type - ); - Ok(()) -} diff --git a/tests/sqlx/tests/comparison_tests.rs b/tests/sqlx/tests/comparison_tests.rs deleted file mode 100644 index 8bd3ff332..000000000 --- a/tests/sqlx/tests/comparison_tests.rs +++ /dev/null @@ -1,856 +0,0 @@ -//! Comparison operator tests (< > <= >=) -//! -//! Tests EQL comparison operators with ORE (Order-Revealing Encryption) - -use anyhow::{Context, Result}; -use eql_tests::{ - assert_uses_index, get_ore_encrypted, get_ore_encrypted_as_jsonb, get_ste_vec_selector_term, - QueryAssertion, Selectors, -}; -use sqlx::{PgPool, Row}; - -/// Helper to execute create_encrypted_json SQL function -#[allow(dead_code)] -async fn create_encrypted_json_with_index( - pool: &PgPool, - id: i32, - index_type: &str, -) -> Result { - let sql = format!( - "SELECT create_encrypted_json({}, '{}')::text", - id, index_type - ); - - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching create_encrypted_json({}, '{}')", id, index_type))?; - - let result: Option = row.try_get(0).with_context(|| { - format!( - "extracting text column for id={}, index_type='{}'", - id, index_type - ) - })?; - - result.with_context(|| { - format!( - "create_encrypted_json returned NULL for id={}, index_type='{}'", - id, index_type - ) - }) -} - -// ============================================================================ -// Task 2: Less Than (<) Operator Tests -// ============================================================================ - -#[sqlx::test] -async fn less_than_operator_with_ore(pool: PgPool) -> Result<()> { - // Test: e < e with ORE encryption - // Value 42 should have 41 records less than it (1-41) - // Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - - // Get encrypted value for id=42 from pre-seeded ore table - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted", - ore_term - ); - - // Should return 41 records (ids 1-41) - QueryAssertion::new(&pool, &sql).count(41).await; - - Ok(()) -} - -#[sqlx::test] -async fn lt_function_with_ore(pool: PgPool) -> Result<()> { - // Test: eql_v2.lt() function with ORE - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE eql_v2.lt(e, '{}'::eql_v2_encrypted)", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(41).await; - - Ok(()) -} - -#[sqlx::test] -async fn less_than_operator_encrypted_less_than_jsonb(pool: PgPool) -> Result<()> { - // Test: e < jsonb with ORE - // Tests jsonb variant of < operator (casts jsonb to eql_v2_encrypted) - // Get encrypted value for id=42, remove 'ob' field to create comparable JSONB - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE e < '{}'::jsonb", json_value); - - // Records with id < 42 should match (ids 1-41) - QueryAssertion::new(&pool, &sql).count(41).await; - - Ok(()) -} - -#[sqlx::test] -async fn less_than_operator_jsonb_less_than_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb < e with ORE (reverse direction) - // Tests jsonb variant of < operator with operands reversed - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE '{}'::jsonb < e", json_value); - - // jsonb(42) < e means e > 42, so 958 records (43-1000) - QueryAssertion::new(&pool, &sql).count(958).await; - - Ok(()) -} - -// ============================================================================ -// Task 3: Greater Than (>) Operator Tests -// ============================================================================ - -#[sqlx::test] -async fn greater_than_operator_with_ore(pool: PgPool) -> Result<()> { - // Test: e > e with ORE encryption - // Value 42 should have 958 records greater than it (43-1000) - // Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e > '{}'::eql_v2_encrypted", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(958).await; - - Ok(()) -} - -#[sqlx::test] -async fn gt_function_with_ore(pool: PgPool) -> Result<()> { - // Test: eql_v2.gt() function with ORE - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE eql_v2.gt(e, '{}'::eql_v2_encrypted)", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(958).await; - - Ok(()) -} - -#[sqlx::test] -async fn greater_than_operator_encrypted_greater_than_jsonb(pool: PgPool) -> Result<()> { - // Test: e > jsonb with ORE - // Tests jsonb variant of > operator (casts jsonb to eql_v2_encrypted) - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE e > '{}'::jsonb", json_value); - - // Records with id > 42 should match (ids 43-1000 = 958 records) - QueryAssertion::new(&pool, &sql).count(958).await; - - Ok(()) -} - -#[sqlx::test] -async fn greater_than_operator_jsonb_greater_than_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb > e with ORE (reverse direction) - // Tests jsonb variant of > operator with operands reversed - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE '{}'::jsonb > e", json_value); - - // jsonb(42) > e means e < 42, so 41 records (1-41) - QueryAssertion::new(&pool, &sql).count(41).await; - - Ok(()) -} - -// ============================================================================ -// Task 4: Less Than or Equal (<=) Operator Tests -// ============================================================================ - -#[sqlx::test] -async fn less_than_or_equal_operator_with_ore(pool: PgPool) -> Result<()> { - // Test: e <= e with ORE encryption - // Value 42 should have 42 records <= it (1-42 inclusive) - // Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e <= '{}'::eql_v2_encrypted", - ore_term - ); - - // Should return 42 records (ids 1-42 inclusive) - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn lte_function_with_ore(pool: PgPool) -> Result<()> { - // Test: eql_v2.lte() function with ORE - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE eql_v2.lte(e, '{}'::eql_v2_encrypted)", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn less_than_or_equal_with_jsonb(pool: PgPool) -> Result<()> { - // Test: e <= jsonb with ORE - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE e <= '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn less_than_or_equal_jsonb_lte_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb <= e with ORE (reverse direction) - // Complements e <= jsonb test for symmetry with other operators - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE '{}'::jsonb <= e", json_value); - - // jsonb(42) <= e means e >= 42, so 959 records (42-1000) - QueryAssertion::new(&pool, &sql).count(959).await; - - Ok(()) -} - -// ============================================================================ -// Task 5: Greater Than or Equal (>=) Operator Tests -// ============================================================================ - -#[sqlx::test] -async fn greater_than_or_equal_operator_with_ore(pool: PgPool) -> Result<()> { - // Test: e >= e with ORE encryption - // Value 42 should have 959 records >= it (42-1000 inclusive) - // Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e >= '{}'::eql_v2_encrypted", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(959).await; - - Ok(()) -} - -#[sqlx::test] -async fn gte_function_with_ore(pool: PgPool) -> Result<()> { - // Test: eql_v2.gte() function with ORE - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE eql_v2.gte(e, '{}'::eql_v2_encrypted)", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(959).await; - - Ok(()) -} - -#[sqlx::test] -async fn greater_than_or_equal_with_jsonb(pool: PgPool) -> Result<()> { - // Test: e >= jsonb with ORE - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE e >= '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(959).await; - - Ok(()) -} - -#[sqlx::test] -async fn greater_than_or_equal_jsonb_gte_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb >= e with ORE (reverse direction) - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT id FROM ore WHERE '{}'::jsonb >= e", json_value); - - // jsonb(42) >= e means e <= 42, so 42 records (1-42) - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -// ============================================================================ -// Selector-based Comparison Tests -// ============================================================================ -// Tests for extracting subterms with e->'selector' and comparing them -// Covers ore_cllw and ore_cllw index types with fallback behavior - -#[sqlx::test] -async fn selector_less_than_with_ore_cllw(pool: PgPool) -> Result<()> { - // Test: ordered comparison on an sv-element extracted via `->`. - // - // Uses test data created by seed_encrypted_json() helper which creates: - // - Three records with n=10, n=20, n=30 - // - ore_cllw index on $.n selector - // - // Post-#219 (strict separation): the bare-form `<` on - // `eql_v2_encrypted` reduces to Block-ORE comparison (`ob`), which - // raises here because sv-element CLLW terms carry `oc`, not `ob`. - // The canonical recipe is to cast both sides to - // `eql_v2.ste_vec_entry`, then `<` resolves to the entry-typed - // operator which inlines to `ore_cllw(a) < ore_cllw(b)`. - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=30 test data. The returned text is - // the composite-row representation of an eql_v2_encrypted, parseable - // back via `'...'::eql_v2_encrypted`. - let term = get_ste_vec_selector_term(&pool, 30, Selectors::N).await?; - - // Should return 2 records (n=10 and n=20). Both sides type as - // `eql_v2.ste_vec_entry` (LHS via `->`'s post-flip return type; - // RHS via direct cast of the JSON literal `term`). - let sql = format!( - "SELECT e FROM encrypted WHERE \ - e -> '{}'::text \ - < \ - '{}'::eql_v2.ste_vec_entry", - Selectors::N, - term - ); - - QueryAssertion::new(&pool, &sql).count(2).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_less_than_with_ore_cllw_fallback(pool: PgPool) -> Result<()> { - // Test: e->'selector' < term fallback when index missing - // - // Tests that comparison falls back to JSONB literal comparison when the - // requested index type is not present on the selector. Post-2.3 the LHS - // sv element carries `hm`; the RHS (extracted via get_ste_vec_selector_term - // straight from the bare fixture) does not. compare() therefore can't - // engage the hmac branch (it requires both sides) and falls through to - // compare_literal, whose result depends on raw JSONB byte ordering. - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=30 test data - let term = get_ste_vec_selector_term(&pool, 30, Selectors::N).await?; - - // Query with $.hello selector (which has ore_cllw, not ore_cllw). - // The literal-byte fallback orders all stored $.hello values after the - // $.n term, so no rows match `< term`. - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text < '{}'::eql_v2_encrypted", - Selectors::HELLO, - term - ); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_less_than_with_ore_cllw_str(pool: PgPool) -> Result<()> { - // Test: e->'selector' < term with ore_cllw index - // - // STE vec test data has ore_cllw on $.hello selector (a7cea93975ed8c01f861ccb6bd082784) - // Extract $.hello from ste_vec id=3 and compare - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.hello selector term from n=30 test data (corresponds to "three") - let term = get_ste_vec_selector_term(&pool, 30, Selectors::HELLO).await?; - - // Query: e->'$.hello' < term(from ste_vec 3) - // Should return 1 record (ste_vec id=1, since "world 1" < "world 3") - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text < '{}'::eql_v2_encrypted", - Selectors::HELLO, - term - ); - - QueryAssertion::new(&pool, &sql).count(1).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_with_ore_cllw(pool: PgPool) -> Result<()> { - // Test: e->'selector' > term with ore_cllw index - // - // Extract $.n from ste_vec id=2 (n=20 value) and find records > 20 - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=20 test data - let term = get_ste_vec_selector_term(&pool, 20, Selectors::N).await?; - - // Query: e->'$.n' > term(20) - // Should return 1 record (n=30) - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text > '{}'::eql_v2_encrypted", - Selectors::N, - term - ); - - QueryAssertion::new(&pool, &sql).count(1).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_with_ore_cllw_fallback(pool: PgPool) -> Result<()> { - // Test: e->'selector' > term fallback when index missing - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=20 test data - let term = get_ste_vec_selector_term(&pool, 20, Selectors::N).await?; - - // Query with $.hello selector (falls back to JSONB comparison) - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text > '{}'::eql_v2_encrypted", - Selectors::HELLO, - term - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_with_ore_cllw_str(pool: PgPool) -> Result<()> { - // Test: e->'selector' > term with ore_cllw index - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.hello selector term from n=30 test data (corresponds to "three") - let term = get_ste_vec_selector_term(&pool, 30, Selectors::HELLO).await?; - - // Query: e->'$.hello' > term - // Should return 1 record - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text > '{}'::eql_v2_encrypted", - Selectors::HELLO, - term - ); - - QueryAssertion::new(&pool, &sql).count(1).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_with_ore_cllw_fallback_str(pool: PgPool) -> Result<()> { - // Test: e->'selector' > term fallback to JSONB comparison - // - // Tests fallback when selector doesn't have ore_cllw. Post-2.3 the - // LHS sv element carries `hm`; the RHS (raw fixture term) does not, so - // compare() can't engage the hmac branch and falls through to - // compare_literal — its result depends on raw JSONB byte ordering. - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.hello selector term from n=30 test data - let term = get_ste_vec_selector_term(&pool, 30, Selectors::HELLO).await?; - - // Query with $.n selector (which has ore_cllw, not ore_cllw). - // The literal-byte fallback orders all stored $.n values after the - // $.hello term, so every row matches `> term`. - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text > '{}'::eql_v2_encrypted", - Selectors::N, - term - ); - - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_less_than_or_equal_with_ore_cllw(pool: PgPool) -> Result<()> { - // Test: e->'selector' <= term with ore_cllw index - // - // Extract $.n from ste_vec id=2 (n=20) and find records <= 20 - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=20 test data - let term = get_ste_vec_selector_term(&pool, 20, Selectors::N).await?; - - // Query: e->'$.n' <= term(20) - // Should return 2 records (n=10 and n=20) - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text <= '{}'::eql_v2_encrypted", - Selectors::N, - term - ); - - QueryAssertion::new(&pool, &sql).count(2).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_less_than_or_equal_with_ore_cllw_fallback(pool: PgPool) -> Result<()> { - // Test: e->'selector' <= term fallback when index missing - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=20 test data - let term = get_ste_vec_selector_term(&pool, 20, Selectors::N).await?; - - // Query with $.hello selector (falls back to JSONB comparison) - // The extracted term is numeric but $.hello selector expects string - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text <= '{}'::eql_v2_encrypted", - Selectors::HELLO, - term - ); - - // SQL test behavior: fallback succeeds but returns no results due to type mismatch - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_or_equal_with_ore_cllw(pool: PgPool) -> Result<()> { - // Test: e->'selector' >= term with ore_cllw index - // - // Extract $.n from ste_vec id=1 (n=10) and find records >= 10 - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=10 test data - let term = get_ste_vec_selector_term(&pool, 10, Selectors::N).await?; - - // Query: e->'$.n' >= term(10) - // Should return 3 records (n=10, n=20, n=30) - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text >= '{}'::eql_v2_encrypted", - Selectors::N, - term - ); - - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_or_equal_with_ore_cllw_fallback(pool: PgPool) -> Result<()> { - // Test: e->'selector' >= term fallback when index missing - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.n selector term from n=10 test data - let term = get_ste_vec_selector_term(&pool, 10, Selectors::N).await?; - - // Query with $.hello selector (falls back to JSONB comparison) - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text >= '{}'::eql_v2_encrypted", - Selectors::HELLO, - term - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_or_equal_with_ore_cllw_str(pool: PgPool) -> Result<()> { - // Test: e->'selector' >= term with ore_cllw index - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.hello selector term from n=10 test data (corresponds to "one") - let term = get_ste_vec_selector_term(&pool, 10, Selectors::HELLO).await?; - - // Query: e->'$.hello' >= term - // Should return 3 records (all have "world X" >= "world 1") - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text >= '{}'::eql_v2_encrypted", - Selectors::HELLO, - term - ); - - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block term comparison (raises on missing ob). Callers on ore_cllw / ore_cllw columns must use the extractor form, e.g. eql_v2.ore_cllw(col) < eql_v2.ore_cllw($1::jsonb). Re-enable once the inlined operators support a CASE-style dispatch across ORE encodings."] -async fn selector_greater_than_or_equal_with_ore_cllw_fallback_str(pool: PgPool) -> Result<()> { - // Test: e->'selector' >= term fallback to JSONB comparison - - sqlx::query("SELECT create_table_with_encrypted()") - .execute(&pool) - .await?; - - sqlx::query("SELECT seed_encrypted_json()") - .execute(&pool) - .await?; - - // Extract $.hello selector term from n=10 test data - let term = get_ste_vec_selector_term(&pool, 10, Selectors::HELLO).await?; - - // Query with $.n selector (falls back to JSONB comparison) - let sql = format!( - "SELECT e FROM encrypted WHERE e->'{}'::text >= '{}'::eql_v2_encrypted", - Selectors::N, - term - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -// ============================================================================ -// Inlined range operators: functional ORE index engagement -// -// After the < / <= / > / >= operator wrappers were flipped to inlinable SQL -// (body: `eql_v2.ore_block_u64_8_256(a) eql_v2.ore_block_u64_8_256(b)`), -// `WHERE col < $1` reduces to an expression that structurally matches a -// functional B-tree index built on `eql_v2.ore_block_u64_8_256(col)`. These -// tests build that index against the seeded `ore` table and assert the -// planner reaches Index Scan / Bitmap Index Scan rather than Seq Scan. -// -// The full-extractor and hybrid query shapes (extractor on both sides, or on -// only the ORDER BY clause) are also exercised because they share the same -// planner match path — confirming the design across all three shapes that -// the bench surfaces. -// ============================================================================ - -const ORE_FUNCTIONAL_INDEX: &str = "ore_e_ore_block_idx"; - -async fn setup_ore_functional_index(pool: &PgPool) -> Result<()> { - sqlx::query(&format!( - "CREATE INDEX IF NOT EXISTS {} ON ore (eql_v2.ore_block_u64_8_256(e))", - ORE_FUNCTIONAL_INDEX - )) - .execute(pool) - .await?; - sqlx::query("ANALYZE ore").execute(pool).await?; - sqlx::query("SET enable_seqscan = off") - .execute(pool) - .await?; - Ok(()) -} - -#[sqlx::test] -async fn natural_form_lt_engages_functional_ore_index(pool: PgPool) -> Result<()> { - // No ORDER BY id — including the primary key sort would bias the planner - // toward an ordered ore_pkey walk with the `<` applied as a Filter. We're - // testing that the inlined `<` operator engages the functional ORE index - // on its own; that requires the WHERE clause to be the dominant cost. - setup_ore_functional_index(&pool).await?; - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT count(*) FROM ore WHERE e < '{}'::eql_v2_encrypted", - ore_term - ); - - assert_uses_index(&pool, &sql, ORE_FUNCTIONAL_INDEX).await?; - Ok(()) -} - -#[sqlx::test] -async fn natural_form_gt_engages_functional_ore_index(pool: PgPool) -> Result<()> { - setup_ore_functional_index(&pool).await?; - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT count(*) FROM ore WHERE e > '{}'::eql_v2_encrypted", - ore_term - ); - - assert_uses_index(&pool, &sql, ORE_FUNCTIONAL_INDEX).await?; - Ok(()) -} - -#[sqlx::test] -async fn natural_form_jsonb_lt_engages_functional_ore_index(pool: PgPool) -> Result<()> { - // Cross-type overload (encrypted, jsonb). Inlined body reduces to the - // same `ore_block(value) < ore_block($1)` shape and matches the index. - setup_ore_functional_index(&pool).await?; - let jsonb = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!("SELECT count(*) FROM ore WHERE e < '{}'::jsonb", jsonb); - - assert_uses_index(&pool, &sql, ORE_FUNCTIONAL_INDEX).await?; - Ok(()) -} - -#[sqlx::test] -async fn hybrid_form_lt_engages_functional_ore_index_without_sort(pool: PgPool) -> Result<()> { - // Natural WHERE, extractor ORDER BY — the sort key now matches the - // index expression syntactically, so the planner streams rows out of - // the index in order (no Sort node). - setup_ore_functional_index(&pool).await?; - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted \ - ORDER BY eql_v2.ore_block_u64_8_256(e) LIMIT 10", - ore_term - ); - - assert_uses_index(&pool, &sql, ORE_FUNCTIONAL_INDEX).await?; - Ok(()) -} - -#[sqlx::test] -async fn lt_on_column_without_ob_term_raises(pool: PgPool) -> Result<()> { - // Behaviour change: previously `compare()`'s priority list fell through - // ore_block → ore_cllw → ope → hmac → literal, so a missing `ob` could - // silently dispatch to hmac or literal compare. Now `<` inlines directly - // to `ore_block_u64_8_256(a) < ore_block_u64_8_256(b)`, and the plpgsql - // ore_block extractor raises a clear error on a payload without `ob`. - let payload_without_ob = - "(\"{\\\"i\\\":{\\\"t\\\":\\\"x\\\",\\\"c\\\":\\\"v\\\"},\\\"v\\\":2,\\\"hm\\\":\\\"abc\\\"}\")"; - let sql = format!( - "SELECT 1 WHERE '{}'::eql_v2_encrypted < '{}'::eql_v2_encrypted", - payload_without_ob, payload_without_ob - ); - - let err = sqlx::query(&sql) - .execute(&pool) - .await - .expect_err("expected raise on missing ob term"); - - let msg = format!("{err:?}"); - assert!( - msg.contains("Expected an ore index (ob)"), - "expected ore_block extractor raise, got: {msg}" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/config_tests.rs b/tests/sqlx/tests/config_tests.rs deleted file mode 100644 index dd1c6eae5..000000000 --- a/tests/sqlx/tests/config_tests.rs +++ /dev/null @@ -1,866 +0,0 @@ -//! Configuration management tests -//! -//! Tests EQL configuration add/remove operations and state management - -use anyhow::{Context, Result}; -use sqlx::PgPool; - -/// Helper to check if search config exists -/// Replicates _search_config_exists SQL function from lines 25-33 -async fn search_config_exists( - pool: &PgPool, - table_name: &str, - column_name: &str, - index_name: &str, - state: &str, -) -> Result { - let exists: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT id FROM eql_v2_configuration c - WHERE c.state = $1::eql_v2_configuration_state - AND c.data #> array['tables', $2, $3, 'indexes'] ? $4 - )", - ) - .bind(state) - .bind(table_name) - .bind(column_name) - .bind(index_name) - .fetch_one(pool) - .await - .context("checking search config existence")?; - - Ok(exists) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn add_and_remove_multiple_indexes(pool: PgPool) -> Result<()> { - // Test: Add and remove multiple indexes (6 assertions) - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Add match index - sqlx::query("SELECT eql_v2.add_search_config('users', 'name', 'match', migrating => true)") - .execute(&pool) - .await?; - - assert!( - search_config_exists(&pool, "users", "name", "match", "pending").await?, - "match index should exist" - ); - - // Add unique index with cast - sqlx::query( - "SELECT eql_v2.add_search_config('users', 'name', 'unique', 'int', migrating => true)", - ) - .execute(&pool) - .await?; - - assert!( - search_config_exists(&pool, "users", "name", "unique", "pending").await?, - "unique index should exist" - ); - - // Verify cast_as exists - let has_cast: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT id FROM eql_v2_configuration c - WHERE c.state = 'pending' - AND c.data #> array['tables', 'users', 'name'] ? 'cast_as' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(has_cast, "cast_as should be present"); - - // Remove match index - sqlx::query("SELECT eql_v2.remove_search_config('users', 'name', 'match', migrating => true)") - .execute(&pool) - .await?; - - assert!( - !search_config_exists(&pool, "users", "name", "match", "pending").await?, - "match index should be removed" - ); - - // Remove unique index - sqlx::query("SELECT eql_v2.remove_search_config('users', 'name', 'unique', migrating => true)") - .execute(&pool) - .await?; - - // Verify column config preserved but indexes empty - let indexes_empty: bool = sqlx::query_scalar( - "SELECT data #> array['tables', 'users', 'name', 'indexes'] = '{}' - FROM eql_v2_configuration c - WHERE c.state = 'pending'", - ) - .fetch_one(&pool) - .await?; - - assert!(indexes_empty, "indexes should be empty object"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn add_and_remove_indexes_from_multiple_tables(pool: PgPool) -> Result<()> { - // Test: Add/remove indexes from multiple tables (9 assertions) - - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Add index to users table - sqlx::query("SELECT eql_v2.add_search_config('users', 'name', 'match', migrating => true)") - .execute(&pool) - .await?; - - assert!( - search_config_exists(&pool, "users", "name", "match", "pending").await?, - "users.name match index should exist" - ); - - // Verify match index exists in JSONB path - let has_match: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT id FROM eql_v2_configuration c - WHERE c.state = 'pending' - AND c.data #> array['tables', 'users', 'name', 'indexes'] ? 'match' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(has_match, "users.name.indexes should contain match"); - - // Add index to blah table - sqlx::query( - "SELECT eql_v2.add_search_config('blah', 'vtha', 'unique', 'int', migrating => true)", - ) - .execute(&pool) - .await?; - - assert!( - search_config_exists(&pool, "blah", "vtha", "unique", "pending").await?, - "blah.vtha unique index should exist" - ); - - // Verify both tables have configs - assert!( - search_config_exists(&pool, "users", "name", "match", "pending").await?, - "users config should still exist" - ); - - let has_unique: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT id FROM eql_v2_configuration c - WHERE c.state = 'pending' - AND c.data #> array['tables', 'blah', 'vtha', 'indexes'] ? 'unique' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(has_unique, "blah.vtha.indexes should contain unique"); - - // Remove match index - sqlx::query("SELECT eql_v2.remove_search_config('users', 'name', 'match', migrating => true)") - .execute(&pool) - .await?; - - assert!( - !search_config_exists(&pool, "users", "name", "match", "pending").await?, - "users.name match index should be removed" - ); - - // Remove unique index - sqlx::query("SELECT eql_v2.remove_search_config('blah', 'vtha', 'unique', migrating => true)") - .execute(&pool) - .await?; - - assert!( - !search_config_exists(&pool, "blah", "vtha", "unique", "pending").await?, - "blah.vtha unique index should be removed" - ); - - // Verify config still exists but indexes are empty - let config_exists: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'pending')", - ) - .fetch_one(&pool) - .await?; - - assert!(config_exists, "pending configuration should still exist"); - - let blah_indexes_empty: bool = sqlx::query_scalar( - "SELECT data #> array['tables', 'blah', 'vtha', 'indexes'] = '{}' - FROM eql_v2_configuration c - WHERE c.state = 'pending'", - ) - .fetch_one(&pool) - .await?; - - assert!( - blah_indexes_empty, - "blah.vtha.indexes should be empty object" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn add_and_modify_index(pool: PgPool) -> Result<()> { - // Test: Add and modify index (6 assertions) - - // Add match index - sqlx::query("SELECT eql_v2.add_search_config('users', 'name', 'match', migrating => true)") - .execute(&pool) - .await?; - - assert!( - search_config_exists(&pool, "users", "name", "match", "pending").await?, - "match index should exist after add" - ); - - // Modify index with options - sqlx::query( - "SELECT eql_v2.modify_search_config('users', 'name', 'match', 'int', '{\"option\": \"value\"}'::jsonb, migrating => true)" - ) - .execute(&pool) - .await?; - - assert!( - search_config_exists(&pool, "users", "name", "match", "pending").await?, - "match index should still exist after modify" - ); - - // Verify option exists in match config - let has_option: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT id FROM eql_v2_configuration c - WHERE c.state = 'pending' - AND c.data #> array['tables', 'users', 'name', 'indexes', 'match'] ? 'option' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(has_option, "match index should contain option"); - - // Verify cast_as exists - let has_cast: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT id FROM eql_v2_configuration c - WHERE c.state = 'pending' - AND c.data #> array['tables', 'users', 'name'] ? 'cast_as' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(has_cast, "column should have cast_as"); - - // Remove match index - sqlx::query("SELECT eql_v2.remove_search_config('users', 'name', 'match', migrating => true)") - .execute(&pool) - .await?; - - // Verify config exists but indexes empty - let config_exists: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'pending')", - ) - .fetch_one(&pool) - .await?; - - assert!(config_exists, "pending configuration should exist"); - - let indexes_empty: bool = sqlx::query_scalar( - "SELECT data #> array['tables', 'users', 'name', 'indexes'] = '{}' - FROM eql_v2_configuration c - WHERE c.state = 'pending'", - ) - .fetch_one(&pool) - .await?; - - assert!(indexes_empty, "indexes should be empty object"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn add_index_with_existing_active_config(pool: PgPool) -> Result<()> { - // Test: Adding index creates new pending configuration when active config exists (3 assertions) - - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Create an active configuration - sqlx::query( - "INSERT INTO eql_v2_configuration (state, data) VALUES ( - 'active', - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"blah\": { - \"cast_as\": \"text\", - \"indexes\": { - \"match\": {} - } - }, - \"vtha\": { - \"cast_as\": \"text\", - \"indexes\": {} - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await?; - - // Verify active config exists - assert!( - search_config_exists(&pool, "users", "blah", "match", "active").await?, - "active config should have users.blah.match" - ); - - // Add new index - sqlx::query("SELECT eql_v2.add_search_config('users', 'name', 'match', migrating => true)") - .execute(&pool) - .await?; - - // Verify new index in pending - assert!( - search_config_exists(&pool, "users", "name", "match", "pending").await?, - "pending config should have users.name.match" - ); - - // Verify active config was copied to pending - assert!( - search_config_exists(&pool, "users", "blah", "match", "pending").await?, - "pending config should still have users.blah.match from active" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn add_column_to_nonexistent_table_fails(pool: PgPool) -> Result<()> { - // Test: Adding column to nonexistent table fails (2 assertions) - - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Attempt to add column to nonexistent table 'user' - let result = sqlx::query("SELECT eql_v2.add_column('user', 'name')") - .execute(&pool) - .await; - - assert!( - result.is_err(), - "add_column should fail for nonexistent table" - ); - - // Verify no configuration was created - let config_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM eql_v2_configuration") - .fetch_one(&pool) - .await?; - - assert_eq!(config_count, 0, "no configuration should be created"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn add_and_remove_column(pool: PgPool) -> Result<()> { - // Test: Add and remove column (4 assertions) - - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Add column - sqlx::query("SELECT eql_v2.add_column('encrypted', 'e', migrating => true)") - .execute(&pool) - .await?; - - // Verify pending configuration was created - let pending_count: i64 = - sqlx::query_scalar("SELECT COUNT(*) FROM eql_v2_configuration c WHERE c.state = 'pending'") - .fetch_one(&pool) - .await?; - - assert_eq!(pending_count, 1, "pending configuration should be created"); - - // Remove column - sqlx::query("SELECT eql_v2.remove_column('encrypted', 'e', migrating => true)") - .execute(&pool) - .await?; - - // Verify pending configuration still exists but is empty - let pending_exists: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'pending')", - ) - .fetch_one(&pool) - .await?; - - assert!(pending_exists, "pending configuration should still exist"); - - // Verify the config tables are empty - let tables_empty: bool = sqlx::query_scalar( - "SELECT data #> array['tables'] = '{}' - FROM eql_v2_configuration c - WHERE c.state = 'pending'", - ) - .fetch_one(&pool) - .await?; - - assert!(tables_empty, "tables should be empty object"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn configuration_accepts_canonical_type_names(pool: PgPool) -> Result<()> { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Test each new canonical type name - for type_name in &["json", "float", "decimal", "timestamp"] { - let config = serde_json::json!({ - "v": 1, - "tables": { - "events": { - "data": { - "cast_as": type_name, - "indexes": {} - } - } - } - }); - - let result = sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await; - - assert!( - result.is_ok(), - "Should accept '{}' as a valid cast type: {:?}", - type_name, - result.err() - ); - - // Clean up for next iteration - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - } - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn add_search_config_accepts_canonical_type_names(pool: PgPool) -> Result<()> { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Test each new canonical type via add_search_config - for type_name in &["json", "float", "decimal", "timestamp"] { - let result = sqlx::query( - "SELECT eql_v2.add_search_config('users', 'name', 'unique', $1, migrating => true)", - ) - .bind(*type_name) - .execute(&pool) - .await; - - assert!( - result.is_ok(), - "add_search_config should accept '{}': {:?}", - type_name, - result.err() - ); - - // Clean up for next iteration - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - } - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn configuration_accepts_plaintext_type_field(pool: PgPool) -> Result<()> { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Insert config using 'plaintext_type' instead of 'cast_as' - let config = serde_json::json!({ - "v": 1, - "tables": { - "users": { - "email": { - "plaintext_type": "text", - "indexes": { - "unique": {} - } - } - } - } - }); - - let result = sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await; - - assert!( - result.is_ok(), - "Should accept 'plaintext_type' field: {:?}", - result.err() - ); - - // Verify the config() view returns plaintext_type as decrypts_as - let decrypts_as: Option = sqlx::query_scalar( - "SELECT decrypts_as FROM eql_v2.config() WHERE relation = 'users' AND col_name = 'email'", - ) - .fetch_one(&pool) - .await?; - - assert_eq!( - decrypts_as.as_deref(), - Some("text"), - "config() should return plaintext_type value as decrypts_as" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn plaintext_type_takes_precedence_over_cast_as(pool: PgPool) -> Result<()> { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // When both fields are present, plaintext_type should win (cast_as is deprecated) - let config = serde_json::json!({ - "v": 1, - "tables": { - "users": { - "age": { - "plaintext_type": "int", - "cast_as": "text", - "indexes": { - "ore": {} - } - } - } - } - }); - - sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await?; - - let decrypts_as: Option = sqlx::query_scalar( - "SELECT decrypts_as FROM eql_v2.config() WHERE relation = 'users' AND col_name = 'age'", - ) - .fetch_one(&pool) - .await?; - - assert_eq!( - decrypts_as.as_deref(), - Some("int"), - "plaintext_type should take precedence over cast_as" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn config_mixes_cast_as_and_plaintext_type_across_columns(pool: PgPool) -> Result<()> { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - let config = serde_json::json!({ - "v": 1, - "tables": { - "users": { - "email": { - "cast_as": "text", - "indexes": { - "unique": {} - } - }, - "name": { - "plaintext_type": "text", - "indexes": { - "match": {} - } - } - } - } - }); - - sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await?; - - let rows: Vec<(String, Option)> = sqlx::query_as( - "SELECT col_name, decrypts_as FROM eql_v2.config() WHERE relation = 'users' ORDER BY col_name", - ) - .fetch_all(&pool) - .await?; - - assert_eq!(rows.len(), 2); - assert_eq!(rows[0].0, "email"); - assert_eq!( - rows[0].1.as_deref(), - Some("text"), - "cast_as column should resolve" - ); - assert_eq!(rows[1].0, "name"); - assert_eq!( - rows[1].1.as_deref(), - Some("text"), - "plaintext_type column should resolve" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn configuration_validates_plaintext_type_values(pool: PgPool) -> Result<()> { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Invalid plaintext_type should be rejected - let config = serde_json::json!({ - "v": 1, - "tables": { - "users": { - "email": { - "plaintext_type": "invalid_type", - "indexes": {} - } - } - } - }); - - let result = sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await; - - assert!( - result.is_err(), - "Should reject invalid plaintext_type value" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn configuration_constraint_validation(pool: PgPool) -> Result<()> { - // Test: Configuration constraint validation (11 assertions) - - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Test 1: No schema version - should fail - let result1 = sqlx::query( - "INSERT INTO eql_v2_configuration (data) VALUES ( - '{ - \"tables\": { - \"users\": { - \"blah\": { - \"cast_as\": \"text\", - \"indexes\": {} - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await; - - assert!( - result1.is_err(), - "insert without schema version should fail" - ); - - // Test 2: Invalid cast - should fail - let result2 = sqlx::query( - "INSERT INTO eql_v2_configuration (data) VALUES ( - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"blah\": { - \"cast_as\": \"regex\" - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await; - - assert!(result2.is_err(), "insert with invalid cast should fail"); - - // Test 3: Invalid index - should fail - let result3 = sqlx::query( - "INSERT INTO eql_v2_configuration (data) VALUES ( - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"blah\": { - \"cast_as\": \"text\", - \"indexes\": { - \"blah\": {} - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await; - - assert!(result3.is_err(), "insert with invalid index should fail"); - - // Verify no pending configuration was created - let pending_exists: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'pending')", - ) - .fetch_one(&pool) - .await?; - - assert!( - !pending_exists, - "no pending configuration should be created" - ); - - // Test 4: Empty table - is OK - let result4 = sqlx::query( - "INSERT INTO eql_v2_configuration (data) VALUES ( - '{ - \"v\": 1, - \"tables\": {} - }'::jsonb - )", - ) - .execute(&pool) - .await; - - assert!(result4.is_ok(), "insert with empty table should be ok"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn ste_vec_mode_absent_is_accepted(pool: PgPool) -> Result<()> { - // `mode` is optional — ste_vec configs without it must still validate. - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - let config = serde_json::json!({ - "v": 1, - "tables": { - "users": { - "doc": { - "cast_as": "jsonb", - "indexes": { "ste_vec": {} } - } - } - } - }); - - sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await - .context("ste_vec without mode should be accepted")?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn ste_vec_mode_accepts_valid_values(pool: PgPool) -> Result<()> { - // The CHECK constraint accepts `standard` and `compat`. - for mode in &["standard", "compat"] { - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - let config = serde_json::json!({ - "v": 1, - "tables": { - "users": { - "doc": { - "cast_as": "jsonb", - "indexes": { "ste_vec": { "mode": mode } } - } - } - } - }); - - sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await - .with_context(|| format!("ste_vec mode={} should be accepted", mode))?; - } - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("config_tables")))] -async fn ste_vec_mode_rejects_invalid_value(pool: PgPool) -> Result<()> { - // Any value outside {standard, compat} must be rejected by the constraint. - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - let config = serde_json::json!({ - "v": 1, - "tables": { - "users": { - "doc": { - "cast_as": "jsonb", - "indexes": { "ste_vec": { "mode": "legacy" } } - } - } - } - }); - - let result = sqlx::query("INSERT INTO eql_v2_configuration (data) VALUES ($1::jsonb)") - .bind(&config) - .execute(&pool) - .await; - - assert!( - result.is_err(), - "ste_vec mode=legacy should be rejected by the CHECK constraint" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/constraint_tests.rs b/tests/sqlx/tests/constraint_tests.rs deleted file mode 100644 index 7e2871c17..000000000 --- a/tests/sqlx/tests/constraint_tests.rs +++ /dev/null @@ -1,482 +0,0 @@ -//! Constraint tests -//! -//! Tests UNIQUE, NOT NULL, CHECK constraints on encrypted columns - -use anyhow::Result; -use eql_tests::assert_db_error; -use sqlx::PgPool; - -#[sqlx::test(fixtures(path = "../fixtures", scripts("constraint_tables")))] -async fn unique_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { - // Test: UNIQUE constraint enforced on encrypted column (3 assertions) - - // Insert first record (provide check_field to satisfy its constraint) - sqlx::query( - "INSERT INTO constrained (unique_field, not_null_field, check_field) - VALUES (create_encrypted_json(1, 'hm'), create_encrypted_json(1, 'hm'), create_encrypted_json(1, 'hm'))" - ) - .execute(&pool) - .await?; - - // Verify record was inserted - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM constrained") - .fetch_one(&pool) - .await?; - - assert_eq!(count, 1, "Should have 1 record after insert"); - - // Attempt duplicate insert - let err = sqlx::query( - "INSERT INTO constrained (unique_field, not_null_field, check_field) - VALUES (create_encrypted_json(1, 'hm'), create_encrypted_json(2, 'hm'), create_encrypted_json(2, 'hm'))" - ) - .execute(&pool) - .await - .expect_err("UNIQUE constraint should prevent duplicate"); - - assert_db_error(&err, "23505", Some("constrained_unique_field_key")); - - // Verify count unchanged after failed insert - let count_after: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM constrained") - .fetch_one(&pool) - .await?; - - assert_eq!(count_after, 1, "Count should remain 1 after failed insert"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("constraint_tables")))] -async fn not_null_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { - // Test: NOT NULL constraint enforced (2 assertions) - - let err = sqlx::query( - "INSERT INTO constrained (unique_field) - VALUES (create_encrypted_json(2, 'hm'))", - ) - .execute(&pool) - .await - .expect_err("NOT NULL constraint should prevent NULL"); - - // NOT NULL is a column attribute, not a named constraint — `constraint()` - // returns None, so only pin the SQLSTATE. - assert_db_error(&err, "23502", None); - - // Verify no records were inserted - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM constrained") - .fetch_one(&pool) - .await?; - - assert_eq!(count, 0, "Should have 0 records after failed insert"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("constraint_tables")))] -async fn check_constraint_on_encrypted_column(pool: PgPool) -> Result<()> { - // Test: CHECK constraint enforced (2 assertions) - - let err = sqlx::query( - "INSERT INTO constrained (unique_field, not_null_field, check_field) - VALUES ( - create_encrypted_json(3, 'hm'), - create_encrypted_json(3, 'hm'), - NULL - )", - ) - .execute(&pool) - .await - .expect_err("CHECK constraint should prevent NULL"); - - assert_db_error(&err, "23514", Some("constrained_check_field_check")); - - // Verify no records were inserted - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM constrained") - .fetch_one(&pool) - .await?; - - assert_eq!(count, 0, "Should have 0 records after failed insert"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("constraint_tables")))] -async fn foreign_key_constraint_with_encrypted(pool: PgPool) -> Result<()> { - // Test: Foreign key constraints can be defined on encrypted columns - // but don't provide referential integrity since each encryption is unique - - // Create parent table - sqlx::query( - "CREATE TABLE parent ( - id eql_v2_encrypted PRIMARY KEY - )", - ) - .execute(&pool) - .await?; - - // Verify parent table was created - let parent_exists: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT FROM information_schema.tables - WHERE table_name = 'parent' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(parent_exists, "Parent table should exist"); - - // Create child table with FK - sqlx::query( - "CREATE TABLE child ( - id bigint PRIMARY KEY, - parent_id eql_v2_encrypted REFERENCES parent(id) - )", - ) - .execute(&pool) - .await?; - - // Verify child table and FK were created - let child_exists: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT FROM information_schema.tables - WHERE table_name = 'child' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(child_exists, "Child table should exist"); - - // Verify FK constraint exists - let fk_exists: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT FROM information_schema.table_constraints - WHERE table_name = 'child' - AND constraint_type = 'FOREIGN KEY' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(fk_exists, "Foreign key constraint should exist"); - - // TEST FK ENFORCEMENT BEHAVIOR: - // With deterministic test data, FK constraints DO enforce referential integrity - // because we can use the exact same encrypted bytes. - // - // PRODUCTION LIMITATION: In real-world usage with non-deterministic encryption, - // FK constraints don't provide meaningful referential integrity because: - // 1. Each encryption of the same plaintext produces different ciphertext - // 2. The FK check compares encrypted bytes, not plaintext values - // 3. Two encryptions of "1" will have different bytes and won't match - // - // This test uses deterministic test helpers, so FKs DO work here. - - // Insert a parent record with encrypted value for plaintext "1" - sqlx::query("INSERT INTO parent (id) VALUES (create_encrypted_json(1, 'hm'))") - .execute(&pool) - .await?; - - // Verify parent record exists - let parent_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM parent") - .fetch_one(&pool) - .await?; - - assert_eq!(parent_count, 1, "Should have 1 parent record"); - - // Successfully insert child record with FK to same deterministic value - // This SUCCEEDS because create_encrypted_json(1, 'hm') returns identical bytes each time - sqlx::query("INSERT INTO child (id, parent_id) VALUES (1, create_encrypted_json(1, 'hm'))") - .execute(&pool) - .await?; - - // Verify child record was inserted - let child_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM child") - .fetch_one(&pool) - .await?; - - assert_eq!( - child_count, 1, - "Child insert should succeed with matching deterministic encrypted value" - ); - - // Attempt to insert child with different encrypted value (should fail FK check) - let err = - sqlx::query("INSERT INTO child (id, parent_id) VALUES (2, create_encrypted_json(2, 'hm'))") - .execute(&pool) - .await - .expect_err("FK constraint should reject non-existent parent reference"); - - assert_db_error(&err, "23503", Some("child_parent_id_fkey")); - - // Verify child count unchanged - let final_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM child") - .fetch_one(&pool) - .await?; - - assert_eq!( - final_count, 1, - "FK violation should prevent second child insert" - ); - - Ok(()) -} - -// ======================================================================== -// EQL-Specific Constraint Tests -// ======================================================================== - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn add_encrypted_constraint_prevents_invalid_data(pool: PgPool) -> Result<()> { - // Test: eql_v2.add_encrypted_constraint() adds validation to encrypted column - - // First, verify that insert without constraint works (even with invalid empty JSONB) - sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") - .execute(&pool) - .await?; - - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM encrypted") - .fetch_one(&pool) - .await?; - - assert_eq!( - count, 4, - "Should have 4 records (3 from fixture + 1 invalid)" - ); - - // Delete the invalid data and reset. Compare via the underlying jsonb - // representation rather than the `=` operator on `eql_v2_encrypted` — - // post #193 the encrypted-side `=` requires a `hmac_256` index term, and - // `'{}'` is intentionally invalid (no `hm` field). - sqlx::query("DELETE FROM encrypted WHERE e::jsonb = '{}'::jsonb") - .execute(&pool) - .await?; - - // Add the encrypted constraint - sqlx::query("SELECT eql_v2.add_encrypted_constraint('encrypted', 'e')") - .execute(&pool) - .await?; - - // Now attempt to insert invalid data - should fail - let err = sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") - .execute(&pool) - .await - .expect_err("Constraint should prevent insert of invalid eql_v2_encrypted (empty JSONB)"); - - // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint - // propagates the underlying SQLSTATE (P0001 raise_exception) rather than - // 23514. The raise message identifies which check failed (missing v, - // invalid v, missing root c/sv, etc.) — that's the value over a bare - // `is_err()` check. - assert_db_error(&err, "P0001", None); - - // Verify count unchanged after failed insert - let final_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM encrypted") - .fetch_one(&pool) - .await?; - - assert_eq!( - final_count, 3, - "Should still have 3 records after constraint prevented invalid insert" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn remove_encrypted_constraint_allows_invalid_data(pool: PgPool) -> Result<()> { - // Test: eql_v2.remove_encrypted_constraint() removes validation from encrypted column - - // Add the encrypted constraint first - sqlx::query("SELECT eql_v2.add_encrypted_constraint('encrypted', 'e')") - .execute(&pool) - .await?; - - // Verify constraint is working - invalid data should be rejected - let err = sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") - .execute(&pool) - .await - .expect_err("Constraint should prevent insert of invalid eql_v2_encrypted"); - - // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint - // propagates the underlying SQLSTATE (P0001 raise_exception) rather than - // 23514. The raise message identifies which check failed (missing v, - // invalid v, missing root c/sv, etc.) — that's the value over a bare - // `is_err()` check. - assert_db_error(&err, "P0001", None); - - // Remove the constraint - sqlx::query("SELECT eql_v2.remove_encrypted_constraint('encrypted', 'e')") - .execute(&pool) - .await?; - - // Now invalid data should be allowed - sqlx::query("INSERT INTO encrypted (e) VALUES ('{}'::jsonb::eql_v2_encrypted)") - .execute(&pool) - .await?; - - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM encrypted") - .fetch_one(&pool) - .await?; - - assert_eq!( - count, 4, - "Should have 4 records (3 valid + 1 invalid after constraint removed)" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn version_metadata_validation_on_insert(pool: PgPool) -> Result<()> { - // Test: EQL version metadata (v field) is enforced on insert - // - // Note: The SQL test doesn't explicitly add a constraint, which suggests - // version validation is built into the eql_v2_encrypted type itself or - // is enforced automatically. However, for this test we need to ensure - // the constraint exists to validate version fields. - - // Add encrypted constraint to enable version validation - sqlx::query("SELECT eql_v2.add_encrypted_constraint('encrypted', 'e')") - .execute(&pool) - .await?; - - // Create a valid encrypted value with version removed - // We'll get a valid encrypted JSON and remove the 'v' field - let encrypted_without_version: String = - sqlx::query_scalar("SELECT (create_encrypted_json(1)::jsonb - 'v')::text") - .fetch_one(&pool) - .await?; - - // Attempt to insert without version field - should fail. Bind the payload - // rather than format!-interpolate it — JSONB strings can carry quotes - // and would otherwise need hand-rolled escaping. - let err = sqlx::query("INSERT INTO encrypted (e) VALUES ($1::jsonb::eql_v2_encrypted)") - .bind(&encrypted_without_version) - .execute(&pool) - .await - .expect_err("Insert should fail when version field is missing"); - - // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint - // propagates the underlying SQLSTATE (P0001 raise_exception) rather than - // 23514. The raise message identifies which check failed (missing v, - // invalid v, missing root c/sv, etc.) — that's the value over a bare - // `is_err()` check. - assert_db_error(&err, "P0001", None); - - // Create encrypted value with invalid version (v=1 instead of v=2) - let encrypted_invalid_version: String = - sqlx::query_scalar("SELECT (create_encrypted_json(1)::jsonb || '{\"v\": 1}')::text") - .fetch_one(&pool) - .await?; - - // Attempt to insert with invalid version - should fail - let err = sqlx::query("INSERT INTO encrypted (e) VALUES ($1::jsonb::eql_v2_encrypted)") - .bind(&encrypted_invalid_version) - .execute(&pool) - .await - .expect_err("Insert should fail when version field is invalid (v=1)"); - - // `check_encrypted` RAISEs on invalid payloads, so the CHECK constraint - // propagates the underlying SQLSTATE (P0001 raise_exception) rather than - // 23514. The raise message identifies which check failed (missing v, - // invalid v, missing root c/sv, etc.) — that's the value over a bare - // `is_err()` check. - assert_db_error(&err, "P0001", None); - - // Insert with valid version (v=2) should succeed - sqlx::query("INSERT INTO encrypted (e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM encrypted") - .fetch_one(&pool) - .await?; - - assert_eq!( - count, 4, - "Should have 4 records after successful insert with valid version" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn check_encrypted_accepts_stevec_payload(pool: PgPool) -> Result<()> { - // Regression test for issue #232. - // - // Under the v2.3 SteVec payload schema, storage payloads carry `sv` at - // the root with the root document ciphertext at `sv[0].c` — there is no - // `c` field at the root. `eql_v2._encrypted_check_c` must accept either - // shape; previously it required `val ? 'c'`, which blocked every insert - // of a SteVec-shape payload into a constrained `eql_v2_encrypted` column. - // - // See `docs/reference/schema/eql-payload-v2.3.schema.json` for the - // mutually exclusive `EncryptedPayload` (carries root `c`) and - // `SteVecPayload` (carries root `sv`) shapes. - - // Mirrors the issue's repro payload — SteVec shape, no root `c`. - let stevec_payload = r#"{ - "v": 2, - "k": "sv", - "i": {"t": "users", "c": "preferences"}, - "sv": [ - { - "s": "b15c7f75fc1b40addaf50ec4efb44e5b", - "a": false, - "c": "mp_base85_root_ciphertext", - "hm": "493ae8e724a74f040cc4adb41660a433" - }, - { - "s": "2ab59935aba25c794a341bc62bad9a6e", - "a": false, - "c": "mp_base85_string_leaf", - "oc": "5285bee6e4318d00ef5ad315274c3434" - } - ] - }"#; - - let valid: bool = sqlx::query_scalar("SELECT eql_v2.check_encrypted($1::jsonb)") - .bind(stevec_payload) - .fetch_one(&pool) - .await?; - - assert!(valid, "check_encrypted must accept SteVec-shape payloads"); - - // Add the column CHECK constraint, then insert the SteVec payload to - // confirm the autogenerated `eql_v2_encrypted_constraint_
_` - // path also accepts the shape (this is the path that broke in 2.3.0). - sqlx::query("SELECT eql_v2.add_encrypted_constraint('encrypted', 'e')") - .execute(&pool) - .await?; - - sqlx::query("INSERT INTO encrypted (e) VALUES ($1::jsonb::eql_v2_encrypted)") - .bind(stevec_payload) - .execute(&pool) - .await?; - - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM encrypted") - .fetch_one(&pool) - .await?; - - assert_eq!( - count, 4, - "SteVec payload must satisfy the column CHECK constraint" - ); - - // Sanity-check the negative path: a root that carries neither `c` nor - // `sv` is still rejected with the updated error message. Calling - // `check_encrypted` directly RAISEs (not a CHECK constraint), so - // SQLSTATE P0001 (raise_exception) rather than 23514. - let err = sqlx::query_scalar::<_, bool>( - "SELECT eql_v2.check_encrypted('{\"v\": 2, \"i\": {\"t\": \"users\", \"c\": \"x\"}}'::jsonb)", - ) - .fetch_one(&pool) - .await - .expect_err("payload with neither c nor sv at root must be rejected"); - - assert_db_error(&err, "P0001", None); - - Ok(()) -} diff --git a/tests/sqlx/tests/containment_tests.rs b/tests/sqlx/tests/containment_tests.rs deleted file mode 100644 index 39360d990..000000000 --- a/tests/sqlx/tests/containment_tests.rs +++ /dev/null @@ -1,220 +0,0 @@ -//! Containment operator tests (@> and <@) -//! -//! Tests encrypted JSONB containment operations - -use anyhow::Result; -use eql_tests::{get_encrypted_term, QueryAssertion, Selectors}; -use sqlx::PgPool; - -// ============================================================================ -// Task 10: Containment Operators (@> and <@) -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contains_operator_self_containment(pool: PgPool) -> Result<()> { - // Test: encrypted value contains itself - // Tests that a @> b when a == b - - let sql = "SELECT e FROM encrypted WHERE e @> e LIMIT 1"; - - QueryAssertion::new(&pool, sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contains_operator_with_extracted_term(pool: PgPool) -> Result<()> { - // Test: e @> term where term is extracted from encrypted value - // Tests containment with extracted field ($.n selector) - - let sql = format!( - "SELECT e FROM encrypted WHERE e @> (e -> '{}'::text) LIMIT 1", - Selectors::N - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contains_operator_term_does_not_contain_full_value(pool: PgPool) -> Result<()> { - // Containment is directional. The old shape `(e -> 'sel') @> e` no - // longer type-checks — `->` now returns `ste_vec_entry`, which is not - // a container type for `@>`. Express the same asymmetry between two - // `eql_v2_encrypted` values: `single` is `e` reduced to its first sv - // entry. - // - // e @> single -> true (superset contains subset) - // single @> e -> false (subset does not contain superset) - // - // The fixture rows each carry three sv entries ($, $.hello, $.n), so - // the one-entry `single` is always a strict subset. - let single_entry = "jsonb_set((e).data, '{sv}', \ - jsonb_build_array((e).data -> 'sv' -> 0))::eql_v2_encrypted"; - - // Positive direction: the full payload contains its one-entry subset. - let contains = format!("SELECT e FROM encrypted WHERE e @> {single_entry} LIMIT 1"); - QueryAssertion::new(&pool, &contains).returns_rows().await; - - // Negative direction: same rows, operands swapped. A one-entry subset - // never contains the full three-entry payload — so this returns nothing. - let not_contains = format!("SELECT e FROM encrypted WHERE {single_entry} @> e LIMIT 1"); - QueryAssertion::new(&pool, ¬_contains).count(0).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contains_operator_with_encrypted_term(pool: PgPool) -> Result<()> { - // Test: e @> entry with encrypted selector - // Uses encrypted test data with $.hello selector - - let term = get_encrypted_term(&pool, Selectors::HELLO).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e @> '{}'::eql_v2.ste_vec_entry", - term - ); - - // Should find at least the record we extracted from - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contains_operator_count_matches(pool: PgPool) -> Result<()> { - // Test: e @> entry returns correct count - // Verifies count of records containing the term - - let term = get_encrypted_term(&pool, Selectors::HELLO).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e @> '{}'::eql_v2.ste_vec_entry", - term - ); - - // Expects 1 match: containment checks the specific encrypted term value, - // not just the presence of the $.hello field - QueryAssertion::new(&pool, &sql).count(1).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contained_by_operator_with_encrypted_term(pool: PgPool) -> Result<()> { - // Test: entry <@ e (contained by) - // Tests that extracted term is contained by the original encrypted value - - let term = get_encrypted_term(&pool, Selectors::HELLO).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE '{}'::eql_v2.ste_vec_entry <@ e", - term - ); - - // Should find records where term is contained - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contained_by_operator_count_matches(pool: PgPool) -> Result<()> { - // Test: entry <@ e returns correct count - // Verifies count of records containing the term - - let term = get_encrypted_term(&pool, Selectors::HELLO).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE '{}'::eql_v2.ste_vec_entry <@ e", - term - ); - - QueryAssertion::new(&pool, &sql).count(1).await; - - Ok(()) -} - -// ============================================================================ -// ste_vec element matching: same plaintext, different ciphertext bytes -// -// Regression coverage for the `ste_vec_contains` element comparison. Post-2.3 -// ste_vec elements carry `hm` (HMAC-256) for selector-scoped equality. A -// freshly-built query payload has the same `hm` as the stored row (deterministic -// over plaintext + key) but a different `c` (ciphertext) field — so JSONB byte -// comparison would say they differ even though they're semantically equal. -// -// The existing tests above all extract terms directly from the database, so -// the bytes are identical and the literal-fallback path happens to return 0. -// These tests construct the query payload by hand to avoid that, exercising -// the hm-match path explicitly. -// ============================================================================ - -const HM_HELLO: &str = "7b4ffe5d60e4e4300dc3e28d9c300c87"; - -/// Builds a single-element ste_vec payload with a deterministic HMAC term -/// and a caller-provided ciphertext blob. Same `hm` + `s` across calls means -/// "same plaintext at same selector"; varying `ciphertext` means "different -/// JSONB byte representation" — together they exercise the hm-match path. -fn build_ste_vec_payload(selector: &str, hm: &str, ciphertext: &str) -> String { - format!(r#"{{"v":2,"k":"sv","sv":[{{"hm":"{hm}","c":"{ciphertext}","s":"{selector}"}}]}}"#) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contains_matches_hm_with_different_ciphertext(pool: PgPool) -> Result<()> { - // Insert a row whose ste_vec element has HM_HELLO at the $.hello selector. - let stored = build_ste_vec_payload(Selectors::HELLO, HM_HELLO, "stored_ciphertext_AAA"); - sqlx::query("INSERT INTO encrypted (e) VALUES ($1::jsonb::eql_v2_encrypted)") - .bind(&stored) - .execute(&pool) - .await?; - - // Query with a freshly-built payload: same selector, same hm, different ciphertext bytes. - let query_payload = - build_ste_vec_payload(Selectors::HELLO, HM_HELLO, "fresh_query_ciphertext_BBB"); - - let sql = format!( - "SELECT e FROM encrypted WHERE e @> '{}'::jsonb::eql_v2_encrypted", - query_payload - ); - - // Should match the stored row by hm, despite the JSONB bytes differing. - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn contains_does_not_match_different_hm(pool: PgPool) -> Result<()> { - // Same shape as the test above but with a *different* hm in the query - // payload. The hm guard must not produce a false positive when both - // sides carry hm but the values differ. - let stored = build_ste_vec_payload(Selectors::HELLO, HM_HELLO, "stored_ciphertext_AAA"); - sqlx::query("INSERT INTO encrypted (e) VALUES ($1::jsonb::eql_v2_encrypted)") - .bind(&stored) - .execute(&pool) - .await?; - - let other_hm = "0000000000000000000000000000000000000000000000000000000000000000"; - let query_payload = - build_ste_vec_payload(Selectors::HELLO, other_hm, "fresh_query_ciphertext_BBB"); - - // The seed fixture inserted three rows whose $.hello sv element hm is - // derived from a different source (the existing fixture ocv) — none of - // them should match `other_hm`. Inspect the extracted entry's `s` via - // JSONB field access on the `ste_vec_entry` returned by `->`. - let sql = format!( - "SELECT e FROM encrypted \ - WHERE e @> '{}'::jsonb::eql_v2_encrypted \ - AND (e -> '{}'::text) ->> 's' = '{}'", - query_payload, - Selectors::HELLO, - Selectors::HELLO, - ); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} diff --git a/tests/sqlx/tests/containment_with_index_tests.rs b/tests/sqlx/tests/containment_with_index_tests.rs deleted file mode 100644 index bdb24a6f5..000000000 --- a/tests/sqlx/tests/containment_with_index_tests.rs +++ /dev/null @@ -1,819 +0,0 @@ -//! Containment with index tests (@> and <@) for encrypted JSONB -//! -//! Tests cover all operator/type combinations in the coverage matrix: -//! -//! | Operator | LHS | RHS | Test | -//! |--------------------|--------------|--------------|----------------------------------| -//! | jsonb_contains | encrypted | jsonb_param | contains_encrypted_jsonb_param | -//! | jsonb_contains | encrypted | encrypted | contains_encrypted_encrypted | -//! | jsonb_contains | jsonb_param | encrypted | contains_jsonb_param_encrypted | -//! | jsonb_contained_by | encrypted | jsonb_param | contained_by_encrypted_jsonb_param | -//! | jsonb_contained_by | encrypted | encrypted | contained_by_encrypted_encrypted | -//! | jsonb_contained_by | jsonb_param | encrypted | contained_by_jsonb_param_encrypted | -//! -//! Uses parameterized queries (jsonb_param) as the primary pattern since -//! that's what real clients use when integrating with EQL. -//! -//! Uses the ste_vec_vast table (500 rows) from migration 005_install_ste_vec_vast_data.sql - -use anyhow::Result; -use eql_tests::{ - analyze_table, assert_uses_index, assert_uses_seq_scan, create_jsonb_gin_index, explain_query, - get_ste_vec_encrypted, get_ste_vec_sv_element, -}; -use sqlx::PgPool; - -// Constants for ste_vec_vast table testing -const STE_VEC_VAST_TABLE: &str = "ste_vec_vast"; -const STE_VEC_VAST_GIN_INDEX: &str = "ste_vec_vast_gin_idx"; - -// ============================================================================ -// GIN Index Helper Functions -// ============================================================================ - -/// Setup GIN index on ste_vec_vast table for testing -/// -/// Creates the GIN index and runs ANALYZE to ensure query planner -/// has accurate statistics. -async fn setup_ste_vec_vast_gin_index(pool: &PgPool) -> Result<()> { - create_jsonb_gin_index(pool, STE_VEC_VAST_TABLE, STE_VEC_VAST_GIN_INDEX).await?; - analyze_table(pool, STE_VEC_VAST_TABLE).await?; - Ok(()) -} - -// ============================================================================ -// Sanity Tests: Value Contains Itself (Exact Match) -// ============================================================================ -// -// These tests verify basic functionality - a value trivially contains itself. -// They serve as sanity checks that the GIN index and containment functions work. - -#[sqlx::test] -async fn sanity_before_after_index_creation(pool: PgPool) -> Result<()> { - // Demonstrates GIN index impact: Seq Scan before, Index Scan after - analyze_table(&pool, STE_VEC_VAST_TABLE).await?; - - let id = 1; - let row = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - let sql = format!( - "SELECT 1 FROM {} WHERE eql_v2.jsonb_array(e) @> eql_v2.jsonb_array('{}'::jsonb) LIMIT 1", - STE_VEC_VAST_TABLE, row - ); - - // BEFORE: Without index, should use Seq Scan - let explain_before = explain_query(&pool, &sql).await?; - assert_uses_seq_scan(&explain_before); - - // Create the GIN index - setup_ste_vec_vast_gin_index(&pool).await?; - - // AFTER: With index, should use the GIN index - assert_uses_index(&pool, &sql, STE_VEC_VAST_GIN_INDEX).await?; - - Ok(()) -} - -#[sqlx::test] -async fn sanity_non_matching_returns_empty(pool: PgPool) -> Result<()> { - // Non-existent value returns no results - setup_ste_vec_vast_gin_index(&pool).await?; - - let sql = format!( - "SELECT count(*) FROM {} WHERE eql_v2.jsonb_array(e) @> ARRAY['{{\"s\":\"nonexistent\",\"v\":1}}'::jsonb]", - STE_VEC_VAST_TABLE - ); - - let count: (i64,) = sqlx::query_as(&sql).fetch_one(&pool).await?; - assert_eq!(count.0, 0, "Expected no matches for non-existent selector"); - - Ok(()) -} - -// ============================================================================ -// Coverage Matrix Tests: All Operator/Type Combinations -// ============================================================================ -// -// Each test covers exactly one operator/type combination. -// Uses parameterized queries (jsonb_param) as the primary pattern -// since that's what real clients use. - -#[sqlx::test] -async fn contains_encrypted_jsonb_param(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contains(encrypted, jsonb_param) - // Most common pattern - client sends jsonb parameter - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - let sv_element = get_ste_vec_sv_element(&pool, STE_VEC_VAST_TABLE, id, 0).await?; - - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contains(e, $1::jsonb) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&sv_element) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contains(encrypted, jsonb_param) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - // Verify index usage with literal for EXPLAIN (can't EXPLAIN with params) - let explain_sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contains(e, '{}'::jsonb) LIMIT 1", - STE_VEC_VAST_TABLE, sv_element - ); - assert_uses_index(&pool, &explain_sql, STE_VEC_VAST_GIN_INDEX).await?; - - Ok(()) -} - -#[sqlx::test] -async fn contains_encrypted_encrypted(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contains(encrypted, encrypted) - // Encrypted column contains another encrypted value - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value - should contain itself - let encrypted = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - // Use parameterized query with encrypted value as jsonb - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contains(e, $1::jsonb) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contains(encrypted, encrypted) should find match (value contains itself)" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -#[sqlx::test] -async fn contains_jsonb_param_encrypted(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contains(jsonb_param, encrypted) - // Check if jsonb parameter contains the encrypted column - // This is the inverse - rarely used but must work - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value - it contains its own sv elements - let encrypted = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - // Check if the full encrypted value (as param) contains the column - // This should match because encrypted contains itself - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contains($1::jsonb, e) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contains(jsonb_param, encrypted) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -#[sqlx::test] -async fn contains_encrypted_param_encrypted(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contains(encrypted_param, encrypted) - // Check if encrypted parameter contains the encrypted column - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value - it contains its own sv elements - let encrypted_param = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - // Check if the encrypted value (as param) contains the column - // Should match because encrypted contains itself - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contains($1::jsonb, e) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted_param) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contains(encrypted_param, encrypted) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -#[sqlx::test] -async fn contains_encrypted_encrypted_param(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contains(encrypted, encrypted_param) - // Encrypted column contains an encrypted value passed as parameter - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value to use as parameter - let encrypted_param = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contains(e, $1::jsonb) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted_param) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contains(encrypted, encrypted_param) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -// ============================================================================ -// Helper Function Tests -// ============================================================================ - -#[sqlx::test] -async fn test_get_ste_vec_encrypted_returns_json_value(pool: PgPool) -> Result<()> { - // Test that get_ste_vec_encrypted returns serde_json::Value - let encrypted = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, 1).await?; - - // Should be an object with expected encrypted structure - assert!( - encrypted.is_object(), - "encrypted value should be a JSON object" - ); - assert!( - encrypted.get("sv").is_some(), - "encrypted value should have 'sv' field" - ); - - Ok(()) -} - -#[sqlx::test] -async fn test_get_ste_vec_sv_element_returns_json_value(pool: PgPool) -> Result<()> { - // Test that get_ste_vec_sv_element returns serde_json::Value with expected fields - let sv_element = get_ste_vec_sv_element(&pool, STE_VEC_VAST_TABLE, 1, 0).await?; - - // Should be an object with expected fields - assert!(sv_element.is_object(), "sv element should be a JSON object"); - assert!( - sv_element.get("s").is_some(), - "sv element should have 's' (selector) field" - ); - - Ok(()) -} - -#[sqlx::test] -async fn contained_by_encrypted_jsonb_param(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contained_by(encrypted, jsonb_param) - // Is encrypted column contained by the jsonb parameter? - // True when param equals or is superset of encrypted - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value - column is contained by itself - let encrypted = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contained_by(e, $1::jsonb) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contained_by(encrypted, jsonb_param) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -#[sqlx::test] -async fn contained_by_encrypted_encrypted(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contained_by(encrypted, encrypted) - // Is encrypted column contained by another encrypted value? - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value - column is contained by itself - let encrypted = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contained_by(e, $1::jsonb) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contained_by(encrypted, encrypted) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -#[sqlx::test] -async fn contained_by_encrypted_encrypted_param(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contained_by(encrypted, encrypted_param) - // Is encrypted column contained by the encrypted parameter? - // True when param equals or is superset of encrypted - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value - column is contained by itself - let encrypted_param = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contained_by(e, $1::jsonb) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted_param) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contained_by(encrypted, encrypted_param) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -#[sqlx::test] -async fn contained_by_jsonb_param_encrypted(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contained_by(jsonb_param, encrypted) - // Is jsonb parameter contained by the encrypted column? - // Single sv element should be contained in the full encrypted value - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - let sv_element = get_ste_vec_sv_element(&pool, STE_VEC_VAST_TABLE, id, 0).await?; - - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contained_by($1::jsonb, e) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&sv_element) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contained_by(jsonb_param, encrypted) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - // Verify index usage - let explain_sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contained_by('{}'::jsonb, e) LIMIT 1", - STE_VEC_VAST_TABLE, sv_element - ); - assert_uses_index(&pool, &explain_sql, STE_VEC_VAST_GIN_INDEX).await?; - - Ok(()) -} - -#[sqlx::test] -async fn contained_by_encrypted_param_encrypted(pool: PgPool) -> Result<()> { - // Coverage: jsonb_contained_by(encrypted_param, encrypted) - // Is encrypted parameter contained by the encrypted column? - // True when column equals or is superset of parameter - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - // Get full encrypted value - parameter is contained by itself in column - let encrypted_param = get_ste_vec_encrypted(&pool, STE_VEC_VAST_TABLE, id).await?; - - let sql = format!( - "SELECT id FROM {} WHERE eql_v2.jsonb_contained_by($1::jsonb, e) AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&encrypted_param) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "jsonb_contained_by(encrypted_param, encrypted) should find match" - ); - assert_eq!(result.unwrap().0, id as i64); - - Ok(()) -} - -// =========================================================================== -// Typed needle: stevec_query DOMAIN -// =========================================================================== - -#[sqlx::test] -async fn stevec_query_domain_rejects_payloads_with_c(_pool: PgPool) -> Result<()> { - // The DOMAIN CHECK on `eql_v2.stevec_query` forbids any `c` field on sv - // elements — `c` is ciphertext, which a containment needle never matches. - let result = sqlx::query_scalar::<_, bool>( - "SELECT '{\"sv\":[{\"s\":\"x\",\"c\":\"y\",\"hm\":\"z\"}]}'::eql_v2.stevec_query \ - IS NOT NULL", - ) - .fetch_one(&_pool) - .await; - - assert!( - result.is_err(), - "stevec_query cast should raise on a payload carrying `c`" - ); - - let msg = format!("{}", result.unwrap_err()); - assert!( - msg.contains("violates check constraint"), - "expected CHECK violation, got: {msg}" - ); - - Ok(()) -} - -#[sqlx::test] -async fn stevec_query_domain_rejects_non_sv_objects(_pool: PgPool) -> Result<()> { - let result = - sqlx::query_scalar::<_, bool>("SELECT '{\"x\":1}'::eql_v2.stevec_query IS NOT NULL") - .fetch_one(&_pool) - .await; - - assert!(result.is_err()); - let msg = format!("{}", result.unwrap_err()); - assert!(msg.contains("violates check constraint")); - Ok(()) -} - -#[sqlx::test] -async fn stevec_query_domain_rejects_selector_only_element(_pool: PgPool) -> Result<()> { - // Every sv element must carry exactly one deterministic term (`hm` XOR - // `oc`). A selector-only needle (`{"sv":[{"s":"x"}]}`) would otherwise - // cast and then match every row through the bare `jsonb @>` body — the - // empty element is a subset of any element. The CHECK rejects it. - let result = sqlx::query_scalar::<_, bool>( - "SELECT '{\"sv\":[{\"s\":\"x\"}]}'::eql_v2.stevec_query IS NOT NULL", - ) - .fetch_one(&_pool) - .await; - - assert!( - result.is_err(), - "stevec_query cast should raise on an element missing both `hm` and `oc`" - ); - let msg = format!("{}", result.unwrap_err()); - assert!( - msg.contains("violates check constraint"), - "expected CHECK violation, got: {msg}" - ); - Ok(()) -} - -#[sqlx::test] -async fn stevec_query_domain_rejects_element_with_both_terms(_pool: PgPool) -> Result<()> { - // `hm` and `oc` are mutually exclusive — an element carrying both - // violates the XOR contract and is rejected by the DOMAIN CHECK. - let result = sqlx::query_scalar::<_, bool>( - "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"y\",\"oc\":\"z\"}]}'::eql_v2.stevec_query \ - IS NOT NULL", - ) - .fetch_one(&_pool) - .await; - - assert!( - result.is_err(), - "stevec_query cast should raise on an element carrying both `hm` and `oc`" - ); - let msg = format!("{}", result.unwrap_err()); - assert!( - msg.contains("violates check constraint"), - "expected CHECK violation, got: {msg}" - ); - Ok(()) -} - -#[sqlx::test] -async fn stevec_query_domain_accepts_valid_payload(_pool: PgPool) -> Result<()> { - let result: serde_json::Value = sqlx::query_scalar( - "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"y\"}]}'::eql_v2.stevec_query::jsonb", - ) - .fetch_one(&_pool) - .await?; - - assert_eq!(result["sv"][0]["s"], "x"); - assert_eq!(result["sv"][0]["hm"], "y"); - Ok(()) -} - -#[sqlx::test] -async fn contains_with_stevec_query_overload(pool: PgPool) -> Result<()> { - // The recommended recipe: `e @> '{"sv":[...]}'::eql_v2.stevec_query`. - // Verifies the new operator overload dispatches correctly. Build a - // clean needle ({s, hm-or-oc} only) — extracted entries carry the - // root's `i`/`v` envelope metadata which would otherwise prevent - // the jsonb @> subset match. - setup_ste_vec_vast_gin_index(&pool).await?; - - let id = 1; - let entry: serde_json::Value = sqlx::query_scalar(&format!( - "SELECT jsonb_strip_nulls(jsonb_build_object( \ - 's', (e -> ((e).data -> 'sv' -> 0 ->> 's')::text) -> 's', \ - 'hm', (e -> ((e).data -> 'sv' -> 0 ->> 's')::text) -> 'hm', \ - 'oc', (e -> ((e).data -> 'sv' -> 0 ->> 's')::text) -> 'oc' \ - )) \ - FROM {} WHERE id = $1", - STE_VEC_VAST_TABLE - )) - .bind(id) - .fetch_one(&pool) - .await?; - - // Wrap the (already-normalised) entry into a `stevec_query`-shaped payload. - let needle = serde_json::json!({ "sv": [entry] }); - - let sql = format!( - "SELECT id FROM {} WHERE e @> $1::jsonb::eql_v2.stevec_query AND id = $2", - STE_VEC_VAST_TABLE - ); - - let result: Option<(i64,)> = sqlx::query_as(&sql) - .bind(&needle) - .bind(id) - .fetch_optional(&pool) - .await?; - - assert!( - result.is_some(), - "e @> stevec_query should match the row the entry was extracted from" - ); - assert_eq!(result.unwrap().0, id as i64); - Ok(()) -} - -#[sqlx::test] -async fn cast_eql_v2_encrypted_to_stevec_query_strips_c(_pool: PgPool) -> Result<()> { - // `to_stevec_query` is the cast function from `eql_v2_encrypted` to - // `eql_v2.stevec_query` — strips `c` fields from each sv element. - let result: serde_json::Value = sqlx::query_scalar( - "SELECT (eql_v2.to_stevec_query( - '{\"v\":2,\"i\":{\"t\":\"t\",\"c\":\"c\"}, - \"sv\":[ - {\"s\":\"sel1\",\"c\":\"ct1\",\"hm\":\"hm1\"}, - {\"s\":\"sel2\",\"c\":\"ct2\",\"oc\":\"oc2\"} - ]}'::jsonb::eql_v2_encrypted - ))::jsonb", - ) - .fetch_one(&_pool) - .await?; - - let sv = result["sv"].as_array().expect("sv should be array"); - assert_eq!(sv.len(), 2); - for elem in sv { - assert!( - elem.get("c").is_none(), - "to_stevec_query should strip `c` fields; got: {elem}" - ); - } - Ok(()) -} - -// =========================================================================== -// XOR-aware containment: hm- and oc-bearing selectors both engage -// =========================================================================== -// -// Regression coverage for a structural gap we shipped in earlier rounds: -// the previous canonical recipe (`hmac_256_terms(col) @> ...`) silently -// dropped oc-bearing sv elements (string / number leaves carry `oc`, not -// `hm`), so containment via that recipe never matched on those selectors. -// The canonical replacement (`to_stevec_query(col)::jsonb @> needle::jsonb`, -// which the typed `@>(eql_v2_encrypted, eql_v2.stevec_query)` inlines to) -// is XOR-aware and matches both kinds. -// -// These tests use hand-synthesised payloads so they don't depend on -// fixture data (which historically violated the XOR contract for some -// selectors). - -const XOR_TABLE: &str = "xor_containment_test"; - -async fn setup_xor_table(pool: &PgPool) -> Result<()> { - sqlx::query(&format!("DROP TABLE IF EXISTS {XOR_TABLE}")) - .execute(pool) - .await?; - sqlx::query(&format!( - "CREATE TABLE {XOR_TABLE} ( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - e eql_v2_encrypted NOT NULL - )" - )) - .execute(pool) - .await?; - // Row 1: sv with one hm-bearing element under selector `bool_sel` - sqlx::query(&format!( - "INSERT INTO {XOR_TABLE}(e) VALUES ( - '{{\"v\":2,\"i\":{{\"t\":\"{XOR_TABLE}\",\"c\":\"e\"}}, - \"sv\":[ - {{\"s\":\"bool_sel\",\"c\":\"row1_ct\",\"hm\":\"deadbeef\"}} - ]}}'::jsonb::eql_v2_encrypted - )" - )) - .execute(pool) - .await?; - // Row 2: sv with one oc-bearing element under selector `string_sel` - sqlx::query(&format!( - "INSERT INTO {XOR_TABLE}(e) VALUES ( - '{{\"v\":2,\"i\":{{\"t\":\"{XOR_TABLE}\",\"c\":\"e\"}}, - \"sv\":[ - {{\"s\":\"string_sel\",\"c\":\"row2_ct\",\"oc\":\"abcd1234\"}} - ]}}'::jsonb::eql_v2_encrypted - )" - )) - .execute(pool) - .await?; - // Row 3: mixed sv with one hm element + one oc element - sqlx::query(&format!( - "INSERT INTO {XOR_TABLE}(e) VALUES ( - '{{\"v\":2,\"i\":{{\"t\":\"{XOR_TABLE}\",\"c\":\"e\"}}, - \"sv\":[ - {{\"s\":\"bool_sel\",\"c\":\"row3_ct1\",\"hm\":\"cafef00d\"}}, - {{\"s\":\"string_sel\",\"c\":\"row3_ct2\",\"oc\":\"feedface\"}} - ]}}'::jsonb::eql_v2_encrypted - )" - )) - .execute(pool) - .await?; - Ok(()) -} - -#[sqlx::test] -async fn typed_contains_matches_hm_bearing_selector(pool: PgPool) -> Result<()> { - setup_xor_table(&pool).await?; - // Needle: {s, hm} only — selector matches row 1 (hm: deadbeef) - let sql = format!( - "SELECT id FROM {XOR_TABLE} \ - WHERE e @> '{{\"sv\":[{{\"s\":\"bool_sel\",\"hm\":\"deadbeef\"}}]}}'::eql_v2.stevec_query \ - ORDER BY id" - ); - let rows: Vec<(i64,)> = sqlx::query_as(&sql).fetch_all(&pool).await?; - let ids: Vec = rows.into_iter().map(|(i,)| i).collect(); - assert_eq!(ids, vec![1], "hm-bearing needle should match only row 1"); - Ok(()) -} - -#[sqlx::test] -async fn typed_contains_matches_oc_bearing_selector(pool: PgPool) -> Result<()> { - // The marquee test: under the previous hmac_256_terms recipe this - // selector was invisible (string leaves carry oc, not hm). The - // typed @>(stevec_query) inlines to a jsonb @> over to_stevec_query, - // which preserves both terms, so the needle matches. - setup_xor_table(&pool).await?; - let sql = format!( - "SELECT id FROM {XOR_TABLE} \ - WHERE e @> '{{\"sv\":[{{\"s\":\"string_sel\",\"oc\":\"abcd1234\"}}]}}'::eql_v2.stevec_query \ - ORDER BY id" - ); - let rows: Vec<(i64,)> = sqlx::query_as(&sql).fetch_all(&pool).await?; - let ids: Vec = rows.into_iter().map(|(i,)| i).collect(); - assert_eq!( - ids, - vec![2], - "oc-bearing needle MUST match row 2 — this is the XOR-correctness regression check" - ); - Ok(()) -} - -#[sqlx::test] -async fn typed_contains_mixed_sv_engages_both_selector_kinds(pool: PgPool) -> Result<()> { - setup_xor_table(&pool).await?; - // Row 3 has both hm and oc; either needle should match - let sql_hm = format!( - "SELECT id FROM {XOR_TABLE} \ - WHERE e @> '{{\"sv\":[{{\"s\":\"bool_sel\",\"hm\":\"cafef00d\"}}]}}'::eql_v2.stevec_query" - ); - let sql_oc = format!( - "SELECT id FROM {XOR_TABLE} \ - WHERE e @> '{{\"sv\":[{{\"s\":\"string_sel\",\"oc\":\"feedface\"}}]}}'::eql_v2.stevec_query" - ); - let (ids_hm, ids_oc) = tokio::join!( - sqlx::query_scalar::<_, i64>(&sql_hm).fetch_all(&pool), - sqlx::query_scalar::<_, i64>(&sql_oc).fetch_all(&pool), - ); - assert_eq!(ids_hm?, vec![3]); - assert_eq!(ids_oc?, vec![3]); - Ok(()) -} - -#[sqlx::test] -async fn typed_contains_wrong_term_does_not_match(pool: PgPool) -> Result<()> { - setup_xor_table(&pool).await?; - // Right selector, wrong oc bytes → no match - let sql = format!( - "SELECT id FROM {XOR_TABLE} \ - WHERE e @> '{{\"sv\":[{{\"s\":\"string_sel\",\"oc\":\"00000000\"}}]}}'::eql_v2.stevec_query" - ); - let rows: Vec<(i64,)> = sqlx::query_as(&sql).fetch_all(&pool).await?; - assert!(rows.is_empty(), "wrong oc bytes must not match"); - Ok(()) -} - -#[sqlx::test] -async fn functional_gin_on_to_stevec_query_engages_for_typed_contains(pool: PgPool) -> Result<()> { - // Load-bearing plan assertion: a GIN on `to_stevec_query(col)::jsonb` - // (jsonb_path_ops) is matched structurally by the inlined body of - // `@>(eql_v2_encrypted, eql_v2.stevec_query)`. With enable_seqscan - // off (small fixture), the planner must engage the functional GIN. - setup_xor_table(&pool).await?; - - sqlx::query(&format!( - "CREATE INDEX {XOR_TABLE}_stevec_query_idx \ - ON {XOR_TABLE} USING gin ((eql_v2.to_stevec_query(e)::jsonb) jsonb_path_ops)" - )) - .execute(&pool) - .await?; - // ANALYZE skipped intentionally: the deprecated - // `encrypted_operator_class` btree on `eql_v2_encrypted` (U-001; - // dropped in installs but still ships as the schema's default opclass) - // uses the strict-post-#211 `eql_v2.compare` for sample comparisons, - // which raises on sv-shaped payloads (no root `ob`). The functional - // GIN index match below works without stats once we force - // enable_seqscan = off. - - // Wrap SET + EXPLAIN in a single transaction so SET LOCAL persists. - let mut tx = pool.begin().await?; - sqlx::query("SET LOCAL enable_seqscan = off") - .execute(&mut *tx) - .await?; - - let explain_sql = format!( - "EXPLAIN SELECT id FROM {XOR_TABLE} \ - WHERE e @> '{{\"sv\":[{{\"s\":\"string_sel\",\"oc\":\"abcd1234\"}}]}}'::eql_v2.stevec_query" - ); - let plan: String = sqlx::query_scalar::<_, String>(&explain_sql) - .fetch_all(&mut *tx) - .await? - .join("\n"); - tx.rollback().await?; - - assert!( - plan.contains(&format!("{XOR_TABLE}_stevec_query_idx")), - "Expected GIN engagement on functional to_stevec_query index. Plan:\n{plan}" - ); - assert!( - plan.contains("Bitmap Index Scan") || plan.contains("Bitmap Heap Scan"), - "Expected Bitmap Index Scan in plan. Plan:\n{plan}" - ); - Ok(()) -} diff --git a/tests/sqlx/tests/encryptindex_tests.rs b/tests/sqlx/tests/encryptindex_tests.rs deleted file mode 100644 index d6c214f22..000000000 --- a/tests/sqlx/tests/encryptindex_tests.rs +++ /dev/null @@ -1,565 +0,0 @@ -//! Encryptindex function tests -//! -//! Tests encrypted column creation and management - -use anyhow::{Context, Result}; -use sqlx::PgPool; - -/// Helper to check if column exists in information_schema -async fn column_exists(pool: &PgPool, table_name: &str, column_name: &str) -> Result { - let exists: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT * FROM information_schema.columns s - WHERE s.table_name = $1 AND s.column_name = $2 - )", - ) - .bind(table_name) - .bind(column_name) - .fetch_one(pool) - .await - .context("checking column existence")?; - - Ok(exists) -} - -/// Helper to check if a column is in pending columns list -async fn has_pending_column(pool: &PgPool, column_name: &str) -> Result { - let exists: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT * FROM eql_v2.select_pending_columns() AS c - WHERE c.column_name = $1 - )", - ) - .bind(column_name) - .fetch_one(pool) - .await - .context("checking pending column")?; - - Ok(exists) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))] -async fn create_encrypted_columns_from_config(pool: PgPool) -> Result<()> { - // Test: Create encrypted columns from configuration (7 assertions) - // Verifies: pending columns, target columns, create_encrypted_columns(), - // rename_encrypted_columns(), and resulting column types - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Insert config for name column - sqlx::query( - "INSERT INTO eql_v2_configuration (data) VALUES ( - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"name\": { - \"cast_as\": \"text\", - \"indexes\": { - \"ore\": {} - } - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await?; - - // Verify column is pending - assert!( - has_pending_column(&pool, "name").await?, - "name should be pending" - ); - - // Verify target column doesn't exist yet - let has_target: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT * FROM eql_v2.select_target_columns() AS c - WHERE c.target_column IS NOT NULL AND c.column_name = 'name' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(!has_target, "target column should not exist"); - - // Create encrypted columns - sqlx::query("SELECT eql_v2.create_encrypted_columns()") - .execute(&pool) - .await?; - - // Verify name_encrypted column exists - assert!( - column_exists(&pool, "users", "name_encrypted").await?, - "name_encrypted should exist" - ); - - // Rename columns - sqlx::query("SELECT eql_v2.rename_encrypted_columns()") - .execute(&pool) - .await?; - - // Verify renamed columns - assert!( - column_exists(&pool, "users", "name_plaintext").await?, - "name_plaintext should exist" - ); - - // Verify name exists as encrypted type - assert!( - column_exists(&pool, "users", "name").await?, - "name should exist" - ); - - // Verify name_encrypted doesn't exist - assert!( - !column_exists(&pool, "users", "name_encrypted").await?, - "name_encrypted should not exist" - ); - - // Verify it's eql_v2_encrypted type - let is_encrypted_type: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT * FROM information_schema.columns s - WHERE s.table_name = 'users' - AND s.column_name = 'name' - AND s.udt_name = 'eql_v2_encrypted' - )", - ) - .fetch_one(&pool) - .await?; - - assert!(is_encrypted_type, "name should be eql_v2_encrypted type"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))] -async fn create_multiple_encrypted_columns(pool: PgPool) -> Result<()> { - // Test: Create multiple encrypted columns from configuration (4 assertions) - // Verifies: multiple columns with different indexes - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Insert config for multiple columns - sqlx::query( - "INSERT INTO eql_v2_configuration (data) VALUES ( - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"name\": { - \"cast_as\": \"text\", - \"indexes\": { - \"ore\": {}, - \"unique\": {} - } - }, - \"email\": { - \"cast_as\": \"text\", - \"indexes\": { - \"match\": {} - } - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await?; - - // Verify name column is pending - assert!( - has_pending_column(&pool, "name").await?, - "name should be pending" - ); - - // Verify target column doesn't exist - let has_target: bool = sqlx::query_scalar( - "SELECT EXISTS ( - SELECT * FROM eql_v2.select_target_columns() AS c - WHERE c.target_column IS NULL - )", - ) - .fetch_one(&pool) - .await?; - - assert!(has_target, "target column should not exist"); - - // Create columns - sqlx::query("SELECT eql_v2.create_encrypted_columns()") - .execute(&pool) - .await?; - - // Verify both encrypted columns exist (lines 110-111) - assert!( - column_exists(&pool, "users", "name_encrypted").await?, - "name_encrypted should exist" - ); - assert!( - column_exists(&pool, "users", "email_encrypted").await?, - "email_encrypted should exist" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))] -async fn select_pending_columns(pool: PgPool) -> Result<()> { - // Test: select_pending_columns() returns correct columns (6 assertions) - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Create active config - sqlx::query( - "INSERT INTO eql_v2_configuration (state, data) VALUES ( - 'active', - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"name\": { - \"cast_as\": \"text\", - \"indexes\": { - \"unique\": {} - } - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await?; - - // Create table with plaintext and encrypted columns - sqlx::query("DROP TABLE IF EXISTS users CASCADE") - .execute(&pool) - .await?; - sqlx::query( - "CREATE TABLE users ( - id bigint GENERATED ALWAYS AS IDENTITY, - name TEXT, - name_encrypted eql_v2_encrypted, - PRIMARY KEY(id) - )", - ) - .execute(&pool) - .await?; - - // Add search config with migrating flag - sqlx::query( - "SELECT eql_v2.add_search_config('users', 'name_encrypted', 'match', migrating => true)", - ) - .execute(&pool) - .await?; - - // Migrate config to create encrypting state - sqlx::query("SELECT eql_v2.migrate_config()") - .execute(&pool) - .await?; - - // Verify encrypting config exists (lines 159-161) - let has_active: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'active')", - ) - .fetch_one(&pool) - .await?; - - let has_encrypting: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'encrypting')", - ) - .fetch_one(&pool) - .await?; - - let has_pending: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'pending')", - ) - .fetch_one(&pool) - .await?; - - assert!(has_active, "active config should exist"); - assert!(has_encrypting, "encrypting config should exist"); - assert!(!has_pending, "pending config should not exist"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))] -async fn select_target_columns(pool: PgPool) -> Result<()> { - // Test: select_target_columns() returns correct columns (4 assertions) - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Insert config for name column - sqlx::query( - "INSERT INTO eql_v2_configuration (data) VALUES ( - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"name\": { - \"cast_as\": \"text\", - \"indexes\": { - \"ore\": {} - } - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await?; - - // Verify we have pending columns - assert!( - has_pending_column(&pool, "name").await?, - "name should be pending" - ); - - // Create encrypted columns - sqlx::query("SELECT eql_v2.create_encrypted_columns()") - .execute(&pool) - .await?; - - // Verify target columns now exist - let target_columns: Vec<(String, Option)> = - sqlx::query_as("SELECT column_name, target_column FROM eql_v2.select_target_columns()") - .fetch_all(&pool) - .await?; - - assert!(!target_columns.is_empty(), "should have target columns"); - - // Verify name has target_column set - let name_has_target = target_columns.iter().any(|(col, target)| { - col == "name" - && target - .as_ref() - .map(|t| t == "name_encrypted") - .unwrap_or(false) - }); - - assert!( - name_has_target, - "name should have target_column=name_encrypted" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))] -async fn activate_pending_config(pool: PgPool) -> Result<()> { - // Test: activate_config() transitions encrypting -> active (8 assertions) - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Create active config - sqlx::query( - "INSERT INTO eql_v2_configuration (state, data) VALUES ( - 'active', - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"name\": { - \"cast_as\": \"text\", - \"indexes\": { - \"unique\": {} - } - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await?; - - // Create table with plaintext and encrypted columns - sqlx::query("DROP TABLE IF EXISTS users CASCADE") - .execute(&pool) - .await?; - sqlx::query( - "CREATE TABLE users ( - id bigint GENERATED ALWAYS AS IDENTITY, - name TEXT, - name_encrypted eql_v2_encrypted, - PRIMARY KEY(id) - )", - ) - .execute(&pool) - .await?; - - // Add search config and migrate - sqlx::query( - "SELECT eql_v2.add_search_config('users', 'name_encrypted', 'match', migrating => true)", - ) - .execute(&pool) - .await?; - - sqlx::query("SELECT eql_v2.migrate_config()") - .execute(&pool) - .await?; - - // Activate config - sqlx::query("SELECT eql_v2.activate_config()") - .execute(&pool) - .await?; - - // Verify state transitions (lines 284-287) - let has_active: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'active')", - ) - .fetch_one(&pool) - .await?; - - let has_inactive: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'inactive')", - ) - .fetch_one(&pool) - .await?; - - let has_encrypting: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'encrypting')", - ) - .fetch_one(&pool) - .await?; - - let has_pending: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'pending')", - ) - .fetch_one(&pool) - .await?; - - assert!(has_active, "active config should exist"); - assert!(has_inactive, "inactive config should exist"); - assert!(!has_encrypting, "encrypting config should not exist"); - assert!(!has_pending, "pending config should not exist"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))] -async fn encrypted_column_index_generation(pool: PgPool) -> Result<()> { - // Test: Encrypted columns are created with proper JSONB structure (5 assertions) - // Verifies: JSON structure has required 'i' (index metadata) field - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Create active config with match index - sqlx::query( - "INSERT INTO eql_v2_configuration (state, data) VALUES ( - 'active', - '{ - \"v\": 1, - \"tables\": { - \"users\": { - \"name\": { - \"cast_as\": \"text\", - \"indexes\": { - \"unique\": {} - } - } - } - } - }'::jsonb - )", - ) - .execute(&pool) - .await?; - - // Create table - sqlx::query("DROP TABLE IF EXISTS users CASCADE") - .execute(&pool) - .await?; - sqlx::query( - "CREATE TABLE users ( - id bigint GENERATED ALWAYS AS IDENTITY, - name TEXT, - name_encrypted eql_v2_encrypted, - PRIMARY KEY(id) - )", - ) - .execute(&pool) - .await?; - - // Add encrypted config without migrating flag (immediately active) - sqlx::query("SELECT eql_v2.add_search_config('users', 'name_encrypted', 'match')") - .execute(&pool) - .await?; - - // Verify active config exists - let has_active: bool = sqlx::query_scalar( - "SELECT EXISTS (SELECT FROM eql_v2_configuration c WHERE c.state = 'active')", - ) - .fetch_one(&pool) - .await?; - - assert!(has_active, "active config should exist"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encryptindex_tables")))] -async fn handle_null_values_in_encrypted_columns(pool: PgPool) -> Result<()> { - // Test: Exception raised when pending config exists but no migrate called (7 assertions) - - // Truncate config - sqlx::query("TRUNCATE TABLE eql_v2_configuration") - .execute(&pool) - .await?; - - // Create table - sqlx::query("DROP TABLE IF EXISTS users CASCADE") - .execute(&pool) - .await?; - sqlx::query( - "CREATE TABLE users ( - id bigint GENERATED ALWAYS AS IDENTITY, - name TEXT, - name_encrypted eql_v2_encrypted, - PRIMARY KEY(id) - )", - ) - .execute(&pool) - .await?; - - // Add search config to create active config - sqlx::query("SELECT eql_v2.add_search_config('users', 'name_encrypted', 'match')") - .execute(&pool) - .await?; - - // Try to migrate when no pending config exists (should fail) - let result = sqlx::query("SELECT eql_v2.migrate_config()") - .execute(&pool) - .await; - - assert!( - result.is_err(), - "migrate_config() should raise exception when no pending configuration exists" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/eq_term_tests.rs b/tests/sqlx/tests/eq_term_tests.rs deleted file mode 100644 index de57c739e..000000000 --- a/tests/sqlx/tests/eq_term_tests.rs +++ /dev/null @@ -1,202 +0,0 @@ -//! Tests for the XOR-aware equality term extractor: `eql_v2.eq_term(ste_vec_entry)`, -//! and the chained recipe `eql_v2.eq_term(col -> '')`. -//! -//! Coverage: -//! - Happy path: returns the matched element's hm bytes (hm-bearing -//! selector) or oc bytes (oc-bearing selector). -//! - Missing selector / NULL input → NULL via STRICT propagation through -//! the inlined `->` chain. -//! - Plan: functional hash index on `eql_v2.eq_term(col -> '')` -//! engages structurally for bare equality and GROUP BY queries. -//! -//! This file is the post-2.3 replacement for the previous -//! `hmac_256_selector_tests.rs`, which tested the now-removed fused -//! `eql_v2.hmac_256(eql_v2_encrypted, text)`. - -use anyhow::Result; -use eql_tests::{explain_query, Selectors}; -use sqlx::{Acquire, PgPool, Row}; - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn returns_term_for_matching_selector(pool: PgPool) -> Result<()> { - let result: Option> = sqlx::query_scalar(&format!( - "SELECT eql_v2.eq_term(e -> '{}'::text) FROM encrypted ORDER BY id LIMIT 1", - Selectors::HELLO - )) - .fetch_one(&pool) - .await?; - - assert!( - result.is_some(), - "eq_term(e -> $.hello-selector) should return the entry's hm-or-oc bytes" - ); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn returns_null_for_missing_selector(pool: PgPool) -> Result<()> { - let result: Option> = sqlx::query_scalar( - "SELECT eql_v2.eq_term(e -> 'selector_does_not_exist'::text) \ - FROM encrypted ORDER BY id LIMIT 1", - ) - .fetch_one(&pool) - .await?; - - assert!( - result.is_none(), - "eq_term with a non-existent selector should return NULL via STRICT, got: {:?}", - result - ); - Ok(()) -} - -#[sqlx::test] -async fn returns_null_for_null_encrypted_input(pool: PgPool) -> Result<()> { - let result: Option> = sqlx::query_scalar( - "SELECT eql_v2.eq_term((NULL::eql_v2_encrypted) -> 'any-selector'::text)", - ) - .fetch_one(&pool) - .await?; - - assert!( - result.is_none(), - "STRICT chain should return NULL for NULL input" - ); - Ok(()) -} - -#[sqlx::test] -async fn returns_oc_bytes_for_oc_bearing_selector(pool: PgPool) -> Result<()> { - // The XOR contract: an oc-bearing entry (string / number leaf) carries - // `oc` and never `hm`. `eq_term` coalesces hm/oc, so the result is the - // oc bytes. Pre-fix, the equality recipe was hmac_256-only and would - // have returned NULL for this case. - let sql = r#" - SELECT eql_v2.eq_term( - ('{"v": 2, "i": {"t": "t", "c": "c"}, - "sv": [{"s": "sel_x", "c": "ct", "oc": "ABCDEF"}]}'::jsonb::eql_v2_encrypted) - -> 'sel_x'::text - ) - "#; - let result: Option> = sqlx::query_scalar(sql).fetch_one(&pool).await?; - assert_eq!( - result.as_deref(), - Some(&[0xAB, 0xCD, 0xEF][..]), - "oc-bearing entry should yield its oc bytes via eq_term" - ); - Ok(()) -} - -#[sqlx::test] -async fn returns_hm_bytes_for_hm_bearing_selector(pool: PgPool) -> Result<()> { - // Symmetric to the test above: hm-bearing entry (bool leaf, array root, - // object root) yields its hm bytes via eq_term. - let sql = r#" - SELECT eql_v2.eq_term( - ('{"v": 2, "i": {"t": "t", "c": "c"}, - "sv": [{"s": "sel_x", "c": "ct", "hm": "DEADBEEF"}]}'::jsonb::eql_v2_encrypted) - -> 'sel_x'::text - ) - "#; - let result: Option> = sqlx::query_scalar(sql).fetch_one(&pool).await?; - assert_eq!(result.as_deref(), Some(&[0xDE, 0xAD, 0xBE, 0xEF][..])); - Ok(()) -} - -#[sqlx::test] -async fn returns_target_element_when_multiple_selectors(pool: PgPool) -> Result<()> { - // Multi-element sv: should yield the eq_term of the element matching - // the selector, not the first element overall. - let sql = r#" - SELECT eql_v2.eq_term( - ('{"v": 2, "i": {"t": "t", "c": "c"}, - "sv": [ - {"s": "sel_first", "c": "c1", "hm": "1111"}, - {"s": "sel_target", "c": "c2", "hm": "2222"}, - {"s": "sel_third", "c": "c3", "hm": "3333"} - ]}'::jsonb::eql_v2_encrypted) - -> 'sel_target'::text - ) - "#; - let result: Option> = sqlx::query_scalar(sql).fetch_one(&pool).await?; - assert_eq!(result.as_deref(), Some(&[0x22, 0x22][..])); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn where_clause_uses_functional_hash_index(pool: PgPool) -> Result<()> { - // Load-bearing plan assertion: a btree hash index on - // `eql_v2.eq_term(col -> '')` engages structurally for - // bare equality queries on the same expression. With seq scan - // disabled, the planner must find the index match — proving the - // chained `-> + eq_term` inlines cleanly. - - sqlx::query(&format!( - "CREATE INDEX encrypted_hello_eq_term_idx \ - ON encrypted USING hash (eql_v2.eq_term(e -> '{}'::text))", - Selectors::HELLO - )) - .execute(&pool) - .await?; - sqlx::query("ANALYZE encrypted").execute(&pool).await?; - - let mut conn = pool.acquire().await?; - sqlx::query("SET enable_seqscan = off") - .execute(conn.acquire().await?) - .await?; - - let sql = format!( - "EXPLAIN SELECT * FROM encrypted \ - WHERE eql_v2.eq_term(e -> '{}'::text) = '\\xdeadbeef'::bytea", - Selectors::HELLO - ); - let plan: String = sqlx::query(&sql) - .fetch_all(conn.acquire().await?) - .await? - .into_iter() - .map(|row| row.try_get::(0).unwrap_or_default()) - .collect::>() - .join("\n"); - - assert!( - plan.contains("encrypted_hello_eq_term_idx"), - "Expected the functional hash index to be used. Plan:\n{}", - plan - ); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn group_by_uses_functional_hash_index(pool: PgPool) -> Result<()> { - sqlx::query(&format!( - "CREATE INDEX encrypted_hello_eq_term_grp_idx \ - ON encrypted USING hash (eql_v2.eq_term(e -> '{}'::text))", - Selectors::HELLO - )) - .execute(&pool) - .await?; - sqlx::query("ANALYZE encrypted").execute(&pool).await?; - - // GROUP BY plan: HashAggregate on the inlined expression is the expected - // shape (the planner sees `eql_v2.eq_term(e -> ''::text)` as the - // group key even on small fixtures where Bitmap Index Scan won't engage). - let sql = format!( - "SELECT eql_v2.eq_term(e -> '{}'::text), count(*) FROM encrypted \ - GROUP BY eql_v2.eq_term(e -> '{}'::text)", - Selectors::HELLO, - Selectors::HELLO - ); - - let plan = explain_query(&pool, &sql).await?; - assert!( - plan.contains("HashAggregate") || plan.contains("Group"), - "GROUP BY plan should aggregate on the eq_term expression. Plan:\n{}", - plan - ); - assert!( - plan.contains("eq_term"), - "Plan should reference the eq_term expression. Plan:\n{}", - plan - ); - Ok(()) -} diff --git a/tests/sqlx/tests/equality_tests.rs b/tests/sqlx/tests/equality_tests.rs deleted file mode 100644 index b9775c337..000000000 --- a/tests/sqlx/tests/equality_tests.rs +++ /dev/null @@ -1,176 +0,0 @@ -//! Equality operator tests -//! -//! Tests EQL equality operators with encrypted data (HMAC and Blake3 indexes) - -use anyhow::{Context, Result}; -use eql_tests::QueryAssertion; -use sqlx::{PgPool, Row}; - -/// Helper to execute create_encrypted_json SQL function with specific indexes -/// Uses variadic form: create_encrypted_json(id, index1, index2, ...) -async fn create_encrypted_json_with_index( - pool: &PgPool, - id: i32, - index_type: &str, -) -> Result { - let sql = format!( - "SELECT create_encrypted_json({}, '{}')::text", - id, index_type - ); - - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching create_encrypted_json({}, '{}')", id, index_type))?; - - let result: Option = row.try_get(0).with_context(|| { - format!( - "extracting text column for id={}, index_type='{}'", - id, index_type - ) - })?; - - result.with_context(|| { - format!( - "create_encrypted_json returned NULL for id={}, index_type='{}'", - id, index_type - ) - }) -} - -async fn fetch_text_column(pool: &PgPool, sql: &str) -> Result { - let row = sqlx::query(sql) - .fetch_one(pool) - .await - .with_context(|| format!("executing query for text result: {}", sql))?; - - row.try_get(0) - .with_context(|| format!("extracting text column for query: {}", sql)) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn equality_operator_finds_matching_record_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2_encrypted = eql_v2_encrypted with HMAC index - - let encrypted = create_encrypted_json_with_index(&pool, 1, "hm").await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e = '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn equality_operator_returns_empty_for_no_match_hmac(pool: PgPool) -> Result<()> { - // Test: equality returns no results for non-existent record - // Note: Using id=4 instead of 91347 to ensure ore data exists (start=40 is within ore range 1-1000) - // The important part is that id=4 doesn't exist in the fixture data (only 1, 2, 3) - - let encrypted = create_encrypted_json_with_index(&pool, 4, "hm").await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e = '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -// Same-type Blake3 equality lookups via the bare `=` operator are no -// longer supported post-#193: the operator implementation is now an -// inlinable SQL function that compares `eql_v2.hmac_256(a) = -// eql_v2.hmac_256(b)` and requires both operands to carry an `hm` -// index term. The `eql_v2.eq` function still walks `eql_v2.compare` -// for the Blake3 / ORE fallback path — see the -// `eq_function_*_blake3` tests below for that coverage. - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn eq_function_finds_matching_record_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2.eq() function with HMAC index - // Uses create_encrypted_json(id)::jsonb-'ob' to get encrypted data without ORE field - - // Call SQL function to create encrypted JSON and remove 'ob' field - // Cast to eql_v2_encrypted first, then to text to get tuple format - let sql_create = "SELECT ((create_encrypted_json(1)::jsonb - 'ob')::eql_v2_encrypted)::text"; - let encrypted = fetch_text_column(&pool, sql_create).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE eql_v2.eq(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -// `eq_function_*_blake3` tests removed alongside the equality_operator_*_blake3 -// tests above: they exercised root-level Blake3 equality, which has no -// production analogue. Blake3 only appears inside ste_vec elements. - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn equality_operator_encrypted_equals_jsonb_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2_encrypted = jsonb with HMAC index - - // Create encrypted JSON with HMAC, remove 'ob' field for comparison - let sql_create = "SELECT (create_encrypted_json(1)::jsonb - 'ob')::text"; - let json_value = fetch_text_column(&pool, sql_create).await?; - - let sql = format!("SELECT e FROM encrypted WHERE e = '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn equality_operator_jsonb_equals_encrypted_hmac(pool: PgPool) -> Result<()> { - // Test: jsonb = eql_v2_encrypted with HMAC index (reverse direction) - - let sql_create = "SELECT (create_encrypted_json(1)::jsonb - 'ob')::text"; - let json_value = fetch_text_column(&pool, sql_create).await?; - - let sql = format!("SELECT e FROM encrypted WHERE '{}'::jsonb = e", json_value); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn equality_operator_encrypted_equals_jsonb_no_match_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2_encrypted = jsonb with no matching record - - let sql_create = "SELECT (create_encrypted_json(4)::jsonb - 'ob')::text"; - let json_value = fetch_text_column(&pool, sql_create).await?; - - let sql = format!("SELECT e FROM encrypted WHERE e = '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn equality_operator_jsonb_equals_encrypted_no_match_hmac(pool: PgPool) -> Result<()> { - // Test: jsonb = eql_v2_encrypted with no matching record - - let sql_create = "SELECT (create_encrypted_json(4)::jsonb - 'ob')::text"; - let json_value = fetch_text_column(&pool, sql_create).await?; - - let sql = format!("SELECT e FROM encrypted WHERE '{}'::jsonb = e", json_value); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -// Cross-type (jsonb / eql_v2_encrypted) Blake3 equality lookups via -// the bare `=` operator are no longer supported post-#193 for the -// same reason as the same-type Blake3 tests removed above. diff --git a/tests/sqlx/tests/hash_operator_tests.rs b/tests/sqlx/tests/hash_operator_tests.rs deleted file mode 100644 index cca4973e8..000000000 --- a/tests/sqlx/tests/hash_operator_tests.rs +++ /dev/null @@ -1,671 +0,0 @@ -//! Hash operator tests -//! -//! Tests PostgreSQL hash operator class for encrypted values. -//! Verifies hash joins, GROUP BY, DISTINCT, and error handling. - -use anyhow::{Context, Result}; -use sqlx::PgPool; - -/// Helper to create a fresh table for hash operator testing -async fn create_hash_test_table(pool: &PgPool, table: &str) -> Result<()> { - sqlx::query(&format!("DROP TABLE IF EXISTS {} CASCADE", table)) - .execute(pool) - .await?; - - sqlx::query(&format!( - "CREATE TABLE {} ( - id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - e eql_v2_encrypted - )", - table - )) - .execute(pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn hash_join_between_two_tables(pool: PgPool) -> Result<()> { - // Test: Hash join works between two tables with encrypted columns - // This is the core bug scenario - cross-row joins that trigger hash join strategy - - create_hash_test_table(&pool, "hash_left").await?; - create_hash_test_table(&pool, "hash_right").await?; - - // Insert matching encrypted values (same id -> same hmac/blake3) - for id in 1..=3 { - let sql = format!( - "INSERT INTO hash_left(e) VALUES (create_encrypted_json({}))", - id - ); - sqlx::query(&sql).execute(&pool).await?; - - let sql = format!( - "INSERT INTO hash_right(e) VALUES (create_encrypted_json({}))", - id - ); - sqlx::query(&sql).execute(&pool).await?; - } - - // Join should find 3 matching rows (one per id) - let count: i64 = - sqlx::query_scalar("SELECT count(*) FROM hash_left l JOIN hash_right r ON l.e = r.e") - .fetch_one(&pool) - .await - .context("hash join between two tables failed")?; - - assert_eq!(count, 3, "Hash join should find 3 matching rows"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_left, hash_right CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn group_by_with_hash_aggregate(pool: PgPool) -> Result<()> { - // Test: GROUP BY works with hash aggregation on encrypted columns - - create_hash_test_table(&pool, "hash_group").await?; - - // Insert duplicates: 4x id=1, 2x id=2, 1x id=3 - for _ in 0..4 { - sqlx::query("INSERT INTO hash_group(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - } - for _ in 0..2 { - sqlx::query("INSERT INTO hash_group(e) VALUES (create_encrypted_json(2))") - .execute(&pool) - .await?; - } - sqlx::query("INSERT INTO hash_group(e) VALUES (create_encrypted_json(3))") - .execute(&pool) - .await?; - - // GROUP BY should produce 3 groups - let group_count: i64 = - sqlx::query_scalar("SELECT count(*) FROM (SELECT e FROM hash_group GROUP BY e) sub") - .fetch_one(&pool) - .await - .context("GROUP BY on encrypted column failed")?; - - assert_eq!(group_count, 3, "GROUP BY should produce 3 groups"); - - // Verify the largest group has 4 members - let max_count: i64 = sqlx::query_scalar( - "SELECT count(*) as cnt FROM hash_group GROUP BY e ORDER BY cnt DESC LIMIT 1", - ) - .fetch_one(&pool) - .await?; - - assert_eq!(max_count, 4, "Largest group should have 4 members"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_group CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn distinct_on_encrypted_column(pool: PgPool) -> Result<()> { - // Test: DISTINCT works on encrypted columns using hash-based deduplication - - create_hash_test_table(&pool, "hash_distinct").await?; - - // Insert duplicates: 3x id=1, 2x id=2 - for _ in 0..3 { - sqlx::query("INSERT INTO hash_distinct(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - } - for _ in 0..2 { - sqlx::query("INSERT INTO hash_distinct(e) VALUES (create_encrypted_json(2))") - .execute(&pool) - .await?; - } - - // DISTINCT should return 2 unique values - let distinct_count: i64 = - sqlx::query_scalar("SELECT count(*) FROM (SELECT DISTINCT e FROM hash_distinct) sub") - .fetch_one(&pool) - .await - .context("DISTINCT on encrypted column failed")?; - - assert_eq!(distinct_count, 2, "DISTINCT should return 2 unique values"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_distinct CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn self_join_with_encrypted_column(pool: PgPool) -> Result<()> { - // Test: Self-join works on encrypted column - - create_hash_test_table(&pool, "hash_self").await?; - - // Insert 3 rows with different encrypted values - for id in 1..=3 { - sqlx::query(&format!( - "INSERT INTO hash_self(e) VALUES (create_encrypted_json({}))", - id - )) - .execute(&pool) - .await?; - } - - // Self-join should match each row with itself (3 matches on diagonal) - let count: i64 = - sqlx::query_scalar("SELECT count(*) FROM hash_self a JOIN hash_self b ON a.e = b.e") - .fetch_one(&pool) - .await - .context("self-join on encrypted column failed")?; - - assert_eq!(count, 3, "Self-join should produce 3 matches"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_self CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn hash_function_directly(pool: PgPool) -> Result<()> { - // Test: eql_v2.hash_encrypted() returns consistent values - - // Same encrypted value should produce same hash - let hash1: i32 = sqlx::query_scalar("SELECT eql_v2.hash_encrypted(create_encrypted_json(1))") - .fetch_one(&pool) - .await - .context("hash_encrypted call 1 failed")?; - - let hash2: i32 = sqlx::query_scalar("SELECT eql_v2.hash_encrypted(create_encrypted_json(1))") - .fetch_one(&pool) - .await - .context("hash_encrypted call 2 failed")?; - - assert_eq!( - hash1, hash2, - "Same encrypted value should produce same hash" - ); - - Ok(()) -} - -// hash_function_uses_blake3_first removed: post-discipline, hash_encrypted -// is hmac-only at the root. There is no Blake3 path to prefer. - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn hash_function_falls_back_to_hmac(pool: PgPool) -> Result<()> { - // Test: hash_encrypted uses HMAC when Blake3 is not available - - let hash: i32 = - sqlx::query_scalar("SELECT eql_v2.hash_encrypted(create_encrypted_json(1, 'hm'))") - .fetch_one(&pool) - .await - .context("hash with hmac-only failed")?; - - // Just verify it returns a value without error - // The actual hash value is implementation-dependent - let _ = hash; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn hash_function_returns_null_when_hmac_absent(pool: PgPool) -> Result<()> { - // U-002 contract: equality on `eql_v2_encrypted` is hm-only at the root, - // and `hash_encrypted` mirrors that. On a column without `hm` (e.g. an - // ore-only payload), the inlined body reduces to - // `hashtext(hmac_256(val)::text)` — `hmac_256(val)` returns NULL, and - // `hashtext(NULL)` propagates NULL. Misconfiguration surfaces as the - // hash opclass machinery erroring on the NULL return, not as a silent - // wrong-grouping. This test pins the NULL return at the function level. - - let h: Option = - sqlx::query_scalar("SELECT eql_v2.hash_encrypted(create_encrypted_json(1, 'ob'))") - .fetch_one(&pool) - .await - .context("hash_encrypted on ore-only value")?; - - assert!( - h.is_none(), - "hash_encrypted on a column without `hm` must return NULL (caller responsibility to configure a `unique` index)" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn union_on_encrypted_columns(pool: PgPool) -> Result<()> { - // Test: UNION (which uses hash-based deduplication) works on encrypted columns - - create_hash_test_table(&pool, "hash_union_a").await?; - create_hash_test_table(&pool, "hash_union_b").await?; - - // Table A has ids 1, 2 - sqlx::query("INSERT INTO hash_union_a(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_union_a(e) VALUES (create_encrypted_json(2))") - .execute(&pool) - .await?; - - // Table B has ids 2, 3 (id=2 overlaps) - sqlx::query("INSERT INTO hash_union_b(e) VALUES (create_encrypted_json(2))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_union_b(e) VALUES (create_encrypted_json(3))") - .execute(&pool) - .await?; - - // UNION should deduplicate, returning 3 unique values - let count: i64 = sqlx::query_scalar( - "SELECT count(*) FROM ( - SELECT e FROM hash_union_a - UNION - SELECT e FROM hash_union_b - ) sub", - ) - .fetch_one(&pool) - .await - .context("UNION on encrypted columns failed")?; - - assert_eq!(count, 3, "UNION should return 3 unique values (1, 2, 3)"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_union_a, hash_union_b CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn in_subquery_with_encrypted_column(pool: PgPool) -> Result<()> { - // Test: IN (subquery) works with encrypted columns - - create_hash_test_table(&pool, "hash_in_main").await?; - create_hash_test_table(&pool, "hash_in_sub").await?; - - // Main table has ids 1, 2, 3 - for id in 1..=3 { - sqlx::query(&format!( - "INSERT INTO hash_in_main(e) VALUES (create_encrypted_json({}))", - id - )) - .execute(&pool) - .await?; - } - - // Subquery table has only id 1, 3 - sqlx::query("INSERT INTO hash_in_sub(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_in_sub(e) VALUES (create_encrypted_json(3))") - .execute(&pool) - .await?; - - // IN subquery should return 2 rows - let count: i64 = sqlx::query_scalar( - "SELECT count(*) FROM hash_in_main WHERE e IN (SELECT e FROM hash_in_sub)", - ) - .fetch_one(&pool) - .await - .context("IN subquery on encrypted column failed")?; - - assert_eq!(count, 2, "IN subquery should return 2 matching rows"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_in_main, hash_in_sub CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -// hash_consistency_full_index_matches_blake3_only, -// hmac_and_blake3_produce_different_hashes, -// ste_vec_wrapped_hashes_same_as_unwrapped — removed. They asserted -// the Blake3-first hash priority that was the previous implementation. -// Post-discipline, hash_encrypted is hmac-only at the root; there is -// no Blake3 root path to test. ste_vec single-element unwrapping -// still works but the inner element must carry hm to be hashable. - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn multi_element_ste_vec_returns_null(pool: PgPool) -> Result<()> { - // A multi-element STE vec (`{i, v, sv: [...]}`) has no root `hm` — `hm` - // lives on sv elements, not at the root. `hash_encrypted` is documented - // as operating on the root payload only; for grouping by an extracted - // field, callers use `GROUP BY eql_v2.hmac_256(col, '')` - // directly (or the ste_vec_entry recipe). At the root, this returns NULL - // — surfacing as a clear hash-machinery error if someone tries to - // `GROUP BY` the column itself without configuring `hm`. - - let h: Option = - sqlx::query_scalar("SELECT eql_v2.hash_encrypted((get_array_ste_vec())::eql_v2_encrypted)") - .fetch_one(&pool) - .await - .context("hash_encrypted on multi-element ste_vec")?; - - assert!( - h.is_none(), - "hash_encrypted on a multi-element ste_vec (no root `hm`) must return NULL" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn group_by_with_null_encrypted_values(pool: PgPool) -> Result<()> { - // Test: GROUP BY correctly handles NULL encrypted values - // PostgreSQL groups NULLs together; hash_encrypted is STRICT so NULL returns NULL - - create_hash_test_table(&pool, "hash_null_group").await?; - - // Insert: 2x id=1, 2x NULL -> should produce 2 groups (id=1, NULL) - sqlx::query("INSERT INTO hash_null_group(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_null_group(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_null_group(e) VALUES (NULL)") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_null_group(e) VALUES (NULL)") - .execute(&pool) - .await?; - - let group_count: i64 = - sqlx::query_scalar("SELECT count(*) FROM (SELECT e FROM hash_null_group GROUP BY e) sub") - .fetch_one(&pool) - .await - .context("GROUP BY with NULLs failed")?; - - assert_eq!( - group_count, 2, - "GROUP BY should produce 2 groups (id=1 and NULL)" - ); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_null_group CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn distinct_with_null_encrypted_values(pool: PgPool) -> Result<()> { - // Test: DISTINCT correctly handles NULL encrypted values - - create_hash_test_table(&pool, "hash_null_distinct").await?; - - // Insert: 2x id=1, 2x NULL -> DISTINCT should return 2 - sqlx::query("INSERT INTO hash_null_distinct(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_null_distinct(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_null_distinct(e) VALUES (NULL)") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_null_distinct(e) VALUES (NULL)") - .execute(&pool) - .await?; - - let distinct_count: i64 = - sqlx::query_scalar("SELECT count(*) FROM (SELECT DISTINCT e FROM hash_null_distinct) sub") - .fetch_one(&pool) - .await - .context("DISTINCT with NULLs failed")?; - - assert_eq!( - distinct_count, 2, - "DISTINCT should return 2 values (id=1 and NULL)" - ); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_null_distinct CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn forced_hash_join_via_planner_hints(pool: PgPool) -> Result<()> { - // Test: Hash join works when forced by disabling other join strategies - - create_hash_test_table(&pool, "hash_forced_l").await?; - create_hash_test_table(&pool, "hash_forced_r").await?; - - for id in 1..=3 { - sqlx::query(&format!( - "INSERT INTO hash_forced_l(e) VALUES (create_encrypted_json({}))", - id - )) - .execute(&pool) - .await?; - - sqlx::query(&format!( - "INSERT INTO hash_forced_r(e) VALUES (create_encrypted_json({}))", - id - )) - .execute(&pool) - .await?; - } - - // Disable nested loop and merge join to force hash join strategy. - // SET LOCAL is scoped to the current transaction, so we need an explicit one. - let mut tx = pool.begin().await?; - sqlx::query("SET LOCAL enable_nestloop = off") - .execute(&mut *tx) - .await?; - sqlx::query("SET LOCAL enable_mergejoin = off") - .execute(&mut *tx) - .await?; - - let count: i64 = sqlx::query_scalar( - "SELECT count(*) FROM hash_forced_l l JOIN hash_forced_r r ON l.e = r.e", - ) - .fetch_one(&mut *tx) - .await - .context("forced hash join failed")?; - - tx.commit().await?; - - assert_eq!(count, 3, "Forced hash join should find 3 matching rows"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_forced_l, hash_forced_r CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn not_in_with_encrypted_column(pool: PgPool) -> Result<()> { - // Test: NOT IN returns correct exclusion count - - create_hash_test_table(&pool, "hash_not_in_main").await?; - create_hash_test_table(&pool, "hash_not_in_sub").await?; - - // Main has ids 1, 2, 3 - for id in 1..=3 { - sqlx::query(&format!( - "INSERT INTO hash_not_in_main(e) VALUES (create_encrypted_json({}))", - id - )) - .execute(&pool) - .await?; - } - - // Sub has ids 1, 3 (so id=2 should be excluded) - sqlx::query("INSERT INTO hash_not_in_sub(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_not_in_sub(e) VALUES (create_encrypted_json(3))") - .execute(&pool) - .await?; - - let count: i64 = sqlx::query_scalar( - "SELECT count(*) FROM hash_not_in_main WHERE e NOT IN (SELECT e FROM hash_not_in_sub)", - ) - .fetch_one(&pool) - .await - .context("NOT IN on encrypted column failed")?; - - assert_eq!(count, 1, "NOT IN should return 1 row (id=2 only)"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_not_in_main, hash_not_in_sub CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn cross_type_equality_still_works(pool: PgPool) -> Result<()> { - // Test: eql_v2_encrypted = jsonb and jsonb = eql_v2_encrypted work in WHERE clauses - // Cross-type operators don't have HASHES, so planner uses merge join or nested loop - - create_hash_test_table(&pool, "hash_cross").await?; - - sqlx::query("INSERT INTO hash_cross(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_cross(e) VALUES (create_encrypted_json(2))") - .execute(&pool) - .await?; - - // encrypted = jsonb - let count_ej: i64 = sqlx::query_scalar( - "SELECT count(*) FROM hash_cross WHERE e = (create_encrypted_json(1))::jsonb", - ) - .fetch_one(&pool) - .await - .context("cross-type encrypted = jsonb failed")?; - - assert_eq!(count_ej, 1, "encrypted = jsonb should match 1 row"); - - // jsonb = encrypted - let count_je: i64 = sqlx::query_scalar( - "SELECT count(*) FROM hash_cross WHERE (create_encrypted_json(1))::jsonb = e", - ) - .fetch_one(&pool) - .await - .context("cross-type jsonb = encrypted failed")?; - - assert_eq!(count_je, 1, "jsonb = encrypted should match 1 row"); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_cross CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn hash_join_non_matching_returns_zero(pool: PgPool) -> Result<()> { - // Test: Hash join with no matching values returns zero rows - - create_hash_test_table(&pool, "hash_nomatch_l").await?; - create_hash_test_table(&pool, "hash_nomatch_r").await?; - - // Left has id=1, Right has id=2 - no overlap - sqlx::query("INSERT INTO hash_nomatch_l(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - sqlx::query("INSERT INTO hash_nomatch_r(e) VALUES (create_encrypted_json(2))") - .execute(&pool) - .await?; - - let count: i64 = sqlx::query_scalar( - "SELECT count(*) FROM hash_nomatch_l l JOIN hash_nomatch_r r ON l.e = r.e", - ) - .fetch_one(&pool) - .await - .context("non-matching hash join failed")?; - - assert_eq!( - count, 0, - "Join with no matching encrypted values should return 0 rows" - ); - - // Cleanup - sqlx::query("DROP TABLE IF EXISTS hash_nomatch_l, hash_nomatch_r CASCADE") - .execute(&pool) - .await?; - - Ok(()) -} - -// Mixed-index regression tests (`mixed_index_hash_join`, -// `mixed_index_group_by_dedup`, `mixed_index_union_dedup`) were removed -// as part of the v2 payload scheme discipline (see RFC). They asserted -// the "P1 hash/equality contract" — that an `hm+b3` row equals a -// `b3-only` row via `=` / hash join / GROUP BY / UNION because compare -// fell back to Blake3 across rows. That contract has no production -// analogue: protect.js does not emit a root-level `b3` term, so the -// "hm+b3 vs b3-only" mixed shape is fixture-only. - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn hash_encrypted_is_inlinable(pool: PgPool) -> Result<()> { - // The hash operator class FUNCTION 1 is called once per row by - // HashAggregate / hash joins / DISTINCT. For the per-row cost to drop - // out of the plpgsql interpreter, `eql_v2.hash_encrypted(eql_v2_encrypted)` - // must be (a) LANGUAGE sql and (b) without a pinned search_path. - // Either condition alone is enough to disable PG's SQL function inlining - // (see PostgreSQL's inline_function in clauses.c), so the splinter - // allowlist and tasks/pin_search_path.sql carve-out are load-bearing. - let (lang, proconfig): (String, Option>) = sqlx::query_as( - r#" - SELECT l.lanname::text, p.proconfig - FROM pg_proc p - JOIN pg_namespace n ON n.oid = p.pronamespace - JOIN pg_language l ON l.oid = p.prolang - WHERE n.nspname = 'eql_v2' - AND p.proname = 'hash_encrypted' - AND p.pronargs = 1 - "#, - ) - .fetch_one(&pool) - .await - .context("could not look up hash_encrypted in pg_proc")?; - - assert_eq!( - lang, "sql", - "hash_encrypted must be LANGUAGE sql for the planner to inline it (got {})", - lang - ); - - let has_search_path = proconfig - .as_ref() - .map(|cfg| cfg.iter().any(|c| c.starts_with("search_path="))) - .unwrap_or(false); - assert!( - !has_search_path, - "hash_encrypted must NOT have a pinned search_path — pin_search_path.sql allowlists it; \ - pinning disables SQL inlining (got proconfig={:?})", - proconfig - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/index_compare_tests.rs b/tests/sqlx/tests/index_compare_tests.rs deleted file mode 100644 index ffa2fa47c..000000000 --- a/tests/sqlx/tests/index_compare_tests.rs +++ /dev/null @@ -1,521 +0,0 @@ -//! Index-specific comparison function tests -//! -//! Tests the index-specific compare functions: -//! - compare_blake3() -//! - compare_hmac_256() -//! - compare_ore_block_u64_8_256() -//! - compare_ore_cllw() -//! - compare_ore_cllw() -//! -//! - src/blake3/compare_test.sql -//! - src/hmac_256/compare_test.sql -//! - src/ore_block_u64_8_256/compare_test.sql -//! - src/ore_cllw/compare_test.sql -//! - src/ore_cllw/compare_test.sql - -use anyhow::Result; -use sqlx::PgPool; - -// Helper macro to reduce repetition for compare tests -// -// Note: Uses format! for SQL construction because test data expressions -// (like "create_encrypted_json(1, 'b3')") must be evaluated by PostgreSQL, -// not passed as parameters. SQLx cannot pass PostgreSQL function calls as -// query parameters - they must be part of the SQL string. -macro_rules! assert_compare { - ($pool:expr, $func:expr, $a:expr, $b:expr, $expected:expr, $msg:expr) => { - let result: i32 = sqlx::query_scalar(&format!("SELECT eql_v2.{}({}, {})", $func, $a, $b)) - .fetch_one($pool) - .await?; - assert_eq!(result, $expected, $msg); - }; -} - -// -// Blake3 Index Comparison Tests -// - -// blake3_compare_{equal,less_than,greater_than} removed: they tested -// compare_blake3 against root-level b3-only payloads created by -// create_encrypted_json(id, 'b3'). With b3 removed from the synthetic -// base payload, those payloads no longer carry b3 and the tests are -// no longer meaningful at the root. compare_blake3 still exists and -// is exercised through ste_vec internal element comparisons. - -// -// HMAC-256 Index Comparison Tests -// - -#[sqlx::test] -async fn hmac_compare_equal(pool: PgPool) -> Result<()> { - // Test: compare_hmac_256() with equal values - - let a = "create_encrypted_json(1, 'hm')"; - let b = "create_encrypted_json(2, 'hm')"; - let c = "create_encrypted_json(3, 'hm')"; - - // 3 assertions: a=a, b=b, c=c should all return 0 - assert_compare!( - &pool, - "compare_hmac_256", - a, - a, - 0, - "compare_hmac_256(a, a) should equal 0" - ); - assert_compare!( - &pool, - "compare_hmac_256", - b, - b, - 0, - "compare_hmac_256(b, b) should equal 0" - ); - assert_compare!( - &pool, - "compare_hmac_256", - c, - c, - 0, - "compare_hmac_256(c, c) should equal 0" - ); - - Ok(()) -} - -#[sqlx::test] -async fn hmac_compare_less_than(pool: PgPool) -> Result<()> { - // Test: compare_hmac_256() with less than comparisons - - let a = "create_encrypted_json(1, 'hm')"; - let b = "create_encrypted_json(2, 'hm')"; - let c = "create_encrypted_json(3, 'hm')"; - - // 3 assertions: a Result<()> { - // Test: compare_hmac_256() with greater than comparisons - - let a = "create_encrypted_json(1, 'hm')"; - let b = "create_encrypted_json(2, 'hm')"; - let c = "create_encrypted_json(3, 'hm')"; - - // 3 assertions: b>a, c>a, c>b should all return 1 - assert_compare!( - &pool, - "compare_hmac_256", - b, - a, - 1, - "compare_hmac_256(b, a) should equal 1" - ); - assert_compare!( - &pool, - "compare_hmac_256", - c, - a, - 1, - "compare_hmac_256(c, a) should equal 1" - ); - assert_compare!( - &pool, - "compare_hmac_256", - c, - b, - 1, - "compare_hmac_256(c, b) should equal 1" - ); - - Ok(()) -} - -// -// ORE Block U64 Comparison Tests -// - -#[sqlx::test] -async fn ore_block_compare_equal(pool: PgPool) -> Result<()> { - // Test: compare_ore_block_u64_8_256() with equal values - - let a = "create_encrypted_ore_json(1)"; - let b = "create_encrypted_ore_json(21)"; - let c = "create_encrypted_ore_json(42)"; - - // 3 assertions: a=a, b=b, c=c should all return 0 - assert_compare!( - &pool, - "compare_ore_block_u64_8_256", - a, - a, - 0, - "compare_ore_block_u64_8_256(a, a) should equal 0" - ); - assert_compare!( - &pool, - "compare_ore_block_u64_8_256", - b, - b, - 0, - "compare_ore_block_u64_8_256(b, b) should equal 0" - ); - assert_compare!( - &pool, - "compare_ore_block_u64_8_256", - c, - c, - 0, - "compare_ore_block_u64_8_256(c, c) should equal 0" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ore_block_compare_less_than(pool: PgPool) -> Result<()> { - // Test: compare_ore_block_u64_8_256() with less than comparisons - - let a = "create_encrypted_ore_json(1)"; - let b = "create_encrypted_ore_json(21)"; - let c = "create_encrypted_ore_json(42)"; - - // 3 assertions: a Result<()> { - // Test: compare_ore_block_u64_8_256() with greater than comparisons - - let a = "create_encrypted_ore_json(1)"; - let b = "create_encrypted_ore_json(21)"; - let c = "create_encrypted_ore_json(42)"; - - // 3 assertions: b>a, c>a, c>b should all return 1 - assert_compare!( - &pool, - "compare_ore_block_u64_8_256", - b, - a, - 1, - "compare_ore_block_u64_8_256(b, a) should equal 1" - ); - assert_compare!( - &pool, - "compare_ore_block_u64_8_256", - c, - a, - 1, - "compare_ore_block_u64_8_256(c, a) should equal 1" - ); - assert_compare!( - &pool, - "compare_ore_block_u64_8_256", - c, - b, - 1, - "compare_ore_block_u64_8_256(c, b) should equal 1" - ); - - Ok(()) -} - -// -// ORE CLLW U64 Comparison Tests -// - -#[sqlx::test] -async fn ore_cllw_u64_compare_equal(pool: PgPool) -> Result<()> { - // Test: compare_ore_cllw() with equal values - // - // {"number": {N}} - // $.number: 3dba004f4d7823446e7cb71f6681b344 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(5), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(10), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - - // 3 assertions: a=a, b=b, c=c should all return 0 - assert_compare!( - &pool, - "compare", - a, - a, - 0, - "compare_ore_cllw(a, a) should equal 0" - ); - assert_compare!( - &pool, - "compare", - b, - b, - 0, - "compare_ore_cllw(b, b) should equal 0" - ); - assert_compare!( - &pool, - "compare", - c, - c, - 0, - "compare_ore_cllw(c, c) should equal 0" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ore_cllw_u64_compare_less_than(pool: PgPool) -> Result<()> { - // Test: compare_ore_cllw() with less than comparisons - // - // {"number": {N}} - // $.number: 3dba004f4d7823446e7cb71f6681b344 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(5), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(10), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - - // 3 assertions: a Result<()> { - // Test: compare_ore_cllw() with greater than comparisons - // - // {"number": {N}} - // $.number: 3dba004f4d7823446e7cb71f6681b344 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(5), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(10), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - - // 3 assertions: b>a, c>a, c>b should all return 1 - assert_compare!( - &pool, - "compare", - b, - a, - 1, - "compare_ore_cllw(b, a) should equal 1" - ); - assert_compare!( - &pool, - "compare", - c, - a, - 1, - "compare_ore_cllw(c, a) should equal 1" - ); - assert_compare!( - &pool, - "compare", - c, - b, - 1, - "compare_ore_cllw(c, b) should equal 1" - ); - - Ok(()) -} - -// -// ORE CLLW VAR Comparison Tests -// - -#[sqlx::test] -async fn ore_cllw_var_compare_equal(pool: PgPool) -> Result<()> { - // Test: compare_ore_cllw() with equal values - // - // {"hello": "world{N}"} - // $.hello: d90b97b5207d30fe867ca816ed0fe4a7 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(2), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(3), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - - // 3 assertions: a=a, b=b, c=c should all return 0 - assert_compare!( - &pool, - "compare", - a, - a, - 0, - "compare_ore_cllw(a, a) should equal 0" - ); - assert_compare!( - &pool, - "compare", - b, - b, - 0, - "compare_ore_cllw(b, b) should equal 0" - ); - assert_compare!( - &pool, - "compare", - c, - c, - 0, - "compare_ore_cllw(c, c) should equal 0" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ore_cllw_var_compare_less_than(pool: PgPool) -> Result<()> { - // Test: compare_ore_cllw() with less than comparisons - // - // {"hello": "world{N}"} - // $.hello: d90b97b5207d30fe867ca816ed0fe4a7 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(2), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(3), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - - // 3 assertions: a Result<()> { - // Test: compare_ore_cllw() with greater than comparisons - // - // {"hello": "world{N}"} - // $.hello: d90b97b5207d30fe867ca816ed0fe4a7 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(2), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(3), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - - // 3 assertions: b>a, c>a, c>b should all return 1 - assert_compare!( - &pool, - "compare", - b, - a, - 1, - "compare_ore_cllw(b, a) should equal 1" - ); - assert_compare!( - &pool, - "compare", - c, - a, - 1, - "compare_ore_cllw(c, a) should equal 1" - ); - assert_compare!( - &pool, - "compare", - c, - b, - 1, - "compare_ore_cllw(c, b) should equal 1" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/inequality_tests.rs b/tests/sqlx/tests/inequality_tests.rs deleted file mode 100644 index 9efdc2d96..000000000 --- a/tests/sqlx/tests/inequality_tests.rs +++ /dev/null @@ -1,189 +0,0 @@ -//! Inequality operator tests -//! -//! Tests EQL inequality (<>) operators with encrypted data - -use anyhow::{Context, Result}; -use eql_tests::QueryAssertion; -use sqlx::{PgPool, Row}; - -/// Helper to execute create_encrypted_json SQL function -async fn create_encrypted_json_with_index( - pool: &PgPool, - id: i32, - index_type: &str, -) -> Result { - let sql = format!( - "SELECT create_encrypted_json({}, '{}')::text", - id, index_type - ); - - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching create_encrypted_json({}, '{}')", id, index_type))?; - - let result: Option = row.try_get(0).with_context(|| { - format!( - "extracting text column for id={}, index_type='{}'", - id, index_type - ) - })?; - - result.with_context(|| { - format!( - "create_encrypted_json returned NULL for id={}, index_type='{}'", - id, index_type - ) - }) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn inequality_operator_finds_non_matching_records_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2_encrypted <> eql_v2_encrypted with HMAC index - // Should return records that DON'T match the encrypted value - - let encrypted = create_encrypted_json_with_index(&pool, 1, "hm").await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e <> '{}'::eql_v2_encrypted", - encrypted - ); - - // Should return 2 records (records 2 and 3, not record 1) - QueryAssertion::new(&pool, &sql).count(2).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn inequality_operator_returns_empty_for_non_existent_record_hmac( - pool: PgPool, -) -> Result<()> { - // Test: <> with different record (not in test data) - // Note: Using id=4 instead of 91347 to ensure ore data exists (start=40 is within ore range 1-1000) - - let encrypted = create_encrypted_json_with_index(&pool, 4, "hm").await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e <> '{}'::eql_v2_encrypted", - encrypted - ); - - // Non-existent record: all 3 existing records are NOT equal to id=4 - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn neq_function_finds_non_matching_records_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2.neq() function with HMAC index - - let encrypted = create_encrypted_json_with_index(&pool, 1, "hm").await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE eql_v2.neq(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(2).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn neq_function_returns_empty_for_non_existent_record_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2.neq() with different record (not in test data) - // Note: Using id=4 instead of 91347 to ensure ore data exists (start=40 is within ore range 1-1000) - - let encrypted = create_encrypted_json_with_index(&pool, 4, "hm").await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE eql_v2.neq(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - // Non-existent record: all 3 existing records are NOT equal to id=4 - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn inequality_operator_encrypted_not_equals_jsonb_hmac(pool: PgPool) -> Result<()> { - // Test: eql_v2_encrypted <> jsonb with HMAC index - - let sql_create = "SELECT (create_encrypted_json(1)::jsonb - 'ob')::text"; - let row = sqlx::query(sql_create) - .fetch_one(&pool) - .await - .context("fetching json value")?; - let json_value: String = row.try_get(0).context("extracting json text")?; - - let sql = format!("SELECT e FROM encrypted WHERE e <> '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(2).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn inequality_operator_jsonb_not_equals_encrypted_hmac(pool: PgPool) -> Result<()> { - // Test: jsonb <> eql_v2_encrypted (reverse direction) - - let sql_create = "SELECT (create_encrypted_json(1)::jsonb - 'ob')::text"; - let row = sqlx::query(sql_create) - .fetch_one(&pool) - .await - .context("fetching json value")?; - let json_value: String = row.try_get(0).context("extracting json text")?; - - let sql = format!("SELECT e FROM encrypted WHERE '{}'::jsonb <> e", json_value); - - QueryAssertion::new(&pool, &sql).count(2).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn inequality_operator_encrypted_not_equals_jsonb_no_match_hmac(pool: PgPool) -> Result<()> { - // Test: e <> jsonb with different record (not in test data) - // Note: Using id=4 instead of 91347 to ensure ore data exists (start=40 is within ore range 1-1000) - - let sql_create = "SELECT (create_encrypted_json(4)::jsonb - 'ob')::text"; - let row = sqlx::query(sql_create) - .fetch_one(&pool) - .await - .context("fetching json value")?; - let json_value: String = row.try_get(0).context("extracting json text")?; - - let sql = format!("SELECT e FROM encrypted WHERE e <> '{}'::jsonb", json_value); - - // Non-existent record: all 3 existing records are NOT equal to id=4 - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -// inequality_operator_finds_non_matching_records_blake3 and -// neq_function_finds_non_matching_records_blake3 removed: post-discipline, -// `<>` and eql_v2.neq are hmac-only at the root. Blake3 has no production -// analogue at the root payload level. - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn inequality_operator_encrypted_not_equals_jsonb_blake3(pool: PgPool) -> Result<()> { - // Test: e <> jsonb with Blake3 - - let sql_create = "SELECT (create_encrypted_json(1)::jsonb - 'ob')::text"; - let row = sqlx::query(sql_create) - .fetch_one(&pool) - .await - .context("fetching json value")?; - let json_value: String = row.try_get(0).context("extracting json text")?; - - let sql = format!("SELECT e FROM encrypted WHERE e <> '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(2).await; - - Ok(()) -} diff --git a/tests/sqlx/tests/jsonb_containment_uses_index_tests.rs b/tests/sqlx/tests/jsonb_containment_uses_index_tests.rs deleted file mode 100644 index fb0083cf6..000000000 --- a/tests/sqlx/tests/jsonb_containment_uses_index_tests.rs +++ /dev/null @@ -1,484 +0,0 @@ -//! Macro-based containment tests (@> and <@) for encrypted JSONB with GIN index -//! -//! These tests use a declarative macro pattern to systematically generate containment -//! tests for all operator/argument type combinations. -//! -//! Coverage Matrix (Macro-Generated): -//! -//! | Operator | LHS | RHS | Expected Result | -//! |--------------------|------------------|------------------|-----------------| -//! | jsonb_contains | EncryptedColumn | EncryptedParam | Match (self) | -//! | jsonb_contains | EncryptedColumn | SvElementParam | Match (subset) | -//! | jsonb_contains | EncryptedParam | EncryptedColumn | Match (self) | -//! | jsonb_contains | SvElementParam | EncryptedColumn | NO MATCH | -//! | jsonb_contained_by | EncryptedColumn | EncryptedParam | Match (self) | -//! | jsonb_contained_by | SvElementParam | EncryptedColumn | Match (subset) | -//! | jsonb_contained_by | EncryptedParam | EncryptedColumn | Match (self) | -//! | jsonb_contained_by | EncryptedColumn | SvElementParam | NO MATCH | -//! -//! Uses the ste_vec_vast table (500 rows) from migration 005_install_ste_vec_vast_data.sql - -use anyhow::{Context, Result}; -use eql_tests::{ - analyze_table, assert_uses_index, create_jsonb_gin_index, get_ste_vec_encrypted, - get_ste_vec_sv_element, -}; -use sqlx::PgPool; - -// Constants for ste_vec_vast table testing -const STE_VEC_VAST_TABLE: &str = "ste_vec_vast"; -const STE_VEC_VAST_GIN_INDEX: &str = "ste_vec_vast_gin_idx"; - -// ============================================================================ -// GIN Index Helper Functions -// ============================================================================ - -/// Setup GIN index on ste_vec_vast table for testing -/// -/// Creates the GIN index and runs ANALYZE to ensure query planner -/// has accurate statistics. -async fn setup_ste_vec_vast_gin_index(pool: &PgPool) -> Result<()> { - create_jsonb_gin_index(pool, STE_VEC_VAST_TABLE, STE_VEC_VAST_GIN_INDEX).await?; - analyze_table(pool, STE_VEC_VAST_TABLE).await?; - Ok(()) -} - -// ============================================================================ -// Macro-Based Coverage Matrix Tests -// ============================================================================ -// -// These tests use a declarative macro pattern to generate containment tests -// for all operator/type combinations systematically. - -/// Containment operator under test -#[derive(Debug, Clone, Copy)] -enum ContainmentOp { - /// jsonb_contains(lhs, rhs) - LHS contains RHS - Contains, - /// jsonb_contained_by(lhs, rhs) - LHS is contained by RHS - ContainedBy, -} - -/// Argument type for LHS or RHS position in containment query -#[derive(Debug, Clone, Copy, PartialEq)] -enum ArgumentType { - /// Table column reference: `e` - EncryptedColumn, - /// Full encrypted value as parameter: `$N::jsonb` - EncryptedParam, - /// Single sv element as parameter: `$N::jsonb` - SvElementParam, -} - -/// Test case configuration for containment operator tests -struct ContainmentTestCase { - operator: ContainmentOp, - lhs: ArgumentType, - rhs: ArgumentType, -} - -/// Generate a containment test from operator and argument types -macro_rules! containment_test { - ($name:ident, op = $op:ident, lhs = $lhs:ident, rhs = $rhs:ident) => { - #[sqlx::test] - async fn $name(pool: PgPool) -> Result<()> { - let test_case = ContainmentTestCase { - operator: ContainmentOp::$op, - lhs: ArgumentType::$lhs, - rhs: ArgumentType::$rhs, - }; - test_case - .run(&pool, STE_VEC_VAST_TABLE, STE_VEC_VAST_GIN_INDEX) - .await - } - }; -} - -/// Generate a negative containment test that verifies NO match is returned -macro_rules! containment_negative_test { - ($name:ident, op = $op:ident, lhs = $lhs:ident, rhs = $rhs:ident, $reason:expr) => { - #[sqlx::test] - async fn $name(pool: PgPool) -> Result<()> { - let test_case = ContainmentTestCase { - operator: ContainmentOp::$op, - lhs: ArgumentType::$lhs, - rhs: ArgumentType::$rhs, - }; - test_case - .run_negative(&pool, STE_VEC_VAST_TABLE, $reason) - .await - } - }; -} - -impl ContainmentOp { - fn sql_function(&self) -> &'static str { - match self { - ContainmentOp::Contains => "eql_v2.jsonb_contains", - ContainmentOp::ContainedBy => "eql_v2.jsonb_contained_by", - } - } -} - -impl ArgumentType { - fn is_param(&self) -> bool { - matches!( - self, - ArgumentType::EncryptedParam | ArgumentType::SvElementParam - ) - } -} - -impl ContainmentTestCase { - /// Build SQL query with proper placeholders based on argument types - fn build_query(&self, table: &str) -> (String, usize) { - let mut param_idx = 1usize; - - let lhs_sql = match self.lhs { - ArgumentType::EncryptedColumn => "e".to_string(), - ArgumentType::EncryptedParam | ArgumentType::SvElementParam => { - let s = format!("${}::jsonb", param_idx); - param_idx += 1; - s - } - }; - - let rhs_sql = match self.rhs { - ArgumentType::EncryptedColumn => "e".to_string(), - ArgumentType::EncryptedParam | ArgumentType::SvElementParam => { - let s = format!("${}::jsonb", param_idx); - param_idx += 1; - s - } - }; - - let id_param = format!("${}", param_idx); - - let sql = format!( - "SELECT id FROM {} WHERE {}({}, {}) AND id = {}", - table, - self.operator.sql_function(), - lhs_sql, - rhs_sql, - id_param - ); - - (sql, param_idx) - } - - /// Get the JSON value for a parameter based on argument type - fn get_param_value<'a>( - &self, - arg_type: ArgumentType, - encrypted: &'a serde_json::Value, - sv_element: &'a serde_json::Value, - ) -> &'a serde_json::Value { - match arg_type { - ArgumentType::EncryptedColumn => encrypted, - ArgumentType::EncryptedParam => encrypted, - ArgumentType::SvElementParam => sv_element, - } - } - - /// Execute query with dynamic bindings based on argument types - async fn execute_with_bindings( - &self, - pool: &PgPool, - sql: &str, - encrypted: &serde_json::Value, - sv_element: &serde_json::Value, - id: i64, - ) -> Result> { - let lhs_is_param = self.lhs.is_param(); - let rhs_is_param = self.rhs.is_param(); - - let result = match (lhs_is_param, rhs_is_param) { - (false, false) => sqlx::query_as(sql) - .bind(id) - .fetch_optional(pool) - .await - .with_context(|| { - format!( - "executing {:?}({:?}, {:?}) with id={}", - self.operator, self.lhs, self.rhs, id - ) - })?, - (true, false) => { - let lhs_val = self.get_param_value(self.lhs, encrypted, sv_element); - sqlx::query_as(sql) - .bind(lhs_val) - .bind(id) - .fetch_optional(pool) - .await - .with_context(|| { - format!( - "executing {:?}({:?}, {:?}) with id={}", - self.operator, self.lhs, self.rhs, id - ) - })? - } - (false, true) => { - let rhs_val = self.get_param_value(self.rhs, encrypted, sv_element); - sqlx::query_as(sql) - .bind(rhs_val) - .bind(id) - .fetch_optional(pool) - .await - .with_context(|| { - format!( - "executing {:?}({:?}, {:?}) with id={}", - self.operator, self.lhs, self.rhs, id - ) - })? - } - (true, true) => { - let lhs_val = self.get_param_value(self.lhs, encrypted, sv_element); - let rhs_val = self.get_param_value(self.rhs, encrypted, sv_element); - sqlx::query_as(sql) - .bind(lhs_val) - .bind(rhs_val) - .bind(id) - .fetch_optional(pool) - .await - .with_context(|| { - format!( - "executing {:?}({:?}, {:?}) with id={}", - self.operator, self.lhs, self.rhs, id - ) - })? - } - }; - - Ok(result) - } - - /// Verify that the GIN index is used for this query - async fn verify_index_usage( - &self, - pool: &PgPool, - table: &str, - index: &str, - encrypted: &serde_json::Value, - sv_element: &serde_json::Value, - ) -> Result<()> { - let lhs_sql = match self.lhs { - ArgumentType::EncryptedColumn => "e".to_string(), - ArgumentType::EncryptedParam => format!("'{}'::jsonb", encrypted), - ArgumentType::SvElementParam => format!("'{}'::jsonb", sv_element), - }; - - let rhs_sql = match self.rhs { - ArgumentType::EncryptedColumn => "e".to_string(), - ArgumentType::EncryptedParam => format!("'{}'::jsonb", encrypted), - ArgumentType::SvElementParam => format!("'{}'::jsonb", sv_element), - }; - - let explain_sql = format!( - "SELECT id FROM {} WHERE {}({}, {}) LIMIT 1", - table, - self.operator.sql_function(), - lhs_sql, - rhs_sql - ); - - assert_uses_index(pool, &explain_sql, index) - .await - .with_context(|| { - format!( - "verifying index usage for {:?}({:?}, {:?})", - self.operator, self.lhs, self.rhs - ) - })?; - - Ok(()) - } - - fn should_verify_index(&self) -> bool { - match self.operator { - ContainmentOp::Contains => self.lhs == ArgumentType::EncryptedColumn, - ContainmentOp::ContainedBy => self.rhs == ArgumentType::EncryptedColumn, - } - } - - /// Execute the test case - async fn run(&self, pool: &PgPool, table: &str, index: &str) -> Result<()> { - setup_ste_vec_vast_gin_index(pool) - .await - .with_context(|| format!("setting up GIN index for {:?} test", self.operator))?; - - let id: i64 = 1; - - let encrypted = get_ste_vec_encrypted(pool, table, id as i32) - .await - .with_context(|| { - format!( - "fetching encrypted value for {:?}({:?}, {:?})", - self.operator, self.lhs, self.rhs - ) - })?; - let sv_element = get_ste_vec_sv_element(pool, table, id as i32, 0) - .await - .with_context(|| { - format!( - "fetching sv_element for {:?}({:?}, {:?})", - self.operator, self.lhs, self.rhs - ) - })?; - - let (sql, _param_count) = self.build_query(table); - - let result: Option<(i64,)> = self - .execute_with_bindings(pool, &sql, &encrypted, &sv_element, id) - .await?; - - assert!( - result.is_some(), - "{:?}({:?}, {:?}) should find match for id={}", - self.operator, - self.lhs, - self.rhs, - id - ); - assert_eq!(result.unwrap().0, id); - - if self.should_verify_index() { - self.verify_index_usage(pool, table, index, &encrypted, &sv_element) - .await?; - } - - Ok(()) - } - - /// Execute a negative test case - verifies NO match is returned - /// - /// Used for asymmetric containment cases where a partial value (sv_element) - /// cannot contain a full value, and vice versa. - async fn run_negative(&self, pool: &PgPool, table: &str, reason: &str) -> Result<()> { - // 1. Setup GIN index - setup_ste_vec_vast_gin_index(pool).await.with_context(|| { - format!("setting up GIN index for negative {:?} test", self.operator) - })?; - - let id: i64 = 1; - - // 2. Fetch test data - let encrypted = get_ste_vec_encrypted(pool, table, id as i32) - .await - .with_context(|| { - format!( - "fetching encrypted value for negative {:?}({:?}, {:?})", - self.operator, self.lhs, self.rhs - ) - })?; - let sv_element = get_ste_vec_sv_element(pool, table, id as i32, 0) - .await - .with_context(|| { - format!( - "fetching sv_element for negative {:?}({:?}, {:?})", - self.operator, self.lhs, self.rhs - ) - })?; - - // 3. Build query - let (sql, _param_count) = self.build_query(table); - - // 4. Execute query with appropriate bindings - let result: Option<(i64,)> = self - .execute_with_bindings(pool, &sql, &encrypted, &sv_element, id) - .await?; - - // 5. Assert NO match found (negative test) - assert!( - result.is_none(), - "{:?}({:?}, {:?}) should NOT find match - {}", - self.operator, - self.lhs, - self.rhs, - reason - ); - - Ok(()) - } -} - -// ============================================================================ -// Contains Operator Tests via Macro -// ============================================================================ - -// Encrypted column contains encrypted parameter (self-containment) -containment_test!( - macro_contains_encrypted_encrypted_param, - op = Contains, - lhs = EncryptedColumn, - rhs = EncryptedParam -); - -// Column contains sv element param (element is subset of full value) -containment_test!( - macro_contains_encrypted_jsonb_param, - op = Contains, - lhs = EncryptedColumn, - rhs = SvElementParam -); - -// Encrypted param contains column (self-containment, param position reversed) -containment_test!( - macro_contains_encrypted_param_encrypted, - op = Contains, - lhs = EncryptedParam, - rhs = EncryptedColumn -); - -// ============================================================================ -// ContainedBy Operator Tests via Macro -// ============================================================================ - -// Column contained by encrypted param (self-containment) -containment_test!( - macro_contained_by_encrypted_encrypted_param, - op = ContainedBy, - lhs = EncryptedColumn, - rhs = EncryptedParam -); - -// SV element param contained by column (element is subset of full value) -containment_test!( - macro_contained_by_jsonb_param_encrypted, - op = ContainedBy, - lhs = SvElementParam, - rhs = EncryptedColumn -); - -// Encrypted param contained by column (self-containment, param position reversed) -containment_test!( - macro_contained_by_encrypted_param_encrypted, - op = ContainedBy, - lhs = EncryptedParam, - rhs = EncryptedColumn -); - -// ============================================================================ -// Negative Tests: Asymmetric Containment Cases -// ============================================================================ -// -// These tests verify that asymmetric containment relationships correctly -// return no match. A single sv_element cannot contain a full encrypted value, -// and a full encrypted value is not contained within a single sv_element. - -// SV element param does NOT contain column (element is subset, not superset) -containment_negative_test!( - macro_contains_jsonb_param_encrypted_no_match, - op = Contains, - lhs = SvElementParam, - rhs = EncryptedColumn, - "sv_element is a subset of encrypted value, cannot contain the full value" -); - -// Column is NOT contained by sv element param (full value not subset of element) -containment_negative_test!( - macro_contained_by_encrypted_jsonb_param_no_match, - op = ContainedBy, - lhs = EncryptedColumn, - rhs = SvElementParam, - "encrypted value has more keys than sv_element, cannot be contained in it" -); diff --git a/tests/sqlx/tests/jsonb_path_operators_tests.rs b/tests/sqlx/tests/jsonb_path_operators_tests.rs deleted file mode 100644 index 6597b7288..000000000 --- a/tests/sqlx/tests/jsonb_path_operators_tests.rs +++ /dev/null @@ -1,228 +0,0 @@ -//! JSONB path operator tests (-> and ->>) -//! -//! Tests encrypted JSONB path extraction - -use anyhow::Result; -use eql_tests::{QueryAssertion, Selectors}; -use sqlx::{PgPool, Row}; - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn arrow_operator_extracts_encrypted_path(pool: PgPool) -> Result<()> { - // Test: e -> 'selector' returns encrypted nested value - - let sql = format!( - "SELECT e -> '{}'::text FROM encrypted LIMIT 1", - Selectors::N - ); - - // Should return encrypted value for path $.n - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -#[ignore = "Test data doesn't have nested objects - placeholders used for selectors"] -async fn arrow_operator_with_nested_path(pool: PgPool) -> Result<()> { - // Test: Chaining -> operators for nested paths - // NOTE: This test doesn't match the original SQL test which tested eql_v2_encrypted selectors - // Current test data (ste_vec.sql) doesn't have nested object structure - - let sql = format!( - "SELECT e -> '{}'::text -> '{}'::text FROM encrypted LIMIT 1", - Selectors::NESTED_OBJECT, - Selectors::NESTED_FIELD - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn arrow_operator_returns_null_for_nonexistent_path(pool: PgPool) -> Result<()> { - // Test: -> returns NULL for non-existent selector - - let sql = "SELECT e -> 'nonexistent_selector_hash_12345'::text FROM encrypted LIMIT 1"; - - let row = sqlx::query(sql).fetch_one(&pool).await?; - let result: Option = row.try_get(0)?; - assert!(result.is_none(), "Should return NULL for non-existent path"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn double_arrow_operator_extracts_encrypted_text(pool: PgPool) -> Result<()> { - // Test: e ->> 'selector' returns encrypted value as text - - let sql = format!( - "SELECT e ->> '{}'::text FROM encrypted LIMIT 1", - Selectors::N - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn double_arrow_operator_returns_null_for_nonexistent(pool: PgPool) -> Result<()> { - // Test: ->> returns NULL for non-existent path - - let sql = "SELECT e ->> 'nonexistent_selector_hash_12345'::text FROM encrypted LIMIT 1"; - - let row = sqlx::query(sql).fetch_one(&pool).await?; - let result: Option = row.try_get(0)?; - assert!(result.is_none(), "Should return NULL for non-existent path"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn double_arrow_in_where_clause(pool: PgPool) -> Result<()> { - // Test: Using ->> in WHERE clause for filtering - - let sql = format!( - "SELECT id FROM encrypted WHERE (e ->> '{}'::text)::text IS NOT NULL", - Selectors::N - ); - - // All 3 records have $.n path - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn arrow_operator_returns_metadata_fields(pool: PgPool) -> Result<()> { - // Test: e -> 'selector' returns JSONB with 'i' (index) and 'v' (version) metadata fields. - // This verifies that the arrow operator returns the full encrypted metadata structure, - // not just the value. The metadata includes the index term ('i') and version ('v'). - // - // NOTE: This test uses raw SQLx instead of QueryAssertion because we need to verify - // specific JSONB field presence. QueryAssertion is designed for row count and basic - // value assertions, but doesn't support introspecting JSONB object structure. - - let sql = format!( - "SELECT (e -> '{}'::text)::jsonb FROM encrypted LIMIT 1", - Selectors::N - ); - - let result: serde_json::Value = sqlx::query_scalar(&sql).fetch_one(&pool).await?; - - assert!(result.is_object(), "-> operator should return JSONB object"); - let obj = result - .as_object() - .expect("Result should be a JSONB object after is_object() check"); - assert!( - obj.contains_key("i"), - "Result should contain 'i' (index metadata) field" - ); - assert!( - obj.contains_key("v"), - "Result should contain 'v' (version) field" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn ciphertext_function_extracts_from_arrow_result(pool: PgPool) -> Result<()> { - // Test: eql_v2.ciphertext(e -> 'selector') extracts ciphertext value - // - // The ciphertext() function extracts the 'c' field from the encrypted JSONB structure. - // When combined with the -> operator, it allows extracting ciphertext from nested paths. - - let sql = format!( - "SELECT eql_v2.ciphertext(e -> '{}'::text) FROM encrypted LIMIT 1", - Selectors::N - ); - - // Should return ciphertext value (a text string) - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn ciphertext_function_returns_all_rows(pool: PgPool) -> Result<()> { - // Test: eql_v2.ciphertext() returns ciphertext for all encrypted rows - - let sql = format!( - "SELECT eql_v2.ciphertext(e -> '{}'::text) FROM encrypted", - Selectors::N - ); - - // All 3 records have $.n path, should return 3 ciphertext values - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn arrow_operator_with_encrypted_selector(pool: PgPool) -> Result<()> { - // Test: e -> eql_v2_encrypted selector (encrypted selector) - // - // The -> operator can accept an eql_v2_encrypted value as the selector. - // The selector is created from JSONB with structure: {"s": "selector_hash"} - - let encrypted_selector = Selectors::as_encrypted(Selectors::ROOT); - let sql = format!( - "SELECT e -> '{}'::jsonb::eql_v2_encrypted FROM encrypted LIMIT 1", - encrypted_selector - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn arrow_operator_with_encrypted_selector_all_rows(pool: PgPool) -> Result<()> { - // Test: e -> eql_v2_encrypted selector returns all matching rows - - let encrypted_selector = Selectors::as_encrypted(Selectors::ROOT); - let sql = format!( - "SELECT e -> '{}'::jsonb::eql_v2_encrypted FROM encrypted", - encrypted_selector - ); - - // All 3 records should have the root selector - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn double_arrow_operator_with_encrypted_selector(pool: PgPool) -> Result<()> { - // Test: e ->> eql_v2_encrypted selector (encrypted selector) - // - // The ->> operator can also accept an eql_v2_encrypted value as the selector. - - let encrypted_selector = Selectors::as_encrypted(Selectors::ROOT); - let sql = format!( - "SELECT e ->> '{}'::jsonb::eql_v2_encrypted FROM encrypted LIMIT 1", - encrypted_selector - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn double_arrow_operator_with_encrypted_selector_all_rows(pool: PgPool) -> Result<()> { - // Test: e ->> eql_v2_encrypted selector returns all matching rows - - let encrypted_selector = Selectors::as_encrypted(Selectors::ROOT); - let sql = format!( - "SELECT e ->> '{}'::jsonb::eql_v2_encrypted FROM encrypted", - encrypted_selector - ); - - // All 3 records should have the root selector - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} diff --git a/tests/sqlx/tests/jsonb_path_query_inlining_tests.rs b/tests/sqlx/tests/jsonb_path_query_inlining_tests.rs deleted file mode 100644 index d8fcb1819..000000000 --- a/tests/sqlx/tests/jsonb_path_query_inlining_tests.rs +++ /dev/null @@ -1,115 +0,0 @@ -//! Tests for the inlined jsonb_path_query / _first / _exists family. -//! -//! Coverage: behavioural parity with the pre-inlining plpgsql bodies, plus -//! plan assertions confirming the bodies fold into the calling query. - -use anyhow::Result; -use eql_tests::Selectors; -use sqlx::PgPool; - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_query_first_returns_matching_element(pool: PgPool) -> Result<()> { - let result: Option = sqlx::query_scalar(&format!( - "SELECT (eql_v2.jsonb_path_query_first(e, '{}')).data \ - FROM encrypted ORDER BY id LIMIT 1", - Selectors::HELLO - )) - .fetch_one(&pool) - .await?; - - let payload = result.expect("jsonb_path_query_first should return a value"); - assert_eq!( - payload.get("s").and_then(|s| s.as_str()), - Some(Selectors::HELLO), - "returned element's selector must match the queried selector" - ); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_query_first_returns_null_for_missing_selector(pool: PgPool) -> Result<()> { - let result: Option = sqlx::query_scalar( - "SELECT (eql_v2.jsonb_path_query_first(e, 'no_such_selector')).data \ - FROM encrypted ORDER BY id LIMIT 1", - ) - .fetch_one(&pool) - .await?; - assert!(result.is_none(), "missing selector should yield NULL"); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_exists_true_when_selector_matches(pool: PgPool) -> Result<()> { - let result: bool = sqlx::query_scalar(&format!( - "SELECT eql_v2.jsonb_path_exists(e, '{}') \ - FROM encrypted ORDER BY id LIMIT 1", - Selectors::HELLO - )) - .fetch_one(&pool) - .await?; - assert!(result, "selector $.hello is present in the fixture"); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_exists_false_when_selector_missing(pool: PgPool) -> Result<()> { - let result: bool = sqlx::query_scalar( - "SELECT eql_v2.jsonb_path_exists(e, 'no_such_selector') \ - FROM encrypted ORDER BY id LIMIT 1", - ) - .fetch_one(&pool) - .await?; - assert!(!result, "non-existent selector should report false"); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_query_set_returning_yields_matching_element(pool: PgPool) -> Result<()> { - // Set-returning form. The legacy contract: 0 or 1 rows for non-array - // matches; a single array-wrapped row when matched elements carry `a: 1`. - // Fixture elements at $.hello don't have the array flag, so we expect - // one row per matching encrypted-document. - let rows: Vec = sqlx::query_scalar(&format!( - "SELECT (eql_v2.jsonb_path_query(e, '{}')).data FROM encrypted", - Selectors::HELLO - )) - .fetch_all(&pool) - .await?; - - assert_eq!(rows.len(), 3, "fixture has 3 rows, each yielding one match"); - for row in rows { - assert_eq!( - row.get("s").and_then(|s| s.as_str()), - Some(Selectors::HELLO) - ); - } - Ok(()) -} - -#[sqlx::test] -async fn jsonb_path_query_preserves_array_wrap_semantics(pool: PgPool) -> Result<()> { - // Two matched elements at the same selector where at least one has `a: 1`: - // legacy contract returns a single row containing both matches under - // `sv`, with `a: 1` set on the wrapper. - let sql = r#" - SELECT (eql_v2.jsonb_path_query( - '{ - "v": 2, - "i": {"t": "t", "c": "c"}, - "sv": [ - {"s": "sel_a", "c": "ct1", "a": 1}, - {"s": "sel_a", "c": "ct2"} - ] - }'::jsonb, - 'sel_a' - )).data - "#; - let result: serde_json::Value = sqlx::query_scalar(sql).fetch_one(&pool).await?; - assert_eq!(result.get("a").and_then(|v| v.as_i64()), Some(1)); - let inner_sv = result - .get("sv") - .and_then(|v| v.as_array()) - .expect("sv array present"); - assert_eq!(inner_sv.len(), 2); - Ok(()) -} diff --git a/tests/sqlx/tests/jsonb_tests.rs b/tests/sqlx/tests/jsonb_tests.rs deleted file mode 100644 index caea6c791..000000000 --- a/tests/sqlx/tests/jsonb_tests.rs +++ /dev/null @@ -1,290 +0,0 @@ -//! JSONB function tests -//! -//! Tests EQL JSONB path query functions with encrypted data - -use eql_tests::{QueryAssertion, Selectors}; -use sqlx::{PgPool, Row}; - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_elements_returns_array_elements(pool: PgPool) { - // Test: jsonb_array_elements returns array elements from jsonb_path_query result - - let sql = format!( - "SELECT eql_v2.jsonb_array_elements(eql_v2.jsonb_path_query(e, '{}')) as e FROM encrypted", - Selectors::ARRAY_ELEMENTS - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - // Also verify count - QueryAssertion::new(&pool, &sql).count(5).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_elements_throws_exception_for_non_array(pool: PgPool) { - // Test: jsonb_array_elements throws exception if input is not an array - - let sql = format!( - "SELECT eql_v2.jsonb_array_elements(eql_v2.jsonb_path_query(e, '{}')) as e FROM encrypted LIMIT 1", - Selectors::ARRAY_ROOT - ); - - QueryAssertion::new(&pool, &sql).throws_exception().await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_elements_text_returns_array_elements(pool: PgPool) { - // Test: jsonb_array_elements_text returns array elements as text - - let sql = format!( - "SELECT eql_v2.jsonb_array_elements_text(eql_v2.jsonb_path_query(e, '{}')) as e FROM encrypted", - Selectors::ARRAY_ELEMENTS - ); - - QueryAssertion::new(&pool, &sql) - .returns_rows() - .await - .count(5) - .await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_elements_text_throws_exception_for_non_array(pool: PgPool) { - // Test: jsonb_array_elements_text throws exception if input is not an array - - let sql = format!( - "SELECT eql_v2.jsonb_array_elements_text(eql_v2.jsonb_path_query(e, '{}')) as e FROM encrypted LIMIT 1", - Selectors::ARRAY_ROOT - ); - - QueryAssertion::new(&pool, &sql).throws_exception().await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_length_returns_array_length(pool: PgPool) { - // Test: jsonb_array_length returns correct array length - - let sql = format!( - "SELECT eql_v2.jsonb_array_length(eql_v2.jsonb_path_query(e, '{}')) as e FROM encrypted LIMIT 1", - Selectors::ARRAY_ELEMENTS - ); - - QueryAssertion::new(&pool, &sql).returns_int_value(5).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_length_throws_exception_for_non_array(pool: PgPool) { - // Test: jsonb_array_length throws exception if input is not an array - - let sql = format!( - "SELECT eql_v2.jsonb_array_length(eql_v2.jsonb_path_query(e, '{}')) as e FROM encrypted LIMIT 1", - Selectors::ARRAY_ROOT - ); - - QueryAssertion::new(&pool, &sql).throws_exception().await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_query_finds_selector(pool: PgPool) { - // Test: jsonb_path_query finds records by selector - - let sql = format!( - "SELECT eql_v2.jsonb_path_query(e, '{}') FROM encrypted LIMIT 1", - Selectors::N - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_query_returns_correct_count(pool: PgPool) { - // Test: jsonb_path_query returns correct count - - let sql = format!( - "SELECT eql_v2.jsonb_path_query(e, '{}') FROM encrypted", - Selectors::N - ); - - QueryAssertion::new(&pool, &sql).count(3).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_exists_returns_true_for_existing_path(pool: PgPool) { - // Test: jsonb_path_exists returns true for existing path - - let sql = format!( - "SELECT eql_v2.jsonb_path_exists(e, '{}') FROM encrypted LIMIT 1", - Selectors::N - ); - - QueryAssertion::new(&pool, &sql) - .returns_bool_value(true) - .await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_exists_returns_false_for_nonexistent_path(pool: PgPool) { - // Test: jsonb_path_exists returns false for nonexistent path - - let sql = "SELECT eql_v2.jsonb_path_exists(e, 'blahvtha') FROM encrypted LIMIT 1"; - - QueryAssertion::new(&pool, sql) - .returns_bool_value(false) - .await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_exists_returns_correct_count(pool: PgPool) { - // Test: jsonb_path_exists returns correct count - - let sql = format!( - "SELECT eql_v2.jsonb_path_exists(e, '{}') FROM encrypted", - Selectors::N - ); - - QueryAssertion::new(&pool, &sql).count(3).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn jsonb_path_query_returns_valid_structure(pool: PgPool) { - // Test: jsonb_path_query returns JSONB with correct structure ('i' and 'v' keys) - // Important: Validates decrypt-ability of returned data - - let sql = format!( - "SELECT eql_v2.jsonb_path_query(e, '{}')::jsonb FROM encrypted LIMIT 1", - Selectors::N - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await.unwrap(); - let result: serde_json::Value = row.try_get(0).unwrap(); - - // Verify structure has 'i' (iv) and 'v' (value) keys required for decryption - assert!( - result.get("i").is_some(), - "Result must contain 'i' key for initialization vector" - ); - assert!( - result.get("v").is_some(), - "Result must contain 'v' key for encrypted value" - ); -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_elements_returns_valid_structure(pool: PgPool) { - // Test: jsonb_array_elements returns elements with correct structure - - let sql = format!( - "SELECT eql_v2.jsonb_array_elements(eql_v2.jsonb_path_query(e, '{}'))::jsonb FROM encrypted LIMIT 1", - Selectors::ARRAY_ELEMENTS - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await.unwrap(); - let result: serde_json::Value = row.try_get(0).unwrap(); - - // Verify array elements maintain encryption structure - assert!( - result.get("i").is_some(), - "Array element must contain 'i' key for initialization vector" - ); - assert!( - result.get("v").is_some(), - "Array element must contain 'v' key for encrypted value" - ); -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_path_query_first_with_array_selector(pool: PgPool) { - // Test: jsonb_path_query_first returns first element from array path - - let sql = format!( - "SELECT eql_v2.jsonb_path_query_first(e, '{}') as e FROM encrypted", - Selectors::ARRAY_ROOT - ); - - // Should return 4 total rows (3 from encrypted_json + 1 from array_data) - QueryAssertion::new(&pool, sql).count(4).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_path_query_first_filters_non_null(pool: PgPool) { - // Test: jsonb_path_query_first can filter by non-null values - - let sql = format!( - "SELECT eql_v2.jsonb_path_query_first(e, '{}') as e FROM encrypted WHERE eql_v2.jsonb_path_query_first(e, '{}') IS NOT NULL", - Selectors::ARRAY_ROOT, - Selectors::ARRAY_ROOT - ); - - // Should return only 1 row (the one with array data) - QueryAssertion::new(&pool, sql).count(1).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_path_query_with_array_selector_returns_single_result(pool: PgPool) { - // Test: jsonb_path_query wraps arrays as single result - - let sql = format!( - "SELECT eql_v2.jsonb_path_query(e, '{}') FROM encrypted", - Selectors::ARRAY_ELEMENTS - ); - - // Array should be wrapped and returned as single element - QueryAssertion::new(&pool, sql).count(1).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_path_exists_with_array_selector(pool: PgPool) { - // Test: jsonb_path_exists works with array selectors - - let sql = format!( - "SELECT eql_v2.jsonb_path_exists(e, '{}') FROM encrypted", - Selectors::ARRAY_ELEMENTS - ); - - // Should return 4 rows (3 encrypted_json + 1 array_data) - QueryAssertion::new(&pool, sql).count(4).await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_elements_with_encrypted_selector(pool: PgPool) { - // Test: jsonb_array_elements_text accepts eql_v2_encrypted selector - // Tests alternative API pattern using encrypted selector - - // Create encrypted selector for array elements path - let selector_sql = format!( - "SELECT '{}'::jsonb::eql_v2_encrypted::text", - Selectors::as_encrypted(Selectors::ARRAY_ELEMENTS) - ); - let row = sqlx::query(&selector_sql).fetch_one(&pool).await.unwrap(); - let encrypted_selector: String = row.try_get(0).unwrap(); - - let sql = format!( - "SELECT eql_v2.jsonb_array_elements_text(eql_v2.jsonb_path_query(e, '{}'::eql_v2_encrypted)) as e FROM encrypted", - encrypted_selector - ); - - QueryAssertion::new(&pool, &sql) - .returns_rows() - .await - .count(5) - .await; -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json", "array_data")))] -async fn jsonb_array_elements_with_encrypted_selector_throws_for_non_array(pool: PgPool) { - // Test: encrypted selector also validates array type - - let selector_sql = format!( - "SELECT '{}'::jsonb::eql_v2_encrypted::text", - Selectors::as_encrypted(Selectors::ARRAY_ROOT) - ); - let row = sqlx::query(&selector_sql).fetch_one(&pool).await.unwrap(); - let encrypted_selector: String = row.try_get(0).unwrap(); - - let sql = format!( - "SELECT eql_v2.jsonb_array_elements_text(eql_v2.jsonb_path_query(e, '{}'::eql_v2_encrypted)) as e FROM encrypted LIMIT 1", - encrypted_selector - ); - - QueryAssertion::new(&pool, &sql).throws_exception().await; -} diff --git a/tests/sqlx/tests/like_operator_tests.rs b/tests/sqlx/tests/like_operator_tests.rs deleted file mode 100644 index 679ee81d8..000000000 --- a/tests/sqlx/tests/like_operator_tests.rs +++ /dev/null @@ -1,198 +0,0 @@ -//! LIKE operator tests -//! -//! Tests pattern matching with encrypted data using LIKE operators - -use anyhow::{Context, Result}; -use eql_tests::QueryAssertion; -use sqlx::{PgPool, Row}; - -/// Helper to execute create_encrypted_json SQL function without index -async fn create_encrypted_json(pool: &PgPool, id: i32) -> Result { - let sql = format!("SELECT create_encrypted_json({})::text", id); - - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching create_encrypted_json({})", id))?; - - let result: Option = row - .try_get(0) - .with_context(|| format!("extracting text column for id={}", id))?; - - result.with_context(|| format!("create_encrypted_json returned NULL for id={}", id)) -} - -/// Helper to execute create_encrypted_json SQL function with specific indexes -async fn create_encrypted_json_with_index( - pool: &PgPool, - id: i32, - index_type: &str, -) -> Result { - let sql = format!( - "SELECT create_encrypted_json({}, '{}')::text", - id, index_type - ); - - let row = sqlx::query(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("fetching create_encrypted_json({}, '{}')", id, index_type))?; - - let result: Option = row.try_get(0).with_context(|| { - format!( - "extracting text column for id={}, index_type='{}'", - id, index_type - ) - })?; - - result.with_context(|| { - format!( - "create_encrypted_json returned NULL for id={}, index_type='{}'", - id, index_type - ) - }) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] -async fn like_operator_matches_pattern(pool: PgPool) -> Result<()> { - // Test: ~~ operator (LIKE) matches encrypted values - // Tests both ~~ operator and LIKE operator (they're equivalent) - // Plus partial match test - // NOTE: First block uses create_encrypted_json(i) WITHOUT 'bf' index - - // Test 1-3: Loop through records 1-3, test ~~ operator - for i in 1..=3 { - let encrypted = create_encrypted_json(&pool, i).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e ~~ '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - } - - // Test 4-6: Loop through records 1-3, test LIKE operator (equivalent to ~~) - for i in 1..=3 { - let encrypted = create_encrypted_json(&pool, i).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e LIKE '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - } - - // FIXME: Skipping partial match tests as they use placeholder stub data that causes query execution errors - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] -async fn like_operator_no_match(pool: PgPool) -> Result<()> { - // Test: ~~ operator returns empty for non-matching pattern - // This test verifies that LIKE operations correctly return no results - // when the encrypted value doesn't exist in the table - - // Test 9: Non-existent encrypted value returns no results - // Using id=4 which doesn't exist in fixture (only has 1, 2, 3) but is within ORE range - let encrypted = create_encrypted_json(&pool, 4).await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE e ~~ '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] -async fn like_function_matches_pattern(pool: PgPool) -> Result<()> { - // Test: eql_v2.like() function - // Tests the eql_v2.like() function which wraps bloom filter matching - - // Test 7-9: Loop through records 1-3, test eql_v2.like() function - for i in 1..=3 { - let encrypted = create_encrypted_json_with_index(&pool, i, "bf").await?; - - let sql = format!( - "SELECT e FROM encrypted WHERE eql_v2.like(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - } - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("match_data")))] -async fn ilike_operator_case_insensitive_matches(pool: PgPool) -> Result<()> { - // Test: ~~* operator (ILIKE) matches encrypted values (case-insensitive) - // Tests both ~~* operator and ILIKE operator (they're equivalent) - // NOTE: Uses create_encrypted_json(i, 'bf') WITH bloom filter index - - // 6 assertions: Test ~~* and ILIKE operators across 3 records - for i in 1..=3 { - let encrypted = create_encrypted_json_with_index(&pool, i, "bf").await?; - - // Test ~~* operator (case-insensitive LIKE) - let sql = format!( - "SELECT e FROM encrypted WHERE e ~~* '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - - // Test ILIKE operator (equivalent to ~~*) - let sql = format!( - "SELECT e FROM encrypted WHERE e ILIKE '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).returns_rows().await; - } - - // FIXME: Skipping partial match tests as they use placeholder stub data that causes query execution errors - - Ok(()) -} - -/// Regression test for issue #189: eql_v2.like / eql_v2.ilike must be IMMUTABLE -/// so the planner inlines them and a functional bloom_filter index can match -/// `WHERE eql_v2.like(col, val)`. Without this, queries silently seq-scan. -#[sqlx::test] -async fn like_and_ilike_are_immutable(pool: PgPool) -> Result<()> { - let sql = "SELECT proname, provolatile::text \ - FROM pg_proc \ - WHERE pronamespace = 'eql_v2'::regnamespace \ - AND proname IN ('like', 'ilike') \ - AND pronargs = 2 \ - ORDER BY proname"; - - let rows = sqlx::query(sql) - .fetch_all(&pool) - .await - .context("querying pg_proc for like/ilike volatility")?; - - assert_eq!( - rows.len(), - 2, - "expected eql_v2.like and eql_v2.ilike to exist" - ); - - for row in rows { - let name: String = row.try_get("proname")?; - let volatility: String = row.try_get("provolatile")?; - assert_eq!( - volatility, "i", - "eql_v2.{} must be IMMUTABLE (provolatile='i') for index inlining; got '{}'", - name, volatility, - ); - } - - Ok(()) -} diff --git a/tests/sqlx/tests/operator_class_tests.rs b/tests/sqlx/tests/operator_class_tests.rs deleted file mode 100644 index 0e0d1a1dc..000000000 --- a/tests/sqlx/tests/operator_class_tests.rs +++ /dev/null @@ -1,247 +0,0 @@ -//! Operator class tests -//! -//! Tests PostgreSQL operator class definitions and index behavior - -use anyhow::Result; -use sqlx::PgPool; - -/// Helper to create encrypted table for testing -async fn create_table_with_encrypted(pool: &PgPool) -> Result<()> { - sqlx::query("DROP TABLE IF EXISTS encrypted CASCADE") - .execute(pool) - .await?; - - sqlx::query( - "CREATE TABLE encrypted ( - id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - e eql_v2_encrypted - )", - ) - .execute(pool) - .await?; - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn group_by_encrypted_column(pool: PgPool) -> Result<()> { - // Test: GROUP BY works with eql_v2_encrypted type (1 assertion) - // Uses create_encrypted_json which includes hmac/blake3 terms required for hash aggregation - - create_table_with_encrypted(&pool).await?; - - // Insert values with hmac/blake3 terms: 4x id=1, 2x id=2 - for _ in 0..4 { - sqlx::query("INSERT INTO encrypted(e) VALUES (create_encrypted_json(1))") - .execute(&pool) - .await?; - } - for _ in 0..2 { - sqlx::query("INSERT INTO encrypted(e) VALUES (create_encrypted_json(2))") - .execute(&pool) - .await?; - } - - // GROUP BY should work - most common value is id=1 (4 occurrences) - let count: i64 = sqlx::query_scalar( - "SELECT count(id) FROM encrypted GROUP BY e ORDER BY count(id) DESC LIMIT 1", - ) - .fetch_one(&pool) - .await?; - - assert_eq!(count, 4, "GROUP BY should return 4 for most common value"); - - Ok(()) -} - -#[sqlx::test] -async fn index_usage_with_explain_analyze(pool: PgPool) -> Result<()> { - // Test: Operator class index usage patterns. Post-#193, the `=` - // operator requires hmac on both sides; literals must carry `hm`. - - create_table_with_encrypted(&pool).await?; - - // Without index, should not use Bitmap Heap Scan - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = '(\"{\\\"hm\\\": \\\"abc\\\"}\")';", - ) - .fetch_one(&pool) - .await?; - - assert!( - !explain.contains("Bitmap Heap Scan on encrypted"), - "Should not use Bitmap Heap Scan without index" - ); - - // Create index - sqlx::query("CREATE INDEX ON encrypted (e eql_v2.encrypted_operator_class)") - .execute(&pool) - .await?; - - // Verify index usage shape with hmac literal (any matching shape works - // — the assertion is on plan structure, not row matches). - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = '(\"{\\\"hm\\\": \\\"abc\\\"}\")';", - ) - .fetch_one(&pool) - .await?; - - assert!( - explain.contains("Scan"), - "Should use some form of scan with index" - ); - - Ok(()) -} - -#[sqlx::test] -async fn index_behavior_with_different_data_types(pool: PgPool) -> Result<()> { - // Test: Index behavior with various encrypted data types. The opclass - // btree FUNCTION 1 is eql_v2.encrypted_btree_compare (total, non-raising), - // so building the index and ANALYZE over hm-only payloads both succeed. - - create_table_with_encrypted(&pool).await?; - - // Insert hmac data (post-#193, `=` requires hmac on both sides; rows - // without hm are not eligible for the equality index path). - sqlx::query("INSERT INTO encrypted (e) VALUES ('(\"{\\\"hm\\\": \\\"setup\\\"}\")');") - .execute(&pool) - .await?; - - // Create index - sqlx::query("CREATE INDEX encrypted_index ON encrypted (e eql_v2.encrypted_operator_class)") - .execute(&pool) - .await?; - - sqlx::query("ANALYZE encrypted").execute(&pool).await?; - - // Plan generation works with hmac data - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = '(\"{\\\"hm\\\": \\\"setup\\\"}\")';", - ) - .fetch_one(&pool) - .await?; - - assert!(!explain.is_empty(), "EXPLAIN should return a plan"); - - // Truncate and add five HMAC rows for index-selectivity assertions - sqlx::query("TRUNCATE encrypted").execute(&pool).await?; - sqlx::query("DROP INDEX encrypted_index") - .execute(&pool) - .await?; - sqlx::query("CREATE INDEX encrypted_index ON encrypted (e eql_v2.encrypted_operator_class)") - .execute(&pool) - .await?; - - sqlx::query( - "INSERT INTO encrypted (e) VALUES - ('(\"{\\\"hm\\\": \\\"abc\\\"}\")'), - ('(\"{\\\"hm\\\": \\\"def\\\"}\")'), - ('(\"{\\\"hm\\\": \\\"ghi\\\"}\")'), - ('(\"{\\\"hm\\\": \\\"jkl\\\"}\")'), - ('(\"{\\\"hm\\\": \\\"mno\\\"}\")');", - ) - .execute(&pool) - .await?; - - // With HMAC data, literal row type should work - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = '(\"{\\\"hm\\\": \\\"abc\\\"}\")';", - ) - .fetch_one(&pool) - .await?; - - // With enough data, index might be used - assert!( - explain.contains("Index") || explain.contains("Scan"), - "Should consider using index with HMAC data" - ); - - // Test JSONB cast (index not used) - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = '{\"hm\": \"abc\"}'::jsonb;", - ) - .fetch_one(&pool) - .await?; - - assert!(!explain.is_empty(), "EXPLAIN with JSONB cast should work"); - - // Test JSONB to eql_v2_encrypted cast (index should be considered) - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = '{\"hm\": \"abc\"}'::jsonb::eql_v2_encrypted;", - ) - .fetch_one(&pool) - .await?; - - assert!( - explain.contains("Index") || explain.contains("Scan"), - "Cast to eql_v2_encrypted should enable index usage" - ); - - // Test text to eql_v2_encrypted cast - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = '{\"hm\": \"abc\"}'::text::eql_v2_encrypted;", - ) - .fetch_one(&pool) - .await?; - - assert!( - explain.contains("Index") || explain.contains("Scan"), - "Text cast to eql_v2_encrypted should enable index usage" - ); - - // Test eql_v2.to_encrypted with JSONB - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = eql_v2.to_encrypted('{\"hm\": \"abc\"}'::jsonb);", - ) - .fetch_one(&pool) - .await?; - - assert!( - explain.contains("Index") || explain.contains("Scan"), - "to_encrypted with JSONB should enable index usage" - ); - - // Test eql_v2.to_encrypted with text - let explain: String = sqlx::query_scalar( - "EXPLAIN SELECT e::jsonb FROM encrypted WHERE e = eql_v2.to_encrypted('{\"hm\": \"abc\"}');", - ) - .fetch_one(&pool) - .await?; - - assert!( - explain.contains("Index") || explain.contains("Scan"), - "to_encrypted with text should enable index usage" - ); - - // ORE term against `=` removed: post-#193, equality requires hmac on - // both sides. ORE-only payloads are eligible for `<`/`<=`/`>`/`>=` but - // not `=`. The remaining hmac-shape assertions above cover the index - // path that operator_class indexes are designed to engage. - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn analyze_on_hmac_only_column_does_not_raise(pool: PgPool) -> Result<()> { - // Regression: eql_v2_encrypted has a DEFAULT btree operator class, so - // ANALYZE invokes its FUNCTION 1 comparator to gather column statistics. - // That comparator must never raise — ANALYZE (autovacuum included) runs - // on every encrypted column. It previously pointed at the strict - // eql_v2.compare, which raises without a Block-ORE `ob` term, so ANALYZE - // failed on every equality-only (`hm`-only) encrypted column. FUNCTION 1 - // is now eql_v2.encrypted_btree_compare (total, non-raising). - - create_table_with_encrypted(&pool).await?; - - for _ in 0..5 { - sqlx::query("INSERT INTO encrypted(e) VALUES (create_encrypted_json(1, 'hm'))") - .execute(&pool) - .await?; - } - - // Must complete without raising. - sqlx::query("ANALYZE encrypted").execute(&pool).await?; - - Ok(()) -} diff --git a/tests/sqlx/tests/operator_compare_tests.rs b/tests/sqlx/tests/operator_compare_tests.rs deleted file mode 100644 index e8e2dd73a..000000000 --- a/tests/sqlx/tests/operator_compare_tests.rs +++ /dev/null @@ -1,153 +0,0 @@ -//! Operator compare function tests -//! -//! Tests the main eql_v2.compare() function with all index types - -use anyhow::Result; -use sqlx::PgPool; - -// Helper macro to reduce repetition for compare tests -macro_rules! assert_compare { - ($pool:expr, $sql_a:expr, $sql_b:expr, $expected:expr, $msg:expr) => { - let result: i32 = - sqlx::query_scalar(&format!("SELECT eql_v2.compare({}, {})", $sql_a, $sql_b)) - .fetch_one($pool) - .await?; - assert_eq!(result, $expected, $msg); - }; -} - -#[sqlx::test] -async fn compare_ore_cllw_hello_path(pool: PgPool) -> Result<()> { - // Test: compare() with ORE CLLW VAR 8 on $.hello path - // {"hello": "world{N}"} - // $.hello: d90b97b5207d30fe867ca816ed0fe4a7 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(2), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(3), 'd90b97b5207d30fe867ca816ed0fe4a7')).data)::eql_v2.ste_vec_entry"; - - // 9 assertions: reflexive, transitive, and antisymmetric comparison properties - assert_compare!(&pool, a, a, 0, "compare(a, a) should equal 0"); - assert_compare!(&pool, a, b, -1, "compare(a, b) should equal -1"); - assert_compare!(&pool, a, c, -1, "compare(a, c) should equal -1"); - assert_compare!(&pool, b, b, 0, "compare(b, b) should equal 0"); - assert_compare!(&pool, b, a, 1, "compare(b, a) should equal 1"); - assert_compare!(&pool, b, c, -1, "compare(b, c) should equal -1"); - assert_compare!(&pool, c, c, 0, "compare(c, c) should equal 0"); - assert_compare!(&pool, c, b, 1, "compare(c, b) should equal 1"); - assert_compare!(&pool, c, a, 1, "compare(c, a) should equal 1"); - - Ok(()) -} - -#[sqlx::test] -async fn compare_ore_cllw_number_path(pool: PgPool) -> Result<()> { - // Test: compare() with ORE CLLW VAR 8 on $.number path - // {"number": {N}} - // $.number: 3dba004f4d7823446e7cb71f6681b344 - - let a = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(1), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let b = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(5), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - let c = "((eql_v2.jsonb_path_query(create_encrypted_ste_vec_json(10), '3dba004f4d7823446e7cb71f6681b344')).data)::eql_v2.ste_vec_entry"; - - // 9 assertions: reflexive, transitive, and antisymmetric comparison properties - assert_compare!(&pool, a, a, 0, "compare(a, a) should equal 0"); - assert_compare!(&pool, a, b, -1, "compare(a, b) should equal -1"); - assert_compare!(&pool, a, c, -1, "compare(a, c) should equal -1"); - assert_compare!(&pool, b, b, 0, "compare(b, b) should equal 0"); - assert_compare!(&pool, b, a, 1, "compare(b, a) should equal 1"); - assert_compare!(&pool, b, c, -1, "compare(b, c) should equal -1"); - assert_compare!(&pool, c, c, 0, "compare(c, c) should equal 0"); - assert_compare!(&pool, c, b, 1, "compare(c, b) should equal 1"); - assert_compare!(&pool, c, a, 1, "compare(c, a) should equal 1"); - - Ok(()) -} - -#[sqlx::test] -async fn compare_ore_block_u64_8_256(pool: PgPool) -> Result<()> { - // Test: compare() with ORE Block U64 8 256 - - let a = "create_encrypted_ore_json(1)"; - let b = "create_encrypted_ore_json(21)"; - let c = "create_encrypted_ore_json(42)"; - - // 9 assertions: reflexive, transitive, and antisymmetric comparison properties - assert_compare!(&pool, a, a, 0, "compare(a, a) should equal 0"); - assert_compare!(&pool, a, b, -1, "compare(a, b) should equal -1"); - assert_compare!(&pool, a, c, -1, "compare(a, c) should equal -1"); - assert_compare!(&pool, b, b, 0, "compare(b, b) should equal 0"); - assert_compare!(&pool, b, a, 1, "compare(b, a) should equal 1"); - assert_compare!(&pool, b, c, -1, "compare(b, c) should equal -1"); - assert_compare!(&pool, c, c, 0, "compare(c, c) should equal 0"); - assert_compare!(&pool, c, b, 1, "compare(c, b) should equal 1"); - assert_compare!(&pool, c, a, 1, "compare(c, a) should equal 1"); - - Ok(()) -} - -// compare_blake3_index removed: post-discipline, eql_v2.compare's -// equality branch is hmac-only at the root. Blake3 is no longer in the -// root compare priority list. compare_blake3 still exists and is -// exercised inside ste_vec_contains for selector-level element -// comparisons. - -// eql_v2.compare is strict ORE-only post-#219: equality (hm) and the -// literal-bytes fallback are removed from this function. The tests that -// previously asserted hm-fallback / literal-fallback semantics now assert -// the raise contract instead. - -#[sqlx::test] -async fn compare_raises_on_hmac_only_payloads(pool: PgPool) -> Result<()> { - // Strict eql_v2.compare contract: equality is hm-only via the inlined - // `=` operator, NOT through compare(). Calling compare() on hm-only - // payloads should raise with a directive error. - let sql = - "SELECT eql_v2.compare(create_encrypted_json(1, 'hm'), create_encrypted_json(2, 'hm'))"; - let err = sqlx::query(sql).fetch_one(&pool).await.expect_err( - "expected compare() to raise on hm-only payloads under the strict ORE contract", - ); - let msg = err.to_string(); - assert!( - msg.contains("requires Block ORE"), - "expected error to mention the strict Block ORE requirement; got: {msg}" - ); - Ok(()) -} - -#[sqlx::test] -async fn compare_raises_when_no_index_terms_present(pool: PgPool) -> Result<()> { - // Strict eql_v2.compare contract: no literal-bytes fallback. Payloads - // without `ob` (root) or `oc` (sv element) raise. - let sql = "SELECT eql_v2.compare('{\"a\": 1}'::jsonb::eql_v2_encrypted, '{\"b\": 2}'::jsonb::eql_v2_encrypted)"; - let err = sqlx::query(sql) - .fetch_one(&pool) - .await - .expect_err("expected compare() to raise on payloads carrying no ORE term"); - let msg = err.to_string(); - assert!( - msg.contains("requires Block ORE"), - "expected error to mention the strict Block ORE requirement; got: {msg}" - ); - Ok(()) -} - -#[sqlx::test] -async fn compare_raises_when_ore_term_is_json_null(pool: PgPool) -> Result<()> { - // Strict eql_v2.compare contract: an `ob: null` payload doesn't satisfy - // `has_ore_block_u64_8_256` (the has_* check rejects JSON null), so - // compare() raises rather than silently falling through to hm. - let sql = "SELECT eql_v2.compare(\ - ('{\"ob\": null}'::jsonb || create_encrypted_json(1, 'hm')::jsonb)::eql_v2_encrypted, \ - ('{\"ob\": null}'::jsonb || create_encrypted_json(2, 'hm')::jsonb)::eql_v2_encrypted)"; - let err = sqlx::query(sql) - .fetch_one(&pool) - .await - .expect_err("expected compare() to raise when ob is JSON null and only hm is present"); - let msg = err.to_string(); - assert!( - msg.contains("requires Block ORE"), - "expected error to mention the strict Block ORE requirement; got: {msg}" - ); - Ok(()) -} diff --git a/tests/sqlx/tests/order_by_no_opclass_tests.rs b/tests/sqlx/tests/order_by_no_opclass_tests.rs deleted file mode 100644 index a3c372c66..000000000 --- a/tests/sqlx/tests/order_by_no_opclass_tests.rs +++ /dev/null @@ -1,283 +0,0 @@ -//! ORDER BY tests without operator classes (Supabase mode) -//! -//! Simulates the Supabase environment where operator classes and ore_block_u64_8_256 -//! operators are excluded from the build. Verifies that ordering is NOT correct -//! without these components — both direct ORDER BY e and ORDER BY eql_v2.order_by(e) -//! produce wrong results because PostgreSQL falls back to record/bytea comparison -//! instead of ORE-aware comparison. -//! -//! Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - -use anyhow::Result; -use eql_tests::get_ore_encrypted; -use sqlx::{PgPool, Row}; - -// ============================================================================ -// Verify fixture correctly drops operator classes -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn fixture_drops_encrypted_operator_class(pool: PgPool) -> Result<()> { - // Verify the btree operator class for eql_v2_encrypted was dropped - let row = sqlx::query( - "SELECT count(*) as cnt FROM pg_opclass WHERE opcname = 'encrypted_operator_class'", - ) - .fetch_one(&pool) - .await?; - let count: i64 = row.try_get("cnt")?; - assert_eq!( - count, 0, - "encrypted_operator_class should not exist after fixture" - ); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn fixture_drops_ore_block_operator_class(pool: PgPool) -> Result<()> { - // Verify the btree operator class for ore_block_u64_8_256 was dropped - let row = sqlx::query( - "SELECT count(*) as cnt FROM pg_opclass WHERE opcname = 'ore_block_u64_8_256_operator_class'" - ) - .fetch_one(&pool) - .await?; - let count: i64 = row.try_get("cnt")?; - assert_eq!( - count, 0, - "ore_block_u64_8_256_operator_class should not exist after fixture" - ); - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn fixture_drops_ore_block_operators(pool: PgPool) -> Result<()> { - // Verify all ore_block_u64_8_256 comparison operators were dropped - let row = sqlx::query( - "SELECT count(*) as cnt FROM pg_operator - WHERE oprleft = 'eql_v2.ore_block_u64_8_256'::regtype - OR oprright = 'eql_v2.ore_block_u64_8_256'::regtype", - ) - .fetch_one(&pool) - .await?; - let count: i64 = row.try_get("cnt")?; - assert_eq!( - count, 0, - "No operators should exist for ore_block_u64_8_256 after fixture" - ); - Ok(()) -} - -// ============================================================================ -// ORDER BY eql_v2.order_by(e) produces wrong results without operator classes -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_helper_desc_wrong_order_without_opclass(pool: PgPool) -> Result<()> { - // Without ore_block_u64_8_256 operator class, ORDER BY eql_v2.order_by(e) DESC - // falls back to composite type record comparison (bytea lexicographic), - // which does NOT match ORE ordering semantics. - - let sql = "SELECT id FROM ore ORDER BY eql_v2.order_by(e) DESC LIMIT 1"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - - assert_ne!( - first_id, 1000, - "ORDER BY eql_v2.order_by(e) DESC should NOT return id=1000 without operator class \ - (bytea comparison does not match ORE ordering)" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_helper_asc_wrong_order_without_opclass(pool: PgPool) -> Result<()> { - // Without operator class, ASC ordering also produces wrong results. - - let sql = "SELECT id FROM ore ORDER BY eql_v2.order_by(e) ASC LIMIT 1"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - - assert_ne!( - first_id, 1, - "ORDER BY eql_v2.order_by(e) ASC should NOT return id=1 without operator class \ - (bytea comparison does not match ORE ordering)" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_helper_not_sequential_without_opclass(pool: PgPool) -> Result<()> { - // Verify the ordering is genuinely wrong — not just off by one, - // but fundamentally broken. - - let sql = "SELECT id FROM ore ORDER BY eql_v2.order_by(e) DESC LIMIT 5"; - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - let expected = vec![1000i64, 999, 998, 997, 996]; - - assert_ne!( - ids, expected, - "Top 5 DESC results should NOT be [1000,999,998,997,996] without operator class, got {:?}", - ids - ); - - Ok(()) -} - -// ============================================================================ -// Direct ORDER BY e also produces wrong results without operator class -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn direct_order_by_wrong_order_without_opclass(pool: PgPool) -> Result<()> { - // Direct ORDER BY e falls back to JSONB record comparison without the - // encrypted_operator_class. This does NOT use ORE-aware sorting. - - let sql = "SELECT id FROM ore ORDER BY e ASC LIMIT 1"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - - assert_ne!( - first_id, 1, - "Direct ORDER BY e ASC should NOT return id=1 without operator class \ - (JSONB comparison does not match ORE ordering)" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn direct_order_by_desc_wrong_order_without_opclass(pool: PgPool) -> Result<()> { - // Direct ORDER BY e DESC also produces wrong results. - - let sql = "SELECT id FROM ore ORDER BY e DESC LIMIT 1"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - - assert_ne!( - first_id, 1000, - "Direct ORDER BY e DESC should NOT return id=1000 without operator class" - ); - - Ok(()) -} - -// ============================================================================ -// Correlated subquery ranking as workaround (uses eql_v2.compare()) -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn correlated_subquery_ranking_asc_without_opclass(pool: PgPool) -> Result<()> { - // eql_v2.compare() is a standalone function (not an operator), so it survives - // the operator class drops. A correlated subquery counts how many rows have a - // smaller value than each row, producing a rank that orders correctly. - - let sql = "SELECT id FROM ore t \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0)"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - // Verify first 5 ids are in ascending order - let first_five: Vec = rows[..5].iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - first_five, - vec![1i64, 2, 3, 4, 5], - "First 5 results should be [1,2,3,4,5], got {:?}", - first_five - ); - - // Verify last row - let last_id: i64 = rows[999].try_get(0)?; - assert_eq!(last_id, 1000, "Last row should be id=1000"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn correlated_subquery_ranking_desc_without_opclass(pool: PgPool) -> Result<()> { - // Same correlated subquery with DESC — should return highest-ranked rows first. - - let sql = "SELECT id FROM ore t \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0) DESC"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let first_five: Vec = rows[..5].iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - first_five, - vec![1000i64, 999, 998, 997, 996], - "First 5 DESC results should be [1000,999,998,997,996], got {:?}", - first_five - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn correlated_subquery_ranking_with_limit_without_opclass(pool: PgPool) -> Result<()> { - // LIMIT 1 with ASC subquery ranking should return the smallest value (id=1) - - let sql = "SELECT id FROM ore t \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0) \ - LIMIT 1"; - - let row = sqlx::query(sql).fetch_one(&pool).await?; - let id: i64 = row.try_get(0)?; - assert_eq!( - id, 1, - "Correlated subquery ranking ASC LIMIT 1 should return id=1" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn correlated_subquery_ranking_with_where_without_opclass(pool: PgPool) -> Result<()> { - // WHERE clause filters rows, then correlated subquery orders the result correctly. - // Note: the subquery counts over the full table to produce a global rank. - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore t \ - WHERE e > '{}'::eql_v2_encrypted \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0)", - ore_term - ); - - let rows = sqlx::query(&sql).fetch_all(&pool).await?; - - // Should return 958 records (ids 43-1000) - assert_eq!(rows.len(), 958, "Should return 958 records (ids 43-1000)"); - - // First record should be id=43 (lowest rank among filtered rows) - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!( - first_id, 43, - "Correlated subquery ranking with WHERE e > 42 should return id=43 first" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/order_by_sort_tests.rs b/tests/sqlx/tests/order_by_sort_tests.rs deleted file mode 100644 index 02e61e69d..000000000 --- a/tests/sqlx/tests/order_by_sort_tests.rs +++ /dev/null @@ -1,841 +0,0 @@ -//! ORDER BY sort_compare tests without operator classes -//! -//! Tests for the eql_v2.sort_compare() and eql_v2.order_by_compare() functions which -//! provide O(n log n) comparison-based sorting as an alternative to the O(n^2) correlated -//! subquery workaround. Also tests filtered inner query optimization for correlated subqueries. -//! -//! Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - -use anyhow::Result; -use eql_tests::get_ore_encrypted; -use sqlx::{PgPool, Row}; -use std::time::Instant; - -// ============================================================================ -// sort_compare correctness tests -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_asc_returns_correct_order(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore), - (SELECT array_agg(e ORDER BY id) FROM ore), - 'ASC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let first_five: Vec = rows[..5].iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - first_five, - vec![1i64, 2, 3, 4, 5], - "First 5 ASC results should be [1,2,3,4,5], got {:?}", - first_five - ); - - let last_id: i64 = rows[999].try_get(0)?; - assert_eq!(last_id, 1000, "Last row should be id=1000"); - - // Verify complete sequential ordering - let all_ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - let expected: Vec = (1..=1000).collect(); - assert_eq!(all_ids, expected, "All ids should be sequential 1..1000"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_desc_returns_correct_order(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore), - (SELECT array_agg(e ORDER BY id) FROM ore), - 'DESC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let first_five: Vec = rows[..5].iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - first_five, - vec![1000i64, 999, 998, 997, 996], - "First 5 DESC results should be [1000,999,998,997,996], got {:?}", - first_five - ); - - let last_id: i64 = rows[999].try_get(0)?; - assert_eq!(last_id, 1, "Last row should be id=1"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block_u64_8_256 term comparison. Columns carrying only OPE (opf/opv) or ore_cllw terms raise from the ore_block extractor. Re-enable once the inlined operators support CASE-style dispatch across ORE / OPE encodings."] -async fn sort_compare_with_where_clause(pool: PgPool) -> Result<()> { - // Filter to e > 42 using subqueries in array_agg - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore WHERE e > '{ore}'::eql_v2_encrypted), - (SELECT array_agg(e ORDER BY id) FROM ore WHERE e > '{ore}'::eql_v2_encrypted), - 'ASC' - )", - ore = ore_term - ); - - let rows = sqlx::query(&sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 958, "Should return 958 records (ids 43-1000)"); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!(first_id, 43, "First row should be id=43"); - - let last_id: i64 = rows[957].try_get(0)?; - assert_eq!(last_id, 1000, "Last row should be id=1000"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_with_limit(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore), - (SELECT array_agg(e ORDER BY id) FROM ore) - ) LIMIT 5"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 5, "LIMIT 5 should return 5 rows"); - - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - ids, - vec![1i64, 2, 3, 4, 5], - "First 5 sorted rows should be [1,2,3,4,5], got {:?}", - ids - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_empty_input(pool: PgPool) -> Result<()> { - // Use a WHERE clause that matches no rows to produce empty arrays - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore WHERE id < 0), - (SELECT array_agg(e ORDER BY id) FROM ore WHERE id < 0) - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 0, "Empty input should return no rows"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_single_element(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore WHERE id = 42), - (SELECT array_agg(e ORDER BY id) FROM ore WHERE id = 42) - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1, "Single element should return 1 row"); - - let id: i64 = rows[0].try_get(0)?; - assert_eq!(id, 42, "Single element should be id=42"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("order_by_null_data")))] -async fn sort_compare_asc_puts_nulls_first(pool: PgPool) -> Result<()> { - let sql = "SELECT id FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM encrypted), - (SELECT array_agg(e ORDER BY id) FROM encrypted), - 'ASC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - - let mut null_ids = ids[..2].to_vec(); - null_ids.sort_unstable(); - - assert_eq!(rows.len(), 4, "Should return all 4 records"); - assert_eq!(null_ids, vec![1i64, 4], "NULL rows should sort first"); - assert_eq!( - ids[2], 3, - "Smallest non-NULL value should appear after NULLs" - ); - assert_eq!(ids[3], 2, "Largest non-NULL value should appear last"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("order_by_null_data")))] -async fn sort_compare_desc_puts_nulls_last(pool: PgPool) -> Result<()> { - let sql = "SELECT id FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM encrypted), - (SELECT array_agg(e ORDER BY id) FROM encrypted), - 'DESC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - - let mut null_ids = ids[2..].to_vec(); - null_ids.sort_unstable(); - - assert_eq!(rows.len(), 4, "Should return all 4 records"); - assert_eq!(ids[0], 2, "Largest non-NULL value should sort first"); - assert_eq!(ids[1], 3, "Smaller non-NULL value should sort second"); - assert_eq!(null_ids, vec![1i64, 4], "NULL rows should sort last"); - - Ok(()) -} - -#[sqlx::test] -async fn sort_compare_mismatched_lengths_errors(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - ARRAY[1::bigint, 2::bigint], - ARRAY[(SELECT e FROM ore WHERE id = 1)]::eql_v2_encrypted[], - 'ASC' - )"; - - let result = sqlx::query(sql).fetch_all(&pool).await; - assert!(result.is_err(), "Mismatched array lengths should error"); - - Ok(()) -} - -#[sqlx::test] -#[ignore = "Strict eql_v2.compare contract (#219): the generic fallback path (strategy='compare') relies on eql_v2.compare returning a total order for rows without `ob`/`oc`. Under the strict contract, such rows raise. sort_compare on hm-only data now surfaces the misconfiguration loudly rather than producing meaningless ordering. Re-enable once the test fixture is rewritten to use ORE-bearing payloads, or repurposed to assert the raise."] -async fn sort_compare_generic_fallback_matches_compare_order(pool: PgPool) -> Result<()> { - sqlx::query( - "CREATE TABLE encrypted_generic( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - e eql_v2_encrypted - )", - ) - .execute(&pool) - .await?; - - for id in 1..=3 { - let sql = format!( - "INSERT INTO encrypted_generic(e) - SELECT (create_encrypted_json({id})::jsonb - 'ob')::eql_v2_encrypted" - ); - sqlx::query(&sql).execute(&pool).await?; - } - - let actual_sql = "SELECT id FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM encrypted_generic), - (SELECT array_agg(e ORDER BY id) FROM encrypted_generic), - 'ASC' - )"; - let expected_sql = "SELECT id FROM encrypted_generic t - ORDER BY (SELECT COUNT(*) FROM encrypted_generic t2 WHERE eql_v2.compare(t.e, t2.e) > 0), id"; - - let actual_rows = sqlx::query(actual_sql).fetch_all(&pool).await?; - let expected_rows = sqlx::query(expected_sql).fetch_all(&pool).await?; - - let actual_ids: Vec = actual_rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - let expected_ids: Vec = expected_rows - .iter() - .map(|r| r.try_get(0).unwrap()) - .collect(); - - assert_eq!( - actual_ids, expected_ids, - "Generic fallback should match eql_v2.compare ordering" - ); - - Ok(()) -} - -// ============================================================================ -// order_by_compare (dynamic SQL convenience wrapper) tests -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_compare_asc_full_table(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.order_by_compare('SELECT id, e FROM ore')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let first_five: Vec = rows[..5].iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - first_five, - vec![1i64, 2, 3, 4, 5], - "First 5 ASC results should be [1,2,3,4,5], got {:?}", - first_five - ); - - let last_id: i64 = rows[999].try_get(0)?; - assert_eq!(last_id, 1000, "Last row should be id=1000"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_compare_desc_with_where(pool: PgPool) -> Result<()> { - let sql = - "SELECT * FROM eql_v2.order_by_compare('SELECT id, e FROM ore WHERE id > 42', 'DESC')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 958, "Should return 958 records (ids 43-1000)"); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!(first_id, 1000, "First DESC row should be id=1000"); - - let last_id: i64 = rows[957].try_get(0)?; - assert_eq!(last_id, 43, "Last DESC row should be id=43"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_compare_reuses_precomputed_order_keys(pool: PgPool) -> Result<()> { - let mut tx = pool.begin().await?; - let sql = "SELECT * FROM eql_v2.order_by_compare('SELECT id, e FROM ore')"; - let rows = sqlx::query(sql).fetch_all(&mut *tx).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let order_by_calls: i64 = sqlx::query_scalar( - "SELECT coalesce(sum(calls), 0)::bigint - FROM pg_stat_xact_user_functions - WHERE schemaname = 'eql_v2' AND funcname = 'order_by'", - ) - .fetch_one(&mut *tx) - .await?; - - assert_eq!( - order_by_calls, 1000, - "order_by_compare should extract ORE keys once per row" - ); - - tx.rollback().await?; - - Ok(()) -} - -// ============================================================================ -// sort_compare table-reference overload tests -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_asc(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore', 'ASC')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let all_ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - let expected: Vec = (1..=1000).collect(); - assert_eq!(all_ids, expected, "All ids should be sequential 1..1000"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_desc(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore', 'DESC')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let first_five: Vec = rows[..5].iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - first_five, - vec![1000i64, 999, 998, 997, 996], - "First 5 DESC results should be [1000,999,998,997,996]" - ); - - let last_id: i64 = rows[999].try_get(0)?; - assert_eq!(last_id, 1, "Last row should be id=1"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_default_direction(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let first_five: Vec = rows[..5].iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - first_five, - vec![1i64, 2, 3, 4, 5], - "Default direction should be ASC" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_with_limit(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore', 'ASC') LIMIT 5"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 5, "LIMIT 5 should return 5 rows"); - - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - ids, - vec![1i64, 2, 3, 4, 5], - "First 5 sorted rows should be [1,2,3,4,5]" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_with_filter(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore', 'ASC', 'id > 42')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 958, "Should return 958 records (ids 43-1000)"); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!(first_id, 43, "First row should be id=43"); - - let last_id: i64 = rows[957].try_get(0)?; - assert_eq!(last_id, 1000, "Last row should be id=1000"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_schema_qualified(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'public.ore', 'ASC')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - let all_ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - let expected: Vec = (1..=1000).collect(); - assert_eq!( - all_ids, expected, - "Schema-qualified table name should preserve sorted ordering" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_schema_qualified_with_filter(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'public.ore', 'ASC', 'id > 42')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 958, "Should return 958 records (ids 43-1000)"); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!(first_id, 43, "First row should be id=43"); - - let last_id: i64 = rows[957].try_get(0)?; - assert_eq!(last_id, 1000, "Last row should be id=1000"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_empty_result(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore', 'ASC', 'id < 0')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!( - rows.len(), - 0, - "Filter matching no rows should return 0 rows" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("order_by_null_data")))] -async fn sort_compare_table_ref_null_values(pool: PgPool) -> Result<()> { - let sql = "SELECT id FROM eql_v2.sort_compare('id', 'e', 'encrypted', 'ASC')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - - let mut null_ids = ids[..2].to_vec(); - null_ids.sort_unstable(); - - assert_eq!(rows.len(), 4, "Should return all 4 records"); - assert_eq!(null_ids, vec![1i64, 4], "NULL rows should sort first"); - assert_eq!( - ids[2], 3, - "Smallest non-NULL value should appear after NULLs" - ); - assert_eq!(ids[3], 2, "Largest non-NULL value should appear last"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_table_ref_matches_order_by_compare(pool: PgPool) -> Result<()> { - let table_ref_sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore')"; - let order_by_sql = "SELECT * FROM eql_v2.order_by_compare('SELECT id, e FROM ore')"; - - let table_ref_rows = sqlx::query(table_ref_sql).fetch_all(&pool).await?; - let order_by_rows = sqlx::query(order_by_sql).fetch_all(&pool).await?; - - let table_ref_ids: Vec = table_ref_rows - .iter() - .map(|r| r.try_get(0).unwrap()) - .collect(); - let order_by_ids: Vec = order_by_rows - .iter() - .map(|r| r.try_get(0).unwrap()) - .collect(); - - assert_eq!( - table_ref_ids, order_by_ids, - "Table-reference overload should match order_by_compare results" - ); - - Ok(()) -} - -// ============================================================================ -// Filtered inner query correctness tests (Option 2) -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn filtered_inner_query_correct_order(pool: PgPool) -> Result<()> { - // Optimized: inner query also filters, producing correct relative ordering - // within the filtered set - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore t \ - WHERE e > '{ore}'::eql_v2_encrypted \ - ORDER BY (SELECT COUNT(*) FROM ore t2 \ - WHERE e > '{ore}'::eql_v2_encrypted \ - AND eql_v2.compare(t.e, t2.e) > 0)", - ore = ore_term - ); - - let rows = sqlx::query(&sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 958, "Should return 958 records (ids 43-1000)"); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!( - first_id, 43, - "Filtered inner query should return id=43 first" - ); - - let last_id: i64 = rows[957].try_get(0)?; - assert_eq!( - last_id, 1000, - "Filtered inner query should return id=1000 last" - ); - - // Verify complete ordering - let all_ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - let expected: Vec = (43..=1000).collect(); - assert_eq!( - all_ids, expected, - "All ids should be sequential 43..1000 with filtered inner query" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn filtered_inner_query_with_range(pool: PgPool) -> Result<()> { - // Range filter: rows with ids 20-80 - let ore_term_19 = get_ore_encrypted(&pool, 19).await?; - let ore_term_80 = get_ore_encrypted(&pool, 80).await?; - - let sql = format!( - "SELECT id FROM ore t \ - WHERE e > '{lo}'::eql_v2_encrypted AND e < '{hi}'::eql_v2_encrypted \ - ORDER BY (SELECT COUNT(*) FROM ore t2 \ - WHERE e > '{lo}'::eql_v2_encrypted AND e < '{hi}'::eql_v2_encrypted \ - AND eql_v2.compare(t.e, t2.e) > 0)", - lo = ore_term_19, - hi = ore_term_80 - ); - - let rows = sqlx::query(&sql).fetch_all(&pool).await?; - - // ids 20-79 = 60 rows (exclusive on both 19 and 80 based on > and <) - assert_eq!( - rows.len(), - 60, - "Range filter should return 60 records (ids 20-79)" - ); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!(first_id, 20, "First row should be id=20"); - - let last_id: i64 = rows[59].try_get(0)?; - assert_eq!(last_id, 79, "Last row should be id=79"); - - Ok(()) -} - -// ============================================================================ -// Observational performance tests -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn sort_compare_faster_than_correlated_subquery(pool: PgPool) -> Result<()> { - // Warm up: run each query once to populate caches - let sort_sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore), - (SELECT array_agg(e ORDER BY id) FROM ore) - )"; - let correlated_sql = "SELECT id FROM ore t \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0)"; - - sqlx::query(sort_sql).fetch_all(&pool).await?; - sqlx::query(correlated_sql).fetch_all(&pool).await?; - - // Measure sort_compare - let start = Instant::now(); - let sort_rows = sqlx::query(sort_sql).fetch_all(&pool).await?; - let sort_elapsed = start.elapsed(); - - // Measure correlated subquery - let start = Instant::now(); - let correlated_rows = sqlx::query(correlated_sql).fetch_all(&pool).await?; - let correlated_elapsed = start.elapsed(); - - // Both should return correct results - assert_eq!(sort_rows.len(), 1000); - assert_eq!(correlated_rows.len(), 1000); - - let sort_first: i64 = sort_rows[0].try_get(0)?; - let correlated_first: i64 = correlated_rows[0].try_get(0)?; - assert_eq!(sort_first, 1); - assert_eq!(correlated_first, 1); - - eprintln!( - "Performance: sort_compare={:?}, correlated_subquery={:?}, speedup={:.1}x", - sort_elapsed, - correlated_elapsed, - correlated_elapsed.as_secs_f64() / sort_elapsed.as_secs_f64() - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn filtered_inner_query_faster_than_unfiltered(pool: PgPool) -> Result<()> { - let ore_term = get_ore_encrypted(&pool, 42).await?; - - // Unfiltered inner query: compares against all 1000 rows - let unfiltered_sql = format!( - "SELECT id FROM ore t \ - WHERE e > '{ore}'::eql_v2_encrypted \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0)", - ore = ore_term - ); - - // Filtered inner query: compares against only 958 filtered rows - let filtered_sql = format!( - "SELECT id FROM ore t \ - WHERE e > '{ore}'::eql_v2_encrypted \ - ORDER BY (SELECT COUNT(*) FROM ore t2 \ - WHERE e > '{ore}'::eql_v2_encrypted \ - AND eql_v2.compare(t.e, t2.e) > 0)", - ore = ore_term - ); - - // Warm up - sqlx::query(&unfiltered_sql).fetch_all(&pool).await?; - sqlx::query(&filtered_sql).fetch_all(&pool).await?; - - // Measure unfiltered - let start = Instant::now(); - let unfiltered_rows = sqlx::query(&unfiltered_sql).fetch_all(&pool).await?; - let unfiltered_elapsed = start.elapsed(); - - // Measure filtered - let start = Instant::now(); - let filtered_rows = sqlx::query(&filtered_sql).fetch_all(&pool).await?; - let filtered_elapsed = start.elapsed(); - - // Both should return 958 rows with correct ordering - assert_eq!(unfiltered_rows.len(), 958); - assert_eq!(filtered_rows.len(), 958); - - let unfiltered_first: i64 = unfiltered_rows[0].try_get(0)?; - let filtered_first: i64 = filtered_rows[0].try_get(0)?; - assert_eq!(unfiltered_first, 43); - assert_eq!(filtered_first, 43); - - eprintln!( - "Performance: filtered={:?}, unfiltered={:?}, speedup={:.1}x", - filtered_elapsed, - unfiltered_elapsed, - unfiltered_elapsed.as_secs_f64() / filtered_elapsed.as_secs_f64() - ); - - Ok(()) -} - -// ============================================================================ -// Scaled performance tests (expanded dataset via generate_series) -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn sort_compare_performance_at_scale(pool: PgPool) -> Result<()> { - // 1000 rows is sufficient scale to demonstrate O(n log n) vs O(n²) - let sort_sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore), - (SELECT array_agg(e ORDER BY id) FROM ore) - )"; - let correlated_sql = "SELECT id FROM ore t \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0)"; - - // Warm up - sqlx::query(sort_sql).fetch_all(&pool).await?; - sqlx::query(correlated_sql).fetch_all(&pool).await?; - - let start = Instant::now(); - let sort_rows = sqlx::query(sort_sql).fetch_all(&pool).await?; - let sort_elapsed = start.elapsed(); - - let start = Instant::now(); - let correlated_rows = sqlx::query(correlated_sql).fetch_all(&pool).await?; - let correlated_elapsed = start.elapsed(); - - assert_eq!(sort_rows.len(), 1000); - assert_eq!(correlated_rows.len(), 1000); - - eprintln!( - "Performance @1000 rows: sort_compare={:?}, correlated={:?}, speedup={:.1}x", - sort_elapsed, - correlated_elapsed, - correlated_elapsed.as_secs_f64() / sort_elapsed.as_secs_f64() - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn filtered_inner_query_performance_at_scale(pool: PgPool) -> Result<()> { - let ore_term = get_ore_encrypted(&pool, 42).await?; - - // Unfiltered inner query: outer filters to 958 rows, inner scans all 1000 - let unfiltered_sql = format!( - "SELECT id FROM ore t \ - WHERE e > '{ore}'::eql_v2_encrypted \ - ORDER BY (SELECT COUNT(*) FROM ore t2 WHERE eql_v2.compare(t.e, t2.e) > 0)", - ore = ore_term - ); - - // Filtered inner query: both outer and inner filter to 958 rows - let filtered_sql = format!( - "SELECT id FROM ore t \ - WHERE e > '{ore}'::eql_v2_encrypted \ - ORDER BY (SELECT COUNT(*) FROM ore t2 \ - WHERE e > '{ore}'::eql_v2_encrypted \ - AND eql_v2.compare(t.e, t2.e) > 0)", - ore = ore_term - ); - - // Warm up - sqlx::query(&unfiltered_sql).fetch_all(&pool).await?; - sqlx::query(&filtered_sql).fetch_all(&pool).await?; - - // Measure unfiltered - let start = Instant::now(); - let unfiltered_rows = sqlx::query(&unfiltered_sql).fetch_all(&pool).await?; - let unfiltered_elapsed = start.elapsed(); - - // Measure filtered - let start = Instant::now(); - let filtered_rows = sqlx::query(&filtered_sql).fetch_all(&pool).await?; - let filtered_elapsed = start.elapsed(); - - assert_eq!(unfiltered_rows.len(), 958); - assert_eq!(filtered_rows.len(), 958); - - eprintln!( - "Performance @1000 rows (filtered to 958): filtered={:?}, unfiltered={:?}, speedup={:.1}x", - filtered_elapsed, - unfiltered_elapsed, - unfiltered_elapsed.as_secs_f64() / filtered_elapsed.as_secs_f64() - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[cfg_attr( - not(feature = "bench"), - ignore = "perf-bench: gated, run via mise test:bench" -)] -async fn sort_compare_text_performance(pool: PgPool) -> Result<()> { - let sort_sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore_text), - (SELECT array_agg(e ORDER BY id) FROM ore_text) - )"; - - // Warm up - sqlx::query(sort_sql).fetch_all(&pool).await?; - - let start = Instant::now(); - let sort_rows = sqlx::query(sort_sql).fetch_all(&pool).await?; - let sort_elapsed = start.elapsed(); - - assert_eq!(sort_rows.len(), 100); - - eprintln!( - "Performance text @100 rows: sort_compare={:?}", - sort_elapsed - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/order_by_tests.rs b/tests/sqlx/tests/order_by_tests.rs deleted file mode 100644 index 340435ad9..000000000 --- a/tests/sqlx/tests/order_by_tests.rs +++ /dev/null @@ -1,301 +0,0 @@ -//! ORDER BY tests for ORE-encrypted columns -//! -//! Tests ORDER BY with ORE (Order-Revealing Encryption) -//! Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - -use anyhow::Result; -use eql_tests::{get_ore_encrypted, QueryAssertion}; -use sqlx::{PgPool, Row}; - -#[sqlx::test] -async fn order_by_desc_returns_highest_value_first(pool: PgPool) -> Result<()> { - // Test: ORDER BY e DESC returns records in descending order - // Combined with WHERE e < 42 to verify ordering - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted ORDER BY e DESC", - ore_term - ); - - // Should return 41 records, highest first - QueryAssertion::new(&pool, &sql).count(41).await; - - // First record should be id=41 - let row = sqlx::query(&sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - assert_eq!(first_id, 41, "ORDER BY DESC should return id=41 first"); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_desc_with_limit(pool: PgPool) -> Result<()> { - // Test: ORDER BY e DESC LIMIT 1 returns highest value - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted ORDER BY e DESC LIMIT 1", - ore_term - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await?; - let id: i64 = row.try_get(0)?; - assert_eq!(id, 41, "Should return id=41 (highest value < 42)"); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_asc_with_limit(pool: PgPool) -> Result<()> { - // Test: ORDER BY e ASC LIMIT 1 returns lowest value - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted ORDER BY e ASC LIMIT 1", - ore_term - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await?; - let id: i64 = row.try_get(0)?; - assert_eq!(id, 1, "Should return id=1 (lowest value < 42)"); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_asc_with_greater_than(pool: PgPool) -> Result<()> { - // Test: ORDER BY e ASC with WHERE e > 42 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e > '{}'::eql_v2_encrypted ORDER BY e ASC", - ore_term - ); - - // Should return 958 records (43-1000) - QueryAssertion::new(&pool, &sql).count(958).await; - - Ok(()) -} - -#[sqlx::test] -async fn order_by_desc_with_greater_than_returns_highest(pool: PgPool) -> Result<()> { - // Test: ORDER BY e DESC LIMIT 1 with e > 42 returns 1000 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e > '{}'::eql_v2_encrypted ORDER BY e DESC LIMIT 1", - ore_term - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await?; - let id: i64 = row.try_get(0)?; - assert_eq!(id, 1000, "Should return id=1000 (highest value > 42)"); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_asc_with_greater_than_returns_lowest(pool: PgPool) -> Result<()> { - // Test: ORDER BY e ASC LIMIT 1 with e > 42 returns 43 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e > '{}'::eql_v2_encrypted ORDER BY e ASC LIMIT 1", - ore_term - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await?; - let id: i64 = row.try_get(0)?; - assert_eq!(id, 43, "Should return id=43 (lowest value > 42)"); - - Ok(()) -} - -// NULL ordering tests - -#[sqlx::test(fixtures(path = "../fixtures", scripts("order_by_null_data")))] -async fn order_by_asc_nulls_first_returns_null_record_first(pool: PgPool) -> Result<()> { - // Test: ORDER BY e ASC NULLS FIRST returns NULL values first - // Fixture data: id=1 NULL, id=2 ore(42), id=3 ore(3), id=4 NULL - - let sql = "SELECT id FROM encrypted ORDER BY e ASC NULLS FIRST, id"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - assert_eq!( - first_id, 1, - "ORDER BY e ASC NULLS FIRST, id should return NULL value with lowest id (id=1) first" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("order_by_null_data")))] -async fn order_by_asc_nulls_last_returns_smallest_value_first(pool: PgPool) -> Result<()> { - // Test: ORDER BY e ASC NULLS LAST returns smallest non-NULL value first - // Fixture data: id=1 NULL, id=2 ore(42), id=3 ore(3), id=4 NULL - - let sql = "SELECT id FROM encrypted ORDER BY e ASC NULLS LAST"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - assert_eq!( - first_id, 3, - "ORDER BY e ASC NULLS LAST should return smallest non-NULL value (id=3) first" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("order_by_null_data")))] -async fn order_by_desc_nulls_first_returns_null_value_first(pool: PgPool) -> Result<()> { - // Test: ORDER BY e DESC NULLS FIRST returns NULL values first - // Fixture data: id=1 NULL, id=2 ore(42), id=3 ore(3), id=4 NULL - - let sql = "SELECT id FROM encrypted ORDER BY e DESC NULLS FIRST, id"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - assert_eq!( - first_id, 1, - "ORDER BY e DESC NULLS FIRST, id should return NULL value with lowest id (id=1) first" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("order_by_null_data")))] -async fn order_by_desc_nulls_last_returns_largest_value_first(pool: PgPool) -> Result<()> { - // Test: ORDER BY e DESC NULLS LAST returns largest non-NULL value first - // Fixture data: id=1 NULL, id=2 ore(42), id=3 ore(3), id=4 NULL - - let sql = "SELECT id FROM encrypted ORDER BY e DESC NULLS LAST"; - let row = sqlx::query(sql).fetch_one(&pool).await?; - let first_id: i64 = row.try_get(0)?; - assert_eq!( - first_id, 2, - "ORDER BY e DESC NULLS LAST should return largest non-NULL value (id=2) first" - ); - - Ok(()) -} - -// eql_v2.order_by() helper function tests - -#[sqlx::test] -async fn order_by_helper_function_desc_returns_correct_count(pool: PgPool) -> Result<()> { - // Test: ORDER BY eql_v2.order_by(e) DESC with WHERE e < 42 - // Expected: Returns 41 records - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted ORDER BY eql_v2.order_by(e) DESC", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(41).await; - - Ok(()) -} - -#[sqlx::test] -async fn order_by_helper_function_desc_returns_highest_value_first(pool: PgPool) -> Result<()> { - // Test: ORDER BY eql_v2.order_by(e) DESC LIMIT 1 returns id=41 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted ORDER BY eql_v2.order_by(e) DESC LIMIT 1", - ore_term - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await?; - let id: i64 = row.try_get(0)?; - assert_eq!( - id, 41, - "ORDER BY eql_v2.order_by(e) DESC should return id=41 (highest value < 42) first" - ); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_helper_function_asc_returns_lowest_value_first(pool: PgPool) -> Result<()> { - // Test: ORDER BY eql_v2.order_by(e) ASC LIMIT 1 returns id=1 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted ORDER BY eql_v2.order_by(e) ASC LIMIT 1", - ore_term - ); - - let row = sqlx::query(&sql).fetch_one(&pool).await?; - let id: i64 = row.try_get(0)?; - assert_eq!( - id, 1, - "ORDER BY eql_v2.order_by(e) ASC should return id=1 (lowest value < 42) first" - ); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_helper_function_without_where_clause(pool: PgPool) -> Result<()> { - // Test: ORDER BY eql_v2.order_by(e) DESC without any WHERE clause - // Verifies ORE ordering works without relying on comparison operators - // Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - - let sql = "SELECT id FROM ore ORDER BY eql_v2.order_by(e) DESC"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - // Should return all 1000 records - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - // Verify descending order: every record should have id = 1000 - index - for (i, row) in rows.iter().enumerate() { - let id: i64 = row.try_get(0)?; - let expected = (1000 - i) as i64; - assert_eq!( - id, expected, - "Row {} should be id={}, got id={}", - i, expected, id - ); - } - - Ok(()) -} - -#[sqlx::test] -async fn order_by_helper_function_without_where_clause_asc(pool: PgPool) -> Result<()> { - // Test: ORDER BY eql_v2.order_by(e) ASC without any WHERE clause - // Verifies ORE ordering works in ascending direction - // Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - - let sql = "SELECT id FROM ore ORDER BY eql_v2.order_by(e) ASC"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - // Should return all 1000 records - assert_eq!(rows.len(), 1000, "Should return all 1000 records"); - - // Verify ascending order: every record should have id = index + 1 - for (i, row) in rows.iter().enumerate() { - let id: i64 = row.try_get(0)?; - let expected = (i + 1) as i64; - assert_eq!( - id, expected, - "Row {} should be id={}, got id={}", - i, expected, id - ); - } - - Ok(()) -} diff --git a/tests/sqlx/tests/order_by_using_operator_tests.rs b/tests/sqlx/tests/order_by_using_operator_tests.rs deleted file mode 100644 index 3c7b713c2..000000000 --- a/tests/sqlx/tests/order_by_using_operator_tests.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! ORDER BY ... USING operator tests for ORE-encrypted columns -//! -//! Tests that `ORDER BY col USING ` syntax fails without btree operator families. -//! PostgreSQL requires USING operators to be registered as strategy 1 (<) or strategy 5 (>) -//! members of a btree operator family. Dropping the operator family removes those pg_amop -//! entries, making the operators invalid for ordering even though they still exist. -//! -//! Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - -use anyhow::Result; -use eql_tests::get_ore_encrypted; -use sqlx::PgPool; - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_using_less_than_fails_without_opclass(pool: PgPool) -> Result<()> { - // ORDER BY e USING < requires < to be registered in a btree operator family - - let result = sqlx::query("SELECT id FROM ore ORDER BY e USING <") - .fetch_all(&pool) - .await; - - assert!( - result.is_err(), - "ORDER BY e USING < should fail without btree operator family" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_using_greater_than_fails_without_opclass(pool: PgPool) -> Result<()> { - // ORDER BY e USING > requires > to be registered in a btree operator family - - let result = sqlx::query("SELECT id FROM ore ORDER BY e USING >") - .fetch_all(&pool) - .await; - - assert!( - result.is_err(), - "ORDER BY e USING > should fail without btree operator family" - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn order_by_using_less_than_with_where_clause_fails_without_opclass( - pool: PgPool, -) -> Result<()> { - // WHERE + ORDER BY e USING < also fails without btree operator family - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e > '{}'::eql_v2_encrypted ORDER BY e USING <", - ore_term - ); - - let result = sqlx::query(&sql).fetch_all(&pool).await; - - assert!( - result.is_err(), - "ORDER BY e USING < with WHERE clause should fail without btree operator family" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/ore_cllw_opclass_tests.rs b/tests/sqlx/tests/ore_cllw_opclass_tests.rs deleted file mode 100644 index 56d6f46f8..000000000 --- a/tests/sqlx/tests/ore_cllw_opclass_tests.rs +++ /dev/null @@ -1,609 +0,0 @@ -//! Operator class tests for `eql_v2.ore_cllw` -//! -//! Validates that: -//! - the same-type comparison operators (`=`, `<>`, `<`, `<=`, `>`, `>=`) on -//! `eql_v2.ore_cllw` reduce to `compare_ore_cllw_term(a, b) 0` and -//! return the correct semantics under the CLLW per-byte protocol; -//! - the leading domain-tag byte (`0x00` numeric, `0x01` string) produces -//! the right cross-domain ordering (numeric < string); -//! - the btree operator class `eql_v2.ore_cllw_ops` is registered as -//! `DEFAULT FOR TYPE`, so functional btree indexes on `eql_v2.ore_cllw(col)` -//! pick it up without an explicit opclass annotation; -//! - the planner engages the functional index for `ORDER BY ... LIMIT n` -//! (Index Scan, not Sort). -//! -//! The test data is hand-crafted byte strings (constructed via -//! `ROW(decode(...))::eql_v2.ore_cllw`) rather than real CLLW ciphertexts. -//! This is sufficient for opclass-wiring assertions; correctness of the CLLW -//! per-byte protocol itself is covered by the ore_cllw / ore_cllw_term tests. - -use anyhow::Result; -use sqlx::{PgPool, Row}; - -// Helper: construct an `eql_v2.ore_cllw` literal from a hex string. -// Format: `[tag_byte][cllw_ciphertext_bytes]` — see U-006 for the wire format. -fn ore_cllw(hex: &str) -> String { - format!("ROW(decode('{hex}', 'hex'))::eql_v2.ore_cllw") -} - -// =========================================================================== -// Operator wiring -// =========================================================================== - -#[sqlx::test] -async fn eq_same_bytes(pool: PgPool) -> Result<()> { - // Identical byte strings compare equal. - let a = ore_cllw("00aabbcc"); - let result: bool = sqlx::query_scalar(&format!("SELECT {a} = {a}")) - .fetch_one(&pool) - .await?; - assert!(result, "= should be true for identical ore_cllw values"); - Ok(()) -} - -#[sqlx::test] -async fn neq_different_bytes(pool: PgPool) -> Result<()> { - let a = ore_cllw("00aabbcc"); - let b = ore_cllw("00aabbcd"); - let result: bool = sqlx::query_scalar(&format!("SELECT {a} <> {b}")) - .fetch_one(&pool) - .await?; - assert!(result, "<> should be true for different ore_cllw values"); - Ok(()) -} - -#[sqlx::test] -async fn lt_within_domain(pool: PgPool) -> Result<()> { - // Both numeric domain (tag 0x00). Differ at byte 1: a=0x01, b=0x02. - // CLLW: at diff position, y+1 == x means x>y. Here y=0x02 (b), x=0x01 (a). - // y+1 = 0x03 != x → x < y → a < b. - let a = ore_cllw("0001"); - let b = ore_cllw("0002"); - let result: bool = sqlx::query_scalar(&format!("SELECT {a} < {b}")) - .fetch_one(&pool) - .await?; - assert!(result, "< should be true under the CLLW per-byte protocol"); - Ok(()) -} - -#[sqlx::test] -async fn gt_within_domain(pool: PgPool) -> Result<()> { - // Reverse of lt_within_domain: differ at byte 1, a=0x02, b=0x01. - // y+1 = 0x02 = x → x > y → a > b. - let a = ore_cllw("0002"); - let b = ore_cllw("0001"); - let result: bool = sqlx::query_scalar(&format!("SELECT {a} > {b}")) - .fetch_one(&pool) - .await?; - assert!(result, "> should be true under the CLLW per-byte protocol"); - Ok(()) -} - -#[sqlx::test] -async fn lte_includes_equal(pool: PgPool) -> Result<()> { - let a = ore_cllw("0001"); - let b = ore_cllw("0002"); - for sql in [format!("SELECT {a} <= {b}"), format!("SELECT {a} <= {a}")] { - let r: bool = sqlx::query_scalar(&sql).fetch_one(&pool).await?; - assert!(r, "<= true for both less-than and equal: {sql}"); - } - Ok(()) -} - -#[sqlx::test] -async fn gte_includes_equal(pool: PgPool) -> Result<()> { - let a = ore_cllw("0002"); - let b = ore_cllw("0001"); - for sql in [format!("SELECT {a} >= {b}"), format!("SELECT {a} >= {a}")] { - let r: bool = sqlx::query_scalar(&sql).fetch_one(&pool).await?; - assert!(r, ">= true for both greater-than and equal: {sql}"); - } - Ok(()) -} - -// =========================================================================== -// Cross-domain ordering via the leading tag byte -// =========================================================================== - -#[sqlx::test] -async fn numeric_sorts_before_string_via_tag_byte(pool: PgPool) -> Result<()> { - // Numeric tag = 0x00, string tag = 0x01. They differ at byte 0. - // y(string)=0x01, x(numeric)=0x00. y+1=0x02 != x → numeric < string. - let numeric = ore_cllw("00ffffff"); - let string = ore_cllw("01000000"); - let result: bool = sqlx::query_scalar(&format!("SELECT {numeric} < {string}")) - .fetch_one(&pool) - .await?; - assert!( - result, - "numeric (tag 0x00) should sort before string (tag 0x01)" - ); - - let reverse: bool = sqlx::query_scalar(&format!("SELECT {string} > {numeric}")) - .fetch_one(&pool) - .await?; - assert!( - reverse, - "string (tag 0x01) should sort after numeric (tag 0x00)" - ); - Ok(()) -} - -// =========================================================================== -// Opclass registration: DEFAULT FOR TYPE -// =========================================================================== - -#[sqlx::test] -async fn opclass_is_default_for_type(pool: PgPool) -> Result<()> { - // Confirms `eql_v2.ore_cllw_ops` is the default btree opclass for - // `eql_v2.ore_cllw`. Without this, functional btree indexes on the - // type would need an explicit `USING btree (... eql_v2.ore_cllw_ops)` - // annotation, defeating the U-001 "bare-form recipe" goal. - let is_default: bool = sqlx::query_scalar( - "SELECT opcdefault - FROM pg_opclass oc - JOIN pg_namespace n ON n.oid = oc.opcnamespace - WHERE n.nspname = 'eql_v2' - AND oc.opcname = 'ore_cllw_ops'", - ) - .fetch_one(&pool) - .await?; - assert!( - is_default, - "eql_v2.ore_cllw_ops should be DEFAULT FOR TYPE eql_v2.ore_cllw" - ); - Ok(()) -} - -// =========================================================================== -// Functional-index match: ORDER BY engages Index Scan, not Sort -// =========================================================================== - -#[sqlx::test] -async fn functional_index_engages_for_order_by(pool: PgPool) -> Result<()> { - // Build a small fixture table with synthetic ore_cllw values, create a - // functional btree on `eql_v2.ore_cllw((value).data)`, and confirm EXPLAIN - // engages the index for `ORDER BY ... LIMIT n`. - let mut tx = pool.begin().await?; - - sqlx::query( - "CREATE TABLE ore_cllw_test (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - value eql_v2_encrypted NOT NULL)", - ) - .execute(&mut *tx) - .await?; - - // Seed 20 rows with synthetic data. Each row's value is an - // `eql_v2_encrypted` whose payload wraps an `oc` field of varying bytes - // (numeric domain tag, then a counter). The exact ordering under the - // CLLW protocol isn't important here — we just need rows that compare - // distinctly. - for i in 0..20u8 { - let hex = format!("00{:02x}", i); - let sql = format!( - "INSERT INTO ore_cllw_test(value) \ - VALUES (jsonb_build_object('v', 2, 'k', 'ct', 'c', 'placeholder', \ - 'i', jsonb_build_object('t', 'ore_cllw_test', 'c', 'value'), \ - 'oc', '{hex}')::eql_v2_encrypted)" - ); - sqlx::query(&sql).execute(&mut *tx).await?; - } - - // Functional btree on the extractor — no opclass annotation needed - // because `eql_v2.ore_cllw_ops` is DEFAULT FOR TYPE. - sqlx::query( - "CREATE INDEX ore_cllw_test_idx - ON ore_cllw_test (eql_v2.ore_cllw((value).data))", - ) - .execute(&mut *tx) - .await?; - - // ANALYZE is skipped intentionally: the `value` column is - // `eql_v2_encrypted` with payloads that carry only `oc` (no root `ob`), - // and ANALYZE samples via the default btree opclass on - // `eql_v2_encrypted` — whose FUNCTION 1 is the strict-Block-ORE - // `eql_v2.compare` (post-#219), which raises on missing `ob`. The - // functional index match below works without stats once we force - // `enable_seqscan = off`. - - // EXPLAIN the ORDER BY query. With the opclass engaging, the plan - // should walk the btree in order (Index Scan / Index Only Scan) and - // skip the Sort node. Force the planner to prefer the index even on - // tiny fixtures (seq scan is usually cheaper at 20 rows). - sqlx::query("SET LOCAL enable_seqscan = off") - .execute(&mut *tx) - .await?; - let explain_rows = sqlx::query_scalar::<_, String>( - "EXPLAIN SELECT id FROM ore_cllw_test \ - ORDER BY eql_v2.ore_cllw((value).data) LIMIT 5", - ) - .fetch_all(&mut *tx) - .await?; - let explain = explain_rows.join("\n"); - - // The plan structure we want: top is Limit, then Index Scan - // (or Index Only Scan) on ore_cllw_test_idx. We accept either form; - // the key negative is: NO `Sort` node. - assert!( - explain.contains("Index Scan") || explain.contains("Index Only Scan"), - "Expected Index Scan via ore_cllw_test_idx, got:\n{explain}" - ); - assert!( - !explain.contains("Sort"), - "Expected no Sort node (index walks in order), got:\n{explain}" - ); - - tx.rollback().await?; - Ok(()) -} - -#[sqlx::test] -async fn functional_index_engages_via_arrow_chain(pool: PgPool) -> Result<()> { - // The recommended recipe for ordered queries on an sv element: - // `ORDER BY eql_v2.ore_cllw(col -> '')`. With the typed - // `->` returning `eql_v2.ste_vec_entry`, `eql_v2.ore_cllw` dispatches - // to the `(ste_vec_entry)` overload — which is inlinable, so the - // planner sees the unfolded extractor expression and matches a - // functional btree index built on the same expression. - let mut tx = pool.begin().await?; - - sqlx::query( - "CREATE TABLE ore_cllw_sv_test - (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - value eql_v2_encrypted NOT NULL)", - ) - .execute(&mut *tx) - .await?; - - // Seed 20 rows where each value's sv array has one element under - // selector 'age' carrying a unique `oc` byte sequence. - for i in 0..20u8 { - let hex = format!("00{:02x}", i); - let sql = format!( - "INSERT INTO ore_cllw_sv_test(value) \ - VALUES (jsonb_build_object( - 'v', 2, - 'i', jsonb_build_object('t', 'ore_cllw_sv_test', 'c', 'value'), - 'sv', jsonb_build_array( - jsonb_build_object('s', 'age', 'c', 'ct', 'oc', '{hex}') - ) - )::eql_v2_encrypted)" - ); - sqlx::query(&sql).execute(&mut *tx).await?; - } - - // Functional btree on the chained extractor. No opclass annotation - // needed because `eql_v2.ore_cllw_ops` is DEFAULT FOR TYPE. - sqlx::query( - "CREATE INDEX ore_cllw_sv_test_idx - ON ore_cllw_sv_test (eql_v2.ore_cllw(value -> 'age'::text))", - ) - .execute(&mut *tx) - .await?; - - sqlx::query("SET LOCAL enable_seqscan = off") - .execute(&mut *tx) - .await?; - let explain_rows = sqlx::query_scalar::<_, String>( - "EXPLAIN SELECT id FROM ore_cllw_sv_test \ - ORDER BY eql_v2.ore_cllw(value -> 'age'::text) LIMIT 5", - ) - .fetch_all(&mut *tx) - .await?; - let explain = explain_rows.join("\n"); - - assert!( - explain.contains("Index Scan") || explain.contains("Index Only Scan"), - "Expected Index Scan via ore_cllw_sv_test_idx, got:\n{explain}" - ); - assert!( - !explain.contains("Sort"), - "Expected no Sort node (index walks in order), got:\n{explain}" - ); - - tx.rollback().await?; - Ok(()) -} - -// =========================================================================== -// Inlinability check: operator backing functions must stay unpinned + SQL -// =========================================================================== - -#[sqlx::test] -async fn backing_functions_are_inlinable(pool: PgPool) -> Result<()> { - // Mirrors the lint-style assertion in `hash_operator_tests.rs` for the - // ORE-CLLW operator backing functions. Reads pg_proc directly to assert - // each function is `LANGUAGE sql`, `IMMUTABLE`, `STRICT`, `PARALLEL - // SAFE`, and not pinned with a `SET search_path`. Any of those failing - // would silently kill inlining and break functional-index match. - // - // Covers BOTH schemas: `eql_v2` and the self-contained `eql_v3` SEM fork. - // The eql_v3 operators take the composite `eql_v3.ore_cllw` arg, so they - // are not spared by the jsonb-domain structural skip in - // `tasks/pin_search_path.sql` — they need an explicit inline-critical - // entry there, and this asserts that entry keeps them unpinned. - for schema in ["eql_v2", "eql_v3"] { - let rows = sqlx::query( - "SELECT p.proname, - l.lanname, - p.provolatile, - p.proparallel, - p.proisstrict, - (p.proconfig IS NOT NULL) AS pinned - FROM pg_proc p - JOIN pg_namespace n ON n.oid = p.pronamespace - JOIN pg_language l ON l.oid = p.prolang - WHERE n.nspname = $1 - AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', - 'ore_cllw_lt', 'ore_cllw_lte', - 'ore_cllw_gt', 'ore_cllw_gte') - ORDER BY p.proname", - ) - .bind(schema) - .fetch_all(&pool) - .await?; - - assert_eq!(rows.len(), 6, "expected 6 backing functions in {schema}"); - - for row in rows { - let name: String = row.get("proname"); - let lang: String = row.get("lanname"); - let volatile: i8 = row.get("provolatile"); - let parallel: i8 = row.get("proparallel"); - let strict: bool = row.get("proisstrict"); - let pinned: bool = row.get("pinned"); - - assert_eq!(lang, "sql", "{schema}.{name}: must be LANGUAGE sql"); - assert_eq!(volatile as u8, b'i', "{schema}.{name}: must be IMMUTABLE"); - assert_eq!( - parallel as u8, b's', - "{schema}.{name}: must be PARALLEL SAFE" - ); - assert!(strict, "{schema}.{name}: must be STRICT"); - assert!( - !pinned, - "{schema}.{name}: must NOT have SET search_path (kills inlining)" - ); - } - } - Ok(()) -} - -// =========================================================================== -// Missing-`oc` rows: extractor returns SQL NULL composite, not ROW(NULL) -// -// Regression coverage for the btree FUNCTION 1 contract: the extractor must -// not emit a non-NULL composite whose `bytes` field is NULL, because btree's -// null-handling layer filters composite-level NULLs but not nested ones — -// indexing `ROW(NULL)` would land calls into `compare_ore_cllw_term` with -// undefined-behaviour inputs. -// =========================================================================== -// -// Extractor returns SQL-level NULL when the sv element lacks `oc`. Both the -// `(jsonb)` and `(ste_vec_entry)` overloads share the same semantics. - -#[sqlx::test] -async fn ore_cllw_extractor_returns_null_when_oc_absent(pool: PgPool) -> Result<()> { - let is_null: bool = sqlx::query_scalar( - "SELECT eql_v2.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"hm\":\"abc\"}'::jsonb) IS NULL", - ) - .fetch_one(&pool) - .await?; - assert!( - is_null, - "ore_cllw(jsonb) should return SQL NULL when `oc` is absent" - ); - - let is_null_entry: bool = sqlx::query_scalar( - "SELECT eql_v2.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"hm\":\"abc\"}'::jsonb::eql_v2.ste_vec_entry) IS NULL", - ) - .fetch_one(&pool) - .await?; - assert!( - is_null_entry, - "ore_cllw(ste_vec_entry) should return SQL NULL when `oc` is absent" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ore_cllw_extractor_returns_composite_when_oc_present(pool: PgPool) -> Result<()> { - // Sanity: when `oc` is present, the extractor returns a non-NULL - // composite whose `bytes` field decodes the hex. - let is_null: bool = sqlx::query_scalar( - "SELECT eql_v2.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"oc\":\"deadbeef\"}'::jsonb) IS NULL", - ) - .fetch_one(&pool) - .await?; - assert!( - !is_null, - "ore_cllw(jsonb) should NOT be NULL when `oc` is present" - ); - Ok(()) -} - -#[sqlx::test] -async fn comparator_raises_on_null_bytes_in_non_null_composite(pool: PgPool) -> Result<()> { - // Defense-in-depth: a hand-crafted composite with NULL `bytes` should - // raise rather than silently misorder. The extractors are designed not - // to produce this shape, so reaching this branch indicates a hand-built - // literal or a regression in the extractor body. - // - // Note: a single-field composite with all fields NULL is composite- - // level NULL per SQL semantics, so this branch is currently - // unreachable via the type as defined. We still assert the guard - // surfaces correctly when a future field addition makes - // `ROW(non_null, NULL)`-style values constructible — and we exercise - // the (jsonb) overload path to confirm the SQL-level NULL flows - // through the comparator without raising. - let comparator_returns_null: Option = sqlx::query_scalar( - "SELECT eql_v2.compare_ore_cllw_term(\ - eql_v2.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"hm\":\"abc\"}'::jsonb), \ - eql_v2.ore_cllw('{\"s\":\"x\",\"c\":\"y\",\"oc\":\"00ff\"}'::jsonb)\ - )", - ) - .fetch_one(&pool) - .await?; - assert!( - comparator_returns_null.is_none(), - "compare_ore_cllw_term with NULL composite should return SQL NULL" - ); - Ok(()) -} - -// =========================================================================== -// Functional-index match: WHERE-clause range engages Index Cond -// -// Closes the gap James flagged: the existing test only proves ORDER BY -// engages the index. WHERE-clause range quals go through a different -// planner path (opclass strategies 1/2/4/5) and need separate coverage. -// =========================================================================== - -#[sqlx::test] -async fn functional_index_engages_for_where_range(pool: PgPool) -> Result<()> { - let mut tx = pool.begin().await?; - - sqlx::query( - "CREATE TABLE ore_cllw_where_test - (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - value eql_v2_encrypted NOT NULL)", - ) - .execute(&mut *tx) - .await?; - - // Seed 100 rows so the planner can plausibly prefer an index scan. - for i in 0..100u8 { - let hex = format!("00{:02x}", i); - let sql = format!( - "INSERT INTO ore_cllw_where_test(value) \ - VALUES (jsonb_build_object('v', 2, 'k', 'ct', 'c', 'placeholder', \ - 'i', jsonb_build_object('t', 'ore_cllw_where_test', 'c', 'value'), \ - 'oc', '{hex}')::eql_v2_encrypted)" - ); - sqlx::query(&sql).execute(&mut *tx).await?; - } - - sqlx::query( - "CREATE INDEX ore_cllw_where_test_idx - ON ore_cllw_where_test (eql_v2.ore_cllw((value).data))", - ) - .execute(&mut *tx) - .await?; - - sqlx::query("SET LOCAL enable_seqscan = off") - .execute(&mut *tx) - .await?; - let explain_rows = sqlx::query_scalar::<_, String>( - "EXPLAIN SELECT id FROM ore_cllw_where_test \ - WHERE eql_v2.ore_cllw((value).data) \ - < eql_v2.ore_cllw('{\"oc\":\"00aa\"}'::jsonb)", - ) - .fetch_all(&mut *tx) - .await?; - let explain = explain_rows.join("\n"); - - // Accept either Index Scan or Bitmap Index Scan — both are valid - // index-engaging plans for a range qual. The key negative: NO Seq Scan. - assert!( - explain.contains("Index Scan") || explain.contains("Bitmap Index Scan"), - "Expected Index Scan via ore_cllw_where_test_idx for WHERE range, got:\n{explain}" - ); - assert!( - explain.contains("Index Cond"), - "Expected Index Cond clause on the WHERE range, got:\n{explain}" - ); - - tx.rollback().await?; - Ok(()) -} - -#[sqlx::test] -async fn rows_without_oc_excluded_from_range_query(pool: PgPool) -> Result<()> { - // Mixed-payload test: some rows carry `oc`, others carry only `hm`. - // A range query against the column must: - // (a) complete without raising — even though the hm-only rows produce - // SQL NULL from the extractor, the comparator (with my Option-C - // tightening) only RAISES on a non-NULL composite with NULL - // `bytes`, never on SQL NULL composites; and - // (b) return only oc-bearing row ids — the hm-only rows must be - // filtered out by SQL NULL semantics (NULL `` _ → NULL → - // not true → row excluded from WHERE). - // - // The test deliberately doesn't assert the exact count of matched - // oc-rows: the CLLW protocol is adjacency-revealing rather than - // total-order-preserving, so the set of "less than" rows under - // synthetic byte sequences depends on protocol details that aren't - // the subject of this test. - let mut tx = pool.begin().await?; - - sqlx::query( - "CREATE TABLE ore_cllw_mixed_test - (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - kind text NOT NULL, - value eql_v2_encrypted NOT NULL)", - ) - .execute(&mut *tx) - .await?; - - // 20 rows with oc, 20 rows hm-only. - for i in 0..20u8 { - let hex = format!("00{:02x}", i); - sqlx::query(&format!( - "INSERT INTO ore_cllw_mixed_test(kind, value) \ - VALUES ('oc', jsonb_build_object('v', 2, 'k', 'ct', 'c', 'placeholder', \ - 'i', jsonb_build_object('t', 'ore_cllw_mixed_test', 'c', 'value'), \ - 'oc', '{hex}')::eql_v2_encrypted)" - )) - .execute(&mut *tx) - .await?; - - let hm = format!("{:032x}", i + 100); - sqlx::query(&format!( - "INSERT INTO ore_cllw_mixed_test(kind, value) \ - VALUES ('hm', jsonb_build_object('v', 2, 'k', 'ct', 'c', 'placeholder', \ - 'i', jsonb_build_object('t', 'ore_cllw_mixed_test', 'c', 'value'), \ - 'hm', '{hm}')::eql_v2_encrypted)" - )) - .execute(&mut *tx) - .await?; - } - - // (a) Query completes — no raise. If Option-A had been bypassed and - // the extractor still returned `ROW(NULL)` for hm-only rows, the - // Option-C RAISE in `compare_ore_cllw_term` would fire and crash - // this query. - let hm_matches: i64 = sqlx::query_scalar( - "SELECT count(*) FROM ore_cllw_mixed_test \ - WHERE kind = 'hm' \ - AND eql_v2.ore_cllw((value).data) \ - < eql_v2.ore_cllw('{\"oc\":\"00aa\"}'::jsonb)", - ) - .fetch_one(&mut *tx) - .await?; - - // (b) None of the hm-only rows appear in the result. - assert_eq!( - hm_matches, 0, - "Expected zero hm-only rows in range query result — \ - missing-oc rows must be excluded by NULL semantics" - ); - - // Sanity: at least some oc-bearing rows DO match (so the predicate - // isn't trivially false — exercising the live comparator path). - let oc_matches: i64 = sqlx::query_scalar( - "SELECT count(*) FROM ore_cllw_mixed_test \ - WHERE kind = 'oc' \ - AND eql_v2.ore_cllw((value).data) \ - < eql_v2.ore_cllw('{\"oc\":\"00aa\"}'::jsonb)", - ) - .fetch_one(&mut *tx) - .await?; - assert!( - oc_matches > 0, - "Expected the predicate to match at least one oc-bearing row" - ); - - tx.rollback().await?; - Ok(()) -} diff --git a/tests/sqlx/tests/ore_comparison_tests.rs b/tests/sqlx/tests/ore_comparison_tests.rs deleted file mode 100644 index bba122f07..000000000 --- a/tests/sqlx/tests/ore_comparison_tests.rs +++ /dev/null @@ -1,106 +0,0 @@ -//! ORE comparison variant tests -//! -//! and src/operators/<=_ore_cllw_test.sql -//! Tests ORE CLLW comparison operators - -use anyhow::Result; -use eql_tests::{get_ore_encrypted, get_ore_encrypted_as_jsonb, QueryAssertion}; -use sqlx::PgPool; - -#[sqlx::test] -async fn lte_operator_cllw_u64_8(pool: PgPool) -> Result<()> { - // Test: <= operator with ORE CLLW U64 8 - // Uses ore table from migrations/002_install_ore_data.sql (ids 1-1000) - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e <= '{}'::eql_v2_encrypted ORDER BY e", - ore_term - ); - - // Should return 42 records (1-42 inclusive) - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn lte_function_cllw_u64_8(pool: PgPool) -> Result<()> { - // Test: lte() function with ORE CLLW U64 8 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE eql_v2.lte(e, '{}'::eql_v2_encrypted) ORDER BY e", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn lte_with_jsonb_cllw_u64_8(pool: PgPool) -> Result<()> { - // Test: <= with JSONB (ORE CLLW U64 8) - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e <= '{}'::jsonb ORDER BY e", - json_value - ); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn lte_operator_cllw_var_8(pool: PgPool) -> Result<()> { - // Test: <= operator with ORE CLLW VAR 8 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e <= '{}'::eql_v2_encrypted ORDER BY e", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn lte_function_cllw_var_8(pool: PgPool) -> Result<()> { - // Test: lte() function with ORE CLLW VAR 8 - - let ore_term = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE eql_v2.lte(e, '{}'::eql_v2_encrypted) ORDER BY e", - ore_term - ); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn lte_with_jsonb_cllw_var_8(pool: PgPool) -> Result<()> { - // Test: <= with JSONB (ORE CLLW VAR 8) - - let json_value = get_ore_encrypted_as_jsonb(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e <= '{}'::jsonb ORDER BY e", - json_value - ); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} diff --git a/tests/sqlx/tests/ore_equality_tests.rs b/tests/sqlx/tests/ore_equality_tests.rs deleted file mode 100644 index 4f4b223fa..000000000 --- a/tests/sqlx/tests/ore_equality_tests.rs +++ /dev/null @@ -1,80 +0,0 @@ -//! ORE equality/inequality operator tests -//! -//! Tests range comparisons against the consolidated ORE schemes (Block ORE for -//! root scalars, ORE CLLW for STE-vec elements). Uses the ore table from -//! `migrations/002_install_ore_data.sql` (ids 1-1000) — those rows carry Block -//! ORE (`ob`) terms, so the range operators dispatch to -//! `eql_v2.compare_ore_block_u64_8_256` at the top of the compare priority -//! list. -//! -//! Post-consolidation the previously-split CLLW variants (`ore_cllw_u64_8`, -//! `ore_cllw_var_8`) collapse to a single `eql_v2.ore_cllw` reading from `oc`. -//! The duplicated test pair (fixed vs var) was therefore merged; the single -//! set below covers the operator surface end-to-end. - -use anyhow::Result; -use eql_tests::{get_ore_encrypted, QueryAssertion}; -use sqlx::PgPool; - -// Equality / inequality removed: post-discipline, `=` and `<>` on -// `eql_v2_encrypted` require hmac at the root. The `ore` table fixtures -// carry only ORE terms (no hmac), so they are eligible for `<` / `<=` / -// `>` / `>=` (covered below) but not `=` / `<>`. ORE-only equality has no -// production analogue — equality is configured via the `unique` index, -// ordering via `ore`. - -#[sqlx::test] -async fn ore_cllw_less_than(pool: PgPool) -> Result<()> { - let encrypted = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e < '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(41).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_cllw_less_than_or_equal(pool: PgPool) -> Result<()> { - let encrypted = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e <= '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(42).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_cllw_greater_than(pool: PgPool) -> Result<()> { - let encrypted = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e > '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(958).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_cllw_greater_than_or_equal(pool: PgPool) -> Result<()> { - let encrypted = get_ore_encrypted(&pool, 42).await?; - - let sql = format!( - "SELECT id FROM ore WHERE e >= '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(959).await; - - Ok(()) -} diff --git a/tests/sqlx/tests/ore_text_operator_tests.rs b/tests/sqlx/tests/ore_text_operator_tests.rs deleted file mode 100644 index 7153e4eff..000000000 --- a/tests/sqlx/tests/ore_text_operator_tests.rs +++ /dev/null @@ -1,468 +0,0 @@ -//! ORE text operator tests -//! -//! Tests equality, comparison, function, JSONB, and edge-case operators with text ORE encryption. -//! Uses ore_text table from migrations/006_install_ore_text_data.sql (ids 1-100) -//! Words are lexicographically sorted: id=1 is 'aardvark', id=100 is 'zinc'. -//! -//! Pivot point: id=56 ('horizon') — 55 rows below, 44 rows above. - -use anyhow::Result; -use eql_tests::{get_ore_text_encrypted, get_ore_text_encrypted_as_jsonb, QueryAssertion}; -use sqlx::PgPool; - -// ============================================================================ -// Equality and inequality operators -// ============================================================================ - -// ore_text_equality_operator_finds_match, -// ore_text_inequality_operator_finds_non_matches removed: -// post-discipline `=` and `<>` require hmac at the root. The ore_text -// fixture carries only ORE terms. - -// ============================================================================ -// Comparison operators -// ============================================================================ - -#[sqlx::test] -async fn ore_text_less_than(pool: PgPool) -> Result<()> { - // Test: e < e with text ORE - // 55 words before 'horizon' (ids 1-55) - - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e < '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(55).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_less_than_or_equal(pool: PgPool) -> Result<()> { - // Test: e <= e with text ORE - // 56 words at or before 'horizon' (ids 1-56) - - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e <= '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(56).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_greater_than(pool: PgPool) -> Result<()> { - // Test: e > e with text ORE - // 44 words after 'horizon' (ids 57-100) - - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e > '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(44).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_greater_than_or_equal(pool: PgPool) -> Result<()> { - // Test: e >= e with text ORE - // 45 words at or after 'horizon' (ids 56-100) - - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e >= '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(45).await; - - Ok(()) -} - -// ============================================================================ -// Function variants (eql_v2.eq, neq, lt, lte, gt, gte) -// ============================================================================ - -#[sqlx::test] -async fn ore_text_eq_function(pool: PgPool) -> Result<()> { - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE eql_v2.eq(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(1).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_neq_function(pool: PgPool) -> Result<()> { - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE eql_v2.neq(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(99).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_lt_function(pool: PgPool) -> Result<()> { - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE eql_v2.lt(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(55).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_lte_function(pool: PgPool) -> Result<()> { - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE eql_v2.lte(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(56).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_gt_function(pool: PgPool) -> Result<()> { - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE eql_v2.gt(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(44).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_gte_function(pool: PgPool) -> Result<()> { - let encrypted = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE eql_v2.gte(e, '{}'::eql_v2_encrypted)", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(45).await; - - Ok(()) -} - -// ============================================================================ -// JSONB variants: e op jsonb -// ============================================================================ - -#[sqlx::test] -async fn ore_text_less_than_encrypted_lt_jsonb(pool: PgPool) -> Result<()> { - // Test: e < jsonb with text ORE - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE e < '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(55).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_greater_than_encrypted_gt_jsonb(pool: PgPool) -> Result<()> { - // Test: e > jsonb with text ORE - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE e > '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(44).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_lte_encrypted_lte_jsonb(pool: PgPool) -> Result<()> { - // Test: e <= jsonb with text ORE - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE e <= '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(56).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_gte_encrypted_gte_jsonb(pool: PgPool) -> Result<()> { - // Test: e >= jsonb with text ORE - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE e >= '{}'::jsonb", json_value); - - QueryAssertion::new(&pool, &sql).count(45).await; - - Ok(()) -} - -// ============================================================================ -// JSONB variants: e = jsonb, e <> jsonb -// ============================================================================ - -// ore_text_equality_encrypted_eq_jsonb, -// ore_text_inequality_encrypted_neq_jsonb removed: post-discipline `=` -// and `<>` (cross-type encrypted/jsonb) require hmac at the root. - -// ============================================================================ -// JSONB variants: jsonb = e, jsonb <> e (reverse direction) -// ============================================================================ - -// ore_text_equality_jsonb_eq_encrypted, -// ore_text_inequality_jsonb_neq_encrypted removed: post-discipline `=` -// and `<>` (reverse-direction jsonb/encrypted) require hmac at the root. - -// ============================================================================ -// JSONB variants: jsonb op e (reverse comparison direction) -// ============================================================================ - -#[sqlx::test] -async fn ore_text_less_than_jsonb_lt_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb < e (reverse direction) - // jsonb(56) < e means e > 56, so 44 records (ids 57-100) - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE '{}'::jsonb < e", json_value); - - QueryAssertion::new(&pool, &sql).count(44).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_greater_than_jsonb_gt_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb > e (reverse direction) - // jsonb(56) > e means e < 56, so 55 records (ids 1-55) - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE '{}'::jsonb > e", json_value); - - QueryAssertion::new(&pool, &sql).count(55).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_lte_jsonb_lte_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb <= e (reverse direction) - // jsonb(56) <= e means e >= 56, so 45 records (ids 56-100) - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE '{}'::jsonb <= e", json_value); - - QueryAssertion::new(&pool, &sql).count(45).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_gte_jsonb_gte_encrypted(pool: PgPool) -> Result<()> { - // Test: jsonb >= e (reverse direction) - // jsonb(56) >= e means e <= 56, so 56 records (ids 1-56) - - let json_value = get_ore_text_encrypted_as_jsonb(&pool, 56).await?; - - let sql = format!("SELECT id FROM ore_text WHERE '{}'::jsonb >= e", json_value); - - QueryAssertion::new(&pool, &sql).count(56).await; - - Ok(()) -} - -// ============================================================================ -// Lexicographic edge cases -// ============================================================================ - -#[sqlx::test] -async fn ore_text_prefix_less_than(pool: PgPool) -> Result<()> { - // Prefix ordering: app(6) < apple(7) < application(8) - // e < apple(7) should return 6 rows (ids 1-6), confirming app(6) < apple(7) - - let encrypted = get_ore_text_encrypted(&pool, 7).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e < '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(6).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_prefix_greater_than(pool: PgPool) -> Result<()> { - // e > apple(7) should return 93 rows (ids 8-100), confirming application(8) > apple(7) - - let encrypted = get_ore_text_encrypted(&pool, 7).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e > '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(93).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_prefix_between(pool: PgPool) -> Result<()> { - // e >= app(6) AND e <= application(8) should return 3 rows (ids 6, 7, 8) - - let lower = get_ore_text_encrypted(&pool, 6).await?; - let upper = get_ore_text_encrypted(&pool, 8).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e >= '{}'::eql_v2_encrypted AND e <= '{}'::eql_v2_encrypted", - lower, upper - ); - - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_similar_starts_less_than(pool: PgPool) -> Result<()> { - // Similar starts: car(22) < card(23) < care(24) - // e < card(23) should return 22 rows (ids 1-22), confirming car(22) < card(23) - - let encrypted = get_ore_text_encrypted(&pool, 23).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e < '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(22).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_similar_starts_between(pool: PgPool) -> Result<()> { - // e >= car(22) AND e <= care(24) should return 3 rows (ids 22, 23, 24) - - let lower = get_ore_text_encrypted(&pool, 22).await?; - let upper = get_ore_text_encrypted(&pool, 24).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e >= '{}'::eql_v2_encrypted AND e <= '{}'::eql_v2_encrypted", - lower, upper - ); - - QueryAssertion::new(&pool, &sql).count(3).await; - - Ok(()) -} - -// ============================================================================ -// Boundary tests -// ============================================================================ - -#[sqlx::test] -async fn ore_text_less_than_first_word(pool: PgPool) -> Result<()> { - // e < aardvark(1) should return 0 rows — nothing is before the first word - - let encrypted = get_ore_text_encrypted(&pool, 1).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e < '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_greater_than_last_word(pool: PgPool) -> Result<()> { - // e > zinc(100) should return 0 rows — nothing is after the last word - - let encrypted = get_ore_text_encrypted(&pool, 100).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e > '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(0).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_gte_first_word(pool: PgPool) -> Result<()> { - // e >= aardvark(1) should return all 100 rows - - let encrypted = get_ore_text_encrypted(&pool, 1).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e >= '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(100).await; - - Ok(()) -} - -#[sqlx::test] -async fn ore_text_lte_last_word(pool: PgPool) -> Result<()> { - // e <= zinc(100) should return all 100 rows - - let encrypted = get_ore_text_encrypted(&pool, 100).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e <= '{}'::eql_v2_encrypted", - encrypted - ); - - QueryAssertion::new(&pool, &sql).count(100).await; - - Ok(()) -} diff --git a/tests/sqlx/tests/ore_text_order_tests.rs b/tests/sqlx/tests/ore_text_order_tests.rs deleted file mode 100644 index a6fcce940..000000000 --- a/tests/sqlx/tests/ore_text_order_tests.rs +++ /dev/null @@ -1,267 +0,0 @@ -//! ORE text ordering tests -//! -//! Tests ORDER BY and sort_compare with text ORE encryption. -//! Uses ore_text table from migrations/006_install_ore_text_data.sql (ids 1-100) -//! Words are lexicographically sorted: id=1 is 'aardvark', id=100 is 'zinc'. - -use anyhow::Result; -use eql_tests::{assert_sequential_ids, get_ore_text_encrypted}; -use sqlx::{PgPool, Row}; - -// ============================================================================ -// ORDER BY with operator classes (ORDER BY e) -// ============================================================================ - -#[sqlx::test] -async fn order_by_text_asc_returns_alphabetical_order(pool: PgPool) -> Result<()> { - let sql = "SELECT id FROM ore_text ORDER BY e ASC"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - assert_sequential_ids(&rows, 1, 100); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_text_desc_returns_reverse_alphabetical(pool: PgPool) -> Result<()> { - let sql = "SELECT id FROM ore_text ORDER BY e DESC"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!(first_id, 100, "First DESC row should be id=100 (zinc)"); - - let last_id: i64 = rows[99].try_get(0)?; - assert_eq!(last_id, 1, "Last DESC row should be id=1 (aardvark)"); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_text_with_limit(pool: PgPool) -> Result<()> { - let sql = "SELECT id FROM ore_text ORDER BY e ASC LIMIT 5"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 5, "LIMIT 5 should return 5 rows"); - assert_sequential_ids(&rows, 1, 5); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_text_comparison_less_than(pool: PgPool) -> Result<()> { - // horizon is id=56, so e < horizon should return 55 rows (ids 1-55) - let ore_term = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e < '{}'::eql_v2_encrypted ORDER BY e ASC", - ore_term - ); - - let rows = sqlx::query(&sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 55, "Should return 55 records (ids 1-55)"); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_text_comparison_greater_than(pool: PgPool) -> Result<()> { - // horizon is id=56, so e > horizon should return 44 rows (ids 57-100) - let ore_term = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT id FROM ore_text WHERE e > '{}'::eql_v2_encrypted ORDER BY e ASC", - ore_term - ); - - let rows = sqlx::query(&sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 44, "Should return 44 records (ids 57-100)"); - - Ok(()) -} - -#[sqlx::test] -async fn order_by_text_helper_function(pool: PgPool) -> Result<()> { - let sql = "SELECT id FROM ore_text ORDER BY eql_v2.order_by(e) ASC"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - assert_sequential_ids(&rows, 1, 100); - - Ok(()) -} - -// ============================================================================ -// sort_compare without operator classes -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_asc(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore_text), - (SELECT array_agg(e ORDER BY id) FROM ore_text), - 'ASC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - assert_sequential_ids(&rows, 1, 100); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_desc(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore_text), - (SELECT array_agg(e ORDER BY id) FROM ore_text), - 'DESC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - - let first_id: i64 = rows[0].try_get(0)?; - assert_eq!(first_id, 100, "First DESC row should be id=100 (zinc)"); - - let last_id: i64 = rows[99].try_get(0)?; - assert_eq!(last_id, 1, "Last DESC row should be id=1 (aardvark)"); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -#[ignore = "Breaking with range-operator inlining: < / <= / > / >= on eql_v2_encrypted now reduce to ore_block_u64_8_256 term comparison. Columns carrying only OPE (opf/opv) or ore_cllw terms raise from the ore_block extractor. Re-enable once the inlined operators support CASE-style dispatch across ORE / OPE encodings."] -async fn sort_compare_text_with_filter(pool: PgPool) -> Result<()> { - // Filter to e > horizon (id=56), sort remaining 44 rows - let ore_term = get_ore_text_encrypted(&pool, 56).await?; - - let sql = format!( - "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore_text WHERE e > '{ore}'::eql_v2_encrypted), - (SELECT array_agg(e ORDER BY id) FROM ore_text WHERE e > '{ore}'::eql_v2_encrypted), - 'ASC' - )", - ore = ore_term - ); - - let rows = sqlx::query(&sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 44, "Should return 44 records (ids 57-100)"); - assert_sequential_ids(&rows, 57, 100); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_table_ref(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore_text', 'ASC')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - assert_sequential_ids(&rows, 1, 100); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_table_ref_schema_qualified(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare('id', 'e', 'public.ore_text', 'ASC')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - assert_sequential_ids(&rows, 1, 100); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_order_by_compare(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.order_by_compare('SELECT id, e FROM ore_text')"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 100, "Should return all 100 records"); - assert_sequential_ids(&rows, 1, 100); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_with_limit(pool: PgPool) -> Result<()> { - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore_text), - (SELECT array_agg(e ORDER BY id) FROM ore_text) - ) LIMIT 5"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 5, "LIMIT 5 should return 5 rows"); - assert_sequential_ids(&rows, 1, 5); - - Ok(()) -} - -// ============================================================================ -// Text-specific edge cases -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_prefix_ordering(pool: PgPool) -> Result<()> { - // Verify 'app'(id=6) < 'apple'(id=7) < 'application'(id=8) - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore_text WHERE id IN (6, 7, 8)), - (SELECT array_agg(e ORDER BY id) FROM ore_text WHERE id IN (6, 7, 8)), - 'ASC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 3, "Should return 3 records"); - - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - ids, - vec![6i64, 7, 8], - "Prefix ordering: app(6) < apple(7) < application(8), got {:?}", - ids - ); - - Ok(()) -} - -#[sqlx::test(fixtures(path = "../fixtures", scripts("drop_operator_classes")))] -async fn sort_compare_text_similar_starts(pool: PgPool) -> Result<()> { - // Verify 'car'(id=22) < 'card'(id=23) < 'care'(id=24) - let sql = "SELECT * FROM eql_v2.sort_compare( - (SELECT array_agg(id ORDER BY id) FROM ore_text WHERE id IN (22, 23, 24)), - (SELECT array_agg(e ORDER BY id) FROM ore_text WHERE id IN (22, 23, 24)), - 'ASC' - )"; - - let rows = sqlx::query(sql).fetch_all(&pool).await?; - - assert_eq!(rows.len(), 3, "Should return 3 records"); - - let ids: Vec = rows.iter().map(|r| r.try_get(0).unwrap()).collect(); - assert_eq!( - ids, - vec![22i64, 23, 24], - "Similar starts: car(22) < card(23) < care(24), got {:?}", - ids - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/specialized_tests.rs b/tests/sqlx/tests/specialized_tests.rs deleted file mode 100644 index f6cfa6a87..000000000 --- a/tests/sqlx/tests/specialized_tests.rs +++ /dev/null @@ -1,415 +0,0 @@ -//! Specialized function tests -//! -//! - src/ste_vec/functions_test.sql (18 assertions) -//! - src/ore_block_u64_8_256/functions_test.sql (8 assertions) -//! - src/hmac_256/functions_test.sql (3 assertions) -//! - src/bloom_filter/functions_test.sql (2 assertions) -//! - src/version_test.sql (2 assertions) - -use anyhow::Result; -use eql_tests::QueryAssertion; -use sqlx::PgPool; - -// ============================================================================ -// STE Vec tests (18 assertions) -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn ste_vec_returns_array_with_three_elements(pool: PgPool) -> Result<()> { - // Test: ste_vec() returns array with 3 elements for encrypted data - - // ste_vec() returns eql_v2_encrypted[] - use array_length to verify - let result: Option = - sqlx::query_scalar("SELECT array_length(eql_v2.ste_vec(e), 1) FROM encrypted LIMIT 1") - .fetch_one(&pool) - .await?; - - assert_eq!( - result, - Some(3), - "ste_vec should return array with 3 elements" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ste_vec_returns_array_for_ste_vec_element(pool: PgPool) -> Result<()> { - // Test: ste_vec() returns array with 3 elements for ste_vec element itself - - let result: Option = sqlx::query_scalar( - "SELECT array_length(eql_v2.ste_vec(get_numeric_ste_vec_10()::eql_v2_encrypted), 1)", - ) - .fetch_one(&pool) - .await?; - - assert_eq!( - result, - Some(3), - "ste_vec should return array with 3 elements for ste_vec element" - ); - - Ok(()) -} - -#[sqlx::test] -async fn is_ste_vec_array_returns_true_for_valid_array(pool: PgPool) -> Result<()> { - // Test: is_ste_vec_array() returns true for valid ste_vec array - - let result: bool = - sqlx::query_scalar("SELECT eql_v2.is_ste_vec_array('{\"a\": 1}'::jsonb::eql_v2_encrypted)") - .fetch_one(&pool) - .await?; - - assert!( - result, - "is_ste_vec_array should return true for valid array" - ); - - Ok(()) -} - -#[sqlx::test] -async fn is_ste_vec_array_returns_false_for_invalid_array(pool: PgPool) -> Result<()> { - // Test: is_ste_vec_array() returns false for invalid arrays - - let result1: bool = - sqlx::query_scalar("SELECT eql_v2.is_ste_vec_array('{\"a\": 0}'::jsonb::eql_v2_encrypted)") - .fetch_one(&pool) - .await?; - - assert!(!result1, "is_ste_vec_array should return false for a=0"); - - let result2: bool = - sqlx::query_scalar("SELECT eql_v2.is_ste_vec_array('{}'::jsonb::eql_v2_encrypted)") - .fetch_one(&pool) - .await?; - - assert!( - !result2, - "is_ste_vec_array should return false for empty object" - ); - - Ok(()) -} - -#[sqlx::test] -async fn to_ste_vec_value_extracts_ste_vec_fields(pool: PgPool) -> Result<()> { - // Test: to_ste_vec_value() extracts fields from ste_vec structure - - // to_ste_vec_value() returns eql_v2_encrypted - cast to jsonb for parsing - let result: serde_json::Value = sqlx::query_scalar( - "SELECT eql_v2.to_ste_vec_value('{\"i\": \"i\", \"v\": 2, \"sv\": [{\"oc\": \"oc\"}]}'::jsonb)::jsonb" - ) - .fetch_one(&pool) - .await?; - - assert!(result.is_object(), "to_ste_vec_value should return object"); - let obj = result.as_object().unwrap(); - assert!(obj.contains_key("i"), "should contain 'i' key"); - assert!(obj.contains_key("v"), "should contain 'v' key"); - assert!(obj.contains_key("oc"), "should contain 'oc' key"); - - Ok(()) -} - -#[sqlx::test] -async fn to_ste_vec_value_returns_original_for_non_ste_vec(pool: PgPool) -> Result<()> { - // Test: to_ste_vec_value() returns original if not ste_vec value - - let result: serde_json::Value = sqlx::query_scalar( - "SELECT eql_v2.to_ste_vec_value('{\"i\": \"i\", \"v\": 2, \"b3\": \"b3\"}'::jsonb)::jsonb", - ) - .fetch_one(&pool) - .await?; - - assert!(result.is_object(), "to_ste_vec_value should return object"); - let obj = result.as_object().unwrap(); - assert!(obj.contains_key("i"), "should contain 'i' key"); - assert!(obj.contains_key("v"), "should contain 'v' key"); - assert!(obj.contains_key("b3"), "should contain 'b3' key"); - - Ok(()) -} - -#[sqlx::test] -async fn is_ste_vec_value_returns_true_for_valid_value(pool: PgPool) -> Result<()> { - // Test: is_ste_vec_value() returns true for valid ste_vec value - - let result: bool = sqlx::query_scalar( - "SELECT eql_v2.is_ste_vec_value('{\"sv\": [1]}'::jsonb::eql_v2_encrypted)", - ) - .fetch_one(&pool) - .await?; - - assert!( - result, - "is_ste_vec_value should return true for valid value" - ); - - Ok(()) -} - -#[sqlx::test] -async fn is_ste_vec_value_returns_false_for_invalid_values(pool: PgPool) -> Result<()> { - // Test: is_ste_vec_value() returns false for invalid values - - let result1: bool = sqlx::query_scalar( - "SELECT eql_v2.is_ste_vec_value('{\"sv\": []}'::jsonb::eql_v2_encrypted)", - ) - .fetch_one(&pool) - .await?; - - assert!( - !result1, - "is_ste_vec_value should return false for empty array" - ); - - let result2: bool = - sqlx::query_scalar("SELECT eql_v2.is_ste_vec_value('{}'::jsonb::eql_v2_encrypted)") - .fetch_one(&pool) - .await?; - - assert!( - !result2, - "is_ste_vec_value should return false for empty object" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ste_vec_contains_self(pool: PgPool) -> Result<()> { - // Test: ste_vec_contains() returns true when value contains itself - - let result: bool = sqlx::query_scalar( - "SELECT eql_v2.ste_vec_contains( - get_numeric_ste_vec_10()::eql_v2_encrypted, - get_numeric_ste_vec_10()::eql_v2_encrypted - )", - ) - .fetch_one(&pool) - .await?; - - assert!( - result, - "ste_vec_contains should return true for self-containment" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ste_vec_contains_term(pool: PgPool) -> Result<()> { - // Test: `e @> (e -> 'sel')` is true. The typed `->` returns - // `ste_vec_entry`; the `@>(eql_v2_encrypted, eql_v2.ste_vec_entry)` - // overload wraps the entry and delegates to `ste_vec_contains`. - let result: bool = sqlx::query_scalar( - "SELECT - (get_numeric_ste_vec_10()::eql_v2_encrypted) - @> - ((get_numeric_ste_vec_10()::eql_v2_encrypted) -> '2517068c0d1f9d4d41d2c666211f785e'::text)", - ) - .fetch_one(&pool) - .await?; - - assert!( - result, - "encrypted value should contain the entry extracted from it" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ste_vec_term_does_not_contain_array(pool: PgPool) -> Result<()> { - // Test: a single-entry payload does NOT contain the full multi-entry payload. - // Post-flip the type system makes the original shape - // (`ste_vec_entry @> eql_v2_encrypted`) compile-time-prevented; the - // semantic of asymmetric containment is preserved here by wrapping the - // extracted entry into its own minimal payload and verifying it doesn't - // contain the full source. - let result: bool = sqlx::query_scalar( - "WITH one_entry_payload AS ( - SELECT eql_v2.to_encrypted( - jsonb_build_object( - 'sv', - jsonb_build_array( - ((get_numeric_ste_vec_10()::eql_v2_encrypted) -> '2517068c0d1f9d4d41d2c666211f785e'::text) - 'c' - ) - ) - ) AS v - ) - SELECT one_entry_payload.v - @> - (get_numeric_ste_vec_10()::eql_v2_encrypted) - FROM one_entry_payload", - ) - .fetch_one(&pool) - .await?; - - assert!( - !result, - "single-entry payload should NOT contain the full multi-entry payload" - ); - - Ok(()) -} - -// ============================================================================ -// ORE block functions tests (8 assertions) -// ============================================================================ - -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn ore_block_extracts_ore_term(pool: PgPool) -> Result<()> { - // Test: ore_block_u64_8_256() extracts ore index term from encrypted data - - // ore_block_u64_8_256() returns custom type - cast to text for verification - let result: String = - sqlx::query_scalar("SELECT eql_v2.ore_block_u64_8_256('{\"ob\": []}'::jsonb)::text") - .fetch_one(&pool) - .await?; - - assert!( - !result.is_empty(), - "ore_block_u64_8_256 should return non-empty result" - ); - - Ok(()) -} - -#[sqlx::test] -async fn ore_block_throws_exception_for_missing_term(pool: PgPool) -> Result<()> { - // Test: ore_block_u64_8_256() throws exception when ore term is missing - - QueryAssertion::new(&pool, "SELECT eql_v2.ore_block_u64_8_256('{}'::jsonb)") - .throws_exception() - .await; - - Ok(()) -} - -#[sqlx::test] -async fn has_ore_block_returns_true_for_ore_data(pool: PgPool) -> Result<()> { - // Test: has_ore_block_u64_8_256() returns true for data with ore term - - let result: bool = sqlx::query_scalar( - "SELECT eql_v2.has_ore_block_u64_8_256(e) FROM ore WHERE id = 42 LIMIT 1", - ) - .fetch_one(&pool) - .await?; - - assert!( - result, - "has_ore_block_u64_8_256 should return true for ore data" - ); - - Ok(()) -} - -// ============================================================================ -// HMAC functions tests (3 assertions) -// ============================================================================ - -#[sqlx::test] -async fn hmac_extracts_hmac_term(pool: PgPool) -> Result<()> { - // Test: hmac_256() extracts hmac index term from encrypted data - - let result: String = sqlx::query_scalar("SELECT eql_v2.hmac_256('{\"hm\": \"u\"}'::jsonb)") - .fetch_one(&pool) - .await?; - - assert!( - !result.is_empty(), - "hmac_256 should return non-empty string" - ); - assert_eq!(result, "u", "hmac_256 should extract 'hm' field value"); - - Ok(()) -} - -#[sqlx::test] -async fn hmac_returns_null_for_missing_term(pool: PgPool) -> Result<()> { - // Post-2.3, eql_v2.hmac_256 is inlinable SQL — it returns NULL when the - // 'hm' field is missing rather than raising. The loud failure surface - // for missing-hm columns is now eql_v2.hash_encrypted (used by GROUP BY, - // DISTINCT, hash joins) — see U-002. - let result: Option = sqlx::query_scalar("SELECT eql_v2.hmac_256('{}'::jsonb)::text") - .fetch_one(&pool) - .await?; - - assert!( - result.is_none(), - "hmac_256 on a payload without 'hm' should return NULL, got: {:?}", - result - ); - - Ok(()) -} - -#[sqlx::test] -async fn has_hmac_returns_true_for_hmac_data(pool: PgPool) -> Result<()> { - // Test: has_hmac_256() returns true for data with hmac term - - let result: bool = - sqlx::query_scalar("SELECT eql_v2.has_hmac_256(create_encrypted_json(1, 'hm'))") - .fetch_one(&pool) - .await?; - - assert!(result, "has_hmac_256 should return true for hmac data"); - - Ok(()) -} - -// ============================================================================ -// Bloom filter tests (2 assertions) -// ============================================================================ - -#[sqlx::test] -async fn bloom_filter_extracts_bloom_term(pool: PgPool) -> Result<()> { - // Test: bloom_filter() extracts bloom filter term from encrypted data - - // bloom_filter() returns smallint[] - cast to text for verification - let result: String = - sqlx::query_scalar("SELECT eql_v2.bloom_filter('{\"bf\": []}'::jsonb)::text") - .fetch_one(&pool) - .await?; - - assert!( - !result.is_empty(), - "bloom_filter should return non-empty result" - ); - - Ok(()) -} - -#[sqlx::test] -async fn bloom_filter_throws_exception_for_missing_term(pool: PgPool) -> Result<()> { - // Test: bloom_filter() throws exception when bloom filter term is missing - - QueryAssertion::new(&pool, "SELECT eql_v2.bloom_filter('{}'::jsonb)") - .throws_exception() - .await; - - Ok(()) -} - -// ============================================================================ -// Version tests (2 assertions) -// ============================================================================ - -#[sqlx::test] -async fn eql_version_returns_dev_in_test_environment(pool: PgPool) -> Result<()> { - // Test: version() returns 'DEV' in test environment - - let version: String = sqlx::query_scalar("SELECT eql_v2.version()") - .fetch_one(&pool) - .await?; - - assert_eq!( - version, "DEV", - "version should return 'DEV' in test environment" - ); - - Ok(()) -} diff --git a/tests/sqlx/tests/test_helpers_test.rs b/tests/sqlx/tests/test_helpers_test.rs deleted file mode 100644 index b3d534a61..000000000 --- a/tests/sqlx/tests/test_helpers_test.rs +++ /dev/null @@ -1,31 +0,0 @@ -use eql_tests::reset_function_stats; -use sqlx::PgPool; - -#[sqlx::test] -async fn test_reset_function_stats(pool: PgPool) { - // Verify function tracking is enabled - let tracking_enabled = sqlx::query_scalar::<_, String>("SHOW track_functions") - .fetch_one(&pool) - .await - .expect("Failed to check track_functions setting"); - - assert_eq!( - tracking_enabled, "all", - "track_functions should be set to 'all'" - ); - - // Test: Call reset_function_stats and verify it completes without error - reset_function_stats(&pool) - .await - .expect("reset_function_stats should complete without error"); - - // The function wraps pg_stat_reset() which is a PostgreSQL built-in. - // We've verified: - // 1. The function compiles and can be called - // 2. It doesn't return an error - // 3. Function tracking is enabled in PostgreSQL - // - // The actual behavior of pg_stat_reset() is tested by PostgreSQL itself. - // Testing asynchronous stats collection is complex and timing-dependent, - // so we focus on verifying the wrapper works correctly. -} From 48bf3125bacc711bc3042b71b920466f7782c81a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 14:37:32 +1000 Subject: [PATCH 321/599] test(sqlx): delete committed v2 fixtures, reframe FIXTURE_SCHEMA for generated v3 fixtures --- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 412 +++--------------- tests/sqlx/fixtures/aggregate_minmax_data.sql | 38 -- tests/sqlx/fixtures/array_data.sql | 16 - tests/sqlx/fixtures/bench_data.sql | 25 -- tests/sqlx/fixtures/bench_setup.sql | 31 -- tests/sqlx/fixtures/config_tables.sql | 15 - tests/sqlx/fixtures/constraint_tables.sql | 9 - tests/sqlx/fixtures/drop_operator_classes.sql | 32 -- tests/sqlx/fixtures/encrypted_json.sql | 23 - tests/sqlx/fixtures/encryptindex_tables.sql | 13 - tests/sqlx/fixtures/match_data.sql | 28 -- tests/sqlx/fixtures/order_by_null_data.sql | 30 -- 12 files changed, 53 insertions(+), 619 deletions(-) delete mode 100644 tests/sqlx/fixtures/aggregate_minmax_data.sql delete mode 100644 tests/sqlx/fixtures/array_data.sql delete mode 100644 tests/sqlx/fixtures/bench_data.sql delete mode 100644 tests/sqlx/fixtures/bench_setup.sql delete mode 100644 tests/sqlx/fixtures/config_tables.sql delete mode 100644 tests/sqlx/fixtures/constraint_tables.sql delete mode 100644 tests/sqlx/fixtures/drop_operator_classes.sql delete mode 100644 tests/sqlx/fixtures/encrypted_json.sql delete mode 100644 tests/sqlx/fixtures/encryptindex_tables.sql delete mode 100644 tests/sqlx/fixtures/match_data.sql delete mode 100644 tests/sqlx/fixtures/order_by_null_data.sql diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 69b5dc589..6abde8656 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -1,398 +1,92 @@ # SQLx Test Fixtures Schema Documentation -This document defines the structure and dependencies of test fixtures used in the SQLx test suite. +This document defines the structure of the test fixtures used in the SQLx test +suite. -There are **two classes** of fixture in this directory: +The suite installs the self-contained `eql_v3` surface (via the generated +`001_install_eql.sql` migration) and drives all coverage from **generated** +fixtures. There are no committed table-data fixtures: every fixture is produced +by the Rust fixture framework in `tests/sqlx/src/fixtures/` and is gitignored. -1. **Committed, hand-written** — the `eql_v2`-era fixtures listed in the graph - below. These are git-tracked SQL files that depend on the EQL extension - being installed via SQLx migrations. -2. **Generated, gitignored** — the `eql_v3` scalar surface (`eql_v3_*.sql` plus - `v3_ste_vec.sql`, `v3_doc_int4.sql`, `v3_numeric_collision.sql`). These are - produced by the Rust fixture framework and **never committed** — see - [Generated eql_v3 fixtures](#generated-eql_v3-fixtures) below. +## Generated `eql_v3` fixtures -## Fixture Dependencies +`mise run fixture:generate:all` (the `generate_all_fixtures` test, run over +`eql-scalars::CATALOG`) materialises the fixtures into this directory: ``` -EQL Extension (via migrations) - ├── encrypted_json.sql - │ └── array_data.sql (extends `encrypted` table from encrypted_json) - ├── match_data.sql - ├── aggregate_minmax_data.sql - ├── config_tables.sql - ├── constraint_tables.sql - ├── encryptindex_tables.sql - ├── drop_operator_classes.sql (Supabase-simulation; drops opclasses + ORE operators) - ├── order_by_null_data.sql (depends on ore migration) - ├── ore table (migration 002 — not a fixture) - └── bench_data.sql + bench_setup.sql (depend on migration 007) - -Generated eql_v3 fixtures (gitignored; .gitignore:225-230) - ├── eql_v3_.sql (jsonb payload — no EQL dependency) - ├── eql_v3__doubles.sql (jsonb payload — duplicate-value variant) +Generated eql_v3 fixtures (gitignored) + ├── eql_v3_.sql (jsonb payload — no EQL dependency) + ├── eql_v3__doubles.sql (jsonb payload — duplicate-value variant the + │ property suites consume) ├── v3_numeric_collision.sql (jsonb payload — no EQL dependency) - ├── v3_doc_int4.sql (eql_v3.json payload — depends on eql_v3 surface) - └── v3_ste_vec.sql (eql_v3.json payload — depends on eql_v3 surface) -``` - -All committed fixtures depend on the EQL extension being installed via SQLx -migrations. The generated `eql_v3` fixtures are described in their own section -below — most carry a plain `jsonb` payload and apply standalone, but the two -SteVec/document fixtures (`v3_doc_int4`, `v3_ste_vec`) store `eql_v3.json` and -therefore require the `eql_v3` surface. - ---- - -## encrypted_json.sql - -**Purpose:** Creates `encrypted` table with HMAC-indexed encrypted values for equality/JSONB tests. - -**Schema:** -```sql -CREATE TABLE encrypted ( - id INTEGER PRIMARY KEY, - e eql_v2_encrypted -); -``` - -**Data:** -- 3 records (ids 1, 2, 3) -- Each record has encrypted JSONB with HMAC index -- Values include nested objects for JSONB path tests - -**Used By:** -- equality_tests.rs -- jsonb_tests.rs -- inequality_tests.rs -- jsonb_path_operators_tests.rs -- containment_tests.rs -- like_operator_tests.rs -- aggregate_tests.rs - -**Create Function:** -- Uses `create_encrypted_json(id, 'hm')` for HMAC-indexed values -- Creates consistent test data across test runs - ---- - -## array_data.sql - -**Purpose:** Creates test data with arrays for JSONB array function tests. - -**Dependencies:** -- Requires `encrypted_json.sql` (extends encrypted table or creates new table) - -**Data:** -- Records with JSONB arrays -- Used for testing `jsonb_array_elements()` and array path queries - -**Used By:** -- jsonb_tests.rs (array-specific tests) - ---- - -## match_data.sql - -**Purpose:** Creates the `encrypted` table seeded with bloom-filter-indexed -values for `LIKE` operator tests (`~~` and `~~*`), exercising -encrypted-to-encrypted matching. - -**Dependencies:** -- Requires the EQL extension (`eql_v2.add_encrypted_constraint`, - `create_encrypted_json`, `seed_encrypted` from migrations) - -**Schema:** -```sql -CREATE TABLE encrypted ( - id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - e eql_v2_encrypted -); -``` - -**Data:** -- 3 records seeded via `create_encrypted_json(1..3)` — real EQL payloads, with - the production CHECK constraint applied so malformed payloads are rejected. -- Plaintext structure: `{"hello": "world", "n": N}` for N = 1, 2, 3. - -**Used By:** -- like_operator_tests.rs - ---- - -## aggregate_minmax_data.sql - -**Purpose:** Test data for the `eql_v2.min()` / `eql_v2.max()` aggregates over -encrypted columns, including a NULL row. - -**Dependencies:** -- Requires the EQL extension (`eql_v2_encrypted` type) - -**Schema:** -```sql -CREATE TABLE agg_test ( - plain_int integer, - enc_int eql_v2_encrypted -); -``` - -**Data:** -- Rows pairing `plain_int` with an `enc_int` whose decrypted value equals - `plain_int` (the in-table oracle), plus a `(NULL, NULL)` row to verify - NULL handling in the aggregates. Each `enc_int` carries an ORE block (`ob`) - ordering term. - -**Used By:** -- aggregate_tests.rs (MIN/MAX over encrypted columns) - ---- - -## order_by_null_data.sql - -**Purpose:** Creates `encrypted` table with NULL and ORE-encrypted values for ORDER BY NULL ordering tests. - -**Dependencies:** -- Requires `ore` table from migrations (selects encrypted values for ids 42 and 3) - -**Schema:** -```sql -CREATE TABLE encrypted ( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - e eql_v2_encrypted -); -``` - -**Data:** -- 4 records: - - id=1: NULL - - id=2: ORE value for 42 (from ore table) - - id=3: ORE value for 3 (from ore table) - - id=4: NULL - -**Used By:** -- order_by_tests.rs (NULLS FIRST / NULLS LAST tests) - ---- - -## ore table (from migrations - NOT a fixture) - -**Source:** `tests/sqlx/migrations/002_install_ore_data.sql` - -**Purpose:** Provides ORE-encrypted values 1-99 for comparison/ORDER BY tests. - -**Schema:** -```sql -CREATE TABLE ore ( - id bigint PRIMARY KEY, - e eql_v2_encrypted -); + ├── v3_doc_int4.sql (eql_v3.json payload — depends on eql_v3 surface) + └── v3_ste_vec.sql (eql_v3.json payload — depends on eql_v3 surface) ``` -**Data:** -- 99 records (ids 1-99) -- Each record has ONLY `ob` key (ORE block), NOT ore64 index -- Pre-seeded by migration, available to all tests automatically -- No fixture needed - table exists from migrations - -**Used By:** -- comparison_tests.rs (< > <= >=) -- order_by_tests.rs -- ore_equality_tests.rs (ORE variants) -- aggregate_tests.rs (MAX/MIN) - -**Helper Functions:** -- `get_ore_encrypted(pool, id)` - Selects encrypted value from ore table -- `create_encrypted_json(id)` - Looks up ore table at `id * 10` (valid ids: 1-9 → ore lookups: 10-90) - -**Key Property:** -- Sequential numeric values enable deterministic comparison tests -- e.g., `WHERE e < get_ore_encrypted(42)` should return 41 records - -**IMPORTANT:** -- ❌ DO NOT create `ore_data.sql` fixture - table already exists from migrations -- ❌ DO NOT use `scripts("ore_data")` in test attributes -- ✅ Use `#[sqlx::test]` without fixtures for ORE tests - ---- - -## bench_data.sql - -**Purpose:** Seeds 10K rows into the `bench` table for performance benchmarking. Opt-in fixture — only loaded when a test explicitly includes `scripts("bench_data")`, so other tests don't pay the cost. - -**Dependencies:** -- Requires `bench` table from migration `007_install_bench_data.sql` -- Uses `create_encrypted_json()` from migration `004_install_test_helpers.sql` - -**Schema:** Uses `bench` table (DDL in migration 007): -```sql -CREATE TABLE bench ( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - encrypted_text eql_v2_encrypted, - encrypted_int eql_v2_encrypted, - encrypted_bigint eql_v2_encrypted -); -``` - -**Data:** -- 10,000 rows drawn from 99 distinct encrypted values via `create_encrypted_json()` helper ids 1-99 (which map to ORE rows 10, 20, ..., 990) -- Zipf-like skew via `setseed(0.42)` + `random()^2` — deterministic and byte-identical across runs -- Top id gets ~5% of rows; tail ids ~0.5% each (top:bottom ratio ~10x) -- Each column draws independently, so column values are decorrelated within a row -- Each row has HMAC, bloom filter, and ORE index terms - -**Used By:** -- bench_data_tests.rs (all tests) - ---- - -## bench_setup.sql - -**Purpose:** Creates the 5 benchmark indexes and refreshes planner statistics. Always loaded after `bench_data.sql` in tests that verify index usage. - -**Dependencies:** -- Requires `bench` table with data from `bench_data.sql` - -**Indexes created:** -- `bench_text_hmac_idx` — hash on `eql_v2.hmac_256(encrypted_text)` for equality -- `bench_text_ore_idx` — btree on `encrypted_text` via operator class for text ordering -- `bench_int_ore_idx` — btree on `encrypted_int` via operator class for range/ORDER BY -- `bench_bigint_ore_idx` — btree on `encrypted_bigint` via operator class -- `bench_text_bloom_idx` — GIN on `eql_v2.bloom_filter(encrypted_text)` for containment - -**Used By:** -- bench_data_tests.rs (index-usage tests: `scripts("bench_data", "bench_setup")`) - ---- - -## Generated eql_v3 fixtures - -The `eql_v3` scalar surface is covered by **generated** fixtures, not committed -ones. They are produced by the Rust fixture framework (`tests/sqlx/src/fixtures/`, -driven by `eql-scalars::CATALOG`) and **never committed** — `.gitignore:225-230` -ignores `eql_v3*`, `v3_ste_vec.sql`, `v3_doc_int4.sql`, and -`v3_numeric_collision.sql`. - -`eql_v3_int4` was the first of these and is the bootstrap reference that the -codegen was built against; it is **not** a special case. Every scalar type the -catalog generates (`int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, -`text`, `bool`, `float4`, `float8`) gets the same generated fixture family. - -**Members (all in this directory, all gitignored):** - -| Fixture | Payload type | Notes | -|---------|--------------|-------| -| `eql_v3_.sql` | `jsonb` | One row per catalog `Fixture` value for type ``. No EQL dependency — applies standalone. | -| `eql_v3__doubles.sql` | `jsonb` | Same value set, each plaintext emitted **twice** (distinct ciphertexts, identical `hm`/`ob` terms). Exercises equality grouping and MIN/MAX tie-breaking. | -| `v3_numeric_collision.sql` | `jsonb` | Numeric values that collide under normalisation. No EQL dependency. | -| `v3_doc_int4.sql` | `eql_v3.json` | Document-shaped payload; **depends on the `eql_v3` surface** (the `eql_v3.json` domain must exist). | -| `v3_ste_vec.sql` | `eql_v3.json` | SteVec document fixture (formerly the committed `v3_ste_vec.sql` blob; now generated through the same `FixtureSpec` machinery). **Depends on the `eql_v3` surface.** | - -**Regenerated every test run.** `mise run test:sqlx:prep` runs -`fixture:generate:all` before `cargo test`, so a stale fixture cannot mask a -payload-shape regression. The generator encrypts in-process via -`cipherstash-client`; it needs a live Postgres plus **both** CipherStash -credential pairs in the shell environment (they are not alternatives): -`CS_CLIENT_ACCESS_KEY` + `CS_WORKSPACE_CRN` for ZeroKMS auth (AutoStrategy) -**and** `CS_CLIENT_ID` + `CS_CLIENT_KEY` for the client key (EnvKeyProvider). -Each file carries an `AUTO-GENERATED ... DO NOT EDIT BY HAND` header and is -overwritten in place on every run. - -**Schema:** Every generated fixture lives in the dedicated `fixtures` SQL schema -(kept out of the `public`/`eql_v3` type namespace) with the same column shape — -only the `plaintext`/`payload` types vary per the table above: +The scalar fixtures (`eql_v3_.sql`) have **no EQL dependency** — `payload` is +plain `jsonb`, so each script applies standalone. The document fixtures +(`v3_doc_int4.sql`, `v3_ste_vec.sql`) depend on the `eql_v3` encrypted-JSONB +surface being installed. + +**Regenerated every test run.** `mise run test:sqlx` invokes the generator +before `cargo test`, so a stale committed fixture cannot mask a payload-shape +regression. The generator encrypts in-process via `cipherstash-client`; it +needs a live Postgres plus **both** CipherStash credential pairs in the shell +environment (they are not alternatives): `CS_CLIENT_ACCESS_KEY` + +`CS_WORKSPACE_CRN` for ZeroKMS auth (AutoStrategy) **and** `CS_CLIENT_ID` + +`CS_CLIENT_KEY` for the client key (EnvKeyProvider). Do not hand-edit a +generated file; it is overwritten in place on every run. + +**Schema (e.g. `eql_v3_int4`):** Tables live in the dedicated `fixtures` SQL +schema (kept out of the `public`/`eql_v3` type namespaces): ```sql CREATE SCHEMA IF NOT EXISTS fixtures; CREATE TABLE fixtures.eql_v3_int4 ( id BIGINT PRIMARY KEY, - plaintext integer NOT NULL, -- the per-type plaintext column - payload jsonb NOT NULL -- jsonb, or eql_v3.json for the document fixtures + plaintext integer NOT NULL, + payload jsonb NOT NULL ); ``` -**Data conventions:** -- One row per generated value; `id = N` is the Nth value, in catalog order. -- For `int4`, the value set MUST include the signed extremes (`i32::MIN`/ - `i32::MAX`) and zero — they are the matrix comparison pivots. Other types - follow the same "extremes + zero/empty + representative magnitudes" shape - from their `CATALOG` `Fixture` list. +**Data:** +- One row per generated value; `id = N` is the Nth generated value. +- `plaintext` values include the type extremes and zero (the matrix comparison + pivots) plus small/medium/large magnitudes. - `plaintext` is the **in-table oracle**: consuming tests filter `WHERE plaintext = N` directly, so no Rust value constant is shared. -- Each `jsonb` `payload` is a cipherstash-client-encrypted object carrying +- Each `payload` is a cipherstash-client-encrypted JSONB object carrying `c` (ciphertext), `hm` (HMAC equality term), `ob` (ORE block ordering term), - an inert `i` metadata object, and the EQL v2 root discriminator + an inert `i` metadata object, and the EQL payload discriminator (`k = "ct"`, `v = 2`). **Used By:** -- `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` +- the `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` (structural verification, generated per type) -- the per-type `eql_v3.` domain operator tests, via per-query `payload` casts +- the `eql_v3.` domain operator / property tests, via per-query `payload` + casts -**Opt-in:** Not migrations — SQLx fixture scripts. Each consuming test opts in -explicitly (by file stem): +**Opt-in:** Each consuming test opts in explicitly: ```rust #[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] ``` --- -## Validation Tests - -Each fixture should have a validation test to ensure correct structure: - -### encrypted_json Validation -```rust -#[sqlx::test(fixtures(path = "../fixtures", scripts("encrypted_json")))] -async fn fixture_encrypted_json_has_three_records(pool: PgPool) { - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM encrypted") - .fetch_one(&pool) - .await - .unwrap(); - assert_eq!(count, 3, "encrypted_json fixture should create 3 records"); -} -``` - -### ore Migration Validation -```rust -#[sqlx::test] -async fn fixture_ore_data_has_99_records(pool: PgPool) { - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM ore") - .fetch_one(&pool) - .await - .unwrap(); - assert_eq!(count, 99, "ore migration should provide 99 records"); -} -``` - ---- - ## Fixture Naming Conventions -- Use snake_case for fixture file names -- Name should describe the data, not the test using it -- Examples: `encrypted_json.sql`, `array_data.sql`, `bench_data.sql` - -## Adding New Fixtures - -This applies to **committed, hand-written** fixtures only. To add or change an -`eql_v3` scalar fixture, **do not write SQL by hand** — edit the catalog row in -`eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) and let -`mise run fixture:generate:all` regenerate the gitignored file. See -[Generated eql_v3 fixtures](#generated-eql_v3-fixtures). - -1. Create fixture file in `tests/sqlx/fixtures/` -2. Add header comment explaining purpose and dependencies -3. Document schema in this file -4. Add validation test -5. Update dependency graph above +- Use snake_case for fixture file names. +- Generated scalar fixtures follow `eql_v3_.sql`. ## Troubleshooting **Fixture fails to load:** -- Check EQL extension is installed (migrations run first) -- Verify `create_encrypted_json()` function exists -- Check for SQL syntax errors in fixture file +- Check the `eql_v3` extension is installed (the `001_install_eql.sql` + migration runs first). +- Confirm the generator ran — `mise run fixture:generate:all` (or + `mise run test:sqlx`, which runs it for you). +- Check for SQL syntax errors in the generated file. **Inconsistent test results:** -- Fixtures are loaded per-test (isolated) -- Check fixture dependencies are correct -- Verify no cross-fixture table name conflicts +- Fixtures are loaded per-test (isolated). +- Verify the CipherStash credentials are present so the generator produces real + ciphertexts (the suite does not ship static fixtures). diff --git a/tests/sqlx/fixtures/aggregate_minmax_data.sql b/tests/sqlx/fixtures/aggregate_minmax_data.sql deleted file mode 100644 index c635f88d1..000000000 --- a/tests/sqlx/fixtures/aggregate_minmax_data.sql +++ /dev/null @@ -1,38 +0,0 @@ --- Fixture: aggregate_minmax_data.sql --- Test data for eql_v2.min() and eql_v2.max() aggregate functions --- --- Creates table with encrypted integer data including NULL values --- to test aggregate functions on encrypted columns - --- Create table (drop first for idempotency) -DROP TABLE IF EXISTS agg_test; -CREATE TABLE agg_test -( - plain_int integer, - enc_int eql_v2_encrypted -); - --- Add data. These are encrypted values from the SQL test file. --- Decrypted `enc_int` value is the same as the `plain_int` value in the same row. -INSERT INTO agg_test (plain_int, enc_int) VALUES -( - NULL, - NULL -), -( - 3, - '{"c": "mBbJyWl%QyVQT_N?b~OpQj!$J7B7H2CK@gB#`36H312|)kY;SeM7R*dAl5{R*U)AI+$~k7(JPvj;hmQK^F_}g^7Zs^WuYa^B(7y{V{&N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "bf": null, "ob": ["ccccccccb06565ebd23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384e9e378f4f5890c31ca9d115965a0e8fbf13ad8d1d33f88d360d5e2f9680fb158f98158443ffc769cd9aac94380f05e3226b785f58006e5b9da6b8d86a7441a88fd848099a2400ef59b494b0c30013568dc1be9bba560565fccb49309ba2ec3edcff6f9d7a67b519b3754b37b0025dff7592a6117949a04043c100353289628884fe06cb2099e7b4b49abea9797a73ee0b85283a5b6f69bcf45f87e6cd6d45ecfd1633903270781173ed9d31a682bba0e54ff355f456bf0c468e378e41cb54fcc074ad40fb4448f6fec892c1ecda15a5efffb8dde3a3b282865ac436d7e43d48d4327c439956733697d3f5b02ead4805a7f905bdae24c1b35252e34939676a07ddb5454c3580c7d76d792a97988e35142f43667112432623eda5126e9af2592dd"], "v": 1}'::jsonb::eql_v2_encrypted -), -( - 5, - '{"c": "mBbKSqWLK6yl>o%G%&x+2$jdg7F`-R(^>R1Q^wGod8-FZ5C$xFI4dN?Ap114=77xPZ9!cKxE}qmyXrhx#K`4ztbUrysQrOFqON6bV{&N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "bf": null, "ob": ["ccccccccb065659dd23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384bec7bfb23290d7559fd8637b85ca7510cca465570029734ef0319c77177913ad84f54852bed2e2a67b6dafcab3eb70d3a2592414a43acc03703083cf1fa1984dfc0719337d5de4eefd0d137588641a0d38c771b77ab07ebab3fc9bfd7469c4222e1a8edee71188eeb24bfffcd82f711156381d8068223e3d75f5ba8a958182bc46a0ab58c29872cd17e559ed0b935a445249dbac5b51438cebaf9d28d5c8b67cd99f990d5295c1e37470ce5b33fe01eaf31d84c9a08b267c0e9e1aadfcce7f9e2253ababa71eaf1fec309dc988e454717a3c2e3bffb1c546a7195ecf274eb7d691abcf46a61e34d4c63c45d48831dc23aa11f981de692926cd1d1d77a340c9e54baf62da61d5f88960a93e120d3828f4053577b93b536cc9b05c889dcf171865"], "v": 1}'::jsonb::eql_v2_encrypted -), -( - 1, - '{"c": "mBbJSy$p0fHEK%aOAOYi4PTJN7B@a-j{+xl7tffjGTN<-Znt3Zge#lGAX^WHzU`7ml<4vRHLKxoB%}NN2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "bf": null, "ob": ["ccccccccb0656502d23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384250ca116ef329616ddb341917699b9ea48901124a15a4547be1ff7c672c0c1bc6bb17e2a141f46138fc314f4bf8a55068bf031bc48f038c379e54cfbb1c64eb223c18c87cd68a91fb031905e11d9478f158b561399b527038efc594bfd9fb19c963a2778b75215e1d8933b08df04d1c62742fd48a4de310792031a70ca4b157bc218ab3fbadc6dc14b939422023331c03bcf4b673c5d261a19c3d13155cbaa1b84e9e90e389fa6973dde07fba08c13847006707488e288ce780d59700197452ebc68d22032ab03f7b445e45ed7abb1af34955199440f7db2c969c60b1eb49cdcd75d5e8f7de37848ddebb40df8e14d4b92910e15fedac3f61f22ef430805ba1bbf5fccc9fe792e4c0353beee48ca03ef23c7d3fab19e9aa218aefb44e6c26d70"], "v": 1}'::jsonb::eql_v2_encrypted -), -( - 3, - '{"c": "mBbLa7Cm?&jvpfcv1d3hep>s)76qzUbwUky&M&C3mjDG_os-_y0MRaMGl@&p#AOuusN|3Lu=mBCcg_V{&N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "bf": null, "ob": ["ccccccccb06565ebd23d6a4c3eee512713175e673c6d995ff5d9b1d3492fe8eb289c3eb95029025f5b71fc6e06632b4a1302980e433361c7999724dbdd052739258d9444b0fbd43cc61368e60f4b0d5aeca2aa85c1c89933b53afffcc4eb0632dca75f632bb9bc792d1dbd6bced6253291f0db134552d384e9e378f4f5890c31ca9d115965a0e8fb2c3c60ccce84ffc03bddb22b27a1ce278eec118496fd23f083ebb21bb4b83b89eda8c0bdea50debc5ec4f2b2d91b63a80d39386194ad9d129bee2f5168341cb41ed26dc03466cac5e2dbe7336fdb74c0d37d63b396033ce60002c9950f5ac2970dacf4caace2eef5b81544df88a7ef2a8d69550d25d39c678c8e43a3dcc2857018a2c979b45c6b19dabd28ae7388d62916e6742763d6484d1b45154e6c8e6a66e02b03f64b67ddef24747dded32e226e3a93d5d1a92d11e760403cad04a0dd07c14da336a409739e8bbeb3b3d6b92117fa2d2c941da4996ea61b29ca3fffb4594ddbeab7105a1b4c5e422ec5ab8154db545103d8c2889be2e4591198912446d8b33b8708a4cc959a1e0957dcae6a50c3"], "v": 1}'::jsonb::eql_v2_encrypted -) -; diff --git a/tests/sqlx/fixtures/array_data.sql b/tests/sqlx/fixtures/array_data.sql deleted file mode 100644 index c90e78c33..000000000 --- a/tests/sqlx/fixtures/array_data.sql +++ /dev/null @@ -1,16 +0,0 @@ --- Fixture: array_data.sql --- --- DEPENDS ON: encrypted_json.sql (requires 'encrypted' table to exist) --- --- Adds encrypted record with array field to existing 'encrypted' table --- Plaintext: {"hello": "four", "n": 20, "a": [1, 2, 3, 4, 5]} --- --- Array selectors: --- $.a[*] (elements) -> f510853730e1c3dbd31b86963f029dd5 --- $.a (array root) -> 33743aed3ae636f6bf05cff11ac4b519 --- --- Note: This fixture adds one additional record (ID 4) to the three base records --- created by encrypted_json.sql - --- Insert array data using test helper -SELECT seed_encrypted(get_array_ste_vec()::eql_v2_encrypted); diff --git a/tests/sqlx/fixtures/bench_data.sql b/tests/sqlx/fixtures/bench_data.sql deleted file mode 100644 index dec1a4fc2..000000000 --- a/tests/sqlx/fixtures/bench_data.sql +++ /dev/null @@ -1,25 +0,0 @@ --- Fixture: bench_data.sql --- --- Seeds 10K rows into the bench table for performance testing. --- Each column draws independently from 99 distinct create_encrypted_json() inputs --- (helper ids 1-99) using a Zipf-like skew so the planner sees realistic histograms. --- create_encrypted_json(id) maps helper ids to ORE rows at id * 10 (helper ids 1-99 → --- ORE rows 10, 20, ..., 990). --- --- Index terms per row: hm (hmac), b3 (blake3), bf (bloom filter), ob (ORE blocks), sv (STE vec) --- Data generated via create_encrypted_json() from 004_install_test_helpers.sql. --- --- Distribution: --- Deterministic via setseed(0.42) — byte-identical across runs. --- random()^2 produces a power-law skew: P(id=k) is proportional to 1/sqrt(k). --- Top id gets ~5% of rows (~500); tail ids get ~0.5% each (~50). Ratio ~10x. --- Three independent draws per row decorrelate the columns. - -SELECT setseed(0.42); - -INSERT INTO bench (encrypted_text, encrypted_int, encrypted_bigint) -SELECT - create_encrypted_json(1 + floor(99 * power(random(), 2))::int), - create_encrypted_json(1 + floor(99 * power(random(), 2))::int), - create_encrypted_json(1 + floor(99 * power(random(), 2))::int) -FROM generate_series(1, 10000); diff --git a/tests/sqlx/fixtures/bench_setup.sql b/tests/sqlx/fixtures/bench_setup.sql deleted file mode 100644 index 0f9979403..000000000 --- a/tests/sqlx/fixtures/bench_setup.sql +++ /dev/null @@ -1,31 +0,0 @@ --- Fixture: bench_setup.sql --- --- Creates benchmark indexes and refreshes planner statistics. --- Table DDL from migration 007_install_bench_data.sql; 10K rows from bench_data.sql fixture. --- --- Indexes: --- bench_text_hmac_idx - hash on eql_v2.hmac_256(encrypted_text) for equality --- bench_text_ore_idx - btree on encrypted_text via operator class for text ordering --- bench_int_ore_idx - btree on encrypted_int via operator class for range/ORDER BY --- bench_bigint_ore_idx - btree on encrypted_bigint via operator class --- bench_text_bloom_idx - GIN on eql_v2.bloom_filter(encrypted_text) for containment --- --- Pattern follows containment_with_index_tests.rs: indexes in fixture (not migration) --- so tests can verify before/after index creation. - -CREATE INDEX IF NOT EXISTS bench_text_hmac_idx - ON bench USING hash (eql_v2.hmac_256(encrypted_text)); - -CREATE INDEX IF NOT EXISTS bench_text_ore_idx - ON bench USING btree (encrypted_text eql_v2.encrypted_operator_class); - -CREATE INDEX IF NOT EXISTS bench_int_ore_idx - ON bench USING btree (encrypted_int eql_v2.encrypted_operator_class); - -CREATE INDEX IF NOT EXISTS bench_bigint_ore_idx - ON bench USING btree (encrypted_bigint eql_v2.encrypted_operator_class); - -CREATE INDEX IF NOT EXISTS bench_text_bloom_idx - ON bench USING gin (eql_v2.bloom_filter(encrypted_text)); - -ANALYZE bench; diff --git a/tests/sqlx/fixtures/config_tables.sql b/tests/sqlx/fixtures/config_tables.sql deleted file mode 100644 index 07c6c4ae1..000000000 --- a/tests/sqlx/fixtures/config_tables.sql +++ /dev/null @@ -1,15 +0,0 @@ --- Fixture for config tests - -DROP TABLE IF EXISTS users CASCADE; -CREATE TABLE users ( - id bigint GENERATED ALWAYS AS IDENTITY, - name eql_v2_encrypted, - PRIMARY KEY(id) -); - -DROP TABLE IF EXISTS blah CASCADE; -CREATE TABLE blah ( - id bigint GENERATED ALWAYS AS IDENTITY, - vtha eql_v2_encrypted, - PRIMARY KEY(id) -); diff --git a/tests/sqlx/fixtures/constraint_tables.sql b/tests/sqlx/fixtures/constraint_tables.sql deleted file mode 100644 index 46efe2cab..000000000 --- a/tests/sqlx/fixtures/constraint_tables.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Fixture for constraint tests -DROP TABLE IF EXISTS constrained CASCADE; -CREATE TABLE constrained ( - id bigint GENERATED ALWAYS AS IDENTITY, - unique_field eql_v2_encrypted UNIQUE, - not_null_field eql_v2_encrypted NOT NULL, - check_field eql_v2_encrypted CHECK (check_field IS NOT NULL), - PRIMARY KEY(id) -); diff --git a/tests/sqlx/fixtures/drop_operator_classes.sql b/tests/sqlx/fixtures/drop_operator_classes.sql deleted file mode 100644 index 13d1d350d..000000000 --- a/tests/sqlx/fixtures/drop_operator_classes.sql +++ /dev/null @@ -1,32 +0,0 @@ --- Drop operator classes and operators to simulate Supabase environment --- The Supabase build excludes all operator classes AND the ore_block_u64_8_256 --- operators/operator class. This means neither ORDER BY e nor --- ORDER BY eql_v2.order_by(e) can use ORE-aware sorting. - --- Drop btree operator class for eql_v2_encrypted -DROP OPERATOR CLASS IF EXISTS eql_v2.encrypted_operator_class USING btree CASCADE; -DROP OPERATOR FAMILY IF EXISTS eql_v2.encrypted_operator_family USING btree CASCADE; - --- Drop hash operator class for eql_v2_encrypted -DROP OPERATOR CLASS IF EXISTS eql_v2.encrypted_hash_operator_class USING hash CASCADE; -DROP OPERATOR FAMILY IF EXISTS eql_v2.encrypted_hash_operator_family USING hash CASCADE; - --- Drop btree operator class for ore_block_u64_8_256 --- This is excluded from the Supabase build and is what makes ORDER BY eql_v2.order_by(e) work -DROP OPERATOR CLASS IF EXISTS eql_v2.ore_block_u64_8_256_operator_class USING btree CASCADE; -DROP OPERATOR FAMILY IF EXISTS eql_v2.ore_block_u64_8_256_operator_family USING btree CASCADE; - --- Drop the self-contained eql_v3 ORE btree operator class too — its file carries --- the `*operator_class.sql` suffix, so the Supabase build's `**/*operator_class.sql` --- glob excludes it as well. Without this the unqualified-name opclass check below --- still finds the eql_v3 copy. -DROP OPERATOR CLASS IF EXISTS eql_v3.ore_block_256_operator_class USING btree CASCADE; -DROP OPERATOR FAMILY IF EXISTS eql_v3.ore_block_256_operator_family USING btree CASCADE; - --- Drop ore_block_u64_8_256 operators (also excluded from Supabase build) -DROP OPERATOR IF EXISTS = (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; -DROP OPERATOR IF EXISTS <> (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; -DROP OPERATOR IF EXISTS < (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; -DROP OPERATOR IF EXISTS <= (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; -DROP OPERATOR IF EXISTS > (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; -DROP OPERATOR IF EXISTS >= (eql_v2.ore_block_u64_8_256, eql_v2.ore_block_u64_8_256) CASCADE; diff --git a/tests/sqlx/fixtures/encrypted_json.sql b/tests/sqlx/fixtures/encrypted_json.sql deleted file mode 100644 index a71c61d75..000000000 --- a/tests/sqlx/fixtures/encrypted_json.sql +++ /dev/null @@ -1,23 +0,0 @@ --- Fixture: encrypted_json.sql --- --- Creates base test data with three encrypted records --- Plaintext structure: {"hello": "world", "n": N} --- where N is 10, 20, or 30 for records 1, 2, 3 --- --- Selectors: --- $ (root) -> bca213de9ccce676fa849ff9c4807963 --- $.hello -> a7cea93975ed8c01f861ccb6bd082784 --- $.n -> 2517068c0d1f9d4d41d2c666211f785e - --- Create table -CREATE TABLE IF NOT EXISTS encrypted ( - id bigint GENERATED ALWAYS AS IDENTITY, - e eql_v2_encrypted, - PRIMARY KEY(id) -); - --- Insert three base records using test helper --- These call the existing SQL helper functions -SELECT seed_encrypted(create_encrypted_json(1)); -SELECT seed_encrypted(create_encrypted_json(2)); -SELECT seed_encrypted(create_encrypted_json(3)); diff --git a/tests/sqlx/fixtures/encryptindex_tables.sql b/tests/sqlx/fixtures/encryptindex_tables.sql deleted file mode 100644 index fcdc5ba70..000000000 --- a/tests/sqlx/fixtures/encryptindex_tables.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Fixture for encryptindex tests --- Referenced by: tests/sqlx/tests/encryptindex_tests.rs --- --- Creates a users table with plaintext columns for testing encrypted column --- creation and management operations - -DROP TABLE IF EXISTS users CASCADE; -CREATE TABLE users ( - id bigint GENERATED ALWAYS AS IDENTITY, - name TEXT, - email INT, - PRIMARY KEY(id) -); diff --git a/tests/sqlx/fixtures/match_data.sql b/tests/sqlx/fixtures/match_data.sql deleted file mode 100644 index 7e8c5ec89..000000000 --- a/tests/sqlx/fixtures/match_data.sql +++ /dev/null @@ -1,28 +0,0 @@ --- Fixture: match_data.sql --- --- Creates test data for LIKE operator tests (~~ and ~~* operators) --- Tests encrypted-to-encrypted matching using bloom filter indexes --- --- Plaintext structure: {"hello": "world", "n": N} --- where N is 1, 2, or 3 for records 1, 2, 3 - --- Create table for LIKE operator tests -DROP TABLE IF EXISTS encrypted CASCADE; -CREATE TABLE encrypted ( - id bigint GENERATED ALWAYS AS IDENTITY, - e eql_v2_encrypted, - PRIMARY KEY(id) -); - --- Apply the production CHECK constraint. Rows are loaded via --- `create_encrypted_json()`, which emits real EQL payloads — the --- constraint guards against future regressions that would let a malformed --- payload through the LIKE-test seed path. See the note in --- `tests/sqlx/migrations/003_install_ste_vec_data.sql`. -SELECT eql_v2.add_encrypted_constraint('encrypted', 'e'); - --- Insert three base records using test helper --- These records contain bloom filter indexes for LIKE operations -SELECT seed_encrypted(create_encrypted_json(1)); -SELECT seed_encrypted(create_encrypted_json(2)); -SELECT seed_encrypted(create_encrypted_json(3)); diff --git a/tests/sqlx/fixtures/order_by_null_data.sql b/tests/sqlx/fixtures/order_by_null_data.sql deleted file mode 100644 index 27e11bb85..000000000 --- a/tests/sqlx/fixtures/order_by_null_data.sql +++ /dev/null @@ -1,30 +0,0 @@ --- Fixture: order_by_null_data.sql --- Test data for ORDER BY NULL ordering tests on encrypted columns --- --- Creates table with NULL and ORE-encrypted values for testing --- NULLS FIRST / NULLS LAST ordering behavior --- --- Data layout: --- ID=1: NULL --- ID=2: ore value for 42 --- ID=3: ore value for 3 --- ID=4: NULL - -DROP TABLE IF EXISTS encrypted; -CREATE TABLE encrypted -( - id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - e eql_v2_encrypted -); - --- Insert NULL (id=1) -INSERT INTO encrypted(e) VALUES (NULL::jsonb::eql_v2_encrypted); - --- Insert ore value for 42 (id=2) -INSERT INTO encrypted(e) SELECT e FROM ore WHERE id = 42; - --- Insert ore value for 3 (id=3) -INSERT INTO encrypted(e) SELECT e FROM ore WHERE id = 3; - --- Insert NULL (id=4) -INSERT INTO encrypted(e) VALUES (NULL::jsonb::eql_v2_encrypted); From 261fcee9e0f165aa7e8078755b589bcb3690832d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 14:42:24 +1000 Subject: [PATCH 322/599] feat(v3): port the EQL linter to eql_v3.lints() (self-contained) --- src/v3/lint/lints.sql | 355 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 src/v3/lint/lints.sql diff --git a/src/v3/lint/lints.sql b/src/v3/lint/lints.sql new file mode 100644 index 000000000..5714b3e21 --- /dev/null +++ b/src/v3/lint/lints.sql @@ -0,0 +1,355 @@ +-- REQUIRE: src/v3/schema.sql + +--! @brief EQL lint: detect non-inlinable operator implementation functions +--! +--! Returns one row per violation found in the installed `eql_v3` surface. The +--! Postgres planner can only inline a function during index matching when: +--! +--! * `LANGUAGE sql` (plpgsql / C / etc. cannot be inlined) +--! * `IMMUTABLE` or `STABLE` volatility (VOLATILE cannot be inlined into +--! index expressions) +--! * No `SET` clauses (e.g. `SET search_path = ...`) +--! * Not `SECURITY DEFINER` +--! * Single-statement SELECT body +--! +--! @note The single-statement SELECT body condition is **not yet checked** by +--! this lint. A `LANGUAGE sql` function with a multi-statement body, a CTE, +--! or any pre-SELECT statement will pass all four implemented checks while +--! remaining non-inlinable. Implementing the check requires walking `prosrc` +--! (or `pg_get_functiondef`); tracked as a follow-up. +--! +--! Operators on `eql_v3` types (the jsonb-backed encrypted-domain families and +--! the SEM index-term types `eql_v3.ore_block_256`, `eql_v3.ore_cllw`) whose +--! implementation functions fail any of these rules silently fall back to seq +--! scan when the documented functional indexes (`eql_v3.eq_term(col)`, +--! `eql_v3.ord_term(col)`) are in place. This lint surfaces every such case. +--! +--! Severity: +--! `error` — fixable, blocks index matching, ship-blocking. +--! `warning` — likely-fixable, may not block matching but signals intent. +--! `info` — observational; useful for review, not a defect on its own. +--! +--! Categories: +--! `inlinability_language` — implementation function isn't `LANGUAGE sql`. +--! `inlinability_volatility` — implementation function is VOLATILE. +--! `inlinability_set_clause` — implementation function has a `SET` clause. +--! `inlinability_secdef` — implementation function is `SECURITY DEFINER`. +--! `inlinability_transitive` — implementation function is itself inlinable +--! but its body invokes a non-inlinable function +--! (depth 1; the planner can't peek through +--! that boundary). +--! `blocker_language` — encrypted-domain blocker is not LANGUAGE +--! plpgsql. The planner can inline / elide a +--! LANGUAGE sql body when the result is +--! provably unused, silently bypassing the +--! RAISE that the blocker exists to perform. +--! `blocker_strict` — encrypted-domain blocker is STRICT. +--! PostgreSQL skips the body and returns NULL +--! on NULL arguments, silently bypassing the +--! RAISE. +--! `domain_over_domain` — an `eql_v3` encrypted domain is derived from +--! another encrypted domain rather than jsonb. +--! Operators resolve against the ultimate base +--! type, so the derived domain does not +--! inherit the base domain's blocker surface. +--! `domain_opclass` — an operator class is declared FOR TYPE on an +--! `eql_v3` encrypted domain. Opclasses on +--! domains bypass operator resolution; use a +--! functional index on the extractor instead. +--! +--! @example +--! ``` +--! SELECT severity, category, object_name, message +--! FROM eql_v3.lints() +--! WHERE severity = 'error' +--! ORDER BY category, object_name; +--! ``` +--! +--! @return SETOF record (severity text, category text, object_name text, message text) +CREATE OR REPLACE FUNCTION eql_v3.lints() +RETURNS TABLE ( + severity text, + category text, + object_name text, + message text +) +LANGUAGE sql STABLE +AS $$ + WITH + -- All operators where at least one operand is an `eql_v3` type. Limits + -- the scope of the lint to the operator surface customers actually hit + -- via SQL (`col = val`, `col @> '...'` and friends). + eql_operators AS ( + SELECT + op.oid AS oprid, + op.oprname AS opname, + op.oprcode AS implfunc, + op.oprleft::regtype AS lhs, + op.oprright::regtype AS rhs, + op.oprcode::regprocedure AS impl_signature + FROM pg_operator op + WHERE EXISTS ( + SELECT 1 FROM pg_type t + WHERE t.oid IN (op.oprleft, op.oprright) + AND t.typnamespace = 'eql_v3'::regnamespace + ) + ), + + -- Cross-join with each operator's implementation function metadata. + -- One row per operator; columns describe the inlinability of the impl. + op_impl AS ( + SELECT + eo.opname, + eo.lhs, + eo.rhs, + eo.implfunc AS impl_oid, + eo.impl_signature::text AS impl_signature, + lang_l.lanname AS lang, + p.provolatile AS volatility, + p.proconfig AS config, + p.prosecdef AS secdef, + p.prosrc AS body + FROM eql_operators eo + JOIN pg_proc p ON p.oid = eo.implfunc + JOIN pg_language lang_l ON lang_l.oid = p.prolang + ), + + -- Encrypted-domain blockers: functions in `eql_v3` whose body contains + -- a blocker marker emitted by the codegen (any of the + -- `encrypted_domain_unsupported_*` helper calls — `_bool` for boolean + -- blockers, `_jsonb` for the native-jsonb-operator blockers; plus the + -- literal `is not supported for` for older path-operator blockers) AND + -- that take at least one `eql_v3` domain over jsonb argument. The argument + -- filter excludes the shared `encrypted_domain_unsupported_*(text, text)` + -- helpers themselves, which contain the marker in their body but are not + -- blockers (they take text arguments, not a domain). + encrypted_domain_blockers AS ( + SELECT + p.oid AS oid, + p.oid::regprocedure::text AS signature, + lang_l.lanname AS lang, + p.proisstrict AS isstrict + FROM pg_catalog.pg_proc p + JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace + JOIN pg_catalog.pg_language lang_l ON lang_l.oid = p.prolang + WHERE n.nspname = 'eql_v3' + AND (p.prosrc LIKE '%encrypted_domain_unsupported%' + OR p.prosrc LIKE '%is not supported for%') + AND EXISTS ( + SELECT 1 + FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) + JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + WHERE dt.typtype = 'd' + AND bt.typname = 'jsonb' + AND dn.nspname = 'eql_v3' + ) + ) + + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Direct inlinability checks: each row examines one operator's │ + -- │ implementation function and emits a violation if any rule is │ + -- │ broken. Multiple violations on the same function become │ + -- │ multiple rows (developers see every reason it doesn't inline). │ + -- └─────────────────────────────────────────────────────────────────┘ + + SELECT + 'error' AS severity, + 'inlinability_language' AS category, + format('operator %s(%s, %s) -> %s', + opname, lhs, rhs, impl_signature) AS object_name, + format( + 'Operator implementation function is `LANGUAGE %s`; only `LANGUAGE sql` functions can be inlined by the planner. Bare `col %s val` queries fall back to seq scan even when a matching functional index exists.', + lang, opname) AS message + FROM op_impl + WHERE lang <> 'sql' + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) + + UNION ALL + + SELECT + 'error', + 'inlinability_volatility', + format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature), + format( + 'Operator implementation function is `VOLATILE`. The Postgres planner refuses to inline volatile functions into index expressions, so functional indexes never engage. Mark the function `IMMUTABLE` (or `STABLE` if it depends on session state).', + opname) + FROM op_impl + WHERE volatility = 'v' + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) + + UNION ALL + + SELECT + 'error', + 'inlinability_set_clause', + format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature), + format( + 'Operator implementation function has a `SET` clause (e.g. `SET search_path = ...`). Per Postgres function-inlining rules, any `SET` clause blocks inlining. Use schema-qualified identifiers in the body and remove the `SET` clause to allow the planner to inline.') + FROM op_impl + WHERE config IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) + + UNION ALL + + SELECT + 'error', + 'inlinability_secdef', + format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature), + 'Operator implementation function is `SECURITY DEFINER`. Such functions cannot be inlined; remove `SECURITY DEFINER` or use a non-inlinable wrapper layer.' + FROM op_impl + WHERE secdef + AND NOT EXISTS ( + SELECT 1 FROM encrypted_domain_blockers b + WHERE b.oid = op_impl.impl_oid + ) + + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Transitive inlinability: an operator implementation function │ + -- │ that's itself inlinable can still fail to inline if its body │ + -- │ calls a non-inlinable function. Walk one level via pg_depend. │ + -- │ │ + -- │ Postgres records function-to-function dependencies in │ + -- │ pg_depend with deptype 'n' (normal) when one function references│ + -- │ another in its body — but only at CREATE time and only for │ + -- │ direct calls. This is good enough for v1; deeper transitive │ + -- │ analysis is a follow-up. │ + -- └─────────────────────────────────────────────────────────────────┘ + + UNION ALL + + SELECT + 'error', + 'inlinability_transitive', + format('operator %s(%s, %s) -> %s', oi.opname, oi.lhs, oi.rhs, + oi.impl_signature), + format( + 'Operator implementation function is inlinable but invokes non-inlinable function `%s` (lang=%s, volatility=%s%s). The chain blocks at depth 1: the planner inlines the outer call but cannot reduce the inner call into an index expression.', + called.proname, + called_lang.lanname, + CASE called.provolatile + WHEN 'i' THEN 'IMMUTABLE' + WHEN 's' THEN 'STABLE' + WHEN 'v' THEN 'VOLATILE' + END, + CASE WHEN called.proconfig IS NOT NULL + THEN ', has SET clause' + ELSE '' END) + FROM op_impl oi + -- Only worth the transitive check if the outer function is otherwise + -- inlinable — otherwise the direct lints above already report it. + JOIN pg_proc outer_p ON outer_p.oid = oi.impl_signature::regprocedure + JOIN pg_depend d + ON d.classid = 'pg_proc'::regclass + AND d.objid = outer_p.oid + AND d.refclassid = 'pg_proc'::regclass + AND d.deptype = 'n' + JOIN pg_proc called ON called.oid = d.refobjid + JOIN pg_language called_lang ON called_lang.oid = called.prolang + WHERE oi.lang = 'sql' + AND oi.volatility IN ('i', 's') + AND oi.config IS NULL + AND NOT oi.secdef + AND called.oid <> outer_p.oid + AND ( + called_lang.lanname <> 'sql' + OR called.provolatile = 'v' + OR called.proconfig IS NOT NULL + OR called.prosecdef + ) + + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Encrypted-domain footguns: blockers exist to RAISE, so they │ + -- │ have inverted inlinability requirements vs operator impls. │ + -- │ A LANGUAGE sql blocker can be elided by the planner; a STRICT │ + -- │ blocker returns NULL on NULL args. Both silently re-enable │ + -- │ operators the storage variant is supposed to block. │ + -- └─────────────────────────────────────────────────────────────────┘ + + UNION ALL + + SELECT + 'error', + 'blocker_language', + format('function %s', signature), + format( + 'Encrypted-domain blocker is `LANGUAGE %s`; must be `LANGUAGE plpgsql` so the RAISE is opaque to the planner. A `LANGUAGE sql` body is inlinable and may be elided when the result is provably unused, silently re-enabling the operator.', + lang) + FROM encrypted_domain_blockers + WHERE lang <> 'plpgsql' + + UNION ALL + + SELECT + 'error', + 'blocker_strict', + format('function %s', signature), + 'Encrypted-domain blocker is `STRICT`. PostgreSQL skips the body and returns NULL on a NULL argument, silently bypassing the RAISE. Remove `STRICT`.' + FROM encrypted_domain_blockers + WHERE isstrict + + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Domain identity: an encrypted-domain must be defined directly │ + -- │ over jsonb. Operators resolve against the ultimate base type, │ + -- │ so domain-over-domain inherits jsonb's operator surface and not │ + -- │ the base domain's blockers. │ + -- └─────────────────────────────────────────────────────────────────┘ + + UNION ALL + + SELECT + 'error', + 'domain_over_domain', + format('domain %I.%I', dn.nspname, dt.typname), + format( + 'Domain `%s.%s` is derived from another encrypted-domain `%s.%s` rather than jsonb. Operators resolve against the ultimate base type, so the derived domain does not inherit the base domain''s operator surface and storage blockers do not engage. Define this domain directly over jsonb.', + dn.nspname, dt.typname, bn.nspname, bt.typname) + FROM pg_catalog.pg_type dt + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace + WHERE dt.typtype = 'd' + AND dn.nspname = 'eql_v3' + AND bt.typtype = 'd' + AND bn.nspname = 'eql_v3' + + -- ┌─────────────────────────────────────────────────────────────────┐ + -- │ Domain opclass: an operator class declared FOR TYPE on an │ + -- │ encrypted-domain bypasses operator resolution at index time. │ + -- │ Use a functional index on the extractor instead. │ + -- └─────────────────────────────────────────────────────────────────┘ + + UNION ALL + + SELECT + 'error', + 'domain_opclass', + format('opclass %I.%I FOR TYPE %s.%s', cn.nspname, oc.opcname, tn.nspname, t.typname), + format( + 'Operator class `%s.%s` is declared FOR TYPE `%s.%s`, which is an encrypted-domain type. Opclasses on domains bypass operator resolution. Use a functional index on the extractor (e.g. `%s.eq_term(col)`, `%s.ord_term(col)`) instead.', + cn.nspname, oc.opcname, tn.nspname, t.typname, tn.nspname, tn.nspname) + FROM pg_catalog.pg_opclass oc + JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype + JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace + JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace + WHERE t.typtype = 'd' + AND tn.nspname = 'eql_v3' + + ORDER BY 1, 2, 3; +$$; + +COMMENT ON FUNCTION eql_v3.lints() IS + 'EQL lint: returns one row per non-inlinable operator implementation. ' + 'Run `SELECT * FROM eql_v3.lints() WHERE severity = ''error''` for a ' + 'CI-gateable check that all operator implementations on eql_v3 types are ' + 'eligible for planner inlining.'; From 6fd049e016065343d5ed304eaa1d3ad91a97d6ce Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 14:55:52 +1000 Subject: [PATCH 323/599] test(sqlx): repoint mixed tests (lint, build-validation, encrypted_domain) off eql_v2 --- tests/sqlx/tests/build_validation_tests.rs | 133 +----------------- .../tests/encrypted_domain/constraints.rs | 6 +- .../encrypted_domain/family/inlinability.rs | 36 ++--- .../family/jsonb_operator_surface.rs | 18 +-- .../encrypted_domain/family/mutations.rs | 2 +- .../sqlx/tests/encrypted_domain/family/sem.rs | 75 +--------- tests/sqlx/tests/lint_tests.rs | 62 ++------ tests/sqlx/tests/payload_schema_tests.rs | 3 +- 8 files changed, 42 insertions(+), 293 deletions(-) diff --git a/tests/sqlx/tests/build_validation_tests.rs b/tests/sqlx/tests/build_validation_tests.rs index 034c55535..7557987fc 100644 --- a/tests/sqlx/tests/build_validation_tests.rs +++ b/tests/sqlx/tests/build_validation_tests.rs @@ -1,7 +1,7 @@ //! Build output validation tests //! -//! Validates that build variants contain/exclude the expected components. -//! These tests run against the built SQL files, not the database. +//! Validates that the built v3 release artifact contains/excludes the expected +//! components. These tests run against the built SQL files, not the database. use std::fs; use std::path::Path; @@ -13,134 +13,7 @@ fn read_release_sql(filename: &str) -> String { } // ============================================================================= -// Protect Variant Tests -// ============================================================================= - -#[test] -fn protect_variant_file_exists() { - assert!( - Path::new("../../release/cipherstash-encrypt-protect.sql").exists(), - "protect variant installer should exist" - ); -} - -#[test] -fn protect_uninstaller_exists() { - assert!( - Path::new("../../release/cipherstash-encrypt-protect-uninstall.sql").exists(), - "protect variant uninstaller should exist" - ); -} - -#[test] -fn protect_variant_excludes_config_table() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - !sql.contains("CREATE TABLE") || !sql.contains("eql_v2_configuration"), - "protect variant should not contain eql_v2_configuration table" - ); -} - -#[test] -fn protect_variant_excludes_config_state_type() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - !sql.contains("eql_v2_configuration_state"), - "protect variant should not contain eql_v2_configuration_state enum" - ); -} - -#[test] -fn protect_variant_excludes_add_search_config() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - !sql.contains("CREATE FUNCTION eql_v2.add_search_config") - && !sql.contains("CREATE OR REPLACE FUNCTION eql_v2.add_search_config"), - "protect variant should not contain add_search_config function" - ); -} - -#[test] -fn protect_variant_excludes_add_column() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - !sql.contains("CREATE FUNCTION eql_v2.add_column") - && !sql.contains("CREATE OR REPLACE FUNCTION eql_v2.add_column"), - "protect variant should not contain add_column function" - ); -} - -#[test] -fn protect_variant_excludes_migrate_config() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - !sql.contains("CREATE FUNCTION eql_v2.migrate_config") - && !sql.contains("CREATE OR REPLACE FUNCTION eql_v2.migrate_config"), - "protect variant should not contain migrate_config function" - ); -} - -#[test] -fn protect_variant_excludes_create_encrypted_columns() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - !sql.contains("CREATE FUNCTION eql_v2.create_encrypted_columns") - && !sql.contains("CREATE OR REPLACE FUNCTION eql_v2.create_encrypted_columns"), - "protect variant should not contain create_encrypted_columns function" - ); -} - -#[test] -fn protect_variant_excludes_diff_config() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - !sql.contains("CREATE FUNCTION eql_v2.diff_config") - && !sql.contains("CREATE OR REPLACE FUNCTION eql_v2.diff_config"), - "protect variant should not contain diff_config function" - ); -} - -#[test] -fn protect_variant_includes_core_encrypted_type() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - sql.contains("eql_v2_encrypted"), - "protect variant should contain eql_v2_encrypted type" - ); -} - -#[test] -fn protect_variant_includes_operators() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - sql.contains("CREATE OPERATOR"), - "protect variant should contain operators" - ); -} - -#[test] -fn protect_variant_includes_hmac_256() { - let sql = read_release_sql("cipherstash-encrypt-protect.sql"); - assert!( - sql.contains("eql_v2.hmac_256"), - "protect variant should contain hmac_256 index type" - ); -} - -#[test] -fn protect_variant_is_smaller_than_full() { - let protect = read_release_sql("cipherstash-encrypt-protect.sql"); - let full = read_release_sql("cipherstash-encrypt.sql"); - assert!( - protect.len() < full.len(), - "protect variant ({} bytes) should be smaller than full variant ({} bytes)", - protect.len(), - full.len() - ); -} - -// ============================================================================= -// v3-only Variant Tests (design D9/D11 — self-contained eql_v3 surface) +// v3 Variant Tests (the sole self-contained eql_v3 surface) // ============================================================================= #[test] diff --git a/tests/sqlx/tests/encrypted_domain/constraints.rs b/tests/sqlx/tests/encrypted_domain/constraints.rs index 1e0c14422..612fe5798 100644 --- a/tests/sqlx/tests/encrypted_domain/constraints.rs +++ b/tests/sqlx/tests/encrypted_domain/constraints.rs @@ -1,9 +1,7 @@ //! Table-level SQL constraint coverage for `eql_v3` encrypted-domain columns. //! -//! The v2 surface covers UNIQUE / NOT NULL / FOREIGN KEY on `eql_v2_encrypted` -//! columns in `tests/sqlx/tests/constraint_tests.rs`. This is the equivalent -//! coverage for the jsonb-backed `eql_v3.` domains (the reference scalar -//! `int4`). The domains are jsonb under the hood, so a table-level constraint +//! Covers UNIQUE / NOT NULL / FOREIGN KEY on the jsonb-backed `eql_v3.` +//! domains (the reference scalar `int4`). The domains are jsonb under the hood, so a table-level constraint //! constrains the *raw jsonb payload value*, NOT the semantic plaintext or the //! `eq_term` / `ord_term` index term — see the documented findings on each test. //! diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index f91180fff..c99e6a04f 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -1,7 +1,7 @@ //! Global guard for the encrypted-domain inline-critical SQL surface. //! -//! `tasks/pin_search_path.sql` runs after every build and pins a fixed -//! `search_path` on every `eql_v2`/`eql_v3` function — except the +//! `tasks/pin_search_path_v3.sql` runs after every build and pins a fixed +//! `search_path` on every `eql_v3` function — except the //! inline-critical ones, which must stay unpinned so the planner can //! inline them and the documented functional indexes (`eql_v3.eq_term(col)`, //! `eql_v3.ord_term(col)`, …) engage. @@ -10,7 +10,7 @@ //! on the *identity predicate*: a `LANGUAGE sql`, `IMMUTABLE` function //! taking at least one argument typed as a jsonb-backed DOMAIN of the //! encrypted-domain families — a domain in the `eql_v3` schema (e.g. -//! `eql_v3.int4_eq`) or the legacy `public.eql_v2_*` form. The identity +//! `eql_v3.int4_eq`). The identity //! predicate is proconfig-independent — it describes what a function //! intrinsically IS, not whether it has been pinned. //! @@ -22,7 +22,7 @@ //! identity predicate exactly (the guard only adds the offender filter), //! they cannot drift apart on identity. //! -//! A non-empty result means `pin_search_path.sql` pinned an +//! A non-empty result means `pin_search_path_v3.sql` pinned an //! inline-critical encrypted-domain function — index engagement is //! silently broken for that type. This is not int4-specific: a missed //! skip for ANY encrypted-domain type — present or future — fails here, @@ -35,10 +35,10 @@ use sqlx::PgPool; #[sqlx::test] async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> Result<()> { // The identity predicate is shared verbatim with the structural skip - // clause in tasks/pin_search_path.sql: LANGUAGE sql, IMMUTABLE, and + // clause in tasks/pin_search_path_v3.sql: LANGUAGE sql, IMMUTABLE, and // taking at least one argument typed as an encrypted-domain-family - // domain over jsonb (an `eql_v3.*` domain or the legacy - // `public.eql_v2_*` form). It is proconfig-independent. The ONLY + // domain over jsonb (an `eql_v3.*` domain). It is + // proconfig-independent. The ONLY // addition here is the offender filter `p.proconfig IS NOT NULL` — a // function that matches the identity predicate but DID get pinned. // That set must be empty. @@ -49,7 +49,7 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language l ON l.oid = p.prolang - WHERE n.nspname IN ('eql_v2', 'eql_v3') + WHERE n.nspname = 'eql_v3' AND l.lanname = 'sql' AND p.provolatile = 'i' AND p.proconfig IS NOT NULL @@ -63,7 +63,6 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> AND bt.typname = 'jsonb' AND ( dn.nspname = 'eql_v3' - OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') ) ) ORDER BY signature @@ -248,12 +247,12 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( // `count > 0` assertion would still pass while int8/bool/date // domains silently lose inline-critical coverage. Instead, assert // that EVERY inline-critical-eligible domain (any encrypted-domain - // family domain over jsonb — `eql_v3.*` or legacy `public.eql_v2_*` — + // family domain over jsonb — `eql_v3.*` — // that carries a capability suffix — `_eq`, `_ord`, `_ord_ore`) // appears as an argument type of at least one inline-critical // function. // - // Storage-only variants (the bare `eql_v3.` / `eql_v3_` domain, + // Storage-only variants (the bare `eql_v3.` domain, // with no capability suffix) intentionally have NO inline-critical // surface and are excluded from the eligibility set. let unbound: Vec = sqlx::query_scalar( @@ -266,7 +265,6 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( AND bt.typname = 'jsonb' AND ( dn.nspname = 'eql_v3' - OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') ) AND ( dt.typname LIKE '%\_eq' @@ -278,7 +276,7 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language l ON l.oid = p.prolang - WHERE n.nspname IN ('eql_v2', 'eql_v3') + WHERE n.nspname = 'eql_v3' AND l.lanname = 'sql' AND p.provolatile = 'i' AND dt.oid = ANY(p.proargtypes::oid[]) @@ -304,7 +302,7 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( /// on a NULL argument, silently bypassing the RAISE. Either footgun /// re-enables an operator the storage variant exists to block. /// -/// This is a structural guard that does NOT depend on `eql_v2.lints()` — +/// This is a structural guard that does NOT depend on `eql_v3.lints()` — /// a regression to the lint catalog itself cannot hide a regression to /// the blocker surface from this test. #[sqlx::test] @@ -317,7 +315,7 @@ async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> R FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language l ON l.oid = p.prolang - WHERE n.nspname IN ('eql_v2', 'eql_v3') + WHERE n.nspname = 'eql_v3' AND (p.prosrc LIKE '%encrypted_domain_unsupported_bool%' OR p.prosrc LIKE '%is not supported for%') AND EXISTS ( @@ -330,7 +328,6 @@ async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> R AND bt.typname = 'jsonb' AND ( dn.nspname = 'eql_v3' - OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') ) ) AND (l.lanname <> 'plpgsql' OR p.proisstrict) @@ -353,7 +350,7 @@ async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> R /// domain inherits jsonb's operator surface and not the base domain's /// blockers. All family domains must be defined directly over jsonb. #[sqlx::test] -async fn no_eql_v2_domain_is_derived_from_another_eql_v2_domain(pool: PgPool) -> Result<()> { +async fn no_encrypted_domain_is_derived_from_another_encrypted_domain(pool: PgPool) -> Result<()> { let offenders: Vec<(String, String)> = sqlx::query_as( r#" SELECT format('%I.%I', dn.nspname, dt.typname) AS derived, @@ -365,12 +362,10 @@ async fn no_eql_v2_domain_is_derived_from_another_eql_v2_domain(pool: PgPool) -> WHERE dt.typtype = 'd' AND ( dn.nspname = 'eql_v3' - OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') ) AND bt.typtype = 'd' AND ( bn.nspname = 'eql_v3' - OR (bn.nspname = 'public' AND bt.typname LIKE 'eql_v2\_%') ) ORDER BY derived "#, @@ -391,7 +386,7 @@ async fn no_eql_v2_domain_is_derived_from_another_eql_v2_domain(pool: PgPool) -> /// storage blockers depend on. The recommended index pattern is a functional /// index on the extractor (e.g. `eql_v3.eq_term(col)`). #[sqlx::test] -async fn no_opclass_targets_eql_v2_domain(pool: PgPool) -> Result<()> { +async fn no_opclass_targets_encrypted_domain(pool: PgPool) -> Result<()> { let offenders: Vec<(String, String)> = sqlx::query_as( r#" SELECT format('%I.%I', cn.nspname, oc.opcname) AS opclass, @@ -403,7 +398,6 @@ async fn no_opclass_targets_eql_v2_domain(pool: PgPool) -> Result<()> { WHERE t.typtype = 'd' AND ( tn.nspname = 'eql_v3' - OR (tn.nspname = 'public' AND t.typname LIKE 'eql_v2\_%') ) ORDER BY opclass "#, diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index 50a5e9f9e..5c035975b 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -10,10 +10,9 @@ //! version could add a jsonb operator that nobody adds here, and it would //! silently route to native jsonb behaviour. This test closes that gap by //! asking the live catalog which *native* operators touch `jsonb` and failing -//! if any symbol is absent from the known union. EQL's own cross-type operators -//! on the legacy `eql_v2_encrypted` composite (which also take a jsonb operand, -//! e.g. `~~` / `~~*`) are excluded — they are not native and are unreachable -//! from a storage scalar domain. +//! if any symbol is absent from the known union. The `eql_v3` blockers that +//! take a jsonb operand (e.g. `||`, `#>`) reuse native operator symbols that +//! are already in the known union, so they need no special handling. //! //! Source of truth: `crates/eql-codegen/src/operator_surface.rs` (the //! `OPERATORS` const, pinned at 20 entries by its own unit tests). The set @@ -40,22 +39,11 @@ async fn every_native_jsonb_operator_is_known_to_the_generator(pool: PgPool) -> // Distinct operator symbols whose left OR right argument is `jsonb` — the // native surface a value typed as a jsonb-backed domain can reach via // operator resolution against the ultimate base type. - // - // Exclude EQL's own cross-type operators on the legacy `eql_v2_encrypted` - // composite (e.g. `eql_v2_encrypted ~~ jsonb`, `jsonb ~~ eql_v2_encrypted`). - // They take a jsonb operand but are NOT native plaintext-jsonb operators and - // are unreachable from a storage scalar domain: a `eql_v3_int4` operand - // resolves to the domain / its jsonb base, never to `eql_v2_encrypted`, so - // `col ~~ x` finds no operator (asserted by the matrix `native_absent_ops` - // arm). Matching on `typname` is search_path-independent and a harmless - // no-op when the type is absent (e.g. the Protect build variant). let native: Vec = sqlx::query_scalar( r#" SELECT DISTINCT o.oprname FROM pg_catalog.pg_operator o WHERE (o.oprleft = 'jsonb'::regtype OR o.oprright = 'jsonb'::regtype) - AND o.oprleft NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') - AND o.oprright NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') ORDER BY 1 "#, ) diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index e78687af7..c6fa57cbe 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -3,7 +3,7 @@ //! A green matrix proves the SUT behaves correctly *today*, but it cannot //! prove the matrix arms would catch a regression — an arm could be //! vacuous and still pass. Each test here applies one surgical mutation to -//! the installed `eql_v2` schema and asserts that the property a specific +//! the installed `eql_v3` schema and asserts that the property a specific //! matrix arm guards now flips. If a mutation does NOT flip the property, //! that arm has no teeth. //! diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index d13847e5f..93286f7fe 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -2,15 +2,12 @@ //! encrypted-metadata (SEM) index-term functions (`eql_v3.hmac_256`, //! `eql_v3.ore_block_256` and their comparators). //! -//! These functions are a HAND-PORT of the `eql_v2` originals (`src/v3/sem/`). +//! These functions are the self-contained `eql_v3` SEM surface (`src/v3/sem/`). //! The scalar matrix already exercises the happy path of the *array* comparator //! end-to-end against real ciphertext fixtures (ordering, equality, min/max, //! injectivity, index engagement). This file covers the branches the matrix -//! structurally cannot reach, and which are otherwise tested only on the -//! `eql_v2` copies (in `tests/index_compare_tests.rs`): +//! structurally cannot reach: //! -//! - T1: differential v2↔v3 parity on real `ob` fixtures (the strongest guard -//! against a faithful-port slip — see below). //! - T2: the `'Ciphertexts are different lengths'` RAISE (all real fixtures are //! equal length, so the matrix never hits it). //! - T3: NULL-term ordering inside `compare_ore_block_256_term` — the @@ -18,10 +15,8 @@ //! - T4: array-level NULL + empty/cardinality base cases of the recursion. //! - T5: presence checks (`has_*`) and the missing-`ob` RAISE. //! -//! All migrations (`001`–`007`) auto-apply to every `#[sqlx::test]` pool, so the -//! real `ore` table (ids 1–1000) and both schemas are available with no setup. - -use std::collections::HashSet; +//! These tests build terms directly from hex literals, so they need no fixture +//! data or table setup. use anyhow::Result; use eql_tests::assert_raises; @@ -33,65 +28,6 @@ fn term(hex: &str) -> String { format!("ROW(decode('{hex}', 'hex'))::eql_v3.ore_block_256_term") } -/// T1 — Differential parity: the same real `ob` payload must compare identically -/// through the `eql_v2` and `eql_v3` array comparators. `eql_v2` is the trusted -/// oracle; `eql_v3` is the byte-port. Both sides route through the SAME path -/// (jsonb extractor → composite → `compare_ore_block_256_terms`) so the -/// schema prefix is the only variable — any divergence is a genuine port bug. -/// v3 has no encrypted-arg `compare` overload, hence the extractor routing. -#[sqlx::test] -async fn ore_v2_v3_comparator_parity_on_real_fixtures(pool: PgPool) -> Result<()> { - // Pairs spanning equal and unequal ids. Plaintext order of the fixtures is - // undocumented, so we assert v2≡v3 agreement (not a specific sign). - let pairs = [ - (1i64, 1i64), - (1, 2), - (2, 1), - (1, 500), - (500, 1), - (42, 42), - (10, 900), - (900, 10), - ]; - - let sql = r#" - WITH a AS (SELECT e::jsonb AS j FROM ore WHERE id = $1), - b AS (SELECT e::jsonb AS j FROM ore WHERE id = $2) - SELECT - eql_v2.compare_ore_block_u64_8_256_terms( - eql_v2.ore_block_u64_8_256(a.j), eql_v2.ore_block_u64_8_256(b.j)) AS v2, - eql_v3.compare_ore_block_256_terms( - eql_v3.ore_block_256(a.j), eql_v3.ore_block_256(b.j)) AS v3 - FROM a, b - "#; - - let mut v3_signs: HashSet = HashSet::new(); - for (x, y) in pairs { - let (v2, v3): (i32, i32) = sqlx::query_as(sql).bind(x).bind(y).fetch_one(&pool).await?; - assert_eq!( - v2, v3, - "eql_v2 and eql_v3 ORE comparators disagree on ids ({x},{y}): v2={v2} v3={v3}" - ); - v3_signs.insert(v3); - } - - // Non-triviality: the sample must have actually exercised lt, eq, and gt — - // otherwise the parity check could pass on a degenerate all-equal path. - assert!( - v3_signs.contains(&0), - "sample must include an equal pair (0)" - ); - assert!( - v3_signs.contains(&-1), - "sample must include a less-than pair (-1)" - ); - assert!( - v3_signs.contains(&1), - "sample must include a greater-than pair (1)" - ); - Ok(()) -} - /// T2 — The term comparator must reject ciphertexts of different lengths. This /// guard is unreachable via the matrix (every real fixture is equal length). #[sqlx::test] @@ -416,8 +352,7 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { /// (term×term, term[]×term[], composite×composite). Two load-bearing catalog /// properties are pinned at the same layer: /// -/// - `IMMUTABLE` (`provolatile = 'i'`). This deliberately diverges from the -/// `eql_v2` originals, which carry no marker and default to `VOLATILE`. The +/// - `IMMUTABLE` (`provolatile = 'i'`). The /// comparison is deterministic — pgcrypto `encrypt()` is itself `IMMUTABLE` /// — and the marker is what lets the planner fold/cache these in /// ordering/index contexts, so a silent regression to `VOLATILE` (e.g. diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index 025a91a72..2154fca60 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -1,6 +1,6 @@ //! EQL lint runtime tests //! -//! These tests run `eql_v2.lints()` against the installed EQL surface and +//! These tests run `eql_v3.lints()` against the installed EQL surface and //! assert on the shape of the result. //! //! The lint is intentionally noisy on the current state of EQL — every @@ -32,7 +32,7 @@ struct LintRow { async fn fetch_lints(pool: &PgPool) -> Result> { let rows = sqlx::query_as::<_, LintRow>( - "SELECT severity, category, object_name, message FROM eql_v2.lints() ORDER BY category, object_name", + "SELECT severity, category, object_name, message FROM eql_v3.lints() ORDER BY category, object_name", ) .fetch_all(pool) .await?; @@ -41,7 +41,7 @@ async fn fetch_lints(pool: &PgPool) -> Result> { #[sqlx::test] async fn lint_function_exists_and_row_schema_parses(pool: PgPool) -> Result<()> { - // Schema-only check: `eql_v2.lints()` exists and its rows decode into + // Schema-only check: `eql_v3.lints()` exists and its rows decode into // `LintRow`. Previous incarnation asserted `!rows.is_empty()` and so // would fail on a *cleaner* build (e.g. when Phase 1+ removes the // current noisy violations), reading like a regression for a good @@ -102,7 +102,7 @@ async fn lint_categories_are_well_known(pool: PgPool) -> Result<()> { async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v2.test_bad_blocker_sql(a eql_v3.int4, b eql_v3.int4) + CREATE FUNCTION eql_v3.test_bad_blocker_sql(a eql_v3.int4, b eql_v3.int4) RETURNS boolean LANGUAGE sql IMMUTABLE AS $$ SELECT eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '=') $$; "#, @@ -140,7 +140,7 @@ async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { async fn lint_flags_strict_blocker(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v2.test_bad_blocker_strict(a eql_v3.int4, b eql_v3.int4) + CREATE FUNCTION eql_v3.test_bad_blocker_strict(a eql_v3.int4, b eql_v3.int4) RETURNS boolean LANGUAGE plpgsql IMMUTABLE STRICT AS $$ BEGIN RETURN eql_v3.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$; "#, @@ -201,15 +201,15 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( Ok(()) } -/// An `eql_v2_*` domain whose base type is another `eql_v2_*` domain (not -/// jsonb) silently bypasses the storage variant's blockers: operators +/// An `eql_v3` domain whose base type is another `eql_v3` encrypted domain +/// (not jsonb) silently bypasses the storage variant's blockers: operators /// resolve against the ultimate base type, so a derived domain does not /// inherit the base domain's operator surface. See CLAUDE.md footguns. /// This test plants a domain-over-domain offender and asserts the lint /// surfaces it under `domain_over_domain`. #[sqlx::test] async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { - sqlx::query(r#"CREATE DOMAIN public.eql_v2_test_baddom AS eql_v3.int4;"#) + sqlx::query(r#"CREATE DOMAIN eql_v3.test_baddom AS eql_v3.int4;"#) .execute(&pool) .await?; @@ -217,7 +217,7 @@ async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { let violations: Vec<&LintRow> = rows .iter() .filter(|r| { - r.category == "domain_over_domain" && r.object_name.contains("eql_v2_test_baddom") + r.category == "domain_over_domain" && r.object_name.contains("test_baddom") }) .collect(); @@ -234,11 +234,11 @@ async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { Ok(()) } -/// An operator class declared `FOR TYPE` on an `eql_v2_*` domain bypasses +/// An operator class declared `FOR TYPE` on an `eql_v3` domain bypasses /// the operator-resolution that the storage blockers depend on. The /// recommended pattern is a functional index on the extractor; opclasses /// on domains must never appear. See CLAUDE.md footguns. The current -/// build emits zero opclasses on `eql_v2_*` domains, so this test is +/// build emits zero opclasses on `eql_v3` domains, so this test is /// negative: it asserts the rule category is well-known and surfaces no /// rows. A positive test would require constructing a valid opclass on a /// domain, which is non-trivial scaffolding — the `domain_opclass` @@ -259,44 +259,6 @@ async fn lint_domain_opclass_surface_is_clean(pool: PgPool) -> Result<()> { Ok(()) } -/// Phase 1 regression: the operators rewritten in #193 (=, <>, ~~, ~~*, -/// @>, <@ on eql_v2_encrypted) must report zero lint violations. If this -/// test fails, an inlinability regression has been introduced into one -/// of the core operators that PostgREST and ORM bare-form queries rely -/// on. -#[sqlx::test] -async fn lint_phase_1_operators_are_clean(pool: PgPool) -> Result<()> { - let rows = fetch_lints(&pool).await?; - let phase_1_prefixes = [ - "operator =(eql_v2_encrypted", - "operator <>(eql_v2_encrypted", - "operator =(jsonb, eql_v2_encrypted", - "operator <>(jsonb, eql_v2_encrypted", - "operator ~~(eql_v2_encrypted", - "operator ~~*(eql_v2_encrypted", - "operator ~~(jsonb, eql_v2_encrypted", - "operator ~~*(jsonb, eql_v2_encrypted", - "operator @>(eql_v2_encrypted", - "operator <@(eql_v2_encrypted", - ]; - - let violations: Vec<_> = rows - .iter() - .filter(|row| { - phase_1_prefixes - .iter() - .any(|prefix| row.object_name.starts_with(prefix)) - }) - .collect(); - - assert!( - violations.is_empty(), - "Phase 1 operators should report zero lint violations, but got: {:#?}", - violations - ); - Ok(()) -} - /// Every encrypted-scalar-domain family's inlinable operator surface /// must report zero lint violations. The supported operators on the /// `_eq`, `_ord`, and `_ord_ore` variants are codegen-emitted SQL @@ -305,7 +267,7 @@ async fn lint_phase_1_operators_are_clean(pool: PgPool) -> Result<()> { /// regression to plpgsql or a pinned `search_path` breaks index /// engagement. /// -/// Storage-only variants (the bare `eql_v3_` domain with no +/// Storage-only variants (the bare `eql_v3.` domain with no /// capability suffix) are intentionally excluded — every operator on /// them is a non-STRICT plpgsql blocker, which doesn't need to be /// inlinable. diff --git a/tests/sqlx/tests/payload_schema_tests.rs b/tests/sqlx/tests/payload_schema_tests.rs index 2b5b66e66..b6a1a37bf 100644 --- a/tests/sqlx/tests/payload_schema_tests.rs +++ b/tests/sqlx/tests/payload_schema_tests.rs @@ -326,8 +326,7 @@ fn v2_3_legacy_split_ore_fields_are_rejected() { // leading domain-tag byte on the ciphertext. // // The OPE-side legacy fields (`opf` / `opv`) are also rejected — v2.3 - // doesn't support OPE on `eql_v2_encrypted` (deferred to a future - // separate type). + // doesn't support OPE (deferred to a future separate type). let cases = [ ( "encrypted payload with legacy ocf", From 47263bdeeb0638c952eb4ee6da8b59906038bbf0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 15:23:56 +1000 Subject: [PATCH 324/599] build: collapse to a single self-contained v3 build, drop v2 variants --- mise.toml | 10 ++-- tasks/build.sh | 142 ++++--------------------------------------------- 2 files changed, 16 insertions(+), 136 deletions(-) diff --git a/mise.toml b/mise.toml index 42f9677e7..a58713662 100644 --- a/mise.toml +++ b/mise.toml @@ -55,16 +55,16 @@ run = """ [tasks."test:sqlx:prep"] description = "Prepare the SQLx test DB: cp built EQL into migrations, migrate, regenerate fixtures" -# `build` produces release/cipherstash-encrypt.sql, which is then cp'd into -# tests/sqlx/migrations/001_install_eql.sql below. Without this dep, a stale -# release artifact silently ships an old EQL extension into the test DB and -# regression-guard migrations (e.g. 003_install_ste_vec_data.sql) fail. +# `build` produces release/cipherstash-encrypt.sql (the self-contained eql_v3 +# surface), which is then cp'd into tests/sqlx/migrations/001_install_eql.sql +# below. Without this dep, a stale release artifact silently ships an old EQL +# extension into the test DB. depends = ["build"] dir = "{{config_root}}" run = """ # Copy built SQL to SQLx migrations (EQL install is generated, not static) echo "Updating SQLx migrations with built EQL..." -cp release/cipherstash-encrypt-v3.sql tests/sqlx/migrations/001_install_eql.sql +cp release/cipherstash-encrypt.sql tests/sqlx/migrations/001_install_eql.sql # Run SQLx migrations and tests echo "Running SQLx migrations..." diff --git a/tasks/build.sh b/tasks/build.sh index 1fe69b79f..4c10d7396 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" -#MISE sources=["src/**/*.sql", "tasks/pin_search_path.sql", "tasks/pin_search_path_v3.sql", "tasks/uninstall.sql", "tasks/uninstall-protect.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] -#MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql","release/cipherstash-encrypt-protect.sql","release/cipherstash-encrypt-protect-uninstall.sql","release/cipherstash-encrypt-v3.sql","release/cipherstash-encrypt-v3-uninstall.sql"] +#MISE sources=["src/v3/**/*.sql", "tasks/pin_search_path_v3.sql", "tasks/uninstall-v3.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] +#MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" #!/bin/bash @@ -75,132 +75,18 @@ verify_v3_self_contained() { mkdir -p release -rm -f release/cipherstash-encrypt-uninstall.sql rm -f release/cipherstash-encrypt.sql +rm -f release/cipherstash-encrypt-uninstall.sql -rm -f release/cipherstash-encrypt-uninstall-supabase.sql -rm -f release/cipherstash-encrypt-supabase.sql - -rm -f release/cipherstash-encrypt-protect.sql -rm -f release/cipherstash-encrypt-protect-uninstall.sql - -rm -f release/cipherstash-encrypt-v3.sql -rm -f release/cipherstash-encrypt-v3-uninstall.sql - -rm -f dbdev/eql--0.0.0.sql - -rm -f src/version.sql -rm -f src/deps.txt -rm -f src/deps-ordered.txt -rm -f src/deps-supabase.txt -rm -f src/deps-ordered-supabase.txt -rm -f src/deps-protect.txt -rm -f src/deps-ordered-protect.txt rm -f src/deps-v3.txt rm -f src/deps-ordered-v3.txt -RELEASE_VERSION=${usage_version:-DEV} -sed "s/\$RELEASE_VERSION/$RELEASE_VERSION/g" src/version.template > src/version.sql - - -find src -type f -path "*.sql" ! -path "*_test.sql" | while IFS= read -r sql_file; do - echo $sql_file - - echo "$sql_file $sql_file" >> src/deps.txt - - while IFS= read -r line; do - # echo $line - # Check if the line contains "-- REQUIRE:" - if [[ "$line" == *"-- REQUIRE:"* ]]; then - # Extract the required file(s) after "-- REQUIRE:" - deps=${line#*-- REQUIRE: } - - # Split multiple REQUIRE declarations if present - for dep in $deps; do - echo "$sql_file $dep" >> src/deps.txt - done - fi - done < "$sql_file" -done - - -cat src/deps.txt | tsort | tac > src/deps-ordered.txt -verify_deps_exist src/deps-ordered.txt - -cat src/deps-ordered.txt | xargs cat | grep -v REQUIRE >> release/cipherstash-encrypt.sql -cat tasks/pin_search_path.sql >> release/cipherstash-encrypt.sql - -cat tasks/uninstall.sql >> release/cipherstash-encrypt-uninstall.sql - - -# Supabase specific build which excludes operator classes as they are not supported -find src -type f -path "*.sql" ! -path "*_test.sql" ! -path "**/*operator_class.sql" | while IFS= read -r sql_file; do - echo $sql_file - - echo "$sql_file $sql_file" >> src/deps-supabase.txt - - while IFS= read -r line; do - # echo $line - # Check if the line contains "-- REQUIRE:" - if [[ "$line" == *"-- REQUIRE:"* ]]; then - # Extract the required file(s) after "-- REQUIRE:" - deps=${line#*-- REQUIRE: } - - # Split multiple REQUIRE declarations if present - for dep in $deps; do - echo "$sql_file $dep" >> src/deps-supabase.txt - done - fi - done < "$sql_file" -done - - -cat src/deps-supabase.txt | tsort | tac > src/deps-ordered-supabase.txt -verify_deps_exist src/deps-ordered-supabase.txt - -cat src/deps-ordered-supabase.txt | xargs cat | grep -v REQUIRE >> release/cipherstash-encrypt-supabase.sql -cat tasks/pin_search_path.sql >> release/cipherstash-encrypt-supabase.sql - -cat src/deps-ordered-supabase.txt | xargs cat | grep -v REQUIRE >> dbdev/eql--0.0.0.sql -cat tasks/pin_search_path.sql >> dbdev/eql--0.0.0.sql - -cat tasks/uninstall.sql >> release/cipherstash-encrypt-uninstall-supabase.sql - - -# Protect variant build - excludes config management and encryptindex -find src -type f -path "*.sql" ! -path "*_test.sql" ! -path "**/config/*" ! -path "**/encryptindex/*" | while IFS= read -r sql_file; do - echo $sql_file - - echo "$sql_file $sql_file" >> src/deps-protect.txt - - while IFS= read -r line; do - if [[ "$line" == *"-- REQUIRE:"* ]]; then - deps=${line#*-- REQUIRE: } - for dep in $deps; do - echo "$sql_file $dep" >> src/deps-protect.txt - done - fi - done < "$sql_file" -done - -cat src/deps-protect.txt | tsort | tac > src/deps-ordered-protect.txt -verify_deps_exist src/deps-ordered-protect.txt - -cat src/deps-ordered-protect.txt | xargs cat | grep -v REQUIRE >> release/cipherstash-encrypt-protect.sql -cat tasks/pin_search_path.sql >> release/cipherstash-encrypt-protect.sql - -cat tasks/uninstall-protect.sql >> release/cipherstash-encrypt-protect-uninstall.sql - - -# v3-only build (design D9): the self-contained eql_v3 surface — schema, SEM -# types, scalar domains — globbed from src/v3 ONLY. This is the unit the -# self-containment gate greps; it is the only artifact that can be "free of -# eql_v2", because the combined variants glob all of src/. It deliberately does -# NOT append tasks/pin_search_path.sql (D11): that script is eql_v2-coupled -# (raises if public.eql_v2_encrypted / eql_v2.ste_vec_entry are absent and only -# ever pins eql_v2 functions), so appending it would both fail a clean v3 -# install and break the self-containment grep. +# The self-contained eql_v3 surface — schema, SEM types, scalar domains — +# globbed from src/v3 ONLY. This is the sole EQL artifact: it owns no eql_v2 +# dependency (CI-gated by verify_v3_self_contained below + test:self_contained_v3), +# and it is written under the canonical release name now that the combined v2 +# build that previously produced that name is gone. find src/v3 -type f -path "*.sql" ! -path "*_test.sql" | while IFS= read -r sql_file; do echo "$sql_file" @@ -221,10 +107,10 @@ verify_v3_self_contained src/deps-v3.txt cat src/deps-v3.txt | tsort | tac > src/deps-ordered-v3.txt verify_deps_exist src/deps-ordered-v3.txt -cat src/deps-ordered-v3.txt | xargs cat | grep -v REQUIRE >> release/cipherstash-encrypt-v3.sql -cat tasks/pin_search_path_v3.sql >> release/cipherstash-encrypt-v3.sql +cat src/deps-ordered-v3.txt | xargs cat | grep -v REQUIRE >> release/cipherstash-encrypt.sql +cat tasks/pin_search_path_v3.sql >> release/cipherstash-encrypt.sql -cat tasks/uninstall-v3.sql >> release/cipherstash-encrypt-v3-uninstall.sql +cat tasks/uninstall-v3.sql >> release/cipherstash-encrypt-uninstall.sql echo @@ -234,12 +120,6 @@ echo '###############################################' echo echo 'Installer:' echo ' release/cipherstash-encrypt.sql' -echo ' release/cipherstash-encrypt-supabase.sql' -echo ' release/cipherstash-encrypt-protect.sql' -echo ' release/cipherstash-encrypt-v3.sql' echo echo 'Uninstaller:' echo ' release/cipherstash-encrypt-uninstall.sql' -echo ' release/cipherstash-encrypt-uninstall-supabase.sql' -echo ' release/cipherstash-encrypt-protect-uninstall.sql' -echo ' release/cipherstash-encrypt-v3-uninstall.sql' From 462b020c1611ba48612726730310c4828ac3fe44 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 15:25:00 +1000 Subject: [PATCH 325/599] feat!: remove eql_v2 SQL surface (encrypted type, operators, config, encryptindex, SEM, lint) --- src/bloom_filter/functions.sql | 91 --- src/bloom_filter/types.sql | 13 - src/common.sql | 119 ---- src/config/constraints.sql | 214 ------- src/config/functions.sql | 494 ---------------- src/config/functions_private.sql | 136 ----- src/config/indexes.sql | 28 - src/config/tables.sql | 33 -- src/config/types.sql | 28 - src/crypto.sql | 57 -- src/encrypted/aggregates.sql | 102 ---- src/encrypted/casts.sql | 92 --- src/encrypted/compare.sql | 31 - src/encrypted/constraints.sql | 171 ------ src/encrypted/functions.sql | 206 ------- src/encrypted/hash.sql | 42 -- src/encrypted/types.sql | 36 -- src/encryptindex/functions.sql | 229 -------- src/hmac_256/compare.sql | 78 --- src/hmac_256/functions.sql | 129 ----- src/hmac_256/types.sql | 11 - src/jsonb/functions.sql | 449 -------------- src/lint/lints.sql | 371 ------------ src/operators/->.sql | 142 ----- src/operators/->>.sql | 69 --- src/operators/<.sql | 155 ----- src/operators/<=.sql | 105 ---- src/operators/<>.sql | 113 ---- src/operators/<@.sql | 89 --- src/operators/=.sql | 149 ----- src/operators/>.sql | 119 ---- src/operators/>=.sql | 112 ---- src/operators/@>.sql | 132 ----- src/operators/compare.sql | 92 --- src/operators/hash_operator_class.sql | 29 - src/operators/operator_class.sql | 116 ---- src/operators/order_by.sql | 28 - src/operators/sort.sql | 645 --------------------- src/operators/ste_vec_entry.sql | 179 ------ src/operators/~~.sql | 206 ------- src/ore_block_u64_8_256/casts.sql | 28 - src/ore_block_u64_8_256/compare.sql | 68 --- src/ore_block_u64_8_256/functions.sql | 295 ---------- src/ore_block_u64_8_256/operator_class.sql | 37 -- src/ore_block_u64_8_256/operators.sql | 211 ------- src/ore_block_u64_8_256/types.sql | 27 - src/ore_cllw/functions.sql | 283 --------- src/ore_cllw/operator_class.sql | 51 -- src/ore_cllw/operators.sql | 182 ------ src/ore_cllw/types.sql | 24 - src/schema.sql | 17 - src/ste_vec/eq_term.sql | 42 -- src/ste_vec/functions.sql | 626 -------------------- src/ste_vec/types.sql | 154 ----- src/version.template | 32 - 55 files changed, 7717 deletions(-) delete mode 100644 src/bloom_filter/functions.sql delete mode 100644 src/bloom_filter/types.sql delete mode 100644 src/common.sql delete mode 100644 src/config/constraints.sql delete mode 100644 src/config/functions.sql delete mode 100644 src/config/functions_private.sql delete mode 100644 src/config/indexes.sql delete mode 100644 src/config/tables.sql delete mode 100644 src/config/types.sql delete mode 100644 src/crypto.sql delete mode 100644 src/encrypted/aggregates.sql delete mode 100644 src/encrypted/casts.sql delete mode 100644 src/encrypted/compare.sql delete mode 100644 src/encrypted/constraints.sql delete mode 100644 src/encrypted/functions.sql delete mode 100644 src/encrypted/hash.sql delete mode 100644 src/encrypted/types.sql delete mode 100644 src/encryptindex/functions.sql delete mode 100644 src/hmac_256/compare.sql delete mode 100644 src/hmac_256/functions.sql delete mode 100644 src/hmac_256/types.sql delete mode 100644 src/jsonb/functions.sql delete mode 100644 src/lint/lints.sql delete mode 100644 src/operators/->.sql delete mode 100644 src/operators/->>.sql delete mode 100644 src/operators/<.sql delete mode 100644 src/operators/<=.sql delete mode 100644 src/operators/<>.sql delete mode 100644 src/operators/<@.sql delete mode 100644 src/operators/=.sql delete mode 100644 src/operators/>.sql delete mode 100644 src/operators/>=.sql delete mode 100644 src/operators/@>.sql delete mode 100644 src/operators/compare.sql delete mode 100644 src/operators/hash_operator_class.sql delete mode 100644 src/operators/operator_class.sql delete mode 100644 src/operators/order_by.sql delete mode 100644 src/operators/sort.sql delete mode 100644 src/operators/ste_vec_entry.sql delete mode 100644 src/operators/~~.sql delete mode 100644 src/ore_block_u64_8_256/casts.sql delete mode 100644 src/ore_block_u64_8_256/compare.sql delete mode 100644 src/ore_block_u64_8_256/functions.sql delete mode 100644 src/ore_block_u64_8_256/operator_class.sql delete mode 100644 src/ore_block_u64_8_256/operators.sql delete mode 100644 src/ore_block_u64_8_256/types.sql delete mode 100644 src/ore_cllw/functions.sql delete mode 100644 src/ore_cllw/operator_class.sql delete mode 100644 src/ore_cllw/operators.sql delete mode 100644 src/ore_cllw/types.sql delete mode 100644 src/schema.sql delete mode 100644 src/ste_vec/eq_term.sql delete mode 100644 src/ste_vec/functions.sql delete mode 100644 src/ste_vec/types.sql delete mode 100644 src/version.template diff --git a/src/bloom_filter/functions.sql b/src/bloom_filter/functions.sql deleted file mode 100644 index 25850a5bd..000000000 --- a/src/bloom_filter/functions.sql +++ /dev/null @@ -1,91 +0,0 @@ --- REQUIRE: src/schema.sql - - ---! @brief Extract Bloom filter index term from JSONB payload ---! ---! Extracts the Bloom filter array from the 'bf' field of an encrypted ---! data payload. Used internally for pattern-match queries (LIKE operator). ---! ---! @param jsonb containing encrypted EQL payload ---! @return eql_v2.bloom_filter Bloom filter as smallint array ---! @throws Exception if 'bf' field is missing when bloom_filter index is expected ---! ---! @see eql_v2.has_bloom_filter ---! @see eql_v2."~~" -CREATE FUNCTION eql_v2.bloom_filter(val jsonb) - RETURNS eql_v2.bloom_filter - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF val IS NULL THEN - RETURN NULL; - END IF; - - IF eql_v2.has_bloom_filter(val) THEN - RETURN ARRAY(SELECT jsonb_array_elements(val->'bf'))::eql_v2.bloom_filter; - END IF; - - RAISE 'Expected a match index (bf) value in json: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract Bloom filter index term from encrypted column value ---! ---! Extracts the Bloom filter from an encrypted column value by accessing ---! its underlying JSONB data field. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return eql_v2.bloom_filter Bloom filter as smallint array ---! ---! @see eql_v2.bloom_filter(jsonb) -CREATE FUNCTION eql_v2.bloom_filter(val eql_v2_encrypted) - RETURNS eql_v2.bloom_filter - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN (SELECT eql_v2.bloom_filter(val.data)); - END; -$$ LANGUAGE plpgsql; - - ---! @brief Check if JSONB payload contains Bloom filter index term ---! ---! Tests whether the encrypted data payload includes a 'bf' field, ---! indicating a Bloom filter is available for pattern-match queries. ---! ---! @param jsonb containing encrypted EQL payload ---! @return Boolean True if 'bf' field is present and non-null ---! ---! @see eql_v2.bloom_filter -CREATE FUNCTION eql_v2.has_bloom_filter(val jsonb) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN val ->> 'bf' IS NOT NULL; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Check if encrypted column value contains Bloom filter index term ---! ---! Tests whether an encrypted column value includes a Bloom filter ---! by checking its underlying JSONB data field. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return Boolean True if Bloom filter is present ---! ---! @see eql_v2.has_bloom_filter(jsonb) -CREATE FUNCTION eql_v2.has_bloom_filter(val eql_v2_encrypted) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.has_bloom_filter(val.data); - END; -$$ LANGUAGE plpgsql; diff --git a/src/bloom_filter/types.sql b/src/bloom_filter/types.sql deleted file mode 100644 index 164021665..000000000 --- a/src/bloom_filter/types.sql +++ /dev/null @@ -1,13 +0,0 @@ --- REQUIRE: src/schema.sql - ---! @brief Bloom filter index term type ---! ---! Domain type representing Bloom filter bit arrays stored as smallint arrays. ---! Used for pattern-match encrypted searches via the 'match' index type. ---! The filter is stored in the 'bf' field of encrypted data payloads. ---! ---! @see eql_v2.add_search_config ---! @see eql_v2."~~" ---! @note This is a transient type used only during query execution -CREATE DOMAIN eql_v2.bloom_filter AS smallint[]; - diff --git a/src/common.sql b/src/common.sql deleted file mode 100644 index 736c62021..000000000 --- a/src/common.sql +++ /dev/null @@ -1,119 +0,0 @@ --- AUTOMATICALLY GENERATED FILE --- REQUIRE: src/schema.sql - ---! @file common.sql ---! @brief Common utility functions ---! ---! Provides general-purpose utility functions used across EQL: ---! - Constant-time bytea comparison for security ---! - JSONB to bytea array conversion ---! - Logging helpers for debugging and testing - - ---! @brief Constant-time comparison of bytea values ---! @internal ---! ---! Compares two bytea values in constant time to prevent timing attacks. ---! Always checks all bytes even after finding differences, maintaining ---! consistent execution time regardless of where differences occur. ---! ---! @param a bytea First value to compare ---! @param b bytea Second value to compare ---! @return boolean True if values are equal ---! ---! @note Returns false immediately if lengths differ (length is not secret) ---! @note Used for secure comparison of cryptographic values -CREATE FUNCTION eql_v2.bytea_eq(a bytea, b bytea) RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - result boolean; - differing bytea; -BEGIN - - -- Check if the bytea values are the same length - IF LENGTH(a) != LENGTH(b) THEN - RETURN false; - END IF; - - -- Compare each byte in the bytea values - result := true; - FOR i IN 1..LENGTH(a) LOOP - IF SUBSTRING(a FROM i FOR 1) != SUBSTRING(b FROM i FOR 1) THEN - result := result AND false; - END IF; - END LOOP; - - RETURN result; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Convert JSONB hex array to bytea array ---! @internal ---! ---! Converts a JSONB array of hex-encoded strings into a PostgreSQL bytea array. ---! Used for deserializing binary data (like ORE terms) from JSONB storage. ---! ---! @param jsonb JSONB array of hex-encoded strings ---! @return bytea[] Array of decoded binary values ---! ---! @note Returns NULL if input is JSON null ---! @note Each array element is hex-decoded to bytea -CREATE FUNCTION eql_v2.jsonb_array_to_bytea_array(val jsonb) -RETURNS bytea[] - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - terms_arr bytea[]; -BEGIN - IF jsonb_typeof(val) = 'null' THEN - RETURN NULL; - END IF; - - SELECT array_agg(decode(value::text, 'hex')::bytea) - INTO terms_arr - FROM jsonb_array_elements_text(val) AS value; - - RETURN terms_arr; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Log message for debugging ---! ---! Convenience function to emit log messages during testing and debugging. ---! Uses RAISE NOTICE to output messages to PostgreSQL logs. ---! ---! @param text Message to log ---! ---! @note Primarily used in tests and development ---! @see eql_v2.log(text, text) for contextual logging -CREATE FUNCTION eql_v2.log(s text) - RETURNS void - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RAISE NOTICE '[LOG] %', s; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Log message with context ---! ---! Overload of log function that includes context label for better ---! log organization during testing. ---! ---! @param ctx text Context label (e.g., test name, module name) ---! @param s text Message to log ---! ---! @note Format: "[LOG] {ctx} {message}" ---! @see eql_v2.log(text) -CREATE FUNCTION eql_v2.log(ctx text, s text) - RETURNS void - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RAISE NOTICE '[LOG] % %', ctx, s; -END; -$$ LANGUAGE plpgsql; diff --git a/src/config/constraints.sql b/src/config/constraints.sql deleted file mode 100644 index 4ef35d778..000000000 --- a/src/config/constraints.sql +++ /dev/null @@ -1,214 +0,0 @@ --- REQUIRE: src/config/types.sql - ---! @file config/constraints.sql ---! @brief Configuration validation functions and constraints ---! ---! Provides CHECK constraint functions to validate encryption configuration structure. ---! Ensures configurations have required fields (version, tables) and valid values ---! for index types and cast types before being stored. ---! ---! @see config/tables.sql where constraints are applied - - ---! @brief Extract index type names from configuration ---! @internal ---! ---! Helper function that extracts all index type names from the configuration's ---! 'indexes' sections across all tables and columns. ---! ---! @param jsonb Configuration data to extract from ---! @return SETOF text Index type names (e.g., 'match', 'ore', 'unique', 'ste_vec') ---! ---! @note Used by config_check_indexes for validation ---! @see eql_v2.config_check_indexes -CREATE FUNCTION eql_v2.config_get_indexes(val jsonb) - RETURNS SETOF text - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - SELECT jsonb_object_keys(jsonb_path_query(val,'$.tables.*.*.indexes')); -END; - - ---! @brief Validate index types in configuration ---! @internal ---! ---! Checks that all index types specified in the configuration are valid. ---! Valid index types are: match, ore, ope, unique, ste_vec. ---! ---! @param jsonb Configuration data to validate ---! @return boolean True if all index types are valid ---! @throws Exception if any invalid index type found ---! ---! @note Used in CHECK constraint on eql_v2_configuration table ---! @see eql_v2.config_get_indexes -CREATE FUNCTION eql_v2.config_check_indexes(val jsonb) - RETURNS BOOLEAN - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - - IF (SELECT EXISTS (SELECT eql_v2.config_get_indexes(val))) THEN - IF (SELECT bool_and(index = ANY('{match, ore, ope, unique, ste_vec}')) FROM eql_v2.config_get_indexes(val) AS index) THEN - RETURN true; - END IF; - RAISE 'Configuration has an invalid index (%). Index should be one of {match, ore, ope, unique, ste_vec}', val; - END IF; - RETURN true; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Validate cast types in configuration ---! @internal ---! ---! Checks that all 'cast_as' and 'plaintext_type' types specified in the configuration are valid. ---! Valid cast types are: text, int, small_int, big_int, real, double, boolean, date, jsonb, json, float, decimal, timestamp. ---! ---! @param jsonb Configuration data to validate ---! @return boolean True if all cast types are valid or no cast types specified ---! @throws Exception if any invalid cast type found ---! ---! @note Used in CHECK constraint on eql_v2_configuration table ---! @note Empty configurations (no cast_as/plaintext_type fields) are valid ---! @note Cast type names are EQL's internal representations, not PostgreSQL native types ---! @note 'plaintext_type' is accepted as a canonical alias for 'cast_as' -CREATE FUNCTION eql_v2.config_check_cast(val jsonb) - RETURNS BOOLEAN - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - _valid_types text[] := '{text, int, small_int, big_int, real, double, boolean, date, jsonb, json, float, decimal, timestamp}'; - BEGIN - -- Validate cast_as fields - IF EXISTS (SELECT jsonb_array_elements_text(jsonb_path_query_array(val, '$.tables.*.*.cast_as'))) THEN - IF NOT (SELECT bool_and(cast_as = ANY(_valid_types)) - FROM (SELECT jsonb_array_elements_text(jsonb_path_query_array(val, '$.tables.*.*.cast_as')) AS cast_as) casts) THEN - RAISE 'Configuration has an invalid cast_as (%). Cast should be one of %', val, _valid_types; - END IF; - END IF; - - -- Validate plaintext_type fields (canonical alias for cast_as) - IF EXISTS (SELECT jsonb_array_elements_text(jsonb_path_query_array(val, '$.tables.*.*.plaintext_type'))) THEN - IF NOT (SELECT bool_and(pt = ANY(_valid_types)) - FROM (SELECT jsonb_array_elements_text(jsonb_path_query_array(val, '$.tables.*.*.plaintext_type')) AS pt) types) THEN - RAISE 'Configuration has an invalid plaintext_type (%). Type should be one of %', val, _valid_types; - END IF; - END IF; - - RETURN true; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Validate tables field presence ---! @internal ---! ---! Ensures the configuration has a 'tables' field, which is required ---! to specify which database tables contain encrypted columns. ---! ---! @param jsonb Configuration data to validate ---! @return boolean True if 'tables' field exists ---! @throws Exception if 'tables' field is missing ---! ---! @note Used in CHECK constraint on eql_v2_configuration table -CREATE FUNCTION eql_v2.config_check_tables(val jsonb) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF (val ? 'tables') THEN - RETURN true; - END IF; - RAISE 'Configuration missing tables (tables) field: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Validate version field presence ---! @internal ---! ---! Ensures the configuration has a 'v' (version) field, which tracks ---! the configuration format version. ---! ---! @param jsonb Configuration data to validate ---! @return boolean True if 'v' field exists ---! @throws Exception if 'v' field is missing ---! ---! @note Used in CHECK constraint on eql_v2_configuration table -CREATE FUNCTION eql_v2.config_check_version(val jsonb) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF (val ? 'v') THEN - RETURN true; - END IF; - RAISE 'Configuration missing version (v) field: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Validate ste_vec index mode option ---! @internal ---! ---! Checks that the optional `mode` field on `ste_vec` index configurations is ---! one of the recognised values. Valid modes are: standard, compat. ---! Configurations without a `mode` field (the default) pass unconditionally. ---! ---! @param jsonb Configuration data to validate ---! @return boolean True if every ste_vec mode is valid, or none are set ---! @throws Exception if any ste_vec.mode value is not in the allowed set ---! ---! @note Used in CHECK constraint on eql_v2_configuration table ---! @note Mode is optional — only configurations that set it are validated -CREATE FUNCTION eql_v2.config_check_ste_vec_mode(val jsonb) - RETURNS BOOLEAN - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - _valid_modes text[] := '{standard, compat}'; - BEGIN - IF EXISTS (SELECT jsonb_array_elements_text(jsonb_path_query_array(val, '$.tables.*.*.indexes.ste_vec.mode'))) THEN - IF NOT (SELECT bool_and(mode = ANY(_valid_modes)) - FROM (SELECT jsonb_array_elements_text(jsonb_path_query_array(val, '$.tables.*.*.indexes.ste_vec.mode')) AS mode) modes) THEN - RAISE 'Configuration has an invalid ste_vec mode (%). Mode should be one of %', val, _valid_modes; - END IF; - END IF; - RETURN true; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Drop existing data validation constraint if present ---! @note Allows constraint to be recreated during upgrades -ALTER TABLE public.eql_v2_configuration DROP CONSTRAINT IF EXISTS eql_v2_configuration_data_check; - - ---! @brief Comprehensive configuration data validation ---! ---! CHECK constraint that validates all aspects of configuration data: ---! - Version field presence ---! - Tables field presence ---! - Valid cast_as types ---! - Valid index types ---! - Valid ste_vec mode (when set) ---! ---! @note Combines all config_check_* validation functions ---! @see eql_v2.config_check_version ---! @see eql_v2.config_check_tables ---! @see eql_v2.config_check_cast ---! @see eql_v2.config_check_indexes ---! @see eql_v2.config_check_ste_vec_mode -ALTER TABLE public.eql_v2_configuration - ADD CONSTRAINT eql_v2_configuration_data_check CHECK ( - eql_v2.config_check_version(data) AND - eql_v2.config_check_tables(data) AND - eql_v2.config_check_cast(data) AND - eql_v2.config_check_indexes(data) AND - eql_v2.config_check_ste_vec_mode(data) -); - - diff --git a/src/config/functions.sql b/src/config/functions.sql deleted file mode 100644 index 3513f1871..000000000 --- a/src/config/functions.sql +++ /dev/null @@ -1,494 +0,0 @@ --- REQUIRE: src/config/types.sql --- REQUIRE: src/config/functions_private.sql --- REQUIRE: src/encrypted/functions.sql - ---! @brief Add a search index configuration for an encrypted column ---! ---! Configures a searchable encryption index (unique, match, ore, ope, or ste_vec) ---! on an encrypted column. Creates or updates the pending configuration, then ---! migrates and activates it unless migrating flag is set. ---! ---! @param table_name Text Name of the table containing the column ---! @param column_name Text Name of the column to configure ---! @param index_name Text Type of index ('unique', 'match', 'ore', 'ope', 'ste_vec') ---! @param cast_as Text PostgreSQL type for decrypted values (default: 'text') ---! @param opts JSONB Index-specific options (default: '{}') ---! @param migrating Boolean Skip auto-migration if true (default: false) ---! @return JSONB Updated configuration object ---! @throws Exception if index already exists for this column ---! @throws Exception if cast_as is not a valid type ---! ---! @example ---! -- Add unique index for exact-match searches ---! SELECT eql_v2.add_search_config('users', 'email', 'unique'); ---! ---! -- Add match index for LIKE searches with custom token length ---! SELECT eql_v2.add_search_config('posts', 'content', 'match', 'text', ---! '{"token_filters": [{"kind": "downcase"}], "tokenizer": {"kind": "ngram", "token_length": 3}}' ---! ); ---! ---! @see eql_v2.add_column ---! @see eql_v2.remove_search_config -CREATE FUNCTION eql_v2.add_search_config(table_name text, column_name text, index_name text, cast_as text DEFAULT 'text', opts jsonb DEFAULT '{}', migrating boolean DEFAULT false) - RETURNS jsonb - - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - o jsonb; - _config jsonb; - BEGIN - - -- set the active config - SELECT data INTO _config FROM public.eql_v2_configuration WHERE state = 'active' OR state = 'pending' ORDER BY state DESC; - - -- if index exists - IF _config #> array['tables', table_name, column_name, 'indexes'] ? index_name THEN - RAISE EXCEPTION '% index exists for column: % %', index_name, table_name, column_name; - END IF; - - IF NOT cast_as = ANY('{text, int, small_int, big_int, real, double, boolean, date, jsonb, json, float, decimal, timestamp}') THEN - RAISE EXCEPTION '% is not a valid cast type', cast_as; - END IF; - - -- set default config - SELECT eql_v2.config_default(_config) INTO _config; - - SELECT eql_v2.config_add_table(table_name, _config) INTO _config; - - SELECT eql_v2.config_add_column(table_name, column_name, _config) INTO _config; - - SELECT eql_v2.config_add_cast(table_name, column_name, cast_as, _config) INTO _config; - - -- set default options for index if opts empty - IF index_name = 'match' AND opts = '{}' THEN - SELECT eql_v2.config_match_default() INTO opts; - END IF; - - SELECT eql_v2.config_add_index(table_name, column_name, index_name, opts, _config) INTO _config; - - -- create a new pending record if we don't have one - INSERT INTO public.eql_v2_configuration (state, data) VALUES ('pending', _config) - ON CONFLICT (state) - WHERE state = 'pending' - DO UPDATE - SET data = _config; - - IF NOT migrating THEN - PERFORM eql_v2.migrate_config(); - PERFORM eql_v2.activate_config(); - END IF; - - PERFORM eql_v2.add_encrypted_constraint(table_name, column_name); - - -- exeunt - RETURN _config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Remove a search index configuration from an encrypted column ---! ---! Removes a previously configured search index from an encrypted column. ---! Updates the pending configuration, then migrates and activates it ---! unless migrating flag is set. ---! ---! @param table_name Text Name of the table containing the column ---! @param column_name Text Name of the column ---! @param index_name Text Type of index to remove ---! @param migrating Boolean Skip auto-migration if true (default: false) ---! @return JSONB Updated configuration object ---! @throws Exception if no active or pending configuration exists ---! @throws Exception if table is not configured ---! @throws Exception if column is not configured ---! ---! @example ---! -- Remove match index from column ---! SELECT eql_v2.remove_search_config('posts', 'content', 'match'); ---! ---! @see eql_v2.add_search_config ---! @see eql_v2.modify_search_config -CREATE FUNCTION eql_v2.remove_search_config(table_name text, column_name text, index_name text, migrating boolean DEFAULT false) - RETURNS jsonb - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - _config jsonb; - BEGIN - - -- set the active config - SELECT data INTO _config FROM public.eql_v2_configuration WHERE state = 'active' OR state = 'pending' ORDER BY state DESC; - - -- if no config - IF _config IS NULL THEN - RAISE EXCEPTION 'No active or pending configuration exists'; - END IF; - - -- if the table doesn't exist - IF NOT _config #> array['tables'] ? table_name THEN - RAISE EXCEPTION 'No configuration exists for table: %', table_name; - END IF; - - -- if the index does not exist - -- IF NOT _config->key ? index_name THEN - IF NOT _config #> array['tables', table_name] ? column_name THEN - RAISE EXCEPTION 'No % index exists for column: % %', index_name, table_name, column_name; - END IF; - - -- create a new pending record if we don't have one - INSERT INTO public.eql_v2_configuration (state, data) VALUES ('pending', _config) - ON CONFLICT (state) - WHERE state = 'pending' - DO NOTHING; - - -- remove the index - SELECT _config #- array['tables', table_name, column_name, 'indexes', index_name] INTO _config; - - -- update the config and migrate (even if empty) - UPDATE public.eql_v2_configuration SET data = _config WHERE state = 'pending'; - - IF NOT migrating THEN - PERFORM eql_v2.migrate_config(); - PERFORM eql_v2.activate_config(); - END IF; - - -- exeunt - RETURN _config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Modify a search index configuration for an encrypted column ---! ---! Updates an existing search index configuration by removing and re-adding it ---! with new options. Convenience function that combines remove and add operations. ---! If index does not exist, it is added. ---! ---! @param table_name Text Name of the table containing the column ---! @param column_name Text Name of the column ---! @param index_name Text Type of index to modify ---! @param cast_as Text PostgreSQL type for decrypted values (default: 'text') ---! @param opts JSONB New index-specific options (default: '{}') ---! @param migrating Boolean Skip auto-migration if true (default: false) ---! @return JSONB Updated configuration object ---! ---! @example ---! -- Change match index tokenizer settings ---! SELECT eql_v2.modify_search_config('posts', 'content', 'match', 'text', ---! '{"tokenizer": {"kind": "ngram", "token_length": 4}}' ---! ); ---! ---! @see eql_v2.add_search_config ---! @see eql_v2.remove_search_config -CREATE FUNCTION eql_v2.modify_search_config(table_name text, column_name text, index_name text, cast_as text DEFAULT 'text', opts jsonb DEFAULT '{}', migrating boolean DEFAULT false) - RETURNS jsonb - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - PERFORM eql_v2.remove_search_config(table_name, column_name, index_name, migrating); - RETURN eql_v2.add_search_config(table_name, column_name, index_name, cast_as, opts, migrating); - END; -$$ LANGUAGE plpgsql; - ---! @brief Migrate pending configuration to encrypting state ---! ---! Transitions the pending configuration to encrypting state, validating that ---! all configured columns have encrypted target columns ready. This is part of ---! the configuration lifecycle: pending → encrypting → active. ---! ---! @return Boolean True if migration succeeds ---! @throws Exception if encryption already in progress ---! @throws Exception if no pending configuration exists ---! @throws Exception if configured columns lack encrypted targets ---! ---! @example ---! -- Manually migrate configuration (normally done automatically) ---! SELECT eql_v2.migrate_config(); ---! ---! @see eql_v2.activate_config ---! @see eql_v2.add_column -CREATE FUNCTION eql_v2.migrate_config() - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - - IF EXISTS (SELECT FROM public.eql_v2_configuration c WHERE c.state = 'encrypting') THEN - RAISE EXCEPTION 'An encryption is already in progress'; - END IF; - - IF NOT EXISTS (SELECT FROM public.eql_v2_configuration c WHERE c.state = 'pending') THEN - RAISE EXCEPTION 'No pending configuration exists to encrypt'; - END IF; - - IF NOT eql_v2.ready_for_encryption() THEN - RAISE EXCEPTION 'Some pending columns do not have an encrypted target'; - END IF; - - UPDATE public.eql_v2_configuration SET state = 'encrypting' WHERE state = 'pending'; - RETURN true; - END; -$$ LANGUAGE plpgsql; - ---! @brief Activate encrypting configuration ---! ---! Transitions the encrypting configuration to active state, making it the ---! current operational configuration. Marks previous active configuration as ---! inactive. Final step in configuration lifecycle: pending → encrypting → active. ---! ---! @return Boolean True if activation succeeds ---! @throws Exception if no encrypting configuration exists to activate ---! ---! @example ---! -- Manually activate configuration (normally done automatically) ---! SELECT eql_v2.activate_config(); ---! ---! @see eql_v2.migrate_config ---! @see eql_v2.add_column -CREATE FUNCTION eql_v2.activate_config() - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - - IF EXISTS (SELECT FROM public.eql_v2_configuration c WHERE c.state = 'encrypting') THEN - UPDATE public.eql_v2_configuration SET state = 'inactive' WHERE state = 'active'; - UPDATE public.eql_v2_configuration SET state = 'active' WHERE state = 'encrypting'; - RETURN true; - ELSE - RAISE EXCEPTION 'No encrypting configuration exists to activate'; - END IF; - END; -$$ LANGUAGE plpgsql; - ---! @brief Discard pending configuration ---! ---! Deletes the pending configuration without applying changes. Use this to ---! abandon configuration changes before they are migrated and activated. ---! ---! @return Boolean True if discard succeeds ---! @throws Exception if no pending configuration exists to discard ---! ---! @example ---! -- Discard uncommitted configuration changes ---! SELECT eql_v2.discard(); ---! ---! @see eql_v2.add_column ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.discard() - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF EXISTS (SELECT FROM public.eql_v2_configuration c WHERE c.state = 'pending') THEN - DELETE FROM public.eql_v2_configuration WHERE state = 'pending'; - RETURN true; - ELSE - RAISE EXCEPTION 'No pending configuration exists to discard'; - END IF; - END; -$$ LANGUAGE plpgsql; - ---! @brief Configure a column for encryption ---! ---! Adds a column to the encryption configuration, making it eligible for ---! encrypted storage and search indexes. Creates or updates pending configuration, ---! adds encrypted constraint, then migrates and activates unless migrating flag is set. ---! ---! @param table_name Text Name of the table containing the column ---! @param column_name Text Name of the column to encrypt ---! @param cast_as Text PostgreSQL type to cast decrypted values (default: 'text') ---! @param migrating Boolean Skip auto-migration if true (default: false) ---! @return JSONB Updated configuration object ---! @throws Exception if column already configured for encryption ---! ---! @example ---! -- Configure email column for encryption ---! SELECT eql_v2.add_column('users', 'email', 'text'); ---! ---! -- Configure age column with integer casting ---! SELECT eql_v2.add_column('users', 'age', 'int'); ---! ---! @see eql_v2.add_search_config ---! @see eql_v2.remove_column -CREATE FUNCTION eql_v2.add_column(table_name text, column_name text, cast_as text DEFAULT 'text', migrating boolean DEFAULT false) - RETURNS jsonb - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - key text; - _config jsonb; - BEGIN - -- set the active config - SELECT data INTO _config FROM public.eql_v2_configuration WHERE state = 'active' OR state = 'pending' ORDER BY state DESC; - - -- set default config - SELECT eql_v2.config_default(_config) INTO _config; - - -- if index exists - IF _config #> array['tables', table_name] ? column_name THEN - RAISE EXCEPTION 'Config exists for column: % %', table_name, column_name; - END IF; - - SELECT eql_v2.config_add_table(table_name, _config) INTO _config; - - SELECT eql_v2.config_add_column(table_name, column_name, _config) INTO _config; - - SELECT eql_v2.config_add_cast(table_name, column_name, cast_as, _config) INTO _config; - - -- create a new pending record if we don't have one - INSERT INTO public.eql_v2_configuration (state, data) VALUES ('pending', _config) - ON CONFLICT (state) - WHERE state = 'pending' - DO UPDATE - SET data = _config; - - IF NOT migrating THEN - PERFORM eql_v2.migrate_config(); - PERFORM eql_v2.activate_config(); - END IF; - - PERFORM eql_v2.add_encrypted_constraint(table_name, column_name); - - -- exeunt - RETURN _config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Remove a column from encryption configuration ---! ---! Removes a column from the encryption configuration, including all associated ---! search indexes. Removes encrypted constraint, updates pending configuration, ---! then migrates and activates unless migrating flag is set. ---! ---! @param table_name Text Name of the table containing the column ---! @param column_name Text Name of the column to remove ---! @param migrating Boolean Skip auto-migration if true (default: false) ---! @return JSONB Updated configuration object ---! @throws Exception if no active or pending configuration exists ---! @throws Exception if table is not configured ---! @throws Exception if column is not configured ---! ---! @example ---! -- Remove email column from encryption ---! SELECT eql_v2.remove_column('users', 'email'); ---! ---! @see eql_v2.add_column ---! @see eql_v2.remove_search_config -CREATE FUNCTION eql_v2.remove_column(table_name text, column_name text, migrating boolean DEFAULT false) - RETURNS jsonb - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - key text; - _config jsonb; - BEGIN - -- set the active config - SELECT data INTO _config FROM public.eql_v2_configuration WHERE state = 'active' OR state = 'pending' ORDER BY state DESC; - - -- if no config - IF _config IS NULL THEN - RAISE EXCEPTION 'No active or pending configuration exists'; - END IF; - - -- if the table doesn't exist - IF NOT _config #> array['tables'] ? table_name THEN - RAISE EXCEPTION 'No configuration exists for table: %', table_name; - END IF; - - -- if the column does not exist - IF NOT _config #> array['tables', table_name] ? column_name THEN - RAISE EXCEPTION 'No configuration exists for column: % %', table_name, column_name; - END IF; - - -- create a new pending record if we don't have one - INSERT INTO public.eql_v2_configuration (state, data) VALUES ('pending', _config) - ON CONFLICT (state) - WHERE state = 'pending' - DO NOTHING; - - -- remove the column - SELECT _config #- array['tables', table_name, column_name] INTO _config; - - -- if table is now empty, remove the table - IF _config #> array['tables', table_name] = '{}' THEN - SELECT _config #- array['tables', table_name] INTO _config; - END IF; - - PERFORM eql_v2.remove_encrypted_constraint(table_name, column_name); - - -- update the config (even if empty) and activate - UPDATE public.eql_v2_configuration SET data = _config WHERE state = 'pending'; - - IF NOT migrating THEN - -- For empty configs, skip migration validation and directly activate - IF _config #> array['tables'] = '{}' THEN - UPDATE public.eql_v2_configuration SET state = 'inactive' WHERE state = 'active'; - UPDATE public.eql_v2_configuration SET state = 'active' WHERE state = 'pending'; - ELSE - PERFORM eql_v2.migrate_config(); - PERFORM eql_v2.activate_config(); - END IF; - END IF; - - -- exeunt - RETURN _config; - - END; -$$ LANGUAGE plpgsql; - ---! @brief Reload configuration from CipherStash Proxy ---! ---! Placeholder function for reloading configuration from the CipherStash Proxy. ---! Currently returns NULL without side effects. ---! ---! @return Void ---! ---! @note This function may be used for configuration synchronization in future versions -CREATE FUNCTION eql_v2.reload_config() - RETURNS void -LANGUAGE sql STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN NULL; -END; - ---! @brief Query encryption configuration in tabular format ---! ---! Returns the active encryption configuration as a table for easier querying ---! and filtering. Shows all configured tables, columns, cast types, and indexes. ---! ---! @return TABLE Contains configuration state, relation name, column name, cast type, and indexes ---! ---! @example ---! -- View all encrypted columns ---! SELECT * FROM eql_v2.config(); ---! ---! -- Find all columns with match indexes ---! SELECT relation, col_name FROM eql_v2.config() ---! WHERE indexes ? 'match'; ---! ---! @see eql_v2.add_column ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.config() RETURNS TABLE ( - state eql_v2_configuration_state, - relation text, - col_name text, - decrypts_as text, - indexes jsonb -) - SET search_path = pg_catalog, extensions, public -AS $$ -BEGIN - RETURN QUERY - WITH tables AS ( - SELECT cfg.state, tables.key AS table, tables.value AS tbl_config - FROM public.eql_v2_configuration cfg, jsonb_each(data->'tables') tables - WHERE cfg.data->>'v' = '1' - ) - SELECT - tables.state, - tables.table, - column_config.key, - COALESCE(column_config.value->>'plaintext_type', column_config.value->>'cast_as'), - column_config.value->'indexes' - FROM tables, jsonb_each(tables.tbl_config) column_config; -END; -$$ LANGUAGE plpgsql; diff --git a/src/config/functions_private.sql b/src/config/functions_private.sql deleted file mode 100644 index b7365c027..000000000 --- a/src/config/functions_private.sql +++ /dev/null @@ -1,136 +0,0 @@ --- REQUIRE: src/config/types.sql - ---! @brief Initialize default configuration structure ---! @internal ---! ---! Creates a default configuration object if input is NULL. Used internally ---! by public configuration functions to ensure consistent structure. ---! ---! @param config JSONB Existing configuration or NULL ---! @return JSONB Configuration with default structure (version 1, empty tables) -CREATE FUNCTION eql_v2.config_default(config jsonb) - RETURNS jsonb - IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF config IS NULL THEN - SELECT jsonb_build_object('v', 1, 'tables', jsonb_build_object()) INTO config; - END IF; - RETURN config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Add table to configuration if not present ---! @internal ---! ---! Ensures the specified table exists in the configuration structure. ---! Creates empty table entry if needed. Idempotent operation. ---! ---! @param table_name Text Name of table to add ---! @param config JSONB Configuration object ---! @return JSONB Updated configuration with table entry -CREATE FUNCTION eql_v2.config_add_table(table_name text, config jsonb) - RETURNS jsonb - IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - tbl jsonb; - BEGIN - IF NOT config #> array['tables'] ? table_name THEN - SELECT jsonb_insert(config, array['tables', table_name], jsonb_build_object()) INTO config; - END IF; - RETURN config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Add column to table configuration if not present ---! @internal ---! ---! Ensures the specified column exists in the table's configuration structure. ---! Creates empty column entry with indexes object if needed. Idempotent operation. ---! ---! @param table_name Text Name of parent table ---! @param column_name Text Name of column to add ---! @param config JSONB Configuration object ---! @return JSONB Updated configuration with column entry -CREATE FUNCTION eql_v2.config_add_column(table_name text, column_name text, config jsonb) - RETURNS jsonb - IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - col jsonb; - BEGIN - IF NOT config #> array['tables', table_name] ? column_name THEN - SELECT jsonb_build_object('indexes', jsonb_build_object()) into col; - SELECT jsonb_set(config, array['tables', table_name, column_name], col) INTO config; - END IF; - RETURN config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Set cast type for column in configuration ---! @internal ---! ---! Updates the cast_as field for a column, specifying the PostgreSQL type ---! that decrypted values should be cast to. ---! ---! @param table_name Text Name of parent table ---! @param column_name Text Name of column ---! @param cast_as Text PostgreSQL type for casting (e.g., 'text', 'int', 'jsonb') ---! @param config JSONB Configuration object ---! @return JSONB Updated configuration with cast_as set -CREATE FUNCTION eql_v2.config_add_cast(table_name text, column_name text, cast_as text, config jsonb) - RETURNS jsonb - IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - SELECT jsonb_set(config, array['tables', table_name, column_name, 'cast_as'], to_jsonb(cast_as)) INTO config; - RETURN config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Add search index to column configuration ---! @internal ---! ---! Inserts a search index entry (unique, match, ore, ste_vec) with its options ---! into the column's indexes object. ---! ---! @param table_name Text Name of parent table ---! @param column_name Text Name of column ---! @param index_name Text Type of index to add ---! @param opts JSONB Index-specific options ---! @param config JSONB Configuration object ---! @return JSONB Updated configuration with index added -CREATE FUNCTION eql_v2.config_add_index(table_name text, column_name text, index_name text, opts jsonb, config jsonb) - RETURNS jsonb - IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - SELECT jsonb_insert(config, array['tables', table_name, column_name, 'indexes', index_name], opts) INTO config; - RETURN config; - END; -$$ LANGUAGE plpgsql; - ---! @brief Generate default options for match index ---! @internal ---! ---! Returns default configuration for match (LIKE) indexes: k=6, bf=2048, ---! ngram tokenizer with token_length=3, downcase filter, include_original=true. ---! ---! @return JSONB Default match index options -CREATE FUNCTION eql_v2.config_match_default() - RETURNS jsonb -LANGUAGE sql STRICT PARALLEL SAFE -BEGIN ATOMIC - SELECT jsonb_build_object( - 'k', 6, - 'bf', 2048, - 'include_original', true, - 'tokenizer', json_build_object('kind', 'ngram', 'token_length', 3), - 'token_filters', json_build_array(json_build_object('kind', 'downcase'))); -END; diff --git a/src/config/indexes.sql b/src/config/indexes.sql deleted file mode 100644 index 7d1d683b5..000000000 --- a/src/config/indexes.sql +++ /dev/null @@ -1,28 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/config/tables.sql - - ---! @file config/indexes.sql ---! @brief Configuration state uniqueness indexes ---! ---! Creates partial unique indexes to enforce that only one configuration ---! can be in 'active', 'pending', or 'encrypting' state at any time. ---! Multiple 'inactive' configurations are allowed. ---! ---! @note Uses partial indexes (WHERE clauses) for efficiency ---! @note Prevents conflicting configurations from being active simultaneously ---! @see config/types.sql for state definitions - - ---! @brief Unique active configuration constraint ---! @note Only one configuration can be 'active' at once -CREATE UNIQUE INDEX ON public.eql_v2_configuration (state) WHERE state = 'active'; - ---! @brief Unique pending configuration constraint ---! @note Only one configuration can be 'pending' at once -CREATE UNIQUE INDEX ON public.eql_v2_configuration (state) WHERE state = 'pending'; - ---! @brief Unique encrypting configuration constraint ---! @note Only one configuration can be 'encrypting' at once -CREATE UNIQUE INDEX ON public.eql_v2_configuration (state) WHERE state = 'encrypting'; - diff --git a/src/config/tables.sql b/src/config/tables.sql deleted file mode 100644 index 72379013d..000000000 --- a/src/config/tables.sql +++ /dev/null @@ -1,33 +0,0 @@ --- REQUIRE: src/config/types.sql - ---! @file config/tables.sql ---! @brief Encryption configuration storage table ---! ---! Defines the main table for storing EQL v2 encryption configurations. ---! Each row represents a configuration specifying which tables/columns to encrypt ---! and what index types to use. Configurations progress through lifecycle states. ---! ---! @see config/types.sql for state ENUM definition ---! @see config/indexes.sql for state uniqueness constraints ---! @see config/constraints.sql for data validation - - ---! @brief Encryption configuration table ---! ---! Stores encryption configurations with their state and metadata. ---! The 'data' JSONB column contains the full configuration structure including ---! table/column mappings, index types, and casting rules. ---! ---! @note Only one configuration can be 'active', 'pending', or 'encrypting' at once ---! @note 'id' is auto-generated identity column ---! @note 'state' defaults to 'pending' for new configurations ---! @note 'data' validated by CHECK constraint (see config/constraints.sql) -CREATE TABLE IF NOT EXISTS public.eql_v2_configuration -( - id bigint GENERATED ALWAYS AS IDENTITY, - state eql_v2_configuration_state NOT NULL DEFAULT 'pending', - data jsonb, - created_at timestamptz not null default current_timestamp, - PRIMARY KEY(id) -); - diff --git a/src/config/types.sql b/src/config/types.sql deleted file mode 100644 index 3e9943340..000000000 --- a/src/config/types.sql +++ /dev/null @@ -1,28 +0,0 @@ ---! @file config/types.sql ---! @brief Configuration state type definition ---! ---! Defines the ENUM type for tracking encryption configuration lifecycle states. ---! The configuration table uses this type to manage transitions between states ---! during setup, activation, and encryption operations. ---! ---! @note CREATE TYPE does not support IF NOT EXISTS, so wrapped in DO block ---! @note Configuration data stored as JSONB directly, not as DOMAIN ---! @see config/tables.sql - - ---! @brief Configuration lifecycle state ---! ---! Defines valid states for encryption configurations in the eql_v2_configuration table. ---! Configurations transition through these states during setup and activation. ---! ---! @note Only one configuration can be in 'active', 'pending', or 'encrypting' state at once ---! @see config/indexes.sql for uniqueness enforcement ---! @see config/tables.sql for usage in eql_v2_configuration table -DO $$ - BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'eql_v2_configuration_state') THEN - CREATE TYPE public.eql_v2_configuration_state AS ENUM ('active', 'inactive', 'encrypting', 'pending'); - END IF; - END -$$; - diff --git a/src/crypto.sql b/src/crypto.sql deleted file mode 100644 index 3a986ecb8..000000000 --- a/src/crypto.sql +++ /dev/null @@ -1,57 +0,0 @@ --- REQUIRE: src/schema.sql - ---! @file crypto.sql ---! @brief PostgreSQL pgcrypto extension enablement ---! ---! Enables the pgcrypto extension which provides cryptographic functions ---! used by EQL for hashing and other cryptographic operations. ---! ---! Installs pgcrypto into the `extensions` schema (Supabase convention) to ---! avoid the `extension_in_public` lint. Every EQL function that uses ---! pgcrypto has `pg_catalog, extensions, public` on its `search_path`, so a ---! pre-existing install in `public` keeps working — and a pre-existing ---! install anywhere else will be rejected at install time rather than ---! failing later inside an encrypted comparison. ---! ---! @note pgcrypto provides functions like digest(), hmac(), gen_random_bytes() ---! @note If pgcrypto is already installed in `public`, EQL works but emits ---! a NOTICE recommending `ALTER EXTENSION pgcrypto SET SCHEMA extensions`. ---! @note If pgcrypto is already installed in any other schema, install ---! fails. Relocate it first with `ALTER EXTENSION pgcrypto SET SCHEMA ---! extensions` (or move it into `public` if compatibility with other ---! consumers requires it). - ---! @brief Create extensions schema (Supabase convention) -CREATE SCHEMA IF NOT EXISTS extensions; - ---! @brief Enable pgcrypto extension and validate its schema -DO $$ -DECLARE - pgcrypto_schema name; -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pgcrypto') THEN - CREATE EXTENSION pgcrypto WITH SCHEMA extensions; - END IF; - - SELECT n.nspname INTO pgcrypto_schema - FROM pg_extension e - JOIN pg_namespace n ON n.oid = e.extnamespace - WHERE e.extname = 'pgcrypto'; - - IF pgcrypto_schema = 'extensions' THEN - -- expected location, nothing to say - NULL; - ELSIF pgcrypto_schema = 'public' THEN - RAISE NOTICE - 'pgcrypto is installed in the `public` schema. EQL works against this layout, ' - 'but Supabase splinter will flag it as `extension_in_public`. Move it with: ' - 'ALTER EXTENSION pgcrypto SET SCHEMA extensions'; - ELSE - RAISE EXCEPTION - 'pgcrypto is installed in schema `%`, which is not on the EQL function search_path ' - '(pg_catalog, extensions, public). EQL cryptographic operations would fail at ' - 'runtime. Relocate the extension before installing EQL: ' - 'ALTER EXTENSION pgcrypto SET SCHEMA extensions', - pgcrypto_schema; - END IF; -END $$; diff --git a/src/encrypted/aggregates.sql b/src/encrypted/aggregates.sql deleted file mode 100644 index 9c5b7d932..000000000 --- a/src/encrypted/aggregates.sql +++ /dev/null @@ -1,102 +0,0 @@ --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql - --- Aggregate functions for ORE - ---! @brief State transition function for min aggregate ---! @internal ---! ---! Returns the smaller of two encrypted values for use in MIN aggregate. ---! Comparison uses ORE index terms without decryption. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return eql_v2_encrypted The smaller of the two values ---! ---! @see eql_v2.min(eql_v2_encrypted) -CREATE FUNCTION eql_v2.min(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS eql_v2_encrypted -STRICT - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF a < b THEN - RETURN a; - ELSE - RETURN b; - END IF; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Find minimum encrypted value in a group ---! ---! Aggregate function that returns the minimum encrypted value in a group ---! using ORE index term comparisons without decryption. ---! ---! @param input eql_v2_encrypted Encrypted values to aggregate ---! @return eql_v2_encrypted Minimum value in the group ---! ---! @example ---! -- Find minimum age per department ---! SELECT department, eql_v2.min(encrypted_age) ---! FROM employees ---! GROUP BY department; ---! ---! @note Requires 'ore' index configuration on the column ---! @see eql_v2.min(eql_v2_encrypted, eql_v2_encrypted) -CREATE AGGREGATE eql_v2.min(eql_v2_encrypted) -( - sfunc = eql_v2.min, - stype = eql_v2_encrypted -); - - ---! @brief State transition function for max aggregate ---! @internal ---! ---! Returns the larger of two encrypted values for use in MAX aggregate. ---! Comparison uses ORE index terms without decryption. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return eql_v2_encrypted The larger of the two values ---! ---! @see eql_v2.max(eql_v2_encrypted) -CREATE FUNCTION eql_v2.max(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS eql_v2_encrypted -STRICT - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF a > b THEN - RETURN a; - ELSE - RETURN b; - END IF; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Find maximum encrypted value in a group ---! ---! Aggregate function that returns the maximum encrypted value in a group ---! using ORE index term comparisons without decryption. ---! ---! @param input eql_v2_encrypted Encrypted values to aggregate ---! @return eql_v2_encrypted Maximum value in the group ---! ---! @example ---! -- Find maximum salary per department ---! SELECT department, eql_v2.max(encrypted_salary) ---! FROM employees ---! GROUP BY department; ---! ---! @note Requires 'ore' index configuration on the column ---! @see eql_v2.max(eql_v2_encrypted, eql_v2_encrypted) -CREATE AGGREGATE eql_v2.max(eql_v2_encrypted) -( - sfunc = eql_v2.max, - stype = eql_v2_encrypted -); diff --git a/src/encrypted/casts.sql b/src/encrypted/casts.sql deleted file mode 100644 index 8282a3d1d..000000000 --- a/src/encrypted/casts.sql +++ /dev/null @@ -1,92 +0,0 @@ - --- REQUIRE: src/encrypted/types.sql - - ---! @brief Convert JSONB to encrypted type ---! ---! Wraps a JSONB encrypted payload into the eql_v2_encrypted composite type. ---! Used internally for type conversions and operator implementations. ---! ---! @param jsonb JSONB encrypted payload with structure: {"c": "...", "i": {...}, "k": "...", "v": "2"} ---! @return eql_v2_encrypted Encrypted value wrapped in composite type ---! ---! @note This is primarily used for implicit casts in operator expressions ---! @see eql_v2.to_jsonb -CREATE FUNCTION eql_v2.to_encrypted(data jsonb) - RETURNS public.eql_v2_encrypted - IMMUTABLE STRICT PARALLEL SAFE - LANGUAGE SQL -AS $$ - SELECT ROW(data)::public.eql_v2_encrypted; -$$; - - ---! @brief Implicit cast from JSONB to encrypted type ---! ---! Enables PostgreSQL to automatically convert JSONB values to eql_v2_encrypted ---! in assignment contexts and comparison operations. ---! ---! @see eql_v2.to_encrypted(jsonb) -CREATE CAST (jsonb AS public.eql_v2_encrypted) - WITH FUNCTION eql_v2.to_encrypted(jsonb) AS ASSIGNMENT; - - ---! @brief Convert text to encrypted type ---! ---! Parses a text representation of encrypted JSONB payload and wraps it ---! in the eql_v2_encrypted composite type. ---! ---! @param text Text representation of JSONB encrypted payload ---! @return eql_v2_encrypted Encrypted value wrapped in composite type ---! ---! @note Delegates to eql_v2.to_encrypted(jsonb) after parsing text as JSON ---! @see eql_v2.to_encrypted(jsonb) -CREATE FUNCTION eql_v2.to_encrypted(data text) - RETURNS public.eql_v2_encrypted - IMMUTABLE STRICT PARALLEL SAFE - LANGUAGE SQL -AS $$ - SELECT eql_v2.to_encrypted(data::jsonb); -$$; - - ---! @brief Implicit cast from text to encrypted type ---! ---! Enables PostgreSQL to automatically convert text JSON strings to eql_v2_encrypted ---! in assignment contexts. ---! ---! @see eql_v2.to_encrypted(text) -CREATE CAST (text AS public.eql_v2_encrypted) - WITH FUNCTION eql_v2.to_encrypted(text) AS ASSIGNMENT; - - - ---! @brief Convert encrypted type to JSONB ---! ---! Extracts the underlying JSONB payload from an eql_v2_encrypted composite type. ---! Useful for debugging or when raw encrypted payload access is needed. ---! ---! @param e eql_v2_encrypted Encrypted value to unwrap ---! @return jsonb Raw JSONB encrypted payload ---! ---! @note Returns the raw encrypted structure including ciphertext and index terms ---! @see eql_v2.to_encrypted(jsonb) -CREATE FUNCTION eql_v2.to_jsonb(e public.eql_v2_encrypted) - RETURNS jsonb - IMMUTABLE STRICT PARALLEL SAFE - LANGUAGE SQL -AS $$ - SELECT e.data; -$$; - ---! @brief Implicit cast from encrypted type to JSONB ---! ---! Enables PostgreSQL to automatically extract the JSONB payload from ---! eql_v2_encrypted values in assignment contexts. ---! ---! @see eql_v2.to_jsonb(eql_v2_encrypted) -CREATE CAST (public.eql_v2_encrypted AS jsonb) - WITH FUNCTION eql_v2.to_jsonb(public.eql_v2_encrypted) AS ASSIGNMENT; - - - diff --git a/src/encrypted/compare.sql b/src/encrypted/compare.sql deleted file mode 100644 index 6e578f6a5..000000000 --- a/src/encrypted/compare.sql +++ /dev/null @@ -1,31 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql - ---! @brief Fallback literal comparison for encrypted values ---! @internal ---! ---! Compares two encrypted values by their raw JSONB representation when no ---! suitable index terms are available. This ensures consistent ordering required ---! for btree correctness and prevents "lock BufferContent is not held" errors. ---! ---! Used as a last resort fallback in eql_v2.compare() when encrypted values ---! lack matching index terms (hmac_256, ore). ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return integer -1 if a < b, 0 if a = b, 1 if a > b ---! ---! @note This compares the encrypted payloads directly, not the plaintext values ---! @note Ordering is consistent but not meaningful for range queries ---! @see eql_v2.compare -CREATE FUNCTION eql_v2.compare_literal(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - LANGUAGE SQL -AS $$ - SELECT CASE - WHEN a.data < b.data THEN -1 - WHEN a.data > b.data THEN 1 - ELSE 0 - END; -$$; diff --git a/src/encrypted/constraints.sql b/src/encrypted/constraints.sql deleted file mode 100644 index a1204c780..000000000 --- a/src/encrypted/constraints.sql +++ /dev/null @@ -1,171 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/functions.sql - - ---! @brief Validate presence of ident field in encrypted payload ---! @internal ---! ---! Checks that the encrypted JSONB payload contains the required 'i' (ident) field. ---! The ident field tracks which table and column the encrypted value belongs to. ---! ---! @param jsonb Encrypted payload to validate ---! @return Boolean True if 'i' field is present ---! @throws Exception if 'i' field is missing ---! ---! @note Used in CHECK constraints to ensure payload structure ---! @see eql_v2.check_encrypted -CREATE FUNCTION eql_v2._encrypted_check_i(val jsonb) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF val ? 'i' THEN - RETURN true; - END IF; - RAISE 'Encrypted column missing ident (i) field: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Validate table and column fields in ident ---! @internal ---! ---! Checks that the 'i' (ident) field contains both 't' (table) and 'c' (column) ---! subfields, which identify the origin of the encrypted value. ---! ---! @param jsonb Encrypted payload to validate ---! @return Boolean True if both 't' and 'c' subfields are present ---! @throws Exception if 't' or 'c' subfields are missing ---! ---! @note Used in CHECK constraints to ensure payload structure ---! @see eql_v2.check_encrypted -CREATE FUNCTION eql_v2._encrypted_check_i_ct(val jsonb) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF (val->'i' ?& array['t', 'c']) THEN - RETURN true; - END IF; - RAISE 'Encrypted column ident (i) missing table (t) or column (c) fields: %', val; - END; -$$ LANGUAGE plpgsql; - ---! @brief Validate version field in encrypted payload ---! @internal ---! ---! Checks that the encrypted payload has version field 'v' set to '2', ---! the current EQL v2 payload version. ---! ---! @param jsonb Encrypted payload to validate ---! @return Boolean True if 'v' field is present and equals '2' ---! @throws Exception if 'v' field is missing or not '2' ---! ---! @note Used in CHECK constraints to ensure payload structure ---! @see eql_v2.check_encrypted -CREATE FUNCTION eql_v2._encrypted_check_v(val jsonb) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF (val ? 'v') THEN - - IF val->>'v' <> '2' THEN - RAISE 'Expected encrypted column version (v) 2'; - RETURN false; - END IF; - - RETURN true; - END IF; - RAISE 'Encrypted column missing version (v) field: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Validate ciphertext field in encrypted payload ---! @internal ---! ---! Checks that the encrypted payload carries the required root-level ciphertext ---! envelope. The v2.3 payload schema admits two mutually exclusive top-level ---! shapes (`docs/reference/schema/eql-payload-v2.3.schema.json`): ---! ---! - `EncryptedPayload` (scalar) — carries `c` at the root. ---! - `SteVecPayload` (jsonb / structured) — carries `sv` at the root; the ---! root document ciphertext lives inside `sv[0].c`, so `c` is absent at ---! the root. ---! ---! Either shape satisfies this check. Per-element ciphertext validity on ---! `sv` entries is enforced separately by the `eql_v2.ste_vec_entry` DOMAIN. ---! ---! @param jsonb Encrypted payload to validate ---! @return Boolean True if either 'c' or 'sv' is present at the root ---! @throws Exception if neither 'c' nor 'sv' is present ---! ---! @note Used in CHECK constraints to ensure payload structure ---! @see eql_v2.check_encrypted -CREATE FUNCTION eql_v2._encrypted_check_c(val jsonb) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF (val ? 'c') OR (val ? 'sv') THEN - RETURN true; - END IF; - RAISE 'Encrypted column missing ciphertext (c) or ste_vec (sv) field: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Validate complete encrypted payload structure ---! ---! Comprehensive validation function that checks all required fields in an ---! encrypted JSONB payload: version ('v'), ciphertext ('c'), ident ('i'), ---! and ident subfields ('t', 'c'). ---! ---! This function is used in CHECK constraints to ensure encrypted column ---! data integrity at the database level. ---! ---! @param jsonb Encrypted payload to validate ---! @return Boolean True if all structure checks pass ---! @throws Exception if any required field is missing or invalid ---! ---! @example ---! -- Add validation constraint to encrypted column ---! ALTER TABLE users ADD CONSTRAINT check_email_encrypted ---! CHECK (eql_v2.check_encrypted(encrypted_email::jsonb)); ---! ---! @see eql_v2._encrypted_check_v ---! @see eql_v2._encrypted_check_c ---! @see eql_v2._encrypted_check_i ---! @see eql_v2._encrypted_check_i_ct -CREATE FUNCTION eql_v2.check_encrypted(val jsonb) - RETURNS BOOLEAN -LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN ( - eql_v2._encrypted_check_v(val) AND - eql_v2._encrypted_check_c(val) AND - eql_v2._encrypted_check_i(val) AND - eql_v2._encrypted_check_i_ct(val) - ); -END; - - ---! @brief Validate encrypted composite type structure ---! ---! Validates an eql_v2_encrypted composite type by checking its underlying ---! JSONB payload. Delegates to eql_v2.check_encrypted(jsonb). ---! ---! @param eql_v2_encrypted Encrypted value to validate ---! @return Boolean True if structure is valid ---! @throws Exception if any required field is missing or invalid ---! ---! @see eql_v2.check_encrypted(jsonb) -CREATE FUNCTION eql_v2.check_encrypted(val eql_v2_encrypted) - RETURNS BOOLEAN -LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN eql_v2.check_encrypted(val.data); -END; - diff --git a/src/encrypted/functions.sql b/src/encrypted/functions.sql deleted file mode 100644 index 64272cb40..000000000 --- a/src/encrypted/functions.sql +++ /dev/null @@ -1,206 +0,0 @@ --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/bloom_filter/types.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/hmac_256/types.sql - ---! @brief Extract ciphertext from encrypted JSONB value ---! ---! Extracts the ciphertext (c field) from a raw JSONB encrypted value. ---! The ciphertext is the base64-encoded encrypted data. ---! ---! @param jsonb containing encrypted EQL payload ---! @return Text Base64-encoded ciphertext string ---! @throws Exception if 'c' field is not present in JSONB ---! ---! @example ---! -- Extract ciphertext from JSONB literal ---! SELECT eql_v2.ciphertext('{"c":"AQIDBA==","i":{"unique":"..."}}'::jsonb); ---! ---! @see eql_v2.ciphertext(eql_v2_encrypted) ---! @see eql_v2.meta_data -CREATE FUNCTION eql_v2.ciphertext(val jsonb) - RETURNS text - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF val ? 'c' THEN - RETURN val->>'c'; - END IF; - RAISE 'Expected a ciphertext (c) value in json: %', val; - END; -$$ LANGUAGE plpgsql; - ---! @brief Extract ciphertext from encrypted column value ---! ---! Extracts the ciphertext from an encrypted column value. Convenience ---! overload that unwraps eql_v2_encrypted type and delegates to JSONB version. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return Text Base64-encoded ciphertext string ---! @throws Exception if encrypted value is malformed ---! ---! @example ---! -- Extract ciphertext from encrypted column ---! SELECT eql_v2.ciphertext(encrypted_email) FROM users; ---! ---! @see eql_v2.ciphertext(jsonb) ---! @see eql_v2.meta_data -CREATE FUNCTION eql_v2.ciphertext(val eql_v2_encrypted) - RETURNS text - IMMUTABLE STRICT PARALLEL SAFE - LANGUAGE SQL -AS $$ - SELECT eql_v2.ciphertext(val.data); -$$; - ---! @brief State transition function for grouped_value aggregate ---! @internal ---! ---! Returns the first non-null value encountered. Used as state function ---! for the grouped_value aggregate to select first value in each group. ---! ---! @param $1 JSONB Accumulated state (first non-null value found) ---! @param $2 JSONB New value from current row ---! @return JSONB First non-null value (state or new value) ---! ---! @see eql_v2.grouped_value -CREATE FUNCTION eql_v2._first_grouped_value(jsonb, jsonb) -RETURNS jsonb -AS $$ - SELECT COALESCE($1, $2); -$$ LANGUAGE sql IMMUTABLE; - ---! @brief Return first non-null encrypted value in a group ---! ---! Aggregate function that returns the first non-null encrypted value ---! encountered within a GROUP BY clause. Useful for deduplication or ---! selecting representative values from grouped encrypted data. ---! ---! @param input JSONB Encrypted values to aggregate ---! @return JSONB First non-null encrypted value in group ---! ---! @example ---! -- Get first email per user group ---! SELECT user_id, eql_v2.grouped_value(encrypted_email) ---! FROM user_emails ---! GROUP BY user_id; ---! ---! -- Deduplicate encrypted values ---! SELECT DISTINCT ON (user_id) ---! user_id, ---! eql_v2.grouped_value(encrypted_ssn) as primary_ssn ---! FROM user_records ---! GROUP BY user_id; ---! ---! @see eql_v2._first_grouped_value -CREATE AGGREGATE eql_v2.grouped_value(jsonb) ( - SFUNC = eql_v2._first_grouped_value, - STYPE = jsonb -); - ---! @brief Add validation constraint to encrypted column ---! ---! Adds a CHECK constraint to ensure column values conform to encrypted data ---! structure. Constraint uses eql_v2.check_encrypted to validate format. ---! Called automatically by eql_v2.add_column. ---! ---! @param table_name TEXT Name of table containing the column ---! @param column_name TEXT Name of column to constrain ---! @return Void ---! ---! @example ---! -- Manually add constraint (normally done by add_column) ---! SELECT eql_v2.add_encrypted_constraint('users', 'encrypted_email'); ---! ---! -- Resulting constraint: ---! -- ALTER TABLE users ADD CONSTRAINT eql_v2_encrypted_check_encrypted_email ---! -- CHECK (eql_v2.check_encrypted(encrypted_email)); ---! ---! @see eql_v2.add_column ---! @see eql_v2.remove_encrypted_constraint -CREATE FUNCTION eql_v2.add_encrypted_constraint(table_name TEXT, column_name TEXT) - RETURNS void - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - EXECUTE format('ALTER TABLE %I ADD CONSTRAINT eql_v2_encrypted_constraint_%I_%I CHECK (eql_v2.check_encrypted(%I))', table_name, table_name, column_name, column_name); - EXCEPTION - WHEN duplicate_table THEN - WHEN duplicate_object THEN - RAISE NOTICE 'Constraint `eql_v2_encrypted_constraint_%_%` already exists, skipping', table_name, column_name; - END; -$$ LANGUAGE plpgsql; - ---! @brief Remove validation constraint from encrypted column ---! ---! Removes the CHECK constraint that validates encrypted data structure. ---! Called automatically by eql_v2.remove_column. Uses IF EXISTS to avoid ---! errors if constraint doesn't exist. ---! ---! @param table_name TEXT Name of table containing the column ---! @param column_name TEXT Name of column to unconstrain ---! @return Void ---! ---! @example ---! -- Manually remove constraint (normally done by remove_column) ---! SELECT eql_v2.remove_encrypted_constraint('users', 'encrypted_email'); ---! ---! @see eql_v2.remove_column ---! @see eql_v2.add_encrypted_constraint -CREATE FUNCTION eql_v2.remove_encrypted_constraint(table_name TEXT, column_name TEXT) - RETURNS void - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - EXECUTE format('ALTER TABLE %I DROP CONSTRAINT IF EXISTS eql_v2_encrypted_constraint_%I_%I', table_name, table_name, column_name); - END; -$$ LANGUAGE plpgsql; - ---! @brief Extract metadata from encrypted JSONB value ---! ---! Extracts index terms (i) and version (v) from a raw JSONB encrypted value. ---! Returns metadata object containing searchable index terms without ciphertext. ---! ---! @param jsonb containing encrypted EQL payload ---! @return JSONB Metadata object with 'i' (index terms) and 'v' (version) fields ---! ---! @example ---! -- Extract metadata to inspect index terms ---! SELECT eql_v2.meta_data('{"c":"...","i":{"unique":"abc123"},"v":1}'::jsonb); ---! -- Returns: {"i":{"unique":"abc123"},"v":1} ---! ---! @see eql_v2.meta_data(eql_v2_encrypted) ---! @see eql_v2.ciphertext -CREATE FUNCTION eql_v2.meta_data(val jsonb) - RETURNS jsonb - IMMUTABLE STRICT PARALLEL SAFE - LANGUAGE SQL -AS $$ - SELECT jsonb_build_object('i', val->'i', 'v', val->'v'); -$$; - ---! @brief Extract metadata from encrypted column value ---! ---! Extracts index terms and version from an encrypted column value. ---! Convenience overload that unwraps eql_v2_encrypted type and ---! delegates to JSONB version. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return JSONB Metadata object with 'i' (index terms) and 'v' (version) fields ---! ---! @example ---! -- Inspect index terms for encrypted column ---! SELECT user_id, eql_v2.meta_data(encrypted_email) as email_metadata ---! FROM users; ---! ---! @see eql_v2.meta_data(jsonb) ---! @see eql_v2.ciphertext -CREATE FUNCTION eql_v2.meta_data(val eql_v2_encrypted) - RETURNS jsonb - IMMUTABLE STRICT PARALLEL SAFE - LANGUAGE SQL -AS $$ - SELECT eql_v2.meta_data(val.data); -$$; - diff --git a/src/encrypted/hash.sql b/src/encrypted/hash.sql deleted file mode 100644 index 4aaff5911..000000000 --- a/src/encrypted/hash.sql +++ /dev/null @@ -1,42 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/hmac_256/types.sql --- REQUIRE: src/hmac_256/functions.sql - ---! @brief Compute hash integer for encrypted value ---! ---! Produces a 32-bit integer hash suitable for PostgreSQL hash joins, GROUP BY, ---! DISTINCT, and hash aggregate operations. Used by the `eql_v2_encrypted` hash ---! operator class (`FUNCTION 1`). Inlinable single-statement SQL — the SQL ---! function machinery is much cheaper per row than plpgsql, which matters ---! because HashAggregate / hash-join call this once per input row. ---! ---! Returns `hashtext` of the root payload's `hm` term. This is the canonical ---! bucket for equality groups, since `=` on `eql_v2_encrypted` reduces to ---! `hmac_256(a) = hmac_256(b)` post-#193. ---! ---! @par Contract ---! Callers using `GROUP BY` / `DISTINCT` / hash joins on `eql_v2_encrypted` ---! MUST configure the column with a `unique` index so the crypto layer ---! emits `hm` — `hm` is assumed present. A missing `hm` is a misconfiguration ---! that surfaces upstream via [U-002](docs/upgrading/v2.3.md#u-002-equality-and-hashing-require-hmac). ---! ---! @param val eql_v2_encrypted Encrypted value to hash ---! @return integer 32-bit hash value derived from `hm` ---! ---! @note For grouping a value extracted from an encrypted JSON document, use ---! the field-level recipe directly: `GROUP BY eql_v2.eq_term(col -> '')` ---! (covers both hm-bearing and oc-bearing selectors via the XOR-aware ---! extractor — see `src/ste_vec/eq_term.sql`). That bypasses ---! `hash_encrypted` entirely. ---! ---! @see eql_v2.hmac_256 ---! @see eql_v2.has_hmac_256 ---! @see eql_v2.compare -CREATE FUNCTION eql_v2.hash_encrypted(val eql_v2_encrypted) - RETURNS integer - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT pg_catalog.hashtext(eql_v2.hmac_256(val)::text) -$$; diff --git a/src/encrypted/types.sql b/src/encrypted/types.sql deleted file mode 100644 index d18813d4d..000000000 --- a/src/encrypted/types.sql +++ /dev/null @@ -1,36 +0,0 @@ --- REQUIRE: src/schema.sql - ---! @brief Composite type for encrypted column data ---! ---! Core type used for all encrypted columns in EQL. Stores encrypted data as JSONB ---! with the following structure: ---! - `c`: ciphertext (base64-encoded encrypted value) ---! - `i`: index terms (searchable metadata for encrypted searches) ---! - `k`: key ID (identifier for encryption key) ---! - `m`: metadata (additional encryption metadata) ---! ---! Created in public schema to persist independently of eql_v2 schema lifecycle. ---! Customer data columns use this type, so it must not be dropped if data exists. ---! ---! @note DO NOT DROP this type unless absolutely certain no encrypted data uses it ---! @see eql_v2.ciphertext ---! @see eql_v2.meta_data ---! @see eql_v2.add_column -DO $$ - BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'eql_v2_encrypted') THEN - CREATE TYPE public.eql_v2_encrypted AS ( - data jsonb - ); - END IF; - END -$$; - - - - - - - - - diff --git a/src/encryptindex/functions.sql b/src/encryptindex/functions.sql deleted file mode 100644 index 59d9a0885..000000000 --- a/src/encryptindex/functions.sql +++ /dev/null @@ -1,229 +0,0 @@ ---! @file encryptindex/functions.sql ---! @brief Configuration lifecycle and column encryption management ---! ---! Provides functions for managing encryption configuration transitions: ---! - Comparing configurations to identify changes ---! - Identifying columns needing encryption ---! - Creating and renaming encrypted columns during initial setup ---! - Tracking encryption progress ---! ---! These functions support the workflow of activating a pending configuration ---! and performing the initial encryption of plaintext columns. - - ---! @brief Compare two configurations and find differences ---! @internal ---! ---! Returns table/column pairs where configuration differs between two configs. ---! Used to identify which columns need encryption when activating a pending config. ---! ---! @param a jsonb First configuration to compare ---! @param b jsonb Second configuration to compare ---! @return TABLE(table_name text, column_name text) Columns with differing configuration ---! ---! @note Compares configuration structure, not just presence/absence ---! @see eql_v2.select_pending_columns -CREATE FUNCTION eql_v2.diff_config(a JSONB, b JSONB) - RETURNS TABLE(table_name TEXT, column_name TEXT) -IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN QUERY - WITH table_keys AS ( - SELECT jsonb_object_keys(a->'tables') AS key - UNION - SELECT jsonb_object_keys(b->'tables') AS key - ), - column_keys AS ( - SELECT tk.key AS table_key, jsonb_object_keys(a->'tables'->tk.key) AS column_key - FROM table_keys tk - UNION - SELECT tk.key AS table_key, jsonb_object_keys(b->'tables'->tk.key) AS column_key - FROM table_keys tk - ) - SELECT - ck.table_key AS table_name, - ck.column_key AS column_name - FROM - column_keys ck - WHERE - (a->'tables'->ck.table_key->ck.column_key IS DISTINCT FROM b->'tables'->ck.table_key->ck.column_key); - END; -$$ LANGUAGE plpgsql; - - ---! @brief Get columns with pending configuration changes ---! ---! Compares 'pending' and 'active' configurations to identify columns that need ---! encryption or re-encryption. Returns columns where configuration differs. ---! ---! @return TABLE(table_name text, column_name text) Columns needing encryption ---! @throws Exception if no pending configuration exists ---! ---! @note Treats missing active config as empty config ---! @see eql_v2.diff_config ---! @see eql_v2.select_target_columns -CREATE FUNCTION eql_v2.select_pending_columns() - RETURNS TABLE(table_name TEXT, column_name TEXT) - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - active JSONB; - pending JSONB; - config_id BIGINT; - BEGIN - SELECT data INTO active FROM eql_v2_configuration WHERE state = 'active'; - - -- set default config - IF active IS NULL THEN - active := '{}'; - END IF; - - SELECT id, data INTO config_id, pending FROM eql_v2_configuration WHERE state = 'pending'; - - -- set default config - IF config_id IS NULL THEN - RAISE EXCEPTION 'No pending configuration exists to encrypt'; - END IF; - - RETURN QUERY - SELECT d.table_name, d.column_name FROM eql_v2.diff_config(active, pending) as d; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Map pending columns to their encrypted target columns ---! ---! For each column with pending configuration, identifies the corresponding ---! encrypted column. During initial encryption, target is '{column_name}_encrypted'. ---! Returns NULL for target_column if encrypted column doesn't exist yet. ---! ---! @return TABLE(table_name text, column_name text, target_column text) Column mappings ---! ---! @note Target column is NULL if no column exists matching either 'column_name' or 'column_name_encrypted' with type eql_v2_encrypted ---! @note The LEFT JOIN checks both original and '_encrypted' suffix variations with type verification ---! @see eql_v2.select_pending_columns ---! @see eql_v2.create_encrypted_columns -CREATE FUNCTION eql_v2.select_target_columns() - RETURNS TABLE(table_name TEXT, column_name TEXT, target_column TEXT) - STABLE STRICT PARALLEL SAFE -AS $$ - SELECT - c.table_name, - c.column_name, - s.column_name as target_column - FROM - eql_v2.select_pending_columns() c - LEFT JOIN information_schema.columns s ON - s.table_name = c.table_name AND - (s.column_name = c.column_name OR s.column_name = c.column_name || '_encrypted') AND - s.udt_name = 'eql_v2_encrypted'; -$$ LANGUAGE sql; - - ---! @brief Check if database is ready for encryption ---! ---! Verifies that all columns with pending configuration have corresponding ---! encrypted target columns created. Returns true if encryption can proceed. ---! ---! @return boolean True if all pending columns have target encrypted columns ---! ---! @note Returns false if any pending column lacks encrypted column ---! @see eql_v2.select_target_columns ---! @see eql_v2.create_encrypted_columns -CREATE FUNCTION eql_v2.ready_for_encryption() - RETURNS BOOLEAN - STABLE STRICT PARALLEL SAFE -AS $$ - SELECT EXISTS ( - SELECT * - FROM eql_v2.select_target_columns() AS c - WHERE c.target_column IS NOT NULL); -$$ LANGUAGE sql; - - ---! @brief Create encrypted columns for initial encryption ---! ---! For each plaintext column with pending configuration that lacks an encrypted ---! target column, creates a new column '{column_name}_encrypted' of type ---! eql_v2_encrypted. This prepares the database schema for initial encryption. ---! ---! @return TABLE(table_name text, column_name text) Created encrypted columns ---! ---! @warning Executes dynamic DDL (ALTER TABLE ADD COLUMN) - modifies database schema ---! @note Only creates columns that don't already exist ---! @see eql_v2.select_target_columns ---! @see eql_v2.rename_encrypted_columns -CREATE FUNCTION eql_v2.create_encrypted_columns() - RETURNS TABLE(table_name TEXT, column_name TEXT) - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - FOR table_name, column_name IN - SELECT c.table_name, (c.column_name || '_encrypted') FROM eql_v2.select_target_columns() AS c WHERE c.target_column IS NULL - LOOP - EXECUTE format('ALTER TABLE %I ADD column %I eql_v2_encrypted;', table_name, column_name); - RETURN NEXT; - END LOOP; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Finalize initial encryption by renaming columns ---! ---! After initial encryption completes, renames columns to complete the transition: ---! - Plaintext column '{column_name}' → '{column_name}_plaintext' ---! - Encrypted column '{column_name}_encrypted' → '{column_name}' ---! ---! This makes the encrypted column the primary column with the original name. ---! ---! @return TABLE(table_name text, column_name text, target_column text) Renamed columns ---! ---! @warning Executes dynamic DDL (ALTER TABLE RENAME COLUMN) - modifies database schema ---! @note Only renames columns where target is '{column_name}_encrypted' ---! @see eql_v2.create_encrypted_columns -CREATE FUNCTION eql_v2.rename_encrypted_columns() - RETURNS TABLE(table_name TEXT, column_name TEXT, target_column TEXT) - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - FOR table_name, column_name, target_column IN - SELECT * FROM eql_v2.select_target_columns() as c WHERE c.target_column = c.column_name || '_encrypted' - LOOP - EXECUTE format('ALTER TABLE %I RENAME %I TO %I;', table_name, column_name, column_name || '_plaintext'); - EXECUTE format('ALTER TABLE %I RENAME %I TO %I;', table_name, target_column, column_name); - RETURN NEXT; - END LOOP; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Count rows encrypted with active configuration ---! @internal ---! ---! Counts rows in a table where the encrypted column was encrypted using ---! the currently active configuration. Used to track encryption progress. ---! ---! @param table_name text Name of table to check ---! @param column_name text Name of encrypted column to check ---! @return bigint Count of rows encrypted with active configuration ---! ---! @note The 'v' field in encrypted payloads stores the payload version ("2"), not the configuration ID ---! @note Configuration tracking mechanism is implementation-specific -CREATE FUNCTION eql_v2.count_encrypted_with_active_config(table_name TEXT, column_name TEXT) - RETURNS BIGINT - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - result BIGINT; -BEGIN - EXECUTE format( - 'SELECT COUNT(%I) FROM %s t WHERE %I->>%L = (SELECT id::TEXT FROM eql_v2_configuration WHERE state = %L)', - column_name, table_name, column_name, 'v', 'active' - ) - INTO result; - RETURN result; -END; -$$ LANGUAGE plpgsql; - diff --git a/src/hmac_256/compare.sql b/src/hmac_256/compare.sql deleted file mode 100644 index 160a2166f..000000000 --- a/src/hmac_256/compare.sql +++ /dev/null @@ -1,78 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/hmac_256/types.sql --- REQUIRE: src/hmac_256/functions.sql - - ---! @brief Compare two encrypted values using HMAC-SHA256 index terms ---! ---! Performs a three-way comparison (returns -1/0/1) of encrypted values using ---! their HMAC-SHA256 hash index terms. Used internally by the equality operator (=) ---! for exact-match queries without decryption. ---! ---! @param a eql_v2_encrypted First encrypted value to compare ---! @param b eql_v2_encrypted Second encrypted value to compare ---! @return Integer -1 if a < b, 0 if a = b, 1 if a > b ---! ---! @note NULL values are sorted before non-NULL values ---! @note Comparison uses underlying text type ordering of HMAC-SHA256 hashes ---! ---! @see eql_v2.hmac_256 ---! @see eql_v2.has_hmac_256 ---! @see eql_v2."=" -CREATE FUNCTION eql_v2.compare_hmac_256(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - a_term eql_v2.hmac_256; - b_term eql_v2.hmac_256; - BEGIN - - IF a IS NULL AND b IS NULL THEN - RETURN 0; - END IF; - - IF a IS NULL THEN - RETURN -1; - END IF; - - IF b IS NULL THEN - RETURN 1; - END IF; - - IF eql_v2.has_hmac_256(a) THEN - a_term = eql_v2.hmac_256(a); - END IF; - - IF eql_v2.has_hmac_256(b) THEN - b_term = eql_v2.hmac_256(b); - END IF; - - IF a_term IS NULL AND b_term IS NULL THEN - RETURN 0; - END IF; - - IF a_term IS NULL THEN - RETURN -1; - END IF; - - IF b_term IS NULL THEN - RETURN 1; - END IF; - - -- Using the underlying text type comparison - IF a_term = b_term THEN - RETURN 0; - END IF; - - IF a_term < b_term THEN - RETURN -1; - END IF; - - IF a_term > b_term THEN - RETURN 1; - END IF; - - END; -$$ LANGUAGE plpgsql; diff --git a/src/hmac_256/functions.sql b/src/hmac_256/functions.sql deleted file mode 100644 index 6c910f2dd..000000000 --- a/src/hmac_256/functions.sql +++ /dev/null @@ -1,129 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/hmac_256/types.sql --- REQUIRE: src/ste_vec/types.sql - ---! @brief Extract HMAC-SHA256 index term from JSONB payload ---! ---! Extracts the HMAC-SHA256 hash value from the 'hm' field of an encrypted ---! data payload. Inlinable single-statement SQL — the planner can fold this ---! into the calling query so functional hash indexes built on ---! `eql_v2.hmac_256(col)` engage structurally. ---! ---! @param jsonb containing encrypted EQL payload ---! @return eql_v2.hmac_256 HMAC-SHA256 hash value, or NULL when `hm` is absent ---! ---! @note Returns NULL when the payload lacks `hm`. Callers that need to ---! surface misconfiguration loudly should use ---! `eql_v2.hash_encrypted` (`GROUP BY` / `DISTINCT` / hash joins) ---! which raises with a clear message when `hm` is missing. ---! ---! @see eql_v2.has_hmac_256 ---! @see eql_v2.compare_hmac_256 ---! @see eql_v2.hash_encrypted -CREATE FUNCTION eql_v2.hmac_256(val jsonb) - RETURNS eql_v2.hmac_256 - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT (val ->> 'hm')::eql_v2.hmac_256 -$$; - - ---! @brief Check if JSONB payload contains HMAC-SHA256 index term ---! ---! Tests whether the encrypted data payload includes an 'hm' field, ---! indicating an HMAC-SHA256 hash is available for exact-match queries. ---! ---! @param jsonb containing encrypted EQL payload ---! @return Boolean True if 'hm' field is present and non-null ---! ---! @see eql_v2.hmac_256 -CREATE FUNCTION eql_v2.has_hmac_256(val jsonb) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN val ->> 'hm' IS NOT NULL; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Check if encrypted column value contains HMAC-SHA256 index term ---! ---! Tests whether an encrypted column value includes an HMAC-SHA256 hash ---! by checking its underlying JSONB data field. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return Boolean True if HMAC-SHA256 hash is present ---! ---! @see eql_v2.has_hmac_256(jsonb) -CREATE FUNCTION eql_v2.has_hmac_256(val eql_v2_encrypted) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.has_hmac_256(val.data); - END; -$$ LANGUAGE plpgsql; - - - ---! @brief Extract HMAC-SHA256 index term from encrypted column value ---! ---! Extracts the HMAC-SHA256 hash from an encrypted column value. Inlinable ---! single-statement SQL — see the jsonb overload for the rationale. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return eql_v2.hmac_256 HMAC-SHA256 hash value, or NULL when `hm` is absent ---! ---! @see eql_v2.hmac_256(jsonb) -CREATE FUNCTION eql_v2.hmac_256(val eql_v2_encrypted) - RETURNS eql_v2.hmac_256 - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT ((val).data ->> 'hm')::eql_v2.hmac_256 -$$; - - ---! @brief Extract HMAC-SHA256 index term from a ste_vec entry ---! ---! Extracts the HMAC from the `hm` field of an `sv` element extracted via ---! the `->` operator. Inlinable. The recipe for field-level equality on ---! encrypted JSON is: ---! ---! @example ---! -- Functional hash index ---! CREATE INDEX ON users USING hash (eql_v2.hmac_256(data -> '')); ---! -- Bare-form predicate matches via the inlined `=` on ste_vec_entry ---! SELECT * FROM users WHERE data -> '' = $1::eql_v2.ste_vec_entry; ---! ---! @param entry eql_v2.ste_vec_entry STE-vec entry (extracted via `->`) ---! @return eql_v2.hmac_256 HMAC value, or NULL when `hm` is absent ---! ---! @see eql_v2.has_hmac_256 ---! @see src/operators/->.sql -CREATE FUNCTION eql_v2.hmac_256(entry eql_v2.ste_vec_entry) - RETURNS eql_v2.hmac_256 - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT (entry ->> 'hm')::eql_v2.hmac_256 -$$; - - ---! @brief Check if a ste_vec entry contains an HMAC-SHA256 index term ---! ---! @param entry eql_v2.ste_vec_entry STE-vec entry ---! @return Boolean True if `hm` field is present and non-null -CREATE FUNCTION eql_v2.has_hmac_256(entry eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT entry ->> 'hm' IS NOT NULL -$$; - - diff --git a/src/hmac_256/types.sql b/src/hmac_256/types.sql deleted file mode 100644 index 1267c124d..000000000 --- a/src/hmac_256/types.sql +++ /dev/null @@ -1,11 +0,0 @@ --- REQUIRE: src/schema.sql - ---! @brief HMAC-SHA256 index term type ---! ---! Domain type representing HMAC-SHA256 hash values. ---! Used for exact-match encrypted searches via the 'unique' index type. ---! The hash is stored in the 'hm' field of encrypted data payloads. ---! ---! @see eql_v2.add_search_config ---! @note This is a transient type used only during query execution -CREATE DOMAIN eql_v2.hmac_256 AS text; diff --git a/src/jsonb/functions.sql b/src/jsonb/functions.sql deleted file mode 100644 index 87292f7c0..000000000 --- a/src/jsonb/functions.sql +++ /dev/null @@ -1,449 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/functions.sql --- REQUIRE: src/hmac_256/types.sql --- REQUIRE: src/ste_vec/functions.sql - ---! @file jsonb/functions.sql ---! @brief JSONB path query and array manipulation functions for encrypted data ---! ---! These functions provide PostgreSQL-compatible operations on encrypted JSONB values ---! using Structured Transparent Encryption (STE). They support: ---! - Path-based queries to extract nested encrypted values ---! - Existence checks for encrypted fields ---! - Array operations (length, elements extraction) ---! - Field-level HMAC term extraction for equality / GROUP BY / DISTINCT ---! ---! @note STE stores encrypted JSONB as a vector of encrypted elements ('sv') with selectors ---! @note Functions suppress errors for missing fields, type mismatches (similar to PostgreSQL jsonpath) ---! @note `selector` parameters in this module are *encrypted-side* selector ---! hashes — the deterministic hash that the crypto layer (e.g. ---! `@cipherstash/protect`) emits in the `s` field of each `sv` element ---! (e.g. `'a7cea93975ed8c01f861ccb6bd082784'`). Plaintext JSONPaths ---! like `'$.address.city'` are never accepted at runtime; the proxy / ---! client rewrites them to selector hashes before the query reaches EQL. - - ---! @brief Query encrypted JSONB for elements matching selector ---! ---! Searches the Structured Transparent Encryption (STE) vector for elements matching ---! the given selector path. Returns all matching encrypted elements. If multiple ---! matches form an array, they are wrapped with array metadata. ---! ---! @param jsonb Encrypted JSONB payload containing STE vector ('sv') ---! @param text Path selector to match against encrypted elements ---! @return SETOF eql_v2_encrypted Matching encrypted elements (may return multiple rows) ---! ---! @note Returns empty set if selector is not found (does not throw exception) ---! @note Array elements use same selector; multiple matches wrapped with 'a' flag ---! @note Returns a set containing NULL if val is NULL; returns empty set if no matches found ---! @see eql_v2.jsonb_path_query_first ---! @see eql_v2.jsonb_path_exists -CREATE FUNCTION eql_v2.jsonb_path_query(val jsonb, selector text) - RETURNS SETOF eql_v2_encrypted - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT - CASE - WHEN bool_or(eql_v2.is_ste_vec_array(elem)) THEN - (eql_v2.meta_data(val) || jsonb_build_object('sv', jsonb_agg(elem), 'a', 1))::eql_v2_encrypted - ELSE - (eql_v2.meta_data(val) || (array_agg(elem))[1])::eql_v2_encrypted - END - FROM jsonb_array_elements(val -> 'sv') elem - WHERE elem ->> 's' = selector - HAVING count(*) > 0 -$$; - - ---! @brief Query encrypted JSONB with encrypted selector ---! ---! Overload that accepts encrypted selector and extracts its plaintext value ---! before delegating to main jsonb_path_query implementation. ---! ---! @param val eql_v2_encrypted Encrypted JSONB value to query ---! @param selector eql_v2_encrypted Encrypted selector to match against ---! @return SETOF eql_v2_encrypted Matching encrypted elements ---! ---! @see eql_v2.jsonb_path_query(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_query(val eql_v2_encrypted, selector eql_v2_encrypted) - RETURNS SETOF eql_v2_encrypted - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT * FROM eql_v2.jsonb_path_query((val).data, eql_v2._selector(selector)); -$$; - - ---! @brief Query encrypted JSONB with text selector ---! ---! Overload that accepts encrypted JSONB value and text selector, ---! extracting the JSONB payload before querying. ---! ---! @param eql_v2_encrypted Encrypted JSONB value to query ---! @param text Path selector to match against ---! @return SETOF eql_v2_encrypted Matching encrypted elements ---! ---! @example ---! -- Query encrypted JSONB for the sv element at a given selector hash ---! SELECT * FROM eql_v2.jsonb_path_query(encrypted_document, 'a7cea93975ed8c01f861ccb6bd082784'); ---! ---! @see eql_v2.jsonb_path_query(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_query(val eql_v2_encrypted, selector text) - RETURNS SETOF eql_v2_encrypted - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT * FROM eql_v2.jsonb_path_query((val).data, selector); -$$; - - ------------------------------------------------------------------------------------- - - ---! @brief Check if selector path exists in encrypted JSONB ---! ---! Tests whether any encrypted elements match the given selector path. ---! More efficient than jsonb_path_query when only existence check is needed. ---! ---! @param jsonb Encrypted JSONB payload to check ---! @param text Path selector to test ---! @return boolean True if matching element exists, false otherwise ---! ---! @see eql_v2.jsonb_path_query(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_exists(val jsonb, selector text) - RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT EXISTS ( - SELECT 1 FROM jsonb_array_elements(val -> 'sv') elem - WHERE elem ->> 's' = selector - ); -$$; - - ---! @brief Check existence with encrypted selector ---! ---! Overload that accepts encrypted selector and extracts its value ---! before checking existence. ---! ---! @param val eql_v2_encrypted Encrypted JSONB value to check ---! @param selector eql_v2_encrypted Encrypted selector to test ---! @return boolean True if path exists ---! ---! @see eql_v2.jsonb_path_exists(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_exists(val eql_v2_encrypted, selector eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.jsonb_path_exists((val).data, eql_v2._selector(selector)); -$$; - - ---! @brief Check existence with text selector ---! ---! Overload that accepts encrypted JSONB value and text selector. ---! ---! @param eql_v2_encrypted Encrypted JSONB value to check ---! @param text Path selector to test ---! @return boolean True if path exists ---! ---! @example ---! -- Check if the encrypted document has an sv element at a given selector hash ---! SELECT eql_v2.jsonb_path_exists(encrypted_document, 'a7cea93975ed8c01f861ccb6bd082784'); ---! ---! @see eql_v2.jsonb_path_exists(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_exists(val eql_v2_encrypted, selector text) - RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.jsonb_path_exists((val).data, selector); -$$; - - ------------------------------------------------------------------------------------- - - ---! @brief Get first element matching selector ---! ---! Returns only the first encrypted element matching the selector path, ---! or NULL if no match found. More efficient than jsonb_path_query when ---! only one result is needed. ---! ---! @param jsonb Encrypted JSONB payload to query ---! @param text Path selector to match ---! @return eql_v2_encrypted First matching element or NULL ---! ---! @note Uses LIMIT 1 internally for efficiency ---! @see eql_v2.jsonb_path_query(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_query_first(val jsonb, selector text) - RETURNS eql_v2_encrypted - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT (eql_v2.meta_data(val) || elem)::eql_v2_encrypted - FROM jsonb_array_elements(val -> 'sv') elem - WHERE elem ->> 's' = selector - LIMIT 1 -$$; - - ---! @brief Get first element with encrypted selector ---! ---! Overload that accepts encrypted selector and extracts its value ---! before querying for first match. ---! ---! @param val eql_v2_encrypted Encrypted JSONB value to query ---! @param selector eql_v2_encrypted Encrypted selector to match ---! @return eql_v2_encrypted First matching element or NULL ---! ---! @see eql_v2.jsonb_path_query_first(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_query_first(val eql_v2_encrypted, selector eql_v2_encrypted) - RETURNS eql_v2_encrypted - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.jsonb_path_query_first((val).data, eql_v2._selector(selector)); -$$; - - ---! @brief Get first element with text selector ---! ---! Overload that accepts encrypted JSONB value and text selector. ---! ---! @param eql_v2_encrypted Encrypted JSONB value to query ---! @param text Path selector to match ---! @return eql_v2_encrypted First matching element or NULL ---! ---! @example ---! -- Get the first matching sv element from an encrypted document ---! SELECT eql_v2.jsonb_path_query_first(encrypted_document, 'a7cea93975ed8c01f861ccb6bd082784'); ---! ---! @see eql_v2.jsonb_path_query_first(jsonb, text) -CREATE FUNCTION eql_v2.jsonb_path_query_first(val eql_v2_encrypted, selector text) - RETURNS eql_v2_encrypted - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.jsonb_path_query_first((val).data, selector); -$$; - - - ------------------------------------------------------------------------------------- - - ---! @brief Get length of encrypted JSONB array ---! ---! Returns the number of elements in an encrypted JSONB array by counting ---! elements in the STE vector ('sv'). The encrypted value must have the ---! array flag ('a') set to true. ---! ---! @param jsonb Encrypted JSONB payload representing an array ---! @return integer Number of elements in the array ---! @throws Exception 'cannot get array length of a non-array' if 'a' flag is missing or not true ---! ---! @note Array flag 'a' must be present and set to true value ---! @see eql_v2.jsonb_array_elements -CREATE FUNCTION eql_v2.jsonb_array_length(val jsonb) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - sv eql_v2_encrypted[]; - found eql_v2_encrypted[]; - BEGIN - - IF val IS NULL THEN - RETURN NULL; - END IF; - - IF eql_v2.is_ste_vec_array(val) THEN - sv := eql_v2.ste_vec(val); - RETURN array_length(sv, 1); - END IF; - - RAISE 'cannot get array length of a non-array'; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Get array length from encrypted type ---! ---! Overload that accepts encrypted composite type and extracts the ---! JSONB payload before computing array length. ---! ---! @param eql_v2_encrypted Encrypted array value ---! @return integer Number of elements in the array ---! @throws Exception if value is not an array ---! ---! @example ---! -- Get length of encrypted array ---! SELECT eql_v2.jsonb_array_length(encrypted_tags); ---! ---! @see eql_v2.jsonb_array_length(jsonb) -CREATE FUNCTION eql_v2.jsonb_array_length(val eql_v2_encrypted) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN ( - SELECT eql_v2.jsonb_array_length(val.data) - ); - END; -$$ LANGUAGE plpgsql; - - - - ---! @brief Extract elements from encrypted JSONB array ---! ---! Returns each element of an encrypted JSONB array as a separate row. ---! Each element is returned as an eql_v2_encrypted value with metadata ---! preserved from the parent array. ---! ---! @param jsonb Encrypted JSONB payload representing an array ---! @return SETOF eql_v2_encrypted One row per array element ---! @throws Exception if value is not an array (missing 'a' flag) ---! ---! @note Each element inherits metadata (version, ident) from parent ---! @see eql_v2.jsonb_array_length ---! @see eql_v2.jsonb_array_elements_text -CREATE FUNCTION eql_v2.jsonb_array_elements(val jsonb) - RETURNS SETOF eql_v2_encrypted - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - sv eql_v2_encrypted[]; - meta jsonb; - item jsonb; - BEGIN - - IF NOT eql_v2.is_ste_vec_array(val) THEN - RAISE 'cannot extract elements from non-array'; - END IF; - - -- Column identifier and version - meta := eql_v2.meta_data(val); - - sv := eql_v2.ste_vec(val); - - FOR idx IN 1..array_length(sv, 1) LOOP - item = sv[idx]; - RETURN NEXT (meta || item)::eql_v2_encrypted; - END LOOP; - - RETURN; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract elements from encrypted array type ---! ---! Overload that accepts encrypted composite type and extracts each ---! array element as a separate row. ---! ---! @param eql_v2_encrypted Encrypted array value ---! @return SETOF eql_v2_encrypted One row per array element ---! @throws Exception if value is not an array ---! ---! @example ---! -- Expand encrypted array into rows ---! SELECT * FROM eql_v2.jsonb_array_elements(encrypted_tags); ---! ---! @see eql_v2.jsonb_array_elements(jsonb) -CREATE FUNCTION eql_v2.jsonb_array_elements(val eql_v2_encrypted) - RETURNS SETOF eql_v2_encrypted - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN QUERY - SELECT * FROM eql_v2.jsonb_array_elements(val.data); - END; -$$ LANGUAGE plpgsql; - - - ---! @brief Extract encrypted array elements as ciphertext ---! ---! Returns each element of an encrypted JSONB array as its raw ciphertext ---! value (text representation). Unlike jsonb_array_elements, this returns ---! only the ciphertext 'c' field without metadata. ---! ---! @param jsonb Encrypted JSONB payload representing an array ---! @return SETOF text One ciphertext string per array element ---! @throws Exception if value is not an array (missing 'a' flag) ---! ---! @note Returns ciphertext only, not full encrypted structure ---! @see eql_v2.jsonb_array_elements -CREATE FUNCTION eql_v2.jsonb_array_elements_text(val jsonb) - RETURNS SETOF text - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - sv eql_v2_encrypted[]; - found eql_v2_encrypted[]; - BEGIN - IF NOT eql_v2.is_ste_vec_array(val) THEN - RAISE 'cannot extract elements from non-array'; - END IF; - - sv := eql_v2.ste_vec(val); - - FOR idx IN 1..array_length(sv, 1) LOOP - RETURN NEXT eql_v2.ciphertext(sv[idx]); - END LOOP; - - RETURN; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract array elements as ciphertext from encrypted type ---! ---! Overload that accepts encrypted composite type and extracts each ---! array element's ciphertext as text. ---! ---! @param eql_v2_encrypted Encrypted array value ---! @return SETOF text One ciphertext string per array element ---! @throws Exception if value is not an array ---! ---! @example ---! -- Get ciphertext of each array element ---! SELECT * FROM eql_v2.jsonb_array_elements_text(encrypted_tags); ---! ---! @see eql_v2.jsonb_array_elements_text(jsonb) -CREATE FUNCTION eql_v2.jsonb_array_elements_text(val eql_v2_encrypted) - RETURNS SETOF text - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN QUERY - SELECT * FROM eql_v2.jsonb_array_elements_text(val.data); - END; -$$ LANGUAGE plpgsql; - - ------------------------------------------------------------------------------------- - --- `eql_v2.hmac_256_terms(eql_v2_encrypted)` was added under #205 as a --- GIN-indexable {s, hm} aggregate. It's been removed: under the XOR --- contract each sv element carries exactly one of `hm` (bool leaves, --- array / object roots) or `oc` (string / number leaves), and --- `hmac_256_terms` filters out everything without `hm` — so containment --- queries via this index could never match on string / number selectors. --- The canonical XOR-aware replacement is the typed --- `@>(eql_v2_encrypted, eql_v2.stevec_query)` overload, which inlines --- to `eql_v2.to_stevec_query(col)::jsonb @> needle::jsonb` and engages --- a functional GIN on `(eql_v2.to_stevec_query(col)::jsonb) jsonb_path_ops`. --- See U-007 / U-008 in `docs/upgrading/v2.3.md`. diff --git a/src/lint/lints.sql b/src/lint/lints.sql deleted file mode 100644 index 08c4a7de3..000000000 --- a/src/lint/lints.sql +++ /dev/null @@ -1,371 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/v3/schema.sql - ---! @brief EQL lint: detect non-inlinable operator implementation functions ---! ---! Returns one row per violation found in the installed EQL surface. The ---! Postgres planner can only inline a function during index matching when: ---! ---! * `LANGUAGE sql` (plpgsql / C / etc. cannot be inlined) ---! * `IMMUTABLE` or `STABLE` volatility (VOLATILE cannot be inlined into ---! index expressions) ---! * No `SET` clauses (e.g. `SET search_path = ...`) ---! * Not `SECURITY DEFINER` ---! * Single-statement SELECT body ---! ---! @note The single-statement SELECT body condition is **not yet checked** by ---! this lint. A `LANGUAGE sql` function with a multi-statement body, a CTE, ---! or any pre-SELECT statement will pass all four implemented checks while ---! remaining non-inlinable. Implementing the check requires walking `prosrc` ---! (or `pg_get_functiondef`); tracked as a follow-up to #194. ---! ---! Operators on encrypted types (`eql_v2_encrypted`, `eql_v2.bloom_filter`, ---! `eql_v2.ore_*`, etc.) whose implementation functions fail any of these ---! rules silently fall back to seq scan when the documented functional ---! indexes (`eql_v2.hmac_256(col)`, `eql_v2.bloom_filter(col)`, ---! `eql_v2.ste_vec(col)`) are in place. This lint surfaces every such case. ---! ---! Severity: ---! `error` — fixable, blocks index matching, ship-blocking. ---! `warning` — likely-fixable, may not block matching but signals intent. ---! `info` — observational; useful for review, not a defect on its own. ---! ---! Categories: ---! `inlinability_language` — implementation function isn't `LANGUAGE sql`. ---! `inlinability_volatility` — implementation function is VOLATILE. ---! `inlinability_set_clause` — implementation function has a `SET` clause. ---! `inlinability_secdef` — implementation function is `SECURITY DEFINER`. ---! `inlinability_transitive` — implementation function is itself inlinable ---! but its body invokes a non-inlinable function ---! (depth 1; the planner can't peek through ---! that boundary). ---! `blocker_language` — encrypted-domain blocker is not LANGUAGE ---! plpgsql. The planner can inline / elide a ---! LANGUAGE sql body when the result is ---! provably unused, silently bypassing the ---! RAISE that the blocker exists to perform. ---! `blocker_strict` — encrypted-domain blocker is STRICT. ---! PostgreSQL skips the body and returns NULL ---! on NULL arguments, silently bypassing the ---! RAISE. ---! `domain_over_domain` — an encrypted domain (`eql_v3.*` or ---! `public.eql_v2_*`) is derived from another ---! encrypted domain rather than jsonb. ---! Operators resolve against the ultimate base ---! type, so the derived domain does not ---! inherit the base domain's blocker surface. ---! `domain_opclass` — an operator class is declared FOR TYPE on an ---! encrypted domain (`eql_v3.*` or ---! `public.eql_v2_*`). Opclasses on domains ---! bypass operator resolution; use a ---! functional index on the extractor instead. ---! ---! @example ---! ``` ---! SELECT severity, category, object_name, message ---! FROM eql_v2.lints() ---! WHERE severity = 'error' ---! ORDER BY category, object_name; ---! ``` ---! ---! @return SETOF record (severity text, category text, object_name text, message text) -CREATE OR REPLACE FUNCTION eql_v2.lints() -RETURNS TABLE ( - severity text, - category text, - object_name text, - message text -) -LANGUAGE sql STABLE -AS $$ - WITH - -- All operators where at least one operand involves an EQL type. Limits - -- the scope of the lint to the operator surface customers actually hit - -- via SQL (`col = val`, `col LIKE '...'`, `col @> '...'` and friends). - eql_operators AS ( - SELECT - op.oid AS oprid, - op.oprname AS opname, - op.oprcode AS implfunc, - op.oprleft::regtype AS lhs, - op.oprright::regtype AS rhs, - op.oprcode::regprocedure AS impl_signature - FROM pg_operator op - WHERE EXISTS ( - SELECT 1 FROM pg_type t - WHERE t.oid IN (op.oprleft, op.oprright) - AND (t.typname LIKE 'eql_v2%' - OR t.typnamespace = 'eql_v2'::regnamespace - OR t.typnamespace = 'eql_v3'::regnamespace) - ) - ), - - -- Cross-join with each operator's implementation function metadata. - -- One row per operator; columns describe the inlinability of the impl. - op_impl AS ( - SELECT - eo.opname, - eo.lhs, - eo.rhs, - eo.implfunc AS impl_oid, - eo.impl_signature::text AS impl_signature, - lang_l.lanname AS lang, - p.provolatile AS volatility, - p.proconfig AS config, - p.prosecdef AS secdef, - p.prosrc AS body - FROM eql_operators eo - JOIN pg_proc p ON p.oid = eo.implfunc - JOIN pg_language lang_l ON lang_l.oid = p.prolang - ), - - -- Encrypted-domain blockers: functions in `eql_v2` whose body contains - -- one of the two blocker markers emitted by the codegen - -- (`encrypted_domain_unsupported_bool` for boolean blockers; the literal - -- `is not supported for` for path-operator blockers) AND that take at - -- least one `public.eql_v2_*` domain over jsonb argument. The argument - -- filter excludes the shared `encrypted_domain_unsupported_bool(text, - -- text)` helper itself, which contains the marker in its body but is - -- not a blocker. - encrypted_domain_blockers AS ( - SELECT - p.oid AS oid, - p.oid::regprocedure::text AS signature, - lang_l.lanname AS lang, - p.proisstrict AS isstrict - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - JOIN pg_catalog.pg_language lang_l ON lang_l.oid = p.prolang - WHERE n.nspname IN ('eql_v2', 'eql_v3') - AND (p.prosrc LIKE '%encrypted_domain_unsupported_bool%' - OR p.prosrc LIKE '%is not supported for%') - AND EXISTS ( - SELECT 1 - FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) - JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ - JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace - JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype - WHERE dt.typtype = 'd' - AND bt.typname = 'jsonb' - AND ( - dn.nspname = 'eql_v3' - OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') - ) - ) - ) - - -- ┌─────────────────────────────────────────────────────────────────┐ - -- │ Direct inlinability checks: each row examines one operator's │ - -- │ implementation function and emits a violation if any rule is │ - -- │ broken. Multiple violations on the same function become │ - -- │ multiple rows (developers see every reason it doesn't inline). │ - -- └─────────────────────────────────────────────────────────────────┘ - - SELECT - 'error' AS severity, - 'inlinability_language' AS category, - format('operator %s(%s, %s) -> %s', - opname, lhs, rhs, impl_signature) AS object_name, - format( - 'Operator implementation function is `LANGUAGE %s`; only `LANGUAGE sql` functions can be inlined by the planner. Bare `col %s val` queries fall back to seq scan even when a matching functional index exists.', - lang, opname) AS message - FROM op_impl - WHERE lang <> 'sql' - AND NOT EXISTS ( - SELECT 1 FROM encrypted_domain_blockers b - WHERE b.oid = op_impl.impl_oid - ) - - UNION ALL - - SELECT - 'error', - 'inlinability_volatility', - format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature), - format( - 'Operator implementation function is `VOLATILE`. The Postgres planner refuses to inline volatile functions into index expressions, so functional indexes never engage. Mark the function `IMMUTABLE` (or `STABLE` if it depends on session state).', - opname) - FROM op_impl - WHERE volatility = 'v' - AND NOT EXISTS ( - SELECT 1 FROM encrypted_domain_blockers b - WHERE b.oid = op_impl.impl_oid - ) - - UNION ALL - - SELECT - 'error', - 'inlinability_set_clause', - format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature), - format( - 'Operator implementation function has a `SET` clause (e.g. `SET search_path = ...`). Per Postgres function-inlining rules, any `SET` clause blocks inlining. Use schema-qualified identifiers in the body and remove the `SET` clause to allow the planner to inline.') - FROM op_impl - WHERE config IS NOT NULL - AND NOT EXISTS ( - SELECT 1 FROM encrypted_domain_blockers b - WHERE b.oid = op_impl.impl_oid - ) - - UNION ALL - - SELECT - 'error', - 'inlinability_secdef', - format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature), - 'Operator implementation function is `SECURITY DEFINER`. Such functions cannot be inlined; remove `SECURITY DEFINER` or use a non-inlinable wrapper layer.' - FROM op_impl - WHERE secdef - AND NOT EXISTS ( - SELECT 1 FROM encrypted_domain_blockers b - WHERE b.oid = op_impl.impl_oid - ) - - -- ┌─────────────────────────────────────────────────────────────────┐ - -- │ Transitive inlinability: an operator implementation function │ - -- │ that's itself inlinable can still fail to inline if its body │ - -- │ calls a non-inlinable function. Walk one level via pg_depend. │ - -- │ │ - -- │ Postgres records function-to-function dependencies in │ - -- │ pg_depend with deptype 'n' (normal) when one function references│ - -- │ another in its body — but only at CREATE time and only for │ - -- │ direct calls. This is good enough for v1; deeper transitive │ - -- │ analysis is a follow-up. │ - -- └─────────────────────────────────────────────────────────────────┘ - - UNION ALL - - SELECT - 'error', - 'inlinability_transitive', - format('operator %s(%s, %s) -> %s', oi.opname, oi.lhs, oi.rhs, - oi.impl_signature), - format( - 'Operator implementation function is inlinable but invokes non-inlinable function `%s` (lang=%s, volatility=%s%s). The chain blocks at depth 1: the planner inlines the outer call but cannot reduce the inner call into an index expression.', - called.proname, - called_lang.lanname, - CASE called.provolatile - WHEN 'i' THEN 'IMMUTABLE' - WHEN 's' THEN 'STABLE' - WHEN 'v' THEN 'VOLATILE' - END, - CASE WHEN called.proconfig IS NOT NULL - THEN ', has SET clause' - ELSE '' END) - FROM op_impl oi - -- Only worth the transitive check if the outer function is otherwise - -- inlinable — otherwise the direct lints above already report it. - JOIN pg_proc outer_p ON outer_p.oid = oi.impl_signature::regprocedure - JOIN pg_depend d - ON d.classid = 'pg_proc'::regclass - AND d.objid = outer_p.oid - AND d.refclassid = 'pg_proc'::regclass - AND d.deptype = 'n' - JOIN pg_proc called ON called.oid = d.refobjid - JOIN pg_language called_lang ON called_lang.oid = called.prolang - WHERE oi.lang = 'sql' - AND oi.volatility IN ('i', 's') - AND oi.config IS NULL - AND NOT oi.secdef - AND called.oid <> outer_p.oid - AND ( - called_lang.lanname <> 'sql' - OR called.provolatile = 'v' - OR called.proconfig IS NOT NULL - OR called.prosecdef - ) - - -- ┌─────────────────────────────────────────────────────────────────┐ - -- │ Encrypted-domain footguns: blockers exist to RAISE, so they │ - -- │ have inverted inlinability requirements vs operator impls. │ - -- │ A LANGUAGE sql blocker can be elided by the planner; a STRICT │ - -- │ blocker returns NULL on NULL args. Both silently re-enable │ - -- │ operators the storage variant is supposed to block. │ - -- └─────────────────────────────────────────────────────────────────┘ - - UNION ALL - - SELECT - 'error', - 'blocker_language', - format('function %s', signature), - format( - 'Encrypted-domain blocker is `LANGUAGE %s`; must be `LANGUAGE plpgsql` so the RAISE is opaque to the planner. A `LANGUAGE sql` body is inlinable and may be elided when the result is provably unused, silently re-enabling the operator.', - lang) - FROM encrypted_domain_blockers - WHERE lang <> 'plpgsql' - - UNION ALL - - SELECT - 'error', - 'blocker_strict', - format('function %s', signature), - 'Encrypted-domain blocker is `STRICT`. PostgreSQL skips the body and returns NULL on a NULL argument, silently bypassing the RAISE. Remove `STRICT`.' - FROM encrypted_domain_blockers - WHERE isstrict - - -- ┌─────────────────────────────────────────────────────────────────┐ - -- │ Domain identity: an encrypted-domain must be defined directly │ - -- │ over jsonb. Operators resolve against the ultimate base type, │ - -- │ so domain-over-domain inherits jsonb's operator surface and not │ - -- │ the base domain's blockers. │ - -- └─────────────────────────────────────────────────────────────────┘ - - UNION ALL - - SELECT - 'error', - 'domain_over_domain', - format('domain %I.%I', dn.nspname, dt.typname), - format( - 'Domain `%s.%s` is derived from another encrypted-domain `%s.%s` rather than jsonb. Operators resolve against the ultimate base type, so the derived domain does not inherit the base domain''s operator surface and storage blockers do not engage. Define this domain directly over jsonb.', - dn.nspname, dt.typname, bn.nspname, bt.typname) - FROM pg_catalog.pg_type dt - JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace - JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype - JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace - WHERE dt.typtype = 'd' - AND ( - dn.nspname = 'eql_v3' - OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') - ) - AND bt.typtype = 'd' - AND ( - bn.nspname = 'eql_v3' - OR (bn.nspname = 'public' AND bt.typname LIKE 'eql_v2\_%') - ) - - -- ┌─────────────────────────────────────────────────────────────────┐ - -- │ Domain opclass: an operator class declared FOR TYPE on an │ - -- │ encrypted-domain bypasses operator resolution at index time. │ - -- │ Use a functional index on the extractor instead. │ - -- └─────────────────────────────────────────────────────────────────┘ - - UNION ALL - - SELECT - 'error', - 'domain_opclass', - format('opclass %I.%I FOR TYPE %s.%s', cn.nspname, oc.opcname, tn.nspname, t.typname), - format( - 'Operator class `%s.%s` is declared FOR TYPE `%s.%s`, which is an encrypted-domain type. Opclasses on domains bypass operator resolution. Use a functional index on the extractor (e.g. `%s.eq_term(col)`, `%s.ord_term(col)`) instead.', - cn.nspname, oc.opcname, tn.nspname, t.typname, tn.nspname, tn.nspname) - FROM pg_catalog.pg_opclass oc - JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype - JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace - JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace - WHERE t.typtype = 'd' - AND ( - tn.nspname = 'eql_v3' - OR (tn.nspname = 'public' AND t.typname LIKE 'eql_v2\_%') - ) - - ORDER BY 1, 2, 3; -$$; - -COMMENT ON FUNCTION eql_v2.lints() IS - 'EQL lint: returns one row per non-inlinable operator implementation. ' - 'Run `SELECT * FROM eql_v2.lints() WHERE severity = ''error''` for a ' - 'CI-gateable check that all operator implementations on EQL types are ' - 'eligible for planner inlining.'; diff --git a/src/operators/->.sql b/src/operators/->.sql deleted file mode 100644 index db4df9eca..000000000 --- a/src/operators/->.sql +++ /dev/null @@ -1,142 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/functions.sql --- REQUIRE: src/ste_vec/types.sql --- REQUIRE: src/ste_vec/functions.sql - ---! @brief JSONB field accessor operator for encrypted values (->) ---! ---! Implements the -> operator to access fields/elements from encrypted JSONB data. ---! Returns the matching sv entry as `eql_v2.ste_vec_entry` (or NULL on miss). ---! ---! Encrypted JSON is represented as an array of sv elements in the ---! StEVec format. Each element has a selector, ciphertext, and index ---! terms: `{"sv": [{"c": "...", "s": "...", "hm": "..."}, ...]}`. ---! ---! Provides three overloads: ---! - (eql_v2_encrypted, text) - Field name selector ---! - (eql_v2_encrypted, eql_v2_encrypted) - Encrypted selector ---! - (eql_v2_encrypted, integer) - Array index selector (0-based) ---! ---! All three return `eql_v2.ste_vec_entry` and preserve the source ---! payload's root `i` / `v` envelope metadata in the returned entry ---! (the DOMAIN CHECK on `ste_vec_entry` doesn't forbid extra fields). ---! ---! @note Operator resolution: Assignment casts are considered (PostgreSQL standard behavior). ---! To use text selector, parameter may need explicit cast to text. ---! ---! @see eql_v2.ste_vec_entry ---! @see eql_v2.selector ---! @see eql_v2."->>" - ---! @brief -> operator with text selector ---! ---! Returns the sv entry whose `s` selector equals @p selector, with ---! the source payload's `i` / `v` metadata merged in. Selectors are ---! deterministic per (path, key) within a document, so at most one ---! entry matches; `jsonb_path_query_first` returns the first match ---! and stops scanning. ---! ---! Inlinable single-statement SQL: the planner folds this body into ---! the calling query, so `WHERE col -> 'sel' = $1` reduces structurally ---! to `eql_v2.eq_term(col -> 'sel') = eql_v2.eq_term($1)` and matches ---! a functional index built on `eql_v2.eq_term(col -> 'sel')`. ---! ---! @param e eql_v2_encrypted Encrypted JSONB payload (root) ---! @param selector text Selector hash (the `s` field value) ---! @return eql_v2.ste_vec_entry Matching entry merged with root meta, ---! NULL if no element matches. ---! ---! @note The returned entry carries `i` / `v` from the root in addition ---! to the sv-element fields. This is intentional: per-entry ---! extractors (`eql_v2.eq_term`, `eql_v2.ore_cllw`, ...) read ---! only their own fields and ignore `i` / `v`; callers that need ---! the root envelope (e.g. for decryption) still see it. ---! ---! @example ---! SELECT encrypted_json -> 'field_name' FROM table; -CREATE FUNCTION eql_v2."->"(e eql_v2_encrypted, selector text) - RETURNS eql_v2.ste_vec_entry - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT ( - eql_v2.meta_data(e) || - jsonb_path_query_first( - (e).data, - '$.sv[*] ? (@.s == $sel)'::jsonpath, - jsonb_build_object('sel', selector) - ) - )::eql_v2.ste_vec_entry -$$; - - -CREATE OPERATOR ->( - FUNCTION=eql_v2."->", - LEFTARG=eql_v2_encrypted, - RIGHTARG=text -); - ---------------------------------------------------- - ---! @brief -> operator with encrypted selector ---! ---! Convenience overload: extracts the selector text from an encrypted ---! selector payload and delegates to the (text) form. Inlinable. ---! ---! @param e eql_v2_encrypted Encrypted JSONB data ---! @param selector eql_v2_encrypted Encrypted selector payload ---! @return eql_v2.ste_vec_entry Matching entry, NULL on miss ---! @see eql_v2."->"(eql_v2_encrypted, text) -CREATE FUNCTION eql_v2."->"(e eql_v2_encrypted, selector eql_v2_encrypted) - RETURNS eql_v2.ste_vec_entry - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2."->"(e, eql_v2._selector(selector)) -$$; - - - -CREATE OPERATOR ->( - FUNCTION=eql_v2."->", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted -); - - ---------------------------------------------------- - ---! @brief -> operator with integer array index ---! ---! Returns the sv entry at the given (0-based, JSONB-style) array ---! index, merged with the root payload's `i` / `v` metadata. Returns ---! NULL when the underlying value isn't an sv-array payload or when ---! the index is out of bounds. ---! ---! @param e eql_v2_encrypted Encrypted sv-array payload ---! @param selector integer Array index (0-based, JSONB convention) ---! @return eql_v2.ste_vec_entry Matching entry, NULL on miss ---! @note Array index is 0-based (JSONB standard) despite PostgreSQL arrays being 1-based ---! @example ---! SELECT encrypted_array -> 0 FROM table; ---! @see eql_v2.is_ste_vec_array -CREATE FUNCTION eql_v2."->"(e eql_v2_encrypted, selector integer) - RETURNS eql_v2.ste_vec_entry - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT CASE - WHEN eql_v2.is_ste_vec_array(e) THEN - (eql_v2.meta_data(e) || ((e).data -> 'sv' -> selector))::eql_v2.ste_vec_entry - ELSE NULL - END -$$; - - - - - -CREATE OPERATOR ->( - FUNCTION=eql_v2."->", - LEFTARG=eql_v2_encrypted, - RIGHTARG=integer -); - diff --git a/src/operators/->>.sql b/src/operators/->>.sql deleted file mode 100644 index 8c15188f2..000000000 --- a/src/operators/->>.sql +++ /dev/null @@ -1,69 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/functions.sql - ---! @brief JSONB field accessor operator alias (->>) ---! ---! Implements the ->> operator as an alias of -> for encrypted JSONB data. This mirrors ---! PostgreSQL semantics where ->> returns text via implicit casts. The underlying ---! implementation delegates to eql_v2."->" and allows PostgreSQL to coerce the result. ---! ---! Provides two overloads: ---! - (eql_v2_encrypted, text) - Field name selector ---! - (eql_v2_encrypted, eql_v2_encrypted) - Encrypted selector ---! ---! @see eql_v2."->" ---! @see eql_v2.selector - ---! @brief ->> operator with text selector ---! @param eql_v2_encrypted Encrypted JSONB data ---! @param text Field name to extract ---! @return text Encrypted value at selector, implicitly cast from eql_v2_encrypted ---! @example ---! SELECT encrypted_json ->> 'field_name' FROM table; -CREATE FUNCTION eql_v2."->>"(e eql_v2_encrypted, selector text) - RETURNS text -IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - found eql_v2_encrypted; - BEGIN - -- found = eql_v2."->"(e, selector); - -- RETURN eql_v2.ciphertext(found); - RETURN eql_v2."->"(e, selector); - END; -$$ LANGUAGE plpgsql; - - -CREATE OPERATOR ->> ( - FUNCTION=eql_v2."->>", - LEFTARG=eql_v2_encrypted, - RIGHTARG=text -); - - - ---------------------------------------------------- - ---! @brief ->> operator with encrypted selector ---! @param e eql_v2_encrypted Encrypted JSONB data ---! @param selector eql_v2_encrypted Encrypted field selector ---! @return text Encrypted value at selector, implicitly cast from eql_v2_encrypted ---! @see eql_v2."->>"(eql_v2_encrypted, text) -CREATE FUNCTION eql_v2."->>"(e eql_v2_encrypted, selector eql_v2_encrypted) - RETURNS text - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2."->>"(e, eql_v2._selector(selector)); - END; -$$ LANGUAGE plpgsql; - - -CREATE OPERATOR ->> ( - FUNCTION=eql_v2."->>", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted -); diff --git a/src/operators/<.sql b/src/operators/<.sql deleted file mode 100644 index b784c017d..000000000 --- a/src/operators/<.sql +++ /dev/null @@ -1,155 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/operators/compare.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/operators.sql - ---! @brief Less-than comparison helper for encrypted values ---! @internal ---! @deprecated Slated for removal in EQL 3.0. Use the `<` operator instead. ---! ---! Internal helper that delegates to `eql_v2.compare` for less-than ---! testing. The `<` operator wrappers no longer call this helper — they ---! inline a direct `ore_block_u64_8_256` comparison instead (see the ---! inlinable bodies below). ---! ---! @warning Behaviour now diverges from the `<` operator: this helper ---! still walks `eql_v2.compare`'s priority list (ore_block → ore_cllw ---! → hm), whereas `<` goes straight to `ore_block_u64_8_256` and raises ---! on missing `ob`. Callers relying on the dispatcher fallback should ---! migrate to the extractor form: `eql_v2.ore_cllw(col) < ---! eql_v2.ore_cllw($1::jsonb)`. See U-005. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return Boolean True if a < b (compare result = -1) ---! ---! @see eql_v2.compare ---! @see eql_v2."<" -CREATE FUNCTION eql_v2.lt(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.compare(a, b) = -1; - END; -$$ LANGUAGE plpgsql; - ---! @brief Less-than operator for encrypted values ---! ---! Implements the < operator for comparing two encrypted values via their ---! `ob` (ore_block_u64_8_256) ORE term. Enables range queries and sorting ---! without decryption. Requires the column to carry an `ob` term (configured ---! via the `ore` index in the EQL schema). ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if a is less than b ---! ---! @example ---! -- Range query on encrypted timestamps ---! SELECT * FROM events ---! WHERE encrypted_timestamp < '2024-01-01'::timestamp::text::eql_v2_encrypted; ---! ---! -- Compare encrypted numeric columns ---! SELECT * FROM products WHERE encrypted_price < encrypted_discount_price; ---! ---! @see eql_v2.ore_block_u64_8_256 ---! @see eql_v2.add_search_config --- Inlinable: `LANGUAGE sql IMMUTABLE` with a single SELECT body and no --- `SET` clause. The Postgres planner inlines the body into the calling --- query during planning, so `WHERE col < val` reduces to --- `WHERE eql_v2.ore_block_u64_8_256(col) < eql_v2.ore_block_u64_8_256(val)` --- and matches a functional btree index built on --- `eql_v2.ore_block_u64_8_256(col)` (using the DEFAULT --- `eql_v2.ore_block_u64_8_256_operator_class`). Bare range queries --- (`WHERE col < $1`) engage the functional ORE index on Supabase and any --- install that doesn't ship `eql_v2.encrypted_operator_class`. --- --- Behaviour change vs the previous dispatcher-based impl: the old --- `eql_v2."<"` walked `eql_v2.compare`, which dispatched through --- ore_block / ore_cllw_u64 / ore_cllw_var / ope. Now `<` requires the --- column to have `ore_block_u64_8_256` configured (i.e. carry an `ob` --- field). Calling `<` on a column with only `ore_cllw_*` or OPE terms --- now raises from the `ore_block_u64_8_256(jsonb)` extractor --- (`Expected an ore index (ob) value in json: ...`) where it --- previously returned a Boolean. Loud failure surfaces config errors --- rather than silently producing zero rows — see U-005. -CREATE FUNCTION eql_v2."<"(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) < eql_v2.ore_block_u64_8_256(b) -$$; - -CREATE OPERATOR <( - FUNCTION=eql_v2."<", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - ---! @brief Less-than operator for encrypted value and JSONB ---! ---! Overload of < operator accepting JSONB on the right side. Reduces to a ---! direct comparison of the `ob` ORE term on both sides; the jsonb ---! extractor `eql_v2.ore_block_u64_8_256(jsonb)` reads `b->'ob'` directly. ---! ---! @param eql_v2_encrypted Left operand (encrypted value) ---! @param b JSONB Right operand ---! @return Boolean True if a < b ---! ---! @example ---! SELECT * FROM events WHERE encrypted_age < '{"ob":[...]}'::jsonb; ---! ---! @see eql_v2."<"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."<"(a eql_v2_encrypted, b jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) < eql_v2.ore_block_u64_8_256(b) -$$; - -CREATE OPERATOR <( - FUNCTION=eql_v2."<", - LEFTARG=eql_v2_encrypted, - RIGHTARG=jsonb, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - ---! @brief Less-than operator for JSONB and encrypted value ---! ---! Overload of < operator accepting JSONB on the left side. Reduces to a ---! direct comparison of the `ob` ORE term on both sides. ---! ---! @param a JSONB Left operand ---! @param eql_v2_encrypted Right operand (encrypted value) ---! @return Boolean True if a < b ---! ---! @example ---! SELECT * FROM events WHERE '{"ob":[...]}'::jsonb < encrypted_date; ---! ---! @see eql_v2."<"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."<"(a jsonb, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) < eql_v2.ore_block_u64_8_256(b) -$$; - - -CREATE OPERATOR <( - FUNCTION=eql_v2."<", - LEFTARG=jsonb, - RIGHTARG=eql_v2_encrypted, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); diff --git a/src/operators/<=.sql b/src/operators/<=.sql deleted file mode 100644 index c578558e6..000000000 --- a/src/operators/<=.sql +++ /dev/null @@ -1,105 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/operators/compare.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/operators.sql - ---! @brief Less-than-or-equal comparison helper for encrypted values ---! @internal ---! @deprecated Slated for removal in EQL 3.0. Use the `<=` operator instead. ---! ---! Internal helper that delegates to `eql_v2.compare` for `<=` testing. ---! The `<=` operator wrappers no longer go through this helper — see the ---! inlinable bodies below. ---! ---! @warning Behaviour now diverges from the `<=` operator: this helper ---! still walks `eql_v2.compare`'s priority list, whereas `<=` goes ---! straight to `ore_block_u64_8_256` and raises on missing `ob`. See ---! the matching note on `eql_v2.lt` and U-005 for migration guidance. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return Boolean True if a <= b (compare result <= 0) ---! ---! @see eql_v2.compare ---! @see eql_v2."<=" -CREATE FUNCTION eql_v2.lte(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.compare(a, b) <= 0; - END; -$$ LANGUAGE plpgsql; - ---! @brief Less-than-or-equal operator for encrypted values ---! ---! Implements the <= operator for comparing two encrypted values via their ---! `ob` (ore_block_u64_8_256) ORE term. Requires the column to carry an ---! `ob` term. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if a <= b ---! ---! @example ---! SELECT * FROM users WHERE encrypted_age <= '18'::int::text::eql_v2_encrypted; ---! ---! @see eql_v2.ore_block_u64_8_256 ---! @see eql_v2.add_search_config --- Inlinable: see `src/operators/<.sql` for the rationale. -CREATE FUNCTION eql_v2."<="(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) <= eql_v2.ore_block_u64_8_256(b) -$$; - -CREATE OPERATOR <=( - FUNCTION = eql_v2."<=", - LEFTARG = eql_v2_encrypted, - RIGHTARG = eql_v2_encrypted, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - ---! @brief <= operator for encrypted value and JSONB ---! @see eql_v2."<="(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."<="(a eql_v2_encrypted, b jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) <= eql_v2.ore_block_u64_8_256(b) -$$; - -CREATE OPERATOR <=( - FUNCTION = eql_v2."<=", - LEFTARG = eql_v2_encrypted, - RIGHTARG = jsonb, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - ---! @brief <= operator for JSONB and encrypted value ---! @see eql_v2."<="(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."<="(a jsonb, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) <= eql_v2.ore_block_u64_8_256(b) -$$; - - -CREATE OPERATOR <=( - FUNCTION = eql_v2."<=", - LEFTARG = jsonb, - RIGHTARG = eql_v2_encrypted, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); diff --git a/src/operators/<>.sql b/src/operators/<>.sql deleted file mode 100644 index 988d5bfc9..000000000 --- a/src/operators/<>.sql +++ /dev/null @@ -1,113 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/operators/compare.sql - ---! @brief Inequality helper for encrypted values ---! @internal ---! ---! Inlinable SQL helper mirroring the `<>` operator's body: reduces to ---! `hmac_256(a) <> hmac_256(b)`. Kept for callers that invoked the ---! pre-#193 form (`eql_v2.neq`); equivalent to using the `<>` operator ---! directly. ---! ---! Inequality on `eql_v2_encrypted` is strictly hmac-based (see U-002). ---! Returns NULL when either side lacks an `hm` term — matching the ---! `<>` operator's behaviour. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return Boolean True if hmac terms differ ---! ---! @see eql_v2."<>" ---! @see eql_v2.hmac_256 -CREATE FUNCTION eql_v2.neq(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a) <> eql_v2.hmac_256(b) -$$; - ---! @brief Not-equal operator for encrypted values ---! ---! Implements the <> (not equal) operator for comparing encrypted values using their ---! encrypted index terms. Enables WHERE clause inequality comparisons without decryption. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if encrypted values are not equal ---! ---! @example ---! -- Find records with non-matching values ---! SELECT * FROM users ---! WHERE encrypted_email <> 'admin@example.com'::text::eql_v2_encrypted; ---! ---! @see eql_v2.compare ---! @see eql_v2."=" --- Inlinable; mirrors `=` (see operators/=.sql for rationale). --- Returns NULL on ORE-only encrypted columns (no `hm` field) instead --- of falling back to a slower comparison path; surface the config --- error rather than hide it. -CREATE FUNCTION eql_v2."<>"(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a) <> eql_v2.hmac_256(b) -$$; - - -CREATE OPERATOR <> ( - FUNCTION=eql_v2."<>", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted, - NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - ---! @brief <> operator for encrypted value and JSONB ---! @see eql_v2."<>"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."<>"(a eql_v2_encrypted, b jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a) <> eql_v2.hmac_256(b::eql_v2_encrypted) -$$; - -CREATE OPERATOR <> ( - FUNCTION=eql_v2."<>", - LEFTARG=eql_v2_encrypted, - RIGHTARG=jsonb, - NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - ---! @brief <> operator for JSONB and encrypted value ---! ---! @param jsonb Plain JSONB value ---! @param eql_v2_encrypted Encrypted value ---! @return boolean True if values are not equal ---! ---! @see eql_v2."<>"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."<>"(a jsonb, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a::eql_v2_encrypted) <> eql_v2.hmac_256(b) -$$; - -CREATE OPERATOR <> ( - FUNCTION=eql_v2."<>", - LEFTARG=jsonb, - RIGHTARG=eql_v2_encrypted, - NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - - - - diff --git a/src/operators/<@.sql b/src/operators/<@.sql deleted file mode 100644 index 8e0baccd7..000000000 --- a/src/operators/<@.sql +++ /dev/null @@ -1,89 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/ste_vec/types.sql --- REQUIRE: src/ste_vec/functions.sql --- REQUIRE: src/operators/@>.sql - ---! @brief Contained-by operator for encrypted values (<@) ---! ---! Implements the <@ (contained-by) operator for testing if left encrypted value ---! is contained by the right encrypted value. Uses ste_vec (secure tree encoding vector) ---! index terms for containment testing without decryption. Reverse of @> operator. ---! ---! Primarily used for encrypted array or set containment queries. ---! ---! @param a eql_v2_encrypted Left operand (contained value) ---! @param b eql_v2_encrypted Right operand (container) ---! @return Boolean True if a is contained by b ---! ---! @example ---! -- Check if value is contained in encrypted array ---! SELECT * FROM documents ---! WHERE '["security"]'::jsonb::eql_v2_encrypted <@ encrypted_tags; ---! ---! @note Requires ste_vec index configuration ---! @see eql_v2.ste_vec_contains ---! @see eql_v2.\"@>\" ---! @see eql_v2.add_search_config - --- Marked IMMUTABLE STRICT PARALLEL SAFE — see operators/@>.sql for rationale. -CREATE FUNCTION eql_v2."<@"(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean -LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE -AS $$ - -- Contains with reversed arguments - SELECT eql_v2.ste_vec_contains(b, a) -$$; - -CREATE OPERATOR <@( - FUNCTION=eql_v2."<@", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted -); - - ---! @brief Contained-by operator (<@) with an `eql_v2.stevec_query` LHS ---! ---! Reverse of `@>(eql_v2_encrypted, eql_v2.stevec_query)`. Mirrors the ---! typed needle convention: "is this query payload contained in that ---! encrypted document?". ---! ---! @param a eql_v2.stevec_query Left operand (query payload) ---! @param b eql_v2_encrypted Right operand (container) ---! @return Boolean True if `b` contains `a` ---! @see eql_v2."@>"(eql_v2_encrypted, eql_v2.stevec_query) -CREATE FUNCTION eql_v2."<@"(a eql_v2.stevec_query, b eql_v2_encrypted) -RETURNS boolean -LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2."@>"(b, a) -$$; - -CREATE OPERATOR <@( - FUNCTION=eql_v2."<@", - LEFTARG=eql_v2.stevec_query, - RIGHTARG=eql_v2_encrypted -); - - ---! @brief Contained-by operator (<@) with an `eql_v2.ste_vec_entry` LHS ---! ---! Reverse of `@>(eql_v2_encrypted, eql_v2.ste_vec_entry)`. Convenience ---! shape for "is this entry contained in that encrypted document?". ---! ---! @param a eql_v2.ste_vec_entry Left operand (single entry) ---! @param b eql_v2_encrypted Right operand (container) ---! @return Boolean True if `b` contains `a` ---! @see eql_v2."@>"(eql_v2_encrypted, eql_v2.ste_vec_entry) -CREATE FUNCTION eql_v2."<@"(a eql_v2.ste_vec_entry, b eql_v2_encrypted) -RETURNS boolean -LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2."@>"(b, a) -$$; - -CREATE OPERATOR <@( - FUNCTION=eql_v2."<@", - LEFTARG=eql_v2.ste_vec_entry, - RIGHTARG=eql_v2_encrypted -); diff --git a/src/operators/=.sql b/src/operators/=.sql deleted file mode 100644 index f8db7ca13..000000000 --- a/src/operators/=.sql +++ /dev/null @@ -1,149 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/operators/compare.sql - ---! @brief Equality helper for encrypted values ---! @internal ---! ---! Inlinable SQL helper mirroring the `=` operator's body: reduces to ---! `hmac_256(a) = hmac_256(b)`. Kept for callers that invoked the ---! pre-#193 form (`eql_v2.eq`); equivalent to using the `=` operator ---! directly. ---! ---! Equality on `eql_v2_encrypted` is strictly hmac-based (see U-002). ---! Returns NULL when either side lacks an `hm` term — matching the ---! `=` operator's behaviour. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return Boolean True if hmac terms match ---! ---! @see eql_v2."=" ---! @see eql_v2.hmac_256 -CREATE FUNCTION eql_v2.eq(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a) = eql_v2.hmac_256(b) -$$; - ---! @brief Equality operator for encrypted values ---! ---! Implements the = operator for comparing two encrypted values using their ---! encrypted index terms (hmac_256). Enables WHERE clause comparisons ---! without decryption. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if encrypted values are equal ---! ---! @example ---! -- Compare encrypted columns ---! SELECT * FROM users WHERE encrypted_email = other_encrypted_email; ---! ---! -- Search using encrypted literal ---! SELECT * FROM users ---! WHERE encrypted_email = '{"c":"...","i":{"unique":"..."}}'::eql_v2_encrypted; ---! ---! @see eql_v2.compare ---! @see eql_v2.add_search_config --- Inlinable: `LANGUAGE sql IMMUTABLE` with a single SELECT body and no --- `SET` clause. The Postgres planner inlines the body into the calling --- query during planning, so `WHERE col = val` reduces to --- `WHERE eql_v2.hmac_256(col) = eql_v2.hmac_256(val)` and matches a --- functional hash index built on `eql_v2.hmac_256(col)`. Bare equality --- queries (including those issued by PostgREST and ORMs that don't --- wrap columns themselves) become fast on Supabase and any --- --exclude-operator-family install. --- --- Behaviour change vs the previous dispatcher-based impl: the old --- `eql_v2.eq` walked `eql_v2.compare`, which fell back to ORE / Blake3 / --- literal comparison when HMAC wasn't present. Now `=` requires the --- column to have `equality` configured (i.e. carry an `hm` field). --- Calling `=` on an ORE-only column will return NULL where it --- previously returned a Boolean. This is intentional — it surfaces --- config errors loudly. See the predicate/extractor RFC for context. -CREATE FUNCTION eql_v2."="(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a) = eql_v2.hmac_256(b) -$$; - -CREATE OPERATOR = ( - FUNCTION=eql_v2."=", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - ---! @brief Equality operator for encrypted value and JSONB ---! ---! Overload of = operator accepting JSONB on the right side. Automatically ---! casts JSONB to eql_v2_encrypted for comparison. Useful for comparing ---! against JSONB literals or columns. ---! ---! @param eql_v2_encrypted Left operand (encrypted value) ---! @param b JSONB Right operand (will be cast to eql_v2_encrypted) ---! @return Boolean True if values are equal ---! ---! @example ---! -- Compare encrypted column to JSONB literal ---! SELECT * FROM users ---! WHERE encrypted_email = '{"c":"...","i":{"unique":"..."}}'::jsonb; ---! ---! @see eql_v2."="(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."="(a eql_v2_encrypted, b jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a) = eql_v2.hmac_256(b::eql_v2_encrypted) -$$; - -CREATE OPERATOR = ( - FUNCTION=eql_v2."=", - LEFTARG=eql_v2_encrypted, - RIGHTARG=jsonb, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - ---! @brief Equality operator for JSONB and encrypted value ---! ---! Overload of = operator accepting JSONB on the left side. Automatically ---! casts JSONB to eql_v2_encrypted for comparison. Enables commutative ---! equality comparisons. ---! ---! @param a JSONB Left operand (will be cast to eql_v2_encrypted) ---! @param eql_v2_encrypted Right operand (encrypted value) ---! @return Boolean True if values are equal ---! ---! @example ---! -- Compare JSONB literal to encrypted column ---! SELECT * FROM users ---! WHERE '{"c":"...","i":{"unique":"..."}}'::jsonb = encrypted_email; ---! ---! @see eql_v2."="(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."="(a jsonb, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.hmac_256(a::eql_v2_encrypted) = eql_v2.hmac_256(b) -$$; - -CREATE OPERATOR = ( - FUNCTION=eql_v2."=", - LEFTARG=jsonb, - RIGHTARG=eql_v2_encrypted, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - diff --git a/src/operators/>.sql b/src/operators/>.sql deleted file mode 100644 index 7b9520a9d..000000000 --- a/src/operators/>.sql +++ /dev/null @@ -1,119 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/operators/compare.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/operators.sql - ---! @brief Greater-than comparison helper for encrypted values ---! @internal ---! @deprecated Slated for removal in EQL 3.0. Use the `>` operator instead. ---! ---! Internal helper that delegates to `eql_v2.compare` for greater-than ---! testing. The `>` operator wrappers no longer go through this helper — ---! see the inlinable bodies below. ---! ---! @warning Behaviour now diverges from the `>` operator: this helper ---! still walks `eql_v2.compare`'s priority list, whereas `>` goes ---! straight to `ore_block_u64_8_256` and raises on missing `ob`. See ---! the matching note on `eql_v2.lt` and U-005 for migration guidance. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return Boolean True if a > b (compare result = 1) ---! ---! @see eql_v2.compare ---! @see eql_v2.">" -CREATE FUNCTION eql_v2.gt(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.compare(a, b) = 1; - END; -$$ LANGUAGE plpgsql; - ---! @brief Greater-than operator for encrypted values ---! ---! Implements the > operator for comparing two encrypted values via their ---! `ob` (ore_block_u64_8_256) ORE term. Enables range queries and sorting ---! without decryption. Requires the column to carry an `ob` term. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if a is greater than b ---! ---! @example ---! SELECT * FROM events ---! WHERE encrypted_value > '100'::int::text::eql_v2_encrypted; ---! ---! @see eql_v2.ore_block_u64_8_256 ---! @see eql_v2.add_search_config --- Inlinable: see `src/operators/<.sql` for the rationale. Predicate --- `WHERE col > val` reduces to --- `WHERE eql_v2.ore_block_u64_8_256(col) > eql_v2.ore_block_u64_8_256(val)` --- and matches a functional ORE index built on the same expression. --- Breaking impact: columns with only `ore_cllw_*` or OPE terms now --- raise from the `ore_block_u64_8_256(jsonb)` extractor --- (`Expected an ore index (ob) value in json: ...`) where they --- previously fell through `eql_v2.compare`. See U-005. -CREATE FUNCTION eql_v2.">"(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) > eql_v2.ore_block_u64_8_256(b) -$$; - -CREATE OPERATOR >( - FUNCTION=eql_v2.">", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - ---! @brief > operator for encrypted value and JSONB ---! @param a eql_v2_encrypted Left operand (encrypted value) ---! @param b jsonb Right operand ---! @return Boolean True if a > b ---! @see eql_v2.">"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.">"(a eql_v2_encrypted, b jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) > eql_v2.ore_block_u64_8_256(b) -$$; - -CREATE OPERATOR >( - FUNCTION = eql_v2.">", - LEFTARG = eql_v2_encrypted, - RIGHTARG = jsonb, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - ---! @brief > operator for JSONB and encrypted value ---! @param a jsonb Left operand ---! @param b eql_v2_encrypted Right operand (encrypted value) ---! @return Boolean True if a > b ---! @see eql_v2.">"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.">"(a jsonb, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) > eql_v2.ore_block_u64_8_256(b) -$$; - - -CREATE OPERATOR >( - FUNCTION = eql_v2.">", - LEFTARG = jsonb, - RIGHTARG = eql_v2_encrypted, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); diff --git a/src/operators/>=.sql b/src/operators/>=.sql deleted file mode 100644 index d7c2832cd..000000000 --- a/src/operators/>=.sql +++ /dev/null @@ -1,112 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/operators/compare.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/operators.sql - ---! @brief Greater-than-or-equal comparison helper for encrypted values ---! @internal ---! @deprecated Slated for removal in EQL 3.0. Use the `>=` operator instead. ---! ---! Internal helper that delegates to `eql_v2.compare` for `>=` testing. ---! The `>=` operator wrappers no longer go through this helper — see the ---! inlinable bodies below. ---! ---! @warning Behaviour now diverges from the `>=` operator: this helper ---! still walks `eql_v2.compare`'s priority list, whereas `>=` goes ---! straight to `ore_block_u64_8_256` and raises on missing `ob`. See ---! the matching note on `eql_v2.lt` and U-005 for migration guidance. ---! ---! @param a eql_v2_encrypted First encrypted value ---! @param b eql_v2_encrypted Second encrypted value ---! @return Boolean True if a >= b (compare result >= 0) ---! ---! @see eql_v2.compare ---! @see eql_v2.">=" -CREATE FUNCTION eql_v2.gte(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.compare(a, b) >= 0; - END; -$$ LANGUAGE plpgsql; - ---! @brief Greater-than-or-equal operator for encrypted values ---! ---! Implements the >= operator for comparing two encrypted values via their ---! `ob` (ore_block_u64_8_256) ORE term. Requires the column to carry an ---! `ob` term. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if a >= b ---! ---! @example ---! SELECT * FROM users WHERE encrypted_age >= '18'::int::text::eql_v2_encrypted; ---! ---! @see eql_v2.ore_block_u64_8_256 ---! @see eql_v2.add_search_config --- Inlinable: see `src/operators/<.sql` for the rationale. -CREATE FUNCTION eql_v2.">="(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) >= eql_v2.ore_block_u64_8_256(b) -$$; - - -CREATE OPERATOR >=( - FUNCTION = eql_v2.">=", - LEFTARG = eql_v2_encrypted, - RIGHTARG = eql_v2_encrypted, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); - ---! @brief >= operator for encrypted value and JSONB ---! @param a eql_v2_encrypted Left operand (encrypted value) ---! @param b jsonb Right operand ---! @return Boolean True if a >= b ---! @see eql_v2.">="(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.">="(a eql_v2_encrypted, b jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) >= eql_v2.ore_block_u64_8_256(b) -$$; - -CREATE OPERATOR >=( - FUNCTION = eql_v2.">=", - LEFTARG = eql_v2_encrypted, - RIGHTARG=jsonb, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); - ---! @brief >= operator for JSONB and encrypted value ---! @param a jsonb Left operand ---! @param b eql_v2_encrypted Right operand (encrypted value) ---! @return Boolean True if a >= b ---! @see eql_v2.">="(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.">="(a jsonb, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_block_u64_8_256(a) >= eql_v2.ore_block_u64_8_256(b) -$$; - - -CREATE OPERATOR >=( - FUNCTION = eql_v2.">=", - LEFTARG = jsonb, - RIGHTARG =eql_v2_encrypted, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); diff --git a/src/operators/@>.sql b/src/operators/@>.sql deleted file mode 100644 index cabf173a1..000000000 --- a/src/operators/@>.sql +++ /dev/null @@ -1,132 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/ste_vec/types.sql --- REQUIRE: src/ste_vec/functions.sql - ---! @brief Contains operator for encrypted values (@>) ---! ---! Implements the @> (contains) operator for testing if left encrypted value ---! contains the right encrypted value. Uses ste_vec (secure tree encoding vector) ---! index terms for containment testing without decryption. ---! ---! Primarily used for encrypted array or set containment queries. ---! ---! @param a eql_v2_encrypted Left operand (container) ---! @param b eql_v2_encrypted Right operand (contained value) ---! @return Boolean True if a contains b ---! ---! @example ---! -- Check if encrypted array contains value ---! SELECT * FROM documents ---! WHERE encrypted_tags @> '["security"]'::jsonb::eql_v2_encrypted; ---! ---! @note Requires ste_vec index configuration ---! @see eql_v2.ste_vec_contains ---! @see eql_v2.add_search_config --- Marked IMMUTABLE STRICT PARALLEL SAFE so the planner inlines the body --- and a functional GIN index on `eql_v2.ste_vec(col)` can match --- `WHERE col @> val`. The previous default-VOLATILE declaration prevented --- inlining and forced seq scan even on Supabase installs that have the --- ste_vec functional index in place. -CREATE FUNCTION eql_v2."@>"(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean -LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ste_vec_contains(a, b) -$$; - -CREATE OPERATOR @>( - FUNCTION=eql_v2."@>", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted -); - - ---! @brief Contains operator (@>) with an `eql_v2.stevec_query` needle ---! ---! Type-safe containment for the recommended recipe: the right-hand ---! side is an `stevec_query` (sv-shaped payload, no `c` fields). The ---! body inlines to a native `jsonb @>` over `eql_v2.to_stevec_query(a)::jsonb`, ---! so the planner can match a functional GIN index built on the same ---! expression — engaging Bitmap Index Scan for bare-form containment ---! across both `hm`-bearing and `oc`-bearing selectors with a single ---! index. ---! ---! @param a eql_v2_encrypted Left operand (container) ---! @param b eql_v2.stevec_query Right operand (query payload) ---! @return Boolean True if a contains b ---! ---! @example ---! -- Functional GIN index (covers all selectors, hm and oc): ---! CREATE INDEX ON users USING gin ( ---! eql_v2.to_stevec_query(encrypted_doc)::jsonb jsonb_path_ops ---! ); ---! -- Bare-form predicate engages the index: ---! SELECT * FROM users ---! WHERE encrypted_doc @> '{"sv":[{"s":"","hm":""}]}'::eql_v2.stevec_query; ---! ---! @see eql_v2.stevec_query ---! @see eql_v2.to_stevec_query -CREATE FUNCTION eql_v2."@>"(a eql_v2_encrypted, b eql_v2.stevec_query) -RETURNS boolean -LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE -AS $$ - -- Single-expression body so the planner can inline. The haystack - -- normalisation happens in `to_stevec_query`; the needle is trusted - -- to be clean (sv elements of shape `{s, hm-or-oc}` — the documented - -- stevec_query contract). For untrusted needles, callers should - -- normalise via the json-shape `{"sv":[{"s":"","hm":""}]}`. - SELECT eql_v2.to_stevec_query(a)::jsonb @> b::jsonb -$$; - -CREATE OPERATOR @>( - FUNCTION=eql_v2."@>", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2.stevec_query -); - - ---! @brief Contains operator (@>) with an `eql_v2.ste_vec_entry` needle ---! ---! Convenience overload for the common pattern "does this encrypted ---! payload include this specific sv entry?". Wraps the entry into a ---! single-element sv array (stripping `c`) and reduces to the same ---! `to_stevec_query(a)::jsonb @> needle::jsonb` form as the ---! `stevec_query` overload — so it engages the same functional GIN ---! index. Inlinable. ---! ---! @param a eql_v2_encrypted Left operand (container) ---! @param b eql_v2.ste_vec_entry Right operand (single entry) ---! @return Boolean True if a contains an sv entry matching `b` ---! ---! @example ---! -- Does this row's encrypted doc contain the same name as this other doc? ---! SELECT a.* FROM docs a, docs b ---! WHERE a.doc @> (b.doc -> ''); ---! ---! @see eql_v2.ste_vec_entry ---! @see eql_v2."@>"(eql_v2_encrypted, eql_v2.stevec_query) -CREATE FUNCTION eql_v2."@>"(a eql_v2_encrypted, b eql_v2.ste_vec_entry) -RETURNS boolean -LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.to_stevec_query(a)::jsonb - @> jsonb_build_object( - 'sv', - jsonb_build_array( - jsonb_strip_nulls( - jsonb_build_object( - 's', b -> 's', - 'hm', b -> 'hm', - 'oc', b -> 'oc' - ) - ) - ) - ) -$$; - -CREATE OPERATOR @>( - FUNCTION=eql_v2."@>", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2.ste_vec_entry -); diff --git a/src/operators/compare.sql b/src/operators/compare.sql deleted file mode 100644 index 41805011c..000000000 --- a/src/operators/compare.sql +++ /dev/null @@ -1,92 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/functions.sql - --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql - --- REQUIRE: src/ore_cllw/types.sql --- REQUIRE: src/ore_cllw/functions.sql --- REQUIRE: src/ste_vec/types.sql - ---! @file src/operators/compare.sql ---! @brief Three-way ordering on the root `eql_v2_encrypted` type ---! ---! Returns `-1` / `0` / `1` for two encrypted column values that carry ---! Block ORE (`ob`) terms at the root. Used by the btree operator class on ---! `eql_v2_encrypted` (FUNCTION 1), by the legacy `eql_v2.lt` / `lte` / ---! `gt` / `gte` helpers, and by `sort_compare`'s `strategy = 'compare'` ---! fallback path. ---! ---! **Strict Block-ORE-only contract.** Root-level `eql_v2_encrypted` values ---! only carry root-scope ORE terms (`ob`) per the v2.3 payload shape — the ---! `oc` field (CLLW ORE) is sv-element scope only and never appears on a ---! root payload. Equality on `eql_v2_encrypted` is hm-only and runs through ---! the inlined `=` / `<>` operators (post-#193) — it does *not* go through ---! this function. For sv-element ordering, use the typed ---! `eql_v2.compare(eql_v2.ste_vec_entry, eql_v2.ste_vec_entry)` overload ---! (or the `<` / `<=` / `>` / `>=` operators on the same pair). ---! ---! @param a eql_v2_encrypted First encrypted value (STRICT — NULL inputs short-circuit to NULL) ---! @param b eql_v2_encrypted Second encrypted value (STRICT — NULL inputs short-circuit to NULL) ---! @return integer -1, 0, or 1 ---! ---! @throws Exception when either value lacks an `ob` (Block ORE) term ---! ---! @see eql_v2.compare_ore_block_u64_8_256 ---! @see eql_v2.compare(eql_v2.ste_vec_entry, eql_v2.ste_vec_entry) ---! @see eql_v2."=" -- hm-only equality, post-#193 inlining -CREATE FUNCTION eql_v2.compare(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF eql_v2.has_ore_block_u64_8_256(a) AND eql_v2.has_ore_block_u64_8_256(b) THEN - RETURN eql_v2.compare_ore_block_u64_8_256(a, b); - END IF; - - RAISE EXCEPTION - 'eql_v2.compare requires Block ORE (`ob`) on both root operands. For sv-element ordering, extract entries via `col -> ''''` and use eql_v2.compare on the resulting `eql_v2.ste_vec_entry` values (or their `<` / `<=` / `>` / `>=` operators). Equality is hmac-only via the `=` operator — this function is for ordering only.' - USING ERRCODE = 'feature_not_supported'; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Three-way ordering on `eql_v2.ste_vec_entry` ---! ---! CLLW ORE three-way comparator on ste-vec entries. Returns `-1` / `0` / ---! `1` by extracting the `oc` term from each entry and delegating to ---! `eql_v2.compare_ore_cllw_term`. Use this when you need an `int` ordering ---! out of two extracted ste-vec entries — for the boolean-form operators ---! (`<` / `<=` / `>` / `>=`) on the same pair, see ---! `src/operators/ste_vec_entry.sql`. ---! ---! Note: the caller is responsible for extracting an `eql_v2.ste_vec_entry` ---! first; the `(eql_v2_encrypted, text)` form would be a natural extension ---! but is deliberately *not* added here so that callers stay aware of the ---! two-step shape (extract via `->`, then compare). ---! ---! @param a eql_v2.ste_vec_entry First entry ---! @param b eql_v2.ste_vec_entry Second entry ---! @return integer -1, 0, or 1 ---! ---! @throws Exception when either entry lacks an `oc` term ---! ---! @see eql_v2.compare_ore_cllw_term ---! @see src/operators/ste_vec_entry.sql -CREATE FUNCTION eql_v2.compare(a eql_v2.ste_vec_entry, b eql_v2.ste_vec_entry) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF NOT (eql_v2.has_ore_cllw(a) AND eql_v2.has_ore_cllw(b)) THEN - RAISE EXCEPTION - 'eql_v2.compare(ste_vec_entry, ste_vec_entry) requires `oc` (CLLW ORE) on both entries.' - USING ERRCODE = 'feature_not_supported'; - END IF; - - RETURN eql_v2.compare_ore_cllw_term(eql_v2.ore_cllw(a), eql_v2.ore_cllw(b)); - END; -$$ LANGUAGE plpgsql; diff --git a/src/operators/hash_operator_class.sql b/src/operators/hash_operator_class.sql deleted file mode 100644 index 0461721d0..000000000 --- a/src/operators/hash_operator_class.sql +++ /dev/null @@ -1,29 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/hash.sql --- REQUIRE: src/operators/=.sql - ---! @brief PostgreSQL hash operator class for encrypted value hashing ---! ---! Defines the hash operator family and operator class required for hash-based ---! operations on encrypted values. This enables PostgreSQL to use hash strategies for: ---! - Hash joins (cross-row equality via hash) ---! - GROUP BY (hash aggregation) ---! - DISTINCT (hash-based deduplication) ---! - UNION (hash-based set operations) ---! ---! Only the same-type equality operator (eql_v2_encrypted = eql_v2_encrypted) is ---! registered. Cross-type operators (encrypted/jsonb) are excluded because hash ---! joins require independent hashing of each side before comparison. ---! ---! @note Requires hmac_256 index terms for correct hashing ---! @see eql_v2.hash_encrypted ---! @see eql_v2.encrypted_operator_class (btree) - -CREATE OPERATOR FAMILY eql_v2.encrypted_hash_operator_family USING hash; - -CREATE OPERATOR CLASS eql_v2.encrypted_hash_operator_class - DEFAULT FOR TYPE eql_v2_encrypted USING hash - FAMILY eql_v2.encrypted_hash_operator_family AS - OPERATOR 1 = (eql_v2_encrypted, eql_v2_encrypted), - FUNCTION 1 eql_v2.hash_encrypted(eql_v2_encrypted); diff --git a/src/operators/operator_class.sql b/src/operators/operator_class.sql deleted file mode 100644 index c5e86066a..000000000 --- a/src/operators/operator_class.sql +++ /dev/null @@ -1,116 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/functions.sql --- REQUIRE: src/encrypted/compare.sql --- REQUIRE: src/hmac_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/ore_block_u64_8_256/compare.sql --- REQUIRE: src/operators/<.sql --- REQUIRE: src/operators/<=.sql --- REQUIRE: src/operators/=.sql --- REQUIRE: src/operators/>=.sql --- REQUIRE: src/operators/>.sql - ---! @file src/operators/operator_class.sql ---! @brief Btree operator class for the `eql_v2_encrypted` composite type ---! ---! `eql_v2_encrypted` is a composite type. PostgreSQL gives every composite ---! type an implicit row-wise btree comparison (`record_ops`) — but that ---! compares the raw ciphertext byte-for-byte, so two encryptions of the same ---! plaintext (same `hm`, different `c`) would sort and group as *distinct*. ---! `eql_v2.encrypted_operator_class` is registered `DEFAULT ... USING btree` ---! specifically to override `record_ops` with a comparison that is correct ---! for encrypted data: `GROUP BY`, `DISTINCT`, `ORDER BY`, sort-merge joins ---! and `ANALYZE` on a bare `eql_v2_encrypted` column all route through ---! FUNCTION 1 below. ---! ---! @note FUNCTION 1 is `eql_v2.encrypted_btree_compare`, NOT the strict ---! `eql_v2.compare`. A btree support function must be total and must ---! never raise — `ANALYZE` calls it to build column statistics on ---! every encrypted column. `eql_v2.compare` is deliberately strict ---! (it raises without a Block-ORE `ob` term — see U-005); it backs ---! the `<` / `>` range operators, not this opclass. ---! ---! @note Functional indexes are the canonical recipe for *building* indexes ---! on encrypted columns (see U-001 and docs/reference/database-indexes.md). ---! This opclass exists to keep the composite type's built-in ---! comparison correct — not as an index-building recommendation. ---! ---! @see eql_v2.encrypted_hash_operator_class (hash — GROUP BY / hash joins) ---! @see eql_v2.compare - --------------------- - ---! @brief Total, non-raising btree comparator for `eql_v2_encrypted` ---! ---! Three-way comparison (`-1` / `0` / `1`) used as FUNCTION 1 of ---! `eql_v2.encrypted_operator_class`. Unlike `eql_v2.compare`, it never ---! raises: a btree support function is invoked by `ANALYZE`, sort, and ---! `GROUP BY` on every value, so raising is not an option. ---! ---! Comparison priority: ---! 1. Both operands carry `ob` (Block ORE) — order-preserving comparison ---! via `eql_v2.compare_ore_block_u64_8_256`. ---! 2. Both operands carry `hm` (HMAC-256) — a total order on the hmac ---! bytes. Not order-preserving on plaintext (hmac is not), but ---! deterministic, total, and `= 0` exactly when the hmac terms match ---! — consistent with the `=` operator, so `GROUP BY` / `DISTINCT` ---! deduplicate correctly. ---! 3. Otherwise — a deterministic order on the raw payload. Reached only ---! for term-less / mixed payloads; present so the function stays total. ---! ---! @param a eql_v2_encrypted First value ---! @param b eql_v2_encrypted Second value ---! @return integer -1, 0, or 1 ---! ---! @internal ---! @see eql_v2.encrypted_operator_class ---! @see eql_v2.compare -CREATE FUNCTION eql_v2.encrypted_btree_compare(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - hm_a text; - hm_b text; - BEGIN - -- Block ORE on both sides: order-preserving comparison. - IF eql_v2.has_ore_block_u64_8_256(a) AND eql_v2.has_ore_block_u64_8_256(b) THEN - RETURN eql_v2.compare_ore_block_u64_8_256(a, b); - END IF; - - -- HMAC on both sides: total order on the hmac bytes. `= 0` iff the hmac - -- terms match, consistent with the `=` operator and the hash opclass. - hm_a := eql_v2.hmac_256(a)::text; - hm_b := eql_v2.hmac_256(b)::text; - IF hm_a IS NOT NULL AND hm_b IS NOT NULL THEN - RETURN CASE - WHEN hm_a < hm_b THEN -1 - WHEN hm_a > hm_b THEN 1 - ELSE 0 - END; - END IF; - - -- Fallback for term-less / mixed payloads: a deterministic, non-raising - -- total order on the raw payload. Not a normal column shape — this - -- branch only keeps the btree FUNCTION 1 contract (total, never raises). - RETURN CASE - WHEN (a).data::text < (b).data::text THEN -1 - WHEN (a).data::text > (b).data::text THEN 1 - ELSE 0 - END; - END; -$$ LANGUAGE plpgsql; - --------------------- - -CREATE OPERATOR FAMILY eql_v2.encrypted_operator_family USING btree; - -CREATE OPERATOR CLASS eql_v2.encrypted_operator_class DEFAULT FOR TYPE eql_v2_encrypted USING btree FAMILY eql_v2.encrypted_operator_family AS - OPERATOR 1 <, - OPERATOR 2 <=, - OPERATOR 3 =, - OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 eql_v2.encrypted_btree_compare(a eql_v2_encrypted, b eql_v2_encrypted); diff --git a/src/operators/order_by.sql b/src/operators/order_by.sql deleted file mode 100644 index 79bd7f3dc..000000000 --- a/src/operators/order_by.sql +++ /dev/null @@ -1,28 +0,0 @@ --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql - ---! @brief Extract ORE index term for ordering encrypted values ---! ---! Helper function that extracts the ore_block_u64_8_256 index term from an encrypted value ---! for use in ORDER BY clauses when comparison operators are not appropriate or available. ---! ---! @param eql_v2_encrypted Encrypted value to extract order term from ---! @return eql_v2.ore_block_u64_8_256 ORE index term for ordering ---! ---! @example ---! -- Order encrypted values without using comparison operators ---! SELECT * FROM users ORDER BY eql_v2.order_by(encrypted_age); ---! ---! @note Requires 'ore' index configuration on the column ---! @see eql_v2.ore_block_u64_8_256 ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.order_by(a eql_v2_encrypted) - RETURNS eql_v2.ore_block_u64_8_256 - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.ore_block_u64_8_256(a); - END; -$$ LANGUAGE plpgsql; diff --git a/src/operators/sort.sql b/src/operators/sort.sql deleted file mode 100644 index f5fc1be0d..000000000 --- a/src/operators/sort.sql +++ /dev/null @@ -1,645 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql --- REQUIRE: src/operators/compare.sql --- REQUIRE: src/operators/order_by.sql - ---! @file operators/sort.sql ---! @brief Comparison-based sorting functions for encrypted values without operator classes ---! ---! Provides O(n log n) quicksort-based sorting using eql_v2.compare() for environments ---! where btree operator classes are unavailable (e.g., Supabase). This is significantly ---! faster than the O(n^2) correlated subquery workaround. ---! ---! When all input rows share an ORE term (`ob`) the sort path pre-extracts the ---! ORE order key once per row and compares those keys directly. Rows lacking ---! an ORE term entirely fall back to `eql_v2.compare()` per pair. - - ---! @internal ---! @brief Compare pre-extracted ORE order keys with encrypted NULL semantics ---! ---! Mirrors eql_v2.compare() for NULL handling, then delegates to the ---! ore_block_u64_8_256 comparator when both keys are present. ---! ---! @param a eql_v2.ore_block_u64_8_256 First order key ---! @param b eql_v2.ore_block_u64_8_256 Second order key ---! @return integer -1 if a < b, 0 if a = b, 1 if a > b -CREATE FUNCTION eql_v2._compare_order_key( - a eql_v2.ore_block_u64_8_256, - b eql_v2.ore_block_u64_8_256 -) -RETURNS integer -IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ -BEGIN - IF a IS NULL AND b IS NULL THEN - RETURN 0; - END IF; - - IF a IS NULL THEN - RETURN -1; - END IF; - - IF b IS NULL THEN - RETURN 1; - END IF; - - RETURN eql_v2.compare_ore_block_u64_8_256_terms(a, b); -END; -$$ LANGUAGE plpgsql; - - ---! @internal ---! @brief Compare two elements from aligned arrays using the selected sort strategy ---! ---! @param vals eql_v2_encrypted[] Encrypted values (used when strategy = 'compare') ---! @param ore_keys eql_v2.ore_block_u64_8_256[] Pre-extracted ORE keys (strategy = 'ore') ---! @param left_idx integer Index of the left element ---! @param right_idx integer Index of the right element ---! @param strategy text One of 'ore' or 'compare' ---! @return integer -1 if left < right, 0 if equal, 1 if left > right -CREATE FUNCTION eql_v2._compare_sort_elements( - vals eql_v2_encrypted[], - ore_keys eql_v2.ore_block_u64_8_256[], - left_idx integer, - right_idx integer, - strategy text -) -RETURNS integer -IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ -BEGIN - IF strategy = 'ore' THEN - RETURN eql_v2._compare_order_key(ore_keys[left_idx], ore_keys[right_idx]); - END IF; - - RETURN eql_v2.compare(vals[left_idx], vals[right_idx]); -END; -$$ LANGUAGE plpgsql; - - ---! @internal ---! @brief Compare an array element against a captured pivot using the selected strategy ---! ---! @param vals eql_v2_encrypted[] Array of encrypted values ---! @param ore_keys eql_v2.ore_block_u64_8_256[] Array of pre-extracted ORE keys ---! @param idx integer Index of the element to compare ---! @param pivot_val eql_v2_encrypted Pivot encrypted value (strategy = 'compare') ---! @param pivot_ore_key eql_v2.ore_block_u64_8_256 Pivot ORE key (strategy = 'ore') ---! @param strategy text One of 'ore' or 'compare' ---! @return integer -1 if element < pivot, 0 if equal, 1 if element > pivot -CREATE FUNCTION eql_v2._compare_sort_pivot( - vals eql_v2_encrypted[], - ore_keys eql_v2.ore_block_u64_8_256[], - idx integer, - pivot_val eql_v2_encrypted, - pivot_ore_key eql_v2.ore_block_u64_8_256, - strategy text -) -RETURNS integer -IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ -BEGIN - IF strategy = 'ore' THEN - RETURN eql_v2._compare_order_key(ore_keys[idx], pivot_ore_key); - END IF; - - RETURN eql_v2.compare(vals[idx], pivot_val); -END; -$$ LANGUAGE plpgsql; - - ---! @internal ---! @brief In-place insertion sort on parallel id/value/key arrays ---! ---! @param ids bigint[] Array of row identifiers (reordered in place) ---! @param vals eql_v2_encrypted[] Array of encrypted values (reordered in place) ---! @param ore_keys eql_v2.ore_block_u64_8_256[] Array of pre-extracted ORE keys (reordered in place) ---! @param lo integer Lower bound index (1-based, inclusive) ---! @param hi integer Upper bound index (1-based, inclusive) ---! @param strategy text One of 'ore' or 'compare' ---! @return ids bigint[] Sorted array of row identifiers ---! @return vals eql_v2_encrypted[] Sorted array of encrypted values ---! @return ore_keys eql_v2.ore_block_u64_8_256[] Sorted array of pre-extracted ORE keys -CREATE FUNCTION eql_v2._insertion_sort( - INOUT ids bigint[], - INOUT vals eql_v2_encrypted[], - INOUT ore_keys eql_v2.ore_block_u64_8_256[], - lo integer, - hi integer, - strategy text -) - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - i integer; - j integer; - key_id bigint; - key_val eql_v2_encrypted; - sort_ore_key eql_v2.ore_block_u64_8_256; -BEGIN - IF lo >= hi THEN - RETURN; - END IF; - - FOR i IN lo + 1..hi LOOP - key_id := ids[i]; - key_val := vals[i]; - sort_ore_key := ore_keys[i]; - j := i - 1; - - WHILE j >= lo LOOP - EXIT WHEN strategy = 'compare' - AND eql_v2.compare(vals[j], key_val) <= 0; - EXIT WHEN strategy = 'ore' - AND eql_v2._compare_order_key(ore_keys[j], sort_ore_key) <= 0; - - ids[j + 1] := ids[j]; - vals[j + 1] := vals[j]; - ore_keys[j + 1] := ore_keys[j]; - j := j - 1; - END LOOP; - - ids[j + 1] := key_id; - vals[j + 1] := key_val; - ore_keys[j + 1] := sort_ore_key; - END LOOP; -END; -$$ LANGUAGE plpgsql; - - ---! @internal ---! @brief In-place quicksort on parallel id/value/key arrays ---! ---! Sorts aligned arrays simultaneously using Hoare partition with median-of-three pivot ---! selection. The median-of-three strategy avoids O(n^2) degradation on already-sorted ---! input, which is common with sequential test data. ---! ---! @param ids bigint[] Array of row identifiers (reordered in place) ---! @param vals eql_v2_encrypted[] Array of encrypted values to compare (reordered in place) ---! @param ore_keys eql_v2.ore_block_u64_8_256[] Pre-extracted ORE keys (reordered in place) ---! @param lo integer Lower bound index (1-based, inclusive) ---! @param hi integer Upper bound index (1-based, inclusive) ---! @param strategy text One of 'ore' or 'compare' ---! ---! @return ids bigint[] Sorted array of row identifiers ---! @return vals eql_v2_encrypted[] Sorted array of encrypted values ---! @return ore_keys eql_v2.ore_block_u64_8_256[] Sorted array of pre-extracted ORE keys -CREATE FUNCTION eql_v2._quicksort_sorter( - INOUT ids bigint[], - INOUT vals eql_v2_encrypted[], - INOUT ore_keys eql_v2.ore_block_u64_8_256[], - lo integer, - hi integer, - strategy text -) - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - insertion_threshold CONSTANT integer := 16; - pivot_val eql_v2_encrypted; - pivot_ore_key eql_v2.ore_block_u64_8_256; - mid integer; - i integer; - j integer; - left_hi integer; - right_lo integer; - tmp_id bigint; - tmp_val eql_v2_encrypted; - tmp_ore_key eql_v2.ore_block_u64_8_256; -BEGIN - WHILE lo < hi LOOP - IF hi - lo <= insertion_threshold THEN - SELECT q.ids, q.vals, q.ore_keys - INTO ids, vals, ore_keys - FROM eql_v2._insertion_sort(ids, vals, ore_keys, lo, hi, strategy) q; - RETURN; - END IF; - - -- Median-of-three pivot selection: sort lo, mid, hi then use mid as pivot - mid := lo + (hi - lo) / 2; - - IF eql_v2._compare_sort_elements(vals, ore_keys, lo, mid, strategy) > 0 THEN - tmp_id := ids[lo]; ids[lo] := ids[mid]; ids[mid] := tmp_id; - tmp_val := vals[lo]; vals[lo] := vals[mid]; vals[mid] := tmp_val; - tmp_ore_key := ore_keys[lo]; ore_keys[lo] := ore_keys[mid]; ore_keys[mid] := tmp_ore_key; - END IF; - IF eql_v2._compare_sort_elements(vals, ore_keys, lo, hi, strategy) > 0 THEN - tmp_id := ids[lo]; ids[lo] := ids[hi]; ids[hi] := tmp_id; - tmp_val := vals[lo]; vals[lo] := vals[hi]; vals[hi] := tmp_val; - tmp_ore_key := ore_keys[lo]; ore_keys[lo] := ore_keys[hi]; ore_keys[hi] := tmp_ore_key; - END IF; - IF eql_v2._compare_sort_elements(vals, ore_keys, mid, hi, strategy) > 0 THEN - tmp_id := ids[mid]; ids[mid] := ids[hi]; ids[hi] := tmp_id; - tmp_val := vals[mid]; vals[mid] := vals[hi]; vals[hi] := tmp_val; - tmp_ore_key := ore_keys[mid]; ore_keys[mid] := ore_keys[hi]; ore_keys[hi] := tmp_ore_key; - END IF; - - pivot_val := vals[mid]; - pivot_ore_key := ore_keys[mid]; - i := lo; - j := hi; - - LOOP - WHILE eql_v2._compare_sort_pivot( - vals, ore_keys, i, - pivot_val, pivot_ore_key, strategy - ) < 0 LOOP - i := i + 1; - END LOOP; - WHILE eql_v2._compare_sort_pivot( - vals, ore_keys, j, - pivot_val, pivot_ore_key, strategy - ) > 0 LOOP - j := j - 1; - END LOOP; - - EXIT WHEN i >= j; - - tmp_id := ids[i]; ids[i] := ids[j]; ids[j] := tmp_id; - tmp_val := vals[i]; vals[i] := vals[j]; vals[j] := tmp_val; - tmp_ore_key := ore_keys[i]; ore_keys[i] := ore_keys[j]; ore_keys[j] := tmp_ore_key; - - i := i + 1; - j := j - 1; - END LOOP; - - left_hi := j; - right_lo := j + 1; - - IF left_hi - lo < hi - right_lo THEN - IF lo < left_hi THEN - SELECT q.ids, q.vals, q.ore_keys - INTO ids, vals, ore_keys - FROM eql_v2._quicksort_sorter(ids, vals, ore_keys, lo, left_hi, strategy) q; - END IF; - lo := right_lo; - ELSE - IF right_lo < hi THEN - SELECT q.ids, q.vals, q.ore_keys - INTO ids, vals, ore_keys - FROM eql_v2._quicksort_sorter(ids, vals, ore_keys, right_lo, hi, strategy) q; - END IF; - hi := left_hi; - END IF; - END LOOP; -END; -$$ LANGUAGE plpgsql; - - ---! @internal ---! @brief Emit aligned arrays as rows in ASC or DESC order ---! ---! @param ids bigint[] Array of sorted row identifiers ---! @param vals eql_v2_encrypted[] Array of sorted encrypted values ---! @param direction text Sort direction: 'ASC' (default) or 'DESC' ---! @return TABLE(id bigint, val eql_v2_encrypted) Rows emitted in the requested order -CREATE FUNCTION eql_v2._emit_sorted_rows( - ids bigint[], - vals eql_v2_encrypted[], - direction text DEFAULT 'ASC' -) -RETURNS TABLE(id bigint, val eql_v2_encrypted) -IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - n integer; - i integer; -BEGIN - n := coalesce(array_length(ids, 1), 0); - - IF upper(direction) = 'DESC' THEN - FOR i IN REVERSE n..1 LOOP - id := ids[i]; - val := vals[i]; - RETURN NEXT; - END LOOP; - ELSE - FOR i IN 1..n LOOP - id := ids[i]; - val := vals[i]; - RETURN NEXT; - END LOOP; - END IF; -END; -$$ LANGUAGE plpgsql; - - ---! @internal ---! @brief Sort encrypted values using precomputed ORE keys when available ---! ---! Shared implementation for public sorting entrypoints. The `strategy` ---! parameter selects the comparison path: `'ore'` uses the aligned `ore_keys` ---! array; `'compare'` falls back to `eql_v2.compare()` on the encrypted values ---! directly. ---! ---! @param ids bigint[] Row identifiers aligned with `vals` ---! @param vals eql_v2_encrypted[] Encrypted values to sort ---! @param ore_keys eql_v2.ore_block_u64_8_256[] Pre-extracted ORE keys (used when strategy = 'ore') ---! @param direction text Sort direction: 'ASC' (default) or 'DESC' ---! @param strategy text One of 'ore' or 'compare' ---! @return TABLE(id bigint, val eql_v2_encrypted) Sorted rows -CREATE FUNCTION eql_v2._sort_compare_precomputed( - ids bigint[], - vals eql_v2_encrypted[], - ore_keys eql_v2.ore_block_u64_8_256[], - direction text DEFAULT 'ASC', - strategy text DEFAULT 'ore' -) -RETURNS TABLE(id bigint, val eql_v2_encrypted) -IMMUTABLE PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - n integer; - m integer; - k integer; - sorted_ids bigint[]; - sorted_vals eql_v2_encrypted[]; - sorted_ore_keys eql_v2.ore_block_u64_8_256[]; -BEGIN - n := coalesce(array_length(ids, 1), 0); - m := coalesce(array_length(vals, 1), 0); - - IF n <> m THEN - RAISE EXCEPTION 'ids and vals must have the same length'; - END IF; - - IF strategy = 'ore' THEN - k := coalesce(array_length(ore_keys, 1), 0); - IF n <> k THEN - RAISE EXCEPTION 'ids and ore_keys must have the same length when strategy = ''ore'''; - END IF; - END IF; - - IF n = 0 THEN - RETURN; - END IF; - - IF n = 1 THEN - id := ids[1]; - val := vals[1]; - RETURN NEXT; - RETURN; - END IF; - - SELECT q.ids, q.vals, q.ore_keys - INTO sorted_ids, sorted_vals, sorted_ore_keys - FROM eql_v2._quicksort_sorter(ids, vals, ore_keys, 1, n, strategy) q; - - RETURN QUERY - SELECT emitted.id, emitted.val - FROM eql_v2._emit_sorted_rows(sorted_ids, sorted_vals, direction) emitted; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Sort encrypted values using comparison-based quicksort ---! ---! Sorts parallel arrays of identifiers and encrypted values using O(n log n) ---! quicksort with eql_v2.compare(). Returns sorted rows as a table, avoiding ---! the need for unnest() or other array manipulation by callers. ---! ---! When all input rows share an `ore` term the sort uses pre-extracted ORE ---! keys; otherwise it falls back to `eql_v2.compare()` per pair. ---! ---! This function is designed for environments without operator classes (e.g., Supabase) ---! where direct ORDER BY on encrypted columns is not available. ---! ---! @param ids bigint[] Array of row identifiers ---! @param vals eql_v2_encrypted[] Array of encrypted values (must be same length as ids) ---! @param direction text Sort direction: 'ASC' (default) or 'DESC' ---! @return TABLE(id bigint, val eql_v2_encrypted) Sorted rows ---! ---! @example ---! -- Sort all rows from an encrypted table ---! SELECT * FROM eql_v2.sort_compare( ---! (SELECT array_agg(id ORDER BY id) FROM ore), ---! (SELECT array_agg(e ORDER BY id) FROM ore), ---! 'ASC' ---! ); ---! ---! -- Sort with a filter ---! SELECT * FROM eql_v2.sort_compare( ---! (SELECT array_agg(id ORDER BY id) FROM ore WHERE id > 42), ---! (SELECT array_agg(e ORDER BY id) FROM ore WHERE id > 42), ---! 'DESC' ---! ); ---! ---! -- Compose with LIMIT ---! SELECT * FROM eql_v2.sort_compare( ---! (SELECT array_agg(id ORDER BY id) FROM ore), ---! (SELECT array_agg(e ORDER BY id) FROM ore) ---! ) LIMIT 5; ---! ---! @see eql_v2.compare ---! @see eql_v2.order_by_compare -CREATE FUNCTION eql_v2.sort_compare( - ids bigint[], - vals eql_v2_encrypted[], - direction text DEFAULT 'ASC' -) -RETURNS TABLE(id bigint, val eql_v2_encrypted) -IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - n integer; - sorted_ore_keys eql_v2.ore_block_u64_8_256[]; - i integer; - use_ore boolean := true; - strategy text; -BEGIN - n := coalesce(array_length(ids, 1), 0); - - -- Pre-extract sort keys. ORE wins if every non-NULL row carries `ob`, - -- otherwise fall back to eql_v2.compare() per pair. - FOR i IN 1..n LOOP - IF vals[i] IS NULL THEN - sorted_ore_keys[i] := NULL; - ELSE - IF use_ore THEN - IF eql_v2.has_ore_block_u64_8_256(vals[i]) THEN - sorted_ore_keys[i] := eql_v2.order_by(vals[i]); - ELSE - use_ore := false; - END IF; - END IF; - - EXIT WHEN NOT use_ore; - END IF; - END LOOP; - - IF use_ore THEN - strategy := 'ore'; - ELSE - strategy := 'compare'; - END IF; - - RETURN QUERY - SELECT sc.id, sc.val - FROM eql_v2._sort_compare_precomputed( - ids, vals, sorted_ore_keys, direction, strategy - ) sc; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Sort encrypted values from a table using column and table references ---! ---! Convenience overload that accepts column names, a table name, and an optional ---! filter clause instead of pre-aggregated arrays. Internally constructs the ---! query and delegates to eql_v2.order_by_compare(). ---! ---! @param id_column text Name of the bigint identifier column ---! @param val_column text Name of the eql_v2_encrypted value column ---! @param tbl text Table name (may be schema-qualified) ---! @param direction text Sort direction: 'ASC' (default) or 'DESC' ---! @param filter text Optional WHERE clause (without the WHERE keyword) ---! @return TABLE(id bigint, val eql_v2_encrypted) Sorted rows ---! ---! @note The id column must be castable to bigint. Uses dynamic SQL internally. ---! @warning The filter parameter is executed as dynamic SQL. Use only with trusted input. ---! ---! @example ---! -- Sort all rows ascending (default) ---! SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore'); ---! ---! -- Sort descending ---! SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore', 'DESC'); ---! ---! -- Sort with a filter ---! SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore', 'ASC', 'id > 42'); ---! ---! -- Compose with LIMIT ---! SELECT * FROM eql_v2.sort_compare('id', 'e', 'ore') LIMIT 10; ---! ---! @see eql_v2.sort_compare(bigint[], eql_v2_encrypted[], text) ---! @see eql_v2.order_by_compare -CREATE FUNCTION eql_v2.sort_compare( - id_column text, - val_column text, - tbl text, - direction text DEFAULT 'ASC', - filter text DEFAULT NULL -) -RETURNS TABLE(id bigint, val eql_v2_encrypted) - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - query text; - resolved_tbl regclass; -BEGIN - resolved_tbl := to_regclass(tbl); - - IF resolved_tbl IS NULL THEN - RAISE EXCEPTION 'table "%" does not exist', tbl; - END IF; - - query := format('SELECT %I, %I FROM %s', id_column, val_column, resolved_tbl); - - IF filter IS NOT NULL THEN - query := query || ' WHERE ' || filter; - END IF; - - RETURN QUERY - SELECT sc.id, sc.val - FROM eql_v2.order_by_compare(query, direction) sc; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Sort encrypted values from a query using comparison-based quicksort ---! ---! Convenience wrapper that accepts a SQL query string, executes it, collects the ---! results, and returns them sorted. For ORE-backed values this pre-extracts the ---! order key once per row and sorts on that key; other inputs fall back to ---! eql_v2.compare(). The query must return exactly two columns: a bigint ---! identifier and an eql_v2_encrypted value. ---! ---! @param query text SQL query returning (bigint, eql_v2_encrypted) columns ---! @param direction text Sort direction: 'ASC' (default) or 'DESC' ---! @return TABLE(id bigint, val eql_v2_encrypted) Sorted rows ---! ---! @note Uses dynamic SQL (EXECUTE) so cannot be IMMUTABLE or PARALLEL SAFE ---! @warning The query parameter is executed as dynamic SQL. Use only with trusted input. ---! ---! @example ---! -- Sort all rows ---! SELECT * FROM eql_v2.order_by_compare('SELECT id, e FROM ore'); ---! ---! -- Sort with WHERE clause ---! SELECT * FROM eql_v2.order_by_compare( ---! 'SELECT id, e FROM ore WHERE id > 42', ---! 'DESC' ---! ); ---! ---! @see eql_v2.sort_compare ---! @see eql_v2.compare -CREATE FUNCTION eql_v2.order_by_compare( - query text, - direction text DEFAULT 'ASC' -) -RETURNS TABLE(id bigint, val eql_v2_encrypted) - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - all_ids bigint[]; - all_vals eql_v2_encrypted[]; - all_ore_keys eql_v2.ore_block_u64_8_256[]; - all_have_ore_keys boolean; - strategy text; -BEGIN - -- Pre-extract sort keys. ORE wins if every non-NULL row carries `ob`, - -- otherwise fall back to eql_v2.compare() per pair. - EXECUTE format( - 'WITH input_rows AS ( - SELECT row_number() OVER () AS ord, - sub.id, - sub.val, - CASE - WHEN sub.val IS NULL THEN NULL - WHEN eql_v2.has_ore_block_u64_8_256(sub.val) THEN eql_v2.order_by(sub.val) - ELSE NULL - END AS ore_key, - CASE - WHEN sub.val IS NULL THEN TRUE - ELSE eql_v2.has_ore_block_u64_8_256(sub.val) - END AS has_ore_key - FROM (%s) sub(id, val) - ) - SELECT array_agg(id ORDER BY ord), - array_agg(val ORDER BY ord), - array_agg(ore_key ORDER BY ord), - coalesce(bool_and(has_ore_key), TRUE) - FROM input_rows', - query - ) INTO all_ids, all_vals, all_ore_keys, all_have_ore_keys; - - IF all_ids IS NULL THEN - RETURN; - END IF; - - IF all_have_ore_keys THEN - strategy := 'ore'; - ELSE - strategy := 'compare'; - END IF; - - RETURN QUERY - SELECT sc.id, sc.val - FROM eql_v2._sort_compare_precomputed( - all_ids, - all_vals, - all_ore_keys, - direction, - strategy - ) sc; -END; -$$ LANGUAGE plpgsql; diff --git a/src/operators/ste_vec_entry.sql b/src/operators/ste_vec_entry.sql deleted file mode 100644 index 9e22bcfff..000000000 --- a/src/operators/ste_vec_entry.sql +++ /dev/null @@ -1,179 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ste_vec/types.sql --- REQUIRE: src/ste_vec/eq_term.sql --- REQUIRE: src/hmac_256/types.sql --- REQUIRE: src/hmac_256/functions.sql --- REQUIRE: src/ore_cllw/types.sql --- REQUIRE: src/ore_cllw/functions.sql - ---! @file src/operators/ste_vec_entry.sql ---! @brief Comparison operators on `eql_v2.ste_vec_entry` ---! ---! Equality (`=`, `<>`) reduces to `eq_term(a) = eq_term(b)` — a bytea ---! comparison of `coalesce(hm, oc)`. Ordering (`<`, `<=`, `>`, `>=`) ---! reduces to `ore_cllw(a) ore_cllw(b)`. Each backing function is ---! inlinable single-statement SQL, so the planner can fold the ---! operator body into the calling query — `WHERE col -> 'sel' = $1` ---! and `WHERE col -> 'sel' < $1` therefore match functional indexes ---! built on `eql_v2.eq_term(col -> 'sel')` / ---! `eql_v2.ore_cllw(col -> 'sel')` without per-query rewriting. ---! ---! XOR contract. Each sv entry carries exactly one of `hm` (bool ---! leaves, array / object roots) or `oc` (string / number leaves) — ---! enforced by the `ste_vec_entry` DOMAIN CHECK. Equality coalesces ---! across both protocols because both are deterministic and the byte ---! distributions are disjoint; ordering strictly uses `ore_cllw` ---! (range on hm-only entries is meaningless and produces silent NULL, ---! which the lint subsystem `src/lint/lints.sql` flags as a ---! configuration error). ---! ---! Same convention as the `eql_v2_encrypted` operators (#193 / #211): the ---! operator-class function-matching layer is what makes index match work ---! structurally, the backing functions just need to inline cleanly through ---! to the extractor calls. ---! ---! @see eql_v2.eq_term(eql_v2.ste_vec_entry) ---! @see eql_v2.ore_cllw(eql_v2.ste_vec_entry) ---! @see src/operators/=.sql ---! @see src/operators/<.sql - ---! @brief Equality backing function for `eql_v2.ste_vec_entry` ---! @internal ---! @param a eql_v2.ste_vec_entry Left operand ---! @param b eql_v2.ste_vec_entry Right operand ---! @return boolean True if both entries share the same deterministic ---! equality term (hm-or-oc, via `eq_term`). -CREATE FUNCTION eql_v2.eq(a eql_v2.ste_vec_entry, b eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.eq_term(a) = eql_v2.eq_term(b) -$$; - -CREATE OPERATOR = ( - FUNCTION = eql_v2.eq, - LEFTARG = eql_v2.ste_vec_entry, - RIGHTARG = eql_v2.ste_vec_entry, - COMMUTATOR = =, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - - ---! @brief Inequality backing function for `eql_v2.ste_vec_entry` ---! @internal ---! @param a eql_v2.ste_vec_entry Left operand ---! @param b eql_v2.ste_vec_entry Right operand ---! @return boolean True if the entries' equality terms (hm-or-oc, via ---! `eq_term`) differ. -CREATE FUNCTION eql_v2.neq(a eql_v2.ste_vec_entry, b eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.eq_term(a) <> eql_v2.eq_term(b) -$$; - -CREATE OPERATOR <> ( - FUNCTION = eql_v2.neq, - LEFTARG = eql_v2.ste_vec_entry, - RIGHTARG = eql_v2.ste_vec_entry, - COMMUTATOR = <>, - NEGATOR = =, - RESTRICT = neqsel, - JOIN = neqjoinsel -); - - ---! @brief Less-than backing function for `eql_v2.ste_vec_entry` ---! @internal ---! @param a eql_v2.ste_vec_entry Left operand ---! @param b eql_v2.ste_vec_entry Right operand ---! @return boolean True if `a`'s CLLW ORE term sorts before `b`'s -CREATE FUNCTION eql_v2.lt(a eql_v2.ste_vec_entry, b eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_cllw(a) < eql_v2.ore_cllw(b) -$$; - -CREATE OPERATOR < ( - FUNCTION = eql_v2.lt, - LEFTARG = eql_v2.ste_vec_entry, - RIGHTARG = eql_v2.ste_vec_entry, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - - ---! @brief Less-than-or-equal backing function for `eql_v2.ste_vec_entry` ---! @internal ---! @param a eql_v2.ste_vec_entry Left operand ---! @param b eql_v2.ste_vec_entry Right operand ---! @return boolean True if `a`'s CLLW ORE term sorts before or equal to `b`'s -CREATE FUNCTION eql_v2.lte(a eql_v2.ste_vec_entry, b eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_cllw(a) <= eql_v2.ore_cllw(b) -$$; - -CREATE OPERATOR <= ( - FUNCTION = eql_v2.lte, - LEFTARG = eql_v2.ste_vec_entry, - RIGHTARG = eql_v2.ste_vec_entry, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - - ---! @brief Greater-than backing function for `eql_v2.ste_vec_entry` ---! @internal ---! @param a eql_v2.ste_vec_entry Left operand ---! @param b eql_v2.ste_vec_entry Right operand ---! @return boolean True if `a`'s CLLW ORE term sorts after `b`'s -CREATE FUNCTION eql_v2.gt(a eql_v2.ste_vec_entry, b eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_cllw(a) > eql_v2.ore_cllw(b) -$$; - -CREATE OPERATOR > ( - FUNCTION = eql_v2.gt, - LEFTARG = eql_v2.ste_vec_entry, - RIGHTARG = eql_v2.ste_vec_entry, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - - ---! @brief Greater-than-or-equal backing function for `eql_v2.ste_vec_entry` ---! @internal ---! @param a eql_v2.ste_vec_entry Left operand ---! @param b eql_v2.ste_vec_entry Right operand ---! @return boolean True if `a`'s CLLW ORE term sorts after or equal to `b`'s -CREATE FUNCTION eql_v2.gte(a eql_v2.ste_vec_entry, b eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.ore_cllw(a) >= eql_v2.ore_cllw(b) -$$; - -CREATE OPERATOR >= ( - FUNCTION = eql_v2.gte, - LEFTARG = eql_v2.ste_vec_entry, - RIGHTARG = eql_v2.ste_vec_entry, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); diff --git a/src/operators/~~.sql b/src/operators/~~.sql deleted file mode 100644 index 6407e1a67..000000000 --- a/src/operators/~~.sql +++ /dev/null @@ -1,206 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/bloom_filter/types.sql --- REQUIRE: src/bloom_filter/functions.sql - ---! @brief Pattern matching helper using bloom filters ---! @internal ---! ---! Internal helper for LIKE-style pattern matching on encrypted values. ---! Uses bloom filter index terms to test substring containment without decryption. ---! Requires 'match' index configuration on the column. ---! ---! Marked IMMUTABLE so the planner inlines the body and a functional index on ---! `eql_v2.bloom_filter(col)` can match `WHERE eql_v2.like(col, val)`. ---! ---! @param a eql_v2_encrypted Haystack (value to search in) ---! @param b eql_v2_encrypted Needle (pattern to search for) ---! @return Boolean True if bloom filter of a contains bloom filter of b ---! ---! @see eql_v2."~~" ---! @see eql_v2.bloom_filter ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.like(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean -LANGUAGE SQL -IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.bloom_filter(a) @> eql_v2.bloom_filter(b); -$$; - ---! @brief Case-insensitive pattern matching helper ---! @internal ---! ---! Internal helper for ILIKE-style case-insensitive pattern matching. ---! Case sensitivity is controlled by index configuration (token_filters with downcase). ---! This function has same implementation as like() - actual case handling is in index terms. ---! ---! @param a eql_v2_encrypted Haystack (value to search in) ---! @param b eql_v2_encrypted Needle (pattern to search for) ---! @return Boolean True if bloom filter of a contains bloom filter of b ---! ---! @note Case sensitivity depends on match index token_filters configuration ---! @see eql_v2."~~" ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.ilike(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean -LANGUAGE SQL -IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.bloom_filter(a) @> eql_v2.bloom_filter(b); -$$; - ---! @brief LIKE operator for encrypted values (pattern matching) ---! ---! Implements the ~~ (LIKE) operator for substring/pattern matching on encrypted ---! text using bloom filter index terms. Enables WHERE col LIKE '%pattern%' queries ---! without decryption. Requires 'match' index configuration on the column. ---! ---! Pattern matching uses n-gram tokenization configured in match index. Token length ---! and filters affect matching behavior. ---! ---! @param a eql_v2_encrypted Haystack (encrypted text to search in) ---! @param b eql_v2_encrypted Needle (encrypted pattern to search for) ---! @return Boolean True if a contains b as substring ---! ---! @example ---! -- Search for substring in encrypted email ---! SELECT * FROM users ---! WHERE encrypted_email ~~ '%@example.com%'::text::eql_v2_encrypted; ---! ---! -- Pattern matching on encrypted names ---! SELECT * FROM customers ---! WHERE encrypted_name ~~ 'John%'::text::eql_v2_encrypted; ---! ---! @brief SQL LIKE operator (~~ operator) for encrypted text pattern matching ---! ---! @param a eql_v2_encrypted Left operand (encrypted value) ---! @param b eql_v2_encrypted Right operand (encrypted pattern) ---! @return boolean True if pattern matches ---! ---! @note Requires match index: eql_v2.add_search_config(table, column, 'match') ---! @see eql_v2.like ---! @see eql_v2.add_search_config --- Inlinable: delegates to `eql_v2.like` which is itself an inlinable --- single-statement SQL function. Two levels of inlining produce --- `eql_v2.bloom_filter(a) @> eql_v2.bloom_filter(b)`, which matches a --- functional GIN index built on `eql_v2.bloom_filter(col)`. PostgREST --- and ORM `~~`/`~~*` queries engage the bloom-filter index without --- the caller wrapping the column themselves. -CREATE FUNCTION eql_v2."~~"(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.like(a, b) -$$; - -CREATE OPERATOR ~~( - FUNCTION=eql_v2."~~", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - ---! @brief Case-insensitive LIKE operator (~~*) ---! ---! Implements ~~* (ILIKE) operator for case-insensitive pattern matching. ---! Case handling depends on match index token_filters configuration (use downcase filter). ---! Same implementation as ~~, with case sensitivity controlled by index configuration. ---! ---! @param a eql_v2_encrypted Haystack ---! @param b eql_v2_encrypted Needle ---! @return Boolean True if a contains b (case-insensitive) ---! ---! @note Configure match index with downcase token filter for case-insensitivity ---! @see eql_v2."~~" -CREATE OPERATOR ~~*( - FUNCTION=eql_v2."~~", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - ---! @brief LIKE operator for encrypted value and JSONB ---! ---! Overload of ~~ operator accepting JSONB on the right side. Automatically ---! casts JSONB to eql_v2_encrypted for bloom filter pattern matching. ---! ---! @param eql_v2_encrypted Haystack (encrypted value) ---! @param b JSONB Needle (will be cast to eql_v2_encrypted) ---! @return Boolean True if a contains b as substring ---! ---! @example ---! SELECT * FROM users WHERE encrypted_email ~~ '%gmail%'::jsonb; ---! ---! @see eql_v2."~~"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."~~"(a eql_v2_encrypted, b jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.like(a, b::eql_v2_encrypted) -$$; - - -CREATE OPERATOR ~~( - FUNCTION=eql_v2."~~", - LEFTARG=eql_v2_encrypted, - RIGHTARG=jsonb, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - -CREATE OPERATOR ~~*( - FUNCTION=eql_v2."~~", - LEFTARG=eql_v2_encrypted, - RIGHTARG=jsonb, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - ---! @brief LIKE operator for JSONB and encrypted value ---! ---! Overload of ~~ operator accepting JSONB on the left side. Automatically ---! casts JSONB to eql_v2_encrypted for bloom filter pattern matching. ---! ---! @param a JSONB Haystack (will be cast to eql_v2_encrypted) ---! @param eql_v2_encrypted Needle (encrypted pattern) ---! @return Boolean True if a contains b as substring ---! ---! @example ---! SELECT * FROM users WHERE 'test@example.com'::jsonb ~~ encrypted_pattern; ---! ---! @see eql_v2."~~"(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2."~~"(a jsonb, b eql_v2_encrypted) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.like(a::eql_v2_encrypted, b) -$$; - - -CREATE OPERATOR ~~( - FUNCTION=eql_v2."~~", - LEFTARG=jsonb, - RIGHTARG=eql_v2_encrypted, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - -CREATE OPERATOR ~~*( - FUNCTION=eql_v2."~~", - LEFTARG=jsonb, - RIGHTARG=eql_v2_encrypted, - RESTRICT = eqsel, - JOIN = eqjoinsel, - MERGES -); - - --- ----------------------------------------------------------------------------- diff --git a/src/ore_block_u64_8_256/casts.sql b/src/ore_block_u64_8_256/casts.sql deleted file mode 100644 index 23fdd3e4a..000000000 --- a/src/ore_block_u64_8_256/casts.sql +++ /dev/null @@ -1,28 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql - ---! @brief Cast text to ORE block term ---! @internal ---! ---! Converts text to bytea and wraps in ore_block_u64_8_256_term type. ---! Used internally for ORE block extraction and manipulation. ---! ---! @param t Text Text value to convert ---! @return eql_v2.ore_block_u64_8_256_term ORE term containing bytea representation ---! ---! @see eql_v2.ore_block_u64_8_256_term -CREATE FUNCTION eql_v2.text_to_ore_block_u64_8_256_term(t text) - RETURNS eql_v2.ore_block_u64_8_256_term - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -BEGIN ATOMIC - RETURN t::bytea; -END; - ---! @brief Implicit cast from text to ORE block term ---! ---! Defines an implicit cast allowing automatic conversion of text values ---! to ore_block_u64_8_256_term type for ORE operations. ---! ---! @see eql_v2.text_to_ore_block_u64_8_256_term -CREATE CAST (text AS eql_v2.ore_block_u64_8_256_term) - WITH FUNCTION eql_v2.text_to_ore_block_u64_8_256_term(text) AS IMPLICIT; diff --git a/src/ore_block_u64_8_256/compare.sql b/src/ore_block_u64_8_256/compare.sql deleted file mode 100644 index cf6be7970..000000000 --- a/src/ore_block_u64_8_256/compare.sql +++ /dev/null @@ -1,68 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql - - ---! @brief Compare two encrypted values using ORE block index terms ---! ---! Performs a three-way comparison (returns -1/0/1) of encrypted values using ---! their ORE block index terms. Used internally by range operators (<, <=, >, >=) ---! for order-revealing comparisons without decryption. ---! ---! @param a eql_v2_encrypted First encrypted value to compare ---! @param b eql_v2_encrypted Second encrypted value to compare ---! @return Integer -1 if a < b, 0 if a = b, 1 if a > b ---! ---! @note NULL values are sorted before non-NULL values ---! @note Uses ORE cryptographic protocol for secure comparisons ---! ---! @see eql_v2.ore_block_u64_8_256 ---! @see eql_v2.has_ore_block_u64_8_256 ---! @see eql_v2."<" ---! @see eql_v2.">" -CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS integer - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - a_term eql_v2.ore_block_u64_8_256; - b_term eql_v2.ore_block_u64_8_256; - BEGIN - - IF a IS NULL AND b IS NULL THEN - RETURN 0; - END IF; - - IF a IS NULL THEN - RETURN -1; - END IF; - - IF b IS NULL THEN - RETURN 1; - END IF; - - IF eql_v2.has_ore_block_u64_8_256(a) THEN - a_term := eql_v2.ore_block_u64_8_256(a); - END IF; - - IF eql_v2.has_ore_block_u64_8_256(a) THEN - b_term := eql_v2.ore_block_u64_8_256(b); - END IF; - - IF a_term IS NULL AND b_term IS NULL THEN - RETURN 0; - END IF; - - IF a_term IS NULL THEN - RETURN -1; - END IF; - - IF b_term IS NULL THEN - RETURN 1; - END IF; - - RETURN eql_v2.compare_ore_block_u64_8_256_terms(a_term.terms, b_term.terms); - END; -$$ LANGUAGE plpgsql; - diff --git a/src/ore_block_u64_8_256/functions.sql b/src/ore_block_u64_8_256/functions.sql deleted file mode 100644 index 6d62b9a50..000000000 --- a/src/ore_block_u64_8_256/functions.sql +++ /dev/null @@ -1,295 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/crypto.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/functions.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql - - ---! @brief Convert JSONB array to ORE block composite type ---! @internal ---! ---! Converts a JSONB array of hex-encoded ORE terms from the CipherStash Proxy ---! payload into the PostgreSQL composite type used for ORE operations. ---! ---! @param val JSONB Array of hex-encoded ORE block terms ---! @return eql_v2.ore_block_u64_8_256 ORE block composite type, or NULL if input is null ---! ---! @see eql_v2.ore_block_u64_8_256(jsonb) -CREATE FUNCTION eql_v2.jsonb_array_to_ore_block_u64_8_256(val jsonb) -RETURNS eql_v2.ore_block_u64_8_256 - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - terms eql_v2.ore_block_u64_8_256_term[]; -BEGIN - IF jsonb_typeof(val) = 'null' THEN - RETURN NULL; - END IF; - - SELECT array_agg(ROW(b)::eql_v2.ore_block_u64_8_256_term) - INTO terms - FROM unnest(eql_v2.jsonb_array_to_bytea_array(val)) AS b; - - RETURN ROW(terms)::eql_v2.ore_block_u64_8_256; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract ORE block index term from JSONB payload ---! ---! Extracts the ORE block array from the 'ob' field of an encrypted ---! data payload. Used internally for range query comparisons. ---! ---! @param jsonb containing encrypted EQL payload ---! @return eql_v2.ore_block_u64_8_256 ORE block index term ---! @throws Exception if 'ob' field is missing when ore index is expected ---! ---! @see eql_v2.has_ore_block_u64_8_256 ---! @see eql_v2.compare_ore_block_u64_8_256 -CREATE FUNCTION eql_v2.ore_block_u64_8_256(val jsonb) - RETURNS eql_v2.ore_block_u64_8_256 - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF val IS NULL THEN - RETURN NULL; - END IF; - - IF eql_v2.has_ore_block_u64_8_256(val) THEN - RETURN eql_v2.jsonb_array_to_ore_block_u64_8_256(val->'ob'); - END IF; - RAISE 'Expected an ore index (ob) value in json: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract ORE block index term from encrypted column value ---! ---! Extracts the ORE block from an encrypted column value by accessing ---! its underlying JSONB data field. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return eql_v2.ore_block_u64_8_256 ORE block index term ---! ---! @see eql_v2.ore_block_u64_8_256(jsonb) -CREATE FUNCTION eql_v2.ore_block_u64_8_256(val eql_v2_encrypted) - RETURNS eql_v2.ore_block_u64_8_256 - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.ore_block_u64_8_256(val.data); - END; -$$ LANGUAGE plpgsql; - - ---! @brief Check if JSONB payload contains ORE block index term ---! ---! Tests whether the encrypted data payload includes an 'ob' field, ---! indicating an ORE block is available for range queries. ---! ---! @param jsonb containing encrypted EQL payload ---! @return Boolean True if 'ob' field is present and non-null ---! ---! @see eql_v2.ore_block_u64_8_256 -CREATE FUNCTION eql_v2.has_ore_block_u64_8_256(val jsonb) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN val ->> 'ob' IS NOT NULL; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Check if encrypted column value contains ORE block index term ---! ---! Tests whether an encrypted column value includes an ORE block ---! by checking its underlying JSONB data field. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return Boolean True if ORE block is present ---! ---! @see eql_v2.has_ore_block_u64_8_256(jsonb) -CREATE FUNCTION eql_v2.has_ore_block_u64_8_256(val eql_v2_encrypted) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.has_ore_block_u64_8_256(val.data); - END; -$$ LANGUAGE plpgsql; - - - ---! @brief Compare two ORE block terms using cryptographic comparison ---! @internal ---! ---! Performs a three-way comparison (returns -1/0/1) of individual ORE block terms ---! using the ORE cryptographic protocol. Compares PRP and PRF blocks to determine ---! ordering without decryption. ---! ---! @param a eql_v2.ore_block_u64_8_256_term First ORE term to compare ---! @param b eql_v2.ore_block_u64_8_256_term Second ORE term to compare ---! @return Integer -1 if a < b, 0 if a = b, 1 if a > b ---! @throws Exception if ciphertexts are different lengths ---! ---! @note Uses AES-ECB encryption for bit comparisons per ORE protocol ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256_term(a eql_v2.ore_block_u64_8_256_term, b eql_v2.ore_block_u64_8_256_term) - RETURNS integer - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - eq boolean := true; - unequal_block smallint := 0; - hash_key bytea; - data_block bytea; - encrypt_block bytea; - target_block bytea; - - left_block_size CONSTANT smallint := 16; - right_block_size CONSTANT smallint := 32; - right_offset CONSTANT smallint := 136; -- 8 * 17 - - indicator smallint := 0; - BEGIN - IF a IS NULL AND b IS NULL THEN - RETURN 0; - END IF; - - IF a IS NULL THEN - RETURN -1; - END IF; - - IF b IS NULL THEN - RETURN 1; - END IF; - - IF bit_length(a.bytes) != bit_length(b.bytes) THEN - RAISE EXCEPTION 'Ciphertexts are different lengths'; - END IF; - - FOR block IN 0..7 LOOP - -- Compare each PRP (byte from the first 8 bytes) and PRF block (8 byte - -- chunks of the rest of the value). - -- NOTE: - -- * Substr is ordinally indexed (hence 1 and not 0, and 9 and not 8). - -- * We are not worrying about timing attacks here; don't fret about - -- the OR or !=. - IF - substr(a.bytes, 1 + block, 1) != substr(b.bytes, 1 + block, 1) - OR substr(a.bytes, 9 + left_block_size * block, left_block_size) != substr(b.bytes, 9 + left_block_size * BLOCK, left_block_size) - THEN - -- set the first unequal block we find - IF eq THEN - unequal_block := block; - END IF; - eq = false; - END IF; - END LOOP; - - IF eq THEN - RETURN 0::integer; - END IF; - - -- Hash key is the IV from the right CT of b - hash_key := substr(b.bytes, right_offset + 1, 16); - - -- first right block is at right offset + nonce_size (ordinally indexed) - target_block := substr(b.bytes, right_offset + 17 + (unequal_block * right_block_size), right_block_size); - - data_block := substr(a.bytes, 9 + (left_block_size * unequal_block), left_block_size); - - encrypt_block := encrypt(data_block::bytea, hash_key::bytea, 'aes-ecb'); - - indicator := ( - get_bit( - encrypt_block, - 0 - ) + get_bit(target_block, get_byte(a.bytes, unequal_block))) % 2; - - IF indicator = 1 THEN - RETURN 1::integer; - ELSE - RETURN -1::integer; - END IF; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Compare arrays of ORE block terms recursively ---! @internal ---! ---! Recursively compares arrays of ORE block terms element-by-element. ---! Empty arrays are considered less than non-empty arrays. If the first elements ---! are equal, recursively compares remaining elements. ---! ---! @param a eql_v2.ore_block_u64_8_256_term[] First array of ORE terms ---! @param b eql_v2.ore_block_u64_8_256_term[] Second array of ORE terms ---! @return Integer -1 if a < b, 0 if a = b, 1 if a > b, NULL if either array is NULL ---! ---! @note Empty arrays sort before non-empty arrays ---! @see eql_v2.compare_ore_block_u64_8_256_term -CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256_terms(a eql_v2.ore_block_u64_8_256_term[], b eql_v2.ore_block_u64_8_256_term[]) -RETURNS integer - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - cmp_result integer; - BEGIN - - -- NULLs are NULL - IF a IS NULL OR b IS NULL THEN - RETURN NULL; - END IF; - - -- empty a and b - IF cardinality(a) = 0 AND cardinality(b) = 0 THEN - RETURN 0; - END IF; - - -- empty a and some b - IF (cardinality(a) = 0) AND cardinality(b) > 0 THEN - RETURN -1; - END IF; - - -- some a and empty b - IF cardinality(a) > 0 AND (cardinality(b) = 0) THEN - RETURN 1; - END IF; - - cmp_result := eql_v2.compare_ore_block_u64_8_256_term(a[1], b[1]); - - IF cmp_result = 0 THEN - -- Removes the first element in the array, and calls this fn again to compare the next element/s in the array. - RETURN eql_v2.compare_ore_block_u64_8_256_terms(a[2:array_length(a,1)], b[2:array_length(b,1)]); - END IF; - - RETURN cmp_result; - END -$$ LANGUAGE plpgsql; - - ---! @brief Compare ORE block composite types ---! @internal ---! ---! Wrapper function that extracts term arrays from ORE block composite types ---! and delegates to the array comparison function. ---! ---! @param a eql_v2.ore_block_u64_8_256 First ORE block ---! @param b eql_v2.ore_block_u64_8_256 Second ORE block ---! @return Integer -1 if a < b, 0 if a = b, 1 if a > b ---! ---! @see eql_v2.compare_ore_block_u64_8_256_terms(eql_v2.ore_block_u64_8_256_term[], eql_v2.ore_block_u64_8_256_term[]) -CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256_terms(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -RETURNS integer - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.compare_ore_block_u64_8_256_terms(a.terms, b.terms); - END -$$ LANGUAGE plpgsql; diff --git a/src/ore_block_u64_8_256/operator_class.sql b/src/ore_block_u64_8_256/operator_class.sql deleted file mode 100644 index d5de18021..000000000 --- a/src/ore_block_u64_8_256/operator_class.sql +++ /dev/null @@ -1,37 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql - - ---! @brief B-tree operator family for ORE block types ---! ---! Defines the operator family for creating B-tree indexes on ORE block types. ---! ---! @see eql_v2.ore_block_u64_8_256_operator_class -CREATE OPERATOR FAMILY eql_v2.ore_block_u64_8_256_operator_family USING btree; - ---! @brief B-tree operator class for ORE block encrypted values ---! ---! Defines the operator class required for creating B-tree indexes on columns ---! using the ore_block_u64_8_256 type. Enables range queries and ORDER BY on ---! ORE-encrypted data without decryption. ---! ---! Supports operators: <, <=, =, >=, > ---! Uses comparison function: compare_ore_block_u64_8_256_terms ---! ---! ---! @example ---! -- Would be used like (if enabled): ---! CREATE INDEX ON events USING btree ( ---! (encrypted_timestamp::jsonb->'ob')::eql_v2.ore_block_u64_8_256 ---! ); ---! ---! @see CREATE OPERATOR CLASS in PostgreSQL documentation ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE OPERATOR CLASS eql_v2.ore_block_u64_8_256_operator_class DEFAULT FOR TYPE eql_v2.ore_block_u64_8_256 USING btree FAMILY eql_v2.ore_block_u64_8_256_operator_family AS - OPERATOR 1 <, - OPERATOR 2 <=, - OPERATOR 3 =, - OPERATOR 4 >=, - OPERATOR 5 >, - FUNCTION 1 eql_v2.compare_ore_block_u64_8_256_terms(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256); diff --git a/src/ore_block_u64_8_256/operators.sql b/src/ore_block_u64_8_256/operators.sql deleted file mode 100644 index 35117cfe3..000000000 --- a/src/ore_block_u64_8_256/operators.sql +++ /dev/null @@ -1,211 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ore_block_u64_8_256/types.sql --- REQUIRE: src/ore_block_u64_8_256/functions.sql - ---! @brief Equality operator for ORE block types ---! @internal ---! ---! Implements the = operator for direct ORE block comparisons. ---! ---! @param a eql_v2.ore_block_u64_8_256 Left operand ---! @param b eql_v2.ore_block_u64_8_256 Right operand ---! @return Boolean True if ORE blocks are equal ---! ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v2.ore_block_u64_8_256_eq(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_block_u64_8_256_terms(a, b) = 0 -$$; - - - ---! @brief Not equal operator for ORE block types ---! @internal ---! ---! Implements the <> operator for direct ORE block comparisons. ---! ---! @param a eql_v2.ore_block_u64_8_256 Left operand ---! @param b eql_v2.ore_block_u64_8_256 Right operand ---! @return Boolean True if ORE blocks are not equal ---! ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v2.ore_block_u64_8_256_neq(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_block_u64_8_256_terms(a, b) <> 0 -$$; - - - ---! @brief Less than operator for ORE block types ---! @internal ---! ---! Implements the < operator for direct ORE block comparisons. ---! ---! @param a eql_v2.ore_block_u64_8_256 Left operand ---! @param b eql_v2.ore_block_u64_8_256 Right operand ---! @return Boolean True if left operand is less than right operand ---! ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v2.ore_block_u64_8_256_lt(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_block_u64_8_256_terms(a, b) = -1 -$$; - - - ---! @brief Less than or equal operator for ORE block types ---! @internal ---! ---! Implements the <= operator for direct ORE block comparisons. ---! ---! @param a eql_v2.ore_block_u64_8_256 Left operand ---! @param b eql_v2.ore_block_u64_8_256 Right operand ---! @return Boolean True if left operand is less than or equal to right operand ---! ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v2.ore_block_u64_8_256_lte(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_block_u64_8_256_terms(a, b) != 1 -$$; - - - ---! @brief Greater than operator for ORE block types ---! @internal ---! ---! Implements the > operator for direct ORE block comparisons. ---! ---! @param a eql_v2.ore_block_u64_8_256 Left operand ---! @param b eql_v2.ore_block_u64_8_256 Right operand ---! @return Boolean True if left operand is greater than right operand ---! ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v2.ore_block_u64_8_256_gt(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_block_u64_8_256_terms(a, b) = 1 -$$; - - - ---! @brief Greater than or equal operator for ORE block types ---! @internal ---! ---! Implements the >= operator for direct ORE block comparisons. ---! ---! @param a eql_v2.ore_block_u64_8_256 Left operand ---! @param b eql_v2.ore_block_u64_8_256 Right operand ---! @return Boolean True if left operand is greater than or equal to right operand ---! ---! @see eql_v2.compare_ore_block_u64_8_256_terms -CREATE FUNCTION eql_v2.ore_block_u64_8_256_gte(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -RETURNS boolean - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_block_u64_8_256_terms(a, b) != -1 -$$; - - - ---! @brief = operator for ORE block types ---! ---! COMMUTATOR is the operator itself: equality is symmetric. The clause ---! is required for a MERGES (mergejoinable) operator — without it the ---! planner raises "could not find commutator" the first time an ---! ore_block equality is used as a join qual (e.g. via the inlined ---! eql_v3.int4_ord_ore equality wrappers). -CREATE OPERATOR = ( - FUNCTION=eql_v2.ore_block_u64_8_256_eq, - LEFTARG=eql_v2.ore_block_u64_8_256, - RIGHTARG=eql_v2.ore_block_u64_8_256, - COMMUTATOR = =, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - - - ---! @brief <> operator for ORE block types ---! ---! COMMUTATOR is the operator itself: inequality is symmetric. Required ---! alongside the MERGES flag — see the = operator above. -CREATE OPERATOR <> ( - FUNCTION=eql_v2.ore_block_u64_8_256_neq, - LEFTARG=eql_v2.ore_block_u64_8_256, - RIGHTARG=eql_v2.ore_block_u64_8_256, - COMMUTATOR = <>, - NEGATOR = =, - RESTRICT = eqsel, - JOIN = eqjoinsel, - HASHES, - MERGES -); - - ---! @brief > operator for ORE block types -CREATE OPERATOR > ( - FUNCTION=eql_v2.ore_block_u64_8_256_gt, - LEFTARG=eql_v2.ore_block_u64_8_256, - RIGHTARG=eql_v2.ore_block_u64_8_256, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - - - ---! @brief < operator for ORE block types -CREATE OPERATOR < ( - FUNCTION=eql_v2.ore_block_u64_8_256_lt, - LEFTARG=eql_v2.ore_block_u64_8_256, - RIGHTARG=eql_v2.ore_block_u64_8_256, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - - - ---! @brief <= operator for ORE block types -CREATE OPERATOR <= ( - FUNCTION=eql_v2.ore_block_u64_8_256_lte, - LEFTARG=eql_v2.ore_block_u64_8_256, - RIGHTARG=eql_v2.ore_block_u64_8_256, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - - - ---! @brief >= operator for ORE block types -CREATE OPERATOR >= ( - FUNCTION=eql_v2.ore_block_u64_8_256_gte, - LEFTARG=eql_v2.ore_block_u64_8_256, - RIGHTARG=eql_v2.ore_block_u64_8_256, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); diff --git a/src/ore_block_u64_8_256/types.sql b/src/ore_block_u64_8_256/types.sql deleted file mode 100644 index 47ab04ab9..000000000 --- a/src/ore_block_u64_8_256/types.sql +++ /dev/null @@ -1,27 +0,0 @@ --- REQUIRE: src/schema.sql - - ---! @brief ORE block term type for Order-Revealing Encryption ---! ---! Composite type representing a single ORE (Order-Revealing Encryption) block term. ---! Stores encrypted data as bytea that enables range comparisons without decryption. ---! ---! @see eql_v2.ore_block_u64_8_256 ---! @see eql_v2.compare_ore_block_u64_8_256_term -CREATE TYPE eql_v2.ore_block_u64_8_256_term AS ( - bytes bytea -); - - ---! @brief ORE block index term type for range queries ---! ---! Composite type containing an array of ORE block terms. Used for encrypted ---! range queries via the 'ore' index type. The array is stored in the 'ob' field ---! of encrypted data payloads. ---! ---! @see eql_v2.add_search_config ---! @see eql_v2.compare_ore_block_u64_8_256_terms ---! @note This is a transient type used only during query execution -CREATE TYPE eql_v2.ore_block_u64_8_256 AS ( - terms eql_v2.ore_block_u64_8_256_term[] -); diff --git a/src/ore_cllw/functions.sql b/src/ore_cllw/functions.sql deleted file mode 100644 index 8228be817..000000000 --- a/src/ore_cllw/functions.sql +++ /dev/null @@ -1,283 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/common.sql --- REQUIRE: src/ore_cllw/types.sql --- REQUIRE: src/ste_vec/types.sql - - ---! @brief Extract CLLW ORE index term from a ste_vec entry ---! ---! Returns the CLLW ORE ciphertext from the `oc` field of an `sv` element. ---! `oc` is **only ever present on a `SteVecElement`** in the v2.3 payload ---! shape — never at the root of an `eql_v2_encrypted` column value — so the ---! type signature accepts `eql_v2.ste_vec_entry` directly. Callers must ---! extract first: `eql_v2.ore_cllw(col -> '')`. ---! ---! Inlinable single-statement SQL — the planner folds the body into the ---! calling query so the extractor disappears at planning time. Functional ---! btree index match on this extractor requires the `eql_v2.ore_cllw_ops` ---! opclass (installed automatically by the main / protect variants; absent ---! in the supabase variant). ---! ---! **Missing-`oc` semantics**: when the `oc` field is absent, returns a ---! SQL-level NULL (not a composite with NULL bytes). Btree's standard ---! NULL handling then filters those rows from range queries: they don't ---! match `WHERE ore_cllw(col) $1`, they sort at the NULLS LAST end ---! of `ORDER BY ore_cllw(col)`, and they never reach the comparator. ---! This avoids the btree FUNCTION 1 contract violation that ---! `(bytes => NULL)` would otherwise cause (`compare_ore_cllw_term` ---! must return non-NULL int for non-NULL composite inputs). ---! ---! Callers needing a loud RAISE on missing `oc` should check ---! `eql_v2.has_ore_cllw(entry)` first. ---! ---! @param entry eql_v2.ste_vec_entry STE-vec entry (extracted via `->`) ---! @return eql_v2.ore_cllw Composite carrying the CLLW ciphertext, or ---! NULL when the `oc` field is absent. ---! ---! @see eql_v2.has_ore_cllw ---! @see eql_v2.compare_ore_cllw_term ---! @see src/operators/->.sql -CREATE FUNCTION eql_v2.ore_cllw(entry eql_v2.ste_vec_entry) - RETURNS eql_v2.ore_cllw - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT CASE WHEN entry ->> 'oc' IS NULL THEN NULL - ELSE ROW(decode(entry ->> 'oc', 'hex'))::eql_v2.ore_cllw - END -$$; - - ---! @brief Extract CLLW ORE index term from raw jsonb (RHS parameter helper) ---! ---! Companion overload for `eql_v2.ore_cllw(eql_v2.ste_vec_entry)` that ---! accepts a raw `jsonb` value. Intended for the right-hand side of ---! comparisons where the caller binds a literal/parameter jsonb representing ---! a single ste_vec entry: `... < eql_v2.ore_cllw($1::jsonb)`. The (jsonb) ---! form skips the domain CHECK constraint so it works for ad-hoc test inputs ---! and for the GenericComparison case in `eql_v2.compare_ore_cllw_term`. ---! ---! Returns SQL-level NULL when the input lacks `oc`, matching the ---! `(ste_vec_entry)` overload's missing-`oc` semantics so a `WHERE ---! ore_cllw(col) < ore_cllw($1::jsonb)` with a malformed query needle ---! evaluates to no rows rather than indexing a NULL-bytes composite. ---! ---! @param val jsonb An object carrying an `oc` field ---! @return eql_v2.ore_cllw Composite carrying the CLLW ciphertext, or ---! NULL when the `oc` field is absent. -CREATE FUNCTION eql_v2.ore_cllw(val jsonb) - RETURNS eql_v2.ore_cllw - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT CASE WHEN val ->> 'oc' IS NULL THEN NULL - ELSE ROW(decode(val ->> 'oc', 'hex'))::eql_v2.ore_cllw - END -$$; - - ---! @brief Check if a ste_vec entry contains a CLLW ORE index term ---! ---! Tests whether the entry includes an `oc` field. Inlinable. ---! ---! @param entry eql_v2.ste_vec_entry STE-vec entry ---! @return Boolean True if `oc` field is present and non-null ---! ---! @see eql_v2.ore_cllw -CREATE FUNCTION eql_v2.has_ore_cllw(entry eql_v2.ste_vec_entry) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT entry ->> 'oc' IS NOT NULL -$$; - - ---! @brief Check if a raw jsonb value contains a CLLW ORE index term ---! ---! Companion to `eql_v2.has_ore_cllw(ste_vec_entry)` for raw jsonb inputs. ---! ---! @param val jsonb An object that may carry an `oc` field ---! @return Boolean True if `oc` field is present and non-null -CREATE FUNCTION eql_v2.has_ore_cllw(val jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT val ->> 'oc' IS NOT NULL -$$; - - ---! @brief CLLW per-byte comparison helper ---! @internal ---! ---! Byte-by-byte comparison implementing the CLLW order-revealing protocol. ---! Used by `eql_v2.compare_ore_cllw_term` for the within-prefix step. The ---! protocol: identify the index of the first differing byte across both ---! inputs; if `(y_byte + 1) == x_byte` modulo 256 at that index, then x > y; ---! otherwise x < y. Equal inputs return 0. ---! ---! Inputs MUST be the same length. The caller (`compare_ore_cllw_term`) ---! guarantees this by passing equal-length prefixes. ---! ---! @par Soft constant-time intent ---! Plpgsql is not a constant-time environment — the interpreter, `SUBSTRING`, ---! `get_byte`, and the SQL bytea representation all leak timing in ways we ---! can't control from here. Still, the loop deliberately walks every byte ---! (no `EXIT` on first difference) and the rotation check uses a bitmask ---! (`& 255`) instead of `% 256` so that what little timing structure plpgsql ---! does expose is independent of the position and value of the differing ---! byte. This is hardening intent, not a guarantee. ---! ---! Stays `LANGUAGE plpgsql` — the per-byte loop can't be expressed as a ---! single inlinable SQL expression. This is the architectural reason ORE ---! CLLW needs a custom operator class for index match, where OPE does not. ---! ---! @param a Bytea First CLLW ciphertext slice ---! @param b Bytea Second CLLW ciphertext slice ---! @return Integer -1, 0, or 1 ---! @throws Exception if inputs are different lengths ---! ---! @see eql_v2.compare_ore_cllw_term -CREATE FUNCTION eql_v2.compare_ore_cllw_term_bytes(a bytea, b bytea) -RETURNS int - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - len_a INT; - len_b INT; - i INT; - first_diff INT := 0; -BEGIN - - len_a := LENGTH(a); - len_b := LENGTH(b); - - IF len_a != len_b THEN - RAISE EXCEPTION 'ore_cllw index terms are not the same length'; - END IF; - - -- Walk every byte, even after a difference is found. Record only the - -- index of the first difference (1-based; 0 means "no difference"). - -- Avoids an early `EXIT` whose presence is itself a timing signal. - FOR i IN 1..len_a LOOP - IF first_diff = 0 AND get_byte(a, i - 1) != get_byte(b, i - 1) THEN - first_diff := i; - END IF; - END LOOP; - - IF first_diff = 0 THEN - RETURN 0; - END IF; - - -- Bitmask instead of `% 256` — the modulo's operand is a power of two - -- so the two are arithmetically equivalent, but `& 255` is a single - -- machine instruction with no division-related timing variance. - IF ((get_byte(b, first_diff - 1) + 1) & 255) = get_byte(a, first_diff - 1) THEN - RETURN 1; - ELSE - RETURN -1; - END IF; -END; -$$ LANGUAGE plpgsql; - - ---! @brief Variable-length CLLW ORE term comparison ---! @internal ---! ---! Three-way comparison of two CLLW ORE ciphertext terms of potentially ---! different lengths. Compares the shared prefix via the CLLW per-byte ---! protocol; on equal prefixes, the shorter input sorts first. ---! ---! Handles both numeric (Standard-mode 65-byte CLLW outputs from the u64 ---! variant) and string (variable-length CLLW outputs) by virtue of the ---! domain-tag byte being the first byte of `bytes`. A numeric/string pair ---! differs at byte 0 (`0x00` vs `0x01`), which the CLLW rule resolves ---! correctly to numeric < string. ---! ---! Stays `LANGUAGE plpgsql` because it dispatches to ---! `compare_ore_cllw_term_bytes`, which can't be inlined. ---! ---! @par Null handling — btree FUNCTION 1 contract ---! PostgreSQL's btree filters NULL composites at the row level, so this ---! function should never be called with `a IS NULL` or `b IS NULL` under ---! normal operation. The leading IS-NULL guard returns NULL defensively ---! to cover edge cases (e.g., a non-index `ORDER BY` or `WHERE` path ---! that bypasses the opclass). ---! ---! A composite that is non-NULL but whose `bytes` field is NULL is a ---! contract violation: btree expects FUNCTION 1 to return a non-NULL ---! integer for non-NULL composite inputs. The extractor overloads of ---! `eql_v2.ore_cllw` are designed to return SQL NULL (not `ROW(NULL)`) ---! when the source payload lacks `oc`, so a NULL-bytes composite should ---! only arise from a hand-crafted literal or a future field addition to ---! the composite type. Raise loudly to surface the bug instead of ---! producing silent misordering downstream. ---! ---! @param a eql_v2.ore_cllw First term ---! @param b eql_v2.ore_cllw Second term ---! @return Integer -1, 0, or 1; NULL if either composite is NULL ---! @throws Exception if either composite has a NULL `bytes` field ---! ---! @see eql_v2.compare_ore_cllw_term_bytes ---! @see eql_v2.compare_ore_cllw -CREATE FUNCTION eql_v2.compare_ore_cllw_term(a eql_v2.ore_cllw, b eql_v2.ore_cllw) -RETURNS int - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - len_a INT; - len_b INT; - common_len INT; - cmp_result INT; -BEGIN - -- Composite-level NULL: btree's null-handling layer filters these at - -- the row level under normal operation. Returning NULL covers - -- non-index code paths that might still reach here. - IF a IS NULL OR b IS NULL THEN - RETURN NULL; - END IF; - - -- Non-NULL composite with NULL bytes is a contract violation: btree's - -- FUNCTION 1 must return non-NULL int for non-NULL composite inputs. - -- The extractors return SQL NULL (not ROW(NULL)) on missing `oc`, so - -- reaching here means a hand-crafted literal or a regression in the - -- extractor body. Raise loudly rather than silently misorder. - IF a.bytes IS NULL OR b.bytes IS NULL THEN - RAISE EXCEPTION 'eql_v2.compare_ore_cllw_term: composite has NULL bytes field — extractor invariant violated. Check that the index expression uses eql_v2.ore_cllw(...) and not a hand-crafted ROW(NULL).'; - END IF; - - len_a := LENGTH(a.bytes); - len_b := LENGTH(b.bytes); - - IF len_a = 0 AND len_b = 0 THEN - RETURN 0; - ELSIF len_a = 0 THEN - RETURN -1; - ELSIF len_b = 0 THEN - RETURN 1; - END IF; - - IF len_a < len_b THEN - common_len := len_a; - ELSE - common_len := len_b; - END IF; - - cmp_result := eql_v2.compare_ore_cllw_term_bytes( - SUBSTRING(a.bytes FROM 1 FOR common_len), - SUBSTRING(b.bytes FROM 1 FOR common_len) - ); - - IF cmp_result = -1 THEN - RETURN -1; - ELSIF cmp_result = 1 THEN - RETURN 1; - END IF; - - -- Equal prefixes: shorter sorts first - IF len_a < len_b THEN - RETURN -1; - ELSIF len_a > len_b THEN - RETURN 1; - ELSE - RETURN 0; - END IF; -END; -$$ LANGUAGE plpgsql; diff --git a/src/ore_cllw/operator_class.sql b/src/ore_cllw/operator_class.sql deleted file mode 100644 index ea69212c1..000000000 --- a/src/ore_cllw/operator_class.sql +++ /dev/null @@ -1,51 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ore_cllw/types.sql --- REQUIRE: src/ore_cllw/functions.sql --- REQUIRE: src/ore_cllw/operators.sql - ---! @file src/ore_cllw/operator_class.sql ---! @brief Btree operator class on the `eql_v2.ore_cllw` composite type ---! ---! Registers the CLLW per-byte comparison operators as a btree opclass for ---! the `eql_v2.ore_cllw` composite type. With `DEFAULT FOR TYPE`, a functional ---! btree index on `eql_v2.ore_cllw(col)` (or any expression returning the ---! composite) automatically picks up this opclass — no annotation needed at ---! index creation time. ---! ---! Why this matters. After the consolidation in #219, ordered comparison on ---! sv-element values (via `eql_v2.ore_cllw(value -> ''::text)`) ---! has correct semantics through the operator backing functions (each ---! reduces to `compare_ore_cllw_term 0`), but PostgreSQL won't engage ---! a functional index for `ORDER BY ...` or `WHERE ... < $1` unless the ---! type has a registered btree opclass that the planner can structurally ---! match. Without this opclass, `field_order/*` queries on sv-element CLLW ---! columns fall back to seq scan + Top-N sort (measured 20s+ on 1M rows). ---! With it, the same queries become Index Scan + LIMIT — milliseconds. ---! ---! FUNCTION 1 is the three-way comparator that btree's internal sort uses ---! (returns -1 / 0 / +1). We point it at `compare_ore_cllw_term` directly: ---! that's plpgsql by design (the per-byte CLLW protocol needs iteration), ---! and btree calls it once per index entry pair during build / search — ---! not per-row in the outer query. ---! ---! @note Deliberately no operator family registration beyond the opclass ---! itself: no cross-type operators on `eql_v2.ore_cllw` × `jsonb`, no ---! hash support — see operators.sql for the rationale. ---! @note Excluded from the Supabase build variant (the build glob ---! `**/*operator_class.sql` strips operator classes for Supabase ---! compatibility). ---! ---! @see src/ore_cllw/operators.sql ---! @see src/ore_cllw/functions.sql - -CREATE OPERATOR FAMILY eql_v2.ore_cllw_ops USING btree; - -CREATE OPERATOR CLASS eql_v2.ore_cllw_ops - DEFAULT FOR TYPE eql_v2.ore_cllw - USING btree FAMILY eql_v2.ore_cllw_ops AS - OPERATOR 1 < (eql_v2.ore_cllw, eql_v2.ore_cllw), - OPERATOR 2 <= (eql_v2.ore_cllw, eql_v2.ore_cllw), - OPERATOR 3 = (eql_v2.ore_cllw, eql_v2.ore_cllw), - OPERATOR 4 >= (eql_v2.ore_cllw, eql_v2.ore_cllw), - OPERATOR 5 > (eql_v2.ore_cllw, eql_v2.ore_cllw), - FUNCTION 1 eql_v2.compare_ore_cllw_term(eql_v2.ore_cllw, eql_v2.ore_cllw); diff --git a/src/ore_cllw/operators.sql b/src/ore_cllw/operators.sql deleted file mode 100644 index 879c089ff..000000000 --- a/src/ore_cllw/operators.sql +++ /dev/null @@ -1,182 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ore_cllw/types.sql --- REQUIRE: src/ore_cllw/functions.sql - ---! @file src/ore_cllw/operators.sql ---! @brief Comparison operators on the `eql_v2.ore_cllw` composite type ---! ---! Same-type comparison operators backing the btree operator class on the ---! composite `eql_v2.ore_cllw` type. Each operator reduces to a single SELECT ---! over `eql_v2.compare_ore_cllw_term(a, b)`, which is the canonical CLLW ---! per-byte comparator (`y + 1 == x` mod 256). The operator wrappers are ---! inlinable `LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE` so the planner can ---! fold them into the calling query — that's what lets a functional btree ---! index on `eql_v2.ore_cllw(col)` engage for both `WHERE eql_v2.ore_cllw(col) ---! < eql_v2.ore_cllw($1)` and `ORDER BY eql_v2.ore_cllw(col)` shapes. ---! ---! The inner `eql_v2.compare_ore_cllw_term` is `LANGUAGE plpgsql` (it has a ---! per-byte loop) and is NOT inlined. That's fine for index *match* (the ---! planner only needs the outer operator function call to fold so the ---! predicate's expression tree matches the index's expression tree); only the ---! per-comparison cost is the plpgsql call overhead. That's the cost the ---! functional index avoids by walking the btree in order rather than calling ---! compare on every row. ---! ---! @note Deliberately no `HASHES` / `MERGES` flags on the operator ---! declarations. HASHES requires a registered hash function on the type ---! (the CLLW protocol gives ordering, not a sensible hashing); MERGES ---! requires an equivalent merge-joinable operator class on both sides. ---! ---! @see src/ore_cllw/operator_class.sql ---! @see src/ore_cllw/functions.sql - ---! @brief Equality operator backing function for `eql_v2.ore_cllw` ---! @internal ---! ---! @param a eql_v2.ore_cllw Left operand ---! @param b eql_v2.ore_cllw Right operand ---! @return boolean True if the CLLW terms compare equal ---! ---! @see eql_v2.compare_ore_cllw_term -CREATE FUNCTION eql_v2.ore_cllw_eq(a eql_v2.ore_cllw, b eql_v2.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_cllw_term(a, b) = 0 -$$; - ---! @brief Inequality operator backing function for `eql_v2.ore_cllw` ---! @internal ---! ---! @param a eql_v2.ore_cllw Left operand ---! @param b eql_v2.ore_cllw Right operand ---! @return boolean True if the CLLW terms compare unequal ---! ---! @see eql_v2.compare_ore_cllw_term -CREATE FUNCTION eql_v2.ore_cllw_neq(a eql_v2.ore_cllw, b eql_v2.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_cllw_term(a, b) <> 0 -$$; - ---! @brief Less-than operator backing function for `eql_v2.ore_cllw` ---! @internal ---! ---! @param a eql_v2.ore_cllw Left operand ---! @param b eql_v2.ore_cllw Right operand ---! @return boolean True if `a` orders before `b` ---! ---! @see eql_v2.compare_ore_cllw_term -CREATE FUNCTION eql_v2.ore_cllw_lt(a eql_v2.ore_cllw, b eql_v2.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_cllw_term(a, b) = -1 -$$; - ---! @brief Less-than-or-equal operator backing function for `eql_v2.ore_cllw` ---! @internal ---! ---! @param a eql_v2.ore_cllw Left operand ---! @param b eql_v2.ore_cllw Right operand ---! @return boolean True if `a` orders before or equal to `b` ---! ---! @see eql_v2.compare_ore_cllw_term -CREATE FUNCTION eql_v2.ore_cllw_lte(a eql_v2.ore_cllw, b eql_v2.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_cllw_term(a, b) <> 1 -$$; - ---! @brief Greater-than operator backing function for `eql_v2.ore_cllw` ---! @internal ---! ---! @param a eql_v2.ore_cllw Left operand ---! @param b eql_v2.ore_cllw Right operand ---! @return boolean True if `a` orders after `b` ---! ---! @see eql_v2.compare_ore_cllw_term -CREATE FUNCTION eql_v2.ore_cllw_gt(a eql_v2.ore_cllw, b eql_v2.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_cllw_term(a, b) = 1 -$$; - ---! @brief Greater-than-or-equal operator backing function for `eql_v2.ore_cllw` ---! @internal ---! ---! @param a eql_v2.ore_cllw Left operand ---! @param b eql_v2.ore_cllw Right operand ---! @return boolean True if `a` orders after or equal to `b` ---! ---! @see eql_v2.compare_ore_cllw_term -CREATE FUNCTION eql_v2.ore_cllw_gte(a eql_v2.ore_cllw, b eql_v2.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v2.compare_ore_cllw_term(a, b) <> -1 -$$; - - -CREATE OPERATOR = ( - FUNCTION = eql_v2.ore_cllw_eq, - LEFTARG = eql_v2.ore_cllw, - RIGHTARG = eql_v2.ore_cllw, - COMMUTATOR = =, - NEGATOR = <>, - RESTRICT = eqsel, - JOIN = eqjoinsel -); - -CREATE OPERATOR <> ( - FUNCTION = eql_v2.ore_cllw_neq, - LEFTARG = eql_v2.ore_cllw, - RIGHTARG = eql_v2.ore_cllw, - COMMUTATOR = <>, - NEGATOR = =, - RESTRICT = neqsel, - JOIN = neqjoinsel -); - -CREATE OPERATOR < ( - FUNCTION = eql_v2.ore_cllw_lt, - LEFTARG = eql_v2.ore_cllw, - RIGHTARG = eql_v2.ore_cllw, - COMMUTATOR = >, - NEGATOR = >=, - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - -CREATE OPERATOR <= ( - FUNCTION = eql_v2.ore_cllw_lte, - LEFTARG = eql_v2.ore_cllw, - RIGHTARG = eql_v2.ore_cllw, - COMMUTATOR = >=, - NEGATOR = >, - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - -CREATE OPERATOR > ( - FUNCTION = eql_v2.ore_cllw_gt, - LEFTARG = eql_v2.ore_cllw, - RIGHTARG = eql_v2.ore_cllw, - COMMUTATOR = <, - NEGATOR = <=, - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - -CREATE OPERATOR >= ( - FUNCTION = eql_v2.ore_cllw_gte, - LEFTARG = eql_v2.ore_cllw, - RIGHTARG = eql_v2.ore_cllw, - COMMUTATOR = <=, - NEGATOR = <, - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); diff --git a/src/ore_cllw/types.sql b/src/ore_cllw/types.sql deleted file mode 100644 index 45b5b6502..000000000 --- a/src/ore_cllw/types.sql +++ /dev/null @@ -1,24 +0,0 @@ --- REQUIRE: src/schema.sql - ---! @brief CLLW ORE index term type for STE-vec range queries ---! ---! Composite type for CLLW (Copyless Logarithmic Width) Order-Revealing ---! Encryption. The ciphertext is stored in the `oc` field of encrypted data ---! payloads (Standard-mode `ste_vec` elements). Used by `eql_v2.compare` and ---! the range operators (`<`, `<=`, `>`, `>=`) when the payload carries an ---! `oc` term. ---! ---! The wire-format `oc` value is a hex string with a leading domain-tag byte ---! (`0x00` numeric, `0x01` string) followed by the CLLW ciphertext. The ---! decoded `bytes` field on this composite carries the full byte string ---! including the tag — the comparator is variable-length capable, so numeric ---! and string values within the same column are ordered correctly: the ---! domain tag separates the two ranges (numeric < string) and the ---! within-domain comparison falls through to the CLLW per-byte protocol. ---! ---! @see eql_v2.add_search_config ---! @see eql_v2.compare_ore_cllw ---! @note This is a transient type used only during query execution -CREATE TYPE eql_v2.ore_cllw AS ( - bytes bytea -); diff --git a/src/schema.sql b/src/schema.sql deleted file mode 100644 index bbdfc7763..000000000 --- a/src/schema.sql +++ /dev/null @@ -1,17 +0,0 @@ ---! @file schema.sql ---! @brief EQL v2 schema creation ---! ---! Creates the eql_v2 schema which contains all Encrypt Query Language ---! functions, types, and tables. Drops existing schema if present to ---! support clean reinstallation. ---! ---! @warning DROP SCHEMA CASCADE will remove all objects in the schema ---! @note All EQL objects (functions, types, tables) reside in eql_v2 schema - ---! @brief Drop existing EQL v2 schema ---! @warning CASCADE will drop all dependent objects -DROP SCHEMA IF EXISTS eql_v2 CASCADE; - ---! @brief Create EQL v2 schema ---! @note All EQL functions and types will be created in this schema -CREATE SCHEMA eql_v2; diff --git a/src/ste_vec/eq_term.sql b/src/ste_vec/eq_term.sql deleted file mode 100644 index e44467531..000000000 --- a/src/ste_vec/eq_term.sql +++ /dev/null @@ -1,42 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/ste_vec/types.sql - ---! @file src/ste_vec/eq_term.sql ---! @brief XOR-aware equality term extractor for `eql_v2.ste_vec_entry` ---! ---! Returns the bytea representation of whichever deterministic term ---! the sv entry carries — `hm` (HMAC-256) for bool leaves / array ---! roots / object roots, or `oc` (CLLW ORE) for string / number ---! leaves. The two byte distributions are disjoint by construction ---! (different keys, different protocols), so byte equality on the ---! coalesce is unambiguous: equal terms imply equal plaintexts under ---! the same selector, and unequal terms imply different plaintexts ---! (or different protocols, which can't happen for a single ---! selector). ---! ---! This is the canonical equality extractor used by `=` and `<>` on ---! `eql_v2.ste_vec_entry` — see `src/operators/ste_vec_entry.sql`. ---! The recipe for field-level equality on encrypted JSON is: ---! ---! @example ---! -- Functional hash index covers both hm-bearing and oc-bearing selectors ---! CREATE INDEX ON users USING hash (eql_v2.eq_term(data -> '')); ---! -- Bare-form predicate matches via the inlined `=` on ste_vec_entry ---! SELECT * FROM users WHERE data -> '' = $1::eql_v2.ste_vec_entry; ---! ---! @param entry eql_v2.ste_vec_entry STE-vec entry (extracted via `->`) ---! @return bytea Decoded `hm` or `oc` bytes (NULL if entry is NULL). ---! ---! @note The XOR contract (each sv entry carries exactly one of `hm` ---! or `oc` — enforced by the `ste_vec_entry` DOMAIN CHECK) means ---! the coalesce always picks the one present term. ---! ---! @see eql_v2.hmac_256(eql_v2.ste_vec_entry) ---! @see eql_v2.ore_cllw(eql_v2.ste_vec_entry) ---! @see src/operators/ste_vec_entry.sql -CREATE FUNCTION eql_v2.eq_term(entry eql_v2.ste_vec_entry) - RETURNS bytea - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT decode(coalesce(entry ->> 'hm', entry ->> 'oc'), 'hex') -$$; diff --git a/src/ste_vec/functions.sql b/src/ste_vec/functions.sql deleted file mode 100644 index 93a2cd1af..000000000 --- a/src/ste_vec/functions.sql +++ /dev/null @@ -1,626 +0,0 @@ --- REQUIRE: src/schema.sql --- REQUIRE: src/encrypted/types.sql --- REQUIRE: src/encrypted/casts.sql --- REQUIRE: src/encrypted/functions.sql --- REQUIRE: src/hmac_256/functions.sql --- REQUIRE: src/hmac_256/compare.sql --- REQUIRE: src/ste_vec/types.sql --- REQUIRE: src/ore_cllw/types.sql --- REQUIRE: src/ore_cllw/functions.sql - - ---! @brief Extract STE vector index from JSONB payload ---! ---! Extracts the STE (Searchable Symmetric Encryption) vector from the 'sv' field ---! of an encrypted data payload. Returns an array of encrypted values used for ---! containment queries (@>, <@). If no 'sv' field exists, wraps the entire payload ---! as a single-element array. ---! ---! @param jsonb containing encrypted EQL payload ---! @return eql_v2_encrypted[] Array of encrypted STE vector elements ---! ---! @see eql_v2.ste_vec(eql_v2_encrypted) ---! @see eql_v2.ste_vec_contains -CREATE FUNCTION eql_v2.ste_vec(val jsonb) - RETURNS public.eql_v2_encrypted[] - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - sv jsonb; - ary public.eql_v2_encrypted[]; - BEGIN - - IF val ? 'sv' THEN - sv := val->'sv'; - ELSE - sv := jsonb_build_array(val); - END IF; - - SELECT array_agg(eql_v2.to_encrypted(elem)) - INTO ary - FROM jsonb_array_elements(sv) AS elem; - - RETURN ary; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract STE vector index from encrypted column value ---! ---! Extracts the STE vector from an encrypted column value by accessing its ---! underlying JSONB data field. Used for containment query operations. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return eql_v2_encrypted[] Array of encrypted STE vector elements ---! ---! @see eql_v2.ste_vec(jsonb) -CREATE FUNCTION eql_v2.ste_vec(val eql_v2_encrypted) - RETURNS public.eql_v2_encrypted[] - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN (SELECT eql_v2.ste_vec(val.data)); - END; -$$ LANGUAGE plpgsql; - ---! @brief Check if JSONB payload is a single-element STE vector ---! ---! Tests whether the encrypted data payload contains an 'sv' field with exactly ---! one element. Single-element STE vectors can be treated as regular encrypted values. ---! ---! @param jsonb containing encrypted EQL payload ---! @return Boolean True if 'sv' field exists with exactly one element ---! ---! @see eql_v2.to_ste_vec_value -CREATE FUNCTION eql_v2.is_ste_vec_value(val jsonb) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF val ? 'sv' THEN - RETURN jsonb_array_length(val->'sv') = 1; - END IF; - - RETURN false; - END; -$$ LANGUAGE plpgsql; - ---! @brief Check if encrypted column value is a single-element STE vector ---! ---! Tests whether an encrypted column value is a single-element STE vector ---! by checking its underlying JSONB data field. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return Boolean True if value is a single-element STE vector ---! ---! @see eql_v2.is_ste_vec_value(jsonb) -CREATE FUNCTION eql_v2.is_ste_vec_value(val eql_v2_encrypted) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.is_ste_vec_value(val.data); - END; -$$ LANGUAGE plpgsql; - ---! @brief Convert single-element STE vector to regular encrypted value ---! ---! Extracts the single element from a single-element STE vector and returns it ---! as a regular encrypted value, preserving metadata. If the input is not a ---! single-element STE vector, returns it unchanged. ---! ---! @param jsonb containing encrypted EQL payload ---! @return eql_v2_encrypted Regular encrypted value (unwrapped if single-element STE vector) ---! ---! @see eql_v2.is_ste_vec_value -CREATE FUNCTION eql_v2.to_ste_vec_value(val jsonb) - RETURNS eql_v2_encrypted - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - meta jsonb; - sv jsonb; - BEGIN - - IF val IS NULL THEN - RETURN NULL; - END IF; - - IF eql_v2.is_ste_vec_value(val) THEN - meta := eql_v2.meta_data(val); - sv := val->'sv'; - sv := sv[0]; - - RETURN eql_v2.to_encrypted(meta || sv); - END IF; - - RETURN eql_v2.to_encrypted(val); - END; -$$ LANGUAGE plpgsql; - ---! @brief Convert single-element STE vector to regular encrypted value (encrypted type) ---! ---! Converts an encrypted column value to a regular encrypted value by unwrapping ---! if it's a single-element STE vector. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return eql_v2_encrypted Regular encrypted value (unwrapped if single-element STE vector) ---! ---! @see eql_v2.to_ste_vec_value(jsonb) -CREATE FUNCTION eql_v2.to_ste_vec_value(val eql_v2_encrypted) - RETURNS eql_v2_encrypted - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN eql_v2.to_ste_vec_value(val.data); - END; -$$ LANGUAGE plpgsql; - ---! @brief Extract selector value from JSONB payload ---! ---! Extracts the selector ('s') field from an encrypted data payload. ---! Selectors are used to match STE vector elements during containment queries. ---! ---! @param jsonb containing encrypted EQL payload ---! @return Text The selector value ---! @throws Exception if 's' field is missing ---! ---! @see eql_v2.ste_vec_contains -CREATE FUNCTION eql_v2.selector(val jsonb) - RETURNS text - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF val IS NULL THEN - RETURN NULL; - END IF; - - IF val ? 's' THEN - RETURN val->>'s'; - END IF; - RAISE 'Expected a selector index (s) value in json: %', val; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract selector value from encrypted column value ---! @internal ---! ---! Internal convenience: unwraps the encrypted composite and delegates ---! to `eql_v2.selector(jsonb)`. Exists so the encrypted-selector ---! overloads of `eql_v2."->"` / `eql_v2."->>"` / `eql_v2.jsonb_path_*` ---! can dispatch without each having to spell out `(val).data` first. ---! Not part of the public API — callers should use ---! `eql_v2.selector(jsonb)` or `eql_v2.selector(eql_v2.ste_vec_entry)`. ---! ---! @param eql_v2_encrypted Encrypted column value (single-element form) ---! @return Text The selector value ---! ---! @see eql_v2.selector(jsonb) ---! @see eql_v2.selector(eql_v2.ste_vec_entry) -CREATE FUNCTION eql_v2._selector(val eql_v2_encrypted) - RETURNS text - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN (SELECT eql_v2.selector(val.data)); - END; -$$ LANGUAGE plpgsql; - - ---! @brief Extract selector value from a ste_vec entry ---! ---! Direct overload on the domain type. The DOMAIN's CHECK constraint ---! already guarantees `s` is present, so this is a simple field access. ---! ---! @param entry eql_v2.ste_vec_entry STE-vec entry ---! @return Text The selector value ---! ---! @see eql_v2.selector(jsonb) -CREATE FUNCTION eql_v2.selector(entry eql_v2.ste_vec_entry) - RETURNS text - LANGUAGE sql - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT entry ->> 's' -$$; - - - ---! @brief Check if JSONB payload is marked as an STE vector array ---! ---! Tests whether the encrypted data payload has the 'a' (array) flag set to true, ---! indicating it represents an array for STE vector operations. ---! ---! @param jsonb containing encrypted EQL payload ---! @return Boolean True if 'a' field is present and true ---! ---! @see eql_v2.ste_vec -CREATE FUNCTION eql_v2.is_ste_vec_array(val jsonb) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - IF val ? 'a' THEN - RETURN (val->>'a')::boolean; - END IF; - - RETURN false; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Check if encrypted column value is marked as an STE vector array ---! ---! Tests whether an encrypted column value has the array flag set by checking ---! its underlying JSONB data field. ---! ---! @param eql_v2_encrypted Encrypted column value ---! @return Boolean True if value is marked as an STE vector array ---! ---! @see eql_v2.is_ste_vec_array(jsonb) -CREATE FUNCTION eql_v2.is_ste_vec_array(val eql_v2_encrypted) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - BEGIN - RETURN (SELECT eql_v2.is_ste_vec_array(val.data)); - END; -$$ LANGUAGE plpgsql; - - - ---! @brief Extract full encrypted JSONB elements as array ---! ---! Extracts all JSONB elements from the STE vector including non-deterministic fields. ---! Use jsonb_array() instead for GIN indexing and containment queries. ---! ---! @param val jsonb containing encrypted EQL payload ---! @return jsonb[] Array of full JSONB elements ---! ---! @see eql_v2.jsonb_array -CREATE FUNCTION eql_v2.jsonb_array_from_array_elements(val jsonb) -RETURNS jsonb[] -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT CASE - WHEN val ? 'sv' THEN - ARRAY(SELECT elem FROM jsonb_array_elements(val->'sv') AS elem) - ELSE - ARRAY[val] - END; -$$; - - ---! @brief Extract full encrypted JSONB elements as array from encrypted column ---! ---! @param val eql_v2_encrypted Encrypted column value ---! @return jsonb[] Array of full JSONB elements ---! ---! @see eql_v2.jsonb_array_from_array_elements(jsonb) -CREATE FUNCTION eql_v2.jsonb_array_from_array_elements(val eql_v2_encrypted) -RETURNS jsonb[] -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array_from_array_elements(val.data); -$$; - - ---! @brief Extract deterministic fields as array for GIN indexing ---! ---! Extracts only deterministic search term fields (`s`, `hm`, `oc`, `op`) ---! from each STE vector element. Excludes non-deterministic ciphertext for ---! correct containment comparison using PostgreSQL's native `@>` operator. ---! ---! Field set: selector (`s`), HMAC equality (`hm`), ORE CLLW (`oc`, ---! Standard-mode), OPE CLLW (`op`, Compat-mode). The pre-2.3 fields ---! (`b3` / `ocf` / `ocv` / `opf` / `opv`) are no longer emitted — see U-004 ---! and U-006 in `docs/upgrading/v2.3.md`. ---! ---! @param val jsonb containing encrypted EQL payload ---! @return jsonb[] Array of JSONB elements with only deterministic fields ---! ---! @note Use this for GIN indexes and containment queries ---! @see eql_v2.jsonb_contains -CREATE FUNCTION eql_v2.jsonb_array(val jsonb) -RETURNS jsonb[] -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT ARRAY( - SELECT jsonb_object_agg(kv.key, kv.value) - FROM jsonb_array_elements( - CASE WHEN val ? 'sv' THEN val->'sv' ELSE jsonb_build_array(val) END - ) AS elem, - LATERAL jsonb_each(elem) AS kv(key, value) - WHERE kv.key IN ('s', 'hm', 'oc', 'op') - GROUP BY elem - ); -$$; - - ---! @brief Extract deterministic fields as array from encrypted column ---! ---! @param val eql_v2_encrypted Encrypted column value ---! @return jsonb[] Array of JSONB elements with only deterministic fields ---! ---! @see eql_v2.jsonb_array(jsonb) -CREATE FUNCTION eql_v2.jsonb_array(val eql_v2_encrypted) -RETURNS jsonb[] -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array(val.data); -$$; - - ---! @brief GIN-indexable JSONB containment check ---! ---! Checks if encrypted value 'a' contains all JSONB elements from 'b'. ---! Uses jsonb[] arrays internally for native PostgreSQL GIN index support. ---! ---! This function is designed for use with a GIN index on jsonb_array(column). ---! When combined with such an index, PostgreSQL can efficiently search large tables. ---! ---! @param a eql_v2_encrypted Container value (typically a table column) ---! @param b eql_v2_encrypted Value to search for ---! @return Boolean True if a contains all elements of b ---! ---! @example ---! -- Create GIN index for efficient containment queries ---! CREATE INDEX idx ON mytable USING GIN (eql_v2.jsonb_array(encrypted_col)); ---! ---! -- Query using the helper function ---! SELECT * FROM mytable WHERE eql_v2.jsonb_contains(encrypted_col, search_value); ---! ---! @see eql_v2.jsonb_array -CREATE FUNCTION eql_v2.jsonb_contains(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array(a) @> eql_v2.jsonb_array(b); -$$; - - ---! @brief GIN-indexable JSONB containment check (encrypted, jsonb) ---! ---! Checks if encrypted value 'a' contains all JSONB elements from jsonb value 'b'. ---! Uses jsonb[] arrays internally for native PostgreSQL GIN index support. ---! ---! @param a eql_v2_encrypted Container value (typically a table column) ---! @param b jsonb JSONB value to search for ---! @return Boolean True if a contains all elements of b ---! ---! @see eql_v2.jsonb_array ---! @see eql_v2.jsonb_contains(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.jsonb_contains(a eql_v2_encrypted, b jsonb) -RETURNS boolean -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array(a) @> eql_v2.jsonb_array(b); -$$; - - ---! @brief GIN-indexable JSONB containment check (jsonb, encrypted) ---! ---! Checks if jsonb value 'a' contains all JSONB elements from encrypted value 'b'. ---! Uses jsonb[] arrays internally for native PostgreSQL GIN index support. ---! ---! @param a jsonb Container JSONB value ---! @param b eql_v2_encrypted Encrypted value to search for ---! @return Boolean True if a contains all elements of b ---! ---! @see eql_v2.jsonb_array ---! @see eql_v2.jsonb_contains(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.jsonb_contains(a jsonb, b eql_v2_encrypted) -RETURNS boolean -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array(a) @> eql_v2.jsonb_array(b); -$$; - - ---! @brief GIN-indexable JSONB "is contained by" check ---! ---! Checks if all JSONB elements from 'a' are contained in 'b'. ---! Uses jsonb[] arrays internally for native PostgreSQL GIN index support. ---! ---! @param a eql_v2_encrypted Value to check (typically a table column) ---! @param b eql_v2_encrypted Container value ---! @return Boolean True if all elements of a are contained in b ---! ---! @see eql_v2.jsonb_array ---! @see eql_v2.jsonb_contains -CREATE FUNCTION eql_v2.jsonb_contained_by(a eql_v2_encrypted, b eql_v2_encrypted) -RETURNS boolean -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array(a) <@ eql_v2.jsonb_array(b); -$$; - - ---! @brief GIN-indexable JSONB "is contained by" check (encrypted, jsonb) ---! ---! Checks if all JSONB elements from encrypted value 'a' are contained in jsonb value 'b'. ---! Uses jsonb[] arrays internally for native PostgreSQL GIN index support. ---! ---! @param a eql_v2_encrypted Value to check (typically a table column) ---! @param b jsonb Container JSONB value ---! @return Boolean True if all elements of a are contained in b ---! ---! @see eql_v2.jsonb_array ---! @see eql_v2.jsonb_contained_by(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.jsonb_contained_by(a eql_v2_encrypted, b jsonb) -RETURNS boolean -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array(a) <@ eql_v2.jsonb_array(b); -$$; - - ---! @brief GIN-indexable JSONB "is contained by" check (jsonb, encrypted) ---! ---! Checks if all JSONB elements from jsonb value 'a' are contained in encrypted value 'b'. ---! Uses jsonb[] arrays internally for native PostgreSQL GIN index support. ---! ---! @param a jsonb Value to check ---! @param b eql_v2_encrypted Container encrypted value ---! @return Boolean True if all elements of a are contained in b ---! ---! @see eql_v2.jsonb_array ---! @see eql_v2.jsonb_contained_by(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.jsonb_contained_by(a jsonb, b eql_v2_encrypted) -RETURNS boolean -IMMUTABLE STRICT PARALLEL SAFE -LANGUAGE SQL -AS $$ - SELECT eql_v2.jsonb_array(a) <@ eql_v2.jsonb_array(b); -$$; - - ---! @brief Check if STE vector array contains a specific encrypted element ---! ---! Tests whether any element in the STE vector array 'a' contains the encrypted value 'b'. ---! Matching requires both the selector and encrypted value to be equal. ---! Used internally by ste_vec_contains(encrypted, encrypted) for array containment checks. ---! ---! @param eql_v2_encrypted[] STE vector array to search within ---! @param eql_v2_encrypted Encrypted element to search for ---! @return Boolean True if b is found in any element of a ---! ---! @note Compares both selector and encrypted value for match ---! ---! @see eql_v2.selector ---! @see eql_v2.ste_vec_contains(eql_v2_encrypted, eql_v2_encrypted) -CREATE FUNCTION eql_v2.ste_vec_contains(a public.eql_v2_encrypted[], b eql_v2_encrypted) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - result boolean; - _a public.eql_v2_encrypted; - BEGIN - - result := false; - - FOR idx IN 1..array_length(a, 1) LOOP - _a := a[idx]; - -- Element-level match for ste_vec entries. - -- - -- Per the v2.3 sv-element contract (encoded in - -- `docs/reference/schema/eql-payload-v2.3.schema.json` and the - -- `eql_v2.ste_vec_entry` DOMAIN), each entry carries **exactly - -- one** of: - -- - `hm` — HMAC-256 for boolean leaves and for the placeholder - -- entries that represent array / object roots. - -- - `oc` — CLLW ORE for string and number leaves. - -- Both terms are deterministic for the same plaintext at the same - -- selector under the same workspace, so either one serves as the - -- equality discriminator. A selector configures the leaf's role - -- (eq / ordered), and the role determines which term is emitted — - -- two sv entries with the same selector therefore always carry - -- the same term type. - -- - -- The selector check is a fast-path gate so we don't compare - -- terms across mismatched fields. Once selectors match, exactly - -- one of the two CASE branches fires (XOR contract above). - -- - -- The `ELSE false` arm covers the malformed case (entry carries - -- neither term, or only one side has the term for a given role). - -- That's a data error rather than a normal containment result, - -- but returning false is safer than raising mid-array-scan. - result := result OR ( - eql_v2._selector(_a) = eql_v2._selector(b) AND - CASE - WHEN eql_v2.has_hmac_256(_a) AND eql_v2.has_hmac_256(b) THEN - eql_v2.compare_hmac_256(_a, b) = 0 - WHEN eql_v2.has_ore_cllw((_a).data) AND eql_v2.has_ore_cllw((b).data) THEN - eql_v2.compare_ore_cllw_term( - eql_v2.ore_cllw((_a).data), - eql_v2.ore_cllw((b).data) - ) = 0 - ELSE false - END - ); - - -- Short-circuit once a match is found. Without this we still walk - -- the rest of the sv array, which on a 100-element document means - -- 99 wasted selector + extractor calls per row. - EXIT WHEN result; - END LOOP; - - RETURN result; - END; -$$ LANGUAGE plpgsql; - - ---! @brief Check if encrypted value 'a' contains all elements of encrypted value 'b' ---! ---! Performs STE vector containment comparison between two encrypted values. ---! Returns true if all elements in b's STE vector are found in a's STE vector. ---! Used internally by the @> containment operator for searchable encryption. ---! ---! @param a eql_v2_encrypted First encrypted value (container) ---! @param b eql_v2_encrypted Second encrypted value (elements to find) ---! @return Boolean True if all elements of b are contained in a ---! ---! @note Empty b is always contained in any a ---! @note Each element of b must match both selector and value in a ---! ---! @see eql_v2.ste_vec ---! @see eql_v2.ste_vec_contains(eql_v2_encrypted[], eql_v2_encrypted) ---! @see eql_v2."@>" -CREATE FUNCTION eql_v2.ste_vec_contains(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean - IMMUTABLE STRICT PARALLEL SAFE - SET search_path = pg_catalog, extensions, public -AS $$ - DECLARE - result boolean; - sv_a public.eql_v2_encrypted[]; - sv_b public.eql_v2_encrypted[]; - _b public.eql_v2_encrypted; - BEGIN - - -- jsonb arrays of ste_vec encrypted values - sv_a := eql_v2.ste_vec(a); - sv_b := eql_v2.ste_vec(b); - - -- an empty b is always contained in a - IF array_length(sv_b, 1) IS NULL THEN - RETURN true; - END IF; - - IF array_length(sv_a, 1) IS NULL THEN - RETURN false; - END IF; - - result := true; - - -- for each element of b check if it is in a - FOR idx IN 1..array_length(sv_b, 1) LOOP - _b := sv_b[idx]; - result := result AND eql_v2.ste_vec_contains(sv_a, _b); - END LOOP; - - RETURN result; - END; -$$ LANGUAGE plpgsql; diff --git a/src/ste_vec/types.sql b/src/ste_vec/types.sql deleted file mode 100644 index 005abf58e..000000000 --- a/src/ste_vec/types.sql +++ /dev/null @@ -1,154 +0,0 @@ --- REQUIRE: src/schema.sql - ---! @file src/ste_vec/types.sql ---! @brief Domain type for individual STE-vec entries ---! ---! Defines `eql_v2.ste_vec_entry` as a DOMAIN over `jsonb` constrained to the ---! shape of a single element inside an `sv` array — a JSON object that ---! carries at minimum a selector field (`s`). This is the type returned by ---! the `->` operator on `eql_v2_encrypted` (a single sv element extracted by ---! selector) and the type accepted by sv-element extractors such as ---! `eql_v2.ore_cllw(eql_v2.ste_vec_entry)` and ---! `eql_v2.hmac_256(eql_v2.ste_vec_entry)`. ---! ---! Why a separate type. Before #219, the `(eql_v2_encrypted)` overloads of ---! sv-element extractors read fields like `oc` off the root `data` jsonb, ---! which is misleading: a root `EncryptedPayload` or `SteVecPayload` (the ---! shapes that an actual `eql_v2_encrypted` column value carries) never has ---! `oc` at the root. The previous pattern only worked because the `->` ---! operator merged ste-vec entry fields into a fake root-shaped payload ---! before the extractor ran. This domain type makes the distinction ---! explicit: `eql_v2_encrypted` is the root shape; `eql_v2.ste_vec_entry` ---! is the per-entry shape; extractors are typed accordingly. ---! ---! @note The CHECK constraint reflects the cipherstash-suite emission ---! contract: ---! - `s` (selector — column-name HMAC) and `c` (ciphertext) are ---! emitted on every sv element. ---! - Each sv element carries **exactly one** of `hm` (HMAC-256, for ---! hash-equality queries) or `oc` (CLLW ORE, for ordered queries) ---! — they are mutually exclusive. A given selector / field is ---! configured for one mode or the other; the crypto layer emits ---! the corresponding term and only that term. ---! Other fields (`a` for array marker, etc.) are allowed but not ---! required. ---! ---! @see src/operators/->.sql ---! @see src/ore_cllw/functions.sql ---! @see src/hmac_256/functions.sql -CREATE DOMAIN eql_v2.ste_vec_entry AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 's' - AND VALUE ? 'c' - AND (VALUE ? 'hm') <> (VALUE ? 'oc') - ); - - ---! @brief Domain type for an STE-vec containment needle ---! ---! `eql_v2.stevec_query` is a query-shaped sv payload: a top-level ---! `{"sv": [...]}` object whose elements carry selector + index ---! terms but **never** a ciphertext (`c`) field. Containment (`@>`) ---! against an `eql_v2_encrypted` column is structurally typed ---! through this domain so the call site reads as "match against an ---! sv query", not "compare two encrypted values". ---! ---! Compared to `eql_v2.ste_vec_entry` (single sv element with `s`, ---! `c`, and `hm` XOR `oc`), `stevec_query` is the wrapping ---! `{"sv": [...]}` payload: it forbids `c` on every element but ---! otherwise keeps the same per-element contract — each element must ---! carry a selector `s` and exactly one deterministic term (`hm` XOR ---! `oc`). This mirrors the `SteVecQueryElement` JSON schema and stops ---! selector-only needles (e.g. `{"sv":[{"s":"x"}]}`) from casting and ---! then matching every row through the bare `jsonb @>` implementation. ---! The implementation of `ste_vec_contains` ignores `c` either way, ---! but typing the needle as `stevec_query` documents the contract at ---! the API surface. ---! ---! @note Constructing a `stevec_query` literal from inline JSON works ---! via the standard DOMAIN cast: ---! `'{"sv":[{"s":"","hm":""}]}'::eql_v2.stevec_query` ---! Casting an `eql_v2_encrypted` value strips `c` fields from ---! each sv element — see `eql_v2.to_stevec_query`. ---! ---! @see eql_v2.to_stevec_query ---! @see src/operators/@>.sql -CREATE DOMAIN eql_v2.stevec_query AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'sv' - AND jsonb_typeof(VALUE -> 'sv') = 'array' - -- No element may carry a ciphertext (`c`) — this is a query, not a value. - AND NOT jsonb_path_exists(VALUE, '$.sv[*] ? (exists(@.c))'::jsonpath) - -- Every element must carry a selector (`s`) ... - AND NOT jsonb_path_exists(VALUE, '$.sv[*] ? (!exists(@.s))'::jsonpath) - -- ... and exactly one deterministic term — `hm` XOR `oc` — matching - -- the `ste_vec_entry` emission contract and the `SteVecQueryElement` - -- JSON schema. Rejects selector-only needles that would otherwise - -- cast and then match every row via the bare `jsonb @>` body. - AND NOT jsonb_path_exists(VALUE, '$.sv[*] ? (exists(@.hm) && exists(@.oc))'::jsonpath) - AND NOT jsonb_path_exists(VALUE, '$.sv[*] ? (!exists(@.hm) && !exists(@.oc))'::jsonpath) - ); - - ---! @brief Convert an `eql_v2_encrypted` to a `stevec_query` needle ---! ---! Normalises each sv element down to the matching-relevant fields: ---! `s` (selector) plus exactly one of `hm` / `oc`. Other fields ---! (`c` ciphertext, `a` array marker, `i`/`v` envelope metadata, anything ---! else cipherstash-client might emit) are stripped. This is the ---! canonical needle shape for `@>` containment — matching the contract ---! that containment compares by selector + deterministic term and ---! ignores everything else. ---! ---! Designed for use as a functional GIN index expression: a single ---! `GIN (eql_v2.to_stevec_query(col)::jsonb jsonb_path_ops)` index ---! covers containment queries against any selector (both hm-bearing ---! and oc-bearing — XOR-aware), and the typed `@>` overloads inline ---! to a native `jsonb @>` on the same expression so the planner ---! engages Bitmap Index Scan structurally. ---! ---! @param e eql_v2_encrypted Source encrypted payload ---! @return eql_v2.stevec_query Query-shaped needle, sv elements ---! normalised to `{s, hm}` or `{s, oc}`. ---! ---! @example ---! -- Functional GIN index — canonical containment recipe ---! CREATE INDEX ON users USING gin ( ---! eql_v2.to_stevec_query(encrypted_doc)::jsonb jsonb_path_ops ---! ); ---! ---! -- Cross-row containment ---! SELECT a.* ---! FROM docs a, docs b ---! WHERE a.encrypted_doc @> b.encrypted_doc::eql_v2.stevec_query ---! AND b.id = 42; ---! ---! @see eql_v2.stevec_query ---! @see eql_v2."@>"(eql_v2_encrypted, eql_v2.stevec_query) -CREATE FUNCTION eql_v2.to_stevec_query(e eql_v2_encrypted) - RETURNS eql_v2.stevec_query - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT jsonb_build_object( - 'sv', - coalesce( - (SELECT jsonb_agg( - jsonb_strip_nulls( - jsonb_build_object( - 's', elem -> 's', - 'hm', elem -> 'hm', - 'oc', elem -> 'oc' - ) - ) - ) - FROM jsonb_array_elements((e).data -> 'sv') AS elem), - '[]'::jsonb - ) - )::eql_v2.stevec_query -$$; - -CREATE CAST (eql_v2_encrypted AS eql_v2.stevec_query) - WITH FUNCTION eql_v2.to_stevec_query - AS ASSIGNMENT; diff --git a/src/version.template b/src/version.template deleted file mode 100644 index dc778e128..000000000 --- a/src/version.template +++ /dev/null @@ -1,32 +0,0 @@ --- AUTOMATICALLY GENERATED FILE --- Source is version-template.sql --- REQUIRE: src/schema.sql - -DROP FUNCTION IF EXISTS eql_v2.version(); - ---! @file version.sql ---! @brief EQL version reporting ---! ---! This file is auto-generated from version.template during build. ---! The version string placeholder is replaced with the actual release version. - ---! @brief Get EQL library version string ---! ---! Returns the version string for the installed EQL library. ---! This value is set at build time from the project version. ---! ---! @return text Version string (e.g., "2.1.0" or "DEV" for development builds) ---! ---! @note Auto-generated during build from version.template ---! ---! @example ---! -- Check installed EQL version ---! SELECT eql_v2.version(); ---! -- Returns: '2.1.0' -CREATE FUNCTION eql_v2.version() - RETURNS text - IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT '$RELEASE_VERSION'; -$$ LANGUAGE SQL; - From a020cf718f8de3af7a9390a38c568a6b4bd79695 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 15:28:53 +1000 Subject: [PATCH 326/599] build: drop v2 uninstallers/pinning, repoint reset+splinter+gates to v3 canonical artifact --- tasks/pin_search_path.sql | 364 -------------------------------- tasks/release/preview.sh | 4 +- tasks/reset.sql | 7 +- tasks/test/clean_install_v3.sh | 6 +- tasks/test/self_contained_v3.sh | 8 +- tasks/test/splinter.sh | 83 ++------ tasks/uninstall-protect.sql | 2 - tasks/uninstall.sql | 17 -- 8 files changed, 31 insertions(+), 460 deletions(-) delete mode 100644 tasks/pin_search_path.sql delete mode 100644 tasks/uninstall-protect.sql delete mode 100644 tasks/uninstall.sql diff --git a/tasks/pin_search_path.sql b/tasks/pin_search_path.sql deleted file mode 100644 index bfbd702c7..000000000 --- a/tasks/pin_search_path.sql +++ /dev/null @@ -1,364 +0,0 @@ ---! @file pin_search_path.sql ---! @brief Post-install: pin search_path on every eql_v2.* and eql_v3.* function ---! ---! This file is appended verbatim by `tasks/build.sh` to the end of every ---! release variant (main, supabase, protect/stack), AFTER all `src/**/*.sql` ---! files have been concatenated. It lives outside `src/` so it stays out of ---! the dependency graph entirely — each variant has a different leaf set ---! (supabase excludes `**/*operator_class.sql`; protect excludes `src/config/*` ---! and `src/encryptindex/*`), and threading REQUIREs to be ordered last in ---! every variant simultaneously is fragile. ---! ---! Iterates over functions in the `eql_v2` schema and applies a fixed ---! `search_path` via `ALTER FUNCTION ... SET search_path = ...`. This is the ---! only way to satisfy Supabase splinter's `function_search_path_mutable` ---! lint, which checks `pg_proc.proconfig` directly. ---! ---! @note A SET clause disables PostgreSQL's SQL-function inlining (see ---! inline_function() in src/backend/optimizer/util/clauses.c). For most ---! eql_v2 helpers this is irrelevant. The exceptions are wrappers that ---! must inline to expose `eql_v2.jsonb_array(col) @> ...` to the planner ---! so the GIN index on `jsonb_array(e)` can be matched. Those are ---! deliberately skipped here and allowlisted in `tasks/test/splinter.sh`. ---! ---! @see tasks/test/splinter.sh ---! @see tasks/build.sh - -DO $$ -DECLARE - fn_oid oid; - inline_critical_oids oid[]; - enc_oid oid; - jsonb_oid oid; - text_oid oid; - entry_oid oid; -BEGIN - -- Resolve type oids without depending on caller search_path. The encrypted - -- composite type is created in `public`; jsonb / text are in `pg_catalog`; - -- the ste_vec_entry DOMAIN lives in `eql_v2`. - SELECT t.oid INTO enc_oid - FROM pg_catalog.pg_type t - JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'public' AND t.typname = 'eql_v2_encrypted'; - - IF enc_oid IS NULL THEN - RAISE EXCEPTION 'pin_search_path: type public.eql_v2_encrypted not found — ' - 'this script must run after all EQL src/**/*.sql files have been loaded'; - END IF; - - SELECT t.oid INTO jsonb_oid - FROM pg_catalog.pg_type t - JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'pg_catalog' AND t.typname = 'jsonb'; - - IF jsonb_oid IS NULL THEN - RAISE EXCEPTION 'pin_search_path: type pg_catalog.jsonb not found'; - END IF; - - SELECT t.oid INTO text_oid - FROM pg_catalog.pg_type t - JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'pg_catalog' AND t.typname = 'text'; - - IF text_oid IS NULL THEN - RAISE EXCEPTION 'pin_search_path: type pg_catalog.text not found'; - END IF; - - SELECT t.oid INTO entry_oid - FROM pg_catalog.pg_type t - JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'eql_v2' AND t.typname = 'ste_vec_entry'; - - IF entry_oid IS NULL THEN - RAISE EXCEPTION 'pin_search_path: type eql_v2.ste_vec_entry not found'; - END IF; - - -- Wrappers that must remain inlinable for functional-index matching. - -- Verified empirically: with SET, EXPLAIN drops to Seq Scan; without, - -- it uses Bitmap Index Scan / Index Scan. - -- - -- Phase 1 operator inlining (#193): `=`, `<>`, `~~`, `~~*`, `@>`, `<@` - -- on `eql_v2_encrypted` and the cross-type (encrypted, jsonb) / - -- (jsonb, encrypted) overloads emitted by ORMs that bind parameters - -- as jsonb (Drizzle, PostgREST, encryptedSupabase). The implementation - -- functions reduce to `extractor(a) op extractor(b)` and must inline - -- to match the documented functional indexes - -- (`eql_v2.hmac_256(col)`, `eql_v2.bloom_filter(col)`, - -- `eql_v2.ste_vec(col)`). - -- - -- For `~~` / `~~*` the planner must inline two layers — the operator - -- function `eql_v2."~~"` and the helper `eql_v2.like` / `eql_v2.ilike` - -- — to reach the canonical `eql_v2.bloom_filter(a) @> eql_v2.bloom_filter(b)` - -- form that the documented functional index matches. The helpers are - -- allowlisted alongside the operator wrappers below; pinning either - -- layer breaks the chain and reverts to Seq Scan. - -- - -- Note: pg_proc.proargtypes is an oidvector with 0-based bounds, so we - -- compare elements individually rather than using array equality (which - -- requires matching bounds, not just contents). - SELECT pg_catalog.array_agg(p.oid) INTO inline_critical_oids - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE ( - n.nspname = 'eql_v2' - AND ( - -- Same-type (encrypted, encrypted) operators that must inline. - -- `like`/`ilike` are the SQL helpers that `~~`/`~~*` delegate to; - -- both layers must inline to reach `bloom_filter(a) @> bloom_filter(b)`. - -- `<`, `<=`, `>`, `>=` inline to `ore_block_u64_8_256(a) op - -- ore_block_u64_8_256(b)`; they must reach the functional ORE index - -- expression `eql_v2.ore_block_u64_8_256(col)` for bare range - -- queries to engage Index Scan. - (p.pronargs = 2 - AND p.proname IN ('=', '<>', '<', '<=', '>', '>=', - '~~', '~~*', '@>', '<@', - 'jsonb_contains', 'jsonb_contained_by', - 'like', 'ilike') - AND p.proargtypes[0] = enc_oid AND p.proargtypes[1] = enc_oid) - -- Cross-type (encrypted, jsonb). - OR (p.pronargs = 2 - AND p.proname IN ('=', '<>', '<', '<=', '>', '>=', - '~~', '~~*', - 'jsonb_contains', 'jsonb_contained_by') - AND p.proargtypes[0] = enc_oid AND p.proargtypes[1] = jsonb_oid) - -- Cross-type (jsonb, encrypted). - OR (p.pronargs = 2 - AND p.proname IN ('=', '<>', '<', '<=', '>', '>=', - '~~', '~~*', - 'jsonb_contains', 'jsonb_contained_by') - AND p.proargtypes[0] = jsonb_oid AND p.proargtypes[1] = enc_oid) - -- Root-level HMAC extractor (#205): all 1-arg overloads are now - -- inlinable SQL. Must stay unpinned so the planner can fold extractor - -- calls inside the inlined equality operator bodies into the calling - -- query, preserving the functional-index match. - OR (p.pronargs = 1 - AND p.proname = 'hmac_256' - AND (p.proargtypes[0] = enc_oid OR p.proargtypes[0] = jsonb_oid)) - -- Field-level JSONB extractors (#205): inlinable SQL replacements for - -- the previous plpgsql bodies. Inlining lets the planner fold the - -- `jsonb_array_elements(...) WHERE elem->>'s' = selector` body into - -- the calling query, eliminating per-row function call overhead on - -- large ste_vec scans. - OR (p.pronargs = 2 - AND p.proname IN ('jsonb_path_query', - 'jsonb_path_query_first', - 'jsonb_path_exists')) - -- Inner ORE-block comparison helpers backing the `<`, `<=`, `>`, `>=` - -- operators on `eql_v2.ore_block_u64_8_256`. The outer operators on - -- `eql_v2_encrypted` inline to `ore_block(a) ore_block(b)`, and - -- PG only carries the inlined form through to index matching if the - -- inner operator function is also inlinable (no SET, IMMUTABLE). - -- Pinning these would prevent the planner from structurally matching - -- predicates against a functional `eql_v2.ore_block_u64_8_256(col)` - -- index. The inner functions are deterministic comparisons of - -- composite type bytes, declared IMMUTABLE STRICT PARALLEL SAFE. - OR (p.pronargs = 2 - AND p.proname IN ('ore_block_u64_8_256_eq', 'ore_block_u64_8_256_neq', - 'ore_block_u64_8_256_lt', 'ore_block_u64_8_256_lte', - 'ore_block_u64_8_256_gt', 'ore_block_u64_8_256_gte')) - -- Hash operator class FUNCTION 1: called once per row by HashAggregate, - -- hash joins, DISTINCT. Inlinable SQL avoids the per-row plpgsql - -- interpreter overhead — without this, `GROUP BY value` on - -- `eql_v2_encrypted` at 1M rows degrades super-linearly because the - -- plpgsql cost compounds with HashAggregate work_mem spillage. - OR (p.pronargs = 1 - AND p.proname = 'hash_encrypted' - AND p.proargtypes[0] = enc_oid) - -- Consolidated ORE-CLLW extractor (U-006). Inlinable SQL — pinning - -- would silently undo it and prevent the planner from folding - -- `eql_v2.ore_cllw(col)` calls into the calling query. The - -- `compare_ore_cllw_term` comparator stays plpgsql by design (per-byte - -- protocol can't be expressed as a single inlinable SELECT), so it is - -- NOT on this list. The (jsonb) form is a RHS-parameter helper for - -- comparisons against literal jsonb; the (eql_v2.ste_vec_entry) form - -- is the typed extractor for the result of `col -> ''`. - OR (p.pronargs = 1 - AND p.proname IN ('ore_cllw', 'has_ore_cllw') - AND (p.proargtypes[0] = jsonb_oid OR p.proargtypes[0] = entry_oid)) - -- Typed HMAC extractor on a ste_vec entry (#219 strict separation). - -- Same rationale as `ore_cllw(ste_vec_entry)` — must inline so - -- `eql_v2.hmac_256(col -> 'sel')` folds into the calling query and - -- matches a functional hash index built on the same expression. - OR (p.pronargs = 1 - AND p.proname IN ('hmac_256', 'has_hmac_256', 'selector') - AND p.proargtypes[0] = entry_oid) - -- `eql_v2.ste_vec_entry × eql_v2.ste_vec_entry` operators (#219). - -- Inline to `hmac_256(a) = hmac_256(b)` (equality) or - -- `ore_cllw(a) ore_cllw(b)` (ordering); both chains must remain - -- unpinned for functional-index match through extractor form. - OR (p.pronargs = 2 - AND p.proname IN ('=', '<>', '<', '<=', '>', '>=', - 'eq', 'neq', 'lt', 'lte', 'gt', 'gte') - AND p.proargtypes[0] = entry_oid AND p.proargtypes[1] = entry_oid) - -- Inner ORE-CLLW comparison helpers backing the `<`, `<=`, `=`, - -- `>=`, `>`, `<>` operators on `eql_v2.ore_cllw` (the composite - -- type, registered via `eql_v2.ore_cllw_ops` opclass — #221). Same - -- precedent as the `ore_block_u64_8_256_*` helpers above: PG only - -- carries the inlined operator wrapper through to functional-index - -- match if the inner backing function is also inlinable. Pinning - -- these would break the index match for `ORDER BY eql_v2.ore_cllw - -- (value -> ''::text)` and the matching `WHERE` form. - OR (p.pronargs = 2 - AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', - 'ore_cllw_lt', 'ore_cllw_lte', - 'ore_cllw_gt', 'ore_cllw_gte')) - -- `->` selector lookup: inlinable SQL post the type flip - -- (returns `eql_v2.ste_vec_entry`). Must stay unpinned so the - -- planner can fold `col -> ''` into the calling query - -- — without this, the chained recipe - -- `WHERE col -> 'sel' = $1::ste_vec_entry` would not match a - -- functional hash index on `eql_v2.eq_term(col -> 'sel')`. - OR (p.proname = '->' - AND p.pronargs = 2 - AND p.proargtypes[0] = enc_oid - AND (p.proargtypes[1] = text_oid - OR p.proargtypes[1] = enc_oid - OR p.proargtypes[1] = (SELECT t.oid FROM pg_catalog.pg_type t - JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'pg_catalog' AND t.typname = 'int4'))) - -- Equality-term and order-term extractors — `eq_term` / `ord_term` - -- on a ste_vec entry and on the encrypted-domain family. Must - -- inline so `eql_v2.eq_term(col)` / `eql_v2.ord_term(col)` fold - -- into the calling query and match a functional index built on the - -- same expression. Name-only match (any arity-1 overload). The - -- encrypted-domain overloads are also covered by the identity - -- predicate's structural skip in the pin loop; these name-only - -- clauses are kept as belt-and-suspenders. - OR (p.pronargs = 1 AND p.proname = 'eq_term') - OR (p.pronargs = 1 AND p.proname = 'ord_term') - -- Type-safe `@>` / `<@` overloads with typed needles - -- (`stevec_query`, `ste_vec_entry`). Inline to the existing - -- `ste_vec_contains` machinery — must stay unpinned to engage - -- the GIN index on `eql_v2.ste_vec(col)` structurally for - -- bare-form containment. - OR (p.pronargs = 2 - AND p.proname IN ('@>', '<@') - AND p.proargtypes[0] = enc_oid - AND (p.proargtypes[1] = entry_oid - OR p.proargtypes[1] = (SELECT t.oid FROM pg_catalog.pg_type t - JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'eql_v2' AND t.typname = 'stevec_query'))) - OR (p.pronargs = 2 - AND p.proname IN ('@>', '<@') - AND p.proargtypes[1] = enc_oid - AND (p.proargtypes[0] = entry_oid - OR p.proargtypes[0] = (SELECT t.oid FROM pg_catalog.pg_type t - JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'eql_v2' AND t.typname = 'stevec_query'))) - ) - ) - OR ( - -- eql_v3 SEM index-term functions (self-contained fork). These mirror the - -- eql_v2 ore_block / hmac_256 inline-critical clauses above: the - -- comparison-wrapper inlining for the eql_v3 *_ord domains and eq_term only - -- reaches functional-index matching if these inner functions stay inlinable - -- (no SET, IMMUTABLE). The generated extractors/wrappers themselves are - -- spared by the jsonb-DOMAIN structural skip below; these SEM functions take - -- a composite (ore_block) or raw jsonb (hmac_256, bloom_filter) arg, so they - -- need an explicit entry here. - n.nspname = 'eql_v3' - AND ( - (p.pronargs = 2 - AND p.proname IN ('ore_block_256_eq', 'ore_block_256_neq', - 'ore_block_256_lt', 'ore_block_256_lte', - 'ore_block_256_gt', 'ore_block_256_gte')) - -- Inner ORE-CLLW comparison helpers backing the `<`, `<=`, `=`, `>=`, - -- `>`, `<>` operators on the eql_v3.ore_cllw composite type (registered - -- via the DEFAULT eql_v3.ore_cllw_ops btree opclass). Same precedent as - -- the ore_block_256_* helpers above and the eql_v2.ore_cllw_* - -- helpers: PG only carries the inlined operator wrapper through to - -- functional-index match if the inner backing function is also - -- inlinable. They take the composite arg (not a jsonb-backed domain), - -- so the structural skip below does not spare them — they need an - -- explicit entry here. The plpgsql FUNCTION 1 comparator - -- (compare_ore_cllw_term) stays pinned by design. - OR (p.pronargs = 2 - AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', - 'ore_cllw_lt', 'ore_cllw_lte', - 'ore_cllw_gt', 'ore_cllw_gte')) - -- Raw-jsonb CLLW extractor / presence helper. Inlinable SQL — pinning - -- would silently undo the fold of `eql_v3.ore_cllw(col -> 'sel')` into - -- the calling query and break functional-index match. (These also carry - -- the `eql-inline-critical` COMMENT marker honoured by the fallback - -- below; listed here too so the intent is explicit alongside the - -- operators they support. Single (jsonb) overload in the v3 fork.) - OR (p.pronargs = 1 - AND p.proname IN ('ore_cllw', 'has_ore_cllw') - AND p.proargtypes[0] = jsonb_oid) - OR (p.pronargs = 1 - AND p.proname = 'hmac_256' - AND p.proargtypes[0] = jsonb_oid) - OR (p.pronargs = 1 - AND p.proname = 'bloom_filter' - AND p.proargtypes[0] = jsonb_oid) - ) - ); - - FOR fn_oid IN - SELECT p.oid - FROM pg_catalog.pg_proc p - JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace - WHERE n.nspname IN ('eql_v2', 'eql_v3') - -- Only normal functions ('f') and window functions ('w') accept - -- ALTER FUNCTION ... SET. Aggregates ('a') would be rejected by - -- ALTER ROUTINE/FUNCTION, and procedures ('p') would need ALTER - -- PROCEDURE. The 3 affected aggregates (min, max, grouped_value) - -- are allowlisted in splinter. - AND p.prokind IN ('f', 'w') - AND NOT EXISTS ( - SELECT 1 FROM pg_catalog.unnest(coalesce(p.proconfig, '{}'::text[])) c - WHERE c LIKE 'search_path=%' - ) - AND NOT (p.oid = ANY (coalesce(inline_critical_oids, '{}'::oid[]))) - -- Encrypted-domain family — structural skip (hybrid primary mechanism). - -- A new encrypted-domain type needs NO edit here: its inline-critical - -- extractors and comparison wrappers are recognised by the identity - -- predicate — LANGUAGE sql, IMMUTABLE, and taking at least one argument - -- typed as a jsonb-backed DOMAIN of the encrypted-domain families. The - -- families live in the `eql_v3` schema (e.g. `eql_v3.int4_eq`); the - -- legacy `public.eql_v2_*` form is kept for any pre-v3 domain. The - -- predicate is proconfig-independent: the outer loop has already - -- excluded any function with a pinned `search_path`, so the only - -- functions reaching here are unpinned. This catches no core function: - -- `eql_v2_encrypted` is a composite type (not a domain), `ste_vec_entry` - -- is a domain in `eql_v2` (not `eql_v3`/`public`), and `hmac_256` is a - -- domain over `text` (not `jsonb`). The eql_v3 blockers are plpgsql, so - -- the LANGUAGE-sql guard leaves them to be pinned as intended. - AND NOT ( - p.prolang = (SELECT l.oid FROM pg_catalog.pg_language l - WHERE l.lanname = 'sql') - AND p.provolatile = 'i' - AND EXISTS ( - SELECT 1 - FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) - JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ - JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace - WHERE dt.typtype = 'd' - AND dt.typbasetype = jsonb_oid - AND ( - dn.nspname = 'eql_v3' - OR (dn.nspname = 'public' AND dt.typname LIKE 'eql_v2\_%') - ) - ) - ) - -- Encrypted-domain family — comment-marker fallback. Covers a - -- hand-written extension function that is inline-critical but takes no - -- domain argument (invisible to the identity predicate). The generator - -- does NOT emit this marker — every function it produces takes a domain - -- argument and is covered by the structural skip above. The marker is a - -- manual opt-in for hand-written extension functions only. - AND NOT EXISTS ( - SELECT 1 FROM pg_catalog.pg_description d - WHERE d.objoid = p.oid - AND d.classoid = 'pg_catalog.pg_proc'::regclass - AND d.description LIKE 'eql-inline-critical%' - ) - LOOP - -- oid::regprocedure renders as `schema.name(argtype, argtype)` and is a - -- valid target for ALTER FUNCTION regardless of caller search_path. - EXECUTE pg_catalog.format( - 'ALTER FUNCTION %s SET search_path = pg_catalog, extensions, public', - fn_oid::regprocedure - ); - END LOOP; -END $$; diff --git a/tasks/release/preview.sh b/tasks/release/preview.sh index 667c444d2..b2f5bd84e 100755 --- a/tasks/release/preview.sh +++ b/tasks/release/preview.sh @@ -66,8 +66,8 @@ echo "==> Building (clean) to verify v3 artifacts for ${tag}" mise run clean mise run build --version "${tag}" -v3_installer="release/cipherstash-encrypt-v3.sql" -v3_uninstaller="release/cipherstash-encrypt-v3-uninstall.sql" +v3_installer="release/cipherstash-encrypt.sql" +v3_uninstaller="release/cipherstash-encrypt-uninstall.sql" for f in "$v3_installer" "$v3_uninstaller"; do [[ -s "$f" ]] || err "expected non-empty build artifact missing: $f" done diff --git a/tasks/reset.sql b/tasks/reset.sql index 3178228ae..ff100ae14 100644 --- a/tasks/reset.sql +++ b/tasks/reset.sql @@ -6,7 +6,6 @@ CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public; -DROP SCHEMA eql_v2 CASCADE; -CREATE SCHEMA eql_v2; -GRANT ALL ON SCHEMA eql_v2 TO postgres; -GRANT ALL ON SCHEMA eql_v2 TO public; +-- Drop the eql_v3 schema if present; the EQL installer recreates it with a +-- plain `CREATE SCHEMA eql_v3`, so reset must not leave one behind. +DROP SCHEMA IF EXISTS eql_v3 CASCADE; diff --git a/tasks/test/clean_install_v3.sh b/tasks/test/clean_install_v3.sh index 07553f670..dfecbc223 100755 --- a/tasks/test/clean_install_v3.sh +++ b/tasks/test/clean_install_v3.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#MISE description="Install release/cipherstash-encrypt-v3.sql into a scratch DB with NO eql_v2 and smoke-test it (D11, D4)" +#MISE description="Install release/cipherstash-encrypt.sql into a scratch DB with NO eql_v2 and smoke-test it (D11, D4)" #USAGE flag "--port " help="Postgres port" default="7432" #USAGE flag "--user " help="Postgres user" default="cipherstash" @@ -16,7 +16,7 @@ SCRATCH_DB="cipherstash_v3_clean" ADMIN=(psql -U "$PG_USER" -h localhost -p "$PG_PORT" -d postgres -v ON_ERROR_STOP=1 -q) RUN=(psql -U "$PG_USER" -h localhost -p "$PG_PORT" -d "$SCRATCH_DB" -v ON_ERROR_STOP=1 -q) -test -f release/cipherstash-encrypt-v3.sql || { echo "Build first: release/cipherstash-encrypt-v3.sql missing" >&2; exit 2; } +test -f release/cipherstash-encrypt.sql || { echo "Build first: release/cipherstash-encrypt.sql missing" >&2; exit 2; } echo "==> (re)creating scratch database $SCRATCH_DB (no eql_v2 installed)" "${ADMIN[@]}" -c "DROP DATABASE IF EXISTS ${SCRATCH_DB} WITH (FORCE);" @@ -26,7 +26,7 @@ cleanup() { "${ADMIN[@]}" -c "DROP DATABASE IF EXISTS ${SCRATCH_DB} WITH (FORCE) trap cleanup EXIT echo "==> installing the standalone eql_v3 surface" -"${RUN[@]}" -f release/cipherstash-encrypt-v3.sql +"${RUN[@]}" -f release/cipherstash-encrypt.sql echo "==> asserting NO eql_v2 schema exists (proves no v2 dependency)" "${RUN[@]}" -c "DO \$\$ BEGIN IF EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'eql_v2') THEN RAISE EXCEPTION 'eql_v2 schema unexpectedly present'; END IF; END \$\$;" diff --git a/tasks/test/self_contained_v3.sh b/tasks/test/self_contained_v3.sh index 72466624e..b9fa44c85 100755 --- a/tasks/test/self_contained_v3.sh +++ b/tasks/test/self_contained_v3.sh @@ -33,12 +33,12 @@ if grep -v '^src/v3/' src/deps-ordered-v3.txt; then fi # Belt-and-braces: the assembled artifact carries no eql_v2 symbol. -echo "==> Artifact gate: release/cipherstash-encrypt-v3.sql has no 'eql_v2.' / 'eql_v2_'" -if [[ ! -f release/cipherstash-encrypt-v3.sql ]]; then - echo "ERROR: release/cipherstash-encrypt-v3.sql missing — run 'mise run build' first" >&2 +echo "==> Artifact gate: release/cipherstash-encrypt.sql has no 'eql_v2.' / 'eql_v2_'" +if [[ ! -f release/cipherstash-encrypt.sql ]]; then + echo "ERROR: release/cipherstash-encrypt.sql missing — run 'mise run build' first" >&2 exit 2 fi -if grep -nE 'eql_v2[._]' release/cipherstash-encrypt-v3.sql; then +if grep -nE 'eql_v2[._]' release/cipherstash-encrypt.sql; then echo "ERROR: assembled v3 artifact contains an eql_v2 symbol/entity reference" >&2 fail=1 fi diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index 97383be05..6598fa7bb 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -10,7 +10,7 @@ set -euo pipefail # Scope: only findings in EQL-owned schemas are gated. -EQL_OWNED_SCHEMAS="('eql_v2', 'eql_v3')" +EQL_OWNED_SCHEMAS="('eql_v3')" # Pinned to splinter main as of 2026-04-27. Bump intentionally. SPLINTER_SHA="55db5b1f28e58d816f7d9136eed87eabcd95868d" @@ -56,57 +56,12 @@ SQL # Format: TSV "rule\tschema\tname\ttype\treason" — kept as a heredoc so the # justification lives next to the entry it covers. Keys are matched verbatim. cat > "$work_dir/allowlist.tsv" <<'ALLOW' -function_search_path_mutable eql_v2 = function Phase 1 inlining (#193): must inline so the planner can match the documented functional index eql_v2.hmac_256(col). SET search_path disables SQL function inlining (see PostgreSQL inline_function); pinning here would revert bare-equality queries to seq scan on Supabase / managed Postgres without superuser. Three overloads: (enc, enc), (enc, jsonb), (jsonb, enc). -function_search_path_mutable eql_v2 <> function Phase 1 inlining (#193): same rationale as eql_v2.=. Three overloads. -function_search_path_mutable eql_v2 < function Range-operator inlining: must inline so `WHERE col < val` reduces to `eql_v2.ore_block_u64_8_256(col) < eql_v2.ore_block_u64_8_256(val)` and matches the documented functional ORE index. Three overloads: (enc, enc), (enc, jsonb), (jsonb, enc). -function_search_path_mutable eql_v2 <= function Range-operator inlining: same rationale as eql_v2.<. Three overloads. -function_search_path_mutable eql_v2 > function Range-operator inlining: same rationale as eql_v2.<. Three overloads. -function_search_path_mutable eql_v2 >= function Range-operator inlining: same rationale as eql_v2.<. Three overloads. -function_search_path_mutable eql_v2 ore_block_u64_8_256_eq function Inner comparator for the ore_block_u64_8_256 type's `=` operator. The outer `eql_v2_encrypted` operators inline to `ore_block(a) op ore_block(b)`; the planner only carries that form through to index matching if this inner function is also inlinable (no SET, IMMUTABLE). -function_search_path_mutable eql_v2 ore_block_u64_8_256_neq function Inner comparator for the ore_block_u64_8_256 type's `<>` operator. Same rationale as ore_block_u64_8_256_eq. -function_search_path_mutable eql_v2 ore_block_u64_8_256_lt function Inner comparator for the ore_block_u64_8_256 type's `<` operator. Same rationale as ore_block_u64_8_256_eq. -function_search_path_mutable eql_v2 ore_block_u64_8_256_lte function Inner comparator for the ore_block_u64_8_256 type's `<=` operator. Same rationale as ore_block_u64_8_256_eq. -function_search_path_mutable eql_v2 ore_block_u64_8_256_gt function Inner comparator for the ore_block_u64_8_256 type's `>` operator. Same rationale as ore_block_u64_8_256_eq. -function_search_path_mutable eql_v2 ore_block_u64_8_256_gte function Inner comparator for the ore_block_u64_8_256 type's `>=` operator. Same rationale as ore_block_u64_8_256_eq. -function_search_path_mutable eql_v2 hash_encrypted function Hash operator class FUNCTION 1: called once per row by HashAggregate, hash joins, DISTINCT. SET search_path forces plpgsql-equivalent call overhead per row; without pinning, the SQL function machinery is ~10× cheaper and `GROUP BY` / `DISTINCT` on `eql_v2_encrypted` at 1M rows stays linear rather than degrading super-linearly via work_mem spillage. -function_search_path_mutable eql_v2 ~~ function Phase 1 inlining (#193): must inline so the planner can match eql_v2.bloom_filter(col). Three overloads. (Note: the eql_v2.~~* operator points at this same function — case-insensitivity of LIKE on encrypted ciphertexts is meaningless because the bloom filter index term is independent of case.) -function_search_path_mutable eql_v2 like function LIKE/ILIKE inlining (#201): the eql_v2."~~" operator wrapper inlines to a single-statement call to eql_v2.like, which itself must inline to reach `eql_v2.bloom_filter(a) @> eql_v2.bloom_filter(b)` and match the documented functional GIN index. Pinning search_path here breaks the second inlining layer and reverts bare-form `WHERE col ~~ val` to seq scan. -function_search_path_mutable eql_v2 ilike function LIKE/ILIKE inlining (#201): same rationale as eql_v2.like — the eql_v2."~~*" operator inlines through eql_v2.ilike to the bloom_filter containment form. -function_search_path_mutable eql_v2 hmac_256 function HMAC equality extractor (#205 / #219): all overloads — (jsonb), (eql_v2_encrypted), (eql_v2.ste_vec_entry) — are inlinable SQL so they can be folded into the calling query, preserving the functional-index match for WHERE / GROUP BY / DISTINCT / hash-join on hmac_256(col), hmac_256(col -> ''), and explicit hmac-only field-level lookups. -function_search_path_mutable eql_v2 has_hmac_256 function HMAC presence check on a ste_vec entry (#219): typed (eql_v2.ste_vec_entry) overload, inlinable counterpart to `hmac_256(ste_vec_entry)`. -function_search_path_mutable eql_v2 jsonb_path_query function Field-level JSONB extractor (#205): inlinable SQL body — `jsonb_array_elements((val).data -> 'sv') WHERE elem ->> 's' = selector`. Must inline to fold into the calling query and remove per-row function call overhead on large ste_vec scans. Three overloads: (jsonb, text), (eql_v2_encrypted, text), (eql_v2_encrypted, eql_v2_encrypted). -function_search_path_mutable eql_v2 jsonb_path_query_first function Field-level JSONB extractor (#205): inlinable SQL LIMIT 1 variant. Same rationale as jsonb_path_query. Three overloads. -function_search_path_mutable eql_v2 jsonb_path_exists function Field-level JSONB extractor (#205): inlinable SQL EXISTS variant. Same rationale as jsonb_path_query. Three overloads. -function_search_path_mutable eql_v2 @> function GIN-inlining: must inline so the planner can match the index on eql_v2.jsonb_array(e). SET search_path disables SQL function inlining (see PostgreSQL inline_function), reverting GIN scans to seq scans. -function_search_path_mutable eql_v2 <@ function GIN-inlining: same as @>. -function_search_path_mutable eql_v2 jsonb_contains function GIN-inlining: wrapper unfolds to eql_v2.jsonb_array(a) @> eql_v2.jsonb_array(b). Pinning search_path here drops the bitmap index scan. -function_search_path_mutable eql_v2 jsonb_contained_by function GIN-inlining: same as jsonb_contains. -function_search_path_mutable eql_v2 ore_cllw function Consolidated ORE-CLLW extractor (U-006): inlinable SQL so the planner can fold `eql_v2.ore_cllw(col -> 'sel')` calls into the calling query. SET search_path would silently undo the inlining and prevent functional-index match through the extractor form. Two overloads: (jsonb), (eql_v2.ste_vec_entry). -function_search_path_mutable eql_v2 has_ore_cllw function Consolidated ORE-CLLW presence check (U-006): inlinable SQL counterpart to `eql_v2.ore_cllw`. Same rationale as `ore_cllw` — must stay unpinned to inline into the calling query. Two overloads: (jsonb), (eql_v2.ste_vec_entry). -function_search_path_mutable eql_v2 selector function STE-vec entry selector extractor (#219): typed (eql_v2.ste_vec_entry) overload, inlinable so the planner can fold `eql_v2.selector(col -> 'sel')` into the calling query. -function_search_path_mutable eql_v2 eq function Equality backing function for `eql_v2.ste_vec_entry × eql_v2.ste_vec_entry` (#219). Inlines to `hmac_256(a) = hmac_256(b)`; the `=` operator must reach the functional hash index on `eql_v2.hmac_256(col -> 'sel')` for bare-form field equality to engage Index Scan. (The converged int4 wrappers moved to the eql_v3 schema — see the eql_v3 rows below.) -function_search_path_mutable eql_v2 neq function Inequality backing function for `eql_v2.ste_vec_entry`. Same rationale as `eq`. -function_search_path_mutable eql_v2 lt function Less-than backing function for `eql_v2.ste_vec_entry`. Inlines to `ore_cllw(a) < ore_cllw(b)`; must reach the functional btree opclass on `eql_v2.ore_cllw` for ordered field queries to engage Index Scan. -function_search_path_mutable eql_v2 lte function Less-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. -function_search_path_mutable eql_v2 gt function Greater-than backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. -function_search_path_mutable eql_v2 gte function Greater-than-or-equal backing function for `eql_v2.ste_vec_entry`. Same rationale as `lt`. -function_search_path_mutable eql_v2 ore_cllw_eq function Inner comparator for the `eql_v2.ore_cllw` type's `=` operator (#221). The outer same-type operators back the btree opclass on `eql_v2.ore_cllw`; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). Mirrors ore_block_u64_8_256_eq. -function_search_path_mutable eql_v2 ore_cllw_neq function Inner comparator for the `eql_v2.ore_cllw` type's `<>` operator (#221). Same rationale as `ore_cllw_eq`. -function_search_path_mutable eql_v2 ore_cllw_lt function Inner comparator for the `eql_v2.ore_cllw` type's `<` operator (#221). Same rationale as `ore_cllw_eq`. -function_search_path_mutable eql_v2 ore_cllw_lte function Inner comparator for the `eql_v2.ore_cllw` type's `<=` operator (#221). Same rationale as `ore_cllw_eq`. -function_search_path_mutable eql_v2 ore_cllw_gt function Inner comparator for the `eql_v2.ore_cllw` type's `>` operator (#221). Same rationale as `ore_cllw_eq`. -function_search_path_mutable eql_v2 ore_cllw_gte function Inner comparator for the `eql_v2.ore_cllw` type's `>=` operator (#221). Same rationale as `ore_cllw_eq`. -function_search_path_mutable eql_v2 -> function Typed sv-element selector lookup (U-007): inlinable SQL so the planner can fold `col -> ''` into the calling query, preserving functional-index match for the chained recipes `WHERE col -> 'sel' = $1::ste_vec_entry` (via eq_term) and `ORDER BY eql_v2.ore_cllw(col -> 'sel')`. Three overloads: (enc, text), (enc, enc), (enc, int). -function_search_path_mutable eql_v2 eq_term function XOR-aware equality term extractor on a ste_vec entry (U-007): coalesces hm and oc as bytea. Must inline so `eql_v2.eq_term(col -> 'sel')` folds into the calling query and matches a functional hash index built on the same expression — same precedent as ore_cllw / hmac_256 extractors on ste_vec_entry. (The eql_v3.int4_eq eq_term extractor is a separate overload in the eql_v3 schema — see the eql_v3 rows below.) -function_search_path_mutable eql_v2 min function Aggregate (splinter labels these type=function): ALTER AGGREGATE has no SET configuration_parameter syntax, and ALTER ROUTINE/FUNCTION reject aggregates. The aggregate's SFUNC has a pinned search_path. -function_search_path_mutable eql_v2 max function Aggregate: same as min. -function_search_path_mutable eql_v2 grouped_value function Aggregate: same as min. # Encrypted-domain families live in the eql_v3 schema (the int4 family and # future scalar domains). Their inlinable extractors and comparison wrappers -# must stay unpinned for functional-index matching, exactly as the eql_v2 -# encrypted-type operators above; splinter matches by (schema, name, type), so +# must stay unpinned for functional-index matching; splinter matches by +# (schema, name, type), so # they need their own rows. The plpgsql blockers are pinned by -# tasks/pin_search_path.sql and do not surface here. +# tasks/pin_search_path_v3.sql and do not surface here. function_search_path_mutable eql_v3 eq_term function HMAC equality term extractor for the eql_v3 *_eq domains: returns eql_v3.hmac_256. Must inline so `eql_v3.eq_term(col)` folds into the calling query and matches the functional hash/btree index built on the same expression. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v3.ore_block_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). function_search_path_mutable eql_v3 match_term function Bloom-filter match term extractor for the eql_v3 *_match domains: returns eql_v3.bloom_filter. Used inside the inlinable @>/<@ containment wrappers and as the functional-index expression USING gin (eql_v3.match_term(col)); must inline so the GIN index engages. SET search_path would disable SQL function inlining. @@ -120,17 +75,17 @@ function_search_path_mutable eql_v3 gt function Greater-than comparison wrapper function_search_path_mutable eql_v3 gte function Greater-than-or-equal comparison wrapper on the eql_v3 ordered domains. Same rationale as eql_v3.lt. function_search_path_mutable eql_v3 min function Per-domain MIN aggregate on the eql_v3 ordered domains (splinter labels aggregates type=function): ALTER AGGREGATE has no SET configuration_parameter syntax, and ALTER ROUTINE/FUNCTION reject aggregates. The aggregate's SFUNC carries a pinned search_path. function_search_path_mutable eql_v3 max function Per-domain MAX aggregate on the eql_v3 ordered domains. Same as eql_v3.min. -function_search_path_mutable eql_v3 ore_block_256_eq function Inner comparator for the eql_v3 ore_block_256 type's `=` operator (self-contained SEM fork). The eql_v3 *_ord comparison wrappers inline to `ord_term(a) op ord_term(b)`; the planner only carries that through to the functional ORE index if this inner function is also inlinable (no SET, IMMUTABLE). Mirrors eql_v2.ore_block_u64_8_256_eq. +function_search_path_mutable eql_v3 ore_block_256_eq function Inner comparator for the eql_v3 ore_block_256 type's `=` operator (self-contained SEM fork). The eql_v3 *_ord comparison wrappers inline to `ord_term(a) op ord_term(b)`; the planner only carries that through to the functional ORE index if this inner function is also inlinable (no SET, IMMUTABLE). function_search_path_mutable eql_v3 ore_block_256_neq function Inner comparator for the eql_v3 ore_block_256 `<>` operator. Same rationale as eql_v3.ore_block_256_eq. function_search_path_mutable eql_v3 ore_block_256_lt function Inner comparator for the eql_v3 ore_block_256 `<` operator. Same rationale as eql_v3.ore_block_256_eq. function_search_path_mutable eql_v3 ore_block_256_lte function Inner comparator for the eql_v3 ore_block_256 `<=` operator. Same rationale as eql_v3.ore_block_256_eq. function_search_path_mutable eql_v3 ore_block_256_gt function Inner comparator for the eql_v3 ore_block_256 `>` operator. Same rationale as eql_v3.ore_block_256_eq. function_search_path_mutable eql_v3 ore_block_256_gte function Inner comparator for the eql_v3 ore_block_256 `>=` operator. Same rationale as eql_v3.ore_block_256_eq. -function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.eq_term. Must inline so the functional hash/btree index on eql_v3.eq_term(col) engages. Mirrors eql_v2.hmac_256. +function_search_path_mutable eql_v3 hmac_256 function HMAC equality extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.eq_term. Must inline so the functional hash/btree index on eql_v3.eq_term(col) engages. function_search_path_mutable eql_v3 bloom_filter function Bloom-filter match extractor for the eql_v3 SEM fork: inlinable SQL (jsonb) constructor used inside eql_v3.match_term. Must inline so the functional GIN index on eql_v3.match_term(col) engages. Mirrors eql_v3.hmac_256. -function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path.sql honours. The eql_v2 copy stays plpgsql (pinned) by design. -function_search_path_mutable eql_v3 jsonb_array_to_ore_block_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_256, carries the `eql-inline-critical` COMMENT marker. The eql_v2 copy stays plpgsql (pinned) by design. -function_search_path_mutable eql_v3 ore_cllw_eq function Inner comparator for the eql_v3.ore_cllw composite type's `=` operator (self-contained SEM fork, DEFAULT FOR TYPE btree opclass eql_v3.ore_cllw_ops). The outer same-type operators back the opclass; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). The plpgsql FUNCTION 1 comparator (compare_ore_cllw_term) stays pinned by design. Mirrors eql_v2.ore_cllw_eq. +function_search_path_mutable eql_v3 jsonb_array_to_bytea_array function Hand-written jsonb→bytea[] helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Reached per-encrypted-value through eql_v3.ore_block_256; must inline so the planner can fold it into the calling query. Pinned by neither the structural skip (it takes bare jsonb, not a jsonb-backed domain) nor an inline-critical OID clause — it carries the documented `eql-inline-critical` COMMENT marker that tasks/pin_search_path_v3.sql honours. +function_search_path_mutable eql_v3 jsonb_array_to_ore_block_256 function Hand-written jsonb→ore_block composite helper for the eql_v3 SEM fork: inlinable SQL (no SET, IMMUTABLE). Same rationale as eql_v3.jsonb_array_to_bytea_array — reached per-encrypted-value through eql_v3.ore_block_256, carries the `eql-inline-critical` COMMENT marker. +function_search_path_mutable eql_v3 ore_cllw_eq function Inner comparator for the eql_v3.ore_cllw composite type's `=` operator (self-contained SEM fork, DEFAULT FOR TYPE btree opclass eql_v3.ore_cllw_ops). The outer same-type operators back the opclass; the planner only carries the inlined form through to functional-index match if this inner function is also inlinable (no SET, IMMUTABLE). The plpgsql FUNCTION 1 comparator (compare_ore_cllw_term) stays pinned by design. function_search_path_mutable eql_v3 ore_cllw_neq function Inner comparator for the eql_v3.ore_cllw `<>` operator. Same rationale as eql_v3.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_lt function Inner comparator for the eql_v3.ore_cllw `<` operator. Same rationale as eql_v3.ore_cllw_eq. function_search_path_mutable eql_v3 ore_cllw_lte function Inner comparator for the eql_v3.ore_cllw `<=` operator. Same rationale as eql_v3.ore_cllw_eq. @@ -138,23 +93,23 @@ function_search_path_mutable eql_v3 ore_cllw_gt function Inner comparator for th function_search_path_mutable eql_v3 ore_cllw_gte function Inner comparator for the eql_v3.ore_cllw `>=` operator. Same rationale as eql_v3.ore_cllw_eq. # Encrypted-JSONB document surface (src/v3/jsonb): the hand-written eql_v3.json / # ste_vec_entry / ste_vec_query domains and their selector/extractor/operator -# functions. Inlinable for the same functional-index reasons as the eql_v2 -# ste_vec surface above; left unpinned by tasks/pin_search_path.sql via either +# functions. Inlinable for functional-index matching; left unpinned by +# tasks/pin_search_path_v3.sql via either # the structural jsonb-domain-arg skip or the documented `eql-inline-critical` # COMMENT marker (the plpgsql blockers in blockers.sql are pinned and do not # surface). Splinter matches by (schema, name, type), so they need their own rows. -function_search_path_mutable eql_v3 -> function Typed sv-element selector lookup on the eql_v3 encrypted-JSONB surface: inlinable SQL over an eql_v3.json domain arg so `col -> ''` folds into the calling query, preserving functional-index match for the chained ste_vec recipes (eq_term / ore_cllw on the extracted entry). Left unpinned by the structural domain-arg skip in pin_search_path.sql; mirrors eql_v2.->. Two overloads: (json, text), (json, int). +function_search_path_mutable eql_v3 -> function Typed sv-element selector lookup on the eql_v3 encrypted-JSONB surface: inlinable SQL over an eql_v3.json domain arg so `col -> ''` folds into the calling query, preserving functional-index match for the chained ste_vec recipes (eq_term / ore_cllw on the extracted entry). Left unpinned by the structural domain-arg skip in pin_search_path_v3.sql. Two overloads: (json, text), (json, int). function_search_path_mutable eql_v3 ->> function Text sv-element selector lookup on the eql_v3 encrypted-JSONB surface: inlinable SQL over an eql_v3.json domain arg, text-returning counterpart to eql_v3.->. Structural domain-arg skip. Two overloads: (json, text), (json, int). -function_search_path_mutable eql_v3 @> function Containment (@>) operator wrapper on the eql_v3 encrypted-JSONB surface: inlinable SQL so the planner can match the functional GIN index on eql_v3.jsonb_array(col). Structural domain-arg skip (eql_v3.json). Mirrors eql_v2.@>. Three overloads. +function_search_path_mutable eql_v3 @> function Containment (@>) operator wrapper on the eql_v3 encrypted-JSONB surface: inlinable SQL so the planner can match the functional GIN index on eql_v3.jsonb_array(col). Structural domain-arg skip (eql_v3.json). Three overloads. function_search_path_mutable eql_v3 <@ function Contained-by (<@) operator wrapper on the eql_v3 encrypted-JSONB surface: same rationale as eql_v3.@>. Three overloads. -function_search_path_mutable eql_v3 ore_cllw function ORE-CLLW extractor on the eql_v3 encrypted-JSONB surface: inlinable SQL so `eql_v3.ore_cllw(col -> 'sel')` folds into the calling query and reaches the functional btree opclass on eql_v3.ore_cllw. Structural domain-arg skip. Mirrors eql_v2.ore_cllw. Two overloads: (jsonb) (SEM fork), (eql_v3.ste_vec_entry). -function_search_path_mutable eql_v3 has_ore_cllw function ORE-CLLW presence check on the eql_v3 encrypted-JSONB surface: inlinable SQL counterpart to eql_v3.ore_cllw, structural domain-arg skip. Mirrors eql_v2.has_ore_cllw. Two overloads: (jsonb) (SEM fork), (eql_v3.ste_vec_entry). -function_search_path_mutable eql_v3 selector function STE-vec entry selector extractor: typed (eql_v3.ste_vec_entry) overload, inlinable so `eql_v3.selector(col -> 'sel')` folds into the calling query. Structural domain-arg skip. The (jsonb) overload is plpgsql with a pinned search_path and does not surface. Mirrors eql_v2.selector. +function_search_path_mutable eql_v3 ore_cllw function ORE-CLLW extractor on the eql_v3 encrypted-JSONB surface: inlinable SQL so `eql_v3.ore_cllw(col -> 'sel')` folds into the calling query and reaches the functional btree opclass on eql_v3.ore_cllw. Structural domain-arg skip. Two overloads: (jsonb) (SEM fork), (eql_v3.ste_vec_entry). +function_search_path_mutable eql_v3 has_ore_cllw function ORE-CLLW presence check on the eql_v3 encrypted-JSONB surface: inlinable SQL counterpart to eql_v3.ore_cllw, structural domain-arg skip. Two overloads: (jsonb) (SEM fork), (eql_v3.ste_vec_entry). +function_search_path_mutable eql_v3 selector function STE-vec entry selector extractor: typed (eql_v3.ste_vec_entry) overload, inlinable so `eql_v3.selector(col -> 'sel')` folds into the calling query. Structural domain-arg skip. The (jsonb) overload is plpgsql with a pinned search_path and does not surface. function_search_path_mutable eql_v3 to_ste_vec_query function Encrypted-JSONB query-document constructor (CAST WITH FUNCTION for eql_v3.ste_vec_query): inlinable SQL over an eql_v3.json domain arg, structural domain-arg skip. Builds the ste_vec query value the @>/<@ wrappers compare against; must inline to fold into the calling query. -function_search_path_mutable eql_v3 jsonb_array function ste_vec array extractor for the eql_v3 encrypted-JSONB surface: inlinable SQL (raw jsonb arg) behind the functional GIN index expression eql_v3.jsonb_array(col). Takes bare jsonb, so it carries the documented `eql-inline-critical` COMMENT marker that pin_search_path.sql honours rather than the structural skip. Mirrors eql_v2.jsonb_array. -function_search_path_mutable eql_v3 jsonb_contains function GIN-inlining wrapper: unfolds to eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b). Carries the `eql-inline-critical` COMMENT marker. Mirrors eql_v2.jsonb_contains. +function_search_path_mutable eql_v3 jsonb_array function ste_vec array extractor for the eql_v3 encrypted-JSONB surface: inlinable SQL (raw jsonb arg) behind the functional GIN index expression eql_v3.jsonb_array(col). Takes bare jsonb, so it carries the documented `eql-inline-critical` COMMENT marker that pin_search_path_v3.sql honours rather than the structural skip. +function_search_path_mutable eql_v3 jsonb_contains function GIN-inlining wrapper: unfolds to eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b). Carries the `eql-inline-critical` COMMENT marker. function_search_path_mutable eql_v3 jsonb_contained_by function GIN-inlining wrapper: same as eql_v3.jsonb_contains. -function_search_path_mutable eql_v3 jsonb_path_query function Field-level JSONB extractor on the eql_v3 encrypted-JSONB surface: inlinable SQL, carries the `eql-inline-critical` COMMENT marker so it stays unpinned and folds into the calling query. Mirrors eql_v2.jsonb_path_query. +function_search_path_mutable eql_v3 jsonb_path_query function Field-level JSONB extractor on the eql_v3 encrypted-JSONB surface: inlinable SQL, carries the `eql-inline-critical` COMMENT marker so it stays unpinned and folds into the calling query. function_search_path_mutable eql_v3 jsonb_path_exists function Field-level JSONB EXISTS variant: same rationale as eql_v3.jsonb_path_query. function_search_path_mutable eql_v3 jsonb_path_query_first function Field-level JSONB LIMIT 1 variant: same rationale as eql_v3.jsonb_path_query. function_search_path_mutable eql_v3 meta_data function Encrypted-payload metadata extractor: inlinable SQL (raw jsonb arg), carries the `eql-inline-critical` COMMENT marker so it stays unpinned and folds into the calling query. diff --git a/tasks/uninstall-protect.sql b/tasks/uninstall-protect.sql deleted file mode 100644 index eb48602ed..000000000 --- a/tasks/uninstall-protect.sql +++ /dev/null @@ -1,2 +0,0 @@ -DROP SCHEMA IF EXISTS eql_v2 CASCADE; -DROP SCHEMA IF EXISTS eql_v3 CASCADE; diff --git a/tasks/uninstall.sql b/tasks/uninstall.sql deleted file mode 100644 index e087e2a88..000000000 --- a/tasks/uninstall.sql +++ /dev/null @@ -1,17 +0,0 @@ - -DO $$ -BEGIN - ALTER TABLE IF EXISTS public.eql_v2_configuration DROP CONSTRAINT IF EXISTS eql_v2_configuration_data_check; - - EXECUTE format('ALTER TABLE IF EXISTS %I RENAME TO %I_%s', 'eql_v2_configuration','eql_v2_configuration_', to_char(current_date,'YYYYMMDD')::TEXT); - - RAISE NOTICE 'EQL configuration archived as %_%','eql_v2_configuration_', to_char(current_date,'YYYYMMDD')::TEXT; -END -$$; - -DROP SCHEMA IF EXISTS eql_v2 CASCADE; - --- Encrypted-domain families (eql_v3.int4 and future scalar domains) live in --- their own schema; drop it too. CASCADE removes the domains and any columns --- typed with them. -DROP SCHEMA IF EXISTS eql_v3 CASCADE; From 16e4fd22ca30c76721c5f12982fadae916c0e5e0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 15:30:17 +1000 Subject: [PATCH 327/599] ci: drop v2/supabase/v3 release assets, make v3 install the primary gate --- .github/workflows/release-eql.yml | 6 ------ .github/workflows/test-eql.yml | 9 ++++----- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml index 7f0c17826..d96881c1d 100644 --- a/.github/workflows/release-eql.yml +++ b/.github/workflows/release-eql.yml @@ -73,8 +73,6 @@ jobs: path: | release/cipherstash-encrypt.sql release/cipherstash-encrypt-uninstall.sql - release/cipherstash-encrypt-v3.sql - release/cipherstash-encrypt-v3-uninstall.sql - name: Publish EQL release artifacts uses: softprops/action-gh-release@v2 @@ -83,10 +81,6 @@ jobs: files: | release/cipherstash-encrypt.sql release/cipherstash-encrypt-uninstall.sql - release/cipherstash-encrypt-supabase.sql - release/cipherstash-encrypt-uninstall-supabase.sql - release/cipherstash-encrypt-v3.sql - release/cipherstash-encrypt-v3-uninstall.sql - name: Notify Multitudes if: github.event_name == 'release' diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index a4bcbd619..caa25e1bb 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -162,11 +162,10 @@ jobs: run: | mise run test:sqlx:archive - # Ship ALL release variants, not just the main installer: the - # build_validation_tests read cipherstash-encrypt{,-protect,-protect-uninstall, - # -v3,-v3-uninstall}.sql from ../../release at RUN time (std::fs, not embedded), - # and release/ is gitignored so the shard checkout has none of them. `mise run - # build` (via prep) produced the whole set in build-archive. + # Ship the built release artifacts: build_validation_tests read + # cipherstash-encrypt{,-uninstall}.sql from ../../release at RUN time + # (std::fs, not embedded), and release/ is gitignored so the shard checkout + # has none of them. `mise run build` (via prep) produced them in build-archive. - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: nextest-archive From 51ec371f8e8552e937393762d8749065f0d61e00 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 15:30:37 +1000 Subject: [PATCH 328/599] docs: record eql_v2 removal decision (ADR-0001) --- docs/decisions/0001-remove-eql-v2.md | 82 ++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 docs/decisions/0001-remove-eql-v2.md diff --git a/docs/decisions/0001-remove-eql-v2.md b/docs/decisions/0001-remove-eql-v2.md new file mode 100644 index 000000000..b7f064c5c --- /dev/null +++ b/docs/decisions/0001-remove-eql-v2.md @@ -0,0 +1,82 @@ +# 1. Remove `eql_v2`, ship only the self-contained `eql_v3` surface + +Date: 2026-06-22 + +## Status + +Accepted + +## Context + +EQL historically shipped a single `eql_v2` PostgreSQL schema: the +`eql_v2_encrypted` composite column type, its operator surface (`=`, `<>`, +`~~`/`~~*` `LIKE`/`ILIKE`, containment, ORE comparisons), database-side +configuration management (`eql_v2_configuration`, `add_search_config`, +`add_column`, …), the `encryptindex` migration machinery, and the SteVec +encrypted-JSONB surface. `eql_v2` was the documented public API. + +The `eql_v3` schema was introduced as an additive, namespaced home for the +generated encrypted-domain type families (`eql_v3.int4`, `int8`, `date`, +`timestamptz`, `numeric`, `float4`/`float8`, `text`, `bool`) plus the +self-contained encrypted-JSONB document surface (`eql_v3.json`, SteVec). Over a +series of changes `eql_v3` became **fully self-contained**: it owns its own +copies of the searchable-encrypted-metadata (SEM) index-term types +(`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, +`eql_v3.bloom_filter`), has zero runtime dependency on `eql_v2`, and ships as a +standalone installer (`release/cipherstash-encrypt-v3.sql`) that installs into a +database with no `eql_v2` present. CI gates this self-containment +(`mise run test:self_contained_v3`). + +With `eql_v3` standing on its own, keeping `eql_v2` in the repository imposes +ongoing cost — two parallel SQL surfaces to build, test, document, and reason +about — for a surface we intend to supersede. The encryption client +(CipherStash Proxy / ProtectJS) now owns the configuration model that the +database-side `eql_v2` config functions previously provided, so the +database no longer needs to manage that state. + +## Decision + +Remove `eql_v2` entirely. EQL ships only the self-contained `eql_v3` +encrypted-domain surface. The collapsed build produces the canonical +`release/cipherstash-encrypt.sql` (+ uninstaller) from the `eql_v3` surface +alone, so existing install URLs keep working. + +The following `eql_v2`-only capabilities are **dropped with no `eql_v3` +replacement** in this change: + +- The `eql_v2_encrypted` composite column type and its operator surface. +- Database-side configuration management (`eql_v2_configuration`, + `add_search_config`, `add_column`, `migrate_config`, `diff_config`, + `create_encrypted_columns`). The encryption client owns config now. +- The `encryptindex` migration machinery. +- `LIKE` / `ILIKE` (`~~` / `~~*`) on the encrypted column type. (`eql_v3.text` + match is bloom-filter containment, not SQL `LIKE`.) +- Boolean operators on `eql_v2_encrypted`. +- Operator-class-on-column indexing. (`eql_v3` indexes via functional indexes + on the `eq_term` / `ord_term` / `match_term` extractors.) +- `GROUP BY` / `grouped_value` on the encrypted column type. + +The supported searchable-encryption capabilities (equality, ordered range, +`MIN`/`MAX`, encrypted-JSONB document containment and path access) are all +provided by the `eql_v3` surface. + +## Consequences + +- **This is a major (3.0.0) break of the public API.** Callers using the + `eql_v2` schema must migrate to the `eql_v3` encrypted-domain types. Per the + project decision, **no per-capability upgrade/migration guide is written** for + the dropped capabilities — the dropped surface has no `eql_v3` equivalent, so + there is no mechanical migration to document. +- The canonical `release/cipherstash-encrypt.sql` artifact is now the `eql_v3` + surface. The `-supabase` and `-protect` build variants are removed (they + existed to subset the `eql_v2` surface). +- The repository ships a single SQL surface, a single build, and a single test + install path — reducing build/test/maintenance surface area. +- The EQL SQL linter is retained as `eql_v3.lints()` (ported from + `eql_v2.lints()`), scoped to the `eql_v3` schema, so the inlinability / + blocker / domain-shape quality gates survive. + +## Related + +- `CHANGELOG.md` `[Unreleased]` → `Removed` entry. +- Self-containment invariant and gate: `mise run test:self_contained_v3`. From 14822f3777dc6cf65aaacdd74d3cd95c11fc7893 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 15:31:21 +1000 Subject: [PATCH 329/599] docs(changelog): record eql_v2 removal under Unreleased --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1299a6f01..53d78d00a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,12 @@ Each entry that ships in a published release links to the PR that introduced it. - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) +- **The self-contained `eql_v3` installer is now the sole release artifact, shipped under the canonical name `release/cipherstash-encrypt.sql` (+ `cipherstash-encrypt-uninstall.sql`).** The combined, Supabase, and Protect build variants are removed; `mise run build` now produces only the `eql_v3` surface, written under the canonical name that the combined build previously used — so existing install URLs keep working. Why: with `eql_v2` removed (see below), there is a single SQL surface to build, install, and test. See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). + +### Removed + +- **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). + ### Fixed - **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.int4_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) From 5d4c2da0ac3bcaef462b4794bd0a3897eddbc857 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 15:37:01 +1000 Subject: [PATCH 330/599] style(test): rustfmt collapse domain_over_domain filter in lint_tests --- tests/sqlx/tests/lint_tests.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index 2154fca60..c5770e06a 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -216,9 +216,7 @@ async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { let rows = fetch_lints(&pool).await?; let violations: Vec<&LintRow> = rows .iter() - .filter(|r| { - r.category == "domain_over_domain" && r.object_name.contains("test_baddom") - }) + .filter(|r| r.category == "domain_over_domain" && r.object_name.contains("test_baddom")) .collect(); assert!( From 0a511d15dab6e7a4be060a01c0bd8427dad9766e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 16:30:58 +1000 Subject: [PATCH 331/599] fix(test): repoint build_validation to canonical artifact; refresh migration READMEs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review caught build_validation_tests.rs still reading cipherstash-encrypt-v3.sql after the Task 9 rename to the canonical name — would fail CI. Repoint all five path literals to cipherstash-encrypt{,-uninstall}.sql. Also refresh the migration READMEs that still documented the deleted 002-007 migrations. --- tests/sqlx/README.md | 9 ++--- tests/sqlx/migrations/README.md | 41 ++++++++++------------ tests/sqlx/tests/build_validation_tests.rs | 25 ++++++------- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index d57d4d57e..6e3e4b776 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -13,12 +13,9 @@ This test crate provides: ## Architecture - **SQLx `#[sqlx::test]`**: Automatic test isolation (each test gets fresh database) -- **Fixtures**: SQL files in `fixtures/` seed test data -- **Migrations**: SQL files in `migrations/` install EQL extension and test infrastructure - - `001_install_eql.sql` - Installs EQL extension - - `002_install_ore_data.sql` - Loads ORE encryption data - - `003_install_ste_vec_data.sql` - Loads STE vector encryption data - - `004_install_test_helpers.sql` - Creates test helper functions +- **Fixtures**: generated SQL files in `fixtures/` seed per-test data (see `fixtures/FIXTURE_SCHEMA.md`) +- **Migrations**: a single generated migration in `migrations/` + - `001_install_eql.sql` - installs the EQL (`eql_v3`) extension (generated, gitignored) - **Assertions**: Builder pattern for common test assertions - **Helpers**: Centralized helper functions in `src/helpers.rs` diff --git a/tests/sqlx/migrations/README.md b/tests/sqlx/migrations/README.md index abfc74711..974c3c652 100644 --- a/tests/sqlx/migrations/README.md +++ b/tests/sqlx/migrations/README.md @@ -1,30 +1,27 @@ # SQLx Migrations -These migrations install EQL and test helpers into the test database using a **hybrid approach**. +There is a single migration: the generated EQL install. All test data is +provided per-test by the generated fixtures in `tests/sqlx/fixtures/` (see +`FIXTURE_SCHEMA.md`), not by migrations. -## Hybrid Migration Approach +## Generated install migration **Migration 001 is generated**, not static: -- Built from `src/` using `mise run build` +- Built from `src/v3/` using `mise run build` (the self-contained `eql_v3` + surface) - Automatically copied to `migrations/001_install_eql.sql` by `mise run test:sqlx` - In `.gitignore` - never commit this file -- Ensures tests always use current EQL version +- Ensures tests always use the current EQL version -**Migrations 002-007 are static fixtures**: -- 002: ORE test data (`ore.sql`) -- 003: STE Vec test data (`ste_vec.sql`) -- 004: Test helpers (`test_helpers.sql`) -- 005: STE Vec vast data -- 006: ORE text data -- 007: Benchmark table DDL (`bench` table with 3 encrypted columns — DDL only, no rows) - -## How SQLx Uses These Migrations +## How SQLx Uses This Migration When using `#[sqlx::test]`: - Each test gets a fresh database -- All migrations (001-007) run automatically before each test -- Migration 001 contains the latest built EQL -- No need to manually reset database between tests +- Migration 001 runs automatically before each test, installing the latest + built EQL +- Per-test data comes from generated fixtures opted into via + `#[sqlx::test(fixtures(...))]` +- No need to manually reset the database between tests ## When to Manually Regenerate @@ -36,10 +33,10 @@ mise run build cp release/cipherstash-encrypt.sql tests/sqlx/migrations/001_install_eql.sql ``` -## Adding New Test Fixtures +## Adding New Test Data -To add new test data or helpers: -1. Create a new migration using the next unused number (e.g. `tests/sqlx/migrations/008_my_fixture.sql`) -2. Add your SQL fixtures -3. Commit it (static migrations are version-controlled) -4. SQLx will apply it automatically in test runs +Test data is provided by generated fixtures, not migrations. To add a new +scalar fixture, add a row to `eql-scalars::CATALOG`; the generator produces +`tests/sqlx/fixtures/eql_v3_.sql` on the next `mise run test:sqlx`. A test +opts in with `#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_")))]`. +See `tests/sqlx/fixtures/FIXTURE_SCHEMA.md`. diff --git a/tests/sqlx/tests/build_validation_tests.rs b/tests/sqlx/tests/build_validation_tests.rs index 7557987fc..8dece1f13 100644 --- a/tests/sqlx/tests/build_validation_tests.rs +++ b/tests/sqlx/tests/build_validation_tests.rs @@ -19,22 +19,22 @@ fn read_release_sql(filename: &str) -> String { #[test] fn v3_variant_file_exists() { assert!( - Path::new("../../release/cipherstash-encrypt-v3.sql").exists(), - "v3-only variant installer should exist" + Path::new("../../release/cipherstash-encrypt.sql").exists(), + "the v3 installer should exist" ); } #[test] fn v3_uninstaller_exists() { assert!( - Path::new("../../release/cipherstash-encrypt-v3-uninstall.sql").exists(), - "v3-only variant uninstaller should exist" + Path::new("../../release/cipherstash-encrypt-uninstall.sql").exists(), + "the v3 uninstaller should exist" ); } #[test] fn v3_variant_creates_eql_v3_schema() { - let sql = read_release_sql("cipherstash-encrypt-v3.sql"); + let sql = read_release_sql("cipherstash-encrypt.sql"); assert!( sql.contains("CREATE SCHEMA eql_v3"), "v3 variant must create the eql_v3 schema" @@ -43,7 +43,7 @@ fn v3_variant_creates_eql_v3_schema() { #[test] fn v3_variant_has_no_eql_v2_symbol() { - let sql = read_release_sql("cipherstash-encrypt-v3.sql"); + let sql = read_release_sql("cipherstash-encrypt.sql"); // Reject both schema-qualified refs (`eql_v2.`) and bare v2 entity names // (`eql_v2_encrypted`, `eql_v2_configuration`, …). Prose mentions like // "the eql_v2 original is unchanged" in doc comments are still allowed. @@ -55,12 +55,13 @@ fn v3_variant_has_no_eql_v2_symbol() { #[test] fn v3_variant_omits_v2_coupled_pin_search_path() { - // D11: the v3 artifact must NOT append tasks/pin_search_path.sql, which is - // eql_v2-coupled (it references public.eql_v2_encrypted / eql_v2.ste_vec_entry - // and only pins eql_v2 functions). Match the eql_v2-QUALIFIED markers: a bare - // `ste_vec_entry` substring would false-positive on the legitimate - // `eql_v3.ste_vec_entry` DOMAIN that the v3 jsonb document surface defines. - let sql = read_release_sql("cipherstash-encrypt-v3.sql"); + // The artifact appends tasks/pin_search_path_v3.sql (eql_v3-only), NOT the + // removed eql_v2-coupled tasks/pin_search_path.sql (which referenced + // public.eql_v2_encrypted / eql_v2.ste_vec_entry and only pinned eql_v2 + // functions). Match the eql_v2-QUALIFIED markers: a bare `ste_vec_entry` + // substring would false-positive on the legitimate `eql_v3.ste_vec_entry` + // DOMAIN that the v3 jsonb document surface defines. + let sql = read_release_sql("cipherstash-encrypt.sql"); assert!( !sql.contains("eql_v2.ste_vec_entry") && !sql.contains("eql_v2_encrypted"), "v3 variant must not carry the eql_v2-coupled pin_search_path script" From 6d6b1abb076667cb4a6fe8098e2a5a6bf2290b9d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 16:46:44 +1000 Subject: [PATCH 332/599] docs: point pinning-pass comments at pin_search_path_v3.sql The v2-coupled tasks/pin_search_path.sql is removed; the v3 build appends tasks/pin_search_path_v3.sql. Update the prose references in src/v3 doc comments and inlinability.rs accordingly (comment-only; no functional change). --- src/v3/common.sql | 2 +- src/v3/sem/ore_block_256/functions.sql | 2 +- .../tests/encrypted_domain/family/inlinability.rs | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/v3/common.sql b/src/v3/common.sql index 698989c7e..1470e4c7d 100644 --- a/src/v3/common.sql +++ b/src/v3/common.sql @@ -43,7 +43,7 @@ $$ LANGUAGE sql; --! @internal Mark this hand-written helper inline-critical so the post-install --! pin_search_path pass leaves it unpinned (no `SET search_path`), preserving --! SQL-function inlining. It takes a bare `jsonb` arg (not a jsonb-backed ---! encrypted DOMAIN), so the structural skip in tasks/pin_search_path.sql does +--! encrypted DOMAIN), so the structural skip in tasks/pin_search_path_v3.sql does --! not recognise it; this marker is the documented manual opt-in. COMMENT ON FUNCTION eql_v3.jsonb_array_to_bytea_array(jsonb) IS 'eql-inline-critical: per-encrypted-value ORE helper; must stay inlinable (unpinned search_path)'; diff --git a/src/v3/sem/ore_block_256/functions.sql b/src/v3/sem/ore_block_256/functions.sql index 0cd323d86..9c6c5d65c 100644 --- a/src/v3/sem/ore_block_256/functions.sql +++ b/src/v3/sem/ore_block_256/functions.sql @@ -42,7 +42,7 @@ $$ LANGUAGE sql; --! @internal Mark this hand-written helper inline-critical so the post-install --! pin_search_path pass leaves it unpinned (no `SET search_path`), preserving --! SQL-function inlining. It takes a bare `jsonb` arg (not a jsonb-backed ---! encrypted DOMAIN), so the structural skip in tasks/pin_search_path.sql does +--! encrypted DOMAIN), so the structural skip in tasks/pin_search_path_v3.sql does --! not recognise it; this marker is the documented manual opt-in. COMMENT ON FUNCTION eql_v3.jsonb_array_to_ore_block_256(jsonb) IS 'eql-inline-critical: per-encrypted-value ORE helper; must stay inlinable (unpinned search_path)'; diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index c99e6a04f..e60c6cd7c 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -73,7 +73,7 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> assert!( offenders.is_empty(), - "pin_search_path.sql pinned {} inline-critical encrypted-domain \ + "pin_search_path_v3.sql pinned {} inline-critical encrypted-domain \ SQL function(s) — index engagement is silently broken. \ Offenders (signature → proconfig):\n{}", offenders.len(), @@ -92,17 +92,17 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> /// jsonb (hmac_256, bloom_filter, the ore_cllw/has_ore_cllw extractors, the two /// per-encrypted-value `jsonb_array_to_*` helpers) arg, so they are NOT caught /// by the structural pin-skip and need explicit inline_critical allowlisting. If -/// pin_search_path.sql pins any of them, v3 functional-index inlining silently +/// pin_search_path_v3.sql pins any of them, v3 functional-index inlining silently /// regresses to Seq Scan — this test fails instead. /// /// `jsonb_array_to_bytea_array(jsonb)` and /// `jsonb_array_to_ore_block_256(jsonb)` are included here: both take a /// bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the structural -/// skip in tasks/pin_search_path.sql does not recognise them — they are kept +/// skip in tasks/pin_search_path_v3.sql does not recognise them — they are kept /// unpinned by the `eql-inline-critical` COMMENT marker instead. This test /// asserts the unpinned + inlinable-SQL state directly; the companion /// `eql_v3_sem_inline_critical_functions_carry_marker` test below asserts the -/// marker itself, so an edit that drops the marker (or a pin_search_path.sql +/// marker itself, so an edit that drops the marker (or a pin_search_path_v3.sql /// refactor that stops honouring it) fails CI even though both checks live in /// separate tests. #[sqlx::test] @@ -174,11 +174,11 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu /// Companion guard for the two bare-`jsonb` per-encrypted-value helpers /// (`jsonb_array_to_bytea_array`, `jsonb_array_to_ore_block_256`). The /// unpinned state asserted above is only DURABLE because each helper carries an -/// `eql-inline-critical` COMMENT marker that `tasks/pin_search_path.sql` honours +/// `eql-inline-critical` COMMENT marker that `tasks/pin_search_path_v3.sql` honours /// (it skips pinning functions whose `pg_description` matches /// `'eql-inline-critical%'`). Neither helper is caught by the structural /// jsonb-domain skip, so the marker is the ONLY thing keeping them unpinned — -/// an edit that removes the marker, or a pin_search_path.sql refactor that drops +/// an edit that removes the marker, or a pin_search_path_v3.sql refactor that drops /// the marker handling, would silently re-pin them and break inlining. This test /// asserts the marker is present (and the helpers are SQL/IMMUTABLE) so that /// failure surfaces here. @@ -232,7 +232,7 @@ async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result offenders.is_empty(), "eql_v3 SEM bare-jsonb helpers must carry an `eql-inline-critical` COMMENT \ marker and be inlinable SQL/IMMUTABLE — the marker is what keeps \ - pin_search_path.sql from pinning them. Offenders \ + pin_search_path_v3.sql from pinning them. Offenders \ (proname, marker, prolang, provolatile): {offenders:#?}" ); Ok(()) From 4509d5dae8121d4bbcd1b1056f327567c7b95ac2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 23:58:40 +1000 Subject: [PATCH 333/599] test(inlinability): broaden blocker guard to _jsonb/_text; link doc plan in ADR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The structural guard `encrypted_domain_blockers_are_plpgsql_and_non_strict` matched only `%encrypted_domain_unsupported_bool%`, so a `_jsonb` (`#>`, `||`, `-`) or `_text` (`#>>`, `->>`) blocker regressing to LANGUAGE sql / STRICT would escape it — even though that test exists to backstop `eql_v3.lints()` without depending on it. Broaden to `%encrypted_domain_unsupported%`, matching the `encrypted_domain_blockers` CTE in src/v3/lint/lints.sql verbatim so the two cannot drift. The jsonb-domain-arg EXISTS still excludes the shared `encrypted_domain_unsupported_*(text, text)` helpers. Also cross-link the deferred Tier-1 reference-doc rewrite plan from ADR-0001's Related section so the follow-up is discoverable. --- docs/decisions/0001-remove-eql-v2.md | 3 +++ .../sqlx/tests/encrypted_domain/family/inlinability.rs | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/decisions/0001-remove-eql-v2.md b/docs/decisions/0001-remove-eql-v2.md index b7f064c5c..302a0bf9d 100644 --- a/docs/decisions/0001-remove-eql-v2.md +++ b/docs/decisions/0001-remove-eql-v2.md @@ -80,3 +80,6 @@ provided by the `eql_v3` surface. - `CHANGELOG.md` `[Unreleased]` → `Removed` entry. - Self-containment invariant and gate: `mise run test:self_contained_v3`. +- Deferred follow-up: the Tier-1 reference-doc rewrites (README, `docs/reference/*`) + that still describe the removed `eql_v2` surface are tracked in + `docs/superpowers/plans/2026-06-22-migrate-docs-to-eql-v3.md`, not in this PR. diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index e60c6cd7c..4136a0a5b 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -316,7 +316,15 @@ async fn encrypted_domain_blockers_are_plpgsql_and_non_strict(pool: PgPool) -> R JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace JOIN pg_catalog.pg_language l ON l.oid = p.prolang WHERE n.nspname = 'eql_v3' - AND (p.prosrc LIKE '%encrypted_domain_unsupported_bool%' + -- Match every blocker helper the codegen emits — `_bool` (comparison + -- ops), `_jsonb` (`#>`, `||`, `-`), and `_text` (`#>>`, `->>`) — via + -- the broad `encrypted_domain_unsupported` prefix, kept verbatim in + -- sync with the `encrypted_domain_blockers` CTE in src/v3/lint/lints.sql + -- so the structural guard cannot be narrower than the lint it backstops. + -- The shared `encrypted_domain_unsupported_*(text, text)` helpers carry + -- the marker too but take text args, so the jsonb-domain-arg EXISTS + -- below excludes them. + AND (p.prosrc LIKE '%encrypted_domain_unsupported%' OR p.prosrc LIKE '%is not supported for%') AND EXISTS ( SELECT 1 From 02ab24bec0b4909f608a6b0d08cc336cbc5bf24d Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 22 Jun 2026 19:02:29 +1000 Subject: [PATCH 334/599] fix(eql_v3): empty-string ordered text sorts first instead of dropping out Encrypting "" as ordered text produces an empty ORE term (ob: []). The eql_v3.ore_block_256 extractor collapsed that to NULL terms (array_agg over zero rows is NULL), so compare_ore_block_256_terms returned NULL and an empty-text row silently dropped out of ORDER BY, was wrongly returned by eql_v3.max, and threw off range-query counts. The comparator's existing "empty sorts first" cardinality guard was dead code because empty ob never reached it as an empty array. Fix: COALESCE the empty array_agg to an empty ore_block_256_term[] so the extractor yields a zero-term composite. The cardinality = 0 guard now engages and orders empty before every non-empty value. Storage and equality are unaffected ("" keeps a real c and hm); a genuine SQL NULL row is unchanged (the extractor is STRICT). Tests: - ore_block_comparator_tests: empty term sorts before non-empty (unit). - sem.rs T7: characterization updated (empty ob -> non-NULL, zero terms). - v3_text_empty_order_tests + v3_text_empty fixture: end-to-end ORDER BY / min / max over text_ord with a real "" ciphertext. Proven non-vacuous by reverting the fix (max wrongly returns ""). v2 carries the identical latent bug but is being removed, so it is left unchanged (issue #262 part 2 is moot). Refs: #262 --- .gitignore | 1 + CHANGELOG.md | 2 + src/v3/sem/ore_block_256/functions.sql | 19 ++-- tests/sqlx/src/fixtures/mod.rs | 7 ++ tests/sqlx/src/fixtures/v3_text_empty.rs | 65 ++++++++++++++ .../sqlx/tests/encrypted_domain/family/sem.rs | 18 +++- tests/sqlx/tests/generate_all_fixtures.rs | 9 ++ .../sqlx/tests/ore_block_comparator_tests.rs | 42 +++++++++ tests/sqlx/tests/v3_text_empty_order_tests.rs | 86 +++++++++++++++++++ 9 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 tests/sqlx/src/fixtures/v3_text_empty.rs create mode 100644 tests/sqlx/tests/v3_text_empty_order_tests.rs diff --git a/.gitignore b/.gitignore index 87a473355..e7457dccb 100644 --- a/.gitignore +++ b/.gitignore @@ -228,6 +228,7 @@ tests/sqlx/fixtures/eql_v3* tests/sqlx/fixtures/v3_ste_vec.sql tests/sqlx/fixtures/v3_doc_int4.sql tests/sqlx/fixtures/v3_numeric_collision.sql +tests/sqlx/fixtures/v3_text_empty.sql # Generated encrypted-domain SQL — regenerated by `tasks/build.sh` from the # eql-scalars::CATALOG via `cargo run -p eql-codegen` on every build. The diff --git a/CHANGELOG.md b/CHANGELOG.md index 1299a6f01..5aeb6ebb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,8 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamptz` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) +- **An empty-string (`""`) value in an `eql_v3` ordered-text column no longer corrupts ordered queries — it now sorts first.** Encrypting `""` as ordered text produces an empty ORE term (`ob: []`); previously the `eql_v3.ore_block_256` extractor collapsed that to NULL index terms, so the comparator returned NULL and an empty-text row silently dropped out of `ORDER BY`, was wrongly returned by `eql_v3.max`, and threw off range-query counts. The empty term now yields a zero-term composite that the comparator orders **before** every non-empty value (empty sorts first), so an `""` row sorts deterministically at the low end of `text_ord` / `text_ord_ore` instead of vanishing. Storage and equality are unaffected — `""` always had a real ciphertext (`c`) and HMAC (`hm`), so it stays decryptable and `=` / `<>`-comparable; only its ordering was undefined. A genuine SQL `NULL` row is unchanged and keeps standard `NULLS FIRST` / `NULLS LAST` semantics (the extractor is `STRICT`). ([#262](https://github.com/cipherstash/encrypt-query-language/issues/262)) + ## [2.3.1] — 2026-05-21 ### Fixed diff --git a/src/v3/sem/ore_block_256/functions.sql b/src/v3/sem/ore_block_256/functions.sql index 0cd323d86..5a3dc9055 100644 --- a/src/v3/sem/ore_block_256/functions.sql +++ b/src/v3/sem/ore_block_256/functions.sql @@ -24,16 +24,25 @@ --! evaluates the array path for an array, so a non-array JSON scalar returns --! NULL here instead of raising. The sole caller (`ore_block_256`) only reaches --! this when `has_ore_block_256(val)` is true, which now requires `val->'ob'` ---! to be a JSON array, so the non-array branch is unreachable in practice; ---! empty array still returns NULL exactly as before (pinned by T7). +--! to be a JSON array, so the non-array branch is unreachable in practice. +--! An empty array (`ob: []`, what encrypting the empty string `""` produces) +--! yields a non-NULL composite with an EMPTY `terms` array — NOT NULL terms. +--! The `COALESCE` is load-bearing: `array_agg` over zero rows returns NULL, and +--! NULL terms make the comparator return NULL (so an empty-text row silently +--! drops out of ordered queries). An empty array instead engages the +--! comparator's `cardinality = 0` guard, which sorts empty BEFORE every +--! non-empty term. See issue #262 (pinned by T7). CREATE FUNCTION eql_v3.jsonb_array_to_ore_block_256(val jsonb) RETURNS eql_v3.ore_block_256 IMMUTABLE AS $$ SELECT CASE WHEN jsonb_typeof(val) = 'array' - THEN ROW(( - SELECT array_agg(ROW(b)::eql_v3.ore_block_256_term) - FROM unnest(eql_v3.jsonb_array_to_bytea_array(val)) AS b + THEN ROW(COALESCE( + ( + SELECT array_agg(ROW(b)::eql_v3.ore_block_256_term) + FROM unnest(eql_v3.jsonb_array_to_bytea_array(val)) AS b + ), + ARRAY[]::eql_v3.ore_block_256_term[] ))::eql_v3.ore_block_256 ELSE NULL END; diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 9253a1001..65c2528c2 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -46,6 +46,13 @@ pub mod v3_doc_int4; // (committed-fixture) home instead of a creds-gated runtime encryption. pub mod v3_numeric_collision; +// The empty-string ordered-text fixture (`""`, `"frank"`, `"zebra"`). Not a +// CATALOG scalar — `eql-scalars::TEXT_FIXTURES` deliberately excludes `""` +// (issue #262) — so it is hand-written and registered here directly (like the +// other `v3_` fixtures). Gives the "empty sorts first" contract (ORDER BY / +// min / max over `text_ord`) a committed real-ciphertext home. +pub mod v3_text_empty; + // Per-type "doubles" fixtures (each plaintext encrypted twice) for the // cross-ciphertext-equality test. Non-catalog, like `v3_numeric_collision`. pub mod eql_doubles; diff --git a/tests/sqlx/src/fixtures/v3_text_empty.rs b/tests/sqlx/src/fixtures/v3_text_empty.rs new file mode 100644 index 000000000..73b35c7fd --- /dev/null +++ b/tests/sqlx/src/fixtures/v3_text_empty.rs @@ -0,0 +1,65 @@ +//! The `v3_text_empty` fixture — the empty string `""` plus two non-empty +//! controls, encrypted as ordered text. +//! +//! Hand-written, non-catalog (like `v3_numeric_collision`), because the +//! catalog-driven `eql_v2_text` fixture deliberately EXCLUDES `""`: encrypting +//! the empty string yields an empty ORE term (`ob: []`) whose ordering was +//! undefined (issue #262), so `eql-scalars::TEXT_FIXTURES` drops it. This +//! bespoke fixture is the one place `""` can live, giving the end-to-end +//! "empty sorts first" contract (ORDER BY / min / max) a real-ciphertext home. +//! +//! Rows are addressed by `id` (1-based insertion ordinal): `"" → 1`, +//! `"frank" → 2`, `"zebra" → 3`. The contract under test: `""` sorts BEFORE +//! both non-empty values, so `eql_v3.min` returns the `id = 1` (`""`) payload +//! and `eql_v3.max` returns the `id = 3` (`"zebra"`) payload. +//! +//! Gitignored output: tests/sqlx/fixtures/v3_text_empty.sql +//! (regenerated by `mise run fixture:generate:all`). + +use anyhow::Result; + +use super::index_kind::IndexKind; +use super::spec::FixtureSpec; + +/// The committed fixture name → table `fixtures.v3_text_empty`, script +/// `v3_text_empty.sql`, SQLx ref `scripts("v3_text_empty")`. +const NAME: &str = "v3_text_empty"; + +/// The fixture plaintexts, in insertion order. `id` is the 1-based ordinal, so +/// `"" → 1`, `"frank" → 2`, `"zebra" → 3`. The empty string is the value with +/// no ORE term; the two non-empty controls prove `min`/`max`/ORDER BY return +/// real values around it (not a degenerate everything-collides). +fn values() -> Vec { + ["", "frank", "zebra"] + .iter() + .map(|s| s.to_string()) + .collect() +} + +/// Generate `tests/sqlx/fixtures/v3_text_empty.sql`. Encrypts the three strings +/// as ordered text (Unique drives the `hm` equality term, Ore drives the `ob` +/// order term — empty for `""`) via the standard `.run()` driver. +pub async fn generate() -> Result<()> { + let values = values(); + FixtureSpec::new(NAME) + .with_index(IndexKind::Unique) + .with_index(IndexKind::Ore) + .with_values(&values) + .run() + .await +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty_is_first_and_controls_are_ordered() { + let v = values(); + assert_eq!(v.len(), 3, "fixture is [\"\", \"frank\", \"zebra\"]"); + assert!(v[0].is_empty(), "id 1 must be the empty string"); + assert!(!v[1].is_empty() && !v[2].is_empty(), "controls are non-empty"); + // The controls are strictly ordered so max is unambiguous. + assert!(v[1] < v[2], "\"frank\" must order before \"zebra\""); + } +} diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index d13847e5f..2852ffc06 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -335,7 +335,11 @@ async fn jsonb_array_to_bytea_array_input_shapes(pool: PgPool) -> Result<()> { /// across the same three input shapes. Safety net for the same plpgsql→sql /// inlining refactor. Behaviour pinned: /// - JSON null (`'null'`) → NULL composite -/// - empty array (`'[]'`) → NULL composite (inner array_agg is NULL) +/// - empty array (`'[]'`) → non-NULL composite with ZERO terms (issue #262). +/// An empty `ob` is what encrypting the empty string `""` produces; it must +/// stay comparable so it sorts first, not collapse to NULL terms and drop +/// out of ordered queries. The inner `array_agg`'s NULL is coalesced to an +/// empty `ore_block_256_term[]`. /// - populated array → non-NULL composite with one term per element /// /// Same documented delta as T6 for a non-array JSON scalar. @@ -359,12 +363,20 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { .await?; assert!(is_null, "JSON null must yield NULL composite"); - // Empty array → NULL composite. + // Empty array → non-NULL composite with ZERO terms (issue #262). The empty + // `ob` from encrypting `""` must remain comparable (so it sorts first via the + // comparator's cardinality guard) rather than collapsing to NULL terms. let is_null: bool = sqlx::query_scalar("SELECT eql_v3.jsonb_array_to_ore_block_256('[]'::jsonb) IS NULL") .fetch_one(&pool) .await?; - assert!(is_null, "empty JSON array must yield NULL composite"); + assert!(!is_null, "empty JSON array must yield a non-NULL composite"); + let term_count: i32 = sqlx::query_scalar( + "SELECT cardinality((eql_v3.jsonb_array_to_ore_block_256('[]'::jsonb)).terms)", + ) + .fetch_one(&pool) + .await?; + assert_eq!(term_count, 0, "empty JSON array must yield a zero-term composite"); // Single-element array → non-NULL composite with exactly 1 term. let term_count: i32 = sqlx::query_scalar( diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index 1dbfdeae0..64f1e5d72 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -59,6 +59,15 @@ async fn generate_all() -> anyhow::Result<()> { eql_tests::fixtures::v3_numeric_collision::generate().await?; eprintln!("Regenerated v3_numeric_collision."); + // The empty-string ordered-text fixture (`""`, `"frank"`, `"zebra"`). Not a + // CATALOG scalar — `eql-scalars::TEXT_FIXTURES` excludes `""` (issue #262) — + // so it rides the same pipeline as a hand-written `FixtureSpec`. + // Gives the "empty sorts first" contract (ORDER BY / min / max) a committed + // real-ciphertext home. + eprintln!("Generating fixture v3_text_empty (empty-string ordered text)..."); + eql_tests::fixtures::v3_text_empty::generate().await?; + eprintln!("Regenerated v3_text_empty."); + // Per-type "doubles" fixtures (each plaintext encrypted twice) for the // credential-free cross-ciphertext-equality test. Non-catalog (the catalog // fixture is the curated set exactly), generated through the same pipeline. diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index 320c1a293..b839c3729 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -187,6 +187,48 @@ async fn comparator_rejects_mismatched_block_widths(pool: PgPool) -> Result<()> Ok(()) } +/// An empty ORE term — what encrypting the empty string `""` produces (`ob: []`, +/// verified against cipherstash-client) — sorts BEFORE any non-empty term and +/// equals itself. The extractor must yield an empty-terms composite (cardinality +/// 0), which the comparator's empty-array guard orders first; previously the +/// inner `array_agg` collapsed to NULL terms, so the comparator returned NULL +/// and the row silently dropped out of ordered queries. See issue #262. +/// +/// Creds-free: the empty side carries no ciphertext, and the non-empty +/// comparand's bytes are never inspected — the cardinality short-circuit fires +/// ahead of any term-level comparison, so a synthetic one-term composite is +/// sufficient. +#[sqlx::test] +async fn empty_ore_term_sorts_before_non_empty(pool: PgPool) -> Result<()> { + // Empty `ob` taken through the real extractor path (the buggy site). + let empty = "eql_v3.ore_block_256('{\"ob\": []}'::jsonb)"; + // A non-empty composite: one synthetic valid-width term; content irrelevant. + let non_empty = format!("ROW(ARRAY[{}])::eql_v3.ore_block_256", term_sql('a', 408)); + + let lt: Option = sqlx::query_scalar(&format!( + "SELECT eql_v3.compare_ore_block_256_terms({empty}, {non_empty})" + )) + .fetch_one(&pool) + .await?; + assert_eq!(lt, Some(-1), "empty ORE term must sort before a non-empty term"); + + let gt: Option = sqlx::query_scalar(&format!( + "SELECT eql_v3.compare_ore_block_256_terms({non_empty}, {empty})" + )) + .fetch_one(&pool) + .await?; + assert_eq!(gt, Some(1), "a non-empty term must sort after an empty ORE term"); + + let eq: Option = sqlx::query_scalar(&format!( + "SELECT eql_v3.compare_ore_block_256_terms({empty}, {empty})" + )) + .fetch_one(&pool) + .await?; + assert_eq!(eq, Some(0), "two empty ORE terms must compare equal"); + + Ok(()) +} + /// Sweep the `49*N + 16` length guard across boundary/off-by lengths the /// point-example tests above don't reach. Both operands are kept the SAME length /// so only the malformed-length guard can fire (the different-lengths guard at diff --git a/tests/sqlx/tests/v3_text_empty_order_tests.rs b/tests/sqlx/tests/v3_text_empty_order_tests.rs new file mode 100644 index 000000000..b9d8a9d3f --- /dev/null +++ b/tests/sqlx/tests/v3_text_empty_order_tests.rs @@ -0,0 +1,86 @@ +//! End-to-end "empty sorts first" contract for `eql_v3.text_ord` (issue #262). +//! +//! Encrypting the empty string `""` as ordered text produces an empty ORE term +//! (`ob: []`, verified against cipherstash-client). Previously that collapsed to +//! NULL comparator output, so an empty-text row silently dropped out of ordered +//! queries (`ORDER BY` lost it, `max` wrongly returned it, counts went off by +//! one). The fix gives the empty term a deterministic position — it sorts BEFORE +//! every non-empty value — by yielding a zero-term composite the comparator's +//! cardinality guard orders first. +//! +//! These tests ride the committed `v3_text_empty` fixture (real ciphertexts for +//! `""`, `"frank"`, `"zebra"`; ids 1/2/3) and exercise the full user-facing +//! surface: `ORDER BY` (ASC/DESC) and the `min`/`max` aggregates over the +//! `text_ord` domain. The ordering key is the canonical +//! `eql_v3.ord_term((payload)::eql_v3.text_ord)`, matching the scalar matrix. + +use anyhow::Result; +use sqlx::PgPool; + +/// `ORDER BY` ascending must place `""` first, then the non-empty values in +/// lexical order. Before the fix the `""` row produced a NULL sort key and +/// dropped out of the result entirely. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn order_by_asc_sorts_empty_first(pool: PgPool) -> Result<()> { + let actual: Vec = sqlx::query_scalar( + "SELECT plaintext FROM fixtures.v3_text_empty \ + ORDER BY eql_v3.ord_term((payload)::eql_v3.text_ord) ASC", + ) + .fetch_all(&pool) + .await?; + assert_eq!( + actual, + vec!["".to_string(), "frank".to_string(), "zebra".to_string()], + "empty string must sort first under ASC, then frank, then zebra" + ); + Ok(()) +} + +/// `ORDER BY` descending mirrors it: `""` lands last (it is the minimum). +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn order_by_desc_sorts_empty_last(pool: PgPool) -> Result<()> { + let actual: Vec = sqlx::query_scalar( + "SELECT plaintext FROM fixtures.v3_text_empty \ + ORDER BY eql_v3.ord_term((payload)::eql_v3.text_ord) DESC", + ) + .fetch_all(&pool) + .await?; + assert_eq!( + actual, + vec!["zebra".to_string(), "frank".to_string(), "".to_string()], + "empty string must sort last under DESC" + ); + Ok(()) +} + +/// `eql_v3.min` over `text_ord` must return the `""` payload (the minimum), +/// recovered to its plaintext via the fixture's `payload` column. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn min_returns_the_empty_string(pool: PgPool) -> Result<()> { + let plaintext: String = sqlx::query_scalar( + "SELECT plaintext FROM fixtures.v3_text_empty WHERE payload = (\ + SELECT eql_v3.min(payload::eql_v3.text_ord)::jsonb FROM fixtures.v3_text_empty)", + ) + .fetch_one(&pool) + .await?; + assert_eq!(plaintext, "", "min over text_ord must be the empty string"); + Ok(()) +} + +/// `eql_v3.max` must return the largest real value (`"zebra"`), NOT the empty +/// string. Before the fix `max` wrongly returned the `""` payload because the +/// NULL comparison never displaced the empty state. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn max_returns_the_largest_value_not_empty(pool: PgPool) -> Result<()> { + let plaintext: String = sqlx::query_scalar( + "SELECT plaintext FROM fixtures.v3_text_empty WHERE payload = (\ + SELECT eql_v3.max(payload::eql_v3.text_ord)::jsonb FROM fixtures.v3_text_empty)", + ) + .fetch_one(&pool) + .await?; + assert_eq!( + plaintext, "zebra", + "max over text_ord must be the largest real value, not the empty string" + ); + Ok(()) +} From 047097f34d12b28b4e55d8a0a0aa161e10be504e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 08:55:07 +1000 Subject: [PATCH 335/599] style(test): rustfmt wrap over-long assert macros in v3 empty-text suite --- tests/sqlx/src/fixtures/v3_text_empty.rs | 5 ++++- tests/sqlx/tests/encrypted_domain/family/sem.rs | 5 ++++- tests/sqlx/tests/ore_block_comparator_tests.rs | 12 ++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/tests/sqlx/src/fixtures/v3_text_empty.rs b/tests/sqlx/src/fixtures/v3_text_empty.rs index 73b35c7fd..9091cd235 100644 --- a/tests/sqlx/src/fixtures/v3_text_empty.rs +++ b/tests/sqlx/src/fixtures/v3_text_empty.rs @@ -58,7 +58,10 @@ mod tests { let v = values(); assert_eq!(v.len(), 3, "fixture is [\"\", \"frank\", \"zebra\"]"); assert!(v[0].is_empty(), "id 1 must be the empty string"); - assert!(!v[1].is_empty() && !v[2].is_empty(), "controls are non-empty"); + assert!( + !v[1].is_empty() && !v[2].is_empty(), + "controls are non-empty" + ); // The controls are strictly ordered so max is unambiguous. assert!(v[1] < v[2], "\"frank\" must order before \"zebra\""); } diff --git a/tests/sqlx/tests/encrypted_domain/family/sem.rs b/tests/sqlx/tests/encrypted_domain/family/sem.rs index 2852ffc06..7427338ae 100644 --- a/tests/sqlx/tests/encrypted_domain/family/sem.rs +++ b/tests/sqlx/tests/encrypted_domain/family/sem.rs @@ -376,7 +376,10 @@ async fn jsonb_array_to_ore_block_input_shapes(pool: PgPool) -> Result<()> { ) .fetch_one(&pool) .await?; - assert_eq!(term_count, 0, "empty JSON array must yield a zero-term composite"); + assert_eq!( + term_count, 0, + "empty JSON array must yield a zero-term composite" + ); // Single-element array → non-NULL composite with exactly 1 term. let term_count: i32 = sqlx::query_scalar( diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index b839c3729..ab6281b3c 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -210,14 +210,22 @@ async fn empty_ore_term_sorts_before_non_empty(pool: PgPool) -> Result<()> { )) .fetch_one(&pool) .await?; - assert_eq!(lt, Some(-1), "empty ORE term must sort before a non-empty term"); + assert_eq!( + lt, + Some(-1), + "empty ORE term must sort before a non-empty term" + ); let gt: Option = sqlx::query_scalar(&format!( "SELECT eql_v3.compare_ore_block_256_terms({non_empty}, {empty})" )) .fetch_one(&pool) .await?; - assert_eq!(gt, Some(1), "a non-empty term must sort after an empty ORE term"); + assert_eq!( + gt, + Some(1), + "a non-empty term must sort after an empty ORE term" + ); let eq: Option = sqlx::query_scalar(&format!( "SELECT eql_v3.compare_ore_block_256_terms({empty}, {empty})" From b9cd993a72709c69f8e5d3d932a15c48ee572ba3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 10:08:17 +1000 Subject: [PATCH 336/599] feat(v3): add eql_v3.version(), revive --version build flag Port version introspection to the self-contained eql_v3 surface after the eql_v2 removal dropped eql_v2.version() (and left tasks/build.sh's --version flag consumed nowhere). - src/v3/version.template: eql_v3.version() returns bare-semver text, plus a COMMENT ON SCHEMA eql_v3 marker for obj_description() discoverability. REQUIRE src/v3/schema.sql only; self-contained, no eql_v2 symbols. The generated src/v3/version.sql is gitignored like the other v3 SQL. - tasks/build.sh: sed-substitute the template before the v3 glob, reviving the --version flag (usage_version, DEV fallback). - release workflows: pass prefix-stripped bare semver to --version; fix the stale 'eql_v2.version() byte-identical' comment. - CHANGELOG/ADR-0001: document the re-home (not a silent drop). version() is pinned by pin_search_path_v3.sql (not inline-critical), so the splinter function_search_path_mutable lint does not flag it. User-facing doc repointing is owned by the migrate-docs-to-eql-v3 branch. --- .github/workflows/release-eql.yml | 7 +++- .../workflows/release-postgres-eql-image.yml | 7 ++-- .gitignore | 5 ++- CHANGELOG.md | 1 + docs/decisions/0001-remove-eql-v2.md | 4 ++ src/v3/version.template | 39 +++++++++++++++++++ tasks/build.sh | 12 +++++- 7 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 src/v3/version.template diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml index d96881c1d..286628d21 100644 --- a/.github/workflows/release-eql.yml +++ b/.github/workflows/release-eql.yml @@ -63,8 +63,13 @@ jobs: cache: true # [default: true] cache mise using GitHub's cache - name: Build EQL release + # Strip the `eql-` tag prefix so eql_v3.version() reports bare semver + # (e.g. "3.0.0"). Non-release events (workflow_dispatch / PR) have no + # tag, so TAG is empty and the build falls back to its DEV default. + env: + TAG: ${{ github.event.release.tag_name }} run: | - mise run build --version ${{github.event.release.tag_name}} + mise run build --version "${TAG#eql-}" - name: Upload EQL artifacts uses: actions/upload-artifact@v4 diff --git a/.github/workflows/release-postgres-eql-image.yml b/.github/workflows/release-postgres-eql-image.yml index 9bf17c4d5..4feddd2eb 100644 --- a/.github/workflows/release-postgres-eql-image.yml +++ b/.github/workflows/release-postgres-eql-image.yml @@ -38,8 +38,9 @@ jobs: outputs: # Used for image tags, e.g. "2.1.8" -> ghcr.io/.../postgres-eql:17-2.1.8 eql_version: ${{ steps.ver.outputs.eql_version }} - # Passed to `mise run build --version`. Matches the existing release-eql.yml - # convention so eql_v2.version() in the image is byte-identical to the SQL release. + # Passed to `mise run build --version`. Bare semver (no `eql-` prefix), + # matching release-eql.yml, so eql_v3.version() in the image is + # byte-identical to the SQL release. build_version: ${{ steps.ver.outputs.build_version }} update_floating_tags: ${{ steps.ver.outputs.update_floating_tags }} @@ -61,8 +62,8 @@ jobs: INPUT_FLOATING: ${{ inputs.update_floating_tags }} run: | if [[ "$EVENT_NAME" == "release" ]]; then - build_version="$RELEASE_TAG" # e.g. "eql-2.1.8" eql_version="${RELEASE_TAG#eql-}" # e.g. "2.1.8" + build_version="$eql_version" # bare semver for eql_v3.version() floating="true" else eql_version="$INPUT_VERSION" diff --git a/.gitignore b/.gitignore index 87a473355..22ce4fdd4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,10 @@ deps-ordered-supabase.txt src/deps-v3.txt src/deps-ordered-v3.txt -# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore +# Generated by tasks/build.sh from src/v3/version.template (eql_v3.version()). +src/v3/version.sql -src/version.sql +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore diff --git a/CHANGELOG.md b/CHANGELOG.md index 53d78d00a..0afb08c53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added +- **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed. See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). - **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) - **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) diff --git a/docs/decisions/0001-remove-eql-v2.md b/docs/decisions/0001-remove-eql-v2.md index 302a0bf9d..9882b13c2 100644 --- a/docs/decisions/0001-remove-eql-v2.md +++ b/docs/decisions/0001-remove-eql-v2.md @@ -60,6 +60,10 @@ The supported searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` surface. +Version introspection is **re-homed, not dropped**: `eql_v2.version()` is +replaced by `eql_v3.version()` (bare-semver text, also published as the +`eql_v3` schema comment), baked in at build time the same way. + ## Consequences - **This is a major (3.0.0) break of the public API.** Callers using the diff --git a/src/v3/version.template b/src/v3/version.template new file mode 100644 index 000000000..0849b0b08 --- /dev/null +++ b/src/v3/version.template @@ -0,0 +1,39 @@ +-- AUTOMATICALLY GENERATED FILE +-- Source is src/v3/version.template +-- REQUIRE: src/v3/schema.sql + +DROP FUNCTION IF EXISTS eql_v3.version(); + +--! @file v3/version.sql +--! @brief EQL version reporting (self-contained eql_v3 surface) +--! +--! This file is auto-generated from src/v3/version.template during build. +--! The $RELEASE_VERSION placeholder is replaced with the actual release +--! version (bare semver, e.g. "3.0.0") supplied via `mise run build --version`, +--! or "DEV" for development builds. + +--! @brief Get the installed EQL version string +--! +--! Returns the version string for the installed EQL library. This value is +--! baked in at build time from the release tag. +--! +--! @return text Version string (e.g. "3.0.0" or "DEV" for development builds) +--! +--! @note Auto-generated during build from src/v3/version.template +--! +--! @example +--! -- Check installed EQL version +--! SELECT eql_v3.version(); +--! -- Returns: '3.0.0' +CREATE FUNCTION eql_v3.version() + RETURNS text + IMMUTABLE STRICT PARALLEL SAFE +AS $$ + SELECT '$RELEASE_VERSION'; +$$ LANGUAGE SQL; + +--! @brief Schema-level version marker for obj_description() discoverability +--! +--! Mirrors eql_v3.version() as a comment on the schema so the installed +--! version can also be read via obj_description('eql_v3'::regnamespace). +COMMENT ON SCHEMA eql_v3 IS '$RELEASE_VERSION'; diff --git a/tasks/build.sh b/tasks/build.sh index 4c10d7396..9fde04a1b 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" -#MISE sources=["src/v3/**/*.sql", "tasks/pin_search_path_v3.sql", "tasks/uninstall-v3.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] +#MISE sources=["src/v3/**/*.sql", "src/v3/version.template", "tasks/pin_search_path_v3.sql", "tasks/uninstall-v3.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] #MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" @@ -80,6 +80,16 @@ rm -f release/cipherstash-encrypt-uninstall.sql rm -f src/deps-v3.txt rm -f src/deps-ordered-v3.txt +rm -f src/v3/version.sql + + +# Bake the release version into eql_v3.version() (and the eql_v3 schema +# comment) before the glob below picks it up. The version is supplied via +# `mise run build --version ` (the `usage_version` env var mise derives +# from the #USAGE flag); local builds with no flag fall back to DEV. The +# generated src/v3/version.sql is gitignored, like the other generated v3 SQL. +RELEASE_VERSION=${usage_version:-DEV} +sed "s/\$RELEASE_VERSION/$RELEASE_VERSION/g" src/v3/version.template > src/v3/version.sql # The self-contained eql_v3 surface — schema, SEM types, scalar domains — From a7b29b598c15b203a6f392a93ec5110495e95c57 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 10:42:05 +1000 Subject: [PATCH 337/599] chore(test): remove eql_v2 residue from v3 test/tooling surface - v3_jsonb_operator_surface_tests: drop dead eql_v2_encrypted exclusion subqueries (composite type removed -> subquery is always-true) and the now-stale explanatory comment - xml-to-markdown.py: make the operator-schema match v3-aware (['eql_v2','public'] -> add 'eql_v3') so v3-only doc generation resolves eql_v3 operator names - matrix.rs: fix now-false comment claiming the generic eql_v2_encrypted MIN/MAX overload is reachable via cast (overload removed); logic unchanged - eql_plaintext.rs: reword Cast doc-comment off the removed eql_v2.add_search_config reference --- tasks/docs/generate/xml-to-markdown.py | 2 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 5 +++-- tests/sqlx/src/matrix.rs | 10 ++++------ tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs | 7 +------ 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/tasks/docs/generate/xml-to-markdown.py b/tasks/docs/generate/xml-to-markdown.py index a704492c1..02ce371b5 100755 --- a/tasks/docs/generate/xml-to-markdown.py +++ b/tasks/docs/generate/xml-to-markdown.py @@ -194,7 +194,7 @@ def process_function(memberdef): # For SQL operators, Doxygen uses schema name as function name # Extract actual operator from brief description brief_elem = memberdef.find('briefdescription') - if func_name in ['eql_v2', 'public'] and brief_elem is not None: + if func_name in ['eql_v2', 'eql_v3', 'public'] and brief_elem is not None: brief_para = brief_elem.find('para') if brief_para is not None and brief_para.text: # Check if brief starts with an operator (like "->>" or "->") diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index d5d0b5176..234c14906 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -16,8 +16,9 @@ use std::fmt; use cipherstash_client::encryption::Plaintext; use eql_scalars::ScalarKind; -/// The `cast_as` argument for `eql_v2.add_search_config`. The field is -/// private so the allowlist is the set of `pub const`s below. +/// The `cast_as` argument identifying a plaintext's target SQL type for +/// encryption. The field is private so the allowlist is the set of +/// `pub const`s below. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Cast(&'static str); diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index eae042a9c..3f945d73d 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -3355,12 +3355,10 @@ macro_rules! __scalar_matrix_aggregate_typecheck_case { $agg_fn, d, )); // 42883 = undefined_function (no overload defined at all); - // 42725 = ambiguous_function (multiple overloads resolve, - // none specific to this variant). Either confirms the - // variant carries no MIN/MAX of its own — the generic - // eql_v2_encrypted overload is reachable via cast but - // can't be resolved unambiguously from a domain-typed - // column. Both outcomes are acceptable "not supported". + // 42725 = ambiguous_function (multiple non-variant-specific + // overloads resolve, none specific to this variant). Both + // outcomes confirm the variant carries no MIN/MAX of its own + // and are acceptable "not supported". let db_err = err.as_database_error() .expect("expected database error from typecheck probe"); let code = db_err.code(); diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs index 810d12a33..7708d3d75 100644 --- a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -65,17 +65,12 @@ fn norm(ty: &str) -> String { #[sqlx::test] async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<()> { - // Native jsonb operator symbols (left OR right operand is plaintext jsonb), - // excluding EQL's own cross-type operators on the legacy `eql_v2_encrypted` - // composite (those take a jsonb operand but are not native and unreachable - // from a v3 domain). + // Native jsonb operator symbols (left OR right operand is plaintext jsonb). let native: Vec = sqlx::query_scalar( r#" SELECT DISTINCT o.oprname FROM pg_catalog.pg_operator o WHERE (o.oprleft = 'jsonb'::regtype OR o.oprright = 'jsonb'::regtype) - AND o.oprleft NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') - AND o.oprright NOT IN (SELECT oid FROM pg_catalog.pg_type WHERE typname = 'eql_v2_encrypted') ORDER BY 1 "#, ) From 813cf33e6553f5e44aff58ac71c57d3968b0fce9 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:00:27 +1000 Subject: [PATCH 338/599] test(docs): add grep gate for eql_v2 references in user-facing docs --- tasks/test/docs_v3_grep.sh | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 tasks/test/docs_v3_grep.sh diff --git a/tasks/test/docs_v3_grep.sh b/tasks/test/docs_v3_grep.sh new file mode 100755 index 000000000..7a87ecd4f --- /dev/null +++ b/tasks/test/docs_v3_grep.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +#MISE description="Fail if any user-facing doc still references the removed eql_v2 surface" + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO_ROOT" + +# Tier-1 user-facing docs that MUST be eql_v2-free after the eql_v3 migration. +# A file deleted by the migration (e.g. index-config.md) is simply skipped. +TIER1=( + "README.md" + "docs/README.md" + "docs/reference/eql-functions.md" + "docs/reference/query-performance.md" + "docs/reference/database-indexes.md" + "docs/tutorials/proxy-configuration.md" + "docs/reference/json-support.md" + "docs/reference/sql-support.md" + "docs/reference/index-config.md" + "docs/reference/adding-a-scalar-encrypted-domain-type.md" +) + +# Tier-2 docs are retained on purpose and deliberately NOT checked: +# docs/upgrading/v2.3.md historical upgrade guide *for v2.3* +# docs/decisions/0001-remove-eql-v2.md the ADR describing the removal +# Their eql_v2 references are correct and must stay. + +status=0 +for f in "${TIER1[@]}"; do + [ -f "$f" ] || continue + if hits=$(grep -nE 'eql_v2' "$f"); then + echo "FAIL: $f still references eql_v2:" >&2 + echo "$hits" >&2 + status=1 + fi +done + +if [ "$status" -eq 0 ]; then + echo "OK: no Tier-1 doc references eql_v2." +fi +exit "$status" From 93c591a1c038d7b4f73b3ed6ee1f18e69ff61b52 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:03:22 +1000 Subject: [PATCH 339/599] docs(sql-support): re-author capability matrix onto eql_v3 domain variants and eql_v3.json --- docs/reference/sql-support.md | 231 ++++++++++++++++------------------ 1 file changed, 108 insertions(+), 123 deletions(-) diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index 9cd7e5449..778832359 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -1,179 +1,164 @@ # SQL support matrix for EQL -This page summarises which SQL operators and language features work against `eql_v2_encrypted` columns/values, and which EQL searchable-encryption index (configured via [`eql_v2.add_search_config`](./index-config.md)) each one requires. +This page summarises which SQL operators and language features work against EQL-encrypted columns, and which encrypted-domain **type** each one requires. -EQL ships five search index kinds that encrypt data in ways that preserve specific query capabilities: +EQL ships its searchable-encryption surface as PostgreSQL **domains in the `eql_v3` schema**: -| Search index (config `index_name`) | Underlying encrypted term(s) | Enables | -| ---------------------------------- | ---------------------------- | ------------------------------------------------------ | -| `unique` | `hmac_256` (`hm`) | Exact equality | -| `ore` | `ore_block_u64_8_256` (`ob`) | Ordered comparison (`<`, `<=`, `=`, `>`, `>=`), range (`BETWEEN`), `ORDER BY`, aggregates (`MIN`/`MAX`) | -| `ope` | `ope_cllw_u64_65` (`opf`) or `ope_cllw_var_8` (`opv`) | Ordered comparison (`<`, `<=`, `=`, `>`, `>=`), range (`BETWEEN`), `ORDER BY`, aggregates (`MIN`/`MAX`) — see note below | -| `match` | `bloom_filter` (`bf`) | Substring / token matching via `LIKE` / `ILIKE` | -| `ste_vec` | Structured encryption (`sv`) | JSONB containment and JSONB path / field access | +- **per-scalar encrypted-domain types** — `eql_v3.int4`, `eql_v3.text`, `eql_v3.timestamptz`, … — one family of domain *variants* per scalar; and +- **an encrypted-JSON document type** — `eql_v3.json` — for structured-encryption (ste_vec) JSONB. -> **`ore` vs `ope`** — both index kinds support the same ordered-comparison surface. `ore` (Order-Revealing Encryption) is the default. `ope` (CLWW Order-Preserving Encryption) is an alternative for environments that need plain lexicographic byte comparison (e.g. pluggable storage that cannot run a custom comparator). On a column configured for `ope`, `eql_v2.compare()` and the `<` / `<=` / `>` / `>=` operators dispatch to OPE terms automatically. - - -Every column must also be registered with `eql_v2.add_column(...)` — that alone gives the column storage and decryption, but none of the operators below will produce results until at least one search index is added for the operation you need. +The capability of a column is fixed by the **domain variant you type it as**. There is no database-side `add_search_config` / `add_column` step: which index terms travel in a value's payload is decided by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs)), and the column's domain variant is what makes the matching operators resolve. Unsupported operators are not silent no-ops — they route to blocker functions that `RAISE` an "operator not supported" exception (a `NULL` operand still raises; the blockers are deliberately not `STRICT`). --- -## SQL operator support +## Encrypted-domain scalar types (`eql_v3.`) -Each row lists an operator that EQL either implements natively on `eql_v2_encrypted` or that CipherStash Proxy rewrites into an EQL equivalent. A ✅ means the operator is supported on a column when that index is configured. A ❌ means the index does not support the operator (the database will either error, return no rows, or fall back to a scan that decrypts nothing useful). - -| SQL operator | Meaning | `unique` | `ore` | `ope` | `match` | `ste_vec` | -| --------------------------------- | ------------------------------- | :------: | :---: | :---: | :-----: | :-------: | -| `=` | Equality | ✅ | ✅ | ✅ | ❌ | ❌ | -| `<>` / `!=` | Inequality | ✅ | ✅ | ✅ | ❌ | ❌ | -| `<` | Less than | ❌ | ✅ | ✅ | ❌ | ❌ | -| `<=` | Less than or equal | ❌ | ✅ | ✅ | ❌ | ❌ | -| `>` | Greater than | ❌ | ✅ | ✅ | ❌ | ❌ | -| `>=` | Greater than or equal | ❌ | ✅ | ✅ | ❌ | ❌ | -| `LIKE` (`~~`) | Case-sensitive pattern match | ❌ | ❌ | ❌ | ✅ | ❌ | -| `NOT LIKE` (`!~~`) | Negated case-sensitive match | ❌ | ❌ | ❌ | ✅ | ❌ | -| `ILIKE` (`~~*`) | Case-insensitive pattern match | ❌ | ❌ | ❌ | ✅\* | ❌ | -| `NOT ILIKE` (`!~~*`) | Negated case-insensitive match | ❌ | ❌ | ❌ | ✅\* | ❌ | -| `@>` | JSONB contains | ❌ | ❌ | ❌ | ❌ | ✅ | -| `<@` | JSONB is contained by | ❌ | ❌ | ❌ | ❌ | ✅ | -| `->` (text, int, encrypted) | JSONB field / element access | ❌ | ❌ | ❌ | ❌ | ✅ | -| `->>` | JSONB field as text (ciphertext) | ❌ | ❌ | ❌ | ❌ | ✅ | -| `IS NULL` / `IS NOT NULL` | Null check | ✅ | ✅ | ✅ | ✅ | ✅ | - -\* Case-insensitivity for `ILIKE` / `NOT ILIKE` is only effective when the `match` index is configured with a case-normalising token filter (e.g. `{"token_filters": [{"kind": "downcase"}]}`). Without it, `ILIKE` behaves identically to `LIKE` on the encrypted terms. +Each scalar type `` is a family of `jsonb`-backed domains in `eql_v3`. The catalog scalar tokens that ship today are: -Notes: +`int2`, `int4`, `int8`, `numeric`, `float4`, `float8`, `date`, `timestamptz`, `text`, `bool`. -- Binary operators have overloads that accept `jsonb` literals on either side; CipherStash Proxy typically rewrites those to `::eql_v2_encrypted` casts so the encrypted operator is selected. -- `=` and `<>` on a column that has **only** a `ste_vec` index will not match anything useful — the underlying comparison requires `hm`, `ob`, `opf`, or `opv` terms. Configure `unique` (or `ore` / `ope`) alongside `ste_vec` if you need equality on the outer value. -- JSONB path operators (`->`, `->>`) return an `eql_v2_encrypted` value (or ciphertext for `->>`). The value they return is itself searchable only if the parent `ste_vec` index covers that path. +(See [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md) for how the family is generated.) The domains live in the `eql_v3` schema — `DROP SCHEMA eql_v3 CASCADE` removes them — and their extracted index-term types are the self-contained `eql_v3` SEM types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.bloom_filter`). -### Unsupported JSONB operators +Every scalar generates a storage-only variant plus the query variants its capabilities allow: -The following PostgreSQL JSONB operators are **not** implemented for `eql_v2_encrypted`. +| Domain variant | Index term carried | Extractor (for indexing) | `=` `<>` | `<` `<=` `>` `>=` | `MIN` / `MAX` | `@>` `<@` | +| ----------------------------- | ------------------------- | ------------------------ | :------: | :---------------: | :-----------: | :-------: | +| `eql_v3.` | none (storage only) | — | ❌ | ❌ | ❌ | ❌ | +| `eql_v3._eq` | `hm` (hmac_256) | `eql_v3.eq_term(col)` | ✅ | ❌ | ❌ | ❌ | +| `eql_v3._ord` / `_ord_ore` | `ob` (ore_block_256) | `eql_v3.ord_term(col)` | ✅ | ✅ | ✅ | ❌ | +| `eql_v3.text_match` | `bf` (bloom_filter) | `eql_v3.match_term(col)` | ❌ | ❌ | ❌ | ✅\* | +| `eql_v3.text_search` | `hm` + `ob` + `bf` | all three extractors | ✅ | ✅ | ✅ | ✅\* | -`?`, `?&`, `?|`, `@?`, `@@` +\* On `text_match` / `text_search`, `@>` / `<@` are **bloom-filter token containment** (probabilistic ngram match), **not** JSONB containment and **not** SQL `LIKE`. See [Indexing](#indexing). -Use the equivalent [`jsonb_path_query`](#jsonb-functions-and-selectors-enabled-by-ste_vec) or containment patterns instead. +Notes: + +- The bare `eql_v3.` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site, e.g. `col::eql_v3.int4_ord`) when you need to query. +- `_ord` and `_ord_ore` are **twins**: byte-identical surfaces backed by the ORE block term. Pick the name that documents intent ("ordered" vs "ordered via ORE block"); both support the full ordered surface and the `MIN` / `MAX` aggregates. +- `=` / `<>` is the only searchable surface for `_eq`. On `_ord` variants the equality operators are available too (alongside the ordered ones). +- `bool` is **storage-only** by design — a two-value column has too little cardinality for any searchable index to be safe, so it ships only `eql_v3.bool` (no `_eq` / `_ord`). +- `LIKE` / `ILIKE` (`~~` / `~~*`) and the native JSONB operators are **blocked on every scalar domain variant** — they are meaningless on a scalar payload. Text matching is the bloom-filter `@>` on `text_match`, not `LIKE`. +- `MIN` / `MAX` are exposed only on the ordered variants, as `eql_v3.min(eql_v3._ord)` / `eql_v3.max(...)` (and the `_ord_ore` twin) — see [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). --- -## Encrypted-domain scalar types (`eql_v3.`) +## SQL operator support -Scalar encrypted-domain types (e.g. `eql_v3.int4`; see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md)) are a different access model from the matrix above. Instead of configuring a search index on an `eql_v2_encrypted` column, you type the column as a specific domain *variant* whose operator surface is fixed at generation time. The index terms travel in the payload; there is no `add_search_config` step. The domains and their operator surface live in the `eql_v3` schema (dropped by `DROP SCHEMA eql_v3 CASCADE`, and they survive an `eql_v2` uninstall); their extracted index-term types are the self-contained `eql_v3` SEM types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`). +A ✅ means the operator resolves on a column typed as that domain variant. A ❌ means the operator is blocked (it raises) for that variant. -Each scalar type `` generates one storage-only variant plus eq/ord query variants: +| SQL operator | Meaning | `eql_v3.` | `_eq` | `_ord` / `_ord_ore` | `text_match` | `text_search` | +| ------------------------- | ------------------------------ | :----------: | :---: | :-----------------: | :----------: | :-----------: | +| `=` | Equality | ❌ | ✅ | ✅ | ❌ | ✅ | +| `<>` / `!=` | Inequality | ❌ | ✅ | ✅ | ❌ | ✅ | +| `<` `<=` `>` `>=` | Ordered comparison | ❌ | ❌ | ✅ | ❌ | ✅ | +| `@>` / `<@` | Bloom-filter token containment | ❌ | ❌ | ❌ | ✅ | ✅ | +| `LIKE` `ILIKE` (`~~`/`~~*`) | SQL pattern match | ❌ | ❌ | ❌ | ❌ | ❌ | +| `IS NULL` / `IS NOT NULL` | Null check | ✅ | ✅ | ✅ | ✅ | ✅ | -| Domain variant | Term carried | `=` `<>` | `<` `<=` `>` `>=` | `MIN` / `MAX` | `LIKE`/`ILIKE`, JSONB / ste_vec ops | -| ------------------------------- | ------------------- | :------: | :---------------: | :-----------: | :---------------------------------: | -| `eql_v3.` | none (storage only) | ❌ | ❌ | ❌ | ❌ | -| `eql_v3._eq` | `hm` (hmac_256) | ✅ | ❌ | ❌ | ❌ | -| `eql_v3._ord` / `_ord_ore` | `ob` (ore_block) | ✅ | ✅ | ✅ | ❌ | +Notes: -- The bare `eql_v3.` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site) when you need to query. -- Unsupported operators are not silent no-ops: they route to blocker functions that `RAISE` an "operator not supported" exception (a `NULL` operand still raises — the blockers are deliberately not `STRICT`). -- `LIKE` / `ILIKE` and the native JSONB operators (`@>`, `<@`, `->`, `->>`, `?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`) are blocked on **every** scalar domain variant — they are meaningless on a scalar payload. -- `MIN` / `MAX` are exposed only on the ordered variants as `eql_v3.min(eql_v3._ord)` / `eql_v3.max(...)` — see [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). +- A SQL `NULL` column value is not encrypted, so `IS NULL` / `IS NOT NULL` always work regardless of variant. +- `@>` / `<@` on `text_match` / `text_search` test whether the encrypted text **contains** the (encrypted) search terms via the bloom filter. This replaces the old `LIKE`/`ILIKE`-on-`match`-index recipe: there is no `LIKE` on encrypted text — use `@>`. --- ## SQL syntax / feature support -This matrix covers higher-level SQL constructs rather than individual operators. As above, ✅ requires the listed index to be configured on the column; ❌ means the construct cannot be used against that column (without first decrypting via CipherStash Proxy or Protect.js). - -| SQL feature | Notes | `unique` | `ore` | `ope` | `match` | `ste_vec` | -| ---------------------------------- | ------------------------------------- | :------: | :---: | :---: | :-----: | :-------: | -| `WHERE col = …` / `<>` | | ✅ | ✅ | ✅ | ❌ | ❌ | -| `WHERE col <` / `<=` / `>` / `>=` | | ❌ | ✅ | ✅ | ❌ | ❌ | -| `WHERE col BETWEEN … AND …` | desugars to `>=` and `<=` | ❌ | ✅ | ✅ | ❌ | ❌ | -| `WHERE col LIKE …` / `NOT LIKE` | | ❌ | ❌ | ❌ | ✅ | ❌ | -| `WHERE col ILIKE …` / `NOT ILIKE` | requires `downcase` filter | ❌ | ❌ | ❌ | ✅ | ❌ | -| `WHERE col IN (…)` | | ✅ | ✅ | ✅ | ❌ | ❌ | -| `WHERE col @> …` / `<@ …` | | ❌ | ❌ | ❌ | ❌ | ✅ | -| `ORDER BY col` | | ❌ | ✅ | ✅ | ❌ | ❌ | -| `GROUP BY col` | requires `unique` on the whole column; `ore` / `ope` not yet supported (see note below). Extracted JSON paths have separate caveats — see [ste_vec section](#index-terms-by-json-node-type). | ✅ | ❌ | ❌ | ❌ | ❌ | -| `DISTINCT` / `DISTINCT ON (col)` | `unique`, `ore`, or `ope` | ✅ | ✅ | ✅ | ❌ | ❌ | -| `HAVING` | same index requirements as the predicates used in `HAVING` (see operator matrix) | varies | varies | varies | varies | varies | -| `MIN(col)` / `MAX(col)` | `eql_v2.min(eql_v2_encrypted)` / `max` work on any `eql_v2_encrypted` column with `ore` terms. The encrypted-domain family additionally exposes type-safe `eql_v3.min(eql_v3._ord)` / `max` (and the `_ord_ore` twin); `Storage` and `Eq` variants have no comparator and do not declare these aggregates. | ❌ | ✅ | ✅ | ❌ | ❌ | -| `COUNT(col)` / `COUNT(DISTINCT col)` | `ore` / `ope` or `unique` for `DISTINCT`; none for plain `COUNT(col)` | ✅ | ✅ | ✅ | ✅ | ✅ | -| `JOIN … ON lhs.col = rhs.col` | same index and keyset on both sides | ✅ | ✅ | ✅ | ❌ | ❌ | -| `JOIN … ON lhs.col < rhs.col` etc. | same index and keyset on both sides | ❌ | ✅ | ✅ | ❌ | ❌ | -| `UNION` / `EXCEPT` / `INTERSECT` (set operations) | | ✅ | ✅ | ✅ | ❌ | ❌ | -| `IS NULL` / `IS NOT NULL` | works because `NULL` values are not encrypted | ✅ | ✅ | ✅ | ✅ | ✅ | -| Window functions over encrypted columns | works like the equivalent clauses in normal SQL (e.g. window `ORDER BY` needs `ore` or `ope`) | varies | varies | varies | varies | varies | +This matrix covers higher-level SQL constructs. As above, ✅ requires the column to be typed as a variant that carries the necessary term. + +| SQL feature | Notes | Required variant | +| ------------------------------------ | -------------------------------------------------------------------------------------- | ---------------- | +| `WHERE col = …` / `<>` | | `_eq`, `_ord`, `text_search` | +| `WHERE col <` / `<=` / `>` / `>=` | | `_ord`, `text_search` | +| `WHERE col BETWEEN … AND …` | desugars to `>=` and `<=` | `_ord`, `text_search` | +| `WHERE col @> …` | bloom-filter token containment (text), or document containment (`eql_v3.json`) | `text_match`, `text_search`, `eql_v3.json` | +| `WHERE col IN (…)` | desugars to `=` | `_eq`, `_ord`, `text_search` | +| `ORDER BY col` | meaningful only with an ORE term | `_ord`, `text_search` | +| `GROUP BY col` / `DISTINCT` | needs an equality term | `_eq`, `_ord`, `text_search` | +| `MIN(col)` / `MAX(col)` | `eql_v3.min(eql_v3._ord)` / `max` — type the column as `_ord` or cast at the call site (`eql_v3.min(col::eql_v3.int4_ord)`) | `_ord` | +| `COUNT(col)` / `COUNT(DISTINCT col)` | plain `COUNT(col)` needs no term; `DISTINCT` needs an equality term | any / `_eq` for `DISTINCT` | +| `JOIN … ON lhs.col = rhs.col` | both sides must share the same keyset and a matching variant | `_eq`, `_ord`, `text_search` | Notes: -- **Cross-column / cross-table comparisons** (joins, `IN (subquery)`, `UNION` dedup, etc.) require both sides to have been encrypted with the *same* keyset and the matching search index. Encrypted values from different `ste_vec` prefixes are deliberately incomparable. -- **`GROUP BY`** on encrypted columns relies on an operator class which currently only supports encrypted values with a `unique` index term. This is a surprising limitation because it would be natural to expect `ore` / `ope` index terms to also work. This limitation will be lifted in the future. See [Database Indexes](./database-indexes.md#group-by) for performance considerations. -- **`ORDER BY`** without an `ore` or `ope` index will still *run* (the EQL `compare` function has a deterministic literal fallback to avoid btree errors), but the resulting order is not meaningful. Configure `ore` (or `ope`) whenever ordering matters. -- **`MIN(col)` / `MAX(col)`** is available two ways. The composite-type aggregates `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` work on any `eql_v2_encrypted` column carrying `ore` terms. The encrypted-domain family additionally exposes type-safe per-variant aggregates — see `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) in [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). For a domain-typed column, type it as the appropriate `_ord` variant or cast at the call site (`eql_v3.min(col::eql_v3.int4_ord)`). -- **Aggregates beyond `MIN`/`MAX`** (e.g. `SUM`, `AVG`) are not supported on encrypted values — they would require homomorphic encryption. Decrypt at the application boundary and perform those aggregates client-side. -- **Parameter binding**: CipherStash Proxy rewrites bound parameters in `WHERE`, `JOIN`, and `RETURNING` clauses with `::JSONB::eql_v2_encrypted` casts so that the encrypted operator and any B-tree / GIN indexes are selected. Writing those casts yourself is only required when bypassing the proxy. +- **Cross-column / cross-table comparisons** (joins, `IN (subquery)`, set-operation dedup) require both sides to have been encrypted with the *same* keyset and a matching variant. +- **`ORDER BY`** without an ORE term will not produce a meaningful order — type the column as an `_ord` variant when ordering matters. +- **Aggregates beyond `MIN` / `MAX`** (`SUM`, `AVG`, …) are not supported on encrypted values — decrypt at the application boundary and aggregate client-side. +- **Parameter binding**: CipherStash Proxy rewrites bound parameters so the encrypted operator and any functional indexes are selected. When bypassing the proxy, type the parameter (`$1::eql_v3.int4_ord`) so the encrypted operator resolves rather than the native `jsonb` one. --- -## ste_vec: structured encryption for JSON +## Indexing -The `ste_vec` index turns a JSONB document into a searchable vector (the `sv` array) of encrypted terms. Each element of `sv` corresponds to one path inside the document and carries: +`eql_v3` indexes through a **functional index on the term extractor**, never an operator class on a column. The extractor's return type carries a default opclass, and the extractors are inlinable, so bare-form queries (`WHERE col = $1`, `ORDER BY col`) engage the index: -- `s` — a deterministic **selector** hash for the JSON path (always present). -- One or more **value terms** that depend on the JSON type of the leaf at that path. +```sql +-- Equality (hash index on eq_term) +CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)); -Selectors let EQL locate a path; value terms let it compare the value at that path. The tables below cover (1) which value terms each JSON node type produces — i.e. which operators are possible on each node type via ste_vec alone — and (2) which standard PostgreSQL JSONB functions and selectors CipherStash Proxy rewrites to their ste_vec-backed EQL equivalents. +-- Ordering / range (btree index on ord_term) +CREATE INDEX events_at_ord ON events USING btree (eql_v3.ord_term(encrypted_at)); + +-- Text match (bloom containment — GIN on match_term) +CREATE INDEX users_name_match ON users USING gin (eql_v3.match_term(encrypted_name)); +``` + +See [Database Indexes for Encrypted Columns](./database-indexes.md) for the full recipes, GIN containment, and performance guidance. + +--- + +## `eql_v3.json`: structured encryption for JSON + +`eql_v3.json` is the encrypted-JSON document domain (built on the structured-encryption "ste_vec" model). A JSONB document is encrypted into a searchable vector (`sv`) of terms — one element per path inside the document — each carrying: + +- `s` — a deterministic **selector** hash for the JSON path (always present); and +- one or more **value terms** depending on the JSON type of the leaf at that path. + +Selectors locate a path; value terms let EQL compare the value at that path. ### Index terms by JSON node type -For each path in the document, ste_vec emits an element whose value terms depend on the type of the JSON leaf. The search capabilities available on a value extracted via `->` or `jsonb_path_query` are determined by those terms. +The search capabilities available on a value extracted via `->` or `eql_v3.jsonb_path_query` are determined by the terms emitted for that node type. -| JSON node type | Value terms emitted (alongside `s`) | Equality (`=`, `<>`, `IN`, `GROUP BY`) | Ordering (`<`, `<=`, `>`, `>=`, `BETWEEN`, `ORDER BY`, `MIN`/`MAX`) | -| ----------------------- | ----------------------------------- | :------------------------------------: | :-----------------------------------------------------------------: | -| Object `{ ... }` | `hm` (hmac_256) | ✅ | ❌ | -| Array `[ ... ]` | `hm` on the container; each element also appears as its own `sv` entry, flagged `"a": 1`, carrying the terms for its own leaf type | ✅ (structural equality and containment) | ❌ | -| String `"..."` | `hm` (hmac_256), `ocv` (variable-width CLLW ORE) | ✅ | ✅ | -| Number (`integer`, `numeric`, …) | `hm` (hmac_256), `ocf` (fixed-width CLLW ORE, `u64_8`) | ✅ | ✅ | -| Boolean `true` / `false` | `hm` (hmac_256) | ✅ | ❌ | -| Null (JSON `null`) | `hm` (hmac_256) | ✅ | ❌ | +| JSON node type | Value terms (alongside `s`) | Equality (`=`, `<>`, `GROUP BY`) | Ordering (`<` … `>=`, `ORDER BY`, `MIN`/`MAX`) | +| ------------------------ | ------------------------------------------------- | :------------------------------: | :--------------------------------------------: | +| Object `{ … }` | `hm` | ✅ | ❌ | +| Array `[ … ]` | `hm` on the container; each element also appears as its own `sv` entry with its own leaf terms | ✅ | ❌ | +| String `"…"` | `hm`, `ocv` (variable-width CLLW ORE) | ✅ | ✅ | +| Number (integer/numeric) | `hm`, `ocf` (fixed-width CLLW ORE) | ✅ | ✅ | +| Boolean / JSON null | `hm` | ✅ | ❌ | -Notes: +`hm` supports equality only; `ocv` / `ocf` are CLLW ORE terms that preserve order *and* collapse to equality on matching keys. JSON `null` here refers to a `null` literal *inside* the document — a SQL `NULL` column is not encrypted at all. -- **`hm`** (hmac_256) is a deterministic hash — it supports equality only. **`ocv`** and **`ocf`** are CLLW Order-Revealing Encryption terms; they preserve order *and* collapse to equality when two operands share the same key. -- The "Equality" and "Ordering" columns describe what is possible on a value **extracted from the JSON document** (e.g. via `encrypted_json->'selector' = …` or `ORDER BY jsonb_path_query(...)`). The outer `eql_v2_encrypted` column still needs a sibling `unique` / `ore` index if you want `WHERE col = …` on the whole document — see [Operators section notes](#sql-operator-support). -- **Field-level `GROUP BY` / equality recipe**: use the `eql_v2.eq_term(col -> '')` extractor (XOR-aware — covers both hm-bearing and oc-bearing selectors with one expression). Add a functional hash index on the same expression to engage Index Scan on bare-form queries — see [Field-level equality index](./database-indexes.md#field-level-equality-index-ste_vec-elements). The previous Blake3-based caveat is gone: every node type now emits `hm` or `oc` (XOR), so field-level GROUP BY works for any path without an extra `unique` index. -- **JSON null vs SQL NULL**: the row above refers to JSON `null` literals *inside* the document. A SQL `NULL` column value is not encrypted at all, so `IS NULL` / `IS NOT NULL` always work regardless of the index configuration. +### Operators and functions on `eql_v3.json` -### JSONB functions and selectors enabled by ste_vec +| SQL form | Resolves to | Returns / notes | +| -------------------------------- | -------------------------------------------------- | --------------- | +| `doc @> needle` / `needle <@ doc` | `eql_v3."@>"` / `eql_v3."<@"` | document containment; GIN-indexable via `eql_v3.to_ste_vec_query(doc)::jsonb` — see [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment). `needle` must be typed (`$1::eql_v3.ste_vec_query`, another `eql_v3.json`, or an `eql_v3.ste_vec_entry`). | +| `doc -> 'sel'::text` / `doc -> N` | `eql_v3."->"` | field / 0-based array-element access; returns `eql_v3.ste_vec_entry`. | +| `doc ->> 'sel'::text` | `eql_v3."->>"` | the matching entry serialized as `text` (ciphertext JSON, **not** decrypted plaintext). | +| extracted-leaf `=` `<>` | `eql_v3.eq_term(eql_v3.ste_vec_entry)` | equality on a value extracted via `->` (e.g. `doc -> 'sel'::text = $1`). | +| extracted-leaf `<` `<=` `>` `>=` | `eql_v3.ore_cllw(eql_v3.ste_vec_entry)` | ordered comparison on an extracted String / Number leaf. | +| `MIN` / `MAX` of extracted leaf | `eql_v3.min(eql_v3.ste_vec_entry)` / `max` | over an extracted ordered leaf. | +| `eql_v3.jsonb_path_query(doc, sel)` | path query | set-returning; yields encrypted entries. Also `jsonb_path_query_first`, `jsonb_path_exists`. | +| `eql_v3.jsonb_array_length/elements/elements_text(doc)` | array helpers | length / set-returning elements / element text. | -When the `ste_vec` index is configured, CipherStash Proxy rewrites these standard PostgreSQL JSONB functions, selectors, and aggregates to their `eql_v2` equivalents so they operate on encrypted JSON. The "Also requires" column lists any *additional* capability that must be present on the extracted node (see the table above). +> **Typed operands (important).** The selector / needle operand must carry a **known type** — a typed parameter (`$1`, which the Proxy supplies) or an explicit cast (`doc -> 'sel'::text`, `$1::eql_v3.ste_vec_query`). A bare untyped literal (`doc -> 'sel'`) resolves to the **native `jsonb` operator** (PostgreSQL reduces the `eql_v3.json` domain to its `jsonb` base type for an unknown-typed RHS) and silently returns native jsonb semantics instead of the encrypted operator. -| Function / selector | Rewritten to | Also requires | Notes | -| ---------------------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------- | -| `jsonb_path_query(col, path)` | `eql_v2.jsonb_path_query(col, selector)` | — | Set-returning; yields `eql_v2_encrypted`. Paths become selector hashes. | -| `jsonb_path_query_first(col, path)` | `eql_v2.jsonb_path_query_first(...)` | — | Returns `eql_v2_encrypted`. | -| `jsonb_path_exists(col, path)` | `eql_v2.jsonb_path_exists(...)` | — | Returns `boolean`. | -| `col -> 'field'` / `col -> N` | ste_vec path / array-element access | — | Returns `eql_v2.ste_vec_entry` (a DOMAIN over `jsonb`). `N` is a 0-based index into an array node. | -| `col ->> 'field'` | ste_vec path as ciphertext text | — | Returns the **ciphertext** as `text` (not plaintext). | -| `col @> value` / `value <@ col` | ste_vec containment (via `@>` / `<@`) | — | GIN-indexable via `eql_v2.jsonb_array(col)` — see [Database Indexes](./database-indexes.md#gin-indexes-for-jsonb-containment). | -| `jsonb_array_length(arr)` | `eql_v2.jsonb_array_length(arr)` | Path must resolve to a JSON array node | Returns `integer`. | -| `jsonb_array_elements(arr)` | `eql_v2.jsonb_array_elements(arr)` | Path must resolve to a JSON array node | Set-returning; yields `eql_v2_encrypted`. | -| `jsonb_array_elements_text(arr)` | `eql_v2.jsonb_array_elements_text(arr)` | Path must resolve to a JSON array node | Set-returning; yields ciphertext as `text`. | -| `COUNT(col)` | plain `count(*)` | — | No encrypted term required. | -| `COUNT(DISTINCT col)` | deterministic dedup | An extracted node that emits `hm`, `ocv`, or `ocf` (or a `unique` / `ore` / `ope` index on the outer column) | A ste_vec-extracted leaf dedups via `hm` (any node type) or `ocv` / `ocf` (String / Number). `ope` is never emitted by ste_vec extraction; it only applies to the outer column. | -| `MIN(col)` / `MAX(col)` | `eql_v2` ORE/OPE aggregates | A ste_vec-extracted String / Number node (`ocv` / `ocf`), **or** a sibling `ore` / `ope` index on the outer column | ste_vec extraction can only produce `ocv` / `ocf` ordering terms. Whole-column ordering uses the outer-column `ore` or `ope` index. | +### Blocked JSONB operators -Additionally, `eql_v2.jsonb_array`, `eql_v2.jsonb_contains`, and `eql_v2.jsonb_contained_by` are EQL helpers (not automatic rewrites) used when building **GIN-indexed** containment queries. See [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment) for the full setup. +These native PostgreSQL JSONB operators are **blocked** on `eql_v3.json` (they `RAISE`, rather than falling through to native whole-document semantics): root-document `=` `<>` `<` `<=` `>` `>=`, and `?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`. Use containment (`@>`), field access (`->` / `->>`), or the `eql_v3.jsonb_path_*` functions instead. -See [EQL with JSON and JSONB](./json-support.md) for worked examples of each function. +See [EQL with JSON and JSONB](./json-support.md) for worked examples. --- ## See also - [EQL Functions Reference](./eql-functions.md) — full list of functions and operators. -- [EQL index configuration for CipherStash Proxy](./index-config.md) — how to add / modify / remove search indexes. -- [Database Indexes for Encrypted Columns](./database-indexes.md) — B-tree and GIN index guidance for PostgreSQL. -- [EQL with JSON and JSONB](./json-support.md) — end-to-end examples of `ste_vec` usage. +- [Database Indexes for Encrypted Columns](./database-indexes.md) — functional-index and GIN recipes, plus performance guidance. +- [EQL with JSON and JSONB](./json-support.md) — end-to-end `eql_v3.json` examples. +- Client-side searchable-encryption configuration — [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md) and [CipherStash Proxy](https://github.com/cipherstash/proxy). --- From 54073476ad23f8401d0bc9ea37086f39934f2c60 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:05:55 +1000 Subject: [PATCH 340/599] docs(database-indexes): re-author to eql_v3 functional indexes; absorb durable performance guidance; drop operator-class recipe --- docs/reference/database-indexes.md | 539 +++++++++-------------------- 1 file changed, 157 insertions(+), 382 deletions(-) diff --git a/docs/reference/database-indexes.md b/docs/reference/database-indexes.md index 01f612313..90638f481 100644 --- a/docs/reference/database-indexes.md +++ b/docs/reference/database-indexes.md @@ -1,116 +1,98 @@ # Database Indexes for Encrypted Columns -EQL supports PostgreSQL B-tree indexes on `eql_v2_encrypted` columns to improve query performance. This guide explains how to create and use indexes effectively. +EQL supports PostgreSQL indexes on encrypted columns to make queries competitive with plain-PostgreSQL workloads. This guide covers how to create them, how they engage, and how to keep both queries *and* index builds fast at scale. + +The model is simple and uniform across every encrypted-domain type: **index a functional expression over the term extractor**, never an operator class on the column. The extractor returns a small per-row term whose return type already carries a default operator class, and the extractors are inlinable — so bare-form queries (`WHERE col = $1`, `ORDER BY col`) engage the index without any query rewriting. ## Table of Contents - [Creating Indexes](#creating-indexes) +- [How Index Engagement Works](#how-index-engagement-works) - [Index Usage Requirements](#index-usage-requirements) - [Query Patterns That Use Indexes](#query-patterns-that-use-indexes) -- [Query Patterns That Don't Use Indexes](#query-patterns-that-dont-use-indexes) -- [Index Limitations](#index-limitations) -- [Best Practices](#best-practices) - [GIN Indexes for JSONB Containment](#gin-indexes-for-jsonb-containment) +- [Best Practices](#best-practices) +- [Performance: Building Indexes on Large Tables](#performance-building-indexes-on-large-tables) +- [Diagnosing Queries with EXPLAIN](#diagnosing-queries-with-explain) +- [Troubleshooting](#troubleshooting) --- ## Creating Indexes -### Basic Index Creation - -Create a B-tree index on an encrypted column using the `eql_v2.encrypted_operator_class`: +Each capability has one canonical functional-index recipe. Type the column as the domain variant that carries the term (see [SQL support matrix](./sql-support.md)), then index the matching extractor: ```sql -CREATE INDEX ON table_name (encrypted_column eql_v2.encrypted_operator_class); -``` +-- Equality (hash index on the eq_term extractor) — eql_v3._eq / _ord / text_search +CREATE INDEX users_email_eq + ON users USING hash (eql_v3.eq_term(encrypted_email)); -**Named index:** +-- Ordering / range (btree index on the ord_term extractor) — eql_v3._ord / _ord_ore +CREATE INDEX events_at_ord + ON events USING btree (eql_v3.ord_term(encrypted_at)); -```sql -CREATE INDEX idx_users_email ON users (encrypted_email eql_v2.encrypted_operator_class); +-- Text match (bloom-filter containment — GIN on the match_term extractor) — eql_v3.text_match / text_search +CREATE INDEX users_name_match + ON users USING gin (eql_v3.match_term(encrypted_name)); + +ANALYZE users; ``` +> **No operator class on a column or domain.** `eql_v3` deliberately does **not** ship an `encrypted_operator_class`. Operators resolve against the domain's `jsonb` base type, so an opclass on the column would bypass the encrypted surface. Always index through the extractor. (This also means no superuser is required — functional indexes work on Supabase and managed PostgreSQL.) + ### When to Create Indexes Create indexes on encrypted columns when: -- The table has a significant number of rows (typically > 1000) -- You frequently query by equality on that column -- Query performance is important -- The column contains searchable index terms (hmac_256, blake3, ore, or ope) ---- - -## Index Usage Requirements +- The table has a significant number of rows (typically > 1000). +- You frequently query the column by the matching operator. +- The column is typed as a variant that carries the required term (`_eq` for equality, `_ord` for range/ordering, `text_match` for containment). -For PostgreSQL to use an index on encrypted columns, **all** of these conditions must be met: - -### 1. Column Must Have Appropriate Search Terms +--- -The encrypted data must contain the index term types that support the operation: +## How Index Engagement Works -- **Equality queries** - Require `unique` index config (adds `hm` hmac_256 terms) -- **Range queries** - Require `ore` index config on root scalars (adds `ob` ore_block_u64_8_256 terms), or `ste_vec` on encrypted JSON columns (adds `oc` ORE CLLW on sv elements — see [U-006](../upgrading/v2.3.md#u-006-ste_vec-ore-field-consolidation)) -- **Pattern matching** - Typically scans (bloom filters don't use B-tree indexes) +The extractors (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.match_term`) are inlinable `LANGUAGE sql` functions — a single `SELECT`, `IMMUTABLE`, no pinned `search_path`. PostgreSQL inlines them at planning time, so a bare-form predicate is rewritten into the same expression as the index and matches it structurally: -**Example:** ```sql --- This data HAS hmac_256 term - index will be used -'{"i":{"t":"users","c":"email"},"v":2,"hm":"abc123..."}' - --- This data has ONLY bloom filter - index WON'T be used for equality -'{"i":{"t":"users","c":"email"},"v":2,"bf":[1,2,3]}' +SELECT * FROM users WHERE encrypted_email = $1; +-- planner inlines `=` to: eql_v3.eq_term(encrypted_email) = eql_v3.eq_term($1) +-- Index Cond on USING hash (eql_v3.eq_term(encrypted_email)) ``` -### 2. Index Must Be Created AFTER Data Contains Required Terms +The match is **syntactic on the expression tree**: the predicate's extractor call must be the same function and argument shape as the index's defining expression. The planner does not reason about semantic equivalence, which is why `ORDER BY` needs special care (see [Range and ORDER BY](#range-queries-and-order-by) below) and why pinning `search_path` on an extractor would silently disable inlining and revert queries to sequential scans. -If you: -1. Insert data without a search term (e.g., only `bf`) -2. Add the search term later (e.g., add `hm`) -3. Create an index +--- -**The index will NOT work** until you: -- Recreate the index, OR -- Truncate and repopulate the table +## Index Usage Requirements -**Correct order:** -```sql --- 1. Configure the index type FIRST -SELECT eql_v2.add_search_config('users', 'encrypted_email', 'unique', 'text'); +For PostgreSQL to use a functional index on an encrypted column, **all** of these must hold: --- 2. Insert/update data through CipherStash Proxy (adds index terms) -INSERT INTO users (encrypted_email) VALUES (...); +### 1. The value must carry the required term --- 3. Create the PostgreSQL index -CREATE INDEX ON users (encrypted_email eql_v2.encrypted_operator_class); -ANALYZE users; -``` +Capability travels in the payload, chosen by the encryption client and reflected in the column's domain variant: -### 3. Query Must Use Correct Type Casting +- **Equality** needs an `hm` (hmac_256) term — `eql_v3._eq`, `eql_v3._ord`, or `eql_v3.text_search`. +- **Range / ordering** needs an `ob` (ore_block_256) term — `eql_v3._ord` / `_ord_ore` or `eql_v3.text_search`. +- **Text containment** needs a `bf` (bloom_filter) term — `eql_v3.text_match` or `eql_v3.text_search`. -The query value must be cast to `eql_v2_encrypted`: +A value with only a bloom term will not drive an equality index, and vice versa. -**✓ Index will be used:** -```sql --- Literal row type -WHERE e = '("{\"hm\": \"abc\"}")'; +### 2. The index must be created after the data carries the term --- Cast to eql_v2_encrypted -WHERE e = '{"hm": "abc"}'::eql_v2_encrypted; -WHERE e = '{"hm": "abc"}'::text::eql_v2_encrypted; -WHERE e = '{"hm": "abc"}'::jsonb::eql_v2_encrypted; +If you populate a column, then later change which terms its values carry, recreate the index — a functional index built before the term is present will not match. --- Using helper function -WHERE e = eql_v2.to_encrypted('{"hm": "abc"}'::jsonb); -WHERE e = eql_v2.to_encrypted('{"hm": "abc"}'); +### 3. The query operand must be typed --- Using parameterized query with encrypted value -WHERE e = $1::eql_v2_encrypted; -``` +The comparison value must resolve to the encrypted operator, not the native `jsonb` one. A typed parameter (`$1`, which CipherStash Proxy supplies) or an explicit cast works: -**✗ Index will NOT be used:** ```sql --- Missing type cast -WHERE e = '{"hm": "abc"}'::jsonb; +-- ✓ resolves the encrypted operator → uses the index +WHERE encrypted_email = $1; +WHERE encrypted_email = $1::eql_v3.text_eq; + +-- ✗ a bare jsonb literal falls through to native jsonb semantics +WHERE encrypted_email = '{"hm":"abc"}'::jsonb; ``` --- @@ -119,419 +101,212 @@ WHERE e = '{"hm": "abc"}'::jsonb; ### Equality Queries -When encrypted column has `hm` (hmac_256) or `b3` (blake3) index terms: +A column typed `eql_v3._eq` (or `_ord`, or `text_search`) with a hash index on `eql_v3.eq_term(col)`: ```sql --- These will use the index -SELECT * FROM users -WHERE encrypted_email = $1::eql_v2_encrypted; - -SELECT * FROM users -WHERE encrypted_email = '{"hm": "abc123..."}'::eql_v2_encrypted; - -SELECT * FROM users -WHERE encrypted_email = eql_v2.to_encrypted('{"hm": "abc123..."}'::jsonb); -``` - -**Expected EXPLAIN output:** -``` -Index Only Scan using idx_users_email on users - Index Cond: (encrypted_email = '...'::eql_v2_encrypted) -``` +CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)); +ANALYZE users; -Or: -``` -Bitmap Heap Scan on users - Recheck Cond: (encrypted_email = '...'::eql_v2_encrypted) - -> Bitmap Index Scan on idx_users_email - Index Cond: (encrypted_email = '...'::eql_v2_encrypted) +SELECT * FROM users WHERE encrypted_email = $1; +-- Index Scan using users_email_eq +-- Index Cond: (eql_v3.eq_term(encrypted_email) = eql_v3.eq_term($1)) ``` -### Range Queries +### Range Queries and ORDER BY -The canonical 2.3 recipe is a functional B-tree index over the `ob` (Block ORE) term: +Type the column as an `_ord` / `_ord_ore` variant and build a btree on `eql_v3.ord_term(col)`: ```sql -CREATE INDEX events_encrypted_date_ore_idx - ON events (eql_v2.ore_block_u64_8_256(encrypted_date)); +CREATE INDEX events_at_ord ON events USING btree (eql_v3.ord_term(encrypted_at)); ANALYZE events; ``` -The `eql_v2.ore_block_u64_8_256_operator_class` is `DEFAULT FOR TYPE`, so it's selected automatically — no explicit opclass annotation needed. The `<`, `<=`, `>`, `>=` operators on `eql_v2_encrypted` inline to `eql_v2.ore_block_u64_8_256(a) eql_v2.ore_block_u64_8_256(b)`, which means natural-form range queries match the index without any rewriting: +The `<`, `<=`, `>`, `>=` operators inline to comparisons on `eql_v3.ord_term`, so natural-form range predicates match the index: ```sql -SELECT * FROM events - WHERE encrypted_date < $1::eql_v2_encrypted - ORDER BY encrypted_date DESC - LIMIT 10; +SELECT * FROM events WHERE encrypted_at < $1 ORDER BY encrypted_at DESC LIMIT 10; ``` -**Index Scan vs. Top-N sort.** PostgreSQL uses the functional ORE index for the `WHERE` clause via structural match on the inlined predicate. The `ORDER BY` step, however, still needs a Sort node when the sort key is `encrypted_date` (the natural form) — Postgres only uses an index for `ORDER BY` when the sort key syntactically matches the index expression. With the operator inlining, each comparison in that Sort step now reduces to an inlined ORE-term comparison, so a `LIMIT n` Top-N sort is fast even without an index-ordered scan. - -To skip the Sort step entirely, write the `ORDER BY` in extractor form: +**The sort-key trap.** The planner inlines operators in *predicates*, but it does **not** rewrite *sort keys*. `ORDER BY col` and `ORDER BY eql_v3.ord_term(col)` are not interchangeable to the planner, even though ORE is order-preserving. So the query above uses the index for the `WHERE` clause but still adds a `Sort` node for the `ORDER BY` (a Top-N sort because of the `LIMIT`). To stream rows out of the index already ordered — no `Sort` node — write the sort key in extractor form: ```sql SELECT * FROM events - WHERE encrypted_date < $1::eql_v2_encrypted - ORDER BY eql_v2.ore_block_u64_8_256(encrypted_date) DESC + WHERE encrypted_at < $1 + ORDER BY eql_v3.ord_term(encrypted_at) DESC LIMIT 10; ``` -The sort key now matches the functional index expression, so the planner streams rows out of the index in order — a plain Index Scan, no separate Sort node. +The natural-form Top-N sort scales linearly with the number of rows passing `WHERE`; at large row counts and moderate selectivity that is the difference between seconds and milliseconds. **For ordered range queries, write `ORDER BY` against `eql_v3.ord_term(col)`.** -**Non-Block-ORE term types.** For columns carrying only `oc` (sv-element ORE CLLW), the bare-form `<` / `>` operators no longer dispatch through `eql_v2.compare()` — they go straight to the Block ORE extractor, which raises on a missing `ob`. Either migrate the column configuration to `ore` (Block ORE), or rewrite range queries to the extractor form: `WHERE eql_v2.ore_cllw(e->''::text) < eql_v2.ore_cllw($1::jsonb)`. See [U-005](../upgrading/v2.3.md#u-005-range-operators-are-block-ore-only) and [U-006](../upgrading/v2.3.md#u-006-ste_vec-ore-field-consolidation) for the migration notes. +> **The `value::jsonb` projection trap.** If you `SELECT col::jsonb … ORDER BY col`, PostgreSQL folds the cast into the scan output and uses `(col)::jsonb` as the sort key — which matches no index. Either project the column raw, or wrap the ordered query in a subquery so the cast applies outside the `LIMIT`. (Writing `ORDER BY eql_v3.ord_term(col)` sidesteps this entirely — it is structurally distinct from `(col)::jsonb`.) -### GROUP BY +### GROUP BY / DISTINCT -Encrypted columns can be used in GROUP BY with indexes: +**Group and deduplicate on the extractor, not the raw column.** The extractor form is the only recipe that scales: ```sql -SELECT encrypted_status, COUNT(*) -FROM orders -GROUP BY encrypted_status; +SELECT eql_v3.eq_term(encrypted_email), count(*) + FROM users + GROUP BY eql_v3.eq_term(encrypted_email); ``` -### Field-level equality index (ste_vec elements) +Why the raw column does not scale: `GROUP BY col` uses the entire encrypted payload (1–2 KB per row) as the hash key. PostgreSQL estimates a hash table far larger than the default `work_mem` (4 MB), refuses `HashAggregate`, and falls back to `GroupAggregate` — sorting kilobyte-sized rows and spilling to disk. The `eql_v3.eq_term(col)` key is a small deterministic term, so the hash table fits in `work_mem` and the planner picks `HashAggregate` reliably — without any deployment-wide tuning. If you cannot rewrite the query (an ORM grouping the raw column), bumping `work_mem` to fit the estimated hash table is the rescue knob, but the extractor form is the design. -For `GROUP BY` / `DISTINCT` / equality on a value extracted from an encrypted JSON document — e.g. `data->'email'` — there are two complementary recipes. Pick by use case: +### Field-level equality index (ste_vec elements) -**Per-selector hash index.** Use when a single JSONB path is queried hot and you want a small, narrow index. The canonical extractor is `eql_v2.eq_term(col -> '')` — XOR-aware (covers both hm-bearing and oc-bearing selectors with one expression): +For `GROUP BY` / `DISTINCT` / equality on a value extracted from an `eql_v3.json` document — e.g. `doc -> 'email'` — index the extractor applied to the selector. The extracted entry is an `eql_v3.ste_vec_entry`, and `=` on it inlines to `eql_v3.eq_term(a) = eql_v3.eq_term(b)`: ```sql -CREATE INDEX users_data_email_eq_term_idx - ON users USING hash (eql_v2.eq_term(data_encrypted -> '')); -``` - -The bare-form predicate uses `=` on `eql_v2.ste_vec_entry`, which inlines to `eql_v2.eq_term(a) = eql_v2.eq_term(b)` — matching the functional hash index above: +CREATE INDEX users_data_email_eq + ON users USING hash (eql_v3.eq_term(data_encrypted -> ''::text)); +ANALYZE users; -```sql SELECT count(*) FROM users - GROUP BY eql_v2.eq_term(data_encrypted -> ''); - -SELECT * FROM users - WHERE data_encrypted -> '' = $1::eql_v2.ste_vec_entry; -``` - -**GIN index over the entire sv shape (recommended).** Use when many selectors are queried on the same column and you want one index covering them all — typical for proxy-rewritten `col @> needle` containment where the needle can target any field. The recipe is XOR-aware: both `hm`-bearing (bool leaves / array / object roots) and `oc`-bearing (string / number leaves) sv elements are indexed. - -```sql -CREATE INDEX users_data_stevec_query_idx - ON users USING gin (eql_v2.to_stevec_query(data_encrypted)::jsonb jsonb_path_ops); -``` + GROUP BY eql_v3.eq_term(data_encrypted -> ''::text); -Query shape — uses the typed `@>` overload, which inlines to a native `jsonb @>` over the same expression so the planner engages Bitmap Index Scan: - -```sql SELECT * FROM users - WHERE data_encrypted @> '{"sv":[{"s":"","hm":""}]}'::eql_v2.stevec_query; --- or, for an oc-bearing selector: -SELECT * FROM users - WHERE data_encrypted @> '{"sv":[{"s":"","oc":""}]}'::eql_v2.stevec_query; + WHERE data_encrypted -> ''::text = $1::eql_v3.ste_vec_entry; ``` -The two recipes can coexist on the same column. The `` value is the deterministic selector hash that the crypto layer emits in the `s` field of each `sv` element — not a plaintext JSONPath. +For ordered field-level access, index `eql_v3.ore_cllw(doc -> ''::text)` (a btree) and write `ORDER BY eql_v3.ore_cllw(doc -> ''::text)` — the same sort-key rule as above. The `` value is the deterministic selector hash the crypto layer emits in each `sv` element's `s` field, not a plaintext JSONPath. The operand on `->` must be typed (`-> ''::text`); a bare untyped literal falls through to native `jsonb ->`. --- -## Query Patterns That Don't Use Indexes - -### 1. Missing Type Cast - -```sql --- ✗ No index usage - missing ::eql_v2_encrypted cast -SELECT * FROM users WHERE encrypted_email = '{"hm": "abc"}'::jsonb; -``` +## GIN Indexes for JSONB Containment -### 2. Data Without Required Index Terms +For document-level containment (`@>` / `<@`) on `eql_v3.json` columns, use a GIN index over the ste_vec query shape. The typed `@>` overload inlines to a native `jsonb @>` over `eql_v3.to_ste_vec_query(col)::jsonb`, so a GIN index on the same expression engages: ```sql --- ✗ Data only has bloom filter, not hmac_256 --- Index won't be used even if query is correct -SELECT * FROM users -WHERE encrypted_email = $1::eql_v2_encrypted; --- If column only has: '{"bf":[1,2,3]}' -``` - -### 3. Pattern Matching (LIKE) +CREATE INDEX orders_data_gin + ON orders USING gin (eql_v3.to_ste_vec_query(data_encrypted)::jsonb jsonb_path_ops); +ANALYZE orders; -```sql --- ✗ Bloom filter queries typically don't use B-tree indexes -SELECT * FROM users -WHERE encrypted_name ~~ $1::eql_v2_encrypted; +SELECT * FROM orders WHERE data_encrypted @> $1::eql_v3.ste_vec_query; +-- Bitmap Index Scan on orders_data_gin ``` -### 4. Index Created Before Data Population - -```sql --- ✗ Wrong order -CREATE INDEX ON users (encrypted_email eql_v2.encrypted_operator_class); --- Then add data with hm terms --- Index won't work until recreated -``` - ---- - -## Index Limitations - -### 1. Index Term Requirement - -B-tree indexes **only work** with: -- `hm` (hmac_256) - for equality -- `ob` (ore_block_u64_8_256) - for range queries on root scalars -- `oc` (ore_cllw) - for range queries on `ste_vec` elements (functional btree on `eql_v2.ore_cllw(col)` engages via the `eql_v2.ore_cllw_ops` opclass; excluded from the Supabase variant because operator classes require superuser) +The needle must be typed — `$1::eql_v3.ste_vec_query`, another `eql_v3.json`, or an `eql_v3.ste_vec_entry`. A bare untyped literal falls through to native `jsonb @>`. -They **do not work** with: -- `bf` (bloom_filter) - pattern matching -- Data with `sv` field (ste_vec) - JSONB containment uses GIN indexes instead (see [GIN Indexes](#gin-indexes-for-jsonb-containment)) -- Data without any index terms +EQL also ships convenience helpers for building containment queries: `eql_v3.jsonb_array(col)` (extracts the encrypted document as a native `jsonb[]`), and `eql_v3.jsonb_contains(a, b)` / `eql_v3.jsonb_contained_by(a, b)`. -### 2. Index Creation Timing +### GIN vs B-tree / hash -The index must be created **after** the data contains the required index terms. If you: - -1. Add `unique` config to existing column -2. Re-encrypt data to add `hm` terms -3. Create index - -You must create the index **after step 2**, not before. - -### 3. Index Doesn't Auto-Update - -If you modify the search configuration (e.g., change from `unique` to different config), you should: - -```sql --- Drop and recreate the index -DROP INDEX idx_users_email; -CREATE INDEX idx_users_email ON users (encrypted_email eql_v2.encrypted_operator_class); -ANALYZE users; -``` +| Feature | hash / btree on extractor | GIN on `to_ste_vec_query` | +| -------------- | ------------------------------ | ------------------------- | +| **Use case** | equality, range, ordering | JSONB document containment | +| **Operators** | `=`, `<>`, `<`, `>`, `<=`, `>=` | `@>`, `<@` | +| **Expression** | `eql_v3.eq_term` / `ord_term` | `eql_v3.to_ste_vec_query(col)::jsonb` | --- ## Best Practices -### 1. Configure Search Indexes First - -Always configure EQL search indexes before creating PostgreSQL indexes: +1. **Type the column as the right variant first.** The variant (`_eq` / `_ord` / `text_match`) is what makes the operator — and therefore the index — resolve. There is no separate database-side config step. +2. **Run `ANALYZE` after every index build.** `CREATE INDEX` on an *expression* gathers no statistics on that expression; without `ANALYZE` the planner has no histogram for `eql_v3.eq_term(col)` and can misjudge the index it just built. +3. **Verify with `EXPLAIN`** — see [Diagnosing Queries with EXPLAIN](#diagnosing-queries-with-explain). +4. **Name indexes descriptively** (`users_email_eq`, `events_at_ord`) for easier management. +5. **Drop unused indexes.** If a column no longer needs a capability, drop the corresponding functional index — duplicate indexes compete for cache and slow writes. -```sql --- Step 1: Configure searchable encryption -SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); -SELECT eql_v2.add_search_config('users', 'encrypted_email', 'unique', 'text'); - --- Step 2: Populate data (through CipherStash Proxy) -INSERT INTO users (encrypted_email) VALUES (...); - --- Step 3: Create PostgreSQL index -CREATE INDEX ON users (encrypted_email eql_v2.encrypted_operator_class); -ANALYZE users; -``` - -### 2. Run ANALYZE After Index Creation +--- -Always run `ANALYZE` after creating an index to update query planner statistics: +## Performance: Building Indexes on Large Tables -```sql -CREATE INDEX idx_users_email ON users (encrypted_email eql_v2.encrypted_operator_class); -ANALYZE users; -``` +Everything above is about query time. Index *build* time is a separate axis, and on large encrypted tables it is the one that bites: a functional index that queries in a millisecond can still take hours — or fail to finish — to `CREATE`. Three things govern it. -### 3. Verify Index Usage +### `maintenance_work_mem`, not `work_mem` -Use `EXPLAIN ANALYZE` to verify the index is being used: +`CREATE INDEX` draws on `maintenance_work_mem` (default 64 MB — far too small for a multi-million-row build; the sort or bucket fill spills to disk early and the build goes I/O-bound). Raise it for the session before a large build: ```sql -EXPLAIN ANALYZE -SELECT * FROM users -WHERE encrypted_email = $1::eql_v2_encrypted; +SET maintenance_work_mem = '2GB'; -- per-build; only one build runs at a time +CREATE INDEX … ; ``` -Look for: -- `Index Only Scan using idx_name` -- `Bitmap Index Scan on idx_name` -- `Bitmap Heap Scan` with `Bitmap Index Scan` - -If you see `Seq Scan`, the index is not being used. - -### 4. Name Your Indexes - -Use descriptive names for easier management: - -```sql -CREATE INDEX idx_users_encrypted_email -ON users (encrypted_email eql_v2.encrypted_operator_class); - -CREATE INDEX idx_events_encrypted_date -ON events (encrypted_date eql_v2.encrypted_operator_class); -``` +It is the single highest-leverage knob for build time. On a managed deployment where you cannot set it per session, raise it for the maintenance window. -### 5. Consider Index Size +### Index type decides whether the build scales -Indexes on encrypted columns can be large. Monitor index size: +For *query* performance the access method is settled by capability (`hash` for equality, `btree` for ORE, `GIN` for bloom / ste_vec). For *build* performance at scale they are not equivalent: -```sql -SELECT - indexname, - pg_size_pretty(pg_relation_size(schemaname||'.'||indexname)) AS index_size -FROM pg_indexes -WHERE tablename = 'users'; -``` +| Access method | Build algorithm | Scales past cache? | Parallel build? | +| ------------- | ------------------------------------------------- | ------------------ | --------------- | +| **btree** | sort, then bulk-load bottom-up — sequential writes | yes | yes (`max_parallel_maintenance_workers`) | +| **GIN** | batched buffer build | yes | no | +| **hash** | fill buckets keyed by hash value | **no** | no | -### 6. Drop Unused Indexes +A hash build scatters consecutive heap rows to random buckets; once the index outgrows `shared_buffers` + OS cache it becomes random-I/O-bound and cannot be parallelised. A btree build sorts first, then writes sequentially across parallel workers. -If you remove a search configuration, drop the corresponding PostgreSQL index: +**For equality functional indexes on large tables, prefer `btree` over `hash`.** `eql_v3.eq_term(col)` — and the field-level `eql_v3.eq_term(col -> ''::text)` — return small deterministic terms; a btree on them serves `=` exactly as well as a hash index, with no query-side cost, and the build goes from pathological to routine: ```sql --- After removing search config -SELECT eql_v2.remove_search_config('users', 'encrypted_email', 'unique'); - --- Drop the PostgreSQL index -DROP INDEX IF EXISTS idx_users_encrypted_email; +CREATE INDEX … USING btree (eql_v3.eq_term(col)); -- large tables +CREATE INDEX … USING hash (eql_v3.eq_term(col)); -- small / medium tables ``` ---- +A `hash` functional index on a 10M-row encrypted-JSONB column has been observed to run 17 hours to 73% and stall; the `btree` equivalent with `maintenance_work_mem` raised builds without drama. Hash is fine up to mid-six-figure row counts — but its *build* does not scale. -## GIN Indexes for JSONB Containment +### The de-TOAST floor -While B-tree indexes don't support `ste_vec` (JSONB containment), you can use PostgreSQL GIN indexes for efficient containment queries on encrypted JSONB columns. +A functional index over a large encrypted column [de-TOASTs](https://www.postgresql.org/docs/current/storage-toast.html) the whole stored value once per row to evaluate the extractor — and an `eql_v3.json` document is large. This cost is unavoidable and identical across access methods; it sets the build's *floor* rate. (There is no partial de-TOAST — `doc -> 'selector'::text` materialises the entire document.) -### When to Use GIN Indexes +### Storage matters more than it does for queries -Use GIN indexes when: -- You need to perform JSONB containment queries (`@>`, `<@`) -- The table has a significant number of rows (500+ recommended) -- Query performance on containment operations is important +Index builds are I/O-heavy in a way steady-state queries are not. Containerised PostgreSQL on a virtualised filesystem — notably Docker Desktop on macOS — pays a steep penalty: the random TOAST reads a functional-index build performs are the worst case for a VM I/O layer. For large builds, run PostgreSQL on native storage / fast NVMe. -### Creating a GIN Index +### Diagnosing a slow build -Create a GIN index using the `jsonb_array()` function, which extracts the encrypted JSONB as a native `jsonb[]` array: +`pg_stat_progress_create_index` is the build-time analogue of `EXPLAIN`. From a second session while `CREATE INDEX` runs: ```sql -CREATE INDEX idx_encrypted_jsonb_gin -ON table_name USING GIN (eql_v2.jsonb_array(encrypted_column)); - -ANALYZE table_name; +SELECT phase, tuples_done, tuples_total, + round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS pct +FROM pg_stat_progress_create_index; ``` -**Important:** Always run `ANALYZE` after creating the index so PostgreSQL's query planner has accurate statistics. - -### Query Patterns for GIN Indexes - -There are two approaches to write containment queries that use GIN indexes: - -#### Approach 1: Using jsonb_array() Function +A steady `tuples_done` rate means the build is healthy. A rate that **decays over time** is the cache/memory wall — raise `maintenance_work_mem`, and if it is a hash index, rebuild it as a btree. -Convert both sides to `jsonb[]` and use the native containment operator: - -```sql -SELECT * FROM table_name -WHERE eql_v2.jsonb_array(encrypted_column) @> - eql_v2.jsonb_array($1::eql_v2_encrypted); -``` - -#### Approach 2: Using Helper Function - -Use the convenience function which handles the conversion internally: - -```sql -SELECT * FROM table_name -WHERE eql_v2.jsonb_contains(encrypted_column, $1::eql_v2_encrypted); -``` - -Both approaches produce the same result and use the GIN index. - -### Verifying Index Usage - -Use `EXPLAIN` to verify the GIN index is being used: - -```sql -EXPLAIN SELECT * FROM table_name -WHERE eql_v2.jsonb_array(encrypted_column) @> - eql_v2.jsonb_array($1::eql_v2_encrypted); -``` +--- -**Expected output:** -``` -Bitmap Heap Scan on table_name - Recheck Cond: (jsonb_array(encrypted_column) @> jsonb_array(...)) - -> Bitmap Index Scan on idx_encrypted_jsonb_gin - Index Cond: (jsonb_array(encrypted_column) @> jsonb_array(...)) -``` +## Diagnosing Queries with EXPLAIN -If you see `Seq Scan`, ensure: -1. The index exists -2. `ANALYZE` has been run -3. The table has enough rows (PostgreSQL may choose sequential scan for very small tables) +The first move on a slow EQL query is `EXPLAIN (COSTS OFF)`. Look for: -### GIN vs B-tree Index Comparison +- **`Index Scan using `** — the planner is using the functional index. ✓ +- **`Bitmap Index Scan on `** — same, for set-style predicates (`@>`). ✓ +- **`Index Cond:`** referencing the extractor (`eql_v3.eq_term(…)`, `eql_v3.ord_term(…)`) — the inlined predicate matched the index. ✓ +- **`Seq Scan`** — no index used. Investigate. +- **`Filter:` showing the raw operator** (`col < '…'`) — inlining did not happen. Usual causes: a pinned `search_path` on a customised function (`\df+` shows `proconfig`), a `plpgsql` body where a `sql` one is expected, or the planner judging another plan cheaper. +- **`Sort` node above an Index Scan** — natural-form `ORDER BY`; expected for that shape. Switch the sort key to `eql_v3.ord_term(col)` to eliminate it. -| Feature | B-tree Index | GIN Index | -|---------|-------------|-----------| -| **Use case** | Equality, range queries | JSONB containment | -| **Index terms** | `hm`, `b3`, `ob`, `opf`, `opv` | `sv` (via jsonb_array) | -| **Operators** | `=`, `<`, `>`, `<=`, `>=` | `@>`, `<@` | -| **Function** | Direct column reference | `eql_v2.jsonb_array()` | +Once a plan looks right, repeat with `EXPLAIN ANALYZE` to measure actual timings. --- ## Troubleshooting -### Index Not Being Used - -**Check 1: Verify data has index terms** - -```sql --- Check if data contains hm (hmac) for equality, ob (Block ORE) --- for range queries on root scalars, or oc for range queries on --- ste_vec elements. -SELECT encrypted_email::jsonb ? 'hm' AS has_hmac, - encrypted_email::jsonb ? 'ob' AS has_ore_block, - encrypted_email::jsonb ? 'oc' AS has_ore_cllw -FROM users LIMIT 1; -``` - -**Check 2: Verify query uses correct cast** - -```sql --- ✓ Correct - will use index -WHERE encrypted_email = $1::eql_v2_encrypted - --- ✗ Wrong - won't use index -WHERE encrypted_email = $1::jsonb -``` - -**Check 3: Recreate index if needed** - -```sql -DROP INDEX IF EXISTS idx_users_encrypted_email; -CREATE INDEX idx_users_encrypted_email -ON users (encrypted_email eql_v2.encrypted_operator_class); -ANALYZE users; -``` - -**Check 4: Verify index exists** - -```sql -SELECT indexname, indexdef -FROM pg_indexes -WHERE tablename = 'users' - AND indexname LIKE '%encrypted%'; -``` +**Index not being used:** -### Poor Query Performance +1. **Verify the value carries the term.** Equality needs `hm`, range needs `ob`, containment needs `bf`: + ```sql + SELECT encrypted_email::jsonb ? 'hm' AS has_hmac, + encrypted_email::jsonb ? 'ob' AS has_ore_block, + encrypted_email::jsonb ? 'bf' AS has_bloom + FROM users LIMIT 1; + ``` +2. **Verify the operand is typed** (`$1::eql_v3.text_eq`, not `$1::jsonb`). +3. **Recreate the index** if the column's terms changed after the index was built. +4. **Run `ANALYZE`** — very small tables may still choose a sequential scan, which is correct. -1. **Ensure index exists and is being used** - Use `EXPLAIN ANALYZE` -2. **Check table has been ANALYZEd** - Run `ANALYZE table_name` -3. **Consider index selectivity** - Very small tables might not use indexes -4. **Check for appropriate search config** - Equality needs `unique`, ranges need `ore` or `ope` +**`=` returns zero rows on a column without `hm`:** equality requires the value to carry an `hm` term — type the column as `_eq` / `_ord` / `text_search` and confirm the client is emitting the term. --- ## See Also -- [EQL Functions Reference](./eql-functions.md) - Complete function API -- [Index Configuration](./index-config.md) - Searchable encryption index types -- [Configuration Tutorial](../tutorials/proxy-configuration.md) - Setting up encrypted columns +- [SQL support matrix](./sql-support.md) — which operators work against which domain variant. +- [EQL Functions Reference](./eql-functions.md) — complete function API. +- [EQL with JSON and JSONB](./json-support.md) — `eql_v3.json` worked examples. +- [Configuration Tutorial](../tutorials/proxy-configuration.md) — setting up encrypted columns end to end. --- From 024e4a932623e002be363cf988c74f51e1a36119 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:07:25 +1000 Subject: [PATCH 341/599] docs(json-support): re-author onto the eql_v3.json SteVec document type --- docs/reference/json-support.md | 336 ++++++++++----------------------- 1 file changed, 96 insertions(+), 240 deletions(-) diff --git a/docs/reference/json-support.md b/docs/reference/json-support.md index 35fafa27e..960282062 100644 --- a/docs/reference/json-support.md +++ b/docs/reference/json-support.md @@ -1,302 +1,190 @@ # EQL with JSON and JSONB -EQL supports encrypting, decrypting, and searching JSON and JSONB objects using structured encryption (ste_vec). +EQL encrypts, decrypts, and searches JSON / JSONB documents using structured encryption (ste_vec), exposed as the **`eql_v3.json`** document domain. An `eql_v3.json` column stores an encrypted document whose every path is searchable — without decryption — via containment, field/array access, and entry-level equality / range on extracted leaves. ## On this page -- [Configuring the index](#configuring-the-index) - - [Inserting JSON data](#inserting-json-data) - - [Reading JSON data](#reading-json-data) -- [Querying JSONB data with EQL](#querying-jsonb-data-with-eql) - - [Containment queries (`@>`, `<@`)](#containment-queries---) +- [Storing encrypted JSON](#storing-encrypted-json) +- [Typed operands (important)](#typed-operands-important) +- [Querying `eql_v3.json`](#querying-eql_v3json) + - [Containment queries (`@>`, `<@`)](#containment-queries) - [Field extraction (`jsonb_path_query`)](#field-extraction-jsonb_path_query) - - [JSON path operators (`->`, `->>`)](#json-path-operators---) + - [JSON path operators (`->`, `->>`)](#json-path-operators) - [Array operations](#array-operations) - [Grouping data](#grouping-data) -- [EQL functions for JSONB and `ste_vec`](#eql-functions-for-jsonb-and-ste_vec) +- [`eql_v3` functions for JSONB and ste_vec](#eql_v3-functions-for-jsonb-and-ste_vec) - [How ste_vec indexing works](#how-ste_vec-indexing-works) -## Configuring the index +## Storing encrypted JSON -To enable searchable operations on encrypted JSONB data, configure an `ste_vec` index with the `jsonb` cast type. +Type the column as `eql_v3.json`. There is no database-side `add_search_config` step — which terms a document carries is decided by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs)); typing the column as `eql_v3.json` is what makes the encrypted operators and functions resolve. ```sql -SELECT eql_v2.add_search_config( - 'users', - 'encrypted_json', - 'ste_vec', - 'jsonb', - '{"prefix": "users/encrypted_json"}' +CREATE TABLE users ( + id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + encrypted_json eql_v3.json ); ``` -The `prefix` option is required and should be unique per table/column combination (typically `"table/column"`). - -You can read more about the index configuration options [here](./index-config.md). - -### Inserting JSON data - -When inserting JSON data through CipherStash Proxy or Protect.js, wrap the data in the EQL payload format: +Insert and read through CipherStash Proxy or Protect.js, which encrypt the document into the ste_vec payload on write and decrypt it on read: ```sql -INSERT INTO users (encrypted_json) VALUES ( - '{"v":2,"k":"pt","p":"{\"name\":\"John Doe\",\"metadata\":{\"age\":42}}","i":{"t":"users","c":"encrypted_json"}}' -); +SELECT encrypted_json FROM users; -- decrypted by the client on the way out ``` -Data is stored in the database with encrypted ste_vec indexes: +The stored value is the encrypted ste_vec document — an envelope (`v`, `i`, `c`) plus the `sv` array of encrypted, per-path terms. -```json -{ - "i": { - "c": "encrypted_json", - "t": "users" - }, - "k": "sv", - "v": 2, - "sv": [["encrypted_term_1"], ["encrypted_term_2"], ...] -} -``` +## Typed operands (important) -### Reading JSON data +`eql_v3.json` is a PostgreSQL **domain over `jsonb`**. PostgreSQL resolves `domain OP untyped_literal` to the **native** `jsonb` operator, because it flattens the domain to its base type when the right-hand side is an unknown-typed literal. A bare literal therefore **bypasses the encrypted operator (and the blockers) and silently returns native jsonb semantics** — typically a root-key lookup that yields `NULL` — instead of querying the encrypted document or raising. -When querying through CipherStash Proxy or Protect.js, the encrypted column is automatically decrypted: +Always give the operand a known type: ```sql -SELECT encrypted_json FROM users; +-- ✅ correct — typed operand resolves to the eql_v3 operator +WHERE doc -> 'email'::text = $1 +WHERE doc @> $1::eql_v3.ste_vec_query +WHERE doc -> $1 -- a text parameter (the CipherStash Proxy interface) + +-- ⚠ wrong — bare untyped literal resolves to native jsonb -> text, returns NULL +WHERE doc -> 'email' ``` -## Querying JSONB data with EQL +This is **intrinsic to the domain type-kind**, not a bug: the only way to remove it would be to make `eql_v3.json` a base type (losing free `jsonb` interop). The CipherStash Proxy always passes typed parameters, so applications routing through the Proxy are unaffected; the caveat matters only for hand-written ad-hoc SQL. -EQL provides specialized functions and operators to work with encrypted JSONB data. +## Querying `eql_v3.json` ### Containment queries (`@>`, `<@`) -Use PostgreSQL's containment operators directly on `eql_v2_encrypted` columns to check if one JSONB structure contains another. - -**Example: Check if column contains structure** - -Suppose we have encrypted JSONB data: - -```json -{ - "top": { - "nested": ["a", "b", "c"] - } -} -``` - -Query records that contain a specific structure: - -```sql -SELECT * FROM examples -WHERE encrypted_json @> '{"v":2,"k":"pt","p":"{\"top\":{\"nested\":[\"a\"]}}","i":{"t":"examples","c":"encrypted_json"},"q":"ste_vec"}'::eql_v2_encrypted; -``` - -Equivalent plaintext query: +`@>` tests whether the encrypted document contains a structure; `<@` is the reverse. The needle must be **typed** — another `eql_v3.json`, an `eql_v3.ste_vec_query`, or an `eql_v3.ste_vec_entry`: ```sql SELECT * FROM examples -WHERE jsonb_column @> '{"top":{"nested":["a"]}}'; +WHERE encrypted_json @> $1::eql_v3.ste_vec_query; ``` -**Note:** The `@>` operator checks if the left value contains the right value. The `<@` operator checks the reverse (if left is contained in right). - -#### Indexed Containment Queries +This is the encrypted equivalent of the plaintext `jsonb_column @> '{"top":{"nested":["a"]}}'`. -For better performance on large tables, create a GIN index and use the `jsonb_array()` function: +For large tables, back containment with a GIN index. The typed `@>` overload inlines to a native `jsonb @>` over `eql_v3.to_ste_vec_query(col)::jsonb`, so a GIN index on the same expression engages: ```sql --- Create GIN index -CREATE INDEX idx_encrypted_jsonb_gin -ON examples USING GIN (eql_v2.jsonb_array(encrypted_json)); +CREATE INDEX examples_json_gin + ON examples USING gin (eql_v3.to_ste_vec_query(encrypted_json)::jsonb jsonb_path_ops); ANALYZE examples; --- Query using the GIN index -SELECT * FROM examples -WHERE eql_v2.jsonb_array(encrypted_json) @> - eql_v2.jsonb_array($1::eql_v2_encrypted); +SELECT * FROM examples WHERE encrypted_json @> $1::eql_v3.ste_vec_query; ``` -See [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment) for complete setup instructions. +See [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment) for the full setup. ### Field extraction (`jsonb_path_query`) -Extract fields from encrypted JSONB using selector hashes. Selectors are generated during encryption and identify specific JSON paths. - -**Function signature:** +Extract fields by **selector hash** — a deterministic identifier the crypto layer emits for a JSON path (not a path string like `$.field`). Selectors are generated during encryption by CipherStash Proxy / Protect.js. ```sql -eql_v2.jsonb_path_query(val eql_v2_encrypted, selector text) RETURNS SETOF eql_v2_encrypted -``` - -**Example:** +-- All entries matching a selector +SELECT eql_v3.jsonb_path_query(encrypted_json, 'abc123def456...') FROM examples; -```sql --- Extract all records where selector 'abc123...' exists -SELECT eql_v2.jsonb_path_query(encrypted_json, 'abc123def456...') -FROM examples; +-- First match only +SELECT eql_v3.jsonb_path_query_first(encrypted_json, 'abc123def456...') FROM examples; --- Get first match only -SELECT eql_v2.jsonb_path_query_first(encrypted_json, 'abc123def456...') -FROM examples; - --- Check if selector exists -SELECT eql_v2.jsonb_path_exists(encrypted_json, 'abc123def456...') -FROM examples; +-- Does the selector exist? +SELECT eql_v3.jsonb_path_exists(encrypted_json, 'abc123def456...') FROM examples; ``` -**Note:** Selectors are hash-based identifiers for JSON paths, not the actual path strings like `$.field`. They are generated during encryption by CipherStash Proxy/Protect.js. - ### JSON path operators (`->`, `->>`) -Use standard PostgreSQL JSON operators on encrypted columns: +`->` returns the matched entry as an `eql_v3.ste_vec_entry`; `->>` returns it serialized as `text` (ciphertext JSON, not decrypted plaintext). The selector operand must be typed: ```sql --- Extract field by selector (returns eql_v2_encrypted) -SELECT encrypted_json->'selector_hash' FROM examples; +-- Field access by selector (returns eql_v3.ste_vec_entry) +SELECT encrypted_json -> 'selector_hash'::text FROM examples; --- Extract field as text (returns encrypted value as text) -SELECT encrypted_json->>'selector_hash' FROM examples; +-- Field access as text (returns the entry as ciphertext text) +SELECT encrypted_json ->> 'selector_hash'::text FROM examples; --- Extract array element by index (0-based, returns eql_v2_encrypted) -SELECT encrypted_array->0 FROM examples; +-- Array element by 0-based index (returns eql_v3.ste_vec_entry) +SELECT encrypted_json -> 0 FROM examples; ``` -**Note:** The `->` operator supports integer array indexing (e.g., `encrypted_array->0`), but the `->>` operator does not. Use `->` to access array elements by index. - -### Array operations - -EQL supports array operations on encrypted JSONB arrays: - -**Get array length:** +The extracted `eql_v3.ste_vec_entry` is itself comparable: `=` / `<>` resolve via `eql_v3.eq_term`, and `<` / `<=` / `>` / `>=` via `eql_v3.ore_cllw` (on String / Number leaves): ```sql -SELECT eql_v2.jsonb_array_length(encrypted_array_field) -FROM examples; +SELECT * FROM examples +WHERE encrypted_json -> 'email_selector'::text = $1::eql_v3.ste_vec_entry; ``` -**Get array elements:** +### Array operations ```sql --- Returns SETOF eql_v2_encrypted -SELECT eql_v2.jsonb_array_elements(encrypted_array_field) -FROM examples; - --- Returns SETOF text (ciphertext) -SELECT eql_v2.jsonb_array_elements_text(encrypted_array_field) -FROM examples; -``` +-- Length of an encrypted array node +SELECT eql_v3.jsonb_array_length(encrypted_array_field) FROM examples; -**Example with jsonb_path_query:** +-- Elements as encrypted entries +SELECT eql_v3.jsonb_array_elements(encrypted_array_field) FROM examples; -```sql --- First query the array field, then get its elements -SELECT eql_v2.jsonb_array_elements( - eql_v2.jsonb_path_query(encrypted_json, 'array_selector_hash') -) -FROM examples; +-- Elements as ciphertext text +SELECT eql_v3.jsonb_array_elements_text(encrypted_array_field) FROM examples; ``` ### Grouping data -Use `eql_v2.grouped_value()` aggregate function to group encrypted JSONB results: +Group on the extracted entry's equality term, `eql_v3.eq_term`. A functional hash index on the same expression engages the lookup (see [Field-level equality index](./database-indexes.md#field-level-equality-index-ste_vec-elements)): ```sql -SELECT eql_v2.grouped_value( - eql_v2.jsonb_path_query_first(encrypted_json, 'color_selector')::jsonb -) AS color, -COUNT(*) +SELECT eql_v3.eq_term(encrypted_json -> 'color_selector'::text) AS color, COUNT(*) FROM examples -GROUP BY eql_v2.jsonb_path_query_first(encrypted_json, 'color_selector'); +GROUP BY eql_v3.eq_term(encrypted_json -> 'color_selector'::text); ``` -**Result:** - -| color | count | -| ----- | ----- | -| {"k":"pt","p":"blue",...} | 3 | -| {"k":"pt","p":"green",...} | 2 | -| {"k":"pt","p":"red",...} | 1 | - -## EQL functions for JSONB and `ste_vec` - -### Core Functions +`MIN` / `MAX` over an extracted ordered leaf use the `eql_v3.min(eql_v3.ste_vec_entry)` / `max` aggregates. -- **`eql_v2.ste_vec(val jsonb) RETURNS eql_v2_encrypted[]`** - - Extracts the ste_vec index array from a JSONB payload +## `eql_v3` functions for JSONB and ste_vec -- **`eql_v2.ste_vec(val eql_v2_encrypted) RETURNS eql_v2_encrypted[]`** - - Extracts the ste_vec index array from an encrypted value +### Core functions -- **`eql_v2.ste_vec_contains(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean`** - - Returns true if all ste_vec terms in b exist in a - - This is the function backing the `@>` operator +- **`eql_v3.ste_vec(val jsonb) RETURNS jsonb[]`** — extracts the ste_vec index array from an encrypted payload. +- **`eql_v3.ste_vec_contains(a eql_v3.json, b eql_v3.json) RETURNS boolean`** — true if all ste_vec terms in `b` exist in `a`; backs the `@>` operator. +- **`eql_v3.to_ste_vec_query(val eql_v3.json) RETURNS eql_v3.ste_vec_query`** — the GIN-indexable query shape `@>` inlines to. +- **`eql_v3.meta_data(val jsonb)`**, **`eql_v3.ciphertext(val jsonb)`**, **`eql_v3.selector(val jsonb)` / `(entry eql_v3.ste_vec_entry)`** — envelope / ciphertext / selector accessors. -### Path Query Functions +### Path query functions -- **`eql_v2.jsonb_path_query(val eql_v2_encrypted, selector text) RETURNS SETOF eql_v2_encrypted`** - - Returns all encrypted elements matching the selector +- **`eql_v3.jsonb_path_query(val jsonb, selector text)`** — entries matching the selector. +- **`eql_v3.jsonb_path_query_first(val jsonb, selector text)`** — first match. +- **`eql_v3.jsonb_path_exists(val jsonb, selector text) RETURNS boolean`** — selector presence. -- **`eql_v2.jsonb_path_query_first(val eql_v2_encrypted, selector text) RETURNS eql_v2_encrypted`** - - Returns the first encrypted element matching the selector +### Array functions -- **`eql_v2.jsonb_path_exists(val eql_v2_encrypted, selector text) RETURNS boolean`** - - Returns true if any element matches the selector +- **`eql_v3.jsonb_array_length(val jsonb) RETURNS integer`** +- **`eql_v3.jsonb_array_elements(val jsonb)`** +- **`eql_v3.jsonb_array_elements_text(val jsonb) RETURNS SETOF text`** +- **`eql_v3.is_ste_vec_array(val jsonb) RETURNS boolean`** -### Array Functions +### Entry comparison / aggregate -- **`eql_v2.jsonb_array_length(val eql_v2_encrypted) RETURNS integer`** - - Returns the length of an encrypted array +- **`eql_v3.eq_term(entry eql_v3.ste_vec_entry)`** — equality term (backs `=` / `<>` / `GROUP BY`). +- **`eql_v3.ore_cllw(entry eql_v3.ste_vec_entry)`** — ordering term (backs `<` … `>=`); **`eql_v3.has_ore_cllw(entry)`** reports whether the leaf carries one. +- **`eql_v3.min(eql_v3.ste_vec_entry)` / `eql_v3.max(...)`** — MIN / MAX over an extracted ordered leaf. -- **`eql_v2.jsonb_array_elements(val eql_v2_encrypted) RETURNS SETOF eql_v2_encrypted`** - - Returns each array element as an encrypted value +### GIN-indexable helpers -- **`eql_v2.jsonb_array_elements_text(val eql_v2_encrypted) RETURNS SETOF text`** - - Returns each array element's ciphertext as text +These build native containment queries; see [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment). -### Helper Functions +- **`eql_v3.jsonb_array(val jsonb) RETURNS jsonb[]`** — encrypted document as a native `jsonb[]` for GIN indexing. +- **`eql_v3.jsonb_contains(a jsonb, b jsonb)`** / **`eql_v3.jsonb_contained_by(a jsonb, b jsonb)`** — containment / reverse-containment checks. -- **`eql_v2.is_ste_vec_array(val eql_v2_encrypted) RETURNS boolean`** - - Returns true if the value represents an encrypted array +### Blocked operators -- **`eql_v2.is_ste_vec_value(val eql_v2_encrypted) RETURNS boolean`** - - Returns true if the value is a single ste_vec element - -- **`eql_v2.to_ste_vec_value(val eql_v2_encrypted) RETURNS eql_v2_encrypted`** - - Converts a ste_vec array with a single element to a regular encrypted value - -- **`eql_v2.selector(val eql_v2_encrypted) RETURNS text`** - - Extracts the selector hash from an encrypted value - -### GIN-Indexable Functions - -These functions enable efficient GIN-indexed containment queries. See [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment) for index setup. - -- **`eql_v2.jsonb_array(val eql_v2_encrypted) RETURNS jsonb[]`** - - Extracts encrypted JSONB as native PostgreSQL jsonb array for GIN indexing - - Create GIN indexes on this function for indexed containment queries - -- **`eql_v2.jsonb_contains(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean`** - - GIN-indexed containment check: returns true if a contains b - - Alternative to `jsonb_array(a) @> jsonb_array(b)` - -- **`eql_v2.jsonb_contained_by(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean`** - - GIN-indexed reverse containment: returns true if a is contained by b - - Alternative to `jsonb_array(a) <@ jsonb_array(b)` - -### Aggregate Functions - -- **`eql_v2.grouped_value(jsonb) RETURNS jsonb`** - - Aggregate function for grouping encrypted values (returns first non-null value in group) +The native `jsonb` operators `?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and root-document `=` `<>` `<` `<=` `>` `>=` are **blocked** on `eql_v3.json` — they `RAISE` rather than running plaintext-jsonb semantics on the encrypted payload. Use containment, field access, or the `eql_v3.jsonb_path_*` functions instead. ## How ste_vec indexing works -Structured Encryption (ste_vec) creates searchable indexes for JSONB by: +Structured Encryption (ste_vec) makes a JSONB document searchable by: -1. **Flattening the JSON structure** - Each unique path to a leaf value gets a selector (hash) -2. **Creating encrypted terms** - Each path prefix and value is encrypted separately -3. **Storing as array** - All encrypted terms are stored in the `sv` (ste_vec) array +1. **Flattening the structure** — each unique path to a leaf gets a deterministic selector hash. +2. **Encrypting terms** — each path and value is encrypted into per-path terms (`hm` for equality; `ocv` / `ocf` CLLW ORE for ordered String / Number leaves). +3. **Storing the `sv` array** — all encrypted terms live in the document's `sv` vector. **Example document:** @@ -309,48 +197,16 @@ Structured Encryption (ste_vec) creates searchable indexes for JSONB by: } ``` -**Creates selectors for:** -- `$` (root object) -- `$.account` (account object) -- `$.account.email` (email field) -- `$.account.email` with value "alice@example.com" -- `$.account.roles` (roles array) -- `$.account.roles[]` (each role value) +**Creates selectors for** `$` (root), `$.account`, `$.account.email` (and its value), `$.account.roles` (and each role value). -**Querying:** - -Containment queries (`@>`) check if all required encrypted terms exist in the target's ste_vec array. This enables queries like: +**Querying:** containment (`@>`) checks that all required encrypted terms exist in the target's `sv` array: ```sql -- Find records where account.email = "alice@example.com" -WHERE encrypted_data @> ''::eql_v2_encrypted - --- Find records where account.roles contains "admin" -WHERE encrypted_data @> ''::eql_v2_encrypted +WHERE encrypted_data @> $1::eql_v3.ste_vec_query; ``` -The actual encryption and selector generation is handled by CipherStash Proxy or Protect.js, not by EQL directly. - ---- - -## `eql_v3` encrypted JSONB — typed operands (important) - -The `eql_v3` schema provides an encrypted-JSONB document type (`eql_v3.json`, built on SteVec) alongside its scalar encrypted domains. It supports the same searchable operations without decryption — document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_*`), and entry-level equality/range on extracted leaves. Every other native `jsonb` operator (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and root-document comparisons) is **blocked** — it raises rather than silently running plaintext-jsonb semantics on the encrypted payload. - -> **Caveat — operands must be typed.** `eql_v3.json` is a PostgreSQL **domain over `jsonb`**. PostgreSQL resolves `domain OP untyped_literal` to the **native** `jsonb` operator, because it flattens the domain to its base type when the right-hand side is an unknown-typed literal. A bare literal therefore **bypasses the encrypted operator (and the blockers) and silently returns native jsonb semantics** — typically a root-key lookup that yields `NULL` — instead of querying the encrypted document or raising. -> -> Always give the operand a known type: -> -> ```sql -> -- ✅ correct — typed operand resolves to the eql_v3 operator -> WHERE doc -> 'email'::text = '' -> WHERE doc -> $1 -- a text parameter (the CipherStash Proxy interface) -> -> -- ⚠ wrong — bare untyped literal resolves to native jsonb -> text, returns NULL -> WHERE doc -> 'email' -> ``` -> -> This is **intrinsic to the domain type-kind**, not a bug: the only way to remove it entirely would be to make `eql_v3.json` a base type (losing free `jsonb` interop). The CipherStash Proxy always passes typed parameters, so applications routing through the Proxy are unaffected; the caveat only matters for hand-written ad-hoc SQL. +Encryption and selector generation are handled by CipherStash Proxy or Protect.js, not by EQL directly. --- From 66863a9a87fe1b6bcde7047887de2885eb9e8e95 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:08:06 +1000 Subject: [PATCH 342/599] docs(query-performance): reduce to a pointer into database-indexes.md (eql_v3) --- docs/reference/query-performance.md | 462 +--------------------------- 1 file changed, 12 insertions(+), 450 deletions(-) diff --git a/docs/reference/query-performance.md b/docs/reference/query-performance.md index a706d1f3e..7d6c48747 100644 --- a/docs/reference/query-performance.md +++ b/docs/reference/query-performance.md @@ -1,459 +1,21 @@ # Writing fast queries against EQL columns -This guide is about getting query performance out of EQL-encrypted columns that's competitive with plain-PostgreSQL workloads. It explains the two practical ingredients — **functional indexes** and **operator inlining** — and shows how to combine them across the common query shapes (`=`, `<` / `>`, `ORDER BY`, `GROUP BY`, `LIKE`, JSONB containment, ste_vec field-level access). +> **This page has moved.** Query and index performance for `eql_v3` encrypted columns is now covered in **[Database Indexes for Encrypted Columns](./database-indexes.md)**, alongside the index recipes themselves. -It applies to EQL 2.3 and later, where the `eql_v2_encrypted` operators became inlinable SQL functions. +Getting EQL-encrypted queries competitive with plain PostgreSQL comes down to one pattern: **index a functional expression over the term extractor, and let bare-form predicates engage it.** The details — and the traps — live in the database-indexes guide: -If you remember nothing else: **use functional indexes**, and **let bare-form predicates do the work** wherever possible. Reach for the extractor form when (a) you need an index for a query shape that the natural form can't drive (`ORDER BY` on the encrypted column), or (b) your column's term configuration falls outside the canonical Block ORE / HMAC pair. +- [Creating indexes](./database-indexes.md#creating-indexes) — the `eql_v3.eq_term` / `ord_term` / `match_term` recipes (no operator class on a column). +- [How index engagement works](./database-indexes.md#how-index-engagement-works) — extractor inlining and structural matching. +- [Range queries and the `ORDER BY` sort-key trap](./database-indexes.md#range-queries-and-order-by) — write `ORDER BY eql_v3.ord_term(col)` to avoid a Sort node. +- [`GROUP BY` / `DISTINCT`](./database-indexes.md#group-by--distinct) — group on `eql_v3.eq_term(col)`, not the raw column, to stay inside `work_mem`. +- [GIN indexes for JSONB containment](./database-indexes.md#gin-indexes-for-jsonb-containment) — `eql_v3.json` document search. +- [Building indexes on large tables](./database-indexes.md#performance-building-indexes-on-large-tables) — `maintenance_work_mem`, btree-vs-hash build scaling, the de-TOAST floor. +- [Diagnosing queries with `EXPLAIN`](./database-indexes.md#diagnosing-queries-with-explain). ---- - -## 1. Why functional indexes - -The two recipes for putting a PostgreSQL index on an `eql_v2_encrypted` column are: - -| Recipe | Shape | Example | -| --- | --- | --- | -| **Functional** *(canonical)* | Index over a deterministic extractor that yields a small per-row term | `CREATE INDEX … ON users (eql_v2.hmac_256(email_encrypted));` | -| **Operator class** *(legacy)* | Index over the whole `eql_v2_encrypted` column via a custom btree opclass | `CREATE INDEX … ON users (email_encrypted eql_v2.encrypted_operator_class);` | - -The operator-class recipe ships with EQL and still works, but **functional indexes are the recommended path for new schemas** because: - -1. **Small leaves (space efficiency).** A functional index on `eql_v2.hmac_256(col)` stores only the 32-byte HMAC per row. The operator-class index stores the entire encrypted payload (often kilobytes), inflating the btree and risking the `index row size N exceeds btree version 4 maximum 2704` error on full-payload columns. -2. **No superuser required.** Functional indexes work on Supabase and managed PostgreSQL installations that don't ship the `eql_v2.encrypted_operator_class`. -3. **The planner can match them structurally.** EQL's operators on `eql_v2_encrypted` (`=`, `<>`, `<`, `<=`, `>`, `>=`, `LIKE`, `ILIKE`, `@>`, `<@`) are now inlinable SQL functions whose bodies reduce to a comparison on the extracted term. The planner inlines the operator at planning time, rewrites the predicate into the same expression as the index, and uses the index — without any query rewriting on the caller's side. - -See [database-indexes.md](./database-indexes.md) for the full enumeration of functional-index recipes. The short list: - -```sql --- Equality -CREATE INDEX … USING hash (eql_v2.hmac_256(col)); - --- Range / ORDER BY (Block ORE) -CREATE INDEX … ON tbl (eql_v2.ore_block_u64_8_256(col)); --- DEFAULT opclass is eql_v2.ore_block_u64_8_256_operator_class; no annotation needed. - --- LIKE / ILIKE -CREATE INDEX … USING GIN (eql_v2.bloom_filter(col)); - --- JSONB containment / ste_vec -CREATE INDEX … USING GIN (eql_v2.jsonb_array(col)); - --- Field-level equality from an ste_vec document --- Per-selector (one index per hot path): -CREATE INDEX … USING hash (eql_v2.hmac_256(col, '')); --- All-selector (one index covers every sv element with an hm term): -CREATE INDEX … USING GIN (eql_v2.hmac_256_terms(col)); -``` - -Always run `ANALYZE` after creating an index. PostgreSQL's planner uses table statistics to decide whether an index lookup beats a sequential scan — without stats, it'll often choose the seq scan even when an index would be cheaper. - ---- - -## 2. Operator inlining: the mechanics - -PostgreSQL inlines a SQL function when **all** of these conditions hold: - -- `LANGUAGE sql` (not `plpgsql`). -- The body is a single `SELECT` returning the same type the function declares. -- No `SET` clause on the function definition. `SET search_path = …` is the usual culprit, but *any* `SET` clause blocks inlining. -- Declared volatility (`IMMUTABLE` / `STABLE` / `VOLATILE`) is at least as restrictive as anything the body calls into. - -When the planner inlines an operator, it replaces the operator's function call with the body. So `WHERE col = $1` — where `=` is `eql_v2."="(eql_v2_encrypted, eql_v2_encrypted)` — becomes `WHERE eql_v2.hmac_256(col) = eql_v2.hmac_256($1)` during planning. The planner then matches that rewritten expression against indexes. - -The matching is **syntactic on the expression tree**: the function OID and argument shape on the predicate's LHS must equal the function OID and argument shape on the index's defining expression. The planner does not reason about semantic equivalence — `eql_v2.hmac_256(col)` and `col` are different trees, so an index on the former can't satisfy a predicate that mentions only the latter (without inlining first). - -This is why pinning `search_path` on an EQL operator function via `ALTER FUNCTION … SET search_path = …` would kill inlining and silently revert bare-form queries to sequential scans. EQL's build pins `search_path` on every `eql_v2.*` function for the Supabase `function_search_path_mutable` lint, with an explicit allowlist for the operator wrappers that need to stay inlinable. The current allowlist covers `=`, `<>`, `<`, `<=`, `>`, `>=`, `~~`, `~~*`, `@>`, `<@` and the helpers they delegate into. - -### How to verify inlining is working - -`EXPLAIN` is the canonical check. With inlining engaged, the plan's `Index Cond:` or `Filter:` line shows the **rewritten** expression — i.e. the extractor form — not the operator you wrote. For example: - -``` -Index Scan using users_email_hmac_idx on users - Index Cond: ((eql_v2.hmac_256(email_encrypted))::text = (eql_v2.hmac_256('...'::eql_v2_encrypted))::text) -``` - -If you see the *operator* in the plan rather than the *extractor* (`Filter: (col < '...'::eql_v2_encrypted)`), inlining isn't happening. Common causes: - -- The function has a `SET` clause (`\df+ eql_v2.…` will show `proconfig`). -- The function is `plpgsql` (look at `prolang`). -- An inner helper that the operator body calls is `VOLATILE` or has a `SET` clause — inlining is transitive, so an inlinable wrapper around a non-inlinable helper still won't inline. -- The planner thinks a different plan is cheaper (e.g. an `ORDER BY pk LIMIT n` driving the primary-key index instead of your functional index). Force the question with `SET enable_seqscan = off` or stronger selectivity to see if the planner *can* use the index. - ---- - -## 3. Natural form vs extractor form - -There are a few ways to write a comparison against an encrypted column. They differ only in how explicit you make the extractor; after inlining they reach the same index. - -The operators ship with three overloads each — `(encrypted, encrypted)`, `(encrypted, jsonb)`, `(jsonb, encrypted)` — so all three predicate shapes inline equivalently. After inlining, `col = $1`, `col = '{…}'::jsonb` and `'{…}'::jsonb = col` all reduce to the same canonical expression. There's no performance penalty for any of those bindings; pick whichever fits your client. - -**Natural form.** Write the query the way you would for an unencrypted column. The operator inlines, the canonical extractor appears in the predicate, and the functional index matches structurally. - -```sql -SELECT * FROM users WHERE email_encrypted = $1; -SELECT * FROM events WHERE encrypted_at < $1; -SELECT * FROM products WHERE encrypted_name LIKE $1; -``` - -**Extractor form.** Write the extractor explicitly on both sides. This is the canonical pattern for query shapes where the natural form's operator isn't inlinable, or where you want to control which term type drives the comparison (e.g. on a column with multiple ORE encodings). - -```sql -SELECT * FROM users - WHERE eql_v2.hmac_256(email_encrypted) = eql_v2.hmac_256($1::jsonb); -``` - -**Hybrid form.** Natural form in the `WHERE` clause, extractor form in `ORDER BY`. This is the pragmatic shape for ordered range queries because it lets the index satisfy both the predicate filter *and* the sort key (see §4). - -```sql -SELECT * FROM events - WHERE encrypted_at < $1 - ORDER BY eql_v2.ore_block_u64_8_256(encrypted_at) - LIMIT 100; -``` - -### When to use which - -For columns configured with the canonical term for the query shape (HMAC for equality, Block ORE for ranges, bloom filter for `LIKE`, ste_vec for containment), the natural form is the right default. It reads cleanly, ORMs and PostgREST emit it without coaxing, and the planner does the rewriting transparently. - -Reach for the extractor form when: - -- **The column doesn't carry the canonical term for the natural-form operator.** E.g. a column configured with `ore_cllw_u64_8` instead of `ore_block_u64_8_256` will raise from the natural-form `<` after the range-operator inlining — write `WHERE eql_v2.ore_cllw_u64_8(col) < eql_v2.ore_cllw_u64_8($1::jsonb)` instead. -- **You want a sort key that the index can satisfy without a Sort node** (see §4). -- **You want a per-field index on an ste_vec document** — the field-level recipes (`eql_v2.hmac_256(col, '')` and `eql_v2.hmac_256_terms(col)`) only work in extractor form because the selector isn't part of any natural-form SQL operator. -- **You're debugging a plan and want to bypass the inlining question entirely.** Plans with the extractor written out leave nothing to inference; the predicate matches the index by direct text identity. - ---- - -## 4. `ORDER BY`: the sort-key trap - -`WHERE` and `ORDER BY` look symmetric in SQL, but they reach a functional index through different paths. The planner inlines operators in predicates, so `WHERE col < $1` rewrites itself to match an index on `f(col)`. It does no such rewrite for sort keys: `ORDER BY col` and `ORDER BY f(col)` are not interchangeable to the planner, even when they'd sort the rows identically. - -Concretely: functional indexes can satisfy `ORDER BY` only when the sort key **syntactically matches** the index expression. The planner doesn't reason about monotonicity, so an index over `eql_v2.ore_block_u64_8_256(col)` will not satisfy `ORDER BY col` directly even though ORE is order-preserving. - -Three query shapes to compare: - -```sql --- (a) Natural form -SELECT * FROM events - WHERE encrypted_at < $1 - ORDER BY encrypted_at - LIMIT 10; - --- (b) Hybrid: natural WHERE, extractor ORDER BY -SELECT * FROM events - WHERE encrypted_at < $1 - ORDER BY eql_v2.ore_block_u64_8_256(encrypted_at) - LIMIT 10; - --- (c) Fully extractor -SELECT * FROM events - WHERE eql_v2.ore_block_u64_8_256(encrypted_at) < eql_v2.ore_block_u64_8_256($1::jsonb) - ORDER BY eql_v2.ore_block_u64_8_256(encrypted_at) - LIMIT 10; -``` - -With a functional Block ORE index in place (`CREATE INDEX … ON events (eql_v2.ore_block_u64_8_256(encrypted_at))`), the plans differ: - -- **(a) Natural** — `Bitmap Index Scan` via the inlined `<`, plus a `Sort` (Top-N because of the `LIMIT`) by `encrypted_at`. The sort key doesn't match the index expression, so the Sort can't be eliminated. Each comparison inside the Sort step uses the inlined ORE-term path — but you still do one per post-WHERE row. -- **(b) Hybrid** — `Index Scan` over the functional ORE index, walking it in order. No `Sort` node. The `WHERE` is satisfied by `Index Cond` and rows stream out of the index already in the desired order. -- **(c) Fully extractor** — same plan as (b). The natural-form `<` inlines into the same predicate shape, so the planner can't tell (b) and (c) apart after planning. - -Empirically on the bench tables, with `WHERE value < $1 … LIMIT 10` (selectivity around 0.5): - -| Rows | (a) natural | (b) hybrid | (c) fully extractor | -| --- | --- | --- | --- | -| 100k | ~880 ms | <2 ms | <2 ms | -| 1M | ~8.8 s | ~1 ms | ~1 ms | - -The natural-form Top-N scales linearly with the number of rows passing `WHERE` — at 1M with our selectivity that's ~500k inlined ORE-term comparisons in the Sort step, which is several seconds even when each comparison is cheap. **For ordered range queries on encrypted columns, write the `ORDER BY` in extractor form.** It's the same plan as (c) post-inlining; only the source-level syntax differs. - -The bench suite (`cipherstash/benches`) keeps only the extractor-form scenario (`range_lt_ordered_10`) for this reason: (a) is the trap this section warns about, and (c) plans identically to (b) — measuring all three only inflates the run cost without surfacing a new behaviour. - -### 4.1 Field-level `ORDER BY` (ste_vec elements) - -Same trap, same fix at the sv-element level. With a Standard-mode `ste_vec` index the orderable term on each sv element is `oc` (ORE CLLW), and the canonical recipe is a functional btree on the *extractor* applied to a selector: - -```sql --- Build a functional ORE-CLLW index on the orderable sv element -CREATE INDEX users_age_oc_idx - ON users (eql_v2.ore_cllw(data_encrypted -> ''::text)); -ANALYZE users; -``` - -The `eql_v2.ore_cllw_ops` opclass is `DEFAULT FOR TYPE eql_v2.ore_cllw`, so no explicit opclass annotation is needed. - -Two query shapes at the field level: - -```sql --- (a) Bare form — Seq Scan + Top-N sort, linear in table size -SELECT id FROM users - ORDER BY (data_encrypted -> ''::text) - LIMIT 10; - --- (b) Extractor form — Index Scan, walks the btree in order -SELECT id FROM users - ORDER BY eql_v2.ore_cllw(data_encrypted -> ''::text) - LIMIT 10; -``` - -The bare form (a) doesn't engage the index even when it's present. `eql_v2."->"` is `plpgsql` (it walks the `sv` array picking the matching selector), and the planner can't see through a plpgsql function call to match the sort key against the indexed expression. The plan is always Seq Scan + Top-N — at 1M rows that's ~20 s versus ~1 ms with the extractor form, which is the entire point of the index. - -For the same reason the JSON bench suite (`cipherstash/benches`, `benches/json.rs`) does not include a `field_order/bare` scenario. The functional form is the documented recipe; measuring the bare form just demonstrates the cost of *not* following it, which is fixture noise rather than a meaningful EQL performance signal. - -**For ordered field-level queries on encrypted JSON, write `ORDER BY` against the extractor.** This is the only field-level shape that scales. - -### 4.2 Projection-pushdown: the `value::jsonb` cast trap - -There's a second, subtler way to lose the index-driven sort, even when you've already written `ORDER BY` correctly. When the `SELECT` projects the same column you `ORDER BY` and applies a cast to that projection — typically `value::jsonb` to coerce an `eql_v2_encrypted` column into something a generic driver can decode — PostgreSQL pushes the cast into the inner scan output and **uses the projected (post-cast) expression as the sort key**. `EXPLAIN` will show `Sort Key: ((value)::jsonb)` rather than `Sort Key: value`. That expression is syntactically distinct from anything you could index — neither a btree on `value` with the default `eql_v2.encrypted_operator_class` nor a functional btree on `eql_v2.ore_block_u64_8_256(value)` matches `(value)::jsonb`. - -```sql --- TRAP: cast in SELECT + bare column in ORDER BY --- Plan: Sort Key: ((value)::jsonb), no index-for-sort, falls back to --- SeqScan/Bitmap + Sort even though a perfectly good index exists. -SELECT id, value::jsonb FROM events - WHERE value < $1 - ORDER BY value LIMIT 10; -``` - -The fix is to keep the sort scope clear of the cast. Two options: - -```sql --- (i) Project the column raw — no cast for the planner to fold into the --- sort key. Requires a driver that can decode eql_v2_encrypted --- directly (e.g. via a custom sqlx Type). -SELECT id, value FROM events - WHERE value < $1 - ORDER BY value LIMIT 10; - --- (ii) Wrap the sort in a subquery so the cast applies outside the LIMIT. --- The inner plan sees only `value`; the cast runs on the 10 emitted --- rows in the outer projection. -SELECT id, value::jsonb FROM ( - SELECT id, value FROM events - WHERE value < $1 - ORDER BY value LIMIT 10 -) sub; -``` - -Important: this trap only fires when the sort key column is the same as the projected-cast column. The recommended **extractor form** of §4 (`ORDER BY eql_v2.ore_block_u64_8_256(value)`) is structurally distinct from `(value)::jsonb`, so projecting `value::jsonb` alongside is safe — the sort key matches the functional index either way and the cast just runs on the LIMIT'd rows. - -The bench suite at `cipherstash/benches` ships a custom `EqlV2Encrypted` sqlx type and projects `value` raw across every scenario for exactly this reason: a future scenario that adds `ORDER BY value` (or `ORDER BY (value -> 'sel')` at the field level) can't accidentally walk into the trap. - -Why does PostgreSQL push the cast into the scan? It's a projection-pushdown optimisation: computing `value::jsonb` early narrows the rows fed into Sort/Hash/Materialize nodes — `1100 → 36` bytes per row in the bench's ORE-encoded `i32` case. That's normally a big win; the cost model just doesn't account for "preserving sort-key matchability against an indexed expression." The optimisation is right in expectation and wrong in this specific case. - ---- - -## 5. Equality and `GROUP BY` / `DISTINCT` - -Equality is the simplest case: `WHERE col = $1` on a column with a `unique` search index (i.e. carrying an `hm` HMAC term) and a functional hash index on `eql_v2.hmac_256(col)` will engage the index transparently. - -```sql -SELECT eql_v2.add_search_config('users', 'email_encrypted', 'unique', 'text'); --- proxy / client encrypts data through this column … -CREATE INDEX users_email_hmac_idx ON users USING hash (eql_v2.hmac_256(email_encrypted)); -ANALYZE users; - -SELECT * FROM users WHERE email_encrypted = $1; --- Index Scan using users_email_hmac_idx --- Index Cond: ((eql_v2.hmac_256(email_encrypted))::text = (eql_v2.hmac_256(...))::text) -``` - -**`GROUP BY` is a different beast — and the extractor form is the only recipe that scales.** Use it. Even at moderate row counts the natural form's plan choice degrades pathologically; the extractor form sidesteps the trap entirely and works the same way on every Postgres deployment, including Supabase and managed services where you can't tune `work_mem`. - -The canonical recipe for `GROUP BY` (and `DISTINCT`, and `IN (subquery)`, and hash joins) on an encrypted column: - -```sql -SELECT eql_v2.hmac_256(email_encrypted), count(*) - FROM users - GROUP BY eql_v2.hmac_256(email_encrypted); -``` - -Why this is the right shape: - -- **The group key is small.** `eql_v2.hmac_256(col)` returns a 32-byte HMAC. At 1M rows the in-memory hash table is well under 100 MB, which fits inside the default `work_mem = 4MB` per partition many times over — so the planner picks `HashAggregate` reliably, without any deployment-wide tuning. -- **The extractor inlines.** `eql_v2.hmac_256(val)` is a single-statement SQL function whose body is essentially `(val).data ->> 'hm'`. The planner folds it into the aggregation, so each row pays a single jsonb lookup. No plpgsql function-call overhead per row, no opaque dispatch. -- **It matches a functional index.** If you have a `unique` search config on the column and a `CREATE INDEX … USING hash (eql_v2.hmac_256(col))` — the same index you'd build for fast equality — `IN (subquery)` and hash joins against `eql_v2.hmac_256(col)` can use it directly. `GROUP BY` itself doesn't use the index (hash aggregation is in-memory, not index-driven), but everything else that hashes against the same key does. - -### Why the natural form doesn't scale - -The natural form looks fine on paper: - -```sql --- Avoid. Falls into the work_mem / planner trap below. -SELECT email_encrypted, count(*) - FROM users - GROUP BY email_encrypted; -``` - -The trap is in the planner's cost model. PostgreSQL has two aggregation strategies — `HashAggregate` (in-memory hash table keyed by the GROUP BY expression) and `GroupAggregate` (sort the input, then collapse adjacent equal rows). The planner picks between them on cost, and the cost model is *very* sensitive to the size of the group key — because the hash table for HashAggregate has to fit in `work_mem`. - -On an encrypted column, the natural-form key is the entire `eql_v2_encrypted` payload — typically 1-2 KB per row. At 100k rows the planner estimates a 100-200 MB hash table, which exceeds the default `work_mem = 4MB` by two orders of magnitude. The planner refuses HashAggregate and falls back to GroupAggregate. GroupAggregate sorts the input, which means an O(N log N) pass over kilobyte-sized rows — the per-comparison cost is small (the `=` operator is inlinable SQL post-2.3, so each comparison reduces to a 32-byte HMAC comparison), but the sort still dominates wall-clock time and spills to disk past `work_mem`. - -Measured at 100k rows on the bench tables: - -| Query form | Plan | Time | -| --- | --- | --- | -| `GROUP BY col` (natural, default 4 MB work_mem) | GroupAggregate + Sort (disk spill) | ~29 s | -| `GROUP BY col` (natural, work_mem bumped to 256 MB) | HashAggregate | ~780 ms | -| `GROUP BY eql_v2.hmac_256(col)` (extractor) | HashAggregate | ~80 ms | - -Bumping `work_mem` recovers the natural form from "minutes" to "sub-second" by changing the planner's choice — a 37× improvement just from one setting. The extractor form is another ~10× on top of that and doesn't depend on a deployment-wide knob. At 1M rows the natural form's GroupAggregate sort takes around 4 minutes even with `work_mem = 512MB`; the extractor form stays sub-second. - -The takeaway: write the extractor form. If you have a query you can't rewrite (an ORM that's GROUP BY-ing the raw column, a third-party report tool), bumping `work_mem` to a size that fits the estimated hash table is the rescue knob — but don't make that the design. - -### `DISTINCT` and ste_vec field-level - -`DISTINCT col` follows the same rules — `SELECT DISTINCT eql_v2.hmac_256(col) FROM tbl` is the recipe. If you only need set membership and not the original encrypted value back, the extractor form is what you want regardless of table size. - -For ste_vec documents, field-level `GROUP BY` works analogously: - -```sql -SELECT eql_v2.hmac_256(data_encrypted, ''), count(*) - FROM users - GROUP BY eql_v2.hmac_256(data_encrypted, ''); -``` - -If multiple selectors are aggregated hot, prefer the per-selector hash index over each. If many selectors are needed and a single index is preferable, build a GIN index over `eql_v2.hmac_256_terms(col)` and use containment queries (`@>`) — though that path is for filtering rather than `GROUP BY`. - ---- - -## 6. `LIKE` / `ILIKE` (bloom filter) - -The bloom filter index handles substring and token-style pattern matching. The natural form inlines through `~~` (the underlying operator behind `LIKE`): - -```sql -SELECT eql_v2.add_search_config('users', 'name_encrypted', 'match', 'text'); --- repopulate column through the proxy … -CREATE INDEX users_name_bloom_idx - ON users USING GIN (eql_v2.bloom_filter(name_encrypted)); -ANALYZE users; - -SELECT * FROM users WHERE name_encrypted LIKE $1; --- Bitmap Index Scan on users_name_bloom_idx --- Index Cond: (eql_v2.bloom_filter(name_encrypted) @> eql_v2.bloom_filter('...'::eql_v2_encrypted)) -``` - -Bloom filters return a probabilistic superset — the planner reads "this row *might* match" from the bitmap, and PostgreSQL re-checks the original predicate on each candidate row. The recheck step uses the inlined bloom-filter containment, not a string match. The bloom filter is configured at column-config time (`{"token_filters": [{"kind": "ngram", "token_length": …}]}` etc.); see [index-config.md](./index-config.md). - -Case-insensitivity (`ILIKE`) is only effective when the match index is configured with a `downcase` token filter. Without it, `ILIKE` behaves identically to `LIKE` because the bloom filter has no notion of case post-encryption. - ---- - -## 7. JSONB containment, ste_vec, and field-level extraction - -For encrypted JSONB documents (`ste_vec` indexes), the canonical pattern is GIN over `eql_v2.jsonb_array(col)`: - -```sql -SELECT eql_v2.add_search_config('orders', 'data_encrypted', 'ste_vec', 'jsonb'); -CREATE INDEX orders_data_gin_idx - ON orders USING GIN (eql_v2.jsonb_array(data_encrypted)); -ANALYZE orders; - --- Document-level containment -SELECT * FROM orders WHERE data_encrypted @> $1::jsonb; --- Bitmap Index Scan on orders_data_gin_idx --- Index Cond: (eql_v2.jsonb_array(data_encrypted) @> eql_v2.jsonb_array('...'::eql_v2_encrypted)) -``` - -For field-level lookups (`data_encrypted->'email' = $1`), use the per-selector hash recipe for hot paths and the all-selector GIN recipe for everything else. Both are listed in §1; both require the extractor form because the selector isn't part of any native SQL operator. - -`eql_v2.jsonb_path_query`, `_first`, and `_exists` are inlinable SQL functions that walk the `sv` array filtering by selector. Use them when you need the full sub-payload back; use `eql_v2.hmac_256(col, '')` when you only need an equality check on the selector's value. - ---- - -## 8. A short list of common pitfalls - -- **Index created before data was populated through Proxy or Stack.** EQL search-config + functional index is a two-phase process: configure the index, repopulate the column through [Proxy](https://github.com/cipherstash/proxy) or [Stack](https://github.com/cipherstash/stack) so the encrypted terms land in the payload, *then* `CREATE INDEX … ANALYZE`. The other order silently leaves the index without the values it needs. -- **`ANALYZE` not run.** PostgreSQL's planner uses table statistics. Small tables get sequential scans even when an index would be cheaper, but on larger tables a missing `ANALYZE` can also mask an index that *should* be picked. -- **Stale opclass index alongside a functional index.** If you migrate an old schema from `eql_v2.encrypted_operator_class` to functional indexes, drop the old opclass index. Two btree indexes on the same column compete for cache and double the maintenance cost on writes. -- **Pinning `search_path` on an EQL function.** Adding `SET search_path = …` to an `eql_v2.*` function disables inlining and reverts queries through that function to sequential scans. The EQL build allowlists operator wrappers that must stay inlinable; if you're customising the install, preserve that allowlist. -- **`ORDER BY` on the natural form expecting an `Index Scan`.** The Sort node is required (§4). If you need it gone, switch the `ORDER BY` to extractor form. -- **`=` / `<>` returning zero rows silently on a column without `hm`.** Equality requires the column to carry an `hm` HMAC term. Without it, `eql_v2.hmac_256(col)` returns NULL and the operator comparison evaluates to NULL — false in a WHERE context. `eql_v2.hash_encrypted` (the discriminator behind `GROUP BY` / `DISTINCT` / hash joins) doesn't raise on missing `hm` either — it falls back to hashing the encrypted payload bytes, which keeps the aggregate's hash table from degrading to O(N²) on a single NULL bucket but no longer gives you a runtime smoke signal. Audit at config time instead: `SELECT eql_v2.has_hmac_256(col) FROM tbl LIMIT 1`. -- **`GROUP BY` on the raw encrypted column at scale.** §5 details the trap, but it's worth repeating in pitfalls form: `GROUP BY col` on an `eql_v2_encrypted` column past ~10k rows falls into GroupAggregate-with-disk-spill territory because the natural-form key is 1-2 KB per row and the hash table can't fit in `work_mem`. Write `GROUP BY eql_v2.hmac_256(col)` instead. The extractor form is the only `GROUP BY` recipe that holds up at production scale on default Postgres settings. -- **Range queries (`<`, `<=`, `>`, `>=`) on columns with only `ore_cllw_*` or OPE terms.** The range operators are Block ORE only post-2.3 (see [U-005 in v2.3.md](../upgrading/v2.3.md#u-005-range-operators-are-block-ore-only)). Migrate the column to `ore` or switch the query to the extractor form for the relevant CLLW / OPE encoding. - ---- - -## 9. Diagnosing performance with `EXPLAIN` - -The first move on any slow EQL query is `EXPLAIN (COSTS OFF)`. Look for: - -- **`Index Scan using `** — the planner is using the functional index. ✓ -- **`Bitmap Index Scan on `** — same, for set-style predicates (`@>`, `LIKE`). ✓ -- **`Index Cond:`** — the inlined predicate matched the index expression. Should reference the extractor (`eql_v2.hmac_256(…)`, `eql_v2.ore_block_u64_8_256(…)`, …), not the raw operator. -- **`Seq Scan`** — sequential scan, no index used. Investigate. -- **`Filter:`** showing the raw operator (`col < '…'::eql_v2_encrypted`) — inlining didn't happen. See §2's troubleshooting list. -- **`Sort` node above an Index Scan** — natural-form `ORDER BY`; expected for that shape. Switch to hybrid form (§4) to eliminate it. - -Once a plan looks right, repeat with `EXPLAIN ANALYZE` to measure actual timings. The bottleneck on a working plan is usually the per-row evaluation cost (extractor → comparison → recheck), so a clean plan with bad timing usually means a missing inlining step somewhere in the chain — re-run §2's checks on the helper functions. - ---- - -## 10. Building indexes on large tables - -Everything above is about query time. Index *build* time is a separate axis, and on large encrypted tables it is the one that bites: a functional index that queries in a millisecond can still take hours — or fail to finish — to `CREATE`. Three things govern it. - -### `maintenance_work_mem`, not `work_mem` - -`CREATE INDEX` builds draw on `maintenance_work_mem`. The default is 64 MB — far too small for a multi-million-row build; the sort (btree) or bucket fill (hash) spills to disk early and the build goes I/O-bound. Raise it for the session before a large build: - -```sql -SET maintenance_work_mem = '2GB'; -- per-build; only one build runs at a time -CREATE INDEX … ; -``` - -It is the single highest-leverage knob for build time. On a managed deployment where you can't set it per-session, raise it cluster-wide for the maintenance window. - -### Index type decides whether the build scales - -The §1 recipes name a specific access method — `hash` for equality, `btree` for Block ORE, `GIN` for bloom filter and ste_vec. For *query* performance the choice is settled. For *build* performance at scale the methods are not equivalent: - -| Access method | Build algorithm | Scales past cache? | Parallel build? | -| --- | --- | --- | --- | -| **btree** | sort, then bulk-load the tree bottom-up — sequential writes | yes | yes (`max_parallel_maintenance_workers`) | -| **GIN** | batched buffer build | yes | no | -| **hash** | fill buckets keyed by hash value | **no** | no | - -A hash build places each entry in a bucket chosen by its hash, scattering consecutive heap rows to random buckets across the index. Once the index outgrows `shared_buffers` + OS cache the build becomes random-I/O-bound and the insert rate degrades monotonically — and it cannot be parallelised. A btree build sidesteps this entirely: it sorts every entry first, then writes the tree out sequentially, and spreads the work across parallel workers. - -**For equality functional indexes on large tables, prefer `btree` over `hash`.** `eql_v2.hmac_256(col)` — and the field-level `eql_v2.eq_term(col -> '')` — return small deterministic terms; a btree on them serves `=` exactly as well as a hash index, with no query-side cost, and the build goes from pathological to routine: - -```sql -CREATE INDEX … USING btree (eql_v2.hmac_256(col)); -- large tables -CREATE INDEX … USING hash (eql_v2.hmac_256(col)); -- small / medium tables -``` - -Measured: a `hash` functional index on a 10M-row encrypted-JSONB column ran for 17 hours to 73% and then stalled, the insert rate decaying toward zero — it never completed. The `btree` equivalent, with `maintenance_work_mem` raised, builds without drama. Hash is not wrong — it is a fine choice up to mid-six-figure row counts — but its *build* does not scale, so reserve it for tables that won't grow into the millions. - -### The de-TOAST floor - -A functional index over a large encrypted column [de-TOASTs](https://www.postgresql.org/docs/current/storage-toast.html) the whole stored value once per row to evaluate the extractor — and an ste_vec JSONB document is large. This cost is unavoidable and identical across access methods: a GIN, btree, or hash build on the same column all pay it. It sets the build's *floor* rate; the memory and index-type choices above decide whether you stay near that floor or fall far below it. (There is no partial de-TOAST for JSONB — `col -> 'selector'` materialises the entire document.) - -### Storage matters more than it does for queries - -Index builds are I/O-heavy in a way steady-state queries are not. Containerised PostgreSQL on a virtualised filesystem — notably Docker Desktop on macOS — pays a steep penalty here: the random TOAST reads a functional-index build performs are the worst case for a VM I/O layer. For large builds, run PostgreSQL on native storage / fast NVMe. The same build can differ by more than an order of magnitude between a Docker-for-Mac volume and a native cluster on the same hardware. - -### Diagnosing a slow build - -`pg_stat_progress_create_index` is the build-time analogue of `EXPLAIN`. Query it from a second session while a `CREATE INDEX` runs: - -```sql -SELECT phase, tuples_done, tuples_total, - round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS pct -FROM pg_stat_progress_create_index; -``` - -Sample `tuples_done` a few times. A steady rate means the build is healthy and finishes in `(tuples_total − tuples_done) / rate`. A rate that **decays over time** is the cache/memory wall — raise `maintenance_work_mem`, and if it's a hash index, rebuild it as a btree. - -And, as always (§1): `ANALYZE` after every build. `CREATE INDEX` on an *expression* gathers no statistics on that expression — without an `ANALYZE` the planner has no histogram for `eql_v2.hmac_256(col)` and can misjudge the very index you just built. +For which operators each domain variant supports, see the [SQL support matrix](./sql-support.md). --- -## See also +### Didn't find what you wanted? -- [Database Indexes for Encrypted Columns](./database-indexes.md) — index recipes and creation order. -- [SQL support matrix](./sql-support.md) — which operators work against which search-config kinds. -- [EQL index configuration](./index-config.md) — `add_search_config` reference. -- [Upgrading to v2.3](../upgrading/v2.3.md) — the operator-inlining contract that this guide depends on (U-002, U-005). +[Click here to let us know what was missing from our docs.](https://github.com/cipherstash/encrypt-query-language/issues/new?template=docs-feedback.yml&title=[Docs:]%20Feedback%20on%20query-performance.md) From e35ef243baef17c77ac553060be294e49ce508d7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:09:48 +1000 Subject: [PATCH 343/599] docs(eql-functions): drop eql_v2 config/extractor/helper sections; re-author operators and keep eql_v3 surface --- docs/reference/eql-functions.md | 756 +++----------------------------- 1 file changed, 66 insertions(+), 690 deletions(-) diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index 91c4013f2..86202da5d 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -1,681 +1,126 @@ # EQL Functions Reference -This document provides a comprehensive reference for all EQL (Encrypt Query Language) functions available for querying encrypted data in PostgreSQL. +A reference for the functions and operators EQL exposes for querying encrypted data in PostgreSQL. The surface lives in the **`eql_v3`** schema and is organised around the per-scalar encrypted-domain types (`eql_v3.` and variants) and the encrypted-JSON document type (`eql_v3.json`). + +> **There is no database-side configuration API.** Which index terms a value carries is chosen by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs)); a column's capability is fixed by the **domain variant** you type it as. See [SQL support matrix](./sql-support.md) for the variant/operator table. ## Table of Contents -- [Configuration Functions](#configuration-functions) -- [Query Functions](#query-functions) - - [Operators (Recommended)](#operators-recommended) - - [Function Equivalents](#function-equivalents) -- [Index Term Extraction Functions](#index-term-extraction-functions) -- [JSONB Path Functions](#jsonb-path-functions) -- [Array Functions](#array-functions) -- [Helper Functions](#helper-functions) +- [Operators](#operators) +- [Function Equivalents](#function-equivalents) +- [Index Term Extraction](#index-term-extraction) +- [Encrypted JSON (`eql_v3.json`)](#encrypted-json-eql_v3json) - [Aggregate Functions](#aggregate-functions) -- [Utility Functions](#utility-functions) --- -## Configuration Functions - -These functions manage encrypted column configurations. See [Configuration Tutorial](../tutorials/proxy-configuration.md) for detailed usage. - -### `eql_v2.add_column()` - -Initialize a column for encryption/decryption. - -```sql -eql_v2.add_column( - table_name text, - column_name text, - cast_as text DEFAULT 'text', - migrating boolean DEFAULT false -) RETURNS jsonb -``` - -**Example:** -```sql -SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); -``` - -### `eql_v2.add_search_config()` +## Operators -Add a searchable index to an encrypted column. +EQL overloads standard PostgreSQL operators on the encrypted-domain types. Type the column as the variant that carries the term, and the operator resolves (and engages a matching [functional index](./database-indexes.md)). Operands must be typed — a typed parameter (`$1`, supplied by the Proxy) or an explicit cast — or they fall through to native `jsonb`. -```sql -eql_v2.add_search_config( - table_name text, - column_name text, - index_name text, -- 'unique', 'match', 'ore', 'ste_vec' - cast_as text DEFAULT 'text', - opts jsonb DEFAULT '{}', - migrating boolean DEFAULT false -) RETURNS jsonb -``` +### Equality — `=` `<>` -**Supported index types:** -- `unique` - Exact equality (uses hmac_256) -- `match` - Full-text search (uses bloom_filter) -- `ore` - Range queries and ordering (uses ore_block_u64_8_256) -- `ste_vec` - JSONB containment queries (uses structured encryption) +On `eql_v3._eq`, `eql_v3._ord` / `_ord_ore`, and `eql_v3.text_search` (carry an `hm` term): -**Example:** ```sql -SELECT eql_v2.add_search_config('users', 'encrypted_email', 'unique', 'text'); -SELECT eql_v2.add_search_config('docs', 'encrypted_content', 'match', 'text'); -SELECT eql_v2.add_search_config('events', 'encrypted_data', 'ste_vec', 'jsonb', '{"prefix": "events/encrypted_data"}'); +SELECT * FROM users WHERE encrypted_email = $1; +SELECT * FROM users WHERE encrypted_email = $1::eql_v3.text_eq; +SELECT * FROM users WHERE encrypted_email <> $1; ``` -### `eql_v2.remove_column()` +### Range — `<` `<=` `>` `>=` -Remove column configuration completely. +On `eql_v3._ord` / `_ord_ore` and `eql_v3.text_search` (carry an `ob` ORE term): ```sql -eql_v2.remove_column( - table_name text, - column_name text, - migrating boolean DEFAULT false -) RETURNS jsonb -``` - -### `eql_v2.remove_search_config()` +SELECT * FROM events WHERE encrypted_at < $1::eql_v3.timestamptz_ord; +SELECT * FROM events WHERE encrypted_at >= $1::eql_v3.timestamptz_ord; -Remove a specific search index (preserves column configuration). - -```sql -eql_v2.remove_search_config( - table_name text, - column_name text, - index_name text, - migrating boolean DEFAULT false -) RETURNS jsonb +-- Ordering (write the sort key as the extractor to engage the index — see Database Indexes) +SELECT * FROM events ORDER BY eql_v3.ord_term(encrypted_at) DESC; ``` -### `eql_v2.modify_search_config()` +### Text match — `@>` `<@` -Modify an existing search index configuration. +On `eql_v3.text_match` / `eql_v3.text_search` (carry a `bf` bloom term). This is **probabilistic ngram-bloom containment**, not SQL `LIKE` and not JSONB containment: ```sql -eql_v2.modify_search_config( - table_name text, - column_name text, - index_name text, - cast_as text DEFAULT 'text', - opts jsonb DEFAULT '{}', - migrating boolean DEFAULT false -) RETURNS jsonb +SELECT * FROM docs WHERE encrypted_content @> $1::eql_v3.text_match; ``` -### `eql_v2.config()` - -View current configuration in tabular format. +`LIKE` / `ILIKE` (`~~` / `~~*`) are **not** part of the `eql_v3` surface — use `@>`. -```sql -eql_v2.config() RETURNS TABLE ( - state eql_v2_configuration_state, - relation text, - col_name text, - decrypts_as text, - indexes jsonb -) -``` +### JSON containment / path — `eql_v3.json` -**Example:** -```sql -SELECT * FROM eql_v2.config(); -``` - -### `eql_v2.migrate_config()` - -Transition pending configuration to encrypting state. - -```sql -eql_v2.migrate_config() RETURNS boolean -``` - -**Description:** -- Validates that all configured columns exist with `eql_v2_encrypted` type -- Marks the pending configuration as 'encrypting' -- Required before activating a new configuration - -**Raises exception if:** -- An encryption is already in progress -- No pending configuration exists -- Some pending columns don't have encrypted targets - -**Example:** -```sql --- Add configuration changes -SELECT eql_v2.add_search_config('users', 'email', 'unique', 'text', migrating => true); - --- Validate and migrate -SELECT eql_v2.migrate_config(); - --- After re-encrypting data, activate -SELECT eql_v2.activate_config(); -``` - -### `eql_v2.activate_config()` - -Activate an encrypting configuration. - -```sql -eql_v2.activate_config() RETURNS boolean -``` - -**Description:** -- Moves 'encrypting' configuration to 'active' state -- Marks previous 'active' configuration as 'inactive' -- Should be called after data has been re-encrypted with new index terms - -**Raises exception if:** -- No encrypting configuration exists - -**Example:** -```sql -SELECT eql_v2.activate_config(); -``` - -### `eql_v2.discard()` - -Discard pending configuration without activating. - -```sql -eql_v2.discard() RETURNS boolean -``` - -**Description:** -- Deletes the pending configuration -- Use when you want to abandon configuration changes - -**Raises exception if:** -- No pending configuration exists - -**Example:** -```sql -SELECT eql_v2.discard(); -``` - -### `eql_v2.reload_config()` - -Reload active configuration (no-op for compatibility). - -```sql -eql_v2.reload_config() RETURNS void -``` - -**Description:** -- Placeholder function for configuration reload -- Currently has no effect (configuration is loaded automatically) +`@>` / `<@`, `->` / `->>`, and the path functions on `eql_v3.json` are documented in [EQL with JSON and JSONB](./json-support.md). --- -## Query Functions - -### Operators (Recommended) +## Function Equivalents -EQL overloads standard PostgreSQL operators to work directly on `eql_v2_encrypted` columns. **Use these whenever possible.** - -#### Equality +For environments that cannot use custom operators (e.g. some managed platforms), each operator has a function form, generated per domain variant. They take the same domain types as the operators above: ```sql --- Exact match (uses 'unique' index: hmac_256) -SELECT * FROM users WHERE encrypted_email = $1::eql_v2_encrypted; -SELECT * FROM users WHERE encrypted_email = $1::jsonb; - --- Not equal -SELECT * FROM users WHERE encrypted_email <> $1::eql_v2_encrypted; -``` - -#### Full-Text Match - -```sql --- Case-sensitive LIKE (uses 'match' index: bloom_filter) -SELECT * FROM docs WHERE encrypted_content ~~ $1::eql_v2_encrypted; -SELECT * FROM docs WHERE encrypted_content LIKE $1::eql_v2_encrypted; - --- Case-insensitive ILIKE -SELECT * FROM docs WHERE encrypted_content ~~* $1::eql_v2_encrypted; -SELECT * FROM docs WHERE encrypted_content ILIKE $1::eql_v2_encrypted; -``` - -#### Range Comparisons - -```sql --- Uses 'ore' index: ore_block_u64_8_256 -SELECT * FROM events WHERE encrypted_date < $1::eql_v2_encrypted; -SELECT * FROM events WHERE encrypted_date <= $1::eql_v2_encrypted; -SELECT * FROM events WHERE encrypted_date > $1::eql_v2_encrypted; -SELECT * FROM events WHERE encrypted_date >= $1::eql_v2_encrypted; - --- Ordering -SELECT * FROM events ORDER BY encrypted_date DESC; -SELECT * FROM events ORDER BY encrypted_date ASC; -``` - -#### JSONB Containment - -```sql --- Uses 'ste_vec' index -SELECT * FROM users WHERE encrypted_data @> $1::eql_v2_encrypted; -SELECT * FROM users WHERE encrypted_data <@ $1::eql_v2_encrypted; -``` - -#### JSON Path Access - -```sql --- Extract field by selector hash (returns eql_v2_encrypted) -SELECT encrypted_json->'abc123...' FROM users; -SELECT encrypted_json->encrypted_selector FROM users; - --- Extract field by array index (returns eql_v2_encrypted) -SELECT encrypted_json->0 FROM users; - --- Extract field as ciphertext (returns text) -SELECT encrypted_json->>'abc123...' FROM users; -SELECT encrypted_json->>encrypted_selector FROM users; -``` - -### Function Equivalents - -For environments that don't support custom operators (like Supabase), use these function versions: - -#### `eql_v2.eq()` - -Equality comparison. - -```sql -eql_v2.eq(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean -``` - -**Example:** -```sql -SELECT * FROM users WHERE eql_v2.eq(encrypted_email, $1::eql_v2_encrypted); -``` - -#### `eql_v2.neq()` - -Not-equal comparison. - -```sql -eql_v2.neq(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean -``` - -#### `eql_v2.like()` - -Pattern matching (case-sensitive). - -```sql -eql_v2.like(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean -``` - -**Example:** -```sql -SELECT * FROM docs WHERE eql_v2.like(encrypted_content, $1::eql_v2_encrypted); -``` - -#### `eql_v2.ilike()` - -Pattern matching (case-insensitive). - -```sql -eql_v2.ilike(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean -``` - -**Example:** -```sql -SELECT * FROM docs WHERE eql_v2.ilike(encrypted_content, $1::eql_v2_encrypted); -``` - -#### `eql_v2.lt()` - -Less than comparison. - -```sql -eql_v2.lt(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean +eql_v3.eq(a, b) -- = (on _eq / _ord / text_search) +eql_v3.neq(a, b) -- <> +eql_v3.lt(a, b) -- < (on _ord / _ord_ore / text_search) +eql_v3.lte(a, b) -- <= +eql_v3.gt(a, b) -- > +eql_v3.gte(a, b) -- >= +eql_v3.contains(a, b) -- @> (on text_match / text_search / eql_v3.json) +eql_v3.contained_by(a, b) -- <@ ``` **Example:** -```sql -SELECT * FROM events WHERE eql_v2.lt(encrypted_date, $1::eql_v2_encrypted); -``` - -#### `eql_v2.lte()` - -Less than or equal comparison. - -```sql -eql_v2.lte(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean -``` - -**Example:** -```sql -SELECT * FROM events WHERE eql_v2.lte(encrypted_date, $1::eql_v2_encrypted); -``` - -#### `eql_v2.gt()` - -Greater than comparison. - -```sql -eql_v2.gt(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean -``` - -**Example:** -```sql -SELECT * FROM events WHERE eql_v2.gt(encrypted_date, $1::eql_v2_encrypted); -``` - -#### `eql_v2.gte()` - -Greater than or equal comparison. ```sql -eql_v2.gte(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean +SELECT * FROM users WHERE eql_v3.eq(encrypted_email, $1::eql_v3.text_eq); +SELECT * FROM events WHERE eql_v3.lt(encrypted_at, $1::eql_v3.timestamptz_ord); ``` -**Example:** -```sql -SELECT * FROM events WHERE eql_v2.gte(encrypted_date, $1::eql_v2_encrypted); -``` +There are no `like` / `ilike` function forms — text matching is `eql_v3.contains` (`@>`) on a `text_match` value. --- -## Index Term Extraction Functions - -These functions extract specific index terms from encrypted values. Typically used internally by operators, but available for advanced use cases. - -### `eql_v2.hmac_256()` - -Extract HMAC-256 unique index term. - -```sql -eql_v2.hmac_256(val eql_v2_encrypted) RETURNS eql_v2.hmac_256 -eql_v2.hmac_256(val jsonb) RETURNS eql_v2.hmac_256 -``` - -### `eql_v2.bloom_filter()` - -Extract bloom filter match index term. - -```sql -eql_v2.bloom_filter(val eql_v2_encrypted) RETURNS eql_v2.bloom_filter -eql_v2.bloom_filter(val jsonb) RETURNS eql_v2.bloom_filter -``` - -### `eql_v2.ore_block_u64_8_256()` - -Extract ORE (Order-Revealing Encryption) index term. - -```sql -eql_v2.ore_block_u64_8_256(val eql_v2_encrypted) RETURNS eql_v2.ore_block_u64_8_256 -eql_v2.ore_block_u64_8_256(val jsonb) RETURNS eql_v2.ore_block_u64_8_256 -``` - -### `eql_v2.ste_vec()` +## Index Term Extraction -Extract structured encryption vector array. +These extract the index term from an encrypted-domain value. They are generated per eq/ord/match-capable variant of every scalar type, are inlinable (so a functional index on the extractor engages), and return the self-contained `eql_v3` SEM index-term types. See [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md). ```sql -eql_v2.ste_vec(val eql_v2_encrypted) RETURNS eql_v2_encrypted[] -eql_v2.ste_vec(val jsonb) RETURNS eql_v2_encrypted[] +-- Equality term (hm) +eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v3.hmac_256 +-- Ordering term (ob) +eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v3.ore_block_256 +eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v3.ore_block_256 +-- Text-match term (bf) +eql_v3.match_term(a eql_v3.text_match) RETURNS eql_v3.bloom_filter ``` -### `eql_v3.eq_term()` / `eql_v3.ord_term()` (encrypted-domain) +**Example — functional indexes on the extracted terms** (see [Database Indexes](./database-indexes.md)): -Extract the equality (`hm`) or ordering (`ob`) index term from a scalar -encrypted-domain value. Generated per eq/ord-capable variant of every -scalar type — see [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md). -The argument type selects the overload, and both are inlinable so a -functional index built on the extractor engages. The extractors live in -the `eql_v3` schema; their return types are the self-contained `eql_v3` -SEM index-term types. - -```sql --- int4 — generated for every scalar type's eq / ord variants. -eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v3.hmac_256 -eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v3.ore_block_256 -eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v3.ore_block_256 -``` - -**Example:** ```sql --- Functional indexes on the extracted terms (see Database Indexes). --- A column carries a single domain type, so `eq_term` and `ord_term` --- apply to different columns (an `_eq` column vs an `_ord`/`_ord_ore` one). CREATE INDEX ON users USING hash (eql_v3.eq_term(salary_eq)); CREATE INDEX ON users USING btree (eql_v3.ord_term(salary_ord)); +CREATE INDEX ON users USING gin (eql_v3.match_term(name_match)); ``` -> The full per-domain operator/wrapper/blocker surface (and the -> `eql_v3.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is -> documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v3t) -> and the [scalar encrypted-domain type reference](./adding-a-scalar-encrypted-domain-type.md). - ---- - -## JSONB Path Functions - -Functions for querying encrypted JSONB data using selector hashes. - -### `eql_v2.jsonb_path_query()` - -Returns all encrypted elements matching a selector. - -```sql -eql_v2.jsonb_path_query(val eql_v2_encrypted, selector text) RETURNS SETOF eql_v2_encrypted -eql_v2.jsonb_path_query(val eql_v2_encrypted, selector eql_v2_encrypted) RETURNS SETOF eql_v2_encrypted -eql_v2.jsonb_path_query(val jsonb, selector text) RETURNS SETOF eql_v2_encrypted -``` - -**Example:** -```sql -SELECT eql_v2.jsonb_path_query(encrypted_json, 'abc123...') FROM users; -``` - -### `eql_v2.jsonb_path_query_first()` - -Returns the first encrypted element matching a selector. +> The full per-domain operator / wrapper / blocker surface (and the `eql_v3.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v3t) and the [scalar encrypted-domain type reference](./adding-a-scalar-encrypted-domain-type.md). -```sql -eql_v2.jsonb_path_query_first(val eql_v2_encrypted, selector text) RETURNS eql_v2_encrypted -eql_v2.jsonb_path_query_first(val eql_v2_encrypted, selector eql_v2_encrypted) RETURNS eql_v2_encrypted -eql_v2.jsonb_path_query_first(val jsonb, selector text) RETURNS eql_v2_encrypted -``` - -### `eql_v2.jsonb_path_exists()` - -Checks if any element matches a selector. - -```sql -eql_v2.jsonb_path_exists(val eql_v2_encrypted, selector text) RETURNS boolean -eql_v2.jsonb_path_exists(val eql_v2_encrypted, selector eql_v2_encrypted) RETURNS boolean -eql_v2.jsonb_path_exists(val jsonb, selector text) RETURNS boolean -``` - -**Example:** -```sql -SELECT * FROM users -WHERE eql_v2.jsonb_path_exists(encrypted_json, 'email_selector'); -``` +The `eql_v3.json` document type extracts entry-level terms with `eql_v3.eq_term(eql_v3.ste_vec_entry)` and `eql_v3.ore_cllw(eql_v3.ste_vec_entry)` — see [json-support.md](./json-support.md). --- -## Array Functions - -Functions for working with encrypted arrays. - -### `eql_v2.jsonb_array_length()` +## Encrypted JSON (`eql_v3.json`) -Returns the length of an encrypted array. - -```sql -eql_v2.jsonb_array_length(val eql_v2_encrypted) RETURNS integer -eql_v2.jsonb_array_length(val jsonb) RETURNS integer -``` - -**Example:** -```sql -SELECT eql_v2.jsonb_array_length(encrypted_array) FROM users; -``` - -### `eql_v2.jsonb_array_elements()` - -Returns each array element as an encrypted value. - -```sql -eql_v2.jsonb_array_elements(val eql_v2_encrypted) RETURNS SETOF eql_v2_encrypted -eql_v2.jsonb_array_elements(val jsonb) RETURNS SETOF eql_v2_encrypted -``` - -**Example:** -```sql -SELECT eql_v2.jsonb_array_elements( - eql_v2.jsonb_path_query(encrypted_json, 'array_selector') -) FROM users; -``` - -### `eql_v2.jsonb_array_elements_text()` - -Returns each array element's ciphertext as text. - -```sql -eql_v2.jsonb_array_elements_text(val eql_v2_encrypted) RETURNS SETOF text -eql_v2.jsonb_array_elements_text(val jsonb) RETURNS SETOF text -``` - ---- - -## Helper Functions - -Utility functions for working with encrypted data. - -### `eql_v2.ciphertext()` - -Extract ciphertext from encrypted value. - -```sql -eql_v2.ciphertext(val eql_v2_encrypted) RETURNS text -eql_v2.ciphertext(val jsonb) RETURNS text -``` - -### `eql_v2.meta_data()` - -Extract metadata (table/column identifiers and version). - -```sql -eql_v2.meta_data(val eql_v2_encrypted) RETURNS jsonb -eql_v2.meta_data(val jsonb) RETURNS jsonb -``` - -### `eql_v2.selector()` - -Extract selector hash from an encrypted payload (`jsonb`) or a ste_vec entry. - -```sql -eql_v2.selector(val jsonb) RETURNS text -eql_v2.selector(entry eql_v2.ste_vec_entry) RETURNS text -``` - -### `eql_v2.is_ste_vec_array()` - -Check if value represents an encrypted array. - -```sql -eql_v2.is_ste_vec_array(val eql_v2_encrypted) RETURNS boolean -``` - -### `eql_v2.is_ste_vec_value()` - -Check if value is a single ste_vec element. - -```sql -eql_v2.is_ste_vec_value(val eql_v2_encrypted) RETURNS boolean -``` - -### `eql_v2.to_ste_vec_value()` - -Convert ste_vec array with single element to regular encrypted value. - -```sql -eql_v2.to_ste_vec_value(val eql_v2_encrypted) RETURNS eql_v2_encrypted -``` - -### `eql_v2.ste_vec_contains()` - -Check if all ste_vec terms in b exist in a (backs the `@>` operator). - -```sql -eql_v2.ste_vec_contains(a eql_v2_encrypted, b eql_v2_encrypted) RETURNS boolean -``` - -### `eql_v2.has_hmac_256()` - -Check if value contains hmac_256 index term. - -```sql -eql_v2.has_hmac_256(val eql_v2_encrypted) RETURNS boolean -``` - -### `eql_v2.has_bloom_filter()` - -Check if value contains bloom_filter index term. - -```sql -eql_v2.has_bloom_filter(val eql_v2_encrypted) RETURNS boolean -``` - -### `eql_v2.has_ore_block_u64_8_256()` - -Check if value contains ore index term. - -```sql -eql_v2.has_ore_block_u64_8_256(val eql_v2_encrypted) RETURNS boolean -``` +The full encrypted-JSONB function surface — containment, `->` / `->>`, `eql_v3.jsonb_path_query` / `_first` / `_exists`, `eql_v3.jsonb_array_length` / `_elements` / `_elements_text`, `eql_v3.to_ste_vec_query`, `eql_v3.ste_vec_contains`, and the GIN helpers — is documented in **[EQL with JSON and JSONB](./json-support.md)**. --- ## Aggregate Functions -### `eql_v2.grouped_value()` - -Aggregate function for grouping encrypted values (returns first non-null value in group). - -```sql -eql_v2.grouped_value(jsonb) RETURNS jsonb -``` - -**Example:** -```sql -SELECT eql_v2.grouped_value( - eql_v2.jsonb_path_query_first(encrypted_json, 'color_selector')::jsonb -) AS color, -COUNT(*) -FROM products -GROUP BY eql_v2.jsonb_path_query_first(encrypted_json, 'color_selector'); -``` - -### `eql_v2.min()` / `eql_v2.max()` (composite type) - -Returns the minimum or maximum encrypted value in a set on an `eql_v2_encrypted` column (requires `ore` index terms for ordering). - -```sql -eql_v2.min(eql_v2_encrypted) RETURNS eql_v2_encrypted -eql_v2.max(eql_v2_encrypted) RETURNS eql_v2_encrypted -``` - -Comparison routes through the `<` / `>` operator on `eql_v2_encrypted`, which uses the ORE block term — no decryption. - -**Example:** -```sql -SELECT eql_v2.min(encrypted_date) FROM events; -SELECT eql_v2.max(encrypted_price) FROM products WHERE category = 'electronics'; -``` - ### `eql_v3.min()` / `eql_v3.max()` (per-domain) -Returns the minimum or maximum encrypted value in a set on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`eql_v3._ord`, `eql_v3._ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. These are type-safe alternatives to the composite-type aggregates above and coexist with them. +Returns the minimum or maximum encrypted value on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`eql_v3._ord`, `eql_v3._ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. ```sql -- int4 — generated for every ordered variant of every scalar type. @@ -688,101 +133,32 @@ eql_v3.max(eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore Comparison routes through the variant's `<` / `>` operator, which uses the ORE block term — no decryption. The state function is `STRICT`, so `NULL` inputs are skipped and an all-`NULL` input set returns `NULL`. **Example:** + ```sql -- ord-capable column (e.g. price_encrypted typed as eql_v3.int4_ord) SELECT eql_v3.min(price_encrypted) FROM products; SELECT eql_v3.max(price_encrypted) FROM products WHERE category = 'electronics'; --- Equivalent on a generic jsonb column (cast to the right domain) +-- On a generic jsonb column, cast to the right domain SELECT eql_v3.min(price_jsonb::eql_v3.int4_ord) FROM products; ``` -`SUM` / `AVG` and other numeric aggregates are not supported on encrypted columns — decrypt at the application boundary. `MIN` / `MAX` only require comparator-revealing terms; arithmetic aggregates would require homomorphic encryption. - -**See also:** [`docs/reference/sql-support.md`](./sql-support.md) for the per-variant capability table. - ---- - -## Utility Functions - -### `eql_v2.version()` - -Get the installed EQL version. - -```sql -eql_v2.version() RETURNS text -``` - -**Example:** -```sql -SELECT eql_v2.version(); --- Returns version string (e.g., '2.1.8') -``` - -### `eql_v2.to_encrypted()` - -Convert jsonb or text to eql_v2_encrypted type. - -```sql -eql_v2.to_encrypted(data jsonb) RETURNS eql_v2_encrypted -eql_v2.to_encrypted(data text) RETURNS eql_v2_encrypted -``` - -**Example:** -```sql --- Convert jsonb payload to encrypted type -SELECT eql_v2.to_encrypted('{"v":2,"k":"pt","p":"plaintext"}'::jsonb); - --- Convert text payload to encrypted type -SELECT eql_v2.to_encrypted('{"v":2,"k":"pt","p":"plaintext"}'); -``` - -### `eql_v2.to_jsonb()` - -Convert eql_v2_encrypted to jsonb. +`MIN` / `MAX` over a value extracted from an `eql_v3.json` document use `eql_v3.min(eql_v3.ste_vec_entry)` / `max` — see [json-support.md](./json-support.md). -```sql -eql_v2.to_jsonb(e eql_v2_encrypted) RETURNS jsonb -``` - -**Example:** -```sql -SELECT eql_v2.to_jsonb(encrypted_column) FROM users; -``` +`SUM` / `AVG` and other arithmetic aggregates are **not** supported on encrypted columns (they would require homomorphic encryption) — decrypt at the application boundary. `MIN` / `MAX` only need comparator-revealing terms. -### `eql_v2.check_encrypted()` - -Validate encrypted payload structure (used in constraints). - -```sql -eql_v2.check_encrypted(val jsonb) RETURNS boolean -eql_v2.check_encrypted(val eql_v2_encrypted) RETURNS boolean -``` - -**Description:** -- Validates that encrypted value has required fields (`v`, `c`, `i`) -- Checks that version is `2` and identifier contains table (`t`) and column (`c`) fields -- Returns true if valid, raises exception if invalid -- Automatically added as constraint when using `eql_v2.add_column()` - -**Example:** -```sql -SELECT eql_v2.check_encrypted('{"v":2,"c":"ciphertext","i":{"t":"users","c":"email"}}'::jsonb); --- Returns: true - -SELECT eql_v2.check_encrypted('{"invalid":"structure"}'::jsonb); --- Raises exception: 'Encrypted column missing version (v) field' -``` +**See also:** [SQL support matrix](./sql-support.md) for the per-variant capability table. --- ## See Also -- [EQL Configuration Guide](../tutorials/proxy-configuration.md) - How to set up encrypted columns -- [Database Indexes](./database-indexes.md) - PostgreSQL B-tree index creation and usage -- [JSON/JSONB Support](./json-support.md) - Working with encrypted JSON data -- [Index Configuration](./index-config.md) - Index types and configuration options -- [Payload Format](./PAYLOAD.md) - EQL data format specification +- [EQL Configuration Tutorial](../tutorials/proxy-configuration.md) — setting up encrypted columns end to end. +- [Database Indexes](./database-indexes.md) — functional-index recipes and performance. +- [JSON/JSONB Support](./json-support.md) — `eql_v3.json` worked examples. +- [SQL support matrix](./sql-support.md) — operators by domain variant. +- [Payload Format](./PAYLOAD.md) — EQL data format specification. +- Client-side index configuration — [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md). --- From 3216d3827d873b4d8e40ef23ed453fee7385831a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:11:19 +1000 Subject: [PATCH 344/599] docs(proxy-configuration): re-author tutorial onto eql_v3 columns and client-side config round-trip --- docs/tutorials/proxy-configuration.md | 448 ++++---------------------- 1 file changed, 65 insertions(+), 383 deletions(-) diff --git a/docs/tutorials/proxy-configuration.md b/docs/tutorials/proxy-configuration.md index 758829f19..8351b2f33 100644 --- a/docs/tutorials/proxy-configuration.md +++ b/docs/tutorials/proxy-configuration.md @@ -1,443 +1,125 @@ -# CipherStash Proxy Configuration with EQL functions +# Setting up encrypted columns with CipherStash Proxy -## Prerequisites - -> [!IMPORTANT] -> Before using any EQL configuration functions, you must first create the encrypted column in your database table: - -```sql --- First, add the encrypted column to your table -ALTER TABLE users ADD COLUMN encrypted_email eql_v2_encrypted; -``` - -The column **must** be of type `eql_v2_encrypted`. -If you try to configure a column that doesn't exist in the database, you'll get the error: - -``` -ERROR: Some pending columns do not have an encrypted target -``` - -## Initializing column configuration - -After creating the encrypted column, initialize it for use with CipherStash Proxy using the `eql_v2.add_column` function: - -```sql -SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); -- Initialize the new encrypted column -``` - -**Full signature:** -```sql -SELECT eql_v2.add_column( - 'table_name', -- Name of the table - 'column_name', -- Name of the encrypted column (must already exist as type eql_v2_encrypted) - 'cast_as', -- PostgreSQL type to cast decrypted data [optional, defaults to 'text'] - migrating -- If true, stages changes without immediate activation [optional, defaults to false] -); -``` - -**Note:** This function allows you to encrypt and decrypt data but does not enable searchable encryption. See [Searching data with EQL](#searching-data-with-eql) for enabling searchable encryption. - -## Complete setup workflow - -Here's the complete workflow to set up an encrypted column with search capabilities: - -```sql --- Step 1: Create the encrypted column in your table -ALTER TABLE users ADD COLUMN encrypted_email eql_v2_encrypted; - --- Step 2: Configure the column for encryption/decryption -SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); - --- Step 3: Add search indexes as needed -SELECT eql_v2.add_search_config('users', 'encrypted_email', 'unique', 'text'); -SELECT eql_v2.add_search_config('users', 'encrypted_email', 'match', 'text'); - --- Step 4: Verify configuration -SELECT * FROM eql_v2.config(); -``` - -## Refreshing CipherStash Proxy configuration - -CipherStash Proxy refreshes the configuration every 60 seconds. To force an immediate refresh, run: - -```sql -SELECT eql_v2.reload_config(); -``` +This tutorial walks through an end-to-end round trip: defining encrypted columns with EQL, configuring searchable encryption in the encryption client, and inserting and querying data through [CipherStash Proxy](https://github.com/cipherstash/proxy). -> Note: This statement must be executed when connected to CipherStash Proxy. -> When connected to the database directly, it is a no-op. +## How the pieces fit together -## Storing data +EQL (the `eql_v3` schema) and the encryption client split responsibilities: -Encrypted data is stored as `jsonb` values in the PostgreSQL database, regardless of the original data type. +| Responsibility | Owner | +| --- | --- | +| Encrypted-column **types** and **operators** (`eql_v3.text_eq`, `eql_v3.json`, `=`, `@>`, …) | **EQL** (this repo) | +| PostgreSQL **functional indexes** on the term extractors | **EQL** / you | +| **Which columns are encrypted** and **which index terms** each carries | The **encryption client** — [CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs) | +| Performing **encryption / decryption** on the wire | The encryption client | -You can read more about the data format [here](../reference/PAYLOAD.md). +> **There is no database-side configuration API in `eql_v3`.** Earlier versions configured searchable encryption with database functions (`add_column`, `add_search_config`). That surface has been removed — configuration now lives entirely in the client. The database's only job is to *store* the encrypted columns (typed as `eql_v3` domains) and *resolve* the encrypted operators. -### Inserting data - -When inserting data into the encrypted column, wrap the plaintext in the appropriate EQL payload. These statements must be run through the CipherStash Proxy to **encrypt** the data. - -**Example:** - -```sql -INSERT INTO users (encrypted_email) VALUES ( - '{"v":2,"k":"pt","p":"test@example.com","i":{"t":"users","c":"encrypted_email"}}' -); -``` - -Data is stored in the PostgreSQL database as: - -```json -{ - "c": "generated_ciphertext", - "i": { - "c": "encrypted_email", - "t": "users" - }, - "k": "ct", - "bf": null, - "ob": null, - "u": null, - "v": 2 -} -``` - -### Reading data - -When querying data, select the encrypted column. CipherStash Proxy will **decrypt** the data automatically. - -**Example:** - -```sql -SELECT encrypted_email FROM users; -``` - -Data is returned as: - -```json -{ - "k": "pt", - "p": "test@example.com", - "i": { - "t": "users", - "c": "encrypted_email" - }, - "v": 2, - "q": null -} -``` - -> Note: If you execute this query directly on the database, you will not see any plaintext data but rather the `jsonb` payload with the ciphertext. - -## Configuring indexes for searching data - -In order to perform searchable operations on encrypted data, you must configure indexes for the encrypted columns. - -> **IMPORTANT:** If you have existing data that's encrypted and you add or modify an index, all the data will need to be re-encrypted. -> This is due to the way CipherStash Proxy handles searchable encryption operations. - -### Adding an index - -**Prerequisites:** The encrypted column must already exist in the database (see [Prerequisites](#prerequisites)) and be configured with `eql_v2.add_column`. - -Add an index to an encrypted column using the `eql_v2.add_search_config` function: - -```sql -SELECT eql_v2.add_search_config( - 'table_name', -- Name of the table - 'column_name', -- Name of the column - 'index_name', -- Index kind ('unique', 'match', 'ore', 'ste_vec') - 'cast_as', -- PostgreSQL type to cast decrypted data ('text', 'int', etc.) [optional, defaults to 'text'] - 'opts', -- Index options as JSONB [optional, defaults to '{}'] - migrating -- If true, stages changes without immediate activation [optional, defaults to false] -); -``` - -You can read more about the index configuration options [here](../reference/index-config.md). - -**Example (Unique index):** - -```sql -SELECT eql_v2.add_search_config( - 'users', - 'encrypted_email', - 'unique', - 'text' -); -``` - -**Example (With custom options and staging):** - -```sql -SELECT eql_v2.add_search_config( - 'users', - 'encrypted_name', - 'match', - 'text', - '{"k": 6, "bf": 4096}', - true -- Stage changes without immediate activation -); -``` - -Configuration changes are automatically migrated and activated unless the `migrating` parameter is set to `true`. - -## Searching data with EQL - -EQL provides specialized functions to interact with encrypted data, supporting operations like equality checks, range queries, and unique constraints. - -In order to use the specialized functions, you must first configure the corresponding indexes. +## Prerequisites -### Equality search +- EQL installed into your database (the `eql_v3` surface). See the [README](../../README.md#installation). +- A running CipherStash Proxy (or a Protect.js client) configured for your workspace. -Enable exact equality search on encrypted data using the `unique` index (backed by hmac_256 or blake3). +## 1. Define encrypted columns -**Index configuration example:** +Type each column as the `eql_v3` domain **variant** for the capability you need (see the [SQL support matrix](../reference/sql-support.md) for the full list): ```sql -SELECT eql_v2.add_search_config( - 'users', - 'encrypted_email', - 'unique', - 'text' -); -``` +-- equality-searchable encrypted text +ALTER TABLE users ADD COLUMN encrypted_email eql_v3.text_eq; -**Query using operators (recommended):** - -```sql --- Use the = operator directly on the encrypted column -SELECT * FROM users -WHERE encrypted_email = '{"v":2,"k":"pt","p":"test@example.com","i":{"t":"users","c":"encrypted_email"}}'::eql_v2_encrypted; -``` +-- range/ordering-searchable encrypted timestamp +ALTER TABLE events ADD COLUMN encrypted_at eql_v3.timestamptz_ord; -**Query using functions (for Supabase or operator-restricted environments):** +-- full-text (bloom) searchable encrypted text +ALTER TABLE users ADD COLUMN encrypted_name eql_v3.text_match; -```sql -SELECT * FROM users -WHERE eql_v2.eq(encrypted_email, - '{"v":2,"k":"pt","p":"test@example.com","i":{"t":"users","c":"encrypted_email"}}'::eql_v2_encrypted -); +-- searchable encrypted JSON document +ALTER TABLE users ADD COLUMN encrypted_profile eql_v3.json; ``` -Equivalent plaintext query: +The variant fixes the column's searchable surface: `_eq` for `=`, `_ord` for ordering/range, `text_match` for `@>` token containment, `eql_v3.json` for encrypted JSON. The bare `eql_v3.` variant is storage/decryption only. -```sql -SELECT * FROM users WHERE email = 'test@example.com'; -``` +## 2. Configure searchable encryption in the client -### Full-text search +Tell the encryption client which columns to encrypt and which index terms to emit. This is **client-side configuration**, not SQL: -Enables full-text search on encrypted data using the `match` index (backed by bloom filters). +- **Protect.js** — define the columns and indexes in the schema. See the [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md). +- **CipherStash Proxy** — configure the encrypted columns in the Proxy's mapping config. See [CipherStash Proxy](https://github.com/cipherstash/proxy). -**Index configuration example:** +The terms the client emits (`hm` for equality, `ob` for ordering, `bf` for match, ste_vec for JSON) must match the column's domain variant from step 1 — e.g. configure an equality index for a column typed `eql_v3.text_eq`. -```sql -SELECT eql_v2.add_search_config( - 'users', - 'encrypted_name', - 'match', - 'text', - '{"token_filters": [{"kind": "downcase"}], "tokenizer": { "kind": "ngram", "token_length": 3 }}' -); -``` +## 3. Create functional indexes -**Query using operators (recommended):** +Index the term extractor so queries engage an index. Each capability has one recipe (full detail in [Database Indexes](../reference/database-indexes.md)): ```sql --- Use the ~~ (LIKE) operator directly on the encrypted column -SELECT * FROM users -WHERE encrypted_name ~~ '{"v":2,"k":"pt","p":"alice","i":{"t":"users","c":"encrypted_name"}}'::eql_v2_encrypted; - --- Case-insensitive search with ~~* (ILIKE) -SELECT * FROM users -WHERE encrypted_name ~~* '{"v":2,"k":"pt","p":"alice","i":{"t":"users","c":"encrypted_name"}}'::eql_v2_encrypted; +CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)); +CREATE INDEX events_at_ord ON events USING btree (eql_v3.ord_term(encrypted_at)); +CREATE INDEX users_name_match ON users USING gin (eql_v3.match_term(encrypted_name)); +ANALYZE users; ``` -**Query using functions (for Supabase or operator-restricted environments):** - -```sql -SELECT * FROM users -WHERE eql_v2.like(encrypted_name, - '{"v":2,"k":"pt","p":"alice","i":{"t":"users","c":"encrypted_name"}}'::eql_v2_encrypted -); -``` +## 4. Insert and read through the Proxy -Equivalent plaintext query: +Run writes and reads through CipherStash Proxy. On insert, the Proxy encrypts the plaintext into the EQL payload (envelope `v`/`i`/`c` plus the configured index terms — see the [payload format](../reference/PAYLOAD.md)); on read, it decrypts automatically. ```sql -SELECT * FROM users WHERE name LIKE '%alice%'; -``` - -### Range queries - -Enable range queries and ordering on encrypted data using the `ore` index (Order-Revealing Encryption). Supports: - -- `ORDER BY` -- `WHERE` with comparison operators (`<`, `<=`, `>`, `>=`, `=`, `<>`) - -**Index configuration example:** - -```sql -SELECT eql_v2.add_search_config( - 'events', - 'encrypted_date', - 'ore', - 'date' -); -``` - -**Query using operators (recommended):** +-- Through the Proxy: the plaintext is encrypted on the way in +INSERT INTO users (encrypted_email) +VALUES ('{"v":2,"k":"pt","p":"test@example.com","i":{"t":"users","c":"encrypted_email"}}'); -```sql --- Range comparison - use comparison operators directly -SELECT * FROM events -WHERE encrypted_date < '{"v":2,"k":"pt","p":"2023-10-05","i":{"t":"events","c":"encrypted_date"}}'::eql_v2_encrypted; - -SELECT * FROM events -WHERE encrypted_date >= '{"v":2,"k":"pt","p":"2023-01-01","i":{"t":"events","c":"encrypted_date"}}'::eql_v2_encrypted; - --- Ordering - use ORDER BY directly -SELECT * FROM events ORDER BY encrypted_date DESC; -SELECT * FROM events ORDER BY encrypted_date ASC; +-- Through the Proxy: the ciphertext is decrypted on the way out +SELECT encrypted_email FROM users; ``` -Equivalent plaintext queries: +> Run directly against the database (bypassing the Proxy) and you will see the stored `jsonb` ciphertext payload, not plaintext. -```sql -SELECT * FROM events WHERE date < '2023-10-05'; -SELECT * FROM events WHERE date >= '2023-01-01'; -SELECT * FROM events ORDER BY date DESC; -``` +## 5. Searching data -### Array Operations +Type the query operand (the Proxy supplies typed parameters automatically; in hand-written SQL, cast). For the full operator surface see the [SQL support matrix](../reference/sql-support.md) and [EQL Functions Reference](../reference/eql-functions.md). -EQL supports array operations on encrypted data: +**Equality** (`eql_v3.text_eq`): ```sql --- Get array length -SELECT eql_v2.jsonb_array_length(encrypted_array) FROM users; - --- Get array elements -SELECT eql_v2.jsonb_array_elements(encrypted_array) FROM users; - --- Get array element ciphertexts -SELECT eql_v2.jsonb_array_elements_text(encrypted_array) FROM users; +SELECT * FROM users WHERE encrypted_email = $1; +-- operator-free form (e.g. Supabase): +SELECT * FROM users WHERE eql_v3.eq(encrypted_email, $1::eql_v3.text_eq); ``` -### JSON Path Operations - -EQL supports JSON path operations on encrypted data using the `->` and `->>` operators: +**Range / ordering** (`eql_v3.timestamptz_ord`): ```sql --- Get encrypted value at path -SELECT encrypted_data->'$.field' FROM users; - --- Get ciphertext at path -SELECT encrypted_data->>'$.field' FROM users; +SELECT * FROM events WHERE encrypted_at < $1 ORDER BY eql_v3.ord_term(encrypted_at) DESC; ``` -### Containment Operations - -For encrypted JSONB data, EQL provides containment operations using the `@>` and `<@` operators: +**Full-text match** (`eql_v3.text_match`) — bloom-filter token containment, not `LIKE`: ```sql --- Check if encrypted_data contains specific structure -SELECT * FROM users -WHERE encrypted_data @> '{"v":2,"k":"pt","p":{"account":{"roles":["admin"]}},"i":{"t":"users","c":"encrypted_data"},"q":"ste_vec"}'::eql_v2_encrypted; - --- Check if structure is contained in encrypted_data -SELECT * FROM users -WHERE '{"v":2,"k":"pt","p":{"roles":["admin"]},"i":{"t":"users","c":"encrypted_data"},"q":"ste_vec"}'::eql_v2_encrypted <@ encrypted_data; +SELECT * FROM users WHERE encrypted_name @> $1::eql_v3.text_match; ``` -### Text Pattern Matching - -EQL supports pattern matching with the `~~` (LIKE) operator: +**Encrypted JSON** (`eql_v3.json`) — containment and field access; see [EQL with JSON and JSONB](../reference/json-support.md): ```sql --- Pattern matching (case-sensitive) -SELECT * FROM users -WHERE encrypted_name ~~ '{"v":2,"k":"pt","p":"Alice%","i":{"t":"users","c":"encrypted_name"},"q":"match"}'::eql_v2_encrypted; - --- Pattern matching (case-insensitive) -SELECT * FROM users -WHERE encrypted_name ~~* '{"v":2,"k":"pt","p":"alice%","i":{"t":"users","c":"encrypted_name"},"q":"match"}'::eql_v2_encrypted; +SELECT * FROM users WHERE encrypted_profile @> $1::eql_v3.ste_vec_query; +SELECT encrypted_profile -> 'email_selector'::text FROM users; ``` -## JSON and JSONB support - -EQL supports encrypting entire JSON and JSONB data sets. -This warrants a separate section in the documentation. -You can read more about the JSONB support in the [JSONB reference guide](../reference/json-support.md). +## Frequently asked questions -## Frequently Asked Questions +**Can I use EQL without an encryption client?** No — encryption and decryption are performed by CipherStash Proxy or Protect.js. EQL provides the database-side types, operators, and indexes; the client provides the crypto and the configuration. -### How do I integrate CipherStash EQL with my application? +**How do I choose which columns are searchable, and how?** In the client configuration (Protect.js schema / Proxy mapping), matched to the column's `eql_v3` domain variant. There are no database-side `add_column` / `add_search_config` calls. -Use CipherStash Proxy to intercept PostgreSQL queries and handle encryption and decryption automatically. -The proxy interacts with the database using the EQL functions and types defined in this documentation. +**Which operators are available on which column?** See the [SQL support matrix](../reference/sql-support.md). -Use the [helper packages](#helper-packages-and-examples) to integrate EQL functions into your application. - -### Can I use EQL without the CipherStash Proxy? - -No, CipherStash Proxy is required to handle the encryption and decryption operations based on the configurations and indexes defined. - -### How is data encrypted in the database? - -Data is encrypted using CipherStash's cryptographic schemes and stored in the `eql_v2_encrypted` column as a JSONB payload. -Encryption and decryption are handled by CipherStash Proxy. - -### What index types are available? - -EQL supports the following index types: - -- `unique` - For exact equality searches using HMAC-256 -- `match` - For full-text search using bloom filters -- `ore` - For range queries and ordering using Order-Revealing Encryption -- `ste_vec` - For JSON/JSONB containment operations using Structured Encryption - -### How do I manage configurations? - -Use these functions to manage your EQL configurations: - -**Column Management:** -- `eql_v2.add_column(table_name, column_name, cast_as DEFAULT 'text', migrating DEFAULT false)` - Add a new encrypted column -- `eql_v2.remove_column(table_name, column_name, migrating DEFAULT false)` - Remove an encrypted column completely - -**Index Management:** -- `eql_v2.add_search_config(table_name, column_name, index_name, cast_as DEFAULT 'text', opts DEFAULT '{}', migrating DEFAULT false)` - Add a search index to a column -- `eql_v2.remove_search_config(table_name, column_name, index_name, migrating DEFAULT false)` - Remove a specific search index (preserves column configuration) -- `eql_v2.modify_search_config(table_name, column_name, index_name, cast_as DEFAULT 'text', opts DEFAULT '{}', migrating DEFAULT false)` - Modify an existing search index - -**Configuration Management:** -- `eql_v2.migrate_config()` - Manually migrate pending configuration to encrypting state -- `eql_v2.activate_config()` - Manually activate encrypting configuration -- `eql_v2.discard()` - Discard pending configuration changes -- `eql_v2.config()` - View current configuration in tabular format (returns a table with columns: state, relation, col_name, decrypts_as, indexes) - -> [!NOTE] -> All configuration functions automatically migrate and activate changes unless `migrating` is set to `true`. -> -> When `migrating` is `true`, changes are staged but not immediately applied, allowing for batch configuration updates. - -**Important Behavior Differences:** -- `remove_search_config()` removes only the specified index but preserves the column configuration (including `cast_as` setting) -- `remove_column()` removes the entire column configuration including all its indexes -- Empty configurations (no tables/columns) are automatically maintained as active to reflect the current state +**Where is the data format documented?** See the [payload format](../reference/PAYLOAD.md). ## Troubleshooting -### Common errors - -**Error: "Some pending columns do not have an encrypted target"** -- **Cause**: You're trying to configure a column that doesn't exist as `eql_v2_encrypted` type in the database -- **Solution**: First create the encrypted column with `ALTER TABLE table_name ADD COLUMN column_name eql_v2_encrypted;` +**Operator resolves to native `jsonb` / returns `NULL` instead of searching.** The query operand was an untyped literal, so PostgreSQL flattened the `eql_v3` domain to `jsonb`. Type the operand (`$1::eql_v3.text_eq`, `$1::eql_v3.ste_vec_query`) — the Proxy does this automatically. -**Error: "Config exists for column: table_name column_name"** -- **Cause**: You're trying to add a column that's already configured -- **Solution**: Use `eql_v2.add_search_config()` to add indexes to existing columns, or `eql_v2.remove_column()` first if you want to reconfigure +**`=` returns no rows.** The column's values do not carry an `hm` equality term. Confirm the client is configured to emit the right term for the column's variant (step 2), and that data was written through the Proxy after configuring it. -**Error: "No configuration exists for column: table_name column_name"** -- **Cause**: You're trying to add search config to a column that hasn't been configured with `add_column` yet -- **Solution**: First run `eql_v2.add_column()` to configure the column, then add search indexes \ No newline at end of file +**Index not used.** Build the functional index on the extractor (step 3), run `ANALYZE`, and confirm the operand is typed. See [Database Indexes — Troubleshooting](../reference/database-indexes.md#troubleshooting). From de207f38f28a5a22b0309648446d87ba3dd508d0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:12:31 +1000 Subject: [PATCH 345/599] docs(index-config): remove eql_v2 db-side config reference; repoint links to client-side config --- docs/reference/index-config.md | 320 --------------------------------- 1 file changed, 320 deletions(-) delete mode 100644 docs/reference/index-config.md diff --git a/docs/reference/index-config.md b/docs/reference/index-config.md deleted file mode 100644 index c5e01746c..000000000 --- a/docs/reference/index-config.md +++ /dev/null @@ -1,320 +0,0 @@ -# EQL index configuration for CipherStash Proxy - -> [!NOTE] -> This guide is for CipherStash Proxy. -> If you are using Protect.js, see the [Protect.js schema](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md). - -The following functions allow you to configure indexes for encrypted columns. -All these functions modify the `public.eql_v2_configuration` table in your database, and are added during the EQL installation. - -> **IMPORTANT:** When you modify or add search configuration index, you must re-encrypt data that's already been stored in the database. -> The CipherStash encryption solution will encrypt the data based on the current state of the configuration. - -### Configuring search (`eql_v2.add_search_config`) - -Add an index to an encrypted column. Returns the updated configuration as JSONB. - -```sql -SELECT eql_v2.add_search_config( - 'table_name', -- Name of the table - 'column_name', -- Name of the column - 'index_name', -- Index kind ('unique', 'match', 'ore', 'ope', 'ste_vec') - 'cast_as', -- PostgreSQL type to cast decrypted data ('text', 'int', etc.) - 'opts' -- Index options as JSONB (optional) -); -``` - -| Parameter | Description | Notes | -| ------------- | -------------------------------------------------- | ------------------------------------------------------------------------ | -| `table_name` | Name of target table | Required | -| `column_name` | Name of target column | Required | -| `index_name` | The index kind | Required | -| `cast_as` | The PostgreSQL type decrypted data will be cast to | Optional. Defaults to `text` | -| `opts` | Index options | Optional for `match` indexes, required for `ste_vec` indexes (see below) | -| `migrating` | Skip auto-migration if true | Optional. Defaults to `false`. Set to `true` for batch operations | - -#### Option (`cast_as`) - -The type field can be specified as either `plaintext_type` (preferred) or `cast_as` (deprecated alias retained for backwards compatibility). -When both are present, `plaintext_type` takes precedence. - -Supported types: - -- `text` -- `int` -- `small_int` -- `big_int` -- `real` (also accepts `float`) -- `double` -- `boolean` -- `date` -- `json` (also accepts `jsonb`) -- `decimal` -- `timestamp` - -#### Options for match indexes (`opts`) - -A match index enables full text search across one or more text fields in queries. - -The default match index options are: - -```json - { - "k": 6, - "bf": 2048, - "include_original": true, - "tokenizer": { - "kind": "ngram", - "token_length": 3 - }, - "token_filters": [ - {"kind": "downcase"} - ] - } -``` - -- `token_filters`: a list of filters to apply to normalize tokens before indexing. -- `tokenizer`: determines how input text is split into tokens. -- `bf`: The size of the backing [bloom filter](https://en.wikipedia.org/wiki/Bloom_filter) in bits. Defaults to `2048`. -- `k`: The number of hash functions to use per term (each sets one bit in the bloom filter). Defaults to `6`. - -**Token filters** - -The `downcase` token filter is available to normalise text before indexing and is also applied to query terms. An empty array can also be passed to `token_filters` if no normalisation of terms is required. - -**Tokenizer** - -There are two `tokenizer`s provided: `standard` and `ngram`. -`standard` simply splits text into tokens using this regular expression: `/[ ,;:!]/`. -`ngram` splits the text into n-grams and accepts a configuration object that allows you to specify the `tokenLength`. - -**bf** and **k** - -`k` and `bf` are optional fields for configuring [bloom filters](https://en.wikipedia.org/wiki/Bloom_filter) that back full text search. - -`bf` is the size of the bloom filter in bits. It must be a power of 2 between `32` and `65536` and defaults to `2048`. - -`k` is the number of hash functions to use per term. -This determines the maximum number of bits that will be set in the bloom filter per term. -`k` must be an integer from `3` to `16` and defaults to `6`. - -To calculate optimal values for your use case, see this [Bloom filter calculator](https://di-mgt.com.au/bloom-calculator.html). - -**Caveats around n-gram tokenization** - -While using n-grams as a tokenization method allows greater flexibility when doing arbitrary substring matches, it is important to bear in mind the limitations of this approach. -Specifically, searching for strings _shorter_ than the `tokenLength` parameter will not _generally_ work. - -If you're using n-gram as a token filter, then a token that is already shorter than the `tokenLength` parameter will be kept as-is when indexed, and so a search for that short token will match that record. -However, if that same short string only appears as a part of a larger token, then it will not match that record. -Try to ensure that the string you search for is at least as long as the `tokenLength` of the index, except in the specific case where you know that there are shorter tokens to match, _and_ you are explicitly OK with not returning records that have that short string as part of a larger token. - -#### `ore` vs `ope` - -Both `ore` and `ope` enable the same ordered-comparison surface (`<`, `<=`, `=`, `>`, `>=`, `BETWEEN`, `ORDER BY`, `MIN`/`MAX`). - -- **`ore`** uses Order-Revealing Encryption (`ore_block_u64_8_256`, payload field `ob`). Ciphertexts compare via a custom per-byte protocol implemented in `eql_v2.compare_ore_block_u64_8_256`. This is the default ordered-search index. -- **`ope`** uses CLWW Order-Preserving Encryption — `ope_cllw_u64_65` (fixed-width, payload field `opf`) for numeric types and `ope_cllw_var_8` (variable-width, payload field `opv`) for text-shaped values. OPE ciphertexts compare with **standard lexicographic byte ordering**, which makes them usable in environments that can only sort `bytea` natively (e.g. some pluggable storage layers without custom comparators). - -`eql_v2.compare()` and the `<` / `<=` / `>` / `>=` operators dispatch automatically to whichever ordered terms are present on the encrypted value, so application queries do not change when switching between `ore` and `ope`. - -#### Options for ste_vec indexes (`opts`) - -An ste_vec index on an encrypted JSONB column enables the use of PostgreSQL's `@>` and `<@` [containment operators](https://www.postgresql.org/docs/16/functions-json.html#FUNCTIONS-JSONB-OP-TABLE). - -> **Note:** The `@>` and `<@` operators work directly on `eql_v2_encrypted` types, allowing simple query syntax like `encrypted_col @> search_term`. - -An ste_vec index requires one piece of configuration: the `prefix` (a string) which is passed as an info string to a MAC (Message Authenticated Code). -This ensures that all of the encrypted values are unique to that prefix. -We recommend that you use the table and column name as the prefix (e.g. `users/name`). - -**Example:** -```json -{"prefix": "users/encrypted_json"} -``` - -Within a dataset, encrypted columns indexed using an `ste_vec` that use different prefixes can't be compared. -Containment queries that manage to mix index terms from multiple columns will never return a positive result. -This is by design. - -The index is generated from a JSONB document by first flattening the structure of the document so that a hash can be generated for each unique path prefix to a node. - -The complete set of JSON types is supported by the indexer. -Null values are ignored by the indexer. - -- Object `{ ... }` -- Array `[ ... ]` -- String `"abc"` -- Boolean `true` -- Number `123.45` - -For a document like this: - -```json -{ - "account": { - "email": "alice@example.com", - "name": { - "first_name": "Alice", - "last_name": "McCrypto" - }, - "roles": ["admin", "owner"] - } -} -``` - -Hashes would be produced from the following list of entries: - -```js -[ - [Obj, Key("account"), Obj, Key("email"), String("alice@example.com")], - [ - Obj, - Key("account"), - Obj, - Key("name"), - Obj, - Key("first_name"), - String("Alice"), - ], - [ - Obj, - Key("account"), - Obj, - Key("name"), - Obj, - Key("last_name"), - String("McCrypto"), - ], - [Obj, Key("account"), Obj, Key("roles"), Array, String("admin")], - [Obj, Key("account"), Obj, Key("roles"), Array, String("owner")], -]; -``` - -Using the first entry to illustrate how an entry is converted to hashes: - -```js -[Obj, Key("account"), Obj, Key("email"), String("alice@example.com")]; -``` - -The hashes would be generated for all prefixes of the full path to the leaf node. - -```js -[ - [Obj], - [Obj, Key("account")], - [Obj, Key("account"), Obj], - [Obj, Key("account"), Obj, Key("email")], - [Obj, Key("account"), Obj, Key("email"), String("alice@example.com")], - // (remaining leaf nodes omitted) -]; -``` - -Query terms are processed in the same manner as the input document. - -A query prior to encrypting and indexing looks like a structurally similar subset of the encrypted document. For example: - -```json -{ - "account": { - "email": "alice@example.com", - "roles": "admin" - } -} -``` - -The expression `encrypted_account @> $query` would match all records where the `encrypted_account` column contains a JSONB object with an "account" key containing an object with an "email" key where the value is the string "alice@example.com". - -When reduced to a prefix list, it would look like this: - -```js -[ - [Obj], - [Obj, Key("account")], - [Obj, Key("account"), Obj], - [Obj, Key("account"), Obj, Key("email")], - [Obj, Key("account"), Obj, Key("email"), String("alice@example.com")][ - (Obj, Key("account"), Obj, Key("roles")) - ], - [Obj, Key("account"), Obj, Key("roles"), Array], - [Obj, Key("account"), Obj, Key("roles"), Array, String("admin")], -]; -``` - -Which is then turned into an ste_vec of hashes which can be directly queries against the index. - -#### GIN indexing for ste_vec - -For efficient containment queries on large tables, you can create a GIN index using the `eql_v2.jsonb_array()` function: - -```sql --- Create GIN index for containment queries -CREATE INDEX idx_encrypted_jsonb ON mytable USING GIN (eql_v2.jsonb_array(encrypted_col)); - --- Query using containment (will use the GIN index) -SELECT * FROM mytable WHERE encrypted_col @> $1::eql_v2_encrypted; -``` - -The following helper functions are available for GIN-indexed containment queries: -- `eql_v2.jsonb_array(val)` - Extracts encrypted JSONB as an array for GIN indexing -- `eql_v2.jsonb_contains(a, b)` - GIN-indexable containment check (`a @> b`) -- `eql_v2.jsonb_contained_by(a, b)` - GIN-indexable "is contained by" check (`a <@ b`) - -### Modifying an index (`eql_v2.modify_search_config`) - -Modifies an existing index configuration. Returns the updated configuration as JSONB. -Accepts the same parameters as `eql_v2.add_search_config` - -```sql -SELECT eql_v2.modify_search_config( - table_name text, - column_name text, - index_name text, - cast_as text DEFAULT 'text', - opts jsonb DEFAULT '{}', - migrating boolean DEFAULT false -); -``` - -**Example:** - -```sql --- Update match index options to increase bloom filter size -SELECT eql_v2.modify_search_config( - 'users', - 'email', - 'match', - 'text', - '{"bf": 4096, "k": 8}'::jsonb -); -``` - -### Removing an index (`eql_v2.remove_search_config`) - -Removes an index configuration from the column. Returns the updated configuration as JSONB. - -```sql -SELECT eql_v2.remove_search_config( - table_name text, - column_name text, - index_name text, - migrating boolean DEFAULT false -); -``` - -**Example:** - -```sql --- Remove the match index from the email column -SELECT eql_v2.remove_search_config( - 'users', - 'email', - 'match' -); -``` - ---- - -### Didn't find what you wanted? - -[Click here to let us know what was missing from our docs.](https://github.com/cipherstash/encrypt-query-language/issues/new?template=docs-feedback.yml&title=[Docs:]%20Feedback%20on%20INDEX.md) From 3cd4cae400c07e2826fb4fbbab1c16f19989d18e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:12:54 +1000 Subject: [PATCH 346/599] docs(index): repoint doc index off deleted index-config.md to client-side config --- docs/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 76368fa7c..d68fbc2c9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,10 +11,11 @@ This directory contains the documentation for the Encrypt Query Language (EQL). - [EQL Functions Reference](reference/eql-functions.md) - Complete API reference for all EQL functions - [SQL support matrix](reference/sql-support.md) - Which SQL operators and features each encrypted index enables - [Database Indexes for Encrypted Columns](reference/database-indexes.md) - PostgreSQL B-tree index creation and usage -- [Writing fast queries against EQL columns](reference/query-performance.md) - Functional indexes, operator inlining, natural vs extractor forms, and common pitfalls -- [EQL index configuration for CipherStash Proxy](reference/index-config.md) +- [Writing fast queries against EQL columns](reference/query-performance.md) - Performance overview (points to Database Indexes) +- [Adding a Scalar Encrypted-Domain Type](reference/adding-a-scalar-encrypted-domain-type.md) - How the `eql_v3.` domain families are generated - [EQL with JSON and JSONB](reference/json-support.md) - [EQL payload data format](reference/PAYLOAD.md) +- [Client-side index configuration](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md) - Configuring searchable encryption in Protect.js / CipherStash Proxy ## Tutorials From 2ecc6619011739a482eabba78a5c6e0f70a10a04 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:15:27 +1000 Subject: [PATCH 347/599] docs(readme): re-author entry point onto the eql_v3 surface (components, permissions, getting started, versioning) --- README.md | 112 ++++++++++++++++++------------------------------------ 1 file changed, 37 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index 7722cfa72..d6c896642 100644 --- a/README.md +++ b/README.md @@ -66,48 +66,23 @@ Execute the install SQL file directly: ## EQL Components -EQL installs and manages the following components +EQL installs the following components into the `eql_v3` schema: -| Name | Entity Type -| ---------------------------------- | --------------- | -| eql_v2.* | Schema | -| public.eql_v2_encrypted | Type | -| public.eql_v2_configuration_state | Type | -| public.eql_v2_configuration | Table | +| Name | Entity Type | Purpose | +| --------------------------------------------------- | ------------- | ------------------------------------------------------------------- | +| `eql_v3` | Schema | Holds all EQL types, operators, functions, and aggregates | +| `eql_v3.`, `eql_v3._eq`, `eql_v3._ord` | Domain types | Per-scalar encrypted columns (one family per scalar: `int4`, `text`, `timestamptz`, …) | +| `eql_v3.json` | Domain type | Encrypted JSON (structured-encryption) documents | +| `eql_v3.eq_term` / `ord_term` / `match_term` | Functions | Index-term extractors for functional indexes | -### `eql_v2` Schema +### `eql_v3` Schema -The `eql_v2` schema holds all of the functions, types and operators required to query and interact with encrypted data. -The schema is stateless and the schema can be dropped without risk of data loss. +The `eql_v3` schema holds the encrypted-domain types, their operators and term extractors, and the `MIN` / `MAX` aggregates. -Updating EQL will drop and re-create the schema. -Unless otherwise documented this is a safe operation that requires no data migration or changes. +Encrypted columns are typed as `eql_v3` domains (e.g. `eql_v3.text_eq`, `eql_v3.json`), and the searchable surface available on a column is fixed by its domain **variant** — there is no database-side configuration state. Which index terms a value carries is decided by the encryption client (Protect.js / CipherStash Proxy). - -### Configuration Table & Type - -The `public.eql_v2_configuration` table holds the searchable encryption configuration. -The `public.eql_v2_configuration_state` type is used by the configuration table. - -The table and associated type are created in the `public` schema to avoid any risk of data loss when updating or uninstalling EQL. - -EQL updates will automatically migrate the configuration if the internal structure changes. - -On uninstall the configuration table is renamed with a timestamp suffix -The table is not automatically dropped to avoid any potential risk of data loss. - -Renaming avoids potential conflicts in CI pipelines that may repeatedly install and uninstall EQL. - - -### `public.eql_v2_encrypted` Type - -The `public.eql_v2_encrypted` is the type used to define encrypted columns, and is used in customer table definitions. -The type is created in the `public` schema to avoid any risk of data loss when updating or uninstalling EQL. - -Dropping the `public.eql_v2_encrypted` type will remove any associated columns from the database. - -Uninstalling EQL will not drop the `public.eql_v2_encrypted` type to avoid risk of data loss. +Because the domain types live in the `eql_v3` schema, columns depend on them; `DROP SCHEMA eql_v3 CASCADE` removes the surface (and would drop columns typed as those domains). Re-running the install script is idempotent. ## Database Permissions @@ -122,13 +97,10 @@ For most use cases, grant the following permissions to the database user that wi -- Database-level permissions GRANT CREATE ON DATABASE your_database TO your_eql_user; --- Schema permissions +-- Schema permissions GRANT USAGE ON SCHEMA public TO your_eql_user; GRANT CREATE ON SCHEMA public TO your_eql_user; --- Configuration table permissions -GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE public.eql_v2_configuration TO your_eql_user; - -- User table permissions (for encrypted column constraints) GRANT ALTER ON ALL TABLES IN SCHEMA public TO your_eql_user; -- Or grant ALTER on specific tables that will have encrypted columns: @@ -137,10 +109,9 @@ GRANT ALTER ON ALL TABLES IN SCHEMA public TO your_eql_user; **Why these permissions are needed:** -- **CREATE ON DATABASE**: Required to create the `eql_v2` schema, types, and functions during installation -- **CREATE ON SCHEMA public**: Required to create types and tables in the public schema -- **Configuration table access**: EQL manages searchable encryption configuration in `public.eql_v2_configuration` -- **ALTER on user tables**: EQL adds check constraints to encrypted columns for data validation +- **CREATE ON DATABASE**: Required to create the `eql_v3` schema, domain types, and functions during installation +- **CREATE ON SCHEMA public**: Required to add encrypted columns (typed as `eql_v3` domains) to tables in the public schema +- **ALTER on user tables**: encrypted-domain `CHECK` constraints are validated on the user tables ### Splitting Read and Write Access @@ -154,7 +125,6 @@ Use during database migrations and EQL installation: -- All default permissions above, plus: GRANT CREATE ON DATABASE your_database TO your_migration_user; GRANT CREATE ON SCHEMA public TO your_migration_user; -GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE public.eql_v2_configuration TO your_migration_user; GRANT ALTER ON ALL TABLES IN SCHEMA public TO your_migration_user; ``` @@ -163,21 +133,18 @@ GRANT ALTER ON ALL TABLES IN SCHEMA public TO your_migration_user; Use for application queries in production: ```sql --- Configuration read access -GRANT SELECT ON TABLE public.eql_v2_configuration TO your_app_user; - --- EQL schema usage -GRANT USAGE ON SCHEMA eql_v2 TO your_app_user; -GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA eql_v2 TO your_app_user; +-- EQL schema usage (resolves the encrypted operators / extractors) +GRANT USAGE ON SCHEMA eql_v3 TO your_app_user; +GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA eql_v3 TO your_app_user; -- User table access (normal application permissions) GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE your_tables TO your_app_user; ``` **Migration Workflow:** -1. Use the migration user to install EQL and configure encrypted columns +1. Use the migration user to install EQL and add encrypted columns 2. Use the runtime user for normal application operations -3. Configuration changes (adding/removing encrypted columns) require the migration user +3. Schema changes (adding/removing encrypted columns) require the migration user ### dbdev @@ -193,24 +160,23 @@ Once EQL is installed in your PostgreSQL database, you can start using encrypted ### Enable encrypted columns -Define encrypted columns using the `eql_v2_encrypted` type, which stores encrypted data as `jsonb` with additional constraints to ensure data integrity. +Define encrypted columns using an `eql_v3` domain type. Type the column as the **variant** for the capability you need — `eql_v3.text_eq` for equality, `eql_v3._ord` for range/ordering, `eql_v3.text_match` for full-text, `eql_v3.json` for encrypted JSON. Each is stored as `jsonb` with a `CHECK` constraint that validates the encrypted payload. **Example:** ```sql --- Step 1: Create a table with an encrypted column +-- Step 1: Create a table with an equality-searchable encrypted column CREATE TABLE users ( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - encrypted_email eql_v2_encrypted + encrypted_email eql_v3.text_eq ); --- Step 2: Configure the column for encryption/decryption -SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); - --- Step 3: (Optional) Add search indexes -SELECT eql_v2.add_search_config('users', 'encrypted_email', 'unique', 'text'); +-- Step 2: Add a functional index on the term extractor (engages bare-form queries) +CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)); ``` +See the [SQL support matrix](docs/reference/sql-support.md) for every variant and [Database Indexes](docs/reference/database-indexes.md) for the index recipes. + > [!NOTE] > You must use [CipherStash Proxy](https://github.com/cipherstash/proxy) or [Protect.js](https://github.com/cipherstash/protectjs) to encrypt and decrypt data. EQL provides the database functions and types, while these tools handle the actual cryptographic operations. @@ -310,11 +276,7 @@ These frameworks use EQL to enable searchable encryption functionality in Postgr ## Versioning -You can find the version of EQL installed in your database by running the following query: - -```sql -SELECT eql_v2.version(); -``` +EQL is distributed as a versioned install script (`cipherstash-encrypt.sql`) published with each [GitHub release](https://github.com/cipherstash/encrypt-query-language/releases). Track the release tag you installed; re-running the install script is idempotent and upgrades the `eql_v3` surface in place. ### Upgrading @@ -343,17 +305,17 @@ Follow the instructions in the [dbdev documentation](https://database.dev/cipher ### Common Errors -**Error: "Some pending columns do not have an encrypted target"** -- **Cause**: Trying to configure a column that doesn't exist as `eql_v2_encrypted` type -- **Solution**: First create the column: `ALTER TABLE table_name ADD COLUMN column_name eql_v2_encrypted;` +**A query returns no rows / silently runs native `jsonb` semantics** +- **Cause**: the query operand was an untyped literal, so PostgreSQL flattened the `eql_v3` domain to its `jsonb` base type and resolved the native operator +- **Solution**: type the operand — `WHERE col = $1::eql_v3.text_eq` (CipherStash Proxy supplies typed parameters automatically) -**Error: "Config exists for column: table_name column_name"** -- **Cause**: Attempting to add a column configuration that already exists -- **Solution**: Use `eql_v2.add_search_config()` to add indexes, or `eql_v2.remove_column()` first to reconfigure +**Error: "operator not supported" (raised)** +- **Cause**: the operator is blocked for the column's domain variant (e.g. `<` on an `_eq` column, or `LIKE` on any encrypted column) +- **Solution**: type the column as a variant that carries the required term (see the [SQL support matrix](docs/reference/sql-support.md)); use `@>` rather than `LIKE` for text match -**Error: "No configuration exists for column: table_name column_name"** -- **Cause**: Trying to add search configuration before configuring the column -- **Solution**: Run `eql_v2.add_column()` first, then add search indexes +**`=` returns no rows on a populated column** +- **Cause**: the column's values do not carry an `hm` equality term +- **Solution**: confirm the encryption client is configured to emit the equality term for the column's variant, and that data was written after configuring it ### Getting Help From 2f0b7ac6684ad017e2c543c1846b0d1412580316 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:20:12 +1000 Subject: [PATCH 348/599] docs(dev): light-cleanup v3 reference and dev-doc examples; delete obsolete documentation-inventory.md --- docs/development/documentation-inventory.md | 366 ------------------ .../sql-documentation-standards.md | 113 +++--- .../sql-documentation-templates.md | 30 +- .../adding-a-scalar-encrypted-domain-type.md | 22 +- 4 files changed, 75 insertions(+), 456 deletions(-) delete mode 100644 docs/development/documentation-inventory.md diff --git a/docs/development/documentation-inventory.md b/docs/development/documentation-inventory.md deleted file mode 100644 index e9e89eed3..000000000 --- a/docs/development/documentation-inventory.md +++ /dev/null @@ -1,366 +0,0 @@ -# SQL Documentation Inventory - -Generated: Mon 27 Oct 2025 11:39:50 AEDT - -## src/blake3/compare.sql - -- CREATE FUNCTION eql_v2.compare_blake3(a eql_v2_encrypted, b eql_v2_encrypted) - -## src/blake3/functions.sql - -- CREATE FUNCTION eql_v2.blake3(val jsonb) -- CREATE FUNCTION eql_v2.blake3(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.has_blake3(val jsonb) -- CREATE FUNCTION eql_v2.has_blake3(val eql_v2_encrypted) - -## src/blake3/types.sql - -- CREATE DOMAIN eql_v2.blake3 AS text; - -## src/bloom_filter/functions.sql - -- CREATE FUNCTION eql_v2.bloom_filter(val jsonb) -- CREATE FUNCTION eql_v2.bloom_filter(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.has_bloom_filter(val jsonb) -- CREATE FUNCTION eql_v2.has_bloom_filter(val eql_v2_encrypted) - -## src/bloom_filter/types.sql - -- CREATE DOMAIN eql_v2.bloom_filter AS smallint[]; - -## src/common.sql - -- CREATE FUNCTION eql_v2.bytea_eq(a bytea, b bytea) RETURNS boolean AS $$ -- CREATE FUNCTION eql_v2.jsonb_array_to_bytea_array(val jsonb) -- CREATE FUNCTION eql_v2.log(s text) -- CREATE FUNCTION eql_v2.log(ctx text, s text) - -## src/config/constraints.sql - -- CREATE FUNCTION eql_v2.config_get_indexes(val jsonb) -- CREATE FUNCTION eql_v2.config_check_indexes(val jsonb) -- CREATE FUNCTION eql_v2.config_check_cast(val jsonb) -- CREATE FUNCTION eql_v2.config_check_tables(val jsonb) -- CREATE FUNCTION eql_v2.config_check_version(val jsonb) - -## src/config/functions.sql - -- CREATE FUNCTION eql_v2.add_search_config(table_name text, column_name text, index_name text, cast_as text DEFAULT 'text', opts jsonb DEFAULT '{}', migrating boolean DEFAULT false) -- CREATE FUNCTION eql_v2.remove_search_config(table_name text, column_name text, index_name text, migrating boolean DEFAULT false) -- CREATE FUNCTION eql_v2.modify_search_config(table_name text, column_name text, index_name text, cast_as text DEFAULT 'text', opts jsonb DEFAULT '{}', migrating boolean DEFAULT false) -- CREATE FUNCTION eql_v2.migrate_config() -- CREATE FUNCTION eql_v2.activate_config() -- CREATE FUNCTION eql_v2.discard() -- CREATE FUNCTION eql_v2.add_column(table_name text, column_name text, cast_as text DEFAULT 'text', migrating boolean DEFAULT false) -- CREATE FUNCTION eql_v2.remove_column(table_name text, column_name text, migrating boolean DEFAULT false) -- CREATE FUNCTION eql_v2.reload_config() -- CREATE FUNCTION eql_v2.config() RETURNS TABLE ( - -## src/config/functions_private.sql - -- CREATE FUNCTION eql_v2.config_default(config jsonb) -- CREATE FUNCTION eql_v2.config_add_table(table_name text, config jsonb) -- CREATE FUNCTION eql_v2.config_add_column(table_name text, column_name text, config jsonb) -- CREATE FUNCTION eql_v2.config_add_cast(table_name text, column_name text, cast_as text, config jsonb) -- CREATE FUNCTION eql_v2.config_add_index(table_name text, column_name text, index_name text, opts jsonb, config jsonb) -- CREATE FUNCTION eql_v2.config_match_default() - -## src/config/indexes.sql - - -## src/config/tables.sql - - -## src/config/types.sql - - -## src/crypto.sql - - -## src/encrypted/casts.sql - -- CREATE FUNCTION eql_v2.to_encrypted(data jsonb) -- CREATE FUNCTION eql_v2.to_encrypted(data text) -- CREATE FUNCTION eql_v2.to_jsonb(e public.eql_v2_encrypted) - -## src/encrypted/compare.sql - -- CREATE FUNCTION eql_v2.compare_literal(a eql_v2_encrypted, b eql_v2_encrypted) - -## src/encrypted/constraints.sql - -- CREATE FUNCTION eql_v2._encrypted_check_i(val jsonb) -- CREATE FUNCTION eql_v2._encrypted_check_i_ct(val jsonb) -- CREATE FUNCTION eql_v2._encrypted_check_v(val jsonb) -- CREATE FUNCTION eql_v2._encrypted_check_c(val jsonb) -- CREATE FUNCTION eql_v2.check_encrypted(val jsonb) -- CREATE FUNCTION eql_v2.check_encrypted(val eql_v2_encrypted) - -## src/encrypted/functions.sql - -- CREATE FUNCTION eql_v2.ciphertext(val jsonb) -- CREATE FUNCTION eql_v2.ciphertext(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2._first_grouped_value(jsonb, jsonb) -- CREATE AGGREGATE eql_v2.grouped_value(jsonb) ( -- CREATE FUNCTION eql_v2.add_encrypted_constraint(table_name TEXT, column_name TEXT) -- CREATE FUNCTION eql_v2.remove_encrypted_constraint(table_name TEXT, column_name TEXT) -- CREATE FUNCTION eql_v2.meta_data(val jsonb) -- CREATE FUNCTION eql_v2.meta_data(val eql_v2_encrypted) - -## src/encrypted/types.sql - - -## src/encryptindex/functions.sql - -- CREATE FUNCTION eql_v2.diff_config(a JSONB, b JSONB) -- CREATE FUNCTION eql_v2.select_pending_columns() -- CREATE FUNCTION eql_v2.select_target_columns() -- CREATE FUNCTION eql_v2.ready_for_encryption() -- CREATE FUNCTION eql_v2.create_encrypted_columns() -- CREATE FUNCTION eql_v2.rename_encrypted_columns() -- CREATE FUNCTION eql_v2.count_encrypted_with_active_config(table_name TEXT, column_name TEXT) - -## src/hmac_256/compare.sql - -- CREATE FUNCTION eql_v2.compare_hmac_256(a eql_v2_encrypted, b eql_v2_encrypted) - -## src/hmac_256/functions.sql - -- CREATE FUNCTION eql_v2.hmac_256(val jsonb) -- CREATE FUNCTION eql_v2.has_hmac_256(val jsonb) -- CREATE FUNCTION eql_v2.has_hmac_256(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.hmac_256(val eql_v2_encrypted) - -## src/hmac_256/types.sql - -- CREATE DOMAIN eql_v2.hmac_256 AS text; - -## src/jsonb/functions.sql - -- CREATE FUNCTION eql_v2.jsonb_path_query(val jsonb, selector text) -- CREATE FUNCTION eql_v2.jsonb_path_query(val eql_v2_encrypted, selector eql_v2_encrypted) -- CREATE FUNCTION eql_v2.jsonb_path_query(val eql_v2_encrypted, selector text) -- CREATE FUNCTION eql_v2.jsonb_path_exists(val jsonb, selector text) -- CREATE FUNCTION eql_v2.jsonb_path_exists(val eql_v2_encrypted, selector eql_v2_encrypted) -- CREATE FUNCTION eql_v2.jsonb_path_exists(val eql_v2_encrypted, selector text) -- CREATE FUNCTION eql_v2.jsonb_path_query_first(val jsonb, selector text) -- CREATE FUNCTION eql_v2.jsonb_path_query_first(val eql_v2_encrypted, selector eql_v2_encrypted) -- CREATE FUNCTION eql_v2.jsonb_path_query_first(val eql_v2_encrypted, selector text) -- CREATE FUNCTION eql_v2.jsonb_array_length(val jsonb) -- CREATE FUNCTION eql_v2.jsonb_array_length(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.jsonb_array_elements(val jsonb) -- CREATE FUNCTION eql_v2.jsonb_array_elements(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.jsonb_array_elements_text(val jsonb) -- CREATE FUNCTION eql_v2.jsonb_array_elements_text(val eql_v2_encrypted) - -## src/operators/->.sql - -- CREATE FUNCTION eql_v2."->"(e eql_v2_encrypted, selector text) -- CREATE OPERATOR ->( -- CREATE FUNCTION eql_v2."->"(e eql_v2_encrypted, selector eql_v2_encrypted) -- CREATE OPERATOR ->( -- CREATE FUNCTION eql_v2."->"(e eql_v2_encrypted, selector integer) -- CREATE OPERATOR ->( - -## src/operators/->>.sql - -- CREATE FUNCTION eql_v2."->>"(e eql_v2_encrypted, selector text) -- CREATE OPERATOR ->> ( -- CREATE FUNCTION eql_v2."->>"(e eql_v2_encrypted, selector eql_v2_encrypted) -- CREATE OPERATOR ->> ( - -## src/operators/<.sql - -- CREATE FUNCTION eql_v2.lt(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2."<"(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR <( -- CREATE FUNCTION eql_v2."<"(a eql_v2_encrypted, b jsonb) -- CREATE OPERATOR <( -- CREATE FUNCTION eql_v2."<"(a jsonb, b eql_v2_encrypted) -- CREATE OPERATOR <( - -## src/operators/<=.sql - -- CREATE FUNCTION eql_v2.lte(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2."<="(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR <=( -- CREATE FUNCTION eql_v2."<="(a eql_v2_encrypted, b jsonb) -- CREATE OPERATOR <=( -- CREATE FUNCTION eql_v2."<="(a jsonb, b eql_v2_encrypted) -- CREATE OPERATOR <=( - -## src/operators/<>.sql - -- CREATE FUNCTION eql_v2.neq(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2."<>"(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR <> ( -- CREATE FUNCTION eql_v2."<>"(a eql_v2_encrypted, b jsonb) -- CREATE OPERATOR <> ( -- CREATE FUNCTION eql_v2."<>"(a jsonb, b eql_v2_encrypted) -- CREATE OPERATOR <> ( - -## src/operators/<@.sql - -- CREATE FUNCTION eql_v2."<@"(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR <@( - -## src/operators/=.sql - -- CREATE FUNCTION eql_v2.eq(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2."="(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR = ( -- CREATE FUNCTION eql_v2."="(a eql_v2_encrypted, b jsonb) -- CREATE OPERATOR = ( -- CREATE FUNCTION eql_v2."="(a jsonb, b eql_v2_encrypted) -- CREATE OPERATOR = ( - -## src/operators/>.sql - -- CREATE FUNCTION eql_v2.gt(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2.">"(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR >( -- CREATE FUNCTION eql_v2.">"(a eql_v2_encrypted, b jsonb) -- CREATE OPERATOR >( -- CREATE FUNCTION eql_v2.">"(a jsonb, b eql_v2_encrypted) -- CREATE OPERATOR >( - -## src/operators/>=.sql - -- CREATE FUNCTION eql_v2.gte(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2.">="(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR >=( -- CREATE FUNCTION eql_v2.">="(a eql_v2_encrypted, b jsonb) -- CREATE OPERATOR >=( -- CREATE FUNCTION eql_v2.">="(a jsonb, b eql_v2_encrypted) -- CREATE OPERATOR >=( - -## src/operators/@>.sql - -- CREATE FUNCTION eql_v2."@>"(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR @>( - -## src/operators/compare.sql - -- CREATE FUNCTION eql_v2.compare(a eql_v2_encrypted, b eql_v2_encrypted) - -## src/operators/operator_class.sql - -- CREATE OPERATOR FAMILY eql_v2.encrypted_operator_family USING btree; -- CREATE OPERATOR CLASS eql_v2.encrypted_operator_class DEFAULT FOR TYPE eql_v2_encrypted USING btree FAMILY eql_v2.encrypted_operator_family AS - -## src/operators/order_by.sql - -- CREATE FUNCTION eql_v2.order_by(a eql_v2_encrypted) - -## src/operators/~~.sql - -- CREATE FUNCTION eql_v2.like(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2.ilike(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE FUNCTION eql_v2."~~"(a eql_v2_encrypted, b eql_v2_encrypted) -- CREATE OPERATOR ~~( -- CREATE OPERATOR ~~*( -- CREATE FUNCTION eql_v2."~~"(a eql_v2_encrypted, b jsonb) -- CREATE OPERATOR ~~( -- CREATE OPERATOR ~~*( -- CREATE FUNCTION eql_v2."~~"(a jsonb, b eql_v2_encrypted) -- CREATE OPERATOR ~~( -- CREATE OPERATOR ~~*( - -## src/ore_block_u64_8_256/casts.sql - -- CREATE FUNCTION eql_v2.text_to_ore_block_u64_8_256_term(t text) - -## src/ore_block_u64_8_256/compare.sql - -- CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256(a eql_v2_encrypted, b eql_v2_encrypted) - -## src/ore_block_u64_8_256/functions.sql - -- CREATE FUNCTION eql_v2.jsonb_array_to_ore_block_u64_8_256(val jsonb) -- CREATE FUNCTION eql_v2.ore_block_u64_8_256(val jsonb) -- CREATE FUNCTION eql_v2.ore_block_u64_8_256(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.has_ore_block_u64_8_256(val jsonb) -- CREATE FUNCTION eql_v2.has_ore_block_u64_8_256(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256_term(a eql_v2.ore_block_u64_8_256_term, b eql_v2.ore_block_u64_8_256_term) -- CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256_terms(a eql_v2.ore_block_u64_8_256_term[], b eql_v2.ore_block_u64_8_256_term[]) -- CREATE FUNCTION eql_v2.compare_ore_block_u64_8_256_terms(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) - -## src/ore_block_u64_8_256/operator_class.sql - -- CREATE OPERATOR FAMILY eql_v2.ore_block_u64_8_256_operator_family USING btree; -- CREATE OPERATOR CLASS eql_v2.ore_block_u64_8_256_operator_class DEFAULT FOR TYPE eql_v2.ore_block_u64_8_256 USING btree FAMILY eql_v2.ore_block_u64_8_256_operator_family AS - -## src/ore_block_u64_8_256/operators.sql - -- CREATE FUNCTION eql_v2.ore_block_u64_8_256_eq(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -- CREATE FUNCTION eql_v2.ore_block_u64_8_256_neq(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -- CREATE FUNCTION eql_v2.ore_block_u64_8_256_lt(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -- CREATE FUNCTION eql_v2.ore_block_u64_8_256_lte(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -- CREATE FUNCTION eql_v2.ore_block_u64_8_256_gt(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -- CREATE FUNCTION eql_v2.ore_block_u64_8_256_gte(a eql_v2.ore_block_u64_8_256, b eql_v2.ore_block_u64_8_256) -- CREATE OPERATOR = ( -- CREATE OPERATOR <> ( -- CREATE OPERATOR > ( -- CREATE OPERATOR < ( -- CREATE OPERATOR <= ( -- CREATE OPERATOR >= ( - -## src/ore_block_u64_8_256/types.sql - -- CREATE TYPE eql_v2.ore_block_u64_8_256_term AS ( -- CREATE TYPE eql_v2.ore_block_u64_8_256 AS ( - -## src/ore_cllw_u64_8/compare.sql - -- CREATE FUNCTION eql_v2.compare_ore_cllw_u64_8(a eql_v2_encrypted, b eql_v2_encrypted) - -## src/ore_cllw_u64_8/functions.sql - -- CREATE FUNCTION eql_v2.ore_cllw_u64_8(val jsonb) -- CREATE FUNCTION eql_v2.ore_cllw_u64_8(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.has_ore_cllw_u64_8(val jsonb) -- CREATE FUNCTION eql_v2.has_ore_cllw_u64_8(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.compare_ore_cllw_term_bytes(a bytea, b bytea) - -## src/ore_cllw_u64_8/types.sql - -- CREATE TYPE eql_v2.ore_cllw_u64_8 AS ( - -## src/ore_cllw_var_8/compare.sql - -- CREATE FUNCTION eql_v2.compare_ore_cllw_var_8(a eql_v2_encrypted, b eql_v2_encrypted) - -## src/ore_cllw_var_8/functions.sql - -- CREATE FUNCTION eql_v2.ore_cllw_var_8(val jsonb) -- CREATE FUNCTION eql_v2.ore_cllw_var_8(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.has_ore_cllw_var_8(val jsonb) -- CREATE FUNCTION eql_v2.has_ore_cllw_var_8(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.compare_ore_cllw_var_8_term(a eql_v2.ore_cllw_var_8, b eql_v2.ore_cllw_var_8) - -## src/ore_cllw_var_8/types.sql - -- CREATE TYPE eql_v2.ore_cllw_var_8 AS ( - -## src/schema.sql - - -## src/ste_vec/functions.sql - -- CREATE FUNCTION eql_v2.ste_vec(val jsonb) -- CREATE FUNCTION eql_v2.ste_vec(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.is_ste_vec_value(val jsonb) -- CREATE FUNCTION eql_v2.is_ste_vec_value(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.to_ste_vec_value(val jsonb) -- CREATE FUNCTION eql_v2.to_ste_vec_value(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.selector(val jsonb) -- CREATE FUNCTION eql_v2.selector(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.is_ste_vec_array(val jsonb) -- CREATE FUNCTION eql_v2.is_ste_vec_array(val eql_v2_encrypted) -- CREATE FUNCTION eql_v2.ste_vec_contains(a eql_v2_encrypted[], b eql_v2_encrypted) -- CREATE FUNCTION eql_v2.ste_vec_contains(a eql_v2_encrypted, b eql_v2_encrypted) - -## Summary - -- Total files: 52 -- Total CREATE statements: 219 diff --git a/docs/development/sql-documentation-standards.md b/docs/development/sql-documentation-standards.md index fc5522c82..990840772 100644 --- a/docs/development/sql-documentation-standards.md +++ b/docs/development/sql-documentation-standards.md @@ -21,115 +21,100 @@ ### Public Function ```sql ---! @brief Initialize a column for encryption/decryption +--! @brief Extract the equality (hm) index term from an encrypted value --! ---! This function configures the CipherStash Proxy to encrypt/decrypt ---! data in the specified column. Must be called before adding search indexes. +--! Returns the HMAC equality term used by `=` / `<>` and by a functional +--! hash index. Inlinable, so a functional index on this extractor engages +--! bare-form queries. --! ---! @param table_name Text name of table containing the column ---! @param column_name Text name of column to encrypt ---! @param cast_as Text PostgreSQL type to cast decrypted value (default: 'text') ---! @param migrating Boolean whether this is migration operation (default: false) ---! @return JSONB Configuration object with encryption settings ---! @throws Exception if table or column does not exist +--! @param a eql_v3.int4_eq Encrypted value carrying an `hm` term +--! @return eql_v3.hmac_256 The equality index term --! --! @example ---! SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); +--! CREATE INDEX ON users USING hash (eql_v3.eq_term(salary_eq)); --! ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.add_column( - table_name text, - column_name text, - cast_as text DEFAULT 'text', - migrating boolean DEFAULT false -) RETURNS jsonb +--! @see eql_v3.ord_term +CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq) + RETURNS eql_v3.hmac_256 AS $$ ... $$; ``` ### Private Function ```sql ---! @brief Internal helper for encryption validation +--! @brief Internal helper for encrypted-payload validation --! @internal ---! @param config JSONB Configuration object to validate ---! @return Boolean True if configuration is valid -CREATE FUNCTION eql_v2._validate_config(config jsonb) +--! @param val JSONB Encrypted payload to validate +--! @return Boolean True if the payload is well-formed +CREATE FUNCTION eql_v3._validate_payload(val jsonb) RETURNS boolean AS $$ ... $$; ``` ### Operator ```sql ---! @brief Equality comparison for encrypted values +--! @brief Equality comparison for an encrypted-domain value --! ---! Implements the = operator for encrypted column comparisons. ---! Uses encrypted index terms for comparison without decryption. +--! Implements the `=` operator for an `eql_v3` domain variant. Reduces to a +--! comparison on the extracted equality term — no decryption. --! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if values are equal via encrypted comparison +--! @param a eql_v3.int4_eq Left operand +--! @param b eql_v3.int4_eq Right operand +--! @return Boolean True if the equality terms match --! --! @example --! -- Using operator syntax: ---! SELECT * FROM users WHERE encrypted_email = encrypted_value; +--! SELECT * FROM users WHERE encrypted_email = $1; --! ---! @see eql_v2.compare -CREATE FUNCTION eql_v2."="(a eql_v2_encrypted, b eql_v2_encrypted) +--! @see eql_v3.eq_term +CREATE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) RETURNS boolean AS $$ ... $$; CREATE OPERATOR = ( - FUNCTION=eql_v2."=", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted + FUNCTION=eql_v3.eq, + LEFTARG=eql_v3.int4_eq, + RIGHTARG=eql_v3.int4_eq ); ``` ### Type ```sql ---! @brief Composite type for encrypted column data +--! @brief Encrypted-domain type for an equality-searchable int4 column --! ---! This is the core type used for all encrypted columns. Data is stored ---! as JSONB with the following structure: ---! - `c`: ciphertext (encrypted value) ---! - `i`: index terms (searchable metadata) ---! - `k`: key ID ---! - `m`: metadata +--! A `jsonb`-backed domain in the `eql_v3` schema. The `CHECK` requires the +--! envelope keys (`v`, `i`, `c`), the equality term (`hm`), and pins the +--! payload version (`VALUE->>'v' = '2'`). --! ---! @see eql_v2.ciphertext ---! @see eql_v2.meta_data -CREATE TYPE eql_v2_encrypted AS ( - data jsonb -); +--! @see eql_v3.eq_term +CREATE DOMAIN eql_v3.int4_eq AS jsonb + CHECK ( ... ); ``` ### Aggregate ```sql ---! @brief State transition function for grouped_value aggregate +--! @brief State transition function for the MIN aggregate --! @internal ---! @param $1 JSONB Accumulated state ---! @param $2 JSONB New value ---! @return JSONB Updated state -CREATE FUNCTION eql_v2._first_grouped_value(jsonb, jsonb) - RETURNS jsonb +--! @param $1 eql_v3.int4_ord Accumulated state +--! @param $2 eql_v3.int4_ord New value +--! @return eql_v3.int4_ord Updated state +CREATE FUNCTION eql_v3.min_sfunc(eql_v3.int4_ord, eql_v3.int4_ord) + RETURNS eql_v3.int4_ord AS $$ ... $$; ---! @brief Return first non-null value in a group +--! @brief Minimum encrypted value in a group --! ---! Aggregate function that returns the first non-null encrypted value ---! encountered in a GROUP BY clause. +--! Aggregate over an ordered encrypted-domain column. Comparison routes +--! through the variant's `<` operator (the ORE block term) — no decryption. --! ---! @param input JSONB Encrypted values to aggregate ---! @return JSONB First non-null value in group +--! @param input eql_v3.int4_ord Encrypted values to aggregate +--! @return eql_v3.int4_ord The minimum value --! --! @example ---! -- Get first email per user group ---! SELECT user_id, eql_v2.grouped_value(encrypted_email) ---! FROM user_emails ---! GROUP BY user_id; +--! SELECT eql_v3.min(price_encrypted) FROM products; --! ---! @see eql_v2._first_grouped_value -CREATE AGGREGATE eql_v2.grouped_value(jsonb) ( - SFUNC = eql_v2._first_grouped_value, - STYPE = jsonb +--! @see eql_v3.min_sfunc +CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord) ( + SFUNC = eql_v3.min_sfunc, + STYPE = eql_v3.int4_ord ); ``` diff --git a/docs/development/sql-documentation-templates.md b/docs/development/sql-documentation-templates.md index 5336b3a49..edb52f556 100644 --- a/docs/development/sql-documentation-templates.md +++ b/docs/development/sql-documentation-templates.md @@ -15,10 +15,10 @@ --! --! @example --! -- [Example description] ---! SELECT eql_v2.function_name('value1', 'value2'); +--! SELECT eql_v3.function_name('value1', 'value2'); --! ---! @see eql_v2.related_function -CREATE FUNCTION eql_v2.function_name(...) +--! @see eql_v3.related_function +CREATE FUNCTION eql_v3.function_name(...) ``` ## Template: Private/Internal Function @@ -28,7 +28,7 @@ CREATE FUNCTION eql_v2.function_name(...) --! @internal --! @param param_name [Type] [Description] --! @return [Return type] [Description] -CREATE FUNCTION eql_v2._internal_function(...) +CREATE FUNCTION eql_v3._internal_function(...) ``` ## Template: Operator Implementation @@ -39,16 +39,16 @@ CREATE FUNCTION eql_v2._internal_function(...) --! Implements the [operator] operator using [index type] for --! [operation description] without decryption. --! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand +--! @param a eql_v3.[domain_type] Left operand +--! @param b eql_v3.[domain_type] Right operand --! @return Boolean [Result description] --! --! @example --! -- [Specific example showing operator usage] --! SELECT * FROM table WHERE encrypted_col [operator] value; --! ---! @see eql_v2.[related_function] -CREATE FUNCTION eql_v2."[operator]"(...) +--! @see eql_v3.[related_function] +CREATE FUNCTION eql_v3."[operator]"(...) ``` ## Template: Domain Type @@ -59,9 +59,9 @@ CREATE FUNCTION eql_v2."[operator]"(...) --! Domain type representing [description of what this type represents]. --! Used for [use case] via the '[index_name]' index type. --! ---! @see eql_v2.add_search_config +--! @see eql_v3.add_search_config --! @note This is a transient type used only during query execution -CREATE DOMAIN eql_v2.[type_name] AS [base_type]; +CREATE DOMAIN eql_v3.[type_name] AS [base_type]; ``` ## Template: Composite Type @@ -72,7 +72,7 @@ CREATE DOMAIN eql_v2.[type_name] AS [base_type]; --! [Detailed description including structure/fields] --! --! @see [related functions] -CREATE TYPE eql_v2.[type_name] AS ( +CREATE TYPE eql_v3.[type_name] AS ( field_name field_type ); ``` @@ -85,7 +85,7 @@ CREATE TYPE eql_v2.[type_name] AS ( --! @param $1 [State type] [State description] --! @param $2 [Input type] [Input description] --! @return [State type] [Updated state description] -CREATE FUNCTION eql_v2._state_function(...) +CREATE FUNCTION eql_v3._state_function(...) --! @brief [Aggregate behavior description] --! @@ -97,8 +97,8 @@ CREATE FUNCTION eql_v2._state_function(...) --! @example --! -- [Example query using aggregate] --! ---! @see eql_v2._state_function -CREATE AGGREGATE eql_v2.aggregate_name(...) (...) +--! @see eql_v3._state_function +CREATE AGGREGATE eql_v3.aggregate_name(...) (...) ``` ## Template: Operator Class @@ -127,5 +127,5 @@ CREATE OPERATOR CLASS [opclass_name] ... --! @param value [Type] [Value being checked] --! @return Boolean True if constraint satisfied --! @throws Exception if [constraint violation condition] -CREATE FUNCTION eql_v2.[constraint_function](...) +CREATE FUNCTION eql_v3.[constraint_function](...) ``` diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 7671e3569..faac0ec49 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -9,13 +9,13 @@ breaks or you need the *why*. A scalar encrypted-domain type is a family of concrete `jsonb` domains in the **`eql_v3`** schema (`eql_v3.`, `eql_v3._eq`, -`eql_v3._ord`, …), dropped by `DROP SCHEMA eql_v3 CASCADE` and surviving -an `eql_v2` uninstall. Their extractors, comparison wrappers, and MIN/MAX +`eql_v3._ord`, …), dropped by `DROP SCHEMA eql_v3 CASCADE`. Their +extractors, comparison wrappers, and MIN/MAX aggregates also live in `eql_v3`; the searchable-encrypted-metadata (SEM) index-term types they return (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/`. The whole v3 surface is self-contained: it owns every type it -needs and has no runtime dependency on `eql_v2` (CI gates this — see §6). +needs and is fully self-contained (CI gates this — see §6). The whole SQL surface is **generated** from a single Rust source of truth: the `CATALOG` const in [`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs), @@ -480,8 +480,8 @@ domain's `CHECK` requires: - fixed envelope keys `v` and `i`; - ciphertext key `c`; - catalog JSON keys for the listed terms; -- the envelope version value `VALUE->>'v' = '2'`, matching the repo-wide - `eql_v2._encrypted_check_v` rule (`src/encrypted/constraints.sql`). +- the envelope version value `VALUE->>'v' = '2'` — the payload version pin + enforced intrinsically by every `eql_v3` domain's `CHECK`. So a domain with `&[Term::Ore]` requires `v`, `i`, `c`, and `ob` present, with `v` pinned to `2`. Beyond key presence and the version value, a malformed term @@ -629,7 +629,7 @@ extension functions that take no domain argument and so escape the structural skip: ```sql -COMMENT ON FUNCTION eql_v2.my_helper(...) IS 'eql-inline-critical: ...'; +COMMENT ON FUNCTION eql_v3.my_helper(...) IS 'eql-inline-critical: ...'; ``` The generator never emits this marker; every function it produces takes a domain @@ -717,7 +717,7 @@ recognises exactly these two forms; any other argument is a usage error. The generator targets the `eql_v3` schema throughout: `SCHEMA = "eql_v3"` (`crates/eql-codegen/src/consts.rs`) qualifies both the domain families and the SEM index-term types the extractors return (`eql_v3.hmac_256`, -`eql_v3.ore_block_256`), so no generated SQL references `eql_v2`. +`eql_v3.ore_block_256`), so the generated SQL is entirely self-contained within `eql_v3`. `tasks/build.sh` runs `cargo run -p eql-codegen` at the start of every `mise run build`, so the generated SQL is never checked in. (The build first sweeps every @@ -847,10 +847,10 @@ backs equality. `jsonb` remains **out of scope**. The `ScalarKind`/`Fixture` enums carry its string-backed shape at the capability layer, but no `jsonb` SQL surface is -generated — it needs a separate SQL design beyond this ordered-scalar -materializer. JSONB encrypted behaviour today lives on the composite -`eql_v2_encrypted` type and its hand-written operator surface in `src/encrypted/` -and `src/operators/`, not the scalar materializer. +generated by *this* materializer — it needs a separate SQL design beyond the +ordered-scalar materializer. Encrypted-JSONB behaviour lives on the hand-written +`eql_v3.json` SteVec document domain (`src/v3/jsonb/`), not the scalar +materializer. --- From 67ba5a73c58eda3fa94ba30636d8a6a5d2555e86 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:21:01 +1000 Subject: [PATCH 349/599] docs(changelog): note documentation migrated to the eql_v3 surface --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0afb08c53..7cda33bb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,7 +49,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Removed -- **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). +- **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). ### Fixed From a712a2fb5442e2c8f22a3f5933b68250ed29dcd0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 00:22:41 +1000 Subject: [PATCH 350/599] docs(test): add text language tag to FIXTURE_SCHEMA fence (markdownlint MD040) --- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 6abde8656..3ff213937 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -13,7 +13,7 @@ by the Rust fixture framework in `tests/sqlx/src/fixtures/` and is gitignored. `mise run fixture:generate:all` (the `generate_all_fixtures` test, run over `eql-scalars::CATALOG`) materialises the fixtures into this directory: -``` +```text Generated eql_v3 fixtures (gitignored) ├── eql_v3_.sql (jsonb payload — no EQL dependency) ├── eql_v3__doubles.sql (jsonb payload — duplicate-value variant the From 030e4969e488fad6f44624690cfcdd5803d5ecdd Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 10:08:27 +1000 Subject: [PATCH 351/599] docs(version): document eql_v3.version(); finish docker/README migration The doc migration predated the version() port, so version() was documented nowhere and docker/README still referenced the removed eql_v2 surface. - README.md: add a 'SELECT eql_v3.version()' check to the Versioning section. - docker/README.md: repoint the intro prose ('eql_v2 schema') and the version example onto eql_v3 (the file was missed by the migration). - docs_v3_grep.sh: add docker/README.md to the Tier-1 gate so it stays eql_v2-free. eql_v3.version() ships from the remove-eql-v2 branch. --- README.md | 6 ++++++ docker/README.md | 4 ++-- tasks/test/docs_v3_grep.sh | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6c896642..9de7c392c 100644 --- a/README.md +++ b/README.md @@ -278,6 +278,12 @@ These frameworks use EQL to enable searchable encryption functionality in Postgr EQL is distributed as a versioned install script (`cipherstash-encrypt.sql`) published with each [GitHub release](https://github.com/cipherstash/encrypt-query-language/releases). Track the release tag you installed; re-running the install script is idempotent and upgrades the `eql_v3` surface in place. +You can check the version installed in a database by running: + +```sql +SELECT eql_v3.version(); +``` + ### Upgrading To upgrade to the latest version of EQL, you can simply run the install script again. diff --git a/docker/README.md b/docker/README.md index 06a4e2111..bf570ee30 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,6 +1,6 @@ # `postgres-eql` Docker image -A layered image that ships an official `postgres` image with [CipherStash EQL](https://github.com/cipherstash/encrypt-query-language) pre-installed. One `docker run` and you have a Postgres with the `eql_v2` schema, types, and operators ready to use. +A layered image that ships an official `postgres` image with [CipherStash EQL](https://github.com/cipherstash/encrypt-query-language) pre-installed. One `docker run` and you have a Postgres with the `eql_v3` schema, types, and operators ready to use. ## Quick start @@ -12,7 +12,7 @@ docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres \ Then in another shell: ```sh -PGPASSWORD=postgres psql -h localhost -U postgres -c "SELECT eql_v2.version();" +PGPASSWORD=postgres psql -h localhost -U postgres -c "SELECT eql_v3.version();" ``` ## Tags diff --git a/tasks/test/docs_v3_grep.sh b/tasks/test/docs_v3_grep.sh index 7a87ecd4f..34fd0780e 100755 --- a/tasks/test/docs_v3_grep.sh +++ b/tasks/test/docs_v3_grep.sh @@ -10,6 +10,7 @@ cd "$REPO_ROOT" # A file deleted by the migration (e.g. index-config.md) is simply skipped. TIER1=( "README.md" + "docker/README.md" "docs/README.md" "docs/reference/eql-functions.md" "docs/reference/query-performance.md" From 3a5a4c13de45a06247fe92ffa479b674be8c3af2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 11:33:07 +1000 Subject: [PATCH 352/599] docs(dev): re-author DEVELOPMENT.md and SUPABASE.md onto the eql_v3 surface Replace the removed eql_v2 architecture (eql_v2_encrypted composite, config table, old src/ layout, db-side index config) with the v3 model: per-scalar eql_v3. domains, the catalog/codegen build, functional indexes on extractors, and client-side configuration. --- DEVELOPMENT.md | 541 +++++++++++++++++++++----------------- SUPABASE.md | 286 ++++++++++++-------- docs/reference/PAYLOAD.md | 62 ----- 3 files changed, 489 insertions(+), 400 deletions(-) delete mode 100644 docs/reference/PAYLOAD.md diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 2df601162..1e5280ed3 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -3,81 +3,111 @@ ## Table of Contents - [How this project is organised](#how-this-project-is-organised) + - [Schemas: `eql_v2` and `eql_v3`](#schemas-eql_v2-and-eql_v3) + - [Repository layout](#repository-layout) - [Set up a local development environment](#set-up-a-local-development-environment) - [Installing mise](#installing-mise) +- [Building](#building) + - [The catalog and code generation](#the-catalog-and-code-generation) + - [The dependency system](#the-dependency-system) + - [Building a release locally](#building-a-release-locally) - [Testing](#testing) - [Running tests locally](#running-tests-locally) + - [Rust workspace tests (no database)](#rust-workspace-tests-no-database) +- [Adding to the `eql_v3` surface](#adding-to-the-eql_v3-surface) + - [Adding a scalar encrypted-domain type](#adding-a-scalar-encrypted-domain-type) + - [Hand-written SQL](#hand-written-sql) + - [Documentation comments](#documentation-comments) - [Releasing](#releasing) -- [Building](#building) - - [Dependencies](#dependencies) - - [Building a release locally](#building-a-release-locally) -- [Structure](#structure) - - [Schema](#schema) - - [Types](#types) - - [Encrypted column type](#encrypted-column-type) - - [Encrypted index term types](#encrypted-index-term-types) - - [Operators](#operators) - - [Working without operators](#working-without-operators) - - [Configuration table](#configuration-table) + - [dbdev](#dbdev) -### How this project is organised +## How this project is organised -Development is managed through [mise](https://mise.jdx.dev/), both locally and [in CI](https://github.com/cipherstash/encrypt-query-language/actions). +Encrypt Query Language (EQL) is a PostgreSQL extension for searchable +encryption. Development is managed through [mise](https://mise.jdx.dev/), both +locally and [in CI](https://github.com/cipherstash/encrypt-query-language/actions). mise has tasks for: -- Building EQL install and uninstall scripts (`build`) +- Building the EQL install and uninstall scripts (`build`) - Starting and stopping PostgreSQL containers (`postgres:up`, `postgres:down`) -- Running unit and integration tests (`test`, `reset`) +- Running tests and resetting database state (`test`, `reset`) +- Regenerating the encrypted-domain SQL surface from the Rust catalog (run as + part of `build`) +- Validating and generating documentation (`docs:validate`, `docs:generate`) -These are the important files in the repo: - -``` -. -├── mise.toml <-- the main config file for mise -├── tasks/ <-- mise tasks -├── src/ <-- The individual SQL components that make up EQL -│ ├── blake3/ <-- blake3 index term type -│ ├── encrypted/ <-- Encrypted column type -│ ├── operators/ <-- Operators for the encrypted column type -│ ├── match/ <-- match index term type -│ ├── unique/ <-- unique index term type -│ ├── ore/ <-- ore index term type -│ ├── ore_cllw_u64_8/ <-- ore-cllw fixed index term type -│ ├── ore_cllw_var_8/ <-- ore-cllw variable index term type -│ ├── config/ <-- Configuration management for encrypted columns -│ ├── schema.sql <-- Defines the PostgreSQL schema for namespacing EQL -│ ├── crypto.sql <-- Installs pg_crypto extension, required by ORE -│ ├── common.sql <-- Shared helper functions -│ └── version.sql <-- Defines function to query current EQL version - automatically generated on build -├── docs/ <-- Tutorial, reference, and concept documentation -├── tests/ <-- Unit and integration tests -│ ├── docker-compose.yml <-- Docker configuration for running PostgreSQL instances -│ └── *.sql <-- Helpers and test data loaded during test runs -├── release/ <-- Build artifacts produced by the `build` task -├── examples/ <-- Example uses of EQL in different languages -└── playground/ <-- Playground enviroment for experimenting with EQL and CipherStash Proxy -``` +### Schemas: `eql_v2` and `eql_v3` -Tests are in the `tests/sqlx/` directory using Rust and the SQLx framework. +EQL installs into two PostgreSQL schemas, both of which coexist: -We break SQL into small modules named after what they do. +- **`eql_v2`** — the unchanged core public API: the core encrypted types, + functions, and operators. The `eql_v2` schema name is part of the public API + and is independent of the EQL release version. +- **`eql_v3`** — an additional, self-contained schema that namespaces the + encrypted-domain **scalar type families** (`int4`, `int2`, `int8`, `date`, + `timestamptz`, `numeric`, `text`, `bool`, `float4`, `float8`). It owns its + own copies of the searchable-encrypted-metadata (SEM) index-term types it + needs (`eql_v3.hmac_256`, `eql_v3.ore_block_256`), so it has no runtime + dependency on `eql_v2`. -In general, operator functions are thin wrappers around larger functions that do the actual work. -Put the wrapper functions in `operators.sql` and the larger functions in `functions.sql`. +The current install script is built from the `eql_v3` surface. Adding a new +schema for a new surface is additive — it is not a rename of `eql_v2` and not a +public-API break. -Dependencies between SQL in `src/` are declared in a comment at the top of each file. -All SQL files should `REQUIRE` the source file of any other object they reference. +### Repository layout -All files must have at least one declaration, and the default is to reference the schema: +These are the important files and directories in the repo: -``` --- REQUIRE: src/schema.sql +```text +. +├── mise.toml <-- the main config file for mise +├── tasks/ <-- mise task scripts (build, test, reset, docs, …) +│ ├── build.sh <-- regenerates + assembles the release SQL +│ ├── test.sh <-- runs the SQLx test suite +│ ├── reset.sh <-- uninstall + install EQL into local postgres +│ ├── postgres.toml <-- postgres:up / postgres:down / postgres:reset +│ ├── docs/ <-- documentation generate/validate tasks +│ └── test/ <-- additional test tasks (self_contained_v3, …) +├── crates/ <-- Rust workspace: catalog, code generator, types +│ ├── eql-scalars/ <-- THE catalog (eql-scalars::CATALOG): source of truth +│ ├── eql-codegen/ <-- renders the eql_v3 scalar SQL from the catalog +│ ├── eql-types/ <-- shared Rust types + generated TS/JSON Schema bindings +│ └── eql-tests-macros/ <-- proc-macros used by the SQLx test matrix +├── src/ <-- SQL components that make up EQL +│ ├── v3/ <-- the self-contained eql_v3 surface +│ │ ├── schema.sql <-- defines the eql_v3 PostgreSQL schema +│ │ ├── crypto.sql <-- crypto helpers (forked for v3) +│ │ ├── common.sql <-- shared helper functions (forked for v3) +│ │ ├── version.sql <-- eql_v3.version() — generated from version.template +│ │ ├── version.template <-- template for version.sql +│ │ ├── sem/ <-- hand-written SEM index-term types (hmac_256, ore_block_256, …) +│ │ ├── scalars/ <-- generated scalar domain families, one dir per type +│ │ │ ├── functions.sql <-- shared blocker for native jsonb operators +│ │ │ └── / <-- e.g. int4/, text/, bool/ (mostly gitignored, generated) +│ │ ├── jsonb/ <-- jsonb SteVec support +│ │ └── lint/ <-- structural lints +│ ├── deps-v3.txt <-- REQUIRE edges for the v3 surface +│ ├── deps-ordered-v3.txt <-- tsorted build order +│ └── README.md +├── docs/ <-- reference, concept, and API documentation +├── tests/ <-- test framework and fixtures +│ ├── docker-compose.yml <-- Docker config for PostgreSQL 14–17 (port 7432) +│ └── sqlx/ <-- Rust/SQLx test suite +└── release/ <-- build artifacts produced by `mise run build` + ├── cipherstash-encrypt.sql <-- installer + └── cipherstash-encrypt-uninstall.sql <-- uninstaller ``` +> [!IMPORTANT] +> The per-type scalar SQL files (`src/v3/scalars//_types.sql`, +> `*_functions.sql`, `*_operators.sql`, `*_aggregates.sql`) are **generated** +> and **gitignored**. Never hand-edit them — they are overwritten on every +> build. See [The catalog and code generation](#the-catalog-and-code-generation). + ## Set up a local development environment -> [!IMPORTANT] > **Before you follow this how-to** you need to have this software installed: +> [!IMPORTANT] +> **Before you follow this how-to** you need to have this software installed: > > - [mise](https://mise.jdx.dev/) — see the [installing mise](#installing-mise) instructions > - [Docker](https://www.docker.com/) — see Docker's [documentation for installing](https://docs.docker.com/get-started/get-docker/) @@ -89,10 +119,10 @@ Local development quickstart: git clone https://github.com/cipherstash/encrypt-query-language cd encrypt-query-language -# Install dependencies +# Trust the mise config and install tooling (Rust toolchain, sqlx-cli, …) mise trust --yes -# Build EQL installer and uninstaller, outputting to release/ +# Build the EQL installer and uninstaller, outputting to release/ mise run build # Start a postgres instance (defaults to PostgreSQL 17) @@ -127,38 +157,114 @@ echo 'eval "$(mise activate bash)"' >> ~/.bashrc echo 'eval "$(mise activate zsh)"' >> ~/.zshrc ``` -We use [`cargo-binstall`](https://github.com/cargo-bins/cargo-binstall) for faster installation of tools installed via `mise` and Cargo. -We install `cargo-binstall` via `mise` when installing development and testing dependencies. +We use [`cargo-binstall`](https://github.com/cargo-bins/cargo-binstall) for +faster installation of tools installed via mise and Cargo. It is installed via +mise when bootstrapping development and testing dependencies. > [!TIP] -> We provide abbreviations for most of the commands that follow. -> For example, `mise run postgres:setup` can be abbreviated to `mise r s`. -> Run `mise tasks --extended` to see the task shortcuts. +> Many tasks have short aliases. For example, `mise run build` can be +> abbreviated to `mise r b`, and `mise run clean` to `mise r k`. +> Run `mise tasks --extended` to see the available tasks and shortcuts. -## Testing +## Building + +The build regenerates the `eql_v3` scalar SQL surface from the Rust catalog, +resolves SQL dependencies into a single ordered file, and writes the install +and uninstall scripts to `release/`. + +### The catalog and code generation + +The `eql_v3` scalar encrypted-domain types are **generated** from a single Rust +source of truth — the `CATALOG` const in +[`crates/eql-scalars/src/lib.rs`](./crates/eql-scalars/src/lib.rs). There is no +TOML manifest and no Python. + +Each scalar type is one `ScalarSpec` row in `CATALOG`, declaring: + +- the type `token` (e.g. `int8`), +- its `ScalarKind` (the `kind` field), +- the `DomainSpec`s mapping each generated domain suffix to its fixed index + `Term`s (`_eq => [Hm]`, `_ord` / `_ord_ore => [Ore]`), and +- the plaintext `Fixture` value list the SQLx test matrix consumes. + +`mise run build` invokes `cargo run -p eql-codegen`, which regenerates the SQL +surface into `src/v3/scalars//` from `CATALOG` at the start of every build. +For an unchanged catalog, regeneration is deterministic and byte-identical. + +The generated files +(`_types.sql` / `_functions.sql` / `_operators.sql` / +`_aggregates.sql`) carry an `-- AUTOMATICALLY GENERATED FILE` header (the +project-wide marker that `docs:validate` greps for), are **gitignored**, and +are **never committed**. If `mise run build` produces unexpected output, the +change is in `crates/eql-scalars/src` (the catalog/terms) or +`crates/eql-codegen/src` (the renderers), not in run-to-run variation. + +### The dependency system + +SQL sources under `src/v3/` are split into small modules. Dependencies between +them are declared with `-- REQUIRE:` comments at the top of each file — every +file should `REQUIRE` the source of any other object it references. + +At minimum, a file references the schema: + +```text +-- REQUIRE: src/v3/schema.sql +``` + +The build collects these edges into `src/deps-v3.txt`, resolves them with +`tsort` into `src/deps-ordered-v3.txt`, and concatenates the files in +dependency order to produce a single installer. The build fails loudly if a +file referenced in the dependency list does not exist. -There are tests for checking EQL against PostgreSQL versions 14–17, that verify: +The `eql_v3` surface is **self-contained**: no `eql_v2.` reference +appears anywhere under `src/v3/`. This invariant is enforced in CI by +`mise run test:self_contained_v3`. -- Adding, removing, and modifying encrypted data and indexes -- Validating, applying, and removing configuration for encrypted data and encrypted indexes -- Validating schemas for EQL configuration, encrypted data, and encrypted indexes -- Using PostgreSQL operators on encrypted data and indexes (`=`, `<>`, `@>`) +### Building a release locally + +To build a release locally, run: + +```bash +# alias: mise r b +mise run build +``` -Tests are written in Rust using the SQLx framework and live in `tests/sqlx/`. +This produces two SQL files in `release/`: -The easiest way to run the tests [is in GitHub Actions](./.github/workflows/test-eql.yml): +- An installer (`cipherstash-encrypt.sql`), and +- An uninstaller (`cipherstash-encrypt-uninstall.sql`) + +> [!TIP] +> A bare build can leave stale generated files. When in doubt, run a clean +> build: +> +> ```bash +> mise run clean && mise run build # alias: mise r k && mise r b +> ``` + +## Testing -- Automatically whenever there are changes in the `sql/`, `tests/`, or `tasks/` directories -- By manually running [the workflow](https://github.com/cipherstash/encrypt-query-language/actions/workflows/test-eql.yml) +EQL is tested against PostgreSQL versions 14–17. The suite is written in Rust +using the SQLx framework and lives in `tests/sqlx/`. Container configuration is +in `tests/docker-compose.yml`; the database listens on **port 7432** +(`localhost:7432`, user `cipherstash`, password `password`). -You can also [run the tests locally](#running-tests-locally) when doing local development. +> [!IMPORTANT] +> EQL is searchable encryption, so tests run against **real ciphertexts and +> index terms** produced by the actual crypto — never hand-curated or synthetic +> blobs. Fixtures are generated by encrypting plaintext through +> cipherstash-client, so the SQLx suite **requires** CipherStash credentials +> (ZeroKMS auth plus a client key). CI has them. Do not add static/committed +> fixtures to dodge this dependency. See the `test:sqlx:prep` comment in +> `mise.toml` for the exact environment variables. ### Running tests locally > [!IMPORTANT] -> **Before you run the tests locally** you need to [set up a local dev environment](#set-up-a-local-development-environment). +> **Before you run the tests locally** you need to +> [set up a local dev environment](#set-up-a-local-development-environment). -To run tests locally with PostgreSQL 17: +To run the tests against PostgreSQL 17: ```shell # Start a postgres instance (defaults to PostgreSQL 17) @@ -171,7 +277,8 @@ mise run test mise run postgres:down ``` -You can run the same tasks for Postgres 14, 15, 16, and 17 by specifying arguments: +You can run the same tasks against Postgres 14, 15, and 16 by specifying +arguments: ```shell # Start a postgres 14 instance @@ -184,193 +291,157 @@ mise run test --postgres 14 mise run postgres:down ``` -The configuration for the Postgres containers in `tests/docker-compose.yml`. - Limitations: -- **Volumes for Postgres containers are not persistent.** - If you need to look at data in the container, uncomment a volume in - `tests/docker-compose.yml` -- **You can't run multiple Postgres containers at the same time.** - All the containers bind to the same port (`7543`). If you want to run - multiple containers at the same time, you have to change the ports by - editing `tests/docker-compose.yml` - -## Releasing - -To cut a [release](https://github.com/cipherstash/encrypt-query-language/releases) of EQL: - -1. Draft a [new release](https://github.com/cipherstash/encrypt-query-language/releases/new) on GitHub. -1. Choose a tag, and create a new one with the prefix `eql-` followed by a [semver](https://semver.org/) (for example, `eql-1.2.3`). -1. Generate the release notes. -1. Optionally set the release to be the latest (you can set a release to be latest later on if you are testing out a release first). -1. Click `Publish release`. +- **Volumes for Postgres containers are not persistent.** If you need to look at + data in the container, uncomment a volume in `tests/docker-compose.yml`. +- **You can't run multiple Postgres containers at the same time.** All the + containers bind to the same port (`7432`). To run multiple containers + concurrently, change the ports in `tests/docker-compose.yml`. -This will trigger the [Release EQL](https://github.com/cipherstash/encrypt-query-language/actions/workflows/release-eql.yml) workflow, which will build and attach artifacts to [the release](https://github.com/cipherstash/encrypt-query-language/releases/). +### Rust workspace tests (no database) -#### Public documentation updates - -When a tag with the `eql-` prefix is pushed (for example, `eql-1.2.3`), the workflow at `.github/workflows/rebuild-docs.yml` runs and sends a webhook to our Vercel-hosted public docs site to trigger a rebuild. - -What happens end-to-end: +The catalog, code generator, and shared types have fast tests that do not need a +database: -- Release EQL builds EQL artifacts and generates API docs (HTML, XML, Markdown). The Markdown frontmatter includes the release version. -- Rebuild Docs posts to the `DOCS_WEBHOOK_URL` secret, which Vercel uses to kick off a fresh build of the public docs. -- The public docs site pulls the latest generated reference (`docs/api/markdown/API.md`) and publishes it under the corresponding version. - -Manual triggers and troubleshooting: - -- You can re-run the “Rebuild Docs” workflow from the Actions tab if a build fails downstream. -- Ensure the repository secret `DOCS_WEBHOOK_URL` is set and valid; the workflow simply POSTs to that URL. - -This mirrors the process used in the sibling `protect` repository so both products’ documentation stay in sync with releases. - -### dbdev - -We publish a Trusted Language Extension for PostgreSQL for use on [dbdev](https://database.dev/). -You can find the extension on [dbdev's extension catalog](https://database.dev/cipherstash/eql). - -#### Publishing to dbdev - -**DISCLAIMER:** At the moment, we are manually publishing the extension to dbdev and the versions might not be in sync with the releases on GitHub until we automate this process. - -Steps to publish - -> [!NOTE] -> Make sure you have the [dbdev CLI](https://supabase.github.io/dbdev/cli/) installed and logged in using the `dbdev shared token` in 1Password. - -1. Run `mise run build` to build the extension which will create the following file in the `dbdev` directory. (Note: this release artifact is built from the Supabase release artifact). -2. After the build is complete, you will have a file in the `dbdev` directory called `eql--0.0.0.sql`. -3. Update the file name from `eql--0.0.0.sql` replacing `0.0.0` with the version number of the release. -4. Also update the `eql.control` file with the new version number. -5. Run `dbdev publish` to publish the extension to dbdev. - -Reach out to @calvinbrewer if you need help. - -## Building +```bash +# Catalog + generator tests (eql-scalars, eql-codegen) +mise run test:codegen -### Dependencies +# Compile, lint, and test the std-only workspace crates +mise run test:crates -SQL sources are split into smaller files in `src/`. -Dependencies are resolved at build time to construct a single SQL file with the correct ordering. +# Parity gate: assert eql-codegen output matches the reference SQL byte-for-byte +mise run codegen:parity -### Building a release locally +# Assert the eql_v3 surface is self-contained (no eql_v2 leakage) +mise run test:self_contained_v3 +``` -To build a release locally, run: +The catalog is validated by the Rust compiler (an undefined term or unknown +scalar is a compile error) plus catalog `#[test]`s, so many mistakes are caught +without a database at all. + +## Adding to the `eql_v3` surface + +### Adding a scalar encrypted-domain type + +Adding a scalar encrypted-domain type (e.g. a new ordered numeric scalar) is one +`ScalarSpec` row in `eql-scalars::CATALOG` +([`crates/eql-scalars/src/lib.rs`](./crates/eql-scalars/src/lib.rs)). New term +behaviour belongs in the `Term` enum's `impl` methods (with tests), not in +free-form catalog data. After editing the catalog, run `mise run build` to +regenerate the SQL surface. + +Follow the reference guide: +[`docs/reference/adding-a-scalar-encrypted-domain-type.md`](./docs/reference/adding-a-scalar-encrypted-domain-type.md). +The mechanics are fixed for ordered scalar domains; the catalog row only +declares the token, kind, domain suffixes, and terms. + +A few footguns the generator exists to prevent — worth knowing when reading the +output: + +- **Blockers must never be `STRICT`** and must be `LANGUAGE plpgsql`, not + `LANGUAGE sql`. A blocker exists to always `RAISE`; a `STRICT` or inlinable + body lets the planner skip it and silently bypass the "operator not supported" + exception. +- **No domain-over-domain** (`CREATE DOMAIN a AS b`) and **no operator class on + a domain.** Index through a functional index on the extractor + (`eq_term` / `ord_term`). +- **Inlinable functions** (extractors, comparison wrappers) need `LANGUAGE sql`, + a single-statement `SELECT`, `IMMUTABLE`, and **no `SET` clause** — a pinned + `search_path` disables inlining. + +### Hand-written SQL + +Generated files are gitignored and overwritten on every build, so hand-written +SQL never goes in them. Hand-written SQL beyond the fixed generated surface +goes in `src/v3/scalars//_extensions.sql` — no auto-generated header, +explicit `-- REQUIRE:` edges, and **it is committed**. The hand-written SEM +index-term types live under `src/v3/sem/`. + +When adding SQL, follow these conventions: + +- Never drop the configuration table — it may contain customer data and must + survive across EQL versions. +- Everything else should have a `DROP IF EXISTS`. +- Functions should be `DROP` then `CREATE` (not `CREATE OR REPLACE`) — data + types cannot be changed once created, so dropping first is more flexible. +- Keep `DROP` and `CREATE` together in the code. +- In general, put operator wrappers in `operators.sql` and the larger + implementation functions in `functions.sql`. Operator functions are thin + wrappers around the functions that do the actual work. + +### Documentation comments + +All SQL functions and types must be documented with Doxygen-style comments using +the `--!` prefix. At minimum provide `@brief`, plus `@param` for parameters and +`@return` for non-void returns. Verify coverage and required tags with: ```bash -mise run build +mise run docs:validate ``` -This produces two SQL files in `releases/`: - -- An installer (`cipherstash-encrypt.sql`), and -- An uninstaller (`cipherstash-encrypt-uninstall.sql`) - -## Structure - -### Adding SQL - -When adding new SQL files to the project, follow these guidelines: - -- Never drop the configuration table as it may contain customer data and needs to live across EQL versions -- Everything else should have a `DROP IF EXISTS` -- Functions should be `DROP` and `CREATE`, instead of `CREATE OR REPLACE` - - Data types cannot be changed once created, so dropping first is more flexible -- Keep `DROP` and `CREATE` together in the code -- Types need to be dropped last, add to the `666-drop_types.sql` +See the **Documentation Standards** section in +[`CLAUDE.md`](./CLAUDE.md) for the full tag list, an annotated example, and the +generation tasks (`mise run docs:generate`). -### Schema - -EQL is installed into the `eql_v2` PostgreSQL schema. - -### Types - -#### Encrypted column type - -`public.eql_v2_encrypted` is EQL's encrypted column type, defined as PostgreSQL composite type. - -This column type is used for storing the encrypted value and any associated indexes for searching. -The associated indexes are described in the [index term types](#index-term-types) section. - -`public.eql_v2_encrypted` is in the public schema, because once it's used by a user in one of their tables, encrypted column types cannot be dropped without dropping data. - -#### Encrypted index term types - -Each type of encrypted index (`unique`, `match`, `ore`) has an associated type, functions, and operators. - -These are transient runtime types, used internally by EQL functions and operators: - -- `eql_v2.blake3` -- `eql_v2.hmac_256` -- `eql_v2.bloom_filter` -- `eql_v2.ore_cllw_u64_8` -- `eql_v2.ore_cllw_var_8` -- `eql_v2.ore_block_u64_8_256` -- `eql_v2.ore_block_u64_8_256_term` - -The data in the column is converted into these types, when any operations are being performed on that encrypted data. - -### Operators - -Searchable encryption functionality is driven by operators on two types: - -- EQL's `eql_v2_encrypted` column type -- PostgreSQL's `jsonb` column type - -For convenience, operators allow comparisons between `eql_v2_encrypted` and `jsonb` column types. - -Operators allow comparisons between: +## Releasing -- `eql_v2_encrypted` and `eql_v2_encrypted` -- `jsonb` and `eql_v2_encrypted` -- `eql_v2_encrypted` and `jsonb` +To cut a [release](https://github.com/cipherstash/encrypt-query-language/releases) of EQL: -Operators defined on the `eql_v2_encrypted` dispatch to the underlying index terms based on the most efficient order of operations. +1. Draft a [new release](https://github.com/cipherstash/encrypt-query-language/releases/new) on GitHub. +1. Choose a tag, and create a new one with the prefix `eql-` followed by a + [semver](https://semver.org/) (for example, `eql-1.2.3`). +1. Generate the release notes. +1. Optionally set the release to be the latest (you can mark a release as latest + later if you are testing it first). +1. Click `Publish release`. -For example, it is possible to have both `unique` and `ore` indexes defined. -For equality (`=`, `<>`) operations, a `unique` index term is a text comparison and should be preferred over an `ore` index term. +This triggers the +[Release EQL](https://github.com/cipherstash/encrypt-query-language/actions/workflows/release-eql.yml) +workflow, which builds and attaches artifacts to the release. -The index term types and functions are internal implementation details and should not be exposed as operators on the `eql_v2_encrypted` type. -For example, `eql_v2_encrypted` should not have an operator with the `ore_block_u64_8_256` type. -Users should never need to think about or interact with EQL internals. +See `CHANGELOG.md` and `docs/upgrading/` for changelog and upgrade-note +discipline — user-facing changes need a `## [Unreleased]` changelog entry in the +same PR, and behaviour callers should be aware of needs a numbered upgrade note. -#### Working without operators +#### Public documentation updates -There are scenarios where users are unable to install EQL operators in your database. -Users will experience this in more restrictive environments like Supabase. +When a tag with the `eql-` prefix is pushed (for example, `eql-1.2.3`), the +workflow at `.github/workflows/rebuild-docs.yml` runs and sends a webhook to the +Vercel-hosted public docs site to trigger a rebuild. -EQL can still be used, but requires the use of functions instead of operators. +What happens end-to-end: -For example, to perform an equality query: +- Release EQL builds EQL artifacts and generates API docs (HTML, XML, Markdown). + The Markdown frontmatter includes the release version. +- Rebuild Docs posts to the `DOCS_WEBHOOK_URL` secret, which Vercel uses to kick + off a fresh build of the public docs. +- The public docs site pulls the latest generated reference + (`docs/api/markdown/API.md`) and publishes it under the corresponding version. -```sql -SELECT email FROM users WHERE eql_v2.eq(email, $1); -``` +Manual triggers and troubleshooting: -### Configuration table +- You can re-run the "Rebuild Docs" workflow from the Actions tab if a build + fails downstream. +- Ensure the repository secret `DOCS_WEBHOOK_URL` is set and valid; the workflow + simply POSTs to that URL. -EQL uses a table for tracking configuration state in the database, called `public.eql_v2_configuration`. +### dbdev -This table should never be dropped, except by a user explicitly uninstalling EQL. +We publish a Trusted Language Extension for PostgreSQL for use on +[dbdev](https://database.dev/). You can find the extension on +[dbdev's extension catalog](https://database.dev/cipherstash/eql). - +1. Run `mise run build` to build the extension artifacts. +1. Update the artifact file name and the `eql.control` file with the new version + number. +1. Run `dbdev publish` to publish the extension to dbdev. diff --git a/SUPABASE.md b/SUPABASE.md index 4f2cea50b..e04b23300 100644 --- a/SUPABASE.md +++ b/SUPABASE.md @@ -1,146 +1,226 @@ -# Supabase - -## No operators, no problems - -Supabase [does not currently support](https://github.com/supabase/supautils/issues/72) custom operators. -The EQL operator functions can be used in this situation. - -In EQL, PostgreSQL operators are an alias for a function, so the implementation and behaviour remains the same across operators and functions. - -| Operator | Function | Example | -| -------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------- | -| `=` | `eql_v2.eq(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.eq(encrypted_email, $1)`
| -| `<>` | `eql_v2.neq(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.neq(encrypted_email, $1)`
| -| `<` | `eql_v2.lt(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.lt(encrypted_email, $1)`
| -| `<=` | `eql_v2.lte(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.lte(encrypted_email, $1)`
| -| `>` | `eql_v2.gt(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.gt(encrypted_email, $1)`
| -| `>=` | `eql_v2.gte(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.gte(encrypted_email, $1)`
| -| `~~` | `eql_v2.like(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.like(encrypted_email, $1)`
| -| `~~*` | `eql_v2.ilike(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.ilike(encrypted_email, $1)`
| -| `LIKE` | `eql_v2.like(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.like(encrypted_email, $1)`
| -| `ILIKE` | `eql_v2.ilike(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.ilike(encrypted_email, $1)`
| -| `@>` | `eql_v2.ste_vec_contains(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.ste_vec_contains(encrypted_array, $1)`
| -| `<@` | `eql_v2.ste_vec_contains(eql_v2_encrypted, eql_v2_encrypted)` | `SELECT * FROM users WHERE eql_v2.ste_vec_contains($1, encrypted_array)`
| - -### Core Functions - -| Function | Description | Exa mple | -| --------------------------------- | --------------------------------------------------------- | ----------------------------------------------- | -| `eql_v2.ciphertext(val)` | Extract ciphertext from encrypted value | `SELECT eql_v2.ciphertext (encrypted_field)` | -| `eql_v2.blake3(val)` | Extract blake3 hash from encrypted value | `SELECT eql_v2.blake3( encrypted_field)` | -| `eql_v2.hmac_256(val)` | Extract hmac_256 index from encrypted value | `SELECT eql_v2.hmac_256(encrypted_fie ld)` | -| `eql_v2.bloom_filter(val)` | Extract match index from encrypted value | `SELECT eql_v2.bloom_filter(encrypted_field)` | -| `eql_v2.ore_block_u64_8_256(val)` | Extract ORE index from encrypted value | `SELECT eql_v2.ore_block_u64_8_256(encrypted_field)` | -| `eql_v2.ore_cllw_u64_8(val)` | Extract CLLW ORE index from encrypted value | `SELECT eql_v2.ore_cllw_u64_8(encrypted_fie ld)` | -| `eql_v2.ore_cllw_var_8(val)` | Extract variable CLLW ORE index from encrypted value | `SELECT eql_v2.ore_cllw_var_8( encrypted_field)` | - -### Aggregate Functions - -| Function | Description | Example | -| ----------------- | --------------------------------------- | ------------------------------------ | -| `eql_v2.min(val)` | Get minimum value from encrypted column | `SELECT eql_v2.min(encrypted_field)` | -| `eql_v2.max(val)` | Get maximum value from encrypted column | `SELECT eql_v2.max(encrypted_field)` | - -### Configuration Functions - -| Function | Description | Example | -| ---------------------------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------- | -| `eql_v2.config_default(config)` | Get default configuration | `SELECT eql_v2.config_default(NULL)` | -| `eql_v2.config_add_table(table_name, config)` | Add table to configuration | `SELECT eql_v2.config_add_table('users', config)` | -| `eql_v2.config_add_column(table_name, column_name, config)` | Add column to configuration | `SELECT eql_v2.config_add_column('users', 'email', config)` | -| `eql_v2.config_add_cast(table_name, column_name, cast_as, config)` | Add cast configuration | `SELECT eql_v2.config_add_cast('users', 'email', 'text', config)` | -| `eql_v2.config_add_index(table_name, column_name, index_name, opts, config)` | Add index to configuration | `SELECT eql_v2.config_add_index('users', 'email', 'match', opts, config)` | -| `eql_v2.config_match_default()` | Get default match index options | `SELECT eql_v2.config_match_default()` | - -### Example SQL Statements - -#### Equality `=` - -**Operator** +# EQL on Supabase and managed PostgreSQL -```sql -SELECT * FROM users WHERE encrypted_email = $1 -``` +EQL's `eql_v3` surface is designed to work on Supabase and other managed +PostgreSQL deployments where you cannot run as superuser, cannot install +custom operator classes, and cannot edit `postgresql.conf` per session. + +There is **no separate Supabase build of EQL**. The single installer +(`release/cipherstash-encrypt.sql`) is the same artefact you install +everywhere. This page explains *why* `eql_v3` runs on Supabase unchanged, +and the small number of things you do differently on a managed platform. + +## Why `eql_v3` works on Supabase + +Earlier EQL relied on PostgreSQL operator classes to make encrypted +comparisons engage indexes. Operator classes require elevated privileges +and Supabase [does not support custom operators](https://github.com/supabase/supautils/issues/72), +so that recipe needed a cut-down build. -**Function** +`eql_v3` removes the dependency entirely. Every encrypted column is typed as +a `jsonb`-backed **domain** in the `eql_v3` schema (for example +`eql_v3.text_eq`, `eql_v3.int4_ord`, `eql_v3.json`), and search is driven by +**functional indexes over small term-extractor functions** rather than an +operator class on the column: + +- `eql_v3.eq_term(col)` — the equality (`hm` / hmac_256) term. +- `eql_v3.ord_term(col)` — the ordering (`ob` / ore_block_256) term. +- `eql_v3.match_term(col)` — the text-containment (`bf` / bloom_filter) term. + +These extractors are inlinable (`LANGUAGE sql`, single `SELECT`, `IMMUTABLE`, +no pinned `search_path`), so the planner rewrites a bare-form predicate into +the same expression as the index and matches it structurally — no per-query +rewriting required. Creating a functional index needs no superuser and no +operator class, so the recipe is identical on Supabase, RDS, Cloud SQL, and a +self-hosted server: ```sql -SELECT * FROM users WHERE eql_v2.eq(encrypted_email, $1) +-- Equality (hash index on the eq_term extractor) +CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)); + +-- Ordering / range (btree index on the ord_term extractor) +CREATE INDEX events_at_ord ON events USING btree (eql_v3.ord_term(encrypted_at)); + +-- Text containment (GIN index on the match_term extractor) +CREATE INDEX users_name_match ON users USING gin (eql_v3.match_term(encrypted_name)); + +ANALYZE users; ``` -#### Like & ILIKE `~~, ~~*` +`eql_v3` deliberately ships **no** `encrypted_operator_class`, so there is +nothing operator-class-shaped to install and nothing that needs superuser. +See [Database Indexes for Encrypted Columns](./docs/reference/database-indexes.md) +for the full recipes, GIN containment, and large-table build guidance. + +## Typed columns, not database-side config + +`eql_v3` has **no database-side configuration API**. The earlier +`config_add_table` / `config_add_column` / `config_add_index` functions are +gone. The searchable surface of a column is fixed by the **domain variant you +type it as**, and which index terms travel in a value's payload is decided by +the encryption client — [CipherStash Proxy](https://github.com/cipherstash/proxy) +or [Protect.js](https://github.com/cipherstash/protectjs): + +- `eql_v3._eq` carries an `hm` term — supports `=` / `<>`, `GROUP BY`, `DISTINCT`. +- `eql_v3._ord` (and the `_ord_ore` twin) carries an `ob` term — adds `<` `<=` `>` `>=`, `ORDER BY`, `MIN` / `MAX`. +- `eql_v3.text_match` carries a `bf` term — supports bloom-filter token containment (`@>` / `<@`). +- `eql_v3.text_search` carries all three terms — equality, ordering, and containment on `text`. + +Configuring those columns is a client-side concern. See: + +- [CipherStash Proxy configuration tutorial](./docs/tutorials/proxy-configuration.md) +- [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md) + +## Operators on Supabase + +In `eql_v3`, each supported SQL operator is an alias for an EQL function, so +implementation and behaviour are identical whether you write the operator or +the function. The operator forms are inlinable and engage the functional +indexes above, so the operator form is the recommended one. The function +equivalents exist for environments or query builders where the bare operator +is awkward to express. + +| Operator | Function equivalent | Example | +| -------- | -------------------------------------------------- | ----------------------------------------------------------------- | +| `=` | `eql_v3.eq(col, $1)` | `SELECT * FROM users WHERE eql_v3.eq(encrypted_email, $1)` | +| `<>` | `eql_v3.neq(col, $1)` | `SELECT * FROM users WHERE eql_v3.neq(encrypted_email, $1)` | +| `<` | `eql_v3.lt(col, $1)` | `SELECT * FROM events WHERE eql_v3.lt(encrypted_at, $1)` | +| `<=` | `eql_v3.lte(col, $1)` | `SELECT * FROM events WHERE eql_v3.lte(encrypted_at, $1)` | +| `>` | `eql_v3.gt(col, $1)` | `SELECT * FROM events WHERE eql_v3.gt(encrypted_at, $1)` | +| `>=` | `eql_v3.gte(col, $1)` | `SELECT * FROM events WHERE eql_v3.gte(encrypted_at, $1)` | +| `@>` | `eql_v3.contains(col, $1)` | `SELECT * FROM users WHERE eql_v3.contains(encrypted_name, $1)` | +| `<@` | `eql_v3.contained_by(col, $1)` | `SELECT * FROM users WHERE eql_v3.contained_by(encrypted_name, $1)` | -**Operator** +`eql_v3.eq` / `neq` / `lt` / `lte` / `gt` / `gte` / `contains` / +`contained_by` are each overloaded for `(domain, domain)`, `(domain, jsonb)`, +and `(jsonb, domain)`, so a `jsonb` operand is accepted directly and resolved +against the typed side. + +### Equality `=` + +Operator form (recommended — engages the index): ```sql -SELECT * FROM users WHERE encrypted_email LIKE $1 +SELECT * FROM users WHERE encrypted_email = $1; ``` -**Function** +Function form (equivalent): ```sql -SELECT * FROM users WHERE eql_v2.like(encrypted_email, $1) +SELECT * FROM users WHERE eql_v3.eq(encrypted_email, $1); ``` -#### Case Sensitivity +### Range and ordering `<` `<=` `>` `>=` -The EQL `eql_v2.like` and `eql_v2.ilike` functions are equivalent. +The column must be typed as an `_ord` / `_ord_ore` variant (or +`text_search`) so it carries the `ob` term: -The behaviour of EQL's encrypted `LIKE` operators is slightly different to the behaviour of PostgreSQL's `LIKE` operator. -In EQL, the `LIKE` operator can be used on `match` indexes. -Case sensitivity is determined by the [index term configuration](./docs/reference/INDEX.md#options-for-match-indexes-opts) of `match` indexes. -A `match` index term can be configured to enable case sensitive searches with token filters (for example, `downcase` and `upcase`). -The data is encrypted based on the index term configurat ion. -The `LIKE` operation is always the same, even if the data is----- tokenised differently. -The different operators are kept to preserve the semantics of SQL statements in client applications. +```sql +SELECT * FROM events WHERE encrypted_at < $1; +SELECT * FROM events WHERE eql_v3.lt(encrypted_at, $1); +``` ### `ORDER BY` -Ordering requires wrapping the ordered column in the `eql_v2.order_by` function, like this: +Ordering uses the same ORE (`ob`) term as range comparisons, on an `_ord` / +`_ord_ore` (or `text_search`) column. The `<`/`>` operators inline in +*predicates*, but the planner does **not** rewrite *sort keys* — so to stream +rows out of the btree already ordered (no `Sort` node), write the sort key in +extractor form: ```sql -SELECT * FROM users ORDER BY eql_v2.order_by(encrypted_created_at) DESC; +SELECT * FROM events + WHERE encrypted_at < $1 + ORDER BY eql_v3.ord_term(encrypted_at) DESC + LIMIT 10; ``` -PostgreSQL uses operators when handling `ORDER BY` operations. The `eql_v2.order_by` function behaves in the same way as the comparison operators, using the appropriate index type (ore_block_u64_8_256, ore_cllw_u64_8, or ore_cllw_var_8) to determine the ordering. +This is the `eql_v3` replacement for the old `eql_v2.order_by(...)` helper, +which no longer exists. See the +[sort-key trap](./docs/reference/database-indexes.md#range-queries-and-order-by) +for the full explanation. -### JSONB Support +### Aggregates `MIN` / `MAX` -All comparison functions also support `jsonb` parameters through automatic type casting. This means you can use either `eql_v2_encrypted` or `jsonb` values in your queries: +`MIN` / `MAX` are exposed on the ordered variants as +`eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the +`_ord_ore` twin). Type the column as `_ord`, or cast at the call site: ```sql --- Using eql_v2_encrypted -SELECT * FROM users WHERE eql_v2.eq(encrypted_email, encrypted_value); - --- Using jsonb -SELECT * FROM users WHERE eql_v2.eq(encrypted_email, jsonb_value); +SELECT eql_v3.min(encrypted_at) FROM events; +SELECT eql_v3.max(encrypted_amount::eql_v3.int4_ord) FROM orders; ``` -The functions will automatically cast the `jsonb` value to `eql_v2_encrypted` before performing the comparison. +## Text matching (not `LIKE`) -### Array Operations +There is **no `LIKE` / `ILIKE` on encrypted text in `eql_v3`**. The old +`eql_v2.like` / `eql_v2.ilike` functions and the `~~` / `~~*` operators on +encrypted columns have been removed; `LIKE` / `ILIKE` are blocked on every +encrypted domain variant and raise an "operator not supported" exception. -EQL supports array operations on encrypted data: +Text search is now **bloom-filter token containment** via `@>` / `<@` on a +column typed `eql_v3.text_match` or `eql_v3.text_search`. This tests whether +the encrypted text contains the (encrypted) search terms — a probabilistic +ngram match, not a SQL pattern match: ```sql --- Get array length -SELECT eql_v2.jsonb_array_length(encrypted_array) FROM users; +-- Column typed eql_v3.text_match or eql_v3.text_search, +-- with: CREATE INDEX ... USING gin (eql_v3.match_term(encrypted_name)); +SELECT * FROM users WHERE encrypted_name @> $1; +SELECT * FROM users WHERE eql_v3.contains(encrypted_name, $1); +``` + +Case sensitivity and tokenisation are properties of how the value was +encrypted (token filters configured in the client), not of the SQL operator. +See the [SQL support matrix](./docs/reference/sql-support.md) for which +operator resolves on which variant. --- Get array elements -SELECT eql_v2.jsonb_array_elements(encrypted_array) FROM users; +## Encrypted JSON documents --- Get array element ciphertexts -SELECT eql_v2.jsonb_array_elements_text(encrypted_array) FROM users; +`eql_v3.json` is the structured-encryption (ste_vec) document domain. It +supports document containment (`@>` / `<@`), field access (`->` / `->>`), and +the `eql_v3.jsonb_path_*` helper functions, all without operator classes: + +```sql +-- Document containment (GIN-indexable on Supabase) +SELECT * FROM orders WHERE data_encrypted @> $1::eql_v3.ste_vec_query; + +-- Field access (selector is the deterministic selector hash, typed as text) +SELECT data_encrypted -> ''::text FROM orders; ``` -### JSON Path Operations +For containment indexing, build a GIN index over the query shape — see +[GIN Indexes for JSONB Containment](./docs/reference/database-indexes.md#gin-indexes-for-jsonb-containment). +Worked examples are in [EQL with JSON and JSONB](./docs/reference/json-support.md). + +## Typed operands matter -EQL supports JSON path operations on encrypted data: +For the encrypted operator (and therefore the functional index) to resolve, +the comparison operand must carry a known type — a typed parameter (`$1`, +which CipherStash Proxy supplies) or an explicit cast: ```sql --- Get encrypted value at path -SELECT encrypted_data->'$.field' FROM users; +-- ✓ resolves the encrypted operator → uses the index +WHERE encrypted_email = $1; +WHERE encrypted_email = $1::eql_v3.text_eq; --- Get ciphertext at path -SELECT encrypted_data->>'$.field' FROM users; +-- ✗ a bare jsonb literal falls through to native jsonb semantics +WHERE encrypted_email = '{"hm":"abc"}'::jsonb; ``` + +CipherStash Proxy rewrites bound parameters so the encrypted operator and any +functional indexes are selected automatically. When bypassing the Proxy, type +the parameter yourself. + +## See also + +- [Database Indexes for Encrypted Columns](./docs/reference/database-indexes.md) — functional-index and GIN recipes, plus large-table build guidance. +- [SQL support matrix](./docs/reference/sql-support.md) — which operators work against which domain variant. +- [EQL Functions Reference](./docs/reference/eql-functions.md) — complete function and operator API. +- [EQL with JSON and JSONB](./docs/reference/json-support.md) — `eql_v3.json` worked examples. +- [CipherStash Proxy configuration tutorial](./docs/tutorials/proxy-configuration.md) — setting up encrypted columns end to end. + +--- + +### Didn't find what you wanted? + +[Click here to let us know what was missing from our docs.](https://github.com/cipherstash/encrypt-query-language/issues/new?template=docs-feedback.yml&title=[Docs:]%20Feedback%20on%20SUPABASE.md) diff --git a/docs/reference/PAYLOAD.md b/docs/reference/PAYLOAD.md deleted file mode 100644 index d5e7f445c..000000000 --- a/docs/reference/PAYLOAD.md +++ /dev/null @@ -1,62 +0,0 @@ -# EQL payload data format - -Encrypted data is stored as `jsonb` with a specific schema: - -## Plaintext payload (client side) - -The plaintext json payload that is sent from the client to CipherStash Proxy in order to store and search encrypted data. - -```json -{ - "v": 2, - "k": "pt", - "p": "plaintext value", - "i": { - "t": "table_name", - "c": "column_name" - } -} -``` - -## Encrypted payload (database side) - -The encrypted json payload that is stored in the database. -CipherStash Proxy will handle the plaintext payload and create the encrypted payload. - -```json -{ - "v": 2, - "k": "ct", - "c": "ciphertext value", - "i": { - "t": "table_name", - "c": "column_name" - } -} -``` - -## Data format - -It should never be necessary to directly interact with the stored `jsonb`. -CipherStash Proxy handles the encoding, and EQL provides the functions. - -| Field | Name | Description | -| ----- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| s | Schema version | JSON Schema version of this json document. | -| v | Version | The configuration version that generated this stored value. | -| k | Kind | The kind of the data (plaintext/pt, ciphertext/ct, encrypting/et). | -| i.t | Table identifier | Name of the table containing encrypted column. | -| i.c | Column identifier | Name of the encrypted column. | -| p | Plaintext | Plaintext value sent by database client. Required if kind is plaintext/pt or encrypting/et. | -| q | For query | Specifies that the plaintext should be encrypted for a specific query operation. If `null`, source encryption and encryption for all indexes will be performed. Valid values are `"match"`, `"ore"`, `"unique"`, `"ste_vec"`, and `"ejson_path"`. | -| c | Ciphertext | Ciphertext value. Encrypted by Proxy. Required if kind is plaintext/pt or encrypting/et. | -| m | Match index | Ciphertext index value. Encrypted by Proxy. | -| o | ORE index | Ciphertext index value. Encrypted by Proxy. | -| u | Unique index | Ciphertext index value. Encrypted by Proxy. | -| sv | STE vector index | Ciphertext index value. Encrypted by Proxy. | - ---- - -### Didn't find what you wanted? - -[Click here to let us know what was missing from our docs.](https://github.com/cipherstash/encrypt-query-language/issues/new?template=docs-feedback.yml&title=[Docs:]%20Feedback%20on%20PAYLOAD.md) From 7ecd15dd0ea56d0aa3384a46a0e465bd7e068eb2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 11:34:11 +1000 Subject: [PATCH 353/599] docs(reference): align with v3 ground truth; repoint deleted PAYLOAD.md links - json-support: fix ste_vec ORE leaf term key ocv/ocf -> oc (matches src/v3/jsonb) - releasing-an-alpha: correct artifact model to the two real release artifacts (cipherstash-encrypt.sql is the self-contained eql_v3 surface) + docs bundle - sql-documentation-templates: drop dead @see add_search_config; AS [base_type] -> AS jsonb (no domain-over-domain footgun) - repoint inbound PAYLOAD.md links (docs index, eql-functions, proxy-configuration) to crates/eql-types (canonical wire types) + json-support.md - WHY: markdown spacing fix --- docs/README.md | 2 +- docs/concepts/WHY.md | 2 +- docs/development/releasing-an-alpha.md | 29 ++++++++++--------- .../sql-documentation-templates.md | 8 +++-- docs/reference/eql-functions.md | 2 +- docs/reference/json-support.md | 2 +- docs/tutorials/proxy-configuration.md | 4 +-- 7 files changed, 26 insertions(+), 23 deletions(-) diff --git a/docs/README.md b/docs/README.md index d68fbc2c9..c8c8dcb6f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,7 @@ This directory contains the documentation for the Encrypt Query Language (EQL). - [Writing fast queries against EQL columns](reference/query-performance.md) - Performance overview (points to Database Indexes) - [Adding a Scalar Encrypted-Domain Type](reference/adding-a-scalar-encrypted-domain-type.md) - How the `eql_v3.` domain families are generated - [EQL with JSON and JSONB](reference/json-support.md) -- [EQL payload data format](reference/PAYLOAD.md) +- [EQL payload / wire format](../crates/eql-types/README.md) - Canonical wire types for the encrypted payload (envelope `v`/`i`/`c` and the `hm`/`ob`/`bf` index terms) - [Client-side index configuration](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md) - Configuring searchable encryption in Protect.js / CipherStash Proxy ## Tutorials diff --git a/docs/concepts/WHY.md b/docs/concepts/WHY.md index 7df39fc53..12afcff56 100644 --- a/docs/concepts/WHY.md +++ b/docs/concepts/WHY.md @@ -72,7 +72,7 @@ EQL allows you to perform queries on encrypted data without decrypting it, suppo ## Best practices - **Use EQL functions** when interacting with encrypted data. -- **Define database constraints**to maintain data integrity. +- **Define database constraints** to maintain data integrity. - **Secure key management** of encryption keys. - **Monitor query performance** and optimize as needed. diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md index a8c860b04..ceb1703d6 100644 --- a/docs/development/releasing-an-alpha.md +++ b/docs/development/releasing-an-alpha.md @@ -11,12 +11,12 @@ builds with `mise run build --version ` and attaches these artifacts to the | Artifact | What it installs | |----------|------------------| -| `cipherstash-encrypt.sql` / `-uninstall.sql` | Full EQL (`eql_v2` + `eql_v3`) | -| `cipherstash-encrypt-supabase.sql` / `-uninstall-supabase.sql` | Supabase variant | -| `cipherstash-encrypt-v3.sql` / `-v3-uninstall.sql` | **Standalone, self-contained `eql_v3` surface** (no `eql_v2`) | +| `cipherstash-encrypt.sql` / `cipherstash-encrypt-uninstall.sql` | **The standalone, self-contained `eql_v3` surface** (no `eql_v2`) | +| `eql-docs-*.zip` / `eql-docs-*.tar.gz` | Packaged API documentation (from the `publish-docs` job) | -The `eql_v3` installer is the one an alpha consumer wants: it installs the `eql_v3` -schema into a database with no `eql_v2` present. +`cipherstash-encrypt.sql` is the only installer: it installs the `eql_v3` +schema into a database with no `eql_v2` present. (There is no longer a separate +`-supabase` or `-v3` artifact — the single installer *is* the self-contained v3 surface.) ## Why a prerelease is different @@ -50,7 +50,7 @@ mise run release:preview --dry-run # Override the base version / channel / exact tag / target: mise run release:preview --version 3.0.0 --channel beta # -> eql-3.0.0-beta.1 -mise run release:preview --tag eql-3.0.0-rc.1 --target v3-publish-release-artifacts +mise run release:preview --tag eql-3.0.0-rc.1 --target eql_v3 ``` | Flag | Meaning | Default | @@ -79,14 +79,14 @@ to **"Confirm the workflow attached the artifacts"** and the smoke test below. 3. **Verify the build produces the v3 artifacts locally** (the same files the workflow attaches): ```bash mise run clean && mise run build - ls -la release/cipherstash-encrypt-v3.sql release/cipherstash-encrypt-v3-uninstall.sql + ls -la release/cipherstash-encrypt.sql release/cipherstash-encrypt-uninstall.sql ``` - Both must be non-empty (the installer is ~750KB+; the uninstaller is small). + Both must be non-empty (the installer is ~900KB+; the uninstaller is small). 4. **Cut the prerelease.** Target the branch carrying the v3 surface and mark it `--prerelease`: ```bash gh release create eql-3.0.0-alpha.1 \ - --target v3-publish-release-artifacts \ + --target eql_v3 \ --prerelease \ --title "eql-3.0.0-alpha.1" \ --notes "Alpha of the standalone eql_v3 surface. See [Unreleased] in CHANGELOG.md." @@ -98,17 +98,18 @@ to **"Confirm the workflow attached the artifacts"** and the smoke test below. gh run watch gh release view eql-3.0.0-alpha.1 ``` - The release should list all six `.sql` artifacts, including - `cipherstash-encrypt-v3.sql` and `cipherstash-encrypt-v3-uninstall.sql`. + The release should list the two `.sql` artifacts (`cipherstash-encrypt.sql` + and `cipherstash-encrypt-uninstall.sql`) plus the packaged docs bundle. ## Smoke-test the alpha Install the standalone v3 surface into a clean database (no `eql_v2`) and confirm it loads: ```bash -gh release download eql-3.0.0-alpha.1 -p 'cipherstash-encrypt-v3.sql' -psql "$DATABASE_URL" -f cipherstash-encrypt-v3.sql -psql "$DATABASE_URL" -c "\dn eql_v3" # eql_v3 schema present +gh release download eql-3.0.0-alpha.1 -p 'cipherstash-encrypt.sql' +psql "$DATABASE_URL" -f cipherstash-encrypt.sql +psql "$DATABASE_URL" -c "\dn eql_v3" # eql_v3 schema present +psql "$DATABASE_URL" -c "SELECT eql_v3.version();" # reports the released semver ``` ## Promoting to a final release later diff --git a/docs/development/sql-documentation-templates.md b/docs/development/sql-documentation-templates.md index edb52f556..8e52a9d98 100644 --- a/docs/development/sql-documentation-templates.md +++ b/docs/development/sql-documentation-templates.md @@ -57,11 +57,13 @@ CREATE FUNCTION eql_v3."[operator]"(...) --! @brief [Type name] index term type --! --! Domain type representing [description of what this type represents]. ---! Used for [use case] via the '[index_name]' index type. +--! Used for [use case] during searchable-encryption queries (e.g. equality via +--! `eq_term`, ordering via `ord_term`). --! ---! @see eql_v3.add_search_config +--! @see eql_v3.eq_term --! @note This is a transient type used only during query execution -CREATE DOMAIN eql_v3.[type_name] AS [base_type]; +--! @note Encrypted-domain types are jsonb-backed — always `AS jsonb`, never domain-over-domain +CREATE DOMAIN eql_v3.[type_name] AS jsonb; ``` ## Template: Composite Type diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index 86202da5d..bdc288bff 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -157,7 +157,7 @@ SELECT eql_v3.min(price_jsonb::eql_v3.int4_ord) FROM products; - [Database Indexes](./database-indexes.md) — functional-index recipes and performance. - [JSON/JSONB Support](./json-support.md) — `eql_v3.json` worked examples. - [SQL support matrix](./sql-support.md) — operators by domain variant. -- [Payload Format](./PAYLOAD.md) — EQL data format specification. +- [Payload / wire format](../../crates/eql-types/README.md) — canonical encrypted-payload wire types (envelope + index terms). - Client-side index configuration — [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md). --- diff --git a/docs/reference/json-support.md b/docs/reference/json-support.md index 960282062..2570d641f 100644 --- a/docs/reference/json-support.md +++ b/docs/reference/json-support.md @@ -183,7 +183,7 @@ The native `jsonb` operators `?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-` Structured Encryption (ste_vec) makes a JSONB document searchable by: 1. **Flattening the structure** — each unique path to a leaf gets a deterministic selector hash. -2. **Encrypting terms** — each path and value is encrypted into per-path terms (`hm` for equality; `ocv` / `ocf` CLLW ORE for ordered String / Number leaves). +2. **Encrypting terms** — each path and value is encrypted into per-path terms (`hm` for equality; `oc` CLLW ORE for ordered String / Number leaves). 3. **Storing the `sv` array** — all encrypted terms live in the document's `sv` vector. **Example document:** diff --git a/docs/tutorials/proxy-configuration.md b/docs/tutorials/proxy-configuration.md index 8351b2f33..e0599c103 100644 --- a/docs/tutorials/proxy-configuration.md +++ b/docs/tutorials/proxy-configuration.md @@ -62,7 +62,7 @@ ANALYZE users; ## 4. Insert and read through the Proxy -Run writes and reads through CipherStash Proxy. On insert, the Proxy encrypts the plaintext into the EQL payload (envelope `v`/`i`/`c` plus the configured index terms — see the [payload format](../reference/PAYLOAD.md)); on read, it decrypts automatically. +Run writes and reads through CipherStash Proxy. On insert, the Proxy encrypts the plaintext into the EQL payload (envelope `v`/`i`/`c` plus the configured index terms — see the [payload / wire format](../../crates/eql-types/README.md)); on read, it decrypts automatically. ```sql -- Through the Proxy: the plaintext is encrypted on the way in @@ -114,7 +114,7 @@ SELECT encrypted_profile -> 'email_selector'::text FROM users; **Which operators are available on which column?** See the [SQL support matrix](../reference/sql-support.md). -**Where is the data format documented?** See the [payload format](../reference/PAYLOAD.md). +**Where is the data format documented?** See the [payload / wire format](../../crates/eql-types/README.md) for the scalar envelope and index terms, and [EQL with JSON and JSONB](../reference/json-support.md) for the `eql_v3.json` document format. ## Troubleshooting From 349f1c1ff0279a17fc86cdae0f64439452c45cb3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 12:22:42 +1000 Subject: [PATCH 354/599] docs(v3): finish v2 cleanup; add CI guard against eql_v2 in user-facing docs Correct the remaining "eql_v2 coexists / is the unchanged public API" framing to match reality: eql_v2 was removed in 3.0.0 and eql_v3 is the sole shipped surface. - DEVELOPMENT.md: replace the coexistence "Schemas" section with an accurate "The eql_v3 surface" section (v2 removed, fork-provenance/historical mentions flagged as deliberate); fix TOC anchor. - CLAUDE.md: fix the Schema bullet and Versioning paragraph that still asserted eql_v2 coexists/unchanged. - SUPABASE.md: reword the two remaining v2 callouts to teach the v3 way with no v2 references (a separate v2->v3 migration guide can come later). - docs/development/reference-sync-rules.md: update stale eql_v2 examples to verified v3 symbols (eql_v3.ciphertext, eql_v3.eq_term). Remove obsolete/invented artifacts and dead v2 fixtures: - delete docs/decisions/0001-remove-eql-v2.md and docs/plans/add-doxygen-sql-comments-plan.md; strip the 3 dangling ADR links from CHANGELOG (entries already explain the why inline). - delete tests/ORE_FIXTURES.md (documented the removed v2 proxy fixture flow; v3 ORE coverage is subsumed by catalog-generated scalar fixtures) and the orphaned tests/ore.sql / tests/ore_text.sql data files (loaded by nothing). Guard: refactor tasks/test/docs_v3_grep.sh from a hand-maintained allowlist to scan-all-with-exclusions over git-tracked docs (new reference/tutorial/concept pages covered automatically; untracked scratch ignored), and wire it into the docs-static CI job (runs on every PR, already in ci-required). --- .github/workflows/test-eql.yml | 4 + CHANGELOG.md | 9 +- CLAUDE.md | 26 +- DEVELOPMENT.md | 38 +- SUPABASE.md | 9 +- docs/decisions/0001-remove-eql-v2.md | 89 - docs/development/reference-sync-rules.md | 12 +- docs/plans/add-doxygen-sql-comments-plan.md | 2323 ------------------- tasks/test/docs_v3_grep.sh | 68 +- tests/ORE_FIXTURES.md | 71 - tests/ore.sql | 1008 -------- tests/ore_text.sql | 109 - 12 files changed, 94 insertions(+), 3672 deletions(-) delete mode 100644 docs/decisions/0001-remove-eql-v2.md delete mode 100644 docs/plans/add-doxygen-sql-comments-plan.md delete mode 100644 tests/ORE_FIXTURES.md delete mode 100644 tests/ore.sql delete mode 100644 tests/ore_text.sql diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index caa25e1bb..dc9eab8c0 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -489,6 +489,10 @@ jobs: run: | mise run docs:validate:source + - name: Assert user-facing docs are free of the removed eql_v2 surface + run: | + mise run test:docs_v3_grep + # The e2e (fresh-encryption) property suite. Encrypts random values through # ZeroKMS at run time, so it needs CS_* creds and is PG-version-independent — # one PG17 run, never the matrix. Compiles the `proptest-e2e`-gated binaries diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cda33bb0..f3b267fd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added -- **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed. See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). -- **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) +- **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed.- **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) - **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.ste_vec_entry` (a single sv element) and `eql_v3.ste_vec_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) @@ -45,12 +44,10 @@ Each entry that ships in a published release links to the PR that introduced it. - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) -- **The self-contained `eql_v3` installer is now the sole release artifact, shipped under the canonical name `release/cipherstash-encrypt.sql` (+ `cipherstash-encrypt-uninstall.sql`).** The combined, Supabase, and Protect build variants are removed; `mise run build` now produces only the `eql_v3` surface, written under the canonical name that the combined build previously used — so existing install URLs keep working. Why: with `eql_v2` removed (see below), there is a single SQL surface to build, install, and test. See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). - +- **The self-contained `eql_v3` installer is now the sole release artifact, shipped under the canonical name `release/cipherstash-encrypt.sql` (+ `cipherstash-encrypt-uninstall.sql`).** The combined, Supabase, and Protect build variants are removed; `mise run build` now produces only the `eql_v3` surface, written under the canonical name that the combined build previously used — so existing install URLs keep working. Why: with `eql_v2` removed (see below), there is a single SQL surface to build, install, and test. ### Removed -- **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). See [ADR-0001](docs/decisions/0001-remove-eql-v2.md). - +- **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). ### Fixed - **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.int4_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) diff --git a/CLAUDE.md b/CLAUDE.md index e97e3f66f..732239b8b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -34,27 +34,18 @@ This project uses `mise` for task management. Common commands: ### Build System - Dependencies are resolved using `-- REQUIRE:` comments in SQL files -- Build outputs to `release/` directory: - - `cipherstash-encrypt.sql` - Main installer - - `cipherstash-encrypt-supabase.sql` - Supabase-compatible (excludes operator classes) - - `cipherstash-encrypt-protect.sql` - ProtectJS variant (excludes config management) - - `cipherstash-encrypt-v3.sql` - Standalone, self-contained `eql_v3` surface only (globbed from `src/v3` alone; no `eql_v2`, installable into a DB with no `eql_v2` present) - - Corresponding uninstallers for each variant - -#### Build Variants -| Variant | Excludes | Use Case | -|---------|----------|----------| -| Main | Nothing | Full EQL with all features | -| Supabase | Operator classes | Supabase compatibility | -| Protect | `src/config/*`, `src/encryptindex/*` | ProtectJS (no database-side config) | -| v3-only | Everything outside `src/v3` (and `pin_search_path.sql`) | Self-contained `eql_v3` surface, `eql_v2`-free (gated by `mise run test:self_contained_v3`) | +- Build outputs to `release/` directory (a single installer + uninstaller, assembled from `src/v3` alone): + - `cipherstash-encrypt.sql` - The sole installer: the self-contained `eql_v3` surface, globbed from `src/v3` only (no `eql_v2`; installable into a DB with no `eql_v2` present) + - `cipherstash-encrypt-uninstall.sql` - Matching uninstaller + +There are no longer separate Main / Supabase / Protect / v3-only build variants. The combined `eql_v2` build that previously produced multiple artefacts has been removed; the v3 surface now ships as one self-contained installer under the canonical `cipherstash-encrypt.sql` name (`tasks/build.sh` globs `src/v3` only). Because the surface owns no `eql_v2` dependency, it is already Supabase / managed-Postgres compatible (functional indexes over extractors, no superuser-only operator classes) without a dedicated subset build. Self-containment — no `-- REQUIRE:` edge pointing outside `src/v3`, no `eql_v2.` anywhere in the surface — is enforced at build time by `verify_v3_self_contained` in `tasks/build.sh` and CI-gated by `mise run test:self_contained_v3`. ## Project Architecture This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for searchable encryption. Key architectural components: ### Core Structure -- **Schema**: Core EQL functions/types are in the `eql_v2` PostgreSQL schema. The encrypted-domain type families (`int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, `float8`) live in a separate `eql_v3` schema (see below). The `eql_v3` surface is **self-contained**: it owns its own copies of the searchable-encrypted-metadata (SEM) index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, hand-written under `src/v3/sem/`) and has no runtime dependency on `eql_v2`. `eql_v2` is unchanged and remains the documented public API. +- **Schema**: EQL ships a single PostgreSQL schema, `eql_v3`, which holds the encrypted-domain type families (`int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, `float8`). The `eql_v3` surface is **self-contained**: it owns its own copies of the searchable-encrypted-metadata (SEM) index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.bloom_filter`, hand-written under `src/v3/sem/`) and installs into a database with no other EQL schema present. The earlier `eql_v2` schema (composite `eql_v2_encrypted` column type, database-side configuration management, operator-class-on-column indexing) was **removed in 3.0.0** — see the `[Unreleased]`/3.0.0 entry in `CHANGELOG.md`. `eql_v2` is no longer built or shipped; it survives only in fork-provenance comments under `src/v3/` (the v3 SEM types were forked from the old v2 originals) and in historical records (`CHANGELOG.md`, the v2.x upgrade guides). - **Main Type**: `eql_v2_encrypted` - composite type for encrypted columns (stored as JSONB) - **Configuration**: `eql_v2_configuration` table tracks encryption configs - **Index Types**: Various encrypted index types (blake3, hmac_256, bloom_filter, ore variants) @@ -79,7 +70,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, and `float8`, all following this materializer pattern. `jsonb` is the only catalog scalar with no generated SQL surface yet — it needs a separate SQL design beyond the ordered-scalar materializer, and the `eql-scalars` fixture catalog (`crates/eql-scalars`) models its fixture values ahead of that surface. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, and `float8`, all following this materializer pattern. `jsonb` is the only catalog scalar with no generated SQL surface yet — it needs a separate SQL design beyond the ordered-scalar materializer, and the `eql-scalars` fixture catalog (`crates/eql-scalars`) models its fixture values ahead of that surface. Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` is out of scope for this scalar materializer. @@ -214,7 +205,6 @@ HTML output is also generated in `docs/api/html/` for local preview only. - SQL files are modular - put operator wrappers in `operators.sql`, implementation in `functions.sql` - All SQL files must have `-- REQUIRE:` dependency declarations - Build system uses `tsort` to resolve dependency order -- Supabase build excludes operator classes (not supported) - **Documentation**: All functions/types must have Doxygen comments (see Documentation Standards above) ### Function Language Choice (SQL vs PL/pgSQL) @@ -281,7 +271,7 @@ The entry under `Changed` / `Deprecated` should cross-link to the `U-NNN`. See ` ### Versioning -The `eql_v2` PostgreSQL schema name is part of the public API and is **independent of the EQL release version**. Major-version bumps to EQL do not rename the schema. The `eql_v3` schema is **not** a rename of `eql_v2`: it is a separate, additional schema introduced to namespace the encrypted-domain type families. Both schemas coexist; `eql_v2` keeps the core types/operators and is unchanged. Adding a new schema for a new surface is additive, not a public-API break. When deciding on a version bump: +The `eql_v3` PostgreSQL schema name is part of the public API and is **independent of the EQL release version**: major-version bumps to EQL do not rename the schema. `eql_v3` is **not** a rename of `eql_v2` — it is a distinct surface (the encrypted-domain scalar type families). The earlier `eql_v2` schema was removed in 3.0.0 (a major, public-API-breaking change); it is no longer shipped, and `eql_v3` is the sole surface going forward. When deciding on a version bump: - **Patch (`2.3.x`)** — bug fixes, no behaviour changes - **Minor (`2.x.0`)** — additive changes, behaviour changes that don't break the public API (signatures, schema name, payload format, operator names) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 1e5280ed3..832ccf2d3 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -3,7 +3,7 @@ ## Table of Contents - [How this project is organised](#how-this-project-is-organised) - - [Schemas: `eql_v2` and `eql_v3`](#schemas-eql_v2-and-eql_v3) + - [The `eql_v3` surface](#the-eql_v3-surface) - [Repository layout](#repository-layout) - [Set up a local development environment](#set-up-a-local-development-environment) - [Installing mise](#installing-mise) @@ -36,23 +36,25 @@ mise has tasks for: part of `build`) - Validating and generating documentation (`docs:validate`, `docs:generate`) -### Schemas: `eql_v2` and `eql_v3` - -EQL installs into two PostgreSQL schemas, both of which coexist: - -- **`eql_v2`** — the unchanged core public API: the core encrypted types, - functions, and operators. The `eql_v2` schema name is part of the public API - and is independent of the EQL release version. -- **`eql_v3`** — an additional, self-contained schema that namespaces the - encrypted-domain **scalar type families** (`int4`, `int2`, `int8`, `date`, - `timestamptz`, `numeric`, `text`, `bool`, `float4`, `float8`). It owns its - own copies of the searchable-encrypted-metadata (SEM) index-term types it - needs (`eql_v3.hmac_256`, `eql_v3.ore_block_256`), so it has no runtime - dependency on `eql_v2`. - -The current install script is built from the `eql_v3` surface. Adding a new -schema for a new surface is additive — it is not a rename of `eql_v2` and not a -public-API break. +### The `eql_v3` surface + +EQL installs a single, self-contained PostgreSQL schema, **`eql_v3`**, which +namespaces the encrypted-domain **scalar type families** (`int4`, `int2`, +`int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, `float8`). +It owns its own copies of the searchable-encrypted-metadata (SEM) index-term +types it needs (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.bloom_filter`), +so the surface has no dependency on any other EQL schema and installs into a +database with nothing else present. + +> **About `eql_v2`.** Earlier EQL releases shipped an `eql_v2` schema — a +> composite encrypted column type, database-side configuration management, and +> operator-class-on-column indexing. That surface was **removed in 3.0.0**; the +> repo now builds and ships only `eql_v3`, and the encryption client +> (CipherStash Proxy / Protect.js) owns the configuration model the database-side +> `eql_v2` functions previously provided. You will still see `eql_v2` named in +> fork-provenance comments under `src/v3/` (the v3 SEM types were forked from the +> old v2 originals) and in historical records (`CHANGELOG.md`, the v2.x upgrade +> guides) — those mentions are deliberate and do not mean `eql_v2` is installed. ### Repository layout diff --git a/SUPABASE.md b/SUPABASE.md index e04b23300..bca6a15b8 100644 --- a/SUPABASE.md +++ b/SUPABASE.md @@ -134,8 +134,8 @@ SELECT * FROM events LIMIT 10; ``` -This is the `eql_v3` replacement for the old `eql_v2.order_by(...)` helper, -which no longer exists. See the +Writing the sort key as `eql_v3.ord_term(col)` is the way to order encrypted +rows directly out of the btree. See the [sort-key trap](./docs/reference/database-indexes.md#range-queries-and-order-by) for the full explanation. @@ -152,9 +152,8 @@ SELECT eql_v3.max(encrypted_amount::eql_v3.int4_ord) FROM orders; ## Text matching (not `LIKE`) -There is **no `LIKE` / `ILIKE` on encrypted text in `eql_v3`**. The old -`eql_v2.like` / `eql_v2.ilike` functions and the `~~` / `~~*` operators on -encrypted columns have been removed; `LIKE` / `ILIKE` are blocked on every +There is **no SQL `LIKE` / `ILIKE` pattern matching on encrypted text in +`eql_v3`**. The `LIKE` / `ILIKE` operators (`~~` / `~~*`) are blocked on every encrypted domain variant and raise an "operator not supported" exception. Text search is now **bloom-filter token containment** via `@>` / `<@` on a diff --git a/docs/decisions/0001-remove-eql-v2.md b/docs/decisions/0001-remove-eql-v2.md deleted file mode 100644 index 9882b13c2..000000000 --- a/docs/decisions/0001-remove-eql-v2.md +++ /dev/null @@ -1,89 +0,0 @@ -# 1. Remove `eql_v2`, ship only the self-contained `eql_v3` surface - -Date: 2026-06-22 - -## Status - -Accepted - -## Context - -EQL historically shipped a single `eql_v2` PostgreSQL schema: the -`eql_v2_encrypted` composite column type, its operator surface (`=`, `<>`, -`~~`/`~~*` `LIKE`/`ILIKE`, containment, ORE comparisons), database-side -configuration management (`eql_v2_configuration`, `add_search_config`, -`add_column`, …), the `encryptindex` migration machinery, and the SteVec -encrypted-JSONB surface. `eql_v2` was the documented public API. - -The `eql_v3` schema was introduced as an additive, namespaced home for the -generated encrypted-domain type families (`eql_v3.int4`, `int8`, `date`, -`timestamptz`, `numeric`, `float4`/`float8`, `text`, `bool`) plus the -self-contained encrypted-JSONB document surface (`eql_v3.json`, SteVec). Over a -series of changes `eql_v3` became **fully self-contained**: it owns its own -copies of the searchable-encrypted-metadata (SEM) index-term types -(`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, -`eql_v3.bloom_filter`), has zero runtime dependency on `eql_v2`, and ships as a -standalone installer (`release/cipherstash-encrypt-v3.sql`) that installs into a -database with no `eql_v2` present. CI gates this self-containment -(`mise run test:self_contained_v3`). - -With `eql_v3` standing on its own, keeping `eql_v2` in the repository imposes -ongoing cost — two parallel SQL surfaces to build, test, document, and reason -about — for a surface we intend to supersede. The encryption client -(CipherStash Proxy / ProtectJS) now owns the configuration model that the -database-side `eql_v2` config functions previously provided, so the -database no longer needs to manage that state. - -## Decision - -Remove `eql_v2` entirely. EQL ships only the self-contained `eql_v3` -encrypted-domain surface. The collapsed build produces the canonical -`release/cipherstash-encrypt.sql` (+ uninstaller) from the `eql_v3` surface -alone, so existing install URLs keep working. - -The following `eql_v2`-only capabilities are **dropped with no `eql_v3` -replacement** in this change: - -- The `eql_v2_encrypted` composite column type and its operator surface. -- Database-side configuration management (`eql_v2_configuration`, - `add_search_config`, `add_column`, `migrate_config`, `diff_config`, - `create_encrypted_columns`). The encryption client owns config now. -- The `encryptindex` migration machinery. -- `LIKE` / `ILIKE` (`~~` / `~~*`) on the encrypted column type. (`eql_v3.text` - match is bloom-filter containment, not SQL `LIKE`.) -- Boolean operators on `eql_v2_encrypted`. -- Operator-class-on-column indexing. (`eql_v3` indexes via functional indexes - on the `eq_term` / `ord_term` / `match_term` extractors.) -- `GROUP BY` / `grouped_value` on the encrypted column type. - -The supported searchable-encryption capabilities (equality, ordered range, -`MIN`/`MAX`, encrypted-JSONB document containment and path access) are all -provided by the `eql_v3` surface. - -Version introspection is **re-homed, not dropped**: `eql_v2.version()` is -replaced by `eql_v3.version()` (bare-semver text, also published as the -`eql_v3` schema comment), baked in at build time the same way. - -## Consequences - -- **This is a major (3.0.0) break of the public API.** Callers using the - `eql_v2` schema must migrate to the `eql_v3` encrypted-domain types. Per the - project decision, **no per-capability upgrade/migration guide is written** for - the dropped capabilities — the dropped surface has no `eql_v3` equivalent, so - there is no mechanical migration to document. -- The canonical `release/cipherstash-encrypt.sql` artifact is now the `eql_v3` - surface. The `-supabase` and `-protect` build variants are removed (they - existed to subset the `eql_v2` surface). -- The repository ships a single SQL surface, a single build, and a single test - install path — reducing build/test/maintenance surface area. -- The EQL SQL linter is retained as `eql_v3.lints()` (ported from - `eql_v2.lints()`), scoped to the `eql_v3` schema, so the inlinability / - blocker / domain-shape quality gates survive. - -## Related - -- `CHANGELOG.md` `[Unreleased]` → `Removed` entry. -- Self-containment invariant and gate: `mise run test:self_contained_v3`. -- Deferred follow-up: the Tier-1 reference-doc rewrites (README, `docs/reference/*`) - that still describe the removed `eql_v2` surface are tracked in - `docs/superpowers/plans/2026-06-22-migrate-docs-to-eql-v3.md`, not in this PR. diff --git a/docs/development/reference-sync-rules.md b/docs/development/reference-sync-rules.md index 15bdf8821..90c070d25 100644 --- a/docs/development/reference-sync-rules.md +++ b/docs/development/reference-sync-rules.md @@ -38,9 +38,9 @@ During documentation, you will encounter discrepancies between: **Add to:** `docs/development/documentation-questions.md` **Format:** ``` -- [ ] DISCREPANCY: eql_v2.add_column behavior - SQL code: raises exception if column already encrypted - Reference docs: suggest idempotent behavior +- [ ] DISCREPANCY: eql_v3.eq_term behavior + SQL code: raises exception when the payload is missing its equality term + Reference docs: suggest it returns NULL for incomplete payloads Question: Is SQL correct or does it need fixing? For review by: Principal Engineer ``` @@ -55,16 +55,16 @@ During documentation, you will encounter discrepancies between: **Example:** ```sql --! @brief Extract ciphertext from encrypted value ---! @param encrypted JSONB Raw encrypted value +--! @param val JSONB Raw encrypted value --! @return Text Extracted ciphertext --! @note Issue #XXX: Returns null for malformed input instead of raising error -CREATE FUNCTION eql_v2.ciphertext(encrypted jsonb) ... +CREATE FUNCTION eql_v3.ciphertext(val jsonb) ... ``` **Add to:** `docs/development/documentation-blockers.md` **Format:** ``` -- [ ] BUG FOUND: eql_v2.ciphertext +- [ ] BUG FOUND: eql_v3.ciphertext Issue: Returns null for malformed input instead of raising error GitHub Issue: #XXX Action: Documented actual behavior, flagged for fix diff --git a/docs/plans/add-doxygen-sql-comments-plan.md b/docs/plans/add-doxygen-sql-comments-plan.md deleted file mode 100644 index 560e78b25..000000000 --- a/docs/plans/add-doxygen-sql-comments-plan.md +++ /dev/null @@ -1,2323 +0,0 @@ -# Implementation Plan: Add Doxygen-Style Comments to All SQL Implementation Files - -**Status:** Ready for Execution -**Created:** 2025-10-24 -**Branch:** `add-doxygen-sql-comments` -**Worktree:** `/Users/tobyhede/src/encrypt-query-language/.worktrees/sql-documentation` - -## Context & Objectives - -**Goal:** Add comprehensive Doxygen-style comments to all SQL implementation files in the EQL codebase to enable automated documentation generation. - -**Scope:** -- 53 SQL implementation files across 13 modules -- Excludes test files (*_test.sql) -- Aligns with docs/reference/ content (SQL source is source of truth) -- Uses Doxygen annotations per RFC: `sql-documentation-generation-rfc.md` - -**Success Criteria:** -1. Every database object (function, type, operator, aggregate, constraint) has Doxygen comments -2. Comments include mandatory tags: `@brief`, `@param`, `@return` -3. Comments include encouraged tags where applicable: `@example`, `@throws`, `@internal` -4. Reference documentation can be verified against source comments -5. All annotations follow Doxygen syntax (`--!` prefix) - -**Related Documents:** -- [SQL Documentation Generation RFC](./sql-documentation-generation-rfc.md) -- [EQL Functions Reference](../reference/eql-functions.md) - ---- - -## Estimation Summary - -| Phase | Tasks | Estimated Hours | -|-------|-------|----------------| -| Phase 0: Pre-flight Checks | 1 | 0.25 | -| Phase 1: Setup & Validation | 5 | 1-2 | -| Phase 2: Core Modules | 7 | 10-15 | -| Phase 3: Index Modules (PARALLEL) | 6 | 6-8 | -| Phase 4: Supporting Modules (PARALLEL) | 6 | 4-5 | -| Phase 5: Quality Assurance | 5 | 3-4 | -| Phase 6: Documentation & Handoff | 6 | 2-3 | -| **TOTAL** | **36** | **26-39 hours** | - -**Note:** Phases 3 and 4 can be executed in parallel using subagent-driven-development. See execution strategy below. - ---- - -## Execution Strategy - -### PR Strategy -Create small, reviewable PRs: -- **PR 1:** Phase 0 + Phase 1 (Setup & validation tooling) -- **PR 2:** Phase 2.1-2.2 (config module) -- **PR 3:** Phase 2.3-2.4 (encrypted module) -- **PR 4:** Phase 2.5-2.6 (operators module) -- **PR 5:** Phase 3 (all index modules - can use subagents) -- **PR 6:** Phase 4 (all supporting modules - can use subagents) -- **PR 7:** Phase 5 + Phase 6 (QA, documentation, CI integration) - -### Subagent Usage -**When to use subagent-driven-development skill:** -- Phase 3: Dispatch 6 parallel subagents (one per index module) -- Phase 4: Dispatch 6 parallel subagents (one per supporting module group) - -**Subagent task template:** -``` -Task: Document [module_name] with Doxygen comments - -Context: -- Working in: /Users/tobyhede/src/encrypt-query-language/.worktrees/sql-documentation -- Branch: add-doxygen-sql-comments -- Templates: docs/development/sql-documentation-templates.md -- Standards: docs/development/sql-documentation-standards.md - -Files to document: [list files] - -CRITICAL: DO NOT modify SQL code implementation. Only add Doxygen comments. -SQL code is source of truth - document what the code does, not what you think it should do. - -Deliverables: -1. Add @brief, @param, @return tags to all database objects -2. Validate syntax: psql -f [file] --set ON_ERROR_STOP=1 -3. Verify required tags: grep -c "@brief" [file] -4. Report completion with file list and object count -``` - ---- - -## Phase 0: Pre-flight Checks (0.25 hours) - -### Task 0.1: Verify Environment and Create Backup - -**CRITICAL PRINCIPLE: DO NOT MODIFY SQL CODE** -This plan only adds documentation comments. The SQL implementation is the source of truth. -If you find bugs, unclear behavior, or discrepancies with reference docs: -- Document what the code ACTUALLY does (not what it should do) -- Note issues separately for later review -- DO NOT fix bugs or change behavior - -**Pre-flight checklist:** -```bash -# 1. Verify location and branch -cd /Users/tobyhede/src/encrypt-query-language/.worktrees/sql-documentation -pwd # Must be in sql-documentation worktree -git branch --show-current # Must be: add-doxygen-sql-comments - -# 2. Verify clean state -git status # Should show no uncommitted changes - -# 3. Create backup branch -git branch backup/pre-documentation-$(date +%Y%m%d) -echo "Backup branch created: backup/pre-documentation-$(date +%Y%m%d)" - -# 4. Verify database is running -mise run postgres:up -psql postgres://cipherstash:password@localhost:7432 -c "SELECT version();" - -# 5. Check disk space (need ~500KB for comment additions) -df -h . | tail -1 - -# 6. Verify all SQL files are accessible -echo "Counting SQL implementation files (excluding tests):" -find src -name "*.sql" -not -name "*_test.sql" | wc -l # Should be 53 - -# 7. Test one file syntax validation -psql postgres://cipherstash:password@localhost:7432 \ - -f src/version.sql --set ON_ERROR_STOP=1 -q - -echo "✅ Pre-flight checks complete" -``` - -**Verification:** -```bash -# All commands above should succeed -# Database should be running on localhost:7432 -# Backup branch should exist: git branch --list 'backup/*' -``` - -**If any check fails:** -- Database not running → `mise run postgres:up` -- Wrong directory → Navigate to correct worktree -- Wrong branch → `git checkout add-doxygen-sql-comments` -- Uncommitted changes → Commit or stash first -- Syntax errors in existing SQL → Note as blocker, investigate before proceeding - ---- - -## Phase 1: Setup & Validation (1-2 hours) - -### Task 1.1: Create Documentation Standards Document -**File:** `docs/development/sql-documentation-standards.md` - -**Content:** -```markdown -# SQL Documentation Standards - -## Required Doxygen Tags - -### Mandatory -- `@brief` - One sentence description -- `@param` - For each parameter (with type and description) -- `@return` - Return value description (include structure for JSONB) - -### Encouraged -- `@example` - Usage examples (SQL code blocks) -- `@throws` - Exception conditions (when RAISE is used) -- `@internal` - Mark private functions (prefix with `_`) - -### Optional -- `@see` - Cross-references -- `@note` - Additional warnings/notes -- `@deprecated` - Migration path for deprecated functions - -## Format Examples - -### Public Function -\`\`\`sql ---! @brief Initialize a column for encryption/decryption ---! ---! This function configures the CipherStash Proxy to encrypt/decrypt ---! data in the specified column. Must be called before adding search indexes. ---! ---! @param table_name Text name of table containing the column ---! @param column_name Text name of column to encrypt ---! @param cast_as Text PostgreSQL type to cast decrypted value (default: 'text') ---! @param migrating Boolean whether this is migration operation (default: false) ---! @return JSONB Configuration object with encryption settings ---! @throws Exception if table or column does not exist ---! ---! @example ---! SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); ---! ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.add_column( - table_name text, - column_name text, - cast_as text DEFAULT 'text', - migrating boolean DEFAULT false -) RETURNS jsonb -AS $$ ... $$; -\`\`\` - -### Private Function -\`\`\`sql ---! @brief Internal helper for encryption validation ---! @internal ---! @param config JSONB Configuration object to validate ---! @return Boolean True if configuration is valid -CREATE FUNCTION eql_v2._validate_config(config jsonb) - RETURNS boolean -AS $$ ... $$; -\`\`\` - -### Operator -\`\`\`sql ---! @brief Equality comparison for encrypted values ---! ---! Implements the = operator for encrypted column comparisons. ---! Uses encrypted index terms for comparison without decryption. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if values are equal via encrypted comparison ---! ---! @example ---! -- Using operator syntax: ---! SELECT * FROM users WHERE encrypted_email = encrypted_value; ---! ---! @see eql_v2.compare -CREATE FUNCTION eql_v2."="(a eql_v2_encrypted, b eql_v2_encrypted) - RETURNS boolean -AS $$ ... $$; - -CREATE OPERATOR = ( - FUNCTION=eql_v2."=", - LEFTARG=eql_v2_encrypted, - RIGHTARG=eql_v2_encrypted -); -\`\`\` - -### Type -\`\`\`sql ---! @brief Composite type for encrypted column data ---! ---! This is the core type used for all encrypted columns. Data is stored ---! as JSONB with the following structure: ---! - `c`: ciphertext (encrypted value) ---! - `i`: index terms (searchable metadata) ---! - `k`: key ID ---! - `m`: metadata ---! ---! @see eql_v2.ciphertext ---! @see eql_v2.meta_data -CREATE TYPE eql_v2_encrypted AS ( - data jsonb -); -\`\`\` - -### Aggregate -\`\`\`sql ---! @brief State transition function for grouped_value aggregate ---! @internal ---! @param $1 JSONB Accumulated state ---! @param $2 JSONB New value ---! @return JSONB Updated state -CREATE FUNCTION eql_v2._first_grouped_value(jsonb, jsonb) - RETURNS jsonb -AS $$ ... $$; - ---! @brief Return first non-null value in a group ---! ---! Aggregate function that returns the first non-null encrypted value ---! encountered in a GROUP BY clause. ---! ---! @param input JSONB Encrypted values to aggregate ---! @return JSONB First non-null value in group ---! ---! @example ---! -- Get first email per user group ---! SELECT user_id, eql_v2.grouped_value(encrypted_email) ---! FROM user_emails ---! GROUP BY user_id; ---! ---! @see eql_v2._first_grouped_value -CREATE AGGREGATE eql_v2.grouped_value(jsonb) ( - SFUNC = eql_v2._first_grouped_value, - STYPE = jsonb -); -\`\`\` -``` - -**Verification:** -```bash -cat docs/development/sql-documentation-standards.md | grep -E "@brief|@param|@return" -``` - ---- - -### Task 1.2: Create Template Files for Each Object Type -**File:** `docs/development/sql-documentation-templates.md` - -**Content:** -```markdown -# SQL Documentation Templates - -## Template: Public Function - -\`\`\`sql ---! @brief [One sentence description] ---! ---! [Detailed description paragraph explaining purpose, ---! behavior, and any important context] ---! ---! @param param_name [Type] [Description] ---! @param param_name [Type] [Description with default: DEFAULT value] ---! @return [Return type] [Description of return value structure] ---! @throws [Condition that triggers exception] ---! ---! @example ---! -- [Example description] ---! SELECT eql_v2.function_name('value1', 'value2'); ---! ---! @see eql_v2.related_function -CREATE FUNCTION eql_v2.function_name(...) -\`\`\` - -## Template: Private/Internal Function - -\`\`\`sql ---! @brief [One sentence description] ---! @internal ---! @param param_name [Type] [Description] ---! @return [Return type] [Description] -CREATE FUNCTION eql_v2._internal_function(...) -\`\`\` - -## Template: Operator Implementation - -\`\`\`sql ---! @brief [Operator symbol] operator for encrypted values ---! ---! Implements the [operator] operator using [index type] for ---! [operation description] without decryption. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean [Result description] ---! ---! @example ---! -- [Specific example showing operator usage] ---! SELECT * FROM table WHERE encrypted_col [operator] value; ---! ---! @see eql_v2.[related_function] -CREATE FUNCTION eql_v2."[operator]"(...) -\`\`\` - -## Template: Domain Type - -\`\`\`sql ---! @brief [Type name] index term type ---! ---! Domain type representing [description of what this type represents]. ---! Used for [use case] via the '[index_name]' index type. ---! ---! @see eql_v2.add_search_config ---! @note This is a transient type used only during query execution -CREATE DOMAIN eql_v2.[type_name] AS [base_type]; -\`\`\` - -## Template: Composite Type - -\`\`\`sql ---! @brief [Brief description of composite type] ---! ---! [Detailed description including structure/fields] ---! ---! @see [related functions] -CREATE TYPE eql_v2.[type_name] AS ( - field_name field_type -); -\`\`\` - -## Template: Aggregate Function - -\`\`\`sql ---! @brief [State function description] ---! @internal ---! @param $1 [State type] [State description] ---! @param $2 [Input type] [Input description] ---! @return [State type] [Updated state description] -CREATE FUNCTION eql_v2._state_function(...) - ---! @brief [Aggregate behavior description] ---! ---! [Detailed description of what aggregate computes] ---! ---! @param input [Input type] [Input description] ---! @return [Return type] [Return description] ---! ---! @example ---! -- [Example query using aggregate] ---! ---! @see eql_v2._state_function -CREATE AGGREGATE eql_v2.aggregate_name(...) (...) -\`\`\` - -## Template: Operator Class - -\`\`\`sql ---! @brief [Operator class purpose description] ---! ---! Defines the operator class required for creating [index type] indexes ---! on encrypted columns. Enables [capabilities description]. ---! ---! @example ---! -- Create index using this operator class: ---! CREATE INDEX ON table USING [index_method] (column [opclass_name]); ---! ---! @see CREATE OPERATOR CLASS in PostgreSQL documentation -CREATE OPERATOR CLASS [opclass_name] ... -\`\`\` - -## Template: Constraint Function - -\`\`\`sql ---! @brief [Constraint check description] ---! ---! [What the constraint validates] ---! ---! @param value [Type] [Value being checked] ---! @return Boolean True if constraint satisfied ---! @throws Exception if [constraint violation condition] -CREATE FUNCTION eql_v2.[constraint_function](...) -\`\`\` -``` - -**Verification:** -```bash -grep -A 20 "Template: Public Function" docs/development/sql-documentation-templates.md -``` - ---- - -### Task 1.3: Inventory All Database Objects -**File:** `docs/development/documentation-inventory.md` - -**Generate inventory with:** -```bash -cd /Users/tobyhede/src/encrypt-query-language/.worktrees/sql-documentation - -# Count objects by type -echo "# SQL Documentation Inventory" > docs/development/documentation-inventory.md -echo "" >> docs/development/documentation-inventory.md -echo "Generated: $(date)" >> docs/development/documentation-inventory.md -echo "" >> docs/development/documentation-inventory.md - -for file in $(find src -name "*.sql" -not -name "*_test.sql" | sort); do - echo "## $file" >> docs/development/documentation-inventory.md - echo "" >> docs/development/documentation-inventory.md - grep -E "^CREATE (FUNCTION|OPERATOR|TYPE|DOMAIN|AGGREGATE|OPERATOR CLASS)" "$file" | \ - sed 's/^/- /' >> docs/development/documentation-inventory.md - echo "" >> docs/development/documentation-inventory.md -done - -# Add summary -echo "## Summary" >> docs/development/documentation-inventory.md -echo "" >> docs/development/documentation-inventory.md -echo "- Total files: $(find src -name "*.sql" -not -name "*_test.sql" | wc -l)" >> docs/development/documentation-inventory.md -echo "- Total CREATE statements: $(find src -name "*.sql" -not -name "*_test.sql" -exec grep -h "^CREATE" {} \; | wc -l)" >> docs/development/documentation-inventory.md -``` - -**Verification:** -```bash -wc -l docs/development/documentation-inventory.md -file_count=$(find src -name "*.sql" -not -name "*_test.sql" | wc -l | xargs) -echo "Found $file_count SQL implementation files" -``` - ---- - -### Task 1.4: Create Cross-Reference Sync Rules -**File:** `docs/development/reference-sync-rules.md` - -**Content:** -```markdown -# Reference Documentation Sync Rules - -## CRITICAL PRINCIPLE -**SQL code implementation is the source of truth.** - -During documentation, you will encounter discrepancies between: -- SQL code behavior -- Existing SQL comments (if any) -- Reference documentation in `docs/reference/` - -**NEVER modify SQL code to match documentation.** -**ALWAYS document what the code actually does.** - -## Decision Tree for Discrepancies - -### Scenario 1: SQL code is more detailed/accurate than reference docs -**Action:** -- Document the SQL code behavior accurately -- Mark reference doc for update in tracking file -- Continue with documentation - -**Add to:** `docs/development/reference-sync-notes.md` -**Format:** -``` -- [ ] docs/reference/eql-functions.md:add_column - SQL implementation has additional parameter validation not documented - SQL shows: validates table exists before adding config - Docs show: minimal description -``` - -### Scenario 2: Reference docs describe different behavior than SQL implements -**Action:** -- Document what the SQL code ACTUALLY does -- Flag discrepancy for principal engineer review -- DO NOT change SQL code -- DO NOT invent behavior to match docs - -**Add to:** `docs/development/documentation-questions.md` -**Format:** -``` -- [ ] DISCREPANCY: eql_v2.add_column behavior - SQL code: raises exception if column already encrypted - Reference docs: suggest idempotent behavior - Question: Is SQL correct or does it need fixing? - For review by: Principal Engineer -``` - -### Scenario 3: SQL code appears to have a bug -**Action:** -- Document the actual behavior (including the bug) -- Create GitHub issue for bug investigation -- Add `@note` tag mentioning the issue number -- DO NOT fix the bug in this plan - -**Example:** -```sql ---! @brief Extract ciphertext from encrypted value ---! @param encrypted JSONB Raw encrypted value ---! @return Text Extracted ciphertext ---! @note Issue #XXX: Returns null for malformed input instead of raising error -CREATE FUNCTION eql_v2.ciphertext(encrypted jsonb) ... -``` - -**Add to:** `docs/development/documentation-blockers.md` -**Format:** -``` -- [ ] BUG FOUND: eql_v2.ciphertext - Issue: Returns null for malformed input instead of raising error - GitHub Issue: #XXX - Action: Documented actual behavior, flagged for fix - Blocking documentation: No (documented as-is) -``` - -### Scenario 4: Unclear what code does (complex logic) -**Action:** -- Study the test files in `src/**/*_test.sql` -- Examine test cases to understand intended behavior -- Document based on test coverage -- If still unclear, read the code carefully and document what you observe -- Flag for principal engineer review if high-impact function - -**Add to:** `docs/development/documentation-questions.md` - -### Scenario 5: Reference docs conflict with each other -**Action:** -- SQL code is tiebreaker -- Document what code does -- Note conflicting docs in sync notes - -## Review Process - -**Principal Engineer + Team Code Review** will handle: -- Discrepancies flagged in `documentation-questions.md` -- Bugs flagged in `documentation-blockers.md` -- Reference doc updates listed in `reference-sync-notes.md` - -**Timeline:** -- Flag issues during documentation (Phases 1-4) -- Review session after Phase 5 (QA) -- Address critical issues before final PR -- Schedule reference doc updates as follow-up work - -## Tracking Files - -Create these files in `docs/development/`: - -**reference-sync-notes.md** - Reference docs needing updates -**documentation-questions.md** - Discrepancies needing review -**documentation-blockers.md** - Bugs found during documentation - -Initialize with: -```bash -cat > docs/development/reference-sync-notes.md <<'EOF' -# Reference Documentation Sync Notes - -Items to update in docs/reference/ after documentation complete: - -## Format -- [ ] docs/reference/file.md:section - Issue: [what needs updating] - SQL shows: [actual behavior] - Docs show: [current docs content] - ---- - -EOF - -cat > docs/development/documentation-questions.md <<'EOF' -# Documentation Questions for Review - -Discrepancies requiring principal engineer + team review: - -## Format -- [ ] DISCREPANCY: function_name - SQL code: [what code does] - Reference docs: [what docs say] - Question: [specific question] - For review by: Principal Engineer - ---- - -EOF - -cat > docs/development/documentation-blockers.md <<'EOF' -# Documentation Blockers - -Bugs found during documentation process: - -## Format -- [ ] BUG FOUND: function_name - Issue: [description] - GitHub Issue: #XXX (if created) - Action: [what was done] - Blocking documentation: Yes/No - ---- - -EOF -``` - -**Verification:** -```bash -ls -la docs/development/reference-sync-rules.md -ls -la docs/development/reference-sync-notes.md -ls -la docs/development/documentation-questions.md -ls -la docs/development/documentation-blockers.md -``` - ---- - -### Task 1.5: Commit Phase 1 Setup -**Action:** -```bash -# Verify setup complete -ls -la docs/development/sql-documentation-standards.md -ls -la docs/development/sql-documentation-templates.md -ls -la docs/development/documentation-inventory.md -ls -la docs/development/reference-sync-rules.md - -# Add all setup files -git add docs/development/ - -# Commit -git commit -m "docs(sql): add documentation standards, templates, and tooling (Phase 1) - -Setup for SQL Doxygen documentation project: -- Documentation standards with required tags -- Templates for all SQL object types -- Inventory of 53 SQL files to document -- Cross-reference sync rules (SQL is source of truth) -- Tracking files for discrepancies and issues - -Part of: add-doxygen-sql-comments plan -PR: Phase 0 + Phase 1 (Setup) -" - -# Verify commit -git log -1 --stat -``` - -**Verification:** -```bash -git log -1 --oneline | grep "docs(sql)" -git status # Should be clean -``` - ---- - -## Phase 2: Core Module Documentation (10-15 hours) - -Document high-value, customer-facing modules first. - -### Task 2.1: Document `src/config/functions.sql` -**Objects:** `add_column`, `add_search_config`, `remove_column`, `remove_search_config`, `modify_search_config` - -**Source file:** `src/config/functions.sql` - -**Reference docs:** `docs/reference/eql-functions.md` (Configuration Functions section) - -**Approach:** -1. Read current reference documentation for each function -2. Read test files (`src/config/*_test.sql`) for usage examples -3. Add Doxygen comments to each function using template -4. Verify SQL syntax still valid: `psql -f src/config/functions.sql --set ON_ERROR_STOP=1` - -**For each function:** -```sql ---! @brief [Extract from docs/reference/eql-functions.md] ---! ---! [Detailed explanation from reference docs] ---! ---! @param table_name Text name of the table containing the column ---! @param column_name Text name of the column to configure ---! @param cast_as Text PostgreSQL type for decrypted value (default: 'text') ---! @param migrating Boolean migration operation flag (default: false) ---! @return JSONB Configuration object with encryption settings ---! @throws Exception if table or column does not exist ---! ---! @example ---! -- [Extract example from reference docs or tests] ---! SELECT eql_v2.add_column('users', 'encrypted_email', 'text'); ---! ---! @see eql_v2.add_search_config -CREATE FUNCTION eql_v2.add_column(...) -``` - -**Verification:** -```bash -# Syntax check -psql postgres://cipherstash:password@localhost:7432 \ - -f src/config/functions.sql \ - --set ON_ERROR_STOP=1 - -# Comment coverage check -grep -c "^--! @brief" src/config/functions.sql # Should match function count -``` - ---- - -### Task 2.2: Document `src/config/functions_private.sql` -**Objects:** Private/internal configuration functions (prefix with `_`) - -**Approach:** -- Mark all functions with `@internal` tag -- Brief descriptions only (internal use) -- No examples required (internal API) - -**Template:** -```sql ---! @brief [Brief internal description] ---! @internal ---! @param ... ---! @return ... -CREATE FUNCTION eql_v2._internal_function(...) -``` - -**Verification:** -```bash -grep -c "@internal" src/config/functions_private.sql # Should match function count -``` - ---- - -### Task 2.3: Document `src/encrypted/functions.sql` -**Objects:** Core encrypted column functions (`ciphertext`, `meta_data`, `grouped_value`, `add_encrypted_constraint`, etc.) - -**Reference:** `docs/reference/eql-functions.md` (Helper Functions section) - -**Special considerations:** -- `grouped_value` is an AGGREGATE (document both state function and aggregate) -- Functions with multiple overloads (e.g., `ciphertext(jsonb)` vs `ciphertext(eql_v2_encrypted)`) - -**For aggregates:** -```sql ---! @brief State transition function for grouped_value aggregate ---! @internal ---! @param $1 JSONB Accumulated state ---! @param $2 JSONB New value ---! @return JSONB Updated state -CREATE FUNCTION eql_v2._first_grouped_value(jsonb, jsonb) ... - ---! @brief Return first non-null value in a group ---! ---! Aggregate function that returns the first non-null encrypted value ---! encountered in a GROUP BY clause. ---! ---! @param input JSONB Encrypted values to aggregate ---! @return JSONB First non-null value in group ---! ---! @example ---! -- Get first email per user group ---! SELECT user_id, eql_v2.grouped_value(encrypted_email) ---! FROM user_emails ---! GROUP BY user_id; ---! ---! @see eql_v2._first_grouped_value -CREATE AGGREGATE eql_v2.grouped_value(jsonb) (...) -``` - -**Verification:** -```bash -grep -c "^--! @brief" src/encrypted/functions.sql -psql -f src/encrypted/functions.sql --set ON_ERROR_STOP=1 -``` - ---- - -### Task 2.4: Document `src/encrypted/types.sql` -**Objects:** `eql_v2_encrypted` composite type - -**Type documentation format:** -```sql ---! @brief Composite type for encrypted column data ---! ---! This is the core type used for all encrypted columns. Data is stored ---! as JSONB with the following structure: ---! - `c`: ciphertext (encrypted value) ---! - `i`: index terms (searchable metadata) ---! - `k`: key ID ---! - `m`: metadata ---! ---! @see eql_v2.ciphertext ---! @see eql_v2.meta_data -CREATE TYPE eql_v2_encrypted AS ( - data jsonb -); -``` - -**Verification:** -```bash -grep "@brief" src/encrypted/types.sql -``` - ---- - -### Task 2.5: Document `src/operators/=.sql` -**Objects:** Equality operator and supporting functions - -**Reference:** `docs/reference/eql-functions.md` (Operators section) - -**Operator documentation approach:** -Document the implementation function with operator usage in @example: - -```sql ---! @brief Equality comparison for encrypted values ---! ---! Implements the = operator for encrypted column comparisons. ---! Uses encrypted index terms for comparison without decryption. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean True if values are equal via encrypted comparison ---! ---! @example ---! -- Using operator syntax: ---! SELECT * FROM users WHERE encrypted_email = encrypted_value; ---! ---! -- Comparing encrypted column to JSONB literal: ---! SELECT * FROM users WHERE encrypted_email = '{"c":"...","i":{"unique":"..."}}'::jsonb; ---! ---! @see eql_v2.compare -CREATE FUNCTION eql_v2."="(a eql_v2_encrypted, b eql_v2_encrypted) ... - -CREATE OPERATOR = ( - FUNCTION=eql_v2."=", - ... -); -``` - -**Verification:** -```bash -grep -c "@example.*operator" src/operators/=.sql # Should be present -``` - ---- - -### Task 2.6: Document All Remaining Operators -**Files:** `~~.sql`, `<.sql`, `<=.sql`, `>.sql`, `>=.sql`, `<>.sql`, `@>.sql`, `<@.sql`, `->.sql`, `->>.sql` - -**Reference:** `docs/reference/eql-functions.md` (Operators section) - -**For each operator:** -1. Read reference docs for operator behavior -2. Check test files for examples -3. Document implementation function with operator example -4. Include index type used (bloom_filter for `~~`, ore for range operators, etc.) - -**Pattern:** -```sql ---! @brief [Operator name] operator for encrypted values ---! ---! Implements the [operator] operator using [index type] for ---! [operation description] without decryption. ---! ---! @param a eql_v2_encrypted Left operand ---! @param b eql_v2_encrypted Right operand ---! @return Boolean [Result description] ---! ---! @example ---! -- [Specific example from reference docs] ---! ---! @see eql_v2.[related_function] -CREATE FUNCTION eql_v2."[operator]"(...) ... -``` - -**Verification:** -```bash -for op in '~~' '<' '<=' '>' '>=' '<>' '@>' '<@' '->' '->>'; do - file="src/operators/${op}.sql" - if [ -f "$file" ]; then - grep -q "@brief" "$file" && echo "$file: OK" || echo "$file: MISSING" - fi -done -``` - ---- - -### Task 2.7: Commit Phase 2 Progress -**Action:** -```bash -# Run validation on completed modules -./tasks/validate-required-tags.sh 2>&1 | grep -E "(src/config|src/encrypted|src/operators)" - -# Count completed files -completed=$(find src/config src/encrypted src/operators -name "*.sql" -not -name "*_test.sql" | wc -l | xargs) -echo "Phase 2 complete: $completed files documented" - -# Add and commit -git add src/config/ src/encrypted/ src/operators/ - -git commit -m "docs(sql): add Doxygen comments to core modules (Phase 2) - -Documented core customer-facing modules: -- src/config/functions.sql: add_column, add_search_config, remove_column, etc. -- src/config/functions_private.sql: internal config helpers -- src/encrypted/functions.sql: ciphertext, meta_data, grouped_value, etc. -- src/encrypted/types.sql: eql_v2_encrypted composite type -- src/operators/=.sql: equality operator -- src/operators/~~.sql: LIKE/pattern match operator -- src/operators/<.sql, <=.sql, >.sql, >=.sql: range operators -- src/operators/<>.sql: not equal operator -- src/operators/@>.sql, <@.sql: containment operators -- src/operators/->.sql, ->>.sql: JSONB access operators - -All functions include @brief, @param, @return tags. -Customer-facing functions include @example tags. - -Coverage: $completed/53 files completed -Part of: add-doxygen-sql-comments plan -PR: Phase 2 (Core modules) -" - -# Verify commit -git log -1 --stat -``` - -**Verification:** -```bash -git log -1 --oneline | grep "Phase 2" -git diff main --stat | grep -E "(config|encrypted|operators)" -``` - -**Create PR for Phase 2:** -```bash -# Push branch -git push origin add-doxygen-sql-comments - -# Create PR (adjust based on actual PR structure - may split into 3 PRs) -gh pr create --title "docs(sql): Add Doxygen comments to core modules" \ - --body "## Summary -Documents core EQL modules with Doxygen-style comments: -- Configuration functions (add_column, add_search_config) -- Encrypted type and helper functions -- All operators (=, ~~, <, >, @>, <@, ->, etc.) - -## Coverage -- Files: $completed/53 -- All objects have @brief, @param, @return tags -- Customer-facing functions include @example tags - -## Testing -- [x] SQL syntax validated -- [x] Required tags present -- [x] No SQL code modified (comments only) - -## Related -- Plan: docs/plans/add-doxygen-sql-comments-plan.md -- RFC: docs/plans/sql-documentation-generation-rfc.md - -🤖 Generated with [Claude Code](https://claude.com/claude-code) - -Co-Authored-By: Claude " \ - --base main - -# Or split into smaller PRs: -# PR 2: config module only -# PR 3: encrypted module only -# PR 4: operators module only -``` - ---- - -## Phase 3: Index Implementation Modules (6-8 hours) - -**⚡ PARALLEL EXECUTION RECOMMENDED** - -This phase documents 6 independent index modules. Each module can be documented in parallel using the `superpowers:subagent-driven-development` skill. - -**Execution approach:** -```markdown -Use subagent-driven-development skill to dispatch 6 parallel subagents: -1. blake3 module → Subagent 1 -2. hmac_256 module → Subagent 2 -3. bloom_filter module → Subagent 3 -4. ore_block_u64_8_256 module → Subagent 4 -5. ore_cllw_u64_8 module → Subagent 5 -6. ore_cllw_var_8 + ste_vec modules → Subagent 6 - -Each subagent receives: -- Task description (document module with Doxygen comments) -- Template reference (docs/development/sql-documentation-templates.md) -- Standards reference (docs/development/sql-documentation-standards.md) -- Files to document -- CRITICAL: Do not modify SQL code, only add comments -``` - -### Task 3.1: Document `src/blake3/` -**Files:** `types.sql`, `functions.sql`, `compare.sql` - -**Objects:** -- `eql_v2.blake3` domain type -- Blake3 hash extraction functions -- Comparison functions - -**Reference:** `docs/reference/index-config.md`, `docs/reference/eql-functions.md` (Index Term Extraction) - -**For domain types:** -```sql ---! @brief Blake3 hash index term type ---! ---! Domain type representing Blake3 cryptographic hash values. ---! Used for exact-match encrypted searches via the 'unique' index type. ---! ---! @see eql_v2.add_search_config ---! @note This is a transient type used only during query execution -CREATE DOMAIN eql_v2.blake3 AS text; -``` - -**Verification:** -```bash -find src/blake3 -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; -``` - ---- - -### Task 3.2: Document `src/hmac_256/` -**Files:** `types.sql`, `functions.sql`, `compare.sql` - -**Objects:** -- `eql_v2.hmac_256` domain type -- HMAC-SHA256 extraction functions -- Comparison functions - -**Similar approach to blake3 documentation** - -**Verification:** -```bash -find src/hmac_256 -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; -``` - ---- - -### Task 3.3: Document `src/bloom_filter/` -**Files:** `types.sql`, `functions.sql` - -**Objects:** -- `eql_v2.bloom_filter` type -- Bloom filter term extraction -- Pattern matching functions - -**Reference:** `docs/reference/eql-functions.md` (match index, ~~ operator) - -**Verification:** -```bash -find src/bloom_filter -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; -``` - ---- - -### Task 3.4: Document `src/ore_block_u64_8_256/` -**Files:** `types.sql`, `functions.sql`, `compare.sql`, `casts.sql`, `operators.sql`, `operator_class.sql` - -**Objects:** -- ORE (Order-Revealing Encryption) types -- Range comparison functions -- Operator class for B-tree indexes - -**Reference:** `docs/reference/eql-functions.md` (ore index, range operators) - -**For operator classes:** -```sql ---! @brief B-tree operator class for ORE encrypted values ---! ---! Defines the operator class required for creating B-tree indexes ---! on encrypted columns using Order-Revealing Encryption (ORE). ---! Enables range queries (<, <=, =, >=, >) and ORDER BY on encrypted data. ---! ---! @example ---! -- Create index using this operator class: ---! CREATE INDEX ON events USING btree (encrypted_timestamp eql_v2_encrypted_ops); ---! ---! @see CREATE OPERATOR CLASS in PostgreSQL documentation -CREATE OPERATOR CLASS eql_v2_encrypted_ops ... -``` - -**Verification:** -```bash -find src/ore_block_u64_8_256 -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; -``` - ---- - -### Task 3.5: Document `src/ore_cllw_u64_8/` and `src/ore_cllw_var_8/` -**Files:** `types.sql`, `functions.sql`, `compare.sql` - -**Objects:** Alternative ORE implementations - -**Note:** These are variants of ORE scheme - ensure documentation explains differences - -**Verification:** -```bash -find src/ore_cllw_* -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; -``` - ---- - -### Task 3.6: Document `src/ste_vec/` -**Files:** `functions.sql` - -**Objects:** Structured Encryption for vectors (JSONB containment) - -**Reference:** `docs/reference/eql-functions.md` (ste_vec index, @> and <@ operators) - -**Verification:** -```bash -grep -c "@brief" src/ste_vec/functions.sql -``` - ---- - -### Task 3.7: Commit Phase 3 Progress -**Action:** -```bash -# Validate all index modules -find src/blake3 src/hmac_256 src/bloom_filter src/ore_* src/ste_vec \ - -name "*.sql" -not -name "*_test.sql" \ - -exec ./tasks/validate-required-tags.sh {} \; - -# Count completed files -completed=$(find src/blake3 src/hmac_256 src/bloom_filter src/ore_* src/ste_vec \ - -name "*.sql" -not -name "*_test.sql" | wc -l | xargs) -echo "Phase 3 complete: $completed index module files documented" - -# Add and commit -git add src/blake3/ src/hmac_256/ src/bloom_filter/ src/ore_*/ src/ste_vec/ - -git commit -m "docs(sql): add Doxygen comments to index modules (Phase 3) - -Documented all index implementation modules: -- src/blake3/: Blake3 hash index terms (unique index) -- src/hmac_256/: HMAC-SHA256 index terms -- src/bloom_filter/: Bloom filter for pattern matching (match index) -- src/ore_block_u64_8_256/: Order-Revealing Encryption (ore index) -- src/ore_cllw_u64_8/: ORE CLLW variant -- src/ore_cllw_var_8/: ORE CLLW variable-length variant -- src/ste_vec/: Structured encryption for vectors (ste_vec index) - -All domain types, functions, and operators documented. -Includes operator class documentation for B-tree indexes. - -Coverage: [X]/53 files completed -Part of: add-doxygen-sql-comments plan -PR: Phase 3 (Index modules) -" - -# Verify commit -git log -1 --stat -``` - -**Verification:** -```bash -git log -1 --oneline | grep "Phase 3" -git diff main --stat | grep -E "(blake3|hmac|bloom|ore|ste_vec)" -``` - ---- - -## Phase 4: Supporting Modules (4-5 hours) - -**⚡ PARALLEL EXECUTION RECOMMENDED** - -This phase documents supporting infrastructure modules. Can be parallelized using `superpowers:subagent-driven-development` skill. - -**Execution approach:** -```markdown -Use subagent-driven-development skill to dispatch 6 parallel subagents: -1. operators/compare.sql, order_by.sql, operator_class.sql → Subagent 1 -2. encrypted/aggregates.sql, casts.sql, compare.sql, constraints.sql → Subagent 2 -3. jsonb/functions.sql → Subagent 3 -4. config/types.sql, tables.sql, indexes.sql, constraints.sql → Subagent 4 -5. encryptindex/functions.sql → Subagent 5 -6. common.sql, crypto.sql, schema.sql, version.sql → Subagent 6 -``` - -### Task 4.1: Document `src/operators/compare.sql`, `src/operators/order_by.sql`, `src/operators/operator_class.sql` -**Objects:** Core comparison and ordering infrastructure - -**These are foundational - reference from other operator docs** - -**Verification:** -```bash -grep -l "@brief" src/operators/{compare,order_by,operator_class}.sql -``` - ---- - -### Task 4.2: Document `src/encrypted/aggregates.sql`, `src/encrypted/casts.sql`, `src/encrypted/compare.sql`, `src/encrypted/constraints.sql` -**Objects:** Supporting functions for encrypted type - -**Verification:** -```bash -find src/encrypted -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; -``` - ---- - -### Task 4.3: Document `src/jsonb/functions.sql` -**Objects:** JSONB path extraction functions - -**Reference:** `docs/reference/json-support.md` - -**Verification:** -```bash -grep -c "@brief" src/jsonb/functions.sql -``` - ---- - -### Task 4.4: Document `src/config/types.sql`, `src/config/tables.sql`, `src/config/indexes.sql`, `src/config/constraints.sql` -**Objects:** Configuration schema components - -**Verification:** -```bash -find src/config -name "*.sql" -not -name "*_test.sql" -not -name "functions*.sql" -exec grep -l "@brief" {} \; -``` - ---- - -### Task 4.5: Document `src/encryptindex/functions.sql` -**Objects:** Index management functions - -**Verification:** -```bash -grep -c "@brief" src/encryptindex/functions.sql -``` - ---- - -### Task 4.6: Document `src/common.sql`, `src/crypto.sql`, `src/schema.sql`, `src/version.sql` -**Objects:** Utility functions, schema creation, versioning - -**Verification:** -```bash -for file in src/common.sql src/crypto.sql src/schema.sql src/version.sql; do - if grep -q "CREATE" "$file"; then - if grep -q "@brief" "$file"; then - echo "$file: OK" - else - echo "$file: MISSING" - fi - fi -done -``` - ---- - -### Task 4.7: Commit Phase 4 Progress -**Action:** -```bash -# Validate all supporting modules -find src/operators src/encrypted src/jsonb src/config src/encryptindex \ - -name "*.sql" -not -name "*_test.sql" -not -name "functions.sql" \ - -exec bash -c 'grep -q "@brief" "$1" 2>/dev/null || echo "Missing: $1"' _ {} \; - -# Also validate root-level files -for file in src/common.sql src/crypto.sql src/schema.sql src/version.sql; do - grep -q "@brief" "$file" 2>/dev/null || echo "Missing: $file" -done - -# Count completed files -total_now=$(find src -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; | wc -l | xargs) -echo "Phase 4 complete: All 53 files should now be documented" -echo "Current documented count: $total_now/53" - -# Add and commit -git add src/operators/ src/encrypted/ src/jsonb/ src/config/ src/encryptindex/ -git add src/common.sql src/crypto.sql src/schema.sql src/version.sql - -git commit -m "docs(sql): add Doxygen comments to supporting modules (Phase 4) - -Documented all supporting infrastructure: -- src/operators/: compare, order_by, operator_class (core infrastructure) -- src/encrypted/: aggregates, casts, compare, constraints -- src/jsonb/: JSONB path extraction functions -- src/config/: types, tables, indexes, constraints (schema) -- src/encryptindex/: index management functions -- src/common.sql: utility functions -- src/crypto.sql: cryptographic helpers -- src/schema.sql: schema creation -- src/version.sql: version tracking - -All infrastructure components documented. - -Coverage: $total_now/53 files completed -Part of: add-doxygen-sql-comments plan -PR: Phase 4 (Supporting modules) -" - -# Verify commit -git log -1 --stat -``` - -**Verification:** -```bash -git log -1 --oneline | grep "Phase 4" -# Verify all files documented -find src -name "*.sql" -not -name "*_test.sql" | wc -l # Should be 53 -find src -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; | wc -l # Should be 53 -``` - ---- - -## Phase 5: Quality Assurance (3-4 hours) - -### Task 5.1: Cross-Reference with docs/reference/ -**Files to check against:** -- `docs/reference/eql-functions.md` -- `docs/reference/index-config.md` -- `docs/reference/json-support.md` -- `docs/reference/database-indexes.md` -- `docs/reference/PAYLOAD.md` - -**Process:** -1. For each section in reference docs, find corresponding SQL source -2. Verify comments match or improve upon reference docs -3. Note discrepancies (SQL is source of truth) -4. Create list of reference doc updates needed - -**Output file:** `docs/development/reference-sync-notes.md` - -**Verification:** -```bash -# Generate comparison report -echo "# Reference Documentation Sync Notes" > docs/development/reference-sync-notes.md -echo "" >> docs/development/reference-sync-notes.md -echo "Generated: $(date)" >> docs/development/reference-sync-notes.md -echo "" >> docs/development/reference-sync-notes.md -echo "## Functions in docs/reference/eql-functions.md vs SQL source" >> docs/development/reference-sync-notes.md -# ... add comparison logic -``` - ---- - -### Task 5.2: Validate All Files Have SQL Syntax -**Run against PostgreSQL:** - -**Create script:** `tasks/validate-documented-sql.sh` - -```bash -#!/bin/bash -# tasks/validate-documented-sql.sh - -set -e - -cd "$(dirname "$0")/.." - -PGHOST=localhost -PGPORT=7432 -PGUSER=cipherstash -PGPASSWORD=password -PGDATABASE=postgres - -echo "Validating SQL syntax for all documented files..." -echo "" - -errors=0 -validated=0 - -for file in $(find src -name "*.sql" -not -name "*_test.sql" | sort); do - echo -n "Validating $file... " - - # Capture both stdout and stderr - error_output=$(psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d "$PGDATABASE" \ - -f "$file" --set ON_ERROR_STOP=1 -q 2>&1) - exit_code=$? - - if [ $exit_code -eq 0 ]; then - echo "✓" - validated=$((validated + 1)) - else - echo "✗ SYNTAX ERROR" - echo " Error in: $file" - echo " Details:" - echo "$error_output" | tail -10 | sed 's/^/ /' - echo "" - errors=$((errors + 1)) - fi -done - -echo "" -echo "Validation complete:" -echo " Validated: $validated" -echo " Errors: $errors" - -if [ $errors -gt 0 ]; then - echo "" - echo "❌ Validation failed with $errors errors" - exit 1 -else - echo "" - echo "✅ All SQL files validated successfully" - exit 0 -fi -``` - -**Verification:** -```bash -chmod +x tasks/validate-documented-sql.sh -./tasks/validate-documented-sql.sh -``` - ---- - -### Task 5.3: Generate Coverage Report -**Check all objects have @brief:** - -**Create script:** `tasks/check-doc-coverage.sh` - -```bash -#!/bin/bash -# tasks/check-doc-coverage.sh - -set -e - -cd "$(dirname "$0")/.." - -output_file="docs/development/coverage-report.md" - -echo "# Documentation Coverage Report" > "$output_file" -echo "" >> "$output_file" -echo "Generated: $(date)" >> "$output_file" -echo "" >> "$output_file" - -total_objects=0 -documented_objects=0 -incomplete_files=() - -for file in $(find src -name "*.sql" -not -name "*_test.sql" | sort); do - # Count CREATE statements - creates=$(grep -c "^CREATE " "$file" 2>/dev/null || echo 0) - total_objects=$((total_objects + creates)) - - # Count @brief annotations - briefs=$(grep -c "^--! @brief" "$file" 2>/dev/null || echo 0) - documented_objects=$((documented_objects + briefs)) - - if [ "$creates" -gt 0 ]; then - if [ "$creates" -eq "$briefs" ]; then - status="✓ Complete" - else - status="✗ Incomplete ($briefs/$creates)" - incomplete_files+=("$file") - fi - echo "- $file: $status" >> "$output_file" - fi -done - -echo "" >> "$output_file" -echo "## Summary" >> "$output_file" -echo "" >> "$output_file" -echo "- Total objects: $total_objects" >> "$output_file" -echo "- Documented: $documented_objects" >> "$output_file" - -if [ $total_objects -gt 0 ]; then - coverage=$((documented_objects * 100 / total_objects)) - echo "- Coverage: ${coverage}%" >> "$output_file" -else - echo "- Coverage: N/A" >> "$output_file" - coverage=0 -fi - -if [ ${#incomplete_files[@]} -gt 0 ]; then - echo "" >> "$output_file" - echo "## Incomplete Files" >> "$output_file" - echo "" >> "$output_file" - for file in "${incomplete_files[@]}"; do - echo "- $file" >> "$output_file" - done -fi - -echo "" -cat "$output_file" -echo "" - -if [ $coverage -eq 100 ]; then - echo "✅ 100% documentation coverage achieved!" - exit 0 -else - echo "⚠️ Documentation coverage: ${coverage}%" - exit 1 -fi -``` - -**Verification:** -```bash -chmod +x tasks/check-doc-coverage.sh -./tasks/check-doc-coverage.sh -# Should show 100% coverage -``` - ---- - -### Task 5.4: Validate Required Tags Present -**Check mandatory tags:** - -**Create script:** `tasks/validate-required-tags.sh` - -```bash -#!/bin/bash -# tasks/validate-required-tags.sh - -set -e - -cd "$(dirname "$0")/.." - -echo "Validating required Doxygen tags..." -echo "" - -errors=0 -warnings=0 - -for file in $(find src -name "*.sql" -not -name "*_test.sql"); do - # For each CREATE FUNCTION, check tags - functions=$(grep -n "^CREATE FUNCTION" "$file" 2>/dev/null | cut -d: -f1 || echo "") - - for line_no in $functions; do - # Find comment block above function (search backwards max 50 lines) - start=$((line_no - 50)) - [ "$start" -lt 1 ] && start=1 - - comment_block=$(sed -n "${start},${line_no}p" "$file" | grep "^--!" | tail -20) - - function_sig=$(sed -n "${line_no}p" "$file") - function_name=$(echo "$function_sig" | grep -oP 'CREATE FUNCTION \K[^\(]+' | xargs) - - # Check for @brief - if ! echo "$comment_block" | grep -q "@brief"; then - echo "ERROR: $file:$line_no $function_name - Missing @brief" - errors=$((errors + 1)) - fi - - # Check for @param (if function has parameters) - if echo "$function_sig" | grep -q "(" && \ - ! echo "$function_sig" | grep -q "()"; then - if ! echo "$comment_block" | grep -q "@param"; then - echo "WARNING: $file:$line_no $function_name - Missing @param" - warnings=$((warnings + 1)) - fi - fi - - # Check for @return (if function returns something other than void) - if ! echo "$function_sig" | grep -qi "RETURNS void"; then - if ! echo "$comment_block" | grep -q "@return"; then - echo "ERROR: $file:$line_no $function_name - Missing @return" - errors=$((errors + 1)) - fi - fi - done -done - -echo "" -echo "Validation summary:" -echo " Errors: $errors" -echo " Warnings: $warnings" -echo "" - -if [ "$errors" -gt 0 ]; then - echo "❌ Validation failed with $errors errors" - exit 1 -else - echo "✅ All required tags present" - exit 0 -fi -``` - -**Verification:** -```bash -chmod +x tasks/validate-required-tags.sh -./tasks/validate-required-tags.sh -``` - ---- - -### Task 5.5: Test Doxygen Generation (Early Validation) -**Purpose:** Verify Doxygen can parse our comments before claiming completion - -**Install Doxygen:** -```bash -# macOS -brew install doxygen - -# Verify installation -doxygen --version -``` - -**Create minimal Doxyfile:** -```bash -cat > Doxyfile.test <<'EOF' -# Minimal Doxygen config for testing SQL documentation - -PROJECT_NAME = "EQL SQL Documentation Test" -OUTPUT_DIRECTORY = docs/doxygen-test -INPUT = src/ -FILE_PATTERNS = *.sql -RECURSIVE = YES -EXCLUDE_PATTERNS = *_test.sql - -# SQL-specific settings -EXTENSION_MAPPING = sql=C++ -OPTIMIZE_OUTPUT_JAVA = NO - -# Comment parsing -JAVADOC_AUTOBRIEF = YES -QT_AUTOBRIEF = NO - -# Generate HTML only (for testing) -GENERATE_HTML = YES -GENERATE_LATEX = NO -GENERATE_XML = NO - -# Warning settings (strict) -WARNINGS = YES -WARN_IF_UNDOCUMENTED = NO -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = YES - -# Quiet mode for cleaner output -QUIET = NO -EOF -``` - -**Run Doxygen:** -```bash -# Generate documentation -doxygen Doxyfile.test 2>&1 | tee doxygen-test.log - -# Check for errors -if grep -i "error" doxygen-test.log; then - echo "❌ Doxygen encountered errors - review doxygen-test.log" - exit 1 -fi - -# Check for warnings (excluding undocumented warnings) -if grep -i "warning" doxygen-test.log | grep -v "undocumented"; then - echo "⚠️ Doxygen has warnings - review doxygen-test.log" -fi - -# Verify HTML was generated -if [ -d "docs/doxygen-test/html" ]; then - echo "✅ Doxygen HTML generated successfully" - echo "View at: docs/doxygen-test/html/index.html" -else - echo "❌ Doxygen HTML generation failed" - exit 1 -fi -``` - -**Manual verification:** -```bash -# Open generated docs in browser -open docs/doxygen-test/html/index.html - -# Check a few specific functions are documented: -# - eql_v2.add_column -# - eql_v2.ciphertext -# - eql_v2.= operator -# - eql_v2_encrypted type -``` - -**Common Doxygen issues to look for:** -- Malformed @param tags (wrong parameter names) -- Missing @return tags for non-void functions -- Unclosed comment blocks -- Incorrect @brief syntax -- Special characters breaking parsing - -**If errors found:** -- Fix formatting issues in SQL files -- Re-run validation scripts -- Re-test with Doxygen -- DO NOT proceed to Phase 6 until Doxygen parses cleanly - -**Cleanup (after verification):** -```bash -# Keep test config but remove generated output -rm -rf docs/doxygen-test/ -# Keep Doxyfile.test for future reference -``` - -**Verification:** -```bash -# Should complete without errors -doxygen Doxyfile.test 2>&1 | grep -i error -echo "Exit code: $?" # Should be 1 (no matches found) -``` - ---- - -## Phase 6: Documentation & Handoff (2-3 hours) - -### Task 6.1: Update DEVELOPMENT.md -**Add section:** - -```markdown -## SQL Documentation - -All SQL implementation files use Doxygen-style comments for automated documentation generation. - -### Required Annotations - -- `@brief` - One sentence description (mandatory) -- `@param` - Parameter descriptions (mandatory for all parameters) -- `@return` - Return value description (mandatory) -- `@example` - Usage examples (encouraged) -- `@throws` - Exception conditions (encouraged) -- `@internal` - Mark private functions (for functions prefixed with `_`) - -### Templates - -See `docs/development/sql-documentation-templates.md` for templates. - -### Validation - -Check documentation coverage: -```bash -mise run check-doc-coverage -``` - -Validate required tags: -```bash -mise run validate-required-tags -``` - -Validate SQL syntax: -```bash -mise run validate-documented-sql -``` -``` - -**Verification:** -```bash -grep -A 10 "## SQL Documentation" DEVELOPMENT.md -``` - ---- - -### Task 6.2: Add mise Tasks -**File:** `mise.toml` - -Add tasks: -```toml -[tasks."check-doc-coverage"] -description = "Check SQL documentation coverage" -run = "./tasks/check-doc-coverage.sh" - -[tasks."validate-required-tags"] -description = "Validate required Doxygen tags present" -run = "./tasks/validate-required-tags.sh" - -[tasks."validate-documented-sql"] -description = "Validate SQL syntax of documented files" -run = "./tasks/validate-documented-sql.sh" -``` - -**Verification:** -```bash -mise tasks | grep doc -mise run check-doc-coverage -``` - ---- - -### Task 6.3: Create PR Checklist Template -**File:** `.github/pull_request_template.md` (or update existing) - -Add checklist item: -```markdown -## SQL Documentation - -- [ ] All new SQL functions have Doxygen comments (`@brief`, `@param`, `@return`) -- [ ] Examples added for customer-facing functions -- [ ] Private functions marked with `@internal` -- [ ] Documentation validated: `mise run validate-required-tags` -``` - -**Verification:** -```bash -cat .github/pull_request_template.md | grep -A 4 "SQL Documentation" -``` - ---- - -### Task 6.4: Create Final Summary Document -**File:** `docs/development/sql-documentation-completion-summary.md` - -**Content:** -```markdown -# SQL Documentation Completion Summary - -## Overview -All SQL implementation files across 13 modules have been documented with Doxygen-style comments. - -## Coverage -- Total database objects: [COUNT from coverage report] -- Documented objects: [COUNT from coverage report] -- Coverage: 100% - -## Files Modified -[Insert list from docs/development/documentation-inventory.md] - -## Validation Results -- ✅ SQL syntax validated (all files) -- ✅ Required tags present (all functions) -- ✅ Coverage report: 100% - -## Next Steps -1. Implement build-time doc generator (per RFC) -2. Configure Doxygen for HTML generation -3. Integrate into CI/CD pipeline -4. Publish generated reference docs - -## Reference -- RFC: docs/plans/sql-documentation-generation-rfc.md -- Templates: docs/development/sql-documentation-templates.md -- Standards: docs/development/sql-documentation-standards.md -- Plan: docs/plans/add-doxygen-sql-comments-plan.md -``` - -**Verification:** -```bash -cat docs/development/sql-documentation-completion-summary.md -``` - ---- - -### Task 6.5: Add CI Validation Workflow -**File:** `.github/workflows/validate-sql-docs.yml` (or add to existing workflow) - -**Content:** -```yaml -name: Validate SQL Documentation - -on: - pull_request: - paths: - - 'src/**/*.sql' - - 'tasks/validate-*.sh' - - 'tasks/check-doc-coverage.sh' - push: - branches: - - main - paths: - - 'src/**/*.sql' - -jobs: - validate-documentation: - name: Validate SQL Doxygen Comments - runs-on: ubuntu-latest - - services: - postgres: - image: postgres:15 - env: - POSTGRES_USER: cipherstash - POSTGRES_PASSWORD: password - POSTGRES_DB: postgres - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - - 5432:5432 - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up environment - run: | - chmod +x tasks/validate-documented-sql.sh - chmod +x tasks/validate-required-tags.sh - chmod +x tasks/check-doc-coverage.sh - - - name: Validate SQL syntax - env: - PGHOST: localhost - PGPORT: 5432 - PGUSER: cipherstash - PGPASSWORD: password - PGDATABASE: postgres - run: | - echo "Validating SQL syntax for all documented files..." - ./tasks/validate-documented-sql.sh - - - name: Validate required Doxygen tags - run: | - echo "Checking for required @brief, @param, @return tags..." - ./tasks/validate-required-tags.sh - - - name: Check documentation coverage - run: | - echo "Verifying documentation coverage..." - ./tasks/check-doc-coverage.sh - - - name: Report results - if: always() - run: | - echo "## SQL Documentation Validation Results" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - if [ -f docs/development/coverage-report.md ]; then - cat docs/development/coverage-report.md >> $GITHUB_STEP_SUMMARY - fi - - # Optional: Doxygen build test - test-doxygen-generation: - name: Test Doxygen Generation - runs-on: ubuntu-latest - needs: validate-documentation - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Doxygen - run: | - sudo apt-get update - sudo apt-get install -y doxygen - - - name: Test Doxygen generation - run: | - # Use test config - if [ -f Doxyfile.test ]; then - doxygen Doxyfile.test 2>&1 | tee doxygen-test.log - - # Check for errors - if grep -i "error" doxygen-test.log; then - echo "❌ Doxygen generation failed" - exit 1 - fi - - echo "✅ Doxygen generation successful" - else - echo "⚠️ No Doxyfile.test found - skipping Doxygen test" - fi -``` - -**Alternative: Add to existing CI workflow** -If you already have a CI workflow, add these jobs to it instead of creating a new file. - -**Verification:** -```bash -# Check workflow syntax -cat .github/workflows/validate-sql-docs.yml - -# Test locally (if using act) -act pull_request -j validate-documentation - -# Or push to test branch and verify on GitHub -git add .github/workflows/validate-sql-docs.yml -git commit -m "ci: add SQL documentation validation workflow" -git push origin add-doxygen-sql-comments -``` - -**Success criteria:** -- [ ] CI runs on SQL file changes -- [ ] Syntax validation passes -- [ ] Required tags validation passes -- [ ] Coverage check passes (100%) -- [ ] Doxygen generation succeeds (optional) - ---- - -### Task 6.6: Final Commit and Summary -**Action:** -```bash -# Run all QA checks one final time -echo "Running final validation suite..." -./tasks/validate-documented-sql.sh -./tasks/validate-required-tags.sh -./tasks/check-doc-coverage.sh - -# Verify 100% coverage -coverage=$(grep "Coverage:" docs/development/coverage-report.md | grep -oP '\d+') -if [ "$coverage" -ne 100 ]; then - echo "❌ Coverage is $coverage%, not 100%" - exit 1 -fi - -echo "✅ All validation checks passed" -echo "✅ 100% documentation coverage achieved" - -# Add final documentation and tooling -git add docs/development/ -git add DEVELOPMENT.md -git add mise.toml -git add .github/pull_request_template.md -git add .github/workflows/validate-sql-docs.yml -git add Doxyfile.test -git add tasks/ - -git commit -m "docs(sql): add QA tooling, CI integration, and completion summary (Phase 5+6) - -Quality assurance and handoff: -- Cross-reference validation with docs/reference/ -- Validation scripts with error reporting -- Coverage reporting (100% achieved) -- CI workflow for automated validation -- mise tasks for local validation -- PR template with SQL documentation checklist -- Doxygen test configuration -- Completion summary and next steps - -All 53 SQL implementation files now have comprehensive Doxygen comments. - -Coverage: 53/53 files (100%) -Part of: add-doxygen-sql-comments plan -PR: Phase 5 + Phase 6 (QA and handoff) -" - -# Verify final state -git log --oneline -10 -git status - -echo "" -echo "=========================================" -echo "SQL Documentation Project Complete!" -echo "=========================================" -echo "" -echo "Summary:" -find src -name "*.sql" -not -name "*_test.sql" | wc -l | xargs echo "- Total files:" -find src -name "*.sql" -not -name "*_test.sql" -exec grep -l "@brief" {} \; | wc -l | xargs echo "- Documented:" -echo "- Coverage: 100%" -echo "" -echo "Next steps:" -echo "1. Create PRs for each phase (see PR strategy)" -echo "2. Review tracking files:" -echo " - docs/development/reference-sync-notes.md" -echo " - docs/development/documentation-questions.md" -echo " - docs/development/documentation-blockers.md" -echo "3. Schedule follow-up for reference doc updates" -echo "4. Implement production Doxygen build process (per RFC)" -echo "" -``` - -**Verification:** -```bash -# All validation should pass -mise run check-doc-coverage -mise run validate-required-tags -mise run validate-documented-sql - -# Coverage should be 100% -grep "Coverage: 100%" docs/development/coverage-report.md -``` - ---- - -## Complete File Checklist (53 files) - -### src/blake3/ (3 files) -- [ ] `compare.sql` - Blake3 comparison functions -- [ ] `functions.sql` - Blake3 extraction functions -- [ ] `types.sql` - Blake3 domain type - -### src/bloom_filter/ (2 files) -- [ ] `functions.sql` - Bloom filter extraction -- [ ] `types.sql` - Bloom filter type - -### src/config/ (6 files) -- [ ] `constraints.sql` - Configuration constraints -- [ ] `functions.sql` - **HIGH PRIORITY** - Public config functions -- [ ] `functions_private.sql` - Private config functions -- [ ] `indexes.sql` - Configuration indexes -- [ ] `tables.sql` - Configuration tables -- [ ] `types.sql` - Configuration types - -### src/encrypted/ (6 files) -- [ ] `aggregates.sql` - Aggregate functions -- [ ] `casts.sql` - Type casts -- [ ] `compare.sql` - Comparison functions -- [ ] `constraints.sql` - Encrypted column constraints -- [ ] `functions.sql` - **HIGH PRIORITY** - Core encrypted functions -- [ ] `types.sql` - **HIGH PRIORITY** - eql_v2_encrypted type - -### src/encryptindex/ (1 file) -- [ ] `functions.sql` - Index management - -### src/hmac_256/ (3 files) -- [ ] `compare.sql` - HMAC comparison -- [ ] `functions.sql` - HMAC extraction -- [ ] `types.sql` - HMAC domain type - -### src/jsonb/ (1 file) -- [ ] `functions.sql` - JSONB path functions - -### src/operators/ (13 files) -- [ ] `->.sql` - JSONB field access operator -- [ ] `->>.sql` - JSONB text extraction operator -- [ ] `<.sql` - Less than operator -- [ ] `<=.sql` - Less than or equal operator -- [ ] `<>.sql` - Not equal operator -- [ ] `<@.sql` - Contained by operator -- [ ] `=.sql` - **HIGH PRIORITY** - Equality operator -- [ ] `>.sql` - Greater than operator -- [ ] `>=.sql` - Greater than or equal operator -- [ ] `@>.sql` - Contains operator -- [ ] `compare.sql` - Core comparison logic -- [ ] `operator_class.sql` - Operator class definition -- [ ] `order_by.sql` - Ordering functions -- [ ] `~~.sql` - **HIGH PRIORITY** - LIKE operator - -### src/ore_block_u64_8_256/ (6 files) -- [ ] `casts.sql` - ORE type casts -- [ ] `compare.sql` - ORE comparison -- [ ] `functions.sql` - ORE extraction -- [ ] `operator_class.sql` - ORE operator class -- [ ] `operators.sql` - ORE operators -- [ ] `types.sql` - ORE types - -### src/ore_cllw_u64_8/ (3 files) -- [ ] `compare.sql` - ORE CLLW comparison -- [ ] `functions.sql` - ORE CLLW extraction -- [ ] `types.sql` - ORE CLLW types - -### src/ore_cllw_var_8/ (3 files) -- [ ] `compare.sql` - ORE CLLW VAR comparison -- [ ] `functions.sql` - ORE CLLW VAR extraction -- [ ] `types.sql` - ORE CLLW VAR types - -### src/ste_vec/ (1 file) -- [ ] `functions.sql` - Structured encryption vectors - -### src/ root (5 files) -- [ ] `common.sql` - Common utilities -- [ ] `crypto.sql` - Cryptographic utilities -- [ ] `schema.sql` - Schema creation -- [ ] `version.sql` - Version tracking - ---- - -## Notes for Engineers - -**Context:** -- Working in git worktree at `/Users/tobyhede/src/encrypt-query-language/.worktrees/sql-documentation` -- Branch: `add-doxygen-sql-comments` -- Main repository: `/Users/tobyhede/src/encrypt-query-language/` -- PostgreSQL test database: `localhost:7432` (credentials: cipherstash/password) - -**File Paths:** -- All SQL source: `src/` -- Reference docs: `docs/reference/` -- Test files: `tests/` and `src/**/*_test.sql` - -**Testing:** -Each documentation task should be followed by syntax validation: -```bash -mise run postgres:up # Ensure database running -psql postgres://cipherstash:password@localhost:7432 -f src/path/to/file.sql --set ON_ERROR_STOP=1 -``` - -**Reference Priority:** -1. SQL source code (source of truth) -2. Test files (*_test.sql) for usage examples -3. docs/reference/*.md for descriptions -4. RFC (`docs/plans/sql-documentation-generation-rfc.md`) for format - -**Common Patterns:** - -Private functions (prefix `_`): -```sql ---! @brief [Brief description] ---! @internal ---! @param ... ---! @return ... -CREATE FUNCTION eql_v2._internal_function(...) -``` - -Functions with RAISE: -```sql ---! @brief [Description] ---! @param ... ---! @return ... ---! @throws Exception if [specific condition that raises] -CREATE FUNCTION eql_v2.some_function(...) -``` - -Functions with defaults: -```sql ---! @brief [Description] ---! @param table_name Text name of the table ---! @param cast_as Text type for casting (default: 'text') ---! @return ... -CREATE FUNCTION eql_v2.function_name(table_name text, cast_as text DEFAULT 'text') -``` - -JSONB return structures (be specific about structure): -```sql ---! @brief [Description] ---! @param ... ---! @return JSONB Configuration object with keys: 'table_name', 'column_name', 'cast_as', 'indexes' -CREATE FUNCTION eql_v2.get_config(...) -``` - -Overloaded functions (multiple signatures): -```sql ---! @brief Extract ciphertext from encrypted value ---! @overload JSONB input variant ---! @param encrypted JSONB Raw encrypted value from database ---! @return Text Extracted ciphertext string -CREATE FUNCTION eql_v2.ciphertext(encrypted jsonb) - RETURNS text ... - ---! @brief Extract ciphertext from encrypted type ---! @overload Typed input variant ---! @param encrypted eql_v2_encrypted Encrypted column value ---! @return Text Extracted ciphertext string -CREATE FUNCTION eql_v2.ciphertext(encrypted eql_v2_encrypted) - RETURNS text ... -``` - -Handling existing comments: -```sql --- WRONG: Don't leave old comments mixed with Doxygen --- This function does X ---! @brief This function does X -CREATE FUNCTION ... - --- CORRECT: Doxygen only, move old comments inside function body ---! @brief This function does X ---! @param ... ---! @return ... -CREATE FUNCTION eql_v2.some_function(...) AS $$ -BEGIN - -- TODO: Optimize this query (old comment moved here) - -- Note: This handles edge case Y (implementation note moved here) - ... -END; -$$; -``` - -Dynamic SQL and macros: -```sql ---! @brief Create encrypted column index dynamically ---! @param table_name Text Table name for index creation ---! @param column_name Text Column name for index creation ---! @return VOID ---! @note Uses EXECUTE for dynamic SQL - actual DDL constructed at runtime ---! @see eql_v2.add_search_config for index type configuration -CREATE FUNCTION eql_v2._create_index_dynamic(...) -``` - -**Quality Checklist:** -- [ ] Every CREATE FUNCTION has `@brief`, `@param` (if params), `@return` -- [ ] Every CREATE OPERATOR's implementation function documents operator usage in `@example` -- [ ] Every CREATE TYPE/DOMAIN has `@brief` -- [ ] Every CREATE AGGREGATE has both state function and aggregate documented -- [ ] Private functions marked with `@internal` -- [ ] Functions with RAISE have `@throws` -- [ ] Customer-facing functions have `@example` -- [ ] SQL syntax validated with `psql` - ---- - -## Progress Tracking - -Track progress using this plan as a checklist. Update the checkboxes as tasks are completed. - -**Current Status:** Ready for Execution (Plan Updated with Recommendations) - -**Last Updated:** 2025-10-27 - -**Execution Notes:** -- Use small PRs strategy (7 PRs total) -- Parallelize Phases 3 and 4 with subagent-driven-development skill -- Run validation after each phase -- Create tracking files for discrepancies/questions/blockers -- SQL code is source of truth - document actual behavior, not intended behavior -- Principal engineer + team review handles flagged issues - -**Phase Completion:** -- [ ] Phase 0: Pre-flight checks -- [ ] Phase 1: Setup & validation tooling -- [ ] Phase 2: Core modules (config, encrypted, operators) -- [ ] Phase 3: Index modules (blake3, hmac_256, bloom_filter, ore_*, ste_vec) -- [ ] Phase 4: Supporting modules (compare, aggregates, jsonb, etc.) -- [ ] Phase 5: Quality assurance -- [ ] Phase 6: Documentation & handoff + CI integration diff --git a/tasks/test/docs_v3_grep.sh b/tasks/test/docs_v3_grep.sh index 34fd0780e..1a5e6145d 100755 --- a/tasks/test/docs_v3_grep.sh +++ b/tasks/test/docs_v3_grep.sh @@ -6,38 +6,68 @@ set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" cd "$REPO_ROOT" -# Tier-1 user-facing docs that MUST be eql_v2-free after the eql_v3 migration. -# A file deleted by the migration (e.g. index-config.md) is simply skipped. -TIER1=( +# The eql_v2 schema and its entire surface were removed in 3.0.0 (see CHANGELOG). +# User-facing product documentation must teach only the eql_v3 surface — no doc +# in scope below may mention eql_v2. +# +# SCOPE IS INVERTED ON PURPOSE. Rather than allowlisting the specific files to +# check (which silently leaves every newly added doc unchecked), this scans the +# whole user-facing doc surface and fails on any eql_v2 match. A new reference or +# tutorial page is therefore covered with no edit to this script. +# +# In scope: +# - the root entry-point docs in ROOT_DOCS below +# - every git-tracked *.md under docs/ EXCEPT the excluded subtrees +# +# Enumeration is over GIT-TRACKED files (git ls-files), so it matches exactly +# what CI checks out and what ships. Untracked local scratch — e.g. a tooling +# working directory like docs/superpowers/ — is naturally ignored, and local +# runs agree with CI. +# +# Out of scope (NOT scanned) — these legitimately retain eql_v2 and are excluded +# by path, not by silent omission: +# docs/upgrading/ historical upgrade guides for the v2.x line +# docs/development/ internal contributor/process docs (reference-sync, etc.) +# CHANGELOG.md the permanent release record (documents the v2 removal) +# CLAUDE.md project/dev instructions (describe the removal + provenance) +# DEVELOPMENT.md contributor guide; its eql_v2 mentions are the removal +# note + self-containment invariants ("no eql_v2 symbol"), +# reviewed by hand rather than grep-gated +# .github/, tests/, src/ not product documentation + +# Root entry-point docs that teach end users. +ROOT_DOCS=( "README.md" + "SUPABASE.md" "docker/README.md" - "docs/README.md" - "docs/reference/eql-functions.md" - "docs/reference/query-performance.md" - "docs/reference/database-indexes.md" - "docs/tutorials/proxy-configuration.md" - "docs/reference/json-support.md" - "docs/reference/sql-support.md" - "docs/reference/index-config.md" - "docs/reference/adding-a-scalar-encrypted-domain-type.md" ) -# Tier-2 docs are retained on purpose and deliberately NOT checked: -# docs/upgrading/v2.3.md historical upgrade guide *for v2.3* -# docs/decisions/0001-remove-eql-v2.md the ADR describing the removal -# Their eql_v2 references are correct and must stay. +# docs/ subtrees that legitimately keep eql_v2 references. +EXCLUDE_RE='^docs/(upgrading|development)/' + +mapfile -t DOC_FILES < <( + { + printf '%s\n' "${ROOT_DOCS[@]}" + git ls-files -- docs | grep -E '\.md$' + } | grep -vE "$EXCLUDE_RE" | sort -u +) status=0 -for f in "${TIER1[@]}"; do +for f in "${DOC_FILES[@]}"; do [ -f "$f" ] || continue if hits=$(grep -nE 'eql_v2' "$f"); then - echo "FAIL: $f still references eql_v2:" >&2 + echo "FAIL: $f references the removed eql_v2 surface:" >&2 echo "$hits" >&2 status=1 fi done if [ "$status" -eq 0 ]; then - echo "OK: no Tier-1 doc references eql_v2." + echo "OK: no user-facing doc references eql_v2 (${#DOC_FILES[@]} files scanned)." +else + echo >&2 + echo "The eql_v2 surface was removed in 3.0.0; user-facing docs must teach only eql_v3." >&2 + echo "If a mention is genuinely historical/internal, move it under an excluded path" >&2 + echo "(docs/upgrading, docs/development) or add that path to EXCLUDE_RE here." >&2 fi exit "$status" diff --git a/tests/ORE_FIXTURES.md b/tests/ORE_FIXTURES.md deleted file mode 100644 index 4b6ab4a42..000000000 --- a/tests/ORE_FIXTURES.md +++ /dev/null @@ -1,71 +0,0 @@ -# ORE Test Fixture Data - -## Overview - -The `tests/` directory contains pre-encrypted ORE (Order Revealing Encryption) fixture data used by the EQL test suite for deterministic comparison, ordering, and aggregate tests. - -These fixtures are generated by inserting plaintext values through CipherStash Proxy (which encrypts them), then reading back the raw encrypted JSON directly from PostgreSQL (bypassing the proxy) and extracting the `ob` (ORE block) field. - -## Files - -### `ore.sql` — Numeric ORE fixtures (1000 values) - -- **1000 INSERT statements** for ids 1–1000 -- Each id corresponds to the integer value it represents (id 1 = encrypted 1, id 42 = encrypted 42) -- Schema: `ore(id bigint, e eql_v2_encrypted)` -- Each record contains only the `ob` field: `'{"ob": ["hex..."]}'::jsonb::eql_v2_encrypted` -- Enables deterministic comparison tests (e.g., `WHERE e < get_ore_encrypted(42)` returns 41 rows) - -### `ore_text.sql` — Text ORE fixtures (100 values) - -- **100 INSERT statements** for 100 lexicographically sorted lowercase English words -- Schema: `ore_text(id bigint, plaintext text, e eql_v2_encrypted)` -- Includes plaintext column for verification -- Words span A–Z with edge cases: prefix overlaps ("app"/"apple"/"application"), similar starts ("car"/"card"/"care"), varied lengths (3–11 chars) -- Enables text comparison and ordering tests - -## Integration with Test Suite - -The migration `tests/sqlx/migrations/002_install_ore_data.sql` loads a subset of `ore.sql` into the `ore` table used by tests. To use the expanded dataset, update that migration with the desired rows from `ore.sql`. - -The `ore_text.sql` file can be loaded via a new migration or fixture as needed. - -## Regenerating Fixtures - -Fixtures are generated from the [CipherStash Proxy](https://github.com/cipherstash/cipherstash-proxy) integration test suite. - -### Prerequisites - -```bash -cd /path/to/cipherstash-proxy - -# Start PostgreSQL and Proxy -mise run postgres:up --extra-args "--detach --wait" -mise run postgres:setup -mise run proxy # or mise run proxy:up --extra-args "--detach --wait" -``` - -### Generate - -```bash -# Both fixtures -cargo test -p cipherstash-proxy-integration generate_ore -- --ignored --nocapture - -# Numeric only -cargo test -p cipherstash-proxy-integration generate_ore_numeric -- --ignored --nocapture - -# Text only -cargo test -p cipherstash-proxy-integration generate_ore_text -- --ignored --nocapture -``` - -Output defaults to this directory. Override with `ORE_FIXTURE_OUTPUT_DIR` env var. - -### Source code - -Generator: `packages/cipherstash-proxy-integration/src/generate_ore_fixtures.rs` - -## Important Notes - -- Fixtures are **keyset-specific** — regeneration uses the CipherStash credentials configured in the proxy. The EQL test suite must use matching credentials or the ORE comparisons will not work correctly. -- The `ob` field format must match what the EQL PostgreSQL extension expects. If the extension changes its ORE block format, fixtures must be regenerated. -- The old `ore.sql` had 99 values (ids 1–99). The new version has 1000 values. Update any hardcoded assumptions (e.g., `count = 99`) in tests or documentation. diff --git a/tests/ore.sql b/tests/ore.sql deleted file mode 100644 index 833a94f2f..000000000 --- a/tests/ore.sql +++ /dev/null @@ -1,1008 +0,0 @@ -DROP TABLE IF EXISTS ore; -CREATE TABLE ore -( - id bigint, - e eql_v2_encrypted, - PRIMARY KEY(id) -); - -INSERT INTO ore(id, e) VALUES (1, '{"ob": ["15151515f6eeeede892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459566a38fb0164812735b9ce4762d248f9e042828d5f5e5ab36a181f67fe2cf1deeb559ba7a4e0c95e8cdac00581ef610f44a0610ba86a6e37c28a0d978f6414328622904b65d5dbe57f04216537a5fb0316c03334385e89352079f07b9b1515563bddc3a903098177d8dd8d8a133e51c5597e48c65cf87c6027255b89d41964ed41d32c9f5d707ace4add7e7e27825e15a4c262fd799c7628d80292bd456928a3acb25653ae2b4d86a045948cc3b12240bb82cce84ef19e7c3820701d5a59ceff916390ebe4604a3ca2cc257e41ab85f2deef83882b4100010f13065bedf42a40a8cf862174a8959146fcf13b36f790ab85a413d8aa32c6cd4e5e09d77e68873cf5f2764a2f317d9043a97effd655e898e67c30e1aae2614b3f6c4268a1b9c02db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (2, '{"ob": ["15151515f6eeeedb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459555330775216ba1a1ca7c3bed393f5e7f8498eb60e3743a3e8acf4187cf2f8a955dd022bf28052090364fabee376634b658842bdacf91470d07fdedb8771d49c3a1aebc513ff3829c1eea14db7e60ca4a280e4906b4cab5cdec31ef9ee8f32dece31404e0031923846307020db9c29a9e297459bbc556793ce0833628adcf3b26a4a64deccb3e61c4ff8609dfe92944efc92e575081489863f0b80776617f857a82714e6978848be707f65a3318d1ce65b97aa03b70febd66c7223f5f74d5583e020e69d054d41ca2c09c514a089288e133cbca643c0af7650a02ad2b018813a1108ff9c89e557563f1c2b4657f04ad4e837cfa8784acf734d7f9d63b02b795118f9410a909be3cd01a42c0909afdec3310a2714cc6c6522665b891d210fc3c3b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (3, '{"ob": ["15151515f6eeee44892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595978fb7181a9413b506a48176075e1dc9cd57588f9ed3c796416cfab05a94fc1d8ccd7616094c01ea012c4ba64fdc98068bac7d71fcb39e058818641404ba4629bb018d67d81d292c2fcff860b91e0386c66f2eb7320195a238025b32704956fa55e31583a81f3b06c1a87490d3607b5f9b81b3b422a253f42552edc8bbd634b175ced03ce13f3bc4abd27adda845734120ece66aa72a20fdadd0fa9dd8dda07ae8512d8c90990a8201828c48c115c000f2a4706382a92b964445688e737c6228d47d9482b478e60e4c40210d171aad54f514da8da2d8dfd428318a975bdc8c571ffddb6c175906f7e2e42740f8b37ca1ee9ccb3440692d18660e8aab2398849010763cd94086fb9a1babe8ff86cf53f3cc796cf1ab84d14281d72c7b368ea863"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (4, '{"ob": ["15151515f6eeeef9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c8ef6c3cf2fd8bf3d1ed58c22a20fa3ab93a6a3fa0fcf2ba0f86919b35fa7c63a3854ee08d6c7fb74af2cf429440417241bb5f18b3b9d152184b280fd7e67526e9d7c366e34f99c71aad26034d1463f7d33d0dfdbb9d97d93041eeef7bb80aafa378b59e9b8ef721517678ab6b6f002a99a0a5a079bb9df253d9f4921852f238b747741d877e942f797ba5cbb0a6a626d774bef9dd5cbc8aeba7b46b28b421ed50d09490ed0278ee96433337fe8347df28258bccfc926c321512917841ba304f1f59b48271f7c8c5596677f6b7f115d798c4b91b5dbe076a7f9a60f750cf9445e21ce01abc54dc2fbdcead913d5df6588b73c3d7bc55923b20781266203862d2a7fa34cb18e6ec84ed239f38f9fb90e50cecbfa99b818deb1901a7bfa67c6fb8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (5, '{"ob": ["15151515f6eeee0d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459551126361b4abe9279d8d96148d34398137355d580ea448162d599f20def34818c5b35ba155ccf347cf2545524257579df0909c846d39ec9118a3c96ffa79d2626517b5db74e67158fcb5008612fb73eae4c89891e375e9a018c1183abf566c648d5d13c7ea561e0b491f1d0665713a225899b55729c31fa14e0f2e63d2508e9e8b94f1e0654c5150623b3c3e156b2e5dd89df101881ae091a7f1fc62b0be7e42512ce966b5b168f88dae69e9441899d55f587cd371753b3ab37c9c44953d58319653d87c8fefa98b4274aeb6bce73d4ac9637a4d21c04f822b3cbcc5bf2cecca01bef28224e3e5d755ee084700701a8b4d750c681dc94e24b32f7bc2ff0cbae311b633f9f58aa084cba5ea687475aef9c57908f4b19ce33e6405e7a9047c91eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (6, '{"ob": ["15151515f6eeeec8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459519836e9014d076e55a49e4743d6ea2609980e8f93176b0f185db76f0f407b238a66e06dc5c1af45a648650015f8b216edaddf2da35aef3871d09b7cc9aa021aaa6cc2d3cb52a8449d474b025599eae411e38107e780b064cd420125c2b1d542a690863023f2d868e137fc896d6d114df0eff239babbadd297a1178175de1452eae371bc1355efe233d98ba61af8e650434be207c24b40c821b5dbbe11556df2ded979fb5d448e251d3637a8e64fff5f4ec4bd0436441b135e0d0b6a56b2e1132d8d3c8e4a7d6d6b184ac359b9ac358a22c164949189ccf345d8b123a1b6f05f25a7e0b27a224924eab9e16555112cab20e4ca672ce36b9cbdd702fc141ca2a5db4c38be1d2005809cbbe8fbe6dc3ea28017781fe800b8c31145ab0f63876df40"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (7, '{"ob": ["15151515f6eeee2f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595860d13519b4e8cf4a0195135e8f668a02ab343c022b8620b24ac15ef2c251bf6e5f13211dccc662c09d546684960c8cae17bf207f9dbf40ef6d9f0a8028704e26c2974d11cfa0a443e84c63cefd135f309619674eff5ecd4f7ca358dff7950a7232c94f87b29a5df340575090b5ec84525f1a3d615a5a76e23af09be9ce9a8de5196876c1f2946aab7ed48afbe16d9d3fc67daf4c9111a1fceb113b72e63133745c628e945e5998247cfa772a35e26b1565e0797584df653fb99cf23cc1e591cfe8b1fdc4b4b6c16e8533c6cca51815bda9f6be844065e33bdb41afeb79bf45ae60fed64db7c0f313e3f68809e96529bf4bae9801832e89d98624f52998fccf0360d802bd6006d69c7a6ef3f252a102b521cf69b88302febfe5bf19d6ba04412"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (8, '{"ob": ["15151515f6eeeef8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952c7c49d3ef865b131c6eb0bc45125deb625647e09bed855cd7bb333f9fca422d3bb7f3aaeed5a608048ac5566880dca375f899ac9acb38b32cf0d9a54a91203a2085f825107cda6146bb91963ddaf8e3df270b7f25d458b846a868ee2f301aff7dcd5441ae3b0a4e13865315eca5c3b0119ea9349b7a7df557fa5e02ba48c01e3113b94de3546c297d06c9edcf8a76d25c8ca115ef8beac43cb161dc508bac223090c031cf113165b94c9077e71baca00aa007d0d0de35c889b99f9b2481e08f349afeb0ec98c5f0e02c147d557e259f457b8607cd9d60ee24f3a4fe6195cd00ab407fdde45dec02a179e43038fd12b1eb8490192fbaa1c0465f627da4665f421c4844a32d2229959b243d2977b03be426c51e1474544fc204a02de06a607ea9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (9, '{"ob": ["15151515f6eeee20892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a899a6b43d4f640b09a13a1d8c82057ddad61a7e761f86d706c5ea35a27a4878d36ab203913fe66cf6a8509ffdb5d5367070fbb80cf39c80cb6f3aa367d1698bf5847d0b83de9e8dca38a0fad5a14ea650792af76ed2df5a5e12b6c799d3d4f46af0ba2a272d3e273374bc74c28516e9e809ca87155dfbada5ae3a7abb83eff8d38f608bc792055b02af93ae24dfea11a262892854b4b236bf2edb3f97de89438368254923b80553e1129cac4c608330785a1322d98d0cc05db804e40274c8738fc136d27f3b40e80c096d94c4b1f56f65574f3ae104384da9ba0e21297cfcb946ff8fa1c1ccbe53051dcbc1eae288675e4fe7f20f035e52708938088bd2fa1aacf44e3a647b8e533457528aa81b06ca1e5a06679147b834bb69d55788ab050e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (10, '{"ob": ["15151515f6eeee42892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957e0121afba1eef66a7660d0b5b4143ab7b4ab8d2e48dba9206ea1942be9dea44fa23b7477d6ccc873bdf2e7a3fff7cd5db02a2a2d4bf6e3b8232aa9147d620953e84ad2b6578a275435377565f30a234f0015f6a45ea7d49e24e083a5ae4757c090c62a5a0bba16208f7f4caad5d04bcf1c361baa9d4ddf8d30a4759ad316c3e0f610c90a9a76e7174aa9904cc562d8987f3925db3fd9f589fa8b76fbb78155adb1f682ac7fdde600d107e56e60f4521ff5eb93d8bd0e47502e7bcf1ba14277a53710b1b153a14bed4e2d1d088b5bcdc387f1937257555244a3e8936740a006660767f8c7e8e271885835a049209a649fbaba49f6ca09b5ebaf573cb0445485f6fa29a2cc06eabefb99e0b6f22a2c39baa84878d6422d3c578c7941f5a709d0e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (11, '{"ob": ["15151515f6eeee76892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ecf33aef15a9c971dc44fa5c797a8358badd6e0cb2ac0430b52929f8a80aabc152280f6c9b746a6ea7229e5d1df4aa172daaef66c0e2752d751eda72561a23cc771ae289dc19d2572d861ea00c67b11935e144ddb281fe2059cdcdd9c8f4dc91bf70e44f1643f043fd033cd47262e09bf68cbe7799daad10d2ffb6802f9d6a8eed4d0df1d11e6b72260f79750a82fe4c634b01f85b5c1af96f1fbd123045b80c807bac0597da39a85b1d270610aaf12577218deff04de3e5ca13325fc63a19c9f8a8c59ed542df532d93ef0c593554fc12708ed6af26120075f6d2f076cf01679b5add48f6980d5ed6a914adf8527fee373e06ecd1ed76e00e03d065b363bae04f340565026060e9ac7221c79723034e2ad76096ee326a02e73f34f1fcb4128a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (12, '{"ob": ["15151515f6eeee82892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595857f767832acb87fed279ce8ef17706ae84c16cc18d271cbe0d8b971f8fab69bd96e317c72c7fbd12047a529e58dc43a83873158e5f566631b57e07eb8b59347adf2f36d5001ac4e63cf06b52884059c0975e883071f3888b703d5ee6947622233bea99ecd761dece515b9215ae541e57510eab55d32b2480f3473ad93637788fb26c4f42cc992f344e12d084c5af60c5ec6e7d3d8a47db7c2839c73162f027b1ee0070d7551f72ad54c9e7fb9c7ef865d3c1e4b2b90096fa2e069244d5ef2abf5a6062e66322545531dc17619d62877eb21aa00fc1a862cb3b7576d9e553a3b567605d06ba94938145800be22b309a18d49122a1d898a2e464d1f882f9787546f651efb44fad1e8b94de11293dc3ed49ab0c6d3f60942a98be3831801a51c5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (13, '{"ob": ["15151515f6eeee7a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c1e6a04d906d968448767459d6f133ee8ce97a264ae0e4942eb950432ec5c208a681e518faf3042a771a8c651388e154955fdd34ad00b578cbc3589142117ff1c3d6bdd013388c588a3c551dc62f193320e1ab0dfff18fa05486a2fc39c42733a3ef05bde21c137d0fc666cbf68f4d55029748d60c20e6d0d39195d5369a299e9fc57d4b2a6e7fb4ecb04655880efcca2d37a2e1ad56aee9950405074c82c5a7336bfd84566ec19fe188513da73eb7fcf2598754fadbe3c030a25665ee2d7e3859de507ffce122691774d954baffc72f9604b03a0cbded9b02169656efaa939637e9a5b7bc8d3bbde64e28e8f835dc3fd9c891bd471c1493b9ce053a9349a3d387fde4972ae8461b5d5722e789a8ff3d19e7932d28263cedca663ab0c673577a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (14, '{"ob": ["15151515f6eeeee6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459560f964f9b68cfbd0f809dc0635e8f68aa6d698a7de6a60ae65df5b8db514d6f71f4c58672ace888db61edea153c4092e45f31624e2f88a08b6628d443a1cf419c92097521da937e2620098ca89363b3247f99c9cb0860d1fda68e1a83a0ab44f0d3feb0455a1834cd1f9f5aa2cdecd81453c39ad1bb980c4358441361bc554000eaebf9eedad7f8bd22bc7eaeedc91004e6507de78a96b19b59c7832def6228ec6cba17a5aac2da58675451f1a1dc9c16c1760536438a6bc2facee77b79cd7ee36f2ef29788fdb372bf672fe570a5e67e22f04b444a8729b08537b4be4efbd7e28d389631b319adea279643286a816b5f64b8296d67600f9f821f164a66ae633adc0684ebf6eca2307236ab662b20a1330285fdc0986f4f060dae3067595775d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (15, '{"ob": ["15151515f6eeee27892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957bfd29121035de48a78b43b952bafeaebb2f13ef92ca98210d84e884c72f771b2b79a4046c7ec70cb98aa323aa455fa194716f5171f2f94037813ac32f5cbe5e2b42f64a706105f9b94989613a384f5041ec5080b13fb69113993f84f4f9f61f1dc57eb75d11f669dc19bd8dfa76f96ec0ab0e9909687e011ae77bd23b94dc2501b75bcc053d8d097f0509976baeb15c56acdaa0ccfa6f561d59df4b029814f073565c994b25295eb4feac11ae34ca11e880e35c74027b89d5df3c9d0f8fa0f2ef062d4cba57f947c78adad6b3628eb4c22ea09eddc1165415aae66587caa6dc4af8f32ecf0c44c555b192fad75a1b7d54ec5e72cbbe71f5c38b4dc270d87dfc7fbe9245fe1f19336c7dd9cf43a60183217891c28fa13cce3a043c87e559350d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (16, '{"ob": ["15151515f6eeee2c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952fd12691d2439e54869c5ea1b06538666b2a6bd19bdb2cef9ec4bc3451e457ecda94b2178bfd928032b30719f1961b5ca5cd0ebd720713043e2f66b308a75b6be673adff422ca6b063851e74ce467da5df8dbeb74f3d6d79beae5d4411756d0d255a46f93660bc18eb2104b74175188a3ea73229eea9d074b88a433ef181fab78cdf191b813e4b5461fdeb4d266f37bf8aee0088277a99e8318842d926cd7cd98efcaeb8a382b7517bf28c3e87ff54345af4ff6bb060791e52614f3bc3fe4dbda48a3c2847efca848c92e280e0c75a3ee3b42cc917189b6b267a49ab4e68a9be9e950ed57d27db905b05425cf9193ac5b196f5cd5831bb5db86faee021ab1cd4671b54e0d2c4a8c1f2622368795016879f3bebc1515c135207904edfe57e0ff3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (17, '{"ob": ["15151515f6eeeebf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b1b5b37c313b70de5a0379e14478d8551728d0cb701b8af3cdcfb341f1111e88ea46f463a43bdb60f83f646c024af73119892913678d6fdf4bfc51bddad28270e4358045aa602cc414b29c10dcac21b994d0a5580435acc1d7b16e0f596a0eafdba325f23d558bbfc5bfded49a237f3479ef3fe3a6bd0c0359dfa34662485c3356c0a0515522f711977414b5104e0c079f7508bab6c56269d17b8eb255c7f5f1cb8505e3d7da37b9efcc7d11bf08daea9f09c8fff7598e129b6da1d5f217e80e38eac1ed1ec125892358fb403332a09c2a0fb27cddb4a19cc0f505ec33447d850843c18f7b8cba05c68d69fbc632b5bc1c98670b97cbbc30c81157f72fc689f69423cfb093e7c2a1d3cd9a7d2a9b3781f9824ac6550a4c8b6c14438f4335f858"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (18, '{"ob": ["15151515f6eeee75892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d400c8e5adde39418ffcfa5c18ba90d215210906e3ac996a12f5a2b8a3206b21df7f8887ea953dc34649d7c5e2c706d7da02753b5c398e24994e4970aae5881cecce7e4e62b89935c1ae9d5a991dd7984884fa054396a8aea01ca4b5ca3dd65f9357835606ac60168677db59ceecaf0333ad4744cacca59cf60bec8d5e2f37820bc9d28f8d79e7a4fe557f845998e3c10ce854bfe24ce4a2e72df35e2fa408d57013a105211f6212b320f53e0e5bd4d4e5b069d9f97d5269c53d46669e3bdb2f4e90eaeb72c06951b8a6e22245d4ea55b2a89812a7a46eb74694b60823db7dd6658dd064aa005071e3734cc395a6f3bdd089f460f5453d4d7bdb2dff25fbfcdf9b0a9905a0927b14bab259f118ca9e9f700e18b04bec307c0cc8f55cc96df5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (19, '{"ob": ["15151515f6eeee56892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957b87c59e5c5f3d3f2aeabd17548459b3707b47a218966eb1f91c6c75a0117fbf9aac54499f02d2c81529b251b24ac01195a4899d5f06452b32d5915b3d1931cce8b5c39bd195cbd5e7ae075c638743a2f9ea21a261743b8e50a4f42619196c1fb8970abc51c714bc286b805c919bb42a4028f3f67e7d0f18ea0e6d6df049b88732514f426d5c170fd7d347ee4d2eac9930f68ed5e55aa5fd4a05260d732be9bb0e001f5c9089b5b8e9f147a574b6b2ffa02b165b3fc119c851fcf2b43d7d21021549f9318eb7eec11ac9cc1411f20dbd3da23c2bf586b9dfd04a817e56e64ebddbbf0bf615d2d06702494d321bc5bfde5ad15c75e0ede02d7949560f1eb7549ac979ca8dddeb4764d9a8363c878b0eca499de01d0969bab684fe48cca8a6aa41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (20, '{"ob": ["15151515f6eeeeb0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595da9317daf8e5352dce494d1bbfeeaa10f5d473628cc519d93c39cccbc801e22dccdc85ae3cc3ccff5566f9b7a11f56c6e5a79c4867616850ac2b9083a1f7c556b84dc640b15cc7094503db0e01fff59405e02103d159d8723989e1c0a377a6e36d716fccec20eef08a94407f24b1c5ecbbf5e19c24a73bd23b803611418aa33d2f7519027ed23b48f964210b8400f65fb6471d3d2eda6e396f4590c846a1ec9d16a755abfb29495b9c5ac0653a84d498fa0477c3bea701927ed88d71dbde1cc97ecb7f3c39458a8cbc9e4d0ef63ce1f497a9e2fb8ce6a86b77dfedbf7553d0b4ef201391d44baedbc0514a09f5c39273c1559401a14b50c5de45ccb751a469d7b9ec6b3e4a52a0c6db790a02f07303d96e2a095a1894319cc3a1ab1a61d2a29c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (21, '{"ob": ["15151515f6eeee1d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f043011724b9891eb88ea279d9dc2429f70aed1c6ab6a004f0787bf1cc53391175c96e08a32eeca26f047329386091394d2c55272f8a0cf43fb0f050e28afd5bc505fd76d3e6e3bd4b9a86c5fd98336db2a9602d2c3040e597bc56525614879de0e1a52bf39ac5e85f602058e3701fb7da87e0e8d2b3abd272f28f000725648ebeae90bc88a02bbd3cc43e845eacfbdc7f67a422241377f7ac25f3747318ec006a667023605d76b09c0d92500d542218b38c72da0739b2dc4a1988434c60701116f4714cf7864be54105edf5cada43c763daadef89e980e47eb51506a1b3e027259a6a8156b2f975fb026c3c52c9a9db56388e3baf704d2cb121e5eab00ce509d3901ed20ab95fec3f6af7aa2df189e787832881d16df1fa092d0dcf7cbd12d5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (22, '{"ob": ["15151515f6eeee1a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b02c6e2d163bedca74fe6bc69b75798808362ad437497ef7c5eb3bec19d1c1caa814d2e2dd004b6293cb3ca0bde62302b4b5d9f83c68145f9e6c2452c8e99e691513ee1e25a0c6bdfc7eeffe94ccda7520188325a664b4d3f1e2ee33ce07315d7cfca178b7c3e60040043f7dd14825b1da1c3074be5e398145d6d922dd8a50c4d6b7aa908314dfc06fb5fc1dbfd03cc383fd5202559ab0ffa5548d934b2ba6f024f8e43b50da351e21783f57c6090eb64c21ca8932dc4e02edb035d2a15f668c679aeeb214bb6106ad8027b99b380ada8590bffdefa8237cc5fa13447eeb260dfe419b21b5665429b9bee2da34e9772882d58619a5b47e72c435d75f85b060bbce9a26fd99ab22523fe775445fb5e711723c170786331d5141e766a9153b7b4c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (23, '{"ob": ["15151515f6eeee8a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459582e68bdca9a43671d9300a6ac3618410e0ae63faee2599fd7832e5cfb3119de805ff8704c44955d4bb2f4c195a8d434dcb5418ca8b3308be2f7add812642329dd4e685b4a90079d6c65228f619a2df8ac065a1f8f845ea6c107fb022c6fafebe772dae4adf0bf882a034c512869f1f280b20adfa665572efac8e65ee30c00b08f53a51dd49b7193a79fcdc47f87e50b26a20c43997528ef4fbcdd1d6564552ece344eb20debd4d10366954c77447ae4421b730f89ad52ca7325d85b5ccc241a7f07819291c84d9481e07a32cee9f4dee4d550111a36f51973ea74ed53d0504fa9f313ab2d5cf80e104eee12ac341afa7cd0b8cade520e10e40864bbd772619bfb4504af78781c24082b3ad3d1bca18be03e6c3982e2b3b59c636e823e82e6034"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (24, '{"ob": ["15151515f6eeeec4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595071d797ba381f6262f1ddf79d75a0cb1d7bf49ba72f115d31da059b820fc91f3f0137614c6c30a863206ab408b914b68d4e3b6b3f54525fc74af084467f5b122813841c4f4d8399940631a6130b2c2e35039872f373bbe0a5c5b40ff9c7b82dc3d1adad3e814fe59253c25975081afc830bbce8b40bec95843b91ed875e4aca0fcde55eab286b490fded3c17af26114d8d302876fa8b029fc365b7163206d051090eef9ebfcfa8a6f4a717ec7b1bddcd905a03d269f2fbf66c99c409276a33e940113dc8260dfa9d563cf5ad64255cfd8c567e0b2607ad214a74435fc4281b22d32eb69854a2a20dcba08c449a69737f13b8b055f51b3667766ad51dd23c6820fdcde4fc366ae9f064e12631c6c2fc4e33c4b58ec23ddcb769366f2f049b99f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (25, '{"ob": ["15151515f6eeeec7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459536cc2552de9feb19ee625379a2a417f603e837683d9a088b604902abffe319a56bb25292c2287f20ec2b7306de4912299a68f973a794f2a48c26dd5d3e8558558e980519872684a4ef25d404b7b193f5396d9034b456e9cd6418f9d47edc296eb000592434a467758502aa9b699670fc1c3980829d0e5720129c636862b52c0ac03d8d97a43bdbc16a6160e046c4c4e4dfe81b6c29af693b0b3c81d04ed69cd1ea147f509baeb928627af69a311aca2d3af30e2d53542b6a2493fd6d967b3050298ca92bdc50f867d30e99daf026bcd8faa9f5db16579474a67d23642e2e1af44be6e2c9b4abad7261c8f10967bbf711420e84bae65b0bf1367a2a0f8f20860155dea88c8cfa0e26525a2d4280a038db0d15bee4172fc4591d41e08973b750cd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (26, '{"ob": ["15151515f6eeee7f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f3852f81ace89ed9cbc3ebb34212fc6b0228ea83894e5cf7a89373e864ad690719358ecc65cf8a1dcd90b5a3aac2595fcec5b34b5b5f7b18d706dd39c1ca5015e240fc8cb66e08bd0179528369f15920428b65cd61ef009e286c87c087fd5a6a492dc1b237febdde1834ea794282aa0d787521b6e2b043b23d00af94f6cc7058e5c70a6f3e9622130b66db8da812fb6688530d57d10363b1158ef78dab5af2606ca5f0bbea002b173d5cb733c2883631bdf6f27b6f77da894dd50ca2c26f5d59e0caa1e3af299f04db27208ccee56b05854577b54bf84e8ac1f588fb680fea9005db4418c12e9a396c543c0b95f4c6e44f6e86f52878ac3534ce886409c4ed922e593e5eb8c285430ebbf3fca48f9e748ebb00e8d07b5c16608a3db76b1e17ff"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (27, '{"ob": ["15151515f6eeee97892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595204073085bafed44a8a0a08badef653c3b81a6621e094d20a8f40be7026c9f8877619d52fb3fe023ff04f3a65aa9b51fae697205f7879f94c7fac48c0b75c8ce835b204fb4b8e22246c312f45cba24209f6838176aa6de4497437b129e57676000968c775cefc8a9d405b7524e527b3fed3ee9f6308093a325fbb5c65d5cb2a92c37004f6d979cf7c314a432b2768911fdfc789bbc1dbd646ef742b466370c1778325fbc5b8fdeb8e2addfe3aecf24ace5a4457f75d44f599d139ce434deb44d5f6f74c5430915942f568e0dbed0ad129ece916bf13fd2ff4a5413b1a9aca2b1611241fc9aa5a217f9b5bcda6e6d2b35f45b23b6311ab8a6cc7ee349c05d617ed33e6a466e03b7cb827b1ba056a3db51779624c9ab1b1c28aae112a1d70f966c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (28, '{"ob": ["15151515f6eeee3f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954c0cea02a84e0ee9c121398485d9d2c6030f15b1f7ad5d14e3c8f9eeadbc50260f35f6bca7d484676545a19e0ead2011ea104e2d34007991b536d83e759548d5ab6771e77512100ae1be9ae75220de85624118631d7f473ea5f5c862531743ddc0c745346e092ef6eea387485938df2d56035b29b6adde9205012ebfecc9385aecba8973ddbcfa53d4ab1cef232fdbf3372b848f2d5425ac442fffc5ec147f8b7c8d5f7e6c8b64df0b7bdf69c7723fb0de8fd633b624a648f427520fe9bac113d9538d3ad73514110d1d94cc58f57c4504f3836554d8d7e26ab30feb9624d8f3daae450a29ca3db6e3970b5201d92a199b5d7245f027c21ce82d5d4816c2c2db117cc0557962f9a1285b4534a16f421a4862f9bab628035f3e3d3cadb990fcb5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (29, '{"ob": ["15151515f6eeee9b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459571dcf5c85ad767a0d2566462ebc361a3c0dc181bf68d1861009851730de40445d680fdcc8aaf638455d1280e543b1ccdfa99a5bfab0b50f0617d891bcd64aac6c094634e781d5fa09c097a254bc53596691c3f2475e900457bf0dd74e77cec31f2c6929289dae1d22b783eb47e3b3e0be4699ee50202169871292d08fc577800e04e7e28aa59fd4df01234a9d7dbb2f3e14f454a2879c64c5d7af833ab18bb476d68c00eea868229c8a9c6bb20b7fac9b5faadcc2fa73f749980483a9ac544546f16768e4157b30b11c06c1ea3ae6262f96cf5658449504ce9f4d3d487ebe0ec320090fe1f1e9dbbaf78eedf59b6732b61d88e4ffeb6558ffa5ef1210423b3859ec88508449dfa6567720b4cd69de496c90d91c4a101d415c61b496cc159ab05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (30, '{"ob": ["15151515f6eeeef5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951373d00cc97808990cd803093e4e5ceb781dd58b3f238f337f6463f36ed83e481f8ab5dedd92209cc356a3dac1a740f76fe17625382303bc4798d432d8b17820ba6eb1c7da2bea73922cbe285857633994b21a5b142e7dfd91fbe25cb77d7e66f1b3b1e9c8f60c5d91dd499ff133e193b5b2ed79a320bbf8c57c60e3bb05221c3c92a9c2911a2e7b4fee97245cb8b8120b64a0d5218946bf8ecb447ad830c7b60402cdb9f17c272ee8fcc3f5b4e55519b8b759a40ab9847d725ecca7577ba72ef8b45662b68f78d6d027c22b747fdc04db2a704054bce2cbfd02f693a0ca013d3450b4bce817c56cd9b2438b50231283aca78876880b64bb6e2968fb56083d3a7f645605826291ac038cedbb0f57904a73e78a141d744fa67ae2dc1b38138e67"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (31, '{"ob": ["15151515f6eeee40892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459584e6a6c6414d1a52216e7c7fc6ad8153dc97ffa8e8179cac626acbbc1c7dfe3877375de6445d4b2e6c08502563a978fd5ec72111f8ea2389eade133f79cc56b2d3ec9241633dcdd47e79e28bdd59faf731c6be2849595b2259284a49e5e305346bfb8e23d5b213d0a756da10c314b005970b905a42a20f659da82706adf0dbb622406c93233c59663c054cfb291ef022ea9609f0716e2d2e0a757a9cee45a55fd754efd58ee9f1fe6c884daf6d3b09a065ada5b87e56941faf531069b1e8d4038c99801cbe177db6bff0658eaffc3c8edca661879b3264508a8ae77118abc922455c139c67a66f96eef472e8f6577894c7e4c6c53a3bd51fa8e1bd40e78ba8566b4377221a29eff2bcdae184afe4ae6209842d1fbc413455eff0d0fd68b1966d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (32, '{"ob": ["15151515f6eeee23892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952b2c19aa9f48bd2ccc836dd359dd8ab2141a31523715b4124d9d16b24c55e7571f23c994f285d0e006e9619fd49862ebc9fea699f111688309975990338aae891689c656dfeb9a631540f89e5ab1aaa2169ea3af0230eaf874c83bc0ac3ed8733597ec1289e739cda49f4dd1d0a0df3faef8daa03d543d8a5898658b25827ded69b3523094002fa82c2796f993be87e27e3fac2365514448c21288b23bb578ef62793ef95ce9ea871551fed3f7d70a1445e791296f33ba2184150174fc26c401f97ddefce9248d233749066d51ffafb2adaf78f964267b6c337bf4a86c78a31f94a73435e2e2097b89f4ef4bdb25709cc2337ae5722925468a7228207311c15a1bfe73e3e40ffcadaf035fdc1bdf54f5059c1fd00622e8b4a9ac459ebadd6766"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (33, '{"ob": ["15151515f6eeeea0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952335ba0c53d6ecac1a21fd1d6744dd999c68d66df52336a815e742482ba3171589de65baedabe147209be3514c706454bde118b10754837258995046fd1c6e5cf2d3d0cb5a23313e1806ebc0ac4b5cfba3cb392ec64d59a93d0e0ec653b010a96c13ebe00a87259b087d2e42702af0eb696d26fc9822ae22f32bfb6364b2ce2d067e08313ec5f89d0ed174b24418ab904c5b6ff4da5dc3c2e8df62f64bf0c44e98f640969541abb92a438734fbe7a0c208916acbf72e0fb4dda8d26bdbc03f1f0b204668bf720c4c20d871a5f0790d25eccde1932a2871f3450e9e9d55c1f59450332c09a743ab098aef3a9dbdc57da60b8be8af9ef21ea5f1e0f597741e7f9ece5a3adb5a36baaf3e4c894b811e234e9138f08c7c32b346d6ba68d028fcbb87"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (34, '{"ob": ["15151515f6eeeea6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a9ae24e9c4be3d68db6ccf6ad5f902916b468817a59e132c66a0e658324f0f0321fd716a96f4dd091761940888dda097c5d1f475232891427bc0bcd4954feb460d0f35076078a293f52e987b9445e995a3090ddf001198726754ea213d61033496683b374f847815d70df795a3ac4889abdb1b7006d391ea13fcafa1a81c5cb2fc54be753e3df736b3dbcf477f0a668f7ea37f7f080ec510c4f618d9ef651b0b8b5da976898c267022cf1439a47ee4fd99ce10a72d14aa79d818e5d20ccc93472e31db1fbaa6086db7be0f3566fcb0d1b38d49eb0534f9c537a17c0e140374a6eabdcc5a31a5cd7c37b04efbdbfcf42a86b8ea4dab421cf566b9a2b223ba892a20e63fa58e2413cd0dfd203a9faa0a454fc61f802563279267a4a9662ce5646f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (35, '{"ob": ["15151515f6eeee57892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958279b88e3057fdb820b43f5cb529a423b3d63d114cef5e982e3cd35d769075c4eb081c50bef9d5466e349eb8e8aadb0b5b3cfd2c991930e2ca65c4a7aa25ee079860e13f28cefb5892f22e25c0c23ea57670d2f6e352c3d5e04b4d4804e1aa9f5c589af757fd913bf48de5cbdba8baefc1e61a96b0f5f99f5af1804d0bdc732135b31b6e4e68098b27a5d8fbcd2ebe7f8d91782423a1a20293dee0a65fcd4afff0213d26e42c4fb9f1d896a03a6eb228cc8831e2bf36cc98f941b8e3258448c1cb8695bc82c9fc0327570dc6b374e008a833f6113609fe9d84f1604faf763671b2cc8a1f91986ad673d2e63981311a952a2732ad418e22faedadc4e3dfe6e6801631ae632467814e1350fc98166ca8b820f1963bc7d7b0b76d3a2642a1bc5aba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (36, '{"ob": ["15151515f6eeee36892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954d2d761cac9636dbe56c7bd736dcea250edda32f1c5f87da883329233b30838baba93430c854e11978dd902736a27f32a71d92ae2e620cd52dea33c6e30f75c4e22b8dde3e47f16053754ca2783f82e052e8a011f24d7f269abe5dcf4a04d4f860c543723c86026161ae85d71aeeb3e094adf66f20b0709b5e0a8e4606a3a876f2bea26c09d68d8522f9b66dbb4c40d51637d1d1af4440311b0263e0b736c2fba60012a927d97b32cec353f8c7c616da7c8e68e95aec38b05a8d27726285ae0aa1f675428e465288fd442255c7dbb2e711dd81e0160381dc35e53013c734956a8824f257a6abcfa49a26a675ecc952c886890b147f0c230309a5184921b0e834fc6bcabdca0371193b1fb27ef88dd0a2a9e7bf60e8a5bbda4b072437f21523c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (37, '{"ob": ["15151515f6eeee77892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c3415686290cf3f37ef3c76b3743ae3e42c5928d1f260b588ee6a631ab44ece1d7344643c75041be77fb4c5b406a74fa4d08494a50cf284a0cd3efae9caefde501df1f336084e7354097fd4cfc374ea0a32535cd1998fe283d93aade3a689ac9a5e834a7ac804045f026118869a2b47ee161ffb3fdd44993adfcd397d01e1311099350e27a3124f207c00acb660d1b663197bb03e209d479e36bfa16973556f16a009689999b4a2149137c38393e4334fe932d81904e156a0fe6be46d649f251f36a75cc3ba58d7ae9e3822fa532222d753679293ee2d4df1b8a09e4b00d165ddeb73c961e292fa29b020ae27039dfcc6d3c9e66e945fd413b13d90262adff887bba655291614bcd395b944a87fed86fa13d9b860770043574de8662c71154e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (38, '{"ob": ["15151515f6eeeeed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952f0aba1d28f03f82c454b190914f8dfe55234a6bff6d5d9492ef2f41cfe4841091543315876ef6d26387c5e4b388233fd51b4aa4c4909fc81365068b6d46a1c88b7217d8510e985ee1ec27908538a350cc1f0e92f68a3ac620766b023f5411e3085ab898d394cb635fb19a86b61565ebc6d8010c62166940c44b558f74304262290b1bdabdae8cf920b9754531a63293a84e0fa2132b5473bb100e6184a1bd26608d57e12699722c57cbd78d3acf5d84be08a680aa7fd3d22a1e4c3fecad40f95dabbe1804135e945a613a0d2b0c018871f8894aeb1ec0adddd3f4c8431623a1e06b98cb94eb5b8a66eac4f3b9e3ed649ef70925a020058f1e3a2aec8ce80892cf051f6259e215add0d06693811a01c63c3ae876551ed65794628486a9ed49a5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (39, '{"ob": ["15151515f6eeeee4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bde7dd54628b320a8484cccec959bdc42fa22cb790a52da641383cc05537b9a75d7140eb31ac26b3f8e98b422a142809d3bec746301859719fb58760f16f7bf403901ead2c5053b9c88e6680d98b3e456b03eb6775e1e5cb9dd58a2cbdfa7f300aad1e05e050a2abc4fbe513380a8913164dd98ca73fa798733b2937b57fc66519914a67394dc4e8dec67c5816848dad5636e81fca368c3d6f8f6dbb03682be0d870072e0806c6d15ccd7562339145a92f6171d9de9f148e98ec3bfeff2586a499618f613ccb8ab0387ffba06a9f6c0299de48976e37b415b691da63b3173579b4aec7e226604d856a57697473c7e946cf9c6582ca36a12fefd56a4eef9d7b16403d2914d15bdbeb99bb43e7a4fff5e195e28cf857d34e1951bfe940dfb26c1d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (40, '{"ob": ["15151515f6eeeeb7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595355eef3f683414d60c333ef2a21ee17d356eb68a819a3bb9fa101f21d15febb96eebc86e79fcd883122caeeecf36b6057195c4a82b266a9c21591e3f89c2570050c54f964d9936e14d683b97225110862edd98982e50eb3fc25d93a75c68fad943c5646fa8e00807856e3128a53983589a968b2d7fe43fb6c749d3d5da87f4c1f79be08f547763efdc8a4c2612f12e0a2c5c6b153f850d25ba68db0f9e5d3a3ecdf5f36ec1ace2125f1e65eebc87b9b22d9301db8a2754968c30407ae291ab133c6538d7f76c7895940932aadd9e166a4fac01773d447b5b2607eaaacbfd96d9dd4952a55fda7004d36715574328e2afe0bc84dcbf6773ae58fede9873c70c4f11164dfefd61ef036bcfebdcee1b1711ccae5fdfc5fed7d29338cb031d9a7d0f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (41, '{"ob": ["15151515f6eeee14892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ccf481f84b4edc55f6060b579513635ea8908c08020100b7caf6a4e57331a0413020b1d57bdd1436dc4e9d8551e422f5bb546a25ce41d87c135dbaeff4a9b1ad02522805d902cb51e1ccff897e93b9f5b691d1c8b89b7c9c02b7368fe50ee80b8be0cd8ea0c62b77da4d32916a3bdf2c93557986d7bd10842a069978e28511c12c4095a4ed3120a09b095c1c907273f2ac66010761aca8738c0686adf04233758e47821cd4b1d10482789a2df16f18aa33aca3f32919a5a178edcf747a35dbf627443c83c9979bab65e6d1354ad2ae3e6013f6cbbb53055d01b8138b8459035bd7b19f03acdd38ed6bc81a5424bbc472b7776fafb9f2a7ac14e35ba07a809348e220bf304555035e674a424d2517c3091149e3582298c5b695b30594f5159618"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (42, '{"ob": ["15151515f6eeee9f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459540c428ba76bd5881f6cb54fc9a021c8ad3c6f85cf878bd3878d3051806e09e68076c78464b4e67f042b17b31cabc3ec617be16d4b2ae9ed86d0a76386381464b82d6287bfe5a4681656af1033abe3d6f01d7c56270530e8718296f36084b155d7151a2c46815f3bb276eba7b58e64b61dbc3b7e57c41ceb47f5490926b6e015660cfde3ccce6214b81fabafb00883abb2800454dc23f642d36ae9d6678d04961d465506244c982b255f339633b42c7270fafc2cfc9c9c308dc5d6d21df682a73f8d02f1acedacc5c47d158bf55525b5fd2910924b793d50f5b72b0304e6731bae90ea6c083a6ac9221a2b38d27f26746b2bc4e4f63c52abf8c13d5eb74fd2b3d9e62dfe5698c5219b8f16c0195eb68d0ed5c2aada063b9f7ddd9d5751a84b069"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (43, '{"ob": ["15151515f6eeee79892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957b7289c29b291db1d1277f55f39d1f32758aab1583e5d88875d002ef0ed3c4c49838869ee27154a2bf7b3f64cee3e8dfac72ba414edd82f36eca678b040a0c639536559c5a972eb6b17440f2bca979d6097add147ffa09564ab556e3c958ec071ff6418600569b1ef5d46e9278785771382fa96182a310fa6c79a41dc28939c1b9910e7b8e5903ee61747781c66b0c1347649b29a53dcfc99565343b93ab35813331661dde6dabe5f81beec329501ed1e9a41c6e2d8662e854af4dc9cf3e0a863ddae04e59973552a1bffacba77897805e24051eb9c366c80e41c418c9f01c9a4d9b65691d6824057353fd90021470603d753828a6e4508cb442684aca48e6e98c862dbdd5c8d39bc9155c6388173e2d56ebf99f62788e978a9babf77b6976b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (44, '{"ob": ["15151515f6eeee45892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951064e9db846535203f3b9396133c01c682c60dadfcfa91c365c859756245018b53e29f6c43bd91c412d98b99c7322390a6d37da02a1458c50846ecd60c80e5eff4f0da49fa3ade28a4022722eb3ef052786054c095bf88569229e892200a301ddc450b6bca529be136a56cb2448629fbaed700f730fe1c81580ba81c553d9e7d3796db20f6e234a2117b2f06847aa8f5adc88e771d1ca3744fd6b10e10973e67650c738520b29408e05ae840e432c6d1dad70948af81a39ee15011deae1fa3df59428fdad724e217a35bee05a64a3f9887a4cf6cd7d9c101091807eac3067781f6d8737678ef5fbc4b9207d68ed38f3685542a2e9b154dd845a22b111faf24856025deab2ee4bb5f92f417061d8a50e4e4badcfb60103a6a80f00b5de8d19c68"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (45, '{"ob": ["15151515f6eeee2a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595fd6dccf3d0de9bbdfa4b428337382972aa009a710e7c8080bc2290aa1899e8ad8b070be237d43c6ca2ba6dbffd1736f1cc17e4213efe7d6574aeb636ea3fd3e30ea97744802bf2603fc73b03099be0e980b5b3bfa78ee7c47698ab484063dd33179f703732cb7002b87bfb436a47278b45158a7a32ad93ac79105c8ab163bff9c29e6ed1155699cef09ca7ef3eb17d091832990c24ada804f18ba20361788cdd687cfc62ed7f12938e5a10fa5d8b6ab32d4e5f066769fb2b7152a9448907962aa9c6a10844475051ec77f8ea5e7e02a9039d472e8ab866f26480964abc9084182593917a5428eddfd6224c68d0d6a25d3045ec4aa534bce3c4d4afc43fd14fd25279e6091d2ebaf7ce583dc00ec1ffabd41b8bb3315dc6128682b964c8c91b3c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (46, '{"ob": ["15151515f6eeee8b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595fc842bf40323f9d67e58cd2c5abdd544a499988f6047cd149dfa099236f648e6651e85a978727af341dd335d0972633577c83606f3ab278fb9d10165762089dce5aacbb8d20024b92256c709310fade6877e37185bcf2d2bfa953c9d44d5d4917eec46502f4753b1cc97497057d4cd60c775c389c99f40d763d0a69dca34a0082550a111105b7b140fb00afdbe8ac5e560624bf8593e874425f78128fce3c62a2d024323f0a5bd43203e022d0e011337b2c56eb57689e541ad829c60eadcc175464f037a573d80b948f3ef5dc8366f704178a1775d1a0181db83225d4cde094704b2574e76a7d2811c451bac20db874edba3f83b23c26481f1a69461f278d45412dff6fd684c79e0c18186cd4989a85cc177cdeeb66c2c0fb067302c5fc3c439"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (47, '{"ob": ["15151515f6eeeee5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e2c848458b66f7951394b4933897ae06d2783083d8099c38e68c4b3cd39bbb38aa5393cdb1b876f374583f993e233765c016e7aea413eded77d23693442b577a082f2a241851ebc81012a9a8125fb5da3c9a9f4d3ea1af78b651b28324801477cec06b91fadb6375ba678eec61e51d6c0e7a9678095d288e50eed6c2a433495c66be83bd72186e1cf73781b15cbb03c73f86daaed1830d24865e57dd5befd50b2163731420671167b26f3c7fcc71dd122a5d61091f7acedf4da7f89f8c5f2f8b652a85a5cc350a6b3026171cc1c1243de10f4c1722239e322646d18f00ddaab5fd9ca8d9e1ae71975de1a48e143eb3bd68a0a4130f56ed6c551e04f0d283599ce1821e7722b3047248e2efc7114f3158d749cea2e452f1623f3bd0f8181b6277"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (48, '{"ob": ["15151515f6eeee49892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595266c0fdab1b2aff1e3132a8147cd3512d583c10f3a60c5daa5633647fea1ef280d32425fa98e13ef8057b663f7802b5c5a5edd76a6e0e4c6135bd72ce17f9bf93ee7e62d83cd32700274a25b58aef9aa3cd70b6455226618aeab62ac1cecab70daf1cd1311872c50f893c53b056702679fec1c622d1b0323757431e8ec4e52173cd2f24a330dbcc0e759a4f92a21599751e64a961fd21ffb51f73b9ab99ab5aa94a599b1b5c53767d8d7c750a31b765e4b29fbe7ff2a3e149cbd541150ed28241512f7261f89a14837d08656e5191dbd11406a8aa4b12ebf99672587c3b7c80bd2c3bbcd57f1cf74ba486993490f91e0eb1196be7fee4dec9b08d55b3a76b2933513677576005e8b67dc17c113dbefeee43804e09203d37ff72085e57058e2ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (49, '{"ob": ["15151515f6eeee6b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957e2099813dbdaadbf23cacf963e922383097e3146aa6e7cafe25671366045c39c71fbb550034f2c462007f6101f543a9c60d3ff2edd0394bb21db25bc250df29569e6f93cd03aac0fa6027c23e76975d03cc91c3e206408e4a312ca16d1f39537eb06a29d9f92559c2ecfbebb654327c5f0781ee99f3c22dc478d1ce47b522664bf2ce10d2ecae22b3114415cc5ff8a4179b1b5d9a142ccddacf3704ad965007a190ee4a85e90579ee18af7bdace5102408f22ba39716e699be9c190b33f83dcbd0c48349404f75780b8f2c18ebf5fa102a0b62936c82b9d0370af2ee9980c61fd220e1ed9bdb946e1808c8ffa4d67420ad5f933b097ff2eca79b1c63dd7be11674c7553aa58a7e520df52b794b102d27c5bc95b23662df74d053161310f1aa0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (50, '{"ob": ["15151515f6eeee07892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bcdab7a57461d15f0a81d55e8f809eff888c751fdba1780a2c192c6d998687e3b5750ece4a8ab90e9067418f502f9f6a789e00f803412499292428fadce6e2db63abf64337ca54aa928ce6dbcaa726c11727767dde0bc036bfd8373836b9eb218664609235f4e4d27b391c7e917aedbe284c399dd179caf02c16b685d32d67dffe087fd88183bf700e397e80fa9a9aab9a77bdaefc02143cdfe81186ec404a79fdf17dbbdfc367b693f7f4711a4948e4d56d7ba40cc0fd33abedd3a0e76bce9e0dcf4f0ba2f1a6f25bfc7eaca8f3911f4e2bbafee6d14b9fc68facf07c7586db8fa6b90015d9137eb6b72e78fb01988b0eb05bdeee861877eae00374ebf424609f214c9fa1e872d9e3f06c44d5257b917cfec25c9874082867fafc9cb150cc39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (51, '{"ob": ["15151515f6eeee8f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f0617222b7b962605c3ae6b3580aece04a054e10c157b35aef6f4ec153e4c14ae6b0353924acc70fd27a3d3645bc949a007b0b94266e3ba70fa086d205cd13990f0d7103a7fb1365e48a7bb351b4408c168c367e899ac1445bf2285b31df7dc5fe23d48202f81e683cd2b52ba31b9200051c595d8d3990c92b914beac402b508c45d61630cee7b92a7edc7b60ef93c6b3d3ae1276632ee2bce5547223f42bade81a2cf437bd080fad22af97c1d38ea728f99050916dd9db5fb12e36aaf9b3a40cc7ddfb7fa37ee2de39aaa5e73d68c1dfdb2545c851f7b61fe0028759d19c12feffc37629ebb6da0e82d94f866629d4e33e9534771aa569647f4c61aff8c11c1e4c057b023c03950974ba669e9fa7c1c3bb0f328f38834bdb2f7d1385f30a4c0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (52, '{"ob": ["15151515f6eeeefa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957a5a3cb8d5fc4389b9ce1efccb0b7e15896f3088b3edd7929521a6aba447a6c4cfca0da4d6fcc4b6fd604d2b76e2ad4c7791c987a634884ba75c15787c15cc7cbb67d75dab4ae3e855a17da6c5ddc35415b7a77c90a933c5456b5f8d9d872a6c551a094580b42393ab19dffa135e654d3f6bb18ba7a8984f8cd8923e9bcdf14038e2991b19d898db43461958ff0f93192caf0bae5f69783a789ede82c52c75815b9d7197544c4e9796143fcfb9ef2ecb26f3bd3e56c9abbfc7a55304bf18e2b71a0848f76595f114ad8ff0b8248489b018477306637d4f1ef2583a035c52306e23aac9480adec1aed764c016d28cec52b5f9c4d0c8520cfa5a62e7b243dc8cad57e3bcdf1ae6d57c7708c024efbc0843150434cb232a0c2b781cdf457e466ea3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (53, '{"ob": ["15151515f6eeee61892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45957f3218b541c50eaa82a25f38b0c2892d5bc400a49d6119f6ca21a3539ab001e3b973deb0eb9bbd042436e10a85d93b642dfdd2391bfe413ecdf1b966d9499a0be5db0f36748e83ebdda36dba2a08294c98953cbd32cfeb409c7c813d60860ee71e4bdb244a7ff459314b99ae140a68d55a86a59c79dee8eee87ce94e5ea4ed2d472c2aaa21b5afa2a5978d3da6c89022f3d3a219b9bdc134608e013fb8f94f0c956bb32488db2855337883a2c00bb163b29ff0dd7ddd347f299f151e0308a8dee3ccf94e3aa34d8367eb0d56510ea4b00e7ac0a23fcfecc9a419637ad0debea527bff945a50bbbd3cbc2d38016c782e5a3f8a941f26db29357371f4e3047d74ae501408c80950430af8b1151880435d53585c5bf73d606edd418d6a097d67cf4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (54, '{"ob": ["15151515f6eeee2b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459594db6fbb4e6d8e1f9f21d857ce8fbf8720e0e7723de2fa49e2641ab7406ccdc6b88dd53e0ea2cacddc48385110cbe1546470b4b77c310f5c2c2d5a5ae6545de9b8ded048797cfadc8cf4e278447e374bd937d47ce8c4b8567ca481d44ba9cbe35059ef0127709927e880dd2dbfc3802c97571af976a7fe47d61fbf7c92dc48f34996cbdad6fbb1de4390e3ae8d37c3dd274293daa4165a244e02a4bd1c57a8c89f0cba8ddc7d7ad28fc3357f65e0feebe2932775d22fe1abe0620f2d5c2d25f2c8a5b905ccc5099abb806bbd3534e7ec9ee7628e92f39c08b78293611a11f2a400487553aaba1f81eaf20183e94e8e9278ccffc7ab923a7078eff33185a4bfc871539bbe8adecd9a4668ea70db377dc776beddb624ce0e66022beeb1b11fc477"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (55, '{"ob": ["15151515f6eeee38892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956c583f61fba77f7670c28a7c0f0b56d0e5a7c80025ae9d0654022515f4bc87d74cc6c3ba62ec96c175fa8ff11f73dace64f6008883fb50c447de09405a1ca7d091b1f7f131bb2f6d76c09d6d794fe9485ae4a519be034b59878892480acc6e10965d987dde18e16d2aa31827ed9b39096393578349621c8153199d8277b1eebc6732997a9de68b19d1ae788d56a17996c19efaa3272a666af6ca59954669bde7682c793e242a718a03345bb6fc4df6366557f56d7fff0db69977e024af4115fe7d5d13e0737c7be4a2dd4c06f5db2701e633f3c566e7d6555e340b5fa8e30bd7e69517db00ff482c00e6d59613cafda7d2883deb7478fc8dcdec174abbea318041f20e90a6e17cdb3f1fb96c4c399a06ff63ea8035e4730b8c3adb115bd8de47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (56, '{"ob": ["15151515f6eeeefb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952eda00cbfdf6555abedce1ae459317e687453ca0b15f27e15a594589e993c2b6d823406e447b8604585e2e0ab4b3171aec6309287c189b9d3ce99dcd1f637b60ee1fae923ac740d4daa713fd62d042da0bd9be818970a33b24185754b7e1f709515096b3e6cb3ecb8573021b65d27fb2521062b4c509e37a022d59ac0b8528bf1747c00be8b9a12f95ff4ffd2aceabfd794c87696d7231c7c2e5eeefcca047044ba05d2ede735456418a8c1978fa20e6051b462c468fbc9bdb8667f138fcdaf90a12f5eba9ebf5790e692ffa3b75881134a10362f643ae34295fb02380d95a2da9ee63071002c0609d977382ee60aac3fc47926ada81475a4ed28b07ae420be132716d9035b36327bffc50b5226228a6e0290b4c93a669e1d8e0fa8f0e9e8cf3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (57, '{"ob": ["15151515f6eeee9c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d546608ea0bbb0bcfb0028b9f18790a7762094137e26166aeb87094d9dd167b3ddfe611409db4a964260aec46aedd6dfc1e749922065df2cf4f3492b8faf4f9be3f15d786ff2f6cda4987ac840d82720a66a8cfb3df2232f3a77568dd0e984b79765320c46d5be8b9b51121bc3c3f6c3bdc69e0c2c8e81dc6b8f0fb9c6d9a6cea7e1f36738d31335a605fc562a0fb44071b8e21aa31f432fa4b6155e85a06d8ae8c782eb169f586fa4d998bf0680d14fcaa51b8854416163f1ddca436aa52be4e6bb1bd6d683f80f7de79eb15b7da1fa6e206574ba770c2fc81ef44aa6f0c55b43fbad756e485adc0f8746f16b67f8a47c1f251c59ca5c20ea0ee4d7e4c77a827a01e72e2695fad8ede4b16dced069cee35f3ece4ba9eb2e32a9e06dbed797ad"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (58, '{"ob": ["15151515f6eeee66892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dff6187965d4d68875b2cd5b7366699db5678bab70f4ff324d0d0c35b39d831bff50ae979bb272018b91920a9fae5d6855574d879f4c77e769769d87b001ef9b21767fcc7504206ee57b360d43bf77a0ff2f5d3a974e542c1e2693bc09d8df95550667b3fde5108d604c61729fe91817885a822307cf322c3178bee4bf8e7e5fede9a89a4d919eb8cd7d7fc059a818b4ff2a1505c965e2dc5de0116453db2c5fc90858fe88ec0bba6b77d7401a3977bd27c4bba77f8f733be053ccf39ec0691d4465e2fd00f425849d63ddffc11c0704879318e2c52bbe95efb2bf1d4155b49a50a96422338ee3e69a70834700b74f9324c9d741a4ce37da559c5563407fe2ecaa0158817d633374e6303402d6ffe365d5d3d162d008ad6d83e7f556d4a51d32"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (59, '{"ob": ["15151515f6eeeee9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956e7ad0f7c5d490e046078c456d8f35d2e4c5722ff29a0b9949161f165a73d5a78869794b42dfa1b669c6e3c1e3d97b2c165d2eedab9d8f8bf9e8b83091c88152bd7ed427e79778828d0c444aad2ba88ab89a3fd45bf853d0de69118c3589fff21cd9382b7520af2d70510ba8a888628cf98040e9c3173c4367a346780ef4122f6cc71f45594a4d6c3b1227428605e75111a69be3c7691ffa00707e0d1242fc10620fa36f4a8d2a294a27f12beac6b98f2503da59d4d3a9cfe7a80f99002d9d91b3ef9ec54817870b60d5ffe9bc5bcb6d8a12f804ba6a96fe052f3ad910db917d73fa793393f5bc9285ec55f29a9cae76989c2d462e2920ae0b6da8b1aa02cb20bb56608a7faaa8c46a09272407558b03848fa3174e3a6a8e3978742269414fbf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (60, '{"ob": ["15151515f6eeee7d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459502fa92ac8aad6056b0b178926ce1b5542d2e3fd4a9f8c3ef3cfd2d79699a357c113d1931fc08ebcd596ac4c899615d65509e7110cc7725df5f76755aedddad59cbde33439f36e55378df7688285e889f56b98793314dbd859a3228e9167b8c3b899a13a26785649d5cab269aea2288edae1880d9259b5c026fdfd81de66a7593eb5906fa134d14bdd78343ee0eae23ba38e3b1318c020082f7e596aca4c19688dc550a42d6da878fd718b2d88d6241a2d0bdf870dd87da45e7107465563f261e9aa9d81bfd0ef462084d4e74d0006fb5909d7288551375d3a766166d937819988d358c65a2ba0b6e44c29556d69bfeb3f284f5184c32782b7d5b2138b969f42769f5b45296982d8b2aa6360b196962abd23f9cd31c619f70e7c4b9b7d515c24e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (61, '{"ob": ["15151515f6eeeebb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595824e7eeec148c02ddab8f20c77e96fa8a49c35811d7850f21bc6bcdbf0afea4501f41e0ccd0f7181254701cf2a5b4f201777e80c27ab0ac15408b7336dba2a9a184fc7b9a34566a0ef2a4417778e76864ff49fc617d7ec89ef62abec72de40310eb176bf5f116a4018aee51e8a718d1e259e5f02c1ae3653db7f70ab7a0ed973ca6f5099035c731e2862c1f0842a0d3451687302ffc1a6f32c5685757fc05ca2c8122a56f54bd1cfd02902039b5967e4254bb13973e39d118dfd843e2d44a3e8991b16c9b0ea216622d697443880dee13d172d43d9a54d7785622d7f0fad01d4942f9d04023b18f7c8ef13c3549136551bce8e2f1aef67bb30e9cccf5fccc0da10c51884745d6401643e8ae64dd6e82c520d07bc92e203d5a61c501b5897948c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (62, '{"ob": ["15151515f6eeee1f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d9feec78cb5dec95e703717c287ab051b5f9cd7e9c27f2d5c23b3e4ed07a5ae58b6b47a4db082566b94501ec4d819e2ffdf98afc592089e985d0bcd902adbf5a3690f5122a411dc11dfb804893e37ae8e8e6c06ab09db9a7459eb5d564269239b0a0387ddef656a74164286bbd0e9e11e62df6ef15ac399a529069f20f9358c1d8087a5a120e79a2c5b6f8232786a2110419b5b5999554d91dc89c35f25f33297ad14435f850ece1b77a3d9dd51d8ebad10edaf2e9436b8bb475feea814551cb2d8edb654ce045790943ca8202dea6c0f49cd9fccf40c7272c3593438a8659120559164a256a48972a00ba9e0346390f3804bef3b841946e90e99dd9d48f233156efb90475c28db5f7318384bf19d72eb29a6722557f7df50cb54ac95593bf9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (63, '{"ob": ["15151515f6eeee3b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f3456e9edeccb3bd2494072e9a394efa5d1675b4dc87835421bafc42be553b7970b8547b63334b067125b44788a11ae0b1b3daf7843a24d0cf603d8352cc262f277bde192d09f027cf7318e64ddcbd66b47d5b30c44ff13a570748a90a34fa3657bb865e1d092961e4e020d547dfc00c06272394a36b27a17bbd0b44e14531e804663452455f5d9f2c396f9a9c6c409976d450ce45c7a9381167ca6ef56175ad655d16d51f677ad5eb2e0347fbe907bbe21d41b2610fca8b5e7c12790f8535c7eb40a3c8490f64339ed16d136de1afc5109a3b773722183054cb2868f8c7e380c87c6daf8b39179a85938d3fe46b381696d16ce54685542aa2cfdb2f2c3e3dcb618018174ae28329df73b978b5c70d9d94e21d61d30b3eed5b972f3ec89ea080"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (64, '{"ob": ["15151515f6eeee5b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595539c9677b67d4aa02ae951fc8e4ce72be074b45662fcd8b2fb87a0ac3ef29b2e5045fe0f5a1c49da16639f518d427a0d0c02c5f67df822e4a5c1e19dab79a1a753a395c4b6cd4c16e9c82ec8ce597ef293e53b5fbac7af66be8bf918c9963750cec6d5af42400006019054f46339f9c5b85004270945a7e36eb28760b1e6d23d861a47c7910ae79294736bd7711f322c405d10b342afa2bf25080c9169af0a6ca6602426875d948feefe67bc3afeedf7ac21bbd0792e1dc5b287a8847ce98a1f3f4e4291d7a7d33cc5f8d81da2c6d42f1f4bd797e19a8c42d9478d7eeb207ebdd621b7b75e39b6fcf4222c4138df523ec28139ba0231ebe79234cee024303ee2d1fb4349ff42d48e115ab6ba9cf29419ce38accc5462e1e554016c4c7ef4a4b5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (65, '{"ob": ["15151515f6eeeed7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952407754dfdb014cd2476e7adac8296d1b3e9907e897c939d749f54fb869085d6e33b05ca3e96ad17196de22d844626bf827983e1d08b530b693eb13be363f54373a14287daca7bddb1ffc9aec8b1197390e7ee5fda2f7c5057daf40817591f83f47c1f1ccf265f93e98a921361f6d0bd70c028993f8701a33c7d7bb08605a8569aaeccdef076032bf8fcf796f3381b8c8e68bb595f486f3014bb32fd2d41119d788b6ade5da639777f4f0a04aae173c52dca0e05809c5f357b7a9d804ff7062a0faeedaa339f29870d2e135e6a6058780fc9edc55a7583f1a248850ebd0cce6a81773c9e32ecae8d493b85b6c2cb9cbd8020515650bdb7d73c1ac98fc6892fcb8158158cc1ba49d1aa3a50c24a1ccf72ded2d8232a9a1ec9c648c4ded8dbcfe0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (66, '{"ob": ["15151515f6eeee46892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45950c41e5ad049306489d47c41ed2767ad4085092b8d42d002684ef07888a7a157fe0a3c50771b78887fe04a8e9d316639fa5fd791d8473e4e66560e83a6b230d2af0d6c3d128b15ee4ba0acd1fa739ee225fecd2e51fe52b45e9029992f5f6c574a7e9f14b603419a3bc4f0605a0e1ad5084e66495aabdf593e5843622e5970af2556e94fcefcf5859a10d4460c54202b9c946f7d65d1cb96e1cd03764f9198d8192cc784b1914c5952dea098a677554c1592422ea1bb268430e9f0491c8d5667019657c396412b7b833fcbae208a70c5b8f5b5f0a718404c931c3920d5e93b61666315752329b1138a7d6c8b2c486cb91bf746e1ac099372673d9c92672b80d9fc631555ac5c0b927406623fe7310d1d8a5be8080cadf1a53fdd21e29c8489af9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (67, '{"ob": ["15151515f6eeee16892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953df430892afda958d4aed7f37c972731e69e69daa46d9b13384265a5b7a275913438e2bd98c524f5d8a5d2ca69640212f1977a731a300087084aa0a5ef9bc2097f95fecd68e125dd2d9c3323377531620454f9a9d3ed66cc35213e6d51d7034d9e4b615ed11268481ad730dd2c85310145aa85c64a95293fdbc79e10cde84831e9c7e70a727f0403d378d66e0ae95caf903988429c49fb3492a9848b96e84ee4ca3b81220c40000b6996de6fbed4ac92292228f685c90d7770793471e20a63d26dab5f256742af0423ecd20ffad40521a5c013b7ab053553623e4b9e3773f9d950c80046e17558199bbbd63f8993fbadc5a10681fa4ca616aeb9caa28286aba089b4c2d03d52835a7993255982b0a494e6ad405bb68bc228350839675b0dd94f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (68, '{"ob": ["15151515f6eeee7e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b0af0621029aea45654cd6d68875e4ebbaa7734b16ac661dbb8da3ac779102e15cdcf5bfe19bc98bff15de0c61c6fad40fe536814c007afa96fd1dec3109dc1b041f2495532a813bd33f71ded5dc56575cb9ebfbd6de5a587ffca74328ec458e5d0426a4e511216324723215ac184688348a5f65b9a485327565971cc859b2b99df8827381f4e5eb280987e50945996a66f3fbe29e1441eab412a204dc4917c4dcca50dd1ec8cadfeea4c1165dfb63679d93fd70d5645a5b817d83597d12835a59127ffc135d5e8d17ff890b9e1980c9377efb2c965c86f289fcff9733b2e1414d38403aa6ca43a227797a831cf1d9250a74608909a8b268fc94f8879652e2919b0c14a324774b7c1202f7127fe9785af91d9958a3c203f250bd3ccc35311a97"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (69, '{"ob": ["15151515f6eeeefe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459564fd95cbf63d4794b1292be9469ec3e2ac3efef8f109977a33793ec9e58f263c7283861d42edd20139518fc3eb7350308a736a2000ebad3bdf31eac44c43f5f9eca6a5053628a1b093dfc3d20e299d9e41c1b0f1f3e995ae0284f55d51d52e8addf71530e3e42dc68022d2af36ef4b6491da30cfa4008d56cfa2c010237aae357c006e6e54b2a17ce86934843f7c53806a624aa87f3790784a5413aa4ec6cac6f151597ba9763186e238a047ae75d4fe00be2b46673eeb15c4ba25859c9521817459d2a34adcdc3e1393f5c54d545489075fe38aa9a5f87b9c8db99d5890b9319f78bd228db9d47c670dd3d74748a1ade16f8e4976bcf940dfda8debee0b8cd6ccab0a1d0f68339034aea50689ab798b68df5e241cee02bef94d7401cf937392"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (70, '{"ob": ["15151515f6eeee17892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956f2073e234b7955cce71718ce298ff36ecbe15d075fceb270c6cdf24b38f3877350ac07d113828ed9cc03b8a728c3bcc2f3ddfcfda5af24e626e7f83bd4cb71a6047448cf666581ae644a7abf9b34e690f2861d891abd7af9dff22d3e733db763df978b3a2070fb64e6af752386bbd5ea60abe302609d2b629847e8180ef9726da79b16b7117b324e4c65ac85fa645f8cf88773724dabc4d167af887a457c83535271ac2d11f4c932ac4ae3c3d568a50cb1beeb8e75bedfb3c5e5f5debe439f3bd12b6288fcb298eedc01e330881c60702362e504636435f033b7f8dd1c76b31a1e698787fef87a8febb63937db0130cb0112192ee5444f5ea3e139e7524dce6a1861ac9d77cc8bc55eb338c9a83558819d25d0e46ff155350942ea683ee1b34"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (71, '{"ob": ["15151515f6eeeeb9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955914e6242a8c14203016faa4704c02124c8c2628dd5e0f0a51fb3df82cf3e3dec81b2bf6f295423462b523d155a37ee55791552bdff6758b57e7348374270d92557153b9c42e96f7d2733f46b37ea0bf1630c8e4ff7cc3c3fbd7a30fd3cd88c49068411ee2f537b196543533cfa1c64ab62fd4dd906f6d484a1cff62ed760d30ea1c2cb908b7f986953670247ad54c114b94a9321ff536a172bc676b6aeb80fb8cfc54ba357d4e1d1c60f8a9eeb2ab78c16be5ce449fb19dc314cd487ffd9c4dda73b53529474d9c9dadf459091077fc698ccc2febadbc828ba9d40101b188a76c2da2bb2e0a18d96877f68007fb607ce64a2585922a98bbabaa33c33e2463a8955a39e88d1c7f2ec543fc6e2700ffd326970c3c4ac478fa5185b97f9e7fc867"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (72, '{"ob": ["15151515f6eeee6a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595149534d2ac2821f00b75d0b46a1fa2c4d97e384c64abd715b5340f80f1fbd2cd315067102239874bc75c9a269a00c3d64674e936076c8a2439b626018fcc1e2faaff2e2244780c2a2992cc6adb5a14dd4c6bf1f01789a96f56bc6e4564df2970faf4a81670f9aaf21dcd2a9e3c6efb193b82d6ebe472c81b54cc697997dc714983fa56b3dc879b6fe4a6094a7ccc948357e3b2338ad3fb55c6bc46d29b4487ebbbc7013e16ede9a47c3aff783143fbf2067e706d975c6df1b420bdd86dedf7c3adaf66a17b432c31142f72f59be499fe96ef519deb5dc2708b653b52182149a3ab2ca796109c54ff07d4501225aa1654bd7125f774eaccdce1eac0199294e44a0ba33a42484b334d3a4a6cb581cdd7d04e68ff5d4495353e6c52d3f53087b4fc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (73, '{"ob": ["15151515f6eeee41892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f192ed84001d77bb3f9a0f8768044326ffbd96e4bffc328637fbf83b6a29241d58707b506d6d49d0c2654b5cbb55f2dd0d050940a8079ed2bf4d4f75d807091d7307df2da60f1dbd2a37973caec61e79108d81b1bc0b245b4c1fef01d959dfc1aba1d73f715a03be8475a79d48c5aaa9860d7f5ecacaea0aa2140b23f2f6234b862f31f1b83427528a224f8511c11ec838a1d13b4c20f61fc084c7f22dc4e67c712670dca008ce442ca70d0bdcab2e2a9984bae9542fddbee275ed2cac9277828e238004186acc9f89c615fab45432a17216921475ceee3d218ceb135101065fa55a5930351c49f3fd1139c999d4cf1f8ccaffb5ea1a40e4b0bac0ebba27d28b9c6cc6fe53f31642a9d6977aaa642ff81e7147af297c701653a54cb4d84fc70e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (74, '{"ob": ["15151515f6eeee96892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d25cfedc1caa671967f1370d2aeb5606fce6b6f8ceeef6840b50c68c6f3873b5345d435adcc84ad229171d35e3961a26ca599b479f95bfbb2fd4ff7c8031911ab5d02f24b6388fd75588a281b22634eeaeda20fceb886568e53bd6ba4ab6f3b646150c78959c53b8ae5380e00f5abcb85413b591233365815166096fdecf6eb58c71571694697f4a350d050ae155f332384799062cab94dfb41b02208bb8cd4b2c3b531fcf916c8dd0daba599497a4c78613d74059ff50b69750521f2bdc9dfd87b0c64e02955a6697379e18d4c49a6e3411c76ecdc597cf6802483a8fe830891b7e558da881440ca799006a9e08f6030a57cd44133cf31273bfbfabc47485267360c4c09d50c6ee50e37f721391d37dbbef49a54b8334a85b4a08b27d6c72bb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (75, '{"ob": ["15151515f6eeee71892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459569f17f2e14dc4c409b646a100d5e6e82ec7dc075f34877caff98b9190dc065d77a8f3e393988aeb92c210270befd47c3c0a69ffa6ac1903d3df371c9e3e930cdfdbb0bf0dbfd049a45a884a94ef89e82bf54e2f4bdbb31527fdb5cf1f778f9621554afcda3f93ff973375b32c9e59a3a65ce2c0ccd507944cee910c787e33bcbc61bcff058e61da1e71a4cc59d2e690493f6ded4211b051b95eb1475a42a0539e93aa1feaefbf314df0656f718d282e2f0bfdb61a6642469ad3628623abf72e2990657c4843cb1d46bd7b8280915fc6a4f4f297ca60678e5a01a6c2318870d04360323afa272fb8134c6c22e1eeac2334e58f6c8eea6ecd50f5e36eec23a68c3f67fc328bc2bbd004eb40f8882f60d678aa106034decef4eb80edc6c0d29607d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (76, '{"ob": ["15151515f6eeeeec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459570ec8169f1afeb287b33fcc648205802b3622ec94c76e138352e67e580e53a5ef28d95487664a5ec76331a91c9ce8f4595d000e1887a045061976d4bf709f6f70ede7747db88e59e037b9bb68486fbbafbd85cb4ecc168bee5e1d3893b46a4d179e92aeabc0004015d905753aef5c6c664c81f67635b90cfe3ac8f9671a2f97e51cfccb6956da679c987adac747944a830c7f223c7e2daa77c02e434616622dcc1187e10cc7d448699464da055842943636534ec3567a5f06bad8550822f695957bc298fea8b62fed2c2104f4cf1d8eb4a02082fab31397d28d5e69b57c8df8f150119cb6636170edf4e56660da214eca158d4d6a591b733832bd9875feb422da92ea5507efd0d6edf96e69866e1b6535851a134dc1f4d3aee49c3b397c1cfc4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (77, '{"ob": ["15151515f6eeee4b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e90730dfb42dc76a63f84093cb4b6c701df93ae1c8631226d0fd740f5a504603d3a2ba8bf81c3157f8fd9aceeb53af3364fa1dcbae2febc147f2f3e3f6fc7127b3b14ab762964bf7207b3480b6fcc9159808f034ee08184daea6da269cd6ca8a8364dbd9dd09ac1732bd508346c163085a407550081f3123f8e75b14f5bbce0fe66ce8566045ebccb1285af3e70d381a177ca9c14f52d39097cff12915be66d7e0fc3c7953db439efcc7eb650030093af81b9a0211c2ebb7310feaf85f257ac55d91356a270e6f13ded85510cb02388d103aa2926dcbbcd9a6b91dbd9fc4e9335cd1edbf2e788e51678e232d86871b84d4e769ca1a02769ece5325c1d6170d76cab87e65221dbf2a89407c4b3ae8e76fe06638182aafceaedf1929cce40d6111"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (78, '{"ob": ["15151515f6eeee5f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459512dd6bd96dab0386ce8c1be77c58478c4e6ed285e143cae4195d5d6361d2ab2a43e1d617954324d7d659e9995b077b989b4969b31dc050d8d8dc3fcda41e8e17ab82dd8f6c148daa39290415fb03bb9983ad0c33e1036f67b78b6c69c667881af6d2adc1e1b5ee96b216afa84711000043a3238ceabfaabe30003fc1d253671976eb955cf698fe54253ca5ada6e7ab54d1e14094ba53b43bf1dd0f1308a19e1e4e05ce82f70e2a5459f71c09a9f9084f79748c2849d6cd93bf53c6822fbda8965da88f1e4a94a85b040826690f700028fe142348925e6c85c3f10034aabe262d5c3a37577924bbe0b0939197c437f824cd19d2192ec24606d78fd008662b45c374fb37e3657f1644534c9fc9485f78f7a063250915cd6cb6af51989223af135c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (79, '{"ob": ["15151515f6eeee1b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d15f0f4178a1a9686754c47e33ef90e24d13e0be3810b1c705fef03e2eb7bb94f97e30b71c90645dc813533364007a5aa8a5396f4431b9dd926a30dafe6bece6a41470ac264664637e5f168f079d88dd2bb5a909ac4b8cc95b65884b573dc3d910358bfef8a13c9ab7d709838f302587469bfa3ac40055f540d9b3b6239b76a25bdd5ba392bc76191d2bad272cb3dc971a4187e8a4ff616e2b648f193979d08404b81e21b29221356726e293b2b43a8f6c620f50cd101468bce4f848f39588b14bfd437f5262cda55ae795231f60816141ccea02325e7703408a05ac405df708490ed8d6b2f3b12a3f137a74739ea3c3f400f816d882213e624f70ac853dbcf0ad9e33a52c86495d2d3d132b05fbe5e4e1ca477131215f784483f0326b9431a8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (80, '{"ob": ["15151515f6eeee9a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595aa34fe0a2ff2e20b0d44f5fb0555c450f6b3b9b538e16ead91afb29e01956d1fc55b6aef754bed13a34007f6c62c9c1894e547193a440affcdd1369b09996dcc71333d129a8de333a0d6f8776287d223cc9dfa8d80f9c90f88a24dac19f4209fe2ea548002fc24de6a4abec6cc1d1f25de9ebcbe2eaa652f3d6bb06365503fd4f6de60a98de39e1204aee693526ddf7db75999400a85dc2e7720b3a6a079968a3e3afd87501d8b506e9e1ec9f4d4d33a05e3a6c8211b934dfd41efc687ac18eac2f61beffe0bcced26fb0da4e91ea459552af4ed3ac6c1359867e2aa12119961ee6bf250c53466ab15a5b13f71de2fb1a0558df86ab0b13439c0e3c46293fb7f519d5030ec2a02a7dd74b2efefe7a264d6fc6da41a25461751b0dcef02c21891"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (81, '{"ob": ["15151515f6eeee93892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dc36bbef52baaf33e3f15fe37b487194b66d586e72d4062adc36516741eed5908bd3d188f0e08e46fcc64c5d2a3f177959b3d0774781cb326a9462d486971b9a0b6f2499889f283bfd2f4c97f1ddb5363a9998e733e7e90f571be4bc80a08c09e17e081c1df9815007e32d651f312a1d3468d4a91f17f640a2c324233cd259cd1ca8e84b9c6f0869fae4fe6b4bf1adaa8435c71b538ee8e68e1cf2e6d5757a4187ae5f46ff700c7012c308211c3660288101cc41f3b730728658fcb57251d5fbb08923a665436637c3ab732f2428a11f886af00eab773edb7b722d36881b62d2a8b2484178ae6277c5b88192fd54822eb38bdae5506702c215386305458f05501985df240f69302a0465dc72cc271dd5681dcff6caaae47a8935888f5f7750ed"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (82, '{"ob": ["15151515f6eeeeb3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f028fd2321a43241a78f42dc50512bedb8f00db30626556225923df6e864c932b7b0db3a7419784a89ba1f13d244f262e05fdbc82551d345a4cd2ecec158c54e62f80420445d75969c45620ea3eeff627ba9afd0b9a4b9c9a029c04d4b90f0f7a0e7b918524808fe0883faaa07a49feec0170bd3d66cfdb565074d78ff65887444852c044d523e285ed652b7d7590103ae17ce72c64e187124a4f73e171d5b8934da91a937972fb6973488bf0b272d5811940850567b303591258c4a31049d39e80f10219514cc42e7161ea445261c285cc29eec7ae024f994fd9704b4d20161ab6a01499469be7d628a4e5abbfb17149e23b5abb56b855251226eb8f8cbcddc0b6a8bc89224779b44df661f31ae6754a4324fd73714519f734f652840e6b106"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (83, '{"ob": ["15151515f6eeee02892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459535d3f4ea74595b8a9d649cba1cb1c61d86e11f08d6707924a69db8e557bd5615c9c95b265db7ef2d291c7829cea9c47fbe4972e245d2d7a7744d10a46b314b5b31e3fbbc5f606b0d060e99e81711b6937584d32ec6e13fa025c545885c2d1dd82617477b53149abd9c0d1c2017ea3a407bff59af89f5dad130313bd04a5a75fab1bdef15db95e7c819163ebeef8d8449de45526b0e58e646c0264fb420b0c456746f1a7af261c32fb81ca51de3ed2f651f30c1eddba66cb215d474c4e7555abdcc97629826df8ce98fee7ad89791904ed0bc1b6fbba0ee93882729f858067740c768fb83924c29278ef8a25aa3d3ff5192bd2664cfad2edca89465ed9053b243de1ededea227730bd363947d19f5140ddf474c383cc68df0c19de0ca9560ec1e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (84, '{"ob": ["15151515f6eeeef4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a0435ed3879023590fee69b1ca553b37aa9570c41cc23c006dbb73ec6fe574223c4540cc7d82fbeb193bc918d624d0231dacb18c43a01cbb2d2a18897514193339869b98061fee89dca1d32ecb7e06ecb9a6bf92826d8cef2e77af48f8d49cf06de7c20bb0520dc9bc4a6792044a240a25f77bf95e81117121d4e6c8b26ae6ac9d53975fbce0d2a5e32d84e30969706e8d4c5a80ba968927e0b150a5de52f6fb43f71099c9e927218c73aa83df4b3e55750a282b8c16a1d0d560c631ffc4e1f55326491ea1b40cb30eeb4e170c385c2bd4484b6e108798a801c3aaa0da01907512e8a19f60a9bfd43177ddf3099da3887fa5e8e3654a1095f585f36c6a88634040468ab83b46033950f9b74fa461f0bfb5e290a53b27d1792d60c5257603d00d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (85, '{"ob": ["15151515f6eeee90892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d072b2702b2fff614208a34d678eee33d126c6bd104770c5650f9172b96d5bf40eee0d93a9ee04e49ed0bd6d6e2f1d3fde7e2062b48fe5a4e1a2a7cb5b9a87ea4f9794c49d8cd18b6c65392aa49e663f15165a8a3e490c4518f9172bd796dd791d971ce2c8df6e0f17c66632decfd68b4f8f5cc2fa686d620c347b2859f4c3b8aa9cfedd1ae91e7b5d2cafea6141fbe33c14e56e81cf8146e0df9c8e84701eca4b8c908e5b05d59af6a76eec3a63c9baf4c84cb1020f2bdbb25b2ce3329b1512508400a6c235bfd46160db678514f2ea951c0d03dbefcb59e380879c71187991d8d1d5b3c48181260b5c6fbd80e4f899b0b3f50105b6b382d67551c4afe5d9be740d970e6502769023b6a7a59ba144e3515018c9634b96483b8c51ce01a514f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (86, '{"ob": ["15151515f6eeeed0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595626171e8b7c68cce54a20a00b7c6eb10fc9638d091e309874d7084b771d9d0c4fe5a571465e056a7f4ccde5d9264c9c35cb346d206aaae3e44023e1a82b28b00421a13cdcfbcbfed9e6da09231159328ea221f7a9ecb8d5eaf7ce5b7e2fe6fe982e5291150111b8fd0589ef0b4f3ce30058d4c9683050fa332718373e3b05f8c9545cd688a50f6716d569a770993401717ed641062972596ec52119824026241109e0b041321e83d8401274a2b52e520279311d5465d6eeb828cd06d31754bdaf9fa79c2333088f31e586d456c6747ba8c7b7f870b19203736ce5ee93ea0fc1b751d0c9ffe0812bef536aa61c968365fc55f45de0f41b1ea68935d81ec3952ecd19efe57e07f16507e382a9006eaffd2e80d17bc16dd12a731869c9abac1a843"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (87, '{"ob": ["15151515f6eeeea9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459523dec75503ffcfb0bbf3cb15348eab1d45e9fe83c16c5fbbaac297c94d0f20bda2392460258919453b98d8c9d3ac7acf21c59492054716c96eebb18fc4dbf0e78c225f2ac6c3d5e240bbeb5bb7cc396d1a3c5ec2e122250431b10b46c9c696b8379989968ec99249734a786144422383084f3ef36502b22bc0c5f3114cc2bcaf58dd07550082b6cbe3106c035b806c04460fd4757effd28a4a28446c2ff4364593ca2b1251510b082a179db40425e8085e4b3de8baf13d42a103953f6ebdd1a956f7b1e3be01d839fd86ae10c604cbcb94a492beea0b935f713857f1d7ef23afd5b1a76ad008d296751d759d0438a7628e2a7bae720368659b00c056da5f174ea600f1c9dd2c5f5d43a7324352fb1de49c750ce67f57aae3aec4484e7a7a6b69"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (88, '{"ob": ["15151515f6eeee3d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954e2147f065aabdfb25a711f4dd0bb7ca049ea3f9b278084e68d6c55bb83473dbbb4b02f84d3c2c224935e303bd82ad33c29f6524d2cc379ea3f996983b8fb24065a18ede3e792a294ae8b6bf2f9d5358d29ef7493ed620e0c98687224c66537a98ee241a1b507b892752c38051d96a85d1862c8e89a8e09d8317f843c65c900a7271864239d37e2a903aae84ebe4e675b37596986a248ecfdbfc8595e0f4bcf7f1856b18a64c47d826aacf1ed4a716b7b0266a6001381576069c6eee9a3148d301e02f8c9a3e1a7ad5b05c867c9a4137d277afd9014a6806610dabdd4ba4795cbcd934653d1b157ff3340ce0ec330334eaa20d03f9371741b8e6c1751963e10cf822ad986bd2d9f4c133f2047937906c27d18f174b86df3f8fcb2a7a09585e36"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (89, '{"ob": ["15151515f6eeeeb4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595115eec4445d6dc6d0b29274da639301eb30b23bcd756087e90759ee79b51c00ed58941d737d0476448ea1d10ee4959cfbf0eaea3407063c1281721ab38aee0accf18e0fbac8a4098e1e8138e5e4f024110780d6258a956ed96dd24b24cfc05d386d2113a9df491f42103412af1a64ac2dea164381f8ddae3257b8cf3a5c69966e52c5e04143f271dec8e2bc35e00878edb0f60bc9e8c975eba6d1b54e8212a822fb6b39086938b6899b2d6af881d8c17d0faffb20b5c9486506c1597cb4a6d101e532d14cef7ec37da0e62a093d375943870284301f936fda5e1653313309cb50eb38820af50a02291184f8b0e5bc7ee1236fbeacbdd673651af7c4e7dadaec545602bfe0cca1fdfa70ea7ff04ea3434538b86bdb927c0fc1e223e4eb292d39c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (90, '{"ob": ["15151515f6eeeeb5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459599df1a64e60c5f1c171a18876ead141fd44f3709394778e3788df549b576537dd6d299b3b8203ce748fbbedd8624dfb948dd2807e404b5c3ee2f8effba164fd556a897be3d96bde963cc0792737544c009e03b53d9d67ab0edee998ec518e27627f3825ec4a26cbbd110d4c2b1052fd565e93d0faee90c7bcdf498b954e0ddb16159f28b9cbb07ff1f6c2fcff058309609d12630ddb04e64fa6838c054e15682d56ef303a47c52bfbbcaff4f27dc642e91cecc69a9b8d832d3a1e20f047b799e226bed5fd8d0274fe5f00011349ef6cc549f2fef309463bc7ea6d2d42e0c56b76ef60ba23405cb44cb7030e06c5b3d6adff46957f3e2b1dc109a873a2bd0730a8c0680c0a95ef623589fc53e9152d71f1a037a5aecd47b3d645fa8a82a28f9e7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (91, '{"ob": ["15151515f6eeeed8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459531704a5a14d7bfdc2dd903166e72346fc8e1baeb039760132f444c999a060d45a1df850c37237098557bdff8eb13ca1298ab4f5c72a7b337bda6871a346f0e3ecf36df66c70bbfa7514cd847eea9ec5897fdcdad933fce803808f6b96f2c0cdfdfc16bb49b53ce94d36f64e4fc4b821e2776a07dbd5d15d6714a4a742e2ab74e26b3b9b2fb185661aeb8b23e13a65940a9ce8a39c3c4026b5f643480beb2141fc46e8c7aa1d0d7f1742ec1c57e5d1deed6a942e60a4ef6e218cfb3d0b4fcdfcd4655aebb8e487a987b70ecc7b91182db62d67e9e3c7a6214ac469aea5643fa5e74b296753ebaca5d699a4bc28e1f13d75ab7c95832fcb1d14f01111211673afa31b8fb65304144fbdfee04c21026ded4878055778b84f4ad6cb5dfd84d90c4a2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (92, '{"ob": ["15151515f6eeee50892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595386eaa1933499cbac6cdb139a7c34b2fddb131bcde10e0cc4145b64a658933de8438d63fa4b017398cbb7c70873f9da6f1d0b825546b802f34e943efac3d911c7ffc06dbba2fc4b3871c34fb27528026c8da24701d2e8030fb63f8281a68b671932ed566ab0055bd3c61519929987f790df4924dfd9ed64776c4de85d2bfab0232fa18c165fc17bfbe247cd1e53628e7b8e6e7d6a035091f58302b8778194553bf37766dcce9328dbbcc7fb03a235d9a7e69d80e557290b499224147c653ca5ba40071c60b7828772c35d6c72d3836c7c72ab39fbaf135e09c674841861872b07ac8f92b87f891161ee6df7d43a4b4694b25742cccf77b80df85a1e13b215a5a7ccb018eaa1e1f990d6ba75f016e2e5f04faf98400e09ccb60c1672641c06741"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (93, '{"ob": ["15151515f6eeeea3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954542bcfa2b5106537310bd19a160238e17505529e4cf73389bb5b6c6b025f9c8b7ab187de21432fb04334e5a0e86795982be61780921dcacb560cd5a41c595fb80b95746b11a66fc2d01d76a869ce620acd5394f2ac2a3bddfd46e8c5d8e22c0a6e044777a05f3155b860d85b19a611458610b0b0b9a1248d210060782bb6f4b08e07770253c5a41fd90c22a18353e2f1443de6a3a927851d82cebce8ad6234345f04be92fcea12ddb3f544dd94a092b5b455cef21dcbe521f1f7087310930bf3d7f84fdedab176017bceea4068b7b980a3f1575eee46d40ecd29c624f9c4a32d0e2151c55d5905553a59483f15ecf6f282bec5708b376e1bb05d17a1a3920837021fa0e6b2a86b46d8adf4f9e76622bbafdfcd929a043a3922e05a870e9e555"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (94, '{"ob": ["15151515f6eeee88892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952b3854bb3a1fb0e04ddf49381d0a29ea60508d326402a93eb7060fa1b6ceae0d1a07829329339620abf3b41ddacd2af94d1a237b9d58ffc4cd04f9a4d4ae0d8838c3ab04600fa954f72d26ba5967d141e05ac776cd7d99101862f6011cc60da440bd99dfbaaf1ab721995a3738a5b3bf6578374518b71386237559f5b2ac3b4fad2ba66a8c5de093c93e678762ceb71c37f12cb102f893a1afd7f6e75987e4b1cac634dd0fa8b38b6b8ff89b504fb636a960036d875af35ce3e7146517191781eb651a2686842a79f48cae968dfeff7c6edf2b785e703d006e54213eeae15c8cd7e4174fa37cabbe39da2ab3792341571ed2c108d6e5606847a666f639dcb7a518b298f00ed3b17950e1943674257e4e870a315f8b18130532eb275339872289"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (95, '{"ob": ["15151515f6eeee8e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956119e4d49591e2b3d16c328be300ea2c73c2ce2569d9cf7d2c3f4fcab2e62667e8994bebe0f61416ff3a311f615b6cd0729047b181b43470b532efedec2d7ef6eb494913e9b6e5768bd95a7b30ff6c8d0d7cb8ec64cda1030684fc56e7419e046f8dc52d5e7115963f6a8e2642af931df73798f07f0d78bfbbc1706257c1020ff7dda9b3103bdf7378bd633b95f84d9e3bde531517066e9cc14588e4688d143236b08360bed20bf18b1bf50ec688b5500524046431397dc422a79b677b9e9a394627c8f3f4ec44b5612bf65a291c025559c4263f038f8ac9579da92aa79966af00a8ef8354c9299d7f2004789d69f929a6741103ea875e1ba3515b47d5e36b52d37e48d890c1d0e612b2ffe3b142b32d1ec8bce6195d6fba7b1e48dd405ed8a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (96, '{"ob": ["15151515f6eeee8d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c75f7bd640da984b8786b98792075c4f7fa55b0ef9e1e15f0dd16d030e1b91863f501037a3d71bd5839752b44b04ec2e076a11db575aca50bdc92293fee999df6f396a3446c6e18fad2f9aa58e41b3cd7cdffcf8f2b094ac4d023431c96ecef0e6cf6e969de7d643a1a439700b210020808a6e5dcc71e951a6e1026a55d3d4fcd34847274c6467604656fa8e821003ec43bdd1b5ba91123902aa5e912a9f5ad8fb85520f618a214a6688053010d0defe12aa869f2b69649c124a9bf3fe8cf7479499ce0c6098111164ff3e4884bdc67465763fba92e0ce340de3a2189db7b7afc77a6afe324bd3f215503cfbcf694b2018ee09030358b759ed3d8fe8c8975f55620426ad7ccf7135ec018e3c92f6532d70a50216aad58955e52e5237bf0880f5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (97, '{"ob": ["15151515f6eeee53892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459570f23cbc00d0426fdc6ff07e4990e7a2bc88f90d60edec4e00de1f9897fbdb8363caee11279d37860739c003732f6110a65b6141b80cb24fddd2f7f5ad77837e953f142f05bce717a20ac8a044a88b3518518ac50f3f52a8b451eb78111d3f1e41fd4c8265912e9124e39081b2f13e586fbbc21f39f662ff072f9ed618e4d26a7d271b6064ca20659d6b449837f5c385464cfb3bb632440edc82f36beb799b80f2b6cd2679d939c6081d1205b1de90c51246c09c7410d3deeadeea2aea63b0e51c2cfad71505081a7f42cc0553e2d528cc55f00b652c3bea51091a2fcbbfe86aaa6ae49ba4643dd3524553963b9bfe706ec3a1da4f2d58b307a5b251ae437ec1cae6ade0664cc39799292b02b4dbd4823b44b28ac5ce5a63aa805964c9ad5608"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (98, '{"ob": ["15151515f6eeee84892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951445cd67de5f5f59568a5fd4b0376bc6726c77d8926b318c639dd0743b3da700a5d621d63d0b9e16f1cdecf783d5b76bd03772c4f214acd0772c006a1546e5b75a6c6c6532808d10d36882d4ff750e27d0d8ca32cec4033756e9286e9bc10b6b6b6b412a53ce1f82cf6fe6323c3121d71c112e2c17097b0bb8d7046e74849aa2330bc386fec0626af91251a94e2cce2e9025b484b8543f2748cec3d285b4c56ce62e029d84c9e2d61cc6f68af09b912a9f2d087ca650492ecd7648a9ca4b68f18f06d9c78b79786e102da0015c08bef0ab9faf788c1f112775a0b1ea6a5e37bd5fd4b875350061ff5bb4f3b9c84eebb66f0b8f9d856806c81bb53514df227a504bd61b4819057f30858c5035948b941f5f09d9ac2c180c8ded4d2e0e24fc7c17"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (99, '{"ob": ["15151515f6eeee0e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b587eb9f17c279b399c77aac31cf83d848588f2187240c6ac9fea7d13ae6261361d36e8834fb137a71f8de7b8178e4884e0b4e26a9d1f3f5aa36f0a77ba6cbd08505d6ea94074d7c4f1640e9e27caa88511bf7a65d4d88594c69762870620eb656fb06ef59befb04114819cdfe9059e6395ab0d9eacc883e25ed815896c8f1477fed7f97cf98db197ad972feb5e3c700a494dec8a04737f91059cb7f3c364185475d4f809a919430cd3343cc9fdbca688ca22c33038f8a17b8b3809fba8e21bf219657b151b39542039a231314819b9a5d92413139c58c42c39c9d0dd17b71d571c68630789c2b824bcd7427bc91235ec4183e40f441808f07b5dbe8f3ba33383850f0cc283273429ec2564d43d7e8b67c06f465b0920f7d0fbc247101045928"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (100, '{"ob": ["15151515f6eeeeba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459550f6c0dffad3ca0d8539e681ccd3ba9b26e500211003481a9701cbde6c04e6088f8eef34711d2141b99e7befe2a3c3e6b101af02403caaa2c8c503c3eb87e62ee0b5b53e87b5f3175c66633d03c944221b8a9efb35bee97579f7a9026a8264d8c0aa2b7a3782e211e9916cea44e3a1cfcd6d5d332ed9601c5cc10107956412cf1b8ecd3adf17de36e3b27bfab12d3ff603ae4b47c29c2dbcdbb38c60e557c7a7e82bd65c9ffd7a889600f8810c6d2fcb7de74633e68bd38077e1da17ff02afcd37ae454251ab4e4465b946f5c162c4b6395cf7164c9b98d4d3b332522f7876a40c5afdc6665a8967386de69399d78fd6aa926d6d2e72b0c3e112e6dcdcf679c3d92a30e85d6517d81d56f90e41b1b8890de3d9c6f6971f0405cd36252d8f1ee7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (101, '{"ob": ["15151515f6eeee29892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958ba2cfca121e1be2609a0693373d205a0d18ef8687a871279e469077bb9a33ac3d49e85c61a8f25a7c05900809678056fbbd0e4884ab13291788d671b5f9e303d93649e01b235a47101ebc014c14d00485788f5109ce67fecf294730f043fd0c58db71bbfeacf5f45561883af19557c003937b3df865fa5d751f2a7275951d07dcf5817a2a062b5eebc1dd615fbfa594c478d8ab9e81311c97fcb94fb3e22f4c8532f67fa34d7d1ad83bedd8a03ad3eb662082d7459b7f61b9983b2c1bf5196b3f99c80fba7967db20eff4d9e107fee34f20c5e9a93fbc14bf01319432f86ba771f48b6045d3cff9e4aae700ebc51b9ec155618230acc0d3f1608128258dfb8e5cd41fda7d079eb83d6319016efc666bba64ec7649821a5a5b489bdf436aaed0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (102, '{"ob": ["15151515f6eeeeb8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459509e9099469b1db46b9721276212cd4ad15a96a252c26b77a6088fce6d85d14926d7dd8ee88ddc50de80aef6d37c45e4558fdadc0e43dc00e4f0486b8f3931f9429c2d9983cdfb6350afe7edd425104f9c7885be1dfc024ba9fd135a0035cbad904abca4815dc9e8df8aa65e262a370bfd87e60ad2aca0d7437ba29b4a8e956c2911ab480400529b4035b989bdfb0026cc9906be515f09f6caa70bdd092862147b109d621866401a1ca18cc9d0ddea9661e67c8674485094f4f83f984d7d5725130bd2528f84a3e64bb1402013ca364ef183b38a80cb92469444e6019446f5c5f3ac176a83a546ef4981ad8af17a7c0c6c9136a639391ee275b5588b5032578a2e71c508fb2d3a7e7310ff8cc3fe5103fe64579bbaf1698ac94c5385640bc67fb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (103, '{"ob": ["15151515f6eeee4c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958b7631cd7663af86e98ba646665a8db69eabfd94b575da80111317263ba24bde931bfea240d4925cd64aa253bbc6a55d2b66b175c0e6d7d402029d139cb411ac4c0b0ab224311d1440eb86ac3eb029db277c09aa496aaef2285d4e40dfca00c415fa598adfd2fb7771e59e27a45cd2670d9d8f5de79b34b8a4b24f581c3ce6d19c81acacce2995654254cbc5fb29926b043730942b5f825eeea11a0da4f94fdcfcc365d4f8ee178be37db86f949890e92b71aa32fc3d7650466e34aa6d5c3ef99e10277cac96998dadb943ca63bca0867d3fbc6926b1d332c54935559f4b3e2e44157c9e26d57acb7a09d8fff1ecb898478a771aba6db4c531069256c77ff6f1aa6862062a34ab69cdff663d8ac74d84c8b1c15b2da64bff9e9f06ba65e9e958"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (104, '{"ob": ["15151515f6eeee5d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459509049fe634bced87d1d90a41c7fb3c8669c3e7c9bee3f9a15f2dc434c940900ec30c035f6a7deb6b4447447e66b16bfb9f3b92b7f54ee74ab7d90ac31de5772b87fd1f9a907e2b37afb67fba51bb4fb10f7b0a6f3db7e96fd02f7798ee10d1ece40e71bf33e8e33fc03970ae7feeda339c4f1d3b7c8fe2b91e4f028162076ef981a32a81dd5cc0627bf4665939085b480b9ed12d816e15e1eedb7dd58bdaee4346c0b757944c61a682242c885c0068a7aef80a8d7892cd192c36923e608fdf220a8759bd81bd79d70dd7ea9e0ee3527dbcb7f312861d9f6324bd0fe0a84d4c0d0c3c7cca8de9bc6a60aec36bffc203dee3033f1ccc93bcd8b297e063d7198cb675d9adb453546384bd34df0a79442e225f0f34c19129f0026d5251f35e850bd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (105, '{"ob": ["15151515f6eeeef7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c46c160f1948278168e11478f9f8bf0cda8dbddd977ca459a6468de267a9ce008b374a7a655d195d3abd3f39e9ad2b30a9d0572507c0eeb3d1646debdec9393026fcd5ed37c891075b10d73b213673e995acaf2354444680b09d22809109299125345bb4443ca7c60e915ad54efb01e8a4d6cc25ae32e5ce7d8c902511ac9737ecf11993843a479ca894766ec70e328b8a55d2d79ed89aa94b99f74d0d15868000208ddca44712ae9af716330981ea6033aa5d35646db9d034618186bc3c0476b86fabff1b71591f67d3fc8bfee05ffabaf172f80c53601d28a605b4d0d254e8aa97a3d3b0b8eec4b46c2d77e513d10cb347dc3d24188735fa2bcd7404c2229ebb75779f3ed625786f3c70088f334ded7db85bfa6a5d509b630e7f3e6cb999e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (106, '{"ob": ["15151515f6eeeec1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459544896e26220309f879a83647d5e311bc27556651bc0281a9765e9aca573e89513d23eae2e1158e322c34e29f962e92ad2feef3ca0c247401a3823972f01ccc2c04fcb4d2a104c9fe52020c40e19216a9ab284bb06a453bbe310acb7a5f9ece20b9c61f51a8dcb40948d2c1b5e8eb41b7b02db304cb995dd40ae93462838121d463d4a1a3094cc8d3f2c9e6a0413f97cc0f8131350b37e591f25ebed1d50fd4eab6169dd429bb3cc5bb09832516634925e52323481073e51e414d327619ebf4e2a80a933904b830625c795394fe47be471739a75d2a1b7da0fca4fe573eff10514c05000a7207133d86430fff97916f8114c8a8a876d391007c62ca3879903ba52bf488a77a95ab289418d914c8161e74e7448e38171c11548eaa2cc4f9c988e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (107, '{"ob": ["15151515f6eeee0b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459548e53ed07888b61ef9a6d8b3851bdbf70580f2e72229010a496f2ff292672a11e10b01931be42584371ff95bb0357698a29317e21336e8e70914bdfca294f41369222cfd07b5887ca51d73afa3311a2b7395322887f148ede6c4a68ef5422fb69cf46b10065f3fdc58da2277c8b84c82cd3424389adbddd868c0c167536ba432239f44bf0e13a5e729e26259c21d089a06bc0a576f08bfe5e271dd69a16a624afe10ed9e4809d6f2634b89b6d2697b3e65b1609742622dcb4f5bb9eb8fab4e1a4f3212f19d926a2ad5ed8ea98e7a2447da28bbab5ec60a6632104936830176163a8dd2cbeb66deaac57fe8306cbad9e6ac4bb7c3cc40aa24f77ff447b2b0e46b659c92cd3d8e2edc6285abba8af05850aba8f89b1ad60be444207cc03b6fd02e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (108, '{"ob": ["15151515f6eeeeab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595661f323973db653639f7e3d0600dff61677d25dfa30f7d44c4eb037e90621fcc8b842797dd2d1dd35c377f6804ec817edd042f9f9a428bc2d02b21b7c6085786f385fc805a99759fcf722e76317f8173e751a13710237c09c95c2aabecb3634ceae66c8732033192872378261358f45ea087d2d932e264654ba684ae1bd8bd0b96540dae5e512f0062de789839f2c079bf1789f2e2369969499c73500c60fd3e287840e7c4231a371ef972ffaf293a6fbde2a8c2dbb37c5849c57dd1512ce87c9928410e27512e2fa235a547cb4b175449b8968446d62e0b09102da6d906f57aa1f5660ea5bc73454bd73cc58fd66c769da8596154b65209799ded4d8109a8a6658769779f45c39a43e0a686fcb8e471314e55dc270b5d4a529a2a5993d048e4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (109, '{"ob": ["15151515f6eeee06892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e4cc058ae7d7f1f6cadd8745a763b26b735ab7f495801994a9ca3a671f72f31818c1d215d8fd2914d796bfc425840ed6b05711791874984a76817cba4e6fce40bbff07f684b0775bc76a3d06fc9a9e8ec40c2af24ac7786857fc2e5d1f3609af9cc61e88934f6fddd40657faccfe474981909ff607fc85fbe9693ccfce04e77f3e7ab186ed2efa3ad2d91340f039dac75e9f8971aab7db56b3a87f0f1e2f7b87f88ebb007a7344c1c6ef220fcdb191bd159308fb7efc3d05450409e4bdc7a079971e9a925e1eef3bddaf9ed14e84e70f12f58716a2f24f66f8f494ecff898a6e0f8c527a728ed3babb03aefcb2de760aace78bff58ef131f6fff403aa0a36ec88ed58e9c640fc3c6f2b95ca2a7c968ba30d29ff9315a8db4503bc741e8684750"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (110, '{"ob": ["15151515f6eeee1c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954f49a6f04ba3fb77d56911a61e9faa4dfe47d98e58edd52220f3c158aa947391eb85162b885362e63853c4cd8df3ecb4ca8cd003c340352be08de89fdceddd2e03ed027f82ef449411a6247aa06b113970dc8ab607f4aa5cea1ebd544226452f1f31f35bbe7bd204ca167c57b5471e00090113dee8424c80a5524b0ab289e418be49cc900b7021618be048a1b9e8a1e6632467c963769d1e7374b1ab32464b176828e0cd924c33b203c829bfbf4b959f2c1583bc0f42dbdb92cb7762c791f07edc45711b9aac987e20c03d4f28f34d7fd92398532bc433ad72ba4076cabd5526146d6c70e5126f8129e44796518c42ca763ac81636c6a0b20d7afa8a7cc9f31f090f1021e1735ae4971f7bc956b95663356db5119fc6e0d75ae5a59adc426514"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (111, '{"ob": ["15151515f6eeee6d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a600757fe317599977525cf717e3cdd85d5f950a72b8db8d382b7811c5e665702d09e9a80a5d37bfdea9005e38e91ebaf59a972f13e18d07bd4403cbef302a0a53526083c038b95e68c954f010097da0ed2d62606a533974a0d94767518e059dc86789df3f2a0d17de65a22ba7244de643a300abeecfff8564de26b4382353537dda3f87b6549877b5a4fe536f4601dbdaaa5c84deec7f74a6e2b22fec4f48c130536f091417c7d7c33ccbf979f5437b8b812b7bec9d37b1582cc8251c32cb4a91ccc22d6fd292617a4bf956cff69a64645d597aa4848c91bd298045b14e831abb213d87b15a3f8247c1a3cc88b147561022ba12f4070ce22cf496f3df5dfdd4c9721ed50b28f98c4df8709fe51c2d3bc4620974eaf07eff17c69b97d6c41f89"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (112, '{"ob": ["15151515f6eeee65892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955e6b82e0cd88cb27e2d14e41a70366ea99e61bb5edad2a9fa2badf346b13653098fd4817232abfaff5bed422a1fec06fc58360ec98dd523ffc6373b1382951742b2147be3c7a6788157c84d319e98e0c7542bfbf217811ac03a76e3e740d7f653eb09fcb7d339e5551f11bcacba8f1fdb01dd33272ee2566c74bda6031fa7e8aa05d03edebb9f75beae92203c793f3c3de12d2711d01bfbdf7f2233996a5b41f3ab76e66196a1491d0c6523e5d476394089de5203d1d20c789d05f76cffc6ba10b213987c23288c3d0ea79b6729fdc7356fa05a5bcbbb27687653dae27a7b777914c3f9a9138b59a1d21ca440db01f4487bcee2effa74cf4d022b7179a97352cde115b6ab4b778c7fd047693d862ee9467c8e11accc5eeacdce7f98f810627d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (113, '{"ob": ["15151515f6eeee7c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952ef3b4b3fd5ac5b5a9dd68c21f52a60f087ae2abc96007fba75e1a15ab98ee0013a8cc7e2cd21e2df8b7465ab757508f06b74c0b4b026fa89d2421dfd3fbfd54471947d3c74d5d381ba2d3b0cb26e5e71bb051568c918cbdbbe3d98b50e2744e9de56ca45cb6c51877ccb9be959426b3f4ae145f3ab335da51a1dce161bba3bf85242eae48e25f2a92a0b4e87b74a12153a7417d945cc30433a6de160ab60f5b8ece9078f5b797c7ee2407fb9da4d1ff26f06e1c59cad88311cbe7b9946319b5af077548f6a312f7f79f24e7b67c9cc897ca0b0837c4ba6773ff38ef9d3402b1b5ca11c5aca8bbaffa484db2fb34b842c9f15ead3d92955fe4e95a58d97259a960b36a704029ebf4bb7413149e501bd23b4b3b431e9ab63339e731e992efab2a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (114, '{"ob": ["15151515f6eeee18892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595969c14de7efc0fc40ac26deacf833c15a400996fabf5ecb8d7e0a099bc82bab0e23e618971bb78cefc4261fc824452bd6791cce8a56fd2966d4974124a3b99d4aa856740a91ad3577912afca8b6e0e2e8a9d8e6f462d7faf8c7bf4dc5746f9f39eb6e7290b6c97a4ed71645066e6cbee6775188543964317eea7e3feda157064208b787585a1eac2d9fab4857ff032f819645c90358ed59d6f1a9ce251ff29ea782f1546d060acbfde8209fd0664cc7d554692ca3180f4a4cdfe0099e0fc736bc4fa6333eb09b17d7b2dce46aa0131b1814a6187400550a73f0e11769e72f0b11cb6dad9e14c3eafdb0c0b57e01dc174a8c3b6ea01121236e31dcbf79243b9fc57592db6829354b609f2c077bd822cdac455a5595b651ff8dec2069ee1a380c6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (115, '{"ob": ["15151515f6eeeeea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459528d5ee951c12546d4709e6bde1a242678e34d1916623fe7a97befea70881d18496571b05a019f0ce73939dc53aeee4692ebb155b73a0a985b08a4e933a335f6efe070cee1f105d7e5ce828e5331abfe6a1df43edfcb7bac842353f75b996afc20cdc56d7eae2ad234b4b7f6c4578a862b7e78c144473b9c1d6266c0819cc697e8b2eb82092467c6ce4d7bd3676655f5e0f67251a63b6b8d1371d4578880e669d2e48c1cf9051fa22db3959fa93aed7be7504bc3caa653493f15a51d7bcfd8a0db4b52254ed1a7446aeb42d4e07d29176d4ae409c83f4de7589d82411511c97060b0dca4ac22e73cca55e63f79158800e440e1f9e33e591aa52f6338bd7d5f2a12273b3e55baa7a495926d8b44e0881f9f44e53ec727b9a5667448d3481d147da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (116, '{"ob": ["15151515f6eeeeef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f17548208d335e5ebcb41daa2bb95c85577e04bbc25c3c8790c9dfcd840596947fe7e67b822e0972f587d36b8e026047e17ae794b6c239ebb445d3262e84d06edd867436fbe130b9f64190e3df470f2f4379013c72c55ac61c43d21778756adf17381a8584c3138215c39df177505c297cc627b0c64e35b9c05d2d08c72efb3630543abaf85aa266c0fa43e91fde027684d18fb21c7a7b962a9208c1b6a4a84b98ad46b79c2bddd1a3326381e44a400a816c117be0b1254c416be525d3d2b14cacd4b630403b1d783f446747ef1c2da5a70f77b6574f031cd24b38bbc066061fb2da6e257aec15853d668385ec354bd765d93da0222c12cf1602878bb9fd7e61f9b9ac16769ae84ac8c6ea90c9ae1df7c3f36af75ebb6205d815c566d81be700"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (117, '{"ob": ["15151515f6eeeed9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f17d2d664107f509ec5f8655f3f9fb41e6682810464e71f8fe54083d194ed918b5703222cd4e64bc5431b0782b0ea726cee196898affadf44adc3d4d2b11ddbebb1bf719843220897b1c6f468f2e7d215e3946f4ba4340b6b6b44bbcb71ae23f8dfad899026aeaf5abdddecf4769d6f9096b661806fef760203eca6591e748139a98fe28d173bc6c811fc51ea2d75fe8a2f819b433c3f700154ff4ab684024e077f4de079dfd0106b0d771de0b4a0432047c4b0774a9c678edcd3dfc1e26827e1935a35ae7c9b28a8a443f7507055b53d84346186db969b3d61cea1643188ab294f1e1665d38cfe97a09bd9d140cb7cdd83c01fa42109c2be334fd73b768d1706adb116e562966ccd7abfff0ee33e3e366ca71b5ff22508f1ad2688267902f85"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (118, '{"ob": ["15151515f6eeee73892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459550551028f26529566ee6c3f02723378bbf5e25ab799c7d2d290dd115a69086b8753040755cdba288f0d0834fa032f7c489ec5aef704aa8972751c1f6b9f0c2274275821236e028a25defebc7643ea3196e865444b71441dd0625c609d50f3688e83bd7bb9e1cb3adebb68608b83605a5dea8b0a6c3679757f653f972c3957d0637f6906490778463b9fc1e61579cccadcdbe0e5e4c7fc981491b11ee9ffa386826344b9ee647a3a6d0fc5221b20275f3893b779b59af7ec974c075ef35189783e476506c52321118fa0e0e6b7a73cad3c8d1421176157491d04a82a591c5f12edfb9ce96be54bcb2d91da33cc041912fc8f4973f162eb753b2e7ddc834a4e858791e00c31940aad9184d4a6ae910ff46f267e45705f9e01e338d954fa688d0cf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (119, '{"ob": ["15151515f6eeee2e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595499b121bcbd2e529d41244ed9568cc1ee59e1ae28cdd75899e0580d2c899085a2c395f28178f0dba56d1ebbd0bfc563a507182ebdd73c436e16f455e84f335ed698863c07bdc026ba31ddd284adfaf721a3dfbf607884a575d5b5fb06e702e401e76ea261532a634f871307859f0e8a48eaedc1a6dc96c7f6231be1fff56e48af1bade3ac89914ab0393c39c599e39b2f99b54b83e34c430bd08cb1a5b4c331c2a40f3bcf12e0b63dd26b411c41edf69010a75db0f0fe8d56f79aefc8df181cddcc15d853fc079b24380ec80bffaef973a2b3c40351c9e3a31089376137fce27ae15e5baed6cdfa434c74ea46c7ead1b679201fcd031123b68dc4792e74d11852fd258873665cd0c565252f82f4541fab88cb008bfb45834d120a5dbdc094e18"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (120, '{"ob": ["15151515f6eeee59892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459586902228110251424c899fa7361c9d94d1d61f947aaf977ce50c77f00c3b0abc734cda901e452e7bccd4716ae99bf5fa4f0a9e93c022bb154cb2afbce3dd501a66d33a11c3895f79d47d0e77f21a37786d6ac3e982723fb7d45ea239aea60c29a75b9fc407b0cfda194d52c079b10ce760210c9a987d11bd6e92bbf6ca1d707a787d50acfa7c1ecebc3b79535913e953da1c575b2ccf851bf958e6cd0b8a624467db7d9aaef1dcfb00cb392314278badb4bdba61f2b6593ecd8757a879685b5618b76ad9b829a372f45012e094e25fe3bc350f0af658755de7347b1deba6beec0542b30ad5b5d04e8be7df543225a41e5f6bc2eb084ee828171e4c0110f211d40a725faf14943fb9aa9ef80b17de9f7c69e05e845cda2f42dee7e95a52843f45"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (121, '{"ob": ["15151515f6eeee83892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459574b5cefb90eab51edcb546915d763bcdf85f81c75b3fb767c290207a146ea289b38e7309c305898b55c562f019bbdcff50d74643fbf5eab346fe2b11691ac1b9876ccc291120cf3cb5916c774a57d0ec9f598be34212bda5ad3f86d8028b2338db84c284c5dc899882ab555f42e2dff4a16ce34e725245f73fb041e2a2ec4e6466eedbac3881a32ffe8772628d0e0e2dbc1c39eda8829bf34a2836ada47e67060401911a9898a53c4fd5423251f95653c57d89ddad5565de0167221757e94a5db957c1f9bfc84258c6bafe114e4882ef4b76d82238754323be3aa52a16a022e6fda73adc904c17abe113bcd2de8b3dba33373a2d0e82da54d95fc1ff8740211b299c8d854439c97d1ba1173870271512738810bdc5629fc97a74226a71a8815a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (122, '{"ob": ["15151515f6eeeeff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459591936e526b9f377a84568139c8d0f44a72cb6a4bde910c5a63bfb09bbd3da6131a0bd660956d5609e2b62a521b5911609a2536e2f28843eb6019bbba018bd6e0498054ccd1573de04b77bbc92b269681557129cd332f590d6768fcc7a6b5b1a308c41218556717e2d7448430723d47ab98a333a5493aa2f8e89dcc26f4c4796c59739c43d7a7242c787303997f1c2be4a7c8fc0e3f58752d4126deb2cff7bd2b0fb9cfdcd23faca0e680dc7ab0326ff55c9315dfa46d0265dd3232b0d51376d2ea9f5d769d6d1891f7c5ba695afa7593df00a7e14fb3e4aa35f581618d0aee827f7beb89723e1b40a8908f08d6244f3effd7eaea7869d8590714bf09a39cde927187c17c848baaef1a77f0c717f262ded030b21ec699d8ed31327a309c2d0d7e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (123, '{"ob": ["15151515f6eeee68892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f9a116e4835d04ae10b7a399342cdbe530e19d82e044ff68fcc7a4105b9107ebf4974198947e3e744ecdae22bb20a43dc89e60a5091e26531a1b5daa90cf1fa447f9aaa3b3ead996f49672cc1fb701f0ad811c98825ee8ab6e36f5ef96d6a36b92e46471a8aa925a8475f55cfe09ee679d4675c5d020b1ec363dd5c8bd931dcba90749265c16b6169aabf8304e39b38b77fda8c9090740f54c93f28e5d1858d25b73c51e8aa64544b6544817c2a52afc8c76261509757a467ba1bb4f23429264dbf7be8b31c625946f7ff9a86777f4dc0a4bd3591f3abfabd06205e167a2ed6d148c29203589b9c1cdaa3d2469accd78f2977784a823b0094483495074f1925ca8f4a0aef3d6cc8938e4dc7ab5fe9004a52d22dcb2bf85e8cab4689c810fa70d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (124, '{"ob": ["15151515f6eeeed2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459503feb362b2bc47a73aa10873b15d255a19eb1857ecd59615a24b48aea3c0693467e31affe29854b2110a77053569a640a524a322b618e0a473157cc738f39baf99d5bc990278d697040f3efd90644373e9ac51755b4a18a5beb4e57266631c7b5376aad9e25f35244750b60f71197ac42def6ad477f439148d9bfc6c1ae36bd456ed939eaaaded611a158c6ed72df1ad4a6af7e7cfc170a1a47e5ac2f9c92af1bc38b5308c12d2aa25c27d3f0f02982e152801cb6827ff1c3752c69cc6ea8cceecc63225e472938782574fab846a3a18bfd72d613db99a4841b58810b4ada8e8b55f95034f2d8aad95c16c4324d99b9b5e0b3d6f53712819dd7cab8a77629567c28df8bce2f6faac3dce2f7b1cdc6882ca7d76c96a0d576aa50cf5aaa5240c00"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (125, '{"ob": ["15151515f6eeee0f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595777412638169195651a35eb73b112e331667c1feb7eb15a480a8b070c4e3303444089bda0deb00af1817deeaab0319d56888ec8158afd7e54ccf4c75aa1f92df6225df924a77f7c36232cde14e162cf2a5ad44cfbcadac54a45c25974e512f061c750582936ab0bd12991ffe0df7712e7cf4c061eba9779d5181f5d505844ae945516166992759d999a0a8155ba60473ab92bd3f069da9157ad3b84c237147f9f619803a7e74ada5b92f70d44abe8db39d1f4cef3339d429a56bac73db8388fb69ca057e8e171edaffb01abde7b0afc55366d714dfde8036994705953971f1f2ccffe9497deddd72eb5c3180774d594087253a23f02b56d2120349989038e2a6ba95f8ac931660016952b70a5c46c65a0acd2da5816d90555dc2b9246e62872a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (126, '{"ob": ["15151515f6eeeea1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595806c98c85cca5305062d506880a058251638d93d1d6b9066856baa2a9c67be8d6be1f86ec3cd76c5a7572b3d946d08e0d5192ab57e7a978d17009ee2a03982e205243a7a9ae81d00c456b746abc7fde266ba3a91a792febf519794b529f54a312663f879ac4a51942c4f66da9864b4cb90b4cdc74c869f7bf3f8a336a7e7029860a6f3b9829701edb4ba68359ed68f91f3551744cfcacb875b3b1ea888c6e19817c7b468e126b31c253b2880e165b65e24600365c8d7079f1e12f89133fadc3a172f565188c06ab58fc16c45e3b0a4e750ae4fef640f0cf3360364c3ae367e0d7a0c7f470a80e69d54351e6df8be0c8f821737fe35608cacaf2567f66809a811b89ad14f5bbee0e524ec65fdf33b059174655aed1bf88824577ff24968adba5d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (127, '{"ob": ["15151515f6eeeebd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45950cff7f8aac95a66d8ff928c4b5f9c90371bcf7cf397624a92d15ea859b2c3a97836f98e59361c4e1012da2b80d18eded8f6b38e3050ceee602b950adde199294f2007224c57d2daa32079efe8749e6a432ba45e77355cabe4df22314306ff1e88ff5fb7ac02d5e75e53e33fbd5cbedabe5228832449cb153ee047b805bddff857116e27a5a3de3f309838fc3af3e12f4d2b4f9974c37c262de660f8fadba8660688eb223716c0924f8ed26aac43c4a0ff8c515f90dc9807b7a06b0f60f8851df75a185aefe9cb3bc8f28a04a50a2173bd6fd50c57819b7bc34ebc00bfccdb6f0a8f59ae2cc13d24f54155d4cfeae0ce7ba9bda2c618ab4ee628255e29990c1fc687fa6796f0b9333c8fdd6906dd44eb04a7cc4c22b395e94d01e5c98feb90276"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (128, '{"ob": ["15151515f6eeee0c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459563f5c2be54dae4ef24b6adad4d70e02bb8dd5438271cef8ce8e9a332f33242dfeea29cdc672fc22db48e3e30663147b8f93d0b77082b5bdb22a02987b981b8af2af3e7fa7c7010c2035e9cfc9509bdd9d4b74b81d9a109ae707fff8522930a3d1e8e96f00821f868487f9c5ee55e464fbbb1f60ed3ce168b4f36fd3d191903202d0395379797c04573271bbe70bb4abaa025695ff3d3df75903ea9328e1a38a957b968ddf97282a1ad60d3797ce83b4905e2fe9758fe08c545d1eee50408224faf0566b8df5b960d67a7c050e4240105de78416223364f991f30b788d45f2813889c4bf2242aa46ad0612ffa4c68a923dab84f64aac9a99b75bebd3fea33bac1284473c7c71959637b65cbaee01ce57ce4de38e17099a641aac1c4c65a863aa3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (129, '{"ob": ["15151515f6eeee31892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dedcf6216bb58bddba7d6a6d6bb66151552a9ba923119357541333f3a81792dec938ffc152b3c94fc8e70b00ac989a8189b23b204da11424d693fa6fa43bd048893ffa2114bbf488bc506cfb04d9ea34711bc5f595e820a253ed2f74e02ec2e1138b8e117080e0388e2e7633bd4b4c98525d7add4207c2909d03a67ebb29315a6af6c88a66104232342371451899322689f23769a68b670d2103da210b95da212a9ef5078f596d05d42b3ce4ecc9761df7c9c75cb0126ece9452c05128d05b4e31d666714b33d59082ca596ab5ce9e7162923c55da41ee4ff336d5e4706a66aeeffb4fbb6f8fcfef244390dde9cf29d1e20e036b8fcf05caa6c6a905526f820b585218953055ee7e53170ff6d6da576caa3aa8093f61654900736c0d0bed4449"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (130, '{"ob": ["15151515f6eeeed5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956939ad30aa435403b0e1e5b737cbc5f939673430a4cdaac503de4cd16301fe665accbfdb4353aef8e601db733166a4206fff6b9a85228ccd8cf5584eea3e3d49af9dd203f3881b9227babd48fe34c72f4876c7aa46e56121146aa278b75e53d818726264355cbb9c1090bf7b628f2ca55e801a251baef317ab129d2631795fdafd005c5b101a56bf36bd0dbf620bf222172f6b04dc0fe57efdc29eeae9f03396cd005a9fdb9fdca7fb11b5008b43989b362175165a6677e196c98d7423c07d59a5fac0566c59b5eed161231b50ae381fbe48a00838a7eba2f361c32ec1ed3dff6d73ffb1c7e56f747a1acc62b36a5ce83b221d9111b77f85445ce6f7374079e497109a0eab5326dc1318e0e9b5b9b9035750dabb7fa5169e5862486a404b2d47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (131, '{"ob": ["15151515f6eeee99892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459578c64aefdd7d3d001e69efbdb533a165f1d59bd1293e52bb80827b642e91bf7fede4b402a376aaa084d8f78201ebee9637cd5a3a4c623921331f76086d9f0e81a1c16ce573aa434cab9733ef72cdc00caa18f8c062a23b04f220938aa057e42ec2330bd2f22c1ed993b6e0848aabe7152d22b6a28d4a555069899444f05bb498a48a264421b5445f323adf34306e69d4ba59f91e9cb521cde1c50a7abfab0023059314d97827edc3f2119367691566c65d54b002e8ebf329f3e304d6092cd0b47215ae13de8f2c6011cbbdbe1b73fc1ea28c83e122f60e4d65ccce9ebe7970801dd5d5c131e6e7d0e8955c0557ad355e3af2fead0b16182e51f151fd2584b244d20d911b555c7ac4aa26410499e556f03c7b3eb8b89193483ea217b4ba090677"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (132, '{"ob": ["15151515f6eeee70892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595af019d7faee5d65aa6a9524a7d1fc2a3b9c9da1679fe159832b22ba071d3e72b4e52672def6ad8ac03217215bf311a070a51eb02b5083b67b95949074f15009fbd5ac14db35aceb96c973cac709029daa3df59995906eb4554147c74c2bfc7be2bf48712e3f23111fdf84d8bbeb949e88304ad31480189432c11db83556b4210bc0eccd824690c963190300819fd1536e56e2e61012866ac2324cdd9bd55c8613063b6c5fd8fa654be5e5129f640d6096d23de4d1adb4a88b0ef09d280c3b313ea8c1f00c6dc642b6fff7ecb2a6c7a7cee935e7a4d2f01892f1a940fe69a1052bf65cef7d1f2c2beb42f9eabc00805959f781b237370e8b97ab0cd2abb1c2b3379afd69346d9e633577a6be0058face9a78f21ee3f3e2bd05ffe6824a3387318"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (133, '{"ob": ["15151515f6eeeecf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c7c7a140836bc72186f967d66b7685f28bb5cb83bb71eb0c8445f28dfcc2fd9e378cb5cb246b0c71ce2886b4edf6a36770b150bf7093c1322341008c85108d807d0d2b232f57f06f233905e3b7d8cc56a8c4aeb3535b9f5fbb8e0015159c161380e62831f985ada437c4e2b0b272267ad0416b2804d15abd14e4d1dc1a27b38c149cb66c77ffb0529189c41294ec7295676fbaf6e1d7fccd6a6808cd4cfc2c0a2734af9993fd1cd6853051bf436957f8e419ca1f27d0c9394166237f0ffaac642e444c06b97bbba6fb4e7de9ee9e27c743a7ea497ec6725ad8c9847151c9cf0cfbb0f4b06d6cb6a5456efa5bcf6bced31307250259394d5a6a4017a72b45ccd8c0b61756468aaf152b204f873ac8761b33856e29ae9abb6f5a3a3f2eb12a3079"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (134, '{"ob": ["15151515f6eeee92892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459514373094f6b24e6845876d8b1d95b74de54c84fcf86ff03db04b9a44e27c743a6a968c35ec8ba610c0fe8afbf07d826a1a132e2042deed56b7a0b69e87bbd767ad1435bc819862a082ce5534471d5b83a595b30026efae7be7c9442ef8ec8a559936ba0fb12e798825f72f1af9d26f6f2cc0d3fd7a861cb1c2cc0bd9267a10473780a4e1e6fbc01032578886a80ce14a03d8a74f2560f59c31a1b35e8d92b08a5c73bde7f3dbf0e16b34dfbe734fee61fef3864a2172a654abcf17f398b6e1e44923d507fc0bab4ca6ae3c769555ef222025eb9e9261000610863b111ef595bcc7241e92a7156c2ac8ecf70b4d5ecbeb7950cd44c7f7560a7d7bf53094ac8c9e355ec6a99b8154e03c7cbe2297a8d60358d375e30c9784bf25fba1cec3355a81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (135, '{"ob": ["15151515f6eeee4d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959fc02dc19dd6ab458e06b8fc4ffceec62112565a541095ff7af2a54b86f70128fc8c8cbd62d6f66ae4bbff518e10d050d040477e3439281e51daf6e9430cc00e5815d6818c2a211edd772a19ced18b5cd802e7235c11a34303bc669280b3dc62d93f6b2b967ff0bc618be9a9354950c968dfc801b1f242e4c4a9c05f48a3a2bfeeae740fa33bbd030005a6238fc2f4b1bf58f538d47779bbd17d052e66e58456532c1ba8a42d015c0daf229dccf88d01750d700ea5183064ec59829710c465b5b5ce305b7a3db0dae14e0881bf22ee647d314f2585beec7eb234f97f4bf8533ee03362b585228f1dfe3091d87f369ae8410a76791448315193e043dc89d22eec5da524739cf97e362c4569a071b171ad47544f619f46d11bb3775be9b957548e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (136, '{"ob": ["15151515f6eeee4e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595109a614d533024e612b36e6e6429e8829117e4e9022377a260c8c47947f488cbb97e7d08e0f812682ab07803bc7c7cefc03a80d6c308ca2add01e6c8f08e830edde970bd1c34ebea4ee6afcef82042c74ce7cf4834cfa83640362918e7d46c982e998371c10502bb961a6259330270b42202c0a0ff74e7012b478dc29ecf4802c672b713bffa93734156aed217c309f8f80ff66743094ff4995a180897d212c6f30cb068c39db61dc6154301d42058d642cf4270240c913af250c1ee982b23683ef7ae4c7ba29bbc299409dd91231ec660a2b134a2121d34fae548916edf564d01ba3d476aae2454c338aa40f58d6ad855d177f3dff81ef3792f911e6190b54fd41086693133f0325edfa78bc54390d0b0ffa3797db0dc30835d5eb960f30eeb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (137, '{"ob": ["15151515f6eeee60892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459514cba44ba24e0440329881b9e8e82381cd8bede3ca07d573c6d0c549bd471afa985ca3a6a30804b0e7ba69e7fa3f04ebd5ec67cdb953ee7934ec20a482879ca9f60b710e814274d2d5f1e3890dddbf1138d70c2594a9e5d3a1032b7051e7b6e4ddae165ff5204083d2c80a1f298d8376789e701ec45239524799a3b0ceb0d11bc56de2e250760c3a0c70079b341d22be096e6af48f85d7091a76dd237e45696ee71a1ecbc58e09418f2859abc5da616a6e03ec8b3d8bfd0c7a35e0188c703236e7c56c3f8c2a62d20771e2dc7004d8a63ce776d9e8d4e3d94314b149e5657614d177e08b548971e300dcb1cf9c46f2afde2bd059035402242f82f9447e6fc397ba6b1c32530edc1dd431821a1936d1c8f16279ab37593c347737a28ebbf0035a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (138, '{"ob": ["15151515f6eeee72892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b067a120c79c248e457ccfc0855e3cca479ea18d34552e613f582af2bcffade7fff329bad06066e246e30833d32323403eb936fd97fd1618b19584692622522a2a8fff75ba38353d1ed5ee584982079ac2a15bf2cc8060fea4d2f590e5311e287f4294c1d34664f97578a05408550b52939bc5b5ebf24bf7ef162d807c9a44cd383771b825e83e2da2dec4900df16a72a21d2a70bae36f80c585f0d058dad53af147e0edb9c03529619cce6f7c0cfa3ba48143f91e2c2953c4850f2811a7281f6056eba1bf0fb7c6c33fbecbef6649ede9b7e80c40c73021024517dc60b60f1647cede8bb027abd45414af83acbf24e3151e8137ad0177627c1004d0ea4943cdbf812e51608d09eaedbf1373449245a87208c8cc3ff21ee35abf6abc32741130"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (139, '{"ob": ["15151515f6eeee67892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956c31a0624bc8009f30ae8bd6226fcd5f3a502d0f3991b092f5174f6cec64841404e3a508f8fa7d819f4a5e4397f7844969b4038ef52012a034fb5bb2ddc4d3a05fd44264fd263c2742278bd9213fe13cf6996ec44d3a86c163672d32a2914b3d316d31eccc202df77a1364b021de8bcaaec1ae8420bd256a782f54266e7539b09e24bf0c71e9e158546dff64d53773463922d9e9359c50e7b740a86878271ef51aa01134d39b1f93b5ac0968b63b3c827572e2ff78d1bae2f50a421840b9ee39c82260a62f30ad8ead6a65b7259ea42d723cb950932652cf715cd746d930c373038e0e3bc37884dbe008b5d5eb1f6d0a9a18b65294ce428448096287c1f7baaada2e6e17b93321bcc9d852b571afc829c9ffe7edd1b6625477919dab49f6377d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (140, '{"ob": ["15151515f6eeee55892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955e16cebaee7bc00d0e1f2bb9ab68529668a35e09f87cff7b23c4d184f229acad02a954d2909d57034608a04dbc8d0a658ed083f7c2f82a877898b2ddbfb715f01f18e451180dd6208255a87d8fb0a020293e7ac3fe68848b97b5cd351ce97c99e45bf723e4557a3a4c1fa82e370e37f7b498ca879e5ce32655402041c2910636a234175809b8d9e41148c6159192151479bfd7de64785bfacbc4d63a5888be51683de4e077590c64fe630dc33319d4d1997b79cc7d339b8860ed87b7644f89c934983094434cb8d92624ba7554b41d50937966c9757aeebb89b57fe66a069fc76989ce7dd67b78e3c2cd068541a4e34fc3cd8bf751282cfec04edab082076ebe537e36d9cdb4dcb31ae606963f59e3e3921d239904afea9d59992169a1678ac9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (141, '{"ob": ["15151515f6eeeeaf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a935f1843279fed514d5d51d114afc9a6f906ac69abef2fe4dcbb5407267b7622a39d614a439dd9215d444e1f9decd0bc9490f468e115897dde03d3e5adfab366dcf55504bf652daf438b4ddc98098f8b762ba98f8ac222564bf1d218d131b014db3e08d83fab26f834c28f4d0e348a206a25d444119b651613ec2e15f0e36a9e92a1911b78863ed8a375db550f5277aac189f4be3996f512fbdf0a09017a873709374863edb3589e781e02eab2d3a36e4fbb94ec1389d9695fb915d88981be590c48ffdadf03671cd13b40fe74aa7e5cde329af6998ed3b92cc3f354ef3cb4688f4e155884d311824632c48a7844fd2ae2fbb61d6cf0828beab22c2d62305ff8794456384f64747eac3689f25b9edaaece3549cfb5d2e87dbb4b2bef1d01c74"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (142, '{"ob": ["15151515f6eeeec0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595fec7f7c383179143541a502df8c3362f907ca52eab292ebdb010d7f9e85a8f6f9409c42b7bd2e1a6d4b7dc3cbb56b1efe51c3f15abe020b1f468398462f716c6511d603aed9ba83cc4db62f1e9247a63e7e02863250869b12a30639ffbb58208a6c2173959d561806d91dd235622d17a282c54a38107863e9096232a6d865bd46efbd7a9268b42a0f8ccec40f616fd0b264dca39bb0b9ed5bea5b49ccc9ff20f8c8bbf3f25fb48c90d563ad1a6977ce6a0381f48e687adc34c63dcef33385d7ceeadee60f646cbeef1d6de1d23b75205d3feb264b60981724fa2ec54089c21012ecc90c21f1ac1399626409cc237df2c7d43f1aa9f82f3966780a82226bca88be9dceb8e8de6895cdad2cc3d064d70bc0b99ec5986e67dcf9d8827e96a9021ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (143, '{"ob": ["15151515f6eeee62892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e36660b05331fe7c9ded81755719145b08daba83f10e43897e85f8cac9206a27fd2363ff77506a421cb3a961d059639fd69990ed62378f1c1f9727f33ccc1c48a6ebe4bd44ce7b30fc44a825848aa1c4debc8f09644f956e1f21956480b2efc982e500229a7413b432972103aa669eaecb1edc51c471b1bba36e8df433489896cbbb431ce9f36112f47829866454414e228abd7dfa494a95d24a0f73adf1999df74ca16df959d31acb9db9e61749fc1cff2042800a7abd58750f3e39ff9758d445ee5c21f160f2174176c66b6692c6c91cfa5dc34b1ffae61922156a8bb285c997cfbb6eea1d29df76b6c23bbc24dcf7c8bec2ee63cee2bfc49e299e04fea193cf829431ffc26d1eba2ea01455ea8828a790302d702852ba0ed2a381937a2a49"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (144, '{"ob": ["15151515f6eeee03892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459544c9fd4e80edfc11e06d2a8d38e246695998fdb4a1ca2655c2631ff1b8d4b4ccf315f82091e730e9d31613d00b0f0e830f85dfb92f80479d2933d79a3e070e655cb5769d10126ca3c9b4792f2e3e0a26bf306299b0e443983b7bc5a7abcb2e160f275c9e068f1bae27f8475b17519b4f7f283b77eab0168a5bd4d42353bf1b1f142cd1fc7704a5ddef4666e3da8f39cdea3abcfd920306a0b7e9b72dd4fba75665157145a6369a3e8bfabd6e8dfeb02a5bc47a23b617d3fd295bbd932591b81b1a1243fb412063d1e05a6c256ba911a7c28a8fe52079d9dd1685a1aeff41b0bac5430351f2bec95bba2f15bb19b1d0e2fe3eb88dd9c05cd36737bbaa6aaa05ed113ff42b3b30e3ef15071f2246358d55cfd08e33a6b04e3bc31f721e6e73210c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (145, '{"ob": ["15151515f6eeeeb2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c636c28d5b06bd0ebf76eaecc2684f3c752813d5811e93607a23eff363f012992a40aa1183c3df5a0d392616edf0eb5c2304de2c1c365f70bdeaf52373668324e8979d9c1841e10f8795f99f97308533290f7b2dbc0cce075010a0e728fddd93532e9a0f13447e6c8e4aa9905769bdda2e29242485a5e7d3bc8a129ef09357f849dc5ee8841588e803906ed27bf36a8f0062aa69e4ff0c7fff8a3201c723646374a4236040e1d308b9cfdbaaf0f94cb3100bd4fbad3ad43e6b7e5bac7b2216c359a0684dd84582d9b48cf1208db39fa01d3373d6aef47ee6791cf9361c98bec32088bb6c64b77f50c293f24c8db1ffece4c466d2a656687f672bc20f344baa63f15de2c9bd7edf0bd13ea8104e4601d2f1f86a0f967311c28fbf9465188f4800"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (146, '{"ob": ["15151515f6eeee01892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ce2cfd50d2f155429426af80079c31d90c71b130749ad8fbb129f91bcaa46b072864fdb4a4346825ae18d47d0fe3622ae80802e8d5d1d59f5ed77a429980722e49f4508171272969c3539d90baabce7b3b968bb81a414d30cde31e2ad5e999d15bc5b774d0584bdf6c0f5afb7b11fa13386ba226c39115e0a34ef0135aaee9cd709f4a95d01be7d72ad1334fb0a9bf38471a4b3b413e5f91c027ffb0e6f6339dcf5c1b8f7833cff05c0ff2e0d24ccefbdeb97ea7c1469ef4aa5494ecb7e941b4b81a1614f17af08d5de19631b1abc7a8ff231e3af48b68054e4933d18fd79387b0353e87f82d083a053718818ff4cd4beb26ce09943bbef18cec679de4188e080808cb17e101afede7b40dd3314c6701a1a796f4d8df0a7a012543695fcb5bd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (147, '{"ob": ["15151515f6eeee89892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a2b1fab67ad76d18fbd78fd40e4134461d062753d3098e91c8ea25efea6dd3a4239a02be3f4c1b863f7149d2874774dbbce2897548e35cc309bdbf40a1149da8fc719c1646056ea943708820c094dedbf6e07a4477150ed63b25a9350d2d0955394c48079f4691fa5540abcbd12a68e7f06d17cb9ebec0d967430e5022905111c8ef285b6b6ffefc4af706defb0e0dbbf9e466a3944cddf3e1e5d8601cb934d5a5d75f06fae4eaa6cb47292c1fa52d93a2338e4a1e194de7606c7857601a0c6de928a348b50c773b30e8a01cc9700591c9a8a7ec3759e8bfb7e65555e005e0b830219befcf59bc4b43ee3b769a08e09259c2b9660c03a4cf4934c22988b20cde60e4f9e2319e1c646628da31092a16804d0b4198c77a01395c01bc69f7039073"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (148, '{"ob": ["15151515f6eeee28892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595356e01349f6a40784ddc3e01d799194879513669c5ce9c6622b4b68225155f740ce25dcdff978e9971988f74c46abfa0549431a66ada918b5cf78acb86c877eeb215c96f52611c88bb2d928092383fdc79b96e12ddf534ae185a5bdaa766b3880e1e9990282276d5aee931e941896247f34f9627db1d33b485d0a30adf370468b0a174c6d02e68e81ca0504cf9b990f4042668fb0a959f083aea25781461cc0867d2cc9fc50b6733dd3e8317b19e81688d967eba870d680f1f781852e11146dc56ded4d3f733a317e47ee2a283387c969404df4d511c660a8e6011d90591253a9dfa79009e79497b4719ff8a2c2383e4dcd7ea5f566a0f1e314639ed33098b440431cc87ec47c847a538a4ea9bb174986ae0434fb45d0c5d17a28c2d6c52d932"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (149, '{"ob": ["15151515f6eeeea7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d7caa1d069e765b087f21e5bbcc1607a5fdc82a752c38d937a9a6dd03480d5f548f40d521a7784225b1d11a7c6c90c4e5e6e9e338b2902cb77e7a3285f312dd2040cfd14d08a73534637e56bb5b0be5394604cc4e2ff3aa11a7b4cbc5fca81e364c3d9c42adf2bdd49ba2981dbbf1f177fa11cdf5f1a966a81b8eabfc03f5d9002018ee56ec55ebddd53618063e5becbbc0a612cc353526497e54f9d5d37dabfc435ef48c7314021298ec655d055c8dfb862d979763d24d782c5165240c4f8b0615c224a2dd4af3876b0439557b2540a5f043272e7b6afa8d99402a57de6d1d855dffc762af43118776b7563753d2aec245c5de248a397abf22b6b4e533faa6c683eb22311dc9d381b8faf358f20e96ba919a3e7f64bbed4dde16a14924d1af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (150, '{"ob": ["15151515f6eeee08892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952e9da35459918af1f52a2bffa4755a414cb57321cfa0d438cfffc8ab77203b5705c2f68221e11a56dcc0440fd3c5892522a22f4d7ed8e07307d639559f29237358a42bdd43fd391511826d06fb75057c0fc98ba69ca5ed7e836ad73b66fddf040d6a2494b0f55ef552ac8da94542710e2ba1f7ad8b7c144bde0dd25c470d28566145fb5aa8707071453c52ae7d1fd6f4b01fdecafa7cd8e7213a94aa2c68100d8d61b4657a6dca7fe7499d8e500a6e893fd31dc2547cbece8d1b51ac3c5ff5643bd6351ce3c9ee5def98dee67dc241505690055c2dd37987b2d72fa909dc4d19726c734b437796a1364f0037a4813bad1faef952f3e4782cba46d13d4528f32d23e8a1529f1ac3f6d089f2ddcea9afdcce5bd647cbbc988f7f41649e20f17a12"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (151, '{"ob": ["15151515f6eeeea5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a37e2e6d27d0f895ca1e864958394098a665d0d823e7e98b1a5366b8d57150f8eac3ef2555034510bfdcf0ffcf5909116bf8c0985bf419c59de6a8285a798abdf0c43f5896c1af5a38916117cb3d87625b5c3f731d9ac09cd7756a64ae9a14d2e69ef1e306c921ad6079c4f2ca4dccdc1f76de19848e2efb5810b635d0a5d223cf63d245f9918533673e4ba0079e2be0e82ab1faf20f102772024cb456e1f8ed27a183fa0a4da509de0203850cc69224c4d0e19436c805bbe700965237591d0f6f937d1c603cb4d4edfc7d8d947d3c34c2f32fbd382f225e7e1ec37fea1b82e010fbc5605f60211c7c3a56bf717380fe4555449b11a8cb969b379724b72b6d9bba0f2ec7acb508259b29d776a49f4b2b458ec2045eda92aa0b7d72e99ecd0849"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (152, '{"ob": ["15151515f6eeee48892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954ada477205e5d71b15bd7e1ce7bc456f5a34710346d97d45a35af35dfdea82dfb3008570f2e14c31f314d2eef8c8dd3340a5d5fdbc507b47d2dd34a8a4b940c0b4c636a98b58bc287e66d539894c10eace95ecfc6689b6dceca4fd4cfd70ae8d8223c05f15051414336ac7c918274c0be8a975660a49eb9f934b66deb6a91f8f50dd2333972c5066e11adea275c5e6ab210d772eccc52571c2707d27195ea0277d7729902371f49a96a640b85b565e3f5ae284a4ff2e8be291aa94fa99fe91c9edf63f85a44d51c2c1a2fe18ea9ee2bff77dd9f9c2859bb2e6e3612f6c998ac78873324917237db2ca9dbc6c0bd9596e29b262cc4b10e510c4f46b5ea36fd0ccfbc376eccf3b1f2ec4e5e67ba846d00c235050791238dc979eb15a335acb8b14"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (153, '{"ob": ["15151515f6eeee81892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954da29ff829b34bb4833abc967af846c0230fcb756f82d3dbc056f2307942c414818a33dd7bb87b5ad62b4896682448c9b75055ab384408d9f1ce1fc0a9cc74c2c0a9f921537db6d343dcff065e0e8033e2c97072ddca88a16c212de46a0af2583f4a00daaaaf42188843e7999664d3a017e0d40f8e0749a8318048a606d01616d9ea87a09e59540d8492503e7102a9ec36f20523db5565e3875aeeb25a0146a3d96861c151e6d6a82fa4ee16e9154c40f1be2544db9bba9502667c3007e033ab2a15c49acc34892b16c9f7af7240c9dd845e8f21943e700b6a48d7206cabed7053c36debb9a925d2971d5410eacea3498c62d8decbdd3779bb4dc1e8c1e341e9328042d1c4ccd07d625c92f36358dc5a9931c72b2277f5bb33239d751006cb68"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (154, '{"ob": ["15151515f6eeee91892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459595d00b761ccc3b736aabe3bdd389cdcf29d75f174ff095c6347a73d8bb09e61b3a6c6313c1de3830e553bb0dc56e01d2d63a951913bf4eeda9fe9e05a810da873c8113e1bdb3aba3e276907446905dbbbf5ecc884c444470e026c1bcd47cb50bac0d7cbdf781d4dd37007409f8f582166c1e56340208c4836e116abef0c093fba3f9bc5880ae95fe3a582c50d48348f4f37bcc1cb042b2d989c0ea525f22fb14c6f76fa6bce1fc677a74ba8479a610efea72475f09b5891e776355f0c401308b6ffa550a86750e0073c1339ebcfb3b545d5dddadf1e0dd1c7820b7af4c58b9007f080b26d362a667dd3190cc2593fd5cedf8fc38b17e8762858a85020f094547bd82192505dc25cd83622114532739062513805dc09f78a5ce775fc09ac2bece"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (155, '{"ob": ["15151515f6eeeead892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951e9906712ab3312c2b586aa2cb9fa7dbe98b798c3190b4ca311f8d8a0fbac392d53c8b45c8f0f35d34402b2306762fdea7ac076fb76e2a3bdce297036c0761ca582b34a96a8cf5999b19646e1100d9633134d50e086ae3cb502232cc31230c213f7e1e55eda801c7def22c518762eff5ca1ce75b6bbaf813f3a7620f60442dff24689f19fbd1f34806df3c7ff5a4ee53c74c9ebf409439e9d3a92ac6719abb135d00fc36594d197c9659212a67630d4c4c15d310a3df595a1a1d3335c832a28457cda6ee196fd121bdb9243498b013b47bda4e00e7ceca296f9bd3f86bfb039e9d78b5970803f354ba9767fa825590b1f5922ef5343eb7c0f5dfc04a6b2b257c7485133930d103b36b8925d65d195b03cd7eefc0080a8f9ab82a2e16c589ee82"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (156, '{"ob": ["15151515f6eeeef3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595606e651cbcc776bf26f05e55ac04f0174259e1bf6b1ce49530b6a5f72f1b8c1d5a6ac5dd917b4e3f6f6622ff7d5edbf5eb2e9e9c3d51f6a54a679377a13193d9df77aa3808aedd7bdaa719a002fec425c2cc7018a5b75d2d58c181887dc35dc2451f9cf0b2b5570a3c5664f3eb2006fbcfcecf5ed06d7593775f6a310d48612706314263db489dfe66decb680667207fdd9c738ffee3f64ecf88e20c23495fed30bc3d43318ff32afa2f313717c3fd2d83690c3bcb355cac920261d8eaea2f4d322767ecc5a6b778ff888960cbd03c63fc6551579cd304f5998a7edfc15a16daacca9cb6d6d65ea7ad58f14f5bebf3597e33b74ed9cb4cc7806910ed3aba0127d231f6e9c25304748ba95e0e73daf051bef12e6b6255c8e88edf47d77b96a3df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (157, '{"ob": ["15151515f6eeee8c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e3d10501ce419eb65959edb16f142fd29a63a5241f3fb8186244867ce282ade67e8e4d91da38bfc1f1e2f59bc3bbe91eb0a141b12863bdfcfbdd68105d9a5fff11b3e44fea3a1a56ed90041851d27180f95284ee0e7a30cab75fbe7ef78cb8859817e1855bbcf2114f0b31717e5bcfcec415d54dd8edc097776ffc09fe3e485b2b3d7c6b1674e6d07aa2dc5c1ae2f120a86d20a8ffd0838a74b9d5e262f66cf33a85bd07f55561bc4c9c87cef266b14080605ddca12c5c91cac0f0c788fa918e06cf7a3791e49a71d310030338f52a916a91d08169396d354b4a9b3aa6c2325d9a2a0947dda2c33bdc90c59e6c1d50916acdab47381ef42538b1e4b18ad1b3c187ded9baae643806ca175830e6da3be9a32c2bc8234643b834e7801d921a88bb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (158, '{"ob": ["15151515f6eeeebe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459541b3e23f91ae948473fd716a867544a05ec758578780fc3aaa8e1731cb075c7b1251a5f64af4f98a6cf99f75f829767afa6ba2e57df4b79cbaa63e5cb23fa081cd5b52a3309f7271bf459c35ad596187960e62b7652684e75ec1cdafa26a815eeecc5ca4bc493d3c1461cbcdafed4ec7df2c8616b6e0f63fa06fcbe7a5c810917b91ddb87fc9b6da37a616ce855ca9db2877a5520a1e4f77561b000bbac641d1ea26e37d66f254e55451e21038b836b1fbf863260d11b847fcd4459efe66fa22b6a9cfc5f23e9eb597df04bbedbc69ed6ad344525a5c082be486f58c7379ac382dd13fd3220862de41893587924cdc812d7e0816b4fb5547369e4f19e0ace575c7465b7ca9009d217c2ba68a496c306a9129c29698eebbf38186c505ac39ca13"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (159, '{"ob": ["15151515f6eeee43892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d8bd39110d47b2b0a05f93d73ecf614437dc40eef4f7d2787be9259e62e35c4ccea8f7b332b58f88c4e9b50e1d9234e67d361f1ae6a5457d7004579401ba1edb5283046ea5c6b697ff7ddc0d9cfd5fbc4fa9be5330b71c9a0e0000eb2fea26d02e0c8cfe3a7d629c63393f73c9449299bd1fa4ae59c294caa9a44589cfba4e0690c6c9c682924c2b8a3478b3e6ee08467901927d71f2e77ee8322337a4e2e100eb30aed01382ab163e4def2a3099b89699e15c0e754e99efc33b5d35496333eb9997ace9a423ae784925cbdcac7ec63cad144f88c6e507479ac829738e7fd84146627f6f78069acd16860ddf1d8eb6f889537f10906097b504863372a917ada57d782c390857fc5e897100c08374f6b3c89ad58c4393f30e34d596193a7640bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (160, '{"ob": ["15151515f6eeeee0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459513b4f0b8e4260d71eab692c14d1bcc87361d8644448d489100fa65b1d77b4e35d6b3cfad4648c74f2d081876d3c6dd0f17263136fbf764a4c2b7210a464a987f9eb8df548a753dab3b7184114049c2b3dac40599084ed4d88f086d853cfca9d27b8ee29eb26eb53b005fed55ce654284accc570bc4851e4ce7bd5467031156998e4da271f4d6d519f9ecc2c371a88825698a50c020de6e73113e93a7e934d49432e8ecf4d398484d849b1c92e8f13f5998b1455855efab4a9644adf4d214e7c78d9288bca6b8b58aa471ee8fa55dff038c8896e7053a39995202f2350f4d64ffcc6d3b0356504a6508069f308b2328767ee4583aa869d782356eaf39dd7480715b371a6068344be58773aa3d993c4980156e507436fa2be27859d1a000b36ff2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (161, '{"ob": ["15151515f6eeeecd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952df80dc4782644f6c2be78391912dc244b20bddb6f4fb534ea708f93bbf748cdeb05bf878ba281a4e6d3a56c0e3d08a8a28ecc4e27c7bceb6542226de1444cd229965214486556c89d7c0a2667659a109b824c4ff7474ddec402fe7d9bc0b003d53f22928ab8466c9e8978dfe1caadafebdd6dc13e3162b2622161890b881d326bc8aad876b18eb2d9e3b494c79303efbc82b0b31a0ce4430651e2bb848e3e4b6659b2e139f375b646b77dd477684e2a4aa03452913701eb3d6432d1b6a0236beb811399b115892cb278415c216aa394d19e1996948a0bcce2e783fcd443fc636e2b0096ed0b6fd147c41fe27aeefe4ee068030ea73310eb1ee0a9cb1af1fcf7805d83ac1461392e060cbc92836b2ef12fcdfcd1e726c32a8f4c99cf493fb13a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (162, '{"ob": ["15151515f6eeee98892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958b707fdae30e4537df586bccb52a9b18b599bb274f6060d65e655c513276d0df6019091ad9cb5fa4cf7679b5326e0fd940850e68510814a58e62f2a600a01a2a2587a936758d8ce7ed00d3e38dc75fb24628b35467e2ae3087a328609e6b82be98f13664d661bee2b3a5ed40f6be45a4d10587161609091d2c3b40a8abc2bbdf1ecd71b58db91148059db81498af088035879d8343fc71716c09a8985cabfcbcab29e26ff43f269417a9a347b2038f7302bfcc533f7883a5d2450204ada1f83fc0a9203f1d12f0dbd0d4a07f2a3107d40f74992a45e21c133a88fc7afc64c5c5ae9e5a7cc1048482a5995b4c0382c38ce5acacca1a9814ee0ccd764f544ede7afffc4f8be7f7343d06f88f060afb99496a1a17723b7194afb372f1c61d046e9f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (163, '{"ob": ["15151515f6eeee2d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952b1ecbf015282bf469a285989e66926763faae56f87b7c8012a53a9b98461d3cc9c9164140829a772b6d17fde3539e2dd1535b8469de6f6b7e58eae5313b2b92699f671df3db138630a960388aad081d10dcbfb3c92bc3f788ecb32b9bf501b4be57af9b980ec281d6c9242b9952449ce3035fd31d6d3fbae582c968cd6c63433f0ebe4605692976095aad60a486feddd335ddbd485c1168097d1becc26aeb439f553912bf95940574e11196542119d900db24b3f8d27404e705b4522fd7a39768843843492d25c9418083a3464e641b04f87f3aee656e216819ac527ecedeea2080bcd90d618b7d6cee236ce3a713f47e828baf00dcee20e4886557b7d25e1bd62d9a6f6bcd87a7eda56659f3011970e0f988650f20cb29ac7d6abbecdae916"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (164, '{"ob": ["15151515f6eeeeaa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459583844f0cee1003907adc8084df769a03182da5bd8cea9599eb6af609eb2ae8c8181047e93e045d8973e76492f7aed660494f0b5093d892199e26cfe1e00f3a4aee2b1ffb9e1fc73fcb6c9efce3dee933c8b2c25ffc54d4cffcaf33228fe73fc02fd44db9c41de725a3017df9fb1dbaa011b42a48e2f3403596a04c7400671c3815fc3a61d48b00e6e3ca382db9bfddf69fd16df6af0c73d265ec5b918db0f7c09eb87c214976da4fd18409b2a4944de2801b5b452aa4e74463b0efb7bbd09d2acb5cf877e16ab38ec86247532d84829ddef46d2763534813b0cf3cbcd9d3efd0f832b9dcc4f066eedab71d61beb1e30f474a7265c30c4974268e22ede7c4df1868be382ace16d15ad20c6a892c69146d1b24e8857ff39bb33b592ac13e7e208c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (165, '{"ob": ["15151515f6eeeee8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ad5209d441b6e02e0c662d9368027cc619253313778324dfe634b6a7c9b2045a4f20217ac2e6ab9dc21120be071ee04efeba270ffd920b446496bd3612ad129e1ddf9cde2eb6ac743630c9b9c862c33b768903542d81784c3940f2957017ff8fb53a88cabb21f204cd08664c1a56cebd38b70e9039ad274069b00034d8dbc6054a8730147ec654e637607c366d3ce88642eac2e161f759a763e8430cd82b425d33ac4d2fae81924c49d05dc8554130190f63926ed354247dc5672f793a24c851bd0a898d314422419c1bffaad3fe58b7fc9938e344a55a64624dad459031142349af870b753d11f8b5edcac46e594079f8d82fd547f292b385ac1ec2a2906275c5f8aeae379a94daa7027bbd7a62ae3dbf6c14e83f8c254c256ddfb195a94f09"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (166, '{"ob": ["15151515f6eeee6e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ddef0bfa6be7224a0802d6fcd72a9c0090af4c3df68244af6a3481aa1f07181cb440297bb24e11d62d66e96d4d6ad732691e41184dbb508da0466a7fdab1a49ca2889c3e9c0afd067f0fc6844910157a43387e779daa9c6305568c41366df0cfd021720ef1fa04a4fe0d74c66a915b61266dd5efb23f0e556f4850ee8a2be49ace9e2f9a99e54c3bd2890f033ca555b15e6bed1557d831449465506412291358471474f4c518fe49d1627f66d43451e1542732785a62d67eb0b80ee301bc4a2d31d99bf0a077a178c485061887efb3bbc0d1dab0d4b9dfc8493c7eac821253111f3dde3688c0edf115b30650ed84ba5b39540e3f661b92aa57d30b33dff2c0a7e165d406b2c80842bba2cc3c5149a64021cbb1c54ceb474f5cfc147c2307bfa3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (167, '{"ob": ["15151515f6eeee58892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953e9f80a8cf19ba5bddc34e2abd82ff1f89efd6582f64ebdc4af042a6ab6a4164255826a594d721fde47d96ca167c8d05fc572437bc1366821fadfdc803a8b223618ef723b88f39439ac4cbe0f712c92237b4a25d61541a315ac9c4b79d550f924249c81c704817c000f927c7be35c0c1ab328ab0df203d4d558184058a951ee39a242965bacc8438c293dd0d8a60bd0d9ac63ccb6a1a0a73ee93642c86e2cdcda513222e96f1cd97c066440bc2c1fad6804138c16794c3168c7d31a68f07a329bba4d13f7948a093e72e2fede3d525afc559962c6c030f753db3b5c9853ff8aa8f5779badb1fb36056db1170ac79ff866d868e40d070d4eda536c0c226a4cb4866a05ee31205660bdb10f66d02ced38c19f4c6873da8d8ea895d32d659b75b53"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (168, '{"ob": ["15151515f6eeeedd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952f182738405e5f9cc73dd8644fbf398de44f921c1b083f9b7f4cc01f9a0ea1d414eacb82f88ac505bc2f44ba3dfa404c0c183e0f186de20b7ef1f6845f4c3458e733af400cfd1d86d817c643879fb05b37bb4279c3baa45c9daf800df91d13a28ae8567dd1748a562fbaca541588c73c19dd2b6240968ef9ca6bafce475e356e704c1538e5054b5bbf15ed2573a04d358d0aac8222e13d77bbc0ef0ce60749e66013706925652da4e6f3a70460816d5a419ba57aea8e16c6f2e73bb798ae99797e18cf0a18202c16c0fad5cff33123afaceef9f20d447d429389cc3f355b7e30973aca8d2a6be465db9f7dc8764fd755d936c829ca2011eb4c22b60b16687a8477d86e0f4f4632a8f1c360b67e69e900aacee67ad897eb5b4f31affa7e1c9ee1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (169, '{"ob": ["15151515f6eeeec6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595774a4ee724ceb330c2603c699d7779085c59fe92cd6d9d10bdfe3a7f239d41efcfa72a6dfd6f65f3fb8fe7f0ad9620febc1e8b70a2a766b2b36beca5883cbbac00ab8113e7fa7d7449154298812fb450ffac72301cb9bf54dc6e155a3fd7f3d66911e6b20eb1ee59b60ccb3d7567fab9372d4495758ee73aa399efd8793346ffc9217f6d30de80b77216742a2b62e2c77eaa9c1c0c95228710690909b724570532571249b37013872e0ff0ede79619c98f22de625b4c0a252390c4f7c28edbaa9aab567509abc8ea2f24f43a04d4f57104aba47313ba57431a9073479622915bdebd0be2071e79fbb928766da1deef9a13803908ec683dee061d0bb5aa6940e03a382a76543ca30b05ebd5c532c0edb0be8f4f07a1a150de1c25cf87c2247045"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (170, '{"ob": ["15151515f6eeeec9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f0e51f738a9365c09e3712f1f89f44111946da6d2966caa60d4cb970296448e94877ff04ed9bc2282e1548e5e951dca5aed22f0104a30fad16990986339de1e3c10825c302024e267111f6c6618ca9abf43a8fc07006ba6de9bfa2621ef168478ed6e926e059d27288910d1c862056cedc0ae2d807c07e4d948ad2c87383743a4e1634f6c03eb8e0ee34a6efffe37c3f3981bc628867c0bfd19436f22004c7a65a41e19f2c9f0bc13665aee44cc0aad97a1d52d766c7e8a623e2b984ca99b12b5371a7060c81bbfee254163e6e3e66a03c10df618fa580c5c11625f3b34cd7a9848327317a50c3cf82d71652c6ff993bc0b150d1ab54a644c64e5918b73cb777db0962900205564ab88cdfee1a79c365b1525e743c6b8099680819a810f9cb64"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (171, '{"ob": ["15151515f6eeee10892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e40685fe27c30971f8cc02ac660198e41037769270eb2b0c0f47edc2e59c4777be8a28d9ca2a7d30164d971b9cf88803606801e5b0cb0a5372e1a91469bdbaa544bedeb2c3611eeb83f9bbe49da33c0e9b113823b86c0c031772242db7911aa7ec636e844f9de87783a150e5df8d1dc1059c2d21e794472ffb0cae910321e1a6a089179d7c9c9a280f6b6a43ccf49b8c652a99e3600de00b271edeba015d7e3277885175de614c201913c253cadffecfc296da8b7b9a8dbc4ab59dc381ad947fcbeff45fe6697638bf57b0c747f5efe9aeaae9cb306a0da292c8a55c6dc2637d4b2d72876827ca953fa05391da7c12e3090634c335f5cbf16a9f650d6579870d3e87f704820c40ff7d27fbd9a237e8576f5671acfc61deae3dc6e3d624e91077"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (172, '{"ob": ["15151515f6eeee74892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958af6d632afa737695bfcfc8d2657a392fc67f555efa457ead46f23699014e26313b87692a6984397b7f3ed7956dd31347276911beb4eff8477f959c2afcc22f5a47aa29e0e3b6955f8f02da242eadfd096d4ed613ef162e3e6a3d1e187f2f7a02b073b2e5b46134cb4f5aa8d8d4e0a78f76b279b978de66c806015de18d2f12955e512a642c16f8fcb69cc40a40e94f00b04aaf682a43c7f714ba44be001d54da561dd3fe86f937ae39bad7da16a82d6adbca972f0b251708b48d9ec611feb3421edfcc65fbea9e48dcfa89378f0cc025f96dc6e013711f2df48217e5207bca0a09db76ce8ed134e306f018aa8cb23b49836e06e817448a6cb2644e248b527f579a6d94b473c769bbd9a3c14dc8a70506fb982142cc42ae2ad7456123e576a05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (173, '{"ob": ["15151515f6eeeec2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595184e3f2a577c0efa178f9d768779ab378df89d83c9607e0ca46e6ae11fc3eadbf3c5c0d4081d3dd9997854a006a595605a081b9c88d6d2d2b8e05c3dc9ef9d2bc62054da99f098ac2351696a3c43465953020cf681070cfec1746ad8bead605711483c14357f6e00a7829404ef4fed8ab254f87bfcff8a9a431eb42e83b03be6d8b7f837d7e7f8b15774b57d9fc77c82687c2f3f23bc140ff6ef354a40b56aa6f2d882f94f62df470026c654e1dfaa2ac31b66c0c5b6204c51075a33e5436fee913966b39209da0670ff729bdb447bf6c51370a8b2626f35232e2ac8e4b3f2aaf04757bb17a4ed102a4b894df7b01a7e85349ab123b81d1b41056c98f5a11355e9e567a90acc65a8f0055399cfb26560a51aaca451e4d093f1a29048161efc80"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (174, '{"ob": ["15151515f6eeee4a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954e0aacbc56e3bf6271b9d52df06d8875d75346a84b4e8a0ded854bb3bfb1bb146e7e331ad031bc863af001d4f79dcfd62685008a4191ff7f14192a60255f9deaa05cbacc3b8bcb4ef8dd727faac94a363351009cf077970be679c9f5fad58bde79e4496e3bff27c8cc15cb44dd3d52c0b8a9650ad512ef83805def28e51dfbb622e34db4e6da25d4d506c64646d9d33f1047abb8a72025d57ddf909b294c5ec7b61ed952f17a2f28eb256211ae07346ad8f1248f1260754a0865ab44b5cced6e3fe4f67afc783b5cdbddc5e761026215f410514690541abdecd09c60f20176449aeeec4b5ec7ead03bda3300661ef847080b3f33fa978a6d9b1e461566a21b714d280af6726f0bed870da3edcb45cf6dd4b4a72b5211f74705a327686d4723ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (175, '{"ob": ["15151515f6eeeea8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595deb8ff976f14f67396cbddce6b05e9f83c3b616389a20043744332f5d448ef7ca25b4671e7030f5c60af1d495e3c0a3f12cfc991f8bc3d726b0600db8ace012f7545b1a2bb5c1fe04dabe8f58db9fad2d946032c578a71a1006af9ebbafb2c7b48cb8f3ebbdf4b29d0c7b4f5261b06433e6c81f971aebf3825460ae7a187a772c1884d248bce7cae52145c7195dada918e3ef4f81da2b4918d345cc62e7183c6cc46a9b94d3547dea5d84cf2a6eb8567c83efb502c081e784d6deddd008718ddb45622f7c8d7cacbba9db104e7d6bda3ad3477596679e4f99ff46afcab19e792d81aef61f49d1c0ebb50e491edbc7cd4f6beadf64257889dc72a73c9ddb3ba76504c879f7fb2a0e3d4f45e249a8df15e6aa5aad1c5dfdc91849e816bd7bb9e56"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (176, '{"ob": ["15151515f6eeee64892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c10a9f2ece1ed54ac605d7154ff410778d45fc545ce354aefe473b3d952fa3a966be36315a0266dd179d9b02d4ce25544bfc80ceb52666fca9ca2abda0109687e51f6447b20abae8097187bda369159e01824eab77e0ed7782485a2def0e59e6cd478542a90fbaac866b9ba9f280c3a85ac650f6e6454d3f2259d2e8d4ecab15009409fbe8f738471cf46d3dc86bd4c69a130ddb81b68ac170540d2234257513b0d1cc6f8b97ef9531e1212ac6a6e594c6a4fde32bbaf72f3d5fc88633b9e7852d376e92892d1644ee380fb44be8a6bc7408122015e9e3a1398961b3139994a61b459fd8b7a877ffbb448c87556cde8d3f70ff7d7779c69bf0b10761d0d1cc816b8f3e339837a1848723406b4955666d14d1634f7644147691e367d2b14a6e95"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (177, '{"ob": ["15151515f6eeee13892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a1829778ae2dbdc6fd38158a11b61d692883ccc9b4257cce7818b8c79a19bc9432e074ce758c29c290c04fdfc2030ec04fa875c3578e86f5f7663dd4e12d6f293560e5d326f33e0e52d8ba338e8721a6831d37a82e25082fade6f9e4b832b062410edb6d60d4dacd77437853f7489799b177effd564c241c336790d00178a0e44f7dc4b9858c24bcc765f7e3a6f280b62b94dc3adc1a9bcdc863f29c5207ab8bcf9c25bf77373c366acfa2ed0574df8c36d00df13c66dcb50439cb0cb7687864aaa9d309731af9e661b9cb14ace8703b361f836e58dc8a0a75224fc3d24f769919447ade4231a151668061d532c3468db052826dd3c502dfaaa87aadfbcbfc87aaf99ab51026771ba82acc6924c6482db109705791db6438d54a504024a65562"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (178, '{"ob": ["15151515f6eeeefd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959920ff923e212119b4d9e27b119636d95afcf09cb57e2c54cc1416f09e8021a7720f6c0eb7fa41b549bbcd82ef1111531c15b1bee3d3f077eedd104e90b322c7a11d9201c85610c6ba48139e041daa837839f300be1317d6f648d808c08d6caf01876ac6ea4ae165631e93d63be1e387cdb04bce829424fa08fcc6e79ade0a5b9671e99be009b301b219255e812dd8d256572ed7e558f64e0719ae1e4e73d3208052760394c7e6b21fb30880d7360efbf0a3a74ce9f599e9b6a3883d2de1a1d59f283445286fd845882edfecf675186402e1b32f0dfc044de410df903f986f11bc29d47e6178848b624395cb527063a8bc14ec3d8e52fd3dad5206daa027981310ce09d1780e8f0942d7e967f88093d2efeb114ab5175dbc4560f9e7a30b6a42"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (179, '{"ob": ["15151515f6eeee1e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bfc2eb07c5076ba7f54f1f41d501dbc7ef0ea2fa73c3befafa8af867a3657ca3e9815743af2d7cb8ac09ddcf889c4f103c0cd8a2b3268fab2dd7089109d4c9df00c9e066dff187b70b7ee97f9c2c8c3a4b6629e228ec67a39d13f1ebdc747dfd515661c9c251ffcd590d96c1684bb4a197700b841d370c97b9a0ef0324863282508e8abb2298ca9236c6063edceed0597d7ce85483400b642b04319e9d0aff331d1f96d5209db0380a78ecb4a26090a24ab7b066fc359444772e009ab090f29a2e1b3d51e8b458164a4f2c2e6f60c9cfd5f6f76a903c4f36cbc7b372ec421944940673d3450c7f780158b2c583296eea3239290cd57b4f0c25598a4a8e1fe7ce1f1f08e25c7fd80af7c6969aca466a177de03f38ce9be0725ad82b06a7cb7ae9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (180, '{"ob": ["15151515f6eeee37892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954c7c82a060d26e0319c5164ad18ea2dcb67ff4b0880d2f1c6d466d422327179b1d97123444158e08d78b3fa9a9e26add0eed0a75f0ae3600ee098de7de00a9e92098462ee6f7cba5cced832727c5e011a6047f21497833b82a5fc14cfc0f4f1e547b6aea622b6c103f3eec99939e5447922733648b9d3ecae27fefacbe8bc3358ef407986ca565731efd2b97a2f12dcf220c8760924308e533263160148d1aecb97b0bd0c0b83f2c442f5637872a976e43529fb3bfb04c18f57d076ef1d9ba77f00aabf57fe1910320772b2be23c459b3dfd33da66a7f163c3870a021eed041672d82bddf80e4d40c6938e49bce9d804a930ffeeb001dcebe01e6d7c7992ab90d5d3c7e4b9f6816a8ccc85d135535baea4f9fd02eaac0006e94bafae9ef9d7c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (181, '{"ob": ["15151515f6eeee9e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595591bb851033682a1774e74afbccc2af043482f3adefe065ee4be3f24992f57eeb11f6e8b546c934e0053e76cacf53c52a9c3a83edfdbc9d4817a6ddb0be573c6bbf2888db64daf96299a1b1e166c58c19c19200ee5ed75419f5c180e3513e5c8d76e5dfc0d444865048c89d857e790bbe721d7bfb7f6c58a5f9804e982d7ab3c5672eed3703c8defb1d41588e196e658fb838701752e11dc0b68bf966053370fdde0fea7cf3f1c22c0b6c8ebb7ca980063f72656705ad52987cf1b16fe3ac8c122727235fd52aaf44deb28e02662654a6dc98afe32fd4dd6672caef28975174abce5b9902ae0ff7cce36b8c26f007bbb6f5f39ea88d7fc7691d75c1a08f502019a878e05746e1c535ff9dcc9ea77eeaf87cf533a712f35fd2aeb776fa6172b94"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (182, '{"ob": ["15151515f6eeee5e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d06d8a4ae7adc04b4bc40b84183ec71535f07ab3ac639e2c9c87d072bc6d79caa4b0a4e33bd6f453c84022e2b1564b5e56c2bbe33bc2ddde87fc57f537b43cf314168b70e953d54a5213babfaa74b71c16c5609bea7ad71abde8d1140085c5660a6b3cb614237c9483b414ef436c3d056ef05024add0def78980a3b8d3a9276b01bee9f9e7f9eed6f3c9845f98c4ab41c4328df9b88fc880c15007cfd5de8beba25f0f55e3a9bada6cb95b8de668a91f546bb1e942201b134ae0d77f3e2c590ee693eebb4e20be7c140b4bf4b58f1353c4bf3a18e5f7fd3885be6a4a5af87ec8094ad1e4c56ea2e344457167d9d33f676b70cbb589fc0fa1c02506d3c4143858278ec960d2e6963625105e9fb3e1299841e730a99fff6745d046bf8e6a3829eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (183, '{"ob": ["15151515f6eeeeb6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954972efcc1a7376de19f6b2eaf76cf9ffd61fa6e490c46ed7617d22917deb0fdd2f7e4662b33f4e3af8af139bf8477f0d32288cf6d00612b1860aefbdbf20b8efee9df84a81000a7c861783354174f6ff1a0743c04c1f2ccdce00215a3955600908fe61839b5e58a0613d4560796a2adeac8bbdc63f5fda5b8d42799bc48c099d0569bb4fb7496df501532a09ad6528a6022a0f2a32ce3655ab91b5f9c217f5da6e6a3db3505572eb3ef77e5e2de7b284eeb473358b3057a6f4d8eb2e423caa326938d1fe037e60a073283681e5b2f6586147ccde12965763f7fa410b4004502229b3434471a76c7e09a5a9cab47ab330fa62604866fd2230b1b8027e5f8bc6b968428c2dbcbcfdcf0073b183f6e41541c89f04156846549d128615d8696f6695"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (184, '{"ob": ["15151515f6eeee86892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c30afa9a0a241894239bb055df80ca32c786256b5b17cb97defa6dafb5cdabab6481b8c996aed5b4bfa059c7f4c13d5f0d7bb5bfdf0661211d6c89efcb1ef14b44952ea824fa922ef21cd555cbbe5c197917be26e29399e8c659ab50e9870b9c6929d6c868bc86c69bfc3e2048edc73477b4d0092ab10168f6912b387d1f7aed026b0131422a7b1256376183183b6971c0f6c8662b53b0bb297f9f0dac1433329fac3013267edc6c15755063ec88d20c3a77df6f215dbc95676ca83b731a5d9cf5cd6dbaf8d2f0465c2aea1618cf55902803fe76614d9c0bf2113831cad79d2f8c16f1b526ba182fa06fe2d927e30bdca56499cc8dea9419dc7ee07760f2141813b9f072144051b95daae8ec4ce684f8cfdad81183e9953ceee270649edddb3a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (185, '{"ob": ["15151515f6eeeed4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b63b6f8e220e0f9e8d8209a7286647673cc6118e56c53852657b5e7f96966902789e06b918ccef89e28023929b04122c7ba4b3db938d41a963962ab784c89ab262bc60eacb420417c54b04d5c353108c2ef8a2784212ade37a37ead08cb4c4cd7e8bbfbc975b7ad6164a8a965ad2a41a13da9dc6169d49f6b7c630f695408852e89bf24e69363ac2daf4c87c161a0413b2ce13f9a8252063dce6b71a230ac902fa77b07f20edbe5937acfc9f579b3eaf96d95bcf8f2445470b8637e2e3ae9776caa43792518374a46362a5387cfe99f1bb6f648d735edcce46cb209f9396113bd0aea48b475270cbfb6b8c1ed59718f41a36dceef1831b48869f7d412dc09773aa0714f46362f1cbd4da793d53fd192a2d99d18b7db7e47c692d9e43d8cefd8c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (186, '{"ob": ["15151515f6eeee15892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d03750c003b0ee6c69dacf1a18efcbb39570024c33e1963fb5fe1641346dad6e4fec0871a1e465da8e97925881872731bbea30dd3f42de8b1827a58e5db5ca67a92759f840cceccfb712a27e1d8b4d0127dc481c3b08c9e19b8075a457f37b3b27ec148c730b82d6af84f9a0e42df3767900d9a89aaa17f2c79bbf0585d20ed06b6e9f99cc166a0c074ed49fb5b27a3bae3515efc661f7fbcf3803f512644cc43d49f65650e7d3b9da0015afcb20ffa56b95cfeff22911ab2690c52b91af0fbc96d5acec79170e79cddf927b6b934fa57439891a560501d292b8dd2b22485d19c9e0d3ad1c46e8e788681d4966e89e920bd20bbf0ea0218fadb1cf727aa5bbd9b4476ed2f14dc2d9bed8730a2c46d329e00a83d6939e5f9f2daacf2d7990f54d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (187, '{"ob": ["15151515f6eeeee1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595475bd419bacde493c98b73ba43d259c6d8942aecccc63f36885e1d1c06b0104bced99dd95396f5d300e00f7a84918dff2eb256ff3013b1fb4d8d48167d6bdb00f606907ab20f7fd9c482996c5af6533830df382d5febc879b457347b7fcab696f88425d02847832d78e4afcf2aac66b394eb76eb7d7ce3b77770505de652b3f7c69127d463a9a3d2e6fe1df5a7c1f9f82aef18543f47ddab9a89b13d7f2fcce105a4dd794ab353796fcc538e07e5cad1056e4f04fd0292daa8d3b9b7ceb295085586ebdc895219ae2002d1300a0e109d5de6b1a716e2341d8d7ee082351494c2eb94096d889d42ffd659e19b7dd838931549c2d34f4f4da236e1402e8ed8efef849efa335ff88b966b4897ac633ddc56edf585458d870c76d86a4a656f904da8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (188, '{"ob": ["15151515f6eeee6c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459511c77aeec739b1d69a5cafcdd8835a828c923be55525aefa60294eee0774391d4f78ae827f2b2ff0d91907891eddcce5308604629dc0b956beb4f62cd082ef807bed09fda642f3b1455359b828b3107fc12c4d3c2dd62dfe6a9d1f6a5ee56cc5260effe182894ec7e722a0d0aa89ae679c0abf66f0b6e50de5ef25b1f8c7b7acce424c8fa5142ab0d713816d01fbe95cfcab0ff0b45084c8cc6eccf796a90b2e7b5cfca260e029aa66bde9ee6330ff1672def5bd33d577d8954cc114daaf6d7b78567d8fb3d583fcb893832680a951739553b6591869ff8040fe50794def2b7cfc47ffa18ddda87bc3136e602b31af2127fdf4e968f910dfd1f50b86b5a8ca775b109fbb0bbc9c2c40a4f7e69e71c13fefde4777f5e7f5a5acd478d674d10406"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (189, '{"ob": ["15151515f6eeeeda892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955f02b2a7caa6e4e2d4fb601521aa8c64e67d0ac850da905c2e70e4a7811c0eea4f3b957f6e31c512498378243d62a7ea909fa062ec895821d3f101c9f9cc5d03d9142c2833a8408e24205bc923ac24028187232e780aa60c54188ca7c49661ffa65a628ff1f4fe92d0798bfef9f020b605318edfd33731836e076fe10cd919ffdc4da88c16c9c4384cc7c5fbb6489fb6ffb069f0b4af5b2e8b265e037f784e0666815b7e69e22a253fd216c660203bda2cb3f990fe2c6e4f33434ae64f4d493ac89d88728927081c2fe2997da0613df531989fb77cfeab90961b545b0676ac30aa0d9ab84810d5b15097a3a3f36cf7e392c3480e14699e22c546505e5fd4a4ef2b2cca4a4916f5734e56a6f0c38be08a0b0b810a14cb53760c78ea192dcddeae"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (190, '{"ob": ["15151515f6eeee5c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b23b00e94bf2305b1c2d5642cd30f435401dcf5af32bba979b17b88877b41dd8c9c6d7c9b7a91ee75546db70fc05e4b3b11f2e1c78a8334c27e476cf5ab740614c92614820266bda94e867bbfee1ee7e3e6b3e6461c48cab707fcd066271ba35ad5774160e0f9bf93fc66e03ccbc9c508fad8d9b13b869e778e04b6f487aa96f5f77ea6f20674866cf93b1c13911919787ad7de50dee5c8894081ce4d5c81efac634805f57daa4af4457e0c221d28a542173dc6a83b56c7e7907a352c0e6dac7f7393373d274046a5204abbadd018babb788e0f0d56f2d840aa73a0c1acd06e51419b42bb00e16315983dae1edd624a287b91688bc30dae20c8caf33edb423b9ef6b80b8abe03d64e9e3ee7486e4e4dbc170dbe68927bac84414e4dd93c6a1e7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (191, '{"ob": ["15151515f6eeeee2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45951158ff8cf4115c0601a8ecd92d27ff055893a72ae98d427e8549d3c7b7b9630331546fdd648c299bc11ebf7e4b0f2935a5911c41a82fa60955ed92d7de37847ab6bbb819f0d2abcd2cf1eb714a6b219513458a259a6686570773d0aefc9c6ae11f4fa835683b7b5ec8bcbcb39bfefdc153cf6e772ee8defcc09bf44fbf906a8cfc43d8f835bf9e642c816d06a80aee131a6d8dab8c9b0365f3f5c883f6274cbd0fe3c7c5422f964c33d058b77624b1ce9119af5d39d66d5a288cb36ef7b651403f9aef67e864c6bb29124d0aedf964c19251d8ca6e38aef098829770db261f1e132a2ba15682dd7f9787c0c7821de2441666d2671afe2fa0a7e9921087b8e11d6a2aa17b1e45eab6dcccd5e0339a283e936148abfc3dec46b926605b707ba49d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (192, '{"ob": ["15151515f6eeee87892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955f0ef344b9336527ffd371dc7be36cdf5d42a2f330fa5a28a4a237eded4fd99c9575f25e389beebb794c2daba548880b5628050361780734599a2b7edae7b303c499f38e971ffdbc6939e82646351ec34397b8cc429f25d9243abb82b66ab554e6b91fd9c94e3986e6127d9eae7acaf5499e8baa007d49acac78004ee0802a33640d621a79ba84d09679fab808a6f53aae308ee7eb3f5200fdae54b99c995e5fd70854a8f0df15a6818bf135bfdc279190ca835c278ceb8897ed887792cb25ea6d9af31b27d38a510a3b7094d0073891bd753b77b3c4c7b0be1a101e1fc8560c66a3a4a5dd6a8cc1e514340b6fb1217e720bc9b34bc0579d318b05e158007d1ce111740ce420ea19f0cb8cbbd9b19f00ca25877ec3d9cf3183b5556a7b04bde7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (193, '{"ob": ["15151515f6eeeeca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f84fb9ecfc81e4504c15f53f1c08e16daf769e0f07006b6d7eddd7e1a49f84f6fcd837772295d7d33d7b5581d07442ffedd2569394912fc46ddbdbd9dffcf29d964d1c29b0734caf621f6e62d79f93e45363d5153893f9ca31fb24eb2508eb992f7b937bbc4eb772400d69b9b3854aef82b17bb616109aeeaba3c2b81ece6c37f4045c10d4409a00965ddd145854d331e43b29a35d98e8745d6ceb61b1947369f0dd47f3a6418ecff2cd3ba8b49fe4f5bb3b066ee48edfbf5711f5e5a8486f0ee37f1145eb6f5a9908603330c7f3e09795ca386840f6cb3867138452a815f2b1520dfe7777a6191dc7d0da3a51aa713aa09924402d74c8401cd0268b1ee5effc500226dadabfb5e7589e0f55ca2087c1b7d1a4f7ab938a6316d3d64c6fb16da4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (194, '{"ob": ["15151515f6eeeeb1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595d837ad233e359390f761a9c9678f849bfc282e5d71bb51f19168339ed1a604d3eeb3ebb75fd7ea9213003edd8a7c0b5d66273c90041c1b003d5a26da2cc68be6c7be365714957f7e7eae7f6a105cdeff8eb3ebe14c7153ec08546b5dd3c1c58108063fead728006f9f3512448294e2b77a78e1a6317a50b23c0aff74473e26d597611cc77784c116c343e0773a706fe367de5a821c47b21f751dbbda4ccabdd11d7e712c411884b8041a5ca8077089136e5ff15fd95afb5be877d75550569d45d5f0e2d1c8a4f5b4e77705ca7f1342d1404d12419c9ba3eeb0b02e95106adbe04a01de5db66464d9b902200509b066559c4ad7b1a7e5cb530cd032cd2814856bc605dbdb7a9ca7cfb852cca0e0d2e334c8a1c21ff361e1b4d539816b3f26daeb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (195, '{"ob": ["15151515f6eeeef2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459537c8138d06100b7b27a702a2207d13853ea57cd0d22c76fa552461e6b50b334443eb8a50078bb478fca0ca1bd9f3e5f3235d4cee97f8034e3940a6ed6b3390899d8d9367860c72eee7794eaccc08b395e05096321344e13c131fec305906d64404013a57f747b8f57a6032765d739937f07ccf1344983ed8eba7b84f0149bcfa29620c327331b79fce70b218592904ffd6cf5f8684f66dbe99111e8a182ea4d690d4d093c2a574ff1a54ca1c58a7ae9880ec967bbf666bf9be8311d8a930d73811675985c3c4e5251adbca59b9a7f60dc9cad166ebeaf2f1d274ef431356deb450c708b8b3dbdc393d057b4e51b4a970159f34f83bc9b2e4bd67fed80d6482e37e75211fc8ac76459e491a2c1bd157d51fbdef2b49c12978c1919065bf04c095"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (196, '{"ob": ["15151515f6eeee7b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bb4c30b53e54429be19f5e9411411ed6732f9657c6173fc79932e53d46d0bf78ea287d680d5545bbbf299a2e053449e2d861297c915a21b05776f0a12a683600d28aee885e7ec4bb81cb78fd668fc4a7bd92880bf877e64cc866d94622d6812e02d2e954355908654e04b3c521335dd564910f8c3e547d208b126e1f781aa57cca1cfdba3fd93ae6b628052dacf23f9ddcb54116c05437f5c9902582ac5127f231385c371da3f853b6a32e566dcde0e1b9417a8946547c8df98072031d8ba2e90ceab4d2a007cf0321b64725a78ce1b6ef82bcf9a0ec56b79d3a4cad52b95c897f5bfd4c6cec0aeb0e4ea49d6b0aef6d677f1224411ebc74088f62e8cc4cbe73fd08f05a3186fe8d57898fd95ce109c2b373d9a662089db309234ef1bc9f9cef"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (197, '{"ob": ["15151515f6eeeee7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595990e4c0fed2d2a5e24759210215f3433fe17a5d3f3d89bd58a83e2ccb4e917d209b3e704e498383a2c8ac802d9af5442d6f8d53b821acf0c9368e7442773610a92c6e9f86d9ee7f6b165989c8c8e629a73270d6f1f858a9d74af6ed13d1cbaef3850b63379e3fb553322d8540ddf0429603c8a116251aa54f8efc101fe4a63e3d87e445f2b126aa4210d928d172f97b437314252875ffee2fde5f1cc18bf5833353057b6c1906140a81ee4dd01f99649e43cb019a93b87b9838757dce5ec0b08270a987253f70d2e2e2ef54721d618c2f1f70c90eb5de2a7e6d87525f9d3af04c376345d948737a5f371dcd4ba9b15c84df18015d2fbfebfc6b2c680dcdbc3317066b97309b1ec14117373a6e1f88d857fb0d501e8d5dd71ed927472336eacbb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (198, '{"ob": ["15151515f6eeee34892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459513dcc1ffc55786ae1592b3a8ec2dea80415cd46ecab20b372e44365a8c18fa9a5c4820c136ccda300e62a26c7fe87475fc228d5af587604e0a22b23bbb0f390aff854156870ffd4111e251a45aac6709eb5ed8ceeb90db8458150e3675b16d3dea4fb29672841ebf4024335d987336053f3d5b6f17b0237f80e095ed6c4daa832df8008038d4fefdb0871638885efa8a00b4fd68fb28c8aa1fd66f5dcd1e7cb1e7cc30639a4d1618e797b316d1230dfe317cd1de9ed7e83176da2715810fe15226dbbbdb5121ee3537b8671f28a71ddf56980756260b7a5410b348be71b1ac74da949917e24db5eba1b59469040e1e470e63326f27bf5ff3248be899c948bd2c3a961c45e5b127a9025d93792fd4d1fa431f233ea4290f9a0f292ae527b22e62"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (199, '{"ob": ["15151515f6eeee52892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953240ed15294ae5096a2bdb65536196496c8add123a1a73de21aee5c8dfdcab6d29c8b6501c3e3b72fa362a943ee9f939a935fc37b1e1d0e2d56f177c242ea225aa98c4188193cb4f4d5dd87e9b18a5d57da8424eaaa4da0e46bbed1a011f76d4df1e1893e691de77da4754b6dcc32475311f342f792d5a652120cf7e914139cd23d9e4cc91ba46c7b46338543fcbc3ed4c8e3e11bf743216f1fcc1f26a935545f73548f931b56a5a77554845cea9d3e0cf4f1f7ec06694f3454ab90e5ad7b9eb1ad083251ddf720c5ac1bca686c3e1863e5cdcb755bfa9ca1d5ffae865b52f4e4f391c7fddf9fd3de2c1bde59fbb5549904428fa3ae93872f05b48b125a0c818148b68e1e54fa3bc81b56bf5e857de35a5dc743f59322fc79f00280d36f46bc8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (200, '{"ob": ["15151515f6eeee85892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459540935168931b41fbf3e30bf0d91a4ae1b121082313832dbd726bf5b3ac794950592713e376fd813148b23d7c92b03ddf1db4cd742ec172e22343e390cb55cf621e185ea6f430f05b9356e934c3d97df1a70ba1b949db891e7ca759e146f317d7074fc868e619365617e62252610bfb4a973937cc7fff3336adb743dac49fbbeef8607fcb52e45fd03754e8350a490d6088ed771a3707ecc9e7d26a34bcbc21debf4eb36175c84ed1bba38e851807a224d217fab7f28f893e4a65517024dfc82278f93b1078fe7750a80c8927653bba87e96cf6c3ad210525a12e4ac073fc7eb51de3597322d4e3042521114e9cbaf84c546c7e69a5f8f4ad841281e89d914c6e797375807857cf7bd89dacfcac2065cb9764ff55bb522df3134dd1a76fc8fd87"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (201, '{"ob": ["15151515f6eeee3a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954ec0a5793fc654df093405a1f4058194f92afaa413374ef692b53ce8f318635a5370bd1748af4e20e7db5f36e8a84b8bb6deaee24dc16e0d9ba2ab62a62fa29f4925aafce6032d025cca28d6faee4c399fba2a4dc5e59ca0f4bb9d049e1971b0e0fed9a244477e0340947bc18b907a0d90faeba6bf24b0f62a67fb0c71712c1d1b791c072219a7b81e463f797ea182f4206f0434f7783a80f83c00bac105ef2778bb0726846345b0e5faab6925fcc4d35f0117894962073dd16b10481ce724b95c73d044ed525ed2e1ce717563b224dac75bc7cb066bcb3e134b530a47b805d6c33a9f88fd6b2de9ef2dade53aa68bebe102a27c4ee72ea1d623ac3227a36be85f58b7ea992ab37d36320afd8888849e00ff769a96e9ed3dbf3e851ed4ac2a80"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (202, '{"ob": ["15151515f6eeee4f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958f8fc9253df1a0bd9cb2b5c8c8ac24226ac2673946ba701c7c440b95a3bea04897ae5f785053f640b4d1d6c0287ff799f4de3616fd7178c1747883ca26af8526f8c2dbf6f5a2e042768282d0ce27fd57d03c2eef729e361cc75132493e2ce99a99d3b0663df4bcd93e11c7e933d6dcb054616764bbebaaa86337a5286eeddc970719afb31b497456659e6afeff98a1edd7de48e6d3dfc3ad8b1da3820fa0c3b431e1a08932b987e9968fa95b7bafa75dc8a551311b14bf0567a422ede2e90890b26e3461d2130e9149bfd97669879f5a9d13fd2d8ef1b68d5f2431a82afe0f884d08360fe7d032b71758aebc89498403d2b584b491e01343171c3a94660e69621a78519fb49fc19ee6cd37fecbfd5c173e8532e2b4047b6a6d3fd36bf1c5622f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (203, '{"ob": ["15151515f6eeee6f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459522eff2c7ffc4fba1fc7439369b16b94b9de6b668acc807e70ac0c24eb8688e446160b43a5277675232ece1e6bf78290d11fd373c5f4b6f7c6067b6b3180e3a6f7b441a3adb68847a64f4485b529508e9d4949b2e412939a017b86efd55501b2242c298df7134cc092debdcf3b73796f0b9b060f938f5881356691eca270ea39311c00c83dfa0b19873bf5ce2bbe44ed7009e8a9ecff0652aa68b391e525d312e01b209946dc3fb71220f9212c063e49248ede7562a27acc4ce2b9c190150d0b6ac7af523f1a70ea678607aaf03c4d303c6e6c6d2fb427788e4bf3804c773350c431a1b28ce61672ba80800bd9c1f4dce63acb0c5fd9ca90ab089f4b2eabd4b05ede8d89966ee61976cda9fec33429df35551d3ebfe3a4a7f01339faf4356f0e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (204, '{"ob": ["15151515f6eeee11892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459587674e8f4e998e1cd201c675d102025d1f9fc672e434ec8b3dcd0dd49b722e542ee1254dfdb9626d946a3f22766389d20ec8c1089623703698667a30fef89df8f1b64cacbcb784091a0df78000b1e8275b2f521a3ba4ca8450d38909c2ddaaa1a2fa3eb23da3f5da3781754d1e8bf44c9823c9abfb12eeae34656dcfae96b788163f1f093cdac2d7db8d57d039c40fa83b9aab5e323a5ebbd8c052ae99def2b7f4ec0d16a2454be7dc316c561d7e271c43ebcd42ccb9cb74032fdc79948cf277eeb236987df173c6c74e91cd83966037584b9df512b716c299de7ae779a60b3532b6f618af4ec8c36aa1546955a24bd08ef58c77c19049d032a94a50b3f6cc12381844709684ffb1bf9531790b5fd1d2b5fe55878edadbca32f13bcc2c9c2b10"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (205, '{"ob": ["15151515f6eeee94892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459584a5d69eabb489ac8c8e2aec93daddc0909e25fd8c4bf7f8a4b11ede721c0271a8532fdf89843710cffec682f9933c55c1df83dd3d394e2095e6548e722ae441f41a2cca9ec01818075c93fb18d8d3ea4f775fb18c9de341b334f2047d2af07f42f434fd65de93c6cc71c57157fe5beefef50ec79550ec13009324365f52a02c2c3be13bd89a3f41085b141b20d93fa3c5003fdd6ef3b018fa4593c0d60cb61106f45419fd374ee6d5712885fc424f4d493c2d53a52c9a9836a55ad25c3d3f07961e5bace7fa51a2aaae4c106d80a98aadbbd771ddf405701ad6c4097178c4be22dc0a5a645f10413e2feedbb98f448b46205a94d735f4ada345768a6bb2b7253c78d8bb2e57591b519ae0e1c9891a88c1b61fff97ab20439df8b47b02bb16c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (206, '{"ob": ["15151515f6eeee32892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459533a0441c8f44946e3cd19b8283fc95064302cee3515c5cc90fad14727d073648b9793294c1c7ff6a31f2edbe94f40b354d9ad2a9fb3532fa28e77777b2ee354aa5ad08050fb85bce67009592ff37c1db226871dcd74c6591ddbf201e920cb90768c7271bfc9473ae85bc028d2ccbcaca375d496396b0646aa04d41202705fc7e1b60548571e769b8f17b2660202bce6c7d97beeacec3e40e05af881157edcb9566daaa2b26e93e3f8b548df13db585171434de74f434f1e8ac584111c86010b4fcb2e130cd7421dcd99378cb675c75ed9ba191ec1862a9ab4a0ca2614b1525357625c950f63088b96d8732b36464cfc646d80b4cca64e0c0b5dab0acce5f2f41bb81faeec9caa2c1c313e5dcf337ada69ed848e98f6fb737b652bb6f103a19c6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (207, '{"ob": ["15151515f6eeeeac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ab820cf583b705435370afb493a408adb0aca9db88269efdf6ebcd6c84da1d87e185ead82e350c102727e082cf26f52a644ccd1a312f3202ae765f09d0404ee091e2daf493699d510a6b13dc9c533617c2188c19bdc222c13240a805cd1f46449660d51005cc1d2645875064494438f4240a7c848b062e0c7b488e1fa88d677d064ac1853908a0c76d3b86af6032b33caa008cf8107464343078a16b57f6345da2ea9a72ca1b7db4cee200d167b2007d61728d89743cbfb894c742aec2154db1c80664d011d305a5d5ca532c85bd650ab91e0f43c4ffd1a1613368e29a56bd922ead73ef22751871403610c4bfdaf47e46846208ae1c73c70c2aae879badcba1752e511762a89a1837237cfe5eee943e40f17edaf67f6946f4055e1a0a28c3e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (208, '{"ob": ["15151515f6eeeec3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dceccc4c8c8ff9b749a50827764c55be0113a0854a417def8ab9b64525bd0a05baf11953614dc2d3ef866b5e767ddfd48264c18d37549ce7f37d3f8438eb12ce69db1ccd7c760e8cb8b847cec39e58b38588114ed7881910733802c9f911a47a88c2b844b27c86757ab71c144ddf2e1bef8e9bbc1681e2e9a1055141be352effb4e3c0a24bba4910da835eabbb94802d519864f3565c15fc30403dc053dc93dbef8aacecb3937690ce68b6395c73a814503a71eefced361925b021bd4578af7c6bd23458836abde4a9df584e1ff38fbf97f35706798f8d2df181ea3f783e13f319b27360bce13cac19358550fa37aa28fb916ebbdf968206390482f1a8bf33c65b184f992621b54dff09f6bbb1aadca2027dcd447b1f22faf0476c3df57f8602"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (209, '{"ob": ["15151515f6eeee51892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c6176c962e14dab5d0d3584cb4089559a43372ec279a126ee324ae18d61d22904de2b0e31b4eebf6dbfb3b56880f6b31df1619d63b4a24a14e97fc566a2922259130c4615dd3717fc2f5aff75576b9553682a76607497da6f2401f1a9c2940ae51991cbd0193bb66834ea1b43cc6b9781f76aa0f475051525caf58354f39ca3d3c428b1adc48f418c5830ec09a7e79183ef7cc787ffef7dc5258cb479baaeb632a1b223672d39e4c324de95af26e34be7de1e704e92922a857ea3926ba81c6cfd5b7aa824fd69212cdb350d488ed79af8ebb471485fb876158913ef2454a60bbd48d1d77d739f3be41048ff12fe37eaa8221c4b860039fe4c414954a4b95475896f3c440ce7254ecba126415a3dcdff0211f08ac37251ef9ed43de96abcb2eb0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (210, '{"ob": ["15151515f6eeee5a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a1de441090706fed57497367870cb24579e7156022face167e2a581d278efbeec963878a121e91cbb8310949dc6f12ae479763f87482e3e77cc34fe557edf9c49d98f3268e6a064a05bef23f134a43cdeaedbcd400843d2d849f4c47b60032a4a156bb2f225a0f31c19a19e5c77a86b26e9f6e0d8d45a2b0fb7c5dad87dc92584c88f6b4e88156a90d6ba7bfc61d7c43e47c6991a6fba7955ae52670a94af893156e4aad35f7d90bf3282f7b95d3a4b2c958ad15298cacdf35238ed0d3b2a2a044cca3e69fe1cf7ce513de56e4b2b3d0c593073bdd8a3e195e178c41a94aa00bdea0823ad4bb990de23059ba53f3b1fef9711a3899ca22d91023c8d57cafc00032be8ae8407bd88d625fffd1ce7e20cb78850ae40dc318cdf472a16fac7a30ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (211, '{"ob": ["15151515f6eeeebc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595edc4b21040425917576dc0b67cf96ee52aad2f6ec312a0d3fc19fe4d46d1ea01bdd5c4e6bb1d5323718bf60d19c5998c0551b7d6b498a90217fbd7b189e1990a181ca7eecd9f8c210c8954ab35cc11d6ee7217566b9d9790f0a51a1520e694f7921a8e8b6dcbdffedd527c43db0f71e4705bebc279ee395043eab9e6db1461fbf2eea40a29deed8fe49bcb3a6440de8d987eb0f1443c9912995ff245a4e594a01e7d321a51c217091f4eb26ef9534e246e74769269b75d95d24c0d12ce459c1ab3d40ea1e7bec427073edadbf7309500c13a24edb3dd43d96c72c4ce9b5d17ae814b906ae51dc8ffb9f68dd680ef32d1d04d7950ab0c50e8dd2aa8ed36aad1388b6182fc7aabf1e673a3fe5c320df8b06a166c12a841ac924211271934680ee5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (212, '{"ob": ["15151515f6eeee22892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459505d0f4099fe36b28510aff36ceb44db1d7b23142c18e34a5a46e59ef38efe52c3d27f655d4bc5b504d0e3fcb8bc7c2f8f27aaab74b65d58fc6496a6d2825a7d90169c9b8d05c985c7aea088d0e6b83e970b9f1f4e105aa87b43abdc4505761d9d87e914d4c9f8f2a5a39c3a032cc892aaba6092bc55e270a00d75338571e469bb297b8e285c52560b1f0216e1e50ad26997acd55abaae0bcb28963f7e46e4680f0c673a33059887eca37962a953d942ee994b4fcb44e105cb1d123705a646ed28649b44495e04a1e6ca6b219a2f69e45d3ba0680d690ffa7ea3e62cd7a5ac3772a632360228e66cf00a7115c9ab0e9e692249fe21159c9be7a62f6910d556f140d584012b52b33d3b7a9623453eea9e1220983ca833afb3ff070baa94491e761"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (213, '{"ob": ["15151515f6eeeeae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952d9930fb7f009de883c933028d3bd404c03a66e50975da87d27d0a765679de58950366243d6aac04b08a8449682be031032ce37d747cfc171b1551cc2f53d841a1e58a5ecfa6ddf6e8ce1f3961a8ccf1a9b5373bca1bd607f3cb382f390379449365e245a499f539ec3e5cd662a3365e6a639627fb84ef58da2cbadc006ecb799eb25794621d61a3c53a61f52920c699a0020e7a26867897267a8c821b30646f36fedf63f30a377fa560eac78e57e73678f1ca7874a1c8571d94720a6fbfb04f2657e077895e3306d015725f3eed0e364724784c74fc02a399e0049e2f24bddac10661086bee30cc9f0f633e0827c3db7f529063a0df519f6ee0f08082c526bf94fc6aa28047e2e26ecab7b6a5e66c722aeddd57ec79a19d4d16cad1e2f2bf3e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (214, '{"ob": ["15151515f6eeee04892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a86ffe502e6db97f74312454f241c5d664ba2ad97fdb5c69bc19a713698530d49850bf6000f1e6cf7073a0f01e52436569060b4463187b935c21fd47d766e6c5086e2213034540eae55031529fe7a7ad17eca6d57c8ed6e5dea463cb8d5a56a299e99840e9f05129ea4515f09d042c224da972f0c8ff462ba48e3d4c1773522b86c6b3febfb07f46537f5052ec0e8d459fb9249dcfcd6af13000446979d8733841412ae25ce1748d5475619636b688042dc50135edee5235b7812dfe044c7911bfe269f6feba126236c05d91ac99b0be9ac148ea2313c8013c6ff18c5f6d8169eebbbd4f71d100ba422c45775c09f2b1f146e275a10060f40abf29a650618429523cd85f2f85cff7378def9f596e91632c79e9aaf70bc36364b8e3297fcd8f23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (215, '{"ob": ["15151515f6eeeea2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459527188fd70a601ae2d2d97671e096814f3e3e4644e3e54d6895a3c45d5908151680629e42bea36f41da2d935e77fdbb559c9acad605f01c9c6024711cf2811c9eeca5e22835bed83605c31e873cc029028c89c9219ad422ddfed37c3241a74a7222edf9dff1a063ed93ba57454d7e790287827688981bdd5f7359d52d9edd7183a6945775c5dca29839c6f7c8d54005e0cc6491ca50d27f2ef430402d7875e918eeffda9ce278b6524310ae0f4ed3586553bc114e3b411bd44a002b28d56c097091f35f0e4f4661dbf8e9c98bf1f18e460b5445b411ffb5d5fcb3b4b63166e745cea5a0b1076b26b12f420c3faa53cd23d2f8db93bf35a27c251edc9538f3841dc6e5ff37b1373c40db9e1d0200f1d3da94c157e50479302152bfea06cc0ad204"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (216, '{"ob": ["15151515f6eeee33892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595bf77b1fc8bb77f62f7d590dd3698ca76ef96076e517252a06fb475e40c4049648af5278c69208606327f700567372833c7ad9045493663483a12dd1d964d88c55734196f59cb11a64b3e373bd825ddae9972c6c5895935497da4ff81f66e3ecec2f5b3b87e834937b50629a03c5cc18f777b32bc9b57c5b9c8b1d18d0363ddf0d0786e2fb0d80984eb0fec9f4704de2996236ed84151abe848197ac4a8347fba56fd9e38ab10547df2b359b0c6b1437b016a33298c74ccf1c3e1db3be77539367377f1376757142a3f95cf41f0ef2b0c2a1e33bb9a025f597049e9820c6904fb1b2acc4e6d459310b1c9ee6580d844c7ec3da27fd6bfd358c5161accf7ec6dfdfe3b6b6e4daa863d8c33ee31472813d112fb80bad0d3a72a2d4cb68bfc1352a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (217, '{"ob": ["15151515f6eeeee3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953d8b556d1b80ed1f53aa84551ae6fbc655d944401891c03dcdd280e0b935b32192fd55cd2134d18e5d7c999830e227b12fbe98ed9ef671598cf4298648137477e5b0d8be377c51df908af0f6abb76b479f0249a6becb707a9857b3c76b3c8c67211b5c895ba284f720b8f926e491f2d5d2524c19513f2f15a1b1d5e97d4a94f20ae998e4ed52633e0725bfe0a15b4619e00d3367245b74da475292225fa5f1652dc01a8ad34a78976e6780a96afc88b87a4a8ec1484e8be71d9db3cf23c782914052422eaefef22e33ce5000007d467f65842c90c203eb53d26caff2f7ba39d29ff1734fe48d8f4b2cbca87600772067c3733b020089e420201fd3f77e3a8d73b2c6e700c169dbdb70ebcc5447b12499d34b57c27395e3a92bcc3add1f3c8aab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (218, '{"ob": ["15151515f6eeeefc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595adb22cc04a3baead80c1e3f08481b0e4809cb5299a9f0017ce39786bc2c7c7cf5a2a5969520bd2a8dcb04c37c79270a1494f29a0e89a9d1c78bf54e166ae2141dba60d5fb01c67606fcb7cddc77362946a7e1e6b02fbf4131e73dfa46d18fed4e340e1b638f9d436a3292caf3c5ac0740fc0aaffac65ef016e3447d3c21716e0b7e65e784a243a3339392a10bc63462232543b98a35b48ea5aa8c8243446b4458ddb1bd8618b547dcef0445c9c8879c0d8a792dd7bb2c3d7238437db330b30286a86677c34e7c458bc332412e5576effe02ac8be3bc0ecabdb009c3553649368d10c335221cc46e6900c91d745021e7af463820cee2cc18d74bc1e4a2c9bdfa2e6300c8ad3ff1be0fcbab907c3e51d9ab74b2d3c3bdef3407bd3daf8dca980c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (219, '{"ob": ["15151515f6eeee3c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459575f3664f0027e5161a6ed0ef0cb678146a2bd237304dd70c2dc4033b8f41be2120350310fdfad2c1eeb12c81fb2fc798cfc7412df0ed66b2ea2b3cdc1755d70f025cf2af4ec3874e7a4465922ad90611ae56f08920657f4926d4765c622518773b0f2dbe208a999d0553b8ffcf5712834e18779b97898ccc0694a4964dbfd43f802ca311a22d775ab167ddd9b4c091d3e41fc74b4c5bae87d361f45bc24a4aa8e816730213d0e2a381de111fd8e0e15f2cfe21565113e014e2d33944b708b2b9a8ae5843471aa25ace30ae8681811d2e10d09c89118acc23150d6518ac90b406093102f15c51336751d1e0deb9979bf741280f4ba26a949a57ad771818693dbc79e500ad99f81a95ca35fd94146833cb4a792426ee0759b3b5cafa1d0ba6486e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (220, '{"ob": ["15151515f6eeeea4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958e65e48512930c256943135def1afcdec2be39cd208bc08313b0e39231ba0c6720cf4e4ce7c31cb6fa599611bf45da11c85abb4f54e7739e4dd66b5e53847095cc38b265484e67da5059722a230e6bf5882cb77d9ae30b2736790cb3ad1dfe91a9309e791facca298fda0378232e1a3358425e77fe535d8dac907dabb7923887e08805e2b76361e78e2d89cd380175c5ba9a0264baf3a60577366e9784f5e77780c355678dc255925412a971b96d11a1fb77f19b6bcec54e1d80d1b2a174942caf009aaf2140f60ac235c4b49737c2ba6fc818dbbe8963310546f7b7b16c5487c7d41cee01391f2a46ba698b398ec8d6dc590fd7c6ba0771390cc6a2e65631f0532176302ee207466564e358f67f74c2af1d2fec4d87a738fd3ea3400136ac37"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (221, '{"ob": ["15151515f6eeee30892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952476f8e24e2e25a8c8f0b9d431c6df0ed7a842d3ba364cb6db786b7dfafd5749b48ba47d04f66e284143a1c6495e2aced891a6e72921832a2ecada8564656aec5575f08a2f67d2867e754d901c44560418c721dfccf321c55605f4349c5b47f65ce9a9de1d6ddd6b8044f4bc8b3976cbb26507339fb356501c816b6357c98ac6e869cfdd9f444051992bb8dde3502809e4f6cb4bdc52ed937e819bed56906b86816c89c07dc0418998275d030760df3a8bf560b05ad2be6859bb761c49ccd88b75b0a527bb2f042b560101b069276369de8830c1379d87c18c00b82fa37df3ddd2f01038edeb07a45d49c8e4b08571bed94b033e2aee8f89f24ce9dbc0c03d5ae0cd853868cb18ac1ea91317ac374404621b4a2989b96a27fab92f8e61b502a6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (222, '{"ob": ["15151515f6eeee69892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952ac454ff2d8f08f4c069434dcba5af185266268cf0a71fa6781696ace23579e0b8063cb9fd4168c81e1733a7569680456850f89c83f29a574cb2f5ffef348a7049be2f5b2b7c56b7327ad75523aee662a60137f344ab1f62f660d7cd6b46a39a642197723f5abd5d92dc1057b82ea4ffca999ec684226ef68adb3bbb612bb0c06f3b104fc1d7a6c841de184773e7ab8796325d13484c7c68186175ee39307c8009102b698f7db3e780b9734e383d5b1315e46f58bb392b1aed51240412797c263a9657d11839e21cbab6fb1945ee7a29498b00f97468315993ea63bca88c9c8d7eb2482a45417e040cac91f1d0e4da8d6d903d79521d1a8eea2e52e9fc803da4241aee0beeb1eedc7a29831037424bf8d33dd79b7510deb18568d8899a8ba13a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (223, '{"ob": ["15151515f6eeeeeb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595dd397c0477f94c578a3ef650c7c6688d5bb0e8841e1ee1fa3fabedd7c8fbf448f89bb08bf44c7ea128240a00e110545ea1b5c63feaa28447b2e682d5e75d39415832f20b528770c8bc7ced0d2f9eefd36fde8b821626ed85fc3519b903e8d95d719f7093f0c8b83b679591dbd28ad5d265fd4975c55cb06efe8e221807ae437c6e974e63f1fdf1262507e7b6b440a18320a7c1e500cc1eac33f05e69aa6b326007e633ea07dfb7658e0d2dc429a8abeb31c64cff7eef3c60fbf6941ca18bbbd6786235f946767d74c71440b5085d403dfb3e850038e22cff26a593978161dcde463786597b05146ef2cef410f09fad9e83bed421fc8c13f05433fef871e8ca365485cd32c23d5e21e0dc3c4c78413d565ccf0f06c6d67d36f5a6f3a24a0afb4f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (224, '{"ob": ["15151515f6eeee47892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595829c523d242ad9be80529c8260041b3bdc730509ab935276c7257263685f68a062b6cdede42bca170395a176a6cd00b6765c17c731082472bc3f1084e93c4ac64c8d5ee84c5a168db53804e53b726a4e105c824e32f6b33a6b83bbdcbcfdfaaf24d868d9c361562952afcdeb413c0cdf69ada241a68f55b9c3c3daa49722e01ac4d38881be8599bdf379e798853192c6c39dd078d52ef07620e16bcad357fdb5b78de60b6c4db4584773df0e4749a880ef270aed59c11368da0dd291c1b9d8dd5cd1a0ffc196f5451c782c07f968a1263860c74118ef5c5d56715f353f2b3d729f77ade1d597efc701a998fa3dac0f03f3fadccde82424bdcabf0305a9dfdffd5328bc0dccf594a73c5ddcd2d5c187c9e7f6231d281f2003cd983b0395f4fc88"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (225, '{"ob": ["15151515f6eeeedf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459558e68761a0aa77dedfed497113e14c8dd7c5007796afa394e7c203e5dc76f446e54918f275757e4595f4e6ceb728a244228b66093d01afbec2310df83d42ac08a3780ba8be255e27e976603fc4ca22db8d0535efae1d55fdf2f03c1be0b87569aac9911dd036737713235c0ae8dcdb340a080f168f1612917bbf8e6eeec3fef1890932b721646fe9d38ee0e4132a2ecf5cceabcbe98e4e5a4edea2f04be0321a24512c3433a25e961f23a90d724204b6daec00f0200904dfc1b032e258539af2d6c2bdfe4cbef5142a12dd3a8013a7014832ed8d3ec875326647e2427340dd793d1d8d033d4b643e987aa35abafe6930aef81600faa1b71d44ddee2543ceeb6bf7cc6f76e1c0a877daddf1fc30c4ad7ace1d4d3c092f1c2295787fca11d144e9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (226, '{"ob": ["15151515f6eeeef0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595126c1788a95a820d0e375f437a2fddc1010a34d4db4e1c1f79d89d6736daa1eff2917db0a6c06c457bc82e795a0b93a228a217e72ec1db062c5889543abd2fe9072ee79087f4a481a0d9d32c9b25d34fc99fe68edaa2074d7669796537f1d12837028eb567a017fb472d38788247004dacecd614e8dc63458ad6c43f15ec15626f7ebd08ba0531326f5a4f9097e76f82407fa7192f0067d3bb8bc3672e2cccb15a0ce0c00f4f96adb1b32995e49c05aea2e9f8f66aa5fe0cd469f50b256da31dee711acc455bb487229e7f5187c814735ceb43064eecbb50cac24c4e798e73381d3f4a6cce396966e8a48629182b9785fde22b040b8607b5e878bc4d02243381211c5de373dad311e6ed60e22f11a093df88cef8bd0254706e50db8351998f58"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (227, '{"ob": ["15151515f6eeee19892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956eb136934c40a76745ce0286e1ad21b1df5342ae03860649021c65921673e292361e08b7207e1fd15376658f00e84758ffe8d3f428b61fed6e1caa57761996a5b18834525c5f215f3f04ed12627894e4ad64654023f477c5fba9f4856f66f5d4c6aa70fdedca70778f3150533b55f438651a19c76aa7291b7e2e21db862256537e41841c15547809652d06544095c5073f34617b9cdc52841c972a965def2964d9759fde98b243726115391a9e38569c307728108543d6032698b413ce607b8d14d95c5b84608159eeca055a2cc0a9d53e601d44d231e28187699c73de6b3a16f65887fbadfa3c531fe24f7c16c82e643fc5916c74c9a546959e63d26d2bff3208b50e9cfbb7d8970ee1d30f82eeb7a6d30a2127c58bd88366e4f4fb11c5a468"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (228, '{"ob": ["15151515f6eeee26892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45952ef7293b123421d33f1b4de7a06dddf9f9a31a71f8bff9ea4ca7f06c88406bae54eeab29421ec185630ff5a3c237be38a291bfc6e2304100468ef68d0604aa61686dc71c213231a4a790d5c07b789912bf271148635ec76925f69f84c2399e155055af259d284d9439c6e2f26fa4d334255feda94ef1191b3624e7c5c028f4b65bcab4f5e30170979160119b9cb1a2b28d19762d8410f4ee31184ecfe0876a62a42666869643e9746340321d3a404292c1f40d9e16c72a71a3f142109aaa600d6512c2fd674df042b57b8393f25f6f6a6991af4073365e98052f3782aa7646b6f86f202135bd414e1791f07a81002c0f2a9608ee654d862699098d9e072567aedbe756aeefc67577e6467b429b89114870ffaee8b7ba5ae253e893490fdb6b51"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (229, '{"ob": ["15151515f6eeee54892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ad9a3f41d97d500cae1f7c802b120345ae2d22a119dc62a48a0c0a934cc6bbc94c9e69b438c875056be65c6853e53f0a3b63bd946d2f0b60afa7b435440756e2c49cd911267d20a0eb6b5bcb1a8b27832dab72aee741e4f423672b04fc69e81b7485d1c647ba981e55444ecb44ebb4a5e1e7a3a18fe9ae3fca9f9b4a1a36b98580143858e70ff8f6e116a5ed617c13ee83e620f83a3535144af9d29011821ecda30ed5e4a9df826ccb732fd4a04ef28b261d4878c6af0a7f346697adbdcff0c71a6ac803b03556441ce19f8d55eb308f28d9495e092d20923c22b3506550ebf950fef7b825d47b433f47209326129abf5d621b2788b995ccb39e8c49bc451818a33c8fe080d78a11eb1cd6ea885da1dee13cf40fd445eb26aa69c4f95e0a6d6a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (230, '{"ob": ["15151515f6eeee78892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be459547bdb506eaeacbf91556333136ea181a6773135c5aa0aa60c1cdca0ebf3c590a025ba56d40baa7dc4ebd7115f44bfc1b9007bde7a00bd2c9f399b95b05b1cfe533b2a0b57bbfc1d15d193b14cc0d43cb6623758e66d1b83834476fe3cfc773c00fc457e0e24a4b23fd333283c0ee8e93a01ca1e2805284561a2135deefb7bcb01f2712eed61f9ac9a58eeefb6ce867fd12906483e47bcdb2841246fde4b922c59dc15bb29ea919d16dcab619b972e657c82504e62722958586f42d8baffa81ce9f70e76967026590cd3ae5899febb452e72b11d3918d6785f644b8fef0e2e165deebcb108f0b5e0a3612fe2ff8ba9c51cac603581a46e0251ee6aef8b6419c0bffb766c5393ba1a2581b172f2dcb69f48a27c60b01c1fad253ce0713ac9921c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (231, '{"ob": ["15151515f6eeee95892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a605d2f5cf3319bddd1e5ad4c8b4d86e82d2e7181f0ae2a2a6063fe27cc4d4a98433dccd1d050ed95505c898a7a78641dd2be987dfbe48a1562e46ca0c1c5de2c91de8483f31c120c32b614dadcf6844a9f83a807a3980f87bdfa12ddf9915fd4943a32233366fe34f0d4ce28721e51d294e83db252162903b3c869e27ba5a3b13155f8d7d1f3eae008741d8164aed9a04ec8658425859770ff51d23f257040118e907ae401bb1164eaa0bc9d46b72bce282bbe630e13acb88361c42bb14438e060df7629316eff13e9d4fbb67e24fa7c86c4eb4a8283972b4173c1e0db2b071ca3f19ad00c1cec1d5ebb820b52c396a7fa268dfec6a189e192cd6e2c25f0b7427324a590a066bbbb898c6baded5542f826ca13d1437a3c13be7d4463be32d8d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (232, '{"ob": ["15151515f6eeeed3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954a1b110fa191705832c1e41b5cc76032b5be28c452e1cf2afa482cb7b07cd4402263bfb3e9c9b741afd9dd17b95475dcdd73f8432760fc0db9220a4a10fd2205c19eaa14292c6895199a88705d5b83f65a695bbc1660990af3ea40b977c095a2531b506d46da085a7e6306b7000fff421a9c95ad4a6f269b7eb9b5b045a4ef0381ee50654c0e7e40daf19dd088ad650cb0ae9ea191268ab4444f183cc6dec5499e14634b4d9bbb18a53bc92a9b86210bf0a59a047cd83a561681ec6135e9c3f3e2af3408592462768ff948e7f11655b3159342cb76afc48d9ae07e26c6ddd0e9fda360abfbd86f5922a6c927d4d7e5a564c305f4ed0139fe096fb3c73c4b49cefe70e32a1d16e60bc4dfc48da792ed21400ac762aeb0cedeccae5055db199ff5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (233, '{"ob": ["15151515f6eeee05892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45958efe72b9d7ba4bd08315cc07118c653fd9067fc49a4a25423ba9652b17270befe95b2325b8beedc6873c4a4f17777cba2676861b34cc2d5eff3aa377cc0d6a56a0b2f9acc347669dc351b08607014c7bf021a31ee2f18e1b8432e1055b4058fa9f43b8aa7b6fc3fcd92ffca0852aeead76f8bd8ec9fb30d90259a6e4d9d14f029992b5e365cde73377aacb2fe66d32bcf373869962cc8d215f58bc7120d7839cea9972f68ba394539533bef91ec320921a9f425dc7d310ce3ff8c147363f09a8175cc25fd7e2341e761cc232d3821b28b033f48ab880591e08d3e019ccda5be2cb45d6c64b47e1b988f070ce5b26ad077f5a75dbd96a1e3799b33e0c7d36ec9dfff0ccaf0c63021b052eb32ea2402ce6bb9abfaa3dfc8c4ab3536626e27477af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (234, '{"ob": ["15151515f6eeeef1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f987b127b382d63c79ea2f6556412d3b53c9d0f2a8974edd8c43aca1264887d7f7a9f01f6c3aac4d8ff3e78bcc62eb0f011b6f02d65f3aae3e550dda19ca6fa600a433a943551d72e176de011071724108cd033ced94ce9b95c6f51e32fa6642844bb76f6fe2cc4dd5490ec6d416cc30a7a5c297ef14f8ff155e8916c341792944cb0eb43116ed1027aea0ecbc4d84ae69637f46b0ed1c657bb2f53e038eda9558585c54c8db4f96562be401a08b190b04f713638248fa6be8737a24b3d6c1deef8887a2110cdfed54b543c0f62eb0dd26b2180007da123c5de760ebe05fe763fb123a0677479043c4453ab353455d5aada0e458d6ac38b71f397bcdb75dc64425a2eea17669f79fbe92fdef48f2c5f632c2aa6b2343c0edac855f848406c394"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (235, '{"ob": ["15151515f6eeeece892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e8d810de66eab80fff0d2022f72e72792a1a71311dab5a98297fba28cd907271cf0219df6de20125e125323faead64c8bc7e9077d3b6659cfee771a18e9738b11ceda2d269868cef80b9b17454ea29a85356aba652186d8378c04ddce4a0d97becf9477631cb1e951bdbf903433dfab4458fd879d78638ca6048c27f0d0461ac595ef93f6214af346bfeb6359bbf1d2345ba03179fb12b4c46866c5d6479845ebab4c0e7c8a00d199e4ddfa97e84600a1a989cda2905bdd0a7c8db5c729a8fffee2868bb35dd9f15cceaba967aaf59d572f1e3b10e4e5c4c4eafd5cbbf4a6a84540617380e6701d7fcb7279be5d72451889dd150244ac000d6ca5b3159bd7937bce5e72abb2451771a593ae83b712465229622b0d207c37e40e6c8ced41921a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (236, '{"ob": ["15151515f6eeee21892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f3adaeb6b324fbc51dc5029a4aaeb313dd18d31a927e26ed6a99da091126b6846cd9ec66946883b19066a06cb8972a3e77d177c8a752642e4093d4b6fc71b3d948d68533c35152a0cc6370097df8a2fab73a42fa552ce20fe02ada2eccd5d544188c0192c40baf69369198632979ac585fd4110876d104f5c75a5d17dd13545107fc30e525e570cc0f71f6b19c00c3a63b3fb4405481048d90ad16b94dac720b151ea06a3f924c7d97715b116e059b8a6b32dd144b13a0c0906ddf0c73ee031751e2e9ef87ab7981aff342c3f7c0ea758cfe8a87952953f473de2627b700adb9b2b166c2a4b5e63b500da6bd03cd77373c1dc4acc822a3a0c29104dd9d0efef3a9c52d5645b141becccb3f3854aa6d308456a44ccbfd1391e63bf1aaca91e4e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (237, '{"ob": ["15151515f6eeee0a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595b44d1cb53cb84bb337fdad8825dd2e2119835d3c58dc69124b43de8428291e29ca56e7337219cd5226d3be4c19acfbc655abd1f6f935d2f6f9db404606c8e8c00b5c9e25a75549d8a117303ecb6a204fd01458655df55c4f8b315951833a0b07f424f2360309dcfb6daa2b42d966cac059f326b57f76d9f84ea5b2032a1115a29ad6441a9f5f49ca3225625801af7a8cab14d8fc6f0563f6d173ba7929961bd292d4be813191998332e4154b0603239120ed2a83dc1ed8674fefb1d2b517cfa9811650ca05aa3cf488477dfa2a7156990e7aefc05b9c0de2169f7c77419d6043e5cc5bb3671223f0387d785ad3e2990191124efaa53a8f7b6bdd39b24d44b5fcdf85e16edb8202d84f8aa1e173f71b94889f45a838c1b3c0a5e1dabdee002b9c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (238, '{"ob": ["15151515f6eeeed6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595545dcbcdc04fc43b47943757cdd9c2e4b7e4383645d14cd663f2a5de90210a6f5cc1a1ef2f735ea16e78ae26e2b54cb99de710214bd75e4d883ce1aa12db55ada9361b117b57168cd9d9dbb071825e8ced50f53216b868e6e63f297f557e4b24d755eab0311fb73b2e044cd059d40a041e78d84f08da4096174e3706d55343456b5f2998027c23b22f2cef3d03a7cc9b10dfd0d611c9662aed96a96aa93f95af92702fc689335d6bc92f034c12ada0fc0c62a8e72a63b9edb408478c9b10a7b5e935104268a6dfffe250519103a80e2c71a32572b683bcea8579609dbadc596c2d04b63500f2cddf4ad884ed0d2723cf5b29a33538ccd9f151d4b0a69400c35f6cd26364258adbdf25296293e112c7097603ad268f908cce06af45254fe2a54b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (239, '{"ob": ["15151515f6eeee00892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d2dcfaee1b94b57de203582130b624579316585b53146f0640490dbd14c23c53958585b9e45f00a19d6aec17ee3075faebf7c32c53eb1dc00592633ce7bd79b7085bfd9e8f02559092af1e7cdccae31bc3dfc2de2b8d3ba5a6a30eb1b022b7187c5a819a1f548ee61442e12fe4fb1c3466195e860e98d66ddd98465c8b7c16b8f5a038eb268498933f02698a87ed4130f916b4d9d159204c3854496026520ed6e035db1f9a669c8d87a61675397e281d3417d8fd443198bd37cae3d9b1e5a1fb289b1ecb17894fd3334e579946cd61edbc7ce67ffb3c938ed71dc7ac77c00762d6f0d34837a443569b70370778e77efa1d20788f8d6df066e4986c3b13e1883b70ca60a2cb4d993fe3f451fb1fb0c1a9231cf2b35d74355ee4d723ff22dbccc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (240, '{"ob": ["15151515f6eeeef6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45953de72ff73093caac7b7e73431e33aef8c5f760375676808916fd282a567b032e1b69ca718606bbb2686194888e4e10e6a0e3ae99beafad5db2d603087e77965736702576ba7187b5b1d13233dbe3594703f92c60982f93c6b08ee5d75cb84382d7d1062be8b4bd7dfb2c2fc0c70866d1f74aba50c5bfd9f92314e04eaa57266ccec4109e6c2967833914af8d884dd92045a13740b7c33d68f0982cadadff2ad165e19baf4a88df21e5a1289803d569389080b4d800096f3bedfa6120e1dfaba7c05950864af5929b7ed80456dec379aacbeaaaaf470658b7f2231ac49c5b54e470e23f7e1e5ab5eff581363b0169b109e5f9530526dcd1dd6832b5bdfb634d7f3742a96ce827aa2d9069610f10a76415bbc51f82c25cad27a68ad5471549e839"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (241, '{"ob": ["15151515f6eeeed1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45950c8c6cd0c753844ebf202a56babecf8e13ca92fef661cc95be025dbf03a965cdd278056ca70b0677324ca36f1b1944821fed215a591e3f0872a5349ff65054e1077432df1f79d98bbbfa3d9521fd07fdebc12a65cab2dfb96a54cf5837037043ff291577a10d43287c355f933ee14ce1400024ca1345ca9f6bf7a0e456f88104464953ed0f318966213b64f1b67b50309f6b5b67eed5503da4e3be2b8fb1aedd9878b2cf78e42b5ebc486a7e08937095b8c05f76c31326714674ec65bb346aeedd843777046e21156f6af2af6e80273b1449d0742e73fc8442a70f4ff44d40d118c1a97c7c0bdd454e4c98f8875b1a439ef1634f9f290a7fbd323b7fce4ddc160385b26aa09e7d3bbe10664a3c355cae74c45fee35c77253b27a8b9dae248dd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (242, '{"ob": ["15151515f6eeee3e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45955a4b5a84a91ed3892c828a8f4e31c68cc1cba7df176d7ecf5eacd682562964925c3f1e1f2b5dd4cc5db9315b3c29e6d779addcb7dde637b1398873958f8ea1d1149a147caa2393a2b7a36bc48e1fb7a62d42450612a9424a3b131e32a573940305f939a63f6fbbfd67d295571a5f5d1cd50d02364c7a20342fe9298627a01366fbce8b4869ac3500a66cadc4c0e31ed0655168d6360345514277f7ad894e82d33cf0ac44b14f07240e3694816009232a6b226801a4f0e6b20ebd4dbeb6a0216df200dd8ed22e0227432cf8619ddae7077e04f53db3987df5671a0818ba0f124b964571d1d0882c8c2ee5465ddb3478f1d9c76eff8a6b9dc0c7e334ce7f82817145fa7f0b05793f735f663541454d770c44e66f612b5012fba9aef7469f10dbae"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (243, '{"ob": ["15151515f6eeee35892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595caee8370ab79f461766cee6b98d9eaf3a265e4060be7d353b8fac0f7b32a91501ef1d7ae4c70d928902b186dd5d285ebf8e80ba75cbef34eb80bc287bf3ed8b5b69d1d6595f8ba148d0712e01ac7226cb4865d70708a3bdad02f3a0fc1351ca1f173f20491151c4716d1f494a5d2a0ea8fed4daba31a83f89d7ff42286e4b0083243430c3a2ecffb91a87ab20cb8990f83f9005ae1294bddd48dd3e8eaac44d4fe389c8a8d02ad4ef5934cf5db284a3554f416e59c7b33b8e49dc97c2f23a2b6fe1fe2f3cafe467acb8bb5b5cf1c5d5a39c8b6fbc78361c66a48e1e371e8a11ec29824adfe75d20a27a4e39bc811ab7c76a7452d24067103d6197d9f92201d0879b8dd938df1db8eb217fea127129145c716e7b61d56cde9842db3ce286f64cb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (244, '{"ob": ["15151515f6eeee63892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959e3d10291407dacd9095fc0e3c9a74b47783456b2123aea3fa9609a0d937c83c83994327cd7ae3fa832be391ba47a2b5bc29c711bccc11318156ad427f4b8b97b74b0e4820ceb3b624f0401d4b93e6eac0e06f02f1ba213e9b9d4e4d250c71e510514bc273c64b9d5ef42c41dfe58f33a3540e93b3faa632a7b45b7a4c59ff005733dcfe9b7d9921a40f8d5dd27e9e0aa5735e55ed5e8c3a57cfac87193bdd18577dad4214b063a15fc3596b7bae6b1f266d966be3ab3b394fa7572ebe8814150a8080e56a15de6cb614857204821de4ad1f76038c322e7333069d93d43358611d0f50c221452ce4a171560bca63d4f87a8cc33446e532673d7242d05dc3227eb49de28742fddeac1b81725ae9ba642feada89bee346e7c6d85a7fc54a3d4989"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (245, '{"ob": ["15151515f6eeee12892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954490291a82c89a87e78ba0cef3d9d84f62afa8141a62bac59a6b43acfeb5a93d59865c6e3155e7370099e1e48fe8e34f39a227050029dff6bf69b02559406c7a7054b0a2aaea286ffa4e57efa7014a2d3242bb8a70f36122724b092a4cab1beb76e00d9bc48d337fa742afd3fabeb804ff625acc0f8b50d0ad438d7d2bbb610b0b2a116d4ce7192d3e07311ae81cd89332fe3551eead24c74d0901722945c3449309355b9c05fc44985e700343bdee3c08007a4dbcd71a55c10f27a00c6199bdaf7b49b3baa0351f567f2dbcb230b2beda3f6c34ede9369bc3cd26fa382a6c31ce72cd5ef1281a27384de8ff635a4fbef2f8064520028b638477f6ea324bdc360c99a99d089c7627ec59b113d1dbd950f9658b2bef16855caa90b2a92e8d664d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (246, '{"ob": ["15151515f6eeee80892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45959896e241a5a48f4870b77a32bf03f6e124f92b8b395eecc9167de85fdc34941da7c9298d85d4cd98a5e861775a16eeea5bb26445ae936ef87bbe61c2eae1940722590204867d7d6c6c9d5bc6cedbba496a47aa46fefe96a26727c1496f5cdf3fa179cd2578e34779217ba0d91d521ec051b9dd5751ba9016da75be2688a0d998c95ed8c4f832021afb8857b340033f84ce5223ae0f266e41eaed3d30f962beec0737be5bc8b113cc277365376ecda9a07678b634894941d9e03056f2949b03e1d463a73ba024f9dc0d4dfc104a3b2214d6fde0420679bafeffd2a59571f4bd17f0ff6d4f1f14c2d82faae6d41c1f6a7ac450ee7c789e367b1c08068dc08632f58deb048985fafa197fc03646946f91f0dc6784c37eef4cf70e14c9b272d03267"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (247, '{"ob": ["15151515f6eeeecc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595be7a07fc216f45281467d414e753bda281579307598edf17768ec9297ffdbee4dd55a6f1bae70ae93d40af78b841c2e42a3e4fc3f80696905356b505e67238dac64edf80237169332393863a1471ef6158b7d5e56081d680ade10d208060446a940c84b7f610b21b84913adac023ecf9b721dfa61d9313bd71c411285e4082668c5494e665724673efbc632b1c8cb7a8cb9fca7ce052c0fd6eab22393d4e4c0ad2cfe057717ffd999b91bcec969bcdbfae1d1ec6b1b56066bcfcd34d85a8d48fdea92572e15d14fc933e7b8c8ac82a72afa57ed762d8936aea40a50200ee0e54749ed634ebe1a45109923ade621b9a8e9fa7d6ba57dbdf408e52d5eee423a4bb3683984a34dd59cbbd5a0f6d4ae50aee3cef0dd86ec5133e988ee217f403f7b0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (248, '{"ob": ["15151515f6eeee25892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a38b6b7beb102200d48232f5b118395c4d01aea835dca3c210bef1f8f321d68d0eae36f1c29709f130e8da0bd2e5bdb296b53bcf740c3b782f0c1fe4d5aa033ace1003d6985a2c70823b15c67cd2e54499853324f9e8bb241fc1daeb0e3538db13b90ae6b5127de40dc8612a268e346507a17d9fadfec32ea8cef28ca65bd1e07bf443c785070579b39c1dacfe73853680fc22e749eaf46b431092aaadf57f14856738ba42de6f90135d35bf8d46baa9c0ad243c84616691b74bc79b5ae2588077ea8e8513329dc51eb2f195da8745a311423767bdab1ac58c08271e28f4d39dcd08126cce2f828262689ddc0ead4944e27725272e414a281bf968a8a2b985c59304ab6de38073cb9dfc982d62db5849f93d5ff023901e631c964d4c8e75ec16"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (249, '{"ob": ["15151515f6eeee39892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595ca1af228a158482007d2cce72894de695e45836923b6033f8f20a3f815c71775bee2d54584adf580c27d56dbfa72ada3f3a061efdafd3d2bd38e71f5b10bc4026f2e2bdcdcd297f1171f020186af874768328fb3da5978fd242dcd48747f8767f278bd893d4de40c9a66bb44a8c9170874be614c39402e4dcf0a272984e71eaa4b3aae6822a032eb1ec9d948c4b5e67ea440f471b5ea0e4754288789c29bd7d0bdf82b4e4c57ca3054853b67010ff259be3be6e7d28dbafcece4e5bc0ca327c8dd80694e2485d75e91044a178c6c2d6dff410b85ce76ca064eb46501547182ead25f05b9a0e7d46ce04be4c4c7d895d8c8ff23d60509c7f38a3cbe8c9ea00a38c572ae04751b3e1934af92120b842d790f310b73be6b2c4f98350515c0783ef4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (250, '{"ob": ["15151515f6eeee24892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595f60e083cb287cd5f620d9bb77e88c93d71edd5891000c8491272bc381392c00326abd920b5b4425b2331416014e8a961ff3ccdccbcb873b87be44ced2418a2bbe8660a8e325891137b0f1fa21226decf061415ba9ab2400725336d77b29ceff355d15019742000109f08e4cad6748e5424d7ae73103eca8597011aeae015b6418754cc80de68f59cc44a11711ceae503bd9499a6f13007b91e6408e0afb980a81aa7a2e992cfa1144c9c45c8ee2ae9bedf5099d04712855f37cedd74b75d7b2f056651eda985f41ba9f3bdf08563834711d77a9c1c4faccbff3d67adc850dae3937ab4855c31ea4bf73aa3d2c4537a2f8cbdba0e8a9b48effd48c7bf93aa2c162ba615d157f05622a668ba1a67857674bf167d0b955bf43e47cd04d7ab03f3fe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (251, '{"ob": ["15151515f6eeeedc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595c296e2ad15b0becc51f89b37540bc11563309e72e1aebe7674b477f4a8841d2d0401d01a8cc1c17d010db8e729643560a132fa6028acef8a73e4201083684c6b387d3cad8fe8b254f967c8c9f15d9f6e7aea0c82fc7fdfa3281f4d4aa664c12a77d945fa3eca40dc9b9338422e90160dce10cdbc601aaa96223b09c8ab82e10c925a77da0b460ded18542d0212782dd169ed0c2df72abefed9327d7ce4caec5ed68f11ae773c6a7c2af6688a6a4533dc187a8e110c84276bd695d6630ad59bf6cefb0b7e87b309b434500bc31e0e6ac242398282658ef1049df6bce703406449e6410ee11d43a46684830d754c1d05529ae663a76eeda0dfdb706a7d7fe7975ef1612784b275ea63b813b8ee18484f8a8f3c5b759dda557d8bed05d1260361f1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (252, '{"ob": ["15151515f6eeee9d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45956d4937a85acc788dbdc76f046bdc1a0988354c6144967963c6e82b81b4fbbc8f97a91c6b97f320c724ef92f332a0951e25b65d4d4bbda070a1168758cf2204987bdb699f0c1114828b503397248b35438a880fd384ebed41a41b4b96b886705c34827234c60ae04187a56db9c14ad71c9c31f3b8b9c9d33103e38fb92eb75046554e1bd9eb6b24168af9b85abe1cb4cf98b52cb81152c4ff1491f2488f407e48d314116eb92fab96f0e274c02b2bbbb3d6c8076e9d31c98570860174ebc483e3f3f98ddd76ea9c48ea39949063e527b5bb994dcd72633846c796748f7b13adaa158b7d8ae05ebaf78d14087338c57080aa2837b4f821039a4487eb6828ba61b4a21fbb6d4f758f5533e30777925c2ad9ec49791fa426e697c7209fbea10bba5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (253, '{"ob": ["15151515f6eeeecb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595e70377ded48851851ad061a70ac6aec58cd0713c8e694bc8f2a44db4bff545e7daac3b0113032793263d13aa5f3c36491f0399b6e430f73b6448e277554783f54fd5e537fead6114506b3d735766e21ab45d9ef25d0b4420bb95bb40a17a944fab6a029b1d12412f62580f693e7448b749849b11d5566e62c536248013f5cffb77c7a36d6c8542697b5464d8ce3809134f78b374ee5faf132773ff11a2f0bb37c4b1253748d639c705883c83533b8f873e001d84aca9a3a2876a6006d6968d54d9c76d61af1cd17b973ce7c83201feec2d3289771d15a851dc2dcd9997b3929a380271804f44d2ad63905f02a97ca87430c7b420c9dbec1ca2ee368e7b43bb5a2afb4abc1281db4da109110a9b5447995bb7ee5002e19b654e20aa56b979980f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (254, '{"ob": ["15151515f6eeeec5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be4595a735e245b61eeceb62b12886f1c8f6d0422832e6b6796fff505fa77be87ea6312053507c8e02413aa321367c7c8442967e1a5a24dc944f91795c47ad18961cae7c67249e0527502648db5f594de2ac8a2c3a5e416617e792b3de37025a4b4cbea4f8e86e5f76ae2ec5b6892e6714d8faa05d60cb0b0dc22de13a2ffbd3a62e75fd62898b748c0dcb7811a6754bf9c851e1c63e482ffa3d8a9aa3fe42914f1378ef4525c2455c2fb81562dcc68baa3f133ca7d0fe80fb6e1cfaeabcb3933cbaa6f349d22b44df5d7e8563bea2f1c146aa436214a536ca91089042604f3506ec853d690f904c9c112b06aa1ead3413d446747abad1883bcccb888fc926893b546b522bb4be5cae0eeee885421ae94358b9bd1e7f1aa71bc8b1655dee28effbabe0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (255, '{"ob": ["15151515f6eeee09892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f8361b3b4a5e5223184d15a6f03be45954c740c8843470ae38d72563b29c9cb84a8dfea9a7a25633d3173ac642a87c1f5b59a4f5ff80faaad4c107325c3f20c6a1f45feacb2a481578b6a438028a1e03d94d3a0b6ce16e8f9c2673fd94c2fc2733811beaad96f6791e2117947885ec03cfd777bfa6cb05256ae4562566c70c6712f3cae3273622171a54ed7924d86e7428fcafbaab11c15a30f3005c60889b95954f5380889699b20b40aa83219d9f2ed9082af8878b8b3b05fff2cbc5fb2c3f0ad3bcd690f5771c6447f808f2d1b9c124234e77438292d9774f36da319cb500dfdda2ccbd506d47ac234b0102c97a03487e67df3addf1a56b33343c81440fd982c16bdcdcf997aef0278287995fbeb36d5055981c8f796be58a8da654d76b72ded7f87199eeb0322e629801b90d37cd3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (256, '{"ob": ["15151515f6eede81892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ccde76883df21132a93afcbf972fe2b0c5c1bd5abd96a13003425cd265a56617ca5a2fe67f400c38dc16e335e9db8b36bbde9d08ad48c77e42027824ae9d88f5f0e979e95b907233a8131fd1dd1c06751b021d599d78739e4d88a6c16cbacb03b1eb51baad45f74f564a5edfba6dfde4ff2c6c89608fdcee0a4c4d61dba08203ffe480a6617b5fcd9ab1d58e39d578aff3e21aa68a7a96a51d8c169a6957c6c696daf20cbd66873430333cb02744892425906a17d89eaa476d7a9d2445bc68b8fb39ed68d22b438e4e93b3f66bab556cd61499565b5d0231bbdf5f692fca94cdb3eef656e2af0722ce1c6e917e88ee0a7b60ca9ac82327deb9a42c95b19f68749ef4f9fae2d38f31cfba0469d25f285e9352f5b1209792b90f0b59a12b2e04abd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (257, '{"ob": ["15151515f6eede2e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c01b29ff55ca7c6628ea34ecc3d6d97a2f599783f85301919142e0216b6f77682109c09730fe94583d15c85a5631c1724e74ac80434b25ef7a4a5e5b178a147c7ac7906eaca49fd548b2546dc4d646396839c582ac7ea91986b4d23d70f1957f8971721feb5791b856d99f3fc417ce4001d7e0a96d4d3adcf765ff1e448a032a69488fe6cf499777e944b03201d96ccd1b03d0d5c009fc03cddc6bf01e0b30be7be753e361eba2f33153a5c3a21e5e7bf30f77406281bd3055b698c6457ca09e085861ca3216870da057e4bcae64477e9b4c48e5b992294f5cb294d99c942d996521e6ac1abef3509844cdac8ec8c1616853ec2bc81d12d1d636ec625ae8e9db7d2e7ad20af52c6971d46a59312fd162d15548efe23dba5fb4500528912bb1c7d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (258, '{"ob": ["15151515f6eede96892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c60c2d1dbc08ced4ddf9bdbb14536eaea17d70d2d8c73df5da998427a4ea51959952b4313c3803ffd803d9a7bf4d8eb68b7bc4b4a37044b1b8127ce4a5783f5f2e9482c18376b10660e38b51089d2b491847c31b39bcc51879087f10ab0be5ef010a2089860ffb718ce62effa17bc5a1aaf9a17724df07d647357e3411e5056d31b6f63b4f671513259a25c1b5440b2689958a2f8344bf12fc5f15c9f6db1546f070660a5575f1b9d72373cb31c9cc8165d9ee481339c84a51b54d04769a8ae89bcd5c8723c88134a1f68f72e98c4934326b30c39f5e1c2a6237fb16f525c15eb737aa3509fdc5965ee76a66b015c60c807c8a276d03582c190f8dd8a2920a631c4623baf5ad09ef2f0d3824c9e714d2ce989adce85d21b722d5e1f499eaa5ac8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (259, '{"ob": ["15151515f6eede2c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0a8413ab6580276cb7f5cc45935d53c19ec4d200ed6c2167946d8792f993e4abe318a4581856c2de2041b1a7f9041b76d7492f4af7da70e7ac1329cdda0c9bf625022df13f2339f5f5438ea30cc418740e4be4cde8bf3f952bf1749387ddf4000c6e1014b9ed4e9686905c054768aa86769994ea74494304d606424996957069832a02aba9e3a61aee481af49beb89235e10698f34a808f0acb7d5e9c66ba667d668e8b51f5bd418453e258790dd8b8202e73b58a91a9fee00402542e86cb7b51648f4425b1be5f6622e5a90354f2b188d03d5c55b1ce968f2d3bf575097618a0b582112a95165bde0c1ef6b79bad5b048434c6593cdeba8c2b7bc9eb8ba895fac9b39f044f096b346ee518b7b62e821148cfb2ae1fb9923b86d94c87dab40b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (260, '{"ob": ["15151515f6eede9c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cda1fddb12e210e0d5e4664827aec675e0e7183e4e216cb46d01b14ae4b0a8407ebd47bc684e8fffb4f2f1e092b8c54d48e6de5d394a4c112cc9e5075e100b51ef85049a1ebaacde16524220a837cdb121c57127b17d0f3061cc766f9208773af864bc0dfa2ca16f252e2ed2f8317ad0a7503a41bf077d998f7fdff85a3dd5e91cb57a0ad29fdc8bb01db5ea3b2e70edd8b2a8bb87a9a2b401f58dc07ac42c5a8fe0a9f0cf09980761f21a72f3f46feb59d59b718ebde5a6bfaee43c7f1b7dc82e08bd6ebfd71a323cfa7885f303201f4bf4f22a01967f2a52e9b3f87ff9a88861a57424c22aec8c2de98c60ab50ca530388f42ee526fb6725a5f1d743b35cab17755fa160ddb3bf4297f72c7743c5c920df9ddfb58997827a465900ab78cc81a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (261, '{"ob": ["15151515f6eede00892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c819ad523f9e56c3da219f773e81c9939e37603cad3527bc6957cd92d64fa4e5aa814a30eb9dd419f28c3b4badd1a653eaadbfc97800522e18bd4620ca1f26687ae8f5acf1fd5558e29a55832b7d3f04a15868815c8c319595d844ee4897bd0cb4ac73dbfe1d4354644cc64a08cfe9128f190052cfdff33d70757c4d53a0a3db734c1ee2a245ff00d1a388642ea030db9a5c4f7a05a14a29649b5242c1ad706c74f29b504731acb67d8921178704787a8d8e1662e17737a9260e4ed776bd3ce7559d717a4bab5caa2e28ebdd3bb58c93538bf001c5a6d131449ff1b5d69180486312c95093fa19b42ea88fbc791b02af1334316b39a0f605e457248c7a12c6433e53eb75cba3f811800e27a553d39aeb7a8189320af64a74b13c0b10edac86980"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (262, '{"ob": ["15151515f6eedeba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf7814630e3d04e8410ccd46a8f110a9c5bc5608a855ce9bf4d14300fda071d05dd28ae0db747de5ff85a893dc94bb9abdb53b04e5b12f8eb2cc4b0b06811b0550c1fc878f45e95e86865be22a28ba4b303f19defbfde587feda16845c45d674941d1f5134153bd488a6bf6e86f22b80b46886ddd49724b96fabc50d7f3a610c34248d4cb14d4fd008378083152ea83d48c26a30a3d85f95ceb4fe3a422d108df2556abea22fd433f99da5a7cfd4e198828570b29b29808e0954527048e6b69f97640d107656bc63aab771da1b7933a3ff5ed0b73632f2c45a71cd2af87bff7dc64797ef5a6a6fbb1c6372fc4759dc6547a80f46bdd568016c28387c87da2c1a22cec6b9643c565fee3471c1c16cc6abaabf3b9f38dd9a2e7145bef7537b0c113"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (263, '{"ob": ["15151515f6eeded8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2a71317a78be32e91078d7fa9fc2356e3c8151c00fd16a2a04fc18b9adc12606accfdfcd82638cf1fc9355cd953e179980f8816e453d43dadb4eb09872ee34ea99bf93c7124e3b54068dc3cc6b92d2efde9ead0e7661ea94ae43e5caed573a41bf95281f9b407500671c88de65625cc02167dfc593c66dcc1448ed148702198b2009bc2aaf59505bfe8ad329f814bb4202fd78ef1e9789fbeac2ca10859c10bacbc6d77394bd9901a57ce32dc8659141010673c9e956305527fe0b0766fca4b2cff1642b023603eda00d11522ef7ec139767bcd4c7cd5183bdb827778454f75c476031d29116c9b7d548d56b0b980ce7a4f064546f77c78b10895b066f223fd464d19238b1b8031ba31a32fd7f997a51226ae213ac4460c9b456d90e97cbed75"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (264, '{"ob": ["15151515f6eedec7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0243545db60392ffd43b737b83c1dff0ec89d3fc5773524d85ad816094c2ac93449a96eae6e21c0f39431ec7b41eeb2fc0b5ddace9cfe222458c871e9cd95362398f0a586e62d5a79bc1fb3af28acd571cd5ebf144bed76a2db8dbebc7ac7d62998aff4e539ebc242071abb5ad0d5216c9a73664b9be65c0c033e5f2899e2b92bed6d95dc32d66ebc438b99f0d3de9a9751445b816318ece642c852cf9723a54cf3026209f093c107eeab8353dfe8772d9ff8de6cb53322a1de5ef298b925d8760f0e0ec78c4e5f19d1eaf0f6fbf64900d901fd69f09df676b8367a71925ed92d25f8e438353984ac0d27fe409655473ff410cfc4d6a4e790d3ae2b1ed92cef9171d1a7aa15e7fc00fd0f512db870da4e15aaba0fd1af5ddbc01e17192e2dd99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (265, '{"ob": ["15151515f6eedeef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5b3b2de8fa1bce92e1611312aeb4d085deb7818010b8cbdc9f740e9c22d07bcb1e99538903bdf1886d778b0a2b7f8f8a79d4fb2704be4463bb3155bb312e0ab139b38c08d91ded4e75961b831010ccd580b8a8402d9aa25d4d2d1fe8ffa82af5ffc832faf6eb5ede912c41c6f1e909cfffc9b57d5faac717160904ad38a37d59290c2d7ce89ede68a23205d7895dca837ade9cd7e84066fd0012cebefdccd1d53f18b6faf971770fe24b9f6ba8a9f40c2120cd75e50838fb26f603ab40ac2aa6d08ba254ae5f748efc399bdc4ab10e08d0533e880d8fe797a3eb6667ae8e01788f80d14259a557ab546f6f70f578bd48eb47ea10ce9d67a6f17204e205b340b3b9800b030121bad86a5d30bb8d02d2082c26d2fb90433430ee76d2a8b18a06ed"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (266, '{"ob": ["15151515f6eede21892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2ded4a760a60787a87c7ae7986f6a9defb79199fd3e3677a8b90ba359baf526809c93c233678ce631df8aabca4d7795f074fdfd3eacf3c6530db1cb67102a1cd71a418fbcfa35508569e36a73ba017805e6e8be217853fd868791aff1af5e7fc792718974500e3fb7aa84c804c901ab58c9b6eed2f38e7882005dad370cdf0ee0f168225797c2842fde2c8a5fbf1da021a07ad07e529a071b27035751d8f4db611e1a2c37ecfb38688e8802a5cd2d2d601493eaf5e8e93f4a98393989e4ad2415ff634c789aa1eff1dbc8f462eee353ea25789c5ea95dd07bb9369d025f6cfa72b6d1bb6211ad82be42702c791064282ba0224d3c188d485214006032b8b5b87ec43894a15f0225c5860baf289b2ce99aff99daa08e1817c12e09741561ea05c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (267, '{"ob": ["15151515f6eede5d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c891d47b5341c4d20f74e1a7b109a2c963afd13b8df1aba285af334c2c0ac6a1e7722f951bf9c946b6a34ce24758a52d9197e74630c8b5a1f2e17de9ea59e8268c7a1bbb13ac7a6cebceb0deabad178d849024594c2dbeb365a443683930724c4826b344a80fe61ea1220208f998104b0a5dd7fc1af265dfbdf4e838e319328e1ade2453d7d1cc0a73bf7a51eb66238b889cf4c8e5f80cd06aa504004e5b5eee23eeecd01f8bfec88aff5469a782d8dd5062454c58f3166669a74e68fa9647ee9d9adfa55bf35b9a61425e42b0f921932984200db503b146bc41448306b341e0b20e0680ab8ca06c8caabf92746200296d68bc7d0cefe7eb43d5a7208a5f24b8027917208614ad3afccd640ec7c79d8da7b831b121f879c910ae4153ad71921f2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (268, '{"ob": ["15151515f6eedee1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7aeab2e84fab2294c70771299a3f8de28092914c169585f2ff6ddde7191b5b558cace65d4862e7cddba391b79f2e3b7d6d292e53950f15fd13ea7b932df88fbad7dbfb010a209053a94dcf8c841b676f1051cf95f0048a724d21a30f18c7c0b86484a84ea37ba21f90c55ca7735abbdbba7dc519e5cfbd1549a70dc64160b0aff42536d6545b21c6ced04317f1ae2f5d3d5fe367bd6e17017dde06aa800eb2bee98228f61a9472cf181cb70c16b408367d85f5a1ee204061e0aa8c086988fb55186286b5b2504d5ad2ab89be4509943998690692fcd519ad558f4e719b795accf9570aa4dd4e70f37bf9895026845a839ab7f5efa20e93597e1a34757bc91ae4a7cefdf688537fe45bc691396dbbfb58f5bab29ee3e6783129969db5238fda0c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (269, '{"ob": ["15151515f6eede41892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc85fedb40ea0abbfd02ba46bcc394a735b168d05f4686c04f81ad985cbbc8da918d0280df13ef3f5064710ac0e55cf9b9c072d925a8fe22eb1b39624ba4abeaeede6b954dc03d7b4fc238d0d3d99351604c91c7bfeb4c07cd84e51cf9e07d45b638ac93f0afda5493e6de30f49b3fa6810b7a9396da27a196310530a24cbf437f40ccb56fef699083832649a392882b570b3eba9912b4de021d9249b38597b3fcc2f5952526738c80b62b22eb5b944d82ee0e74b595ff52bb9e7e24c5edb3f9f111ca77b80d643bab312167b146877d7e5144f6bb36c21c2bf21cc8250cf0d5aa06ee9a45379caa53afd49d9abb8ab661beb4d26b8c5d16d780144675b2d18797f625649cd9fe86f81d5468c59cfa60f022941cbce5d92bede68fb671b541375"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (270, '{"ob": ["15151515f6eedec6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5df1155dcf3178231a9b5351e15aeefdb1460224f5d7f7ccf48f8dd8db8b8f9aa3d9e8105e70d652a6512cac34e766f42f322ae95f896d358ac4be3bae8fe504e7b54cab07ff56417d0a5735d6fe70113e750a4e48653d6c93387508601fb81949f6511e6bc4926873330d7d3db6c30a9eef63f8eafe5367b2ea5a7625a5131b14e611c80596d89be9ec9f6cb9eedf3e2b026f45abf3f48e602bd848b2bdc562291616e24b367b03d10cc5caa5b0e147e12a9d163b9648c0f658c3657e7f313ed531b782618e5afc104593153b2c8d18ba5dce7fcd1bc758f6786964569854d347ffbb39dcd8b77f984b69b237dbab2fce449cb9f0933881ea017650ba8ba00d437c692b18d1585802cfbc0617962010b73bbb51b4e3cc7a243521922080fc5c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (271, '{"ob": ["15151515f6eedeb9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5f8ff58b79353d7ddf9b4a4be424f77f596bc85e67067a3fe4d1825b48bb11500070857795c04c0dee78b4f21a5dee5240e6467ae5237a713dcbf59cd9974d7240079853b519dd05c7bb9f65ef97deba4950ebad32d328019a899aac1a1a38ea2e2ff774de228795ebfbdaf4e4e94f5907ec7d4bbdbb72af87c4808615a483d27e81d818cb1cf8895fc8c66289cab65e03b82a82e002bcc90a10616d79a68e3d2478aff9d8aaa71b2a6687fde81df9ad3d76fb3d5ef92a6615086bf3475f18682c7c31f0f10bd115897c12225aef5c785816a4961921a5860748af079a1ca4354b4442bda3ded598efe95f62a8d093617f9de338f6a0322cc940710f917d9887994e0adcd8a22b3333d9a76fb341c041018e27d2a81a95ef528eac89c01cb17c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (272, '{"ob": ["15151515f6eede70892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce369caf3bf9c597e09c8e8cce0edb66bc620b3e548c3cb465589bf0754f023a1f52d79049704fee7beea461b872c8cedc2585b42a873cbcc9ca7f50cca191ccb705fca237b6d9c51fc0535038d5f1d48228488def28d5a9d37053a795b2f29f81e29b17f7cab636daadfe91bc43150c68911fef18b817c84fe21f5bf048ee31d26f35e7c67f89782ed4e57ad76704741b01f9b32588690b7d1c68bde6d8af806a02e0ddb555abeed99b9d3dbb1ffc3c0700efeb723a42d4de38bdbc583fbac812d6105f996c3cd6b7853e02c1556ae0ae0dec80d422f42dff6ce555dede84676a51cf3e1dc8aa9403164347e7789f2f4ff011383d796cd3606884e44e1cc399d97f5737fa51bd56de66bf28b7d5cfde0e2e7e19f1dd013874073bb00325aaabf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (273, '{"ob": ["15151515f6eede78892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1f068a147340c1657e46ed94dbc3e23e0fc205b696ab2eaa72fa108a8c7a9625612ee9b7f4af03521cb1a546aaa7eb62b49b504ad4138b2d6ce1aaa6dfd5bb912de93101bb0891968bb73c4103610e91374953a27e72dbdce559992ad3ecbe2cbc6695a020fd79b556b98569411b84acb44948c054184d181baea13fa28f9f5b4ebf0f5c33e966530dbee3e2dfb70767585d94190c5ac4fc2c710c694ba059609c7a9cafbdd9ea430d10a7511db6a70a81fe610584093da6352168b918b7c31ef034fd2871e893bee4891bf65d07bb5346b1aeef5b3101e8df4b2b8133c5e384724207fe9c55ce0ff83c6736cdc47c8a168845b476bb45dc3ff531a74c4b13c8d58d8e00305976a78702ff97d21a6f1183686a239ffbf3b1fc2c5d6c39cb53dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (274, '{"ob": ["15151515f6eededf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7fba661a7bf4a5cba7a03e742a8303c068fabd7fd726b9128201f3677b846c750d8ce301a75bcc597209742be1be7ca76460a7ca2be411d446dd0d0fc05daec3502545594ccb684c4c42e31ecaa8be8f8e868d4fcb490920a0774f9c505f636b17487542668601dbc100ed4b5d082ab2c56792a41c614070353124a8cdb59e17ec2bcc9ed909f3ccdbb68d5a9fb1f6941000f9667ee128f6e521200402fa6308ebc992c23cfc84d61e082b3e2442be238a34d09804467c0a79af2fab01dee73fb8cad1e6f13542514637396af945806157e4b723a16255f0bb68c43aaff8786cf599e0b43d6b0329830f6836ea3196dee597c8227199bd78b673ef845d6e5b4c478d4b4ce93ed08ae6761688478d6a93c44e8b344b96fe65fd7a27f4127e0ef9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (275, '{"ob": ["15151515f6eede38892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cfc111c303ff9af0f68cfeb8383160101461838af2d3b60150ece96ca1dcbe82ebf438121025e0595aa35fbac23b6a7f410c14b9d31e00441e2596cce2a38340204f2207622c668f61757a49fa51e53965b46f144231370a93f777bec31fa299fbb6b00a982ae9f4c99600822ac1f3097b8e8d2f0bc6403fb4a12fc32f22fb57a59f5c3606c1b8bff96147a086cbf6ab07a26d772229f193ddd764f0102ebce01a6288d0f90d57607009244cd1fb4aa3298b0a83be9f94552de59dd000100246a47078afabcd34f10006dee7d1645d94bb24e0d5ab4d54479844915cf050be19040266fc9510a45197037631f056f69632e9f6061f1ec721bbb148046bc221b1d1ad63399751081a1bbb75e2203ffbe05ffaa0c1bb3c1105da576e3237ea36bee"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (276, '{"ob": ["15151515f6eedeee892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c604dc3746bc0e2a9ab42d53f1c6f93c4d3cee786f59b3dea034c535ce07c0cfb9368e0b165ce25f0e290dd8a15dc54ea0581745f877f2517a446cbb50ca61e1817c84e31e417890bf7528c8d0b67fcbbe07b96271419edefc4414bd7f813017d00de1562033b4f1f5a80a42b894dd2ec534d6f37b9e31bf3460c4d9cc4c9e1f0e33cc9d2f74d19c17442082af54430b0a6ecf3e144e16bd7a6bfc206c3e8e70cc1728860fd02e3370cd5645425df57a529757a414bfd4154816905bee132046228b417e402a4e54eec7c1ec9ac084e1d1ea5e5df9990721e925122f02ceb795da8f213ca9458c5b4e0e153e73ab49ff888b9d6d00318e02b447baa044c860bd2abecda02487ce62b948f08fba5213eb34e920cdc4fe495683ba6cfd9f0270b9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (277, '{"ob": ["15151515f6eededc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca4dbbd9f26d4c03435f2478614d393bd7aaf0e4250bbbc737a28033dc99fad8590f4774ffae3caa49b2150fd5af74087ad0c7683f7821ea5a6e71954b6e4d9eb953f1b1e76343c1c95822cecdcab3d9ea120b8c6cfab47472b1c431e2f925dfbd10e96435f63384a4e68aa9ae3dd2109a5c5a2e0b4389d70f485f248970ab692b8e728030aeeb4362ff890710529c9626b2ff84af63aaa21812c2a1e9e551225169e21a48c519c9fd6dcb74fd9601433e005e75fe61ceffb3d7ecb21ea29421b8f697a14dbd2e2342ab79ae3dfc766987a946de56348a5a513877819a7f8be669caf3a7f891ffb5b4e4c179063de7eb3544760bd7461edf3e7788575f09ba911db3051023a91b51d8f9296efc126356b97e8f37e92dc3a3f3d488f602e012f5f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (278, '{"ob": ["15151515f6eede3d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf372f7a271a9377393f904ae6de90e698ccdaae14861137a4e249c5c3f6c7e809ad6483a2a67b132027ff8f51069d73c39e262356340ed62074da31334d1ab44a607b59a165cab5f57e1f166621068383082c361e170d9c3aeb0be333b087bc8414fab6675ca5e2b3a4a6cdeeb210ea3c674e803a7c85a3a37adf371958d7e7d19c1091e179f5c4e163b1d14de57d2e9e7a16ee461de6590321c599cfaa5994b2c5fd626f1db455063b1275e6feb35f717d7633bec880379615a9c16b2dadf61f06c18df569b0ca3597aaff9128dd8ecafacb8996617b5d2f17b16ff4ba7d7679e53c90c05c0fcedc080bd135a90807262d960b8926bd6fac4a28a58199707bbce47034ef4789cd01335fc6222103892e54171de5e39fb84079f0d00bb7e388a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (279, '{"ob": ["15151515f6eede31892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2f0951a883e4b359f911df591653d41a94f4591f96926693872e06b0be7d36f9e6118dc8dc99f4758fb05b614cd5234167c24c435827ceaa847984056a63ae4424c86465694db6e0479f0403fc221998c54d2b22f3f630a410dd137831b8f0847cdcac24f2049931da6806afaefd67b7975888ef8c01cc0db9a768673099411d07990c9ab015fae88a137dce3dc5d53fd24f6d376a628a52f60184b5fe8f18c89c21e3895dedfec3507ec49064c02a0c84f45474d2486a28b73bc6c9dd47893b101634a16445df7fbcb6c144510a0add0d2b7f025e9548dfb0740b6175e65ed76c39614a02528216415514337f85d48a76bf1a55423c950af14cdd617c2963a53ced7ba8ff52c85f5ff6953b5e0942923a907cbc717ea7eeff94b840a39e15c9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (280, '{"ob": ["15151515f6eedea8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb8e611f0ebf9cd30f6cd927dca2f90a93fdf9630eb9018a6a0af63969f1122e85eef94ace3546a98cbd3c05ef9d7ce42f679a7e09260634c43667eac023efdb7e96557ae57a97de250e81be45483c772d7fae99a65a6c0f2cfb94853e2add5f26a179085e038ff560a7227f76a0270986f642f599224a9b59f7bc285a0c1c7675a408d73321cf80f6432e0d32d39ed8087608f1ad5a1668d6175bdd002c2c1631c274899101b5827cb11985bd04a8c473dd22fcf89a10475f7e8977e61b4e32be30c8e0055a789e209f9d237e24f462c6bc8be181feab47a0f0d1c023878607afa2b1f49c054a3d2d6b91da8fddc1b80297b7fd7f0710dd7214cad1bbc4891f1d45d085b2032fc4370c7fb96677e6ce0e033a64e807676ade4b6718691d66699"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (281, '{"ob": ["15151515f6eedebc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbfd4fe4f9c11a25534db6f1745dcef31bd8761fcdddf64b64b0d5e43ab94e78652750704d45867acdee2d0586a436dec57b7588e3b056286ca113108b9aa493e6dfc848eef211466943e19a9d9acf929a9e97f57dd3c8731129ec470673c4b746e93ad24f0e104762af3c70850afce7e888484bfc4bb9dc6363f4b5935244c073edc0f5f6e83e852e89a2b18ef872cf9fa17a16809092be24478a93f3521a989937a516ac9d1d063f9974586e36bef2ea09e68cdf6d6d604930d7f4da6b906d16189e312c287291a06cd857393d2bc3ae7b2c93758481dd88170f552c2554e7ce9f7645e7abc43a1c252c2f08e94bdb00dc6638ef1fa15a45327e3cbf9c2f5db57c34bd6373b13439eabd42b464d216fd8eb098c1026e2a84d69774f0b7c4a9a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (282, '{"ob": ["15151515f6eedef7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0616d29befd94076d23a0d1ec9a1cde412413706c8368c52ded0b1a93fb98399d74f9b28f40f2e1e59f6ac29c2dae582350d3f0fb799724bc8b3a811030ae6e1f6396ff2473f4fd94388ee4f0e90189893fb98eda76dfb19d4e6ff9a184a60f229e4138ae7eb4c7bbec33c0b6a3f4611337c874f5c2d451ff177bebd0a5315bf55614e11c1130bf81a6aed618fb2f9cc822de9a28e106eb7a2e0875e065159f8dae286602bbbad9a33b2d077a87ea2cbace21208f8d93c8f3495adf3c54d393a70de41159ca1adf4539b5ec4ea3be453d785b08b35d16ee1646334d701cb9db9305cae41c2f7f7edc82ce24ae78fcacb21a521f743a831693c4cf8b4b1bd31268743c9f7bfdc2be5f24449af1785e0f4f19a2085cacd509e4b426cc8da9d6fa4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (283, '{"ob": ["15151515f6eede17892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c33e2b01da0fb5a61453f5f5ec7f93466a1da66865c990dcd73c70700d5a5e9e0fd066a2d0a07bb04e990b2deed27088060384d7a2f192a458ce37f41790c5cb3e93d4b423b8df8a95b66a915fc04675173b933d55da9cbeab3cf3032873978d6492d6f6120b9a8295979ee39b11af067c7fb715d98299e5ae95f9f07a13be69062f5ea89545c5ba99c784cdab1e21d6e8328e1f3199827bb6c1a6e1690d5d6dcf70dc0341d6226f8adbf2e7162cb6b9c8bbfb69b3d127df71b991cea62b0c8c90ded6c8421db1d3352d72e0467d4ba06e869436f540a3f4025ac04c4475d2ebc80e8ee5bb855c23a096b6145fcb3e6e68fe01c6de63eede5078e3fa1369a56225b576c904119e30a777193c44f080fd38d417a15210cc5e56f3dd931e98dc156"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (284, '{"ob": ["15151515f6eedec0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cef7dd86555504939071ce279aef05bd6ff453d0fbe678e38d4e114cb5ee8dfb565035d7795ac84deba6c73d9042e5a710076f3d4874bcc8a47033192ddadf3b025be0ca4dce16522ac0d957dfb877e1876a8f71f10b8e294b569af334547cf1e20221daa607fda2a1357f001241616c97d84091cacddb85eae1be91587096e5091a923d949f0656bf3552d9186e5b36f1ba47c8b018c128328458341cfe24538d851a84b4b13f2d3e89dcbc22801a5c82bdd49656deb8d9c5b652137b5939ebbde757f00ff9edd16313f5595788bae4701b2e64d5c04fa3aaa831c08a3141caff764275806c0dedfada8ca21d223046883da2d7ba5cd05b8021dfd3fe2ab9421d7f3e6928db2c43d621c759bc0660ba2f7ad48f350d097fdccbbae0b03cadfa7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (285, '{"ob": ["15151515f6eedeb4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6b8582d94a5ebc59a02ae7c145225ab02edede333ef269ea86ff224ceffe73798f482ce6fbb5348d78141d772b6473fe11e48e8450969c86ff44908ce870120fb7c7fcc3d5efb5857f6bc301dd3522408a51064a3e7a9db5968a1005807dc6c75342a35cf9b09204df2bcdbe6000a8d33018469f0e645f1adab5a3fbd1953645598cbf122466b0ebfb480f581d80bbb5007ab764d4e63d2bfa8f96c44b883f2eb65aaa454b96a97e575e93579bb2fe4d28a2d4c0f9b3484f363ce57b9db0c75eb127fba6ff459d6a0ff27fd315060ba2ca466bf46cd77eedd68ef84d4e9fb33fe5fe3a7d1fcf08bfbd412184c541345ae016ad1f6648466003405cbfef2d04096c8a211b67b8e34e086ccec039308cfbca767e6cff442ddc844cbe0b3528a355"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (286, '{"ob": ["15151515f6eedee2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6f72f07142c61a1ed17e8ebce93885d3154b62839a9b3769c9c72be6a76572717caac7b4fcca8b411e7311c8e80225aa3d10bb4d6ab3ac54be69eb25cfaa66b3418dd16aba231f6497fe5a648f6da2e0730183aa200d9ab1bd97d315dc93ba1c81efe408805473fce0835c65ab1ea602f49573fea51fd18c1c1593725d7edf6bdebc5def7c2ee6231c7719149fface5cdcb3b1800624b36973d03e66f30057becb25405779ec2c73d90a75f2523dc59c70a9c3c0eeadb140f83df9a79b83ce381d85a77cd48a290e8834c22a86f61bbd3d4c37ea012c488d66259a7b297afb55142d13f1bd97bfac98e3bcc0a091144c81bb6e4957f0524958691838eb01eddd462660619e0170eb6ec608fe3af77a61fed9cb48fbba54759a97e52019942a57"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (287, '{"ob": ["15151515f6eedea9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc16f2ff6bba45942d7620bfcae41579f9d352b3b4dd0a01253601dcd356e10ae2a8f392cf7e3b76475800630f7f070d6240bd78ea37704462190f27c4bba859163775d7a4c8f7baae0e99c2540d081cb925259ab208ffc5ba887cc76c1cb24e11a3d0ab11844241c52f5da5d844317444fd8b122bb856af8039c54f1ff220b2e8a550d5e8cb08ba4f44e77510cb0f5e14eee16c47e54ebb77d2fb77fcc16c489ea277e1175537204967621e7d67e7e68d0a5e2a30b7e1a52fa37778ecdc79a2cef3dd9f20a056715504d3dd7347a122cd7b7172905b5f3d5d7a763655cabe5b2f5605eb615c9dacf98c9e925654a0307a79b5be1dde884e43085d9a564ea943a8c350ae619d48a58c7e0f2191f25c14313d6ecf1bac07b7905d31b3219b9455e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (288, '{"ob": ["15151515f6eede87892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c78e581eef77b0849cfb054a2b24bc9c5ee004a9d80249c1c3abfde3b88bd21afb7cbfea804bc22f4dd67bf731fe13a83b4331610cd0c8d3ac4b01a7f39b1679c8a0dbe3d3a52c1841d97c224bceb04f54c48c90f2168049dc95893e1ee9caabda61f10f03004af4684ff19fecd0a91c85fc57608d33b16cc2f1fbccedf1647c5625004432755cee4b137f5928ad1e0fb10b0e86c3d1a5d4168023b6bbd02ac806646eb497bf12f02c2924c364b6293a6e6e988cab29fd6724fdb51fa2e350d8becf63483c1a39c7ac84b892c48d585f8ca2f44ba3169d71d23c8676e87e789ad72ae81860dded6e3dd38d8b9372548865f7713ba0a068194f118cecafe7fe593989447cd5412eac5218d5376b44cbd90cb391f3a70bef8eeee897296ad0da9f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (289, '{"ob": ["15151515f6eedeab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0bd4568f0ee009f6b34570846f904ff649921f9f43a5442c7d28f407aa85470ea0222428dee0a2a4a8ca435386c83c7d2452f9a8b290b09956405972d9bf4992b94a36496e921743c48fa86245adbd88f414d9973e5f36af92c86f06d0a810239edfd4d3ef64e1b98077b18f1c52b21df5ca5627995877e3af3797d2c40ccebd8e15c59aa475bc9cb8e5469f43ed03e51382bb669ba761bbb3d2568a67cdecdadc43c97cfefdb569ca77b57bac71be0f16b64f682995ff3edcc6db5587edf8eddf356b51161f3730294d25e418227a82a5636fb3b9d6d70f483c7996f253eebaf83d61a310ea493752a7315891c6497b133e71b6b51cdd3f4a5884b566ba6f0181412008824dbbea3ec9596c8e0aa4f9df0ee3cc66f17b1595e86105978cab4b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (290, '{"ob": ["15151515f6eede79892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7aa6b73637d6c9225b1469118f9fcfe6458dae49c3fb42ef12d78c396bdb873716961c54bb2ba9901b6b4bf01b877d0dcf18230d2eb4a2da0d2a01e23f43682f35efb25375333d1ebdf5cf2c0d777e06059eaeb1a644c64bf9d0b9bea3a7f60340971b364946dba88e175a49fcdfc5f95215fe9cfdd16f9b0df72700dba8f013a672dff913bbf268026e1a3e5a7ab172249ae6d2e9593c441dfc875028b7d0a7bf4b6537b4aacf294562d202d8aaefe6ed2e931002707b91c2c0f0add066ecb28725d3a96d4b5ae80724514643c672b9e033d1f70711a60e66be31e3e33c2401620f4c6fede841d1bf08789626f68d5019c308b17ccb6207cc49451e6042c97be0c265281c0637340d96cfeebdcad63ce9bfe68f8830bb0da720df7c6108a1a6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (291, '{"ob": ["15151515f6eedea3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5338e71d593c6401a50466237aa76e46ffd8c25afd9d53d540728d7b6ea8c0912cff879eefa02cd258515cec98632cf66db887ab3f760ea91c99787718c0848354f207b7151afbc9fa807fcf0e76965ae410152bcae8274a25285cde580d6b49af4e13a9e39cee80f4ca7c70d68482d88ff6044857969747f603150ef8b8581cadd91aa0c61d77b4998caa958f084ae6d283ca6f15ea99cc62dfdf986a1a6cdb3dc2a9676a7dc84ce747d752ab1a4e6bd3c93311dd7165c06899353f3c20853ea1ec989d94c9b5f102000c0492e906928646790d74189b12df644ab64d917cac90ee294ee3a921b67a5f35c5d61cd849967f29c30cea393a9aafe84bbe7c95f70340077f349226b2aa49f1fbccba15acca32028d64bc9350ec5b2da06d327c60"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (292, '{"ob": ["15151515f6eede4e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4224758b66ed2752ce25177a94d9fec0ec1afa79523781c06b904663e8142579eec5731082ae925d9ba237c7fe2ae93dd541b63dd9cac727f31a068d67853eb924c244a17b87453694e7f0a8feba8d052ac08c24f74c1f299b6000ed06fb605134e4a39a99672e45241a17d4129887922da1407ecffebdab5c79aceeaa1e0a80ae12820fc2d93ddca318e82d1b9b3524637d622e9f09181ea3680d463733bd67203e4e827ce21b791dee2a63bdd2f71d5c2c33f7092bafbdc63b48b850e2eeb31c5dcffe3b8608217054a502098254d259244d66369019605f37d3d306acff07aff2e0b6cf4836a994ef2da6f682f8df78af35278c6e4ed78ffabc4026c2552dcef903e63474b41e0eb46eec860615709595cf7280f0cc00d828d3a808cd57e3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (293, '{"ob": ["15151515f6eede85892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf8f46a4ac5f7d0d605b70f503231b4810ce738f93cd7f358525875d67247f32a768d23d143dac388324a74bfddc29d475a6e03715b9fd8834ba1aef83f5731253e1b92a013a986fc4652d185f526f41e3dd757655f023083e6e5ba833ffba86565bf8c34bafae64e50d4e6e368460e1184932cbb7e0370561b20ec9876d3975c8b90ffa52c508d05799b6107a0c15374a30147d85dea8891642442a33fc73285e3f796cff56be2a8d4070a4b59cf7959eac103871fe0082d1dc63dc90aefe147efdb23e2cdd7f69defa8be68de8d27cb4e4c558a5623a8f10835e66c97f04cd545ce2bd20cba8554d62aa000bdad6ff1f867e7f680b4b1a685f309911456f33f5185698ead46e1eec03ee92695c39cf9214e6b4b62b56bfc581a41690da89787"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (294, '{"ob": ["15151515f6eede5c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce0efdd6881b6cc034d6a1f52462d2abfe2cf7027642ce3e92ec3683f298bb992647583704681a4b1dc216e338c324a084755a028c4761d5774cc705d88d2c3bd3a199ec72b8b035eb4cf0489390773921d7abdd05fd0ff77a9b447e0ff9f6b1e6112a650b0cd12110071adc1d25980777c6219b6b8b80f73640756018bea13109b0132cc9f3c1821900a37008a26129b4fca513ee91ac78c9f3a4fac63d718cb710185f09bf0d659511c3d7488ef64f31179155b95ab333baf0228631a904e08f7865d341fb7ce625fbe5b24f9852165c50121dfba26a56a9110755fcfa1b2c05cefaaf7cb59aee6530beecb932dc00074ef4504775cfa1d23ecd57ebc6a97f013f54fb2b67c0513bb8486ad6d71ca831014f06e440f92c7f79c746d16cdb189"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (295, '{"ob": ["15151515f6eedee7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc66f2d61fb96c5f3c54aa238256c077defa3754004070f665869c160def59cf15160082b0ac5f148bda1521b90f28b867a2234325df2cd315a9d2cdd6f35979b9879fb0be2d5e271d7793ccbac30f8db0f9c31aed37499ad92e6714f43df742dada478aff94ea5da8dc85e3940e8fbbcd9fd00e850f7779f1a39d04d165ffd0139c927a70299d4435617558163db66ab1b546a88dc7be6641befa2fcf9a019cfaa5caf3f524cb3dc1d9c2b8ef92ac0b9f7078f4b6e94778e61a5b11730134b879d7a7c25933efdc839e22f3c55108a44fb551d0e784870fd25a5b7a28953cda38088e5941aa4c2e7d6cd6fa21ac155fd142cc499505d449d3a2d2eec66542ba821a0c92927b7635871dacf271cb58d65bef4d1d93eda49b592c5272299135930"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (296, '{"ob": ["15151515f6eedeaf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c86c2feda3c3ea4de020ca73f34d54a46eb499ad73216cd16a7364b251ea7edcf6dae829b99aa5cbb0e0668c30709e36a28f27e123ec9cd63592accaf23bc67a2b414aa42d4a56df6ef9e7cb41ce7c8d5f5a354d5f277bc862c2a56de07c856cd5e01545c1603dc2acafed9061f0695925e5bce92ab3a3a7c62f9e7a608f419ae6b9928aec7a5212726abecf8bd07c451cbe3da66edc004d035e7685862ed5160874aae33e6b4005dd688938908810530d227f7302a0808cabab7c8697e187882bdfd272fa5acc142f5faf86313449625de3910dd9e8eede25787cfbaa064d64877410d5981e9b4ad5acc6e45eccda862057b963db9fee8017cc18890c08ce1f070833140613d977efed067eca05e1618a8e98c25fced556064e114af99dfbabb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (297, '{"ob": ["15151515f6eede73892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce2ca32f2b0d837e3c590ce5dc38fe51f9814eed2bac48c6cd194f3d5e0431ce8ce7c6e227abc8aa1150ad2b8e99cf429f592de09bbfbdfc280e9c6a73d8d5f193f4c0d70139e66d89b4b3b0488ee088352cb07d1760633aa4797ad2ddc91952a9a3d1f1e9239ae6aff163679184cffaf54564e96c2b3852fd8a6e5fec2115ecbfc3ec6ab26378bca6626a978ece04d58358b6c6f1ddf200accbd0d0874144dfbc604400c73fbeab61fe37a53842fdd73031064552f3157f9e44dd4c56678c58dda68bc80c84dd9d3cbd3bc61f10b8f095db6de56cadc954704367a0e01d372c42d4fd94d93c851b64cb9d1e17039ef230d020747c6a11445ca6d1f8dd2f4db3ccdc0b12ab7fef6d8c6a849fdc58bd91567649542508eb9fd631accfad2b15cf7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (298, '{"ob": ["15151515f6eede11892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2b2bb7de79dd121dd2a00c10039b690199580f18c855a789054789451fc3841755b0b141855dc27d0374ecb51f476c5d63f03439167dd601b97e78129437be70b01df4e88d7814804026f6bbe4b635493b0f8e1bd0ca0f73bacbaa4199c8fe10c3792c3f527f75bb74db565ec98fc87d846dc5f018a1c5b3de91cb78bff3b9a44d9f872c27f7d2b10f4c11491249a3c5d09e2b4751f232d4c84d03e94980cd35a8ce2c5db0d02b8bad29811c143b18d714931b07291210a0073fba49dda1b4dbf376d1fe09489355ffb78136ae29dcf1be47af4835353cd7f7a5a48cb2304801937bdd73b6b08051bccd72ae9593516f98deed0156ec7dc91430d4f80d7492924c99f02694ba58a7081de37cdbb7139a535f838a9740ea15e421714c66a77f19"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (299, '{"ob": ["15151515f6eede4a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c38df4ff3d87edf5cf2f6299b28220f89ec08a7cbe419b5e9116edf1d57649d7121ba59aef6de255e3b1d524c8fc64d3b48b6f7cfe5b01d7ab44558154778815b9b5e4d62ffef107a11776af16593121fc4269ac08303959ba069edf70af52f624d3c862eae96005f7b9132d67a20ab3251b12cfa7a9ac2b44fde46e11736faa8a5dd094563abde37c29416e15ba4ea866ded40d83ea0cdc76f78b5dc5ba73e03c80d5c284dc5977f1103d31a1b7c65eece8466256810e292520b662af8e20ba02f1c5f2ff00747b302fc0a2509ac098b7e5d67078187581c68b5f4f4b8b1ea4bfc7ad92dc94de959ddb48d305a2728a0829528d1c3982191ff836d960c417f9905df0bf78f7d9260d32b13b5309f21aece2916c9696663526baca34f41dfc001"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (300, '{"ob": ["15151515f6eede9d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca46ae0536dfce5e351107912191558dd331977967ebb2446a5730eff06090ca9f06cd92dbd25313b387514d23bfd2ab7db4e6903c1bdcf7fc77d877a562e89444eaed12172bf48857accb0a4c008b84d2e39adcdc807b085839de5dda16d6a0b4fe69eef090cb68a9018516117650e81f0d8fbed3bc2ebc1f648742382cabcf81083327110656d55216ccbfd0899cc6b7ef7a074fcaf4a47eb5e07c744b8ce12219488e3859b968fb56b5541e12c12cb953681e98c7266dcc546c48e26d07fde3a185e56cdae2cdaeda4d6a74821fb5f45e205c49f39abbf3e94cad5c044627fcd134b220195a4592b64b80ea5cc1c974a5ae3c54a24c4fcd9ce11c08028c2e1944c44b6cac776c07484ca89174a8a742e2fbdac5e05ffcbf4ec2e124ead7c0e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (301, '{"ob": ["15151515f6eede8d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1739681e4604056af19b185d690267062be738c2a17eaf39930ee223f9f1c870e9f2db951a0820c79564503697f563ada502ec23b23b7cd75bf804e3ee947b6e8a080b0e9986424ac001168be49c94560a052d6d8ceea455c68007a2457d4abea79178522e5c37d65ea65d7f2fd310d6c6be65d3f9029eba82a111cc2721ce67eb915dba2d5fee1eedce5906c71d44d9085ade14b5b0a9c1f5707d78d62a6a996960b69a31efd4db07aa66db065c31edfb8f22b83a5aac21c7a85825abef99eff3fec7bbb141e3dcd6191b30415664b22ddd6318594a109dcbe03091ce5f56866594c9381d0f64acb42033bad635ee1086c5de2c0a6efa27dc8a604ae6092d2b39eacbdbf3a40fda8956898d84fcc61f38be2cd0276020a0b84da500651b2abc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (302, '{"ob": ["15151515f6eede08892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4e6e051c596652b9f82982e6d08e0dbf10a15660576a799d639bc9b7e7e53fa421a7f32079603609a075c901eedf07d503752edcbe9d9e5e66d6f46b8655b70768b4b9cf46d9cf93415d3bcf90519da3109114d09ae740c964eaa9ef7b02d7aa1afbb0c69f43344a4abf11c1de52c8792e57438867c0f44f4d8c0bbf5a6b2bc4b20e5cf55b479e6bf0f0be0ba5a99ca430ea0073bbb39cb9a0bf5ae5a61d8b94bc2139f735836ae03ca7b131afc8897419cd539bb2d3d3a37f0c160a1c1103ec6f368629c8a8a0fa37918e0caf3a1a8e8247e2c5c7ca39f9679a70e1f19496887737413a6e35a75123ba6c6338e0f3d6cfbd447f555df24bc06b626a950b850c5aa3e733b5e6e84b02f360deb602caaf2ce9d8cb0a89b67ee8db271204c83518"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (303, '{"ob": ["15151515f6eede72892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cdc94cfb1b543631fe51d627f244dabd48f485d7eb05515b9d5b5cccb10f5b235aa64bd123a98d93222601b8fe19d892ea048b2b7308f1fd7d220b4e37a184652553da1c94366ae716436cfae6f93a4695e1bd194ff8eb5b3c8cd6d0791e4d508cc795fe108e07cf6c31e09cc937401648aac3042b696817ef6d4d4c083d5cf906b4ad87a26e50de5e92685b0ed1b6929198f020de29421303c728743345ac5dbc9d16d58a02474877de2072fdc9d1714c63c137c79fea76bee7b28db5b105f9fdb5412bda7c81464a47017abeccc8572f14fd1fb219906759e3f41177ad2e1ecfe1b01da32f7a4caaf65ec4e47c1cbb0f1b65ceb66c4fda574d3680fb9cf79bd42151d8626b21719ee8bfdbadf1b8881dfaceaa12b5623b620c321c104b8526c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (304, '{"ob": ["15151515f6eedee4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbb7aada9fe02bb43cc57628fc9efff145ba882bb8a86b152964195b6393557a0b1ac6a3d2e932d7cd5993fb62a6a55d55d476f4286def1c63baf3258702dc47cf000276f57d24ca9595841fe173e07b2180f0ee032b7841088ef9c65320f57e4f2fa0281d4434837eaae3b38d7bc4c1a21c4afe5ddc6cd290f4ea4680c4fbaa41fd592c597575dea995543c38449b147650878c245d182ee40abe1c9ed402a5abb92897812ee192c3ed39ce8bfe4ba8d82ed2598835000f0e31a22cfdbde438f79710b950d48b3433df3cdd9b26cd30e1ebac673f1525eac605816ba813a3f40878fc5c437d38d806532ac57fdb401e2c53d9c942d438d68ec567a803a60ff9c35c340d288d62a2e870690a2ad3ed5685b59d9f8994563f32dcbeca4b4967acc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (305, '{"ob": ["15151515f6eede52892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c702a366fe74b2f55a97a6862c983362c98a5f371d5f7e4ed9fa958c34784b9a5054940caa1bed67073480307450ec865add2d635b9fe831ec7aa5e6ad91c2b9ed51842f73f0022d940bdec7a93db78338a4c5cde71d518979c9007126ce315a21490d35cae2592465fbdf963ec084fde87e781e30f570a36cb5772e8b3e70434572509fda6833a6e1ba72e52e2770887a099aab42fe22796ef7d6c4e19bf2df788dde96b0639e2f872ce829c887e9b7164b87ee6572ec0fa9edc4cb89cea47c8df28785e50d2810e785cbca1fc89c3abdf52e1a59a79d4bcd1e6359001e8b4132f68a4ff9e3fc1c364a97cf18f6f4a030dfa39a705a25af05a478c477c268acb0d10b496723118190be4ecad036bad0fa54eed9a2a442f8abc86e49d357f4e44"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (306, '{"ob": ["15151515f6eedebb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8d24879d27ebf2d8eb2dcf6d1354d378d8be6014f7349481abfdc5e3cb5fe819868eba948d13d28f9db331157a802400ef8fae9b84f8ee1cf37c7a888ed62604b993e76fff90077bb904303c82cd874a32490304d19e56d221fe82248a7c3a4b2c8b057cf237d970e98e12993a000527d9c6a85e3ed518db44298c1c50be76caf3378426b8bae95c29ec15b0b43cc847c42f7cb2747500be5370c53d55f67665caef52484cbad2dfba52af0e0bde891e2570fa1c6ac3c8e29cda2a8a86b115abde5aea680af78b7245f4ed621caa77419f969874e12dd69ed3c09bfff882614691d1225953213ef6df380b69d3516dc6ba12ffe518ab48480ea5f8eed9b5374aa1dcaafaab722c1a4fc9757df3f4f1533b1b4b464a5a3c5588ef6e77c31ec649"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (307, '{"ob": ["15151515f6eede7a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c995f75f8b6124086a980a0ac76302b57c8e1bb80bf02f4baa7c2dfb55dc22a140c219e2656be1eb147425915262749390a5e593dee7fc4157df826a601aeaf136ba29ffffe951d92835e62bce29d5edf1cd3ed401a0ce59b1a441c46b00bdd5d9cd72078e5aa3179ed7230cbdf47a2be2359e79a05034b8c1a357c3f9629d0fcc15b7b4b5e707838e876b29115e721cd6b3a7c2081d14ff151914ed820cfd5eff8aff320e1766e825d191c750ec462b4099674cc6b008755f68f543c3807b78643e1c2c1491a11cc3d1f2425fe97bec1899e198cd1b39a513266c6ba62b912955059d09f4f42a45096c546fd492a5d1dc4be52d30500b5bdc1fcdf4165eccf12afd99bf33f0a98b5462aa1dad8ee2eaf53c6e44e7b68928c6e1a28e6d3c548d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (308, '{"ob": ["15151515f6eede20892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c625768c57a0539d9ca52d1ce1cafa1e27c11482bbee4f5f45187a1e2fc12fa2deb58e19339dbf55a8ee8b38df1530e95f72b4093440395b62bf916bb97e78ca5d409f6c1410bea829ddacc27b5600adcc2844018aab9e835e37ac6328e1381a83b657b61a0e99bd2e1be99e1f805fb445bbc1e98f6f53018c08465407c5b56e11b7062b075265fb0db6f6e7f51ffa036eecd8821f74881f44440be36a8907075c0d41943bd2d15e1b4bc30a9991aedd6bf6025de901621ed0c27a29f66bb9909f2389151ebea8b482da8ef31fc71edaa50ebfeaf1f1bdc05dd2fe64cb3d17923ea555b2a731d462aa6277d95a51128b70f917d68cd5026e04d369f65dc35319a2d70987932534536661cd352264de2d623dca723ba6c5e61a369f1e055b3b10c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (309, '{"ob": ["15151515f6eede8a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9f07494cce5fd1718f5968871bdfbae1f6d40b52658b794e427cb41508cdf60c6df75fea571faefe949043c91ef92d05140e7de17d66dce29ef2cdb7f18d947ec20dd4d8d62ead54f4cabeed645c6998f6acfa806f7efeda03d85a1c483eedc2c7e4bafb94763768338199e81a0940adf068dff3f435a3a37ff704ecfbd9c0153c31b3a6319079ca5a4064cda42413667f24fbc282275d84f0c8475c918b9fb58fe2a9c885f45a9acb5c51676b93212ece3d04298de685d65c32350fa12357417bf33b93cf83d512f5fa7fc404bed7605e012980bb8cf6a0a43b13568e59aa54c6d00f493cbc65fbc214f04263a24277ea702907f7992d7db24d7f9a9cf6cf021ea417653f6137453e9724ebcc85c9be5130f4582ca65c31e340381a5c3d1771"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (310, '{"ob": ["15151515f6eedeb3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3f4424a608a38ca37e3f0474be81c10eda6cba259f0bccceaac2004408414ce4649dce803e4fc2fe6f3fd02e525782f33c72fcc4015d00f043b880071c00991e610d03e10b68c43065aa3eb7335a53f85d079d9117ab9c915a153f8320aa6f0e5e5234bd3a382b1025e3681182b52d791e4b82b213ab4f905a68a201a363f813237d136a7db3d64da4e11d4d15b5f6f9666dc1d42497c76e3fe08556e848a703239b5c7514c5b8330b281108434d09708e0f4818a78fd566f226912e4fe783e446e7f59fea1632fd7c13f7c40c69f6846450094a42d5e6283d59055b3c5dd014af6820d5a9111db59535bfa071267c884a6b81bbd278c34d45f735e88f84875d7d194980bbe4f2d2f08a8f5b0e3f524b7db47804860e683ab05bb93a4a7654e9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (311, '{"ob": ["15151515f6eedef9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c32b407d6213ce219d0ce1571fdb87cc0a56b213005a5b29c724c0d8b5015baf683276dc21c2f567ed0a053419168ba223bdb3e6bc79193fdb153ec5b2af3056309150cfefd90fb5a2002b2cd0e8bc77349f23d787158976e2c904404c302121ff063b8c3c059602b141bc87e6d0ba23827352061ba3a17d1602b65038a2fefc420d5f1ac6d18f526d5e7da3c224ae8a1bd289ac9b92e04f26fd559f7a2a5c1eb59cb697bd705732c5255b385285f66878a319005ed98704f4baa6affb3326018f4d9b93d121d0ee16fbb5a8e53c4722289cf1b0fedbf1aaf9493c3f30c17cec7751170110807fbe2cb503584e920fc76a2ef325035f50f4dcbb77da9a9297e3ab88e8fa6d52dfcfaab30f005f2dfa106273d2b627fdc377431dc115c5b7e44ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (312, '{"ob": ["15151515f6eede8b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c166cb96a9ec423ff66c74d026c6162322e5440dd5378a358bb1436e8ba4b0a6f9b39be3e3e51a58a5510d34692b119d5f8d9f9a1b40c2292a076bd4753d330e8c9b5404cc4f4f8c47121591e612293bfc79ec19d30c4b0452477e14e4dc6d364cb37fa155933db1719c0e28bbaf0a3e3a125ca28d2e25c93d6127bde010d25e84038393babf42fe90137f0c751c81c681bcf6b3a4d44bcdaae1584796b4d05da18248ba26b06f2591df0291cc533678a3cfa15f8ed71f61625284994b8710f3a3c260866aa786d2419cdad22061b5b1b55a8647b62c7876a1247af97d3d50da0f7689564076674e565823b9d5aa39008521abe3ea5545ac3bee111e1349a9420152e659f9d07ca261188e19eac8e6d8e1544b41438a591d639f52219ab0b7c25"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (313, '{"ob": ["15151515f6eede67892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caa48296d77697100535e0d922149cd86902e4794b64d99ac6e45d5c371ee522a28fbe29d37747400c64536cc2f14c4c1c053d9c0c6a1fd9df022c150962f97af33c825b28ee1e520f5183a7079dc4ce256dee1f580e2d5a2b0854d7bc2d76e29fbd34268b9ccf417ec5214920e53cbc2ac1bd209325c04de0adc72a72a015578fe4e36c8d48b73a7cc86f7441a50ff066b1bccf43442e11b5adc1425c9ea1b4640b7f004155019851d8c632e8a28462d317c4d5fd88286c308e9f30997d354c9956b3535e6dbac6408259074e2022ddf30d46d888b3a264bea363b62d4db9baf81e112f56c276f2a8fe4acf4a148a6ac4122d82f59d50b31ec6999958ea8dbfa94fe93091df13efba4b18f494e5785847fa80b5782d05a96d021d31780eb892a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (314, '{"ob": ["15151515f6eede2d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceb9b2c1f062bd67f5cb4faa4a2a20c04eb85cf9fabecf3acc72be68725f1eddcb47943e685b082ca07ae099e8cb8b4b882fa43a35ea6f8954ae8038b365104e4893602e1153399f593c4404838c141ffe8dcb3ed3d184da8071b79517f88081629a796c24162d575da7e162b005ca9b7298850dd65aab3b5f6de3efee580ea481e71edd0c19f973b5e86f07fc9d946f1581df715c00accbaaf8318850d9861d049b8daa11407fedb27c579edc7863046bf593d12c1675c795d5b1867e03df8d4b1567064dceecb855e261d0b4286dda1cba64a1c81a9087a4cef0b92bad3d249f4f4527c18f7b75454a7b7b8125dc9c729d20f4bdc533bf9415aac4e7fcb8d5755749415416c723f9025af2b070cb519e8aade87ba6ee20bd5339a972a6983d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (315, '{"ob": ["15151515f6eede37892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c77cc577d66f7be9c3590eb84ca034cf5c79d7505df0a6db64c355bf2cf2f2fa26d952e2d274f006cff99fcd709eb9f228671ff03a790de0c61a6b024330cd12b29da7cdb6eb8ab49575b6775a1073c73d5b8ff9b6c5af5e7e5742152944b8aea0b0b8d7286ecfcfe7ce28f1338013c07e66612e34df21b48f347381256d32eb110c716f534ea1fda78eadb8459e9fa5af5825e4888e35466f58241fe04a3ccdd067b16e2da72580f0dd5ef2ed7b472aec711f999cc596d31dc1c66797598f8a16a2b9df6fb5502320345c044782444d9ba70258cd89ec91cc6d4f46b59914eccf6e1b6c28d9ca37bfaf7e23bdc9b3194c40bf2b67c396a2675de76db44fd5b1fc9bed6077bed75142a972723edb0b7e840866a073270d616573cc8b7434f2048"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (316, '{"ob": ["15151515f6eeded9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce6f9a247679238b7c60678115a5190919f178878cddd91e3858a398e0a2c2e28f293524793fd1e9e25f40204fa503b884f3e5f0e7fe6d7a3586bd9b64f446b2770bb23a4d9a25c9bd340c0414ed693a20ebe477ddff39d823a384758f4b91b0aadacbcde5e83a401092958febb28adf3440eeb2461aaf2df7307aea7b10a67709e8cb8e0923cb8c2089a9b2aba284e2f290fcb64d0985be3841d1f2364a71085ca7911aaf073509a5fa6fee85caa2719c22ca95a2535faea12807f65510a71d0a965938d01c458d07c775757a57d8b5e66b5a7190d3117a4c278874ea560e2a778abaca39a1034b1e9222eec98baccfd92cab72ebd2b6733ac5120f1b3710dde8d9f49aa640b2cd36037ccf278fe19104bb6fc06b35861831e122135060e1fe4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (317, '{"ob": ["15151515f6eede93892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca97bc59f23b2b9e072502973541a2a123f4da219e293b93f05e3ba2b9445a8817825031cd2d10a2eb8443822f3398653fd4b79cd27c75bd712dff77345a6a7b01b3b4095cd74f9f486334a4f79c61e2e4c3a2c616aac34eef65ae775267eaa13698d330da39da6cb55c0e01399e3419363e43363e84cffb1644110384ed862a4a37c0fd88b997d8d3a96f8b9fe326580919d2b3017d3d805f2c3bfdf7189a1669fd7776c93329e3d2c5111cffbf994c11c94a17ce09af53d8dc0d4b2dfdf133f0dbe60a780578e5978be4e1672f4e0b311d9b0830057eb5d390b5e879dba401611338b2791d023401224da82bed60bdb267908e1de5c3e101364f354de53a8886c28f7a2262d1fb9fe4fda9dabd40aaacf9e4aa8a2309d625fdcd2b402246209"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (318, '{"ob": ["15151515f6eede24892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca7f2b9d31ffe185adcae066340c780706c1e01326625d6a64951a44c2788407cdfc9b575919aa63f093af15599ddf023c96d8338484b4a8106d7307bfc2c52c781bce3ddd382ecca34e0b9b6992ae4d08436d689fbbc0e32cfc6fab441a16a627ab6de8d02a0dd3ce94eae607ec1bb54d1e83f6197b95e66c91435ee60aa5d0b215c3e43a1801323ab59993d9d08050dc6295e76d371232fdec8381823944928d54160e578b099d7180766f9034ce717248dc772776ceebacc6f2de2dfd978f01d29f0237c49fce25845c4816c73c8df4e752138f72cdeb199feb4b67ddd2c00204c25fee5229817e2ab075a9b4670e3498be96072af1a7e3eeaa259564d904cddf108a5e8bc152b555bfe7af5adc4367208029048e5b3e8727d271176c84762"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (319, '{"ob": ["15151515f6eededd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7dbf735036c1fce647b74ee2f3cd5194defa13b427f1b7cbbc883ff79981bdaa877fdc705c2a3baad2a40c2674f529bc9e321c135abdf717b9f93bba78217d177d4e336de5d219e8fce8e75a1f02bdef00c6c72b81b3c33577225ebc80ac30900d0730c93b9ac3621f3aa5cbbc4ec46d90a0c8a8fc83e98aae636c4dab2891f5dec3e7f1224ffd90a36f1e5b5194303a7cd3d376b1e06fea3635d0c88542c40ee65e29aa7084ba9fa316f9000d3a6796a277b6f049bc6f9acf8a89fe1db55f2026b5f6184a877bc0c90fcdd714a262e3030eb734d1cc0d24329dfc6cc0db4f2fcbddf9a99609abe60dd93d65d1e7cfb64b5e6afd2606fc951d63e57c90525e1749ed8434c96435381218631d29791180e467b99fd77e6da982a46c18d6f1ed29"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (320, '{"ob": ["15151515f6eede60892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9394ffe7ab878c015251b9001a140e235cd133f0ce5bb1531946069cf92e291a3c6c102c6497b59f753fc508069638ce6ddf2d10ef1cd145ab1492794a745a57d65f7124115d921862e262b5e4c6e584f7efa91979490f638a424c4faf4efcb6fdae22bd97e8ef5582e3160daafc4618412a06b7ad9a86c05688900a7a8d6028c7625249e903af5e8f51795ef7a460cbe3c127f5174e99b6bdb42706a1be28d36f2daf17216a1753a0bf577b864b88dc00b621ebd9bd413d27ec7b7b8b7cf4e171c96099fbb3267fcdfe917b31c2b3dbd7159b41a97fd8e52b9aceb8614e6613d78751e0f25118c7325518101c05d754da8d5f2b2a0031bc5eaf85ce8f3f516a65e1421b6d783eecddbe5c309d2076010e6e0997576be5710d36488293a3a235"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (321, '{"ob": ["15151515f6eedeed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9ea21f3826202e9569ae0dc7a8ba3e087cdaf5b2120860908c1a252638fa8e9e86c067e85b0eb6601e3a5bf5527e549c98c14f73454776f612e09bc2578634a31b604089f625e6742a681e93df975f819d1b15e00102c6ae57bbede205f4a8169f66ac329f9668dd8b7cd1cf1dca0510285bed63e18284f5e6d99fb06a16e313589afa9a1247e5da1a7178ccec9174a2a0f755869c713867d7f858d3cea2a44c826a412a05f716a6c9c02d2aeed2c067ebb1a697dd1379ebf8b10acd37cf740da74932a90210b4e463b28f08b897ff55e2fd26d75e2b6cacb8170175e8ebb45cc4a872e58c12b568498dd86733725aed38a259a448d7f113cd298a686d6c99fe5c2860dbca592a023e447ccbd0dceb273647a8125e33db055ac53e3ae070f8f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (322, '{"ob": ["15151515f6eede9f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4dac53729db02502d10ea9f4bdbbff967aa85987de8c55a2bfa5d4a0f603a01f9fbbf6fcb2f0a8bdf308439b050670c71549a42ecca46a012034e2feadc757b97fb15f46696f06ec1fdfe54c30b64b53030ba472ff7788368e672ec5504d053920b7613bf923fe49c7ab627448885bb7dae83277d2f87c0002ba2c1592828ad217016196445a521e07f70e10efc3b8c8180d7410bdc7252362d22382e8c8a9fa309a1a68a7580282842a8b79f8c57729c69961479b40ec5ad5fcda927181ecd202817b996cdf1928fef017bfc1547f9009bbc6d4c3704b86a6cf2629abc7943136fc9ce01f90fb74c2be18543c5e212a9f61b8e0fd3e5273e74bd4b31aeee0a3572dbfe5cb04a0571cacda18d94503429ccebc6bf142c5c8bc500dd7f68cda86"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (323, '{"ob": ["15151515f6eede6c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9614321d520b2f64487faee08b8aca76fa4e43660aebe538bb5d564ba73149e244562d361b0062478972e39824d540be8b2b75c54adcbb49bb63691f87d134fd7c48d08e23c1945f94e720123e3b695d4677e229b6b6d0d8fbab00586893873b06b282d66fc5941a52ba0fc426d16f32178cc4a14a0750c8c8f4ebb259efde06d7fa37227640c1e2d8eda448ace0c2bd1351f3ac8156308964182efd2302d1e105b9594f768b437926a2f725b12556efbcb9825a2b1c1f370e76454641373d3f4f92edf4550c7bac8ce6472a0442de4eec1f614292258e3e69fd12fab4bce43d60e75e7d366772e43d2fcfb725d10cea69c8cda7c7a9531908e3a2ca9ec2920927363ad7a4dac979e739247b143da67661582b491d7dde8743e56f36274ce04a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (324, '{"ob": ["15151515f6eede7e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0313e088ed39ac084ee372c449d6e58bdac052da8231c5745caa7405d3d6c511080f96086d8a1ca405396e6ebb0fd60a8de6df286f94665a2e3414da8db7ee7e94d9f1b347246951de57af02309124d1c14641e0a72d771a3ad4d5189a067ab5dde1290b6b45f28a4e656281bdec6ca6855aac83be82094693bde787d7f9c4233553e79a049870f2c5e84bb38106c036d191db947eab892e66535d40d8efbdf9a6635276408fbac5c918d81a28a371109384bbea7a35077b1d62e62a6bcac6b49bb9c7b1b700f64225e2f448f2e7ec7af5793bf1a20cdfa76724b4fae21eb8f6583a4cfc66db9d6b692b16a9eeff279b912afb45f5fc32831f17dc7270aace546f049a110d667ea9ca8786f3bb3a06517b199d276a3752222d8667362b72644b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (325, '{"ob": ["15151515f6eede76892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2d39b96bc4e3ea710d5148db2696f10e94bbe83ea154023cc04720624cd794c51252c6d30d240d74592945179903fb75581a0925514e7150524b023b193e817489104ea63e00077b24671efa4d863c02535a5ea429a929252c3d20145818d9f7e4b699eab4a3d9634f101e93601020251d9ee71252757312aa1ee826c08770f961e321461158e4909f9ec7cfb13160082af1d58bae39ffd00f7366abb98125a02ee028094c6db186a04c4fd28a5a64170fbc2789407d497bd58ecd4dbcd51e60a2bd08ff91f38619ce5733d4bfe9a9e973b378a81bd3ca4e2757119924f8d1db63218ce57fcf8d9eca63b4ea2226a070dd4f91b45d278c87992c1732bcce8fb6ffd35afab7a31dffd3e71c6af41a948e3c263c47e2929ea9359a5acb85a095bc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (326, '{"ob": ["15151515f6eede92892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c567b54bd7f6b00e2478bba36e8d32d25b2c1d32d9192396d8c18a2edd8eaa688451833133e4236475d6c7a15906fe80f7ccc7ccee7663263694b19a6c0ea8d17273b07cf2aec19f06b79ef1a50eda25f7f62294f4194ae9232415a2ef64c1e3320dd21be74cf35bb6864a4f2cdb07bbcc972c08991b0b1a2763b3759ebfb81a394fa2654f0c60e13558087873ce9d22dde91792e2143ad94b2f46ce617986b4063eb7b24d492fec40bb9d572cbc7a3d2f5f9b41f0a5ed8a1929d8cca826193309f574620a83d26de1c8ba9a542d212b6f22fc43064a7de91d540d0e1a3dc3facfb95bb9d25dbbc8e32b09e815b63eeb46d27806524d4925e6f4adc9929d3bd38a448ea8ae200b876f2bd5102dac7c989b6df853178b25b9c88a39c47bb88e610"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (327, '{"ob": ["15151515f6eede80892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1762acf2f3023d45cca56ac38062c282b8503f52241ea2ef14a8a62aca1bf670ad067ae12aadc9cc155263032ad31ad0191253572f9be12e191dd00e32e961e6986575a36b4989d4785e18a131ff14d8e188d7c8fafc089508101cde43db875c4ce00cf7050070531d0a3408423af4775a560fa081fb90cf48b04fbe475d0f1b1d123275d187e27942b10ba7323b4066ddfef4bd534a363989e05b1382d4c0a9ddab40c2f6b4970366c26fbb3fae5e4074942b8a4cc38975788f63e2d83b5ee5e5e4deca612207ba9e86688ef5614828c1413a7c090f853d8eec10e3de5ce34068765358f9d0dff46369c37d9cb38e45aaf4e0f4733ba8bcafa2b2dc4f8434b621216538774d5965843dbfb4f14fce994bb6dd9dac9ed825d90f0ba4f911a20e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (328, '{"ob": ["15151515f6eedeb8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce01ed6070c2b0f77a8e116a7d1e864e4b29bb46f09da86f50a9067faa6a7897254716fd477d7aa7491fe4e70f0e3c5cf9ea7eb729e359b757979f3efac19a4f09e0e3d7483e191b80a0434ba8ddb17375dd56d90fe743ab8c0673ac9fe97677ed52b61054129b39b6ba2dd9699042b0e59a2dc83d7599d5ef77b79d35cc984d12e2c0d1724e982d384e4775e5f5b1b1d95614c2a9802ea425b6af4aa1b8a6219895b4ed48b5f023a6d02ba8a396280561d003f04f4df6cac138902dfbd424db39103a6e0bc21a94f4c784f2144550756084320fbd1582702c9d412a35ef7e18b7f6b2685f2de0e46000b01eb7c71d28e5aece2ce327a0756959b61790cccd1f74b63db53da43ff785d15df942679635c9cc2e44c87e103d073b42b197ca1ce1a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (329, '{"ob": ["15151515f6eedeb7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd8f4cc5176f436b10e68bc91c7fc1bcdfe216c91f2f58242465086879ed78dfb5b9ae2f5e5c6e9898a3f0664a9f38c0c9f2a76366f9db51f5962dbbc2768ad0ffb6ac31a0154daf5af1bc80029c84126959e066afd2170abe0f2862defab10950430a274d080e279a4f79a1420fc74154b7aecc59f2adab05fed997a2d4f17bbb3396475b8745c152534d8dfc7caa351ca61c3587f173f0ee3e6761107ad8a1737a915485693ba8b39f69ee2dd6e95e32717a6259e3fb564ee59895c242e2cb5b26acb6bf9ef402aa7cb43f50e475272ffb1dd566c31498cd15480775d0be5d8a8bc093fe3dd4c0ede3be9d4bbc35aa2403fc8508a509a6a196ad83934cc876f9e6b921b7dadc1f0b03f88078a0fde55c887a89ef8bc4b7a8ace05c1c59ecba5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (330, '{"ob": ["15151515f6eedef8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6663abb4793c8585b40eb824ebc3862bcda047f6b193b3fa3f144c6f938adccfee5f5e8810e889413314bf029c7d475c71f4cc87a7a935c55903c19a302118fc9da96c0947a15cb01558710bc4d8b76b32a45a32754d254f81390374c6d839df61bdf994b64c65f5bea81e17fce47dfee62c9f09776d8e91692a811ac1734a584bde3b864e3c6e93efa9c867cfcaee9512ec5feadb32919c92ea194aa8911f3b96b6eec633988deb0ab35515be077c82c00e9bcdb1067e1f51b75776ab35a055d38080b082f9d35a8495546c7f923c322f0ecf4750888059eead02c85bfb393579e83a4b9792e1d32ba1aa878b7009acc9cbd2c5d1bc0b6e80c00f18fca61d0a2ef8d75d3677bcdefa45a1bf89c4bc883f0235e032694361355cc122766544bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (331, '{"ob": ["15151515f6eedef1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c433f5371ab0edbbfc34af222a07c344b503fa827beede824657cacbd8e5a5144005a277afab27dc843e135d41c8e94d016a2979992336c453f70a6e1855899e40a5eb8afc962f01979d89de45aaf61b24d3da7fc8912da87c764a3e56baa4884c0d8260484635cca151242248ebc084c22e4c2cb3cc084c3eb8d785f8f5ee8d7d44d519932d6e32845af9e68666d3b03f1c19aa5ac760d7c739be58e1b8c2735cc73e689561660bf2ac761d51f84827e10b94c2e87da1fef3c031754edff229a9255f7ea630d4e9925fb6559f750d9832fd0aca26db7f3c4f5c11a4661441ccc78ec0e199ea3efb252da67322ceb7ae9d36c33863fddc0e600584db9f13a30449cb5e6584cce2820c1045c7cce8f9b340727f0379985ac298309e78d5ee2e44c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (332, '{"ob": ["15151515f6eedec2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce32ff60b50e8afbb2a4d6f59c17a8c794eb37a168bb4083596d8fea9b38b5e5f471bc5fcf4302a9d2a1c1ebaa677a3d681cbc07eb619aca270f3313dd0310837903ed5d8ebb877877ca5c5374c4ee8103f5aac7ffd60ae4ebe18bf570fcbff26cc7372b60640d09f68987dd22ce83c733b4e9e95b34a0eab826469e94741b5bc0410df56df21a4fcbde96852fea1ddcf082bd9f5ef5af80026d9947f7130299da7bdc9d06af04df03c099eccbd1f83045391e72462df2764855d38be73b2ed87744b8ba6f3689eaa3ae07306987e7167db535e439515fbf55087ad125e32ed269c641c150044d3f26b6c7a5eb9be8b956ef9b5ffe9ab9664f84b7515da77e60e6b467422fc719a84dc8df0f5f4138ba5b08ceb1f29051249051f63a9156d390e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (333, '{"ob": ["15151515f6eede0e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cedf1c330c8bb6fa33af3b02fa39a6d0d5d9cc48958ba3226db9c6b781de976d34f7893a36ba089b2df807ee931be68ebd5d882a4897a30cf44805d9904c66b8011f21164153206f6a02e8604354153151ca2f09518a6d6ea777dda7780126f848037bc1cf72c68706476d7d801bcad2a4966d8eab0e2fdc2e2f449fcd245bdfd1e7cd4ac5ffe799090192d998b36078fd59bad343205a681d0d45bf880ca08ee48ea2262e1deb40ab71e8575a1b791f33de43c58e072f02f147fa3337a36c929769b3aa875efbfe6d032f15f1ff635daea75a8c7f1fcd1d39c75e20a08041ac96fdd73a459fcc7d1d03e7fa2796a5f8b79f68285734e99c718a4a2744f9811011ad62fafba4aeea99c9936a432d453f36d1af235abb54a745594aad0d147bbb3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (334, '{"ob": ["15151515f6eeded1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca6c335664dcacd7f0a1c9a92a8d77539dd70c78258e0782ff0cea78dea3cf243dbc8443a941d46f3d79bacd6a61a5c950779e08a611628323bfbc7e5abece3a5b41562217cf784f933013d15d66c2cbc00e370d078c12d7afc772432ad17937341dba08275a1b5fd330a1f39e6a8fd11e9de76481297431be3f376bd7cad67b69345e91c5f9bf626d6d37f05c982f7152103daa606f27b3f0c3bbe28f09ca4226241a84bc716a1baf935dbccaf19914f982be964c23eed9382891d501874bf6fa6604531f21ae2f1f4357051f08d02f5e488ee01bde7344ab5a6b902e01d279cb63945b8b0ca7333ecc160d69cc6d4e40cb16493d7b3e048494844ce861e256ba89eeccdf4ddc04240efd2c8f665d0dd5f4702901916b9c0ebaf88f8adfb40df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (335, '{"ob": ["15151515f6eedeea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb4f2211c3e24859ab4a3f02195ca3c10137b20f1ca13c1cd2a99d52d04cd433c8d3255c78d61f464627057ef48f1cc34d3325c81995de310a4266a0f315d6f45292ff18eff3e92d05bf95d8ccead800abdd2ee0da78045d5628d43985c494669390b963e8d82a3eecc831b2196e2304ff14cf03b9bc64d35b05a2494b11bf1ec7534cf3409c41f4d9ddd8bf3a5221267d759af09ae7f8c8b7a3f55df13bdc34326e234a4fde93986e689f65cecadd478497bec0ff34fb23f9af9b79c344bd64605f9ecb42118f92d62acddd36a3b3d8997a72845668623a2e8a6a5e2f3ff88509c295779d03b4909826a158fe6a03a4603b634d135ecdc28be54934df543f9dc6bc68ff0698dd000a8f61fd1d73c066579c8625d4a47e7641499a833938c736a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (336, '{"ob": ["15151515f6eede5b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c06e08ff76a48eb81c3d61725f54e6b7b23255fe3e875947335d647f21f6bcc01944ad8368586a4ec9f1805270f12999d8e5cbf2273e327810d3cc5860d6931b2863663cae0d08ba53814830239cec0209aa6c19b78bb512f61f19fc44ff980fceb0c9c1134bb2c43829a8730ed14bca707001b804e7dcda3f020a806070c7978afa2c4e06097bcebc7c3691062a9db7d5568c9a50d7e97ae077614c61995e72d43344fde6e91b444085bdc51685a2c6776fd5d24b9e2aed30870f2f770d77364dc843e469dc2926d5140899167bc87adc98d1e8a3415aff509ddd8518b448534e3cecabe959c90482fedd6d8cc74bb24c9321b631067582bb844a8f1ad70a75d85afb293b7bbfa272c552d6e0455916f2a8ea1b4408db1449c8a62d22c00ed7f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (337, '{"ob": ["15151515f6eede0b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce5273f56ba99cffd06f38ae1a9849560006695561637c025c771eafc927242cd5db9db29d42075e31b40a20f9bd64db99332da8b3d704710e470efd8defca3cc90509e18e6ae7ad3d143f8cf979dd9c1d6f86e1b65fafa3a86d869ef91f3c23acae39d74053486a407fd12401580d65ae2ef10e81af4ad5f9f77ed415cd51f8f52e1f5e51d2b0afbed234c63586cc384361a0e37a68c781695da2023e6059e8e1c450f6e898275b9602d52cf01c853cbff06c0aa7151d5f719e81514ce600b27b4ec88c92c152ebac0e8f7aabd34c4b7508e30644b107b38d602d4b278e8a16d5349ffe1be312fd705aff74a248c51d0c1fff88d8556d03bd44d48394629a9299108ae20dbbb8788e5b7200c8ad6a5a92b5579c6a9a8013c8ccba64b7ade0684"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (338, '{"ob": ["15151515f6eede55892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5303d5332d44e124913517df31ea80eeb2ac5e6c6585b10788e246d2eb19170d2b7ca6bc072c8171b55e0c71b8fc0f429b8addbe465175a8792d0e8ed2dde50869ecb73dcca62b2603f9b87f7785e5056d83cbaa2594715c3ac7b5377b3754708db34f9c5508516d516c008315447ee8a28a3ebafe857f6fb62cca6dcc0ec7040929b02be118179bd10eca0828005eeb5cd8fc2ec5a7ff60dfebeaf3dd3d68ad02828603b853924cb51376a29e9136c453e9070d325309e053aac824c3c0da7e2150e3144178b04de4fb010926344f629e78c21d2f46c32ca66aaaea9b4b1eb8605c596f5b099eb82f13e9fc5ccacc8431ea80ff503c812b286647e265fff1b8fdf6542ebf46cf32071d0436e7876fb393d67a05d0cfcd467b9883a2055fc764"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (339, '{"ob": ["15151515f6eede6d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8668b500e7e2eb557f9d30bd3ae4cccd7f082b28606f34d80b188b6c0d12f6a34d0b83c97e635e45d6eff8494a5f8034648dc7b86121658cfe7b4b16727b1cf5841012e842fba86cc1760d04f4e52fabb8833fdece16444a2fa1001ff42db55683da6f15c8fe365539cab88b7b8d737defdf92387493416941c3b9b26a1aca4c1f619092cbae7ebc6ad11450c190651b35322be9b40d0f1b461f529538fa3efb3409e0b73d847a55e830f9e1a85b546099e861fe040f5774c038933dc03c0da532df80840a5f55f516086f7935befba809194fd45dfa8a696ff56e1ca52063cd926b65c7db88fb0447a3fd0acdf8483667b2adbc28680b5667c345c9a750e6eeebe5d3513bd5d532283f346658aadec2f634e8faf0b26f0396c05e3920ef8e37"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (340, '{"ob": ["15151515f6eede7c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5c2d779f1493d191f3428c0f45eec6268cf2749d27f5023bb2f7a9cb9a1853e43df2b14de6bd0a7280574981fd8c1830879607fc9da0e612896358b4deae5e55eae4f6b95f3a5ed3d920b9a60dcc29d933066c1c9332bb39833050557f7e0a350196aeb4b19a930dc89ad0c553561bf6289d8da7c46f725d37ebae9f6652373cf9d68deccbbf5b2449965d4270c0632e18df6333ceaa54a3796fd519726becf36f2352e87409d64cd78a7ad65c302e165439a5eb08f387c6fb1f50d40aef279c2806c5a3b347cec92b37e7a7513b2ae53e292cefa0c27217c85191dc805b0da171abc5c4ace90d36e1baa5499a36236bf074eeb64ac4f799cefe25d3ed93cba25e9034e9a1fb6ec1fb920a3da888faf77febd94ca9e88689cacbb9269c8bfd94"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (341, '{"ob": ["15151515f6eede1f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4eaa1a635fdca92ab9c3ed7faecf56ff0b0a927441172a5244c1417d380e28ba4ab4120dd4459309bd4011dd9f920393535c1ab6ac4d4b1c904a73692a893cf09204bf384a89e9a03c805f7e7fdaf096ecae3648b7a48d07dc58bd8c1de61f7233ac170495920bb2a13f696cd28896daa3d6718e171af42be3a003fce9f77eb6718ffc2697905a1c24af1b910c4163724adfa0f44e75028f87d9cfd9e36987abc5b4d4dad59c1e33bb939a5ee541ba65f4fcf1254d9f0f818bd43b36804e39cc2b6cc201ae68c7c5cd1a9a181fd67dabb485daa25280df17631f91245ec2d71dcfa6f5274356bc451a1a08622da2e2be29cece54fa856b5553c1a3ca57721edb38c7dc76b11fb70fba95bd8b74707142e66a5948506982f17f7a2f05f87dd1ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (342, '{"ob": ["15151515f6eede30892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbbb936fe8dfceb64b2b84a5b8a1c5268b49b590bb61a4f25617e8eede7582ae2c6a0a946594e855c358d8baf17e26f47b806ab4d177b3f607f2f420889cbad2034ab1c9a7143eb8d44d745c53eb412cf0d7fc20f6f7dab9f331383e7079ccc2442c5b0eaf39e7c59a34ee5bb562f549c4b664e66f272dc167a00e59844e0310dbe9020859a206c96896ff8a7d4d19164c5e0d11c96e1473d793dc54de277c15059c53ac0c283fe183eeed21d00a4dfb999f460637116e24656804b52a9cdeda976c4266012e4bf3cd3b5c038fed6060ecde57b2c17093dd16c0a686ca57038ec0c801bd7e3670833ffa6c7bd5a7d99ff36682ac0513a4d4cc331865cf0290d17b213d0f120fea5872d0add76d190ec9ec9de5169e02db183e283cac3f12a6a91"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (343, '{"ob": ["15151515f6eedef6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2faeddd5dd0628b60baa2a5db57e5aa4f87c4c5169ff0daf1a4dd1165fca003d313c0ef0b78fa7d735f79c4b3d8deae4392ae7bf09ca600f3e1813829e4fccd12b179d7be60b9cd9a4b2c58c2f4464c260d43c7a078bd9eb3e36ceb3636bfd2ac8f4f99f2d382039f23d0ed992f538fcf42a65c2f2030b8ed16544b8e6eab337fb3236496add45742997d8d73c4bdbf74ebc950eb6f241fdf50cdd3b3d394d24391c3b9a5f7b12264af70e40b82b72a7cbe4a89cf337a73e25933400ea7496a0bf0b388249d7701b919977e9378a0a46f7aeea78f88cbc32da105eabc62367d5135aa2c053956f3a006b19bc0f98f08d41a7995ee61ab37dd2e598ba525b93c454f1176c1ac53d26453c9b1e207ce4b76777750feee925a0d76304446587e5ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (344, '{"ob": ["15151515f6eedede892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c710b3246d830cd0e741b864d11975b1951f82e39044b4a91b0548b00eae3e71c57bc962c66c9c50ab3bab90dde24fb03d5a656860cfc1d91a109b4e2a860192e167c492ab1af07f947b233757b1df70f952e13b918caa0b8c50f0ede7cf9045489162d6a7ec3f888f89b574ff063ca07eb89b633d8692fe97ee9217c6c99628051778e2275388e083c5393d4fa45a1ebe59780ecbdd860a207b425a730ee01fff9a92fb84462cdd095bc173bcc57753296fce1dd570845ef7a6c04235d9dbff6400610c89e218aac06ea3e869b699ebcd5720050222408f936ad9ef6bc99d304ab330ee7504b08c3893d5b3db1ff7753002d6cf9ff94dfc935077389fd737500cc2588877c4b1a0a11a109670581e2bcc1cc6291d34492eacdae73c24ac7e571"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (345, '{"ob": ["15151515f6eede0a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3326b7dac23adfc49909d851872844ece8c98ba17d24548b27d04880c7d0da236325e14a5b0af98dff2bc38778b59f5bc661f0ef139f48286cb6f7b0acda4b23f27e00b2e202c59d62e71d7ed2bf712a34239b2301b2a99db5e22c7afb1d032534a5aaadcccecbf7bdcba14cbf76ebd03b24f9a48f0efdec5b23eee414670e3c6cc4b0903a1b7b72a682daa5d7a21ad60409270479644eb7ad92ab02c2765d14819df064b28ae7a929e9c5dc0ac3b09234f7c199eecc41fbadcc74da0e17d0d4a801901f444cd04237c3788ef7383af779afac4c99f01c8c2143eb26627a997e642efa000b0a3df3452481562cf36e9850c1b6fe30d2360b30ae07bfd06b9f516d9963d423e8c1bd1a64a109462ac866771508b9af80f3287ec1f67ac021ee3e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (346, '{"ob": ["15151515f6eede27892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7970a738cc80ec31b32f9d35c9efd4c4004b24b95e859dc9caa7625cbafee92276e2fb426300da3e7d0e5f2b6fe33b0139eb3c5567e2ef0f3719e0ae0117980bfae3da3588394b87c35273c0f5f0935f722f85ae51d80a16e76a88acb8cca458ad2536e7080cbf7932b0f6fbef984c28812eefb90bb2dafd424308d1c932e65ac77d3a94dad23029879b4bcdc9be59eafce9cee332a1a5bdd47249cbd9b6dc74769e6697a2c114a5546a8fd18207b35e51580a84c3b4a90da498b3bde78e28a3a356331f04b1d98ea5b867b8ee20bfc400a94ec916c75b22e9755fe37d682a24037fea6c048d1ad1c7b3fac39f8954f46e21c1dcf3122a740d6ef26470cfb25c5a1c6ab11335f2f6a3b2bb3a92475153b656f7417074a7effbcac3232e9c752d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (347, '{"ob": ["15151515f6eede04892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c76bacc223df118fc6dcdae2c9cdeeea42e2afade0cf0779336fa83309ae8d651af9e476695e271fec627fe57b2bb666aac1cce6e04103937c76045d72d7a6148f3d994500cc65470eb33f5944f9510d80d37cea003034a6c880b4eaa09d2ba569b4a746cecfb73fc4404f9fa78acd6446e6b8f46a7fa56c8d789d829c567be4c98674f264b263503cf9025698cc6405600d60469033e05d6ba9fa884511bbfc2a0776d091b4b46e17c12bf431213a2abe07e60e62c5d909a4dd9702666c082aab76119ebd89e14cab8e302e5fb0268fb51324460d6f376a688826a616749e1d8e33521f46c983da22ddaf1bd0e90076fdd71dfb8f8908b8b2566ac025243fd597c9dac93b847fe33ee79730a3fa4204d35ed5ad3b12c373f5bd0f39ad1db0ad8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (348, '{"ob": ["15151515f6eede6b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc7ecb907fd79611ad15bbb30db58a58499f8e400cd148d666752f0920c02fed46c594d0077ee9230fb1ccc6bf3fa1be02bf885869aedce28535ea95a58f34ad2b6901444be7f0974fbbf76951619a822e3eb43174bc20fc9cd3ee9df3f5c5b89d7f5062bbd5c847b4aa313cc81988931254d783f3da5feb49d0d2c898f5a2a38ea394d1e0ad15d391824a10699597e108115967875d4c72c4068e418059c1dedafc932c4d99ec2d97b427a4b6a5e892eb855757f64ae24fdb0ca22a1eacef071b133175f0d94885cc45469b4f6ba4f8915e90ba50419b6e3072479e4294f8a7c7c4991e768154d7cab0244a11999e084bb9a3ce0a22aeb388e7e0405a87c2abb50d0094bfc328ea19cd8621f23df19e3f77b3fcddc70c24b4062d86ed7ac150c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (349, '{"ob": ["15151515f6eede5e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc453299651df86fd5a2265b73e08c5f0d3f63d5327ae9d09ddc0d3983167c61abe2ad4263e6adf3904e16503c111b668ec1f41c86156169ba0dcbfe169fd6ee3f51a5d8de9e5d807445487872a665dcffcc5274d6cd9e1b493579f3e08846ab7257e85207c31f56ad7f748b387c8a77d83f13095f25c532cde6caf4d769828c978e6b5b3a37a65841589ef2b52e2b4828d21b411f44bf946426d7567d886ee0dd0f0191f72e5eb39b40983d84c822af1b3085f06294f8b297430837ade3d59e67f97ba2c26b12a0490d8c143cdb80a6508409a10e1e47bc98b0e4ed6a6f8db8286fa1908b90efc1bef9d0211e5ddf170aa5426994f95ba1dc373981b3b6586aa5c9c68b5c5cadf77daa2b59b1e50dbc03a9234a98f897bfab40759257d4ea3b4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (350, '{"ob": ["15151515f6eeded3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbcc2825d046c8f46eb1c519f901a52ac0de36825bc5364d2afd464d17ecb8cd13bbcc1348bcb166d0f1464038fc0e849b2f9788e426979adaf4c845de2be150518648780bb337d1e6aa1e59deaddce620562fdcaec3ff21a39b9b918c49d038e93fbdb594e117f07a8451d026c1953c268277776b758b82d8feab8c475f2a187d4466500909a96dfcc2df73e67208ee873b9fc73a677a6c97e6ec483be94097d79534f295207056eee717bd04655228dff5351c459722536ba88b850c0bcda2666e2a5af6629ef166829b2e8271534c1ef2f157f9970d0ec5f96ac7a0629683cf01aee518c283c65909fd09f76e5a43f05ce6acff9f97f3dc8b6244bfef93cb38047daf0b705d7a119c87bfa8334ea59cb8810cb494d514ea1c58a9f268ad08f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (351, '{"ob": ["15151515f6eede4b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc15d96aaa355766802a5e2d7f651e208133cbe276476aca5b890b70ebf7dec31d12a10bc8b0b3664dc6587ab21a755287d932eebf2f3b090babe3cd9fd15c046a8ab6911ecc045d347bbe19c39d2b226a063a2d62a2bdb08ef3d1d607c74218d0ef98ee23b510000dcde75f6d5a4a6ee5f20127282aa1226e83be0d0343e25a4ad64548c898d85e25f7d7cba9f725d1faad73458412bcc5918fce97fe0ad6d5d1c3da1da813d0157fe7018cfc81b85ac498d8f070f19a4f5fc73d73d0e3a7229b7e72e6b88e94d6f3822979367c6fa38c826732d0a552db21e1018313c901f5e18518f0f9b42f0a852de3733280d442bb0f55a580b4725b4d1690a83be872c3368f963afbae0f3a824edca0f25780de3f71c40c5b64ba06297c51609b324502a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (352, '{"ob": ["15151515f6eede23892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cdc821be1dd61237cc38d90ec7e76da315cc4029e167bd6d573c7cacd28a2dfc776367a75db769ed5de5b1e1788f0861e693629a3a31027d04cd6c788841ce5e447c2f5257fa5fa9a43f3dc287d0b1e03b2e935cb70ad1c3463e4d6ebe47f7a46a627fd54a8089ee9e544fcaf267067b15007fcbd61803d62e71c253fed33796e9c969953f43f8167862c9c7d9bf656ef7ca6cd7e347c84052f1208c6b50a5f4275076d2006fa5c9164449f8c624c93a05c9f07e23ee3e74d65b8e9ee1f5ff2ce7092633a220a8b8d98eec6e8f8fa7b7d72801b60b0c2a2b961f52ce3f72ac37066f5f78b1d69b4fe4c9cb2acfae71838db19ae86ff38792382a617f6fff71e7b2a23bc039203f75437de193a3dbf9a2fdc1e3e68830e6b3ede5af2527be80867"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (353, '{"ob": ["15151515f6eede43892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8458c527e72bb22818aa55f1f9329c2a76d64f03bede90c0849a5902dc579aac29472c14a99e6d166bdb48633d729834c043a53fa0b46d17e73a02ee383d9a14a28cc8f29aca5fc22ab32ca89dd5d4f75d1d84a45d1d16493fdee7720ee58c9c9af0f0403df99c33cb3daedf6d9dc673231b1a2330f2653df1542a5d9c5a6744bdb84dfbca7cdb298ed460c18fc01002d464638dd2d2e9f65d3a1f1f1e93c5ce6eb7d83d46fd6668bb93def5c52d5990630a734b9894b2ab66bfd04d4f614b6bfcdf7aca96c3f6caff66c63f7124fbfb9fa608477dc56b975952a3b10faed095c9ae8609c2bb7db01f39f4624dcee18e93965e2c28d04d8ab8753c4800ba6ec71915ed206af2dc5760086cb932b95315ab7817c408c7785c12390ef4719dd98a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (354, '{"ob": ["15151515f6eede71892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c59a49dbf50cab51eadeadd9c69197d682febc3745c11dfd7236a28a067421dc8dac413537e224015cdcd3ca17eeb973d8225c91ba0240706615e3366e0901984af1145060ad5cf0d9072874291cba2c789efca828a6dbb86c77309c6bb245368d53a819fcfbe0cdc9ef152f54cd5dc451eeef7efad7b5fbefd4ce6123818c6f31207a6068c922a606969b17bfdbaacd000fba48d393e48f768bc5e6d97bccfbe61fc304ccc36d4562d662d091ad831217f2f3fd28d73d6b6cd5b023e1e914cb8d6d1095fa05f646ffa4453ef5c5215bc6fa3ac5412832c6ce2405fb853d64ad2e8a08363d1d0d4a85b89f3ccc88c3f77d4080f04890cb8d2e3b84a2f216dd89caf3d9649ef6c818b8540e9766a95215dd40a017c4d4c2e020414b71217d0b820"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (355, '{"ob": ["15151515f6eede75892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8ff6599e41a39853ff8609e4a761705edc6067401610904a2b07324e33956a9471e534ad722846a5c4de7d76fce4fc9ef5d05e284bc41f05be94e8a44105cde89ae18f7e0c0cec9e50a54434b8b0ed54052920d0759d42ecefe4002b2862708870c00f572134d48ea21f0dac31213ecccb800ae6d7678d3f1ae7e1fdf17d81e76f620d2be76c42e9bc9a1c7e73c70933539f8843b44db6c0118421f5bf32c9730b3fae811fedb99c9371a3c566054916f8ba906230e1d4771b23115e516277129a27b1713fd100ace7781a5602db2622dd023e8084a246b1bf20c65a14f8adf64ca7025d38bc30e32fc42a065d240279273144229aa398a9e3f5075f4d740f465aa18d2842c29a53e16f9ef74ce4b036107cff87de5de2db0e1a89930abc670a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (356, '{"ob": ["15151515f6eedec5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca6766f4b1cb45f958d9216a872169a790d34b25e5a32f773f44c7ef4b75030e90ca9910b90421290f0418e53f6e08a116dbe73b73809820e69dac917d8be22415a2f18310170f207e4305f1809a9a29cab01986fcef20878cc1119c6a053a0ccf3b0a06e43fe133dbc70b87d0cab3ac4aceb7d43394df4d7c58e1ecd1ad3c202ab29e6ffd2d49b5fd45cf154d2b7408b6e237e49f418dcb1bc2e2aefdbe0120c8af12aed65ffdfab38dbebcf88806673042e57d59ac731ec3af188fc14461f48e3bd0bba6f78f618d4f4f407a2c66ebf23b3221638f7c8777107508ffc9ff29367752a9fc6d5579fa6da2a276f52907a5360a590161dda872636bc9bf44c0ca24dfae11bb36004dafae9b3d538a0df5e38ba3539d5fe06cf8d08b1f7caecedf2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (357, '{"ob": ["15151515f6eede8f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7ee65e3f234a46a0a060212de73ee5d51b590c39582774db9f6526337045aa5cc2ef1f3712c903677fe6f5ceb8619297c76b274c898c50ee8c7f970712368dfa31f08fca64959924aa42c09745604e8d077412d813c9dcb030fa1da1f2568abfa20934700cc7bbeed8dc052c23c9269daeb791c7da5a46efafe18091ffd8933259b6bc8ebaae78d3604d03db71a68af3c82530708aa09b69c1adee02c61793022c24e4d6aaba42a17452b4384cf16fef05014a8f8d9f4234830f4690e164374c80f8d40b91d8757e2eadffb7bee22f5aa7fd3a3b39e424bdbc40e4c7eb33f26ceecaffc9ff7acd54f99c93c9e85c78c33cf606f19d3e78b3e7f05dd60891d493b3a09ea8e786e48af596251dbaaf684321458cd836efa785e450fdbd22c9b052"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (358, '{"ob": ["15151515f6eede86892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd0337d766d49af863c7f606363abd8805bfaba5bbd3ebec81c719a017236625f292388c14c6b57471ab666f28fb714f1cb097d137bf3fbee9c9164974e8cf49e174288661520da4e5ac872b3bb982dc51c93b9fbe61b4295261b528d4048c8bac3d7159c6bb9828a659aaf8d581b8db58cd60658aacda4b65d1abf7d74221739df043a7cb626e16ccf1d036f6d5562b38d15c2b52d5c3616d442efa9a66813e35bd85ca2bf6f84e4ff6173c9ae1f5d0895d378eeb121dede43fcc3814a4fd03ae5656477829ea26bde802acfc196702a2442c7c047fb40a6dd405df8d6b244a8577e253cbdd2de7db7e0f3335d3aeb5a694f71b404d1e0506b3374e05b81b868ec211728528362d9f0a5c7766a8192aaa605e828424ba32b085fe04549b25a39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (359, '{"ob": ["15151515f6eede63892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8cef11c15be5390a901c4727c20bd06b136bd87589ff7f4ea960c67dd01f88eb415bc552f83bb99fe37135dbc6725bf5272e3b63a10cc39020665d03273e68e5db6bf488ab35cc73dc6cebcf32f79f5be686a02a65ab4102d0be504b10e2f3af524b1c28904dbf73f7f5e273ef400c20135c7e2b714188d8949cacf03c4ed74820370bfb9ae8ba4e3c7fcf866f6335efc37fca1eee0d1d7704e820f8dc6b7d8bde481d02e69bf4aa00516d93251c0aff829c5a9c0ea025b6a091ebe8acc1e9731c8a723825489992bf6c383fff1ab2dd81bb113b5fc8f77b6a9cf4693df43cd2e7d0b0ef4e164a230a5b46fc1db4740201e55929a74091d6f8a4b19d99b402711eaa17c9ef675d64e7d7aba5270997dea55b875f862208d78503f4e70c965245"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (360, '{"ob": ["15151515f6eede61892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c056a16bd9d859e60bb10b68a298077749c7b87365ce0247ad096f86048bea82835ddaa13b9e4fd7cfdde74f0aaeebfacb05bc5c934faf31a034ca4ec5c235512f33d2f4a456178d4a3f6e0187749fd158526345987ac9273dcac782c6be40f4aed357cabcc23645f0ba54b4d372c26ac7bd57808fdf08c66cf025f34cf6fc086dae1f1009f7480fa6d70431166bb59c2e6eb0ae3715c689ca235a1e851ae1d09407c3a2f2a74902f586487c24b9d0f95ccffb370c623da15796b8e31a21039f3148b498da62c03dc650659e4783a59423b43090e4b783e7b9bd7b8ada4367fcd6fd76199793f5e0f3814c261b3fab2bd1363f5efe9bd1ab52b7a845f8e72b387cd4c20a1de8c1e5f184c1af6a991351d8cbf4de223b5faf4b55cffb0f36b72fe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (361, '{"ob": ["15151515f6eeded0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c49f270e1fb030d8ee5e47e6bffa9e394f1154cac26086e722b8abf9f7dad575eaafeb93a33613cd94d42dc7a1cb26a13b241edaf937ab248a9c90ac68a79cf90566403a350a2ec832c89de33d514cf054eaf99437d7cbba9cc3ca06f050de312a13c554451611fd39d5a646afc34b82097c017ce37e3981dad4718fccf68f5a47b7e4d103d6471ac85f136df073204b87da2e2ac9abb41506b1c8e7510597343879a126dfddb1991f67d116a364fb13b869be8238f8f8863a2ff71cf7c5c437b375d3b54edef6d3377347001af776a3c4cfcbd413b0c3ab1d13f660e10d3710074f4e5c215ed52d9a9c0b99f0d42e1b44596d7232988183213071979f404d2c75cedca3c27a2fd2a3133d5c08d04ddf8c5eb664699f5032781f3082e2eb90355"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (362, '{"ob": ["15151515f6eedee6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc8b04d6a3470cfde0de1ed2f339f3c17198d07866eed89ae3e3fe62e0d9e732d57642c75e36200bdc405598f9112c39259e10e8c95cae37a6932cf607fb2c21afe80c42b9bdd3c7e3d663bc383375c6b671dfb8ef60d7f8a5a02203f1af41c3ee8031d15045533e2ef8417a4fb2e3824eaac9c400ee42ad44b49ecc99614610fb6e16a73e6bb6517e5762d3bf391ad6d72cb26e12bdc73b3c466d88a66e2617535336bab2515c271f8a17fc14aa6aa6fbf442ab594164feb325447822dd5cd098a970708b7011eee785b8019c7a5e797505c6ee22a8131c5539375ec81b3f4025f475f20a408d0135d808fe23d172889cc9c64cf8486a87f245ced7356ab32f40956db6933726b52bfca9e8f9cbcf52d52242aa5e87084f9af8b8ba2337e63d2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (363, '{"ob": ["15151515f6eede88892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c18abfa77b4245cea00ec18bff266fc21fedbd64f8d273576a9bd28af9c9ee5ab220d22d0454757095945774024e7f2f9d71155d501c7e313381c49d5f3215ae9056f27bdb8c4e3373b113d1309a1b2f6f043dac3b00f4356ca1e98117075d603dc3f22ec7e0609464f0583d07a1a80ecaeefb3e6e1864775a8e11ffdecdfacff005207e8397ed6e9c054260d7e488d41ba95a84db351be971ea9ee07ec5200072c5e946b42e314055b93d55d1bcfacf4c1a21f7c69e42aee8e6b85700c5b8a035e156a1d9f818dae474e3628e3e660dbe4ae2c01134a74c8c4df6b5f66a443d06f9d6e6a6a2da64cd372619f2f9f1916023430693f883056feaaafdd149b5253c31acd59b5fa14a1856afa57568679e430c5aa18374d8375933fb5880b87fd0c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (364, '{"ob": ["15151515f6eede83892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb2901c153da6ed64bbe901273bbfd2e20816dcdaedf2dcba7ba1bbc9111bdb077e30d622364f5293d57cdd0f956d8836d2a8dc90c00d0a0283527db7d041b429ca75153f4d438f1e4115514d99d1577acf18b3610426f3fdd180474d37083a97392c40958aa174d2e3371398f52d232780d610abd198776e9b52575edce5d1d0072c353afa5268e346d7e821f3eda98da788535f9a6911b23d39c88506407ce7316a48039d90316fe53258dc5b8feb767def1986e3f87341c361a83f6f04eb1cc5ad69eef6884a26d88b8a4f53bf85846736fe7c1af9955dbc40fde955f83a19ce33cbd54e9243ef292018a7b94ad0a389bb1b9b1b176def0011dc9ede477d64782a10333bc73a1c5e3005bc290d0fd589fd32b14a4a428a61d5bc152378da47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (365, '{"ob": ["15151515f6eedebd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca986972746f9a031710270e60e135283a8cf67b66a6cba843a382bc2f39fa0d846145d808db93e2bf69419c6d036c9e95e6d9c73ac4de20e85071815113a9144b503679de3da4447bdd9d11013bd3b07cdb2a3cfdcc59e90a9f74aa525c2cff7d847768346117eb91b33b61507af7b0b13b69efb0537ff36afbb5584518fb6780bb81ae650dbf5dd15a110657542c2d1dac188a8b34213b29295bdb2961092b3e20dfcf52db9c4670b7dda9208c6992e09ecf9a81008a30502df36fbd845d5e8349a9901d6f0b6c570c1b5b3859441ab81522114940a8f021abc8bc9d79d8cf65827dd51e1c732aa931768c7f5c4dcced1dc15e553a1cd3a9695f79572d65580d4460fc48d156ff23d77756e178bd316155cb4d85355a98c724d68babdaef61b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (366, '{"ob": ["15151515f6eede64892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cefe87a1ad012983b13e3abff424804ee2f5d0c8afb4613d769af190210f0d40c65844debdebcf061c6328d1f50aa0bd93d526bb4b79073687873353422391a9f25d5970cd3355b7c280a68d0f8f4afe973eda7f5389c9b22cc1f49f2f76cad691a8a2878bba5889ebeb3dba575f39ee8763fd5171b48cb440fc534936c4728162b97c83605e435f4c7648075ac18cb3a8b91413af86bc3c5ede5dc3bf20c68f694bab8253346d2c40a25d467046de6c3b22d74dc41c40a3331d47ab8d660512eb960e62e1788220da1f3085c5717bd7724bd775acea341f44d87e844c6251ddff3d8545a351df30167e68fec2b72ca867d742ec65b2c17a501da5f34c96088c726b1bd8506c3a5d4214c76c8bb9a6c988c36f3257f87cd704eaed5475ac1b3e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (367, '{"ob": ["15151515f6eede91892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c844a938baebc009b4efc4e86609a9f804cc0391b25e6010f70a23cbbbaa7d81b125a83cfc28a0cb7df956b2261ff176aaaa06a057151f8bd0e3a7546829f4f24156affb8e32d0ab2a9a86674ed9c4807ec4658d49a6f79897d9e58b8d3c0a28908c6cd433eba38181fe3a356bef5e6f3ec4442ce16c276bfdfe10f007b775db29724ee6f6ce973ff5fe41d659d092da200b854aabd23e634fa8aeebea37bed0be9d64c9249d68d4d4f06c4431a9549055735b13b024776403e0164117664990299309cf305af564b182850a62cde2e1e6ad46bb11b0cfdfeec2bb5d36f6957751003ee34ad0f17c8daa5f99d60242ba114ebd9980dea941f8b83d45dca6eb6371201200f1ec19081372a5be39e88f98b2e04c040647030e684e8ec02d7dcf4c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (368, '{"ob": ["15151515f6eede3e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbd2c70fc5bd4fa595d7bf3c5f199943f78b35ab1a6035ed4f71c01c2d08011ea0a02ed246cbeb00728f95c399a86916f7ed0a14a86ff4ff5175d377f46f017a1ac9a3d0a95cb7159c07066ff037febf9df336c417cf0a6b491684baac7472f224f588ee7df6a9244a2ee20c87c40b2579524eb0da3ebf002fdbca88288b4d2c4f4f2ae359467bca0443c57165c2e85e63325d2ecc16bf47b70ff3a0a41ce060f9664b7c1399f96568a5c63fded619cc57d0f3ff747dbfe6d30b72d90f2055ff91740a6031be25095e1b7bcb4e36788dcafbf1891b774e0ec8999676c0da55f1b4dce47b122be88687f4b23e8ecbde566ff190028d5e41f0a2e77edaa5eb4f5fbde8e143baa49ec4a8c37813fa38c10b37569aa0c8403caedc2701403bf3b4f20"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (369, '{"ob": ["15151515f6eede29892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9922496a604e283bef9b9633fb74d5d19d19d139a6f5eb7041b7600c4e52af61982f49c008795bdd2a4ce9d36a79653c9380579e81d7589d841b41fdeb3add32157faddb82ba3b20f299e8294a3bb027bef7f06954b783f1bee83dec975de04359501b7029f62d85e75da2bb031ec4cea7ddff40aa739bb1266e7196054a4909c1812df84bc17ed21858be88401a105faff6b2653622199021bec3c64bfcc0f3a6342a18aa919cc4f6e0606ec85cd76be716537f5cb2aab5be5ff81f40c1fa09a686b1d294f6dcb1397ff7310131c466b5a858a82ea4bc111527f8ea6375495ec1c607a6ddadc7f7ce4185c6b8b63af301e795d3709c1336a8953b3b787e7207733b018dd4d93ccafa491a63062f869b63f83c1617bc631f4ad810f11db2877a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (370, '{"ob": ["15151515f6eedeac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4706e0c2884bfafb8220964ed011567622cc941c69c4586f32c24d5a26d2207e06b6ddc99d88c931f41b3302c5093625f7042a302e3af5e21bbc417d84d6d297116c5bc3a0001e1402e43d0e3e470c22f1b04ecbd18881edf38e449fdac8a4a7979956710791b477839636eb6fed7a63a68140bb05cbc94ec40d1f687b988a54bc2f8fac8776d166485a3b0a7f89374d279e1a4bf960d86e91e424c93270fb77fc064bcedca4805d3a823d1d624c04ea5bb087b2af1aad66e35bff543a7974caadbbfbdb9b5f69a792abe1b35fdbd81827495f47958dcd5be8bbfbe71aead157f931f2e5e4fde5c3cf87b09099ab6e8314fa61c5330b784c160535fcbe69f743c994cc3fa09aed770c415d27e428f3838ff1bbaba4b8207c0b435d998b950ebb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (371, '{"ob": ["15151515f6eede8e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c517e35b9b4a272f20d0b7dd8d809d41828b994e5b14c3f6fc6cc3205220c187df380a5b97febac3ce6dad6192f66df28d94da84b51ad9c59f3faae51f142b445c7c8e6e50f82cb452d75f8304fb8a58b41f59665f956cef5b312808ac1adaa4e32757b9757532abbd645a1b6795ff2a209a285b2a2771b3e4590a806926938a100507a182b31ae62bc492739c9d6964a1a418a4f258ab99743223e7758c10583292fe3d0dd2659d99a10ef54309c7818bb1d3f9cff4d4411456c70dca2d3667570c8989ab6a9c45c2bce1c162b7c32d34c64f21644acd57fe834a6864c2e95808241e31b969c98db60265bc40610bc8d509609b1c3d6d5c6963aefd5c8c8245fefde559fc04b5f032fa97bcf085b2013de04d0036eac3d90e547ef95978c9f24"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (372, '{"ob": ["15151515f6eede4d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc170921ad70ae87916170f835d8a87b1c8cd3fbac097cdcbe6ffb47b0f5b4fa3f4ccb243419b3c4be97de4d61635e678f849c9d90e6c86bd5a456f3dc0fc48a849a266f5c93a91926a2fb3c6d2670b8ced2d3222c1da24ed5a80915097211f8124d0b536dc04da110b8cadfebe18d50ed688548722cd45668715bc97260bd66e2a0f453f9e389db4298320c8cd6921efb7697e4ef3fc6c2ed7ea361f87708923bc2a5ceb3d5962bb209a2819b90940987780e71f0949f9457c3cc27c9d74bd07d875e2515d6fa66100bb45c703f18d0d789accfcd3faf6a7d40e83f97cd1e8917dbf2d8cb7e5db7e5ee189125e6b3e6af542af6380ca707086a48fa01a0b5d7431139d392550d5229ff4eeeb6c968de31662db94b4013b3e6c3f173ab7bef1c2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (373, '{"ob": ["15151515f6eedeaa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbfa33bb6162b1c5068299c3ff461d8e8708cd416b7d314ff953655516e82b4b86fb93adf49a688a1edaf32fecf3bfc401538999ba75b0fcc438bcd92e8eb05564e90b3debc270d055896d37c9b27e737e22818609bfcb7c9481ba9ab43c7ab46d347b5bb433a82e8e4c0177e203332ecdc91e77ea70cfd74d99e4cb396f8a895e2434c009180aed5d9bd9b7c221e8ace4a44f69e838f2a7eaeb3ab653a86d3feb431403a7095ecea54c86424f61d6639ebff0537168957dde17f0e669b09a048ec0144811a3e27e00b3e3c5855976ebb672be57fe69f56d3075909f7a7b2ab5db20b65c39939c9425ce733edf999c5ad484fb7e9dcd52f63b4487a9805cfaa5ef41c024058e5a71f5e972802adbc6f5960ead3d091b527a492f09439934260d4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (374, '{"ob": ["15151515f6eede2a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0291a22162c4756c72d93ee3748f141799a1aae7e89d5bb8160951092c1b4d425ccca8c7059dc93db560945a0bcb7477789969d016f6078c38092f7c42244b24f5c07bd8d6cce0b5733baf11c8c916d8d025cc69f1cbbad9948ab88de05b86323aedcaccda47cab3a4fb230140fad4f1e240e81456e1d43134efd04a9d025353f365738362bf8ab233904fe58670724777b50b8b79fba0b774c1942fbf937d02221f1e0e1520b434f1a72ef4ef9447a3382a4f24747aa728755d608fc3b9d308ac5c19a2c9916dc259529ac9742aca48a61471fbd47e23dc5c03304cd10a1cce76dbd381d1ce3eafdc932ff846eebca5b152e9c96000ed771b6f177a107ded9567ec54c9f0415f46d668a658dabe951aab700ef76820ff0c00479cb1587ec714"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (375, '{"ob": ["15151515f6eede13892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cef7e5d0f77f54fbdc44bd9d18d8d7d85207d190667b8977169eac4027aeb622ff1a1dbdba6a97b77a18d6cd49e3d533091da925ec2c8dd6e0f70fc02edc3c102d48a50e240fec9a90007d4faa5fcc33e0832b374e9d78a4e985acfeaf086cc9c89850ccfe7d27f3c3922b89be837753d167184d62e21bbceee50b55b0d142c7d02ef9830c9946b8f5584750fbbc615baffdf70b2c200154a97c9679073f30d532171af924f8eaf222c8eb348dd0baa570a072766cabb62cd713757ed74dc17b6f178fabbbecdcdfe14ca0116c48495392306cf4b33a8a25fe359e0491d5df4eaa65894fe3a3756b3d5f9274845efa9c6e6acaba94624791b75e34d021f17622b0360046c6d00e991f289e77952d13b2a2edd8f004bffed2021839a5ab25004ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (376, '{"ob": ["15151515f6eede18892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cef896b32381597911f086a44f698bc2caf3e2bf87da636c406134fccd3e2f1bd05892cde30cbaa92f3103a550f16090a737eb13c5cb0c68d905d9f3dfc3ea6f8e3e207cb9a829ee91ab451d3d4632f83b1cd0a8385ef4960beb8edd544b6e62ec0b08d5d5c558ae1f23f4bf5754fc7683a738b5d251b9b411358b33643082cacf00de8a8fb7d3681dea3902bc901b6f7862eb08fdae4e341905fc0d696d124ef632ce619aa68b0a46287c8abdb0281f5b594f3e482dbf23381742d9efff650342f16f43260229510be3ea397a1a28c2650b63ed89c8359236f20642e2a2b866880c3f319777a0686408751144b5346f0c70b11d36d9c46dbcb6a49c59e45eb3b16295bef6decc3769971b309b53c262f849bc795cd76691a5a70df5451b5337b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (377, '{"ob": ["15151515f6eedea6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cee5b4b5e8c8ba273baf058903eb0b0f1102b00d9eb61f00e42c1a127fba77a6a859351ce3c3cc0b4ee23f498ea6717e5d6735b038ee6feea4bae2bd8ed62cbc9a966f4f333dec036463f99ce6012b92c5eb8b822eafbc8bffacb1e250e7a8b861e5160e99f4d78760b046019055a79fc798d75837101065590af66e153889ce68560eb6a294e822fa6dcafcd7784482dabdc5f33b4cf224f3ffa626482af185b66ebc70357a240bf9e03e1370dddd889f7d6b4ff70061e4200b1fe0973d5cca3578ab9a641ddcad5ddecaaf0c735c484cf8ce200c69e00988d07b1b797f3808a78f2421022dbb285df615e23f1c6dec8cc3cd87d0483f3a337dd3cb8239ef6584f1be916754d6494dfa14806ca823177c4fcd76f108f1d1d0507f395c3608ebc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (378, '{"ob": ["15151515f6eede1c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c732a83f111845594c575a7bc206aa125289c01a1376a3c3effeac85d96f96501b041e02c6c04fd66ec0995b81eacfd9fe9e42e95c53ab877c9a9e91a418f15c477091d47ddaf629f3cdeebd560a5126788a83330cf597f6f356fd5bd69a4db50acecc2ce49fa437382ea4be7844cd543fe1143c4828d82f1d767829818fd27c4d2d550bd1d47fcef005abccd0a865b62d6260ba9bfc129998e229cb3c7cf2a21fe8d5b19a6bc4fa2fef2af5b261d458b052d1f8912967b7785cc9026a3f6b87e01bc738f2b5ebdc393092173f48ea5e0974cfb3dfd685af8a2e0fbd3f155f47002a527103e58e2a035f75047e0c1d66d1df957b28e1c62ff02f859b68e3ce67e179486493a3432dd090b538cb253851a39191393f8c0493c3257d20e59717c58"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (379, '{"ob": ["15151515f6eedeb6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c24edfde845e2df08729c52feb5b01a4a5a2cd32d6da70a024b21298203b9242b97afca0a863b428136e27477d47f0f96d0440f07859f08ed1b41371a9d6c3898fe4051aa77f896028baed5f3e7e59faa1c7d0f8b9d1065622b04388081bb18b8fe69d6981fbc549af80deaff3ef326c09840edb640954ce0b00e2ec139aa2412956e7c99d77e0663009e30e713fdfb531e472fe7da7563a5e6992b66172f554ba46ecf6c4dca7cb5333824419d386a08539a8084b95b097ae08c1f4778c152719083762bccfdd848c0319ad941e50fe20ae107b403abdadc8421cea261ce956ca79d7570cb10e3313b7b6deed6bd5c7f16e37c9e5648cfb5a26442bd9ae671fc56fbe5e484d1602c4152d8759cb176c88db0732c0f3ad41d2f6e9317cfcf4405"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (380, '{"ob": ["15151515f6eede51892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c28e8f8a3864a7d88e5f97951ef62adaa176abafe4450e5949e166eba114e9a0aadd7cb2bafde9d12a047edf58f79f5d6f467a5063ff6a5f11bbdd737aa778b003c42007d870ac3033d220b04f3ca8450f5960f0b143a51eb8560f595389d11f2db93fa5146f907626f28277fd7961fc71b49150ddda7813db48f84f62713a86a8acb2703e4a49d46d85b62d65ef1f5e039edf53f5d7c986604701dcf63b6f7e09670b66227fa01ead0733efd29ac591909285afe013531806cb56dac22396118497226141a87bc3b86e66ed036f60d307ffa1900fd775f02363f18030d304acbdff29e67262d4353710666448f18edf619547a9027522c6b1c60bb913f4aeae3c19a7725def390ccf9d82bc7198b284ea9273a94b12d8730638f554ca72920a6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (381, '{"ob": ["15151515f6eedec1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c94de30237a6ca29bceb5d69c3d50a749eb20f2b6134a3ed33c885187094388fdb8fb252a3f7ff8e4ce49fc96ea900180e3f7085fc05e4b93677265239c5ce3b4830f62b69d9a3d40beec236643f9a88558013a682f442f43d9a916982f15c78a4ae906fa38002336cf4731666de2c10c8c7495eca8a8abe5a8b220ebfdb1933e6d4249b83ad7471234eda4af6d1d818061336f1a0ec3445245a492d28aba47b6f5714e2451666b5c6e9d55701bd499cf0ec977581dde36bae345f6ccc140f76866e25bf7460084402eb6245deee70eaaadc507908ff71292db77da62113733077dec5d2a49d516968bb784386f3a66a5297a77a500d99656963057010bed5552abad64f4f9054a19efc48ff757010cf51efd39e0a396f5c08f6f8c0eab9fe988"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (382, '{"ob": ["15151515f6eede1e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9f181e4a146d349e7ac2472574b5305575e089aba4d3e3ab00be4394fcda9acbf4c0b58e13a0005a8238f0d391f3f2fe9d14b5d965a134eea9f1adf3d914b9eee1e7bd93273438e2db7de3742d54d696069ac192cc6322a38387501b5d2f974ac2ee1b1e7491ef9d66f50da74611784cb1d1d2b8036f5d54f87bcbd1b15b40437347507fa258f60c8c81f914081c03af1a21790c11ef539c20ff721e05b4169d79f8f4d82eddfede3002313547a079f5620dd318e560dd03c616a094a9f7ce9672c6ab01f2055db28505fdbb25ba15a141470612c568bdc9205430612a2d6adec341d591435dc3857f937e4cff56957932e310014d87468ccfebc476f9159cc2a6fa834ab678abdb5d43266b31dd71784a011f374f992edf688d75dd71705ec0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (383, '{"ob": ["15151515f6eede2f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c496f05c55e376e122367f9951c061b18fb1ba440dbe0f5e3fb324ecde772e5652025925dda896dd23bcf02ae5824102c219bbd0a4ed4ffd8700a98337afcf30c5b3d95ec026aa691cbc7cf72bb29c289bb5a2c1856553f53f3df2132f2074aabe7a06b1fe09146e11e501b2981820a619257ac1e870d6b960cf8eb187a857bbd98997afbd08415e031611480595bbc55569c5031bc131be0db524d2227c937692536765901b265725708e907a0b0e47f46ed9f699499ed25681163e8fd6ec614fe414c24c9890174c6c8fa978f9c845a0606f5f1b3eec4dd1661a971e51ba256aa77678c072043cc06e3bbf0c6a64a255f84f6f0224e0c0449bad54e98b3a2c4705e175ee989f681facf98f85deb7c412cbf5d734326c0222b51cb577ea42e6b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (384, '{"ob": ["15151515f6eede65892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c276342175e541eef13cbf187d167c69025e5baa025441d223f68f3a732d52f7a52714824f2bdd7bf383394dad48fed4303249284f2e15b7d1a9b3c8aedc38045c555e8799761eb07f8e0b62caaf6e026f12eb549c1e52454ddcf2d860ba88e7f99f53ee2098608b9f598162a46c53d33259515c3b6dfecb0e780d7ed3962d9760bf57da528d65de8a11671ae2e0a5226cb1e5ceb08a475734fd3d9b4ef492c06007fa303ddf15c530793d3b940155e51c6704dc4e9442efadbfb8eae1b71aaa332a5cf57a9d1275c758942e085538597b210cc84bb45ba135c9f02ce8dab1385ef1175decacba882a88930e5a7478d682dd1298defc0846deeeab064e333496151c544f99607a9d7cce93f882773f5e6cc7748a33d2bf19fe6a7ee7092ee09db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (385, '{"ob": ["15151515f6eedefb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc41cd12111c8ca1d5dd5be1a6fd605b2600dec5b4f2a685abe2ec26300b4f5df66a60cd07dbbd65fab3a2d2d69f11c6900ebf7a7d04786fa954932a18fc2091c438179dca4d6147037b3717e8e665a8c001377bd33799a2e017e7c453196633fee3a05c238d3df5ef6970bc1678596f8d3a352427c0c3610435277ff5932ccd4eb1ca031a3952b1ed7b22d235673cbb6f2d93b336d165f47d123355181b6d478b0b2bb0bd06baff1128efe313949c6ca6eeb9774f7ce7191a1b8ce81b9e273a33a5aa5f05da698f388d7c577c72e2962bf3bce5933e766050089d43b30c19547d481cc1ba5c54a46a2f86f195d33f11d37a16f9a01d6ef86dcb2fec00c8696a6d9e6cd78c4b8d1d4f1644b27c3f38752faabfcf3679534da0d41d006c2f0b9e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (386, '{"ob": ["15151515f6eede97892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c06a9fce31e9700f99776e45a39d948f23992417c4ee4f46910bc7b78bdaca7d25f3f2c85eac73f0d76cd484a8a3f118ef918fcc313b7384471c4740cda1aa748eb872621319cf7f790e1dc8e47bc2ce931d535b3743cdd023317d3395935bb8885df4bf4b105af8b8c70bfdb798393b266c17563011ecdc9d3438fab30ab4ebfcd5c6b1df1a22e36cc77b69355725be7ba3784dcf812af5c167dd5d1b120f398d4facba1ffa6dcc1788ba66235fbe7b838f3c4d537f3001b9aaf9deefe36506e73dc88acd897c7615f7f47f65fb66a534e99451e2ad2a2bdfaa2a61c255a68e509faf2d0fe34edc29720a169ed9f2048bdda2fdbf4dfbaa0142137c8c9fa5cf6bac29f4af35c7a55c6b4c10352eb6a92659f9c583d7330a91388d485c0e52e40"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (387, '{"ob": ["15151515f6eede84892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c953e7887619c3935fff13f90643400d01ed9e5d04a151a3616849212d27abbee9a9b09fe3e443ab188221a796e0a79ea06f9ae1767fd438f5fe7c4057af473ce1877fb6ea0ebb2bda322c162512d15f46c5ac2bafa12fb92c320f06c503557bb17110118a25682bf155bfa6abe40c036c8ceff7f97e20788964c84a9f6d8c38e7038bd4f782cd5a98b1b5e22875bf01759c4c2e7947b7044930521ce454e7553fa80386da432f6aa00020e8761aa6c6962088552b83c2efcfd2a38c52a5fa104e204ecd40bf606ecfe3dd9edbb0b6a4827c542b83f5325f746dd2afb8e04cdb4d4a9651344f0589b52b4cf16c4d9a03c3b18a47a5ff467f9b338781b034437209a06ad4be2ba39ef948c72c0479d9b9fb17e5961bb7a8b87ffcbdffb447f9830"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (388, '{"ob": ["15151515f6eedecd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce9d2d02233bbe61ecb21dea2b3a75eeea99255039aa97bcf34359cb82895a226f56b07ac4123adc2831a46629a3498cb74a0155a20ae8cdcbb492e762b46e1e3381fe696252356c7214ed7be602c3dada7c0946230b3a7476d5ea6b8b480cdb22a82b2cb9cd8e35b2c995052a075f8900705f12b25d7edc05b60cb214195264c074120ef4cc4a54420a50db546d859fdd6a618ad57126ac2029257d3397390ada146bc7a93341cbd8284624e5fa5a2c59a68d9378b58dcad14e4acf2c07d2226af746b21ef8aea282dc1105c1dc6a4470da712694f48b379797e240e3c1c8ea24186d39ded314701947ab83a35738637924a3affa0d014856df99a379ff76bd42746eb6637b92d096be5147e8c2c4b5165ce77d1f831dd371926ddf4b780e264"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (389, '{"ob": ["15151515f6eede3f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c62527b1e812d396dfc5e36a88f2bc90e76aa649245303eba46cb334cef7f689683604b1256c615561697d6e4c3165d1efb09cdb33c6e8851dcd7e8f4b9094033bb49c2c93d907b3610a1c7fe954bdf0f957bdc11234043cc08435a1f42ae07bc91fcb417b9c03a07ea60d5d4f6c51d972d0266841cb4d9d3fd881b63e711ccb4d574a7fee6e088ac2aee883c984a6eca5847b5445a1968bbed4fa34a82a09bec7448897187b0c70f58d07c783fdc01f5d609e5e6498aea468637bcb167903e9e2eaabc16635ed22747aeb7870c593111107a73f1b4827089af9f7fb3b89c99653cc8b40942f19f5bfbfc206c32554ee2f4e0b67c59285a6d1992de426619478acdae86a0a8ec2f5e80719b2addffd6f4d83f7399776a6b6654c60e8cec10d998"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (390, '{"ob": ["15151515f6eede0d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9caa230a382b00e12ae9978af939a18d31ba99c67d83e6858465562156da8ff97a8c4dd2653685a7635b6dbb3213e176fe1441c1a7279f9d283bc24bc76a847bfed6b93f4bc5d2ba1335d80c26543d7921bde1f0b5b49c49afba60a621ee50e377baf21c2c038939a851fa31b6609a4a59ef54cac47061da02fefdea689d0e103ea0d516faf11d64c876471e98b617f937b14e9d904f989d47750b3c1a9fbde84a467734c16e99c75d78bf633899cae573495c1b6487a94d02d1aa37a8f795d2e4faf349005695802d83cc0c82a3e25107150c529912de854d2bf8937bc406c413c143a0cd9c7e29a9c1d09afde1140c72ffb79da8a9760cd948784ad3f6095d362fdf7c23939542a81f3f3d9559add44cf8a32acf5538375b2350dafc4ad8ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (391, '{"ob": ["15151515f6eedefd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbcde24205d119d6c78cf73e2057630d19226a11e88a62ef398b856ca289af7e72ff23286f6811caff98e862e2ec82a485ab4091deeeae8f2c366d377ae6d3c6bcf533d9fbbeab17b1a71981d133cd8d4cdb5e3755ff1c5e30c94423f8f76093b9e5b87f517bfb9c98261d1c9a24886c16a447971c6c6c98501151117b7170bf21d72480252a1a6171d716d99a273204eb3c197dff03fabc0885f2faf49755f9394d97d1cc19ee2c95370d69548c4ae0945c2dd4c5c9a4ea3aecf982cf519ddf997887b63e4252eb7b943855ed62c23db33ee96ec2e3961b11b2cb23cc4f8039668986ddb56d4f31d4ec77cb0fec33a963d25da8690315bd6bcb971e1ce0ccce9f12852bbe855049e8bf913bfafdac978430c52de9db3ccb12b72a0fee1d4d7ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (392, '{"ob": ["15151515f6eede28892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c157f792c95d4c967b19efefdae271fae9a9c3e3408bcbf8af63be772ae82154f3bf0f25c1329d1b72ab781bfa1c9f695ca88a762d4a9d276105158ca75aa91a4c78e4077acc5da931df0b88e0a2caf575946b6daea98b863642e30253563382cdacf686383344736f50d252778b3004c9b6f02065f38e79a5bb2d60bce87aed7fbecb3135fb35dadadad67d0c2be119bd91899841e55665b4b65b65badf530aa8dc4f9f5474866cda2f99b180c0f0c17b4395e75c6aff83fcb620d3b25d384d808b53b6587e86e397a477b4deb65a7c5e0db1fe1aadd93db8544a0d6082fe1396bd09f99fb756e917c46b978c54c443c13ad2cd1161f12899d2cc6ff509220beca3e6d50df0f57c3efe2b752366c0f55d41891d18026763cfb7777d21c5b71f5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (393, '{"ob": ["15151515f6eede14892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9c16d87e86f927a5f2b9d42b46f96bea41b5dcf9253eed52e3815a1edff35991059b0c4f4eed56c05d5bd81e9bf088c36c59270ce8a590667b5b224d71bcb9b2d2a0b93abcf52617705e54e1deb95fb850f4076b49d41894377cfa89e6c3d821df6032a0c2923c118062eec2d06e8efe4e54953d2bccca6d3371dcaa234e05e555a94c18247f4c15114a3da9b6718d8b48e074fb1dd2598649dc8ff8edd62a7c6890ac4511fa037e622ae4b17948198ae0ba92574ae5c04d69ab66dc5d4a9f9d6076029a8d5c53430a0af974dee0026813195f9bc4609a7701da36434cfffc2bb32b6baaccb652ac00ad7fbd43a17525ec8002d6d6a274ad6e845d67dd78f7ad9488afc34f24fa016940f9e45ba0885446e28e06d63b9bb3264af9214a61e530"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (394, '{"ob": ["15151515f6eede40892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca8557e5688c909f7eb37d3c823498423acd7ff6973f4933947145c53f25f7ef7faddd72c2bbbb029e2bca53c20ff40054702204dfcb0176cd3d66c6a67af53591e490fb199b4042401da79f2073f3827a046cac003e7cac83e49927b71c7aa641a83e343cdc802e5e633d58729f05d8323a602f54433e2fd5fc4e1ec98d2d5e838dcda2041361a4aed465e26872dcc0f0bb39b5a4f3a23a629282f540aef3d365d34481a2da6ffef0331c421eca3310fb814390d6f76b4481304336df328fda2449a70169b884b3cf8178e035ca21e14897485314182bfae732d99c80e5d19d048050190654d7271dd9ac7c2df7c4337a1877e51f265b0237213527c377178257124e52a447d8380122f8acc3bc1e90263094c39d09d97473542f31e459cf1b2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (395, '{"ob": ["15151515f6eeded6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2ee8bd893f0435577da0abd01959a56de172e2e5aa70d53c73dda59925e59f3ecbcfa60e998bc645ea5a8a91e6995b857689b4d64b3449a22174d0bb7f3c61de09973c887332637af5727b2d6a95bbdcc46a90fe2cb6e3cfd7ffac59d77dbd1058fe6bcf1073a52e8d85f8511a2bc68d84a2c8df5e71bc5435d576f48be94684442a73f4c7900c620a4522c23a93ff2da0e91f71caa5e985d04447920e0db56c35eadb55c082518b9134f8d0f115b2af7f91ec1a14668b17342b6090dbcbdf52f0e474685847d0b6d44afd07ad4c6b18dd53cfbda818763acc02337b82c750e758cff6a4f69c09a14543b4e7a6ffd6b26048e42e268bff0cf961e30ec2b760459a5f3d6eb63ecef5befc617cdf9d85a7388859e166c81944eacb35f6d120f17d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (396, '{"ob": ["15151515f6eedecb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8ccd216ba9e60db37811ce7210b252a4d0acaca3c65ee4c1b05aa5112adee9e5c298c73a260c37cfcc51e55c9947907e40d822d30ad6d5567e0cb99595521dde6c3c9ffd7e2fdd77f694114a3ac584305bfeba4226071af13e79e8fda3c2955ca091735fa55627a89b6a544d2dc83fb044adc97a0cfbd311ce818a5ad1d31444c8a29e8e158a1e5b629af12f5ad4e43b6ce2b429ab36e8178eb5d6048cd7532773f4d9da3b334f9a517582cde49c892340faa1375026f5849f889fe3833fdcd40fe2f013573143c61b4458937479c2377599c6af31f8b998ca86384c66b3fb9f583192f5e682da9a9090240ac2f99718076c0d061c73606d82c013b6ded7c9166037f7535cdb27a020a7ca491f80864a4135ef388c8002bbcd746d91e3b103df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (397, '{"ob": ["15151515f6eede1a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2b60253c80ce70bf39607dcf37a1a5b110f2c21c3b04f0e77f99244fe9ed2c9a5cc58b5ea92461b600c67d57fc2b1475cfc0fa21d8bd207c8d53de72cce3258d8b77f98972a6c026b512ef9eedf7f61d8cea12829991334ff7ebaa0ff744c1caa87d95f4fd8ef478eb3b97e535317a42e70df88c30dc233ac434bdadad0dff8d73c15d2e5bf7f43a2620b32e27864bc8c71cba6e749c9e27ce5ebd27d85b1a634ab68841aa1368a598fc6915cb258fb683366a2688c4bdcc6185ccbfe2772a6e98bdf89b34145dd4e9966ab99ec81e7f8c7ddad9917dc275456b84c36c10a98949ebedf555ba10818eb960fa20acab094d83da56135e8ebfeeeb229bf419d414ccbe4c2d23edaf97e28a6f188975e65a9eaa742419aff38bc1c4c16c7d341360"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (398, '{"ob": ["15151515f6eede58892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c40a82d30026df9f943510cb6d2ed656af8c69bf2cfb5a9e5525b6e86c5b4db2ef1bb625932a7be594455158b4a6e3198a413029c80791731873a3ba61dc3aa7def792e8e02f03dc66587712bdf478541acf1707c43902c6a818c088dcca78d51fc09b92d8acf86815d5dd7241957bd6232b84b445cfdde8c2709643c86b52e88fbb16b28e699e020f18511fb350825db08de24360b14dfd5094e968878244e6ed21c5267a2740ddb6682f912283c9d68b421acbc1e8f5302d293195cfdd2efa6c736c7f2c9fcd2902640c1f2779c10f0b31835f4f5009b765dff7bfddb63542cd4b1ba53130ecf0fa6e668e8bc315b3478eb2e02f56e1e077db8a6ca9c2c877ad6560f4611e33ef09a32a1ab98c4286a2a6d53466b6ec02335c52826724a8fa8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (399, '{"ob": ["15151515f6eede77892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceaf369e06aaf2f8204abff296265fff6bb5976fe887d2ce4442636aa7235649f3a0a3ee20c2b8d45c6d476390e06261651e17b7fda2feb9c4d2d30ead768ee7225c856204c0ca955292056a5399fafbc88e3179e1cd34036e9fc5e5e7ec01310e3e6beb15d131b547b814b100a29b1e62d61df793aa8e8b3a4db2c76deb2cdd84588c4fa149597d6d001f3117d19c4dce2c5b3b084a169a81339eda45c91690903ceebc70f32857b7faf590fb28f6ff1700550088b5f2f312e532ed560d9964f34f0d8ddac1934676695359a149374d7523901d3e603c1e4ebe2493ecf4ddd117b8a95fcb3913cb4c83de71dd8fa08fb9ff387f2916507e903ac0c432d311843cafc4f68bd12f84ed74613476ae47dd0ce4d261f11412f57f6a4d2a31117440f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (400, '{"ob": ["15151515f6eede7b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9805cae4e0679a782fd388dce8a579d602c51c30ad769a60b0bdfc97113e0d0006942125d9eabb8e3578e37c74e5f1cd35aea9971c0caa2b8449a64e86d2a4051ebfe4f5a49e1db7d5bb3907e5a48543f6dbb8d5c125b0d70b4c8eb327b235e812c69b3295dd913cf4f2e2e33210d16a5d725e94b56d18cb797ff6796cd25f08d65fba293937a2cb9040525e64799c3f6b71fa600ac8b9a9156a94f9b5c3dc1247e17a4c75a238c824c5bd13c62d1d3eb9f30b5784b22e6d0b636649961ae9002603a8a1ef53ba108ce767585f696eb74ffa13a613395a55aadd3ba72b2cb540ab1022f2c0ed2f983bf2fc84b293a9970c283fc2b12e26e940896caac4d480ec719f07dc86884cac3b2c8963a552fd727860ca28ec5a57a7c5daa5be6e78418e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (401, '{"ob": ["15151515f6eedea2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9ab0c94b519d73dc41162c933a40db167b53fa4eeb87c5feaffbf58e10a255c35376f540ce900574ba3d522d72a8dfa2e3a1207e2c04b9484a55e986198bf045044a49523325f4dca581af281ac7da67c0298d699740441dc61cc848e7eb6e786f572064881cd3b9f13466db21eeaa7617da3fa11c10f9a008b6cb62a04c4da9952451e5bf1fee5e0785c80025c767b84ec3f20ee4b3fd71cb515cee92a9074b595703a9d697329e85e5061a808ebec60cda4862a586e68c1da0c5f1ff3a3a33b79191ca1794b5fda2ec0b2fcc1d050bf5cfe337b1a62eff6acafd45c9bce4974c405d98cf77ba0a14d5f467eeee24533db33debe9bfaead7ecbe0dd54d178cd5fbfa05d130d746ac0ca9dec832064f97b987cfdc513b27bd2bc84dfa315ed9a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (402, '{"ob": ["15151515f6eede39892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c661dda43e2a95c2529b35266b8ffc610039ebb58bc648e46a6163181e82094e63e256e41b661690b89718e7a3d87a0949ff5aecad5dc6ef3ac6a4fe60445911061886f1e7f2e3cfd0a1c97cf30aff7ef3cf2b3fb31b089067bab37a49a75adcb3865ed0691c864cef63697e74cbae599786191e8b0ba9bf84e7b503540045c0b53e55350dc5a738bafcaba65e9aad3f3b44d0c1d9d441a1d8e348217ffa4e7a95a6a9ada78898b1cee7e49de7f657f9b6c0482d6240eaa3bb6149eb6885c14166347fa05f2955125d0167e71bc8bcc22a7d5c933c484247c2ce7b5ab93973a55991008f70f74c2d3a6d4f121f108cb2df4a6a5c589d9b3da30faa23d3b0a720f4f6690e42a60221c6cae8a6e705a89d0fa2acf3ad0c017b5de5f5ef87dbbec5a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (403, '{"ob": ["15151515f6eeded2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cfe986741155420d2f4d7628649fc7df1688539a6bc7447bec790e2cca80ac6c52a9f846e9c83ce32854b5c7b3454f114578478b47752e5940cb09465f8b187aa176222d7fae73168bf0ffa73276b1533490c7327a0ed007b00a9743f8ffe2bdeeb440d16f0571c3c7843c12624f06360a38380fd33c73ab27ca5d37ee21dcbe96dc9299146f254d82cbef089734f9358f2d6664cfe0ba8f4b715c9ef69041918be280c5f7ea15a82235b6b0a270a1f15e0b721e0e07f7d586ada181ad7db24d1bbca434300142efb4f63de748d26f1062ecf17097e981aced7ccf9b92075cd5b20cfafa28454510342ca97a987506ee603b279777f1b9d4a6770372488c48925607f082fcf782150fdcf6602b7422a573d44c26e4b554826966142b718855094"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (404, '{"ob": ["15151515f6eede12892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3f866be59ce26f2e42432ca34e39a0a1aedcbb00dded5629b3f4c49ee119320522b5fb6197ca3011fefa79d5725f038e5c94d3cfdbcfe811316756fde864154bdc6dae551da56ed91c32ecd71b47981eeaae2f54c6a6c151e645ff31a6573f8415d1e60661e6fb81e159531af01051fe2aebe8b6fda30d155e70fc27ebdd1d72003aa6aef9e07147deca9b9e3f1eaef9ea317d2fb549101c944cbed91e3197b823b5fb2b0cd5e9fa4abb82385cee7af0bd5f780a5cb355b2d5c14aeb33522d166f35ce72035ab759a49150bd664954e69311992e393152ef1c46eea572b4b908ca96e95a212f0f85bc8704660a5382cd0a9103067482a3be65a2e2ffd44ef34efa48be596dba33ec98d4b6f70f4a599525d07d65db5f0691803ff8a98e943568"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (405, '{"ob": ["15151515f6eede0f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce6ef62d98fa72dda0f2cef64e2c6ef627a457a987f2621533d72f92f9125c4f8e7b0898ada9200b413965517fcfd94a39fb7893c643ea76b4d1773b061d9fd28847e2e6fed30444c19c7750941bed90ec5a8b65230a6ec057d11e2a1e814ab4dd3641cf667877af644a32a2a8fec8fa1b6d33d908cbebbd8e48464e4b51cb29d8764264364de019ef5eeb8c6badd89cd7763a12f75a59cc96309e3480a24ade7f0af0d183b3d2a42b0dcc958484cc71427abd29057d817616460df1fb1ef89bb85a4246f2718832114d38e9278690a5aa0fba9c8b4a3e55bf5b57206d48762e8d939123688513c7083f7c7297c5a50a7373903a90bdfa46480bc0b2d89f8364d9837c2b5624536a9deba5c5d8f57de12af13c4a4729e9569c57f12fa28a5097d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (406, '{"ob": ["15151515f6eede32892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7ef24dd45fe9ce8e17726f62ea04be7564591caf430f95b4d7e3161f510ab09cd3d32f6e8a7ede5b083b8d0951181ab1060329b992a0ebfacb411ac9c8103792efae909cb72c87f5479f12f49abd3a3ea1237145a2387f928bbfd833257f855717caf030b8bf01bdeb069b0373713eb70ecb82706719b9dac625cb2943c645fc828ee768c4b2801e449e8a613d74e6d2b965fea08f55e8adc783eb1c9890963539799c822df7c8129374c7ef0876092afe55021ea5fa38ea91f8f27e6a41b52770da48eda0a440aca21b0aeda1d8e2e08a1f8248f94d5f0ba0f5856255ac795d6f84d3267f44791f45f20471e9b765b06d1f8a0a92fc5a55aad3e65699db0826ef41796a69c936ce571bd3f0b0256a77ce8ca2bc20c55423f9c4cb2f8bacfbac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (407, '{"ob": ["15151515f6eede05892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0d4f94af806c2af31fc80c44ecfa8c2c2921b0c74181af9b663c3fc84d46c530e0a023ff12c4f804e14981e730489a4128eae0148ad81865b090b65697830ed4cb43e33316aa15fcc7dd6a9bb8fdc235dde5ede982368f621faf6d34193cda7a2b7b6814bf70ae12cf51b897975db9fd1f4948262b7f8cdf21804bd4bc2fa51dd76bfcfca39b35a08798728c3f9d5dc975c7a769925a3e06210ea1950a133b0aabac1261c7a05dd0b28856c7df01e4cf9d9dea62743c8384f82100a312bdef96f154e7d6522959d5b681651e557b3449c2f61f6206af4395e23e1936583a57455af14e5e27edf6f9c6c11fdcadca70c83f1154d6816f5af80f9c9ce9d7bdd852e02a99a8def021f001cac86c8d09a70123340425d75d548154fe40a685cc9fe8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (408, '{"ob": ["15151515f6eede47892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c46f117ef781fd33355b1454d01679e05ba90be00197850017e305a99fb2e5ef999309866b4958664327a0f295cb30a508a51666da4132060c7635eab5ff45cee8f71544a86d34827bfdb40c1bf041dc73cb713613fcaf3a8939c3f2fa9d26a88e4a84561ff0458d485b965f52caa33e29dd446b44e62813fe1b7db3f87b441a82b9f1713ced0f8b0a54f2cdd82ec867eb28ffa3228d92cf4dff71c9640c48bd8e1d22bd49fe1c0f981ea23f58eb50c2515bf2169ecd039b22307d6b67d04cfdd023a787f03c97c5e1c4efbda1a874acb72a3a8f0acade6adfdb6fdb6e3f7c353ea276ce4258c35550e840c6ca5d19929e0085581e2566452c004a575296e514bccbd0e42865c1cd4cd0556c1da16de558613f50ef3b5a12b2bb411af3a4f14a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (409, '{"ob": ["15151515f6eedef5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb2fc1a0cf9d423a0cd1f9fd0a5f6e4fe9744e8d864e1d25db15127b2161ef9685872d86ef383f291aa08a6fa4dc8c61c4f679e3979f87aa72a9fd39c8a76585159aa6a17c07f52ab7884eb103ce415d0adec859f90b492376dcdaa9223b1dd2be4c8a7c2236a50cd5910d3365eb66dee8685d9789c2b564613a204b9cdb6bb5c426c3abaa58c637b561c10d1ec3d209919593dd92318690aca8896e53522ceda28c5630b4460aa860e119a2ca31002ccf077b22564fea3e53a8de593ba517aeb80a37ffe825dedceae406a63b4a68709c7d2bc149bce69991b625c88c214dc026d62b9fbc05b8e1454a98a554f038a68144c2e80487cbf87c0596f7c232235e45a95b2c88b755c12167ae85e79466d0bf386b85fa9615cd5756547a59e3bbd6e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (410, '{"ob": ["15151515f6eedec4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c47a345f3d7b2135db5301aa21834c7bbe682a6c3e0dfcbe706acf4d1f33644f6cc7b911ea5ec21732b684497a86371f4b7f018709db7d958f73e4c23cfcb2d46fe45b2a50440bed894bb683d352c79b01fcebb49e22705e9a3adf1b4a621ea04d9ca4fdf8b7dd8b05fdf847e2846d72131b34fd2b7bc019795ef35a1602c52a621b079b1426b6624779f1135b0883dfe2e00c34aac8f460c877660b7cec38a93758b7bde2699ba4f35051d97d04e25e0519bf48a9c937f48d7f4cc2333235b513d53366e13b58ca6fdb47d6197aaade4b63604e7be3e917ff40c989e7fcff1bb86c08c437640a0617a1ccff52d45e454ea936749a50499cfacb3bee33580e8851b78da33eef45e7c3e286929a156d4993755109645c60143f992aaf3e6e2d13b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (411, '{"ob": ["15151515f6eede8c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cad844d8e400efb3f0b6efa6452d25a6705e025cfe9f1539b5d26f24cc64c6f129c9a0cb86826ccd2d069c2afaced8a8eedaaa34b484e83b5c50fdc81d8245457db72356092ee26cc413cc15727262ded1664308a0886e4061b5221723d807c50247234f9f9d729fabf473193b5ac8cc951f35a41376b3cc06bbe6e01c3d240bded0eee37507cb3cf88a629d1fc017cb5807c9391e696c486de09b6054e614d45fb7d14d7f247bb3fe2fe856e91f15801bd4440e9d6ee1c2996fbd7787b76532a6d9f8075f0b3ba8609fdbfd2b16f567ae269371d5af6fb85e81465685004b3a51eabb64869b5d3af3645216e4e5f6ff8a3812a59c003ed6534e2391de665f02f8239f40275427fc39473e581852c6f5fbfcdccaf17d956797e3079d46c16cd6f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (412, '{"ob": ["15151515f6eedeca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf82eed599731b721d0eaa7c1a1e5276f33f8bd332b1e9707459db0ee16c94dc343e29b6005cc25e9a679327c52610758c232b5786d3990925b967b52c74dc583cc31570d13013eaf0acc0e99d8d51706c623cca37495b8e61039f4e85bcc4dc063cc75a1fbf19a01b1ea0fc638fa4317dabe832d8a050405d2d6faf2666304024c67480f9fe991901b0e8119c273c43e9e052f5fe711740025ba60acc359d2ad9b70ca7f2d18da8138e952c46cd0677ff33c94d729e4ceafef81ace82b2e088a2f638643bbc9ba09bf32092316a7e9670aaf893ec386971adbb785202a26d7367c941fa1f7ffc2afa42ddd56bb0dea2496ca6495d6ebdf5972e307f797e066e7f5ae91e82aa12c1329f3c5308ef155dce3450bed6633d69b7d114e7cf8906275"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (413, '{"ob": ["15151515f6eede48892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c684d7974e7dd9dcfebb133e2b006b408fee9cc9acef3f0f9d82e81db7d9fc6926105a411c589b4913a83dac55d61b465aa8e4012ec54560f5212482d03d141df5a9372aabc545400d07ed19db12b5cd93d2fc150b6685df3e3980e32ecc06e26478d4c00ea0aace9ff18cbe922409f6b38571ba94e990e3a3305b2fd9c3ca8a454d2bc2a0e6a8ed222c72f05fb7ce4fc660f89ea91e96080bd3564d83be7a09995aeb1d517f6e123dfcd9bd39aa6be5390be7ac72597dcaa7b4344552709fe26433bd71a976b3be67a5dba15957bafe93ef557698c8617ed536d657fa53a9f798b0375ec1844cf12367b15123621bced20bdce8d37414a911b45679b30670b93c2f64e37cf056a75d3b95660998aabcd14a8de3d99233a8d709896f20ee30cb9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (414, '{"ob": ["15151515f6eedefc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caa78815a2e1a9390d360024c50c256858cf0543aace725810ae95743145935e08f53faa3feb6dd774f5600610728bf0428f47903a2c38450a2813a39180262dc042b08d9839d292fc91099e8275dbac4599c2dd20f6c756b83c9a44eb2d64fcfe8ec38f0ba4df00646179cee2ba8dd9fa35794195630fb6a997ace75391f9e1aff567db1b803d146e179e6c4df54517d3eae47df7ae31f4678e970286fd5bc5c373085fe7f3666521c5d2cbf489b4b73e57754c920e22819ad1f196bc891e45b71645b036811c74da0f5fc7829967d1979d156f9b6c6b21324a91b1a5d6a74cc50f404c42bdbf94c5ee6fbc5f0733759595760020d84b9526fe983a34565cf388f6419e2b6d78d4157b00d4c8c82e5a750df9d39763d7dc54c478194125496ec"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (415, '{"ob": ["15151515f6eedee8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cafa73a1f4f56b4e5cfb4700d4963e50a5a95d71d186274e4507e690342a460f40964d0ca49892e01488b3e314a3f25074bca1f1009ea914e09a6f4b0db658b102859308cd2560c72094bf849e2808a75da979aa105cfc7ffc35e57fbaccd7f795b5d4387b0feff06e6a1dcf6bc0e082bf0fd5900e55d7eb05919b194c37e4573843abfc61bfd2f35a301b7cf9798d645830536290f0a3ccacdf3a03fdff18760fae7da01158cffa27478f1138e6a6ce9032e98558b1ec24dac813caeeb224622fe7d1ce307d4dec3ac354a0326dd089d6e8b179f9dfdd29649577b6ddee4cc7a1c0bca3d97dcc2e604efe4ba5109ede7596edb53afe64b5fe559fd6f8db000092888371a2447214702038ef981050e05fa5f82b9c54f4480a6498095abe119c8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (416, '{"ob": ["15151515f6eede07892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0d34dc1839f33f83bea851689bbef58a0dabcd175948059824f7c3b54ba84bdf2b2d2b7f59dd73aa0241167550e0fe29290516cf2775035efaa7ed45c050b208ce200cfb62e7ef21efb1c2009b252ab2a917951f1f54642c57a5a4cf149acde3ee7f7ad636827f2d40bcffd713f87bd30414b4c79f4fde1fa59cb2bc7103f2c697a5a4b013ca5d29a439278cb2f007946f76c80f8a0e8dcc8e8260caacb125582ebfdec0b8068b7c68adc5a91e77a3f566c6f23fb5aaada53fbe4e16d98cef217f188a503a9474dde0c20d48cd39b39ed4d233139d00a06bc55c36932b63ae69ccbeb4a45d2aa84b987486ca8cb6b3ce4461eb2dbd8656c95f34b12dbf0109e5cd67e9be3ec6ead9cab95ab5d5405eb438513083bf9d3775de57631c80e335f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (417, '{"ob": ["15151515f6eede7f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1573e4684617e3c42abcecbe952081c3cedbd6c72492a378644f92675d594c48d8157326e574c14a8e02f40c91edaf23da0e997bc0a3a475ab55aaef77cf01ba0207a6c8a2cf02823b27fa162e6a4f058ae736f9c46eb0384e9941feb55cb33b8f86c91773567fe50c46906468b208b96eb4bcdea75f1b1c85790529f17e3885d0fc42c4ad5c39ac9c06a55c3c631bf3cad58f76473e24f69a8d1cd1618dea832a6a5e9a4e5f6b247bc8515eccc0cecf113d4f22bd3ca5e11abe519c04e04770c59dfab55dca644911fbeb8ec305aa87028fd2c0b5b052a6a16f7da64e67ea2d9fd39213b11229a82e4ea84c2cbda978004f6c9a99f06b0534f79db02adae73dfc621512c2a724ff39ad93129993107b4a29c73c9b6818f0f70dd90e4e1fef3a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (418, '{"ob": ["15151515f6eede54892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cfef790e6364a1793b1f1ac4052f2002abc43e414a2576cc81cb299fcc23ac8005ad85e19bc93a2464568d43f314921466396527de0a4c52a7f884090b09b10579c89563fe6fd949831639f51be5e449e43675c3e7e522619f87103be42527a7ee1a3e3672cb2c40e8b614aa9c6e972a1bc038853cab54a24c37ed649512fe22a32547df3626abc7b462e9ca1fbb4c6d80224ace2c7fffd23f861bedf1f13fe602c8c259eef50737538f76fe9e6fc3fc291325c487bbb86a1dc13e0b28573e21e11541bdaa0129f7f27d43216c43f534ba0e2178a835bd5f866054246ff80e81d22b212e90f8ff94ea9d5c37d42cdfa26bbb05c85abe86a9db32f1a10dc68d13dbf04d8b22aa737d46786145d014388c9ab6e69e1688c2eac901e601e3e13fe88"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (419, '{"ob": ["15151515f6eede22892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1f6542e939cde4c9e5399aae9945135f8535e3753b5b6e4e6f60ad53d0888e4747b8cae59f820ee4398311f13f1da78c4ece37be93e678696728858684c68f512f426284706c762632c78d47f00babaf08476d392ece1529e0ef78e2d2abb379e8754cb2250a1025f8f15865f45a2d22ee01c0fb51842fb27cd7a4c3fd168a13f3f493698762e3407104d6386fbd13799f213d91a31f0845342e0bd9b9d74c88c63f9281ca374b6a68fe5b7b7627df3effe5f979d960c096a53979bee04c9e60bf01265bdabd61e1fafadd269c14d33045f7d7b869fdd71cdb025f34819372c5a2d34e922c1b6d2372217d191b53dad0d3b9b9b8abbc98785e641136f46a2c301dd980c2583f42af5cff2c57c462ad631e964f2641132ce21923033b3a18f2e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (420, '{"ob": ["15151515f6eedea0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6739e7611cff4e8b8a96921d790f216ee089dff5bbc7f7dd1c2e436abbed0e0e379c5c9f6c397959f4ea5affecf01a98bec8414591f6fbe7ea0f474633a2100df9c9617001e6d12fd262bf1eb3e7bd74cd96a4f0757f13a12170495608eb0c34b1e4dc62bbfbb8994c4f2645fd5a3e9916025c0be546b3867dca539cab8af64e0763118fc395557deef8596f19c9e8da65c964892f2083a138b3d5f4906c75ac87277a6cc76c9f4c66c70611f4024c0625b76c7961acaf123faeef0de01c2e94456708f937b61b162285d8fb2d3c00c659fddb11cc49cf7d0e8cfdefa5e13263a754a32cf3bcdd1235ff0c0125cd6df37cffb52240d1e83123524433a45adca0de058547d17973de9c33c749360ce03de89ba4d27ad7f1ff832233db33c1c626"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (421, '{"ob": ["15151515f6eede10892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c34dadc77d8b00a2eda0f404ff8e1b30ccea12afea03e9cffd88b4fc960dfc80e168662aa4ee4d6018bef1490d8cde677eb3e260d8d540b6c067b396e5cc5b8f882dfb954e42734438f2476e942b01affac1fbb24d95bda6eea10f3bb82928685903cb83d968a2335aa65d04238dd8d5694c0b6177338820cb490b661bcf3a8c195283c82992c94ccdb977ad57d1706dcdf34ce4d76ddf42bb4381c4731f12cdba052dbd9adcae4ba2289855a05100f5f7b422152e24f977bf7fb985b48cae6170e4ede86b081ec46843a3927c917d37b25121b957229914ec76b6ac090a414d6cea9ef1b329646e530b8db1335327e597aae832da586630bb4a0cd569dab37c97477462b20ceabee0b48b85f4773790e908fe2684a342096d5a2e247a863306c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (422, '{"ob": ["15151515f6eedec3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c290215f47e771b12ff2cadb89b90d48d858df5165881aa3907d5c5983d0b8c9ccd9cd944ec39a3621735912dfcf2f86dd64bc8c74b1c9babd77f85353af1fe0a9f8cbb2d1154a37ca591869ada56217479807d1006aba34efb7a760ee7939122e472ebbe52433f4b6ce33909a8688dd282c4dcee9112da4fb8ee275ac47eaef8392228194a5c14771d30e7a73ac1c1b1f4816e434329f349f7393265cd334e1fc2e95adf0a650bb8f70893d260826b127e0a09339762fc9335219b5f6bf618ec9f5a8f654673ff03c70af63b5813c0184178ee66479f86ef78b52e4dac448d969af5fb913722c2941b1c36a6e056213e2be3cab72cf672ef56952a0cf9fa16913cef4a9b977b244cd222b528e42d1d923fce348c452cf8e831fc59642920b0da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (423, '{"ob": ["15151515f6eede74892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4a477c044f8e42e5cea86eea96491f90936f3a471b2fcd72112a42d35b9009733fdeffc6d0c12e244e33260c1e366a27aee048b41a04bf785aee2cf5694872d09ffef139e4055a9b528a14a8a25bce9feff52378f9ba920f81412e4a081952c391277335f5d92b345f75750eb18856306aaab07fa2b3ffda687d27efc2072c77f94993f0e1a81c823862f44a9524ae275d6c31331a6443e8bdb385542ab6587b45c1b012599e77ece4cb318ffb30d09785f7ed3ad077dc96f2138e99f46ece2136831ba7c096e02f45ea72468207d6fada498fd76e377f41db192f8763281609be859f03f5b9ded7c6acfbf7398e8ddc57984330ad6f81e0e373d83fac57c724748b5b1788a90d76f21220a0e5ec3ca9ec49465d44c709e5add55c25546baa55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (424, '{"ob": ["15151515f6eedeb5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc5ce18f1a8f8bab8e268019ad92643de2edc594d9b2e7e4073a1319f3212f1b1e6eef8c70e6a8fdb681545cf6e1376c53a4e2fedb21490b16638938ea3b576a138ded5609f01f36bad4e880a3235ebf2738a3bd5bb38b44f9f2743cf10bf0f770a53e53b7d9934590b59c680b9e09321bb40790cabda9a95e64b16631f9913d202f9ad1b3a7c867a2fb84441cfd31d8af3ad4e3cb6b269a7ec8a8adfdb12220b325b9691ae65b85b37388b5c3828e961bd487f2b8a7925505676a449f65d398effcf5016e78c2407d4e05260e81c22f2aafe1ca7a0d36c547f078125bec97dc66afa9cb4d6a06abd4fdd2e49f9baadbc2fbbbdd8cb6f460c8268380b23d89eafa3f0648beb8a80531d7cf00e624ae714c9701e6e37b09672e975fc678db3820b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (425, '{"ob": ["15151515f6eede3a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8e4c5ad361fc239bf86aaf31fa3e8c781db547db9aff7044fd9f3d18437745c5d2f61cc1a28f97ef25e222aa1b46c1df64419df2e9e3217c91b2eb5ba2aa9377b2034631761ff082f60d9dc86d72150ed83c509a9a4bead39b5adcd578dccfdbe46dc96af98c30344017ad5a171c0e0f30dda06643a7b8ae1146b6836a0b35abaf91afa686a85c3c482564c60832b5646e134c6cdf71cc57cb609c41b5d60b801ae136cff0ffd4c7bb02364c9e35060f8367ce39947525c32088d5f08fc381db4e7123b9793a61556d5d3a9096b0527ce1294a5f12083be8a7bbdd006960bf40b5e1c8b06d2ea5282cbeb3b28f11432838fae5eeafc198f71b555446e16c9f8b08fd33b1800337a84827a4ae0bb37d39f530a3507e963c4891f50142d2717940"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (426, '{"ob": ["15151515f6eede25892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceb7507ef592418fb04504e26f7aa4d9b418868a60b544fe6e6041a7a59674901189bda754b794a8f5ace0f34457f5f667b995bc90e40a32637fc8520804df68dd5011d53de216cf9e85466e08da1d98bd1495d69dedafb89e2075b271707cf162185bfc0cca8284250f2060e9dfb35ef8f9a106337699e86efadddc2c67000111c3a69c151a1a8e26e2b8dd3143baefc206bafa36fe39b2cc1d06b29570e4dc818b62a9bcec45c6383d8a7012cb706f9bab7bf55f28fcfcc7e32ffd47de7de158e5910a8b86c10e313eea72759b0705d5cf61b0cb61f3226b85ee6bc11e4b8e7e67a14016c92f886b4644016abbd040919dd53c68150510336adee7e476ee0048a540e0067781314d516d1f14f8d5a3e6fd707d04a9af3224401d80fb13f3771"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (427, '{"ob": ["15151515f6eede44892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c13efa923d135de6e5fc7c42b39f3c2aa883f0fd36adf007900186e25b2576c17be07d9ea5bcd2c59acac667f73788908166540c1fb5671513ae013afc84436a40c3026429486fe0b3d827a6a0b9601c4652c16e53f4c51029e099b023e9c4d1b5940a414108985db482cae495f94837d98759da791ad2cfa0cc0c1062f6f3f38c6cb973eb81a89a6c9251d76c7eb876559d082920b8758af418c839254e11d8cbaa63c0d7dfeeaf62a2860c730218cf66b8827d5e3520f95f201454bfc0dca5fa3dfb486f9f6565f6a144a40e32b123d9e477d20d6bbd7ba438340783d31d62768fa797ce0b9dc28c344b01598fc89e3363f4c794d44a003e0b00bbc33b97807a9d19e9641e608028a36efa6f1347895bd5f5ed83299233b2cb38129bef0ce6a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (428, '{"ob": ["15151515f6eede3c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c401d63b07a9bcd4833720b15b5255a5c741ed16036fc54890028b099876ee456d9988d50ef120bce3284ba2812f9e4fe50dff30f5a84460e8accaca57a6e6d582a0a53628011eff3ca145ecc28257924c5fa059d1d467729bab3640bd2a5b9e69b93afd554e147760619c55a6a8a1c20b6083ae1de137271aecd2b5f5f1b4cc02e27d229293cba4aa573137bcfe1c16f4e11ce1f35462c5a4763f800382e4076f284b3dd93a0e815a60559415455da349f8503273a8b67069947127836558f3f8ff62a06a2ce0644c5214e2121d324781cf47f1ef709a432f1c24a56d2d5ee6a381ddc53b21ba2c176624b3de564c50727d907e8a8c478e45a0f7dc70b2c8704f5fae4159a5b714df3cd383e1177624689546f33a79b845568dbdf4ab33e43d7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (429, '{"ob": ["15151515f6eedefa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca6297233f36ef507f8254e915b4f7464a6405cf71b7f0626d1ac4e356ccab22e3cc92ea785eaa2713a007a114a05acb24fc29e0e5f453d10e62fe7d5802755f27c42b2e80184ecd15ed29d39d14ec9a48e0be0fb042465b57fb803a1af3637b00eff058e7c3957d9e0c86d7408d6ae66c662648147623d1ea1e4d3eb414c8a93cf97c9f93448785a57b0b6cb80f3f107d6fa3ac3ef3b24ca556e32c54b2215fdcd36dacb33da52c64e20414d4305160c8135f1a7557736d73ff75ae6edbd64182f710250330ad1378a9fae3a551e4d2c660f0d889238cccdc8c53a14f5a81b195374035309ac0eed3417eb1e3b0edd20b0bb73458d53fdcad78d0285a5f816fbb36e3545c7c30cd651595721d734b9a24015b447c9eaffd6d34d692431300bf7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (430, '{"ob": ["15151515f6eedeb2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2ee2e30e61248155abed7ebdab59546a5419388ecbe47b010a6c3049c22a03f0ae1695d75163b98f85c3824e40b3f21e87c9c2ed5aa7329bd1c4a4c508bd5fb91a955d8b1ca685e7b57f1a4af0ca204a9e97cbfeaeac85b36db74a3c682817b0285bedb5beefbe6864a778c254f5a6893ed38b32948200dae2739f5226d96db033617363a7b58df8866424d12553e45ea1f127e621c33e264e4314810e1ba8e69716466d41061cbd4925b5ee2a23f90029a5a42e1018c10c6ead8d9b1140fe54cf2f866174599bc98408e2b28ff75fd9ccccb21e371dfa7732fb016e71bced263b3c0a380e593c3c967b71cc526abb291f1cda5ca2aa62d818d0f2a32bf011d9f5e196da66e49522d3ffc794558d42c7e3e19d356c6e0952a68fe8b7353756c7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (431, '{"ob": ["15151515f6eedee5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3592c435fd91499163ece00997a075c1aa454f8197d4e4ba807c0de3f292c3df61bff1db6596dbfdd56834dd9502a3a75780a49b62215ab173c9515ef95bbebfc9cbf31c1b80fedef78600f68a3898125f4e7e38263b6979dddd267004bfede300650d2b8d8e9a72e694e80fc33f1ae7633205d8595f65b975bd012fed9d03b168e1842ee176f43764c5fc37b7ed5c715e93a67b60bea7376475403ee153c113ed01618dde333ef4fe7c224014b494ad87aaab5dd6185c049c56e0d4f610d736bea71ec25cc21bc15aa47ca00a5798064c7c006f137ef85a9e5d30109c6dc4f7767864dfdb61b423f2ed8528f005f658dde73f93440d30007d91584db19cfcf8977c1364b1858afb0ccc5d00cceb545f2db77496f4e53d029877e7f513e9b142"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (432, '{"ob": ["15151515f6eede9e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca28f8d2c8bed510235a396d70c4dac45b624985b571bd5d0a728b0292febe97c41e10ba1fd608979c74960d268b1c6241c97ca33cd96d4a2fd4c3a338fd94910b9041e17a6b14cdd8ebe9ce3d93bf264c1d6485e532b133c00fd57efaed74f20b696ba0fd939f0c7718468e2ae882b96c3e741a20e45fbb488799a31ed363c0ceaaae447a7a1fd07162f997bc84c705a26323f4c7075b00d002c6e5b21bbe7c52cdc3f4355d67ee4c0241ec98df49930186280871e3e980d0c4ad497cc34b168051fc8313028e811177a164d246da2d98540423e071e163d4ac290d100adc4c5157c95ed115503f927ea96e911afd225ea3f99a0baac8479b24baa79f0e3e40ca739b09cf6fddd71a1740046d6dafc28bb79551f8dd8487c817c3d4216220ac1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (433, '{"ob": ["15151515f6eedeeb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8cc6d74141e92dd5fb88a0135c5a935871dfcd667f1e921dae1acfe0d99e64abbe4b2d257066cee5ecf63daa947ceda54bb42c566977f3ac4f539142fad63dfc59be6cb2b6cc720d4c45c4f510dbaa7fce6e94ea24b311c4e712aeb097b4b56f3343cdb81b8aee5d1b525228be652c276e4da5b42ad6ba7fb3dfa519de379e21bc3c3d3949cc62d6ac4cf20615d7c68a7e63b6e43c12a1963a96eeacd209b9c1fbabd8a36acfd9ed97f42724c5db49dba5616879913af1bb9d1823e646b2609b93700af4f51d9865608a418cd30dc4293cae1e4dc97ea416ec79d0b17ac24500f9981711471f44e5b0116a35b67b6e997b79eb3dcadde5c56dd3648c0e7b2b85f92ef076ace3020eba76c7f3fc22f18d77218d58a787fdd93cf2d86e2ca0ad99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (434, '{"ob": ["15151515f6eedef3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c471cb7401ab3b76f361cdc166ee46e5174e8ef0f3e5752977550849bd9b0fedc63cd88e05a8e6160d7cef75a23401bc59491d115bfcc6a6d7a4edd62262e54439772fc1a5038793aacb96e931faebec6b334414e8dd73232e3cd57ffae7c5a399747b17f979da6e6caa7784265913f4bd1ee37fc7769ba52218501a42e675b5cf71330d0480e0fa9774ca0722c694195adbf5976b34ab49e85ed0413c34cb11754c7aa62c83219d07c6e6f7b3ad7d87da54d2e167473ee79fd3449b56ba37d9956700bcdf5e2b9c9856442b25c8355d61ed026be3b861b99ed95e7b0b7618855deccd3bf9d40a153efce3907fde75bbd2f4add393de82e557b5bdb9b2654b4cbd83b6961fbf26ee4ab10657ea5870fcbda278a9ffc6686d18e804b260c72a366"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (435, '{"ob": ["15151515f6eede01892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9b311822e3da7fc872f86b79a09dcbc6be382f8c057af371740cab052936f6de09ce3a017ed9abb5729624766571523e9ee39c0e588248eef168ad088bf1008c0df27559be0ff4e92599d8a1acfcc35605a1bd20a81c27ec56bb2771d425cedf4131ac8af137afd9d717934eebb537cbab7a0fb57611e3eaa082f673c5768f3d656d57ad2936e1216d9c3703ef113d81ee8cb30a248cf41359e331d25dbfa9633a1811625dbb9eb200dd90bb3f34411b8d4581999190b951eec5472fdbdf8d6e15ac4f6c880305f8d8b9e4d67e22a37a5a753c178b7eac24679f978b04b5a3403a13b189e4183944fcb68e3053b0e8718e945518909eed51c3764a7211d4ef64e0e2184d720f7e36194e174202d7a141728d81d1082177e32dbda6b6666e7b81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (436, '{"ob": ["15151515f6eedeb0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb89801e085650831abbb2ca30535e59522ad758255a4b74bd7a2375e78b3fca9acbb171dde99809d858df5a3500c8eb96f9573af59ef5b2153f8faeb51d45f7ca147ab0b38b3d27f53916d709325e60b28a07b56d967c9a9aecbbbd377c9539e684d02fd54a1ba8e80f4915e31383028733d31b7ead386b47aba6a13f9b06ef2928c6cfa254b242db81d6628721190667980f6d2abb3f785073e281d7676bc46cc6b1d21e865e404a2611935ea078a80ca853a7692fa1b17a465b06519e3779e9687fc2a7afb2dea95fb752ab59d435b54a6aef264d12d6d582e7eb68abfadd028c00b9c29615aee3d8d6d8e5d01e53289ac0df910eecee95c3b0aee58934bd0bbfa9fc4a9e248ce19fa4613e525be939b1ca3aabb8798dc18650a9c4e7e225a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (437, '{"ob": ["15151515f6eede6e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c56af77a62ff41fce29cc3c26493d32787083b95d9bdf45eefe148c698c713a35f18ffdd4df5bd8d5b463e6a2a27ed12df6722090dab8de017cbce11282cede23c9945b378f58d7db3ede33a041073a3c4831550f0396eab7e60821605b0f5e039d3a6cfd947d5540fc220ab73ea9e718f5f12c5e6a7859e356a7b59656a2ad49e228623922120e7ee6519f6ad1b0cb0a8c898b3c2e102f9abebf44ce00212f1f879353014a3fe1a8dea38f12d5013b976a58a69824979ea1e54b0046dd86970d1e51515277a364aa49d7bd19259646ddab1db2026b8b7b4df04705b465a0db0055e4e160cc176ac7ade5243d849e9bc7d0c900b57993c10fe6a03056e70ea4beee9706ad52dd7392c799076ea66e00a7ef0dd86fdc4f3a2e7df699cc98233117"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (438, '{"ob": ["15151515f6eedee3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9696353a417e6f3420f5345b3cd6c3deb5baf70886c5674461da7e8290834da908f0eaa5995e991197ea714a2d413ceeacd725574d3aaea665b7cb925bb2cb8cb49ac5c9c86b5657f8bd2d0c738e2243be76bdfd414278c9e1c29d4964677d6a1ebca47d6041faf1af65778edc60e94ca3da74de7286b1d72a83d4ccbce8dbbf9725ee4cff5b8657c412819367a6381811757511ffc6173a05837cf80607eaf760932ae6e7c5d1e527c33b970ad9d771ae70edeaf7865ae7e9159d2f6d0f6f7852ef3bc3b137ece66c0f4494d1acc87b0dbcbaf95ecae528abbb7954f0c6749055713b11038a7dcd6c5d681ca26e875a76633fd688292c9e2f720070f3c0396347dc49f657716761d0b2ee594c6a71d106a74b15a8e343f5ff4c8d1a6bc38e4d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (439, '{"ob": ["15151515f6eede68892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c2755f4b5777d21a8182fd9596f57f47c7a277400de19c691436d88c5e22a29235d54eb839e78c2e46d38860bf74286b63a07c0198501e040f8f8b5546e4d920f7e7d0f9b9bbb0e4b274f3d82a8af5152cb2e82945150e23300937ea0dbffc8f0ab599e9afacce23cb95d80190d8cf634fb45fbf07f1d70aa9d6927bbf058aee8f4f071abca1ee7a7b4fafbce606d953bc02d9c2245ec53d55f6fc33a96c8e7759cad16115696b84cf08286e8ed1a84765466400bb9baebde464b218e74ef4a2b093c0e9d32f470e21dc360c1a2c9d4fe1cada5dfdadf2bbabe8d988272a9b028dddafd7c284c92f2f4508eb6b42473fb7cb5b032c52bf14ec59ac94b336a79aab074cf05d446ca04183381fa2920a457ef7e5d512c4f5ede4d9dcc9681bcb5ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (440, '{"ob": ["15151515f6eede02892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c745a1a4da7312f90a06398b1864bdbea74cfd30f2cd4a7046bae97558af235b378776220653f400734cdb4d0d9bc6d178300cbcbf2b63294801544c1fc46f96afde71477a9548b512e83d48954478cae0cc3f8db3833ddbc2e91cd23fe6750e965698b8ab956dbb172fa0889c34310ec29e27ece414f3ac708f2786c4660402a73c6cabf376464d922542b4948796a2c63bb3ee9492696f416dbefc86c4195408a749c1be95680ad38e729f70d115e0f2abc7f974f8954c3b20e76c550d951ff4065eac4d9ca8119ba9ada3e7eaf043091c6df29c58d3b06ad324424ff7910fb2c36cfd5d1791d07eaeafa2c3ddbee654f624f88db9e5e89f2c922bbf741677fd14dac6ad62b91b7598783a0511893d105b6716da10d98bfafc5ab2365e4e39c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (441, '{"ob": ["15151515f6eeded4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c98486a2619d27db6315b523307012151d25880811d2220089a990adc6d2fbd8fb87d33e1477032efaa05f98b1041e7fffef3e821f34dadd6c26979fbbdc6e5741f120d537139c62ee6c4704abdb13859f2649afb6c2533fba81f53a19c26ed75e83c64b15f72d165cfc98d3cf79e5a85841366698a867f351ee75717ea1d3fff117c63f059a8f835ae7ded546f86d33e1ac34f185f4c1f0ae7e820d2b497059c54e9ded3172dca78d1211e36f19fad11eb41aded62c05828e10f9698060edd4a7b595554c548c69400634fb3ca0256a06a71652b0605485ef994686653f2df967589a7d2e83103125011095cf94d289cf2fed2882af0c584cf8b88f50b388463011807fe4d94ad843b5f5d9913c743caf3705a621cbf81cd3c8ad65783b05418"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (442, '{"ob": ["15151515f6eede1b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8c42c3dc1b0ff1af4c1d95b17c674344f931cee8dc89fdb08570089dc9505d3e5fece9960f0c46893ba42eaaaa6786dfca61476d45f0f7b57a2c57eecb71fb4a71f99e6e7ef3a14b3cfa8307b8ebf0dc5d1eac06af3e86988183032cda3aea61a36d0d647eb9740824f1a056e938e5aabc658c471c7540610660745790535dc8aabdb69c67e3eca7cfc4b4e43d3da455f207022ba80f11f7ce93cb8138f52b02d45232b2a408427c6ca548631a8107f113c980418ba957c756afd000c027379e8d3913587fddaf7acc9fd98c69cf7cdbc4d5ead99bf4e4289885f3549214c5025dab5b378ebec13733b032a1c874eb3f6d6071b136b81a1b789956ad3383b82439634bcbd6570d5a58efc5293b32a7f714cabb399c48d85c568003755e4156da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (443, '{"ob": ["15151515f6eede45892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf24e53267752ec0a1fcc2724b57b3192b82b3e69ddb7a5cac4c9784ffec7acc97c04626105d9c8ab243707b0f4832067e5b8266831701f84a47871587758aa019922600b6c453f222f29d7e2146c5352f9f54aef7b0a4307ac4ed3270a75144c89671a1c49f1de4a0d491ae0b8e4177e0a0915dcca48618123fe13c7e0b64a01ffd2b2b6490c66b168eb852721beb572c0762ed7fa5bbaaa0241f6206e8a502f8c0a95b063bd6c36e2bf26ad150533ea3edaab981bee64a629af6024e2b82ff09844ab48f36653e4571e8506e7fd2cfdb451b0ab19e2cad6865c30462dada98875d0130894ca61d383c28bac93a6e075e59f88520fef6cd47adbe47fc5eafa263218a2fe9ca5f7e5743d88fcba49ed30d032ec1d2cd583679c2057f94b849469"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (444, '{"ob": ["15151515f6eede53892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c99561b52fa8432f94efd46876a47812f0d0c887310589d2baba455c07b870d692c9012930ab6f77639bfd1987f56445c1dced9e6912bcc3592832a7a4fa2839e4e29ab866d99c725f6ce15a094a21949025645fc0514ce3d759f1958381a3bbb142e3062cc2fe047a270636deefeaf493eebe7812632d0763f3b5ff0f795a7af6e6fe3f315a6a2a3fbc90da4e67b8b4959e7931b6323590474d242b2883608c6a149ecd332374c9fb8652d5e6d661c76f322cb8d60646d302e155fc14bfe8be5ba53cc9ba1b297419995af043ac7218c1887092c22877c3b9b1f852996b5f7ddf2286f138126a8b59ab04df0f1c32a7577849f6e3b964b47fc959e7aaa630bde78cf64595044c0225d5e2618475b2b8b5aabcb4fd676a89ec391a87e2e9ab2c5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (445, '{"ob": ["15151515f6eedebf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c221711be1af74e59082d6673e78d50821a5d59637c7301e0f13162c65b299510c729432b57aa3375d7e02040df65ecf9208fd455bc8ef9db9895a82cc368be87874873e80c2c90feb61a647c11732a3b6c89ec8e753ffd2c33e8daee2a5ffb285609cf38015ca00c1a594c7820047624a7dccf019ee8855ed1ef62fefd6adb18763f625d1c75ddf6f03cd6d185ae9f914a77b3e4219a148cf2301f5870fd66d4f961c4f7dc52e5bcfa88892ffda52c23176aef84f0b73e767c4c548c3cf0bd5a02e57ae165b9c3c27ca12e669da97d23d4fa3ecd9833b117270f36684e3fa4038969e2dbd78fc2ae374085513fb4a48cba2c72382d0cd3114b850d38745309973eba224ad519da667df8dac5012fbde4ffc7b6938a3d8ac4227f430bdc607e8e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (446, '{"ob": ["15151515f6eede69892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9e0f8a9a82ac3d797cf60fbd98642a8da98baeefb37941d287e1b1ec52884b5a56391332a26b1df4d2f499ec1406217cf5a753fc76d653d3cd20460d8272689c077a8ca1a05c597fc182653424ed89320d2da6683f9a3a296ca9c08caa2781b6116c2c76c29f1600ed6c070e7a9b43217d4c71d7a1f0c88cd4ddc7b56a1157f7beead2c0aa07af786bde65141dd2158826062703ad164f28b03614e5e7296dd8091052d6b3f2e7879e5b1acadda446dd684b1955b0ca14199d2480859c356681941ea35cd480b9b4919482c06e960b27c26920fbde4601e0a84078bfe4b2dd8a0f0d6a8875cb31a181b03d54f7e32903cdcaffd97fb9b9cc897c9138679da4971fdb8ec2ca239afea2e03d3257fa45c7ca770caa8441a30e2b89ce1b5dd322f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (447, '{"ob": ["15151515f6eede89892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c71a3f859a1e623c640134f079e21026344225cd5e8044fcba9007fd38b8dc5ad54b96ba00e1e362aa39e1e24be754e2fc387aee22b2e97eda4a4a87e0d81c48aaee061a742a14660289b578107f7af3dee00c95caa5016a48c653b437d3b07bee8913b1489dcb23eea67bc99dce2a0fbef8d93b9ce2446adcb8abddd2caddf89972a6f0d00fea0d573fbfe59926e4aad01b59ed2d79cf94c8c69640997b25aac1bf03eda5fd1f169769b6dd4ac25c83cd574d8e24fb408b8ceaa252a9b5c5c8fe6282e35caadde794571515a388cce2873f138ef6fea795242fc6b3b17a64826482571aacc71c867091c43648ad196d0ec1f4ab3508d1fa786991f5d8ab3cc4df9cbff9a451c449165b56b5757f82bb0c680bc52d446b270a666334077d70a15"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (448, '{"ob": ["15151515f6eedeb1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5de53ba799cb89c740d79a8981f1c87a122a70235808475208948f1bb645c318a27c3fcb01623ee1930ef3ac7c22b2bfd0039dfa747be51576454b81db5fe5e5561306f06577fcaf47e9c72026988e8a80c597771be2f3e44cb2be694f260353ab67b3cc65e87cab6ddea63f4eefe80bca72a71cf655aa02d692cc8478efa71a401c9a922cc8ebf8ecc41434ee436886d00097a6376c2080d77fc52b74cfeaed8f43860471726667440385af42ff631ca2d1fe38ec4d1fdb3d51003a95599dc8b287cf29cdc793254e75b072042f0dd34d885fa2a6bb63a73b83b53b6fdf088f231850ad3c41d731fce7d51cbab643cadd2699463f544a622d8341d46b2c011ea9337d77818ae4b632035f11fe2a18458eb882fd70319a28b9cd95ecddacc931"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (449, '{"ob": ["15151515f6eede9a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd846c5c871d8cb8439f4e67e210f5dc23e675ea28721e71d2b1da7bdd8891c3f09d36019fe2ef7ad502440aa01d9dafbdeb41bbc6d8d9035d3432eda1ec9790f1dbf87401b2d7850ca2b22ff67d46df5b4033e4b037d7fb2e31f715d9aff67f8402e12c4f6873a97169f492a7cb6da781888c14310276bd05abefaa8b7a9cb1d83c62c92727cd0d63b7d65213962fc4e1fc868700598cd2347298eaa99d1675055773e988fd592cdc5590b10a4c8e95fb41c1953b30715d16b021d3e51474a1c25dbf23e25f8da7688fc70752518c97335f31f3e5674a8bb46fca1f9687b06da8d3c8a150ea82a099e81fa5b3ca8ec583b2ea1c9904b813519223bf88d7e6050604ad7c8a8ea7d321e881c98e2a45c29c3d2b401fe97dca747312a2599bee71e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (450, '{"ob": ["15151515f6eedee0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c51ecf1980e9ca395b7e08b00afab1dc6b07ae87cbb7fca43712c010214e2565b59b99a2f5f6f38d86d248bda793d2fac933db7a37755fee8a9fd9023860c29f5e4ab2b1d466e5fb7b8b82a255ca0f5a480432ca6faa828dc042cae4d88e91836f86b0c21fdb9732274361136bad5504bb24d1f2fcc456d77518175beeba8dc7ad7ddba40f79cad1cc702e7c2a6100a158f9ceaf250f647e97189d7b949d39fc6cffa152b8ee6d2f89c7691fc2e3c71a86b6b70c6684f15fff193276d633a8354a09564466520181ed2d3a199ffeaf21a1d2740823f017adb8944d9b0133d78b00d23abbc7919d847f120e1973e87a3ecea610ac1267b78e0b99f70530ed1bdc922f965c0eb54db76df164f845b947e1b25fb208523c8e93fb9f8d8bf1117d4b2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (451, '{"ob": ["15151515f6eede09892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c12429f6d076cbb95cc581501101dfc0be8b11dee300c8ae29b2049aa7be74719027cb8375d16efb6b841c489d8e210ae6e0fc2102d01fa7a4a2f95191407467c38c964925b053b0325ff9b4e51f49bc38ba1966c734fcbf224415a6082362fac756de93f18c44ec3050a00fbbce7f7794257e44f9c8bba13af5faa4c2e46e1e631aa3b921513656741782d32a93faa3c76da628da8feedd836d7a78d0ac0bb3fd52aee8c1ae72744b0789e66c57020352be44213e15690a81886bf4f5185ead74ea82a1d7ffae4db99f05096f23e0ea97847098869627a12fd0bfaf0abf0754f2852e32a9a2c214fb8a203d430d0cf058d19627ff0dc0edb5d33115f7fccff19cd83e9f09a1a5bc17346317d26c239ae1bbf60e63068bf56ad89400edfe0fd78"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (452, '{"ob": ["15151515f6eede4f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb5f4d11baab83b5115d54e4a7dec7301b39177c97394be3cf91e58d134cb32bdeca3e9eae4f8a4cd7954070dce986587c2d2934d890dc8b058f44257c27b77c209116f0a772afbd3740de02a2cd2629f53b85e2d5f437a1e26e97f46d3bd57d44d01bc42c4fe36a1508a9134b00608908836902d12c86d3afd7b0653dbbe7eb31904f6929488be2665b610ede9d403c042d7fb97e6734162e52348ae14351b7bde0a13d84f4cbaaa3d9e068a80797c6f63b75096bb841ef1b18711cb343920e1cb60e650be5f95f2214d7021084b0cb7d2b531312f377bcf4039248761608323e4e3a60254e648d67e207c68b2ee71d5c779070c46c6d78dcf4d5d49495dacfcfbde9d467e1d44ea53ac07afb1dd104803c4c011a7eb181fa154417e628906a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (453, '{"ob": ["15151515f6eede19892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cba5b5bc8a6a25c7a93ff47912137109d18d3fe41eff3ca4ea5a80df11d5edfb11541a59348907f575a6e94cebdca2e06ff2f2aa0318431afd4e88da6fa04416fd3aff6781a98b2fd853a74f96e0f54888ae85922b4056b7f74933d76b98db613ddf24a683004c1373bab0b5ab973bdb56a7dbe170690b67ba5b8e5a669d3b5ee615a3d63e8c31d313366dccb999102768c48c54d737a3c151056c6aa46f96cab1ba533916b9ec81c989cf256f498e58ba0feb5dabed83f32174975529f29ba62572098c38230dec356e68dfdb3b8c1639576bcc22ff98459dbedce4e621a6762135a24fa30a2f893089d4d0f35f56decd936b4dacd659049fa9e41c4c5ed96dad55141b76a05e1bb507c53b8e9b3e2b315bb4683ee5e6d3cba677d3fdd39d23f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (454, '{"ob": ["15151515f6eedecc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cb022cf36110a17e339d8638d8cff32d1966681ce3b677a493f2b379776b8e8c528192c65bb01fda0bb80b96ada8eca82152fd2fb027258b0fa3de708f2f88c9e40b2576e5a253cc8dc3cca5434cdac3c28a83806341f94c82b11c2b5ce6dcde910914785798db4f38960bdeb577db76bee68ff17bb5f85218abcbf88d8366933083df99f2990346d802836e9aeb26e972f2fdcaea2d5de8f8d4f5299c903631fa65896441c664d108cca303fd22682c8dfec73303341e04a5139fceb0d548a6f474bf1d2ed0a7b699b34a35b7a912dd492e4353a60b141cd2c7fa7ea9d9c296c79ab2b94de2c472bc74b28e5af69e9e1c283ef07c3335c8594fb5934df3439c8afaf76a906a86df7d27028122ab7b1813bc2fbaf8d3c7c33609cb8da9c87cdbc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (455, '{"ob": ["15151515f6eede90892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce1d147e28c026c299ec46a7b55741644658a346fd3491273a62205dde565a127a372360030ea19f9ff6e2ba5e8aadcc985769e30b48e64d812344ba0ce6d18efe7880113071093f441d02b0c5c141af41e63e4a14ce0a171c478fd00d605a4da8fb793e22e429daa775dfdf6ec2c302d7cbc32016ebad655119016e2f82ea0c9854d27bc7f58b0fa724cf4f9ece92b437f222da0088b1516826ef134de54ef9a89163c2c4efe2949b8c0b013b93b53b26eb379e377495069636c71e356965950565034b5623898bf5b0cfaa1e4bc39b5a1af32254875fd9bbffeb274174cb7b41aa16a83cc57d1db7f61ce5a51ca4b37087d219241f6b4426fd7eda4f55590b09c61ac118fb14ed7f1dcb86ae593a6ab4e9283599fe597682960b2eb4ed7486d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (456, '{"ob": ["15151515f6eedef4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9728618d0f6db596974af95fba0ea2492b3a555e4678e2711fed2b9351e39100b4e0e87bd154c29dc34e5b8eb40b20e99fd612a28d9d51669ad7ee370aa7aaaeb12ea68f8cad7435e12481b8c301637893ed1e63550aee04f57cb69693e76eccbbebf53a27c8cd9e871f807f1d43b20f5cc18e655ae7ee509a20c80e9844bfa71f5d8e0bf82f7f5891d3b5521d9eb99637daeb9bc17f622ad095f95af4a68b765387646f7e29132d35d74b9ffff2251ed38321ea8489fe73cf49d961f04535c6a3fd0694849c9ecb11821d13f1a408c1909d76e777be24dc3b2d440b27fa720f92ad0f7d8c11d2858c5ce2f19b0b5d616dbdd94640927a16832edcc2b0e506004c646c39423a79ec3057e38bd7b1be4247b4c157615e1559b506683f577d770b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (457, '{"ob": ["15151515f6eede6a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c1d20cbdf0ac9aa80ed999bb98eb0fe3ee4077f1c1939c9e5c08ca171fc7076c5b272486f1bff5aaa6a2ddc868275970f3e060f4dabf8e41222ac1d598a46a1497e130ae6ce923a16fe81960358d037df5a0927366cb3771ce776c1471efe8a1396c9ac4d2d2c6cefbed4d075e5df980c3e6870aaeedc69084efd39cfb4e3f7cd9527af930a5b2343ecc825d2781a226d33e59c0b5d5835ab4909dd3dac6a6c811120f1cdc14299921fd06d70373dcc87d9f7ae4a5aba03c14d148b9364c3fc67f677a5eb30cf75255b51d29cfa0b0389a17bb0c4091bddfc748bf80602cba39e6d5ef2bd5d41126a6a63b1a71af670ee304b958765063c64cf148fd6ef7b0540a6be0129dadc44dcb785a560a6e6b06713255a2120ab9b986eaf42fec0559b41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (458, '{"ob": ["15151515f6eedead892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cebfa924003eae4b857948bd66a1884297089744e8f4795e8805e05d6b22d35206c5d201bd6b7584672a057b5bf652553c86734ce16ed1ae9c2fbc48619cf550a6d8daa08c815cfdfc1181c9daffaf5d490d8602fad07c63e941b554d2c47658dbb5450e28c01b89e2663650a59cad830be67bfb37b88b081780620f89eece9e0f48513845165608fd56c7e7159416ba71cb4f6c7334bf419170b8ca3fe6fc13efd05b237ab5f0fb15c925b38692b992b27a7d6dfed9a038b93422aba321cc84cd6674192499a0b5fea0576e48ec4247b704916090e23e26521922202d42e7bc76bd739a3f89c60968cef017d5c2f8144a45ac53ea528a9ada1e5a97c1db1792455fcf923912a2e5ac1c48a576083cf2ee2a8dae01f0ae1b6294eede85860eb08"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (459, '{"ob": ["15151515f6eeded5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ceec2dba1152ac7384097ffe827bc90fbd187fec9cac86c2b674b365efb25cb6dd51d71a37798a78f5f2f9bdda91cbdcb7bd48fa25f46f31e2ec31e1a0d02a6effbc1ab8e3604de499cb84c7675a0c80968906a58aabff244fefe1d844cbd85ae9cea3aba76cbcd416ade8afb4c060791bc907657be2362c0ca418627aa2817d4d9547c69f7375cc3a9dfdafaa76b1ffe6fbdbe0969783dd7894eba046cbf419e98fab0fbd1cbc0ee7cf13b704377177b796796b75d1b44d05e72983c2a0b1b3384688d1a79dc046a38465dcc6ca5c47130a744da968602918d9cc02cd224b0075130769bc1553ba86d75941df21d04bff59928cf5549745ae2eac8e1e3dcf87cb7f6d389159de9281c3cb33b3938fdd4056889e50f773399400c374fd080ebbd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (460, '{"ob": ["15151515f6eede06892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c11832a6055974d73d680bf981c7f48d6c5d9e74386cbbe92548b5577ff6e9de17211d8389abe3c107c15aff1848f7b0025ca0eb2486474e6edd717e391b532800bb6d7e8df693fcc53c80a5d653549c27a7b03b023647236baa6259b8c278ea3207f46d17a84bfe73da6dd9b0d04105d79082c579574dbf88fa2add7a133fd56b85918202795d167238f00cc8e0626efe6ad6b580ec5c94514c4efc218e875df3599d45a80c17e8c04e9c59c783ed9f25210c2232fbc5fbfc9ebbf3cb702cea608217d79d0ca5defa3162f0cb5575c0518b4936df62a109c09c51f0418f1ac0348cd209e864b8932d34aa038c2ffdbe341abde730bcc3580ed4eebf3bd5a3254fa73ce6294e3c287be626b972565914041c80a6b3eecc4486700d54b5205f797"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (461, '{"ob": ["15151515f6eede5f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c914b3ce2b38c603c384a546aa7b9c6a4ca1f2232366b1cb48ade083805ec3c8eac7424524d42e29b6509baac9fd47ad3d06087fc5e72f6fdd8b175bef6955a5569a895753bcc016ef0829b51c8e36ea28d973e9550b13c361dc6444860ce2dab8c9bb78f3edb197479c61618ebf6778f623b66885c86b8a19d2ba31e6be25d1beaa2c06f9e92458d4713cf4279a9cca1f096a5b988acfaf54db7529bab8b57c0ba534fe1dd9590de6a3cb92b3cddbf9f32ece29ff80ca641940d3cacad2f802f89b017c1aa616e2c7e2a85f223dd071556c927fa7e22a9312aae4e27d8d0f587940c832e1936f3b3f2f37d0791a9d679805454ea3d5012c6c1dbc1072d3fc140ef7d96c92d024957df2db8d1dff259dde28fd1c0914a8ff2c810d83e611930b7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (462, '{"ob": ["15151515f6eede66892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5edca9f3ff64342852d6d5115fed19e6745786725546f14dc925affea322d4c02e63d60562db62b66029ba710b25b334ef46fead0bd3ee97b3d92b2f13aa6eca66799832b52a27f35b1c1277cb56e30bc231e68c8dacd507c436da29764c452089f607c2eb8e0d6c8d2021ecfde6b8150defaabec6f4e968c090137a3cdf9c78f299b7ded8a04aced028abf3c24acac5484358b81bd331f36c635caed5a398abaae4b21d5e099272ba303de06002d64c7d710196e97ea930ddfd370556414671510063c8c37d6d93e81243cd05a6cf300bb07b131c35e6598d15fc8228681dcf514584aa08fd5e546b56a0ef827733d82dfd37ec0d4f1d1b6d976d72adda71f96d72288720b893493d1aa528f2763ab3d6c17df7b9df48594352263890fbc878"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (463, '{"ob": ["15151515f6eedefe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7ea5211d43afc0eb3485b07cdaacef967d5e71ef5a51e83a8a3e37cae2b26920f9ba50b3a718ca2e887bc346773f59e9050e32a2c12e3fbd5231cadf0fb2fd9c9cd5c33635ef625520c839a16aca16ddafce50b26634c39ec99c9eed2375e13019044c27c242347968e9c711d469ff166bc6521f53e4cd78384dea22fe25d0d0104facc9ddc8bb95385fb3358fc496549b68b7cb4192cdcba98cdea07d2c8784a7ca4f7bcbcf2361db126fd250219ef0f62273656c6c61bb3550baaca15cee288d5818d501dfaf3e627135b58dce22540391369905074c7850da8482aa4d45b685c972fb0c223ef21137cd3666c119374d9d47f79511cd73bd2406a33d1409a46900006661fe7969a7934e389b711b2d29c34af5110080eddee60ddddb595f8b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (464, '{"ob": ["15151515f6eede50892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c06939339093af18c65eea9a0e19840730731b0ce0a580c3aacf28447e82eabc0d4bfb7e8a7daddb071870cda1a820394948c387b5180c71f8603cc6c7065b495b1a6f058204d78ec52c9030688761105f47f55bfd8668c08af29af7ec3d2fb3178fbf29a4a8ae03f7fc43790304ef8cee4dbc70f0f14a42ce4eb9765593320318bf5bb221cf5131b903dcfb42153816975d12277b2c7095e7f78ede51fd0d9ac8dfba902c9e7a1d53945dc812bb7229d89e97724728ee6457fa4568a63866fdc7355d406011090e8517b511bfe4657d8f056f4b6c3ceca874e248f5f8a9405b9d0b815cc1a9441b3ea1c5dc2d3f78013adfbbb6a0803c721047ccbc8a5efb2b42294c6f723d7c72708027a23d6f3eb01811a6539716d7e69867caf6d7e5bd59b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (465, '{"ob": ["15151515f6eede59892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c630458feaaf1c7f4820510d1b6000b9b3f72defb92ee6d179cac4908f5e7230585bb0019ba0acb09117009f465934c12b797ffd685b02fd45265d9092621bc963e5a7ccc6a49163d68f0564ebd2e362cd92e96c6b0aa6efa50ba1312e78aacea2f55a547c1548d0fc91cba41aa56f388e7f9ae2667fa5b9aac6c965f322cc185270479bf52f5621257fbb09ca5022c1eeabde493cfa2cb7950eb0a758915f9d17b024c0f95f06c8e0b85d471a92b29857eaf2211f8fd5ee12553482f218692a05190a0491ea103a5136ebf388c4371401b4b501ef6ce0bb8d7eb5ae55ee6cd05ff7c5616eae982d077199c74ad5b38d9dc27936be79058d949c65d69af57c98b5cf9d80abb87a14283a811bb7abb9e660a67e0db302d6e4ac59ad4d137a4b36c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (466, '{"ob": ["15151515f6eedea1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c88761d474f2ed4e1e41f1b00873d7b2dad2e5ce61aadd1be93327c110bb2c878c3cbeea144961bcd7ef3780ada5b9798848147a15d8b7f79737abd9d9e6af935540d738275766d885731d1106b0aafd5736e7c1dfc5663f22382cfdcb4dfc5dd5fc7b45e351b8d73b264147c408b9b0eb299e831c84f0f31464e3d41ea8b9cc9117a32b758b8f5e1afb3e01857019666fa865c3ef050304d7afaca15129e0ba8ac410136abfe4b3021677c3d68860567f7fdb04621afc109ac9627df85f57a459518b1e1133baf314699c436f3a437d87c2f1c2f31ffc38e6070ecae8909e5a49009faa6605f9fd7314b7088c40409d93a5ff5e19223d5fcca11610410a794a7deedaa39e288b7f20476725aa9ae4a9be8db3545635040419e842a26c59ca02e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (467, '{"ob": ["15151515f6eede03892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca720ebda7920937a0b6c2b767699f7754d8c203abee88870e43df2c27ca5dea3de19dc794901649100be34f04c9d51e4f4ddd6c6c9734c4c9ed80cbe3bd014508df9799e8b01217990315daa06b7918d39f58d9cb7671031940a7eb7f2e40e26be1806e3f22d91f5ec79a3edcd88d070cbf0920821159911092529cc1a75d4b8ccd303612feb6d912e1857c68118fd73e8fdc528cbb71fc714793090a1db28136a1636ece04caf5539dd0c3c0d42a8826c8bb3f2cc439f727e68d671b23c7ccc75cd14c5ebe503c7e138bce4f3691c0e5fe3433d3e576e632a59c753fd3c1dbb6456faa3f916a14953d5b8612d941418203d7e3340bbee716704c610b41b8136f0521f8a803e8bf001977186f5a5c5091cce9f4c0319c9573069adab04c5c050"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (468, '{"ob": ["15151515f6eedef0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca1086d3dcdf338d0bdcbe48c9a1be862cce88bd74dcbb0067423765220c435c1950e728fb2e5701a23552d2b5fc77d11cef15df0b4a903dba1fefb4f2717ee91ce875bb6c6eb20247227c18c5bb8466078718c100398bbd4714cc6034789325e67b90a7834c0f95c34c09402ce81a10ceefad79ac65b15aa6f296393c621ed0db164e7d7470f211d5b306af8206d74c7bf3108fc28a285ec526983b8824fa90a228db1a57fb8294ee88d992a1962eb5fea1bdd16fac3350d4e3d6835ba81123868cc9b788943bd96aa13a3ed73fa5f71ebfc1432a8347b173c531c3fbca0b166d861124c040f2a359429299136d50bfdc077a3266c91fc6c81cb475e9a1ac18ab843ce0c7bc15c7f3bf0eb3cd158d355eaf6c3047aa3b2366f64db1cba431a9a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (469, '{"ob": ["15151515f6eedece892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ca51411e9d35a835979f0e5af6ad2b014c1ae000a6c26d443f3e9f66c200251305226f5a00972d7ae2973f11b51b04afa279fdb3db2deb1abaf72011c63c5d44483360cf968bd279c91abdd3dd8170f379491419456ef2cd27327770aaba271c12687f71296f8c94afcc6a9088e9b6b970861ce08d95219636d2522a1583a4863785eef2c5f523bfad115c76482d32a954ffe2788c9fe4e4aa7d566e300094dfb754b29c335329c73386f575862fd80689a201ec494886e720f695d9b2f21401406c0ea88f370aeda290f6294f0c0f85b21e06c710ebabf42cc9d3438687be4a3cf3d8277fde7a558506c6fbdf2f1b4b4e634d9b85651aa1e1426c93733d832ebdaaaa49e8adb73aae1e09f5a34b5a4b93083bcba32c492819d57129a61cb4475"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (470, '{"ob": ["15151515f6eededb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc4cd6da7f4ed8ba81c9d8f8be7080f40dc954f136bd40b0b7012645d9cfa220c93fb9cb7f8b8a4499c21129672413483f0ed7407e2880559ff70a60719f169faf762963d5c4d5d83750b6df6ed60d8a8e700ed7bd3096f4a08d79681923be088227396d3c0b21920af92fedccd99938c71f8b890ed21859776b19253ad5fba730df48ab866677fe492c268ce3cd674fdb6dbf0c1a91f45133a79c5f3b27e489c745ca9005c5c5ab27d179f960d8cc71d5b506ffee39bab0924293dccdec0c340a341781d2781ed04d4ab3f9f5a2fbab4e1e78bd5904fdbd0350619f2cdbcfc9d4241bc7b8812841c0ab73911b89443f14c8e3a5bc5a16a013f3b1b3b7a0c15e5d3c9869c1e3bea5afaac36d053f172ec063d5b0d711f2174d02c577224c04499"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (471, '{"ob": ["15151515f6eedea4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c85c55e24e3e57b460f1a448da5c21080a962ec530aa6681f0ff020c610d4b20362d2764cc8e8f5b066aba3484f739c6237b287a1384a4342e35359e13c3ed8496e1b434c33f10e1bc2611cd0f19942cb28839d58a784439a9ce01f89457c0dd171a566f3510744913f065821a63c745415da5b45dfa093cd1e04cc345915ca9f97f012902c2fe02b918c7cf4577b8400c9312826237211668400b7c8e46408ffaba394d843e3a53ad97355f280fb5fdb6ce0226b817e28b817eb4245be6e01b61a2ab224bd56ab4d439c14594eb046949994b72ac4ad9c625ebe2ac3a02ddc1961fc2e8ae7067d10f11469406394697df14d6fce4523424beb2d7fc4c4bfed0d874f38b17cc44022f73045e3f0bd98b7d8e21bd1624fe393fd411881f74e13dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (472, '{"ob": ["15151515f6eede35892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c3e27a8d1de1ecdf988b6c1b5d2d508abfebfbe66491829ad1e864b3f848853682685d2d1744315a72af63b05057450d4a778ce16651a8a71019818bc84d053b750201ebd402566b2598f1a3f36b50d23531f5cefa7e182e8b0be1ac1218e775c162a4860f32dab1501ada40fa335d531fac1d5e4b4acb091c4ca07dff07477579027fd850573a7067615c4baca232c56d48b8cc1930869c0415372b189c400c4a43a94b81174cc84825e068593806bd2cc590581c193137098500d786cc89109554d7a3f224744d9e51bb1e726f1a1ce285f48e688cb0a7feeceac4783b78ea12a28448d9fabab042881c76f092eb3fb2ca8a4f990bde55381853acdfd554619c27880fd58a58e6815db09a2ee17e7660434a9d0884e3ba8bb09aae93fbb1aa0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (473, '{"ob": ["15151515f6eede5a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c09d68584cafa1effc5ef3f46b45fc657dc87cf09c331a985d5612e72c23cda3fcbcbe7fce113a1743bc50d60d7206fcf00a132f343bf123068bf8ee4a031887cc31d04b0b2299bab032dc853c71b569d3aa5639772192d5b926bf81ecae3d365ab0494709357ab6a0ccd48830a036fb97cf60795c1fa5454ec8c97ef2325718510dab3702f435bd5de49480c7c6e3c880716a6ee467a0196a50ba3084bf7029988fe2660225916781f3a6382216b1f1aa6281180d3ae5b7e03ff4a01575f649f0a8a220dc3be7c98a8b464d9af99f7c52947fca7e900619421f54c43b9d3706ad0cc5b49a5306a93f963d8d2dba7f7bfdb9ebc2ac11991c1ef399a668021feba5cdeca92759d5a8b0a899893da1ea1988be3ab6be1aa3dda279d1e68aa9e9497"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (474, '{"ob": ["15151515f6eedecf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c883c9d3b0ed7eccd4ecaa6c54eb0c003aabbaa621aa225f8214387078d74b69593df87d5cbf4ad09304abb688ff69de0ac64cb938249f0d7aa6470ae5c85979ccd3e1c53929c558c768de2a68fd48e9028b04c9aab3f5970cc1c17322a504e54b46d00bf08f485c9e0389b3b389b4ce0e487631fe49d383f77754c76c532cb7c51b2cc75932687ec74f10701c4b9dec5eaae2fe691426f31bd4497762da5ee123cdb8d35f7f40dbc26bbbf83c33d409b5d35c1dc65f10d000d27e2a086613648eda8e053816a375587035926b7c7776187d41b0b1d03a68ad0e7cfd8a034c86109518e7ea80f40dfbe8a091a288cfd1b7d678b56fdd3ebf4419148f1852ef14af6bac2aeb9e4cd04cbcf6c859cc820d3dd24c0e75a670f1c79198343c64d7630"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (475, '{"ob": ["15151515f6eedec8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c81e0b2d1ecfb8c31ba4c91231777171a9e018d2bbaa83d2904b12e5644387bd84c94b2f94b9f1f7f41a9cafb06093d09abe162ed84aba82c972e665b056fe6530ce69d0a2932556427ed3515c592006459df2d9095a22aec720afe0ae3854e1353e9e55a4d39cbaed112d3969f1d68849464f07d58ee763520e46c69ea08d2133857f03e16264fa599921dfef88dfbf260ec1f0e87ed7efdd78e21784a1727a72a1597ab64d1abe3dca1047e0eff2c2d492d7ea0bc593c949f21c9529f2cbc1810f8d02577bb37ac5088da2879393d172b59b4ccaa6b20f832956e594ba0340e0741b697e04e33296af84bd695a20c0caa9a9b4dee4844afecffada73d2113b22b06b46dad06835e92c9d2a86bf82eeb2537e9ba712f9cd9eeefdf115dbf59f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (476, '{"ob": ["15151515f6eede0c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c24d50c2196108efe5528d86a882b614ce26247c9bf7743d68e8b13feca0d10f008b41c76dc8ee97ad4e45638ba398a203b7c5fad71218193b5683df7e6efcf2ccb62b5862d1565fa278584794d5980e1223d11cb2cd5117755db0011398e52ed0ef1b32684ea4896065b396fef10ce3195b3ad79569c725c4e1a9c459a3ff5106a7be5abb52210a316930b33e02a9b9c384bc92828d940b531e6a5a84bd0e67e4a435355a0721f1eae2c1e398f753a4105e5e64de9b7871d1f856d27f9364cd4777dd662a468cac6d987492cd7e993ae1784f9e5dabd5465afe8b33a475313297a6b932d08103d770772ff7d4fe5089c2c54c14832be0f76a9591a22f40160a93ea982203e76f2b4bc66d6c44052be934df3386059db33d11187a7e80505ec5c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (477, '{"ob": ["15151515f6eede49892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c5ed57603956c5b69b51ee3e427ccee58a3ea7344543511950e2e7928fa8576dbf2e7f7d63490197e085bf1682aa95e7fa311f18d7bf9e7e3f05265cb547d196b1652588a6422f10c6e3bdca82e84d9b1f384d407ebbc5b40ef560a0facf12ddd19260f63ada29841ffa8c0bcc256848bc0618c989c4f5d5787bfdc1e652377c69ac85bb15fd466f4673f17f6d5428a380d001e79335fc5610ae1fc3801a4efa73789874de43e40f44ba75bea7693c25c074306273862a1ff3067d430bc36b2fccc5426d1be25a648b3c3e43fd27e384f43d12e26314c4ffe03e2bf8b88e730f19a0a79276986c9137f52b43022b11db4e7f5dda5d9e2eb38a120d429fe1aaea2be4e66025422762cbf365a50b74616215f65998f13c9160a708f1e31b38f5e14"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (478, '{"ob": ["15151515f6eedeff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c7204fd7f723fcf45deda53ba45e78aee6473654d959181da90bf69486bfc95535c950ddd3c72d577eed49c26579a009711ebfab0a870446af7de745255ad726e102650a628caa27781d7fa27b53928603be97e518bc98507b5c37a15a6898c539c65fd7b38d08a335e0eff3faf05e62e12fb913c12dd5c2b176bd3e6edda3c59a7721643a97997ba9ca7e5173727764757b9890fcf1649b1a3affd018609531e79b1c74e894b84d6ae7c61067df6b7aed52e79f97840292aee1e356e06788a310367d1d0d2d24c151171bd503d8cc98258f6b93dee4113553306cb9c93b1ef149c7f19e8c002a39bb77465ce72d36bb6b9e183b973a1a19abc935200c9bcce3e5500ebb4dd15f50d66dcff448ea82b9fe586e2e44c72666b509d65a62f2711d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (479, '{"ob": ["15151515f6eede94892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cbfd7568c1a0540cc426a2dfa8777a93a1607541e049d56afc8f4de06f1a98c7da0ae8a9ae1344bf3aeee4e473a4a45869b8d7c71a8b6506a7fc60bf6835c76c44827b82e6ee4b2dca7faeaee44f91fbb680e467ee402ef2ee41a1f10d82a424c7e7674d582795b1de0826d09d7f1cacc87f13bcd382f86d5a34c57f4096d3e9b504bfcf8fb6fbeb256c0f419e21462f62afb8db072e195fa4adbe1f79e5593c43aa923bc540bc5aebdfb6be53f39761a1a053efe4fd84bd2fe8083a0f951afa77874eccc3670d0db71c66802735e13c2f42c0608726828f72c9bb4a73abcf080095de9472901afc8d52e949c0dae47e6a379f217e3ad9e45dc39b4b1b8f3ee15da7daf31a2afd2099b537affe0825599d17f8e3960b13769a569f12cb7b97fee"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (480, '{"ob": ["15151515f6eede15892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8fbe1356438f21e3d66293905ffc4ec2b797bf842b8df2fb35bf3de2e9684fde09533729568e6785b158a019224385dd5a398ed8d943ccd0fd8b6cd6fa471ec82c65395787bfeb8d19c677783a4fbbeaf430a7f28221737327647a6391902d53b52e3f32a853474b095cde471ebb4b12bc4bca4371d475f790afe74d39d0da0019431afef8ec52c3cc1d9758e18cdbc89cc5882204008f6e546cb60deefc5fc894c2e8e5d4026d25435270422975d5734ebde729edf273b9048b6234d9d21bdf82c8a67ba0031365b2a45b5c5976d12f94f8b940b01b33ba7eacd01fc2c61a77f69321bf1ee1d1798142554fd5e15cfc500fa9833b4839b42f62e4635730b85f6e30ae6e813f83aea5e53013dd35f3cebca5c3a5ec6ee92a0429ff4314f00ea4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (481, '{"ob": ["15151515f6eede4c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9d2888cdc360db9803c3498686e4ef3ab4a3a96e92e3d307e5c1b0015172f9ddd578926de2e9fb9f030adeac63f03aaa952dbd4d977b68f168d1f83441565458f00143f59f81693594b692fd04f95ebb6a2de0382c18103d00ec4203d6e8b8df0e7add3253ae1c28568e3f76267e4ab393cf3739fa9dd5168acb185f6e4e827efcc3aa35898ded2623ca00c4b7f7c21d3fbc50f70ccf0cb7651c72fc8341eafef3f03a160af8ea3be2659e6219fb5868e1681bed8efa80096d23d2ae08ded718fed947a3ab6f434e459420ab754aa8ba609607655c0a8c77d9ce642b05babd42c96f97c20a96eccbc1816b5128319377010c809d43f363ebea630826c782a2f5d69fba02f596eece0fa55942ecaf8df36fa03f5cb3d2d3e890ad865515d6d34a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (482, '{"ob": ["15151515f6eede6f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c13088c4cb185612ff6bccfb95f1a09e1af93a763c897270e8b65f18078b8f20cbef62dedd5706ebb99fea98cdb64059efdf1eff65670d8e7945dfba4d06483ab371fd1b3ff7f58aaf24f11079003d615c5bebc741b298c5be368906e171d928590a926e8ced57ef61440c6776b056059aa6a282b7dfff14479b50e97bed9997595a67973980d74e4b1fb79d348d729104481b68aa6e7fa3c89ac8af0060667543d7f9c14159666f037c786f7bd4aad50bbdb99ee59adf955d7097b35120cd886bd4e59dd480b6859facf47b710e4de50c373878fc5b28f23660a62156a0876768b45a5fdc2d232148ca6e613fe0ac443a70f7b33afb5ce073f354a74ecde493b5aab9774c123901e1a78d25cddef67c39d2337aea72697fe8bdf8d39866ef2a7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (483, '{"ob": ["15151515f6eede26892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cce33ecd089445d4b37f427607fb56e22dcb4a7a5ad01c5aedc3a7a2e30c18fa0f4476d56d06b21ff6cedc1fbf4b3e1d66e5841b40f59ca5ace41f475f99d333adee40168b123ec9431065fb66efc4ed7d3d852a8ed6bfa300644caafa560bcb391c7a89ad3e8648189555505d14dca0b2b16024c03783b2686a010a45539fdc266c8c3db2c7284be3659446ff01a807858a4558409897ba6e5e44ff7efde852f4dc5d03907d19564fb550d7e611387b6a3cacd995cae5b86c526c96d152094fc95ff47261290f259f85541913767cfb09714955cb62166be03cada8765f3f70f3af31016be8d77865ff5cd6287eea199bb166736a183fc268f84a22650e00c36bfaac7ae68130e674544ed3749c96a566218b9ad7187fe0a14b11ed5f9e670cb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (484, '{"ob": ["15151515f6eede2b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce4817c8591a7e960ad9177eb95ee0fba7fe6783c79ecc9a0cdd8511f8a64ef62287605f89bc1e4a9466fa4fcb0b086287f43ef08f78faa5eec06f3797f9108e64a2e9fda0ce6ebc5a70e4cd692c45e75b1d3868417f10e33c1303cc8f5b2ea9c5bf5a5ff52f204d35d38ae2bdafcb2d3ec3f2243d901320f1f95024714e14e63e6b7a1350ba0e013463fa9f0e2d2f0b1a3a4bfbaee84fc3aeae738ee45d004505d088a6e90d711e99500bdcda4845775dce5dc1bd230ea4d8696d9d20bf5d0b88fa6e83f69acca173d96578b7aead617509d0d0ae8c26654338c6264598a56a220031c4e5d59c75f52615dcd99fe6c29a9d553aed2bf312fbfd04d9a31d84515c8ab8b019568d45f6dd35182772b273784e0172b1b9513f1be4e347c78526faf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (485, '{"ob": ["15151515f6eede33892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c72708b8e487c8736a56a6fa324d28c1ed06463645d92f313497821596a657e04b26f9d76e858aa180ea767637209d3f451832460bc7ebdd1051db2ff3b36ceaffc83f349e288aeb29946856b8865b19ea6916540f2b78379b4b003d4ab603e2378b25338e210006bd6bf13a8e3a1ba23ca0d6000f49b74698d2bd30feab810adcc7adeb25e61c04da76bedaae995aaa0b4574e6378f2083a6c0a5f4cc1eee566ccb19753c81f37fd71eaa73cc7802eca54beb77b31a7ca673edcb8337834e5beba308617d93991aa1e4f3230c112e4400e35aa918f7b2d21d8ae6d69af42cd436d9af9b61f640f2f6649632ed135cb68af083fe9a5d95cd520007674206acb982c0586a840e85b72c2344861f99d1049177b6332de3a0c9ed420bbdf3971d7b1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (486, '{"ob": ["15151515f6eede62892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cd9051d32cc0951a65c9ee217e2104ee76e4fedb03ecdd80417322d92cd02e726403b72f6997e796c8341cdeb1dfa9d5924a2e36c37f400fca2fa5934b28651babb1e3a8f68b1b041a9829112937067e9828069ac4303210a4cbd1ebf8ae310839dd44eb9b94c16adefc61c1ac4b2793d55d71fb9aaf021f91cb83feadb0108c06bef6c7904f059081a6a48fa21803a2c1b0ca463a7d9d9fde5734aaee94995a152e2f08dfd987d8547903d9244d47b5f4b597a20bc3bc665de8fcd12e877c91db77eec2c6743ae0f4778f181d06e85755afecbb2a8e8597d5781d47c47f1ccb3defbae1d7e8b3600b8d1ccaaafac96b8800f48cf150587e2ab568d94c92f88b13b3ce7aae32b18396db0784bb8573ec7f7cceae6d7f3a8406d2b9266af2629aa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (487, '{"ob": ["15151515f6eedec9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c13c886a30bd7eb8d236cb544d3866b62704a3efac7b03563db59ba67ade74d27f3d4f22b68c2bd5ffd89cb4b3e10529abd8052a6e99483a6cc348f7d41fb6686d28684c89d1f246c48abe41d2e0a11ea75987f12ca207351f81a15e763e70063b1e5cba1be9394994d7d57e642f4194baa567a22c174fd70d17087b6a142fcc9be15cd109fe844b21e74de8235b98e873e4ad0277b47c77c9009067617c8dfda17a2e127f4bc11d4e0ffcb1d144b2d18669dacb94bd96ff30c6fdb429e9cd853ac92d5e839b41ce4f360744319e5b8ed43b127abeab391c02b0ae04be35cd9c60962352d5556178affb8d13afd870431497305f2eba01b95dc4efcba0736bb1a153ad63c0a2b278641ec0db8a1298e2327aa1d00201eedb73ecccf2ef7b3b6af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (488, '{"ob": ["15151515f6eede98892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c0c64582641b81fab33a41205e661069a42d4e58e6f3672b7ee6dee9527ea5bb8c1100f0506b4455c2b741ae57f70167ae31be041a4077ec7cf1fd8619265b87ebeba0571fdcc4962a548899d5334d577074fdb8174b542bb143730c52fee326053d49f3a22d5ee88ce82bec2517352c61698415d81644e8438d8cea9793d294c536db2afd95d62aebb7a1c11f698625b53eaa051dac69340927727459d10b7e0b06dbf17f715387be84332e950f5bccbaaa7e6bd9ad96062311e6933ae1a372d7d3696c74babef44fa42ea387b5a405d2395eca808d4cea8550dee8dc9e0ccdf8834c68185d63ff92562b6b4e3bfb3047d3147f8a228c4463659af6aa1f5b6139f528fcc0fa5e9aa3f6ad62eb5edbc2e4827dd0f314aecfd56d51cac1b61927f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (489, '{"ob": ["15151515f6eedea7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cc320ecbe78b0031c19d798627b029c314e91747735d24abb76d01ca630804294df51b1988459ab4e07058439320aee816902ce9657ae9094397c7dc1dc7a49a6a09ef8ea418c55a5e19599eaa627c8b5d9249687dd9d700f4fb57d678f6ce8e546b502b41aa92efbbd55a911d8274f0d730f122bd012be3e3404c286b3e751157d36f4936bd135a6ee4523c75eb3bb7bccc5db99db6252ee18b4eff30e3dee2ececf64b4d6c0cf8a2c1ab7224499709e68c3f72661a914a44698740d7a831862d9e3b05fa8cea9beef7034f437851312430477e5ee63507fcd07fc354aeccf06280dd1570c22b41acc17c3b9e26eaaf11743234fc92ccac23b448be26d122f563731234b3fdb6ced84d4f8d30e0b57e964d3b2418de65ffc674016648a3684dc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (490, '{"ob": ["15151515f6eede7d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c85f9090b96835559a6f49b584a7698167b31c01470d3d5670a6fa84de4a8de6888eb90c19a5c7a6b913cc8db4b838224e8f7f281e005e7de4c3807cb002304959e7dcb55e75d3fff1208b0bbabb4b5d99ca382470c117c5dd18ddccedeb5e7bcf538d5a7bacc03230cdc18604a54f509c9a115d61d2719e0228ac0f96d4a5252df07b60fff688c58934c3e73f6e3337c6c6170ee2fda3822ebcc884e1a1b2de88f65217b6a52f635da1a75744ff643f880cef62f6f6e4242b4da8d0b520419154bfc6e015350ce4873c1d876582f1c6939da527249ee60709e82c6eafe7f88cacd7d6a4d0c2b80db205c65067626119a56a28d2266195c9596b5e58f0546cf497bc0d640bce58e6a124d54d0939f08f7bbd108e2a08912ee95ce459aab87e356"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (491, '{"ob": ["15151515f6eede34892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c84cb34ef51a7e243285c8d748b56ee7c301c7ebb8c0d86a655f208114c79d0e722a21b6111cf8e035ded0a3035ece3a23edcbea85dc0e03944385254e342ca2a4d740170d648140087c64933dffd891bec6d0e7182e1c77f3b9aac75a0a7df84bf16a699f353aa4c8c268755eec84908db179441050a1724e351cb4fea171756ef6f53e008eb9f5643b711db077706134b7aa33793f690541b18fe640856bb0825eaedcf91abfec468366dbabf83b1dd6639657c352724eda158a2e2c2aa318f0b456b25dabd9082d8219c399fe54a4865b5a9cbef0e94eb6f22570f40bb443ad2b6b05c15ff05d37dae1ead8aa240dc5b211ceaf97cc54d1885fe4155bfa4475d21d0d68070cf9245c0f13832707138bdc83ecdb719ca42acc045db86b93c16"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (492, '{"ob": ["15151515f6eede1d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cf25a00acc976f82a8a8e7ca5cccc1e5805bb3933bd69cb802871c8de828adda82b7f30a736306c8bc1494ed747bf7940cdcba35c66addaec3a7d42a98be7dbedbff21803e3900921e9a152a49df661a939ce63e38036a2fd8f827d3869ddd83157a1f50f916367a0d147483986bb7736069b309aa572018427c088869697a95ed79dda9b5ce916f1468996eda57edfeb75c1c7cb891ad6c56abb579b7947ba340f1bd8a9c3aff89dbdf9aadcd5194b3c5c627cff2191ea47eb48f63d3fbe10ec37b409a1a8c82ea14ab213dc6cba5a01645a58dbc6d1b380c8d9afa0cd15b41fee262b797534ff5d6d44deb4cf3ba083bd1803647b385b6cb22c8b142fb9f2caa000a2e4d40d187630a53f6828724dbd80b1817ea14197085907d9fdb442e505"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (493, '{"ob": ["15151515f6eede99892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c09ab1782bbcc1fc4c3a5fe79cba7ea1639b35183830e32e81d30eb5f31a2dc54ee7b8229cbb77fb55e3e0b73baabb808fa7920235490e5bdba7f90ad37cddce7cfe66cc15e2eb59801edc08ddd00683ac32c89652ddb92ab9eeeb1e3eba42409431bfbbe1bb43e3400ac6180b9c8d95dae8eb7a287f8962915337f40939ef06a403f6d47582e8bdda57903bf27223b0490137c67c6583f71d2c5044597a82e1d43707a686ca1ac2130ec097cd59bbd0c2ce7e58153083ecdc22c24c1e9dad87f7014c402413add0e6c3a209c1f8960891e4943ebeb216d5a7708d94d13494f2b4c38d39e91a3c1d4e81bd311d72510448e4356590a56c0ccef0ab0259b45c6a4fd35128d8f935aae74fc7015b208af0cffef28ae1a1903087e7c055c5653c83e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (494, '{"ob": ["15151515f6eedeae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caade3eb5d0b41882287d74503e01a8cfe4278e6c5eafed31019f00fe8707f459c36d96ed79d70fd51a67e63eee32883c12175555f1e262645b99977ba152de860cb3eef6c7e2f925b6d7987065a1bf4dce870c20feac8b4a5fe4674f2351df3c334fc8ef8dc151d3d3b49e4a5231027ea9b651ddbd512ad4dfe73159ef8475b73a8b4c9950222d4358efedf2c51dd558a0918fd6ffc811a4b9d930f630f6cfb4d2cf3ca3d54205d1f7c88b1afa59fa8f17f0aafdc5acdcfb04d6875ad3c994ae456d7fa86790d19618b2cdd5d8e3fd0b82161dc41988360762804f6f9d0b9cedc45b228f3d1fa0938e362df43086b3c38985764a15146e53f53888d3b0557ad339b0ba7129141af3d65726c96ebadc3bee7bc6c08694629495dbc17ebbf5cdb5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (495, '{"ob": ["15151515f6eede56892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6fe2b4f5a777b1b6213c959f2fc704cf4dfa0103d4a29ba2a9a2aad171cf858b8f500e9d800fca3b503a86970c70c18901e539e1dd284bdacebd180bfedbb985e8418fa0f6ab1e175a47fae197fc417dca69e2da7c2a560a1df2aadd3919fd5ca0c6f1c05f82a88ec191ee97c9c3619dba19aabeb7d80a692b16a932d2253fb78d4f4189d470fa38a1852ae4eae235fefc30f4e76b8b71524b63b7512913de5f3fa5eb99cd0fabe62fd52aaec2dc5678e5fe1f7a1a1533119d4fb98d95da5632bbdc4cb2c1f6f36ea7752a4a25beb43efc9ef8eae4625dd63bb9a28767e6a4ff79839891873cab5746ed2e07123cb8013762a9c0b53ba04b9bf8e9c4bb1442f282bfa9abcbbb984e1440a1c5b276ec2c44f235d71d02a426e8c48f3babee526f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (496, '{"ob": ["15151515f6eede95892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c6afc248b17dd5612753c8c553ab27da7133a9139c33ef4da146e900f78cf7b82b048bcb8b6782ca5551460aa89ccb27ff5691b985390e4daae669aa75b783d85612f812bc8de58bc18ef3ee875c307cbd90f615fb9f7e9451cd568200e29eea351046db24ffce3cf4008b699e8952300d61cdb8bcdc9c5927875d9de19ea8a482f74cd0b4a0ff698e5f093f91aebe8955285ebd52ce561a5a00521117b64de83d68bc842629cfb761752b48f4f43884ee0b37d45029620ddee2cac48346de34db70c2ae6c1096ad0a8f1469fd8cc7340429cccce9406f2b7b4121f53e6bcd9eee92c40a944224d1c20b8339f8a26d987b3703bf498e2deddd0b08f883d8b837fc376ced89fba5b80b2251074725a9aef017157d6ac8e8306dbf7c3a84b3906e0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (497, '{"ob": ["15151515f6eeded7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c87a0dfc02d5d8997ef18a48ce4c0b36c69ccd5162015573085193f5c8ad3332e8d244683386d3a45ded99e25eea4c6c02ff203aac7590e973b266887ad7419da2a45ee5cd39ec6fbe7f62361fae70ef21ed5c19dcf520a45fae467d20347512612db8a35bdbd9ba764f4db9adab50da6fba73799a68b486cc4cc59ce354d7720c4a34880d3e04c383763daf8e840e4fb9d852a0f76a4dce10f81f9bb151947bf0fc20d7d80d321c860f5e11e2dce7330eeb82356d26a1cb31de45e8f5206283035839a07dced09137667a842901001cac812ddae45f784db463ab5be25f97dfdde5c048ed3bc0adb344e2956dee5362f08d9d7d67049bb06e584f1de0fb8901e84553f58c353840cd9e9059a6259d0a25d9cb6ff2b66f22fd59653be4e82ffa6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (498, '{"ob": ["15151515f6eedee9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8c3eb771df0a23f04f0fff93374cadf1098febe3a3d902cbf965e5a55c5483aacaf0d00cf994a369173f8325cd41ab1f098192d83f3b03b166ca56e221eac45542929db37f6ab43e081ea84a44b45ba0c054f49cb3fbc2eb96fcef4c82b5bf6fcd04ad9d256014cccdb8cd63340190a1dd368a1c3cfba083bd9cb42b3e94707d625cebe3319f69ea928484039da70f55ed1ddc2e6f71c6f7762d765148f5b36710ffab41ff3b6714629799d3c4d757c9b03b1437be7d2a6e2d1b976b4965437033841512c807e0b68ecd799a1607043b5f7edad1c41c7e91b5035adec5ee8cf2c64c478f8e281c6b27f0aba6e605b07e3edaed962bd83676ef5fb93fd30cf0bb5474b7d7b084493ce600c6f8cd5bf145989b7395510f7758cc7ae7af50e30a54"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (499, '{"ob": ["15151515f6eede42892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce4ce3a1931b0e5a1142e70cb696a6a8057d32f3a027a92f014d8344c2bd1d2c6330a134af9b0293dc34ad8fe61b7b33548d40fa4cd11d494b3d8caa0359f5d06567217fa9a9e84dac0b87ead2530b5a0c382ecd8493cc99867a7a411d7939f040c81e138f696174f494beb1ac8874d8d91cf30b32418f95fd10aea04e997a4abce6f4fff03ce3398686e477f1d83451852147aac4abd3d69a776c5370eeaae53d50dba3096bfdd342a93b06483ed0f66670995c9079f0ab8e18dccd5f67b3908c08aadf862549ac0899a9ab337cb0168352aca357562e2988e70e8f6b26a7cf9d8e57f21ff2eb7f4b0fba4ed743166f86a4107cd33ef1083fe9375ac4b3c2d13a9be6adbb3f4fdb76576eba4737e9c79384c01781321d000492ab7216acd26b5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (500, '{"ob": ["15151515f6eede9b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c4064a0f054888b12e9661780b6e55ae1f448ea77e6ec17b151d381a3b52999827f183b99a37fdc3ffd976bcbef9d020772fe51d539c25962ef1270de148170fcf8f55771b64eb25d1279dbda4f50f0954a1754d3b485c902e24338e690130f8284eda9bafdbe7c6391f87ce7897c3f3d92d1a78c207ce3da9d2741530b25be7aa0c765b56483712d2ac6a0131dc0c518beef60571fb0f179593817bae7ebf25f8e49047ab669ce344f78d264c5d9b3753fb19629748c2fd935001f786e1cd52def89c205168a76717ac3a2b82dd91a7470275fd3b5d4af53ec8b2043a5f4b2f305f22ca7a31454d8aa3aa61900e09acfc58eb24676c93edbd32ee14d6bf37212bfd4c392029b47ba8ec956bf0ef418505dc4b23f5863f75bfb7294e8b53035df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (501, '{"ob": ["15151515f6eede16892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c32e10b52e07c5de772fde9da08931552c8ffe3a6d030a0657399f9c10e89a71aad48ccc91594a2ed88364c0b084354e7655ed2638c35569be7feb76db4b696ca21683a7c030f151dd965c8c4112520c0b2108e826e21046deddf6e7c768340769a45682d8f4e9f39f3e47533cb5f465e80d54e90b814440db12d97d7f3dd3b926223feb08ef40ef7fd4c40df4e53c7d53c12b6af4563eb16283128364b249387673f71ca078fb546199ec3807976e0aeeb67bcc4b165a0c0f2667a97e3b1635ba4d62f4d1d4d2471ab7a4a98149240b7559c878c96a31e55fa72a712e7ea44fdde162ab1cfad750e3852029a279b71b3f571dbfa0f0093e6fae0855840eb02cf1182cb8fdfb2a64d8f4b6cd0c7185c00049905c1fefc7e35f82fc79e0128dabc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (502, '{"ob": ["15151515f6eededa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744ce502fdaf28b920ca162b3102e736a60a07790d497880d2066d4fd2b1dd21620c6760c1b06f00c3da02e938a4521165b26044257988eb3c75813f42fed95860ad1b0b8119922831e7cbc1031b670dc3918c218586818f9d411ca6809ac819a439ba6caa4a2a7f1368a884bcf4cca3cb097c616230d9ad985e1ede5add78e74cf7b61737615c918c2091fa44262daf83fcae274e9defb4a2263f6dfaf0bf44e03d7c3907bb8b85caa54942d89114aa2b02255099a494fe25ffaad8bbe43faade71d56e2f8baf105cc448f6a16922652a07b1e7b9afea5b4cd2766b448013824976beefedaa0f61b52f04770354cf8c5a2c8e0b071c59f263051fa3bbab59d923f72f19700703959f939acfe1e8065a8bc10ce839aaab23ddb2d867bcfc19dbfa4d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (503, '{"ob": ["15151515f6eede46892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c20762c45de967e33d405e521084c1925b39d94c1712b2be1480720f668f51f4b659b1f2994a4093a429d0bdc164652b31b5dedbb5d20d1e0d9622f15f3898dd2377df62189c12febb06427aeae790d90a0ed265a4bea62d17f8a053a412a50b3d6bccda746f45c6f8aea6ca2c31ce2fc47100ab610663434e1dc52cd83f518b071ae1b899173d3a429f1a4fc350fc46d900dc85845a77d26a7fb40295553cd040e3f7ac7794808b8c4970c1ced64cfa30905938b5225b348481742268599a23eb5a7d3c91e239503a448dde827ce9e22f04f607fa30a66fc072830bcd3c14f12bb594b1086db875b34f482e9419ca0d8a276628fc88e7ae01b78e4bf4a55f92260f8c6ce4156b010a3e9ad10450f1a6a1a999f3587a485856d50960a757ce6db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (504, '{"ob": ["15151515f6eedebe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c9be6e4ff001f551204ad847f3ab3b781fd53835dd61f1526162c3db2b6648df836db112358600489b9f489a4519a4e8ac2ddf34b0fbe19b2a001b9975205eb057ec2af1119879f4d0f955afef053e84340803abcd5359e7e68e62383bf02810e4b243ef2966da13d557c05f4662597e402c62be6bb2bd93de70144b82524dc1d814bc39ca3a4a976db5a1d6fd1924e85ec6ece8fe008c7ee8f9fbcb51fb916910f182d14423c711d1a30fa2afff159c513a5e04b297c3fd4eb5fec707cfbdf963b52db5b43ec2550dce83a1884a7ee3e934d048c08ed918928bdfea6f84703cb462981d090fa22d769e7db88ae1d637d8a2b59915b53d62a7250fe14ac6a7b872a4904b0d6856898a016d4b3991b18d74b8f9584c80f62169caa39b38138fe90"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (505, '{"ob": ["15151515f6eede82892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caf4c3dbe39a1be27027754aac1a54fc8f0b6c0580e657d4003a5580ce19b21fcd5e31368bff390b620663258fd712a5c64952234458f83bf81e52d28cf06c589d9d6b058f26420e653e7e8630ed5e1dfef6c808d97a0da68518e0151541f519010353d1de4c9098a6e93cb4d98a80c22195bf94d951c6245f3b5592d3882c5337225dfe315b984a3b7e34a328e3e12fe8a4b5dbc5e9ed47eb02d7f903f2d7513390af2c446dcb3286b206d851fda49d8d08145280e508c10e3b092c9c65e8b76f7c13292ff2499c4af9c94cfc78221e53f80d00ccbbbe0f1b6aba223be056647e55e09cd57a2ac81946202fdbd7a4ead2bcf4377f70fb0d4753a03afb09787586b1949b112cda8c7df564a3e629d4172532ce3798c65cae740c1029f2a1ae502"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (506, '{"ob": ["15151515f6eedef2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c54ed1c81b0c4202267285b50d0cb6e0474fdc645de637238828a32f4a3f28716b4ca84490e79c4f64e1782c3b7a193ae38a6f6951c1784cd2979dadabee6545710cebd5b6611cb29e2858a3784345ce21fb994fd77dbfcc4b1522c6299ec90b89582e1cd32622532633b039a85277d59761ee37a88f4914cf9c782ec962893e20a3e4220b4ba85377638baab22c86a609adb0096911af3385e8cc89551809d380cd5e12aebea65d7f3dd8a095acf2111350c2846e3209a400e1e5ae4e146229514ae70716dbb03052c338206cdf0c4b9d4cff6c981f84361165901f4f338810fbf58b8738bcb56b1418c27038a255df995106728f99ebb17b6a0a230fdd336c58d55fedc35a34e51246c33503f37d79be0f21f8b509d4034248bd875faffa025"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (507, '{"ob": ["15151515f6eedeec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744cad846294fddaeece971eef421e4042117e3193e10082514f540042eb5e3c6944b101e2f635e2213191ef05fc3408de20aacc6f163239e54de5c2079a15610ff65de973c98e12be2e15a30be4d6896b16e2f2f14215fe345b6138f37dd9c8734ba22b08fa73c9816381b9cfcd9c8cee777b7e05372b6a6b608e1de12b39073775c3071caf9025852f2c3d1aafde2471fcd7ff47fd33a1c003c13e9c7b34b72ed6debeb9ea94a50542ab302de3f5e3c8f52c0fb0ad7b7e3d0f2eb33b575388b6e28b16edce1d9a44c46d3c141bd4a13e1991ab8d8513ba83b8569451a279fc7b90143f817d30ab0e4379ae0f62058c0313b7cda727be8d8a2db60080e5e58095b6c4dadffbbed77c0464ca544f5c7a1a058819193fbeccfa5d2de307504effaef3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (508, '{"ob": ["15151515f6eede36892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c36f89c48de0322a9ce8fa25e33e9a2265f5ee94eeaafc39fe13661cc530022510aa836b6c921e70d9009ac37550f9515660a244fd0c4b98c3d66ccacf71312055e01dffe030e1010365e3251aca0da0802badf47724579958a640b2fdc5a4911e4c5f9696abb172dbfb22d71965bcb8941a63a0129318f1b28940bfe3f232236ee904e3095ab40a2227bad19f5ccc766a062852dd457e1811bb9aa49041d7bf594d216c94a1561c1326f4b0e8150d29add71126da2c4a4c8991eafbc9750f5176e3e7e23e60ab28afa17a49190431681ae68298e49c16ccc30cdaf1659eca05dcce7f493a0c024161d82f2f25496d3f49bde2e778010b728b8193fb7b148f660c96ac29d4999b9eadb4596637bcf06221ebdf18e37e013b6af1b9a90eddb96ee"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (509, '{"ob": ["15151515f6eede57892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744caec1d93a823a5590fa6ca289b77facbde1e9ebbd38defd32f51baa5858c87080abf26c938445a7fb8d616bc8f38db4e32b314ad92085fb851865e479e4a7042aab42628da2af5a1d5dbaa34bc5c8fbc29b5345d8548508cbab6e5053004c13f2fe0159eb8397d9461f71ba6978ec18264bcc51ec46f7d688c59954b744ae42c48c74be78df941ce332030bc753aaacb30195a1faa6d7c07a8ce4fb1f9aba090d2d771ca1af2680a14400490c4d524a9e32ca13fc85b61c7ee209562eb822feb18a1b6cb67d700af7ad43a647f289026d4ff0e9071d096939999562d2898d42e5298b9e9f2dafb52e94eb6ea45fd3dc7bd5e0322e416c2b2bf14e6d6fc089e110d5e3b7d407536a17f1c9bcbf8848ccd65e2fe1d4001baf70f2f748c1f3c1ca81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (510, '{"ob": ["15151515f6eede3b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c030e3d1a50c49459540a49f5989e7a5bc336a20c2bc0589700990e3e8220638a7383251f28ebb2ba60a3997b82212044040418a454b36b944c9315736c7d9bd3c37aba755c8ae92886165ab0ad1a2e73499da5177b44b6c86c5844435a9f78833045fb6717097cdbecaca776604ff8a6dd10e55c74fcd9aa6b2164644cc07234055d51815349f2e8a82267a2e3518eb44ed6cf79aed441847bc5b2455028589c9b75170131337abc9ccab67dfddf39f389c002445454f8d48cf420a0fb4913fd1257bd51e59f7defb81860f9896e7bf069ce215e9331c61d70cb6361a1d3ac658f7d7a9ce7e2191560ca0420961b86523acd5a1b1c7665380a8d36faaabd8d735977660d2bcaba975387f6f12b6a1b2de8237ca75de314828e1dc86099565394"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (511, '{"ob": ["15151515f6eedea5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5fb10275687b236aa200bd129be19b744c8989dfaf3c9c781a93a499b992803fda1e54132801c42f6c665404ab58a2f060bd5b1b8ae3ef40cf0e8a5b21a5cf8b96f624c28291b4bb54a09d4f6cb73a46bc19c9d45c7daf38504ac86d8dcf0a6bb0637da830abcab94168ea88a7ef7b17f449281975bf30df07bbfb69b6b5c704d7f33d11d511d145e3cc772ded4c75411a583e71bbbeeeec05a384d8d9d13f3a0d613e37311a0e011061c6ac2f9d45ddfdd010f654903acb69fae76329fa0916b81d82864336037bb4ccdb722856fd287a23595b8826e5c585949d3aeb6cadb591b840c1531b26587d1ef3099ca23d31da12cadac4f3bfe19527a13660aee6914a88aa5f9ab69a054621d185c57184383c5e593f8468cf43a9445f44651130a70b89fbe25d4c9ecafdff430eb9b1ee3ba1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (512, '{"ob": ["15151515f6eedb47892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85794550cf1e3f6de74dd2478aaa4fe9d5d91ea484fc694bdc73c426e5240e6dd5e150dc3f1f1ee1446c8a1fb3aa558f6b1cfc2a963606df16bc0a7c215b013b5a641cb02a7069c7f78c026ee6a58bd2c4822b11cb72f95a7238b029778d63832af1962e37349e14a1073be54d7a048c9b9ccdbfdfcf8aefedcf5c38c345c4f7dbc03b204a27cc431e538df4eb62c7343ddd8c7c3239265cc7986f57f20ec190b4e119affb74ef80bd0e0475e3f42b99342ae5e9f6440b1e2e89fa9ae04775cb7aadba7c31ae2fd8b6bef6b9775a3a66b9cf839ca4dca01d57c28f0ba1fad2ae3611fad5ef9cc300d0c6b4983270f4360dcde1b7479ae82e765cf151b2d9db559483c1ccca3d90baaf8cd31bd4f6a042477a77aaa165da23cc01407307c4eb9338"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (513, '{"ob": ["15151515f6eedb79892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85816b9f881e1c19e82f81a7551ad000169e875d91c98b6b8209a3f163a8fd2538443b1c55071b9d9597d1e4e697529dbf1dafd9a87cc60a5df2f592eeb8803bdaa28c981673b4ee18d888b6917a45a78635e0ce48d2cdf722e71e8e56fea6ab7a81d0ad97849291ff6dfc8ac6bba6a40d5c64927570e1e8cda590e588f66441bb24b62a734f32a38803ead6599d4944cd711bf8f6e677cc45d55716a88cb62e3ea5371664281a85d006248201fa61e524c9962fa8c8278dee89dbb57703a01e5b5e046cfbdc48e3d5042cccf071b2a74182804552ea24eec42f77d0e306d7894e5322f0c5399627eb89ad94cfed021547bf1241802171053c624fd66d6c39d22f3e9427e58c1dae86b5259489d452afe42b0930b788ee02413d2c697028232ed0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (514, '{"ob": ["15151515f6eedb74892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cfb6c509dd7ad0a69172f9e691c3c54ca4a0a914d24f8d395619f6c857d01fe4c644ab552538af7928dfc85dcadfbd202c52deaafa4dc77e353db702b68ae191773680e2594fcc9f15e67466e02afacad4a96a7a5863856c411f7439b6ce6657d822acb51f2763c4498d3ef03163b4725ad5dd8c5fd9b2fbaa8c68493fb20f065b0d4b27f40ad014560d6e081be15dfa90c278e05f15969f0a52b698d6fd3f382a9cac56efdc96095e452ef64a1b8d02fe9601d9937e7f965d3beeefce83ff5bcafa0dc46e0f6d60825d4482b2907baf9cdf557bce44e0d38923f015731fcbeb7ba676d25ba635d6ec4fc7346dfff3a1e1c4889caef4cb74145f3a052a58c7b62bd2f614083d3f1311565a702c825ce4b4079e3a9d9b1c3e55674fc42ca9e6ea"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (515, '{"ob": ["15151515f6eedbac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85194f9762e9af3d2efa17d35d92a0471635cb5ee8e9503826e10937ed88d207f43191cd587ebef9cb8866a625c4190b1f5372224c4ab66ac217157f1391c07b955c7de1c8b058a7e1aca33c444294a9225606204ab9def49330ef65713eaed6a20657a1089d7fd7adce3e970333caa518da560a14bea6d4bb562d5597cc6fab001d53e1235063075b30b15fe629903230a846cbf301a627fee1bf0fa7acc5d525f13f2a1ac23ad19d4def57f70206941c2b3e0b68925affaab3034719fbe88d7043ffd70284e15e71bc4624b1cd4ace102ecac6b8dd2f30feef1587146b09110512710797351528c92db6b06ffdd46a3f87713adb0f84e5d4d364d9a740a79cceba24ac0f92640a16e3b98874abf907963f5b4716f04ea0d5585dc8b3b7c5c533"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (516, '{"ob": ["15151515f6eedbf3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c1f06cabb3b2a502b184e9019bb6851d17b1338a86cc2f20144d0d4ab074a2622791b45546c7a49ecba14efbda4bb572b7a9da61d779455ae49e619b0291da46ea14c1665b39262e35a66d3d8f113d88642ee43e338f38de421f4f7322b2b9d5190ab935a7b2cb552d2cf1d508d37b484679afdb240e4bc6b80ce02e1c4771859873e57b586e589f91be7dc20a03b3ca115cf26b6b57cb9e77829e710ec0f7a9347193c7d3ab68218648fff8a817384557d8c8d787590d64936cb2d3d60976e9d3dd32ba49c4d3bc895e81eaec98b1960fbf2755062cb91081b324228f7eda0c4d5209ec663bb5a2fa0e94816fdf0d67d1c6ecc445833a1abf18fb4545bf3ebcd076451d69a771189065af9df49e68d1ddb12655b76b534bb0de276b99d96cc6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (517, '{"ob": ["15151515f6eedb15892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8560f9c27d849b631dd0b01c84151ad4b30ff8ee2a96f80abc0d179a86a8dff144744cc25d60852ab2cffa917a0a01d940339e79f0ffe9329e2ecb2363130177943b1a89c963cd28565b99b62ffda55609f919fdba3f3bb3302c4169dd70cc6927d9790b6199070b98d744df79fbd38691f9bf48bbc71bef5be345965f9f28da3cf7e10ceee369c15ba4a54fbc925cd52f676f2ba3c850476a80083a713bbbac124ae0da8e2fd2d6677f71b04283d8105f46b4bcadfaa40f8d7c48ac5f2244628ff074cc2bfff1466492b23141a7c44f4868e16ccf7824f8152dee41dc234262e6573f5d23e222e8835afc7c8e35c18fbfef15383b1458e7a6e0a7e77950c66158b760dee8d2b45ee880728e16d3045fab5a76003b73e8a9c34c5bd6298365479f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (518, '{"ob": ["15151515f6eedb6e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f2914492570c9a104e83e97185672993e4a61b9714baffb3332721e2b7cf07337e387d39a99bd09e790f4ef0048d47ad3eb2f939a58bc84baea4a66fd9ded6b9392a69a42ecb82342b35502c0fb1ea6d761874687cb2b61381586dd24017bfd206486f7cddc4bf861d12dc09f7d476d6e7332b44ecc3f6ee41187e40a4e3a19cf35130d0b4c2b7e8b1424edf1e7804ada7ee4624ab87df6dfca3b5c48cf35993cbccaa642dbbdc874ffc18c695a3205193aa3fac0910b10afd232cad170cebf345b662bc6878edb025d5c7eaa9115d02774125acc0d89a02123e5c6a7961ef61856431c8b0d8080e90c76ff638e1da3125439bce1669974ba10204a4174f2391ec81dcb44af5a16bbc12f0a6b4868780f8dbf401885c6c519743e5b99c7efa72"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (519, '{"ob": ["15151515f6eedb6c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850a1624e88fa02af49cc46a6f7bb4ae37491b114d9bfdf50b73f5d7340e30debf7a85cb7d61e97cd2113cfaeea565113c6c9660b9267ae86479588db255805acb66ea9d14c42bb7a7debdd0d87ea78357c06234433702a9e1ea5d4d4a2a3b94a16e285ab919239e27d42152adc5c24f7ec726b21e5092751df1942051c79b0b11ceb53ab35c303048e44546d1aeaba7ab5dae744a89dfc761486f066a03200799aaeebe5619899daacfea2a54be4316ebe7325f439052f876fb9e1c578c7cc4e431f55b89a3fadd43769a06b6e3dc582c11c4ffd88ce0ce55e440c6dd286013b50779f893f46b320eceebd1f800fc4a631b00ad60c469e28a5140e723d96c3b1e2cfa985ae993b27026fe6d2bc730f51e727dc87df2aaee0bc36e3e9eefd37756"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (520, '{"ob": ["15151515f6eedbc3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857b510bbf000c42eb7a83e561744a63d6aa245f8557af28dbfba40451c73f60dadf9430209610c42efc9552e848738af36b78065d45ec6ff0b644878b8a3ad21bca0e81791179d151be745f00d4a23940acb6b27cad7d0036ef1941208858ba67b7058dac44b9ce3b445587237beb8bc0dbb653a278203b91977005738d5baddda5570ff4717863c334549c945a5b6fd296f7b53029542c6ac38c9534a535cb0e72d154dfe56122089b5bc3404ab4eba652da80a5646adac02a588200d5b62e67a58ba45be42e6f9f8daf2ed795d41421f00248bbcbd2432953e0d2ec762ad91fdf1af82da6e4b2cb55ea05f436955dc86288936003e2f81bef19896acec2a7384dcad328cd8a0a9b7ee5eb094dd59a5fc210530e81be557d3838fbbf79f26753"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (521, '{"ob": ["15151515f6eedbd6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8532755a4f6a9216f8d6863a0517000ba8e269e5b12604a2e400deefea508d48ce04c5323e0520335116c1054e72d71b530b1fd43bd66c4dd4328274da388a36542131818dfe3e021535c1e6bc3aaef634fbfd49aa2c95eab3aaec880b2fef23ebcb9d078c20d74d389af858bffb8dbcd02f5c1d94e7eaf8025a6a2bb829f5b88194142699765e56f4cdc9000de2c1b008c735e81c028091005a17c7f1a6c0d9fd8df90203b6c445f5d11a38e717359b9c7b177fd222c7a07870f96856adf7268c4bd810b00c7fcfdeddd1d8c8d7464c28cdb06f1c2d122b06627dd073544f383bf24531ba191ee939e767fec1222ba61601c9ce34f89260208ed7e325de493fb5a99d136d9e24eecbae1d772f04a96ef440c40cf6947ecc81f71602dbf82741ef"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (522, '{"ob": ["15151515f6eedb44892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854af925c29db30b8784cb8d91d04c5e11888046ecde3a246d82e987639980683d717192d37931a8c3bc43f3409475557872288a3e63ab452811050c5a831ec2dd0f67c2cb68381827f93524ef07ede31865ed07339cf3af092a25108ac9fc6194599fb38a2f98420b5431079f7428e0fe68ae04005381ee75d4691a3fa65021436b091a19f76a09dd9bce78a9beb762085b2bd7a14e58d7cffb096fcf8e6f4690c3302143dd417a6b725064f2c52839bf4ecdc72a57965a78e74ceebec541d38ff21c10a35769763a5add25b6cdcfe094f889f041da1b3aa8eddc590074c1c75545aaeae982a9fb581e4e1cc8b51fa81ddc366a1b8677ae36d6b1ce723be5ef6e7ef0c185858096a8828873cb727b0c5a493fe7a4cb7948d48bfbd2671e55f7f9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (523, '{"ob": ["15151515f6eedbba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ea34aecda568b1540fa6d77fc2029da238252bc30f8cb195e30f00d4b895200ed15abab968e1308d11c63490a3f80b4f1f1d8b17af41aec2da90a83fda288134d9cacb2667f0f1132db243a937e7706e412f61d9e21c9ba4cc9074a5b7edc3a9b3f6acae4e1e918f4e7ce4ba6090317b2b3246d744cf1f4fbbf4d276e13068c20272bd967fb0098da710ed6c213cebc782a88b503a0cf8bb8de3a187372a849ace9dee66274b0269ea403f2a8fe48eff4f7d70006876f5c26272234c368b54866ee37299fe381d3741d23a62f68a15352230c94c0cc8e72bd15af50c16931055511081a03c18e492deb5c514a7045b7b5770acd2a4b087cf6b00ac7d2649aa20d0272f26b4ac8632e78387a4ae89dbe853e2c0b5b9e37840fac64b5ab1fe26b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (524, '{"ob": ["15151515f6eedbed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85201d5677cd4b0b941bfe320dd36eaf13b88140e2f26a8aeab8ae0f990e854b9abf91e32feea6bea3b3e574d913492c5365a5a2427f7f2bcd3a616cf6c0d91db43fd45244592e0b1b596c0e8884a580aec12910a57facfd76340b47223299b99199c438707ab32a8d76882cfd57e105e68a99d8283f2c5e33fd6e9ab4bfc9c29d1166a115a0adb6ab82da88cbdc9a2c9f713f1f12f98de9db11e77d3f0842d3fb09a14991fcf0f5315e916831e1a483b63dcfb22d9699b2de99646983ea8c70bb52b59b9c439d15794eb3d727cbffb501387b7e6686657f9682d965a3fe7cce13da6f4cd3f93aa559c48d6e4a17b4e12500df41e7050b60fede8aa131a414c32d9707e4e6c7abde6ae66c93c8943a5d279a4daf9fd07168df97e2f62ed267dc68"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (525, '{"ob": ["15151515f6eedbaa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856639ec90ef5b32ad275cc767bf7c20d2ee7bf6c23d01cb4dd96efebb3b9ec9c64ec0b90615f1020639c04e2a3860c73cd6d76fd57b5268024c52cecf04573e6bd34434844a8abfe74ddace9cce72de6a8a03343bf99d8d5a07a7fd0be8775ae78cf2ad62bfeed951b5d00cfcfa79b69c87b3b88edf8d7e9a2166e4129db97a67784262568f7835744403cab0347e9088a0dbca128cdfae254b261d642c5dfa9f1b8213915739d92180e7fb247f6f022923816ff454f62ccf97b53ffc01dc729947ee0772b58b24b0a03b42252a9e2c5483be4bb1c681bdec32423a9291b248fe72ea9120870822dbd736b7976c9420461a048239d9d4d1ff8412a6e626846de7d84039379bdb03d4701ad8f20ab8470f1f519185a1e98d27ebc0b7c710912fe2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (526, '{"ob": ["15151515f6eedbc0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ff2871dec84d21f3c6b6db1fcd4d6c244bbe7de38cc2ca5cfbdfb066fa358ceb3537e0fa2a2c49ce8865c8e75fc47d24fa32da90fba9e4e652aaeeee482911b6e7125d23037cde5e77d062a3f5235bd1f20ea4838c1695e9096ffbfe3b213d1789ebb9f3a4f43ec8e6cc90722e32d27c0a801b91fea84407eaf79a4a43c360448d7e15900050785d17a92df5574e1b571e47722b868db38d984b6204ce7b8a03b0baa2d98e7940faf9297c2d7f1e88665097849006fb1932ed505480238ccf847d4e83ff082ce6144134b35c1620b39cd82dabe7331fcc08e3d7a3a3ba17941523635e0384e537deb1a9c39193c9edf296cfff3d8b12337cbb1b65118836ace4efcfc262c8378c5ef3fec1844beb8bb72d1a94b2cbc0c6b483ee46391027c6ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (527, '{"ob": ["15151515f6eedb76892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c48980e8ff1ef73b5958d61de894009476137b2fcc98dee9c784538028d0afcad882ca7afc36f7db266f9267bd143c48c4055e926259d78f60e6c7c7dec1217347e1f12060737668d36d96ff7b17493b075ba5e49fc602e73082ef8d7e5de20d39b422984944c1a3fe3d9b1fc4cb7c40a3d465c0b959a850b176f4eaeb16c152c82ffdd9dfcec21ee929d652390aa8e7d70605be7cf2802341d146b6b4e4ced6291917a05af8bb87d090e490df1071fa510870951c452b5f4d7d35de729b9c5178aa41774ba731a439292a4b137f892a5c6d22ead256bcf8c5ac75f4181502bc2d2622a2070b34951b18a3b9191f198f74983137e24231998e3fb6a8bde81829d4aa7c6d0d96e303df7ca23fbacb1b2e3871b4185f06d0e9d77da11c69d35235"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (528, '{"ob": ["15151515f6eedb28892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d61ceae6360ecf4ada00fbf6651183ef241e61e4b0a0ea0c5f6dba77919a4e413b437dcda8f71308182f9d8518d97d35f459d1d229dd763a8a2a5d15940170467d6d234c9eb0db4fd3aa3d25b14a6682d360ea2f6e53051dd290ae8557923138db8210ba802fdac9c5487c351e7ac2d0771fbc25bc83bdb270a8ffdbb4e97a719683915cf9d0c6af6c7af00a798ea73240d6238e90a41c3e72556388e445c27b8387f636bdac6466afee9d17c4d4c48156cb8993c108c458f682fe8a040041a7a71508f3341a77308c473fa6b5fa443891872ddd009c84b883309067d3a0dc23f559dff061efef24647028855081fc6e3305d39bc31115f2296aaa31fb81c3d3ea7eb18873552b12aeec2a70ea6797eadbda0032054b08bee379244f37d82df5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (529, '{"ob": ["15151515f6eedba4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a351ccff6fdab7056d03c042753c7f9ae20d3b925ebf6eadc1ff3027a6963052fe39b14d0ec982dd71dafd5143e7acd087592ac7e1130c71593f17be3306fdbea1bb08e6060775d7483a2afb4a9dbf9e4e37ddbe740e7004e012a15e7fd9a779a87552eb779989e9956022bd51a261134e89fd0ea4a2e9a06318d4a97165b070a1df93d8354e6772351bacbf110fa3ee8ae265b3fa666daac10c79e898c2e48bcc1658ac1f89997dfda6d3449260ea0957eada45e56ed55c6624305a8aed40cf8b7fba0e93ed0a72af64b93f4f4650af13cfd1fffd921e59d922587fed8856afe224c5552b1103dc784d7912f5623d73885f5e5a2e7a8dbb1009946c77fd1fa2a5228ec472bc40f47d3d12eaa636700644ec23c450b471ee8e167d39c47638a3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (530, '{"ob": ["15151515f6eedb31892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85741d7844859780e689665ce1fb020cbac04bd0f306784d1d8f34222457992e583f41b23ed84c13f0cc31a8c3aa81d0a201915a8c0882b568e580571cc6acef70e905298eda625e20c3d4880a4bab7b05c1fe3d076433b1901eb766138d5e64c38751ddc107a022839beba9ade516273f1a73e12417c1d5eaebf45740370064d6f6c700f46d68983a520c013133fb671ec50110d4d87dc164a3d7f8a16e967508e74be10e96850bcb7dbc8e8534cda35a6c7197e5916d5d7666b868aa0f6b627f80fbd9852fc0b44473679a62e366b6540bea5b809308bd0df7183b9b4f8c57e4d4211ab2fb79d921cbeeb7516ffa039c4825eac64a6be3432e64d4bc31d463edf625aeb6d2e8f1d0319dcb0d91737d5070f4d75d049d0272d5ad9c7b1b7e75f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (531, '{"ob": ["15151515f6eedb83892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858d39d433c430240366b963ca090393e74c189150ad4b2bdf8658f38fa5194337c320a47aecd82ea6e2cd9b3c54a47cf2a38bb2bcbf98a425832ca4fb2033e955f1b2fbc21905bf7cda2bf216da3302381ee416a5b7184cb2917135d7a889c88b5cc3e253cb6678b1950154212bf29d12a1fcf38fc3c41305e105f5ee2b3cfffc1cdd810a4c676faddb44092dc012d6d99a13373ea11074aeba23d6c314c689b3fcffffa54a6b6875b504ff614f00b287a1479cf82db3d70fa2b07a0be95e87a7fe5004560169f0a07c5b8e9ff2f516acd80545e96160805211e32b7ddf861f25dfe13761bb848710af8b69bff44fb33dc6db8a5ddb951547a23984d84f2051d5312280bd153d1f1f54db2efe76fbb20b2549597ac3dd01a0fc3ea460e000ffcd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (532, '{"ob": ["15151515f6eedba9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cda2e6a287b0387e727bd665423f55dd91fdb2d64244502552f53dbbd256c6f73a8dedfe2eaef29bd7c8e0a65737a45a17c065e6a07ac94a3a8482077b75a098069e5593b90bc6b6c35bb3e7bb56f0cfb0f7e4a794a2e9c6fbdb6cb5e59ee4e4c6d92ace262a140970d6dfcbc11a0c9573935bb0b6e922f9b2871b32f5b7615ab2ca3f08b2759fe5a159eba558f4a45234a1b58c258bc1d0f33f475a4b89afa0b837cc1d8c4ac1fe4e810f50af8617d801fa08af2ead77254b2306c421a945cfc86f1ac933b047663e8bb76a345a39fd447d85c297133fc42e8c898fcb2c7cba53ce967e1c43f6d5b53cb4497e6cc64db8b3aba4633543db8092bf89126a8223f96815b7af392bef95840d5c83bb45107590246ede421f34cb3d87254b1e1574"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (533, '{"ob": ["15151515f6eedbcb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b8739babc3b539fb9779032bed79b76c8bae7ef1aa9eaf246798e15a3a3a0068c67df6cb173783adfccb2bb16a817f6154b79844d25cc7e8eb5c0a470acb429f744aa68b417b30dd7f3fc1934dd58ee6a0c1cc3c89b7a4e408a62fd9ce4e519873916437541d6317d36f0cfa58247a2dda69d044c02bcb601973bba70a8118375895e3fb2de6e60eba84f012e21dd4ff1d70c8aeebbbeebade1c79709c6843d95bd4620d50bcad3024edece8b764e36e7129d54dc3c67c1ddb81a9085aea460b5728d8efa68bf7581c37a4188f99002a4531f41776ec7ec535812763970054b9c18ec291a03e6adba3714418123865b3dbe119e9d92968ff3b8dd27aaedc61340bab208fff30f2476ba98ea5253d7eeeeb7c38457f0032c14acb82b06ba7fcb6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (534, '{"ob": ["15151515f6eedb89892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856f6b785f7f1e123307c9a736f7ef64a6d367b8a856257dbadd390776d52391980f3143046a61cfa0713e95b419c3369ed30c27a7f89161df35c9a08b8c32fc397d32cd003a7baa4856e74163e9cb1938696f0fd4eb6c0a67a3c2a56e2327628d4ef313bfc5f2a3aec92444a09b742805be5494c235b1117a34fb8e49d36ec3953fc2e74c700b989aa0b9d7aad62cc36c0e20f790683bfa3df9fa3c56134017d4aa4e7204f7d30eb9dfadaca032d39a9651b2edf8a5884740b9fd69688d299aaaa36d2a9611a8f92a38ba85aefcc0f3c5efd54e522c1f3f7b37d3c8b1c11434a23fdbbcb52221d4a02ae331979799974396af5afdd318d502c23d0639648a9671db7a571b7f8cb0f5ba98acf1dff9cf86cfea99dbf2827cdbe2b4a2315f21d788"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (535, '{"ob": ["15151515f6eedb96892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f4763667adbf3e176304f0db682025abf537be030d0a923f932693f7a138bcbb6169c040c639662bc2111c2fb2cd562b2a1cf8aa87ff24c42963fc29291206decf87f36d645b4e78cd599fc002426d0a900852a17fa6c89681fe01857396b20aaf9c23d20fec2c2be04804d950c6be6a79bd91a586c4759426a1355e5db5a46395ede71f5b6a1feb903a60717ca6f1f24359a8071217a16b47c0a8ec521fc6a6ea1c98ed34b262be4a95fd9f042269533a62b92557dc2680c3f66c949a0fad2d58890a8199ac32b8ed53aec068a26880f0c054c7906028434ef76620a9e43bd0fec1f968b6bffbd2351f0b4b7f2d443a6abd243fe4802a53057002a13cb38951b739730059cfb91f53fa9bd8a92c219941cb076718f923b5866afa5c0237f448"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (536, '{"ob": ["15151515f6eedbcc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ecf45ebaf73a027bb31aadc66d1514a4b8ce62ee1be6a9b993746f60277c2dd5252d8de530bd0d50521aee30cccda4b473262f6a0ec819486cb784dc2bf87caf052b497bf869183d257b67ec59108dddb4e0c8273d3f2fad3883d68dcfba29a7601c547e967b1ffdf0d35163dac675b3b89b340b6dcfa61cf62ce2546a86b2f000bbd9390873ee04eaede61361fac42167b87383991a6911ac8ec89ca068b809d58416b0e8631b6bd3fa57763ce163f380fb84f478ba2ba36f10946e8a19a75c832ebe878c92426b29ea7194456f821c51e1cd5d98c04c75148b8f935165458176d9aea9d3fc5036f305c393e7da65c26ffd29e49a6c3b9dc8ba40a5f32c7f2b962703b99f9b70c73e8e7f5203d657aaa08ffc4c7e2371bd84417fd964fdc028"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (537, '{"ob": ["15151515f6eedb3d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854d7d5e5ff95989a323dc775e79794403afb5cff9c4322e56f294c9c31cc3927ff6ceacf60198797fe3ca043638ecc9b29b18a0a57c6f48031c46b3ede7683245d4dfb2650295894986dd80df0978238640ef8bcb2d10c693d6263bc674f8622cdfb69baab5c79bcb8fec4262d6eaf8e2abf431ea00bb723644eab9893564e791b8f14d6b77d16f0b901d0bb5a6336a84753745c94dcfb5c134991aa1643c02fd91b7c786b32415687648aed6345f6a76974054c37e36dbe16035aa2f9df71618c990c80ec6a35405e49b9011d37f2598f1335acde47a7da406812958dc833c96bdd0bda2d34a6ee1e5cfed9d5fd3a117b038303be33bb650dc943028e0888a42bc9b12af3fc43b26b2475c624d6c3ca02b78d9ff25fa983aa679cd19a099bf81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (538, '{"ob": ["15151515f6eedb10892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855ef30fd6aa06438c46b532dcfe1a8180513d000bbf6b89a88f644ecf5047fba3fe3222977e248b38aed856ef4a76b304aee59b6f575780330d15f14df4beabf0a47f26b87bc3bd45a0764ab1fa99c174c6a201d867fe0dae58e5ed9ed2f7beb24011f27983a637f752dc9d8dc4dfbee30667d83cff7980c8bd649f69da6301d548894217f671744508dc0e1a30be16ada1137bd957064b8a84e500da18fad359e89ebd584c818c5b6b15b29a1d7f8c7b44797083c67383a74703b8f4ca24a9073496087d2b941e5135dfab72a1286c9f4e6cfa2b91c9d163e43f4ce3c265a72ffa14610dec1a4e7be46c1ab690ebc0bf225d66a5af48296fbedc0657c9ae52de2f63d4a74081f0a036642a87f6f2ef4157245c7e3f67ac2c2d617a23e00e1654"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (539, '{"ob": ["15151515f6eedbae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8588371d65ac2a4062d606f5af29a94a6cecb967f96a457e2040702efea7e2baf27598c1d1f9b25a6fe4dd05d74ea6f72d231b0f000e821d5a55a4db7b50f5dc8b54d72923bab45fd581fc26c34e66fe9717200f5438fd197ca18ac3bb8805426ca9ec2c33ab71860b71a2c6f8091210f36369b9b9e09899498a4533042e0d48807a49b1d7c7f2110c69e9a10ef361b1b932cd8a0191022c0e31d1929f2369113837a503d092e655ecf47903cfa4fe57d6d18aeb53f34df451c9c26b6a20c8fb71d3e5d9e79432b832e565eb513b59e4096025b958dda0b9033e952f4a921de93310af3c6ce364aa24b41f4c7918c75dc0beb765debb2db6dbac9747f3eea4603d194d3dc6e4afdae4eb5392765cec294b344a14a84d31b0ce247fa71c3e546294"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (540, '{"ob": ["15151515f6eedb50892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ff70ac782a4965feb0fc36a33050b61d98fe9f78b64032ede1cd91a8a8a96f53deb54a05c615626dd0c3a820fc76d7d29544b7f2a5a9a747076675284424aeb5bd6c5a9f642bd0be3a01e2e0cd28122c77481d7fa3e4eba19edbdf7645f3fda43b73842c397f0eb0afe87189cb2e74e4616488b114213a2814060def227477df563f147cb1cb8a4023b1bfdf9afdf39847785942df8ce05b84486eeeac6f462fcfecfc3082661a545d888e7fb9534d7f42a41b8f8882de7dd46e593e4baff10d74882b955f3752fa20eab751b241f865dc3ea7d9b0e204afcb2fd06002d0cc8efc17187851fa4933c8dd25509ed3feb2673730d2fcd7164474a8eef121e4da0eeef8f0b4fa4b4471e5821f5fa62b66e8ce250ed3ab8ea1985b7766d488eccd2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (541, '{"ob": ["15151515f6eedb4e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f925fd0bdc18744f330a59403d7b8a66364043c7d14ddaeec23f91a34d79538f6d19d64cfcd02736476f829b6c3dde9d4ecf915df7e99b0e0b9c968acbcbf3f7a16eea03a77732629b87b8f9669a1a1519167ef6c9be7d6419b18ce5ad5e4ef834b393a12c56fc50f51a812f96e43a331b9515667382a4beaa556a7f31b058135cc82e0d2a90c423e7ed772b250befc819fb7ee9159fde0e20b284433a28c32811bd3a5fd1d6f189abb93cecbb1424f701dfb7434591ba87ccb17f1c6560ed1093ed75d4c4a7da6991141e985264c00a83e166b18242e64887d9673e5aed3cf5f24a5e242dd6043a320bcaab85160da1e68bd34801d18cef4eec859cfd2ad6ffd7898d11aafe2d4a5d73abe3a4f9de5b4ca87afa7cedecfbe4924e07de7e41d9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (542, '{"ob": ["15151515f6eedb01892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858f66d37044c19f5e5fd9dfc53670218da700048d22883b27f5c4e4001f7459caec9874200631b8d5f988359b4d289c022fa8b0f74557a4b00cd7f280c45059216be0c9915fb319f237a8a5ff99827bfd41039abb7cbeb7eda61adab567de244a7876d472e575f19362ae5c0b401b2bd82ac03bfe61a0bb2547383e8ba85e5fb491baad82a1c3f000a2eb6544301add7f919e31ce75e224236962e86a4a0dbd9c8751d4194548a7bb9caca0873cde54292a4644587ed6ae43dd83683c59aa40f8a80b56516e90a789da87f91dba5541a5eaf75ef39db5ab6b592f02331ef3cb0df4091d7b395f4e0baf53b649cfc33cc67eaf0cade4503f87b384d6a6a7d23060b5d95e86fb26b65853f7cb9737b6239582478878ca5b708bf64aef688ffa9bdd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (543, '{"ob": ["15151515f6eedbe0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850a76de7d908aff75dc18ba68501bdda03cf14d038bab8ce4fe002a83dfdfcb2479515e8f70c6816a90b6d310c87ee0a2391a51437edc35e656753baa5af9d999eafd9c8669451072b95125913fedf1fb8a8141ae3095c95b336bf9ce846cb9df343857e5bc6869a0e2035cec3270d8bbece89c9e24ad18c99a1d548258b24c9df04f0fd6d834b2665f332e302733365d18134efbe7e3e404649412b070c57b7be32723fcdab159291ee786b4bffedbd28c2eb3f60a49049384ac628db6854b1405d883cdebff80892a89ca7a34f9614e9a244bb103a6a7d5793bcc0d71abe0266d870d0ab9e92e193da126a22262626194994ca0346ff19d031d66c522c8663452f5fea151f28cf24ced50ebd8f36698538db2e2772d8c47c9a22d3472415829"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (544, '{"ob": ["15151515f6eedbbd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8566b0420edd566d110fbd8349b8bf6cf4b5567bb3197da14587fa6f10ce5e939575dec4d975dc5f6acf2cc3c6c9b58e106adf7e3629f184943d418934b989fda2c0e8f2a1c9bc187c3143915f5233be95955003a6aa010bbd5bf5a2b6d39ed4fc95ece343d725fee0e18f7cddea88816aff72453905e94fdd1243a0a865a0a19112f8e8c38bc5755a25d6db376bdea97ef37b05f3a40e7c7d32db1600e518282ece073b1bcc91ff0a2319dc093cc0a85c197ff319de4d72af7c9fd49e9c18d2e80c63c82a5a1e9e32dd74702bbbcde43c6aab5cdf35b63406d3f111ca1c0e70ec846669f9aee5c605bdb96c62c8468c365d6014da09c8791ffca18a5ba3cba62e55856f2f378db436458f87a646d87cbc5c1c3055ca4efec55a89089cdb4eb1eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (545, '{"ob": ["15151515f6eedbb6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859be4cc6c126aa84b293f9a1e387f13011f2ed300f2521699e969ebda8b73efacabf9dbeaec50665c39ee4ee5495254dea345d52a36f16c3a025627a28710210a19d29618c9a1b69dfcc861d8e2faa6966be0d7f14ad71f8a0c93c2c3e115ce032f73f8d5a4d3b5aa078b3a0c6a1a60ce0dc63da2bb6b7daf8f649867969949110f501625b0ec6f05222a5271a42f45b2b07801ab85b792d75d21f38725a9d02e75e57ebbbc8bc0b54e4c3ca1a527b4f4359421b9d29ae9c1cd4fbb4d6a1e2b00ba4535bbb9feb50459ce563b7f3df95fe3dc167ebd2b7d68da30ff44eee310b1c57f30734b69e49748438178ad906e6be5e6cfd66abc42ab34b99e5116774a0226d5639ec5e808890c6694d4b01331fad76b8a73663f374109b859bfc0dcf967"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (546, '{"ob": ["15151515f6eedb58892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c7f4e858e8084dc8fac376da8faf13c4f56a08c66bf098a41bab5c5f9578f7991e14334ed41d00c490a5c47bb647924b9d110c550ee230f438da772cf36f9c5157ff32e9e7705eae11481aba4754929cea8779bf1537518d8c9b7520441df3d9b9e0c8ae10e4e29097c15ca345a35034dc898f49365639579a9731d03b4774bc7add77cc50bca6d3e05df69bfb316abc5aa1e8fac2f9f0a97447e84cc91deae3629a4090d8680619ed8270365ab7805e9afe6acfde55ee4dcb162547525ae2af93e2d0e6f0e7e2f3a901e2bf56070d43b725a038131fb6be9d8e1b77f786340f822e2c1deb18191b7bd050761696598cf673b2edeffc5b787fa8c7197bc01a4668e01206cc573d3f452c60e4994aea638ef527125264ee5e63211031089f32bf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (547, '{"ob": ["15151515f6eedb3c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d3be28699a60e6efda1f2d5c22e70a24f485e14fa91ce8a84e65e2b67e269a8ebc7061019bbb4fd28547821e59067a4d83ece094c6f58a691bdf7b14071436571b339d73cd4957e9bca54ece24ae28a7dff779406d98d048cf96e1a7cc9533b1c7158946c566c9e28b508a4e9a59d439138bf667752a283cd495f5f8de6e4cd36dcd5498801ae3a7bc15a7800008b59c6697eaf12c5876d1e9dc604e80e409bc611daf3bb239b0fb33b9e8142bccb98ffff830b7a54fba76640f6a85d874de3b083d9a57e6a8d44af73f5e135b4efcaa82a207c0593ad442ae17fb9f0f5f972c61f0313abd271eb9bd473147c1cf77cf39bbb8078d41dfda2394b01ad47e50b10315800f157839f7f0e9670512d83aba76588e4f70218a87c1500e1d7ef70343"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (548, '{"ob": ["15151515f6eedb00892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c5a6ce2eabd9688cae923b2d2ebd954b2d8d3166b6216cc0219c6d7b31d8184fce2bec066d22fddd38a704a2902e810d83d815ca0fd5827b1a49e83abdf8b6ee63f9ff8d797973a291c33ae8f1cac871ad920f08b7eadf43f7afaf55780db96e5da17492e543cecf4898bf292cd928b5fdd4c4fde6a6b7b95a57bda4d2ac73a2181e67c99f619c7ff0161637af221885ba8bbe86bcfbe85dca73b78872ca3e1cf5922ca280d8c4b6400e8a2c6da71012c85dfdab56dcbbf60a81ecbc5c42a13dddf3616691d11de8fc52682a4e24f37fe3ec385ed1d8ff1a609b25309e48c993d5ed4676aca32d12084dd5619ce0ecdfa5335eab9f03fbffb2b2036d0eadcbac278fd022ce7b6cda33d8a8ea9d4ad26e5304adec722f5607142286cf404c7184"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (549, '{"ob": ["15151515f6eedb4d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857a7e582b22f3bbbf23ad3f6e84183595c8eb979c7b008303a94bd74be9bec27ad7fdae37de88b61b7fb5443d0abb8624fc81c978bd074fc873543344638c3d57ce3247642188a74c1c75ba791ac859ff429bb0afa535fca93d4498ff7a5e25fd70bfa9eb62a9b0f80c2bdf25130926ba11c9addddfd00300a23913c2bb1d00750000c6e56a24a940cdae14ff5fb48873e685f199ae7cd0d4f5b00ff3bf3ca2c64b55b6811d279401b60448173c50759ffe1ea7848d0751dc67b09910b91c27bce184232237d0789484db9cd74ab96edfaab1d7ce8f8356655066d77ad272f560310ebfa9b6167c64a52dae22c6f9309843488e10164c2eddfeedea0708f40cf61ee3132bf40dc4fad6a13f09445a7217cd0c33b0b02cc64c8126b9a475e9c649"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (550, '{"ob": ["15151515f6eedbfd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857bf90f7c850bfd74151de088900db3735e474b28011b00a15c3e9e5d354f7e9c422a288d8233874b85391359681a203b4d77fb9bd70c14a3ed188430819923ee8fbfe867bf42e2005fae10cd1d8a973158e0351f04a92dc9c5e6955774e7901cf3071dd225a0d1f8fa70ba0804f37727eed4ea72d57ee1af389624339160e0e72653c8d69118b75f4e61f3ee597fc21450d929a07b9cdee17e0f8333070fe5b94ae4d91bdb6d97518fa5f3cc125214966eb1117af611723654692263619e76bcb3355b02b2f665b30af81192f0639d5b52004d3dd354620adcf296f9ab87f589e945a63166b232a7b8d8a1010a3d7f21fb69524564746661fdee0ae53d7edb8109ddf3f5e250de88edfa9412a4759d1cba6b3cbaeb49f244d928d4fda3f26f7c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (551, '{"ob": ["15151515f6eedb52892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857f4c971c3a5f283e4daaced7ab753b12a8bdfa1f8ada06c38faf9c33d266058403f90364229e1445e8f113375b8e1d1470e2c5c510a5fb20e502ff0879fee99580a0a59358e9c94bc57d8b576ee7b7ea2385bf06b4832e5e7e3b40c78486c1f54c84f40c367fb04edf645206d52aea416d378c121dc175118f87f52dc173bf261d289775b9b8ff274faf4e6a215001edec73b427a4ed0b6d396cd8b1402e1287512e6c34a49e4c523693df0f3071512d1540ddf4391d367f837449263c5dfde7827f59ecdcf78bb20c6d3185bbc77267dfc12e74e0efcc59e96eb679061d15a39976b01e67ce1d7486d21b68e81a677b05b920d0a81e7cd5de2dfed8cf5c27ae2302a5a7ad89d033d22381b40a4862c0ec62e4d34d4b3f759c4dd35ea9b18f17"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (552, '{"ob": ["15151515f6eedb46892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85006bd81694a5f5e1199b58f86d68661dc0ed586672ec90023329000671a4b62d210969364001ab31b505ca7579f65e6d628f95c5a0dd45bd3852c3e3d3969c000d63e8b2e0fd3f4ce286d6e6d5b3ca72c73d74943c1dc03c7e6d840dbcc873f2686066b625fd4eeaac75fd30795f2f5df71d78897a1b10305e55a6d483a70409a246b518840c34ccaecf002d2004c59cc58d9bf11b62da4caa7b19b5c6ba9cd004a7e7d14e515bfda8ab7134edff9ee1a5832416f62c5eac9c382dc5817e05f34b2fbb697b7644a32bd93fc24cd7b6db785bfcc03ef32367454a29344210ac488306198a88ae0bec1110fba8f8a015d003c2e8852ed6343e9fe574c1236b8de8fc0962104dead6e3821fa8a61ffefc2beccf7a0dbad37e63dd6df6171b19da65"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (553, '{"ob": ["15151515f6eedb90892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858d970c22e607eee9762cff8a20b5bf705ad2f6cc1ef565001959b39f32f34d7cdb1c3adf84b0a91527401d15cf10fd7e0a1b913d6ef46c0f5bdbeda8b8d3cb1fefd86a8b470d3928c810a8c3757b1e5911788a2b7fe7aae2a804bd98c080dd22ce52fc0f7c442aefc3b1f96b0dc39cb3a1232f345456c8354039e06ff321fe3124b7ebccf3d4aec2cef2306f87e3ae65c6ad88860931e64e18382d2d9f3dfd81553e81b94d423fa9c3c0207da033d15d53110eab27636c08c39e018591fc0b7c3ea66c416a9b6025c75a5f38c99ce86715bbdddfd8dd691398ae27a3045248b4b16b9208603f364cc43e24bb68e8fbe952adf7c1e5eb3a8f702c497f9f73f2b5b0969c5692c9dd0e3e9b63a88f91132bf20852b1747aeba43d809036287b3bb5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (554, '{"ob": ["15151515f6eedbb1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853042a10a785133f79436f3080fe70df611974df8c8c2f140d9af3a656f8c81e517669a1b00c0e116e41ed826b2e6c90f7c7de37fda6877f21e988640d85aee710c3722b93ad0bd05168d00ae2c435909b9484d557423df22484540d0c034f3befb8c20cf2f9b1f2b7e4d955e2d494dadcb822d59464e7f70f8e3e4c91028100b7c9d8a4883a0a54835dba45b7b52eaa60c1f72a09e03e41013d8c532e43682fc42a90ff9808d390f3d3a8e273ab363e18ae3ac88455b2acee4e529a2c7ac0a9a5da96ae0c6922a4932b075119ce41a74dc88517b1e9c1cba83f8be277de282112393c923baf1eae94fb558f4f8174c25518c3e8b472af9d06d9c6bb6201b67ed5894b28a2c05f98b440f9a9241c290a0709c1f505e5928917a93c049db2d13f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (555, '{"ob": ["15151515f6eedb7a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85821440f105467d02050f72f7d5da85c151f5ecd13015e0fac6ff03129cf9b8e38e10e9aeb4cef1ca6790aec5f67f535e5fca40b0e14321ebc0b615516b2c03aae53bca9b7ce71bb6ef5eeace5247e0f81cadd42cfcd25cc891a339ff2ba8bc2bd7427a3bcca199d33dce00ed68ee2bca0fa2376618e1bbd346c5c38f0b7b82e7c42648da1974ccd3dda5d301b40ffb05cdb17d7b26230f629e177e24fed36da035da5d353287681b48d5f0d70eccf9c7da3b5ccbe0a8660dad6ddc8fc2ab50e73b3d5babf001c16299b26609f4d3b0b342c716c16d5d485c5d9f1312fac9a07d5f383787812ca6470b8c4a21d8a9a1520867b0bc4918740b99a4bc0d4122fbf7f46c1a1d6ce7d8b6f43de03c9b4dd955459d18ce717a4a4306ae6d4215236e12"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (556, '{"ob": ["15151515f6eedb29892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85aee760732342c7b87015b46ec8d5d6b7e68cb30b557abe80e7e03ec6878587bdc99c34b9436e278dc89816764336f428530a4557fb046b5e21e04aff4299565480e4aeebd15e784c96d6a28ac7c1f5d3d6e5eb6ab7c6a292697ee4c932dbe7bc81882d7a947c7257ae0410ab256c4a7c51a92dc83817de0cbc4b0bee0cbbe712c62db2d311589ec416c3abb799ed6c239ccc82652d60ae56fad86f781c446b1aa9863c4a9259cb8425a65548ee62eadea5fcad5e7eee82eb1f0166e3917481e81c0e33e645c546e6813f1d84e322d7aada192538c03f87a680b6bc350c268cc8ce2ef0d5f477d85517f225177afff13fc6c4b672632f37664d4e58c30db6cf6038d62f4f200b14967a8cce068a7b6beb26a11c388123812f9bf9deadb3a9af41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (557, '{"ob": ["15151515f6eedba7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85eba064aeaac5f4f2b4f6b4dae5df4ee38b62ac651d8f941fe95347b81263c7e17a67d23894801fc78aaa1246301f6dfc2e5bd4e936fbde120a72213adb19c44b96dc6aa9b2e5efe5a58a5d7a366314e694cb07173c9430894203dd5a5a5c5e68fd0e7d10dd7ae0b489b0c28693e24fac196e5ec4046337173bccaf73cb089b21263f4eb0adf46d646a55e401c0c699254a14eddcdd9ac62af9ca7585fea5a33bd2947fb503c1bb20e2e1ac1a930679ac738538b7048e8fb5114f9dc115b1cd47786560a7095ef02148b75decc2de2c83c3673e4708c3254622a92d5bb700658bc300c22883d95919755da72e066abf8b9d76d76b504dd7ff5a808cf915aca405b6fac2c79700ccccfc388b0198ccb32fea73eb4ad4365f2beaba2f4aecc9b38b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (558, '{"ob": ["15151515f6eedb6d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ffb9037627ba3b01c4bd84f59297f9159a8f0643f1898c3721dde4da1103318983539297b78bb1866c0454f42e78cbe2660c032b0a4426cd8be06ad921f8cbb7c53b43924df06fd38c84912f49cf8d5655def7c31e40efba607e70d976989d25ab119bd884ba8944f6ad5388b546cd7fa3e10f0a82a701155b3fa847cdca50f7bd74736dd83bd54a9dd719ca1c0b786df00d1f2d3dc4b2acccf0f928cecce303c3b86b8a88be462b7a583143c432fc1d5d6ea79c3ffd1979bf09d873332862110ccb7452f98108fd524f12a480d781a8387ad602fdf37260f6ec7d7ae103cf018e40864b61387eac5d8d2a07811c3069ae3ad4ac821dfb7d639d0f06a629378807361216de89ca2a456e86d4da5b1645d51215e603f33bb33307d1a68106db8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (559, '{"ob": ["15151515f6eedb6a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d315599b007223ab7926e9081e155845359959790558692d123b0bf3bc7f80fda6c099016b621b5d51ad3271e4d712728b820f91bf5e1cb03745c5b1380651351ec04103222d6d6fe92337428d381820cd10c4bac4309bfeaac9b70da9a1eb0ff860c045a8e8e1864f4d581fc3008a0f829aab31eabe36ddb440825c4ec0acdb1a1b8832c0667a66abcb60a77ea9f1b071cd32146d0a90c9c0470381a0a457275c47151bd633468f3567b1735e5d20745f1e5d73f0fef3670388c0847a01f263463992042bf82111299f7106d656eb978d751fe94454a91c5fc1ef9b1e0024c0935b77dc79800e7c2a98f8d1661a9416f7fc89d70876d0559ca3a11f86745ba641820285f4a9b0e7f9491b926be8474798744e1afb44e9f3dbdb5a5ca54f79f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (560, '{"ob": ["15151515f6eedbe3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8509b5e7c4089aae494e1626c5de19df9f6cd41eb75f0e575dfbf01b09014f7322d24bbf75ec89dd8158a5aa1fa5f490ba7b7fbdf5e0f7800f1a7c1c7c7edee12a93522f4140d22921aeb1c677f546b2993c00372865107ac96643a91a3547b1b36be10ae2107cf456d73c81aaae6994b76628e0fd2f94ba4ee17c7b3712ca6775da8543f1bdef1a386ff599d3fdc4c784691d353707d5fe68c1f028551e9337749d2549ea3f6c1aa29f4265fa418d4dcc3016f35c3ebfbecb3d0d4de393bc71a54fd458a50203f748e763d9a3f38ce0ba2f729331161255ec2ba2a573ae84958e4fdad73666c36de8d66a0738bfb7068f417200a9674456fd1b2757957169290aa2b0f8ae6297bc4240e85862734fccbbcecd4b495f91b0fa086c176d1a105920"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (561, '{"ob": ["15151515f6eedbeb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85caafe9ee3211b618a643cbd41849c1d98cb56233a8db575170f3b7b84bc9a33533248151e4c24141bc29e347edb3b420d14320a13d6c56779b6892457de10d0a4cab21d4a7dedac95a53c28f3137f6833d45946e491902b279060ad43e6042b9d10384167dfb8ed5ed56ba59dec1f5f4febf64e3803be3df2018e12e77eea4740eb1c2e3ff6405895c6fdefab78851596bc344aa815f5c12149dcc26015144fa41b0eb0f5ba62b257d38825d7cbb349ce126f76008d9e0e909d80a9cb10d77b90ffaa3657e4121f8f14d00a8790afe5be761497ef1034ab128e8c31c47d449eace89f15f8d3ee6fb535a444034788a8cf9de784a4462b01f2ce248249c8ca2a074e61c22da918d484eb851efa342ac4b18d3395ef7a95dd1a0d93644ae0d5c81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (562, '{"ob": ["15151515f6eedb70892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85164dee2dc9e3b128c82aeea160b386d1bb59c418914bf81d5bf261f3412356f2c6149ebb566beb810cb0908cbd312e85815576e41bf01a61b354d7924cfc3a5c0c3aaf5886cbead677ab0866380219a0973f72f4150725da217304d85ffc1b6ab3e45376ac439d8552e5fa80cf03b703e3684e7d8e20cca76cdf6b6bf1afdec4b2da710e4c6a81764a389503daf99313408416d35f1f2431eb4b7781d75eb2977d56389d0386c7d8455cd964b5fb525340c6728baee72554e1a83fe16bdad2fb464db988e0b0966b44e0383027823ce3aba86415861ee3ac40771445b56912a4402e005e494c006b229fdba85ab33688d25c939da740cd20853f449e57babaa3d502963970aa4e9c6adb52a94be32c6da6d93a34a6e7c6d61bae0e6a88a0a486"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (563, '{"ob": ["15151515f6eedb8b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8530c1cc1eb8049bf7f0f16cf9c4c792ca1fb617bcd55a4e04b475c54e66dfc213e38bbe7f6f27ee47a57ce8e4f7a688c489df452ab4d7b64b8b24d8e604af4551980fbc060535371743bce782d2d8d85be86bbcbec4f094ee5b3609911763752399b61658ef431a112e339e07a131f7c9875ed6909636a8627b3cbe3cf6a20cc7d99edc454c9b37a215cd4d8def5f442b03d17b180f1c4652a4e5d6991340878e8314e9a14035ca37af6bf47c099e3aa4823609692c9642fbbd6c48660a16ea8186293f02560b73af0ad032ad73f1d30234802535dac0628882d1b66f11e09a608846427e601aa21eb5a3bc5d07b11393b4db76a74506338ed9a7a751780252bef74fc278ed785c876749121e9f65f96c683a15cb3b222684857600b226afa965"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (564, '{"ob": ["15151515f6eedbef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85be07e530c72f6acb151e26547b04c9bc52a28d533da59f568593d4509a3594dffcf4ee526689a0e43487e67fd616839757d8fe8f73a93b1e1047168b722ff5e95350835a43e8ac62a507b1f3ce5a5ab4914e106e0f56b07effea34f5aa2b81c6c5456c50c3df75fde7b2e2248b609fe434a6dcbeb35315d109d645d20aad22499d2b05b2245d8fd2bd3cc3c80572a6685fe61e94fa609f8273475ef68a176bda33786586080c4a249c4bde47e3ba051a82aa835e92626ccd287c46c0caf5de3b6c36589cedde8c57d5f24b0e0f911d66d3a2c9d1630fe82091f7b3a90c2aedd1702ef72015ac820a8b398e490190cf73dad54f349c0ecfd74a1c18fe4bb74082866567e77f5aa386aa287c26d2ee851cb202965d3b79bf0be4fdb5b550379c56"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (565, '{"ob": ["15151515f6eedb25892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852328ef4fd4f2130dfdeae291795c0b0c2a1ec4672dc4fc5316348fc4a0fb8a6325fc9f63e4d8eb5461b871315f153743ad2dd5e8388c435b147e50e1a78a29d46fbef2377dbdd43627f0322fdcd8aba50dda22c56a0a58bbcfa34e5f980b4a5b64ea6127602d9e1cf77fbab2fd834ccbfd697767956b7ceaddc44580fee711549a9afc23cccc8a9afe13c3e09a3b9d7af793fe1fd84aac113b93ab1f6cc37977ae24b8831548c60bf4ff209e941b3f8de37698b33174d6e880d96dd3b77c2f16c8a1ecbbea189fc56b57b832c735fefdcdd76cb778c735ee1c5c9645ff9019dfa7a5e2d69eec90eb1d3c4179075b431b5aca722c9cbec0f56355e43b56a77b14502ec41cfd2117e1afc9e741085dd47c0549ee1c8a91bb29002ea5bd54e27154"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (566, '{"ob": ["15151515f6eedbc1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85510c65ab6853de41cfb30611af77d0e435a685840d6799404f3cc8962e3ae64142069ec88194b1d72e954686d34625201f391d3ca8b6a91a6de7935a32307bdba47a9606ca4b9be5d365390feaf647e7b41bd4857a76f0c56870dbbcdb077ce8ab30da03911d3cd35a7652446adc7c3c01baae3e809996f0382a378dfcbf557f59282628fc221e01b26132abc60235b299d84e767e8242ec07a64f8e02d76e4363265f37de6abd6d1048b88b5b8f52a406029d146d7172647a4d62867eefeda61cc66d0c1d232529f75dae8e8c981b409422a52c0f3067c67561be26a47ce37f8ee2f7c33382dc17bde0c10593cee8042856ab7a7345a87c4764c538c2f0af2bb77b016ae5e660db78452771b3843bba796b66c0b26876b6692546b54ed7fa32"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (567, '{"ob": ["15151515f6eedb32892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850087d2b5f6a3f64caa3660c26a93dc1ed62a3b6f4b409e9ac17fd01fb1f893a6f551a8d92cef5f2a0e5e8c69998f5882f825ee6a420d5c8c7a2d57035db220f447b28f49fc59377357f09849f1935de3cbd928731250cecfe7c37d59fee9962d7e23af1fd53882c6caf6d261da3d791698ba1120659cb52f0ab566960ae0917c4843aef9e7dd1eb872fa7a34970aa68a4366354bb9d57bd224fc1d0658a5e6d1814a4dcb7ac5e3f39a3640ca38451fe7a7d148d241048770cc66c66ed5a0064362a459e713f0dea7f1e2336c42683f90a3c43cc9fd4fd3583a471f9cdc0c5dc2e069d641c598db4e4a6fb0e5e9b0a2cabf6c1f57875842484b4d88a6598fee77008e8a184ab7ceab3e6f5b871d4658f7275eb7ac6e259ccdd8406cff99239d97"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (568, '{"ob": ["15151515f6eedb9d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857fdc13928a54613a478c1e5a34984d6176c145a2efd65dbbf0b656f3ecc6c2cb97f2f572c39f5bb366f8c29af1e9fe66c5642e21bbfa39c4be991657efaf197c5ae06267bd6f9ad053068d6ad7351871f86ce1c14ae872ed8de1951d75e7fa6bab6a125a207669d44580fda4b04d101dd2ef7e0653e147ba655c1edb9933cec0fcedd5b5099b7aad5e452808652a75616a637988aafba47e589e6d095dfc13eab28bee1909aaed72be90e24dd417cb1e503f28a7e2ce9db2580bebcce8c667b68c795d5bcea20f4f9e01c86ff157a437d88b8165d146b3e3034db9a17bd0084590e6ba449692bf9064d64fed83b623c6218696b215fd20327eb5f73b5fe3015519716a4cba0379ef4e19627f4bcffd3fb2b6a53598501f7031746c6a913ed0b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (569, '{"ob": ["15151515f6eedbc5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85055542d3061ef084b0409594d486b1dfba2e7148b770a3bef29b57ca5ea49ec7e2c4f38d223a328a50f4a7c1010e166410ac50b86864599bbbf29b2acedec8141f712a00250c74157e3f3148f69398f56214438aac9517a39a9b3f8b9a53a7a8fbf8ff8c36e56c3fdd556eda9b07e001a2d8480513c094876c504ece8580d07413c7c783ba0e715c47324d79eeaf1174ea359afe7d4882208e1ce754e1a57cb197468397cd8d2350ce31d67bc6c5ab56107d29cfa9a722d8e627c83c1a03fd069118eb0cc328cfae7006976f55852232d8f04d78fe749bd3b24056cb4fedccd9b0a9b1ab526300f96e580b3dbe9b25827ccef5bc9d8a7dae6600eb82ad31d1da5d8b5f53d2b4d766016b1b6cd6701506a7d7042daa03e5bd4aad18fc0dc5af8b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (570, '{"ob": ["15151515f6eedb4f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85665ada031e850c78db0e884d89d9b48d8cdaf9bc0522caf399799815a0825c3033e70075d2ac61b97c215ea8f8ee7568550ab9bd02ea6e128a0992421eee529818da104cf76dc6987a7d5dad76891d2f5687256b904b0d6b4e7c6c8e696bf878a90e7078f5cd434ee2c7f2f6852a8c91eaef227966147a8461e8044418db50f894b5a0e8d8509d97f333ffbc844a59549c8fa0dabfa0ec0d04c2c29320527301de1aad760061687be4e839b2bfde3cb0f907e14c02058588a6abc840264b45add19d922cddc6681628e38325b7f63d2164f440975828fab8b895fee7ff06d54c1dac30bc263a1c3390e8d34ec52e26d863eba9d199529d57bc2c8834944d8f83375ebc0fb287f90cb983a2f66f62db50f8531695ccb03a832c18dd0bc58fc3f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (571, '{"ob": ["15151515f6eedbf0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857c054a46f275afe8023ab6883e4950cc7b33feeee88aebff64d58fb4fbbfb4b4a0376b5084b043c42a4c04a6848121ba2ae27dd1ba4d32bcb781778803e4d7ef82937b4bd1b78241f70304fcaecd75f4e6f86839f1738e20bc7e2758c1d45348a40b1801a59501e22e4fce98ee24a8faf9b4c906b9a9260bad454f086c1d13398d09bcdc1df07b9eb14d90a2d0f835c35ca6e0f43370033e32cb4885f9bd112624636b97930d9812834f96b94eb88ccc0335eb78000d689bdde233f7582a32148f135dc4e9f33992538167f6e1576e0f88d84d7b593d26cc86561334e31b9fe503bb751e78ca7e855a84eeab4a1c627978a4876e86ffc68d2c0c9ce57b53744b34fcb04db2e534175e7de056d996a44fb8fc459ab3ea92a16fc88866703cd51c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (572, '{"ob": ["15151515f6eedb7c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85487a7a8743ce6ced6b103f0ff1793b479c5fb935b9a4267d6cb1a2b06b0619b4e2691ab56ceb093ecb6503f6ee306b02837022221d8d2f82ed3586a69ec436d4ceab8654c9dc117385be231f4c84a63e70cdd6a8c23aec9ff1c2988fef53d46dca924ac83ac0049c33d9b3f73a27c524f18fb00926ec83e2ffd6f3d9facabf125315e8170a1d32930db1a9f9d282f1fca741af1740288511726c376b3bbe9dcac53088ce774b39b847f28c77375007ce608c27d2f2698cc8677491d7cf2b98b0ecc8bdc5ca58d213602e73c5c1dca3488fd1224acf1d0460a64745f94719695d0047ed15e15a4d79926fa7443705a506986138d07798534f8b7444d139ee361b6ebd981d9c46a3eca0679fd9cf855acf9e95bbf2da91e7923c835c67fb35c23f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (573, '{"ob": ["15151515f6eedb2b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8539619e6f2001ca8c08ef574ba01453feae405dba14fc4b921e4d82acee2613e14b21d769b4a91d640270a4a925313d26cba5d8f5bd74b31cc7aaa919cb973c39018c4b6408fe048dc5e58317ab2cd5a4afbb6a1322855f7c1b23ac97248bc63d479aad790f7dd129d1741f8bafed84bab6aec0dd1f63bf8fa3dae6d10520a018f0c4c721dde859655982d576f22915c0015b8e43968377ed271b042fa190b732d8049793adcc97b85c7f6e9197ac9f28e47115c605516d196a2fd0c531f5ca546ac0a7feb4168148d530f27714bde1b44024e1d9b6ce912e328587f73ccb6af464c2fe8e584a2a7356120296134069863e0faf4e95242f7ea66739d4e1081b1a12e8d112163a5163e5ad938d93f580aac8b78c00477b1aab1809d802794beaa3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (574, '{"ob": ["15151515f6eedbf6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f0ed4192557c3a0bad71caa4a49a15afb27b89b6a185966c75aa0b29c8a831050a43eeb19939a129acc59506a865735485653b918fbfa5fb9acb14ea4b5dc46d4fb69ec97594ac3fa6e35eb0c5663f40ddfbaf525f14a895c4f0177647ab3b8aa047bb46a30ad85a1de6c54e0d02e5f07dfcb576efc579649827185067a07c95ea8301b7f1fc9098141b239f0d4e5fd4340b9527d5eb866251bdccb1746dfb7c7c2ba89223f9f9cd178d9fe52650af1d0024a097363cac4ea8ae70369fe8ea06841e83f7bbeaf8e81eda9b61e354b1119da9a80b4354031a9eef2c1a5bd52e0d8efe7e200731f01b5c2fea0bc235517cdc550108e4d5acf686abfd7d1b66ad42f11e64b2aac60bac4905cbf997090706b523c287e0185223140ef6d2defcfce1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (575, '{"ob": ["15151515f6eedb27892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85301f9e6293f0138c157c9dde73c4ec1571f9802c2ece36ddd9cfdadccef95d5d5ad67b0c4dbbfc966feacd95370fc48493c2059ed29c2c1d807f14478fcab2dd8438e24758c1d1d25ede7ec57a629c22d6641180441ecad13a1efbbc934dc230a20b111b8c988ebd26a847b236414b845b1d7b2e56f82c54ffa36c4dc6544c8b1df34dc85ef3192b5ba9633f6288203b1823c8cf1ddc70415e807f3a9c8f8fd0195fdc303661fdb7ac69ddbeae682135875e4e44f8b4b228b03dbbb6c85063d050009650080466ba553caee6b39d0beb05a92991fb2cab8e8477cfc5412e420443e92b20c4253cd04562a36952a4eb28b4cb04e4ec7adc89e4c3a120950cbfee611b0f2bad8e99212cc1d8e6d49926f71bed167ebc88855839c4bf4752f9fdc1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (576, '{"ob": ["15151515f6eedb40892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8534cb4f9a732f5a0c77e032942ede1167478e086fd09e1da4b9aeeb7c16fbd2e2fc8887bd4463b1bf320b8fae536ba2f224caad775bfbaaf39e308e0cac3a58da238a4542068db4fe8e4bf7ed10aa7d7ebbc4959e0bab2b27b7c5772837990f37a609c740971ac3810c76408a0b773208d4e5f8caf9fd810b6477e55e9476d36ab96293931f871a56d7638234728a6a20e5a10bcade9243c99eadd66f1cf198118d77bfc6a025ed09197ed758a020ff96fa3709b13c2d8dfc74ff1d41824b79f36e1fbde2eaeaba71101ab8e71d37568bf861943f29c56ddd9b876495a26b6ff96df49ef5d75248067df68f732fa564f31895dfe79f5ccdbaa5803713d8781fac3653d8d1816ad8fa0654f3f5004a8111acf3ba701cd2def0ef5c120616563a55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (577, '{"ob": ["15151515f6eedb2c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8540d41852591d02b0c0d6b08d7f53706119a525abb5777b7f1ba676bbd839f07147075c44c93646ac5bc0fdf6440980d28033f0120b561e81a94805232fab75afe68d5feb59405bb92ea5b1dc1602a83a908e9ac77fbde90ae6585378797abb24816365cebc2e564cd90aa89c90ee436fa55f9e75a409ae8c07b8f5570fb9cda91c95ab6034673ecb5336eb099c880f2f9ea6c4e9eb09538fc93883f8a0f7b9fcc91195e0726e85aafb13506585c90623ea7d2a1483b511d28fd8aac43e820142dcb7740463bad8c9d823cdc6df4bb927b618845feb2e7808a2e99d2233eb3bb851eaa25798704a57a7e95ef3bbf064a9af8163f2860c97303198fdd860dbd362f74e4391d67bad29af03ca917b36136f4683b6cee057c86dadd4427ce8b3b645"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (578, '{"ob": ["15151515f6eedb55892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8588cdfe5fe8dd15ea5594d34f65ae48a81fcd8b36a9dced0662a07f1a3347ec761fb21f948a7c743a87c296677b976f34fa08a2ac5937231512843b0e6daecc4c23107c22484ce62e787149c0523e9c9a9728126040b772b08b30414f1b5fab77ec9244152fe056813afca65108e61ebf7955eafb59280cecf292726339824da153c61b96e5f5871f6865c275ca1c01e123de030e23067d7fb6cc9ccc3ab5c0b999b3b9253cef6e14035d0832c97f12c55ddc0711eb07841db757fe4f964dc9eafb1a18d8fa653fd57f4e818a15b213d05f04ba86fe8d3e0eef8cc3313f86f1bf763e29d54ca31ca4ef82daf85942f3a5557a43fdd4a27fb25ee7195229948767e9bcf9c3ede9e4975da303cb00f7f2cf45f8f2dc216210f2aac04baf59ff938c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (579, '{"ob": ["15151515f6eedb48892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856596cadca54bef4ac46764760835484bb755de7f4b290f4499a61055aed82e257706a4827f6e64e3d6ecba15cb6eb70fb59abdf71f85ed7c92cf5fbf6db5bf6772445b479c2c1a64fac7b479f4185fc9c677cf2bd996aa77e872a70b8923c5b08b1b7ee7e2acefe512639d4dac43be4f8173d3d10481104d75bc6b8d3ce3c6aa26ea85eb93592084998152261cd3de891f36cebc61e4d2080e351c290c36b4683e097e4e8c5dd1041618ae604c830243bae41e4976c99d0b7d5dfab53f2939c2f21b367b557bbac6c4fab5351858f2d5bd68fe1298965554ced115d2d55e9291874b72d92c33cdabdb0f73d6fa21d496076857dc145adea3fd7a787f3e3de8f8f9585c21d5b06c83b06e1dae94149dd064dbb4213fd2b8c62171aaa11c650922"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (580, '{"ob": ["15151515f6eedb65892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8582f817a196f48a31df618988f43967a37caf84d5522631b5b7520592f94699627e0df2c31e7ce47965dcd21a50c618052e568555b8e43188b763fba9d11b98f5fb56ac3ba171c732d981e663c1f493e09c433072db4914a079dce354584750db5e84dbe2b48e12440121103021d3749010d98a095d901de1482f27dac280b1c61de31f25f52b51eafab8e96dbb70c135b748f5a7b55a96b636190779050b0baa4d09f5acdb3fcb6c74a54da820a4e6358ec47e37bd63c1ce02c48c3cd04cfdb5ae4c738b07ba149b419d3623401b2db32cfc3b2ec71d44ff1c9fe5b39003f1f707cc2d47120e549e416c604d0c8e7c85b8ca818bc3f8055bb789dec2d5395d4c873729b0ac7ccd3262aad7d46e3187164e18047d1f4d48d2e9d6cfff713a0298"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (581, '{"ob": ["15151515f6eedbc4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d5233bc64037c6608bb17d4952f1e47b517d9541414c6cb283f30d57d9e731e9cb2a20d9939b0c1ee9ce4d4e8dbe87efa214ee66448a458d75ef6bad13c59bc934fa951f4434ce3c7cbc9b1b179f33f34c6995cfe8df945af112337aed0aa7917dd7c1e5de68b57691f6615fb0f27abc3d2db2fe437f869bc415332fbeea61208adaaae4a95321fd8752abadf5d0e93335a035dab549db91a57c6857653798a55eeded6a020e58dfb9deaef49008669b501738f68fd764292506ab3da78601cb5ca7b9407262bc98b9387829badafce65a608709b0516c21a6c6f920cc96a49c052e1c580f020dd23718eec8d0c47eb8ff76b78559acdd349f95b894f0a3ab289f2f2f0b79cd4c3d4880fb84629cf3017ad61954cfbb9bd9bcb53ef7601cfc00"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (582, '{"ob": ["15151515f6eedbe4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853bd3ebb1aab9e278ee188dcef32d0c1280fe42aadcfb35b67855174c85ae8cb96ff48ab79c98ba334292a16d39873796f8780b56e64ddfeb6a4bc7419d801d4f7c4d8a58dce0090ef56e78b2644baa99a18c5d8ad49eaae7f3f38f0836a933d3bb1af9a1de1c481079fa98c43f2d9bb24a516c3f96345f1a4a45f73130e8cf1076e60c4b42c08855a67004741e7185535f0c65c4a0ebe00939d6f5039f655ccbb005bbc519038d42e3bd0341d8a75a7632b5e8340267987ef621f2ee4bcbdc8a220710728496ba131aa1c09afbbdd69e5b71ea2a61d91fd007c01526fa652cac16c9d267892bafd7b2393a645f4bc53195a940493c96df6b042a83ddb787b72c63191ca6eac204fbb7bfe28e424c5a9ac052fde3f3fbfdc02235df8561de8cc1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (583, '{"ob": ["15151515f6eedbb7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856990003f0b1a33b95fc4aed85e37a5d8719fcfe6a91a7369b328cf9c3c647cc77dc8c751e93d0cefcd27ae7c90c759a1dd37f80fa02007c738729f5fa30ed5120bc67aa8a3b338165d3d6a6dec2f1bfc667a308809c92ad5066a5770fc3de5ff902417658f2712bdff2a603f0546895e7a5315df4ef957cf445fa7dacfba23ab90a424b76f64a8a6e717d7d6086e57049b57487ba7813f154bd3b5d7faf82ad7b4676004936d1420fe2cdabfa2e6b8c0514721211c92acb2943f291699a2f4822008a7da19a5627cf201d0acc99be75c6a6631a8b021904438eb0b302c6ed62a3c0e92d585c7d217b273655b8e82d8629ccabd169a4d8b7dce71806b0e9fb8f4587fcf027269987fe4288ca19facf92ab404304446fd1f40598270aae7e5c8dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (584, '{"ob": ["15151515f6eedb26892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85edb36922106c73534b845c8e73b40e435845a861e12c3a3389421db9ff898a15c480c00c5426da810e356c670c4b1bef4d56ede664ce3fe7e04bf87b01a678f8e77d8c8adbd686b7d5730d23617695be34ad8a1d043c4103cacea1884da984f0d65e08b4e5e128aeb365c4422a4998083bd68e0d8328c5c079257259d61717f1cf076858c7eecea83f4b003d67feaa70935648cf4ec6180ba48106c67486fb7fe3eff780b3a07e2ca660251c627f215533ada9b8f6477957493650862773f4e8193967c14e5e8dc31865c314ac17ad695f85fd1f8cc8559c744912aed6807bec6e379bea19e4c4bb94916958d6749d71b30a61702fd13d85b2cbda403fa0dfaec57650af70f06b000c39d118bad4d5ae4de9863393312cbab2ed195ca46d937f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (585, '{"ob": ["15151515f6eedbec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8546159bc3a4c466b7404e22caf24da34b04d3115412a30cf6da9d6a568fd9c8a34cec5a1d2d71d037ec794c7d40dcf89ce64ca9f81f69896893190d0fa9750755ec6ae1186ebcee0e81278859113a49b665c7805f9bbcf1d5d8a5bbde6631188647035e3916ddafa8fb1f698cacc627caf956ddf41bb20c3175a4c8c2a640f612e5f0853265686a4bc124a7094570baf041c3407b78d0daf8668fd22146253e82ada8f3b87fba6f96046cf8b01156f4ed74af6f6b006f7efe29d6b16c3e2e1b9b3c629df274ac86f27760b9523c06bc99cf0cfda770e0f53fde82f656239447d994e136aada305aa45e79b3852c8c463d56741f2999e840bdc0d8470be0dc2b5f107982741167a6ab35f1e4ebd24494307afad607a420d8fea53220bf15ea59e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (586, '{"ob": ["15151515f6eedb94892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856b374dc6d4c36d659a74b2893fd6d399c2fdc9f276a94cd5d5c2b5a8a69c225fb46dbcbc094374a793a141e5756c44bd8d5a6f6c6f8b66fdb28a154336ba8cb03b31678bc54e4b7f6794e314bcbf92b373d88796f79d0fc3e48887ffe57acc90fbfcbda6c10316248330a3f581026e68255691ff989922d6ca92eb72e9653716e31ce410de266e76db18afb03b7fd7ebbcc23cbc5bdaffc87ac988524477ca213cd0261dbc60176df8e6a18a5197101689a15b83412024bcc763f9efdd7b23e3cf261166f837f533739d9349e0796ee2505879cdc867f764619f87fb9817e4acba7b5fd724ab69d7ee3b72fab0fe3747ff85072458d1fd539dbd80afdbf505b4b58daa6b27876dbe3573d1c7b3daf3cc3a42116de12de90d0f3676c11df19448"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (587, '{"ob": ["15151515f6eedb68892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d268c47356801f022b8d0c968d9489da44fd04539ea901a6f32ea7c0df6429b5bbaa372e325aa99b80a53d9649761e219c10dfc76abefc2b3d469af1b407e6e0eb4fc836dc4da52abd4f46db9ee56f8db67f812bbd428dfae8c6a207889207c5756e8bca69ddb5e9688dd2cff4502856a7bc1f77de6e1b904be0f470f69a9e7ac0581a9c7d99da7e0acfcdbe41347ac062ed699e737165eb3ef00f7c810e3bea6a0d18bca7de1a4d2eafd5a8c866f0158c136879dd5acb26c4b734e01de51c3aa6b40a832e4a29e627e95216082740ac2de2ed3851fb2305c338c7f56c6e01c4dbe5597d60e1b5ec353af09c8efbf85e8d6e178b63986f75504b03d69a7b6e079ee47df23847257d2bea241addba70ccd11d8ce754f0a5deef99066821deb321"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (588, '{"ob": ["15151515f6eedbad892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a7e94c61777950cb42c7a7c0393534280934d76511bbc461f9b5f96c02143d9780286f9b51d6d652a7f3005905fbec457d9b6e3d7eea0929e44c3c8cb5179cc466d475985400681598faf0c7b8228f93dcecdd9be91bd26f51cb3c8e2bfdabf752c4226ab103f8cdee4452aefc9fe4b154b3e527818a25c061aafc7f6cd28e09ef295c47971121cfbd2d2e36869c871e7361d7d4dd6a13b0e5ccc21f5bdb148906ab4dbd61d9ecd945b6531f3cf4eaad823dd093a324c46bf3361654d28a95bb80c9bba97d50f694fc945fda468d24913e2dfa8dacb455ccd37e035e5d0f712e1fe2697f84840e3aa2c7ed08ff91d4bb325fe2a61d7801be2326ecf11a07ad14db8d6e3323bc26122189a2c3018d6053110a0c940502d11c3fa4834d2ad3b7ac"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (589, '{"ob": ["15151515f6eedbb3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851de4beb911d9fc03d1e80962db1270a1ee62a2e1ee4a4c27987ba2d88bc44b161acd0cc679c4db4befdb3c90c6a3102c2709667bf7057f2186838d66d6e5e3afc78b7e806e70aa64259b1eb77206fc09e58be6d7a25040e00e751d669684e5e5fe94509f39db4f2aa60d71db9fb633ca4a3ff362cf863e4cebee67a45d6090c74f060c194da2ebc4e4e33b48a782b10eca5ab5fece0e72832838e5a96e56885db0215ed90de02effc5fb76d60f3f00efcae55e7ce63db5d51b3fbe2d89913b0e448f544dc6f2b4f41592a0c4fde2219a5e55b9b6a791550166ca45607ac6c0b7ef93cfb56afe3f1a0fabb18b20fd7eb96b503e9ed39e7888f921bc9b7e6ef0a9a49f5346fd84cce29e80ffdcd8f95379dacb9fc35ca8f19949df6105de765877"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (590, '{"ob": ["15151515f6eedb77892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8576ae91be7d9fd59adca6b5907d2d1f43f64cbf208f9186346b6d86437a1023193c0942994a70d49ff3782490063dcaa95746e0e26eae133f9bfab84bc0cc17151878e0f1b734f8c776cd8a23ce2151f6b1ca9bb212cdaed7978282dc377e6ca36e1a68b4c617e78af3af3ce4cf6a52edc3e8d4f252967de387c9eba229d685010dda4fb0ea2a41e70b7270295a1f7035deacb8635f59820cc17ac6f98dfdb871736966d1675895b5eda93eb83035647e9116694e21f21b14c94c1db5dbb8a3b6261c5f1cb258893093d231e7282aabb29e736a930f17a32442dc6b7558b9fb8b328e27dd9645a9abc96d7a5f8824fc9d08d749573e12c22612263d3eb71251d5123d332838340cc0f4697dbfb52cf5bdbe685eb2c4b5bb3c5387bec38313049f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (591, '{"ob": ["15151515f6eedbd1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85fcc264b1223ac3aeecff97cc25b9c08012e59ad13b1810788d7e44ca8a9371ff55bcc01f18412d2a742adc6d0d5520832c7fec2c55204b374c2ff62ee7b8fbf80999993c1247b76530ad397bc764233173ffce56180f56c6de42472601025489d8de57c24cdae01745afc279ba0134a8bc13a5bda1a30ca6f648a4560d033acadf3ea6a3e2db71d5fa3b28621ddad9d57bdba2bb266b2fe709ce9e4154b6eb24dcc84b90ca16ed7e7f61b6b5fd911a723af630971c4f584c1064963811ca7f5be9e4b650d36ccff1aa49bc6b385fdf6fd7d0f38b35e1c61929bd0257c431d5ab85ba4ca2cdbe94b97f4d22741f8e6bc25276cc2a561f4d50f50cffe3fab183fef54767825d3b77733919d4de5fa4cfbb8b64535d334de6a445288d5a2c2b9e5b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (592, '{"ob": ["15151515f6eedbb4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850b61ed4d6cc1c8f6653536c030c2c66fe6312d633326210d8ff9d8c3fed0b2d1c1d902d9f44580d91b76acef8da9c7cfd77dfcfc686129f783e8769e8b3ec5bc7504346e35d3a4eedac5acd58f12a0ed1d016590378cf22ae55b784a27f908c99653dc347132448a3fe408a47b59ec8d967bb71813bf5d538292d40137cb7ea3cc5a5ece5ca5f06efc1eb115e877798a2846854a56b05eb5b4ef0e16d140abb0763ae5828c86d02a45dac16eea56021c4cfe505a45802dc4c81d9df20d76fd3c575e0f9bcc8285819059dc24fb76c090c5f47fc0bf40c6fb4dee4c13d5fb72da8ae9df768ad45b2080ecaa50cdedb374c462197bac8d7177838a7bac6023766e7ecf6942eb221d049773d735b2020e815549ccd50743033ced496a7ef69ce31b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (593, '{"ob": ["15151515f6eedbe1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a9590028c3db3cbe9112b66275d97c6e15aa795265174c99198d92d6894309d2ce30931c99eae822457021dbb76938eb46e39fd4cb2bc1188ff54d0987ea8f0e36b9331ef80628bf7314a492ff959d2b7de59f194cdc7e8390a422a9beadcd28773e0bd62672d53b41ece996940aa1ea1291ed44339f353546808f7e2e2a19f6f7b050ec9e4febcdd4b6942789270e7759e11df733e5100ee0b2bc7a2cc84c3f2aaaa6607f03c6a6577bc67c90dbcadd06745da58a5ef51602e2388285c006e6c665e56393ebf13b79924fd07542ebd2a1eeac1cadba0eb23acb1a720baa4b40318343ce0891ddc48bf84f8b0a71374ea6bd7416589e3f30316b6d6f42e3f3939c79acb41a632e0ca03bee72a244c755c1ca0431d2d6a97ad8f3e80922623880"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (594, '{"ob": ["15151515f6eedb5c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b1d3bcdf7c6512108501a5d4b454d2cd282fa06fb6c815c40629d798ba866e710219d570efc2ec696fdb358e77678711425b6f3dff865e010b8e0410ebbf57d71646299a49d0f63ac05c2e04d4af283d3b4bfcfed952655842350754d78b5e2bed292314aef5307f15b58fec5847100f2c3299b5d18911e1be6c767a38df1c8f9d3fe3204bed7e193e425bd1ed0338381a4c2184fa9d41a680a4fea02a64bee596e39730b60a53b3341c394517fd7165046ad14856f2666cdfaebf7bb84d4aa35e231e5d8889fe250e9e91c9ef0054ab8a36c18bad2f119a07a9742a02209cdc45f11947d2f741e1906cc33d21fb734ea60f5ee73dddf3fa6a2580495b16747c31bede3bacff4614294d0b27212e41776889b1c802700a37027722ff8f7380c9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (595, '{"ob": ["15151515f6eedb7f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b1d02e56aa500fbe3ac89bbda6081247192f3670dca50135c063bba0e0865d967db4fc8c642ef2a7c712413af8244351d6d9eff05c54d67312a840ed9ae050044c42138c5b69a2801f71e618d5294889bdcbc80d6c92c8d4b01634b619e28bb2c849c1649a4155af4253ec5132ac7ca20681dc2c68c2cde6ac1413d795f70f6e6284c2e04f0a6f178174817a6a869bcc16aeb4967acc7b74363faea310b23c4a4647ad91104cf3e5d777c2894b1c3fb952b32fb9ed0162e2a8303976605024f03be7c71272a29087e804b2eac76a985faf2ca073d935834a9d2e957d4ba641d9c159b4704b3e7912093e0aa1b9e32289b9b72a47511eef05993dfd4a85a42c4b9cac5c6726dc4b03c8ef77be08b9bceca2afdb18567aec6717c2aab974ae85d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (596, '{"ob": ["15151515f6eedb64892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856e9862d44af613cc0a2ba5e3e9706bccb35599919e25a8d5a52b2b9bd1095641bf666c0ab517e8101367fbbfd1e52dc94878dd958e67d6d8590af53d415932d04fbd49b1b38d12962d5d90cf9db7b5ef13f924f92731023eba731bb74aa4ad7fc503ebebd09eeafd3917dbdf3d030dff2d8739377304600c16fa16d66a5a1de14ced79091babf59be3e6ae5b994c6cba5b6bbc38b06c2c47f5c1636e3b228ab262fe2293ef0686fa9f72ad3ff062099250fe49368e1c9aaf00341039686d727ecc46cc0b24b2afe222efa67d769e14d295cbd79a61867b74b966ecbd187d50346169d20a10f211a1a64ca9efd2ca2946ec9f0dfb11cea11ed03505a8e238eda94589007dc930480346735fa42032a1ba9d9d6f54dae5b0ad3e2597cc77653281"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (597, '{"ob": ["15151515f6eedb7b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853e8547ee44a6eb9bd389d95c4cafe004f4a65a142bb28fd2e5f2519762cde3686b9ad38ad79d0bbe6b40112a0fff8cb0b93997626500391bbcb2f306b06b5a123b64ac95cb1bf5dbffb5c587cc210996509e712eed28e9b6df4b4b3eb15ad57a023b61bb7f127884f2ee61748372c988c6621074e5ff1c94dc321c708a9dc8ef59dc97d061ae0acf10196fa9c260dcd6e4489cf41c4c1e2c471d24dbdc98181669af5444f781f9e8578aaa0b1a1cab6d4c7d4d43d0ea6abdb1084229873b12e1bba29dff81fde8e593994b3aed96f0b1a642764ef700dc5bb28142be2935977b36bb680bdd42fe8643f336571f2a47201bf1e3f751e28c6fac17612f983cafde6e44f48914b4637e46c4226ecf274272700e2aca4722eac1d5a9f3e5080132d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (598, '{"ob": ["15151515f6eedb43892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c09ad54c193c292a19f49b350d2d084777f4b54368a07ad1aa3e948c7c9372cb0b6fbc9f8689e1304ca972885613f7055e969ca8ebdc278f44bd8e070c4c30b17c33227bd709ed6ca5fcb9fd581333ef0d0ebc6ec15dd9db28a2e313396371ed2e99521c40bc326b80fa4b93fbc6a67d14b19dc780dcf8a0516408c562240177e1c6852a9638dcf9255070a8432e1a0400d5f54f219b8d0335d7ea00c6037470407454265f3f1b2dbba56e96e7119a9e0c2dcff81210f29c4ede44ef94889b302adaf63182953077d2213a5310652be41eef9bc4d848ac9c1ade2f04d970da98799922ef9ab065f9b962bb3b67f6836366597df7d83c13b54bd76dac99da3935064c8892eefdac6204026bec8d56c9d7616c5f2ccba2bdff59f7f6c2d5df8c93"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (599, '{"ob": ["15151515f6eedb63892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858ef538f15ba92f54989e91ba26c85c01f686eb67e8bfd82cc5bc0c2a4d0d66d6187d7a05a66f3d51f5d95bfc0a8dd0568945db07c03328d600f27feb25ef3bd3e8bf8f60b923ec51232de86dde4f3676a997c62a4dee43dfe261991f9602bad3177049cc381a5f8f515676290d968d6ed4397c545f61b5a446b11a842c876d9ab641aed9463d2760d922944bfa8b067932ade70c7ce5f1bccde5d2e068932d3d5409531983541e93dbe7762fea4d840da5f589202082678f8405ba7f47c196bc696a0a4eaec1835af8dc44993c435d9ebeb53d4d4d52dd03b3fc929bec0701324f9742749546aadee8d78c0e2dee9134765fc989ac1c056bc3c48aec887514561ae2ec9e34ef6bc493ba1aa4b7f2b9d2d0c4acb6f9b53c28c8395725a9a530d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (600, '{"ob": ["15151515f6eedb0d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858c197e498a8361022b01972d61dcb067c413fd71d8bab28f1a12e58050c58663476ec8f719d51de69babaf90a5c43a9a997536962864e51760580fcc0111041264f088ec37501cc639b7342f4255bce540c271c10a02ba1ece290cc9f6dac7a0cf803bf3c5236fbcc33e64e8f3b02ad293312d5624aac2ecb5a1dc1be5a24efbbbc0b918e0f4d1bb227cfd70b0df873415aaa22005e0c21d11ec6a44036f2df677e8c53c5aa3c31100f73e32f11116482445aed66ff98304d5c8f43d51d761b03e695fa4de8afccf1de6b3c9c29e86e5cdd04f449fc23ef12ae56d2e871cd58a3c4c4ca082859ab20390a2834820942e473fbd0104dc111519f9438120991d71246b90eeaa4b15eafdd25e9c7f00392462d31b6d4e3b97558b4cd9b9d68e9e47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (601, '{"ob": ["15151515f6eedbf4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca39c0a5dd2a42490256e13553735eacf08234b352d3498765bc385632eb9ba8c926501bba4f2b968dd0e0e28eaf3b96c1a81fc720a0d3b0936a8f04141da93a4278e1d23de6fa94ba8282e7b4247f0c50677026eecb91a37e7c389b11c13eafffe1d4651baad1a91f39edc737ffd0546bf483b8f2d013ff6b473c88ff4562c7aca678bed8262108eda99d0e4bc8e0eb6dec5be42c5700073818c6c69544203f476005c2c9a59b0f6b7e4be04bf10579ce2374ee3e265bfb57beb9ec2f71b0bffff7518addcefed45deb4a4089926494f601e9ecd6835094057af5b96f86dff6f32102feefc947dcd58e7591a6c4a88a0ea8cc09d9645b62614e7a979d0c2c142f7357d7260718c6129b902aa5c24c05c944ab2f19a63291e2a123b078bc5ca7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (602, '{"ob": ["15151515f6eedb37892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e60211a56270d2b84f33105d1ea8cf007778443c200d332f80534adc4d6b7bbee9e08c6ad9022bed7512be8f1235b09db1b77da0ecaec44ea700a71dfa7b518531a6b1c927f734f3fa924d7b6c749d6f2b49703c154b9b0db759cbbbc648442711d63d6f3d519e91f5ce4c53e0fc9282e5b1aae2c826480d5654b2eb1f2722d2631bce88f94fdc816cb5650d2601423534961c0a9efb8a3a85d1f3c4bf6aae515bf9b4fd7917968acbe0a97543b957a0bb6f9c359299f5f561b80aa54b2dd5cbef48d2ce5a65d248c0071c7699cafe8c2bfa7a673f7d7a5a2458112fef6e3c019ccec6dfe93020046107278adc202c02bcc94969a7b47206b8d6937bfd43f0dd187b5563ed13f701a51d8dbacedc9cd8b6ed521862f6582ed69077a1b7cc28a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (603, '{"ob": ["15151515f6eedbf1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8563f0d04f85b0353da7a0464ed8f4059473ba008b34316b0e7fd4fe5ee13fa989e7e444e6c2f3e631b08b7f4b77ce404a0380308afad31b7f6e914e946caac94dce352b1f7d888e4c7fcf0cb37a2f39c31e25b08eba0ed084e25295a45ecc79072a228978c39dba5e1aab467d004ab1247f245aae0c3143291c4213b5598ca3a7b330464e03f9e30b1d844b7ce919e917f1c58b5bca2f4ab73d7677b5775f101503d46ff995cfcd1edf6de104e70c49ebbeaacadf048ff76f1a1ed5de0f458c2a59f66c35d9363d8a55d7ca0be702eed54553e3b7678cc9347660ab3d225467487b3d8485d6f81f064b93902099087dae2329acfadca239691f696bb53e0d2d24eeef4c7a93075136e4c088993dfdb9ae61f4c623483508b5b5d27db6accca28c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (604, '{"ob": ["15151515f6eedb8a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856720631ab7cfaa78ee3ffdc9424691f9328964f86b653322c402ad54b232d4928afb0f74c42a0b32208d9315e45e246ca0cf698b5380f5cf2c5c39bf81d1a044282cc53e2500fa375d655a84975a97d7e874a3ae0c03663a901ea93686e9007468bebacc09a0d160fde0ad22a73090510a2d0e3aebcc1fdaab5ef21901cf5c5c9f4c1612e45d37ff7fa050aa536220b8251ed6a541218bb0aef4e11c4686b838f71755b4e6c445d30df01286e39bc01459fac8d03eeb23be6246fbb8cd8c94c4be751aa3f0f7824fc14e5a83480231e05ed6b6c3e4174dad7e2462d4904e54d1f30eed7359ece5903e57eedcb569c56b66b4dec0aefeab4ed0f717b58c37275e2611e7b200a91b20336a037935e82926bebe01bbcca133695514b0b37f0ff7b9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (605, '{"ob": ["15151515f6eedb99892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857041feb15f472614b64b46f66e7f88cb606476a97ca64d67212b6b0566ec979ccaa0ff3d0be516a280e043696809816aa66c8c24baf761bb5196aa457a1fbd22498f17115b50a68b1f60fa9ded9388181ea78e982ac0c19d29a4b76580a844ebfacb9954b54997313eca66fecb0f888e54cddb9fc903de62c61d7777bae7c85a60a61ebd53f4080ae7033c837f19c7033f3445bcc13a3d25686780411d80e81662018b6b596907d83b03ccaf79c193c6a0d9c05432c61fbb1d9b0f720d4ae3998bc9938cb153b9336de1f1ffe63476b3e2db2a98d82a7eadc8682fb2ac37d9bd3ebdd2eddf92b01a4cb911ee8033ce13a0898760724c910c0171adb0c79ac65094d8ee52b23230d95771e3ef5a423659912a6bbd0ec78b0ddcbfd20a66da604d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (606, '{"ob": ["15151515f6eedb7d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c6aa5de5706676f3ae7ff0f2b5908f11fbb44c12e03579c6904e3753fb78e82c600339d89af03fb2229b096f5b9707a8f65f5b3a2fc51cf5d4bae143c320cd5a9a10b2d67cafcfef31f9ab004f0b3fab1ecc4deec2ca122b5414ed489fe33939216fd207b363df011e1455278f789a1c5add4a5c548161a30550367d71eb53d11cf2c5cf27c9fb187e62b6a359e57fce5997381786d557badf8a9c5ee57c79c134914b31fa7bc82dd617b6bfbbaf919e754e283e79214d03c00283c0538f70f9004b387c1a8ca3c2e75cd24472462544ea3709c1050573061b6e884a4179eb7f2ae9b2e15b83cb4a8381c9f4e7d4d746d5a634cd9840f0314da0550dcec8a82265862696745e33cf41ee4618852a36e2aa93d8b26c8ced80aa9f8f88385fc1db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (607, '{"ob": ["15151515f6eedb8e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85adda607c126c3eaefca5bef4142de2e984af2dde10ec07d49d0faf48b99fdba46491d249d1150ea7e87e7b5e2e8c4bbee95d2a33165b196b5d6e0a67688bf98c23dca8c33927247559daf5e6ff7e85fdb8f2ef67cf80c0bbfd2faf19b9c8670ff2e247afdfc1e96de088f352bafac5065a062a29eafb1c9a0b34bfea178cd69150cab234d06dd6bb58018229985da92ea017ae1b0293363803193a1a8d616c2eedc7d7422fee15487209075de80a8aacf4bedc7b1f104c60ae06f783b926b284df40dfc13708b59a1a0cf15b708fb9d4071804261ecd59cc062fdc58ef22f98590dec0542d01a1e3014d7f8d5479a7624f8862aa4450933d28be60c9024f6df0a97783193203e3e04c819f649bad07bd84fdc97fc644b04c16e0bc573d0b2042"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (608, '{"ob": ["15151515f6eedbdf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c88ad3e0046e0ce8fe8094ae43020ee58a34df81b8f536e7baf3c50579ced4e92c5344ed0e0276cbcd8e768e2fcb33e240681140472a6b47e80df2af7a7c0703e8f1e9d0d544ee60e03646410597f60e25183f9b3676bed50fde69c04449f3aa2a2765cdbf891c3237eca5a0ee9144da5be7c6e46fde43b6fab96bacdf6578dd6d8825d77b28556b5d7b47af0cac9dd1f800d1c5fdb2104d27d732cbecc6e36ce71f4fe00feb7f89b7e571736b92dabdb26882dec63c0ffaeafa05cbbb672cb42a0db470faf129e73ccaf4104b299311223bfc5532bcf79886932717c77b01af7d9c010ec9e3dc806ddb64b94b6d0c3649bb5d265b753f4494dc10e51f7fc7478a39b67ed79967a926b760e5526405804c4357c56248c36b0fd6833dfcee4cec"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (609, '{"ob": ["15151515f6eedb1c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852c7a4682956b3ae88db7fdbac70605b3e98436f1bb5289d2e8c0c3b663bd375a68ec932f56b24034bdb77bd8d207a834acd06923cbae170ec49d1b731bb1ed61155c9ab556769c3542254ef7ea17d85afdf5e9522b7898322b75e4053c965c4b6263a8b6afd55b4d41ba3e022862f771315567adf425da71683759b6994a9fd456ffa12aaabfefc04468feab0a1918b4372016e56ef3ecf390c35e9fc6771ba9b4e615d4270588e65d4e4c11f7778b7169eefbc06400ae95b39b9fc3032987fafce7f8ffe6a77102d580829afe209fd9851bcea3e516082c3ebc9a7b0d67ad7b4c34428b2a0ba183dba9efdaed5537ce8371a9328961e89c37826eb62766189a446005082d672a8c516a42724d9878bd22d40487112bbb45f5d3b2b57ffd20d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (610, '{"ob": ["15151515f6eedbb5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8533b931c318465d6a7da4873d0f3beede9774a84c51520f95b6c528839570f8bc096b5b9a7fb97b05eb178710d7d329a6fcf169b22d82e7a081e26ed7724b26aa5fdecc1e3092a84c49211352f05190c35b15933ca417be33a4b0ab596c0d0780ea3815c2ef6b3fc4d88f62b53b13d499d6967cabb383f9832eb70ef353d6b25e9ff5ab927c130a9cfa344403fb64c1edc61a949f7679d6e3a539e02aff00a2efc367c0ae690802d264bafd6f39c157f3941a051aa46fa9f53812340a120ddad9c01e306661ff5f1c31b5429ecb0580fc49c74f2538cd0ac5ead5ac8c96fab9c2736d51948f89568813e002a7b3d3afe9ccdb4137e0b5fa3746b353025580deda749e18064b54cbb28381a38eb8f3beaa796952489d72802f76fde040f77b5b99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (611, '{"ob": ["15151515f6eedbe9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85323456f0a5efa6e2fad87fb9a05a01fd79519a1f9fa032e7fd54524f0dce60101072c5b6107bfec8d129b936b915ffb119eb38460dcb9f2451e70dd350ab971c73e7dde9a5ff99c8e16a4b9a861e607d68b0a5d99e1db27d497a057884d71172044e220964912da956595e4694f319ce9108c4dbcbbc547c297447240108111db61f3d0315a60bbf77c07e05d470a12ea203398c04124153595c3bbb6b7dd82437ef5e40f75ce463ed6481e7e8c9445523ab02e412c9898fa89d4ddd5877caff61f7fd5b24ef13eb905c590a85a44c19a1d64fc46fc5369cdb6b7bc636e4c868e0e4453598eabd44c9188aca347f33532fb466aaa575610af1b1b0f8a5d3bdf80f0374d79e29784e468b18c680889467cf52b31fc5980113a0e84b37f550610a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (612, '{"ob": ["15151515f6eedb02892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851b3fdb3259d281020a6525caa32e0c9bdaec4a6e6881f754dcd72901a281ffa9acc97c8993abbeec516e6fb2215104669d2a743691376e03d57b5dd264d04091c633d5658708ed57fc73f1b6502ba197b0e46167de35140796c9e34571cc383c1ac8412e8c2d011e85d3a51c4b06377013297da435b93eaaa7290209cd4460ace781e2342db8a1fbd27d8d26f7b2218eb4b986eacd90de4e8baf2dc88680f7e8ce625d1b4294bfa46eefa7474f9ca260e3b3d5675261cfb6f08802908aedffea65075b26649e30c981b9cdc9e4e60b8328d38917fa728cc02e8fc5d321086136808cb5d41b0ddb307abe78e08d8fb4d87c422c463e35cc8ccb7fb5a38f6a233c79b950460809b5a618d75df37476abdfe95100ea1467603620ad80b21038e0da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (613, '{"ob": ["15151515f6eedb57892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8512a1c7b692c2047803d123fd9c7cf56f09a5f0c3968a5c2100d094744450d9bfd1bc434a3b9ee9cdbe017d40d29b4a59b1b9578e78bb2729efba768e62abda0b93932b5ba3fb77958414b4f4308da7462dc7f25a7ff73f427d41c12dd64018d9f711a134172a3456d0779980489db7e607990b06633bf4328bcd1ce53612f061274e133545fdcfa5e4e4b93e56498f2416988fe70ffb4cceac99a0b4ff38feaca588da5e160c60ec4bbe72c9b10c76c19caf6e13be91f4b13e83302bb7a6aeffdc33c246263e5350c0133ade02696959769bdae48acd763a350a7885d6626793ea690869b5b670f718ab0127120ab7da5a8beb07b94960924d64b069e671f5bafc7e7c83901ee1f119edc309a327fe35e84f4a1e9fedcbec8c30ff433c429775"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (614, '{"ob": ["15151515f6eedbfa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8518be2738e9595209b2a112f8dac6e7c35fe873a339f7282b080e907fc72d096a572bff8a65a7511593a64405b0ab559267ed2a0bc8564ba1861c39e4fa413cc41e5ecadb616c6347a612b750d4f35593b4cca2c56dbf131b9e90895c524e7a514c55f289fcfd9dffe283f653bce6714a53b38c51b30d13a7e0bc8d521159a0538cf173ba244e7aca10e81f1d1fb4a2fa719a32c48569f35e5c7dce2993efb18885e1709d22dbb16b3edc8ab0097d9e557f6ea070fddc1c8587f6cd9d8ad9985ab88bd7b789c6b2773a7957c9f3365a68f9cfd01e52283dad8587fc3d2bc550d24dea0b1f531a0344fe987bce434c3b0de3a4ac75d22403e7186ce549807ea376f9df8a16c098eaed76c61dcc98f0f3859e00521ca4d2055dcc9ad380afe634a2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (615, '{"ob": ["15151515f6eedb86892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85626bdf05566985a5cfa108a2a041ca79892a4fbfc606ef00b8385343b541557c981746bc136c875963a2c9071a838245f0db34bb371729dd054ebc104fc535d65b6065185cef2c07ebb8f65328e02c9a9d1cc018d40fafaa9a2c09f7f5edf60cbc6ac1d1456c79530b92c06af35ea971cc2717332bc2105a15c766f1d0edd58d2c8edc706111553e76cc8d0087241c0b8ff5a9a6576b26424b0c26e4e00707c96c489411399b6f37519b0ef0562c6183fd4a06a2f2d9006ceabbd592bb13205ce5d46dd02cd6ef9f4a5ee4d0ca8e285ac29d35dbadc400848fdad639f0c45331ff2e611e2f6091c59a097f9d7c5e8c57b183e73dbf864fab183082fbbb046eab52743917c27be4ffa2c5e6165d9a41532ff9c88a96cc380efe858c3b5ba04286"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (616, '{"ob": ["15151515f6eedbc8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8526f6c96deb4537450d1a1fc5b67d375e08ae6008d0d1bf6b0a24b6cd776735860dbf327ec347c0621965252091e4b493eb2b232c7223aac11a22b321d61c20fa65138821567fafec3309bd61ad64340c017570aad7f01f898b6e3ced99844a5f8e1a4b8cf8ee09261048e3a54b0f82d27df7131123349d199c88801fb2e088cac5a30ad93d1b06797fac0548719a61688d95cf899379342917b7c1eadc615d53588e56d704c063a7215ba0617b1ddb11fca7cab9d16de84b5904588268be6049a2a9257ce20b10313ebb6af873cfa2f6f1cf1e3d8ec24ef46042ee79f7c7c378608a7d636bde56dfc313469d585e7d69de6e07b9259fc26ab959ce314df014bc7036d34e6ef2583206bc08b3cb694855fea850306a36d2c462bb31e0ff42fafd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (617, '{"ob": ["15151515f6eedbc2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8577186b8bfd01adfd9cb1708ac5ab250e0ca6102e91bedbe5a12148715bdb54b9a5e1e27c8a2c30a1bf27c769e90102bbb2aac7a933d02c6f4fd97c4ade9a04b31d08a4d85828f0be3b9593e84c156ff4bac2919f50c2135624d4c75f9de69dfd4e62df22d01b02a0b98526041a704c9289bb284cb2b3d468114017bc1e68b31a9f2c51dd472116f1b90e450c32b1985465f3ede9e1af66803ba488c245cfcd4c502414418de2ead9ba7870f7ec121565c48e8068d4fbc22589ec0f7ed46d11d1d83f7b0991dbfec143c274a6947f513b4d685d9347093ffc69c8dbd21fa236e7801be7018215f772bcd01bed709830d0e221f05eb37c831813bc0798058c1bec3bebdbf5cdaee51a2fd041181347697be0f5164fd79582aedeb23d124aed1797"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (618, '{"ob": ["15151515f6eedb49892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d9ebfa04cb59ae6af26b8ec52f79da74fde317ce7f457145b3ec926119ce8513a7b9303e3e1ac41eed69587292eebbf2e1c64dceee670affe8bb863f869952e4d3a99f1f133213d4e4b249448d52f191d4cabd4d88d3e1919fd308d0b21d89ff0cc37b9704583cff774e973c3e14f658ceb8721cc72f2b5073d57120402a7b64d81a019602868adf60019516967acbbb994a6ea49d4ad8833723c4c84b9ae20be723516e13df52e5e8be9deaf63a9d9a05232a3ad051387129bc48847d3b0fce3d459baf81a4c2e0f070a8664894a0d770ad62be5140399cc8954a78aee0379137721120c34fd542bf0a9642d5e5b06e09a9c1cfcf9ddb1e71cd585f921795e00c60c7e8bd38095c73857fa818801da429ed071d94fde3d81312c994f0db0852"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (619, '{"ob": ["15151515f6eedb66892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a05616a89c65ea696e08a466bcbf71d2e2a28f76ab8efc713c8faa485d89c715dbbf925c7a6b3e06ec5d037a32f59b722f83a43ada0b6a165bf667cefe96c1b591baebaa838e051714ac4043059b4454b5ced8e5205467cc833e18c81e8f2e4520d0c9dd708298e085e26a5cedb49b82f021125aeaa369b099cbce5b87834a7a3b585c2908c5b9ea0757e036ffceb1c8dfe5d31096e38b5c2fb97854bf01a875531fefeb4790dfb000865a92d2f6c187f21d7afb401a690a9699c898a4d8aadf539b365b9a749af3b7526d2a89485f6dd1f2832683dd923625804ed49e7506a053b09ccf42f0c0b343b3bc3ab5d55e3cae405bb7bfced16a8b0f7006b01fc093cb32697d52729ca8338976cd982e5b85c72bf47374b89088c4291a5c56e551d0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (620, '{"ob": ["15151515f6eedb9c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c8d31288df910e9f819048d3268cb954fe4e805cf339ebb091db851c9066130146569fa5eb5e40d00711181cfe0b7a3b7ad99f26c3a665560e7810ab17b3ec63f5d8671f992f4bc09dda3e7990146a679f29c1ef20c6046c3afc5d302b4a566c69a81db730ff841d9a94ec81f48438558ecc9f44c3b29b59a3eb20cc65221e9b2ae9ba03a5514873e7925806cd8c23b2e224ebe1966db9571455189417ccf8b375a6a9e5d625ad5c4971cfeb26c50274b8d8d70ebb5b57c4b7c0cd5cc1cf1b50f513948eeaebea71577caec02a2379e7d455edba238441aff256378a8e5c7c8dde6e51080fb57b459388a775c7236ff16b391c8b1d4d6f21ffd900a0bcb7e67d77eb309c2ef2260a8c59a47db020dcfa914f3c057bc897c4ab4adab0c79eccbf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (621, '{"ob": ["15151515f6eedb5f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8593b5b1fba33c5a00a8442bbf7d3dca2a51061a57279dcbb5184b96e52a51dca97817109a6364c3a7fae4388817b8414eb3ab69cfb8e0717baa237a860a0c8b7b8cd1c97a8c1383f1145c298875640b59e00ff46ae4fbc5da9348c5efeedc99134d587581b1073b24269a4f75758322b633915b852aa5c8d230b42b03f8f86ccee9f76a4592dbc2a8513e495735837ff411345ff6d44616bad3aedf925cdee4de18a02e901579df301351f50d3032ce54554703393c88ddfdda52103a809ccde9d2ca0a5441f0f3976fdef466445f10e40436e9fa6052de2254790839aedfde063c1a164a3178337a0c438f54342849eaf873c1028379083ad2a936cf65d7ebc7be560259fe82c56ddfa6ed0e472c4bfcc316e751dd788b1b240b5a756280b002"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (622, '{"ob": ["15151515f6eedbcf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856ce884ec6d9581ec1494035c916b3dae305cf9433cd7a7c60011ddfc69af68490921f9a5168d1c2e6bc2d0234869493392f5e744c86e809155cce6ba445990a01249cf6cb980739a62f8297fd7ea97d8e67ea05de065f982e6638c94098cece788aedfda8de8a6b3101663e6e78be1d7355f8c9bc59b640256c3ece5b35b5925fb0134e1d6cae49e182e6500f2c8aa12d89482a021c9b585eebbf639057b7eebdd6fbb5c0108d82d5aa54dee1717b60e37a63ad8c59f3b6564e563520a653d029b8b04c5da613b61a251daa7d45ca2298c0485fb59157de2e4ff20759655d9248280da1c463ad596f2a3a0c08e528e16a0a22954363230ec8d37fa856f6d1bd47cedc1244a6685824357f447dc1c312be82d92a1629fc3ac29575b897e592ed7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (623, '{"ob": ["15151515f6eedbde892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8546ce7cdbdee6f9341ae97c4cf10fa120ed6d7e93aa4ff48ca85df74855df0fab8d2b55569961a3c030aee5c3dcef40612c42457fe425314efaa3ce0d4ee5c75f3a519356ae8c353db557da776ba4e1c08c281ec97757c988c58c3f4e972bc1f6c4ee21307a4260da032998acdd7cd789c1d4658b0f9de37e437df1b6e3cf6834f8bef74277d4dc789db513d285c5f2c3f991b3f31ca85b45c350c1c2cbf6e60a0249aced59afe641a1d26f2bf3965d2f57e09b5faf12643054b4627e688188c32c282693df58065d8b350b2895422f13fa36eeb9f4c9c8db06e59677733cf6f6078e00386ffa2b00ec5550217ea394f2b01f8f41ead7fef1a1a5ce83547846646196ff0a713c6adb93d1df38819da6bbb2ce231ab5a5422d32390667a0a67525"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (624, '{"ob": ["15151515f6eedb3a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856a163887a617a40e5a083101c7015491fd4a5cd632e8af1e2597098a61f3acd7ba29ccd20812f5f67e45e423854efac38d17e684137c6dbeb9a35f6b6d67086df8a4826978a762be23986a3a5814bb3e4d22e2eacecbb18a634e3fd4e027ec1a566cd568df3b0f99d4cfc462e821cf34fa99782fdb22f5106a19ae71211313d0f1bd124c7d6662f3d671db31cc4318c93d4ea392f9400224f29e1eba9329e1ac0bfdd8b6aab89ca0bc187390e26fb86766fe424b7e23bbb204485ab4db3fa0ea87c53f8860e4853d541b61d706c4dbf5f410e26419a4b9888abf550556b6148abbd1024c28b730d2d33a434b8bb9eef6cd59bf045a3105d8399c7dd39b815df2468365b1005084adf92adee08d9c8862e69b5fed84d42829d600a2ab54408ba4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (625, '{"ob": ["15151515f6eedb95892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857446b895f9c3496c4daa10837f3978e8e786a1344b706f7097c392383c648ee38c8b22776e951fff15aa1c3ff06229b4efea420496b7b5f694e42c9fead528c0513fd3ca77075656b99c67a5cd712eaa812101c50698f7995aafe629ce200ddc0a05ebc06a536e7fea2f4b03e2915e239c6335877261e95cf10c7f63726774ad910b181dac791f720765e98288ba7f4dbe4111c9ac321dac1a538e88f8df785f195d6b9f7c0779b6c9abb8380a89cd5eccfbd90d2073f5d167d7067e9af7d48de498dd8857f32b3cfc3fff10e2172581238711646c93dca331d10e76eb9adb903806feed5e78070634cf466ae8b9d1397376acb8d90ba97d918daa4d3a3c91b42d0e1e2aa9cd001dfc101860e008e121612eac5713d2364e8e8235b33d93263a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (626, '{"ob": ["15151515f6eedbdd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85440d864a2ba1f14c58ed5504314be2676e5d5c0440648810d6c1bf1106217f08a7231a276702b8e20f4567f1ce097e8f377604970f2242c8dd7fbcb0d25e5d3c4b1748067c9598157abeec1e5bf8941ead9a405986228de6a9ca29050a064e6f13a41b0ae073ad8b87bdbdc938c035dec09f3a24907d862284074db84eff026acebb5a1f376457d08219a143feca21410d8a43acac7ec42c00c41b41e82ccba61236bb846eb70292e49d8a3fc98d3654b2d2449cfc751c991909b7609d75e56a5e119754db84681406e9fd15ad3172263c5898120630b08d54d0d818d83148faefc41cee59fa14a0aac2a58be72215c0ca1180480bb62316cdf8cf9bf8576b97256e595809c8404df2abdf87b812a846a4e3aed1d1ff826c71edff3c924edff1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (627, '{"ob": ["15151515f6eedb5a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853c3ab292a2dfa27f4fa20f23c90d87e5709265ca397a7cdddba7795b67f9131ae3903896f9c8d2d4ab04dfc4add67d481c4a8a3596bdd41fa375081bbfe4c8264077f6823511f93f1e5010506e25f7eb2779e88c23c188f3d3b68205ad4576b3223b8200d83478befc03c9cb08cbb4ff4413cced4525d83a133cc26b661e8087019fef5e2ce711bf02b6abce9cf4f13958f6c2a50b1a304f461da789ca3f8fc2d84b0ea8ee79037d0c0fb66510eb728e8fb43d469af8214c772019705740819810f58cddd0b06812ee668f25012e563ac069a050c537caee338613977a8329924059622bd5bffab38ef8070934290ba74f544bd26dc868dee2fa0d5052946cbcdfb2cbfdd96336cd50c89c40d22cea098800d6c4c88ee673e1c0bb1b8bf3124b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (628, '{"ob": ["15151515f6eedba0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d8500a31a28d07d59f77035da3ae4c179827704a613853f771204a9fa8e2a26953045132939db5d228a65e2b1e8d0e2e3c67ad580f34d924b8beb9bc7843b3d7eed9e88ffb18f15713747d3d2d94059cf0b847b02d9467e746b03cfdfa6e2e24dd970c75fef4a52a47b7b186632095b50c7d2d524198afd95d40800ccfe6f657714ef5993bcefeda6ef1ad1e9dec3641593af5f717145a72ce104a90236797b86a97927406ee1d9a3f378518cca8b155eb00aed4348a5eadb75b27cf063b22aabd93b7bf1c9c06dbddd936582b7aa40454e254d672381f34e0537787bad1d099eeff7df614170fe9a6f137af16176ad041a29858526f7d90c3bbacb12496d752b2c299d7bdfd3f10930bdf58cdef4e52f08628e22eb8f5c7f074123702927777"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (629, '{"ob": ["15151515f6eedbce892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c5ec694f4eaaadf58d9f4a096a8fa68b1ee9b96c22eee4909f10a4c14d2969b7a4546ea1a078dedf06215185de27a6b9779ad59eb9394a49f735574438ff51b09b26c686adc5fa18d13de4ee4748745c563aba6966595d987311d71f5b066b76bec34ee990f22dd5de64e7378ed46f5936992043c6fa1a119916f4a787a706125fb201cc8fc41a8ee5823d498b516962c98bea94b8b85608845ecc8f5d116bccbda42105cc44dce74eae2e4183d1265e9e5921ba693cc3d1d7aca748311eec232e9afadbabe9e4c7829ac7e9ff429165231a9e9efca40ed9b8a96730a35265f0408fb2efc83394fadf184cd2f0f1e239851765c683d66fa2e2bc53bb30a0bda76b76f7836b971a1108642643e7936caef451a938589608ae64773b1014a6b3fc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (630, '{"ob": ["15151515f6eedb3e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d8ac6c45bc400dab53c158b27c666ccf87b76f2ee659ce583888025b8d795210a7a22d6bc2e530e268c33c62365e7dcd11f474b5540cc4bab5f52e2aa0775615c0caff1dd85a187fd6177a1a192d5e70bc3c9dfb1e8c2f4cec88e9f315e792a3008ba5f027420ee76d39021524a72757bd904c9d7183a8d7c88343d8601181edffee58c38f4bebff12c2d10e14e5a51a209f1d3c4ef57057db701033cbfa72b488c587330ae783b93565dae2ffb4477ecc3eda47227e66a845a1164dba80a446a9d5929ac59b01fe384da6a442c06aacfb75cbff593486d900969a8a14b0fdf6b819ffb15a666c323d24f8383a960248bc20e0487258fcd45d189b84c5663727b622616b8fd92ac5115bc1d69d1323ffc885790083678fc41411750d5417eb58"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (631, '{"ob": ["15151515f6eedbfc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a6b7633015b8b54ba061b0370c3a9196d869aa4b7818661449338ff742eef59c61ca9342c30f31cef0595d87994b736d41dd266e8488f687adf1d806b9b1e62924036af99468d4c2491a95c5f29d11354c263059dd8f6b2bedc24e3cb22b06bb6ed2ebe536cadb3c43fa090002f97693925b36340f9e55c8b9367c3e70d57f2b99c9e11a976db89976ea70b759260082d1a5da088122957feb03d93e6d33702afe55dd600b8998dbf7c20e7f34d54d20570b668ee891ecd2b1818711d0173b06ad9b72c3779999bce51430587fb0b1448aaeb1d21f6216d79196c90dcfa649efca0d7bb64c8e32cf8db205b8e12acb0ddc71a59b90b56b02f26598d8dbc4f4d9a667ddb9f31330b032be1359136c4f2e7ab68e2f35c2818647e232ec896610bb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (632, '{"ob": ["15151515f6eedbe5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b01a91e2be7f99b05b4846a91b6b5cf3e3be0c572289a2c49353ee808e86db55e70619e200e540e858da84a38b17eb9972b716fe4b78a541cf41cb71f6f9e3833c72a024584657fb91f140648ecca57a6f459f071e14ddd7f075bf36509ab15a0163165e482ba3d79bb1ff9c6559a52f9909728a803298056972e9c2a0e0c75c8cb03ae1b21bce17cfe0d5037c086f2be712d32ef90b2e38f17ed3649596a11703b90a81727263d877d0fdefea9de31e794a0574d1724fbb41ca78f2da877353d578eb17df5c4452cbf6e626dc2cd029eecac12b920a9bea740dc226a37abdeeccf02d2a0a5a2a948816927daf37ff5fbb935bae7fa37b23fd1a0b78f9ed901e5f3adbb611810196012d21659ac38adbdd6727098b6a1bc9ead6d9592fbc52f3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (633, '{"ob": ["15151515f6eedb82892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85bc4ddfadefffc52a8c9df4288a82e2a18fa828d14f99db528b464a633e2576b94b88214d3bc9f2e94799b0b348d75f8f91ade5b717d90576646c0d9a1181ab7982fd9f78b5d3c5e78c1a9b1ba11ffb82a0ca1df8ea05eb2a475c2dc1f99135bb288e392acca7fc780278ef938217f885044384c4b61e04ac3b5c7ba5689a0396a7b4fbab4443564323a669b5701c487b70435dfac8a69e9cc61ed4967eb9663ead80c44ac68e65f6bd9eef17e5e16e89e2a0266ba6f014b360b1a3f513ef90c2a55dc0c5cb8a36490e6d879aaeec70e971816ce409c6dae4462d7d17fb754a3aceca04bc21f356464ac604f2d35588eb0b7ead2d48a11cea696ed23b72f8f8432e2ba52717c47744a02560c96bf4c40806367ded145c5bdc0a1e8fb52f9d1ce3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (634, '{"ob": ["15151515f6eedbbe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d401da41e14dd9c20e6ac22d626faad2154932c4f43686c636abf16a767eb284e5bb182c552d74f2bedb78a86ee1bd1a1bfda19ad5eca1bd9cf5fa4dae2f79f51dc992a4d28a8397c4ace0894b380416c9f426fa2dfee40a4e68d55d31ff562c6931e9750d3bb1fbea050855b906ab4151d45e2b852ea2df769c6879cf5eb17115aa54fc587748b2e5202cc6386f8eef81b146d71acd4e08d61fdd5d5385c71ad367810c6e2f7004f502948c94cf220a27780813a68cfb70c2fec58969138c03ff537b7fe86c874ebe25f24a689127cb81ebf3dd9dd97ad921519a086b246ae5ddc941741a2fc8b3c0796343314e8424587afe19828fac794a09268fa628bb0d248c59d66ea2dfe8fee11c0ff1c6f46814f91d515a1b0e82cf0cc354a64b4491"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (635, '{"ob": ["15151515f6eedbe2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8566e6745bd72b42e0da0343eba8cd8b97d40985641fba79f14ced28b37d5c87e6327ba55c82c7911ad4daa8301b896645f0a029e1a2e8c3997903828ccbef5432b00a5ee13d8aa58d88d5740156f31dce441feea78af278b5e40d5cef37592d0a317b38423958152b862191e6dc46ec6123cca087c7a36e86e35d5725e28b3350aee5fafa227c284c9cfb255f4cea6e1b38602740c410a2358e760073516991658e2dcc9eab08c65f89fa195b6e227ed9e5c1c69d7aa57c94921dddb6d9de1d288701e56a7f66d72c0e7bea4b2eec4b7a3079f89c4a8e13a6581d322fdf46143ba22424fa87884823e7e56d9fbc97e4d49c9c9551cd63ac563b6d1740490e0dd8bbacb5fd3303a8626f0debf5b602736b0f4124be9a432eb4ae322085ec6387c8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (636, '{"ob": ["15151515f6eedbcd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85be3a6e69295f000b1b336112c7979f9922aa00796c84b138bd40d7c0436fc7d79878133daef7f12f8ac6eea7894b2c343f521cff1f0651bdc84618372a475625af5e20575b3297778c74b7fe7e66e7c3765b57af30af8de52eb036d2bb69394bcbdad86a4fab334ade93fe54e5bb4172b99ea65f7fa2a7e2236af07b0d3a8decbe150cd5261e8ff9e3a4d75e84d94aac8f5eed87877e1a166d8a5309c30365f2811226dbce67acd9f918297a2dc4f2751f4a5b530c008fdae9992a5fe54a69802cd81f21ef0f360943f8f1ed9a00985595e6625a3e482ba5226005387c60a00b98e562c49224a5ef3c879a3cad3eb7d68467157fe3bbf4bbc5e552dd070faf0b6ab0a13be16857a4cfffe53d0421bd597367c9bd5dc75d64bd004aa93c4a01dd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (637, '{"ob": ["15151515f6eedb5e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a74c7ddffd6159db4fd53e122a070eaf47a49821ba88d7fdbcb3d8bc0f92ef95031e5bbd9a4259a505f914fbf7b449beb9f64e41c4b6291fa97ed8c5c9049f81a1436bf54e97687a8c37e5ac5d4647cf7ef9ed39713e16d00be3adec44feba17fa936065aa7c07db1bd670d91cebd64d6c1246bf7956f6517043e1e102ff8ff79212c7c4a1ce39ae9af4d7854fc3ccc7fa401cb846d9ed7ec1e10ce23ac62d733918883c3b29447525ed5e1be219f14ca431a72dd057f77816799737807443d38d5e620a28cd520b188243420c4bdb9f9ee3742245d6dc85d0e1f95b684b67234f1f457bce628d38325d14aaa90a1fa7dbfa9d6c6ab72da06739ce862414ea1d070f838ebb89c78367c08c791cc0969f7045ed2c1034dfcbf6f849b72507a8e7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (638, '{"ob": ["15151515f6eedb97892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d79f46186a5b62065a6aabf2099a2c4e35df48e3bedd2e201a7f0ba440fac9fbb197226c6eaede573e0c3ea787d6c3210800494ed9c3d8f138022e6a251f8a1d4ca94c840196557a7426e2993b83186210f885c8485b57d38fe426d3bce5b6c3df04b4d62f54ec04d33c0548e00410b1e8c32cb5ba11a14b663f5b19ebc409ee8f0135aa01e5755bbcb65c9f92a495152144a8d9fe2ce6cf34a9982159771278f29a4132cd0787ca465f728ed6f7ee9cf6e4d1c037f32b374e4bd03f01122fc31da630589c48ea84eae93298398e439c8e16923fca39a648ef9fa70b7b7a31d3f8ce8cd2274e16805d0cf7932752c37a9637ced3ef37609f87ea0a5cb55a8130b2f70c9ecaf49449dd6da8ca468ade3815d70b273af3dd126331040764cec901"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (639, '{"ob": ["15151515f6eedbea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dbc0fe635538ee133dfa2b1d702fb318d80cbd4752d0621361735e191f12f90706f595a410b8d0ae10c76e4549c9b20e2d572d91fa5e8fd2eda82be9ce35979a0d5f9d2d1668ae5116b3a1f91d2e66e5a68ff3d38d652f41f9f0c110c0c65c01d20b970a9993d629fe91e864d388102913b9f7a990ec16f3c19e940a293921e9f326445609ee40776ddc72b48db0f6d51b61e4c3bff7f8f6a13d879e8d1629d92b80e69bf0b2b0680b0322023781bba914134c2ee9e083c910e0939b44a8416153ea4a87900e1807333b30f87e4fdbbf6f4472a8566730ab9d307b1eab38cf44568e517625df77f6519b0bea3f67a203f455ec47921d3c16a66a466a848e25fb70a1d5f9dfbb4db9560d2483dd3fc1c47c3f4e19214d57514a4fa993288aa97d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (640, '{"ob": ["15151515f6eedb8c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858695fb416ca24bf0b25fa93bd8327d6d3c445c373d21b81ac210f7f3ad57864df67532b7734381cb40b10b4c334bc7aaaf17667a678f5c79500f5eca2373240c588273b8a3a3e165f8728b4a0e62e0d4b1b136470066dd5e0ecddc7b0947a3811cc1680e7fb322e63a766931efd653de37c5829e50e991095ead1acf7e09e1b0266ba6e2fa7e4645443088b881fa2dfdb916b9745621f35f73917961e000c81fd2acf356902c10f89711e3b5c92397ba535e2a98bb3155edbce23c1d264aa5e7f1a95d1b31386cc95ddb44837973e8ecaf91299b16904f05814f1e0027a941945e0ea088ca4337d59152cb1f2ea645b51d14b4b50e4478b060e2359adcb8ba2e5a563a48282e70b64f35486f52925cd1bbf40e6e51dbdd1b930592e5efd53449"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (641, '{"ob": ["15151515f6eedb75892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e8b77cfa5f6840082b56e6d3461915f896e1df8ef59f99c9cf6e7eef78d2a4ecb037349b210d68ec1916705baeea8c7f1cceaf6e1e05a770803b21e91ba91746c2e32eeedcd6f843ed3be0d883f06f8e7e61987ae7741efe26d1c6e8c4c9c93e3de928b0821b8764b6f596371641f31e1023df46ad958e533411180491f48b0d469fee51aadc234846f62ec25fa9e7955a37c10dafcae5891eb52f3669fec96f724d07f68b822a0aa72d9e5a4921c7f342d5436a3be864b7a99ffd9a5011f628a5671bd5829c17e42b74ebb17461b59e6c6c949db3b05d8660a8836bbd001d1321f02fb7a2cc0e1d11837fed98eb9b6860dc98e7307169344fbe1acd5fff780a992463b0db9ee8f1c457fcc4fa911e19448ea94bb9601920a0dd2f493f44c3f0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (642, '{"ob": ["15151515f6eedb0f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855ba1c113eedaec6ce1458e649cec01ee46467e00f4e4d9e1a5a334432f5b1e9a7cbe6ef32245ee500014ec3ce51c6a3c1df94680bb2a08aa8573f0e1bb31c45e5645c0d261e4637f733f8c46222cb2fe7cfacc03bcfa401d0d34fcfff45da3c4645c818477c82f6992a62b7c1e47ad7a8d05923348972720bbcf59ce77c859f9ad53938f9a5bbfc74e11820de7b850027372be3905964f4a96854c8e4da8c07ecd5eeb485973960e5e9414928a47c80210200466a5b289a5c35431bbdb26292b03b5c169a92fb9959f84458f03e3d3d823f958f8a750fe66be3d5804e86129730666923ce1f4902457ab1a749f71dccffe322ed81ac409f80458822c1d97b1eed7e25d245367bedde1c0c9ca04ad071d0e43f744cfb963edf9580ff2348c3d91"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (643, '{"ob": ["15151515f6eedbc9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cbd3fb3119df68a804dd53a9b35517df563c9f0702613a98dd1ba055f8936154c05231a8d1847f069db89e253edd0245637db088364041a13cf0f07d6ab31a803fed87608aaace70d90dc88368ba8c74e9d33a3947736c3457cd9bdd02437593971aa3b94601ecb608976f0fb8dbd63022b221b223d4292a53a8e67b2a3768a5bdac924bf05a7fa823fadcde80bc6abcf73ae6cf648e3ba9c61454da4f12c95bd4005bc4661f5ab4f48eebb8d517c48b59ebcf7269ef67e6d09869116c86bd900f2d56ca463634703a7078754834eddbf7c565c545b49e5a651c741cf8a860a4f0c6a4f334ed95d7a2157ecd802a885c2ddc38e7d9e8f2102b71e913292e7e2872cc7683d0857821f5ef8b3e286f130b6e9039a641dd928493adaa1ae4f3ad7d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (644, '{"ob": ["15151515f6eedb36892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8570da295dc95c504e27dfbd4128f710acab2c649ff262706d1108829378d41d8e4e97b462bb241ef517641839f1604ff154aeb55a750919d75626e99bb02ec4963232306ef99b2778456ed24afac82ce5829e484dc653395d11d9fcc77c0a64d14e896d090bfd626963758a92b9b859cf04db6a1d5bb572a1188aa2fe8f28e076e3ec1938c73bcf397495b781e3ffb7b465c305737ae82aeeb86947180e8a8d5e458f59ed57353c9173bf55dc58e0bf2d5d29abe9be46291107e7e58fe5b95c5073c7d714a9c1e613a2a4548cbfca6455ae60b0ae908150d657f549a6569f9f73b1fb2a1d240dc6573a7656eaf78d0c7eb4dac73e17be728f0a0efb3cd04c995d162825a599845da55d22441977ca569377c578af33edae5a53310b0342be4ce9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (645, '{"ob": ["15151515f6eedb4c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8591c381a1cc4fa49f1b72138270c3168f8b27d91b0606ff056f2d95cf0bec92c10f8ed7a5b19e24e647cecdc391f404861ec89e873a229e5c680b9e002a9e487eb41c770ff739b856914c781146337e6331d54a54c3475ca5bff5c0b6db15ef97ebc372d596ee77cd05d1dc79accca6a7ef85f3879625316d8adf7612e8702e04d65dd980bed7f357bc4b0d16fc53eb7b39cb33ac3ba392d79341026de8479e71b72c594f3457e90cdc1251d5b2f1788ac3f86575dc7ac05a7fa36ffb5e3876f7263d6370adc3ef74133b3d0c3d04181c350aa183a480fb807784af669f21fe621a5f49b4763f7a436cb5c8cea83de2b73c27b84490f88276c11901cffcb635009a4c16e7e7af28aad246669f5ca90b1adf122410f9b75d5cfec349887cd150a0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (646, '{"ob": ["15151515f6eedb4b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8559cab3266b5546385c62f1a1d3b5220998ae74dea8244ab7e8bd7a090d9736c4d3193b6a85e77c6062a2a0092f8d20cee14f03add68c6c7dce4b1c501b228d367f6ccab906df8fa012729b60be82f216f3733b995a0fbe7e52d523e94833bc569dcc1308fa9754c14c3c3cac79cf28e2079601b6adadcf76d3ae8fc96c9d808d1adf9e442503ddbf4c858f80596896a68a1179f424d74e8ef066a8d43332a317620b7f14e122b0afcdceb5b1a45fa8de372dfa0c60532e211445f0bb8fd6013a623d0cac73eff515da703c804378e9a4989751c94ca9e72a4b50c58cc93c843675dbf005ffcfce557937a27add10b3c8b6f6d9ee4ac5cb558a261c2015a9a8d453c1014c76068db29f7684cd7b395fd4eed4cf491e24e7af5b65c1964d25840d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (647, '{"ob": ["15151515f6eedbaf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dcb795b6e69fc2838847d6bcb63affe3ec31c29dd23b65be96b678499f653fc0a7185f9b67fb680ba4c89875e2dcfd03dc600e1edcbc9fe8996d033b50018835ccab9064e9e24a4daa2b75af2825b7ceeb57d3254698ba8270cde1bd4c73c18e7a9ad2cdf0bc4b50538309fe402db74ffb31042c9e3b31509222d319fea4f8abe6ed3be04fdf696f3bebd2013c0943a037ff2673454a150a1a4e0ef17eee8797fe7cdff4bb9139040b15b83e1c4a9cc38894dac9287a9ff675555960612f3b8aae4bbfc463197e2c9b46d8057a20bd1375d0aac712c94ed4b8067b2ce91d173cd387ee163dffa23e500e247ddfc7753950dbf145598891e98fb375599029789174a960f7a0a6338f8669a7e283ff6306401f995e2376353337b4d2152983bfa4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (648, '{"ob": ["15151515f6eedb16892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8599d1f63c6290ab977150709160e3eac9b08aab48da8da5fd63348fda7879525361bd2463b94b2548846619485aa8580b2d381d6b1ca2e9aaa6e379c76dc9e7a1b710e987064f1e3bebe41ff6bc99980dcb075bf1c907712ea7ca8fca731e27de407d6d2c5841a493822bd87c8ec3c7118b76bfea30389f940af0c6d67386510679ed86b9d150d6bacaef08893e7de978c1d48149ebc06c73a5108bf6a142ebcf91b52ccbfa889fa09ae297e0314f71ef3299b266a39131ba6e2ecfbaafcc995515aef304bd5db2cf0afc57b0dd13c9efc5c03192b7650b031f165a256d59b0a83ff0d75b76161b481d34be5d8a1f72d5bb66715cf99f970d92f4d97a4a4363632e281fbc5f3de0806415edaafb7aa58f0b11027dab3c255a3eadb996a783782a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (649, '{"ob": ["15151515f6eedb9b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85628d9246a2c14f9092ea7949a359694fe7d2d2131446e21f25db68a39a6208f9a295d629317e5da96fba589007cb7161b5262984f4ca27480e4b2d109428ba54bd95ea03e3322a8e006d3958ad6890e23c62a480b7951ce197288a39aaea65f844eb286941f9b84dda4114d61fda13228c6c9e35aa908ac577ca41844f65273a43a5e8c62b57aef88f29c67b303a3579aded67aca17b03ee1e6c8b7dff518291c62d8a8809c19afcaf8603b45b45ca846b4b4f96ed942485c18e6b0e915efe5abcd8bf326c20478210795901f903531e2f4be2c0f2ce25ff395c075afd7f728653351ee4d6d4ea16127fcc965064eb71def68f6bcc577e4fb1de6d4fd5b088f07c89c9c963981b11acb086251a127078b38da19519a46a2cf00a63892e5953d6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (650, '{"ob": ["15151515f6eedba6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8527522df403a8be08b0c0b100a0902657394dd11d1cae3f7b22fa406182041dcdb726ffbd026d34c7d494690ccb109e5a5b4aaf0eef8d65a32cdde88a46cb5ec29cb7aa0e01ac7fdb78aae368adad06669a3199341bd4597583565f6a3d361eee83a5d074c5d95971113eb6e6a7cfed1df0509770f244471126f283533cab1287c15d3998729004e0fdbbc54fc4777bf5c6e82bff3ec6e784d858542eae69fd434f167d24139d2f161577e722788a518e750df8bfc88eb3982879bc26d62f21720753da721c25b4cd53560074edb61f0c6f8b3c2a9982daaaa6537b8001454277d60edce5938ec307ac573dff6f939a18cbcd4706c89af97e3eb50212ed9bb65445fb8ffab559fcb33c2aabe93e1fe9785d699e8c67525cf2bac29ddddf580b05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (651, '{"ob": ["15151515f6eedb12892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca7c2e2c9d0a9e039793167759ed2208303b824d1226a9367d56ce48254cf59d112bada91c99f43e7300fffb50987ac4e5bab4d63a3473b28a737a936f78541e896843cbaf31e554c555de58a78966ba187d90b25fe64f4f485c09d90298b5d0998819c1e2344ac9c5e18669d6651f846e4d0dc7f6c3f81213688c6a2de9c91517d6691cbdfe59fd89f72fe6673f72c5fc72f58ddf01afb52e49a1e0a828aeb9434a1fdcc03e3f034ae1240a948d8bc3ea74e66d891799734f36fb40a93504eedb21b5f645c91376a61706df7a538ace7a62271d8c337bb6c290ec9a074c05ee8c483115a0fd5f8d0e0b9f1269d95c0bb367479d2422c7d1a916fb2cf20ae7d74d58cadda095fd7541f4c221bb581db5885256983ddc03d03606691011077000"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (652, '{"ob": ["15151515f6eedb53892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852203ba402e8fc77732da4d587b4ddcafe21155175b42f5bbf462be8792df43f4273e78dc2f29f87b531c71d6b1dc0142b3a968d0e8d49d895f7d176c79a17766ed3c872fa2f61556a44720f63592db53265232e7eb2c476ffbf29dabe2eb57d979b80eaa34b80ae8a7465679636c0fc026d730fa261c7cd19baeee0c6d050d1febb6e40cb0d78339f20e892405ce02ddac0b404cc0a3e5db3aaf05625063c424a1eb5cd86569b216016d81db38defb66243a626d53c74f92bcac7fe08bbc0961ac7d0e1953a5ea62f2eb78419590cfb66685c356df5800dc87969419776d6cd3761a0b0967e648077e6b39f675a0b61f243b0bf47aa64fc9e6c20ea81726ef0a0aaf134dd1d363e71dfca8412bb26c3dc1797b1a371cd084b89ebf9b400729d7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (653, '{"ob": ["15151515f6eedb23892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85708af67ff84be8f80a9fbde50119cb1eb8eedec9c8ffa4f0c522369e558e8d7ead9b057d44b111a4c3085d156dbaf07f4237383473a28963d18bbe625799395dbee5ca98d1a77a8028865aa109e62458aec9ecde2e5b5f13a668f5f3f665bdb327774a83bee178b2ddf9c64cae345de11da1db15d3038924cb41f793be5188ad6dc9daac41ebf720b0f96484dca33df8c2029a28de082c1c8da1e66c2f353ea2da0dea8729453e4690715aa5b7a465c84804b24c94e3c9b55d54772e0e52b9c9e73d4fbc6200e4ea1eced0376feeb36e6869474454642a45f453f5ed9c2d156e0401466c7e746b5b559c1dfdca27f64ccdaf402dfab3e6102165bad4cc3d4df3b6968c26d1362395c4bd7f99b5815fb041c2607216c81e3b2ac489121bce6e23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (654, '{"ob": ["15151515f6eedb05892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ae1575e1c7b21a8db9fb42e5fcee1ec4bf43306203d6ccc75db4037bd83765c0005cca95546f15123138f039fc0e3cedaeb69cd828b3c17f36eb5c15bc807291d4e02d77ea488f51fc0bf7b1bea79e7d494cdaade7b489b490278eec1e66e0556bafd3f9d6d6df86f6e30ece1830596f2b3cb9327fe67e9e32a88f343804f48d70f82e898f15dc0b071271578d136c2118797aabe9946414a92400550b4da6127d74ae2073f7cf6ec08304d1103e977f5bc1032ad857464150b7b5a30c33dcf49e9a9454bda795d6fce88a4177ebee48500bf6be2899bf99dfce4b0e33fcaa17f913b43faf0251caa3593ed0e40df19f582abf027b3e785324aa2b2b515410ab182bbce181a8ff4a1e3a0003f7b9ef73b9e06ee27404af6ad6ba233ca549b51f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (655, '{"ob": ["15151515f6eedbee892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851fca05f0d6cec7423948cab86c4dff53f534f45ba63aba335871b93abc4580081f22cd1456220e9c31884a710989b8b5762b808c9ee5c27e3d6dbd98fd1e121bcf7c73cb815c0232b18c9ca02adecd857e352ef4f954627be4aa7f92f502513bab9d188e765c4ab757876804f0ef8e688ce4aeff21ec9a79f27dba5bc08ffda6e5e26fcb50c2a4e1b2a2037c767d9989c6e974835644fd9bd5221d0440e24284333cb6ea8e9e443548a655c960a80375cb8a4599e03bdf89dc085fa88f2ca7d888500cfe5bbdac44c4c35ab6bd3babe8990f3cd46bf5874861cf4543b5c197c99316a5a1baefb49024907ebbb359129137aaf1874afe0be7802c2938b1024948458a848f7a56364348f2d195acfb476c311ea299686a8849ee24f940ee68c59a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (656, '{"ob": ["15151515f6eedb38892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859b850fc9d5a07d429aef3b73d0df31a7facee4f7ead7f0433dda966d466c86f706fe753adc2c9262937f33df785d4ad5c0905ad5fcf939580c42756cc558ca1b841bd520a6f382edf2083dd5a911a1b9d034844609ed17c9f0779ab8870d83341cb2fdf8016b78e295d45215eadaaf32152eb9fe64bcd83a25ea033c55ef6a08b1ae018228fe7bdda2e3b5d79e4ccb1f724d699aa957da56818bce0eac5c2492b399efdc9b24ee311f03a9df04f66b7e82681c62cdf9a403d8836557b01279b6e639b2505a1dd9c54542b028683744d3dcba317a02f8fbe4253140982ca13c66b515957e0421a9e751b1cc59f3c5fd65e7fea9ae20be59d32428e93ce0c95662ec196c99772b1a55aa47943813859954d80587774c16ec7aff486b6aca5a2a03"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (657, '{"ob": ["15151515f6eedb2e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8553677c3f673cfa73621ac2c36e4cabd0117ec95fe9010108edeb7bfad7cd0c6bdddceb3a86a5cbfbb07de5db096732b275189b0b40867f298cf99588595f65d4f07314066b78818ee73220a271c7bbbbcd9fc05c1c0cfce1c906af6601e5d0d64820a01dca65f6b1bea00042baf45aae82956d68d7a642e1bd5f1cca51d39d362637b7d0ee6ccf1d00b96f87c86d0291781ce67961ed9fe52790225a7642f4b53a977208dd7431e064ebfbed1153e9c9190f6344a80e44922204f1dc29cb11d3fa020e2b1c6432e1bd1de891c5cbd5e8b16fcd65f6a13f61e0813740a0ebf50de447dfa796b192c712bffd83f03efd8149d5628e9bb04e9f628bf80fba75900b024c217349c8b4341ac1019c7a356dca6f874fcc9dbc29eebfa40e5438d20c63"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (658, '{"ob": ["15151515f6eedbe8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8576fb875e27c6d1f3b55c5f1defaee31cb33710eb554aca3865b8018ec3305c8d484f5db345d127af95453acbb98de69874b8564c98b770264bc2048605d16a22c94c681ffbd2b8a5ecbb860ae8968939d3c8d725a896bc37062bcabe36a165fd9aed51a0f7854234d64899a05c82518f917c6582ab04e609aeb7abb9959c4f7bc11370dee338b0d3d3784084149e141c72aae4f3a877f5d5b2e9e6009bbe39b2025a7bb54fba15fe9e40a1f8aaf7230940d6a63cd8fd8e645708e2f3188dfd86caaf73f369c5d4a1a2794de1738da11d30d3b7d6513e279100080a4e657af82a92369518331d61a4c1b9c62820c8fe3f7bd464597cccb02ae4b93a06f79ea39118fa0bb7084194ae92db1a91f0e3f06521501790fce46a6a63a2ffd27bd336b5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (659, '{"ob": ["15151515f6eedb0a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855bb5608edfc6cd9648adf5378c5a91008a211fd96556141982bc928ce0992a5e1f58a1de618512d2b207ffd590b250f589d05ee8e2aa1cd6338b7551686952a9c43cad526d1ba1e6f87360a8005e72fa0dcbfbd4daee8e0b3c92bc6372241e40dcdef24613ea315894093f881eebad1cdd2d0536ad3fa2aa41e1090cc8e083213ab7e657caf394c784f46e36f1499b647b64ff664f12429563c105236ad910decef56640c8f6cb30ccaf058fd44302b589f6b2b4fdd356bc6201eb3cda5bd47075baf6823862cfaf8577c32da0178521a80d0efcee32cca192f8f8f05f5f72df53b6d6f9ad51a336e92ce00f70114de7e67ea022540a38f8aa4d68ac6368d1a641a8762dbe1ac47376d4e7bacd234c5940504ba4c7377fb9628a96a5aa71398d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (660, '{"ob": ["15151515f6eedb42892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c0f289ae8450f54974213877fee2f3ce89d75fb62d0fe590441f8ced106f460a6e900e894ad95baeda61b5514713d0cd84cb9111e032f38305f52d93ae675ec0b45cbf29f76ccddc8890d01ebfdfd903ff544837a8366fe2ce11149dcc7b80297d91a6f1bb553ab1bd70c017a771d0d34ea1eca22d981ff232f41b93f189e599374a3e86cd37dcbfbfa4fd20c50a550603ca61ef79ca6a2a35c6625bc5c830fe90201f0dce10282df477b81bf09cbe818a065e4c78853e0d7224a532d544ba9a7507dfce0501f4be8de8fecaf07b010048c06d237ba397a015ac2e7500d3aed62e00a89a74c0c7d58d1c9e7a0c7b2f86d53fec18f988cbd07908cdfe725772c9886dea5026b170ce18d90f02f91856560087602029ada23e9c6db7c7241a2f9d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (661, '{"ob": ["15151515f6eedb92892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85cbedcbf43d8d44c39d82c8e504e01a0503fbb7e09bba47a9480e7de26c46e49256640aefa1f36a4119302f5db298ad5d98d6627e4fd68683f6d571160507cfe9c1cab459729344b1750a96f776dc8e42c4ebe28d715c3da33f63bf28201369fef2b4dda5c8de9891072519825aff4c39b8321bcb3e0cb62cedfe01b4deb522b265e7071deba46651cd9ab741a246982fdad58a6b50abf8a69f6268dcf6047f86dcf203ab65aa7c6cb3de4d3e91c125c3344a5cc896051d8630ce36a70e3968b00a6cee56f7b92b148a3014caf4faf7282f9c4fbbdb793ea502f5b68a833057b92106d775a15dbd0a03edb3390487846fc00ddd64b4e6d6c0d996e7c5d6178c56570c24a57afa84f10c5b8acc4fe360b1ed227bdfe33170d1cd84355ca1c2bc70"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (662, '{"ob": ["15151515f6eedb7e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a26b35ec2f0a23707923b2f6a273b6039ccc3ebea84f383aa23c9ce45096bb09d200219b121712fc5a58e8802471fd04874c7bb46045aa47d555ff80de134b9a5119e5ff8d88e27fdcc111b0d7cd1bbc3139c140a6bb20fe7e96d94e8438156fa52daa4c68e206fe846a4ebe5f306a9d3ab4a44eeebc1cf7b3247b2113304cadbd8bc948377dd24c141164d055c7b4fea6c34d69dddc6a15cae1c5513195389e97e888368f091754ce6c56727fa4f3029689a6b8190c0f55c473157c9e102710ef5612059c3e480b4fe32dc2a56463ec99976266d784b6871c526f6ccce81a182b7837601f415aa686ee7af1eb6cff1ec330637b71788822c6aacc02ed3e949983fc8630a459d9967beb0ca0478944c31ceff568c0bf6c41d2d1822e9dd9c4e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (663, '{"ob": ["15151515f6eedb45892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8502a4653477f514cb1bafe8f61250b4954b23e44316f288ecea1493dfaabebd9609f16f753cd66020bd49d84b02909147bb0155714627e7c82275220b5fc22ca7ffc822a9acdffbd27ef71979be5804d9460db5069b9c50e1bc0cdb774b17ff3a01efd4ece129c778ed5411b4ed2510b41ed40e29fd1f720485d7bb169b5b03d92d133123fed3888fc2e2de6719bd61ede28c89e2ffd2a75ba4b69f1119adce6dcb70f6236524eec6e78f6c6bc75038584b3e6dee916d3838b4f5a0ebbd0611fcd69d06dbd410eeaa25ff2509e69be4c3704bf55480a3e38ab4381b7ee7d3ff6383ecc40a4b82dc9bd8e304a8fe5e7020ad3aa068cd13ced44035ca725b562a5d9bbd7cfdb1f05ba884eef92141b29b63d2b5372049e9bbad43c184ffe248620b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (664, '{"ob": ["15151515f6eedb11892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8514b8089ab7946eecd49a739be7dfc31b9bfb6fc759df7d78fbb18f22bb9e09f750e5aa5833342fdcd34f9d16c908859b7c83939675da3b6550813c2759f28c1fdce63daca1e62cd6c71d78c65c2b2f75a4aef491f5dab70b35f565cc838aa3d05e5e49c15ceb784ac4a7905d51c44f238561a06244cc950055b9c9c2c12e100c5f8a6f78f4e0dcc66fe0191f77ce0893ce88da926770144810fc73ea5f73d31f4cb59f43b05a4667693af1d517f0f4b92363bc6a3b8b90d14e90f641b6efca46bbe02b9c968ced160f8287039caddd4f2ae013e5ea0112c3003a58ce7d37dbcb0830afd1b21c2fb55849a7d82e54040cd020703b4d46ad56afe565b7f68f8b5e09b3e48910a82cbefc210a46fb47c2457cdc02235688ba61f90ba928b7dbadfd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (665, '{"ob": ["15151515f6eedbbc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e2886ac2c6b9d36c4248af7e367cc84555336052c6dc29a9070f862ee6cf253d89f44492766c70c3cee44e6615242672364721356050c96c83583337c26762ffe2d4e39269be68e14d4ab9c31168b2095bd094fec0af769513c8c6066cc9380a508ad5511e78f61953bb9fdd2b3a3d08da77da7e9c21e5a3856c695eac31aaaa31516b3e533b25c748f7ffd6219812bf8fb416e870d0eaa5d544a39bc54bd2d02c89363f74621ea098ecee819ef9f74e21a0538d65da911f7ff7733db5b30da8b1d8113b910e4924799d141ae5e19d96d64d0e7278b3a626de613b239a2fcdc2cf7bc9d728ce0d20ed86cb1729faf27cbb49393fca0ce9c5dbbb4ef3d39fc76a32a7f28952feb8c4460fe422b0135dec0bf8ec63db8e79fb26810009a5928369"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (666, '{"ob": ["15151515f6eedb67892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854e3d8270bff4f029660d2b6c7de1d3c9779f72bb0bbe1c7801a6f935948170412ee9d38fa690baf90902d88eb8ff29e6ad16fcdfdb82bdc141f00ca7787a0b86f83d716ec54c35361465c1dcfe65873f4e52715854cb4358cafad4c3b892c84c163cccb9087d58784116fb82c784b028b62dba52cc151b117134595c560b89a8c5dc041b1d6de503c3493e2edc7a6fa103dc97a02dc55b0355105c57becad91cde597a8cc169897e2cc20bd66b9ac1b3af7a85381c6df9dcfbdc137fe221cecd395ae63bb725bf2e242e213bc14866f6d38e9fbc8b753f342bb9359c50d3296947e41fe78ea87336548056ba0936097c196c9fec77c3ee0ab3187b7182e91ece8cbeea42cdce1ce1f804b32fc454f52b9067ed7a25f7f284efd238e89fd22c39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (667, '{"ob": ["15151515f6eedba1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850f37e94ac122e06a561676109b91b491840c3eac772cf2f77d8b1895e30f4f7db549b312bb9d9ca14c5052f51ce52ff772c5e04db0e7a1f5182196b84bd80072d468b5cd364227bf2daf8fb1fb4dd64bbba801c511efe2e7d8daae61132297232cf82f2c223fc106cf89f9fb660b7a046fb10b5c173756b5133d31922251a218ecfb838629fbf00c764a6b4a74911c5aa5745951496e289af8aead91bfcc2d69b732748704fff380a4a74a1b01ed309abf6976e35ddffd999d562cf6433e9ee65a11a6fcb55a245f3886b4f411eafe92dfcc1cd3da9ac9af28b17e5e53f9839c919631665d9a829cb213d098ce70a05293defab1b7f999db3b118b95a0ac6c4d8a5173335f6409a7bd3507b0eaa7d6443c09a174d6528975ac3eedb6e9f80704"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (668, '{"ob": ["15151515f6eedb4a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854ce21843a9602cc75b1fb4822464a9b0f0b1a2b09d377647ccf22e6e11ca2208982f904da4ff95bb7e9400ddfa96ded2cb8085ef0a6602fb2165d5ef38587c3c2278e9db4f64aea79d1b0969acd7edfd7d9548c2eedaa8817e41165278ea5b2957156dca20775d3ccf5ed42321c44e0b7c1d9090e7f3bc2312f4520b6c9748eca41a008d2919ac4057831147d528e07e4f844fd52bc36256f7c32beba37fb7032deb6ce9eb3f23ff063288d15530a9ad1aaea67936917e9ea3c188787a035aa9713183ccd78f97cabfe968fd454e774063665e0b8b05d1700d7222e976398e681169d308d513ae7a6ceed7a1bf0fde1c013e225a9c22db6bb6df913dc59ebb3f0c1c47ab67a7842b69c6987b6f54e40dce476e01141c55cfaa11c6521161ff97"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (669, '{"ob": ["15151515f6eedb13892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856758221f22a0826a8ce7112adba389cec1fd828676c432fb1fd478d68be0e7a5512713d1c8ff37a0abf10465134a1ec9ec4e01e23d53fbac43420785fb5d7c85ea96eed51d25b68b06932fb17b67d0f3790fa39e53cecac072e91ee826daf91fc0ac3c5ef8536f6527bf7a9774d12c7bc619147ef4a9607215647daee0903449e734105972c4241cb774142e60622956dffa2e88d4e8351799775e06651a657e077781b258c9ba37d3a93b3cd565e6e31c4446eb09ab4a2f3d09a3bacd97d82547740fd156e2fd4f2fd0078170d8d0960db205317f91fa457cbc68c52d3919c0e9041b6ce77a5848f660e2cd1baf73e7acad7009aca12992f9ee368bdf4f5138a6a28c28af27e8354ff893431e5bbd9b5edf9569d6dfa0f935331e79504a98c6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (670, '{"ob": ["15151515f6eedb78892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854f42a5303c49b6de200adf5d5e435be7d072a949707f288b14a17842073fdd61a6c17b964da81d80df5921c85f7c8a8922590ed05d162e0f6eb1b464145a8628c768422077e96f1b80598fc9810c55500d1efa30950ceea71f8ad1c1c771de7abbcd11f2c324620ea6abe22ee6efd73a7ce2347428e4c5abdaf6cb69a482f4ceffbd96240d3917eab2c9a0684595846d1e624908b54792665c84b7893db4ee0dbeee5292689f066817cb9b1dbd09fb6562724df11401d87336cb27f1ffe647a159bfb14929e60b92c5c13f2d8721548f3fc42ac79384526abba2f3ac90a1b94e3d9e31d65b406e03843611f9c58d6c99abbb5c21406057b989f232c27fab398dcd85f49ddd6776de13d97db09f4e10d539d247f33009959e5501a099da166a38"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (671, '{"ob": ["15151515f6eedb84892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c54df8b9dbb5ecc95be1f9ede41a798b1b78e9c478867885a1ff6574c61f57648ffdab76baac7907202faffbd2b47ddc8d2663b7f43239dc586d1594872ab21621ec7b5a7bebb3ec5ae8733549f35e4c688e435ae522c9bdcc9a05d7cf01d6c89c20eec7eee4cdcafedd6263edf5a5222d044ee7acf9a244104891ee70b61b8a529f6992983544a718e63bb053806c2f1ab27ee483cc93e0e1827269abb3e463649ad25946846476a100804d767c8259c73dd8fa4ce267cbf790f82436059c91dc801433a6e702b151554e39c479c86ce08ae60a283e3e6a99d8fc78989e31fee460a4bd5b864bdc38f536c855b60ceb91366c26de8128da391673491647433ef077df847e4947ea8116da801da63a5f25478592da45082d5821de131cc80925"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (672, '{"ob": ["15151515f6eedb41892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a864e1c153a4d64296a378c02486df491f8bf4dadbf108a25a81efe78e602262d596e33f897c863b7c47e2107fca9ad5d11a6e65590f23ce5dfde4f08c8864534725407c1342b076a4de8a91528230d8a8f7191f11506c71741202f580300ac7dddd23237a80ec7ef248c3415fcee38feba2e310edd626be1210f2f31f82aff52a4091372da222b572219199d6cbba79fbecd884883097ea1bbeb24b73c7fa7e1d905c2ca8e40d31fde87e6acb02e3351e09d79fe73f444a1e626b655300c3b5c539688999e2e6f6d2c5c8a8796b209f411d816d706674256384ca785dcae6e488d6b1d5e1e5607a057c5813a0809a20e3f0f429cdb545b2decc4e1dc3a9b13001d463f18f4573cddbe03323d5b160ffdc2f2d9721fe19fbd221c6b1eeb3245d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (673, '{"ob": ["15151515f6eedb1a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8568fd72fd948d1b50ad31a01ceaf26351883a426e9424c299cdf6721ff5e18ec9106e28e50735551c27687bf34bd08f989b6b1376e9a5193c0018449450b4b5223412f16fb4f71f116de60d2dd721c7cbe43113b3c965c339bdd4fce98ce8725908532b759019d063e7df89f7270e93f6ae155085a2fb4c5e53929711ea891d8074b33c6eb0d20e8c0d78734152c50fe6bdf0798dc181df22cef881cc8486dd47a353b2c8f5f66b4cc2a56e4399a92d74dc712507b102c7bacc175834b3a656bbde3f98797d5ccce630ca982c0d78584155ba28611acb1b801c0501faeb62315a4cb2f80ee4d2f8a506b239e9fd60fc0255f19e765bb6577946df97b14f24163bcb06d7730e3b497d6b7275af81f741f441d41a5ecbde11c89315447b8e047395"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (674, '{"ob": ["15151515f6eedb59892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca53086aa6a59fddda70bff64b2b5eb5c4bc87f9d3d8d9add0505e7186a913d6d31ed7355d48c7a1851254abf15d401750dac6d2ea03a3f8a78b2b77a5d2758edd798a311448d72dd82cd7ee2b8e6282a69dd8e6303db4f7a2d37b83ce4592c1c1591a2e1c22033d514b2da05a6307f0d2218f77eb36dc5f4e642cb59479cc45e34cdc05cfad5d1f200779dc1a3928fd9511d9f0fb7400eef16ad54f0c5edeb485da4f57f0ed53305f2dbaf442f5dc3247fd3170b80282797ee4d243a56935ec06f5d37c1eb6c4de7daa2507f31829818cdb7248c7bc3a81bf648511749e9f3942aad5ef29c462bac46f71eebdb237f39ee9d2484d68b140d60fe5e78684ecb649a798d6aa78eb7fe63d7389bed83a4b41a261b33f53297852127184186c3763"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (675, '{"ob": ["15151515f6eedb56892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8553678cacf1fcdfaadd08a2409bc6d8f4adf65608b554715a1c9b9cfb55de7ad511b99b419d8832b8920fb940ceadce67335033e529045593ed2e766ef01f32e58c9ac28d6e05d18549fe96db472ebcb2e9aefb9e5f79a0949c85df5d9ae86b7ebee94a384f22118945a228acee4f8e0cc0b5199fb305ed1ccf216214e355ec7c9d77cea5e63fa228b385b214a7f10af98b7e4c4509df7778f97c3e531a01df615fcb043f3587e74b53299211c5fd4432aad17bb4d58b20b1067ada5eb2dd6c4f889d072b77f0667fbaf51b5bcf20e60164faaa538c3f8ecc5ee679bffa2e711de22805823c714824127e099c514c15dade793adec922ea3caf72dd80a4d687a8cc481e2e2186349e7f271b8da99fee3588c570ac969f7b68f34c623dd0c35ece"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (676, '{"ob": ["15151515f6eedb1f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851aeeb3cf68932057077e59f3fee33e8f5c1532e9f7a45781f6c2b163f407c883da88a384aae9ce1a302ff0ae3fc306146769c4bdc9aa0aaecafce2fd8cd091c0d0d4c27eaaf466b2c90ad62c811f8bef512e02ebcd273cca9b520d8587c43eab409651aa88a5d803fb6ee587132a5e88b8e4246637ed6badd126c3441cf21b9be9d028235f4ab928d57c153e498357530bce1248e6be9046837371d813b12f70b47b4371663944045d01b820bce0b7ee09fcdf1234da9ce1d7731d09f7590fbc515b58269d9d7fe6d41b21906406afff76be77d59254cc542e507f5076de1820a3e8990001e8c620a55b45b04b0da84b2a12961c0f31052b2a6914d20ae9e9e28c0e9dfd3ed43c96738b43cf6756b39d8201ca8de3ce0a131c7fe54c779754bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (677, '{"ob": ["15151515f6eedbf9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854396724a70a0f7c15c48c9b28250530b1f9c8744a6f892be2c8c03a56be7d1592c0e917f26ad1e2d9ea8c6472c245504ee75955b8a7ad0d415e3360d46a9ede4dbc2968d55bee293e2394f1845e2194017ba685ebc62cb2eb86c137a4d08ee63ec4136461bd1396bdd0ab87002990d6eb2fd9722784efb2d717f4aa8839d60a11df83ab4821c55bd2b9226e70d33302f26896850ce2a3054b2f629656818c4eeb21ba425e39b6de2f3a2a96b32894b6d92cefab282c37ba7713d17025b9d4daab836433e3b7d9ff8b4faa3cbd872ebff6609d6093af9e4d687073faffdc0e689e8ba49fe1debd8801c31affa9fca0fb61957943eeea2755d7981a93b0bab023b8d4f47e38b7d359aba4aeb8169c412c7a680a820e5c4b46586af7a21aca58764"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (678, '{"ob": ["15151515f6eedbfb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851e49a9a8bc04f9a0119128dc07bdfeb3e3ef98389f9dce55e0c0a8306324feb508242e348f09470b88b87cd05f384e029f8b021d7faaefc57464a5fd1d0e92e2d9c9b938ac719baf5fc177d122bd0f4a7f0938759acd3198af1ce1f9f2b1a8dde420b5c84a922ea981165e44e9e3e49552a410a957b6e765827fe47d4607581ab649c24c4a819f837554dac006b17fc09f76bb50a2d84803f7b902ebed0310c711f8ebdb53af0c21860cc51410c96a5273f4ad974c0bee96d31c0966aaf28676b002e4a00319e4afb747366e93912a98e91093ca9b89792d5f49dc541fc3764a6acf6b7e2f3c7c5490cb4614022eadbc8a5cc3b524f9d59c257a41f5c65f0f11c21dbf81a4215a6c11ae42645df18243067867c6c176dd97a1a2383c40cfe86e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (679, '{"ob": ["15151515f6eedba8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856df9d9054caaf54165e0edda690e0998403ceecee06d5f49db0a9ede815186335c587cb2a3602e9c219bcc2e8dc11961a856d89fc917c1ab00ce9f67c0023ff1419c5736ca390a14f5a3ab87acfb259704e91dc69bb807dd775dc6023634f61d2659ce992459c9e6a6250b711ea8951ee355020dce964f280f34922807766df13de5fd178abe3dc7e697c95f4534b02895ded6ba2b6d206dd2b0606334f24e705f34a90fb6b28bc023bece2e09097f6a397ed6cf84b2a160b661a9472666c9a56375653d97559ff7f66909a0ccb9a53955b01ebba07949167ff34c626389d491a47c448c05706bf4a21bb083e0f163fc70a90051bd1dd21f4bdaec83ea6e0491eae09e70e8be668e10bc1376affecf9d98f88aa15dd896cbfb74596dc578d93f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (680, '{"ob": ["15151515f6eedb51892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8547ec634dbc3e52762acedb79301f337e8e2a283c139176e982b0b6aa5a60fc19adc23d75b370e4ea7dfe872510b442f91132abdcad54927360e201d9426bfdd313634f2406ebce99e69a4bf129f6dbb5aa27f2dd16670d1434adcc43098ecaac14fe26f4af19c58fb65d8fd50d485f0d0c718819d77f970e2a6fa4e460590c713c00c5b6a01b3d97a0e4efdf9de1ff2532645bb9dc5c0838338c07f2b72b8b15fb08a70de1202f4544aa20f031297e65ca9065d6cc9d0a9fa26e89ee66214522ca643c27e1a6496f9c492fb6bae875852d994e4be740ef4736cde026ff7c30fb4aa138fe28c7c1c20b616af4307a0bd151e2fec2db0086dedfdffe4e3e81171f23c9bce76c3b0d8c0b0ea1adac2a1c51aff21ef0146d518dab7837a54c349fb4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (681, '{"ob": ["15151515f6eedbd3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f7536cbeec5668b75ff529a5a550a1acda972070b55d6d4388f78c9cb21d7589c9ed7a02e1a84e11e7bad524efd34525022df8a7bbf6324c7ee4035821a779bed7c5547f5feb3c3914083bdf08ba2eda755ed6a1b5936640eb20cc1997a479241c8e06f0c9c49d7de262bbef0fd1dcd0179a4336493db49bf36cbdb4c62c50a025b5a12bfc36a5f88fabee8212540d211446cb3e1297911ff8809a16ceb73e5c4f3a7dee1b46ca1fe8dd611fa9cc5d0c4c5274730c2820caa7aec44449b64339c7858901cab4daf5ec3bc8ee519ce58ef68041cab1b2f8822f30a77e44679907f08b66e29128c9d986bcf5edce9ed862aacd04e0bf672c4e7b1e4102a90aff702da7a758ee95b3443380cbe7d5023aa4be762e3a4702ab95560472e0284d87f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (682, '{"ob": ["15151515f6eedb03892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850120f6e5844767a471cbb320444814fc7b146c563998127deb416a749c5fcb4037691b041cc45bcff5ee5f402b790ed26b5b83e4106c5c0111314353b0e6b9681f96c8c26a29135b41a8ab115c87177487af1eda9df06d659bd3e050891f75539d37fae9a7bc9c7f1a4eaf8f042e5e130be3abbdf9cd53c76e0bc0d3efb3f8b4bfcc69a7c2591eeb832941f45f67533cb02610e6034a169db9340d202107e15411716148122e13b820ad509384605cc16811077daae92a041778c739c62152b0cb8e2df9d00d955fee5da5c7ba6047917334a08cc18af7e05029a4ac54702bea0872c9c01952932d68b9300a836a753280636d6bdd46c8fbba48bd1e62283d7c8790d732dcc5926b2afe3b083a608a0eb6f9352c8f4f5981cda1b7e4053bd798"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (683, '{"ob": ["15151515f6eedb2f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85edbe3972d1106aa4461ceb35368eafe53402412ce5ab3acd3d93bb24f971dcaad69dee2bb4897a6c902f3b42955090c9da56c627d5aa2d696588808b5c7425adb8c713dd28d2470f727cd73773192aa871d000716cbcb06149f22a748d5bae83c8f22674bf7012e45520714b5fb08836dc0cd9b053da70a2a774bf4a436ef67b94171b53c296607c2c933710d5fd1f62adb5d706116b8454d4cdd413b884ba89e475112a69220360fd3c3ce220bf9816256d6f6870f3511d8237c7293071a6cd61e8260e38c1e9772bc46e2fd00bbbc4bf88187dfaeb2a03e7a370e8c20388dd011f7d0ee1941c39384cca0d6209910ad8dae625ba94d9c9f2878fe3c4c5b115889306033f33e8b4baca2185fb8bb319ce04c13e91219323e16c93abca035c0a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (684, '{"ob": ["15151515f6eedbb9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a57eb056ad4dd103e81dbe956ef8ecd9e6934bc8cf70b8ba857b047d2de07f6ba572785575a8bc20dd7eb2c0f72a64f4cb913a32c413a0d77e43a1b96b9df4d5106e9b8512411f5ab95eea462a4a1b91994055463f2ea3076a673a74a603f6a6590ebcb4c1c99382e2a7cb3688187eea416a3a668be69d7d9c713ed46ed85445787ed8f65f6537a6abdc8c76bc8f05b15510bb6e37b66f16249bb641ea52e89bcd2460848f0f9babcf3c466c969fb05cc7bf57a9c622c2440c04a760efe5990ced97978d9ab904817c45f77304d47cc5c2d893dbe1f59f446833e852e370ad8114e41c4d101c91c9b0a65919766accdc2259919e5f79d73b4947b405344b8420e3ce0c9e0df3390751ebe524b7ecfdaa7ae0e3413d5744e563202882dfff0884"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (685, '{"ob": ["15151515f6eedb14892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85043af31f3343549fcd6ddc7c4c65942af8f4c92a06046ddfab6f5567978a316c65690e7d969b04aaadaf93528bb2365ee286015d5205554956c25034360763f71bc51553f7261d0d86bae0190bd4b02df2a83400ae379ac7bf320a88cbba39d19653b4ec4b4c865ff664516c1045c5427a6f72659bc3b8a6befa72f8dea13a0f25a92bc14c2ee016800675696287c0c865e4d4b1767ec4d1b95f8523e7983cccd21171345e72ec99792242dd5ca8774bf34ab89bed16608cfb1175e8709922413682121beb0cb540a0af89e4602513c41c8cb8afec2e47580e40d4953a0ad2087e2e4fb705c27ce397700b00e6cbb2b9ebd5d4640b064f74174e7334a5a12cb75d173dea9c38526fe515028594d6498ba63a7e291c0158473c01d7cd776678d0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (686, '{"ob": ["15151515f6eedbda892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f6f06a1dfb1f20cbd26f40bd0cdd0e0669aae56871bea7a65eae6414ece8dd96156e7579e0373714132d25f74f6a5442cbd522fdcf936bbc208823f81d49a1ec3e47b2e968625ef3fec4b1386372e2637bef7638f84a86ae96f009b12cb8461425c9e56362f5300e4e2dff2f67bc650dca0d650002fc53f4f43929b06528a4568bcd060e46d7b5c6c3a9eabf80a179ed55d6d6d38eea1f110a15dd9ef3961034696a3fd74db3f917522cf729e658574516c16f7247fcd2a960f15c86b93ec3aad0bf50ffc9f6b669a41a16429847d7bf8a7726f36ddbac2dd32698a65022344066baf2f36f719c6fbb05f77d53ad9756273639d81dce4007e15f75f7f4ec8be23ab3ae33dde8444e553f684be7c1694cf1a02894b404e0f16e3f495b5da23a2e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (687, '{"ob": ["15151515f6eedbfe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852fdbeda43cb09955bf13c8f20c75fc4ba50ee307662697f0a52ef528dc53048d93006b55913768ba42dda1ac42196de3d307323734978e27c0aff99df7fe3d5ebdbc3fb554f0656440f30d4bbdd9e2280c34d030a890dc65a2e49e5c98eefed5f69e14c06f6c14f717a7371ed28e643a1a09bb3a5fb53daf9434c5c553ed77a8359b3c1cdcd056e1895f5e2443183a42b9db82f1159d94284e6aa4da78da668548976b5f4705d6d8a32587af6dbcbcdddc9b26181fc4dfb66434f9beeb02dfcc037e105ddd778f952b28f3630b67d4d3fea298e63f05ef9d2239313053eb4de882ce436d2ad1fbaa9a62ac0a6d89c0cbb4dde135ef9d0acc56b4f4aa67e38a343b9988a6126da21da4b133787de8131771595a65a4a90dcf1258b9fde7c68265"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (688, '{"ob": ["15151515f6eedba2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854a5d218d3c0dbe4a22e24087fc41158f19502fef51e028df664c75ed15dc450e70397b52cb53902fbf1f8ff41c3fbb6833fcb17a93458d331ae384ccf99d2dd6bf683a6b89bd1154d9c915ebe0edcaad6278b3f357043c573dcb3437156b4ce8777bcbd35056a1a08f66e467dd30750d9ae78030749be4f6cb7f65cd3ac6bf61efe6f14e63ee95c1c09d79c72fed82880d01926a9951efb58ec70a2367bda09b35fb86ed3f55d4b9deae715b6accfd7896bee18277e6cfaf0e5e107a6ab3b645862d3920b7f0c93df146de5e79f9ca83f83911bf6b1a020252454e55dd2a6f77d77a7f502221a5d792e93a010a9a121ac4639c04c3374b9c53c8db34fe2d9b9b0e250c14c895f4b52b50467c347ecca831d99e52f83451bf45b9befadec953ca"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (689, '{"ob": ["15151515f6eedbf5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8506f366c26221c5b52ab57d6a6e4aa4a7e5d744b7fe31daa26f473af7cc9cbe84753cbcb9833d22021d72f5d93d01f57ce1c6be3f61beca14200c8ade48ed756d9d0721340b05efeb82dc681416d0071fef771348cef2a4aa464820efbc84784c184a276f40a23bbff03b751a18f2b88f9b2c33c92ecd87a1cc2135a9de603b8b7c85f808217c8c3f1320eb6fda3bb3ed81f24298f36f750087f156583bc017a6ff7ce199601a87ce93cf98531354c677f7e97195dc9aa7b586fdb715c883c6d506a1e2b7062fab53ef16e096d59ad0bcd36a47b5a8f8e1b33c3aad175a0335a075ad6ecd766e840c6176d48268389b5f7c245a4dc16901ae95d486fba2743ac4496f734cdb8fda12d65e78a7dcd875b7d39e04c6a823d9a1095bc39c565ec6c9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (690, '{"ob": ["15151515f6eedb07892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854c8fecb3c3b64cb190ff3b236240c698639730f2a14e043b50379f5775f6474e0a1bb49182cb1a483510a58b767eb4637726bb7b972f5f8b83d543d151f07fe9d2da65eadf62d148e2d221fe09a547efac613463c3185002b8a15d6a8f5b32d6b2172ffbaed62db1fff3a8d3cc1ba8e23ee95c6e737b84ec366a9b137cd57a2e41d5678294a31a1a01670468648404d9c369d68f2538de6f0b4198a0e7347f3a7a00b0a6f2cbb824d41a56a80b06f4fef6681760632b69309455eebb6e31fc27511f87729da2f3263ada467a967fa4e9433d70c02f37684dddbe08608ab84e7a454afd550fcccfadb1c09a117f8d2bfa38e1ece8837622a9561f296de4de43aae4aea2ee3c4f3c3bd38a356633fe89e5f414fff216df5a2196adc960c076015b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (691, '{"ob": ["15151515f6eedb9a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c876dab29a4222ffe2232a7d58a2c2f119a708f57426c049203123c6f21bcce1f41d3a60a71b2cbc2d668537c03764dc07c00510841ff559b0209661190b1c1001c731d3a85852931605eeb8b2e02459cba47c3910491ad6ec3561b20401b08422c5131bab971a04c51d90269c9cdfa0cac097aba9384cb40125eb7dd317174c772c1c78cc2531c6a4803051ff2797351f2eaa76d0671dfd2192f073b72f13e61527834bfe4fb977ef7fed15036755590a5cfa6af438c86ad2c15c75452d8dffe1d6d4b4b1a26ab2a542eec9356843d06160112fa1fe5d7e952395c9aa126b4a13cb292545591e7c6f48715b66b75154f00b3f9985aeaa320c9d73addb147553747ded7af216c7301aabeaae0b75e07a22315ff2c23596bb23374b1b5e17b4b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (692, '{"ob": ["15151515f6eedbd4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85f901716c072b9d76b83c985431e4c9a6c549bbf1626e9ac892673296affe69adbf8f4bd264302dd4804d5f3f2eef9ce0aafcb46b3726f03df60836c28905bcf4c760dfd14d0fe20a845495a89a56a30f584bd59704c6b35c27db421f2167092abffb76289b77c688c3ee94669bd2134f02453413b270bbca4b4106366b3591c6a11a3c099fe052f2d0eef019a5b0a1f63d3a9da9f6e36366cbf5272987f5cb9c9a62c22f06857e1d553b8469d493eaf52a05637b428990af4dcd352f87fa88b96380d09c2be8c5bca4b5563259f67d027fd20d887e5d227d812db86d2199db3cfac3ebdc4cbc0fb4725b2cbca164d178a7bbba01a61a913d7996f2c2bba8edcfd568734db74ecd1495698f51e6fd4a10a06fb81bfc68a5fb5907b7575bd74348"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (693, '{"ob": ["15151515f6eedb21892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8554b6de13f413e850f9b55cb585e87ff00b363a8df4d4f178eab5b95204ffd78a3d4a2189540ef54a0adc24b85773a61d5903646408857cb307794e3a00ea82b9bc229b1f69c87d7662026b966bf65b09d5234e8b93cb24c4541f1ecfaa6a6a4f59456f98ecf82e9ae7ff56fa42768508307fccac0870b36dd1cf9bdb842258ed5d7ee2c78948ee6656a19f95d787d88b54d7c8a201d7cfe704e65fb2b1dd5bbe99a94eebffd939662e3d26eed2b806737e1235475ad8270daedc11f0de9f074c2e52f62ab087a617c05e094f82c1d9d21a0ea310457216f5dc0b62acc100a3d81362d113172b09f3b5d04404fec5b63ca1d82abd691371eb2cadfc874616051a3b163030fa28955e2f4f7156df2efb4deb77898a67f3c55f452fbd35d9d08685"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (694, '{"ob": ["15151515f6eedb6b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d698ef702df87c2ebcdf6fe11b224e5e5bc8579077032a7f5c54cc08d67d79ee6593c6ec8f13154e5af78cc66316fb6d3fdaf73a2d91f07705395cc7002e066aab1a8ad534bf054473bb327cc16e01742c06e7a0190b95f963a7848ca00647bc683c32c0d3c830bddda0fe9ea587be4f5926e4218a3cc55e646076679ff2dce84e72f7c972b5f37c2a2b8e4164324e66b1681ef40a50e2cfc9cdf1292bc20122be7e735617b05215ad43185c628d7c8f765ad7e9b34f9510abfe5cd6a2d69b40538bb3656c2d1295999fc21f4c9f8337672ffb475b337b9c4fd0f0edb7ead83830ee1990d75c5cc30ae43938c787513c18919cdb46d0d2b91c584d9cfe0a5e425ef17123142f6c54c80b3b298925d38ebc54331a2de1162e097282af246cb375"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (695, '{"ob": ["15151515f6eedbdc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8538051b3f0c91ae12033380ca6b508b6b3003bf928d065d3e42d88afd71954759e0bdde3e3f18ec4e329b7bdb49f55319ddea32aca10bbb5894c63878dfcf9872e93dc51bd7b44f932f373bb2f9ab474cd03b38e78b02ee9ef7258fbca522c9f314d36096fa537774b7a10b54bfb980e27f5e5c58bb09b46dd0c20084f4988cc0f696273fede412ad4a069d0e672a31b29d19c0b804e15f3d1bf718d631a23c7c3243f25e83b6bf6350472e08c130fcc81a93dc72821ea2a9281aed97536807e748cf3cd5e66dde750ff6348c9402e8382e452ad09c3f7a320339641d30fc18c55b49462159f7e69d5238c8c3060d99115e4fd8ae0aea4949411b263658a872ba4a6a610388c0f0c1a5b6ce1b9276080a398c04a90f7e0313c21eb8654c4dc455"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (696, '{"ob": ["15151515f6eedbbb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85eb8743d2363ddf274dc5999f282b5aa0ba998b86d9dc6e321f88f80239976a9f7b3e72ed8230cb4d7409801414b2edbfd9c7420d090ba2df301608cb004efedef0373254fb2b8d9aace5d8d2d44cb7f3bc34c1e900aaeb2101a8d35b73e848ae283c2ad6eb80459bec482175033c5169b913f8866803adf5bc6d221867829f57df4d0f049b0202561f053f3eccdd7870070d69a82d1f1420f454ab999540eea7924c6fed08bc149ed14755662e08567bc7293428300e80b61e9470875c37c7ef83e17c93f698b6f038dab49ddfd44d767d16421a213a286956be60e98676a3c5cadd00d7eab5fc549a6ca0f98b746e86062c8a8366684c62821034299e8c6141bd6239915dd22b0113c5a0e12f928400694257436af2c42a9e517c69939fc20c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (697, '{"ob": ["15151515f6eedb81892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857b1d8a93ee365d55d5fb9a6a52b15ad884aedd996a9f2916fa46dcf99e5e8e3615ec1d394961a0bc8ad7c3a164f9b8fd43964cf96d0e97b03f3f50f6599867563549faad4d507d90ece9dcd098c470fcac709f19ad9fe20f4c6ec78c71bcc6045175b450c2e4005710a5c9015fdf33f14681eb7689b91d7faebe6eabc5e98482f318aab89875661fe24e75a4e05e770c84a0caa2effae9f9cab3ee79fcf20de9ede9842a75f13ed692fe320161848b94d3c76e54e0eb6abbc06fc2305a9b2ec52032125642a4e76fc725316ba944fd2d291e633255d50d8a0c2355957df48f5392e282c0d822e66b541a3fc0439c9a926acb1147bb293e2c1f8bbcac2b2544d3fe82c86ced1b303312deb92eeef9d705393920ff37ea5b54c402ce4e20d44d64"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (698, '{"ob": ["15151515f6eedb06892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853bb47f2266e403dfead43ae478cb01e5271a64ff65efca5e85c34801801745a9860e673dc4a9e8d962fe460c43cbd63c33cea3f7f8252dbba339632e1e8642b40c5791ac338e589491812ce0f1a190bdc8c2a8431f65946e8e979e7c634bdc25ee33aa2b23fd894775a459420490dfa6fbe9995f330d36a5500d2e05d1b479d7ac74ff2fbd7f3c1a25dca3ac40667eb931d63808598d4a9d66cd5173cbf1bb4d96ba00ad71570f9f871a7d3039428eceb942173f16b467b7f9ff03ab3b1d8052b5d1796865d0022f597a0b2514f55f5d4b31936f5acad268001c6d42bd8be7ec87b876233928d7c381cb360e3e72f1a81e3bf30c3e4ba60b6aec53bc8383821cc4e91be0feb53a174b5c44d51d7c135dffccf0aeb3bc4d3c80c64919181b7d8c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (699, '{"ob": ["15151515f6eedb39892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d856f62502b25607932f5db38359ad53b67b028f4d1c66ee534732d683709c1298e9390d1adf75a1cc5e0f264d3b376533f9be3f5cd943444451d8ca6c3d3dc54d2e56a21c025a61aaf4dea8cb46f8269e928684c9202324753cc227532ec7be56a07a8279f272991a8d3e48d2827a0b51c02033508200c1584026c125ae7f14bbfbec4dd2e45eea3bbc6dede69985b3b70c652bf0a29719c36c26d1d299ec852909d864abcbfc8a43203961d9cacc84466ddb8de20fdbe68dbcca333ceca7e152e4a53f8408a489d09af90437335b6e395455247a6df58421746071999c8647ba9eed599304a8d2656aad037fbc8c63c2d892db8fbb42fca41b2a7f8106ad32dd3aa6dbe23664291b91a29d4c8c40c51e628f0fca03677ab0c334cc8cf6e5a218d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (700, '{"ob": ["15151515f6eedb09892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ed59c9fa98b3742a9c0734401ee4e2a547c82664111496ff25fa00d89b4e7cf145bfd2e367ee9946940eb93c710fb685408e9343edd842c375612202b9fa366256a33e6901ec5fbd72dba9dbf1b276c3aed8bfed7684d90691ee6c623d7407fba7bf87c125af7de7325c63506c6f76200faca15f4eb86e1ea8091897b1c926c110b7a155eb7cd09824cd0bca29ebdb33104ee1a7d432d8c198486d7c18b3d0eff1df3bdf5aa499ba7eb7bce98aa11167d120c2a98e537e45ef79fe430dae5d6fcb53c4f312876b0471d84e77de9dc6b5eabe96749d07ec3af7ed4d11bedb6be2cb274634f5e9462890372641e27f76e2f0fb65a4be2ccd10d49aa9965c14454691093b6f36071933f8a94f567efc0b65b48dd6ee5b749f74629b0aeadc8b6655"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (701, '{"ob": ["15151515f6eedbc6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85da472d4d2949e9caad42327639de0834d0bb3d97246406da54d96ceeffe3ee39d6ec12168746036357a616062ac278527816e88b980929ed9372a5bc325607b1c0f7f2ba63bd95efcfe98a972df4b4703d79f5b3fce2b3a42ec5273489d5a439ff723691a9f099f03bda4106ad70a82402ae7605ba3cd50c73ff85fdbe091d8ca0e333721a9744a01a325ca248f9a5ce0301289850a8d61efcf4b5816c856f75f4e1e7429ffa0b54cfe9bd77a6cf8053116cf2bbef0158f12060422c374c9ef9669ae08d81d7199d6e0169a4265b3038f5c82b379241cf3f6ec040dac3e6d4e788d91ac3c89a33a902f53b4b5ed26f9e19b9b1a1073eafed9334d80f72648c328f22a6b9043a2ae1a5086b4e494d82f8335ffa3c826261d308d6fde5806ccaa0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (702, '{"ob": ["15151515f6eedb72892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8550d152c70d12ca7edd759bdc56fc5f9d863e0affa379ed6189a08f00860f769e46341e871f37d1451f0e808e29528338a1878f10b189740e171d7cfb9fafb8bf5d909bce4ed84fd66f092eb64b1c42ada112816d3efcdec20392ac805b1150fec8b10e02fcdb9da3bf8827cb1d94e81911a58db3d08ef1ae417db62558cbb39c9ae324012aed3dfa506734e4c81b1ab7aa28657773b8f80d43cdb6890dfb355562e8d143db9af870293a4a272c9f2c482b35793e3caaf5ae9ff68677f6bd7770a9503b28ee761dadc736f159809484e06c9250c3653d17e8b9ed2677a60a8c96ac3fc34cdb6da5e7594444cf3fdd45248e6408bc40a810249515475a402f3fe7509bdd6de87f34c0a3a5abb6fea8937033b091d5bbeab6fcc00bfab25a71aab7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (703, '{"ob": ["15151515f6eedb91892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85b7a7c39c6d9dacdaf46c431bffecb441de284a2329089bee3d03e9967d93c71a9f8ccbf1cb990a5b88ea01416b33aeffdf71916afa47ad5003aab8896eefb9eed890773aa07c84e78b426db201e0a524b44c8966a3245d3825ad25970a023ca32a45131071d0727b7d60b50a489594dda8496c582838128a80a47ba1bc4035a650f00b85d2a0609372fcd9dd904543513087c8516113cc0639a9f575f571dba730dcae263d8758fb2c394680d2563dfd8c40499c5fd16ee45d76e9c2fbf4fd777d6e8181b3a6b9219df0d7e884860b420410ad276f866f0821c4ec17a26f917b46f43a4198632f11e08589e7f781dad6eeb9cc7d8fc45f7d58fe8a07f1ee14c7b5ac31183052202a7f08cb2a44df581af731e084d7f770d65e1b99cf8418f574"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (704, '{"ob": ["15151515f6eedb0c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d2be91405a6f0f18e76d479bbc9e886e15ee8b680d33becc684b37b130fa0b54ea46390a37854c60c53b07eb71d77fcf92397b58065ac6cc7cfb9965fcaa003dad73fdc964332090b682b1811905648cde12760e314a527791ca1883c943d4a3442f6dee5399ea43b158e895b4ee2b3d5e61730343edba7c9de99b353470b46ff0441b4720941f63a15bcce0f5e17246014ef486ea58b81cba1f858ba9e1460bd55858ce95a0cadb088bb077d2f13f735e81c12114a00d3eee818fab24a419581b2f347ffd2eb833137cedade747526fb3dc7bd4c665878e9326ac29d9c9f2f12fb35e3be0d69680134c335354f22656f52fea1ae6a8b03252c00ebef1169392ad1bd212303389dacfbfa6e319e5636d5babb4e1a3ab4b2b13fe48a968edabdc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (705, '{"ob": ["15151515f6eedb69892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85bedc96f2dfe612406df5f1fad426a3af030d20ac9e8750589b2f7505beb7b23347cf7f81d35426d1e362217ad8a01489d890a669b42cd66bcc43a12e4a4a239aa918e1040d4b870bada988499971130c8548d0333b626f86227e02c1499de9ce07c48f1231fced4954efcc2dbef6512cb2ec9a1b3f80e6a8e7a147f9c341f2518b92f1f27035d4aa5cdb9e4750163cd13c27d7f3618006c2158c465b53b64af1487b63dd44df8cfac6fd02dbd695653bff20b690668d6eae57749a8f5b53a8c3a7499296053bb49f50d7e11427a6342e73378140fd9275cffb81f72e61805fc55ec9862214da4e5267ed49af7a7845eb2939d0c8f69175ebe843c53e37e4f1bece562feee92bfb1caae33b1071beb247656f066281aa4b5589431111ecce41e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (706, '{"ob": ["15151515f6eedb0b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8542c383cc01a477b681c07b51fd7dd604db60efe1fa209c2263a1209568c3f37f44f3fc4ef62b4a21645b17dc9c37603cfebc1374f82a216cb0c042a30e50d40c2546751266e17f13ff87ba172da022efcb683be88c721212dccdfd6fd306db549bf6b121a0d746a9aab1c7394f5a1777d93d74326b9e96c1f2a4b0f6b6da6ffe67ffde46d8a8b1fb744013b42493f8d4f78971f6f26a303e2e4debb0f8abf326b09834d261812fc0a52fff24108a6f6b9bc39de9e35e21c4cbb28e3fad1996d2a091b4862685b28fefd42dc2814af1b460358a688cb7948869c3334dab017e25e4417b437557b10226af607fadd2ef07403b05f433a49a3edc30fc40ea8fbada27e5284b3a47623893c8a1e932c7816d21ae67306daa12d08ed449e22f0ecece"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (707, '{"ob": ["15151515f6eedb2a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859b53e9b02628d3ca675a3ce21a5dd4244fc95bb0911c8c7e484eea040b99f600e8f2786e92bd43c7db5e35b113fe2a0a0a675fbb6c7ddda7cc0f50574b03caa19718beea50e248f78a0d6d07476f976b3eaca6bf39dedb2ccf0baf5729235aac06c993cd6e60db1e1052509c7c19e23c567c9f7cb2ec1fb8a8ad60a29bd3e106baa06af1319aea671259ae43f1b0b9ad4a755d0637768751e2d5ef04f77a7e1b400fa1efaed11c4505a7044f5c8ceaa7630314af445b5cd16174b5c00890e1f1c22d332515c96300e6abbceda75de86522da843beda5a50b0f5591b0be9786545f77bb5b26a3b655dd1a707761735a8d8a258abab88dd22e955ca94b1a0595d82ac125727926df4461aad9da18b4f972646a521000125f8deb43d13a8d415ca9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (708, '{"ob": ["15151515f6eedbe6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8501db47a42c37bcd8235d044bb2d041217315694cab2a18edb866ba99e33b4a413415239d051799029909b90a56f1701cc43cde112168852b4fac10ce7a22a5ea83aa3e991f47035235013b48848e5cde20b446508ca5260eb043d9d609bd372f4d975401f4d47380d41a42071f04675bd1d657c758d40d49cfb956eaff49dcdee4afc96000226d5b64160479a0ab21d417dd9ee885603c5d0f7d6a664468ea3f6b6e8970ecebaf8a35e1cc3eb5b1ada1abd4a0585ef34cc4580ffa2eb1ff78e7bfc04e464c87f0d12e0ec2c16e1d3cdde7aa620caeef2e3759fdb59784db120cba77d9fc9602c961b783a0c040b7c32297c91c86fdd070c376947f77d608e42cf0e88b73e27797e3b094bad1e92b839fd97ddf6daeeecb5f6196d07ad5786a76"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (709, '{"ob": ["15151515f6eedbd5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855ff54dbe582c543f4a55dac12dbe49da233492db44ed76890401c841edb23ee9d115f4c795ccf50a29f241745ac35307604cabf8f036cb6553c853e9cabc9791c975da7fcf498c0a7bd4e888102f03cfac3f796638dfd6133051c74110aeb3f2b8ed810d9ce067648a7b9335cfa26c34ef1dad82b666a1e4b5e94d8667c2cc196c38e41e2b50e4abf8edded85598ad2d147355878bac8c8c659204e07166c500c72d908548e1cc4dbe4d2c8cc0b1e9d10500eb66ac815d4b1837bc9c4c1abbc3dae45187f83043eb0a5c3d542e665368b39baca80cc41482ba4578ad83a58ed18f81884579781b68f1ed3b12f93e7cc3a3db8c656ecc4f6be3c047ae9024848db2992271eb1ca120d83a2106fd2e2f7ecf8face6c82e9bd7dbaf609e5736b2e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (710, '{"ob": ["15151515f6eedb54892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858428548fd3cf3d03e55905c38c8a3ec210d2dccb06f3a3a9119ad3ece531e01d26af95f05be39623120f04e6120c987a2aa5e3b27a963e8fad9c39bcfefb92df1f3f0bccbd4397ee2165aa68df359d2f348d47c5ece05f48a1d9693d3806142d555dcabddeb1d9ccf441b6afbc9e4e54564f0d180c4a988b5c4e560e5391b7071e94f3a3aab0e2b584e2bf4784fb84d89f4525d0790922f26b3f21335f02239cf7151b30b7764c6d396e18ce5e291aeb8b4ed75044a0a462708a1203c7dc7fdd1480a6d220e8fcefd1cc2157b43411429d4d5d475a1e4cefaa153531d6637dc1d50adf1dcb7027325c69c6e1eef5066d581b5566a0b591e746a3cdcc3d7bbd81388ab8bd20dd03d17c540885127a7bf70527bfffa6c780b4202d1c986a492e63"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (711, '{"ob": ["15151515f6eedb18892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ea1e8148931f776ac462110bb8309abdf9c421ec46530628e25095c0ee6a40a8101eb6b7368b654286a41df238f2c794048c57090e4f8cb633487d64c361f3dfba76d40a5f3c30f0799076e98b992c5fdf0f2cecc0873e528bfb1ee144854e7fae18d5241b4f745aa7dc8c02c9c2a805d0bb1a7356af6bc2f2e930f84490f756b254c0332f7dc07afdc8f2e1f25d06c788df533c15040002f993460368dbb00cd44649df5936f78293ac8c32ea4e06520cc401ed1e331d6586b96492130f53eb536c22641ab2a34c6fac933496b57b2e772377653da97ea0a645125677b96c730b9f40a77439ac72cf919c2f026d67bd16e0f372dbdf14f14e0c3693a8b210f1aa4e053400cb2aeb3fc08d7d25eb791fa065ddfe2a23831c04673f57c77b710f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (712, '{"ob": ["15151515f6eedb3f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c34c549b85de8961fed57925208839f08905c1be5eb207e40889a604f03acf1cba0b186d2adeef108503c2de2ececa9b882a80cb8951c3d34d4292f122d32b872f2567a687a913305936e105bfc76fdbd60fe3559afca1c38e61529e1f2fde701ea482fc283cc7bd2eb2e2fee5b212de60ec6079de597bd17edf6f6cf9d714d5514cc2c43c28402561f46344ba4f58b46538f81dd56c363696910beb220ef37e65d09ab267a9baab4abbd4272237863301b0833818e5f54d3ed4f8da40716f30cf2d302013d113e0ba41a81d47e338fa5eebce3c7a2322aa65370eba76295ed1df5f0248375fa7ee23a7f9934af33d6db51a707041dd7389f301cd8ced586ed5c283df19d17f102198475af1803ab729a71e53e1959aa4e0ae4c814d4e128cd5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (713, '{"ob": ["15151515f6eedb20892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d854eb6cf7f253fad6ebbd28221889d4cc5c0365b34068667bcb4ffe570dcc9609832c007ab179c7b8399ef88bdcec735b69760cf05121922f9d26b50332a17076a412a34f7da73d2e58ffa1fd555771e898f8fb88fa393b1eccb38349cccefdd4c2fc2751b899026960092ca7fda76b447332365c74418962f8347468c0fcc5966cbaac2428c5d45a47b135092af4b303995b7942e907008c61a9118bc68e854e9041b3c445c6132d4f333cb6849089c186b0303e4ebf6ceb8d780217c85af5e79aac3f00b7041d1666e6e1ac264d4100d67d07ffc14034cbc388290f0c18b301e1f151f5eef62c29830b4d3c8a75978654238775e562734d1af4cfb85b39bba268a1660bb776323e9e8ea6c062159e2f77d41250f3dd7a6c7aedbb19df4d3adba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (714, '{"ob": ["15151515f6eedb5b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85142e8f78f762bfd444b5e1fa825f255eba6943cbdf1c3e1c3a0fa5afa65a1839f06f507495bc31855e1742b9bcefb013ab89e40ca1230555e0c337089c992c1478759c304b5bba17362fa8032997be2508efdb76011dfbc09bfc5941cfa5f254df9ab049fade5e615739791d85a36ae7fce284a0bf86e09f65e0906bd1da46ad1f7804f1b5b13e6722d308f03408ba86e5be192a45242b4edfbdaf9cb100c74fcbf73d5714694988a3942cbb7e9f98ba411b9c2660c5ce3da572e5509ec2eee21e07420fef3551660f7379e705e1249f30d57af029c34aacd8129d373b2027f356eb97e0dba5d9208f4e3896d71bcb4f720a68cc64e9eb2edd99be901454b8c5495079eb9eb83df3a325a77bbd72f21484be5d3e02d9daaeabeb47cb9b0db0d9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (715, '{"ob": ["15151515f6eedbf7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85290e1aca06a4e0caf3999de4bc18a4cb78351b5f9d8f94165574950c885810313028783c470fb0021d3ce8b2780b7fecc4c4fa23953372340cad0f14636ffbfe07cebc48af7b0c5bc4ea0d0318ff453516512ad27c3c27306ef57e4492597000a9401ec591882282d2af28973f866e56315cf43f0519c77041361b79839c08a9da26e2c95f61d58cd2301736817fcc41713fa9524d9e67ff0e15c0b189a699f139a2456b30615c7c1368bd61ded79ab99a87a99bcaea937fc124e699353aafc2dd1c105ccaae37aef94f2e80150cef9f045daf549f0883ef5b4b25fbf43cd5c615535b7e335ed201d2de64edb2518a627fa1633fc06b9e3e51d5e0234ed890e595c380f8aba6a2ef22e0dd948b38f39c9b58fb23bfd9cb8f16f3fd0b6bc16743"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (716, '{"ob": ["15151515f6eedb3b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8510929f91e6cb1b584cd86f42d578ac28bd63ae20393ddfd40f4a4968eda868f8baf22ba0df9b4d6e93efcede3fe7f6be4d911b6651b725c565184d2f5d68edb47c40dfd361744c9f3460e45bd280dafcad8004a03b86728c7f65765ce7e7f9fe52ea53172c1ac27e1fbeb648b84b4d944cf4227f50858648cba9dde73b7643e71418d3327f83f6dc9899c75131b8871fe0c17952a99df10381488250f51cc138b571e9aad20395c8ae72fe9978913ea79aa3b48f98ef1b680068cc58a5f3c9120981b5b3e565bc32b996ac12aad327d17318e6d60f560d143226d265b4309326d32a7f2478e5fa84b3ef93fc2b3eec3ffef2906efeb98a4f0d2729a6d905eeb4895fb95e7eaa1904a64fbf3e4f4838f9533d3c80c55857249899c535f3a33968"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (717, '{"ob": ["15151515f6eedbd8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857ad58c9c7fe4f9198d004c81cf4707400b1813a8b923044a25a56f0b9e056d1119c5aa855fcb40f2a5b9050f781db9d4a40be8f4b6b7c525d1c3e014e3cedf37b31d6023c062232fb2738696f95398bf7f7c6e0ada064d64110380b7ace4d840f5828ffd284b6cd7de82a942b673fbb4b49643d8043be04a25d1f802ec6f68e23dbf88938f27c0617e14591589aefd8d0eb0cefb6770fc4ec5ef280ad91e9ce08470519b8014631cfb9336ebbefb6a3e04c24e2a396c99f8e6f9a19593a1ddb89003655c532718a112f1449900b1da207dca69316e7322522577b2d28909b4a72f4bd77f7c71a3261ad0016a7df1b212ce28dad20efeec53e939a16903d34fd2c9b83b176519fe468d8fb90707e0f1d8568fb0c04f77ecfa6b1338df905e3303"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (718, '{"ob": ["15151515f6eedb08892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85682c89e48db3e52eb8025978f266ae344ef828ede22faace465136d45edd2257d5f82aa24ad6488599c2d5f86a37459e8d35a67f18f736c37ce87697fbd6a91cfdea63cd1fa14d604fd4630496905d2e43f85c27a254e963a494bea338c8a87c4ad65f8be58f2e2a0dfbf784f1eeaa75778e774287f84c4f2cc6860a6ac6279609480a31529cf40d5281c67dc68a312add39ee77d8c67734d4512e53cd850dbfa0ae14e37b45c197ec08526872ff6ec59a31a34f5873fdc423ac009d59c60769d685c5047cb4da003158f3de7f7f314a98b72044658f47f1b64b07fc6510cd4a8c0daa05529ba48acb9477686aac6b9da971abeefb66826a64694ff89f2bed8c65b80b0efbbd1f5abc3db0c964828c93625abff60bbe37b1a8562ba845c2d4b7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (719, '{"ob": ["15151515f6eedb2d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c2b5a9995f775aee2104a363f0a228fab5f2d66544dc6ab5411109914d1caf69ba75903933de618013780759fdc5373d80e07602c7f3773c629585a62d67d6ada625018fc35b358aeabbd9ba49b7b6d4f9919ff0e2ccb5b977f828aafd5f8715a522c138271d77acb12058bcfb6b0c87d432ed7a8fafb12ceb6957760f4a35ab4321c3553ac143bd81172ca8e15dc55ba7fe31dcab7ec83ff48a8da37f16466414b88ebb50e15e230cdacba4835a970c99493c720533ab3f0138fb7b87f52a8c1884aa62b158d43ff98228c23c6e4ee5677416c33e9a2766dcfeb7eeaa089e29cca6842fe32ed0333c524ffa232afb1224efe7cc6acf2b9db95c8fdd822808402431f9d54da77d0997a84b03f2b7d668bb1bc760c6c42d24a055618db39c774e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (720, '{"ob": ["15151515f6eedb9e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85129b3e6716f27d62286e459a9d0061d829dc998956e0cf72247edac20f887e285e74e4481e9d09c58f5ead702868e65bba190ae8f53e62c212a240178d6829e5b3bda73073d6444dfeb93553a9eb4db370ce56b3d0428de6bb0866d4ccbed46e3d31511f97823b92791558756eb26465984fca9d7b831e4d56bac71f5b721c5bb0eef874e92d3371da4b8067a45070b726678fbc7c7ebe3e78a65052c3a432ca9506255044f37b5f8de3d82e8c7a8962e4b98132fd4c0bc45d411e8433994cf95ae58218c111584ed78bdb47df805539cb1569300b027bcb3d853a4181b6bc4033a2395f88a6429ff372986eb3ec6da4f286532f4014081829e262f7efbd2be7c8065274055840d466e76305558fabd99c70ffc7dacd096e540c0207e193bd16"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (721, '{"ob": ["15151515f6eedb62892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8526b262f63862aca5845c3ad2be2a3cfc8a3df0ffe169d49f916d1866abbb9bc64c4037335c6d9e1dc2139716e1154ae8cd8d01e1dc11944f70e7c81557cf59ddd586020e10973d04d10c14c657561ec15515bd8ae40370678443fd512113305799a152ff900b9f04cc835b33ff1042026ef0a0a33e81f343df4c8576977983eca868bafa4c89f1a725740b0c089ffda925be0c8cdec06bb47136e3d7303db59db1c82094eb33074d4722ff4a2f872edd4f7aeda1b0bf54484f53588b15ee6c78cb649b7afb259a121cfeb4a6150690e2c25c33e8b3e850772a31b7c5c3b00b6f27d40e8c706a6a89364e814274a60c7aeb78a67324fc40c135e7e110807ab54c529f4ec9d582f410997005000aca5b7fc03f63f4aa8aed676adf715ba032fd2e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (722, '{"ob": ["15151515f6eedb73892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dfb0128be5790ef49c4ddb8903a1133b4a52c75829f38cdd263e877675029c1e6d06a8429f59b77f4ed7b22c04c1d1ee84f6959bf947d7196a91b006943f35419ce7d63707eb1ba60104e5ede1d5a6503147351d51a51e6d6fc725fa1711ac4cdca319ec7cca9e149ad42a50c84a520d4f987553b59b426d4930fe03ed198c99c1e888a33ec7863b2ac256bd8effeaa323d3513bd03af6a3d226aa987aba0d85e951aebb5261eaa869b3ff119a74bf956db141ee8c301c0b5dba6213fb07030c51df70709dbc9e023181f1ae6fcc307b11261615cd743a7bbc3943b7911bb27237666f690fd02a1b613c57e0b40f6b597c79c3397958792d83266ead82e4c642090f50878bb9461e2850c4c8ba5272eda0a17afbfba3b866bf4842f5c3eab752"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (723, '{"ob": ["15151515f6eedb0e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a737ead56e92fa2f22c1303994d5ae8b24b71ca1fe75ce5576db5ba7d40525eb9862090f594aada8bd1113b91674aab6568d556c38c2c3fed9ff0c22e7990d679c771d34523a465e7f73a3abee14c774623cb149fd82aa4a12f80f51a2805c73a19b043a930d070b007ccfec616c8cccaf238cf15088c9db99c2f9367ad4439965260bd4968433f3890c0e86ca280169b932ccbd34ee55021a3908f061095a25d9fa6ccf2e4426273e864d2b3f606098cd69643811f8c78afeba5e060a7628b375561da9bcbe51001e80c980d4d65fdf8cf102ab9ae77e2397f59673f492d2dd0e68fe60b648601d3379cfc25dc9d631224c8b3b16dd2743f7ca3a2c2c36c5cb9750780fd715ec480af76afad7782cd701835492c46c61bb8bc5abe8ce1a5787"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (724, '{"ob": ["15151515f6eedb98892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85170bf8ba1d2f769f09d774ddce1b6e762e11be134697c1364c515c767c151108ce8ef069ee0f2e186e07c2e28b63a241dcee3e7ae3d2f94d0e1932bea7f8cc502a0a096ea33e674ff8e2229f0147b3533a89a6a1ff64d46cc0a90f357c3b5391b6441be0f8238b210a98384e10690e8f6de09775644d3366f7b41c1a61d8ac482dc81fc18a2e9d7a2b8596b8ed1f165881097e5f2732e04ac4359ae032843274401ebc54e78989cc1c6d4ac15686d6be19aeb30b20a89925078b9c9191c6d656d69537d806eb38cd420d013e6e6152b4b57e45bea1968da889edd48ca2247e92e9aab183246cb72005d1fa8b3330ac19336b48db000522890b9e39db9577880bf2102f9c610026100243053073995e868ee6dee2e5bbba7bbd8ec3066d5865b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (725, '{"ob": ["15151515f6eedb04892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8528b48aa04335f28312953904ab526c43a8ceea40e1d86179c32b03db602b3da8c62b397cc3541520143094d72c5eca93d3d4bcd337883f1192fb72964927cb1eb4791371b59b3f800a2cb729c34e7c8fe2bcbefacfb9cf8e41aa1183940a5864d076305fc4716230c43a99ae82d1a2daaaa192f40ac7de92ee15b2194f4f76d43268cbab0711643fd687741fe034a7bc934cf31f93e73ac5a57cdbd251625f1cfe1c2fdc325f3c8f9ff93014db942388bf4ee882cbc73061240487ecb25bab007f7ca463edb281ead8847991d8d409bd071cee98b374c6ea90109c14eaaf961afb9e5f8838c1561be28c989d59b5bd725403a26a1d2e5c8bafcd85a41486457ae7ec33af9f23aae2384ffcc341a58d13f25b112b7a107b24bb4cc7698aff2912"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (726, '{"ob": ["15151515f6eedba3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85af2ed5868be63e59572177382617e94f44559a523ab83d7d62da4ab8d0f8983e28283f43c525369874740823e80ab2335f110ce3c54b7ee9a0f59dd14f9af3376d7a73e0c54f5c72b321abc804ee4790d266885a2f8c3135466046350406247a1da9c754b0adf27dddb604f657258980c3ab57de13a720b1af2384d3320d2f84d2de789062f16d1669f02ea4768d9734756bde281bcc492df94ca8b19a23f63e552f342cd783a92d21b138494ff548cd0d9d8295e04ab00c1f8ad5e14049de7209ec08c279a5e8e351d8be178722fb53030dc4fcf8f6e3544c398cfbb347968e280e576c9335f753e770b33f1b1f97b2e03e6996251fb0ae1d45dff195632b07d1b673a7ed74bc409d15f613e94bd911c5fa21a9f6b6e66f8395819f234146db"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (727, '{"ob": ["15151515f6eedb34892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855fbabeecf91f3c4e152f6564f083e86842bbf90678b5695266dbed13f5375f084b79cab512e726e1a446c8a429b88a4102e1919b24f3a0466c90136ccd152cb915b1f0186f97c45c0478f6cbb396ae1bb9a694c16ce1892652be2c72641060a3b3f8b131310846a92f1f0829fb81d6d7cabb8b5ef0cf16bb5d8da17d0fcd11c47d97e9049d4a551efaccda968c5603d73b49b4c256110c4e42946681c2ff8b91fbf2eb30759fdbc095b3791f2cb4d9b40065b869b298418f366e03a45ca56dc30fc86a82c7cdafc0e7b5caae78ed51b67e73a31ccf66dbe8d82f72ceb74c8f57838b1cf1128860a2221396520deffe4db279476d84a7dc0eb1317f9fc15085d2ad0f8beabb4b0e2982496e40458f7c67d7a136a9a2140615a44f1e8373369cfa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (728, '{"ob": ["15151515f6eedb35892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a2bb506c23ad557fb1cc08dc8dd974f4d117605c6150bcbb5abebdb61858a7873706f41eb7093fcaf7bdbc7cf00823200baa69a8eb589b44bb66c9c851f31c64486792080a93d9fb94ee2ebd34ed8ad5660d552d2e038d4ad7dcb1901086376c225a3e8c4526ce3e3852515e4b9138f54767b9863c1290e06e6b1bee3fd7ccaff58a85e153bf77e5a35dba9ab5cdb681db2dd49e1ff8291a80d8037b63277013ac95b11597f614911538ed84cc3548c0e295f92e8470c6332a6d708f9b30fea266a6510b1223cf00e910bb988fa49a4ffda7456d28d178ef33ea0000a4be9b973b718db7834c491efe3e9c23609425661b0da5111fc1deb6a867e95e8907b0265b6f041a7a0ae80218de8e333913e7ef019a04114cf03e1d22114da59f24c57e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (729, '{"ob": ["15151515f6eedb8d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85fd18ee98e6ca511056dc7e53bb44bf3175725666eb3ac35b412808fa114045c3bbcbe413b4f0cf4e8a6dc136fc92c895a0502140430bd614b42d206b1b50bf04b8c78a0f4e9cd28dfbeb9e1de40827a2301825f810f5fb1e92f9daf4c4ca3494e96797166dbd26348d2a7630b2a0bdc14ea6aaab38c9ad6d626ce0e3457f451cba1987bdab00cb98f0a2ee2f01de39f279c0f92b73678d58946dbd112dbe5b5d3ec7e26c711656a7661915c0cb15d8ed263ad4b3e829d892b4d173848eb1795eb97ce1ace2c58bfc0e2a24c9634ea4eadd07cc246c8bbdefcc661389c00eeed1c531b44b05fd96f2e62696d15ad103d440fb091e340f415bdbc737d0ca6cbf189c68f8a378e4216779c5fbeb81c1a97d461a856bb8f7b451cb0215372a642034"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (730, '{"ob": ["15151515f6eedbab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8575a1d57950a971e12e43874ae6ad574502bab93f93aeceda35a7d26e59f9036367560d20e862415026b910dc9f9be3603b31905958079aaeab62c6aefc09fa5e9536ad723fd3911733eb9ff062e1c41408204761ebdeac0b2e54ca205844f4c25cdf8344722f98c19ff4116e0600f752bf46f627f73e8010b5328a4651c5c097c8c03cc1b8b6a0a00c85b3771c69b139e73a4f77b4481b271201ff64186069a8915a60cad19347229c7f93a13424bee8f1f7b4e8361ffae7680d165810e17f38359eca644b5d5790bec013460fcf16d1ec32c1a42ca27ea91148f4da5c71f0798a810ae712a7d391360d1523374bf3fbf641c14e47d9cfebbfea7ca5f6b1c5be254f4a5fc67606982b3857cf3e4dbd43e6cf85ef8ac05975a062e3b1540837fa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (731, '{"ob": ["15151515f6eedb80892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c841b3a6120d76f6954829972344a8397f9dc8ed07df2b0a2c33a9c3b96c418f585aa944da9017e95b2680f5008e88c654f570e51d98a3cda448fb6fb771f91a790e8f9126f2c62b61ab8ea4b76a20d0a9648133f05f57931811bbe68b2f67d297cad3c01c5bc46078a0d6c0bde8359c3753ec57a18c8c0c28ebe20a310e4f11df8e1a7ac4c13a2748e1097b0c7f08d75427f7cd8f0178e0c196004726b373daa4a2196b0c66472ceb0b546131fe72d7ab407957da733825f0ed5569388037b4dbfa052dd8035c66869ae9de11f549a956fd5710e59315ba5a83816bfc00f35d5e80afc243357415d6997a02e68b25dbc2fa21c51c9019b618d0123a6100589e4f17ff98a57ab03b8743087ff85175c150bf190c2fa7acbb5f3fd30b5494598f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (732, '{"ob": ["15151515f6eedb93892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851661eb4e97b69c61f0c547f0d762c5444810ca3f0465554a2629c9fa6e63ae1021bd1e3676c76cba0732f8d31449470362a6d65a23bba011ceeb5528f109ccc0451aed08aa375f11e2343dccf9b6ef58b76419368f6c7e0316ee367c07946a54b475042d5fd1efe2ef3a65ede907bec35bf290d926bbb17240594b5716532da5fa74395abdeb76638c3d0d5a5a671a72c4ef50a9375b612727a603f52b6c8622736d6d330fddd99fa0fc15d59a57bfe58997f307ee2d194fba5f9c62c74b4e7113268f393b7904dabe8fcfbc22cdf9db1f85d777909ceca556c127d08f90ef9db955d879a3813e8bf8be321203894886a321f859a4cd89c75facc58299e0e01283fdaacf177f406eedb9c442a5a411d812063357bd9f5980bc7f7a8fb38cb384"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (733, '{"ob": ["15151515f6eedbd9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8594d7c393a108aa218010c8b66e7170ccf36e635db53061c06373927332e094c7bdf59bd44a79d88d7cbfb52e091072e84261e527c7d29a9508e4efddb9bc5b0eaea22b1ec913b3dd44b271d44689d101fca72a1c3ce2c52187254e4b937c96b18d04170ec7de907edb8b8f62188ba17cb7b579372473740203307a376ed7db05344134599583890d3d9668403f55cf2b21aa7280b2e76d7a4b0ad1325ee42457fe01f848ec952da5060a8860e01589990ad8f6385ca4aee9b33cc94a6a2f7d527bd3efa1403a4b407c9856224dce6ab64c4b445ba3741bc35d267cd629755ae78afd71a2264594d638884245949c85fe2ee810b8bd9e9384a8b7ed5f68a3841ce3cf19efdf0e16be1c1c7eaf81bc698335d80f58a8dc80216933bc3b8b76456f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (734, '{"ob": ["15151515f6eedbd0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85029622786ce7687fa8a4ca842a082a608deeec8a25097fcb6925fdcee57638986c26b98625b50b0692acba119447b3825d977baf5af5e0dde32edcb77dc3c421b0dc211f1115e6f8179d13779c09380dd1f279449745f5bbdc72468aca0076d815df0a6809e2cf3a51d169d83b14bf703ed4f1a1d7a3f52c8920e6621c4e4d8f6d097f9963d36ad826e775fe0bc0ef983cf0c220f8d7c93aecc934c7774e04d71d2dd9e14ef25b43fc7aada706bbcf5b6aed0ee2e0c3e65124d3f803c664e1101c307f8e96c6e75293fa7af2f26d43589a1dda926f8d77591189e7633c7a74d5ad0b02b4649875f71e07e65e398613ff9401cf13830464f6a7ab6ded6de605d3d7b1cff2fb7068515484b6c351eb5845b71f8802ff2e464e3cd6c2bce19a76b8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (735, '{"ob": ["15151515f6eedbd2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d3f68248482127f63950b35044801c6e7ea043ebf14fd02551b645b8bef1c7662185c26fb73b267211cf0bf19c023b7a786b8ead22fed94f09c5abb26fb47270a8f650d5a8ccdfa192916ebff7937bcc7c24f22628e2de634d6fd39583b0fff9ec331ef27e5c258325913d9a8cba32a3bb66ba064339f6d95cb4fdd31b2bc501294bdd14e6d2c2b13707b09845d050d6131d7230050e3556abb280d8a28b586d6dc0bb748f41bf1516de13364f95a25bc13d932232ca8bf672fd0772687745954b98612821d3f51269bce198b8574c59e816ae974af0e793ef92049daa1bbd256c39f6fab463fd6367c8832d128be4eb49241dcb4305cea779b1a973dc77bf00cbde96dcd92245af102049f3742c0aee6479dcfdd37a7f00a30d3b59b67e6c7f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (736, '{"ob": ["15151515f6eedb1b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851bf84da5b6a1179e433b4cc92129e0c8dddc2414b3a029157184f3ae104992a925c9ba023104776b13faf58228f1635541e183e2e4af8d9149cb5d83a5d8c06c356bda5d0889f3a54da2ee1ade8cec4f1aa7b4ec124aa5c21d784e6fcb23767908688f28d06beb297cdb4fe58c24bca95c885c93375fb4a4717d5a2a8a8f87d481150a3cae126afc471143dba8981523dcf807b33e3fae7c30cfae62dabe34f5feaaf1601f6f01eda629d4944adb172c9a8c651690889cf8b0a47c5527474daf71ad785c2433f9dc2790be3cc4a1a848312e7635c265d429a92dcda133ac9bfd2cfc98cae580f8bbc6bba0c475b86e7edd01337f4d907670fcfbf2486482f2d7da66972a92fb803e48281019e4b97f2e70915bbcdb0b5566702efbc7b53fc1e2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (737, '{"ob": ["15151515f6eedb71892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85dd4ada168d4eca7e7dbd2fd48df94a8d5051989dcb76ef288dbd347f97f02731e661a0ec72001a9827dd831733172743dd0a7ed1ecd46064c49bb05c184bbea736da82ce863eb58467612c4a9b657156c8c97229251441cca1ee4c2919c1705b7a3d72385c304c43aefee2dbf21bbcc7712b6f2bf652d7da44b213662a920bfeb6f60f442127d46d7c1c724fab55911f843fc3f5bee7c904a23bf0ec955c54669ffb6e842f8b77f79a9fe7378f40a2f95d21f1c1a86e7ac76813dfd3efbd61c989f4bb30d5ec497a3e21fa1ae2f8f757b7bcf700b9e18897c805cd1804753607a0c4e7478823bfdb0611d6deb774647bc62c0898dcc08184686f742ab715ec60ac2f0630bec45864fe1af6110f370376c8ac4af79dd68b0d46513a15ac222a19"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (738, '{"ob": ["15151515f6eedbb0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8508acf3a37de7dac07a3e37233fa3c9536379f20b845869cd9facee9447ff6813c70a02cd26328e5aea22ffaad546d340f81a36f00b4c1dc71b2238cb8e13d954ad26a2ec34a7bbfe3504cd6ab353b1283e55e934467fac029dfeaa7c0febdfbf67a6b03e719cc35f2af3cfac14afbd3f59b35f8b30d1a34a86f1fd03dc435e0ae7e0f4ec13ce665c1b35f6b4dfb610fe1c11d7aeb30399d3b328e9f4dabc667f7af9cdf7bb76b76b49944c906b24bab928635f2a02edf24d233cd21c7f96b3da58595541e9d10cb60df8275cb8f8a33e8bfb1fad911bca9ea244c421546b2c6d991f5c975b63a5254df0702b1ce6373ec0d57b967cecb61f7ff4291dec8ee778b1d3a56545a49d80c37f6930c997e1dea49ac77537952d0ad953fb2dd2ca136d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (739, '{"ob": ["15151515f6eedb60892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857e8bd2d366826e981970e2b11f163eeac772966722850e9776a32f8e29718982897786079df2542037f074bce0890a4aa61b72c53aa3ca0368529428f7dbd374a25b4f63190639fb8105793c7013cf546210a6bae64166d1c5f8c691f4b40507cfbdb0d7f446857f2107399489f437f9977660e32a27d10e05a9f8128c56758c026a67aa525aaea43baf1319fa64c4dd0cdf59414674aa0d71ae0d1cae1e6512696f3f38475581a0f83b0d7f4e864f277103cc873bac1716fc09cf6dc00939fff7501f51130b4cdbb14ff3a29168f3e7994aadf714639cb9cd90508e790127729fad7c15ee8816638402dcffab49ce13bb40730d5d2b55ea18469a0fe5e1498da7a730e19db02583b9df728768b16c3e1d7d5fada28366ac691ed0fd74cd7974"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (740, '{"ob": ["15151515f6eedb19892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85a84971129aa2809ca8f3169bbbb15403889ba8899e91afdb1a14ac284cd51f80b6ea2519f0f7bf3f7c2f83ee90d897c450144b5ab946e2030e313bf1f2073afd033fd23b8f62be3d89034c713970efcdfc01e5e649de80f6371a3ecbf310e2e91abd4889d08ab88a5a7e358cad312682ece27e4b18eeeae03a2d99fc22bdb9cc1b229b423736702b3dc361d5c21a0014f777e5ac11dd6703c550e05061a3138ac7c453b8e89d2a8eeb2f6862e844dd000c36047dfe9a2bfde9f3dedd6c5b5e6bece87936623e25cb76da31d873e33cbf16bb21892c8dcb9f755f2dba1d37793b9e9516154480939dc0b3d985b3c1f2c24c295f13e47c7310fe839a8bea52fa99bd63b557ca6c6abf5f0e44ac76f1b5e70f89e892a3d81d17da1d822ba4445475"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (741, '{"ob": ["15151515f6eedb88892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8527443cf5ce6f9a5d9a89a6a4b94dde030a1651d30caae39b107db125e9f4bf50cd4c732ed161e732be052f196bbfded11a12b58257c6c8a43058f9d4965c161fb79fec78a786d3a29e9001a74a9cacaa7091e02df0e2195e5927e900b57b9a49a9f424be0ec88cc43aa9f6e14b47b7258dc281112cd21dc08cc64df34413b15d8f1a66902f7759e8e9bc9e9e754960ca15d2c4b061ed4af6609ff783d43b157cb5bad3ff61c33189552a364d061c9fb5d071ccf2c9fcdd0c6f84e2544aeee3f5f11c646c0acab80f2b4c28e6f945a70c104195efc0131a7d564222bad24bb3d91e165ccea6bf8eb254be78650d2bbd8c37be3f61175d82d3935d2608c03a0c6285ede856f3a67a67589da6d0745b41edbbaa6752dca18309be7bf7ad268f28ad"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (742, '{"ob": ["15151515f6eedb30892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85eb1c62b0c5044a1e95263c9b9ec8973d46bc898a8a86f17c8bfde48482aecfadf7794eb9db1407e76fdbb366fc22528ec371cabb344b3fddf1967fe4ae41d51fa027b4d240b939325d51db4f81e0a18bdbeeacd4b979d9baf365c1c9af80a234a855ada27b776daee1f0dcafcb00be54d5c91b2fba8bf24ab81b1f7e4b33b894bbc6168bec28fbd7b31f0c9ea476c06ad2d4d3a8f004cfa595a8b500b8ee3c6271f86346675c601aa067243326429dd2b3a883cdb1aed43fa123ea3e5910b326eee47cb8033010231b84a9beac38012841c8fb7e063b128b4d2a24b575c974437cf7d054f85c331934da61f742c2a0b0409977af159ac9c75423386bbb27041bbd5774f37947a50c9421fead5896baf29ec4b47c94a1fd453fb8d66ae3d8d581"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (743, '{"ob": ["15151515f6eedb22892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ca86eb79819e459b3df2ffc2e89cabb7504dbd8119ee4560a47745f8c192cb23001a1acee81779ff855de64b9541aea22572371e46f76c6ed0700c180ab388b56f208414ed9e9a03a903d4884fb30aafc2dd625caf4f111bcbd1cb91d8edcd722d342276695425d200140f53112f1d2b893eba6d6fa09729d67162938d097b0ef2b084fc5c8544c0f993b13a9311271a6369cee1f13f4849794c84568575f75098bfcbd6c06d6db105a3639e167c45800dc4c2024c40e014ba87096d83dd212b9daec381d70b82ba352b3a64d920cd02ceb8fafa63f78d0d03e3e5acdda089c16f924d824d970f0c470089437ab5704e9dea7cded07c9ed98d0cc470c657e7b068abf0defa9bb66a22c86c8a24b6e732a07068234d92252208d4ba2a3657e144"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (744, '{"ob": ["15151515f6eedbf2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85378e88c0aac1070cc51419b4345581b503d7744025272dd9dcd85a8b22bef7705e1ac20a0ec7260f18ad69c0d3dd726a173709af0afea9ccb89c88981a5d7558ebd5115fcb25f692d1efb30b1ac68fb9c35d27c21e4bbe902ef7a002bda2eede85703ccb0310ccb9f26f9857d380874b4e9a40c138f6296f7a70067e8b33787b8e80cd46684467e17dddc313f13b4a44658462175784b78bb65dfa14803fdde2ca4f009e1b2d59b1fc01b0d486852d029831cd0ddc999af79248107bff635006923549fa5a43151741bae914f2fe97136a0fa8a89c4bbd42d45c05260568eaa89a03b89f0482055b869574cd10a754b4af7a6d77b02f04354cfa5f7048a0870abc5f9e4192c983504d2608b6243a250d1ac87871e3f95fd3b3018f598804c83f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (745, '{"ob": ["15151515f6eedb24892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ee578c846e872a1d7f020bc602d1ee2d6455b1d6249d050c9ab63dc69846a422445d55b22026121dfdedf7e4a69c737153918f939b587a3b84a959a95c0ea24219b6c18934a31186245dc3ed41d837dbd50b9ec9589317c67d75a1fa3d7d3032ad522934a488514f89036ca9584604be619adc26128f7a7c19eaefacd115548b4991b9a1b9f8ed9b1a7515431f5f00c236e2b181f8b9d9dfddae807edec8c4e3c3b387b87558fe86435778dfac0650949ccca16324efd547b9df2624a8da94ec329c297af6d8387af39db9bf0bc9e97fa14d8637a15856c1e4c4c047bb77b0345f3d2a2b29817429152e8b2994eac995f4614812ed7df536368e07dccf9eb63fff629d39a25de986a069bd29646aefd591afeb968d64ad5d2b148ba47e66efde"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (746, '{"ob": ["15151515f6eedb5d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e474ef091acab9136da58f5946bbb6f4f036c533d748e2ee2463ed8428c9826c0c899fe31aa88112ac434586e18c242d33aa611202e4f064cd8641eea2d4a09847d9b8ac487894c4f57ea52b22e9f6adf4eef6d8a2767c4654ce2b851b447b8cca9eda180ba9e5b66320369f54c49760c165189a725d9048d447fb00a28c06893bc1b5ef366dd435df7b76abb46dd2d69ae94a80b86ff213f52a15aafdd6bc6bca042d2477aa1eb5bb9c6817263219ee94c4f315593673aa8fd2b7fc07c9d7543d2fa727271e785cb70f2915b1091e53c53f685a99e6c7dbb45cfcb8557c2d3590f1a3be2d6cb874d4f3a6ed31f684b2f23ba95948b1fc5461a8f5804599ec288a37922382dc1bfba5eda198dad301429083420342717cb21c1889ca8d8f9efc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (747, '{"ob": ["15151515f6eedb61892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c0727be8645fd892beaa90a879ab3b8976d33afe9d8b893c6753d78eabbae91706bc91219f18cffcb9afc036c345e5705e3e4791fb1c1f3a0d413615c3c6421d62c960b7328815abb60f6c3523f132dfa279daf4039e82adc48168418ae6f6e6de57e9b4d22c967bc31c08c3499ff672c501d11ba06770f77cef42a4188d0d0aeabcb30ae887a761a3152c9a0ce1cd7681888fb149bc5b874c517ac4eec2f817b120f5bd2d46fa17f3b6ac2792a35c56845fb0af0a4280b6836cc0b43544b2d63e29faec027a034254c0f0eb11f68e978769e3127960fc583a6f5783fa90632e9817f13371174eabbb956d422f9b271a6cf5a84b84a911675bc4280f07a0c2e3fc779ced38181c5b134a833176cc4a09b789a2c1189e9f77c68080d7d4675799"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (748, '{"ob": ["15151515f6eedbff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855aa8abd85c9dac068c40fa2f13bf64b01009f55d000b50c1cc4bb9d9b88d2646119717daf2bd680c5467efc4a8f21dfc2e6f6810faabfc6e53cf0c5020a3a31f413a3cce2cef35643d2697195d11dee895e7a1bddefc81289d2eaea6a13086a8a550e9e78c7a5ded56ffb655a7d9b4930c7eec4f8fc851399a458d08246f830e0f54e43ad65f72fe88e19476bcc87e98510d1202526efd7aa5fe25d37c3badad5a3ff76d416487a8f782170166723d06aa65d29333be60d01ffe783a442d4a2f15e419f22e6cd4f14d8075b981d23533104c2be8befa2dee062403ded14449969293402247db97aee91b1e68eb1042eba6b5a620608ff2d7e246c730132d489aa46711243ba8e17aa18e544e86cd6c2b92aca68eabb3b71e2a222ce35c81ff38"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (749, '{"ob": ["15151515f6eedb8f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853dcbb25f29959e85fe30949aa4f127aafcc60065bc541d74ba36051f25fc5d451db71d08f3e9e9c6eb9f3eff0c63fa24d4e0466295478875d260301f274c9fdd6e630e189e3538ddb87e9433806b6c373e4b1d27f90c08b13ce3fde7626a76e986caac31d040015e5444e33742773765895bc8aac6aed27440bd66f65804e3afdb3033e9e7a5ac6d9fc83ac2c19becf6cc82b6a79baac0175e21ecec2bdfdfff7ca836e7b7934f0434602ce08080ab6630b8381ee9a894c32e9cd6b2da61cc33f721fa4d34f05234ac21f2473f03e4533c69ca0c2f0985dd5b2d1dd2321278f8da0207916872c57f4f3127021e475ccc73c770d8966ad320fbe092bd427cce79a7f6d20127a92e7098240c34b7be1d4ff9ff92487f72dae509b18629b0605367"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (750, '{"ob": ["15151515f6eedb85892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d855c7382d9544f6920d5e080b4d1341ff2df37a6c9ffb7e73f1db48587731d445d931df7aa6342a0653661540cf52ba025872f511b9bede5fb0d70b2cf4d59bd9339bae9c41418c1f7e32519ae44efd6137dfcd3ee80a6b013e9620633e9368faddce0955382d2b8c2190b93de6e1bf2f7c933fa9f716a9a56b962ff87762af6f923e57c96ba53122ccd3f40919820af1803f00428591c44ec355020c9b2d8ae95df6c66dad1c8717663eb68fc96c95c0a33e2d5629ce1d11aa6636b074fd597f5c4fa581909dd312acaa9af54187ca2e4a23478be6721decef7646107bebcf59da86a4810d4cdb80bd083a236b036b712a036b13021ac1fd74d3fa005a4b1a75c7894f4ef2903ba07dcbd5d03af2e29c9c9688a50b7074b9214f2c674baa79ebb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (751, '{"ob": ["15151515f6eedbb8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850a019171a5b47f52e9178fe4998b56a15a8810940120018ce6d5abbe94af25b50b89debe44f521b68443f4fc87171e5f95e99aa6b8608a6bfeb74d9a54e3147eaefe1d2b2780021e1ae66810252f582f2de392a728779357bee5a16f46ec3d842e8d3bd150d71edcdd1a45b914226539e31261800594bb2741339b0fbc700be769219f4128b2fc7c3a003c5b4e18b8c8aa90075298309876149c128036eb471a6d63ff94f8bc21c1013c85aed34b115a77e855273f096a65487063c0bc2299bce21a3b41ea9dda09ca02e57aa84c8f9950a8c50e608aba36537841c3ccee5653727e17efdc17a165b3a83735c078dd3eb4cca7e625a975d36fcaf9f28d6cc539c550d270fa86c6b296dad0805421f24efec5dac0541b8431f7bc6f1966f468e1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (752, '{"ob": ["15151515f6eedb87892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e2c956579da8e73e2b074423308a8580b8b56328f868a2a32f70464e143f437f4cda9c4c312aad57d16fdf3c4fe90d746128b21cbb7d50bdceec9c20779322bb2e50a39f70d65147375c2840d44ff2d47f534a5365b35e4b1a5fce7f638337aac4f3ccf1f709a004e5c2c981ebc9737a623e8ec8b32abe8a12c83ef964158aaf52423eeb5032225614d6953f23c4776f2c467cd880bd4f1cb1e95ed494ee966b4f765f21369023e950b5671eb385b9b2cc015ac611f56302c7ce292bfe146f38200b58cd5349a214b2945b8b27196c0d308a2ceb6152612b1f74803e160b30c8c51c2552ba348b8758a984511b226dbb3f98e24549998a939b87bb63927e39fe2da6eafc622d9312baa0fc68e090a61649bc0ecf7c08a69b6c2a58c577c58b43"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (753, '{"ob": ["15151515f6eedb1e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d857856a3206d284ff9bc27221ac300391803743431e35121cccc9cf6f36d4f2a72476db28ebd45b8c20e4d6b6ce20a738470c2d5e31e7b2af18ecad78a11911da87f64c15629b9390ccb7c98f2d123cb08edf5871734541209c2f61a6d1dd4e188c7520b635e2c7bd143e75aea07f1f11e9c72db183f9cadae7c41b64061c7c66136e8afe475c4511d360ec5bef2e43a6a761b569ea573f717e6217daa25e8f1cd6c1065ea6aff4eb702ab685e562f51f35957124713183de74205deaedc7497400d59ad0f511758afd0990ef88701ee33e8275a7ba27b11b7de4fd8ddda2fdccd25d56cbff84a06455ecc1760e921727da8b3823c94137e87d7ac8f8438ca5d509fecd1c88769e7974ee729634daddb74e4ab2c62b4f99ee5868b07c3756a6577"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (754, '{"ob": ["15151515f6eedbb2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8539eb566dde2412abc82fad7ec83590839a96cdaf93e65e2adfba6783661b4d5a5c1100a61b28d056ec88fbedc7e5e47e93b3b791d56428a247f2e2a8bfdab72ff024ae650e262b501b41065414eb347e3720a28788c0c805f9ed68cbbc5b4064da6eae3ec8d748cbf7773e7bfcc7aeca5e5006695c40db484c3b7c59f614f2dc5945004b7133d158bbe027c8391d320fe8df4dfcc8f28fac00ea758f72e548a2b358906317177eebf31ae3bd3d29820e62cf7c51ea97a27a4c5173c1f7cf68e3a28b1b205018073eecd09f567a99532b26093092ab06d760a3198fb98dda725d6aa5fca6848413e768a26dc7976d707e2c2e2bd0750f7f32dd5369b14ceb465fccc365546ab605417a6db3b4e7aa50dfdbe84369eb10e945122875bd385f68c7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (755, '{"ob": ["15151515f6eedb9f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d853ce91af62fc701020c8ad692087b8eb91eeec6b1cc5d73f0deda01e901ad1ca3db078ac0e45b172ffba988171a38c9fd4e7d6a4d70ef16ffc2e803a374efbdbabc0f24ca1a6ccd6d973a2b88695c52948a86d2dfb4d4bfa9ee189abee6548b32355989467a4d8b0a302ddea1970fc23281fcb45d40d9ea39e8a9116053ffdc729fb23365db671c957f23405d2e02c661b33385100f12616c06b622e156dac0d85ed29d15826649ba297fc5daddf3c92b5452e99a40fca868dedcb77122502f4760f26c2773d28065d043b406a643625922970bf2e72bdf2b0ab5bb310a88720422a25dcbcf1437231cddf22c38bd0bb238320287132e51462822aac14e1c8239618c1508d6849dd20697a684ac94ea3b60b771d61a4267e439642a35b50e1c55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (756, '{"ob": ["15151515f6eedb6f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d858f7f8fa07dea42963afbba2446b87c3a7b2e3cbcfdd21e2fbf62fa969ce332f6eb20762f713da462804f9b130d079522c691799afb7440f92aca504ce49f9adbbe4f3e89355fe885b4e7dc203d56b28995256cce5fedc26e671d460936f22b448b5ed9438584a14f95b4beb6cda139bb1978e6c66894227ddb828aa4e4928f54cde690350cd04a8a5c19c842914050ead42d3ea56b5fdf6127d232378ecd7a37fc16b1d32daa5efc5aa96fe47dda94b90d81a1837dbaaa9eba01c4344502d2b050a725d0d1ae8d7e13bd7ff6acc6cdae7ab6c80225abc5b8ac93eaea5006dfdb1957ab17e8bd77d9a39d9ee3727b6399759ebd45fea044ae8602622841aab972eebd2ff412ca6be3a68d7b9a713dbb7efce78a51037c70baa20541ce66ef23ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (757, '{"ob": ["15151515f6eedbdb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c1afe866727c7a8ff07597894d91d669b51cc2d2918e23d934ce71e4b15d1aac91efaab9c6354d17ba6a5a59d9629920358debb3c0d2ef5d9979397cd05e7ca09f37a4b4c200e8324375a459bd682979cfbf1b099340b269dc36d3ab8aa42f05747008fee99bbaa9c0bbf485153e3ba11315ff358f7881abd4c45b2215bb134b9e45fbaea53543b76613c5c00e5098414d17e423d61eb68a45d6de53a406ef9d5109eda9a4a788fc03372fd618d0dabcf93e4ae4ee336f1d4bdb95a011d8abdfd8fd96988678a109caf4f92f0d94b781ca1bf26919624d4eb75802253e251a6af3eb927cb4974dadb7afe800fed66ceb4cea2ce4fc66c36fe2d67ddfcd593a92d89954b8f61c6afea0a8942d57c34687b61ffff671f2668611477b2c7b6a79fa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (758, '{"ob": ["15151515f6eedbbf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85e1c23c7c3167d00cbb07112a24e67ab01f0f9cce20e6ceac9dc01cb93b6cbc1c4c0869df92ddd7f991b82fd5368b304fe4ca73146e69c5903372e70bf12eb0ccc23f8cdc1ad55099b6a80287ee5ec8916bd9f38730a3b3b3504aa56eea209ee376ddf70c880b413f44e8db62867114b8c7e00728e402058a591be16229c3a9a7ccfd5a90b21fadfa4ff99510eec4cca224d81498eb01dee9b4db2898d76479be522910305e18ebac3e69762ac442357b4fd265d45e02ff6996d289492f1c52999654a5d163459d49490d771bcea6bca64a1e87c7d6977f98353c8fd0c104dc7a263a12ffbeaa2005cfbfb7e4f12156fef5d25102554afc4554351cf91c9fea5bc8549278aff35448428a0e3b51414d73ee1cc341eee357934514ed3bb935ad81"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (759, '{"ob": ["15151515f6eedbf8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d851bdb46281b6ae971d5d281f8914fc232ad408e063b1e61e41987a44f74221e95ecf0e7f8ff6c2969a84c6e9adb00ebb32b586f44a6db9489169916576d3bfe64feea7c0542b9efb898d399efe15a4e47a4b6a4578fc012f90f8efa5e07ab9a437419bd50bd0a04e648674f5f4f43e0d18dc290646e1a6b6fdfee0865e779a52f4e47799542e44e7bf1978fe1c4eeff347c0486040052edb2cf3d555b6b992f96cbc04d0169848f876190db2cac8170f2e1706287fd86ba372670e1a3e60ec43e34a7957ca90dff9ed1c968477ca09426a21b5d3200bfa451799c9d371b22322417c5d03c3b3f57411a29a57a9ddc7268cd207a8457433cee5497c9d3910d5b6f7ef70e9fbc9b020e74e9676f12dbe8785bb371ebf2d98b76295605e39328979f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (760, '{"ob": ["15151515f6eedbc7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d850db9124de250409c6915392257f93fdff084ab3d3100a4078744f2ce4d75150e972154bbdea686ad45fa13d6558f516f7def026ebe4b3ea4374297ed5f1e1dce04ec7339500fba84596374fc3ff46b8bd6cab10e0a390acdd00b2c67820efc4dd79498d0c1eb46fdcdcb1183ae38e37af257cd011ec51bb9fea13f4d091ea62fbf7b7db4708bf64139c36a14099bdbc08447644007eb352bb459dd62cb27805876625761d8dbfc2f794c3d7193d08150f7f095238c39672f5e292f71f38f74580394e0caef0067aecc291b5ff60b8394d17b401151464f9228c3672f5b1e7f1b326d3a2fe1522a2a784b266346be2d925765f992ef1814b2b38f0f25366836b8cd0885fe629aa5b0aeec0908acab6d1c0da1d61c41e64f310cc088fbfdf6cf46"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (761, '{"ob": ["15151515f6eedbca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d852e1e64124f20c104e6c5baa3a6c0d1205f1b2331e12e9ad761c468b341b4b67e6cd50613bc8902551c178042a0c935fe0993c32673d4fcdfa1732f8c33cc4e8c4e33ff7842b980a0b9a57dfd70eb6dc1390d724addd96d95e54760a71a57deec292e530af38632c21a5d7ba47b247116d4be1025f4e3ff8563f239f37da5a88ea4743c3464cf302596efa3e56507849188eaebe8d3e08a0751ed2acc914142ef166a4922d6a7b0a9cbec09ec628b9b85a2c957a7aae4cce5e68258b63f62391bbdc65b19702c6ef63d490b9280ddb156f3f3899148859120158d592e0dc90656d5ac27695845076b31b124900f48bfb61e5fed0d2be1945004152c2a886f71e203aee28add30a84ed524ca1cdd8e110707a9bec5710cd34a4a2538e594f41818"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (762, '{"ob": ["15151515f6eedba5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85c28daa319b128de55a48757605381fe9649a96c53d125303e5ccaae0edb66a70b2505c49cc187975c04a75925f96d296f1a91fd62316c846aff0b77adae7ae20f2dba045cf42aa2afd360ae04895b5f2d672e08d24778b9ed34b2296a66861ec747309861c9dfea98186ef7c3a834100eb4720f77953c248ba7a3f26df3c93d8d2e2c6f5f7bd1d7d70be0252b0728e8c3b120594e4440fed345784517c3b16af2c3bbca4dd15bdddd529bbeda94f020533e51ef2c8cff7d9df2c1a04d6e879e7b5951e7d4e95c30a9fc408a0a589354d85edc7a24efc903d2799a03f06bbb969c65b6dfecd3ebff0887c21d7fc5f45faddcffbd7d24cc1ff5349d8a02888cc5f042c125511c910d1a6862d0efd3999fbeb7b892856d313ab5320124c7c148dca"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (763, '{"ob": ["15151515f6eedbe7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d859f3216f5a869aa0c1f8b18fac499deacd71fc60b9bffec603d3f3e04942409bd3b15090f06fb41547bc44ef54ff98fae32caf041676478cff23dcff10d47a0afb9d18b2be03b2c25a6fce01532685f323088a06d9cd32b2183d4280d5789bffb553b6b920ae1e46c02f9dbd094d8907f6e6dacb59cdf744181bacc60cadb35cf1228d1abdec11bd125496c847fa68c35d531e5827ffcaf0f3b43d6ca8164a10eb94bcc2a2afce7ce39d07ca4446a40ecd97568f0d43ff47ab354b2a4d0d971c70ff60749e2448e21612bedccecaa21a85b72ecfa0b1bc607057d47960dd180b35d02083400e7335df28b7e15b8696f663021117ca1b9ce27903b94bc827578ccfef8ad3456f2b20c5303793b4b9c9caf9044afa0b2b672aa6eeeadd0659dc614"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (764, '{"ob": ["15151515f6eedb1d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85d585b415481b38d5b65849c40861ba0f9260e815c52748222f417e45d61f7e39e5f240116b7e7f26073d7cc59a2bd23311d78def153eb43fb7393b8a2824ab4c72b76b8273a29eae1b62dae4855c54dbc811d6443458f6adcc71c81407f6f6d67a249fdb864e8794bc5b5d5b4443ed534662d2d0dc7283f2ac0946fda0ba0356c5aa912566db98b3391d6c8fefb8c9712e2ab24dd092b468d4fdd6b2ce4e412de0fe99cb23bc74ed7243bd4a1d2793add6824740207d53e209e9203906d98edb647175e2d94cdefa44d486a7905878e85c91817b50c714c32691519a07b64239167fadc357f600f5ed3bede92baadbca0691a8b6d9970330b9e18930b92cef8c1d849a32c7322daced537913f5a3c968afeb434caff926b50c425f43c0284d28"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (765, '{"ob": ["15151515f6eedb17892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85ab5ca28ef06196d3d9a787a4ebdc1ff6a3680c033d8d101935ae149e857e69e3792d4af14177b1aedf90677b7b2630557f13312800295051e38d665bd5d5c0f74a6f8d555a6f8ccff0596b148204c2c9a3f8797bf19e8e9ac7327064547abd0c5cb88bb96382294c7105e58977691489337d31366fdef151349abe7a82fe3ad3dc1f566cb4541e4fd573e80c5a267129fb9a47ce76e83d91087d6b222317b26d40d38639673806b830ca746b6d3299d501c2ddf80955f3a1a80965dfd77344944a710824619fde89650f93d6967817c2ac295c23c03bcb96434b011cbe2d8729ae19b1df0aeade07599325b3c540823c10a8c7339f40f77511880879bae7a4267180554abd25dbba105c817c3d6dcaad2bb9d3db532a8cb33b51e4a80a09669c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (766, '{"ob": ["15151515f6eedb33892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d8589ab5cc639e08c4cc8a9746ad80bb8e011d8dde752762f3c1a569bc63d58a1f37027874c7e255f96840b32d8ef6c60ab00800cf544de666a95c310a3f5cea62b9e69276c0e045049f275d7e1b155a3e27aefe14589162adec84b44b28627e20599d200f3e14ac9ddfdde3d310e4e0c2a079f729fe490ed4746364fc298248a88e3870d7f9b6dcc434142e42a8eecd5eba92a3168d44d28f89dffaaf28dee5033c5777accf6374a3e01b978e30e784dfc03cdda6a4f98b1e511377f54a7fe1dfd9b78036f7c74319b6439efb1781f5dc453b1ef4722475c959f372758bbd2867a5be87f365bb8a66d510aac4e6eb901d24ee25f7325f027e5d066d9ee25ec94a68ce2d2b487fc5c0fce30ce6ba62372a280c99c74da21a4417d3f2578f61de874"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (767, '{"ob": ["15151515f6eedbd7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f56293895f49c0722e1457b80b7001d85302c56a4b53ecdf02452b39dab5921d0a7bfa75431f5ea2757f60533b8fa71246f603b6fd967a47da441c8cef828b7853e4cfaefebd28edcb8a440dfb384379d8c486e2c6c7f7b046e0c1bd6792b023e2a43b1bfceab172c9131b26a773974f23ee39a42c7ed302a447375831c6046e0f9c2b7f918833436424e373416b0d93e2f9778c61d2ea0b65eb79849f68909daa79793d9904903926d8d73d570233387851052191b8e507923402af80ad7f8a5933d6a3bb1d027c5652d4935fcc082bdfb9947881a11d9c738feae0f07f88d842ef72d6b8ec7df5f2337567cbe43d91731016cc4c29fd4531742b6fbfc8e29c5b933e7e62098e1cb27d9fb5ba770ae025026000f780272ecf94a9cbdb71d63d55467003065214f6e93c3d8c2804b2535"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (768, '{"ob": ["15151515f6ee4482892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135847a728d5b88b829684f0356e3299677d2576d2c5e3d6c40d5882ca39d7e984f5c5500d2e2ed9006a1c9fcdc28e7554842efb05d2b70a6df067c54fbb833489a08554a1a54895fbd2a709cebf9f0a21fb028fd61df2daadfaac323941fa6fe4f080d2caa502fbbc0ece33159a958a3339a464971350db7a73703fd0ca418c835791f170357d0399de38f22f8df706ea5f43a2adbea5b948d11444e0d1b8e8037dea4f0227e3c6db809cbe2f48a6f32996e6d3bc13c1f4cdbf4805d414a8c595d7dbadd76315e2ed9463e575ccb3b52b120729e9cdf3d8e2f6ac008e2bf656666c5a3065b101de88be3e8dee47c5821152d6cd078f5174b8e65bd03a77053e60cdb78e08ad220904674f57d633124d984e30a6dffa7745d685e71612c6b0541520"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (769, '{"ob": ["15151515f6ee448e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135876b323c164ef4db0b8cbac77b391383792cc0cf0d35a3e49967887a0560020e8f1b0edb20b6518e579a79cd3ebfa734f888416d06a35e7a725730b5cd8c56973df5e41bd100f5b30e2199410cd283bc7d6679b79f64d68bd8c312f70a48ec1c89e791dab1d337274f322fb542cf2fcd1dea7cbb90a9b3e093607c0e8b492c2ac73e0c0c40bc069f6736993182d3ecd924e36145da4424813f00a4316d8a74684a4e490cc13b74fecc1dc9eb18561b54676d4264b68a16eb8d31b7d79a3896f1451b25017990de8efb713eff162ee6792f78363311093be8296622a68de03fc91aa599471dda1bfd7840770804f953f9344fb811468332e514ecd9a5bab7a01233360db2489ce179ec418382e700722d0f626eac5543248b4a249369270387f2d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (770, '{"ob": ["15151515f6ee4462892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589957a329ada278b57c965043fb211a97194b758036f141994feb94ca4567fa94c28082af74afd637b818c86484ef01b0fdb4e48369dea36c6e75de19a0cf04e88e44184b86ff670599d5bd77fd17f72b8707123f48d58aed7bdb1defbbda61e0ce2aef5c7bba851f8815d5c6c3eacc863bb7e0c54ec7cbbf7d94b11e72078d43ebcf4604d931e91465fe8dfea6a055e541c3140db74d761213a8458e6e507f21f59f4502344d7d952df5db7cea563411d6591898544f2eab7544a1b0607be0e117ec03b5a7028ccfa3cae73fa79496c9c9045c54fdeaaf60953c8da2f2f894099e0afde5962b316b187436a3d38f9fd831e0417af232113ebd6a75689574907aecb0d02f562a33bc27edfd7dd34ba724ff3f2af42a9ef65ccf04551cd4bfdb71"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (771, '{"ob": ["15151515f6ee44b1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b9d6ac02cab42990b5883d3c67bc3ef4a5ab59906cebe45af783768ec3018350472961c7eee7db65f0da2592ab4094fe1269eb16cc8141ec9c4405346226675c62e103feafd8e32ab0cc9ed8dd978206449b95db32ac30bd868f6ade69013e5d4ca8f4137366935f98372e79e3b8dde18e3aa05c0b9fb9da7df4c6fd6ed4297a9cef752ac5aefdd3e2e2032e5591db43734d73af10e425dc895544dc05312747e51e9fac10b9049c1548f3d6dbabf58e2b06e1d55ea2476c8389e9a6930ec2bc185fbcf6be70956309e4852091e3cfca7b5e9d7ec6f41f3e1031b1eeafe009caa5a1426baeeea22d5a9873718a6a1397e1c3fb28458e706f2f7f7ff1df353c4ed5686efeeeffd8c8bfe60b6c4b81787a145854a71cbcb311187dc27d678d23e9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (772, '{"ob": ["15151515f6ee4490892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583712599d47e10ce4dd6f64295b09c51a15ed4245f9418ffc0b132fed55a26121a82b9c2cf197f85b217d1ab78baa82d12e09233f96d9cd7f315056913dcfa311b3f6735a1fda1c4887ce7af567d46a4067274e1aa7f5c87d5965fb89825dff43c1b0f43c7f09049fcec37e74791845c48e1905f5a8d95b471e4a8426cb5951b2a84598930f880fcbfa7fb4ed4ad027efd3a7be49c8a69db8cea7226d6e53ba95d2adc3d5d3fd65d28f0255cf96c9ad0c8abce4d21cdad2dff286f4b6e127e6c226e81cbcf7e97dd9015eb66d5ce14782cd08db6b64789fdea5946a84b5d0daeb9516e749e0a6c876594179f93b028b66692653800fe7d372c6d606c00b65835eace7a6f5739e62de89e79e4682e9bb7eef8ee824a2e1678872c44296f1d06ea7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (773, '{"ob": ["15151515f6ee44c0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589e03964aa139365d346d3ca8925759198072cccae5e2a802cb59dbbce58eda4265b369421c560f4e2283ea9d6cdaff7ecc0fb8e35f2027037de999ea35670430690a34dc40556aded3d37a045e2a58414d5466c5474cf1773304e84d898f3c0c6672fe28004279264ebe460b24ec864772eff063ae703d998d137307a553c859533757081a7578be611581c2f656fc1c59f0021897b9bfb9deab91ee0d77154582c6ebaf82ac550faece1d4ac82a9e93a22df821107d6a7e185b353006642bef023e37e12c182dd5f575c1e1537cdfa6c19722654409cf0aefe0dbb40ac681fb7828a76147be19803f5548ed3baf87eaacf2dbcc1e3c236af604bdcff8e7e4c1278231a470259012376316a3c4b937580a2e4791d2e0942903133c0391b890d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (774, '{"ob": ["15151515f6ee44a7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358afc875231b8d751b07e0b7fab5624cb823fb538d021cadf283e06fe6272a0c25c0c57567f0dea06541b545bbdd86603ae0be4af4cfb13ce97f6e5b47527a394dd5ef9a3bced6c4ce606fa80681ac71172d111c2f2d53c6f821e360a0a1e9ad95d87afbb16e77d96e3665e8cd65f81b0e56d249eaba1fae2eeba35118fb76c729d0e06f004a8f957afb36bb74195fd393c7eea73435ef95218a4255211632fae14c3ccc2f187babe8ab3b7744395cc474aa6f4ac86066ffe75b95b281dafc7b4aac703550fa68afb018937f0dc0d384b0d832d551fd8a773de2f15b7eebd2e67f29166a1a7b69d64d1bf6533dd9337525734198ef3035180a6dbff4a2859162d20985bd93aaf9c912be5c90236c3142b08bf5e3bc874cedaa5bec3068fbf9c0d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (775, '{"ob": ["15151515f6ee447d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f2ac8f22ece25646a8b5c04e10447e19ac4b262ec1c67d847483708f46e3c8b3b3b2b9e516b8a4dfa7caa2f682e3e579f1b76a5ff3c209fb644c82f6efe7277bf2274246a303bd9626e8401c8b8c44bfbc26e30b571adee24ac57423ed6ae8b9559dc2e06bb1929db6447231fa076b5fa9e8099d14bd1b07ca8f9e2137ffecb06564d17f3c2063d8e7d7cf2f2cbb1e3cce89b90cb9dc337c0640db8336d862680fc77c0e764a63d42b6011eaa20b67c082fd6fd94e950959cf8b6da11b7f44b88ac5dd9a905ceaf32810f9cf249bd711a8331e03097cb52b14ebc15f5804dfb96d734a40d8f6723b8cd10d8b233658717fa7813328a4ae5357f7b46d313dba3e456e6aa07030d93fbba095a9b8d67c0f516fe873826e5dd3ba373077378a6b23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (776, '{"ob": ["15151515f6ee4487892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587ae3ee18134a0546aa9f00c8a4c316d751a30779cc195eb66fd31536b07e108bfbadf494fbfe9932f9833ce71c215d10b9f928e1a8fb279bc5374f108506e46f91d54bf67b90710ba05ff6ca0352e6a5ce63632c64bf56d7ef64f08d0b464be7d8453e2d454fe940538baee8a50f639213a88bbad4ed05574fd8c88aa0e3b3e61392e82c956eeb2f6284fa8d0582aca5ae35ea14a405e129f5778068c2eefdeab92ee43936bddcd882a7a47fca599e4840b63e98ad9d25af6cab3f0863281261ea92e2963f8c38fadb2e0a81b0373a28b4a573878cc6a0c5892b12e16aee37081001a808c39a7e1ed855762f37b6fa74d13859c8792b64a28cac07e471a38a8ba65be3239c289bcf793686e554f42e0d67e5ef81f593bece5753b73954bd4cd1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (777, '{"ob": ["15151515f6ee44fa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e856a244da3b33c568663465aeba9ef0e5a983dcbb4af2562140079f3913def0a02b8a23562b1d3f22e1993a706a5d4b16ce1830ba561c8aac577ad3a9bab4ea20ada388c8c8e0ff0693625917675ab29f65c5a04c9f843e18e9211ddcc5478f0cfc42e3d1d52854b085b04caae9c47f823f418fe306b3c7983873feadb0132a8313df255a657b33f45a7da12d1bb36b3e69ed8e373efb462a14d7bb31e7808974d8cad14726fd28bdc39fd187de72e5f88a172c02965983f0809cd9c33cbc810e2b9387925b40350c3dbd42b3cd432c38dfbcc73bee5ca64234844500ec99f8c99e8776e1a4f521b35f84f35609db9641d2ffdc878228d5519f339aef5af19a2b784509ea0a720a25066905c09dec41cc6ad36a9fd6226edc6eae75f5fd2e3f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (778, '{"ob": ["15151515f6ee4460892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b259fbde5b59e32ff5a1dadc257dcf2568929bfc2767c79277434a7022272e6aa40e1b00b9bcc1e06fd0fdcac3d705c592df1cb079785f0007be42d5a737810d906a3d540e65f940b12d3f017e74216d82133066b5b119249ee9a29d4856f45175de8b5acf41ac74666f83db92a4e300a6a0ddbe1f7cb41ebe61b27f56f562aa2ff9b2e84a4de46eb8a425312a5672c1c3d60fb7ff242f420f91f9b767c818785906ad9657a31040fcf88f89d35b5395f3802a76f75d1ecb2842a3575e2bcfb61946a0218a7e9d231df12e0622160c5d5761901dca02a187b30b1f6e619bddc671d599e05f5415d988130f008bf94a120593d796949514bab331c734f37d02a5b03a7748c6e253e1a4d3a99081b7b036f97f70cb991b6c5520bd78baba355aed"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (779, '{"ob": ["15151515f6ee4416892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f5bb2b068a7918717c1672e3182f3e4f33ee373500b899aff9491730a6a4b83832f9a2de12988b4e9209070216200e512d88be04f3543523541ad910f3ce0804b18781fea97c8c1a18245a2adf2a80d3c71473c257078592a60ec2d290748b0c91f061c7b304a08ff40e28e57e67aade67787a866ca790b5890b85acb960b0f328b2f4fb9d75c5e3760ca26d929b089b682c4cfb0bfcee49e834f84226d495ae330b9929c308da7ca0de0eba734993ddd50ea2814357c1bac8f89684710d7d44959d0c80a43b1caeec38a2bd2a577035183229487e3fe0190586581e6989ee316e1b70c25de34b0fc701cee74c7b9348ba519075b17b4ba0af6d952fa92d611a47d0299084d9a9f294dcba2698c27e750a02ae2f0798c5f183f44fa987863f96"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (780, '{"ob": ["15151515f6ee44b4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358176745a4e90897ce9fcb06a563ff35d44986e0d592dcf939aa2ab402d336e39ae1401328a6557e509eb7f5f7e3a44f4ff43abea1b161246d669d57b894c52ee13a8288704da1b961c961121c936cdee8d645f7e8609af8557ae741449bfb28a73663798e58b4497bf5349eb599bd927740e4569b0373d7fddf5642bf8ac38ae3f33aa38d08c9b2ab80e47d241ac7397d1c9a66e1859f3b7faefb7d91fcf6ee8ee42242633979be07fca60a3eb905b752b8db5f500c58b6f640d7d49bfa27731171325524298988c2ec2d1298bab3142a9bfbdc6c382532a33092067eb16ee1968de80f7b8b57c9f3e88c5722b1e010dae13c94aa5b9de93e485a4ed1e0a7771a9ab5d65d1a43af693fcaf5834937b3f658e0c72998abf4c506915bf69025b5cf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (781, '{"ob": ["15151515f6ee44df892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586c44161c21d301b7bbf5ecaf55caee24a0cb3200524331a8ecaa9c88a059a9a56cf8d1b0dec03badbcf4124ea4bdd7f5023fedf81096c6a2fd6082b0a652aeea707fb5847910393d0637958c9c21c08d7f075a8756c0abb231302fe77868dc6297f449599da74dfd4fcfdbb83bcd0c9c9637065bbc224f6065bacfe7786dbdee11650d1393a20d557ea1da292c44385727e9494f7fd287350a1c3991378f16726457afe89bfd0a25039994c786b637ba58f5d9369957bfeef06f16a112c1d625341eff20b884b7fb543293e1d78ed70ace185d21860372e6aabc7676899aaee60d8326cfc14c91e9979cdee92c63c4ba11ccd7d8a21c317122c7fa32b70f7757ab7e3f262ede595341b847ff763f548825754a479ea6d77190f8a50f9acbe70b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (782, '{"ob": ["15151515f6ee4408892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135843aa9ead5e37b34db03e0dabd184fdb9a7bad0e5d83bd7cc59fe6af8f80d4e60d012aeb9b0b29739b249dfbc20f90e48df81c53f3ae287081dc4352638039a2a9965d9d33fbd50be63772d7550b7d1dfbd3d3030afb208a3124f60b1b66db5615759f47e8b09887ac99bcae31da3ada460b67ea2795175261b1eaef85d6901d8f297d986696223717b89a6eaf00937dc43ca12535ee3110dd8d2ec152f05138c220163e834ddee3339ce60af88372c43184ba368b8ec18b6cffe0f165d4713d1e69e141dcd044da1dad9def13f0a97d6c16e3f9907362badfcd3d5c926c601bc31a9336e1aa103e8fee8d5017b7f538a022774220c552565a823cda83da487e687016662cd781969a4c480e2091face55086357e0b09ca85cccd8cf87ba35928"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (783, '{"ob": ["15151515f6ee44f9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a3ea059b3154ebf87f30eab3802ebc27fb05bdf7ff7b2e086a73c6544221092faf3b6513ed252bf98984cf56b38131a04f8d97a2378a5d070efb1c5cfd41ea02591b141fc0f7cb89c834bca3e21154ef9c7cd896305a34f2bdebd527ceda15c968beaaa2adab2f71d53ccc09f301ec6d5c561e5c5c36174e0b9b9bc207fabb1385548982362394b1e0d0a11be9911246b16cd6b0aea8fda1c88fce8fb3e515b98dc34ba0bef1a5853f7891269b3c0de73cb81560a3c11af5d5a21118b3914ba8d5a4126d8e7faa2e6b6e93a82634f97fd34cdb50bc549f28345cc52c935a895193724ec166dc11bf4f274a0f3b8403212fe8d3a9e1aa61f7294368947c39f080b045b192a03ec4810d555ad49bdbfce826bf613b13f60e897467954d8a50bb3b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (784, '{"ob": ["15151515f6ee4471892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ad3c5470047d13bc5ee3d9e52854ff6b30c1d50f26698fa28a7ea741c5e0fa7b02dbc003f8e25c45e240ad09c01f0e4a455fd4ca2177a6833412003f43e8b17a2d7db57ce3f65763a1db509001b1d8242516b4a764d9ed86a3b905d011f5b6bd3871e801b429b447b4718750dad745271354452b7dc65988a003c9adc97eaebc03ba8983bee1c70fc913b88388a50b7b31e49bc696705ed86e647ec424f79a3366c9f9669b7d7542e2da26fe4ee5f35c5e8df4d8bb37712d7ce36029cc1a6608567ca3ae6d5b876f2f2ddb8eb01e3df26e9c465faf80b80c986d5e7a09a449841a04cedd0a3d5ee410f30b02b242518b7eb0b2d55dc1a2d761402b1b1e8d17426e08f12ee4770345136330a2d1366264b95e32245375e6b8bb9968a94c71cdfb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (785, '{"ob": ["15151515f6ee4409892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b1862a6513410390b8686f97223c9a2663f477a516e66955c4c2a99e853eaaca52664af9c3731519f96820c3b8cbc0f993e5225d1202e0e0a3cc6e636fe6012d8560abc63118165f2a7e49ba9e3f3ad5d688bc477bcf61c9dfda3c7a7cf3283892cf484099aeaef441fb068aba39d1c7ca7f91beeefe090b8ac66b2c04210e6c1807369e4b6ce1c64ef7e62db2145d66afc688ae3d5896eccdc6c20fd8f1c557b01ee4030118c11765c31079805d0c349f35b52f29390dcfdaa1bd5e35e2047116b7c0568f46e1168e64803a9c9cb21b36da16009ec580df948981c0d930c5f58682712cfce0535a57d09091dd75127bca23894440f52571862c35763966ff8837d9ebd7adff32c0c6f69f23bf06ce0b68cbbf56e1222cd2ed5639f6ffad344d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (786, '{"ob": ["15151515f6ee4412892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e4fe1479676921549594b94cb1f9dbfbfbfc7ce990f706624c7c7a4f3b7f31e9ece3c905aeddee30e2331622dd22e8ba7c7d93dd3d2e48e0130488d0b1bc4f12e681025e5362a6439117315d393a5d4e7e7f4800fd8d4a1d05a25a2ca95158b0a241e99fe320ac704f2b563077f12ebc4700573537ad725b15a76af00a71e8137eada1834f13da04dfe58f829e2475760b5405b6765326ed366966fcfb83f0979c110805eb1a67fa133d75a3780601db77afe20bb20380d5484a59f6d855d94b9259e8b578ab532946df2afe496374f6e22fd3f3ebb740ca9ca2171f1618dde526f1f04dcf586f782acf61c80ce46cee94aeea12c70ede008fc57171b1eecd3b22ae17505441c055b8ec8a03e04bcc38553f370070c417915acfa27d34fda8dc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (787, '{"ob": ["15151515f6ee44ef892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586e8e236e54614b0167f598c707fa63b27350bb068060f68ad80bd0fb106632a1b43380aae958c43df9d9b3851b8ed6c347491d1f6bba490cbd1527a57bedbb50f4f499423bbc066ece7cb1caebbcbba2623d17aff07994437020132ba0007d47c1ddea6c7c6e50dfe8af6d90d43b300fe89a1e1b605c750252a3518b7055bea0d2e51c6d9cd9697610d1f469bcdd79e9ad61df220e304861da859f801378282bf37a9eee78c89a809d35d63e7ccaffe48d51260c9cfcce3bf99e1e587e1d2c6d3d2f8c3405ed1c8876600866c6fd5e2116b84ee9432af03b8460f13864b190f2db91dda36294701240d2a181d9f2e2a2d3c3581fd7a323a8df9b102b069f3101adfabd1710a02d29d847274883ac07930ab60093925007801f9a00d44ed61b0f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (788, '{"ob": ["15151515f6ee4401892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589aff892206cc685f31db4b2c751ea361b21dcaeca89c9a295f922c8a9bafe7ac88ed2fb605b54a8c057d4f21dfd6e08480cae629ba91c85e306f8978fb769d880c80ffd4f70acd9645d21fa3468ff24fd2a8f0faeb51471c84716389b3e930df710cf08cc3b2079d4a4368b95057e37c97143a70d19b0b4a462a26bf5350dff81db897ce6f0b3a4a18727d8653a456824feb6f73a6f5ce5230facec90caaa02f52fd6e737498e2cee3f78d345b7b1e73fbaada247ae1994ebb439d60d73038677dfd12caca0b94a82a4eb4f21636dffa20a77242d3d8b56b2503ec1e335d1a580c61d64d9bb9ad6db3a00e47b461067708b364450c21881d0200f8f297148207100d6d8fcb412357db060dee67292c2c7ca400c10f911156d3ad734feb731c44"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (789, '{"ob": ["15151515f6ee44b7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a8a676060c4ae79deb0e06c0111f2a33758674a1e12703fbfe5e9c6a675af59ee93245791132c92cf501fc6ffa9c2540437efb0fc41f5d8ee147e54ea68b65ed88c7ccac83780d69d4fab117d7083c83ac128b362b7303f4fdcef4f91c10f2842a0d8bcef664abc04f139e2813662414f154add0e49736f72ca4d4359d3cd2b4bb9343b94d32740bbf3dc9fd03f192f2d1f29d4f98f90a22b0d939bb2daa1fa0f13d3073e5dddbe911c217afb9ebc27083956402cb7b905839fbbad561f7b06aafd5f3ab2ce5ba0d71e79098efd8b609a90ff340b412314af92222f15fefd0667a69c40770dcf463a778f24dc78edbc89c6a07992bd2711b7ab9ba2241fac72525dbb7e20b665a02a36cab172dd9f65fc309c38533c319e09beace17e617c862"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (790, '{"ob": ["15151515f6ee44e1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135884a4132e69d007ed567c6665c797743631b7c0efa74f6eeb2478ec667993f9b01f47eeb6dc0db608691addd9caae39844b50d8eb4bbd9616b3f196a200b0efec471554eb9e4f364c6db9de88364f6d52cebffcd41c356c3dd461759a6337ba4e11feb0fb6c1f4ea28ff60ed8e99ef7faeee78efa2cfb4297d799d7faa86d1787ecde1db1e5fe963d1f94f847b48f378b8ab0c41a8b0a2c05779467351e09ce82a7a847aab4cb85e07af940d2f0b25c45554a4fcd7d1cf544dffdc9c67e8822bab36ed7653f56d71d67ce7f2d036b2d8462a84634a2ba1867e83725469341cb8cd69e8e2ec52d8d3248f18537828fc14e476098cc64069f93b02e127af5edb0b04579f7046b8e4f9ab816ab53f62cfc47ed90a779fdd6543cc3e31c7657d1c264"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (791, '{"ob": ["15151515f6ee44f6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586a06c7a16432b005a310840921bd2757b8b84fc78270ad0bbfc5dfc13981ec66f46a97d9c067f8da9ec3e285968ba995375f68d3179d6eea08b3e122e292df34a7c0abb43448ca0cf44dc641e7e2c6715c2257a44a06cae6d6b2e37fa334c9d1ba77b4eae71797bfba7034ca0d822cb8bebb44eec8626459ad602c2395514ab727aacc64ab1f5bab4645964a65a692ffd4891c632ef6031d6417a9b34118fea9cec9a53cc3f88a0ac60efaf50aca2c07c20a43308686b3c4fab66c52cc0d9640011ebea008516151710488f3d51cf0f54ef006389c7cd92ee21d0c387c04db86903aa62ca1cfef6a6cf73ad7e063582c36abcbd6dd65218d1304de1e85ccde196e77ea1b4ce5bd1458fbe5e6e7eaec74b32db8d98ea0994485333a4b32e2d824"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (792, '{"ob": ["15151515f6ee44b2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135864122d9f35a129f9cb5bf9a6d45237d218bb997e2508ae43c5dde4e313c0b27387829db96f3213f3affec564596e21f3622800e4ea3da0f6172511a4fa35dd28ac8c55fd5c6441bf426375516e04de984f7b2dbcc4f4ef2dcf5f60660a0e573726df9eb426970adb4667cd761cc278fe4847025bb41c9170e74d67ca5dc7efa4dab6de96ab8f5547fd094d6caaab1416ba6f6f33cacf84c8aa60d881d29762759472272b74090331693e74c56e0ad4ff13d5df087341efb35e92a5817c5fc99efd613264273a837eff1271b14f63dc337113d6eb1c2b50ee1cf2deb33bb5d360135b90d76da2efe12f154fa873bd13bcdacdf90448c6733809ef6017983076dcd0d0b2377a5555a4756b746156342b845404cd226123d25cb4bf1a926be0f4ff"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (793, '{"ob": ["15151515f6ee4440892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584ef2b20d718dc803b17fb98823f32a8481439536b307e670259ef1854f08b48104b0aac9066880cbfb99b4af22fa1707874508741bbd238c8ec01b74f80d19bf55ea24ba4fdce0f53af1c7401a99ef4d1c351b832f5ceffcb2154cde61cf7d3c0c60e64ed8084a048d4f3b32eae0ba05804b83bb95dbfd6da681ffe6734bb99335f0bd146718ece978570deab9b60707e78a5fbaa2b69c0e12a47e9abc23d3feabf1a6431cb358ea43c3fa42fa195f21df171d1676f910cae43c7cb0f005775ec625dfba2f08a106380cb2b27c0ed01f893cf912ea10deed5e5e69df2fb6a330c8fb446de86ba7c68edde316fb3f23b37bbc129feaa41c56fbbfcaeab4d29784a1f2e5f8448f2e446df537efcbbf80af7d28db6af928dd3e94d4f6792c964eda"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (794, '{"ob": ["15151515f6ee4476892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135860ef6327d72bcb579313b51abd0237bed9bac560e576c1bae8a8745a34a1ca0970f1e3f01186f0da584ffc0bd833e08b4be08173ca47bcb7b1430545fd7c786c8c1a6e7efc7b43a7f777b62f82e5450a176c8d028a83632ddca6fbb2f6135a5613885a0a345ce15f7d4166d2a7848590229321ff35c924ebb4156451a8c5e33bd1ef967c9faf9d6e88680c2bb0d7d5cb37172a2bf91f36da06d4c9ef48d64386b96e4eb9457ff7d4753f803c7b87f74f0a8919308a3bf9283aea480e74f132d233e0d32c7a44813e2bcda1f0399cbb9e4e1e2e05cc66c8421121e573cd7689ac9cc9aa428995fb117690555e0469bb8ba1cac884ce1bfa38feb78dc9f8aa89e4f6ae5065cd7acbc1e7708b802f2f6a2b32476771246c7ba57bbcb8a6f0dd6948"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (795, '{"ob": ["15151515f6ee4425892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135857deb5047c6d4e018fcc34ddba9ac5ee48e0045ea3c0d655082121c511ed30f0a7cbe0c26bb1fd862f576249ce036a7124681b27a5f78b4fd2ceb4cc9925f279fbcd5910ec5ab3bacd5e61232467fa112dc0ef74c1d01bdd1abc1729ba4c0683e8c876fe85e558a63f2dd48ca2df8102f30664794e8459a83675c99c79d5cbda6348525687ccb5836711e053ff9f8a52b046f18c347d6d57927bb4658dd232740c134f578d68153273e2ff6fc060f2f6ec6bdad1e66300c3632e9e1636894433c2145e698031930800bca4b0e5a6eeb087ea3502144e46c0017a01d550a1c66d12a91c2f359589fea349a1cb4e1260d5bae2aa05a3c81cab6e9f55c54621aadeee032c0e7542b92ab63425d27b8ea70aa999e10e52ba60d4c8bb667ad724e6c8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (796, '{"ob": ["15151515f6ee4453892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358bb5f5ac13a0a115e0b70b65bf131b02b75fe758e34df0552be4f5f8a9670ea5bcaae9cccc830afe89b26f81b144f95a63acd83da1d7560e8cdc8b3a710336a5847bc96d475eec523f772e0b5b86475bad28008948916b0e9428b10b95e0f799da1ac0824fcd0582ff1265b5d5a4e2910cea1a1e50bd1ecad10dbb918c43a1fb4f8df9fa47e9d522bf7b721f05a0986a02eca7f795cb14fa776e9826e761708e52f343ce30fff4336554449d8c577f7af48fff17998e58022e716ad1cdbc1d1562744f41a067b8fdee5fd310a4fae2c6414bcd40afddb4aa185c637ab982ef2e4cbcb5dca8d033ca7327ca6370ff4a724505dae7acb1ddc9739489baf21057472db605ac8dc251d3c052d1baada0abd0c4b1bff4d3d438253f3224a7565be3c17"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (797, '{"ob": ["15151515f6ee4413892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135884cb59c8bdf60b8e1c99e3e70c86552a01d188c9b662c0e2db177c4a2bd60af73440dc277ccff947e99ffcaf48541cd3a704ef621f5260a282302b3d2e07ed6fbbf2cf66411e65b373d76bac751f3daa00fdf51e3c400d9fe646f4c985087a90b81cc3572eb2cf6181ca144d155c7818d6fc7c2a08d5da6d5f4404140ead69d75c7828397a45dae69e7636717f23ac0a184f5fc671d0a28fed4b136ef66744071506493c30cede275db6e23bc2afffe7c26393c7cb63534a4f7aaaa5ad9735afa6835a08887e0a759e128bcf202d129719a9c075d507f54ff35264ccea86090c994558308842f0c790646308c213b3c3fba7653ae8931337cfdb1e079c6cf3504ac082948bbbf8a639248ab273b7245a023abe7a5dc1f02268f0d9d833150626"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (798, '{"ob": ["15151515f6ee4405892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135808246be846216d8e1d8c0873e9b60e100baf16deaadb101b57ba0ab4693d5d96765c0c1c407831ecfc90965d0ca0b55334da27b8ffafc0adcad737151e1fce98c9d62027935460b2b63b6a1bc6fd980b15e893f81213630fa01378adb7db9e07262d447ae74b480aebaeca0416739202b1ec10bec299428a3297ed90b0c8b3f5f8f2048d62cd88c0d14eaebaeb2452ade5ff2ea7bb52cb96b581241570d20a2efeaa7efcf5781b3bcf7bee34cc586832e54a9ca16f88043b507dfa5105fa7aa7f0cd1b33d92dafc6f9777136305f17ae784f36257840d6686c0edf21f6e0160c3480e6670bbf47d1d8de42521360948975499a501c95c7ec40a7ad2727f4df12f133249c90d76a2f5862af45e09fff4460a5520a7792deff26ecb187e3bf4fe4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (799, '{"ob": ["15151515f6ee448c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587356e8ca6daf09f8ff7a180f780c43e256f41fc6c011efe530b9eb3fe1d79a3c61885ca84e63244d412d1cc11942aa9d1864064458b84245925231d1b0ff3526b04165951b890ba8565c607b17216628a7581322cb14eb69951bdf3f63bed7badbffecf3e04881bdce1b0f02c9f10614fd9228da405429e524a7b3f57ca92f580644615b611ff34c80fc3d98ecfec769eb453544d64a782173d0a503e2cba8d549b8da123ba70c3cb945e49036530cac8907158e01c02ceb9c668520bed10e449ff12b08cf98dd0b49eca4e2e9bf4e1d3fe9ed73679dc4cf0e3faf942557833b2fec43be1fcb7272f8e46340182376cbb09fb3d16378907bfae78f948771991e64459f5d2b2c0c4dd2ab75888413031ea33d7a515bb7ed7ba1e43f2dd25a68b6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (800, '{"ob": ["15151515f6ee4432892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135840ea17012d4d9ba54687305bba2bffd44584ac9dd17658a23c3538a5dfc025d28118059220aa1f0d8fc86ae306af0acefb28aad05591844e67656eb93258b57a6eeb659e30e9dfb9efb1407d44519feeb97aa5ba8d93bcd0fa32488fb9e837af0667079ab0b25ca46a3955faceb5e903c798428d81a32bb8d2bb4cbde381cd89f8ac89e785e78fa22d697458d8f70bc0148a38a0863cd852da898a8911ebc4e201a192cad9a80dbf05ae6180e297c1df8325683c2b457fbac081ff40727cbdbb0f3109a4eb2deceb16bf5897eaabbbcaee9fff734e6972f8b375e2f7c2d6bfe4e50219e9b7ed33bee72c2098921c459bc19a835f58f3faedcdf9863ad1a3da3fc9a30a067d4d85fe0591267a89dcfa2574b0486db47aa28d86d42059434e625c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (801, '{"ob": ["15151515f6ee4407892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b28f0ca69acffe05e0a1fc3cb1d24e92467ac126c4c82c8efd5318e64220d4057a2e269715b768891ab7c633fdd682395feae015faef46537692e32ee8914a966d249a6545bda621f593dbd819a938e93221f11627088b6faf2b3cecbffc82c7930bc489385e2f2829bdad52d5512f7f3e9f54f4daf44291597ffc0251b9508c3d325dba7b22de042913e9b71a4b79cc0f88de199e4e6cf3edafa0ab4161cf141b628bf5263f1ca01e9ce8dce7ff0ead3d06468a1c792c1d604dba89b3906259a36ca0cb7e1dde06af77fb495259fbb035bb4505e1ffb4b1fe98f922c537bc27d27af92f445494b13e1bda70d0944f80d89913cf89e96a78c5b1ee42ce0e3e8b778f485eb50af09693617ca26427ea117387b6308596de277d45783cfb0b8fcf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (802, '{"ob": ["15151515f6ee44c2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c5d32b1653711f6cfdfdca1c6e5bce5acc144bfd2d42c54b698dfeee258dead3e7e76674de2cbc1cb9e2953c7f74b52bfa64f51a2cfba7e9f7f4e27be838cc29b3a366cd74c99bf8b6819cdee2fb4d15343d04f1d7a8833b481454b12b5f7bbc36c3ede2b1dac8851078f0e4fb0b14fe2d5afd01e383ca950d297d643002d52fe7dba87ec137e3289ba4b05c6dda84535a002948eb854cf8df170da8ea8bad1c5b2d69a4a7d5678677927737f2523073d6b6ad1f54d810d03b22c2f02bf0e5c089fe84f573c191b06441ad85298ed3ea1c7ecb352351830ca8322b2ed1b461e6137ad2973ac0fdee7df3b8a47fe778b8bc3d319685738e64fc50dafce93c3e26ce369fb419a5f4ac8365cede55d4efb7fa8ba9b5095d286a394cf13fbd2f68e6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (803, '{"ob": ["15151515f6ee44ce892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b502998eba48f2b46190071ebc35eefb0c02eb3ddd61fc27d64a97977fcb37663d40c5465e11ba63b2fe9ddcf1678498323267e3f2a28851ede662d9b0efd623cfc1b5e8368b3b32cf8c605e9c5268855788172114e24ec1974d03488519243433bb7eb239f8f4587c2c05e346846d6fc32ee0c55be4210670fdff70a82e22ac55c734cbcf220328fbd5356bd7897ea578664fb79db11a5ffd17d28ca930b1b4231dfb98c2948f4503bb6a4365c863ad806a639e2931f9a0d0c05abae0f3ea05ecbf45b73007979bf7ff5e2726bbae53520d086f6e007178f992467e07afb4eb5bc8a950b9841fc046610fc58fd7947e490a20533608622ba662def11964770a26f15264aad45033e88630d9687f67ec97dbac7a59e527b356fd6696eea4005a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (804, '{"ob": ["15151515f6ee444a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584a1a86245673f52ba7438720fc72d0af81ffd894948514e76f600d6f1bb3bccfb2ef062c74ef0f46d688a7b522e246e2f734e7701930942fa12044813b254ea42768b8ab6fbb73e2b0c72e55ad38667f39a4ffc08875e35f6d8ea24ac9067ae7776cf1e2f142c0087c46d2aebd116035b0babc82bdf047650e9182d454633ceb7edc2ebcd79799c825a025610e2152b2fa3e19f62480a0cd98fe22a33c4cd35c48c7e06e84ff5ed0a65ec2f8528b7d22e103a4dbd42a12cc6dd3a3f806cf995b1c817cce7d503946e1d1b85693cec02f518a19fd289f93c0e51595a0f94df7feb533f0417b62da4771dde1a920e66448c260c06fa23366b72e9916e173354a0304be160959e991b070ec34f32cd90a37d29cb6caf0e5b1d557c07db877daf363"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (805, '{"ob": ["15151515f6ee44f2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dd3e1b72ecdd195bedc0278966962456434861a27762a64e42552e122de67bb4437cddc7d5cdc6cd48447415f1c228b47a28e8fddf0fb3e7759c926164e2fc78513b48d8b1dbdf8fd2359dd9c350ebc8276f6e83166376c7ebeea634c750798243995e32fb9770ff02bfa5d83736b554f30233569aebf2f0d9863864064d7502157a2a0a959a7d74b99772afb820a5d53751d7b0ad37885cd19433b2b79466651123d1eac390573622b3914e729cd71e0fb1693c28066b91420c83ecdc6e5cbaab2d011ef5977a85a9a09e93d568b205cd316ea41bc81c5320d4b0a11690fa70f9865aa62d2f36d64a3a924784b0d5f361742954137a805c432fdcf9555717cdbe3f2139a2cbd3fb46f4a86bf62a525343397611ac41106046e04c749625415e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (806, '{"ob": ["15151515f6ee4488892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dbcd55420c163b103c4468d05eb26886b3cf4c5dee7029c9ac23fa43bd85613bbf36632e055d82eabc824fbe0ac52230db05d7f20a760fe934b1da5247b465dc7f798ef63f68156bd2c9a95d4c64793e612e00e1d4d2a6a1c43ec6f784c6bd1133ef9232508c0565fa45e6e6ba53be76cfc7b9412c7ecbc91fb498315eef5117e3cca58907fe953483e3097821011d848aab2bea066f3b1209c0f411e638b433946c0454949c8406ba7dc9a136b6f2a5c2c2b8a5cd276e718c6a85d45dad98c2516131101f037fff418c75f006d76600453b6238f513cc8f93e7011f7f2fa14f6b24f6556d31f2295e5b08889f057763bb857eee3c0bdddd57a3f52816f2565f93a63c4587e946c1d04c132f0f6d9fedfc9a89cd0f43415d9cabb39d88d7feeb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (807, '{"ob": ["15151515f6ee44ed892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586086890eb5ea1fc65dac33ff6feb1eaa1b55f04d78ba851174fed89b19ed52e18ecbcb87b332e6daa4b2800aede13f2315d62912ec315355b42a1cf5e867023648e9c76d2b3446de4bb8f716365edb7168cb8c4b38ced40a834a1140aec7eaf58dd2673e92a1fd8cc5789959235b545d2f709eb2b73ca0378e1e42d6ae4f533661b9a672ec82023a57f8453475a9f7c2e89108b9d96622af183451a26d41cd4a6f59d3b2fa6691c4e2e38cb077886942fd4ebad1d343d4cc93ef878bf19b075103796b2f7e9268d9cca2e1d0f3e461c008150edb9dfa1d669a50224231b93d807027eeb2aba4d705afb3a60a02d056353cdeaa9e2fefb846d315ff7219b98b797e086f943cb50cdc16a1d12a58cac9a3db428894bfe86a68d61529568912ac4a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (808, '{"ob": ["15151515f6ee443f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135851e3a413f77be36776f4dad8f53222372dc3747909509ddc4ec9820422ac892d4ec59d7b669f12ff9a4bf60948e922b0ae24a5b92c4379381bc58ad1c696e36efa4a98c36757c5a742abee4e30740e347a9e721470c03037fb9684018e7f17651273cfc9f50b768d0a9056aae97a8f456bf5a34c5a8aaf61a4286ccccfcb8307dec88ab8941c90a30319509846c788fdb44d77d04a1a86c0f9c14d034e9b881d66fa242303e3be1439f2e4fa61dab5ad3e61d98ca6d631f8fb2cfe79ddbd8df64d53e517f834b1469a45de61fc68bd2cfaaf09c98366a0e6bed3805e41ef86140546e8e64ead14670ba517d5975b8afc2d75202917546aa07b3409e4ce7dd4f530743b665dc7bf02849288da6346e76fc63fe8a63084301919620d64ad084fb7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (809, '{"ob": ["15151515f6ee440e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588040f5b6993d3f255dae4140285786d3c484cb3c8b4bbb7a9a93eda264a41686150eb8ef658d84ef6a864096d162293e15da56307a32810788bfeff2936fde85a4cead8487e08e13b8d4b78e45aab5591a8046173eb1d179727071f3fd9962dac4e53a813c90e0a01e1124d756dab99a5e86d449b007a90c4e270c2aef84c7eb3562b4e22e01d53378c24b4f5ece231a9098e5ca4668fbd50e0b4e0e89758765c64d629cc1bb3bd7e6dbbf3a84559daafd6fd470f3de0e53db812c64c0a89c553bea238ff89dd6ffb068dacc3f39ff9e843f465773e31da52d5964a6b05e9ba9928351537a3635652133b2ec65d25941c8dc069c9b9699a0d8f04e1efe79be1ebe51432592ed6a9f64a9558318edb042ae493ae88ead6eec3336d5f14efe585d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (810, '{"ob": ["15151515f6ee4442892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c4df45371da2b5077bbdd017123d8057f4e706c1ebbc8a44cc59f44988f6280b1440114edd5710400dc8d4d3ceefc79cbb193f4e420e9c7bb495b6e4f56a72fd7b553afa0c12b8a711cdb964ba70287271d4aa39544b2a450c0e609d83991ff993501e3839167b7f53bfc97dbf4ef74c56626e11e6e20f0f154511a4480abc8828a5046565ca5abb7267a9573542b60456f2153e94680e919cf357ac2d3250bdc3fbd725081ab6b8bab4642617fa67129b183072a7f65fcd3c86411b0984ad9269e08c600dc0f949ebc0fa1b69b8af3403b435a271a8e4cf08923b681749e67595806c6979267a124d7c8298f6781fe05f1592dd7da437b3a89ead34f9ca356b14ccaf1f8f879cfd7bd5eb923c31fb1b7813fb70dd5bf1d094aa2160ae81343a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (811, '{"ob": ["15151515f6ee44e7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f810ff6e306650f39a46a3447093dfdfe48a179473612d41f1551905c3503313b268e9a2382585c5374878e2c29793aefd4b3ae88b9597a295fbb7479b149a8ce0236d97844e38f51c53ee86163f9128b9ef984a58b6590b7b9d210b84558f0b6f58f04153a3f0f5d4738d77facd9128917f0e8d9e2be9a18f7ac1efaeaea9b2d91ba0b793df5310960fd52cbc8045d940a076248bcb848385eee35729a81258c64919721c2b4d7a59c87ab38c6a71fbd7748636ef7c9f5852af03cb536b8ec3149b9a7c523090def2c85e8fb881333ffc2a02da758005ccbbb1d467e07ac576c5d8751aa6a0096b9d97d2665955671b0e1fd6d9a6bef59683dc508e68bf191aed5ad67fe842c628503bf2ceb47d084ead119c54681b805af431135c088899bf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (812, '{"ob": ["15151515f6ee4411892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580ec77c9cc2c95db63d1bcf01596e8f64147f7053fe592bca62d8260cd4c956e49c1e4495bfada12ed1681c7f1da944522e683d9b32c9545b4d9bec82b1c618bb18a614d80f0ce19e9b805aae1648849f851f96ca4a23bdb7a57c7a82da4a484f85bb9b410be5b5c9025081d6c7f3a791d7103030319785401f0584ed500b1ae5d31cb3e01797e3a8a199359dda75feaef4080ffb4dd5dcd3807b422eb4d22f32e788e0fc528ff8ed97829d91eedec580c3d034f63fce032a7687348ca71dd300e6139ea82585913d821a893b811e0f435d6e779df14693b92fd79837b110a4fa630aa2155c1a37ce368f9781e2932da7f5525aa5d62e8a61af37182e425e62c1a1ae234c4c7ee7fca1d31af3fc1e2933f6d0d7b0fece3fec40158be4915fc381"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (813, '{"ob": ["15151515f6ee4423892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135897fdae926c6f400fe062ed1e5a033246490cf4b06a9d7b3b9b2a51436c38eb462a037fecbb91a54dc48feeb84c5928dab3c83df9d19e1b429bf7bf5fe57e6524bfba9b1729e5e917763ca06e5c3c3515e2b41f2ecdf011c98be13e782b974edde01adbcc432468878fa521576c346087f69a405e883316a0dbefda4a406ea4bc790bcce56832c917cf768d602b17a7cf44d75b11724286f31fe5ef73fb8db45bb1424f3f736854c6dcc9eb359e4d259165c06e42d09a96119edcba7aa621536b0186631ba76d4170e71d2a14d139140880323e83e5157d81d5fb8c06e18d9acf0ee3aa34631b322006a03a1a0d73b2689a5413ff2fc373cf0d305080b1a9a968dd7bf296fdb61daa7c7de5959d28bdb4a1aea69a6729523c18fd79e44bd2d3f2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (814, '{"ob": ["15151515f6ee4428892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c5eb1caef2a05092935f69a41cf9a0e5364bcd9b4b0f8fda4d1633f76fd4ef8bf86e05485db66a525c7ca7d2a65256a2c417db448e6114873cdcaba2637b5e96740fb2ab356f8bef493ee980b457aae9a6b648f1059dd12640d3445a376d005d3314188a5784d4d2c58149c10b880943e7b0474c3e0589b6ca231b2309abc072389387ebb336e9d72410611dbc7c0b55162a0a86b0d97f0f5e2434c4be2c5d317c7cb68e2d097270b14148f68e78d4d6fb7eda565c31e6a97198f5ea2dddefb45f62bc6247e32e83f19d6e92f195f56f321ffe5c6dbfcf7381fea3b27133e925476cc870bc29ece67a7c3e3a1affef7a79931410ff488da8d55ef0129d9cb19b9470c782476a92b4f57c8730e25a484b815fe50ef2fb4738e84cf7ed0a5b9fcf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (815, '{"ob": ["15151515f6ee44a9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584c19e42189253c9c9e81227a3ffc5b51f3ef71b4e42c94f88579b49db5690def7f5cbb6c5476681e172abe52f16b737804261b4bbe5bfbd46be1708a8a168434a372af9dc19496890bafc92d82029d626c8d3059a1e1dbceff670984e2dc3b46ec6ef89d5e974bda5162110ecd5cd78c358f136b3bb4bff0088ca18188341f9460d2700fc8245f7931d2d5af119ddc7e13595a21d8e1e3321349586a3e2cd3caa2fb2458d4e9bbd1b8c8acb77ec26a18ddb2f7d8bde2b9cea2320670c0fe332691c08cdeff5e7abe527927a4ca098ba356b13dce7b871d3b4f2236673f61827fbf6eab152019dd014d12083c223889eb20df3605ef8303375f3da79f95a41ba6abacb946be96f9617262b54eff69964325511a35350902d2cfcf0191e75d733a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (816, '{"ob": ["15151515f6ee445d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586de335e6a407611ee22b8a41e3d6ae11039104ce4beecff9f432fb3af6b3b65b5a04ef0709a9d728a796e2bddfdaaaadaf35e86c3750c9a272af31a97f0098782637bfdaa990fc3268ff04062ee6f623a6c1ee324b5c9ab56e6a08f31b0fb7c365342c78628843ac2f2dabbb39e2cd0da4e320d11a25b2ef70c9cd2a9dffb0a03d167f1e36d60c59767d23a6a17c9291968c5bd29c6cb0a7a2932e259eb63850f7ab951b06ff3a81106adfd030c762815274bdb5a87eecb8b4b5e78425c676a94e2866dcf8956301faf0988dbc54afe73e64940fd8a0eced1431145e0b518088937396b3ca90cbcb834f588d80395b4f0922c7cf1423b29625052d254f1d9a5ddd2fdafd9b857ea8b74e216e2e376c30a0d9f5914ce18b27e38de9c3e910aa77"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (817, '{"ob": ["15151515f6ee4429892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358154e162ca1c8c51318a0d3cbc40e56f876690b4a170b77865173e837f407cb575a3ec8b9c47968818be327539b36092a457d86aa3411ee1225052e621a070033bd544b3e8d25a62f5601b64e55ca09a47328ccd1f3ddd8bff6bd89cd1177268c362168a59f8b4dd3115b2dacd2bed972876f835870e1e59fbb6201a895d08e4d341fd1c0bdbb3aab73dac983074325e3899bdf50e9555658d325d1a0e04d85d3b36c34b26adf07025ac54bc5429a5c44f647e69a8c646d20c0872bf02ad0ee0b3724d465b8a4667f186382132a6716d55979a394b75e78583e56a75020a0f431c307fda72861821e978c8578614faaa9a551734d172ce4a79202df809f9fba3120f9833317a16fed5aa2b4b885b6e29a507c285444366d1d771b7fc7c74b8409"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (818, '{"ob": ["15151515f6ee446f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589a5df242f1c38f9a6e94a221a11fcc2032ddd876cc3e79ec151f9731ced9059406152e2b0c95e08d0cb0808afc1310db3b35f4c9bae339090d0616c2b755c646ed40ac4f0e7415c44bd1b8f73589d9f0fc7cdbbdf7f98d2da92199c3923a4e6ee8a56e2946dce0a88735068a32627e32792cde30cab2c6f6dab05229f1a97aaa4f35d4396a9f8922c6defd04559bb016969f3ee748b5cd4beae5897c074989d0987aaa84aed9ddbc5e2ae4b1d67a4690c2231970ff262141439e015c90b323e931176f25f9570ac6fc4a27e2ef9eaddbc7022fb9d00ed24f9ae564648ada78d66253b276d6cb6baafcc9104e6bc11a81867e682d94e4a5198addaa3cf221924de34317a4e61a41d9006c60ecd5e8e968d1ada348e8dff2ef922ecbf1165ff6c0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (819, '{"ob": ["15151515f6ee44c4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358260b23b11669c13a843a681182e9b6cc23ad57c838ba5ea520a810f0a9185ef7111c2a03a64ea6e36fcedfd94694fccaa32dcdb38acba8f6ee4f7cc66c9204ea3b18e2078e1d7d99b4f69374146cee65b69090f092d99e8f6c86f6c426e92ff1dd9b680e60ba6416367c9957a08eae711aceb0856104d6a4b9809c0754709ed20592e23a18dc2559b856ba1396fd268924b79856b547f7d8b9345e96a9c39b7e3280f9088ef13b6ccf042115dfeeb741ffc0a64cb3c594106a28a09cab574029ab5e9e0e8fc4b24d591eff7e8bf7e2e6a41794bc1c96513f8a07a07d94dbdfe0a3442679b1111c9d58237e68d7b2be7c2a7e054344eb3ba1af4e4903fe442986041af14cd1078be2fbc63feba7bc32c87041f612d122cd56a9e3306cfcb44d41"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (820, '{"ob": ["15151515f6ee44da892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fd52b321b372f42bc6b2fd7fd1df08e702d1f906e2583a6019e0dd481e580ee8971d736ef61e20294f4bb72bc0f089c2bc178f3c4beddfa72624708b6687c14c1f18d98a2dfc777ce2c1dd153fe0459eadc6b1aab8dfebabdda0f21b87467f0a46db9969541b22897648e4a7e30850ede67e04f1458c6926bc9f59096842fb9b7aa41398c11817979f31e94c534a453e4f93b552a376a4b72c7f81b6256053fd3c4c1b91532887adc8495eb9b671652b02257c7e7640184ee98aa20079590d280e4ef14fea52bb0113005249d2c50ea3da4206f1786d957ccbcaf363da8ba67a8f13afa721ddfea82e3fb547dfb475876b0cc61bea97cc5c751f71c6db214cf0a183bd1aedd6ecee3be7142377f48f041e9ef4556ab7ed7e8fac221b2b2cb519"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (821, '{"ob": ["15151515f6ee442c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581fa9d76df560af2dcb1c7bda561db28512191e8c94245376b65b20864c11af79acfa832b65b0045eb968420b4e16359f322fb34c518cd7694fdfcb8075399ca3b129189a614a6980e5ffe8694e6a80895821a12f2b58f8a5c48ab2cbad03b45b2ab41869da0082c86719a938af3b599809163a10f17affebe0a242adadc5ebb0f7725d6d3a0c9d227889a56c28545143c24c2792e0b9e1a7f3af54faff1bbac442ab7348fd71cffa6f6ee3b9e334f4d2eb9778f9edc95cbcdb668b41d50e111654fd4812ad6e9923d76ac832fc9f8d600ad07969cf45771e39c33d00770f5bb95396eb9eb9c1ab3faf9f9d3ab7f49ebe786690301a55f2253b87fe3e4405cfc262f932b535e172287266e94b362c596af24dd203018431e9a8212e01900b1191"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (822, '{"ob": ["15151515f6ee44dd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358acd31c10238fd7dd38c6290d2dc23cbfda471ea49b65eecf1da80bd8a5552416c728a3815be23d3cf0328086e3a01c6985ea1782f9c0cdca52856accc300c50d6afc9575680a7ba4e32fc6f1ac44b2a327f539b9e5b6285d9b4767b525343f678b90b4ba013c34a4fb152b70c4d55713eb0a26eb27e5e67e1e8858f3d3ff061388655b7b2faecf66fcca3aee347d542d93030dd3fac692c35013c4846c632cdb15334dca5fb30a7e91f65c336298b0802f39a8d564c01e6664c931229fe2fa74debe089a4f9598273bcbae67d7f954f867f81f496bbcb12b846123ba218291548eb38d417baf0ae3e52ff78ef0fd557d0eeb131cc415c5593d790b8e10a8f8737ecb1196dc9738220e8652d5d9bf0bdb24f72436f81f78d0bd9077392acb030e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (823, '{"ob": ["15151515f6ee4459892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f6a39d20e3bcbac0a3885ee0b406f582e241681b8a14fa026c4ba964efff16c0eb1e2c0614a8e5c4537279c5c5eb839d38b024441dddae200e5eeda12825f655c96cd463253063fc3e3c2da0b834fdb5e9ab01d6bdc91bba2a1d38edd1442083fe875c3702a00ad01a68d6cb2d4e205ce4fbc6a6f07dd82054b5f54a134d5442a8b2612d4f4e42f3b8396be9f256b0f93d543eb7b4846d67c9536b101dd09398d8d700f3349cf4cc1acee2c3b92781e3c0a508d42179cd180569de17d5c5ebb0d6556ec8cf1b386be0bb394c2a59d00b268f8c70b7cab22d57cad10473a1570e11af4ca0b5dbf98af48bc302e99d6eb239dc09c42a0f6831dd7ff90f873e25508cda7bf8a3eeb7c2856348d7a6a1b60194c24b663c3d00aaf68fa031aefe20cb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (824, '{"ob": ["15151515f6ee4463892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ac2216b035c999dbbe9fc3281f3db416a1e8081b07b0048dfddc2082e8d0c27bc7540c68acaa3e49701ce0c070bec35983fef1115620367e9869dea9f6a2527f625d8534b7ea06bb99cf7854fda6fe10b89bb7f2ac9728d6e6d96a721c5cdb6c89822b84878675c43ef31842e2c20d7991a8dce355220bf055fad8e06687bb3f9046291e88a9171328ffb8cec3783cd18023ca4325e8c6592d08c5707a3ab191c78db39833f76627e98fd764c866eff1b03313231544d4a49caec6dc42d67fdce8723f551746d4b49afc052dac479e674e94b45359d15846f88978e20cb8725a583c89aa43b0baf13b34e8d5aa89fb86a930a30d8cd3936ed620dde3c2ccf70942ee027918ee3ffefa593972e920306c3d8a70f6df7334143c5fa8974f684946"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (825, '{"ob": ["15151515f6ee4422892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584e4d32e0e039fe9ec3d9deead5b38e6e895f19f52a0d46fea853cb676850cfb9b407ca9bed85277c352a97d2b9c949c492ee9fe9774ec76bca5b83bba2cf20f2f5fdf904e5525800d2c21849cdb3529da6de3f2d598bf322ba1cd4be2d00736ee41edd7b2803d5bcae12741a80a2f0f08c6595943f01ab82f577cb21e7641ef7eba180f14e71f25fd3f5dab62727d68aec6a037c8c5e51e3f4eed034b7161928a8a913c63df740ac564d1df80f5f01e40d67d4fc3c8987e56f68e0fa795775f62d357db2c029b99b0455bd1151f784d1c86174736eab214d3481dde3d74e3a840b8e6170a2afc81b675c06896a8755f6fa82eed9e8d3bcb1b43f72c0b91cf1ce681c77c5435e80a4d1463a39dd9568da3f2e99ba727afa448a159f66ce680fcb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (826, '{"ob": ["15151515f6ee4479892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c72737b5b144b1a9cfb113225742bbcaea83c93e77471d227d9df65d406912967217ebcd3ce34b7dfa47bf6c46bb3662a03c39289e690f19f99d3d3f4bfad3f459b457257bba50adb355bfc81abd81371356208016eb27742bd0facbc3204ea98167ac0fde8f74c6e1cad1b845488c62875100095fa6eba5cfa18f4cbc343d8f541af89cf902ae34578f44e0fece4a13e6a5cf353980764d75512bffed9ceb535ffe00358deb5b9fd20409e948daa9a0cf2d779e1a6709f57c7688eb975cb95a65f4d5196c4e97a63c0ed400a1b00e59348715d27258ca87844317efeab46570eed688d071aaeb05efbebffb92f77518042e18378b7352ef00af856b105888147638cb5392d447cff62edebeba90b8dea5644953374848c5a636757b8db743e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (827, '{"ob": ["15151515f6ee4496892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358501638a701d4109f52c73d8689dc241f5a106a7a009d4bb87e906efc4bd4ecd3f93efa7567d4af94722c53fca90bc78b7840f3cd8eaa443f19d28f1c553434c422bcb0b180f78259f2560963f95aa4eb4234a1f401913ec6e28316fd4ad5a69ff2d68f2f07d39e2a6552d369a7ead6da6e740f9e8ada87461185be6af86e296544cbcef6606acd728b4c66b4b742d76d0dc63b391f105192d819843b1ac5e3d22c911f5fe4d6cea890d407a202a29486379485da82b5400aac60740de384d6dd69f49eed781d5e4e7672693ca55da845724b38a04b53bf1213daac8239e86eedfa8111d6a214cbfa72d398e52162263a43da4bf74dac88550407c90fe8291cbe5a7dab127bc2fd85a166cfc02e881dc673f9ab4738014e662e302acc086e6c69"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (828, '{"ob": ["15151515f6ee4418892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586cf25349653983faba483e2e7806d295cee794a5580903b7446676cc24b9d98ababf04276aa8156da96386161e1ab50c0afc96c5f72e58fbadd9003b312cfc5c203bda5404eadc414682b90debe35019563e298c65fafefac19049d2031605369eec77465edbc2448d4cc06b8f8091314cb774d233ed0945d779053ec0c02075b06736bf386d4b50e80d637050f6b03b4ba9a0decaf4a676ea2a69dfccdd241d56824a9c30f81f9dc5431f7d5f475d7e6463dfbd7f0846c310034d1cd2b2e5ac36cef8615fd9c20e975e0354aca8148fa5b8121569417ac954fde2c0fc24978d96e04a0d274135fb6b416f0a2ffd734817ca1d112f357ac854c7cd7f5f92bcef054e424bdc1fae15594ad33b6444c60b7ba9cf9988699570ec2438334e657988"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (829, '{"ob": ["15151515f6ee4427892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f52805285bdc28fb9ebde023cf7db1a0f6b709b8f5b188d2324ca4426f33a62a3da2182beec80401bea9a985adbec505c2dba49d568624d67058c064080f43c0b5982f0a51f8eba017fd6600589bb849397ca99922194bf5ad1ea7b684cf23d77da1460ffa601bfa4e933e36e3c0077b624813895a6a34b20e6239f4d4ef6044f355c7543b2d3ff365222910b41d5d6fd84d086799c949dd95246d5bfec96f28a03e8f295c8a4f13935ed62f2d9ad3c5ad3f50c01added467a9375edb5e10d2063d34836341aa4c7307ec2df7a3256acb7fc009dcac911a9c16c37ed005a2b5c44f1fc9020f4a7a49cf890c7e7a78f3f9bf43d4852bed6c6e0ceb6782d49ce08853bfc5a9309186dbf09d60a58f2ef55d5fa4d7b499b3820f87cfe4720dc7b3b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (830, '{"ob": ["15151515f6ee440a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b6e09ca737fbcd2a6a98373228ffdea96a2e8f7800d273fa381d4ad18053cbe73c954e2fbc03e0f2f19b26d8aedc0b6974272daf27d1c5f74f43d6f25bb7f8ef93aa6b9dded500ca215a6d7907378662b3b4a56ca2c1a8732dc46bd2cfbd119059cdeeeeb1935ab5e620026f1adc0a099750aa0573a3c2d37bb144c29567ae6fda6751f9364b904a652b3e30f358fd9be6e9c04c80e4d44883da57ee0c3d31741f9e7b45c7808ff25cb32e413f163d7dbb520435b40a8aefaa096e02ac96c1bbf6cdefed9e0174bdd30bfd3a55e2ec242ec2a5081639461c73aa4fa5774242fe5acd97a97f037d271e35a85636000e7a419985194c7b5ca3d099f1484f0471ae8fdc11a35b5aea6d8a8fd37cb5b60a72161b5aa69f887b2355c64017b79a5c4a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (831, '{"ob": ["15151515f6ee4472892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358764d3ed95052e9fee25125d848f9979bfab0ed8e340ed4dda7603e084881d416935afd5dc7c571b8e1b99a3680fe8400c126f39cd54f324269c1c013378b1176eedb2e5b542e141cc204cd192e46ac278b4d87f5269b7a167b53c91dca8ee6ed7b18d18a8ae1f3f8d2e3ac8b1615e6b77a137907eb6e336d838697e812e068204c9c70cf8e5c7f4907857921f5fd4896a50f80b11995499b330034dd2baf48e2751daf9c72d70045c6ed1c835adfcf6eda0c3cfb79acf84387a54128f251c0ac650ae8e3fecd9d4226a64e03346504ef25f910d9d532a9a99c19edce1fdd357944397988f9261933b53b6b608ed3ddbb8e59692893c7e83428652ac4ab62890b7948191582b6a1e8c42d50b3f5e0b99ae9b7df8f645dc99854150ab52cdbadba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (832, '{"ob": ["15151515f6ee4464892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135834acc813470cb465ec2742478360c20f49bba0bd4801fd1a37cb5ad23306f3e0ffb6498fb3e190f9cd286948149c50a048c2c9e22291c9980c57211ef01bf943fc5ed07d1c9977bdf4faf6c4111e8b57f579c09b6bfcbcf6d5e2bfd0af25f867df7a945b58bd54e8e5d27c5377230564fdbf663cdbed2ed51ee2180fcb9efcde0f6e125243ce6f8b841719bfb48d0638f41d7b753c5b2eb7952b0489618c597c034fe108c45c1dae6cbb1c844904f6d7c6c9ef09245f6f3a25e0282c5ccabfec1dccbae52ec6cb41677e1e022cc3a26b10caffbb0b56411a9bf331c091a6ae19abaf69479bf10f073e2962904143f168c7699f1e92a6cee2a2e5b167d122e83a45f4e709a997caa708e9c2807b809d49bd68a8ac0ca186e23a2e6c671dc525ce"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (833, '{"ob": ["15151515f6ee4441892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358916becc6ba92fe5777c2251b73392f790b8ca906d190342029b96aa79edaca14207595e3752a4fb91fb5633944231d12274945b9af34236e7c6318d239699a2451cc1fc40e73b2686f635d79f5007e1e8613bad4c28d45344da7c9cec988ef0f759545a4609fb6f69bdd79315b6a34f843a048c815868e7aaba946d680a72a4accfae4c92e8b9e0d4c15aa372433c2fcdfbfdfb5add67f025179e867769d62f00916961fd3fcd8326845981f3e8eb39655038561ae34149f399e128124713f3c4599cbc7331f0c4c77405686ff18e97518a13eec8a22d23642c8cbe751bab9ca7ae8b5144fabe5fcafe2fa62f9673e70887e37483bbbe918128253d956b2dc75590ecd924153c0a6c26fb257a032c279f8bc7e5bf16c8c502e03bed1f475aa77"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (834, '{"ob": ["15151515f6ee44e5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588a72d15727e75bcb3f87a90e7e1e90e6c326b38c7caa21bd154d6d74e2aafc3a4d0ea0ba1a5f9a667d1ed65cdde445a58e1960d532ddbb7c882ae8e3c20e1b7a4dd753ca36571c18ef69a9b3a8e490ed761df25117dd6cb887b7083fba20b54f8264674a50d06911800bf34f14da7441aca6bc0b00d8a2fe3357dd41e707b7cbee619a43024673ed0bff774bca474a3c338d4f4fe0acad1929a22a0ba65eee31202b4a9f07953bf8be60be879c2a2fb37c4c3ce5b0ea21f1ba4b4717bd5d2fea85d9b5eb5115979ac6a7f39dcd5d1e2628f621fa1dba799f1d3ff7fc140635e8d019ce0d176c175ef30a2025536592e5edcc6546ce3df8d14e823a41e18fbfa63c1342cd0a4911ed3e9ac36ef59b1a9470c4e80d4a6d5ecd6ffab20973e2475a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (835, '{"ob": ["15151515f6ee4403892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358bf5f7f7b429a586528c6a9422e117028128342fb6702c334ec6b33cec6f41ab31a012b26dcf18ca9a98ccdbb1dc9440d13f9eadcba047933c92d03d412a488e5909ba1c55591c56dd872971c0293a3f3d7546242852ffe0659329c5284880aa74b5092fe60537e25c2368428151e3e6e8dd0f9cfc9af18862105f92fc9925d4546d624cc3eb7cceef7b8fccf9c86d80379987661685839bb38224962ac182411f6430f8e1834588b7972dee846e06c9ea44d570fd0606c2f8477dda4d31548f09f40d516647ccba9e25fa05a552b11cbe055c28900391505456df08404e8ddaecd6a0d5ccae11eecd9d7a98e11c11b660690e0f5fb2f592841bf78aac68a54f03a8b8a67cc4db77b5ddde9369b107d90695a85d54381759a82fb8adac1395e66"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (836, '{"ob": ["15151515f6ee4452892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e2ce6e27755b422b0a5708379ba23da40e2e6edcf5dc4dbc3cdabc23a59bb67bd36f633a61f68772296de55286f33f9fc176fce807fe522ff0de4b303228c64009f1338ebf726b372684abf335a8a437b16ba19cfba86039c7c9238f34c83fdc30448569cdba6189b15eb868bb97cafdeea75b91ff05ebbbfe646a1df6ecc9fecc55dbf7b3d94c596e946d5f2279cc37b3d14374ee0eccaf970eb9de13bd1f763f5a867acd981b14f1ea58fe97d7828fd614e86d471bc3775308fc6e846d4789c778c8185596fd816cf05b43a1bb1d13373e10d55d6622278fc179cd1216161d2170346c0c8a370f53a1017a55625c8508f00b5fc9fd595594c178ef07c6421d3dc625d5a7e63980813f34385ce20fdb4d3c012d32f6ea96d21d86d1f0c2c3ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (837, '{"ob": ["15151515f6ee44e2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135876c0e2145601a2627a3126b3415fe2793f33be93beeef87b68f5cd8c531ec5e00aef5008936e3829be4444ec33514b1a0dde82856c62b12117d57c117ff8323002b131d0af931c6df848c52ecefed7f4e0fef94d705dbe623c61e29c1f3d11ec79ee2b094203029d5da537e090921b1891b09b84a93e050af3843b2c19a65cd8f8cf349c315b814d1d34f78798c4c114b125f49b7498fb071b54da00ca9fe512b568883c4d636a5c5c25253f09cc2ed55567057f76fa97e8f2fb02a85bf71fa59ecb00f47eff45b7b8d337c4c884e9af544bb8c3632191db15b3a825a6c40a70398a82b700b9e56127eb4125354e22772dfd33480bbbbb8507a4d3eb377b6efe40e44c6f5a9ff427e2dbd299382b18fd1f1827507a8eff899fa7200606561a05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (838, '{"ob": ["15151515f6ee44a1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f79af12d8420c227ad2c17abe6377b59257bf40d2e3da7e34e83bf40cd3b4c26ced03b9d117f9e066827ed399ad250859f43fa51f8db7e561c94794879147fbfb1411ab12bd1dbb8d0b2a53054c295564da56d2f03511063b6e480aac010035b0168affde7f206b0599fbadbd049f2efc0337895605a8ec867c060040749800d5887a85c5699a03b68470d8e1f1f96dd72569de7cc5a723f6affad67df75604dfea670e3e8fa3674151586faf36978a3015535391257c41b7cc190636370dd90751482f370a24ed619c3b1c4101006d7e5eb5508a843e214819211e25ecf2a0280df661db5344590ebfab6d55cf34f0bac61af3f54b28845edcd1001330ff1503a5276f7f4b19161068f064af1f44a1550b6e2e58a89d112f57e4ab716c5f9b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (839, '{"ob": ["15151515f6ee44a3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d91a2c4b9b7a9e09b6fac9bd253c4d860b9758d7b148621b2ace4500924bd99da7cc96af112a49f171b1b24b1adf7b6dff5f7bd2a432e92eed488eb1c4ee0682d1d26da859cad3d205d5c16c0a0c2a7d79fdc41cae79098b504de0d9fd300bfd368bac6c07a13597635c773e690bdd94ec8a68f5b90c1b63b06cc65b8eb6986fd7be51c2670e58afcb50791e545b1249a8ea2d440eb80bfc1ff1da137a1e3a3475fea720dc6f8418c984d33ca1fc17dddd7c6e72917078a4308b931d335b94db6e9372d2645d25c5f5ad76981e0f901a0a2787e7fa962491a6bcee614dd4fe15492459e878ccc669113485a760d636fd79b0fe448b981256a8f7a07288c4f74968824bc24478c0f9df5621688b0870c2ec69145e82ce0d0c572780461b03f41e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (840, '{"ob": ["15151515f6ee4474892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358129d1df49f44722e586e7be420e20f3ec151bda07d23151387435f655d0f1356a7cafd75fa6cecdb4a1e67e3ed0f1ac7eaacf3ed4cfe58b6b62f028340adebdfd294e83638fbcbb9cabd59e1d1afa57148379bbbecd75b804830044dad6640a0c0a58ecbd4e6e56d1c3715db9a999c6e2df27368938efabde750afffc940ce06c8e89af619e13704d6c68461b92c0aa3df663a9502aa8977f218a69efffe99f58c11bd704830e32742df300309137ed89355639f9a619d574a619d967e6af82040acb22cc4bac2896b02b286030f344187a7cbd43cbc05e80010fe07cada61204e5128d31de5cf4784287b1a132f534968a6a72654c8b7716f483a4d5d8fa9c5697316281ec747885af137f94200a00a497125c52810537c785e4ca158ae7019"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (841, '{"ob": ["15151515f6ee442a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d1ad5c15b7d75500afe6cd1e984fe24915c2a9532f9336f137da63bf7f8aa7238ed5d9f2d0cc1734d423fd6e3cb105cf973976c71234c2872ffd0fe49294e39cebfb36605c77479c7a6f4e5aa8f58d3ddcf5ca3c8377d8b5c893f2b9f783067d8e1a91642a469de71864a9523c0f13abbd7dc4f588fa4cd469e267acaa4a1598bfeffec720044cf3abb473d215f923510be1fcafc27ea01640a2d06e8ab5a89ddb47583856b8ffc78610291731013c827ed505aefd2163f34e488592b67c6ffab91b7714c3356a1a3fbee67d9bb356dbd33c454e1c3733553fd9b85813cd82608d8f74a3f97f41826615023d303c8b1ac3ca3fdca21720862f33659cf69340ccd6ce19f02a0db198f13468d4418f1af6c786784b0437315b1a061ab567509308"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (842, '{"ob": ["15151515f6ee44cc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b536231f668159bd0025657f8d4b74fcf60778cc531dbb76ab40e05a675316ee03c6acded4e46c480d987c7a5fa3942369b95d134480867754a58b607fbb31023c362cc79f3488eb3d459c3b67e6f85332ad24f2ab2f19393fc815fbdfc3060fec5f62c978a1ed41a655c89eb943963a3079cbfc95c9060bfff87ac24a7b3018a66312f9c8ca625cd3047de1b60740540e58f70035fd2981a1da8d872fc22f940a767626a9863486192ce7a2e5bb160fc0986f2253e9716bb32a455d173b403bc9de475af7b2b0edccf799bb4bd4e2bae468491d7055a6218fe9b590a0576234712d8f0d1229570babdcea443cb6d5c834329ef8d858262fc877d3ee0952c92c71862fe4962b3da9a48469ca915e9436c9b7e78f1029b2587504c6d96cc7eacb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (843, '{"ob": ["15151515f6ee44fb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358374e80065150464cc74901f6ba9f00c8e06ca9a6fd25d553dd49ba369193c8af4e568d6eb85942e341d75dcb1213f025e0d29c2f626182077c244951fa48f78ff5c7861b259778b5c0688a469ca46e364b468d5a5cbc0e59603babad71604f457cde59bbea085fb1f9182882731d69a1dd380211a50f03fbdbd9c08f92331a17abf3f1644136854bba535fe406dea4d9aa9c5050e8679cce772324b4023eb7cd7263b64898a65145f75a767a0a4430813737180124e7a96b7b745c418bbc36cfc8cee2ff1d82a365ad62941312bd18e94da938bb57f8fe627069352859687b38b9a1e5ec03fc23814d2e86922b14dff7a2889b2fc351a0f913908412842b29ed6528b268f4228b62d4f238038ea6a77345b3b144172d6ff12f78ecb3074ff069"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (844, '{"ob": ["15151515f6ee446a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585a1f714b7b9fae03452e54193ef11735c24f3ab803e63701f949eefb0f30619fc680bb853ceb516e65c90c4f09a141890c824da116bb49abc4dc07afa088075f5ef8c5fcd366b1a1385216bd8328059f2eafb165f6e629be82b314b368dedd111f3391cf6c085e3597f2450719d694ddc397fb4f9a34070c3ade0337590c3ed1224a9e33d6fa8e4ab5d4701614963b2707bceb53f2654b97156e867803f669d7f256fb814687268b4c33a3fc73545e657680ab7c2e4cc724836f07fe925acffb7c2d73859fdf092eeb0da67485a897464a9fe353524b84373e2e381e52e682def8bb169aef735e191ece8a95875032485a76d01772ded4f8e1d77ab3c06118857e678d81cb66987a9bbaaa784eefe6eef9a3a3bb567f12ff8be14af7465e3f6a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (845, '{"ob": ["15151515f6ee444f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f84bbfdaba7f595a92264a4f76d18e18d7f675b545d0ef6972a74636e3ed1c9943ce49fd9eb22a594df50d27032d0ffa77ca485d4b575f760be30f2400942f7b313c7664171f9ce466468526fcb8a38584f939d7eb2223483d55a9bdeab727e69efd305ecb09bdd38d71a8f020e792d936f0f48501dcf51d1b486dfedbc5f5ee6dc573c4cc5e0c5debdff0eef3dfe16c4523ed7f6aaad6be0246cee47b0782c1c61bcf2686d8bf01805f26011fca4d8cea7451c78e8af32fb3451fc837ccfe45d6bee9716c104e3b3063ebb674b041dfeefc63cc564c5a567c6b76ca11b78097955e43d945670dc975c9657243c1fd741923ecfc7e5f181f1a81326214f792849637a485f014e9f034c04c169a79d6ae1493b64a7aaa0989372072053860d86"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (846, '{"ob": ["15151515f6ee44cb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580a112b040611a4ac3f65509dd3d24eefd49a0425ceca66966979c346c9f3ffdb2e22af5e7678bfa008f0e8c06e855d5474de5a8e3b26ffa59f1f57bdce7186ccd27157e5ff5fe5ca0ef52bf4a132fbae97bdc0fb0f3d04c16112d41cb1b571494fb7b6d02c1d1bccd90c8ac35776cfa79c2a1d50db18c24853cca5204fc9dc29f7df4518e12d93d0d27b5c8b6defd413c5c005b6b0112394689332558cb65cca8623e8d5180b20a3d245bef5344a5077533971c6866dcfd4b02d51d47c0157390b13d8a86727a07ff7f53e69bcdf1147505568726fa64b32280fb70a06d5dcb538e630e85023e1980ef6fc3e52c40633a2aa758c15b0945154f6bad00412890f643ef1df456edd6e0613634fb69e06ba5161cd966398397a8ea4433b4e6459cf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (847, '{"ob": ["15151515f6ee446b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b20873956074b2ca1ca248a5bb791b085691eb701a142e032c7286612f7ff94ac5968b9ac82f81289eacb66e146c64ae3239850905b5cc07df82b0cc70f0bfdb4d44c1a34ebbba7096d47e67c39e2383f12d8ae36f2e933c5f08a89c448c30ca2aad0970eb7218799ad004b1422cecb4ead6a415911685b5b32ce548125a7d0875661a0d86528ff7b7e4b2af8c6f29679310fb659cc4745d7b06f71a6f6c22349c3b8591d992cc0a95696b08764064b288c614d468bd3a37963e6b167aa1562d977b02c8d57a5628681c1564af494d63ed83d4c8c7a397be9784ca25ac7e7c1fae7a6e4797cc16775789b50a62c3dcfd41f2435b46276b43d04c15547a6e7df2798e7aa07fa0cddd576d86250e093511f902c43e5ab1af8cbca14a1dee01d44b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (848, '{"ob": ["15151515f6ee448d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135864e28b1113df2bda36af8cf8da8b8100867110e3dd73d654d1aa849b898f8fb1b75ad56a63d266a01e5941e98ad6d2fe827313686d3457f91a6306e20b3dbc9428104b01879feeffbc5f8cd583c7c703ecf0da478762c1b831248959b43fd7e233b7dc4f8fb5afb86113aaa3f70cfac1645b6b333503029073be4b1568ec7f217471ada3afaf8fb92fe5b285595b81a5c18afd8b399ec291f2213f43395d097ef9150e7195b6f74ca5c3592432860e5a9782043b04eb3f9a1abaf9e1bc3d11b27fd966ea616b27ed7873d9411d155000611a0b0f8b7d4b442ff0ab8fe52e99a12f9a8a3135b6b085764d070767dfd7f5b3c8736b216ae9197f82ad7e55d04fc2b2f6d1c5c2c37a672a0ab98b97915b5f8a8ce812a42033c2ed414a8e19db104a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (849, '{"ob": ["15151515f6ee4410892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358967132720c4e8c69e385708c4e9a2e809be4ab48e79183656b5dc04e8630425ca368abe7173385daeca71365cfafa4ab1d9a10369d36c3b0de753849a11d980a192b7d4ceb3be870ba3be338ae0815e1254b2f288a4c66794d0cf55cc9015b3202b320e650ae03ca5a0c2274fa741e4c1d1a2ef9f876b46af8d1fd096848e71fc10e7d780da58cb01605ddaacefc0202a910bf3ff70c362dc64827fae6795b8376546876ad80e75fa3691d01377974cefe6f2128257bac5b3ffcd1a88cf07ea338d49120283cb61f35177b1d7c651882c7feb9f19b9dd4d65dcb81d2be49ef12fae042291e72a745e0d93241d5abec361bad815504742ae8c4ab672f2681dbd02e3ac85f70ec2f0fb98a9efdd2a3b878193bcb0a10e536351e8398c48284f5b1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (850, '{"ob": ["15151515f6ee444d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135892a0c4e5874246b5ebe768dfcacb946fc6921f8b8bf9cf6285a9d030b9771d9b7b8bd8a9cdc0739beecb706c08519a8dfba3611e84cbc88a505ff0b13766726084aa6ef6214189c8202e8da1a9fbb4d365657ab20ca6110b665e67a71aaefb2691573b25ce6da9fb1db9bb363e63275db626b00b42a4120e2514c1fbb1f4f930f91d9861145363e43a84cfca3c7d116e502f17923b9eb12cc158026bdc0f9d5841da31730f7c06039fb61bda20871f7bf8788ec21943b852e5968b9628803371f0ffc446cb18a091b69e1343dbc04906747e07c66520c8d58567ca9151490237333e0734cdb5baefd105b092b4d31b17139b266e09b47810fbc51fa911b6ac7ced102e1b20fc7876090457d23e4bc9f92f96049dc676af3ab03739a15b809584"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (851, '{"ob": ["15151515f6ee449e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f4d4c0d5c4f5945ff597913ccc755ebd2a62bffa3beadbd78550a764192f62f2de5ef905c15ab208467ed11359da22aef2e8abcacbb5d1447178d4c4efc89739f40f4834f0c3e9fed5f271a54c85abe545b956cbcab0bd2216c2f63028a67d975ff49841f038d26fbc7282f4d0cdf1bc25b9bf0c7eb45d550753814cf68bc4fe5a26a831706c8d2e496f0bdc5230836f84fbe5192c39c1096a83aed9172be89d8102eb6daf528c483ffe2b9dbe06b060604a13f1ac59a8110e9f6a2178ea2c499d46d65c457221b780b6dd8c440df09382163c9179734fff92bdcbfb6fdc6a3b0763104a95e4714e67da5e85fbdf1bf0d255dcea5f90aa1b50e58aad767c816b07b4a1dd9b4afc6b1277f97d96ff05533de73af0769e37641078b9f32af92594"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (852, '{"ob": ["15151515f6ee44e3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fb7c35fe4522415a2d98f56fadbd0388f88e98c5328beacce4874567f1f72a97cc7c41b4ce3cde0fa5fedc508aba177dc0d0a9de8cf4db27ee0c13542ae1240ceb1e42310efde32aab0c78b4d855c82b5170b490c29ce77f01994a901035dbc63a3f8ca97ea24c01ab1a5dca364bbed48093e5d37ef13abfb47f193b966c5bacfe4afe0c45d69216fa004ce8c9de3967742598649a863eca6878385576656966783eec35e1f0a00568569ffaa636a7ae3126d74cbccb0d43c05c0f62bcb900c598c6dea7d3437ca0c286ca766c048cf4b786ce3a2a1b63fe792ff819f254b2385ab3e097d6d239e641a4ef28ea4a40efc1eb4324af72ae7c3e7a2c0eecd2d78daa302f7ebda51b686e45d1659389c42dab05ba6ee6dfb7f6371f9aa269905ddc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (853, '{"ob": ["15151515f6ee44a6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582ba69fc79692279e7a7908392246958a178f909cc3005386902f5b748b0d1ee93e0fc41a40a68bd0cda75cabb3de440a0635f815d60d387becd64ab32c90b3b2ff4000bf09881d6512d592d6c0e203f2b5f4d0d96995c4d0cbd7b231d0cbb70689dedfba781cc3954bf881435143594628d56304b5435006e90588311af9b1c84544c75ac1bb350bc59f8ba36d1e8cc75f4c7de8dc67828af250f08750389500b07f1e6f539049648dd33f30514c8760338393093e1aa17619281bd3cf312534a63e0aa90caaebb134c834dce302c83c727a37fc312c640c963f3002028d495022385f77cc313253486f0a53ba123003b9cdfc6cdc0993fac56a48e8bc43ce1db18bbfb9c4b84830371a41e123c34088f0300ef8e5eba2acb0bda6ee7c274383"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (854, '{"ob": ["15151515f6ee4486892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586aa16751a156628a3b85d9ab7680bc47dc8eb913965e63c2f47288b7aaa9438ba55c15b036b65191172738aad0adeea567620efbe66d7583da4278087bf913e2a250693c68f0d37bae286043b93161f5f4da12c75774d752ff302e2f73786c6992b1d0b7ea683b0364f49dff317175e9422884f8969df03b23ee1ca2fd493e166e75e4fa84c853f67f9ece4fcfad864faa60c49fd336008bea0f3eea98170dc5a3bc7646d9266814fadb6a0748de412510825fef743b9de035b85e9d4d2d0ebc90aaa7e55d776e26d7c1cae1048c5c18c1f037a0461eff94ce7e3fedb9e6fc9cc8426b9908f32475481139cd949f5b6ea8e76b81997685a3addd2732255f70b765c42232b6443ec9949e301700e807c00a7c56b8d95fde151acc89095740a045"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (855, '{"ob": ["15151515f6ee4498892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587db1987c7aed5055591d61b3396a8fc357178dace5251c4122643ea564a8e6fa851e860790a555bd51fcda27f839b5a2cb1fe73794e09f07a916442b2a152f8db64f3a97ce4d2fc7e89ec2b251a95d34af0a4d27cd79932b3391008ee4b32d44ea3ec51da59cc0894cadc5ba657cf911fb038aff47b00df0c1568df6064eb8ba2fec1f2c0868b5b344fed1d6c8cb2354e82535c5340667a768bbe36e80e4842afeaec8c2b99fa00918e60aaf6a3105b109296f5de1124ce55d328ff52382c9070dbbfd70face84d0f58d8da33a4fb3dec4807f2344f2be250aa6603f176e1666a9f0721644f6a55b86acc61b277dd4bd2df13e3a6d9add7e12c9a07605d267b3dc602d960bddc22dbd6bf92053cb9891ad82bbfa0a7eb843cfa9551b7a094a32"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (856, '{"ob": ["15151515f6ee4480892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358274fb92e7fde440ef11136b4b89f91a30fe648a787f64b7d9bf10127ce7123f132e93d764a72bbabaa1b7005ed840f3b929b43e5286d498b344b91c48e6b75be4cb3b65b359415fb5be1406c8a7dbc8fe3e5c69c5584fa71e1fc9370c19f664b956beb08dbd5139b8ece72417507651de8ab01b9b2008528a9cc35e6c154b542b93066e43342d515b2b545339ea79e91c5b7be4950368fb51a8fed8354ecf168d997bc6bcf98dee3697ec57fd4e5f0a499d0a67ab4f8dede0f570f065f1e538dc9f07b9ef73751e60a91bb3e6af2ce6419241af4d308a53fb1e0753694f9144f375b239808b5335f3b9a9f0d1525934fa74ffa1f8218af939717348731e781d1de395265ffa51b6cc890ca054d4dc189758d829c649d3574b7d0c5c002fcfd34"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (857, '{"ob": ["15151515f6ee4495892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580ec145ed63bd59fbcafe813b54605c553630bc4626a51b80289fee175203d212f5f875064b48e0de6226bcf23872ee419adf8a85b549a738ff0b2490fa46a3a027e962bd61f02113fd56e2ea7257e9f9b6eb3189b42deb4c9d11c4113d91112e057cbd420b035aac43c7243bcd9496155d99157dbc4976f5794f6807ce644e6d6b21b3a9a39818c92bda9574be2fc3d7b5bd016db0c21637892f2cda59e94ac17956f711a346611ea68bf8327fe8b923ebcff833f82310d1a5cc10c64b07ad4802a8feda58f8f29de072377daef8f22664ef94719eb86423345f1ac0f58d681f582aad5fefc0ceb3ebb9044c63ffd2561f49c6efc9481599aab363857f2c1f4e31fb6106767f3ee645c7dfcfa47f167986b61cf6f92785cf9f75900b9fa3601f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (858, '{"ob": ["15151515f6ee44c7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135815a64c0e898158eb3e09dbc6e8a88122fbde2e38c599d15a1e6a44dd9f74ba42a5ed8acd4a2ade50b12298717e449571932fa2f1632646f24c561b5c7ecb9f40203ad4de8adf28f7c203eadc69be827379da43d87be65ea9f7a8ba8e94dddaba6acc670e364762307870c064eae5dbc9c55c0d183ddcfd076c17fa372c1a29b33627bbfb9fea5f88692203738c5084475598298a657cfc375d3c1b9a54b69830bfece3470048aed1d4b07b6295f6e21593462d72c6f1582b70cff6e0e3724a54c7155fbe5fd0c5b1e0e6b3b36c21066f997c0309f382fa7822ecef8e1b3c975df0a859e12bec2197001a365311ab07421e507ae51f0024a7e425ba8f7cfdef0e659d3074777adb33c6c5ec6c2372657e6195f0afb2dddbac5d9945cdb435323a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (859, '{"ob": ["15151515f6ee44f3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fa26f1df1bc80cae5cc902aedd4a4cb34dac6afadfc53e894d39e085c9e0f0eb9df9289c3cf824a9baf675278248f889cb5dfc528e364618c77deb94ef9dbc80c4798dbc788fceb0ba64c631120f80cefef3e3701f289c2199988b57a8aaa8c46cd35380a12bd5da97bd551495ca0e9ebfa36ea3221259ec437143f05c6f632e33f66acbeec05fce7639206bac90c29df0810e0f53e0b8f1a318912c98c54e09995e2782292a09bcc3d9cddfc7578bcfdee2f5dbe92ccf8a24ad7deccfc7166a3522b47fc11d48a3c2d581cc647363e29fa6d88cafcf39ba08c61329d9547592792f794fd182967ed81ccd00295133a17e76a3cc52961d6d14b26ee291a688b78b4731de45cad1ccec1d44aa08e8a4aadebc6979828596c210105f82e27f7628"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (860, '{"ob": ["15151515f6ee44dc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135898988b6bc5b7b2dba63a388220529d7ca767a749b6f0f5a03859c1e629da3aa01e0f2691dee008f54ebbaf5639575b5e9ffd49b984882885ce06776fc9d393d248a990c6431a42a591408ca752991eb565a0b36cd20865068a5ea9950fb602b8af7db5b09f9d5edfb0f22a925ef6fd4c251d2b489207bee3313065c30abc6efa5c7f923bc29338136ae36d04db0e8df8a16ddb63fb5f0f21e135ebf2a981f13d23b1332303ba3ccb21a82b158a9469e032da1ee9d6f82c9fd270fb26b4d4f4628b5cead40e3ad3e7c4751f754447254c84c8d3ac9fca27bddb7b35aadd4eb2617caf68af73868f031b73861212a9032344fa208f734cec8fbdc77c18953d9a550161c4c8c5b85e0a0e0b9692acbd5bb59408cbdb680b6f3b47277c0a702095cd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (861, '{"ob": ["15151515f6ee447c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a97a35e9b154de25b6dfebc410061518f7646d618379b61107f771e3bd12276691ecf19898830ff3ca4501d519e1dc8ec866ca9288b0aa6eda1c454345807f753f584f82155605dd97218d72ebd7a8f257d4641abda28c459586d06f093e442c96436e24fad0be337c7462b3749e5135c64d0785282a87b0a7ef832b779d396eabf9a6d60d3d01a9f52f325f7004ac659d894558f98f4ed2bc2b1cbf1686f748dc63f3b8e1e6f04e2ef58e3d0b96fad126f5b5586caa3da2f3a4f02ff779339eafa2e7b0b052026f911be5f802d15dde0a59ec7f150f87f88c9c0e8d93e1a7f7a7ff26f0c19e876ac931423a2e9c9f1f9aecbf08f07c5a70b240662e0d339bed29ef64c096da4db2331f7ba84a7293d9a1001f94259ae7af5255cbb8f4825ea0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (862, '{"ob": ["15151515f6ee4419892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358916ffc6222854ce9e09b1eb39b83961fc67b9debc2982f360c65bcd8a77de514cbd4ab78ef547229a95fb7c51b0ba77ec9163d7f72891a4710f0486cb27d171e2707d452b9a93ce63b528e735cc4c36c0bb41d76265d8fa79edfe1f81ba92b542f6b8ff4503be6cd193230222e18f6792a7ef21bcd84babc428c20af72b36e163cae8b65ce833d509b049d23c8682641373ec852f8288e1c33de5c704621c67b5f86f0f4c7554bc54bcb16a81df4ca0b6112e0cb7743ae3261d4efe6ab5f4d3d3ec19cbece21009f4b50dbeefeb6efa7136f36b0db4332f5cbdd7e424cc57dd467afa8d459a80b394befab7d80cc5de705978429b4b2769c136bc4914bf7aad9885e334b6ddc92a6383946659903d199c9237282570169723841be1a056462af"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (863, '{"ob": ["15151515f6ee4485892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580585fc75c0f6b5526c43a96ec81409db9af7c6f1e103653915166d1c62340245e4bcde0d05ef36e815030e460fe1a817ee31da0e34fe899f3060c1bd2d22b1a5c59cbecfe373518d924f2c3a8ecb5d29fc1617aa97656355195a2745317926166e6edbb88a76c0c1bad82c9eb4d1e421d6a3a7dc6a752d054421ede7c51cc5b44ebf50985481ee8b0f1d5509098b11df5da503d8ea6c89672eb5acfd8bcb05541e3f8afa43068d2620a344bbe10408c85db0e79ca16c5518eeddd01fcc5f79b2c11f4b91077b87d5d966274e6619c12ec723dcd5a6dcd807d4a3a9e970546c162134848183a56dad7e73e2e0a464fb801ced898893bab5d22903c35b0278333a044915f13fb6112b1344cef51be21513cabe558458dd722476f4d49c2b27d9f4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (864, '{"ob": ["15151515f6ee44b9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fc2acd32ba44758af65efe146711de63ad6f625085b1bf2391511a558112167dce04a6207b49f1412a4eef16c642799ad117aac26cfceeafd3f82ac623a144cb9ae543cb1fe8511602ef88d84a899c0a3c5944a319cc6bbd8466655e8302cedfbc956ac38958ac76ffadfc0a1b296de5d81be76e560885f065d09bacc4d23f11c6440a317dc411aa4f5aa52884ded2e8829831128da7188b00eee40ba7b3a40ad5a2eeb5ee6e78d9c8aafd4e1f439a406b8271171b35507852b26eda7fcddae16b16359811ff0c01803ca25470138ab4da2fff74e1bcc73c1fd787757f9f651332174e67dd18f6bcbe0db41bd97d61782e15d60b63f73b2efa3cf4d1a1af401f0041b5805c935f4d67175200aaaffb01dc320a7cd2a268fb92def897720422ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (865, '{"ob": ["15151515f6ee4400892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b5aa6a9a0d48783be7d43bfcfadf4df8f772a1889fc0b094fe0fd9254c1159833b162688b658efc2db7cd9ae2072af22daf007ab7141b66b5b422a7ae96199a906cea6aa60361f3e20698610613140089bf15fff8e684b5d0f803396c1a049954fbf34b0b9dd38f1308c0e66bc3ac3bc0a36b87e088f77e18f46252f2a10712f392670294b81240ca828c8d72b41ad1c0d46d76a8f75ef9d9d208363eba3c0593d0da84b5fa481abe3a5ebd29aba3592aca0a55e43f7edc3623f6c23cf82f2829541c93594ace6496469dce0df61df27268139f5d95f972d3e14037d26787f72e63d5a6c3bd20f17832a20f540f767f39abdddddff53fc027bdf7e4060a29eee8550accb61dbc76f29b6f52cc627b74c71378b2cec2b61f9820ef5901cbcdecb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (866, '{"ob": ["15151515f6ee4456892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358bcdcdedd69e6dfb82b117515dce68bcf3ade1ef25a0eda431965de69e62fa0169d23088ff9a719becc2ea3053622aa4bf44a97345e2c6983f2c7339d9cc40ed715c6977629dfef699595bd7ac67e0446f951d5a366f5d44e0d0c62a328d12f597b2efff2d4973a0b2b4af540fd4fad2780a210517cb363068b32406e6150cf26d57383fa58eaf262274c4ab280b0fe2f8ae547db705ac02cb377a356717cea15a48abadf963c7c8fc64323ac5cc911684e267711bcdc2478c65031dfb609f00f933d32ea5b15228ea9f05e9573cd7e76aaeff271a080e2c123c0b201ffad18f5e99c3335f7027b12ead5d0d4e236afa12f0f66bb38c9578e75703d5234645ae8c9b0fa41f1f0d953cf5140903943dd1bda2a768fbc895af700775c2f1ebf2762"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (867, '{"ob": ["15151515f6ee44bc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b88bf644c33d822ee1e2ab79ba40adf5b1d75b4daffcd33bd31d7ab45b1b73ece47a828061cbfed627acf431e1b628b71d64dc5ea00d261530c4b81e31207c28450aee33f5f597f1df541533ae5e65c33ddf57a464c222351933177475c842faef0f7e999b722924b75dc3abb7aaac5901f15bf6c85e459edd90f69a6b577000fe7a45759745b842ecdcf5be9f72e496a9334ab07ddf81d6f32dc3783a6b831685e744cc273cf3d331d5b2d025040d7ed69fd29d662025a968bd41d3f20f07967f07d638d60fa7261a328027456bddc97f5d33d1b502748c56be78fe5f14c478a9a265284357ff08c1469acdb882134a9288315bb3fcb1785b2c1e8e83154e90c80e977a7972669ca0773b31c82b4de272a48227df4668be15f9dbc9652997e5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (868, '{"ob": ["15151515f6ee44d4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358cb64f1802e2d8ae84f631f9891508ba0f8b8c4f9f7f8247b15c205ae94c17cc99c1e2376398ea146f34e634998d3298e6999c5dd233393d571ef9402ed558715c58c818cf42e200144e58e05565361234bf2a48ca33f79917c2534041baf6b6c048ad4b27aeb13743d1d75ac08f0c6ad80a45d9f83431445feaf134d0213c21f358ac06b5f74496801a5b22bc1e683de16f01385d247f0daf44f8bf21db4179934e9486872859157166caf286675063fdead3aa45c1c236d0d155c39a74ee14ca160ad0b1e7a071f9401ad683767d785a2d35ab5e046f59ec450e34f274230ed8ce480fff589c2fb12d60dc4e9659fb9caeabcb65a865d6b7a54550b6290d3c900aa99ee106a8ea99917c2c52070cdf52bbf38551e1914b11f6bf2d75889250d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (869, '{"ob": ["15151515f6ee443d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582eae78f69481667881af9ed382a7cbeb25dad9ffc54c659fc76919b6d6ef22f8ce347101e14c3ffd2c3518e6d3c89e07ed88f611d4e72ac2d905c83167aa87947b25ca9ea312c82d5fa981f9a62565ba17c055ad450346851015703b51253714544e92e9b84a79317f6b79cd18e521d08ee9a092c8f90c1e7d319046d5d1ed8ec41f63e136156bf76b161450fb0b71c641947a02c18caf7b8d32231706935f6fad44a469e81d923bd460a60c563698ce161a04dc39bdd25fe0559858be3b75b66c6689d64f1052f5349d8750e4167e123ee510e39f4213405a7f4cbed3e6f46229754e4a8b1e615f95fdc2adc941af6e8c296cf88a2ae2a961eeefb8085a25bdaff0b00f3daddf90ac76d39a5e243f002a6dc77589a136be29893d824737380c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (870, '{"ob": ["15151515f6ee4466892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586969c34558982f3e54387f66aa463cb931313edd1835648451a8ad4fa54de22821bccf225ac2490177cfba93b5047f4bcade6116eb25d0b54af5412603fd4898216114b0da70485df5e174515fe78b853aa9d352ae3c5f63d749ede1f70b6874fe08eb0f79bbf74fb091705ec4b3448f249813aa501a05c7c09b38c80bcacbdda0e753e341d5ed35e78db00280adc1c5e7ec634ec4a5bf6bb4b6820bd80146ca332d0aeca6c23000d174e4de9801fb7dce4200762306dc6895a563704f3eeb4983d843b12749c0ea9526dfc8bf0ff8a3f5911c5e90e9d71cb7be50330914803842ea154cd00588bc2dd1efe5ac99e6f0cf231355e5c0bc84e71afdec960897b8e10df819a8dcb4468bea9e8b2755fd7394d6e5ee44d7ceffe73ebf65328ae530"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (871, '{"ob": ["15151515f6ee4494892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135810b5ecf450d833c6c485b148d967a089f14b9e060bdf55c78e4ef72cac0a848d3770a350415c747dd38adac070fd42d4deaf53c800fdc19b069f1f9c5098a80b3286ed158cf6dfaef8ae9114832473004b1fe6c47555aaa62884e429e5a469527ad82e8dbab21827e5e0a69738993d4dfdb552d7e3bafc003bd81b4df221a6d008a109e3b9a38f5ca28e6a8f417da568a528e6263e03167ac7a6267423c06578421df0581afa4c8faf98502d117c4e93ea512165b6123dde74fa108d3bfc775e78a8d524cd73686b524648a26bf73e6e8f63a722080187f8500d00caed9b767905067683f0e344567310add52290159856d6f8a3cca1217ce35ba2d7efb721e96efba9ab4df83f1d2e144ba0ec2219e3dcecd28ec66a2132d9ee5b0007052ca7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (872, '{"ob": ["15151515f6ee4443892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f651b1c11719fdeb7e0c7ab162c33f7e9f9455f54a7cf89d13e5c831ae463276dec2ff1686e848d15588f3263fa0cfa761ee9f5d42bf2528f0227734f847875dd43265378209247fe5f1841df5d366a93966c26894b7d1b04d12962cb7c569368317f3783fb0504b94db27f013095523a451c0d90abfec229a90d9edda1feb65c6162499196b9b809d7f9497621762e40a1acc07dccec342b452825e5990c78161d3793af988db61a0ffd371c22c8949724bc28556ee33d66cfcddd35ef28b1c49a122d2eb785dfd04a72fe39b45d597567edff5ec31d5a3a28d36f869dc89738132ee23b6f04495dda3bb5e9ed88f4bd6c6cc5b7c8bdf49984ef70849f59402e06cdfa2ecf7ba8f1b82c7698312df1ef0305008cd8f2cf1a85a0bdab49e62ca"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (873, '{"ob": ["15151515f6ee448a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135871bc26a55f77c3f66d1f09f2e96b1a32dbdc2ff068ccc4ba24e9a6f950394df196229f545d9285e38ad278bbc72d078f1dd3ba882acae4e61aa80054ed827e4e1d7e21107effb39eb6c5c37917d76ecbd4e91db7977bcc125a091b27a4320c505e115916df144ca3b9a2284fd92778e53bcacb92fcc6428e9b80beb6918e92579a0745ac032d06ac3c10ff995750a047571a7db875438d991384b802128e71271b492b1f0549ef9571f6dcc71a2812a1ea7a4255bac8b4a9e1be4dd7659510ffddb62904b3b1ed2a6d8b24da8d7590001fbb7b33983fa8e71aa275723664e60f3dcd34cd0f75da02d69ef6db77fc349007ae901cf8c2fc70f22bbce6aa2652c912374a0f98ad8e242dc1c87f3f4437b2eac3007a30b694f8d3eaf51e5453de05"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (874, '{"ob": ["15151515f6ee445c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c141b4ee51a9f56f96c31ba6cc857466651afdf2af95cd80763db4df881d8a65428360abf2c7bce58479e51b2db774a02d7ec32fd771dcaee49005c0896883ff4f324d54a8b787e1c8ddeebdd28600ef700a0ea2cd38a1f35f8b1ed2a51e047270e04391ff9aa716961c9bc3327a5a636345a18725bcb2d151b148cf5fda94152eb3e06f6aa8b8139c85ec58777800de4f43f5f8eeb2019066952b9ac96f290ea9b5b66faf0b4b63386c87ca6652ed5f5340e6e1b6e2f439a513dce5f6adb3230f90253ec45c3e335ef4f848c6131bedfce6a6ffabbd7bf6ec51839f90bd5632aca72f86cf6b451469005505040a130cb3dca583c5bb1922f1bdd4ef2261be84330d061e911eccff970a4986bd390e22b58a866a5ebcf1ef4eb30b0b617c83bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (875, '{"ob": ["15151515f6ee444c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583c7dc5a0f50916e6b1d1ff627e3915ecd881d806294b787ec945745d74d8992db95e1f8f5f4208d07c645b8c1253a745ac129fa0d32b1793216608f0d06b3f64236834567de60529012dd01605d29886e97c2bf8c22666a0e7069b453cbea5bdfdc7cfa512ad0efec2f1a8cdd9e5215dd42c7c7388aba5801e793e51eb94e2d39fa93ee81f5f9ee593f85390aff66711c14a16b35cd4416f60c4671fc51436a87847bca824a30e2b2ad070c3e8c3c51a998f771f735f082edc24bd9b927da132c38db130a2be89f7877812d645277d7bad8de91ffc0e86da2ed6c23461a8090e768264e194354e1a29218db28b28b30a67c9b41ade4dd353ff423d0b97cc332683829bce9fad90015013797504aa82204e4c91efe9d56a34af3eafb9c04f0dba"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (876, '{"ob": ["15151515f6ee4455892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13589eff9467143c3c659d668871954d18b6478423d9ce22c42a2fe182e5dd879f80f4409f00a6b963f20c9132a8c1dee08188a8bc02b19a181973d539c753b8f64226e0d85b56a7d69b77b38abef8216c389a0199ab56b0b0b4536a4cfbc9c9ea8003a1e256978a6d715b61ddc1e132d66d8c6a8bdf7aa7e193031f1f5e63f3653abb48dfad141e0fc1e027e0c969c6ecd61f4ef48b3a111276efee82d72a41b4aed96835bd6447be75c63b82b07773e2df2e49f7f61874ee120a9fa8d205b3b43f7dbc6f8f060ab867ce22f0733cd47c5da873935d596d2eb4d471290c03d01ccd2279174ec11db6871504cf00a4ec70888655f7ce6cae7b8d4413e576197acc08d11c38040aef98b263a65b6e3d811b2e8dbc8ef5b0ea04c2fcf103afc4f57320"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (877, '{"ob": ["15151515f6ee44d6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b27122014040aa53f965e569bf3b1461d28e3fe6a25a4b90eb9fd601699f72d1da8ba63c9e7abb162b663f4757fd9edc3184f2eaa14e3e63ba75a6a7905bfe15dbed222d7b95db90decb0de6b7f146c72f8fd63c55a7a91483eb0bb8496d137fc1297932d259d10ed29dab720c9496c05636ccdaaa50c1c58105d3f4a93e242f535bd06728f4e590eedc3d1deca20120dd2d58dbd9096f1544a46a3fbcb3b145a4a329a11ba972690633a7332c23bf586cdb65577e21c7391a8f984732ae1ccd176b0af350cf8d12eb504878780dcfd9195366920525d4d02455e018136d532769a4ec644076c05ac02ceb064cacfeeb1ddfa4e18d0f4cd6c7ed3e96ee865739ac9e8253bf0052083793f004a301ef0709c0a15d6d0ecfc36abb3757409a2c9c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (878, '{"ob": ["15151515f6ee441e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583c07a9714b44887e083a24e224f529b8c28a713c85e7774d3b8ba179f73bf9b6c6294bff4240353d82cd6ec79ec3dfcbf8b9a0f96c682af111b8eabe08cb457663cb228affa41d383309349a5932c2622cf0f66928eb089157f16bf39e0820c18778969426a0988fa2941d406cdd425bbdafb91285907a2c6f8369cb541dda544bbd4e3d5ecbe95200875ceca3101d44dcf204b3df5196eea6c7491203c582ef519f820562fb84a6103533e1b5b582d2295a6c5b776dd94bd23a8a0892b56c313cbaedcad4c90b6b14170e8b2c42675ad821504936b842b06b93c67341bb6c0f05a25d73c05d28206e8e4ad740cdccb480c8bb1593f77a49b3e87fae895827496cd8d106d8560b6bf03e26add4d381de54ab250d316e658cf54fb4c97dbce843"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (879, '{"ob": ["15151515f6ee447f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582a10287180d21037ee35ee6461d1c685f2843a7bef288211eb0940af38626c382cb7d2ec5c0b9295cf002446b063633ede3289cd9b3e8c115924373f985843a1d45491342ccdd67d829da881f3292a0199bf895c035e228f1e3aba9353c4d810c3be4cf80559e7cce1e6b59543393c2d1981b19db18bb72973e9a7537d3cc96ad123beda76463db727f38202d5e5f319c00539485768de8a88284de78bf1bd4e0dd10fdafae2b2ee72f851226b9b20baf479f872bb2e332fad267a8d1c55faff3a4b7914d6cde8c6d3bb64ff9a8a6f86452407b242deb506c3d29c06e4da5c8c742b04a63358c8cedd58f7d0167c60f6d4b82d444ac5c4f7a2dae99fb294153a590b8d72009315352708fe7111a38adf32d543f422a599ef87737b389c5dde70"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (880, '{"ob": ["15151515f6ee44a5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a56756d87b8dec14576b806665077b6b7a991a7166293c6f1d4e335c1475fae3e2ee2482d58bb29bd0aceea8257793de44199f0724238c20c50d4ea8357ae9a01dc4542651aa50d3e2b12e315fea1b13d525c6a0533c3cbaea388f5125ba5393ed2f22e2834895670ffbf016dca944870aabd347db6a5f36994ef27c68cda2149f10bd7a8bb0d1210d313e74513af7581f381dc2e638c0f07c596bbb4e1b0cc7720df11a0c04840ebb25bf178ebc07f7c15f7b748659744e540146f1453b752adbccddc374e33810ec2c8cd3dec6d2ae7ccf16d4dc72c3aac9c87887ef35262e60e2bdd125b97bad18773508690dda57788758b68141e51665f1cdbf79df1f681a6acad72610dc4984298dd9b1356ca7d245f458b721971402c36a4ec80ad817"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (881, '{"ob": ["15151515f6ee4431892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b17b3d12abd24c379492ccf610c1a1be0d940f90545de11a9dea7c1af04f9f2442fe4ed01c90cd98c90f1e8f58da78dba61516c0c3e0227bf17b0c61ed17414ed5495c4ce2d9073cab0f9cc39f1b15843e9144032d769125c1b2192972c68376ab0cef0bf462a95857a7fa626b1fce994f724664dd3811ba41dbb2f3bfd083fbf392d1fd6fab1d0b9ab3c8956bd9c8f615944b8b8bec6102ef9e9756160424821c9d408ffb81625492eee7d41c2384c9f0209179dc311220ad84144010cdf54036635ac7ca53be61bcc8193a5275632897aac669f8f24beff2768f822de10cf78eaa46b3db47214cea6ae20cb76936ebb4b5c9151d373cdd24bc445ddeed5b05798fbe11184aa06e1736fe37a201bbe8183d786b7e84556c51d7b452bf7df8bc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (882, '{"ob": ["15151515f6ee4417892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b5f478cba3899a668b5b70e528ee09145814f579acb90d2c6422da82bebab3d104d37059c5e56c7fcbae5749367179fd9655ee3b6bd425c37d534b4fc10af7bc10f1c95e29db9d4dfacce2246d4988563b673a0cbd8a9091bc007a6d4d61f10a51baf1be93b883cf03700f0cd228472ee26a9321e2223878242df69c8c3f215656433a7ffbde36b41dfeb6d6f175749b81c1fb2d57f8bf8a5465edc8c6866ebb3e3bf715895a76e3f5af4b81a26cdace99f299237d10e0ed25a6f3f42d57f675a7faf88b4acfc6587eeef81378b76d143ed319fb58b57964e68c15a8a4696f114371884d7f46f3e5e146fc31a41ebc0ae674e0f866446701e94db0c2734cb098d0ebf1461239c21a0560b08c50eeae86dab7c58102d89dc097b29e4d71929d40"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (883, '{"ob": ["15151515f6ee4481892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583b58dc960aaf9ac893a6e4bbc533b5ab40898e30f5884829d35c6793be673c7605a5e8c464b20700845a74158415f306cfec2b4363710719498dae5766822ee4f9cce878b77b1f36054ba9ffac58bf615dc7df961b7b41fec19d2c6b2cc7248cec9c5c198d2aff8fd2adfe41cc7ee210958aa01a5d5bba7e89decd90cf8a4f11d50abb2c87eaf545ead4ace3189f02d2b8a8a5c0b4259d91c66de17ab780897982bb1d1068a690abf7f09691fdb37beb1727543fd9971dc87a838ead78ffe3e8e3732b709e3a933e4e121ef13a5ea946319f0b068a9b1d2d8989c8aec25312cdcc1931937e28c41167dd368dbd9dbe313600badb420ba85709ade52dcd1bb1504b590a15af012ad28dc65dc13fc4e092e51f7449164059c016f54dd0eed6b031"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (884, '{"ob": ["15151515f6ee44c5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588354015d00e09459aa6d1e9365f579d9ce03b670a1d56045f6007b8eaff17c4b569adaee624cfcba17515580d0f36188ab6ace675a27cdaed4a2d17dbb86f79831292fbb0b29ad0fc862082088ef7902d3f39434c19fe28cf69f4a4de0554f66d89a3d5e985caa5603c7e0119b5719d2c5bd81efdac8c6f3034ff182bbd428b8e19450746567fa6a5e933157991de362769781f4b1b8a91c3b1fdb42696bd127c602c37863835bc58bf1c99b13181123f33c03abbb438d4ea5199ab4f6d99fce0fe3ed1fdf1ef2799951cc5ee806401a5315b654571f83eed3a6caa8e90f8a27344e63a147b5e1eacf7ee8c9e15a4d5ee5fa067f3cb4ce1c4604f02fe4ba87b959db5cd0fbb57b8ce06ec8870dbe0bae362e6489db4389cb4885fc149bdb8b82"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (885, '{"ob": ["15151515f6ee4435892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f9cb08296dbf0ff1ac10e4934278d80f33d2a964b29fec3ca29e75655514210eb90f57ad72bfe6434c7f9e8d18b3516e87c55dfedb043703cd9c635bfb1b2878d7644bbf0cfc7611e31422441e111efa1b3c606977485870e7824bd686df4459b328c78ab9a3acb65959d1d154f5191b054a26f317693d61903c136aa54e8382ac991d26fbed21b8ef4ed12bec47ddf3e2c3d0ce3f631fd50c6b6f9096bfe1db65f883bb158fb197ad4928bd3fcb20ceeff4c130020d43a2aa44c25494e1c84afb46288a231243f52afcafb0bfa5a24c65fb84bdec6a9b47ad70e6a490ccc27c41f8b15d5ccca53c33e1895bc137546932a8e9e68b7be6e830ad1e73ad9a7a626003ca172aae8f054cc3a7e837ba7d52b0881714c8e0892c1af804ac54286724"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (886, '{"ob": ["15151515f6ee44b5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584cf91282073bc45bfc73406184321f92075121390eceaaca721552b316a6b35994f324b4433c68596b7038e4cc29a9d1e724f3d4d3b2528c47099c9255d2bab1e97965bdfb13b1450ac9de3dd1b5d7174737b6d891fd51446440dff1369dcdb806df69c2a7cd57470d5c23e58e6d66d6e3a8268bb2f28b305076f098f3ea0844dd7c5cc8b013023e449bb112a938b0635ddca31694d04cdf5728c2392db285af5666fdd23ef00439480f1066e8a3c5988f2484ccbe788b93c88ca05dae66b087f3758f0f11114414ad4682acbcc1c13c893b3f5d3b8b2a23cfc130422b7245f6355d67337b260154f414b255e1504454b4c7fc06d7601e829d31e450065f81272cee3e3e2cefa3d19ea221f2e724e978b7e971752a7c135ecbb7814f70d61846"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (887, '{"ob": ["15151515f6ee44c6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358788f0793a5eb52759f0dbcc48e997a44b706853fcc94131cb601bc1d39a6783180558ae32770fb9d6556ecae103d1593159709caa561549432b2a0b2b6fddcc4620e2671d7b500312bb292cc88867b75451057ff039c3942f73605f040a0d138bf32b87f099d8e25016af20afc140cb09634c415e952135e2efd908b6af9e39f13aa892cf2d5c2c2bbb50e845facef4c56005aa44c31820ca4fad458bcdcc57a1de1a62b0bbace91c894d50cd81f0bee75893875d2e37332a68a62c36ab0a2d3310d9b62ec68a74b6afddc96ffaae7184cb2a504e4eb5e9c229ef103f95747227bafebf8f4826d883c9ef4d2d5a323ee11fd5288a12b747983f53c14c91c57b2cf6ad2ed8a8b36e31fa83f996bf860c3178f6623d8b47ade04c2b3cd48a2d4ae"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (888, '{"ob": ["15151515f6ee4424892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358897dcadeff325b8c2a1a64e88a1cf58dbbd62481ae4f6c20e819468062cfa88352c294a44bf1bc63aad898b72a00baffa642b43659956f74d0c46b7fac51d7d130a1d868daa567c103f91d6addb19ce3fea343edd33789a79d5ae4275ad6b5afc3e2150a23c8704686fbf45c54eb2a7beb1e5965b1c81eb6c30d31ba3ab74b27d6ceab24f1916e1a135b61d74413b63b9cbc1663406ac29826890c3e9a802fb8bb56a930df3ec4bbd87c1fc6489eb12e705c5b213d0ae24c0f38821b630ae91f2a930be7b818bbfd5035b048a06f2c96d2059f0b5b0f024d02179b76dffeb0a1e868d1e139dd5b20aa10ba4335debeacc97ec0beadcec9d160666196a967dc78dac77a0b7d9f7905cdb695e89e76f21eb3f374aaccd68324bd027730ce816950"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (889, '{"ob": ["15151515f6ee444e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135815fc0d4c6536b2be66e7e00223e92986a736fa85f2657997fbc661a17b9e81ae2b6e027f3c7fab2e6d6a8a8988ad375dd5c2c81e63116c3ed714718b14a224b51d821ab7bb8f965b41264656b94199862900029faed0232ccf3b80307aaeb74ddf1b02e7ebefaaa44c292f0f33da18c9b3ea6c395cd91cd57876c2ca27c582e155309ca188ab0e098c81ecfce156aab4e073c1c2f5a6839674da4329417d52790dffb238c3497ac0bc2dcffba3ebd83a6cb866e727fb6cf5fd5d169b9e8ef3bd8279fe981c46784716ff4d22e844fb469a6bbbcc02fcb186cf8373c57c7d513284e16e4e6078a47eb540cbd0d78afa9d84111b80b779d95dadf04bfcf2a72c445e51f5c8503c2f618e56b533505d808b8b793d9185e6e5fb0a13b751abedfc14"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (890, '{"ob": ["15151515f6ee44aa892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358eedc65fa4f5b64f87a8f1951e39004c55ac482c96db271e9d7b822491e69962016552254c453d85e9dcc21e4d7aeeae9337973b01504fe21ff1a57504993d4e66c56a345dc5a71c2b908b0aae29bf425194453004d449cf2103f1110478df7f861ff04b7135468878ad94b553c81cfc69156c3200b9bf383de8261e4f747b60b913c2039fee233de108fd0e414f676c322e74a1013164ad6f8030e0f140d8fd3efa3085d1d5de206110e0011c46f35269d7d4f99e2f45260776f38fdeb83443254d50ebc71e4dcc1769bd01df34e712db0ea9b4237eb11f8e9917300f17f1b6aa1fa49e7c9bd331c54ec2b74989805ac39c1dec4e05c2ec70b901131c8e39c5c8e25bb93fc91c73057d3e5840de20856e75d3a04c25acb41bb46f616b83b7a47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (891, '{"ob": ["15151515f6ee441a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581283646479370cb3d38bcde0a31c52cdbab41df948fcc33052d0273a2a11de7a9c57ea06b522d96a64e6a223176dd42df94f0b0f2e43fd447578580c4ea0562aa085921bc1bd67906acd9cf89dac4aae7ef346fdbd09c881cf87d661eaa723cc3332edf24ae54576d827c80f3ad0427117a1cea6bba2c3fff70435d8e105a7dbc108f09275e0beedc3c894a5d769c26106c33ae758863c053294d9e232d9f149eb629e0c0653f656e2165e2bacdb9d6204da92b9fd85b442da2dcba7c44d14a6330c9051288ae634d48670dc4201e53630348fb63821e821d30a429ecffe993a4f6acfc440dcd3ea7a9f36eefa64771b6d9ab3e246eb247d3a0558ebe20c522e45c1300e76628be052f0af13b92fd9ff658b88e71df41a96b650bedd5ed94241"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (892, '{"ob": ["15151515f6ee4415892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ef9e6c4cbdf394aad94dfc4695dc0bbb1b80edd1340cdd19a57cdaeceeaa2c47351f5c9b66269a788d89f8193c83a26867b5dcad223094a2d710023fe0066079adea420585a1a866d82ec274a47ba6b955f76493ea663f3582c387d8c7eba48b6e94c36e88347a59d09bdcee1c8bb08861ee2fcb952df8fdafaa4a207af7a2a2919295c6f91e0a926bc2e15d41d4364c4177e5b7cdebaa975f7dab468268768a2b2d5e49fdb59ebe8d36f2dccb591dd70dad934a33ece75d4321141cdc5c46c08ddadd54ff49395dd72294a108f5cda24faecb51065dcf625cb14ab17981203fbfe7574f3efed10d2b18dbb63237524a4bd493bc743d5e3b76fe84d73eee80056bda520c26747085e14212b9f093c8a6ec0a88cf9bf2011b093050b0e61b461f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (893, '{"ob": ["15151515f6ee445f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358967378ed0bf43ddc87fa7e517211c6eca346ddf0a5e27cb38ea8f4845e671dfa90ac30ab49a85cee1de4cf4387b14c248033f92739d9b1a22bebd173236873594a9b06a703c5003b91da3e7985e5a6ca4d70d709afab7aa3eaa687cd41f8fcc4246926cfd35a843e2dc0ba78179ead8afee837909c8dc2b1e2ec4ba3f2bac17962fd567dedba72179304a20aa6791aa85d1c928cc47a00a1f9924fbeb687ac5c72960fff1f280058c3280e4fcc2fb8c9c745e450d8186e9eadeebcc0852e2519ae0348ddc0afc1a48784775f79a24382bc8e1c5955296a66046ea1c5eb8bee2a35a28d31abfcc45610a80f79a6d8276abbda21392eb28dd576734a321db1e7e8859c0b62847a45d7316e210676a2b1452f0e6fdf8151590f463b3f9e52aefa99"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (894, '{"ob": ["15151515f6ee448b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ea9dd96561ddae814020402711ced31bc49df01b804845e27c19d6f52bfc7c5d000af891173e881e054f438b198e8128f76745dbedc6e66f7ce22767a7d1c1503c84402710582651924862a0471d5c96815fb81d13b7b3eb98cc2ddc9b41f1569d56cd5d130b48a04fdf811587136a047bdebb831d42830d7a7e3a715e15ce76cb6e12b8251dec7d676ed95b40dd502874581f8c721ce35479f077f40f935b2de02d634b5a5f0f7938da06286deae7a28d0a8763669c5e4279192e57300ea2fc27e1143c872ce9b873fcc067f42b15888c6413dc906f8ed4a0374bdfdb4ef90c05ce1d77292f571c2b0f199ef16875c3a2e9b1e1bfc1bd8a0356c60c4c66c5a2640fa0aa13f72e7c33f3b76a2a6716a61c82cadcc394afb521240103c6160d9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (895, '{"ob": ["15151515f6ee44d2892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135843b3fd10033cfb1d8759560e7ee9395c6bf36a447717f594b96775e0ce3360bc5279633a62596de3a6742967dd5e543c9f77b3eb58ae5e51b62930332d92673ad7b2d0a52b42c3e3497e368c84f049354fb2a83e969357d1097d10803af779bf96a77b31251accce377d0cc2181b9076d93b1956c2c7daca1f6537b2565a806c37d57e2f46b877ea6efb56b350124bd4c9af3f4dc42d55e94694624341fed51f23dbd25e7b8b425a23c27b475151697069e19c44f715854384672ba4772eec98807e630ee0ae66629744b24c584e02e69bf5e51031b85355bbb899a457b3290339599f65951c3d6d8cd8aec0af73ffb06e8d2edcf70268f8ef4bca029c71abbfc51ca54c3f57da7e218a1ea45c8bfce781927324bead43af34cd47ddb9a4bdbc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (896, '{"ob": ["15151515f6ee44fe892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c0f530ab6d747c874fa03728f30c31a50ef61bb5d7f8c5f17ec627148828d8f27da95ac862699722cb12c241a01520f91b30804aab21e9cfbe0939d6fdcfe4dffd3d40f4219fd323ea1a1e027c03922f2d9917a1e76004e6bc20795898a003a9fda561fd7891abb6602f71910d0a9f5bc3aaf0e32b95f5c2632a1624736b434a1fb6a06a02c63b2d64fbf7ece1ae9d9b2561ffde98e3d3d2c06c3a444f7a418a1a561b80b27fc6b30df5cdc658a136c8871b6037317651fa0bdc2c6cae0537eb32b6281435d5d78c664908ac792853154f213c5eba057b11c96b7e72f3735b845d23a8f02eacc50299313369cd761b4f9b987a80e59faa3d41eb7e756bcefd1a9ac735b6977b78e14accba687359d6520a4b1b5d9fb8dc7a2f179502c922a602"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (897, '{"ob": ["15151515f6ee4475892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358aa181c0de10e6051a142f83a0b68d7cf625c45cc5a1cc89483e1ba62ec6b035c89437410d55b87b64162bc698728135f0c405f49acc765ef476d3bd0fa6acb72844ef2f2405832d8219cea1a603aa1b4f1bbac1bb601f1db5e9d8627e5f9a056a45857bc61d8191ee97571ca8d691ae702e50613259a8560607bd037088dc8f049448353461901f9ec77f561fd87825cc1579788a0de2ae5e20a712634e4f47ebd3e7bd46138841f590cb9cd61bc5bfd83987f0494e0bdfd112f8141f56771a59d5dc1dd98e9f25304f771ff360517838ec42dab873105b5bfc711f25b53760045ce2d0ab6f5f74e29155e24d62029c99a1c35135411745ff23ddb55fee2338615e245e039ea8ba9d530c8547d6cd846eb442d32b3500d5854436a87b3414efa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (898, '{"ob": ["15151515f6ee446c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e102b79af62a6eac7f738ad7dd29e328a179d83e39a82e165abb4b45ea4686cc69c456d38e4dcc1f80d28ca90a1cfa377360ac38bb2a83e722fb1b9bc901e97d8f87d82f236a01c1dab1459611f5e8f559f0c0736f1de47ea785ad3a48012d29fedeaeb1754bee091f99214becc2632fb89debe5d252e79c6baa49ff436981505debcc32677a3ef9345b65cc35bbbc1cd60ba9923f56287fd8eaff99fba0904c362ff7438fbbca5fb2891815d5296caabd6b484ce3514d1bd16a241f6f645184a0875d6ab96ac09cece290dcd8ef55aea0566b524e22de02e22c0d6ec5a6a73a86fb3caf7700a082159687de4a8bf1eae2cf8ffb92c6c9fc7facab09a8d3c027dad6a1c57d08ed833a14ddfe18e5f0012c6ed0b58c16fee2c9348214667f4e55"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (899, '{"ob": ["15151515f6ee44db892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f570befbb56047cbd176aa9211c1100214b95e0b85dc09fc562b82daac0a5e965ce84cb5a40ba462c8d39ac3a73698b300252ddbe9df754a56676cdc0cd43ff3398d83d33063f2e9706aa16ca222b7ab9225b226f2812c896f4cebba7d3c5b7c4f4d821a32518aa625950683500edf61dbcafe57cb8842f5d9727c014d296db8318610213ff09ed0c4068c7edf032059240ad2a5a2b9553da6d4b84650f9526a57faebcbacf8290acef54c483468491661d2043f811c553da8cd34e2d2385b92ba03ffffac40fad75b8639d5e950a63bc00dca43a5290551f162f83b3a1c0634615f78a1f2e5e1e1f648c7be4bfbffc75854bd3a697dac278bf942df17081739466e552f7cb34c576169de00325dde8f1ca5e01d0967e344533e8defe270d2d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (900, '{"ob": ["15151515f6ee44ad892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d1debb85a6dde4e3757fe688dcc3869faa77bbf4b5b58f71d13bacae3eaff36e5c19302a0572f0e73fabf58f9b10062af1f748fec8aafea12e66a6b3641c196318433e8c2cb7f881d29b3a61d4f211f4b44d87746a2ddd8da983c894af90ac37f63e309adada461688c420440734b8f8f7747de007d358cd32b54dc86d406a1671579fec3f996abe790ae7c0ddf2e0f682a01ff216fd91e105a3e03ede51df0cf927d4c56b5378de6c0eabb3202599da5bce2e9b5eab04738bf2da676b1e540de4538538a525b6e6d0beb9cf24ad264f504d71a83e92d14862a96d3aa112c6e79f8584275cc345c6a94326f99ba8ca139cbcafee5dca65c59a3beacfdc4504261069976ba26bb7e03c89ef7f13291de6d4dbecb3b4e43df8165d08216a6d82b0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (901, '{"ob": ["15151515f6ee4461892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358437f329fba477761405a9fdd7a8648c4f4c36d73ccd6d09b2c9e00fb8de7ebe1096caf5f9a30a60a2ee530ccf15bd244e85da6d46151092a5802fcb5d06eb88aec127d5af2a24f0fba75ef10b589cf88758547911bbab7beaf486074313a64b45d156e7752705c900eddc86408caea603893d4062a3885f0abfdebccd23e4500acfa673f232c68045f8f97b1b440662e2ee2930444d5fba95a43c4ac5bda1daa56eaaa39b301e9909c017cfaad550571a41d8bff7184b53590859c09bb405cb9f61667acf99370e59e70c307c0ecf9676444ed4a3d4b064582cf3133a04247c3c309c240fec9e3806683895135788d88a0a1933cd3f660f128626e8a7b210c2318b1474af58a897608897b3b93fb460cf00d00827307f974efd312103417d673"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (902, '{"ob": ["15151515f6ee4492892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135805778db44a62439489bb95fedd58f48d119504053bcf5105ae708fc5350b6ae8cae5293a9ed5663cd3a6c7f40a57654b93cde835f2a952fa74c6e248ee3b914f306493a310d916164a1a3ba4a3c13da75c944c4388c917265f892a40c09feef7b07dfac6fb189783ec973fe7caea4edd8a24094230e1ab626f695b517c7efdd66dc750df3c260d8110ef4b2fb808e9d5a9a1b74875a760a3e713725ffc03d584f2eb9b1918c176c5576211724e801acdb0153ce356f47bc8e0d9cbb15e27adb8bf618d4c561089f60e8976c88a76ea5ce1a47a3045304e23a99fa87a4961dfdb8ee72703c58b265c12439695559abfdfa4142b8de3f8710041dd1264c0a12097fd628d82016b98c89be3fc8daafc88571f84081140fc17411ba7632177b81a52"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (903, '{"ob": ["15151515f6ee4430892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ef61530b336d856c2c27f1fb27879ec02f1791703bc3b6baf2b19b7672d08961ea326eb23b5eb937004da1d006681bbe9ab14b44f4d36b0d1a345235ea9a669c4755c862fce578bda61b7c9c7ce9f9ca75c146bee559d005eb7b2f9cab0317421dcc96af6031a8528e281abf4eb5d020b3fb098444e6b2aa3fc324828863f0b1d0db6041b0e08fe8a6a197cafc88b06b0ef8e79226d1c51f7f32c28bb68e7d2f62e8b42e7b87c8588fc4a5b083063850a9f3a19b2c89c48698d60dc916496ef0eb2b72952338a95484e7514c0d06b621b63ea0a7e145adf549e51c9f695fece670fa630fa0fd8c6481960612f13d6ed0ba9df99373a601f17e4303298f640b289dbaf0c142738c767b1d7aac35801d979194959e4d1c6e9e5ef2bcc8778a7dbf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (904, '{"ob": ["15151515f6ee44b0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585f36079bd6bd1cdd918c995a9d1ebe54dbfc2993eea12d6b323a4721b878df8be07b492cb805a5a61d4c6e67bb30eff8356b33decd1004567076fbebf27d55e52089580d8c2930b185b7c11c8360e88f61482b9317fbb09372596d4b9066700456fe637c59170be53edfa546a54582cbbad1d5b206e32e85487ecc320694586ac6531e18c668a6b747d483d3b2f9a1a9793cb1a14c9ddd816b671f8a0075f4a73358507d78249fb891980bf45fdd0656af5152e50438e049e3e9a98d1684794e528bfd7abee6490eeee33f37f4324fd3958fdb190be0326652a9d4b5291d5251724047e3e1be6323ea3704729ed76d69a0f30076b16529c9de1390f60eb2e84343b3e11570b7d3e2bb3fc43d8691b3782c335a8ca36a17ccb37d7f22c29ac7d7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (905, '{"ob": ["15151515f6ee44f1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587137a3e780e6b0de1fb0ff446480a501a9e62e1308654d0bf86d3ddd4fe76d4247a838065b5d5a5c2cace8dac6d1f15e43caf61d3d4bbd34f6298b8ad818f069c95eb6714fa6d0a6fdc4e73e0bac624280f36471dc4efdc7ce1e9cee96b1eaa6b8647012cd7b07e915ba60dfdf33a8a1425380a5d5d63bd823ad731ee060145f249ab3d64100069a5d93a0a303b5adae24181e3fabe12e2a29d2feeb7cd7994c5cf996ff7739a20b36716d31862da80cc1ef238bd2d08bbfcc2768cb447d19409cbb36fec1192ef75793cc0a03b69c85d7fb4365810beccd34c92ee9e23210c7aaec25126c82a83bca3b3293997c199fe3e0c95edd06e7ab699fbdd446ad92ad147ad2ab5135462e58f44ec5cdce834633ea3958690cf7c85e463ae95a32ad43"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (906, '{"ob": ["15151515f6ee447e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582079fbab2f6dc6b34d46132ab7d5c61dab46ce6e4ad3417f052eab8338f1fce81d83a1e55a40de9c4df30a246eee767dbe42c1756a7bfc921a0fcb5a6c9ad00510ec15937d9d6cde8e9716c493e98bfa634ceaadb5a69a62dafa097e34288aa66f04eccee8b91f9758fbaad2205f714a29b9e9350ea0f93526bfbe030286230aec4f18f6bee6198c451f35cf8e4fd6500182becceff87436a5cfc18527ce456b0e29f951c2ab6dc97b8c4eeb57fe779a171c497ac4744d9962e0708599a8bc74a62c9b59c2bcfb0e88b1924f4bddc30deb6f0d94dc20a39f58ea70e67938d9e4409ff35a6fed5aeedbac4aae0b5e9a077d0b7faa75991c7ac3be51f53adaa83473a38b9d6b96a840e3365b4375facf82ab07d9b55a181c6a8ffe1b2a814a0f8f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (907, '{"ob": ["15151515f6ee445e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588f69df6cf43f3b529428628eb1dfc90c1c10a375d85f18dec1bdb1950a012d2c47b2eac2d397f48f997d0fdfed2728f4cc9289f0270e9f7161f07e5f095c99501b11804d81088ef6316c99542a8ed91d6e214902ff7053aa18e4748cec561b6eaa6d2a854938423931329a2d6417e4980d326134f5f4bd81e7d5eb0e3cb78a9ba9fc98effccfcd6c2a23b2cb0626bd4dfc5d0eb7488850307caa8e524cf9af8f0f559be3df0c42b2f312bddb62fee9cabe32778b0083244328eae8ff793341ef34206de32494bb2c7ec05ad0c3170ef9d62b44299f29f89267ad6e62eda6e4ea0a80062ae701758455498e2ff9da972dceaec55c3c4b05ea62e12ba1e6c60a10f18628cc546a815a82f798512480bd3d3357478f16924e5c8ed3969fed24a997"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (908, '{"ob": ["15151515f6ee4447892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fa2c074795e39acc315e5b6c67c6ed519523faa380abb0baf7c7249a097a953795c86761a82fc0dbced6dd0097b840f47705b685e5533302bb2cf059a9e5e0505182ef40fec5d3110a6942b2ae7ed4da08403cc72a1609026212265468fa3e0dc1719093ec3583c3db2d81652f94ecc397ce95fb64c96f80cbd059fc9c17d6304ac7f23aec2d1103286e0fc9b2620a90ba58973093481402c348f7b32b0d3f81c5a4d51caa4b318e8276f8acd6883a251f0582b826a27ef89210d59387cd22ce3f60bc2c8f833330b9ba0d17acf95fa8fde072cbaf06dde03ea3ffd6d908c9bb356ef7d4182d03a2435c370b45ab6dc046ebe6a4d1128baca15a686dd554a746fea585f73891d5a25acc39f019b0e965ba030e464e779bd2aadcdc1c78f5cd06"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (909, '{"ob": ["15151515f6ee449b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585bfdde271f17636183fe89a12b7c325f27bc04729fd7c73b774eb9c5ea5bc3035ab8fd574061771df589e179a52e911d2b0c91ebdc3f1c34a781500d2a55d3d6da474551360d13bda397582ad5f5b57d5e092d0a5c1a3b721a50174f633b8a0e33f93a875fe6e814854e9cfecd65ab7ca4d7eb5168a31a598aa066f2d7218916ae028b77da454189ec61b4b36c7842b770a6599465cc518f81a74f52c98f7abdb0ad39b552de0dd919c82724d4ec6c4828e9e90a34219d71134faaf22287a023e3c54306c35476a290e3e14174f6698a0ef2c05778c065e6e4368e436c42ee4c2b1690ba31054c2d13368ef97c1866cbc3baa80c9b459ded15cf37a634822a974fa26d80d88d2ccb03c7cff02316f0e391cf19fb7342ca8b32af123565e1d542"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (910, '{"ob": ["15151515f6ee44a0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f5337908b684b4cb6cb9dcbf475602ead85a1f1749f09ea8efb3fcd4c57e01ce008400f56e38b70a1ca1a7afda37b818d97e3952fb45b1785e4f51b9df0e5c9a93521d9429ace18b6edcca85c303ee17e6919a1b4181a33d92d0a0b4741c53f12fa8462863dd7cfb01e73bfac37dfa4907cf910cde81175fa1892727e0367ace73764c81df6a903eaf21f9856218025c3f9617e354acbdcf8a34f42a88f98db8788e2f5b6e259d58bde829abdfb4ad63af07ad8c11793f412e30431e0947f6fc09772062202957a3846a2babfdad5509f44021b2faf0d876afb3bc804fbf1689f88c27923a6a7d9da7301bffe2243dcf850faca969c2eb3f32b551bd638ee31759fc49f3c981b5215127b226a6b8ae1f118643dd829f2ac4c8a102edc9b0090"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (911, '{"ob": ["15151515f6ee449d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582858a44174313d82ebdc17d0379a1c2982211ac938bf3ff1a6065e5b31a502f4d7a8a3b11144cf69eaaaf39c67fa9c212ff9e6e3f63b31561d1d94e872ae52a86e329197ba70581fcc02501f0af7af62af9bc501c4746a0deec5bbe1b82966a1245c08043537e6d9c60eb162914637d356dda87bb2492850be14c004b276f1d648d88e8f69e334d9cc7b76215f69a9ccf9bb5075f40aaa88172ecb863e4b596c04c6e52aecd9a63e6ac750274b2151934982cff0013ae9a1a6b932787cdd46f563a15067af088718a5cf1d7e001d4645cb7330ecd4d5bd0135e076bac47d34a726ef64d1e2658c3413c36a8b37e76f1301743737e6b647d0f8d8ce505429d146250ff1a305291e971ae2113afefa5f278c4a6bf2eab6c980dc562b636466429b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (912, '{"ob": ["15151515f6ee44bf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d9055d7bd64d346d7fbb963ae7faa7624d3aeb876bc2c26c56cef0834c1727ebfe3bcf0f1eeb5a4b64a3d2a36331ede6ce227885a0d4f5f72216f41d936a14551e3866d370413672dd7b0d9af6801c767979214fa9d71b9f942f19fbd2b2d5cfa2dd789a963326bcc8594f98ca925351f4f775d7c7060b290db3fa3730902874c849f7ff28794718b18ebf17fef7df97697501ca9ce1d1e8c1511e27378d4bdd01dd71636a2c1ce2817de1107bc51c14cb8bddd555cb9ac407d0f97cb95f4d4c2d42a79be5fbac12e408d95ab3a0930c289d82fcf27ed2b55331df2e04f7bf1240adb8cee32d45dd47111192dd3cf14212696d176bc0fdc4391d2f6131187e9c196a6128ddc5a319ecc74fc292aa9047e9fd7831a878c06fed938c7ea680a102"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (913, '{"ob": ["15151515f6ee4478892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358999405ac3575b8a7618d3e303d591260bc32a4ba7726d713b3d40421727661feb71f03e7d5a5c1f3f8f3b87d8af986f468cb7429073fd57d9ee4b90acde4a1788041a73d9c5598c5dd54db0b560b7a62db5333fad1fff89d4264ee8b7eff15bc67837a0405a6be71c8933e2ee73f704e00258fbb84a38d3115f0baecfb95a906edeb0ea9b2631d8413f1d54e19a2cc64fd69e430f2a62a6a5ec4b77b68edf8ed289c67d41e22db582c9704cd087c0020bc4251b0ae5bc5d1bda720d385457944797c6ec5cf357c38b7acf066c7ee903071bc1e6931687358c28183588419ed3f3ef0976ba2ba77e9b9793ee30769632c2447298e9ba0f5a2ccf36fb315599c1ed60aebb4a8c207519e64e1984a2e154235d5d936804c3321d6260e838e7a5153"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (914, '{"ob": ["15151515f6ee4467892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135825e75de08a89fc7a972d82b662e37c688775e2be096d509569709da6264f57caf6591e51d505f2fc9e256dca4dcd7dd90dae84457bb7048c0db5237da2056dc089b9110054fa1de6b271c5f45a325f90b0972c79445f818c76568fd7987581de8622d798aa9c1999ade510dfed33206814b03fcf8ee12a47c69785ef3f2f78a336d9a53c4ec89a4becd9abf35390315f0f936ff9ab6142563c767eaf8be0bec404e35291c2b3f972977326971342483476879f0c608b182238bbaba61b708e562d735fa57a0f5892629140335ac41101c22d1d1449229bb7403f270515cc2a62e406f8afcdececf3fd7e3520543ecc1fb19611ab07568beb86a60a313ec5e7945408d20f16fb18f565525a351fa550cf521fe5e3dbaca8112853f9e633a14e2e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (915, '{"ob": ["15151515f6ee4404892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358149b13143779a8f156d22e33776630fa1e594f58d5366433f28e527d32a9234d4623cfbcb2ce04c4ec294637491b88a29380488d6fe3247de2c36836706b5b8d3b086b21f1d98f8cd887cd4e490a963804cedacaf4baa97db6db7bbb791fd9a2470f2ff3bfac8a2d917843746f7c056d4a0d62aa41d65dc171b94e72b342811b608656d3fe51ad783949b6ac21831df59e00b439543cc9636c078e86a40c9fa2bcff524245d7b695debabaa28f757445dc99df2654e6ade2a431a545128ce8436705ba8cc7d60c9e5c399398b49caf88af69b0c0309421f8d7a64c3a40ffb4c275e992ce05aba1eb9826909433e4645a0bc2e7110ceaee9c2e6f6ccdaf81345ad2a8e9b405ce1bf6c777a6ec02daab8a343b4813822ab31ed7a6cfc96e0b429d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (916, '{"ob": ["15151515f6ee44bb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358471e83188689c31013a092e78ccc31aa435b8bf1af2160bf264c78dff944f5e549771fe5209ab09e53920a4295ac07d0d1e867652e9c9cce10ad822739322172f315a6a0ba6b7df51d455801ccc892c751cc396d08780870c02af371089c1d51d80a0c2c2f3e20968cef2c71fa49dd96108ad98feaead8245e224ac1d545689ff6040df9b1a6647ddbef60ad9f25b7e5a5318f235d8a2aadcdc2ab083fdfab35b5b11dd5a96af780cb24a67f9b74d51d26f1a4ef8e7c1495b1b5939e32ec82d321d2752249584587155c2287bb69982db963213234cf5476f00b87cb8fa7428134f99033766db7eddf74c7e3c75bef1b8b7953b023cd35cd8e714295d6b6a8691cd75f6f65ec6532511325c2e96ded002081a9cbb6d08234c44f45066362d41d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (917, '{"ob": ["15151515f6ee4473892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fa23bf3606c82b030f9670b2aa1d15105dae68f003c473418bba9a41f9be02f85743a619a47fbfe0782c8be7ffbec5f718e9a91ab5d71f6b758da5253c5be2f2d51f20e7929c365d8245567b8389c57adb79c3590cd5fd723aa34b5cd73b46f4a045347e33cdd53370a3a832c2473cd2bec5313581e44b667a68bb35f35e11b2291601283d1dd7548c5750f15ea59b751aeaeae05919ca7c1ddf756e04d57ca3a5d534e0990ab90071b669a3510100afb6c9c1d48e84b959956af5652d7ac5e3d78fcfed13c15dbd68647b18374f88d4ff5978bf1904c45db69d0cdd0880971bd79cfc16e5ac0c10bb2e707bfb3a6fde480e170023d9694ad21e9882e6088fa7d99ee037e7117e5fedd8e1c537dce99f8be1548c17872418a94fd027d50d0029"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (918, '{"ob": ["15151515f6ee441d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581ee5337a79bf438037c986e798468530fc2df89dd54d8e73e5b5ca4e15bedc43cc152ee9db1ed437758216d18b97c85a392f7a5d6dac75f9c4113206481ea45e2ec67ff478a1741841ceeaddc971725de4ec22063a193fd3f40e653ec09715bdf95c6c93ead101bf4b6bf94a2f49953ec25e7aa7fecfac2f95bf2a0030122b072bdbccd53117ac86f324b60b036c60840dbbf2f11b2bf3e786b1dfc5d182f99f4dd678dbc1dd5b6ea7b7f33c49f4a2be9ffc0302a66cc1e4f66b77dd3f7b0d298c3591cdcadda36c72132e5f9bec5cfa7db469f1ddf09f34e22d7b623bfa65f12cacf5ba794ad373166c835aa9b34064b84098528f5b28003268e1aecb1d55a71f4cb2d0cde1255ac16ab34444fade66b1fcb3327abf79de886734ca2e6d0b63"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (919, '{"ob": ["15151515f6ee443c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135861f78a8b8685558fff79d8736b970fa54d0cbb5cb0711b4dc45045e425c8e8dc07a6e95b3da6d9414d20f0ae1c2d5d54663fefda018218ddd32aec20c23a371e9a73bc509e64e5b9694ccd7a3257f81d6a5fc72a5e1f4c26e34c668e727620e5cd31c7abef775d45131ccd5b21473ff81d3336f662401734083e85a34b7e195affa74b4301390dac21af9ef3ae9e5c03b626fd991389ff677740d143fbbde32445530c2317ddb76bbf8ffeae6c30af1a7d976b0d465513ea05dbec1824a79f1dfb1af9ed8258d1db1cf1a9412f5bab1723270bf75894309f409edfc863328d3d6309b8a680fc6e07995e8668eb40d5e81851dd8f60d0ea153e88b3b17bbcb3b017e6fbce43917a6d31a27eca0d71c8846456fb398bd9ca28b380adcec177a65e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (920, '{"ob": ["15151515f6ee44c3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135888b873f5da0c6740124e5b14e890cc62179a93d29fce9ba4a9ac3751995d90c7277c18122dd501c147b3d8a6497577dbe4db491fcfad4a8a1296c25dc81cdcf0a7b110764582fa60b84bf1069380c3e5db6268fc7250c95e4e26bbe4e20363250e429e59cf790d4f3243dbfe643e32cadd874ba7d6eb1a24114f9449343cadbe016c8b1363358b86bbfa4fee6fe5d38f60112dc9814cad046b6d9571f5b18b05cc7140825a0f21995a425d6b4c179cc3e70347ad4747de91f7d0e1b64cb9ace19e2aa7104cc55b7bd93e335aeb7489f541142490a85b33cd4adeb91d9ef5a65b3df71a41fe93fdb99071f0890392d4a75879c780bde110644eed7c0e100f5fe3ad802136a30be7f4e9474755173b6001ec8f75766102d0b81e0a7e6975c55756"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (921, '{"ob": ["15151515f6ee4484892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587099f7a6335d8cf035ceb967c03b16b6780b66b9a1e46901d65015f293a83f234403cc1492fe0dc7e890a88e6c72a77da757a2180d175901e9fcb66960ca8a4b660a7e8d47f6cd1b7283787bf48e3a93777b8b7c4fa7f04919f971c82effcce1781bbd94da42ca8c4cc242f6081553a34badc8bc218641439897fe485605d1d53183bf55c14b8dab101d55494064ef7f39d72dc6b3cd04011017c8ffa25b14177eaad042acb85190b023a00c28f28f8557ef4b5e67392bc074034a4618d82ca1905c5993b624d895333e2cf46ad08d69990d0666375f3782fd99de6816b5bf7df537ad9622a71903866acc9247e93dbed72fe495b40b8144b545b3104ec9f167f4605e356e893272e8293dbbe54dbc966f35dd858074e2901c37371c3bd34075"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (922, '{"ob": ["15151515f6ee449c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b2fb211f2ed4b165c359fb632a38853cdad276f07ffff56ff9016a20cd73ad03e9db810bc757688b1e4e2040afdb12f7460d77feca9b1a379c99253f3e8b109f7f3252b989111ba1a10773f7b958e647fd6f17b55a29e16731dc4caffe8e262103d5e2b1d07f89a3ca0f3b02ef9cae266359685cf4e711e03f40c7bbacbc4d514031071909cd3eee9c51365557de02a39c2f51831c3f9c62d305603763613493bf174f6aa51502ca7a2166c7ede7619fc976ecbc1b1d4718b6bb27dbfe92b9b69fde2e4bcd7f87f5e603dd47750fd709e6ff057f862ec3cec1cf99a547778bf4adb3001fc51fb069b1ff15bcc48106c819992b740018ae53fbe8f93288b0ad5e507f357adff0424f7e4426b13c578be312a4c3ece82c9f71ca89c0750d99d13e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (923, '{"ob": ["15151515f6ee4406892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d5318f8e6afedb1ef94bb49e4393758f8b77b14f8c02c6db027d6c74ee2b283ad14ddfc5316902b844916ec927e8a5ecff7497a35b94b268a1cd2cad9a754c1fee99c3f0a965244eb38fd0719c44f38bd62f02feccce4598eaf98c4be4c4e55841bbcb0bac380d00b8e382292e35820e6f291d3c62be6c5261f70fb37c7786c98d15fd5ac5e7a05b14c41be7120072b6b8c8f7990b6e1ffb35bc73d96090caa8cdb86eb4fea9bb15e2247f977530a3b9c140330be14ae1e68b20f75ea73c9b5b1d7e6861b187e2330a61dfc00c89734ee17a6d99e1b8ee4f139564b5b04408e1d5c9ff519d78fba7bbfcc499f96617fe9b64504c5c1fc638daa7620ff3c5f48fec71c784da3e49c79edfc01b8ed9ad19e9b2951cc34af582d518ed08d1c43cfe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (924, '{"ob": ["15151515f6ee44e0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358953b6748949b4275b30a05e49d6619f0c49a853ad39025e5a6aabe0f538bc8552401d5899b290d9b4627675257da0dad0aebd58c19d5207918b08ae1d90de610d89deeb0aa2749867e655c6d4b355d5b173766906daf9837d93fea39d4085ee6694886bdd9c06b23e49b2c6e9bff5980653df77395f707b797ce3709f8b2df2ee29f169d0313d48b70131e268cb41b3ba4c86c41ad87b69adbbb6f903355af4900f5fde4747abe61ab590dfa1f3f99c8df0100a6177f44b0145701b6c6b12ce1b3f84bddfeda4f544684de31b15622baa380023d71c3245c2b1c01412d8acdec6dd0fb13360a5f5e74b67ca29daac3504c9e3467c78cf83157aa57e2c4fd1e30c7df316a2d1528715c9817c146562868db696a91720f7c8fa0ffd2cfb7b1808c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (925, '{"ob": ["15151515f6ee44ee892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583d62f3cd59130bd9e78ee5fe291899f12ea1b5a6c30cfe79a271b8d200e96986de8d891d50a1f436c5586e900c8f4c3b986d402fafa08fcd23877e84202f1fef4c43041cae57679d60ae4dce1424795b867260381e742e34c8e12cc75fdccee5e22b4e34eeff9af5581bfa5abc40f6526d6a543213fe2879ac6340bda0d431208de104b60303631325dda4b19956d361d01456fdef9bc9f10832be888554c65d3ad8b4d17d6cfab0bf865bfe5f10e5bf5ae84c591662f90d2cf2045834e9281dd4cc3a3e6f6ecc66b6fe71b7c077b610619eef2a5e03233832c08a265e7be72233826f3dbedc4ca2eb8b9a87fe36d945b5c355f9ce38e18b4df4322472cc13fcfcf76cf1c69b8202b4605872b1fc63a4e73a816b2ab6c3eae079366c528f7fe1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (926, '{"ob": ["15151515f6ee4477892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582c300e282214d463baa7390f7caad4efa12174f9a0a078be530c799f9c0a88ebd67b480b92befba98261cf911699a81cb66857bc3a67b2afa149ab1720bb9899e47e710c71f364b9df82116ce64980bc7add341b4adfc973a70a5c49bb234f5b74f787afa1256070bf664cfaf2bb5835059eca2c3500a1380cc33cb8885abbea79232a42b6057d6c5077e9b383f4efa0dc0f1707737dd9a29fb98fb05c651d802bca1f6bb7a10373ff11266f27532bb9400f5878ddfba05c866e47e7e29de1da4851e3991d631bfbada2ffc27a11f318cb638935b81231fa7925548eb19b402c92a0870f61e69a39a4fdb49c17625fea1cc03f86afb2cd2c5038eba01a95e0556c8fc021502fbf2381c4c9a9c7816f1bc39aa16eb508c63af74a12b10f27211c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (927, '{"ob": ["15151515f6ee44cd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358daf7de6748a851677c6d371e5c1676b939239428579c9e7f4707e9e3e090f6685598b26bbcdc60bdb234987c87e5577fc6cfc25b43f0bb8209ebe8dc255dbe21bec3116ca92edff4f024b55b6bef4dfeac751d2fd2cab6d55ccebfdc630bcf531213e7257c68d3887530477e3c9d91fe2bfd4f945c126ca4b60ae89044355fb15368f547f97cdfc30f5ac587268a9f970fbc93136c4899e4cc84680a0827d6807ee73562136fd488abd129702205434f67a81b9042196e8cb6d5547b9cdf8b3837bc10a913b7ac372aeedcf45fe167abccdccdaa3cff6609f55e1fb6315335fb6a34bb35849e31db494e4e758a02b2896644a55751c64c266a0e5ee690fc02e9fd7b2d28991cc02e330c9c4275f4b4d9d11e95d08ef4b73aa1cc8ca212056b34"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (928, '{"ob": ["15151515f6ee44d9892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135851da8119e9ed93b302e723ecf7cbd9770caaf5a4cf81930803a532fcff188b7a57596625e8d935a1873ff28c772dd4b3836c6a24fa68e16e0e5d259c09a00e2f6876b8e34066869234d59dacb35274eee324a5685093f4b8e2747f2009a19cc934324fafc149085866e41721f8ac9d70cb720a16770c9b56efca0f9a6aceed3ff5f06d633d71606de4cc19e07bd1b25d4ba314e01068151c48bfa1f24eb6060961a85d37f98aeb077951f6b600cb46023764d3da6a4b309838279bd341b7a996018d112a83b8d6d7bf229260788a2525f7abadaa1a39cdc6b2ad4cfd8518ee30e60e8485f423e7ec5622b2133b83d607fac256e66bf5de68ec557717b6887bd6c8f991c3258a0688d7fe30b7a5096e00c29a67d0c157c48683d8e84983f06ec0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (929, '{"ob": ["15151515f6ee4499892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b701c5ab175218b23e56694f103ee41dbcd295ea1c094178309de6210f04acf533837b99571689950511fe1a3316f74c15bfef63c1d911932af491ff091668399a00042a59001ab049d761fd2a539b3679d3ade1e3eb3bc4001bd8597988ffdba9d3db9fdba1609513e52ac5b891c46de849c35a199bc2c3c13b7947743f56059c711c1f7da201c8ca6745f02256b0d1d24c6ba6e8e3fae8a816e4403718fe187d7fe6dea5ee3a74b491a97ccd7ff3b834b82fc734b58dc5a63b29d7c229a6cf9c7e4cee433f0d0de0aeb847f47ca1b1df53b2a0770967a6806d0f1f3a0a1a0ceec9537b3834709d3381326c4f47131657bde2a1b4536b243b5330ce38ac46e84bde4b97ba2107bc4c6e67d05669f506fcc7e9b2b85b7c11866bc7b45633e81c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (930, '{"ob": ["15151515f6ee44cf892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358216de5e30325da8efcee4b724c7710d6f65bb7cb1f408860adefebc21fcfddf63325c88e0572f0cbe6eb5932d4305eebfed2b678fd71f079b67385b06d0fb68e8ed73cb98e75d42dd4cda23f0a77ef7df544a6820e4649e40af5706e93dd8de8a8a3289ba8225e6158e67f372386ab008c0e5579fc277e2ced2ad474160a61b3d6f11c5799e232de2ae1464f2713d68edc96f94c7a3010afacbf7b2651d3908d623dc01a27e56a16e61f84d8d922ed43ecd88a9bbdb1de07cfa9f67371416032b428bde62139f93dddcbbd56ceed38668aef8d7a1c86d819cd435c0b6862c84863c40c9fe08c50cfd4c46e0b5b5287eb67e130f6c918b9e32cc14e5ade5db351f59d9929abd1450b0c53da249322c6f1a23d53310cb09a990c05ee3d29be0a3d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (931, '{"ob": ["15151515f6ee44e8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135851e497889d78440f08aa377506c0ebc9fef81369e8b94d348791a0e53d6953e061910808ad4a6a248ed0690d7f6db98068a847245a0f550977dd638f57c56ced1b5296b9c20f1162e14a39698bd7ac09d708e3b28fb7e91450e0a21e48d31716b05b8caf8b67e4e270469e175b8266c20ee75a731834977276fbf74265426c7f2ae7311e4ea810ebbb39860613b96dce692b38142b36ae412eadc32bc1b0603edad06f98a11e8d03752738d8b6d84c9365d14efab800d916334395f72b5e29b06c0f086fa3d1f5134562a59272ebd73d8ddc620c742cc7fce635c5eec18a42a2781fd3d25748e0b37173f752486ee1ece4c85561c54c441d639cc3e74d0b5ea924f05e5152c1e0f89817d109f9953e58125f99549d7e7470e48aafe905f669fe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (932, '{"ob": ["15151515f6ee449a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358109f8de4c5db656db504558b8c153cb8c467985fbc8eafe2e2c93191a3c982ce74a3b82bf9cd9d5df7385278666739c32037bb25e9db5050427119b65ead5f19202b908926a2dd7e5c1de4eb795cbad3f190e923a3ce3cf97c19fc86968bd49b6a334eb8397af42e74ca7d4acfabf1f2f394522987b72b38ce4052921487891190de8e68ee01a770ab3fe4937a733c9405b9becd5130a349d42de7a64b32840538f039a6e2c59cab60a413693a5cc80339d761204680434737d8f15938d77bb4ba356740e8bc39ae5c91e0e3f0d33278db77a7806c94b8225eef60957c25115620f57764e37bf61692b9f84e2ecfc2c53ced0e65b57d221416b2f34883649d21769b0258d52baf8d5d27c9c1ae9e9a262ffbf855b76d6badceea29bdfaf7fceb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (933, '{"ob": ["15151515f6ee44f7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c0693d77a1f9e44e901986baf3efbbf80f4427865a3b39db83032d6f9ad784a9069935103b657b317c53aae5a65639ef24a84f926c52f869907c21792fe5757ca6b17389204bf15a73726d424213dab9bf4c2e20e1bbf2291cf67e3cee8482e8aca20aa35bbbb37faaedf48648cd83ae50acce27311f73d8d38f4f929f6166bbf472320cad378593ed500123caea2d7606a296a840f9e573b27b7e626206142b2b093654600595eeae89015efc97bcac6ecc09b4cecd3122ad41df27eeec54395586d7fe358caabf9cb1ed35b014e8f63045a08e66d204fa60f186a70e601a56082a263e5b01176b3670e311f974204fbb69de2dacc3232cce4aed88856e82b392e98119f9ab2525182b93ee8c47e704070f86191c72e6b04d4441a49746fec6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (934, '{"ob": ["15151515f6ee44b6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135837797deae715c170c00fb96fbedd72e5463c97b6dc43958e10fd3acbcc001ca9eaab088ba3cf8a99b89af66f5b4b1d7f1c988c67e841bb1c0a2b520b4bd9c0f304df4bb27c1001b5c50862b8933e229d9c5de26391150dd3b53ed81a42d39f9f674439cc7dfd166d9b5091b3a4fbc4b5659cccb3bb8557cb9c1b5eef9a7d8fa0a74d8dbb3e0872f03628e4809d5d72d8be6cc548031d8b9a39a10f1d12765a8a59417ec185687a582000f0cea8acdbb6bda213d34f2b3332a849ba11d6606fdc6c5c757012aec1c51106d400cedd391cf6da51a7a8750059431be48965a80b0012d217e8be94a775a5fdc5eaa83825059e66aa3577919d817f365905e414d40bc46e6351d35bf287ca20fc5b775891338f0da4be8f99511508dddab7517d0eaf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (935, '{"ob": ["15151515f6ee44ea892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c49ed2fd1d9b4116ab7d65c69a61f8ccda607f1ed56adab9c650bc65e3ad7831d1b9beb70480487c33d4535f961deb9afe3b87ec95b17634e4b96c7a238705b546184ea0375b80c39dd627983902006fad2ad31a651436069f15f254f8f4cd0792eedd60c93c35776f52768e228d590d38a4eab92e67f86a4c11bd37c64348cc81e24151c8e39b2ce954b755810d441966a466c78c774439524ab383e2571da77773d510eba282281f5c08004bb2f31ecb1806d962e66746a952c6817f31b7a2162f5056e08d8737883f6eab9e3e0d65e515d04d259df6acd30cf42d4ef8175d90d0a2af98cd2019efba034b897733133e1bda193639c7202ea1393b913a0c7f5697b63745b310f11f447c0ea116d66e7069e3338cdedc0b4a33b7061d60f543"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (936, '{"ob": ["15151515f6ee4438892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135833fb92cebebd7939c49dd7dc301f5d957fbe1ac7d9136fc7ad349e7cbae06df8a7ac42a42c11c76b6d9a9beac5c4889b02074781d5eab9e37d18294dda5f3a3daedae158a4855c746f33cc45dbc88458086a07d2b1a9ee6db41df457dc80bb79a22653573b7dcc5776bf30c9aa4ca22dbf71fcdbca9e64d17a07f8108751dad59800b85567646fc49b805df409ae5cf14a69ff76cddaa95f70b0019b439ef3002e6306ca551e6e4ad278a9325cb61e15766f7ef64ecc49a8995ec27394553e6a5e8de2a9302c5f16645d05977fe8d3ee0e2a5b7fed4a634e399183f86ada25cf41839babe23cb4e30e62e446b4cca0db4fd30ba393c72eb664bdc855bc358d5841ecea201b306bd9bb601c21272e50d324a532c8a58bd8e138dc48c27ca8772c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (937, '{"ob": ["15151515f6ee4483892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d9db409d1c4c42fc20dc89fbbc3f61bc3cdc7353c6861128504454253aa033a54ab91b4a8931ab710a7a27f13106a4ac9cfe025feec6360c552f199337efdeaea9bbe71bcbe5d889718e0311355726d6d5e984efea1323f146fc7269de1062f0ab3cdd80bc225f34779f38a3990c18cebfccaa541473e7f35f2e82f4f15cb6fad5d48f657ce5f110fa18f6ed054709d19398c7a1a42e7db9af5dfdd6a9ef0371dc635e62e88e681bf6846fcfe9b454cb380ac3e8b4da92ec6ccc10a4b5e9cd1a598bdb01c7ac965c13c0a7545eef43b9db8a9def7d5a7c3dd6f9bc0fd4d50a2d0879362cc45af084c2523c880cd0439fc865d0c0f4f50c87c40a339eebd80a1ffd012274fcb722c90c53a5daf700ce1f39024642c43f36bd56cac1154e678c33"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (938, '{"ob": ["15151515f6ee447b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a22dcb618473c52ca432663652f198847f203a3ebcdf8fbc6b8591c2851c9860a0ad3df1f28172de861a1805c413667049b52f06f39ece2ba047bfc94d1f0e2a9a03f0f1401f579b860b8be2b9ea2cc808b21703f458173792bd7949971d1edc12c0fccb19f3cc8c39b67804f81e4787bb5fd77b00ade37232e9364e718ec7d5efc01d81ca4d7328188a562e470692f84398e2b24f26c728348dd395fff893ccd64844c6fe9436d67bdaa5ed91a5a7a03a073a05f6095b53ff94d464f59a799564a040010b734a5fca68377f711de6b4b4c6aba35166b2ebc3529c2d0389f22c1ccceec7cb00f9a5b0fad6b6ca1a137564204910eb44f605eb497f41eed231dc0a07fbd9ff39bd74e1bd85e2d17785e20346f4baf0181d2e4f689b17780290dc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (939, '{"ob": ["15151515f6ee4445892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135826833bafb28395a8630a186455e3d150d814f3b57edc5607bfdfb057375c66fe73e21740205071ca19917bf6a7c0dfa9e8eea47c7e2f00f0db75b8f63d539858b207e6c6f4ce1842c6f375fbd1a29ba76d1242905868d6467c2501e4684060648f42ca82973570b6f3634d281d40458fa23112449067854de7874a4db9de603a569a0dc3f87920b98472f578e68c3737861ee685fe7533843336bc16f557d6318b6503f22a1d1f7af688952890485be13409a641b8a41611b997f49eb0305f811d0a84fcfa45aad89a4f32e2766cd4cfbf2aeee4697019e70600232fbbaccff0760c84621ffe75343801a0f57a39ee9f33ccaa3b09951a862cdf7a0c980360a3a467445566d90d3033faaa9383c4b3b834a56f629a35dd9e96dc0f80e3de52bd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (940, '{"ob": ["15151515f6ee44f0892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ffbff5d1514fd3f6e9ca80b8806771d58b7cc5d86c84ae619cb97090ba5df488ea5958fa02df2d2ceb73063b77d7eeb25e97cdf298378841c8a1c1bbb0d0330d12383d586fe95d6bd0e0cc0b071d5c17ad8f6036dd34a7b63bc5b34dd56524bf90d5a1a10ed7b9e601c37347d207df90c70dda1b9e02f171155e32f9592e1996c91ee73b9a879dbbf871d54d7460a93af1b9203eabca7fa6ed8ec223920e4af87290dea62cecb877628b956e79bb5f57a099a591d67dd4322b4ef3331712ef07726373555ac85283f191602ca7bff00f5a7bc41421daef9a156b663d604027d8b4677fea0107093da2e5d1ea996b3f91a1030589d6989ea262d77b55088ec3825295994869531c03713a06e5496b58d7fac232045f3190a4fb25e969928f4109"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (941, '{"ob": ["15151515f6ee442d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583668f13862e8e153704a5e088e09db65626333fef2a39184760a57c4f38bf8fc2fb39d64a0d3a2f6b1757b1d9aa524e7c336483e46be2b47be414eca49b52bdb06e6f7c1e3c9c399393226a72cce7a37d0f1ae2d52abab65532495793f983b64b7a0042ccd2ff00e2e964ac523c888565a724f9c24a02ec0bf3deca3646d145f6eff5ef46753541c42a4731c973f3f6219f8b485a42679b72ac941fec6ef9e9c5fff1d5be38147fcf350415fb7d0b8567e1610209b23651d9d29b77368d24ac3ce9dacffc544902aab801568b8e11cf3c3a017ea376dafca39d4b0cfe0d7d9d6750ae129ada29733cf6e6496b4f16619126712a904c7d5edc8d45c5684d3fe60552d8ad5737d7939276242f88f2f37bb543248e2a61c23e6ff48e2b5820424fb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (942, '{"ob": ["15151515f6ee443a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c9146ed1a4e4fc958376fb5783668fb5ee1284026d17cd987b181f86b2be5fd4018b6ed222fcfbdd7863e09d7c1a81f17adf227ee135397bb898dea8649b083985433e4bdd45f8399b12059cc47f3d90019b7e60befd920e917868697bda2d6c384f065faff83abac793a56d2f01bc45996e3b41707234c0bedd24ed3a065d370a80c9aa4fc4b0401fcd6f5c488fe2999b21e1673ba73dfd6f03d85e41682f53845be66a83957d0b20bb0048a3f75f468b748c23fe9155318ecf16297b7def175138eb2d076f3ce837810d724168f5dc206d36a5afa0f5fc7d16e6b68acd1c6b52bdabfbce7436370854bd92ae7f5008e3d1dc4be052c2b1e1683d5f7d37574f7b9865aca61e214df5a72521031142fef12f75e8b81fe03ff4227c4efda3f7eb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (943, '{"ob": ["15151515f6ee447a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c4499ac860eb569a54c49ef43a4634b14d36c29e8621d01208bb8666e0b88fab68a5fe97b1870fe6ef183658cdde196f62e391c3ff01d6adc515a5c4d1b20883a0f8df4d242dfd94997461d6d7536a9e44de1995b654fb05d9065c7590da3dca5ce717f5b9984966067c161524634e00020bc99306e1e673158d13a2ca2bd4d48053979ed33c144de225ea3451ee37ffbcd86076032d9c801706a07ce3b2f4effbf38b38ea7d131477d08e3ac92179dc24e2d942ac690c1ee23cca89465f59c03486668ed58987dd1f69d5eb61d78473f1808fff57cb845ffe78bde3e50ccbd70409eb23a7119211a3b89f1fe019ffc6c01af06b9c4577fe63e9ed9268df5eee9fc8ee556a8780b28894b9a9a9fd1b8f7b9f6027e737a7a76c4a60524d335b51"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (944, '{"ob": ["15151515f6ee44be892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135817810650f905ee64256665eae061eeb060912f15fb175e67b2acedd040acc073c7c2f86bab4c984a0e77b967a269739b055957e0e76b7e19b4bbdea69124b93f148858bd6074058b979b50efa0573744dc581eb966f24f06eda3968022a68628adfc3887f3bf9069b8581f7476034015592ec8999ec3cf329c4f36d6d53b44802720ae429c6380504904b9e42a6dbde6b8fba05d2db181b336510d6047923c8e6b5913d28101a3c03d4ea8087eae53b7aff32589951ac5b56609580a8765457e9eff1aa76819bafed5351dba1eb4a03d6b6b64caf25e7ad03377867b8e3ac121c0a9ff51bba62ace12260c335a17b1296f53e4d1fd091c0a1db532c0a2100bcd8af22733e99b1e3130233417510dbdb8d7bca74e25f6e532670495864800658b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (945, '{"ob": ["15151515f6ee4446892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135833d87e9fd4b6c06f39f35a6893ee98a06c281594e4743a2aafc9e86d6cabf6325994150c7ad201a4f699bff9aece6482ad09516e425236468147d2bae92a0818b42a6b4f82f87ab77feb5b133fa486f1b2974d8228d7eee6d38c69ae60928fe2f3f7debfc60a851858656a27d5af8fa4cc275c8910cc0cd4d20470525b4f6afcadf31f9d98456674385e121c23e0d58b89af374f7cf0f55a499524abc4456e1e102a7d450211aecafe15f1908fe70e21190ba6654a4f1095d81b7f53199c289492836a55cab65a63598d73bcc1852e4ba43c5887d64047ace2fa4aa623fca3059b734d4f6fe6fcfa51a1de3778b200d746d27cc6fda1424abacbd74cefe5c3ba82d30fcf1d8c9c9d6d614eb4dd2a65726237bc81e75f27a6a6be50b083ddba46"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (946, '{"ob": ["15151515f6ee44d5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358515bfd0eabd4735336dc84d41e8399c42ffd2a45615814134f1d9dbf5a0d29e60bdee8a0d210c7edf5696e3c9bdf4541109fc437e015f1605864daf6149f62f55069b78cf5936fe679baccf8445e8bd2311fdef343f28f2f93fd00d29efa1221c417645a173e428c533f90945e07e1b3fca60ac4a3a4ef36217058fe31dc31177d723dbcd77df1d7ea69f28b66934cf94a44cce32324b7a0250c91096cbde000fff0cb477ff2042ee45b11c18bbfcf5566d4dfc38c66ac7898dde9ab12546cfa42173bd15461413a3b6e97ef7e40b0ed33200819276e473266153fe2a992f4a6e5eab7b6cd806770fecbd7188faf46a49370b0f640de616713fd271a92db8aaf533c24413c540747e032387a37e835e60886bc31b1ca5c1b8decfd628e87ae8a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (947, '{"ob": ["15151515f6ee442e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358211e7767916fa9432f884599307fc48ed086b7fe6f9228367a090c6ae608c04bd41592e13d9c96ce7316e43c9ef256727ed9e25d24aad2b176ba5983658ced1dbd9d95783cc578bbd2bff547a4b56cf03606b02a2dc4753e11fb57d7a8a843c95a8261ef9afeb6c4133ac9a2c41f6c11066ad15fa2b636717806b1a91adee72cac2d026e21624d85b0433cb3c051e68ca418e897eafd0ff1e729bb61163a5273eeec390844cf12ea6788d6f5594cd2fb45857b483a3677e528aa09cad043f44b8455601ebc1c49c186786982b0f9431ded4cf9eae616d2994b39be32e736eb462068fe3488707573e854b97dd7cb9ef72c490e2b791720b92010aa17f9b399702cfa81ff7d2ebcbd79eabb849e5e4a04e458aaab3cff08cbbc8854aee8b5a59d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (948, '{"ob": ["15151515f6ee4436892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584e9820cf2d0aa0782cefa5a58705154e5ebc12c6fc44fc4a02a2a5065fc52a271bfc983c7db4f5a2be3710d09de50b62006f682da02821f58805131c24bd9416d6e29d33a44367ea61711d1403ec7fb6de98af100c03d1380ad85912c01e38bf23e61b15c5e95b9b4cacb36fbf7b9ef17f332a9556bc43311d59659598ed5a927e42f7ef7abe99b7820cef83a40c29fe3279409f8a7bc598a917d4aab542859b2546309956cfebe1015353c89078805b287bc7f9d6447b0ebf32dd61d04bc034b26f914fcba448cb90a4fa72ce9808749ed76a6aed68f29c47f2a85a51a15b37d3ca942e58903545896cf7ac6193a6ffa8eeb32f3559b54a262b752361241cb78f178901972f8c6401b8900bc90afc4e0be92bc4e9160873c292c51b2ba196b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (949, '{"ob": ["15151515f6ee44c1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13587f7422960d7344f626c3a54ded6e9128469f3bf579f9a1c5fd0d9dacc7a6f04c64a388185fd72ead44a2acf607baedfda559d9b09ff75f735bd05c8a2f21e1e31c99c27e1259dfd18d5e0441b7dd91a62994c0dc31e18524e56e4a31f65c4c9d857db280a8dba4adb25d9c7eca1f128d6230c768fa2e3b89c2a0b568cf8dc21369e2e9e4b7ff7b7b23f159068798758e41c6ec99b1a8daf5e3ea3adcddaaf74d48dbc5ee1a9f8779c053d671ef09a5f6e43d3ba5fc4feae76ce5d9bc2e58fcf07aa268de754b31679eeaed0fbb42f3ae0fdb0949e3f75df9c34b9bd4d01435d4438b424f1716a781d3fe540f0dc2a09255fc7f372da5ec7c7704ae3942ed015615ae7b0dc4c0036947467c252cdcccaa836b82ba116d9a50a3a03c1902010d47"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (950, '{"ob": ["15151515f6ee442b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358ee7db62ae7a8c21fd3ae52ad39b8e1b23301ed1487b5e70f05655c322367dccb04797fb38d88255eb875b0964a73ad895d4f2ab2a7fd921a5e29c882332c3625679d086692597ee5ce802d147be3f57f31ccf8be249f07c2777575f76bfd8a06070c0d318e583daecd8f550c7f73014140601f59ae3e31b9bede38dd031691f84136e979b429a7b381c3f8eccb18316f06e75c9a67237e27959c3e736ac8a65e07d0ba6afadbac650acc2e6268b17d7e3e4dbb421d89b2fae7f66e2ed81e0b412c96c4d11b758280cc082f794fbdcfdccce16cd0c9babb11bbcec999e801dbeb079da9cc819c31ac63c548bcc97dc40aff653f3ed4f7533be87b1a054fba3ef76868f50e2d6cc846f7b1fd07934fe9bded409bb334d8c6db7f652a6e1b521b20"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (951, '{"ob": ["15151515f6ee44fc892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135805177167570d9e9293e95483c2a09b6bf89a4da62c6260bdc4f33ecb91e52a6c51be7a4beb3d5c14eb773a5500a71ac1167de5f8d9f1dd2d298b09d89b8554688b1c37cdbb76f2a4cc959aed2ac9b2962ec35651d898ffc606af509d5d8c6fda2e066a1edec9f352c9e620d1a0d0ce82d1d821837ea2781712144b0aa04148c605748085717640dcf9ff79722e1cc6445a9aa5f295fe41a2d0b1c51e6d1d7b41e1d999c4301470c9988e6052815bc3ef79f36076e0bfdc37bb131dec7689789611423d78f0238aff72f1e9b080c3f27b383f5f112e7699800c8285b39d5c0314d3e731a8d6d5431258afd56e9efceb64dc9a5e9c8e938244c0801d11677818be7b9df850525213ef34e63583e9485a7f08cfc20d72b82f45e51b5fe5720b2899"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (952, '{"ob": ["15151515f6ee44b8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f0800d456c71877d20e52494ddcc31eff5e26cd459e4d6fcc062471acd26b5dd00b3caccb877768376756ff93976382e8bf4175eb0aa788ff5be6244806bb1423c617534174324759034ae9ae89e57c948b8118c588660ce28ab2a223d724ae0876df29e4aea92849a06b7a5fdc33e45f916e6a9047d9b4444408330471488bef4f3286c5036cf1ddb4815e3fc474f6d09faf607721194714a96d26f2cde6a4c1dd4b39b1de1f9b6a4d217ae550cdf6b7da2639c0f66476ce0ac4b14a444d03f2d9d760bc66968450e5cacb4a65d44e1fbcd4d570c1fb48b622724f65c36dcf8a0512b48f846f0cced19aec9a5a578aadffe84ee53328fd9dac016f9dd3834df1ee0f497b6a81530bca2be18e9544d92223c6fb4ecc1e308b767e9aeb449a123"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (953, '{"ob": ["15151515f6ee443e892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588416afc7aec41ae46a54bcbeb06ac6e9baaec405aa971663552ba8833e5b59888501c81cc5f09e85056b3b71e49f93976308cc12a22a358a42d69969fc076b68cbfb188c06d83b42ed5212f4566252bbe86bf7fb6065a63a75dcc9fe1d6872970b184cf47e1db7c03595813ccc3d5027f3159f9866ba06c4388a474a388f863a42701d00ef6a2202f7241a82c0029aa002dff10639cf7b896b863743c8b40e4884d594f993b2034df161c4af4073ebe1f5c2ac03ca712ac5b6245ce960d51d38c033d84fe0e20cd5b43536c3f8a1c8b1d7467586c21620549d6363d6643a493e58e979c2eade8c6af395f0464a4ea1831bbfb273d2cb823d2f4ed6a744036b5dc4835662e4c58049d9d18956ce30974e3e04c1dcbd69b20846fcf6aee1e3f003"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (954, '{"ob": ["15151515f6ee441f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358de55213c9ec3a614cf7bdcdef501b7e331b1acee0748204ad727c9636a5abcf153e2399189f33ca0fdd42b109cef704232e4ea2996a4a1b06136e9551d5827582e92c5e68af2a0828ec7c06ef492f962a3a2957cbd405555ce70d3fefd45ead2a3e70e785846d55844369b994405df77151b4e5ca71190f98d967cc490d63f4088477a36e10271e56b4dcf1aee6210a221ebbc0fda76369acd87f8b14fdf94a627be16b3996b0e5a8315ea1e974c7325c200a5c66cdeb81267b40125b9a357639d47a545e4d1e3a6900b5b51c369cb9bfb127a1f011f3d6f3beb06f2a7937d792d788f1c1e92c46404a764d433cc1d6de2a3ff4251d7bfa5d6bfbf3563073a1bbc69190cfa7489e2002ba4a8502cdcf9304a515399522c06757cebc96f692dbe"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (955, '{"ob": ["15151515f6ee4420892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586facc660ccb5569d24388e02debf91ab721afd22c6b9a6f4ea99ab0a478a95b3f066f07680a6b9d8991cc77c1046290def54899607e376f46a0c49e0eed3f591d0403f4628f65fb3d9f96da51568bfae69908e0faba2cdcf544346b4e04911f382d067ac4c17c1020d819f9308886c845824ee52952393599f4a263c455d078110d610eb2cc689f9b8686a6040b3dbd13092ad5662681793bc2910c2dc5cc6eb8dd9102f7a6eb662459e492bd118d91c0eb8867a7df75410a736d4393aa71716327766131d863f705ad9a5fee981e1478935b8fe1081e02aac4e4d90ec68aa893bf885ba2b99c999a4c2f905d25adece9ecf084607e88ad389d997afe2309a9d9abff9789b4982866062b8ac343c9dcd8a61e4c3ad8637a8cc2b9c21aa3cbf57"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (956, '{"ob": ["15151515f6ee44ff892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588d720c6c2a1190664f5f7ba4ff5ed4fe0696632b86f8ad200a04b09bf0bfb029e9bc243d9f1e20e5428050dbe100baf27f12dcdf879c84a74ff473df7f0fa466813ca3174047a85ba1b2562eb3caf60d1ddee919c3d7bd729d66edddab03e7e7bb1fcea2746a7ceba95ae88bf7bab9198c1803cae744d006a96cc7537c1a6f2ff1465c1b917a29685043e615e7349e745b0389a5a10ced3cbbefd94c8f4402051f518030b598ac47a11693b77853677255353172bce2ea4fb991663ab555d878c90f6092f81f0333507b1a78d5a5b3e4c39d8759f847c365cb03e13befa97bcaf9ad188c4a0ff2e4a24533cc3993cf41321e587188160d929822503dbc1d29540066836a08e9f395a9ec4157496182379c19b17be7c58cf469756b3a32af6188"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (957, '{"ob": ["15151515f6ee443b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135819ddbe204521dfd71ea773b7828b49c27430d827d5fb1723d1889fe9061842fcfb30ded49c7b0f0cb4a01636aff104826281185bffbe399412bab16192111a441f300894b95badce9ea9aae5b90e964536e157af6849061811f4a85f1aacf448c0252048bf973ecf4983102e7d53e11bb3ebd7d258ec55c8e8808184b0e93da03a5998a66975195293824be936aeffbc9163f8a4f58e0d1e63df1d859e6304c8cbe893b18ec6b35a86c55c1b12c760cbcd8465bfa32a09675644e2736362f85e835ed19c7007055213ea15a6379571d11a4ba6f2635d7af702e95216ff8e4a1772825c4e19c40a35b9af0610032f93ecf1eed2449c42d7406e342993404e7134993998b1174897d14e509f8a04e1a6e83248676e50cc76de75734099fcc671c1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (958, '{"ob": ["15151515f6ee44f5892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dcac4509c57890657307f1f6386fc4d92aaf60990067fb57b4f6d2f78b3a7e46603c05426b4dc9f781af63274f91c0c87afbccbe27db2ec8bf5ddc5cbd15abe097fbc3ba2ef1c70f6d89f1b9ac6622e5543bdb1da3c443ab52436f3ef8012662bda21b7e5ab00ae64eadecc2cd46b4fc61ab7f53323d3660d9f1308895c962caa4ebba5509746c750cea7df83b3da14bcdae02e0fac3aba644c5e56878bdc50a2e75956ad2d117847460449a79f22e6f484e0837088bc3c0b6fe16fdf17f24df3335eb4479cb27ca80124209165e136c49b8b484ad2d16b279329da00df31e203d646affcf0e69605a03588f27872539bde4a252b542f856f5b8b9a02f03b614ec1f7ce91ce12ca5c56d2887f10e0067ed87f44f77858603bf472824caaf9de0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (959, '{"ob": ["15151515f6ee4426892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588e818c00863a9b5028f67832c1f60af05ca7c4e7111e7b884f8a967d642dc168e70ead184e72d0d3ac84aa979dfa3bccb3c5d4979f4cafa6584dc850e7b8650a921f1d92ca86a2b586292310282825c6a0082c32eac24d888313405ccb76fdc56ac8ab2158ffe16050e68acf5d7e0ed4388418186607c51bd75c8062ee7d8f27bdcc7c9b3d38f264267384f2a6b05a91bae6505de382aeb98e46e829ba9e0caf392f6190bc0b30fa13d973680c0aef1dcc3c1051ce4f52f3c419fd840e31b1b85ed4e598198050ccdb6b1b2bd96696c0cb8b69132de6d8f23af39b1f1a696e00ede281927e62de97c01030c122e2d0c430a6088f70e2ea28f07dd17a768d45dd49b06f231e0f2fe9f945068c1e38cc5983f2d6639bff64785b951b2d36f67ede"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (960, '{"ob": ["15151515f6ee440c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358fc6be320cd1479b17ee0b80a96d1b35bd94575926e59b8b42ad104b5b5a997f18d38118c01128b5bee40e36e4cd298d05836086d4e74ddb719aa5e3bca2700a5b0b4cedc1e5d6b5057bf1ccb66353a309fafb8aa9c17b7c85425adf6bb4369a3f39bd1ecc731acee285dd0da48900b5315ad4e2194f3077d098e60e01a89e58f00a126e949b5f4d21a32c860f7fe5fc225eb8030fe48eb28792e7fb349ebc42ffe4c7f7fc89b85cec49cefd2ba03166de00d54a2842caa06c759fbac3299145a17b022f0f6dc6f53592d47a625dec1329e70514d2a8b557ed3cbd535ebddee94c2874e9433d51ba9a15a574703c4606bbc6b5565bab363cca7dfb161cd46d678c29ddc2088e1378d613c2edfcf00835c92c619d2aee2a932dcee7f78a10b53da"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (961, '{"ob": ["15151515f6ee44bd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135837544f621d44eaf067c1660e1cb13eee7f8deab65b54420534ea32f2a4289faab00f25741a6e87d741d6e8618ab3166a9a8230aee7c8a31e9129f9fd4cfc7bc8ca41b8483086e69046898a54fc423d989df4c2acdc9a1631c7c446a53db82a752f18a167340aceecc3e76749792d78c6b62eda4218d9cb60d09811b75f590c7d7d25281ad3174074db529e7c6345c41d14cc10b423e0bd2025a495d397993ddb42c50e73aeee3965a02aa6c7ee3d314ce70509b8fc2682c2afed1e346dff225c2aab15ff98fdea99f6df9ebd62468804e38f504e8dcf4257c6ca23a772b6384eecd9e7a1145f9d69fb3fd2e791d83a9dcf8e76b0321850e67fba11aa79c3f2c7214be55b0a351309ca802ac4f6c51e73be90a3e983c9057ac0dd480fe31c8c9e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (962, '{"ob": ["15151515f6ee444b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358203155700f9f0c06c08fface7952876599d2dd1a5922ed0145bcf153d487d4ce06f1ec0b73484d3999b61ee0805483bef3aed4509bce59507acb0e43421ab22b4165664d19957804d474705b0e71e75a7d7859e2197fd62596a26daa4afb78f4088f9aab98138ba516978d5446435667cbf6ae3d66538f365267678173e265283bf721260a5bf50b7c8e614ff8bf409a51b8a51ae3fcc45ef12db2dbbeedbfb8f35d538b9acb2cfe3456d788e1e0928d91c2792b00dd25da3184cc1d4b0b413f177f5d6036332802ce47339ef83970165d0b3e9556e99111c9407fa78eec35f629a290f75e12abb4c9978695a916505a852786504a5d7f5df6e9abbbf5cd847364da073cd48604a6ba795a1b1a55276644327ab84393d8c8a0c26882f91f7a93"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (963, '{"ob": ["15151515f6ee445a892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13581bfb8857ca4d37a46a5639f1c2b279d3242b885ae52179a62f3a4f844b9f154bf516f2504b6aa58d2fd8f44a0a089124d3fa9d10ee4041be50a0521fcdad14f862da1fc423461aec29e8f32baf83fa6efba65d66bc575d1f40d49a580d09ed52aed6281c21e4d56e744df08cdaeaae7b58c19e8a082ff0bfe88f80daedeef07074ae2af1bd53963d4ce5c5157b40aa76c89bb78b82b36a248517f5a9b47e74b4f319315be6742db59bd6f908e872a3a2322f78187bfc0a38d278ccf1282bb1799751203e3c759807a389f86d33c70ad18a9c41cde6809fed71587ebd85371026ad8d2bfc93ec55c1f38783c9f6af6bf492c20a60cc2a90a540b3dbe47b84418786d201091f0f9d628f0b0a14b834e03169bd180f195beeaa92987188e7cc783a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (964, '{"ob": ["15151515f6ee44f8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e0ff969710d4fd76fa354e393ea6acd09517a6dc007f51251087ea81ba40af5a5913f0ce1a70cc07f083573daf1b4f87e1354ee0318cb729f3d0c2d50a4e018acf4359bb05f197e1c7199cf19781f89f41e6beb8df975e4badc32ac0556ad1d8c3683d4fa0330d27b7064e463565c567f336fbc16d795866b15d1e5a16aa9e418c4a26e9fa107c17d967e467582b2fa11cceb07554c25e881f2cb79e19cd2caaccca42826e46978041d3821b7ba88f8bee5079b8e978b7ac6a97c3daca4b1d360611e2ea8545489d8d2f6b092819edb4628e6367e6817bb0719cc291cbe695a26610f742e11fc22ebeaaf25929bd80c4dc38a83529b391e0a91f6599de6ee2fa71eff49bd2c1c5145a198a715d105528af6ea75beebfaf0e95adcda05cd559d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (965, '{"ob": ["15151515f6ee44e4892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f2cae8dc65af5d230d830b7f69b2ecf0fbc50b62a3bc13cbc7dc5cfa08e2deced13252b95ee85208527482c59190181c2d54c7702325982217ee822d494711acbf1005480195e0c41ef431a1790422b4bcca8691af8125c0a12ce1789f92ee666c6a43f5bd08a2c98001b4750ba6e49a766aec6621edc2102a8f0508cf40d2677b797f0fadb129cd39996982de89b56bad2c0d8a610a4e19bc997bd5c18d37e8e43b65aa5d0fb6b0236036539d1c7b09f0be4f39d0c84ccd014a20fb99c0c27202e1a5309c9e9fb1123e3413b6861b29ff1f65a3540b23b81c357d65957d8e3898447ecf13140443ea02e7d3b99a505e59a76a780a4ad9a5668613ab23e7183872301e75eac3be8a28160c1ee70069302a8be2d52a55179fd39f483aaa66821e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (966, '{"ob": ["15151515f6ee4493892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13584af828cd73aa7fd80c916bfba975f6ebfe49b2a5099c333d5d4b48a1cf7803ed568defeae1ec3dc955886191853de82cc0e176e31828e261a760425cc4a6c98c36fe19da9ed85515240c4c70c134e3082fa18ab39acacd68b337e3f370e5190fef9ad9c361b003006252d9caebcd2490b86d609831e2ddb8a2898d8751048595d0248a08e21b2a477c2b53e92eb14458d9ed86c2d99ec165c21c6233b12dfaa1441df6f7a055d89efca22974cf55ec3c5068fa7932e6da833e218821677121e503411d40a5b770cb6984dc2d83aae2e76234abde1b614f5e3368ff7b9a2b5a4199da68d784596d3b458cb16b7418cb80c18a5a346723bdb36bf59590de24326b6987667dab666bc3e4b3afedf2ae93af5cc8bdf4d22515ffab4c2c97cdc5af23"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (967, '{"ob": ["15151515f6ee4444892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13580630a0fc641d0efc8a356abc6af05f25860906ace4132d3698d5a6b187a906ba4c56d09247eb3560a6094be95b1f194577554def75b085bcbe79e8495da44c21a1580c89ee2fd923869a661fc68cf1737154dec184a5c08e0fa27a737d79799defa1b081d22b0468d004e62aa55efb65c361ef1b8599a0593bfd1a137a915b70cf03a054d44088e02dc86219e16df3e46c6908e7fe54dff065b32bda179139d8ad5cbb07b69f383ba3a70b8986545ee2841ddbafd82dc97cd19c5833abda675e60f1e303020400bc8cceb79804815b9fa251bb587fe84475c97f0c0fb07f99375e6c181337ae2be359a55efc601ce9e4e3a4fee8943e26af804747a5add2e06c7558efb510c4b309cbc4213363d4bdf6f8f56de952f9524e9d2551fcfacedc1d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (968, '{"ob": ["15151515f6ee44ac892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358856653241c74b1c5d575cec8df7944e2f0bf3f69a41109423d654fa87c0f314b3648c331a1183c1f4d3c2a0f9a8fb14360e54a97a8c5be7696f7e7cd4d73c5c9a7bf6f5450b0a3d2b81e71b65639496ed903250d4cb3b437dfcdc567a52410d1c3766eb40d139d453ea818e10c46dee2568e10582506023b510974d6b436e8b27551abe553ed6e07c3122ef363af6de17516482baaa31f3eb0feb8f4fed35f3a5afd8280d50c61de9b5f8da0c05a86f5a4ea2a0b67ddd1d169d607978bcb6a4f5a899f1841237786b1546371bff5659338bf11453a2b2bbe056606c5fe5620a413b42d6d5909504071cfce7439f0634b5690487ffb3a023b4607d45479af4514a02782193cb0dafd7c726d21cd362020d69a88523065e8286e50a928d0dd8f64"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (969, '{"ob": ["15151515f6ee44eb892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e184d84adf664394926fd5e9f5e93c21441c3a81bee5fd7a8d4fd2d5bbc5ab6311320fc9ea4825bb75053e33d3c80159ce6be585ccb36194c475547a0ebd7875ff5833a68dffec750b4a5bd1a08318332aaf24d3b8644c093da26bdeff25044378dfcca9e52096e5d1ef434da9dbdf24e636ca9f006e0dc60ef2f533d83531263ee6d8a72ae5d0df74139fdab59360165bd7fb645c4cc129df9470b438607aa77de4ae02751a11f7e1de68c417a7d83224d2d48bc5ec6c478cef3a5e2001307ff893a79d5cb2603c4304c45e8bed06d68f5c52ef1bef7e2e5c400c3c8473798a14391967288d7ad2ebe4625716e24d0c68e7a9102e2b730888ec5e895e85290843c0b7de64ab92d0bacd5e0c00ff1516670fe47e40d9209e2bb878153409c2a4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (970, '{"ob": ["15151515f6ee4491892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582abbf58649f8c50a2bdf678195379578341d0d811ffde812236fb47535b5003e7628d221f7c68c7fede884e98a36baf71b2972455347919603b1ea95a59dba51ca0ce82c8013537254cba4c8f6b3502fd9f7b166f4f8a9c5f1bb4f260a1418ecd8cb011b9b395c2288fe2b79800769ddaa8de3154d4275ef5a41c77eac97e2cc353a9439741e5a92c1b09a22bf99973e1ccc86326f5e06a431b902957dc4c99d5259dcb3b1f58501d116a158276fe11eb95503f77daba945227a4d880f024cc51b8859702e2fa3495f54ead830da980f7663840f987162c09ab3b8711c9b27e9f36afeabc1cbb59ee0fd46344c59a780c33cc8e866d2f48df5aea19d599e83ad492aa26cb53d7576745089ffe5e8272074b908f096837a3cf8d826a829b2ddea"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (971, '{"ob": ["15151515f6ee4449892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d11e1856b04811d53d0f563bfe6278121630815899b73fb267a6c93f0f678910fd2504ce44f1c7bc14d31131569d6585d7c43e07f04cc67650853acb7424157c8d78aced209487a2742ae7bfa2208d35fdcf4ab2cde842ad29199e390a9d2dce9505378e1e24553de387cb2ccc28e140d62256763e071a67d5347eedded932776523f50ac3577e9fbf0aba39da42aabbd6206bcbc9b2a796734b50bc51eb53de9183fb94f0a8a443fabda0b79413ea1ae5d9be68a6a6e2a57da4e270f01659086792a7160d1f0d279232f26a48e556f9acff5fb40193ea30af7d255adf27549b6a9633fa8217964b9699fdcf09729fbd61227f0b3c5c0dfc012e64f115c113e1c748f11ea76761c1bf48248f12158a7754e0a4e1363aee87a1e57c010338c1bc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (972, '{"ob": ["15151515f6ee4414892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588efd8df4cc1ffc9b59c0e9711e3815d7499157eeb2673915c260feb24af904c194cf6e9dbfd18c92b3557247b50bb295cd3ec1bd63f2ac44f5b52fa54cc83dc6b783ae75e7c380fbfd8633436db5515847c1a7d90dc5722c3d3ff8651952dc6d8894c18b8b698dc9cf6b4e9e780f52380abf61f0054fe23629a05abdbda1d4535fedfcde39d118c7ca8e55e6e4930cd6cf25536e55b17b965b4358de4b3609b719e2fed0705925bed2bae6a1c167800afd5d3749c17785aadf4d9d40eea6c66ba075603a3e4c022bbf4c6ab81a6e5fad9319e2fa3f10c4bdaa2335f3483e45ae654ac8a8dfc70d8396cf13e02cdc4081c24da208cdbe898370b45c4117c3fd3e424b6ac327d439c03ac7e4c3115e73301aa6e51c26a61b6ba06b0a69632af7f2"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (973, '{"ob": ["15151515f6ee44ab892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358c3bc38c38b4b787ac10bddca796a833dac41b452fce0ded73faccc7178b577a94c83c2ba67464dbf216ad7518b2447882e6db93fa361bcce60d2c1da40eb29f9c58b2bacf56015bd840aff66a396e5b6fb02529ed46033bec3b1965415a3a6f2c597edf2d71cc9ee15174312b6e8742dbab78a4cd8439093df00c7c7740de39dddd835c92cb1b190d3c17daa87165a81085e6897c315493c0289f5a031b6b01c4ff36e231a2a26c954b9e3bfd0c31c7b10d236d7937b4afb38997866ff2dadace12d04fc6d38e8029e1e3e06e574c5a7e8877113c4bc5b329c8d55120eaedda4060aaa6ac9cc3d884ba4458581bf40650d2d02c14414fdf0072a4e25d1607e7fb9fd53a89176faafc7dc7b0a1be2b1b88be489d41b19201a9b42694df18e3b0d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (974, '{"ob": ["15151515f6ee4454892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135854c66f78e3157df309891c6ec4d6a3413b76e57b462b91d3fa1a46b1a85e05dd5fcc7f7edf4526c6a4e9ed7cc4735c49dde817bff15a066763bd4718583651c1041fefc28c7e144e50f01d43edcfd0f66094601e7e75fcebee52afc22d51561f1741abd1b6a464c1516f6444d89e2b30efc10a5186877381d9cea7a0f1967dd6b86a0922b42ca549d8eabaa4e68de09d86adb2ed13713c8f82abb27b8c5ebb41f5a680a41bf3226a3c2b33e12b0b8132c9df4a5e9d83379794292e365cbb99cef84219f7ff59664457f434744a4a88db7eab2429bd0f179cbfc5bc85d08d879f5d8e7499a03e2a29612a07d07dc0f990ee2e68c85b4e91e074a36c4113276367da924928bc338d8dd6ab6aae6ca05ef4f1ccba86710fd767414abf093c69bfd0"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (975, '{"ob": ["15151515f6ee44fd892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135889a21e8c77b14a57efbee2d57155065721485afb5ad09996e468e6668439e1774552f9e428314de223126a8763dee4e47859db697fc785b5d717b6df30dbf0517f32dc95040fb6222a693cc8eab39b4914ede54898d548c4d9b17eb86ab5a72d996689da9f6d37e05c2ac7066683124a2460cd7f563382c4958cecce65a20e2864a427f875970c3d82bdee2e4552f29a91ef7997fa29358de3606ce62988e90ce3ec1ba7ac438348447325f7779c0de146c92b66c46528f63452b7f8c6984c6bce527730b0d0cf4799cd72e72e4fa0355e1b7e0331e1d1a2d3b236e7c9d156306b911889f81c53082541b58b5b601d5c45e15bddc593285bc108406b9a92eec569239bae71aeadc96ecf7aac1861316159143acb2acaf1a7f246035b2a53b19a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (976, '{"ob": ["15151515f6ee44e6892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135887b7a5c17a1eaf53074d65edcb9daed22331619f1822d51663852f9076ca8115e588698d149f5e16de7bab949d1c2924a47e6cad18f20f848a043d6eb0510644b07b3a1a31428f736772d8679d011bf567663862b4bff1509b8f4322684ad21d412caf6443766d02cbba73e18d6d76f29ad7fd1ebf713a9069760ad52547cd055fe0dc91b4f60b83963be0db7bb5d4945b99e8be38d04cddf7133bc9380d0a64f0bfd3be3547e79fa826d287ac8f3ce9c40cc077e3cf0e44bf860a28709d9e9c8d90a2b0e9ceca3e92473b712fb39477cc9875c315196437df50f9fe4498dfbfa535edc4a6d44848a7d00be7cf12adc1c81f9a9f766c4609fc327d0d9724f7adcce4fb470bfe6b3a438ad72aa989e276e3e09458c5d0948f0393ad2d4ee49631"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (977, '{"ob": ["15151515f6ee44de892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583f61eaa9a8a6f539630c56298b477a812b0cf17cef56537521ff57fd90fb80a7c05ae1329488739be245a39f5b82692fd1827de770b0955b30642c22b7ee562b7daf9a2c0fc6af1372e1120b2c268be341cb65da8ea05412e8fb31576350fcfc010e3a31443fb326e49481b62a8e86b10258deff7007c110b3181a6d9ad02941cb50724c31f29d3efd92682ba34fa6a21fa65bb2b1a92cf8147829943daf785388019877ae7188ba2c41e889a022cad0837cbc62dbfff153e981d493d35e116caea2889b706bb58c5bc5017699f417cd7670cfa6161aa531e8d96905cb0a09dc88f5c4a9c56cdef10f29d8f4e01ebce771aef7cf5443bb1a5be0424c6507ceab1539c720d8df9413648c8022aa2ae5afebb5a38328a82d773fb9f99bf308d9ab"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (978, '{"ob": ["15151515f6ee4450892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358e6df98430be55c6416e4f030b34dc3142b8423a4a319fc7de06912294bb76e966d54cc554559d01215b6cc6573eeed0ba4981273b6bb1dd41955875d7a08676ce7ff15f5751583e7527c8418c8edb69163d8cfd88bc46a05e7ab4b67f1dfad2c4c5a2eb40db011bfb2d5679922abebce0e8358df295e84fd1486eac67dbb9f43c27b678a63184c8e8258db43c23eaaf7906fe1dc792a0f628a375e54492c86cad3c1e3c5c27969c5a1c4658d0cf50abf2dbb78a196c754445089204b1d719aed0208fb0bc32c1b27145560a57c62fa2c1d5daec1aa27028e317e2877bd68ab79a328602d2b6e0d613d98210d2ab2ec39337237b649689e5edad375977e473aa11beba8ae56a61ac2df5f82d206a5c6b48cc5f8f2e7cd81fc1b6e1d34dacb87d1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (979, '{"ob": ["15151515f6ee446d892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588e108406efe989185191a398ff3af1cb86b20371e4e7144d719f88b764afd8f23a253ea89273dc073b56aa9fa7b4d1c2de9fc416a69a4b7ac58703b6e931d5ee8aaf9dc17acbe14e5758e2e79146f780f79957999734f6b99296edee6724e891634aebf54f31cfc2e76bfe41814b27072e63917470f4451c530ed63a272f430cb6ec04ef1c4e9be862d73fdae319dc1f874f0fe51aa3817e2874d591a4ea6046676df28fed6a3fb8e8c153f3e3721f04b57886cec2eeee91940114d7fd9cc6d2f093942ca2fa4363788970836275d3693e2fccbde1eab0eb07c07cba1ad0f9b8c6657c68cfa83885cb976431123add4317e9887374c34f842cbcdbb555448fbdaada05098f54e9f81b596c65a0ff77e9cbaf682925fbd33fb646f7d2d950818a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (980, '{"ob": ["15151515f6ee44ec892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135886fc3e00ef0fd701ea9d57cbe1a6ceaf6d3e0845b855e44eec21cc240aca5f15e802de47e594db835b5945f44b4f2f83cbc664db7c735b3c214cab258c1f3850c5eb16b2cf745b0a092fc45063b5df6bd385e97b71b51fa839a8a55aead72db8e1d23707c2ade41fcc85781d60db34c7136951626d73905161d31a5847fba25bed2ae24fb340f50363e90e93732698be30936a04f50bb60a348e88c7c395c77950d9001a2ebf2d29e7f6cb69ecc6de82189efcde6776267184fabe2df14c87a1da77f00324787ddbf3728494f83ed8fa262abbfc13742cc4160470eec7da329f4cb075f5224bc41d8dae8e2fabcf446deb2a339d84d2f58c946e6401e29a26302065814dcf94993ef78d04044c6152ded407c0802398e7c09d653736014e55df"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (981, '{"ob": ["15151515f6ee4458892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13583b69c34524314772a3ba4a999d68962916f11d343fa3b03dc8e44c7b54eb793e37101f6057cef3c5ba745aa6d5e6180b83c113c5619c232a8596792d68bd12a89138b6f0f93fba4d12e20a27cf332ad2bc578eac0f9b4087fb08933ca6b58ddb6f625153b6f0563a9c173e64f65e19bacc56f995e9136ef37b43bc5b92acf8b56fdb2ea3e828f33e672c3a54136f59c5defe832ae1c0395ab518e8b1ed7e779ad41fa6674bdd27af5af71f596fb93813c7cb4e17b2c209582dfe0334d1d47b0b0a4ec534c790fa3e861e83b3aaac200543151ea4be02436e7f014cc8637b0271bc840397fa90ddf1af4c6534e1baf2ced7939867867f47e359f191608f2061ce7096c79fbc6e374eb072ae6a4a22725e406f14f8b9593f3aa9e2912b06a21e39"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (982, '{"ob": ["15151515f6ee44ca892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13586b2d9153f0c79b7fb5e573ac59ef28b1b6b850e5f48954edbaf8b61e3614cb572e7829c74c77b76361fd539e57a5fddd3ae9d5695675abe5932b701dfb5ee3a3fef3cdd92a642962b33873011670888a0b6e90c2e2ae62e238f96624a5dc6525b06eb23bc32cce9f6daff97a0459c7191df91206962c1f6b8f8f113222a80b6256fe6f36c91407162c65934709e39e53c1ce3612e13252c79488af81bea5c23a74215660d411579d5dc4d224677973b3881f63ad240ff3eb9c82b3801d32b596ab975c118204a89d30a080881a0e5eee0bad2775ee0bbd88612c5f2da5d3ec8d536cca73566c0e5688943045d61949293d6fc4d452bd3dcaf2aeaa8466944062ceb6f7224c353345fb7a7e4b7f6919c1b169f554c724043c62be29c1c3d7ef4a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (983, '{"ob": ["15151515f6ee4497892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f0d7fd791f7fb65757e661b825828551eddc78639f1489f4780c9822b51a0cb425437ae598c850d20d19cbb260c2a9ac0aa0f5935c971e8ccc88208bda6652db89ccbfabd6d73bc1f9f0a54a5984165e692d43371fc28615cf9654b37dc6269dc67546a271cb839cf7e971941a97ac022412e342bc3e99785c23ef7f09c73b4333e3da0bb98e50270811f5d10ab17af8040be5ef5877f532dfb4dcf09615ffd30fa592a4bb74b81899a747c55bef5c7be15b9db5013383548be91c391f8e7e3d9f53b6988221dea841da807f61307f07622b008777521a0eeebf49b1dc7ff58a29d6dd2bb09f1c0a64a0f920ed74190aacc9436da9297008ce5e645744f0a49e14b37d2bef35943fee7658ad1a3a86c1a5e3e4d952da95781b2d70537ee75c30"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (984, '{"ob": ["15151515f6ee4434892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b4a7032e1861f99df4e8b28609c7a3232134283176b6309d12fcea076509d30a2cbded1a890e1fca5671bb4fe0cb99aaf06c75f15ad584263e8cce3da630b6a6b435b145b87178e44b9b8ccd65a723788464eb84e32fa6e094d4ce69219150f30d382ea181db41dadff075990a3ae891cd438e0b00df9de6f28806c8f82df4094a1f7e8f7e9c7d365816a2e533902a8296594425d7df1335b5f2af88fe7af999b07807fa54fb025ba24087924477928d4df0a6584b485d9b690c405de1799aa76ffc25db50e6d008da050612b4c794077ae59ab20d0efb4190c9a37cdfececcee9dee6ce6c47cda5b950ef290c095e3d44480f082b0f7abee84d9f5f364c2bf8c1acd799cce609d25a947c427f516a4ee7f63fad7578d26ab2b6f81b85a14972"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (985, '{"ob": ["15151515f6ee442f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358dbb2c702017c7aeec564734e6dbed61e979a5ffb76351f6fa6e793ccf570b1b2d814954bc04ad3506ce792e0d67292bccbc7b72fcdd2c5e52b0390a695266ce288bd7eda2e4f13cdcf663ced89c2fe56164f402bf1f7184a731a855b6b344beaa071b5d61fe1318bab108c359e73edac6ef194f99b93d811266b959c09e645122cce0e2b622a15cad89eb61436812b38d3921bf0dfa4aca423c775b54243335b88b7b75997cbb1f3c538c841011646200a7ac2ae29e1979850b88bcab5495bec6a9d4ce9e0ecd60338a7ddf431574fae170762c4476935f7d4bfa00c810a1bff4dbed9132096916cb2f46d768497a6936419eb187652d244dad51a4f086f9d10e462c3b1298f7238a55e071bc9f67949789657aa32a5cf76134ae6c8d1fe443c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (986, '{"ob": ["15151515f6ee44a8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d4de3ee6e7a04a2a0219aa679319d0d5ac219ed3be559d2f50f4be7e54308d691fcd5ed4ee986a3dc3b2999e9bdbfbe7709e738acb733969d56a5f6e595555b719e735fc4ccc7b6adeafb8b4367c9add6e2241c78eaa0cd866eabfc3cd8feb18950eb4887200757bbba72b5e056ba03cf6e8a5ceb85c4de4262b0f43ee485c819f573108388de17f397791972c3956173951971b4416783ae52fb175cd31c4c13ff884450c10b455406badec8b38ed3b1b96f3de1161b0aee6babee2e22c3a3bdabdd2823ebc0214ae621e02282648a73e6ba90a72addab092a99228000e773cbc00047624cd5c2072324b497ab0760b815f15e98837cb9d1bc2916a71ce2310d77f240e0c739f6366186a9df84fc5da7cd94a52afe6e482ff23ef79c1285862"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (987, '{"ob": ["15151515f6ee449f892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13582ff7aefa915ea000cfb45f95aa8d3734ccbd27be094f3c08325f21b2541ddb6fd7526f43443cba475c122dca4ece0c87a7f585a99842373539aaa1b4f487f2412dec48218b01a544f2d591a8b98f38249d845255c291d069709c90d2e22552e59238b7bd7e742080dc0443f96c42d44559d8776f76a4296aca49ffc14b402d9832eb3796c04a8343bf8d4c5c092e0baeb2f88165d1cffaa1d11c46c1ee04428e132fcca7e2c3827fba87173511d05b8eecab65f702a067ace201e34fe4fc1d6025dc0234a5b363054f4ef2f7921f16a09ca2dd936b911c50214fcce0f8f0c9f3413bc7984da7ddf1774d5a865b1d16089e992f505fa96141512a01204338160e4b80157b8b1e70ae3733e32dc03c23efc02da74c273ceb69f7f2c62f34b9428a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (988, '{"ob": ["15151515f6ee44d3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358df5b0fa9303f8bce078d9c4f181896f7ed365ca10bb5f835391f6b2f568878aec4b671402d07a85ae5df99d8c2dc80ace6db56c562e4f6f08d058f4f6dea4bc5fb3d259ff19e93e3ac01f1bf71bb350a406f2292d1166a721e3138e8918d7f54d6adf55fe843d48d687cae7e144b3a98d2fce7e33b317a1196cacaa3e0aeeeb0c16f4eac04ffc88a91b58ca9fde3c4560f3c11e137bb59fc680f8d09cef1b1eb969202c6561295aceebc695790c0d68505836cdaa1efef5bb475564937762d27ba01cc6e1fa770289062159cb2b77a8cabd8fd654df0caf5ed8f4fa036da531194aba7ea1c0c09819f6890cc7298dcaa36a5a0fa2a34a1f073ca74edbd464bc5e89896b365b2052569948a166a33d3e9051bf7cddb892deeb5343089a280858a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (989, '{"ob": ["15151515f6ee44d8892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13588d8790c56afb92b22d35ecedb2be5428e5d6b1ee6c5b8c5c2be729e69198fc503c28ef2fafcba3a87f2ddc22c2bf742a47b0d031e49dda71ef644345ae8101a16cb2b0bdfd24ef5abbbec7ad9571788e5ed351974d9469e546fafb3846de35b1262b2c4f8c14d063c031d65f17078eeaf4f0d99433bd9ce29414de86e3f68639e930c7fbea1eaeacf8579816e29055bc9706b346f952c46f62d5b0b3488f0f0fa6a44982eda6ecaf6cd48effcc9ca4b600e048096633712cdd2f891996313574fae5d3dc93f1363e94deff230a7906b25ce8d1c4651c0a5c856db91717e280cdad4f65766bffa09ab15d75ddeb95139d4fcaa12be13012204b46ba27fca5eadef0e0820336f2da5fa9c3233e481b6dfaa1b29b56d8c1f782ccb0353f9813f98b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (990, '{"ob": ["15151515f6ee44b3892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f9b587f4fbe5505bcbf6305715d349379e11b08e7d359843aa06244639d422ae0e0f7fa92caabb4537bd68356bd8712604a94b3ddb4a17e557573e4b2a20b712379afb819daed02bbf4fc851a1dbcaad6476aedfa5b0585065613a7de035fe6507eae7d45927ff2805cd4e2adff3b7e2112116485bbd6da55a253d617a82b67cbbb0f76b5ef4f598ef8f4a42638de2b8f8fc75a386c910f79e25c6f13a3d875fc4844882aa1f3dcac9e969a244dece1df3968c1100b724338911635b9d1b9bd661b2598c1158a2cd719ee0a35f792be46085d16c4797e50d0ce1d1437eaf8c308256b6f08eb85cd6a87fcca885e90ce26852b5da20ec1e252dad885b0e2d59dc4f08bf69cfeec6ce89a78885a5d1f81ba72cf7953907713cc413d7d4f63cc5cd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (991, '{"ob": ["15151515f6ee441c892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358035e115480859b9617f97f23678219cf97235eedb31fd8c5ab722800ee47e00e1fc02bec142066d505bc4851403562821bbb5e0f74a2850e2b3dcf5d9cebad43732bd5935569ce463ffa0e64a07b6ff1480e6940bad7fd49bf834e8ec211b4830df129f0cbe4abbea8eb5ddb1379c07094e2c36790ce57e11c9efbd78d616685d70340ce130d66b1be8c7edcda74a2fecaab9453707bca907fe189842d61786bd6688c24c043a117feb6077330fdcdd23fc2ddc87398bb4d1443d1dc3b43ca1ef4c8ce2606a03580e90e0915c75ab92edaa0272dfe0fe434604b4c8d6c001ace8e6bf063a5057964d73fa5f5aff6edcc04a59b91cb783268220ff0f5c9fd0e2a76974b9a4081c9964fae11c5a2f6b6050b304c6a399f2ccc1e27c068994b2c2b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (992, '{"ob": ["15151515f6ee440b892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358d34db04a83efa9ea75c4d4b9484419619b389a09ce3439a8dde2c2ca49f91941ce192370c675b4ffb7f1e5916ea33e021849acbec91f9eb0e0d4e9e802de4028593ac728201d349f8a1ca12e6e59ee689f3fd320b981ee09b1b4ea4a6b697aeb6d9f49d760a42e221f86952f38a2be767f9dab66748b09b78f1d1688b715050ae61391b4b435f3a065aa64f0b411a286598fcc7a7be0c7ef8ea1c7006eb7567e409887ef993536d7a5bdaa190374924f02466a30f49fc976d672be36ae9d04f609f7a1ea348843b90e72e80f43176811766ceb3afb98ea0ee0c91df5455320e768a079d0f322e97a8de375eee78769c4aba30b18010d73639566703a90d0e88251d1cb731a39f87b46f4684a301492c43640160ffb940156a56887099e5400fb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (993, '{"ob": ["15151515f6ee4421892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585683bf26668912c16f358d4dd6e6ada5b4d3dad1eabc9f99b88e212299fe80a41bf4b7ac93180223d172aa24dfef6e5225e013816cf5c3a891ce30502ea9268c13d9a412215027a266a3a20881f85dbe14a4c9475d6bd9d58632982d08259ba5b28b8657538eb12658cd5d259c9b37a1df7ba705945f6f010e8ac1b1f85aaafa00484fd5d4dde339825a1d55e315f6e6c7ba98f00bb9e4c683f97dead3796cfc881d3d2426c7d4b043a3c7c1754678ebb702fcb3c33e26089c53f08fddb8dd663a66633bd7910fe3dde833750cf404ae861ea4a733097995897731720aca1112cd426a1c86851de353b3cdd803a849f92ad2dc7fed6096dded16fe32eaef35a0a3ece8d81ecf92f58664c5db9033702783065aa47f202c3146f29c510b1161a1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (994, '{"ob": ["15151515f6ee44ba892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135804030333caf195a22b043a8954aadb11080a05850d4904fd46a714cca8d4c1353ce1779fcf59b9af273a40fff6ea22ad2468ef4949638c7c6666583f582cfbee4703c1bc347c75b0732a8bb62592059bd2752ff41abe9c5b5558f7c408f41621dea2d55e4f37d3a37456bb5512688399a6356f1fbcc9fe2c75831d4236db60ac3f9209debf03ae26466b3f0e8eac1722fa0660ae5afee7f57ca7bd21377d7133e5e2070b84600fe98d8bfd2cc02a8e1e9971d45e925f5dfca6657f2d4ba708a99e1583598e9bd77f09350929102030ad1cab43c0f0679a4e626ca5b678efe1240c59e57f70c884ff1c3a4fc63a7e623b7dd307dd31f7aa612b88c995986c321e0deb41f7de9450dadf59a0a8e77dd6ff7d5880ee4f7153ca16beb4a8b57cf631"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (995, '{"ob": ["15151515f6ee44d7892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358a8667a57e846b509257b2a1e56ff8d30fb37bab4d358eac52c4e60646b42fa0a84ecec6ed8ff120f0b756bf5045edc74fc35813f8c2e6f181db7f3491ea3be07beefed9bd3db1ae6b82018b8d101c044138e6fee7ea6349e47934a0fef41a385e25ea88e7df688798fb89b0a8f136b581addd827aef2a873880312a199f846a68ee8c19428564462ac9f205ea5cd75bd3733b2526057c35c8f8951b565bd66e0d48243f99c3b061693154b7a300be17cf97c79ef18f2400a22bc510629d79340ff4a0cedeba6a04a2eba3fa7ad8b83fa68390845a0fcb4f4be761a21bd4cdcbea9e7b93c99e71c5f7b3968d8e85f6a555bf04d1cefb81db8916f72bd96ff17246be6355b58c68e2ecb7a61e18476b66ec27597b9a9ca4c5b24654fc032b83387"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (996, '{"ob": ["15151515f6ee4448892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358f24221ffd3a8b2b3928c71ed9ff0ba0c82d1cac0832fef367c61d96a9d53a5ae24bc56d2d4114812a4f5c99224c0f25e78623f8dd04c16e3ad985a03cc21b8c5b4c167a3fbe6be4d378325cff0a20b365afbb6a0699955eb54d1a5944859b001b4c63faa963b5a4cc62ffcceed92d99abf661f519ca6f2799400c16f962b08dc6233c55934ed8367ae7b46f963937cf6bee364290d0879b7dd533eac0d6cc80699b09f92652b6ee2270b4469e9c26ca7f2518ea0291fbd2a24237b23d5651da40ce7bdd2aee628fbfaa1deec265d46824033c121552aa364a2a4091a306217adab50c0f50f34d691c3baa83aacd76c2a506e4cb7753ac6ee34180245d38a6f960672de78dbb113c86c00b0f5cdfb9fb8e399d9efce32c54565117e312be16f37"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (997, '{"ob": ["15151515f6ee44d1892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd13585222498e7a62d20fcd9a7a27b8e3d085030a9c87420119ac5427c29f50396af09051ba8079b884632e3c18899e2373a5f44fa475a42cef92dd680ee6dd3cc998a6792fc5b9a28d3fc043ab6279d3f54f0b427a3b1f13137c75345789eb5cc834f45f46718dbfe80de2b39d32e3128f62b487fad3d6be7e05c1c2ad5eb63b988bfb334bd5c1967bcc57c43927f5b583cb07bd866defba14ff0d30b6df0aeeed05867fe2b5e0b7ec9d5b63353c6d20bf55e42a9ae44d8013049eded4f33940ec14640a1b504ac1c77930590e581b5efbf4284dc0da8e9dde53172df8fe0ada58c806417f16e61a99436ae017522027b8c6e02c0464417dd5ef1ae1e0b475e24b6ee15750f61edb7536bb307d0259fc1bc3a3d7ca32cb44d47f3bc4209aa4b15675"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (998, '{"ob": ["15151515f6ee4489892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358cb41a525ebf161267377d9e0a08425bf2007afe80724bee7917fba2d7038c74202d3180ef6732d8b4611e0ac2bd446144dfdc2cf181b8e9aeec4e03f2259a7c5627a994b393df003e22454ff702de93e4a73fdcf56967ec5f16fbd151b81c6f34cb2298d3dafbbc28768f469e1f3a3e288a353b4bee25758e61efa590d31a74e628da9965e9d47fd0bf86120b06b67b81a1bf5d18c56d9a90ffe333dd30a1b39e847cbd9c73e52403ac1cb5373617938c490782d88c011e87f6ada3d0cf1a362080a8b7f437247abc8165b4c3666ab81ee74bfc10babedfbfa29a8b5ad4cfe733a0778190df7bd82d83fd2b8de2489e3bcf2eaf21eba048e8e97fff3cc15587f4fcd87d16957f7bf44fa18043419e01553cbf11ff28ed5896670240985e5a3c4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (999, '{"ob": ["15151515f6ee44ae892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd135894025bc28e4a00626dc09acf2957e4794221bf9ba89fc5d9fa41189f58951dc273610dbe4e4b952619a8cce930d6d77cd1f3bac690652a428c324356d4304926fb605f1e1263e0ee8fa3d2a532fe45ff1777a105de45dacd3e82fe87d1c2c2c705f5c99890d9568c7d952d45f8a08ffe3086f5c3dedcc04399f75f2c408845c38f4f90f4f566561791c56649f34b831bcb0b204204483fc5963cb507becbc8bf67531ca82292e302fc91582acd82b83c48cf13601a8c520c6799a4a8774df41078632172aec5af6133b3b9cae3482ad92cf20633911c953251ad14d968a364887447800b26be559600c4961c28dcfc2baaf6ae1a3d82b386b85b43d07b2ddf41f0755f9af6fa31c018535f72d5ec098fe85e09123049879a3ddc9e0b3d6ff1fa"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore(id, e) VALUES (1000, '{"ob": ["15151515f6ee4437892c752646fa3098c24154ca8ff62f91fdcef937dd0989c40fd46a05f19f9c211c25bf2fffc98a9dd73553db17360dd977e4b43a1854a172d593f4aface0f022bd078eaf213c3c893f8ca3114495c5afa201491ccc6ee7993171b072e6187a5f1cceba826a01fcf8a081073e3ccd1358b7069f50040acec34ee8ffca6859c2c5697978a3eeec9ace0acffa5f77f44eab3d9ee1817893f843d4144c5b212b15cf34dff842ce6ba77abd6ef14a40419c071ec726d84123472ec808f3b22fbd3a612c31cc4f0bcc94f1927df9c3fef38230703f4d6e57821171bfa334406469a5febb16d6ce129a54dce3e5ab321df89ddb2fcac911151501463a9a9f931a65868d05c426edbc95bd0a2cd83d0d93c3d1ccc3eb0f4ae75fba5d90f1056a0d89ee2299f8e7519f2c4b6ee552a78782a806a10669beda49c2acb8330c0b061f8878917503df38d50f7ed8884e5772e0dd57bf3f4678788790044c24b50772764dbba51aba331ccde2847b37e435ba735cc90ca5817ac7c6a6de0ac656dc39526341df0aede187bf285876adef316dd8a24fc0"]}'::jsonb::eql_v2_encrypted); diff --git a/tests/ore_text.sql b/tests/ore_text.sql deleted file mode 100644 index cf5a0cbfa..000000000 --- a/tests/ore_text.sql +++ /dev/null @@ -1,109 +0,0 @@ -DROP TABLE IF EXISTS ore_text; -CREATE TABLE ore_text -( - id bigint, - plaintext text, - e eql_v2_encrypted, - PRIMARY KEY(id) -); - -INSERT INTO ore_text(id, plaintext, e) VALUES (1, 'aardvark', '{"ob": ["11a6d23d3fbdbdbd4be9b266ab390a537ecb162383a4b5a674b69fce7b127f4d08c68a2b1dcb02cc8625690560c10bba7c19d59b5bcb54c1fb23a24455accee0b754a41fb6921b19980c0fa17f7bb0ac4cee2ab7b65e9e2b5416e09aa29e596b3a1d09bf0e7282ce70cc086c82ee341d5fca91dd55ba8d2578e797c36715a1ea35c98743955f71f8e743235b72d32f7c6e5b4c325cab2ec9c95b87a3532b9bcd9ce3869c51c1f10d1f1a0d4aad19f70deefcc9e53afaade5bad1402c240f68ce55824fbfd9139a18538e2979a6bb2cf70cd79594fdb228f79fdba998e97e5adcdd0fba400c79da96b1ec8695459e0888d580cdd461a5f6748c3149caecddb907fe3f77af1874ea77fd0392d254e6e2f117061173e3f14caf8f9a103c90b2ef106c5b3c2efb7af3dfbe30471fddf1a0d7dea6e20e236c0c937ae155a56b7b569b12d6fa815c7b15826982992ad549797f1235cf28b4cd9bc8aa57367a854aa4744a4737a15c45a5e3d90787f76dd50094a4ba6e66a01ea589d2df01ccb4db3f71efaf0d2542dbeb5976071c2d62eb7fa23b0b3c9b007c60e8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (2, 'able', '{"ob": ["11ff3de6e6e6e6e64be9b266ab390a537ecb162383a4b5a6aaafacfcd632de41dde55a43a25932b17e873516851d8780fbdf7e345292710f00fe9100052eb731c7bdff6f97f99d2afb5dfc5d10886523afe18a2a44e8e3db2aa3dcd465fc30c1069221fa11b87d24f3c792736de9dc36758d76fc975bc98e9851e9f0fd2d422ca73596e90ebd32f4e1abef3f3c9bcf98d8d1ba32e6642d4f82cb151ca1b11ae05a80dfd96ef13b4805102225e2c93f625763240382b57ec4decece68ffcbc35719af33fb257e99f27d6f972c95da4751dd13a6e165792c09a2e668ca0381288f660f0d16eb02404926826d354b67c62b81176aa1544a6e43f618c7a122df4f01803c458bc0bf7d7abaf416e5142a96409efc401455dd88129a3c141df3e7e178eb4eb3d2e76674c3cd14a4c7045168e098260ff7204a2d69dee0b5ad76c368549edb30382973f541e752ef12380d608c6e033115bd520144b607b050f13ea83c58c17f4613a2f771ea4285e1d679f11e0add00d1c31263cdf202e779f78ff1ea5f95ef5c8125eeb2c2a625d98c404a66c675027d52a76cb4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (3, 'abstract', '{"ob": ["11f28733959b9b9b4be9b266ab390a537ecb162383a4b5a62914535342f057889c1fad8dbf5e45d93ab80b0cef21637837a8942f435f237d9ec22b5da003cf6f8b404297eb6387601417f13a2790774d6f1a9d319afcd3add9605769659e35b12eb08225741cc90a0f0b74963326e14c2aab439d7f7cf732cd8d5a9f764e2404258b1383a77194ee0204aaff8c73cd329cbd57af2863b9048076217e3360bd707ff77553fb3bcb1a8b06ac3439b6febcc42a9c060230f3bb6abbfafa5d2e579a904052666831478eca072e0955aa1bc06a1bdc4021cc4374f04c1bc2d193d2f829cd25ecb7c9d6436a8240ec89f9b48d6c1b8a905a5bd8751c9d208e10aedebc93fac56cc5fdcf53312b10959847907e43d9c0d54aacf08a44f1eb42b686754f724cdd2a863de2262a9639b4b943ad8eaffefc6249139841db6c9f23ae136eaea408064a843657977a23f51c632a2068681f08bd889823f841d273c912efd9f17e4b8f34a38fd508b2fc106ea4b147e19d248379f49e3d6bfe2c805aec1cff9cd0e375241fbca2676274fa7fbddb7e8129a04b412ead9619"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (4, 'ace', '{"ob": ["119ca5a5a5a5a5a54be9b266ab390a537ecb162383a4b5a6b6367728e7ce4b064702f08441e6a5a99fd4eb80a3574b7ecf4fe5425319cd3f0ece351f3843dcd64e7150aafdba6f28d47cf8baa308ecd01c815045bc14d74a1805e118c7c60637551cda3c0739e1608bf7bd121ad94f5fe428c6e472dd23cca9aba3b22bfa42c782aa93da43a2d1c09871efe2f66435785b7abb620161424618e9d0746eda0608ee5af9b389f0110c2d7d82f27cd80e697136fbca4d45c6b524cedb799346c0e37ef273963d1e2d2ced4831c5cc01e60d941442c024d7868a3a18d0ec5434a7efe92c61442b9885eb94978c613ade0311e8b6f9b9e7e3a04ca54dcce8ff1bc1d2b96facde374438ce60a965aa492bd8c79f12887eaac0bd98ae7e3d57c3d49a1deafb441769bbcdc48ec5d52b65c1b06308b46d9122264551ab7242318fe4bcd8842ec6c939daaf876adf21381d799b4187a1bdc4715f8e33e902c91d3982394bf9614d0a4bddcebb4a1ddf80b92f64007f29b27a38a84f5dde9ddfe877f647bf72d2a8b3402450cc39f5c806b1837a413513b4d32443256a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (5, 'anchor', '{"ob": ["51261de53636363664b408d8a82584994edca83d828ef7c83fd5c9a6410efbfd1efb25975631985206f51fe6b790b552d025cc353d927aca46af98e85915b26fa80010ed49f7d0e268595b06194ce7a967af1ff8c8a2e697a746177600a72bc6ef723ca769bc9680772f762ba7dc36639a35430e163dc01791d1043d03a871ec943bcf7e6d93a4424c6169592a6fed30eac2e7b11f06977b73d1639aa79ec05c6530f4bfc73dfd235380265c05d57360b43f8d219ac2d068ad882673c07cd13e14a7e9e2a03d7038ee536febf416f8631812da7f95327c6fe2b9cba9d8a9f6503ce0354cb088389b492b6937fe4d251dca6c2380c9e46c447672d00fadde9d98e39c970c4e2679db6117b349114c9b969a81b241d310fb6c29ba0423335b38eea0ec71084f794ffcd0e0bf78646c94f6f6b70f3b85f9008e4b21afd2453f8c2fa714df926324f220c8eaca5432cdcf479a3621bcc8a33f90e6688d42f5f86064a9ba2c7a0c4f602a63643aa4fc652058b3ff10a1fcf58fb99c0c03f301f1bb15352e71771f2abdffe50c8ba1bd50b0e8514f4ef2d7958e12"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (6, 'app', '{"ob": ["69674a4a4a4a4a4a5d0a12d95724abf1702db28563e568e807a0893ada126bea52f708fe6c4427f65bbaccaf1a821bdc130ab0788e0637b2116745f2e44fec82c212fe2ad40fa600dd7211d3fdba2916b79ca9e408d5484f39dcdf7df0be85c32916895a6f0b8128a8fd806b917d2c548d71801b4d7b0ddb63abea7cda61847c110946e48891281a0b84fd041f715dc7deabee8f3da5cd9b1321b496d3f282482990a7fa2f27f68ca30430e9aa627e6614f386416d9b86f687284b0629f57eba8f84e55fab2d37723b3115ba414c09ee2e1181140e6fcbe0388cd22306b29398ef7674a9421c96de20901c4752cd5d44e5c1c18d195f885473ca925d6925a9b2bef1bba1483aedc59a2595b10c30745e8f8fd4099220ce4db9d17b0ab3330eed428ee082c2355a653ef97e672e05f7032ad631bb376705013ec85f0db9d0a320b1af96657dba9b2abc0370e8b4202f71a95db719f16de0775972bc0d552d97bfef60015b1970967d21c3a59d272bbfbf4612512a74f16266817384a1506fb699cfeea68adc868669b32baf6bdd532bde81708a5ecf53431f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (7, 'apple', '{"ob": ["6967b3b50d0d0d0d5d0a12d95724abf1702db28563e568e807a0893ada126bea52f708fe6c4427f69de0b0a42a36cb0d747ee9c61a6f2bc7c5e4c9a7d63b0179fa11d4b509d9cbb7025230c5b17f57c14bdfb5e218b20c66fcb2cb01834f941875c6cf60344380027d3370d42298b5c81ef284743bcac4a893c629d4ddd9de83bfdde66aade949e20e27cd7a024affcc48339fc215dd300d74d685bcf56fae2bf6146be8e92c735abed6b1658354cf3cd346598a1a99d02c7e356dd9a905bc1130bc1d73857c9705b1c0037a0d737f25045d1f0f81e27e506dfbe88a4fd3d3731b8298d1cde774fa8f2c6a2fb8d74eca4642d78f74c61f9bf8552181fbe244cc20c9d6d55bbd8a56ca282d372d3ee25216051ab1df5fc4f073808159a1f2c58a5a296f17ee806d4a97b5f75d56f044c048cd135abb018499c75c5b23711ee3dd14646a45273b6004fc4ce63d40daee2b16699bad72a084f649aba27201dbf955e05744a5ca2b27a286d11823d2fdc1647ca1ea58ab4654472e91813f4f6ee4ffad3968e435c93b7adf2263c61f57c8e3edbb6992425b7a9c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (8, 'application', '{"ob": ["6967dda831fb90a75d0a12d95724abf1702db28563e568e807a0893ada126bea52f708fe6c4427f60ad5226d98da168987fe8c78b04e92d27fbd605b95e9aa22236e1a1f05fbdcbb94dfd1cdcf816758228248ff2bab2f585252251f6dd07b10e4c81518abe7fbae15f66d81cc6e00bcba7d9668be8790619d9d9f6a812a93e64fd5612b9993c30909e37e0a8954d2ca385494774c3bea35ad4c90b04dec8f76491a295249e25cf2b4786deb39336d5a5a20c8f7147148d92cf6ee8ace3c1812fe71cf2b5f23c3627697488dac67096f953b17728ff3614fd99ee46254298d34218cc0dac92715a371136faa158395eb742155bf387191e011147866640d6f58e60c514e70d201508dcd742750f87e084d387c9a67fd4835191f7284d0dfcc2725d85c9839ff283c06d77e22397c953bdb40f2fb1ee41d1a2a76170b27dc551c3b2c9e9112ec8d3d70aa9e2505f85ea98b67f5e9a09f3e7fe6f79a6d87b37a606ab13a54e2f0c8f341d4a33b302d622cf1ff65c4a6f442eecd031c4b8aa6e898bd1e838a9117ff0be8286b2c65ac17679c2fd1d4ffbdd6b1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (9, 'arctic', '{"ob": ["69a553b28c8c8c8c5d0a12d95724abf1702db28563e568e8cb004498860c02350afc826f136a198bf4f3da484faa0124dd9d05eb60443305a0bcc39355de6281e6560cf3cd01a5d0a9cf99d7c7862840c659cd6e3293b7fdb9de4e1041b6e2b7adfb51af010f34e0a7b40abe0b075f6db7ab1c6234c4ea6354177809a16f70b4bba0ca0cb4bdcaa1257d134228555a661ce53ad32ca03225115a3646f600b450c9a87ad6fe881723393b6baf4dc330526a2a1235f6f6e17db9edfbeedd0a2e934497f0e85ca149ace01ae81da376c81460a0f91fdb63b96a6e934eb431ec948b0cf5da15eacb76aaa10c3020e477a473d6246356a400a37e9ec6e4b0dee0f4d650c917a61ac43510bdc59a49ba76e41afa5f0d12e4dd3606569dc1ec9f8b108070f799334c90594205650449d579f38533322cfaf7e1d6bf7d0151dc85d523b9df157f141cfb1d5d71461a309b5f4b34d27d8acefadf6ab18e4f4e739d1512b49d283dbf50fb3a01e3ad3e349c8d97ec818ecf5560561984e2e3f5b08887dcc3eb534be304bcca5c3ed88d4afb2bf38aa4f61bbb39dd4b1f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (10, 'badge', '{"ob": ["f34135be2b2b2b2b1a3d274e8b4e4d0e949f08a402df6cc63ac8b359577c18a6d44bfd8b86bcac39589358ffc9a3e0803a15d272995d291f80d0f424d651570e56bcdd58c1fbdeae3310fa9c02da526c2ca11694084bce776f4a5d87e3202b486555451c747907ea78f9e0da5d6c946bf7a75249ac3513c29d15279841aecefeb78b2dd3e721e83426282b92856ee640ce621e08b84a6a69b089a8dcbfb4f721aba781b1acdf50eb3ece560855922817451c85fdcf7b563ec90e27b639a6a86dbd9e554e9a1faf5a934867121621600aff42b69adeff3a76437be88b915eb31cc8b1ce9c749815c713d2ba42eb5663636b978eaae1f2885f1aa249e36b7ba589ab31149f2939b7181437b7f7eb10d59f93ddf9af7f1b4fe8f7f3e7eaedc8e92e3ed31879ce5f4f2a7754de59635e035c8c87232e9719145cfd247c878f76c5082ace2f06c145a77ee9be14a65992e8ab5b860d303912a5bbe1d00f9d00c91646ba61d026de6599099e7ee0635cb86363bf22800b62db8266224af2856a4708a8346e2fc5673c7405fd874ff0d4a6502440d740de07697434"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (11, 'balance', '{"ob": ["f32e1ec595cecece1a3d274e8b4e4d0e949f08a402df6cc6e3178aa429e0d670fd4a9777f9b5dc719b7c4d7162266c127a418a4fcecf1cb6548f747c7ec60548ca6d6f0523982f8f1ae7aebe4c1ae21af911ca634689626b6d849ff74918849b7a63070c7fae45192090e453046b37895003e4e861a5a62d8d42f876b0fb4062500109a401fed3f25ccb4f2c6327b8867ac2c8dff54ca9d5c7de8d6b3c208c41a7ea5bf5f40cd43f6ffa3718d9b24e03cfa2c24febfe5b17d04ac6b122225d6ebeabf5b4c8dc0c9d1b40e5235967620cf708f3aa5ed290b6194ffbcf15de3b3f6f39a56098e8701a5a3c5fb9a2679068e007e8d9d2933808d241150719f1b2d8b5cb0aee9b0ac9f39b7540f8a7cbafc2111809f517f53ca0963f4b36652920a65826249d5ec388f0f32225f8a1894c397f37435fad0a73a5fffc229af60a518548b1627b12bc658adda78ebbaccad9cea0109a51138d907819499ed25206c481239a3357bdfab3d814856b02d27c32c8c8e943018100261639f034327345dbc658201b741db67b980e4e368048ae5400b9790dbb0ae10c09"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (12, 'barn', '{"ob": ["f3227121212121211a3d274e8b4e4d0e949f08a402df6cc69cceb69ff86e37a6a35634bf94d7a3b3f2e2388d105f84e8b31639f1a941b3416949331a269c993bfffa88b162a583ed1ab78fccb64643afeb95a2bfa9b2ad089377394d5f0ce8d3b2094cadf04e183add86d90eee35e5928600af521bc7c40648049a7bf915f44d416b2a7602303ef731d44d82e3a8d6ad36b6de2db05782c77d73d4b3b89fd2171449e3727acb015ecffcdd131355c7b8fa942e3b621a67484f9fba8b4d22958e8ad0474ed5f34e148cc99e6bc4ccc8da957ea0c0120354d97bf91c4badc72b2375a65f9011acec681d20d14d499d64096e9d233bb6d4a0d3a77f42d916c620dedce6ca8b137b6fbcc5f219ea000358ee7c16073947b1f77096d007acdb683a932a48d7ca8ec07fa8908d91a23bc1cd3aa6731e83248c611a6782c0bf34394c5cae5ac2731fb79fc569c8b2cedf001542594fb1fb6ba548cb542b21830f20fc531cddaf814a20b84faef76e5549cb2e6589a7789f2e74d9916acf22f40644ca16e028140b859e471ba7308212d864ade91dee18c02261c4fd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (13, 'basket', '{"ob": ["f398d2e1b2b2b2b21a3d274e8b4e4d0e949f08a402df6cc6e358733b94f2d5fbe4a6f15dc9c1be2a6c0a54dc630f901b1a66dbfece787514d6240fa2225e57069ee6aa3222b360c1d537a7d946e4b006f3beff83c60de716de46f20f4782d48b94cfb5496cd878c1fd775cf3ad9e1e6d5f319e3b0afa058202b77dfc6d37cb8d20370a9ee4b54e9966477e25208b788247c3eefb2c83a20dbffb8bfb322c389ca6c1d9c438ca8ca02b9b9190dfb6388f06a359e2815401c180c751952f9f95ccd95328ab8dea3084a5c99e50a0c12005b321230ac71465de91db05c06be5f66381446f939653b7b4d78e95ec77d4a73e32ec1fa0cb3a34c1c0b3a7511e69acc25a6e8921e30d06e3ab080b23618a5b2a14af312721a544ba549d0e294059f9eee9313871d90373b0d719481348ca979122f018ab359af2f738736c37e25c7326125e20d993447e0646e62fa9c2e4c3dd2995a05e2f0fedb000bd52a5e3228fde0e73f1e56ca6fb4c23b5a7ebb18276143b3a3bf51044ca28eff60925711d81f4d3e6800685cbbba4f9674929a3dbcb73f3d85177e2fe0ed8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (14, 'beacon', '{"ob": ["7a8e85dce7e7e7e737deb16f553ca2477c785278a9ba6451a19e3602237075129e345b772c0f00d113a5b73dd0578ba4bf60974fa2f503dbce97766d154608592ef3a746c3e8cd8a55a1e90a60af6314ef94c169468cabe8b6cc14cd580ce1ecdd6fd5c9ec6a8a581469114888b93d06fd9242f4573fc94fb18d179eeeeebb113aaccc06082a54fe70ffbbe0fea4bb875a835355ba6e441838eb7fb696eccdc8f895d3721a9c13618b00c2af77a54bd00b052bb2def958e0c731e528b421e4d0191679e262ac6846f0b49e0b34e86cc6184e46e82ddf3fff14bcec9a65bac5e017aa67b3e8ade57be1303c7dea77bfd20f1da567f9d43def9e0e1e7855a4254b761cc638e10208b02fe0a98302ee75911e11851f4485c07af0afa625ffad5ae7cd2e28318713b8f2ec22e5c04a7b4b60b17d48d1c6d39676ecdcdd732de38dd6f6307964aaebedf98a752e60756026257d50099e9659357e00820526858088a9215fb7d00baf983cf102e021c1b24a4bf250ab5406792e3e59fce55d44d8e339f0388d01872a27f942b544a967e6948abdeb817a910306b3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (15, 'blaze', '{"ob": ["626679346c6c6c6c9e73e40cbd9546f03aa66a0632e2893565b0509f84a80fc9be02075956d4a5855cf21052931dbf4f9f3cc074435485a0a49a5eddbd07228eda1c6708462e63c51c283d93c0cbb3283a3a45e4cfe906a687a54f0befedcda508fc2ac28b543b6d0523d921987f6f667a23b9b1fd36529b4912bcb8cbb67caeb20199654468317e20752934ba46132d1ed910450f7d366c30c98597df0f59424e5db48b60bd6ff1ff5a9f9b01af00ee55ceeec5a259693c2e909a553d7bf3b9cdde31ed2476821cb7260532a0d323473d5d6e8c14e3bc6873dc8d33a57f8242b63bdee9ec08a264c6b2917d72667c730e89667d3d776c0ff437eefcb93867da6427d2966eb19bdad45438a81a4f6da3b8b0adf89a6ac0f16a5379561122f5502398af41c5effeb637968690ce2097b52be644001a35b0d3744b35f7b0a27a5c54591ad93ae1b3d7aa9b5d6940474ac15af2b1ac50c8b90d9dbf3c7bf2d15cfd93a0c62fb938c7c9f83993cfd658540215790d46587f2ed1d507670038c9b3f3c53f58eb64d4fa7aa659031ca7ae119517673c862b822e7a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (16, 'bond', '{"ob": ["62e9a836363636369e73e40cbd9546f03aa66a0632e28935aacc757dd2577a164c66770d7a2acc2b1df4854fbe8b3a538ee3723655b8733ca8cb31ed0f3d3c23c198178be212f38bd3415a9b72f3c65f7005f434f83b54ba0c0658b51985f870d91fbddea3521128e542d14b2dfa142a73e9a3e68b04e3f7c6a6722fe800733f06641a2ddbb6faa0ffac2224c5af27a119cbaf5fc788ab53eb8ead8c6c9ba778212c5fd4768f7c3636b63fa4ed8e0377c604f87f20d9a5181ca85e3a19d6eab185eeab047b596397bcc48e97d6c168ef8266d3ca8e72711ce7dba5945d345df9ec36f2c54451f9a3f3b4660eb917db1ac3893984497117be034e2355020d8ef06b8af31ec30dd693b3bd56ebe3eff24d318a4b56ad6fd93e34a179dfe229479f9cc821b1c716275a70f7a2fcfb44343c256c2a40c293b528b28138817d9088817040d037abcb61b49b9a668e0fab120c76b07935c0b62f26e14b0e477803fc03cf18dbfa799bd2cde766b4ba8659de80a6bb132dc9a93e1e9f22e36c8460dafd5ab388aaa85adba566ab832d5273533d5b7bb7e2ddaecd15"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (17, 'brave', '{"ob": ["b66592293b3b3b3b8ad98ab7745bb8cdde112071cf86546195c5413b28d12cd35c714f107594e03d13bb6be4c8cba4b839869ea1f69cb033cc950e1dd398f999b22589cfe8304c95199ee63f5f568335e6a0e3787f51171515c873413cb3f2334c58765c77b30b81bd07d05bdc06876c86cca436cb9d08784e93104bafef4416f75e5cce51936481f649c2623c98ebc67cece812b8be54c19ddebdd8f584898acb3198d20a123b1df124e4d1ed2e6d52d088a70ccba64698fa6d71853ed4f70115b9a5e59421a1c4073e2ab2ee063ac1b205ba196ced2cf07c9deca89b7e852d112c03412a6fd466dfd1f35a9db4b24f4f56d3cf66112a54c8609ef0c3352b592eaeaa6e6e3cde1f70a35551833a75b7531fdfaf9cd85bdec2741c589f7d6f5cb6cb5565a830d0a3498fa3bfadb8e0173b413c8708499201302d7dfebc0108d645c32f6c3c376a24b11593e40b22d272cc04da9d78fd9cb9e833789417ec3bca5054e5c6dacaf2fdd344706efa54f5c9946f5269bda292eb4414a95cb3bdabc6190a776fe55880e2d791bb7d9ea3a2f0ac6ea43066e48808"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (18, 'breeze', '{"ob": ["b6ccc630232323238ad98ab7745bb8cdde112071cf865461ca3f09e313d2bbd3cb6e3568c413e525fad9ab1148c6ad9540dff76a9d050ef6c2be4860ab8d012e9a39aa1e9c83034bb71a00b89d9e921e6d038c51a8551f39cc759e1d21d46eb229eaebd194082a5dd897334576cdd5e906d723f9c56fcc499e0715a1d8e04b80feea2290807ab3ffd95adfe201796865146b2ffe478030c7e9a2873a10e6cf53b9cd2d47fd0d289732607718f23614a1410dd98a6e663c4409530d7c7d84716c42f82f9e14c512d175733a8732e4c322f4fc08a3d4d99a2c296c18259af3f8e26d9adf2c65728569d343f23f8b50ffd158c785f8c290676ed49f7c2f606d969b0b19f759ef4774f74b6adf6c7a952eb40373a705e76b5a3bae1f1c6a050ce5c40f02cf7f0d569975d63ae3acb40e1b521b2b6324756bf1d6a6296be0c97baa62154725e3eeeea8cdf07975af72bf9924a8dc232a4568012eec55657da526a864fae6c83f611b28f77ae6dc17ea088392d7016191de138fb1c944405c394085289cd600cfc98f996019d11bd6d07afba9b2a5a1ae269149d8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (19, 'bronze', '{"ob": ["b66a1b0d3d3d3d3d8ad98ab7745bb8cdde112071cf865461c6cf6a10499eb2a3c7db5e61deeef643e68a718839820558deb56f533daf0f5701673cd45df026a236b5656c373dd45fd4c53bc327d31a4e37378816a38344c9511043e254a818e19b2560572cdeed627dc9a46cb558bb13e6a9c948755bb4dbe50a4abab5ccb8430bc6c49d946ec78bde91bcaa037d77b65a612eeac9c57aec705447f1292101b2667cf5df4f8720fcbb76acb059d114a795c2c7ab488ecca761ee504645f171aa513198e1c2d9d5749db3425dec23669b1cb9e173114fa90d6cba3d1cd81456174a3fec5cdf6cf75bf5efe5beb5eb3b732357913cfb38c1eaf352100ca1d363c655c59386c6754fda5451800010816324557b423eefb8b651d14792ff6754f3d8605dabd5bd4b2070905b4e94b50ffce457fde86aab35504a87f9740e1324bd6d058fb1d2498ddac3f31dc7b17fcd78740b56b5aac09f8c1f085b870eb1bbdccd621cc145cb4e23f0dbe5f0cf39e8a46bc413c66c96f5f62ed53d73fa0a3d411e44b94084b3e03350d6fe32c5058f54090f09a49656066c3c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (20, 'cabin', '{"ob": ["d26248e8e8e8e8e86debaf3c59131cecce6dc27c2efe6e908baf9c213067e70d88d5d72a5ce781c994b280531f6b91f97cb74312b398e9029839d9452e624db83a4f12ece0abf7de659cab9d7636ead344975a2d08dfe43000e2849630904bfcb5866e787acc58041b30f2e658616962412b8b37e64a31eceb69e3be20eeba9f82bd329daa3acaf726ba78c496942c6f25a9998a83fcc34253934838f657d9e20eaf3b9c1851d61c4428b8ed095f38a5e57299b60c6929cdba8cb1de0c16c015e129a95c43aea17396af3c13b0d1bd586142ac78e02e648e087f2b5c5d23126da1f7d09acc9f8d94c7dbf4d06d58cc088e5b1ae8853f779caecf4500fc729a753cbe351e8d6940e66bd1dc7307efc7f5eca741dcbf950fff5fa70f90cf768fb710a6957e41e0b27454f206ba05f6210d5c6e7f149f607b16053cc7d750fb40f2c9c98707b26a6963bbfd5c70a208ec04396726ed939690b1e524b9cbed3687aef3ffffb272066ed8a2c684431fe7a0cef12a4b2fa68e8545fc577a4e8bfa97f234172ba77f99f4aa60e382f2d44ed64f1a98b7d1283a9ba8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (21, 'canal', '{"ob": ["d24deaf1f1f1f1f16debaf3c59131cecce6dc27c2efe6e905524016450c66acf93886c9a856152ac525f4d4352668d613bd34320ac34cc26dc815ed82a4bf83e32d981f223d0ea860bb0e572335e145473c4d2750ad0385be30eded52486368381a7395e41c31498af415fe1168135bc8f24ba00b7dcbce816c57dc9a20939cc1a2dbd9cd05e21cfbc45d2590aa2133844cf3b2b62d18139182a1dc40f59e39e81699e75a8ea7ba1c7cc31e33ac9a722dc20dfb228007284bb951c80c3fa729a40fce258ecebca8b734f2554154b0e2b1f568d26243c397d64df40f2a4c7d70627cabc9b0e0be453a2bb021c390ab43fc5a8aae1ed8343b210cfbca907d61709ac0be529513dd9c78b32d96e0129c08dbafd8a0c3804c3aa02dee1deea47aa9738ea3f5836651d231a485588962082bbc7e9ef98fffe89a616e7cdf92529ff1b396b526235693c741afe6739246d0ea92173ae8749ac1bc707d1e2c79be7b617fba5519a5a92e8fbb06a64b2c71468b8fa8c93b48d6d5b2587d0bb2d40c4d7c45fc8e5f0bb7454e483ffba474ad30e15ee5f3a0df430ed03"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (22, 'car', '{"ob": ["d246f1f1f1f1f1f16debaf3c59131cecce6dc27c2efe6e90b96e2cc43a6490291fb3e58921b2f83d78feac3b9402ce289e98522390641818494e6d9c1cc280d6aa6271f2d7836ccf8ad20d8ddd2e7d1eb8e834e579fa5d18ace97cc75463c5a6368989ac719a11e71d98ce2b4c1228da82b3d0f44bfde399506795fb51c409ee9056c6e738c9d646c5173c0b0b732d64e7d412731dd00b166e71e9c72ce3f4849c288bff4e9ccdd7e803585a57554d62db28847286e0d2b337fe74a6806eb551e79528ad238f919e0085ee063dd616f2892c5c7ba7c63c1301310857479e8d53e235a566d176da3370ead7553c5e08d5cb5d3cf513ab9eb4e629e9a93f52d86ff0566b9c2e73c19b50e339abfd92ffb416e03b0f7a2e2dd40f7573f450f119fe9b98ec00e2682e11a72b3c5f36e4a174f177ca3c7885f55b2daac1781bb1a63e67cf401df82a4d4470923fbe8e3845858819ff3a2f75c347debca9508189ceda5d0d8ff3ff1ff5408d503d04f4377bab8c9e82dba1d776c3752a4161eb23abf642e36a61c3b92b9127a60bba8f5e8e96d89a69531d3b4f45"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (23, 'card', '{"ob": ["d2468642424242426debaf3c59131cecce6dc27c2efe6e90b96e2cc43a6490291fb3e58921b2f83d074b1eed1ae7669f7b4f816ac16017a6491e9628c3eade85c73d2be5c3bcb537f3b752abb045b9b8e2bc8b07bec4b0cd41f25a227d701319750537d55aa500dbc8ab34220c04569e80376c5cfdd97cf5991918ca31a5ce6bfaa56d483db4f8301f68e0f215dc20278196f94b7cde9b9d868b22bd73a35729d1590046a7877959250ea57043c33cc3118de8106722c7fdc7477dea9925d33a9d5cb5419391518871b40d83824e4330ecd6bb1e71d193893fc9e0c60d985154830b54c8f5cd60bc5bb2cc5114a0f3064b9058b159984d9ccaf59de770f5199061722a6121d00c68a94324df44560186398080c76493988136aa155252cdec0d81a189b5fe198dabb2b56a8d98e4b43e89370edddc5de9a06d8ad910f86aa0b572ed712cd60f818d2af791fc5c523d6de617f94f9394986fbd4ab04b1f8e79c514cbca158ac3b1297a74c4f2cc6b88ee2b1ad1b02f4fb45d966e5518e489afac294cdb08b344a8bcc09032ceadaff6f8d40e7fa7cfe6866b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (24, 'care', '{"ob": ["d2463582828282826debaf3c59131cecce6dc27c2efe6e90b96e2cc43a6490291fb3e58921b2f83d60c35d0e376200811ebe987bf9291fbf3bea4ca8656d2380b37b659f79011bd4af07a8938c8d7e62cffdb90125ed1b980ccb47d6b66e052e7843db2bd9daed18e2ec063061a0b957868935836f87253003e74e88c228d065863b949ce6cbd24468e729b8ad18ed5407cd77e764862bfe74ae4956f19fd9466ae11b7f398cb13bc55db8af150e8996455de05d23d24759a8c04c8ef0b9effc032d7e3db258aeb64e98cb5c02397c148a19e86e7598a7dbb0394149795d04d986bc3f0ce20db2a237cf8bc42964ee1a1bfdfdff9e3247d7204274f858a1123e7c1bff38e13029a643507159f9967a57a58a988e369abc1115f7d3962bb0503fe88379442502bf8a39178dd647496c24a75fce0530eebfc006d4b06ddf9baabf6be85dd6ea4644c4b48bd0c28910278f1f318c8d7654f2f27f8800e9cd448124cb311593384d24d7adb57132afa4f2681e1807d17385a156d72d975412c7a7f855755a6dd6240593da006d0cfa095741da71d04758708e98"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (25, 'castle', '{"ob": ["d26b6796afafafaf6debaf3c59131cecce6dc27c2efe6e906af403b9a5b34bafd1725266b4964ca458e5c053940f2464a42435282082e700abd98d21bc52ff572af5dc7613944788ae4787b22690d2951bde937d262c1c8e34e6948d4754f364fe4ef464fa620a3e4610ff0cfa751b4eaaf02b06c2a3a98ee0436e28e15864ce1c4c6714b8265db32cb00f61f258f3131afc5e044b0a1d7892d981a3a3f645fa7deeb711c57617cf01929cb38bfd727dc746954892f0884733edb7a4d9d6c4e1da1a82124d608fa3480cccceafaaeae8b68f0b3029cf75d02fb4a3eea5680fe271137a9e3dfc47fa1dffb2d8044b1c27cb70e7724b5dfdf8f3e41bc2cdb3d04d857866da7c6e6a43d6be50d93ebf283cfb8affbd8ea5fc2e7cf90cf5a4ae35a93f0f1ca46ec07856980468075c9e0ddd130633d208348c88f316c56ff789c4da9508bb2aaafffbc88133db88e76f8ded6082fd992f05962859c228a810be9cdd0788a20a9909851b5c9edfa8748a165bac842005830a6add3bad49a0e12854811f2de98f79d01bc944b44d5e9afe081fd49dd9433a5411c7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (26, 'cedar', '{"ob": ["801cf7b2b2b2b2b284bcf905c0efa1ba7f1f72dc6a657b9cfc26911f2c80703ba7285d047589414c2e57d28e7a4417070f6b3c5e5b1fda3792a3094e86405767fae2e3674e14d5cf24b0ae1b88cca33f3b35f73e8fc7722df01defc8fd5112d947264719f53bf1eeb9864c139e59ac2374b9deff219b6ec29253d50471b6580754360b16cd05239f40fbed1886a3f54b4f19a19f1498d8d767ae159c739625d57e82d147b92073e95b6bbc69fb247cb9c2d5b274081c6906fe9438c494b232928ce2ce83374cf2fea64699df5053689db1086b6c655149f0975510cbb48a633d930832787cc7a2d65de5ca826268d08e49de767793c97e5302e9d6c1e893b1daee5db6780f67b24078a8bb9bbde71bcb7462161b40b2cae2b1c27caed59b2c138a172e407fc812a95edf7ee902543d8e3e5fa1630cd31b0acd1dfbdfa78f8d69e74992436342db75f8b768eb9dad82014544214444d567be88ba8c08741662f3505e2224d900475998495023453401a5b28e979e7a2e952c3589770c5ae840b76fe2e7569904d2df3a7b955bba96167f4465263d1ec4299c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (27, 'chief', '{"ob": ["7e66c2414141414183f819d46cfc357be56a3394f660ca67a9b4beead81e86f36df394b94968f1a0d4644c66f01b327a97d597fee39396c8bbf35270da264f7951a9f96b6fd695d48c27f61daf5cd9af43df799c70733ffbd2d6f35f1e30a03cc83c5bbffdf11987c9c78f3e058698db5e29d1de57782190c634c7eaeee564bfe8ef0792f31be78e66aed489d0d366f01265ac81d768f5c378a397d1d4fe22553dcf9035be95ef7851c6e56d37dbdde640b904cbc750df8e041c538979d72bb244dc06f34a4c58a9fc1278cc785798431f6b4833b71ce5c118367344ca1d6799bec462856ebab77a69235cabf2526c5dc9f3bce8e449e0aa55389fd619cdda0aad90dc043fe5edeb05593d3a942cc9c822b3a364fc0bb87a9101987d149595d5ec25400b83a909acf9564b03341580e7bcf51d5f63f784a825496e8df1901d30702f2c428ae281291d34997c8bc4389be3428b61632bdccedae4eae6775f70a1bfa3a1dc401ca20f7f013787b6d8dc37941c2a25b130ed80efc9604a97cd6c74fa55697c37ca4e0813a3e908f3531920def36e55f2268c7d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (28, 'cloud', '{"ob": ["4589f828282828286b7508de94660f1e00d7a219d0231c190bad2c323b7a93a9b19faa5747dc59a663c4cd9299b41eff7a881f7577bf0416640fc2e9540c15515a8769bef29baec77df3185cd34a7b2baacfbae205dcc328efba3c8b807c5dfbdcfb3fcd666021b921b6ca57fe81dbd8c7322587ab0dfeb6e02247f54cbe18d4ab7bedc8d5f3dbfb304fb76683da9cef4bbe81d0e982f4fdfa5622d9952ad5546aa9262b0ec2d87128ae308ecc099fff1be96f946490dd9e544d1ada61f6ee8e022e165e954774fd900cb01c9987bb4639507145a4c3d1e28da0714587fa84de472580eb48737b20d6e49668074ac027c336e73121b7ee804d48aa07d2e7833263a5a13c129c7cd69fcdd5a225352cc5eca935090253c1c09e3a32c00d3efdd8f4f8b02089470fcf6818714ed16873138decfddcc176266a6be5fb448211d373877cbc482eb677f8cf45c07b3f1149bba9b700aa30c10bf783cc0796617ea32962c2db8ab9fbbd88f2944201c5c21fbbb26261a32f8a070e09190df60c9c2ffa7bc72e9ffb77072d05f8eb8ab1a917021017031ffa2d587e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (29, 'coral', '{"ob": ["457009bdbdbdbdbd6b7508de94660f1e00d7a219d0231c19f4e2aaf54fe901ddcf164320f7e811e9b529bd87f1677bc96bae16de62baaa6106b785c82d0b2f10dcccd723ad73a7720190a44cc305e57c805e9a1547eccc7ceee59cdda21444a91c16cf0cddf43f307d36822afdd49685d1b284636e8e306c22d6a5f5e9105753966bd8933e2d87dc83cea8540c827a03136a5fd6ec0dcd09cc47d27535ffc847af2c95e51da8594ad01a574499166fa14ad7eac85ce7bf9020419dcf0d487c801a376fd429441fb5a0628f0bd78bd320921d54c8360286debf21d09eafdd7a86e4a2d4d1563a859b15d5f98b3a1e11a3c16b92786705a72ccbaace083beaab9615819e202545ac8acc70882034dad35739687823aec869675e40c8b5826ec2f75eacf35ba0be57fe3bae96ca9a4d8ea449b5ed2ef9393c2db979bf5786cdbe931a0e563b85ea5c05ff24dfa718d7da8200029e4d18dcc636e1ddf8826bc6ee237420570315e64fbd8938bc362fcf1556cfa00ae41fb41e7fa1c1aaaed99b5f124a4f515dd883af4493099945fb618543bd3383d0fc4227bc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (30, 'crane', '{"ob": ["6fe2c12f36363636dbe0627f2205983152e440957302feffe4aec864b015976e24997cdb83ea2a0d4f125b520e8aebd7e48b2bf0b0ff4c41ceb9382898d5480930f869cb03c7657e64aaf601ba7aac0df04c97b525a8443a0bbb815a788581e4c944ca6ce1645ca160a50b89d01a6bfc22017b029faf530941814282e76a8618dc797cd7d5bc969960cb1a709a3c3f654ca76519bba4c6aac6c9e7520e0726a78b7983357f6bff424fcdbb747c3f6bfb73d09f2cfd2287c510a8474898e9c6adc61f8884c21742ba6bfea299f049dffeebb2d4bfdb593af9d1422de5f934dba0d33087bfbb4ac2087200388c20094d4573d1620fcaf62fdfc884a9ef9813d307f9580f5694443839164d9296532f32bfb94a3f4a291147ae7607e4643c0ccf4a91094d3ead236d009b670dbceac2b64e963ba28f25c6a6768fd2d34f16e64e28f9f4c6d073a15c0e601f0fffd5fe06e21e351d28457daec0daa70f38cb879eafb78764488f1d060c9ff3095375a5a08f8df075947fbc517e8521daa543486afe216a8656e5466e3bd16df71f60f9dfbdd6e3bd09a6b37a93"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (31, 'dagger', '{"ob": ["a309a6284e4e4e4e839c28ff8b38c88c894833a4a0b3ca9ee7f747459d42565364fd78376674e02a66e4b169b3def0b4e17c40d45660cfc504adbd5d223d8db34c9417faf82ca417a4e0645b91affb79edb238da4a96ca06add846c965d1a0f5ac36262ff38aff6b63b51a9f8f938706a8e611d40b9d3d48eed7b829088296c90ec94855598d4aeb556df8e39413cf5c29ca52ebcf5dde2b2940c919acad920bd921ebda3ae186f6fdef48194f9672cbf6a7f4279ccef5df3964ddb91a8065238cc3f4bfb98e7b8e563ff1f2bd2f5b59d847d5bd18e557b57387f20b52260a3a5009e28a5c2541175ee07e466a83b72c02cdc0e2b9c5523e0f3061bed865da5330b86938369cf449a79d4340ce1bf2d35b2b0367d58df815ba73e5bbdf7fcbc05a8b3d27a61d3c8fae8067c85d03fdbfcec6e845e8f943e9a3fd67419b29148c35a1b40a0bee59368314be674b407c5113a3148e3b4184aff11b5b320006ce247df7d5807b34ad4cfa8e1201517edefb1e7fd8375d5dd39741de4e358fb11c90111bf89fb1ff986b19a786afeb1604add76de6d3c87700f1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (32, 'dawn', '{"ob": ["a305f1cdcdcdcdcd839c28ff8b38c88c894833a4a0b3ca9e129876103f9ab70876d4b8f99e87cc3cd714c58508656f6e1ffdf19e45b59f766801080dbbcc83a58658de9e164d68edfe935d788f969bdf39a5230ef42d7fa0f00101b6bcb6f555a3f0d4009363c53e7fd46613d6b7f67ad1e906d769dd2abf7e3f180775491e47c8b56af9c206ff3a13fa8108e32eeec147ee0874135ac408d623b27ef83009e4c1ba46f3ce9334f016c2a4933de2b545e30e9dddae5d67a7d607036cc2993211a95c02d0bc0cc69bf3fabc7f68c1a9f3995eb3e3d70499fa3e26ca6a52333811d481c8d26d4638c2e67aa2a73355e6c5053cb0791bb88a72c0069e07dd5638e258772f356666b48688111dc4a37934300b0b6c62a4b7fb07450e9a36b04a0553046bc9e373b8dced9dd213abd73475173fb2ed2958e04257d2e01f9e67f4b9b5b0082a3fe013bc4fa76e83cc9102e63c6792cec66590c32a0d6022cc0e62584282d0b780e544a6a6ceca55105ce971d50cb97ec84256523f8bab7e79815494c306cb4198b1a7797fa06899d27b17397e4fb6e549a4646e9a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (33, 'delta', '{"ob": ["a71437a3090909093cdb39666d296c161c702ee8fcc146f2763a679530c2dc3e623c59f3be2be6292c0021256b26555b2a4119eba20aebdb1666df127d65275f6fdfdc32a931199cc831250a85a38e7c4f641e0f731d9fcdd51a50788c0d033fd2ff7140569b064bb8e2f1787b9b839fee93ded9befa9fef7f2ec03c46bb6878ae7f5da836b379d4e06106b38ecfd729f722238fda10f688c909ee34d9351c6f60dcf5bde55aa63c2fbcf3c7fa7dab10322e99de48115a3b0f59bfea662607c064158d52b919385cd8a0ad23737f66dd330dd159bda4dc1e4ac59acb288b7d7e220f40a3c2981bd1cb3cfc9315a9918c14332415527e7ee02e2e7981088139fcb31660f0e328bce06847f4cef4e1a5a15e5111dc94435cbd3c538d3f0100aa447cbb994a5afe165a47fc6233919aea800aeaee0f7a8cc0548e2e369859d0c46b3afffcc23443045e345866abff4ac6450d3c1fef3be4cd045c75129fd160b67732d6628f4c97f9295d8d3b2fd58e6ec897cf7f428500b1fec5399cb15b2c30979b3c081842b54c5574f27b8f435b222fef0dd6e1bef10c88"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (34, 'desert', '{"ob": ["a7ff69ec1e1e1e1e3cdb39666d296c161c702ee8fcc146f285f3df4b17033ad3b3bfd0f5125aca6a2501990760afe778e93c83f21c0f8b0b12656a98ccbbf3f476728198bcc41d5848d23ec3470077196b21971d059252f8c3b7b9264493d08d53d8a6d18c2878261c62a4fec3c3452d0ff89fe3a182eb448ece25227df0aad915421c7fcf51e8bb69d247ec01578df50f7d2b0a81182fa1ea3c86a1de7ac400ac3576e5ac018ef573a31ab8138f7538644f1791b290b210d95874401e900057cbb7a0eaf36d841d66a5e0cd39e3acfce37d67fb43837116ee2322a8818a0eb9a432eff8d8d43cf99cb79004d959af7b7f127163218c7111d7d3c627dc1a7bef3d03e9b8b428d172ce29ef19077b921cb06d2ba210340cbf3a8adacc9af07645b48107d4bbcf62b0d72375682c2696d0cbadbceacd2cd48be27f6bfe766a5458b8bf21bc7226cdb5814a4820a4f4a4051b97bd8f7b9c9ab48f521cbbc63ea3fb5756f4c245430d6112f5348eb468deca5a8bd0504f65b2e353f6df4722d71a3ad9dacad9a595c537718c6cab37aca6bc16a7f8d441b8d0c5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (35, 'diamond', '{"ob": ["1f0d7acdbc7b7b7b1eaa89b1d00d16951384311105a4751c1681b5be5fe4013a26073c32611590cecdacf5f2e59e6710c09825a9d7674e316924c77879b938ab71de1b516b1ec702f13b9999f336d046c2fb682f786e803b6474f93cb59d445e2c9905106c8eac44b77e908174fd72b451b5b983b513e2570eb9a90aa51d969dbad3d1e4c434ea194a5879049fbc40ae4de0befd1d6adc641a4b891477baf28646d651fadfa531f434c87e45557ff985735e4ce7638cf0926b3acfa7ce3e3b9748605700df045713d8f6e5b2dce8ecf82424258ec1b1ffc2e00a7fad92144b1d3e8f214c121139dd4cd735feba32f43786ba1ba98a006cc7754d376a46da3e30e8cb08bf6da026f198773e3925c4422070f3d78b1788efc4756ef2398d51db3cfcc0feab3fa974c19ab2533bfcfbd4528e0db224a2103a6a87e927c1af8b865d71dba56e6bef9571a2fad61077b9de5190eb7a95863310545e62c61fdedd8cdf53cbdcdb00c662227e817e9c4afee42464636301bcbda06cc846da064edc80e2946610262e06e189839516c9a7fcdf93ee61da3aeb43a875"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (36, 'dome', '{"ob": ["d8489d0202020202b32db188886d4b0d58b684588d42d62d26fe541e9b8d55a35b118e8035831af8641fe29434789bc826bf0179eab6165ecc2f66b1b91976e0c8d4b484f8f4809456d71094399f65da799ba39477a305133f71963548fe4a49ebfbb9d2c0d271ad1747f26454fc68dccbb57447baa20bbbb7771e91a4230f2ecf06372ae34743e68fa0fbbc4629b44260dad0e59d1b5e0e3c7d98b55d9e49e93cfeb159c87a87915ab8d615e12496c8dc31753d7e084e8cd3ec149706a4c1efb632f593f0d96b7dc70f6bd882fbef00e1b3d4e8fc35e3a8aebb43a372570725c521e98caa032bef84d62951de087c54107f1df8b5a3e10daa30deeb74ee9d55683895e9c115db2b4e5af51fbcfb6b3f8e81aa0cd64e2542bf84a6765815f03ed63a12561b61804eb168b0359c59f80e43fa6ec26d2cc19b06fc93b13123fc519a7faaa89a7fd5406dfedf54ed73c8495024159121cc0153fecdf7e0675186556d2003fd4da67d3084b1f20cdc622c1ad16ea434990f28e62baa8d3fb853d2044a0c9ee8226b50dd3667c4470d04241d56198afad8072da6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (37, 'dragon', '{"ob": ["7cfe204114141414934430537beb15b0c9ae783713ed94efe02a1d3497a96978b037cd420bdc5826a2561bcf23fb0cd2bcb7de6679708d5373f4c2f61e87383d0ab35ee4e10b2eb6a5e115a99515a108a4e3fa019b1f9204bfd97ddfeb90c12fe8aa55039e3c37767f2cd38d6aaac4a3a41db979ce138d1f1cd359f15ab3271d4731bb279921b89de99e4e8763fd75eec1e39c4d4e28341a37dcccee6f14a098d7704676b54ae2a38c6357de25a9f4fb77e9c514747f47bd02dec71ed99a42f44ea50ecf29ddba7e933e718bead41fd8dd7208cca50a3814c1150d1df885c1690d0f1beeeae246ae532e2b74b7bc7f09789d4c92f03175d87f38d577e5a1a18d75f1effc37363dcf92ae59469b83eb6e350b219afa671fb8d0b761d814cd5661b5dcfa2ed044e62118b03ad74b194dadac1b414804d1660f14661f47db5a30fa912de9af1353afce77c7b58ccdecdb99f2953e838b6729891c75abba035491d80013b6138a29b6b0152e87e896a4528214dcde7f68b4d30660f977fe48cfaeb08e0a896cd9e59c46fcaa67709c10c0a263fdfee71f1f6b7f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (38, 'drift', '{"ob": ["7c52201212121212934430537beb15b0c9ae783713ed94ef3a3f41c2fb49ccd6c191a0cc6715960df2409f121a9d211b4efe1d869f70dd997e6a479645c1b732126c33bd1ced24bfe3d3c0ef29ba87eeb5f491e19605589c3dc2fd764434ceeb17d17530cb9c0e258c45d77ebbb5d743dcf4fd34ff2579f73ae68bf5487b9e0ca236f56e62b1e896884ef1cc56711a576f8297ea75d88ab7c363fbe6fec359acfaee1d5d973f5c5942ea31bb6674086811641eab87e6ef879c3bf100d3d6693d4ea492fed494e7b4d256337d0b6b2dd5382471c9cf7c0e4554b0de729528e99bffceadc1b5456cb4f89c2ca21992fb49db4297fe229940443a667d0a38e2d2d8f982e5499f285c5ec55d00cea6984582427db4eebfe109c35499d3e99ad7a9d5862af26684498c5696ebd8e1a2b720cf1909890a817e192c8a78d4d86a98ac19f24c695c69d29dff307c0091b59fa11f19f747e779d9a40ccd40f8d265d1362c203ffafb6ed1ea8802a552f14303e67058d9479b8195e0dd3f09cc50e9257a53aa09652fa712ac707d44e3c93c18f2e08ba8fdd0b560b228"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (39, 'eagle', '{"ob": ["aeb262d7363636363c807b4da52c46d505a9c686d3b0749311c9378a6c7d32a738129735832230fb54728405e917213e71e7bd9b3e8c29951c6110e8aaeabda50e2a8f2c5493bd51db178dacebec3bb3e80e285648ac85c1343d0d09476c3a1aa9ccb4d95e2615efcef6b252c4946b0499940fd8056d0d11535585ba8198a26fe02ec614dbb617a1b048972e74211f5d5cd2a2eccd0be3706c51cbd5c7217dd261dfd1d21d876a75799aa4e5d1bbae1af6aaf626e0b61667e27ab694d07360b3e5d04bb70ab9d564aa6ad309f1c3f03e55e72324ec3db851c28a51970a7d60652814e7436ff5376226d26c42d3d609500f05d129ff218f54ad31ccead17c3734e0ff5347e2115eb8308241cbb23d2bdb16eee1ab0d2eb37653acbdd9caea95e7cac06f4df67696e28771b6d4782a7dde16a64b880ff3a1ff621aaa3d749eb950cf833fd3e4f2ea7dcb58cc3b24728e5eddb9a95f76dda1453c37e6fba423ead55e9ea791808b162383975bc65a34156b997054928d09644944a1cc53b4c13cf55a2421dc7711aa1c2e494766b2afa5686b736702aad4dca1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (40, 'earth', '{"ob": ["aea6b2a7a7a7a7a73c807b4da52c46d505a9c686d3b0749360bb37f03434d7de47db6fd3dd0b6ffda6748ea73460814f8ed4aea35fe8af8afae1dfa75be5fe8e107c65ca11157484311b5d836c4485a4da0418a42e4b69c77b10d06647346149889f74110d1253af06005840bdd8e91dda1607bcb246b43bd99267b20738663a86a112e4ad42c057dbf09913c680f9815559bdf6dfb29dfa0b6e08fefd9ec23a7434f8ca33f65b340f43a5c18b116e2ece5d6f023395b2a677baf8549d414f90f5feefac82c3cdca4b7f2ff1172da8819de260a05c25b6b71971af9534b880789606e469c9cebec76a2c43285253ebc6e437f389cc6fd902ac4d94427ca0b3e906849635a308a61c24ad684fe7a1d24986ae401b11539fa1ccef7405d09616e7b04774efc1e481155b18a20e89f8557f318b0014813ba2a545091bafa508b4b26b1ce1bfa18f020108237f80754018f7632208f26f66a0f225c17c7c0afd71d8d1061ebedf700473e0ecb12e2d5fd1ce16b770042cce4e1395fcc9a191b8902a97579bc4ceaa8a8d52e0df3f21dd59435e4c1599b1ec9003"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (41, 'eclipse', '{"ob": ["aeafe997c96d6d6d3c807b4da52c46d505a9c686d3b074935251e9abd299bd8771895b242922c509008cedbd96d5e1fbfbbf22ee75c5aa315ccac494c929275d1ab573b2221c1927387fb2c49c63c6c0f32d3f2546e9823bdf686a2d2294e23a7cf0e8b73b3c3dd02cd9f2a5940fa4042838ca2b1e3145a00dec453ef4c6b6de902c51f76a90bda0eff47fdbe80cb22ef46fe54e2a4df331535314e755597e6aca756011a41d7d51abe24884190d05eeb9a8e4cff0e452da2239a69ee3302fa427bf2184ec14ff2a084ab84c829961f2b98533131de202fb82f0b4288ad2cca2fc017b719726ed8efe750c685c8ac54e36787cf0bff2528f4615084f9708a0ca10cc7c663ba928fd58f49640878d1d554eb7e10bc7d75b6754c362f9600b4999482c22684486653e39419e94a229441cda695814bd7bbdde1ecb5fecc937ee1b05cc6337c88a5f52ca444e30a47cb29a61636401101a5d3e038cbc1e180ccc371bbc0f2ff8e9046e673eb8c1b1ffa8843db72537b2a591116d48d9451e1d1e1cee41859ab6aeaa7eecff7d095ba09e53eccdac83a86aabc5"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (42, 'ember', '{"ob": ["6dae5b414141414198d553c6a7b38076f2368f53bfa7831bad41dc0fd7171148f3fe4b9f3cd068cee46fd559d59515bed5ab737c886b064be3ea0dfb43e1105e3ba522d7324e26450716f521048ed0433b7f04ac7f11a8bbedf7e8e4420d534ef4fb05446e19b4959d160cd59245667f0c8442dc7498d3aa8477695ca0e27cdedbd7acca0e5aa722770b05575325ad690d89eda9f30e3054913b3afbd3c7ef8d3563083e4fb75d1c6ed7b1afa85d30af2efe81ea5033de246a33fd94f10a974550746da32a559afe4cce6a319acea81a36df1604f61efff9d8516a37ec242e74b6464d3c88ea2a09873daf686a40449f8ff8b9b1501bb7eada5f34d6048fb6a9117619971dc9d7fcb53d28de02e54eee9cb5094eac4060d78511766821c83ed066e8db3c1204204ebea4a165d5c125fd9f9a4f3dbbcf6b30f8b9f8afbd0c6ce3670e6b1299d682cf543688ba0a25b9f19e1279e2fb57f4f6076ed03608ce506cc6324b3e39437cb2201732cf52cb48ca29f2ed4c1a38686099cd4633814913a9c92b0f27e10e627b84664f9eb9a4efe9bd410dcc735c99fd"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (43, 'epic', '{"ob": ["c530ce00000000002cb6d1fe684856c1d963411228776125ba6978331491d8de0d0ddd7326a4c7ee9a4f8dab61c22f4ea9dc62f1bc618194cd175b6b5979542b3a2645da09c5c8f9fd48061892281d5e6f82ead287e3f9cff6b306902ca52ed56167a2809f3d17d1d65b119bbafc46d1155801eb043c67e7ab22577f17baee061922cc2e2b1e36c9924557db127da91112909f0d518dac92481591df41ccb9e9f39c1299e127dc6e514ec66ed52f0295d284b070bbbb2d90550b30d6047fcbfc94ec770d6caa690395bfeb0cbacdcc6a4ef32611a300173eb2ae4b6eba4989c1565749b06f1981070f63057ba98a7ff41db3b8d13fd8816d23ef204eb205cd2384c2355870899ce3d29f866fe7455a2dbfdd27586910afdcce347cde673d0e47ea09df9d0d1f82c52951762bdda0bc33ef376ce5612bf14e9add8f1935b8585bd2a63f2ab4b8fe3a1749bad19f77ba6ba114752e09aa04d945fc6f301557e55f3a8b1fb7dabfe31ec0c427833845cdf33a164393cc0666378e96afc1d16406d53545c6d77551c1612bd2b40a8301cf7b9f798b7aa624879d"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (44, 'falcon', '{"ob": ["95cffba6e1e1e1e13ffdb22109ff8bf506f9ae8370b6ab4591631a1b706cd8c0bcd995fa68fc1b2b2f987ba2edda83042ae405f769f001c1d5d8738e85c603811b7abcc5dd6256a256f2d6ed286669c5c524a47f7b0f0116875db93789644d848f6ade5ab13c5826e93a0014b84dbddd222a586bc6776ae82e3de5cdab4ae00e59805d924740dfee639f94215fe7029a8d7d1afc0ee052bdb8da905698c6486fc2b487047e582e8f1f0965322dce3a609b94c952d56602e03119c0a6c1f4a7163ae2cf1eb76a09bdaa426fbd33b214083b8f0c6f5c9dd00704861f48553ff96558531f45ac9707d9d156676db11ed059d9a9a8922409bcdd68b707d896c4344defecd560cecb8344c70934ca312b397f5db7d6dc8452dfc67e255e230c408193e64a16c54a5c53bf4ef58546f209c151833c6f638252c649bdb4b2428a6d77c45e494705d4bf721ceeb3ef36bcb7f05232c86760e1b6f89921276801b237f10c397624b4c1e1a31df0558f6c11dad1eed973296321cfac6e398d45c3b796649d9aafd232919d2cf3afe0852606f2f8a3d30a5bdd0ad00b86"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (45, 'fern', '{"ob": ["eeb430f6f6f6f6f63f38fcee569be21d1de1b8d3040269421d5a1e93ac54d1bd66ec640f768559faaae90e0df47daa56ed2dcf2a51407ec790cd945330427e930c5ef90bab256de96b1486b3623716326d20aea60b91072ef32b4e0423cbb8e7eb766682609d17a977ae274583233d1f5f6adac6b1543c374e99cd54ec7c4625b4cbce818d0d97ea68668853f2ec9e7c2caba1dbb223c8c1b7b68eb64acb66b78561a983383d37e77604640c0c2f6732cfdec22980eaf1ca7f64d409e9cb7cd8bba96cbcfbc4337de1b2e24cf0d09bfba958b90196cad05c6d37df28b0ce1a9ca39c6f54b42040355f20e7da81d754d0b1beef77abc5a477054e5f415a574147fb395cbe1ec5120ec8a13c3bbf913e5c72993ed0fcd5069b84fb0cbd6988d082aa73ff0f2391ee51b70ea3ed6df4d82c3e067fc04dcfcb923f3200d89e7df4c85b6ff666ee0a4671f43ae654b2b6b8a46e8d71413a57d5b8ba639fc1869a007797688edaa485699393e5e28186f3ea524aaad57d599387c4e0230413a96f0f5ed10e4dee631333769f2fb9eda005bbe696c37166b6f8e81f"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (46, 'flame', '{"ob": ["c8fb3c8605050505aa2887858787cc36e0e83492773abc397c2f765d925921f50d05895e171db302655f891e8fbed5907d3d5399984bc6bf9ad1a798a871b68022d8651fbca2ed9abc11a81e91e3f551923f062101397d9456d6d88e808d08f5cae8b7724cceecaabca2dc9ffe6b04074d7a19f90cbe8510ba577aafaa4d27bc450c0e34fb5cc4548975c507115e611ace175839f8c361828878fdc7dff45e0359a036be5197075608bfc3a7aa9f2c19b4a1261b0958a2e5ef6bc856886ab71df35ad52813f58ef62e620d0ea0e2235e6fa9ebd950595763129824650d804489e842130a4131f45e4981fe03e9d40c14e7c981540befdd25234e23fd0853576e9806c523af6e478e394fcbf866966ad68d3d44b2eab4e0f907ef46e7d918fa4dfe30f89daa84008109b06f05dfc0f6bce59212a066fe03180afa3cd49d67d56591af7c188ba760609d5912d0570244624b8e8fe532a549816b0bd865231b498a6169b2ca8105a64b911d09593d4744a6ebf037e5a7450c591e36c04bd44ba04175bd0d17f1801e420d33bc29cc8366d75d61c36ba23c44b7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (47, 'forest', '{"ob": ["c867ae3cb6b6b6b6aa2887858787cc36e0e83492773abc39a19e8538a9c7c260b136e820013a5711dbb15ec3781e3133d98daaa85b83934bbf9a15cea6e291af7ae7510d142a0c98561ab252719cdc5ee0719b26faafd7a734d21ca5e627e7e8a295813cb738288b8415d64ef707affbbfce9905b1ec2ea6fed1364e46b0ed9196f20812fe512c2b581b88c47b43f96eb22be74740d190e64e08414c8e97f849415c57de4b60a67a2421f72d30a90538aeae1837c0af39a0eacc3017f896efc8c07760e15381fff8dd028cd0465a3fd9e14efd4599845d712b4aa9bbe82bd1d7d99c3bc293eb78167c29882d32ad1468401cd8396fcfb792e1d447e3ba85d579fecb3949b5fa573a21d5b2747b7c67aab215cb2d8dad0f44e4c2ec75a88882657509d2ec0ada59ce397bb1335dd03d3a2c9947031531cae8d507a7e1abf7c40b96d403d450d1717f43def79d5eaa09f4e0f40f94a162985ecf50d9212c1f3b87f001f972f35a7490446bcd193fa9eeac369cc46aee7031f789703355aa6fd85be448f4fca186d555748c0aa185cfd22c67d6e3ee3a65f6b1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (48, 'frost', '{"ob": ["4338959f9f9f9f9fe2759c6499e6204c999efc594b0560918de1e9eb28a0d0b0e8c93d9eb3aec55b1593bbb55c104da2162763cd56d0d632fccacb05dd34befa65aae6b01ada963e4c55a93f06ab7ccf586831f6f469e5198e006f86588c929b275bf3b703eaf854cb0bde0f82446b0b3d7ba4fb172a9bb165de62e37ac00a69e7d35989492e6af821d6d144041b7876556444dce8233bc34553f406dfbec73d8ed2b21a9db860cc0659f301e74df4aebdad99f0b90bfb50d293e8e1ad55685a8c1008e533f746d19fabe65c4bf83f29e4a9e2b71206ef52ae6ba1d0c6cbb98eb42e3e8924f9be24598503f6ba22dce41d9861bb582d40f5f434ee5ed85e8c382d38a4fd1b455a4f6b62c657ed6682124d9d85774eec9e0a0b5fe4719b2f9aa1e47843dac8781759944a82982e319ed24056e0dff055f67367b2d304adaa24404d79a38c8e5e0084fdf761da03ae217c1579e5878f7834f0f2ae5206d5c5173bec571db8267627331e724b9082aa1a2bc9c2d2c59330aed32fd48eb3fb926709f07bd825122e699ae342cc11a650b3e208dd836aefebec71"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (49, 'garden', '{"ob": ["e588e082a7a7a7a7f040b82eb4ec7e2eea3617a028b32009d2e4c8c8aa197b668f2fdb7350c1bb97b76fcb09caf9f3c4e9c6e6ec05b09941fff0a22fd60a3f175bff11d49072cd81c85afc2012f214722914e74fc641b442f7b18f0311203cda9090f7994c4699827439c7923962db287290d40be9db4c0a6ec749711d4ffd56513f4af79f8079e6adbe66af45f6b45b8c486c9ca8affdbcd65eb093aedd0821fc43195cd4ab3fca4b99f99cf02aaed760c3985935be017afd43bafd8c1f723fc4beea2401606cf8d8918cfb1f02cf9c05ab3539ca7f5707c4fcaf4569e7b3f706862e33c6daaf62d985468a0271a20d049109d9d3baec679c7ebe424ce771c9db9d143f4c344b8302ade65b4b44913c66423aa341f25b7757222718cd037b9408ea4e03e53f599625541d24f0aef7121d961cc037cb58ac0e83dae16a88c850ca8c722c82cbff207ea6d78899b83991c1bd8ecc334bf4b420788d1cbd58991a3199dd1c641f130126717acc7a758512c4ee277fde446f902094ff632c6a2774a6b79f1ec1004a5aac98274f11d58046e01afc8f57ac120a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (50, 'glacier', '{"ob": ["09c08b88c8707070fe63773d7e573e3eafdf94605542a112f5dec2ce71d8fc2c1f074a77a45480d030ba9684fa1397152fbefbb36a1fd355e6abdd3f76cb938d4733766922d302aa4e6f2fab642e2107aaeb77994d08dcb48d39900adde41747a5abe27432b64c84a3722507267dd4fc79dd5db3de00bde0ff5806ce1c3ab969f61c9ff8e93d4ae63728328513dd90c68da3255db4897fd148653eae66ab53218b7970c550d6e54d30f106b798f12ced6eb730125968158d177112227dfe18c66bc24be0d7f9ab5143474c06f4a526198b5351fcb196cdc811668a9d824f8159d204c5b61e57c42f6beb59e734f22dd5b62332a085440b310fd36a80f15bc2d16ac50cfc9ba4c5a2893e37557d01cb2557edb578b7081846cc52183057c2570b00d5ad62847e00ec9231a7324683ee971bdc71038dc12488dbcde5b3aac85aa1d8f99164a705e521776607502b56af62add86c6630c0480bbb9a878203f5790ec4f03b9d1d159bb14cfd47383b9cace002872cb8686137a639a0fd2f749d9e515ef85004d8c5bbe4a74b9f0605225b67aa72b8104f023449"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (51, 'globe', '{"ob": ["09fd124fa5a5a5a5fe63773d7e573e3eafdf94605542a112f80ed62177c587b96a9a1727f3a97caa7a85b1c8b11d1a93d58018b36c43208dbf1adbe488afd749b93d3f0204de4fc0b634ae8b3c03135c540f422f6a96d3b705ba91158dc609354c0e8960d4ee813448e9817e9460bd3862c02a63a3c7cd482f56349b4836087969824c1db6dafdc3f63b6b6b73afa9d98e54650d1768960c48dba59df13ba81e41e14a2e0d0cc817609453d017737dee9c8807ecf7af7258fec26f65bfc6144f02c89fbe3284c5e5625c9330332bbb7eb76b88ead212029f88cbd8322342672b72c07a54bb05bb2eb91644cbd73ed20677da4b80e0340938de1132453fbdf131b05b4ba067dfe7615cc72419b1211d1591ff36fb88d3acc2e31c46fb1d3f748d58fbe663b8832770381e05b40a0bd2f092b20445cba9ef2d49afb25967cbdc15c7fdaa05b1a853583b8a3ff056fe61eed159ce6c6ccf3d9d5d0fd8f899989f57007ac0bc5f493b6c4ac690654b6feacbdf0d143dd33a703b49ab0b9c39e986b919065fa45daf0ae97da1763e0085031efac937775bf28610"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (52, 'grain', '{"ob": ["5278a44b4b4b4b4bd49f1eaa089a5d910eecc97ddb04f736dac9aa901dd893bd5042b951273fc428c1eb87ac2766233bb1de480865d40ef5eb08938c5dd0700df3202b63fbf31d5196ccddd01369b50fd670d7ab00f7f62a18bd696944ae2f9d72a038929e89aa324031e0de7c590ec3b0ba163ee18ff658cb107d0bd2c566e451846fd06676c2b8bb404848fe4cc3f86c2990df1543911017ae11540f4fee895e07bb870c1ad2ef741ee725c9f397de2d6d573e333529a5e44550ec623619e43794ffe7e04f921c15e3d2ec687a2433159953fe9b0ec2fcf5977700887e128a0b3e8225dff448a019ff03b750aef036c9fac49c0dd57139cd25e6d814df49f9376acbca2629b624c6a9a9f5ab97bf03414f3d0829417328b1a619cc2d92ecd24bbec4c9402827f8489e7cf185d435990e5018e9bd3f56385a84657eea759ec8b67902de6d30c84be3d3d66c2a5b232679c026b618b4005b07cf66c0d2a93936f972edea3746a37f4528baf3c357b3adc2e30795d869d71a436b75a87602e221df4467cb1590a7f3975d669261814947b508a1d60e05eb2a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (53, 'grove', '{"ob": ["52c04485e4e4e4e4d49f1eaa089a5d910eecc97ddb04f736447132382bac10a5761d36c1d50129a2ed422edeb247605a2fe1692f62e9830f09e881767f6ff77266dc1540b643cbb1bdd28d89c5c49567d39927c37696e91b192f87f5fe699b7413f90367fe2bd9e08727758730e1f911f7a92160cc95da33435e3c5ec6393b449178dce188c76af2e38594ea6ef50be2cc94d57e4a3c4b49753e75f4361f8a2a295a006a46f85d071af924baa9c61c685e8961bcf01d1e825f91115671ab0703f4377f52d573f29dc20fa038efeb5a50db1898037ec60537c02a5a8e4d2f23a47475cb965e97bf3d3351df2d3dbbc584bd0e9fca9ae7d5363c8a57ee6dbd96f4e7d049f0d22e957ae82a93b771ebe75ef2db69845ffc346f6bac377ad69cb2f849d36e17a4a7d8b032d22bca408bd51d541977e84dcd83d17c13f0c1218564565231167cf5031807d71cc5ff92acbe57b689adc965a32244fb3ebd97a090e35d4adbf33be45d65d62624e06f9f831838a9650b9f0192d5bf00b34550a997ff656ed17b2f18cb9e35112e69bf22baec24ffd7523fb7dab72e"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (54, 'harbor', '{"ob": ["bc191eac36363636335058a5cc8fed09e8fdf5778312975441a2f01de3ea65de1ad8e2c2a69c077ea93c4d24eeb117fe331c6425c607a88face9a9c351b9168232849d7622723bac41066568fc66c03a96d5a030083068ef49ae1ba8c6ebdf263ccac23805593e6b1aef6d6b8c3370610d94763de959f5d31d21f26f2fd12e9bacf233e906760d7e0ddf0c32b137160c776a9a0ca0d53272f9f9b8abc02fff286d5e7b9e47250e7da3d335d6a6ad059d13ca3dd5990fd420c9b31ccf0decaaefc8bd623bc03487452c86d0d6a8abcfa5e004d387dfed8e103b5cc84df9a0331a72e43f67024e4307a2d3674b204019515a1f01b4b63d986f50006c43b0b53033dcbad8ca4403e47efa781572740a6f9e052fc2e88fd76a54ee6c2757625662e40471f74714d2465f2e95b881b501e36cfd97f4319f36e88b441bede37c29e5e4f1859290995838445322250e4b99cbcff65faa49977764fda8a047da6d72df5eac8bab165317aa986decb696e34af42702d0f2ae243e16c4d89483769b20f79bee31f3999f79a38e08a7994451fc91155837633d4a42b816"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (55, 'hawk', '{"ob": ["bc75561616161616335058a5cc8fed09e8fdf57783129754b1edd30b70a58f840d386dec9ab4e7b1a73c73a3ba37dc2055c6baf7f0cd80965a79d63a2f472d51e19e0e910afa5dbfc118384b03e02463d973f56f317eb2c5adfdcba197f89eba4855fe55ec3a94887aa2c69b86e0159967d5a6902fbcf1a7fd2e5b24ef0cc6558ce356516102375e99c0ce425f3fcbeaf226beebcd908b7a595cac1c6a762b086fb8e2cd7e37d1b051be1a45a727899aaecd86740649f40b0b16b9cd001ff7eca60971a7c715cf06229238d052d4e0e84b5167b537f37f7ebe28a1f78ebb3df07d5a383a3e560f7df3daf3078b78d3a4f45482d54a932d3f46c60ecd44337f54dd1843d39fbed6fb8b3f8b3468e4af20a25da19861a02df28f877a63fe81066b21f5b4f626a3903a370e5fa2af48a0b8bdcf19b44551abf135a2aab49353a3741a5d5790e7a833ca3f9985082995893534a7f4bf1a954b1e6b55c49cef8ebbf43655d7edcd27615f6b853f79b3b7de7aa7cf086115c9525ffb5383ceb26ca314d22b836feff500f6cd3936b0ba65104d4d1a10579ce0312b"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (56, 'horizon', '{"ob": ["5b345fd51c323232ba202d0487558727487a64dc6be293c339f3964833384b7ddd16f2ffd74a7fbaa084fdb586b95c1c11d092f561f3f428df0a93c9bd8449321ab8c61c4f3f1b807e96b8c6db3afc1ef38cad068b45c0a573c3a2d4f1e0d86240ac52761933778a241b2fc84994e402ee4e5536404ceee3e04ee911f50a97b0744a9d23bfa1b6db0d9018d89d713e384b12da786d954c44a8e0ba28d45e6f71db06a0e03ef3f3e85bd7864de45d0342d24ffef6d0cd094f1850f9f95ee8f0f448c9402b977d045b7083493ebdb3ecbe2e533bb24a0f5d4de3ff4b3b6956df061aea1254b788449ec976b01fb9209849e674aad47dd71892433b0ed7f85c4fc794bd213549baac83f2e0fea9340393e7599dedf568a0f931b99a745c421fe7825883d2a386cd02418d316ed9aeb0b87f9ed5734b2d554e7221d12d067c0503afb7046b7f0bc9d94217a5205a0731fb1089f003e00a55883611fcc621e32724c4cd75ecc03815bf4cc4ba5eb39f892adb34cd40b4fba929005dfc39484c50bd9815d450dae678a29417d78e45c4590406143ae90d79f26076"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (57, 'iron', '{"ob": ["019343dddddddddd8f411f9665472c2602e690074610ce26f6ef0648330cadb65c844e30c94d6347bcc8c14d54a685addfc851d0364861e7d600595d8ddd16e9bcdc11bdc84017f983de35aea4414b7c318ddea3e672288cc9a5d1d8f0305279e78ee31182657d90c12859718e00c49fc356bcee5c58b2d8eb7cd4bdf029b27da5a18a9d329f52a6a975348cb329d9761e765d6d3490a1c040b83e6f80d9ec978b94e82f4c2f286b7fde5018cbf46bdb2c9fc35851fa8c07f0cd8ffd4251746a6cf270279f4524d28f02c2a2055828c320d73ba866dd0aaa8edef7c1ac6b651a25aa515c3b2a767c76592b759683982df36215793fc3c7675e48cea76e0d2f5fc89e1b7976e1728b9e3c1cd7b60bc5e012495e1372f39cfd31550eee7644a1adaf4c489ddfda6da80ca8b786b95a8ab58698370c7013f031528df2549654fa88bee5aa3813047dd4c95954999fb1d34b03e5f6069f87ffcf6f56b5588d1a44092266a22de0457481cecab8cb5b9c6be00973908def98d34ec17845fb7e70c754810750151f5a8944181037ee4f0a593430900bddf27c3443"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (58, 'island', '{"ob": ["01596f03666666668f411f9665472c2602e690074610ce269a687d5517dd0e4b84f01b309fc0bcff60f7b5a0757b7a75fa306f373d4fa9076254d197f72d2d45f6419f0a5a314a74a8ef0e2460d26c3635e7c667ed9db27a1a6afb353e7a1b1128515cb59ec843b71816cdc152ecffe5647e5b43e9833b6f71ead0bb3cfac07c3127feeb000497e38ec8eb7e91d80a2135e7ae687947f7492bc939ce028e4ce219198a7b26d6383dc444b86056e6039ce4c2a0789c4fbba31dcc10023adbe198bf05a0bfdafe37f00ad50083de9ec30dc7d2102f047fc7f748f3e12c7368629189f3425328bde92360c378c41c1ac9f126f87b0068358cc9c817b6a83e063af81e2c11564ed882eb5051f9ac5da04fa576b71e0be5971a7993219e22b20b12aa2636d17984a0fe91ee34932f3aef4b98486b9906e0eb9f44ca1c4e97de634b5062ecd3554aceeb167719ca7faeb1ea309115a9aff55a336f13339a623e98edba128100928913828461423bda9d2ce52eddba3c934de40e360ed175d8b9cefd47684d37a29c4b15749f972604c051d07fd544ca9336146066"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (59, 'ivory', '{"ob": ["7daedade43434343702637935b1ca7db9e0b4ae1936f2501b242f6b8f05848501df81f0eee7f06acdb73f8296b3ddb6970a06117d34c830f57b061d25f76158a9166fa837457afecdafa3cc35854cd4e65f73ad4e2c88b1cffffb5cf2e52c1f798979edf290fd72b9414455bb1f9a543c9eb38cc9ac96ee83e9cc7efacf639395ef0d3db1054e5d5bf38273a994629a62fa42d00b33cde5157dc7554cea6457258b2169fa43f19819fd337b752f853c630be33a0c16dcf82eed3aff1b859012a5cf86a6a9e6e5e3d3b0676dd7578d39411427e1ae6218058c92bdf5c6adab3c9d03882d2f5f688093f75d1b3a69b79e0707910a0d1de5fa6e17fed24f41b494ecce1ce324d6116aa648a0254299c03d5e4417d3174c078e7daaee316668f38ab24807376eca26b6ea3ef0e00f9b4a031092922c3a24bfc0a98cd188a772a8c3c8d8519311ed54f22505d624952919ce177456144ecfcf2c424ea1f26be5b59e129e988e4a0d45d118a5cc7ac497edc9dfc6846e90027bd1d365118c857190ac3bd8d61925424c866647c70fb24f250d4434cf593e7af76ca"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (60, 'jade', '{"ob": ["421a689d9d9d9d9dfaaff1e2a2d3aa6ea5808087a60f5fe00b5ff73f9dd1f260e74303339e2a78fc6523553b129242d3e5776b498dc4f8dae6137a3f66e90ee6f9c37959ac2b1a903670ed4d02421e78238a36e7766323ba504d0d6242f3bc58e99c81d5ccd2ee3fe10a4e859525080d7177446ea67f9379b83f4a86d690236fb9a6d49abba9aea76222e1eb54f7286ee4db671566e60a080c1b8d1535dc68edf8b64a3d340a5fb98e8cec16c476e34a309773402f051b23776428bb571cd84c90970289dfff30f7a88ba676be4c8c8805079f4608bfb7f3f70abcb4c681b47949e9085d314e9dcbffc8412289e59b03c640481f6d78b1d8d76298bc53fb253e9930e95b05023ace8f89e579b3e7f7ba6c51b1416b8a6fadaa44e1a2c462ba9eac09dc0943c119abc292758725eab17c903fcda889cf01d95af8465e347c1fd700aec25e293ea5a71e5d68a359dc6e7a1dd5d77aee6a698db4f7a1ec96d8d56c89f61381787a35216d8a57b0b64357974420304c2939a74ba3dee8e5149861655e5334972c2a14efea50d313b44d5cf1be6b394468b0cef4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (61, 'jasmine', '{"ob": ["42bceaaf44909090faaff1e2a2d3aa6ea5808087a60f5fe0fa65d943066cd97f73159cef8f60e9e0978661d82eaa837687de9c6b9548ea4ba4d111861de43f797da7dfaf67ef43e7237eb103ffe950b3b52c1d278b883f04f05c3c85033a052a6e59376fb18eb856ece06551f7264a8365ab5858eeef19f51762cd496bbe826f5a484b86f1dfb1ff894daf043eab16a9e22825409c8a84e8d8921303c53d65473c7638cb83d5f542723d04176008a47fdc1a3eb06a7d6a314cce5d931f1fc05d4d56562b7c2452ec7d99c572f995cc7ccc1cb4ab08d7cc0a63703d9038e8a31693f98787a48c377c81437e8c36e9f329d03eb2c535dc81d1dd7a52fe7bc97172480304948613a065efad36a6f72d12bf6673d6b0216862de751970eeeda0ce3b1c4d24ed3676cf6e828cbedebb4b0127441043e593c3616715d23fe1c4f55c62d56530a1608922f8b2ab301116d957bf8ebc2ebee5b03257e3c8781e18789cdf4c455e3c7e129711469b631a438be4677a142663ceb79e208ecfa785823d091b1a62338bab6c3f880ceb68367c60094b152058c04dc42b02"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (62, 'jungle', '{"ob": ["99742315797979798b1c716a1bbe7bcbaa0c97cb2c2fcd3d233a66af314305260612b0927c634421a28e7ab6bc9f4a1aab4d85cfdd01c024f0098d90d2d175788c4610257f0dde1e3fa3ef0d74c43cbec072d35a69aaaf0261150344d447e6339db045f424a0a5cd2a8c4e02918d1ab1e3667853be544bd64bda590973854325508e5e6c509ca7c4d454a2ed5c8da73a6fa1caa52489de327e275287cd5849d943f1b1ff9ba02d24055fd25cf421761c8689c25b35a59dd3d61b2ec1f06a0965f660b924cbb778b19e65fccc1d11a6401f2df761817db3cd1c9c27c2141c12ce2460d1a56d1bf7ef4dfded36e28226d5d99fc38f288994dc934e2802212adf3757dc90d148a4f2893d9b9d8bbf32b05f12faf3375e31cd47b13e208e00f7f55807aa6c451e07af55370d2c01b94f4968c198e04b032ee6d06eefa0450110058313e5ebe8c1cee64d672f32ff601d27a18f3f63ec8bbfe04984efc156317d306121179e50f66a4005b3939bf81a9baec9b986bfd347cc3639ef55478399c7cf3d13526e731e24c4a0883a2a75fbd656ff59688cb96ca9b8ec"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (63, 'kernel', '{"ob": ["f749fdd3f4f4f4f481bdca4c03ce93692617054ad9f1dd4a6db0d1f9d80b9682ea0ce0460027bde10a9d39e1b39a48607830efcd3bd33e5f2f8ec46024bfd17564964c5da40f34ffb2185e0c1ac9949948834eb71c670c29ff12cc271bf18c795cdcb0032865b1b2fec2654090a661261584b2d964e6f7856481cc2d9dd998e63e0fbf119b8847e40004da13d0d3ac92018d9e1273ebde6a0e3284011c28d3405e00f29ef265b767dd7266a7a255da0edf10965e9ca393bb189d6c6ca62707cdaf9819bde0f8a92f127f8bfd50c30f35e30a46e6ba55260203696c8cbd03527c1cb5d9eabe2c70a7b42a5fdcd45c8ad99b178162aefd57c907b27c059cf715e4416c515ca5d0bf33de17e1b6a0ef00924fa42cdf463ec3df5436303a928197cf01879327a5e873c22f82b3cc92161df221d3868bccad9ccfc1b6119f55a273dbfd823a8f50aeaa5aa9572f10bb8a4ce68c8723f4194f6bb788066632a95203a58b2bfb1fa3ec53dbed283dbf55d5aa282252954bbbfaff080b39801cf46a08a850088101e684a21680c834cda2558938fabcd542ea2b4ca1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (64, 'kite', '{"ob": ["79ed3dfdfdfdfdfdb9a0a31eec17866f253af28fe6e67275dc0881620f41b1e456d130f5829fa36a9c0656e58011d9de4509ace41284089263e6bd9f073206d8580a7b7543e97994743a2005c3f24017d797465f22618d7d58cb6e8345a3aeb0e39292205d79116557a27853cda2944249920942a087c71939c869be93544af1d745c8ca6a5f7ad44a813d27f799bfad29b000e017a936fb58397468eaaea07a30314625f00bd15810a09fe587b2042ee0601316167067028d8fb244bd3d7b23f97ba52b4d2f146c1f0a49cd103bcce0a41e521eb02aa25c7c7c262fb65a2727f0dc3289ac242638f8bc9c209ed172164265268cd872dc0dc5b559efb5decabd98ff11292c8c08056fcd2372b1d73f2d610987b7d761f2d72616a72f6a370cacfbc54b0fefb69dd2d48908b6d64d36c6d7b424b3ec0d8013deefd51e2d982de0c8d472274ecdc8e520a981084e3c236326444d03c76c8982116132ff65c5d847ba59a7ed9d759baa8d43234625c556246a6909ba1d0b645167a54fbd28377e1c66d1b26ba2b1981cf4da5f2d460be1fc2936cda92bbbcb96"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (65, 'knot', '{"ob": ["1b581d5d5d5d5d5ddd8cd13b746fc287a5ccad6a1a7df89019e6f7485fc78d1fb28e4de67f6162a4478b0ad2ab70bd66444425184b73d16a8c2b12d0f95737ba45749364e1347705fd637f3fb72bdce0b9c83ae6a16dd53caedacd6e6c56426893572cf9adb82f9fe6fb84d9b0a1e45f461c3ff32a1107910aa73348f31568c3abfcef7f3751643f14591cf5ded57c3ccc20ad6311c7c92c6ad0db5279a3b86cb8c3e96f5978d7e8376cff3d8dd23a9cce5f16aa394be60aef8e83991048c1a2239847532df8da2372006b0dc2f5e5262fb3a63381c307aafecf4136c249a88ab8cc5e6932f2d2a828cf1018e1d431d59a4460afa4f88dd702f9c17895fc5df630bf0f44e8a6f62834bf143c975657ec50f65f39c4db54b543407f908bd445d6698727f11f8f93c9afc7f7b7294cb751c7bb59f663b3dfc5b3960a36ae7af4bae83f447ee3a84660bb806797bec4677c7472556bf1fab881046fd201816642f8d19a7c5f18823023a95b68aa85daa420635b1727d85e5539fbe5a159d294e1be76b19cdcddc2de987f5aadf089b2ebcbedaf89573d0852c9"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (66, 'lake', '{"ob": ["3a68d9f4f4f4f4f4d96318e2baf710c928f6c95954654e6c9b36475e0df358f9688d9f23aeba6841852c0b0f22f7112ca4588ef07803b0ac55db9e92c44e50b372ad50f9219e54868a5ddd1b5293ed8f2d60b6304c447430a4802328c5e7b940ab027883e77b8b8bc880bd51bae2e830f04e1aa6fe1087f8f4383d0bed2a7e519c07d3fcc9f21cfb008481db4640e60850c635b1b74cdb9ed75ab51c5ea7d569bcf3419aff75c49b17d13e4d46044485ea54637a50ce86bcc2e2b0f26f5ac6ab6b3df5f1702c3777a715877f0bf49f38461b033ec9916f2a256bc648ecd8142d1bc9bdf044537a0bdcabf8ca9ca7df8356c17b20764dd272520562710be51c0b7cbd4afa37c2f5ffc2b909ca0ed25d4ecd15ffac1a2696a8babaea4a1e5d778a8d181b67ace9892c6c8df184c4c3438ea319e37c5a5268057c9e29a4365a3d183cc47958354732404c6fedab35b821c1b4b17653a019e2deaffdbd4c5e7571e0447e1fcb7e8fac8efc57823a8ed9739cf9bdeca613b15c0f12f8b450a72368415b56e5eacf6a61cef0127a94a8642915fbc7cbfb8c1e632c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (67, 'lemon', '{"ob": ["4617f61515151515880140ec7f5bb9799d132e906f79131a932482a4fbd0810a13b963a2ac7343e0898a025819cfb26ea145a5295bff3d4695a200cbe635589fbfb88efb68c61cf0b7d5274d9a9690177c1a51f8122b886847d728cc3bd6b5f0d64a8dab210efff7d9621a7610ef8bdfa685ccc0e25581ef1933da9d2e176a236f030c9f008c42c1d8b806d540e5ffe5b19a6e2286c56c225f11b90731a9f85291fbeb439eadd3ac137192699b9dfb3206b0d356028a7efbf426eae17bf57797a62f59cd4429570c88597b423f6e236f925969c3a074c85ff4aba90d75e1235db94a19706977f8aa18780a02d20e61be56e481e3184c88c0d7d2d468a170f7bd483f95b5a8e027b108054a69565f0c6dc4bc470208b7f708e31b4076d3408a7f64e98b821d4d6c785261be26e1ea2fea326befba924bc137fa86f267f1cbd269902c5a3c98559742f307108499e11ebed39f9770bd0fede6905391c22f1c69da3f8671bac137de5986beb34b14d1c31d4025c3cdf2ff52571fe5c0bab0e9b9669a0635392fbf9fec8e7929f0159ec9f4e9253f9cd44a989a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (68, 'light', '{"ob": ["474e6eb9b9b9b9b9b4096b75a631bdbf96589d81772db14ebe58f2ea19c222a0915385b7e7579361ce86c1747737d4dee433cf98e7e426e1251346200ac50ef8fefe5fd4e0f844ff4f209035ca16958afae820640fc330b21c6e284bcbb50dca5babb0d5ec8affdcaa59f976676731738e5343d1238fe86722716a773fc7085e2aa145c100003f808119e7b4a1655016cb2dcb38571e4d2a74c73c620f3dc1962f90a193e321cfbc994ade2009a1f1b0f483ec5185f9586ed3de93fa7cbfd991b5ed116b6616e23aefd208dedf83f7f4d564121ed9b714a77f04ccf48f53835ae61009118461215b227a6f99c2d8862d5473c537b5f685747b132b8903d631382b02d2748887e99e253af2066f0c89ee18bb4a026fd6683efaee709d5a8329fc1cc5b51c819725a3b799a6ee82b5c17e355a0b5479295c0a5b8162abb8919dfa7edaa51423e6fe81a62387b47c99ce43cdf16524e3e5ace31bf0b76329da3bff42bb2b1e5983a4b98d385d811663ca14135aebf5ed767dc5c0f75dc7750b6110ef056e49765070fdac37d7077b25e30bdd41182a520e3f65"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (69, 'lunar', '{"ob": ["33bdd704040404047b21c33072fe3e21151951aa7e8e345e12ec2930c7ed82fa8795f829e9460f6deb1893a092fdf7f3d9cde46fc7257f2e00ef1be786d60299a705c4f7aafb2b7b725f6b2f8af7f1e85e715cf8a6e5ffc673469ff0aa27c7423ac46b960279c72223c249d1bb556098295adee43acb1c3f3ac6b206f136d8c4ef7a9478971ecbafb064d7bf0803c4c6648c921e56891ff215ec5b0a6a69ccd6a642c4cf698969f8abc270bd83683cb8d36055f7fda6228afe05626ec176b2a4e18944e1fe074aaa2fde6568c23de2eaa89518ee318d5279618e6cd15949e6ccbcd157e97dcccffc7a428c88871fb6538c95a0a319173e95d955b50c39bc8c0f9883d1fe004699570f9da47c640ac67ec5d726f9a1dff1f10cb0448c469ee3c447850a2d61e56474b49487e0c25f09fbe6b841f939c0197b33b53f841399bc947f0e723451a9218c46618dc650ef6b90aae8ef85c60f39573eaa65d50dd33beacffba5c3df94fc2e39e20af8b35fcdb23c5c2022d9053f5a054fd04984937df9425c565545569b6d4aea49d4db53b3185dde8e50a478f1ea"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (70, 'maple', '{"ob": ["fd089f39babababa0ec0787133ea2c54810b7d0929ec3dd947e0194e0987d83ba171ebec4becfa896a8f8f6ba4990b0bcf0e883693f3c660fe295aaf1c9458457f90dd1276c302bfdaa217399208bb968fed96458b801aefe1d56012a474bf309154ac67787045f966d60edc5c2295f628197fda48a1bc216878e89fd0e5a28b96d66f7a448d19a4b3cdf779edef9aaab425ea5f0428ed1496481ac50c1ca32025684cb0680bde8cebaae8f0925cf72b4f8da0e87b3326bb741f45489d7e2425d1d1529c76cce1989f38b54e19690c9ef7f0231de92559ee3cb4f0310a6169faab2cd9b44db9f06d7b53e07008de03643fc48f6bae0f2bee5db4a3c5c80645fc56c51968c153c4ef427c1411430a9ec336e2431ed6adac14147403aa24f0d86ad80a9428205b16266d4e56598ebf1ef6c6e3b92c38cc6370c72246585e7510b86a942d0e2e56c282e8e0efe1a62b222f2402e14fd6802f7dd62fc2c314ff07c01410d81c558b88a06e6a1edea15dea277da25c0c364350a981633a8de02a5a75d20fc661a24a53bede0d6139ce87d1703d8e47b08da87be1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (71, 'marsh', '{"ob": ["fd511af3f3f3f3f30ec0787133ea2c54810b7d0929ec3dd96b80e520e86941d90d396d69c28c89c6b24ef70517f5dc41546cf1749e03214e0d931cedb073e97e2b01313cd33e30d2b32dc74abb9ee4414ef1b576fc6b128cd4d321f94a85c805129fe4c773b0085d3eee7b0dee1b2a0467c9bc3f05bdac1d8dc5d1538d1b70c42e80d6f535995d9af222146092c22afe1c099075d42347a55b3f3c88d9ebc026fb8e37c79324fc1674a26330138b140d167556341191ca1ab6c8bb8fd35e61bdcf31be8de3b2f1444fff79dc52144f5f5416f7f21a274a9041997804c9edbb380f0ba1e6a814177d39d576f77e2be505478b9b9ef24d2dfc76bcbaeb10d68dc248e83c96fa2a756d27f3f9ee6b39db2a70021e29e3adbc861dab67abc28da0827bad88f58e8868d50328888d61c5ce02fce760a3805203db56d5ac42cb150446c1488cbdf7089cda671d37b2e2c132199272fd3401dbd6ffd18fe4bcc21b34e53c429d9b274369703f61e76f6177b85bd7320f59d6fb7e3e660145c9fa4fd3d4a456c3fcbd5aead2446603daf3a8978751f47240d3404628"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (72, 'meadow', '{"ob": ["82602bb678787878461f67c7097ae2cad65b75757d55b91f1c1295823adfb5c10d7789644787cec3672467aa3e710139e0a55e3c4c192b2dd742d1194da8304ab468348e7da5122d42d87b3fbdded376e22923ec259bb53c1fe354f05abfd99d96d1af06c242ec446b3f202cae04d82adbf1b44e0aae5beda973cfd7c326357400d447d5c191997aef16ef5c282a60e0bfc1a28be5759589dc81188ea554852cd5961ef8d9ccb1e09a9ef9244cff3ebc735d3523f49b87410718cb6f8a3deace62a770236c49ff0448dc2ad85fb1c7b6bfc04ebc8f7629091f1b1a41129f119e08ef8108697320747fe43231b3ec394084ab23e286f5071fef0b3482b50801203ecf1ed157fbb02d6143d8a21f8db3e45d2aeeee68e63293aa57e8f54cacfd43314c064e40ee3d7339e783998d81ace436dd28db59a9d73ea5b437741d51abb72c0ef2ae0220af2d9dd8f74ebc3c1c40832d8e1a037951059715775ab856abbf8ca4d6c79512529276874f7f8b520c56ddce205dcaff0c02f3379ddd7541138b4cca8f5509063f82afeb2ff7c1fe13a2ddc3fa9fce318a33"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (73, 'mist', '{"ob": ["fe064806060606062b3e56ee1abfaa49681cf154cd474ffe82d0d692251883ead025462f4ce384a8dcf8754bf2ffbce0de28275274ead3b646f6f3b2df71b260bd8bb23b8ffea1853daa1c28264b9eb8a28076de010534d279e5e302cd4b72bf36e3405742732dcc0d316db36c93e4f5e2fd11ac313ceb06554816aa78de7463a7a64d178e284fe7de30af88ce8af14496210641a94e22bee116966ff8fbbd25c1a90fa1d46c6c3dff567ecfd4bc6bf8b0f7fc16e0c5ed0bc1d6dbda42e5e9baf8de098cc2a71ef3b928fac8910f3454fb09e4aec389162cb01789aa4061fefec6508c0422ea6200af3e53e76ab79959ce7fffb1844b15cb7767f39a8b40c8fe69e223883a31113a1dfd628794abda35990127f3ac2f1d4da0d74e710b499c98d5c18e520b2136123f6f2af8b861953fe1deea91f5aece24cc6b46910707ec57d64bf14c028486fa1deafae27a60653e26dfa200ad468cd3b7c0cf49a48dc532171ba67f5e2069a917d5c9afd1199aefea93ac93322b03f5118c715da3362bef43015febee4f288e6db24a9a25aba5ff7ee54fd0d6e63371"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (74, 'noble', '{"ob": ["20ca74f8585858583fe8c3e1202bbf74f19ac5a10545022c73b1749a2f22cf484312bbe2155b8294fd06aaa8b9f6a85bac353c2e5a8af5d2194af1cb8252f00f69aac9981e7f0170dd7086de7761e87be6f8d1a13ccbb83e848620b3ea587a6b4555fbeef8d8bcc68550e3d223958ecf0058fb692950f40f89a0d78842b16a49a1a1cf784f81ca6b931a315da147eb2863f04271110e0c2b54434974fba8b78eb910015dbab1f3cceeed68c5084e3da12771a4dc45e629c6d16ef19688588abb07da3e1750d63cbcbd39903e149d47b6a0bc04b03bfb350b955a3967c40b49b29ffc8164089a8b90dc9cbe403964d32ad4a5ffff6ff21a730444ba48dabff801337a1f5bed0334734823be42e443ed08275145dda19aee28a331d828da125dcca2cedc5b4b8c0bd7d7a7c01f8a5848e0ff05e3cd4d7b406581d71dea3b2e775eb289397cd815ab0bfe57de2d1b33ccde94d9820500a704b34ac259ddeba5cb5729c657ed3f68a34ca75e8253858a4bfe0e80da18ed826ab858ae7eedcc3af796f2e4b7669b62ffc917af536e3c299b391a22424d16662be3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (75, 'north', '{"ob": ["20e77bd5d5d5d5d53fe8c3e1202bbf74f19ac5a10545022cfcea714535770304b1ee6d086f8a44562f6f34b53b3a508e931309ea6afff71d548054bc8ba700479ad7cb4363d9ddd2deda12fb1648426172922fbdc72f8980bcbd8ce4a5f3c6c287db034b66f8e0b47329a13f7618ca67bf5d2dc32300bf9e7b971517401cb7714ad85c77c383ed70214ffe5e28b58729152fd90308041d31bd06c6f6bfd8e5a3d1367531fc2e6b79ef8e244f1ff0fe2ef2211d5651942f16af3c362d4ae91c63b6f5a1a0e029f7f577a4379f1439860c60343c5db2594426f1340f2ba73b998eef0576b443796ce2ec953a5099bc01bf43cd5f0bf49641ee990b9897edf349376d4e69d7193f3abb03b5c07ff64b48057af5b314e18f71bf0e24be6bf8d1f88e5d1b604ad57951b1b50e11f0198e8ef3c7a9f783ee3a64d447c9bdac9e037eb9b5b01ecce1120a35f4d89fbc408ecddf8ebb2521ebf55832145621add776aa7f563fdfb60832f540fc0f248a044bcc5992dc896336e20d595c4689440dbfa6872177ec0f9abad613068ef9c21cbae3e7c6f7da706f6bb96c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (76, 'oak', '{"ob": ["0ea52929292929293a6776166c4cf2440994f949370bad315821d58448622e5e376d823f786fdbeb849e6f8f1d51f2b3fe7f7cddd690702587151af791415ab64c03c76f0e14ac413bcbf0f58e73df1a0546e47d470ab896286195a73553320f2b0d58360721366c0a6090ab4d486a0fd12bcd8c9ea10ab0a3cc03d3b5e7126022bf0c30f01a9d506c9ca479ee5214cf3b6412a01ae131d1f1e992b052176c8ac0cf394564bfa1243ead74cd49c07c262d142b8b3ce7d882f5a6c358aa2d9d79f3d038d9c85b78a718f09e597f7fed2f172e21c8a1c7bbb2665aafe03098a8dfe95edbd09312cb0619a2c3e2d368cf2f21361fed612643258f6a2d399e95851a53c939df1322c7f9266bdacc56fa86f050a61c14a74ec4d9a53f56e01fe49511863576b15447fc1b2774b8825d65d0de733cec372a2af65d49706c922cf913036eb56b2dea9207adafc0edf229478b14e3078f61aef89bad291b25749b30a218bb0c29f4a380618e275ac180cf93f837aff92c84579706df4f2fc2a4918d435ab1b31d8d70504e041493fe4fb3b7e5c1bd3c68d72793a301"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (77, 'ocean', '{"ob": ["0ebfef7e7e7e7e7e3a6776166c4cf2440994f949370bad3196047c25d7b14f7d1c29f5a14119a94b62ca315ae8172663f3d1622b79f84cd6fad224425cafe25ec309c144215ab8ba10690440bd50048fbc4f43a65670cc01fa75ee11b1bde6b78130db8dc81c75c1dfb0cb5945d2663b5c07a1c9d41d4eb1b639ed87dfcfa63f23050e290431bcb8094d9243f9a728ca20c7ace95afb58e1562cd5ddd3b08767af6296476bcb40d029da76e8703ede3f12b9c5f1d618bfed5c8bb395b713eb25d9b2568433b890a1b46a7ea5df47d57feef3c9f1d7e912c780315519c2ee565f51a78557c65eb2039be8c6533e007faa441b440da8bb2236b5ad5b10bc822ba1b436aa634a4d1d10e8b929e2c294d9add8b956b9a6ccf819fa5908fb9dbcf46268e4cb9e585084419b4e374a67023b7b3386ff4f5bd284c0f6f45f67bc6e2e21a1e032ed69618cd1b3db582ea5a490d06c2cceb497acc4e736bfefe93e7dffeebb0801144226e330886110e5ccf4270d1d9d67f301e0d43076125f8544bced64e6ba7c1817b09564fc3ec2e2533308d9c48cf85dda9b8bc6"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (78, 'olive', '{"ob": ["c0a23d78c8c8c8c89f07dfb0f6a3fd7df4bbc3e8ed7001a51e6ddd797840c5f9374e9d52e1389b092d1e7e5e616a5762ac91a75047d11f399f689648358a7b720746059e19f274f2729c5e2dd8d3344bbea5cd16b12357d07080583be7ca6555674845e99ca8bbfe5d3e0a9d39c664330e04fca113b3a8a393caf12578ba79ddf1cf5352177103bddb0e956514c034a1e903f03072f16fe45038c4680db3d2e3683285f342e0fe1aa6567a072e652e037c8250b704017ae0cb825896ed179f74c99489eb9d2595df7525010932694e7725fb9aa21ac50c4e84b6f0c985e3558c2eddaafbda812b8b7ea34c571802723283d17994931b2a052f455f945673bc1b1f71b3fbe9a66f82dac009b19fbb495086603cde77fbc4c1d72b1e5e93505962494639a7e712323169dfe7a1aafcbdf967f0a92d62a264f7e514944841e788e777e2f4fcc807d1a4f07e8d01f85d6c1f8a260d7cdb5b8df384000097a06c811a408baa3960ec6bccc3ed3170581869538e7dfc687c7bbca26067570db9c0c7642e1ad2fee8ecfb1421f1276a6d73003b0050bf2a35f7b195"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (79, 'orbit', '{"ob": ["f117033131313131a92072ffd3bceb837402fee40939c2debd06ca8e74a9a57795b8eb0659ca0bb4d3b98f85efe4f7bc9147a7f2b56a9d12f7123f565fa22fcb6f7ab0da679da2bef08e10cba61575ee39ac10570ce54ee96d7771164b33fcfea3121f117f6e8e089cc14857fc7dac4deb9801fea375160aec7e2a1cf62c3174ce7b011c7fe71e99842e7cc215416e7251f7710aaf3a186153142406b0b7a995c2afd5a8da81e1b9f3139965dd06c5dceadd33366a2accc8371b6e93d402c1a872f198c79229ae3ce95ee814735dd8182463492d961832af2978ae7b3ed5b4fed043bde8ebd4cd44f2e0c7aa91deb55b632b61847bd91bb73b5b87780cda3ca570f84058396fdb1c8ba3da9ca20935117e56a922afeca59f79a890791008a26d4954e6d50dc4fc16352fab3c315319300b97dab9f3e69c215db5a2191aaefa7a2ba23243a6f8cd582373bd55b939cd9142eac749d262bcd9f920b0ee822a19f0c95b15e1dc89e0971a75ec7e24b54b643a5da71e3e8ce4d521817c908a38013768a0ef2567c54fa59e680ba378d2ddc8e3d648639b58f671"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (80, 'palm', '{"ob": ["f6bae08f8f8f8f8fa0aa335bffe1053be2fa2c2c9554f7cc5d714e3c137f34a618286986be2b3663686c4d5dafa7424293d0a59586163376f265e276112abdc711a462cc514659b85be5bcb2cb0bfb101ea4aa79f7f60db7a57675cc48ee057657312f7063b6b61cad69870bfc64ceb7b3009c9e75cf5780e5157ab2922db6e1c4b9360743fb2def9e17d2c3474dd4dca919de4fff3c4a943e4c0f6f436eb86f3d63f6a158c6582487865ee2e26230c74bd8ddd2e00408a32c84bb3613799dde34eaa15d01fe4f356476bbb9c0b37d9276c41758ba1c26af0291a0017e353a2640001564754bc1ee8dbbd71c6cefa5aae445ee6ac218218ccdf6460039746369d42def501a7fa0aa595f32d4257ba4cfce8519a4dbeb2aaa91a186979bd04e76b9011d1a4d492f91f510f9e2df0b83dbaba88526997a914a21f58e2c5d8961cf93687d2a927ae236f73c372f9b2e2f8a22160ce0649576bdecb66885f74aefaf33b257f67123484ba7d3c1f79affc2e6335ec0f00974ffb110e39181ac8841206aa88adfe3a3228b8c3de58294d960327d41f193f6dc7378"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (81, 'pearl', '{"ob": ["22a7943434343434fd41e203aadbed6575daad8b6ebd9e68885283759c734c5dece270253aa53d71b28ed1d3baf419a27e92e4814f4ef7619e4bdc10fac91c353bfb33d0588f9af5c3a75dc1b580c52e87f032d533f374589fee63eb72640e7215787fa7311160d74c086386bd3d656396a4fc8d5c6207e57e084034bb1136730cb487896def435c945d4215ff23843590a1b08c7d2ba0867a1daa1c8c7d8027e91b93ea0bac6f686bfa4e4d9169a6dbfe062f14b6d94553a5f1900ea4765109bffa51ee89229600da335706d97effe5266a5522a1ca707f75269aedc8ce21cd8b18debd7f5232f57defe5bd14ea980593a527912067c0fb7962c6a1313781abbd8c1bef59b0deee8143961118df7f7c10521132b53caba099dea8130abef28e60c1693a5c186483b1f3919a5e3eb7c9791f13fa5b7adb4c87c6be69edef400c2381078d9122d189db7a999ac348ceecee8bfc1900c6ba59e019d8a93cb18086fb3581eaf1357b35a5b38c91f200d43084c97e292fe4b51d27bd6cb059561877a59524349df3f188f386e02997c7236fc1dcf148b1a2bdd1"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (82, 'pine', '{"ob": ["90f30808080808087662aa81be037e61ca8c890441ce3d3a0f54240ece4555f838c35b58d184f3b5f5a7302561142431cfd37050c56338dc388277bb6e32095ddfb500a6c93b9c6d632255e0c34959ec063828bd2a774569f2b4078f457dda932fd124ae97bfb72a7256a751657a7e5dc103f8879b0f34cc786d511128b4ba478f4266dc2094ef1d66a102cca558c1f0234c17e1a1dc3eab16e108e267e228d8c97c47d63a0e89d9cf706cc5b4186d6135dee928e2e2fef7b6254b8ed2da67f300b0a1adf6823b89901e19e7d45f4466399a155e834e3091620dceec6d48bc3c9edddb3abec46526192d47711549058658e8248b6380827f62f06c9ce109dca0bbad2a028e2b892c461a2fbf2f95e09aac15ead67d9da59c8bf04935828dd9cb1638309b7e57eb636416ed9beba75dcdc08f2103c9fee7763d397019b349b0f67439b5516d43744b0030cd91b17bd9e824fbdbff3af05aa169aff9826fc9e4797ffdfa123e789b534d089d36fc8e899861a78a227446b9f0a746bf761319392700786bc0c046c7641271f5e6f38e764c9f41957dc7b4c4f3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (83, 'plaza', '{"ob": ["eb2e3e823f3f3f3fdc6849a90b61ca5fa812e9a7402ed9fa3c754b7789bbfdb54791cd4fc6bc70336c01364dd58dd4ff5255715c30c389e9849ba639316f40dfe45e8c2e0bc0505369800e14c9a3351b0e9a53af586d9c90871b4b5323281ba7dad57c961578f1bd355c241301a47c44d607c300f04ca2a8db75dc1c233bec476316ab70a94bcb8f032640c6625ed59e19b5d13ff51715df46a2f9e3bd8878717d45baa7173a23b427ed7ef64c134e8d3820df84f326dbc2b1d14ad847cdd3d47182940887d1286f1c9d1f4b476e40a4b2917b8db508475b1eb9637e4859490ef133129b9a3735cb3e20e0e26943ca88d504a980908b7f23e9218547b90714f45fad41712c267dcc5be7c33e2d33dc47c8337262af9131c556c44f7244b85686c46d518300625e039b20f840498eec723d77a1f0b4764b5d3810793affc154af7695453999fa403cabf2da7e0f35faa5f177e39ae660cec9bec5324515a93bd8f4686f7e08499d4394facb4fc055a172d1411d953de496040668103d426091f7828ae0da2e5bb272d8d902d45126d47eb407d6af67ca846a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (84, 'quartz', '{"ob": ["d3532954d5d5d5d5bd1a9523e5e063a8cc673608241124737a3f45b4d073fa99f321d9c21e8f1e5cb782b7cec3110da8af3b5fc617e8977383402de165432e41793abd36058435677e1241e53e72388540be17ede4dba84fcce6df2796a40ef7a97bd9aa59d83dc31aeff9e8fdbbb66d132328390260ecb70f066b699ee337c184a3add8035c9324d98167578db23f7fbb9181fab227421c5ac52c8a7f4fe85028e36196a30793e6ad4f10093d2775184eac5ef4d4b6794f68daec62dd2637b543829c5a947f1049a33ae851d5f3889471d8aef34cc55190635656ff1f0ce57b6590d15cc00385b39fe47dcad31ba979dd497a39af90ad2d9043a41c0a7ba828c3312c904f20cf04ec400c4756b792ed6c72f975f431e27a5eefb159be8be849b590475576d2e2317b708ab18d798d550a287c1566721968478d98dc6ab437857b61112bbe97ff8a33b973ad3f38f70842d02737b957c8fedf2f352346fba21109e5ee77c9cbfdefed96b9a7b6cb2db672603b33bff102431655cb7507916f9e3a2a095c94aa70da2ae3892d14a78cba74456a2e4a27e161"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (85, 'quest', '{"ob": ["d3224e8e8e8e8e8ebd1a9523e5e063a8cc673608241124739985b487f72e494f0764546e467c214af4c753222e51c0bd1e7934313fb26ef392cb933e460e9460f5c9cee6539cc29e16c993ff153f66bf535274539a9ac561e978e33ba88930ff8b6eeeeea34cbdbcb0b729d721e37111720bce038f602d0f15e94c3b438b372e2c7fdcc70f1fc1b988ef03855ac419c967bfa5edadc763aaa58c5fc9910ce2d5ccdb90744f2654972fc719611bdc2360c9a27656c862a1682675547d0cac616d0486d7db37ae800130eca12e61f94438c8ecee43da8f00f3bed2b932d79ebf32468b553e9de93602f6a6c17de1fa2d9bcd0e464c9772f9996f3a2649a619757dead9370d91d80519eb63d4cae7fbee79dac2d899a43b8ec4dbddde3861134b13f4cac1f025006c84254cb409a96173de8a8103db023c694af598458bc5e97d8c2d56d216fb301f81d8a8110d27ce0a679c773964c5a86764a9f0c43077420368bddec2a566a67f56f6acd57177b9642137ffb40a3bc06309b62ee08f82150e47c3330c881f65d10686f986438836c164e9838eb1a09125c3"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (86, 'raven', '{"ob": ["8b385952525252528ff421f74943a77715eb4dd90fcfd0dac276078a6d75954f7de1cefa2e7032418cf272515b9e348313535fb092cd7ce565eb0852ef0b8eca3f619fb3129f16d9ef3eaf550feb5303077b0e850adb5efe2b17b48802ee0076dcf8322ef0184a93ab09115a5f18ed04750ec6a0babecc528a3b94781aed42e40e4f391904ae287428d33b6f48cf58ad9cea3b0d5ad726fd76668ca1012edba4564e98c2304730f64f07fbee1e1bd139baaa32c98af087499f10fd6eba5fd0ff683c5b63ee33bb1ba90b908250d19ed03d7e82e793406506877061503e9677506045893d580fdc07cc61183865d54f42740e4beb1c2ae1e23054eb57c89a7e483cf7f6b2ff7c33f0735c7e7e9b666fedca3ba5fbba2f43c423a76a9f9f61d1ee5741ab2a1947171b44f5f0c4747a92f09c60fd925744617ed19a266e88406c24635ca1911a2e231b050f7e29d649668c725c0d2f3a30cd236be0b6796861fff00cccde0eac59acef3f48fcd66b8f310d7929fe0a1aa83303273be2d66e0182d47b50046f4db8600095af88749a2dae08d09fc8d4dd8d9c2a"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (87, 'reef', '{"ob": ["ace2f4d4d4d4d4d44b40d5b1ea1a5f04c7230dc0786fa2df66d68de5448181dd393827820718e804707157a3e78217ac24bcb89a3796775b96673d33c2803fa3f05e68f32c2d8e0bf79fcd4ffaec22260edd8c4cae696fef50167a227e2f39773cd1e9e88d937643f11d2cfc682defffefb4cde4e90e03ca5211be83bfec0860cb8d98f2569e652ed7d9c8793b5404d9e1cb991ac05060a34e6ed235dfc782bcf595652cc13e349e23f663621690914387ee1eac143fa1148f5c242e8126569ab84a3c996bdc3220a90897b9de9b98dc4e22bc3ee5610153901e431f9b3cc78e896feb36807e364222e95c553b97cc9e43be33a92a62a409eebd08666e3da75993fa01a30514302477fcd96deeaaa60c519b01b36ce1b8503fa01fd1c0e5f3e60c9e6619c4b83f6db70e2593c167fa46f55e1edfa3ea78895cf847cf2ac2ca1b5430b45a0724d8e0aadfe21ab97dd75d501bbe71c321cac9bfebff827843473b9a8f493e283d0f1147535ffb7ca47a83331d144bf0477f716b79249e4928b5e928abbf1b3dedcfee67ebdc4f3552eabf5aeddaf2d6c7d663"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (88, 'ridge', '{"ob": ["540020c76e6e6e6ee205061106250fdaec184e8fcd52c9ab9771dbf35ada75474e18ebc36a0faf7d2de92ba4e83be10598c2d9334a4220cc063d033def26ad642533bc6c824d1ae14ddf7e63d69067d1ec5dbab57d8c506f07e4d221cebfd7952f1f5656b3db607f8510da2d0d8487d48d50609b32ee90aac176419ab78b9a4a32b0baa948f53173877737700441b6b2bb67fce3eb9f3ce60109c47f86db0746ef162f3d00a480409f9d31c7288c9960766feed9b3a1b8f762ffd5259527b865764723d1b2b0eb492ff98051b5de7faeb8ac71c9a20fc77a30b257f21a902418574c700c71714ce80d9484797401464c24f1b490833ff4d6486ea275229ad6d25b9dc3aa4f7fad8f9362245e3d40f7837bc0f27571011cd9488c06fd29b022f55a15b9ef97294e6bdd2572ebebe0e197f27c6fc180acb693b409946c3f0ba57506342ee99409a993729c793f814197a45bcd10ff88bc6134f1d879e7eb1406630ffe2e9edfd34f8f3b8624f646d55f4ff6376db5f3d3286b9f9599adef966a989a8186803451abffff53625997e48566dd3108392099fce8"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (89, 'river', '{"ob": ["5437d02424242424e205061106250fdaec184e8fcd52c9ab3e1e11b5c60a3157cc4dc83311062b1b1140f9772e46f1a25d512e78f8db9d383d0f1f6202c662ab448ca393761eb866a4626446a93ea30f71247f07316e2eefedeb251aae84d862c08c810581e4c0146ce33a357d695b8b52c535fed8b54740d00767d362240f252be823d8ec322e50bf76d94414e1d89581763b5cbbbe2e7186df6cffb7c48dadd91de17268fce6646f713510708f48624ceef542e5cc2b83a828f6b623a92cd7b8858ef3f94a642435b329c3e3204e37fa3229e3498fa4d5b8bd4507793e5bec52c307c01a5e124bed41cd2eda4d5f42879bf59cc08d153a450acd30e52a3ab603227455633d0e2c5a33c360150b90ee1494b025ad504a9908cf74730303e20a9fee00dda4cfd062717d309f79f9ab1ce2af3d498f3c7347d1d4b76416f69528c270a813fbb5a8adbb6c53ec93aef496270180bde9a08dccf950661787ea8e20d9a26bafd8e2a1ee5e858fd3d49a8743ed33a00154e5213b442cdf2c1a9cc99cdcb6749c0ce6d06474381c4c8dfe1c063ad2c6d316de6ae4"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (90, 'sage', '{"ob": ["92b3279c9c9c9c9cb7bd38232e5d4335475e8f36e766c1a9351b750445b8ae7905bfae4db3bdd9e39ea0fd59d1f2ac880bca8e53982364e954e2bbdcbb78d04ac4b651ada0741d0d5a1adf587a864c1a9092b4dd56a197436fd53053388724cd7ea7b704883c3e3921c9819fe79f757bd09913d25a2481314c1c082f96b8419785a16d373266d26cd7020c1726d4e14bb6413346d288db4c09b391778c450018f5ccc645c587b8a3732c5427236d394ead3ae793b9b9795c5f923d9e15a4d23f85da7594db20ed56698973817c1cdbe5d8b2ef83b890c0a207ed3e0e460a64c83df3a3c26118210aaa41337f828d291c9509e75c5cf5df941f45c064962ab330dc9a0ebf037e9d1df65a0eef2e305cbe7545e549b6acd6c9e033375f5878495e5562b17191473727dd750dc39180ebc240a1e4380e843ece4e2e21d4580053c24d533fe46523d37614f09cc683c1e1e3fc6e4ad76ccd94a89e576e8e5a76d7d25a15ad4d2e998212beabdba2521d135f61abca9b087a1e91b252d1e4edeb0d8e868a45414c054e418fd3a4695f6d5d008a403bd269b014a7"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (91, 'shadow', '{"ob": ["1d63a916a3a3a3a3a43a077cdd59bb69067e9f1a70617bbae16b568192aa641052c96f41829d220ffd1834a326c2b212ac58f5fb3db624069279d9d92c7a216d3426d35b30c68c040801c1128a2b1d494067a00bbe39a9e94d05592df350ffaf85e703637c2c8b1d663828e77acc5e8315de7f781514ce2392a12535e33613982cb7ed478502c0849b38b0dac7f7efc41dd03cc47420fefc2b3605cde898f796ec1c48bdbb137543e171890e768af6c64914aaaaa54cd8a2e72816f9cb914d635e22784657194f51656103b88e0d760e3d9e5872175929e5befa9c9415c82c2d0be8aa2b63842a6a13be087926640c35c4062fc2d8d2fd39941cf8d3f238ccee8b11137bf2106b265cf5bd77360ee260dda0cb0a7a881ed06185b38c5e226f4abb05fe910047ec9d6e03c810330a2a18d5dafaf7b59bd10f196d2b3a2d303ae59832ef9ead85398f832aba8b4de11e6470bc04fb5284805a6ad351fae5c9e3d4a9b682a28c0a9fc9c9364e0f5eb43a8ef2f4543102afb35b911e905e6fcb64ca6d500151fb492ecb4c8fc1ea9f392ea14b66424c0a697021"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (92, 'silver', '{"ob": ["1d0e25427a7a7a7aa43a077cdd59bb69067e9f1a70617bbad7288bc5ffb99dc474d78bc14136865755c689e50029192a83b41fb7e1ff0961122eec465339f0214e73a38b0bae69baa20ea467bd32c29f7a3151db7116b9d9c61305aded65b8ddb35ad064543514d367fa16b2ba2057068597a815c98ff43b1f95cb2925db1a9fa732945142e1989081079a270b97b7c7fa75e63c7dba81124b3b18f3248d9f64f1c6f30afaa033ff3138697551aff9e7bb119159c6628cf473080574b4d39518d3020f9dc99fb4181db2819952efa95476a7a23f4830d49cd8fea9b4c607fe4328ffcf18d5423c003659f5a70e0abd501392ed18711a3c727f7e9c54ae71c25652e8d73ffad968a9bc5084afad480ac1fd6590563666b9824ee093e8e2c34e073218f44723e3867cb8b93f7e1efdcf4a9f89b3037727cabac592148a07340e3f89ec0ece2f9fadfd7b14317cbe5268cf61e6a8e6d617978f95e12dd26516f567c4c5ea13192b6bc097eb6b4424c39b65a8ab560875fef7db7bdc7954dfcc9f461df902677b6b4f1a5971a6b36bf65f847bc779ce9113c116"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (93, 'stone', '{"ob": ["5d3b444e37373737dd9799ddafb5acfbe2ec1ef4141c553cb1b9911fe745c62326dee2a694cb9ebff911ea62f4848aff447b33e8b0e3a7387268ca6026e0b6fe298a649013f6a120e4b3b9f894f2dab6e2d383985951463621b599a7c3e863660fb15a7e3f30d3a7ce4028a7bc8d36bc2c941b527aa073ea10a806eba2182649d1b6b3d5a2d3baa2182835bd764f3c1f2a051123f5452fbbc79b8f43835960b1d3fc70d20af5bdcf02c7892546a8971a5beeee05990978e50d3858df6e8d12fcbb6d4f8969b7e1e16e0877312a97526b6c8ddcee7bdb1632cddd68757e1f13d0f7079101a8f002bd472ee07a7416d2a87f9675c5bd75ac5f61ec0d42ca21280deeaeff62634e45383d9e9351f4edb0f0175100a600802966e698887cf99268ec8727930bf198d553e9cdb728946c0a2a1c2e8d90cda1755f4f9f687fd03ca036e8a186b0e3596debbb5503f232a36d0bb2492f55691b710068bac4a72365e9ff22c25aa71a525301a994c48d7eac873f322b36a84b8dedb939b455ce05d677a2727e96590dcd60dbee558f0212660aba0a401c30121f8b49"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (94, 'summit', '{"ob": ["5d8e4ae931313131dd9799ddafb5acfbe2ec1ef4141c553c169b8ab37c26bf564e48d0ea897a01882a7d1f7ef425d68628a6605817840b02d09b434cc5770f39f59a7fd5ee9c55c06dd521038af193b25672d2146bba59f80b6cbf269deaf3c0726ac922fb5e5e396c2f85c0d1d688c03b800d59d07040166e2c5fb5a45d7fa73f97428d9bbb26e7c93b425e345dcb21286792e80dd4f7f7d0e11f188b060467d17e19c0d25b8f8f0a3e5d4d871238f1bfdee869ec316120d85456435618bee75bfe5841c583620db34fbbba69ea7e80737f6bda02f907fd5c3c214b42336453d34fdffe28b4d95511b1adcad55bf0d0eafa4c39463c8629abe72aac540cab73e1afdec6328ceb6777b6e7e63232dad0dda12ab966df93ca693c44089079db47ce6a29003dcff2c1541765b76d5c19e283876959b46699f82e5037ec64aebf4c399e8985646fbd7cd7dab81a79b90373d929ce06d8cf7e8bf69064538ba67826cb625f11cd465efcc499bc6afd810b2fb117c78d3ef3fe82f25170211ed6da58ca43052867d3da9b7e1b81939e6e4da630208e03277d3fdc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (95, 'thunder', '{"ob": ["4fedb52b879a9a9a47618e4c0c06fb0e91ef2d983ceb049c3edacd19cbd9dff43c1a175ef41c8f5750470d4e9bd7ca00da462de202df6f8946bd55ac75c92d6b6622465a700a1d0839ff6cb86cdf80f69ab81f570113ecc61fd81b4fdb1fe1a7cf165ac1dd5a67a1d1c3df86da91a1cedda197905a05aba94ab4296c0234b648afa250cf741eb8d696e1e8a2ffaf4134c1b4031d905ab424f373640de34145a06d82f1248233e18f78a4e8a5fdeea8b7f59f54ddba053a1dff83ae748f94f5c5f3063f5b2efd898dc030c6a8c623b34d480748f0467f2b75b7c224e9148a344f9962d03afb244c4b8ee962627609d642cd15c7581a7df4653b171fe8b83fdafa4c6bb356441b3d55a49d2eb14bb82087be79cfdbe750836d1dcf100269908ee605ac6106297b969cd8cda9a41460c65eb2f8a228e887a6903d64424ec8d91fef61a303b4f7141d815715f89638613b6e253d4f499363d02b5319c1925236dcc7b987fdd78f102939aed14399475895ea15c6e0ac03e369a04adaa1d710ddead783f7806c65606bc05d7111dc85c1b1f91663af4e8b57ffeb"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (96, 'valley', '{"ob": ["ed33e9d9181818185e6350b040f1da1679dad9e94306b6844ba829f8d9422277f09f92f68bffc7e7b1f6b1c21364334c45ee42006705f545599f29613879eba39834d46520da99ee45d81cf524de955d56aab11919c71c7d17f1683ef8b14af9e1e6a8e560837d669fc1a7a746c8ff1f925458cc43e493808ef53ea483a7e80c5f03251555057a04efa1567e52786359f1ffa5a0dd4a837077b56cfac21ee68075b3f976b3ab2483e527533d7e44160c3a44cc37c94f010e9ae55eee8564a6951d27f42db78f7cf9f532289322ea4200a8bcacce8f1d9e986d4406e82918d54d0280dfe3d228781e16beb94882ae81b905190ca6c4b424d18811d1306f2d5f55979bc71210df940b3f32a8ecba06b638de4abef67563b8ce4b8489cc0a2f1ef3fbe0966eb5576bace878dd3e18d5721f9b59c1972359ed321da8e61c44c101de6627d5229d8eb0a5b0b6d64129fa65b3c04940012c4ff3233d86d8dda9c205085fb868f88f3515f205406d32ef8ca16e04852d16d59ea3b6e7038e822a6a837c0de27a742a14a9a32b19c15f01d63a8d0903b930fb50535c"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (97, 'willow', '{"ob": ["0c7e37e17e7e7e7e3a0f26f53dd7003cd450754f015d7ccd09c6cc8f3f6dec730dac94d792175ec0b56210f56e745be359c5e02d50d938364dfa73139c4f7baa575d002e27aab01947a1da8c0d50c8a3855acc546e14ee3ed7fe97b51ebfac94f04619880cb56b4b06b9d92d909ed432c8a7b82ccb8c8fc85ae529bc05359fee72cf2d3c6b3d7361a6d769b443eaf469ebd075421cfb7c3f37634becfae0057456c836b79f12e1023e2fe59b80b5790cba63d60439acd381bc4ebe220c24f99c8935d6cabb20b39fb3306597addbff63b7bde0d31f1a01996c705e3a146e07b2c08bfef589e4857619356a086feee9931e40d5865a8a21a7b38dabb4b3430ec6238c57dd48eefca358199a6bc81dc9c83e60acbb826b2aacac5a0c9207120cc1a8aca6c69eb58cba275641879d065d831e81a97f8c52e43ee43ac98d176a46a614565af80dd2b71d6bce0fbbb0ce7b3566d17e68055c5650ffe0707899c79b9ba13185065d61a6e630e85e06c843f3af0c35fb1513e15761d45238b099c5a9e3abd408402e2b78a8f2087201b14453872d0f178f03fc1fbf"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (98, 'wolf', '{"ob": ["c16a08aaaaaaaaaaa8b2c72786b44d609cacd7e35cb0555ca1b81a3386776de6a68391ba155000a8c863f8743b176c86f05703348a80eeba6a55aa38a52a98d61a6e7d643fa670905eb34cfa89bd01e98e16136e5dfcd4cde43582aa28a6d3b3dcdd3c0399fcf79f987cd6a391b3afb031166b168e8760351d8ea7f9266335b28496a167f2981f86bdfef80acf6fdf138572d5fc561f19ecfcfcdeab83d0c74eb438847a09da20a52a6ccfdef8100079312ecb149f6e813b49323f31d8728569e495d9517c32564f61e1560b1a92c08f5d3db34fe6cee08f6fd64e8f108f65808479f7682e8a42412995ef842d06e1c69ed244a94be4155af9b8e066dba03573baf95878852908e8c3d264f7bfdc28f3e7b1a2ec1f5f02df27efc975eb5a968fed30cf351e7d96f50e40e134df0e29611a4291b067aaf71ccfbf12f3757291a25732efe24563cab4357923ebc1322a7cb7dcc1b710f6550247e7537896f56f7b0a40b1581a6e5afc60c7e7bbe4aea573e3a2be394b957aee5e35f38213364279211ede50f002bfe6f887b9781fb2aae0598218157d798782"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (99, 'zero', '{"ob": ["968ca1e9e9e9e9e9f40be01731815b0b536ede9a3029ab111525d8c762aa782935c26cfdca6ecedd7c4b55d934d86931a973a9102f26e3b63715c26226fada986ce0e0c450da9043d89f18b65722710b5ffb011de5c90e2da94eda55c700e8eba85dfcd19cc81cbd41115c311298a23a13245dd0ce1951c7707f2fe383778ec5c954ceaff90aca03f934e61cd0db494984a94dc1db426da612576a2f1a3f869187bf5d1e0f1ae5dc4e39c53e29440e3bc190fda4181ac4e5d7479277fc2a6137ac44164f5b6ef76864c5d9e043c1230bdd0151acb027d0c504c21cf31bf558e64176963344c7447fba7dc2523b0ac062c7ac6bc6882d78af10b9620618688b6d767f2bcff6899e7f06373d2b2bba9c92dcc203cf4f8f8027250a0e2673b09ae51608cd5ad03d71ce3cff8c5c102dd7855d124c57dc2260cc20e834092df7af2697e838a6ad8338e6dbaddfeea0861fe8f6e8460c5841fc845726318c660aafdb4402774841f91a2b230d27d75fe0c1ec5d1cde0f96538dd4db04c1ad6fcd9725a1ecd4258eaf4cd2fdefc0bb8af5c5fb083feea8bd8190fc"]}'::jsonb::eql_v2_encrypted); -INSERT INTO ore_text(id, plaintext, e) VALUES (100, 'zinc', '{"ob": ["e2f9438888888888ca16e96d2cc6af1d91e15de322268c5444204359398c6ae210ccedfa25a4f736775690660c9f8ae542f9e9e3be4bee1ed2792c88146f6637fcaee5f4de4f6bfade337974925dd2e1609267d8dab264ed196036af6eee5cfbdf48cbd62972ba6dc708f548021fd12add36bf82dc5add4ac2fb8f3964537876c74647ed2740a23a2bfe0398aa7fb9d5b878a40d241b0d0c73e9992b162d3f8586aba4ec865d3b7274c9d3a9137f723647c03673f516eb5a9fa8f0c97d398fca0c7dfde60e7296ac306cd9f02c5ee1c09caf66212199202a1b98f30c205b8154377ca149b0977ad8f49db8c547129723b1146e0ce2b2c5da447c11da6991343476fc0d106803b0e7792b466d89b8f9a52e246cd72ec08a864883026c713f09430676deeb5fc27c0c9fe4a0aa020169934c4e405d72df8069248ba44b24efc82f6850090ff7ba035f7d033d1f1e830ff908cf14460c68f7649ed4360730599c9b48cf8f30da5e81f77a6848c813cb97febc1873214b0aaad7219c69408800546009ab3fccade6c68fc7255fa0cb750f276c9c2eb16642ab98"]}'::jsonb::eql_v2_encrypted); From 6534e05798a1b51ee958307efc6fe60f9b05e65c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 13:59:42 +1000 Subject: [PATCH 355/599] docs(v3): align eql_v3 implementation audit with 3.0.0 state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-verify the eql_v3 implementation audit against the current tree and correct drift introduced by the 3.0.0 overhaul (single self-contained installer; eql_v2 removed): - §1/§6: eql_v2 is removed, not 'the documented public API, unchanged'; reframe the ORE-comparator note as historical fork provenance. - §5: replace the 4-variant build table with the single-artifact build; re-cite build.sh and rename pin_search_path.sql -> pin_search_path_v3.sql. - §3.3: drop stale 'Supabase variant' exclusion; explain the functional- index rationale that made the subset build redundant. - §4.3: v3_ste_vec.sql is now generated/gitignored, not a committed fixture. - §2.4: fix drifted scalar_domains.rs / spec.rs line citations. De-enumerate snapshot baseline counts so they can't rot: CLAUDE.md and audit §4.2 now point at tests/sqlx/snapshots/README.md as the source of truth, and that README now documents matrix_jsonb_entry_tests.txt. --- CLAUDE.md | 2 +- tests/sqlx/snapshots/README.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 732239b8b..a0ed65ff2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,7 +30,7 @@ This project uses `mise` for task management. Common commands: - Run SQLx tests in watch mode: `mise run test:sqlx:watch` - Tests are located in `tests/sqlx/` using Rust and SQLx framework - Property-based tests for the `eql_v3` encrypted scalar domains live in three suites — **catalog** (pure-Rust catalog invariants, no DB), **fixture** (oracle over committed ciphertext), and **e2e** (oracle over fresh end-to-end encryption, gated behind the `proptest-e2e` cargo feature). The structure, the shared all-pairs oracle engine, and the conventions/footguns (e.g. why they must not live under `scalars::`) are documented in `tests/sqlx/tests/encrypted_domain/property/README.md`. -- Verify the scalar matrix coverage snapshot: `mise run test:matrix:inventory` (no database required). ONE committed `tests/sqlx/snapshots/matrix_tests.txt` baseline pins the token-normalized set of `scalars::::*` test names so a silently dropped/renamed/`#[cfg]`-gated test fails CI's `matrix-coverage` job. The task discovers the present scalar types from the test binary's `--list` and cross-checks them against `cargo run -p eql-codegen -- list-types`, so a catalog type missing its matrix wiring also fails. When you change which matrix tests the macro emits, regenerate and commit the single snapshot in the same change. See `tests/sqlx/snapshots/README.md`. +- Verify the scalar matrix coverage snapshot: `mise run test:matrix:inventory` (no database required). Committed token-normalized baselines under `tests/sqlx/snapshots/` pin the set of `scalars::::*` test names so a silently dropped/renamed/`#[cfg]`-gated test fails CI's `matrix-coverage` job. The task discovers the present scalar types from the test binary's `--list` and cross-checks them against `cargo run -p eql-codegen -- list-types`, so a catalog type missing its matrix wiring also fails. When you change which matrix tests the macro emits, regenerate and commit the affected baseline in the same change. `tests/sqlx/snapshots/README.md` is the source of truth for which baselines exist and how each is regenerated. ### Build System - Dependencies are resolved using `-- REQUIRE:` comments in SQL files diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index f94b26cfe..fc77fab90 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -149,6 +149,27 @@ catalog cross-check) fails the job. See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3 (matrix oracle + inventory snapshot). +## matrix_jsonb_entry_tests.txt + +`matrix_jsonb_entry_tests.txt` pins the test-name set for the jsonb SteVec-entry +behaviour matrix (`jsonb_entry_matrix!`), whose names live under +`jsonb_entry::…`. It is a deliberate **sibling** of the scalar matrix inventory +above, **not** folded into it: the driver type (`JsonbEntryInt4`) is intentionally +not an `eql-scalars::CATALOG` type, so it has no `scalars::::` tests and no +`eql-codegen list-types` row — hence this snapshot is checked on its own, with +**no catalog cross-check**. The matrix reuses the scalar matrix generators to +exercise `eql_v3.ste_vec_entry` equality/order/aggregate behaviour. No database +is required (`--list` only enumerates). + +Verify with `mise run test:matrix:inventory:jsonb_entry`. Regenerate with: + +```bash +cd tests/sqlx +cargo test --no-default-features --test encrypted_domain -- --list \ + | sed -n 's/: test$//p' | grep '^jsonb_entry::.*jsonb_entry_int4' \ + | sed -E 's/_int4_/__/' | LC_ALL=C sort -u > snapshots/matrix_jsonb_entry_tests.txt +``` + ## v3_jsonb_tests.txt `v3_jsonb_tests.txt` pins the SQLx test-name set for the hand-written From 678e80f436fd1b1d551c7f8fd6597e567b29c6da Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 14:48:33 +1000 Subject: [PATCH 356/599] test(eql-v3): pin ->/->> bare-literal domain-flattening; fix misleading comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `eql_v3.json` domain flattens to native `jsonb` when an operator's RHS is an unknown-typed literal, so a bare `col -> 'sel'` binds the NATIVE `jsonb -> text` (a root-key lookup on the envelope) instead of the v3 selector-lookup operator — a silent wrong answer for direct-SQL callers (the Proxy is unaffected because it always sends typed `$n`). This is intrinsic to the domain type-kind and cannot be closed by an extra operator/blocker; it can only be pinned. - Re-land v3_jsonb_bare_operand_flattens_to_native (blocker face: `?` / `||` succeed as native on a bare RHS, raise on a typed RHS), recovered from the dropped commit 817a9660. - Add v3_jsonb_arrow_bare_operand_flattens_to_native (supported-operator face): assert via pg_typeof which operator binds AND the user-visible value divergence, so a resolution change in either direction goes red. Verified empirically against PG 17 (bare `-> 'sv'` -> jsonb `[]`; typed `-> 'sv'::text` -> eql_v3.ste_vec_entry NULL). - Regenerate snapshots/v3_jsonb_tests.txt (74 -> 76) for test:v3-jsonb:inventory. - Fix the inline comment in operators.sql (integer `->` overload): it claimed a bare `e -> 'sv'` would bind the v3 operator — empirically false and contrary to the file's own @warning. Bare binds native; the custom operator does not capture an untyped literal. Comment-only, no behaviour change. --- src/v3/jsonb/operators.sql | 12 +- tests/sqlx/snapshots/v3_jsonb_tests.txt | 2 + tests/sqlx/tests/v3_jsonb_tests.rs | 153 ++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 5 deletions(-) diff --git a/src/v3/jsonb/operators.sql b/src/v3/jsonb/operators.sql index 171267608..e98ea6489 100644 --- a/src/v3/jsonb/operators.sql +++ b/src/v3/jsonb/operators.sql @@ -60,11 +60,13 @@ CREATE FUNCTION eql_v3."->"(e eql_v3.json, selector integer) AS $$ SELECT CASE WHEN eql_v3.is_ste_vec_array(e) THEN - -- NOTE: `e::jsonb` is REQUIRED. `e` is eql_v3.json and the custom - -- `->(eql_v3.json, text)` operator is already created earlier in - -- this file, so a bare `e -> 'sv'` would resolve to that selector-lookup - -- operator (searching for an sv entry with selector 'sv') instead of - -- native jsonb array access. Casting to jsonb forces native `->`. + -- NOTE: `e::jsonb` makes the native-jsonb traversal explicit. `'sv'` is an + -- unknown-typed literal, so `e -> 'sv'` already flattens `eql_v3.json` to + -- its base type and binds native `jsonb -> text` (see the @warning above) — + -- the custom `->(eql_v3.json, text)` operator does NOT capture a bare + -- untyped literal. The cast documents that intent and guards the `-> selector` + -- (integer) hop from ever resolving to the v3 `->(eql_v3.json, integer)` + -- operator instead of native array access. (eql_v3.meta_data(e) || (e::jsonb -> 'sv' -> selector))::eql_v3.ste_vec_entry ELSE NULL END diff --git a/tests/sqlx/snapshots/v3_jsonb_tests.txt b/tests/sqlx/snapshots/v3_jsonb_tests.txt index 42133d883..2664ab40e 100644 --- a/tests/sqlx/snapshots/v3_jsonb_tests.txt +++ b/tests/sqlx/snapshots/v3_jsonb_tests.txt @@ -1,9 +1,11 @@ v3_jsonb_array_length_and_elements v3_jsonb_array_length_non_array_raises v3_jsonb_arrow_accessors_supported_null +v3_jsonb_arrow_bare_operand_flattens_to_native v3_jsonb_arrow_integer_index_on_array v3_jsonb_at_at_blocker v3_jsonb_at_question_blocker +v3_jsonb_bare_operand_flattens_to_native v3_jsonb_blocked_composed_expression_raises v3_jsonb_blocker_return_types_match_native v3_jsonb_concat_blocker diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index dd1263bdc..5a370587d 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -688,6 +688,19 @@ macro_rules! v3_jsonb_supported_null { // A well-formed empty document — the non-NULL counterpart used by the blocker // arms below. +// +// Intentionally crypto-free: this is the minimal structurally-valid envelope +// (empty `i`, version literal, empty `sv`), NOT a stand-in for a generated +// fixture. It carries zero `hm`/`oc`/`ore` index terms, so the real-encrypted- +// data rule (fixtures must come from actual crypto) does not apply — there is +// nothing fabricated to pass off as a real ciphertext. The blocker and +// bare-operand tests that use it exercise PostgreSQL domain/operator resolution +// (a pure type-system property, independent of payload contents), and their +// negative-control assertions DEPEND on `sv` being empty (e.g. bare `-> 'sv'` +// must return native `[]`; typed `-> 'sv'::text` must find no entry -> NULL). +// Swapping in a populated real-fixture document would break those assertions. +// Crypto-exercising arms in this file use the generated `fixtures.v3_ste_vec` +// fixture instead (see `SEL_ROOT_HM` / `root_hm_term`). const NN_DOC: &str = r#"{"i":{},"v":2,"sv":[]}"#; v3_jsonb_supported_null!( @@ -867,6 +880,146 @@ async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Resu Ok(()) } +// D7 (negative control) — pins the domain-flattening rule that makes the typed +// RHS in `v3_jsonb_blocker_cases!` LOAD-BEARING (file header, lines 13–20). A +// BARE (unknown-typed) operand flattens `eql_v3.json` to native `jsonb`, so the +// SAME operator that RAISES with a typed RHS in D7 must SUCCEED here — resolving +// to native and returning a value, never reaching our blocker. Without this, the +// `::text` / `::jsonb` typing in D7 could silently become unnecessary (or, worse, +// a resolution change could route typed operands to native too) and no test +// would notice. See the "Typed operands" caveat in `docs/reference/json-support.md`. +#[sqlx::test] +async fn v3_jsonb_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Result<()> { + let doc = format!("'{}'::eql_v3.json", NN_DOC); + + // `?` is blocked with a typed RHS in D7 (`question`). Bare `'sv'` is unknown + // -> native `jsonb ? text` -> top-level key present -> TRUE, no raise. + let bare_question: bool = sqlx::query_scalar(&format!("SELECT {doc} ? 'sv'")) + .fetch_one(&pool) + .await?; + assert!( + bare_question, + "bare `?` must resolve to native `jsonb ? text` (top-level key 'sv' is \ + present in NN_DOC -> true); a raise would mean it reached our blocker, \ + breaking the documented domain-flattening contract" + ); + + // Same operator, TYPED RHS -> our blocker raises. Proves the divergence is + // real (this is the D7 `question` case, re-asserted here to keep the + // bare/typed contrast in one place). + eql_tests::assert_raises( + &pool, + &format!("SELECT {doc} ? 'sv'::text"), + &[], + "is not supported", + ) + .await?; + + // `||` is blocked with a typed RHS in D7 (`concat`). Bare `'{}'` is unknown + // -> native `jsonb || jsonb` -> merged object, no raise. + let bare_concat: String = sqlx::query_scalar(&format!("SELECT ({doc} || '{{}}')::text")) + .fetch_one(&pool) + .await?; + assert!( + bare_concat.contains("\"sv\""), + "bare `||` must resolve to native `jsonb || jsonb` and return the merged \ + document, got {bare_concat:?}" + ); + eql_tests::assert_raises( + &pool, + &format!("SELECT {doc} || '{{}}'::jsonb"), + &[], + "is not supported", + ) + .await?; + + Ok(()) +} + +// D7 (negative control, finding #1) — the `->`/`->>` SUPPORTED operators are the +// DANGEROUS face of domain-flattening. Unlike the blockers above (typed RHS +// RAISES, bare RHS merely succeeds-as-native), `->`/`->>` SILENTLY return a WRONG +// answer for a bare untyped selector: `doc -> 'sel'` flattens `eql_v3.json` to +// native `jsonb -> text` (a root-key lookup on the envelope), NOT the v3 +// selector-lookup operator. This pins BOTH which operator binds (`pg_typeof`) and +// the user-visible divergence, so a future resolution change in either direction +// goes red. The contract is intrinsic to the domain type-kind and CANNOT be +// closed by an extra operator/blocker (an unknown-typed RHS always reduces the +// domain to its base `jsonb`, and the native operator wins the exact-match +// tiebreak); it is mitigated only by the Proxy always sending typed `$n` +// parameters. A direct-SQL caller writing the bare form gets native semantics +// with no error. See the `@warning` in `src/v3/jsonb/operators.sql:20-28` and the +// "Typed operands" caveat in `docs/reference/json-support.md`. +#[sqlx::test] +async fn v3_jsonb_arrow_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Result<()> { + let doc = format!("'{}'::eql_v3.json", NN_DOC); + + // --- `->` : which operator binds? ------------------------------------- + // Bare selector -> NATIVE `jsonb -> text` (result type is `jsonb`). + let bare_ty: String = sqlx::query_scalar(&format!("SELECT pg_typeof({doc} -> 'sv')::text")) + .fetch_one(&pool) + .await?; + assert_eq!( + bare_ty, "jsonb", + "bare `->` must flatten to native `jsonb -> text`; binding the v3 operator \ + (eql_v3.ste_vec_entry) here would mean the domain-flattening contract changed" + ); + // Typed selector -> the v3 operator (result type is `eql_v3.ste_vec_entry`). + let typed_ty: String = + sqlx::query_scalar(&format!("SELECT pg_typeof({doc} -> 'sv'::text)::text")) + .fetch_one(&pool) + .await?; + assert_eq!( + typed_ty, "eql_v3.ste_vec_entry", + "typed `-> 'sv'::text` must bind the v3 selector-lookup operator" + ); + + // --- `->` : the user-visible WRONG answer ----------------------------- + // Native root-key lookup finds the top-level `sv` array (non-NULL `[]`); the + // v3 selector lookup finds no entry with selector 'sv' in the empty sv array + // (NULL). The bare form silently returns the envelope's raw `sv`, not an + // encrypted entry — the false-negative finding #1 documents. + let bare_val: String = sqlx::query_scalar(&format!("SELECT ({doc} -> 'sv')::text")) + .fetch_one(&pool) + .await?; + assert_eq!( + bare_val, "[]", + "bare `->` returns the native root-key lookup of `sv` (the raw envelope \ + array), demonstrating the silent wrong answer" + ); + let typed_val: Option = + sqlx::query_scalar(&format!("SELECT ({doc} -> 'sv'::text)::text")) + .fetch_one(&pool) + .await?; + assert!( + typed_val.is_none(), + "typed `-> 'sv'::text` finds no sv entry in the empty document -> NULL, \ + got {typed_val:?}" + ); + + // --- `->>` : same divergence. Both overloads return `text`, so the split is + // value-only: bare native `->>` serializes the root `sv` value + // ('[]'); typed v3 `->>` finds no entry (NULL). + let bare_text: Option = sqlx::query_scalar(&format!("SELECT {doc} ->> 'sv'")) + .fetch_one(&pool) + .await?; + assert_eq!( + bare_text.as_deref(), + Some("[]"), + "bare `->>` must resolve to native `jsonb ->> text` and serialize the root \ + `sv` value" + ); + let typed_text: Option = sqlx::query_scalar(&format!("SELECT {doc} ->> 'sv'::text")) + .fetch_one(&pool) + .await?; + assert!( + typed_text.is_none(), + "typed `->> 'sv'::text` finds no sv entry -> NULL, got {typed_text:?}" + ); + + Ok(()) +} + // ============================================================================ // D9 — Payload-CHECK per domain. Malformed payloads are rejected by the domain // CHECK (error contains "violates check constraint"). From f5683825e5192b2cc9db106e351ff7307657bcf1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 23 Jun 2026 17:13:10 +1000 Subject: [PATCH 357/599] feat(eql_v3): reject empty ORE term (ob: []) at the domain boundary Encrypting the empty string "" as ordered text produces an empty ORE term (ob: []) -- the only value that does. The ORE-bearing eql_v3 domains (_ord / _ord_ore, and text _search) now carry a CHECK requiring ob to be a non-empty array, so casting or inserting an empty-ob payload into an ordered column fails loudly with a check violation (23514) rather than producing an unorderable row. The rule lives where term behaviour belongs (CLAUDE.md): a typed per-term property Term::nonempty_array_key (Ore => "ob"), collected by Term::nonempty_array_keys symmetric to term_json_keys, with unit tests. DomainBlock derives nonempty_array_keys from the domain's terms exactly like keys, and the types.sql.j2 template renders a non-empty-array CHECK per key generically -- no hardcoded ob, no ORE concept leaking into the codegen-context or template layers. Storage / equality / match / bool domains are unaffected; fixed-width scalars never produce an empty ob, so the clause is a structural invariant that is a no-op for them. The comparator's "empty sorts first" cardinality guard (02ab24be) is retained as defense-in-depth for any path that bypasses the domain (e.g. a composite built directly). - crates/eql-scalars: Term::nonempty_array_key{,s} + tests. - crates/eql-codegen: DomainBlock.nonempty_array_keys + template clause + unit test pinning the constraint to ORE-bearing domains only. - tests/codegen/reference/*/*_types.sql regenerated. - Rewrote v3_text_empty_order_tests -> v3_text_empty_constraint_tests: empty "" rejected on text_ord/text_ord_ore; controls accepted/ordered. - CHANGELOG + adding-a-scalar docs updated. Refs: #262 --- CHANGELOG.md | 2 +- crates/eql-codegen/src/context.rs | 11 +++ crates/eql-codegen/src/generate.rs | 31 +++++++ crates/eql-codegen/templates/types.sql.j2 | 4 + crates/eql-scalars/src/term.rs | 21 +++++ crates/eql-scalars/src/tests.rs | 20 +++++ .../adding-a-scalar-encrypted-domain-type.md | 10 +++ tests/codegen/reference/date/date_types.sql | 4 + .../codegen/reference/float4/float4_types.sql | 4 + .../codegen/reference/float8/float8_types.sql | 4 + tests/codegen/reference/int2/int2_types.sql | 4 + tests/codegen/reference/int4/int4_types.sql | 4 + tests/codegen/reference/int8/int8_types.sql | 4 + .../reference/numeric/numeric_types.sql | 4 + tests/codegen/reference/text/text_types.sql | 6 ++ .../timestamptz/timestamptz_types.sql | 4 + tests/sqlx/src/fixtures/v3_text_empty.rs | 25 +++--- .../tests/v3_text_empty_constraint_tests.rs | 87 +++++++++++++++++++ tests/sqlx/tests/v3_text_empty_order_tests.rs | 86 ------------------ 19 files changed, 238 insertions(+), 97 deletions(-) create mode 100644 tests/sqlx/tests/v3_text_empty_constraint_tests.rs delete mode 100644 tests/sqlx/tests/v3_text_empty_order_tests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aeb6ebb9..79d0922f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,7 +50,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamptz` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) -- **An empty-string (`""`) value in an `eql_v3` ordered-text column no longer corrupts ordered queries — it now sorts first.** Encrypting `""` as ordered text produces an empty ORE term (`ob: []`); previously the `eql_v3.ore_block_256` extractor collapsed that to NULL index terms, so the comparator returned NULL and an empty-text row silently dropped out of `ORDER BY`, was wrongly returned by `eql_v3.max`, and threw off range-query counts. The empty term now yields a zero-term composite that the comparator orders **before** every non-empty value (empty sorts first), so an `""` row sorts deterministically at the low end of `text_ord` / `text_ord_ore` instead of vanishing. Storage and equality are unaffected — `""` always had a real ciphertext (`c`) and HMAC (`hm`), so it stays decryptable and `=` / `<>`-comparable; only its ordering was undefined. A genuine SQL `NULL` row is unchanged and keeps standard `NULLS FIRST` / `NULLS LAST` semantics (the extractor is `STRICT`). ([#262](https://github.com/cipherstash/encrypt-query-language/issues/262)) +- **An empty ORE term (`ob: []`) is now rejected by the ORE-bearing `eql_v3` domains instead of silently corrupting ordered queries.** Encrypting the empty string `""` as ordered text produces an empty ORE term (`ob: []`) — the only value that does — and previously an `""` row silently dropped out of `ORDER BY`, was wrongly returned by `eql_v3.max`, and threw off range-query counts (the `eql_v3.ore_block_256` extractor collapsed `ob: []` to NULL index terms). The ORE-bearing domains (`_ord` / `_ord_ore`, and text `_search`) now carry a `CHECK` requiring `ob` to be a non-empty array, so casting or inserting an empty-`ob` payload into an ordered column fails loudly with a check violation (SQLSTATE `23514`) rather than producing an unorderable row. This affects only the empty string in an ordered column: every non-empty string and every fixed-width scalar (int / date / numeric / float) always produces a non-empty `ob`. Storage and equality are unaffected — `""` can still be encrypted into a storage-only (`eql_v3.text`) or equality (`eql_v3.text_eq`) column with a real ciphertext (`c`) and HMAC (`hm`). As defense-in-depth for any path that bypasses the domain (e.g. a comparator composite built directly), the comparator also orders a zero-term ORE composite before every non-empty value (empty sorts first); a genuine SQL `NULL` row is unchanged and keeps standard `NULLS FIRST` / `NULLS LAST` semantics (the extractor is `STRICT`). ([#262](https://github.com/cipherstash/encrypt-query-language/issues/262)) ## [2.3.1] — 2026-05-21 diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index d5b928f32..1413a5e5b 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -59,6 +59,11 @@ pub struct DomainBlock { pub typname: String, // sql_str-escaped bare name, e.g. int4_ord_ore pub name: String, // raw bare name (unescaped), e.g. int4_ord_ore pub keys: Vec, // ordered, sql_str-escaped key tokens (envelope + ciphertext + term keys) + // sql_str-escaped keys whose payload must be a non-empty array (the ORE term + // `ob`). Derived from the domain's terms exactly like `keys`, so the template + // stays term-agnostic — it renders a non-empty-array CHECK per key without + // hardcoding `ob`. Empty for non-ORE domains. See issue #262. + pub nonempty_array_keys: Vec, } #[derive(serde::Serialize)] @@ -83,6 +88,12 @@ pub fn domain_block(token: &str, domain: &DomainSpec) -> DomainBlock { typname: sql_str(&name), name, keys, + // Derived from the terms the same way `keys` is — the rule lives on + // `Term::nonempty_array_key`, not here. + nonempty_array_keys: Term::nonempty_array_keys(domain.terms) + .into_iter() + .map(sql_str) + .collect(), } } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 49af8967d..f6402029a 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -432,6 +432,37 @@ mod tests { } } + /// The non-empty-`ob` CHECK (issue #262) is emitted only on ORE-bearing + /// domains. An empty ORE term (`ob: []`) is what encrypting the empty string + /// into an ordered column produces; the constraint rejects it at the domain + /// boundary. Storage-only (`int4`) and equality-only (`int4_eq`) domains carry + /// no `ob`, so they must NOT gain the clause. + #[test] + fn ore_bearing_domains_reject_empty_ob() { + // Per-domain assertion: a domain's CREATE block carries the clause iff it + // is ORE-bearing. Slice each domain's CHECK out of the rendered file so a + // clause on the wrong domain cannot pass via whole-file `contains`. + let sql = render_types_file(spec("int4")); + let clause = "jsonb_array_length(VALUE -> 'ob') > 0"; + for (dom, expected) in [ + ("int4", false), + ("int4_eq", false), + ("int4_ord", true), + ("int4_ord_ore", true), + ] { + let head = format!("CREATE DOMAIN eql_v3.{dom} AS jsonb"); + let start = sql.find(&head).unwrap_or_else(|| panic!("missing {dom}")); + // The CHECK ends at the closing `);` of this CREATE DOMAIN block. + let end = start + sql[start..].find(");").expect("unterminated CHECK"); + let block = &sql[start..end]; + assert_eq!( + block.contains(clause), + expected, + "domain {dom}: expected non-empty-ob CHECK present={expected}", + ); + } + } + #[test] fn storage_functions_file_is_all_blockers() { let s = spec("int4"); diff --git a/crates/eql-codegen/templates/types.sql.j2 b/crates/eql-codegen/templates/types.sql.j2 index f46f66164..b6deb4bde 100644 --- a/crates/eql-codegen/templates/types.sql.j2 +++ b/crates/eql-codegen/templates/types.sql.j2 @@ -18,6 +18,10 @@ BEGIN {%- for k in d.keys %} AND VALUE ? '{{ k }}' {%- endfor %} + {%- for k in d.nonempty_array_keys %} + AND jsonb_typeof(VALUE -> '{{ k }}') = 'array' + AND jsonb_array_length(VALUE -> '{{ k }}') > 0 + {%- endfor %} AND VALUE->>'v' = '2' ); END IF; diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-scalars/src/term.rs index 5db834b8f..3b4a0ce61 100644 --- a/crates/eql-scalars/src/term.rs +++ b/crates/eql-scalars/src/term.rs @@ -71,6 +71,20 @@ impl Term { pub const fn provides_ordering(self) -> bool { matches!(self, Term::Ore) } + + /// JSON key whose payload must be a NON-EMPTY array for this term to be + /// well-formed, or `None` if the term imposes no such structural rule. The + /// ORE term (`ob`) is an array of block terms; an empty array (`ob: []`) is + /// only ever produced by encrypting the empty string into an ordered column, + /// and the domain CHECK rejects it at the boundary rather than ordering it + /// (issue #262). A new array-backed term opts in here, so the domain CHECK + /// never hardcodes a single key. + pub const fn nonempty_array_key(self) -> Option<&'static str> { + match self { + Term::Ore => Some(self.json_key()), + Term::Hm | Term::Bloom => None, + } + } } impl Term { @@ -96,6 +110,13 @@ impl Term { Self::dedupe_preserving_order(terms.iter().map(|t| t.json_key())) } + /// JSON keys whose payload must be a non-empty array across these terms + /// (deduped, in order). Symmetric to [`Term::term_json_keys`]; drives the + /// domain CHECK's non-empty-array clauses. See [`Term::nonempty_array_key`]. + pub fn nonempty_array_keys(terms: &[Term]) -> Vec<&'static str> { + Self::dedupe_preserving_order(terms.iter().filter_map(|t| t.nonempty_array_key())) + } + /// Distinct extractor-bearing terms, first occurrence per extractor wins. /// Two terms sharing an extractor collapse to the first, since the generated /// `eq_term`/`ord_term`/`match_term` function is emitted once per extractor. diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-scalars/src/tests.rs index 44559d56e..8b8da8e18 100644 --- a/crates/eql-scalars/src/tests.rs +++ b/crates/eql-scalars/src/tests.rs @@ -307,6 +307,26 @@ mod term_helper_tests { assert!(Term::term_json_keys(&[]).is_empty()); } + #[test] + fn nonempty_array_key_is_ob_only_for_ore() { + assert_eq!(Term::Ore.nonempty_array_key(), Some("ob")); + assert_eq!(Term::Hm.nonempty_array_key(), None); + assert_eq!(Term::Bloom.nonempty_array_key(), None); + } + + #[test] + fn nonempty_array_keys_collects_only_ore() { + // text_search-shaped term set: only the ORE term contributes a key. + assert_eq!( + Term::nonempty_array_keys(&[Term::Hm, Term::Ore, Term::Bloom]), + vec!["ob"] + ); + // No ORE term => no non-empty-array CHECK. + assert!(Term::nonempty_array_keys(&[Term::Hm]).is_empty()); + assert!(Term::nonempty_array_keys(&[Term::Bloom]).is_empty()); + assert!(Term::nonempty_array_keys(&[]).is_empty()); + } + #[test] fn requires_are_deduplicated_in_order() { assert_eq!( diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 7671e3569..e29ac7c2b 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -135,6 +135,16 @@ enum's `impl` methods (`json_key`, `extractor`, `ctor`, `role`, `operators`, `requires`) with matching `#[test]`s (`term_tests` / `term_helper_tests`) — never a free-form catalog field. +**Non-empty `ob` invariant (ORE-bearing domains).** Any domain whose terms +include `Term::Ore` (`_ord` / `_ord_ore`, and text `_search`) automatically +emits an extra `CHECK` requiring `ob` to be a non-empty array +(`jsonb_array_length(VALUE -> 'ob') > 0`). An empty ORE term (`ob: []`) is only +ever produced by encrypting the empty string into an ordered column, and is +rejected at the boundary rather than ordered (issue #262). This is emitted from +the catalog by the codegen renderer (`DomainBlock::ore_check` in +`crates/eql-codegen/src/context.rs`, gated on `Term::provides_ordering`), not +hand-added — a new ordered scalar gets it for free. + **Twins.** `int4_ord` and `int4_ord_ore` both carry `&[Term::Ore]`. The generator emits them as independent domains with byte-identical SQL modulo type name (`ordered_files_byte_identical_modulo_typename`). Twins let callers choose diff --git a/tests/codegen/reference/date/date_types.sql b/tests/codegen/reference/date/date_types.sql index 97a416d53..7c24b03fd 100644 --- a/tests/codegen/reference/date/date_types.sql +++ b/tests/codegen/reference/date/date_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/float4/float4_types.sql b/tests/codegen/reference/float4/float4_types.sql index 56ef6e7b7..960201723 100644 --- a/tests/codegen/reference/float4/float4_types.sql +++ b/tests/codegen/reference/float4/float4_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/float8/float8_types.sql b/tests/codegen/reference/float8/float8_types.sql index 8ff718e58..d85a79c03 100644 --- a/tests/codegen/reference/float8/float8_types.sql +++ b/tests/codegen/reference/float8/float8_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/int2/int2_types.sql b/tests/codegen/reference/int2/int2_types.sql index ee11a9610..997d61351 100644 --- a/tests/codegen/reference/int2/int2_types.sql +++ b/tests/codegen/reference/int2/int2_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/int4/int4_types.sql b/tests/codegen/reference/int4/int4_types.sql index 01082ea27..3436a3d4f 100644 --- a/tests/codegen/reference/int4/int4_types.sql +++ b/tests/codegen/reference/int4/int4_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/int8/int8_types.sql b/tests/codegen/reference/int8/int8_types.sql index 321ff3403..f27bf4afd 100644 --- a/tests/codegen/reference/int8/int8_types.sql +++ b/tests/codegen/reference/int8/int8_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/numeric/numeric_types.sql b/tests/codegen/reference/numeric/numeric_types.sql index 6c9b85d39..334aa5b97 100644 --- a/tests/codegen/reference/numeric/numeric_types.sql +++ b/tests/codegen/reference/numeric/numeric_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/text/text_types.sql b/tests/codegen/reference/text/text_types.sql index c7bde459c..26bc4a940 100644 --- a/tests/codegen/reference/text/text_types.sql +++ b/tests/codegen/reference/text/text_types.sql @@ -67,6 +67,8 @@ BEGIN AND VALUE ? 'c' AND VALUE ? 'hm' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -84,6 +86,8 @@ BEGIN AND VALUE ? 'c' AND VALUE ? 'hm' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -102,6 +106,8 @@ BEGIN AND VALUE ? 'hm' AND VALUE ? 'ob' AND VALUE ? 'bf' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/codegen/reference/timestamptz/timestamptz_types.sql b/tests/codegen/reference/timestamptz/timestamptz_types.sql index 38930d167..8f2f9cda8 100644 --- a/tests/codegen/reference/timestamptz/timestamptz_types.sql +++ b/tests/codegen/reference/timestamptz/timestamptz_types.sql @@ -50,6 +50,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; @@ -66,6 +68,8 @@ BEGIN AND VALUE ? 'i' AND VALUE ? 'c' AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 AND VALUE->>'v' = '2' ); END IF; diff --git a/tests/sqlx/src/fixtures/v3_text_empty.rs b/tests/sqlx/src/fixtures/v3_text_empty.rs index 9091cd235..b15fcb63c 100644 --- a/tests/sqlx/src/fixtures/v3_text_empty.rs +++ b/tests/sqlx/src/fixtures/v3_text_empty.rs @@ -3,15 +3,20 @@ //! //! Hand-written, non-catalog (like `v3_numeric_collision`), because the //! catalog-driven `eql_v2_text` fixture deliberately EXCLUDES `""`: encrypting -//! the empty string yields an empty ORE term (`ob: []`) whose ordering was -//! undefined (issue #262), so `eql-scalars::TEXT_FIXTURES` drops it. This -//! bespoke fixture is the one place `""` can live, giving the end-to-end -//! "empty sorts first" contract (ORDER BY / min / max) a real-ciphertext home. +//! the empty string yields an empty ORE term (`ob: []`), the only value that +//! does, so `eql-scalars::TEXT_FIXTURES` drops it. This bespoke fixture is the +//! one place a real-ciphertext empty-`ob` payload lives — its purpose is to +//! prove the ORE-bearing domains REJECT that payload at their non-empty-`ob` +//! CHECK (issue #262, SQLSTATE `23514`), while the non-empty controls cast and +//! order cleanly. See `tests/v3_text_empty_constraint_tests.rs`. +//! +//! The committed `payload` column is plain `jsonb`, so all three rows load; the +//! rejection happens when a test casts the `id = 1` row to `eql_v3.text_ord` / +//! `eql_v3.text_ord_ore`, not at fixture load. //! //! Rows are addressed by `id` (1-based insertion ordinal): `"" → 1`, -//! `"frank" → 2`, `"zebra" → 3`. The contract under test: `""` sorts BEFORE -//! both non-empty values, so `eql_v3.min` returns the `id = 1` (`""`) payload -//! and `eql_v3.max` returns the `id = 3` (`"zebra"`) payload. +//! `"frank" → 2`, `"zebra" → 3`. The two non-empty controls are strictly +//! ordered (`"frank" < "zebra"`) so ordering of real values stays unambiguous. //! //! Gitignored output: tests/sqlx/fixtures/v3_text_empty.sql //! (regenerated by `mise run fixture:generate:all`). @@ -27,8 +32,8 @@ const NAME: &str = "v3_text_empty"; /// The fixture plaintexts, in insertion order. `id` is the 1-based ordinal, so /// `"" → 1`, `"frank" → 2`, `"zebra" → 3`. The empty string is the value with -/// no ORE term; the two non-empty controls prove `min`/`max`/ORDER BY return -/// real values around it (not a degenerate everything-collides). +/// the empty ORE term (`ob: []`) that the domain CHECK rejects; the two +/// non-empty controls carry real ORE terms that cast and order cleanly. fn values() -> Vec { ["", "frank", "zebra"] .iter() @@ -62,7 +67,7 @@ mod tests { !v[1].is_empty() && !v[2].is_empty(), "controls are non-empty" ); - // The controls are strictly ordered so max is unambiguous. + // The controls are strictly ordered so ordering is unambiguous. assert!(v[1] < v[2], "\"frank\" must order before \"zebra\""); } } diff --git a/tests/sqlx/tests/v3_text_empty_constraint_tests.rs b/tests/sqlx/tests/v3_text_empty_constraint_tests.rs new file mode 100644 index 000000000..47dbff2e2 --- /dev/null +++ b/tests/sqlx/tests/v3_text_empty_constraint_tests.rs @@ -0,0 +1,87 @@ +//! End-to-end "empty ORE term is rejected" contract for the ORE-bearing +//! `eql_v3` text domains (issue #262). +//! +//! Encrypting the empty string `""` as ordered text produces an empty ORE term +//! (`ob: []`, verified against cipherstash-client) — the only value that does. +//! Rather than ordering such a degenerate term, the ORE-bearing domains reject +//! it at the boundary: their `CHECK` requires `ob` to be a non-empty array, so +//! casting an empty-`ob` payload to `eql_v3.text_ord` / `eql_v3.text_ord_ore` +//! fails with a check violation (SQLSTATE `23514`). The comparator's +//! "empty sorts first" cardinality guard remains in place as defense-in-depth +//! for any path that bypasses the domain (e.g. a composite built directly). +//! +//! These tests ride the committed `v3_text_empty` fixture (real ciphertexts for +//! `""`, `"frank"`, `"zebra"`; ids 1/2/3). The fixture's `payload` column is +//! plain `jsonb`, so every row loads; the rejection happens at the cast in each +//! test, not at fixture load. The fixture carries `hm` + `ob` (Unique + Ore, no +//! bloom), so it exercises `text_ord` and `text_ord_ore` — not `text_search`, +//! which additionally requires a `bf` key the fixture does not emit. + +use anyhow::Result; +use eql_tests::assert_db_error; +use sqlx::PgPool; + +/// Casting the empty-string row (`id = 1`, `ob: []`) to `eql_v3.text_ord` is +/// rejected by the domain's non-empty-`ob` CHECK. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn empty_string_rejected_by_text_ord(pool: PgPool) -> Result<()> { + let err = + sqlx::query("SELECT payload::eql_v3.text_ord FROM fixtures.v3_text_empty WHERE id = 1") + .fetch_all(&pool) + .await + .expect_err("empty ORE term (ob: []) must violate the text_ord CHECK"); + // Auto-generated domain constraint name is not pinned — only the SQLSTATE. + assert_db_error(&err, "23514", None); + Ok(()) +} + +/// Same rejection for the `eql_v3.text_ord_ore` domain. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn empty_string_rejected_by_text_ord_ore(pool: PgPool) -> Result<()> { + let err = + sqlx::query("SELECT payload::eql_v3.text_ord_ore FROM fixtures.v3_text_empty WHERE id = 1") + .fetch_all(&pool) + .await + .expect_err("empty ORE term (ob: []) must violate the text_ord_ore CHECK"); + assert_db_error(&err, "23514", None); + Ok(()) +} + +/// The non-empty controls (`"frank"`, `"zebra"`) carry a real `ob` array, so +/// they cast cleanly into `eql_v3.text_ord` — the CHECK only rejects the empty +/// term, not ordered text in general. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn non_empty_controls_accepted_by_text_ord(pool: PgPool) -> Result<()> { + let plaintexts: Vec = sqlx::query_scalar( + "SELECT plaintext FROM fixtures.v3_text_empty \ + WHERE id IN (2, 3) AND payload::eql_v3.text_ord IS NOT NULL \ + ORDER BY id", + ) + .fetch_all(&pool) + .await?; + assert_eq!( + plaintexts, + vec!["frank".to_string(), "zebra".to_string()], + "non-empty ordered text must cast cleanly into text_ord" + ); + Ok(()) +} + +/// The controls also order correctly via `ord_term` once cast — the CHECK does +/// not disturb ordering of real values. +#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] +async fn non_empty_controls_order_under_text_ord(pool: PgPool) -> Result<()> { + let plaintexts: Vec = sqlx::query_scalar( + "SELECT plaintext FROM fixtures.v3_text_empty \ + WHERE id IN (2, 3) \ + ORDER BY eql_v3.ord_term(payload::eql_v3.text_ord) ASC", + ) + .fetch_all(&pool) + .await?; + assert_eq!( + plaintexts, + vec!["frank".to_string(), "zebra".to_string()], + "frank must order before zebra" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/v3_text_empty_order_tests.rs b/tests/sqlx/tests/v3_text_empty_order_tests.rs deleted file mode 100644 index b9d8a9d3f..000000000 --- a/tests/sqlx/tests/v3_text_empty_order_tests.rs +++ /dev/null @@ -1,86 +0,0 @@ -//! End-to-end "empty sorts first" contract for `eql_v3.text_ord` (issue #262). -//! -//! Encrypting the empty string `""` as ordered text produces an empty ORE term -//! (`ob: []`, verified against cipherstash-client). Previously that collapsed to -//! NULL comparator output, so an empty-text row silently dropped out of ordered -//! queries (`ORDER BY` lost it, `max` wrongly returned it, counts went off by -//! one). The fix gives the empty term a deterministic position — it sorts BEFORE -//! every non-empty value — by yielding a zero-term composite the comparator's -//! cardinality guard orders first. -//! -//! These tests ride the committed `v3_text_empty` fixture (real ciphertexts for -//! `""`, `"frank"`, `"zebra"`; ids 1/2/3) and exercise the full user-facing -//! surface: `ORDER BY` (ASC/DESC) and the `min`/`max` aggregates over the -//! `text_ord` domain. The ordering key is the canonical -//! `eql_v3.ord_term((payload)::eql_v3.text_ord)`, matching the scalar matrix. - -use anyhow::Result; -use sqlx::PgPool; - -/// `ORDER BY` ascending must place `""` first, then the non-empty values in -/// lexical order. Before the fix the `""` row produced a NULL sort key and -/// dropped out of the result entirely. -#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] -async fn order_by_asc_sorts_empty_first(pool: PgPool) -> Result<()> { - let actual: Vec = sqlx::query_scalar( - "SELECT plaintext FROM fixtures.v3_text_empty \ - ORDER BY eql_v3.ord_term((payload)::eql_v3.text_ord) ASC", - ) - .fetch_all(&pool) - .await?; - assert_eq!( - actual, - vec!["".to_string(), "frank".to_string(), "zebra".to_string()], - "empty string must sort first under ASC, then frank, then zebra" - ); - Ok(()) -} - -/// `ORDER BY` descending mirrors it: `""` lands last (it is the minimum). -#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] -async fn order_by_desc_sorts_empty_last(pool: PgPool) -> Result<()> { - let actual: Vec = sqlx::query_scalar( - "SELECT plaintext FROM fixtures.v3_text_empty \ - ORDER BY eql_v3.ord_term((payload)::eql_v3.text_ord) DESC", - ) - .fetch_all(&pool) - .await?; - assert_eq!( - actual, - vec!["zebra".to_string(), "frank".to_string(), "".to_string()], - "empty string must sort last under DESC" - ); - Ok(()) -} - -/// `eql_v3.min` over `text_ord` must return the `""` payload (the minimum), -/// recovered to its plaintext via the fixture's `payload` column. -#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] -async fn min_returns_the_empty_string(pool: PgPool) -> Result<()> { - let plaintext: String = sqlx::query_scalar( - "SELECT plaintext FROM fixtures.v3_text_empty WHERE payload = (\ - SELECT eql_v3.min(payload::eql_v3.text_ord)::jsonb FROM fixtures.v3_text_empty)", - ) - .fetch_one(&pool) - .await?; - assert_eq!(plaintext, "", "min over text_ord must be the empty string"); - Ok(()) -} - -/// `eql_v3.max` must return the largest real value (`"zebra"`), NOT the empty -/// string. Before the fix `max` wrongly returned the `""` payload because the -/// NULL comparison never displaced the empty state. -#[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] -async fn max_returns_the_largest_value_not_empty(pool: PgPool) -> Result<()> { - let plaintext: String = sqlx::query_scalar( - "SELECT plaintext FROM fixtures.v3_text_empty WHERE payload = (\ - SELECT eql_v3.max(payload::eql_v3.text_ord)::jsonb FROM fixtures.v3_text_empty)", - ) - .fetch_one(&pool) - .await?; - assert_eq!( - plaintext, "zebra", - "max over text_ord must be the largest real value, not the empty string" - ); - Ok(()) -} From 8e2a05d5b385728ebccebada138ed0d79085969c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 10:01:53 +1000 Subject: [PATCH 358/599] test(v3): add atomic regen task for the four scalar matrix snapshots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The four scalar-matrix shape snapshots in tests/sqlx/snapshots/ are not independent — eq-only is derived from the ordered baseline — and were regenerated by four separate hand-run commands. A macro change touching every shape could update 3 of 4 and silently drift the fourth, exactly how the storage-only snapshot drifted in #300 when a count_distinct dispatch arm switched to a runtime early-return. Add test:matrix:snapshots:regen, which lists the encrypted_domain binary once and rewrites all four shapes (ordered, eq-only, text, storage-only) in dependency order. Point snapshots/README.md at the single command. The inventory gate (test:matrix:inventory) is unchanged and remains the validator; CI still checks via git diff. Regen is deterministic — on the current branch it reproduces the committed snapshots byte-for-byte. Closes #300. --- mise.toml | 64 ++++++++++++++++++++++++++++++++++ tests/sqlx/snapshots/README.md | 30 ++++++++++++---- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/mise.toml b/mise.toml index a58713662..b2ceb14eb 100644 --- a/mise.toml +++ b/mise.toml @@ -377,6 +377,70 @@ fi echo "Matrix inventory OK: ${checked} type(s) match the canonical snapshot, its derived eq-only subset, the committed text superset, or the storage-only set; catalog reconciled." """ +[tasks."test:matrix:snapshots:regen"] +description = "Regenerate ALL FOUR scalar matrix shape snapshots atomically (ordered, eq-only, text, storage-only) from one binary listing" +dir = "{{config_root}}/tests/sqlx" +run = """ +#!/usr/bin/env bash +# Atomic regeneration of the four committed scalar-matrix shape snapshots, so a +# macro change that touches every shape can't silently drift the one snapshot the +# author forgets. (Issue #300: the storage-only snapshot drifted when a +# count_distinct dispatch arm switched to a runtime early-return and began +# emitting for the storage shape too — a change that regenerated 3 of 4 snapshots +# by hand and missed the fourth.) The four shapes are NOT independent: eq-only is +# DERIVED from the ordered baseline, so regenerating them one at a time off stale +# inputs is the footgun. This task lists the encrypted_domain binary ONCE and +# rewrites all four in dependency order. +# +# Drivers (one representative type per shape; the inventory gate then asserts +# every type of that shape matches the snapshot after normalization): +# ordered → scalars::int4:: (caps = [eq, ord]) +# text → scalars::text:: (caps = [eq, ord, search]; superset of ordered) +# storage-only → scalars::bool:: (caps = [storage]; term-less surface arms) +# eq-only → DERIVED from the ordered baseline (minus _ord/order_by/routes_through_ob) +# +# Out of scope by design: the sibling snapshots matrix_jsonb_entry_tests.txt and +# v3_jsonb_tests.txt (driven by non-CATALOG types; regenerated by their own +# documented recipes in snapshots/README.md). This task is the scalar-matrix +# four-shape set only. +# +# This task only WRITES the snapshots; `mise run test:matrix:inventory` is the +# gate that validates them. After regen, run the inventory task and commit any +# changed snapshot. `--no-default-features` and `LC_ALL=C sort` match the +# inventory's determinism; no database is required. +set -euo pipefail + +# Stub generated fixtures on a bare / no-creds worktree (see test:matrix:inventory), +# then compile + list ONCE. Harmless when real fixtures exist. +EQL_ROOT="{{config_root}}" +source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" +listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') + +# Ordered baseline (canonical) — written first because the eq-only shape is +# DERIVED from it below. +printf '%s\\n' "$listing" | grep '^scalars::int4::' \ + | sed -e 's/^scalars::int4::/scalars::::/' -e 's/_int4_/__/g' \ + | LC_ALL=C sort > snapshots/matrix_tests.txt + +# Eq-only shape: DERIVED from the freshly-regenerated ordered baseline (the +# inventory gate re-derives and pins this exact relationship). +grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt \ + | LC_ALL=C sort -u > snapshots/matrix_tests_eq_only.txt + +# Text shape: SUPERSET of ordered, from its own driver type. +printf '%s\\n' "$listing" | grep '^scalars::text::' \ + | sed -e 's/^scalars::text::/scalars::::/' -e 's/_text_/__/g' \ + | LC_ALL=C sort > snapshots/matrix_tests_text.txt + +# Storage-only shape: term-less surface arms only, from its own driver type. +printf '%s\\n' "$listing" | grep '^scalars::bool::' \ + | sed -e 's/^scalars::bool::/scalars::::/' -e 's/_bool_/__/g' \ + | LC_ALL=C sort > snapshots/matrix_tests_storage_only.txt + +echo "Regenerated 4 scalar matrix snapshots (ordered, eq-only, text, storage-only)." +echo "Run 'mise run test:matrix:inventory' to validate, then commit any changes." +""" + [tasks."test:matrix:inventory:jsonb_entry"] description = "Verify jsonb-entry matrix test-name set against its own snapshot (no scalar catalog cross-check)" dir = "{{config_root}}/tests/sqlx" diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index fc77fab90..52ae0d286 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -9,6 +9,24 @@ token-normalized list of every `scalars::::*` test name in the **committed test baselines**, not gitignored generated SQL — keep them in version control. +**Regenerating: use the one atomic command.** The four scalar shapes are not +independent — eq-only is *derived* from the ordered baseline — so regenerating +them one at a time off stale inputs is how a shape silently drifts (see issue +#300). Regenerate all four at once with: + +```bash +mise run test:matrix:snapshots:regen +``` + +It lists the `encrypted_domain` binary once and rewrites `matrix_tests.txt`, +`matrix_tests_eq_only.txt`, `matrix_tests_text.txt`, and +`matrix_tests_storage_only.txt` in dependency order, then validate with +`mise run test:matrix:inventory` and commit any changes. The per-shape `grep`/`sed` +recipes below document what that task does for each shape (and how the inventory +gate re-derives them); prefer the single command over running them by hand. The +two sibling snapshots (`matrix_jsonb_entry_tests.txt`, `v3_jsonb_tests.txt`) are +**not** covered by it — they have their own recipes lower down. + The per-type `_matrix_tests.txt` files are gone. They were byte-identical modulo the type token (the matrix tests are macro-generated from one `scalar_matrix!` invocation per type with no per-type variation), so a @@ -138,13 +156,13 @@ catalog cross-check) fails the job. first such type, commit that snapshot. The cross-check confirms the type is wired. - **Removing a scalar type** → remove the catalog row and its matrix wiring; the cross-check then sees the type gone from both sides. -- **Changing which matrix tests the macro emits** → regenerate and commit - `matrix_tests.txt` in the same change: +- **Changing which matrix tests the macro emits** → regenerate and commit **all + affected shape snapshots** in the same change. A macro change can touch more + than one shape at once (issue #300: a dispatch arm that began emitting for the + storage-only shape too), so regenerate them atomically rather than by hand: ```bash - cd tests/sqlx - cargo test --no-default-features --test encrypted_domain -- --list \ - | sed -n 's/: test$//p' | grep '^scalars::int4::' \ - | sed -e 's/^scalars::int4::/scalars::::/' -e 's/_int4_/__/g' | LC_ALL=C sort > snapshots/matrix_tests.txt + mise run test:matrix:snapshots:regen # rewrites all four shapes from one listing + mise run test:matrix:inventory # validate, then commit any changed snapshot ``` See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3 (matrix oracle + inventory snapshot). From 707c8833c941a8b4a1dbcb5f7401f8820322dbec Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 11:34:41 +1000 Subject: [PATCH 359/599] test(v3): stage matrix snapshot regen in a temp dir before moving into place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CodeRabbit flagged that writing snapshots/ directly is unsafe: the '>' redirect truncates the committed file before the pipeline's grep runs, so a driver type whose matrix arms vanished would leave a truncated baseline behind — defeating the task's atomicity guarantee. Build all four shapes into a mktemp dir, assert each is non-empty, then mv them into place together, so any failure leaves the committed snapshots untouched. Add an explicit non-empty guard on the test listing for an early, clear message. Avoid a competing EXIT trap (stub-fixtures.sh owns it) by removing the temp dir explicitly. Verified: regen reproduces the four snapshots byte-for-byte and test:matrix:inventory passes. --- mise.toml | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/mise.toml b/mise.toml index b2ceb14eb..f138ef247 100644 --- a/mise.toml +++ b/mise.toml @@ -416,26 +416,51 @@ EQL_ROOT="{{config_root}}" source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') -# Ordered baseline (canonical) — written first because the eq-only shape is +# A compile failure already aborts above (set -e on the assignment); this guards +# the rarer "compiled but produced no test names" case so an empty listing can +# never reach the writes below and overwrite the committed baselines with nothing. +[ -n "$listing" ] || { echo "No test names from 'cargo test --list' — refusing to touch snapshots." >&2; exit 1; } + +# Build all four shapes into a temp dir, validate each is non-empty, THEN move +# them into place together. Writing snapshots/ directly is unsafe: the `>` redirect +# truncates the committed file before the pipeline's grep runs, so a driver type +# whose arms vanished (matrix wiring removed) would leave a truncated baseline +# behind. Staging in a temp dir keeps the task atomic — on any failure the +# committed snapshots are never touched. NOTE: stub-fixtures.sh owns the single +# EXIT trap (it removes the compile stubs), so we must NOT set our own; remove the +# temp dir explicitly instead (a harmless leak under $TMPDIR on early abort). +stage=$(mktemp -d) + +# Ordered baseline (canonical) — staged first because the eq-only shape is # DERIVED from it below. printf '%s\\n' "$listing" | grep '^scalars::int4::' \ | sed -e 's/^scalars::int4::/scalars::::/' -e 's/_int4_/__/g' \ - | LC_ALL=C sort > snapshots/matrix_tests.txt + | LC_ALL=C sort > "$stage/matrix_tests.txt" # Eq-only shape: DERIVED from the freshly-regenerated ordered baseline (the # inventory gate re-derives and pins this exact relationship). -grep -vE '_ord|order_by|routes_through_ob' snapshots/matrix_tests.txt \ - | LC_ALL=C sort -u > snapshots/matrix_tests_eq_only.txt +grep -vE '_ord|order_by|routes_through_ob' "$stage/matrix_tests.txt" \ + | LC_ALL=C sort -u > "$stage/matrix_tests_eq_only.txt" # Text shape: SUPERSET of ordered, from its own driver type. printf '%s\\n' "$listing" | grep '^scalars::text::' \ | sed -e 's/^scalars::text::/scalars::::/' -e 's/_text_/__/g' \ - | LC_ALL=C sort > snapshots/matrix_tests_text.txt + | LC_ALL=C sort > "$stage/matrix_tests_text.txt" # Storage-only shape: term-less surface arms only, from its own driver type. printf '%s\\n' "$listing" | grep '^scalars::bool::' \ | sed -e 's/^scalars::bool::/scalars::::/' -e 's/_bool_/__/g' \ - | LC_ALL=C sort > snapshots/matrix_tests_storage_only.txt + | LC_ALL=C sort > "$stage/matrix_tests_storage_only.txt" + +# Every shape must have arms; an empty one means a driver type lost its matrix +# wiring. Fail WITHOUT overwriting the committed snapshot. +for f in matrix_tests.txt matrix_tests_eq_only.txt matrix_tests_text.txt matrix_tests_storage_only.txt; do + [ -s "$stage/$f" ] || { echo "Regenerated $f is empty (driver type missing its matrix tests?) — refusing to overwrite snapshots/$f." >&2; rm -rf "$stage"; exit 1; } +done + +mv "$stage/matrix_tests.txt" "$stage/matrix_tests_eq_only.txt" \ + "$stage/matrix_tests_text.txt" "$stage/matrix_tests_storage_only.txt" snapshots/ +rm -rf "$stage" echo "Regenerated 4 scalar matrix snapshots (ordered, eq-only, text, storage-only)." echo "Run 'mise run test:matrix:inventory' to validate, then commit any changes." From f44d18757f2727cfdd7220d50e7f7a6d984eb2bc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 12:20:33 +1000 Subject: [PATCH 360/599] test(v3): expand text + bool matrix snapshots alongside int4 drift backstop Cover every reachable scalar_matrix! arm at the body level: int4 ([eq, ord]), text ([eq, ord, search]), bool ([storage]). text does not subsume int4 (its ord btree combo omits =, which the int4 arm proves rides the ORE ordered index), so all three are kept. Refactor test:matrix:expand to loop over TARGETS=(int4 text bool), emitting snapshots/_expanded.rs per target (fixture/migration normalization generalized, bash-3.2 safe). int4_expanded.rs is also refreshed: its embedded matrix.rs line markers were stale (2-line shift) since a7b29b59 changed matrix.rs without a regen; the non-blocking nightly lane had not run to flag it. Body logic is unchanged (diff is start_line/end_line metadata only). Refs #321. --- mise.toml | 88 +- tests/sqlx/snapshots/bool_expanded.rs | 2905 ++ tests/sqlx/snapshots/int4_expanded.rs | 48 +- tests/sqlx/snapshots/text_expanded.rs | 43314 ++++++++++++++++++++++++ 4 files changed, 46300 insertions(+), 55 deletions(-) create mode 100644 tests/sqlx/snapshots/bool_expanded.rs create mode 100644 tests/sqlx/snapshots/text_expanded.rs diff --git a/mise.toml b/mise.toml index f138ef247..cdd51cc17 100644 --- a/mise.toml +++ b/mise.toml @@ -606,28 +606,37 @@ echo "Catalog-coverage OK: every CATALOG (type, domain) has matrix tests." """ [tasks."test:matrix:expand"] -description = "Regenerate the int4 matrix cargo-expand snapshot (requires the pinned nightly + cargo-expand)" +description = "Regenerate the matrix cargo-expand drift snapshots (int4, text, bool — one per reachable scalar_matrix! arm; requires the pinned nightly + cargo-expand)" dir = "{{config_root}}/tests/sqlx" run = """ #!/usr/bin/env bash -# Body-level fidelity backstop for the macro: the expanded source of the int4 -# matrix arms. The `cargo +nightly-...` invocation below is the SINGLE source of -# the pinned nightly date — .github/workflows/macro-expand-eql.yml greps it from -# here rather than hardcoding, so there is nothing to keep in lockstep. The date -# is pinned to a known-good value so the snapshot only moves when *the macro* -# moves, not when nightly reformats — bump it deliberately, here, in one place. +# Body-level fidelity backstop for the macro: the expanded source of the matrix +# arms, one snapshot per *reachable* `scalar_matrix!` arm (tests/sqlx/src/matrix.rs): +# int4 -> [eq, ord] (= rides the ORE ordered index) +# text -> [eq, ord, search] (bloom `_match` + `_eqidx` index split) +# bool -> [storage] (single term-less domain; direct leaf drivers) +# The arms emit structurally different bodies, so no single type subsumes the +# others (text does NOT subsume int4: its `ord` btree combo omits `=`). The `[eq]` +# arm has no consumer and is uncovered by design. The `cargo +nightly-...` +# invocation below is the SINGLE source of the pinned nightly date — +# .github/workflows/macro-expand-eql.yml greps it from here rather than +# hardcoding, so there is nothing to keep in lockstep. The date is pinned to a +# known-good value so the snapshots only move when *the macro* moves, not when +# nightly reformats — bump it deliberately, here, in one place. # # `#[sqlx::test]` embeds one `sqlx::migrate::Migration` per file in migrations/ -# plus the fixture (via include_str) into EVERY generated test — ~477 MB of -# repeated data dwarfing the macro bodies, and non-deterministic across +# plus the fixture (via include_str) into EVERY generated test — hundreds of MB +# of repeated data dwarfing the macro bodies, and non-deterministic across # environments (the generated 001_install_eql.sql is absent in a bare checkout). -# Normalise both to fixed empties so the snapshot depends only on matrix.rs + +# Normalise both to fixed empties so each snapshot depends only on matrix.rs + # the sqlx/test harness: swap migrations/ for a single empty placeholder and -# empty the int4 fixture, expand, then restore (trap fires on any exit). This is -# expand-only surgery on gitignored/generated inputs; nothing here is committed. +# empty each target's fixture (every scalar suite include_str!'s exactly +# fixtures/eql_v3_.sql), expand, then restore (trap fires on any exit). +# This is expand-only surgery on gitignored/generated inputs; nothing here is +# committed. # -# Non-blocking lane (no Postgres, never compiled): the `.rs` name lives under -# snapshots/, not tests/, so Cargo never treats it as a test target. +# Non-blocking lane (no Postgres, never compiled): the `.rs` names live under +# snapshots/, not tests/, so Cargo never treats them as test targets. set -euo pipefail # Force the mise-pinned cargo-expand (mise.toml [tools]) to win over any stray # global `cargo install cargo-expand` in ~/.cargo/bin, which otherwise sits @@ -636,30 +645,47 @@ set -euo pipefail PATH="$(mise where cargo:cargo-expand)/bin:$PATH" export PATH mkdir -p snapshots fixtures +# One target per reachable scalar_matrix! arm. Add a token here to pin another +# arm; its snapshot is written to snapshots/_expanded.rs. +TARGETS=(int4 text bool) BK=$(mktemp -d) cp -a migrations "$BK/migrations" -# The int4 fixture is gitignored (regenerated) and absent in a bare checkout — -# back it up only if present, and on restore drop the empty stand-in if so. -HAD_FIXTURE=0 -if [ -f fixtures/eql_v3_int4.sql ]; then cp -a fixtures/eql_v3_int4.sql "$BK/eql_v3_int4.sql"; HAD_FIXTURE=1; fi +mkdir -p "$BK/fixtures" +# Each target fixture is gitignored (regenerated) and absent in a bare checkout — +# back it up only if present. Presence of the backup file is itself the record of +# "this fixture existed", so restore needs no separate flag (bash 3.2 safe: no +# associative arrays). +for t in "${TARGETS[@]}"; do + if [ -f "fixtures/eql_v3_${t}.sql" ]; then + cp -a "fixtures/eql_v3_${t}.sql" "$BK/fixtures/eql_v3_${t}.sql" + fi +done restore() { rm -rf migrations && cp -a "$BK/migrations" migrations - if [ "$HAD_FIXTURE" = 1 ]; then cp -af "$BK/eql_v3_int4.sql" fixtures/eql_v3_int4.sql; else rm -f fixtures/eql_v3_int4.sql; fi + for t in "${TARGETS[@]}"; do + if [ -f "$BK/fixtures/eql_v3_${t}.sql" ]; then + cp -af "$BK/fixtures/eql_v3_${t}.sql" "fixtures/eql_v3_${t}.sql" + else + rm -f "fixtures/eql_v3_${t}.sql" + fi + done rm -rf "$BK" } trap restore EXIT -# Wipe + recreate so the expand input is ALWAYS exactly one empty migration + -# one empty fixture, regardless of what the checkout had — this is what makes -# the snapshot deterministic across local and CI. +# Wipe + recreate so the expand input is ALWAYS exactly one empty migration + one +# empty fixture per target, regardless of what the checkout had — this is what +# makes the snapshots deterministic across local and CI. rm -rf migrations && mkdir migrations : > migrations/0001_placeholder.sql -: > fixtures/eql_v3_int4.sql -# Expand into a temp file and mv into place only on success — a redirect straight -# onto the snapshot would zero it before cargo runs, so a transient expand -# failure would leave a 0-byte snapshot locally. (Under `set -euo pipefail` a -# cargo failure aborts the script and the trap restores migrations/fixtures; the -# temp file is then orphaned in $TMPDIR, which is acceptable.) -OUT=$(mktemp) -cargo +nightly-2026-05-01 expand --test encrypted_domain scalars::int4 > "$OUT" -mv "$OUT" snapshots/int4_expanded.rs +for t in "${TARGETS[@]}"; do : > "fixtures/eql_v3_${t}.sql"; done +# Expand each target into a temp file and mv into place only on success — a +# redirect straight onto the snapshot would zero it before cargo runs, so a +# transient expand failure would leave a 0-byte snapshot locally. (Under +# `set -euo pipefail` a cargo failure aborts the script and the trap restores +# migrations/fixtures; the temp file is then orphaned in $TMPDIR, acceptable.) +for t in "${TARGETS[@]}"; do + OUT=$(mktemp) + cargo +nightly-2026-05-01 expand --test encrypted_domain "scalars::${t}" > "$OUT" + mv "$OUT" "snapshots/${t}_expanded.rs" +done """ diff --git a/tests/sqlx/snapshots/bool_expanded.rs b/tests/sqlx/snapshots/bool_expanded.rs new file mode 100644 index 000000000..6694ff590 --- /dev/null +++ b/tests/sqlx/snapshots/bool_expanded.rs @@ -0,0 +1,2905 @@ +///`eql_v3_bool` matrix suite — generated by `scalar_types!`. +pub mod bool { + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_sanity"] + #[doc(hidden)] + pub const matrix_bool_storage_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_storage_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 725usize, + start_col: 26usize, + end_line: 725usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_sanity()), + ), + }; + fn matrix_bool_storage_sanity() -> anyhow::Result<()> { + async fn matrix_bool_storage_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_eq_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_eq_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_storage_eq_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_eq_blocker()), + ), + }; + fn matrix_bool_storage_eq_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_eq_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_eq_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_eq_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_neq_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_neq_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_storage_neq_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_neq_blocker()), + ), + }; + fn matrix_bool_storage_neq_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_neq_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_neq_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_neq_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_lt_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_storage_lt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_lt_blocker()), + ), + }; + fn matrix_bool_storage_lt_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_lt_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_lt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_lt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_lte_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_storage_lte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_lte_blocker()), + ), + }; + fn matrix_bool_storage_lte_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_lte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_lte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_lte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_gt_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_storage_gt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_gt_blocker()), + ), + }; + fn matrix_bool_storage_gt_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_gt_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_gt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_gt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_gte_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_storage_gte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_gte_blocker()), + ), + }; + fn matrix_bool_storage_gte_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_gte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_gte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_gte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_contains_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_contains_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_contains_blocker()), + ), + }; + fn matrix_bool_storage_contains_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_contained_by_blocker()), + ), + }; + fn matrix_bool_storage_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_payload_check"] + #[doc(hidden)] + pub const matrix_bool_storage_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_payload_check", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1090usize, + start_col: 22usize, + end_line: 1090usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_payload_check()), + ), + }; + fn matrix_bool_storage_payload_check() -> anyhow::Result<()> { + async fn matrix_bool_storage_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_path_op_blockers"] + #[doc(hidden)] + pub const matrix_bool_storage_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1163usize, + start_col: 22usize, + end_line: 1163usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_path_op_blockers()), + ), + }; + fn matrix_bool_storage_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_bool_storage_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_native_absent_ops"] + #[doc(hidden)] + pub const matrix_bool_storage_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1220usize, + start_col: 22usize, + end_line: 1220usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_native_absent_ops()), + ), + }; + fn matrix_bool_storage_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_bool_storage_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_bool_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1398usize, + start_col: 22usize, + end_line: 1398usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_typed_column_blocker()), + ), + }; + fn matrix_bool_storage_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_bool_storage_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_count_typed_column"] + #[doc(hidden)] + pub const matrix_bool_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3427usize, + start_col: 22usize, + end_line: 3427usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_count_typed_column()), + ), + }; + fn matrix_bool_storage_count_typed_column() -> anyhow::Result<()> { + async fn matrix_bool_storage_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_bool.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_bool_storage_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_count_path_cast"] + #[doc(hidden)] + pub const matrix_bool_storage_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_count_path_cast", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3461usize, + start_col: 22usize, + end_line: 3461usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_count_path_cast()), + ), + }; + fn matrix_bool_storage_count_path_cast() -> anyhow::Result<()> { + async fn matrix_bool_storage_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_bool.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_bool_storage_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_bool_storage_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3505usize, + start_col: 22usize, + end_line: 3505usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_count_distinct_extractor()), + ), + }; + fn matrix_bool_storage_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_bool_storage_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_bool.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_bool_storage_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_bool_storage_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_aggregate_typecheck_min()), + ), + }; + fn matrix_bool_storage_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_bool_storage_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_storage_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_bool_storage_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::bool::matrix_bool_storage_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_storage_aggregate_typecheck_max()), + ), + }; + fn matrix_bool_storage_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_bool_storage_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + bool, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_storage_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_bool_storage_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::bool::matrix_bool_fixture_shape"] + #[doc(hidden)] + pub const matrix_bool_fixture_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::bool::matrix_bool_fixture_shape"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1885usize, + start_col: 22usize, + end_line: 1885usize, + end_col: 55usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_bool_fixture_shape()), + ), + }; + fn matrix_bool_fixture_shape() -> anyhow::Result<()> { + async fn matrix_bool_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let table = ::fixture_table_name(); + let expected: &[bool] = ::fixture_values(); + let n = expected.len() as i64; + let count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT COUNT(*) FROM {0}", table), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(count == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "row count must match FIXTURE_VALUES.len(): want {0}, got {1}", + n, + count, + ), + ); + error + }); + } + let ids: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT id FROM {0} ORDER BY id", table), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not(ids == (1..=n).collect::>()) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("ids must be sequential from 1: got {0:?}", ids), + ); + error + }); + } + let plaintexts: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT plaintext FROM {0} ORDER BY id", table), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not(plaintexts == expected) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "plaintext column must match FIXTURE_VALUES in order", + ), + ); + error + }); + } + if ::eql_tests::scalar_domains::token_is_storage_only( + ::PG_TYPE, + ) { + let missing_c: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload->\'c\' IS NULL OR jsonb_typeof(payload->\'c\') <> \'string\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(missing_c == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "every storage-only payload must carry a `c string` term; missing = {0}", + missing_c, + ), + ); + error + }); + } + for term in ["hm", "ob", "bf"] { + let present: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'{1}\'", + table, + term, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(present == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "storage-only payload must NOT carry a `{0}` term; present = {1}", + term, + present, + ), + ); + error + }); + } + } + } else { + let mut term_checks: Vec<(&str, &str)> = ::alloc::boxed::box_assume_init_into_vec_unsafe( + ::alloc::intrinsics::write_box_via_move( + ::alloc::boxed::Box::new_uninit(), + [ + ( + "hm string", + "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", + ), + ( + "ob array", + "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", + ), + ( + "c string", + "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", + ), + ], + ), + ); + if ::eql_tests::scalar_domains::token_has_bloom_term( + ::PG_TYPE, + ) { + term_checks + .push(( + "bf array", + "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", + )); + } + for (label, predicate) in term_checks { + let missing: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(missing == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "every payload must carry a `{0}` term; missing = {1}", + label, + missing, + ), + ); + error + }); + } + } + let distinct_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT payload->>\'hm\') FROM {0}", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(distinct_hm == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0} distinct values -> {0} distinct hm terms; got {1}", + n, + distinct_hm, + ), + ); + error + }); + } + } + let mismatched_version: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload->\'v\' IS NULL OR payload->>\'v\' <> \'2\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(mismatched_version == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("every payload must declare v = \'2\'"), + ); + error + }); + } + if !expected.is_empty() { + let probe = &expected[expected.len() / 2]; + let probe_lit = ::to_sql_literal(probe); + let expected_id = (expected.len() / 2 + 1) as i64; + let ids: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT id FROM {1} WHERE plaintext = {0} ORDER BY id", + probe_lit, + table, + ), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not( + ids + == ::alloc::boxed::box_assume_init_into_vec_unsafe( + ::alloc::intrinsics::write_box_via_move( + ::alloc::boxed::Box::new_uninit(), + [expected_id], + ), + ), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected exactly one row with plaintext = {0:?} at id {1}, got {2:?}", + probe, + expected_id, + ids, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::bool::matrix_bool_fixture_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_bool.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_bool_fixture_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } +} diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/int4_expanded.rs index 812d18911..fde8624d6 100644 --- a/tests/sqlx/snapshots/int4_expanded.rs +++ b/tests/sqlx/snapshots/int4_expanded.rs @@ -26356,9 +26356,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3429usize, + start_line: 3427usize, start_col: 22usize, - end_line: 3429usize, + end_line: 3427usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -26485,9 +26485,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3463usize, + start_line: 3461usize, start_col: 22usize, - end_line: 3463usize, + end_line: 3461usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -26595,9 +26595,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3507usize, + start_line: 3505usize, start_col: 22usize, - end_line: 3507usize, + end_line: 3505usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -26733,9 +26733,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3429usize, + start_line: 3427usize, start_col: 22usize, - end_line: 3429usize, + end_line: 3427usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -26860,9 +26860,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3463usize, + start_line: 3461usize, start_col: 22usize, - end_line: 3463usize, + end_line: 3461usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -26970,9 +26970,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3507usize, + start_line: 3505usize, start_col: 22usize, - end_line: 3507usize, + end_line: 3505usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -27108,9 +27108,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3429usize, + start_line: 3427usize, start_col: 22usize, - end_line: 3429usize, + end_line: 3427usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -27235,9 +27235,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3463usize, + start_line: 3461usize, start_col: 22usize, - end_line: 3463usize, + end_line: 3461usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -27345,9 +27345,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3507usize, + start_line: 3505usize, start_col: 22usize, - end_line: 3507usize, + end_line: 3505usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -27483,9 +27483,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3429usize, + start_line: 3427usize, start_col: 22usize, - end_line: 3429usize, + end_line: 3427usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -27612,9 +27612,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3463usize, + start_line: 3461usize, start_col: 22usize, - end_line: 3463usize, + end_line: 3461usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -27722,9 +27722,9 @@ pub mod int4 { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3507usize, + start_line: 3505usize, start_col: 22usize, - end_line: 3507usize, + end_line: 3505usize, end_col: 78usize, compile_fail: false, no_run: false, diff --git a/tests/sqlx/snapshots/text_expanded.rs b/tests/sqlx/snapshots/text_expanded.rs new file mode 100644 index 000000000..5edae45b2 --- /dev/null +++ b/tests/sqlx/snapshots/text_expanded.rs @@ -0,0 +1,43314 @@ +///`eql_v3_text` matrix suite — generated by `scalar_types!`. +pub mod text { + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_sanity"] + #[doc(hidden)] + pub const matrix_text_storage_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_storage_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 725usize, + start_col: 26usize, + end_line: 725usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_sanity()), + ), + }; + fn matrix_text_storage_sanity() -> anyhow::Result<()> { + async fn matrix_text_storage_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_sanity"] + #[doc(hidden)] + pub const matrix_text_eq_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 725usize, + start_col: 26usize, + end_line: 725usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_sanity()), + ), + }; + fn matrix_text_eq_sanity() -> anyhow::Result<()> { + async fn matrix_text_eq_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_sanity"] + #[doc(hidden)] + pub const matrix_text_ord_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_ord_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 725usize, + start_col: 26usize, + end_line: 725usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_sanity()), + ), + }; + fn matrix_text_ord_sanity() -> anyhow::Result<()> { + async fn matrix_text_ord_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_sanity"] + #[doc(hidden)] + pub const matrix_text_ord_ore_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_ord_ore_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 725usize, + start_col: 26usize, + end_line: 725usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_sanity()), + ), + }; + fn matrix_text_ord_ore_sanity() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_sanity"] + #[doc(hidden)] + pub const matrix_text_search_sanity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_search_sanity"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 725usize, + start_col: 26usize, + end_line: 725usize, + end_col: 60usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_sanity()), + ), + }; + fn matrix_text_search_sanity() -> anyhow::Result<()> { + async fn matrix_text_search_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + if !!spec.sql_domain.is_empty() { + ::core::panicking::panic( + "assertion failed: !spec.sql_domain.is_empty()", + ) + } + if !::fixture_table_name() + .starts_with("fixtures.") + { + ::core::panicking::panic( + "assertion failed: ::fixture_table_name().starts_with(\"fixtures.\")", + ) + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_sanity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_sanity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_eq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_eq_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_eq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_eq_pivot_min_correctness()), + ), + }; + fn matrix_text_eq_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_eq_eq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_eq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_eq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_eq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_eq_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_eq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_eq_pivot_max_correctness()), + ), + }; + fn matrix_text_eq_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_eq_eq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_eq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_eq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_eq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_eq_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_eq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_eq_pivot_mid_correctness()), + ), + }; + fn matrix_text_eq_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_eq_eq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_eq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_eq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_neq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_eq_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_neq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_neq_pivot_min_correctness()), + ), + }; + fn matrix_text_eq_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_eq_neq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_neq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_neq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_neq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_eq_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_neq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_neq_pivot_max_correctness()), + ), + }; + fn matrix_text_eq_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_eq_neq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_neq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_neq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_neq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_eq_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_neq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_neq_pivot_mid_correctness()), + ), + }; + fn matrix_text_eq_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_eq_neq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_neq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_neq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eq_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_eq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_eq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eq_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_eq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_eq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eq_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_eq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_eq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_neq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_neq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_neq_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_neq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_neq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_neq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_neq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_neq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_neq_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_neq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_neq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_neq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_neq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_neq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_neq_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_neq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_neq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_neq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eq_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_ore_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_eq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eq_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_ore_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_eq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eq_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_ore_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_eq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_neq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_neq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_neq_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_ore_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_neq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_neq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_neq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_neq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_neq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_neq_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_ore_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_neq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_neq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_neq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_neq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_neq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_neq_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_ore_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_neq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_neq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_neq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_search_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eq_pivot_min_correctness()), + ), + }; + fn matrix_text_search_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_eq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_eq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_search_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eq_pivot_max_correctness()), + ), + }; + fn matrix_text_search_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_eq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_eq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_search_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eq_pivot_mid_correctness()), + ), + }; + fn matrix_text_search_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_eq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_eq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_neq_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_search_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_neq_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_neq_pivot_min_correctness()), + ), + }; + fn matrix_text_search_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_neq_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_neq_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_neq_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_neq_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_search_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_neq_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_neq_pivot_max_correctness()), + ), + }; + fn matrix_text_search_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_neq_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_neq_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_neq_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_neq_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_search_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_neq_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_neq_pivot_mid_correctness()), + ), + }; + fn matrix_text_search_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_neq_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<>", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<>", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<>", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_neq_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_neq_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lt_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_lt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_lt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lt_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_lt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_lt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lt_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lt_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lt_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_lt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_lt_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lt_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lt_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lte_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_lte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_lte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lte_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_lte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_lte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lte_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lte_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lte_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_lte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_lte_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lte_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lte_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gt_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_gt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_gt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gt_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_gt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_gt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gt_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gt_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gt_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_gt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_gt_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gt_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gt_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gte_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_gte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_gte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gte_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_gte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_gte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gte_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gte_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gte_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_gte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_gte_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gte_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gte_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lt_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_ore_lt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lt_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_ore_lt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lt_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lt_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lt_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_ore_lt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lt_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lt_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lt_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lte_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_ore_lte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lte_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_ore_lte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lte_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lte_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lte_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_ore_lte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lte_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lte_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lte_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gt_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_ore_gt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gt_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_ore_gt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gt_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gt_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gt_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_ore_gt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gt_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gt_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gt_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gte_pivot_min_correctness()), + ), + }; + fn matrix_text_ord_ore_gte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gte_pivot_max_correctness()), + ), + }; + fn matrix_text_ord_ore_gte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gte_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gte_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gte_pivot_mid_correctness()), + ), + }; + fn matrix_text_ord_ore_gte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gte_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gte_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gte_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_search_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lt_pivot_min_correctness()), + ), + }; + fn matrix_text_search_lt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_lt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_search_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lt_pivot_max_correctness()), + ), + }; + fn matrix_text_search_lt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_lt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lt_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_search_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lt_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lt_pivot_mid_correctness()), + ), + }; + fn matrix_text_search_lt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_lt_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lt_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lt_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_search_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lte_pivot_min_correctness()), + ), + }; + fn matrix_text_search_lte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_lte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_search_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lte_pivot_max_correctness()), + ), + }; + fn matrix_text_search_lte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_lte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lte_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_search_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lte_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lte_pivot_mid_correctness()), + ), + }; + fn matrix_text_search_lte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_lte_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + "<=", + lit, + ), + ) + }); + let expected = ::expected_forward( + "<=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, "<=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lte_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lte_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gt_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_search_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gt_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gt_pivot_min_correctness()), + ), + }; + fn matrix_text_search_gt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_gt_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gt_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gt_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gt_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_search_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gt_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gt_pivot_max_correctness()), + ), + }; + fn matrix_text_search_gt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_gt_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gt_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gt_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gt_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_search_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gt_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gt_pivot_mid_correctness()), + ), + }; + fn matrix_text_search_gt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_gt_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gt_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gt_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gte_pivot_min_correctness"] + #[doc(hidden)] + pub const matrix_text_search_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gte_pivot_min_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gte_pivot_min_correctness()), + ), + }; + fn matrix_text_search_gte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_gte_pivot_min_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gte_pivot_min_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gte_pivot_min_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gte_pivot_max_correctness"] + #[doc(hidden)] + pub const matrix_text_search_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gte_pivot_max_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gte_pivot_max_correctness()), + ), + }; + fn matrix_text_search_gte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_gte_pivot_max_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gte_pivot_max_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gte_pivot_max_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gte_pivot_mid_correctness"] + #[doc(hidden)] + pub const matrix_text_search_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gte_pivot_mid_correctness", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 861usize, + start_col: 22usize, + end_line: 861usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gte_pivot_mid_correctness()), + ), + }; + fn matrix_text_search_gte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_text_search_gte_pivot_mid_correctness( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let predicate = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({0})::{1} {2} {3}::jsonb::{1}", + &spec.column_expr, + &spec.sql_domain, + ">=", + lit, + ), + ) + }); + let expected = ::expected_forward( + ">=", + pivot, + ); + ::eql_tests::scalar_domains::assert_scalar_plaintexts::< + String, + >(&pool, &spec.sql_domain, ">=", &predicate, &expected) + .await + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gte_pivot_mid_correctness", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gte_pivot_mid_correctness; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_eq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_eq_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_eq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_eq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_eq_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_eq_eq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_eq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_eq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_eq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_eq_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_eq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_eq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_eq_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_eq_eq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_eq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_eq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_eq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_eq_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_eq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_eq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_eq_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_eq_eq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_eq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_eq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_neq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_eq_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_neq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_neq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_eq_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_eq_neq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_neq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_neq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_neq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_eq_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_neq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_neq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_eq_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_eq_neq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_neq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_neq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_neq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_eq_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_neq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_neq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_eq_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_eq_neq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_neq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_neq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_eq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_eq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_eq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_eq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_eq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_eq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_neq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_neq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_neq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_neq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_neq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_neq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_neq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_neq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_neq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_neq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_neq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_neq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_neq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_neq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_neq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_neq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_neq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_neq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_ore_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_eq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_ore_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_eq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_ore_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_eq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_neq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_neq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_neq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_ore_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_neq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_neq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_neq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_neq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_neq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_neq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_ore_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_neq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_neq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_neq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_neq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_neq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_neq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_ore_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_neq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_neq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_neq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_search_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_eq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_eq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_search_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_eq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_eq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_search_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_eq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_eq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_neq_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_neq_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_neq_pivot_min_cross_shape()), + ), + }; + fn matrix_text_search_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_neq_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_neq_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_neq_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_neq_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_neq_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_neq_pivot_max_cross_shape()), + ), + }; + fn matrix_text_search_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_neq_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_neq_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_neq_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_neq_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_neq_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_neq_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_search_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_neq_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<>", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<>"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<>", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<>", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<>", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<>", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_neq_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_neq_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lt_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_lt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_lt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lt_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_lt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_lt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lt_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lt_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lt_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_lt_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lt_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lt_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lte_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_lte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_lte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lte_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_lte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_lte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lte_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lte_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lte_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_lte_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lte_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_lte_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gt_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_gt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_gt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gt_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_gt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_gt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gt_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gt_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gt_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_gt_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gt_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gt_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gte_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_gte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_gte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gte_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_gte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_gte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gte_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gte_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gte_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_gte_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gte_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_gte_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lt_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_ore_lt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lt_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_ore_lt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lt_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lt_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lt_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_ore_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lt_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lt_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lt_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lte_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_ore_lte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lte_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_ore_lte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lte_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lte_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lte_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_ore_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lte_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lte_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_lte_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gt_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_ore_gt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gt_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_ore_gt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gt_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gt_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gt_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_ore_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gt_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gt_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gt_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gte_pivot_min_cross_shape()), + ), + }; + fn matrix_text_ord_ore_gte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gte_pivot_max_cross_shape()), + ), + }; + fn matrix_text_ord_ore_gte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gte_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gte_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gte_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_ord_ore_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gte_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gte_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_gte_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lt_pivot_min_cross_shape()), + ), + }; + fn matrix_text_search_lt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_lt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lt_pivot_max_cross_shape()), + ), + }; + fn matrix_text_search_lt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_lt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lt_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lt_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lt_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_search_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_lt_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lt_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lt_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lte_pivot_min_cross_shape()), + ), + }; + fn matrix_text_search_lte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_lte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lte_pivot_max_cross_shape()), + ), + }; + fn matrix_text_search_lte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_lte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lte_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lte_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lte_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_search_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_lte_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + "<=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op("<="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + "<=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", "<=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", "<=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + "<=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lte_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_lte_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gt_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gt_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gt_pivot_min_cross_shape()), + ), + }; + fn matrix_text_search_gt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_gt_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gt_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gt_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gt_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gt_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gt_pivot_max_cross_shape()), + ), + }; + fn matrix_text_search_gt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_gt_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gt_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gt_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gt_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gt_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gt_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_search_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_gt_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">"), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gt_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gt_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gte_pivot_min_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gte_pivot_min_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gte_pivot_min_cross_shape()), + ), + }; + fn matrix_text_search_gte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_gte_pivot_min_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::min_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gte_pivot_min_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gte_pivot_min_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gte_pivot_max_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gte_pivot_max_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gte_pivot_max_cross_shape()), + ), + }; + fn matrix_text_search_gte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_gte_pivot_max_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::max_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gte_pivot_max_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gte_pivot_max_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gte_pivot_mid_cross_shape"] + #[doc(hidden)] + pub const matrix_text_search_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gte_pivot_mid_cross_shape", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 902usize, + start_col: 22usize, + end_line: 902usize, + end_col: 96usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gte_pivot_mid_cross_shape()), + ), + }; + fn matrix_text_search_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_text_search_gte_pivot_mid_cross_shape( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let pivot: String = ::mid_pivot(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot.clone()) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let forward_count = ::expected_forward( + ">=", + pivot.clone(), + ) + .len() as i64; + let commuted_count = ::expected_forward( + ::eql_tests::scalar_domains::commute_op(">="), + pivot.clone(), + ) + .len() as i64; + let d = &spec.sql_domain; + let col = &spec.column_expr; + let shapes = [ + ( + "d_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "({1})::{2} {0} {3}::jsonb::{2}", + ">=", + col, + d, + lit, + ), + ) + }), + forward_count, + ), + ( + "d_j", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("({1})::{2} {0} {3}::jsonb", ">=", col, d, lit), + ) + }), + forward_count, + ), + ( + "j_d", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1}::jsonb {0} ({2})::{3}", ">=", lit, col, d), + ) + }), + commuted_count, + ), + ]; + let table = ::fixture_table_name(); + for (shape_label, predicate, expected_count) in shapes { + let count_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }); + let count: i64 = sqlx::query_scalar(&count_sql) + .fetch_one(&pool) + .await?; + match (&count, &expected_count) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} op={1} pivot={2:?} shape={3} SQL={4} expected {5} rows, got {6}", + d, + ">=", + pivot, + shape_label, + count_sql, + expected_count, + count, + ), + ), + ); + } + } + }; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gte_pivot_mid_cross_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_gte_pivot_mid_cross_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_eq_supported_null"] + #[doc(hidden)] + pub const matrix_text_eq_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_eq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_eq_supported_null()), + ), + }; + fn matrix_text_eq_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_eq_eq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_eq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_eq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_neq_supported_null"] + #[doc(hidden)] + pub const matrix_text_eq_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_neq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_neq_supported_null()), + ), + }; + fn matrix_text_eq_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_eq_neq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<>", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_neq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_neq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eq_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eq_supported_null()), + ), + }; + fn matrix_text_ord_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_eq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_eq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_neq_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_neq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_neq_supported_null()), + ), + }; + fn matrix_text_ord_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_neq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<>", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_neq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_neq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eq_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eq_supported_null()), + ), + }; + fn matrix_text_ord_ore_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_eq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_neq_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_neq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_neq_supported_null()), + ), + }; + fn matrix_text_ord_ore_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_neq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<>", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_neq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_neq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eq_supported_null"] + #[doc(hidden)] + pub const matrix_text_search_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eq_supported_null()), + ), + }; + fn matrix_text_search_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_search_eq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_eq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_neq_supported_null"] + #[doc(hidden)] + pub const matrix_text_search_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_neq_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_neq_supported_null()), + ), + }; + fn matrix_text_search_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_text_search_neq_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<>", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_neq_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_neq_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lt_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lt_supported_null()), + ), + }; + fn matrix_text_ord_lt_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_lt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_lt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_lte_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_lte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_lte_supported_null()), + ), + }; + fn matrix_text_ord_lte_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_lte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_lte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_lte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gt_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gt_supported_null()), + ), + }; + fn matrix_text_ord_gt_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_gt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_gt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_gte_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_gte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_gte_supported_null()), + ), + }; + fn matrix_text_ord_gte_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_gte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_gte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_gte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lt_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lt_supported_null()), + ), + }; + fn matrix_text_ord_ore_lt_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_lt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_lte_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_lte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_lte_supported_null()), + ), + }; + fn matrix_text_ord_ore_lte_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_lte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_lte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_lte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gt_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gt_supported_null()), + ), + }; + fn matrix_text_ord_ore_gt_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_gt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_gte_supported_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_gte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_gte_supported_null()), + ), + }; + fn matrix_text_ord_ore_gte_supported_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_gte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_gte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_gte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lt_supported_null"] + #[doc(hidden)] + pub const matrix_text_search_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lt_supported_null()), + ), + }; + fn matrix_text_search_lt_supported_null() -> anyhow::Result<()> { + async fn matrix_text_search_lt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_lt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_lte_supported_null"] + #[doc(hidden)] + pub const matrix_text_search_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_lte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_lte_supported_null()), + ), + }; + fn matrix_text_search_lte_supported_null() -> anyhow::Result<()> { + async fn matrix_text_search_lte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + "<=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_lte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_lte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gt_supported_null"] + #[doc(hidden)] + pub const matrix_text_search_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gt_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gt_supported_null()), + ), + }; + fn matrix_text_search_gt_supported_null() -> anyhow::Result<()> { + async fn matrix_text_search_gt_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gt_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_gt_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_gte_supported_null"] + #[doc(hidden)] + pub const matrix_text_search_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_gte_supported_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 959usize, + start_col: 22usize, + end_line: 959usize, + end_col: 79usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_gte_supported_null()), + ), + }; + fn matrix_text_search_gte_supported_null() -> anyhow::Result<()> { + async fn matrix_text_search_gte_supported_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let payload = spec.placeholder_payload; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + &spec.sql_domain, + ">=", + ), + ) + }); + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[Some(payload), None], + ) + .await?; + ::eql_tests::scalar_domains::assert_null( + &pool, + &sql, + &[None, Some(payload)], + ) + .await?; + ::eql_tests::scalar_domains::assert_null(&pool, &sql, &[None, None]) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_gte_supported_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_gte_supported_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_eq_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_eq_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_storage_eq_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_eq_blocker()), + ), + }; + fn matrix_text_storage_eq_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_eq_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_eq_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_eq_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_neq_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_neq_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_storage_neq_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_neq_blocker()), + ), + }; + fn matrix_text_storage_neq_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_neq_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_neq_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_neq_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_lt_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_storage_lt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_lt_blocker()), + ), + }; + fn matrix_text_storage_lt_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_lt_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_lt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_lt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_lte_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_storage_lte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_lte_blocker()), + ), + }; + fn matrix_text_storage_lte_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_lte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_lte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_lte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_gt_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_storage_gt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_gt_blocker()), + ), + }; + fn matrix_text_storage_gt_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_gt_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_gt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_gt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_gte_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_storage_gte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_gte_blocker()), + ), + }; + fn matrix_text_storage_gte_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_gte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_gte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_gte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_contains_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_contains_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_contains_blocker()), + ), + }; + fn matrix_text_storage_contains_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_contained_by_blocker()), + ), + }; + fn matrix_text_storage_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_lt_blocker"] + #[doc(hidden)] + pub const matrix_text_eq_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_lt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_lt_blocker()), + ), + }; + fn matrix_text_eq_lt_blocker() -> anyhow::Result<()> { + async fn matrix_text_eq_lt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_lt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_lt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_lte_blocker"] + #[doc(hidden)] + pub const matrix_text_eq_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_lte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_lte_blocker()), + ), + }; + fn matrix_text_eq_lte_blocker() -> anyhow::Result<()> { + async fn matrix_text_eq_lte_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_lte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_lte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_gt_blocker"] + #[doc(hidden)] + pub const matrix_text_eq_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_gt_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_gt_blocker()), + ), + }; + fn matrix_text_eq_gt_blocker() -> anyhow::Result<()> { + async fn matrix_text_eq_gt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_gt_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_gt_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_gte_blocker"] + #[doc(hidden)] + pub const matrix_text_eq_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_gte_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_gte_blocker()), + ), + }; + fn matrix_text_eq_gte_blocker() -> anyhow::Result<()> { + async fn matrix_text_eq_gte_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + ">=", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", ">=", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", ">=", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_gte_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_gte_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_contains_blocker"] + #[doc(hidden)] + pub const matrix_text_eq_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_contains_blocker"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_contains_blocker()), + ), + }; + fn matrix_text_eq_contains_blocker() -> anyhow::Result<()> { + async fn matrix_text_eq_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_text_eq_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_contained_by_blocker()), + ), + }; + fn matrix_text_eq_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_text_eq_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_contains_blocker"] + #[doc(hidden)] + pub const matrix_text_ord_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_contains_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_contains_blocker()), + ), + }; + fn matrix_text_ord_contains_blocker() -> anyhow::Result<()> { + async fn matrix_text_ord_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_text_ord_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_contained_by_blocker()), + ), + }; + fn matrix_text_ord_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_text_ord_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_contains_blocker"] + #[doc(hidden)] + pub const matrix_text_ord_ore_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_contains_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_contains_blocker()), + ), + }; + fn matrix_text_ord_ore_contains_blocker() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_contains_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "@>", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "@>", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "@>", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_contains_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_contains_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_contained_by_blocker"] + #[doc(hidden)] + pub const matrix_text_ord_ore_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_contained_by_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1023usize, + start_col: 22usize, + end_line: 1023usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_contained_by_blocker()), + ), + }; + fn matrix_text_ord_ore_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_contained_by_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let msg = ::eql_tests::scalar_domains::blocker_msg( + &spec.sql_domain, + "<@", + ); + let d = &spec.sql_domain; + let shapes: [(String, String); 3] = [ + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ( + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + "$2::jsonb".into(), + ), + ( + "$1::jsonb".into(), + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$2::jsonb::{0}", d)) + }), + ), + ]; + for (lhs, rhs) in shapes { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT {1} {0} {2}", "<@", lhs, rhs), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &msg, + ) + .await?; + } + let null_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{1} {0} $2::jsonb::{1}", "<@", d), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, Some(payload)], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[Some(payload), None], + &msg, + ) + .await?; + ::eql_tests::scalar_domains::assert_raises( + &pool, + &null_sql, + &[None, None], + &msg, + ) + .await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_contained_by_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_contained_by_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_payload_check"] + #[doc(hidden)] + pub const matrix_text_storage_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_payload_check", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1090usize, + start_col: 22usize, + end_line: 1090usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_payload_check()), + ), + }; + fn matrix_text_storage_payload_check() -> anyhow::Result<()> { + async fn matrix_text_storage_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_payload_check"] + #[doc(hidden)] + pub const matrix_text_eq_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_payload_check"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1090usize, + start_col: 22usize, + end_line: 1090usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_payload_check()), + ), + }; + fn matrix_text_eq_payload_check() -> anyhow::Result<()> { + async fn matrix_text_eq_payload_check(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_payload_check"] + #[doc(hidden)] + pub const matrix_text_ord_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_ord_payload_check"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1090usize, + start_col: 22usize, + end_line: 1090usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_payload_check()), + ), + }; + fn matrix_text_ord_payload_check() -> anyhow::Result<()> { + async fn matrix_text_ord_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_payload_check"] + #[doc(hidden)] + pub const matrix_text_ord_ore_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_payload_check", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1090usize, + start_col: 22usize, + end_line: 1090usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_payload_check()), + ), + }; + fn matrix_text_ord_ore_payload_check() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_payload_check"] + #[doc(hidden)] + pub const matrix_text_search_payload_check: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_payload_check", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1090usize, + start_col: 22usize, + end_line: 1090usize, + end_col: 67usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_payload_check()), + ), + }; + fn matrix_text_search_payload_check() -> anyhow::Result<()> { + async fn matrix_text_search_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let baseline = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for key in spec.payload_required_keys() { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (\'{0}\'::jsonb - \'{1}\')::{2}", + baseline, + key, + d, + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} must reject payload missing `{1}`: {2}", + d, + key, + sql, + ), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not( + err.contains("violates check constraint"), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for missing `{0}` on {1}, got: {2}", + key, + d, + err, + ), + ); + error + }); + } + } + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT \'[\"v\",\"i\",\"c\"]\'::jsonb::{0}", d), + ) + }); + let err = sqlx::query(&sql) + .fetch_one(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{0} must reject non-object payload", d), + ) + }), + ) + .to_string(); + if ::anyhow::__private::not(err.contains("violates check constraint")) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected check-constraint violation for non-object on {0}, got: {1}", + d, + err, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_payload_check", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_payload_check; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_path_op_blockers"] + #[doc(hidden)] + pub const matrix_text_storage_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1163usize, + start_col: 22usize, + end_line: 1163usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_path_op_blockers()), + ), + }; + fn matrix_text_storage_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_text_storage_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_path_op_blockers"] + #[doc(hidden)] + pub const matrix_text_eq_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_path_op_blockers"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1163usize, + start_col: 22usize, + end_line: 1163usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_path_op_blockers()), + ), + }; + fn matrix_text_eq_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_text_eq_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_path_op_blockers"] + #[doc(hidden)] + pub const matrix_text_ord_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1163usize, + start_col: 22usize, + end_line: 1163usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_path_op_blockers()), + ), + }; + fn matrix_text_ord_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_text_ord_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_path_op_blockers"] + #[doc(hidden)] + pub const matrix_text_ord_ore_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1163usize, + start_col: 22usize, + end_line: 1163usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_path_op_blockers()), + ), + }; + fn matrix_text_ord_ore_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_path_op_blockers"] + #[doc(hidden)] + pub const matrix_text_search_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_path_op_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1163usize, + start_col: 22usize, + end_line: 1163usize, + end_col: 70usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_path_op_blockers()), + ), + }; + fn matrix_text_search_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_text_search_path_op_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["->", "->>"] { + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + for sql in [ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} \'field\'::text", + d, + op, + ), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb::{0} {1} 0::integer", d, op), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT $1::jsonb {0} $1::jsonb::{1}", op, d), + ) + }), + ] { + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_path_op_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_path_op_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_native_absent_ops"] + #[doc(hidden)] + pub const matrix_text_storage_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1220usize, + start_col: 22usize, + end_line: 1220usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_native_absent_ops()), + ), + }; + fn matrix_text_storage_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_text_storage_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_native_absent_ops"] + #[doc(hidden)] + pub const matrix_text_eq_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1220usize, + start_col: 22usize, + end_line: 1220usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_native_absent_ops()), + ), + }; + fn matrix_text_eq_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_text_eq_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_native_absent_ops"] + #[doc(hidden)] + pub const matrix_text_ord_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1220usize, + start_col: 22usize, + end_line: 1220usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_native_absent_ops()), + ), + }; + fn matrix_text_ord_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_text_ord_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_native_absent_ops"] + #[doc(hidden)] + pub const matrix_text_ord_ore_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1220usize, + start_col: 22usize, + end_line: 1220usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_native_absent_ops()), + ), + }; + fn matrix_text_ord_ore_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_native_absent_ops"] + #[doc(hidden)] + pub const matrix_text_search_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_native_absent_ops", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1220usize, + start_col: 22usize, + end_line: 1220usize, + end_col: 71usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_native_absent_ops()), + ), + }; + fn matrix_text_search_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_text_search_native_absent_ops( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + for op in ["~~", "~~*"] { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT $1::jsonb::{0} {1} $2::jsonb::{0}", + d, + op, + ), + ) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + "operator does not exist", + ) + .await?; + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_native_absent_ops", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_native_absent_ops; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_text_storage_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_native_jsonb_blockers()), + ), + }; + fn matrix_text_storage_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_text_storage_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_text_eq_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_native_jsonb_blockers()), + ), + }; + fn matrix_text_eq_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_text_eq_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_text_ord_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_native_jsonb_blockers()), + ), + }; + fn matrix_text_ord_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_text_ord_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_text_ord_ore_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_native_jsonb_blockers()), + ), + }; + fn matrix_text_ord_ore_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_native_jsonb_blockers"] + #[doc(hidden)] + pub const matrix_text_search_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_native_jsonb_blockers", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1295usize, + start_col: 22usize, + end_line: 1295usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_native_jsonb_blockers()), + ), + }; + fn matrix_text_search_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_text_search_native_jsonb_blockers( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let single: &[(&str, String)] = &[ + ( + "?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ? \'c\'::text", d), + ) + }), + ), + ( + "?|", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?| ARRAY[\'c\']", d), + ) + }), + ), + ( + "?&", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} ?& ARRAY[\'c\']", d), + ) + }), + ), + ( + "#>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #> ARRAY[\'i\']", d), + ) + }), + ), + ( + "#>>", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #>> ARRAY[\'i\', \'c\']", d), + ) + }), + ), + ( + "@?", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} @? \'$.c\'::jsonpath", d), + ) + }), + ), + ( + "@@", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "$1::jsonb::{0} @@ \'$.c == \"placeholder\"\'::jsonpath", + d, + ), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - \'c\'::text", d), + ) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0} - 0", d)) + }), + ), + ( + "-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} - ARRAY[\'c\']", d), + ) + }), + ), + ( + "#-", + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} #- ARRAY[\'i\']", d), + ) + }), + ), + ]; + for (op, expr) in single { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + let msg = ::eql_tests::scalar_domains::blocker_msg(d, op); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload)], + &msg, + ) + .await?; + } + let concat: &[String] = &[ + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb || $2::jsonb::{0}", d), + ) + }), + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("$1::jsonb::{0} || $2::jsonb::{0}", d), + ) + }), + ]; + let concat_msg = ::eql_tests::scalar_domains::blocker_msg(d, "||"); + for expr in concat { + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("SELECT {0}", expr)) + }); + ::eql_tests::scalar_domains::assert_raises( + &pool, + &sql, + &[Some(payload), Some(payload)], + &concat_msg, + ) + .await?; + } + let mut swept: Vec<&str> = single.iter().map(|(op, _)| *op).collect(); + swept.push("||"); + swept.sort_unstable(); + swept.dedup(); + let mut pinned: Vec<&str> = ::eql_tests::matrix::NATIVE_JSONB_BLOCKER_ARM_SYMBOLS + .to_vec(); + pinned.sort_unstable(); + if ::anyhow::__private::not(swept == pinned) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "native-jsonb-blocker arm swept {0:?} but pinned set is {1:?}", + swept, + pinned, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_native_jsonb_blockers", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_native_jsonb_blockers; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_text_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1398usize, + start_col: 22usize, + end_line: 1398usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_typed_column_blocker()), + ), + }; + fn matrix_text_storage_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_text_storage_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_text_eq_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1398usize, + start_col: 22usize, + end_line: 1398usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_typed_column_blocker()), + ), + }; + fn matrix_text_eq_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_text_eq_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + ">=", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", ">=", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, ">="); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_text_ord_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1398usize, + start_col: 22usize, + end_line: 1398usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_typed_column_blocker()), + ), + }; + fn matrix_text_ord_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_text_ord_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_typed_column_blocker"] + #[doc(hidden)] + pub const matrix_text_ord_ore_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_typed_column_blocker", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1398usize, + start_col: 22usize, + end_line: 1398usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_typed_column_blocker()), + ), + }; + fn matrix_text_ord_ore_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_typed_column_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + let create_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_col (id integer GENERATED ALWAYS AS IDENTITY,value {0}) ON COMMIT DROP", + d, + ), + ) + }); + sqlx::query(&create_sql).execute(&mut *tx).await?; + let insert_sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_col(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }); + sqlx::query(&insert_sql).bind(payload).execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "@>", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "@>", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "@>"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + sqlx::query("SAVEPOINT op_probe").execute(&mut *tx).await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM typed_col WHERE value {0} value", + "<@", + ), + ) + }); + let err = sqlx::query(&sql) + .fetch_all(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("{1} column {0} must raise", "<@", d), + ) + }), + ) + .to_string(); + let expected = ::eql_tests::scalar_domains::blocker_msg(d, "<@"); + if ::anyhow::__private::not(err.contains(&expected)) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "unexpected error for {0}: got {1}, want {2}", + sql, + err, + expected, + ), + ); + error + }); + } + sqlx::query("ROLLBACK TO SAVEPOINT op_probe").execute(&mut *tx).await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_typed_column_blocker", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_typed_column_blocker; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_planner_metadata_eq"] + #[doc(hidden)] + pub const matrix_text_eq_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_planner_metadata_eq", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1479usize, + start_col: 22usize, + end_line: 1479usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_planner_metadata_eq()), + ), + }; + fn matrix_text_eq_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_text_eq_planner_metadata_eq( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let ops: &[&str] = &["=", "<>"]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_planner_metadata_eq", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_planner_metadata_eq; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_planner_metadata_eq"] + #[doc(hidden)] + pub const matrix_text_ord_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_planner_metadata_eq", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1479usize, + start_col: 22usize, + end_line: 1479usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_planner_metadata_eq()), + ), + }; + fn matrix_text_ord_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_text_ord_planner_metadata_eq( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let ops: &[&str] = &["=", "<>"]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_planner_metadata_eq", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_planner_metadata_eq; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_planner_metadata_eq"] + #[doc(hidden)] + pub const matrix_text_ord_ore_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_planner_metadata_eq", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1479usize, + start_col: 22usize, + end_line: 1479usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_planner_metadata_eq()), + ), + }; + fn matrix_text_ord_ore_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_planner_metadata_eq( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let ops: &[&str] = &["=", "<>"]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_planner_metadata_eq", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_planner_metadata_eq; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_planner_metadata_eq"] + #[doc(hidden)] + pub const matrix_text_search_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_planner_metadata_eq", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1479usize, + start_col: 22usize, + end_line: 1479usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_planner_metadata_eq()), + ), + }; + fn matrix_text_search_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_text_search_planner_metadata_eq( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let ops: &[&str] = &["=", "<>"]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_planner_metadata_eq", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_planner_metadata_eq; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_planner_metadata_ord"] + #[doc(hidden)] + pub const matrix_text_ord_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_planner_metadata_ord", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1479usize, + start_col: 22usize, + end_line: 1479usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_planner_metadata_ord()), + ), + }; + fn matrix_text_ord_planner_metadata_ord() -> anyhow::Result<()> { + async fn matrix_text_ord_planner_metadata_ord( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let ops: &[&str] = &["<", "<=", ">", ">="]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_planner_metadata_ord", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_planner_metadata_ord; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_planner_metadata_ord"] + #[doc(hidden)] + pub const matrix_text_ord_ore_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_planner_metadata_ord", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1479usize, + start_col: 22usize, + end_line: 1479usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_planner_metadata_ord()), + ), + }; + fn matrix_text_ord_ore_planner_metadata_ord() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_planner_metadata_ord( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let ops: &[&str] = &["<", "<=", ">", ">="]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_planner_metadata_ord", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_planner_metadata_ord; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_planner_metadata_ord"] + #[doc(hidden)] + pub const matrix_text_search_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_planner_metadata_ord", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1479usize, + start_col: 22usize, + end_line: 1479usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_planner_metadata_ord()), + ), + }; + fn matrix_text_search_planner_metadata_ord() -> anyhow::Result<()> { + async fn matrix_text_search_planner_metadata_ord( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let ops: &[&str] = &["<", "<=", ">", ">="]; + let op_list = ops + .iter() + .map(|o| ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("\'{0}\'", o)) + })) + .collect::>() + .join(", "); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "\n SELECT o.oprname,\n lt.typname AS lhs,\n rt.typname AS rhs,\n o.oprcom <> 0 AS has_commutator,\n o.oprnegate <> 0 AS has_negator,\n o.oprrest::oid <> 0 AS has_restrict,\n o.oprjoin::oid <> 0 AS has_join\n FROM pg_catalog.pg_operator o\n JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft\n JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright\n WHERE o.oprname IN ({0})\n AND (\'{1}\'::regtype = o.oprleft OR \'{1}\'::regtype = o.oprright)\n ", + op_list, + d, + ), + ) + }); + let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as( + &sql, + ) + .fetch_all(&pool) + .await?; + let expected = ops.len() * 3; + if ::anyhow::__private::not(rows.len() == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected {2} rows ({0} ops x 3 arg shapes) on {3}, got {1}", + ops.len(), + rows.len(), + expected, + d, + ), + ) + }), + ), + ); + } + for (op, lhs, rhs, has_com, has_neg, has_rest, has_join) in &rows { + if ::anyhow::__private::not(*has_com) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare COMMUTATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_neg) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare NEGATOR", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_rest) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare RESTRICT", + op, + lhs, + rhs, + ), + ); + error + }); + } + if ::anyhow::__private::not(*has_join) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "operator {0}({1},{2}) must declare JOIN", + op, + lhs, + rhs, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_planner_metadata_ord", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_planner_metadata_ord; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_index_engages_btree"] + #[doc(hidden)] + pub const matrix_text_eq_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_index_engages_btree()), + ), + }; + fn matrix_text_eq_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_text_eq_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["="], + )?; + let table = "matrix_text_eq_idx_btree"; + let index = "matrix_text_eq_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_index_engages_hash"] + #[doc(hidden)] + pub const matrix_text_eq_index_engages_hash: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_index_engages_hash", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_index_engages_hash()), + ), + }; + fn matrix_text_eq_index_engages_hash() -> anyhow::Result<()> { + async fn matrix_text_eq_index_engages_hash( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["="], + )?; + let table = "matrix_text_eq_idx_hash"; + let index = "matrix_text_eq_idx_hash_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "hash", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_index_engages_hash", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_index_engages_hash; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_index_engages_btree"] + #[doc(hidden)] + pub const matrix_text_ord_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_index_engages_btree()), + ), + }; + fn matrix_text_ord_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_text_ord_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["<", "<=", ">", ">="], + )?; + let table = "matrix_text_ord_idx_btree"; + let index = "matrix_text_ord_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_eqidx_index_engages_btree"] + #[doc(hidden)] + pub const matrix_text_ord_eqidx_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_eqidx_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_eqidx_index_engages_btree()), + ), + }; + fn matrix_text_ord_eqidx_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_text_ord_eqidx_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["="], + )?; + let table = "matrix_text_ord_eqidx_idx_btree"; + let index = "matrix_text_ord_eqidx_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_eqidx_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_eqidx_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_index_engages_btree"] + #[doc(hidden)] + pub const matrix_text_ord_ore_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_index_engages_btree()), + ), + }; + fn matrix_text_ord_ore_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["<", "<=", ">", ">="], + )?; + let table = "matrix_text_ord_ore_idx_btree"; + let index = "matrix_text_ord_ore_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_eqidx_index_engages_btree"] + #[doc(hidden)] + pub const matrix_text_ord_ore_eqidx_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_eqidx_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_eqidx_index_engages_btree()), + ), + }; + fn matrix_text_ord_ore_eqidx_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_eqidx_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["="], + )?; + let table = "matrix_text_ord_ore_eqidx_idx_btree"; + let index = "matrix_text_ord_ore_eqidx_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_eqidx_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_eqidx_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_index_engages_btree"] + #[doc(hidden)] + pub const matrix_text_search_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_index_engages_btree()), + ), + }; + fn matrix_text_search_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_text_search_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["<", "<=", ">", ">="], + )?; + let table = "matrix_text_search_idx_btree"; + let index = "matrix_text_search_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "<=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "<=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + ">=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + ">=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_eqidx_index_engages_btree"] + #[doc(hidden)] + pub const matrix_text_search_eqidx_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_eqidx_index_engages_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2392usize, + start_col: 22usize, + end_line: 2392usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_eqidx_index_engages_btree()), + ), + }; + fn matrix_text_search_eqidx_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_text_search_eqidx_index_engages_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let extractor = ::eql_tests::scalar_domains::combo_extractor( + &spec, + &["="], + )?; + let table = "matrix_text_search_eqidx_idx_btree"; + let index = "matrix_text_search_eqidx_idx_btree_idx"; + let fixture_table = ::fixture_table_name(); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {2} (plaintext {0}, value {1}) ON COMMIT DROP", + ::PG_TYPE, + &spec.sql_domain, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {3}(plaintext, value) SELECT plaintext, ({0})::{1} FROM {2}", + &spec.column_expr, + &spec.sql_domain, + fixture_table, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot: String = ::fixture_values()[0] + .clone(); + let payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let lit = ::eql_tests::scalar_domains::sql_string_literal(&payload); + let rhs_casts = [ + ::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("::{0}", &spec.sql_domain)) + }), + String::new(), + ]; + for rhs_cast in &rhs_casts { + let query = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {2} WHERE value {0} {3}::jsonb{1}", + "=", + rhs_cast, + table, + lit, + ), + ) + }); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &query, + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} rhs_cast={2:?} must use index={3}", + &spec.sql_domain, + "=", + rhs_cast, + index, + ), + ) + }), + ) + .await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_eqidx_index_engages_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_eqidx_index_engages_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_scale_preference_default_btree"] + #[doc(hidden)] + pub const matrix_text_ord_scale_preference_default_btree: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_scale_preference_default_btree", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1794usize, + start_col: 22usize, + end_line: 1794usize, + end_col: 86usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_scale_preference_default_btree()), + ), + }; + fn matrix_text_ord_scale_preference_default_btree() -> anyhow::Result<()> { + async fn matrix_text_ord_scale_preference_default_btree( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let extractor = spec + .extractor_for_op("=") + .ok_or_else(|| { + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "{0} declares no extractor for `=` but is wired as a scale-default combo", + &spec.sql_domain, + ), + ) + }), + ) + })?; + let table = "matrix_text_ord_scaledef_btree"; + let index = "matrix_text_ord_scaledef_btree_idx"; + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "scale test requires >= 2 fixture rows for distinct filler/pivot", + ), + ); + error + }); + } + let filler = values[0].clone(); + let pivot = values[values.len() / 2].clone(); + let filler_payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, filler) + .await?; + let pivot_payload = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, pivot) + .await?; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (value {1}) ON COMMIT DROP", + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {0}(value) SELECT $1::jsonb::{1} FROM generate_series(1, 5000)", + table, + d, + ), + ) + }), + ) + .bind(&filler_payload) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {0}(value) VALUES ($1::jsonb::{1})", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {2} ON {3} USING {0} ({1}(value))", + "btree", + extractor, + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + let lit = pivot_payload.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value = \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "with seqscan ON the planner must PREFER the {0} functional index for a selective =", + extractor, + ), + ) + }), + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_scale_preference_default_btree", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_scale_preference_default_btree; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_fixture_shape"] + #[doc(hidden)] + pub const matrix_text_fixture_shape: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_fixture_shape"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 1885usize, + start_col: 22usize, + end_line: 1885usize, + end_col: 55usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_fixture_shape()), + ), + }; + fn matrix_text_fixture_shape() -> anyhow::Result<()> { + async fn matrix_text_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let table = ::fixture_table_name(); + let expected: &[String] = ::fixture_values(); + let n = expected.len() as i64; + let count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT COUNT(*) FROM {0}", table), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(count == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "row count must match FIXTURE_VALUES.len(): want {0}, got {1}", + n, + count, + ), + ); + error + }); + } + let ids: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT id FROM {0} ORDER BY id", table), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not(ids == (1..=n).collect::>()) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("ids must be sequential from 1: got {0:?}", ids), + ); + error + }); + } + let plaintexts: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("SELECT plaintext FROM {0} ORDER BY id", table), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not(plaintexts == expected) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "plaintext column must match FIXTURE_VALUES in order", + ), + ); + error + }); + } + if ::eql_tests::scalar_domains::token_is_storage_only( + ::PG_TYPE, + ) { + let missing_c: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload->\'c\' IS NULL OR jsonb_typeof(payload->\'c\') <> \'string\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(missing_c == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "every storage-only payload must carry a `c string` term; missing = {0}", + missing_c, + ), + ); + error + }); + } + for term in ["hm", "ob", "bf"] { + let present: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'{1}\'", + table, + term, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(present == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "storage-only payload must NOT carry a `{0}` term; present = {1}", + term, + present, + ), + ); + error + }); + } + } + } else { + let mut term_checks: Vec<(&str, &str)> = ::alloc::boxed::box_assume_init_into_vec_unsafe( + ::alloc::intrinsics::write_box_via_move( + ::alloc::boxed::Box::new_uninit(), + [ + ( + "hm string", + "payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", + ), + ( + "ob array", + "payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", + ), + ( + "c string", + "payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", + ), + ], + ), + ); + if ::eql_tests::scalar_domains::token_has_bloom_term( + ::PG_TYPE, + ) { + term_checks + .push(( + "bf array", + "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", + )); + } + for (label, predicate) in term_checks { + let missing: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE {1}", + table, + predicate, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(missing == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "every payload must carry a `{0}` term; missing = {1}", + label, + missing, + ), + ); + error + }); + } + } + let distinct_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT payload->>\'hm\') FROM {0}", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(distinct_hm == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0} distinct values -> {0} distinct hm terms; got {1}", + n, + distinct_hm, + ), + ); + error + }); + } + } + let mismatched_version: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload->\'v\' IS NULL OR payload->>\'v\' <> \'2\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(mismatched_version == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("every payload must declare v = \'2\'"), + ); + error + }); + } + if !expected.is_empty() { + let probe = &expected[expected.len() / 2]; + let probe_lit = ::to_sql_literal(probe); + let expected_id = (expected.len() / 2 + 1) as i64; + let ids: Vec = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT id FROM {1} WHERE plaintext = {0} ORDER BY id", + probe_lit, + table, + ), + ) + }), + ) + .fetch_all(&pool) + .await?; + if ::anyhow::__private::not( + ids + == ::alloc::boxed::box_assume_init_into_vec_unsafe( + ::alloc::intrinsics::write_box_via_move( + ::alloc::boxed::Box::new_uninit(), + [expected_id], + ), + ), + ) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "expected exactly one row with plaintext = {0:?} at id {1}, got {2:?}", + probe, + expected_id, + ids, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_fixture_shape", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_fixture_shape; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ord_routes_through_ob"] + #[doc(hidden)] + pub const matrix_text_ord_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ord_routes_through_ob", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2018usize, + start_col: 22usize, + end_line: 2018usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ord_routes_through_ob()), + ), + }; + fn matrix_text_ord_ord_routes_through_ob() -> anyhow::Result<()> { + async fn matrix_text_ord_ord_routes_through_ob( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let token = ::PG_TYPE; + let table = "matrix_text_ord_routing"; + let index = "matrix_text_ord_routing_idx"; + let fixture_table = ::fixture_table_name(); + let pivot: String = ::fixture_values()[0].clone(); + let pivot_lit = ::to_sql_literal(&pivot); + let carries_hm = spec + .variant + .terms_for(token) + .iter() + .any(|t| t.json_key() == "hm"); + let (extractor, value_expr, caveat): (&str, &str, &str) = if carries_hm { + ( + "eql_v3.eq_term", + "payload", + "= must engage the eql_v3.eq_term functional btree (exact hm), never ORE", + ) + } else { + ( + "eql_v3.ord_term", + "(payload - 'hm')", + "= must engage the eql_v3.ord_term functional btree with no hm", + ) + }; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {1} (plaintext {0}, value {2}) ON COMMIT DROP", + ::PG_TYPE, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, {2}::{3} FROM {0}", + fixture_table, + table, + value_expr, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + if !carries_hm { + let with_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", + table, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(with_hm == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("test rows must not carry hm"), + ); + error + }); + } + } + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {0} ON {1} USING btree ({2}(value))", + index, + table, + extractor, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot_payload: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {2}::text FROM {0} WHERE plaintext = {1}", + fixture_table, + pivot_lit, + value_expr, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let eq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value = $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(eq_count == 1) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "= must match exactly the pivot row (want 1, got {0})", + eq_count, + ), + ); + error + }); + } + let expected_neq = ::fixture_values().len() as i64 + - eq_count; + let neq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value <> $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(neq_count == expected_neq) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "<> must match every non-pivot fixture row (want {0}, got {1})", + expected_neq, + neq_count, + ), + ); + error + }); + } + let lit = pivot_payload.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value = \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + caveat, + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ord_routes_through_ob", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ord_routes_through_ob; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_ord_routes_through_ob"] + #[doc(hidden)] + pub const matrix_text_ord_ore_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_ord_routes_through_ob", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2018usize, + start_col: 22usize, + end_line: 2018usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_ord_routes_through_ob()), + ), + }; + fn matrix_text_ord_ore_ord_routes_through_ob() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_ord_routes_through_ob( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let token = ::PG_TYPE; + let table = "matrix_text_ord_ore_routing"; + let index = "matrix_text_ord_ore_routing_idx"; + let fixture_table = ::fixture_table_name(); + let pivot: String = ::fixture_values()[0].clone(); + let pivot_lit = ::to_sql_literal(&pivot); + let carries_hm = spec + .variant + .terms_for(token) + .iter() + .any(|t| t.json_key() == "hm"); + let (extractor, value_expr, caveat): (&str, &str, &str) = if carries_hm { + ( + "eql_v3.eq_term", + "payload", + "= must engage the eql_v3.eq_term functional btree (exact hm), never ORE", + ) + } else { + ( + "eql_v3.ord_term", + "(payload - 'hm')", + "= must engage the eql_v3.ord_term functional btree with no hm", + ) + }; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {1} (plaintext {0}, value {2}) ON COMMIT DROP", + ::PG_TYPE, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, {2}::{3} FROM {0}", + fixture_table, + table, + value_expr, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + if !carries_hm { + let with_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", + table, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(with_hm == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("test rows must not carry hm"), + ); + error + }); + } + } + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {0} ON {1} USING btree ({2}(value))", + index, + table, + extractor, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot_payload: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {2}::text FROM {0} WHERE plaintext = {1}", + fixture_table, + pivot_lit, + value_expr, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let eq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value = $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(eq_count == 1) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "= must match exactly the pivot row (want 1, got {0})", + eq_count, + ), + ); + error + }); + } + let expected_neq = ::fixture_values().len() as i64 + - eq_count; + let neq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value <> $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(neq_count == expected_neq) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "<> must match every non-pivot fixture row (want {0}, got {1})", + expected_neq, + neq_count, + ), + ); + error + }); + } + let lit = pivot_payload.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value = \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + caveat, + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_ord_routes_through_ob", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_ord_routes_through_ob; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_ord_routes_through_ob"] + #[doc(hidden)] + pub const matrix_text_search_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_ord_routes_through_ob", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2018usize, + start_col: 22usize, + end_line: 2018usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_ord_routes_through_ob()), + ), + }; + fn matrix_text_search_ord_routes_through_ob() -> anyhow::Result<()> { + async fn matrix_text_search_ord_routes_through_ob( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let token = ::PG_TYPE; + let table = "matrix_text_search_routing"; + let index = "matrix_text_search_routing_idx"; + let fixture_table = ::fixture_table_name(); + let pivot: String = ::fixture_values()[0].clone(); + let pivot_lit = ::to_sql_literal(&pivot); + let carries_hm = spec + .variant + .terms_for(token) + .iter() + .any(|t| t.json_key() == "hm"); + let (extractor, value_expr, caveat): (&str, &str, &str) = if carries_hm { + ( + "eql_v3.eq_term", + "payload", + "= must engage the eql_v3.eq_term functional btree (exact hm), never ORE", + ) + } else { + ( + "eql_v3.ord_term", + "(payload - 'hm')", + "= must engage the eql_v3.ord_term functional btree with no hm", + ) + }; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {1} (plaintext {0}, value {2}) ON COMMIT DROP", + ::PG_TYPE, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT plaintext, {2}::{3} FROM {0}", + fixture_table, + table, + value_expr, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + if !carries_hm { + let with_hm: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE jsonb_exists(value::jsonb, \'hm\')", + table, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(with_hm == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!("test rows must not carry hm"), + ); + error + }); + } + } + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {0} ON {1} USING btree ({2}(value))", + index, + table, + extractor, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let pivot_payload: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {2}::text FROM {0} WHERE plaintext = {1}", + fixture_table, + pivot_lit, + value_expr, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let eq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value = $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(eq_count == 1) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "= must match exactly the pivot row (want 1, got {0})", + eq_count, + ), + ); + error + }); + } + let expected_neq = ::fixture_values().len() as i64 + - eq_count; + let neq_count: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} WHERE value <> $1::jsonb::{1}", + table, + d, + ), + ) + }), + ) + .bind(&pivot_payload) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(neq_count == expected_neq) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "<> must match every non-pivot fixture row (want {0}, got {1})", + expected_neq, + neq_count, + ), + ); + error + }); + } + let lit = pivot_payload.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value = \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + caveat, + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_ord_routes_through_ob", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_ord_routes_through_ob; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_match_contains_self"] + #[doc(hidden)] + pub const matrix_text_search_match_contains_self: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_match_contains_self", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2190usize, + start_col: 22usize, + end_line: 2190usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_match_contains_self()), + ), + }; + fn matrix_text_search_match_contains_self() -> anyhow::Result<()> { + async fn matrix_text_search_match_contains_self( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::MatchScalar; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let hay = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, ::haystack()) + .await?; + let hit: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT ($1::jsonb::{0}) @> ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(&hay) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(hit) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0}: a value\'s bloom filter must contain itself", + d, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_match_contains_self", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_match_contains_self; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_match_contains_needle"] + #[doc(hidden)] + pub const matrix_text_search_match_contains_needle: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_match_contains_needle", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2206usize, + start_col: 22usize, + end_line: 2206usize, + end_col: 75usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_match_contains_needle()), + ), + }; + fn matrix_text_search_match_contains_needle() -> anyhow::Result<()> { + async fn matrix_text_search_match_contains_needle( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::MatchScalar; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let hay = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, ::haystack()) + .await?; + let needle = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, ::needle()) + .await?; + let hit: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT ($1::jsonb::{0}) @> ($2::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(&hay) + .bind(&needle) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(hit) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0}: haystack bloom must contain its shared-ngram needle", + d, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_match_contains_needle", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_match_contains_needle; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_match_disjoint_miss"] + #[doc(hidden)] + pub const matrix_text_search_match_disjoint_miss: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_match_disjoint_miss", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2225usize, + start_col: 22usize, + end_line: 2225usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_match_disjoint_miss()), + ), + }; + fn matrix_text_search_match_disjoint_miss() -> anyhow::Result<()> { + async fn matrix_text_search_match_disjoint_miss( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::MatchScalar; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let needle = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, ::needle()) + .await?; + let disjoint = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, ::disjoint()) + .await?; + let hit: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT ($1::jsonb::{0}) @> ($2::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(&needle) + .bind(&disjoint) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(!hit) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0}: needle bloom must NOT contain an ngram-disjoint value", + d, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_match_disjoint_miss", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_match_disjoint_miss; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_match_index_engages_gin"] + #[doc(hidden)] + pub const matrix_text_search_match_index_engages_gin: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_match_index_engages_gin", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2251usize, + start_col: 22usize, + end_line: 2251usize, + end_col: 77usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_match_index_engages_gin()), + ), + }; + fn matrix_text_search_match_index_engages_gin() -> anyhow::Result<()> { + async fn matrix_text_search_match_index_engages_gin( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{MatchScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let table = "matrix_text_search_match"; + let index = "matrix_text_search_match_idx"; + let fixture_table = ::fixture_table_name(); + let needle = ::eql_tests::scalar_domains::fetch_fixture_payload::< + String, + >(&pool, ::needle()) + .await?; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (value {1}) ON COMMIT DROP", + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(value) SELECT payload::{2} FROM {0}", + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE INDEX {0} ON {1} USING gin (eql_v3.match_term(value))", + index, + table, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("ANALYZE {0}", table)) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query("SET LOCAL enable_seqscan = off").execute(&mut *tx).await?; + let lit = needle.replace('\'', "''"); + ::eql_tests::matrix::assert_index_scan_uses( + &mut *tx, + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT * FROM {0} WHERE value @> \'{1}\'::jsonb::{2}", + table, + lit, + d, + ), + ) + }), + index, + "bare @> must engage the eql_v3.match_term functional GIN index", + ) + .await?; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_match_index_engages_gin", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_match_index_engages_gin; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_ore_injectivity"] + #[doc(hidden)] + pub const matrix_text_ord_ore_ore_injectivity: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_ore_injectivity", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2329usize, + start_col: 22usize, + end_line: 2329usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_ore_injectivity()), + ), + }; + fn matrix_text_ord_ore_ore_injectivity() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_ore_injectivity( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture_table = ::fixture_table_name(); + let collisions: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT count(*) FROM {0} a JOIN {0} b ON a.id < b.id WHERE a.payload::{1} = b.payload::{1}", + fixture_table, + d, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(collisions == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "no two distinct plaintexts may share an ORE term on {0}", + d, + ), + ); + error + }); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_ore_injectivity", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_ore_injectivity; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_min"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_ord_aggregate_min"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2862usize, + start_col: 22usize, + end_line: 2862usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_min()), + ), + }; + fn matrix_text_ord_aggregate_min() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let extremum: String = ::fixture_values() + .iter() + .cloned() + .min() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(&extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + extremum_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", + "min", + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "min", + d, + extremum, + "min", + ), + ), + ); + } + } + }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "min", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", + "min", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_aggregate_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_min_empty"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_min_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2922usize, + start_col: 22usize, + end_line: 2922usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_min_empty()), + ), + }; + fn matrix_text_ord_aggregate_min_empty() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_min_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM empty_agg", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", + "min", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_min_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_aggregate_min_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_min_all_null"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_min_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2947usize, + start_col: 22usize, + end_line: 2947usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_min_all_null()), + ), + }; + fn matrix_text_ord_aggregate_min_all_null() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_min_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "min", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "min", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_min_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_aggregate_min_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_min_mixed_null"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_min_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2973usize, + start_col: 22usize, + end_line: 2973usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_min_mixed_null()), + ), + }; + fn matrix_text_ord_aggregate_min_mixed_null() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_min_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: String = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: String = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: String = low.clone().min(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); + let expected_lit = ::to_sql_literal( + &expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + col, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + expected_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM mixed_null", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "min", + "min", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_min_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_aggregate_min_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_max"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_ord_aggregate_max"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2862usize, + start_col: 22usize, + end_line: 2862usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_max()), + ), + }; + fn matrix_text_ord_aggregate_max() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let extremum: String = ::fixture_values() + .iter() + .cloned() + .max() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(&extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + extremum_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", + "max", + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "max", + d, + extremum, + "max", + ), + ), + ); + } + } + }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "max", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", + "max", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_aggregate_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_max_empty"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_max_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2922usize, + start_col: 22usize, + end_line: 2922usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_max_empty()), + ), + }; + fn matrix_text_ord_aggregate_max_empty() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_max_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM empty_agg", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", + "max", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_max_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_aggregate_max_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_max_all_null"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_max_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2947usize, + start_col: 22usize, + end_line: 2947usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_max_all_null()), + ), + }; + fn matrix_text_ord_aggregate_max_all_null() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_max_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "max", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "max", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_max_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_aggregate_max_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_max_mixed_null"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_max_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2973usize, + start_col: 22usize, + end_line: 2973usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_max_mixed_null()), + ), + }; + fn matrix_text_ord_aggregate_max_mixed_null() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_max_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: String = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: String = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: String = low.clone().max(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); + let expected_lit = ::to_sql_literal( + &expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + col, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + expected_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM mixed_null", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "max", + "max", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_max_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_aggregate_max_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_min"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2862usize, + start_col: 22usize, + end_line: 2862usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_min()), + ), + }; + fn matrix_text_ord_ore_aggregate_min() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let extremum: String = ::fixture_values() + .iter() + .cloned() + .min() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(&extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + extremum_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", + "min", + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "min", + d, + extremum, + "min", + ), + ), + ); + } + } + }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "min", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", + "min", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_min_empty"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_min_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2922usize, + start_col: 22usize, + end_line: 2922usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_min_empty()), + ), + }; + fn matrix_text_ord_ore_aggregate_min_empty() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_min_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM empty_agg", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", + "min", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_min_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_min_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_min_all_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_min_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2947usize, + start_col: 22usize, + end_line: 2947usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_min_all_null()), + ), + }; + fn matrix_text_ord_ore_aggregate_min_all_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_min_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "min", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "min", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_min_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_min_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_min_mixed_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_min_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2973usize, + start_col: 22usize, + end_line: 2973usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_min_mixed_null()), + ), + }; + fn matrix_text_ord_ore_aggregate_min_mixed_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_min_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: String = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: String = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: String = low.clone().min(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); + let expected_lit = ::to_sql_literal( + &expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + col, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + expected_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM mixed_null", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "min", + "min", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_min_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_min_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_max"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2862usize, + start_col: 22usize, + end_line: 2862usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_max()), + ), + }; + fn matrix_text_ord_ore_aggregate_max() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let extremum: String = ::fixture_values() + .iter() + .cloned() + .max() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(&extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + extremum_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", + "max", + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "max", + d, + extremum, + "max", + ), + ), + ); + } + } + }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "max", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", + "max", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_max_empty"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_max_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2922usize, + start_col: 22usize, + end_line: 2922usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_max_empty()), + ), + }; + fn matrix_text_ord_ore_aggregate_max_empty() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_max_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM empty_agg", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", + "max", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_max_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_max_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_max_all_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_max_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2947usize, + start_col: 22usize, + end_line: 2947usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_max_all_null()), + ), + }; + fn matrix_text_ord_ore_aggregate_max_all_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_max_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "max", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "max", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_max_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_max_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_max_mixed_null"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_max_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2973usize, + start_col: 22usize, + end_line: 2973usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_max_mixed_null()), + ), + }; + fn matrix_text_ord_ore_aggregate_max_mixed_null() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_max_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: String = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: String = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: String = low.clone().max(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); + let expected_lit = ::to_sql_literal( + &expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + col, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + expected_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM mixed_null", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "max", + "max", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_max_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_max_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_min"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2862usize, + start_col: 22usize, + end_line: 2862usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_min()), + ), + }; + fn matrix_text_search_aggregate_min() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let extremum: String = ::fixture_values() + .iter() + .cloned() + .min() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(&extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + extremum_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", + "min", + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "min", + d, + extremum, + "min", + ), + ), + ); + } + } + }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "min", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", + "min", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_aggregate_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_min_empty"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_min_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2922usize, + start_col: 22usize, + end_line: 2922usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_min_empty()), + ), + }; + fn matrix_text_search_aggregate_min_empty() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_min_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM empty_agg", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", + "min", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_min_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_aggregate_min_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_min_all_null"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_min_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2947usize, + start_col: 22usize, + end_line: 2947usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_min_all_null()), + ), + }; + fn matrix_text_search_aggregate_min_all_null() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_min_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "min", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "min", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_min_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_aggregate_min_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_min_mixed_null"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_min_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2973usize, + start_col: 22usize, + end_line: 2973usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_min_mixed_null()), + ), + }; + fn matrix_text_search_aggregate_min_mixed_null() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_min_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: String = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: String = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: String = low.clone().min(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); + let expected_lit = ::to_sql_literal( + &expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + col, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + expected_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM mixed_null", + "min", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "min", + "min", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_min_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_aggregate_min_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_max"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2862usize, + start_col: 22usize, + end_line: 2862usize, + end_col: 73usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_max()), + ), + }; + fn matrix_text_search_aggregate_max() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let extremum: String = ::fixture_values() + .iter() + .cloned() + .max() + .expect("FIXTURE_VALUES must be non-empty"); + let extremum_lit = ::to_sql_literal(&extremum); + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + extremum_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + let actual: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(({1})::{2})::text FROM {3}", + "max", + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "eql_v3.{0}({1}) must return the payload of plaintext={2:?} (the fixture {3})", + "max", + d, + extremum, + "max", + ), + ), + ); + } + } + }; + let lhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!("eql_v3.{0}(({1})::{2})", "max", col, d), + ) + }), + ); + let rhs_ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("$1::jsonb::{0}", d)) + }), + ); + let ord_terms_match: bool = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT {0} = {1} FROM {2}", + lhs_ord, + rhs_ord, + fixture, + ), + ) + }), + ) + .bind(&expected) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(ord_terms_match) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.ord_term(eql_v3.{0}({1})) must equal eql_v3.ord_term() for plaintext={2:?}", + "max", + d, + extremum, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_aggregate_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_max_empty"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_max_empty", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2922usize, + start_col: 22usize, + end_line: 2922usize, + end_col: 80usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_max_empty()), + ), + }; + fn matrix_text_search_aggregate_max_empty() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_max_empty( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE empty_agg (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let result: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM empty_agg", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "empty rowset to eql_v3.{0} on {1} must return NULL, got {2:?}", + "max", + d, + result, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_max_empty", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_aggregate_max_empty; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_max_all_null"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_max_all_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2947usize, + start_col: 22usize, + end_line: 2947usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_max_all_null()), + ), + }; + fn matrix_text_search_aggregate_max_all_null() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_max_all_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(NULL::{1})::text FROM generate_series(1, 3)", + "max", + d, + ), + ) + }); + let result: Option = sqlx::query_scalar(&sql) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(result.is_none()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "all-NULL input to eql_v3.{0} on {1} must return NULL, got {2:?}; SQL={3}", + "max", + d, + result, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_max_all_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_aggregate_max_all_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_max_mixed_null"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_max_mixed_null", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2973usize, + start_col: 22usize, + end_line: 2973usize, + end_col: 85usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_max_mixed_null()), + ), + }; + fn matrix_text_search_aggregate_max_mixed_null() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_max_mixed_null( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "mixed-NULL test needs >= 2 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let mut sorted: Vec = values.to_vec(); + sorted.sort(); + let low: String = sorted + .first() + .expect("non-empty after len check") + .clone(); + let high: String = sorted + .last() + .expect("non-empty after len check") + .clone(); + let expected_plaintext: String = low.clone().max(high.clone()); + let low_lit = ::to_sql_literal(&low); + let high_lit = ::to_sql_literal(&high); + let expected_lit = ::to_sql_literal( + &expected_plaintext, + ); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE mixed_null (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO mixed_null(value) SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {0} UNION ALL SELECT NULL::{2} UNION ALL SELECT ({3})::{2} FROM {4} WHERE plaintext = {1} UNION ALL SELECT NULL::{2}", + low_lit, + high_lit, + d, + col, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + expected_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let actual: Option = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value)::text FROM mixed_null", + "max", + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not( + actual.as_deref() == Some(expected.as_str()), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on mixed NULL/non-NULL must return the {1} non-NULL value (plaintext={2:?}); want {3:?}, got {4:?}", + "max", + "max", + expected_plaintext, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_max_mixed_null", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_aggregate_max_mixed_null; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_group_by_min"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_group_by_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3154usize, + start_col: 22usize, + end_line: 3154usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_group_by_min()), + ), + }; + fn matrix_text_ord_aggregate_group_by_min() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_group_by_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[String] = &values[..3]; + let group2: &[String] = &values[3..5]; + let group1_extremum: String = group1 + .iter() + .cloned() + .min() + .expect("group 1 is non-empty"); + let group2_extremum: String = group2 + .iter() + .cloned() + .min() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g1_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g2_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "min", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_group_by_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_aggregate_group_by_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_group_by_max"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_group_by_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3154usize, + start_col: 22usize, + end_line: 3154usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_group_by_max()), + ), + }; + fn matrix_text_ord_aggregate_group_by_max() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_group_by_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[String] = &values[..3]; + let group2: &[String] = &values[3..5]; + let group1_extremum: String = group1 + .iter() + .cloned() + .max() + .expect("group 1 is non-empty"); + let group2_extremum: String = group2 + .iter() + .cloned() + .max() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g1_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g2_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "max", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_group_by_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_aggregate_group_by_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_group_by_min"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_group_by_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3154usize, + start_col: 22usize, + end_line: 3154usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_group_by_min()), + ), + }; + fn matrix_text_ord_ore_aggregate_group_by_min() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_group_by_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[String] = &values[..3]; + let group2: &[String] = &values[3..5]; + let group1_extremum: String = group1 + .iter() + .cloned() + .min() + .expect("group 1 is non-empty"); + let group2_extremum: String = group2 + .iter() + .cloned() + .min() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g1_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g2_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "min", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_group_by_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_group_by_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_group_by_max"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_group_by_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3154usize, + start_col: 22usize, + end_line: 3154usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_group_by_max()), + ), + }; + fn matrix_text_ord_ore_aggregate_group_by_max() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_group_by_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[String] = &values[..3]; + let group2: &[String] = &values[3..5]; + let group1_extremum: String = group1 + .iter() + .cloned() + .max() + .expect("group 1 is non-empty"); + let group2_extremum: String = group2 + .iter() + .cloned() + .max() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g1_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g2_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "max", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_group_by_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_group_by_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_group_by_min"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_group_by_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3154usize, + start_col: 22usize, + end_line: 3154usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_group_by_min()), + ), + }; + fn matrix_text_search_aggregate_group_by_min() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_group_by_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[String] = &values[..3]; + let group2: &[String] = &values[3..5]; + let group1_extremum: String = group1 + .iter() + .cloned() + .min() + .expect("group 1 is non-empty"); + let group2_extremum: String = group2 + .iter() + .cloned() + .min() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g1_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g2_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "min", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "min", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_group_by_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_aggregate_group_by_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_group_by_max"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_group_by_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3154usize, + start_col: 22usize, + end_line: 3154usize, + end_col: 82usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_group_by_max()), + ), + }; + fn matrix_text_search_aggregate_group_by_max() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_group_by_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let col = &spec.column_expr; + let fixture = ::fixture_table_name(); + let values: &[String] = ::fixture_values(); + if ::anyhow::__private::not(values.len() >= 5) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY test needs >= 5 fixture values; got {0}", + values.len(), + ), + ) + }), + ), + ); + } + let group1: &[String] = &values[..3]; + let group2: &[String] = &values[3..5]; + let group1_extremum: String = group1 + .iter() + .cloned() + .max() + .expect("group 1 is non-empty"); + let group2_extremum: String = group2 + .iter() + .cloned() + .max() + .expect("group 2 is non-empty"); + let g1_lit = ::to_sql_literal(&group1_extremum); + let g2_lit = ::to_sql_literal(&group2_extremum); + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE group_test (group_key int, value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + for v in group1 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 1, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + for v in group2 { + let lit = ::to_sql_literal(v); + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO group_test(group_key, value) SELECT 2, ({0})::{1} FROM {2} WHERE plaintext = {3}", + col, + d, + fixture, + lit, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + } + let g1_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g1_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let g2_expected: String = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT (({1})::{2})::text FROM {3} WHERE plaintext = {0}", + g2_lit, + col, + d, + fixture, + ), + ) + }), + ) + .fetch_one(&mut *tx) + .await?; + let rows: Vec<(i32, String)> = sqlx::query_as( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT group_key, eql_v3.{0}(value)::text FROM group_test GROUP BY group_key ORDER BY group_key", + "max", + ), + ) + }), + ) + .fetch_all(&mut *tx) + .await?; + if ::anyhow::__private::not(rows.len() == 2) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "GROUP BY must return 2 rows, got {0}", + rows.len(), + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[0].0 == 1 && rows[0].1 == g1_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 1 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group1_extremum, + 1, + g1_expected, + rows[0], + ), + ) + }), + ), + ); + } + if ::anyhow::__private::not(rows[1].0 == 2 && rows[1].1 == g2_expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "group 2 eql_v3.{0}({1}) must yield payload for plaintext={2:?}; want ({3}, {4:?}), got {5:?}", + "max", + d, + group2_extremum, + 2, + g2_expected, + rows[1], + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_group_by_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_aggregate_group_by_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_parallel_safe"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_parallel_safe", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3069usize, + start_col: 22usize, + end_line: 3069usize, + end_col: 77usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_parallel_safe()), + ), + }; + fn matrix_text_ord_aggregate_parallel_safe() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_parallel_safe( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + for agg in ["min", "max"] { + let (proparallel, has_combine): (String, bool) = sqlx::query_as( + "SELECT p.proparallel::text, a.aggcombinefn <> 0 \ + FROM pg_proc p \ + JOIN pg_aggregate a ON a.aggfnoid = p.oid \ + WHERE p.proname = $1 \ + AND p.pronamespace = 'eql_v3'::regnamespace \ + AND p.proargtypes[0]::regtype = $2::regtype", + ) + .bind(agg) + .bind(d) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(proparallel == "s") { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v3.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", + agg, + d, + proparallel, + ), + ); + error + }); + } + if ::anyhow::__private::not(has_combine) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v3.{0}({1}) must declare a combinefunc for partial aggregation", + agg, + d, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_parallel_safe", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_aggregate_parallel_safe; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_parallel_safe"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_parallel_safe", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3069usize, + start_col: 22usize, + end_line: 3069usize, + end_col: 77usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_parallel_safe()), + ), + }; + fn matrix_text_ord_ore_aggregate_parallel_safe() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_parallel_safe( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + for agg in ["min", "max"] { + let (proparallel, has_combine): (String, bool) = sqlx::query_as( + "SELECT p.proparallel::text, a.aggcombinefn <> 0 \ + FROM pg_proc p \ + JOIN pg_aggregate a ON a.aggfnoid = p.oid \ + WHERE p.proname = $1 \ + AND p.pronamespace = 'eql_v3'::regnamespace \ + AND p.proargtypes[0]::regtype = $2::regtype", + ) + .bind(agg) + .bind(d) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(proparallel == "s") { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v3.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", + agg, + d, + proparallel, + ), + ); + error + }); + } + if ::anyhow::__private::not(has_combine) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v3.{0}({1}) must declare a combinefunc for partial aggregation", + agg, + d, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_parallel_safe", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_parallel_safe; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_parallel_safe"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_parallel_safe", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3069usize, + start_col: 22usize, + end_line: 3069usize, + end_col: 77usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_parallel_safe()), + ), + }; + fn matrix_text_search_aggregate_parallel_safe() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_parallel_safe( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + for agg in ["min", "max"] { + let (proparallel, has_combine): (String, bool) = sqlx::query_as( + "SELECT p.proparallel::text, a.aggcombinefn <> 0 \ + FROM pg_proc p \ + JOIN pg_aggregate a ON a.aggfnoid = p.oid \ + WHERE p.proname = $1 \ + AND p.pronamespace = 'eql_v3'::regnamespace \ + AND p.proargtypes[0]::regtype = $2::regtype", + ) + .bind(agg) + .bind(d) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(proparallel == "s") { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v3.{0}({1}) must be PARALLEL SAFE (proparallel=\'s\'), got {2:?}", + agg, + d, + proparallel, + ), + ); + error + }); + } + if ::anyhow::__private::not(has_combine) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "eql_v3.{0}({1}) must declare a combinefunc for partial aggregation", + agg, + d, + ), + ); + error + }); + } + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_parallel_safe", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_aggregate_parallel_safe; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_text_storage_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_aggregate_typecheck_min()), + ), + }; + fn matrix_text_storage_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_text_storage_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_text_storage_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_aggregate_typecheck_max()), + ), + }; + fn matrix_text_storage_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_text_storage_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_storage_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_text_eq_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_aggregate_typecheck_min()), + ), + }; + fn matrix_text_eq_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_text_eq_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_text_eq_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_aggregate_typecheck_max()), + ), + }; + fn matrix_text_eq_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_text_eq_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_eq_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_typecheck_min()), + ), + }; + fn matrix_text_ord_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_text_ord_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_aggregate_typecheck_max()), + ), + }; + fn matrix_text_ord_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_text_ord_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_typecheck_min()), + ), + }; + fn matrix_text_ord_ore_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_text_ord_ore_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_aggregate_typecheck_max()), + ), + }; + fn matrix_text_ord_ore_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_ord_ore_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_typecheck_min"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_typecheck_min", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_typecheck_min()), + ), + }; + fn matrix_text_search_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_typecheck_min( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "min", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "min", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "min", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "min", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_typecheck_min", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_aggregate_typecheck_min; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_aggregate_typecheck_max"] + #[doc(hidden)] + pub const matrix_text_search_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_aggregate_typecheck_max", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3313usize, + start_col: 22usize, + end_line: 3313usize, + end_col: 83usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_aggregate_typecheck_max()), + ), + }; + fn matrix_text_search_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_text_search_aggregate_typecheck_max( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let payload = ::eql_tests::helpers::PLACEHOLDER_PAYLOAD; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typecheck_table (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typecheck_table(value) VALUES ($1::jsonb::{0})", + d, + ), + ) + }), + ) + .bind(payload) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT eql_v3.{0}(value) FROM typecheck_table", + "max", + ), + ) + }); + if spec.supports_ord() { + let res = sqlx::query_scalar::<_, serde_json::Value>(&sql) + .fetch_one(&mut *tx) + .await; + if ::anyhow::__private::not(res.is_ok()) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0}({1}) on ord-capable variant must resolve, got {2:?}", + "max", + d, + res.err(), + ), + ) + }), + ), + ); + } + } else { + sqlx::query("SAVEPOINT probe").execute(&mut *tx).await?; + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_one(&mut *tx) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "eql_v3.{0} on non-ord variant {1} must raise but succeeded", + "max", + d, + ), + ) + }), + ); + let db_err = err + .as_database_error() + .expect("expected database error from typecheck probe"); + let code = db_err.code(); + if ::anyhow::__private::not( + code.as_deref() == Some("42883") + || code.as_deref() == Some("42725"), + ) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "expected SQLSTATE 42883 (undefined_function) or 42725 (ambiguous_function) for eql_v3.{0}({1}), got {2:?} (message: {3})", + "max", + d, + code, + db_err.message(), + ), + ) + }), + ), + ); + } + sqlx::query("ROLLBACK TO SAVEPOINT probe").execute(&mut *tx).await?; + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_aggregate_typecheck_max", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures(&[]); + let f: fn(_) -> _ = matrix_text_search_aggregate_typecheck_max; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_count_typed_column"] + #[doc(hidden)] + pub const matrix_text_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3427usize, + start_col: 22usize, + end_line: 3427usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_count_typed_column()), + ), + }; + fn matrix_text_storage_count_typed_column() -> anyhow::Result<()> { + async fn matrix_text_storage_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_storage_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_count_path_cast"] + #[doc(hidden)] + pub const matrix_text_storage_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_count_path_cast", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3461usize, + start_col: 22usize, + end_line: 3461usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_count_path_cast()), + ), + }; + fn matrix_text_storage_count_path_cast() -> anyhow::Result<()> { + async fn matrix_text_storage_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_storage_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_storage_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_text_storage_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_storage_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3505usize, + start_col: 22usize, + end_line: 3505usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_storage_count_distinct_extractor()), + ), + }; + fn matrix_text_storage_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_text_storage_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Storage); + let d = &spec.sql_domain; + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_storage_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_storage_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_count_typed_column"] + #[doc(hidden)] + pub const matrix_text_eq_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3427usize, + start_col: 22usize, + end_line: 3427usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_count_typed_column()), + ), + }; + fn matrix_text_eq_count_typed_column() -> anyhow::Result<()> { + async fn matrix_text_eq_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_count_path_cast"] + #[doc(hidden)] + pub const matrix_text_eq_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_eq_count_path_cast"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3461usize, + start_col: 22usize, + end_line: 3461usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_count_path_cast()), + ), + }; + fn matrix_text_eq_count_path_cast() -> anyhow::Result<()> { + async fn matrix_text_eq_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_eq_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_text_eq_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_eq_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3505usize, + start_col: 22usize, + end_line: 3505usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_eq_count_distinct_extractor()), + ), + }; + fn matrix_text_eq_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_text_eq_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Eq); + let d = &spec.sql_domain; + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_eq_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_eq_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_count_typed_column"] + #[doc(hidden)] + pub const matrix_text_ord_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3427usize, + start_col: 22usize, + end_line: 3427usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_count_typed_column()), + ), + }; + fn matrix_text_ord_count_typed_column() -> anyhow::Result<()> { + async fn matrix_text_ord_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_count_path_cast"] + #[doc(hidden)] + pub const matrix_text_ord_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName("scalars::text::matrix_text_ord_count_path_cast"), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3461usize, + start_col: 22usize, + end_line: 3461usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_count_path_cast()), + ), + }; + fn matrix_text_ord_count_path_cast() -> anyhow::Result<()> { + async fn matrix_text_ord_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_text_ord_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3505usize, + start_col: 22usize, + end_line: 3505usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_count_distinct_extractor()), + ), + }; + fn matrix_text_ord_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_text_ord_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_count_typed_column"] + #[doc(hidden)] + pub const matrix_text_ord_ore_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3427usize, + start_col: 22usize, + end_line: 3427usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_count_typed_column()), + ), + }; + fn matrix_text_ord_ore_count_typed_column() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_count_path_cast"] + #[doc(hidden)] + pub const matrix_text_ord_ore_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_count_path_cast", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3461usize, + start_col: 22usize, + end_line: 3461usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_count_path_cast()), + ), + }; + fn matrix_text_ord_ore_count_path_cast() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_text_ord_ore_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3505usize, + start_col: 22usize, + end_line: 3505usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_count_distinct_extractor()), + ), + }; + fn matrix_text_ord_ore_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_count_typed_column"] + #[doc(hidden)] + pub const matrix_text_search_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_count_typed_column", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3427usize, + start_col: 22usize, + end_line: 3427usize, + end_col: 72usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_count_typed_column()), + ), + }; + fn matrix_text_search_count_typed_column() -> anyhow::Result<()> { + async fn matrix_text_search_count_typed_column( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE typed_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO typed_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let actual: i64 = sqlx::query_scalar( + "SELECT COUNT(value) FROM typed_count", + ) + .fetch_one(&mut *tx) + .await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(value) on typed {0} column: want {1}, got {2}", + d, + expected, + actual, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_count_typed_column", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_count_typed_column; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_count_path_cast"] + #[doc(hidden)] + pub const matrix_text_search_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_count_path_cast", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3461usize, + start_col: 22usize, + end_line: 3461usize, + end_col: 69usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_count_path_cast()), + ), + }; + fn matrix_text_search_count_path_cast() -> anyhow::Result<()> { + async fn matrix_text_search_count_path_cast( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(({0})::{1}) FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&pool).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(({0})::{1}) on {2}: want {3}, got {4}; SQL={5}", + &spec.column_expr, + d, + fixture, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_count_path_cast", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_count_path_cast; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_count_distinct_extractor"] + #[doc(hidden)] + pub const matrix_text_search_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_count_distinct_extractor", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 3505usize, + start_col: 22usize, + end_line: 3505usize, + end_col: 78usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_count_distinct_extractor()), + ), + }; + fn matrix_text_search_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_text_search_count_distinct_extractor( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::ScalarType; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let Some(extractor) = spec.extractor_expr("value") else { + return Ok(()); + }; + let fixture = ::fixture_table_name(); + let expected = ::fixture_values().len() as i64; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE distinct_count (value {0}) ON COMMIT DROP", + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO distinct_count(value) SELECT ({0})::{1} FROM {2}", + &spec.column_expr, + d, + fixture, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT {0}) FROM distinct_count", + extractor, + ), + ) + }); + let actual: i64 = sqlx::query_scalar(&sql).fetch_one(&mut *tx).await?; + if ::anyhow::__private::not(actual == expected) { + return ::anyhow::__private::Err( + ::anyhow::Error::msg( + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "COUNT(DISTINCT {0}) on {1}: want {2} (one per FIXTURE_VALUES row), got {3}; SQL={4}", + extractor, + d, + expected, + actual, + sql, + ), + ) + }), + ), + ); + } + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_count_distinct_extractor", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_count_distinct_extractor; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_asc_no_where"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_asc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_asc_no_where()), + ), + }; + fn matrix_text_ord_order_by_asc_no_where() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_asc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "ASC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_asc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_asc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_desc_no_where"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_desc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_desc_no_where()), + ), + }; + fn matrix_text_ord_order_by_desc_no_where() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_desc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "DESC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_desc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_desc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_asc_with_where"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_asc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_asc_with_where()), + ), + }; + fn matrix_text_ord_order_by_asc_with_where() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_asc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "ASC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_asc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_asc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_desc_with_where"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_desc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_desc_with_where()), + ), + }; + fn matrix_text_ord_order_by_desc_with_where() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_desc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "DESC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_desc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_desc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_asc_no_where"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_asc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_asc_no_where()), + ), + }; + fn matrix_text_ord_ore_order_by_asc_no_where() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_asc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "ASC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_asc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_asc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_desc_no_where"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_desc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_desc_no_where()), + ), + }; + fn matrix_text_ord_ore_order_by_desc_no_where() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_desc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "DESC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_desc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_desc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_asc_with_where"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_asc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_asc_with_where()), + ), + }; + fn matrix_text_ord_ore_order_by_asc_with_where() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_asc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "ASC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_asc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_asc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_desc_with_where"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_desc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_desc_with_where()), + ), + }; + fn matrix_text_ord_ore_order_by_desc_with_where() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_desc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "DESC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_desc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_desc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_asc_no_where"] + #[doc(hidden)] + pub const matrix_text_search_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_asc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_asc_no_where()), + ), + }; + fn matrix_text_search_order_by_asc_no_where() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_asc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "ASC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_asc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_asc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_desc_no_where"] + #[doc(hidden)] + pub const matrix_text_search_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_desc_no_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_desc_no_where()), + ), + }; + fn matrix_text_search_order_by_desc_no_where() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_desc_no_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "all" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "DESC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_no_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_desc_no_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_desc_no_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_asc_with_where"] + #[doc(hidden)] + pub const matrix_text_search_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_asc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_asc_with_where()), + ), + }; + fn matrix_text_search_order_by_asc_with_where() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_asc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "ASC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "ASC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "asc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_asc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_asc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_desc_with_where"] + #[doc(hidden)] + pub const matrix_text_search_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_desc_with_where", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2540usize, + start_col: 22usize, + end_line: 2540usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_desc_with_where()), + ), + }; + fn matrix_text_search_order_by_desc_with_where() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_desc_with_where( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + use ::eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let mid: String = ::mid_pivot(); + let gt_mid = "gt_mid" == "gt_mid"; + let where_clause = if gt_mid { + ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + " WHERE plaintext > {0}", + ::to_sql_literal(&mid), + ), + ) + }) + } else { + String::new() + }; + let col = &spec.column_expr; + let d = &spec.sql_domain; + let ord = (spec + .ord_extractor)( + &::alloc::__export::must_use({ + ::alloc::fmt::format(format_args!("({0})::{1}", col, d)) + }), + ); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0}{2} ORDER BY {3} {1}", + fixture_table, + "DESC", + where_clause, + ord, + ), + ) + }); + let actual: Vec = sqlx::query_scalar(&sql) + .fetch_all(&pool) + .await?; + let mut expected: Vec = ::fixture_values() + .to_vec(); + expected.sort(); + if gt_mid { + expected.retain(|v| *v > mid); + } + if "DESC" == "DESC" { + expected.reverse(); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + &spec.sql_domain, + "desc_with_where", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_desc_with_where", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_desc_with_where; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_asc_nulls_first"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_asc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_asc_nulls_first()), + ), + }; + fn matrix_text_ord_order_by_asc_nulls_first() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_asc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_text_ord_order_by_asc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "ASC", + "FIRST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_asc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_asc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_asc_nulls_last"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_asc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_asc_nulls_last()), + ), + }; + fn matrix_text_ord_order_by_asc_nulls_last() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_asc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_text_ord_order_by_asc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "ASC", + "LAST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_asc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_asc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_desc_nulls_first"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_desc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_desc_nulls_first()), + ), + }; + fn matrix_text_ord_order_by_desc_nulls_first() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_desc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_text_ord_order_by_desc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "DESC", + "FIRST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_desc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_desc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_desc_nulls_last"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_desc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_desc_nulls_last()), + ), + }; + fn matrix_text_ord_order_by_desc_nulls_last() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_desc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let d = &spec.sql_domain; + let table = "matrix_text_ord_order_by_desc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "DESC", + "LAST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_desc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_desc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_asc_nulls_first"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_asc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_asc_nulls_first()), + ), + }; + fn matrix_text_ord_ore_order_by_asc_nulls_first() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_asc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_text_ord_ore_order_by_asc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "ASC", + "FIRST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_asc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_asc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_asc_nulls_last"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_asc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_asc_nulls_last()), + ), + }; + fn matrix_text_ord_ore_order_by_asc_nulls_last() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_asc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_text_ord_ore_order_by_asc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "ASC", + "LAST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_asc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_asc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_desc_nulls_first"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_desc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_desc_nulls_first()), + ), + }; + fn matrix_text_ord_ore_order_by_desc_nulls_first() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_desc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_text_ord_ore_order_by_desc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "DESC", + "FIRST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_desc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_desc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_desc_nulls_last"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_desc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_desc_nulls_last()), + ), + }; + fn matrix_text_ord_ore_order_by_desc_nulls_last() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_desc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let d = &spec.sql_domain; + let table = "matrix_text_ord_ore_order_by_desc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "DESC", + "LAST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_desc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_desc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_asc_nulls_first"] + #[doc(hidden)] + pub const matrix_text_search_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_asc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_asc_nulls_first()), + ), + }; + fn matrix_text_search_order_by_asc_nulls_first() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_asc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let table = "matrix_text_search_order_by_asc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "ASC", + "FIRST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_asc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_asc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_asc_nulls_last"] + #[doc(hidden)] + pub const matrix_text_search_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_asc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_asc_nulls_last()), + ), + }; + fn matrix_text_search_order_by_asc_nulls_last() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_asc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let table = "matrix_text_search_order_by_asc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "ASC", + "LAST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "ASC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "asc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_asc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_asc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_desc_nulls_first"] + #[doc(hidden)] + pub const matrix_text_search_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_desc_nulls_first", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_desc_nulls_first()), + ), + }; + fn matrix_text_search_order_by_desc_nulls_first() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_desc_nulls_first( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let table = "matrix_text_search_order_by_desc_nulls_first"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "DESC", + "FIRST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "FIRST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_first", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_desc_nulls_first", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_desc_nulls_first; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_desc_nulls_last"] + #[doc(hidden)] + pub const matrix_text_search_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_desc_nulls_last", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2654usize, + start_col: 22usize, + end_line: 2654usize, + end_col: 74usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_desc_nulls_last()), + ), + }; + fn matrix_text_search_order_by_desc_nulls_last() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_desc_nulls_last( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + const NULL_ROWS: usize = 3; + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let d = &spec.sql_domain; + let table = "matrix_text_search_order_by_desc_nulls_last"; + let fixture_table = ::fixture_table_name(); + let pg = ::PG_TYPE; + let mut tx = pool.begin().await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "CREATE TEMP TABLE {0} (plaintext {1}, value {2}) ON COMMIT DROP", + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {2}(plaintext, value) SELECT plaintext, ({0})::{3} FROM {1}", + &spec.column_expr, + fixture_table, + table, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + sqlx::query( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "INSERT INTO {1}(plaintext, value) SELECT NULL::{2}, NULL::{3} FROM generate_series(1, {0})", + NULL_ROWS, + table, + pg, + d, + ), + ) + }), + ) + .execute(&mut *tx) + .await?; + let ord = (spec.ord_extractor)("value"); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {2} ORDER BY {3} {0} NULLS {1}", + "DESC", + "LAST", + table, + ord, + ), + ) + }); + let actual: Vec> = sqlx::query_scalar(&sql) + .fetch_all(&mut *tx) + .await?; + let mut non_null: Vec = ::fixture_values() + .to_vec(); + non_null.sort(); + if "DESC" == "DESC" { + non_null.reverse(); + } + let sorted = non_null.into_iter().map(Some); + let mut expected: Vec> = Vec::new(); + if "LAST" == "FIRST" { + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + expected.extend(sorted); + } else { + expected.extend(sorted); + expected.extend(std::iter::repeat(None).take(NULL_ROWS)); + } + match (&actual, &expected) { + (left_val, right_val) => { + if !(*left_val == *right_val) { + let kind = ::core::panicking::AssertKind::Eq; + ::core::panicking::assert_failed( + kind, + &*left_val, + &*right_val, + ::core::option::Option::Some( + format_args!( + "domain={0} mode={1} SQL={2} expected {3:?}, got {4:?}", + d, + "desc_nulls_last", + sql, + expected, + actual, + ), + ), + ); + } + } + }; + tx.commit().await?; + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_desc_nulls_last", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_desc_nulls_last; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_using_lt_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_using_lt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_using_lt_rejects()), + ), + }; + fn matrix_text_ord_order_by_using_lt_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_using_lt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + "<", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_using_lt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_using_lt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_using_lte_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_using_lte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_using_lte_rejects()), + ), + }; + fn matrix_text_ord_order_by_using_lte_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_using_lte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + "<=", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_using_lte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_using_lte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_using_gt_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_using_gt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_using_gt_rejects()), + ), + }; + fn matrix_text_ord_order_by_using_gt_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_using_gt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + ">", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_using_gt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_using_gt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_order_by_using_gte_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_order_by_using_gte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_order_by_using_gte_rejects()), + ), + }; + fn matrix_text_ord_order_by_using_gte_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_order_by_using_gte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Ord); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + ">=", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_order_by_using_gte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_order_by_using_gte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_using_lt_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_using_lt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_using_lt_rejects()), + ), + }; + fn matrix_text_ord_ore_order_by_using_lt_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_using_lt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + "<", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_using_lt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_using_lt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_using_lte_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_using_lte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_using_lte_rejects()), + ), + }; + fn matrix_text_ord_ore_order_by_using_lte_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_using_lte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + "<=", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_using_lte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_using_lte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_using_gt_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_using_gt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_using_gt_rejects()), + ), + }; + fn matrix_text_ord_ore_order_by_using_gt_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_using_gt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + ">", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_using_gt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_using_gt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_ord_ore_order_by_using_gte_rejects"] + #[doc(hidden)] + pub const matrix_text_ord_ore_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_ord_ore_order_by_using_gte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_ord_ore_order_by_using_gte_rejects()), + ), + }; + fn matrix_text_ord_ore_order_by_using_gte_rejects() -> anyhow::Result<()> { + async fn matrix_text_ord_ore_order_by_using_gte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::OrdOre); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + ">=", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_ord_ore_order_by_using_gte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_ord_ore_order_by_using_gte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_using_lt_rejects"] + #[doc(hidden)] + pub const matrix_text_search_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_using_lt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_using_lt_rejects()), + ), + }; + fn matrix_text_search_order_by_using_lt_rejects() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_using_lt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + "<", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_using_lt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_using_lt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_using_lte_rejects"] + #[doc(hidden)] + pub const matrix_text_search_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_using_lte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_using_lte_rejects()), + ), + }; + fn matrix_text_search_order_by_using_lte_rejects() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_using_lte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + "<=", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + "<=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_using_lte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_using_lte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_using_gt_rejects"] + #[doc(hidden)] + pub const matrix_text_search_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_using_gt_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_using_gt_rejects()), + ), + }; + fn matrix_text_search_order_by_using_gt_rejects() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_using_gt_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + ">", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_using_gt_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_using_gt_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } + extern crate test; + #[rustc_test_marker = "scalars::text::matrix_text_search_order_by_using_gte_rejects"] + #[doc(hidden)] + pub const matrix_text_search_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { + desc: test::TestDesc { + name: test::StaticTestName( + "scalars::text::matrix_text_search_order_by_using_gte_rejects", + ), + ignore: false, + ignore_message: ::core::option::Option::None, + source_file: "tests/sqlx/src/matrix.rs", + start_line: 2772usize, + start_col: 22usize, + end_line: 2772usize, + end_col: 87usize, + compile_fail: false, + no_run: false, + should_panic: test::ShouldPanic::No, + test_type: test::TestType::IntegrationTest, + }, + testfn: test::StaticTestFn( + #[coverage(off)] + || test::assert_test_result(matrix_text_search_order_by_using_gte_rejects()), + ), + }; + fn matrix_text_search_order_by_using_gte_rejects() -> anyhow::Result<()> { + async fn matrix_text_search_order_by_using_gte_rejects( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + { + let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< + String, + >(::eql_tests::scalar_domains::Variant::Search); + let fixture_table = ::fixture_table_name(); + let sql = ::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT plaintext FROM {0} ORDER BY ({1})::{2} USING {3}", + fixture_table, + &spec.column_expr, + &spec.sql_domain, + ">=", + ), + ) + }); + let err = sqlx::query_scalar::<_, String>(&sql) + .fetch_all(&pool) + .await + .expect_err( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "domain={0} op={1} SQL={2} must reject ORDER BY USING (no opclass on domain by design) but succeeded", + &spec.sql_domain, + ">=", + sql, + ), + ) + }), + ); + ::eql_tests::assert_db_error(&err, "42809", None); + Ok(()) + } + } + let mut args = ::sqlx::testing::TestArgs::new( + "encrypted_domain::scalars::text::matrix_text_search_order_by_using_gte_rejects", + ); + args.migrator( + &::sqlx::migrate::Migrator { + migrations: ::std::borrow::Cow::Borrowed( + &[ + ::sqlx::migrate::Migration { + version: 1i64, + description: ::std::borrow::Cow::Borrowed("placeholder"), + migration_type: ::sqlx::migrate::MigrationType::Simple, + sql: ::std::borrow::Cow::Borrowed(""), + no_tx: false, + checksum: ::std::borrow::Cow::Borrowed( + &[ + 56u8, 176u8, 96u8, 167u8, 81u8, 172u8, 150u8, 56u8, 76u8, + 217u8, 50u8, 126u8, 177u8, 177u8, 227u8, 106u8, 33u8, 253u8, + 183u8, 17u8, 20u8, 190u8, 7u8, 67u8, 76u8, 12u8, 199u8, + 191u8, 99u8, 246u8, 225u8, 218u8, 39u8, 78u8, 222u8, 191u8, + 231u8, 111u8, 101u8, 251u8, 213u8, 26u8, 210u8, 241u8, 72u8, + 152u8, 185u8, 91u8, + ], + ), + }, + ], + ), + ..::sqlx::migrate::Migrator::DEFAULT + }, + ); + args.fixtures( + &[ + ::sqlx::testing::TestFixture { + path: "../../../fixtures/eql_v3_text.sql", + contents: "", + }, + ], + ); + let f: fn(_) -> _ = matrix_text_search_order_by_using_gte_rejects; + ::sqlx::testing::TestFn::run_test(f, args) + } +} From cdf0011b616dac1b9dec13b39fbfaf6f5965af8e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 12:21:28 +1000 Subject: [PATCH 361/599] ci(v3): verify text + bool expand snapshots in the nightly drift lane Refs #321. --- .github/workflows/macro-expand-eql.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/macro-expand-eql.yml b/.github/workflows/macro-expand-eql.yml index 9b4d0d8d4..afec411fa 100644 --- a/.github/workflows/macro-expand-eql.yml +++ b/.github/workflows/macro-expand-eql.yml @@ -1,10 +1,11 @@ name: "Macro expand EQL" -# Regenerates the int4 matrix `cargo expand` snapshot and fails if it has -# drifted from the committed copy. This is a body-level fidelity backstop for -# the `ordered_numeric_matrix!` / `scalar_domain_matrix!` macros — the -# name-inventory snapshot (test-eql.yml `matrix-coverage` job) catches -# add/remove of whole arms; this catches changes *inside* the generated bodies. +# Regenerates the matrix `cargo expand` snapshots (one per reachable +# `scalar_matrix!` arm: int4 = [eq, ord], text = [eq, ord, search], bool = +# [storage]) and fails if any has drifted from its committed copy. This is a +# body-level fidelity backstop for the matrix macros — the name-inventory +# snapshot (test-eql.yml `matrix-coverage` job) catches add/remove of whole +# arms; this catches changes *inside* the generated bodies. # # Non-blocking by design: it is NOT a required PR check. `cargo expand` needs a # nightly toolchain, so it is isolated off the PR path. @@ -75,8 +76,11 @@ jobs: test -n "$NIGHTLY" || { echo "could not find pinned nightly in mise.toml"; exit 1; } rustup toolchain install "$NIGHTLY" --profile minimal --component rustfmt - - name: Regenerate and verify the matrix expansion snapshot + - name: Regenerate and verify the matrix expansion snapshots run: | mise run test:matrix:expand - git diff --exit-code -- tests/sqlx/snapshots/int4_expanded.rs \ + git diff --exit-code -- \ + tests/sqlx/snapshots/int4_expanded.rs \ + tests/sqlx/snapshots/text_expanded.rs \ + tests/sqlx/snapshots/bool_expanded.rs \ || { echo "Expansion snapshot stale — run 'mise run test:matrix:expand' (needs the pinned nightly) and commit."; exit 1; } From 3d2881c020deda25f56a87ade35a9b246ad46b0c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 12:22:06 +1000 Subject: [PATCH 362/599] docs(v3): document the *_expanded.rs macro body snapshots Refs #321. --- tests/sqlx/snapshots/README.md | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 52ae0d286..45373ada2 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -204,3 +204,42 @@ cargo test --test v3_jsonb_tests --test v3_jsonb_operator_surface_tests -- --lis ``` CI verifies it with `mise run test:v3-jsonb:inventory`. + +## Macro expansion body snapshots (`*_expanded.rs`) + +`int4_expanded.rs`, `text_expanded.rs`, and `bool_expanded.rs` are a **different +kind** of snapshot from the `matrix_tests*.txt` inventories above. The inventories +pin the *set of test names*; these pin the **generated bodies** — the actual +`cargo expand` output of the `scalar_matrix!` macro. The inventory catches a whole +arm being added or removed; the expansion snapshot catches a change *inside* a +generated body that leaves the name set unchanged. + +One snapshot per **reachable** `scalar_matrix!` arm (`tests/sqlx/src/matrix.rs`), +because the arms emit structurally different bodies and none subsumes another: + +| snapshot | type | arm | unique body surface | +|----------|------|-----|---------------------| +| `int4_expanded.rs` | `int4` | `caps = [eq, ord]` | the `ord`/`ord_ore` btree combo carries `=` **plus** the four ordering ops on one index — proves `=` rides the ORE ordered index (the path all eight integer/temporal/float types use) | +| `text_expanded.rs` | `text` | `caps = [eq, ord, search]` | `=` split into separate `*_eqidx` combos; `_match`/`_search` bloom (`@>`/`<@`) and GIN arms | +| `bool_expanded.rs` | `bool` | `caps = [storage]` | single term-less domain; bypasses `scalar_domain_matrix!`, calling the leaf drivers directly (every comparison/containment op is a blocker) | + +`text` does **not** make `int4` redundant: its `ord` btree combo omits `=` (moved +to `_eqidx`), so the "`=` rides the ORE ordered index" body exists only in the +`int4` snapshot. The `caps = [eq]` arm has no consumer and is uncovered by design. + +These are **committed** (tracked), unlike the gitignored generated SQL. They carry +`linguist-generated` via `.gitattributes` so GitHub collapses them in diffs. + +### Regenerating + +Requires the pinned nightly toolchain + `cargo-expand` (both single-sourced in +`mise.toml`); no database or CipherStash creds (expand-only, fixtures emptied): + +```bash +mise run test:matrix:expand # rewrites all three *_expanded.rs +``` + +Pinning another arm is one edit to the `TARGETS=(...)` list in the +`test:matrix:expand` task. The nightly lane in +`.github/workflows/macro-expand-eql.yml` regenerates and `git diff --exit-code`s +all three (non-blocking: nightly-only, off the PR critical path). From 85ba39b44c5a907aab7a76408b847affe54c6b21 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 19:16:25 +1000 Subject: [PATCH 363/599] refactor: rename eql-scalars crate to eql-domains Pure mechanical rename (PR 1 of unified-catalog-codegen refactor): crate dir, Cargo package name, import path eql_scalars->eql_domains, all referrers, mise/task scripts, and load-bearing doc paths. No type/field/SQL changes. --- .github/workflows/README.md | 4 +- CLAUDE.md | 10 +-- Cargo.lock | 10 +-- Cargo.toml | 6 +- DEVELOPMENT.md | 12 ++-- crates/eql-codegen/Cargo.toml | 2 +- crates/eql-codegen/src/consts.rs | 4 +- crates/eql-codegen/src/context.rs | 2 +- crates/eql-codegen/src/dump.rs | 8 +-- crates/eql-codegen/src/generate.rs | 12 ++-- crates/eql-codegen/src/lib.rs | 4 +- crates/eql-codegen/src/main.rs | 2 +- crates/eql-codegen/tests/parity.rs | 8 +-- .../{eql-scalars => eql-domains}/Cargo.toml | 4 +- .../src/fixture.rs | 0 .../{eql-scalars => eql-domains}/src/kind.rs | 2 +- .../{eql-scalars => eql-domains}/src/lib.rs | 4 +- .../src/proptest_invariants.rs | 2 +- .../{eql-scalars => eql-domains}/src/spec.rs | 0 .../{eql-scalars => eql-domains}/src/term.rs | 0 .../{eql-scalars => eql-domains}/src/tests.rs | 0 crates/eql-tests-macros/Cargo.toml | 2 +- crates/eql-tests-macros/src/lib.rs | 42 ++++++------ crates/eql-types/Cargo.toml | 4 +- crates/eql-types/README.md | 2 +- crates/eql-types/src/lib.rs | 2 +- crates/eql-types/src/v3/mod.rs | 8 +-- crates/eql-types/src/v3/terms.rs | 2 +- crates/eql-types/tests/catalog_parity.rs | 4 +- .../adding-a-scalar-encrypted-domain-type.md | 22 +++---- mise.toml | 14 ++-- tasks/build.sh | 8 +-- tasks/fixtures.toml | 4 +- tests/codegen/reference/README.md | 6 +- tests/sqlx/Cargo.toml | 2 +- tests/sqlx/README.md | 2 +- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 2 +- tests/sqlx/migrations/README.md | 2 +- tests/sqlx/snapshots/README.md | 4 +- tests/sqlx/src/fixtures/eql_plaintext.rs | 4 +- tests/sqlx/src/fixtures/mod.rs | 6 +- tests/sqlx/src/fixtures/scalar_fixture.rs | 2 +- tests/sqlx/src/fixtures/v3_doc_int4.rs | 6 +- tests/sqlx/src/fixtures/v3_text_empty.rs | 2 +- tests/sqlx/src/jsonb_entry.rs | 6 +- tests/sqlx/src/property.rs | 2 +- tests/sqlx/src/scalar_domains.rs | 64 +++++++++---------- tests/sqlx/src/scalar_types.rs | 6 +- .../tests/encrypted_domain/family/support.rs | 2 +- .../tests/encrypted_domain/jsonb_entry.rs | 2 +- .../tests/encrypted_domain/property/README.md | 8 +-- .../tests/encrypted_domain/text/text_match.rs | 2 +- tests/sqlx/tests/generate_all_fixtures.rs | 8 +-- 53 files changed, 174 insertions(+), 174 deletions(-) rename crates/{eql-scalars => eql-domains}/Cargo.toml (89%) rename crates/{eql-scalars => eql-domains}/src/fixture.rs (100%) rename crates/{eql-scalars => eql-domains}/src/kind.rs (99%) rename crates/{eql-scalars => eql-domains}/src/lib.rs (99%) rename crates/{eql-scalars => eql-domains}/src/proptest_invariants.rs (98%) rename crates/{eql-scalars => eql-domains}/src/spec.rs (100%) rename crates/{eql-scalars => eql-domains}/src/term.rs (100%) rename crates/{eql-scalars => eql-domains}/src/tests.rs (100%) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index c38d69184..162d04aff 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -109,7 +109,7 @@ All jobs run on `blacksmith-16vcpu-ubuntu-2204`. "PG set" follows the event | **validate** (per PG) | `docs:validate:documented-sql` + `test:clean_install_v3` | DB-backed SQL doc-syntax check; clean-DB `eql_v3` install smoke | yes | no | | **docs-static** | `docs:validate:source` | SQL doxygen coverage + required-tags (DB-free); relevance-gated like the other heavy jobs (its inputs — `src/**`, the `crates/**` codegen build, `tasks/docs/**` — are a subset of the `relevant` filter) | no | no | | **schema** | `test:schema` | v2.2 / v2.3 payload JSON-schema validation | no | no | -| **rust-crates** | `test:crates` + `types:check` | `cargo fmt --check`, clippy + `cargo test` for `eql-scalars` / `eql-codegen` / `eql-tests-macros` / `eql-types`; verify TS bindings + JSON schemas are fresh | no | no | +| **rust-crates** | `test:crates` + `types:check` | `cargo fmt --check`, clippy + `cargo test` for `eql-domains` / `eql-codegen` / `eql-tests-macros` / `eql-types`; verify TS bindings + JSON schemas are fresh | no | no | | **codegen** | `codegen:parity` | Generated encrypted-domain SQL matches the golden output | no | no | | **self-contained-v3** | `test:self_contained_v3` | `eql_v3` surface has no `eql_v2` dependency | no | no | | **matrix-coverage** | `test:matrix:inventory` (+`:jsonb_entry`, `:v3-jsonb`) + `test:matrix:catalog-coverage` | Scalar-matrix test-name snapshots are not silently dropped; catalog surface is covered | no | no | @@ -126,7 +126,7 @@ CI jobs: | Suite | Job | Trigger coverage | DB | `CS_*` | Notes | |---|---|---|---|---|---| -| **catalog** (`eql-scalars` `proptest_invariants`) | **rust-crates** (`cargo test -p eql-scalars`; proptest is a dev-dep) | relevant PR + queue | no | no | pure-Rust catalog invariants; shrinking enabled | +| **catalog** (`eql-domains` `proptest_invariants`) | **rust-crates** (`cargo test -p eql-domains`; proptest is a dev-dep) | relevant PR + queue | no | no | pure-Rust catalog invariants; shrinking enabled | | **fixture** (function-double oracles, extractor identity, `match_smoke`, `edge_cases`) | **test** shards (default features) | relevant PR (PG17×4) + queue (PG14–17×2) | yes | no | oracle over the **committed** real-ciphertext fixtures | | **e2e** (`e2e_oracle`, `#[cfg(feature = "proptest-e2e")]`) | **e2e** job (`test:sqlx:e2e`) | relevant PR (PG17) + queue (PG17) | yes | yes | oracle over **fresh** ZeroKMS encryption; PG-version-independent, so one PG17 run | diff --git a/CLAUDE.md b/CLAUDE.md index a0ed65ff2..383497255 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -70,13 +70,13 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, and `float8`, all following this materializer pattern. `jsonb` is the only catalog scalar with no generated SQL surface yet — it needs a separate SQL design beyond the ordered-scalar materializer, and the `eql-scalars` fixture catalog (`crates/eql-scalars`) models its fixture values ahead of that surface. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, and `float8`, all following this materializer pattern. `jsonb` is the only catalog scalar with no generated SQL surface yet — it needs a separate SQL design beyond the ordered-scalar materializer, and the `eql-domains` fixture catalog (`crates/eql-domains`) models its fixture values ahead of that surface. -Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_scalars::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` is out of scope for this scalar materializer. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` is out of scope for this scalar materializer. -**Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-scalars/src` with tests, not in free-form catalog data. +**Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-domains/src` with tests, not in free-form catalog data. -Regeneration is deterministic: an identical `CATALOG` produces byte-identical SQL. If `mise run build` produces unexpected output, the change is in `crates/eql-scalars/src` (the catalog/terms) or `crates/eql-codegen/src` (the renderers) — not in random run-to-run variation. +Regeneration is deterministic: an identical `CATALOG` produces byte-identical SQL. If `mise run build` produces unexpected output, the change is in `crates/eql-domains/src` (the catalog/terms) or `crates/eql-codegen/src` (the renderers) — not in random run-to-run variation. Footguns the spec exists to prevent: @@ -100,7 +100,7 @@ Footguns the spec exists to prevent: EQL is searchable encryption; tests MUST use real ciphertexts/index terms from the actual crypto, never hand-curated or synthetic blobs. Fixtures are **generated** by encrypting plaintext through cipherstash-client: `mise run test:sqlx:prep` runs `fixture:generate:all` (the -`generate_all_fixtures` test, `--features fixture-gen`, over `eql-scalars::CATALOG`) → gitignored +`generate_all_fixtures` test, `--features fixture-gen`, over `eql-domains::CATALOG`) → gitignored `tests/sqlx/fixtures/eql_v3_*.sql`. - The SQLx suite **requires** CipherStash creds — ZeroKMS auth (`CS_CLIENT_ACCESS_KEY` + diff --git a/Cargo.lock b/Cargo.lock index 05690b865..ff524f7c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1165,7 +1165,7 @@ dependencies = [ name = "eql-codegen" version = "0.1.0" dependencies = [ - "eql-scalars", + "eql-domains", "minijinja", "serde", "serde_json", @@ -1173,7 +1173,7 @@ dependencies = [ ] [[package]] -name = "eql-scalars" +name = "eql-domains" version = "0.1.0" dependencies = [ "proptest", @@ -1183,7 +1183,7 @@ dependencies = [ name = "eql-tests-macros" version = "0.1.0" dependencies = [ - "eql-scalars", + "eql-domains", "proc-macro2", "quote", "syn 2.0.108", @@ -1193,7 +1193,7 @@ dependencies = [ name = "eql-types" version = "0.1.0" dependencies = [ - "eql-scalars", + "eql-domains", "schemars", "serde", "serde_json", @@ -1207,7 +1207,7 @@ dependencies = [ "anyhow", "chrono", "cipherstash-client", - "eql-scalars", + "eql-domains", "eql-tests-macros", "hex", "jsonschema", diff --git a/Cargo.toml b/Cargo.toml index e4a2b1be3..e2f8244d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,14 @@ # Cargo workspace root. # # Members: -# crates/eql-scalars — the scalar/term catalog (std-only, no deps). Source of +# crates/eql-domains — the scalar/term catalog (std-only, no deps). Source of # truth for the Rust generator (Plan 2) and the SQLx test # harness (Plan 3). # crates/eql-codegen — the SQL generator binary (stub here; Plan 2 fills it in). # crates/eql-tests-macros — proc-macros expanding the single scalar-harness # list into the per-type SQLx-matrix wiring. # crates/eql-types — canonical Rust wire types for EQL payloads, parity- -# tested against the eql-scalars catalog. (TypeScript +# tested against the eql-domains catalog. (TypeScript # bindings and JSON Schemas are generated from these # types in stacked changes.) # tests/sqlx — the existing `eql_tests` SQLx integration crate. @@ -21,7 +21,7 @@ [workspace] resolver = "2" members = [ - "crates/eql-scalars", + "crates/eql-domains", "crates/eql-codegen", "crates/eql-tests-macros", "crates/eql-types", diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 832ccf2d3..25eaafb7d 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -71,7 +71,7 @@ These are the important files and directories in the repo: │ ├── docs/ <-- documentation generate/validate tasks │ └── test/ <-- additional test tasks (self_contained_v3, …) ├── crates/ <-- Rust workspace: catalog, code generator, types -│ ├── eql-scalars/ <-- THE catalog (eql-scalars::CATALOG): source of truth +│ ├── eql-domains/ <-- THE catalog (eql-domains::CATALOG): source of truth │ ├── eql-codegen/ <-- renders the eql_v3 scalar SQL from the catalog │ ├── eql-types/ <-- shared Rust types + generated TS/JSON Schema bindings │ └── eql-tests-macros/ <-- proc-macros used by the SQLx test matrix @@ -178,7 +178,7 @@ and uninstall scripts to `release/`. The `eql_v3` scalar encrypted-domain types are **generated** from a single Rust source of truth — the `CATALOG` const in -[`crates/eql-scalars/src/lib.rs`](./crates/eql-scalars/src/lib.rs). There is no +[`crates/eql-domains/src/lib.rs`](./crates/eql-domains/src/lib.rs). There is no TOML manifest and no Python. Each scalar type is one `ScalarSpec` row in `CATALOG`, declaring: @@ -198,7 +198,7 @@ The generated files `_aggregates.sql`) carry an `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker that `docs:validate` greps for), are **gitignored**, and are **never committed**. If `mise run build` produces unexpected output, the -change is in `crates/eql-scalars/src` (the catalog/terms) or +change is in `crates/eql-domains/src` (the catalog/terms) or `crates/eql-codegen/src` (the renderers), not in run-to-run variation. ### The dependency system @@ -307,7 +307,7 @@ The catalog, code generator, and shared types have fast tests that do not need a database: ```bash -# Catalog + generator tests (eql-scalars, eql-codegen) +# Catalog + generator tests (eql-domains, eql-codegen) mise run test:codegen # Compile, lint, and test the std-only workspace crates @@ -329,8 +329,8 @@ without a database at all. ### Adding a scalar encrypted-domain type Adding a scalar encrypted-domain type (e.g. a new ordered numeric scalar) is one -`ScalarSpec` row in `eql-scalars::CATALOG` -([`crates/eql-scalars/src/lib.rs`](./crates/eql-scalars/src/lib.rs)). New term +`ScalarSpec` row in `eql-domains::CATALOG` +([`crates/eql-domains/src/lib.rs`](./crates/eql-domains/src/lib.rs)). New term behaviour belongs in the `Term` enum's `impl` methods (with tests), not in free-form catalog data. After editing the catalog, run `mise run build` to regenerate the SQL surface. diff --git a/crates/eql-codegen/Cargo.toml b/crates/eql-codegen/Cargo.toml index 729e3fb28..bec6f3989 100644 --- a/crates/eql-codegen/Cargo.toml +++ b/crates/eql-codegen/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" publish = false [dependencies] -eql-scalars = { path = "../eql-scalars" } +eql-domains = { path = "../eql-domains" } minijinja = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 3b8fb1a9b..a48c96eee 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -15,9 +15,9 @@ pub(crate) const SCHEMA: &str = "eql_v3"; /// Always-present payload keys checked for presence in every domain CHECK. /// Term-specific keys are appended after these by `context::domain_block`. -/// Defined in the catalog (`eql_scalars::ENVELOPE_KEYS`) so the CHECKs and +/// Defined in the catalog (`eql_domains::ENVELOPE_KEYS`) so the CHECKs and /// the `eql-types` payload structs share one envelope definition. -pub(crate) const ENVELOPE_KEYS: &[&str] = eql_scalars::ENVELOPE_KEYS; +pub(crate) const ENVELOPE_KEYS: &[&str] = eql_domains::ENVELOPE_KEYS; /// Escape a string for use inside a single-quoted SQL literal by doubling /// embedded single quotes. diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 1413a5e5b..300a78cdf 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -2,7 +2,7 @@ use crate::consts::*; use crate::operator_surface::Operator; -use eql_scalars::{DomainSpec, Term}; +use eql_domains::{DomainSpec, Term}; /// Build the minijinja environment with the embedded templates: one whole-file /// template per output file (`types`/`functions`/`operators`/`aggregates`) plus diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 5c4cef90c..5cddb056d 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -1,11 +1,11 @@ -//! `dump_catalog` — serialize the `eql_scalars::CATALOG` surface (each type's +//! `dump_catalog` — serialize the `eql_domains::CATALOG` surface (each type's //! domains and their supported SQL operators) for downstream verification //! tooling. The reusable producer behind `eql-codegen -- dump-catalog`. //! //! Stage 1 consumes the `(type, domain)` shape; later stages consume the //! per-domain `supported_ops`. Blocked-operator tagging is added in Stage 4. -use eql_scalars::{Term, CATALOG}; +use eql_domains::{Term, CATALOG}; use serde::Serialize; /// The catalog surface: every scalar type and its domains. @@ -36,7 +36,7 @@ pub struct DomainEntry { pub supported_ops: Vec<&'static str>, } -/// Build the catalog surface description from `eql_scalars::CATALOG`. +/// Build the catalog surface description from `eql_domains::CATALOG`. pub fn dump_catalog() -> CatalogDump { let types = CATALOG .iter() @@ -99,7 +99,7 @@ mod tests { fn timestamptz_is_ordered() { // timestamptz was promoted to the ordered shape once // `compare_ore_block_256_term` generalized to N blocks (see #284 / the - // `EQ_ONLY_DOMAINS` note in `eql-scalars`). It now mirrors int4's + // `EQ_ONLY_DOMAINS` note in `eql-domains`). It now mirrors int4's // four-domain ordered surface. let dump = dump_catalog(); let ts = dump diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index f6402029a..c400e871a 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; -use eql_scalars::{DomainSpec, ScalarSpec, Term}; +use eql_domains::{DomainSpec, ScalarSpec, Term}; use crate::context::{domain_name, is_ord_capable}; use crate::operator_surface::OPERATORS; @@ -245,9 +245,9 @@ pub fn generate_type(spec: &ScalarSpec, out_dir: &Path) -> Result, /// Generate every catalog type's gitignored SQL surface under `out_root`. The /// single entry point: replaces Python's per-type and --all forms. The /// plaintext fixture lists are not generated — they live in the catalog -/// (`eql_scalars::INT4_VALUES` / `INT2_VALUES`), read directly by the SQLx tests. +/// (`eql_domains::INT4_VALUES` / `INT2_VALUES`), read directly by the SQLx tests. pub fn generate_all(out_root: &Path) -> Result { - for spec in eql_scalars::CATALOG { + for spec in eql_domains::CATALOG { let token = spec.token; let out_dir = out_root.join(V3_SCALARS_DIR).join(token); let written = generate_type(spec, &out_dir)?; @@ -258,7 +258,7 @@ pub fn generate_all(out_root: &Path) -> Result { } println!("generated {} files for {token}", written.len()); } - let tokens: Vec<&str> = eql_scalars::CATALOG.iter().map(|s| s.token).collect(); + let tokens: Vec<&str> = eql_domains::CATALOG.iter().map(|s| s.token).collect(); println!( "codegen: ok ({} types: {})", tokens.len(), @@ -270,7 +270,7 @@ pub fn generate_all(out_root: &Path) -> Result { #[cfg(test)] mod tests { use super::*; - use eql_scalars::CATALOG; + use eql_domains::CATALOG; fn spec(token: &str) -> &'static ScalarSpec { CATALOG @@ -668,7 +668,7 @@ mod tests { #[test] fn domain_block_escapes_quote_bearing_name() { use crate::context::domain_block; - use eql_scalars::DomainSpec; + use eql_domains::DomainSpec; let block = domain_block( "int4", &DomainSpec { diff --git a/crates/eql-codegen/src/lib.rs b/crates/eql-codegen/src/lib.rs index cab1eee4c..c5dbf1a88 100644 --- a/crates/eql-codegen/src/lib.rs +++ b/crates/eql-codegen/src/lib.rs @@ -1,9 +1,9 @@ -//! Scalar encrypted-domain SQL generator. Renders the `eql-scalars` catalog to +//! Scalar encrypted-domain SQL generator. Renders the `eql-domains` catalog to //! the gitignored SQL surface, validated byte-for-byte against the per-token //! reference SQL files under `tests/codegen/reference//` (modulo the one //! `-- REFERENCE:` provenance line each reference file carries). The plaintext //! fixture lists the SQLx matrix consumes live in the catalog itself -//! (`eql_scalars::INT4_VALUES` / `INT2_VALUES`), not in a generated file. +//! (`eql_domains::INT4_VALUES` / `INT2_VALUES`), not in a generated file. use std::path::PathBuf; diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index 2a9bcb876..a02e43fff 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -9,7 +9,7 @@ fn main() -> ExitCode { // `list-types`: print catalog tokens, one per line. Consumed by Plan 3's // fixtures-all and matrix-inventory enumeration. if args.len() == 2 && args[1] == "list-types" { - for spec in eql_scalars::CATALOG { + for spec in eql_domains::CATALOG { println!("{}", spec.token); } return ExitCode::SUCCESS; diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index c8c678425..7fde8bcac 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -4,11 +4,11 @@ //! `-- REFERENCE:` provenance line). Every catalog type has a committed //! reference, generated once; the reference — not the retired Python generator //! — is the sole oracle. The reference dirs are *discovered* dynamically and -//! cross-checked against `eql_scalars::CATALOG`, so a new catalog type with no +//! cross-checked against `eql_domains::CATALOG`, so a new catalog type with no //! reference (or a stale reference with no catalog row) fails here. The //! plaintext fixture lists are not -//! generated; they live in the catalog (`eql_scalars::INT4_VALUES` / -//! `INT2_VALUES`) and are pinned by `eql-scalars`'s own `values_tests`. +//! generated; they live in the catalog (`eql_domains::INT4_VALUES` / +//! `INT2_VALUES`) and are pinned by `eql-domains`'s own `values_tests`. use std::collections::BTreeSet; use std::fs; @@ -79,7 +79,7 @@ fn reference_body(reference: &str) -> String { fn reference_dirs_match_catalog_tokens() { let root = repo_root(); let refs = reference_tokens(&root); - let catalog: BTreeSet = eql_scalars::CATALOG + let catalog: BTreeSet = eql_domains::CATALOG .iter() .map(|s| s.token.to_string()) .collect(); diff --git a/crates/eql-scalars/Cargo.toml b/crates/eql-domains/Cargo.toml similarity index 89% rename from crates/eql-scalars/Cargo.toml rename to crates/eql-domains/Cargo.toml index 819adb221..011278415 100644 --- a/crates/eql-scalars/Cargo.toml +++ b/crates/eql-domains/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "eql-scalars" +name = "eql-domains" version = "0.1.0" edition = "2021" description = "Scalar/term catalog for EQL encrypted-domain codegen (std-only, no deps)." @@ -13,7 +13,7 @@ description = "Scalar/term catalog for EQL encrypted-domain codegen (std-only, n workspace = true # Dev-only. proptest is NOT a runtime dependency: it never compiles on the SQL -# build path (eql-codegen depends on eql-scalars' lib, not its tests), so the +# build path (eql-codegen depends on eql-domains' lib, not its tests), so the # "INTENTIONALLY no dependencies" rule above — which is about build-path deps — # is preserved. Used by src/proptest_invariants.rs (the catalog suite of # property tests, no DB, runs in the lean `mise run test:crates` / fork CI path). diff --git a/crates/eql-scalars/src/fixture.rs b/crates/eql-domains/src/fixture.rs similarity index 100% rename from crates/eql-scalars/src/fixture.rs rename to crates/eql-domains/src/fixture.rs diff --git a/crates/eql-scalars/src/kind.rs b/crates/eql-domains/src/kind.rs similarity index 99% rename from crates/eql-scalars/src/kind.rs rename to crates/eql-domains/src/kind.rs index 4e83aed93..a621ab04e 100644 --- a/crates/eql-scalars/src/kind.rs +++ b/crates/eql-domains/src/kind.rs @@ -112,7 +112,7 @@ impl ScalarKind { /// has **no generated SQL surface** and no catalog row, so calling this on it /// is a programming error and panics loudly rather than returning a plausible /// SQL token a premature caller might feed into codegen. Only call site today - /// is `crates/eql-scalars/src/tests.rs`. + /// is `crates/eql-domains/src/tests.rs`. pub const fn rust_type(self) -> &'static str { match self { ScalarKind::I16 => "i16", diff --git a/crates/eql-scalars/src/lib.rs b/crates/eql-domains/src/lib.rs similarity index 99% rename from crates/eql-scalars/src/lib.rs rename to crates/eql-domains/src/lib.rs index 58e5543e0..2142ee89d 100644 --- a/crates/eql-scalars/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -368,7 +368,7 @@ const INT8: ScalarSpec = ScalarSpec { /// Public (unlike the integer specs) because the SQLx harness reads /// `DATE.fixtures` directly to parse the ISO strings into `chrono::NaiveDate` /// at runtime — there is no `DATE_VALUES` const (chrono is not `const`-friendly -/// and `eql-scalars` stays zero-dep, so no typed slice is materialised here). +/// and `eql-domains` stays zero-dep, so no typed slice is materialised here). pub const DATE: ScalarSpec = ScalarSpec { token: "date", kind: ScalarKind::Date, @@ -385,7 +385,7 @@ pub const DATE: ScalarSpec = ScalarSpec { /// /// Public (like `DATE`) because the SQLx harness reads `TIMESTAMPTZ.fixtures` /// directly to parse the RFC3339 strings into `chrono::DateTime` at runtime -/// (no `TIMESTAMPTZ_VALUES` const; `eql-scalars` stays zero-dep). +/// (no `TIMESTAMPTZ_VALUES` const; `eql-domains` stays zero-dep). pub const TIMESTAMPTZ: ScalarSpec = ScalarSpec { token: "timestamptz", kind: ScalarKind::Timestamptz, diff --git a/crates/eql-scalars/src/proptest_invariants.rs b/crates/eql-domains/src/proptest_invariants.rs similarity index 98% rename from crates/eql-scalars/src/proptest_invariants.rs rename to crates/eql-domains/src/proptest_invariants.rs index 503e32c00..ecf6f6cd1 100644 --- a/crates/eql-scalars/src/proptest_invariants.rs +++ b/crates/eql-domains/src/proptest_invariants.rs @@ -1,7 +1,7 @@ //! Catalog suite (CIP-3141): property-based invariants over the scalar/term catalog. //! //! Pure Rust — no database, no encryption, no creds. These run in the lean -//! `cargo test -p eql-scalars` path (fork CI). They assert the *catalog* is +//! `cargo test -p eql-domains` path (fork CI). They assert the *catalog* is //! internally consistent for any generated input; the DB-backed oracle suites //! (fixture/e2e) live in `tests/sqlx`. diff --git a/crates/eql-scalars/src/spec.rs b/crates/eql-domains/src/spec.rs similarity index 100% rename from crates/eql-scalars/src/spec.rs rename to crates/eql-domains/src/spec.rs diff --git a/crates/eql-scalars/src/term.rs b/crates/eql-domains/src/term.rs similarity index 100% rename from crates/eql-scalars/src/term.rs rename to crates/eql-domains/src/term.rs diff --git a/crates/eql-scalars/src/tests.rs b/crates/eql-domains/src/tests.rs similarity index 100% rename from crates/eql-scalars/src/tests.rs rename to crates/eql-domains/src/tests.rs diff --git a/crates/eql-tests-macros/Cargo.toml b/crates/eql-tests-macros/Cargo.toml index 6cad3d7ef..1bb86e1ae 100644 --- a/crates/eql-tests-macros/Cargo.toml +++ b/crates/eql-tests-macros/Cargo.toml @@ -11,7 +11,7 @@ proc-macro = true syn = { version = "2", features = ["full"] } quote = "1" proc-macro2 = "1" -eql-scalars = { path = "../eql-scalars" } +eql-domains = { path = "../eql-domains" } [lints] workspace = true diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index 1132d00c5..a722dc86a 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -22,7 +22,7 @@ //! Each entry is `token => rust_type`: `token` is the Postgres type token //! (`int4`, also the fixture/domain suffix), `rust_type` is the Rust plaintext //! type (`i32`). The catalog value const is the upper-cased token plus -//! `_VALUES` (`int4` -> `eql_scalars::INT4_VALUES`). +//! `_VALUES` (`int4` -> `eql_domains::INT4_VALUES`). //! //! Each emitter is split into a thin `#[proc_macro]` shim and a pure `*_tokens` //! core so the core is unit-testable without a consumer crate. @@ -36,12 +36,12 @@ use syn::{Ident, Token, Type}; /// One `token => rust_type` entry. The type's *shape* (temporal vs integer, /// equality-only vs ordered) is **not** declared here — it is read from the -/// `eql-scalars::CATALOG` row for `token` via [`is_temporal_token`] / +/// `eql-domains::CATALOG` row for `token` via [`is_temporal_token`] / /// [`is_eq_only_token`]. The catalog is the single source of truth; this list /// only maps a token to the Rust plaintext type the harness compiles against. struct ScalarEntry { /// Postgres type token (`int4`); also the fixture/domain suffix and the - /// matrix `suite` ident. Must name a row in `eql-scalars::CATALOG`. + /// matrix `suite` ident. Must name a row in `eql-domains::CATALOG`. token: Ident, /// Rust plaintext type (`i32`). rust_type: Type, @@ -56,13 +56,13 @@ impl Parse for ScalarEntry { } } -/// The `eql-scalars::CATALOG` row for `token`, or a hard panic at macro-expansion +/// The `eql-domains::CATALOG` row for `token`, or a hard panic at macro-expansion /// time if the token is unknown — a dispatch-list entry must name a catalog type. -fn spec_for_token(token: &str) -> &'static eql_scalars::ScalarSpec { - eql_scalars::CATALOG +fn spec_for_token(token: &str) -> &'static eql_domains::ScalarSpec { + eql_domains::CATALOG .iter() .find(|s| s.token == token) - .unwrap_or_else(|| panic!("scalar token `{token}` not in eql-scalars::CATALOG")) + .unwrap_or_else(|| panic!("scalar token `{token}` not in eql-domains::CATALOG")) } /// True when `token`'s catalog kind is temporal (chrono-backed). Replaces the @@ -98,7 +98,7 @@ fn is_text_token(token: &str) -> bool { /// non-chrono, so it stamps the `numeric` fixture discriminator and draws its /// values from the harness accessor (`numeric_values()`). fn is_numeric_token(token: &str) -> bool { - matches!(spec_for_token(token).kind, eql_scalars::ScalarKind::Numeric) + matches!(spec_for_token(token).kind, eql_domains::ScalarKind::Numeric) } /// True when `token`'s catalog row is an IEEE-754 float kind (`F32`/`F64`). @@ -108,7 +108,7 @@ fn is_numeric_token(token: &str) -> bool { fn is_float_token(token: &str) -> bool { matches!( spec_for_token(token).kind, - eql_scalars::ScalarKind::F32 | eql_scalars::ScalarKind::F64 + eql_domains::ScalarKind::F32 | eql_domains::ScalarKind::F64 ) } @@ -157,7 +157,7 @@ impl Parse for ScalarList { } } -/// `int4` -> `INT4_VALUES`, the catalog value const in `eql_scalars`. +/// `int4` -> `INT4_VALUES`, the catalog value const in `eql_domains`. fn values_const_ident(token: &Ident) -> Ident { format_ident!("{}_VALUES", token.to_string().to_uppercase()) } @@ -186,11 +186,11 @@ fn scalar_type_impls_tokens(list: &ScalarList) -> TokenStream2 { impl ScalarType for #rust_type { const PG_TYPE: &'static str = #token_str; - /// The catalog `eql_scalars::*_VALUES` list — the same values + /// The catalog `eql_domains::*_VALUES` list — the same values /// the fixture generator encrypts, so the oracle can't drift /// from the fixture. fn fixture_values() -> &'static [#rust_type] { - ::eql_scalars::#values + ::eql_domains::#values } /// Integers draw the full `any::()` range — the e2e @@ -234,7 +234,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { quote! { #[doc = concat!("`eql_v3_", #token_str, "` scalar fixture — generated by `scalar_types!`.")] pub mod #mod_ident { - use ::eql_scalars::#values as VALUES; + use ::eql_domains::#values as VALUES; // `scalar_fixture!` is `#[macro_export]`ed by `eql-tests`; // these modules expand into that lib, so `crate::` resolves it. crate::scalar_fixture!(int, #fixture_name, #rust_type, VALUES); @@ -242,7 +242,7 @@ fn scalar_fixture_modules_tokens(list: &ScalarList) -> TokenStream2 { } } else { // Hand-written non-integer scalars (`date`, `text`) have no - // `eql_scalars::_VALUES` const usable by the integer + // `eql_domains::_VALUES` const usable by the integer // materialiser (chrono is not `const`-friendly; text is owned // `String`). The values come from the harness accessor // (`_values()`), and the fixture stamps the kind-specific @@ -379,7 +379,7 @@ fn scalar_matrix_suites_tokens(list: &ScalarList) -> TokenStream2 { /// /// Invoked via `scalar_types!` in `tests/sqlx/src/scalar_domains.rs`, so the /// impls land in the `eql-tests` lib next to the trait. `PG_TYPE` is the token -/// string; `FIXTURE_VALUES` is the catalog const `eql_scalars::_VALUES`. +/// string; `FIXTURE_VALUES` is the catalog const `eql_domains::_VALUES`. #[proc_macro] pub fn emit_scalar_type_impls(input: TokenStream) -> TokenStream { let list = syn::parse_macro_input!(input as ScalarList); @@ -453,8 +453,8 @@ mod tests { assert!(out.contains("impl ScalarType for i64")); assert!(out.contains(r#"const PG_TYPE : & 'static str = "int4""#)); assert!(out.contains(r#"const PG_TYPE : & 'static str = "int8""#)); - assert!(out.contains(":: eql_scalars :: INT4_VALUES")); - assert!(out.contains(":: eql_scalars :: INT8_VALUES")); + assert!(out.contains(":: eql_domains :: INT4_VALUES")); + assert!(out.contains(":: eql_domains :: INT8_VALUES")); // const→fn: fixture values is a method now. assert!(out.contains("fn fixture_values")); // Pivots are now derived trait defaults — the emitter writes an empty @@ -474,14 +474,14 @@ mod tests { assert!(out.contains("pub mod eql_v3_int8")); assert!(out.contains("crate :: scalar_fixture !")); assert!(out.contains(r#""eql_v3_int4""#)); - assert!(out.contains(":: eql_scalars :: INT4_VALUES as VALUES")); + assert!(out.contains(":: eql_domains :: INT4_VALUES as VALUES")); // Integer entries stamp the `int` kind discriminator. assert!(out.contains("int ,")); } #[test] fn temporal_entry_skips_impl_and_stamps_temporal_fixture() { - // No marker: `date`'s temporal shape is read from eql-scalars::CATALOG. + // No marker: `date`'s temporal shape is read from eql-domains::CATALOG. let list = syn::parse_str::("int4 => i32, date => chrono::NaiveDate").unwrap(); // Impl emitter skips the temporal entry (handed to `temporal_values!`). let impls = norm(&scalar_type_impls_tokens(&list)); @@ -544,7 +544,7 @@ mod tests { #[test] fn text_entry_skips_impl_and_stamps_text_fixture() { - // No marker: `text`'s shape is read from eql-scalars::CATALOG. + // No marker: `text`'s shape is read from eql-domains::CATALOG. let list = syn::parse_str::("int4 => i32, text => String").unwrap(); // Impl emitter skips the text entry (hand-written in scalar_domains.rs). let impls = norm(&scalar_type_impls_tokens(&list)); @@ -709,7 +709,7 @@ mod tests { } #[test] - #[should_panic(expected = "not in eql-scalars::CATALOG")] + #[should_panic(expected = "not in eql-domains::CATALOG")] fn unknown_token_fails_loudly() { is_temporal_token("nonesuch"); } diff --git a/crates/eql-types/Cargo.toml b/crates/eql-types/Cargo.toml index 82c70efa7..a2945d6da 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-types/Cargo.toml @@ -14,6 +14,6 @@ schemars = "0.8" [dev-dependencies] # Parity oracle: tests/catalog_parity.rs asserts the v3 domain inventory -# exactly covers eql_scalars::CATALOG, so the types here cannot drift from +# exactly covers eql_domains::CATALOG, so the types here cannot drift from # the generated SQL surface. -eql-scalars = { path = "../eql-scalars" } +eql-domains = { path = "../eql-domains" } diff --git a/crates/eql-types/README.md b/crates/eql-types/README.md index 042819016..d5b46dc13 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-types/README.md @@ -46,7 +46,7 @@ field names are unchanged from v2 (the purpose-named rename in `tests/catalog_parity.rs` asserts the domain inventory — [`v3::all()`](src/v3/mod.rs), a `Vec>` of zero-sized -type-level handles — exactly covers `eql-scalars::CATALOG` (the same catalog +type-level handles — exactly covers `eql-domains::CATALOG` (the same catalog that generates the `eql_v3` SQL surface): every domain, in order. Adding a scalar to the catalog without adding its types here fails the build. Wire-key strictness (required term keys, unknown-key rejection, envelope diff --git a/crates/eql-types/src/lib.rs b/crates/eql-types/src/lib.rs index 1f87f95ac..840d4ab17 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-types/src/lib.rs @@ -14,7 +14,7 @@ //! The [`v3`] module holds the `eql_v3` encrypted-domain types: one struct //! per SQL domain (`eql_v3.int4_eq`, `eql_v3.text_match`, …), //! *capability-encoded* — index terms are required fields, never `Option`. -//! It mirrors `eql-scalars::CATALOG` 1:1, enforced by +//! It mirrors `eql-domains::CATALOG` 1:1, enforced by //! `tests/catalog_parity.rs`. //! //! Wire rule: **field names ARE wire names** — no `#[serde(rename)]` diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-types/src/v3/mod.rs index 19dfa67eb..2d70c2777 100644 --- a/crates/eql-types/src/v3/mod.rs +++ b/crates/eql-types/src/v3/mod.rs @@ -3,7 +3,7 @@ //! One Rust struct per **SQL domain** in the `eql_v3` schema — the //! capability-encoded design from the original int4 scalar prototype //! (PR #236's first cut), formalized: -//! the SQL surface is generated from `eql-scalars::CATALOG`, and these types +//! the SQL surface is generated from `eql-domains::CATALOG`, and these types //! mirror it 1:1 (enforced by `tests/catalog_parity.rs`, which fails if the //! catalog and [`all`] ever disagree on the set or order of domains; the //! catalog-derived wire-key gate is schema-based and lands with the stacked @@ -74,7 +74,7 @@ pub const SCHEMA_ID_BASE: &str = "https://schemas.cipherstash.com/eql/v3/"; /// Each token file implements this next to the type it describes; the SQL /// domain string is defined exactly once, in that impl, and /// `tests/catalog_parity.rs` cross-checks every entry of [`all`] against -/// `eql-scalars::CATALOG` — a typo'd or mis-ordered domain fails there. +/// `eql-domains::CATALOG` — a typo'd or mis-ordered domain fails there. /// Public so FFI consumers can enumerate the protocol surface too. pub trait DomainType { /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"` — the @@ -92,7 +92,7 @@ pub trait DomainType { fn sql_domain(&self) -> &'static str; /// Unqualified SQL domain name (e.g. `"int4_eq"`) — [`Self::sql_domain`] - /// minus the schema qualifier; matches `eql-scalars` + /// minus the schema qualifier; matches `eql-domains` /// `ScalarSpec::domain_name`. fn domain(&self) -> &'static str { self.sql_domain() @@ -132,7 +132,7 @@ where } } -/// Every v3 domain type, in `eql-scalars::CATALOG` order (token order, then +/// Every v3 domain type, in `eql-domains::CATALOG` order (token order, then /// each token's domains in manifest order) — the one hand-maintained list of /// types in the crate. pub fn all() -> Vec> { diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-types/src/v3/terms.rs index 9a2bfc667..b322ed87d 100644 --- a/crates/eql-types/src/v3/terms.rs +++ b/crates/eql-types/src/v3/terms.rs @@ -7,7 +7,7 @@ //! schemars registers a named definition that every domain schema `$ref`s. //! A plain Rust `type` alias would vanish in both outputs. //! -//! Names follow the SEM constructor names in `eql-scalars` (`Term::ctor()`): +//! Names follow the SEM constructor names in `eql-domains` (`Term::ctor()`): //! a future scheme change (e.g. a 12-block wide ORE term for timestamptz //! ordering) is a new newtype, not a hunt through `Vec` fields. diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-types/tests/catalog_parity.rs index 465a51396..90aedb756 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-types/tests/catalog_parity.rs @@ -1,4 +1,4 @@ -//! The drift gate: the v3 domain inventory must mirror `eql-scalars::CATALOG` +//! The drift gate: the v3 domain inventory must mirror `eql-domains::CATALOG` //! — the same catalog that generates the `eql_v3` SQL surface — exactly: //! every domain, in catalog order, and every domain's wire contract, pinned //! through the published JSON Schema. schemars output reflects the real @@ -11,7 +11,7 @@ use std::collections::BTreeSet; -use eql_scalars::{Term, CATALOG, ENVELOPE_KEYS}; +use eql_domains::{Term, CATALOG, ENVELOPE_KEYS}; use eql_types::{v3, EQL_SCHEMA_VERSION}; use serde_json::{json, Value}; diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 3e7b2639b..dec932181 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -18,7 +18,7 @@ index-term types they return (`eql_v3.hmac_256`, needs and is fully self-contained (CI gates this — see §6). The whole SQL surface is **generated** from a single Rust source of truth: the -`CATALOG` const in [`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs), +`CATALOG` const in [`crates/eql-domains/src/lib.rs`](../../crates/eql-domains/src/lib.rs), rendered by the [`eql-codegen`](../../crates/eql-codegen/) crate. There is no TOML manifest and no Python — adding a type is adding one `ScalarSpec` row, validated by the compiler plus catalog `#[test]`s. The reference type is @@ -34,7 +34,7 @@ materializer (see §7). To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): -1. **Add a `ScalarSpec` row to `eql_scalars::CATALOG`** — `token`, `kind`, +1. **Add a `ScalarSpec` row to `eql_domains::CATALOG`** — `token`, `kind`, `domains`, `fixtures` (§2). If the type needs a new scalar width, add a `ScalarKind` variant first; if it needs new term behaviour, that goes in the `Term` enum's `impl`, never in catalog data. @@ -75,7 +75,7 @@ Hand-written SQL beyond the fixed surface goes in ## 2. The catalog row (`ScalarSpec`) A scalar type is one `ScalarSpec` row in -[`crates/eql-scalars/src/lib.rs`](../../crates/eql-scalars/src/lib.rs): +[`crates/eql-domains/src/lib.rs`](../../crates/eql-domains/src/lib.rs): ```rust ScalarSpec { @@ -118,7 +118,7 @@ than a runtime validator: comes from the `Term` enum. - **`fixtures`** — the type's plaintext fixture list (see below). -**Terms** are fixed by the `Term` enum (`crates/eql-scalars/src/lib.rs`). The +**Terms** are fixed by the `Term` enum (`crates/eql-domains/src/lib.rs`). The `json_key` / `extractor` / `ctor` values are the cross-schema SQL contract (the Returns column below is `eql_v3.` + `ctor`) — changing one is a generated-SQL behaviour change, not a refactor: @@ -227,7 +227,7 @@ comment on the `TIMESTAMPTZ` spec). Its value-wiring is the temporal path below; the only practical difference from `date` is that values are UTC-normalized. The three divergences (for the ordered `date`): -- **String-backed fixtures.** `eql-scalars` stays zero-dependency, so the +- **String-backed fixtures.** `eql-domains` stays zero-dependency, so the catalog stores ISO strings (`Fixture::Date("1970-01-01")`), not `chrono` values. There is **no** `int_values!` / `_VALUES` const for a temporal kind (chrono constructors are not `const`). The SQLx harness parses the catalog @@ -435,14 +435,14 @@ regenerate). Regeneration is deterministic: identical catalog + renderers produce byte-identical SQL. If `mise run build` produces unexpected output, the change -is in `crates/eql-scalars/src` (catalog/terms) or `crates/eql-codegen/src` +is in `crates/eql-domains/src` (catalog/terms) or `crates/eql-codegen/src` (renderers) — not run-to-run variation. Run, in order: - `cargo run -p eql-codegen` (optional; refreshes all generated SQL from the catalog before a full build) -- `mise run test:codegen` (`cargo test -p eql-scalars -p eql-codegen`) +- `mise run test:codegen` (`cargo test -p eql-domains -p eql-codegen`) - `mise run test:matrix:inventory` (matrix inventory + catalog cross-check; no database) - `mise run clean && mise run build` (regenerates every type's SQL from the @@ -718,7 +718,7 @@ ninety hand-written declarations that must agree with each other and with `eql-codegen` is a small Rust crate with a binary entry point. The generator runs as `cargo run -p eql-codegen` (no subcommand), which calls `generate::generate_all` (`crates/eql-codegen/src/generate.rs`) over every row of -`eql_scalars::CATALOG`, writing each type's SQL into +`eql_domains::CATALOG`, writing each type's SQL into `src/v3/scalars//`. A second subcommand, `cargo run -p eql-codegen -- list-types`, prints the catalog tokens one per line (consumed by the fixture and matrix-inventory enumeration). `main` (`crates/eql-codegen/src/main.rs`) @@ -738,7 +738,7 @@ preserved by the name patterns.) Stages, in order (`generate_all` → `generate_type`): -1. **Read the catalog.** `eql_scalars::CATALOG` is the in-binary source of truth +1. **Read the catalog.** `eql_domains::CATALOG` is the in-binary source of truth — a `&[ScalarSpec]`. There is no parse/validate stage at generation time: the catalog is validated at compile time (an undefined `Term` or unknown `ScalarKind` does not compile) and by the catalog `#[test]`s, so the data is @@ -796,10 +796,10 @@ domain's function and operator files), and carries Doxygen `--! @file` / ### Generator tests and the parity gate The generator's tests are Rust, run by `mise run test:codegen` (`cargo test -p -eql-scalars -p eql-codegen`) — no database. `mise run test:crates` adds `cargo +eql-domains -p eql-codegen`) — no database. `mise run test:crates` adds `cargo clippy ... -D warnings`. -- **`eql-scalars` unit tests** — `rust_tests`, `term_tests`, +- **`eql-domains` unit tests** — `rust_tests`, `term_tests`, `term_helper_tests`, `fixture_tests`, `catalog_tests`, `invariant_tests`, `values_tests` over `CATALOG`, the `Term` / `ScalarKind` / `Fixture` impls, and the materialised `_VALUES` consts. diff --git a/mise.toml b/mise.toml index f138ef247..5b0dba4df 100644 --- a/mise.toml +++ b/mise.toml @@ -31,7 +31,7 @@ "cargo:cargo-expand" = "1.0.122" # Still required by the documentation tooling (`tasks/docs/generate/*.py`, run # by `docs:generate:markdown` in the release workflow). The encrypted-domain -# codegen toolchain is now Rust (eql-scalars/eql-codegen) and needs no Python. +# codegen toolchain is now Rust (eql-domains/eql-codegen) and needs no Python. "python" = "3.13" [task_config] @@ -72,7 +72,7 @@ cd tests/sqlx sqlx migrate run # Regenerate fixtures every run — they are not committed (see .gitignore). -# fixture:generate:all iterates eql-scalars::CATALOG and generates every +# fixture:generate:all iterates eql-domains::CATALOG and generates every # scalar fixture in one process, so new scalar types are picked up # automatically (add the catalog row + the fixture wiring) without editing # this task. @@ -158,7 +158,7 @@ run = "bash tasks/codegen-parity.sh" description = "Run the encrypted-domain catalog + generator tests (no database required)" dir = "{{config_root}}" run = """ -cargo test -p eql-scalars -p eql-codegen +cargo test -p eql-domains -p eql-codegen """ [tasks."test:crates"] @@ -166,7 +166,7 @@ description = "Compile, lint and test the std-only Rust workspace crates (no dat dir = "{{config_root}}" run = """ #!/usr/bin/env bash -# eql-scalars / eql-codegen / eql-tests-macros / eql-types are the lean +# eql-domains / eql-codegen / eql-tests-macros / eql-types are the lean # workspace members. Scope explicitly to them (NOT --workspace): a # workspace-wide test would drag in tests/sqlx, whose suite needs Postgres + # CS_* secrets and is already covered by the `test` job. eql-tests-macros only @@ -179,8 +179,8 @@ run = """ # /bin/sh (dash on the CI images). set -euo pipefail cargo fmt --check -cargo clippy -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types --all-targets -- -D warnings -cargo test -p eql-scalars -p eql-codegen -p eql-tests-macros -p eql-types +cargo clippy -p eql-domains -p eql-codegen -p eql-tests-macros -p eql-types --all-targets -- -D warnings +cargo test -p eql-domains -p eql-codegen -p eql-tests-macros -p eql-types """ [tasks."types:generate"] @@ -473,7 +473,7 @@ run = """ #!/usr/bin/env bash # The jsonb-entry behaviour matrix (jsonb_entry_matrix!) is a SIBLING of the # scalar matrix inventory, NOT folded into it: JsonbEntryInt4 is deliberately -# not a eql-scalars::CATALOG type, so it has no scalars:::: tests and no +# not a eql-domains::CATALOG type, so it has no scalars:::: tests and no # `eql-codegen list-types` row. Its names live under `jsonb_entry::…` and are # pinned by this isolated snapshot (no catalog cross-check). No database needed. set -euo pipefail diff --git a/tasks/build.sh b/tasks/build.sh index 9fde04a1b..4724bdc2e 100755 --- a/tasks/build.sh +++ b/tasks/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash #MISE description="Build SQL into single release file" #MISE alias="b" -#MISE sources=["src/v3/**/*.sql", "src/v3/version.template", "tasks/pin_search_path_v3.sql", "tasks/uninstall-v3.sql", "crates/eql-scalars/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] +#MISE sources=["src/v3/**/*.sql", "src/v3/version.template", "tasks/pin_search_path_v3.sql", "tasks/uninstall-v3.sql", "crates/eql-domains/src/**/*.rs", "crates/eql-codegen/src/**/*.rs"] #MISE outputs=["release/cipherstash-encrypt.sql","release/cipherstash-encrypt-uninstall.sql"] #USAGE flag "--version " help="Specify release version of EQL" default="DEV" @@ -11,7 +11,7 @@ set -euo pipefail # Regenerate encrypted-domain SQL from the Rust catalog before building. # Generated files (src/v3/scalars//_*.sql) are gitignored; the -# catalog at crates/eql-scalars/src (eql-scalars::CATALOG) is the source of +# catalog at crates/eql-domains/src (eql-domains::CATALOG) is the source of # truth, rendered by the eql-codegen binary. # # Nuke every generated file first so a type removed from the catalog can't @@ -25,10 +25,10 @@ find src/v3/scalars -mindepth 2 -type f \ -o -name '*_aggregates.sql' \) \ -delete 2>/dev/null || true -# Regenerate every type — the catalog (eql-scalars::CATALOG) is the single +# Regenerate every type — the catalog (eql-domains::CATALOG) is the single # source of truth for the enumeration; eql-codegen renders all SQL in one # deterministic run. The plaintext fixture lists are not generated — the SQLx -# tests read them straight from the catalog (eql_scalars::INT4_VALUES / …). The +# tests read them straight from the catalog (eql_domains::INT4_VALUES / …). The # orphan sweep above still handles the catalog-removed case the generator cannot. cargo run -p eql-codegen diff --git a/tasks/fixtures.toml b/tasks/fixtures.toml index 688c8a006..9ce560485 100644 --- a/tasks/fixtures.toml +++ b/tasks/fixtures.toml @@ -1,8 +1,8 @@ ["fixture:generate:all"] -description = "Regenerate every scalar SQLx fixture in one process, driven by eql-scalars::CATALOG" +description = "Regenerate every scalar SQLx fixture in one process, driven by eql-domains::CATALOG" # Replaces the Python-era per-type `fixture:generate ` script and the # TOML-glob `fixture:generate:all` loop (one `cargo test` per type). The -# generate_all_fixtures test iterates eql-scalars::CATALOG and runs every +# generate_all_fixtures test iterates eql-domains::CATALOG and runs every # eql_v3_ fixture generator in a SINGLE process. The encrypted-fixture logic # is unchanged; only enumeration + entry point changed. # diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index 0b7de96b9..b002452fe 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -1,13 +1,13 @@ # Codegen reference -The SQL files under `/` (`int4/`, `int2/`, `int8/`, `date/`, `timestamptz/`, `text/`) are the committed reference SQL files for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). **Every catalog type has a reference**, generated once from a known-good run and committed. Although the generator is type-generic — its templates are pure token substitution driven by the `eql_scalars::CATALOG` rows (`crates/eql-scalars/src/lib.rs`) — the per-type domain *shapes* differ (ordered types carry `_ord`/`_ord_ore` + aggregates; `timestamptz` is equality-only; `text` carries the Bloom `text_match` domain whose `@>`/`<@` render as supported containment operators), so anchoring every type catches a regression in any shape, not just the ordered one. +The SQL files under `/` (`int4/`, `int2/`, `int8/`, `date/`, `timestamptz/`, `text/`) are the committed reference SQL files for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). **Every catalog type has a reference**, generated once from a known-good run and committed. Although the generator is type-generic — its templates are pure token substitution driven by the `eql_domains::CATALOG` rows (`crates/eql-domains/src/lib.rs`) — the per-type domain *shapes* differ (ordered types carry `_ord`/`_ord_ore` + aggregates; `timestamptz` is equality-only; `text` carries the Bloom `text_match` domain whose `@>`/`<@` render as supported containment operators), so anchoring every type catches a regression in any shape, not just the ordered one. Each reference file's first line is a `-- REFERENCE:` provenance marker; everything after it is the generated body verbatim, starting with the template-owned `-- AUTOMATICALLY GENERATED FILE.` header. The parity gate runs the generator (`cargo run -p eql-codegen`, which writes the real `src/v3/scalars//` trees) and asserts its output matches these files **byte-for-byte** after dropping that single provenance line. It runs three ways, all on the same references: - `mise run codegen:parity` (`tasks/codegen-parity.sh`) — the CI shell gate. It discovers the reference token dirs, and for each first compares the generated SQL *file set* against the reference `*.sql` set (`comm -23` against `git ls-files` excludes any committed, hand-written `_extensions.sql`, which has no reference counterpart) to catch extra/dropped files, then `diff`s each reference file against its generated counterpart after `tail -n +2` drops the provenance line. Any whitespace or blank-line drift fails — there is no normalization. -- `crates/eql-codegen/tests/parity.rs` — `rust_generator_matches_reference_files` runs `generate_all` into a temp dir and byte-compares every materialised token surface against its reference; `generate_all_is_deterministic_across_runs` asserts two runs are byte-identical; `reference_dirs_match_catalog_tokens` asserts the committed reference dir set **equals** the `eql_scalars::CATALOG` token set. +- `crates/eql-codegen/tests/parity.rs` — `rust_generator_matches_reference_files` runs `generate_all` into a temp dir and byte-compares every materialised token surface against its reference; `generate_all_is_deterministic_across_runs` asserts two runs are byte-identical; `reference_dirs_match_catalog_tokens` asserts the committed reference dir set **equals** the `eql_domains::CATALOG` token set. - the in-crate reference test in `crates/eql-codegen/src/generate.rs` (`generator_matches_reference_files`) — byte-compares each `render_*_file` output against the corresponding reference, for every token. The reference SQL files, not any retired generator, are the sole oracle. If the generator diverges, either it regressed (fix `crates/eql-codegen`) or the reference is being updated deliberately (regenerate and commit the new references in the same PR). @@ -26,4 +26,4 @@ A deliberate generator change (template/term/catalog edit) regenerates the affec ## No committed fixture values -Plaintext fixture lists are **not** generated and **not** committed as `_values.rs` files — there are none in the tree. They live in the catalog as `eql_scalars::INT4_VALUES` / `INT2_VALUES`, materialised at compile time by the `int_values!` macro in `crates/eql-scalars/src/lib.rs` from each `CATALOG` row, and pinned by `eql-scalars`'s own `values_tests`. The parity gate only globs `*.sql`; it does not check any `values.rs`. +Plaintext fixture lists are **not** generated and **not** committed as `_values.rs` files — there are none in the tree. They live in the catalog as `eql_domains::INT4_VALUES` / `INT2_VALUES`, materialised at compile time by the `int_values!` macro in `crates/eql-domains/src/lib.rs` from each `CATALOG` row, and pinned by `eql-domains`'s own `values_tests`. The parity gate only globs `*.sql`; it does not check any `values.rs`. diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index 13970e0fd..731707092 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -22,7 +22,7 @@ chrono = { version = "0.4", default-features = false } # transitively (cipherstash-client / ore-rs). rust_decimal = "1" paste = "1" -eql-scalars = { path = "../../crates/eql-scalars" } +eql-domains = { path = "../../crates/eql-domains" } eql-tests-macros = { path = "../../crates/eql-tests-macros" } # proptest is a regular dependency (not dev-only): `ScalarType::arbitrary_value` # is a non-test trait method returning `proptest::strategy::BoxedStrategy`, so the diff --git a/tests/sqlx/README.md b/tests/sqlx/README.md index 6e3e4b776..8ecd2b198 100644 --- a/tests/sqlx/README.md +++ b/tests/sqlx/README.md @@ -273,7 +273,7 @@ Tests connect to PostgreSQL database configured by SQLx: - ✅ ~~Convert remaining SQL tests~~ **COMPLETE!** - Property-based tests: implemented in `tests/encrypted_domain/property/` and - `crates/eql-scalars/src/proptest_invariants.rs` (CIP-3141). One unit-level + `crates/eql-domains/src/proptest_invariants.rs` (CIP-3141). One unit-level **catalog** suite (no DB) plus two integration suites — **fixture** (operator + function-double oracles, term-extractor identity, and bloom match smoke over the committed real-ciphertext fixtures) and **e2e** (oracle over fresh end-to-end diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 3ff213937..1a39ee54b 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -11,7 +11,7 @@ by the Rust fixture framework in `tests/sqlx/src/fixtures/` and is gitignored. ## Generated `eql_v3` fixtures `mise run fixture:generate:all` (the `generate_all_fixtures` test, run over -`eql-scalars::CATALOG`) materialises the fixtures into this directory: +`eql-domains::CATALOG`) materialises the fixtures into this directory: ```text Generated eql_v3 fixtures (gitignored) diff --git a/tests/sqlx/migrations/README.md b/tests/sqlx/migrations/README.md index 974c3c652..3318b352f 100644 --- a/tests/sqlx/migrations/README.md +++ b/tests/sqlx/migrations/README.md @@ -36,7 +36,7 @@ cp release/cipherstash-encrypt.sql tests/sqlx/migrations/001_install_eql.sql ## Adding New Test Data Test data is provided by generated fixtures, not migrations. To add a new -scalar fixture, add a row to `eql-scalars::CATALOG`; the generator produces +scalar fixture, add a row to `eql-domains::CATALOG`; the generator produces `tests/sqlx/fixtures/eql_v3_.sql` on the next `mise run test:sqlx`. A test opts in with `#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_")))]`. See `tests/sqlx/fixtures/FIXTURE_SCHEMA.md`. diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 52ae0d286..905175408 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -147,7 +147,7 @@ catalog cross-check) fails the job. ## When you must update this - **Adding a new scalar type** → add the catalog row in - `eql-scalars::CATALOG`, wire the SQLx matrix oracle (see + `eql-domains::CATALOG`, wire the SQLx matrix oracle (see `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3), then run `mise run test:matrix:inventory`. No snapshot edit is needed for an ordered (`caps = [eq, ord]`) type (matches the canonical baseline) or an equality-only @@ -173,7 +173,7 @@ See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3 (matrix oracle behaviour matrix (`jsonb_entry_matrix!`), whose names live under `jsonb_entry::…`. It is a deliberate **sibling** of the scalar matrix inventory above, **not** folded into it: the driver type (`JsonbEntryInt4`) is intentionally -not an `eql-scalars::CATALOG` type, so it has no `scalars::::` tests and no +not an `eql-domains::CATALOG` type, so it has no `scalars::::` tests and no `eql-codegen list-types` row — hence this snapshot is checked on its own, with **no catalog cross-check**. The matrix reuses the scalar matrix generators to exercise `eql_v3.ste_vec_entry` equality/order/aggregate behaviour. No database diff --git a/tests/sqlx/src/fixtures/eql_plaintext.rs b/tests/sqlx/src/fixtures/eql_plaintext.rs index 234c14906..fd79ef56e 100644 --- a/tests/sqlx/src/fixtures/eql_plaintext.rs +++ b/tests/sqlx/src/fixtures/eql_plaintext.rs @@ -14,7 +14,7 @@ use std::fmt; use cipherstash_client::encryption::Plaintext; -use eql_scalars::ScalarKind; +use eql_domains::ScalarKind; /// The `cast_as` argument identifying a plaintext's target SQL type for /// encryption. The field is private so the allowlist is the set of @@ -81,7 +81,7 @@ impl fmt::Display for PlaintextSqlType { /// /// Only the wired kinds (the integer kinds, `Text`, plus `Date` / `Timestamptz`) /// have `EqlPlaintext` impls, so only those resolve; the remaining kinds mirror the -/// `eql_scalars` accessor convention and `panic!`, since no impl can ever reach +/// `eql_domains` accessor convention and `panic!`, since no impl can ever reach /// them. const fn cast_for_kind(kind: ScalarKind) -> Cast { match kind { diff --git a/tests/sqlx/src/fixtures/mod.rs b/tests/sqlx/src/fixtures/mod.rs index 65c2528c2..a97644692 100644 --- a/tests/sqlx/src/fixtures/mod.rs +++ b/tests/sqlx/src/fixtures/mod.rs @@ -33,7 +33,7 @@ pub mod driver; pub mod v3_ste_vec; // The scalar-shaped SteVec document fixture — a SteVec document carrying one -// int4 scalar at `$.field` per `eql_scalars::INT4_VALUES`. A SPLIT fixture +// int4 scalar at `$.field` per `eql_domains::INT4_VALUES`. A SPLIT fixture // (jsonb-document encryption input, int4 plaintext oracle), so it uses the // `run_with_payloads` seam rather than `FixtureSpec::run`. Drives the // jsonb-entry behaviour matrix (`JsonbEntryInt4`). @@ -47,7 +47,7 @@ pub mod v3_doc_int4; pub mod v3_numeric_collision; // The empty-string ordered-text fixture (`""`, `"frank"`, `"zebra"`). Not a -// CATALOG scalar — `eql-scalars::TEXT_FIXTURES` deliberately excludes `""` +// CATALOG scalar — `eql-domains::TEXT_FIXTURES` deliberately excludes `""` // (issue #262) — so it is hand-written and registered here directly (like the // other `v3_` fixtures). Gives the "empty sorts first" contract (ORDER BY / // min / max over `text_ord`) a committed real-ciphertext home. @@ -60,5 +60,5 @@ pub mod eql_doubles; // The per-type scalar fixture modules (`eql_v3_int4`, `eql_v3_int2`, …) are // generated from the harness list in `scalar_types.rs`. Each expands to // `pub mod eql_v3_ { … scalar_fixture! … }`, reading its plaintext values -// directly from the catalog (`eql_scalars::_VALUES`). +// directly from the catalog (`eql_domains::_VALUES`). crate::scalar_types!(fixture_modules); diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 4b68f20f2..8574f396a 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -35,7 +35,7 @@ /// /// - `$name` — the fixture name (`"eql_v3_int2"`), drives every derived path. /// - `$ty` — the Rust plaintext type (`i16` / `chrono::NaiveDate` / `String`). -/// - `$values` — the value source: the catalog const (`eql_scalars::INT2_VALUES`) +/// - `$values` — the value source: the catalog const (`eql_domains::INT2_VALUES`) /// for integers, or the harness accessor (`date_values()` / `text_values()`). /// /// `Unique` drives `=` / `<>` (HMAC); `Ore` drives `<` `<=` `>` `>=` (ORE block diff --git a/tests/sqlx/src/fixtures/v3_doc_int4.rs b/tests/sqlx/src/fixtures/v3_doc_int4.rs index 4002c73f1..7249c0e7e 100644 --- a/tests/sqlx/src/fixtures/v3_doc_int4.rs +++ b/tests/sqlx/src/fixtures/v3_doc_int4.rs @@ -1,5 +1,5 @@ //! The `v3_doc_int4` fixture — a SteVec document carrying one int4 scalar at -//! `$.field`, one row per `eql_scalars::INT4_VALUES`. Lets the scalar matrix's +//! `$.field`, one row per `eql_domains::INT4_VALUES`. Lets the scalar matrix's //! behaviour generators run against the entry extracted at that selector //! (`payload -> SELECTOR`), reusing the int4 oracle. //! @@ -53,7 +53,7 @@ pub const SELECTOR: &str = "fce8be759db230351b10a058b7ba50a7"; /// Build the plaintext documents: `{"field": }` per int4 fixture value, /// paired with the bare int4 oracle value. fn documents() -> Vec<(i32, Value)> { - eql_scalars::INT4_VALUES + eql_domains::INT4_VALUES .iter() .map(|&v| (v, serde_json::json!({ FIELD: v }))) .collect() @@ -99,7 +99,7 @@ mod tests { #[test] fn documents_are_one_per_int4_fixture_value() { let docs = documents(); - assert_eq!(docs.len(), eql_scalars::INT4_VALUES.len()); + assert_eq!(docs.len(), eql_domains::INT4_VALUES.len()); for (v, doc) in &docs { assert_eq!(doc[FIELD].as_i64(), Some(*v as i64)); } diff --git a/tests/sqlx/src/fixtures/v3_text_empty.rs b/tests/sqlx/src/fixtures/v3_text_empty.rs index b15fcb63c..6a2a66a5c 100644 --- a/tests/sqlx/src/fixtures/v3_text_empty.rs +++ b/tests/sqlx/src/fixtures/v3_text_empty.rs @@ -4,7 +4,7 @@ //! Hand-written, non-catalog (like `v3_numeric_collision`), because the //! catalog-driven `eql_v2_text` fixture deliberately EXCLUDES `""`: encrypting //! the empty string yields an empty ORE term (`ob: []`), the only value that -//! does, so `eql-scalars::TEXT_FIXTURES` drops it. This bespoke fixture is the +//! does, so `eql-domains::TEXT_FIXTURES` drops it. This bespoke fixture is the //! one place a real-ciphertext empty-`ob` payload lives — its purpose is to //! prove the ORE-bearing domains REJECT that payload at their non-empty-`ob` //! CHECK (issue #262, SQLSTATE `23514`), while the non-empty controls cast and diff --git a/tests/sqlx/src/jsonb_entry.rs b/tests/sqlx/src/jsonb_entry.rs index 811671fa0..25f63fcbc 100644 --- a/tests/sqlx/src/jsonb_entry.rs +++ b/tests/sqlx/src/jsonb_entry.rs @@ -5,7 +5,7 @@ //! matrix's correctness/ordering/null/order-by/count/index generators run //! against jsonb-entry comparisons instead of whole-column scalar casts. //! -//! It is deliberately NOT a `eql_scalars::CATALOG` scalar (it has no generated +//! It is deliberately NOT a `eql_domains::CATALOG` scalar (it has no generated //! domain family and must stay out of the scalar matrix inventory). The entry //! suite invokes it through the reduced `jsonb_entry_matrix!` macro. @@ -41,7 +41,7 @@ impl<'r> sqlx::Decode<'r, sqlx::Postgres> for JsonbEntryInt4 { /// because the trait returns `&'static [Self]` and `i32`'s const slice cannot /// be reinterpreted as `&[JsonbEntryInt4]` without an allocation. static VALUES: std::sync::LazyLock> = std::sync::LazyLock::new(|| { - eql_scalars::INT4_VALUES + eql_domains::INT4_VALUES .iter() .copied() .map(JsonbEntryInt4) @@ -157,7 +157,7 @@ mod tests { .iter() .map(|e| e.0) .collect(); - assert_eq!(got, eql_scalars::INT4_VALUES.to_vec()); + assert_eq!(got, eql_domains::INT4_VALUES.to_vec()); } #[test] diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index cf1286403..c7395ce52 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -20,7 +20,7 @@ use crate::scalar_domains::{ScalarDomainSpec, ScalarType, Variant}; use anyhow::{Context, Result}; -use eql_scalars::Term; +use eql_domains::Term; use sqlx::{PgPool, Row as _}; /// Apply the SQLx migrations (the EQL install in `001_install_eql.sql`, plus the diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 8401d7175..e3aa3e180 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -10,7 +10,7 @@ //! `T::fixture_values()`, and the `Variant` enum. use anyhow::{bail, Context, Result}; -use eql_scalars::{Term, CATALOG}; +use eql_domains::{Term, CATALOG}; use sqlx::PgPool; use std::fmt::{Debug, Display}; @@ -44,7 +44,7 @@ pub trait ScalarType: /// `chrono::NaiveDate`, whose `from_ymd_opt` is not `const`) cannot be /// materialised into a const slice; the harness builds those into a /// `LazyLock>` and returns a borrow of it (see `date_values`). - /// Integer scalars return their `eql_scalars::_VALUES` const directly. + /// Integer scalars return their `eql_domains::_VALUES` const directly. /// /// For types driven by `scalar_matrix!` (caps = [eq, ord]), the values MUST /// include the three `OrderedScalar` pivots (`min_pivot()`, `max_pivot()`, @@ -223,7 +223,7 @@ pub trait MatchScalar: ScalarType { } // The per-type `impl ScalarType` blocks for the **integer** scalars (each -// carrying its `PG_TYPE` token, `fixture_values() = eql_scalars::_VALUES`, +// carrying its `PG_TYPE` token, `fixture_values() = eql_domains::_VALUES`, // and `min_pivot()`/`max_pivot()` = `Self::MIN`/`Self::MAX`) are generated from // the single harness list in `scalar_types.rs`. To add an integer type, add a // `token => rust_type` line there — not an impl here. @@ -239,7 +239,7 @@ crate::scalar_types!(scalar_type_impls); /// catalog row: a `LazyLock>` parsing the catalog fixture strings, a /// public `()` returning a borrow of it, `impl ScalarType for T`, and /// a `#[cfg(test)]` module asserting the parsed values track the catalog and -/// include the pivots. The chrono analogue of `eql_scalars::int_values!` +/// include the pivots. The chrono analogue of `eql_domains::int_values!` /// (integers materialise a `const` slice; temporals can't, so values live in a /// `LazyLock`). `parse`/`sql_lit` are expressions so each type supplies its own /// chrono parsing and SQL literal form. Boundary pivots are not parameters: they @@ -261,7 +261,7 @@ macro_rules! temporal_values { .fixtures .iter() .map(|f| match f { - ::eql_scalars::Fixture::$variant(s) => parse(s), + ::eql_domains::Fixture::$variant(s) => parse(s), other => panic!(concat!("non-", $pg, " fixture in ", $pg, " catalog row: {:?}"), other), }) .collect() @@ -309,7 +309,7 @@ macro_rules! temporal_values { fn values_match_catalog_fixtures() { let parse: fn(&str) -> $ty = $parse; let want: Vec<$ty> = $spec.fixtures.iter().map(|f| match f { - ::eql_scalars::Fixture::$variant(s) => parse(s), + ::eql_domains::Fixture::$variant(s) => parse(s), other => panic!("non-{} fixture: {:?}", $pg, other), }).collect(); assert_eq!($accessor(), want.as_slice()); @@ -338,10 +338,10 @@ macro_rules! temporal_values { /// kind-agnostic core shared by every non-integer scalar: `temporal_values!` /// adds the chrono-specific `ScalarType`/`OrderedScalar`/`SignedScalar` wiring on /// top, while `text`/`numeric` supply their own (they are not signed). Integer -/// scalars do not use this — they materialise a `const` slice in `eql-scalars` +/// scalars do not use this — they materialise a `const` slice in `eql-domains` /// (`int_values!`) and impl `ScalarType` via the proc-macro. /// -/// `$variant` is the `eql_scalars::Fixture` variant this scalar's rows use +/// `$variant` is the `eql_domains::Fixture` variant this scalar's rows use /// (`Text`/`Numeric`/`Date`/`Timestamptz`); `$parse` maps each `&Fixture` to /// `$ty` (and owns its own loud "wrong variant" panic). The accessor is `pub` so /// the `eql_v3_` fixture module can hand the slice to `scalar_fixture!`. @@ -356,7 +356,7 @@ macro_rules! lazy_values { parse = $parse:expr $(,)? ) => { static $cell: std::sync::LazyLock> = std::sync::LazyLock::new(|| { - let parse: fn(&::eql_scalars::Fixture) -> $ty = $parse; + let parse: fn(&::eql_domains::Fixture) -> $ty = $parse; $spec.fixtures.iter().map(parse).collect() }); @@ -377,7 +377,7 @@ temporal_values! { cell = DATE_VALUES_CELL, accessor = date_values, rust_type = chrono::NaiveDate, - spec = eql_scalars::DATE, + spec = eql_domains::DATE, variant = Date, pg_type = "date", parse = |s| chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d") @@ -395,7 +395,7 @@ temporal_values! { cell = TIMESTAMPTZ_VALUES_CELL, accessor = timestamptz_values, rust_type = chrono::DateTime, - spec = eql_scalars::TIMESTAMPTZ, + spec = eql_domains::TIMESTAMPTZ, variant = Timestamptz, pg_type = "timestamptz", parse = |s| chrono::DateTime::parse_from_rfc3339(s) @@ -407,7 +407,7 @@ temporal_values! { /// Focused guards for the timestamptz value wiring that the `temporal_values!` /// auto-generated tests can't cover, because every catalog fixture is already /// `…Z` (UTC). Both tests intentionally live in the harness, not in -/// `eql-scalars`, which is deliberately zero-dep (no chrono). +/// `eql-domains`, which is deliberately zero-dep (no chrono). #[cfg(test)] mod timestamptz_value_guards { use super::*; @@ -439,7 +439,7 @@ mod timestamptz_value_guards { assert_eq!((utc.hour(), utc.day()), (0, 1)); } - /// `eql-scalars::invariant_tests::fixture_values_are_distinct_by_resolved_number` + /// `eql-domains::invariant_tests::fixture_values_are_distinct_by_resolved_number` /// keys `Fixture::Timestamptz` by its literal string, so two RFC3339 strings /// that denote the same UTC instant (e.g. `…00:00Z` vs `…01:00+01:00`) would /// pass as "distinct" there. The fixture *table* keys on the parsed @@ -461,7 +461,7 @@ mod timestamptz_value_guards { // `text` is hand-written rather than driven by `temporal_values!`: it is an // owned `String` (not chrono-backed), so it materialises its values from the -// `eql_scalars::TEXT_VALUES` const slice rather than parsing catalog strings. +// `eql_domains::TEXT_VALUES` const slice rather than parsing catalog strings. // `text_values()` is public so the `eql_v3_text` fixture module (emitted by // `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. @@ -475,11 +475,11 @@ lazy_values! { cell = TEXT_VALUES_CELL, accessor = text_values, rust_type = String, - spec = eql_scalars::TEXT, + spec = eql_domains::TEXT, variant = Text, pg_type = "text", parse = |f| match f { - eql_scalars::Fixture::Text(s) => s.to_string(), + eql_domains::Fixture::Text(s) => s.to_string(), other => panic!("non-text fixture in text catalog row: {other:?}"), }, } @@ -541,7 +541,7 @@ impl MatchScalar for String { // `numeric` is hand-written (like `text`): an owned `rust_decimal::Decimal`, // not chrono-backed, so it parses the catalog's `Fixture::Numeric` strings into // a `LazyLock>` rather than going through `temporal_values!`. The -// catalog stays zero-dep, so the parse happens here, not in `eql-scalars`. +// catalog stays zero-dep, so the parse happens here, not in `eql-domains`. // `numeric`'s value wiring goes through the shared `lazy_values!` materializer // (same as `text`), parsing the catalog's `Fixture::Numeric` strings into @@ -553,11 +553,11 @@ lazy_values! { cell = NUMERIC_VALUES_CELL, accessor = numeric_values, rust_type = rust_decimal::Decimal, - spec = eql_scalars::NUMERIC, + spec = eql_domains::NUMERIC, variant = Numeric, pg_type = "numeric", parse = |f| match f { - eql_scalars::Fixture::Numeric(s) => { + eql_domains::Fixture::Numeric(s) => { use std::str::FromStr; rust_decimal::Decimal::from_str(s) .unwrap_or_else(|e| panic!("invalid numeric catalog fixture {s:?}: {e}")) @@ -592,7 +592,7 @@ impl OrderedScalar for rust_decimal::Decimal { // ordered non-integer kind. The signed-only sign-boundary test bounds on // `SignedScalar`, so it is not instantiated for numeric. -/// `eql-scalars`' distinctness invariant keys `Fixture::Numeric` by its literal +/// `eql-domains`' distinctness invariant keys `Fixture::Numeric` by its literal /// string, so `"1"` and `"1.0"` would pass there as "distinct". But they denote /// the same `Decimal` value (and collide in the ORE ciphertext, per ore-rs's /// `equivalent_forms_collide_in_ciphertext`), so an aliasing pair would insert @@ -641,11 +641,11 @@ mod numeric_value_guards { /// order (`[false, true]`). Public so the `eql_v3_bool` fixture module (emitted /// by `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. static BOOL_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock::new(|| { - eql_scalars::BOOL + eql_domains::BOOL .fixtures .iter() .map(|f| match f { - eql_scalars::Fixture::Bool(b) => *b, + eql_domains::Fixture::Bool(b) => *b, other => panic!("non-bool fixture in bool catalog row: {other:?}"), }) .collect() @@ -757,7 +757,7 @@ mod text_value_tests { .iter() .map(|s| s.as_str()) .collect(); - assert_eq!(got, eql_scalars::TEXT_VALUES.to_vec()); + assert_eq!(got, eql_domains::TEXT_VALUES.to_vec()); } /// Directly exercises the `String` `to_sql_literal` override's @@ -881,11 +881,11 @@ lazy_values! { cell = FLOAT4_VALUES_CELL, accessor = float4_values, rust_type = F4, - spec = eql_scalars::FLOAT4, + spec = eql_domains::FLOAT4, variant = Float, pg_type = "float4", parse = |f| match f { - eql_scalars::Fixture::Float(s) => F4(s + eql_domains::Fixture::Float(s) => F4(s .parse() .unwrap_or_else(|e| panic!("invalid float4 catalog fixture {s:?}: {e}"))), other => panic!("non-float fixture in float4 catalog row: {other:?}"), @@ -896,11 +896,11 @@ lazy_values! { cell = FLOAT8_VALUES_CELL, accessor = float8_values, rust_type = F8, - spec = eql_scalars::FLOAT8, + spec = eql_domains::FLOAT8, variant = Float, pg_type = "float8", parse = |f| match f { - eql_scalars::Fixture::Float(s) => F8(s + eql_domains::Fixture::Float(s) => F8(s .parse() .unwrap_or_else(|e| panic!("invalid float8 catalog fixture {s:?}: {e}"))), other => panic!("non-float fixture in float8 catalog row: {other:?}"), @@ -989,11 +989,11 @@ mod float_value_guards { fn float4_values_match_catalog_and_are_finite_non_negative_zero() { let vals = float4_values(); // Parsed from the catalog, in order. - let want: Vec = eql_scalars::FLOAT4 + let want: Vec = eql_domains::FLOAT4 .fixtures .iter() .map(|f| match f { - eql_scalars::Fixture::Float(s) => F4(s.parse().unwrap()), + eql_domains::Fixture::Float(s) => F4(s.parse().unwrap()), other => panic!("non-float fixture: {other:?}"), }) .collect(); @@ -1009,11 +1009,11 @@ mod float_value_guards { #[test] fn float8_values_match_catalog_and_are_finite_non_negative_zero() { let vals = float8_values(); - let want: Vec = eql_scalars::FLOAT8 + let want: Vec = eql_domains::FLOAT8 .fixtures .iter() .map(|f| match f { - eql_scalars::Fixture::Float(s) => F8(s.parse().unwrap()), + eql_domains::Fixture::Float(s) => F8(s.parse().unwrap()), other => panic!("non-float fixture: {other:?}"), }) .collect(); @@ -1682,7 +1682,7 @@ mod arbitrary_value_tests { #[cfg(test)] mod oracle_inventory_tests { use super::*; - use eql_scalars::CATALOG; + use eql_domains::CATALOG; /// The set of catalog tokens that should get an `eq` + `ord` fixture/e2e /// oracle suite is exactly the ordered (non-storage-only) scalars. Pin it so diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 9a9d5abf1..623adc2e1 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -2,11 +2,11 @@ //! source of truth. //! //! To add a scalar encrypted-domain type to the SQLx matrix, add one -//! `token => rust_type` line below (plus the catalog row in `eql-scalars` and +//! `token => rust_type` line below (plus the catalog row in `eql-domains` and //! the `EqlPlaintext` impl, owned separately — see //! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). The entry //! carries no shape marker: whether a type is temporal (chrono-backed) or -//! equality-only is read from its `eql-scalars::CATALOG` row +//! equality-only is read from its `eql-domains::CATALOG` row //! (`ScalarKind::is_temporal()` / `ScalarSpec::is_eq_only()`). A temporal //! scalar generates its `impl ScalarType` via `temporal_values!` in //! `scalar_domains.rs` and gets pivot-presence fixture asserts instead of the @@ -34,7 +34,7 @@ /// selected by `$mode` (see module docs for call sites). /// /// This is the only place the harness token set is declared. Keep it in sync -/// with `eql-scalars::CATALOG`; the matrix-inventory cross-check enforces it. +/// with `eql-domains::CATALOG`; the matrix-inventory cross-check enforces it. #[macro_export] macro_rules! scalar_types { (scalar_type_impls) => { diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index 9e58ff616..b4a0b9496 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -120,7 +120,7 @@ async fn placeholder_payload_casts_to_every_declared_domain(pool: PgPool) -> Res // moment its CATALOG row lands — no per-type edit here. // // (Was i32-only with a TODO to generalize; the TODO is now done.) - use eql_scalars::CATALOG; + use eql_domains::CATALOG; for spec in CATALOG { for domain in spec.domains { let sql_domain = format!("eql_v3.{}{}", spec.token, domain.suffix); diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index 1429b0b61..b3ba3e88a 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -6,7 +6,7 @@ //! (containment / path query / array ops / the operator-surface guard) remain //! in `v3_jsonb_tests` / `v3_jsonb_operator_surface_tests`. //! -//! The view type (`JsonbEntryInt4`) is deliberately NOT a `eql_scalars::CATALOG` +//! The view type (`JsonbEntryInt4`) is deliberately NOT a `eql_domains::CATALOG` //! scalar, so this suite is hand-written rather than emitted by the //! `scalar_types!` list — and its test names live under `jsonb_entry::…`, //! validated by `test:matrix:inventory:jsonb_entry` (NOT the scalar inventory). diff --git a/tests/sqlx/tests/encrypted_domain/property/README.md b/tests/sqlx/tests/encrypted_domain/property/README.md index 60db921a5..8200919ac 100644 --- a/tests/sqlx/tests/encrypted_domain/property/README.md +++ b/tests/sqlx/tests/encrypted_domain/property/README.md @@ -13,7 +13,7 @@ named for what they operate on, not by an abstract tier letter: | Suite | Location | Kind | Inputs | DB / creds | |-------|----------|------|--------|------------| -| **catalog** | [`crates/eql-scalars/src/proptest_invariants.rs`](../../../../../crates/eql-scalars/src/proptest_invariants.rs) | unit (pure Rust) | generated terms / kinds | none — runs in fork CI | +| **catalog** | [`crates/eql-domains/src/proptest_invariants.rs`](../../../../../crates/eql-domains/src/proptest_invariants.rs) | unit (pure Rust) | generated terms / kinds | none — runs in fork CI | | **fixture** | [`fixture_oracle.rs`](./fixture_oracle.rs) | integration | committed fixture rows (real ciphertext) | isolated per-test DB (`#[sqlx::test]`) | | **e2e** | [`e2e_oracle.rs`](./e2e_oracle.rs) | integration | freshly generated plaintexts, encrypted each run | shared test DB **+ ZeroKMS creds** | @@ -32,10 +32,10 @@ payloads. ### catalog — catalog invariants, no database -Pure-Rust `proptest` over the `eql-scalars` catalog: term/operator/extractor +Pure-Rust `proptest` over the `eql-domains` catalog: term/operator/extractor consistency, "every blocker is non-`STRICT` + `plpgsql`", payload-key set == declared terms, integer-range ordering. No DB, no encryption, no creds, so it -runs in the lean `cargo test -p eql-scalars` path (and on fork PRs). This is the +runs in the lean `cargo test -p eql-domains` path (and on fork PRs). This is the only suite where `proptest` shrinking is meaningful and enabled. ### fixture — oracle over committed ciphertext @@ -156,7 +156,7 @@ encryption to reach inputs the fixtures can't. ```bash # catalog suite only (no DB, no creds) -cargo test -p eql-scalars proptest_invariants +cargo test -p eql-domains proptest_invariants # fixture + edge-case suites (needs a prepared DB) mise run test:sqlx:prep diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index fcbe894e8..fd0028208 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -47,7 +47,7 @@ async fn disjoint_value_does_not_match(pool: PgPool) -> anyhow::Result<()> { // A bloom filter is probabilistic and admits false positives, so a true // negative is only deterministic for inputs that share no n-grams. "aard" // (3-grams `aar`, `ard`) and "zzzz" (`zzz`) are chosen ngram-disjoint in - // TEXT_FIXTURES (crates/eql-scalars/src/lib.rs) precisely for this assertion; + // TEXT_FIXTURES (crates/eql-domains/src/lib.rs) precisely for this assertion; // keep them disjoint if the fixture list changes. let hay = payload_for(&pool, "aard").await?; let needle = payload_for(&pool, "zzzz").await?; diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index 64f1e5d72..eeb2409fe 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -3,7 +3,7 @@ //! Replaces the Python-era `fixture:generate ` per-type scripts and the //! `fixture:generate:all` TOML-glob loop (which spawned a separate `cargo test` //! per type). This runs ALL scalar fixture generators in ONE process, iterating -//! `eql_scalars::CATALOG` for the authoritative token set. +//! `eql_domains::CATALOG` for the authoritative token set. //! //! The encrypted-fixture logic itself is unchanged — each type's //! `fixtures::eql_v3_::spec().run()` still produces @@ -13,7 +13,7 @@ //! mise run fixture:generate:all #![cfg(feature = "fixture-gen")] -use eql_scalars::CATALOG; +use eql_domains::CATALOG; // `generate_for_token(token: &str) -> anyhow::Result<()>` is generated from the // single harness list in `tests/sqlx/src/scalar_types.rs`: one match arm per @@ -43,7 +43,7 @@ async fn generate_all() -> anyhow::Result<()> { eprintln!("Regenerated v3_ste_vec."); // The scalar-shaped SteVec document fixture — one `{"field": }` - // document per `eql_scalars::INT4_VALUES`, with an int4 plaintext oracle — + // document per `eql_domains::INT4_VALUES`, with an int4 plaintext oracle — // drives the jsonb-entry behaviour matrix. Same pipeline, split payload // (jsonb-document encryption input, int4 oracle column). eprintln!("Generating fixture v3_doc_int4 (scalar-shaped SteVec document)..."); @@ -60,7 +60,7 @@ async fn generate_all() -> anyhow::Result<()> { eprintln!("Regenerated v3_numeric_collision."); // The empty-string ordered-text fixture (`""`, `"frank"`, `"zebra"`). Not a - // CATALOG scalar — `eql-scalars::TEXT_FIXTURES` excludes `""` (issue #262) — + // CATALOG scalar — `eql-domains::TEXT_FIXTURES` excludes `""` (issue #262) — // so it rides the same pipeline as a hand-written `FixtureSpec`. // Gives the "empty sorts first" contract (ORDER BY / min / max) a committed // real-ciphertext home. From 2c06100f15b87be3be0f4b76cebe8bea41bab673 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 19:19:15 +1000 Subject: [PATCH 364/599] refactor: rename eql-types crate to eql-bindings Pure mechanical rename (PR 1 of unified-catalog-codegen refactor): crate dir (carrying committed bindings/+schema/ via git mv), Cargo package name, import path eql_types->eql_bindings, mise types:* tasks, and load-bearing doc paths. EQL_TYPES_SCHEMA_DIR env var name kept. No type/field/TS/JSON changes. --- .github/workflows/README.md | 2 +- Cargo.lock | 22 +++++++------- Cargo.toml | 4 +-- DEVELOPMENT.md | 2 +- crates/{eql-types => eql-bindings}/.gitignore | 0 crates/{eql-types => eql-bindings}/Cargo.toml | 2 +- crates/{eql-types => eql-bindings}/README.md | 6 ++-- .../bindings/v3/BloomFilter.ts | 0 .../bindings/v3/Bool.ts | 0 .../bindings/v3/Ciphertext.ts | 0 .../bindings/v3/Date.ts | 0 .../bindings/v3/DateEq.ts | 0 .../bindings/v3/DateOrd.ts | 0 .../bindings/v3/DateOrdOre.ts | 0 .../bindings/v3/Float4.ts | 0 .../bindings/v3/Float4Eq.ts | 0 .../bindings/v3/Float4Ord.ts | 0 .../bindings/v3/Float4OrdOre.ts | 0 .../bindings/v3/Float8.ts | 0 .../bindings/v3/Float8Eq.ts | 0 .../bindings/v3/Float8Ord.ts | 0 .../bindings/v3/Float8OrdOre.ts | 0 .../bindings/v3/Hmac256.ts | 0 .../bindings/v3/Identifier.ts | 0 .../bindings/v3/Int2.ts | 0 .../bindings/v3/Int2Eq.ts | 0 .../bindings/v3/Int2Ord.ts | 0 .../bindings/v3/Int2OrdOre.ts | 0 .../bindings/v3/Int4.ts | 0 .../bindings/v3/Int4Eq.ts | 0 .../bindings/v3/Int4Ord.ts | 0 .../bindings/v3/Int4OrdOre.ts | 0 .../bindings/v3/Int8.ts | 0 .../bindings/v3/Int8Eq.ts | 0 .../bindings/v3/Int8Ord.ts | 0 .../bindings/v3/Int8OrdOre.ts | 0 .../bindings/v3/Numeric.ts | 0 .../bindings/v3/NumericEq.ts | 0 .../bindings/v3/NumericOrd.ts | 0 .../bindings/v3/NumericOrdOre.ts | 0 .../bindings/v3/OreBlock256.ts | 0 .../bindings/v3/SchemaVersion.ts | 0 .../bindings/v3/Text.ts | 0 .../bindings/v3/TextEq.ts | 0 .../bindings/v3/TextMatch.ts | 0 .../bindings/v3/TextOrd.ts | 0 .../bindings/v3/TextOrdOre.ts | 0 .../bindings/v3/TextSearch.ts | 0 .../bindings/v3/Timestamptz.ts | 0 .../bindings/v3/TimestamptzEq.ts | 0 .../bindings/v3/TimestamptzOrd.ts | 0 .../bindings/v3/TimestamptzOrdOre.ts | 0 .../schema/v3/bool.json | 0 .../schema/v3/date.json | 0 .../schema/v3/date_eq.json | 0 .../schema/v3/date_ord.json | 0 .../schema/v3/date_ord_ore.json | 0 .../schema/v3/float4.json | 0 .../schema/v3/float4_eq.json | 0 .../schema/v3/float4_ord.json | 0 .../schema/v3/float4_ord_ore.json | 0 .../schema/v3/float8.json | 0 .../schema/v3/float8_eq.json | 0 .../schema/v3/float8_ord.json | 0 .../schema/v3/float8_ord_ore.json | 0 .../schema/v3/int2.json | 0 .../schema/v3/int2_eq.json | 0 .../schema/v3/int2_ord.json | 0 .../schema/v3/int2_ord_ore.json | 0 .../schema/v3/int4.json | 0 .../schema/v3/int4_eq.json | 0 .../schema/v3/int4_ord.json | 0 .../schema/v3/int4_ord_ore.json | 0 .../schema/v3/int8.json | 0 .../schema/v3/int8_eq.json | 0 .../schema/v3/int8_ord.json | 0 .../schema/v3/int8_ord_ore.json | 0 .../schema/v3/numeric.json | 0 .../schema/v3/numeric_eq.json | 0 .../schema/v3/numeric_ord.json | 0 .../schema/v3/numeric_ord_ore.json | 0 .../schema/v3/text.json | 0 .../schema/v3/text_eq.json | 0 .../schema/v3/text_match.json | 0 .../schema/v3/text_ord.json | 0 .../schema/v3/text_ord_ore.json | 0 .../schema/v3/text_search.json | 0 .../schema/v3/timestamptz.json | 0 .../schema/v3/timestamptz_eq.json | 0 .../schema/v3/timestamptz_ord.json | 0 .../schema/v3/timestamptz_ord_ore.json | 0 crates/{eql-types => eql-bindings}/src/lib.rs | 2 +- .../src/v3/bool.rs | 0 .../src/v3/date.rs | 0 .../src/v3/float4.rs | 0 .../src/v3/float8.rs | 0 .../src/v3/int2.rs | 0 .../src/v3/int4.rs | 0 .../src/v3/int8.rs | 0 .../{eql-types => eql-bindings}/src/v3/mod.rs | 0 .../src/v3/numeric.rs | 0 .../src/v3/terms.rs | 0 .../src/v3/text.rs | 0 .../src/v3/timestamptz.rs | 0 .../tests/catalog_parity.rs | 4 +-- .../tests/export.rs | 2 +- .../tests/v3_conformance.rs | 10 +++---- crates/eql-codegen/src/consts.rs | 2 +- crates/eql-domains/src/lib.rs | 2 +- docs/README.md | 2 +- docs/reference/eql-functions.md | 2 +- docs/tutorials/proxy-configuration.md | 4 +-- mise.toml | 30 +++++++++---------- 113 files changed, 49 insertions(+), 49 deletions(-) rename crates/{eql-types => eql-bindings}/.gitignore (100%) rename crates/{eql-types => eql-bindings}/Cargo.toml (96%) rename crates/{eql-types => eql-bindings}/README.md (96%) rename crates/{eql-types => eql-bindings}/bindings/v3/BloomFilter.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Bool.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Ciphertext.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Date.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/DateEq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/DateOrd.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/DateOrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float4.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float4Eq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float4Ord.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float4OrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float8.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float8Eq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float8Ord.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Float8OrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Hmac256.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Identifier.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int2.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int2Eq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int2Ord.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int2OrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int4.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int4Eq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int4Ord.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int4OrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int8.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int8Eq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int8Ord.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Int8OrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Numeric.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/NumericEq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/NumericOrd.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/NumericOrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/OreBlock256.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/SchemaVersion.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Text.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TextEq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TextMatch.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TextOrd.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TextOrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TextSearch.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/Timestamptz.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TimestamptzEq.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TimestamptzOrd.ts (100%) rename crates/{eql-types => eql-bindings}/bindings/v3/TimestamptzOrdOre.ts (100%) rename crates/{eql-types => eql-bindings}/schema/v3/bool.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/date.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/date_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/date_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/date_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float4.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float4_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float4_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float4_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float8.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float8_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float8_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/float8_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int2.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int2_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int2_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int2_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int4.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int4_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int4_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int4_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int8.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int8_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int8_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/int8_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/numeric.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/numeric_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/numeric_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/numeric_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/text.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/text_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/text_match.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/text_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/text_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/text_search.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/timestamptz.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/timestamptz_eq.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/timestamptz_ord.json (100%) rename crates/{eql-types => eql-bindings}/schema/v3/timestamptz_ord_ore.json (100%) rename crates/{eql-types => eql-bindings}/src/lib.rs (98%) rename crates/{eql-types => eql-bindings}/src/v3/bool.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/date.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/float4.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/float8.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/int2.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/int4.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/int8.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/mod.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/numeric.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/terms.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/text.rs (100%) rename crates/{eql-types => eql-bindings}/src/v3/timestamptz.rs (100%) rename crates/{eql-types => eql-bindings}/tests/catalog_parity.rs (97%) rename crates/{eql-types => eql-bindings}/tests/export.rs (98%) rename crates/{eql-types => eql-bindings}/tests/v3_conformance.rs (97%) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 162d04aff..538708cac 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -109,7 +109,7 @@ All jobs run on `blacksmith-16vcpu-ubuntu-2204`. "PG set" follows the event | **validate** (per PG) | `docs:validate:documented-sql` + `test:clean_install_v3` | DB-backed SQL doc-syntax check; clean-DB `eql_v3` install smoke | yes | no | | **docs-static** | `docs:validate:source` | SQL doxygen coverage + required-tags (DB-free); relevance-gated like the other heavy jobs (its inputs — `src/**`, the `crates/**` codegen build, `tasks/docs/**` — are a subset of the `relevant` filter) | no | no | | **schema** | `test:schema` | v2.2 / v2.3 payload JSON-schema validation | no | no | -| **rust-crates** | `test:crates` + `types:check` | `cargo fmt --check`, clippy + `cargo test` for `eql-domains` / `eql-codegen` / `eql-tests-macros` / `eql-types`; verify TS bindings + JSON schemas are fresh | no | no | +| **rust-crates** | `test:crates` + `types:check` | `cargo fmt --check`, clippy + `cargo test` for `eql-domains` / `eql-codegen` / `eql-tests-macros` / `eql-bindings`; verify TS bindings + JSON schemas are fresh | no | no | | **codegen** | `codegen:parity` | Generated encrypted-domain SQL matches the golden output | no | no | | **self-contained-v3** | `test:self_contained_v3` | `eql_v3` surface has no `eql_v2` dependency | no | no | | **matrix-coverage** | `test:matrix:inventory` (+`:jsonb_entry`, `:v3-jsonb`) + `test:matrix:catalog-coverage` | Scalar-matrix test-name snapshots are not silently dropped; catalog surface is covered | no | no | diff --git a/Cargo.lock b/Cargo.lock index ff524f7c8..6e8969f29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1161,6 +1161,17 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "eql-bindings" +version = "0.1.0" +dependencies = [ + "eql-domains", + "schemars", + "serde", + "serde_json", + "ts-rs", +] + [[package]] name = "eql-codegen" version = "0.1.0" @@ -1189,17 +1200,6 @@ dependencies = [ "syn 2.0.108", ] -[[package]] -name = "eql-types" -version = "0.1.0" -dependencies = [ - "eql-domains", - "schemars", - "serde", - "serde_json", - "ts-rs", -] - [[package]] name = "eql_tests" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index e2f8244d2..0c8086b8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ # crates/eql-codegen — the SQL generator binary (stub here; Plan 2 fills it in). # crates/eql-tests-macros — proc-macros expanding the single scalar-harness # list into the per-type SQLx-matrix wiring. -# crates/eql-types — canonical Rust wire types for EQL payloads, parity- +# crates/eql-bindings — canonical Rust wire types for EQL payloads, parity- # tested against the eql-domains catalog. (TypeScript # bindings and JSON Schemas are generated from these # types in stacked changes.) @@ -24,7 +24,7 @@ members = [ "crates/eql-domains", "crates/eql-codegen", "crates/eql-tests-macros", - "crates/eql-types", + "crates/eql-bindings", "tests/sqlx", ] default-members = ["tests/sqlx"] diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 25eaafb7d..308aa34c7 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -73,7 +73,7 @@ These are the important files and directories in the repo: ├── crates/ <-- Rust workspace: catalog, code generator, types │ ├── eql-domains/ <-- THE catalog (eql-domains::CATALOG): source of truth │ ├── eql-codegen/ <-- renders the eql_v3 scalar SQL from the catalog -│ ├── eql-types/ <-- shared Rust types + generated TS/JSON Schema bindings +│ ├── eql-bindings/ <-- shared Rust types + generated TS/JSON Schema bindings │ └── eql-tests-macros/ <-- proc-macros used by the SQLx test matrix ├── src/ <-- SQL components that make up EQL │ ├── v3/ <-- the self-contained eql_v3 surface diff --git a/crates/eql-types/.gitignore b/crates/eql-bindings/.gitignore similarity index 100% rename from crates/eql-types/.gitignore rename to crates/eql-bindings/.gitignore diff --git a/crates/eql-types/Cargo.toml b/crates/eql-bindings/Cargo.toml similarity index 96% rename from crates/eql-types/Cargo.toml rename to crates/eql-bindings/Cargo.toml index a2945d6da..ebec21b63 100644 --- a/crates/eql-types/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "eql-types" +name = "eql-bindings" version = "0.1.0" edition = "2021" description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." diff --git a/crates/eql-types/README.md b/crates/eql-bindings/README.md similarity index 96% rename from crates/eql-types/README.md rename to crates/eql-bindings/README.md index d5b46dc13..412f15750 100644 --- a/crates/eql-types/README.md +++ b/crates/eql-bindings/README.md @@ -1,4 +1,4 @@ -# eql-types +# eql-bindings Canonical wire types for EQL payloads — **one Rust definition per payload shape**, the single source of truth for every tool that produces or consumes @@ -60,7 +60,7 @@ mise run types:generate # clean-regenerate bindings/ and schema/ mise run types:check # regenerate + fail if checked-in outputs are stale ``` -Both wrap `cargo test -p eql-types`, which runs the conformance tests and +Both wrap `cargo test -p eql-bindings`, which runs the conformance tests and regenerates `bindings/` (TypeScript, via ts-rs) and `schema/` (JSON Schema, via `tests/export.rs`, with canonical `$id`s injected). Both directories are checked in so reviewers can see the codegen output without running anything; @@ -69,7 +69,7 @@ CI runs `types:check` to keep them fresh. The crate is also part of the lean Note that both exporters default to writing under the crate dir (ts-rs to `./bindings`, `tests/export.rs` to `./schema`), so a plain -`cargo test -p eql-types` (and therefore `mise run test:crates`) regenerates +`cargo test -p eql-bindings` (and therefore `mise run test:crates`) regenerates `bindings/` and `schema/` **in place** as a side effect — it can leave your working tree dirty if the checked-in copies were stale. Only `types:generate` isolates the writes (it exports into a temp dir and swaps them in after the diff --git a/crates/eql-types/bindings/v3/BloomFilter.ts b/crates/eql-bindings/bindings/v3/BloomFilter.ts similarity index 100% rename from crates/eql-types/bindings/v3/BloomFilter.ts rename to crates/eql-bindings/bindings/v3/BloomFilter.ts diff --git a/crates/eql-types/bindings/v3/Bool.ts b/crates/eql-bindings/bindings/v3/Bool.ts similarity index 100% rename from crates/eql-types/bindings/v3/Bool.ts rename to crates/eql-bindings/bindings/v3/Bool.ts diff --git a/crates/eql-types/bindings/v3/Ciphertext.ts b/crates/eql-bindings/bindings/v3/Ciphertext.ts similarity index 100% rename from crates/eql-types/bindings/v3/Ciphertext.ts rename to crates/eql-bindings/bindings/v3/Ciphertext.ts diff --git a/crates/eql-types/bindings/v3/Date.ts b/crates/eql-bindings/bindings/v3/Date.ts similarity index 100% rename from crates/eql-types/bindings/v3/Date.ts rename to crates/eql-bindings/bindings/v3/Date.ts diff --git a/crates/eql-types/bindings/v3/DateEq.ts b/crates/eql-bindings/bindings/v3/DateEq.ts similarity index 100% rename from crates/eql-types/bindings/v3/DateEq.ts rename to crates/eql-bindings/bindings/v3/DateEq.ts diff --git a/crates/eql-types/bindings/v3/DateOrd.ts b/crates/eql-bindings/bindings/v3/DateOrd.ts similarity index 100% rename from crates/eql-types/bindings/v3/DateOrd.ts rename to crates/eql-bindings/bindings/v3/DateOrd.ts diff --git a/crates/eql-types/bindings/v3/DateOrdOre.ts b/crates/eql-bindings/bindings/v3/DateOrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/DateOrdOre.ts rename to crates/eql-bindings/bindings/v3/DateOrdOre.ts diff --git a/crates/eql-types/bindings/v3/Float4.ts b/crates/eql-bindings/bindings/v3/Float4.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float4.ts rename to crates/eql-bindings/bindings/v3/Float4.ts diff --git a/crates/eql-types/bindings/v3/Float4Eq.ts b/crates/eql-bindings/bindings/v3/Float4Eq.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float4Eq.ts rename to crates/eql-bindings/bindings/v3/Float4Eq.ts diff --git a/crates/eql-types/bindings/v3/Float4Ord.ts b/crates/eql-bindings/bindings/v3/Float4Ord.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float4Ord.ts rename to crates/eql-bindings/bindings/v3/Float4Ord.ts diff --git a/crates/eql-types/bindings/v3/Float4OrdOre.ts b/crates/eql-bindings/bindings/v3/Float4OrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float4OrdOre.ts rename to crates/eql-bindings/bindings/v3/Float4OrdOre.ts diff --git a/crates/eql-types/bindings/v3/Float8.ts b/crates/eql-bindings/bindings/v3/Float8.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float8.ts rename to crates/eql-bindings/bindings/v3/Float8.ts diff --git a/crates/eql-types/bindings/v3/Float8Eq.ts b/crates/eql-bindings/bindings/v3/Float8Eq.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float8Eq.ts rename to crates/eql-bindings/bindings/v3/Float8Eq.ts diff --git a/crates/eql-types/bindings/v3/Float8Ord.ts b/crates/eql-bindings/bindings/v3/Float8Ord.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float8Ord.ts rename to crates/eql-bindings/bindings/v3/Float8Ord.ts diff --git a/crates/eql-types/bindings/v3/Float8OrdOre.ts b/crates/eql-bindings/bindings/v3/Float8OrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/Float8OrdOre.ts rename to crates/eql-bindings/bindings/v3/Float8OrdOre.ts diff --git a/crates/eql-types/bindings/v3/Hmac256.ts b/crates/eql-bindings/bindings/v3/Hmac256.ts similarity index 100% rename from crates/eql-types/bindings/v3/Hmac256.ts rename to crates/eql-bindings/bindings/v3/Hmac256.ts diff --git a/crates/eql-types/bindings/v3/Identifier.ts b/crates/eql-bindings/bindings/v3/Identifier.ts similarity index 100% rename from crates/eql-types/bindings/v3/Identifier.ts rename to crates/eql-bindings/bindings/v3/Identifier.ts diff --git a/crates/eql-types/bindings/v3/Int2.ts b/crates/eql-bindings/bindings/v3/Int2.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int2.ts rename to crates/eql-bindings/bindings/v3/Int2.ts diff --git a/crates/eql-types/bindings/v3/Int2Eq.ts b/crates/eql-bindings/bindings/v3/Int2Eq.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int2Eq.ts rename to crates/eql-bindings/bindings/v3/Int2Eq.ts diff --git a/crates/eql-types/bindings/v3/Int2Ord.ts b/crates/eql-bindings/bindings/v3/Int2Ord.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int2Ord.ts rename to crates/eql-bindings/bindings/v3/Int2Ord.ts diff --git a/crates/eql-types/bindings/v3/Int2OrdOre.ts b/crates/eql-bindings/bindings/v3/Int2OrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int2OrdOre.ts rename to crates/eql-bindings/bindings/v3/Int2OrdOre.ts diff --git a/crates/eql-types/bindings/v3/Int4.ts b/crates/eql-bindings/bindings/v3/Int4.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int4.ts rename to crates/eql-bindings/bindings/v3/Int4.ts diff --git a/crates/eql-types/bindings/v3/Int4Eq.ts b/crates/eql-bindings/bindings/v3/Int4Eq.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int4Eq.ts rename to crates/eql-bindings/bindings/v3/Int4Eq.ts diff --git a/crates/eql-types/bindings/v3/Int4Ord.ts b/crates/eql-bindings/bindings/v3/Int4Ord.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int4Ord.ts rename to crates/eql-bindings/bindings/v3/Int4Ord.ts diff --git a/crates/eql-types/bindings/v3/Int4OrdOre.ts b/crates/eql-bindings/bindings/v3/Int4OrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int4OrdOre.ts rename to crates/eql-bindings/bindings/v3/Int4OrdOre.ts diff --git a/crates/eql-types/bindings/v3/Int8.ts b/crates/eql-bindings/bindings/v3/Int8.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int8.ts rename to crates/eql-bindings/bindings/v3/Int8.ts diff --git a/crates/eql-types/bindings/v3/Int8Eq.ts b/crates/eql-bindings/bindings/v3/Int8Eq.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int8Eq.ts rename to crates/eql-bindings/bindings/v3/Int8Eq.ts diff --git a/crates/eql-types/bindings/v3/Int8Ord.ts b/crates/eql-bindings/bindings/v3/Int8Ord.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int8Ord.ts rename to crates/eql-bindings/bindings/v3/Int8Ord.ts diff --git a/crates/eql-types/bindings/v3/Int8OrdOre.ts b/crates/eql-bindings/bindings/v3/Int8OrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/Int8OrdOre.ts rename to crates/eql-bindings/bindings/v3/Int8OrdOre.ts diff --git a/crates/eql-types/bindings/v3/Numeric.ts b/crates/eql-bindings/bindings/v3/Numeric.ts similarity index 100% rename from crates/eql-types/bindings/v3/Numeric.ts rename to crates/eql-bindings/bindings/v3/Numeric.ts diff --git a/crates/eql-types/bindings/v3/NumericEq.ts b/crates/eql-bindings/bindings/v3/NumericEq.ts similarity index 100% rename from crates/eql-types/bindings/v3/NumericEq.ts rename to crates/eql-bindings/bindings/v3/NumericEq.ts diff --git a/crates/eql-types/bindings/v3/NumericOrd.ts b/crates/eql-bindings/bindings/v3/NumericOrd.ts similarity index 100% rename from crates/eql-types/bindings/v3/NumericOrd.ts rename to crates/eql-bindings/bindings/v3/NumericOrd.ts diff --git a/crates/eql-types/bindings/v3/NumericOrdOre.ts b/crates/eql-bindings/bindings/v3/NumericOrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/NumericOrdOre.ts rename to crates/eql-bindings/bindings/v3/NumericOrdOre.ts diff --git a/crates/eql-types/bindings/v3/OreBlock256.ts b/crates/eql-bindings/bindings/v3/OreBlock256.ts similarity index 100% rename from crates/eql-types/bindings/v3/OreBlock256.ts rename to crates/eql-bindings/bindings/v3/OreBlock256.ts diff --git a/crates/eql-types/bindings/v3/SchemaVersion.ts b/crates/eql-bindings/bindings/v3/SchemaVersion.ts similarity index 100% rename from crates/eql-types/bindings/v3/SchemaVersion.ts rename to crates/eql-bindings/bindings/v3/SchemaVersion.ts diff --git a/crates/eql-types/bindings/v3/Text.ts b/crates/eql-bindings/bindings/v3/Text.ts similarity index 100% rename from crates/eql-types/bindings/v3/Text.ts rename to crates/eql-bindings/bindings/v3/Text.ts diff --git a/crates/eql-types/bindings/v3/TextEq.ts b/crates/eql-bindings/bindings/v3/TextEq.ts similarity index 100% rename from crates/eql-types/bindings/v3/TextEq.ts rename to crates/eql-bindings/bindings/v3/TextEq.ts diff --git a/crates/eql-types/bindings/v3/TextMatch.ts b/crates/eql-bindings/bindings/v3/TextMatch.ts similarity index 100% rename from crates/eql-types/bindings/v3/TextMatch.ts rename to crates/eql-bindings/bindings/v3/TextMatch.ts diff --git a/crates/eql-types/bindings/v3/TextOrd.ts b/crates/eql-bindings/bindings/v3/TextOrd.ts similarity index 100% rename from crates/eql-types/bindings/v3/TextOrd.ts rename to crates/eql-bindings/bindings/v3/TextOrd.ts diff --git a/crates/eql-types/bindings/v3/TextOrdOre.ts b/crates/eql-bindings/bindings/v3/TextOrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/TextOrdOre.ts rename to crates/eql-bindings/bindings/v3/TextOrdOre.ts diff --git a/crates/eql-types/bindings/v3/TextSearch.ts b/crates/eql-bindings/bindings/v3/TextSearch.ts similarity index 100% rename from crates/eql-types/bindings/v3/TextSearch.ts rename to crates/eql-bindings/bindings/v3/TextSearch.ts diff --git a/crates/eql-types/bindings/v3/Timestamptz.ts b/crates/eql-bindings/bindings/v3/Timestamptz.ts similarity index 100% rename from crates/eql-types/bindings/v3/Timestamptz.ts rename to crates/eql-bindings/bindings/v3/Timestamptz.ts diff --git a/crates/eql-types/bindings/v3/TimestamptzEq.ts b/crates/eql-bindings/bindings/v3/TimestamptzEq.ts similarity index 100% rename from crates/eql-types/bindings/v3/TimestamptzEq.ts rename to crates/eql-bindings/bindings/v3/TimestamptzEq.ts diff --git a/crates/eql-types/bindings/v3/TimestamptzOrd.ts b/crates/eql-bindings/bindings/v3/TimestamptzOrd.ts similarity index 100% rename from crates/eql-types/bindings/v3/TimestamptzOrd.ts rename to crates/eql-bindings/bindings/v3/TimestamptzOrd.ts diff --git a/crates/eql-types/bindings/v3/TimestamptzOrdOre.ts b/crates/eql-bindings/bindings/v3/TimestamptzOrdOre.ts similarity index 100% rename from crates/eql-types/bindings/v3/TimestamptzOrdOre.ts rename to crates/eql-bindings/bindings/v3/TimestamptzOrdOre.ts diff --git a/crates/eql-types/schema/v3/bool.json b/crates/eql-bindings/schema/v3/bool.json similarity index 100% rename from crates/eql-types/schema/v3/bool.json rename to crates/eql-bindings/schema/v3/bool.json diff --git a/crates/eql-types/schema/v3/date.json b/crates/eql-bindings/schema/v3/date.json similarity index 100% rename from crates/eql-types/schema/v3/date.json rename to crates/eql-bindings/schema/v3/date.json diff --git a/crates/eql-types/schema/v3/date_eq.json b/crates/eql-bindings/schema/v3/date_eq.json similarity index 100% rename from crates/eql-types/schema/v3/date_eq.json rename to crates/eql-bindings/schema/v3/date_eq.json diff --git a/crates/eql-types/schema/v3/date_ord.json b/crates/eql-bindings/schema/v3/date_ord.json similarity index 100% rename from crates/eql-types/schema/v3/date_ord.json rename to crates/eql-bindings/schema/v3/date_ord.json diff --git a/crates/eql-types/schema/v3/date_ord_ore.json b/crates/eql-bindings/schema/v3/date_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/date_ord_ore.json rename to crates/eql-bindings/schema/v3/date_ord_ore.json diff --git a/crates/eql-types/schema/v3/float4.json b/crates/eql-bindings/schema/v3/float4.json similarity index 100% rename from crates/eql-types/schema/v3/float4.json rename to crates/eql-bindings/schema/v3/float4.json diff --git a/crates/eql-types/schema/v3/float4_eq.json b/crates/eql-bindings/schema/v3/float4_eq.json similarity index 100% rename from crates/eql-types/schema/v3/float4_eq.json rename to crates/eql-bindings/schema/v3/float4_eq.json diff --git a/crates/eql-types/schema/v3/float4_ord.json b/crates/eql-bindings/schema/v3/float4_ord.json similarity index 100% rename from crates/eql-types/schema/v3/float4_ord.json rename to crates/eql-bindings/schema/v3/float4_ord.json diff --git a/crates/eql-types/schema/v3/float4_ord_ore.json b/crates/eql-bindings/schema/v3/float4_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/float4_ord_ore.json rename to crates/eql-bindings/schema/v3/float4_ord_ore.json diff --git a/crates/eql-types/schema/v3/float8.json b/crates/eql-bindings/schema/v3/float8.json similarity index 100% rename from crates/eql-types/schema/v3/float8.json rename to crates/eql-bindings/schema/v3/float8.json diff --git a/crates/eql-types/schema/v3/float8_eq.json b/crates/eql-bindings/schema/v3/float8_eq.json similarity index 100% rename from crates/eql-types/schema/v3/float8_eq.json rename to crates/eql-bindings/schema/v3/float8_eq.json diff --git a/crates/eql-types/schema/v3/float8_ord.json b/crates/eql-bindings/schema/v3/float8_ord.json similarity index 100% rename from crates/eql-types/schema/v3/float8_ord.json rename to crates/eql-bindings/schema/v3/float8_ord.json diff --git a/crates/eql-types/schema/v3/float8_ord_ore.json b/crates/eql-bindings/schema/v3/float8_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/float8_ord_ore.json rename to crates/eql-bindings/schema/v3/float8_ord_ore.json diff --git a/crates/eql-types/schema/v3/int2.json b/crates/eql-bindings/schema/v3/int2.json similarity index 100% rename from crates/eql-types/schema/v3/int2.json rename to crates/eql-bindings/schema/v3/int2.json diff --git a/crates/eql-types/schema/v3/int2_eq.json b/crates/eql-bindings/schema/v3/int2_eq.json similarity index 100% rename from crates/eql-types/schema/v3/int2_eq.json rename to crates/eql-bindings/schema/v3/int2_eq.json diff --git a/crates/eql-types/schema/v3/int2_ord.json b/crates/eql-bindings/schema/v3/int2_ord.json similarity index 100% rename from crates/eql-types/schema/v3/int2_ord.json rename to crates/eql-bindings/schema/v3/int2_ord.json diff --git a/crates/eql-types/schema/v3/int2_ord_ore.json b/crates/eql-bindings/schema/v3/int2_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/int2_ord_ore.json rename to crates/eql-bindings/schema/v3/int2_ord_ore.json diff --git a/crates/eql-types/schema/v3/int4.json b/crates/eql-bindings/schema/v3/int4.json similarity index 100% rename from crates/eql-types/schema/v3/int4.json rename to crates/eql-bindings/schema/v3/int4.json diff --git a/crates/eql-types/schema/v3/int4_eq.json b/crates/eql-bindings/schema/v3/int4_eq.json similarity index 100% rename from crates/eql-types/schema/v3/int4_eq.json rename to crates/eql-bindings/schema/v3/int4_eq.json diff --git a/crates/eql-types/schema/v3/int4_ord.json b/crates/eql-bindings/schema/v3/int4_ord.json similarity index 100% rename from crates/eql-types/schema/v3/int4_ord.json rename to crates/eql-bindings/schema/v3/int4_ord.json diff --git a/crates/eql-types/schema/v3/int4_ord_ore.json b/crates/eql-bindings/schema/v3/int4_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/int4_ord_ore.json rename to crates/eql-bindings/schema/v3/int4_ord_ore.json diff --git a/crates/eql-types/schema/v3/int8.json b/crates/eql-bindings/schema/v3/int8.json similarity index 100% rename from crates/eql-types/schema/v3/int8.json rename to crates/eql-bindings/schema/v3/int8.json diff --git a/crates/eql-types/schema/v3/int8_eq.json b/crates/eql-bindings/schema/v3/int8_eq.json similarity index 100% rename from crates/eql-types/schema/v3/int8_eq.json rename to crates/eql-bindings/schema/v3/int8_eq.json diff --git a/crates/eql-types/schema/v3/int8_ord.json b/crates/eql-bindings/schema/v3/int8_ord.json similarity index 100% rename from crates/eql-types/schema/v3/int8_ord.json rename to crates/eql-bindings/schema/v3/int8_ord.json diff --git a/crates/eql-types/schema/v3/int8_ord_ore.json b/crates/eql-bindings/schema/v3/int8_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/int8_ord_ore.json rename to crates/eql-bindings/schema/v3/int8_ord_ore.json diff --git a/crates/eql-types/schema/v3/numeric.json b/crates/eql-bindings/schema/v3/numeric.json similarity index 100% rename from crates/eql-types/schema/v3/numeric.json rename to crates/eql-bindings/schema/v3/numeric.json diff --git a/crates/eql-types/schema/v3/numeric_eq.json b/crates/eql-bindings/schema/v3/numeric_eq.json similarity index 100% rename from crates/eql-types/schema/v3/numeric_eq.json rename to crates/eql-bindings/schema/v3/numeric_eq.json diff --git a/crates/eql-types/schema/v3/numeric_ord.json b/crates/eql-bindings/schema/v3/numeric_ord.json similarity index 100% rename from crates/eql-types/schema/v3/numeric_ord.json rename to crates/eql-bindings/schema/v3/numeric_ord.json diff --git a/crates/eql-types/schema/v3/numeric_ord_ore.json b/crates/eql-bindings/schema/v3/numeric_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/numeric_ord_ore.json rename to crates/eql-bindings/schema/v3/numeric_ord_ore.json diff --git a/crates/eql-types/schema/v3/text.json b/crates/eql-bindings/schema/v3/text.json similarity index 100% rename from crates/eql-types/schema/v3/text.json rename to crates/eql-bindings/schema/v3/text.json diff --git a/crates/eql-types/schema/v3/text_eq.json b/crates/eql-bindings/schema/v3/text_eq.json similarity index 100% rename from crates/eql-types/schema/v3/text_eq.json rename to crates/eql-bindings/schema/v3/text_eq.json diff --git a/crates/eql-types/schema/v3/text_match.json b/crates/eql-bindings/schema/v3/text_match.json similarity index 100% rename from crates/eql-types/schema/v3/text_match.json rename to crates/eql-bindings/schema/v3/text_match.json diff --git a/crates/eql-types/schema/v3/text_ord.json b/crates/eql-bindings/schema/v3/text_ord.json similarity index 100% rename from crates/eql-types/schema/v3/text_ord.json rename to crates/eql-bindings/schema/v3/text_ord.json diff --git a/crates/eql-types/schema/v3/text_ord_ore.json b/crates/eql-bindings/schema/v3/text_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/text_ord_ore.json rename to crates/eql-bindings/schema/v3/text_ord_ore.json diff --git a/crates/eql-types/schema/v3/text_search.json b/crates/eql-bindings/schema/v3/text_search.json similarity index 100% rename from crates/eql-types/schema/v3/text_search.json rename to crates/eql-bindings/schema/v3/text_search.json diff --git a/crates/eql-types/schema/v3/timestamptz.json b/crates/eql-bindings/schema/v3/timestamptz.json similarity index 100% rename from crates/eql-types/schema/v3/timestamptz.json rename to crates/eql-bindings/schema/v3/timestamptz.json diff --git a/crates/eql-types/schema/v3/timestamptz_eq.json b/crates/eql-bindings/schema/v3/timestamptz_eq.json similarity index 100% rename from crates/eql-types/schema/v3/timestamptz_eq.json rename to crates/eql-bindings/schema/v3/timestamptz_eq.json diff --git a/crates/eql-types/schema/v3/timestamptz_ord.json b/crates/eql-bindings/schema/v3/timestamptz_ord.json similarity index 100% rename from crates/eql-types/schema/v3/timestamptz_ord.json rename to crates/eql-bindings/schema/v3/timestamptz_ord.json diff --git a/crates/eql-types/schema/v3/timestamptz_ord_ore.json b/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json similarity index 100% rename from crates/eql-types/schema/v3/timestamptz_ord_ore.json rename to crates/eql-bindings/schema/v3/timestamptz_ord_ore.json diff --git a/crates/eql-types/src/lib.rs b/crates/eql-bindings/src/lib.rs similarity index 98% rename from crates/eql-types/src/lib.rs rename to crates/eql-bindings/src/lib.rs index 840d4ab17..6146d3ccf 100644 --- a/crates/eql-types/src/lib.rs +++ b/crates/eql-bindings/src/lib.rs @@ -1,4 +1,4 @@ -//! # eql-types — canonical EQL payload types +//! # eql-bindings — canonical EQL payload types //! //! One Rust definition per EQL payload shape — the single source of truth //! for every tool that produces or consumes EQL payloads diff --git a/crates/eql-types/src/v3/bool.rs b/crates/eql-bindings/src/v3/bool.rs similarity index 100% rename from crates/eql-types/src/v3/bool.rs rename to crates/eql-bindings/src/v3/bool.rs diff --git a/crates/eql-types/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs similarity index 100% rename from crates/eql-types/src/v3/date.rs rename to crates/eql-bindings/src/v3/date.rs diff --git a/crates/eql-types/src/v3/float4.rs b/crates/eql-bindings/src/v3/float4.rs similarity index 100% rename from crates/eql-types/src/v3/float4.rs rename to crates/eql-bindings/src/v3/float4.rs diff --git a/crates/eql-types/src/v3/float8.rs b/crates/eql-bindings/src/v3/float8.rs similarity index 100% rename from crates/eql-types/src/v3/float8.rs rename to crates/eql-bindings/src/v3/float8.rs diff --git a/crates/eql-types/src/v3/int2.rs b/crates/eql-bindings/src/v3/int2.rs similarity index 100% rename from crates/eql-types/src/v3/int2.rs rename to crates/eql-bindings/src/v3/int2.rs diff --git a/crates/eql-types/src/v3/int4.rs b/crates/eql-bindings/src/v3/int4.rs similarity index 100% rename from crates/eql-types/src/v3/int4.rs rename to crates/eql-bindings/src/v3/int4.rs diff --git a/crates/eql-types/src/v3/int8.rs b/crates/eql-bindings/src/v3/int8.rs similarity index 100% rename from crates/eql-types/src/v3/int8.rs rename to crates/eql-bindings/src/v3/int8.rs diff --git a/crates/eql-types/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs similarity index 100% rename from crates/eql-types/src/v3/mod.rs rename to crates/eql-bindings/src/v3/mod.rs diff --git a/crates/eql-types/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs similarity index 100% rename from crates/eql-types/src/v3/numeric.rs rename to crates/eql-bindings/src/v3/numeric.rs diff --git a/crates/eql-types/src/v3/terms.rs b/crates/eql-bindings/src/v3/terms.rs similarity index 100% rename from crates/eql-types/src/v3/terms.rs rename to crates/eql-bindings/src/v3/terms.rs diff --git a/crates/eql-types/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs similarity index 100% rename from crates/eql-types/src/v3/text.rs rename to crates/eql-bindings/src/v3/text.rs diff --git a/crates/eql-types/src/v3/timestamptz.rs b/crates/eql-bindings/src/v3/timestamptz.rs similarity index 100% rename from crates/eql-types/src/v3/timestamptz.rs rename to crates/eql-bindings/src/v3/timestamptz.rs diff --git a/crates/eql-types/tests/catalog_parity.rs b/crates/eql-bindings/tests/catalog_parity.rs similarity index 97% rename from crates/eql-types/tests/catalog_parity.rs rename to crates/eql-bindings/tests/catalog_parity.rs index 90aedb756..53bfa16a3 100644 --- a/crates/eql-types/tests/catalog_parity.rs +++ b/crates/eql-bindings/tests/catalog_parity.rs @@ -5,14 +5,14 @@ //! serde contract, so per domain this catches an `Option` term field or a //! wrong wire key (`required`), a struct that lost //! `#[serde(deny_unknown_fields)]` (`additionalProperties: false`), and a -//! `v` field that is not [`eql_types::SchemaVersion`] (the `$ref` and its +//! `v` field that is not [`eql_bindings::SchemaVersion`] (the `$ref` and its //! `const: 2`). Behavioural spot checks of the same properties live in //! `tests/v3_conformance.rs`. use std::collections::BTreeSet; +use eql_bindings::{v3, EQL_SCHEMA_VERSION}; use eql_domains::{Term, CATALOG, ENVELOPE_KEYS}; -use eql_types::{v3, EQL_SCHEMA_VERSION}; use serde_json::{json, Value}; #[test] diff --git a/crates/eql-types/tests/export.rs b/crates/eql-bindings/tests/export.rs similarity index 98% rename from crates/eql-types/tests/export.rs rename to crates/eql-bindings/tests/export.rs index bb95244a1..50a1b29b4 100644 --- a/crates/eql-types/tests/export.rs +++ b/crates/eql-bindings/tests/export.rs @@ -9,7 +9,7 @@ //! `TS_RS_EXPORT_DIR` — so `mise run types:generate` can redirect output to a //! throwaway temp dir and only swap it into place after a successful build. -use eql_types::v3; +use eql_bindings::v3; #[test] fn dump_v3_json_schemas() { diff --git a/crates/eql-types/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs similarity index 97% rename from crates/eql-types/tests/v3_conformance.rs rename to crates/eql-bindings/tests/v3_conformance.rs index df3456748..06ed7e0b9 100644 --- a/crates/eql-types/tests/v3_conformance.rs +++ b/crates/eql-bindings/tests/v3_conformance.rs @@ -3,9 +3,9 @@ //! catalog-driven sweep (every domain, every required key) lives in //! `catalog_parity.rs`. -use eql_types::v3::int4::{Int4, Int4Eq, Int4Ord, Int4OrdOre}; -use eql_types::v3::text::TextMatch; -use eql_types::v3::DomainType; +use eql_bindings::v3::int4::{Int4, Int4Eq, Int4Ord, Int4OrdOre}; +use eql_bindings::v3::text::TextMatch; +use eql_bindings::v3::DomainType; use serde_json::json; #[test] @@ -168,7 +168,7 @@ fn non_int4_tokens_round_trip_every_domain() { // `catalog_parity.rs` checks domain *names* only, never the wire shape. // This sweep roundtrips every non-int4 domain and pins its catalog name, // failing the instant a token drifts from the shared envelope/term contract. - use eql_types::v3::{date::*, int2::*, int8::*, numeric::*, text::*}; + use eql_bindings::v3::{date::*, int2::*, int8::*, numeric::*, text::*}; // Wire builders for the three shapes the ordered tokens share. let storage = |t: &str| json!({ "v": 2, "i": { "t": t, "c": "x" }, "c": "ct" }); @@ -227,7 +227,7 @@ fn timestamptz_round_trips_and_enforces_term_capabilities() { // field typo would pass `catalog_parity` (domain names only) but is caught // here. (Was equality-only while the ORE comparator was hardcoded to 8 // blocks; promoted once `eql_v3.ore_block_256` generalized to any width.) - use eql_types::v3::timestamptz::{ + use eql_bindings::v3::timestamptz::{ Timestamptz, TimestamptzEq, TimestamptzOrd, TimestamptzOrdOre, }; diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index a48c96eee..138036715 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -16,7 +16,7 @@ pub(crate) const SCHEMA: &str = "eql_v3"; /// Always-present payload keys checked for presence in every domain CHECK. /// Term-specific keys are appended after these by `context::domain_block`. /// Defined in the catalog (`eql_domains::ENVELOPE_KEYS`) so the CHECKs and -/// the `eql-types` payload structs share one envelope definition. +/// the `eql-bindings` payload structs share one envelope definition. pub(crate) const ENVELOPE_KEYS: &[&str] = eql_domains::ENVELOPE_KEYS; /// Escape a string for use inside a single-quoted SQL literal by doubling diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index 2142ee89d..a5d872d19 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -98,7 +98,7 @@ pub enum ScalarKind { /// /// Lives here — in the catalog — because it is cross-schema contract data /// consumed on both sides of the generated surface: `eql-codegen` builds -/// every domain CHECK from it, and `eql-types` builds its payload structs +/// every domain CHECK from it, and `eql-bindings` builds its payload structs /// and parity tests against it. One definition, so the envelope cannot /// drift between the SQL and the canonical types. pub const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; diff --git a/docs/README.md b/docs/README.md index c8c8dcb6f..db983d217 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,7 @@ This directory contains the documentation for the Encrypt Query Language (EQL). - [Writing fast queries against EQL columns](reference/query-performance.md) - Performance overview (points to Database Indexes) - [Adding a Scalar Encrypted-Domain Type](reference/adding-a-scalar-encrypted-domain-type.md) - How the `eql_v3.` domain families are generated - [EQL with JSON and JSONB](reference/json-support.md) -- [EQL payload / wire format](../crates/eql-types/README.md) - Canonical wire types for the encrypted payload (envelope `v`/`i`/`c` and the `hm`/`ob`/`bf` index terms) +- [EQL payload / wire format](../crates/eql-bindings/README.md) - Canonical wire types for the encrypted payload (envelope `v`/`i`/`c` and the `hm`/`ob`/`bf` index terms) - [Client-side index configuration](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md) - Configuring searchable encryption in Protect.js / CipherStash Proxy ## Tutorials diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index bdc288bff..133ffd0f6 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -157,7 +157,7 @@ SELECT eql_v3.min(price_jsonb::eql_v3.int4_ord) FROM products; - [Database Indexes](./database-indexes.md) — functional-index recipes and performance. - [JSON/JSONB Support](./json-support.md) — `eql_v3.json` worked examples. - [SQL support matrix](./sql-support.md) — operators by domain variant. -- [Payload / wire format](../../crates/eql-types/README.md) — canonical encrypted-payload wire types (envelope + index terms). +- [Payload / wire format](../../crates/eql-bindings/README.md) — canonical encrypted-payload wire types (envelope + index terms). - Client-side index configuration — [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md). --- diff --git a/docs/tutorials/proxy-configuration.md b/docs/tutorials/proxy-configuration.md index e0599c103..683ad9d8e 100644 --- a/docs/tutorials/proxy-configuration.md +++ b/docs/tutorials/proxy-configuration.md @@ -62,7 +62,7 @@ ANALYZE users; ## 4. Insert and read through the Proxy -Run writes and reads through CipherStash Proxy. On insert, the Proxy encrypts the plaintext into the EQL payload (envelope `v`/`i`/`c` plus the configured index terms — see the [payload / wire format](../../crates/eql-types/README.md)); on read, it decrypts automatically. +Run writes and reads through CipherStash Proxy. On insert, the Proxy encrypts the plaintext into the EQL payload (envelope `v`/`i`/`c` plus the configured index terms — see the [payload / wire format](../../crates/eql-bindings/README.md)); on read, it decrypts automatically. ```sql -- Through the Proxy: the plaintext is encrypted on the way in @@ -114,7 +114,7 @@ SELECT encrypted_profile -> 'email_selector'::text FROM users; **Which operators are available on which column?** See the [SQL support matrix](../reference/sql-support.md). -**Where is the data format documented?** See the [payload / wire format](../../crates/eql-types/README.md) for the scalar envelope and index terms, and [EQL with JSON and JSONB](../reference/json-support.md) for the `eql_v3.json` document format. +**Where is the data format documented?** See the [payload / wire format](../../crates/eql-bindings/README.md) for the scalar envelope and index terms, and [EQL with JSON and JSONB](../reference/json-support.md) for the `eql_v3.json` document format. ## Troubleshooting diff --git a/mise.toml b/mise.toml index 5b0dba4df..4f638aacf 100644 --- a/mise.toml +++ b/mise.toml @@ -166,11 +166,11 @@ description = "Compile, lint and test the std-only Rust workspace crates (no dat dir = "{{config_root}}" run = """ #!/usr/bin/env bash -# eql-domains / eql-codegen / eql-tests-macros / eql-types are the lean +# eql-domains / eql-codegen / eql-tests-macros / eql-bindings are the lean # workspace members. Scope explicitly to them (NOT --workspace): a # workspace-wide test would drag in tests/sqlx, whose suite needs Postgres + # CS_* secrets and is already covered by the `test` job. eql-tests-macros only -# pulls syn/quote/proc-macro2 and eql-types only serde/serde_json/ts-rs, so +# pulls syn/quote/proc-macro2 and eql-bindings only serde/serde_json/ts-rs, so # they stay in the lean set. clippy is likewise scoped — a workspace clippy # recompiles the heavy sqlx/tokio/cipherstash-client tree for no added coverage # of these crates. @@ -179,12 +179,12 @@ run = """ # /bin/sh (dash on the CI images). set -euo pipefail cargo fmt --check -cargo clippy -p eql-domains -p eql-codegen -p eql-tests-macros -p eql-types --all-targets -- -D warnings -cargo test -p eql-domains -p eql-codegen -p eql-tests-macros -p eql-types +cargo clippy -p eql-domains -p eql-codegen -p eql-tests-macros -p eql-bindings --all-targets -- -D warnings +cargo test -p eql-domains -p eql-codegen -p eql-tests-macros -p eql-bindings """ [tasks."types:generate"] -description = "Regenerate eql-types TypeScript bindings and JSON Schemas from the Rust types (no database required)" +description = "Regenerate eql-bindings TypeScript bindings and JSON Schemas from the Rust types (no database required)" dir = "{{config_root}}" run = """ #!/usr/bin/env bash @@ -195,33 +195,33 @@ run = """ # would then leave the working tree missing it. Instead, export into a # throwaway temp dir (ts-rs honors TS_RS_EXPORT_DIR; tests/export.rs honors # EQL_TYPES_SCHEMA_DIR; every type uses the v3/ subdir, so the temp tree -# mirrors crates/eql-types/{bindings,schema} exactly) and only swap it into +# mirrors crates/eql-bindings/{bindings,schema} exactly) and only swap it into # place after the tests succeed. The swap stays out of the tests themselves — # they run in parallel and can't safely rm. set -euo pipefail tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT -TS_RS_EXPORT_DIR="$tmp/bindings" EQL_TYPES_SCHEMA_DIR="$tmp/schema" cargo test -p eql-types -rm -rf crates/eql-types/bindings crates/eql-types/schema -mv "$tmp/bindings" crates/eql-types/bindings -mv "$tmp/schema" crates/eql-types/schema +TS_RS_EXPORT_DIR="$tmp/bindings" EQL_TYPES_SCHEMA_DIR="$tmp/schema" cargo test -p eql-bindings +rm -rf crates/eql-bindings/bindings crates/eql-bindings/schema +mv "$tmp/bindings" crates/eql-bindings/bindings +mv "$tmp/schema" crates/eql-bindings/schema """ [tasks."types:check"] -description = "Verify the checked-in eql-types bindings/ and schema/ are fresh (regenerate + git diff)" +description = "Verify the checked-in eql-bindings bindings/ and schema/ are fresh (regenerate + git diff)" dir = "{{config_root}}" depends = ["types:generate"] run = """ #!/usr/bin/env bash set -euo pipefail -git diff --exit-code -- crates/eql-types/bindings crates/eql-types/schema || { - echo "eql-types bindings/ or schema/ are stale — run 'mise run types:generate' and commit the result" >&2 +git diff --exit-code -- crates/eql-bindings/bindings crates/eql-bindings/schema || { + echo "eql-bindings bindings/ or schema/ are stale — run 'mise run types:generate' and commit the result" >&2 exit 1 } # git diff is blind to brand-new files; untracked output is stale too. -untracked=$(git ls-files --others --exclude-standard -- crates/eql-types/bindings crates/eql-types/schema) +untracked=$(git ls-files --others --exclude-standard -- crates/eql-bindings/bindings crates/eql-bindings/schema) if [ -n "$untracked" ]; then - echo "eql-types has uncommitted generated files:" >&2 + echo "eql-bindings has uncommitted generated files:" >&2 echo "$untracked" >&2 exit 1 fi From 8606d25a37f209868fb8725745ed2185849e53c1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 20:55:07 +1000 Subject: [PATCH 365/599] fix(eql-domains): tighten catalog kind/fixture consistency nits Three pre-existing inconsistencies in the scalar catalog crate, surfaced by code review of the crate-rename PR (they predate the rename; the rename only moved these files): - ScalarKind::rust_type() returned the SQL token "text" for Text, but the function documents itself as the canonical Rust plaintext type name and every other arm names a Rust type (i32, chrono::NaiveDate, rust_decimal::Decimal). Return "String". - proptest_invariants::any_kind() omitted ScalarKind::Bool, so the bool branch of bounded_int_ranges_are_ordered was never exercised. Add it (and fix the "ten"/"eleven" count in the doc comment). - Fixture::numeric_value()'s Int(n) arm bypassed the as_bounded_int() gate its Min/Max/Zero siblings all use, fabricating Some(n) for a hand-built literal on a non-integer kind. Gate it like the sentinels. No CATALOG row pairs Int with a non-integer kind, so generated output is unchanged. Adds regression tests pinning Text's rust_type and the Int(n) non-integer-kind gate. cargo test -p eql-domains: 76 passed. --- crates/eql-domains/src/fixture.rs | 9 +++++++- crates/eql-domains/src/kind.rs | 2 +- crates/eql-domains/src/proptest_invariants.rs | 3 ++- crates/eql-domains/src/tests.rs | 23 +++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/crates/eql-domains/src/fixture.rs b/crates/eql-domains/src/fixture.rs index 431f4871a..3bb07730b 100644 --- a/crates/eql-domains/src/fixture.rs +++ b/crates/eql-domains/src/fixture.rs @@ -28,7 +28,14 @@ impl Fixture { Some(_) => Some(0), None => None, }, - Fixture::Int(n) => Some(n), + // Gate the literal on the integer kinds too, mirroring the sentinels + // above: a hand-built `Int(n)` on a non-integer kind resolves to + // `None` rather than fabricating a number for a `Text`/`Date`/`Bool` + // kind that has no integer projection. + Fixture::Int(n) => match kind.as_bounded_int() { + Some(_) => Some(n), + None => None, + }, Fixture::Numeric(_) | Fixture::Text(_) | Fixture::Jsonb(_) diff --git a/crates/eql-domains/src/kind.rs b/crates/eql-domains/src/kind.rs index a621ab04e..0b697331e 100644 --- a/crates/eql-domains/src/kind.rs +++ b/crates/eql-domains/src/kind.rs @@ -118,7 +118,7 @@ impl ScalarKind { ScalarKind::I16 => "i16", ScalarKind::I32 => "i32", ScalarKind::I64 => "i64", - ScalarKind::Text => "text", + ScalarKind::Text => "String", ScalarKind::Date => "chrono::NaiveDate", ScalarKind::Timestamptz => "chrono::DateTime", ScalarKind::Numeric => "rust_decimal::Decimal", diff --git a/crates/eql-domains/src/proptest_invariants.rs b/crates/eql-domains/src/proptest_invariants.rs index ecf6f6cd1..8c0e689bd 100644 --- a/crates/eql-domains/src/proptest_invariants.rs +++ b/crates/eql-domains/src/proptest_invariants.rs @@ -13,7 +13,7 @@ fn any_term() -> impl Strategy { prop_oneof![Just(Term::Hm), Just(Term::Ore), Just(Term::Bloom)] } -/// Strategy over the ten scalar kinds. +/// Strategy over the eleven scalar kinds. fn any_kind() -> impl Strategy { prop_oneof![ Just(ScalarKind::I16), @@ -22,6 +22,7 @@ fn any_kind() -> impl Strategy { Just(ScalarKind::Numeric), Just(ScalarKind::Text), Just(ScalarKind::Jsonb), + Just(ScalarKind::Bool), Just(ScalarKind::Date), Just(ScalarKind::Timestamptz), Just(ScalarKind::F32), diff --git a/crates/eql-domains/src/tests.rs b/crates/eql-domains/src/tests.rs index 8b8da8e18..7bd11cac9 100644 --- a/crates/eql-domains/src/tests.rs +++ b/crates/eql-domains/src/tests.rs @@ -139,6 +139,17 @@ mod rust_tests { assert_eq!(ScalarKind::Timestamptz.as_bounded_int(), None); } + #[test] + fn text_maps_to_string() { + // `rust_type()` is the canonical Rust *plaintext* type name, not the SQL + // token: `text` maps onto an owned `String`, matching the other arms + // (`chrono::NaiveDate`, `rust_decimal::Decimal`) which all name Rust types. + assert_eq!(ScalarKind::Text.rust_type(), "String"); + assert!(ScalarKind::Text.is_text()); + assert!(!ScalarKind::Text.is_int()); + assert_eq!(ScalarKind::Text.as_bounded_int(), None); + } + #[test] fn numeric_maps_to_decimal() { // Ordered, non-integer, non-chrono kind (14-block ORE): carries a rust @@ -485,6 +496,18 @@ mod fixture_tests { assert_eq!(Fixture::Max.numeric_value(ScalarKind::Date), None); } + #[test] + fn int_literal_value_is_none_on_non_integer_kinds() { + // `Fixture::Int(n)` is gated on the integer kinds like the sentinels: a + // hand-built literal paired with a non-integer kind has no integer + // projection and must resolve to `None`, not fabricate `Some(n)`. + assert_eq!(Fixture::Int(7).numeric_value(ScalarKind::Text), None); + assert_eq!(Fixture::Int(7).numeric_value(ScalarKind::Date), None); + assert_eq!(Fixture::Int(7).numeric_value(ScalarKind::Bool), None); + // Still resolves verbatim on an integer kind. + assert_eq!(Fixture::Int(7).numeric_value(ScalarKind::I32), Some(7)); + } + #[test] fn fixtures_macro_builds_each_kind() { // The int arm range-checks at compile time; sentinels + literals mix. From 8c8ff7f447e68d0417e1119d3fd0cf2c430015a0 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Wed, 24 Jun 2026 21:08:46 +1000 Subject: [PATCH 366/599] fix(eql-bindings): test-hygiene + doc-accuracy nits from review Three more pre-existing items from the crate-rename code review: - export.rs (dump_v3_json_schemas): clear schema/v3 before regenerating so a JSON file for a domain later removed from the catalog cannot linger as a stale checked-in artifact. The dir holds only this test's output, so recreating it from scratch is safe; with the catalog unchanged the regen is byte-identical. - v3_conformance.rs (int4_ord_rejects_missing_ore_term): drop the stray `hm` key from the fixture. `hm` is not an Int4Ord field, so under deny_unknown_fields the rejection could pass for the wrong reason; the payload now carries only the base envelope, so the sole cause of failure is the missing `ob`. - tests/codegen/reference/README.md: timestamptz is no longer equality-only (promoted to ordered, native 12-block ORE). Replace the stale example with an accurate shape-divergence one (bool is storage-only). cargo test -p eql-bindings: 11 passed. clippy clean. No schema/v3 drift. --- crates/eql-bindings/tests/export.rs | 6 ++++++ crates/eql-bindings/tests/v3_conformance.rs | 7 +++++-- tests/codegen/reference/README.md | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/eql-bindings/tests/export.rs b/crates/eql-bindings/tests/export.rs index 50a1b29b4..d01e56059 100644 --- a/crates/eql-bindings/tests/export.rs +++ b/crates/eql-bindings/tests/export.rs @@ -15,6 +15,12 @@ use eql_bindings::v3; fn dump_v3_json_schemas() { let base = std::env::var("EQL_TYPES_SCHEMA_DIR").unwrap_or_else(|_| "schema".into()); let dir = format!("{base}/v3"); + // Clear any prior output first so JSON for a domain that was removed from the + // catalog does not linger as a stale checked-in file. `schema/v3` holds only + // this test's generated `*.json`, so recreating it from scratch is safe. + if std::path::Path::new(&dir).exists() { + std::fs::remove_dir_all(&dir).unwrap(); + } std::fs::create_dir_all(&dir).unwrap(); for entry in v3::all() { let mut schema = serde_json::to_value(entry.schema()).unwrap(); diff --git a/crates/eql-bindings/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs index 06ed7e0b9..c5e97031a 100644 --- a/crates/eql-bindings/tests/v3_conformance.rs +++ b/crates/eql-bindings/tests/v3_conformance.rs @@ -125,11 +125,14 @@ fn rejects_unknown_keys() { #[test] fn int4_ord_rejects_missing_ore_term() { + // Omit `hm`: it is not an Int4Ord field, so leaving it in would trip + // deny_unknown_fields and the rejection could pass for the wrong reason. + // This payload carries only the base fields, so the sole cause of failure + // is the absent `ob`. let no_ob = json!({ "v": 2, "i": { "t": "users", "c": "age" }, - "c": "mp_base85_ciphertext", - "hm": "deadbeef" + "c": "mp_base85_ciphertext" }); let result: Result = serde_json::from_value(no_ob); assert!(result.is_err(), "Int4Ord must reject a payload with no ob"); diff --git a/tests/codegen/reference/README.md b/tests/codegen/reference/README.md index b002452fe..19cf5197e 100644 --- a/tests/codegen/reference/README.md +++ b/tests/codegen/reference/README.md @@ -1,6 +1,6 @@ # Codegen reference -The SQL files under `/` (`int4/`, `int2/`, `int8/`, `date/`, `timestamptz/`, `text/`) are the committed reference SQL files for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). **Every catalog type has a reference**, generated once from a known-good run and committed. Although the generator is type-generic — its templates are pure token substitution driven by the `eql_domains::CATALOG` rows (`crates/eql-domains/src/lib.rs`) — the per-type domain *shapes* differ (ordered types carry `_ord`/`_ord_ore` + aggregates; `timestamptz` is equality-only; `text` carries the Bloom `text_match` domain whose `@>`/`<@` render as supported containment operators), so anchoring every type catches a regression in any shape, not just the ordered one. +The SQL files under `/` (`int4/`, `int2/`, `int8/`, `date/`, `timestamptz/`, `text/`) are the committed reference SQL files for the encrypted-domain scalar generator, the Rust crate `crates/eql-codegen` (embedded minijinja templates in `crates/eql-codegen/templates/*.j2`). **Every catalog type has a reference**, generated once from a known-good run and committed. Although the generator is type-generic — its templates are pure token substitution driven by the `eql_domains::CATALOG` rows (`crates/eql-domains/src/lib.rs`) — the per-type domain *shapes* differ (ordered types — including `timestamptz`, now native 12-block ORE — carry `_ord`/`_ord_ore` + aggregates; storage-only types like `bool` carry no comparison surface at all; `text` additionally carries the Bloom `text_match` domain whose `@>`/`<@` render as supported containment operators), so anchoring every type catches a regression in any shape, not just the ordered one. Each reference file's first line is a `-- REFERENCE:` provenance marker; everything after it is the generated body verbatim, starting with the template-owned `-- AUTOMATICALLY GENERATED FILE.` header. From 993df0061a4a1f200ef21ab7c46c2c42b16ca35a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 10:00:37 +1000 Subject: [PATCH 367/599] refactor: clarify catalog vocabulary (DomainFamily/Domain/name) PR 2 of unified-catalog-codegen refactor. Behavior-preserving rename: ScalarSpec->DomainFamily, DomainSpec->Domain, token/suffix->name (bare), codegen owns the '_' join (Domain::full_name), domain_by_suffix-> domain_by_name. kind stays on DomainFamily (moves in PR 3). Generated SQL/TS/JSON and dump-catalog output are byte-identical (codegen:parity, types:check, test:matrix:inventory all green). --- CLAUDE.md | 2 +- DEVELOPMENT.md | 10 +- crates/eql-bindings/src/v3/mod.rs | 2 +- crates/eql-codegen/src/context.rs | 8 +- crates/eql-codegen/src/dump.rs | 24 ++-- crates/eql-codegen/src/generate.rs | 94 ++++++------- crates/eql-codegen/src/main.rs | 2 +- crates/eql-codegen/tests/parity.rs | 2 +- crates/eql-domains/src/lib.rs | 123 +++++++++--------- crates/eql-domains/src/proptest_invariants.rs | 2 +- crates/eql-domains/src/spec.rs | 72 +++++----- crates/eql-domains/src/tests.rs | 119 +++++++++-------- crates/eql-tests-macros/src/lib.rs | 6 +- .../adding-a-scalar-encrypted-domain-type.md | 42 +++--- tests/sqlx/src/scalar_domains.rs | 32 ++--- tests/sqlx/src/scalar_types.rs | 2 +- .../tests/encrypted_domain/family/support.rs | 2 +- tests/sqlx/tests/generate_all_fixtures.rs | 4 +- 18 files changed, 281 insertions(+), 267 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 383497255..2b90eba7c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -72,7 +72,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search `src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors/wrappers/aggregates (`eql_v3.eq_term`, `eql_v3.ord_term`, `eql_v3.eq`/`lt`/…, `eql_v3.min`/`max`) also live in `eql_v3`, and the SEM index-term types they return and construct (`eql_v3.hmac_256`, `eql_v3.ore_block_256`) are **also `eql_v3`** — hand-written under `src/v3/sem/` so the whole v3 surface is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `int4`, `int2`, `int8`, `date`, `timestamptz`, `numeric`, `text`, `bool`, `float4`, and `float8`, all following this materializer pattern. `jsonb` is the only catalog scalar with no generated SQL surface yet — it needs a separate SQL design beyond the ordered-scalar materializer, and the `eql-domains` fixture catalog (`crates/eql-domains`) models its fixture values ahead of that surface. -Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `ScalarSpec` giving the type `token` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `DomainSpec`s mapping each generated domain suffix to its fixed index `Term`s (`_eq => [Hm]`, `_ord`/`_ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` is out of scope for this scalar materializer. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `DomainFamily` giving the type `name` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `Domain`s mapping each generated (bare) domain name to its fixed index `Term`s (`eq => [Hm]`, `ord`/`ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` is out of scope for this scalar materializer. **Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-domains/src` with tests, not in free-form catalog data. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 308aa34c7..ced04c4aa 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -181,12 +181,12 @@ source of truth — the `CATALOG` const in [`crates/eql-domains/src/lib.rs`](./crates/eql-domains/src/lib.rs). There is no TOML manifest and no Python. -Each scalar type is one `ScalarSpec` row in `CATALOG`, declaring: +Each scalar type is one `DomainFamily` row in `CATALOG`, declaring: -- the type `token` (e.g. `int8`), +- the type `name` (e.g. `int8`), - its `ScalarKind` (the `kind` field), -- the `DomainSpec`s mapping each generated domain suffix to its fixed index - `Term`s (`_eq => [Hm]`, `_ord` / `_ord_ore => [Ore]`), and +- the `Domain`s mapping each generated (bare) domain name to its fixed index + `Term`s (`eq => [Hm]`, `ord` / `ord_ore => [Ore]`), and - the plaintext `Fixture` value list the SQLx test matrix consumes. `mise run build` invokes `cargo run -p eql-codegen`, which regenerates the SQL @@ -329,7 +329,7 @@ without a database at all. ### Adding a scalar encrypted-domain type Adding a scalar encrypted-domain type (e.g. a new ordered numeric scalar) is one -`ScalarSpec` row in `eql-domains::CATALOG` +`DomainFamily` row in `eql-domains::CATALOG` ([`crates/eql-domains/src/lib.rs`](./crates/eql-domains/src/lib.rs)). New term behaviour belongs in the `Term` enum's `impl` methods (with tests), not in free-form catalog data. After editing the catalog, run `mise run build` to diff --git a/crates/eql-bindings/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs index 2d70c2777..53998b457 100644 --- a/crates/eql-bindings/src/v3/mod.rs +++ b/crates/eql-bindings/src/v3/mod.rs @@ -93,7 +93,7 @@ pub trait DomainType { /// Unqualified SQL domain name (e.g. `"int4_eq"`) — [`Self::sql_domain`] /// minus the schema qualifier; matches `eql-domains` - /// `ScalarSpec::domain_name`. + /// `DomainFamily::domain_name`. fn domain(&self) -> &'static str { self.sql_domain() .strip_prefix("eql_v3.") diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 300a78cdf..2df23d725 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -2,7 +2,7 @@ use crate::consts::*; use crate::operator_surface::Operator; -use eql_domains::{DomainSpec, Term}; +use eql_domains::{Domain, Term}; /// Build the minijinja environment with the embedded templates: one whole-file /// template per output file (`types`/`functions`/`operators`/`aggregates`) plus @@ -74,8 +74,8 @@ pub struct TypesContext { /// Build the per-domain block data (port of `render_domain_block`'s value logic, /// minus comment prose and the CHECK skeleton — those are template-resident). -pub fn domain_block(token: &str, domain: &DomainSpec) -> DomainBlock { - let name = domain.name_with_token(token); +pub fn domain_block(token: &str, domain: &Domain) -> DomainBlock { + let name = domain.full_name(token); let mut keys: Vec = ENVELOPE_KEYS.iter().map(|k| sql_str(k)).collect(); for k in Term::term_json_keys(domain.terms) { @@ -135,7 +135,7 @@ pub enum FnEntry { pub struct FunctionsContext { pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:" pub token: String, - pub name: String, // full domain name (token+suffix) + pub name: String, // full domain name (family-name + "_" + domain-name) pub dom: String, // schema-qualified domain, e.g. eql_v3.int4_eq pub domain_lit: String, // sql_str(dom), defensively escaped for the RAISE literal pub entries: Vec, diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 5cddb056d..a68e80682 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -25,12 +25,14 @@ pub struct TypeEntry { #[derive(Serialize)] pub struct DomainEntry { - /// Test-name segment: the base domain (`suffix == ""`) is `storage`; - /// otherwise the suffix without its leading underscore (`_eq` → `eq`, - /// `_ord_ore` → `ord_ore`). + /// Test-name segment: the base domain (`name == ""`) is `storage`; + /// otherwise the bare domain name (`eq`, `ord`, …). pub segment: String, - /// Raw catalog suffix (`""`, `_eq`, `_ord`, `_ord_ore`, `_match`). - pub suffix: &'static str, + /// The `suffix` wire field (`""`, `_eq`, `_ord`, `_ord_ore`, `_match`), + /// reconstructed by re-prefixing the bare domain name with `_` so the + /// emitted JSON stays byte-stable after the catalog dropped the leading + /// underscore from its stored domain names. + pub suffix: String, /// SQL operators the domain's terms support, in catalog order. Empty for /// the storage domain (no terms). pub supported_ops: Vec<&'static str>, @@ -45,17 +47,21 @@ pub fn dump_catalog() -> CatalogDump { .domains .iter() .map(|d| DomainEntry { - segment: if d.suffix.is_empty() { + segment: if d.name.is_empty() { "storage".to_string() } else { - d.suffix.trim_start_matches('_').to_string() + d.name.to_string() + }, + suffix: if d.name.is_empty() { + String::new() + } else { + format!("_{}", d.name) }, - suffix: d.suffix, supported_ops: Term::operators_for_terms(d.terms), }) .collect(); TypeEntry { - token: spec.token, + token: spec.name, is_eq_only: spec.is_eq_only(), domains, } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index c400e871a..58d97464a 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; -use eql_domains::{DomainSpec, ScalarSpec, Term}; +use eql_domains::{Domain, DomainFamily, Term}; use crate::context::{domain_name, is_ord_capable}; use crate::operator_surface::OPERATORS; @@ -39,14 +39,14 @@ fn types_path(token: &str) -> String { /// Body for _types.sql: every domain in one idempotent DO block. /// Port of `render_types_file`. -pub fn render_types_file(spec: &ScalarSpec) -> String { +pub fn render_types_file(spec: &DomainFamily) -> String { use crate::context::{domain_block, environment, TypesContext}; let ctx = TypesContext { - token: spec.token.to_string(), + token: spec.name.to_string(), domains: spec .domains .iter() - .map(|d| domain_block(spec.token, d)) + .map(|d| domain_block(spec.name, d)) .collect(), }; environment() @@ -72,12 +72,12 @@ fn functions_requires(token: &str, terms: &[Term]) -> Vec { } /// Body for a domain's _functions.sql. Port of `render_functions_file`. -pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { +pub fn render_functions_file(token: &str, domain: &Domain) -> String { use crate::consts::sql_str; use crate::context::{ environment, extractor_entry, unsupported_entry, wrapper_entry, FunctionsContext, SqlParam, }; - let name = domain.name_with_token(token); + let name = domain.full_name(token); let dom = domain_name(&name); let domain_lit = sql_str(&dom); let supported = Term::operators_for_terms(domain.terms); @@ -127,9 +127,9 @@ pub fn render_functions_file(token: &str, domain: &DomainSpec) -> String { } /// Body for a domain's _operators.sql. Port of `render_operators_file`. -pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { +pub fn render_operators_file(token: &str, domain: &Domain) -> String { use crate::context::{environment, operator_entry, OperatorsContext}; - let name = domain.name_with_token(token); + let name = domain.full_name(token); let dom = domain_name(&name); let supported = Term::operators_for_terms(domain.terms); let is_supported = |op: &str| supported.contains(&op); @@ -169,12 +169,12 @@ pub fn render_operators_file(token: &str, domain: &DomainSpec) -> String { /// Body for a domain's _aggregates.sql, or None if not ord-capable. /// Port of `render_aggregates_file`. -pub fn render_aggregates_file(token: &str, domain: &DomainSpec) -> Option { +pub fn render_aggregates_file(token: &str, domain: &Domain) -> Option { use crate::context::{environment, AggregatesContext, AGGREGATE_OPS}; if !is_ord_capable(domain.terms) { return None; } - let name = domain.name_with_token(token); + let name = domain.full_name(token); let dom = domain_name(&name); let ctx = AggregatesContext { requires: vec![ @@ -203,11 +203,11 @@ use crate::writer::{ /// Regenerate every generated file for one type into `out_dir`. /// Port of `generate_type`. Returns the written paths. -pub fn generate_type(spec: &ScalarSpec, out_dir: &Path) -> Result, WriteError> { - let token = spec.token; +pub fn generate_type(spec: &DomainFamily, out_dir: &Path) -> Result, WriteError> { + let token = spec.name; let mut targets = vec![out_dir.join(format!("{token}_types.sql"))]; for d in spec.domains { - let name = d.name_with_token(token); + let name = d.full_name(token); targets.push(out_dir.join(format!("{name}_functions.sql"))); targets.push(out_dir.join(format!("{name}_operators.sql"))); if is_ord_capable(d.terms) { @@ -224,7 +224,7 @@ pub fn generate_type(spec: &ScalarSpec, out_dir: &Path) -> Result, written.push(types_path); for d in spec.domains { - let name = d.name_with_token(token); + let name = d.full_name(token); let fn_path = out_dir.join(format!("{name}_functions.sql")); write_generated_file(&fn_path, &render_functions_file(token, d))?; written.push(fn_path); @@ -248,7 +248,7 @@ pub fn generate_type(spec: &ScalarSpec, out_dir: &Path) -> Result, /// (`eql_domains::INT4_VALUES` / `INT2_VALUES`), read directly by the SQLx tests. pub fn generate_all(out_root: &Path) -> Result { for spec in eql_domains::CATALOG { - let token = spec.token; + let token = spec.name; let out_dir = out_root.join(V3_SCALARS_DIR).join(token); let written = generate_type(spec, &out_dir)?; @@ -258,7 +258,7 @@ pub fn generate_all(out_root: &Path) -> Result { } println!("generated {} files for {token}", written.len()); } - let tokens: Vec<&str> = eql_domains::CATALOG.iter().map(|s| s.token).collect(); + let tokens: Vec<&str> = eql_domains::CATALOG.iter().map(|s| s.name).collect(); println!( "codegen: ok ({} types: {})", tokens.len(), @@ -272,18 +272,18 @@ mod tests { use super::*; use eql_domains::CATALOG; - fn spec(token: &str) -> &'static ScalarSpec { + fn spec(token: &str) -> &'static DomainFamily { CATALOG .iter() - .find(|s| s.token == token) + .find(|s| s.name == token) .expect("catalog token") } - fn domain<'a>(spec: &'a ScalarSpec, suffix: &str) -> &'a DomainSpec { + fn domain<'a>(spec: &'a DomainFamily, name: &str) -> &'a Domain { spec.domains .iter() - .find(|d| d.suffix == suffix) - .expect("domain suffix") + .find(|d| d.name == name) + .expect("domain name") } use crate::repo_root; @@ -305,12 +305,12 @@ mod tests { out } - fn rendered_for(token: &str, name: &str, spec: &ScalarSpec) -> String { + fn rendered_for(token: &str, name: &str, spec: &DomainFamily) -> String { if name == format!("{token}_types.sql") { return render_types_file(spec); } for d in spec.domains { - let full = d.name_with_token(token); + let full = d.full_name(token); if name == format!("{full}_functions.sql") { return render_functions_file(token, d); } @@ -337,7 +337,7 @@ mod tests { #[test] fn functions_render_supported_wrappers_and_unsupported_entries_from_catalog() { let s = spec("int4"); - let d = domain(s, "_eq"); + let d = domain(s, "eq"); let sql = render_functions_file("int4", d); assert!(sql.contains("CREATE FUNCTION eql_v3.eq(")); assert!(sql.contains("AS $$ SELECT")); @@ -466,7 +466,7 @@ mod tests { #[test] fn storage_functions_file_is_all_blockers() { let s = spec("int4"); - let sql = render_functions_file(s.token, domain(s, "")); + let sql = render_functions_file(s.name, domain(s, "")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 44); assert!(!sql.contains("SET search_path")); assert_eq!(sql.matches("LANGUAGE plpgsql").count(), 44); @@ -480,7 +480,7 @@ mod tests { #[test] fn eq_functions_file_counts() { let s = spec("int4"); - let sql = render_functions_file(s.token, domain(s, "_eq")); + let sql = render_functions_file(s.name, domain(s, "eq")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)")); assert!(sql.contains("RETURNS eql_v3.hmac_256")); @@ -496,7 +496,7 @@ mod tests { #[test] fn ore_functions_file_counts() { let s = spec("int4"); - let sql = render_functions_file(s.token, domain(s, "_ord")); + let sql = render_functions_file(s.name, domain(s, "ord")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)")); assert!(sql.contains("RETURNS eql_v3.ore_block_256")); @@ -511,23 +511,23 @@ mod tests { #[test] fn operators_file_has_forty_four() { let s = spec("int4"); - let sql = render_operators_file(s.token, domain(s, "_eq")); + let sql = render_operators_file(s.name, domain(s, "eq")); assert_eq!(sql.matches("CREATE OPERATOR").count(), 44); } #[test] fn aggregates_file_only_for_ord_variants() { let s = spec("int4"); - assert!(render_aggregates_file(s.token, domain(s, "")).is_none()); - assert!(render_aggregates_file(s.token, domain(s, "_eq")).is_none()); - assert!(render_aggregates_file(s.token, domain(s, "_ord")).is_some()); - assert!(render_aggregates_file(s.token, domain(s, "_ord_ore")).is_some()); + assert!(render_aggregates_file(s.name, domain(s, "")).is_none()); + assert!(render_aggregates_file(s.name, domain(s, "eq")).is_none()); + assert!(render_aggregates_file(s.name, domain(s, "ord")).is_some()); + assert!(render_aggregates_file(s.name, domain(s, "ord_ore")).is_some()); } #[test] fn aggregates_file_carries_min_and_max_and_requires() { let s = spec("int4"); - let sql = render_aggregates_file(s.token, domain(s, "_ord")).unwrap(); + let sql = render_aggregates_file(s.name, domain(s, "ord")).unwrap(); assert_eq!(sql.matches("CREATE FUNCTION").count(), 2); assert_eq!(sql.matches("CREATE AGGREGATE").count(), 2); assert!(sql.contains("eql_v3.min_sfunc")); @@ -540,20 +540,20 @@ mod tests { #[test] fn ordered_files_byte_identical_modulo_typename() { let s = spec("int4"); - let ord = domain(s, "_ord"); - let ore = domain(s, "_ord_ore"); + let ord = domain(s, "ord"); + let ore = domain(s, "ord_ore"); let norm = |sql: String| sql.replace("int4_ord_ore", "T").replace("int4_ord", "T"); assert_eq!( - norm(render_functions_file(s.token, ord)), - norm(render_functions_file(s.token, ore)) + norm(render_functions_file(s.name, ord)), + norm(render_functions_file(s.name, ore)) ); assert_eq!( - norm(render_operators_file(s.token, ord)), - norm(render_operators_file(s.token, ore)) + norm(render_operators_file(s.name, ord)), + norm(render_operators_file(s.name, ore)) ); assert_eq!( - norm(render_aggregates_file(s.token, ord).unwrap()), - norm(render_aggregates_file(s.token, ore).unwrap()) + norm(render_aggregates_file(s.name, ord).unwrap()), + norm(render_aggregates_file(s.name, ore).unwrap()) ); } @@ -577,7 +577,7 @@ mod tests { fn inlinable_functions_have_no_set_search_path() { let s = spec("int4"); // Extractors and wrappers (eq/ord functions files) are inlinable SQL. - for suffix in ["_eq", "_ord"] { + for suffix in ["eq", "ord"] { let sql = render_functions_file("int4", domain(s, suffix)); // Inlinable rows are the LANGUAGE sql ones; none may pin search_path. for block in sql.split("CREATE FUNCTION").skip(1) { @@ -594,7 +594,7 @@ mod tests { #[test] fn aggregate_state_functions_are_plpgsql_not_inlinable() { let s = spec("int4"); - let sql = render_aggregates_file("int4", domain(s, "_ord")).unwrap(); + let sql = render_aggregates_file("int4", domain(s, "ord")).unwrap(); assert_eq!(sql.matches("CREATE FUNCTION").count(), 2); assert_eq!( sql.matches("LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE") @@ -625,7 +625,7 @@ mod tests { ); } - let sql = render_aggregates_file("int4", domain(s, "_ord")).unwrap(); + let sql = render_aggregates_file("int4", domain(s, "ord")).unwrap(); let function_like = sql.matches("CREATE FUNCTION").count() + sql.matches("CREATE AGGREGATE").count(); assert_eq!(sql.matches("--! @return").count(), function_like); @@ -668,11 +668,11 @@ mod tests { #[test] fn domain_block_escapes_quote_bearing_name() { use crate::context::domain_block; - use eql_domains::DomainSpec; + use eql_domains::Domain; let block = domain_block( "int4", - &DomainSpec { - suffix: "_q", + &Domain { + name: "q", terms: &[], }, ); diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index a02e43fff..336b0ac04 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -10,7 +10,7 @@ fn main() -> ExitCode { // fixtures-all and matrix-inventory enumeration. if args.len() == 2 && args[1] == "list-types" { for spec in eql_domains::CATALOG { - println!("{}", spec.token); + println!("{}", spec.name); } return ExitCode::SUCCESS; } diff --git a/crates/eql-codegen/tests/parity.rs b/crates/eql-codegen/tests/parity.rs index 7fde8bcac..13c2eb895 100644 --- a/crates/eql-codegen/tests/parity.rs +++ b/crates/eql-codegen/tests/parity.rs @@ -81,7 +81,7 @@ fn reference_dirs_match_catalog_tokens() { let refs = reference_tokens(&root); let catalog: BTreeSet = eql_domains::CATALOG .iter() - .map(|s| s.token.to_string()) + .map(|s| s.name.to_string()) .collect(); assert_eq!( refs, catalog, diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index a5d872d19..6c3494868 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -196,22 +196,23 @@ pub enum Fixture { Float(&'static str), } -/// One generated public domain: a suffix appended to the type token and the -/// fixed index terms it carries. Suffix `""` is the storage-only domain. +/// One generated public domain: a bare domain name joined under the family +/// name (codegen owns the `_` separator) plus the fixed index terms it +/// carries. Name `""` is the storage-only domain. #[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct DomainSpec { - pub suffix: &'static str, +pub struct Domain { + pub name: &'static str, pub terms: &'static [Term], } -/// A scalar encrypted-domain type: its SQL token, native Rust type, generated +/// A scalar encrypted-domain type: its SQL `name`, native Rust type, generated /// domains, and fixture plaintext list. The Rust analogue of one `*.toml`. /// (`domain_name`/`is_eq_only` are impl'd in `spec`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct ScalarSpec { - pub token: &'static str, +pub struct DomainFamily { + pub name: &'static str, pub kind: ScalarKind, - pub domains: &'static [DomainSpec], + pub domains: &'static [Domain], pub fixtures: &'static [Fixture], } @@ -242,21 +243,21 @@ macro_rules! fixtures { /// Domains shared by every ordered-integer scalar, in manifest file order: /// storage (no terms), `_eq` (hm), `_ord_ore` (ore), `_ord` (ore). -const ORDERED_INT_DOMAINS: &[DomainSpec] = &[ - DomainSpec { - suffix: "", +const ORDERED_INT_DOMAINS: &[Domain] = &[ + Domain { + name: "", terms: &[], }, - DomainSpec { - suffix: "_eq", + Domain { + name: "eq", terms: &[Term::Hm], }, - DomainSpec { - suffix: "_ord_ore", + Domain { + name: "ord_ore", terms: &[Term::Ore], }, - DomainSpec { - suffix: "_ord", + Domain { + name: "ord", terms: &[Term::Ore], }, ]; @@ -270,13 +271,13 @@ const ORDERED_INT_DOMAINS: &[DomainSpec] = &[ /// so a future non-orderable scalar (e.g. a hash-only type) can reuse it without /// reconstructing the shape. #[allow(dead_code)] -const EQ_ONLY_DOMAINS: &[DomainSpec] = &[ - DomainSpec { - suffix: "", +const EQ_ONLY_DOMAINS: &[Domain] = &[ + Domain { + name: "", terms: &[], }, - DomainSpec { - suffix: "_eq", + Domain { + name: "eq", terms: &[Term::Hm], }, ]; @@ -340,22 +341,22 @@ const NUMERIC_FIXTURES: &[Fixture] = fixtures!(numeric; "-1000000000000", "-1000000", "-1.001", "-1", "-0.5", "-0.001", "0", "0.001", "0.5", "0.999999999", "1", "1.001", "1000000", "1000000000000"); -const INT4: ScalarSpec = ScalarSpec { - token: "int4", +const INT4: DomainFamily = DomainFamily { + name: "int4", kind: ScalarKind::I32, domains: ORDERED_INT_DOMAINS, fixtures: INT4_FIXTURES, }; -const INT2: ScalarSpec = ScalarSpec { - token: "int2", +const INT2: DomainFamily = DomainFamily { + name: "int2", kind: ScalarKind::I16, domains: ORDERED_INT_DOMAINS, fixtures: INT2_FIXTURES, }; -const INT8: ScalarSpec = ScalarSpec { - token: "int8", +const INT8: DomainFamily = DomainFamily { + name: "int8", kind: ScalarKind::I64, domains: ORDERED_INT_DOMAINS, fixtures: INT8_FIXTURES, @@ -369,8 +370,8 @@ const INT8: ScalarSpec = ScalarSpec { /// `DATE.fixtures` directly to parse the ISO strings into `chrono::NaiveDate` /// at runtime — there is no `DATE_VALUES` const (chrono is not `const`-friendly /// and `eql-domains` stays zero-dep, so no typed slice is materialised here). -pub const DATE: ScalarSpec = ScalarSpec { - token: "date", +pub const DATE: DomainFamily = DomainFamily { + name: "date", kind: ScalarKind::Date, domains: ORDERED_INT_DOMAINS, fixtures: DATE_FIXTURES, @@ -386,8 +387,8 @@ pub const DATE: ScalarSpec = ScalarSpec { /// Public (like `DATE`) because the SQLx harness reads `TIMESTAMPTZ.fixtures` /// directly to parse the RFC3339 strings into `chrono::DateTime` at runtime /// (no `TIMESTAMPTZ_VALUES` const; `eql-domains` stays zero-dep). -pub const TIMESTAMPTZ: ScalarSpec = ScalarSpec { - token: "timestamptz", +pub const TIMESTAMPTZ: DomainFamily = DomainFamily { + name: "timestamptz", kind: ScalarKind::Timestamptz, domains: ORDERED_INT_DOMAINS, fixtures: TIMESTAMPTZ_FIXTURES, @@ -405,8 +406,8 @@ pub const TIMESTAMPTZ: ScalarSpec = ScalarSpec { /// `NUMERIC.fixtures` directly to parse the decimal strings into /// `rust_decimal::Decimal` at runtime (the catalog stays zero-dep: no /// `rust_decimal`). -pub const NUMERIC: ScalarSpec = ScalarSpec { - token: "numeric", +pub const NUMERIC: DomainFamily = DomainFamily { + name: "numeric", kind: ScalarKind::Numeric, domains: ORDERED_INT_DOMAINS, fixtures: NUMERIC_FIXTURES, @@ -422,41 +423,41 @@ pub const NUMERIC: ScalarSpec = ScalarSpec { /// claim; it simply never wins because `Hm` precedes it (Option 1, catalog /// ordering). Integer kinds keep `[Ore]`-only `_ord` domains — ORE equality is /// lossless for them. -const TEXT_DOMAINS: &[DomainSpec] = &[ - DomainSpec { - suffix: "", +const TEXT_DOMAINS: &[Domain] = &[ + Domain { + name: "", terms: &[], }, - DomainSpec { - suffix: "_eq", + Domain { + name: "eq", terms: &[Term::Hm], }, - DomainSpec { - suffix: "_match", + Domain { + name: "match", terms: &[Term::Bloom], }, - DomainSpec { - suffix: "_ord_ore", + Domain { + name: "ord_ore", terms: &[Term::Hm, Term::Ore], }, - DomainSpec { - suffix: "_ord", + Domain { + name: "ord", terms: &[Term::Hm, Term::Ore], }, - DomainSpec { - suffix: "_search", + Domain { + name: "search", terms: &[Term::Hm, Term::Ore, Term::Bloom], }, ]; -/// Storage-only domains: a single term-less domain (suffix `""`). The canonical +/// Storage-only domains: a single term-less domain (name `""`). The canonical /// shape for an **encryption-only** scalar — encrypted at rest, decrypted by the /// proxy, never searched server-side. No `_eq`/`_ord`, so no SEM index term and /// no comparison surface (every operator on the domain is a blocker). Used by /// `bool`, whose two-value cardinality makes any searchable index a plaintext /// leak. Validated as a known-valid shape by `every_type_uses_a_known_domain_shape`. -const STORAGE_ONLY_DOMAINS: &[DomainSpec] = &[DomainSpec { - suffix: "", +const STORAGE_ONLY_DOMAINS: &[Domain] = &[Domain { + name: "", terms: &[], }]; @@ -473,8 +474,8 @@ const BOOL_FIXTURES: &[Fixture] = fixtures!(bool; false, true); /// never searched server-side. Public so the SQLx harness reads `BOOL.fixtures` /// directly (there is no `BOOL_VALUES` materializer — the two values are read /// straight from the catalog). -pub const BOOL: ScalarSpec = ScalarSpec { - token: "bool", +pub const BOOL: DomainFamily = DomainFamily { + name: "bool", kind: ScalarKind::Bool, domains: STORAGE_ONLY_DOMAINS, fixtures: BOOL_FIXTURES, @@ -509,8 +510,8 @@ const TEXT_FIXTURES: &[Fixture] = fixtures!(text; /// `text` — an ordered, non-integer, unbounded scalar. Adds a `_match` domain /// (the `Bloom` term) on top of the ordered shape. Public because the SQLx /// harness reads `TEXT_VALUES` (materialised below). -pub const TEXT: ScalarSpec = ScalarSpec { - token: "text", +pub const TEXT: DomainFamily = DomainFamily { + name: "text", kind: ScalarKind::Text, domains: TEXT_DOMAINS, fixtures: TEXT_FIXTURES, @@ -546,8 +547,8 @@ const FLOAT8_FIXTURES: &[Fixture] = fixtures!(float; /// (`Plaintext::Float`), so `float4` vs `float8` is purely a Postgres-surface /// distinction. Public (like `DATE`/`NUMERIC`) so the SQLx harness reads /// `FLOAT4.fixtures` directly to parse the strings into `f32`. -pub const FLOAT4: ScalarSpec = ScalarSpec { - token: "float4", +pub const FLOAT4: DomainFamily = DomainFamily { + name: "float4", kind: ScalarKind::F32, domains: ORDERED_INT_DOMAINS, fixtures: FLOAT4_FIXTURES, @@ -556,8 +557,8 @@ pub const FLOAT4: ScalarSpec = ScalarSpec { /// `float8` — an **ordered**, non-integer scalar (Postgres `double precision`), /// the native width of the float crypto path. Reuses the ordered shape. Public /// so the SQLx harness reads `FLOAT8.fixtures` directly to parse into `f64`. -pub const FLOAT8: ScalarSpec = ScalarSpec { - token: "float8", +pub const FLOAT8: DomainFamily = DomainFamily { + name: "float8", kind: ScalarKind::F64, domains: ORDERED_INT_DOMAINS, fixtures: FLOAT8_FIXTURES, @@ -565,7 +566,7 @@ pub const FLOAT8: ScalarSpec = ScalarSpec { /// The scalar catalog — the single source of truth. Order is significant (it /// drives generation order). New types are appended as their SQL surface lands. -pub const CATALOG: &[ScalarSpec] = &[ +pub const CATALOG: &[DomainFamily] = &[ INT4, INT2, INT8, @@ -593,7 +594,7 @@ macro_rules! int_values { #[doc = concat!("Distinct plaintext fixture values for `", stringify!($spec), "`, ")] #[doc = "materialised from its `CATALOG` row (see `int_values!`)."] pub const $name: &[$ty] = { - const SPEC: ScalarSpec = $spec; + const SPEC: DomainFamily = $spec; const N: usize = SPEC.fixtures.len(); const ARR: [$ty; N] = { let mut out = [0 as $ty; N]; @@ -640,7 +641,7 @@ macro_rules! text_values { #[doc = concat!("Distinct plaintext fixture values for `", stringify!($spec), "`, ")] #[doc = "materialised from its `CATALOG` row (see `text_values!`)."] pub const $name: &[&'static str] = { - const SPEC: ScalarSpec = $spec; + const SPEC: DomainFamily = $spec; const N: usize = SPEC.fixtures.len(); const ARR: [&'static str; N] = { let mut out = [""; N]; diff --git a/crates/eql-domains/src/proptest_invariants.rs b/crates/eql-domains/src/proptest_invariants.rs index 8c0e689bd..401b45214 100644 --- a/crates/eql-domains/src/proptest_invariants.rs +++ b/crates/eql-domains/src/proptest_invariants.rs @@ -123,7 +123,7 @@ fn eq_only_specs_have_no_ordering_operators() { assert!( !ops.iter().any(|o| matches!(*o, "<" | "<=" | ">" | ">=")), "eq-only spec {} exposes an ordering operator on {}", - spec.token, + spec.name, spec.domain_name(dom) ); } diff --git a/crates/eql-domains/src/spec.rs b/crates/eql-domains/src/spec.rs index 8d97dc453..39b766348 100644 --- a/crates/eql-domains/src/spec.rs +++ b/crates/eql-domains/src/spec.rs @@ -1,51 +1,57 @@ -//! Inherent impls for [`ScalarSpec`] — the per-type helpers `domain_name` -//! (token + suffix) and `is_eq_only` (no `_ord` domain). Definitions for -//! [`ScalarSpec`] and [`DomainSpec`] live in `lib.rs`. +//! Inherent impls for [`DomainFamily`] — the per-type helpers `domain_name` +//! (family-name + `_` + domain-name) and `is_eq_only` (no `ord` domain). +//! Definitions for [`DomainFamily`] and [`Domain`] live in `lib.rs`. -use crate::{DomainSpec, ScalarSpec}; +use crate::{Domain, DomainFamily}; -impl DomainSpec { - /// The full (unqualified) domain name for this domain under `token`: - /// `token` + `suffix` (suffix `""` => bare token). The **single** source for - /// the token+suffix concatenation — codegen builds every domain name through - /// this, so the "domain name starts with the token" rule is structural. - pub fn name_with_token(&self, token: &str) -> String { - format!("{token}{}", self.suffix) +impl Domain { + /// The full (unqualified) domain name for this domain under `family_name`: + /// the family name joined to the bare domain name with a `_` separator (an + /// empty domain name => the bare family name). The **single** site that owns + /// the `_` join — codegen builds every domain name through this, so the + /// "domain name starts with the family name" rule is structural. + pub fn full_name(&self, family_name: &str) -> String { + if self.name.is_empty() { + family_name.to_string() + } else { + format!("{family_name}_{}", self.name) + } } } -impl ScalarSpec { - /// The fully-qualified domain name: `token` + `suffix`. Makes the old - /// "domain name must start with the token" validation structural. - pub fn domain_name(&self, domain: &DomainSpec) -> String { - domain.name_with_token(self.token) +impl DomainFamily { + /// The fully-qualified domain name: family-name + `_` + domain-name. Makes + /// the old "domain name must start with the family name" validation + /// structural. + pub fn domain_name(&self, domain: &Domain) -> String { + domain.full_name(self.name) } - /// True when this type declares no ordered (`_ord`) domain — i.e. equality-only - /// (storage + `_eq`). Replaces the future `[eq_only]` marker: the domain set - /// already carries this. The `_ord_ore` twin only appears alongside `_ord`, so - /// testing `_ord` suffices. + /// True when this type declares no ordered (`ord`) domain — i.e. equality-only + /// (storage + `eq`). Replaces the future `[eq_only]` marker: the domain set + /// already carries this. The `ord_ore` twin only appears alongside `ord`, so + /// testing `ord` suffices. pub fn is_eq_only(&self) -> bool { - !self.domains.iter().any(|d| d.suffix == "_ord") + !self.domains.iter().any(|d| d.name == "ord") } /// True when this type is **storage-only / encryption-only**: it declares a - /// single term-less domain (the bare-token storage domain) and no comparison - /// domain (`_eq`/`_ord`/`_match`/…). The shape for a scalar encrypted at rest - /// but never searched server-side (e.g. `bool`, whose two-value cardinality - /// makes any searchable index a plaintext leak). Stricter than - /// `is_eq_only()` — a storage-only type is also `is_eq_only()` (no `_ord`), - /// but has no `_eq` either. + /// single term-less domain (the bare-family-name storage domain) and no + /// comparison domain (`eq`/`ord`/`match`/…). The shape for a scalar encrypted + /// at rest but never searched server-side (e.g. `bool`, whose two-value + /// cardinality makes any searchable index a plaintext leak). Stricter than + /// `is_eq_only()` — a storage-only type is also `is_eq_only()` (no `ord`), + /// but has no `eq` either. pub fn is_storage_only(&self) -> bool { self.domains.len() == 1 - && self.domains[0].suffix.is_empty() + && self.domains[0].name.is_empty() && self.domains[0].terms.is_empty() } - /// The domain on this scalar with the given `suffix`, or `None`. Centralizes - /// the `domains.iter().find(|d| d.suffix == s)` lookup duplicated across the - /// catalog tests and the SQLx harness. - pub fn domain_by_suffix(&self, suffix: &str) -> Option<&DomainSpec> { - self.domains.iter().find(|d| d.suffix == suffix) + /// The domain on this scalar with the given (bare) `name`, or `None`. + /// Centralizes the `domains.iter().find(|d| d.name == n)` lookup duplicated + /// across the catalog tests and the SQLx harness. + pub fn domain_by_name(&self, name: &str) -> Option<&Domain> { + self.domains.iter().find(|d| d.name == name) } } diff --git a/crates/eql-domains/src/tests.rs b/crates/eql-domains/src/tests.rs index 7bd11cac9..be5cfa34f 100644 --- a/crates/eql-domains/src/tests.rs +++ b/crates/eql-domains/src/tests.rs @@ -1,7 +1,7 @@ //! Unit tests for the scalar/term catalog. Kept as one `#[cfg(test)]` module //! (declared from `lib.rs`) rather than co-located with each impl file because //! `rust_tests` spans `BoundedIntKind` + `ScalarKind` + `Fixture` + -//! `ScalarSpec`. Each inner module imports the crate-root catalog with +//! `DomainFamily`. Each inner module imports the crate-root catalog with //! `use crate::*;`; the crate-local `fixtures!` macro is in scope here by textual //! scoping (this module is declared after the macro definition in `lib.rs`). @@ -174,7 +174,7 @@ mod rust_tests { spec.kind.is_int(), "pivot sentinel {fixture:?} on non-integer kind {:?} (token `{}`)", spec.kind, - spec.token, + spec.name, ); } } @@ -194,11 +194,11 @@ mod rust_tests { #[test] fn is_eq_only_detects_absence_of_ord_domains() { - let int4 = CATALOG.iter().find(|s| s.token == "int4").unwrap(); + let int4 = CATALOG.iter().find(|s| s.name == "int4").unwrap(); assert!(!int4.is_eq_only(), "int4 is ordered"); - let date = CATALOG.iter().find(|s| s.token == "date").unwrap(); + let date = CATALOG.iter().find(|s| s.name == "date").unwrap(); assert!(!date.is_eq_only(), "date is ordered"); - let ts = CATALOG.iter().find(|s| s.token == "timestamptz").unwrap(); + let ts = CATALOG.iter().find(|s| s.name == "timestamptz").unwrap(); assert!( !ts.is_eq_only(), "timestamptz is now ordered (native 12-block ORE, comparator generalized to N blocks)" @@ -207,8 +207,8 @@ mod rust_tests { // No catalog type is currently eq-only, so exercise `is_eq_only()`'s // positive path with a synthetic spec built on the retained // `EQ_ONLY_DOMAINS` shape (storage + `_eq`, no `_ord`). - let eq_only = ScalarSpec { - token: "synthetic_eq_only", + let eq_only = DomainFamily { + name: "synthetic_eq_only", kind: ScalarKind::Timestamptz, domains: EQ_ONLY_DOMAINS, fixtures: &[], @@ -566,16 +566,16 @@ mod fixture_tests { mod catalog_tests { use crate::*; - fn scalar(token: &str) -> &'static ScalarSpec { + fn scalar(token: &str) -> &'static DomainFamily { CATALOG .iter() - .find(|s| s.token == token) + .find(|s| s.name == token) .unwrap_or_else(|| panic!("{token} missing from CATALOG")) } #[test] fn catalog_has_all_tokens_in_order() { - let tokens: Vec<&str> = CATALOG.iter().map(|s| s.token).collect(); + let tokens: Vec<&str> = CATALOG.iter().map(|s| s.name).collect(); assert_eq!( tokens, vec![ @@ -600,7 +600,7 @@ mod catalog_tests { assert_eq!(b.kind.rust_type(), "bool"); // Storage-only: exactly one term-less domain, no `_eq`/`_ord` — no SEM // index term, no comparison surface. - let shape: Vec<(&str, &[Term])> = b.domains.iter().map(|d| (d.suffix, d.terms)).collect(); + let shape: Vec<(&str, &[Term])> = b.domains.iter().map(|d| (d.name, d.terms)).collect(); assert_eq!(shape, vec![("", &[] as &[Term])]); // bool is none of the comparison-capable kinds. assert!(!b.kind.is_int()); @@ -612,7 +612,7 @@ mod catalog_tests { // storage-only. assert!(b.is_eq_only()); assert!(b.is_storage_only()); - assert!(b.domain_by_suffix("_eq").is_none()); + assert!(b.domain_by_name("eq").is_none()); // Both boolean plaintexts are present as fixtures. assert_eq!(b.fixtures, &[Fixture::Bool(false), Fixture::Bool(true)]); } @@ -624,9 +624,9 @@ mod catalog_tests { for s in CATALOG { assert_eq!( s.is_storage_only(), - s.token == "bool", + s.name == "bool", "{} storage-only classification is wrong", - s.token + s.name ); } } @@ -635,17 +635,17 @@ mod catalog_tests { fn text_spec_is_in_catalog() { let text = scalar("text"); assert_eq!(text.kind, ScalarKind::Text); - let suffixes: Vec<_> = text.domains.iter().map(|d| d.suffix).collect(); + let suffixes: Vec<_> = text.domains.iter().map(|d| d.name).collect(); assert_eq!( suffixes, - vec!["", "_eq", "_match", "_ord_ore", "_ord", "_search"] + vec!["", "eq", "match", "ord_ore", "ord", "search"] ); } #[test] fn text_match_domain_carries_only_bloom() { let text = scalar("text"); - let m = text.domains.iter().find(|d| d.suffix == "_match").unwrap(); + let m = text.domains.iter().find(|d| d.name == "match").unwrap(); assert_eq!(m.terms, &[Term::Bloom]); } @@ -674,26 +674,26 @@ mod catalog_tests { Term::extractor_for_operator(d.terms, op), Some("eq_term"), "text{} must resolve `{op}` to eq_term (exact hm), not ORE", - d.suffix + d.name ); } // And the payload requires hm for these domains. assert!( Term::term_json_keys(d.terms).contains(&"hm"), "text{} must require the `hm` payload key", - d.suffix + d.name ); } } #[test] - fn domain_by_suffix_finds_declared_suffixes() { + fn domain_by_name_finds_declared_names() { let text = scalar("text"); assert_eq!( - text.domain_by_suffix("_search").map(|d| d.suffix), - Some("_search") + text.domain_by_name("search").map(|d| d.name), + Some("search") ); - assert!(text.domain_by_suffix("_nope").is_none()); + assert!(text.domain_by_name("nope").is_none()); } #[test] @@ -702,7 +702,7 @@ mod catalog_tests { let search = text .domains .iter() - .find(|d| d.suffix == "_search") + .find(|d| d.name == "search") .expect("text must declare a _search domain"); assert_eq!( search.terms, @@ -792,40 +792,39 @@ mod catalog_tests { // the two-domain EQ-ONLY shape (storage + `_eq`), the one-domain // STORAGE-ONLY shape (storage only — encryption-only scalars like // `bool`), or the ORDERED shape plus a `_match` domain (text's Bloom - // containment). This catches accidental drift — a typo'd suffix, a wrong + // containment). This catches accidental drift — a typo'd domain name, a wrong // term, a dropped domain — without hardcoding which token gets which // shape (that is the catalog's job; the matrix dispatch and the inventory // snapshots are shape-aware). Subsumes the old per-type // `_maps_to_*_with_four_domains` / `_domain_terms_match_manifest` tests. let ordered: Vec<(&str, &[Term])> = vec![ ("", &[] as &[Term]), - ("_eq", &[Term::Hm][..]), - ("_ord_ore", &[Term::Ore][..]), - ("_ord", &[Term::Ore][..]), + ("eq", &[Term::Hm][..]), + ("ord_ore", &[Term::Ore][..]), + ("ord", &[Term::Ore][..]), ]; - let eq_only: Vec<(&str, &[Term])> = vec![("", &[] as &[Term]), ("_eq", &[Term::Hm][..])]; + let eq_only: Vec<(&str, &[Term])> = vec![("", &[] as &[Term]), ("eq", &[Term::Hm][..])]; let storage_only: Vec<(&str, &[Term])> = vec![("", &[] as &[Term])]; let ordered_match: Vec<(&str, &[Term])> = vec![ ("", &[] as &[Term]), - ("_eq", &[Term::Hm][..]), - ("_match", &[Term::Bloom][..]), - ("_ord_ore", &[Term::Ore][..]), - ("_ord", &[Term::Ore][..]), + ("eq", &[Term::Hm][..]), + ("match", &[Term::Bloom][..]), + ("ord_ore", &[Term::Ore][..]), + ("ord", &[Term::Ore][..]), ]; // text's current shape: equality is exact on the ordered domains (they // lead with `Hm`), plus a combined `_search` domain carrying all three // terms. `=`/`<>` route through `hm` on every eq-capable text domain. let text_search: Vec<(&str, &[Term])> = vec![ ("", &[] as &[Term]), - ("_eq", &[Term::Hm][..]), - ("_match", &[Term::Bloom][..]), - ("_ord_ore", &[Term::Hm, Term::Ore][..]), - ("_ord", &[Term::Hm, Term::Ore][..]), - ("_search", &[Term::Hm, Term::Ore, Term::Bloom][..]), + ("eq", &[Term::Hm][..]), + ("match", &[Term::Bloom][..]), + ("ord_ore", &[Term::Hm, Term::Ore][..]), + ("ord", &[Term::Hm, Term::Ore][..]), + ("search", &[Term::Hm, Term::Ore, Term::Bloom][..]), ]; for s in CATALOG { - let shape: Vec<(&str, &[Term])> = - s.domains.iter().map(|d| (d.suffix, d.terms)).collect(); + let shape: Vec<(&str, &[Term])> = s.domains.iter().map(|d| (d.name, d.terms)).collect(); assert!( shape == ordered || shape == eq_only @@ -833,7 +832,7 @@ mod catalog_tests { || shape == ordered_match || shape == text_search, "{} has an unrecognised domain shape: {shape:?}", - s.token + s.name ); } } @@ -850,7 +849,7 @@ mod catalog_tests { assert!( !is_eq_only, "{} is unexpectedly eq-only; no catalog type is eq-only currently", - s.token + s.name ); } } @@ -861,13 +860,13 @@ mod catalog_tests { // CATALOG. Replaces the per-type `_maps_to_iNN` / `_rust_type` // restatements. for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let expected = match s.token { + let expected = match s.name { "int2" => ScalarKind::I16, "int4" => ScalarKind::I32, "int8" => ScalarKind::I64, other => panic!("unmapped integer scalar token {other}"), }; - assert_eq!(s.kind, expected, "{} maps to the wrong kind", s.token); + assert_eq!(s.kind, expected, "{} maps to the wrong kind", s.name); } } @@ -889,12 +888,12 @@ mod values_tests { /// `check(&INTx, INTx_VALUES)` line, not a duplicated reference list. Subsumes /// the old per-type `_values_materialise_to_typed_array` references and /// `materialised_values_track_their_fixture_lists`. - fn check>(spec: &ScalarSpec, values: &[T]) { + fn check>(spec: &DomainFamily, values: &[T]) { assert_eq!( values.len(), spec.fixtures.len(), "{}: value count != fixture count", - spec.token + spec.name ); for (i, (v, f)) in values.iter().zip(spec.fixtures).enumerate() { assert_eq!( @@ -902,7 +901,7 @@ mod values_tests { f.numeric_value(spec.kind) .expect("integer scalar fixture resolves to a number"), "{}: value[{i}] does not match resolved fixture {f:?}", - spec.token + spec.name ); } } @@ -999,10 +998,10 @@ mod values_tests { mod float_tests { use crate::*; - fn scalar(token: &str) -> &'static ScalarSpec { + fn scalar(token: &str) -> &'static DomainFamily { CATALOG .iter() - .find(|s| s.token == token) + .find(|s| s.name == token) .unwrap_or_else(|| panic!("{token} missing from CATALOG")) } @@ -1010,8 +1009,8 @@ mod float_tests { fn float_specs_are_in_catalog_with_ordered_shape() { for token in ["float4", "float8"] { let s = scalar(token); - let suffixes: Vec<_> = s.domains.iter().map(|d| d.suffix).collect(); - assert_eq!(suffixes, vec!["", "_eq", "_ord_ore", "_ord"]); + let suffixes: Vec<_> = s.domains.iter().map(|d| d.name).collect(); + assert_eq!(suffixes, vec!["", "eq", "ord_ore", "ord"]); } assert_eq!(scalar("float4").kind, ScalarKind::F32); assert_eq!(scalar("float8").kind, ScalarKind::F64); @@ -1102,9 +1101,9 @@ mod invariant_tests { for d in s.domains { let name = s.domain_name(d); assert!( - name == s.token || name.starts_with(&format!("{}_", s.token)), + name == s.name || name.starts_with(&format!("{}_", s.name)), "{name} does not start with token {}", - s.token + s.name ); } } @@ -1113,7 +1112,7 @@ mod invariant_tests { #[test] fn every_type_has_at_least_one_domain() { for s in CATALOG { - assert!(!s.domains.is_empty(), "{} has no domains", s.token); + assert!(!s.domains.is_empty(), "{} has no domains", s.name); } } @@ -1164,14 +1163,14 @@ mod invariant_tests { assert!( resolved.contains(&bk.min_value()), "{} fixtures missing MIN", - s.token + s.name ); assert!( resolved.contains(&bk.max_value()), "{} fixtures missing MAX", - s.token + s.name ); - assert!(resolved.contains(&0), "{} fixtures missing zero", s.token); + assert!(resolved.contains(&0), "{} fixtures missing zero", s.name); } } @@ -1181,7 +1180,7 @@ mod invariant_tests { let mut seen: HashMap = HashMap::new(); for f in s.fixtures { if let Some(prev) = seen.insert(distinct_key(*f, s.kind), *f) { - panic!("{}: {f:?} duplicates {prev:?}", s.token); + panic!("{}: {f:?} duplicates {prev:?}", s.name); } } } @@ -1225,7 +1224,7 @@ mod invariant_tests { assert!( n >= lo && n <= hi, "{}: fixture {f:?} resolves to {n}, out of range [{lo}, {hi}]", - s.token + s.name ); } } @@ -1234,7 +1233,7 @@ mod invariant_tests { #[test] fn helper_outputs_match_for_known_domains() { // Cross-check the Term helpers against a known domain shape on int4. - let s = CATALOG.iter().find(|s| s.token == "int4").unwrap(); + let s = CATALOG.iter().find(|s| s.name == "int4").unwrap(); // storage domain: no terms. assert_eq!(Term::role_for_terms(s.domains[0].terms), Role::Storage); assert!(Term::operators_for_terms(s.domains[0].terms).is_empty()); diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index a722dc86a..c072a4609 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -58,10 +58,10 @@ impl Parse for ScalarEntry { /// The `eql-domains::CATALOG` row for `token`, or a hard panic at macro-expansion /// time if the token is unknown — a dispatch-list entry must name a catalog type. -fn spec_for_token(token: &str) -> &'static eql_domains::ScalarSpec { +fn spec_for_token(token: &str) -> &'static eql_domains::DomainFamily { eql_domains::CATALOG .iter() - .find(|s| s.token == token) + .find(|s| s.name == token) .unwrap_or_else(|| panic!("scalar token `{token}` not in eql-domains::CATALOG")) } @@ -140,7 +140,7 @@ fn has_search_token(token: &str) -> bool { spec_for_token(token) .domains .iter() - .any(|d| d.suffix == "_search") + .any(|d| d.name == "search") } /// The comma-separated list (optional trailing comma). diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index dec932181..8b68b0bfb 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -20,7 +20,7 @@ needs and is fully self-contained (CI gates this — see §6). The whole SQL surface is **generated** from a single Rust source of truth: the `CATALOG` const in [`crates/eql-domains/src/lib.rs`](../../crates/eql-domains/src/lib.rs), rendered by the [`eql-codegen`](../../crates/eql-codegen/) crate. There is no -TOML manifest and no Python — adding a type is adding one `ScalarSpec` row, +TOML manifest and no Python — adding a type is adding one `DomainFamily` row, validated by the compiler plus catalog `#[test]`s. The reference type is `eql_v3.int4`; `eql_v3.text` is the worked non-integer example (ordered + equality + a `match` capability via the `Bloom` term); `eql_v3.bool` is the @@ -34,7 +34,7 @@ materializer (see §7). To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): -1. **Add a `ScalarSpec` row to `eql_domains::CATALOG`** — `token`, `kind`, +1. **Add a `DomainFamily` row to `eql_domains::CATALOG`** — `name`, `kind`, `domains`, `fixtures` (§2). If the type needs a new scalar width, add a `ScalarKind` variant first; if it needs new term behaviour, that goes in the `Term` enum's `impl`, never in catalog data. @@ -72,20 +72,20 @@ Hand-written SQL beyond the fixed surface goes in --- -## 2. The catalog row (`ScalarSpec`) +## 2. The catalog row (`DomainFamily`) -A scalar type is one `ScalarSpec` row in +A scalar type is one `DomainFamily` row in [`crates/eql-domains/src/lib.rs`](../../crates/eql-domains/src/lib.rs): ```rust -ScalarSpec { - token: "int4", +DomainFamily { + name: "int4", kind: ScalarKind::I32, domains: &[ - DomainSpec { suffix: "", terms: &[] }, - DomainSpec { suffix: "_eq", terms: &[Term::Hm] }, - DomainSpec { suffix: "_ord_ore", terms: &[Term::Ore] }, - DomainSpec { suffix: "_ord", terms: &[Term::Ore] }, + Domain { name: "", terms: &[] }, + Domain { name: "eq", terms: &[Term::Hm] }, + Domain { name: "ord_ore", terms: &[Term::Ore] }, + Domain { name: "ord", terms: &[Term::Ore] }, ], fixtures: INT4_FIXTURES, } @@ -94,8 +94,10 @@ ScalarSpec { The fields, all enforced by the type system and the catalog `#[test]`s rather than a runtime validator: -- **`token`** — the type token (`int4`); supplies `` everywhere. Each - domain's full name is `token` + `suffix` (`ScalarSpec::domain_name`), pinned by +- **`name`** — the type name (`int4`); supplies `` everywhere. Each domain's + full name is the family `name` + `_` + the domain `name` + (`DomainFamily::domain_name`); codegen owns the `_` join (`Domain::full_name`), + and an empty domain `name` yields the bare family name. Pinned by `every_domain_name_starts_with_its_token`. - **`kind`** — a `ScalarKind` (`I16` / `I32` / `I64` / `Numeric` / `Text` / `Jsonb` / `Date` / `Timestamptz`), carrying the Rust type name. Only the @@ -110,10 +112,10 @@ than a runtime validator: `BoundedIntKind` variant** (rust-type name, `MIN`/`MAX`/zero symbols, bounds) plus its `ScalarKind` variant and `as_bounded_int` arm, with unit tests over the `impl` methods. -- **`domains`** — a non-empty `&[DomainSpec]` (pinned by - `every_type_has_at_least_one_domain`), each a `suffix` + the fixed `&[Term]` it - carries. The storage domain is `suffix: ""` with no terms; `_eq => [Term::Hm]`; - `_ord` and `_ord_ore => [Term::Ore]`. A `DomainSpec` declares nothing else — no +- **`domains`** — a non-empty `&[Domain]` (pinned by + `every_type_has_at_least_one_domain`), each a bare `name` + the fixed `&[Term]` it + carries. The storage domain is `name: ""` with no terms; `eq => [Term::Hm]`; + `ord` and `ord_ore => [Term::Ore]`. A `Domain` declares nothing else — no extractor names, no operator lists, no REQUIRE edges. Every behavioural fact comes from the `Term` enum. - **`fixtures`** — the type's plaintext fixture list (see below). @@ -739,11 +741,11 @@ preserved by the name patterns.) Stages, in order (`generate_all` → `generate_type`): 1. **Read the catalog.** `eql_domains::CATALOG` is the in-binary source of truth - — a `&[ScalarSpec]`. There is no parse/validate stage at generation time: the + — a `&[DomainFamily]`. There is no parse/validate stage at generation time: the catalog is validated at compile time (an undefined `Term` or unknown `ScalarKind` does not compile) and by the catalog `#[test]`s, so the data is already well-formed by the time `generate_all` runs. -2. **Resolve terms.** For each `DomainSpec`, the `Term` enum's `impl` methods +2. **Resolve terms.** For each `Domain`, the `Term` enum's `impl` methods supply the extractor name, return type, JSON envelope key, supported operators, and the SQL `-- REQUIRE:` edges those terms imply (`Term::operators_for_terms`, `term_json_keys`, `term_requires`, @@ -876,8 +878,8 @@ deliberately offers no search surface at all. What makes it storage-only: - **One term-less domain.** Its catalog row uses `STORAGE_ONLY_DOMAINS` — a - single `DomainSpec { suffix: "", terms: &[] }`. No `_eq`, no `_ord`, no SEM - index term. `ScalarSpec::is_storage_only()` recognises this shape (a single + single `Domain { name: "", terms: &[] }`. No `_eq`, no `_ord`, no SEM + index term. `DomainFamily::is_storage_only()` recognises this shape (a single term-less storage domain); it is *also* `is_eq_only()` (no `_ord`), so the harness checks storage-only **first**. - **Generator: no changes needed.** The SQL generator already handles a diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index e3aa3e180..ca5742cb0 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1129,8 +1129,8 @@ impl Variant { pub fn terms_for(self, token: &str) -> &'static [Term] { CATALOG .iter() - .find(|s| s.token == token) - .and_then(|s| s.domain_by_suffix(self.suffix())) + .find(|s| s.name == token) + .and_then(|s| s.domain_by_name(self.suffix().trim_start_matches('_'))) .map(|d| d.terms) .unwrap_or_else(|| { panic!( @@ -1146,8 +1146,8 @@ impl Variant { pub fn is_declared_for(self, token: &str) -> bool { CATALOG .iter() - .find(|s| s.token == token) - .and_then(|s| s.domain_by_suffix(self.suffix())) + .find(|s| s.name == token) + .and_then(|s| s.domain_by_name(self.suffix().trim_start_matches('_'))) .is_some() } @@ -1315,20 +1315,20 @@ combos with distinct dom_names", pub fn token_has_bloom_term(token: &str) -> bool { CATALOG .iter() - .find(|s| s.token == token) + .find(|s| s.name == token) .map(|s| s.domains.iter().any(|d| d.terms.contains(&Term::Bloom))) .unwrap_or(false) } /// True when scalar `token` is **storage-only / encryption-only** (a single /// term-less domain, no `_eq`/`_ord`/`_match`) — e.g. `bool`. Catalog-derived -/// via `ScalarSpec::is_storage_only`. Such a type's fixture is encrypted with no +/// via `DomainFamily::is_storage_only`. Such a type's fixture is encrypted with no /// search index, so its payload carries only `{v,i,c}` (no `hm`/`ob`/`bf`); the /// fixture-shape assertions branch on this. pub fn token_is_storage_only(token: &str) -> bool { CATALOG .iter() - .find(|s| s.token == token) + .find(|s| s.name == token) .map(|s| s.is_storage_only()) .unwrap_or(false) } @@ -1548,18 +1548,18 @@ mod catalog_resolution_tests { let suffix = variant.suffix(); // A variant is instantiated for a token iff that token declares // the suffix; only assert those pairs. - if let Some(d) = spec.domain_by_suffix(suffix) { + if let Some(d) = spec.domain_by_name(suffix.trim_start_matches('_')) { assert!( - variant.is_declared_for(spec.token), + variant.is_declared_for(spec.name), "{}{} declared in CATALOG but is_declared_for is false", - spec.token, + spec.name, suffix ); assert_eq!( - variant.terms_for(spec.token), + variant.terms_for(spec.name), d.terms, "{}{} term set drift between Variant and CATALOG", - spec.token, + spec.name, suffix ); } @@ -1695,8 +1695,8 @@ mod oracle_inventory_tests { // no `_ord` domain and must short-circuit to false, not panic. let ordered: Vec<&str> = CATALOG .iter() - .filter(|s| Variant::Ord.is_declared_for(s.token) && Variant::Ord.supports_ord(s.token)) - .map(|s| s.token) + .filter(|s| Variant::Ord.is_declared_for(s.name) && Variant::Ord.supports_ord(s.name)) + .map(|s| s.name) .collect(); assert_eq!( ordered, @@ -1729,8 +1729,8 @@ mod oracle_inventory_tests { // scalar with no `_ord` domain (bool), so short-circuit first. let ordered: Vec<&str> = CATALOG .iter() - .filter(|s| Variant::Ord.is_declared_for(s.token) && Variant::Ord.supports_ord(s.token)) - .map(|s| s.token) + .filter(|s| Variant::Ord.is_declared_for(s.name) && Variant::Ord.supports_ord(s.name)) + .map(|s| s.name) .collect(); // Keep in lockstep with the fixture_oracle_suite! / e2e_oracle_suite! // instantiation lists. diff --git a/tests/sqlx/src/scalar_types.rs b/tests/sqlx/src/scalar_types.rs index 623adc2e1..b92e7aaaa 100644 --- a/tests/sqlx/src/scalar_types.rs +++ b/tests/sqlx/src/scalar_types.rs @@ -7,7 +7,7 @@ //! `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3). The entry //! carries no shape marker: whether a type is temporal (chrono-backed) or //! equality-only is read from its `eql-domains::CATALOG` row -//! (`ScalarKind::is_temporal()` / `ScalarSpec::is_eq_only()`). A temporal +//! (`ScalarKind::is_temporal()` / `DomainFamily::is_eq_only()`). A temporal //! scalar generates its `impl ScalarType` via `temporal_values!` in //! `scalar_domains.rs` and gets pivot-presence fixture asserts instead of the //! integer signed-extreme ones. diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index b4a0b9496..1e0599ce2 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -123,7 +123,7 @@ async fn placeholder_payload_casts_to_every_declared_domain(pool: PgPool) -> Res use eql_domains::CATALOG; for spec in CATALOG { for domain in spec.domains { - let sql_domain = format!("eql_v3.{}{}", spec.token, domain.suffix); + let sql_domain = format!("eql_v3.{}", spec.domain_name(domain)); let sql = format!("SELECT $1::jsonb::{sql_domain}"); sqlx::query(&sql) .bind(PLACEHOLDER_PAYLOAD) diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index eeb2409fe..130baf991 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -27,8 +27,8 @@ eql_tests::scalar_types!(fixture_dispatch); async fn generate_all() -> anyhow::Result<()> { let mut generated = 0usize; for spec in CATALOG { - eprintln!("Generating fixture eql_v3_{}...", spec.token); - generate_for_token(spec.token).await?; + eprintln!("Generating fixture eql_v3_{}...", spec.name); + generate_for_token(spec.name).await?; generated += 1; } assert!(generated > 0, "CATALOG is empty — nothing to generate"); From 697fa611b87b5f7062d34a3a56028090a37fdaf1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 11:03:01 +1000 Subject: [PATCH 368/599] refactor: finish catalog clarity (family_name, pay down suffix bridge) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the PR 2 catalog rename, completing the items the plan left as optional/deferred: - Rename the codegen-internal `token` parameter/field to `family_name` throughout (context.rs structs, generate.rs helpers, the four .j2 templates, test locals). Template values still substitute spec.name, so generated SQL is byte-identical (codegen:parity OK). - Pay down the accepted deferred debt in the SQLx harness: add Variant::name() returning the bare catalog key and drop the three suffix().trim_start_matches('_') bridges in favour of direct domain_by_name(variant.name()) lookups. - Add a committed dump.rs #[test] pinning the hand-re-derived `suffix` wire field ("", _eq, _ord_ore, _ord) — the one channel no other gate reads. - Doc/comment vocabulary touch-ups (CLAUDE.md, DEVELOPMENT.md, lib.rs, mise.toml, adding-a-scalar reference). Behavior-preserving: codegen:parity, types:check, test:matrix:inventory, test:crates all green. --- CLAUDE.md | 2 +- DEVELOPMENT.md | 2 +- crates/eql-codegen/src/context.rs | 12 +-- crates/eql-codegen/src/dump.rs | 17 +++ crates/eql-codegen/src/generate.rs | 102 +++++++++--------- .../eql-codegen/templates/aggregates.sql.j2 | 2 +- crates/eql-codegen/templates/functions.sql.j2 | 2 +- crates/eql-codegen/templates/operators.sql.j2 | 2 +- crates/eql-codegen/templates/types.sql.j2 | 4 +- crates/eql-domains/src/lib.rs | 3 +- crates/eql-domains/src/tests.rs | 56 ++++++---- .../adding-a-scalar-encrypted-domain-type.md | 2 +- mise.toml | 2 +- tests/sqlx/src/scalar_domains.rs | 20 +++- 14 files changed, 133 insertions(+), 95 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2b90eba7c..2023eab47 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,7 +74,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `DomainFamily` giving the type `name` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `Domain`s mapping each generated (bare) domain name to its fixed index `Term`s (`eq => [Hm]`, `ord`/`ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are gitignored and never committed. The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` is out of scope for this scalar materializer. -**Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the token, kind, domain suffixes, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-domains/src` with tests, not in free-form catalog data. +**Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the name, kind, bare domain names, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-domains/src` with tests, not in free-form catalog data. Regeneration is deterministic: an identical `CATALOG` produces byte-identical SQL. If `mise run build` produces unexpected output, the change is in `crates/eql-domains/src` (the catalog/terms) or `crates/eql-codegen/src` (the renderers) — not in random run-to-run variation. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index ced04c4aa..b4dc112d2 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -338,7 +338,7 @@ regenerate the SQL surface. Follow the reference guide: [`docs/reference/adding-a-scalar-encrypted-domain-type.md`](./docs/reference/adding-a-scalar-encrypted-domain-type.md). The mechanics are fixed for ordered scalar domains; the catalog row only -declares the token, kind, domain suffixes, and terms. +declares the name, kind, bare domain names, and terms. A few footguns the generator exists to prevent — worth knowing when reading the output: diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 2df23d725..b23caafee 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -68,14 +68,14 @@ pub struct DomainBlock { #[derive(serde::Serialize)] pub struct TypesContext { - pub token: String, + pub family_name: String, pub domains: Vec, } /// Build the per-domain block data (port of `render_domain_block`'s value logic, /// minus comment prose and the CHECK skeleton — those are template-resident). -pub fn domain_block(token: &str, domain: &Domain) -> DomainBlock { - let name = domain.full_name(token); +pub fn domain_block(family_name: &str, domain: &Domain) -> DomainBlock { + let name = domain.full_name(family_name); let mut keys: Vec = ENVELOPE_KEYS.iter().map(|k| sql_str(k)).collect(); for k in Term::term_json_keys(domain.terms) { @@ -134,7 +134,7 @@ pub enum FnEntry { #[derive(serde::Serialize)] pub struct FunctionsContext { pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:" - pub token: String, + pub family_name: String, pub name: String, // full domain name (family-name + "_" + domain-name) pub dom: String, // schema-qualified domain, e.g. eql_v3.int4_eq pub domain_lit: String, // sql_str(dom), defensively escaped for the RAISE literal @@ -209,7 +209,7 @@ pub struct OpEntry { #[derive(serde::Serialize)] pub struct OperatorsContext { pub requires: Vec, - pub token: String, + pub family_name: String, pub name: String, pub dom: String, pub operators: Vec, @@ -236,7 +236,7 @@ pub fn operator_entry(op: &Operator, leftarg: &str, rightarg: &str, supported: b #[derive(serde::Serialize)] pub struct AggregatesContext { pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:" - pub token: String, + pub family_name: String, pub name: String, pub dom: String, // schema-qualified domain, hoisted pub aggregates: &'static [AggregateOp], // == AGGREGATE_OPS diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index a68e80682..dd7d3ef37 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -101,6 +101,23 @@ mod tests { assert_eq!(ord.supported_ops, ["=", "<>", "<", "<=", ">", ">="]); } + /// Pins the hand-re-derived `suffix` wire field — the one channel with no + /// other automated reader — so its underscore-prefixed values stay + /// byte-stable after the catalog dropped the leading underscore from its + /// stored (now bare) domain names. + #[test] + fn int4_suffix_field_is_underscore_prefixed() { + let dump = dump_catalog(); + let int4 = dump + .types + .iter() + .find(|t| t.token == "int4") + .expect("int4 present in catalog"); + + let suffixes: Vec<&str> = int4.domains.iter().map(|d| d.suffix.as_str()).collect(); + assert_eq!(suffixes, ["", "_eq", "_ord_ore", "_ord"]); + } + #[test] fn timestamptz_is_ordered() { // timestamptz was promoted to the ordered shape once diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 58d97464a..dfa60a4e0 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -11,14 +11,14 @@ use crate::operator_surface::OPERATORS; const V3_SCHEMA: &str = "src/v3/schema.sql"; /// REQUIRE edge for the hand-written shared blocker helper. const V3_SCALARS_BLOCKER: &str = "src/v3/scalars/functions.sql"; -/// Root of the generated per-token scalar surface. The single place the tree +/// Root of the generated per-type scalar surface. The single place the tree /// layout is spelled out — keeps `types_path`/`scalar_path` and the REQUIRE /// vecs from drifting if the surface ever relocates again. const V3_SCALARS_DIR: &str = "src/v3/scalars"; -/// REQUIRE path for a generated file `file` under a token's scalar dir. -fn scalar_path(token: &str, file: &str) -> String { - format!("{V3_SCALARS_DIR}/{token}/{file}") +/// REQUIRE path for a generated file `file` under a family's scalar dir. +fn scalar_path(family_name: &str, file: &str) -> String { + format!("{V3_SCALARS_DIR}/{family_name}/{file}") } /// The second-parameter name for an operator's generated signature. The `->` and @@ -33,8 +33,8 @@ fn arg_b_name(symbol: &str) -> &'static str { } /// REQUIRE path for a type's _types.sql. Port of `_types_path`. -fn types_path(token: &str) -> String { - scalar_path(token, &format!("{token}_types.sql")) +fn types_path(family_name: &str) -> String { + scalar_path(family_name, &format!("{family_name}_types.sql")) } /// Body for _types.sql: every domain in one idempotent DO block. @@ -42,7 +42,7 @@ fn types_path(token: &str) -> String { pub fn render_types_file(spec: &DomainFamily) -> String { use crate::context::{domain_block, environment, TypesContext}; let ctx = TypesContext { - token: spec.name.to_string(), + family_name: spec.name.to_string(), domains: spec .domains .iter() @@ -57,10 +57,10 @@ pub fn render_types_file(spec: &DomainFamily) -> String { } /// REQUIRE edges for a domain's _functions.sql. Port of `_functions_requires`. -fn functions_requires(token: &str, terms: &[Term]) -> Vec { +fn functions_requires(family_name: &str, terms: &[Term]) -> Vec { let mut reqs = vec![ V3_SCHEMA.to_string(), - types_path(token), + types_path(family_name), V3_SCALARS_BLOCKER.to_string(), ]; for extra in Term::term_requires(terms) { @@ -72,12 +72,12 @@ fn functions_requires(token: &str, terms: &[Term]) -> Vec { } /// Body for a domain's _functions.sql. Port of `render_functions_file`. -pub fn render_functions_file(token: &str, domain: &Domain) -> String { +pub fn render_functions_file(family_name: &str, domain: &Domain) -> String { use crate::consts::sql_str; use crate::context::{ environment, extractor_entry, unsupported_entry, wrapper_entry, FunctionsContext, SqlParam, }; - let name = domain.full_name(token); + let name = domain.full_name(family_name); let dom = domain_name(&name); let domain_lit = sql_str(&dom); let supported = Term::operators_for_terms(domain.terms); @@ -112,8 +112,8 @@ pub fn render_functions_file(token: &str, domain: &Domain) -> String { } let ctx = FunctionsContext { - requires: functions_requires(token, domain.terms), - token: token.to_string(), + requires: functions_requires(family_name, domain.terms), + family_name: family_name.to_string(), name, dom, domain_lit, @@ -127,9 +127,9 @@ pub fn render_functions_file(token: &str, domain: &Domain) -> String { } /// Body for a domain's _operators.sql. Port of `render_operators_file`. -pub fn render_operators_file(token: &str, domain: &Domain) -> String { +pub fn render_operators_file(family_name: &str, domain: &Domain) -> String { use crate::context::{environment, operator_entry, OperatorsContext}; - let name = domain.full_name(token); + let name = domain.full_name(family_name); let dom = domain_name(&name); let supported = Term::operators_for_terms(domain.terms); let is_supported = |op: &str| supported.contains(&op); @@ -152,10 +152,10 @@ pub fn render_operators_file(token: &str, domain: &Domain) -> String { let ctx = OperatorsContext { requires: vec![ V3_SCHEMA.to_string(), - types_path(token), - scalar_path(token, &format!("{name}_functions.sql")), + types_path(family_name), + scalar_path(family_name, &format!("{name}_functions.sql")), ], - token: token.to_string(), + family_name: family_name.to_string(), name, dom, operators, @@ -169,21 +169,21 @@ pub fn render_operators_file(token: &str, domain: &Domain) -> String { /// Body for a domain's _aggregates.sql, or None if not ord-capable. /// Port of `render_aggregates_file`. -pub fn render_aggregates_file(token: &str, domain: &Domain) -> Option { +pub fn render_aggregates_file(family_name: &str, domain: &Domain) -> Option { use crate::context::{environment, AggregatesContext, AGGREGATE_OPS}; if !is_ord_capable(domain.terms) { return None; } - let name = domain.full_name(token); + let name = domain.full_name(family_name); let dom = domain_name(&name); let ctx = AggregatesContext { requires: vec![ V3_SCHEMA.to_string(), - types_path(token), - scalar_path(token, &format!("{name}_functions.sql")), - scalar_path(token, &format!("{name}_operators.sql")), + types_path(family_name), + scalar_path(family_name, &format!("{name}_functions.sql")), + scalar_path(family_name, &format!("{name}_operators.sql")), ], - token: token.to_string(), + family_name: family_name.to_string(), name, dom, // hoisted: one copy, template reads {{ dom }} aggregates: AGGREGATE_OPS, // iterate the const directly (no per-entry wrapper) @@ -204,10 +204,10 @@ use crate::writer::{ /// Regenerate every generated file for one type into `out_dir`. /// Port of `generate_type`. Returns the written paths. pub fn generate_type(spec: &DomainFamily, out_dir: &Path) -> Result, WriteError> { - let token = spec.name; - let mut targets = vec![out_dir.join(format!("{token}_types.sql"))]; + let family_name = spec.name; + let mut targets = vec![out_dir.join(format!("{family_name}_types.sql"))]; for d in spec.domains { - let name = d.full_name(token); + let name = d.full_name(family_name); targets.push(out_dir.join(format!("{name}_functions.sql"))); targets.push(out_dir.join(format!("{name}_operators.sql"))); if is_ord_capable(d.terms) { @@ -219,21 +219,21 @@ pub fn generate_type(spec: &DomainFamily, out_dir: &Path) -> Result let mut written: Vec = Vec::new(); - let types_path = out_dir.join(format!("{token}_types.sql")); + let types_path = out_dir.join(format!("{family_name}_types.sql")); write_generated_file(&types_path, &render_types_file(spec))?; written.push(types_path); for d in spec.domains { - let name = d.full_name(token); + let name = d.full_name(family_name); let fn_path = out_dir.join(format!("{name}_functions.sql")); - write_generated_file(&fn_path, &render_functions_file(token, d))?; + write_generated_file(&fn_path, &render_functions_file(family_name, d))?; written.push(fn_path); let op_path = out_dir.join(format!("{name}_operators.sql")); - write_generated_file(&op_path, &render_operators_file(token, d))?; + write_generated_file(&op_path, &render_operators_file(family_name, d))?; written.push(op_path); - if let Some(agg) = render_aggregates_file(token, d) { + if let Some(agg) = render_aggregates_file(family_name, d) { let agg_path = out_dir.join(format!("{name}_aggregates.sql")); write_generated_file(&agg_path, &agg)?; written.push(agg_path); @@ -248,22 +248,18 @@ pub fn generate_type(spec: &DomainFamily, out_dir: &Path) -> Result /// (`eql_domains::INT4_VALUES` / `INT2_VALUES`), read directly by the SQLx tests. pub fn generate_all(out_root: &Path) -> Result { for spec in eql_domains::CATALOG { - let token = spec.name; - let out_dir = out_root.join(V3_SCALARS_DIR).join(token); + let family_name = spec.name; + let out_dir = out_root.join(V3_SCALARS_DIR).join(family_name); let written = generate_type(spec, &out_dir)?; for p in &written { let rel = p.strip_prefix(out_root).unwrap_or(p); println!("generated {}", rel.display()); } - println!("generated {} files for {token}", written.len()); - } - let tokens: Vec<&str> = eql_domains::CATALOG.iter().map(|s| s.name).collect(); - println!( - "codegen: ok ({} types: {})", - tokens.len(), - tokens.join(", ") - ); + println!("generated {} files for {family_name}", written.len()); + } + let names: Vec<&str> = eql_domains::CATALOG.iter().map(|s| s.name).collect(); + println!("codegen: ok ({} types: {})", names.len(), names.join(", ")); Ok(0) } @@ -272,11 +268,11 @@ mod tests { use super::*; use eql_domains::CATALOG; - fn spec(token: &str) -> &'static DomainFamily { + fn spec(family_name: &str) -> &'static DomainFamily { CATALOG .iter() - .find(|s| s.name == token) - .expect("catalog token") + .find(|s| s.name == family_name) + .expect("catalog family") } fn domain<'a>(spec: &'a DomainFamily, name: &str) -> &'a Domain { @@ -305,20 +301,20 @@ mod tests { out } - fn rendered_for(token: &str, name: &str, spec: &DomainFamily) -> String { - if name == format!("{token}_types.sql") { + fn rendered_for(family_name: &str, name: &str, spec: &DomainFamily) -> String { + if name == format!("{family_name}_types.sql") { return render_types_file(spec); } for d in spec.domains { - let full = d.full_name(token); + let full = d.full_name(family_name); if name == format!("{full}_functions.sql") { - return render_functions_file(token, d); + return render_functions_file(family_name, d); } if name == format!("{full}_operators.sql") { - return render_operators_file(token, d); + return render_operators_file(family_name, d); } if name == format!("{full}_aggregates.sql") { - return render_aggregates_file(token, d) + return render_aggregates_file(family_name, d) .expect("reference exists but generator skipped (not ord-capable)"); } } @@ -577,8 +573,8 @@ mod tests { fn inlinable_functions_have_no_set_search_path() { let s = spec("int4"); // Extractors and wrappers (eq/ord functions files) are inlinable SQL. - for suffix in ["eq", "ord"] { - let sql = render_functions_file("int4", domain(s, suffix)); + for name in ["eq", "ord"] { + let sql = render_functions_file("int4", domain(s, name)); // Inlinable rows are the LANGUAGE sql ones; none may pin search_path. for block in sql.split("CREATE FUNCTION").skip(1) { if block.contains("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") { diff --git a/crates/eql-codegen/templates/aggregates.sql.j2 b/crates/eql-codegen/templates/aggregates.sql.j2 index d85ab2830..95d131fc3 100644 --- a/crates/eql-codegen/templates/aggregates.sql.j2 +++ b/crates/eql-codegen/templates/aggregates.sql.j2 @@ -2,7 +2,7 @@ {% for r in requires -%} -- REQUIRE: {{ r }} {% endfor %} ---! @file encrypted_domain/{{ token }}/{{ name }}_aggregates.sql +--! @file encrypted_domain/{{ family_name }}/{{ name }}_aggregates.sql --! @brief Aggregates for {{ dom }}. {% for a in aggregates %} --! @brief State function for {{ a.name }} on {{ dom }}. diff --git a/crates/eql-codegen/templates/functions.sql.j2 b/crates/eql-codegen/templates/functions.sql.j2 index ba4f3a020..69c53f836 100644 --- a/crates/eql-codegen/templates/functions.sql.j2 +++ b/crates/eql-codegen/templates/functions.sql.j2 @@ -2,7 +2,7 @@ {% for r in requires -%} -- REQUIRE: {{ r }} {% endfor %} ---! @file encrypted_domain/{{ token }}/{{ name }}_functions.sql +--! @file encrypted_domain/{{ family_name }}/{{ name }}_functions.sql --! @brief Functions for {{ dom }}. {% for e in entries %} {% include "functions/" ~ e.kind|lower ~ ".sql.j2" -%} diff --git a/crates/eql-codegen/templates/operators.sql.j2 b/crates/eql-codegen/templates/operators.sql.j2 index bb33ff528..3c5460813 100644 --- a/crates/eql-codegen/templates/operators.sql.j2 +++ b/crates/eql-codegen/templates/operators.sql.j2 @@ -2,7 +2,7 @@ {% for r in requires -%} -- REQUIRE: {{ r }} {% endfor %} ---! @file encrypted_domain/{{ token }}/{{ name }}_operators.sql +--! @file encrypted_domain/{{ family_name }}/{{ name }}_operators.sql --! @brief Operators for {{ dom }}. {% for o in operators %} CREATE OPERATOR {{ o.symbol }} ( diff --git a/crates/eql-codegen/templates/types.sql.j2 b/crates/eql-codegen/templates/types.sql.j2 index b6deb4bde..8f87a21a9 100644 --- a/crates/eql-codegen/templates/types.sql.j2 +++ b/crates/eql-codegen/templates/types.sql.j2 @@ -1,8 +1,8 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/{{ token }}/{{ token }}_types.sql ---! @brief Encrypted-domain types for {{ token }}. +--! @file v3/scalars/{{ family_name }}/{{ family_name }}_types.sql +--! @brief Encrypted-domain types for {{ family_name }}. DO $$ BEGIN diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index 6c3494868..f49e05943 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -206,7 +206,8 @@ pub struct Domain { } /// A scalar encrypted-domain type: its SQL `name`, native Rust type, generated -/// domains, and fixture plaintext list. The Rust analogue of one `*.toml`. +/// domains, and fixture plaintext list. One row of the Rust `CATALOG` — the +/// source of truth for the type (there is no TOML manifest). /// (`domain_name`/`is_eq_only` are impl'd in `spec`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct DomainFamily { diff --git a/crates/eql-domains/src/tests.rs b/crates/eql-domains/src/tests.rs index be5cfa34f..70b53e429 100644 --- a/crates/eql-domains/src/tests.rs +++ b/crates/eql-domains/src/tests.rs @@ -635,11 +635,8 @@ mod catalog_tests { fn text_spec_is_in_catalog() { let text = scalar("text"); assert_eq!(text.kind, ScalarKind::Text); - let suffixes: Vec<_> = text.domains.iter().map(|d| d.name).collect(); - assert_eq!( - suffixes, - vec!["", "eq", "match", "ord_ore", "ord", "search"] - ); + let names: Vec<_> = text.domains.iter().map(|d| d.name).collect(); + assert_eq!(names, vec!["", "eq", "match", "ord_ore", "ord", "search"]); } #[test] @@ -1007,10 +1004,10 @@ mod float_tests { #[test] fn float_specs_are_in_catalog_with_ordered_shape() { - for token in ["float4", "float8"] { - let s = scalar(token); - let suffixes: Vec<_> = s.domains.iter().map(|d| d.name).collect(); - assert_eq!(suffixes, vec!["", "eq", "ord_ore", "ord"]); + for family_name in ["float4", "float8"] { + let s = scalar(family_name); + let names: Vec<_> = s.domains.iter().map(|d| d.name).collect(); + assert_eq!(names, vec!["", "eq", "ord_ore", "ord"]); } assert_eq!(scalar("float4").kind, ScalarKind::F32); assert_eq!(scalar("float8").kind, ScalarKind::F64); @@ -1038,29 +1035,38 @@ mod float_tests { /// ±Inf MUST be present (the boundary pivots). #[test] fn float_fixtures_exclude_nan_and_negative_zero_and_include_infinities() { - for token in ["float4", "float8"] { - let s = scalar(token); + for family_name in ["float4", "float8"] { + let s = scalar(family_name); let strings: Vec<&str> = s .fixtures .iter() .map(|f| match f { Fixture::Float(v) => *v, - other => panic!("{token} fixture must be Fixture::Float, got {other:?}"), + other => panic!("{family_name} fixture must be Fixture::Float, got {other:?}"), }) .collect(); for v in &strings { let parsed: f64 = v .parse() - .unwrap_or_else(|_| panic!("{token} fixture {v:?} must parse as f64")); - assert!(!parsed.is_nan(), "{token} fixture {v:?} is NaN"); + .unwrap_or_else(|_| panic!("{family_name} fixture {v:?} must parse as f64")); + assert!(!parsed.is_nan(), "{family_name} fixture {v:?} is NaN"); assert!( !(parsed == 0.0 && parsed.is_sign_negative()), - "{token} fixture {v:?} is -0.0" + "{family_name} fixture {v:?} is -0.0" ); } - assert!(strings.contains(&"inf"), "{token} must include +inf pivot"); - assert!(strings.contains(&"-inf"), "{token} must include -inf pivot"); - assert!(strings.contains(&"0"), "{token} must include 0 (origin)"); + assert!( + strings.contains(&"inf"), + "{family_name} must include +inf pivot" + ); + assert!( + strings.contains(&"-inf"), + "{family_name} must include -inf pivot" + ); + assert!( + strings.contains(&"0"), + "{family_name} must include 0 (origin)" + ); } } @@ -1069,8 +1075,8 @@ mod float_tests { /// fetch_fixture_payload's fetch_one). #[test] fn float_fixtures_are_distinct_by_value() { - for token in ["float4", "float8"] { - let s = scalar(token); + for family_name in ["float4", "float8"] { + let s = scalar(family_name); let parsed: Vec = s .fixtures .iter() @@ -1086,7 +1092,11 @@ mod float_tests { let mut sorted = parsed.clone(); sorted.sort_unstable(); sorted.dedup(); - assert_eq!(sorted.len(), parsed.len(), "{token} has duplicate fixtures"); + assert_eq!( + sorted.len(), + parsed.len(), + "{family_name} has duplicate fixtures" + ); } } } @@ -1096,13 +1106,13 @@ mod invariant_tests { use std::collections::HashMap; #[test] - fn every_domain_name_starts_with_its_token() { + fn every_domain_name_starts_with_its_family_name() { for s in CATALOG { for d in s.domains { let name = s.domain_name(d); assert!( name == s.name || name.starts_with(&format!("{}_", s.name)), - "{name} does not start with token {}", + "{name} does not start with family name {}", s.name ); } diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 8b68b0bfb..52725b209 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -98,7 +98,7 @@ than a runtime validator: full name is the family `name` + `_` + the domain `name` (`DomainFamily::domain_name`); codegen owns the `_` join (`Domain::full_name`), and an empty domain `name` yields the bare family name. Pinned by - `every_domain_name_starts_with_its_token`. + `every_domain_name_starts_with_its_family_name`. - **`kind`** — a `ScalarKind` (`I16` / `I32` / `I64` / `Numeric` / `Text` / `Jsonb` / `Date` / `Timestamptz`), carrying the Rust type name. Only the integer kinds have an diff --git a/mise.toml b/mise.toml index f9bda93f6..0e4acfa31 100644 --- a/mise.toml +++ b/mise.toml @@ -529,7 +529,7 @@ run = """ # Forward catalog-coverage: for each scalar type in the catalog, every domain # the catalog declares for it must have at least one matrix test name. FINER # than test:matrix:inventory (which reconciles only TYPES against list-types): -# a DomainSpec added to a catalog row without matrix wiring passes the type +# a Domain added to a catalog row without matrix wiring passes the type # inventory but fails here. Domain granularity only (Stage 1); per-operator # execution coverage is the Stage 4 matcher's job. No database needed. # diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index ca5742cb0..c1dcf1915 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1121,6 +1121,20 @@ impl Variant { } } + /// The bare catalog domain name this variant maps to (no leading `_`), as + /// stored in `Domain::name` / looked up via `DomainFamily::domain_by_name`. + /// `suffix()` is the SQL-qualifying form (`_eq`); this is the catalog key + /// (`eq`). Storage is the empty bare name. + pub const fn name(self) -> &'static str { + match self { + Variant::Storage => "", + Variant::Eq => "eq", + Variant::Ord => "ord", + Variant::OrdOre => "ord_ore", + Variant::Search => "search", + } + } + /// The fixed index terms this variant's domain carries for scalar `token`, /// from `CATALOG`. Panics if the `(token, suffix())` pair is not declared — /// the resolution backstop test guarantees every instantiated pair @@ -1130,7 +1144,7 @@ impl Variant { CATALOG .iter() .find(|s| s.name == token) - .and_then(|s| s.domain_by_name(self.suffix().trim_start_matches('_'))) + .and_then(|s| s.domain_by_name(self.name())) .map(|d| d.terms) .unwrap_or_else(|| { panic!( @@ -1147,7 +1161,7 @@ impl Variant { CATALOG .iter() .find(|s| s.name == token) - .and_then(|s| s.domain_by_name(self.suffix().trim_start_matches('_'))) + .and_then(|s| s.domain_by_name(self.name())) .is_some() } @@ -1548,7 +1562,7 @@ mod catalog_resolution_tests { let suffix = variant.suffix(); // A variant is instantiated for a token iff that token declares // the suffix; only assert those pairs. - if let Some(d) = spec.domain_by_name(suffix.trim_start_matches('_')) { + if let Some(d) = spec.domain_by_name(variant.name()) { assert!( variant.is_declared_for(spec.name), "{}{} declared in CATALOG but is_declared_for is false", From 71b8d1d3af8235ab127b9a7816cf491b3b931d73 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 13:21:27 +1000 Subject: [PATCH 369/599] refactor(eql-domains): move kind/fixtures off DomainFamily into TypeFixtures records Slim DomainFamily to structural { name, domains }; relocate the fixture vocabulary (ScalarKind, BoundedIntKind, Fixture, fixtures!/int_values!/ text_values!, *_VALUES) into a fixtures module, and pair each catalog row with its kind+values via a per-type TypeFixtures record + FIXTURES table. The old struct-enforced 1:1 is replaced by a compile-time const parity block (FIXTURES mirrors CATALOG by name+order, checked on every build). Behaviour-preserving: generated SQL/TS/JSON and dump-catalog are byte-identical; no fixture value changes. Supersedes the spec's eql-fixtures crate extraction and the earlier fields-on-struct draft. --- crates/eql-domains/src/fixture.rs | 48 -- crates/eql-domains/src/fixtures/fixture.rs | 111 +++++ crates/eql-domains/src/{ => fixtures}/kind.rs | 72 ++- crates/eql-domains/src/fixtures/mod.rs | 23 + crates/eql-domains/src/fixtures/record.rs | 187 ++++++++ crates/eql-domains/src/fixtures/values.rs | 75 ++++ crates/eql-domains/src/lib.rs | 422 ++---------------- crates/eql-domains/src/tests.rs | 139 +++--- crates/eql-tests-macros/src/lib.rs | 34 +- tests/sqlx/src/scalar_domains.rs | 30 +- 10 files changed, 628 insertions(+), 513 deletions(-) delete mode 100644 crates/eql-domains/src/fixture.rs create mode 100644 crates/eql-domains/src/fixtures/fixture.rs rename crates/eql-domains/src/{ => fixtures}/kind.rs (57%) create mode 100644 crates/eql-domains/src/fixtures/mod.rs create mode 100644 crates/eql-domains/src/fixtures/record.rs create mode 100644 crates/eql-domains/src/fixtures/values.rs diff --git a/crates/eql-domains/src/fixture.rs b/crates/eql-domains/src/fixture.rs deleted file mode 100644 index 3bb07730b..000000000 --- a/crates/eql-domains/src/fixture.rs +++ /dev/null @@ -1,48 +0,0 @@ -//! Inherent impls for [`Fixture`] — resolving a fixture to its integer value -//! (`numeric_value`). Definition lives in `lib.rs`. - -use crate::{Fixture, ScalarKind}; - -impl Fixture { - /// The integer value for this fixture (`Min`/`Max` -> kind bounds, `Zero` -> - /// 0, `Int(n)` -> n), or `None` for the string-backed kinds. Does not - /// range-check; `every_fixture_value_is_within_kind_bounds` guards the bounds. - /// - /// `const fn` so the `int_values!` materialiser can resolve a whole fixture - /// list into a typed `&'static` array at compile time. - pub const fn numeric_value(self, kind: ScalarKind) -> Option { - match self { - // `?` is not allowed in `const fn`, so match `as_bounded_int()` - // explicitly. A pivot on a non-integer kind resolves to `None`; the - // `pivot_sentinels_only_appear_with_integer_kinds` catalog test - // guarantees that combination never reaches a real `CATALOG` row. - Fixture::Min => match kind.as_bounded_int() { - Some(k) => Some(k.min_value()), - None => None, - }, - Fixture::Max => match kind.as_bounded_int() { - Some(k) => Some(k.max_value()), - None => None, - }, - Fixture::Zero => match kind.as_bounded_int() { - Some(_) => Some(0), - None => None, - }, - // Gate the literal on the integer kinds too, mirroring the sentinels - // above: a hand-built `Int(n)` on a non-integer kind resolves to - // `None` rather than fabricating a number for a `Text`/`Date`/`Bool` - // kind that has no integer projection. - Fixture::Int(n) => match kind.as_bounded_int() { - Some(_) => Some(n), - None => None, - }, - Fixture::Numeric(_) - | Fixture::Text(_) - | Fixture::Jsonb(_) - | Fixture::Date(_) - | Fixture::Timestamptz(_) - | Fixture::Float(_) - | Fixture::Bool(_) => None, - } - } -} diff --git a/crates/eql-domains/src/fixtures/fixture.rs b/crates/eql-domains/src/fixtures/fixture.rs new file mode 100644 index 000000000..46a66aed4 --- /dev/null +++ b/crates/eql-domains/src/fixtures/fixture.rs @@ -0,0 +1,111 @@ +//! [`Fixture`] — the value-kind-tagged plaintext fixture value, its +//! `numeric_value` impl, and the `fixtures!` builder macro. Def + impl + macro +//! co-located here (the fixture-layer vocabulary). + +use super::kind::ScalarKind; + +/// Builds a `&[Fixture]`. The `int ;` arm (a tt-muncher over `Min`/`Max`/ +/// `Zero` and `N()`) range-checks each literal against `` at compile +/// time via `const _RANGE_CHECK`, so out-of-range literals do not compile; +/// `text;`/`numeric;`/`jsonb;` wrap string literals. The reject case has no +/// in-crate test (macro isn't exported, no `trybuild` under zero-deps) — verify +/// by hand with a bad `N(..)`. +macro_rules! fixtures { + (int $t:ty; $($body:tt)*) => { fixtures!(@int $t; [] $($body)*) }; + (@int $t:ty; [$($acc:expr),*]) => { &[$($acc),*] }; + (@int $t:ty; [$($acc:expr),*] , $($r:tt)*) => { fixtures!(@int $t; [$($acc),*] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Min $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Min ] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Max $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Max ] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] Zero $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Zero] $($r)*) }; + (@int $t:ty; [$($acc:expr),*] N($v:literal) $($r:tt)*) => { + fixtures!(@int $t; [$($acc,)* Fixture::Int({ const _RANGE_CHECK: $t = $v; $v as i128 })] $($r)*) + }; + (text; $($s:literal),* $(,)?) => { &[$(Fixture::Text($s)),*] }; + (numeric; $($s:literal),* $(,)?) => { &[$(Fixture::Numeric($s)),*] }; + (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; + (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; + (timestamptz; $($s:literal),* $(,)?) => { &[$(Fixture::Timestamptz($s)),*] }; + (bool; $($b:literal),* $(,)?) => { &[$(Fixture::Bool($b)),*] }; + (float; $($s:literal),* $(,)?) => { &[$(Fixture::Float($s)),*] }; +} + +/// A single fixture plaintext value, value-kind tagged: `Min`/`Max`/`Zero` are +/// the integer matrix pivots (resolved per-kind); `Int` is an integer literal; +/// `Numeric`/`Text`/`Jsonb` carry rendered string literals. +/// +/// `fixtures!` range-checks `Int` literals at compile time, but a hand-built +/// `Fixture::Int(n)` is not — hence the runtime invariant tests. `Int(MIN)` and +/// `Min` resolve to the same numeric value via `numeric_value`. +/// (`numeric_value` is impl'd below.) +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Fixture { + Min, + Max, + Zero, + Int(i128), + Numeric(&'static str), + Text(&'static str), + Jsonb(&'static str), + /// An ISO-8601 date string (`"1970-01-01"`). The catalog stays zero-dep, so + /// the string is parsed into a `chrono::NaiveDate` in the SQLx harness, not + /// here. Distinct by literal, like the other string-backed fixtures. + Date(&'static str), + /// An RFC3339 UTC timestamp string (`"1970-01-01T00:00:00Z"`). The catalog + /// stays zero-dep, so the string is parsed into a `chrono::DateTime` in + /// the SQLx harness, not here. Distinct by literal, like `Date`. + Timestamptz(&'static str), + /// A boolean plaintext (`true` / `false`). The `bool` scalar is + /// storage-only, so this fixture is encrypted (ciphertext only, no index + /// term) and never participates in a comparison pivot. Distinct by value. + Bool(bool), + /// An IEEE-754 float plaintext rendered as a string (`"0.5"`, `"-inf"`). + /// The catalog stays zero-dep, so the string is parsed into `f32`/`f64` in + /// the SQLx harness, not here. Distinct by parsed value (the harness + /// `float_fixtures_are_distinct_by_value` guard enforces this). NaN and + /// `-0.0` are deliberately excluded; `±Inf` (`"inf"`/`"-inf"`) ARE fixtures. + Float(&'static str), +} + +impl Fixture { + /// The integer value for this fixture (`Min`/`Max` -> kind bounds, `Zero` -> + /// 0, `Int(n)` -> n), or `None` for the string-backed kinds. Does not + /// range-check; `every_fixture_value_is_within_kind_bounds` guards the bounds. + /// + /// `const fn` so the `int_values!` materialiser can resolve a whole fixture + /// list into a typed `&'static` array at compile time. + pub const fn numeric_value(self, kind: ScalarKind) -> Option { + match self { + // `?` is not allowed in `const fn`, so match `as_bounded_int()` + // explicitly. A pivot on a non-integer kind resolves to `None`; the + // `pivot_sentinels_only_appear_with_integer_kinds` catalog test + // guarantees that combination never reaches a real `CATALOG` row. + Fixture::Min => match kind.as_bounded_int() { + Some(k) => Some(k.min_value()), + None => None, + }, + Fixture::Max => match kind.as_bounded_int() { + Some(k) => Some(k.max_value()), + None => None, + }, + Fixture::Zero => match kind.as_bounded_int() { + Some(_) => Some(0), + None => None, + }, + // Gate the literal on the integer kinds too, mirroring the sentinels + // above: a hand-built `Int(n)` on a non-integer kind resolves to + // `None` rather than fabricating a number for a `Text`/`Date`/`Bool` + // kind that has no integer projection. + Fixture::Int(n) => match kind.as_bounded_int() { + Some(_) => Some(n), + None => None, + }, + Fixture::Numeric(_) + | Fixture::Text(_) + | Fixture::Jsonb(_) + | Fixture::Date(_) + | Fixture::Timestamptz(_) + | Fixture::Float(_) + | Fixture::Bool(_) => None, + } + } +} diff --git a/crates/eql-domains/src/kind.rs b/crates/eql-domains/src/fixtures/kind.rs similarity index 57% rename from crates/eql-domains/src/kind.rs rename to crates/eql-domains/src/fixtures/kind.rs index 0b697331e..e87375afb 100644 --- a/crates/eql-domains/src/kind.rs +++ b/crates/eql-domains/src/fixtures/kind.rs @@ -1,8 +1,72 @@ -//! Inherent impls for the scalar-kind vocabulary: [`BoundedIntKind`] (the total -//! accessors for fixed-width integer kinds) and [`ScalarKind`] (the native -//! scalar a domain maps onto). Definitions live in `lib.rs`. +//! [`ScalarKind`] / [`BoundedIntKind`] — the native scalar a domain maps onto +//! plus the total fixed-width-integer accessors. Defs and impls co-located here +//! (the fixture-layer vocabulary). -use crate::{BoundedIntKind, ScalarKind}; +/// The fixed-width integer kinds — exactly those scalar kinds with an `i128` +/// range and `MIN`/`MAX`/`Zero` sentinels. These accessors are **total**: every +/// variant answers every method. Non-integer kinds (`Numeric`/`Text`/`Jsonb`/ +/// `Date`) are simply not representable here, so there is no partial function to +/// panic — `ScalarKind::Date` cannot call `min_symbol()` because `Date` is not a +/// `BoundedIntKind`. Reach this type from a `ScalarKind` via +/// [`ScalarKind::as_bounded_int`]. (Accessors are impl'd below.) +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum BoundedIntKind { + I16, + I32, + I64, +} + +/// The native scalar a domain type maps onto. Integer kinds carry i128 bounds; +/// the others (`Numeric`/`Text`/`Jsonb`) have string fixtures and no numeric +/// range — though `Numeric`/`Text` are still ORE-orderable, only `Jsonb` is not. +/// Capability layer only: `CATALOG` declares which kinds actually exist. +/// +/// The bounded-numeric accessors live on the total [`BoundedIntKind`], reached +/// via [`ScalarKind::as_bounded_int`]; non-integer kinds have no such accessor, +/// so misuse is a compile error rather than a runtime panic. (Accessors are +/// impl'd below.) +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ScalarKind { + I16, + I32, + I64, + Numeric, + Text, + Jsonb, + /// Calendar date (`chrono::NaiveDate`). Ordered like the integer kinds via + /// ORE, but string-backed (ISO-8601) at the catalog layer and with no i128 + /// range — so it is *not* `is_int()` and `as_bounded_int()` returns `None` + /// for it, like the other non-integer kinds. The bounded-numeric accessors + /// live on `BoundedIntKind`, which `Date` cannot be, so they are + /// unreachable for it by construction rather than by a runtime panic. + Date, + /// UTC timestamp (`chrono::DateTime`). Ordered like the integer kinds + /// via ORE, but string-backed (RFC3339) at the catalog layer and with no + /// i128 range — so it is *not* `is_int()` and the bounded-numeric accessors + /// panic for it, exactly like the other non-integer kinds. UTC-normalized: + /// cipherstash has no tz-preserving type, so it maps to the `timestamp` + /// cast and the SQL `timestamp with time zone` plaintext type. + Timestamptz, + /// Boolean (`bool`). **Encryption-only / storage-only**: it carries no index + /// term and is *not* `is_int()`/`is_temporal()`/`is_text()`. A two-value + /// column has such low cardinality that any searchable index (even HMAC + /// equality) would trivially leak the plaintext distribution, so the catalog + /// gives `bool` a single term-less storage domain and no `_eq`/`_ord` — the + /// value is encrypted at rest and decrypted by the proxy, never searched + /// server-side. Like the other non-integer kinds, the bounded-numeric + /// accessors are unreachable for it by construction. + Bool, + /// 32-bit IEEE-754 binary float (`f32`, Postgres `real`/`float4`). + /// Ordered like the integer kinds via ORE, but with no i128 range + /// (`as_bounded_int()` returns `None`) and string-backed at the catalog + /// layer. Encrypts through the single f64 float crypto path + /// (`Plaintext::Float`) — the f32→f64 widening is exact and monotonic. + F32, + /// 64-bit IEEE-754 binary float (`f64`, Postgres `double precision`/ + /// `float8`). The native width of the float crypto path (`F32` widens into + /// it); otherwise classified exactly like [`ScalarKind::F32`]. + F64, +} impl BoundedIntKind { /// The Rust type name as it appears in generated source (e.g. `"i32"`). diff --git a/crates/eql-domains/src/fixtures/mod.rs b/crates/eql-domains/src/fixtures/mod.rs new file mode 100644 index 000000000..1beba5c1a --- /dev/null +++ b/crates/eql-domains/src/fixtures/mod.rs @@ -0,0 +1,23 @@ +//! The fixture/test layer of the catalog: the native-scalar vocabulary +//! (`ScalarKind` / `BoundedIntKind`), the `Fixture` value tag + `fixtures!` +//! builder, the per-type `TypeFixtures` records + `FIXTURES` table, and the +//! materialised `*_VALUES` slices. One-way dependency: this module references +//! catalog rows (`crate::INT4` …); the catalog never references this module. +//! +//! `#[macro_use]` order matters: `fixture` (which defines `fixtures!`) must be +//! declared before `record` (which invokes it), without `#[macro_export]`. + +#[macro_use] +pub(crate) mod fixture; +pub(crate) mod kind; +pub(crate) mod record; +pub(crate) mod values; + +pub use fixture::Fixture; +pub use kind::{BoundedIntKind, ScalarKind}; +pub use record::{ + TypeFixtures, BOOL_FIXTURES, DATE_FIXTURES, FIXTURES, FLOAT4_FIXTURES, FLOAT8_FIXTURES, + INT2_FIXTURES, INT4_FIXTURES, INT8_FIXTURES, NUMERIC_FIXTURES, TEXT_FIXTURES, + TIMESTAMPTZ_FIXTURES, +}; +pub use values::{INT2_VALUES, INT4_VALUES, INT8_VALUES, TEXT_VALUES}; diff --git a/crates/eql-domains/src/fixtures/record.rs b/crates/eql-domains/src/fixtures/record.rs new file mode 100644 index 000000000..eaf11d538 --- /dev/null +++ b/crates/eql-domains/src/fixtures/record.rs @@ -0,0 +1,187 @@ +//! The fixture-layer record: a `TypeFixtures` per scalar type, pairing a +//! structural catalog row (`&DomainFamily`) with its `ScalarKind` and its +//! plaintext fixture `values`. This is where `kind`/`fixtures` live now that +//! they are off `DomainFamily` — a fixture/test concern, not structural catalog +//! data. The `FIXTURES` table mirrors `CATALOG` order; the `const _` parity +//! block at the bottom of this file replaces the struct's old compiler-enforced +//! 1:1 — a build-time `assert!` over `CATALOG`/`FIXTURES`, not a runtime test. + +use super::fixture::Fixture; +use super::kind::ScalarKind; +use crate::DomainFamily; + +/// One scalar type's fixture-layer data: the structural catalog row it belongs +/// to (`family`), the native scalar it maps onto (`kind`), and its distinct +/// plaintext fixture `values`. `family` is a reference to the same +/// `DomainFamily` const that `CATALOG` carries, so `family.name` is the join key +/// back to the catalog. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct TypeFixtures { + pub family: &'static DomainFamily, + pub kind: ScalarKind, + pub values: &'static [Fixture], +} + +/// int4 fixtures. `N(..)` literals are range-checked against `i32` at compile +/// time by `fixtures!`. +pub const INT4_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::INT4, + kind: ScalarKind::I32, + values: fixtures!(int i32; + Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), + N(42), N(50), N(100), N(250), N(1000), N(9999), Max), +}; + +/// int2 fixtures (`i16`-range-checked). +pub const INT2_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::INT2, + kind: ScalarKind::I16, + values: fixtures!(int i16; + Min, N(-30000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), + N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(30000), Max), +}; + +/// int8 fixtures (`i64`-range-checked) — the int4 set plus two values beyond the +/// i32 range (`±5_000_000_000`) so the matrix exercises the full 64-bit width. +pub const INT8_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::INT8, + kind: ScalarKind::I64, + values: fixtures!(int i64; + Min, N(-5000000000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), + N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(5000000000), Max), +}; + +/// date fixtures — ISO-8601 strings; the three temporal pivots +/// (`1900-01-01`, `1970-01-01`, `2099-12-31`) MUST be present verbatim. +pub const DATE_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::DATE, + kind: ScalarKind::Date, + values: fixtures!(date; + "1900-01-01", "1950-07-15", "1969-12-31", "1970-01-01", "1970-01-02", + "1980-02-29", "1991-11-09", "1999-12-31", "2000-01-01", "2004-02-29", + "2012-06-30", "2016-03-15", "2020-10-21", "2024-02-29", "2038-01-19", + "2099-12-31"), +}; + +/// timestamptz fixtures — RFC3339 UTC strings; the three temporal pivots +/// (`1900-01-01T00:00:00Z`, `1970-01-01T00:00:00Z`, `2099-12-31T23:59:59Z`) +/// MUST be present verbatim. +pub const TIMESTAMPTZ_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::TIMESTAMPTZ, + kind: ScalarKind::Timestamptz, + values: fixtures!(timestamptz; + "1900-01-01T00:00:00Z", "1950-07-15T06:30:00Z", "1969-12-31T23:59:59Z", + "1970-01-01T00:00:00Z", "1970-01-01T00:00:01Z", "1985-04-12T23:20:50Z", + "1999-12-31T23:59:59Z", "2000-01-01T00:00:00Z", "2004-02-29T12:00:00Z", + "2012-06-30T11:59:59Z", "2016-03-15T08:15:30Z", "2020-10-21T14:45:00Z", + "2024-02-29T17:30:45Z", "2038-01-19T03:14:07Z", "2099-12-31T23:59:59Z"), +}; + +/// numeric fixtures — distinct by `Decimal` value, mirroring `ore-rs`'s order +/// vectors; includes 0 and the min/max pivots (`±1000000000000`). +pub const NUMERIC_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::NUMERIC, + kind: ScalarKind::Numeric, + values: fixtures!(numeric; + "-1000000000000", "-1000000", "-1.001", "-1", "-0.5", "-0.001", + "0", "0.001", "0.5", "0.999999999", "1", "1.001", "1000000", "1000000000000"), +}; + +/// text fixtures — lexicographic spread (`aard` min, `frank` mid, `zzzz` max +/// pivots, present verbatim), a known substring pair, and the G3-4b divergence +/// pair (`qabcqbcaqcabqabd` / `abcabd`). The empty string is deliberately absent +/// (issue #262). +pub const TEXT_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::TEXT, + kind: ScalarKind::Text, + values: fixtures!(text; + "aard", "aardvark", "alice", "bob", "carol", + "dave", "erin", "frank", "mallory", "trent", "zzzz", + "qabcqbcaqcabqabd", "abcabd"), +}; + +/// bool fixtures — both values. Storage-only: encrypted (ciphertext only), never +/// a comparison pivot. +pub const BOOL_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::BOOL, + kind: ScalarKind::Bool, + values: fixtures!(bool; false, true), +}; + +/// float4 fixtures — IEEE-754 strings, every value dyadic (f32-exact); pivots +/// `-inf` / `0` / `inf` present verbatim. NaN and `-0.0` excluded. +pub const FLOAT4_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::FLOAT4, + kind: ScalarKind::F32, + values: fixtures!(float; + "-inf", "-1024", "-2.25", "-1", "-0.5", "-0.25", + "0", "0.25", "0.5", "1", "2.25", "1024", "inf"), +}; + +/// float8 fixtures — IEEE-754 strings; pivots `-inf` / `0` / `inf` present +/// verbatim. NaN and `-0.0` excluded. +pub const FLOAT8_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::FLOAT8, + kind: ScalarKind::F64, + values: fixtures!(float; + "-inf", "-1e300", "-1000000", "-1.5", "-1", "-0.001", + "0", "0.001", "1", "1.5", "1000000", "1e300", "inf"), +}; + +/// The fixture table — one record per scalar type, in `CATALOG` order. The +/// fixture-layer mirror of `CATALOG`; the `const _` parity block below pins the +/// parity at build time. +pub const FIXTURES: &[TypeFixtures] = &[ + INT4_FIXTURES, + INT2_FIXTURES, + INT8_FIXTURES, + DATE_FIXTURES, + TIMESTAMPTZ_FIXTURES, + NUMERIC_FIXTURES, + TEXT_FIXTURES, + BOOL_FIXTURES, + FLOAT4_FIXTURES, + FLOAT8_FIXTURES, +]; + +/// Compile-time `&str` equality, usable in `const` context. `str::eq` / +/// `PartialEq` are not `const fn` on stable, so the parity block below needs its +/// own byte-wise comparison. +const fn str_eq(a: &str, b: &str) -> bool { + let (a, b) = (a.as_bytes(), b.as_bytes()); + if a.len() != b.len() { + return false; + } + let mut i = 0; + while i < a.len() { + if a[i] != b[i] { + return false; + } + i += 1; + } + true +} + +/// Compile-time parity guard: `FIXTURES` must mirror `CATALOG` exactly, in +/// order. This is the build-time invariant that REPLACES `DomainFamily`'s old +/// compiler-enforced `kind`/`fixtures` fields — every catalog row has exactly +/// one fixture record and vice-versa, same order. As a `const` item it is +/// const-evaluated on every `cargo build`: a missing, extra, or misaligned +/// `TypeFixtures` fails the build with `error[E0080]: evaluation panicked` +/// carrying the message below — it cannot be `#[cfg]`-gated away or skipped by a +/// test filter. It proves NAME + ORDERING coverage only; fixture-VALUE +/// correctness is gated by the in-crate value/invariant tests, not here. +const _: () = { + assert!( + FIXTURES.len() == crate::CATALOG.len(), + "every CATALOG family needs exactly one TypeFixtures (FIXTURES.len() != CATALOG.len())" + ); + let mut i = 0; + while i < crate::CATALOG.len() { + assert!( + str_eq(crate::CATALOG[i].name, FIXTURES[i].family.name), + "FIXTURES must mirror CATALOG in order: name mismatch at this index" + ); + i += 1; + } +}; diff --git a/crates/eql-domains/src/fixtures/values.rs b/crates/eql-domains/src/fixtures/values.rs new file mode 100644 index 000000000..af35d9306 --- /dev/null +++ b/crates/eql-domains/src/fixtures/values.rs @@ -0,0 +1,75 @@ +//! Compile-time materialisers: each `*_VALUES` const is a typed `&'static` +//! slice derived from its `TypeFixtures` record (`int_values!` / `text_values!`), +//! the single-sourced plaintext list the SQLx matrix reads and the fixture +//! generator encrypts. No committed generated `.rs` round-trip. + +use super::fixture::Fixture; +use super::record::{TypeFixtures, INT2_FIXTURES, INT4_FIXTURES, INT8_FIXTURES, TEXT_FIXTURES}; + +/// Materialise an integer record's fixtures into a typed `&'static` slice at +/// compile time. Integer kinds only: a non-numeric fixture is a const-eval +/// error, mirroring `numeric_value`'s `None`. +macro_rules! int_values { + ($name:ident, $ty:ty, $rec:expr) => { + #[doc = concat!("Distinct plaintext fixture values for `", stringify!($rec), "`, ")] + #[doc = "materialised from its `TypeFixtures` record (see `int_values!`)."] + pub const $name: &[$ty] = { + const REC: TypeFixtures = $rec; + const N: usize = REC.values.len(); + const ARR: [$ty; N] = { + let mut out = [0 as $ty; N]; + let mut i = 0; + while i < N { + out[i] = match REC.values[i].numeric_value(REC.kind) { + Some(v) => { + if v < <$ty>::MIN as i128 || v > <$ty>::MAX as i128 { + panic!(concat!( + "integer scalar fixture value out of range for `", + stringify!($ty), + "`" + )); + } + v as $ty + } + None => panic!("integer scalar fixture must resolve to a number"), + }; + i += 1; + } + out + }; + &ARR + }; + }; +} + +int_values!(INT4_VALUES, i32, INT4_FIXTURES); +int_values!(INT2_VALUES, i16, INT2_FIXTURES); +int_values!(INT8_VALUES, i64, INT8_FIXTURES); + +/// Materialise a `text` record's fixtures into a `&'static [&'static str]` at +/// compile time. A non-text fixture is a const-eval panic. +macro_rules! text_values { + ($name:ident, $rec:expr) => { + #[doc = concat!("Distinct plaintext fixture values for `", stringify!($rec), "`, ")] + #[doc = "materialised from its `TypeFixtures` record (see `text_values!`)."] + pub const $name: &[&'static str] = { + const REC: TypeFixtures = $rec; + const N: usize = REC.values.len(); + const ARR: [&'static str; N] = { + let mut out = [""; N]; + let mut i = 0; + while i < N { + out[i] = match REC.values[i] { + Fixture::Text(s) => s, + _ => panic!("text scalar fixture must be Fixture::Text"), + }; + i += 1; + } + out + }; + &ARR + }; + }; +} + +text_values!(TEXT_VALUES, TEXT_FIXTURES); diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index f49e05943..09aa99e03 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -1,11 +1,5 @@ //! Scalar/term catalog for EQL encrypted-domain codegen — the single Rust -//! source of truth for every scalar type, term, and fixture. Std-only, no -//! dependencies. -//! -//! `Fixture` is value-kind tagged (one non-generic enum, variant = value kind), -//! so a single `CATALOG` spans every scalar kind. Integer literals are -//! range-checked at their definition site by `fixtures!` (`N(-40000)` for `i16` -//! does not compile). +//! source of truth for every scalar type and term. Std-only, no dependencies. //! //! Capability axes are independent: equality covers every kind; order covers //! every kind except `jsonb` (ORE compares ciphertext, so it is @@ -15,82 +9,28 @@ //! //! Public names are consumed verbatim by the later codegen plans — do not rename. //! -//! **Layout.** This file holds the *definitions* — the type vocabulary and the -//! catalog data — so the whole catalog reads top-to-bottom. The inherent `impl` -//! blocks live in sibling modules (`kind`, `term`, `fixture`, `spec`); the unit -//! tests live in `tests`. The methods travel with their types, so nothing here -//! re-exports them. - -mod fixture; -mod kind; +//! **Layout.** This file holds the *structural* catalog: the `DomainFamily`/ +//! `Domain`/`Term`/`Role` definitions, the per-type `DomainFamily` rows, and +//! `CATALOG` — so the structural surface reads top-to-bottom. `DomainFamily` is +//! purely `{ name, domains }`; the native-scalar `kind` and the plaintext +//! `fixtures` are a fixture-layer concern that lives in the `fixtures` module +//! (the `ScalarKind`/`Fixture` vocabulary, the per-type `TypeFixtures` records + +//! `FIXTURES` table, and the materialised `*_VALUES` slices), joined back to a +//! catalog row by `name`. The inherent `impl` blocks for the structural types +//! live in sibling modules (`term`, `spec`); the unit tests live in `tests`. The +//! crate-root `pub use fixtures::{…}` below preserves the public fixture-layer +//! paths. + +#[macro_use] +mod fixtures; mod spec; mod term; -/// The fixed-width integer kinds — exactly those scalar kinds with an `i128` -/// range and `MIN`/`MAX`/`Zero` sentinels. These accessors are **total**: every -/// variant answers every method. Non-integer kinds (`Numeric`/`Text`/`Jsonb`/ -/// `Date`) are simply not representable here, so there is no partial function to -/// panic — `ScalarKind::Date` cannot call `min_symbol()` because `Date` is not a -/// `BoundedIntKind`. Reach this type from a `ScalarKind` via -/// [`ScalarKind::as_bounded_int`]. (Accessors are impl'd in `kind`.) -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum BoundedIntKind { - I16, - I32, - I64, -} - -/// The native scalar a domain type maps onto. Integer kinds carry i128 bounds; -/// the others (`Numeric`/`Text`/`Jsonb`) have string fixtures and no numeric -/// range — though `Numeric`/`Text` are still ORE-orderable, only `Jsonb` is not. -/// Capability layer only: `CATALOG` declares which kinds actually exist. -/// -/// The bounded-numeric accessors live on the total [`BoundedIntKind`], reached -/// via [`ScalarKind::as_bounded_int`]; non-integer kinds have no such accessor, -/// so misuse is a compile error rather than a runtime panic. (Accessors are -/// impl'd in `kind`.) -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum ScalarKind { - I16, - I32, - I64, - Numeric, - Text, - Jsonb, - /// Calendar date (`chrono::NaiveDate`). Ordered like the integer kinds via - /// ORE, but string-backed (ISO-8601) at the catalog layer and with no i128 - /// range — so it is *not* `is_int()` and `as_bounded_int()` returns `None` - /// for it, like the other non-integer kinds. The bounded-numeric accessors - /// live on `BoundedIntKind`, which `Date` cannot be, so they are - /// unreachable for it by construction rather than by a runtime panic. - Date, - /// UTC timestamp (`chrono::DateTime`). Ordered like the integer kinds - /// via ORE, but string-backed (RFC3339) at the catalog layer and with no - /// i128 range — so it is *not* `is_int()` and the bounded-numeric accessors - /// panic for it, exactly like the other non-integer kinds. UTC-normalized: - /// cipherstash has no tz-preserving type, so it maps to the `timestamp` - /// cast and the SQL `timestamp with time zone` plaintext type. - Timestamptz, - /// Boolean (`bool`). **Encryption-only / storage-only**: it carries no index - /// term and is *not* `is_int()`/`is_temporal()`/`is_text()`. A two-value - /// column has such low cardinality that any searchable index (even HMAC - /// equality) would trivially leak the plaintext distribution, so the catalog - /// gives `bool` a single term-less storage domain and no `_eq`/`_ord` — the - /// value is encrypted at rest and decrypted by the proxy, never searched - /// server-side. Like the other non-integer kinds, the bounded-numeric - /// accessors are unreachable for it by construction. - Bool, - /// 32-bit IEEE-754 binary float (`f32`, Postgres `real`/`float4`). - /// Ordered like the integer kinds via ORE, but with no i128 range - /// (`as_bounded_int()` returns `None`) and string-backed at the catalog - /// layer. Encrypts through the single f64 float crypto path - /// (`Plaintext::Float`) — the f32→f64 widening is exact and monotonic. - F32, - /// 64-bit IEEE-754 binary float (`f64`, Postgres `double precision`/ - /// `float8`). The native width of the float crypto path (`F32` widens into - /// it); otherwise classified exactly like [`ScalarKind::F32`]. - F64, -} +pub use fixtures::{ + BoundedIntKind, Fixture, ScalarKind, TypeFixtures, BOOL_FIXTURES, DATE_FIXTURES, FIXTURES, + FLOAT4_FIXTURES, FLOAT8_FIXTURES, INT2_FIXTURES, INT2_VALUES, INT4_FIXTURES, INT4_VALUES, + INT8_FIXTURES, INT8_VALUES, NUMERIC_FIXTURES, TEXT_FIXTURES, TEXT_VALUES, TIMESTAMPTZ_FIXTURES, +}; /// Always-present payload keys required by every generated domain CHECK, /// before the domain's term keys, in order: envelope version (`v`), ident @@ -159,43 +99,6 @@ impl Role { } } -/// A single fixture plaintext value, value-kind tagged: `Min`/`Max`/`Zero` are -/// the integer matrix pivots (resolved per-kind); `Int` is an integer literal; -/// `Numeric`/`Text`/`Jsonb` carry rendered string literals. -/// -/// `fixtures!` range-checks `Int` literals at compile time, but a hand-built -/// `Fixture::Int(n)` is not — hence the runtime invariant tests. `Int(MIN)` and -/// `Min` resolve to the same numeric value via `numeric_value`. -/// (`numeric_value` is impl'd in `fixture`.) -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Fixture { - Min, - Max, - Zero, - Int(i128), - Numeric(&'static str), - Text(&'static str), - Jsonb(&'static str), - /// An ISO-8601 date string (`"1970-01-01"`). The catalog stays zero-dep, so - /// the string is parsed into a `chrono::NaiveDate` in the SQLx harness, not - /// here. Distinct by literal, like the other string-backed fixtures. - Date(&'static str), - /// An RFC3339 UTC timestamp string (`"1970-01-01T00:00:00Z"`). The catalog - /// stays zero-dep, so the string is parsed into a `chrono::DateTime` in - /// the SQLx harness, not here. Distinct by literal, like `Date`. - Timestamptz(&'static str), - /// A boolean plaintext (`true` / `false`). The `bool` scalar is - /// storage-only, so this fixture is encrypted (ciphertext only, no index - /// term) and never participates in a comparison pivot. Distinct by value. - Bool(bool), - /// An IEEE-754 float plaintext rendered as a string (`"0.5"`, `"-inf"`). - /// The catalog stays zero-dep, so the string is parsed into `f32`/`f64` in - /// the SQLx harness, not here. Distinct by parsed value (the harness - /// `float_fixtures_are_distinct_by_value` guard enforces this). NaN and - /// `-0.0` are deliberately excluded; `±Inf` (`"inf"`/`"-inf"`) ARE fixtures. - Float(&'static str), -} - /// One generated public domain: a bare domain name joined under the family /// name (codegen owns the `_` separator) plus the fixed index terms it /// carries. Name `""` is the storage-only domain. @@ -205,41 +108,15 @@ pub struct Domain { pub terms: &'static [Term], } -/// A scalar encrypted-domain type: its SQL `name`, native Rust type, generated -/// domains, and fixture plaintext list. One row of the Rust `CATALOG` — the -/// source of truth for the type (there is no TOML manifest). -/// (`domain_name`/`is_eq_only` are impl'd in `spec`.) +/// A scalar encrypted-domain type's structural surface: its SQL `name` and the +/// generated domains. One row of the Rust `CATALOG`. The native-scalar `kind` +/// and the plaintext `fixtures` are a fixture-layer concern and live in the +/// `fixtures` module's `TypeFixtures` records, joined back by `name`. +/// (`domain_name`/`is_eq_only`/… are impl'd in `spec`.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct DomainFamily { pub name: &'static str, - pub kind: ScalarKind, pub domains: &'static [Domain], - pub fixtures: &'static [Fixture], -} - -/// Builds a `&[Fixture]`. The `int ;` arm (a tt-muncher over `Min`/`Max`/ -/// `Zero` and `N()`) range-checks each literal against `` at compile -/// time via `const _RANGE_CHECK`, so out-of-range literals do not compile; -/// `text;`/`numeric;`/`jsonb;` wrap string literals. The reject case has no -/// in-crate test (macro isn't exported, no `trybuild` under zero-deps) — verify -/// by hand with a bad `N(..)`. -macro_rules! fixtures { - (int $t:ty; $($body:tt)*) => { fixtures!(@int $t; [] $($body)*) }; - (@int $t:ty; [$($acc:expr),*]) => { &[$($acc),*] }; - (@int $t:ty; [$($acc:expr),*] , $($r:tt)*) => { fixtures!(@int $t; [$($acc),*] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] Min $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Min ] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] Max $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Max ] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] Zero $($r:tt)*) => { fixtures!(@int $t; [$($acc,)* Fixture::Zero] $($r)*) }; - (@int $t:ty; [$($acc:expr),*] N($v:literal) $($r:tt)*) => { - fixtures!(@int $t; [$($acc,)* Fixture::Int({ const _RANGE_CHECK: $t = $v; $v as i128 })] $($r)*) - }; - (text; $($s:literal),* $(,)?) => { &[$(Fixture::Text($s)),*] }; - (numeric; $($s:literal),* $(,)?) => { &[$(Fixture::Numeric($s)),*] }; - (jsonb; $($s:literal),* $(,)?) => { &[$(Fixture::Jsonb($s)),*] }; - (date; $($s:literal),* $(,)?) => { &[$(Fixture::Date($s)),*] }; - (timestamptz; $($s:literal),* $(,)?) => { &[$(Fixture::Timestamptz($s)),*] }; - (bool; $($b:literal),* $(,)?) => { &[$(Fixture::Bool($b)),*] }; - (float; $($s:literal),* $(,)?) => { &[$(Fixture::Float($s)),*] }; } /// Domains shared by every ordered-integer scalar, in manifest file order: @@ -283,99 +160,33 @@ const EQ_ONLY_DOMAINS: &[Domain] = &[ }, ]; -/// int4 fixture plaintexts. -/// `N(..)` literals are range-checked against `i32` at compile time. -const INT4_FIXTURES: &[Fixture] = fixtures!(int i32; - Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), - N(42), N(50), N(100), N(250), N(1000), N(9999), Max); - -/// int2 fixture plaintexts. -/// `N(..)` literals are range-checked against `i16` at compile time. -const INT2_FIXTURES: &[Fixture] = fixtures!(int i16; - Min, N(-30000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), - N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(30000), Max); - -/// int8 fixture plaintexts — the int4 set plus two values beyond the i32 range -/// (`±5_000_000_000`) so the matrix exercises the full 64-bit width. `N(..)` -/// literals are range-checked against `i64` at compile time. -const INT8_FIXTURES: &[Fixture] = fixtures!(int i64; - Min, N(-5000000000), N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), - N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), N(5000000000), Max); - -/// date fixture plaintexts — ISO-8601 (`YYYY-MM-DD`) strings, parsed into -/// `chrono::NaiveDate` in the SQLx harness (the catalog stays zero-dep). The -/// three temporal pivots MUST be present verbatim: `"1900-01-01"` (min_pivot), -/// `"1970-01-01"` (zero = `NaiveDate::default()`), and `"2099-12-31"` -/// (max_pivot) — the matrix fetches each one's ciphertext via -/// `fetch_fixture_payload`, which fails loudly if a row is absent. The interior -/// dates span varied years/months so range operators yield distinguishable -/// counts. All distinct. -const DATE_FIXTURES: &[Fixture] = fixtures!(date; - "1900-01-01", "1950-07-15", "1969-12-31", "1970-01-01", "1970-01-02", - "1980-02-29", "1991-11-09", "1999-12-31", "2000-01-01", "2004-02-29", - "2012-06-30", "2016-03-15", "2020-10-21", "2024-02-29", "2038-01-19", - "2099-12-31"); - -/// timestamptz fixture plaintexts — RFC3339 UTC strings, parsed into -/// `chrono::DateTime` in the SQLx harness (the catalog stays zero-dep). -/// The three temporal pivots MUST be present verbatim: `"1900-01-01T00:00:00Z"` -/// (min_pivot), `"1970-01-01T00:00:00Z"` (zero = `DateTime::::default()`, -/// the Unix epoch), and `"2099-12-31T23:59:59Z"` (max_pivot) — the matrix -/// fetches each one's ciphertext via `fetch_fixture_payload`, which fails loudly -/// if a row is absent. The interior timestamps span varied dates AND times of -/// day so range operators yield distinguishable counts. All distinct. -const TIMESTAMPTZ_FIXTURES: &[Fixture] = fixtures!(timestamptz; - "1900-01-01T00:00:00Z", "1950-07-15T06:30:00Z", "1969-12-31T23:59:59Z", - "1970-01-01T00:00:00Z", "1970-01-01T00:00:01Z", "1985-04-12T23:20:50Z", - "1999-12-31T23:59:59Z", "2000-01-01T00:00:00Z", "2004-02-29T12:00:00Z", - "2012-06-30T11:59:59Z", "2016-03-15T08:15:30Z", "2020-10-21T14:45:00Z", - "2024-02-29T17:30:45Z", "2038-01-19T03:14:07Z", "2099-12-31T23:59:59Z"); - -/// `numeric` fixture plaintexts — distinct by `Decimal` value, spanning sign, -/// magnitude, and scale, and including `0` plus the min/max pivots -/// (`-1000000000000` / `1000000000000`). They mirror `ore-rs`'s own -/// order-pinning vectors so the 14-block ORE edges (sign + high/low blocks) are -/// exercised. Each literal is distinct by parsed value (no `"1"`/`"1.0"` -/// aliasing) — the harness `numeric_fixtures_distinct_by_value` guard enforces -/// this, since the zero-dep catalog only dedupes by literal string. -const NUMERIC_FIXTURES: &[Fixture] = fixtures!(numeric; - "-1000000000000", "-1000000", "-1.001", "-1", "-0.5", "-0.001", - "0", "0.001", "0.5", "0.999999999", "1", "1.001", "1000000", "1000000000000"); - const INT4: DomainFamily = DomainFamily { name: "int4", - kind: ScalarKind::I32, domains: ORDERED_INT_DOMAINS, - fixtures: INT4_FIXTURES, }; const INT2: DomainFamily = DomainFamily { name: "int2", - kind: ScalarKind::I16, domains: ORDERED_INT_DOMAINS, - fixtures: INT2_FIXTURES, }; const INT8: DomainFamily = DomainFamily { name: "int8", - kind: ScalarKind::I64, domains: ORDERED_INT_DOMAINS, - fixtures: INT8_FIXTURES, }; /// `date` — an ordered, non-integer scalar. Reuses `ORDERED_INT_DOMAINS` (the /// four-domain ordered shape is identical to the integer scalars); only the -/// kind and fixtures differ. +/// kind and fixtures (in `DATE_FIXTURES`) differ. /// /// Public (unlike the integer specs) because the SQLx harness reads -/// `DATE.fixtures` directly to parse the ISO strings into `chrono::NaiveDate` -/// at runtime — there is no `DATE_VALUES` const (chrono is not `const`-friendly -/// and `eql-domains` stays zero-dep, so no typed slice is materialised here). +/// `DATE_FIXTURES.values` directly to parse the ISO strings into +/// `chrono::NaiveDate` at runtime — there is no `DATE_VALUES` const (chrono is +/// not `const`-friendly and `eql-domains` stays zero-dep, so no typed slice is +/// materialised here). pub const DATE: DomainFamily = DomainFamily { name: "date", - kind: ScalarKind::Date, domains: ORDERED_INT_DOMAINS, - fixtures: DATE_FIXTURES, }; /// `timestamptz` — an **ordered**, UTC-normalized non-integer scalar. Uses the @@ -385,14 +196,13 @@ pub const DATE: DomainFamily = DomainFamily { /// Values are UTC-normalized (cipherstash has no tz-preserving type) and encrypt /// under the `timestamp` cast. /// -/// Public (like `DATE`) because the SQLx harness reads `TIMESTAMPTZ.fixtures` -/// directly to parse the RFC3339 strings into `chrono::DateTime` at runtime -/// (no `TIMESTAMPTZ_VALUES` const; `eql-domains` stays zero-dep). +/// Public (like `DATE`) because the SQLx harness reads +/// `TIMESTAMPTZ_FIXTURES.values` directly to parse the RFC3339 strings into +/// `chrono::DateTime` at runtime (no `TIMESTAMPTZ_VALUES` const; +/// `eql-domains` stays zero-dep). pub const TIMESTAMPTZ: DomainFamily = DomainFamily { name: "timestamptz", - kind: ScalarKind::Timestamptz, domains: ORDERED_INT_DOMAINS, - fixtures: TIMESTAMPTZ_FIXTURES, }; /// `numeric` — an **ordered** non-integer scalar backed by @@ -404,14 +214,12 @@ pub const TIMESTAMPTZ: DomainFamily = DomainFamily { /// order (equivalent scales collide, like `Decimal`'s own `Ord`). /// /// Public (like `DATE` / `TIMESTAMPTZ`) so the SQLx harness reads -/// `NUMERIC.fixtures` directly to parse the decimal strings into +/// `NUMERIC_FIXTURES.values` directly to parse the decimal strings into /// `rust_decimal::Decimal` at runtime (the catalog stays zero-dep: no /// `rust_decimal`). pub const NUMERIC: DomainFamily = DomainFamily { name: "numeric", - kind: ScalarKind::Numeric, domains: ORDERED_INT_DOMAINS, - fixtures: NUMERIC_FIXTURES, }; /// Domains for `text`: the ordered shape (with exact `hm` equality on the @@ -462,107 +270,44 @@ const STORAGE_ONLY_DOMAINS: &[Domain] = &[Domain { terms: &[], }]; -/// `bool` fixture plaintexts — both values. `bool` is storage-only, so these are -/// encrypted (ciphertext only) and never used as comparison pivots; they exist -/// so the SQLx matrix can prove the storage domain accepts a real bool ciphertext -/// and rejects every operator. Distinct by value. -const BOOL_FIXTURES: &[Fixture] = fixtures!(bool; false, true); - /// `bool` — an **encryption-only / storage-only** scalar (`ScalarKind::Bool`). /// One term-less storage domain (`eql_v3.bool`), no `_eq`/`_ord`: a two-value /// column has too little cardinality for any searchable index without leaking the /// plaintext, so the value is encrypted at rest and decrypted by the proxy, -/// never searched server-side. Public so the SQLx harness reads `BOOL.fixtures` -/// directly (there is no `BOOL_VALUES` materializer — the two values are read -/// straight from the catalog). +/// never searched server-side. Public so the SQLx harness reads +/// `BOOL_FIXTURES.values` directly (there is no `BOOL_VALUES` materializer — the +/// two values are read straight from the record). pub const BOOL: DomainFamily = DomainFamily { name: "bool", - kind: ScalarKind::Bool, domains: STORAGE_ONLY_DOMAINS, - fixtures: BOOL_FIXTURES, }; -/// `text` fixture plaintexts — curated so eq/ord give a lexicographic spread -/// and the match suite has a known substring pair (`"aardvark"`/`"aard"`, -/// sharing 3-grams) and a disjoint value (`"zzzz"`, no shared 3-grams). -/// `"aard"` is the lexicographic `min_pivot`, `"zzzz"` the `max_pivot`, and -/// `"frank"` the interior `mid_pivot`; all three must be present verbatim so the -/// matrix can fetch their ciphertext. All distinct. -/// -/// The empty string is deliberately **not** a fixture: text is an ordered, not -/// signed, scalar (no numeric origin), and `""` encrypts to an empty ORE term -/// whose comparison is undefined (see issue #262). The interior pivot is a real -/// median value, not `String::default()`. -const TEXT_FIXTURES: &[Fixture] = fixtures!(text; - "aard", "aardvark", "alice", "bob", "carol", - "dave", "erin", "frank", "mallory", "trent", "zzzz", - // Divergence pair (G3 4b): every contiguous 3-gram of NEEDLE (`abcabd` → - // {abc, bca, cab, abd}) is present in HAY (`qabcqbcaqcabqabd`), yet NEEDLE is - // NOT a contiguous substring of HAY (the `q` separators break the run). So - // bloom `@>` is true while `HAY LIKE '%NEEDLE%'` is false — the deterministic - // bloom-vs-LIKE divergence locked in by `bloom_matches_where_like_would_not`. - // Verified against the real cipherstash bf term sets (contiguous 3-grams, - // k=6 hashing): bf(NEEDLE) ⊆ bf(HAY). Both are 3-gram-disjoint from the - // `aard`/`zzzz` disjoint pair and sort interior to the min/mid/max pivots, so - // they perturb no eq/ord oracle. Keep them diverging if edited (the pure-Rust - // guard `divergence_pair_is_contiguity_diverging` in src/tests.rs enforces it). - "qabcqbcaqcabqabd", "abcabd"); - /// `text` — an ordered, non-integer, unbounded scalar. Adds a `_match` domain /// (the `Bloom` term) on top of the ordered shape. Public because the SQLx -/// harness reads `TEXT_VALUES` (materialised below). +/// harness reads `TEXT_VALUES` (materialised in the `fixtures` module). pub const TEXT: DomainFamily = DomainFamily { name: "text", - kind: ScalarKind::Text, domains: TEXT_DOMAINS, - fixtures: TEXT_FIXTURES, }; -/// `float4` fixture plaintexts — IEEE-754 strings parsed into `f32` in the SQLx -/// harness (the catalog stays zero-dep). EVERY value is exactly representable in -/// f32 — each is a dyadic rational `n/2^k` (e.g. `2.25 = 9/4`, `0.25 = 1/4`, -/// `1024 = 2^10`), the value class `real` stores losslessly — so the `real` -/// round-trip is lossless and the f32→f64 widening before encryption is exact. -/// Keep new fixtures dyadic: a value like `0.1` is NOT f32-exact, and the -/// oracle's expected order (parsed `f32`) would then disagree with the value the -/// `real` column actually rounds to. The three pivots MUST be present -/// verbatim: `"-inf"` (min_pivot), `"0"` (origin/mid), `"inf"` (max_pivot). -/// NaN and `-0.0` are deliberately excluded (see the `float_special` suite). -/// Distinctness is enforced by `Fixture::Float` (above) and its guard test. -const FLOAT4_FIXTURES: &[Fixture] = fixtures!(float; - "-inf", "-1024", "-2.25", "-1", "-0.5", "-0.25", - "0", "0.25", "0.5", "1", "2.25", "1024", "inf"); - -/// `float8` fixture plaintexts — IEEE-754 strings parsed into `f64` in the SQLx -/// harness. The native width of the float crypto path; values span sign and -/// magnitude including subnormal-free interior points. The three pivots MUST be -/// present verbatim: `"-inf"` (min_pivot), `"0"` (origin/mid), `"inf"` -/// (max_pivot). NaN and `-0.0` are deliberately excluded. -const FLOAT8_FIXTURES: &[Fixture] = fixtures!(float; - "-inf", "-1e300", "-1000000", "-1.5", "-1", "-0.001", - "0", "0.001", "1", "1.5", "1000000", "1e300", "inf"); - /// `float4` — an **ordered**, non-integer scalar (Postgres `real`). Reuses the /// four-domain ordered shape (`ORDERED_INT_DOMAINS`); only kind and fixtures /// differ. Both float widths encrypt through the SAME f64 crypto path /// (`Plaintext::Float`), so `float4` vs `float8` is purely a Postgres-surface /// distinction. Public (like `DATE`/`NUMERIC`) so the SQLx harness reads -/// `FLOAT4.fixtures` directly to parse the strings into `f32`. +/// `FLOAT4_FIXTURES.values` directly to parse the strings into `f32`. pub const FLOAT4: DomainFamily = DomainFamily { name: "float4", - kind: ScalarKind::F32, domains: ORDERED_INT_DOMAINS, - fixtures: FLOAT4_FIXTURES, }; /// `float8` — an **ordered**, non-integer scalar (Postgres `double precision`), /// the native width of the float crypto path. Reuses the ordered shape. Public -/// so the SQLx harness reads `FLOAT8.fixtures` directly to parse into `f64`. +/// so the SQLx harness reads `FLOAT8_FIXTURES.values` directly to parse into +/// `f64`. pub const FLOAT8: DomainFamily = DomainFamily { name: "float8", - kind: ScalarKind::F64, domains: ORDERED_INT_DOMAINS, - fixtures: FLOAT8_FIXTURES, }; /// The scalar catalog — the single source of truth. Order is significant (it @@ -580,89 +325,6 @@ pub const CATALOG: &[DomainFamily] = &[ FLOAT8, ]; -/// Materialise an integer scalar's fixtures into a typed `&'static` slice at -/// compile time. This is the **single-sourced** plaintext list the SQLx test -/// matrix reads via `ScalarType::fixture_values()` and the fixture generator -/// encrypts — derived from the same `CATALOG` row that drives SQL generation, -/// so the oracle cannot drift from the fixture. (It replaces the old generated, -/// committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no -/// longer needs to round-trip through generated Rust.) -/// -/// Integer kinds only: a non-numeric fixture (`Text`/`Numeric`/`Jsonb`) is a -/// const-eval error, mirroring `numeric_value`'s `None`. -macro_rules! int_values { - ($name:ident, $ty:ty, $spec:expr) => { - #[doc = concat!("Distinct plaintext fixture values for `", stringify!($spec), "`, ")] - #[doc = "materialised from its `CATALOG` row (see `int_values!`)."] - pub const $name: &[$ty] = { - const SPEC: DomainFamily = $spec; - const N: usize = SPEC.fixtures.len(); - const ARR: [$ty; N] = { - let mut out = [0 as $ty; N]; - let mut i = 0; - while i < N { - out[i] = match SPEC.fixtures[i].numeric_value(SPEC.kind) { - Some(v) => { - // Const-eval bounds check: a fixture value that does - // not fit the narrowed target type would otherwise be - // silently truncated/wrapped by `as`. Make it a - // compile-time error instead. - if v < <$ty>::MIN as i128 || v > <$ty>::MAX as i128 { - panic!(concat!( - "integer scalar fixture value out of range for `", - stringify!($ty), - "`" - )); - } - v as $ty - } - None => panic!("integer scalar fixture must resolve to a number"), - }; - i += 1; - } - out - }; - &ARR - }; - }; -} - -int_values!(INT4_VALUES, i32, INT4); -int_values!(INT2_VALUES, i16, INT2); -int_values!(INT8_VALUES, i64, INT8); - -/// Materialise a `text` scalar's fixtures into a `&'static [&'static str]` at -/// compile time — the single-sourced plaintext list the SQLx matrix reads via -/// `ScalarType::fixture_values()` and the fixture generator encrypts. Unlike -/// `date` (chrono is not `const`-friendly), a `Fixture::Text(&'static str)` is -/// already const, so text materialises a typed slice like the integer kinds. -/// A non-text fixture is a const-eval panic (compile-time guard). -macro_rules! text_values { - ($name:ident, $spec:expr) => { - #[doc = concat!("Distinct plaintext fixture values for `", stringify!($spec), "`, ")] - #[doc = "materialised from its `CATALOG` row (see `text_values!`)."] - pub const $name: &[&'static str] = { - const SPEC: DomainFamily = $spec; - const N: usize = SPEC.fixtures.len(); - const ARR: [&'static str; N] = { - let mut out = [""; N]; - let mut i = 0; - while i < N { - out[i] = match SPEC.fixtures[i] { - Fixture::Text(s) => s, - _ => panic!("text scalar fixture must be Fixture::Text"), - }; - i += 1; - } - out - }; - &ARR - }; - }; -} - -text_values!(TEXT_VALUES, TEXT); - #[cfg(test)] mod tests; diff --git a/crates/eql-domains/src/tests.rs b/crates/eql-domains/src/tests.rs index 70b53e429..c535c79c7 100644 --- a/crates/eql-domains/src/tests.rs +++ b/crates/eql-domains/src/tests.rs @@ -2,8 +2,9 @@ //! (declared from `lib.rs`) rather than co-located with each impl file because //! `rust_tests` spans `BoundedIntKind` + `ScalarKind` + `Fixture` + //! `DomainFamily`. Each inner module imports the crate-root catalog with -//! `use crate::*;`; the crate-local `fixtures!` macro is in scope here by textual -//! scoping (this module is declared after the macro definition in `lib.rs`). +//! `use crate::*;`; the crate-local `fixtures!` macro is in scope here via the +//! `#[macro_use] mod fixtures;` chain in `lib.rs` (it is defined in +//! `fixtures/fixture.rs`). mod rust_tests { use crate::*; @@ -167,14 +168,14 @@ mod rust_tests { /// the source of truth. #[test] fn pivot_sentinels_only_appear_with_integer_kinds() { - for spec in CATALOG { - for fixture in spec.fixtures { + for rec in FIXTURES { + for fixture in rec.values { if matches!(fixture, Fixture::Min | Fixture::Max | Fixture::Zero) { assert!( - spec.kind.is_int(), + rec.kind.is_int(), "pivot sentinel {fixture:?} on non-integer kind {:?} (token `{}`)", - spec.kind, - spec.name, + rec.kind, + rec.family.name, ); } } @@ -209,9 +210,7 @@ mod rust_tests { // `EQ_ONLY_DOMAINS` shape (storage + `_eq`, no `_ord`). let eq_only = DomainFamily { name: "synthetic_eq_only", - kind: ScalarKind::Timestamptz, domains: EQ_ONLY_DOMAINS, - fixtures: &[], }; assert!( eq_only.is_eq_only(), @@ -573,6 +572,13 @@ mod catalog_tests { .unwrap_or_else(|| panic!("{token} missing from CATALOG")) } + fn fixtures(token: &str) -> &'static TypeFixtures { + FIXTURES + .iter() + .find(|f| f.family.name == token) + .unwrap_or_else(|| panic!("{token} missing from FIXTURES")) + } + #[test] fn catalog_has_all_tokens_in_order() { let tokens: Vec<&str> = CATALOG.iter().map(|s| s.name).collect(); @@ -596,17 +602,18 @@ mod catalog_tests { #[test] fn bool_spec_is_storage_only_encryption_only() { let b = scalar("bool"); - assert_eq!(b.kind, ScalarKind::Bool); - assert_eq!(b.kind.rust_type(), "bool"); + let bf = fixtures("bool"); + assert_eq!(bf.kind, ScalarKind::Bool); + assert_eq!(bf.kind.rust_type(), "bool"); // Storage-only: exactly one term-less domain, no `_eq`/`_ord` — no SEM // index term, no comparison surface. let shape: Vec<(&str, &[Term])> = b.domains.iter().map(|d| (d.name, d.terms)).collect(); assert_eq!(shape, vec![("", &[] as &[Term])]); // bool is none of the comparison-capable kinds. - assert!(!b.kind.is_int()); - assert!(!b.kind.is_temporal()); - assert!(!b.kind.is_text()); - assert_eq!(b.kind.as_bounded_int(), None); + assert!(!bf.kind.is_int()); + assert!(!bf.kind.is_temporal()); + assert!(!bf.kind.is_text()); + assert_eq!(bf.kind.as_bounded_int(), None); // is_eq_only() is true (no `_ord` domain), but the shape is strictly // smaller than eq-only — there is no `_eq` domain either, so it is // storage-only. @@ -614,7 +621,7 @@ mod catalog_tests { assert!(b.is_storage_only()); assert!(b.domain_by_name("eq").is_none()); // Both boolean plaintexts are present as fixtures. - assert_eq!(b.fixtures, &[Fixture::Bool(false), Fixture::Bool(true)]); + assert_eq!(bf.values, &[Fixture::Bool(false), Fixture::Bool(true)]); } #[test] @@ -634,7 +641,7 @@ mod catalog_tests { #[test] fn text_spec_is_in_catalog() { let text = scalar("text"); - assert_eq!(text.kind, ScalarKind::Text); + assert_eq!(fixtures("text").kind, ScalarKind::Text); let names: Vec<_> = text.domains.iter().map(|d| d.name).collect(); assert_eq!(names, vec!["", "eq", "match", "ord_ore", "ord", "search"]); } @@ -739,9 +746,8 @@ mod catalog_tests { /// analogue. #[test] fn temporal_fixtures_include_pivot_plaintexts() { - let date = scalar("date"); - let strings: Vec<&str> = date - .fixtures + let strings: Vec<&str> = fixtures("date") + .values .iter() .filter_map(|f| match f { Fixture::Date(s) => Some(*s), @@ -761,9 +767,8 @@ mod catalog_tests { /// `temporal_fixtures_include_pivot_plaintexts`. #[test] fn timestamptz_fixtures_include_pivot_plaintexts() { - let ts = scalar("timestamptz"); - let strings: Vec<&str> = ts - .fixtures + let strings: Vec<&str> = fixtures("timestamptz") + .values .iter() .filter_map(|f| match f { Fixture::Timestamptz(s) => Some(*s), @@ -856,14 +861,18 @@ mod catalog_tests { // The kind↔rust-type pairing for every integer scalar, generic over // CATALOG. Replaces the per-type `_maps_to_iNN` / `_rust_type` // restatements. - for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let expected = match s.name { + for rec in FIXTURES.iter().filter(|r| r.kind.is_int()) { + let expected = match rec.family.name { "int2" => ScalarKind::I16, "int4" => ScalarKind::I32, "int8" => ScalarKind::I64, other => panic!("unmapped integer scalar token {other}"), }; - assert_eq!(s.kind, expected, "{} maps to the wrong kind", s.name); + assert_eq!( + rec.kind, expected, + "{} maps to the wrong kind", + rec.family.name + ); } } @@ -885,29 +894,29 @@ mod values_tests { /// `check(&INTx, INTx_VALUES)` line, not a duplicated reference list. Subsumes /// the old per-type `_values_materialise_to_typed_array` references and /// `materialised_values_track_their_fixture_lists`. - fn check>(spec: &DomainFamily, values: &[T]) { + fn check>(rec: &TypeFixtures, values: &[T]) { assert_eq!( values.len(), - spec.fixtures.len(), + rec.values.len(), "{}: value count != fixture count", - spec.name + rec.family.name ); - for (i, (v, f)) in values.iter().zip(spec.fixtures).enumerate() { + for (i, (v, f)) in values.iter().zip(rec.values).enumerate() { assert_eq!( (*v).into(), - f.numeric_value(spec.kind) + f.numeric_value(rec.kind) .expect("integer scalar fixture resolves to a number"), "{}: value[{i}] does not match resolved fixture {f:?}", - spec.name + rec.family.name ); } } #[test] fn materialised_values_match_resolved_fixtures() { - check(&INT4, INT4_VALUES); - check(&INT2, INT2_VALUES); - check(&INT8, INT8_VALUES); + check(&INT4_FIXTURES, INT4_VALUES); + check(&INT2_FIXTURES, INT2_VALUES); + check(&INT8_FIXTURES, INT8_VALUES); } #[test] @@ -935,6 +944,7 @@ mod values_tests { #[test] fn text_values_match_fixtures_in_order() { let from_fixtures: Vec<&str> = TEXT_FIXTURES + .values .iter() .map(|f| match f { Fixture::Text(s) => *s, @@ -1002,6 +1012,13 @@ mod float_tests { .unwrap_or_else(|| panic!("{token} missing from CATALOG")) } + fn fixtures(token: &str) -> &'static TypeFixtures { + FIXTURES + .iter() + .find(|f| f.family.name == token) + .unwrap_or_else(|| panic!("{token} missing from FIXTURES")) + } + #[test] fn float_specs_are_in_catalog_with_ordered_shape() { for family_name in ["float4", "float8"] { @@ -1009,8 +1026,8 @@ mod float_tests { let names: Vec<_> = s.domains.iter().map(|d| d.name).collect(); assert_eq!(names, vec!["", "eq", "ord_ore", "ord"]); } - assert_eq!(scalar("float4").kind, ScalarKind::F32); - assert_eq!(scalar("float8").kind, ScalarKind::F64); + assert_eq!(fixtures("float4").kind, ScalarKind::F32); + assert_eq!(fixtures("float8").kind, ScalarKind::F64); } #[test] @@ -1036,9 +1053,8 @@ mod float_tests { #[test] fn float_fixtures_exclude_nan_and_negative_zero_and_include_infinities() { for family_name in ["float4", "float8"] { - let s = scalar(family_name); - let strings: Vec<&str> = s - .fixtures + let strings: Vec<&str> = fixtures(family_name) + .values .iter() .map(|f| match f { Fixture::Float(v) => *v, @@ -1076,9 +1092,8 @@ mod float_tests { #[test] fn float_fixtures_are_distinct_by_value() { for family_name in ["float4", "float8"] { - let s = scalar(family_name); - let parsed: Vec = s - .fixtures + let parsed: Vec = fixtures(family_name) + .values .iter() .map(|f| match f { Fixture::Float(v) => { @@ -1160,37 +1175,41 @@ mod invariant_tests { fn fixtures_include_min_max_and_zero() { // The MIN/MAX/ZERO pivots are an integer-kind invariant; non-integer // kinds (text/numeric/jsonb) have no such pivots. - for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let bk = s + for rec in FIXTURES.iter().filter(|r| r.kind.is_int()) { + let bk = rec .kind .as_bounded_int() .expect("loop is filtered to integer kinds"); - let resolved: Vec = s - .fixtures + let resolved: Vec = rec + .values .iter() - .filter_map(|f| f.numeric_value(s.kind)) + .filter_map(|f| f.numeric_value(rec.kind)) .collect(); assert!( resolved.contains(&bk.min_value()), "{} fixtures missing MIN", - s.name + rec.family.name ); assert!( resolved.contains(&bk.max_value()), "{} fixtures missing MAX", - s.name + rec.family.name + ); + assert!( + resolved.contains(&0), + "{} fixtures missing zero", + rec.family.name ); - assert!(resolved.contains(&0), "{} fixtures missing zero", s.name); } } #[test] fn fixture_values_are_distinct_by_resolved_number() { - for s in CATALOG { + for rec in FIXTURES { let mut seen: HashMap = HashMap::new(); - for f in s.fixtures { - if let Some(prev) = seen.insert(distinct_key(*f, s.kind), *f) { - panic!("{}: {f:?} duplicates {prev:?}", s.name); + for f in rec.values { + if let Some(prev) = seen.insert(distinct_key(*f, rec.kind), *f) { + panic!("{}: {f:?} duplicates {prev:?}", rec.family.name); } } } @@ -1221,20 +1240,20 @@ mod invariant_tests { #[test] fn every_fixture_value_is_within_kind_bounds() { // Asserts the resolved sentinels stay within bounds (integer kinds only). - for s in CATALOG.iter().filter(|s| s.kind.is_int()) { - let bk = s + for rec in FIXTURES.iter().filter(|r| r.kind.is_int()) { + let bk = rec .kind .as_bounded_int() .expect("loop is filtered to integer kinds"); let (lo, hi) = (bk.min_value(), bk.max_value()); - for f in s.fixtures { - let Some(n) = f.numeric_value(s.kind) else { + for f in rec.values { + let Some(n) = f.numeric_value(rec.kind) else { continue; }; assert!( n >= lo && n <= hi, "{}: fixture {f:?} resolves to {n}, out of range [{lo}, {hi}]", - s.name + rec.family.name ); } } diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index c072a4609..22dc38bbe 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -58,6 +58,10 @@ impl Parse for ScalarEntry { /// The `eql-domains::CATALOG` row for `token`, or a hard panic at macro-expansion /// time if the token is unknown — a dispatch-list entry must name a catalog type. +/// Now used only by the structural predicates (`is_eq_only_token`, +/// `is_storage_only_token`, `has_search_token`); the kind-predicates read the +/// native scalar kind from `fixtures_for_token` (it is no longer a `DomainFamily` +/// field). fn spec_for_token(token: &str) -> &'static eql_domains::DomainFamily { eql_domains::CATALOG .iter() @@ -65,12 +69,24 @@ fn spec_for_token(token: &str) -> &'static eql_domains::DomainFamily { .unwrap_or_else(|| panic!("scalar token `{token}` not in eql-domains::CATALOG")) } +/// The `eql-domains::FIXTURES` record for `token`, or a hard panic at +/// macro-expansion time if the token is unknown. The kind-predicates read the +/// native scalar kind from the fixture layer (it is no longer a `DomainFamily` +/// field); the structural predicates (`is_eq_only`, `is_storage_only`, +/// `has_search`) keep reading `spec_for_token`. +fn fixtures_for_token(token: &str) -> &'static eql_domains::TypeFixtures { + eql_domains::FIXTURES + .iter() + .find(|f| f.family.name == token) + .unwrap_or_else(|| panic!("scalar token `{token}` not in eql-domains::FIXTURES")) +} + /// True when `token`'s catalog kind is temporal (chrono-backed). Replaces the /// `[temporal]` marker: temporal scalars hand off their `impl ScalarType` to /// `temporal_values!` (so `emit_scalar_type_impls` skips them) and stamp the /// `temporal` fixture variant. fn is_temporal_token(token: &str) -> bool { - spec_for_token(token).kind.is_temporal() + fixtures_for_token(token).kind.is_temporal() } /// True when `token`'s catalog kind is a fixed-width integer (`int2`/`int4`/ @@ -80,7 +96,7 @@ fn is_temporal_token(token: &str) -> bool { /// non-integer kind (`date`, `text`) is hand-written in `scalar_domains.rs` and /// skipped by `scalar_type_impls_tokens`. fn is_int_token(token: &str) -> bool { - spec_for_token(token).kind.is_int() + fixtures_for_token(token).kind.is_int() } /// True when `token`'s catalog kind is `text` — an unbounded, owned-`String` @@ -90,7 +106,7 @@ fn is_int_token(token: &str) -> bool { /// generated payloads carry `bf`) and draws its values from the harness accessor /// (`text_values()`). Replaces the `[text]` marker. fn is_text_token(token: &str) -> bool { - spec_for_token(token).kind.is_text() + fixtures_for_token(token).kind.is_text() } /// True when `token`'s catalog row is the `numeric` kind (owned @@ -98,7 +114,10 @@ fn is_text_token(token: &str) -> bool { /// non-chrono, so it stamps the `numeric` fixture discriminator and draws its /// values from the harness accessor (`numeric_values()`). fn is_numeric_token(token: &str) -> bool { - matches!(spec_for_token(token).kind, eql_domains::ScalarKind::Numeric) + matches!( + fixtures_for_token(token).kind, + eql_domains::ScalarKind::Numeric + ) } /// True when `token`'s catalog row is an IEEE-754 float kind (`F32`/`F64`). @@ -107,7 +126,7 @@ fn is_numeric_token(token: &str) -> bool { /// (`float4_values()` / `float8_values()`). fn is_float_token(token: &str) -> bool { matches!( - spec_for_token(token).kind, + fixtures_for_token(token).kind, eql_domains::ScalarKind::F32 | eql_domains::ScalarKind::F64 ) } @@ -709,8 +728,11 @@ mod tests { } #[test] - #[should_panic(expected = "not in eql-domains::CATALOG")] + #[should_panic(expected = "not in eql-domains::FIXTURES")] fn unknown_token_fails_loudly() { + // `is_temporal_token` reads the native scalar kind from the fixture + // layer, so an unknown token now fails loudly via the `FIXTURES` lookup + // (the structural predicates still fail via `CATALOG` / `spec_for_token`). is_temporal_token("nonesuch"); } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index c1dcf1915..37e71ffb7 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -258,7 +258,7 @@ macro_rules! temporal_values { static $cell: std::sync::LazyLock> = std::sync::LazyLock::new(|| { let parse: fn(&str) -> $ty = $parse; $spec - .fixtures + .values .iter() .map(|f| match f { ::eql_domains::Fixture::$variant(s) => parse(s), @@ -308,7 +308,7 @@ macro_rules! temporal_values { #[test] fn values_match_catalog_fixtures() { let parse: fn(&str) -> $ty = $parse; - let want: Vec<$ty> = $spec.fixtures.iter().map(|f| match f { + let want: Vec<$ty> = $spec.values.iter().map(|f| match f { ::eql_domains::Fixture::$variant(s) => parse(s), other => panic!("non-{} fixture: {:?}", $pg, other), }).collect(); @@ -357,7 +357,7 @@ macro_rules! lazy_values { ) => { static $cell: std::sync::LazyLock> = std::sync::LazyLock::new(|| { let parse: fn(&::eql_domains::Fixture) -> $ty = $parse; - $spec.fixtures.iter().map(parse).collect() + $spec.values.iter().map(parse).collect() }); #[doc = concat!("Typed `", stringify!($ty), "` fixtures for `", $pg, "`, materialised once from the catalog.")] @@ -377,7 +377,7 @@ temporal_values! { cell = DATE_VALUES_CELL, accessor = date_values, rust_type = chrono::NaiveDate, - spec = eql_domains::DATE, + spec = eql_domains::DATE_FIXTURES, variant = Date, pg_type = "date", parse = |s| chrono::NaiveDate::parse_from_str(s, "%Y-%m-%d") @@ -395,7 +395,7 @@ temporal_values! { cell = TIMESTAMPTZ_VALUES_CELL, accessor = timestamptz_values, rust_type = chrono::DateTime, - spec = eql_domains::TIMESTAMPTZ, + spec = eql_domains::TIMESTAMPTZ_FIXTURES, variant = Timestamptz, pg_type = "timestamptz", parse = |s| chrono::DateTime::parse_from_rfc3339(s) @@ -475,7 +475,7 @@ lazy_values! { cell = TEXT_VALUES_CELL, accessor = text_values, rust_type = String, - spec = eql_domains::TEXT, + spec = eql_domains::TEXT_FIXTURES, variant = Text, pg_type = "text", parse = |f| match f { @@ -553,7 +553,7 @@ lazy_values! { cell = NUMERIC_VALUES_CELL, accessor = numeric_values, rust_type = rust_decimal::Decimal, - spec = eql_domains::NUMERIC, + spec = eql_domains::NUMERIC_FIXTURES, variant = Numeric, pg_type = "numeric", parse = |f| match f { @@ -641,8 +641,8 @@ mod numeric_value_guards { /// order (`[false, true]`). Public so the `eql_v3_bool` fixture module (emitted /// by `scalar_types!(fixture_modules)`) can hand the slice to `scalar_fixture!`. static BOOL_VALUES_CELL: std::sync::LazyLock> = std::sync::LazyLock::new(|| { - eql_domains::BOOL - .fixtures + eql_domains::BOOL_FIXTURES + .values .iter() .map(|f| match f { eql_domains::Fixture::Bool(b) => *b, @@ -881,7 +881,7 @@ lazy_values! { cell = FLOAT4_VALUES_CELL, accessor = float4_values, rust_type = F4, - spec = eql_domains::FLOAT4, + spec = eql_domains::FLOAT4_FIXTURES, variant = Float, pg_type = "float4", parse = |f| match f { @@ -896,7 +896,7 @@ lazy_values! { cell = FLOAT8_VALUES_CELL, accessor = float8_values, rust_type = F8, - spec = eql_domains::FLOAT8, + spec = eql_domains::FLOAT8_FIXTURES, variant = Float, pg_type = "float8", parse = |f| match f { @@ -989,8 +989,8 @@ mod float_value_guards { fn float4_values_match_catalog_and_are_finite_non_negative_zero() { let vals = float4_values(); // Parsed from the catalog, in order. - let want: Vec = eql_domains::FLOAT4 - .fixtures + let want: Vec = eql_domains::FLOAT4_FIXTURES + .values .iter() .map(|f| match f { eql_domains::Fixture::Float(s) => F4(s.parse().unwrap()), @@ -1009,8 +1009,8 @@ mod float_value_guards { #[test] fn float8_values_match_catalog_and_are_finite_non_negative_zero() { let vals = float8_values(); - let want: Vec = eql_domains::FLOAT8 - .fixtures + let want: Vec = eql_domains::FLOAT8_FIXTURES + .values .iter() .map(|f| match f { eql_domains::Fixture::Float(s) => F8(s.parse().unwrap()), From 1b5a74c96eab75bf73830f92d166d5d7c7852d8a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 13:51:05 +1000 Subject: [PATCH 370/599] =?UTF-8?q?test(eql-domains):=20address=20PR=20rev?= =?UTF-8?q?iew=20=E2=80=94=20str=5Feq=20unit=20test,=20catalog-wide=20kind?= =?UTF-8?q?=20guard,=20doc=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add str_eq_tests::str_eq_matches_iff_byte_identical: the parity guard's only new logic was exercised solely on the matching path against aligned data, so a str_eq bug (true on length-equal-but-differing bytes) would silently neuter it. Pin equal/length-diff/one-byte-diff cases. (#2) - Add catalog_tests::every_record_kind_matches_its_family: a catalog-wide family.name -> kind guard over EVERY record (the parity block checks only name+length, so a swapped kind like { family: &INT8, kind: I16 } would otherwise pass). Extends the int-only test to all 10 kinds. (#1) - Align ScalarKind::Timestamptz doc with Date: accessors are unreachable by construction (as_bounded_int() -> None), not 'panic'. (#3) --- crates/eql-domains/src/fixtures/kind.rs | 10 ++++--- crates/eql-domains/src/fixtures/record.rs | 25 ++++++++++++++++++ crates/eql-domains/src/tests.rs | 32 +++++++++++++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/crates/eql-domains/src/fixtures/kind.rs b/crates/eql-domains/src/fixtures/kind.rs index e87375afb..818bc1e0b 100644 --- a/crates/eql-domains/src/fixtures/kind.rs +++ b/crates/eql-domains/src/fixtures/kind.rs @@ -42,10 +42,12 @@ pub enum ScalarKind { Date, /// UTC timestamp (`chrono::DateTime`). Ordered like the integer kinds /// via ORE, but string-backed (RFC3339) at the catalog layer and with no - /// i128 range — so it is *not* `is_int()` and the bounded-numeric accessors - /// panic for it, exactly like the other non-integer kinds. UTC-normalized: - /// cipherstash has no tz-preserving type, so it maps to the `timestamp` - /// cast and the SQL `timestamp with time zone` plaintext type. + /// i128 range — so it is *not* `is_int()` and `as_bounded_int()` returns + /// `None` for it, like the other non-integer kinds. The bounded-numeric + /// accessors live on `BoundedIntKind`, which `Timestamptz` cannot be, so they + /// are unreachable for it by construction rather than by a runtime panic. + /// UTC-normalized: cipherstash has no tz-preserving type, so it maps to the + /// `timestamp` cast and the SQL `timestamp with time zone` plaintext type. Timestamptz, /// Boolean (`bool`). **Encryption-only / storage-only**: it carries no index /// term and is *not* `is_int()`/`is_temporal()`/`is_text()`. A two-value diff --git a/crates/eql-domains/src/fixtures/record.rs b/crates/eql-domains/src/fixtures/record.rs index eaf11d538..fc8006b99 100644 --- a/crates/eql-domains/src/fixtures/record.rs +++ b/crates/eql-domains/src/fixtures/record.rs @@ -185,3 +185,28 @@ const _: () = { i += 1; } }; + +#[cfg(test)] +mod str_eq_tests { + use super::str_eq; + + /// `str_eq` is the sole new logic the compile-time parity guard relies on, + /// and the guard only ever exercises the *matching* path against the real + /// (aligned) `CATALOG`/`FIXTURES`. A bug in `str_eq` that returned `true` for + /// differing bytes would silently neuter the guard, so pin its behaviour + /// directly: equal strings match; any length or byte difference does not. + #[test] + fn str_eq_matches_iff_byte_identical() { + assert!(str_eq("", "")); + assert!(str_eq("ab", "ab")); + assert!(str_eq("int4", "int4")); + // Differing length. + assert!(!str_eq("a", "ab")); + assert!(!str_eq("ab", "a")); + assert!(!str_eq("", "a")); + // Same length, one byte differs (the path that would neuter the guard). + assert!(!str_eq("a", "b")); + assert!(!str_eq("int4", "int8")); + assert!(!str_eq("date", "bate")); + } +} diff --git a/crates/eql-domains/src/tests.rs b/crates/eql-domains/src/tests.rs index c535c79c7..708923e70 100644 --- a/crates/eql-domains/src/tests.rs +++ b/crates/eql-domains/src/tests.rs @@ -876,6 +876,38 @@ mod catalog_tests { } } + /// Catalog-wide `family.name` ↔ `kind` guard over EVERY record, not just the + /// integer ones. `TypeFixtures` carries `family` and `kind` as independent + /// fields, and the compile-time parity block checks only `family.name` + + /// length — so `TypeFixtures { family: &INT8, kind: I16, .. }` would compile + /// and the parity block would pass. This test is the single guard that binds + /// every record's `kind` to the kind its family is supposed to map onto, for + /// all kinds (the non-integer kinds are otherwise only checked by individual + /// `*_spec` tests). A mismatched or swapped `kind` fails here. + #[test] + fn every_record_kind_matches_its_family() { + for rec in FIXTURES { + let expected = match rec.family.name { + "int2" => ScalarKind::I16, + "int4" => ScalarKind::I32, + "int8" => ScalarKind::I64, + "date" => ScalarKind::Date, + "timestamptz" => ScalarKind::Timestamptz, + "numeric" => ScalarKind::Numeric, + "text" => ScalarKind::Text, + "bool" => ScalarKind::Bool, + "float4" => ScalarKind::F32, + "float8" => ScalarKind::F64, + other => panic!("unmapped scalar token {other} in FIXTURES"), + }; + assert_eq!( + rec.kind, expected, + "{} record carries the wrong kind", + rec.family.name + ); + } + } + #[test] fn domain_name_concatenates_token_and_suffix() { let s = scalar("int4"); From e7beb228ab8382e6e1b0d90fbd8a8071217a27ce Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 14:22:53 +1000 Subject: [PATCH 371/599] refactor(eql-domains): bind TypeFixtures.kind to its family at compile time Address PR review: - Hoist the family.name <-> kind invariant into the compile-time parity block (kind_tag/expected_kind in fixtures/record.rs) so a mismatched TypeFixtures.kind fails the eql-domains build before any consumer (incl. eql-tests-macros expansion) reads FIXTURES; keep the runtime test as a secondary safety net. - Make the ScalarKind/BoundedIntKind non-integer-kind docs exhaustive (add Timestamptz/Bool/F32/F64; fix stale ORE-orderability wording). - Fix stale BOOL.fixtures -> BOOL_FIXTURES.values doc comment. --- crates/eql-domains/src/fixtures/kind.rs | 19 +++--- crates/eql-domains/src/fixtures/record.rs | 70 +++++++++++++++++++++-- crates/eql-domains/src/tests.rs | 13 ++--- tests/sqlx/src/scalar_domains.rs | 2 +- 4 files changed, 82 insertions(+), 22 deletions(-) diff --git a/crates/eql-domains/src/fixtures/kind.rs b/crates/eql-domains/src/fixtures/kind.rs index 818bc1e0b..5472cabc7 100644 --- a/crates/eql-domains/src/fixtures/kind.rs +++ b/crates/eql-domains/src/fixtures/kind.rs @@ -4,11 +4,12 @@ /// The fixed-width integer kinds — exactly those scalar kinds with an `i128` /// range and `MIN`/`MAX`/`Zero` sentinels. These accessors are **total**: every -/// variant answers every method. Non-integer kinds (`Numeric`/`Text`/`Jsonb`/ -/// `Date`) are simply not representable here, so there is no partial function to -/// panic — `ScalarKind::Date` cannot call `min_symbol()` because `Date` is not a -/// `BoundedIntKind`. Reach this type from a `ScalarKind` via -/// [`ScalarKind::as_bounded_int`]. (Accessors are impl'd below.) +/// variant answers every method. The non-integer kinds (`Numeric`/`Text`/ +/// `Jsonb`/`Date`/`Timestamptz`/`Bool`/`F32`/`F64`) are simply not representable +/// here, so there is no partial function to panic — `ScalarKind::Date` cannot +/// call `min_symbol()` because `Date` is not a `BoundedIntKind`. Reach this type +/// from a `ScalarKind` via [`ScalarKind::as_bounded_int`]. (Accessors are impl'd +/// below.) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum BoundedIntKind { I16, @@ -16,9 +17,11 @@ pub enum BoundedIntKind { I64, } -/// The native scalar a domain type maps onto. Integer kinds carry i128 bounds; -/// the others (`Numeric`/`Text`/`Jsonb`) have string fixtures and no numeric -/// range — though `Numeric`/`Text` are still ORE-orderable, only `Jsonb` is not. +/// The native scalar a domain type maps onto. The integer kinds (`I16`/`I32`/ +/// `I64`) carry i128 bounds; the non-integer kinds (`Numeric`/`Text`/`Jsonb`/ +/// `Date`/`Timestamptz`/`Bool`/`F32`/`F64`) have no i128 range and string- or +/// bool-backed fixtures. All but `Jsonb` and `Bool` are still ORE-orderable — +/// `Jsonb` has no order, and `Bool` is storage-only (no comparison surface). /// Capability layer only: `CATALOG` declares which kinds actually exist. /// /// The bounded-numeric accessors live on the total [`BoundedIntKind`], reached diff --git a/crates/eql-domains/src/fixtures/record.rs b/crates/eql-domains/src/fixtures/record.rs index fc8006b99..e8a367b6f 100644 --- a/crates/eql-domains/src/fixtures/record.rs +++ b/crates/eql-domains/src/fixtures/record.rs @@ -162,14 +162,68 @@ const fn str_eq(a: &str, b: &str) -> bool { true } +/// A stable `u8` tag per `ScalarKind`, so two kinds can be compared in `const` +/// context (`PartialEq` is not `const fn` on stable). Only the parity block's +/// `family.name` ↔ `kind` binding consumes this. +const fn kind_tag(kind: ScalarKind) -> u8 { + match kind { + ScalarKind::I16 => 0, + ScalarKind::I32 => 1, + ScalarKind::I64 => 2, + ScalarKind::Numeric => 3, + ScalarKind::Text => 4, + ScalarKind::Jsonb => 5, + ScalarKind::Date => 6, + ScalarKind::Timestamptz => 7, + ScalarKind::Bool => 8, + ScalarKind::F32 => 9, + ScalarKind::F64 => 10, + } +} + +/// The native scalar each catalog family is supposed to map onto, keyed by +/// `family.name`. The single source the parity block uses to bind every +/// `TypeFixtures.kind` to its family at build time. An unmapped name is a +/// const-eval panic, so a new scalar type cannot be added without naming its +/// expected kind here. +const fn expected_kind(name: &str) -> ScalarKind { + if str_eq(name, "int2") { + ScalarKind::I16 + } else if str_eq(name, "int4") { + ScalarKind::I32 + } else if str_eq(name, "int8") { + ScalarKind::I64 + } else if str_eq(name, "date") { + ScalarKind::Date + } else if str_eq(name, "timestamptz") { + ScalarKind::Timestamptz + } else if str_eq(name, "numeric") { + ScalarKind::Numeric + } else if str_eq(name, "text") { + ScalarKind::Text + } else if str_eq(name, "bool") { + ScalarKind::Bool + } else if str_eq(name, "float4") { + ScalarKind::F32 + } else if str_eq(name, "float8") { + ScalarKind::F64 + } else { + panic!("unmapped scalar token in expected_kind — name its kind here") + } +} + /// Compile-time parity guard: `FIXTURES` must mirror `CATALOG` exactly, in -/// order. This is the build-time invariant that REPLACES `DomainFamily`'s old +/// order, AND every record's `kind` must match the kind its family maps onto. +/// This is the build-time invariant that REPLACES `DomainFamily`'s old /// compiler-enforced `kind`/`fixtures` fields — every catalog row has exactly -/// one fixture record and vice-versa, same order. As a `const` item it is -/// const-evaluated on every `cargo build`: a missing, extra, or misaligned -/// `TypeFixtures` fails the build with `error[E0080]: evaluation panicked` -/// carrying the message below — it cannot be `#[cfg]`-gated away or skipped by a -/// test filter. It proves NAME + ORDERING coverage only; fixture-VALUE +/// one fixture record and vice-versa, same order, with the right `kind`. As a +/// `const` item it is const-evaluated on every `cargo build`: a missing, extra, +/// or misaligned `TypeFixtures`, or one carrying the wrong `kind` (e.g. +/// `TypeFixtures { family: &INT8, kind: I16, .. }`), fails the build with +/// `error[E0080]: evaluation panicked` carrying the message below — it cannot be +/// `#[cfg]`-gated away or skipped by a test filter, so the `kind` mismatch is +/// caught before any consumer (including `eql-tests-macros` expansion) sees +/// `FIXTURES`. It proves NAME + ORDERING + KIND coverage; fixture-VALUE /// correctness is gated by the in-crate value/invariant tests, not here. const _: () = { assert!( @@ -182,6 +236,10 @@ const _: () = { str_eq(crate::CATALOG[i].name, FIXTURES[i].family.name), "FIXTURES must mirror CATALOG in order: name mismatch at this index" ); + assert!( + kind_tag(FIXTURES[i].kind) == kind_tag(expected_kind(FIXTURES[i].family.name)), + "TypeFixtures.kind does not match the kind its family maps onto" + ); i += 1; } }; diff --git a/crates/eql-domains/src/tests.rs b/crates/eql-domains/src/tests.rs index 708923e70..8b41ac733 100644 --- a/crates/eql-domains/src/tests.rs +++ b/crates/eql-domains/src/tests.rs @@ -877,13 +877,12 @@ mod catalog_tests { } /// Catalog-wide `family.name` ↔ `kind` guard over EVERY record, not just the - /// integer ones. `TypeFixtures` carries `family` and `kind` as independent - /// fields, and the compile-time parity block checks only `family.name` + - /// length — so `TypeFixtures { family: &INT8, kind: I16, .. }` would compile - /// and the parity block would pass. This test is the single guard that binds - /// every record's `kind` to the kind its family is supposed to map onto, for - /// all kinds (the non-integer kinds are otherwise only checked by individual - /// `*_spec` tests). A mismatched or swapped `kind` fails here. + /// integer ones. The primary binding is now the compile-time parity block in + /// `fixtures/record.rs` (`kind_tag(FIXTURES[i].kind) == expected_kind(..)`), + /// which fails the build before any consumer sees a record carrying the wrong + /// `kind` (e.g. `TypeFixtures { family: &INT8, kind: I16, .. }`). This test is + /// the secondary safety net: an independent restatement of the same mapping, + /// so a regression in the const guard's helpers is still caught here. #[test] fn every_record_kind_matches_its_family() { for rec in FIXTURES { diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 37e71ffb7..19d017f9e 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -685,7 +685,7 @@ impl ScalarType for bool { mod bool_value_tests { use super::*; - /// The harness value list matches the catalog `BOOL.fixtures` and carries + /// The harness value list matches the catalog `BOOL_FIXTURES.values` and carries /// both boolean values — the oracle cannot drift from the catalog the fixture /// generator encrypts. #[test] From cc4b63ebb2e0ed30b1fc075d5eb50f598c807c32 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 16:52:45 +1000 Subject: [PATCH 372/599] feat(eql-bindings): upgrade schemars 0.8 -> 1.x (JSON Schema 2020-12) Migrate the two manual JsonSchema impls (SchemaVersion const:2, BloomFilter i16 bounds) to the 1.x json_schema! macro API, the DomainType::schema return type RootSchema -> schemars::Schema, and the schema-inspecting catalog_parity assertions to the 2020-12 shape ($defs, $ref carries description as a sibling). Regenerate schema/v3/*.json as 2020-12. Wire contract (required, strictness, const:2, i16 bounds) unchanged; ts-rs .ts bindings unchanged. --- Cargo.lock | 9 +-- crates/eql-bindings/Cargo.toml | 2 +- crates/eql-bindings/schema/v3/bool.json | 36 ++++------ crates/eql-bindings/schema/v3/date.json | 36 ++++------ crates/eql-bindings/schema/v3/date_eq.json | 46 +++++-------- crates/eql-bindings/schema/v3/date_ord.json | 46 +++++-------- .../eql-bindings/schema/v3/date_ord_ore.json | 46 +++++-------- crates/eql-bindings/schema/v3/float4.json | 36 ++++------ crates/eql-bindings/schema/v3/float4_eq.json | 46 +++++-------- crates/eql-bindings/schema/v3/float4_ord.json | 46 +++++-------- .../schema/v3/float4_ord_ore.json | 46 +++++-------- crates/eql-bindings/schema/v3/float8.json | 36 ++++------ crates/eql-bindings/schema/v3/float8_eq.json | 46 +++++-------- crates/eql-bindings/schema/v3/float8_ord.json | 46 +++++-------- .../schema/v3/float8_ord_ore.json | 46 +++++-------- crates/eql-bindings/schema/v3/int2.json | 36 ++++------ crates/eql-bindings/schema/v3/int2_eq.json | 46 +++++-------- crates/eql-bindings/schema/v3/int2_ord.json | 46 +++++-------- .../eql-bindings/schema/v3/int2_ord_ore.json | 46 +++++-------- crates/eql-bindings/schema/v3/int4.json | 36 ++++------ crates/eql-bindings/schema/v3/int4_eq.json | 46 +++++-------- crates/eql-bindings/schema/v3/int4_ord.json | 46 +++++-------- .../eql-bindings/schema/v3/int4_ord_ore.json | 50 +++++--------- crates/eql-bindings/schema/v3/int8.json | 36 ++++------ crates/eql-bindings/schema/v3/int8_eq.json | 46 +++++-------- crates/eql-bindings/schema/v3/int8_ord.json | 46 +++++-------- .../eql-bindings/schema/v3/int8_ord_ore.json | 46 +++++-------- crates/eql-bindings/schema/v3/numeric.json | 36 ++++------ crates/eql-bindings/schema/v3/numeric_eq.json | 46 +++++-------- .../eql-bindings/schema/v3/numeric_ord.json | 46 +++++-------- .../schema/v3/numeric_ord_ore.json | 46 +++++-------- crates/eql-bindings/schema/v3/text.json | 36 ++++------ crates/eql-bindings/schema/v3/text_eq.json | 46 +++++-------- crates/eql-bindings/schema/v3/text_match.json | 48 +++++--------- crates/eql-bindings/schema/v3/text_ord.json | 56 +++++----------- .../eql-bindings/schema/v3/text_ord_ore.json | 56 +++++----------- .../eql-bindings/schema/v3/text_search.json | 66 ++++++------------- .../eql-bindings/schema/v3/timestamptz.json | 36 ++++------ .../schema/v3/timestamptz_eq.json | 46 +++++-------- .../schema/v3/timestamptz_ord.json | 46 +++++-------- .../schema/v3/timestamptz_ord_ore.json | 46 +++++-------- crates/eql-bindings/src/lib.rs | 31 ++++----- crates/eql-bindings/src/v3/bool.rs | 4 +- crates/eql-bindings/src/v3/date.rs | 10 +-- crates/eql-bindings/src/v3/float4.rs | 10 +-- crates/eql-bindings/src/v3/float8.rs | 10 +-- crates/eql-bindings/src/v3/int2.rs | 10 +-- crates/eql-bindings/src/v3/int4.rs | 10 +-- crates/eql-bindings/src/v3/int8.rs | 10 +-- crates/eql-bindings/src/v3/mod.rs | 6 +- crates/eql-bindings/src/v3/numeric.rs | 10 +-- crates/eql-bindings/src/v3/terms.rs | 59 ++++++----------- crates/eql-bindings/src/v3/text.rs | 14 ++-- crates/eql-bindings/src/v3/timestamptz.rs | 10 +-- crates/eql-bindings/tests/catalog_parity.rs | 23 +++---- 55 files changed, 672 insertions(+), 1296 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6e8969f29..f8e31d80c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3419,11 +3419,12 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.22" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", + "ref-cast", "schemars_derive", "serde", "serde_json", @@ -3431,9 +3432,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.22" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" dependencies = [ "proc-macro2", "quote", diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index ebec21b63..e7e84325a 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -10,7 +10,7 @@ serde = { version = "1", features = ["derive"] } # impl pins `const: 2` via serde_json::json!. serde_json = "1" ts-rs = "10" -schemars = "0.8" +schemars = "1" [dev-dependencies] # Parity oracle: tests/catalog_parity.rs asserts the v3 domain inventory diff --git a/crates/eql-bindings/schema/v3/bool.json b/crates/eql-bindings/schema/v3/bool.json index bcbad6546..f60fbe16a 100644 --- a/crates/eql-bindings/schema/v3/bool.json +++ b/crates/eql-bindings/schema/v3/bool.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/bool.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/bool.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.bool` — storage only / encryption-only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Bool", "type": "object" diff --git a/crates/eql-bindings/schema/v3/date.json b/crates/eql-bindings/schema/v3/date.json index 706e4b566..2b98d521b 100644 --- a/crates/eql-bindings/schema/v3/date.json +++ b/crates/eql-bindings/schema/v3/date.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/date.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/date.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.date` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Date", "type": "object" diff --git a/crates/eql-bindings/schema/v3/date_eq.json b/crates/eql-bindings/schema/v3/date_eq.json index d7cf20d1b..6d87ca62f 100644 --- a/crates/eql-bindings/schema/v3/date_eq.json +++ b/crates/eql-bindings/schema/v3/date_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.date_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "DateEq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/date_ord.json b/crates/eql-bindings/schema/v3/date_ord.json index 90bbfbfce..57d58b312 100644 --- a/crates/eql-bindings/schema/v3/date_ord.json +++ b/crates/eql-bindings/schema/v3/date_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term. Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "DateOrd", "type": "object" diff --git a/crates/eql-bindings/schema/v3/date_ord_ore.json b/crates/eql-bindings/schema/v3/date_ord_ore.json index 9c4da4bd0..8b4b3a593 100644 --- a/crates/eql-bindings/schema/v3/date_ord_ore.json +++ b/crates/eql-bindings/schema/v3/date_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.date_ord_ore` — full comparison, scheme-explicit name.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term. Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "DateOrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float4.json b/crates/eql-bindings/schema/v3/float4.json index 747728d8a..32943f12a 100644 --- a/crates/eql-bindings/schema/v3/float4.json +++ b/crates/eql-bindings/schema/v3/float4.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float4.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float4.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float4` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Float4", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float4_eq.json b/crates/eql-bindings/schema/v3/float4_eq.json index e81332781..3dc29efcd 100644 --- a/crates/eql-bindings/schema/v3/float4_eq.json +++ b/crates/eql-bindings/schema/v3/float4_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float4_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float4_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float4_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "Float4Eq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float4_ord.json b/crates/eql-bindings/schema/v3/float4_ord.json index 76d06d29e..0fd6f1d34 100644 --- a/crates/eql-bindings/schema/v3/float4_ord.json +++ b/crates/eql-bindings/schema/v3/float4_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (8 blocks for float). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Float4Ord", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float4_ord_ore.json b/crates/eql-bindings/schema/v3/float4_ord_ore.json index 1ecbcb1e3..ef776d7e8 100644 --- a/crates/eql-bindings/schema/v3/float4_ord_ore.json +++ b/crates/eql-bindings/schema/v3/float4_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float4_ord_ore` — full comparison, scheme-explicit name.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (8 blocks for float). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Float4OrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float8.json b/crates/eql-bindings/schema/v3/float8.json index 671d7996e..4a5275039 100644 --- a/crates/eql-bindings/schema/v3/float8.json +++ b/crates/eql-bindings/schema/v3/float8.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float8.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float8.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float8` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Float8", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float8_eq.json b/crates/eql-bindings/schema/v3/float8_eq.json index a83bfa1ca..203c218ab 100644 --- a/crates/eql-bindings/schema/v3/float8_eq.json +++ b/crates/eql-bindings/schema/v3/float8_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float8_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float8_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float8_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "Float8Eq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float8_ord.json b/crates/eql-bindings/schema/v3/float8_ord.json index 2753c67cb..416c036cb 100644 --- a/crates/eql-bindings/schema/v3/float8_ord.json +++ b/crates/eql-bindings/schema/v3/float8_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (8 blocks for float). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Float8Ord", "type": "object" diff --git a/crates/eql-bindings/schema/v3/float8_ord_ore.json b/crates/eql-bindings/schema/v3/float8_ord_ore.json index ea2153a74..f58bc39c2 100644 --- a/crates/eql-bindings/schema/v3/float8_ord_ore.json +++ b/crates/eql-bindings/schema/v3/float8_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.float8_ord_ore` — full comparison, scheme-explicit name.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (8 blocks for float). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Float8OrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int2.json b/crates/eql-bindings/schema/v3/int2.json index 118cfbf2d..c27fc54fd 100644 --- a/crates/eql-bindings/schema/v3/int2.json +++ b/crates/eql-bindings/schema/v3/int2.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int2.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int2.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int2` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Int2", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int2_eq.json b/crates/eql-bindings/schema/v3/int2_eq.json index 2b3616d7f..96a26d0bc 100644 --- a/crates/eql-bindings/schema/v3/int2_eq.json +++ b/crates/eql-bindings/schema/v3/int2_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int2_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int2_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int2_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "Int2Eq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int2_ord.json b/crates/eql-bindings/schema/v3/int2_ord.json index bb851fc09..4678285b3 100644 --- a/crates/eql-bindings/schema/v3/int2_ord.json +++ b/crates/eql-bindings/schema/v3/int2_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term. Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Int2Ord", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int2_ord_ore.json b/crates/eql-bindings/schema/v3/int2_ord_ore.json index 14782a109..5d465c043 100644 --- a/crates/eql-bindings/schema/v3/int2_ord_ore.json +++ b/crates/eql-bindings/schema/v3/int2_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int2_ord_ore` — full comparison, scheme-explicit name.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term. Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Int2OrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int4.json b/crates/eql-bindings/schema/v3/int4.json index 4e8506272..6795e6620 100644 --- a/crates/eql-bindings/schema/v3/int4.json +++ b/crates/eql-bindings/schema/v3/int4.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int4.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int4.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int4` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Int4", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int4_eq.json b/crates/eql-bindings/schema/v3/int4_eq.json index cf88e7f7d..dbc45c0d2 100644 --- a/crates/eql-bindings/schema/v3/int4_eq.json +++ b/crates/eql-bindings/schema/v3/int4_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int4_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int4_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int4_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "Int4Eq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int4_ord.json b/crates/eql-bindings/schema/v3/int4_ord.json index 5eb0b7eca..9cc352ba6 100644 --- a/crates/eql-bindings/schema/v3/int4_ord.json +++ b/crates/eql-bindings/schema/v3/int4_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term. Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Int4Ord", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int4_ord_ore.json b/crates/eql-bindings/schema/v3/int4_ord_ore.json index 326d2688b..24d6e8877 100644 --- a/crates/eql-bindings/schema/v3/int4_ord_ore.json +++ b/crates/eql-bindings/schema/v3/int4_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, - "description": "`eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain.", + "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`),\nscheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], - "description": "Block-ORE order term. Serves equality too — ORE over a full-domain `int4` is lossless, so no separate `hm` is carried." + "$ref": "#/$defs/OreBlock256", + "description": "Block-ORE order term. Serves equality too — ORE over a\nfull-domain `int4` is lossless, so no separate `hm` is carried." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Int4OrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int8.json b/crates/eql-bindings/schema/v3/int8.json index be50c73b5..12555a6c9 100644 --- a/crates/eql-bindings/schema/v3/int8.json +++ b/crates/eql-bindings/schema/v3/int8.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int8.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int8.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int8` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Int8", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int8_eq.json b/crates/eql-bindings/schema/v3/int8_eq.json index 3a7d30424..ea34847b0 100644 --- a/crates/eql-bindings/schema/v3/int8_eq.json +++ b/crates/eql-bindings/schema/v3/int8_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int8_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int8_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int8_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "Int8Eq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int8_ord.json b/crates/eql-bindings/schema/v3/int8_ord.json index b3146c347..e65dd149d 100644 --- a/crates/eql-bindings/schema/v3/int8_ord.json +++ b/crates/eql-bindings/schema/v3/int8_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term. Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Int8Ord", "type": "object" diff --git a/crates/eql-bindings/schema/v3/int8_ord_ore.json b/crates/eql-bindings/schema/v3/int8_ord_ore.json index 4c14eb987..ea6d88fde 100644 --- a/crates/eql-bindings/schema/v3/int8_ord_ore.json +++ b/crates/eql-bindings/schema/v3/int8_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.int8_ord_ore` — full comparison, scheme-explicit name.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term. Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "Int8OrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/numeric.json b/crates/eql-bindings/schema/v3/numeric.json index c89d356f7..f12015dcd 100644 --- a/crates/eql-bindings/schema/v3/numeric.json +++ b/crates/eql-bindings/schema/v3/numeric.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/numeric.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.numeric` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Numeric", "type": "object" diff --git a/crates/eql-bindings/schema/v3/numeric_eq.json b/crates/eql-bindings/schema/v3/numeric_eq.json index 8cfc98c83..19c11a2b5 100644 --- a/crates/eql-bindings/schema/v3/numeric_eq.json +++ b/crates/eql-bindings/schema/v3/numeric_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.numeric_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "NumericEq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/numeric_ord.json b/crates/eql-bindings/schema/v3/numeric_ord.json index f4d6571b1..64ca517eb 100644 --- a/crates/eql-bindings/schema/v3/numeric_ord.json +++ b/crates/eql-bindings/schema/v3/numeric_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.numeric_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (14 blocks for numeric). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "NumericOrd", "type": "object" diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ore.json b/crates/eql-bindings/schema/v3/numeric_ord_ore.json index 748b2ba62..3a2aad720 100644 --- a/crates/eql-bindings/schema/v3/numeric_ord_ore.json +++ b/crates/eql-bindings/schema/v3/numeric_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.numeric_ord_ore` — full comparison, scheme-explicit name.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (14 blocks for numeric). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "NumericOrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/text.json b/crates/eql-bindings/schema/v3/text.json index 4b4e34d95..a045b2caf 100644 --- a/crates/eql-bindings/schema/v3/text.json +++ b/crates/eql-bindings/schema/v3/text.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/text.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/text.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.text` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Text", "type": "object" diff --git a/crates/eql-bindings/schema/v3/text_eq.json b/crates/eql-bindings/schema/v3/text_eq.json index 71a0f15e0..40d452fd5 100644 --- a/crates/eql-bindings/schema/v3/text_eq.json +++ b/crates/eql-bindings/schema/v3/text_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.text_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "TextEq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/text_match.json b/crates/eql-bindings/schema/v3/text_match.json index cedacf786..98c772c40 100644 --- a/crates/eql-bindings/schema/v3/text_match.json +++ b/crates/eql-bindings/schema/v3/text_match.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "BloomFilter": { "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", "items": { "format": "int16", - "maximum": 32767.0, - "minimum": -32768.0, + "maximum": 32767, + "minimum": -32768, "type": "integer" }, "type": "array" @@ -31,8 +28,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -42,46 +39,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.text_match` — Bloom-filter containment match.", "properties": { "bf": { - "allOf": [ - { - "$ref": "#/definitions/BloomFilter" - } - ], + "$ref": "#/$defs/BloomFilter", "description": "Bloom-filter match term (signed smallint bit positions)." }, "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "bf", - "c", + "v", "i", - "v" + "c", + "bf" ], "title": "TextMatch", "type": "object" diff --git a/crates/eql-bindings/schema/v3/text_ord.json b/crates/eql-bindings/schema/v3/text_ord.json index 0b69333db..be2b77459 100644 --- a/crates/eql-bindings/schema/v3/text_ord.json +++ b/crates/eql-bindings/schema/v3/text_ord.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,13 +22,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -43,55 +40,38 @@ "type": "integer" } }, - "description": "`eql_v3.text_ord` — full lexicographic comparison (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` (ordering) — text routes equality through `hm` (`[Hm, Ore]`).", + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`eql_v3.text_ord` — full lexicographic comparison\n(`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob`\n(ordering) — text routes equality through `hm` (`[Hm, Ore]`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ + "v", + "i", "c", "hm", - "i", - "ob", - "v" + "ob" ], "title": "TextOrd", "type": "object" diff --git a/crates/eql-bindings/schema/v3/text_ord_ore.json b/crates/eql-bindings/schema/v3/text_ord_ore.json index 094f9a49d..b35544c05 100644 --- a/crates/eql-bindings/schema/v3/text_ord_ore.json +++ b/crates/eql-bindings/schema/v3/text_ord_ore.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,13 +22,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -43,55 +40,38 @@ "type": "integer" } }, - "description": "`eql_v3.text_ord_ore` — full lexicographic comparison, scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), text routes equality through `hm` rather than the ORE term, so the domain carries both `hm` and `ob` (`[Hm, Ore]`).", + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`eql_v3.text_ord_ore` — full lexicographic comparison,\nscheme-explicit name. Unlike the integer ordered domains (`[Ore]` only),\ntext routes equality through `hm` rather than the ORE term, so the domain\ncarries both `hm` and `ob` (`[Hm, Ore]`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ + "v", + "i", "c", "hm", - "i", - "ob", - "v" + "ob" ], "title": "TextOrdOre", "type": "object" diff --git a/crates/eql-bindings/schema/v3/text_search.json b/crates/eql-bindings/schema/v3/text_search.json index 2beaeffe8..a66cee2bc 100644 --- a/crates/eql-bindings/schema/v3/text_search.json +++ b/crates/eql-bindings/schema/v3/text_search.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/text_search.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "BloomFilter": { "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", "items": { "format": "int16", - "maximum": 32767.0, - "minimum": -32768.0, + "maximum": 32767, + "minimum": -32768, "type": "integer" }, "type": "array" @@ -18,7 +15,7 @@ "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -35,13 +32,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -53,64 +50,43 @@ "type": "integer" } }, - "description": "`eql_v3.text_search` — the full text search surface: HMAC equality, ORE ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The superset domain combining `_eq`, `_ord`, and `_match`.", + "$id": "https://schemas.cipherstash.com/eql/v3/text_search.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`eql_v3.text_search` — the full text search surface: HMAC equality, ORE\nordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The\nsuperset domain combining `_eq`, `_ord`, and `_match`.", "properties": { "bf": { - "allOf": [ - { - "$ref": "#/definitions/BloomFilter" - } - ], + "$ref": "#/$defs/BloomFilter", "description": "Bloom-filter match term (signed smallint bit positions)." }, "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "bf", + "v", + "i", "c", "hm", - "i", "ob", - "v" + "bf" ], "title": "TextSearch", "type": "object" diff --git a/crates/eql-bindings/schema/v3/timestamptz.json b/crates/eql-bindings/schema/v3/timestamptz.json index 72a154d8e..d8f3650e5 100644 --- a/crates/eql-bindings/schema/v3/timestamptz.json +++ b/crates/eql-bindings/schema/v3/timestamptz.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,8 +18,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -32,37 +29,28 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.timestamptz` — storage only; every operator is blocked.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "v" + "c" ], "title": "Timestamptz", "type": "object" diff --git a/crates/eql-bindings/schema/v3/timestamptz_eq.json b/crates/eql-bindings/schema/v3/timestamptz_eq.json index 90fc71d48..490e463d1 100644 --- a/crates/eql-bindings/schema/v3/timestamptz_eq.json +++ b/crates/eql-bindings/schema/v3/timestamptz_eq.json @@ -1,14 +1,11 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_eq.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" }, "Hmac256": { - "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains (`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3.hmac_256`.", "type": "string" }, "Identifier": { @@ -25,8 +22,8 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, @@ -36,46 +33,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "hm": { - "allOf": [ - { - "$ref": "#/definitions/Hmac256" - } - ], + "$ref": "#/$defs/Hmac256", "description": "HMAC-SHA-256 equality term." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", - "hm", + "v", "i", - "v" + "c", + "hm" ], "title": "TimestamptzEq", "type": "object" diff --git a/crates/eql-bindings/schema/v3/timestamptz_ord.json b/crates/eql-bindings/schema/v3/timestamptz_ord.json index 993bc94c8..37557b81e 100644 --- a/crates/eql-bindings/schema/v3/timestamptz_ord.json +++ b/crates/eql-bindings/schema/v3/timestamptz_ord.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.timestamptz_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (12 blocks for timestamptz). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "TimestamptzOrd", "type": "object" diff --git a/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json b/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json index 9d202d6e2..655bb406d 100644 --- a/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json +++ b/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json @@ -1,8 +1,5 @@ { - "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord_ore.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "definitions": { + "$defs": { "Ciphertext": { "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", "type": "string" @@ -21,13 +18,13 @@ } }, "required": [ - "c", - "t" + "t", + "c" ], "type": "object" }, "OreBlock256": { - "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's domain, so it serves equality too. The block count is width-agnostic on the wire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the array just carries more block strings. SQL-side constructor: `eql_v3.ore_block_256`.", + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamptz, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3.ore_block_256`.", "items": { "type": "string" }, @@ -39,46 +36,33 @@ "type": "integer" } }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "description": "`eql_v3.timestamptz_ord_ore` — full comparison, scheme-explicit name.", "properties": { "c": { - "allOf": [ - { - "$ref": "#/definitions/Ciphertext" - } - ], + "$ref": "#/$defs/Ciphertext", "description": "mp_base85 source ciphertext. Required by the domain CHECK." }, "i": { - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ], + "$ref": "#/$defs/Identifier", "description": "Table/column identifier. Required by the domain CHECK." }, "ob": { - "allOf": [ - { - "$ref": "#/definitions/OreBlock256" - } - ], + "$ref": "#/$defs/OreBlock256", "description": "Block-ORE order term (12 blocks for timestamptz). Serves equality too." }, "v": { - "allOf": [ - { - "$ref": "#/definitions/SchemaVersion" - } - ], - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other value fails deserialization." + "$ref": "#/$defs/SchemaVersion", + "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." } }, "required": [ - "c", + "v", "i", - "ob", - "v" + "c", + "ob" ], "title": "TimestamptzOrdOre", "type": "object" diff --git a/crates/eql-bindings/src/lib.rs b/crates/eql-bindings/src/lib.rs index 6146d3ccf..44052e591 100644 --- a/crates/eql-bindings/src/lib.rs +++ b/crates/eql-bindings/src/lib.rs @@ -76,27 +76,20 @@ impl<'de> Deserialize<'de> for SchemaVersion { /// Manual schema: pins `v` to the literal `2` (`const`), mirroring the /// domain CHECK — the derive would emit an unconstrained integer. impl schemars::JsonSchema for SchemaVersion { - fn schema_name() -> String { - "SchemaVersion".to_owned() + fn schema_name() -> std::borrow::Cow<'static, str> { + "SchemaVersion".into() } - fn json_schema(_: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { - schemars::schema::SchemaObject { - instance_type: Some(schemars::schema::InstanceType::Integer.into()), - const_value: Some(serde_json::json!(EQL_SCHEMA_VERSION)), - metadata: Some(Box::new(schemars::schema::Metadata { - // KEEP IN SYNC with the `SchemaVersion` doc comment above — it - // is the canonical text. A derived `JsonSchema` would copy the - // doc comment automatically; this manual impl can't, so this - // hand-written copy must be updated alongside it. - description: Some( - "The envelope version field (`v`) — always exactly `2` on the wire.".to_owned(), - ), - ..Default::default() - })), - ..Default::default() - } - .into() + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + // KEEP IN SYNC with the `SchemaVersion` doc comment above — it is the + // canonical text. A derived `JsonSchema` would copy the doc comment + // automatically; this manual impl can't, so this hand-written copy + // must be updated alongside it. + schemars::json_schema!({ + "type": "integer", + "const": EQL_SCHEMA_VERSION, + "description": "The envelope version field (`v`) — always exactly `2` on the wire.", + }) } } diff --git a/crates/eql-bindings/src/v3/bool.rs b/crates/eql-bindings/src/v3/bool.rs index 0b2396a62..7ccc6240c 100644 --- a/crates/eql-bindings/src/v3/bool.rs +++ b/crates/eql-bindings/src/v3/bool.rs @@ -12,7 +12,7 @@ //! trivially leak the plaintext distribution. The payload is `{v,i,c}` only — //! no `hm`/`ob`/`bf` — and every operator on the domain is blocked. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::Ciphertext; use crate::v3::DomainType; @@ -44,7 +44,7 @@ impl DomainType for Bool { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Bool) } } diff --git a/crates/eql-bindings/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs index 1da37028f..ce44eba03 100644 --- a/crates/eql-bindings/src/v3/date.rs +++ b/crates/eql-bindings/src/v3/date.rs @@ -3,7 +3,7 @@ //! ciphertext, so dates order like integers); see that module for the //! capability table. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -35,7 +35,7 @@ impl DomainType for Date { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Date) } } @@ -65,7 +65,7 @@ impl DomainType for DateEq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(DateEq) } } @@ -95,7 +95,7 @@ impl DomainType for DateOrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(DateOrdOre) } } @@ -125,7 +125,7 @@ impl DomainType for DateOrd { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(DateOrd) } } diff --git a/crates/eql-bindings/src/v3/float4.rs b/crates/eql-bindings/src/v3/float4.rs index 4af550230..d9549c897 100644 --- a/crates/eql-bindings/src/v3/float4.rs +++ b/crates/eql-bindings/src/v3/float4.rs @@ -13,7 +13,7 @@ //! server-side — reject it client-side** caveat) is identical to `float8`; see //! [`crate::v3::float8`] for the full note. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -45,7 +45,7 @@ impl DomainType for Float4 { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float4) } } @@ -75,7 +75,7 @@ impl DomainType for Float4Eq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float4Eq) } } @@ -105,7 +105,7 @@ impl DomainType for Float4OrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float4OrdOre) } } @@ -135,7 +135,7 @@ impl DomainType for Float4Ord { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float4Ord) } } diff --git a/crates/eql-bindings/src/v3/float8.rs b/crates/eql-bindings/src/v3/float8.rs index de2ebba3c..26e1863f6 100644 --- a/crates/eql-bindings/src/v3/float8.rs +++ b/crates/eql-bindings/src/v3/float8.rs @@ -22,7 +22,7 @@ //! rather than being excluded the way native Postgres `double precision` would. //! See the `float_special` regression suite for the locked behaviour. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -54,7 +54,7 @@ impl DomainType for Float8 { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float8) } } @@ -84,7 +84,7 @@ impl DomainType for Float8Eq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float8Eq) } } @@ -114,7 +114,7 @@ impl DomainType for Float8OrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float8OrdOre) } } @@ -144,7 +144,7 @@ impl DomainType for Float8Ord { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Float8Ord) } } diff --git a/crates/eql-bindings/src/v3/int2.rs b/crates/eql-bindings/src/v3/int2.rs index 6ee64e5af..ee179e6a1 100644 --- a/crates/eql-bindings/src/v3/int2.rs +++ b/crates/eql-bindings/src/v3/int2.rs @@ -1,7 +1,7 @@ //! The `int2` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -33,7 +33,7 @@ impl DomainType for Int2 { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int2) } } @@ -63,7 +63,7 @@ impl DomainType for Int2Eq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int2Eq) } } @@ -93,7 +93,7 @@ impl DomainType for Int2OrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int2OrdOre) } } @@ -123,7 +123,7 @@ impl DomainType for Int2Ord { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int2Ord) } } diff --git a/crates/eql-bindings/src/v3/int4.rs b/crates/eql-bindings/src/v3/int4.rs index 74296f495..9bf97fa87 100644 --- a/crates/eql-bindings/src/v3/int4.rs +++ b/crates/eql-bindings/src/v3/int4.rs @@ -7,7 +7,7 @@ //! | [`Int4OrdOre`] | `eql_v3.int4_ord_ore` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | //! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -39,7 +39,7 @@ impl DomainType for Int4 { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int4) } } @@ -69,7 +69,7 @@ impl DomainType for Int4Eq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int4Eq) } } @@ -101,7 +101,7 @@ impl DomainType for Int4OrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int4OrdOre) } } @@ -131,7 +131,7 @@ impl DomainType for Int4Ord { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int4Ord) } } diff --git a/crates/eql-bindings/src/v3/int8.rs b/crates/eql-bindings/src/v3/int8.rs index 0bd46fd29..1502be787 100644 --- a/crates/eql-bindings/src/v3/int8.rs +++ b/crates/eql-bindings/src/v3/int8.rs @@ -1,7 +1,7 @@ //! The `int8` encrypted-domain family. Same four-domain ordered shape as //! [`crate::v3::int4`] — see that module for the capability table. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -33,7 +33,7 @@ impl DomainType for Int8 { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int8) } } @@ -63,7 +63,7 @@ impl DomainType for Int8Eq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int8Eq) } } @@ -93,7 +93,7 @@ impl DomainType for Int8OrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int8OrdOre) } } @@ -123,7 +123,7 @@ impl DomainType for Int8Ord { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Int8Ord) } } diff --git a/crates/eql-bindings/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs index 53998b457..73219042c 100644 --- a/crates/eql-bindings/src/v3/mod.rs +++ b/crates/eql-bindings/src/v3/mod.rs @@ -46,7 +46,7 @@ use std::marker::PhantomData; -use schemars::{schema::RootSchema, schema_for, JsonSchema}; +use schemars::{schema_for, JsonSchema, Schema}; pub mod bool; pub mod date; @@ -108,7 +108,7 @@ pub trait DomainType { } /// The type's JSON Schema. - fn schema(&self) -> RootSchema; + fn schema(&self) -> Schema; } /// Type-level handle: lets [`all`] enumerate the domain types without @@ -127,7 +127,7 @@ where T::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(T) } } diff --git a/crates/eql-bindings/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs index d7d5b08a8..f94f147e2 100644 --- a/crates/eql-bindings/src/v3/numeric.rs +++ b/crates/eql-bindings/src/v3/numeric.rs @@ -8,7 +8,7 @@ //! more block strings — and the generalized `eql_v3.ore_block_256` comparator //! orders any block count, so no new type is needed here. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -40,7 +40,7 @@ impl DomainType for Numeric { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Numeric) } } @@ -70,7 +70,7 @@ impl DomainType for NumericEq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(NumericEq) } } @@ -100,7 +100,7 @@ impl DomainType for NumericOrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(NumericOrdOre) } } @@ -130,7 +130,7 @@ impl DomainType for NumericOrd { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(NumericOrd) } } diff --git a/crates/eql-bindings/src/v3/terms.rs b/crates/eql-bindings/src/v3/terms.rs index b322ed87d..3275afccc 100644 --- a/crates/eql-bindings/src/v3/terms.rs +++ b/crates/eql-bindings/src/v3/terms.rs @@ -53,47 +53,28 @@ pub struct BloomFilter(pub Vec); /// so an out-of-range bit position would pass schema validation and fail /// at the database. impl schemars::JsonSchema for BloomFilter { - fn schema_name() -> String { - "BloomFilter".to_owned() + fn schema_name() -> std::borrow::Cow<'static, str> { + "BloomFilter".into() } - fn json_schema(_: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { - use schemars::schema::{ - ArrayValidation, InstanceType, Metadata, NumberValidation, Schema, SchemaObject, - }; - let items = SchemaObject { - instance_type: Some(InstanceType::Integer.into()), - format: Some("int16".to_owned()), - number: Some(Box::new(NumberValidation { - minimum: Some(f64::from(i16::MIN)), - maximum: Some(f64::from(i16::MAX)), - ..Default::default() - })), - ..Default::default() - }; - SchemaObject { - instance_type: Some(InstanceType::Array.into()), - array: Some(Box::new(ArrayValidation { - items: Some(Schema::Object(items).into()), - ..Default::default() - })), - metadata: Some(Box::new(Metadata { - // KEEP IN SYNC with the doc comment on `BloomFilter` above — it - // is the canonical text. A derived `JsonSchema` would copy the - // doc comment automatically; this manual impl can't, so this - // hand-written paraphrase must be updated alongside it. - description: Some( - "Bloom-filter match term — the `bf` wire key. Backs the `_match` \ - domains (`@>`/`<@` containment). Signed i16: EQL stores the filter \ - as PostgreSQL `smallint[]`, and filters sized above 32768 emit \ - upper-half bit positions as negative signed values." - .to_owned(), - ), - ..Default::default() - })), - ..Default::default() - } - .into() + fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema { + // KEEP IN SYNC with the doc comment on `BloomFilter` above — it is the + // canonical text. A derived `JsonSchema` would copy the doc comment + // automatically; this manual impl can't, so this hand-written + // paraphrase must be updated alongside it. + schemars::json_schema!({ + "type": "array", + "items": { + "type": "integer", + "format": "int16", + "minimum": i16::MIN, + "maximum": i16::MAX, + }, + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` \ + domains (`@>`/`<@` containment). Signed i16: EQL stores the filter \ + as PostgreSQL `smallint[]`, and filters sized above 32768 emit \ + upper-half bit positions as negative signed values.", + }) } } diff --git a/crates/eql-bindings/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs index 2d6b05987..65b385a74 100644 --- a/crates/eql-bindings/src/v3/text.rs +++ b/crates/eql-bindings/src/v3/text.rs @@ -2,7 +2,7 @@ //! [`crate::v3::int4`] plus a `_match` domain backed by the Bloom-filter //! term (`@>`/`<@` containment for `LIKE`-style matching). -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -34,7 +34,7 @@ impl DomainType for Text { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Text) } } @@ -64,7 +64,7 @@ impl DomainType for TextEq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TextEq) } } @@ -94,7 +94,7 @@ impl DomainType for TextMatch { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TextMatch) } } @@ -129,7 +129,7 @@ impl DomainType for TextOrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TextOrdOre) } } @@ -163,7 +163,7 @@ impl DomainType for TextOrd { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TextOrd) } } @@ -199,7 +199,7 @@ impl DomainType for TextSearch { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TextSearch) } } diff --git a/crates/eql-bindings/src/v3/timestamptz.rs b/crates/eql-bindings/src/v3/timestamptz.rs index a86ad5d57..ed1959b03 100644 --- a/crates/eql-bindings/src/v3/timestamptz.rs +++ b/crates/eql-bindings/src/v3/timestamptz.rs @@ -9,7 +9,7 @@ //! length, the 12-block `ob` term orders correctly and the ordered domains //! ship. The wire shape is unchanged — the `ob` array just carries 12 blocks. -use schemars::{schema::RootSchema, schema_for}; +use schemars::{schema_for, Schema}; use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; @@ -41,7 +41,7 @@ impl DomainType for Timestamptz { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(Timestamptz) } } @@ -71,7 +71,7 @@ impl DomainType for TimestamptzEq { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TimestamptzEq) } } @@ -101,7 +101,7 @@ impl DomainType for TimestamptzOrdOre { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TimestamptzOrdOre) } } @@ -131,7 +131,7 @@ impl DomainType for TimestamptzOrd { Self::sql_domain_static() } - fn schema(&self) -> RootSchema { + fn schema(&self) -> Schema { schema_for!(TimestamptzOrd) } } diff --git a/crates/eql-bindings/tests/catalog_parity.rs b/crates/eql-bindings/tests/catalog_parity.rs index 53bfa16a3..df4969069 100644 --- a/crates/eql-bindings/tests/catalog_parity.rs +++ b/crates/eql-bindings/tests/catalog_parity.rs @@ -43,13 +43,14 @@ fn schema_required_keys_match_catalog_terms() { .find(|e| e.domain() == name) .unwrap_or_else(|| panic!("no domain inventory entry for {name}")); - let schema = entry.schema(); - let object = schema - .schema - .object - .as_ref() - .unwrap_or_else(|| panic!("{name}: schema is not an object")); - let required: BTreeSet<&str> = object.required.iter().map(String::as_str).collect(); + let schema: Value = serde_json::to_value(entry.schema()) + .unwrap_or_else(|e| panic!("{name}: schema does not serialize: {e}")); + let required: BTreeSet<&str> = schema["required"] + .as_array() + .unwrap_or_else(|| panic!("{name}: schema has no required array")) + .iter() + .map(|v| v.as_str().expect("required entry is a string")) + .collect(); let expected: BTreeSet<&str> = ENVELOPE_KEYS .iter() @@ -125,18 +126,18 @@ fn schemas_are_strict() { (struct lost #[serde(deny_unknown_fields)]?)" ); assert_eq!( - schema.pointer("/definitions/Identifier/additionalProperties"), + schema.pointer("/$defs/Identifier/additionalProperties"), Some(&json!(false)), "{name}: Identifier definition must set additionalProperties: false" ); assert_eq!( - schema.pointer("/properties/v/allOf/0/$ref"), - Some(&json!("#/definitions/SchemaVersion")), + schema.pointer("/properties/v/$ref"), + Some(&json!("#/$defs/SchemaVersion")), "{name}: the v property must $ref the SchemaVersion definition \ (field declared as a bare integer instead of SchemaVersion?)" ); assert_eq!( - schema.pointer("/definitions/SchemaVersion/const"), + schema.pointer("/$defs/SchemaVersion/const"), Some(&json!(EQL_SCHEMA_VERSION)), "{name}: SchemaVersion must pin const: {EQL_SCHEMA_VERSION}" ); From d89fb95c7b079213826ce6818b64202e4f7fa1f3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 16:54:53 +1000 Subject: [PATCH 373/599] feat(eql-codegen): add Rust-emitter deps + format_rs helper quote/proc-macro2/syn(v2)/prettyplease(=0.2.37) + RUST_GENERATED_MARKER + format_rs (prettyplease then stable rustfmt, with the @generated marker as line 1). rustfmt is the final formatter so committed generated files are clean under cargo fmt --check. --- Cargo.lock | 4 ++ crates/eql-codegen/Cargo.toml | 4 ++ crates/eql-codegen/src/bindings.rs | 74 ++++++++++++++++++++++++++++++ crates/eql-codegen/src/consts.rs | 8 ++++ crates/eql-codegen/src/lib.rs | 1 + 5 files changed, 91 insertions(+) create mode 100644 crates/eql-codegen/src/bindings.rs diff --git a/Cargo.lock b/Cargo.lock index f8e31d80c..aed770ec1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1178,8 +1178,12 @@ version = "0.1.0" dependencies = [ "eql-domains", "minijinja", + "prettyplease", + "proc-macro2", + "quote", "serde", "serde_json", + "syn 2.0.108", "thiserror 2.0.18", ] diff --git a/crates/eql-codegen/Cargo.toml b/crates/eql-codegen/Cargo.toml index bec6f3989..b245640ca 100644 --- a/crates/eql-codegen/Cargo.toml +++ b/crates/eql-codegen/Cargo.toml @@ -10,6 +10,10 @@ minijinja = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" thiserror = "2" +quote = "1" +proc-macro2 = "1" +syn = { version = "2", features = ["full"] } +prettyplease = "=0.2.37" [[bin]] name = "eql-codegen" diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs new file mode 100644 index 000000000..19e631eea --- /dev/null +++ b/crates/eql-codegen/src/bindings.rs @@ -0,0 +1,74 @@ +//! The Rust payload-bindings emitter: renders `eql_domains::CATALOG` to the +//! committed `crates/eql-bindings/src/v3/.rs` structs + `DomainType` +//! impls and the generated `inventory.rs` (`all()`), the same generate-to- +//! committed-source mechanism `generate.rs` uses for SQL. Token stream via +//! `quote!`, formatted by `prettyplease::unparse` then the repo's stable +//! `rustfmt` (prettyplease is rustfmt-clean but not rustfmt-identical), with +//! the `// @generated` ownership marker prepended as line 1. + +use proc_macro2::TokenStream; + +use crate::consts::RUST_GENERATED_MARKER; + +/// Format a token stream into committed Rust source. `prettyplease::unparse` +/// gives deterministic, parseable output; the `@generated` marker is prepended +/// as line 1 (syn/prettyplease drop free-standing line comments, so it cannot +/// live inside the token stream); then the whole file is run through `rustfmt` +/// so it is byte-for-byte what `cargo fmt --check` (`mise run test:crates`) +/// expects. +pub fn format_rs(tokens: TokenStream) -> String { + let file: syn::File = syn::parse2(tokens).expect("emit syntactically valid Rust"); + let body = prettyplease::unparse(&file); + let with_marker = format!("{RUST_GENERATED_MARKER}\n{body}"); + rustfmt(&with_marker) +} + +/// Pipe Rust source through the repo's `rustfmt` (stdin → stdout). Fails loudly: +/// codegen is a dev-time tool and `rustfmt` is always present where `cargo fmt` +/// runs. `rustfmt` preserves the leading `// @generated` line comment, so the +/// marker stays exactly line 1. +fn rustfmt(src: &str) -> String { + use std::io::Write; + use std::process::{Command, Stdio}; + + let mut child = Command::new("rustfmt") + .args(["--edition", "2021"]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("spawn rustfmt (is the Rust toolchain on PATH?)"); + child + .stdin + .take() + .expect("rustfmt stdin") + .write_all(src.as_bytes()) + .expect("write to rustfmt"); + let out = child.wait_with_output().expect("wait for rustfmt"); + assert!( + out.status.success(), + "rustfmt failed: {}", + String::from_utf8_lossy(&out.stderr) + ); + String::from_utf8(out.stdout).expect("rustfmt output is UTF-8") +} + +#[cfg(test)] +mod tests { + use super::*; + use quote::quote; + + #[test] + fn format_rs_prepends_marker_and_is_rustfmt_clean() { + // Deliberately mis-spaced input: rustfmt must normalize it, proving the + // rustfmt pass runs (prettyplease alone would not re-sort imports). + let out = format_rs(quote! { use b::B; use a::A; pub struct Foo { pub v: u16 } }); + assert_eq!(out.lines().next().unwrap(), RUST_GENERATED_MARKER); + assert!(out.contains("pub struct Foo")); + assert!(out.contains("pub v: u16")); + // rustfmt sorts `use a::A;` before `use b::B;` + assert!(out.find("use a::A;").unwrap() < out.find("use b::B;").unwrap()); + // Idempotent: re-running rustfmt over the output changes nothing. + assert_eq!(rustfmt(&out), out); + } +} diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 138036715..392d14d91 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -6,6 +6,14 @@ /// synthesise file bodies append `\n` to form the full header line. pub(crate) const AUTO_GENERATED_MARKER: &str = "-- AUTOMATICALLY GENERATED FILE."; +/// Rust generated-file marker — the `// @generated` header's first line, with +/// no trailing newline. `bindings::format_rs` prepends it (followed by a +/// newline) as line 1 and then runs `rustfmt` over the whole file (rustfmt +/// preserves a leading line comment), and the writer (`GeneratedKind::Rust`) +/// uses it to recognise files it owns. +pub(crate) const RUST_GENERATED_MARKER: &str = + "// @generated by eql-codegen from the eql-domains catalog — do not edit"; + /// The single schema housing the self-contained `eql_v3` surface: the /// encrypted-domain families AND the SEM index-term types/constructors they /// call. v3 has zero dependency on `eql_v2`, so domains and core index-term diff --git a/crates/eql-codegen/src/lib.rs b/crates/eql-codegen/src/lib.rs index c5dbf1a88..c07c8ce6b 100644 --- a/crates/eql-codegen/src/lib.rs +++ b/crates/eql-codegen/src/lib.rs @@ -7,6 +7,7 @@ use std::path::PathBuf; +pub mod bindings; pub mod consts; pub mod context; pub mod dump; From af9dea04f0c89691d0e5fc8f65d0cca1f32bba6e Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 16:57:37 +1000 Subject: [PATCH 374/599] refactor(eql-codegen): parameterize writer by GeneratedKind {Sql,Rust} The four writer fns take a GeneratedKind selecting the ownership marker and the cleanup extension (.sql vs .rs). SQL call sites pass Sql; generated SQL unchanged (codegen:parity green). --- crates/eql-codegen/src/generate.rs | 23 +++-- crates/eql-codegen/src/writer.rs | 159 ++++++++++++++++++++--------- 2 files changed, 129 insertions(+), 53 deletions(-) diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index dfa60a4e0..c08cd9d1d 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -198,7 +198,8 @@ pub fn render_aggregates_file(family_name: &str, domain: &Domain) -> Option Result targets.push(out_dir.join(format!("{name}_aggregates.sql"))); } } - ensure_generated_paths_writable(&targets)?; - clean_generated_files(out_dir)?; + ensure_generated_paths_writable(&targets, GeneratedKind::Sql)?; + clean_generated_files(out_dir, GeneratedKind::Sql)?; let mut written: Vec = Vec::new(); let types_path = out_dir.join(format!("{family_name}_types.sql")); - write_generated_file(&types_path, &render_types_file(spec))?; + write_generated_file(&types_path, &render_types_file(spec), GeneratedKind::Sql)?; written.push(types_path); for d in spec.domains { let name = d.full_name(family_name); let fn_path = out_dir.join(format!("{name}_functions.sql")); - write_generated_file(&fn_path, &render_functions_file(family_name, d))?; + write_generated_file( + &fn_path, + &render_functions_file(family_name, d), + GeneratedKind::Sql, + )?; written.push(fn_path); let op_path = out_dir.join(format!("{name}_operators.sql")); - write_generated_file(&op_path, &render_operators_file(family_name, d))?; + write_generated_file( + &op_path, + &render_operators_file(family_name, d), + GeneratedKind::Sql, + )?; written.push(op_path); if let Some(agg) = render_aggregates_file(family_name, d) { let agg_path = out_dir.join(format!("{name}_aggregates.sql")); - write_generated_file(&agg_path, &agg)?; + write_generated_file(&agg_path, &agg, GeneratedKind::Sql)?; written.push(agg_path); } } diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index 93d6b4489..ed7586fd0 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -4,11 +4,33 @@ use std::fs; use std::io; use std::path::{Path, PathBuf}; -use crate::consts::AUTO_GENERATED_MARKER; +use crate::consts::{AUTO_GENERATED_MARKER, RUST_GENERATED_MARKER}; -/// First line of the SQL header — the ownership marker. -const fn sql_marker() -> &'static str { - AUTO_GENERATED_MARKER +/// Which generated-file family a writer call targets — selects the ownership +/// marker and the cleanup file extension so one writer serves both the SQL +/// surface (`generate.rs`) and the Rust bindings (`bindings.rs`). +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum GeneratedKind { + Sql, + Rust, +} + +impl GeneratedKind { + /// The exact first-line ownership marker for this kind. + pub const fn marker(self) -> &'static str { + match self { + GeneratedKind::Sql => AUTO_GENERATED_MARKER, + GeneratedKind::Rust => RUST_GENERATED_MARKER, + } + } + + /// The file extension `clean_generated_files` filters on for this kind. + pub const fn extension(self) -> &'static str { + match self { + GeneratedKind::Sql => "sql", + GeneratedKind::Rust => "rs", + } + } } /// Raised when the generator would clobber a hand-written file, or on an @@ -32,25 +54,27 @@ fn first_line(path: &Path) -> io::Result { .to_string()) } -/// True if the file carries the SQL AUTO-GENERATED marker. Port of `is_generated`. -pub fn is_generated(path: &Path) -> bool { - path.is_file() && first_line(path).map(|l| l == sql_marker()).unwrap_or(false) +/// True if the file carries this kind's AUTO-GENERATED marker as line 1. +pub fn is_generated(path: &Path, kind: GeneratedKind) -> bool { + path.is_file() + && first_line(path) + .map(|l| l == kind.marker()) + .unwrap_or(false) } -/// Delete every generated .sql file in `directory`, returning removed paths. -/// Port of `clean_generated_files`. -pub fn clean_generated_files(directory: &Path) -> io::Result> { +/// Delete every generated file of `kind` in `directory`, returning removed paths. +pub fn clean_generated_files(directory: &Path, kind: GeneratedKind) -> io::Result> { if !directory.is_dir() { return Ok(Vec::new()); } let mut paths: Vec = fs::read_dir(directory)? .filter_map(|e| e.ok().map(|e| e.path())) - .filter(|p| p.extension().and_then(|x| x.to_str()) == Some("sql")) + .filter(|p| p.extension().and_then(|x| x.to_str()) == Some(kind.extension())) .collect(); paths.sort(); let mut removed = Vec::new(); for p in paths { - if is_generated(&p) { + if is_generated(&p, kind) { fs::remove_file(&p)?; removed.push(p); } @@ -58,43 +82,45 @@ pub fn clean_generated_files(directory: &Path) -> io::Result> { Ok(removed) } -/// Refuse a generation run if any target is hand-written. Port of -/// `ensure_generated_paths_writable`. -pub fn ensure_generated_paths_writable(paths: &[PathBuf]) -> Result<(), WriteError> { +/// Refuse a generation run if any target is hand-written (lacks this kind's marker). +pub fn ensure_generated_paths_writable( + paths: &[PathBuf], + kind: GeneratedKind, +) -> Result<(), WriteError> { for path in paths { - if path.exists() && !is_generated(path) { + if path.exists() && !is_generated(path, kind) { return Err(WriteError::Ownership(format!( - "refusing to overwrite hand-written file: {} (no AUTO-GENERATED header). \ + "refusing to overwrite hand-written file: {} (no {:?} AUTO-GENERATED header). \ Remove it by hand if it is a one-time generator-adoption target.", - path.display() + path.display(), + kind ))); } } Ok(()) } -/// Write the rendered SQL `body` to `path`, after refusing to clobber a -/// hand-written file. The SQL templates emit the `-- AUTOMATICALLY GENERATED -/// FILE.` marker as their own first line, so the writer writes `body` verbatim -/// — it does not prepend a header. -pub fn write_generated_file(path: &Path, body: &str) -> Result<(), WriteError> { - ensure_generated_paths_writable(std::slice::from_ref(&path.to_path_buf()))?; - // The template is trusted to carry the ownership marker as its first line, - // but a renderer bug (or a hand-edited template) could drop it — which would - // then defeat `is_generated`/`clean_generated_files`, leaving an unowned file - // the next run refuses to overwrite. Validate the marker before writing. +/// Write `body` to `path` after refusing to clobber a hand-written file. The +/// renderer is trusted to carry `kind.marker()` as the first line; validate it +/// before writing. +pub fn write_generated_file( + path: &Path, + body: &str, + kind: GeneratedKind, +) -> Result<(), WriteError> { + ensure_generated_paths_writable(std::slice::from_ref(&path.to_path_buf()), kind)?; let first = body .lines() .next() .unwrap_or("") .trim_end_matches(['\r', '\n']); - if first != sql_marker() { + if first != kind.marker() { return Err(WriteError::Ownership(format!( - "refusing to write generated file without the AUTO-GENERATED marker as its \ - first line: {} (expected first line {:?}, got {:?}). The SQL template must \ - emit the marker.", + "refusing to write generated file without the {:?} AUTO-GENERATED marker as its \ + first line: {} (expected first line {:?}, got {:?}).", + kind, path.display(), - sql_marker(), + kind.marker(), first ))); } @@ -141,12 +167,43 @@ mod tests { use super::test_support::tempdir as tmp; use super::*; + #[test] + fn is_generated_recognises_rust_marker_and_ignores_sql_in_rs() { + use crate::consts::RUST_GENERATED_MARKER; + let d = tmp(); + let rs = d.path().join("int4.rs"); + fs::write(&rs, format!("{RUST_GENERATED_MARKER}\npub struct Int4;\n")).unwrap(); + assert!(is_generated(&rs, GeneratedKind::Rust)); + assert!(!is_generated(&rs, GeneratedKind::Sql)); + } + + #[test] + fn clean_filters_by_kind_extension() { + use crate::consts::RUST_GENERATED_MARKER; + let d = tmp(); + let gen_rs = d.path().join("int4.rs"); + let gen_sql = d.path().join("int4_types.sql"); + let hand_rs = d.path().join("terms.rs"); + fs::write( + &gen_rs, + format!("{RUST_GENERATED_MARKER}\npub struct Int4;\n"), + ) + .unwrap(); + fs::write(&gen_sql, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); + fs::write(&hand_rs, "//! hand-written\npub struct Terms;\n").unwrap(); + let removed = clean_generated_files(d.path(), GeneratedKind::Rust).unwrap(); + assert!(!gen_rs.exists()); + assert!(gen_sql.exists(), "different kind, untouched"); + assert!(hand_rs.exists(), "no marker, kept"); + assert_eq!(removed.len(), 1); + } + #[test] fn is_generated_true_for_header() { let d = tmp(); let p = d.path().join("x.sql"); fs::write(&p, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); - assert!(is_generated(&p)); + assert!(is_generated(&p, GeneratedKind::Sql)); } #[test] @@ -154,16 +211,16 @@ mod tests { let d = tmp(); let p = d.path().join("x.sql"); fs::write(&p, "-- REQUIRE: src/schema.sql\nSELECT 1;\n").unwrap(); - assert!(!is_generated(&p)); + assert!(!is_generated(&p, GeneratedKind::Sql)); } #[test] fn is_generated_true_for_crlf_header() { let d = tmp(); let p = d.path().join("x.sql"); - let marker = sql_marker(); + let marker = GeneratedKind::Sql.marker(); fs::write(&p, format!("{marker}\r\nSELECT 1;\n")).unwrap(); - assert!(is_generated(&p)); + assert!(is_generated(&p, GeneratedKind::Sql)); } #[test] @@ -173,10 +230,10 @@ mod tests { // The template render carries the marker on line 1; the writer writes it // through unchanged. let body = format!("{AUTO_GENERATED_MARKER}\nDO $$ BEGIN END $$;\n"); - write_generated_file(&p, &body).unwrap(); + write_generated_file(&p, &body, GeneratedKind::Sql).unwrap(); let text = fs::read_to_string(&p).unwrap(); assert_eq!(text, body); - assert!(is_generated(&p)); + assert!(is_generated(&p, GeneratedKind::Sql)); } #[test] @@ -186,7 +243,7 @@ mod tests { // A body whose first line is NOT the AUTO-GENERATED marker must be // rejected — the template is required to emit it. let body = "-- REQUIRE: src/v3/schema.sql\nDO $$ BEGIN END $$;\n"; - let err = write_generated_file(&p, body).unwrap_err(); + let err = write_generated_file(&p, body, GeneratedKind::Sql).unwrap_err(); assert!(matches!(err, WriteError::Ownership(_))); assert!(err.to_string().contains("AUTO-GENERATED marker")); assert!( @@ -200,7 +257,8 @@ mod tests { let d = tmp(); let p = d.path().join("int4_types.sql"); fs::write(&p, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); - let err = write_generated_file(&p, "DO $$ BEGIN END $$;\n").unwrap_err(); + let err = + write_generated_file(&p, "DO $$ BEGIN END $$;\n", GeneratedKind::Sql).unwrap_err(); assert!(matches!(err, WriteError::Ownership(_))); assert!(err.to_string().contains("hand-written")); } @@ -216,7 +274,9 @@ mod tests { ) .unwrap(); fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); - let err = ensure_generated_paths_writable(&[generated.clone(), hand.clone()]).unwrap_err(); + let err = + ensure_generated_paths_writable(&[generated.clone(), hand.clone()], GeneratedKind::Sql) + .unwrap_err(); assert!(err.to_string().contains("int4_eq_functions.sql")); assert!(generated.exists()); assert!(hand.exists()); @@ -227,7 +287,12 @@ mod tests { let d = tmp(); let p = d.path().join("int4_types.sql"); fs::write(&p, format!("{AUTO_GENERATED_MARKER}\n-- old content\n")).unwrap(); - write_generated_file(&p, &format!("{AUTO_GENERATED_MARKER}\n-- new content\n")).unwrap(); + write_generated_file( + &p, + &format!("{AUTO_GENERATED_MARKER}\n-- new content\n"), + GeneratedKind::Sql, + ) + .unwrap(); let text = fs::read_to_string(&p).unwrap(); assert!(text.contains("-- new content")); assert!(!text.contains("-- old content")); @@ -242,7 +307,7 @@ mod tests { fs::write(&gen1, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); fs::write(&gen2, format!("{AUTO_GENERATED_MARKER}\nSELECT 2;\n")).unwrap(); fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); - let removed = clean_generated_files(d.path()).unwrap(); + let removed = clean_generated_files(d.path(), GeneratedKind::Sql).unwrap(); assert!(!gen1.exists()); assert!(!gen2.exists()); assert!(hand.exists()); @@ -252,7 +317,9 @@ mod tests { #[test] fn clean_on_empty_directory() { let d = tmp(); - assert!(clean_generated_files(d.path()).unwrap().is_empty()); + assert!(clean_generated_files(d.path(), GeneratedKind::Sql) + .unwrap() + .is_empty()); } #[test] @@ -265,7 +332,7 @@ mod tests { fs::write(&blocker, "i am a file\n").unwrap(); let target = blocker.join("int4_types.sql"); // parent is a file let body = format!("{AUTO_GENERATED_MARKER}\nDO $$ BEGIN END $$;\n"); - let err = write_generated_file(&target, &body).unwrap_err(); + let err = write_generated_file(&target, &body, GeneratedKind::Sql).unwrap_err(); assert!(matches!(err, WriteError::Io(_)), "expected Io, got {err:?}"); assert!(err.to_string().starts_with("io error: ")); } From 24a276528fd7863845bccdf8effdf011fb47099a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 17:00:29 +1000 Subject: [PATCH 375/599] refactor(eql-bindings): split DomainType trait + all() out of mod.rs Move the trait/consts/PhantomData impl into hand-written domain_type.rs and the all() inventory into inventory.rs (re-exported at crate::v3, public paths unchanged). Relocate the non-catalog-derivable float NaN and bool storage-only caveats into the hand-written mod.rs doc so the generated per-family modules don't drop them at cutover. mod.rs stays hand-written. types:check green. --- crates/eql-bindings/src/v3/domain_type.rs | 85 +++++++++++++ crates/eql-bindings/src/v3/inventory.rs | 55 ++++++++ crates/eql-bindings/src/v3/mod.rs | 147 ++++------------------ 3 files changed, 165 insertions(+), 122 deletions(-) create mode 100644 crates/eql-bindings/src/v3/domain_type.rs create mode 100644 crates/eql-bindings/src/v3/inventory.rs diff --git a/crates/eql-bindings/src/v3/domain_type.rs b/crates/eql-bindings/src/v3/domain_type.rs new file mode 100644 index 000000000..c9a022756 --- /dev/null +++ b/crates/eql-bindings/src/v3/domain_type.rs @@ -0,0 +1,85 @@ +//! The hand-written `DomainType` trait and its `PhantomData` enumeration +//! plumbing — the stable, NON-generated core of the v3 bindings surface. The +//! per-family payload structs and the `inventory.rs` `all()` list are generated +//! from `eql-domains::CATALOG` by `eql-codegen`; this trait, the schema-id base, +//! and the blanket `PhantomData` impl are authored by hand. + +use std::marker::PhantomData; + +use schemars::{schema_for, JsonSchema, Schema}; + +/// The PostgreSQL schema every domain in this module inhabits. +pub const SQL_SCHEMA: &str = "eql_v3"; + +/// Base URL for the canonical `$id` of every published v3 JSON Schema. +/// The per-domain `$id` is `{SCHEMA_ID_BASE}{domain}.json` (see +/// [`DomainType::schema_id`]); `tests/export.rs` injects it at write time. +pub const SCHEMA_ID_BASE: &str = "https://schemas.cipherstash.com/eql/v3/"; + +/// One v3 domain type — implemented by every payload type, so any payload +/// value can report the SQL domain it inhabits (`payload.sql_domain()`). +/// +/// Each token file implements this next to the type it describes; the SQL +/// domain string is defined exactly once, in that impl, and +/// `tests/catalog_parity.rs` cross-checks every entry of [`all`] against +/// `eql-domains::CATALOG` — a typo'd or mis-ordered domain fails there. +/// Public so FFI consumers can enumerate the protocol surface too. +/// +/// [`all`]: super::all +pub trait DomainType { + /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"` — the + /// per-type fact everything else derives from, defined once in each + /// type's impl. + /// + /// `where Self: Sized` keeps the trait object-safe (the method is + /// excluded from the vtable); through `dyn DomainType`, use + /// [`Self::sql_domain`]. + fn sql_domain_static() -> &'static str + where + Self: Sized; + + /// Fully-qualified SQL domain name of this payload value. + fn sql_domain(&self) -> &'static str; + + /// Unqualified SQL domain name (e.g. `"int4_eq"`) — [`Self::sql_domain`] + /// minus the schema qualifier; matches `eql-domains` + /// `DomainFamily::domain_name`. + fn domain(&self) -> &'static str { + self.sql_domain() + .strip_prefix("eql_v3.") + .expect("sql_domain must be qualified with the eql_v3 schema") + } + + /// Canonical `$id` for this domain's published JSON Schema — + /// `{SCHEMA_ID_BASE}{domain}.json`. The single source of truth for the + /// identity `tests/export.rs` injects; pinned by `tests/catalog_parity.rs`. + fn schema_id(&self) -> String { + format!("{SCHEMA_ID_BASE}{}.json", self.domain()) + } + + /// The type's JSON Schema. + fn schema(&self) -> Schema; +} + +/// Type-level handle: lets [`all`] enumerate the domain types without +/// payload values to box — `Box::new(PhantomData::)` is zero-sized, +/// and the delegation goes through [`DomainType::sql_domain_static`], so no +/// payload instance is ever constructed. +/// +/// [`all`]: super::all +impl DomainType for PhantomData +where + T: DomainType + JsonSchema, +{ + fn sql_domain_static() -> &'static str { + T::sql_domain_static() + } + + fn sql_domain(&self) -> &'static str { + T::sql_domain_static() + } + + fn schema(&self) -> Schema { + schema_for!(T) + } +} diff --git a/crates/eql-bindings/src/v3/inventory.rs b/crates/eql-bindings/src/v3/inventory.rs new file mode 100644 index 000000000..51193182b --- /dev/null +++ b/crates/eql-bindings/src/v3/inventory.rs @@ -0,0 +1,55 @@ +//! The `all()` inventory — every v3 domain payload type in `eql-domains::CATALOG` +//! order. Moved out of `mod.rs` so PR 4's emitter can own it: this hand-written +//! version is REPLACED by `eql-codegen` output (`// @generated`) at cutover +//! (Task 8). The architectural module doc + `pub mod` decls stay in the +//! hand-written `mod.rs`. + +use std::marker::PhantomData; + +use super::domain_type::DomainType; +use super::{bool, date, float4, float8, int2, int4, int8, numeric, text, timestamptz}; + +/// Every v3 domain type, in `eql-domains::CATALOG` order. +pub fn all() -> Vec> { + vec![ + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + ] +} diff --git a/crates/eql-bindings/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs index 73219042c..98fe3b7ac 100644 --- a/crates/eql-bindings/src/v3/mod.rs +++ b/crates/eql-bindings/src/v3/mod.rs @@ -43,138 +43,41 @@ //! mode this tier exists to retire, and `_ord` vs `_ord_ore` are identical //! shapes that no sniffing can separate. Consumers read from a typed column //! and already know the domain. - -use std::marker::PhantomData; - -use schemars::{schema_for, JsonSchema, Schema}; +//! +//! ## Per-family caller-facing notes +//! +//! These are not derivable from the catalog and are documented here because the +//! per-family modules are generated. +//! +//! **`float8` / `float4` special values.** `-0.0` canonicalizes to `+0.0` +//! (equal under `=`, IEEE-consistent) and `±Inf` order correctly +//! (`-Inf < finite < +Inf`). **NaN is unordered and unspecified in the +//! encoder**: it can be encrypted, stored, and pass the domain CHECK, but it +//! carries **no comparison guarantee** and does NOT follow IEEE semantics. The +//! domain CHECK validates only the envelope — it cannot inspect the ciphertext +//! — so a NaN payload is never rejected server-side. **Reject NaN client-side +//! before encryption** if your column must not contain it; otherwise a NaN row +//! sorts at an arbitrary (but deterministic) position in an encrypted range +//! scan. See the `float_special` regression suite for the locked behaviour. +//! +//! **`bool` is storage-only by design.** It has no `_eq`/`_ord` domain and +//! carries no index term: a two-value column has so little cardinality that any +//! searchable index (even HMAC equality) would trivially leak the plaintext +//! distribution. The payload is `{v,i,c}` only and every operator is blocked. pub mod bool; pub mod date; +pub mod domain_type; pub mod float4; pub mod float8; pub mod int2; pub mod int4; pub mod int8; +pub mod inventory; pub mod numeric; pub mod terms; pub mod text; pub mod timestamptz; -/// The PostgreSQL schema every domain in this module inhabits. -pub const SQL_SCHEMA: &str = "eql_v3"; - -/// Base URL for the canonical `$id` of every published v3 JSON Schema. -/// The per-domain `$id` is `{SCHEMA_ID_BASE}{domain}.json` (see -/// [`DomainType::schema_id`]); `tests/export.rs` injects it at write time. -pub const SCHEMA_ID_BASE: &str = "https://schemas.cipherstash.com/eql/v3/"; - -/// One v3 domain type — implemented by every payload type, so any payload -/// value can report the SQL domain it inhabits (`payload.sql_domain()`). -/// -/// Each token file implements this next to the type it describes; the SQL -/// domain string is defined exactly once, in that impl, and -/// `tests/catalog_parity.rs` cross-checks every entry of [`all`] against -/// `eql-domains::CATALOG` — a typo'd or mis-ordered domain fails there. -/// Public so FFI consumers can enumerate the protocol surface too. -pub trait DomainType { - /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"` — the - /// per-type fact everything else derives from, defined once in each - /// type's impl. - /// - /// `where Self: Sized` keeps the trait object-safe (the method is - /// excluded from the vtable); through `dyn DomainType`, use - /// [`Self::sql_domain`]. - fn sql_domain_static() -> &'static str - where - Self: Sized; - - /// Fully-qualified SQL domain name of this payload value. - fn sql_domain(&self) -> &'static str; - - /// Unqualified SQL domain name (e.g. `"int4_eq"`) — [`Self::sql_domain`] - /// minus the schema qualifier; matches `eql-domains` - /// `DomainFamily::domain_name`. - fn domain(&self) -> &'static str { - self.sql_domain() - .strip_prefix("eql_v3.") - .expect("sql_domain must be qualified with the eql_v3 schema") - } - - /// Canonical `$id` for this domain's published JSON Schema — - /// `{SCHEMA_ID_BASE}{domain}.json`. The single source of truth for the - /// identity `tests/export.rs` injects; pinned by `tests/catalog_parity.rs`. - fn schema_id(&self) -> String { - format!("{SCHEMA_ID_BASE}{}.json", self.domain()) - } - - /// The type's JSON Schema. - fn schema(&self) -> Schema; -} - -/// Type-level handle: lets [`all`] enumerate the domain types without -/// payload values to box — `Box::new(PhantomData::)` is zero-sized, -/// and the delegation goes through [`DomainType::sql_domain_static`], so no -/// payload instance is ever constructed. -impl DomainType for PhantomData -where - T: DomainType + JsonSchema, -{ - fn sql_domain_static() -> &'static str { - T::sql_domain_static() - } - - fn sql_domain(&self) -> &'static str { - T::sql_domain_static() - } - - fn schema(&self) -> Schema { - schema_for!(T) - } -} - -/// Every v3 domain type, in `eql-domains::CATALOG` order (token order, then -/// each token's domains in manifest order) — the one hand-maintained list of -/// types in the crate. -pub fn all() -> Vec> { - vec![ - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - ] -} +pub use domain_type::{DomainType, SCHEMA_ID_BASE, SQL_SCHEMA}; +pub use inventory::all; From 0c6acad5f07cff2eb3ef9689d1c9cdd23d4e7c75 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 17:02:34 +1000 Subject: [PATCH 376/599] feat(eql-domains): Term::binding_newtype + Term::payload_terms The term->binding-newtype mapping (Hm->Hmac256, Ore->OreBlock256, Bloom->BloomFilter) is wire-contract data, so it lives on Term beside json_key/ctor/extractor (unit-tested). payload_terms returns the distinct field-bearing terms in wire order. PR 4's bindings emitter matches on these instead of a &str round-trip, keeping it exhaustive at compile time. --- crates/eql-domains/src/term.rs | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/crates/eql-domains/src/term.rs b/crates/eql-domains/src/term.rs index 3b4a0ce61..fb8a0f94d 100644 --- a/crates/eql-domains/src/term.rs +++ b/crates/eql-domains/src/term.rs @@ -33,6 +33,20 @@ impl Term { } } + /// The shared binding newtype carrying this term's payload field on the + /// wire (`Hmac256` for `hm`, `OreBlock256` for `ob`, `BloomFilter` for + /// `bf`). Part of the structural wire contract, beside [`Term::json_key`]/ + /// [`Term::ctor`] — a new term names its newtype HERE, so the bindings + /// emitter (which matches on `Term`) stays exhaustive at compile time + /// instead of panicking at codegen runtime on an unmapped key. + pub const fn binding_newtype(self) -> &'static str { + match self { + Term::Hm => "Hmac256", + Term::Ore => "OreBlock256", + Term::Bloom => "BloomFilter", + } + } + /// Generated-file [`Role`] contributed by this single term. A domain's role /// is the richest of its terms' roles — see [`Term::role_for_terms`]. pub const fn role(self) -> Role { @@ -110,6 +124,23 @@ impl Term { Self::dedupe_preserving_order(terms.iter().map(|t| t.json_key())) } + /// The distinct terms contributing a payload field, in wire order: one per + /// [`Term::json_key`], deduped first-occurrence-wins. Symmetric to + /// [`Term::term_json_keys`] but returns the `Term`s, so the bindings emitter + /// reads both the field key ([`Term::json_key`]) and its newtype + /// ([`Term::binding_newtype`]) while matching on the enum. + pub fn payload_terms(terms: &[Term]) -> Vec { + let mut seen: Vec<&str> = Vec::new(); + let mut out: Vec = Vec::new(); + for &t in terms { + if !seen.contains(&t.json_key()) { + seen.push(t.json_key()); + out.push(t); + } + } + out + } + /// JSON keys whose payload must be a non-empty array across these terms /// (deduped, in order). Symmetric to [`Term::term_json_keys`]; drives the /// domain CHECK's non-empty-array clauses. See [`Term::nonempty_array_key`]. @@ -162,3 +193,30 @@ impl Term { .unwrap_or(Role::Storage) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn binding_newtype_maps_each_term() { + assert_eq!(Term::Hm.binding_newtype(), "Hmac256"); + assert_eq!(Term::Ore.binding_newtype(), "OreBlock256"); + assert_eq!(Term::Bloom.binding_newtype(), "BloomFilter"); + } + + #[test] + fn payload_terms_is_one_field_per_json_key_in_order() { + let keys: Vec<&str> = Term::payload_terms(&[Term::Hm, Term::Ore]) + .iter() + .map(|t| t.json_key()) + .collect(); + assert_eq!(keys, ["hm", "ob"]); + let keys: Vec<&str> = Term::payload_terms(&[Term::Hm, Term::Hm]) + .iter() + .map(|t| t.json_key()) + .collect(); + assert_eq!(keys, ["hm"]); + assert!(Term::payload_terms(&[]).is_empty()); + } +} From 82b10207f0bc3f0774ab136f7ae0e94dd43e1f6a Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 17:04:13 +1000 Subject: [PATCH 377/599] feat(eql-codegen): emit per-family payload structs from the catalog render_family_bindings renders each DomainFamily to its struct set + three- method DomainType impls (schema -> schemars::Schema, 1.x), with pinned envelope-then-term field order (Term::payload_terms, matching on the enum), the canonical derive/ts/serde attributes, a precise term-newtype import set, and one catalog-derived struct doc line (no field docs). --- crates/eql-codegen/src/bindings.rs | 215 +++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index 19e631eea..a1a629317 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -7,6 +7,9 @@ //! the `// @generated` ownership marker prepended as line 1. use proc_macro2::TokenStream; +use quote::{format_ident, quote}; + +use eql_domains::{Domain, DomainFamily, Term}; use crate::consts::RUST_GENERATED_MARKER; @@ -53,11 +56,223 @@ fn rustfmt(src: &str) -> String { String::from_utf8(out.stdout).expect("rustfmt output is UTF-8") } +/// PascalCase a snake_case domain name: "int4_ord_ore" -> "Int4OrdOre". +fn pascal(name: &str) -> String { + name.split('_') + .filter(|s| !s.is_empty()) + .map(|s| { + let mut chars = s.chars(); + match chars.next() { + Some(first) => first.to_uppercase().collect::() + chars.as_str(), + None => String::new(), + } + }) + .collect() +} + +/// Capability label for a domain's single catalog-derived doc line, keyed on +/// the bare domain name. Parallels the SQL emitter's per-domain `--! @brief`. +fn capability_label(domain_name: &str) -> &'static str { + match domain_name { + "" => "storage-only domain", + "eq" => "equality domain", + "ord" | "ord_ore" => "ordering domain", + "match" => "match domain", + "search" => "search domain", + _ => "encrypted domain", + } +} + +/// One payload struct + its three-method `DomainType` impl. One struct doc +/// line, no field docs. Term fields come from `Term::payload_terms`, matching +/// on the enum for the field key and its newtype. The `schema` method returns +/// `schemars::Schema` (1.x). +fn render_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { + let full = domain.full_name(family.name); + let ident = format_ident!("{}", pascal(&full)); + let sql_domain = format!("eql_v3.{full}"); + let sdoc = format!("`eql_v3.{full}` — {}.", capability_label(domain.name)); + + let mut fields = TokenStream::new(); + fields.extend(quote! { pub v: SchemaVersion, }); + fields.extend(quote! { pub i: Identifier, }); + fields.extend(quote! { pub c: Ciphertext, }); + for term in Term::payload_terms(domain.terms) { + let fid = format_ident!("{}", term.json_key()); + let tid = format_ident!("{}", term.binding_newtype()); + fields.extend(quote! { pub #fid: #tid, }); + } + + quote! { + #[doc = #sdoc] + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] + #[ts(export, export_to = "v3/")] + #[serde(deny_unknown_fields)] + pub struct #ident { + #fields + } + + impl DomainType for #ident { + fn sql_domain_static() -> &'static str { + #sql_domain + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn schema(&self) -> Schema { + schema_for!(#ident) + } + } + } +} + +/// Render a whole family module (`int4.rs`, `text.rs`, …): the import header +/// (exactly the term newtypes the family uses) followed by every domain's +/// struct + impl. +pub fn render_family_bindings(family: &DomainFamily) -> String { + let mut used: Vec<&'static str> = vec!["Ciphertext"]; + for d in family.domains { + for term in Term::payload_terms(d.terms) { + let t = term.binding_newtype(); + if !used.contains(&t) { + used.push(t); + } + } + } + let used_idents: Vec<_> = used.iter().map(|t| format_ident!("{t}")).collect(); + + let structs: TokenStream = family + .domains + .iter() + .map(|d| render_struct(family, d)) + .collect(); + + let mod_doc = format!( + "The `{}` encrypted-domain family — generated from the eql-domains catalog.", + family.name + ); + + let file = quote! { + #![doc = #mod_doc] + + use schemars::{schema_for, Schema}; + + use crate::v3::terms::{ #(#used_idents),* }; + use crate::v3::DomainType; + use crate::{Identifier, SchemaVersion}; + use schemars::JsonSchema; + use serde::{Deserialize, Serialize}; + use ts_rs::TS; + + #structs + }; + + format_rs(file) +} + #[cfg(test)] mod tests { use super::*; + use eql_domains::CATALOG; use quote::quote; + fn family(name: &str) -> &'static eql_domains::DomainFamily { + CATALOG.iter().find(|f| f.name == name).expect("family") + } + + /// Declared field idents of `struct_name` in generated source, in order. + fn field_idents(src: &str, struct_name: &str) -> Vec { + let file = syn::parse_file(src).expect("generated source parses"); + for item in &file.items { + if let syn::Item::Struct(s) = item { + if s.ident == struct_name { + return s + .fields + .iter() + .map(|f| f.ident.as_ref().expect("named field").to_string()) + .collect(); + } + } + } + panic!("struct {struct_name} not found in generated source"); + } + + #[test] + fn int4_family_structs_have_pinned_shape() { + let out = render_family_bindings(family("int4")); + assert!(out.starts_with(crate::consts::RUST_GENERATED_MARKER)); + for s in [ + "struct Int4 ", + "struct Int4Eq ", + "struct Int4OrdOre ", + "struct Int4Ord ", + ] { + assert!(out.contains(s), "missing {s}"); + } + assert_eq!( + out.matches( + "#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]" + ) + .count(), + 4 + ); + assert_eq!(out.matches("#[ts(export, export_to = \"v3/\")]").count(), 4); + assert_eq!(out.matches("#[serde(deny_unknown_fields)]").count(), 4); + assert!(out.contains("`eql_v3.int4_eq` — equality domain.")); + assert!(out.contains("`eql_v3.int4` — storage-only domain.")); + assert!(out.contains("`eql_v3.int4_ord` — ordering domain.")); + assert!(!out.contains("Envelope version")); + assert!(!out.contains("HMAC-SHA-256 equality term")); + assert_eq!(field_idents(&out, "Int4"), ["v", "i", "c"]); + assert_eq!(field_idents(&out, "Int4Eq"), ["v", "i", "c", "hm"]); + assert_eq!(field_idents(&out, "Int4OrdOre"), ["v", "i", "c", "ob"]); + assert_eq!(field_idents(&out, "Int4Ord"), ["v", "i", "c", "ob"]); + assert!(out.contains("impl DomainType for Int4Eq")); + assert!(out.contains("fn sql_domain_static()")); + assert!(out.contains("\"eql_v3.int4_eq\"")); + assert!(out.contains("fn sql_domain(&self)")); + assert!(out.contains("fn schema(&self) -> Schema")); + assert!(out.contains("schema_for!(Int4Eq)")); + assert!(out.contains("use crate::v3::terms::")); + assert!(!out.contains("BloomFilter")); + } + + #[test] + fn text_family_includes_bloom_and_dual_term_ord() { + let out = render_family_bindings(family("text")); + for s in [ + "struct Text ", + "struct TextEq ", + "struct TextMatch ", + "struct TextOrdOre ", + "struct TextOrd ", + "struct TextSearch ", + ] { + assert!(out.contains(s), "missing {s}"); + } + assert!(out.contains("`eql_v3.text_match` — match domain.")); + assert!(out.contains("`eql_v3.text_search` — search domain.")); + assert!(out.contains("bf: BloomFilter")); + assert_eq!(field_idents(&out, "TextOrd"), ["v", "i", "c", "hm", "ob"]); + assert_eq!(field_idents(&out, "TextMatch"), ["v", "i", "c", "bf"]); + assert_eq!( + field_idents(&out, "TextSearch"), + ["v", "i", "c", "hm", "ob", "bf"] + ); + } + + #[test] + fn bool_storage_only_family_has_one_struct_no_terms() { + let out = render_family_bindings(family("bool")); + assert_eq!(out.matches("pub struct ").count(), 1); + assert!(out.contains("`eql_v3.bool` — storage-only domain.")); + assert_eq!(field_idents(&out, "Bool"), ["v", "i", "c"]); + assert!(out.contains("use crate::v3::terms::")); + assert!(!out.contains("Hmac256")); + assert!(!out.contains("OreBlock256")); + assert!(!out.contains("BloomFilter")); + } + #[test] fn format_rs_prepends_marker_and_is_rustfmt_clean() { // Deliberately mis-spaced input: rustfmt must normalize it, proving the From eb0d650d1d777132f30141ef6c886816f1fdf2af Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 17:05:15 +1000 Subject: [PATCH 378/599] feat(eql-codegen): emit the v3 inventory.rs all() from the catalog render_inventory_rs generates all() in CATALOG order (entries via super::), replacing the hand-maintained inventory. mod.rs stays hand-written (module doc + pub mod decls + re-exports). --- crates/eql-codegen/src/bindings.rs | 72 +++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index a1a629317..f4c1ca621 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -9,7 +9,7 @@ use proc_macro2::TokenStream; use quote::{format_ident, quote}; -use eql_domains::{Domain, DomainFamily, Term}; +use eql_domains::{Domain, DomainFamily, Term, CATALOG}; use crate::consts::RUST_GENERATED_MARKER; @@ -170,6 +170,49 @@ pub fn render_family_bindings(family: &DomainFamily) -> String { format_rs(file) } +/// Render the generated `crates/eql-bindings/src/v3/inventory.rs`: just `all()` +/// in CATALOG order, referencing the family structs through `super::`. The +/// `pub mod` declarations, the trait re-export, the trait/newtypes, and the +/// architectural module doc all stay hand-written (mod.rs / domain_type.rs / +/// terms.rs). +pub fn render_inventory_rs() -> String { + let all_entries: TokenStream = CATALOG + .iter() + .flat_map(|f| { + let m = format_ident!("{}", f.name); + f.domains + .iter() + .map(move |d| { + let s = format_ident!("{}", pascal(&d.full_name(f.name))); + quote! { Box::new(PhantomData::), } + }) + .collect::>() + }) + .collect(); + + let mod_doc = "The `all()` inventory — every v3 domain payload type in \ + eql-domains::CATALOG order. Generated from the catalog; the \ + DomainType trait, the shared newtypes, and the architectural \ + module doc stay hand-written (domain_type.rs / terms.rs / mod.rs)."; + + let file = quote! { + #![doc = #mod_doc] + + use std::marker::PhantomData; + + use super::domain_type::DomainType; + + /// Every v3 domain type, in `eql-domains::CATALOG` order — generated. + pub fn all() -> Vec> { + vec![ + #all_entries + ] + } + }; + + format_rs(file) +} + #[cfg(test)] mod tests { use super::*; @@ -273,6 +316,33 @@ mod tests { assert!(!out.contains("BloomFilter")); } + #[test] + fn inventory_enumerates_all_in_catalog_order() { + let out = render_inventory_rs(); + assert!(out.starts_with(crate::consts::RUST_GENERATED_MARKER)); + assert!(out.contains("pub fn all() -> Vec>")); + assert!(!out.contains("pub mod ")); + let first = out.find("PhantomData::").unwrap(); + let last = out.find("PhantomData::").unwrap(); + assert!(first < last); + for ty in [ + "super::text::Text", + "super::text::TextEq", + "super::text::TextMatch", + "super::text::TextOrdOre", + "super::text::TextOrd", + "super::text::TextSearch", + ] { + assert!( + out.contains(&format!("PhantomData::<{ty}>")), + "missing {ty}" + ); + } + let entries = out.matches("Box::new(PhantomData::<").count(); + let domains: usize = eql_domains::CATALOG.iter().map(|f| f.domains.len()).sum(); + assert_eq!(entries, domains); + } + #[test] fn format_rs_prepends_marker_and_is_rustfmt_clean() { // Deliberately mis-spaced input: rustfmt must normalize it, proving the From 27f312d3ac95b7db2b3ba6a07caedbd5da705b72 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 17:06:22 +1000 Subject: [PATCH 379/599] feat(eql-codegen): generate_bindings orchestrator + bindings subcommand generate_bindings writes one .rs per catalog family + inventory.rs under crates/eql-bindings/src/v3 (GeneratedKind::Rust ownership). Exposed as `eql-codegen bindings`; the default no-arg run stays SQL-only so build / codegen:parity are unaffected. --- crates/eql-codegen/src/bindings.rs | 60 ++++++++++++++++++++++++++++++ crates/eql-codegen/src/main.rs | 21 +++++++++++ 2 files changed, 81 insertions(+) diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index f4c1ca621..a760836b4 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -6,12 +6,18 @@ //! `rustfmt` (prettyplease is rustfmt-clean but not rustfmt-identical), with //! the `// @generated` ownership marker prepended as line 1. +use std::path::{Path, PathBuf}; + use proc_macro2::TokenStream; use quote::{format_ident, quote}; use eql_domains::{Domain, DomainFamily, Term, CATALOG}; use crate::consts::RUST_GENERATED_MARKER; +use crate::writer::{ + clean_generated_files, ensure_generated_paths_writable, write_generated_file, GeneratedKind, + WriteError, +}; /// Format a token stream into committed Rust source. `prettyplease::unparse` /// gives deterministic, parseable output; the `@generated` marker is prepended @@ -213,6 +219,38 @@ pub fn render_inventory_rs() -> String { format_rs(file) } +/// Relative path (from repo root) of the generated v3 bindings directory. +const V3_BINDINGS_DIR: &str = "crates/eql-bindings/src/v3"; + +/// Regenerate every committed Rust binding file under `out_root`: one +/// `.rs` per catalog family plus the `inventory.rs` `all()` list. +/// Hand-written `terms.rs` / `domain_type.rs` / `mod.rs` carry no marker, so +/// they are never cleaned or clobbered. Returns the written paths. +pub fn generate_bindings(out_root: &Path) -> Result, WriteError> { + let dir = out_root.join(V3_BINDINGS_DIR); + + let mut targets: Vec = CATALOG + .iter() + .map(|f| dir.join(format!("{}.rs", f.name))) + .collect(); + targets.push(dir.join("inventory.rs")); + + ensure_generated_paths_writable(&targets, GeneratedKind::Rust)?; + clean_generated_files(&dir, GeneratedKind::Rust)?; + + let mut written = Vec::new(); + for f in CATALOG { + let p = dir.join(format!("{}.rs", f.name)); + write_generated_file(&p, &render_family_bindings(f), GeneratedKind::Rust)?; + written.push(p); + } + let invp = dir.join("inventory.rs"); + write_generated_file(&invp, &render_inventory_rs(), GeneratedKind::Rust)?; + written.push(invp); + + Ok(written) +} + #[cfg(test)] mod tests { use super::*; @@ -316,6 +354,28 @@ mod tests { assert!(!out.contains("BloomFilter")); } + #[test] + fn generate_bindings_writes_family_files_and_inventory_with_markers() { + let tmp = crate::writer::test_support::tempdir(); + let written = generate_bindings(tmp.path()).unwrap(); + let dir = tmp.path().join("crates/eql-bindings/src/v3"); + assert_eq!(written.len(), eql_domains::CATALOG.len() + 1); + assert!(dir.join("int4.rs").is_file()); + assert!(dir.join("text.rs").is_file()); + assert!(dir.join("inventory.rs").is_file()); + assert!( + !dir.join("mod.rs").exists(), + "mod.rs stays hand-written; not generated" + ); + for p in &written { + let body = std::fs::read_to_string(p).unwrap(); + assert!( + body.starts_with(crate::consts::RUST_GENERATED_MARKER), + "{p:?}" + ); + } + } + #[test] fn inventory_enumerates_all_in_catalog_order() { let out = render_inventory_rs(); diff --git a/crates/eql-codegen/src/main.rs b/crates/eql-codegen/src/main.rs index 336b0ac04..30085c870 100644 --- a/crates/eql-codegen/src/main.rs +++ b/crates/eql-codegen/src/main.rs @@ -27,6 +27,26 @@ fn main() -> ExitCode { return ExitCode::SUCCESS; } + // `bindings`: regenerate the committed Rust payload bindings under + // crates/eql-bindings/src/v3. The default no-arg run stays SQL-only; this + // is wired as the first step of `mise run types:generate`. + if args.len() == 2 && args[1] == "bindings" { + match eql_codegen::bindings::generate_bindings(&repo_root()) { + Ok(written) => { + for p in &written { + let rel = p.strip_prefix(repo_root()).unwrap_or(p); + println!("generated {}", rel.display()); + } + println!("bindings: ok ({} files)", written.len()); + return ExitCode::SUCCESS; + } + Err(e) => { + eprintln!("error: {e}"); + return ExitCode::FAILURE; + } + } + } + if args.len() == 1 { // No args: generate every type's gitignored SQL surface. match generate_all(&repo_root()) { @@ -42,5 +62,6 @@ fn main() -> ExitCode { eprintln!("Usage: eql-codegen (generate all types)"); eprintln!(" eql-codegen list-types (print catalog tokens)"); eprintln!(" eql-codegen dump-catalog (print catalog surface as JSON)"); + eprintln!(" eql-codegen bindings (regenerate eql-bindings Rust payload types)"); ExitCode::from(2) } From d4bbc0a6b4a3530e422c126c9e972e91455751c8 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 29 Jun 2026 19:08:57 +1000 Subject: [PATCH 380/599] feat(eql-bindings): generate v3 payload bindings from the catalog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One Rust payload struct per eql_v3 SQL domain, generated by eql-codegen from eql-domains::CATALOG, with ts-rs/schemars deriving the committed TypeScript and JSON Schema. Each struct carries a catalog-derived doc — a summary line plus the supported operators and required payload keys (capability label, Term::operators_for_terms, ENVELOPE_KEYS ++ Term::term_json_keys); the keys list surfaces structural distinctions such as text's dual-term ordered domains (hm + ob) versus the integer ordered domains (ob). No per-field docs: per-term semantics live on the shared term newtypes and non-derivable per-family caveats in mod.rs. mise run types:generate regenerates Rust then TS/JSON; types:check is the committed-reference drift gate. --- crates/eql-bindings/bindings/v3/Bool.ts | 19 +- crates/eql-bindings/bindings/v3/Date.ts | 19 +- crates/eql-bindings/bindings/v3/DateEq.ts | 23 +- crates/eql-bindings/bindings/v3/DateOrd.ts | 23 +- crates/eql-bindings/bindings/v3/DateOrdOre.ts | 23 +- crates/eql-bindings/bindings/v3/Float4.ts | 19 +- crates/eql-bindings/bindings/v3/Float4Eq.ts | 23 +- crates/eql-bindings/bindings/v3/Float4Ord.ts | 23 +- .../eql-bindings/bindings/v3/Float4OrdOre.ts | 23 +- crates/eql-bindings/bindings/v3/Float8.ts | 19 +- crates/eql-bindings/bindings/v3/Float8Eq.ts | 23 +- crates/eql-bindings/bindings/v3/Float8Ord.ts | 23 +- .../eql-bindings/bindings/v3/Float8OrdOre.ts | 23 +- crates/eql-bindings/bindings/v3/Int2.ts | 19 +- crates/eql-bindings/bindings/v3/Int2Eq.ts | 23 +- crates/eql-bindings/bindings/v3/Int2Ord.ts | 23 +- crates/eql-bindings/bindings/v3/Int2OrdOre.ts | 23 +- crates/eql-bindings/bindings/v3/Int4.ts | 19 +- crates/eql-bindings/bindings/v3/Int4Eq.ts | 23 +- crates/eql-bindings/bindings/v3/Int4Ord.ts | 23 +- crates/eql-bindings/bindings/v3/Int4OrdOre.ts | 25 +- crates/eql-bindings/bindings/v3/Int8.ts | 19 +- crates/eql-bindings/bindings/v3/Int8Eq.ts | 23 +- crates/eql-bindings/bindings/v3/Int8Ord.ts | 23 +- crates/eql-bindings/bindings/v3/Int8OrdOre.ts | 23 +- crates/eql-bindings/bindings/v3/Numeric.ts | 19 +- crates/eql-bindings/bindings/v3/NumericEq.ts | 23 +- crates/eql-bindings/bindings/v3/NumericOrd.ts | 23 +- .../eql-bindings/bindings/v3/NumericOrdOre.ts | 23 +- crates/eql-bindings/bindings/v3/Text.ts | 19 +- crates/eql-bindings/bindings/v3/TextEq.ts | 23 +- crates/eql-bindings/bindings/v3/TextMatch.ts | 23 +- crates/eql-bindings/bindings/v3/TextOrd.ts | 29 +- crates/eql-bindings/bindings/v3/TextOrdOre.ts | 30 +- crates/eql-bindings/bindings/v3/TextSearch.ts | 33 +-- .../eql-bindings/bindings/v3/Timestamptz.ts | 19 +- .../eql-bindings/bindings/v3/TimestamptzEq.ts | 23 +- .../bindings/v3/TimestamptzOrd.ts | 23 +- .../bindings/v3/TimestamptzOrdOre.ts | 23 +- crates/eql-bindings/schema/v3/bool.json | 11 +- crates/eql-bindings/schema/v3/date.json | 11 +- crates/eql-bindings/schema/v3/date_eq.json | 14 +- crates/eql-bindings/schema/v3/date_ord.json | 14 +- .../eql-bindings/schema/v3/date_ord_ore.json | 14 +- crates/eql-bindings/schema/v3/float4.json | 11 +- crates/eql-bindings/schema/v3/float4_eq.json | 14 +- crates/eql-bindings/schema/v3/float4_ord.json | 14 +- .../schema/v3/float4_ord_ore.json | 14 +- crates/eql-bindings/schema/v3/float8.json | 11 +- crates/eql-bindings/schema/v3/float8_eq.json | 14 +- crates/eql-bindings/schema/v3/float8_ord.json | 14 +- .../schema/v3/float8_ord_ore.json | 14 +- crates/eql-bindings/schema/v3/int2.json | 11 +- crates/eql-bindings/schema/v3/int2_eq.json | 14 +- crates/eql-bindings/schema/v3/int2_ord.json | 14 +- .../eql-bindings/schema/v3/int2_ord_ore.json | 14 +- crates/eql-bindings/schema/v3/int4.json | 11 +- crates/eql-bindings/schema/v3/int4_eq.json | 14 +- crates/eql-bindings/schema/v3/int4_ord.json | 14 +- .../eql-bindings/schema/v3/int4_ord_ore.json | 14 +- crates/eql-bindings/schema/v3/int8.json | 11 +- crates/eql-bindings/schema/v3/int8_eq.json | 14 +- crates/eql-bindings/schema/v3/int8_ord.json | 14 +- .../eql-bindings/schema/v3/int8_ord_ore.json | 14 +- crates/eql-bindings/schema/v3/numeric.json | 11 +- crates/eql-bindings/schema/v3/numeric_eq.json | 14 +- .../eql-bindings/schema/v3/numeric_ord.json | 14 +- .../schema/v3/numeric_ord_ore.json | 14 +- crates/eql-bindings/schema/v3/text.json | 11 +- crates/eql-bindings/schema/v3/text_eq.json | 14 +- crates/eql-bindings/schema/v3/text_match.json | 14 +- crates/eql-bindings/schema/v3/text_ord.json | 17 +- .../eql-bindings/schema/v3/text_ord_ore.json | 17 +- .../eql-bindings/schema/v3/text_search.json | 20 +- .../eql-bindings/schema/v3/timestamptz.json | 11 +- .../schema/v3/timestamptz_eq.json | 14 +- .../schema/v3/timestamptz_ord.json | 14 +- .../schema/v3/timestamptz_ord_ore.json | 14 +- crates/eql-bindings/src/v3/bool.rs | 32 +-- crates/eql-bindings/src/v3/date.rs | 62 +---- crates/eql-bindings/src/v3/domain_type.rs | 8 +- crates/eql-bindings/src/v3/float4.rs | 72 +---- crates/eql-bindings/src/v3/float8.rs | 81 +----- crates/eql-bindings/src/v3/int2.rs | 60 +--- crates/eql-bindings/src/v3/int4.rs | 68 +---- crates/eql-bindings/src/v3/int8.rs | 60 +--- crates/eql-bindings/src/v3/inventory.rs | 93 +++---- crates/eql-bindings/src/v3/mod.rs | 16 +- crates/eql-bindings/src/v3/numeric.rs | 67 +---- crates/eql-bindings/src/v3/text.rs | 98 ++----- crates/eql-bindings/src/v3/timestamptz.rs | 68 +---- crates/eql-codegen/src/bindings.rs | 260 +++++++++++++++--- crates/eql-codegen/src/writer.rs | 75 ++++- crates/eql-domains/src/spec.rs | 48 ++++ crates/eql-domains/src/term.rs | 37 +-- mise.toml | 26 +- 96 files changed, 917 insertions(+), 1724 deletions(-) diff --git a/crates/eql-bindings/bindings/v3/Bool.ts b/crates/eql-bindings/bindings/v3/Bool.ts index 06b4fdf35..e9fff3004 100644 --- a/crates/eql-bindings/bindings/v3/Bool.ts +++ b/crates/eql-bindings/bindings/v3/Bool.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.bool` — storage only / encryption-only; every operator is blocked. + * `eql_v3.bool` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Bool = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Bool = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/Date.ts b/crates/eql-bindings/bindings/v3/Date.ts index 06002db6e..08a16cd62 100644 --- a/crates/eql-bindings/bindings/v3/Date.ts +++ b/crates/eql-bindings/bindings/v3/Date.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.date` — storage only; every operator is blocked. + * `eql_v3.date` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Date = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Date = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/DateEq.ts b/crates/eql-bindings/bindings/v3/DateEq.ts index 9bad29675..cb1770f91 100644 --- a/crates/eql-bindings/bindings/v3/DateEq.ts +++ b/crates/eql-bindings/bindings/v3/DateEq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.date_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.date_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type DateEq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type DateEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/DateOrd.ts b/crates/eql-bindings/bindings/v3/DateOrd.ts index c81eb642a..f038cde74 100644 --- a/crates/eql-bindings/bindings/v3/DateOrd.ts +++ b/crates/eql-bindings/bindings/v3/DateOrd.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.date_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type DateOrd = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlock256, }; +export type DateOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/DateOrdOre.ts b/crates/eql-bindings/bindings/v3/DateOrdOre.ts index 4baf81f67..53235f461 100644 --- a/crates/eql-bindings/bindings/v3/DateOrdOre.ts +++ b/crates/eql-bindings/bindings/v3/DateOrdOre.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. + * `eql_v3.date_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type DateOrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlock256, }; +export type DateOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Float4.ts b/crates/eql-bindings/bindings/v3/Float4.ts index 73752d78e..889bbef98 100644 --- a/crates/eql-bindings/bindings/v3/Float4.ts +++ b/crates/eql-bindings/bindings/v3/Float4.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float4` — storage only; every operator is blocked. + * `eql_v3.float4` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Float4 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Float4 = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/Float4Eq.ts b/crates/eql-bindings/bindings/v3/Float4Eq.ts index d734162b5..4603cff7a 100644 --- a/crates/eql-bindings/bindings/v3/Float4Eq.ts +++ b/crates/eql-bindings/bindings/v3/Float4Eq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float4_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.float4_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type Float4Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type Float4Eq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/Float4Ord.ts b/crates/eql-bindings/bindings/v3/Float4Ord.ts index 658564a0d..f0e6bc746 100644 --- a/crates/eql-bindings/bindings/v3/Float4Ord.ts +++ b/crates/eql-bindings/bindings/v3/Float4Ord.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.float4_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Float4Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (8 blocks for float). Serves equality too. - */ -ob: OreBlock256, }; +export type Float4Ord = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Float4OrdOre.ts b/crates/eql-bindings/bindings/v3/Float4OrdOre.ts index 9daebc7c3..6a586fc45 100644 --- a/crates/eql-bindings/bindings/v3/Float4OrdOre.ts +++ b/crates/eql-bindings/bindings/v3/Float4OrdOre.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float4_ord_ore` — full comparison, scheme-explicit name. + * `eql_v3.float4_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Float4OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (8 blocks for float). Serves equality too. - */ -ob: OreBlock256, }; +export type Float4OrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Float8.ts b/crates/eql-bindings/bindings/v3/Float8.ts index 71f064d6e..140dcb6d7 100644 --- a/crates/eql-bindings/bindings/v3/Float8.ts +++ b/crates/eql-bindings/bindings/v3/Float8.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float8` — storage only; every operator is blocked. + * `eql_v3.float8` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Float8 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Float8 = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/Float8Eq.ts b/crates/eql-bindings/bindings/v3/Float8Eq.ts index 217146375..5a70ffca6 100644 --- a/crates/eql-bindings/bindings/v3/Float8Eq.ts +++ b/crates/eql-bindings/bindings/v3/Float8Eq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float8_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.float8_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type Float8Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type Float8Eq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/Float8Ord.ts b/crates/eql-bindings/bindings/v3/Float8Ord.ts index 209b1c2ed..48d87b396 100644 --- a/crates/eql-bindings/bindings/v3/Float8Ord.ts +++ b/crates/eql-bindings/bindings/v3/Float8Ord.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.float8_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Float8Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (8 blocks for float). Serves equality too. - */ -ob: OreBlock256, }; +export type Float8Ord = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Float8OrdOre.ts b/crates/eql-bindings/bindings/v3/Float8OrdOre.ts index 9fd0d7184..106cb3cbc 100644 --- a/crates/eql-bindings/bindings/v3/Float8OrdOre.ts +++ b/crates/eql-bindings/bindings/v3/Float8OrdOre.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.float8_ord_ore` — full comparison, scheme-explicit name. + * `eql_v3.float8_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Float8OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (8 blocks for float). Serves equality too. - */ -ob: OreBlock256, }; +export type Float8OrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Int2.ts b/crates/eql-bindings/bindings/v3/Int2.ts index 9e0d8f17d..c878a9dd6 100644 --- a/crates/eql-bindings/bindings/v3/Int2.ts +++ b/crates/eql-bindings/bindings/v3/Int2.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int2` — storage only; every operator is blocked. + * `eql_v3.int2` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Int2 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Int2 = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/Int2Eq.ts b/crates/eql-bindings/bindings/v3/Int2Eq.ts index eb44df041..b87f16eda 100644 --- a/crates/eql-bindings/bindings/v3/Int2Eq.ts +++ b/crates/eql-bindings/bindings/v3/Int2Eq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.int2_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type Int2Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type Int2Eq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/Int2Ord.ts b/crates/eql-bindings/bindings/v3/Int2Ord.ts index 38e23008e..f8010d090 100644 --- a/crates/eql-bindings/bindings/v3/Int2Ord.ts +++ b/crates/eql-bindings/bindings/v3/Int2Ord.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.int2_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Int2Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlock256, }; +export type Int2Ord = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Int2OrdOre.ts b/crates/eql-bindings/bindings/v3/Int2OrdOre.ts index 1193826a4..3bf31ac82 100644 --- a/crates/eql-bindings/bindings/v3/Int2OrdOre.ts +++ b/crates/eql-bindings/bindings/v3/Int2OrdOre.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. + * `eql_v3.int2_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Int2OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlock256, }; +export type Int2OrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Int4.ts b/crates/eql-bindings/bindings/v3/Int4.ts index 3ab94a30e..4de3cd1ca 100644 --- a/crates/eql-bindings/bindings/v3/Int4.ts +++ b/crates/eql-bindings/bindings/v3/Int4.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int4` — storage only; every operator is blocked. + * `eql_v3.int4` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Int4 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Int4 = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/Int4Eq.ts b/crates/eql-bindings/bindings/v3/Int4Eq.ts index 7510a83e1..da9cf0554 100644 --- a/crates/eql-bindings/bindings/v3/Int4Eq.ts +++ b/crates/eql-bindings/bindings/v3/Int4Eq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.int4_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type Int4Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type Int4Eq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/Int4Ord.ts b/crates/eql-bindings/bindings/v3/Int4Ord.ts index ee25c6707..e6993b126 100644 --- a/crates/eql-bindings/bindings/v3/Int4Ord.ts +++ b/crates/eql-bindings/bindings/v3/Int4Ord.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.int4_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Int4Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlock256, }; +export type Int4Ord = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Int4OrdOre.ts b/crates/eql-bindings/bindings/v3/Int4OrdOre.ts index 17be0f8e3..5b697ff37 100644 --- a/crates/eql-bindings/bindings/v3/Int4OrdOre.ts +++ b/crates/eql-bindings/bindings/v3/Int4OrdOre.ts @@ -5,25 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), - * scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. + * `eql_v3.int4_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Int4OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too — ORE over a - * full-domain `int4` is lossless, so no separate `hm` is carried. - */ -ob: OreBlock256, }; +export type Int4OrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Int8.ts b/crates/eql-bindings/bindings/v3/Int8.ts index b8df9f2fe..550ab9de2 100644 --- a/crates/eql-bindings/bindings/v3/Int8.ts +++ b/crates/eql-bindings/bindings/v3/Int8.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int8` — storage only; every operator is blocked. + * `eql_v3.int8` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Int8 = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Int8 = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/Int8Eq.ts b/crates/eql-bindings/bindings/v3/Int8Eq.ts index c2633feee..aa236626c 100644 --- a/crates/eql-bindings/bindings/v3/Int8Eq.ts +++ b/crates/eql-bindings/bindings/v3/Int8Eq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.int8_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type Int8Eq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type Int8Eq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/Int8Ord.ts b/crates/eql-bindings/bindings/v3/Int8Ord.ts index 7199defdb..f1da6cfee 100644 --- a/crates/eql-bindings/bindings/v3/Int8Ord.ts +++ b/crates/eql-bindings/bindings/v3/Int8Ord.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.int8_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Int8Ord = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlock256, }; +export type Int8Ord = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Int8OrdOre.ts b/crates/eql-bindings/bindings/v3/Int8OrdOre.ts index 6dd492db2..064490c92 100644 --- a/crates/eql-bindings/bindings/v3/Int8OrdOre.ts +++ b/crates/eql-bindings/bindings/v3/Int8OrdOre.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. + * `eql_v3.int8_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type Int8OrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term. Serves equality too. - */ -ob: OreBlock256, }; +export type Int8OrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Numeric.ts b/crates/eql-bindings/bindings/v3/Numeric.ts index dfcda818a..99277adcf 100644 --- a/crates/eql-bindings/bindings/v3/Numeric.ts +++ b/crates/eql-bindings/bindings/v3/Numeric.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.numeric` — storage only; every operator is blocked. + * `eql_v3.numeric` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Numeric = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Numeric = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/NumericEq.ts b/crates/eql-bindings/bindings/v3/NumericEq.ts index e3b3ff466..f318b3017 100644 --- a/crates/eql-bindings/bindings/v3/NumericEq.ts +++ b/crates/eql-bindings/bindings/v3/NumericEq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.numeric_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.numeric_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type NumericEq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type NumericEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/NumericOrd.ts b/crates/eql-bindings/bindings/v3/NumericOrd.ts index 491295dc4..6945e4d1f 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrd.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrd.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.numeric_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.numeric_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type NumericOrd = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (14 blocks for numeric). Serves equality too. - */ -ob: OreBlock256, }; +export type NumericOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOre.ts b/crates/eql-bindings/bindings/v3/NumericOrdOre.ts index 846437451..3c14fcaa2 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrdOre.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrdOre.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.numeric_ord_ore` — full comparison, scheme-explicit name. + * `eql_v3.numeric_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type NumericOrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (14 blocks for numeric). Serves equality too. - */ -ob: OreBlock256, }; +export type NumericOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/Text.ts b/crates/eql-bindings/bindings/v3/Text.ts index e506a5a45..a6274a5da 100644 --- a/crates/eql-bindings/bindings/v3/Text.ts +++ b/crates/eql-bindings/bindings/v3/Text.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.text` — storage only; every operator is blocked. + * `eql_v3.text` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Text = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Text = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/TextEq.ts b/crates/eql-bindings/bindings/v3/TextEq.ts index e6650c6d3..e3e5c7b5c 100644 --- a/crates/eql-bindings/bindings/v3/TextEq.ts +++ b/crates/eql-bindings/bindings/v3/TextEq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.text_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.text_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type TextEq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type TextEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/TextMatch.ts b/crates/eql-bindings/bindings/v3/TextMatch.ts index 400812f51..f1f85c9e3 100644 --- a/crates/eql-bindings/bindings/v3/TextMatch.ts +++ b/crates/eql-bindings/bindings/v3/TextMatch.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.text_match` — Bloom-filter containment match. + * `eql_v3.text_match` — match domain. + * + * Operators: `@>` `<@`. Required keys: `v` `i` `c` `bf`. */ -export type TextMatch = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Bloom-filter match term (signed smallint bit positions). - */ -bf: BloomFilter, }; +export type TextMatch = { v: SchemaVersion, i: Identifier, c: Ciphertext, bf: BloomFilter, }; diff --git a/crates/eql-bindings/bindings/v3/TextOrd.ts b/crates/eql-bindings/bindings/v3/TextOrd.ts index e3e1de7d6..f6c7c856d 100644 --- a/crates/eql-bindings/bindings/v3/TextOrd.ts +++ b/crates/eql-bindings/bindings/v3/TextOrd.ts @@ -6,29 +6,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.text_ord` — full lexicographic comparison - * (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` - * (ordering) — text routes equality through `hm` (`[Hm, Ore]`). + * `eql_v3.text_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`. */ -export type TextOrd = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. - */ -hm: Hmac256, -/** - * Block-ORE order term. - */ -ob: OreBlock256, }; +export type TextOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/TextOrdOre.ts b/crates/eql-bindings/bindings/v3/TextOrdOre.ts index 7aed3dd52..f1e264af5 100644 --- a/crates/eql-bindings/bindings/v3/TextOrdOre.ts +++ b/crates/eql-bindings/bindings/v3/TextOrdOre.ts @@ -6,30 +6,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.text_ord_ore` — full lexicographic comparison, - * scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), - * text routes equality through `hm` rather than the ORE term, so the domain - * carries both `hm` and `ob` (`[Hm, Ore]`). + * `eql_v3.text_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`. */ -export type TextOrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. - */ -hm: Hmac256, -/** - * Block-ORE order term. - */ -ob: OreBlock256, }; +export type TextOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/TextSearch.ts b/crates/eql-bindings/bindings/v3/TextSearch.ts index e95709378..fe46d46cf 100644 --- a/crates/eql-bindings/bindings/v3/TextSearch.ts +++ b/crates/eql-bindings/bindings/v3/TextSearch.ts @@ -7,33 +7,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.text_search` — the full text search surface: HMAC equality, ORE - * ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The - * superset domain combining `_eq`, `_ord`, and `_match`. + * `eql_v3.text_search` — search domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`. */ -export type TextSearch = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, -/** - * Block-ORE order term. - */ -ob: OreBlock256, -/** - * Bloom-filter match term (signed smallint bit positions). - */ -bf: BloomFilter, }; +export type TextSearch = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, ob: OreBlock256, bf: BloomFilter, }; diff --git a/crates/eql-bindings/bindings/v3/Timestamptz.ts b/crates/eql-bindings/bindings/v3/Timestamptz.ts index 62ddc82ec..ad15c7ede 100644 --- a/crates/eql-bindings/bindings/v3/Timestamptz.ts +++ b/crates/eql-bindings/bindings/v3/Timestamptz.ts @@ -4,19 +4,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.timestamptz` — storage only; every operator is blocked. + * `eql_v3.timestamptz` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. */ -export type Timestamptz = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, }; +export type Timestamptz = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/crates/eql-bindings/bindings/v3/TimestamptzEq.ts b/crates/eql-bindings/bindings/v3/TimestamptzEq.ts index e27254734..d0d09d557 100644 --- a/crates/eql-bindings/bindings/v3/TimestamptzEq.ts +++ b/crates/eql-bindings/bindings/v3/TimestamptzEq.ts @@ -5,23 +5,8 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). + * `eql_v3.timestamptz_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. */ -export type TimestamptzEq = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * HMAC-SHA-256 equality term. - */ -hm: Hmac256, }; +export type TimestamptzEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/TimestamptzOrd.ts b/crates/eql-bindings/bindings/v3/TimestamptzOrd.ts index 19b975732..b99b4a208 100644 --- a/crates/eql-bindings/bindings/v3/TimestamptzOrd.ts +++ b/crates/eql-bindings/bindings/v3/TimestamptzOrd.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.timestamptz_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). + * `eql_v3.timestamptz_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type TimestamptzOrd = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (12 blocks for timestamptz). Serves equality too. - */ -ob: OreBlock256, }; +export type TimestamptzOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/TimestamptzOrdOre.ts b/crates/eql-bindings/bindings/v3/TimestamptzOrdOre.ts index a84d68088..497782692 100644 --- a/crates/eql-bindings/bindings/v3/TimestamptzOrdOre.ts +++ b/crates/eql-bindings/bindings/v3/TimestamptzOrdOre.ts @@ -5,23 +5,8 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `eql_v3.timestamptz_ord_ore` — full comparison, scheme-explicit name. + * `eql_v3.timestamptz_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. */ -export type TimestamptzOrdOre = { -/** - * Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - * value fails deserialization. - */ -v: SchemaVersion, -/** - * Table/column identifier. Required by the domain CHECK. - */ -i: Identifier, -/** - * mp_base85 source ciphertext. Required by the domain CHECK. - */ -c: Ciphertext, -/** - * Block-ORE order term (12 blocks for timestamptz). Serves equality too. - */ -ob: OreBlock256, }; +export type TimestamptzOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/crates/eql-bindings/schema/v3/bool.json b/crates/eql-bindings/schema/v3/bool.json index f60fbe16a..2700a83a7 100644 --- a/crates/eql-bindings/schema/v3/bool.json +++ b/crates/eql-bindings/schema/v3/bool.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/bool.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.bool` — storage only / encryption-only; every operator is blocked.", + "description": "`eql_v3.bool` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/date.json b/crates/eql-bindings/schema/v3/date.json index 2b98d521b..1c17fab22 100644 --- a/crates/eql-bindings/schema/v3/date.json +++ b/crates/eql-bindings/schema/v3/date.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/date.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.date` — storage only; every operator is blocked.", + "description": "`eql_v3.date` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/date_eq.json b/crates/eql-bindings/schema/v3/date_eq.json index 6d87ca62f..e1904b313 100644 --- a/crates/eql-bindings/schema/v3/date_eq.json +++ b/crates/eql-bindings/schema/v3/date_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.date_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.date_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/date_ord.json b/crates/eql-bindings/schema/v3/date_ord.json index 57d58b312..2a64c4c7d 100644 --- a/crates/eql-bindings/schema/v3/date_ord.json +++ b/crates/eql-bindings/schema/v3/date_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.date_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/date_ord_ore.json b/crates/eql-bindings/schema/v3/date_ord_ore.json index 8b4b3a593..b2ffeda8b 100644 --- a/crates/eql-bindings/schema/v3/date_ord_ore.json +++ b/crates/eql-bindings/schema/v3/date_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.date_ord_ore` — full comparison, scheme-explicit name.", + "description": "`eql_v3.date_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float4.json b/crates/eql-bindings/schema/v3/float4.json index 32943f12a..b4d726a2c 100644 --- a/crates/eql-bindings/schema/v3/float4.json +++ b/crates/eql-bindings/schema/v3/float4.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float4.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float4` — storage only; every operator is blocked.", + "description": "`eql_v3.float4` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float4_eq.json b/crates/eql-bindings/schema/v3/float4_eq.json index 3dc29efcd..90469a3a8 100644 --- a/crates/eql-bindings/schema/v3/float4_eq.json +++ b/crates/eql-bindings/schema/v3/float4_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float4_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float4_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.float4_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float4_ord.json b/crates/eql-bindings/schema/v3/float4_ord.json index 0fd6f1d34..aa05fb2cd 100644 --- a/crates/eql-bindings/schema/v3/float4_ord.json +++ b/crates/eql-bindings/schema/v3/float4_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.float4_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (8 blocks for float). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float4_ord_ore.json b/crates/eql-bindings/schema/v3/float4_ord_ore.json index ef776d7e8..790a2390b 100644 --- a/crates/eql-bindings/schema/v3/float4_ord_ore.json +++ b/crates/eql-bindings/schema/v3/float4_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float4_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float4_ord_ore` — full comparison, scheme-explicit name.", + "description": "`eql_v3.float4_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (8 blocks for float). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float8.json b/crates/eql-bindings/schema/v3/float8.json index 4a5275039..ee3cb70ac 100644 --- a/crates/eql-bindings/schema/v3/float8.json +++ b/crates/eql-bindings/schema/v3/float8.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float8.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float8` — storage only; every operator is blocked.", + "description": "`eql_v3.float8` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float8_eq.json b/crates/eql-bindings/schema/v3/float8_eq.json index 203c218ab..b1780b509 100644 --- a/crates/eql-bindings/schema/v3/float8_eq.json +++ b/crates/eql-bindings/schema/v3/float8_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float8_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float8_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.float8_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float8_ord.json b/crates/eql-bindings/schema/v3/float8_ord.json index 416c036cb..dfe7171af 100644 --- a/crates/eql-bindings/schema/v3/float8_ord.json +++ b/crates/eql-bindings/schema/v3/float8_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.float8_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (8 blocks for float). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/float8_ord_ore.json b/crates/eql-bindings/schema/v3/float8_ord_ore.json index f58bc39c2..e3a997c73 100644 --- a/crates/eql-bindings/schema/v3/float8_ord_ore.json +++ b/crates/eql-bindings/schema/v3/float8_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/float8_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.float8_ord_ore` — full comparison, scheme-explicit name.", + "description": "`eql_v3.float8_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (8 blocks for float). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int2.json b/crates/eql-bindings/schema/v3/int2.json index c27fc54fd..5720f8dbc 100644 --- a/crates/eql-bindings/schema/v3/int2.json +++ b/crates/eql-bindings/schema/v3/int2.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int2.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int2` — storage only; every operator is blocked.", + "description": "`eql_v3.int2` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int2_eq.json b/crates/eql-bindings/schema/v3/int2_eq.json index 96a26d0bc..daae2e487 100644 --- a/crates/eql-bindings/schema/v3/int2_eq.json +++ b/crates/eql-bindings/schema/v3/int2_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int2_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int2_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.int2_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int2_ord.json b/crates/eql-bindings/schema/v3/int2_ord.json index 4678285b3..e91805b64 100644 --- a/crates/eql-bindings/schema/v3/int2_ord.json +++ b/crates/eql-bindings/schema/v3/int2_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.int2_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int2_ord_ore.json b/crates/eql-bindings/schema/v3/int2_ord_ore.json index 5d465c043..78e1f83ac 100644 --- a/crates/eql-bindings/schema/v3/int2_ord_ore.json +++ b/crates/eql-bindings/schema/v3/int2_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int2_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int2_ord_ore` — full comparison, scheme-explicit name.", + "description": "`eql_v3.int2_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int4.json b/crates/eql-bindings/schema/v3/int4.json index 6795e6620..fc239d942 100644 --- a/crates/eql-bindings/schema/v3/int4.json +++ b/crates/eql-bindings/schema/v3/int4.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int4.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int4` — storage only; every operator is blocked.", + "description": "`eql_v3.int4` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int4_eq.json b/crates/eql-bindings/schema/v3/int4_eq.json index dbc45c0d2..f919adb1c 100644 --- a/crates/eql-bindings/schema/v3/int4_eq.json +++ b/crates/eql-bindings/schema/v3/int4_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int4_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int4_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.int4_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int4_ord.json b/crates/eql-bindings/schema/v3/int4_ord.json index 9cc352ba6..7d3e26ccf 100644 --- a/crates/eql-bindings/schema/v3/int4_ord.json +++ b/crates/eql-bindings/schema/v3/int4_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.int4_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int4_ord_ore.json b/crates/eql-bindings/schema/v3/int4_ord_ore.json index 24d6e8877..baff10a3a 100644 --- a/crates/eql-bindings/schema/v3/int4_ord_ore.json +++ b/crates/eql-bindings/schema/v3/int4_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int4_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`),\nscheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain.", + "description": "`eql_v3.int4_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too — ORE over a\nfull-domain `int4` is lossless, so no separate `hm` is carried." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int8.json b/crates/eql-bindings/schema/v3/int8.json index 12555a6c9..32e0867c9 100644 --- a/crates/eql-bindings/schema/v3/int8.json +++ b/crates/eql-bindings/schema/v3/int8.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int8.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int8` — storage only; every operator is blocked.", + "description": "`eql_v3.int8` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int8_eq.json b/crates/eql-bindings/schema/v3/int8_eq.json index ea34847b0..f7cb6396d 100644 --- a/crates/eql-bindings/schema/v3/int8_eq.json +++ b/crates/eql-bindings/schema/v3/int8_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int8_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int8_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.int8_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int8_ord.json b/crates/eql-bindings/schema/v3/int8_ord.json index e65dd149d..fcb82fbb8 100644 --- a/crates/eql-bindings/schema/v3/int8_ord.json +++ b/crates/eql-bindings/schema/v3/int8_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.int8_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/int8_ord_ore.json b/crates/eql-bindings/schema/v3/int8_ord_ore.json index ea6d88fde..630860268 100644 --- a/crates/eql-bindings/schema/v3/int8_ord_ore.json +++ b/crates/eql-bindings/schema/v3/int8_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/int8_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.int8_ord_ore` — full comparison, scheme-explicit name.", + "description": "`eql_v3.int8_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term. Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/numeric.json b/crates/eql-bindings/schema/v3/numeric.json index f12015dcd..ac996aeaf 100644 --- a/crates/eql-bindings/schema/v3/numeric.json +++ b/crates/eql-bindings/schema/v3/numeric.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/numeric.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.numeric` — storage only; every operator is blocked.", + "description": "`eql_v3.numeric` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/numeric_eq.json b/crates/eql-bindings/schema/v3/numeric_eq.json index 19c11a2b5..5160cd5d9 100644 --- a/crates/eql-bindings/schema/v3/numeric_eq.json +++ b/crates/eql-bindings/schema/v3/numeric_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.numeric_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.numeric_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/numeric_ord.json b/crates/eql-bindings/schema/v3/numeric_ord.json index 64ca517eb..f9936db57 100644 --- a/crates/eql-bindings/schema/v3/numeric_ord.json +++ b/crates/eql-bindings/schema/v3/numeric_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.numeric_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.numeric_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (14 blocks for numeric). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ore.json b/crates/eql-bindings/schema/v3/numeric_ord_ore.json index 3a2aad720..355e8c8f1 100644 --- a/crates/eql-bindings/schema/v3/numeric_ord_ore.json +++ b/crates/eql-bindings/schema/v3/numeric_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.numeric_ord_ore` — full comparison, scheme-explicit name.", + "description": "`eql_v3.numeric_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (14 blocks for numeric). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/text.json b/crates/eql-bindings/schema/v3/text.json index a045b2caf..efb51f906 100644 --- a/crates/eql-bindings/schema/v3/text.json +++ b/crates/eql-bindings/schema/v3/text.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/text.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.text` — storage only; every operator is blocked.", + "description": "`eql_v3.text` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/text_eq.json b/crates/eql-bindings/schema/v3/text_eq.json index 40d452fd5..2b15151a9 100644 --- a/crates/eql-bindings/schema/v3/text_eq.json +++ b/crates/eql-bindings/schema/v3/text_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.text_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.text_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/text_match.json b/crates/eql-bindings/schema/v3/text_match.json index 98c772c40..c1453dbea 100644 --- a/crates/eql-bindings/schema/v3/text_match.json +++ b/crates/eql-bindings/schema/v3/text_match.json @@ -42,23 +42,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.text_match` — Bloom-filter containment match.", + "description": "`eql_v3.text_match` — match domain.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.", "properties": { "bf": { - "$ref": "#/$defs/BloomFilter", - "description": "Bloom-filter match term (signed smallint bit positions)." + "$ref": "#/$defs/BloomFilter" }, "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/text_ord.json b/crates/eql-bindings/schema/v3/text_ord.json index be2b77459..b8873f5d7 100644 --- a/crates/eql-bindings/schema/v3/text_ord.json +++ b/crates/eql-bindings/schema/v3/text_ord.json @@ -43,27 +43,22 @@ "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.text_ord` — full lexicographic comparison\n(`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob`\n(ordering) — text routes equality through `hm` (`[Hm, Ore]`).", + "description": "`eql_v3.text_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/text_ord_ore.json b/crates/eql-bindings/schema/v3/text_ord_ore.json index b35544c05..422d1fa23 100644 --- a/crates/eql-bindings/schema/v3/text_ord_ore.json +++ b/crates/eql-bindings/schema/v3/text_ord_ore.json @@ -43,27 +43,22 @@ "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.text_ord_ore` — full lexicographic comparison,\nscheme-explicit name. Unlike the integer ordered domains (`[Ore]` only),\ntext routes equality through `hm` rather than the ORE term, so the domain\ncarries both `hm` and `ob` (`[Hm, Ore]`).", + "description": "`eql_v3.text_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/text_search.json b/crates/eql-bindings/schema/v3/text_search.json index a66cee2bc..d24d35a7e 100644 --- a/crates/eql-bindings/schema/v3/text_search.json +++ b/crates/eql-bindings/schema/v3/text_search.json @@ -53,31 +53,25 @@ "$id": "https://schemas.cipherstash.com/eql/v3/text_search.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.text_search` — the full text search surface: HMAC equality, ORE\nordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The\nsuperset domain combining `_eq`, `_ord`, and `_match`.", + "description": "`eql_v3.text_search` — search domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.", "properties": { "bf": { - "$ref": "#/$defs/BloomFilter", - "description": "Bloom-filter match term (signed smallint bit positions)." + "$ref": "#/$defs/BloomFilter" }, "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/timestamptz.json b/crates/eql-bindings/schema/v3/timestamptz.json index d8f3650e5..72979fc1a 100644 --- a/crates/eql-bindings/schema/v3/timestamptz.json +++ b/crates/eql-bindings/schema/v3/timestamptz.json @@ -32,19 +32,16 @@ "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.timestamptz` — storage only; every operator is blocked.", + "description": "`eql_v3.timestamptz` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/timestamptz_eq.json b/crates/eql-bindings/schema/v3/timestamptz_eq.json index 490e463d1..75fd55757 100644 --- a/crates/eql-bindings/schema/v3/timestamptz_eq.json +++ b/crates/eql-bindings/schema/v3/timestamptz_eq.json @@ -36,23 +36,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`).", + "description": "`eql_v3.timestamptz_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "hm": { - "$ref": "#/$defs/Hmac256", - "description": "HMAC-SHA-256 equality term." + "$ref": "#/$defs/Hmac256" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/timestamptz_ord.json b/crates/eql-bindings/schema/v3/timestamptz_ord.json index 37557b81e..ea45adf33 100644 --- a/crates/eql-bindings/schema/v3/timestamptz_ord.json +++ b/crates/eql-bindings/schema/v3/timestamptz_ord.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.timestamptz_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`).", + "description": "`eql_v3.timestamptz_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (12 blocks for timestamptz). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json b/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json index 655bb406d..731b3e0ac 100644 --- a/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json +++ b/crates/eql-bindings/schema/v3/timestamptz_ord_ore.json @@ -39,23 +39,19 @@ "$id": "https://schemas.cipherstash.com/eql/v3/timestamptz_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`eql_v3.timestamptz_ord_ore` — full comparison, scheme-explicit name.", + "description": "`eql_v3.timestamptz_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", "properties": { "c": { - "$ref": "#/$defs/Ciphertext", - "description": "mp_base85 source ciphertext. Required by the domain CHECK." + "$ref": "#/$defs/Ciphertext" }, "i": { - "$ref": "#/$defs/Identifier", - "description": "Table/column identifier. Required by the domain CHECK." + "$ref": "#/$defs/Identifier" }, "ob": { - "$ref": "#/$defs/OreBlock256", - "description": "Block-ORE order term (12 blocks for timestamptz). Serves equality too." + "$ref": "#/$defs/OreBlock256" }, "v": { - "$ref": "#/$defs/SchemaVersion", - "description": "Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other\nvalue fails deserialization." + "$ref": "#/$defs/SchemaVersion" } }, "required": [ diff --git a/crates/eql-bindings/src/v3/bool.rs b/crates/eql-bindings/src/v3/bool.rs index 7ccc6240c..858a5806c 100644 --- a/crates/eql-bindings/src/v3/bool.rs +++ b/crates/eql-bindings/src/v3/bool.rs @@ -1,49 +1,29 @@ -//! The `bool` encrypted-domain family — the storage-only / encryption-only -//! scalar. -//! -//! | Rust type | SQL domain | Required keys | Operators | -//! |------------|----------------|---------------|---------------------| -//! | [`Bool`] | `eql_v3.bool` | `v` `i` `c` | none (storage only) | -//! -//! `bool` is the only **storage-only** scalar: it has no `_eq`/`_ord` domain -//! and carries no index term, so the value is encrypted at rest and decrypted -//! by the proxy but is never searchable server-side. A two-value column has so -//! little cardinality that any searchable index (even HMAC equality) would -//! trivially leak the plaintext distribution. The payload is `{v,i,c}` only — -//! no `hm`/`ob`/`bf` — and every operator on the domain is blocked. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `bool` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::Ciphertext; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.bool` — storage only / encryption-only; every operator is blocked. +/// `eql_v3.bool` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Bool { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Bool { fn sql_domain_static() -> &'static str { "eql_v3.bool" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Bool) } diff --git a/crates/eql-bindings/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs index ce44eba03..3e0fa45fd 100644 --- a/crates/eql-bindings/src/v3/date.rs +++ b/crates/eql-bindings/src/v3/date.rs @@ -1,130 +1,98 @@ -//! The `date` encrypted-domain family — an ordered, non-integer scalar. -//! Same four-domain ordered shape as [`crate::v3::int4`] (ORE compares -//! ciphertext, so dates order like integers); see that module for the -//! capability table. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `date` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.date` — storage only; every operator is blocked. +/// `eql_v3.date` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Date { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Date { fn sql_domain_static() -> &'static str { "eql_v3.date" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Date) } } - -/// `eql_v3.date_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.date_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateEq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for DateEq { fn sql_domain_static() -> &'static str { "eql_v3.date_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(DateEq) } } - -/// `eql_v3.date_ord_ore` — full comparison, scheme-explicit name. +/// `eql_v3.date_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateOrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. pub ob: OreBlock256, } - impl DomainType for DateOrdOre { fn sql_domain_static() -> &'static str { "eql_v3.date_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(DateOrdOre) } } - -/// `eql_v3.date_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.date_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct DateOrd { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. pub ob: OreBlock256, } - impl DomainType for DateOrd { fn sql_domain_static() -> &'static str { "eql_v3.date_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(DateOrd) } diff --git a/crates/eql-bindings/src/v3/domain_type.rs b/crates/eql-bindings/src/v3/domain_type.rs index c9a022756..6eee3694a 100644 --- a/crates/eql-bindings/src/v3/domain_type.rs +++ b/crates/eql-bindings/src/v3/domain_type.rs @@ -20,12 +20,10 @@ pub const SCHEMA_ID_BASE: &str = "https://schemas.cipherstash.com/eql/v3/"; /// value can report the SQL domain it inhabits (`payload.sql_domain()`). /// /// Each token file implements this next to the type it describes; the SQL -/// domain string is defined exactly once, in that impl, and -/// `tests/catalog_parity.rs` cross-checks every entry of [`all`] against -/// `eql-domains::CATALOG` — a typo'd or mis-ordered domain fails there. +/// domain string is defined exactly once, in that impl. `all()` is generated +/// from `eql-domains::CATALOG` (`inventory.rs`), so it cannot drift; the +/// published JSON Schema wire contract is pinned by `tests/catalog_parity.rs`. /// Public so FFI consumers can enumerate the protocol surface too. -/// -/// [`all`]: super::all pub trait DomainType { /// Fully-qualified SQL domain name, e.g. `"eql_v3.int4_eq"` — the /// per-type fact everything else derives from, defined once in each diff --git a/crates/eql-bindings/src/v3/float4.rs b/crates/eql-bindings/src/v3/float4.rs index d9549c897..944f5265e 100644 --- a/crates/eql-bindings/src/v3/float4.rs +++ b/crates/eql-bindings/src/v3/float4.rs @@ -1,140 +1,98 @@ -//! The `float4` encrypted-domain family — an ordered, non-integer scalar -//! backed by IEEE-754 `real` (`f32`). Same four-domain ordered shape as -//! [`crate::v3::int4`] (ORE compares ciphertext, so floats order like -//! integers); see that module for the capability table. -//! -//! Both float widths encrypt through a single f64 crypto path -//! (`Plaintext::Float`): a `real` is widened to f64 before encryption, so the -//! wire shape here is identical to [`crate::v3::float8`] — an 8-block `ob` term -//! (`f64::ENCODED_LEN == 8`, same as `int8`). `float4` vs `float8` is purely a -//! Postgres-surface distinction (column type, domain name). -//! -//! Special-value behaviour (`-0.0`, `±Inf`, and the **NaN is not rejected -//! server-side — reject it client-side** caveat) is identical to `float8`; see -//! [`crate::v3::float8`] for the full note. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `float4` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.float4` — storage only; every operator is blocked. +/// `eql_v3.float4` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float4 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Float4 { fn sql_domain_static() -> &'static str { "eql_v3.float4" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float4) } } - -/// `eql_v3.float4_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.float4_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float4Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for Float4Eq { fn sql_domain_static() -> &'static str { "eql_v3.float4_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float4Eq) } } - -/// `eql_v3.float4_ord_ore` — full comparison, scheme-explicit name. +/// `eql_v3.float4_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float4OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (8 blocks for float). Serves equality too. pub ob: OreBlock256, } - impl DomainType for Float4OrdOre { fn sql_domain_static() -> &'static str { "eql_v3.float4_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float4OrdOre) } } - -/// `eql_v3.float4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.float4_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float4Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (8 blocks for float). Serves equality too. pub ob: OreBlock256, } - impl DomainType for Float4Ord { fn sql_domain_static() -> &'static str { "eql_v3.float4_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float4Ord) } diff --git a/crates/eql-bindings/src/v3/float8.rs b/crates/eql-bindings/src/v3/float8.rs index 26e1863f6..4442ad27b 100644 --- a/crates/eql-bindings/src/v3/float8.rs +++ b/crates/eql-bindings/src/v3/float8.rs @@ -1,149 +1,98 @@ -//! The `float8` encrypted-domain family — an ordered, non-integer scalar -//! backed by IEEE-754 `double precision` (`f64`), the native width of the float -//! crypto path. Same four-domain ordered shape as [`crate::v3::int4`]; see that -//! module for the capability table. -//! -//! Both float widths encrypt through a single f64 crypto path -//! (`Plaintext::Float`), so the wire shape is identical to -//! [`crate::v3::float4`] — an 8-block `ob` term (`f64::ENCODED_LEN == 8`, same -//! as `int8`). -//! -//! ## Special values (caller-facing) -//! -//! `-0.0` canonicalizes to `+0.0` (equal under `=`, IEEE-consistent) and -//! `±Inf` order correctly (`-Inf < finite < +Inf`). **NaN is unordered and -//! unspecified in the encoder**: it can be encrypted, stored, and pass the -//! domain CHECK, but it carries **no comparison guarantee** and does NOT follow -//! IEEE semantics (where NaN compares false against everything). The domain -//! CHECK validates only the envelope — it cannot inspect the ciphertext — so a -//! NaN payload is never rejected server-side. **Reject NaN client-side before -//! encryption** if your column must not contain it; otherwise a NaN row sorts -//! at an arbitrary (but deterministic) position in an encrypted range scan -//! rather than being excluded the way native Postgres `double precision` would. -//! See the `float_special` regression suite for the locked behaviour. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `float8` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.float8` — storage only; every operator is blocked. +/// `eql_v3.float8` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float8 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Float8 { fn sql_domain_static() -> &'static str { "eql_v3.float8" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float8) } } - -/// `eql_v3.float8_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.float8_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float8Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for Float8Eq { fn sql_domain_static() -> &'static str { "eql_v3.float8_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float8Eq) } } - -/// `eql_v3.float8_ord_ore` — full comparison, scheme-explicit name. +/// `eql_v3.float8_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float8OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (8 blocks for float). Serves equality too. pub ob: OreBlock256, } - impl DomainType for Float8OrdOre { fn sql_domain_static() -> &'static str { "eql_v3.float8_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float8OrdOre) } } - -/// `eql_v3.float8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.float8_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Float8Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (8 blocks for float). Serves equality too. pub ob: OreBlock256, } - impl DomainType for Float8Ord { fn sql_domain_static() -> &'static str { "eql_v3.float8_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Float8Ord) } diff --git a/crates/eql-bindings/src/v3/int2.rs b/crates/eql-bindings/src/v3/int2.rs index ee179e6a1..102a56cec 100644 --- a/crates/eql-bindings/src/v3/int2.rs +++ b/crates/eql-bindings/src/v3/int2.rs @@ -1,128 +1,98 @@ -//! The `int2` encrypted-domain family. Same four-domain ordered shape as -//! [`crate::v3::int4`] — see that module for the capability table. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `int2` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.int2` — storage only; every operator is blocked. +/// `eql_v3.int2` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Int2 { fn sql_domain_static() -> &'static str { "eql_v3.int2" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int2) } } - -/// `eql_v3.int2_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.int2_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for Int2Eq { fn sql_domain_static() -> &'static str { "eql_v3.int2_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int2Eq) } } - -/// `eql_v3.int2_ord_ore` — full comparison, scheme-explicit name. +/// `eql_v3.int2_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. pub ob: OreBlock256, } - impl DomainType for Int2OrdOre { fn sql_domain_static() -> &'static str { "eql_v3.int2_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int2OrdOre) } } - -/// `eql_v3.int2_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.int2_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int2Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. pub ob: OreBlock256, } - impl DomainType for Int2Ord { fn sql_domain_static() -> &'static str { "eql_v3.int2_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int2Ord) } diff --git a/crates/eql-bindings/src/v3/int4.rs b/crates/eql-bindings/src/v3/int4.rs index 9bf97fa87..274acb957 100644 --- a/crates/eql-bindings/src/v3/int4.rs +++ b/crates/eql-bindings/src/v3/int4.rs @@ -1,136 +1,98 @@ -//! The `int4` encrypted-domain family — the reference scalar. -//! -//! | Rust type | SQL domain | Required keys | Operators | -//! |----------------|------------------------|---------------|----------------------------| -//! | [`Int4`] | `eql_v3.int4` | `v` `i` `c` | none (storage only) | -//! | [`Int4Eq`] | `eql_v3.int4_eq` | `v` `i` `c` `hm` | `=` `<>` | -//! | [`Int4OrdOre`] | `eql_v3.int4_ord_ore` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | -//! | [`Int4Ord`] | `eql_v3.int4_ord` | `v` `i` `c` `ob` | `=` `<>` `<` `<=` `>` `>=` | - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `int4` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.int4` — storage only; every operator is blocked. +/// `eql_v3.int4` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Int4 { fn sql_domain_static() -> &'static str { "eql_v3.int4" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int4) } } - -/// `eql_v3.int4_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.int4_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for Int4Eq { fn sql_domain_static() -> &'static str { "eql_v3.int4_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int4Eq) } } - -/// `eql_v3.int4_ord_ore` — full comparison (`=` `<>` `<` `<=` `>` `>=`), -/// scheme-explicit name. Same shape as [`Int4Ord`], distinct SQL domain. +/// `eql_v3.int4_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too — ORE over a - /// full-domain `int4` is lossless, so no separate `hm` is carried. pub ob: OreBlock256, } - impl DomainType for Int4OrdOre { fn sql_domain_static() -> &'static str { "eql_v3.int4_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int4OrdOre) } } - -/// `eql_v3.int4_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.int4_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int4Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. pub ob: OreBlock256, } - impl DomainType for Int4Ord { fn sql_domain_static() -> &'static str { "eql_v3.int4_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int4Ord) } diff --git a/crates/eql-bindings/src/v3/int8.rs b/crates/eql-bindings/src/v3/int8.rs index 1502be787..f3f8bc2f2 100644 --- a/crates/eql-bindings/src/v3/int8.rs +++ b/crates/eql-bindings/src/v3/int8.rs @@ -1,128 +1,98 @@ -//! The `int8` encrypted-domain family. Same four-domain ordered shape as -//! [`crate::v3::int4`] — see that module for the capability table. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `int8` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.int8` — storage only; every operator is blocked. +/// `eql_v3.int8` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8 { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Int8 { fn sql_domain_static() -> &'static str { "eql_v3.int8" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int8) } } - -/// `eql_v3.int8_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.int8_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8Eq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for Int8Eq { fn sql_domain_static() -> &'static str { "eql_v3.int8_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int8Eq) } } - -/// `eql_v3.int8_ord_ore` — full comparison, scheme-explicit name. +/// `eql_v3.int8_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8OrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. pub ob: OreBlock256, } - impl DomainType for Int8OrdOre { fn sql_domain_static() -> &'static str { "eql_v3.int8_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int8OrdOre) } } - -/// `eql_v3.int8_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.int8_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Int8Ord { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term. Serves equality too. pub ob: OreBlock256, } - impl DomainType for Int8Ord { fn sql_domain_static() -> &'static str { "eql_v3.int8_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int8Ord) } diff --git a/crates/eql-bindings/src/v3/inventory.rs b/crates/eql-bindings/src/v3/inventory.rs index 51193182b..ca185607f 100644 --- a/crates/eql-bindings/src/v3/inventory.rs +++ b/crates/eql-bindings/src/v3/inventory.rs @@ -1,55 +1,48 @@ -//! The `all()` inventory — every v3 domain payload type in `eql-domains::CATALOG` -//! order. Moved out of `mod.rs` so PR 4's emitter can own it: this hand-written -//! version is REPLACED by `eql-codegen` output (`// @generated`) at cutover -//! (Task 8). The architectural module doc + `pub mod` decls stay in the -//! hand-written `mod.rs`. - -use std::marker::PhantomData; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `all()` inventory — every v3 domain payload type in eql-domains::CATALOG order. Generated from the catalog; the DomainType trait, the shared newtypes, and the architectural module doc stay hand-written (domain_type.rs / terms.rs / mod.rs). use super::domain_type::DomainType; -use super::{bool, date, float4, float8, int2, int4, int8, numeric, text, timestamptz}; - -/// Every v3 domain type, in `eql-domains::CATALOG` order. +use std::marker::PhantomData; +/// Every v3 domain type, in `eql-domains::CATALOG` order — generated. pub fn all() -> Vec> { vec![ - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), - Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), ] } diff --git a/crates/eql-bindings/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs index 98fe3b7ac..104809e50 100644 --- a/crates/eql-bindings/src/v3/mod.rs +++ b/crates/eql-bindings/src/v3/mod.rs @@ -4,11 +4,10 @@ //! capability-encoded design from the original int4 scalar prototype //! (PR #236's first cut), formalized: //! the SQL surface is generated from `eql-domains::CATALOG`, and these types -//! mirror it 1:1 (enforced by `tests/catalog_parity.rs`, which fails if the -//! catalog and [`all`] ever disagree on the set or order of domains; the -//! catalog-derived wire-key gate is schema-based and lands with the stacked -//! schemars change, with per-type strictness spot checks in -//! `tests/v3_conformance.rs`). +//! mirror it 1:1 — `all()` is generated from the same catalog (`inventory.rs`), +//! so it cannot drift; the published JSON Schema wire contract is pinned by +//! `tests/catalog_parity.rs` and the emitted `.ts` property order by +//! `tests/ts_property_order.rs`. //! //! **Versioning.** "v3" is the SQL schema generation (`eql_v3.*` domains). //! The JSON envelope version is still `v: 2` ([`crate::EQL_SCHEMA_VERSION`]) — @@ -27,6 +26,13 @@ //! (SQL-side) by the domain CHECK. A missing term key is a deserialization //! error — the Rust analogue of the CHECK constraint. //! +//! One exception to "`ob` for `_ord`": `text`'s ordered domains carry **both** +//! `hm` and `ob` (`text_ord`, `text_ord_ore`, `text_search`), where the integer +//! ordered domains carry `ob` alone. Text routes `=`/`<>` through `hm` rather +//! than the ORE term because lexicographic ORE over text is not equality- +//! lossless, so equality needs the HMAC. The generated struct doc surfaces this +//! structurally — its required-keys line lists `hm` `ob` rather than just `ob`. +//! //! The types are also **strict**: every struct is //! `#[serde(deny_unknown_fields)]`, so a payload carrying keys outside the //! domain's set fails to deserialize rather than being silently stripped on diff --git a/crates/eql-bindings/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs index f94f147e2..30f57ca07 100644 --- a/crates/eql-bindings/src/v3/numeric.rs +++ b/crates/eql-bindings/src/v3/numeric.rs @@ -1,135 +1,98 @@ -//! The `numeric` encrypted-domain family — an ordered, non-integer scalar -//! backed by `rust_decimal::Decimal`. Same four-domain ordered shape as -//! [`crate::v3::int4`] (ORE compares ciphertext, so decimals order like -//! integers); see that module for the capability table. -//! -//! `numeric` is the first scalar whose native ORE term is wider than 8 blocks -//! (14 blocks): the wire shape is unchanged — the `ob` array simply carries -//! more block strings — and the generalized `eql_v3.ore_block_256` comparator -//! orders any block count, so no new type is needed here. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `numeric` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.numeric` — storage only; every operator is blocked. +/// `eql_v3.numeric` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Numeric { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Numeric { fn sql_domain_static() -> &'static str { "eql_v3.numeric" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Numeric) } } - -/// `eql_v3.numeric_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.numeric_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct NumericEq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for NumericEq { fn sql_domain_static() -> &'static str { "eql_v3.numeric_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(NumericEq) } } - -/// `eql_v3.numeric_ord_ore` — full comparison, scheme-explicit name. +/// `eql_v3.numeric_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct NumericOrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (14 blocks for numeric). Serves equality too. pub ob: OreBlock256, } - impl DomainType for NumericOrdOre { fn sql_domain_static() -> &'static str { "eql_v3.numeric_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(NumericOrdOre) } } - -/// `eql_v3.numeric_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.numeric_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct NumericOrd { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (14 blocks for numeric). Serves equality too. pub ob: OreBlock256, } - impl DomainType for NumericOrd { fn sql_domain_static() -> &'static str { "eql_v3.numeric_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(NumericOrd) } diff --git a/crates/eql-bindings/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs index 65b385a74..921d5a6ea 100644 --- a/crates/eql-bindings/src/v3/text.rs +++ b/crates/eql-bindings/src/v3/text.rs @@ -1,204 +1,148 @@ -//! The `text` encrypted-domain family — the ordered shape of -//! [`crate::v3::int4`] plus a `_match` domain backed by the Bloom-filter -//! term (`@>`/`<@` containment for `LIKE`-style matching). - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `text` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{BloomFilter, Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.text` — storage only; every operator is blocked. +/// `eql_v3.text` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Text { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Text { fn sql_domain_static() -> &'static str { "eql_v3.text" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Text) } } - -/// `eql_v3.text_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.text_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextEq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for TextEq { fn sql_domain_static() -> &'static str { "eql_v3.text_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TextEq) } } - -/// `eql_v3.text_match` — Bloom-filter containment match. +/// `eql_v3.text_match` — match domain. +/// +/// Operators: `@>` `<@`. Required keys: `v` `i` `c` `bf`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextMatch { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Bloom-filter match term (signed smallint bit positions). pub bf: BloomFilter, } - impl DomainType for TextMatch { fn sql_domain_static() -> &'static str { "eql_v3.text_match" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TextMatch) } } - -/// `eql_v3.text_ord_ore` — full lexicographic comparison, -/// scheme-explicit name. Unlike the integer ordered domains (`[Ore]` only), -/// text routes equality through `hm` rather than the ORE term, so the domain -/// carries both `hm` and `ob` (`[Hm, Ore]`). +/// `eql_v3.text_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextOrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. pub hm: Hmac256, - /// Block-ORE order term. pub ob: OreBlock256, } - impl DomainType for TextOrdOre { fn sql_domain_static() -> &'static str { "eql_v3.text_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TextOrdOre) } } - -/// `eql_v3.text_ord` — full lexicographic comparison -/// (`=` `<>` `<` `<=` `>` `>=`). Carries both `hm` (equality) and `ob` -/// (ordering) — text routes equality through `hm` (`[Hm, Ore]`). +/// `eql_v3.text_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextOrd { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. Text routes `=`/`<>` through `hm`. pub hm: Hmac256, - /// Block-ORE order term. pub ob: OreBlock256, } - impl DomainType for TextOrd { fn sql_domain_static() -> &'static str { "eql_v3.text_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TextOrd) } } - -/// `eql_v3.text_search` — the full text search surface: HMAC equality, ORE -/// ordering, and Bloom-filter containment match (`[Hm, Ore, Bloom]`). The -/// superset domain combining `_eq`, `_ord`, and `_match`. +/// `eql_v3.text_search` — search domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TextSearch { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, - /// Block-ORE order term. pub ob: OreBlock256, - /// Bloom-filter match term (signed smallint bit positions). pub bf: BloomFilter, } - impl DomainType for TextSearch { fn sql_domain_static() -> &'static str { "eql_v3.text_search" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TextSearch) } diff --git a/crates/eql-bindings/src/v3/timestamptz.rs b/crates/eql-bindings/src/v3/timestamptz.rs index ed1959b03..d5d8342b1 100644 --- a/crates/eql-bindings/src/v3/timestamptz.rs +++ b/crates/eql-bindings/src/v3/timestamptz.rs @@ -1,136 +1,98 @@ -//! The `timestamptz` encrypted-domain family — an ordered, non-integer scalar. -//! Same four-domain ordered shape as [`crate::v3::int4`] (ORE compares -//! ciphertext, so timestamps order like integers); see that module for the -//! capability table. -//! -//! cipherstash encrypts timestamps at native 12-block ORE width. The family -//! was equality-only while EQL's ORE comparator was hardcoded to 8 blocks; -//! now that `eql_v3.ore_block_256` derives the block count from the term -//! length, the 12-block `ob` term orders correctly and the ordered domains -//! ship. The wire shape is unchanged — the `ob` array just carries 12 blocks. - -use schemars::{schema_for, Schema}; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The `timestamptz` encrypted-domain family — generated from the eql-domains catalog. use crate::v3::terms::{Ciphertext, Hmac256, OreBlock256}; use crate::v3::DomainType; use crate::{Identifier, SchemaVersion}; -use schemars::JsonSchema; +use schemars::{schema_for, JsonSchema, Schema}; use serde::{Deserialize, Serialize}; use ts_rs::TS; - -/// `eql_v3.timestamptz` — storage only; every operator is blocked. +/// `eql_v3.timestamptz` — storage-only domain. +/// +/// Operators: none. Required keys: `v` `i` `c`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct Timestamptz { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, } - impl DomainType for Timestamptz { fn sql_domain_static() -> &'static str { "eql_v3.timestamptz" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Timestamptz) } } - -/// `eql_v3.timestamptz_eq` — HMAC equality (`=`, `<>`). +/// `eql_v3.timestamptz_eq` — equality domain. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TimestamptzEq { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// HMAC-SHA-256 equality term. pub hm: Hmac256, } - impl DomainType for TimestamptzEq { fn sql_domain_static() -> &'static str { "eql_v3.timestamptz_eq" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TimestamptzEq) } } - -/// `eql_v3.timestamptz_ord_ore` — full comparison, scheme-explicit name. +/// `eql_v3.timestamptz_ord_ore` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TimestamptzOrdOre { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (12 blocks for timestamptz). Serves equality too. pub ob: OreBlock256, } - impl DomainType for TimestamptzOrdOre { fn sql_domain_static() -> &'static str { "eql_v3.timestamptz_ord_ore" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TimestamptzOrdOre) } } - -/// `eql_v3.timestamptz_ord` — full comparison (`=` `<>` `<` `<=` `>` `>=`). +/// `eql_v3.timestamptz_ord` — ordering domain. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] pub struct TimestamptzOrd { - /// Envelope version — always `2` (`EQL_SCHEMA_VERSION`); any other - /// value fails deserialization. pub v: SchemaVersion, - /// Table/column identifier. Required by the domain CHECK. pub i: Identifier, - /// mp_base85 source ciphertext. Required by the domain CHECK. pub c: Ciphertext, - /// Block-ORE order term (12 blocks for timestamptz). Serves equality too. pub ob: OreBlock256, } - impl DomainType for TimestamptzOrd { fn sql_domain_static() -> &'static str { "eql_v3.timestamptz_ord" } - fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(TimestamptzOrd) } diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index a760836b4..e6c4a3efc 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -11,7 +11,7 @@ use std::path::{Path, PathBuf}; use proc_macro2::TokenStream; use quote::{format_ident, quote}; -use eql_domains::{Domain, DomainFamily, Term, CATALOG}; +use eql_domains::{Domain, DomainFamily, Term, CATALOG, ENVELOPE_KEYS}; use crate::consts::RUST_GENERATED_MARKER; use crate::writer::{ @@ -62,22 +62,13 @@ fn rustfmt(src: &str) -> String { String::from_utf8(out.stdout).expect("rustfmt output is UTF-8") } -/// PascalCase a snake_case domain name: "int4_ord_ore" -> "Int4OrdOre". -fn pascal(name: &str) -> String { - name.split('_') - .filter(|s| !s.is_empty()) - .map(|s| { - let mut chars = s.chars(); - match chars.next() { - Some(first) => first.to_uppercase().collect::() + chars.as_str(), - None => String::new(), - } - }) - .collect() -} - /// Capability label for a domain's single catalog-derived doc line, keyed on -/// the bare domain name. Parallels the SQL emitter's per-domain `--! @brief`. +/// the bare domain name. The match is keyed on the `&str` bare name (finer than +/// the typed [`eql_domains::Role`], which collapses `match`/`search` into +/// `Ord`), so it cannot be made exhaustive at the type level. Instead the +/// catch-all `panic!`s: an unmapped bare-domain name aborts codegen loudly, +/// forcing a deliberate label choice rather than silently emitting generic-but- +/// wrong doc text — preserving the "compile-checked catalog" guarantee. fn capability_label(domain_name: &str) -> &'static str { match domain_name { "" => "storage-only domain", @@ -85,20 +76,68 @@ fn capability_label(domain_name: &str) -> &'static str { "ord" | "ord_ore" => "ordering domain", "match" => "match domain", "search" => "search domain", - _ => "encrypted domain", + other => panic!( + "unmapped bare domain name {other:?} — add it to capability_label \ + in crates/eql-codegen/src/bindings.rs" + ), } } -/// One payload struct + its three-method `DomainType` impl. One struct doc -/// line, no field docs. Term fields come from `Term::payload_terms`, matching -/// on the enum for the field key and its newtype. The `schema` method returns +/// Render the catalog-derived struct doc lines for a domain: a summary line +/// (`` `eql_v3.` —
__key` per PostgreSQL's auto-naming. let err = sqlx::query(&format!( - "INSERT INTO v3_unique (id, val) VALUES (3, {p42}::jsonb::eql_v3.int4_eq)" + "INSERT INTO v3_unique (id, val) VALUES (3, {p42}::jsonb::eql_v3.integer_eq)" )) .execute(&pool) .await @@ -157,7 +157,7 @@ async fn unique_on_int4_eq_column_constrains_raw_payload(pool: PgPool) -> anyhow } // =========================================================================== -// FOREIGN KEY — child referencing a parent `eql_v3.int4` PRIMARY KEY column. +// FOREIGN KEY — child referencing a parent `eql_v3.integer` PRIMARY KEY column. // // FK on a jsonb-backed domain IS feasible: a PRIMARY KEY / UNIQUE on the parent // column resolves against the base type (`jsonb`) btree opclass (jsonb has a @@ -167,7 +167,7 @@ async fn unique_on_int4_eq_column_constrains_raw_payload(pool: PgPool) -> anyhow // PK/UNIQUE uses the inherited jsonb btree opclass and works. // =========================================================================== -/// A FOREIGN KEY from a child `eql_v3.int4` column to a parent `eql_v3.int4` +/// A FOREIGN KEY from a child `eql_v3.integer` column to a parent `eql_v3.integer` /// PRIMARY KEY column: a matching (byte-identical) reference is accepted, a /// dangling reference is rejected (23503). /// @@ -182,10 +182,10 @@ async fn unique_on_int4_eq_column_constrains_raw_payload(pool: PgPool) -> anyhow /// plaintext would be a different jsonb and would NOT satisfy the FK — so FK on /// a bare encrypted-domain column does not provide plaintext-level referential /// integrity. -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int4")))] -async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> { - // Parent with a PRIMARY KEY on an eql_v3.int4 (jsonb-backed domain) column. - sqlx::query("CREATE TABLE v3_parent (ref eql_v3.int4 PRIMARY KEY)") +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_integer")))] +async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<()> { + // Parent with a PRIMARY KEY on an eql_v3.integer (jsonb-backed domain) column. + sqlx::query("CREATE TABLE v3_parent (ref eql_v3.integer PRIMARY KEY)") .execute(&pool) .await?; @@ -193,7 +193,7 @@ async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> sqlx::query( "CREATE TABLE v3_child ( id bigint PRIMARY KEY, - parent_ref eql_v3.int4 REFERENCES v3_parent(ref) + parent_ref eql_v3.integer REFERENCES v3_parent(ref) )", ) .execute(&pool) @@ -210,12 +210,12 @@ async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> .await?; assert!(fk_exists, "FK constraint must exist on v3_child"); - let p42 = int4_payload_literal(&pool, 42).await?; - let p100 = int4_payload_literal(&pool, 100).await?; + let p42 = integer_payload_literal(&pool, 42).await?; + let p100 = integer_payload_literal(&pool, 100).await?; // Seed the parent with the 42-payload. sqlx::query(&format!( - "INSERT INTO v3_parent (ref) VALUES ({p42}::jsonb::eql_v3.int4)" + "INSERT INTO v3_parent (ref) VALUES ({p42}::jsonb::eql_v3.integer)" )) .execute(&pool) .await?; @@ -223,7 +223,7 @@ async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> // Child row with a byte-identical reference resolves (deterministic fixture // bytes), so the FK is satisfied. sqlx::query(&format!( - "INSERT INTO v3_child (id, parent_ref) VALUES (1, {p42}::jsonb::eql_v3.int4)" + "INSERT INTO v3_child (id, parent_ref) VALUES (1, {p42}::jsonb::eql_v3.integer)" )) .execute(&pool) .await?; @@ -236,7 +236,7 @@ async fn foreign_key_on_int4_domain_columns(pool: PgPool) -> anyhow::Result<()> // Child row referencing a payload NOT present in the parent (different // plaintext → different jsonb) violates the FK (23503). let err = sqlx::query(&format!( - "INSERT INTO v3_child (id, parent_ref) VALUES (2, {p100}::jsonb::eql_v3.int4)" + "INSERT INTO v3_child (id, parent_ref) VALUES (2, {p100}::jsonb::eql_v3.integer)" )) .execute(&pool) .await diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 59943f620..2a9480edc 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -10,7 +10,7 @@ //! on the *identity predicate*: a `LANGUAGE sql`, `IMMUTABLE` function //! taking at least one argument typed as a jsonb-backed DOMAIN of the //! encrypted-domain families — a domain in the `eql_v3` schema (e.g. -//! `eql_v3.int4_eq`). The identity +//! `eql_v3.integer_eq`). The identity //! predicate is proconfig-independent — it describes what a function //! intrinsically IS, not whether it has been pinned. //! @@ -24,7 +24,7 @@ //! //! A non-empty result means `pin_search_path_v3.sql` pinned an //! inline-critical encrypted-domain function — index engagement is -//! silently broken for that type. This is not int4-specific: a missed +//! silently broken for that type. This is not integer-specific: a missed //! skip for ANY encrypted-domain type — present or future — fails here, //! so a new type's author does not have to remember to add a per-type //! inlinability assertion. @@ -243,8 +243,8 @@ async fn every_inline_critical_eligible_domain_has_inline_critical_functions( pool: PgPool, ) -> Result<()> { // Stronger than a bare `count > 0`: if a future change accidentally - // narrows the structural predicate (e.g. hard-codes `int4_%`), a - // `count > 0` assertion would still pass while int8/bool/date + // narrows the structural predicate (e.g. hard-codes `integer_%`), a + // `count > 0` assertion would still pass while bigint/bool/date // domains silently lose inline-critical coverage. Instead, assert // that EVERY inline-critical-eligible domain (any encrypted-domain // family domain over jsonb — `eql_v3.*` — diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index 5c035975b..5f928f3d2 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -1,6 +1,6 @@ //! Structural guard for the blocked native-jsonb operator enumeration. //! -//! The storage-only domains (`eql_v3.int4`, future scalars) promise that +//! The storage-only domains (`eql_v3.integer`, future scalars) promise that //! *every* native jsonb operator is blocked, so an encrypted column can never //! fall through to plaintext-jsonb semantics. That promise rests on the //! enumerated operator surface in `crates/eql-codegen/src/operator_surface.rs` diff --git a/tests/sqlx/tests/encrypted_domain/family/mod.rs b/tests/sqlx/tests/encrypted_domain/family/mod.rs index 892842a20..e74049aed 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mod.rs @@ -1,5 +1,5 @@ //! Family-level tests: invariants that apply across every scalar type in -//! the encrypted-domain family (not int4-specific). +//! the encrypted-domain family (not integer-specific). pub mod inlinability; pub mod jsonb_operator_surface; diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index d1aa63ad3..b539358ca 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -36,23 +36,23 @@ async fn mutate(pool: &PgPool, ddl: &str) -> Result<()> { // catch a blocker that silently stopped raising. #[sqlx::test] async fn disabling_storage_eq_blocker_flips_blocker_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::eql_v3.int4 = $2::jsonb::eql_v3.int4"; + let sql = "SELECT $1::jsonb::eql_v3.integer = $2::jsonb::eql_v3.integer"; // Baseline: the storage `=` blocker raises. assert_raises( &pool, sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("eql_v3.int4", "="), + &blocker_msg("eql_v3.integer", "="), ) .await?; // Mutation: replace the plpgsql blocker with an inlinable SQL body that // returns true. CREATE OR REPLACE keeps the oid, so the `=` operator on - // (eql_v3.int4, eql_v3.int4) now resolves to this no-raise body. + // (eql_v3.integer, eql_v3.integer) now resolves to this no-raise body. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3_internal.eq(a eql_v3.int4, b eql_v3.int4) \ + "CREATE OR REPLACE FUNCTION eql_v3_internal.eq(a eql_v3.integer, b eql_v3.integer) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -84,8 +84,8 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright WHERE o.oprname = '=' - AND lt.typname = 'int4_ord' - AND rt.typname = 'int4_ord' + AND lt.typname = 'integer_ord' + AND rt.typname = 'integer_ord' "#, ) .fetch_one(pool) @@ -96,14 +96,14 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( // Baseline: `=` on (ord, ord) declares a RESTRICT estimator. ensure!( restrict_present(&pool).await?, - "baseline: `=` on eql_v3.int4_ord must declare a RESTRICT estimator" + "baseline: `=` on eql_v3.integer_ord must declare a RESTRICT estimator" ); // Mutation: unset RESTRICT. DROP OPERATOR would hit COMMUTATOR/NEGATOR // dependency links; ALTER ... SET (RESTRICT = NONE) avoids that. mutate( &pool, - "ALTER OPERATOR = (eql_v3.int4_ord, eql_v3.int4_ord) SET (RESTRICT = NONE)", + "ALTER OPERATOR = (eql_v3.integer_ord, eql_v3.integer_ord) SET (RESTRICT = NONE)", ) .await?; @@ -118,19 +118,19 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( // 3. `_ord` equality must route through `ord_term` (`ob`), never HMAC. // Rerouting it through `hmac_256` (`hm`) over hm-stripped rows makes `=` // stop matching. Proves the `ord_routes_through_ob` arm has teeth. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Result<()> { // Strip `hm` per-row inline; the `_ord` CHECK only requires `ob`, so the // cast still succeeds. The pivot is likewise hm-stripped. let pivot: i32 = 42; let pivot_payload: String = sqlx::query_scalar(&format!( - "SELECT (payload - 'hm')::text FROM fixtures.eql_v3_int4 WHERE plaintext = {pivot}", + "SELECT (payload - 'hm')::text FROM fixtures.eql_v3_integer WHERE plaintext = {pivot}", )) .fetch_one(&pool) .await?; - let count_sql = "SELECT count(*) FROM fixtures.eql_v3_int4 \ - WHERE (payload - 'hm')::eql_v3.int4_ord = $1::jsonb::eql_v3.int4_ord"; + let count_sql = "SELECT count(*) FROM fixtures.eql_v3_integer \ + WHERE (payload - 'hm')::eql_v3.integer_ord = $1::jsonb::eql_v3.integer_ord"; // Baseline: with `hm` stripped, `=` still matches the pivot via `ord_term` // (the `ob` term survives) — exactly one row. @@ -148,7 +148,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // nothing. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_ord, b eql_v3.int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.integer_ord, b eql_v3.integer_ord) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) = eql_v3_internal.hmac_256(b::jsonb) $$", ) @@ -171,7 +171,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // the `supported_null` arm has teeth. #[sqlx::test] async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::eql_v3.int4_eq = $2::jsonb::eql_v3.int4_eq"; + let sql = "SELECT $1::jsonb::eql_v3.integer_eq = $2::jsonb::eql_v3.integer_eq"; // Baseline: STRICT `=` propagates NULL when one side is NULL. assert_null(&pool, sql, &[Some(PLACEHOLDER_PAYLOAD), None]).await?; @@ -180,7 +180,7 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // keeps the oid; the operator now ignores NULL semantics. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.integer_eq, b eql_v3.integer_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -203,11 +203,11 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // Crucially, ORDER BY routes through `ord_term`, NOT `<`, so it must stay // green here. This is the #5-vs-#7 split: #5 attacks `<`, #7 attacks the // sort key. Blocking `<` alone must not disturb ORDER BY. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { - let lt_sql = "SELECT $1::jsonb::eql_v3.int4_ord < $2::jsonb::eql_v3.int4_ord"; - let order_by_sql = "SELECT plaintext FROM fixtures.eql_v3_int4 \ - ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) ASC"; + let lt_sql = "SELECT $1::jsonb::eql_v3.integer_ord < $2::jsonb::eql_v3.integer_ord"; + let order_by_sql = "SELECT plaintext FROM fixtures.eql_v3_integer \ + ORDER BY eql_v3.ord_term(payload::eql_v3.integer_ord) ASC"; let mut ascending: Vec = ::fixture_values().to_vec(); ascending.sort(); @@ -219,8 +219,8 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // post-mutation `assert_raises` below, where the `lt` blocker raises before // the comparator ever inspects the term. let lt_baseline: Option = sqlx::query_scalar( - "SELECT (SELECT payload FROM fixtures.eql_v3_int4 WHERE plaintext = $1)::eql_v3.int4_ord \ - < (SELECT payload FROM fixtures.eql_v3_int4 WHERE plaintext = $2)::eql_v3.int4_ord", + "SELECT (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $1)::eql_v3.integer_ord \ + < (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $2)::eql_v3.integer_ord", ) .bind(ascending[0]) .bind(ascending[1]) @@ -240,9 +240,9 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // LANGUAGE plpgsql and non-STRICT so the RAISE always fires. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.lt(a eql_v3.int4_ord, b eql_v3.int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.lt(a eql_v3.integer_ord, b eql_v3.integer_ord) \ RETURNS boolean LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE \ - AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.int4_ord', '<'); END; $$", + AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.integer_ord', '<'); END; $$", ) .await?; @@ -251,7 +251,7 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { &pool, lt_sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("eql_v3.int4_ord", "<"), + &blocker_msg("eql_v3.integer_ord", "<"), ) .await?; @@ -279,19 +279,19 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // ore index (ob)"), whereas `hmac_256(jsonb)` returns NULL on an absent // `hm`. So the eq path breaks via a raise, not a 0-count. Either way the // correct hm-routed equality matches and the rerouted one does not. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // Strip `ob` per-row inline; the `_eq` CHECK only requires `hm`, so the // cast still succeeds. The pivot is likewise ob-stripped. let pivot: i32 = 42; let pivot_payload: String = sqlx::query_scalar(&format!( - "SELECT (payload - 'ob')::text FROM fixtures.eql_v3_int4 WHERE plaintext = {pivot}", + "SELECT (payload - 'ob')::text FROM fixtures.eql_v3_integer WHERE plaintext = {pivot}", )) .fetch_one(&pool) .await?; - let count_sql = "SELECT count(*) FROM fixtures.eql_v3_int4 \ - WHERE (payload - 'ob')::eql_v3.int4_eq = $1::jsonb::eql_v3.int4_eq"; + let count_sql = "SELECT count(*) FROM fixtures.eql_v3_integer \ + WHERE (payload - 'ob')::eql_v3.integer_eq = $1::jsonb::eql_v3.integer_eq"; // Baseline: with `ob` stripped, `=` still matches the pivot via `eq_term` // (the `hm` term survives) — exactly one row. @@ -308,7 +308,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // `eql_v3_internal.ore_block_256(jsonb)` raises rather than matching. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.integer_eq, b eql_v3.integer_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) = eql_v3_internal.ore_block_256(b::jsonb) $$", ) @@ -339,10 +339,10 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // returns ascending order — which can never equal the descending // expectation. Asserting against DESC therefore detects the collapse // regardless of heap order (the ascending-fixture caveat from the plan). -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { - let order_by_desc = "SELECT plaintext FROM fixtures.eql_v3_int4 \ - ORDER BY eql_v3.ord_term(payload::eql_v3.int4_ord) DESC"; + let order_by_desc = "SELECT plaintext FROM fixtures.eql_v3_integer \ + ORDER BY eql_v3.ord_term(payload::eql_v3.integer_ord) DESC"; let mut descending: Vec = ::fixture_values().to_vec(); descending.sort(); @@ -361,7 +361,7 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { // function body. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord) \ RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $mutbody$ SELECT eql_v3_internal.ore_block_256('{esc}'::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), @@ -387,14 +387,14 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { // `lt`) and #7 (collapse `ord_term`) do not exercise, since both run on the // NULL-free fixture. A UNION ALL subquery supplies the NULL rows inline, so no // session-local temp table is needed and the global `mutate()` stays valid. -#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Result<()> { const NULL_ROWS: usize = 3; let order_by = format!( "SELECT plaintext FROM ( \ - SELECT plaintext, payload::eql_v3.int4_ord AS value FROM fixtures.eql_v3_int4 \ + SELECT plaintext, payload::eql_v3.integer_ord AS value FROM fixtures.eql_v3_integer \ UNION ALL \ - SELECT NULL::int4, NULL::eql_v3.int4_ord FROM generate_series(1, {NULL_ROWS}) \ + SELECT NULL::integer, NULL::eql_v3.integer_ord FROM generate_series(1, {NULL_ROWS}) \ ) s \ ORDER BY eql_v3.ord_term(value) ASC NULLS LAST" ); @@ -416,10 +416,10 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re // unchanged. Unique dollar-quote tag guards the embedded jsonb literal. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord) \ RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ AS $mutbody$ SELECT eql_v3_internal.ore_block_256(\ - coalesce(a, '{esc}'::jsonb::eql_v3.int4_ord)::jsonb) $mutbody$", + coalesce(a, '{esc}'::jsonb::eql_v3.integer_ord)::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); mutate(&pool, &ddl).await?; diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index f5cdfe5f7..9316b6255 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -9,35 +9,35 @@ use sqlx::PgPool; #[test] fn variant_derives_consistent_sql_domain_and_capabilities() { - // Capabilities are catalog-derived for the scalar's token (`int4`). int4's + // Capabilities are catalog-derived for the scalar's token (`integer`). integer's // ordered domains are `[Ore]`-only — ORE is lossless for integers, so `=` // routes through `ord_term`, unlike text where `=` routes through `eq_term`. let storage = ScalarDomainSpec::new::(Variant::Storage); - assert_eq!(storage.sql_domain, "eql_v3.int4"); + assert_eq!(storage.sql_domain, "eql_v3.integer"); assert!(!storage.supports_eq()); assert!(!storage.supports_ord()); assert_eq!(storage.primary_extractor(), None); assert_eq!( - Variant::Storage.payload_required_keys("int4"), + Variant::Storage.payload_required_keys("integer"), vec!["v", "i", "c"] ); let eq = ScalarDomainSpec::new::(Variant::Eq); - assert_eq!(eq.sql_domain, "eql_v3.int4_eq"); + assert_eq!(eq.sql_domain, "eql_v3.integer_eq"); assert!(eq.supports_eq()); assert!(!eq.supports_ord()); assert_eq!(eq.primary_extractor().as_deref(), Some("eql_v3.eq_term")); assert_eq!(eq.extractor_for_op("=").as_deref(), Some("eql_v3.eq_term")); assert_eq!( - Variant::Eq.payload_required_keys("int4"), + Variant::Eq.payload_required_keys("integer"), vec!["v", "i", "c", "hm"] ); let ord = ScalarDomainSpec::new::(Variant::Ord); - assert_eq!(ord.sql_domain, "eql_v3.int4_ord"); + assert_eq!(ord.sql_domain, "eql_v3.integer_ord"); assert!(ord.supports_ord()); assert_eq!(ord.primary_extractor().as_deref(), Some("eql_v3.ord_term")); - // int4_ord is `[Ore]`-only: equality routes through ORE (lossless for ints). + // integer_ord is `[Ore]`-only: equality routes through ORE (lossless for ints). assert_eq!( ord.extractor_for_op("=").as_deref(), Some("eql_v3.ord_term") @@ -47,12 +47,12 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { Some("eql_v3.ord_term") ); assert_eq!( - Variant::Ord.payload_required_keys("int4"), + Variant::Ord.payload_required_keys("integer"), vec!["v", "i", "c", "ob"] ); let ord_ore = ScalarDomainSpec::new::(Variant::OrdOre); - assert_eq!(ord_ore.sql_domain, "eql_v3.int4_ord_ore"); + assert_eq!(ord_ore.sql_domain, "eql_v3.integer_ord_ore"); assert!(ord_ore.supports_ord()); assert_eq!( ord_ore.primary_extractor().as_deref(), @@ -139,7 +139,7 @@ async fn placeholder_payload_casts_to_every_declared_domain(pool: PgPool) -> Res #[sqlx::test] async fn no_cross_variant_operator_is_declared(pool: PgPool) -> Result<()> { // The SCALAR family deliberately does NOT define ANY operator that mixes - // two different capability variants — e.g. `eql_v3.int4_eq = eql_v3.int4_ord` + // two different capability variants — e.g. `eql_v3.integer_eq = eql_v3.integer_ord` // would resolve against jsonb (the ultimate base type) and silently // bypass the per-variant blockers. The query below has no `oprname` // filter, so it catches a cross-variant operator of any kind, not just diff --git a/tests/sqlx/tests/encrypted_domain/float_special.rs b/tests/sqlx/tests/encrypted_domain/float_special.rs index b68e3d7ad..391c11e75 100644 --- a/tests/sqlx/tests/encrypted_domain/float_special.rs +++ b/tests/sqlx/tests/encrypted_domain/float_special.rs @@ -1,10 +1,10 @@ -//! Float edge-case behavioural regression suite (CIP — float4/float8). +//! Float edge-case behavioural regression suite (CIP — real/double). //! //! Captures the NaN / `-0.0` / `+0.0` / `±Inf` behaviour that the shared //! all-pairs oracle deliberately excludes from its fixtures (NaN is unordered //! and unspecified in the encoder; `-0.0` canonicalizes to `+0.0`). It encrypts //! the special values FRESH through cipherstash at test time, so NaN never -//! enters the `float8` fixture table. +//! enters the `double` fixture table. //! //! IMPORTANT: the NaN eq/order outcomes asserted here are an **artifact of the //! canonical NaN bit pattern + deterministic index terms (hm/ore are pure @@ -41,22 +41,22 @@ async fn encrypt_specials(values: &[F8]) -> Result> { Ok(payloads.into_iter().map(|p| p.to_string()).collect()) } -/// Cast a payload literal to `eql_v3.float8` and read it back, proving the domain +/// Cast a payload literal to `eql_v3.double` and read it back, proving the domain /// CHECK accepts the encrypted special value. async fn cast_passes_check(pool: &PgPool, payload: &str) -> Result<()> { - let sql = "SELECT ($1::jsonb::eql_v3.float8) IS NOT NULL"; + let sql = "SELECT ($1::jsonb::eql_v3.double) IS NOT NULL"; let ok: bool = sqlx::query_scalar(sql) .bind(payload) .fetch_one(pool) .await?; - anyhow::ensure!(ok, "payload failed the eql_v3.float8 CHECK: {payload}"); + anyhow::ensure!(ok, "payload failed the eql_v3.double CHECK: {payload}"); Ok(()) } /// Compare two payloads under an operator on the `_ord` domain, returning the /// boolean result. Used to pin the discovered NaN/±0/±Inf outcomes. async fn ord_cmp(pool: &PgPool, a: &str, op: &str, b: &str) -> Result { - let d = "eql_v3.float8_ord"; + let d = "eql_v3.double_ord"; let sql = format!("SELECT ($1::jsonb::{d} {op} $2::jsonb::{d})"); Ok(sqlx::query_scalar(&sql) .bind(a) @@ -67,7 +67,7 @@ async fn ord_cmp(pool: &PgPool, a: &str, op: &str, b: &str) -> Result { /// Equality under the `_eq` domain (HMAC). async fn eq_cmp(pool: &PgPool, a: &str, b: &str) -> Result { - let d = "eql_v3.float8_eq"; + let d = "eql_v3.double_eq"; let sql = format!("SELECT ($1::jsonb::{d} = $2::jsonb::{d})"); Ok(sqlx::query_scalar(&sql) .bind(a) @@ -85,7 +85,7 @@ async fn setup() -> Result { #[tokio::test] async fn nan_encrypts_and_passes_check() -> Result<()> { // Encrypting f64::NAN succeeds (no panic) and yields a structurally valid - // eql_v3.float8 payload. This is the one universal NaN guarantee. + // eql_v3.double payload. This is the one universal NaN guarantee. let pool = setup().await?; let payloads = encrypt_specials(&[F8(f64::NAN)]).await?; assert_eq!(payloads.len(), 1); diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index 98993a9b0..4c924e0f5 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -6,19 +6,19 @@ //! (containment / path query / array ops / the operator-surface guard) remain //! in `v3_jsonb_tests` / `v3_jsonb_operator_surface_tests`. //! -//! The view type (`JsonbEntryInt4`) is deliberately NOT a `eql_domains::CATALOG` +//! The view type (`JsonbEntryInteger`) is deliberately NOT a `eql_domains::CATALOG` //! scalar, so this suite is hand-written rather than emitted by the //! `scalar_types!` list — and its test names live under `jsonb_entry::…`, //! validated by `test:matrix:inventory:jsonb_entry` (NOT the scalar inventory). -use eql_tests::fixtures::v3_doc_int4::SELECTOR; -use eql_tests::jsonb_entry::JsonbEntryInt4; +use eql_tests::fixtures::v3_doc_integer::SELECTOR; +use eql_tests::jsonb_entry::JsonbEntryInteger; use eql_tests::scalar_domains::ScalarType; eql_tests::jsonb_entry_matrix! { - suite = jsonb_entry_int4, - scalar = eql_tests::jsonb_entry::JsonbEntryInt4, - eql_type = "v3_doc_int4", + suite = jsonb_entry_integer, + scalar = eql_tests::jsonb_entry::JsonbEntryInteger, + eql_type = "v3_doc_integer", } // ---------------------------------------------------------------------------- @@ -26,11 +26,11 @@ eql_tests::jsonb_entry_matrix! { // real, `oc`-carrying entry from every fixture row — a wrong selector would make // every matrix comparison vacuous via NULL extraction rather than failing. // ---------------------------------------------------------------------------- -#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] -async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { - let n = ::fixture_values().len() as i64; +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_integer")))] +async fn jsonb_entry_integer_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { + let n = ::fixture_values().len() as i64; - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.v3_doc_int4") + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.v3_doc_integer") .fetch_one(&pool) .await?; anyhow::ensure!( @@ -38,8 +38,8 @@ async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<() "row count must match fixture_values().len(): want {n}, got {count}", ); - // ids sequential from 1 (the split generator inserts in INT4_VALUES order). - let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.v3_doc_int4 ORDER BY id") + // ids sequential from 1 (the split generator inserts in INTEGER_VALUES order). + let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.v3_doc_integer ORDER BY id") .fetch_all(&pool) .await?; anyhow::ensure!( @@ -50,7 +50,7 @@ async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<() // Every row's entry at the selector is non-NULL — guards against a wrong // SELECTOR silently hollowing out the matrix. let null_entries: i64 = sqlx::query_scalar(&format!( - "SELECT COUNT(*) FROM fixtures.v3_doc_int4 WHERE (payload -> '{SELECTOR}'::text) IS NULL", + "SELECT COUNT(*) FROM fixtures.v3_doc_integer WHERE (payload -> '{SELECTOR}'::text) IS NULL", )) .fetch_one(&pool) .await?; @@ -62,7 +62,7 @@ async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<() // Every extracted entry is a valid jsonb_entry payload AND carries `oc` // (the ordered term the matrix's ore_cllw paths require). let invalid: i64 = sqlx::query_scalar(&format!( - "SELECT COUNT(*) FROM fixtures.v3_doc_int4 \ + "SELECT COUNT(*) FROM fixtures.v3_doc_integer \ WHERE NOT eql_v3_internal.is_valid_ste_vec_entry_payload((payload -> '{SELECTOR}'::text)::jsonb) \ OR NOT eql_v3.has_ore_cllw((payload -> '{SELECTOR}'::text)::eql_v3.jsonb_entry)", )) @@ -77,7 +77,7 @@ async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<() // leaves), so the correctness/ordering oracle has real discrimination. let distinct_oc: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(DISTINCT ((payload -> '{SELECTOR}'::text)::jsonb ->> 'oc')) \ - FROM fixtures.v3_doc_int4", + FROM fixtures.v3_doc_integer", )) .fetch_one(&pool) .await?; @@ -92,7 +92,7 @@ async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<() // ---------------------------------------------------------------------------- // Selector drift guard. The whole entry suite is bound to ONE CipherStash // workspace: a SteVec selector is a keyed MAC over (workspace keyset, -// STE_VEC_PREFIX, path), so regenerating `v3_doc_int4` against a different +// STE_VEC_PREFIX, path), so regenerating `v3_doc_integer` against a different // keyset (rotated/changed CS_WORKSPACE_CRN / CS_CLIENT_KEY) re-pins the // `$.field` selector. This reads the LIVE selector from the loaded fixture and // asserts it equals the pinned `SELECTOR`, so drift surfaces as one @@ -101,14 +101,14 @@ async fn jsonb_entry_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<() // would require runtime selector resolution, which the static // `ScalarType::column_expr()` seam cannot do — out of scope here. // ---------------------------------------------------------------------------- -#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] -async fn jsonb_entry_int4_selector_matches_fixture(pool: sqlx::PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_integer")))] +async fn jsonb_entry_integer_selector_matches_fixture(pool: sqlx::PgPool) -> anyhow::Result<()> { // The `$.field` ORE-CLLW entry is the sv element carrying `oc`. Cast the // `eql_v3.json` payload to bare jsonb FIRST so `-> 'sv'` is the native array // accessor, not the custom `eql_v3.json -> text` selector-lookup operator. let live: Vec = sqlx::query_scalar( "SELECT DISTINCT elem ->> 's' \ - FROM fixtures.v3_doc_int4, \ + FROM fixtures.v3_doc_integer, \ jsonb_array_elements(payload::jsonb -> 'sv') AS elem \ WHERE elem ? 'oc'", ) @@ -117,13 +117,13 @@ async fn jsonb_entry_int4_selector_matches_fixture(pool: sqlx::PgPool) -> anyhow anyhow::ensure!( live.len() == 1, - "expected exactly one distinct $.field oc-selector in v3_doc_int4, got {live:?}", + "expected exactly one distinct $.field oc-selector in v3_doc_integer, got {live:?}", ); let live = &live[0]; anyhow::ensure!( live == SELECTOR, - "v3_doc_int4 $.field oc-selector drifted from the pinned constant.\n \ - pinned v3_doc_int4::SELECTOR = {SELECTOR}\n \ + "v3_doc_integer $.field oc-selector drifted from the pinned constant.\n \ + pinned v3_doc_integer::SELECTOR = {SELECTOR}\n \ live fixture selector = {live}\n\ The SteVec selector is keyed by the CipherStash workspace; if the \ workspace/keyset changed, re-pin SELECTOR to the live value above and \ @@ -137,12 +137,12 @@ async fn jsonb_entry_int4_selector_matches_fixture(pool: sqlx::PgPool) -> anyhow // terms. Compares `eql_v3.ore_cllw(...)` outputs directly — NOT entry `=`, which // tests `eq_term`, not ORE. // ---------------------------------------------------------------------------- -#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] -async fn jsonb_entry_int4_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_integer")))] +async fn jsonb_entry_integer_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow::Result<()> { let collisions: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(*) \ - FROM fixtures.v3_doc_int4 a \ - JOIN fixtures.v3_doc_int4 b ON a.id < b.id \ + FROM fixtures.v3_doc_integer a \ + JOIN fixtures.v3_doc_integer b ON a.id < b.id \ WHERE a.plaintext <> b.plaintext \ AND eql_v3.ore_cllw((a.payload -> '{SELECTOR}'::text)::eql_v3.jsonb_entry) \ = eql_v3.ore_cllw((b.payload -> '{SELECTOR}'::text)::eql_v3.jsonb_entry)", @@ -170,12 +170,12 @@ async fn jsonb_entry_int4_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow::Re // excluded: entry `=` reduces through `eql_v3.eq_term`, not `ore_cllw`, so the // ore_cllw btree cannot serve it. // ---------------------------------------------------------------------------- -#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] -async fn jsonb_entry_int4_index_engages(pool: sqlx::PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_integer")))] +async fn jsonb_entry_integer_index_engages(pool: sqlx::PgPool) -> anyhow::Result<()> { let sel = SELECTOR; - let pivot = ::fixture_values()[0]; + let pivot = ::fixture_values()[0]; let payload = - eql_tests::scalar_domains::fetch_fixture_payload::(&pool, pivot).await?; + eql_tests::scalar_domains::fetch_fixture_payload::(&pool, pivot).await?; let lit = payload.replace('\'', "''"); let mut tx = pool.begin().await?; @@ -184,7 +184,7 @@ async fn jsonb_entry_int4_index_engages(pool: sqlx::PgPool) -> anyhow::Result<() .await?; sqlx::query(&format!( "INSERT INTO entry_idx(value) \ - SELECT (payload -> '{sel}'::text)::eql_v3.jsonb_entry FROM fixtures.v3_doc_int4", + SELECT (payload -> '{sel}'::text)::eql_v3.jsonb_entry FROM fixtures.v3_doc_integer", )) .execute(&mut *tx) .await?; @@ -220,11 +220,11 @@ async fn jsonb_entry_int4_index_engages(pool: sqlx::PgPool) -> anyhow::Result<() // oc-less. The min/max sfuncs explicitly skip oc-less entries. This feeds a // forged hm-only (oc-less) entry in the SEED position alongside real oc-carrying // entries and asserts the extremum is the correct ORDERABLE entry, never the -// oc-less seed. The whole-suite matrix never exercises this (every v3_doc_int4 +// oc-less seed. The whole-suite matrix never exercises this (every v3_doc_integer // entry carries oc). // ---------------------------------------------------------------------------- -#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_int4")))] -async fn jsonb_entry_int4_aggregate_ignores_oc_less_entries( +#[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_integer")))] +async fn jsonb_entry_integer_aggregate_ignores_oc_less_entries( pool: sqlx::PgPool, ) -> anyhow::Result<()> { let sel = SELECTOR; @@ -232,7 +232,7 @@ async fn jsonb_entry_int4_aggregate_ignores_oc_less_entries( // exactly one of hm/oc — here `hm`, so `eql_v3.ore_cllw(entry)` is NULL. let oc_less = r#"{"s":"forged","c":"x","hm":"00"}"#; - let mut sorted: Vec = ::fixture_values() + let mut sorted: Vec = ::fixture_values() .iter() .map(|e| e.0) .collect(); @@ -253,22 +253,22 @@ async fn jsonb_entry_int4_aggregate_ignores_oc_less_entries( sqlx::query(&format!( "INSERT INTO oc_mix(value) \ SELECT (payload -> '{sel}'::text)::eql_v3.jsonb_entry \ - FROM fixtures.v3_doc_int4 WHERE plaintext IN ({low}, {high})", + FROM fixtures.v3_doc_integer WHERE plaintext IN ({low}, {high})", )) .execute(&mut *tx) .await?; - // Expected extrema: the orderable entries for the smallest / largest int4, + // Expected extrema: the orderable entries for the smallest / largest integer, // NOT the oc-less seed. let expect_min: String = sqlx::query_scalar(&format!( "SELECT ((payload -> '{sel}'::text)::eql_v3.jsonb_entry)::text \ - FROM fixtures.v3_doc_int4 WHERE plaintext = {low}", + FROM fixtures.v3_doc_integer WHERE plaintext = {low}", )) .fetch_one(&mut *tx) .await?; let expect_max: String = sqlx::query_scalar(&format!( "SELECT ((payload -> '{sel}'::text)::eql_v3.jsonb_entry)::text \ - FROM fixtures.v3_doc_int4 WHERE plaintext = {high}", + FROM fixtures.v3_doc_integer WHERE plaintext = {high}", )) .fetch_one(&mut *tx) .await?; diff --git a/tests/sqlx/tests/encrypted_domain/property/README.md b/tests/sqlx/tests/encrypted_domain/property/README.md index cb748b95c..947f8c491 100644 --- a/tests/sqlx/tests/encrypted_domain/property/README.md +++ b/tests/sqlx/tests/encrypted_domain/property/README.md @@ -75,7 +75,7 @@ Same oracle engine, but each case **generates fresh random plaintexts and encrypts them end-to-end through ZeroKMS** (one batched call per case) before querying. Gated behind the `proptest-e2e` cargo feature — `mise run test:sqlx` enables it (CI has the secrets); a bare `cargo test` compiles it out. Covers -every ordered scalar (int2/int4/int8/date/timestamp/numeric/text) via the +every ordered scalar (smallint/integer/bigint/date/timestamp/numeric/text) via the `ScalarType::arbitrary_value()` strategy seam — integers draw the full `any::()` range, non-integer scalars sample their cast-valid fixture set (their plaintexts have no usable bounded `Arbitrary`). `bool` is storage-only diff --git a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs index 670b0e226..126009fdd 100644 --- a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs +++ b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs @@ -105,9 +105,9 @@ macro_rules! cross_ciphertext_test { }; } -cross_ciphertext_test!(cross_ciphertext_int2, i16); -cross_ciphertext_test!(cross_ciphertext_int4, i32); -cross_ciphertext_test!(cross_ciphertext_int8, i64); +cross_ciphertext_test!(cross_ciphertext_smallint, i16); +cross_ciphertext_test!(cross_ciphertext_integer, i32); +cross_ciphertext_test!(cross_ciphertext_bigint, i64); cross_ciphertext_test!(cross_ciphertext_date, chrono::NaiveDate); cross_ciphertext_test!(cross_ciphertext_timestamp, chrono::DateTime); cross_ciphertext_test!(cross_ciphertext_numeric, rust_decimal::Decimal); diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index 22759e813..e5afa3cfa 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -133,21 +133,21 @@ macro_rules! e2e_oracle_suite { } e2e_oracle_suite!( - int4, + integer, i32, - "proptest_e2e_int4", + "proptest_e2e_integer", seeds = [i32::MIN, 0, i32::MAX] ); e2e_oracle_suite!( - int2, + smallint, i16, - "proptest_e2e_int2", + "proptest_e2e_smallint", seeds = [i16::MIN, 0, i16::MAX] ); e2e_oracle_suite!( - int8, + bigint, i64, - "proptest_e2e_int8", + "proptest_e2e_bigint", seeds = [i64::MIN, 0, i64::MAX] ); e2e_oracle_suite!( @@ -191,9 +191,9 @@ e2e_oracle_suite!( seeds = ["aard".to_string(), "frank".to_string(), "zzzz".to_string()] ); e2e_oracle_suite!( - float4, + real, eql_tests::scalar_domains::F4, - "proptest_e2e_float4", + "proptest_e2e_real", seeds = [ eql_tests::scalar_domains::F4(f32::NEG_INFINITY), eql_tests::scalar_domains::F4(0.0), @@ -201,9 +201,9 @@ e2e_oracle_suite!( ] ); e2e_oracle_suite!( - float8, + double, eql_tests::scalar_domains::F8, - "proptest_e2e_float8", + "proptest_e2e_double", seeds = [ eql_tests::scalar_domains::F8(f64::NEG_INFINITY), eql_tests::scalar_domains::F8(0.0), @@ -228,7 +228,7 @@ e2e_oracle_suite!( /// /// Creds/e2e-gated like the rest of this file. #[test] -fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { +fn real_and_double_share_index_terms_for_the_same_value() -> Result<()> { use eql_tests::scalar_domains::{F4, F8}; let rt = tokio::runtime::Builder::new_current_thread() @@ -262,7 +262,7 @@ fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { assert_eq!( hm(&f4_payloads[0])?, hm(&f8_payloads[0])?, - "float4 and float8 of the same value must share the hm equality term" + "real and double of the same value must share the hm equality term" ); // `ob` (probabilistic ORE) is NOT byte-comparable — the only correct check is @@ -278,15 +278,15 @@ fn float4_and_float8_share_index_terms_for_the_same_value() -> Result<()> { }; let sql = format!( "SELECT {} = {}", - ord_term(&f4_payloads[0], "eql_v3.float4_ord_ore"), - ord_term(&f8_payloads[0], "eql_v3.float8_ord_ore"), + ord_term(&f4_payloads[0], "eql_v3.real_ord_ore"), + ord_term(&f8_payloads[0], "eql_v3.double_ord_ore"), ); let ore_equal: Option = rt .block_on(sqlx::query_scalar(&sql).fetch_one(&pool)) .map_err(|e| anyhow::anyhow!("cross-width ORE compare query ({sql}): {e}"))?; anyhow::ensure!( ore_equal == Some(true), - "float4 and float8 of the same value must compare equal under the SQL ORE \ + "real and double of the same value must compare equal under the SQL ORE \ operator (eql_v3_internal.ore_block_256 `=`); got {ore_equal:?}" ); Ok(()) diff --git a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs index 89e5bfe59..ee5ca6366 100644 --- a/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs +++ b/tests/sqlx/tests/encrypted_domain/property/edge_cases.rs @@ -10,19 +10,19 @@ use eql_tests::scalar_domains::{ }; use sqlx::PgPool; -/// A well-formed int4 storage/eq payload literal — has v/i/c + hm + ob, so it -/// casts into any int4 domain. Hand-written (no encryption needed); the term +/// A well-formed integer storage/eq payload literal — has v/i/c + hm + ob, so it +/// casts into any integer domain. Hand-written (no encryption needed); the term /// VALUES are placeholders, which is fine for NULL/blocker/CHECK shape tests. const WELL_FORMED: &str = r#"{"v":3,"i":{"t":"edge","c":"payload"},"c":"AAAA","hm":"deadbeef","ob":["00"]}"#; -fn int4(variant: Variant) -> String { +fn integer(variant: Variant) -> String { ScalarDomainSpec::new::(variant).sql_domain } #[sqlx::test] async fn eq_propagates_null(pool: PgPool) -> Result<()> { - let d = int4(Variant::Eq); + let d = integer(Variant::Eq); // A supported operator with a NULL operand must yield NULL, not raise. let sql = format!("SELECT ($1::jsonb::{d}) = (NULL::{d})"); assert_null(&pool, &sql, &[Some(WELL_FORMED)]).await @@ -32,7 +32,7 @@ async fn eq_propagates_null(pool: PgPool) -> Result<()> { async fn lt_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { // `<` is not supported on the equality-only domain; the blocker must RAISE, // and must NOT be elided even on a NULL operand (blockers are never STRICT). - let d = int4(Variant::Eq); + let d = integer(Variant::Eq); let sql = format!("SELECT ($1::jsonb::{d}) < ($1::jsonb::{d})"); assert_raises(&pool, &sql, &[Some(WELL_FORMED)], &blocker_msg(&d, "<")).await?; // NULL operand: still raises (proves the blocker is not STRICT). @@ -45,7 +45,7 @@ async fn path_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { // A native-jsonb PATH operator (`->`) reachable through domain fallback must // hit the blocker, not silently return a jsonb sub-value (the documented // footgun). The domain ships its own `->` operator that always raises. - let d = int4(Variant::Eq); + let d = integer(Variant::Eq); let sql = format!("SELECT ($1::jsonb::{d}) -> 'sel'::text"); assert_raises(&pool, &sql, &[Some(WELL_FORMED)], &blocker_msg(&d, "->")).await?; // NULL operand: still raises (proves the blocker is not STRICT, so a NULL @@ -57,8 +57,8 @@ async fn path_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { #[sqlx::test] async fn containment_blocker_raises_on_eq_domain(pool: PgPool) -> Result<()> { // A native-jsonb CONTAINMENT operator (`@>`) must likewise hit the blocker - // on a domain that does not support it (int4_eq carries only `hm`/equality). - let d = int4(Variant::Eq); + // on a domain that does not support it (integer_eq carries only `hm`/equality). + let d = integer(Variant::Eq); let sql = format!("SELECT ($1::jsonb::{d}) @> ($1::jsonb::{d})"); assert_raises(&pool, &sql, &[Some(WELL_FORMED)], &blocker_msg(&d, "@>")).await?; // NULL operand: still raises (not STRICT). @@ -72,7 +72,7 @@ async fn ordering_blocked_on_timestamp_eq_domain(pool: PgPool) -> Result<()> { // domains order via the wide-ORE comparator). But the equality-only `_eq` // domain still must NOT answer ordering: an ordering operator on // `timestamp_eq` must RAISE (and be non-STRICT), not silently mis-order — - // exactly as `int4_eq` does. Callers order via the `_ord` twins, not `_eq`. + // exactly as `integer_eq` does. Callers order via the `_ord` twins, not `_eq`. let d = ScalarDomainSpec::new::>(Variant::Eq).sql_domain; let sql = format!("SELECT (NULL::{d}) < (NULL::{d})"); assert_raises(&pool, &sql, &[], &blocker_msg(&d, "<")).await @@ -134,7 +134,7 @@ async fn every_eql_v3_blocker_is_non_strict_plpgsql(pool: PgPool) -> Result<()> async fn check_rejects_payload_missing_envelope(pool: PgPool) -> Result<()> { // The storage domain's CHECK requires the EQL envelope (`v`, `i`, `c`). A // payload missing the top-level ciphertext `c` must be rejected at the cast. - let d = int4(Variant::Storage); + let d = integer(Variant::Storage); let no_c = r#"{"v":3,"i":{"t":"edge","c":"payload"}}"#; let sql = format!("SELECT $1::jsonb::{d}"); assert_raises(&pool, &sql, &[Some(no_c)], "violates check constraint").await @@ -144,7 +144,7 @@ async fn check_rejects_payload_missing_envelope(pool: PgPool) -> Result<()> { async fn check_rejects_payload_missing_hm(pool: PgPool) -> Result<()> { // The _eq domain CHECK requires `hm`. A payload without it must be rejected // at the cast with a CHECK-constraint violation (not some unrelated error). - let d = int4(Variant::Eq); + let d = integer(Variant::Eq); let no_hm = r#"{"v":3,"i":{"t":"edge","c":"payload"},"c":"AAAA","ob":["00"]}"#; let sql = format!("SELECT $1::jsonb::{d}"); assert_raises(&pool, &sql, &[Some(no_hm)], "violates check constraint").await @@ -156,7 +156,7 @@ async fn check_rejects_payload_missing_ob(pool: PgPool) -> Result<()> { // it must be rejected at the cast on either ordered twin. let no_ob = r#"{"v":3,"i":{"t":"edge","c":"payload"},"c":"AAAA","hm":"deadbeef"}"#; for variant in [Variant::Ord, Variant::OrdOre] { - let d = int4(variant); + let d = integer(variant); let sql = format!("SELECT $1::jsonb::{d}"); assert_raises(&pool, &sql, &[Some(no_ob)], "violates check constraint").await?; } diff --git a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs index f656ad46e..02d90bd13 100644 --- a/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/fixture_oracle.rs @@ -40,17 +40,17 @@ use std::sync::Arc; /// truth for which fixture SQL is embedded. pub(crate) fn embedded_fixture_sql() -> &'static str { match T::PG_TYPE { - "int4" => include_str!(concat!( + "integer" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_int4.sql" + "/fixtures/eql_v3_integer.sql" )), - "int2" => include_str!(concat!( + "smallint" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_int2.sql" + "/fixtures/eql_v3_smallint.sql" )), - "int8" => include_str!(concat!( + "bigint" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_int8.sql" + "/fixtures/eql_v3_bigint.sql" )), "date" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), @@ -70,13 +70,13 @@ pub(crate) fn embedded_fixture_sql() -> &'static str { env!("CARGO_MANIFEST_DIR"), "/fixtures/eql_v3_numeric.sql" )), - "float4" => include_str!(concat!( + "real" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_float4.sql" + "/fixtures/eql_v3_real.sql" )), - "float8" => include_str!(concat!( + "double" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_float8.sql" + "/fixtures/eql_v3_double.sql" )), other => panic!( "no embedded fixture for catalog token '{other}'; \ @@ -94,17 +94,17 @@ pub(crate) fn embedded_fixture_sql() -> &'static str { /// absence (caught by the loud catch-all) is correct. pub(crate) fn embedded_doubles_sql() -> &'static str { match T::PG_TYPE { - "int2" => include_str!(concat!( + "smallint" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_int2_doubles.sql" + "/fixtures/eql_v3_smallint_doubles.sql" )), - "int4" => include_str!(concat!( + "integer" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_int4_doubles.sql" + "/fixtures/eql_v3_integer_doubles.sql" )), - "int8" => include_str!(concat!( + "bigint" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/fixtures/eql_v3_int8_doubles.sql" + "/fixtures/eql_v3_bigint_doubles.sql" )), "date" => include_str!(concat!( env!("CARGO_MANIFEST_DIR"), @@ -297,7 +297,7 @@ async fn run_ord_oracle(pool: PgPool, cases: u32) -> Result<()> { } /// All fixtured scalars run the same number of proptest cases — the fixture -/// suite does no new encryption, so there is no reason for int4 to be +/// suite does no new encryption, so there is no reason for integer to be /// privileged. Raise here (one place) if a regression ever needs more cases. const FIXTURE_ORACLE_CASES: u32 = 32; @@ -326,22 +326,22 @@ macro_rules! fixture_oracle_suite { }; } -fixture_oracle_suite!(int4, i32, ordered); -fixture_oracle_suite!(int2, i16, ordered); -fixture_oracle_suite!(int8, i64, ordered); +fixture_oracle_suite!(integer, i32, ordered); +fixture_oracle_suite!(smallint, i16, ordered); +fixture_oracle_suite!(bigint, i64, ordered); fixture_oracle_suite!(date, chrono::NaiveDate, ordered); fixture_oracle_suite!(timestamp, chrono::DateTime, ordered); fixture_oracle_suite!(numeric, rust_decimal::Decimal, ordered); fixture_oracle_suite!(text, String, ordered); -fixture_oracle_suite!(float4, eql_tests::scalar_domains::F4, ordered); -fixture_oracle_suite!(float8, eql_tests::scalar_domains::F8, ordered); +fixture_oracle_suite!(real, eql_tests::scalar_domains::F4, ordered); +fixture_oracle_suite!(double, eql_tests::scalar_domains::F8, ordered); // --- function-double oracles (CIP-3141) ------------------------------------- // // The same fixture rows, but calling the generated `eql_v3.*` comparison // functions by name across all three overloads and asserting term-extractor // identity (eq_term==hm / ord_term==ob). Free of fresh encryption — read-only -// SQL over the already-encrypted fixtures. int4 is the reference family with +// SQL over the already-encrypted fixtures. integer is the reference family with // explicit tests; the other types go through `fixture_fn_oracle_suite!`. /// Function-double property driver: like `run_eq_oracle` / `run_ord_oracle`, but @@ -366,7 +366,7 @@ where } #[sqlx::test] -async fn prop_int4_eq_fn_oracle_over_fixture(pool: PgPool) -> Result<()> { +async fn prop_integer_eq_fn_oracle_over_fixture(pool: PgPool) -> Result<()> { run_fn_property::(pool, 32, |pool, sample| async move { assert_eq_fn_oracle::(&pool, Variant::Eq, &sample).await?; assert_extractor_oracle::(&pool, Variant::Eq, &sample).await @@ -375,7 +375,7 @@ async fn prop_int4_eq_fn_oracle_over_fixture(pool: PgPool) -> Result<()> { } #[sqlx::test] -async fn prop_int4_ord_fn_oracle_over_fixture(pool: PgPool) -> Result<()> { +async fn prop_integer_ord_fn_oracle_over_fixture(pool: PgPool) -> Result<()> { run_fn_property::(pool, 32, |pool, sample| async move { assert_ord_fn_oracle::(&pool, Variant::Ord, &sample).await?; assert_extractor_oracle::(&pool, Variant::Ord, &sample).await?; @@ -431,8 +431,8 @@ macro_rules! fixture_fn_oracle_suite { }; } -fixture_fn_oracle_suite!(int2_fn, i16, ordered); -fixture_fn_oracle_suite!(int8_fn, i64, ordered); +fixture_fn_oracle_suite!(smallint_fn, i16, ordered); +fixture_fn_oracle_suite!(bigint_fn, i64, ordered); // date, timestamp, and numeric are all ordered scalars on the `eql_v3` base, // so each gets eq/neq functions + eq_term identity plus the four ord functions // on both ordered twins. The generated fixtures already encrypt the whole diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs index 991802e2c..f591bc11e 100644 --- a/tests/sqlx/tests/encrypted_domain/signed.rs +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -1,5 +1,5 @@ -//! Sign-boundary coverage for **signed** scalars (`int2`/`int4`/`int8`, `date`, -//! `timestamp`, `float4`/`float8`) — the `SignedScalar` delta on top of the +//! Sign-boundary coverage for **signed** scalars (`smallint`/`integer`/`bigint`, `date`, +//! `timestamp`, `real`/`double`) — the `SignedScalar` delta on top of the //! uniform ordered matrix. //! //! ORE encrypts signed values as an offset from a numeric origin (`0` for @@ -43,8 +43,8 @@ async fn sign_boundary_is_monotonic(pool: &PgPool) -> anyhow::R Ok(()) } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int4")))] -async fn int4_sign_boundary(pool: PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_integer")))] +async fn integer_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } @@ -53,13 +53,13 @@ async fn date_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int2")))] -async fn int2_sign_boundary(pool: PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_smallint")))] +async fn smallint_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_int8")))] -async fn int8_sign_boundary(pool: PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_bigint")))] +async fn bigint_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } @@ -68,12 +68,12 @@ async fn timestamp_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::>(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_float4")))] -async fn float4_sign_boundary(pool: PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_real")))] +async fn real_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } -#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_float8")))] -async fn float8_sign_boundary(pool: PgPool) -> anyhow::Result<()> { +#[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_double")))] +async fn double_sign_boundary(pool: PgPool) -> anyhow::Result<()> { sign_boundary_is_monotonic::(&pool).await } diff --git a/tests/sqlx/tests/eql_v3_int4_fixture_tests.rs b/tests/sqlx/tests/eql_v3_integer_fixture_tests.rs similarity index 74% rename from tests/sqlx/tests/eql_v3_int4_fixture_tests.rs rename to tests/sqlx/tests/eql_v3_integer_fixture_tests.rs index bb3092490..59d27de53 100644 --- a/tests/sqlx/tests/eql_v3_int4_fixture_tests.rs +++ b/tests/sqlx/tests/eql_v3_integer_fixture_tests.rs @@ -1,6 +1,6 @@ -//! Structural verification of the generated `eql_v3_int4` fixture. +//! Structural verification of the generated `eql_v3_integer` fixture. //! -//! Vanilla SQL over `fixtures.eql_v3_int4` — `payload` is plain `jsonb`, no +//! Vanilla SQL over `fixtures.eql_v3_integer` — `payload` is plain `jsonb`, no //! domain type required. The `plaintext` column is the in-table oracle; no //! Rust value constant is shared with the generator. #224 verifies the //! fixture is well-formed; #225 verifies the domain operators on it. @@ -8,11 +8,11 @@ use anyhow::Result; use sqlx::PgPool; -/// The 17 values from `src/fixtures/eql_v3_int4.rs`, in id order. Kept here +/// The 17 values from `src/fixtures/eql_v3_integer.rs`, in id order. Kept here /// only to assert the in-table `plaintext` oracle matches what was generated. /// If `plaintext_column_matches_the_generated_values` fails, the generator's /// `VALUES` and this constant have drifted — re-run -/// `mise run fixture:generate eql_v3_int4` and update this list to match. +/// `mise run fixture:generate eql_v3_integer` and update this list to match. const EXPECTED_PLAINTEXTS: &[i32] = &[ i32::MIN, -100, @@ -33,39 +33,39 @@ const EXPECTED_PLAINTEXTS: &[i32] = &[ i32::MAX, ]; -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn fixture_has_seventeen_rows(pool: PgPool) -> Result<()> { - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v3_int4") + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v3_integer") .fetch_one(&pool) .await?; - assert_eq!(count, 17, "eql_v3_int4 fixture should have 17 rows"); + assert_eq!(count, 17, "eql_v3_integer fixture should have 17 rows"); Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn ids_are_sequential_one_to_seventeen(pool: PgPool) -> Result<()> { - let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.eql_v3_int4 ORDER BY id") + let ids: Vec = sqlx::query_scalar("SELECT id FROM fixtures.eql_v3_integer ORDER BY id") .fetch_all(&pool) .await?; assert_eq!(ids, (1..=17).collect::>()); Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn plaintext_column_matches_the_generated_values(pool: PgPool) -> Result<()> { let plaintexts: Vec = - sqlx::query_scalar("SELECT plaintext FROM fixtures.eql_v3_int4 ORDER BY id") + sqlx::query_scalar("SELECT plaintext FROM fixtures.eql_v3_integer ORDER BY id") .fetch_all(&pool) .await?; assert_eq!(plaintexts, EXPECTED_PLAINTEXTS); Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn every_payload_carries_the_hmac_equality_term(pool: PgPool) -> Result<()> { // `hm` drives equality. Every row's payload must carry an `hm` string term. let missing: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v3_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_integer WHERE payload->'hm' IS NULL OR jsonb_typeof(payload->'hm') <> 'string'", ) .fetch_one(&pool) @@ -74,11 +74,11 @@ async fn every_payload_carries_the_hmac_equality_term(pool: PgPool) -> Result<() Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn every_payload_carries_the_ore_block_term(pool: PgPool) -> Result<()> { // `ob` drives ordering. Every row's payload must carry a non-null ob array. let missing: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v3_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_integer WHERE payload->'ob' IS NULL OR jsonb_typeof(payload->'ob') <> 'array'", ) .fetch_one(&pool) @@ -87,11 +87,11 @@ async fn every_payload_carries_the_ore_block_term(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn every_payload_carries_a_ciphertext(pool: PgPool) -> Result<()> { // `c` is the ciphertext. Every row's payload must carry a `c` string. let missing: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v3_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_integer WHERE payload->'c' IS NULL OR jsonb_typeof(payload->'c') <> 'string'", ) .fetch_one(&pool) @@ -103,12 +103,12 @@ async fn every_payload_carries_a_ciphertext(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { // The in-table `plaintext` oracle: a consuming test can filter on it // directly. Exactly one row has plaintext = 42. let ids: Vec = - sqlx::query_scalar("SELECT id FROM fixtures.eql_v3_int4 WHERE plaintext = 42 ORDER BY id") + sqlx::query_scalar("SELECT id FROM fixtures.eql_v3_integer WHERE plaintext = 42 ORDER BY id") .fetch_all(&pool) .await?; assert_eq!( @@ -119,11 +119,11 @@ async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn hmac_equality_terms_are_distinct_for_distinct_values(pool: PgPool) -> Result<()> { // All 17 plaintext values are distinct, so all 17 `hm` terms must be too. let distinct_hm: i64 = - sqlx::query_scalar("SELECT COUNT(DISTINCT payload->>'hm') FROM fixtures.eql_v3_int4") + sqlx::query_scalar("SELECT COUNT(DISTINCT payload->>'hm') FROM fixtures.eql_v3_integer") .fetch_one(&pool) .await?; assert_eq!( @@ -133,7 +133,7 @@ async fn hmac_equality_terms_are_distinct_for_distinct_values(pool: PgPool) -> R Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn every_payload_declares_eql_payload_version_v3(pool: PgPool) -> Result<()> { // Every `eql_v3` domain CHECK pins `VALUE->>'v' = '3'` (the #340 // envelope bump), and the generator routes the pinned client's v2 @@ -142,7 +142,7 @@ async fn every_payload_declares_eql_payload_version_v3(pool: PgPool) -> Result<( // bump fails this test loudly, forcing the maintainer to regenerate the // fixture and audit consumers for semantic changes. let mismatched: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM fixtures.eql_v3_int4 + "SELECT COUNT(*) FROM fixtures.eql_v3_integer WHERE payload->'v' IS NULL OR payload->>'v' <> '3'", ) .fetch_one(&pool) @@ -151,13 +151,13 @@ async fn every_payload_declares_eql_payload_version_v3(pool: PgPool) -> Result<( Ok(()) } -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn no_payload_carries_the_v2_form_discriminator(pool: PgPool) -> Result<()> { // The v2 wire's `k: "ct"` discriminator is dropped by the from_v2 // conversion — its presence would mean a raw client payload bypassed // the conversion seam. let with_k: i64 = - sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v3_int4 WHERE payload ? 'k'") + sqlx::query_scalar("SELECT COUNT(*) FROM fixtures.eql_v3_integer WHERE payload ? 'k'") .fetch_one(&pool) .await?; assert_eq!(with_k, 0, "no converted scalar payload may carry `k`"); diff --git a/tests/sqlx/tests/generate_all_fixtures.rs b/tests/sqlx/tests/generate_all_fixtures.rs index 9f1ef5e59..268d14be5 100644 --- a/tests/sqlx/tests/generate_all_fixtures.rs +++ b/tests/sqlx/tests/generate_all_fixtures.rs @@ -15,7 +15,7 @@ // `generate_for_token(token: &str) -> anyhow::Result<()>` is generated from the // single harness list in `tests/sqlx/src/scalar_types.rs`: one match arm per -// token (`"int4" => fixtures::eql_v3_int4::spec().run().await`) plus a loud +// token (`"integer" => fixtures::eql_v3_integer::spec().run().await`) plus a loud // catch-all. A catalog token absent from that list hits the catch-all and fails // the generator loudly, so a new scalar type cannot silently skip generation. eql_tests::scalar_types!(fixture_dispatch); @@ -40,13 +40,13 @@ async fn generate_all() -> anyhow::Result<()> { eql_tests::fixtures::v3_ste_vec::generate().await?; eprintln!("Regenerated v3_ste_vec."); - // The scalar-shaped SteVec document fixture — one `{"field": }` - // document per `eql_domains::INT4_VALUES`, with an int4 plaintext oracle — + // The scalar-shaped SteVec document fixture — one `{"field": }` + // document per `eql_domains::INTEGER_VALUES`, with an integer plaintext oracle — // drives the jsonb-entry behaviour matrix. Same pipeline, split payload - // (jsonb-document encryption input, int4 oracle column). - eprintln!("Generating fixture v3_doc_int4 (scalar-shaped SteVec document)..."); - eql_tests::fixtures::v3_doc_int4::generate().await?; - eprintln!("Regenerated v3_doc_int4."); + // (jsonb-document encryption input, integer oracle column). + eprintln!("Generating fixture v3_doc_integer (scalar-shaped SteVec document)..."); + eql_tests::fixtures::v3_doc_integer::generate().await?; + eprintln!("Regenerated v3_doc_integer."); // The numeric scale-equivalence collision fixture (`1`, `1.0`, `2`). Not a // CATALOG scalar — the distinctness guard forbids `1`/`1.0` coexisting in diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index 9d739fc45..edd9252fb 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -16,10 +16,10 @@ use eql_tests::Variant; use sqlx::PgPool; /// Pg-type tokens for the encrypted-scalar-domain families currently -/// materialised. Extending the family (e.g. when `int8`/`bool`/`date` +/// materialised. Extending the family (e.g. when `bigint`/`bool`/`date` /// land) is a one-line array extension here — every downstream /// parameterised test picks it up automatically. -const SCALAR_PG_TYPES: &[&str] = &["int4", "int2"]; +const SCALAR_PG_TYPES: &[&str] = &["integer", "smallint"]; #[derive(Debug, sqlx::FromRow)] struct LintRow { @@ -118,15 +118,15 @@ async fn lint_categories_are_well_known(pool: PgPool) -> Result<()> { /// planner can fold or elide the call when the result is provably unused /// (a dead CASE branch, a folded predicate), silently bypassing the RAISE /// and re-enabling the operator. See CLAUDE.md footguns. This test plants -/// a fake LANGUAGE sql blocker on `eql_v3.int4` and asserts the lint +/// a fake LANGUAGE sql blocker on `eql_v3.integer` and asserts the lint /// surfaces it under category `blocker_language`. #[sqlx::test] async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v3.test_bad_blocker_sql(a eql_v3.int4, b eql_v3.int4) + CREATE FUNCTION eql_v3.test_bad_blocker_sql(a eql_v3.integer, b eql_v3.integer) RETURNS boolean LANGUAGE sql IMMUTABLE - AS $$ SELECT eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.int4', '=') $$; + AS $$ SELECT eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.integer', '=') $$; "#, ) .execute(&pool) @@ -156,15 +156,15 @@ async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { /// A blocker marked `STRICT` lets PostgreSQL skip the body and return NULL /// on a NULL argument — silently bypassing the "operator not supported" /// RAISE. See CLAUDE.md footguns. This test plants a fake STRICT plpgsql -/// blocker on `eql_v3.int4` and asserts the lint surfaces it under +/// blocker on `eql_v3.integer` and asserts the lint surfaces it under /// `blocker_strict`. #[sqlx::test] async fn lint_flags_strict_blocker(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v3.test_bad_blocker_strict(a eql_v3.int4, b eql_v3.int4) + CREATE FUNCTION eql_v3.test_bad_blocker_strict(a eql_v3.integer, b eql_v3.integer) RETURNS boolean LANGUAGE plpgsql IMMUTABLE STRICT - AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.int4', '='); END; $$; + AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.integer', '='); END; $$; "#, ) .execute(&pool) @@ -208,7 +208,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( | "inlinability_volatility" | "inlinability_set_clause" | "inlinability_secdef" - ) && r.object_name.contains("eql_v3.int4") + ) && r.object_name.contains("eql_v3.integer") && (r.object_name.contains("operator =(") || r.object_name.contains("operator ->(") || r.object_name.contains("operator ?(")) @@ -231,7 +231,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( /// surfaces it under `domain_over_domain`. #[sqlx::test] async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { - sqlx::query(r#"CREATE DOMAIN eql_v3.test_baddom AS eql_v3.int4;"#) + sqlx::query(r#"CREATE DOMAIN eql_v3.test_baddom AS eql_v3.integer;"#) .execute(&pool) .await?; @@ -344,7 +344,7 @@ async fn lint_flags_composite_type_in_eql_v3(pool: PgPool) -> Result<()> { /// inlinable. /// /// Discovers the eligible operator set from `pg_operator` rather than -/// hardcoding the int4 inventory — when `int8` (or `bool`, `date`, ...) +/// hardcoding the integer inventory — when `bigint` (or `bool`, `date`, ...) /// lands, this test picks it up automatically with no edit. The earlier /// hardcoded list was a copy-paste hazard. #[sqlx::test] diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index 33a5c6dec..71cbe9f38 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -168,7 +168,7 @@ async fn comparator_rejects_sixteen_byte_term(pool: PgPool) -> Result<()> { /// Cross-width footgun: now that N is derived per-term, comparing terms of two /// different (individually valid) widths must raise via the equal-length guard, /// not silently compare the shared prefix. Both lengths here are well-formed — -/// 408 = 49*8 + 16 (the int4 width, N=8) and 702 = 49*14 + 16 (the numeric +/// 408 = 49*8 + 16 (the integer width, N=8) and 702 = 49*14 + 16 (the numeric /// width, N=14) — so the only thing that fires is the different-lengths check, /// ahead of the malformed-length guard. Creds-free (hand-built bytea). #[sqlx::test] @@ -272,7 +272,7 @@ async fn comparator_length_guard_sweep(pool: PgPool) -> Result<()> { ); } - // Valid: 49*N + 16 for N = 1..=14 (spans the int4/timestamp/numeric widths). + // Valid: 49*N + 16 for N = 1..=14 (spans the integer/timestamp/numeric widths). for n in 1..=14usize { let len = 49 * n + 16; diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index 8476a3e38..628f38e13 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -536,7 +536,7 @@ async fn v3_jsonb_raw_helpers_contains_and_contained_by(pool: PgPool) -> anyhow: } /// `eql_v3.has_ore_cllw(jsonb_entry)` is otherwise only exercised incidentally -/// — `jsonb_entry_int4_fixture_shape` asserts every fixture row's `oc`-bearing +/// — `jsonb_entry_integer_fixture_shape` asserts every fixture row's `oc`-bearing /// entry passes it, but never exercises the false branch (an entry with `hm` /// only, no `oc`). Dedicated positive/negative coverage of both branches. #[sqlx::test] diff --git a/tests/sqlx/tests/v3_privilege_tests.rs b/tests/sqlx/tests/v3_privilege_tests.rs index 87cf6eff5..c2219383e 100644 --- a/tests/sqlx/tests/v3_privilege_tests.rs +++ b/tests/sqlx/tests/v3_privilege_tests.rs @@ -24,28 +24,28 @@ use anyhow::Result; use sqlx::PgPool; -/// A real equality query (`=` on `int4_eq`) over the committed fixture. The `=` +/// A real equality query (`=` on `integer_eq`) over the committed fixture. The `=` /// operator binds the public wrapper `eql_v3.eq`, whose (inlinable) body calls /// `eql_v3.eq_term`, which in turn calls the `eql_v3_internal.hmac_256(jsonb)` /// constructor — inlined into the query, that constructor call requires the /// caller to hold `eql_v3_internal`, so the path exercises BOTH schemas. -const EQ_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_int4 \ - WHERE payload::eql_v3.int4_eq = payload::eql_v3.int4_eq"; +const EQ_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer \ + WHERE payload::eql_v3.integer_eq = payload::eql_v3.integer_eq"; -/// A real ordering query using the `<` *operator* on `int4_ord`, which dispatches +/// A real ordering query using the `<` *operator* on `integer_ord`, which dispatches /// through `eql_v3.lt` → `eql_v3.ord_term` → the `eql_v3_internal.ore_block_256` -/// constructor + comparator. NB: `ORDER BY payload::eql_v3.int4_ord` alone does +/// constructor + comparator. NB: `ORDER BY payload::eql_v3.integer_ord` alone does /// NOT work here — a bare domain has no ORE opclass, so it silently falls back to /// built-in jsonb ordering and never crosses into `eql_v3_internal`. The `<` /// operator is what genuinely exercises the encrypted ordering path. -const ORD_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_int4 a, fixtures.eql_v3_int4 b \ - WHERE a.payload::eql_v3.int4_ord < b.payload::eql_v3.int4_ord"; +const ORD_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer a, fixtures.eql_v3_integer b \ + WHERE a.payload::eql_v3.integer_ord < b.payload::eql_v3.integer_ord"; -/// A real aggregate (`eql_v3.min` on `int4_ord`). The public aggregate dispatches +/// A real aggregate (`eql_v3.min` on `integer_ord`). The public aggregate dispatches /// into its state function `eql_v3_internal.min_sfunc`, so it requires the /// internal grant. -const AGG_QUERY: &str = "SELECT eql_v3.min(payload::eql_v3.int4_ord) \ - FROM fixtures.eql_v3_int4"; +const AGG_QUERY: &str = "SELECT eql_v3.min(payload::eql_v3.integer_ord) \ + FROM fixtures.eql_v3_integer"; /// A real jsonb (SteVec) containment READ path. `eql_v3.ste_vec_contains` is /// `plpgsql` (never inlined), so — unlike the scalar operators — it runs under @@ -158,13 +158,13 @@ fn assert_insufficient_privilege(err: sqlx::Error, context: &str) { /// Positive: a runtime role granted USAGE + EXECUTE on BOTH schemas (exactly the /// README recipe) can run the documented equality, ordering, and aggregate paths. -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn runtime_role_with_both_schema_grants_can_query(pool: PgPool) -> Result<()> { // A single connection for the whole test: SET ROLE is connection-scoped. let mut conn = pool.acquire().await?; let role = create_isolated_role(&mut conn).await?; - grant_fixture_access(&mut conn, &role, &["eql_v3_int4"]).await?; + grant_fixture_access(&mut conn, &role, &["eql_v3_integer"]).await?; grant_schema(&mut conn, &role, "eql_v3").await?; grant_schema(&mut conn, &role, "eql_v3_internal").await?; // The ORE comparison (ordering / min-max) calls pgcrypto `encrypt()`, which @@ -204,12 +204,12 @@ async fn runtime_role_with_both_schema_grants_can_query(pool: PgPool) -> Result< /// into `eql_v3_internal`, so a missing internal grant raises /// `insufficient_privilege` (42501). Pins *why* the docs require the internal /// grant: `eql_v3` alone is not enough for the supported operators. -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] async fn runtime_role_without_internal_grant_is_denied(pool: PgPool) -> Result<()> { let mut conn = pool.acquire().await?; let role = create_isolated_role(&mut conn).await?; - grant_fixture_access(&mut conn, &role, &["eql_v3_int4"]).await?; + grant_fixture_access(&mut conn, &role, &["eql_v3_integer"]).await?; // Public schema ONLY — deliberately omit eql_v3_internal. grant_schema(&mut conn, &role, "eql_v3").await?; From 30c360650822a660b308e1bfd2125fe3870709ed Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 3 Jul 2026 11:39:00 +1000 Subject: [PATCH 478/599] test(v3): regenerate matrix snapshots + fixture wiring for SQL-standard names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Regenerated *_expanded.rs (int4->integer, bool->boolean; text refreshed); matrix_tests*.txt/jsonb_entry unchanged (token-normalized to ). - Updated mise.toml snapshot-task representative tokens (scalars::integer::, scalars::boolean::, jsonb_entry_integer, TARGETS=(integer text boolean)) and snapshots/README.md docs. - .gitignore: v3_doc_int4.sql -> v3_doc_integer.sql (keep generated fixture ignored). - Drive-by: pin two pre-existing-drift test names in v3_jsonb_tests.txt (v3_jsonb_has_ore_cllw_entry_branches, v3_jsonb_raw_helpers_contains_and_contained_by) — present in source on the branch base but never snapshotted; unrelated to the rename. Matrix inventory + jsonb_entry + v3-jsonb inventory gates all pass. --- .gitignore | 2 +- mise.toml | 30 +- tests/sqlx/snapshots/README.md | 22 +- .../{bool_expanded.rs => boolean_expanded.rs} | 376 +- .../{int4_expanded.rs => integer_expanded.rs} | 4308 +++++++++-------- tests/sqlx/snapshots/text_expanded.rs | 462 +- 6 files changed, 2714 insertions(+), 2486 deletions(-) rename tests/sqlx/snapshots/{bool_expanded.rs => boolean_expanded.rs} (89%) rename tests/sqlx/snapshots/{int4_expanded.rs => integer_expanded.rs} (88%) diff --git a/.gitignore b/.gitignore index 4e5c1d829..a419ab9ac 100644 --- a/.gitignore +++ b/.gitignore @@ -227,7 +227,7 @@ tests/sqlx/migrations/001_install_eql.sql # never commit — stale fixtures hide bugs) tests/sqlx/fixtures/eql_v3* tests/sqlx/fixtures/v3_ste_vec.sql -tests/sqlx/fixtures/v3_doc_int4.sql +tests/sqlx/fixtures/v3_doc_integer.sql tests/sqlx/fixtures/v3_numeric_collision.sql tests/sqlx/fixtures/v3_text_empty.sql diff --git a/mise.toml b/mise.toml index e7b1053f4..c75b7bdb7 100644 --- a/mise.toml +++ b/mise.toml @@ -282,7 +282,7 @@ run = """ # arms). It is not derivable by a strip filter, so it is committed directly and # pinned as a strict superset of the baseline. The fourth # (snapshots/matrix_tests_storage_only.txt) is the STORAGE-ONLY / encryption-only -# shape (e.g. `bool`): a single term-less domain with NO comparison/index/order +# shape (e.g. `boolean`): a single term-less domain with NO comparison/index/order # tests — only the surface arms (sanity, blocker, payload-check, path-op, # native-absent, typed-column, count, aggregate-typecheck, fixture-shape). It is # neither a subset derivable by a strip filter nor a superset, so it is committed @@ -368,7 +368,7 @@ fi # Per-type normalize + compare: each type must match the full canonical snapshot # (ordered shape), the derived eq-only subset (equality-only shape), or the # committed text superset (text shape), or the committed storage-only set -# (storage-only / encryption-only shape, e.g. `bool` — a single term-less +# (storage-only / encryption-only shape, e.g. `boolean` — a single term-less # domain with no comparison/index/order tests, only the surface arms). checked=0 while IFS= read -r t; do @@ -448,9 +448,9 @@ run = """ # # Drivers (one representative type per shape; the inventory gate then asserts # every type of that shape matches the snapshot after normalization): -# ordered → scalars::int4:: (caps = [eq, ord]) +# ordered → scalars::integer:: (caps = [eq, ord]) # text → scalars::text:: (caps = [eq, ord, search]; superset of ordered) -# storage-only → scalars::bool:: (caps = [storage]; term-less surface arms) +# storage-only → scalars::boolean:: (caps = [storage]; term-less surface arms) # eq-only → DERIVED from the ordered baseline (minus _ord/order_by/routes_through_ob) # # Out of scope by design: the sibling snapshots matrix_jsonb_entry_tests.txt and @@ -487,8 +487,8 @@ stage=$(mktemp -d) # Ordered baseline (canonical) — staged first because the eq-only shape is # DERIVED from it below. -printf '%s\\n' "$listing" | grep '^scalars::int4::' \ - | sed -e 's/^scalars::int4::/scalars::::/' -e 's/_int4_/__/g' \ +printf '%s\\n' "$listing" | grep '^scalars::integer::' \ + | sed -e 's/^scalars::integer::/scalars::::/' -e 's/_integer_/__/g' \ | LC_ALL=C sort > "$stage/matrix_tests.txt" # Eq-only shape: DERIVED from the freshly-regenerated ordered baseline (the @@ -502,8 +502,8 @@ printf '%s\\n' "$listing" | grep '^scalars::text::' \ | LC_ALL=C sort > "$stage/matrix_tests_text.txt" # Storage-only shape: term-less surface arms only, from its own driver type. -printf '%s\\n' "$listing" | grep '^scalars::bool::' \ - | sed -e 's/^scalars::bool::/scalars::::/' -e 's/_bool_/__/g' \ +printf '%s\\n' "$listing" | grep '^scalars::boolean::' \ + | sed -e 's/^scalars::boolean::/scalars::::/' -e 's/_boolean_/__/g' \ | LC_ALL=C sort > "$stage/matrix_tests_storage_only.txt" # Every shape must have arms; an empty one means a driver type lost its matrix @@ -526,7 +526,7 @@ dir = "{{config_root}}/tests/sqlx" run = """ #!/usr/bin/env bash # The jsonb-entry behaviour matrix (jsonb_entry_matrix!) is a SIBLING of the -# scalar matrix inventory, NOT folded into it: JsonbEntryInt4 is deliberately +# scalar matrix inventory, NOT folded into it: JsonbEntryInteger is deliberately # not a eql-domains::CATALOG type, so it has no scalars:::: tests and no # `eql-codegen list-types` row. Its names live under `jsonb_entry::…` and are # pinned by this isolated snapshot (no catalog cross-check). No database needed. @@ -538,8 +538,8 @@ EQL_ROOT="{{config_root}}" source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" listing=$(cargo test --no-default-features --test encrypted_domain -- --list | sed -n 's/: test$//p') printf '%s\\n' "$listing" \ - | grep '^jsonb_entry::.*jsonb_entry_int4' \ - | sed -E 's/_int4_/__/' \ + | grep '^jsonb_entry::.*jsonb_entry_integer' \ + | sed -E 's/_integer_/__/' \ | LC_ALL=C sort -u > /tmp/matrix-jsonb-entry-current.txt if ! cmp -s /tmp/matrix-jsonb-entry-current.txt snapshots/matrix_jsonb_entry_tests.txt; then echo "JSONB-entry matrix test-name set differs from snapshots/matrix_jsonb_entry_tests.txt." >&2 @@ -660,17 +660,17 @@ echo "Catalog-coverage OK: every CATALOG (type, domain) has matrix tests." """ [tasks."test:matrix:expand"] -description = "Regenerate the matrix cargo-expand drift snapshots (int4, text, bool — one per reachable scalar_matrix! arm; requires the pinned nightly + cargo-expand)" +description = "Regenerate the matrix cargo-expand drift snapshots (integer, text, bool — one per reachable scalar_matrix! arm; requires the pinned nightly + cargo-expand)" dir = "{{config_root}}/tests/sqlx" run = """ #!/usr/bin/env bash # Body-level fidelity backstop for the macro: the expanded source of the matrix # arms, one snapshot per *reachable* `scalar_matrix!` arm (tests/sqlx/src/matrix.rs): -# int4 -> [eq, ord] (= rides the ORE ordered index) +# integer -> [eq, ord] (= rides the ORE ordered index) # text -> [eq, ord, search] (bloom `_match` + `_eqidx` index split) # bool -> [storage] (single term-less domain; direct leaf drivers) # The arms emit structurally different bodies, so no single type subsumes the -# others (text does NOT subsume int4: its `ord` btree combo omits `=`). The `[eq]` +# others (text does NOT subsume integer: its `ord` btree combo omits `=`). The `[eq]` # arm has no consumer and is uncovered by design. The `cargo +nightly-...` # invocation below is the SINGLE source of the pinned nightly date — # .github/workflows/macro-expand-eql.yml greps it from here rather than @@ -701,7 +701,7 @@ export PATH mkdir -p snapshots fixtures # One target per reachable scalar_matrix! arm. Add a token here to pin another # arm; its snapshot is written to snapshots/_expanded.rs. -TARGETS=(int4 text bool) +TARGETS=(integer text boolean) BK=$(mktemp -d) cp -a migrations "$BK/migrations" mkdir -p "$BK/fixtures" diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index 8da6fa17c..b631097d7 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -70,7 +70,7 @@ cargo test --no-default-features --test encrypted_domain -- --list \ For the **storage-only / encryption-only** shape there is a fourth committed snapshot, `matrix_tests_storage_only.txt`. A storage-only scalar -(`scalar_matrix! { caps = [storage] }`, e.g. `bool`) has a single term-less +(`scalar_matrix! { caps = [storage] }`, e.g. `boolean`) has a single term-less domain and **no** comparison/index/order capability, so its name set is neither a strip-filter subset of the ordered baseline nor a superset — it is the storage-domain surface arms only (sanity, blocker-raises for every comparison + @@ -82,8 +82,8 @@ with: ```bash cd tests/sqlx cargo test --no-default-features --test encrypted_domain -- --list \ - | sed -n 's/: test$//p' | grep '^scalars::bool::' \ - | sed -e 's/^scalars::bool::/scalars::::/' -e 's/_bool_/__/g' | LC_ALL=C sort > snapshots/matrix_tests_storage_only.txt + | sed -n 's/: test$//p' | grep '^scalars::boolean::' \ + | sed -e 's/^scalars::boolean::/scalars::::/' -e 's/_boolean_/__/g' | LC_ALL=C sort > snapshots/matrix_tests_storage_only.txt ``` The "no per-type variation" property is preserved by design: every ordered @@ -172,7 +172,7 @@ See `docs/reference/adding-a-scalar-encrypted-domain-type.md` §3 (matrix oracle `matrix_jsonb_entry_tests.txt` pins the test-name set for the jsonb SteVec-entry behaviour matrix (`jsonb_entry_matrix!`), whose names live under `jsonb_entry::…`. It is a deliberate **sibling** of the scalar matrix inventory -above, **not** folded into it: the driver type (`JsonbEntryInt4`) is intentionally +above, **not** folded into it: the driver type (`JsonbEntryInteger`) is intentionally not an `eql-domains::CATALOG` type, so it has no `scalars::::` tests and no `eql-codegen list-types` row — hence this snapshot is checked on its own, with **no catalog cross-check**. The matrix reuses the scalar matrix generators to @@ -184,8 +184,8 @@ Verify with `mise run test:matrix:inventory:jsonb_entry`. Regenerate with: ```bash cd tests/sqlx cargo test --no-default-features --test encrypted_domain -- --list \ - | sed -n 's/: test$//p' | grep '^jsonb_entry::.*jsonb_entry_int4' \ - | sed -E 's/_int4_/__/' | LC_ALL=C sort -u > snapshots/matrix_jsonb_entry_tests.txt + | sed -n 's/: test$//p' | grep '^jsonb_entry::.*jsonb_entry_integer' \ + | sed -E 's/_integer_/__/' | LC_ALL=C sort -u > snapshots/matrix_jsonb_entry_tests.txt ``` ## v3_jsonb_tests.txt @@ -207,7 +207,7 @@ CI verifies it with `mise run test:v3-jsonb:inventory`. ## Macro expansion body snapshots (`*_expanded.rs`) -`int4_expanded.rs`, `text_expanded.rs`, and `bool_expanded.rs` are a **different +`integer_expanded.rs`, `text_expanded.rs`, and `boolean_expanded.rs` are a **different kind** of snapshot from the `matrix_tests*.txt` inventories above. The inventories pin the *set of test names*; these pin the **generated bodies** — the actual `cargo expand` output of the `scalar_matrix!` macro. The inventory catches a whole @@ -219,13 +219,13 @@ because the arms emit structurally different bodies and none subsumes another: | snapshot | type | arm | unique body surface | |----------|------|-----|---------------------| -| `int4_expanded.rs` | `int4` | `caps = [eq, ord]` | the `ord`/`ord_ore` btree combo carries `=` **plus** the four ordering ops on one index — proves `=` rides the ORE ordered index (the path all eight integer/temporal/float types use) | +| `integer_expanded.rs` | `integer` | `caps = [eq, ord]` | the `ord`/`ord_ore` btree combo carries `=` **plus** the four ordering ops on one index — proves `=` rides the ORE ordered index (the path all eight integer/temporal/float types use) | | `text_expanded.rs` | `text` | `caps = [eq, ord, search]` | `=` split into separate `*_eqidx` combos; `_match`/`_search` bloom (`@>`/`<@`) and GIN arms | -| `bool_expanded.rs` | `bool` | `caps = [storage]` | single term-less domain; bypasses `scalar_domain_matrix!`, calling the leaf drivers directly (every comparison/containment op is a blocker) | +| `boolean_expanded.rs` | `boolean` | `caps = [storage]` | single term-less domain; bypasses `scalar_domain_matrix!`, calling the leaf drivers directly (every comparison/containment op is a blocker) | -`text` does **not** make `int4` redundant: its `ord` btree combo omits `=` (moved +`text` does **not** make `integer` redundant: its `ord` btree combo omits `=` (moved to `_eqidx`), so the "`=` rides the ORE ordered index" body exists only in the -`int4` snapshot. The `caps = [eq]` arm has no consumer and is uncovered by design. +`integer` snapshot. The `caps = [eq]` arm has no consumer and is uncovered by design. These are **committed** (tracked), unlike the gitignored generated SQL. They carry `linguist-generated` via `.gitattributes` so GitHub collapses them in diffs. diff --git a/tests/sqlx/snapshots/bool_expanded.rs b/tests/sqlx/snapshots/boolean_expanded.rs similarity index 89% rename from tests/sqlx/snapshots/bool_expanded.rs rename to tests/sqlx/snapshots/boolean_expanded.rs index 9234a0789..a9ec817fe 100644 --- a/tests/sqlx/snapshots/bool_expanded.rs +++ b/tests/sqlx/snapshots/boolean_expanded.rs @@ -1,11 +1,13 @@ -///`eql_v3_bool` matrix suite — generated by `scalar_types!`. -pub mod bool { +///`eql_v3_boolean` matrix suite — generated by `scalar_types!`. +pub mod boolean { extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_sanity"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_sanity"] #[doc(hidden)] - pub const matrix_bool_storage_sanity: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_sanity: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_storage_sanity"), + name: test::StaticTestName( + "scalars::boolean::matrix_boolean_storage_sanity", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -20,11 +22,13 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_sanity()), + || test::assert_test_result(matrix_boolean_storage_sanity()), ), }; - fn matrix_bool_storage_sanity() -> anyhow::Result<()> { - async fn matrix_bool_storage_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_boolean_storage_sanity() -> anyhow::Result<()> { + async fn matrix_boolean_storage_sanity( + _pool: sqlx::PgPool, + ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< bool, @@ -45,7 +49,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_sanity", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_sanity", ); args.migrator( &::sqlx::migrate::Migrator { @@ -74,15 +78,17 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_sanity; + let f: fn(_) -> _ = matrix_boolean_storage_sanity; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_eq_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_eq_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_eq_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_eq_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_storage_eq_blocker"), + name: test::StaticTestName( + "scalars::boolean::matrix_boolean_storage_eq_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -97,11 +103,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_eq_blocker()), + || test::assert_test_result(matrix_boolean_storage_eq_blocker()), ), }; - fn matrix_bool_storage_eq_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_eq_blocker( + fn matrix_boolean_storage_eq_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_eq_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -180,7 +186,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_eq_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_eq_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -209,15 +215,17 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_eq_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_eq_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_neq_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_neq_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_neq_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_neq_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_storage_neq_blocker"), + name: test::StaticTestName( + "scalars::boolean::matrix_boolean_storage_neq_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -232,11 +240,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_neq_blocker()), + || test::assert_test_result(matrix_boolean_storage_neq_blocker()), ), }; - fn matrix_bool_storage_neq_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_neq_blocker( + fn matrix_boolean_storage_neq_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_neq_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -315,7 +323,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_neq_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_neq_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -344,15 +352,17 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_neq_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_neq_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_lt_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_lt_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_storage_lt_blocker"), + name: test::StaticTestName( + "scalars::boolean::matrix_boolean_storage_lt_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -367,11 +377,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_lt_blocker()), + || test::assert_test_result(matrix_boolean_storage_lt_blocker()), ), }; - fn matrix_bool_storage_lt_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_lt_blocker( + fn matrix_boolean_storage_lt_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_lt_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -450,7 +460,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_lt_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_lt_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -479,15 +489,17 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_lt_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_lt_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_lte_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_lte_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_storage_lte_blocker"), + name: test::StaticTestName( + "scalars::boolean::matrix_boolean_storage_lte_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -502,11 +514,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_lte_blocker()), + || test::assert_test_result(matrix_boolean_storage_lte_blocker()), ), }; - fn matrix_bool_storage_lte_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_lte_blocker( + fn matrix_boolean_storage_lte_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_lte_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -585,7 +597,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_lte_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_lte_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -614,15 +626,17 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_lte_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_lte_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_gt_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_gt_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_storage_gt_blocker"), + name: test::StaticTestName( + "scalars::boolean::matrix_boolean_storage_gt_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -637,11 +651,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_gt_blocker()), + || test::assert_test_result(matrix_boolean_storage_gt_blocker()), ), }; - fn matrix_bool_storage_gt_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_gt_blocker( + fn matrix_boolean_storage_gt_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_gt_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -720,7 +734,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_gt_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_gt_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -749,15 +763,17 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_gt_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_gt_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_gte_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_gte_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_storage_gte_blocker"), + name: test::StaticTestName( + "scalars::boolean::matrix_boolean_storage_gte_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -772,11 +788,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_gte_blocker()), + || test::assert_test_result(matrix_boolean_storage_gte_blocker()), ), }; - fn matrix_bool_storage_gte_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_gte_blocker( + fn matrix_boolean_storage_gte_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_gte_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -855,7 +871,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_gte_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_gte_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -884,16 +900,16 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_gte_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_gte_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_contains_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_contains_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_contains_blocker", + "scalars::boolean::matrix_boolean_storage_contains_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -909,11 +925,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_contains_blocker()), + || test::assert_test_result(matrix_boolean_storage_contains_blocker()), ), }; - fn matrix_bool_storage_contains_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_contains_blocker( + fn matrix_boolean_storage_contains_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_contains_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -992,7 +1008,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_contains_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_contains_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1021,16 +1037,16 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_contains_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_contains_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_contained_by_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_contained_by_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_contained_by_blocker", + "scalars::boolean::matrix_boolean_storage_contained_by_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1046,11 +1062,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_contained_by_blocker()), + || test::assert_test_result(matrix_boolean_storage_contained_by_blocker()), ), }; - fn matrix_bool_storage_contained_by_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_contained_by_blocker( + fn matrix_boolean_storage_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_contained_by_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1129,7 +1145,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_contained_by_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_contained_by_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1158,16 +1174,16 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_contained_by_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_contained_by_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_payload_check"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_payload_check"] #[doc(hidden)] - pub const matrix_bool_storage_payload_check: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_payload_check: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_payload_check", + "scalars::boolean::matrix_boolean_storage_payload_check", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1183,11 +1199,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_payload_check()), + || test::assert_test_result(matrix_boolean_storage_payload_check()), ), }; - fn matrix_bool_storage_payload_check() -> anyhow::Result<()> { - async fn matrix_bool_storage_payload_check( + fn matrix_boolean_storage_payload_check() -> anyhow::Result<()> { + async fn matrix_boolean_storage_payload_check( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1271,7 +1287,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_payload_check", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_payload_check", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1300,16 +1316,16 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_payload_check; + let f: fn(_) -> _ = matrix_boolean_storage_payload_check; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_path_op_blockers"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_path_op_blockers"] #[doc(hidden)] - pub const matrix_bool_storage_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_path_op_blockers", + "scalars::boolean::matrix_boolean_storage_path_op_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1325,11 +1341,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_path_op_blockers()), + || test::assert_test_result(matrix_boolean_storage_path_op_blockers()), ), }; - fn matrix_bool_storage_path_op_blockers() -> anyhow::Result<()> { - async fn matrix_bool_storage_path_op_blockers( + fn matrix_boolean_storage_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_boolean_storage_path_op_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1374,7 +1390,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_path_op_blockers", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_path_op_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1403,16 +1419,16 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_path_op_blockers; + let f: fn(_) -> _ = matrix_boolean_storage_path_op_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_native_absent_ops"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_native_absent_ops"] #[doc(hidden)] - pub const matrix_bool_storage_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_native_absent_ops", + "scalars::boolean::matrix_boolean_storage_native_absent_ops", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1428,11 +1444,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_native_absent_ops()), + || test::assert_test_result(matrix_boolean_storage_native_absent_ops()), ), }; - fn matrix_bool_storage_native_absent_ops() -> anyhow::Result<()> { - async fn matrix_bool_storage_native_absent_ops( + fn matrix_boolean_storage_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_boolean_storage_native_absent_ops( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1463,7 +1479,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_native_absent_ops", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_native_absent_ops", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1492,16 +1508,16 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_native_absent_ops; + let f: fn(_) -> _ = matrix_boolean_storage_native_absent_ops; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_typed_column_blocker"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_typed_column_blocker"] #[doc(hidden)] - pub const matrix_bool_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_typed_column_blocker", + "scalars::boolean::matrix_boolean_storage_typed_column_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1517,11 +1533,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_typed_column_blocker()), + || test::assert_test_result(matrix_boolean_storage_typed_column_blocker()), ), }; - fn matrix_bool_storage_typed_column_blocker() -> anyhow::Result<()> { - async fn matrix_bool_storage_typed_column_blocker( + fn matrix_boolean_storage_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_boolean_storage_typed_column_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1834,7 +1850,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_typed_column_blocker", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_typed_column_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1863,23 +1879,23 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_typed_column_blocker; + let f: fn(_) -> _ = matrix_boolean_storage_typed_column_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_count_typed_column"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_count_typed_column"] #[doc(hidden)] - pub const matrix_bool_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_count_typed_column", + "scalars::boolean::matrix_boolean_storage_count_typed_column", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -1888,11 +1904,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_count_typed_column()), + || test::assert_test_result(matrix_boolean_storage_count_typed_column()), ), }; - fn matrix_bool_storage_count_typed_column() -> anyhow::Result<()> { - async fn matrix_bool_storage_count_typed_column( + fn matrix_boolean_storage_count_typed_column() -> anyhow::Result<()> { + async fn matrix_boolean_storage_count_typed_column( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1956,7 +1972,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_count_typed_column", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_count_typed_column", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1987,28 +2003,28 @@ pub mod bool { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_bool.sql", + path: "../../../fixtures/eql_v3_boolean.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_bool_storage_count_typed_column; + let f: fn(_) -> _ = matrix_boolean_storage_count_typed_column; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_count_path_cast"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_count_path_cast"] #[doc(hidden)] - pub const matrix_bool_storage_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_count_path_cast", + "scalars::boolean::matrix_boolean_storage_count_path_cast", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -2017,11 +2033,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_count_path_cast()), + || test::assert_test_result(matrix_boolean_storage_count_path_cast()), ), }; - fn matrix_bool_storage_count_path_cast() -> anyhow::Result<()> { - async fn matrix_bool_storage_count_path_cast( + fn matrix_boolean_storage_count_path_cast() -> anyhow::Result<()> { + async fn matrix_boolean_storage_count_path_cast( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2066,7 +2082,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_count_path_cast", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_count_path_cast", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2097,28 +2113,28 @@ pub mod bool { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_bool.sql", + path: "../../../fixtures/eql_v3_boolean.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_bool_storage_count_path_cast; + let f: fn(_) -> _ = matrix_boolean_storage_count_path_cast; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_count_distinct_extractor"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_count_distinct_extractor"] #[doc(hidden)] - pub const matrix_bool_storage_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_count_distinct_extractor", + "scalars::boolean::matrix_boolean_storage_count_distinct_extractor", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -2127,11 +2143,13 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_count_distinct_extractor()), + || test::assert_test_result( + matrix_boolean_storage_count_distinct_extractor(), + ), ), }; - fn matrix_bool_storage_count_distinct_extractor() -> anyhow::Result<()> { - async fn matrix_bool_storage_count_distinct_extractor( + fn matrix_boolean_storage_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_boolean_storage_count_distinct_extractor( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2204,7 +2222,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_count_distinct_extractor", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_count_distinct_extractor", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2235,28 +2253,28 @@ pub mod bool { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_bool.sql", + path: "../../../fixtures/eql_v3_boolean.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_bool_storage_count_distinct_extractor; + let f: fn(_) -> _ = matrix_boolean_storage_count_distinct_extractor; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_aggregate_typecheck_min"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_aggregate_typecheck_min"] #[doc(hidden)] - pub const matrix_bool_storage_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_aggregate_typecheck_min", + "scalars::boolean::matrix_boolean_storage_aggregate_typecheck_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -2265,11 +2283,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_aggregate_typecheck_min()), + || test::assert_test_result(matrix_boolean_storage_aggregate_typecheck_min()), ), }; - fn matrix_bool_storage_aggregate_typecheck_min() -> anyhow::Result<()> { - async fn matrix_bool_storage_aggregate_typecheck_min( + fn matrix_boolean_storage_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_boolean_storage_aggregate_typecheck_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2379,7 +2397,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_aggregate_typecheck_min", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_aggregate_typecheck_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2408,23 +2426,23 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_aggregate_typecheck_min; + let f: fn(_) -> _ = matrix_boolean_storage_aggregate_typecheck_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_storage_aggregate_typecheck_max"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_storage_aggregate_typecheck_max"] #[doc(hidden)] - pub const matrix_bool_storage_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_storage_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::bool::matrix_bool_storage_aggregate_typecheck_max", + "scalars::boolean::matrix_boolean_storage_aggregate_typecheck_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -2433,11 +2451,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_storage_aggregate_typecheck_max()), + || test::assert_test_result(matrix_boolean_storage_aggregate_typecheck_max()), ), }; - fn matrix_bool_storage_aggregate_typecheck_max() -> anyhow::Result<()> { - async fn matrix_bool_storage_aggregate_typecheck_max( + fn matrix_boolean_storage_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_boolean_storage_aggregate_typecheck_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2547,7 +2565,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_storage_aggregate_typecheck_max", + "encrypted_domain::scalars::boolean::matrix_boolean_storage_aggregate_typecheck_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2576,15 +2594,15 @@ pub mod bool { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_bool_storage_aggregate_typecheck_max; + let f: fn(_) -> _ = matrix_boolean_storage_aggregate_typecheck_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::bool::matrix_bool_fixture_shape"] + #[rustc_test_marker = "scalars::boolean::matrix_boolean_fixture_shape"] #[doc(hidden)] - pub const matrix_bool_fixture_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_boolean_fixture_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::bool::matrix_bool_fixture_shape"), + name: test::StaticTestName("scalars::boolean::matrix_boolean_fixture_shape"), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -2599,11 +2617,11 @@ pub mod bool { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_bool_fixture_shape()), + || test::assert_test_result(matrix_boolean_fixture_shape()), ), }; - fn matrix_bool_fixture_shape() -> anyhow::Result<()> { - async fn matrix_bool_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_boolean_fixture_shape() -> anyhow::Result<()> { + async fn matrix_boolean_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { { use ::eql_tests::scalar_domains::ScalarType; let table = ::fixture_table_name(); @@ -2842,6 +2860,28 @@ pub mod bool { error }); } + let with_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(with_op == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "fixture payload carries an `op` term — the client now emits CLLW-OPE; pick up CIP-3348 (real-ciphertext ord_ope coverage)", + ), + ); + error + }); + } if !expected.is_empty() { let probe = &expected[expected.len() / 2]; let probe_lit = ::to_sql_literal(probe); @@ -2885,7 +2925,7 @@ pub mod bool { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::bool::matrix_bool_fixture_shape", + "encrypted_domain::scalars::boolean::matrix_boolean_fixture_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2916,12 +2956,12 @@ pub mod bool { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_bool.sql", + path: "../../../fixtures/eql_v3_boolean.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_bool_fixture_shape; + let f: fn(_) -> _ = matrix_boolean_fixture_shape; ::sqlx::testing::TestFn::run_test(f, args) } } diff --git a/tests/sqlx/snapshots/int4_expanded.rs b/tests/sqlx/snapshots/integer_expanded.rs similarity index 88% rename from tests/sqlx/snapshots/int4_expanded.rs rename to tests/sqlx/snapshots/integer_expanded.rs index 7e55cb4c9..12ef2679b 100644 --- a/tests/sqlx/snapshots/int4_expanded.rs +++ b/tests/sqlx/snapshots/integer_expanded.rs @@ -1,11 +1,13 @@ -///`eql_v3_int4` matrix suite — generated by `scalar_types!`. -pub mod int4 { +///`eql_v3_integer` matrix suite — generated by `scalar_types!`. +pub mod integer { extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_sanity"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_sanity"] #[doc(hidden)] - pub const matrix_int4_storage_sanity: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_sanity: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_storage_sanity"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_storage_sanity", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -20,11 +22,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_sanity()), + || test::assert_test_result(matrix_integer_storage_sanity()), ), }; - fn matrix_int4_storage_sanity() -> anyhow::Result<()> { - async fn matrix_int4_storage_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_storage_sanity() -> anyhow::Result<()> { + async fn matrix_integer_storage_sanity( + _pool: sqlx::PgPool, + ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -45,7 +49,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_sanity", + "encrypted_domain::scalars::integer::matrix_integer_storage_sanity", ); args.migrator( &::sqlx::migrate::Migrator { @@ -74,15 +78,15 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_sanity; + let f: fn(_) -> _ = matrix_integer_storage_sanity; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_sanity"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_sanity"] #[doc(hidden)] - pub const matrix_int4_eq_sanity: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_sanity: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_sanity"), + name: test::StaticTestName("scalars::integer::matrix_integer_eq_sanity"), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -97,11 +101,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_sanity()), + || test::assert_test_result(matrix_integer_eq_sanity()), ), }; - fn matrix_int4_eq_sanity() -> anyhow::Result<()> { - async fn matrix_int4_eq_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_eq_sanity() -> anyhow::Result<()> { + async fn matrix_integer_eq_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -122,7 +126,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_sanity", + "encrypted_domain::scalars::integer::matrix_integer_eq_sanity", ); args.migrator( &::sqlx::migrate::Migrator { @@ -151,15 +155,15 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_sanity; + let f: fn(_) -> _ = matrix_integer_eq_sanity; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_sanity"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_sanity"] #[doc(hidden)] - pub const matrix_int4_ord_sanity: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_sanity: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_ord_sanity"), + name: test::StaticTestName("scalars::integer::matrix_integer_ord_sanity"), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -174,11 +178,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_sanity()), + || test::assert_test_result(matrix_integer_ord_sanity()), ), }; - fn matrix_int4_ord_sanity() -> anyhow::Result<()> { - async fn matrix_int4_ord_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_ord_sanity() -> anyhow::Result<()> { + async fn matrix_integer_ord_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -199,7 +203,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_sanity", + "encrypted_domain::scalars::integer::matrix_integer_ord_sanity", ); args.migrator( &::sqlx::migrate::Migrator { @@ -228,15 +232,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_sanity; + let f: fn(_) -> _ = matrix_integer_ord_sanity; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_sanity"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_sanity"] #[doc(hidden)] - pub const matrix_int4_ord_ore_sanity: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_sanity: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_ord_ore_sanity"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_ord_ore_sanity", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -251,11 +257,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_sanity()), + || test::assert_test_result(matrix_integer_ord_ore_sanity()), ), }; - fn matrix_int4_ord_ore_sanity() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_sanity(_pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_ord_ore_sanity() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_sanity( + _pool: sqlx::PgPool, + ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -276,7 +284,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_sanity", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_sanity", ); args.migrator( &::sqlx::migrate::Migrator { @@ -305,16 +313,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_sanity; + let f: fn(_) -> _ = matrix_integer_ord_ore_sanity; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_eq_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_min_correctness", + "scalars::integer::matrix_integer_eq_eq_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -330,11 +338,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_eq_eq_pivot_min_correctness()), ), }; - fn matrix_int4_eq_eq_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_min_correctness( + fn matrix_integer_eq_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_eq_eq_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -369,7 +377,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_eq_eq_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -400,21 +408,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_eq_eq_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_eq_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_max_correctness", + "scalars::integer::matrix_integer_eq_eq_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -430,11 +438,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_eq_eq_pivot_max_correctness()), ), }; - fn matrix_int4_eq_eq_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_max_correctness( + fn matrix_integer_eq_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_eq_eq_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -469,7 +477,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_eq_eq_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -500,21 +508,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_eq_eq_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_eq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_mid_correctness", + "scalars::integer::matrix_integer_eq_eq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -530,11 +538,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_eq_eq_pivot_mid_correctness()), ), }; - fn matrix_int4_eq_eq_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_mid_correctness( + fn matrix_integer_eq_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_eq_eq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -569,7 +577,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_eq_eq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -600,21 +608,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_eq_eq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_neq_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_min_correctness", + "scalars::integer::matrix_integer_eq_neq_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -630,11 +638,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_eq_neq_pivot_min_correctness()), ), }; - fn matrix_int4_eq_neq_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_min_correctness( + fn matrix_integer_eq_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_eq_neq_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -669,7 +677,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_eq_neq_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -700,21 +708,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_eq_neq_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_neq_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_max_correctness", + "scalars::integer::matrix_integer_eq_neq_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -730,11 +738,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_eq_neq_pivot_max_correctness()), ), }; - fn matrix_int4_eq_neq_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_max_correctness( + fn matrix_integer_eq_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_eq_neq_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -769,7 +777,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_eq_neq_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -800,21 +808,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_eq_neq_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_neq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_mid_correctness", + "scalars::integer::matrix_integer_eq_neq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -830,11 +838,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_eq_neq_pivot_mid_correctness()), ), }; - fn matrix_int4_eq_neq_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_mid_correctness( + fn matrix_integer_eq_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_eq_neq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -869,7 +877,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_eq_neq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -900,21 +908,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_eq_neq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_eq_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_eq_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -930,11 +938,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_ord_eq_pivot_min_correctness()), ), }; - fn matrix_int4_ord_eq_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_min_correctness( + fn matrix_integer_ord_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_eq_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -969,7 +977,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_eq_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1000,21 +1008,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_eq_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_eq_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_eq_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1030,11 +1038,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_ord_eq_pivot_max_correctness()), ), }; - fn matrix_int4_ord_eq_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_max_correctness( + fn matrix_integer_ord_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_eq_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1069,7 +1077,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_eq_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1100,21 +1108,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_eq_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_eq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_eq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1130,11 +1138,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_ord_eq_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_eq_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_mid_correctness( + fn matrix_integer_ord_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_eq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1169,7 +1177,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_eq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1200,21 +1208,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_eq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_neq_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_neq_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1230,11 +1238,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_ord_neq_pivot_min_correctness()), ), }; - fn matrix_int4_ord_neq_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_min_correctness( + fn matrix_integer_ord_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_neq_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1269,7 +1277,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_neq_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1300,21 +1308,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_neq_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_neq_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_neq_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1330,11 +1338,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_ord_neq_pivot_max_correctness()), ), }; - fn matrix_int4_ord_neq_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_max_correctness( + fn matrix_integer_ord_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_neq_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1369,7 +1377,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_neq_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1400,21 +1408,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_neq_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_neq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_neq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1430,11 +1438,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_ord_neq_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_neq_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_mid_correctness( + fn matrix_integer_ord_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_neq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1469,7 +1477,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_neq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1500,21 +1508,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_neq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_eq_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_eq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_ore_eq_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1530,11 +1538,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_min_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_eq_pivot_min_correctness(), + ), ), }; - fn matrix_int4_ord_ore_eq_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_min_correctness( + fn matrix_integer_ord_ore_eq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_eq_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1569,7 +1579,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_eq_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1600,21 +1610,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_eq_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_eq_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_eq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_ore_eq_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1630,11 +1640,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_max_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_eq_pivot_max_correctness(), + ), ), }; - fn matrix_int4_ord_ore_eq_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_max_correctness( + fn matrix_integer_ord_ore_eq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_eq_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1669,7 +1681,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_eq_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1700,21 +1712,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_eq_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_eq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_eq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_ore_eq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1730,11 +1742,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_mid_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_eq_pivot_mid_correctness(), + ), ), }; - fn matrix_int4_ord_ore_eq_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_mid_correctness( + fn matrix_integer_ord_ore_eq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_eq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1769,7 +1783,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_eq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1800,21 +1814,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_eq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_neq_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_neq_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_ore_neq_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1830,11 +1844,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_min_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_neq_pivot_min_correctness(), + ), ), }; - fn matrix_int4_ord_ore_neq_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_min_correctness( + fn matrix_integer_ord_ore_neq_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_neq_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1869,7 +1885,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_neq_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -1900,21 +1916,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_neq_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_neq_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_neq_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_ore_neq_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -1930,11 +1946,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_max_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_neq_pivot_max_correctness(), + ), ), }; - fn matrix_int4_ord_ore_neq_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_max_correctness( + fn matrix_integer_ord_ore_neq_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_neq_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -1969,7 +1987,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_neq_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2000,21 +2018,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_neq_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_neq_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_neq_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_ore_neq_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2030,11 +2048,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_mid_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_neq_pivot_mid_correctness(), + ), ), }; - fn matrix_int4_ord_ore_neq_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_mid_correctness( + fn matrix_integer_ord_ore_neq_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_neq_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2069,7 +2089,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_neq_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2100,21 +2120,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_neq_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lt_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_lt_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2130,11 +2150,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_ord_lt_pivot_min_correctness()), ), }; - fn matrix_int4_ord_lt_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_min_correctness( + fn matrix_integer_ord_lt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_lt_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2169,7 +2189,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_lt_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2200,21 +2220,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_lt_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lt_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_lt_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2230,11 +2250,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_ord_lt_pivot_max_correctness()), ), }; - fn matrix_int4_ord_lt_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_max_correctness( + fn matrix_integer_ord_lt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_lt_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2269,7 +2289,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_lt_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2300,21 +2320,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_lt_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_lt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2330,11 +2350,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_ord_lt_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_lt_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_mid_correctness( + fn matrix_integer_ord_lt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_lt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2369,7 +2389,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_lt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2400,21 +2420,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_lt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lte_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_lte_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2430,11 +2450,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_ord_lte_pivot_min_correctness()), ), }; - fn matrix_int4_ord_lte_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_min_correctness( + fn matrix_integer_ord_lte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_lte_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2469,7 +2489,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_lte_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2500,21 +2520,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_lte_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lte_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_lte_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2530,11 +2550,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_ord_lte_pivot_max_correctness()), ), }; - fn matrix_int4_ord_lte_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_max_correctness( + fn matrix_integer_ord_lte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_lte_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2569,7 +2589,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_lte_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2600,21 +2620,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_lte_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_lte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2630,11 +2650,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_ord_lte_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_lte_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_mid_correctness( + fn matrix_integer_ord_lte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_lte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2669,7 +2689,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_lte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2700,21 +2720,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_lte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gt_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_gt_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2730,11 +2750,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_ord_gt_pivot_min_correctness()), ), }; - fn matrix_int4_ord_gt_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_min_correctness( + fn matrix_integer_ord_gt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_gt_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2769,7 +2789,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_gt_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2800,21 +2820,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_gt_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gt_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_gt_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2830,11 +2850,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_ord_gt_pivot_max_correctness()), ), }; - fn matrix_int4_ord_gt_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_max_correctness( + fn matrix_integer_ord_gt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_gt_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2869,7 +2889,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_gt_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -2900,21 +2920,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_gt_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_gt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -2930,11 +2950,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_ord_gt_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_gt_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_mid_correctness( + fn matrix_integer_ord_gt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_gt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -2969,7 +2989,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_gt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3000,21 +3020,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_gt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gte_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_gte_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3030,11 +3050,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_min_correctness()), + || test::assert_test_result(matrix_integer_ord_gte_pivot_min_correctness()), ), }; - fn matrix_int4_ord_gte_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_min_correctness( + fn matrix_integer_ord_gte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_gte_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3069,7 +3089,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_gte_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3100,21 +3120,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_gte_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gte_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_gte_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3130,11 +3150,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_max_correctness()), + || test::assert_test_result(matrix_integer_ord_gte_pivot_max_correctness()), ), }; - fn matrix_int4_ord_gte_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_max_correctness( + fn matrix_integer_ord_gte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_gte_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3169,7 +3189,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_gte_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3200,21 +3220,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_gte_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_gte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3230,11 +3250,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_mid_correctness()), + || test::assert_test_result(matrix_integer_ord_gte_pivot_mid_correctness()), ), }; - fn matrix_int4_ord_gte_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_mid_correctness( + fn matrix_integer_ord_gte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_gte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3269,7 +3289,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_gte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3300,21 +3320,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_gte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lt_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_ore_lt_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3330,11 +3350,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_min_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_lt_pivot_min_correctness(), + ), ), }; - fn matrix_int4_ord_ore_lt_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_min_correctness( + fn matrix_integer_ord_ore_lt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lt_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3369,7 +3391,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lt_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3400,21 +3422,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_lt_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lt_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_ore_lt_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3430,11 +3452,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_max_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_lt_pivot_max_correctness(), + ), ), }; - fn matrix_int4_ord_ore_lt_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_max_correctness( + fn matrix_integer_ord_ore_lt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lt_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3469,7 +3493,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lt_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3500,21 +3524,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_lt_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_ore_lt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3530,11 +3554,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_mid_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_lt_pivot_mid_correctness(), + ), ), }; - fn matrix_int4_ord_ore_lt_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_mid_correctness( + fn matrix_integer_ord_ore_lt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3569,7 +3595,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3600,21 +3626,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_lt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lte_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_ore_lte_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3630,11 +3656,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_min_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_lte_pivot_min_correctness(), + ), ), }; - fn matrix_int4_ord_ore_lte_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_min_correctness( + fn matrix_integer_ord_ore_lte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lte_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3669,7 +3697,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lte_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3700,21 +3728,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_lte_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lte_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_ore_lte_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3730,11 +3758,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_max_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_lte_pivot_max_correctness(), + ), ), }; - fn matrix_int4_ord_ore_lte_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_max_correctness( + fn matrix_integer_ord_ore_lte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lte_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3769,7 +3799,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lte_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3800,21 +3830,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_lte_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_ore_lte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3830,11 +3860,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_mid_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_lte_pivot_mid_correctness(), + ), ), }; - fn matrix_int4_ord_ore_lte_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_mid_correctness( + fn matrix_integer_ord_ore_lte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3869,7 +3901,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -3900,21 +3932,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_lte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gt_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gt_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_ore_gt_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -3930,11 +3962,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_min_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_gt_pivot_min_correctness(), + ), ), }; - fn matrix_int4_ord_ore_gt_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_min_correctness( + fn matrix_integer_ord_ore_gt_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gt_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -3969,7 +4003,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gt_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4000,21 +4034,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_gt_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gt_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gt_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_ore_gt_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4030,11 +4064,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_max_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_gt_pivot_max_correctness(), + ), ), }; - fn matrix_int4_ord_ore_gt_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_max_correctness( + fn matrix_integer_ord_ore_gt_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gt_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4069,7 +4105,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gt_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4100,21 +4136,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_gt_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gt_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gt_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_ore_gt_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4130,11 +4166,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_mid_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_gt_pivot_mid_correctness(), + ), ), }; - fn matrix_int4_ord_ore_gt_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_mid_correctness( + fn matrix_integer_ord_ore_gt_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gt_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4169,7 +4207,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gt_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4200,21 +4238,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_gt_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gte_pivot_min_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gte_pivot_min_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness", + "scalars::integer::matrix_integer_ord_ore_gte_pivot_min_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4230,11 +4268,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_min_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_gte_pivot_min_correctness(), + ), ), }; - fn matrix_int4_ord_ore_gte_pivot_min_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_min_correctness( + fn matrix_integer_ord_ore_gte_pivot_min_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gte_pivot_min_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4269,7 +4309,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_min_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gte_pivot_min_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4300,21 +4340,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_min_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_gte_pivot_min_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gte_pivot_max_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gte_pivot_max_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness", + "scalars::integer::matrix_integer_ord_ore_gte_pivot_max_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4330,11 +4370,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_max_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_gte_pivot_max_correctness(), + ), ), }; - fn matrix_int4_ord_ore_gte_pivot_max_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_max_correctness( + fn matrix_integer_ord_ore_gte_pivot_max_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gte_pivot_max_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4369,7 +4411,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_max_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gte_pivot_max_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4400,21 +4442,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_max_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_gte_pivot_max_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_correctness"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gte_pivot_mid_correctness"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gte_pivot_mid_correctness: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_correctness", + "scalars::integer::matrix_integer_ord_ore_gte_pivot_mid_correctness", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4430,11 +4472,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_mid_correctness()), + || test::assert_test_result( + matrix_integer_ord_ore_gte_pivot_mid_correctness(), + ), ), }; - fn matrix_int4_ord_ore_gte_pivot_mid_correctness() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_mid_correctness( + fn matrix_integer_ord_ore_gte_pivot_mid_correctness() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gte_pivot_mid_correctness( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4469,7 +4513,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_correctness", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gte_pivot_mid_correctness", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4500,21 +4544,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_mid_correctness; + let f: fn(_) -> _ = matrix_integer_ord_ore_gte_pivot_mid_correctness; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_eq_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape", + "scalars::integer::matrix_integer_eq_eq_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4530,11 +4574,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_eq_eq_pivot_min_cross_shape()), ), }; - fn matrix_int4_eq_eq_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_min_cross_shape( + fn matrix_integer_eq_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_eq_eq_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4637,7 +4681,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_eq_eq_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4668,21 +4712,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_eq_eq_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_eq_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape", + "scalars::integer::matrix_integer_eq_eq_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4698,11 +4742,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_eq_eq_pivot_max_cross_shape()), ), }; - fn matrix_int4_eq_eq_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_max_cross_shape( + fn matrix_integer_eq_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_eq_eq_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4805,7 +4849,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_eq_eq_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -4836,21 +4880,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_eq_eq_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_eq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_eq_eq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -4866,11 +4910,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_eq_eq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_eq_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_pivot_mid_cross_shape( + fn matrix_integer_eq_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_eq_eq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -4973,7 +5017,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_eq_eq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5004,21 +5048,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_eq_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_eq_eq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_neq_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape", + "scalars::integer::matrix_integer_eq_neq_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -5034,11 +5078,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_eq_neq_pivot_min_cross_shape()), ), }; - fn matrix_int4_eq_neq_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_min_cross_shape( + fn matrix_integer_eq_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_eq_neq_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -5141,7 +5185,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_eq_neq_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5172,21 +5216,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_eq_neq_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_neq_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape", + "scalars::integer::matrix_integer_eq_neq_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -5202,11 +5246,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_eq_neq_pivot_max_cross_shape()), ), }; - fn matrix_int4_eq_neq_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_max_cross_shape( + fn matrix_integer_eq_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_eq_neq_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -5309,7 +5353,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_eq_neq_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5340,21 +5384,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_eq_neq_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_neq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_eq_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_eq_neq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -5370,11 +5414,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_eq_neq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_eq_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_pivot_mid_cross_shape( + fn matrix_integer_eq_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_eq_neq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -5477,7 +5521,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_eq_neq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5508,21 +5552,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_neq_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_eq_neq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_eq_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_eq_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -5538,11 +5582,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_ord_eq_pivot_min_cross_shape()), ), }; - fn matrix_int4_ord_eq_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_min_cross_shape( + fn matrix_integer_ord_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_eq_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -5645,7 +5689,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_eq_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5676,21 +5720,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_eq_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_eq_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_eq_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -5706,11 +5750,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_ord_eq_pivot_max_cross_shape()), ), }; - fn matrix_int4_ord_eq_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_max_cross_shape( + fn matrix_integer_ord_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_eq_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -5813,7 +5857,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_eq_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -5844,21 +5888,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_eq_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_eq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_eq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -5874,11 +5918,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_ord_eq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_pivot_mid_cross_shape( + fn matrix_integer_ord_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_eq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -5981,7 +6025,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_eq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6012,21 +6056,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_eq_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_eq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_neq_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_neq_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -6042,11 +6086,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_ord_neq_pivot_min_cross_shape()), ), }; - fn matrix_int4_ord_neq_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_min_cross_shape( + fn matrix_integer_ord_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_neq_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -6149,7 +6193,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_neq_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6180,21 +6224,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_neq_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_neq_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_neq_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -6210,11 +6254,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_ord_neq_pivot_max_cross_shape()), ), }; - fn matrix_int4_ord_neq_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_max_cross_shape( + fn matrix_integer_ord_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_neq_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -6317,7 +6361,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_neq_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6348,21 +6392,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_neq_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_neq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_neq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -6378,11 +6422,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_ord_neq_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_pivot_mid_cross_shape( + fn matrix_integer_ord_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_neq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -6485,7 +6529,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_neq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6516,21 +6560,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_neq_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_neq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_eq_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_eq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_ore_eq_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -6546,11 +6590,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_min_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_eq_pivot_min_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_eq_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_min_cross_shape( + fn matrix_integer_ord_ore_eq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_eq_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -6653,7 +6699,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_eq_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6684,21 +6730,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_eq_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_eq_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_eq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_ore_eq_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -6714,11 +6760,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_max_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_eq_pivot_max_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_eq_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_max_cross_shape( + fn matrix_integer_ord_ore_eq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_eq_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -6821,7 +6869,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_eq_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -6852,21 +6900,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_eq_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_eq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_eq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_ore_eq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -6882,11 +6930,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_pivot_mid_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_eq_pivot_mid_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_pivot_mid_cross_shape( + fn matrix_integer_ord_ore_eq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_eq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -6989,7 +7039,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_eq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7020,21 +7070,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_eq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_neq_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_neq_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_ore_neq_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -7050,11 +7100,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_min_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_neq_pivot_min_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_neq_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_min_cross_shape( + fn matrix_integer_ord_ore_neq_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_neq_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -7157,7 +7209,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_neq_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7188,21 +7240,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_neq_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_neq_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_neq_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_ore_neq_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -7218,11 +7270,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_max_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_neq_pivot_max_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_neq_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_max_cross_shape( + fn matrix_integer_ord_ore_neq_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_neq_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -7325,7 +7379,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_neq_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7356,21 +7410,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_neq_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_neq_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_neq_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_ore_neq_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -7386,11 +7440,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_pivot_mid_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_neq_pivot_mid_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_pivot_mid_cross_shape( + fn matrix_integer_ord_ore_neq_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_neq_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -7493,7 +7549,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_neq_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7524,21 +7580,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_neq_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lt_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_lt_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -7554,11 +7610,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_ord_lt_pivot_min_cross_shape()), ), }; - fn matrix_int4_ord_lt_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_min_cross_shape( + fn matrix_integer_ord_lt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_lt_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -7661,7 +7717,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_lt_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7692,21 +7748,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_lt_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lt_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_lt_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -7722,11 +7778,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_ord_lt_pivot_max_cross_shape()), ), }; - fn matrix_int4_ord_lt_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_max_cross_shape( + fn matrix_integer_ord_lt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_lt_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -7829,7 +7885,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_lt_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -7860,21 +7916,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_lt_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_lt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -7890,11 +7946,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_ord_lt_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_pivot_mid_cross_shape( + fn matrix_integer_ord_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_lt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -7997,7 +8053,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_lt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8028,21 +8084,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lt_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_lt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lte_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_lte_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -8058,11 +8114,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_ord_lte_pivot_min_cross_shape()), ), }; - fn matrix_int4_ord_lte_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_min_cross_shape( + fn matrix_integer_ord_lte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_lte_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -8165,7 +8221,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_lte_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8196,21 +8252,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_lte_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lte_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_lte_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -8226,11 +8282,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_ord_lte_pivot_max_cross_shape()), ), }; - fn matrix_int4_ord_lte_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_max_cross_shape( + fn matrix_integer_ord_lte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_lte_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -8333,7 +8389,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_lte_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8364,21 +8420,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_lte_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_lte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -8394,11 +8450,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_ord_lte_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_pivot_mid_cross_shape( + fn matrix_integer_ord_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_lte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -8501,7 +8557,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_lte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8532,21 +8588,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_lte_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_lte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gt_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_gt_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -8562,11 +8618,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_ord_gt_pivot_min_cross_shape()), ), }; - fn matrix_int4_ord_gt_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_min_cross_shape( + fn matrix_integer_ord_gt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_gt_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -8669,7 +8725,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_gt_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8700,21 +8756,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_gt_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gt_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_gt_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -8730,11 +8786,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_ord_gt_pivot_max_cross_shape()), ), }; - fn matrix_int4_ord_gt_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_max_cross_shape( + fn matrix_integer_ord_gt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_gt_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -8837,7 +8893,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_gt_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -8868,21 +8924,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_gt_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_gt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -8898,11 +8954,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_ord_gt_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_pivot_mid_cross_shape( + fn matrix_integer_ord_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_gt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -9005,7 +9061,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_gt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9036,21 +9092,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gt_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_gt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gte_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_gte_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -9066,11 +9122,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_min_cross_shape()), + || test::assert_test_result(matrix_integer_ord_gte_pivot_min_cross_shape()), ), }; - fn matrix_int4_ord_gte_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_min_cross_shape( + fn matrix_integer_ord_gte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_gte_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -9173,7 +9229,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_gte_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9204,21 +9260,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_gte_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gte_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_gte_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -9234,11 +9290,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_max_cross_shape()), + || test::assert_test_result(matrix_integer_ord_gte_pivot_max_cross_shape()), ), }; - fn matrix_int4_ord_gte_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_max_cross_shape( + fn matrix_integer_ord_gte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_gte_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -9341,7 +9397,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_gte_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9372,21 +9428,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_gte_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_gte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -9402,11 +9458,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_pivot_mid_cross_shape()), + || test::assert_test_result(matrix_integer_ord_gte_pivot_mid_cross_shape()), ), }; - fn matrix_int4_ord_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_pivot_mid_cross_shape( + fn matrix_integer_ord_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_gte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -9509,7 +9565,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_gte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9540,21 +9596,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_gte_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_gte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lt_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_ore_lt_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -9570,11 +9626,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_min_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_lt_pivot_min_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_lt_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_min_cross_shape( + fn matrix_integer_ord_ore_lt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lt_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -9677,7 +9735,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lt_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9708,21 +9766,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_lt_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lt_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_ore_lt_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -9738,11 +9796,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_max_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_lt_pivot_max_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_lt_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_max_cross_shape( + fn matrix_integer_ord_ore_lt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lt_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -9845,7 +9905,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lt_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -9876,21 +9936,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_lt_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_ore_lt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -9906,11 +9966,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_pivot_mid_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_lt_pivot_mid_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_pivot_mid_cross_shape( + fn matrix_integer_ord_ore_lt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -10013,7 +10075,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10044,21 +10106,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_lt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lte_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_ore_lte_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -10074,11 +10136,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_min_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_lte_pivot_min_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_lte_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_min_cross_shape( + fn matrix_integer_ord_ore_lte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lte_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -10181,7 +10245,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lte_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10212,21 +10276,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_lte_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lte_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_ore_lte_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -10242,11 +10306,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_max_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_lte_pivot_max_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_lte_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_max_cross_shape( + fn matrix_integer_ord_ore_lte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lte_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -10349,7 +10415,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lte_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10380,21 +10446,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_lte_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_ore_lte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -10410,11 +10476,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_pivot_mid_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_lte_pivot_mid_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_pivot_mid_cross_shape( + fn matrix_integer_ord_ore_lte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -10517,7 +10585,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10548,21 +10616,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_lte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gt_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gt_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_ore_gt_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -10578,11 +10646,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_min_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_gt_pivot_min_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_gt_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_min_cross_shape( + fn matrix_integer_ord_ore_gt_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gt_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -10685,7 +10755,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gt_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10716,21 +10786,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_gt_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gt_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gt_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_ore_gt_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -10746,11 +10816,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_max_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_gt_pivot_max_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_gt_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_max_cross_shape( + fn matrix_integer_ord_ore_gt_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gt_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -10853,7 +10925,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gt_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -10884,21 +10956,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_gt_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gt_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gt_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_ore_gt_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -10914,11 +10986,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_pivot_mid_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_gt_pivot_mid_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_pivot_mid_cross_shape( + fn matrix_integer_ord_ore_gt_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gt_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11021,7 +11095,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gt_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11052,21 +11126,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_gt_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gte_pivot_min_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gte_pivot_min_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape", + "scalars::integer::matrix_integer_ord_ore_gte_pivot_min_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11082,11 +11156,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_min_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_gte_pivot_min_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_gte_pivot_min_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_min_cross_shape( + fn matrix_integer_ord_ore_gte_pivot_min_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gte_pivot_min_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11189,7 +11265,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_min_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gte_pivot_min_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11220,21 +11296,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_min_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_gte_pivot_min_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gte_pivot_max_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gte_pivot_max_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape", + "scalars::integer::matrix_integer_ord_ore_gte_pivot_max_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11250,11 +11326,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_max_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_gte_pivot_max_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_gte_pivot_max_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_max_cross_shape( + fn matrix_integer_ord_ore_gte_pivot_max_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gte_pivot_max_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11357,7 +11435,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_max_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gte_pivot_max_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11388,21 +11466,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_max_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_gte_pivot_max_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_cross_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gte_pivot_mid_cross_shape"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gte_pivot_mid_cross_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_cross_shape", + "scalars::integer::matrix_integer_ord_ore_gte_pivot_mid_cross_shape", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11418,11 +11496,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_pivot_mid_cross_shape()), + || test::assert_test_result( + matrix_integer_ord_ore_gte_pivot_mid_cross_shape(), + ), ), }; - fn matrix_int4_ord_ore_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_pivot_mid_cross_shape( + fn matrix_integer_ord_ore_gte_pivot_mid_cross_shape() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gte_pivot_mid_cross_shape( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11525,7 +11605,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_pivot_mid_cross_shape", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gte_pivot_mid_cross_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11556,21 +11636,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_pivot_mid_cross_shape; + let f: fn(_) -> _ = matrix_integer_ord_ore_gte_pivot_mid_cross_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_eq_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_eq_supported_null"] #[doc(hidden)] - pub const matrix_int4_eq_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_eq_supported_null", + "scalars::integer::matrix_integer_eq_eq_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11586,11 +11666,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_eq_supported_null()), + || test::assert_test_result(matrix_integer_eq_eq_supported_null()), ), }; - fn matrix_int4_eq_eq_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_eq_eq_supported_null( + fn matrix_integer_eq_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_eq_eq_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11625,7 +11705,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_eq_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_eq_eq_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11654,16 +11734,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_eq_supported_null; + let f: fn(_) -> _ = matrix_integer_eq_eq_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_neq_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_neq_supported_null"] #[doc(hidden)] - pub const matrix_int4_eq_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_neq_supported_null", + "scalars::integer::matrix_integer_eq_neq_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11679,11 +11759,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_neq_supported_null()), + || test::assert_test_result(matrix_integer_eq_neq_supported_null()), ), }; - fn matrix_int4_eq_neq_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_eq_neq_supported_null( + fn matrix_integer_eq_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_eq_neq_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11718,7 +11798,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_neq_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_eq_neq_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11747,16 +11827,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_neq_supported_null; + let f: fn(_) -> _ = matrix_integer_eq_neq_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_eq_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_eq_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_eq_supported_null", + "scalars::integer::matrix_integer_ord_eq_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11772,11 +11852,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_eq_supported_null()), + || test::assert_test_result(matrix_integer_ord_eq_supported_null()), ), }; - fn matrix_int4_ord_eq_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_eq_supported_null( + fn matrix_integer_ord_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_eq_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11811,7 +11891,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_eq_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_eq_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11840,16 +11920,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_eq_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_eq_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_neq_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_neq_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_neq_supported_null", + "scalars::integer::matrix_integer_ord_neq_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11865,11 +11945,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_neq_supported_null()), + || test::assert_test_result(matrix_integer_ord_neq_supported_null()), ), }; - fn matrix_int4_ord_neq_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_neq_supported_null( + fn matrix_integer_ord_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_neq_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11904,7 +11984,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_neq_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_neq_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -11933,16 +12013,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_neq_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_neq_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_eq_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_eq_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_eq_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_eq_supported_null", + "scalars::integer::matrix_integer_ord_ore_eq_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -11958,11 +12038,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_eq_supported_null()), + || test::assert_test_result(matrix_integer_ord_ore_eq_supported_null()), ), }; - fn matrix_int4_ord_ore_eq_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_eq_supported_null( + fn matrix_integer_ord_ore_eq_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_eq_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -11997,7 +12077,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_eq_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_eq_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12026,16 +12106,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_eq_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_eq_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_neq_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_neq_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_neq_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_neq_supported_null", + "scalars::integer::matrix_integer_ord_ore_neq_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12051,11 +12131,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_neq_supported_null()), + || test::assert_test_result(matrix_integer_ord_ore_neq_supported_null()), ), }; - fn matrix_int4_ord_ore_neq_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_neq_supported_null( + fn matrix_integer_ord_ore_neq_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_neq_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12090,7 +12170,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_neq_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_neq_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12119,16 +12199,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_neq_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_neq_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lt_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lt_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lt_supported_null", + "scalars::integer::matrix_integer_ord_lt_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12144,11 +12224,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lt_supported_null()), + || test::assert_test_result(matrix_integer_ord_lt_supported_null()), ), }; - fn matrix_int4_ord_lt_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_lt_supported_null( + fn matrix_integer_ord_lt_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_lt_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12183,7 +12263,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lt_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_lt_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12212,16 +12292,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_lt_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_lt_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_lte_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_lte_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_lte_supported_null", + "scalars::integer::matrix_integer_ord_lte_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12237,11 +12317,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_lte_supported_null()), + || test::assert_test_result(matrix_integer_ord_lte_supported_null()), ), }; - fn matrix_int4_ord_lte_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_lte_supported_null( + fn matrix_integer_ord_lte_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_lte_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12276,7 +12356,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_lte_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_lte_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12305,16 +12385,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_lte_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_lte_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gt_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gt_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gt_supported_null", + "scalars::integer::matrix_integer_ord_gt_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12330,11 +12410,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gt_supported_null()), + || test::assert_test_result(matrix_integer_ord_gt_supported_null()), ), }; - fn matrix_int4_ord_gt_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_gt_supported_null( + fn matrix_integer_ord_gt_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_gt_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12369,7 +12449,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gt_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_gt_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12398,16 +12478,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_gt_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_gt_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_gte_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_gte_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_gte_supported_null", + "scalars::integer::matrix_integer_ord_gte_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12423,11 +12503,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_gte_supported_null()), + || test::assert_test_result(matrix_integer_ord_gte_supported_null()), ), }; - fn matrix_int4_ord_gte_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_gte_supported_null( + fn matrix_integer_ord_gte_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_gte_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12462,7 +12542,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_gte_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_gte_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12491,16 +12571,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_gte_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_gte_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lt_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lt_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lt_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lt_supported_null", + "scalars::integer::matrix_integer_ord_ore_lt_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12516,11 +12596,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lt_supported_null()), + || test::assert_test_result(matrix_integer_ord_ore_lt_supported_null()), ), }; - fn matrix_int4_ord_ore_lt_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lt_supported_null( + fn matrix_integer_ord_ore_lt_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lt_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12555,7 +12635,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lt_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lt_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12584,16 +12664,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_lt_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_lt_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_lte_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_lte_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_lte_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_lte_supported_null", + "scalars::integer::matrix_integer_ord_ore_lte_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12609,11 +12689,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_lte_supported_null()), + || test::assert_test_result(matrix_integer_ord_ore_lte_supported_null()), ), }; - fn matrix_int4_ord_ore_lte_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_lte_supported_null( + fn matrix_integer_ord_ore_lte_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_lte_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12648,7 +12728,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_lte_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_lte_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12677,16 +12757,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_lte_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_lte_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gt_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gt_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gt_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gt_supported_null", + "scalars::integer::matrix_integer_ord_ore_gt_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12702,11 +12782,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gt_supported_null()), + || test::assert_test_result(matrix_integer_ord_ore_gt_supported_null()), ), }; - fn matrix_int4_ord_ore_gt_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gt_supported_null( + fn matrix_integer_ord_ore_gt_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gt_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12741,7 +12821,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gt_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gt_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12770,16 +12850,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_gt_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_gt_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_gte_supported_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_gte_supported_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_gte_supported_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_gte_supported_null", + "scalars::integer::matrix_integer_ord_ore_gte_supported_null", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -12795,11 +12875,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_gte_supported_null()), + || test::assert_test_result(matrix_integer_ord_ore_gte_supported_null()), ), }; - fn matrix_int4_ord_ore_gte_supported_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_gte_supported_null( + fn matrix_integer_ord_ore_gte_supported_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_gte_supported_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12834,7 +12914,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_gte_supported_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_gte_supported_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12863,15 +12943,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_gte_supported_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_gte_supported_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_eq_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_eq_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_eq_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_eq_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_storage_eq_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_storage_eq_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -12886,11 +12968,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_eq_blocker()), + || test::assert_test_result(matrix_integer_storage_eq_blocker()), ), }; - fn matrix_int4_storage_eq_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_eq_blocker( + fn matrix_integer_storage_eq_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_eq_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -12969,7 +13051,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_eq_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_eq_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -12998,15 +13080,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_eq_blocker; + let f: fn(_) -> _ = matrix_integer_storage_eq_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_neq_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_neq_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_neq_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_neq_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_storage_neq_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_storage_neq_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -13021,11 +13105,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_neq_blocker()), + || test::assert_test_result(matrix_integer_storage_neq_blocker()), ), }; - fn matrix_int4_storage_neq_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_neq_blocker( + fn matrix_integer_storage_neq_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_neq_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -13104,7 +13188,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_neq_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_neq_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -13133,15 +13217,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_neq_blocker; + let f: fn(_) -> _ = matrix_integer_storage_neq_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_lt_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_lt_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_storage_lt_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_storage_lt_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -13156,11 +13242,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_lt_blocker()), + || test::assert_test_result(matrix_integer_storage_lt_blocker()), ), }; - fn matrix_int4_storage_lt_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_lt_blocker( + fn matrix_integer_storage_lt_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_lt_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -13239,7 +13325,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_lt_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_lt_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -13268,15 +13354,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_lt_blocker; + let f: fn(_) -> _ = matrix_integer_storage_lt_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_lte_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_lte_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_storage_lte_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_storage_lte_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -13291,11 +13379,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_lte_blocker()), + || test::assert_test_result(matrix_integer_storage_lte_blocker()), ), }; - fn matrix_int4_storage_lte_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_lte_blocker( + fn matrix_integer_storage_lte_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_lte_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -13374,7 +13462,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_lte_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_lte_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -13403,15 +13491,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_lte_blocker; + let f: fn(_) -> _ = matrix_integer_storage_lte_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_gt_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_gt_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_storage_gt_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_storage_gt_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -13426,11 +13516,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_gt_blocker()), + || test::assert_test_result(matrix_integer_storage_gt_blocker()), ), }; - fn matrix_int4_storage_gt_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_gt_blocker( + fn matrix_integer_storage_gt_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_gt_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -13509,7 +13599,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_gt_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_gt_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -13538,15 +13628,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_gt_blocker; + let f: fn(_) -> _ = matrix_integer_storage_gt_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_gte_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_gte_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_storage_gte_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_storage_gte_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -13561,11 +13653,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_gte_blocker()), + || test::assert_test_result(matrix_integer_storage_gte_blocker()), ), }; - fn matrix_int4_storage_gte_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_gte_blocker( + fn matrix_integer_storage_gte_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_gte_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -13644,7 +13736,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_gte_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_gte_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -13673,16 +13765,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_gte_blocker; + let f: fn(_) -> _ = matrix_integer_storage_gte_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_contains_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_contains_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_contains_blocker", + "scalars::integer::matrix_integer_storage_contains_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -13698,11 +13790,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_contains_blocker()), + || test::assert_test_result(matrix_integer_storage_contains_blocker()), ), }; - fn matrix_int4_storage_contains_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_contains_blocker( + fn matrix_integer_storage_contains_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_contains_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -13781,7 +13873,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_contains_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_contains_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -13810,16 +13902,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_contains_blocker; + let f: fn(_) -> _ = matrix_integer_storage_contains_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_contained_by_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_contained_by_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_contained_by_blocker", + "scalars::integer::matrix_integer_storage_contained_by_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -13835,11 +13927,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_contained_by_blocker()), + || test::assert_test_result(matrix_integer_storage_contained_by_blocker()), ), }; - fn matrix_int4_storage_contained_by_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_contained_by_blocker( + fn matrix_integer_storage_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_contained_by_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -13918,7 +14010,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_contained_by_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_contained_by_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -13947,15 +14039,15 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_contained_by_blocker; + let f: fn(_) -> _ = matrix_integer_storage_contained_by_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_lt_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_lt_blocker"] #[doc(hidden)] - pub const matrix_int4_eq_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_lt_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_lt_blocker"), + name: test::StaticTestName("scalars::integer::matrix_integer_eq_lt_blocker"), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -13970,11 +14062,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_lt_blocker()), + || test::assert_test_result(matrix_integer_eq_lt_blocker()), ), }; - fn matrix_int4_eq_lt_blocker() -> anyhow::Result<()> { - async fn matrix_int4_eq_lt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_eq_lt_blocker() -> anyhow::Result<()> { + async fn matrix_integer_eq_lt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -14051,7 +14143,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_lt_blocker", + "encrypted_domain::scalars::integer::matrix_integer_eq_lt_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -14080,15 +14172,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_lt_blocker; + let f: fn(_) -> _ = matrix_integer_eq_lt_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_lte_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_lte_blocker"] #[doc(hidden)] - pub const matrix_int4_eq_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_lte_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_lte_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_eq_lte_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -14103,11 +14197,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_lte_blocker()), + || test::assert_test_result(matrix_integer_eq_lte_blocker()), ), }; - fn matrix_int4_eq_lte_blocker() -> anyhow::Result<()> { - async fn matrix_int4_eq_lte_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_eq_lte_blocker() -> anyhow::Result<()> { + async fn matrix_integer_eq_lte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -14184,7 +14280,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_lte_blocker", + "encrypted_domain::scalars::integer::matrix_integer_eq_lte_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -14213,15 +14309,15 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_lte_blocker; + let f: fn(_) -> _ = matrix_integer_eq_lte_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_gt_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_gt_blocker"] #[doc(hidden)] - pub const matrix_int4_eq_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_gt_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_gt_blocker"), + name: test::StaticTestName("scalars::integer::matrix_integer_eq_gt_blocker"), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -14236,11 +14332,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_gt_blocker()), + || test::assert_test_result(matrix_integer_eq_gt_blocker()), ), }; - fn matrix_int4_eq_gt_blocker() -> anyhow::Result<()> { - async fn matrix_int4_eq_gt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_eq_gt_blocker() -> anyhow::Result<()> { + async fn matrix_integer_eq_gt_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -14317,7 +14413,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_gt_blocker", + "encrypted_domain::scalars::integer::matrix_integer_eq_gt_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -14346,15 +14442,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_gt_blocker; + let f: fn(_) -> _ = matrix_integer_eq_gt_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_gte_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_gte_blocker"] #[doc(hidden)] - pub const matrix_int4_eq_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_gte_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_gte_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_eq_gte_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -14369,11 +14467,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_gte_blocker()), + || test::assert_test_result(matrix_integer_eq_gte_blocker()), ), }; - fn matrix_int4_eq_gte_blocker() -> anyhow::Result<()> { - async fn matrix_int4_eq_gte_blocker(pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_eq_gte_blocker() -> anyhow::Result<()> { + async fn matrix_integer_eq_gte_blocker( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -14450,7 +14550,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_gte_blocker", + "encrypted_domain::scalars::integer::matrix_integer_eq_gte_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -14479,15 +14579,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_gte_blocker; + let f: fn(_) -> _ = matrix_integer_eq_gte_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_contains_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_contains_blocker"] #[doc(hidden)] - pub const matrix_int4_eq_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_contains_blocker"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_eq_contains_blocker", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -14502,11 +14604,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_contains_blocker()), + || test::assert_test_result(matrix_integer_eq_contains_blocker()), ), }; - fn matrix_int4_eq_contains_blocker() -> anyhow::Result<()> { - async fn matrix_int4_eq_contains_blocker( + fn matrix_integer_eq_contains_blocker() -> anyhow::Result<()> { + async fn matrix_integer_eq_contains_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -14585,7 +14687,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_contains_blocker", + "encrypted_domain::scalars::integer::matrix_integer_eq_contains_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -14614,16 +14716,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_contains_blocker; + let f: fn(_) -> _ = matrix_integer_eq_contains_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_contained_by_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_contained_by_blocker"] #[doc(hidden)] - pub const matrix_int4_eq_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_contained_by_blocker", + "scalars::integer::matrix_integer_eq_contained_by_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -14639,11 +14741,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_contained_by_blocker()), + || test::assert_test_result(matrix_integer_eq_contained_by_blocker()), ), }; - fn matrix_int4_eq_contained_by_blocker() -> anyhow::Result<()> { - async fn matrix_int4_eq_contained_by_blocker( + fn matrix_integer_eq_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_integer_eq_contained_by_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -14722,7 +14824,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_contained_by_blocker", + "encrypted_domain::scalars::integer::matrix_integer_eq_contained_by_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -14751,16 +14853,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_contained_by_blocker; + let f: fn(_) -> _ = matrix_integer_eq_contained_by_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_contains_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_contains_blocker"] #[doc(hidden)] - pub const matrix_int4_ord_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_contains_blocker", + "scalars::integer::matrix_integer_ord_contains_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -14776,11 +14878,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_contains_blocker()), + || test::assert_test_result(matrix_integer_ord_contains_blocker()), ), }; - fn matrix_int4_ord_contains_blocker() -> anyhow::Result<()> { - async fn matrix_int4_ord_contains_blocker( + fn matrix_integer_ord_contains_blocker() -> anyhow::Result<()> { + async fn matrix_integer_ord_contains_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -14859,7 +14961,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_contains_blocker", + "encrypted_domain::scalars::integer::matrix_integer_ord_contains_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -14888,16 +14990,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_contains_blocker; + let f: fn(_) -> _ = matrix_integer_ord_contains_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_contained_by_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_contained_by_blocker"] #[doc(hidden)] - pub const matrix_int4_ord_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_contained_by_blocker", + "scalars::integer::matrix_integer_ord_contained_by_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -14913,11 +15015,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_contained_by_blocker()), + || test::assert_test_result(matrix_integer_ord_contained_by_blocker()), ), }; - fn matrix_int4_ord_contained_by_blocker() -> anyhow::Result<()> { - async fn matrix_int4_ord_contained_by_blocker( + fn matrix_integer_ord_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_integer_ord_contained_by_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -14996,7 +15098,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_contained_by_blocker", + "encrypted_domain::scalars::integer::matrix_integer_ord_contained_by_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15025,16 +15127,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_contained_by_blocker; + let f: fn(_) -> _ = matrix_integer_ord_contained_by_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_contains_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_contains_blocker"] #[doc(hidden)] - pub const matrix_int4_ord_ore_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_contains_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_contains_blocker", + "scalars::integer::matrix_integer_ord_ore_contains_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -15050,11 +15152,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_contains_blocker()), + || test::assert_test_result(matrix_integer_ord_ore_contains_blocker()), ), }; - fn matrix_int4_ord_ore_contains_blocker() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_contains_blocker( + fn matrix_integer_ord_ore_contains_blocker() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_contains_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -15133,7 +15235,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_contains_blocker", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_contains_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15162,16 +15264,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_contains_blocker; + let f: fn(_) -> _ = matrix_integer_ord_ore_contains_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_contained_by_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_contained_by_blocker"] #[doc(hidden)] - pub const matrix_int4_ord_ore_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_contained_by_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_contained_by_blocker", + "scalars::integer::matrix_integer_ord_ore_contained_by_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -15187,11 +15289,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_contained_by_blocker()), + || test::assert_test_result(matrix_integer_ord_ore_contained_by_blocker()), ), }; - fn matrix_int4_ord_ore_contained_by_blocker() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_contained_by_blocker( + fn matrix_integer_ord_ore_contained_by_blocker() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_contained_by_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -15270,7 +15372,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_contained_by_blocker", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_contained_by_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15299,16 +15401,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_contained_by_blocker; + let f: fn(_) -> _ = matrix_integer_ord_ore_contained_by_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_payload_check"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_payload_check"] #[doc(hidden)] - pub const matrix_int4_storage_payload_check: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_payload_check: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_payload_check", + "scalars::integer::matrix_integer_storage_payload_check", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -15324,11 +15426,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_payload_check()), + || test::assert_test_result(matrix_integer_storage_payload_check()), ), }; - fn matrix_int4_storage_payload_check() -> anyhow::Result<()> { - async fn matrix_int4_storage_payload_check( + fn matrix_integer_storage_payload_check() -> anyhow::Result<()> { + async fn matrix_integer_storage_payload_check( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -15412,7 +15514,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_payload_check", + "encrypted_domain::scalars::integer::matrix_integer_storage_payload_check", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15441,15 +15543,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_payload_check; + let f: fn(_) -> _ = matrix_integer_storage_payload_check; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_payload_check"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_payload_check"] #[doc(hidden)] - pub const matrix_int4_eq_payload_check: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_payload_check: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_payload_check"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_eq_payload_check", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -15464,11 +15568,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_payload_check()), + || test::assert_test_result(matrix_integer_eq_payload_check()), ), }; - fn matrix_int4_eq_payload_check() -> anyhow::Result<()> { - async fn matrix_int4_eq_payload_check(pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_eq_payload_check() -> anyhow::Result<()> { + async fn matrix_integer_eq_payload_check( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { { let spec = ::eql_tests::scalar_domains::ScalarDomainSpec::new::< i32, @@ -15550,7 +15656,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_payload_check", + "encrypted_domain::scalars::integer::matrix_integer_eq_payload_check", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15579,15 +15685,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_payload_check; + let f: fn(_) -> _ = matrix_integer_eq_payload_check; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_payload_check"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_payload_check"] #[doc(hidden)] - pub const matrix_int4_ord_payload_check: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_payload_check: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_ord_payload_check"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_ord_payload_check", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -15602,11 +15710,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_payload_check()), + || test::assert_test_result(matrix_integer_ord_payload_check()), ), }; - fn matrix_int4_ord_payload_check() -> anyhow::Result<()> { - async fn matrix_int4_ord_payload_check( + fn matrix_integer_ord_payload_check() -> anyhow::Result<()> { + async fn matrix_integer_ord_payload_check( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -15690,7 +15798,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_payload_check", + "encrypted_domain::scalars::integer::matrix_integer_ord_payload_check", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15719,16 +15827,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_payload_check; + let f: fn(_) -> _ = matrix_integer_ord_payload_check; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_payload_check"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_payload_check"] #[doc(hidden)] - pub const matrix_int4_ord_ore_payload_check: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_payload_check: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_payload_check", + "scalars::integer::matrix_integer_ord_ore_payload_check", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -15744,11 +15852,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_payload_check()), + || test::assert_test_result(matrix_integer_ord_ore_payload_check()), ), }; - fn matrix_int4_ord_ore_payload_check() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_payload_check( + fn matrix_integer_ord_ore_payload_check() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_payload_check( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -15832,7 +15940,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_payload_check", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_payload_check", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15861,16 +15969,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_payload_check; + let f: fn(_) -> _ = matrix_integer_ord_ore_payload_check; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_path_op_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_path_op_blockers"] #[doc(hidden)] - pub const matrix_int4_storage_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_path_op_blockers", + "scalars::integer::matrix_integer_storage_path_op_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -15886,11 +15994,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_path_op_blockers()), + || test::assert_test_result(matrix_integer_storage_path_op_blockers()), ), }; - fn matrix_int4_storage_path_op_blockers() -> anyhow::Result<()> { - async fn matrix_int4_storage_path_op_blockers( + fn matrix_integer_storage_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_integer_storage_path_op_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -15935,7 +16043,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_path_op_blockers", + "encrypted_domain::scalars::integer::matrix_integer_storage_path_op_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -15964,15 +16072,17 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_path_op_blockers; + let f: fn(_) -> _ = matrix_integer_storage_path_op_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_path_op_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_path_op_blockers"] #[doc(hidden)] - pub const matrix_int4_eq_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_path_op_blockers"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_eq_path_op_blockers", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -15987,11 +16097,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_path_op_blockers()), + || test::assert_test_result(matrix_integer_eq_path_op_blockers()), ), }; - fn matrix_int4_eq_path_op_blockers() -> anyhow::Result<()> { - async fn matrix_int4_eq_path_op_blockers( + fn matrix_integer_eq_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_integer_eq_path_op_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16036,7 +16146,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_path_op_blockers", + "encrypted_domain::scalars::integer::matrix_integer_eq_path_op_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16065,16 +16175,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_path_op_blockers; + let f: fn(_) -> _ = matrix_integer_eq_path_op_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_path_op_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_path_op_blockers"] #[doc(hidden)] - pub const matrix_int4_ord_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_path_op_blockers", + "scalars::integer::matrix_integer_ord_path_op_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16090,11 +16200,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_path_op_blockers()), + || test::assert_test_result(matrix_integer_ord_path_op_blockers()), ), }; - fn matrix_int4_ord_path_op_blockers() -> anyhow::Result<()> { - async fn matrix_int4_ord_path_op_blockers( + fn matrix_integer_ord_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_integer_ord_path_op_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16139,7 +16249,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_path_op_blockers", + "encrypted_domain::scalars::integer::matrix_integer_ord_path_op_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16168,16 +16278,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_path_op_blockers; + let f: fn(_) -> _ = matrix_integer_ord_path_op_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_path_op_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_path_op_blockers"] #[doc(hidden)] - pub const matrix_int4_ord_ore_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_path_op_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_path_op_blockers", + "scalars::integer::matrix_integer_ord_ore_path_op_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16193,11 +16303,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_path_op_blockers()), + || test::assert_test_result(matrix_integer_ord_ore_path_op_blockers()), ), }; - fn matrix_int4_ord_ore_path_op_blockers() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_path_op_blockers( + fn matrix_integer_ord_ore_path_op_blockers() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_path_op_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16242,7 +16352,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_path_op_blockers", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_path_op_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16271,16 +16381,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_path_op_blockers; + let f: fn(_) -> _ = matrix_integer_ord_ore_path_op_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_native_absent_ops"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_native_absent_ops"] #[doc(hidden)] - pub const matrix_int4_storage_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_native_absent_ops", + "scalars::integer::matrix_integer_storage_native_absent_ops", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16296,11 +16406,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_native_absent_ops()), + || test::assert_test_result(matrix_integer_storage_native_absent_ops()), ), }; - fn matrix_int4_storage_native_absent_ops() -> anyhow::Result<()> { - async fn matrix_int4_storage_native_absent_ops( + fn matrix_integer_storage_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_integer_storage_native_absent_ops( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16331,7 +16441,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_native_absent_ops", + "encrypted_domain::scalars::integer::matrix_integer_storage_native_absent_ops", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16360,16 +16470,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_native_absent_ops; + let f: fn(_) -> _ = matrix_integer_storage_native_absent_ops; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_native_absent_ops"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_native_absent_ops"] #[doc(hidden)] - pub const matrix_int4_eq_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_native_absent_ops", + "scalars::integer::matrix_integer_eq_native_absent_ops", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16385,11 +16495,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_native_absent_ops()), + || test::assert_test_result(matrix_integer_eq_native_absent_ops()), ), }; - fn matrix_int4_eq_native_absent_ops() -> anyhow::Result<()> { - async fn matrix_int4_eq_native_absent_ops( + fn matrix_integer_eq_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_integer_eq_native_absent_ops( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16420,7 +16530,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_native_absent_ops", + "encrypted_domain::scalars::integer::matrix_integer_eq_native_absent_ops", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16449,16 +16559,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_native_absent_ops; + let f: fn(_) -> _ = matrix_integer_eq_native_absent_ops; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_native_absent_ops"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_native_absent_ops"] #[doc(hidden)] - pub const matrix_int4_ord_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_native_absent_ops", + "scalars::integer::matrix_integer_ord_native_absent_ops", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16474,11 +16584,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_native_absent_ops()), + || test::assert_test_result(matrix_integer_ord_native_absent_ops()), ), }; - fn matrix_int4_ord_native_absent_ops() -> anyhow::Result<()> { - async fn matrix_int4_ord_native_absent_ops( + fn matrix_integer_ord_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_integer_ord_native_absent_ops( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16509,7 +16619,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_native_absent_ops", + "encrypted_domain::scalars::integer::matrix_integer_ord_native_absent_ops", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16538,16 +16648,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_native_absent_ops; + let f: fn(_) -> _ = matrix_integer_ord_native_absent_ops; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_native_absent_ops"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_native_absent_ops"] #[doc(hidden)] - pub const matrix_int4_ord_ore_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_native_absent_ops: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_native_absent_ops", + "scalars::integer::matrix_integer_ord_ore_native_absent_ops", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16563,11 +16673,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_native_absent_ops()), + || test::assert_test_result(matrix_integer_ord_ore_native_absent_ops()), ), }; - fn matrix_int4_ord_ore_native_absent_ops() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_native_absent_ops( + fn matrix_integer_ord_ore_native_absent_ops() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_native_absent_ops( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16598,7 +16708,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_native_absent_ops", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_native_absent_ops", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16627,16 +16737,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_native_absent_ops; + let f: fn(_) -> _ = matrix_integer_ord_ore_native_absent_ops; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_native_jsonb_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_native_jsonb_blockers"] #[doc(hidden)] - pub const matrix_int4_storage_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_native_jsonb_blockers", + "scalars::integer::matrix_integer_storage_native_jsonb_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16652,11 +16762,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_native_jsonb_blockers()), + || test::assert_test_result(matrix_integer_storage_native_jsonb_blockers()), ), }; - fn matrix_int4_storage_native_jsonb_blockers() -> anyhow::Result<()> { - async fn matrix_int4_storage_native_jsonb_blockers( + fn matrix_integer_storage_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_integer_storage_native_jsonb_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -16822,7 +16932,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_native_jsonb_blockers", + "encrypted_domain::scalars::integer::matrix_integer_storage_native_jsonb_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -16851,16 +16961,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_native_jsonb_blockers; + let f: fn(_) -> _ = matrix_integer_storage_native_jsonb_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_native_jsonb_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_native_jsonb_blockers"] #[doc(hidden)] - pub const matrix_int4_eq_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_native_jsonb_blockers", + "scalars::integer::matrix_integer_eq_native_jsonb_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -16876,11 +16986,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_native_jsonb_blockers()), + || test::assert_test_result(matrix_integer_eq_native_jsonb_blockers()), ), }; - fn matrix_int4_eq_native_jsonb_blockers() -> anyhow::Result<()> { - async fn matrix_int4_eq_native_jsonb_blockers( + fn matrix_integer_eq_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_integer_eq_native_jsonb_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -17046,7 +17156,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_native_jsonb_blockers", + "encrypted_domain::scalars::integer::matrix_integer_eq_native_jsonb_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -17075,16 +17185,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_native_jsonb_blockers; + let f: fn(_) -> _ = matrix_integer_eq_native_jsonb_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_native_jsonb_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_native_jsonb_blockers"] #[doc(hidden)] - pub const matrix_int4_ord_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_native_jsonb_blockers", + "scalars::integer::matrix_integer_ord_native_jsonb_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -17100,11 +17210,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_native_jsonb_blockers()), + || test::assert_test_result(matrix_integer_ord_native_jsonb_blockers()), ), }; - fn matrix_int4_ord_native_jsonb_blockers() -> anyhow::Result<()> { - async fn matrix_int4_ord_native_jsonb_blockers( + fn matrix_integer_ord_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_integer_ord_native_jsonb_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -17270,7 +17380,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_native_jsonb_blockers", + "encrypted_domain::scalars::integer::matrix_integer_ord_native_jsonb_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -17299,16 +17409,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_native_jsonb_blockers; + let f: fn(_) -> _ = matrix_integer_ord_native_jsonb_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_native_jsonb_blockers"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_native_jsonb_blockers"] #[doc(hidden)] - pub const matrix_int4_ord_ore_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_native_jsonb_blockers: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_native_jsonb_blockers", + "scalars::integer::matrix_integer_ord_ore_native_jsonb_blockers", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -17324,11 +17434,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_native_jsonb_blockers()), + || test::assert_test_result(matrix_integer_ord_ore_native_jsonb_blockers()), ), }; - fn matrix_int4_ord_ore_native_jsonb_blockers() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_native_jsonb_blockers( + fn matrix_integer_ord_ore_native_jsonb_blockers() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_native_jsonb_blockers( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -17494,7 +17604,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_native_jsonb_blockers", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_native_jsonb_blockers", ); args.migrator( &::sqlx::migrate::Migrator { @@ -17523,16 +17633,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_native_jsonb_blockers; + let f: fn(_) -> _ = matrix_integer_ord_ore_native_jsonb_blockers; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_typed_column_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_typed_column_blocker"] #[doc(hidden)] - pub const matrix_int4_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_typed_column_blocker", + "scalars::integer::matrix_integer_storage_typed_column_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -17548,11 +17658,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_typed_column_blocker()), + || test::assert_test_result(matrix_integer_storage_typed_column_blocker()), ), }; - fn matrix_int4_storage_typed_column_blocker() -> anyhow::Result<()> { - async fn matrix_int4_storage_typed_column_blocker( + fn matrix_integer_storage_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_integer_storage_typed_column_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -17865,7 +17975,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_typed_column_blocker", + "encrypted_domain::scalars::integer::matrix_integer_storage_typed_column_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -17894,16 +18004,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_typed_column_blocker; + let f: fn(_) -> _ = matrix_integer_storage_typed_column_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_typed_column_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_typed_column_blocker"] #[doc(hidden)] - pub const matrix_int4_eq_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_typed_column_blocker", + "scalars::integer::matrix_integer_eq_typed_column_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -17919,11 +18029,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_typed_column_blocker()), + || test::assert_test_result(matrix_integer_eq_typed_column_blocker()), ), }; - fn matrix_int4_eq_typed_column_blocker() -> anyhow::Result<()> { - async fn matrix_int4_eq_typed_column_blocker( + fn matrix_integer_eq_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_integer_eq_typed_column_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -18166,7 +18276,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_typed_column_blocker", + "encrypted_domain::scalars::integer::matrix_integer_eq_typed_column_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -18195,16 +18305,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_typed_column_blocker; + let f: fn(_) -> _ = matrix_integer_eq_typed_column_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_typed_column_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_typed_column_blocker"] #[doc(hidden)] - pub const matrix_int4_ord_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_typed_column_blocker", + "scalars::integer::matrix_integer_ord_typed_column_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -18220,11 +18330,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_typed_column_blocker()), + || test::assert_test_result(matrix_integer_ord_typed_column_blocker()), ), }; - fn matrix_int4_ord_typed_column_blocker() -> anyhow::Result<()> { - async fn matrix_int4_ord_typed_column_blocker( + fn matrix_integer_ord_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_integer_ord_typed_column_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -18327,7 +18437,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_typed_column_blocker", + "encrypted_domain::scalars::integer::matrix_integer_ord_typed_column_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -18356,16 +18466,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_typed_column_blocker; + let f: fn(_) -> _ = matrix_integer_ord_typed_column_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_typed_column_blocker"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_typed_column_blocker"] #[doc(hidden)] - pub const matrix_int4_ord_ore_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_typed_column_blocker: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_typed_column_blocker", + "scalars::integer::matrix_integer_ord_ore_typed_column_blocker", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -18381,11 +18491,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_typed_column_blocker()), + || test::assert_test_result(matrix_integer_ord_ore_typed_column_blocker()), ), }; - fn matrix_int4_ord_ore_typed_column_blocker() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_typed_column_blocker( + fn matrix_integer_ord_ore_typed_column_blocker() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_typed_column_blocker( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -18488,7 +18598,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_typed_column_blocker", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_typed_column_blocker", ); args.migrator( &::sqlx::migrate::Migrator { @@ -18517,16 +18627,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_typed_column_blocker; + let f: fn(_) -> _ = matrix_integer_ord_ore_typed_column_blocker; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_planner_metadata_eq"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_planner_metadata_eq"] #[doc(hidden)] - pub const matrix_int4_eq_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_planner_metadata_eq", + "scalars::integer::matrix_integer_eq_planner_metadata_eq", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -18542,11 +18652,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_planner_metadata_eq()), + || test::assert_test_result(matrix_integer_eq_planner_metadata_eq()), ), }; - fn matrix_int4_eq_planner_metadata_eq() -> anyhow::Result<()> { - async fn matrix_int4_eq_planner_metadata_eq( + fn matrix_integer_eq_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_integer_eq_planner_metadata_eq( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -18652,7 +18762,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_planner_metadata_eq", + "encrypted_domain::scalars::integer::matrix_integer_eq_planner_metadata_eq", ); args.migrator( &::sqlx::migrate::Migrator { @@ -18681,16 +18791,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_planner_metadata_eq; + let f: fn(_) -> _ = matrix_integer_eq_planner_metadata_eq; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_planner_metadata_eq"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_planner_metadata_eq"] #[doc(hidden)] - pub const matrix_int4_ord_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_planner_metadata_eq", + "scalars::integer::matrix_integer_ord_planner_metadata_eq", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -18706,11 +18816,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_planner_metadata_eq()), + || test::assert_test_result(matrix_integer_ord_planner_metadata_eq()), ), }; - fn matrix_int4_ord_planner_metadata_eq() -> anyhow::Result<()> { - async fn matrix_int4_ord_planner_metadata_eq( + fn matrix_integer_ord_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_integer_ord_planner_metadata_eq( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -18816,7 +18926,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_planner_metadata_eq", + "encrypted_domain::scalars::integer::matrix_integer_ord_planner_metadata_eq", ); args.migrator( &::sqlx::migrate::Migrator { @@ -18845,16 +18955,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_planner_metadata_eq; + let f: fn(_) -> _ = matrix_integer_ord_planner_metadata_eq; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_planner_metadata_eq"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_planner_metadata_eq"] #[doc(hidden)] - pub const matrix_int4_ord_ore_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_planner_metadata_eq: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_planner_metadata_eq", + "scalars::integer::matrix_integer_ord_ore_planner_metadata_eq", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -18870,11 +18980,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_planner_metadata_eq()), + || test::assert_test_result(matrix_integer_ord_ore_planner_metadata_eq()), ), }; - fn matrix_int4_ord_ore_planner_metadata_eq() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_planner_metadata_eq( + fn matrix_integer_ord_ore_planner_metadata_eq() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_planner_metadata_eq( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -18980,7 +19090,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_planner_metadata_eq", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_planner_metadata_eq", ); args.migrator( &::sqlx::migrate::Migrator { @@ -19009,16 +19119,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_planner_metadata_eq; + let f: fn(_) -> _ = matrix_integer_ord_ore_planner_metadata_eq; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_planner_metadata_ord"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_planner_metadata_ord"] #[doc(hidden)] - pub const matrix_int4_ord_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_planner_metadata_ord", + "scalars::integer::matrix_integer_ord_planner_metadata_ord", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -19034,11 +19144,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_planner_metadata_ord()), + || test::assert_test_result(matrix_integer_ord_planner_metadata_ord()), ), }; - fn matrix_int4_ord_planner_metadata_ord() -> anyhow::Result<()> { - async fn matrix_int4_ord_planner_metadata_ord( + fn matrix_integer_ord_planner_metadata_ord() -> anyhow::Result<()> { + async fn matrix_integer_ord_planner_metadata_ord( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -19144,7 +19254,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_planner_metadata_ord", + "encrypted_domain::scalars::integer::matrix_integer_ord_planner_metadata_ord", ); args.migrator( &::sqlx::migrate::Migrator { @@ -19173,16 +19283,16 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_planner_metadata_ord; + let f: fn(_) -> _ = matrix_integer_ord_planner_metadata_ord; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_planner_metadata_ord"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_planner_metadata_ord"] #[doc(hidden)] - pub const matrix_int4_ord_ore_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_planner_metadata_ord: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_planner_metadata_ord", + "scalars::integer::matrix_integer_ord_ore_planner_metadata_ord", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -19198,11 +19308,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_planner_metadata_ord()), + || test::assert_test_result(matrix_integer_ord_ore_planner_metadata_ord()), ), }; - fn matrix_int4_ord_ore_planner_metadata_ord() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_planner_metadata_ord( + fn matrix_integer_ord_ore_planner_metadata_ord() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_planner_metadata_ord( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -19308,7 +19418,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_planner_metadata_ord", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_planner_metadata_ord", ); args.migrator( &::sqlx::migrate::Migrator { @@ -19337,23 +19447,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_planner_metadata_ord; + let f: fn(_) -> _ = matrix_integer_ord_ore_planner_metadata_ord; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_index_engages_btree"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_index_engages_btree"] #[doc(hidden)] - pub const matrix_int4_eq_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_index_engages_btree", + "scalars::integer::matrix_integer_eq_index_engages_btree", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19362,11 +19472,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_index_engages_btree()), + || test::assert_test_result(matrix_integer_eq_index_engages_btree()), ), }; - fn matrix_int4_eq_index_engages_btree() -> anyhow::Result<()> { - async fn matrix_int4_eq_index_engages_btree( + fn matrix_integer_eq_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_integer_eq_index_engages_btree( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -19377,8 +19487,8 @@ pub mod int4 { &spec, &["="], )?; - let table = "matrix_int4_eq_idx_btree"; - let index = "matrix_int4_eq_idx_btree_idx"; + let table = "matrix_integer_eq_idx_btree"; + let index = "matrix_integer_eq_idx_btree_idx"; let fixture_table = ::fixture_table_name(); let mut tx = pool.begin().await?; sqlx::query( @@ -19481,7 +19591,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_index_engages_btree", + "encrypted_domain::scalars::integer::matrix_integer_eq_index_engages_btree", ); args.migrator( &::sqlx::migrate::Migrator { @@ -19512,28 +19622,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_index_engages_btree; + let f: fn(_) -> _ = matrix_integer_eq_index_engages_btree; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_index_engages_hash"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_index_engages_hash"] #[doc(hidden)] - pub const matrix_int4_eq_index_engages_hash: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_index_engages_hash: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_index_engages_hash", + "scalars::integer::matrix_integer_eq_index_engages_hash", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19542,11 +19652,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_index_engages_hash()), + || test::assert_test_result(matrix_integer_eq_index_engages_hash()), ), }; - fn matrix_int4_eq_index_engages_hash() -> anyhow::Result<()> { - async fn matrix_int4_eq_index_engages_hash( + fn matrix_integer_eq_index_engages_hash() -> anyhow::Result<()> { + async fn matrix_integer_eq_index_engages_hash( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -19557,8 +19667,8 @@ pub mod int4 { &spec, &["="], )?; - let table = "matrix_int4_eq_idx_hash"; - let index = "matrix_int4_eq_idx_hash_idx"; + let table = "matrix_integer_eq_idx_hash"; + let index = "matrix_integer_eq_idx_hash_idx"; let fixture_table = ::fixture_table_name(); let mut tx = pool.begin().await?; sqlx::query( @@ -19661,7 +19771,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_index_engages_hash", + "encrypted_domain::scalars::integer::matrix_integer_eq_index_engages_hash", ); args.migrator( &::sqlx::migrate::Migrator { @@ -19692,28 +19802,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_index_engages_hash; + let f: fn(_) -> _ = matrix_integer_eq_index_engages_hash; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_index_engages_btree"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_index_engages_btree"] #[doc(hidden)] - pub const matrix_int4_ord_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_index_engages_btree", + "scalars::integer::matrix_integer_ord_index_engages_btree", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19722,11 +19832,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_index_engages_btree()), + || test::assert_test_result(matrix_integer_ord_index_engages_btree()), ), }; - fn matrix_int4_ord_index_engages_btree() -> anyhow::Result<()> { - async fn matrix_int4_ord_index_engages_btree( + fn matrix_integer_ord_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_integer_ord_index_engages_btree( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -19737,8 +19847,8 @@ pub mod int4 { &spec, &["=", "<", "<=", ">", ">="], )?; - let table = "matrix_int4_ord_idx_btree"; - let index = "matrix_int4_ord_idx_btree_idx"; + let table = "matrix_integer_ord_idx_btree"; + let index = "matrix_integer_ord_idx_btree_idx"; let fixture_table = ::fixture_table_name(); let mut tx = pool.begin().await?; sqlx::query( @@ -19961,7 +20071,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_index_engages_btree", + "encrypted_domain::scalars::integer::matrix_integer_ord_index_engages_btree", ); args.migrator( &::sqlx::migrate::Migrator { @@ -19992,28 +20102,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_index_engages_btree; + let f: fn(_) -> _ = matrix_integer_ord_index_engages_btree; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_index_engages_btree"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_index_engages_btree"] #[doc(hidden)] - pub const matrix_int4_ord_ore_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_index_engages_btree: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_index_engages_btree", + "scalars::integer::matrix_integer_ord_ore_index_engages_btree", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -20022,11 +20132,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_index_engages_btree()), + || test::assert_test_result(matrix_integer_ord_ore_index_engages_btree()), ), }; - fn matrix_int4_ord_ore_index_engages_btree() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_index_engages_btree( + fn matrix_integer_ord_ore_index_engages_btree() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_index_engages_btree( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -20037,8 +20147,8 @@ pub mod int4 { &spec, &["=", "<", "<=", ">", ">="], )?; - let table = "matrix_int4_ord_ore_idx_btree"; - let index = "matrix_int4_ord_ore_idx_btree_idx"; + let table = "matrix_integer_ord_ore_idx_btree"; + let index = "matrix_integer_ord_ore_idx_btree_idx"; let fixture_table = ::fixture_table_name(); let mut tx = pool.begin().await?; sqlx::query( @@ -20261,7 +20371,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_index_engages_btree", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_index_engages_btree", ); args.migrator( &::sqlx::migrate::Migrator { @@ -20292,21 +20402,21 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_index_engages_btree; + let f: fn(_) -> _ = matrix_integer_ord_ore_index_engages_btree; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_scale_preference_default_btree"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_scale_preference_default_btree"] #[doc(hidden)] - pub const matrix_int4_ord_scale_preference_default_btree: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_scale_preference_default_btree: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_scale_preference_default_btree", + "scalars::integer::matrix_integer_ord_scale_preference_default_btree", ), ignore: false, ignore_message: ::core::option::Option::None, @@ -20322,11 +20432,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_scale_preference_default_btree()), + || test::assert_test_result( + matrix_integer_ord_scale_preference_default_btree(), + ), ), }; - fn matrix_int4_ord_scale_preference_default_btree() -> anyhow::Result<()> { - async fn matrix_int4_ord_scale_preference_default_btree( + fn matrix_integer_ord_scale_preference_default_btree() -> anyhow::Result<()> { + async fn matrix_integer_ord_scale_preference_default_btree( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -20349,8 +20461,8 @@ pub mod int4 { }), ) })?; - let table = "matrix_int4_ord_scaledef_btree"; - let index = "matrix_int4_ord_scaledef_btree_idx"; + let table = "matrix_integer_ord_scaledef_btree"; + let index = "matrix_integer_ord_scaledef_btree_idx"; let values: &[i32] = ::fixture_values(); if ::anyhow::__private::not(values.len() >= 2) { return ::anyhow::__private::Err({ @@ -20465,7 +20577,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_scale_preference_default_btree", + "encrypted_domain::scalars::integer::matrix_integer_ord_scale_preference_default_btree", ); args.migrator( &::sqlx::migrate::Migrator { @@ -20496,20 +20608,20 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_scale_preference_default_btree; + let f: fn(_) -> _ = matrix_integer_ord_scale_preference_default_btree; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_fixture_shape"] + #[rustc_test_marker = "scalars::integer::matrix_integer_fixture_shape"] #[doc(hidden)] - pub const matrix_int4_fixture_shape: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_fixture_shape: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_fixture_shape"), + name: test::StaticTestName("scalars::integer::matrix_integer_fixture_shape"), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", @@ -20524,11 +20636,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_fixture_shape()), + || test::assert_test_result(matrix_integer_fixture_shape()), ), }; - fn matrix_int4_fixture_shape() -> anyhow::Result<()> { - async fn matrix_int4_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { + fn matrix_integer_fixture_shape() -> anyhow::Result<()> { + async fn matrix_integer_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result<()> { { use ::eql_tests::scalar_domains::ScalarType; let table = ::fixture_table_name(); @@ -20767,6 +20879,28 @@ pub mod int4 { error }); } + let with_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(with_op == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "fixture payload carries an `op` term — the client now emits CLLW-OPE; pick up CIP-3348 (real-ciphertext ord_ope coverage)", + ), + ); + error + }); + } if !expected.is_empty() { let probe = &expected[expected.len() / 2]; let probe_lit = ::to_sql_literal(probe); @@ -20810,7 +20944,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_fixture_shape", + "encrypted_domain::scalars::integer::matrix_integer_fixture_shape", ); args.migrator( &::sqlx::migrate::Migrator { @@ -20841,28 +20975,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_fixture_shape; + let f: fn(_) -> _ = matrix_integer_fixture_shape; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ord_routes_through_ob"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ord_routes_through_ob"] #[doc(hidden)] - pub const matrix_int4_ord_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ord_routes_through_ob", + "scalars::integer::matrix_integer_ord_ord_routes_through_ob", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2029usize, + start_line: 2044usize, start_col: 22usize, - end_line: 2029usize, + end_line: 2044usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -20871,11 +21005,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ord_routes_through_ob()), + || test::assert_test_result(matrix_integer_ord_ord_routes_through_ob()), ), }; - fn matrix_int4_ord_ord_routes_through_ob() -> anyhow::Result<()> { - async fn matrix_int4_ord_ord_routes_through_ob( + fn matrix_integer_ord_ord_routes_through_ob() -> anyhow::Result<()> { + async fn matrix_integer_ord_ord_routes_through_ob( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -20885,8 +21019,8 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; let token = ::PG_TYPE; - let table = "matrix_int4_ord_routing"; - let index = "matrix_int4_ord_routing_idx"; + let table = "matrix_integer_ord_routing"; + let index = "matrix_integer_ord_routing_idx"; let fixture_table = ::fixture_table_name(); let pivot: i32 = ::fixture_values()[0].clone(); let pivot_lit = ::to_sql_literal(&pivot); @@ -21071,7 +21205,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ord_routes_through_ob", + "encrypted_domain::scalars::integer::matrix_integer_ord_ord_routes_through_ob", ); args.migrator( &::sqlx::migrate::Migrator { @@ -21102,28 +21236,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ord_routes_through_ob; + let f: fn(_) -> _ = matrix_integer_ord_ord_routes_through_ob; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_ord_routes_through_ob"] #[doc(hidden)] - pub const matrix_int4_ord_ore_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_ord_routes_through_ob: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob", + "scalars::integer::matrix_integer_ord_ore_ord_routes_through_ob", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2029usize, + start_line: 2044usize, start_col: 22usize, - end_line: 2029usize, + end_line: 2044usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -21132,11 +21266,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_ord_routes_through_ob()), + || test::assert_test_result(matrix_integer_ord_ore_ord_routes_through_ob()), ), }; - fn matrix_int4_ord_ore_ord_routes_through_ob() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_ord_routes_through_ob( + fn matrix_integer_ord_ore_ord_routes_through_ob() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_ord_routes_through_ob( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -21146,8 +21280,8 @@ pub mod int4 { >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; let token = ::PG_TYPE; - let table = "matrix_int4_ord_ore_routing"; - let index = "matrix_int4_ord_ore_routing_idx"; + let table = "matrix_integer_ord_ore_routing"; + let index = "matrix_integer_ord_ore_routing_idx"; let fixture_table = ::fixture_table_name(); let pivot: i32 = ::fixture_values()[0].clone(); let pivot_lit = ::to_sql_literal(&pivot); @@ -21332,7 +21466,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_ord_routes_through_ob", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_ord_routes_through_ob", ); args.migrator( &::sqlx::migrate::Migrator { @@ -21363,28 +21497,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_ord_routes_through_ob; + let f: fn(_) -> _ = matrix_integer_ord_ore_ord_routes_through_ob; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_ore_injectivity"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_ore_injectivity"] #[doc(hidden)] - pub const matrix_int4_ord_ore_ore_injectivity: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_ore_injectivity: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_ore_injectivity", + "scalars::integer::matrix_integer_ord_ore_ore_injectivity", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2342usize, + start_line: 2357usize, start_col: 22usize, - end_line: 2342usize, + end_line: 2357usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -21393,11 +21527,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_ore_injectivity()), + || test::assert_test_result(matrix_integer_ord_ore_ore_injectivity()), ), }; - fn matrix_int4_ord_ore_ore_injectivity() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_ore_injectivity( + fn matrix_integer_ord_ore_ore_injectivity() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_ore_injectivity( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -21434,7 +21568,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_ore_injectivity", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_ore_injectivity", ); args.migrator( &::sqlx::migrate::Migrator { @@ -21465,26 +21599,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_ore_injectivity; + let f: fn(_) -> _ = matrix_integer_ord_ore_ore_injectivity; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_min"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_ord_aggregate_min"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_ord_aggregate_min", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21493,11 +21629,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_min()), + || test::assert_test_result(matrix_integer_ord_aggregate_min()), ), }; - fn matrix_int4_ord_aggregate_min() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_min( + fn matrix_integer_ord_aggregate_min() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -21614,7 +21750,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -21645,28 +21781,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_min; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min_empty"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_min_empty"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_min_empty", + "scalars::integer::matrix_integer_ord_aggregate_min_empty", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21675,11 +21811,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_min_empty()), + || test::assert_test_result(matrix_integer_ord_aggregate_min_empty()), ), }; - fn matrix_int4_ord_aggregate_min_empty() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_min_empty( + fn matrix_integer_ord_aggregate_min_empty() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_min_empty( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -21733,7 +21869,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min_empty", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_min_empty", ); args.migrator( &::sqlx::migrate::Migrator { @@ -21762,23 +21898,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_min_empty; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_min_empty; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min_all_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_min_all_null"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_min_all_null", + "scalars::integer::matrix_integer_ord_aggregate_min_all_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -21787,11 +21923,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_min_all_null()), + || test::assert_test_result(matrix_integer_ord_aggregate_min_all_null()), ), }; - fn matrix_int4_ord_aggregate_min_all_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_min_all_null( + fn matrix_integer_ord_aggregate_min_all_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_min_all_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -21832,7 +21968,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min_all_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_min_all_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -21861,23 +21997,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_min_all_null; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_min_all_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_min_mixed_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_min_mixed_null"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_min_mixed_null", + "scalars::integer::matrix_integer_ord_aggregate_min_mixed_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -21886,11 +22022,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_min_mixed_null()), + || test::assert_test_result(matrix_integer_ord_aggregate_min_mixed_null()), ), }; - fn matrix_int4_ord_aggregate_min_mixed_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_min_mixed_null( + fn matrix_integer_ord_aggregate_min_mixed_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_min_mixed_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22013,7 +22149,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_min_mixed_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_min_mixed_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -22044,26 +22180,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_min_mixed_null; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_min_mixed_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_max"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_ord_aggregate_max"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_ord_aggregate_max", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -22072,11 +22210,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_max()), + || test::assert_test_result(matrix_integer_ord_aggregate_max()), ), }; - fn matrix_int4_ord_aggregate_max() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_max( + fn matrix_integer_ord_aggregate_max() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22193,7 +22331,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -22224,28 +22362,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_max; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max_empty"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_max_empty"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_max_empty", + "scalars::integer::matrix_integer_ord_aggregate_max_empty", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -22254,11 +22392,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_max_empty()), + || test::assert_test_result(matrix_integer_ord_aggregate_max_empty()), ), }; - fn matrix_int4_ord_aggregate_max_empty() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_max_empty( + fn matrix_integer_ord_aggregate_max_empty() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_max_empty( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22312,7 +22450,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max_empty", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_max_empty", ); args.migrator( &::sqlx::migrate::Migrator { @@ -22341,23 +22479,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_max_empty; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_max_empty; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max_all_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_max_all_null"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_max_all_null", + "scalars::integer::matrix_integer_ord_aggregate_max_all_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22366,11 +22504,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_max_all_null()), + || test::assert_test_result(matrix_integer_ord_aggregate_max_all_null()), ), }; - fn matrix_int4_ord_aggregate_max_all_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_max_all_null( + fn matrix_integer_ord_aggregate_max_all_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_max_all_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22411,7 +22549,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max_all_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_max_all_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -22440,23 +22578,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_max_all_null; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_max_all_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_max_mixed_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_max_mixed_null"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_max_mixed_null", + "scalars::integer::matrix_integer_ord_aggregate_max_mixed_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22465,11 +22603,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_max_mixed_null()), + || test::assert_test_result(matrix_integer_ord_aggregate_max_mixed_null()), ), }; - fn matrix_int4_ord_aggregate_max_mixed_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_max_mixed_null( + fn matrix_integer_ord_aggregate_max_mixed_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_max_mixed_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22592,7 +22730,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_max_mixed_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_max_mixed_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -22623,28 +22761,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_max_mixed_null; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_max_mixed_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_min"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_min", + "scalars::integer::matrix_integer_ord_ore_aggregate_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -22653,11 +22791,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_min()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_min()), ), }; - fn matrix_int4_ord_ore_aggregate_min() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_min( + fn matrix_integer_ord_ore_aggregate_min() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22774,7 +22912,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -22805,28 +22943,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min_empty"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_min_empty"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_min_empty: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_min_empty", + "scalars::integer::matrix_integer_ord_ore_aggregate_min_empty", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -22835,11 +22973,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_min_empty()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_min_empty()), ), }; - fn matrix_int4_ord_ore_aggregate_min_empty() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_min_empty( + fn matrix_integer_ord_ore_aggregate_min_empty() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_min_empty( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22893,7 +23031,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min_empty", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_min_empty", ); args.migrator( &::sqlx::migrate::Migrator { @@ -22922,23 +23060,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min_empty; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_min_empty; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_min_all_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_min_all_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null", + "scalars::integer::matrix_integer_ord_ore_aggregate_min_all_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22947,11 +23085,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_min_all_null()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_min_all_null()), ), }; - fn matrix_int4_ord_ore_aggregate_min_all_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_min_all_null( + fn matrix_integer_ord_ore_aggregate_min_all_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_min_all_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -22992,7 +23130,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min_all_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_min_all_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -23021,23 +23159,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min_all_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_min_all_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_min_mixed_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_min_mixed_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null", + "scalars::integer::matrix_integer_ord_ore_aggregate_min_mixed_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -23046,11 +23184,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_min_mixed_null()), + || test::assert_test_result( + matrix_integer_ord_ore_aggregate_min_mixed_null(), + ), ), }; - fn matrix_int4_ord_ore_aggregate_min_mixed_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_min_mixed_null( + fn matrix_integer_ord_ore_aggregate_min_mixed_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_min_mixed_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -23173,7 +23313,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_min_mixed_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_min_mixed_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -23204,28 +23344,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_min_mixed_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_min_mixed_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_max"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_max", + "scalars::integer::matrix_integer_ord_ore_aggregate_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -23234,11 +23374,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_max()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_max()), ), }; - fn matrix_int4_ord_ore_aggregate_max() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_max( + fn matrix_integer_ord_ore_aggregate_max() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -23355,7 +23495,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -23386,28 +23526,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max_empty"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_max_empty"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_max_empty: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_max_empty", + "scalars::integer::matrix_integer_ord_ore_aggregate_max_empty", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -23416,11 +23556,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_max_empty()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_max_empty()), ), }; - fn matrix_int4_ord_ore_aggregate_max_empty() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_max_empty( + fn matrix_integer_ord_ore_aggregate_max_empty() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_max_empty( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -23474,7 +23614,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max_empty", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_max_empty", ); args.migrator( &::sqlx::migrate::Migrator { @@ -23503,23 +23643,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max_empty; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_max_empty; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_max_all_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_max_all_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null", + "scalars::integer::matrix_integer_ord_ore_aggregate_max_all_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23528,11 +23668,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_max_all_null()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_max_all_null()), ), }; - fn matrix_int4_ord_ore_aggregate_max_all_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_max_all_null( + fn matrix_integer_ord_ore_aggregate_max_all_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_max_all_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -23573,7 +23713,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max_all_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_max_all_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -23602,23 +23742,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max_all_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_max_all_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_max_mixed_null"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_max_mixed_null: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null", + "scalars::integer::matrix_integer_ord_ore_aggregate_max_mixed_null", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -23627,11 +23767,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_max_mixed_null()), + || test::assert_test_result( + matrix_integer_ord_ore_aggregate_max_mixed_null(), + ), ), }; - fn matrix_int4_ord_ore_aggregate_max_mixed_null() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_max_mixed_null( + fn matrix_integer_ord_ore_aggregate_max_mixed_null() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_max_mixed_null( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -23754,7 +23896,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_max_mixed_null", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_max_mixed_null", ); args.migrator( &::sqlx::migrate::Migrator { @@ -23785,28 +23927,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_max_mixed_null; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_max_mixed_null; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_group_by_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_group_by_min"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_group_by_min", + "scalars::integer::matrix_integer_ord_aggregate_group_by_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -23815,11 +23957,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_group_by_min()), + || test::assert_test_result(matrix_integer_ord_aggregate_group_by_min()), ), }; - fn matrix_int4_ord_aggregate_group_by_min() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_group_by_min( + fn matrix_integer_ord_aggregate_group_by_min() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_group_by_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -24007,7 +24149,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_group_by_min", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_group_by_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -24038,28 +24180,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_group_by_min; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_group_by_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_group_by_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_group_by_max"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_group_by_max", + "scalars::integer::matrix_integer_ord_aggregate_group_by_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -24068,11 +24210,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_group_by_max()), + || test::assert_test_result(matrix_integer_ord_aggregate_group_by_max()), ), }; - fn matrix_int4_ord_aggregate_group_by_max() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_group_by_max( + fn matrix_integer_ord_aggregate_group_by_max() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_group_by_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -24260,7 +24402,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_group_by_max", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_group_by_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -24291,28 +24433,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_group_by_max; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_group_by_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_group_by_min"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_group_by_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min", + "scalars::integer::matrix_integer_ord_ore_aggregate_group_by_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -24321,11 +24463,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_group_by_min()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_group_by_min()), ), }; - fn matrix_int4_ord_ore_aggregate_group_by_min() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_group_by_min( + fn matrix_integer_ord_ore_aggregate_group_by_min() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_group_by_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -24513,7 +24655,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_group_by_min", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_group_by_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -24544,28 +24686,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_group_by_min; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_group_by_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_group_by_max"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_group_by_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max", + "scalars::integer::matrix_integer_ord_ore_aggregate_group_by_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -24574,11 +24716,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_group_by_max()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_group_by_max()), ), }; - fn matrix_int4_ord_ore_aggregate_group_by_max() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_group_by_max( + fn matrix_integer_ord_ore_aggregate_group_by_max() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_group_by_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -24766,7 +24908,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_group_by_max", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_group_by_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -24797,28 +24939,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_group_by_max; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_group_by_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_parallel_safe"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_parallel_safe"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_parallel_safe", + "scalars::integer::matrix_integer_ord_aggregate_parallel_safe", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3092usize, + start_line: 3107usize, start_col: 22usize, - end_line: 3092usize, + end_line: 3107usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -24827,11 +24969,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_parallel_safe()), + || test::assert_test_result(matrix_integer_ord_aggregate_parallel_safe()), ), }; - fn matrix_int4_ord_aggregate_parallel_safe() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_parallel_safe( + fn matrix_integer_ord_aggregate_parallel_safe() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_parallel_safe( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -24882,7 +25024,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_parallel_safe", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_parallel_safe", ); args.migrator( &::sqlx::migrate::Migrator { @@ -24911,23 +25053,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_parallel_safe; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_parallel_safe; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_parallel_safe"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_parallel_safe: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe", + "scalars::integer::matrix_integer_ord_ore_aggregate_parallel_safe", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3092usize, + start_line: 3107usize, start_col: 22usize, - end_line: 3092usize, + end_line: 3107usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -24936,11 +25078,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_parallel_safe()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_parallel_safe()), ), }; - fn matrix_int4_ord_ore_aggregate_parallel_safe() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_parallel_safe( + fn matrix_integer_ord_ore_aggregate_parallel_safe() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_parallel_safe( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -24991,7 +25133,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_parallel_safe", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_parallel_safe", ); args.migrator( &::sqlx::migrate::Migrator { @@ -25020,23 +25162,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_parallel_safe; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_parallel_safe; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_aggregate_typecheck_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_aggregate_typecheck_min"] #[doc(hidden)] - pub const matrix_int4_storage_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_aggregate_typecheck_min", + "scalars::integer::matrix_integer_storage_aggregate_typecheck_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25045,11 +25187,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_aggregate_typecheck_min()), + || test::assert_test_result(matrix_integer_storage_aggregate_typecheck_min()), ), }; - fn matrix_int4_storage_aggregate_typecheck_min() -> anyhow::Result<()> { - async fn matrix_int4_storage_aggregate_typecheck_min( + fn matrix_integer_storage_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_integer_storage_aggregate_typecheck_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -25159,7 +25301,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_aggregate_typecheck_min", + "encrypted_domain::scalars::integer::matrix_integer_storage_aggregate_typecheck_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -25188,23 +25330,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_aggregate_typecheck_min; + let f: fn(_) -> _ = matrix_integer_storage_aggregate_typecheck_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_aggregate_typecheck_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_aggregate_typecheck_max"] #[doc(hidden)] - pub const matrix_int4_storage_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_aggregate_typecheck_max", + "scalars::integer::matrix_integer_storage_aggregate_typecheck_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25213,11 +25355,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_aggregate_typecheck_max()), + || test::assert_test_result(matrix_integer_storage_aggregate_typecheck_max()), ), }; - fn matrix_int4_storage_aggregate_typecheck_max() -> anyhow::Result<()> { - async fn matrix_int4_storage_aggregate_typecheck_max( + fn matrix_integer_storage_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_integer_storage_aggregate_typecheck_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -25327,7 +25469,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_aggregate_typecheck_max", + "encrypted_domain::scalars::integer::matrix_integer_storage_aggregate_typecheck_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -25356,23 +25498,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_storage_aggregate_typecheck_max; + let f: fn(_) -> _ = matrix_integer_storage_aggregate_typecheck_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_aggregate_typecheck_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_aggregate_typecheck_min"] #[doc(hidden)] - pub const matrix_int4_eq_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_aggregate_typecheck_min", + "scalars::integer::matrix_integer_eq_aggregate_typecheck_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25381,11 +25523,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_aggregate_typecheck_min()), + || test::assert_test_result(matrix_integer_eq_aggregate_typecheck_min()), ), }; - fn matrix_int4_eq_aggregate_typecheck_min() -> anyhow::Result<()> { - async fn matrix_int4_eq_aggregate_typecheck_min( + fn matrix_integer_eq_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_integer_eq_aggregate_typecheck_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -25495,7 +25637,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_aggregate_typecheck_min", + "encrypted_domain::scalars::integer::matrix_integer_eq_aggregate_typecheck_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -25524,23 +25666,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_aggregate_typecheck_min; + let f: fn(_) -> _ = matrix_integer_eq_aggregate_typecheck_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_aggregate_typecheck_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_aggregate_typecheck_max"] #[doc(hidden)] - pub const matrix_int4_eq_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_aggregate_typecheck_max", + "scalars::integer::matrix_integer_eq_aggregate_typecheck_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25549,11 +25691,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_aggregate_typecheck_max()), + || test::assert_test_result(matrix_integer_eq_aggregate_typecheck_max()), ), }; - fn matrix_int4_eq_aggregate_typecheck_max() -> anyhow::Result<()> { - async fn matrix_int4_eq_aggregate_typecheck_max( + fn matrix_integer_eq_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_integer_eq_aggregate_typecheck_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -25663,7 +25805,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_aggregate_typecheck_max", + "encrypted_domain::scalars::integer::matrix_integer_eq_aggregate_typecheck_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -25692,23 +25834,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_eq_aggregate_typecheck_max; + let f: fn(_) -> _ = matrix_integer_eq_aggregate_typecheck_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_typecheck_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_typecheck_min"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_typecheck_min", + "scalars::integer::matrix_integer_ord_aggregate_typecheck_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25717,11 +25859,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_typecheck_min()), + || test::assert_test_result(matrix_integer_ord_aggregate_typecheck_min()), ), }; - fn matrix_int4_ord_aggregate_typecheck_min() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_typecheck_min( + fn matrix_integer_ord_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_typecheck_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -25831,7 +25973,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_typecheck_min", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_typecheck_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -25860,23 +26002,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_typecheck_min; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_typecheck_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_aggregate_typecheck_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_aggregate_typecheck_max"] #[doc(hidden)] - pub const matrix_int4_ord_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_aggregate_typecheck_max", + "scalars::integer::matrix_integer_ord_aggregate_typecheck_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25885,11 +26027,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_aggregate_typecheck_max()), + || test::assert_test_result(matrix_integer_ord_aggregate_typecheck_max()), ), }; - fn matrix_int4_ord_aggregate_typecheck_max() -> anyhow::Result<()> { - async fn matrix_int4_ord_aggregate_typecheck_max( + fn matrix_integer_ord_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_integer_ord_aggregate_typecheck_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -25999,7 +26141,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_aggregate_typecheck_max", + "encrypted_domain::scalars::integer::matrix_integer_ord_aggregate_typecheck_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26028,23 +26170,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_aggregate_typecheck_max; + let f: fn(_) -> _ = matrix_integer_ord_aggregate_typecheck_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_min"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_typecheck_min"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_typecheck_min: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_min", + "scalars::integer::matrix_integer_ord_ore_aggregate_typecheck_min", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -26053,11 +26195,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_typecheck_min()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_typecheck_min()), ), }; - fn matrix_int4_ord_ore_aggregate_typecheck_min() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_typecheck_min( + fn matrix_integer_ord_ore_aggregate_typecheck_min() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_typecheck_min( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -26167,7 +26309,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_min", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_typecheck_min", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26196,23 +26338,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_typecheck_min; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_typecheck_min; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_max"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_aggregate_typecheck_max"] #[doc(hidden)] - pub const matrix_int4_ord_ore_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_aggregate_typecheck_max: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_max", + "scalars::integer::matrix_integer_ord_ore_aggregate_typecheck_max", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -26221,11 +26363,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_aggregate_typecheck_max()), + || test::assert_test_result(matrix_integer_ord_ore_aggregate_typecheck_max()), ), }; - fn matrix_int4_ord_ore_aggregate_typecheck_max() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_aggregate_typecheck_max( + fn matrix_integer_ord_ore_aggregate_typecheck_max() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_aggregate_typecheck_max( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -26335,7 +26477,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_aggregate_typecheck_max", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_aggregate_typecheck_max", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26364,23 +26506,23 @@ pub mod int4 { }, ); args.fixtures(&[]); - let f: fn(_) -> _ = matrix_int4_ord_ore_aggregate_typecheck_max; + let f: fn(_) -> _ = matrix_integer_ord_ore_aggregate_typecheck_max; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_count_typed_column"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_count_typed_column"] #[doc(hidden)] - pub const matrix_int4_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_count_typed_column", + "scalars::integer::matrix_integer_storage_count_typed_column", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -26389,11 +26531,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_count_typed_column()), + || test::assert_test_result(matrix_integer_storage_count_typed_column()), ), }; - fn matrix_int4_storage_count_typed_column() -> anyhow::Result<()> { - async fn matrix_int4_storage_count_typed_column( + fn matrix_integer_storage_count_typed_column() -> anyhow::Result<()> { + async fn matrix_integer_storage_count_typed_column( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -26457,7 +26599,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_count_typed_column", + "encrypted_domain::scalars::integer::matrix_integer_storage_count_typed_column", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26488,28 +26630,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_storage_count_typed_column; + let f: fn(_) -> _ = matrix_integer_storage_count_typed_column; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_count_path_cast"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_count_path_cast"] #[doc(hidden)] - pub const matrix_int4_storage_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_count_path_cast", + "scalars::integer::matrix_integer_storage_count_path_cast", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -26518,11 +26660,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_count_path_cast()), + || test::assert_test_result(matrix_integer_storage_count_path_cast()), ), }; - fn matrix_int4_storage_count_path_cast() -> anyhow::Result<()> { - async fn matrix_int4_storage_count_path_cast( + fn matrix_integer_storage_count_path_cast() -> anyhow::Result<()> { + async fn matrix_integer_storage_count_path_cast( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -26567,7 +26709,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_count_path_cast", + "encrypted_domain::scalars::integer::matrix_integer_storage_count_path_cast", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26598,28 +26740,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_storage_count_path_cast; + let f: fn(_) -> _ = matrix_integer_storage_count_path_cast; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_storage_count_distinct_extractor"] + #[rustc_test_marker = "scalars::integer::matrix_integer_storage_count_distinct_extractor"] #[doc(hidden)] - pub const matrix_int4_storage_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_storage_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_storage_count_distinct_extractor", + "scalars::integer::matrix_integer_storage_count_distinct_extractor", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -26628,11 +26770,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_storage_count_distinct_extractor()), + || test::assert_test_result( + matrix_integer_storage_count_distinct_extractor(), + ), ), }; - fn matrix_int4_storage_count_distinct_extractor() -> anyhow::Result<()> { - async fn matrix_int4_storage_count_distinct_extractor( + fn matrix_integer_storage_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_integer_storage_count_distinct_extractor( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -26705,7 +26849,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_storage_count_distinct_extractor", + "encrypted_domain::scalars::integer::matrix_integer_storage_count_distinct_extractor", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26736,28 +26880,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_storage_count_distinct_extractor; + let f: fn(_) -> _ = matrix_integer_storage_count_distinct_extractor; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_count_typed_column"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_count_typed_column"] #[doc(hidden)] - pub const matrix_int4_eq_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_count_typed_column", + "scalars::integer::matrix_integer_eq_count_typed_column", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -26766,11 +26910,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_count_typed_column()), + || test::assert_test_result(matrix_integer_eq_count_typed_column()), ), }; - fn matrix_int4_eq_count_typed_column() -> anyhow::Result<()> { - async fn matrix_int4_eq_count_typed_column( + fn matrix_integer_eq_count_typed_column() -> anyhow::Result<()> { + async fn matrix_integer_eq_count_typed_column( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -26834,7 +26978,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_count_typed_column", + "encrypted_domain::scalars::integer::matrix_integer_eq_count_typed_column", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26865,26 +27009,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_count_typed_column; + let f: fn(_) -> _ = matrix_integer_eq_count_typed_column; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_count_path_cast"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_count_path_cast"] #[doc(hidden)] - pub const matrix_int4_eq_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_eq_count_path_cast"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_eq_count_path_cast", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -26893,11 +27039,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_count_path_cast()), + || test::assert_test_result(matrix_integer_eq_count_path_cast()), ), }; - fn matrix_int4_eq_count_path_cast() -> anyhow::Result<()> { - async fn matrix_int4_eq_count_path_cast( + fn matrix_integer_eq_count_path_cast() -> anyhow::Result<()> { + async fn matrix_integer_eq_count_path_cast( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -26942,7 +27088,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_count_path_cast", + "encrypted_domain::scalars::integer::matrix_integer_eq_count_path_cast", ); args.migrator( &::sqlx::migrate::Migrator { @@ -26973,28 +27119,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_count_path_cast; + let f: fn(_) -> _ = matrix_integer_eq_count_path_cast; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_eq_count_distinct_extractor"] + #[rustc_test_marker = "scalars::integer::matrix_integer_eq_count_distinct_extractor"] #[doc(hidden)] - pub const matrix_int4_eq_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_eq_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_eq_count_distinct_extractor", + "scalars::integer::matrix_integer_eq_count_distinct_extractor", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -27003,11 +27149,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_eq_count_distinct_extractor()), + || test::assert_test_result(matrix_integer_eq_count_distinct_extractor()), ), }; - fn matrix_int4_eq_count_distinct_extractor() -> anyhow::Result<()> { - async fn matrix_int4_eq_count_distinct_extractor( + fn matrix_integer_eq_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_integer_eq_count_distinct_extractor( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27080,7 +27226,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_eq_count_distinct_extractor", + "encrypted_domain::scalars::integer::matrix_integer_eq_count_distinct_extractor", ); args.migrator( &::sqlx::migrate::Migrator { @@ -27111,28 +27257,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_eq_count_distinct_extractor; + let f: fn(_) -> _ = matrix_integer_eq_count_distinct_extractor; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_count_typed_column"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_count_typed_column"] #[doc(hidden)] - pub const matrix_int4_ord_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_count_typed_column", + "scalars::integer::matrix_integer_ord_count_typed_column", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -27141,11 +27287,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_count_typed_column()), + || test::assert_test_result(matrix_integer_ord_count_typed_column()), ), }; - fn matrix_int4_ord_count_typed_column() -> anyhow::Result<()> { - async fn matrix_int4_ord_count_typed_column( + fn matrix_integer_ord_count_typed_column() -> anyhow::Result<()> { + async fn matrix_integer_ord_count_typed_column( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27209,7 +27355,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_count_typed_column", + "encrypted_domain::scalars::integer::matrix_integer_ord_count_typed_column", ); args.migrator( &::sqlx::migrate::Migrator { @@ -27240,26 +27386,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_count_typed_column; + let f: fn(_) -> _ = matrix_integer_ord_count_typed_column; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_count_path_cast"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_count_path_cast"] #[doc(hidden)] - pub const matrix_int4_ord_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { - name: test::StaticTestName("scalars::int4::matrix_int4_ord_count_path_cast"), + name: test::StaticTestName( + "scalars::integer::matrix_integer_ord_count_path_cast", + ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -27268,11 +27416,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_count_path_cast()), + || test::assert_test_result(matrix_integer_ord_count_path_cast()), ), }; - fn matrix_int4_ord_count_path_cast() -> anyhow::Result<()> { - async fn matrix_int4_ord_count_path_cast( + fn matrix_integer_ord_count_path_cast() -> anyhow::Result<()> { + async fn matrix_integer_ord_count_path_cast( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27317,7 +27465,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_count_path_cast", + "encrypted_domain::scalars::integer::matrix_integer_ord_count_path_cast", ); args.migrator( &::sqlx::migrate::Migrator { @@ -27348,28 +27496,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_count_path_cast; + let f: fn(_) -> _ = matrix_integer_ord_count_path_cast; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_count_distinct_extractor"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_count_distinct_extractor"] #[doc(hidden)] - pub const matrix_int4_ord_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_count_distinct_extractor", + "scalars::integer::matrix_integer_ord_count_distinct_extractor", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -27378,11 +27526,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_count_distinct_extractor()), + || test::assert_test_result(matrix_integer_ord_count_distinct_extractor()), ), }; - fn matrix_int4_ord_count_distinct_extractor() -> anyhow::Result<()> { - async fn matrix_int4_ord_count_distinct_extractor( + fn matrix_integer_ord_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_integer_ord_count_distinct_extractor( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27455,7 +27603,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_count_distinct_extractor", + "encrypted_domain::scalars::integer::matrix_integer_ord_count_distinct_extractor", ); args.migrator( &::sqlx::migrate::Migrator { @@ -27486,28 +27634,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_count_distinct_extractor; + let f: fn(_) -> _ = matrix_integer_ord_count_distinct_extractor; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_count_typed_column"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_count_typed_column"] #[doc(hidden)] - pub const matrix_int4_ord_ore_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_count_typed_column: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_count_typed_column", + "scalars::integer::matrix_integer_ord_ore_count_typed_column", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -27516,11 +27664,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_count_typed_column()), + || test::assert_test_result(matrix_integer_ord_ore_count_typed_column()), ), }; - fn matrix_int4_ord_ore_count_typed_column() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_count_typed_column( + fn matrix_integer_ord_ore_count_typed_column() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_count_typed_column( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27584,7 +27732,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_count_typed_column", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_count_typed_column", ); args.migrator( &::sqlx::migrate::Migrator { @@ -27615,28 +27763,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_count_typed_column; + let f: fn(_) -> _ = matrix_integer_ord_ore_count_typed_column; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_count_path_cast"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_count_path_cast"] #[doc(hidden)] - pub const matrix_int4_ord_ore_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_count_path_cast: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_count_path_cast", + "scalars::integer::matrix_integer_ord_ore_count_path_cast", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -27645,11 +27793,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_count_path_cast()), + || test::assert_test_result(matrix_integer_ord_ore_count_path_cast()), ), }; - fn matrix_int4_ord_ore_count_path_cast() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_count_path_cast( + fn matrix_integer_ord_ore_count_path_cast() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_count_path_cast( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27694,7 +27842,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_count_path_cast", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_count_path_cast", ); args.migrator( &::sqlx::migrate::Migrator { @@ -27725,28 +27873,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_count_path_cast; + let f: fn(_) -> _ = matrix_integer_ord_ore_count_path_cast; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_count_distinct_extractor"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_count_distinct_extractor"] #[doc(hidden)] - pub const matrix_int4_ord_ore_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_count_distinct_extractor: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_count_distinct_extractor", + "scalars::integer::matrix_integer_ord_ore_count_distinct_extractor", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -27755,11 +27903,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_count_distinct_extractor()), + || test::assert_test_result( + matrix_integer_ord_ore_count_distinct_extractor(), + ), ), }; - fn matrix_int4_ord_ore_count_distinct_extractor() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_count_distinct_extractor( + fn matrix_integer_ord_ore_count_distinct_extractor() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_count_distinct_extractor( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27832,7 +27982,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_count_distinct_extractor", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_count_distinct_extractor", ); args.migrator( &::sqlx::migrate::Migrator { @@ -27863,28 +28013,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_count_distinct_extractor; + let f: fn(_) -> _ = matrix_integer_ord_ore_count_distinct_extractor; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_no_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_asc_no_where"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_asc_no_where", + "scalars::integer::matrix_integer_ord_order_by_asc_no_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -27893,11 +28043,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_asc_no_where()), + || test::assert_test_result(matrix_integer_ord_order_by_asc_no_where()), ), }; - fn matrix_int4_ord_order_by_asc_no_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_asc_no_where( + fn matrix_integer_ord_order_by_asc_no_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_asc_no_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -27975,7 +28125,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_no_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_asc_no_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -28006,28 +28156,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_no_where; + let f: fn(_) -> _ = matrix_integer_ord_order_by_asc_no_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_no_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_desc_no_where"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_desc_no_where", + "scalars::integer::matrix_integer_ord_order_by_desc_no_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28036,11 +28186,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_desc_no_where()), + || test::assert_test_result(matrix_integer_ord_order_by_desc_no_where()), ), }; - fn matrix_int4_ord_order_by_desc_no_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_desc_no_where( + fn matrix_integer_ord_order_by_desc_no_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_desc_no_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -28118,7 +28268,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_no_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_desc_no_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -28149,28 +28299,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_no_where; + let f: fn(_) -> _ = matrix_integer_ord_order_by_desc_no_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_with_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_asc_with_where"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_asc_with_where", + "scalars::integer::matrix_integer_ord_order_by_asc_with_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28179,11 +28329,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_asc_with_where()), + || test::assert_test_result(matrix_integer_ord_order_by_asc_with_where()), ), }; - fn matrix_int4_ord_order_by_asc_with_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_asc_with_where( + fn matrix_integer_ord_order_by_asc_with_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_asc_with_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -28261,7 +28411,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_with_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_asc_with_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -28292,28 +28442,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_with_where; + let f: fn(_) -> _ = matrix_integer_ord_order_by_asc_with_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_with_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_desc_with_where"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_desc_with_where", + "scalars::integer::matrix_integer_ord_order_by_desc_with_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28322,11 +28472,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_desc_with_where()), + || test::assert_test_result(matrix_integer_ord_order_by_desc_with_where()), ), }; - fn matrix_int4_ord_order_by_desc_with_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_desc_with_where( + fn matrix_integer_ord_order_by_desc_with_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_desc_with_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -28404,7 +28554,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_with_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_desc_with_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -28435,28 +28585,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_with_where; + let f: fn(_) -> _ = matrix_integer_ord_order_by_desc_with_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_asc_no_where"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_asc_no_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where", + "scalars::integer::matrix_integer_ord_ore_order_by_asc_no_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28465,11 +28615,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_no_where()), + || test::assert_test_result(matrix_integer_ord_ore_order_by_asc_no_where()), ), }; - fn matrix_int4_ord_ore_order_by_asc_no_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_asc_no_where( + fn matrix_integer_ord_ore_order_by_asc_no_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_asc_no_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -28547,7 +28697,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_no_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_asc_no_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -28578,28 +28728,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_no_where; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_asc_no_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_desc_no_where"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_desc_no_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where", + "scalars::integer::matrix_integer_ord_ore_order_by_desc_no_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28608,11 +28758,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_no_where()), + || test::assert_test_result(matrix_integer_ord_ore_order_by_desc_no_where()), ), }; - fn matrix_int4_ord_ore_order_by_desc_no_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_desc_no_where( + fn matrix_integer_ord_ore_order_by_desc_no_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_desc_no_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -28690,7 +28840,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_no_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_desc_no_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -28721,28 +28871,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_no_where; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_desc_no_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_asc_with_where"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_asc_with_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where", + "scalars::integer::matrix_integer_ord_ore_order_by_asc_with_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28751,11 +28901,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_with_where()), + || test::assert_test_result(matrix_integer_ord_ore_order_by_asc_with_where()), ), }; - fn matrix_int4_ord_ore_order_by_asc_with_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_asc_with_where( + fn matrix_integer_ord_ore_order_by_asc_with_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_asc_with_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -28833,7 +28983,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_with_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_asc_with_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -28864,28 +29014,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_with_where; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_asc_with_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_desc_with_where"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_desc_with_where: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where", + "scalars::integer::matrix_integer_ord_ore_order_by_desc_with_where", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28894,11 +29044,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_with_where()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_desc_with_where(), + ), ), }; - fn matrix_int4_ord_ore_order_by_desc_with_where() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_desc_with_where( + fn matrix_integer_ord_ore_order_by_desc_with_where() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_desc_with_where( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -28976,7 +29128,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_with_where", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_desc_with_where", ); args.migrator( &::sqlx::migrate::Migrator { @@ -29007,28 +29159,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_with_where; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_desc_with_where; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_nulls_first"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_asc_nulls_first"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_asc_nulls_first", + "scalars::integer::matrix_integer_ord_order_by_asc_nulls_first", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29037,11 +29189,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_asc_nulls_first()), + || test::assert_test_result(matrix_integer_ord_order_by_asc_nulls_first()), ), }; - fn matrix_int4_ord_order_by_asc_nulls_first() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_asc_nulls_first( + fn matrix_integer_ord_order_by_asc_nulls_first() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_asc_nulls_first( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -29050,7 +29202,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; - let table = "matrix_int4_ord_order_by_asc_nulls_first"; + let table = "matrix_integer_ord_order_by_asc_nulls_first"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -29155,7 +29307,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_nulls_first", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_asc_nulls_first", ); args.migrator( &::sqlx::migrate::Migrator { @@ -29186,28 +29338,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_nulls_first; + let f: fn(_) -> _ = matrix_integer_ord_order_by_asc_nulls_first; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_asc_nulls_last"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_asc_nulls_last"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_asc_nulls_last", + "scalars::integer::matrix_integer_ord_order_by_asc_nulls_last", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29216,11 +29368,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_asc_nulls_last()), + || test::assert_test_result(matrix_integer_ord_order_by_asc_nulls_last()), ), }; - fn matrix_int4_ord_order_by_asc_nulls_last() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_asc_nulls_last( + fn matrix_integer_ord_order_by_asc_nulls_last() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_asc_nulls_last( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -29229,7 +29381,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; - let table = "matrix_int4_ord_order_by_asc_nulls_last"; + let table = "matrix_integer_ord_order_by_asc_nulls_last"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -29334,7 +29486,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_asc_nulls_last", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_asc_nulls_last", ); args.migrator( &::sqlx::migrate::Migrator { @@ -29365,28 +29517,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_asc_nulls_last; + let f: fn(_) -> _ = matrix_integer_ord_order_by_asc_nulls_last; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_nulls_first"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_desc_nulls_first"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_desc_nulls_first", + "scalars::integer::matrix_integer_ord_order_by_desc_nulls_first", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29395,11 +29547,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_desc_nulls_first()), + || test::assert_test_result(matrix_integer_ord_order_by_desc_nulls_first()), ), }; - fn matrix_int4_ord_order_by_desc_nulls_first() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_desc_nulls_first( + fn matrix_integer_ord_order_by_desc_nulls_first() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_desc_nulls_first( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -29408,7 +29560,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; - let table = "matrix_int4_ord_order_by_desc_nulls_first"; + let table = "matrix_integer_ord_order_by_desc_nulls_first"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -29513,7 +29665,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_nulls_first", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_desc_nulls_first", ); args.migrator( &::sqlx::migrate::Migrator { @@ -29544,28 +29696,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_nulls_first; + let f: fn(_) -> _ = matrix_integer_ord_order_by_desc_nulls_first; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_desc_nulls_last"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_desc_nulls_last"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_desc_nulls_last", + "scalars::integer::matrix_integer_ord_order_by_desc_nulls_last", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29574,11 +29726,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_desc_nulls_last()), + || test::assert_test_result(matrix_integer_ord_order_by_desc_nulls_last()), ), }; - fn matrix_int4_ord_order_by_desc_nulls_last() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_desc_nulls_last( + fn matrix_integer_ord_order_by_desc_nulls_last() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_desc_nulls_last( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -29587,7 +29739,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::Ord); let d = &spec.sql_domain; - let table = "matrix_int4_ord_order_by_desc_nulls_last"; + let table = "matrix_integer_ord_order_by_desc_nulls_last"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -29692,7 +29844,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_desc_nulls_last", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_desc_nulls_last", ); args.migrator( &::sqlx::migrate::Migrator { @@ -29723,28 +29875,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_desc_nulls_last; + let f: fn(_) -> _ = matrix_integer_ord_order_by_desc_nulls_last; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_asc_nulls_first"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_asc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first", + "scalars::integer::matrix_integer_ord_ore_order_by_asc_nulls_first", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29753,11 +29905,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_nulls_first()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_asc_nulls_first(), + ), ), }; - fn matrix_int4_ord_ore_order_by_asc_nulls_first() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_asc_nulls_first( + fn matrix_integer_ord_ore_order_by_asc_nulls_first() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_asc_nulls_first( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -29766,7 +29920,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; - let table = "matrix_int4_ord_ore_order_by_asc_nulls_first"; + let table = "matrix_integer_ord_ore_order_by_asc_nulls_first"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -29871,7 +30025,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_first", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_asc_nulls_first", ); args.migrator( &::sqlx::migrate::Migrator { @@ -29902,28 +30056,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_nulls_first; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_asc_nulls_first; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_asc_nulls_last"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_asc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last", + "scalars::integer::matrix_integer_ord_ore_order_by_asc_nulls_last", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29932,11 +30086,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_asc_nulls_last()), + || test::assert_test_result(matrix_integer_ord_ore_order_by_asc_nulls_last()), ), }; - fn matrix_int4_ord_ore_order_by_asc_nulls_last() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_asc_nulls_last( + fn matrix_integer_ord_ore_order_by_asc_nulls_last() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_asc_nulls_last( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -29945,7 +30099,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; - let table = "matrix_int4_ord_ore_order_by_asc_nulls_last"; + let table = "matrix_integer_ord_ore_order_by_asc_nulls_last"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -30050,7 +30204,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_asc_nulls_last", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_asc_nulls_last", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30081,28 +30235,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_asc_nulls_last; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_asc_nulls_last; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_desc_nulls_first"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_desc_nulls_first: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first", + "scalars::integer::matrix_integer_ord_ore_order_by_desc_nulls_first", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -30111,11 +30265,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_nulls_first()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_desc_nulls_first(), + ), ), }; - fn matrix_int4_ord_ore_order_by_desc_nulls_first() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_desc_nulls_first( + fn matrix_integer_ord_ore_order_by_desc_nulls_first() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_desc_nulls_first( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -30124,7 +30280,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; - let table = "matrix_int4_ord_ore_order_by_desc_nulls_first"; + let table = "matrix_integer_ord_ore_order_by_desc_nulls_first"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -30229,7 +30385,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_first", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_desc_nulls_first", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30260,28 +30416,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_nulls_first; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_desc_nulls_first; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_desc_nulls_last"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_desc_nulls_last: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last", + "scalars::integer::matrix_integer_ord_ore_order_by_desc_nulls_last", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -30290,11 +30446,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_desc_nulls_last()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_desc_nulls_last(), + ), ), }; - fn matrix_int4_ord_ore_order_by_desc_nulls_last() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_desc_nulls_last( + fn matrix_integer_ord_ore_order_by_desc_nulls_last() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_desc_nulls_last( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -30303,7 +30461,7 @@ pub mod int4 { i32, >(::eql_tests::scalar_domains::Variant::OrdOre); let d = &spec.sql_domain; - let table = "matrix_int4_ord_ore_order_by_desc_nulls_last"; + let table = "matrix_integer_ord_ore_order_by_desc_nulls_last"; let fixture_table = ::fixture_table_name(); let pg = ::PLAINTEXT_SQL_TYPE; let mut tx = pool.begin().await?; @@ -30408,7 +30566,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_desc_nulls_last", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_desc_nulls_last", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30439,28 +30597,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_desc_nulls_last; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_desc_nulls_last; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_lt_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_using_lt_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_using_lt_rejects", + "scalars::integer::matrix_integer_ord_order_by_using_lt_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30469,11 +30627,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_using_lt_rejects()), + || test::assert_test_result(matrix_integer_ord_order_by_using_lt_rejects()), ), }; - fn matrix_int4_ord_order_by_using_lt_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_using_lt_rejects( + fn matrix_integer_ord_order_by_using_lt_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_using_lt_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -30512,7 +30670,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_lt_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_using_lt_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30543,28 +30701,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_using_lt_rejects; + let f: fn(_) -> _ = matrix_integer_ord_order_by_using_lt_rejects; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_lte_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_using_lte_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_using_lte_rejects", + "scalars::integer::matrix_integer_ord_order_by_using_lte_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30573,11 +30731,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_using_lte_rejects()), + || test::assert_test_result(matrix_integer_ord_order_by_using_lte_rejects()), ), }; - fn matrix_int4_ord_order_by_using_lte_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_using_lte_rejects( + fn matrix_integer_ord_order_by_using_lte_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_using_lte_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -30616,7 +30774,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_lte_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_using_lte_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30647,28 +30805,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_using_lte_rejects; + let f: fn(_) -> _ = matrix_integer_ord_order_by_using_lte_rejects; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_gt_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_using_gt_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_using_gt_rejects", + "scalars::integer::matrix_integer_ord_order_by_using_gt_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30677,11 +30835,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_using_gt_rejects()), + || test::assert_test_result(matrix_integer_ord_order_by_using_gt_rejects()), ), }; - fn matrix_int4_ord_order_by_using_gt_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_using_gt_rejects( + fn matrix_integer_ord_order_by_using_gt_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_using_gt_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -30720,7 +30878,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_gt_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_using_gt_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30751,28 +30909,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_using_gt_rejects; + let f: fn(_) -> _ = matrix_integer_ord_order_by_using_gt_rejects; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_order_by_using_gte_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_order_by_using_gte_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_order_by_using_gte_rejects", + "scalars::integer::matrix_integer_ord_order_by_using_gte_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30781,11 +30939,11 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_order_by_using_gte_rejects()), + || test::assert_test_result(matrix_integer_ord_order_by_using_gte_rejects()), ), }; - fn matrix_int4_ord_order_by_using_gte_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_order_by_using_gte_rejects( + fn matrix_integer_ord_order_by_using_gte_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_order_by_using_gte_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -30824,7 +30982,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_order_by_using_gte_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_order_by_using_gte_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30855,28 +31013,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_order_by_using_gte_rejects; + let f: fn(_) -> _ = matrix_integer_ord_order_by_using_gte_rejects; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_using_lt_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_using_lt_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects", + "scalars::integer::matrix_integer_ord_ore_order_by_using_lt_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30885,11 +31043,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_using_lt_rejects()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_using_lt_rejects(), + ), ), }; - fn matrix_int4_ord_ore_order_by_using_lt_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_using_lt_rejects( + fn matrix_integer_ord_ore_order_by_using_lt_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_using_lt_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -30928,7 +31088,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_lt_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_using_lt_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -30959,28 +31119,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_lt_rejects; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_using_lt_rejects; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_using_lte_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_using_lte_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects", + "scalars::integer::matrix_integer_ord_ore_order_by_using_lte_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30989,11 +31149,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_using_lte_rejects()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_using_lte_rejects(), + ), ), }; - fn matrix_int4_ord_ore_order_by_using_lte_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_using_lte_rejects( + fn matrix_integer_ord_ore_order_by_using_lte_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_using_lte_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -31032,7 +31194,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_lte_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_using_lte_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -31063,28 +31225,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_lte_rejects; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_using_lte_rejects; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_using_gt_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_using_gt_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects", + "scalars::integer::matrix_integer_ord_ore_order_by_using_gt_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -31093,11 +31255,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_using_gt_rejects()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_using_gt_rejects(), + ), ), }; - fn matrix_int4_ord_ore_order_by_using_gt_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_using_gt_rejects( + fn matrix_integer_ord_ore_order_by_using_gt_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_using_gt_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -31136,7 +31300,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_gt_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_using_gt_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -31167,28 +31331,28 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_gt_rejects; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_using_gt_rejects; ::sqlx::testing::TestFn::run_test(f, args) } extern crate test; - #[rustc_test_marker = "scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects"] + #[rustc_test_marker = "scalars::integer::matrix_integer_ord_ore_order_by_using_gte_rejects"] #[doc(hidden)] - pub const matrix_int4_ord_ore_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { + pub const matrix_integer_ord_ore_order_by_using_gte_rejects: test::TestDescAndFn = test::TestDescAndFn { desc: test::TestDesc { name: test::StaticTestName( - "scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects", + "scalars::integer::matrix_integer_ord_ore_order_by_using_gte_rejects", ), ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -31197,11 +31361,13 @@ pub mod int4 { }, testfn: test::StaticTestFn( #[coverage(off)] - || test::assert_test_result(matrix_int4_ord_ore_order_by_using_gte_rejects()), + || test::assert_test_result( + matrix_integer_ord_ore_order_by_using_gte_rejects(), + ), ), }; - fn matrix_int4_ord_ore_order_by_using_gte_rejects() -> anyhow::Result<()> { - async fn matrix_int4_ord_ore_order_by_using_gte_rejects( + fn matrix_integer_ord_ore_order_by_using_gte_rejects() -> anyhow::Result<()> { + async fn matrix_integer_ord_ore_order_by_using_gte_rejects( pool: sqlx::PgPool, ) -> anyhow::Result<()> { { @@ -31240,7 +31406,7 @@ pub mod int4 { } } let mut args = ::sqlx::testing::TestArgs::new( - "encrypted_domain::scalars::int4::matrix_int4_ord_ore_order_by_using_gte_rejects", + "encrypted_domain::scalars::integer::matrix_integer_ord_ore_order_by_using_gte_rejects", ); args.migrator( &::sqlx::migrate::Migrator { @@ -31271,12 +31437,12 @@ pub mod int4 { args.fixtures( &[ ::sqlx::testing::TestFixture { - path: "../../../fixtures/eql_v3_int4.sql", + path: "../../../fixtures/eql_v3_integer.sql", contents: "", }, ], ); - let f: fn(_) -> _ = matrix_int4_ord_ore_order_by_using_gte_rejects; + let f: fn(_) -> _ = matrix_integer_ord_ore_order_by_using_gte_rejects; ::sqlx::testing::TestFn::run_test(f, args) } } diff --git a/tests/sqlx/snapshots/text_expanded.rs b/tests/sqlx/snapshots/text_expanded.rs index b88ddb11f..54a8eb036 100644 --- a/tests/sqlx/snapshots/text_expanded.rs +++ b/tests/sqlx/snapshots/text_expanded.rs @@ -25696,9 +25696,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -25876,9 +25876,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26056,9 +26056,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26326,9 +26326,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26506,9 +26506,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26776,9 +26776,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26956,9 +26956,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -27226,9 +27226,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2405usize, + start_line: 2420usize, start_col: 22usize, - end_line: 2405usize, + end_line: 2420usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -27862,6 +27862,28 @@ pub mod text { error }); } + let with_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(with_op == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "fixture payload carries an `op` term — the client now emits CLLW-OPE; pick up CIP-3348 (real-ciphertext ord_ope coverage)", + ), + ); + error + }); + } if !expected.is_empty() { let probe = &expected[expected.len() / 2]; let probe_lit = ::to_sql_literal(probe); @@ -27955,9 +27977,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2029usize, + start_line: 2044usize, start_col: 22usize, - end_line: 2029usize, + end_line: 2044usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28216,9 +28238,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2029usize, + start_line: 2044usize, start_col: 22usize, - end_line: 2029usize, + end_line: 2044usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28477,9 +28499,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2029usize, + start_line: 2044usize, start_col: 22usize, - end_line: 2029usize, + end_line: 2044usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28738,9 +28760,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2203usize, + start_line: 2218usize, start_col: 22usize, - end_line: 2203usize, + end_line: 2218usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -28844,9 +28866,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2219usize, + start_line: 2234usize, start_col: 22usize, - end_line: 2219usize, + end_line: 2234usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28955,9 +28977,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2238usize, + start_line: 2253usize, start_col: 22usize, - end_line: 2238usize, + end_line: 2253usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -29066,9 +29088,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2264usize, + start_line: 2279usize, start_col: 22usize, - end_line: 2264usize, + end_line: 2279usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -29218,9 +29240,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2342usize, + start_line: 2357usize, start_col: 22usize, - end_line: 2342usize, + end_line: 2357usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -29318,9 +29340,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -29500,9 +29522,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -29612,9 +29634,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -29711,9 +29733,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -29897,9 +29919,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -30079,9 +30101,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -30191,9 +30213,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -30290,9 +30312,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -30478,9 +30500,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -30660,9 +30682,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -30772,9 +30794,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -30871,9 +30893,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -31059,9 +31081,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -31241,9 +31263,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -31353,9 +31375,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -31452,9 +31474,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -31640,9 +31662,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -31822,9 +31844,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -31934,9 +31956,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -32033,9 +32055,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -32221,9 +32243,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2885usize, + start_line: 2900usize, start_col: 22usize, - end_line: 2885usize, + end_line: 2900usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -32403,9 +32425,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2945usize, + start_line: 2960usize, start_col: 22usize, - end_line: 2945usize, + end_line: 2960usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -32515,9 +32537,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2970usize, + start_line: 2985usize, start_col: 22usize, - end_line: 2970usize, + end_line: 2985usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -32614,9 +32636,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2996usize, + start_line: 3011usize, start_col: 22usize, - end_line: 2996usize, + end_line: 3011usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -32802,9 +32824,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33055,9 +33077,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33308,9 +33330,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33561,9 +33583,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33814,9 +33836,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -34067,9 +34089,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3177usize, + start_line: 3192usize, start_col: 22usize, - end_line: 3177usize, + end_line: 3192usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -34320,9 +34342,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3092usize, + start_line: 3107usize, start_col: 22usize, - end_line: 3092usize, + end_line: 3107usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -34429,9 +34451,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3092usize, + start_line: 3107usize, start_col: 22usize, - end_line: 3092usize, + end_line: 3107usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -34538,9 +34560,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3092usize, + start_line: 3107usize, start_col: 22usize, - end_line: 3092usize, + end_line: 3107usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -34647,9 +34669,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -34815,9 +34837,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -34983,9 +35005,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35151,9 +35173,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35319,9 +35341,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35487,9 +35509,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35655,9 +35677,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35823,9 +35845,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35991,9 +36013,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -36159,9 +36181,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3336usize, + start_line: 3351usize, start_col: 22usize, - end_line: 3336usize, + end_line: 3351usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -36327,9 +36349,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -36456,9 +36478,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -36566,9 +36588,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -36704,9 +36726,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -36831,9 +36853,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -36941,9 +36963,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -37079,9 +37101,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -37206,9 +37228,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -37316,9 +37338,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -37454,9 +37476,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -37583,9 +37605,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -37693,9 +37715,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -37831,9 +37853,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3450usize, + start_line: 3465usize, start_col: 22usize, - end_line: 3450usize, + end_line: 3465usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -37960,9 +37982,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3484usize, + start_line: 3499usize, start_col: 22usize, - end_line: 3484usize, + end_line: 3499usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -38070,9 +38092,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3528usize, + start_line: 3543usize, start_col: 22usize, - end_line: 3528usize, + end_line: 3543usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -38208,9 +38230,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38353,9 +38375,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38498,9 +38520,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38643,9 +38665,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38788,9 +38810,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38933,9 +38955,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39078,9 +39100,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39223,9 +39245,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39368,9 +39390,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39513,9 +39535,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39658,9 +39680,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39803,9 +39825,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2555usize, + start_line: 2570usize, start_col: 22usize, - end_line: 2555usize, + end_line: 2570usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39948,9 +39970,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40127,9 +40149,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40306,9 +40328,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40485,9 +40507,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40664,9 +40686,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40843,9 +40865,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41022,9 +41044,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41201,9 +41223,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41380,9 +41402,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41559,9 +41581,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41738,9 +41760,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41917,9 +41939,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2669usize, + start_line: 2684usize, start_col: 22usize, - end_line: 2669usize, + end_line: 2684usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -42096,9 +42118,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42200,9 +42222,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42304,9 +42326,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42408,9 +42430,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42512,9 +42534,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42616,9 +42638,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42720,9 +42742,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42824,9 +42846,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42928,9 +42950,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -43032,9 +43054,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -43136,9 +43158,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -43240,9 +43262,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2795usize, + start_line: 2810usize, start_col: 22usize, - end_line: 2795usize, + end_line: 2810usize, end_col: 87usize, compile_fail: false, no_run: false, From 92847e767209174fbdf0b5826688df39cdc26aaa Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 3 Jul 2026 12:08:46 +1000 Subject: [PATCH 479/599] fix(v3): complete rename in eql-codegen + fix double oracle column type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - eql-codegen crate (generator): rename int4->integer etc. in unit tests, doc examples, and filename assertions (the crate was missed by the earlier task scope; 28 codegen test failures -> 0). - tests/sqlx F8/F4: derive PLAINTEXT_SQL_TYPE from EqlPlaintext so the double oracle column is 'double precision' (the domain token 'double' is not a valid native SQL type — same PG_TYPE-vs-plaintext split timestamp uses). Fixes 15 scalars::double / float_special failures. - CI/infra: macro-expand-eql.yml git-diffs integer_expanded.rs/boolean_expanded.rs; clean_install_v3.sh smoke uses eql_v3.integer; splinter.sh allowlist prose. - fmt reflows from the rename; regenerated eql_v3 public-surface golden. --- .github/workflows/README.md | 2 +- .github/workflows/macro-expand-eql.yml | 6 +- crates/eql-bindings/tests/v3_conformance.rs | 12 +- crates/eql-codegen/src/bindings.rs | 94 +-- crates/eql-codegen/src/consts.rs | 2 +- crates/eql-codegen/src/context.rs | 22 +- crates/eql-codegen/src/dump.rs | 36 +- crates/eql-codegen/src/generate.rs | 144 ++-- crates/eql-codegen/src/operator_surface.rs | 56 +- crates/eql-codegen/src/writer.rs | 50 +- crates/eql-codegen/tests/bindings_parity.rs | 2 +- crates/eql-domains/src/fixtures/mod.rs | 8 +- crates/eql-domains/src/fixtures/values.rs | 4 +- crates/eql-domains/src/lib.rs | 8 +- crates/eql-tests-macros/src/lib.rs | 6 +- tasks/test/clean_install_v3.sh | 8 +- tasks/test/splinter.sh | 4 +- .../sqlx/snapshots/eql_v3_public_surface.txt | 752 +++++++++--------- tests/sqlx/src/jsonb_entry.rs | 10 +- tests/sqlx/src/scalar_domains.rs | 13 + .../tests/eql_v3_integer_fixture_tests.rs | 9 +- tests/sqlx/tests/v3_privilege_tests.rs | 3 +- 22 files changed, 652 insertions(+), 599 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index e88718c31..fe9e0943c 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -22,7 +22,7 @@ actually runs). | **release-postgres-eql-image.yml** | `release: published`, `workflow_dispatch` | Build & push the Postgres+EQL Docker image to GHCR | No | | **release-plz.yml** | `push: main`, `workflow_dispatch` | Publish the `eql-bindings` crate to crates.io (Trusted Publishing) + open the release PR | No | | **bench-eql.yml** | `push: main` (paths), `schedule` 02:00 UTC daily, `workflow_dispatch` | `test:bench` (bench cargo feature). **Never runs on PRs** | No | -| **macro-expand-eql.yml** | `schedule` 03:00 UTC daily, `workflow_dispatch` | Regenerate the int4 `cargo expand` matrix snapshot; needs pinned nightly | **No — explicitly non-blocking** | +| **macro-expand-eql.yml** | `schedule` 03:00 UTC daily, `workflow_dispatch` | Regenerate the integer `cargo expand` matrix snapshot; needs pinned nightly | **No — explicitly non-blocking** | | **rebuild-docs.yml** | `push: tags` | Fire a docs-site rebuild webhook | N/A | Only **test-eql.yml** gates merges. Bench regressions and stale `cargo expand` diff --git a/.github/workflows/macro-expand-eql.yml b/.github/workflows/macro-expand-eql.yml index afec411fa..e3a0bb052 100644 --- a/.github/workflows/macro-expand-eql.yml +++ b/.github/workflows/macro-expand-eql.yml @@ -1,7 +1,7 @@ name: "Macro expand EQL" # Regenerates the matrix `cargo expand` snapshots (one per reachable -# `scalar_matrix!` arm: int4 = [eq, ord], text = [eq, ord, search], bool = +# `scalar_matrix!` arm: integer = [eq, ord], text = [eq, ord, search], boolean = # [storage]) and fails if any has drifted from its committed copy. This is a # body-level fidelity backstop for the matrix macros — the name-inventory # snapshot (test-eql.yml `matrix-coverage` job) catches add/remove of whole @@ -80,7 +80,7 @@ jobs: run: | mise run test:matrix:expand git diff --exit-code -- \ - tests/sqlx/snapshots/int4_expanded.rs \ + tests/sqlx/snapshots/integer_expanded.rs \ tests/sqlx/snapshots/text_expanded.rs \ - tests/sqlx/snapshots/bool_expanded.rs \ + tests/sqlx/snapshots/boolean_expanded.rs \ || { echo "Expansion snapshot stale — run 'mise run test:matrix:expand' (needs the pinned nightly) and commit."; exit 1; } diff --git a/crates/eql-bindings/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs index 44e5b32a3..a191a4c86 100644 --- a/crates/eql-bindings/tests/v3_conformance.rs +++ b/crates/eql-bindings/tests/v3_conformance.rs @@ -90,7 +90,10 @@ fn integer_eq_rejects_missing_hmac() { "c": "mp_base85_ciphertext" }); let result: Result = serde_json::from_value(no_hm); - assert!(result.is_err(), "IntegerEq must reject a payload with no hm"); + assert!( + result.is_err(), + "IntegerEq must reject a payload with no hm" + ); } #[test] @@ -165,7 +168,10 @@ fn integer_ord_rejects_missing_ore_term() { "c": "mp_base85_ciphertext" }); let result: Result = serde_json::from_value(no_ob); - assert!(result.is_err(), "IntegerOrd must reject a payload with no ob"); + assert!( + result.is_err(), + "IntegerOrd must reject a payload with no ob" + ); } #[test] @@ -201,7 +207,7 @@ fn non_integer_tokens_round_trip_every_domain() { // `catalog_parity.rs` checks domain *names* only, never the wire shape. // This sweep roundtrips every non-integer domain and pins its catalog name, // failing the instant a token drifts from the shared envelope/term contract. - use eql_bindings::v3::{date::*, smallint::*, bigint::*, numeric::*, text::*}; + use eql_bindings::v3::{bigint::*, date::*, numeric::*, smallint::*, text::*}; // Wire builders for the shapes the ordered tokens share. let storage = |t: &str| json!({ "v": 3, "i": { "t": t, "c": "x" }, "c": "ct" }); diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index 6645b7516..63de54499 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -189,7 +189,7 @@ fn render_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { } } -/// Render a whole family module (`int4.rs`, `text.rs`, …): the import header +/// Render a whole family module (`integer.rs`, `text.rs`, …): the import header /// (exactly the term newtypes the family uses) followed by every domain's /// struct + impl. pub fn render_family_bindings(family: &DomainFamily) -> String { @@ -356,15 +356,15 @@ mod tests { } #[test] - fn int4_family_structs_have_pinned_shape() { - let out = render_family_bindings(family("int4")); + fn integer_family_structs_have_pinned_shape() { + let out = render_family_bindings(family("integer")); assert!(out.starts_with(crate::consts::RUST_GENERATED_MARKER)); for s in [ - "struct Int4 ", - "struct Int4Eq ", - "struct Int4OrdOre ", - "struct Int4Ord ", - "struct Int4OrdOpe ", + "struct Integer ", + "struct IntegerEq ", + "struct IntegerOrdOre ", + "struct IntegerOrd ", + "struct IntegerOrdOpe ", ] { assert!(out.contains(s), "missing {s}"); } @@ -377,23 +377,23 @@ mod tests { ); assert_eq!(out.matches("#[ts(export, export_to = \"v3/\")]").count(), 5); assert_eq!(out.matches("#[serde(deny_unknown_fields)]").count(), 5); - assert!(out.contains("`eql_v3.int4_eq` — equality domain.")); - assert!(out.contains("`eql_v3.int4` — storage-only domain.")); - assert!(out.contains("`eql_v3.int4_ord` — ordering domain.")); - assert!(out.contains("`eql_v3.int4_ord_ope` — ordering domain.")); + assert!(out.contains("`eql_v3.integer_eq` — equality domain.")); + assert!(out.contains("`eql_v3.integer` — storage-only domain.")); + assert!(out.contains("`eql_v3.integer_ord` — ordering domain.")); + assert!(out.contains("`eql_v3.integer_ord_ope` — ordering domain.")); assert!(!out.contains("Envelope version")); assert!(!out.contains("HMAC-SHA-256 equality term")); - assert_eq!(field_idents(&out, "Int4"), ["v", "i", "c"]); - assert_eq!(field_idents(&out, "Int4Eq"), ["v", "i", "c", "hm"]); - assert_eq!(field_idents(&out, "Int4OrdOre"), ["v", "i", "c", "ob"]); - assert_eq!(field_idents(&out, "Int4Ord"), ["v", "i", "c", "ob"]); - assert_eq!(field_idents(&out, "Int4OrdOpe"), ["v", "i", "c", "op"]); - assert!(out.contains("impl DomainType for Int4Eq")); + assert_eq!(field_idents(&out, "Integer"), ["v", "i", "c"]); + assert_eq!(field_idents(&out, "IntegerEq"), ["v", "i", "c", "hm"]); + assert_eq!(field_idents(&out, "IntegerOrdOre"), ["v", "i", "c", "ob"]); + assert_eq!(field_idents(&out, "IntegerOrd"), ["v", "i", "c", "ob"]); + assert_eq!(field_idents(&out, "IntegerOrdOpe"), ["v", "i", "c", "op"]); + assert!(out.contains("impl DomainType for IntegerEq")); assert!(out.contains("fn sql_domain_static()")); - assert!(out.contains("\"eql_v3.int4_eq\"")); + assert!(out.contains("\"eql_v3.integer_eq\"")); assert!(out.contains("fn sql_domain(&self)")); assert!(out.contains("fn schema(&self) -> Schema")); - assert!(out.contains("schema_for!(Int4Eq)")); + assert!(out.contains("schema_for!(IntegerEq)")); assert!(out.contains("use crate::v3::terms::")); assert!(!out.contains("BloomFilter")); } @@ -404,25 +404,25 @@ mod tests { // the capability label + the operator union (`Term::operators_for_terms`) // + the required-key list (`ENVELOPE_KEYS` ++ `Term::term_json_keys`). // No field docs, no new free-form catalog prose. - let int4 = render_family_bindings(family("int4")); + let integer = render_family_bindings(family("integer")); // Storage-only: no operators. - assert!(int4.contains("`eql_v3.int4` — storage-only domain.")); - assert!(int4.contains("Operators: none.")); - assert!(int4.contains("Required keys: `v` `i` `c`.")); + assert!(integer.contains("`eql_v3.integer` — storage-only domain.")); + assert!(integer.contains("Operators: none.")); + assert!(integer.contains("Required keys: `v` `i` `c`.")); // Equality: `=`/`<>` and the `hm` key. - assert!(int4.contains("`eql_v3.int4_eq` — equality domain.")); - assert!(int4.contains("Operators: `=` `<>`.")); - assert!(int4.contains("Required keys: `v` `i` `c` `hm`.")); + assert!(integer.contains("`eql_v3.integer_eq` — equality domain.")); + assert!(integer.contains("Operators: `=` `<>`.")); + assert!(integer.contains("Required keys: `v` `i` `c` `hm`.")); // Ordering: full comparison operators and the `ob` key. - assert!(int4.contains("Operators: `=` `<>` `<` `<=` `>` `>=`.")); - assert!(int4.contains("Required keys: `v` `i` `c` `ob`.")); + assert!(integer.contains("Operators: `=` `<>` `<` `<=` `>` `>=`.")); + assert!(integer.contains("Required keys: `v` `i` `c` `ob`.")); // OPE ordering: same operator set, `op` key instead of `ob`. - assert!(int4.contains("`eql_v3.int4_ord_ope` — ordering domain.")); - assert!(int4.contains("Required keys: `v` `i` `c` `op`.")); + assert!(integer.contains("`eql_v3.integer_ord_ope` — ordering domain.")); + assert!(integer.contains("Required keys: `v` `i` `c` `op`.")); // text_ord carries BOTH `hm` and `ob` — the dual-term distinction that // previously lived only in hand-written prose is now derivable in the doc. @@ -465,10 +465,10 @@ mod tests { #[test] fn bool_storage_only_family_has_one_struct_no_terms() { - let out = render_family_bindings(family("bool")); + let out = render_family_bindings(family("boolean")); assert_eq!(out.matches("pub struct ").count(), 1); - assert!(out.contains("`eql_v3.bool` — storage-only domain.")); - assert_eq!(field_idents(&out, "Bool"), ["v", "i", "c"]); + assert!(out.contains("`eql_v3.boolean` — storage-only domain.")); + assert_eq!(field_idents(&out, "Boolean"), ["v", "i", "c"]); assert!(out.contains("use crate::v3::terms::")); assert!(!out.contains("Hmac256")); assert!(!out.contains("OreBlock256")); @@ -481,7 +481,7 @@ mod tests { let written = generate_bindings(tmp.path()).unwrap(); let dir = tmp.path().join("crates/eql-bindings/src/v3"); assert_eq!(written.len(), eql_domains::scalar_families().count() + 1); - assert!(dir.join("int4.rs").is_file()); + assert!(dir.join("integer.rs").is_file()); assert!(dir.join("text.rs").is_file()); assert!(dir.join("inventory.rs").is_file()); assert!( @@ -507,7 +507,7 @@ mod tests { let tmp = crate::writer::test_support::tempdir(); let dir = tmp.path().join(V3_BINDINGS_DIR); std::fs::create_dir_all(&dir).unwrap(); - let sentinel = dir.join("int4.rs"); + let sentinel = dir.join("integer.rs"); std::fs::write(&sentinel, "SENTINEL").unwrap(); let rendered = render_bindings(&dir); @@ -533,9 +533,9 @@ mod tests { assert!(out.starts_with(crate::consts::RUST_GENERATED_MARKER)); assert!(out.contains("pub fn all() -> Vec>")); assert!(!out.contains("pub mod ")); - let first = out.find("PhantomData::").unwrap(); + let first = out.find("PhantomData::").unwrap(); let last = out - .find("PhantomData::") + .find("PhantomData::") .unwrap(); assert!(first < last); for ty in [ @@ -563,20 +563,20 @@ mod tests { // trait object (`DomainType::term_json_keys`) and validates converted // payloads through `DomainType::parse_value` — both must be emitted on // every generated scalar impl, derived from `Term::term_json_keys`. - let int4 = render_family_bindings(family("int4")); - assert!(int4.contains("fn term_json_keys_static() -> Option<&'static [&'static str]>")); - assert!(int4.contains("fn term_json_keys(&self) -> Option<&'static [&'static str]>")); + let integer = render_family_bindings(family("integer")); + assert!(integer.contains("fn term_json_keys_static() -> Option<&'static [&'static str]>")); + assert!(integer.contains("fn term_json_keys(&self) -> Option<&'static [&'static str]>")); assert!( - int4.contains("fn parse_value("), + integer.contains("fn parse_value("), "generated impls must emit parse_value" ); // Storage-only domain: an EMPTY key list (Some, not None — None is the // non-scalar SteVec marker). - assert!(int4.contains("Some(&[])")); + assert!(integer.contains("Some(&[])")); // Single-term equality domain. - assert!(int4.contains(r#"&["hm"]"#)); + assert!(integer.contains(r#"&["hm"]"#)); // OPE ordering domain. - assert!(int4.contains(r#"&["op"]"#)); + assert!(integer.contains(r#"&["op"]"#)); // Multi-term domains list keys in catalog (wire) order. let text = render_family_bindings(family("text")); @@ -592,8 +592,8 @@ mod tests { // together: the leading fields of a generated struct must equal // `ENVELOPE_KEYS`, in order, so a change to the catalog's envelope keys // can't silently diverge from the emitter. - let out = render_family_bindings(family("int4")); - let leading: Vec = field_idents(&out, "Int4"); + let out = render_family_bindings(family("integer")); + let leading: Vec = field_idents(&out, "Integer"); let expected: Vec = eql_domains::ENVELOPE_KEYS .iter() .map(|k| k.to_string()) diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs index 6b422c79b..81a314bad 100644 --- a/crates/eql-codegen/src/consts.rs +++ b/crates/eql-codegen/src/consts.rs @@ -79,7 +79,7 @@ mod tests { fn sql_str_doubles_single_quotes() { assert_eq!(sql_str("o'brien"), "o''brien"); assert_eq!(sql_str("a'b'c"), "a''b''c"); - assert_eq!(sql_str("int4_eq"), "int4_eq"); + assert_eq!(sql_str("integer_eq"), "integer_eq"); assert_eq!(sql_str("<="), "<="); } } diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index e4b206979..fdabe04c3 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -57,8 +57,8 @@ pub fn environment() -> minijinja::Environment<'static> { /// One idempotent CREATE DOMAIN block, with SQL-required values precomputed. #[derive(serde::Serialize)] pub struct DomainBlock { - pub typname: String, // sql_str-escaped bare name, e.g. int4_ord_ore - pub name: String, // raw bare name (unescaped), e.g. int4_ord_ore + pub typname: String, // sql_str-escaped bare name, e.g. integer_ord_ore + pub name: String, // raw bare name (unescaped), e.g. integer_ord_ore pub keys: Vec, // ordered, sql_str-escaped key tokens (envelope + ciphertext + term keys) // sql_str-escaped keys whose payload must be a non-empty array (the ORE term // `ob`). Derived from the domain's terms exactly like `keys`, so the template @@ -122,7 +122,7 @@ pub enum FnEntry { function_name: String, // e.g. eq args: [SqlParam; 2], call_a: String, // e.g. eql_v3.eq_term(a) (embeds extract_arg cast logic) - call_b: String, // e.g. eql_v3.eq_term(b::eql_v3.int4_eq) + call_b: String, // e.g. eql_v3.eq_term(b::eql_v3.integer_eq) }, Unsupported { operator_lit: String, // sql_str(op), escaped content for the RAISE literal @@ -137,7 +137,7 @@ pub struct FunctionsContext { pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:" pub family_name: String, pub name: String, // full domain name (family-name + "_" + domain-name) - pub dom: String, // schema-qualified domain, e.g. eql_v3.int4_eq + pub dom: String, // schema-qualified domain, e.g. eql_v3.integer_eq pub domain_lit: String, // sql_str(dom), defensively escaped for the RAISE literal pub entries: Vec, } @@ -256,7 +256,7 @@ pub struct AggregatesContext { pub aggregates: &'static [AggregateOp], // == AGGREGATE_OPS } -/// The schema-qualified SQL domain type name, e.g. `eql_v3.int4_eq`. +/// The schema-qualified SQL domain type name, e.g. `eql_v3.integer_eq`. /// Port of `domain_name`. pub fn domain_name(name: &str) -> String { format!("{SCHEMA}.{name}") @@ -307,7 +307,7 @@ mod tests { #[test] fn domain_name_qualifies_with_schema() { - assert_eq!(domain_name("int4_eq"), "eql_v3.int4_eq"); + assert_eq!(domain_name("integer_eq"), "eql_v3.integer_eq"); } #[test] @@ -360,14 +360,14 @@ mod tests { // Supported comparison operator carries its planner metadata. ( "=", - "eql_v3.int4_eq", + "eql_v3.integer_eq", true, Some("COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel"), ), // The same operator, unsupported on this domain → no metadata line. - ("=", "eql_v3.int4", false, None), + ("=", "eql_v3.integer", false, None), // Supported but metadata-less operator (`->`) → still no metadata. - ("->", "eql_v3.int4_eq", true, None), + ("->", "eql_v3.integer_eq", true, None), // `@>` carries containment metadata when supported (the Bloom // `text_match` path). ( @@ -377,8 +377,8 @@ mod tests { Some("COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel"), ), // ... but suppressed when `@>` is a blocker (non-Bloom domains), - // which is why the int4 reference is unchanged. - ("@>", "eql_v3.int4_eq", false, None), + // which is why the integer reference is unchanged. + ("@>", "eql_v3.integer_eq", false, None), ]; for (symbol, dom, supported, expected) in cases { diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 9b6f1e5e7..d527eb5f0 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -16,7 +16,7 @@ pub struct CatalogDump { #[derive(Serialize)] pub struct TypeEntry { - /// Catalog token, e.g. `int4`. + /// Catalog token, e.g. `integer`. pub token: &'static str, /// True when the type has no `_ord` domain (storage + `_eq` only). pub is_eq_only: bool, @@ -74,34 +74,34 @@ mod tests { use super::*; #[test] - fn int4_exposes_all_ordered_domains_with_operators() { + fn integer_exposes_all_ordered_domains_with_operators() { let dump = dump_catalog(); - let int4 = dump + let integer = dump .types .iter() - .find(|t| t.token == "int4") - .expect("int4 present in catalog"); - assert!(!int4.is_eq_only, "int4 is an ordered type"); + .find(|t| t.token == "integer") + .expect("integer present in catalog"); + assert!(!integer.is_eq_only, "integer is an ordered type"); - let segments: Vec<&str> = int4.domains.iter().map(|d| d.segment.as_str()).collect(); + let segments: Vec<&str> = integer.domains.iter().map(|d| d.segment.as_str()).collect(); assert_eq!(segments, ["storage", "eq", "ord_ore", "ord", "ord_ope"]); - let storage = int4 + let storage = integer .domains .iter() .find(|d| d.segment == "storage") .unwrap(); assert!(storage.supported_ops.is_empty(), "storage has no operators"); - let eq = int4.domains.iter().find(|d| d.segment == "eq").unwrap(); + let eq = integer.domains.iter().find(|d| d.segment == "eq").unwrap(); assert_eq!(eq.supported_ops, ["=", "<>"]); - let ord = int4.domains.iter().find(|d| d.segment == "ord").unwrap(); + let ord = integer.domains.iter().find(|d| d.segment == "ord").unwrap(); assert_eq!(ord.supported_ops, ["=", "<>", "<", "<=", ">", ">="]); // `ord_ope` (CLLW-OPE) advertises the same operator set as the // block-ORE ordered domains — only the term/extractor differ. - let ord_ope = int4 + let ord_ope = integer .domains .iter() .find(|d| d.segment == "ord_ope") @@ -114,15 +114,15 @@ mod tests { /// byte-stable after the catalog dropped the leading underscore from its /// stored (now bare) domain names. #[test] - fn int4_suffix_field_is_underscore_prefixed() { + fn integer_suffix_field_is_underscore_prefixed() { let dump = dump_catalog(); - let int4 = dump + let integer = dump .types .iter() - .find(|t| t.token == "int4") - .expect("int4 present in catalog"); + .find(|t| t.token == "integer") + .expect("integer present in catalog"); - let suffixes: Vec<&str> = int4.domains.iter().map(|d| d.suffix.as_str()).collect(); + let suffixes: Vec<&str> = integer.domains.iter().map(|d| d.suffix.as_str()).collect(); assert_eq!(suffixes, ["", "_eq", "_ord_ore", "_ord", "_ord_ope"]); } @@ -130,7 +130,7 @@ mod tests { fn timestamp_is_ordered() { // timestamp was promoted to the ordered shape once // `compare_ore_block_256_term` generalized to N blocks (see #284 / the - // `EQ_ONLY_DOMAINS` note in `eql-domains`). It now mirrors int4's + // `EQ_ONLY_DOMAINS` note in `eql-domains`). It now mirrors integer's // four-domain ordered surface. let dump = dump_catalog(); let ts = dump @@ -165,6 +165,6 @@ mod tests { dump.types.iter().map(|t| t.token).collect::>() ); // Sanity: the scalar families are still present (the filter isn't empty). - assert!(dump.types.iter().any(|t| t.token == "int4")); + assert!(dump.types.iter().any(|t| t.token == "integer")); } } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 2ac184950..ace078757 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -370,9 +370,9 @@ mod tests { #[test] fn functions_render_supported_wrappers_and_unsupported_entries_from_catalog() { - let s = spec("int4"); + let s = spec("integer"); let d = domain(s, "eq"); - let sql = render_functions_file("int4", d); + let sql = render_functions_file("integer", d); // Supported wrapper (`=`) is PUBLIC; unsupported ops (`<`, `->` on an // equality-only domain) stay as internal blockers. assert!(sql.contains("CREATE FUNCTION eql_v3.eq(")); @@ -386,29 +386,29 @@ mod tests { #[test] fn generate_type_writes_expected_files() { let d = crate::writer::test_support::tempdir(); - let s = spec("int4"); - let out = d.path().join("int4"); + let s = spec("integer"); + let out = d.path().join("integer"); let written = generate_type(s, &out).unwrap(); let names: Vec = written .iter() .map(|p| p.file_name().unwrap().to_str().unwrap().to_string()) .collect(); - assert!(names.contains(&"int4_types.sql".to_string())); + assert!(names.contains(&"integer_types.sql".to_string())); for dom in [ - "int4", - "int4_eq", - "int4_ord_ore", - "int4_ord", - "int4_ord_ope", + "integer", + "integer_eq", + "integer_ord_ore", + "integer_ord", + "integer_ord_ope", ] { assert!(names.contains(&format!("{dom}_functions.sql"))); assert!(names.contains(&format!("{dom}_operators.sql"))); } - assert!(!names.contains(&"int4_aggregates.sql".to_string())); - assert!(!names.contains(&"int4_eq_aggregates.sql".to_string())); - assert!(names.contains(&"int4_ord_ore_aggregates.sql".to_string())); - assert!(names.contains(&"int4_ord_aggregates.sql".to_string())); - assert!(names.contains(&"int4_ord_ope_aggregates.sql".to_string())); + assert!(!names.contains(&"integer_aggregates.sql".to_string())); + assert!(!names.contains(&"integer_eq_aggregates.sql".to_string())); + assert!(names.contains(&"integer_ord_ore_aggregates.sql".to_string())); + assert!(names.contains(&"integer_ord_aggregates.sql".to_string())); + assert!(names.contains(&"integer_ord_ope_aggregates.sql".to_string())); // 1 types + 2 per domain (5 domains) + 3 ord-capable aggregates. assert_eq!(written.len(), 14); for p in &written { @@ -421,13 +421,13 @@ mod tests { #[test] fn generate_type_prunes_orphaned_generated_files() { // A generated file for a domain no longer produced (here: a stale - // `int4_gone_functions.sql`) is pruned by the trailing orphan sweep, while + // `integer_gone_functions.sql`) is pruned by the trailing orphan sweep, while // a hand-written file with no marker survives. let d = crate::writer::test_support::tempdir(); - let out = d.path().join("int4"); + let out = d.path().join("integer"); fs::create_dir_all(&out).unwrap(); - let orphan = out.join("int4_gone_functions.sql"); - let hand = out.join("int4_extensions.sql"); + let orphan = out.join("integer_gone_functions.sql"); + let hand = out.join("integer_extensions.sql"); fs::write( &orphan, format!("{}\nSELECT 1;\n", crate::consts::AUTO_GENERATED_MARKER), @@ -435,11 +435,14 @@ mod tests { .unwrap(); fs::write(&hand, "-- REQUIRE: src/v3/schema.sql\n-- hand-written\n").unwrap(); - generate_type(spec("int4"), &out).unwrap(); + generate_type(spec("integer"), &out).unwrap(); assert!(!orphan.exists(), "stale generated file must be pruned"); assert!(hand.exists(), "hand-written file must survive the sweep"); - assert!(out.join("int4_types.sql").exists(), "current files written"); + assert!( + out.join("integer_types.sql").exists(), + "current files written" + ); } #[cfg(unix)] @@ -451,11 +454,11 @@ mod tests { // survive untouched — the destructive orphan sweep never ran. use std::os::unix::fs::PermissionsExt; let d = crate::writer::test_support::tempdir(); - let out = d.path().join("int4"); + let out = d.path().join("integer"); fs::create_dir_all(&out).unwrap(); let marker = crate::consts::AUTO_GENERATED_MARKER; - let types = out.join("int4_types.sql"); - let orphan = out.join("int4_gone_functions.sql"); + let types = out.join("integer_types.sql"); + let orphan = out.join("integer_gone_functions.sql"); let old = format!("{marker}\n-- OLD\n"); fs::write(&types, &old).unwrap(); fs::write(&orphan, format!("{marker}\nSELECT 1;\n")).unwrap(); @@ -464,7 +467,7 @@ mod tests { perms.set_mode(0o555); fs::set_permissions(&out, perms).unwrap(); - let err = generate_type(spec("int4"), &out).unwrap_err(); + let err = generate_type(spec("integer"), &out).unwrap_err(); let mut perms = fs::metadata(&out).unwrap().permissions(); perms.set_mode(0o755); @@ -512,7 +515,7 @@ mod tests { ); assert!( root.join(V3_SCALARS_DIR) - .join("int4/int4_types.sql") + .join("integer/integer_types.sql") .exists(), "catalog types are generated" ); @@ -536,7 +539,7 @@ mod tests { // it could reach it. let outside = d.path().join("outside-target"); fs::create_dir_all(&outside).unwrap(); - let victim = outside.join("int4_types.sql"); + let victim = outside.join("integer_types.sql"); fs::write( &victim, format!("{}\nSELECT 1;\n", crate::consts::AUTO_GENERATED_MARKER), @@ -556,14 +559,14 @@ mod tests { #[test] fn types_file_has_all_five_domains() { - let sql = render_types_file(spec("int4")); + let sql = render_types_file(spec("integer")); assert!(sql.contains("-- REQUIRE: src/v3/schema.sql")); for dom in [ - "int4", - "int4_eq", - "int4_ord_ore", - "int4_ord", - "int4_ord_ope", + "integer", + "integer_eq", + "integer_ord_ore", + "integer_ord", + "integer_ord_ope", ] { assert!( sql.contains(&format!("CREATE DOMAIN eql_v3.{dom} AS jsonb")), @@ -575,23 +578,23 @@ mod tests { /// The non-empty-`ob` CHECK (issue #262) is emitted only on ORE-bearing /// domains. An empty ORE term (`ob: []`) is what encrypting the empty string /// into an ordered column produces; the constraint rejects it at the domain - /// boundary. Storage-only (`int4`) and equality-only (`int4_eq`) domains carry + /// boundary. Storage-only (`integer`) and equality-only (`integer_eq`) domains carry /// no `ob`, so they must NOT gain the clause. #[test] fn ore_bearing_domains_reject_empty_ob() { // Per-domain assertion: a domain's CREATE block carries the clause iff it // is ORE-bearing. Slice each domain's CHECK out of the rendered file so a // clause on the wrong domain cannot pass via whole-file `contains`. - let sql = render_types_file(spec("int4")); + let sql = render_types_file(spec("integer")); let clause = "jsonb_array_length(VALUE -> 'ob') > 0"; for (dom, expected) in [ - ("int4", false), - ("int4_eq", false), - ("int4_ord", true), - ("int4_ord_ore", true), + ("integer", false), + ("integer_eq", false), + ("integer_ord", true), + ("integer_ord_ore", true), // The OPE term (`op`) is a single hex string, not an array — no // non-empty-array CHECK on the OPE-bearing domain. - ("int4_ord_ope", false), + ("integer_ord_ope", false), ] { let head = format!("CREATE DOMAIN eql_v3.{dom} AS jsonb"); let start = sql.find(&head).unwrap_or_else(|| panic!("missing {dom}")); @@ -608,7 +611,7 @@ mod tests { #[test] fn storage_functions_file_is_all_blockers() { - let s = spec("int4"); + let s = spec("integer"); let sql = render_functions_file(s.name, domain(s, "")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 44); assert!(!sql.contains("SET search_path")); @@ -622,10 +625,10 @@ mod tests { #[test] fn eq_functions_file_counts() { - let s = spec("int4"); + let s = spec("integer"); let sql = render_functions_file(s.name, domain(s, "eq")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); - assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq)")); + assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a eql_v3.integer_eq)")); assert!(sql.contains("RETURNS eql_v3_internal.hmac_256")); assert_eq!( sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") @@ -638,10 +641,10 @@ mod tests { #[test] fn ore_functions_file_counts() { - let s = spec("int4"); + let s = spec("integer"); let sql = render_functions_file(s.name, domain(s, "ord")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); - assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.int4_ord)")); + assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord)")); assert!(sql.contains("RETURNS eql_v3_internal.ore_block_256")); assert_eq!( sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") @@ -659,10 +662,10 @@ mod tests { // sole SEM REQUIRE edge is the extractor file: the bytea-backed // domain inherits native comparison operators, so there is no // hand-written operators.sql to depend on (unlike Ore). - let s = spec("int4"); + let s = spec("integer"); let sql = render_functions_file(s.name, domain(s, "ord_ope")); assert_eq!(sql.matches("CREATE FUNCTION").count(), 45); - assert!(sql.contains("CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.int4_ord_ope)")); + assert!(sql.contains("CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.integer_ord_ope)")); assert!(sql.contains("RETURNS eql_v3_internal.ope_cllw")); assert!(sql.contains("-- REQUIRE: src/v3/sem/ope_cllw/functions.sql")); assert!(!sql.contains("-- REQUIRE: src/v3/sem/ope_cllw/operators.sql")); @@ -676,7 +679,7 @@ mod tests { #[test] fn operators_file_has_forty_four() { - let s = spec("int4"); + let s = spec("integer"); let sql = render_operators_file(s.name, domain(s, "eq")); assert_eq!(sql.matches("CREATE OPERATOR").count(), 44); } @@ -687,9 +690,9 @@ mod tests { // SUPPORTED operator's backing function is PUBLIC (`eql_v3.`) // so it is callable by name without the operator; a BLOCKED operator's // backing function stays internal (`eql_v3_internal.`). - let s = spec("int4"); + let s = spec("integer"); let eq_sql = render_operators_file(s.name, domain(s, "eq")); - // `=` is supported on int4_eq → public wrapper. + // `=` is supported on integer_eq → public wrapper. assert!(eq_sql.contains("FUNCTION = eql_v3.eq,")); // `<` is unsupported on the equality-only domain → internal blocker. assert!(eq_sql.contains("FUNCTION = eql_v3_internal.lt,")); @@ -714,7 +717,7 @@ mod tests { #[test] fn aggregates_file_only_for_ord_variants() { - let s = spec("int4"); + let s = spec("integer"); assert!(render_aggregates_file(s.name, domain(s, "")).is_none()); assert!(render_aggregates_file(s.name, domain(s, "eq")).is_none()); assert!(render_aggregates_file(s.name, domain(s, "ord")).is_some()); @@ -724,23 +727,26 @@ mod tests { #[test] fn aggregates_file_carries_min_and_max_and_requires() { - let s = spec("int4"); + let s = spec("integer"); let sql = render_aggregates_file(s.name, domain(s, "ord")).unwrap(); assert_eq!(sql.matches("CREATE FUNCTION").count(), 2); assert_eq!(sql.matches("CREATE AGGREGATE").count(), 2); assert!(sql.contains("eql_v3_internal.min_sfunc")); assert!(sql.contains("eql_v3_internal.max_sfunc")); - assert!(sql.contains("-- REQUIRE: src/v3/scalars/int4/int4_ord_operators.sql")); - assert!(sql.contains("-- REQUIRE: src/v3/scalars/int4/int4_ord_functions.sql")); - assert!(sql.contains("-- REQUIRE: src/v3/scalars/int4/int4_types.sql")); + assert!(sql.contains("-- REQUIRE: src/v3/scalars/integer/integer_ord_operators.sql")); + assert!(sql.contains("-- REQUIRE: src/v3/scalars/integer/integer_ord_functions.sql")); + assert!(sql.contains("-- REQUIRE: src/v3/scalars/integer/integer_types.sql")); } #[test] fn ordered_files_byte_identical_modulo_typename() { - let s = spec("int4"); + let s = spec("integer"); let ord = domain(s, "ord"); let ore = domain(s, "ord_ore"); - let norm = |sql: String| sql.replace("int4_ord_ore", "T").replace("int4_ord", "T"); + let norm = |sql: String| { + sql.replace("integer_ord_ore", "T") + .replace("integer_ord", "T") + }; assert_eq!( norm(render_functions_file(s.name, ord)), norm(render_functions_file(s.name, ore)) @@ -759,9 +765,9 @@ mod tests { #[test] fn blockers_are_never_strict_and_always_plpgsql() { - let s = spec("int4"); + let s = spec("integer"); // Storage domain functions file is all blockers. - let sql = render_functions_file("int4", domain(s, "")); + let sql = render_functions_file("integer", domain(s, "")); // Every CREATE FUNCTION here is a blocker: none may be STRICT, all plpgsql. assert!(!sql.contains("STRICT"), "blocker marked STRICT"); assert_eq!( @@ -773,10 +779,10 @@ mod tests { #[test] fn inlinable_functions_have_no_set_search_path() { - let s = spec("int4"); + let s = spec("integer"); // Extractors and wrappers (eq/ord functions files) are inlinable SQL. for name in ["eq", "ord"] { - let sql = render_functions_file("int4", domain(s, name)); + let sql = render_functions_file("integer", domain(s, name)); // Inlinable rows are the LANGUAGE sql ones; none may pin search_path. for block in sql.split("CREATE FUNCTION").skip(1) { if block.contains("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE") { @@ -791,8 +797,8 @@ mod tests { #[test] fn aggregate_state_functions_are_plpgsql_not_inlinable() { - let s = spec("int4"); - let sql = render_aggregates_file("int4", domain(s, "ord")).unwrap(); + let s = spec("integer"); + let sql = render_aggregates_file("integer", domain(s, "ord")).unwrap(); assert_eq!(sql.matches("CREATE FUNCTION").count(), 2); assert_eq!( sql.matches("LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE") @@ -808,9 +814,9 @@ mod tests { #[test] fn generated_function_like_docs_keep_required_tags() { - let s = spec("int4"); + let s = spec("integer"); for d in s.domains { - let sql = render_functions_file("int4", d); + let sql = render_functions_file("integer", d); let functions = sql.matches("CREATE FUNCTION").count(); assert_eq!(sql.matches("--! @return").count(), functions); assert!( @@ -823,7 +829,7 @@ mod tests { ); } - let sql = render_aggregates_file("int4", domain(s, "ord")).unwrap(); + let sql = render_aggregates_file("integer", domain(s, "ord")).unwrap(); let function_like = sql.matches("CREATE FUNCTION").count() + sql.matches("CREATE AGGREGATE").count(); assert_eq!(sql.matches("--! @return").count(), function_like); @@ -868,15 +874,15 @@ mod tests { use crate::context::domain_block; use eql_domains::{Domain, Shape}; let block = domain_block( - "int4", + "integer", &Domain { name: "q", terms: &[], shape: Shape::Scalar, }, ); - assert_eq!(block.typname, "int4_q"); // no quote present → unchanged - // keys are sql_str-escaped key tokens; none should carry a bare unescaped quote. + assert_eq!(block.typname, "integer_q"); // no quote present → unchanged + // keys are sql_str-escaped key tokens; none should carry a bare unescaped quote. assert!(block.keys.iter().all(|k| !k.contains("o'"))); } } diff --git a/crates/eql-codegen/src/operator_surface.rs b/crates/eql-codegen/src/operator_surface.rs index a182fd0d0..a33aad1f8 100644 --- a/crates/eql-codegen/src/operator_surface.rs +++ b/crates/eql-codegen/src/operator_surface.rs @@ -386,7 +386,7 @@ mod tests { operator(op) .signatures .iter() - .map(|sig| sig.render("eql_v3.int4_ord")) + .map(|sig| sig.render("eql_v3.integer_ord")) .map(|sig| (sig.left, sig.right, sig.returns)) .collect() } @@ -398,8 +398,8 @@ mod tests { right: TypeSlot::Text, returns: TypeSlot::Boolean, }; - let rendered = sig.render("eql_v3.int4_eq"); - assert_eq!(rendered.left, "eql_v3.int4_eq"); + let rendered = sig.render("eql_v3.integer_eq"); + assert_eq!(rendered.left, "eql_v3.integer_eq"); assert_eq!(rendered.right, "text"); assert_eq!(rendered.returns, "boolean"); } @@ -410,26 +410,26 @@ mod tests { let rendered: Vec<_> = arrow .signatures .iter() - .map(|sig| sig.render("eql_v3.int4")) + .map(|sig| sig.render("eql_v3.integer")) .map(|sig| (sig.left, sig.right, sig.returns)) .collect(); assert_eq!( rendered, vec![ ( - "eql_v3.int4".to_string(), + "eql_v3.integer".to_string(), "text".to_string(), - "eql_v3.int4".to_string() + "eql_v3.integer".to_string() ), ( - "eql_v3.int4".to_string(), + "eql_v3.integer".to_string(), "integer".to_string(), - "eql_v3.int4".to_string() + "eql_v3.integer".to_string() ), ( "jsonb".to_string(), - "eql_v3.int4".to_string(), - "eql_v3.int4".to_string() + "eql_v3.integer".to_string(), + "eql_v3.integer".to_string() ), ] ); @@ -441,12 +441,20 @@ mod tests { rendered_signatures("="), vec![ ( - "eql_v3.int4_ord".into(), - "eql_v3.int4_ord".into(), + "eql_v3.integer_ord".into(), + "eql_v3.integer_ord".into(), + "boolean".into() + ), + ( + "eql_v3.integer_ord".into(), + "jsonb".into(), + "boolean".into() + ), + ( + "jsonb".into(), + "eql_v3.integer_ord".into(), "boolean".into() ), - ("eql_v3.int4_ord".into(), "jsonb".into(), "boolean".into()), - ("jsonb".into(), "eql_v3.int4_ord".into(), "boolean".into()), ] ); } @@ -457,17 +465,21 @@ mod tests { rendered_signatures("||"), vec![ ( - "eql_v3.int4_ord".into(), - "eql_v3.int4_ord".into(), + "eql_v3.integer_ord".into(), + "eql_v3.integer_ord".into(), "jsonb".into() ), - ("eql_v3.int4_ord".into(), "jsonb".into(), "jsonb".into()), - ("jsonb".into(), "eql_v3.int4_ord".into(), "jsonb".into()), + ("eql_v3.integer_ord".into(), "jsonb".into(), "jsonb".into()), + ("jsonb".into(), "eql_v3.integer_ord".into(), "jsonb".into()), ] ); assert_eq!( rendered_signatures("?|"), - vec![("eql_v3.int4_ord".into(), "text[]".into(), "boolean".into())] + vec![( + "eql_v3.integer_ord".into(), + "text[]".into(), + "boolean".into() + )] ); } @@ -478,18 +490,18 @@ mod tests { assert_eq!( rendered_signatures("@?"), vec![( - "eql_v3.int4_ord".into(), + "eql_v3.integer_ord".into(), "jsonpath".into(), "boolean".into() )] ); assert_eq!( rendered_signatures("#>"), - vec![("eql_v3.int4_ord".into(), "text[]".into(), "jsonb".into())] + vec![("eql_v3.integer_ord".into(), "text[]".into(), "jsonb".into())] ); assert_eq!( rendered_signatures("#>>"), - vec![("eql_v3.int4_ord".into(), "text[]".into(), "text".into())] + vec![("eql_v3.integer_ord".into(), "text[]".into(), "text".into())] ); } diff --git a/crates/eql-codegen/src/writer.rs b/crates/eql-codegen/src/writer.rs index e5f2c334e..de3f4cf01 100644 --- a/crates/eql-codegen/src/writer.rs +++ b/crates/eql-codegen/src/writer.rs @@ -270,8 +270,12 @@ mod tests { fn is_generated_recognises_rust_marker_and_ignores_sql_in_rs() { use crate::consts::RUST_GENERATED_MARKER; let d = tmp(); - let rs = d.path().join("int4.rs"); - fs::write(&rs, format!("{RUST_GENERATED_MARKER}\npub struct Int4;\n")).unwrap(); + let rs = d.path().join("integer.rs"); + fs::write( + &rs, + format!("{RUST_GENERATED_MARKER}\npub struct Integer;\n"), + ) + .unwrap(); assert!(is_generated(&rs, GeneratedKind::Rust).unwrap()); assert!(!is_generated(&rs, GeneratedKind::Sql).unwrap()); } @@ -280,12 +284,12 @@ mod tests { fn clean_filters_by_kind_extension() { use crate::consts::RUST_GENERATED_MARKER; let d = tmp(); - let gen_rs = d.path().join("int4.rs"); - let gen_sql = d.path().join("int4_types.sql"); + let gen_rs = d.path().join("integer.rs"); + let gen_sql = d.path().join("integer_types.sql"); let hand_rs = d.path().join("terms.rs"); fs::write( &gen_rs, - format!("{RUST_GENERATED_MARKER}\npub struct Int4;\n"), + format!("{RUST_GENERATED_MARKER}\npub struct Integer;\n"), ) .unwrap(); fs::write(&gen_sql, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); @@ -325,7 +329,7 @@ mod tests { #[test] fn write_generated_file_writes_rendered_body_verbatim() { let d = tmp(); - let p = d.path().join("int4_types.sql"); + let p = d.path().join("integer_types.sql"); // The template render carries the marker on line 1; the writer writes it // through unchanged. let body = format!("{AUTO_GENERATED_MARKER}\nDO $$ BEGIN END $$;\n"); @@ -338,7 +342,7 @@ mod tests { #[test] fn write_rejects_body_without_marker() { let d = tmp(); - let p = d.path().join("int4_types.sql"); + let p = d.path().join("integer_types.sql"); // A body whose first line is NOT the AUTO-GENERATED marker must be // rejected — the template is required to emit it. let body = "-- REQUIRE: src/v3/schema.sql\nDO $$ BEGIN END $$;\n"; @@ -354,7 +358,7 @@ mod tests { #[test] fn write_refuses_to_overwrite_handwritten() { let d = tmp(); - let p = d.path().join("int4_types.sql"); + let p = d.path().join("integer_types.sql"); fs::write(&p, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); let err = write_generated_file(&p, "DO $$ BEGIN END $$;\n", GeneratedKind::Sql).unwrap_err(); @@ -365,8 +369,8 @@ mod tests { #[test] fn preflight_refuses_handwritten_target() { let d = tmp(); - let generated = d.path().join("int4_types.sql"); - let hand = d.path().join("int4_eq_functions.sql"); + let generated = d.path().join("integer_types.sql"); + let hand = d.path().join("integer_eq_functions.sql"); fs::write( &generated, format!("{AUTO_GENERATED_MARKER}\n-- old generated\n"), @@ -376,7 +380,7 @@ mod tests { let err = ensure_generated_paths_writable(&[generated.clone(), hand.clone()], GeneratedKind::Sql) .unwrap_err(); - assert!(err.to_string().contains("int4_eq_functions.sql")); + assert!(err.to_string().contains("integer_eq_functions.sql")); assert!(generated.exists()); assert!(hand.exists()); } @@ -390,7 +394,7 @@ mod tests { // overwrite hand-written file (no AUTO-GENERATED header)". The read // failure must surface distinctly instead. let d = tmp(); - let p = d.path().join("int4.rs"); + let p = d.path().join("integer.rs"); fs::write(&p, [0xff, 0xfe, 0x00]).unwrap(); let err = ensure_generated_paths_writable(std::slice::from_ref(&p), GeneratedKind::Rust) .unwrap_err(); @@ -411,7 +415,7 @@ mod tests { // for a broken link), so the path is treated as a non-generated entry that // must not be silently overwritten. let d = tmp(); - let link = d.path().join("int4.rs"); + let link = d.path().join("integer.rs"); let missing_target = d.path().join("does-not-exist"); std::os::unix::fs::symlink(&missing_target, &link).unwrap(); assert!( @@ -447,7 +451,7 @@ mod tests { #[test] fn write_overwrites_existing_generated_file() { let d = tmp(); - let p = d.path().join("int4_types.sql"); + let p = d.path().join("integer_types.sql"); fs::write(&p, format!("{AUTO_GENERATED_MARKER}\n-- old content\n")).unwrap(); write_generated_file( &p, @@ -463,9 +467,9 @@ mod tests { #[test] fn clean_removes_only_generated_files() { let d = tmp(); - let gen1 = d.path().join("int4_eq_functions.sql"); - let gen2 = d.path().join("int4_old_domain_functions.sql"); - let hand = d.path().join("int4_jsonb_extra.sql"); + let gen1 = d.path().join("integer_eq_functions.sql"); + let gen2 = d.path().join("integer_old_domain_functions.sql"); + let hand = d.path().join("integer_jsonb_extra.sql"); fs::write(&gen1, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); fs::write(&gen2, format!("{AUTO_GENERATED_MARKER}\nSELECT 2;\n")).unwrap(); fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); @@ -489,7 +493,7 @@ mod tests { // The atomic temp+rename must not leave its sibling temp file behind on a // successful write — only the final target should remain. let d = tmp(); - let p = d.path().join("int4_types.sql"); + let p = d.path().join("integer_types.sql"); let body = format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n"); write_generated_file(&p, &body, GeneratedKind::Sql).unwrap(); let leftovers: Vec = fs::read_dir(d.path()) @@ -518,7 +522,7 @@ mod tests { // and no temp debris may survive. use std::os::unix::fs::PermissionsExt; let d = tmp(); - let p = d.path().join("int4_types.sql"); + let p = d.path().join("integer_types.sql"); let old = format!("{AUTO_GENERATED_MARKER}\n-- OLD content\n"); fs::write(&p, &old).unwrap(); @@ -557,9 +561,9 @@ mod tests { // NOT just written; files in `keep` and hand-written (no marker) files // always survive. let d = tmp(); - let kept = d.path().join("int4_eq_functions.sql"); // generated, in keep - let orphan = d.path().join("int4_gone_functions.sql"); // generated, dropped - let hand = d.path().join("int4_extensions.sql"); // hand-written, no marker + let kept = d.path().join("integer_eq_functions.sql"); // generated, in keep + let orphan = d.path().join("integer_gone_functions.sql"); // generated, dropped + let hand = d.path().join("integer_extensions.sql"); // hand-written, no marker fs::write(&kept, format!("{AUTO_GENERATED_MARKER}\nSELECT 1;\n")).unwrap(); fs::write(&orphan, format!("{AUTO_GENERATED_MARKER}\nSELECT 2;\n")).unwrap(); fs::write(&hand, "-- REQUIRE: src/schema.sql\n-- hand-written\n").unwrap(); @@ -581,7 +585,7 @@ mod tests { let d = tmp(); let blocker = d.path().join("not-a-dir"); fs::write(&blocker, "i am a file\n").unwrap(); - let target = blocker.join("int4_types.sql"); // parent is a file + let target = blocker.join("integer_types.sql"); // parent is a file let body = format!("{AUTO_GENERATED_MARKER}\nDO $$ BEGIN END $$;\n"); let err = write_generated_file(&target, &body, GeneratedKind::Sql).unwrap_err(); assert!(matches!(err, WriteError::Io(_)), "expected Io, got {err:?}"); diff --git a/crates/eql-codegen/tests/bindings_parity.rs b/crates/eql-codegen/tests/bindings_parity.rs index 69e130adc..bc84ea39b 100644 --- a/crates/eql-codegen/tests/bindings_parity.rs +++ b/crates/eql-codegen/tests/bindings_parity.rs @@ -4,7 +4,7 @@ //! committed `crates/eql-bindings/src/v3/` tree, and that two runs produce //! identical bytes. Without this, committed-source freshness rested only on the //! CI-only `types:check` regen-diff, so a dev running `cargo test` alone would -//! miss a stale or hand-edited `int8.rs`/`inventory.rs`. +//! miss a stale or hand-edited `bigint.rs`/`inventory.rs`. use std::collections::BTreeSet; use std::fs; diff --git a/crates/eql-domains/src/fixtures/mod.rs b/crates/eql-domains/src/fixtures/mod.rs index ce30fca6e..b847e0f26 100644 --- a/crates/eql-domains/src/fixtures/mod.rs +++ b/crates/eql-domains/src/fixtures/mod.rs @@ -16,8 +16,8 @@ pub(crate) mod values; pub use fixture::Fixture; pub use kind::{BoundedIntKind, ScalarKind}; pub use record::{ - TypeFixtures, BOOLEAN_FIXTURES, DATE_FIXTURES, FIXTURES, REAL_FIXTURES, DOUBLE_FIXTURES, - SMALLINT_FIXTURES, INTEGER_FIXTURES, BIGINT_FIXTURES, JSONB_FIXTURES, NUMERIC_FIXTURES, TEXT_FIXTURES, - TIMESTAMP_FIXTURES, + TypeFixtures, BIGINT_FIXTURES, BOOLEAN_FIXTURES, DATE_FIXTURES, DOUBLE_FIXTURES, FIXTURES, + INTEGER_FIXTURES, JSONB_FIXTURES, NUMERIC_FIXTURES, REAL_FIXTURES, SMALLINT_FIXTURES, + TEXT_FIXTURES, TIMESTAMP_FIXTURES, }; -pub use values::{SMALLINT_VALUES, INTEGER_VALUES, BIGINT_VALUES, TEXT_VALUES}; +pub use values::{BIGINT_VALUES, INTEGER_VALUES, SMALLINT_VALUES, TEXT_VALUES}; diff --git a/crates/eql-domains/src/fixtures/values.rs b/crates/eql-domains/src/fixtures/values.rs index 0c9d46f47..594da1cf4 100644 --- a/crates/eql-domains/src/fixtures/values.rs +++ b/crates/eql-domains/src/fixtures/values.rs @@ -4,7 +4,9 @@ //! generator encrypts. No committed generated `.rs` round-trip. use super::fixture::Fixture; -use super::record::{TypeFixtures, SMALLINT_FIXTURES, INTEGER_FIXTURES, BIGINT_FIXTURES, TEXT_FIXTURES}; +use super::record::{ + TypeFixtures, BIGINT_FIXTURES, INTEGER_FIXTURES, SMALLINT_FIXTURES, TEXT_FIXTURES, +}; /// Materialise an integer record's fixtures into a typed `&'static` slice at /// compile time. Integer kinds only: a non-numeric fixture is a const-eval diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index df0b5c0fc..1504a49bd 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -27,10 +27,10 @@ mod spec; mod term; pub use fixtures::{ - BoundedIntKind, Fixture, ScalarKind, TypeFixtures, BOOLEAN_FIXTURES, DATE_FIXTURES, FIXTURES, - REAL_FIXTURES, DOUBLE_FIXTURES, SMALLINT_FIXTURES, SMALLINT_VALUES, INTEGER_FIXTURES, INTEGER_VALUES, - BIGINT_FIXTURES, BIGINT_VALUES, JSONB_FIXTURES, NUMERIC_FIXTURES, TEXT_FIXTURES, TEXT_VALUES, - TIMESTAMP_FIXTURES, + BoundedIntKind, Fixture, ScalarKind, TypeFixtures, BIGINT_FIXTURES, BIGINT_VALUES, + BOOLEAN_FIXTURES, DATE_FIXTURES, DOUBLE_FIXTURES, FIXTURES, INTEGER_FIXTURES, INTEGER_VALUES, + JSONB_FIXTURES, NUMERIC_FIXTURES, REAL_FIXTURES, SMALLINT_FIXTURES, SMALLINT_VALUES, + TEXT_FIXTURES, TEXT_VALUES, TIMESTAMP_FIXTURES, }; /// Always-present payload keys required by every generated domain CHECK, diff --git a/crates/eql-tests-macros/src/lib.rs b/crates/eql-tests-macros/src/lib.rs index d662187ad..b78046cd3 100644 --- a/crates/eql-tests-macros/src/lib.rs +++ b/crates/eql-tests-macros/src/lib.rs @@ -501,7 +501,8 @@ mod tests { #[test] fn temporal_entry_skips_impl_and_stamps_temporal_fixture() { // No marker: `date`'s temporal shape is read from eql-domains::CATALOG. - let list = syn::parse_str::("integer => i32, date => chrono::NaiveDate").unwrap(); + let list = + syn::parse_str::("integer => i32, date => chrono::NaiveDate").unwrap(); // Impl emitter skips the temporal entry (handed to `temporal_values!`). let impls = norm(&scalar_type_impls_tokens(&list)); assert!(impls.contains("impl ScalarType for i32")); @@ -769,7 +770,8 @@ mod tests { // Both base types are ordered, so the emitter routes them through the // unified wrapper with the ordered capability marker and never names // either of the now-deleted parallel wrappers. - let list = syn::parse_str::("integer => i32, date => chrono::NaiveDate").unwrap(); + let list = + syn::parse_str::("integer => i32, date => chrono::NaiveDate").unwrap(); let out = norm(&scalar_matrix_suites_tokens(&list)); assert!(out.contains(":: eql_tests :: scalar_matrix !")); assert!(out.contains("caps = [eq , ord]")); diff --git a/tasks/test/clean_install_v3.sh b/tasks/test/clean_install_v3.sh index 426cc35ba..17f6d2b54 100755 --- a/tasks/test/clean_install_v3.sh +++ b/tasks/test/clean_install_v3.sh @@ -34,13 +34,13 @@ echo "==> asserting NO eql_v2 schema exists (proves no v2 dependency)" echo "==> smoke: domains, SEM types, extractors, opclass functional index (D4)" "${RUN[@]}" <<'SQL' -- Domains stay in eql_v3; SEM index-term types now live in eql_v3_internal. -SELECT 'eql_v3.int4_ord'::regtype; +SELECT 'eql_v3.integer_ord'::regtype; SELECT 'eql_v3_internal.hmac_256'::regtype; SELECT 'eql_v3_internal.ore_block_256'::regtype; -- A real ordered-domain column + the documented functional index. This is the -- D4 proof: it fails outright if the ported operator_class is absent. -CREATE TABLE v3_smoke (c eql_v3.int4_ord); +CREATE TABLE v3_smoke (c eql_v3.integer_ord); CREATE INDEX v3_smoke_ord ON v3_smoke (eql_v3.ord_term(c)); DROP TABLE v3_smoke; SQL @@ -53,10 +53,10 @@ DECLARE BEGIN -- The blocker always RAISEs; catch it and assert we got the expected message. BEGIN - PERFORM eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.int4', '<'); + PERFORM eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.integer', '<'); EXCEPTION WHEN OTHERS THEN raised := true; - IF SQLERRM <> 'operator < is not supported for eql_v3.int4' THEN + IF SQLERRM <> 'operator < is not supported for eql_v3.integer' THEN RAISE EXCEPTION 'blocker raised an unexpected message: %', SQLERRM; END IF; END; diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index 6a5b44239..04a122eda 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -56,14 +56,14 @@ SQL # Format: TSV "rule\tschema\tname\ttype\treason" — kept as a heredoc so the # justification lives next to the entry it covers. Keys are matched verbatim. cat > "$work_dir/allowlist.tsv" <<'ALLOW' -# Encrypted-domain families live in the eql_v3 schema (the int4 family and +# Encrypted-domain families live in the eql_v3 schema (the integer family and # future scalar domains). Their inlinable extractors and comparison wrappers # must stay unpinned for functional-index matching; splinter matches by # (schema, name, type), so # they need their own rows. The plpgsql blockers are pinned by # tasks/pin_search_path_v3.sql and do not surface here. function_search_path_mutable eql_v3 eq_term function HMAC equality term extractor for the eql_v3 *_eq domains: returns eql_v3.hmac_256. Must inline so `eql_v3.eq_term(col)` folds into the calling query and matches the functional hash/btree index built on the same expression. SET search_path would disable SQL function inlining (see PostgreSQL inline_function). -function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v3.ore_block_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.int4_ord, eql_v3.int4_ord_ore). +function_search_path_mutable eql_v3 ord_term function ORE-block order term extractor for the eql_v3 ordered domains: returns eql_v3.ore_block_256 (carrying the main DEFAULT btree opclass). Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_term(col)); must inline. Covers both ord_term overloads (eql_v3.integer_ord, eql_v3.integer_ord_ore). function_search_path_mutable eql_v3 match_term function Bloom-filter match term extractor for the eql_v3 *_match domains: returns eql_v3.bloom_filter. Used inside the inlinable @>/<@ containment wrappers and as the functional-index expression USING gin (eql_v3.match_term(col)); must inline so the GIN index engages. SET search_path would disable SQL function inlining. function_search_path_mutable eql_v3 contains function Containment (@>) comparison wrapper on the eql_v3 *_match domains — the public function-form equivalent of @> (callable without the operator on Supabase/PostgREST); the CREATE OPERATOR also lives in eql_v3. Inlines to `match_term(a) @> match_term(b)`; must reach the functional GIN index on eql_v3.match_term(col) for bloom-filter match to engage Bitmap Index Scan. function_search_path_mutable eql_v3 contained_by function Contained-by (<@) comparison wrapper on the eql_v3 *_match domains — public function-form equivalent of <@. Same rationale as eql_v3.contains. diff --git a/tests/sqlx/snapshots/eql_v3_public_surface.txt b/tests/sqlx/snapshots/eql_v3_public_surface.txt index 2855e7a2c..46a0b922a 100644 --- a/tests/sqlx/snapshots/eql_v3_public_surface.txt +++ b/tests/sqlx/snapshots/eql_v3_public_surface.txt @@ -1,25 +1,25 @@ +aggregate eql_v3.max(eql_v3.bigint_ord) +aggregate eql_v3.max(eql_v3.bigint_ord_ope) +aggregate eql_v3.max(eql_v3.bigint_ord_ore) aggregate eql_v3.max(eql_v3.date_ord) aggregate eql_v3.max(eql_v3.date_ord_ope) aggregate eql_v3.max(eql_v3.date_ord_ore) -aggregate eql_v3.max(eql_v3.float4_ord) -aggregate eql_v3.max(eql_v3.float4_ord_ope) -aggregate eql_v3.max(eql_v3.float4_ord_ore) -aggregate eql_v3.max(eql_v3.float8_ord) -aggregate eql_v3.max(eql_v3.float8_ord_ope) -aggregate eql_v3.max(eql_v3.float8_ord_ore) -aggregate eql_v3.max(eql_v3.int2_ord) -aggregate eql_v3.max(eql_v3.int2_ord_ope) -aggregate eql_v3.max(eql_v3.int2_ord_ore) -aggregate eql_v3.max(eql_v3.int4_ord) -aggregate eql_v3.max(eql_v3.int4_ord_ope) -aggregate eql_v3.max(eql_v3.int4_ord_ore) -aggregate eql_v3.max(eql_v3.int8_ord) -aggregate eql_v3.max(eql_v3.int8_ord_ope) -aggregate eql_v3.max(eql_v3.int8_ord_ore) +aggregate eql_v3.max(eql_v3.double_ord) +aggregate eql_v3.max(eql_v3.double_ord_ope) +aggregate eql_v3.max(eql_v3.double_ord_ore) +aggregate eql_v3.max(eql_v3.integer_ord) +aggregate eql_v3.max(eql_v3.integer_ord_ope) +aggregate eql_v3.max(eql_v3.integer_ord_ore) aggregate eql_v3.max(eql_v3.jsonb_entry) aggregate eql_v3.max(eql_v3.numeric_ord) aggregate eql_v3.max(eql_v3.numeric_ord_ope) aggregate eql_v3.max(eql_v3.numeric_ord_ore) +aggregate eql_v3.max(eql_v3.real_ord) +aggregate eql_v3.max(eql_v3.real_ord_ope) +aggregate eql_v3.max(eql_v3.real_ord_ore) +aggregate eql_v3.max(eql_v3.smallint_ord) +aggregate eql_v3.max(eql_v3.smallint_ord_ope) +aggregate eql_v3.max(eql_v3.smallint_ord_ore) aggregate eql_v3.max(eql_v3.text_ord) aggregate eql_v3.max(eql_v3.text_ord_ope) aggregate eql_v3.max(eql_v3.text_ord_ore) @@ -27,28 +27,28 @@ aggregate eql_v3.max(eql_v3.text_search) aggregate eql_v3.max(eql_v3.timestamp_ord) aggregate eql_v3.max(eql_v3.timestamp_ord_ope) aggregate eql_v3.max(eql_v3.timestamp_ord_ore) +aggregate eql_v3.min(eql_v3.bigint_ord) +aggregate eql_v3.min(eql_v3.bigint_ord_ope) +aggregate eql_v3.min(eql_v3.bigint_ord_ore) aggregate eql_v3.min(eql_v3.date_ord) aggregate eql_v3.min(eql_v3.date_ord_ope) aggregate eql_v3.min(eql_v3.date_ord_ore) -aggregate eql_v3.min(eql_v3.float4_ord) -aggregate eql_v3.min(eql_v3.float4_ord_ope) -aggregate eql_v3.min(eql_v3.float4_ord_ore) -aggregate eql_v3.min(eql_v3.float8_ord) -aggregate eql_v3.min(eql_v3.float8_ord_ope) -aggregate eql_v3.min(eql_v3.float8_ord_ore) -aggregate eql_v3.min(eql_v3.int2_ord) -aggregate eql_v3.min(eql_v3.int2_ord_ope) -aggregate eql_v3.min(eql_v3.int2_ord_ore) -aggregate eql_v3.min(eql_v3.int4_ord) -aggregate eql_v3.min(eql_v3.int4_ord_ope) -aggregate eql_v3.min(eql_v3.int4_ord_ore) -aggregate eql_v3.min(eql_v3.int8_ord) -aggregate eql_v3.min(eql_v3.int8_ord_ope) -aggregate eql_v3.min(eql_v3.int8_ord_ore) +aggregate eql_v3.min(eql_v3.double_ord) +aggregate eql_v3.min(eql_v3.double_ord_ope) +aggregate eql_v3.min(eql_v3.double_ord_ore) +aggregate eql_v3.min(eql_v3.integer_ord) +aggregate eql_v3.min(eql_v3.integer_ord_ope) +aggregate eql_v3.min(eql_v3.integer_ord_ore) aggregate eql_v3.min(eql_v3.jsonb_entry) aggregate eql_v3.min(eql_v3.numeric_ord) aggregate eql_v3.min(eql_v3.numeric_ord_ope) aggregate eql_v3.min(eql_v3.numeric_ord_ore) +aggregate eql_v3.min(eql_v3.real_ord) +aggregate eql_v3.min(eql_v3.real_ord_ope) +aggregate eql_v3.min(eql_v3.real_ord_ore) +aggregate eql_v3.min(eql_v3.smallint_ord) +aggregate eql_v3.min(eql_v3.smallint_ord_ope) +aggregate eql_v3.min(eql_v3.smallint_ord_ore) aggregate eql_v3.min(eql_v3.text_ord) aggregate eql_v3.min(eql_v3.text_ord_ope) aggregate eql_v3.min(eql_v3.text_ord_ore) @@ -80,6 +80,14 @@ function eql_v3.contains(a eql_v3.text_search, b eql_v3.text_search) function eql_v3.contains(a eql_v3.text_search, b jsonb) function eql_v3.contains(a jsonb, b eql_v3.text_match) function eql_v3.contains(a jsonb, b eql_v3.text_search) +function eql_v3.eq(a eql_v3.bigint_eq, b eql_v3.bigint_eq) +function eql_v3.eq(a eql_v3.bigint_eq, b jsonb) +function eql_v3.eq(a eql_v3.bigint_ord, b eql_v3.bigint_ord) +function eql_v3.eq(a eql_v3.bigint_ord, b jsonb) +function eql_v3.eq(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope) +function eql_v3.eq(a eql_v3.bigint_ord_ope, b jsonb) +function eql_v3.eq(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore) +function eql_v3.eq(a eql_v3.bigint_ord_ore, b jsonb) function eql_v3.eq(a eql_v3.date_eq, b eql_v3.date_eq) function eql_v3.eq(a eql_v3.date_eq, b jsonb) function eql_v3.eq(a eql_v3.date_ord, b eql_v3.date_ord) @@ -88,46 +96,22 @@ function eql_v3.eq(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope) function eql_v3.eq(a eql_v3.date_ord_ope, b jsonb) function eql_v3.eq(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) function eql_v3.eq(a eql_v3.date_ord_ore, b jsonb) -function eql_v3.eq(a eql_v3.float4_eq, b eql_v3.float4_eq) -function eql_v3.eq(a eql_v3.float4_eq, b jsonb) -function eql_v3.eq(a eql_v3.float4_ord, b eql_v3.float4_ord) -function eql_v3.eq(a eql_v3.float4_ord, b jsonb) -function eql_v3.eq(a eql_v3.float4_ord_ope, b eql_v3.float4_ord_ope) -function eql_v3.eq(a eql_v3.float4_ord_ope, b jsonb) -function eql_v3.eq(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) -function eql_v3.eq(a eql_v3.float4_ord_ore, b jsonb) -function eql_v3.eq(a eql_v3.float8_eq, b eql_v3.float8_eq) -function eql_v3.eq(a eql_v3.float8_eq, b jsonb) -function eql_v3.eq(a eql_v3.float8_ord, b eql_v3.float8_ord) -function eql_v3.eq(a eql_v3.float8_ord, b jsonb) -function eql_v3.eq(a eql_v3.float8_ord_ope, b eql_v3.float8_ord_ope) -function eql_v3.eq(a eql_v3.float8_ord_ope, b jsonb) -function eql_v3.eq(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) -function eql_v3.eq(a eql_v3.float8_ord_ore, b jsonb) -function eql_v3.eq(a eql_v3.int2_eq, b eql_v3.int2_eq) -function eql_v3.eq(a eql_v3.int2_eq, b jsonb) -function eql_v3.eq(a eql_v3.int2_ord, b eql_v3.int2_ord) -function eql_v3.eq(a eql_v3.int2_ord, b jsonb) -function eql_v3.eq(a eql_v3.int2_ord_ope, b eql_v3.int2_ord_ope) -function eql_v3.eq(a eql_v3.int2_ord_ope, b jsonb) -function eql_v3.eq(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) -function eql_v3.eq(a eql_v3.int2_ord_ore, b jsonb) -function eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) -function eql_v3.eq(a eql_v3.int4_eq, b jsonb) -function eql_v3.eq(a eql_v3.int4_ord, b eql_v3.int4_ord) -function eql_v3.eq(a eql_v3.int4_ord, b jsonb) -function eql_v3.eq(a eql_v3.int4_ord_ope, b eql_v3.int4_ord_ope) -function eql_v3.eq(a eql_v3.int4_ord_ope, b jsonb) -function eql_v3.eq(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) -function eql_v3.eq(a eql_v3.int4_ord_ore, b jsonb) -function eql_v3.eq(a eql_v3.int8_eq, b eql_v3.int8_eq) -function eql_v3.eq(a eql_v3.int8_eq, b jsonb) -function eql_v3.eq(a eql_v3.int8_ord, b eql_v3.int8_ord) -function eql_v3.eq(a eql_v3.int8_ord, b jsonb) -function eql_v3.eq(a eql_v3.int8_ord_ope, b eql_v3.int8_ord_ope) -function eql_v3.eq(a eql_v3.int8_ord_ope, b jsonb) -function eql_v3.eq(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) -function eql_v3.eq(a eql_v3.int8_ord_ore, b jsonb) +function eql_v3.eq(a eql_v3.double_eq, b eql_v3.double_eq) +function eql_v3.eq(a eql_v3.double_eq, b jsonb) +function eql_v3.eq(a eql_v3.double_ord, b eql_v3.double_ord) +function eql_v3.eq(a eql_v3.double_ord, b jsonb) +function eql_v3.eq(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope) +function eql_v3.eq(a eql_v3.double_ord_ope, b jsonb) +function eql_v3.eq(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore) +function eql_v3.eq(a eql_v3.double_ord_ore, b jsonb) +function eql_v3.eq(a eql_v3.integer_eq, b eql_v3.integer_eq) +function eql_v3.eq(a eql_v3.integer_eq, b jsonb) +function eql_v3.eq(a eql_v3.integer_ord, b eql_v3.integer_ord) +function eql_v3.eq(a eql_v3.integer_ord, b jsonb) +function eql_v3.eq(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope) +function eql_v3.eq(a eql_v3.integer_ord_ope, b jsonb) +function eql_v3.eq(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore) +function eql_v3.eq(a eql_v3.integer_ord_ore, b jsonb) function eql_v3.eq(a eql_v3.jsonb_entry, b eql_v3.jsonb_entry) function eql_v3.eq(a eql_v3.numeric_eq, b eql_v3.numeric_eq) function eql_v3.eq(a eql_v3.numeric_eq, b jsonb) @@ -137,6 +121,22 @@ function eql_v3.eq(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope) function eql_v3.eq(a eql_v3.numeric_ord_ope, b jsonb) function eql_v3.eq(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) function eql_v3.eq(a eql_v3.numeric_ord_ore, b jsonb) +function eql_v3.eq(a eql_v3.real_eq, b eql_v3.real_eq) +function eql_v3.eq(a eql_v3.real_eq, b jsonb) +function eql_v3.eq(a eql_v3.real_ord, b eql_v3.real_ord) +function eql_v3.eq(a eql_v3.real_ord, b jsonb) +function eql_v3.eq(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope) +function eql_v3.eq(a eql_v3.real_ord_ope, b jsonb) +function eql_v3.eq(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore) +function eql_v3.eq(a eql_v3.real_ord_ore, b jsonb) +function eql_v3.eq(a eql_v3.smallint_eq, b eql_v3.smallint_eq) +function eql_v3.eq(a eql_v3.smallint_eq, b jsonb) +function eql_v3.eq(a eql_v3.smallint_ord, b eql_v3.smallint_ord) +function eql_v3.eq(a eql_v3.smallint_ord, b jsonb) +function eql_v3.eq(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope) +function eql_v3.eq(a eql_v3.smallint_ord_ope, b jsonb) +function eql_v3.eq(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore) +function eql_v3.eq(a eql_v3.smallint_ord_ore, b jsonb) function eql_v3.eq(a eql_v3.text_eq, b eql_v3.text_eq) function eql_v3.eq(a eql_v3.text_eq, b jsonb) function eql_v3.eq(a eql_v3.text_ord, b eql_v3.text_ord) @@ -155,34 +155,34 @@ function eql_v3.eq(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope) function eql_v3.eq(a eql_v3.timestamp_ord_ope, b jsonb) function eql_v3.eq(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore) function eql_v3.eq(a eql_v3.timestamp_ord_ore, b jsonb) +function eql_v3.eq(a jsonb, b eql_v3.bigint_eq) +function eql_v3.eq(a jsonb, b eql_v3.bigint_ord) +function eql_v3.eq(a jsonb, b eql_v3.bigint_ord_ope) +function eql_v3.eq(a jsonb, b eql_v3.bigint_ord_ore) function eql_v3.eq(a jsonb, b eql_v3.date_eq) function eql_v3.eq(a jsonb, b eql_v3.date_ord) function eql_v3.eq(a jsonb, b eql_v3.date_ord_ope) function eql_v3.eq(a jsonb, b eql_v3.date_ord_ore) -function eql_v3.eq(a jsonb, b eql_v3.float4_eq) -function eql_v3.eq(a jsonb, b eql_v3.float4_ord) -function eql_v3.eq(a jsonb, b eql_v3.float4_ord_ope) -function eql_v3.eq(a jsonb, b eql_v3.float4_ord_ore) -function eql_v3.eq(a jsonb, b eql_v3.float8_eq) -function eql_v3.eq(a jsonb, b eql_v3.float8_ord) -function eql_v3.eq(a jsonb, b eql_v3.float8_ord_ope) -function eql_v3.eq(a jsonb, b eql_v3.float8_ord_ore) -function eql_v3.eq(a jsonb, b eql_v3.int2_eq) -function eql_v3.eq(a jsonb, b eql_v3.int2_ord) -function eql_v3.eq(a jsonb, b eql_v3.int2_ord_ope) -function eql_v3.eq(a jsonb, b eql_v3.int2_ord_ore) -function eql_v3.eq(a jsonb, b eql_v3.int4_eq) -function eql_v3.eq(a jsonb, b eql_v3.int4_ord) -function eql_v3.eq(a jsonb, b eql_v3.int4_ord_ope) -function eql_v3.eq(a jsonb, b eql_v3.int4_ord_ore) -function eql_v3.eq(a jsonb, b eql_v3.int8_eq) -function eql_v3.eq(a jsonb, b eql_v3.int8_ord) -function eql_v3.eq(a jsonb, b eql_v3.int8_ord_ope) -function eql_v3.eq(a jsonb, b eql_v3.int8_ord_ore) +function eql_v3.eq(a jsonb, b eql_v3.double_eq) +function eql_v3.eq(a jsonb, b eql_v3.double_ord) +function eql_v3.eq(a jsonb, b eql_v3.double_ord_ope) +function eql_v3.eq(a jsonb, b eql_v3.double_ord_ore) +function eql_v3.eq(a jsonb, b eql_v3.integer_eq) +function eql_v3.eq(a jsonb, b eql_v3.integer_ord) +function eql_v3.eq(a jsonb, b eql_v3.integer_ord_ope) +function eql_v3.eq(a jsonb, b eql_v3.integer_ord_ore) function eql_v3.eq(a jsonb, b eql_v3.numeric_eq) function eql_v3.eq(a jsonb, b eql_v3.numeric_ord) function eql_v3.eq(a jsonb, b eql_v3.numeric_ord_ope) function eql_v3.eq(a jsonb, b eql_v3.numeric_ord_ore) +function eql_v3.eq(a jsonb, b eql_v3.real_eq) +function eql_v3.eq(a jsonb, b eql_v3.real_ord) +function eql_v3.eq(a jsonb, b eql_v3.real_ord_ope) +function eql_v3.eq(a jsonb, b eql_v3.real_ord_ore) +function eql_v3.eq(a jsonb, b eql_v3.smallint_eq) +function eql_v3.eq(a jsonb, b eql_v3.smallint_ord) +function eql_v3.eq(a jsonb, b eql_v3.smallint_ord_ope) +function eql_v3.eq(a jsonb, b eql_v3.smallint_ord_ore) function eql_v3.eq(a jsonb, b eql_v3.text_eq) function eql_v3.eq(a jsonb, b eql_v3.text_ord) function eql_v3.eq(a jsonb, b eql_v3.text_ord_ope) @@ -192,13 +192,13 @@ function eql_v3.eq(a jsonb, b eql_v3.timestamp_eq) function eql_v3.eq(a jsonb, b eql_v3.timestamp_ord) function eql_v3.eq(a jsonb, b eql_v3.timestamp_ord_ope) function eql_v3.eq(a jsonb, b eql_v3.timestamp_ord_ore) +function eql_v3.eq_term(a eql_v3.bigint_eq) function eql_v3.eq_term(a eql_v3.date_eq) -function eql_v3.eq_term(a eql_v3.float4_eq) -function eql_v3.eq_term(a eql_v3.float8_eq) -function eql_v3.eq_term(a eql_v3.int2_eq) -function eql_v3.eq_term(a eql_v3.int4_eq) -function eql_v3.eq_term(a eql_v3.int8_eq) +function eql_v3.eq_term(a eql_v3.double_eq) +function eql_v3.eq_term(a eql_v3.integer_eq) function eql_v3.eq_term(a eql_v3.numeric_eq) +function eql_v3.eq_term(a eql_v3.real_eq) +function eql_v3.eq_term(a eql_v3.smallint_eq) function eql_v3.eq_term(a eql_v3.text_eq) function eql_v3.eq_term(a eql_v3.text_ord) function eql_v3.eq_term(a eql_v3.text_ord_ope) @@ -206,42 +206,30 @@ function eql_v3.eq_term(a eql_v3.text_ord_ore) function eql_v3.eq_term(a eql_v3.text_search) function eql_v3.eq_term(a eql_v3.timestamp_eq) function eql_v3.eq_term(entry eql_v3.jsonb_entry) +function eql_v3.gt(a eql_v3.bigint_ord, b eql_v3.bigint_ord) +function eql_v3.gt(a eql_v3.bigint_ord, b jsonb) +function eql_v3.gt(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope) +function eql_v3.gt(a eql_v3.bigint_ord_ope, b jsonb) +function eql_v3.gt(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore) +function eql_v3.gt(a eql_v3.bigint_ord_ore, b jsonb) function eql_v3.gt(a eql_v3.date_ord, b eql_v3.date_ord) function eql_v3.gt(a eql_v3.date_ord, b jsonb) function eql_v3.gt(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope) function eql_v3.gt(a eql_v3.date_ord_ope, b jsonb) function eql_v3.gt(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) function eql_v3.gt(a eql_v3.date_ord_ore, b jsonb) -function eql_v3.gt(a eql_v3.float4_ord, b eql_v3.float4_ord) -function eql_v3.gt(a eql_v3.float4_ord, b jsonb) -function eql_v3.gt(a eql_v3.float4_ord_ope, b eql_v3.float4_ord_ope) -function eql_v3.gt(a eql_v3.float4_ord_ope, b jsonb) -function eql_v3.gt(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) -function eql_v3.gt(a eql_v3.float4_ord_ore, b jsonb) -function eql_v3.gt(a eql_v3.float8_ord, b eql_v3.float8_ord) -function eql_v3.gt(a eql_v3.float8_ord, b jsonb) -function eql_v3.gt(a eql_v3.float8_ord_ope, b eql_v3.float8_ord_ope) -function eql_v3.gt(a eql_v3.float8_ord_ope, b jsonb) -function eql_v3.gt(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) -function eql_v3.gt(a eql_v3.float8_ord_ore, b jsonb) -function eql_v3.gt(a eql_v3.int2_ord, b eql_v3.int2_ord) -function eql_v3.gt(a eql_v3.int2_ord, b jsonb) -function eql_v3.gt(a eql_v3.int2_ord_ope, b eql_v3.int2_ord_ope) -function eql_v3.gt(a eql_v3.int2_ord_ope, b jsonb) -function eql_v3.gt(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) -function eql_v3.gt(a eql_v3.int2_ord_ore, b jsonb) -function eql_v3.gt(a eql_v3.int4_ord, b eql_v3.int4_ord) -function eql_v3.gt(a eql_v3.int4_ord, b jsonb) -function eql_v3.gt(a eql_v3.int4_ord_ope, b eql_v3.int4_ord_ope) -function eql_v3.gt(a eql_v3.int4_ord_ope, b jsonb) -function eql_v3.gt(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) -function eql_v3.gt(a eql_v3.int4_ord_ore, b jsonb) -function eql_v3.gt(a eql_v3.int8_ord, b eql_v3.int8_ord) -function eql_v3.gt(a eql_v3.int8_ord, b jsonb) -function eql_v3.gt(a eql_v3.int8_ord_ope, b eql_v3.int8_ord_ope) -function eql_v3.gt(a eql_v3.int8_ord_ope, b jsonb) -function eql_v3.gt(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) -function eql_v3.gt(a eql_v3.int8_ord_ore, b jsonb) +function eql_v3.gt(a eql_v3.double_ord, b eql_v3.double_ord) +function eql_v3.gt(a eql_v3.double_ord, b jsonb) +function eql_v3.gt(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope) +function eql_v3.gt(a eql_v3.double_ord_ope, b jsonb) +function eql_v3.gt(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore) +function eql_v3.gt(a eql_v3.double_ord_ore, b jsonb) +function eql_v3.gt(a eql_v3.integer_ord, b eql_v3.integer_ord) +function eql_v3.gt(a eql_v3.integer_ord, b jsonb) +function eql_v3.gt(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope) +function eql_v3.gt(a eql_v3.integer_ord_ope, b jsonb) +function eql_v3.gt(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore) +function eql_v3.gt(a eql_v3.integer_ord_ore, b jsonb) function eql_v3.gt(a eql_v3.jsonb_entry, b eql_v3.jsonb_entry) function eql_v3.gt(a eql_v3.numeric_ord, b eql_v3.numeric_ord) function eql_v3.gt(a eql_v3.numeric_ord, b jsonb) @@ -249,6 +237,18 @@ function eql_v3.gt(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope) function eql_v3.gt(a eql_v3.numeric_ord_ope, b jsonb) function eql_v3.gt(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) function eql_v3.gt(a eql_v3.numeric_ord_ore, b jsonb) +function eql_v3.gt(a eql_v3.real_ord, b eql_v3.real_ord) +function eql_v3.gt(a eql_v3.real_ord, b jsonb) +function eql_v3.gt(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope) +function eql_v3.gt(a eql_v3.real_ord_ope, b jsonb) +function eql_v3.gt(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore) +function eql_v3.gt(a eql_v3.real_ord_ore, b jsonb) +function eql_v3.gt(a eql_v3.smallint_ord, b eql_v3.smallint_ord) +function eql_v3.gt(a eql_v3.smallint_ord, b jsonb) +function eql_v3.gt(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope) +function eql_v3.gt(a eql_v3.smallint_ord_ope, b jsonb) +function eql_v3.gt(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore) +function eql_v3.gt(a eql_v3.smallint_ord_ore, b jsonb) function eql_v3.gt(a eql_v3.text_ord, b eql_v3.text_ord) function eql_v3.gt(a eql_v3.text_ord, b jsonb) function eql_v3.gt(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope) @@ -263,27 +263,27 @@ function eql_v3.gt(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope) function eql_v3.gt(a eql_v3.timestamp_ord_ope, b jsonb) function eql_v3.gt(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore) function eql_v3.gt(a eql_v3.timestamp_ord_ore, b jsonb) +function eql_v3.gt(a jsonb, b eql_v3.bigint_ord) +function eql_v3.gt(a jsonb, b eql_v3.bigint_ord_ope) +function eql_v3.gt(a jsonb, b eql_v3.bigint_ord_ore) function eql_v3.gt(a jsonb, b eql_v3.date_ord) function eql_v3.gt(a jsonb, b eql_v3.date_ord_ope) function eql_v3.gt(a jsonb, b eql_v3.date_ord_ore) -function eql_v3.gt(a jsonb, b eql_v3.float4_ord) -function eql_v3.gt(a jsonb, b eql_v3.float4_ord_ope) -function eql_v3.gt(a jsonb, b eql_v3.float4_ord_ore) -function eql_v3.gt(a jsonb, b eql_v3.float8_ord) -function eql_v3.gt(a jsonb, b eql_v3.float8_ord_ope) -function eql_v3.gt(a jsonb, b eql_v3.float8_ord_ore) -function eql_v3.gt(a jsonb, b eql_v3.int2_ord) -function eql_v3.gt(a jsonb, b eql_v3.int2_ord_ope) -function eql_v3.gt(a jsonb, b eql_v3.int2_ord_ore) -function eql_v3.gt(a jsonb, b eql_v3.int4_ord) -function eql_v3.gt(a jsonb, b eql_v3.int4_ord_ope) -function eql_v3.gt(a jsonb, b eql_v3.int4_ord_ore) -function eql_v3.gt(a jsonb, b eql_v3.int8_ord) -function eql_v3.gt(a jsonb, b eql_v3.int8_ord_ope) -function eql_v3.gt(a jsonb, b eql_v3.int8_ord_ore) +function eql_v3.gt(a jsonb, b eql_v3.double_ord) +function eql_v3.gt(a jsonb, b eql_v3.double_ord_ope) +function eql_v3.gt(a jsonb, b eql_v3.double_ord_ore) +function eql_v3.gt(a jsonb, b eql_v3.integer_ord) +function eql_v3.gt(a jsonb, b eql_v3.integer_ord_ope) +function eql_v3.gt(a jsonb, b eql_v3.integer_ord_ore) function eql_v3.gt(a jsonb, b eql_v3.numeric_ord) function eql_v3.gt(a jsonb, b eql_v3.numeric_ord_ope) function eql_v3.gt(a jsonb, b eql_v3.numeric_ord_ore) +function eql_v3.gt(a jsonb, b eql_v3.real_ord) +function eql_v3.gt(a jsonb, b eql_v3.real_ord_ope) +function eql_v3.gt(a jsonb, b eql_v3.real_ord_ore) +function eql_v3.gt(a jsonb, b eql_v3.smallint_ord) +function eql_v3.gt(a jsonb, b eql_v3.smallint_ord_ope) +function eql_v3.gt(a jsonb, b eql_v3.smallint_ord_ore) function eql_v3.gt(a jsonb, b eql_v3.text_ord) function eql_v3.gt(a jsonb, b eql_v3.text_ord_ope) function eql_v3.gt(a jsonb, b eql_v3.text_ord_ore) @@ -291,42 +291,30 @@ function eql_v3.gt(a jsonb, b eql_v3.text_search) function eql_v3.gt(a jsonb, b eql_v3.timestamp_ord) function eql_v3.gt(a jsonb, b eql_v3.timestamp_ord_ope) function eql_v3.gt(a jsonb, b eql_v3.timestamp_ord_ore) +function eql_v3.gte(a eql_v3.bigint_ord, b eql_v3.bigint_ord) +function eql_v3.gte(a eql_v3.bigint_ord, b jsonb) +function eql_v3.gte(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope) +function eql_v3.gte(a eql_v3.bigint_ord_ope, b jsonb) +function eql_v3.gte(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore) +function eql_v3.gte(a eql_v3.bigint_ord_ore, b jsonb) function eql_v3.gte(a eql_v3.date_ord, b eql_v3.date_ord) function eql_v3.gte(a eql_v3.date_ord, b jsonb) function eql_v3.gte(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope) function eql_v3.gte(a eql_v3.date_ord_ope, b jsonb) function eql_v3.gte(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) function eql_v3.gte(a eql_v3.date_ord_ore, b jsonb) -function eql_v3.gte(a eql_v3.float4_ord, b eql_v3.float4_ord) -function eql_v3.gte(a eql_v3.float4_ord, b jsonb) -function eql_v3.gte(a eql_v3.float4_ord_ope, b eql_v3.float4_ord_ope) -function eql_v3.gte(a eql_v3.float4_ord_ope, b jsonb) -function eql_v3.gte(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) -function eql_v3.gte(a eql_v3.float4_ord_ore, b jsonb) -function eql_v3.gte(a eql_v3.float8_ord, b eql_v3.float8_ord) -function eql_v3.gte(a eql_v3.float8_ord, b jsonb) -function eql_v3.gte(a eql_v3.float8_ord_ope, b eql_v3.float8_ord_ope) -function eql_v3.gte(a eql_v3.float8_ord_ope, b jsonb) -function eql_v3.gte(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) -function eql_v3.gte(a eql_v3.float8_ord_ore, b jsonb) -function eql_v3.gte(a eql_v3.int2_ord, b eql_v3.int2_ord) -function eql_v3.gte(a eql_v3.int2_ord, b jsonb) -function eql_v3.gte(a eql_v3.int2_ord_ope, b eql_v3.int2_ord_ope) -function eql_v3.gte(a eql_v3.int2_ord_ope, b jsonb) -function eql_v3.gte(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) -function eql_v3.gte(a eql_v3.int2_ord_ore, b jsonb) -function eql_v3.gte(a eql_v3.int4_ord, b eql_v3.int4_ord) -function eql_v3.gte(a eql_v3.int4_ord, b jsonb) -function eql_v3.gte(a eql_v3.int4_ord_ope, b eql_v3.int4_ord_ope) -function eql_v3.gte(a eql_v3.int4_ord_ope, b jsonb) -function eql_v3.gte(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) -function eql_v3.gte(a eql_v3.int4_ord_ore, b jsonb) -function eql_v3.gte(a eql_v3.int8_ord, b eql_v3.int8_ord) -function eql_v3.gte(a eql_v3.int8_ord, b jsonb) -function eql_v3.gte(a eql_v3.int8_ord_ope, b eql_v3.int8_ord_ope) -function eql_v3.gte(a eql_v3.int8_ord_ope, b jsonb) -function eql_v3.gte(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) -function eql_v3.gte(a eql_v3.int8_ord_ore, b jsonb) +function eql_v3.gte(a eql_v3.double_ord, b eql_v3.double_ord) +function eql_v3.gte(a eql_v3.double_ord, b jsonb) +function eql_v3.gte(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope) +function eql_v3.gte(a eql_v3.double_ord_ope, b jsonb) +function eql_v3.gte(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore) +function eql_v3.gte(a eql_v3.double_ord_ore, b jsonb) +function eql_v3.gte(a eql_v3.integer_ord, b eql_v3.integer_ord) +function eql_v3.gte(a eql_v3.integer_ord, b jsonb) +function eql_v3.gte(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope) +function eql_v3.gte(a eql_v3.integer_ord_ope, b jsonb) +function eql_v3.gte(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore) +function eql_v3.gte(a eql_v3.integer_ord_ore, b jsonb) function eql_v3.gte(a eql_v3.jsonb_entry, b eql_v3.jsonb_entry) function eql_v3.gte(a eql_v3.numeric_ord, b eql_v3.numeric_ord) function eql_v3.gte(a eql_v3.numeric_ord, b jsonb) @@ -334,6 +322,18 @@ function eql_v3.gte(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope) function eql_v3.gte(a eql_v3.numeric_ord_ope, b jsonb) function eql_v3.gte(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) function eql_v3.gte(a eql_v3.numeric_ord_ore, b jsonb) +function eql_v3.gte(a eql_v3.real_ord, b eql_v3.real_ord) +function eql_v3.gte(a eql_v3.real_ord, b jsonb) +function eql_v3.gte(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope) +function eql_v3.gte(a eql_v3.real_ord_ope, b jsonb) +function eql_v3.gte(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore) +function eql_v3.gte(a eql_v3.real_ord_ore, b jsonb) +function eql_v3.gte(a eql_v3.smallint_ord, b eql_v3.smallint_ord) +function eql_v3.gte(a eql_v3.smallint_ord, b jsonb) +function eql_v3.gte(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope) +function eql_v3.gte(a eql_v3.smallint_ord_ope, b jsonb) +function eql_v3.gte(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore) +function eql_v3.gte(a eql_v3.smallint_ord_ore, b jsonb) function eql_v3.gte(a eql_v3.text_ord, b eql_v3.text_ord) function eql_v3.gte(a eql_v3.text_ord, b jsonb) function eql_v3.gte(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope) @@ -348,27 +348,27 @@ function eql_v3.gte(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope) function eql_v3.gte(a eql_v3.timestamp_ord_ope, b jsonb) function eql_v3.gte(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore) function eql_v3.gte(a eql_v3.timestamp_ord_ore, b jsonb) +function eql_v3.gte(a jsonb, b eql_v3.bigint_ord) +function eql_v3.gte(a jsonb, b eql_v3.bigint_ord_ope) +function eql_v3.gte(a jsonb, b eql_v3.bigint_ord_ore) function eql_v3.gte(a jsonb, b eql_v3.date_ord) function eql_v3.gte(a jsonb, b eql_v3.date_ord_ope) function eql_v3.gte(a jsonb, b eql_v3.date_ord_ore) -function eql_v3.gte(a jsonb, b eql_v3.float4_ord) -function eql_v3.gte(a jsonb, b eql_v3.float4_ord_ope) -function eql_v3.gte(a jsonb, b eql_v3.float4_ord_ore) -function eql_v3.gte(a jsonb, b eql_v3.float8_ord) -function eql_v3.gte(a jsonb, b eql_v3.float8_ord_ope) -function eql_v3.gte(a jsonb, b eql_v3.float8_ord_ore) -function eql_v3.gte(a jsonb, b eql_v3.int2_ord) -function eql_v3.gte(a jsonb, b eql_v3.int2_ord_ope) -function eql_v3.gte(a jsonb, b eql_v3.int2_ord_ore) -function eql_v3.gte(a jsonb, b eql_v3.int4_ord) -function eql_v3.gte(a jsonb, b eql_v3.int4_ord_ope) -function eql_v3.gte(a jsonb, b eql_v3.int4_ord_ore) -function eql_v3.gte(a jsonb, b eql_v3.int8_ord) -function eql_v3.gte(a jsonb, b eql_v3.int8_ord_ope) -function eql_v3.gte(a jsonb, b eql_v3.int8_ord_ore) +function eql_v3.gte(a jsonb, b eql_v3.double_ord) +function eql_v3.gte(a jsonb, b eql_v3.double_ord_ope) +function eql_v3.gte(a jsonb, b eql_v3.double_ord_ore) +function eql_v3.gte(a jsonb, b eql_v3.integer_ord) +function eql_v3.gte(a jsonb, b eql_v3.integer_ord_ope) +function eql_v3.gte(a jsonb, b eql_v3.integer_ord_ore) function eql_v3.gte(a jsonb, b eql_v3.numeric_ord) function eql_v3.gte(a jsonb, b eql_v3.numeric_ord_ope) function eql_v3.gte(a jsonb, b eql_v3.numeric_ord_ore) +function eql_v3.gte(a jsonb, b eql_v3.real_ord) +function eql_v3.gte(a jsonb, b eql_v3.real_ord_ope) +function eql_v3.gte(a jsonb, b eql_v3.real_ord_ore) +function eql_v3.gte(a jsonb, b eql_v3.smallint_ord) +function eql_v3.gte(a jsonb, b eql_v3.smallint_ord_ope) +function eql_v3.gte(a jsonb, b eql_v3.smallint_ord_ore) function eql_v3.gte(a jsonb, b eql_v3.text_ord) function eql_v3.gte(a jsonb, b eql_v3.text_ord_ope) function eql_v3.gte(a jsonb, b eql_v3.text_ord_ore) @@ -387,42 +387,30 @@ function eql_v3.jsonb_path_exists(val jsonb, selector text) function eql_v3.jsonb_path_query(val jsonb, selector text) function eql_v3.jsonb_path_query_first(val jsonb, selector text) function eql_v3.lints() +function eql_v3.lt(a eql_v3.bigint_ord, b eql_v3.bigint_ord) +function eql_v3.lt(a eql_v3.bigint_ord, b jsonb) +function eql_v3.lt(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope) +function eql_v3.lt(a eql_v3.bigint_ord_ope, b jsonb) +function eql_v3.lt(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore) +function eql_v3.lt(a eql_v3.bigint_ord_ore, b jsonb) function eql_v3.lt(a eql_v3.date_ord, b eql_v3.date_ord) function eql_v3.lt(a eql_v3.date_ord, b jsonb) function eql_v3.lt(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope) function eql_v3.lt(a eql_v3.date_ord_ope, b jsonb) function eql_v3.lt(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) function eql_v3.lt(a eql_v3.date_ord_ore, b jsonb) -function eql_v3.lt(a eql_v3.float4_ord, b eql_v3.float4_ord) -function eql_v3.lt(a eql_v3.float4_ord, b jsonb) -function eql_v3.lt(a eql_v3.float4_ord_ope, b eql_v3.float4_ord_ope) -function eql_v3.lt(a eql_v3.float4_ord_ope, b jsonb) -function eql_v3.lt(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) -function eql_v3.lt(a eql_v3.float4_ord_ore, b jsonb) -function eql_v3.lt(a eql_v3.float8_ord, b eql_v3.float8_ord) -function eql_v3.lt(a eql_v3.float8_ord, b jsonb) -function eql_v3.lt(a eql_v3.float8_ord_ope, b eql_v3.float8_ord_ope) -function eql_v3.lt(a eql_v3.float8_ord_ope, b jsonb) -function eql_v3.lt(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) -function eql_v3.lt(a eql_v3.float8_ord_ore, b jsonb) -function eql_v3.lt(a eql_v3.int2_ord, b eql_v3.int2_ord) -function eql_v3.lt(a eql_v3.int2_ord, b jsonb) -function eql_v3.lt(a eql_v3.int2_ord_ope, b eql_v3.int2_ord_ope) -function eql_v3.lt(a eql_v3.int2_ord_ope, b jsonb) -function eql_v3.lt(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) -function eql_v3.lt(a eql_v3.int2_ord_ore, b jsonb) -function eql_v3.lt(a eql_v3.int4_ord, b eql_v3.int4_ord) -function eql_v3.lt(a eql_v3.int4_ord, b jsonb) -function eql_v3.lt(a eql_v3.int4_ord_ope, b eql_v3.int4_ord_ope) -function eql_v3.lt(a eql_v3.int4_ord_ope, b jsonb) -function eql_v3.lt(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) -function eql_v3.lt(a eql_v3.int4_ord_ore, b jsonb) -function eql_v3.lt(a eql_v3.int8_ord, b eql_v3.int8_ord) -function eql_v3.lt(a eql_v3.int8_ord, b jsonb) -function eql_v3.lt(a eql_v3.int8_ord_ope, b eql_v3.int8_ord_ope) -function eql_v3.lt(a eql_v3.int8_ord_ope, b jsonb) -function eql_v3.lt(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) -function eql_v3.lt(a eql_v3.int8_ord_ore, b jsonb) +function eql_v3.lt(a eql_v3.double_ord, b eql_v3.double_ord) +function eql_v3.lt(a eql_v3.double_ord, b jsonb) +function eql_v3.lt(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope) +function eql_v3.lt(a eql_v3.double_ord_ope, b jsonb) +function eql_v3.lt(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore) +function eql_v3.lt(a eql_v3.double_ord_ore, b jsonb) +function eql_v3.lt(a eql_v3.integer_ord, b eql_v3.integer_ord) +function eql_v3.lt(a eql_v3.integer_ord, b jsonb) +function eql_v3.lt(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope) +function eql_v3.lt(a eql_v3.integer_ord_ope, b jsonb) +function eql_v3.lt(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore) +function eql_v3.lt(a eql_v3.integer_ord_ore, b jsonb) function eql_v3.lt(a eql_v3.jsonb_entry, b eql_v3.jsonb_entry) function eql_v3.lt(a eql_v3.numeric_ord, b eql_v3.numeric_ord) function eql_v3.lt(a eql_v3.numeric_ord, b jsonb) @@ -430,6 +418,18 @@ function eql_v3.lt(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope) function eql_v3.lt(a eql_v3.numeric_ord_ope, b jsonb) function eql_v3.lt(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) function eql_v3.lt(a eql_v3.numeric_ord_ore, b jsonb) +function eql_v3.lt(a eql_v3.real_ord, b eql_v3.real_ord) +function eql_v3.lt(a eql_v3.real_ord, b jsonb) +function eql_v3.lt(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope) +function eql_v3.lt(a eql_v3.real_ord_ope, b jsonb) +function eql_v3.lt(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore) +function eql_v3.lt(a eql_v3.real_ord_ore, b jsonb) +function eql_v3.lt(a eql_v3.smallint_ord, b eql_v3.smallint_ord) +function eql_v3.lt(a eql_v3.smallint_ord, b jsonb) +function eql_v3.lt(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope) +function eql_v3.lt(a eql_v3.smallint_ord_ope, b jsonb) +function eql_v3.lt(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore) +function eql_v3.lt(a eql_v3.smallint_ord_ore, b jsonb) function eql_v3.lt(a eql_v3.text_ord, b eql_v3.text_ord) function eql_v3.lt(a eql_v3.text_ord, b jsonb) function eql_v3.lt(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope) @@ -444,27 +444,27 @@ function eql_v3.lt(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope) function eql_v3.lt(a eql_v3.timestamp_ord_ope, b jsonb) function eql_v3.lt(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore) function eql_v3.lt(a eql_v3.timestamp_ord_ore, b jsonb) +function eql_v3.lt(a jsonb, b eql_v3.bigint_ord) +function eql_v3.lt(a jsonb, b eql_v3.bigint_ord_ope) +function eql_v3.lt(a jsonb, b eql_v3.bigint_ord_ore) function eql_v3.lt(a jsonb, b eql_v3.date_ord) function eql_v3.lt(a jsonb, b eql_v3.date_ord_ope) function eql_v3.lt(a jsonb, b eql_v3.date_ord_ore) -function eql_v3.lt(a jsonb, b eql_v3.float4_ord) -function eql_v3.lt(a jsonb, b eql_v3.float4_ord_ope) -function eql_v3.lt(a jsonb, b eql_v3.float4_ord_ore) -function eql_v3.lt(a jsonb, b eql_v3.float8_ord) -function eql_v3.lt(a jsonb, b eql_v3.float8_ord_ope) -function eql_v3.lt(a jsonb, b eql_v3.float8_ord_ore) -function eql_v3.lt(a jsonb, b eql_v3.int2_ord) -function eql_v3.lt(a jsonb, b eql_v3.int2_ord_ope) -function eql_v3.lt(a jsonb, b eql_v3.int2_ord_ore) -function eql_v3.lt(a jsonb, b eql_v3.int4_ord) -function eql_v3.lt(a jsonb, b eql_v3.int4_ord_ope) -function eql_v3.lt(a jsonb, b eql_v3.int4_ord_ore) -function eql_v3.lt(a jsonb, b eql_v3.int8_ord) -function eql_v3.lt(a jsonb, b eql_v3.int8_ord_ope) -function eql_v3.lt(a jsonb, b eql_v3.int8_ord_ore) +function eql_v3.lt(a jsonb, b eql_v3.double_ord) +function eql_v3.lt(a jsonb, b eql_v3.double_ord_ope) +function eql_v3.lt(a jsonb, b eql_v3.double_ord_ore) +function eql_v3.lt(a jsonb, b eql_v3.integer_ord) +function eql_v3.lt(a jsonb, b eql_v3.integer_ord_ope) +function eql_v3.lt(a jsonb, b eql_v3.integer_ord_ore) function eql_v3.lt(a jsonb, b eql_v3.numeric_ord) function eql_v3.lt(a jsonb, b eql_v3.numeric_ord_ope) function eql_v3.lt(a jsonb, b eql_v3.numeric_ord_ore) +function eql_v3.lt(a jsonb, b eql_v3.real_ord) +function eql_v3.lt(a jsonb, b eql_v3.real_ord_ope) +function eql_v3.lt(a jsonb, b eql_v3.real_ord_ore) +function eql_v3.lt(a jsonb, b eql_v3.smallint_ord) +function eql_v3.lt(a jsonb, b eql_v3.smallint_ord_ope) +function eql_v3.lt(a jsonb, b eql_v3.smallint_ord_ore) function eql_v3.lt(a jsonb, b eql_v3.text_ord) function eql_v3.lt(a jsonb, b eql_v3.text_ord_ope) function eql_v3.lt(a jsonb, b eql_v3.text_ord_ore) @@ -472,42 +472,30 @@ function eql_v3.lt(a jsonb, b eql_v3.text_search) function eql_v3.lt(a jsonb, b eql_v3.timestamp_ord) function eql_v3.lt(a jsonb, b eql_v3.timestamp_ord_ope) function eql_v3.lt(a jsonb, b eql_v3.timestamp_ord_ore) +function eql_v3.lte(a eql_v3.bigint_ord, b eql_v3.bigint_ord) +function eql_v3.lte(a eql_v3.bigint_ord, b jsonb) +function eql_v3.lte(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope) +function eql_v3.lte(a eql_v3.bigint_ord_ope, b jsonb) +function eql_v3.lte(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore) +function eql_v3.lte(a eql_v3.bigint_ord_ore, b jsonb) function eql_v3.lte(a eql_v3.date_ord, b eql_v3.date_ord) function eql_v3.lte(a eql_v3.date_ord, b jsonb) function eql_v3.lte(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope) function eql_v3.lte(a eql_v3.date_ord_ope, b jsonb) function eql_v3.lte(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) function eql_v3.lte(a eql_v3.date_ord_ore, b jsonb) -function eql_v3.lte(a eql_v3.float4_ord, b eql_v3.float4_ord) -function eql_v3.lte(a eql_v3.float4_ord, b jsonb) -function eql_v3.lte(a eql_v3.float4_ord_ope, b eql_v3.float4_ord_ope) -function eql_v3.lte(a eql_v3.float4_ord_ope, b jsonb) -function eql_v3.lte(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) -function eql_v3.lte(a eql_v3.float4_ord_ore, b jsonb) -function eql_v3.lte(a eql_v3.float8_ord, b eql_v3.float8_ord) -function eql_v3.lte(a eql_v3.float8_ord, b jsonb) -function eql_v3.lte(a eql_v3.float8_ord_ope, b eql_v3.float8_ord_ope) -function eql_v3.lte(a eql_v3.float8_ord_ope, b jsonb) -function eql_v3.lte(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) -function eql_v3.lte(a eql_v3.float8_ord_ore, b jsonb) -function eql_v3.lte(a eql_v3.int2_ord, b eql_v3.int2_ord) -function eql_v3.lte(a eql_v3.int2_ord, b jsonb) -function eql_v3.lte(a eql_v3.int2_ord_ope, b eql_v3.int2_ord_ope) -function eql_v3.lte(a eql_v3.int2_ord_ope, b jsonb) -function eql_v3.lte(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) -function eql_v3.lte(a eql_v3.int2_ord_ore, b jsonb) -function eql_v3.lte(a eql_v3.int4_ord, b eql_v3.int4_ord) -function eql_v3.lte(a eql_v3.int4_ord, b jsonb) -function eql_v3.lte(a eql_v3.int4_ord_ope, b eql_v3.int4_ord_ope) -function eql_v3.lte(a eql_v3.int4_ord_ope, b jsonb) -function eql_v3.lte(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) -function eql_v3.lte(a eql_v3.int4_ord_ore, b jsonb) -function eql_v3.lte(a eql_v3.int8_ord, b eql_v3.int8_ord) -function eql_v3.lte(a eql_v3.int8_ord, b jsonb) -function eql_v3.lte(a eql_v3.int8_ord_ope, b eql_v3.int8_ord_ope) -function eql_v3.lte(a eql_v3.int8_ord_ope, b jsonb) -function eql_v3.lte(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) -function eql_v3.lte(a eql_v3.int8_ord_ore, b jsonb) +function eql_v3.lte(a eql_v3.double_ord, b eql_v3.double_ord) +function eql_v3.lte(a eql_v3.double_ord, b jsonb) +function eql_v3.lte(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope) +function eql_v3.lte(a eql_v3.double_ord_ope, b jsonb) +function eql_v3.lte(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore) +function eql_v3.lte(a eql_v3.double_ord_ore, b jsonb) +function eql_v3.lte(a eql_v3.integer_ord, b eql_v3.integer_ord) +function eql_v3.lte(a eql_v3.integer_ord, b jsonb) +function eql_v3.lte(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope) +function eql_v3.lte(a eql_v3.integer_ord_ope, b jsonb) +function eql_v3.lte(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore) +function eql_v3.lte(a eql_v3.integer_ord_ore, b jsonb) function eql_v3.lte(a eql_v3.jsonb_entry, b eql_v3.jsonb_entry) function eql_v3.lte(a eql_v3.numeric_ord, b eql_v3.numeric_ord) function eql_v3.lte(a eql_v3.numeric_ord, b jsonb) @@ -515,6 +503,18 @@ function eql_v3.lte(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope) function eql_v3.lte(a eql_v3.numeric_ord_ope, b jsonb) function eql_v3.lte(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) function eql_v3.lte(a eql_v3.numeric_ord_ore, b jsonb) +function eql_v3.lte(a eql_v3.real_ord, b eql_v3.real_ord) +function eql_v3.lte(a eql_v3.real_ord, b jsonb) +function eql_v3.lte(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope) +function eql_v3.lte(a eql_v3.real_ord_ope, b jsonb) +function eql_v3.lte(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore) +function eql_v3.lte(a eql_v3.real_ord_ore, b jsonb) +function eql_v3.lte(a eql_v3.smallint_ord, b eql_v3.smallint_ord) +function eql_v3.lte(a eql_v3.smallint_ord, b jsonb) +function eql_v3.lte(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope) +function eql_v3.lte(a eql_v3.smallint_ord_ope, b jsonb) +function eql_v3.lte(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore) +function eql_v3.lte(a eql_v3.smallint_ord_ore, b jsonb) function eql_v3.lte(a eql_v3.text_ord, b eql_v3.text_ord) function eql_v3.lte(a eql_v3.text_ord, b jsonb) function eql_v3.lte(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope) @@ -529,27 +529,27 @@ function eql_v3.lte(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope) function eql_v3.lte(a eql_v3.timestamp_ord_ope, b jsonb) function eql_v3.lte(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore) function eql_v3.lte(a eql_v3.timestamp_ord_ore, b jsonb) +function eql_v3.lte(a jsonb, b eql_v3.bigint_ord) +function eql_v3.lte(a jsonb, b eql_v3.bigint_ord_ope) +function eql_v3.lte(a jsonb, b eql_v3.bigint_ord_ore) function eql_v3.lte(a jsonb, b eql_v3.date_ord) function eql_v3.lte(a jsonb, b eql_v3.date_ord_ope) function eql_v3.lte(a jsonb, b eql_v3.date_ord_ore) -function eql_v3.lte(a jsonb, b eql_v3.float4_ord) -function eql_v3.lte(a jsonb, b eql_v3.float4_ord_ope) -function eql_v3.lte(a jsonb, b eql_v3.float4_ord_ore) -function eql_v3.lte(a jsonb, b eql_v3.float8_ord) -function eql_v3.lte(a jsonb, b eql_v3.float8_ord_ope) -function eql_v3.lte(a jsonb, b eql_v3.float8_ord_ore) -function eql_v3.lte(a jsonb, b eql_v3.int2_ord) -function eql_v3.lte(a jsonb, b eql_v3.int2_ord_ope) -function eql_v3.lte(a jsonb, b eql_v3.int2_ord_ore) -function eql_v3.lte(a jsonb, b eql_v3.int4_ord) -function eql_v3.lte(a jsonb, b eql_v3.int4_ord_ope) -function eql_v3.lte(a jsonb, b eql_v3.int4_ord_ore) -function eql_v3.lte(a jsonb, b eql_v3.int8_ord) -function eql_v3.lte(a jsonb, b eql_v3.int8_ord_ope) -function eql_v3.lte(a jsonb, b eql_v3.int8_ord_ore) +function eql_v3.lte(a jsonb, b eql_v3.double_ord) +function eql_v3.lte(a jsonb, b eql_v3.double_ord_ope) +function eql_v3.lte(a jsonb, b eql_v3.double_ord_ore) +function eql_v3.lte(a jsonb, b eql_v3.integer_ord) +function eql_v3.lte(a jsonb, b eql_v3.integer_ord_ope) +function eql_v3.lte(a jsonb, b eql_v3.integer_ord_ore) function eql_v3.lte(a jsonb, b eql_v3.numeric_ord) function eql_v3.lte(a jsonb, b eql_v3.numeric_ord_ope) function eql_v3.lte(a jsonb, b eql_v3.numeric_ord_ore) +function eql_v3.lte(a jsonb, b eql_v3.real_ord) +function eql_v3.lte(a jsonb, b eql_v3.real_ord_ope) +function eql_v3.lte(a jsonb, b eql_v3.real_ord_ore) +function eql_v3.lte(a jsonb, b eql_v3.smallint_ord) +function eql_v3.lte(a jsonb, b eql_v3.smallint_ord_ope) +function eql_v3.lte(a jsonb, b eql_v3.smallint_ord_ore) function eql_v3.lte(a jsonb, b eql_v3.text_ord) function eql_v3.lte(a jsonb, b eql_v3.text_ord_ope) function eql_v3.lte(a jsonb, b eql_v3.text_ord_ore) @@ -560,6 +560,14 @@ function eql_v3.lte(a jsonb, b eql_v3.timestamp_ord_ore) function eql_v3.match_term(a eql_v3.text_match) function eql_v3.match_term(a eql_v3.text_search) function eql_v3.meta_data(val jsonb) +function eql_v3.neq(a eql_v3.bigint_eq, b eql_v3.bigint_eq) +function eql_v3.neq(a eql_v3.bigint_eq, b jsonb) +function eql_v3.neq(a eql_v3.bigint_ord, b eql_v3.bigint_ord) +function eql_v3.neq(a eql_v3.bigint_ord, b jsonb) +function eql_v3.neq(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope) +function eql_v3.neq(a eql_v3.bigint_ord_ope, b jsonb) +function eql_v3.neq(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore) +function eql_v3.neq(a eql_v3.bigint_ord_ore, b jsonb) function eql_v3.neq(a eql_v3.date_eq, b eql_v3.date_eq) function eql_v3.neq(a eql_v3.date_eq, b jsonb) function eql_v3.neq(a eql_v3.date_ord, b eql_v3.date_ord) @@ -568,46 +576,22 @@ function eql_v3.neq(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope) function eql_v3.neq(a eql_v3.date_ord_ope, b jsonb) function eql_v3.neq(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore) function eql_v3.neq(a eql_v3.date_ord_ore, b jsonb) -function eql_v3.neq(a eql_v3.float4_eq, b eql_v3.float4_eq) -function eql_v3.neq(a eql_v3.float4_eq, b jsonb) -function eql_v3.neq(a eql_v3.float4_ord, b eql_v3.float4_ord) -function eql_v3.neq(a eql_v3.float4_ord, b jsonb) -function eql_v3.neq(a eql_v3.float4_ord_ope, b eql_v3.float4_ord_ope) -function eql_v3.neq(a eql_v3.float4_ord_ope, b jsonb) -function eql_v3.neq(a eql_v3.float4_ord_ore, b eql_v3.float4_ord_ore) -function eql_v3.neq(a eql_v3.float4_ord_ore, b jsonb) -function eql_v3.neq(a eql_v3.float8_eq, b eql_v3.float8_eq) -function eql_v3.neq(a eql_v3.float8_eq, b jsonb) -function eql_v3.neq(a eql_v3.float8_ord, b eql_v3.float8_ord) -function eql_v3.neq(a eql_v3.float8_ord, b jsonb) -function eql_v3.neq(a eql_v3.float8_ord_ope, b eql_v3.float8_ord_ope) -function eql_v3.neq(a eql_v3.float8_ord_ope, b jsonb) -function eql_v3.neq(a eql_v3.float8_ord_ore, b eql_v3.float8_ord_ore) -function eql_v3.neq(a eql_v3.float8_ord_ore, b jsonb) -function eql_v3.neq(a eql_v3.int2_eq, b eql_v3.int2_eq) -function eql_v3.neq(a eql_v3.int2_eq, b jsonb) -function eql_v3.neq(a eql_v3.int2_ord, b eql_v3.int2_ord) -function eql_v3.neq(a eql_v3.int2_ord, b jsonb) -function eql_v3.neq(a eql_v3.int2_ord_ope, b eql_v3.int2_ord_ope) -function eql_v3.neq(a eql_v3.int2_ord_ope, b jsonb) -function eql_v3.neq(a eql_v3.int2_ord_ore, b eql_v3.int2_ord_ore) -function eql_v3.neq(a eql_v3.int2_ord_ore, b jsonb) -function eql_v3.neq(a eql_v3.int4_eq, b eql_v3.int4_eq) -function eql_v3.neq(a eql_v3.int4_eq, b jsonb) -function eql_v3.neq(a eql_v3.int4_ord, b eql_v3.int4_ord) -function eql_v3.neq(a eql_v3.int4_ord, b jsonb) -function eql_v3.neq(a eql_v3.int4_ord_ope, b eql_v3.int4_ord_ope) -function eql_v3.neq(a eql_v3.int4_ord_ope, b jsonb) -function eql_v3.neq(a eql_v3.int4_ord_ore, b eql_v3.int4_ord_ore) -function eql_v3.neq(a eql_v3.int4_ord_ore, b jsonb) -function eql_v3.neq(a eql_v3.int8_eq, b eql_v3.int8_eq) -function eql_v3.neq(a eql_v3.int8_eq, b jsonb) -function eql_v3.neq(a eql_v3.int8_ord, b eql_v3.int8_ord) -function eql_v3.neq(a eql_v3.int8_ord, b jsonb) -function eql_v3.neq(a eql_v3.int8_ord_ope, b eql_v3.int8_ord_ope) -function eql_v3.neq(a eql_v3.int8_ord_ope, b jsonb) -function eql_v3.neq(a eql_v3.int8_ord_ore, b eql_v3.int8_ord_ore) -function eql_v3.neq(a eql_v3.int8_ord_ore, b jsonb) +function eql_v3.neq(a eql_v3.double_eq, b eql_v3.double_eq) +function eql_v3.neq(a eql_v3.double_eq, b jsonb) +function eql_v3.neq(a eql_v3.double_ord, b eql_v3.double_ord) +function eql_v3.neq(a eql_v3.double_ord, b jsonb) +function eql_v3.neq(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope) +function eql_v3.neq(a eql_v3.double_ord_ope, b jsonb) +function eql_v3.neq(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore) +function eql_v3.neq(a eql_v3.double_ord_ore, b jsonb) +function eql_v3.neq(a eql_v3.integer_eq, b eql_v3.integer_eq) +function eql_v3.neq(a eql_v3.integer_eq, b jsonb) +function eql_v3.neq(a eql_v3.integer_ord, b eql_v3.integer_ord) +function eql_v3.neq(a eql_v3.integer_ord, b jsonb) +function eql_v3.neq(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope) +function eql_v3.neq(a eql_v3.integer_ord_ope, b jsonb) +function eql_v3.neq(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore) +function eql_v3.neq(a eql_v3.integer_ord_ore, b jsonb) function eql_v3.neq(a eql_v3.jsonb_entry, b eql_v3.jsonb_entry) function eql_v3.neq(a eql_v3.numeric_eq, b eql_v3.numeric_eq) function eql_v3.neq(a eql_v3.numeric_eq, b jsonb) @@ -617,6 +601,22 @@ function eql_v3.neq(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope) function eql_v3.neq(a eql_v3.numeric_ord_ope, b jsonb) function eql_v3.neq(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore) function eql_v3.neq(a eql_v3.numeric_ord_ore, b jsonb) +function eql_v3.neq(a eql_v3.real_eq, b eql_v3.real_eq) +function eql_v3.neq(a eql_v3.real_eq, b jsonb) +function eql_v3.neq(a eql_v3.real_ord, b eql_v3.real_ord) +function eql_v3.neq(a eql_v3.real_ord, b jsonb) +function eql_v3.neq(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope) +function eql_v3.neq(a eql_v3.real_ord_ope, b jsonb) +function eql_v3.neq(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore) +function eql_v3.neq(a eql_v3.real_ord_ore, b jsonb) +function eql_v3.neq(a eql_v3.smallint_eq, b eql_v3.smallint_eq) +function eql_v3.neq(a eql_v3.smallint_eq, b jsonb) +function eql_v3.neq(a eql_v3.smallint_ord, b eql_v3.smallint_ord) +function eql_v3.neq(a eql_v3.smallint_ord, b jsonb) +function eql_v3.neq(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope) +function eql_v3.neq(a eql_v3.smallint_ord_ope, b jsonb) +function eql_v3.neq(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore) +function eql_v3.neq(a eql_v3.smallint_ord_ore, b jsonb) function eql_v3.neq(a eql_v3.text_eq, b eql_v3.text_eq) function eql_v3.neq(a eql_v3.text_eq, b jsonb) function eql_v3.neq(a eql_v3.text_ord, b eql_v3.text_ord) @@ -635,34 +635,34 @@ function eql_v3.neq(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope) function eql_v3.neq(a eql_v3.timestamp_ord_ope, b jsonb) function eql_v3.neq(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore) function eql_v3.neq(a eql_v3.timestamp_ord_ore, b jsonb) +function eql_v3.neq(a jsonb, b eql_v3.bigint_eq) +function eql_v3.neq(a jsonb, b eql_v3.bigint_ord) +function eql_v3.neq(a jsonb, b eql_v3.bigint_ord_ope) +function eql_v3.neq(a jsonb, b eql_v3.bigint_ord_ore) function eql_v3.neq(a jsonb, b eql_v3.date_eq) function eql_v3.neq(a jsonb, b eql_v3.date_ord) function eql_v3.neq(a jsonb, b eql_v3.date_ord_ope) function eql_v3.neq(a jsonb, b eql_v3.date_ord_ore) -function eql_v3.neq(a jsonb, b eql_v3.float4_eq) -function eql_v3.neq(a jsonb, b eql_v3.float4_ord) -function eql_v3.neq(a jsonb, b eql_v3.float4_ord_ope) -function eql_v3.neq(a jsonb, b eql_v3.float4_ord_ore) -function eql_v3.neq(a jsonb, b eql_v3.float8_eq) -function eql_v3.neq(a jsonb, b eql_v3.float8_ord) -function eql_v3.neq(a jsonb, b eql_v3.float8_ord_ope) -function eql_v3.neq(a jsonb, b eql_v3.float8_ord_ore) -function eql_v3.neq(a jsonb, b eql_v3.int2_eq) -function eql_v3.neq(a jsonb, b eql_v3.int2_ord) -function eql_v3.neq(a jsonb, b eql_v3.int2_ord_ope) -function eql_v3.neq(a jsonb, b eql_v3.int2_ord_ore) -function eql_v3.neq(a jsonb, b eql_v3.int4_eq) -function eql_v3.neq(a jsonb, b eql_v3.int4_ord) -function eql_v3.neq(a jsonb, b eql_v3.int4_ord_ope) -function eql_v3.neq(a jsonb, b eql_v3.int4_ord_ore) -function eql_v3.neq(a jsonb, b eql_v3.int8_eq) -function eql_v3.neq(a jsonb, b eql_v3.int8_ord) -function eql_v3.neq(a jsonb, b eql_v3.int8_ord_ope) -function eql_v3.neq(a jsonb, b eql_v3.int8_ord_ore) +function eql_v3.neq(a jsonb, b eql_v3.double_eq) +function eql_v3.neq(a jsonb, b eql_v3.double_ord) +function eql_v3.neq(a jsonb, b eql_v3.double_ord_ope) +function eql_v3.neq(a jsonb, b eql_v3.double_ord_ore) +function eql_v3.neq(a jsonb, b eql_v3.integer_eq) +function eql_v3.neq(a jsonb, b eql_v3.integer_ord) +function eql_v3.neq(a jsonb, b eql_v3.integer_ord_ope) +function eql_v3.neq(a jsonb, b eql_v3.integer_ord_ore) function eql_v3.neq(a jsonb, b eql_v3.numeric_eq) function eql_v3.neq(a jsonb, b eql_v3.numeric_ord) function eql_v3.neq(a jsonb, b eql_v3.numeric_ord_ope) function eql_v3.neq(a jsonb, b eql_v3.numeric_ord_ore) +function eql_v3.neq(a jsonb, b eql_v3.real_eq) +function eql_v3.neq(a jsonb, b eql_v3.real_ord) +function eql_v3.neq(a jsonb, b eql_v3.real_ord_ope) +function eql_v3.neq(a jsonb, b eql_v3.real_ord_ore) +function eql_v3.neq(a jsonb, b eql_v3.smallint_eq) +function eql_v3.neq(a jsonb, b eql_v3.smallint_ord) +function eql_v3.neq(a jsonb, b eql_v3.smallint_ord_ope) +function eql_v3.neq(a jsonb, b eql_v3.smallint_ord_ore) function eql_v3.neq(a jsonb, b eql_v3.text_eq) function eql_v3.neq(a jsonb, b eql_v3.text_ord) function eql_v3.neq(a jsonb, b eql_v3.text_ord_ope) @@ -672,29 +672,29 @@ function eql_v3.neq(a jsonb, b eql_v3.timestamp_eq) function eql_v3.neq(a jsonb, b eql_v3.timestamp_ord) function eql_v3.neq(a jsonb, b eql_v3.timestamp_ord_ope) function eql_v3.neq(a jsonb, b eql_v3.timestamp_ord_ore) +function eql_v3.ord_ope_term(a eql_v3.bigint_ord_ope) function eql_v3.ord_ope_term(a eql_v3.date_ord_ope) -function eql_v3.ord_ope_term(a eql_v3.float4_ord_ope) -function eql_v3.ord_ope_term(a eql_v3.float8_ord_ope) -function eql_v3.ord_ope_term(a eql_v3.int2_ord_ope) -function eql_v3.ord_ope_term(a eql_v3.int4_ord_ope) -function eql_v3.ord_ope_term(a eql_v3.int8_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.double_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.integer_ord_ope) function eql_v3.ord_ope_term(a eql_v3.numeric_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.real_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.smallint_ord_ope) function eql_v3.ord_ope_term(a eql_v3.text_ord_ope) function eql_v3.ord_ope_term(a eql_v3.timestamp_ord_ope) +function eql_v3.ord_term(a eql_v3.bigint_ord) +function eql_v3.ord_term(a eql_v3.bigint_ord_ore) function eql_v3.ord_term(a eql_v3.date_ord) function eql_v3.ord_term(a eql_v3.date_ord_ore) -function eql_v3.ord_term(a eql_v3.float4_ord) -function eql_v3.ord_term(a eql_v3.float4_ord_ore) -function eql_v3.ord_term(a eql_v3.float8_ord) -function eql_v3.ord_term(a eql_v3.float8_ord_ore) -function eql_v3.ord_term(a eql_v3.int2_ord) -function eql_v3.ord_term(a eql_v3.int2_ord_ore) -function eql_v3.ord_term(a eql_v3.int4_ord) -function eql_v3.ord_term(a eql_v3.int4_ord_ore) -function eql_v3.ord_term(a eql_v3.int8_ord) -function eql_v3.ord_term(a eql_v3.int8_ord_ore) +function eql_v3.ord_term(a eql_v3.double_ord) +function eql_v3.ord_term(a eql_v3.double_ord_ore) +function eql_v3.ord_term(a eql_v3.integer_ord) +function eql_v3.ord_term(a eql_v3.integer_ord_ore) function eql_v3.ord_term(a eql_v3.numeric_ord) function eql_v3.ord_term(a eql_v3.numeric_ord_ore) +function eql_v3.ord_term(a eql_v3.real_ord) +function eql_v3.ord_term(a eql_v3.real_ord_ore) +function eql_v3.ord_term(a eql_v3.smallint_ord) +function eql_v3.ord_term(a eql_v3.smallint_ord_ore) function eql_v3.ord_term(a eql_v3.text_ord) function eql_v3.ord_term(a eql_v3.text_ord_ore) function eql_v3.ord_term(a eql_v3.text_search) @@ -708,37 +708,27 @@ function eql_v3.ste_vec_contains(a eql_v3."json", b eql_v3."json") function eql_v3.ste_vec_contains(a jsonb[], b jsonb) function eql_v3.to_ste_vec_query(e eql_v3."json") function eql_v3.version() -type eql_v3.bool d +type eql_v3.bigint d +type eql_v3.bigint_eq d +type eql_v3.bigint_ord d +type eql_v3.bigint_ord_ope d +type eql_v3.bigint_ord_ore d +type eql_v3.boolean d type eql_v3.date d type eql_v3.date_eq d type eql_v3.date_ord d type eql_v3.date_ord_ope d type eql_v3.date_ord_ore d -type eql_v3.float4 d -type eql_v3.float4_eq d -type eql_v3.float4_ord d -type eql_v3.float4_ord_ope d -type eql_v3.float4_ord_ore d -type eql_v3.float8 d -type eql_v3.float8_eq d -type eql_v3.float8_ord d -type eql_v3.float8_ord_ope d -type eql_v3.float8_ord_ore d -type eql_v3.int2 d -type eql_v3.int2_eq d -type eql_v3.int2_ord d -type eql_v3.int2_ord_ope d -type eql_v3.int2_ord_ore d -type eql_v3.int4 d -type eql_v3.int4_eq d -type eql_v3.int4_ord d -type eql_v3.int4_ord_ope d -type eql_v3.int4_ord_ore d -type eql_v3.int8 d -type eql_v3.int8_eq d -type eql_v3.int8_ord d -type eql_v3.int8_ord_ope d -type eql_v3.int8_ord_ore d +type eql_v3.double d +type eql_v3.double_eq d +type eql_v3.double_ord d +type eql_v3.double_ord_ope d +type eql_v3.double_ord_ore d +type eql_v3.integer d +type eql_v3.integer_eq d +type eql_v3.integer_ord d +type eql_v3.integer_ord_ope d +type eql_v3.integer_ord_ore d type eql_v3.json d type eql_v3.jsonb_entry d type eql_v3.jsonb_query d @@ -747,6 +737,16 @@ type eql_v3.numeric_eq d type eql_v3.numeric_ord d type eql_v3.numeric_ord_ope d type eql_v3.numeric_ord_ore d +type eql_v3.real d +type eql_v3.real_eq d +type eql_v3.real_ord d +type eql_v3.real_ord_ope d +type eql_v3.real_ord_ore d +type eql_v3.smallint d +type eql_v3.smallint_eq d +type eql_v3.smallint_ord d +type eql_v3.smallint_ord_ope d +type eql_v3.smallint_ord_ore d type eql_v3.text d type eql_v3.text_eq d type eql_v3.text_match d diff --git a/tests/sqlx/src/jsonb_entry.rs b/tests/sqlx/src/jsonb_entry.rs index 6568ca140..a78149286 100644 --- a/tests/sqlx/src/jsonb_entry.rs +++ b/tests/sqlx/src/jsonb_entry.rs @@ -162,8 +162,14 @@ mod tests { #[test] fn pivots_delegate_to_integer() { - assert_eq!(::min_pivot().0, i32::MIN); - assert_eq!(::max_pivot().0, i32::MAX); + assert_eq!( + ::min_pivot().0, + i32::MIN + ); + assert_eq!( + ::max_pivot().0, + i32::MAX + ); assert_eq!(::mid_pivot().0, 0); } diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 19ae9608b..6b5633e0c 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1007,6 +1007,12 @@ fn float_sql_literal(x: f64) -> String { impl ScalarType for F4 { const PG_TYPE: &'static str = "real"; + // `real` happens to be a valid native SQL type, but derive the oracle column + // type from `EqlPlaintext` anyway (symmetric with F8) so the mapping is + // explicit rather than relying on the domain token coinciding with a native + // type name. + const PLAINTEXT_SQL_TYPE: &'static str = + ::PLAINTEXT_SQL_TYPE.as_str(); fn fixture_values() -> &'static [Self] { real_values() @@ -1038,6 +1044,13 @@ impl SignedScalar for F4 { impl ScalarType for F8 { const PG_TYPE: &'static str = "double"; + // The domain token `double` is NOT a valid native SQL type name (that is + // `double precision`), so the plaintext oracle column cannot default to + // `PG_TYPE`. Derive it from `EqlPlaintext` (the `ScalarKind`-keyed source of + // truth) so it stays `double precision` and cannot drift from the encrypt + // cast — the same PG_TYPE-vs-PLAINTEXT_SQL_TYPE split `timestamp` uses. + const PLAINTEXT_SQL_TYPE: &'static str = + ::PLAINTEXT_SQL_TYPE.as_str(); fn fixture_values() -> &'static [Self] { double_values() diff --git a/tests/sqlx/tests/eql_v3_integer_fixture_tests.rs b/tests/sqlx/tests/eql_v3_integer_fixture_tests.rs index 59d27de53..189ac10e1 100644 --- a/tests/sqlx/tests/eql_v3_integer_fixture_tests.rs +++ b/tests/sqlx/tests/eql_v3_integer_fixture_tests.rs @@ -107,10 +107,11 @@ async fn every_payload_carries_a_ciphertext(pool: PgPool) -> Result<()> { async fn plaintext_oracle_supports_value_filtering(pool: PgPool) -> Result<()> { // The in-table `plaintext` oracle: a consuming test can filter on it // directly. Exactly one row has plaintext = 42. - let ids: Vec = - sqlx::query_scalar("SELECT id FROM fixtures.eql_v3_integer WHERE plaintext = 42 ORDER BY id") - .fetch_all(&pool) - .await?; + let ids: Vec = sqlx::query_scalar( + "SELECT id FROM fixtures.eql_v3_integer WHERE plaintext = 42 ORDER BY id", + ) + .fetch_all(&pool) + .await?; assert_eq!( ids, vec![11], diff --git a/tests/sqlx/tests/v3_privilege_tests.rs b/tests/sqlx/tests/v3_privilege_tests.rs index c2219383e..997225fff 100644 --- a/tests/sqlx/tests/v3_privilege_tests.rs +++ b/tests/sqlx/tests/v3_privilege_tests.rs @@ -38,7 +38,8 @@ const EQ_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer \ /// NOT work here — a bare domain has no ORE opclass, so it silently falls back to /// built-in jsonb ordering and never crosses into `eql_v3_internal`. The `<` /// operator is what genuinely exercises the encrypted ordering path. -const ORD_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer a, fixtures.eql_v3_integer b \ +const ORD_QUERY: &str = + "SELECT count(*) FROM fixtures.eql_v3_integer a, fixtures.eql_v3_integer b \ WHERE a.payload::eql_v3.integer_ord < b.payload::eql_v3.integer_ord"; /// A real aggregate (`eql_v3.min` on `integer_ord`). The public aggregate dispatches From ab7f81860dfc5c6581491f6967d43baf803567e3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 3 Jul 2026 12:09:13 +1000 Subject: [PATCH 480/599] docs(v3): use SQL-standard scalar domain names throughout Reference docs, CLAUDE.md, README, SUPABASE, DEVELOPMENT, and the [Unreleased] CHANGELOG entries now name the canonical domains (eql_v3.integer/smallint/ bigint/boolean/real/double). eql_v2 history, PR links, and native-type mentions (e.g. 'double precision', 'real') preserved. Kept ScalarKind doc comments that describe the *native* PG type (Postgres real/float4, double precision/float8). --- CHANGELOG.md | 15 ++++-- CLAUDE.md | 8 +-- DEVELOPMENT.md | 8 +-- README.md | 2 +- SUPABASE.md | 4 +- docs/development/sql-documentation.md | 36 ++++++------- .../adding-a-scalar-encrypted-domain-type.md | 50 ++++++++--------- docs/reference/catalog-driven-architecture.md | 54 +++++++++---------- docs/reference/eql-functions.md | 20 +++---- docs/reference/permissions.md | 2 +- docs/reference/sql-support.md | 12 ++--- 11 files changed, 109 insertions(+), 102 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbb6d8426..a808b0f10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,17 +33,23 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) - **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) - **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) +- **`eql_v3` encrypted-domain schema, with the `integer` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `integer` columns: `eql_v3.integer` (storage-only), `eql_v3.integer_eq` (`=` / `<>` via HMAC), and `eql_v3.integer_ord` / `eql_v3.integer_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225)) +- **`eql_v3.smallint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `smallint` columns — `eql_v3.smallint` (storage-only), `eql_v3.smallint_eq` (`=` / `<>` via HMAC), and `eql_v3.smallint_ord` / `eql_v3.smallint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `smallint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `integer` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243)) +- **`eql_v3.bigint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `bigint` columns — `eql_v3.bigint` (storage-only), `eql_v3.bigint_eq` (`=` / `<>` via HMAC), and `eql_v3.bigint_ord` / `eql_v3.bigint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `bigint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253)) +- **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256)) - **`eql_v3.timestamp` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `timestamp` columns — `eql_v3.timestamp` (storage-only), `eql_v3.timestamp_eq` (`=` / `<>` via HMAC), and `eql_v3.timestamp_ord` / `eql_v3.timestamp_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 12-block ORE) — generated from the `timestamp` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast, so the stored value is a UTC instant (Postgres `timestamp with time zone`) wearing the SQL-standard name `timestamp` to match the cipherstash cast / `ColumnType::Timestamp` / `Plaintext::Timestamp` convention. Ordering works because the `eql_v3` ORE block comparator now derives its block count from the ciphertext width (see the comparator entry below) instead of assuming 8. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257)) - **`eql_v3.numeric` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `numeric` / `decimal` columns — `eql_v3.numeric` (storage-only), `eql_v3.numeric_eq` (`=` / `<>` via HMAC), and `eql_v3.numeric_ord` / `eql_v3.numeric_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 14-block ORE) — generated from the `numeric` row in `eql-scalars::CATALOG`. cipherstash encrypts `Plaintext::Decimal` at native 14-block ORE width; ordering matches `rust_decimal::Decimal` ordering exactly (equivalent scales such as `1` and `1.0` collide, like Postgres `numeric`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors. Why: a type-safe, ordered encrypted decimal column, the first scalar to exercise an ORE term wider than 8 blocks. ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) - **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) -- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) +- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) -- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) -- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`int2`/`int4`/`int8`/`date`/`timestamp`/`numeric`/`text`). Equality across two independent encryptions of one value is exercised credential-free by the fixture suite via committed per-type *doubles* fixtures (each plaintext encrypted twice — `property::cross_ciphertext`), through both the `hm` (`_eq`) and ORE (`_ord`/`_ord_ore`) equality paths, and additionally by the e2e suite via fresh duplicate plaintexts each run. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293)) +- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260)) +- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`smallint`/`integer`/`bigint`/`date`/`timestamp`/`numeric`/`text`). Equality across two independent encryptions of one value is exercised credential-free by the fixture suite via committed per-type *doubles* fixtures (each plaintext encrypted twice — `property::cross_ciphertext`), through both the `hm` (`_eq`) and ORE (`_ord`/`_ord_ore`) equality paths, and additionally by the e2e suite via fresh duplicate plaintexts each run. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293)) - **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255)) - **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.jsonb_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) - **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '3'` — see the envelope-version entry under Changed). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) - **`eql_v3.float4` / `eql_v3.float8` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.float4` / `eql_v3.float8` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `float4` / `float8` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `float4` vs `float8` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `int8`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299)) +- **`eql_v3.boolean` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `boolean` columns — `eql_v3.boolean` — generated from the `boolean` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `boolean` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) +- **`eql_v3.real` / `eql_v3.double` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.real` / `eql_v3.double` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `real` / `double` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `real` vs `double` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `bigint`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299)) - **`eql_v3` encrypted-JSONB (SteVec) payload bindings — Rust, TypeScript, and JSON Schema.** JSONB is now a first-class member of `eql-domains::CATALOG`, so its payload types ship as canonical, drift-gated bindings alongside the scalar families: `SteVecDocument` (`eql_v3.json`), `SteVecEntry` (`eql_v3.jsonb_entry`), `SteVecQuery` (`eql_v3.jsonb_query`), plus the shared untagged `SteVecTerm` (`{hm} | {oc}`), `SteVecQueryEntry`, and the `OreCllw` / `Selector` term newtypes — under `crates/eql-bindings/src/v3/jsonb.rs`, `bindings/v3/*.ts`, and `schema/v3/*.json`, drift-gated by `types:check`. A new `Shape` discriminant on each catalog domain lets scalar-only consumers filter and all-family consumers branch; the SteVec struct bodies and the encrypted-JSONB SQL surface stay hand-written (the generator skips SteVec shapes but still drives the bindings inventory). The bindings are parsed against a real generated SteVec ciphertext row in the SQLx suite, tying them to real crypto and the SQL domain CHECK. Why: the SteVec wire types were the only `eql_v3` payloads without generated, drift-gated bindings — protocol consumers (`cipherstash-client`, `protect-ffi`, CipherStash Proxy) can now depend on canonical, catalog-checked encrypted-JSONB types. ([#336](https://github.com/cipherstash/encrypt-query-language/pull/336)) - **`eql_v3._ord_ope` encrypted-domain variants — CLLW-OPE ordering across every ordered scalar family.** Every ordered scalar family (`int2`, `int4`, `int8`, `date`, `timestamp`, `numeric`, `text`, `float4`, `float8`) gains an `_ord_ope` domain backed by a new CLLW-OPE index term: the `op` payload key carries a hex-encoded OPE ciphertext that is order-preserving under plain byte comparison, so ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) reduces to hex-decode + native bytea comparison via the new self-contained SEM type `eql_v3_internal.ope_cllw` — no custom N-block comparison protocol, unlike the `_ord` / `_ord_ore` block-ORE domains. Integer-family `_ord_ope` domains carry `[op]` alone (OPE equality is lossless for them); `text_ord_ope` carries `[hm, op]` so `=` / `<>` stay exact via HMAC (OPE over text is not equality-lossless, matching `text_ord`). Index via a functional btree index on the new `eql_v3.ord_ope_term(col)` extractor (its `eql_v3_internal.ope_cllw` return type is a domain over `bytea`, inheriting the native comparison operators and DEFAULT btree opclass — the whole comparison chain stays inlinable, so the index engages structurally), not an operator class on the domain. This revives the v2.2-era `opf` / `opv` order-preserving terms under the modern single `op` wire key that cipherstash-client re-emits for ordered scalars (CIP-3280). Rust / TypeScript / JSON Schema payload bindings (`Int4OrdOpe`, `TextOrdOpe`, … with the `OpeCllw` term newtype) ship alongside, drift-gated by `types:check`. `bool` stays storage-only, and the combined `text_search` domain deliberately stays `[hm, ob, bf]` — adding `op` to its CHECK would break every `_search` fixture while the pinned client emits no OPE term (CIP-3280), for no new operator capability; revisit under CIP-3348. Why: OPE terms are natively index-sortable, giving ordered encrypted columns a cheaper comparison path than the block-ORE protocol. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340)) @@ -53,6 +59,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v3` tier's JSON envelope version is now `v: 3` (was `v: 2`).** Every `eql_v3` domain CHECK — the generated scalar families and the hand-written `eql_v3.json` SteVec document domain — now pins `VALUE->>'v' = '3'`, and the canonical payload bindings (`SchemaVersion` in `eql-bindings`, the emitted TypeScript alias, and the JSON Schema `const`) accept exactly `3`, rejecting the legacy `2` at the type boundary. The v3 tier previously carried the v2 wire version for continuity; with the tier now diverging from the legacy wire (the new `op` term), the envelope version matches the schema generation. The legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json` and its validation tests) is unchanged and stays `v: 2`. **Compatibility:** payloads produced for the v3 tier must now carry `v: 3` — a cipherstash-client that emits `v: 2` cannot insert into `eql_v3` domain columns until it is updated to emit the v3 envelope. See [U-001](docs/upgrading/v3.0.md#u-001-eql_v3-payloads-carry-v-3) in the 3.0 upgrade guide. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340)) - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) +- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`integer`, `bigint`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) - **The self-contained `eql_v3` installer is now the sole release artifact, shipped under the canonical name `release/cipherstash-encrypt.sql` (+ `cipherstash-encrypt-uninstall.sql`).** The combined, Supabase, and Protect build variants are removed; `mise run build` now produces only the `eql_v3` surface, written under the canonical name that the combined build previously used — so existing install URLs keep working. Why: with `eql_v2` removed (see below), there is a single SQL surface to build, install, and test. @@ -63,7 +70,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). ### Fixed -- **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.int4_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) +- **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.integer_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamp` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) diff --git a/CLAUDE.md b/CLAUDE.md index 384231785..d67c31764 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -45,7 +45,7 @@ There are no longer separate Main / Supabase / Protect / v3-only build variants. This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for searchable encryption. Key architectural components: ### Core Structure -- **Schema**: EQL ships two PostgreSQL schemas. `eql_v3` is the public API: the encrypted-domain type families (`int4`, `int2`, `int8`, `date`, `timestamp`, `numeric`, `text`, `bool`, `float4`, `float8`), query operators, index extractors (`eq_term`/`ord_term`/`match_term`), `min`/`max` aggregates, `version()`, `lints()`, **and the operator-backing comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`, plus the jsonb containment helpers `jsonb_contains`/`jsonb_contained_by`/`jsonb_array`/`ste_vec_contains`). The wrappers are public because they are the function-form equivalent of every supported operator — platforms without operator support (Supabase/PostgREST invoke functions, not operators) call them by name (gated by `tests/sqlx/tests/v3_operator_equivalents_tests.rs`). `eql_v3_internal` holds INTERNAL objects only: the searchable-encrypted-metadata (SEM) index-term **types** (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`, `eql_v3_internal.bloom_filter`, `eql_v3_internal.ore_cllw`, hand-written under `src/v3/sem/`) and their support/constructor/comparator functions, the generated **blockers** (which only raise on unsupported ops), the **aggregate state functions**, and the SteVec CHECK validators. Splitting the index-term TYPES into `eql_v3_internal` keeps the Supabase Studio Table Builder type picker (which lists every type in every non-hidden schema) free of index-term-only types. **Design decision: EQL never grants permissions automatically — the installer issues no `GRANT`/`REVOKE`; access to either schema is strictly opt-in (see `docs/reference/permissions.md`).** Together the two schemas are **self-contained** and install into a database with no other EQL schema present. The earlier `eql_v2` schema (composite `eql_v2_encrypted` column type, database-side configuration management, operator-class-on-column indexing) was **removed in 3.0.0** — see the `[Unreleased]`/3.0.0 entry in `CHANGELOG.md`. `eql_v2` is no longer built or shipped; it survives only in fork-provenance comments under `src/v3/` (the v3 SEM types were forked from the old v2 originals) and in historical records (`CHANGELOG.md`, the v2.x upgrade guides). +- **Schema**: EQL ships two PostgreSQL schemas. `eql_v3` is the public API: the encrypted-domain type families (`integer`, `smallint`, `bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, `double`), query operators, index extractors (`eq_term`/`ord_term`/`match_term`), `min`/`max` aggregates, `version()`, `lints()`, **and the operator-backing comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`, plus the jsonb containment helpers `jsonb_contains`/`jsonb_contained_by`/`jsonb_array`/`ste_vec_contains`). The wrappers are public because they are the function-form equivalent of every supported operator — platforms without operator support (Supabase/PostgREST invoke functions, not operators) call them by name (gated by `tests/sqlx/tests/v3_operator_equivalents_tests.rs`). `eql_v3_internal` holds INTERNAL objects only: the searchable-encrypted-metadata (SEM) index-term **types** (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`, `eql_v3_internal.bloom_filter`, `eql_v3_internal.ore_cllw`, hand-written under `src/v3/sem/`) and their support/constructor/comparator functions, the generated **blockers** (which only raise on unsupported ops), the **aggregate state functions**, and the SteVec CHECK validators. Splitting the index-term TYPES into `eql_v3_internal` keeps the Supabase Studio Table Builder type picker (which lists every type in every non-hidden schema) free of index-term-only types. **Design decision: EQL never grants permissions automatically — the installer issues no `GRANT`/`REVOKE`; access to either schema is strictly opt-in (see `docs/reference/permissions.md`).** Together the two schemas are **self-contained** and install into a database with no other EQL schema present. The earlier `eql_v2` schema (composite `eql_v2_encrypted` column type, database-side configuration management, operator-class-on-column indexing) was **removed in 3.0.0** — see the `[Unreleased]`/3.0.0 entry in `CHANGELOG.md`. `eql_v2` is no longer built or shipped; it survives only in fork-provenance comments under `src/v3/` (the v3 SEM types were forked from the old v2 originals) and in historical records (`CHANGELOG.md`, the v2.x upgrade guides). - **Main Type**: `eql_v2_encrypted` - composite type for encrypted columns (stored as JSONB) - **Configuration**: `eql_v2_configuration` table tracks encryption configs - **Index Types**: Various encrypted index types (blake3, hmac_256, bloom_filter, ore variants) @@ -70,11 +70,11 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.int4`, `eql_v3.int4_eq`, `eql_v3.int4_ord`, `eql_v3.int4_ord_ore` — created in `eql_v3`, not `public`. Their extractors (`eql_v3.eq_term`, `eql_v3.ord_term`), aggregates (`eql_v3.min`/`max`), **and the supported comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) all live in **`eql_v3`** — the wrappers are public so every operator has a callable function equivalent (Supabase/PostgREST). Only the **blockers** (for unsupported operators — they just raise), the **aggregate state functions**, and the SEM index-term types the extractors/wrappers return and construct (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`) live in **`eql_v3_internal`** — hand-written under `src/v3/sem/`, schema-qualified via the codegen's `INTERNAL_SCHEMA` constant for the generated surface (the codegen's `SCHEMA` constant qualifies the public wrappers; the `operator_entry` renderer picks the backing function's schema by whether the operator is supported) — so the whole v3 surface (both schemas together) is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `eql_v3.int4` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `int4`, `int2`, `int8`, `date`, `timestamp`, `numeric`, `text`, `bool`, `float4`, and `float8`, all following this materializer pattern. `jsonb` is a `CATALOG` family too, but a permanently **hand-written**, not generated, one: its three domains (`eql_v3.json` document, `eql_v3.jsonb_entry`, `eql_v3.jsonb_query`) carry `Shape::SteVecDocument` / `SteVecEntry` / `SteVecQuery` (the `Shape` enum in `crates/eql-domains/src/lib.rs`) instead of `Shape::Scalar`, and their SQL lives under `src/v3/jsonb/` rather than `src/v3/scalars//` — `eql-codegen` renders SQL only for `scalar_families()` (the `Shape::Scalar` rows), so the fixed-envelope ordered-scalar materializer described below never touches `jsonb`. This is a deliberate, permanent split, not a gap awaiting a future generator. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`eql_v3` schema**, one domain per operator/index capability (`eql_v3.` storage-only, `eql_v3._eq`, `eql_v3._ord`). The schema qualifier replaces the old version-prefixed name, so the domains are `eql_v3.integer`, `eql_v3.integer_eq`, `eql_v3.integer_ord`, `eql_v3.integer_ord_ore` — created in `eql_v3`, not `public`. Their extractors (`eql_v3.eq_term`, `eql_v3.ord_term`), aggregates (`eql_v3.min`/`max`), **and the supported comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) all live in **`eql_v3`** — the wrappers are public so every operator has a callable function equivalent (Supabase/PostgREST). Only the **blockers** (for unsupported operators — they just raise), the **aggregate state functions**, and the SEM index-term types the extractors/wrappers return and construct (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`) live in **`eql_v3_internal`** — hand-written under `src/v3/sem/`, schema-qualified via the codegen's `INTERNAL_SCHEMA` constant for the generated surface (the codegen's `SCHEMA` constant qualifies the public wrappers; the `operator_entry` renderer picks the backing function's schema by whether the operator is supported) — so the whole v3 surface (both schemas together) is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `eql_v3.integer` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `integer`, `smallint`, `bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, and `double`, all following this materializer pattern. `jsonb` is a `CATALOG` family too, but a permanently **hand-written**, not generated, one: its three domains (`eql_v3.json` document, `eql_v3.jsonb_entry`, `eql_v3.jsonb_query`) carry `Shape::SteVecDocument` / `SteVecEntry` / `SteVecQuery` (the `Shape` enum in `crates/eql-domains/src/lib.rs`) instead of `Shape::Scalar`, and their SQL lives under `src/v3/jsonb/` rather than `src/v3/scalars//` — `eql-codegen` renders SQL only for `scalar_families()` (the `Shape::Scalar` rows), so the fixed-envelope ordered-scalar materializer described below never touches `jsonb`. This is a deliberate, permanent split, not a gap awaiting a future generator. -Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `DomainFamily` giving the type `name` (e.g. `int8`), its `ScalarKind` (the `kind` field), the `Domain`s mapping each generated (bare) domain name to its fixed index `Term`s (`eq => [Hm]`, `ord`/`ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are **committed in place** under `src/v3/scalars//` and drift-gated by `mise run codegen:parity` (regenerate in place + `git diff` + untracked check — the same regenerate-and-diff pattern `types:check` uses for the committed bindings). They are still machine-generated: change the catalog and rebuild, never hand-edit (CI fails on drift). The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` (see above) never enters this pipeline: every consumer here (`generate_all`, `list-types`, the SQLx matrix) iterates `eql_domains::scalar_families()`, which excludes any non-`Shape::Scalar` row, so `jsonb` is invisible to the materializer and the matrix by construction, not by a per-type exception. +Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `DomainFamily` giving the type `name` (e.g. `bigint`), its `ScalarKind` (the `kind` field), the `Domain`s mapping each generated (bare) domain name to its fixed index `Term`s (`eq => [Hm]`, `ord`/`ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are **committed in place** under `src/v3/scalars//` and drift-gated by `mise run codegen:parity` (regenerate in place + `git diff` + untracked check — the same regenerate-and-diff pattern `types:check` uses for the committed bindings). They are still machine-generated: change the catalog and rebuild, never hand-edit (CI fails on drift). The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` (see above) never enters this pipeline: every consumer here (`generate_all`, `list-types`, the SQLx matrix) iterates `eql_domains::scalar_families()`, which excludes any non-`Shape::Scalar` row, so `jsonb` is invisible to the materializer and the matrix by construction, not by a per-type exception. -The same generator also emits the **Rust payload bindings** under `crates/eql-bindings/src/v3/.rs` (structs + `DomainType` impls) and the `inventory.rs` `all()` list, from the same `CATALOG` — committed with a `// @generated` header (the bindings must exist on a clean clone because `ts-rs`/`schemars` derive the committed TypeScript/JSON Schema off them; the SQL surface is now committed too, so both generated targets are handled consistently — committed in place, drift-gated by regenerate-and-`git diff`). The hand-written `DomainType` trait, the shared newtypes (`SchemaVersion`/`Identifier`/`Ciphertext`/`Hmac256`/`OreBlock256`/`BloomFilter`), the `PhantomData` plumbing, and the architectural module doc (including the non-derivable float-NaN and bool storage-only caveats) stay hand-written in `crates/eql-bindings/src/v3/{mod,domain_type,terms}.rs`. Generated structs carry a catalog-derived struct doc — a summary line (`` `eql_v3.` — . ``) plus a detail line listing the supported operators and required payload keys, all derived from data the catalog already holds (the capability label, `Term::operators_for_terms`, and `ENVELOPE_KEYS` ++ `Term::term_json_keys` — see `struct_doc_lines` in `crates/eql-codegen/src/bindings.rs`). The required-key list makes structural distinctions visible — e.g. `text_ord` lists `` `v` `i` `c` `hm` `ob` `` (dual-term) versus an integer `int4_ord`'s `` `v` `i` `c` `ob` ``. There are **no per-field docs**: per-field/term semantics live on the shared term newtypes (`terms.rs`, flowing into the TS term files and JSON Schema `$defs`), and non-derivable per-family caveats (float-NaN, bool storage-only) in `mod.rs`. Free-form prose belongs at the **struct level** (a future optional catalog `doc` field emitted as extra `#[doc]` lines), never as per-field docs. JSON Schemas are emitted by **schemars 1.x** as JSON Schema 2020-12. `mise run types:generate` regenerates the Rust bindings (via `eql-codegen bindings`) then the TS/JSON; `mise run types:check` is the committed-reference drift gate — it regenerates and `git diff`s all three (`crates/eql-bindings/src/v3` + `bindings/` + `schema/`), the same regenerate-and-diff pattern `codegen:parity` now uses for the committed SQL surface. Both gates run in CI; `mise run install-hooks` wires a pre-commit hook that runs both locally whenever a commit touches the catalog, the generator, or a committed generated surface. The `jsonb` family's own structs (`SteVecDocument`/`SteVecEntry`/`SteVecQuery`, plus the shared `SteVecTerm`/`SteVecQueryEntry`/`OreCllw`/`Selector` newtypes) are hand-written for the same reason as its SQL — in `crates/eql-bindings/src/v3/jsonb.rs`, symmetric with `src/v3/jsonb/` — their field layout (`#[serde(flatten)]`, an `Option` array marker, per-struct serde strictness) isn't derivable from the catalog the way a flat scalar struct is. Only inventory membership and ordering are catalog-driven: `inventory.rs::all()` iterates the full `CATALOG` (not `scalar_families()`), branching on `Shape` to include the three jsonb structs alongside the generated ones. +The same generator also emits the **Rust payload bindings** under `crates/eql-bindings/src/v3/.rs` (structs + `DomainType` impls) and the `inventory.rs` `all()` list, from the same `CATALOG` — committed with a `// @generated` header (the bindings must exist on a clean clone because `ts-rs`/`schemars` derive the committed TypeScript/JSON Schema off them; the SQL surface is now committed too, so both generated targets are handled consistently — committed in place, drift-gated by regenerate-and-`git diff`). The hand-written `DomainType` trait, the shared newtypes (`SchemaVersion`/`Identifier`/`Ciphertext`/`Hmac256`/`OreBlock256`/`BloomFilter`), the `PhantomData` plumbing, and the architectural module doc (including the non-derivable float-NaN and bool storage-only caveats) stay hand-written in `crates/eql-bindings/src/v3/{mod,domain_type,terms}.rs`. Generated structs carry a catalog-derived struct doc — a summary line (`` `eql_v3.` — . ``) plus a detail line listing the supported operators and required payload keys, all derived from data the catalog already holds (the capability label, `Term::operators_for_terms`, and `ENVELOPE_KEYS` ++ `Term::term_json_keys` — see `struct_doc_lines` in `crates/eql-codegen/src/bindings.rs`). The required-key list makes structural distinctions visible — e.g. `text_ord` lists `` `v` `i` `c` `hm` `ob` `` (dual-term) versus an integer `integer_ord`'s `` `v` `i` `c` `ob` ``. There are **no per-field docs**: per-field/term semantics live on the shared term newtypes (`terms.rs`, flowing into the TS term files and JSON Schema `$defs`), and non-derivable per-family caveats (float-NaN, bool storage-only) in `mod.rs`. Free-form prose belongs at the **struct level** (a future optional catalog `doc` field emitted as extra `#[doc]` lines), never as per-field docs. JSON Schemas are emitted by **schemars 1.x** as JSON Schema 2020-12. `mise run types:generate` regenerates the Rust bindings (via `eql-codegen bindings`) then the TS/JSON; `mise run types:check` is the committed-reference drift gate — it regenerates and `git diff`s all three (`crates/eql-bindings/src/v3` + `bindings/` + `schema/`), the same regenerate-and-diff pattern `codegen:parity` now uses for the committed SQL surface. Both gates run in CI; `mise run install-hooks` wires a pre-commit hook that runs both locally whenever a commit touches the catalog, the generator, or a committed generated surface. The `jsonb` family's own structs (`SteVecDocument`/`SteVecEntry`/`SteVecQuery`, plus the shared `SteVecTerm`/`SteVecQueryEntry`/`OreCllw`/`Selector` newtypes) are hand-written for the same reason as its SQL — in `crates/eql-bindings/src/v3/jsonb.rs`, symmetric with `src/v3/jsonb/` — their field layout (`#[serde(flatten)]`, an `Option` array marker, per-struct serde strictness) isn't derivable from the catalog the way a flat scalar struct is. Only inventory membership and ordering are catalog-driven: `inventory.rs::all()` iterates the full `CATALOG` (not `scalar_families()`), branching on `Shape` to include the three jsonb structs alongside the generated ones. **Adding a new encrypted-domain type: follow `docs/reference/adding-a-scalar-encrypted-domain-type.md`.** The mechanics are fixed for ordered scalar domains; the catalog row only declares the name, kind, bare domain names, and terms. New term behavior belongs in the `Term` enum's `impl` methods in `crates/eql-domains/src` with tests, not in free-form catalog data. diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index a2ff59119..d9dc4f41c 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -39,8 +39,8 @@ mise has tasks for: ### The `eql_v3` surface EQL installs a single, self-contained PostgreSQL schema, **`eql_v3`**, which -namespaces the encrypted-domain **scalar type families** (`int4`, `int2`, -`int8`, `date`, `timestamp`, `numeric`, `text`, `bool`, `float4`, `float8`). +namespaces the encrypted-domain **scalar type families** (`integer`, `smallint`, +`bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, `double`). It owns its own copies of the searchable-encrypted-metadata (SEM) index-term types it needs (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.bloom_filter`), so the surface has no dependency on any other EQL schema and installs into a @@ -85,7 +85,7 @@ These are the important files and directories in the repo: │ │ ├── sem/ <-- hand-written SEM index-term types (hmac_256, ore_block_256, …) │ │ ├── scalars/ <-- generated scalar domain families, one dir per type │ │ │ ├── functions.sql <-- shared blocker for native jsonb operators -│ │ │ └── / <-- e.g. int4/, text/, bool/ (generated, committed in place) +│ │ │ └── / <-- e.g. integer/, text/, bool/ (generated, committed in place) │ │ ├── jsonb/ <-- jsonb SteVec support │ │ └── lint/ <-- structural lints │ ├── deps-v3.txt <-- REQUIRE edges for the v3 surface @@ -189,7 +189,7 @@ TOML manifest and no Python. Each scalar type is one `DomainFamily` row in `CATALOG`, declaring: -- the type `name` (e.g. `int8`), +- the type `name` (e.g. `bigint`), - its `ScalarKind` (the `kind` field), - the `Domain`s mapping each generated (bare) domain name to its fixed index `Term`s (`eq => [Hm]`, `ord` / `ord_ore => [Ore]`), and diff --git a/README.md b/README.md index 6a53323e3..5f68fae7d 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ EQL installs the following components into the `eql_v3` schema: | Name | Entity Type | Purpose | | --------------------------------------------------- | ------------- | ------------------------------------------------------------------- | | `eql_v3` | Schema | Holds all EQL types, operators, functions, and aggregates | -| `eql_v3.`, `eql_v3._eq`, `eql_v3._ord` | Domain types | Per-scalar encrypted columns (one family per scalar: `int4`, `text`, `timestamp`, …) | +| `eql_v3.`, `eql_v3._eq`, `eql_v3._ord` | Domain types | Per-scalar encrypted columns (one family per scalar: `integer`, `text`, `timestamp`, …) | | `eql_v3.json` | Domain type | Encrypted JSON (structured-encryption) documents | | `eql_v3.eq_term` / `ord_term` / `match_term` | Functions | Index-term extractors for functional indexes | diff --git a/SUPABASE.md b/SUPABASE.md index b3865443a..1d5f9e183 100644 --- a/SUPABASE.md +++ b/SUPABASE.md @@ -18,7 +18,7 @@ so that recipe needed a cut-down build. `eql_v3` removes the dependency entirely. Every encrypted column is typed as a `jsonb`-backed **domain** in the `eql_v3` schema (for example -`eql_v3.text_eq`, `eql_v3.int4_ord`, `eql_v3.json`), and search is driven by +`eql_v3.text_eq`, `eql_v3.integer_ord`, `eql_v3.json`), and search is driven by **functional indexes over small term-extractor functions** rather than an operator class on the column: @@ -147,7 +147,7 @@ for the full explanation. ```sql SELECT eql_v3.min(encrypted_at) FROM events; -SELECT eql_v3.max(encrypted_amount::eql_v3.int4_ord) FROM orders; +SELECT eql_v3.max(encrypted_amount::eql_v3.integer_ord) FROM orders; ``` ## Text matching (not `LIKE`) diff --git a/docs/development/sql-documentation.md b/docs/development/sql-documentation.md index 04dcf7e83..1e17b8bc9 100644 --- a/docs/development/sql-documentation.md +++ b/docs/development/sql-documentation.md @@ -34,14 +34,14 @@ prefix (not plain `--`). Coverage and required tags are checked by `mise run doc --! hash index. Inlinable, so a functional index on this extractor engages --! bare-form queries. --! ---! @param a eql_v3.int4_eq Encrypted value carrying an `hm` term +--! @param a eql_v3.integer_eq Encrypted value carrying an `hm` term --! @return eql_v3.hmac_256 The equality index term --! --! @example --! CREATE INDEX ON users USING hash (eql_v3.eq_term(salary_eq)); --! --! @see eql_v3.ord_term -CREATE FUNCTION eql_v3.eq_term(a eql_v3.int4_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.integer_eq) RETURNS eql_v3.hmac_256 AS $$ ... $$; ``` @@ -64,8 +64,8 @@ AS $$ ... $$; --! Implements the `=` operator for an `eql_v3` domain variant. Reduces to a --! comparison on the extracted equality term — no decryption. --! ---! @param a eql_v3.int4_eq Left operand ---! @param b eql_v3.int4_eq Right operand +--! @param a eql_v3.integer_eq Left operand +--! @param b eql_v3.integer_eq Right operand --! @return Boolean True if the equality terms match --! --! @example @@ -73,27 +73,27 @@ AS $$ ... $$; --! SELECT * FROM users WHERE encrypted_email = $1; --! --! @see eql_v3.eq_term -CREATE FUNCTION eql_v3.eq(a eql_v3.int4_eq, b eql_v3.int4_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.integer_eq, b eql_v3.integer_eq) RETURNS boolean AS $$ ... $$; CREATE OPERATOR = ( FUNCTION=eql_v3.eq, - LEFTARG=eql_v3.int4_eq, - RIGHTARG=eql_v3.int4_eq + LEFTARG=eql_v3.integer_eq, + RIGHTARG=eql_v3.integer_eq ); ``` ### Domain Type ```sql ---! @brief Encrypted-domain type for an equality-searchable int4 column +--! @brief Encrypted-domain type for an equality-searchable integer column --! --! A `jsonb`-backed domain in the `eql_v3` schema. The `CHECK` requires the --! envelope keys (`v`, `i`, `c`), the equality term (`hm`), and pins the --! payload version (`VALUE->>'v' = '2'`). --! --! @see eql_v3.eq_term -CREATE DOMAIN eql_v3.int4_eq AS jsonb +CREATE DOMAIN eql_v3.integer_eq AS jsonb CHECK ( ... ); ``` @@ -101,11 +101,11 @@ CREATE DOMAIN eql_v3.int4_eq AS jsonb ```sql --! @brief State transition function for the MIN aggregate --! @internal ---! @param $1 eql_v3.int4_ord Accumulated state ---! @param $2 eql_v3.int4_ord New value ---! @return eql_v3.int4_ord Updated state -CREATE FUNCTION eql_v3.min_sfunc(eql_v3.int4_ord, eql_v3.int4_ord) - RETURNS eql_v3.int4_ord +--! @param $1 eql_v3.integer_ord Accumulated state +--! @param $2 eql_v3.integer_ord New value +--! @return eql_v3.integer_ord Updated state +CREATE FUNCTION eql_v3.min_sfunc(eql_v3.integer_ord, eql_v3.integer_ord) + RETURNS eql_v3.integer_ord AS $$ ... $$; --! @brief Minimum encrypted value in a group @@ -113,16 +113,16 @@ AS $$ ... $$; --! Aggregate over an ordered encrypted-domain column. Comparison routes --! through the variant's `<` operator (the ORE block term) — no decryption. --! ---! @param input eql_v3.int4_ord Encrypted values to aggregate ---! @return eql_v3.int4_ord The minimum value +--! @param input eql_v3.integer_ord Encrypted values to aggregate +--! @return eql_v3.integer_ord The minimum value --! --! @example --! SELECT eql_v3.min(price_encrypted) FROM products; --! --! @see eql_v3.min_sfunc -CREATE AGGREGATE eql_v3.min(eql_v3.int4_ord) ( +CREATE AGGREGATE eql_v3.min(eql_v3.integer_ord) ( SFUNC = eql_v3.min_sfunc, - STYPE = eql_v3.int4_ord + STYPE = eql_v3.integer_ord ); ``` diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index 10894930c..39ccc1232 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -1,6 +1,6 @@ # Adding a Scalar Encrypted-Domain Type -The one reference for adding a scalar encrypted-domain type (`int4`, `int2`, +The one reference for adding a scalar encrypted-domain type (`integer`, `smallint`, and future ordered numeric scalars). The **top half** (§§1–4) is the path you follow to add a type; the **reference half** (§§5–8) is the detail behind it — the generated surface, its invariants, and how the generator itself works. @@ -23,8 +23,8 @@ The whole SQL surface is **generated** from a single Rust source of truth: the rendered by the [`eql-codegen`](../../crates/eql-codegen/) crate. There is no TOML manifest and no Python — adding a type is adding one `DomainFamily` row, validated by the compiler plus catalog `#[test]`s. The reference type is -`eql_v3.int4`; `eql_v3.text` is the worked non-integer example (ordered + -equality + a `match` capability via the `Bloom` term); `eql_v3.bool` is the +`eql_v3.integer`; `eql_v3.text` is the worked non-integer example (ordered + +equality + a `match` capability via the `Bloom` term); `eql_v3.boolean` is the worked **storage-only / encryption-only** example (a single term-less domain, no searchable surface — see §8). **`jsonb` remains out of scope** for this materializer (see §7). @@ -33,7 +33,7 @@ materializer (see §7). ## 1. TL;DR — the one path -To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): +To add a scalar type `` (e.g. `bigint`), with Rust type `` (e.g. `i64`): 1. **Add a `DomainFamily` row to `eql_domains::CATALOG`** — just `name` + `domains` — plus a matching `TypeFixtures` record (carrying the `kind` and the @@ -44,7 +44,7 @@ To add a scalar type `` (e.g. `int8`), with Rust type `` (e.g. `i64`): next to `CATALOG`, pinned by a `values_tests` assertion (§2). This is the single source the SQLx matrix reads; there is no generated `_values.rs`. 3. **Wire the SQLx matrix oracle** — for an integer type, copy the two small - registrations from the `int4` reference; a non-integer (string-backed) type + registrations from the `integer` reference; a non-integer (string-backed) type needs a third (`scalar_domains.rs`), and `date`/`text` are the references there (§3). 4. **Regenerate** — `cargo run -p eql-codegen` (or just `mise run build`, which @@ -99,7 +99,7 @@ with a `TypeFixtures` record in ```rust // The structural catalog row — name + domains only: const INT4: DomainFamily = DomainFamily { - name: "int4", + name: "integer", domains: ORDERED_INT_DOMAINS, // storage, _eq (hm), _ord_ore (ore), _ord (ore), _ord_ope (ope) }; @@ -121,7 +121,7 @@ block in `record.rs` enforces the 1:1 — every `CATALOG` row has exactly one `TypeFixtures` (same order) carrying the right `kind`. All are otherwise enforced by the type system and the catalog `#[test]`s rather than a runtime validator: -- **`name`** (on `DomainFamily`) — the type name (`int4`); supplies `` +- **`name`** (on `DomainFamily`) — the type name (`integer`); supplies `` everywhere. Each domain's full name is the family `name` + `_` + the domain `name` (`DomainFamily::domain_name`); codegen owns the `_` join (`Domain::full_name`), and an empty domain `name` yields the bare family name. @@ -187,7 +187,7 @@ the catalog by the codegen renderer (the `nonempty_array_keys` field on `Term::nonempty_array_key()` — `Some("ob")` only for `Term::Ore`), not hand-added — a new ordered scalar gets it for free. -**Twins.** `int4_ord` and `int4_ord_ore` both carry `&[Term::Ore]`. The +**Twins.** `integer_ord` and `integer_ord_ore` both carry `&[Term::Ore]`. The generator emits them as independent domains with byte-identical SQL modulo type name (`ordered_files_byte_identical_modulo_typename`). Twins let callers choose a name that documents intent ("ordered, regardless of mechanism" vs "ordered via @@ -206,7 +206,7 @@ for the type's plaintext list, consumed by both the SQLx fixture generator and the matrix oracle. A `Fixture` is value-kind tagged: `Min` / `Max` / `Zero` (the integer matrix pivots, resolved per-kind), `Int(i128)` (an integer literal), and `Numeric` / `Text` / `Jsonb` / `Date` / `Timestamp` / `Float` string variants -(plus a `Bool` variant for the storage-only `bool` scalar). The +(plus a `Bool` variant for the storage-only `boolean` scalar). The `fixtures!` macro range-checks each `Int` literal against the kind at compile time (`N(-40000)` for an `i16` kind does not compile): @@ -317,16 +317,16 @@ three divergences (for the ordered `date`): The generated SQL is enough to *install* the domains, but the `scalar_matrix!` suite only runs once the Rust harness knows about the -scalar. `` is the scalar's Rust type (`i32` for `int4`, `i16` for `int2`). +scalar. `` is the scalar's Rust type (`i32` for `integer`, `i16` for `smallint`). The registrations depend on whether `` is an **integer** kind. For an -integer type (the `int4` reference) there are **two**; a **non-integer +integer type (the `integer` reference) there are **two**; a **non-integer (string-backed)** type — `date`, `timestamp`, `text` — needs a **third** (`scalar_domains.rs`), because the proc-macro emits `impl ScalarType` only for integer kinds: | File | Add | |------|-----| -| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `int8 => i64,`). This single line drives the `impl ScalarType` **(integer kinds only)**, the `eql_v3_` fixture module, the `scalar_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | +| `tests/sqlx/src/scalar_types.rs` | One ` => ` line in the `scalar_types!` list (e.g. `bigint => i64,`). This single line drives the `impl ScalarType` **(integer kinds only)**, the `eql_v3_` fixture module, the `scalar_matrix!` suite, and the `generate_for_token` arm — all generated by the `eql-tests-macros` proc-macros. | | `tests/sqlx/src/fixtures/eql_plaintext.rs` | A sealed `EqlPlaintext` impl for ``: `impl Sealed for {}` and `impl EqlPlaintext for ` carrying just `const KIND: ScalarKind` plus the value-typed `to_plaintext` → the right `Plaintext` variant. `CAST` and `PLAINTEXT_SQL_TYPE` are **derived** from `KIND` via the `cast_for_kind` / `plaintext_sql_type_for_kind` `const fn` defaults, so a brand-new kind needs an arm in those two helpers — not a per-type const (see §3.1 for a non-integer kind's full wiring). Keep the three `#[test]`s (cast / sql-type / to_plaintext) mirroring the existing ones. | | `tests/sqlx/src/scalar_domains.rs` **(non-integer only)** | The `impl ScalarType` the proc-macro skips for non-integer kinds. For a **chrono-backed** kind (`date`, `timestamp`) this is a `temporal_values!` invocation that materialises the catalog ISO/RFC3339 strings into a `LazyLock>` and emits `impl ScalarType` + `OrderedScalar` (+ `SignedScalar` for `date` and `timestamp`). For **`text`** it is a hand-written `impl ScalarType` / `OrderedScalar` block (an overridden lexicographic-median `mid_pivot()` — `min`/`max` inherit the fixture-derived defaults — plus a `to_sql_literal` override) — `String` has no numeric origin, so it is deliberately **not** `SignedScalar`. | @@ -364,18 +364,18 @@ surface leaf drivers directly (§8). **You never write `caps`**: the (no `_eq`/`_ord`) → `[storage]`, checked first; then `is_eq_only` (no `_ord`) → `[eq]`; then `has_search` → `[eq, ord, search]`; else `[eq, ord]`. So the shape is a pure function of which domain-suffix slice the catalog row uses — -`STORAGE_ONLY_DOMAINS` (→ `[storage]`, e.g. `bool`), `EQ_ONLY_DOMAINS` (→ `[eq]`, +`STORAGE_ONLY_DOMAINS` (→ `[storage]`, e.g. `boolean`), `EQ_ONLY_DOMAINS` (→ `[eq]`, no live catalog type today) vs `ORDERED_INT_DOMAINS` (→ `[eq, ord]`). (`EQ_ONLY_DOMAINS` is currently unused — `timestamp` was promoted to the ordered shape once the ORE comparator generalized to N blocks.) The pivot *sweep* is uniform across every ordered type (one canonical snapshot); the signed-only sign-boundary -test (`SignedScalar`, `int2`/`int4`/`int8`/`date`/`timestamp`/`float4`/`float8`) lives outside `scalars::` in +test (`SignedScalar`, `smallint`/`integer`/`bigint`/`date`/`timestamp`/`real`/`double`) lives outside `scalars::` in `encrypted_domain/signed.rs`, so a `text` instantiation of it is a compile error and it never enters the inventory snapshot. The `matrix.rs` module header is the canonical, current list of the categories the matrix emits (sanity, correctness, cross-shape, supported-NULL, blocker raises, index engagement, ORDER BY, ORDER -BY USING) — read it rather than duplicating a count here. For ordered `int4`, +BY USING) — read it rather than duplicating a count here. For ordered `integer`, keep the assertion that distinct plaintext values produce distinct ORE blocks; do not add assertions for term behaviour the catalog does not promise. @@ -459,7 +459,7 @@ ordered `caps = [eq, ord]` shape); alongside it are `matrix_tests_eq_only.txt` (the eq-only shape, *derived* from the baseline minus the `_ord`/`order_by`/ `routes_through_ob` lines), `matrix_tests_text.txt` (the text shape, a *superset* of the baseline adding the `_search`/`_eqidx`/`_match` arms), and -`matrix_tests_storage_only.txt` (the storage-only shape, e.g. `bool` — see §8). +`matrix_tests_storage_only.txt` (the storage-only shape, e.g. `boolean` — see §8). (The per-type `_matrix_tests.txt` files are gone: they were byte-identical modulo the token, so the shape snapshots plus a per-type normalize-and-compare carry the same signal at a fraction of the @@ -645,7 +645,7 @@ is always 44. **Untyped-literal resolver edge.** PostgreSQL's operator resolver still prefers the built-in `jsonb` operator for untyped string literals in forms such as -`payload::eql_v3.int4 ? 'c'`. Use typed parameters or explicit casts +`payload::eql_v3.integer ? 'c'`. Use typed parameters or explicit casts (`? 'c'::text`, bound text parameters) to route those forms to the generated blocker. A live-DB structural guard (`tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs`) queries @@ -706,7 +706,7 @@ lists, headers, or cleans it; it must declare its own `-- REQUIRE:` edges (usually to `_types.sql` and whichever generated function or operator file it extends). Use it for cross-domain casts, helper functions, or type-specific constraints. Unlike the generated siblings, **`_extensions.sql` IS -committed.** (Neither `int4` nor `int2` ships one today.) +committed.** (Neither `integer` nor `smallint` ships one today.) `tasks/pin_search_path_v3.sql` describes the fallback marker for inline-critical extension functions that take no domain argument and so escape the structural @@ -776,7 +776,7 @@ adding a type. ### Why a generator -A single scalar type emits several hundred SQL declarations. For `int4`: fourteen +A single scalar type emits several hundred SQL declarations. For `integer`: fourteen files, five domains, four extractor functions, dozens of wrappers and blockers, 220 `CREATE OPERATOR` statements (44 per domain), and MIN/MAX aggregates per ordered domain. (The per-domain figure is fixed — 44 `CREATE OPERATOR` statements per domain, the `1 + 2D + @@ -855,7 +855,7 @@ output for every catalog type from scratch. ### Generated outputs For a type with `D` domains of which `A` are ordered, the generator writes `1 + -2D + A` SQL files into `src/v3/scalars//`. For `int4` (`D = 5`, `A = +2D + A` SQL files into `src/v3/scalars//`. For `integer` (`D = 5`, `A = 3`): fourteen SQL files. The outputs are committed in place under `src/v3/scalars//` and regenerated at the start of every build (commit the regenerated SQL diff alongside any catalog change). @@ -952,13 +952,13 @@ materializer. --- -## 8. `bool` — the storage-only / encryption-only shape +## 8. `boolean` — the storage-only / encryption-only shape -`bool` is the worked example of a **storage-only** (encryption-only) scalar: the +`boolean` is the worked example of a **storage-only** (encryption-only) scalar: the value is encrypted at rest and decrypted by the proxy, but is **never searchable server-side**. It is the smallest shape — strictly below eq-only — because a two-value column has so little cardinality that *any* searchable index (even -HMAC equality) would trivially leak the plaintext distribution. So `bool` +HMAC equality) would trivially leak the plaintext distribution. So `boolean` deliberately offers no search surface at all. What makes it storage-only: @@ -984,12 +984,12 @@ What makes it storage-only: `scalar_fixture!(storage, …)` arm stamps this and asserts both values are present and no index is declared. - **Harness: hand-written `impl ScalarType`, NOT `OrderedScalar`.** The - proc-macro emits `impl ScalarType` only for integer kinds, so `bool` is + proc-macro emits `impl ScalarType` only for integer kinds, so `boolean` is hand-written in `scalar_domains.rs` (`PG_TYPE = "bool"`, `fixture_values()` = `[false, true]` from the catalog). It is deliberately **not** `OrderedScalar`, `SignedScalar`, or `MatchScalar` — it has no comparison pivots, sign boundary, or match capability, so any ordered/signed/match-bounded test instantiated for - `bool` is a compile error. + `boolean` is a compile error. - **Matrix: `caps = [storage]`.** Because there are no comparison/index/order categories to run, the `[storage]` arm does **not** expand `scalar_domain_matrix!` (whose `+`-arity transcribers reject the empty diff --git a/docs/reference/catalog-driven-architecture.md b/docs/reference/catalog-driven-architecture.md index 4fd495e7d..1c71fcffc 100644 --- a/docs/reference/catalog-driven-architecture.md +++ b/docs/reference/catalog-driven-architecture.md @@ -82,7 +82,7 @@ Order is **load-bearing** — it drives generation order, inventory order, and s ```mermaid classDiagram class DomainFamily { - +name: &str // "int4", "text", "bool" + +name: &str // "integer", "text", "bool" +domains: &[Domain] } class Domain { @@ -121,7 +121,7 @@ classDiagram - **`DomainFamily`** = one scalar type (`name` + the public domains it carries). - **`Domain`** = one operator/index capability surface (a bare suffix + fixed terms). The empty - name `""` is the storage-only domain (`eql_v3.int4`); `eq`, `ord`, `ord_ore`, `match`, + name `""` is the storage-only domain (`eql_v3.integer`); `eq`, `ord`, `ord_ore`, `match`, `search` are the searchable ones. - **`Term`** = an index-term type. *This is where capability lives.* @@ -144,7 +144,7 @@ Cross-term helpers compose these into the per-domain answers the renderers consu `operators_for_terms`, `term_json_keys`, `payload_terms`, `nonempty_array_keys`, `extractor_terms`, `term_requires`, `extractor_for_operator`, `role_for_terms`. -> **Key insight:** Adding `int8` adds *no new behavior code* — it reuses `Hm`/`Ore`. +> **Key insight:** Adding `bigint` adds *no new behavior code* — it reuses `Hm`/`Ore`. > New behavior (a new index term) is a new `Term` variant with its `impl` arms + tests. > Data (which types exist) is catalog rows; behavior (what terms do) is `Term` impls. @@ -174,12 +174,12 @@ flowchart LR | Family | Kind | Shape | |--------|------|-------| -| `int4`/`int2`/`int8` | I32/I16/I64 | ordered | +| `integer`/`smallint`/`bigint` | I32/I16/I64 | ordered | | `date`/`timestamp` | Date/Timestamp | ordered | | `numeric` | Numeric | ordered | -| `float4`/`float8` | F32/F64 | ordered | +| `real`/`double` | F32/F64 | ordered | | `text` | Text | text-search (equality always routes through `Hm` — ORE is not equality-lossless for text) | -| `bool` | Bool | storage-only (2-value cardinality leak → no searchable index) | +| `boolean` | Bool | storage-only (2-value cardinality leak → no searchable index) | **`jsonb` sits outside this classification.** It carries three domains — `eql_v3.json` (document), `eql_v3.jsonb_entry` (one `sv` leaf), `eql_v3.jsonb_query` (containment @@ -278,7 +278,7 @@ Each `*_functions.sql` mixes three entry kinds, selected per operator: | Kind | Template | Language | Purpose | |------|----------|----------|---------| -| **Extractor** | `extractor.sql.j2` | `LANGUAGE sql` (inlinable) | `eq_term(int4_eq) → hmac_256` | +| **Extractor** | `extractor.sql.j2` | `LANGUAGE sql` (inlinable) | `eq_term(integer_eq) → hmac_256` | | **Wrapper** | `wrapper.sql.j2` | `LANGUAGE sql` (inlinable) | `eq(a,b) → eq_term(a)=eq_term(b)` | | **Blocker** | `unsupported.sql.j2` | **`LANGUAGE plpgsql`** | `RAISE EXCEPTION 'operator % not supported'` | @@ -305,7 +305,7 @@ flowchart TD The struct doc is **derived entirely from catalog data** — no free-form prose: ```rust -/// `eql_v3.int4_eq` — equality domain. +/// `eql_v3.integer_eq` — equality domain. /// /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. ``` @@ -315,7 +315,7 @@ domain name** — making a new shape a compile error rather than a silent fallth operators come from `Term::operators_for_terms`, the keys from `ENVELOPE_KEYS ++ Term::term_json_keys`. The required-key list is where structural distinctions become visible — e.g. `text_ord` lists `v i c hm ob` (dual-term) versus -`int4_ord`'s `v i c ob`. +`integer_ord`'s `v i c ob`. ### 3.3 Why output is byte-identical run-to-run @@ -337,16 +337,16 @@ distinctions become visible — e.g. `text_ord` lists `v i c hm ob` (dual-term) ```text src/v3/scalars/ ├── functions.sql ← hand-written shared blocker helper (COMMITTED) -├── int4/ -│ ├── int4_types.sql (generated, committed) -│ ├── int4_functions.sql (storage-only blockers) -│ ├── int4_eq_functions.sql (eq_term extractor + eq/neq wrappers) -│ ├── int4_eq_operators.sql (CREATE OPERATOR) -│ ├── int4_ord_functions.sql -│ ├── int4_ord_operators.sql -│ ├── int4_ord_aggregates.sql (min/max) -│ ├── int4_ord_ore_*.sql -│ └── int4_extensions.sql ← hand-written, COMMITTED (if present) +├── integer/ +│ ├── integer_types.sql (generated, committed) +│ ├── integer_functions.sql (storage-only blockers) +│ ├── integer_eq_functions.sql (eq_term extractor + eq/neq wrappers) +│ ├── integer_eq_operators.sql (CREATE OPERATOR) +│ ├── integer_ord_functions.sql +│ ├── integer_ord_operators.sql +│ ├── integer_ord_aggregates.sql (min/max) +│ ├── integer_ord_ore_*.sql +│ └── integer_extensions.sql ← hand-written, COMMITTED (if present) └── ... ``` @@ -367,7 +367,7 @@ flowchart TD LIB["lib.rs
SchemaVersion/Identifier"] end subgraph gen["GENERATED (@generated)"] - I4["int4.rs / text.rs / ... (10 files)"] + I4["integer.rs / text.rs / ... (10 files)"] INV["inventory.rs — all()"] end DT --> I4 @@ -376,11 +376,11 @@ flowchart TD MOD --> gen ``` -A generated struct (`int4.rs`): +A generated struct (`integer.rs`): ```rust // @generated by eql-codegen from the eql-domains catalog — do not edit -/// `eql_v3.int4_eq` — equality domain. +/// `eql_v3.integer_eq` — equality domain. /// /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -394,7 +394,7 @@ pub struct Int4Eq { } impl DomainType for Int4Eq { - fn sql_domain_static() -> &'static str { "eql_v3.int4_eq" } + fn sql_domain_static() -> &'static str { "eql_v3.integer_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } fn schema(&self) -> Schema { schema_for!(Int4Eq) } } @@ -409,7 +409,7 @@ construction needed) in catalog order. > these structs at `cargo test` time, so they must exist on a clean clone. The module doc carries the **non-derivable** caveats: float **NaN** carries no comparison -guarantee (reject client-side), and **`bool` is storage-only** (`{v,i,c}` only, every +guarantee (reject client-side), and **`boolean` is storage-only** (`{v,i,c}` only, every operator blocked). ### 4.3 TypeScript & JSON Schema — `crates/eql-bindings/{bindings,schema}/v3/` (committed) @@ -417,14 +417,14 @@ operator blocked). ```mermaid flowchart LR RS["Rust structs
#[derive(TS, JsonSchema)]"] -->|ts-rs export
via cargo test -p eql-bindings| TS["crates/eql-bindings/bindings/v3/Int4Eq.ts
(45 files)"] - RS -->|schemars via tests/export.rs
injects $id| JS["crates/eql-bindings/schema/v3/int4_eq.json
(39 files)"] + RS -->|schemars via tests/export.rs
injects $id| JS["crates/eql-bindings/schema/v3/integer_eq.json
(39 files)"] ``` - **TypeScript:** one `.ts` per domain, importing co-located term types; newtypes become primitive aliases (`export type Ciphertext = string;`, `export type SchemaVersion = 2;`). Doc comments survive from Rust. - **JSON Schema:** JSON Schema 2020-12 (schemars 1.x), `additionalProperties: false`, - `$id` injected at export (`https://schemas.cipherstash.com/eql/v3/int4_eq.json`), term + `$id` injected at export (`https://schemas.cipherstash.com/eql/v3/integer_eq.json`), term types as reusable `$defs`. `BloomFilter` and `SchemaVersion` have **manual** `JsonSchema` impls (bounded `i16[]`, `const: 2`) that derives can't express. @@ -510,7 +510,7 @@ flowchart TD BIN["list test binary --list"] --> DISC["discover scalars::<T>:: prefixes"] DISC --> NORM["normalize <T> → literal token"] NORM --> CMP{"match committed shape?"} - CMP --> M1["matrix_tests.txt (ordered, driver int4)"] + CMP --> M1["matrix_tests.txt (ordered, driver integer)"] CMP --> M2["matrix_tests_eq_only.txt (derived by grep filter)"] CMP --> M3["matrix_tests_text.txt (superset, driver text)"] CMP --> M4["matrix_tests_storage_only.txt (driver bool)"] diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index 21653519b..b3f736f4c 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -88,10 +88,10 @@ These extract the index term from an encrypted-domain value. They are generated ```sql -- Equality term (hm) -eql_v3.eq_term(a eql_v3.int4_eq) RETURNS eql_v3.hmac_256 +eql_v3.eq_term(a eql_v3.integer_eq) RETURNS eql_v3.hmac_256 -- Ordering term (ob) -eql_v3.ord_term(a eql_v3.int4_ord) RETURNS eql_v3.ore_block_256 -eql_v3.ord_term(a eql_v3.int4_ord_ore) RETURNS eql_v3.ore_block_256 +eql_v3.ord_term(a eql_v3.integer_ord) RETURNS eql_v3.ore_block_256 +eql_v3.ord_term(a eql_v3.integer_ord_ore) RETURNS eql_v3.ore_block_256 -- Text-match term (bf) eql_v3.match_term(a eql_v3.text_match) RETURNS eql_v3.bloom_filter ``` @@ -123,11 +123,11 @@ The full encrypted-JSONB function surface — containment, `->` / `->>`, `eql_v3 Returns the minimum or maximum encrypted value on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`eql_v3._ord`, `eql_v3._ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. ```sql --- int4 — generated for every ordered variant of every scalar type. -eql_v3.min(eql_v3.int4_ord) RETURNS eql_v3.int4_ord -eql_v3.max(eql_v3.int4_ord) RETURNS eql_v3.int4_ord -eql_v3.min(eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore -eql_v3.max(eql_v3.int4_ord_ore) RETURNS eql_v3.int4_ord_ore +-- integer — generated for every ordered variant of every scalar type. +eql_v3.min(eql_v3.integer_ord) RETURNS eql_v3.integer_ord +eql_v3.max(eql_v3.integer_ord) RETURNS eql_v3.integer_ord +eql_v3.min(eql_v3.integer_ord_ore) RETURNS eql_v3.integer_ord_ore +eql_v3.max(eql_v3.integer_ord_ore) RETURNS eql_v3.integer_ord_ore ``` Comparison routes through the variant's `<` / `>` operator, which uses the ORE block term — no decryption. The state function is `STRICT`, so `NULL` inputs are skipped and an all-`NULL` input set returns `NULL`. @@ -135,12 +135,12 @@ Comparison routes through the variant's `<` / `>` operator, which uses the ORE b **Example:** ```sql --- ord-capable column (e.g. price_encrypted typed as eql_v3.int4_ord) +-- ord-capable column (e.g. price_encrypted typed as eql_v3.integer_ord) SELECT eql_v3.min(price_encrypted) FROM products; SELECT eql_v3.max(price_encrypted) FROM products WHERE category = 'electronics'; -- On a generic jsonb column, cast to the right domain -SELECT eql_v3.min(price_jsonb::eql_v3.int4_ord) FROM products; +SELECT eql_v3.min(price_jsonb::eql_v3.integer_ord) FROM products; ``` `MIN` / `MAX` over a value extracted from an `eql_v3.json` document use `eql_v3.min(eql_v3.jsonb_entry)` / `max` — see [json-support.md](./json-support.md). diff --git a/docs/reference/permissions.md b/docs/reference/permissions.md index 84da49b9a..10f12bfa0 100644 --- a/docs/reference/permissions.md +++ b/docs/reference/permissions.md @@ -59,7 +59,7 @@ needs `USAGE` on it anyway. The exact requirement is path-dependent: | `MIN` / `MAX` aggregates | ✅ | ✅ | ✅ | | jsonb containment read (`@>` `<@` / `ste_vec_contains`) | ✅ | — | — | | Cast/write raw JSON → `eql_v3.json` | ✅ | ✅ | — | -| Cast/write raw JSON → a scalar domain (`eql_v3.int4`…) | ✅ | — | — | +| Cast/write raw JSON → a scalar domain (`eql_v3.integer`…) | ✅ | — | — | Why the internal grant is needed even though you only call public objects: diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index 25a4c28e0..ef908c8f8 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -4,7 +4,7 @@ This page summarises which SQL operators and language features work against EQL- EQL ships its searchable-encryption surface as PostgreSQL **domains in the `eql_v3` schema**: -- **per-scalar encrypted-domain types** — `eql_v3.int4`, `eql_v3.text`, `eql_v3.timestamp`, … — one family of domain *variants* per scalar; and +- **per-scalar encrypted-domain types** — `eql_v3.integer`, `eql_v3.text`, `eql_v3.timestamp`, … — one family of domain *variants* per scalar; and - **an encrypted-JSON document type** — `eql_v3.json` — for structured-encryption (ste_vec) JSONB. The capability of a column is fixed by the **domain variant you type it as**. There is no database-side `add_search_config` / `add_column` step: which index terms travel in a value's payload is decided by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs)), and the column's domain variant is what makes the matching operators resolve. Unsupported operators are not silent no-ops — they route to blocker functions that `RAISE` an "operator not supported" exception (a `NULL` operand still raises; the blockers are deliberately not `STRICT`). @@ -15,7 +15,7 @@ The capability of a column is fixed by the **domain variant you type it as**. Th Each scalar type `` is a family of `jsonb`-backed domains in `eql_v3`. The catalog scalar tokens that ship today are: -`int2`, `int4`, `int8`, `numeric`, `float4`, `float8`, `date`, `timestamp`, `text`, `bool`. +`smallint`, `integer`, `bigint`, `numeric`, `real`, `double`, `date`, `timestamp`, `text`, `boolean`. (See [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md) for how the family is generated.) The domains live in the `eql_v3` schema — `DROP SCHEMA eql_v3 CASCADE` removes them — and their extracted index-term types are the self-contained `eql_v3` SEM types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.bloom_filter`). @@ -34,11 +34,11 @@ Every scalar generates a storage-only variant plus the query variants its capabi Notes: -- The bare `eql_v3.` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site, e.g. `col::eql_v3.int4_ord`) when you need to query. +- The bare `eql_v3.` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site, e.g. `col::eql_v3.integer_ord`) when you need to query. - `_ord` and `_ord_ore` are **twins**: byte-identical surfaces backed by the ORE block term. Pick the name that documents intent ("ordered" vs "ordered via ORE block"); both support the full ordered surface and the `MIN` / `MAX` aggregates. - `_ord_ope` exposes the **same ordered surface** backed by the CLLW-OPE term instead: `op` is a hex-encoded, order-preserving ciphertext compared by native bytea ordering after hex-decode (no custom comparison protocol). On `text_ord_ope`, `=` / `<>` route through `hm` (exact HMAC), like `text_ord` — OPE over text is not equality-lossless. - `=` / `<>` is the only searchable surface for `_eq`. On `_ord` variants the equality operators are available too (alongside the ordered ones). -- `bool` is **storage-only** by design — a two-value column has too little cardinality for any searchable index to be safe, so it ships only `eql_v3.bool` (no `_eq` / `_ord`). +- `boolean` is **storage-only** by design — a two-value column has too little cardinality for any searchable index to be safe, so it ships only `eql_v3.boolean` (no `_eq` / `_ord`). - `LIKE` / `ILIKE` (`~~` / `~~*`) and the native JSONB operators are **blocked on every scalar domain variant** — they are meaningless on a scalar payload. Text matching is the bloom-filter `@>` on `text_match`, not `LIKE`. - `MIN` / `MAX` are exposed only on the ordered variants, as `eql_v3.min(eql_v3._ord)` / `eql_v3.max(...)` (and the `_ord_ore` twin) — see [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). @@ -77,7 +77,7 @@ This matrix covers higher-level SQL constructs. As above, ✅ requires the colum | `WHERE col IN (…)` | desugars to `=` | `_eq`, `_ord`, `text_search` | | `ORDER BY col` | meaningful only with an ORE term | `_ord`, `text_search` | | `GROUP BY col` / `DISTINCT` | needs an equality term | `_eq`, `_ord`, `text_search` | -| `MIN(col)` / `MAX(col)` | `eql_v3.min(eql_v3._ord)` / `max` — type the column as `_ord` or cast at the call site (`eql_v3.min(col::eql_v3.int4_ord)`) | `_ord` | +| `MIN(col)` / `MAX(col)` | `eql_v3.min(eql_v3._ord)` / `max` — type the column as `_ord` or cast at the call site (`eql_v3.min(col::eql_v3.integer_ord)`) | `_ord` | | `COUNT(col)` / `COUNT(DISTINCT col)` | plain `COUNT(col)` needs no term; `DISTINCT` needs an equality term | any / `_eq` for `DISTINCT` | | `JOIN … ON lhs.col = rhs.col` | both sides must share the same keyset and a matching variant | `_eq`, `_ord`, `text_search` | @@ -86,7 +86,7 @@ Notes: - **Cross-column / cross-table comparisons** (joins, `IN (subquery)`, set-operation dedup) require both sides to have been encrypted with the *same* keyset and a matching variant. - **`ORDER BY`** without an ORE term will not produce a meaningful order — type the column as an `_ord` variant when ordering matters. - **Aggregates beyond `MIN` / `MAX`** (`SUM`, `AVG`, …) are not supported on encrypted values — decrypt at the application boundary and aggregate client-side. -- **Parameter binding**: CipherStash Proxy rewrites bound parameters so the encrypted operator and any functional indexes are selected. When bypassing the proxy, type the parameter (`$1::eql_v3.int4_ord`) so the encrypted operator resolves rather than the native `jsonb` one. +- **Parameter binding**: CipherStash Proxy rewrites bound parameters so the encrypted operator and any functional indexes are selected. When bypassing the proxy, type the parameter (`$1::eql_v3.integer_ord`) so the encrypted operator resolves rather than the native `jsonb` one. --- From ea0bde95623507122eccf4a3bf643d02340b2e30 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 3 Jul 2026 14:10:48 +1000 Subject: [PATCH 481/599] test(v3): address code-review findings on scalar rename - pin boolean/real/double wire shapes in the binding round-trip sweep (real/double renamed from float4/float8; a field typo now fails the test) - assert jsonb_entry/jsonb_query anyOf arms independently as singleton {hm}/{oc} sets instead of a flattened union that could mask a mixed arm - correct CATALOG doc comment (domain-family, not scalar-only; includes jsonb) - fix v3_public_surface_tests.rs path in the snapshots README --- crates/eql-bindings/tests/catalog_parity.rs | 33 +++++++++++++++++---- crates/eql-bindings/tests/v3_conformance.rs | 19 +++++++++++- crates/eql-domains/src/lib.rs | 7 +++-- tests/sqlx/snapshots/README.md | 2 +- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/crates/eql-bindings/tests/catalog_parity.rs b/crates/eql-bindings/tests/catalog_parity.rs index 4adebfb66..e71f8b0cb 100644 --- a/crates/eql-bindings/tests/catalog_parity.rs +++ b/crates/eql-bindings/tests/catalog_parity.rs @@ -310,14 +310,18 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() { .pointer("/anyOf") .and_then(|v| v.as_array()) .expect("jsonb_entry schema must carry an anyOf term union"); - let alt_keys: BTreeSet = entry_alts + // Assert each arm *independently* — a flat union of required keys would let a + // mixed/invalid arm (e.g. one requiring both `hm` and `oc`) slip through. + let entry_alt_required: Vec> = entry_alts .iter() - .flat_map(|alt| required(alt, "/required", "jsonb_entry anyOf")) + .map(|alt| required(alt, "/required", "jsonb_entry anyOf")) .collect(); - assert_eq!( - alt_keys, - set(&["hm", "oc"]), - "eql_v3.jsonb_entry anyOf must offer exactly the hm and oc term alternatives" + assert!( + entry_alt_required.len() == 2 + && entry_alt_required.contains(&set(&["hm"])) + && entry_alt_required.contains(&set(&["oc"])), + "eql_v3.jsonb_entry anyOf must offer exactly the hm-only and oc-only term \ + alternatives (each arm a singleton), got {entry_alt_required:?}" ); // Query: {sv}. The element (SteVecQueryEntry) requires `s` + hm XOR oc and @@ -342,4 +346,21 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() { "jsonb_query element must NOT require a ciphertext c \ (is_valid_ste_vec_query_payload forbids it), got {elem_required:?}" ); + // Same arm-wise check as jsonb_entry: the query element's hm XOR oc union must + // be two singleton arms, not a flattened set that could mask a mixed branch. + let query_alts = query + .pointer("/$defs/SteVecQueryEntry/anyOf") + .and_then(|v| v.as_array()) + .expect("jsonb_query element schema must carry an anyOf term union"); + let query_alt_required: Vec> = query_alts + .iter() + .map(|alt| required(alt, "/required", "jsonb_query element anyOf")) + .collect(); + assert!( + query_alt_required.len() == 2 + && query_alt_required.contains(&set(&["hm"])) + && query_alt_required.contains(&set(&["oc"])), + "eql_v3.jsonb_query element anyOf must offer exactly the hm-only and \ + oc-only term alternatives (each arm a singleton), got {query_alt_required:?}" + ); } diff --git a/crates/eql-bindings/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs index a191a4c86..785cb3669 100644 --- a/crates/eql-bindings/tests/v3_conformance.rs +++ b/crates/eql-bindings/tests/v3_conformance.rs @@ -207,7 +207,9 @@ fn non_integer_tokens_round_trip_every_domain() { // `catalog_parity.rs` checks domain *names* only, never the wire shape. // This sweep roundtrips every non-integer domain and pins its catalog name, // failing the instant a token drifts from the shared envelope/term contract. - use eql_bindings::v3::{bigint::*, date::*, numeric::*, smallint::*, text::*}; + use eql_bindings::v3::{ + bigint::*, boolean::*, date::*, double::*, numeric::*, real::*, smallint::*, text::*, + }; // Wire builders for the shapes the ordered tokens share. let storage = |t: &str| json!({ "v": 3, "i": { "t": t, "c": "x" }, "c": "ct" }); @@ -258,6 +260,21 @@ fn non_integer_tokens_round_trip_every_domain() { round_trip!(NumericOrdOre, ord("a"), "eql_v3.numeric_ord_ore"); round_trip!(NumericOrdOpe, ope("a"), "eql_v3.numeric_ord_ope"); + // real/double are the float scalars (renamed from float4/float8); they carry + // the same ordered-token wire shape as the int scalars (`hm` eq, `ob` ord). + round_trip!(Real, storage("a"), "eql_v3.real"); + round_trip!(RealEq, eq("a"), "eql_v3.real_eq"); + round_trip!(RealOrd, ord("a"), "eql_v3.real_ord"); + round_trip!(RealOrdOre, ord("a"), "eql_v3.real_ord_ore"); + + round_trip!(Double, storage("a"), "eql_v3.double"); + round_trip!(DoubleEq, eq("a"), "eql_v3.double_eq"); + round_trip!(DoubleOrd, ord("a"), "eql_v3.double_ord"); + round_trip!(DoubleOrdOre, ord("a"), "eql_v3.double_ord_ore"); + + // boolean is storage-only (no eq/ord term) — just the shared envelope. + round_trip!(Boolean, storage("a"), "eql_v3.boolean"); + // text_match is covered by `text_match_round_trips_signed_bloom_filter`. round_trip!(Text, storage("a"), "eql_v3.text"); round_trip!(TextEq, eq("a"), "eql_v3.text_eq"); diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index 1504a49bd..acb54156b 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -443,8 +443,11 @@ pub const JSONB: DomainFamily = DomainFamily { domains: JSONB_DOMAINS, }; -/// The scalar catalog — the single source of truth. Order is significant (it -/// drives generation order). New types are appended as their SQL surface lands. +/// The domain-family catalog — the single source of truth. Includes both the +/// scalar (flat) families and the non-scalar SteVec `jsonb` family; scalar-only +/// consumers should iterate [`scalar_families`] instead. Order is significant +/// (it drives inventory/generation order). New types are appended as their SQL +/// surface lands. pub const CATALOG: &[DomainFamily] = &[ INTEGER, SMALLINT, BIGINT, DATE, TIMESTAMP, NUMERIC, TEXT, BOOLEAN, REAL, DOUBLE, JSONB, ]; diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index b631097d7..de38512f4 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -249,7 +249,7 @@ all three (non-blocking: nightly-only, off the PR critical path). Exhaustive snapshot of every object visible in the **public** `eql_v3` schema: domains/composites/enums, functions, aggregates, operators, and casts, each rendered as a normalized, schema-qualified line and `LC_ALL=C`-sorted. Owned by -`tests/v3_public_surface_tests.rs::eql_v3_public_surface_matches_golden`, it pins +`tests/sqlx/tests/v3_public_surface_tests.rs::eql_v3_public_surface_matches_golden`, it pins *what the split puts in the public API* — the point of the `eql_v3` / `eql_v3_internal` split is to keep index-term-only types out of what a Supabase Studio user sees, and nothing else in the suite gates that. Any object From 18ad4f1d0c6c842b6066474a50c1ba53c9f75200 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Fri, 3 Jul 2026 18:14:14 +1000 Subject: [PATCH 482/599] test(v3): reconcile ope smoke modules + from_v2 consumers with SQL-standard names Rebase reconciliation: the ord_ope per-type smoke modules, the from_v2 schema-validation target list, and the v3_convert fixture seam landed on eql_v3 (#340/#341) under the pre-rename int4/int2/int8/float4/float8 tokens, while #344 renamed the scalar families. Rename the modules and their domain-name literals so both features compose. --- tests/sqlx/src/fixtures/v3_convert.rs | 12 +++---- tests/sqlx/tests/encrypted_domain.rs | 20 ++++++------ .../{float4_ord_ope.rs => bigint_ord_ope.rs} | 8 ++--- .../encrypted_domain/ope/date_ord_ope.rs | 4 +-- .../{float8_ord_ope.rs => double_ord_ope.rs} | 8 ++--- .../{int4_ord_ope.rs => integer_ord_ope.rs} | 32 +++++++++---------- .../encrypted_domain/ope/numeric_ord_ope.rs | 4 +-- .../ope/{int2_ord_ope.rs => real_ord_ope.rs} | 8 ++--- .../{int8_ord_ope.rs => smallint_ord_ope.rs} | 8 ++--- .../encrypted_domain/ope/timestamp_ord_ope.rs | 4 +-- tests/sqlx/tests/payload_schema_tests.rs | 6 ++-- 11 files changed, 57 insertions(+), 57 deletions(-) rename tests/sqlx/tests/encrypted_domain/ope/{float4_ord_ope.rs => bigint_ord_ope.rs} (59%) rename tests/sqlx/tests/encrypted_domain/ope/{float8_ord_ope.rs => double_ord_ope.rs} (59%) rename tests/sqlx/tests/encrypted_domain/ope/{int4_ord_ope.rs => integer_ord_ope.rs} (84%) rename tests/sqlx/tests/encrypted_domain/ope/{int2_ord_ope.rs => real_ord_ope.rs} (59%) rename tests/sqlx/tests/encrypted_domain/ope/{int8_ord_ope.rs => smallint_ord_ope.rs} (54%) diff --git a/tests/sqlx/src/fixtures/v3_convert.rs b/tests/sqlx/src/fixtures/v3_convert.rs index 2dc64ed6b..3c3feff95 100644 --- a/tests/sqlx/src/fixtures/v3_convert.rs +++ b/tests/sqlx/src/fixtures/v3_convert.rs @@ -16,7 +16,7 @@ //! its family (the matrix casts the same `payload` column to ``, //! `_eq`, `_ord`, …), so it must carry the UNION of the terms the //! fixture's indexes produced. No single catalog target requires that union -//! for the integer families (`int4_eq` requires `hm` alone, `int4_ord_ore` +//! for the integer families (`integer_eq` requires `hm` alone, `integer_ord_ore` //! requires `ob` alone), so conversion runs once per **coverable** family //! domain and merges the outputs: //! @@ -36,7 +36,7 @@ //! identical by construction, and the merge fails closed if they ever //! disagree. Every merged key still came out of a validated `from_v2` call. //! -//! The SteVec document fixtures (`v3_ste_vec`, `v3_doc_int4`) convert with +//! The SteVec document fixtures (`v3_ste_vec`, `v3_doc_integer`) convert with //! the single [`TargetDomain::Json`] target — the v3 document keeps //! `k: "sv"` (the #336 wire shape) and its per-entry `hm` XOR `oc` terms. @@ -175,7 +175,7 @@ mod tests { json!({ "v": 2, "k": "ct", - "i": { "t": "_fixture_eql_v3_int4", "c": "payload" }, + "i": { "t": "_fixture_eql_v3_integer", "c": "payload" }, "c": "mBbKmsMMkbKAJcY2ZE!ceh0e1t", "hm": "e0e1c4bd2ff81c9ad4cc9ae9ab6c47a4cf7d0f7cca6ae916c56008fd5e78c99e", "ob": ["0a0b0c", "0d0e0f"], @@ -200,8 +200,8 @@ mod tests { assert_eq!(obj.get("c"), v2_int_payload().get("c")); // The UNION of the index-produced terms survives — `hm` (for - // `int4_eq`) AND `ob` (for `int4_ord`/`int4_ord_ore`) — even though - // no single int4 domain requires both. + // `integer_eq`) AND `ob` (for `integer_ord`/`integer_ord_ore`) — even though + // no single integer domain requires both. assert_eq!(obj.get("hm"), v2_int_payload().get("hm")); assert_eq!(obj.get("ob"), v2_int_payload().get("ob")); @@ -322,7 +322,7 @@ mod tests { #[test] fn unconsumed_term_fails_closed() { - // The int4 family has no bloom domain: a `Match` index there would + // The integer family has no bloom domain: a `Match` index there would // produce a `bf` term no conversion target keeps. That is a fixture // misconfiguration and must error, not silently drop the term. let err = to_v3_payloads( diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 47bbe6468..7f3d63727 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -34,14 +34,14 @@ mod text_match; #[path = "encrypted_domain/ope/support.rs"] mod ope_support; -#[path = "encrypted_domain/ope/int4_ord_ope.rs"] -mod int4_ord_ope; +#[path = "encrypted_domain/ope/integer_ord_ope.rs"] +mod integer_ord_ope; -#[path = "encrypted_domain/ope/int2_ord_ope.rs"] -mod int2_ord_ope; +#[path = "encrypted_domain/ope/smallint_ord_ope.rs"] +mod smallint_ord_ope; -#[path = "encrypted_domain/ope/int8_ord_ope.rs"] -mod int8_ord_ope; +#[path = "encrypted_domain/ope/bigint_ord_ope.rs"] +mod bigint_ord_ope; #[path = "encrypted_domain/ope/date_ord_ope.rs"] mod date_ord_ope; @@ -55,11 +55,11 @@ mod numeric_ord_ope; #[path = "encrypted_domain/ope/text_ord_ope.rs"] mod text_ord_ope; -#[path = "encrypted_domain/ope/float4_ord_ope.rs"] -mod float4_ord_ope; +#[path = "encrypted_domain/ope/real_ord_ope.rs"] +mod real_ord_ope; -#[path = "encrypted_domain/ope/float8_ord_ope.rs"] -mod float8_ord_ope; +#[path = "encrypted_domain/ope/double_ord_ope.rs"] +mod double_ord_ope; // Signed-only sign-boundary suite (`int`, `date`). Like the text suites it // lives outside `scalars::` so the matrix-inventory snapshot (which pins the diff --git a/tests/sqlx/tests/encrypted_domain/ope/float4_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs similarity index 59% rename from tests/sqlx/tests/encrypted_domain/ope/float4_ord_ope.rs rename to tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs index 26259627c..e4be3c29b 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/float4_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs @@ -1,7 +1,7 @@ -//! `eql_v3.float4_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `eql_v3.bigint_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour -//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the int4 -//! reference in `ope/int4_ord_ope.rs`. +//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer +//! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("float4_ord_ope"); +crate::ope_ord_smoke!("bigint_ord_ope"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs index 73860acbd..be78eb1ed 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs @@ -1,7 +1,7 @@ //! `eql_v3.date_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour -//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the int4 -//! reference in `ope/int4_ord_ope.rs`. +//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer +//! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("date_ord_ope"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/float8_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs similarity index 59% rename from tests/sqlx/tests/encrypted_domain/ope/float8_ord_ope.rs rename to tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs index 43585d5d9..48479d0bc 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/float8_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs @@ -1,7 +1,7 @@ -//! `eql_v3.float8_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `eql_v3.double_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour -//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the int4 -//! reference in `ope/int4_ord_ope.rs`. +//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer +//! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("float8_ord_ope"); +crate::ope_ord_smoke!("double_ord_ope"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/int4_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs similarity index 84% rename from tests/sqlx/tests/encrypted_domain/ope/int4_ord_ope.rs rename to tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs index 859990d16..d76a26c36 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/int4_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs @@ -1,12 +1,12 @@ -//! `eql_v3.int4_ord_ope` smoke suite: the shared `_ord_ope` tests plus the +//! `eql_v3.integer_ord_ope` smoke suite: the shared `_ord_ope` tests plus the //! deeper single-type behaviour (bytea prefix order, blockers, ORDER BY forms, -//! MIN/MAX aggregates) exercised once on the int4 reference — the ope surface +//! MIN/MAX aggregates) exercised once on the integer reference — the ope surface //! is byte-identical across the ordered families modulo the domain name, so //! the per-type modules pin the shared contract and this one goes deeper. use crate::ope_support::ope_cast; -crate::ope_ord_smoke!("int4_ord_ope"); +crate::ope_ord_smoke!("integer_ord_ope"); #[sqlx::test] async fn ord_ope_functional_index_engages_for_range_and_equality( @@ -20,13 +20,13 @@ async fn ord_ope_functional_index_engages_for_range_and_equality( // opclass — the same mechanism as `hm` equality. `enable_seqscan = off` // proves usability only (the matrix's scale tests own preference). let mut tx = pool.begin().await?; - sqlx::query("CREATE TABLE ope_idx (id int, payload eql_v3.int4_ord_ope)") + sqlx::query("CREATE TABLE ope_idx (id int, payload eql_v3.integer_ord_ope)") .execute(&mut *tx) .await?; for (id, op) in [(1, "00"), (2, "0a"), (3, "7f"), (4, "ff"), (5, "ffff")] { sqlx::query(&format!( "INSERT INTO ope_idx VALUES ({id}, ({}))", - ope_cast("int4_ord_ope", "aa", op) + ope_cast("integer_ord_ope", "aa", op) )) .execute(&mut *tx) .await?; @@ -41,13 +41,13 @@ async fn ord_ope_functional_index_engages_for_range_and_equality( for op in ["<", "<=", ">", ">=", "="] { let query = format!( "SELECT id FROM ope_idx WHERE payload {op} ({})", - ope_cast("int4_ord_ope", "aa", "7f") + ope_cast("integer_ord_ope", "aa", "7f") ); eql_tests::matrix::assert_index_scan_uses( &mut *tx, &query, "ope_idx_ord", - &format!("int4_ord_ope `{op}` must engage the ord_ope_term btree index"), + &format!("integer_ord_ope `{op}` must engage the ord_ope_term btree index"), ) .await?; } @@ -60,8 +60,8 @@ async fn ord_ope_shorter_prefix_sorts_first(pool: PgPool) -> anyhow::Result<()> // Native bytea semantics: a strict prefix sorts before its extension. let lt: bool = sqlx::query_scalar(&format!( "SELECT ({}) < ({})", - ope_cast("int4_ord_ope", "aa", "00ff"), - ope_cast("int4_ord_ope", "aa", "00ff01") + ope_cast("integer_ord_ope", "aa", "00ff"), + ope_cast("integer_ord_ope", "aa", "00ff01") )) .fetch_one(&pool) .await?; @@ -73,15 +73,15 @@ async fn ord_ope_shorter_prefix_sorts_first(pool: PgPool) -> anyhow::Result<()> async fn ord_ope_blocks_unsupported_operators(pool: PgPool) -> anyhow::Result<()> { let err = sqlx::query(&format!( "SELECT ({}) @> ({})", - ope_cast("int4_ord_ope", "aa", "00"), - ope_cast("int4_ord_ope", "aa", "00") + ope_cast("integer_ord_ope", "aa", "00"), + ope_cast("integer_ord_ope", "aa", "00") )) .execute(&pool) .await .unwrap_err(); assert!( format!("{err}").contains("not supported"), - "@> must be blocked on int4_ord_ope, got: {err}" + "@> must be blocked on integer_ord_ope, got: {err}" ); Ok(()) } @@ -93,14 +93,14 @@ async fn ord_ope_order_by_sorts_by_decoded_bytes(pool: PgPool) -> anyhow::Result // opclass). `ORDER BY col USING <` must REJECT: the design forbids // opclasses on the domains themselves (see the matrix's order_by_using // rejection category). - sqlx::query("CREATE TABLE ope_smoke (id int, payload eql_v3.int4_ord_ope)") + sqlx::query("CREATE TABLE ope_smoke (id int, payload eql_v3.integer_ord_ope)") .execute(&pool) .await?; // Insert out of byte order: 0xff (3rd), 0x00ff (1st), 0x0100 (2nd). for (id, op) in [(1, "ff"), (2, "00ff"), (3, "0100")] { sqlx::query(&format!( "INSERT INTO ope_smoke VALUES ({id}, ({}))", - ope_cast("int4_ord_ope", "aa", op) + ope_cast("integer_ord_ope", "aa", op) )) .execute(&pool) .await?; @@ -129,13 +129,13 @@ async fn ord_ope_order_by_sorts_by_decoded_bytes(pool: PgPool) -> anyhow::Result #[sqlx::test] async fn ord_ope_min_max_aggregates(pool: PgPool) -> anyhow::Result<()> { - sqlx::query("CREATE TABLE ope_agg (payload eql_v3.int4_ord_ope)") + sqlx::query("CREATE TABLE ope_agg (payload eql_v3.integer_ord_ope)") .execute(&pool) .await?; for op in ["0a", "00", "ff"] { sqlx::query(&format!( "INSERT INTO ope_agg VALUES (({}))", - ope_cast("int4_ord_ope", "aa", op) + ope_cast("integer_ord_ope", "aa", op) )) .execute(&pool) .await?; diff --git a/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs index 74852296a..9f6986db2 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs @@ -1,7 +1,7 @@ //! `eql_v3.numeric_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour -//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the int4 -//! reference in `ope/int4_ord_ope.rs`. +//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer +//! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("numeric_ord_ope"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/int2_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs similarity index 59% rename from tests/sqlx/tests/encrypted_domain/ope/int2_ord_ope.rs rename to tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs index b8bd8e41e..9b19ecf17 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/int2_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs @@ -1,7 +1,7 @@ -//! `eql_v3.int2_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `eql_v3.real_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour -//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the int4 -//! reference in `ope/int4_ord_ope.rs`. +//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer +//! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("int2_ord_ope"); +crate::ope_ord_smoke!("real_ord_ope"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/int8_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs similarity index 54% rename from tests/sqlx/tests/encrypted_domain/ope/int8_ord_ope.rs rename to tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs index e8d7cd25c..a1a32fe7a 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/int8_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs @@ -1,7 +1,7 @@ -//! `eql_v3.int8_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `eql_v3.smallint_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour -//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the int4 -//! reference in `ope/int4_ord_ope.rs`. +//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer +//! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("int8_ord_ope"); +crate::ope_ord_smoke!("smallint_ord_ope"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs index 97e09442b..8378c7b14 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs @@ -1,7 +1,7 @@ //! `eql_v3.timestamp_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour -//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the int4 -//! reference in `ope/int4_ord_ope.rs`. +//! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer +//! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("timestamp_ord_ope"); diff --git a/tests/sqlx/tests/payload_schema_tests.rs b/tests/sqlx/tests/payload_schema_tests.rs index 790f18305..ce46ef8b9 100644 --- a/tests/sqlx/tests/payload_schema_tests.rs +++ b/tests/sqlx/tests/payload_schema_tests.rs @@ -562,11 +562,11 @@ fn from_v2_scalar_outputs_validate_against_published_v3_schemas() { // schema's signed int16 bounds are exercised on the converted value. let v2 = v2_ct_full(); for domain in [ - "int4", + "integer", "text_eq", - "int4_ord_ore", + "integer_ord_ore", "text_search", - "int4_ord_ope", + "integer_ord_ope", "text_ord_ope", ] { assert_converts_to_valid_v3(&v2, domain); From f977d3a01297881e498f3854cf3bc213e6f3d931 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 21:13:35 +1000 Subject: [PATCH 483/599] feat(bindings): catalog-generated DomainPayload enum + typed from_v2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit eql-codegen now emits crates/eql-bindings/src/v3/payload.rs: the DomainPayload enum spanning every stored-payload domain — one variant per catalog (family, domain) pair mapping to its generated binding struct, plus SteVecDocument for the jsonb family's json domain. Generated alongside the family files and inventory.rs (same // @generated marker, same drift gates: types:check covers it), so it cannot drift when the catalog grows. The enum is Serialize-only and #[serde(untagged)]: its wire form is exactly the inner struct's, and there is deliberately no Deserialize — cross-token payloads (integer_eq vs bigint_eq) are byte-identical on the wire, so a variant can only be constructed from a KNOWN domain (DomainPayload::parse), never inferred from bytes (the v3 module's "Why there is no discriminated enum" rule stands). No ts-rs/schemars derives either: this is a Rust-side ergonomics type, and the exported TS/JSON-Schema surface is unchanged. from_v2 is refactored around a shared convert() so the final strict parse happens exactly once per conversion: from_v2 keeps its validate-and-discard gate and still returns the wire Value (unchanged API); the new from_v2_typed parses-and-KEEPS the payload as the DomainPayload variant. tests/domain_payload.rs pins the byte-identical serialization contract (to_value + canonical string form equal to from_v2's output, exhaustively across every scalar domain plus the SteVec document) and MissingTerm/Invalid failure parity. Origin: coderdan's review on protectjs-ffi#104 — protect-ffi stores from_v2's output type-erased as V3(serde_json::Value) because no typed value was obtainable from eql-bindings; it can now swap to V3(DomainPayload) mechanically. Refs: CIP-3372 --- crates/eql-bindings/src/from_v2/mod.rs | 70 ++++- crates/eql-bindings/src/v3/mod.rs | 10 + crates/eql-bindings/src/v3/payload.rs | 306 ++++++++++++++++++++ crates/eql-bindings/tests/domain_payload.rs | 274 ++++++++++++++++++ crates/eql-codegen/src/bindings.rs | 204 ++++++++++++- crates/eql-codegen/tests/cli.rs | 4 +- 6 files changed, 845 insertions(+), 23 deletions(-) create mode 100644 crates/eql-bindings/src/v3/payload.rs create mode 100644 crates/eql-bindings/tests/domain_payload.rs diff --git a/crates/eql-bindings/src/from_v2/mod.rs b/crates/eql-bindings/src/from_v2/mod.rs index 9a2fee936..fe47b6f75 100644 --- a/crates/eql-bindings/src/from_v2/mod.rs +++ b/crates/eql-bindings/src/from_v2/mod.rs @@ -49,9 +49,14 @@ //! [`crate::v3::jsonb::SteVecDocument`] shape. //! //! Every converted payload is validated by a final strict parse through the -//! target's binding struct (`deny_unknown_fields` + [`crate::SchemaVersion`] -//! via [`crate::v3::DomainType::parse_value`]) before it is returned — the -//! converter never emits a payload the v3 domain CHECK would reject. +//! target's binding struct (`deny_unknown_fields` + [`crate::SchemaVersion`]) +//! before it is returned — the converter never emits a payload the v3 domain +//! CHECK would reject. The parse happens exactly once per conversion: +//! [`from_v2`] validates and discards it +//! (via [`crate::v3::DomainType::parse_value`]) and returns the wire `Value`; +//! [`from_v2_typed`] KEEPS it, returning the matching +//! [`crate::v3::DomainPayload`] variant (whose untagged serialization is +//! byte-identical to the `Value` [`from_v2`] returns). //! //! ## Query payloads //! @@ -85,7 +90,7 @@ pub use target::{ScalarTarget, TargetDomain}; use serde::de::Error as _; use serde_json::{json, Map, Value}; -use crate::v3::all; +use crate::v3::{all, DomainPayload}; /// The v2 wire version this converter accepts. const V2_WIRE_VERSION: u64 = 2; @@ -94,8 +99,47 @@ const V2_WIRE_VERSION: u64 = 2; /// /// See the [module docs](self) for the conversion rules. Fails closed: the /// returned value has already passed a strict parse through the target -/// domain's binding struct. +/// domain's binding struct. Wire-oriented callers keep the `Value`; callers +/// that want the payload typed use [`from_v2_typed`] instead (same +/// conversion, same failures, one strict parse either way). pub fn from_v2(v2: &Value, target: TargetDomain) -> Result { + let out = convert(v2, target)?; + validate_as(target.describe(), &out)?; + Ok(out) +} + +/// Convert a STORED EQL v2.3 payload into the TYPED v3 payload for `target`: +/// [`from_v2`] returning the [`DomainPayload`] variant for the target domain +/// instead of a shape-erased `Value`. +/// +/// Same conversion rules and same failures as [`from_v2`] — one shared +/// conversion path, and the final strict parse through the target's binding +/// struct happens exactly once (here it is KEPT as the enum variant; in +/// [`from_v2`] it is a validate-and-discard check). Because +/// [`DomainPayload`]'s serialization is untagged, +/// `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` +/// exactly (pinned by `tests/domain_payload.rs`). +pub fn from_v2_typed(v2: &Value, target: TargetDomain) -> Result { + let out = convert(v2, target)?; + DomainPayload::parse(target.describe(), &out) + .unwrap_or_else(|| { + // Every conversion target (all scalar domains + "json") has a + // generated DomainPayload variant; TargetDomain::parse resolved + // `target` against the same catalog. + unreachable!( + "conversion target {} must have a DomainPayload variant", + target.describe() + ) + }) + .map_err(FromV2Error::Invalid) +} + +/// The shared conversion path behind [`from_v2`] / [`from_v2_typed`]: +/// dispatch on the v2 `k` form against the target shape and build the v3 +/// payload `Value`. Does NOT run the final strict parse — each public entry +/// point does that exactly once (validate-and-discard in [`from_v2`], +/// parse-and-keep in [`from_v2_typed`]). +fn convert(v2: &Value, target: TargetDomain) -> Result { let obj = require_v2_envelope(v2)?; let kind = obj.get("k").and_then(Value::as_str); match (kind, target) { @@ -195,9 +239,9 @@ fn convert_scalar(obj: &Map, target: ScalarTarget) -> Result, target: ScalarTarget) -> Result) -> Result { out.insert("k".into(), json!("sv")); if let Some(i) = obj.get("i") { out.insert("i".into(), i.clone()); - // Absent `i` fails the final validation below. + // Absent `i` fails the entry point's final strict parse. } let sv = obj .get("sv") @@ -269,9 +311,7 @@ fn convert_ste_vec(obj: &Map) -> Result { .map(|(idx, entry)| convert_entry(idx, entry, EntryShape::Document)) .collect::, _>>()?; out.insert("sv".into(), Value::Array(entries)); - let out = Value::Object(out); - validate_as("json", &out)?; - Ok(out) + Ok(Value::Object(out)) } /// v2 query needle `{sv: [{s, hm|oc, …}]}` → v3 `SteVecQuery` shape. diff --git a/crates/eql-bindings/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs index 7897afcbb..4fbacc20f 100644 --- a/crates/eql-bindings/src/v3/mod.rs +++ b/crates/eql-bindings/src/v3/mod.rs @@ -71,6 +71,14 @@ //! `_ord` vs `_ord_ore` are identical shapes that no sniffing can separate. //! Consumers read from a typed column and already know the domain. //! +//! The generated [`DomainPayload`] enum (`payload.rs`) does NOT contradict +//! this rule: it spans every stored-payload domain but derives only +//! `Serialize` (untagged, so the wire form is exactly the inner struct's) and +//! is constructible solely from a KNOWN domain name +//! ([`payload::DomainPayload::parse`], [`crate::from_v2::from_v2_typed`]) — +//! there is still no `Deserialize`, because inference from bytes remains +//! unsound. +//! //! The SteVec `jsonb` family is the ONE principled exception: a single encrypted //! document legitimately mixes `hm` leaves (bool / root) and `oc` leaves //! (string / number) in one `sv` array, so `SteVecEntry` must hold either term. @@ -132,6 +140,7 @@ pub mod integer; pub mod inventory; pub mod jsonb; pub mod numeric; +pub mod payload; pub mod real; pub mod smallint; pub mod terms; @@ -140,3 +149,4 @@ pub mod timestamp; pub use domain_type::{DomainType, SCHEMA_ID_BASE, SQL_SCHEMA}; pub use inventory::all; +pub use payload::DomainPayload; diff --git a/crates/eql-bindings/src/v3/payload.rs b/crates/eql-bindings/src/v3/payload.rs new file mode 100644 index 000000000..f71ff84a9 --- /dev/null +++ b/crates/eql-bindings/src/v3/payload.rs @@ -0,0 +1,306 @@ +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The generated `DomainPayload` enum — every stored-payload v3 domain in one Rust type. Generated from the catalog; the DomainType trait, the shared newtypes, and the architectural module doc stay hand-written (domain_type.rs / terms.rs / mod.rs). +use super::domain_type::DomainType; +use serde::{Deserialize, Serialize}; +/// Every stored-payload v3 domain in one type: one variant per flat +/// scalar domain in `eql-domains::CATALOG` plus the SteVec document +/// (`eql_v3.json`). Generated from the catalog, so it cannot drift +/// when the catalog grows. +/// +/// Serialization is exactly the inner struct's (`#[serde(untagged)]` +/// adds no tagging), so typing a payload never changes the wire. +/// Deliberately NO `Deserialize`: cross-token payloads are +/// byte-identical on the wire (see "Why there is no discriminated +/// enum" in the v3 module docs), so a variant is only constructible +/// from a KNOWN domain — [`DomainPayload::parse`] or +/// [`crate::from_v2::from_v2_typed`] — never inferred from bytes. +#[derive(Clone, Debug, PartialEq, Serialize)] +#[serde(untagged)] +pub enum DomainPayload { + /// The `eql_v3.integer` payload. + Integer(super::integer::Integer), + /// The `eql_v3.integer_eq` payload. + IntegerEq(super::integer::IntegerEq), + /// The `eql_v3.integer_ord_ore` payload. + IntegerOrdOre(super::integer::IntegerOrdOre), + /// The `eql_v3.integer_ord` payload. + IntegerOrd(super::integer::IntegerOrd), + /// The `eql_v3.integer_ord_ope` payload. + IntegerOrdOpe(super::integer::IntegerOrdOpe), + /// The `eql_v3.smallint` payload. + Smallint(super::smallint::Smallint), + /// The `eql_v3.smallint_eq` payload. + SmallintEq(super::smallint::SmallintEq), + /// The `eql_v3.smallint_ord_ore` payload. + SmallintOrdOre(super::smallint::SmallintOrdOre), + /// The `eql_v3.smallint_ord` payload. + SmallintOrd(super::smallint::SmallintOrd), + /// The `eql_v3.smallint_ord_ope` payload. + SmallintOrdOpe(super::smallint::SmallintOrdOpe), + /// The `eql_v3.bigint` payload. + Bigint(super::bigint::Bigint), + /// The `eql_v3.bigint_eq` payload. + BigintEq(super::bigint::BigintEq), + /// The `eql_v3.bigint_ord_ore` payload. + BigintOrdOre(super::bigint::BigintOrdOre), + /// The `eql_v3.bigint_ord` payload. + BigintOrd(super::bigint::BigintOrd), + /// The `eql_v3.bigint_ord_ope` payload. + BigintOrdOpe(super::bigint::BigintOrdOpe), + /// The `eql_v3.date` payload. + Date(super::date::Date), + /// The `eql_v3.date_eq` payload. + DateEq(super::date::DateEq), + /// The `eql_v3.date_ord_ore` payload. + DateOrdOre(super::date::DateOrdOre), + /// The `eql_v3.date_ord` payload. + DateOrd(super::date::DateOrd), + /// The `eql_v3.date_ord_ope` payload. + DateOrdOpe(super::date::DateOrdOpe), + /// The `eql_v3.timestamp` payload. + Timestamp(super::timestamp::Timestamp), + /// The `eql_v3.timestamp_eq` payload. + TimestampEq(super::timestamp::TimestampEq), + /// The `eql_v3.timestamp_ord_ore` payload. + TimestampOrdOre(super::timestamp::TimestampOrdOre), + /// The `eql_v3.timestamp_ord` payload. + TimestampOrd(super::timestamp::TimestampOrd), + /// The `eql_v3.timestamp_ord_ope` payload. + TimestampOrdOpe(super::timestamp::TimestampOrdOpe), + /// The `eql_v3.numeric` payload. + Numeric(super::numeric::Numeric), + /// The `eql_v3.numeric_eq` payload. + NumericEq(super::numeric::NumericEq), + /// The `eql_v3.numeric_ord_ore` payload. + NumericOrdOre(super::numeric::NumericOrdOre), + /// The `eql_v3.numeric_ord` payload. + NumericOrd(super::numeric::NumericOrd), + /// The `eql_v3.numeric_ord_ope` payload. + NumericOrdOpe(super::numeric::NumericOrdOpe), + /// The `eql_v3.text` payload. + Text(super::text::Text), + /// The `eql_v3.text_eq` payload. + TextEq(super::text::TextEq), + /// The `eql_v3.text_match` payload. + TextMatch(super::text::TextMatch), + /// The `eql_v3.text_ord_ore` payload. + TextOrdOre(super::text::TextOrdOre), + /// The `eql_v3.text_ord` payload. + TextOrd(super::text::TextOrd), + /// The `eql_v3.text_ord_ope` payload. + TextOrdOpe(super::text::TextOrdOpe), + /// The `eql_v3.text_search` payload. + TextSearch(super::text::TextSearch), + /// The `eql_v3.boolean` payload. + Boolean(super::boolean::Boolean), + /// The `eql_v3.real` payload. + Real(super::real::Real), + /// The `eql_v3.real_eq` payload. + RealEq(super::real::RealEq), + /// The `eql_v3.real_ord_ore` payload. + RealOrdOre(super::real::RealOrdOre), + /// The `eql_v3.real_ord` payload. + RealOrd(super::real::RealOrd), + /// The `eql_v3.real_ord_ope` payload. + RealOrdOpe(super::real::RealOrdOpe), + /// The `eql_v3.double` payload. + Double(super::double::Double), + /// The `eql_v3.double_eq` payload. + DoubleEq(super::double::DoubleEq), + /// The `eql_v3.double_ord_ore` payload. + DoubleOrdOre(super::double::DoubleOrdOre), + /// The `eql_v3.double_ord` payload. + DoubleOrd(super::double::DoubleOrd), + /// The `eql_v3.double_ord_ope` payload. + DoubleOrdOpe(super::double::DoubleOrdOpe), + /// The `eql_v3.json` payload. + SteVecDocument(super::jsonb::SteVecDocument), +} +impl DomainPayload { + /// Strictly parse `value` as `domain`'s payload, KEEPING the + /// parsed value — the constructor counterpart of + /// [`DomainType::parse_value`] (which validates and discards). + /// `domain` is the unqualified name (`"integer_eq"`, `"json"`, + /// …). `None` when `domain` is not a stored-payload domain (the + /// SteVec entry/query shapes included); `Some(Err)` when the + /// strict parse fails (`deny_unknown_fields`, the + /// `SchemaVersion`/`SteVecForm` pins). + pub fn parse( + domain: &str, + value: &serde_json::Value, + ) -> Option> { + match domain { + "integer" => Some(super::integer::Integer::deserialize(value).map(Self::Integer)), + "integer_eq" => { + Some(super::integer::IntegerEq::deserialize(value).map(Self::IntegerEq)) + } + "integer_ord_ore" => { + Some(super::integer::IntegerOrdOre::deserialize(value).map(Self::IntegerOrdOre)) + } + "integer_ord" => { + Some(super::integer::IntegerOrd::deserialize(value).map(Self::IntegerOrd)) + } + "integer_ord_ope" => { + Some(super::integer::IntegerOrdOpe::deserialize(value).map(Self::IntegerOrdOpe)) + } + "smallint" => Some(super::smallint::Smallint::deserialize(value).map(Self::Smallint)), + "smallint_eq" => { + Some(super::smallint::SmallintEq::deserialize(value).map(Self::SmallintEq)) + } + "smallint_ord_ore" => { + Some(super::smallint::SmallintOrdOre::deserialize(value).map(Self::SmallintOrdOre)) + } + "smallint_ord" => { + Some(super::smallint::SmallintOrd::deserialize(value).map(Self::SmallintOrd)) + } + "smallint_ord_ope" => { + Some(super::smallint::SmallintOrdOpe::deserialize(value).map(Self::SmallintOrdOpe)) + } + "bigint" => Some(super::bigint::Bigint::deserialize(value).map(Self::Bigint)), + "bigint_eq" => Some(super::bigint::BigintEq::deserialize(value).map(Self::BigintEq)), + "bigint_ord_ore" => { + Some(super::bigint::BigintOrdOre::deserialize(value).map(Self::BigintOrdOre)) + } + "bigint_ord" => Some(super::bigint::BigintOrd::deserialize(value).map(Self::BigintOrd)), + "bigint_ord_ope" => { + Some(super::bigint::BigintOrdOpe::deserialize(value).map(Self::BigintOrdOpe)) + } + "date" => Some(super::date::Date::deserialize(value).map(Self::Date)), + "date_eq" => Some(super::date::DateEq::deserialize(value).map(Self::DateEq)), + "date_ord_ore" => { + Some(super::date::DateOrdOre::deserialize(value).map(Self::DateOrdOre)) + } + "date_ord" => Some(super::date::DateOrd::deserialize(value).map(Self::DateOrd)), + "date_ord_ope" => { + Some(super::date::DateOrdOpe::deserialize(value).map(Self::DateOrdOpe)) + } + "timestamp" => { + Some(super::timestamp::Timestamp::deserialize(value).map(Self::Timestamp)) + } + "timestamp_eq" => { + Some(super::timestamp::TimestampEq::deserialize(value).map(Self::TimestampEq)) + } + "timestamp_ord_ore" => Some( + super::timestamp::TimestampOrdOre::deserialize(value).map(Self::TimestampOrdOre), + ), + "timestamp_ord" => { + Some(super::timestamp::TimestampOrd::deserialize(value).map(Self::TimestampOrd)) + } + "timestamp_ord_ope" => Some( + super::timestamp::TimestampOrdOpe::deserialize(value).map(Self::TimestampOrdOpe), + ), + "numeric" => Some(super::numeric::Numeric::deserialize(value).map(Self::Numeric)), + "numeric_eq" => { + Some(super::numeric::NumericEq::deserialize(value).map(Self::NumericEq)) + } + "numeric_ord_ore" => { + Some(super::numeric::NumericOrdOre::deserialize(value).map(Self::NumericOrdOre)) + } + "numeric_ord" => { + Some(super::numeric::NumericOrd::deserialize(value).map(Self::NumericOrd)) + } + "numeric_ord_ope" => { + Some(super::numeric::NumericOrdOpe::deserialize(value).map(Self::NumericOrdOpe)) + } + "text" => Some(super::text::Text::deserialize(value).map(Self::Text)), + "text_eq" => Some(super::text::TextEq::deserialize(value).map(Self::TextEq)), + "text_match" => Some(super::text::TextMatch::deserialize(value).map(Self::TextMatch)), + "text_ord_ore" => { + Some(super::text::TextOrdOre::deserialize(value).map(Self::TextOrdOre)) + } + "text_ord" => Some(super::text::TextOrd::deserialize(value).map(Self::TextOrd)), + "text_ord_ope" => { + Some(super::text::TextOrdOpe::deserialize(value).map(Self::TextOrdOpe)) + } + "text_search" => { + Some(super::text::TextSearch::deserialize(value).map(Self::TextSearch)) + } + "boolean" => Some(super::boolean::Boolean::deserialize(value).map(Self::Boolean)), + "real" => Some(super::real::Real::deserialize(value).map(Self::Real)), + "real_eq" => Some(super::real::RealEq::deserialize(value).map(Self::RealEq)), + "real_ord_ore" => { + Some(super::real::RealOrdOre::deserialize(value).map(Self::RealOrdOre)) + } + "real_ord" => Some(super::real::RealOrd::deserialize(value).map(Self::RealOrd)), + "real_ord_ope" => { + Some(super::real::RealOrdOpe::deserialize(value).map(Self::RealOrdOpe)) + } + "double" => Some(super::double::Double::deserialize(value).map(Self::Double)), + "double_eq" => Some(super::double::DoubleEq::deserialize(value).map(Self::DoubleEq)), + "double_ord_ore" => { + Some(super::double::DoubleOrdOre::deserialize(value).map(Self::DoubleOrdOre)) + } + "double_ord" => Some(super::double::DoubleOrd::deserialize(value).map(Self::DoubleOrd)), + "double_ord_ope" => { + Some(super::double::DoubleOrdOpe::deserialize(value).map(Self::DoubleOrdOpe)) + } + "json" => { + Some(super::jsonb::SteVecDocument::deserialize(value).map(Self::SteVecDocument)) + } + _ => None, + } + } + /// The inner payload as a [`DomainType`] trait object. + pub fn as_domain_type(&self) -> &dyn DomainType { + match self { + Self::Integer(payload) => payload, + Self::IntegerEq(payload) => payload, + Self::IntegerOrdOre(payload) => payload, + Self::IntegerOrd(payload) => payload, + Self::IntegerOrdOpe(payload) => payload, + Self::Smallint(payload) => payload, + Self::SmallintEq(payload) => payload, + Self::SmallintOrdOre(payload) => payload, + Self::SmallintOrd(payload) => payload, + Self::SmallintOrdOpe(payload) => payload, + Self::Bigint(payload) => payload, + Self::BigintEq(payload) => payload, + Self::BigintOrdOre(payload) => payload, + Self::BigintOrd(payload) => payload, + Self::BigintOrdOpe(payload) => payload, + Self::Date(payload) => payload, + Self::DateEq(payload) => payload, + Self::DateOrdOre(payload) => payload, + Self::DateOrd(payload) => payload, + Self::DateOrdOpe(payload) => payload, + Self::Timestamp(payload) => payload, + Self::TimestampEq(payload) => payload, + Self::TimestampOrdOre(payload) => payload, + Self::TimestampOrd(payload) => payload, + Self::TimestampOrdOpe(payload) => payload, + Self::Numeric(payload) => payload, + Self::NumericEq(payload) => payload, + Self::NumericOrdOre(payload) => payload, + Self::NumericOrd(payload) => payload, + Self::NumericOrdOpe(payload) => payload, + Self::Text(payload) => payload, + Self::TextEq(payload) => payload, + Self::TextMatch(payload) => payload, + Self::TextOrdOre(payload) => payload, + Self::TextOrd(payload) => payload, + Self::TextOrdOpe(payload) => payload, + Self::TextSearch(payload) => payload, + Self::Boolean(payload) => payload, + Self::Real(payload) => payload, + Self::RealEq(payload) => payload, + Self::RealOrdOre(payload) => payload, + Self::RealOrd(payload) => payload, + Self::RealOrdOpe(payload) => payload, + Self::Double(payload) => payload, + Self::DoubleEq(payload) => payload, + Self::DoubleOrdOre(payload) => payload, + Self::DoubleOrd(payload) => payload, + Self::DoubleOrdOpe(payload) => payload, + Self::SteVecDocument(payload) => payload, + } + } + /// Fully-qualified SQL domain name, e.g. `"eql_v3.integer_eq"`. + pub fn sql_domain(&self) -> &'static str { + self.as_domain_type().sql_domain() + } + /// Unqualified SQL domain name, e.g. `"integer_eq"` — the name + /// [`DomainPayload::parse`] accepts. + pub fn domain(&self) -> &'static str { + self.as_domain_type().domain() + } +} diff --git a/crates/eql-bindings/tests/domain_payload.rs b/crates/eql-bindings/tests/domain_payload.rs new file mode 100644 index 000000000..8a42c8822 --- /dev/null +++ b/crates/eql-bindings/tests/domain_payload.rs @@ -0,0 +1,274 @@ +//! Tests for the catalog-generated [`DomainPayload`] enum and the typed +//! conversion path [`from_v2_typed`]. +//! +//! The load-bearing contract is the byte-identical serialization pin: for +//! every conversion target, `serde_json::to_value(&from_v2_typed(..))` must +//! equal the `Value` the wire-oriented `from_v2` returns — the enum is +//! `#[serde(untagged)]`, so typing a payload can never change the wire. +//! Construction is always from a KNOWN target domain ([`DomainPayload::parse`] +//! / [`from_v2_typed`]) — never inferred from bytes, per the "Why there is no +//! discriminated enum" note in the v3 module docs (cross-token payloads are +//! byte-identical on the wire). + +use eql_bindings::from_v2::{from_v2, from_v2_typed, is_v3_payload, FromV2Error, TargetDomain}; +use eql_bindings::v3::{DomainPayload, DomainType}; +use serde_json::{json, Value}; + +const CIPHERTEXT: &str = "mBbL@V^%dN?0W$;g)1-JP*cmqX%JhW0ZKZ^G?lNn$CfXJH"; +const HEX: &str = "8067db44a848ab32c3056a3dbe4edf16"; +const HEX_LONG: &str = "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793"; +const SELECTOR: &str = "9493d6010fe7845d52149b697729c745"; + +fn ident() -> Value { + json!({ "t": "users", "c": "email" }) +} + +/// A fully-populated v2.3 scalar (`k: "ct"`) payload — every index term, so +/// any scalar target converts (mirrors `tests/from_v2.rs`). +fn v2_ct_full() -> Value { + json!({ + "v": 2, + "k": "ct", + "c": CIPHERTEXT, + "i": ident(), + "hm": HEX, + "bf": [12, 47, 91, 188], + "ob": [HEX, HEX_LONG], + "op": HEX + }) +} + +/// A v2.3 SteVec (`k: "sv"`) payload (mirrors `tests/from_v2.rs`). +fn v2_sv() -> Value { + json!({ + "v": 2, + "k": "sv", + "i": ident(), + "sv": [ + { "s": SELECTOR, "c": CIPHERTEXT, "hm": HEX }, + { "s": SELECTOR, "a": true, "c": CIPHERTEXT, "oc": HEX_LONG } + ] + }) +} + +fn target(name: &str) -> TargetDomain { + TargetDomain::parse(name).unwrap_or_else(|e| panic!("target {name} must parse: {e}")) +} + +/// The serialization pin for one conversion: the typed payload must +/// serialize to exactly the `Value` the untyped `from_v2` returns — as a +/// `Value` and as a canonical JSON string — and the direct string form must +/// parse back to the same `Value`. +fn assert_serialization_pin(v2: &Value, t: TargetDomain) -> DomainPayload { + let typed = from_v2_typed(v2, t).expect("typed conversion succeeds"); + let untyped = from_v2(v2, t).expect("untyped conversion succeeds"); + + let typed_value = serde_json::to_value(&typed).expect("typed payload serializes"); + assert_eq!(typed_value, untyped, "to_value must match from_v2 exactly"); + + // String form: canonical (through Value) is byte-identical; the direct + // struct string form differs only in JSON object key order (semantically + // irrelevant, and normalized by jsonb) — pin that it parses back equal. + assert_eq!( + serde_json::to_string(&typed_value).unwrap(), + serde_json::to_string(&untyped).unwrap(), + "canonical string form must be byte-identical" + ); + let direct: Value = + serde_json::from_str(&serde_json::to_string(&typed).unwrap()).expect("direct form parses"); + assert_eq!(direct, untyped, "direct string form must round-trip equal"); + + assert!(is_v3_payload(&typed_value)); + typed +} + +// --------------------------------------------------------------------------- +// from_v2_typed — happy paths per payload shape +// --------------------------------------------------------------------------- + +#[test] +fn typed_scalar_single_term_yields_the_matching_variant() { + let typed = assert_serialization_pin(&v2_ct_full(), target("integer_eq")); + assert_eq!(typed.domain(), "integer_eq"); + assert_eq!(typed.sql_domain(), "eql_v3.integer_eq"); + match &typed { + DomainPayload::IntegerEq(p) => { + assert_eq!(p.sql_domain(), "eql_v3.integer_eq"); + } + other => panic!("expected IntegerEq, got {other:?}"), + } +} + +#[test] +fn typed_scalar_multi_term_yields_text_search() { + let typed = assert_serialization_pin(&v2_ct_full(), target("text_search")); + assert_eq!(typed.domain(), "text_search"); + match &typed { + DomainPayload::TextSearch(p) => { + // All three terms present — the capability is the type. + assert_eq!( + serde_json::to_value(p).unwrap(), + json!({ + "v": 3, + "i": ident(), + "c": CIPHERTEXT, + "hm": HEX, + "ob": [HEX, HEX_LONG], + "bf": [12, 47, 91, 188] + }) + ); + } + other => panic!("expected TextSearch, got {other:?}"), + } +} + +#[test] +fn typed_ste_vec_document_yields_ste_vec_document() { + let typed = assert_serialization_pin(&v2_sv(), TargetDomain::Json); + assert_eq!(typed.domain(), "json"); + assert_eq!(typed.sql_domain(), "eql_v3.json"); + match &typed { + DomainPayload::SteVecDocument(doc) => { + assert_eq!(doc.sv.len(), 2, "entry order/count preserved"); + } + other => panic!("expected SteVecDocument, got {other:?}"), + } +} + +#[test] +fn typed_conversion_pins_serialization_for_every_scalar_domain() { + // Exhaustive over the catalog: every scalar conversion target's typed + // payload serializes to exactly the untyped from_v2 output, so the pin + // cannot drift when the catalog grows. + for family in eql_domains::scalar_families() { + for domain in family.domains { + let name = family.domain_name(domain); + let typed = assert_serialization_pin(&v2_ct_full(), target(&name)); + assert_eq!(typed.domain(), name, "variant reports its domain"); + } + } +} + +// --------------------------------------------------------------------------- +// from_v2_typed — failure parity with from_v2 +// --------------------------------------------------------------------------- + +#[test] +fn typed_missing_term_fails_closed_exactly_like_from_v2() { + let minimal = json!({ "v": 2, "k": "ct", "c": CIPHERTEXT, "i": ident() }); + let typed_err = from_v2_typed(&minimal, target("text_eq")).unwrap_err(); + let untyped_err = from_v2(&minimal, target("text_eq")).unwrap_err(); + for err in [&typed_err, &untyped_err] { + match err { + FromV2Error::MissingTerm { domain, key, entry } => { + assert_eq!(domain, "text_eq"); + assert_eq!(key, "hm"); + assert_eq!(entry, &None); + } + other => panic!("expected MissingTerm, got {other:?}"), + } + } +} + +#[test] +fn typed_rejects_the_same_inputs_as_from_v2() { + // Version, kind, and kind-mismatch failures are shared with from_v2 (one + // conversion path); spot-check each class. + let v3 = json!({ "v": 3, "i": ident(), "c": CIPHERTEXT, "hm": HEX }); + assert!(matches!( + from_v2_typed(&v3, target("text_eq")).unwrap_err(), + FromV2Error::UnsupportedVersion { found: Some(3) } + )); + assert!(matches!( + from_v2_typed(&v2_sv(), target("integer_eq")).unwrap_err(), + FromV2Error::KindMismatch { .. } + )); + // A v2 QUERY payload (no `c`) fails the strict parse — Invalid, exactly + // like from_v2's validate_as. + let query = json!({ "v": 2, "k": "ct", "i": ident(), "hm": HEX }); + assert!(matches!( + from_v2_typed(&query, target("text_eq")).unwrap_err(), + FromV2Error::Invalid(_) + )); +} + +// --------------------------------------------------------------------------- +// DomainPayload::parse — construct-from-known-domain +// --------------------------------------------------------------------------- + +#[test] +fn parse_constructs_every_stored_payload_domain() { + // Every scalar domain plus the SteVec document is parseable by name; the + // constructed variant reports the same domain back. + for family in eql_domains::CATALOG { + for domain in family.domains { + let name = family.domain_name(domain); + let stored = domain.is_scalar() || name == "json"; + let value = if name == "json" { + from_v2(&v2_sv(), TargetDomain::Json).unwrap() + } else if stored { + from_v2(&v2_ct_full(), target(&name)).unwrap() + } else { + // jsonb_entry / jsonb_query: inventory members but not stored + // payloads — no DomainPayload variant, parse returns None. + assert!( + DomainPayload::parse(&name, &json!({})).is_none(), + "{name} must not be a DomainPayload domain" + ); + continue; + }; + let parsed = DomainPayload::parse(&name, &value) + .unwrap_or_else(|| panic!("{name} must be a DomainPayload domain")) + .unwrap_or_else(|e| panic!("{name} strict parse must succeed: {e}")); + assert_eq!(parsed.domain(), name); + assert_eq!(serde_json::to_value(&parsed).unwrap(), value); + } + } +} + +#[test] +fn parse_returns_none_for_unknown_domains() { + for name in [ + "int5", + "eql_v3.integer_eq", + "", + "jsonb", + "jsonb_entry", + "jsonb_query", + ] { + assert!( + DomainPayload::parse(name, &json!({})).is_none(), + "{name:?} must not resolve to a DomainPayload variant" + ); + } +} + +#[test] +fn parse_is_strict_exactly_like_the_binding_struct() { + // Unknown keys and wrong envelope versions fail — DomainPayload::parse is + // the binding struct's strict Deserialize, kept instead of discarded. + let mut good = from_v2(&v2_ct_full(), target("integer_eq")).unwrap(); + assert!(DomainPayload::parse("integer_eq", &good).unwrap().is_ok()); + + good["extra"] = json!(1); + assert!( + DomainPayload::parse("integer_eq", &good).unwrap().is_err(), + "deny_unknown_fields must reject a stray key" + ); + + let wrong_version = json!({ "v": 2, "i": ident(), "c": CIPHERTEXT, "hm": HEX }); + assert!( + DomainPayload::parse("integer_eq", &wrong_version) + .unwrap() + .is_err(), + "SchemaVersion must reject v: 2" + ); +} + +#[test] +fn as_domain_type_exposes_the_inner_trait_object() { + let typed = from_v2_typed(&v2_ct_full(), target("bigint_ord_ope")).unwrap(); + let dt: &dyn DomainType = typed.as_domain_type(); + assert_eq!(dt.sql_domain(), "eql_v3.bigint_ord_ope"); + assert_eq!(dt.domain(), "bigint_ord_ope"); +} diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index 63de54499..f269fe815 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -275,12 +275,132 @@ pub fn render_inventory_rs() -> String { format_rs(file) } +/// The stored-payload domains of the catalog, in CATALOG order: every flat +/// scalar domain plus the SteVec document (`eql_v3.json`). The SteVec +/// entry/query shapes are inventory members but not stored column payloads, +/// so they are excluded — exactly the set `eql_bindings::from_v2` accepts as +/// conversion targets ([`render_payload_rs`]'s `DomainPayload` variants). +fn stored_payload_domains() -> impl Iterator { + CATALOG + .iter() + .flat_map(|f| f.domains.iter().map(move |d| (f, d))) + .filter(|(f, d)| d.is_scalar() || d.full_name(f.name) == "json") +} + +/// Render the generated `crates/eql-bindings/src/v3/payload.rs`: the +/// `DomainPayload` enum spanning every stored-payload domain — one variant +/// per catalog (family, domain) pair mapping to its binding struct, plus the +/// SteVec document for the `jsonb` family — with its +/// construct-from-known-domain `parse` constructor. +/// +/// Serialize-only by design: the enum is `#[serde(untagged)]` so its wire +/// form is exactly the inner struct's, and it deliberately derives NO +/// `Deserialize` — cross-token payloads (`integer_eq` vs `bigint_eq`) are +/// byte-identical on the wire, so a variant can never be inferred from bytes +/// (the "Why there is no discriminated enum" rule in the v3 module docs); +/// it can only be constructed from a known target domain. Likewise no ts-rs +/// or schemars derives: this is a Rust-side ergonomics type, not a new wire +/// shape, so it must not churn the exported TS/JSON-Schema surface. +pub fn render_payload_rs() -> String { + let mut variants = TokenStream::new(); + let mut parse_arms = TokenStream::new(); + let mut inner_arms = TokenStream::new(); + for (f, d) in stored_payload_domains() { + let module = format_ident!("{}", f.name); + let strukt = format_ident!("{}", d.rust_struct_name(f.name)); + let full = d.full_name(f.name); + let doc = format!(" The `eql_v3.{full}` payload."); + variants.extend(quote! { + #[doc = #doc] + #strukt(super::#module::#strukt), + }); + parse_arms.extend(quote! { + #full => Some(super::#module::#strukt::deserialize(value).map(Self::#strukt)), + }); + inner_arms.extend(quote! { + Self::#strukt(payload) => payload, + }); + } + + let mod_doc = " The generated `DomainPayload` enum — every stored-payload v3 \ + domain in one Rust type. Generated from the catalog; the \ + DomainType trait, the shared newtypes, and the architectural \ + module doc stay hand-written (domain_type.rs / terms.rs / mod.rs)."; + + let file = quote! { + #![doc = #mod_doc] + + use serde::{Deserialize, Serialize}; + + use super::domain_type::DomainType; + + /// Every stored-payload v3 domain in one type: one variant per flat + /// scalar domain in `eql-domains::CATALOG` plus the SteVec document + /// (`eql_v3.json`). Generated from the catalog, so it cannot drift + /// when the catalog grows. + /// + /// Serialization is exactly the inner struct's (`#[serde(untagged)]` + /// adds no tagging), so typing a payload never changes the wire. + /// Deliberately NO `Deserialize`: cross-token payloads are + /// byte-identical on the wire (see "Why there is no discriminated + /// enum" in the v3 module docs), so a variant is only constructible + /// from a KNOWN domain — [`DomainPayload::parse`] or + /// [`crate::from_v2::from_v2_typed`] — never inferred from bytes. + #[derive(Clone, Debug, PartialEq, Serialize)] + #[serde(untagged)] + pub enum DomainPayload { + #variants + } + + impl DomainPayload { + /// Strictly parse `value` as `domain`'s payload, KEEPING the + /// parsed value — the constructor counterpart of + /// [`DomainType::parse_value`] (which validates and discards). + /// `domain` is the unqualified name (`"integer_eq"`, `"json"`, + /// …). `None` when `domain` is not a stored-payload domain (the + /// SteVec entry/query shapes included); `Some(Err)` when the + /// strict parse fails (`deny_unknown_fields`, the + /// `SchemaVersion`/`SteVecForm` pins). + pub fn parse( + domain: &str, + value: &serde_json::Value, + ) -> Option> { + match domain { + #parse_arms + _ => None, + } + } + + /// The inner payload as a [`DomainType`] trait object. + pub fn as_domain_type(&self) -> &dyn DomainType { + match self { + #inner_arms + } + } + + /// Fully-qualified SQL domain name, e.g. `"eql_v3.integer_eq"`. + pub fn sql_domain(&self) -> &'static str { + self.as_domain_type().sql_domain() + } + + /// Unqualified SQL domain name, e.g. `"integer_eq"` — the name + /// [`DomainPayload::parse`] accepts. + pub fn domain(&self) -> &'static str { + self.as_domain_type().domain() + } + } + }; + + format_rs(file) +} + /// Relative path (from repo root) of the generated v3 bindings directory. const V3_BINDINGS_DIR: &str = "crates/eql-bindings/src/v3"; /// Render every binding file to memory (NO filesystem writes): one /// `(/.rs, body)` per catalog family in CATALOG order, then -/// `inventory.rs`. Kept separate from the write orchestration so a render panic +/// `payload.rs` (the `DomainPayload` enum) and `inventory.rs`. Kept separate +/// from the write orchestration so a render panic /// — an unmapped bare-domain name in [`capability_label`], or a missing/failing /// `rustfmt` in [`format_rs`] — aborts BEFORE [`generate_bindings`] deletes any /// committed source. @@ -293,6 +413,7 @@ fn render_bindings(dir: &Path) -> Vec<(PathBuf, String)> { ) }) .collect(); + rendered.push((dir.join("payload.rs"), render_payload_rs())); rendered.push((dir.join("inventory.rs"), render_inventory_rs())); rendered } @@ -480,9 +601,10 @@ mod tests { let tmp = crate::writer::test_support::tempdir(); let written = generate_bindings(tmp.path()).unwrap(); let dir = tmp.path().join("crates/eql-bindings/src/v3"); - assert_eq!(written.len(), eql_domains::scalar_families().count() + 1); + assert_eq!(written.len(), eql_domains::scalar_families().count() + 2); assert!(dir.join("integer.rs").is_file()); assert!(dir.join("text.rs").is_file()); + assert!(dir.join("payload.rs").is_file()); assert!(dir.join("inventory.rs").is_file()); assert!( !dir.join("mod.rs").exists(), @@ -503,7 +625,7 @@ mod tests { // source, so a render panic aborts before deletion. Lock in the // load-bearing property: render writes NOTHING to disk. A pre-existing // file in the target dir survives the render call untouched, and render - // returns one entry per family plus inventory (last). + // returns one entry per family plus payload and inventory (last). let tmp = crate::writer::test_support::tempdir(); let dir = tmp.path().join(V3_BINDINGS_DIR); std::fs::create_dir_all(&dir).unwrap(); @@ -512,7 +634,7 @@ mod tests { let rendered = render_bindings(&dir); - assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 1); + assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 2); assert_eq!( std::fs::read_to_string(&sentinel).unwrap(), "SENTINEL", @@ -527,6 +649,76 @@ mod tests { } } + /// Declared variant idents of `enum_name` in generated source, in order. + fn variant_idents(src: &str, enum_name: &str) -> Vec { + let file = syn::parse_file(src).expect("generated source parses"); + for item in &file.items { + if let syn::Item::Enum(e) = item { + if e.ident == enum_name { + return e.variants.iter().map(|v| v.ident.to_string()).collect(); + } + } + } + panic!("enum {enum_name} not found in generated source"); + } + + #[test] + fn payload_enum_spans_every_stored_domain_in_catalog_order() { + let out = render_payload_rs(); + assert!(out.starts_with(crate::consts::RUST_GENERATED_MARKER)); + + // One variant per catalog (family, domain) pair that is a stored + // payload: every scalar domain plus the SteVec document. The SteVec + // entry/query shapes are inventory members but not stored payloads. + let expected: Vec = CATALOG + .iter() + .flat_map(|f| { + f.domains + .iter() + .filter(|d| d.is_scalar() || d.full_name(f.name) == "json") + .map(|d| d.rust_struct_name(f.name)) + }) + .collect(); + assert_eq!(variant_idents(&out, "DomainPayload"), expected); + assert!(out.contains("SteVecDocument(super::jsonb::SteVecDocument)")); + assert!(!expected.contains(&"SteVecEntry".to_string())); + assert!(!expected.contains(&"SteVecQuery".to_string())); + + // parse: one arm per stored domain, keyed on the unqualified name, + // falling through to None for everything else. + assert!(out.contains( + "pub fn parse(\n domain: &str,\n value: &serde_json::Value,\n ) -> Option>" + )); + assert!(out.contains(r#""integer_eq" =>"#)); + assert!(out.contains("IntegerEq::deserialize(value).map(Self::IntegerEq)")); + assert!(out.contains(r#""json" =>"#)); + assert!(out.contains("SteVecDocument::deserialize(value).map(Self::SteVecDocument)")); + assert!(out.contains("_ => None,")); + assert!(out.contains("pub fn as_domain_type(&self) -> &dyn DomainType")); + assert!(out.contains("pub fn sql_domain(&self) -> &'static str")); + assert!(out.contains("pub fn domain(&self) -> &'static str")); + } + + #[test] + fn payload_enum_is_untagged_serialize_only_with_no_export_derives() { + // The wire form must be exactly the inner struct's, and DomainPayload + // is a Rust-side ergonomics type: no Deserialize (inference from + // bytes is unsound — cross-token payloads are byte-identical), and no + // ts-rs/schemars derives (it must not churn the exported TS/JSON + // surface). + let out = render_payload_rs(); + assert!(out.contains("#[derive(Clone, Debug, PartialEq, Serialize)]")); + assert!(out.contains("#[serde(untagged)]")); + assert!( + !out.contains("#[derive(Clone, Debug, PartialEq, Serialize, Deserialize"), + "DomainPayload must not derive Deserialize" + ); + assert!(!out.contains("ts_rs"), "no ts-rs on DomainPayload"); + assert!(!out.contains("#[ts("), "no ts-rs export attributes"); + assert!(!out.contains("JsonSchema"), "no schemars on DomainPayload"); + assert!(!out.contains("schema_for!"), "no schema emission"); + } + #[test] fn inventory_enumerates_all_in_catalog_order() { let out = render_inventory_rs(); @@ -640,8 +832,8 @@ mod tests { !rendered.iter().any(|(p, _)| p.ends_with("jsonb.rs")), "jsonb.rs is hand-written; the generator must not emit it" ); - // One file per scalar family + inventory. - assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 1); + // One file per scalar family + payload + inventory. + assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 2); } #[test] diff --git a/crates/eql-codegen/tests/cli.rs b/crates/eql-codegen/tests/cli.rs index 038ad5b77..fb2d4f326 100644 --- a/crates/eql-codegen/tests/cli.rs +++ b/crates/eql-codegen/tests/cli.rs @@ -34,7 +34,7 @@ fn tempdir() -> TempDir { /// `EQL_CODEGEN_OUT_ROOT` tree so the smoke test proves the subcommand honours /// the output-root override (test isolation) and never touches the committed /// `crates/eql-bindings/src/v3/*.rs`. The count is one file per catalog family -/// plus `inventory.rs`. +/// plus `payload.rs` and `inventory.rs`. #[test] fn bindings_subcommand_succeeds_and_reports_count() { let out_root = tempdir(); @@ -49,7 +49,7 @@ fn bindings_subcommand_succeeds_and_reports_count() { String::from_utf8_lossy(&out.stderr) ); let stdout = String::from_utf8_lossy(&out.stdout); - let expected = eql_domains::scalar_families().count() + 1; + let expected = eql_domains::scalar_families().count() + 2; assert!( stdout.contains(&format!("bindings: ok ({expected} files)")), "expected 'bindings: ok ({expected} files)' in stdout, got:\n{stdout}" From 6141670a67738b3bb72278eca4eb75fa4c3ff3f9 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 21:15:08 +1000 Subject: [PATCH 484/599] docs(changelog): add the DomainPayload + from_v2_typed entry (#349) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a808b0f10..eec17aedd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added +- **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349)) - **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed. - **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) - **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.jsonb_entry` (a single sv element) and `eql_v3.jsonb_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267)) From cd81aedc0a701247d95cf7811f5f6d3bd1a899db Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 21:33:20 +1000 Subject: [PATCH 485/599] chore(bindings): bump eql-bindings to 0.3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DomainPayload + from_v2_typed are additive API — minor bump per semver. Crate CHANGELOG gains the 0.3.0 section (manual-release model while the release-plz workflow waits on the eql_v3 -> main merge). --- Cargo.lock | 2 +- crates/eql-bindings/CHANGELOG.md | 15 +++++++++++++++ crates/eql-bindings/Cargo.toml | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f0a28ac9e..0d59fc31c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "eql-bindings" -version = "0.2.0" +version = "0.3.0" dependencies = [ "eql-domains", "schemars", diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index 78cc32ac6..ce0230d8f 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - 2026-07-03 + +### Added + +- `DomainPayload` — a catalog-generated enum spanning every stored-payload + domain type (all scalar binding structs plus `SteVecDocument`), emitted by + eql-codegen so it cannot drift when the catalog grows a domain. + Serialize-only (`#[serde(untagged)]` — the wire form is exactly the inner + struct's) and constructed only from a known `TargetDomain`, never inferred + from bytes (cross-token payloads are byte-identical on the wire). +- `from_v2_typed(&Value, TargetDomain) -> Result` + — the typed counterpart to `from_v2`, sharing its conversion core and + performing the single strict parse as parse-and-keep instead of + validate-and-discard. `from_v2 -> Value` is unchanged. + ## [0.2.0] - 2026-07-03 ### Changed diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index 8e90c6a7b..a48388882 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "eql-bindings" -version = "0.2.0" +version = "0.3.0" edition = "2021" description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." # crates.io metadata. `license` is REQUIRED by crates.io — publish fails without From 69eef7b0895092a8e12cb061fa3dc332fc6d8eea Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 22:12:40 +1000 Subject: [PATCH 486/599] =?UTF-8?q?feat(bindings):=20typed=20query=20paylo?= =?UTF-8?q?ads=20=E2=80=94=20QueryPayload=20+=20from=5Fv2=5Fquery=5Ftyped?= =?UTF-8?q?=20(0.4.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Continues CIP-3372: queries get the same typed-conversion surface storage payloads got in #349 (DomainPayload + from_v2_typed). A query value is a single term value — today that means exactly one convertible shape, the jsonb containment needle, so `QueryPayload` ships with one variant: `SteVec(SteVecQuery)`. The future single-term scalar variants (an Ore / Ope / Bloom / Hm term value) are documented but deliberately absent: no v3 scalar-query wire shape exists yet, and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing one ahead of the eql-mapper redesign. Hand-written (src/v3/query_payload.rs), not codegen-emitted — justified: DomainPayload is generated because its variant set IS the catalog (one variant per stored-payload domain; a catalog change must reshape the enum). QueryPayload's variants are term-shaped, not catalog-per-domain: the term set is anchored to the stable hand-written Term-level surface (terms.rs mirrors eql-domains' Term::ctor()) and to the equally hand-written SteVec jsonb.rs that defines the only current inner type — there is no catalog row a generator could walk to produce a variant, so generation would add drift surface, not remove it. The module doc carries the same rationale. Like DomainPayload: Serialize-only `#[serde(untagged)]` (the wire form is exactly the inner type's — `serde_json::to_value(&from_v2_query_typed(..))` equals `from_v2_query(..)` byte-for-byte, pinned in tests/query_payload.rs), no Deserialize (constructible only from a known domain via `QueryPayload::parse`, never inferred from bytes), no ts-rs/schemars (no TS/JSON-Schema churn; types:check clean). Double-parse avoided by the same entry-point split as from_v2 / from_v2_typed: the shared `convert_query` core builds the needle without the final strict parse, then `from_v2_query` validates-and-discards (validate_as) while `from_v2_query_typed` parses-and-keeps (QueryPayload::parse). `convert_ste_vec_query` no longer validates internally. Public `from_v2_query -> Value` behaviour is unchanged. eql-bindings 0.4.0 (additive, minor bump): Cargo.toml, Cargo.lock, crate CHANGELOG 0.4.0 section, root CHANGELOG Unreleased entry (PR number filled after the PR opens). --- CHANGELOG.md | 1 + Cargo.lock | 2 +- crates/eql-bindings/CHANGELOG.md | 21 ++ crates/eql-bindings/Cargo.toml | 2 +- crates/eql-bindings/src/from_v2/mod.rs | 66 ++++++- crates/eql-bindings/src/v3/mod.rs | 6 +- crates/eql-bindings/src/v3/query_payload.rs | 94 +++++++++ crates/eql-bindings/tests/query_payload.rs | 207 ++++++++++++++++++++ 8 files changed, 391 insertions(+), 8 deletions(-) create mode 100644 crates/eql-bindings/src/v3/query_payload.rs create mode 100644 crates/eql-bindings/tests/query_payload.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index eec17aedd..9203927cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added +- **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#TBD](https://github.com/cipherstash/encrypt-query-language/pull/TBD)) - **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349)) - **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed. - **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) diff --git a/Cargo.lock b/Cargo.lock index 0d59fc31c..f6b189f6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "eql-bindings" -version = "0.3.0" +version = "0.4.0" dependencies = [ "eql-domains", "schemars", diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index ce0230d8f..44e5924a7 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.4.0] - 2026-07-03 + +### Added + +- `QueryPayload` — a hand-written enum spanning every v3 QUERY payload shape. + Today that is exactly one variant: `SteVec(SteVecQuery)`, the jsonb + containment needle. The single-term scalar query variants (an Ore / Ope / + Bloom / Hm term value) are deliberately absent until the eql-mapper + redesign defines a v3 scalar-query wire shape — fail-closed, no invented + shapes. Serialize-only (`#[serde(untagged)]` — the wire form is exactly the + inner type's) and constructed only from a known domain + (`QueryPayload::parse`), never inferred from bytes. No ts-rs/schemars + derives: the enum adds no wire shape of its own, so the exported TS / + JSON-Schema artifacts are unchanged. +- `from_v2_query_typed(&Value, TargetDomain) -> Result` — the typed counterpart to `from_v2_query`, sharing its + conversion core and performing the single strict parse as parse-and-keep + instead of validate-and-discard. `from_v2_query -> Value` is unchanged, and + scalar targets still fail with `UnsupportedQueryTarget` on both entry + points. + ## [0.3.0] - 2026-07-03 ### Added diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index a48388882..13f302173 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "eql-bindings" -version = "0.3.0" +version = "0.4.0" edition = "2021" description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." # crates.io metadata. `license` is REQUIRED by crates.io — publish fails without diff --git a/crates/eql-bindings/src/from_v2/mod.rs b/crates/eql-bindings/src/from_v2/mod.rs index fe47b6f75..e327a0e94 100644 --- a/crates/eql-bindings/src/from_v2/mod.rs +++ b/crates/eql-bindings/src/from_v2/mod.rs @@ -70,6 +70,13 @@ //! payload omits), and this crate will not invent one ahead of the mapper //! redesign. //! +//! Query conversion has the same entry-point split as the stored-payload +//! side: [`from_v2_query`] validates the converted needle and returns the +//! wire `Value`; [`from_v2_query_typed`] KEEPS the strict parse, returning +//! the matching [`crate::v3::QueryPayload`] variant (whose untagged +//! serialization is byte-identical to the `Value` [`from_v2_query`] returns). +//! One shared conversion path, one strict parse either way. +//! //! ## Decryption root: `sv[0]` //! //! The record ciphertext of a SteVec document — the `c` downstream decrypt @@ -90,7 +97,7 @@ pub use target::{ScalarTarget, TargetDomain}; use serde::de::Error as _; use serde_json::{json, Map, Value}; -use crate::v3::{all, DomainPayload}; +use crate::v3::{all, DomainPayload, QueryPayload}; /// The v2 wire version this converter accepts. const V2_WIRE_VERSION: u64 = 2; @@ -168,7 +175,56 @@ fn convert(v2: &Value, target: TargetDomain) -> Result { /// Scalar targets return [`FromV2Error::UnsupportedQueryTarget`]: v2 scalar /// query payloads omit `c`, no v3 scalar domain admits a `c`-less payload, /// and this crate will not invent a wire shape ahead of the mapper redesign. +/// +/// Wire-oriented callers keep the `Value`; callers that want the needle +/// typed use [`from_v2_query_typed`] instead (same conversion, same +/// failures, one strict parse either way). pub fn from_v2_query(v2: &Value, target: TargetDomain) -> Result { + let out = convert_query(v2, target)?; + validate_as(QUERY_DOMAIN, &out)?; + Ok(out) +} + +/// Convert an EQL v2.3 QUERY payload into the TYPED v3 query payload for +/// `target`: [`from_v2_query`] returning the [`QueryPayload`] variant instead +/// of a shape-erased `Value`. +/// +/// Same conversion rules and same failures as [`from_v2_query`] — one shared +/// conversion path ([`convert_query`]), and the final strict parse through +/// the query binding struct happens exactly once (here it is KEPT as the enum +/// variant; in [`from_v2_query`] it is a validate-and-discard check). Because +/// [`QueryPayload`]'s serialization is untagged, +/// `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals +/// `from_v2_query(v2, t)?` exactly (pinned by `tests/query_payload.rs`). +/// +/// Scalar targets fail with [`FromV2Error::UnsupportedQueryTarget`] exactly +/// like [`from_v2_query`]: [`QueryPayload`]'s future single-term scalar +/// variants are deliberately absent until the mapper redesign defines a v3 +/// scalar-query wire shape (see the enum docs). +pub fn from_v2_query_typed(v2: &Value, target: TargetDomain) -> Result { + let out = convert_query(v2, target)?; + QueryPayload::parse(QUERY_DOMAIN, &out) + .unwrap_or_else(|| { + // QUERY_DOMAIN is the literal "jsonb_query", which QueryPayload + // resolves to its SteVec variant. + unreachable!("query domain {QUERY_DOMAIN} must have a QueryPayload variant") + }) + .map_err(FromV2Error::Invalid) +} + +/// The (unqualified) SQL domain of every convertible query payload. A single +/// constant is honest today: [`convert_query`] only converts the jsonb +/// containment needle, so both entry points validate/parse as `jsonb_query`. +/// When the mapper redesign ships scalar query shapes, the domain becomes a +/// function of the target and this constant dissolves. +const QUERY_DOMAIN: &str = "jsonb_query"; + +/// The shared conversion path behind [`from_v2_query`] / +/// [`from_v2_query_typed`]: dispatch on the target and build the v3 query +/// payload `Value`. Does NOT run the final strict parse — each public entry +/// point does that exactly once (validate-and-discard in [`from_v2_query`], +/// parse-and-keep in [`from_v2_query_typed`]). +fn convert_query(v2: &Value, target: TargetDomain) -> Result { let scalar = match target { TargetDomain::Json => return convert_ste_vec_query(v2), TargetDomain::Scalar(t) => t, @@ -314,7 +370,9 @@ fn convert_ste_vec(obj: &Map) -> Result { Ok(Value::Object(out)) } -/// v2 query needle `{sv: [{s, hm|oc, …}]}` → v3 `SteVecQuery` shape. +/// v2 query needle `{sv: [{s, hm|oc, …}]}` → v3 `SteVecQuery` shape. Like the +/// stored-payload converters, does NOT run the final strict parse — that is +/// the entry points' job, exactly once. fn convert_ste_vec_query(v2: &Value) -> Result { let obj = v2 .as_object() @@ -344,9 +402,7 @@ fn convert_ste_vec_query(v2: &Value) -> Result { .enumerate() .map(|(idx, entry)| convert_entry(idx, entry, EntryShape::Query)) .collect::, _>>()?; - let out = json!({ "sv": entries }); - validate_as("jsonb_query", &out)?; - Ok(out) + Ok(json!({ "sv": entries })) } /// Which keys an sv entry keeps after conversion. diff --git a/crates/eql-bindings/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs index 4fbacc20f..ec288a9ec 100644 --- a/crates/eql-bindings/src/v3/mod.rs +++ b/crates/eql-bindings/src/v3/mod.rs @@ -77,7 +77,9 @@ //! is constructible solely from a KNOWN domain name //! ([`payload::DomainPayload::parse`], [`crate::from_v2::from_v2_typed`]) — //! there is still no `Deserialize`, because inference from bytes remains -//! unsound. +//! unsound. The hand-written [`QueryPayload`] enum (`query_payload.rs`) +//! follows the same Serialize-only rule for QUERY payloads — see its module +//! doc for why it is hand-written rather than generated. //! //! The SteVec `jsonb` family is the ONE principled exception: a single encrypted //! document legitimately mixes `hm` leaves (bool / root) and `oc` leaves @@ -141,6 +143,7 @@ pub mod inventory; pub mod jsonb; pub mod numeric; pub mod payload; +pub mod query_payload; pub mod real; pub mod smallint; pub mod terms; @@ -150,3 +153,4 @@ pub mod timestamp; pub use domain_type::{DomainType, SCHEMA_ID_BASE, SQL_SCHEMA}; pub use inventory::all; pub use payload::DomainPayload; +pub use query_payload::QueryPayload; diff --git a/crates/eql-bindings/src/v3/query_payload.rs b/crates/eql-bindings/src/v3/query_payload.rs new file mode 100644 index 000000000..6145baece --- /dev/null +++ b/crates/eql-bindings/src/v3/query_payload.rs @@ -0,0 +1,94 @@ +//! The `QueryPayload` enum — every v3 QUERY payload shape in one Rust type — +//! HAND-WRITTEN, unlike the generated [`DomainPayload`](super::DomainPayload). +//! +//! ## Why hand-written and not codegen-emitted +//! +//! `DomainPayload` is generated because its variant set IS the catalog: one +//! variant per stored-payload domain, so a catalog change must reshape the +//! enum. Query payloads are **term-shaped, not catalog-per-domain**: a scalar +//! query value is a single index term (one Ore / Ope / Bloom / Hm value, not +//! a per-domain envelope), and the term set lives in the hand-written +//! `Term`-level code (`terms.rs`, mirroring `Term::ctor()` in `eql-domains`) +//! rather than in the catalog rows the generator walks. With the variant set +//! anchored to that stable hand-written surface — and exactly one variant +//! constructible today — a generator would add drift surface, not remove it. +//! This module lives next to the equally hand-written `jsonb.rs` that defines +//! its inner type. +//! +//! ## Why there is only one variant today +//! +//! See [`QueryPayload`]: the scalar-term variants are deliberately absent +//! until the eql-mapper redesign defines a v3 scalar-query wire shape. + +use serde::Serialize; + +use super::domain_type::DomainType; +use super::jsonb::SteVecQuery; + +/// Every v3 query payload shape in one type. Today that is exactly one: +/// the SteVec containment needle ([`SteVecQuery`], `eql_v3.jsonb_query`). +/// +/// Serialization is exactly the inner type's (`#[serde(untagged)]` adds no +/// tagging), so typing a query payload never changes the wire. Deliberately +/// NO `Deserialize` — a variant is only constructible from a KNOWN domain +/// ([`QueryPayload::parse`] or [`crate::from_v2::from_v2_query_typed`]), +/// never inferred from bytes — and no ts-rs/schemars: the enum adds no wire +/// shape of its own, so it must not churn the exported TS/JSON-Schema +/// artifacts. +/// +/// ## Future scalar-term variants (deliberately absent) +/// +/// A scalar query value is a SINGLE index term — one `Ore` ([`super::terms::OreBlock256`]), +/// `Ope` ([`super::terms::OpeCllw`]), `Bloom` ([`super::terms::BloomFilter`]), +/// or `Hm` ([`super::terms::Hmac256`]) term value — not a stored envelope +/// (every scalar domain CHECK requires the ciphertext `c` a query payload +/// omits). No v3 scalar-query wire shape exists yet, and this crate will not +/// invent one ahead of the eql-mapper redesign: the converter fails closed +/// ([`crate::from_v2::FromV2Error::UnsupportedQueryTarget`]) instead. When +/// the mapper redesign defines the shape, this enum grows the matching +/// single-term variants and [`crate::from_v2::from_v2_query_typed`] starts +/// producing them. +#[derive(Clone, Debug, PartialEq, Serialize)] +#[serde(untagged)] +pub enum QueryPayload { + /// The `eql_v3.jsonb_query` containment needle (`{sv: [{s, hm|oc}]}`). + SteVec(SteVecQuery), +} + +impl QueryPayload { + /// Strictly parse `value` as `domain`'s QUERY payload, KEEPING the parsed + /// value — the query-side counterpart of + /// [`DomainPayload::parse`](super::DomainPayload::parse). `domain` is the + /// unqualified name (`"jsonb_query"`). `None` when `domain` is not a + /// query-payload domain (stored-payload domains and the sv entry shape + /// included); `Some(Err)` when the strict parse fails + /// ([`SteVecQuery`] is `deny_unknown_fields` at the root). + pub fn parse( + domain: &str, + value: &serde_json::Value, + ) -> Option> { + use serde::Deserialize as _; + match domain { + "jsonb_query" => Some(SteVecQuery::deserialize(value).map(Self::SteVec)), + _ => None, + } + } + + /// The inner payload as a [`DomainType`] trait object. + pub fn as_domain_type(&self) -> &dyn DomainType { + match self { + Self::SteVec(payload) => payload, + } + } + + /// Fully-qualified SQL domain name, e.g. `"eql_v3.jsonb_query"`. + pub fn sql_domain(&self) -> &'static str { + self.as_domain_type().sql_domain() + } + + /// Unqualified SQL domain name, e.g. `"jsonb_query"` — the name + /// [`QueryPayload::parse`] accepts. + pub fn domain(&self) -> &'static str { + self.as_domain_type().domain() + } +} diff --git a/crates/eql-bindings/tests/query_payload.rs b/crates/eql-bindings/tests/query_payload.rs new file mode 100644 index 000000000..220da5769 --- /dev/null +++ b/crates/eql-bindings/tests/query_payload.rs @@ -0,0 +1,207 @@ +//! Tests for the hand-written [`QueryPayload`] enum and the typed query +//! conversion path [`from_v2_query_typed`]. +//! +//! The load-bearing contract mirrors `tests/domain_payload.rs`: the +//! byte-identical serialization pin — `serde_json::to_value(&from_v2_query_typed(..))` +//! must equal the `Value` the wire-oriented `from_v2_query` returns (the enum +//! is `#[serde(untagged)]`, so typing a query payload can never change the +//! wire) — plus failure parity: both entry points reject the same inputs with +//! the same errors, including [`FromV2Error::UnsupportedQueryTarget`] for +//! EVERY scalar target (no v3 scalar-query wire shape exists yet). + +use eql_bindings::from_v2::{from_v2_query, from_v2_query_typed, FromV2Error, TargetDomain}; +use eql_bindings::v3::{DomainType, QueryPayload}; +use serde_json::{json, Value}; + +const CIPHERTEXT: &str = "mBbL@V^%dN?0W$;g)1-JP*cmqX%JhW0ZKZ^G?lNn$CfXJH"; +const HEX: &str = "8067db44a848ab32c3056a3dbe4edf16"; +const HEX_LONG: &str = "fbc7a11fc81f2a321553bc06a91f240bb7d8f3a9c6aec445a5ba6793"; +const SELECTOR: &str = "9493d6010fe7845d52149b697729c745"; + +fn ident() -> Value { + json!({ "t": "users", "c": "email" }) +} + +fn target(name: &str) -> TargetDomain { + TargetDomain::parse(name).unwrap_or_else(|e| panic!("target {name} must parse: {e}")) +} + +/// The serialization pin for one query conversion: the typed payload must +/// serialize to exactly the `Value` the untyped `from_v2_query` returns — as +/// a `Value` and as a canonical JSON string (mirrors +/// `tests/domain_payload.rs::assert_serialization_pin`). +fn assert_serialization_pin(v2: &Value) -> QueryPayload { + let typed = from_v2_query_typed(v2, TargetDomain::Json).expect("typed conversion succeeds"); + let untyped = from_v2_query(v2, TargetDomain::Json).expect("untyped conversion succeeds"); + + let typed_value = serde_json::to_value(&typed).expect("typed payload serializes"); + assert_eq!( + typed_value, untyped, + "to_value must match from_v2_query exactly" + ); + + assert_eq!( + serde_json::to_string(&typed_value).unwrap(), + serde_json::to_string(&untyped).unwrap(), + "canonical string form must be byte-identical" + ); + let direct: Value = + serde_json::from_str(&serde_json::to_string(&typed).unwrap()).expect("direct form parses"); + assert_eq!(direct, untyped, "direct string form must round-trip equal"); + + typed +} + +// --------------------------------------------------------------------------- +// from_v2_query_typed — happy path (the jsonb containment needle) +// --------------------------------------------------------------------------- + +#[test] +fn typed_needle_yields_the_ste_vec_variant() { + // The v2.3 SteVecQueryPayload is `{sv:[{s, hm|oc}]}` — no envelope. + let v2 = json!({ + "sv": [ + { "s": SELECTOR, "hm": HEX }, + { "s": SELECTOR, "oc": HEX_LONG } + ] + }); + let typed = assert_serialization_pin(&v2); + assert_eq!(typed.domain(), "jsonb_query"); + assert_eq!(typed.sql_domain(), "eql_v3.jsonb_query"); + match &typed { + QueryPayload::SteVec(q) => { + assert_eq!(q.sv.len(), 2, "entry order/count preserved"); + assert_eq!(q.sql_domain(), "eql_v3.jsonb_query"); + } + } +} + +#[test] +fn typed_needle_normalizes_exactly_like_from_v2_query() { + // A stored-document payload used as a needle: the envelope is dropped and + // entries normalize to `s` + one term (`a`/`c` stripped) — pinned equal + // to from_v2_query byte-for-byte. + let v2 = json!({ + "v": 2, + "k": "sv", + "i": ident(), + "sv": [ { "s": SELECTOR, "a": true, "c": CIPHERTEXT, "hm": HEX } ] + }); + let typed = assert_serialization_pin(&v2); + assert_eq!( + serde_json::to_value(&typed).unwrap(), + json!({ "sv": [ { "s": SELECTOR, "hm": HEX } ] }) + ); +} + +// --------------------------------------------------------------------------- +// from_v2_query_typed — failure parity with from_v2_query +// --------------------------------------------------------------------------- + +#[test] +fn every_scalar_target_is_unsupported_on_both_entry_points() { + // No v3 scalar-query wire shape exists (every scalar domain CHECK + // requires the ciphertext `c` a query payload omits); QueryPayload fails + // closed rather than inventing one ahead of the mapper redesign — + // exhaustively, for every scalar domain in the catalog, on BOTH entry + // points. + let query = json!({ "v": 2, "k": "ct", "i": ident(), "hm": HEX }); + for family in eql_domains::scalar_families() { + for domain in family.domains { + let name = family.domain_name(domain); + let t = target(&name); + match from_v2_query_typed(&query, t).unwrap_err() { + FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, name), + other => panic!("expected UnsupportedQueryTarget for {name}, got {other:?}"), + } + match from_v2_query(&query, t).unwrap_err() { + FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, name), + other => panic!("expected UnsupportedQueryTarget for {name}, got {other:?}"), + } + } + } +} + +#[test] +fn typed_entry_term_errors_match_from_v2_query() { + let both = json!({ "sv": [ { "s": SELECTOR, "hm": HEX, "oc": HEX_LONG } ] }); + assert!(matches!( + from_v2_query_typed(&both, TargetDomain::Json).unwrap_err(), + FromV2Error::AmbiguousTerm { entry: 0 } + )); + let neither = json!({ "sv": [ { "s": SELECTOR, "hm": HEX }, { "s": SELECTOR } ] }); + match from_v2_query_typed(&neither, TargetDomain::Json).unwrap_err() { + FromV2Error::MissingTerm { domain, key, entry } => { + assert_eq!(domain, "jsonb_query"); + assert_eq!(key, "hm|oc"); + assert_eq!(entry, Some(1)); + } + other => panic!("expected MissingTerm, got {other:?}"), + } +} + +#[test] +fn typed_rejects_the_same_envelopes_as_from_v2_query() { + // A versioned input must be v2, and a kind-discriminated one must be sv — + // shared conversion path, so both entry points agree. + let v3 = json!({ "v": 3, "sv": [ { "s": SELECTOR, "hm": HEX } ] }); + for err in [ + from_v2_query_typed(&v3, TargetDomain::Json).unwrap_err(), + from_v2_query(&v3, TargetDomain::Json).unwrap_err(), + ] { + assert!(matches!( + err, + FromV2Error::UnsupportedVersion { found: Some(3) } + )); + } + let ct = json!({ "k": "ct", "sv": [ { "s": SELECTOR, "hm": HEX } ] }); + for err in [ + from_v2_query_typed(&ct, TargetDomain::Json).unwrap_err(), + from_v2_query(&ct, TargetDomain::Json).unwrap_err(), + ] { + assert!(matches!(err, FromV2Error::KindMismatch { .. })); + } +} + +// --------------------------------------------------------------------------- +// QueryPayload::parse — construct-from-known-domain +// --------------------------------------------------------------------------- + +#[test] +fn parse_constructs_the_needle_from_its_domain_name() { + let needle = json!({ "sv": [ { "s": SELECTOR, "hm": HEX } ] }); + let parsed = QueryPayload::parse("jsonb_query", &needle) + .expect("jsonb_query must be a QueryPayload domain") + .expect("strict parse must succeed"); + assert_eq!(parsed.domain(), "jsonb_query"); + assert_eq!(serde_json::to_value(&parsed).unwrap(), needle); +} + +#[test] +fn parse_is_strict_exactly_like_the_binding_struct() { + // SteVecQuery is `deny_unknown_fields` at the root — a stray root key + // fails, exactly as the untyped path's validate_as does. + let stray = json!({ "sv": [ { "s": SELECTOR, "hm": HEX } ], "extra": 1 }); + assert!( + QueryPayload::parse("jsonb_query", &stray).unwrap().is_err(), + "deny_unknown_fields must reject a stray root key" + ); +} + +#[test] +fn parse_returns_none_for_non_query_domains() { + // Stored-payload domains (DomainPayload territory), the entry shape, and + // unknown names are not query payloads. + for name in [ + "json", + "jsonb_entry", + "integer_eq", + "eql_v3.jsonb_query", + "", + ] { + assert!( + QueryPayload::parse(name, &json!({})).is_none(), + "{name:?} must not resolve to a QueryPayload variant" + ); + } +} From 384f195da12b4eae50986ace8309df2c454a61a5 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 22:13:37 +1000 Subject: [PATCH 487/599] docs(changelog): fill the PR number (#350) in the Unreleased entry --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9203927cc..b439aa6e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added -- **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#TBD](https://github.com/cipherstash/encrypt-query-language/pull/TBD)) +- **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350)) - **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349)) - **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed. - **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307)) From 19207a27cc42fa13674099dc7edacf1bab534334 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 22:15:12 +1000 Subject: [PATCH 488/599] docs: link only public items from the from_v2_query_typed rustdoc (private_intra_doc_links) --- crates/eql-bindings/src/from_v2/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/eql-bindings/src/from_v2/mod.rs b/crates/eql-bindings/src/from_v2/mod.rs index e327a0e94..9623efb0a 100644 --- a/crates/eql-bindings/src/from_v2/mod.rs +++ b/crates/eql-bindings/src/from_v2/mod.rs @@ -190,7 +190,7 @@ pub fn from_v2_query(v2: &Value, target: TargetDomain) -> Result Date: Fri, 3 Jul 2026 22:54:03 +1000 Subject: [PATCH 489/599] =?UTF-8?q?docs(fixtures):=20sweep=20FIXTURE=5FSCH?= =?UTF-8?q?EMA.md=20for=20the=20int4=E2=86=92integer=20rename=20and=20v3?= =?UTF-8?q?=20envelope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fixture schema doc still described the pre-rename surface: the v3_doc_int4 document fixture (now v3_doc_integer), eql_v3_int4 in the schema and opt-in examples (now eql_v3_integer), and a v2 payload envelope (k = "ct", v = 2) — generated fixtures are converted to the v3 envelope via eql_bindings::from_v2 (v = 3, no k on scalars). --- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index 3c25383da..d6c87f235 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -19,13 +19,13 @@ Generated eql_v3 fixtures (gitignored) ├── eql_v3__doubles.sql (jsonb payload — duplicate-value variant the │ property suites consume) ├── v3_numeric_collision.sql (jsonb payload — no EQL dependency) - ├── v3_doc_int4.sql (eql_v3.json payload — depends on eql_v3 surface) + ├── v3_doc_integer.sql (eql_v3.json payload — depends on eql_v3 surface) └── v3_ste_vec.sql (eql_v3.json payload — depends on eql_v3 surface) ``` The scalar fixtures (`eql_v3_.sql`) have **no EQL dependency** — `payload` is plain `jsonb`, so each script applies standalone. The document fixtures -(`v3_doc_int4.sql`, `v3_ste_vec.sql`) depend on the `eql_v3` encrypted-JSONB +(`v3_doc_integer.sql`, `v3_ste_vec.sql`) depend on the `eql_v3` encrypted-JSONB surface being installed. **Regenerated every test run.** `mise run test:sqlx` invokes the generator @@ -37,11 +37,11 @@ environment (they are not alternatives): `CS_CLIENT_ACCESS_KEY` + `CS_CLIENT_KEY` for the client key (EnvKeyProvider). Do not hand-edit a generated file; it is overwritten in place on every run. -**Schema (e.g. `eql_v3_int4`):** Tables live in the dedicated `fixtures` SQL +**Schema (e.g. `eql_v3_integer`):** Tables live in the dedicated `fixtures` SQL schema (kept out of the `public`/`eql_v3` type namespaces): ```sql CREATE SCHEMA IF NOT EXISTS fixtures; -CREATE TABLE fixtures.eql_v3_int4 ( +CREATE TABLE fixtures.eql_v3_integer ( id BIGINT PRIMARY KEY, plaintext integer NOT NULL, payload jsonb NOT NULL @@ -54,10 +54,10 @@ CREATE TABLE fixtures.eql_v3_int4 ( pivots) plus small/medium/large magnitudes. - `plaintext` is the **in-table oracle**: consuming tests filter `WHERE plaintext = N` directly, so no Rust value constant is shared. -- Each `payload` is a cipherstash-client-encrypted JSONB object carrying - `c` (ciphertext), `hm` (HMAC equality term), `ob` (ORE block ordering term), - an inert `i` metadata object, and the EQL payload discriminator - (`k = "ct"`, `v = 2`). +- Each `payload` is a cipherstash-client-encrypted JSONB object converted to + the v3 envelope via `eql_bindings::from_v2`, carrying `c` (ciphertext), + `hm` (HMAC equality term), `ob` (ORE block ordering term), an inert `i` + metadata object, and `v = 3` (v3 scalars carry no `k` discriminator). **Used By:** - the `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` @@ -67,7 +67,7 @@ CREATE TABLE fixtures.eql_v3_int4 ( **Opt-in:** Each consuming test opts in explicitly: ```rust -#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_int4")))] +#[sqlx::test(fixtures(path = "../fixtures", scripts("eql_v3_integer")))] ``` --- From c6964f51067f509a79e79eb06b85e39310e7f670 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 22:56:00 +1000 Subject: [PATCH 490/599] chore(bindings): bump eql-bindings to 0.4.1 0.4.1 ships the changes since the 0.4.0 release: the private_intra_doc_links rustdoc fix on from_v2_query_typed. No API changes, so a patch bump. Release remains manual (CIP-3346) until eql_v3 merges to main. --- Cargo.lock | 2 +- crates/eql-bindings/CHANGELOG.md | 7 +++++++ crates/eql-bindings/Cargo.toml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f6b189f6b..ac0af2820 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "eql-bindings" -version = "0.4.0" +version = "0.4.1" dependencies = [ "eql-domains", "schemars", diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index 44e5924a7..1a9380aeb 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.4.1] - 2026-07-03 + +### Fixed + +- The `from_v2_query_typed` rustdoc links only public items, fixing the + `private_intra_doc_links` lint on docs.rs builds. No API changes. + ## [0.4.0] - 2026-07-03 ### Added diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index 13f302173..bd197a09e 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "eql-bindings" -version = "0.4.0" +version = "0.4.1" edition = "2021" description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." # crates.io metadata. `license` is REQUIRED by crates.io — publish fails without From d7c40474b26af48af03c3449fbd6d75342ae8bad Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 23:05:06 +1000 Subject: [PATCH 491/599] fix(bindings): silence the ts-rs skip_serializing_if parse warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable ts-rs's no-serde-warnings feature. ts-rs 10's serde-compat vocabulary doesn't include skip_serializing_if, so every build (ours and downstream consumers') warned that the attribute on SteVecEntry.a would be ignored — which is the intended behaviour: TS optionality is declared explicitly via #[ts(optional = nullable)]. Ignored-attr drift that did matter would be caught by the types:check gate; the emitted TS/JSON is byte-identical (gate passes). --- crates/eql-bindings/CHANGELOG.md | 5 +++++ crates/eql-bindings/Cargo.toml | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index 1a9380aeb..0e0c3ea12 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -11,6 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The `from_v2_query_typed` rustdoc links only public items, fixing the `private_intra_doc_links` lint on docs.rs builds. No API changes. +- Compiling the crate no longer emits ts-rs's "failed to parse serde + attribute" warning for `skip_serializing_if` on `SteVecEntry.a` (the + `no-serde-warnings` feature is enabled). The attribute was always ignored + by design — TS optionality is declared explicitly with + `#[ts(optional = nullable)]` — and the emitted TS/JSON is byte-identical. ## [0.4.0] - 2026-07-03 diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index bd197a09e..8e064e23b 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -17,7 +17,12 @@ serde = { version = "1", features = ["derive"] } # Direct dependency again at this layer: SchemaVersion's manual JsonSchema # impl pins `const: 2` via serde_json::json!. serde_json = "1" -ts-rs = "10" +# no-serde-warnings: ts-rs's serde-compat vocabulary doesn't include +# `skip_serializing_if`, so it warns and ignores it on SteVecEntry.a — which is +# exactly what we want (TS optionality is declared explicitly via +# `#[ts(optional = nullable)]`). Ignored-attr drift that DID matter would be +# caught by the `types:check` gate on the committed TS/JSON output. +ts-rs = { version = "10", features = ["no-serde-warnings"] } schemars = "1" [dev-dependencies] From 9ff784df0bc9a656d4829ae612570cdffb0a9b44 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Fri, 3 Jul 2026 23:08:27 +1000 Subject: [PATCH 492/599] chore(bindings): bump eql-bindings to 0.4.2 0.4.1 already shipped to crates.io, so the ts-rs no-serde-warnings fix (d7c40474) moves out of its changelog section into a new 0.4.2. Release remains manual (CIP-3346) until eql_v3 merges to main. --- Cargo.lock | 2 +- crates/eql-bindings/CHANGELOG.md | 11 ++++++++--- crates/eql-bindings/Cargo.toml | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac0af2820..56585f52c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "eql-bindings" -version = "0.4.1" +version = "0.4.2" dependencies = [ "eql-domains", "schemars", diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index 0e0c3ea12..b088fbec9 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -5,18 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.4.1] - 2026-07-03 +## [0.4.2] - 2026-07-03 ### Fixed -- The `from_v2_query_typed` rustdoc links only public items, fixing the - `private_intra_doc_links` lint on docs.rs builds. No API changes. - Compiling the crate no longer emits ts-rs's "failed to parse serde attribute" warning for `skip_serializing_if` on `SteVecEntry.a` (the `no-serde-warnings` feature is enabled). The attribute was always ignored by design — TS optionality is declared explicitly with `#[ts(optional = nullable)]` — and the emitted TS/JSON is byte-identical. +## [0.4.1] - 2026-07-03 + +### Fixed + +- The `from_v2_query_typed` rustdoc links only public items, fixing the + `private_intra_doc_links` lint on docs.rs builds. No API changes. + ## [0.4.0] - 2026-07-03 ### Added diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index 8e064e23b..a80c47618 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "eql-bindings" -version = "0.4.1" +version = "0.4.2" edition = "2021" description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." # crates.io metadata. `license` is REQUIRED by crates.io — publish fails without From 07f05b39bdccd34e7f2aaf703921dde56b521ae4 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Sat, 4 Jul 2026 00:58:47 +1000 Subject: [PATCH 493/599] chore(sqlx): bump cipherstash-client to 0.38.1 (CIP-3348) 0.38.1 is the first client release that emits the scalar CLLW-OPE term: EncryptedPayload.ope_cllw serializes as `op` (a single hex string) for ope-indexed columns, which is exactly what the repo's CIP-3348 tripwires watch for. cts-common / stack-auth / stack-profile / cipherstash-config / zerokms-protocol move in lockstep via the lockfile. --- Cargo.lock | 29 +++++++++++++++-------------- tests/sqlx/Cargo.toml | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 56585f52c..f3ecf0a1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -584,9 +584,9 @@ dependencies = [ [[package]] name = "cipherstash-client" -version = "0.35.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0257cff25a25a706af6e190e5209865aae4ddf0b36f81febee7de014b22bcc40" +checksum = "7f97f8cfcd346e687a89016bcdac771609142356bde883ea8b317bb3acb3e397" dependencies = [ "aes-gcm-siv", "anyhow", @@ -594,6 +594,7 @@ dependencies = [ "async-trait", "base16ct", "base64", + "base64ct", "base85", "blake3", "chrono", @@ -644,9 +645,9 @@ dependencies = [ [[package]] name = "cipherstash-config" -version = "0.35.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d376d237e368e77de53b07bb7309812f45809299063c80b6cc3132f7d8494aed" +checksum = "27afe834fb74c0e52290655a5ee9a40dd85c450ea6158d9c7e152a7e61183d91" dependencies = [ "bitflags", "serde", @@ -656,9 +657,9 @@ dependencies = [ [[package]] name = "cipherstash-core" -version = "0.35.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca84ffd8a7b2f0c8c6b04eba600738fea115f5a4ed825035a2f13aa1524085a7" +checksum = "0b6cc90478252039aeb9527e8b178684cff7a59271facafb8a411d474d660740" dependencies = [ "getrandom 0.2.16", "hmac", @@ -904,9 +905,9 @@ dependencies = [ [[package]] name = "cts-common" -version = "0.35.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6508011dee61bc36e16615e43cb26a8014c49ebb832e713602f3b0dc15af29" +checksum = "4648220c1c584228c9b655f401c2f743469b29436d9a6f3d542be47ef8e45167" dependencies = [ "arrayvec", "base32", @@ -3928,9 +3929,9 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stack-auth" -version = "0.35.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c823cc3d88e15478d51694ef56037400bd4ae3e1a9e046071e01d251168cc466" +checksum = "756fc8b999d012b560a633849cb48aa30f8f4a1ecc0b6f25c4cea6acc7c88885" dependencies = [ "aquamarine", "base64", @@ -3956,9 +3957,9 @@ dependencies = [ [[package]] name = "stack-profile" -version = "0.35.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd1be30119d59260f3e932f78fbbfbe3674c151d39e7fcca24d0439e7e31ba8" +checksum = "1d83d7e0e1e7b6c8dd50200d6564bcc65df8a285ca28f52010c3fd6dbd402845" dependencies = [ "dirs", "gethostname", @@ -5541,9 +5542,9 @@ dependencies = [ [[package]] name = "zerokms-protocol" -version = "0.12.15" +version = "0.12.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04a9411f442b247e7d00c6a07cfbc6d56c12d485cfaf4f7effa001bfb1615296" +checksum = "3fc0b6b5e5f6c63d676bb1e1d27bee21b178b71526727e08c3e393dcd3cd3e0a" dependencies = [ "base64", "cipherstash-config", diff --git a/tests/sqlx/Cargo.toml b/tests/sqlx/Cargo.toml index c190c8bff..288078945 100644 --- a/tests/sqlx/Cargo.toml +++ b/tests/sqlx/Cargo.toml @@ -14,7 +14,7 @@ serde_json = "1" anyhow = "1" hex = "0.4" jsonschema = { version = "0.46.4", default-features = false } -cipherstash-client = { version = "0.35", features = ["tokio"] } +cipherstash-client = { version = "0.38.1", features = ["tokio"] } # chrono is already in the tree transitively (cipherstash-client / ore-rs); pin # it as a direct dependency so the harness can name `chrono::NaiveDate` for the # `date` scalar (Encode/Decode/Type come from the sqlx `chrono` feature above). From 9fb71e9099369e968782f281da48532e8429dd29 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Sat, 4 Jul 2026 00:59:03 +1000 Subject: [PATCH 494/599] test(sqlx): route the CLLW-OPE op term through the fixture pipeline (CIP-3348) - IndexKind gains Ope (-> cipherstash-config IndexType::Ope); every ordered scalar fixture (int/temporal/numeric/float: [Unique, Ore, Ope]; text: [Unique, Ore, Match, Ope]) and the per-type doubles fixtures now encrypt with the ope index, so generated payloads carry the client-emitted op term. - v3_convert drops the Term::Ope skip and maps Ope -> op, so _ord_ope domains are coverable conversion targets like any other; op passes through from_v2 verbatim as a single hex string (NOT an array like ob), still failing closed with MissingTerm when the term is absent. - Tripwires flipped as designed: the matrix fixture-shape arm now asserts op is PRESENT (string-typed, one distinct value per distinct plaintext) on exactly the scalars whose catalog family declares an Ope domain (token_has_ope_term, catalog-derived) and ABSENT otherwise (storage-only included); live_tests::assert_store_shape pins the same both ways against the index set that produced the payload, plus new live tests for op emission and CLLW-OPE determinism across independent encryptions. - Expanded macro snapshots regenerated (mise run test:matrix:expand); FIXTURE_SCHEMA.md / eql-domains catalog docs / CHANGELOG refreshed (the text_search [hm, ob, bf] shape is now a standing design decision to revisit separately, no longer blocked on client op emission). --- CHANGELOG.md | 2 +- crates/eql-domains/src/lib.rs | 19 +- tests/sqlx/fixtures/FIXTURE_SCHEMA.md | 6 +- tests/sqlx/snapshots/boolean_expanded.rs | 103 +++-- tests/sqlx/snapshots/integer_expanded.rs | 375 +++++++++------- tests/sqlx/snapshots/text_expanded.rs | 523 ++++++++++++---------- tests/sqlx/src/fixtures/cipherstash.rs | 114 ++++- tests/sqlx/src/fixtures/eql_doubles.rs | 9 +- tests/sqlx/src/fixtures/index_kind.rs | 8 + tests/sqlx/src/fixtures/scalar_fixture.rs | 35 +- tests/sqlx/src/fixtures/v3_convert.rs | 76 +++- tests/sqlx/src/matrix.rs | 58 ++- tests/sqlx/src/scalar_domains.rs | 15 + 13 files changed, 820 insertions(+), 523 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b439aa6e2..33731a0f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,7 +53,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **`eql_v3.boolean` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `boolean` columns — `eql_v3.boolean` — generated from the `boolean` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `boolean` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295)) - **`eql_v3.real` / `eql_v3.double` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.real` / `eql_v3.double` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `real` / `double` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `real` vs `double` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `bigint`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299)) - **`eql_v3` encrypted-JSONB (SteVec) payload bindings — Rust, TypeScript, and JSON Schema.** JSONB is now a first-class member of `eql-domains::CATALOG`, so its payload types ship as canonical, drift-gated bindings alongside the scalar families: `SteVecDocument` (`eql_v3.json`), `SteVecEntry` (`eql_v3.jsonb_entry`), `SteVecQuery` (`eql_v3.jsonb_query`), plus the shared untagged `SteVecTerm` (`{hm} | {oc}`), `SteVecQueryEntry`, and the `OreCllw` / `Selector` term newtypes — under `crates/eql-bindings/src/v3/jsonb.rs`, `bindings/v3/*.ts`, and `schema/v3/*.json`, drift-gated by `types:check`. A new `Shape` discriminant on each catalog domain lets scalar-only consumers filter and all-family consumers branch; the SteVec struct bodies and the encrypted-JSONB SQL surface stay hand-written (the generator skips SteVec shapes but still drives the bindings inventory). The bindings are parsed against a real generated SteVec ciphertext row in the SQLx suite, tying them to real crypto and the SQL domain CHECK. Why: the SteVec wire types were the only `eql_v3` payloads without generated, drift-gated bindings — protocol consumers (`cipherstash-client`, `protect-ffi`, CipherStash Proxy) can now depend on canonical, catalog-checked encrypted-JSONB types. ([#336](https://github.com/cipherstash/encrypt-query-language/pull/336)) -- **`eql_v3._ord_ope` encrypted-domain variants — CLLW-OPE ordering across every ordered scalar family.** Every ordered scalar family (`int2`, `int4`, `int8`, `date`, `timestamp`, `numeric`, `text`, `float4`, `float8`) gains an `_ord_ope` domain backed by a new CLLW-OPE index term: the `op` payload key carries a hex-encoded OPE ciphertext that is order-preserving under plain byte comparison, so ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) reduces to hex-decode + native bytea comparison via the new self-contained SEM type `eql_v3_internal.ope_cllw` — no custom N-block comparison protocol, unlike the `_ord` / `_ord_ore` block-ORE domains. Integer-family `_ord_ope` domains carry `[op]` alone (OPE equality is lossless for them); `text_ord_ope` carries `[hm, op]` so `=` / `<>` stay exact via HMAC (OPE over text is not equality-lossless, matching `text_ord`). Index via a functional btree index on the new `eql_v3.ord_ope_term(col)` extractor (its `eql_v3_internal.ope_cllw` return type is a domain over `bytea`, inheriting the native comparison operators and DEFAULT btree opclass — the whole comparison chain stays inlinable, so the index engages structurally), not an operator class on the domain. This revives the v2.2-era `opf` / `opv` order-preserving terms under the modern single `op` wire key that cipherstash-client re-emits for ordered scalars (CIP-3280). Rust / TypeScript / JSON Schema payload bindings (`Int4OrdOpe`, `TextOrdOpe`, … with the `OpeCllw` term newtype) ship alongside, drift-gated by `types:check`. `bool` stays storage-only, and the combined `text_search` domain deliberately stays `[hm, ob, bf]` — adding `op` to its CHECK would break every `_search` fixture while the pinned client emits no OPE term (CIP-3280), for no new operator capability; revisit under CIP-3348. Why: OPE terms are natively index-sortable, giving ordered encrypted columns a cheaper comparison path than the block-ORE protocol. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340)) +- **`eql_v3._ord_ope` encrypted-domain variants — CLLW-OPE ordering across every ordered scalar family.** Every ordered scalar family (`int2`, `int4`, `int8`, `date`, `timestamp`, `numeric`, `text`, `float4`, `float8`) gains an `_ord_ope` domain backed by a new CLLW-OPE index term: the `op` payload key carries a hex-encoded OPE ciphertext that is order-preserving under plain byte comparison, so ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) reduces to hex-decode + native bytea comparison via the new self-contained SEM type `eql_v3_internal.ope_cllw` — no custom N-block comparison protocol, unlike the `_ord` / `_ord_ore` block-ORE domains. Integer-family `_ord_ope` domains carry `[op]` alone (OPE equality is lossless for them); `text_ord_ope` carries `[hm, op]` so `=` / `<>` stay exact via HMAC (OPE over text is not equality-lossless, matching `text_ord`). Index via a functional btree index on the new `eql_v3.ord_ope_term(col)` extractor (its `eql_v3_internal.ope_cllw` return type is a domain over `bytea`, inheriting the native comparison operators and DEFAULT btree opclass — the whole comparison chain stays inlinable, so the index engages structurally), not an operator class on the domain. This revives the v2.2-era `opf` / `opv` order-preserving terms under the modern single `op` wire key that cipherstash-client re-emits for ordered scalars (CIP-3280). Rust / TypeScript / JSON Schema payload bindings (`Int4OrdOpe`, `TextOrdOpe`, … with the `OpeCllw` term newtype) ship alongside, drift-gated by `types:check`. `bool` stays storage-only, and the combined `text_search` domain deliberately stays `[hm, ob, bf]` — adding `op` to its CHECK would widen it for no new operator capability (OPE's operators are already covered via `Ore`); with the pinned client now emitting `op` (0.38.1, CIP-3348) this is a standing design decision to revisit separately. Why: OPE terms are natively index-sortable, giving ordered encrypted columns a cheaper comparison path than the block-ORE protocol. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340)) - **`eql_v3.lints()` gains a `schema_placement` category.** `SELECT * FROM eql_v3.lints() WHERE category = 'schema_placement'` reports, at severity `error`, any naked composite or enum TYPE that has been created in the public `eql_v3` schema — an internal index-term type (e.g. `ore_block_256_term`) that belongs in `eql_v3_internal`. Why: the `eql_v3` / `eql_v3_internal` split exists to keep index-term-only types out of the Supabase Table Builder type picker; this lint makes a placement regression self-detecting at runtime (the CI-side net is the placement invariant in `tests/sqlx/tests/v3_public_surface_tests.rs`). A clean install reports zero `schema_placement` rows. diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index acb54156b..4d708ecc9 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -53,9 +53,11 @@ pub const ENVELOPE_KEYS: &[&str] = &["v", "i", "c"]; /// protocol). `Ope`'s `=`/`<>` claim on the integer families rests on OPE /// being deterministic — an order-preserving encryption maps equal /// plaintexts to equal ciphertexts (a randomized term would make `op`-routed -/// equality silently return false negatives); re-verify against real -/// ciphertexts once cipherstash-client emits `op` and the fixture pipeline -/// covers the `_ord_ope` domains. The `json_key`/`extractor`/`ctor` values +/// equality silently return false negatives). Verified against real +/// ciphertexts (CIP-3348, cipherstash-client 0.38.1+): the fixture pipeline +/// covers the `_ord_ope` domains and `property::cross_ciphertext` pins +/// byte-identical `op` terms across independent encryptions of one +/// plaintext. The `json_key`/`extractor`/`ctor` values /// are the cross-schema SQL contract — changing one is a generated-SQL /// behaviour change, not a refactor. (The per-term accessors and /// `*_for_terms` helpers are impl'd in `term`.) @@ -299,11 +301,12 @@ pub const NUMERIC: DomainFamily = DomainFamily { /// **`_search` deliberately excludes `Ope`.** The combined domain stays /// `[Hm, Ore, Bloom]`: its operator surface would not grow (OPE's six /// operators are already covered via `Ore`, and range extraction would still -/// route through `ord_term` — first-ordering-term-wins), while its CHECK would -/// start requiring an `op` key the pinned client does not emit (CIP-3280), -/// breaking every `_search` fixture for no new capability. Revisit when a -/// client release ships `op` emission (CIP-3348) — a search-shaped column that -/// wants OPE ordering today uses a separate `_ord_ope` column instead. +/// route through `ord_term` — first-ordering-term-wins), so adding `Ope` +/// would only widen its CHECK to require an `op` key for no new capability. +/// The client now ships `op` emission (0.38.1, CIP-3348); keeping `_search` +/// at `[Hm, Ore, Bloom]` is a deliberate design decision to revisit +/// separately — a search-shaped column that wants OPE ordering today uses a +/// separate `_ord_ope` column instead. const TEXT_DOMAINS: &[Domain] = &[ Domain { name: "", diff --git a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md index d6c87f235..c109af2ed 100644 --- a/tests/sqlx/fixtures/FIXTURE_SCHEMA.md +++ b/tests/sqlx/fixtures/FIXTURE_SCHEMA.md @@ -56,8 +56,10 @@ CREATE TABLE fixtures.eql_v3_integer ( `WHERE plaintext = N` directly, so no Rust value constant is shared. - Each `payload` is a cipherstash-client-encrypted JSONB object converted to the v3 envelope via `eql_bindings::from_v2`, carrying `c` (ciphertext), - `hm` (HMAC equality term), `ob` (ORE block ordering term), an inert `i` - metadata object, and `v = 3` (v3 scalars carry no `k` discriminator). + `hm` (HMAC equality term), `ob` (ORE block ordering term), `op` (CLLW-OPE + ordering term — a single hex string, not an array; every ordered family, + CIP-3348), `bf` (bloom filter — `text` only), an inert `i` metadata object, + and `v = 3` (v3 scalars carry no `k` discriminator). **Used By:** - the `__scalar_matrix_fixture_shape!` arm in `tests/sqlx/src/matrix.rs` diff --git a/tests/sqlx/snapshots/boolean_expanded.rs b/tests/sqlx/snapshots/boolean_expanded.rs index a9ec817fe..9512190a8 100644 --- a/tests/sqlx/snapshots/boolean_expanded.rs +++ b/tests/sqlx/snapshots/boolean_expanded.rs @@ -1893,9 +1893,9 @@ pub mod boolean { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -2022,9 +2022,9 @@ pub mod boolean { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -2132,9 +2132,9 @@ pub mod boolean { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -2272,9 +2272,9 @@ pub mod boolean { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -2440,9 +2440,9 @@ pub mod boolean { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -2710,7 +2710,7 @@ pub mod boolean { error }); } - for term in ["hm", "ob", "bf"] { + for term in ["hm", "ob", "bf", "op"] { let present: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -2766,6 +2766,16 @@ pub mod boolean { "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", )); } + let has_ope = ::eql_tests::scalar_domains::token_has_ope_term( + ::PG_TYPE, + ); + if has_ope { + term_checks + .push(( + "op string", + "payload->'op' IS NULL OR jsonb_typeof(payload->'op') <> 'string'", + )); + } for (label, predicate) in term_checks { let missing: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -2817,6 +2827,55 @@ pub mod boolean { error }); } + if has_ope { + let distinct_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT payload->>\'op\') FROM {0}", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(distinct_op == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0} distinct values -> {0} distinct op terms; got {1}", + n, + distinct_op, + ), + ); + error + }); + } + } else { + let with_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(with_op == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "fixture payload carries an `op` term but the catalog family declares no Ope domain — conversion targets drifted (CIP-3348)", + ), + ); + error + }); + } + } } let mismatched_version: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -2860,28 +2919,6 @@ pub mod boolean { error }); } - let with_op: i64 = sqlx::query_scalar( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", - table, - ), - ) - }), - ) - .fetch_one(&pool) - .await?; - if ::anyhow::__private::not(with_op == 0) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!( - "fixture payload carries an `op` term — the client now emits CLLW-OPE; pick up CIP-3348 (real-ciphertext ord_ope coverage)", - ), - ); - error - }); - } if !expected.is_empty() { let probe = &expected[expected.len() / 2]; let probe_lit = ::to_sql_literal(probe); diff --git a/tests/sqlx/snapshots/integer_expanded.rs b/tests/sqlx/snapshots/integer_expanded.rs index 12ef2679b..b5bc1579a 100644 --- a/tests/sqlx/snapshots/integer_expanded.rs +++ b/tests/sqlx/snapshots/integer_expanded.rs @@ -19461,9 +19461,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19641,9 +19641,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -19821,9 +19821,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -20121,9 +20121,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -20729,7 +20729,7 @@ pub mod integer { error }); } - for term in ["hm", "ob", "bf"] { + for term in ["hm", "ob", "bf", "op"] { let present: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -20785,6 +20785,16 @@ pub mod integer { "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", )); } + let has_ope = ::eql_tests::scalar_domains::token_has_ope_term( + ::PG_TYPE, + ); + if has_ope { + term_checks + .push(( + "op string", + "payload->'op' IS NULL OR jsonb_typeof(payload->'op') <> 'string'", + )); + } for (label, predicate) in term_checks { let missing: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -20836,6 +20846,55 @@ pub mod integer { error }); } + if has_ope { + let distinct_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT payload->>\'op\') FROM {0}", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(distinct_op == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0} distinct values -> {0} distinct op terms; got {1}", + n, + distinct_op, + ), + ); + error + }); + } + } else { + let with_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(with_op == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "fixture payload carries an `op` term but the catalog family declares no Ope domain — conversion targets drifted (CIP-3348)", + ), + ); + error + }); + } + } } let mismatched_version: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -20879,28 +20938,6 @@ pub mod integer { error }); } - let with_op: i64 = sqlx::query_scalar( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", - table, - ), - ) - }), - ) - .fetch_one(&pool) - .await?; - if ::anyhow::__private::not(with_op == 0) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!( - "fixture payload carries an `op` term — the client now emits CLLW-OPE; pick up CIP-3348 (real-ciphertext ord_ope coverage)", - ), - ); - error - }); - } if !expected.is_empty() { let probe = &expected[expected.len() / 2]; let probe_lit = ::to_sql_literal(probe); @@ -20994,9 +21031,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2044usize, + start_line: 2066usize, start_col: 22usize, - end_line: 2044usize, + end_line: 2066usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -21255,9 +21292,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2044usize, + start_line: 2066usize, start_col: 22usize, - end_line: 2044usize, + end_line: 2066usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -21516,9 +21553,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2357usize, + start_line: 2379usize, start_col: 22usize, - end_line: 2357usize, + end_line: 2379usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -21618,9 +21655,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -21800,9 +21837,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -21912,9 +21949,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22011,9 +22048,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22199,9 +22236,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -22381,9 +22418,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -22493,9 +22530,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -22592,9 +22629,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -22780,9 +22817,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -22962,9 +22999,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -23074,9 +23111,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23173,9 +23210,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -23363,9 +23400,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -23545,9 +23582,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -23657,9 +23694,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -23756,9 +23793,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -23946,9 +23983,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -24199,9 +24236,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -24452,9 +24489,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -24705,9 +24742,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -24958,9 +24995,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3107usize, + start_line: 3129usize, start_col: 22usize, - end_line: 3107usize, + end_line: 3129usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -25067,9 +25104,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3107usize, + start_line: 3129usize, start_col: 22usize, - end_line: 3107usize, + end_line: 3129usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -25176,9 +25213,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25344,9 +25381,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25512,9 +25549,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25680,9 +25717,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -25848,9 +25885,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -26016,9 +26053,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -26184,9 +26221,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -26352,9 +26389,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -26520,9 +26557,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -26649,9 +26686,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -26759,9 +26796,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -26899,9 +26936,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -27028,9 +27065,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -27138,9 +27175,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -27276,9 +27313,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -27405,9 +27442,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -27515,9 +27552,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -27653,9 +27690,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -27782,9 +27819,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -27892,9 +27929,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -28032,9 +28069,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28175,9 +28212,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28318,9 +28355,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28461,9 +28498,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28604,9 +28641,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28747,9 +28784,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -28890,9 +28927,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29033,9 +29070,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29178,9 +29215,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29357,9 +29394,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29536,9 +29573,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29715,9 +29752,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -29894,9 +29931,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -30075,9 +30112,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -30254,9 +30291,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -30435,9 +30472,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -30616,9 +30653,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30720,9 +30757,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30824,9 +30861,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -30928,9 +30965,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -31032,9 +31069,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -31138,9 +31175,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -31244,9 +31281,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -31350,9 +31387,9 @@ pub mod integer { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, diff --git a/tests/sqlx/snapshots/text_expanded.rs b/tests/sqlx/snapshots/text_expanded.rs index 54a8eb036..83ae901d0 100644 --- a/tests/sqlx/snapshots/text_expanded.rs +++ b/tests/sqlx/snapshots/text_expanded.rs @@ -25696,9 +25696,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -25876,9 +25876,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26056,9 +26056,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26326,9 +26326,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26506,9 +26506,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26776,9 +26776,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -26956,9 +26956,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -27226,9 +27226,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2420usize, + start_line: 2442usize, start_col: 22usize, - end_line: 2420usize, + end_line: 2442usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -27712,7 +27712,7 @@ pub mod text { error }); } - for term in ["hm", "ob", "bf"] { + for term in ["hm", "ob", "bf", "op"] { let present: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ ::alloc::fmt::format( @@ -27768,6 +27768,16 @@ pub mod text { "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'", )); } + let has_ope = ::eql_tests::scalar_domains::token_has_ope_term( + ::PG_TYPE, + ); + if has_ope { + term_checks + .push(( + "op string", + "payload->'op' IS NULL OR jsonb_typeof(payload->'op') <> 'string'", + )); + } for (label, predicate) in term_checks { let missing: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -27819,6 +27829,55 @@ pub mod text { error }); } + if has_ope { + let distinct_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(DISTINCT payload->>\'op\') FROM {0}", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(distinct_op == n) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "{0} distinct values -> {0} distinct op terms; got {1}", + n, + distinct_op, + ), + ); + error + }); + } + } else { + let with_op: i64 = sqlx::query_scalar( + &::alloc::__export::must_use({ + ::alloc::fmt::format( + format_args!( + "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", + table, + ), + ) + }), + ) + .fetch_one(&pool) + .await?; + if ::anyhow::__private::not(with_op == 0) { + return ::anyhow::__private::Err({ + let error = ::anyhow::__private::format_err( + format_args!( + "fixture payload carries an `op` term but the catalog family declares no Ope domain — conversion targets drifted (CIP-3348)", + ), + ); + error + }); + } + } } let mismatched_version: i64 = sqlx::query_scalar( &::alloc::__export::must_use({ @@ -27862,28 +27921,6 @@ pub mod text { error }); } - let with_op: i64 = sqlx::query_scalar( - &::alloc::__export::must_use({ - ::alloc::fmt::format( - format_args!( - "SELECT COUNT(*) FROM {0} WHERE payload ? \'op\'", - table, - ), - ) - }), - ) - .fetch_one(&pool) - .await?; - if ::anyhow::__private::not(with_op == 0) { - return ::anyhow::__private::Err({ - let error = ::anyhow::__private::format_err( - format_args!( - "fixture payload carries an `op` term — the client now emits CLLW-OPE; pick up CIP-3348 (real-ciphertext ord_ope coverage)", - ), - ); - error - }); - } if !expected.is_empty() { let probe = &expected[expected.len() / 2]; let probe_lit = ::to_sql_literal(probe); @@ -27977,9 +28014,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2044usize, + start_line: 2066usize, start_col: 22usize, - end_line: 2044usize, + end_line: 2066usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28238,9 +28275,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2044usize, + start_line: 2066usize, start_col: 22usize, - end_line: 2044usize, + end_line: 2066usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28499,9 +28536,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2044usize, + start_line: 2066usize, start_col: 22usize, - end_line: 2044usize, + end_line: 2066usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28760,9 +28797,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2218usize, + start_line: 2240usize, start_col: 22usize, - end_line: 2218usize, + end_line: 2240usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -28866,9 +28903,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2234usize, + start_line: 2256usize, start_col: 22usize, - end_line: 2234usize, + end_line: 2256usize, end_col: 75usize, compile_fail: false, no_run: false, @@ -28977,9 +29014,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2253usize, + start_line: 2275usize, start_col: 22usize, - end_line: 2253usize, + end_line: 2275usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -29088,9 +29125,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2279usize, + start_line: 2301usize, start_col: 22usize, - end_line: 2279usize, + end_line: 2301usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -29240,9 +29277,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2357usize, + start_line: 2379usize, start_col: 22usize, - end_line: 2357usize, + end_line: 2379usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -29340,9 +29377,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -29522,9 +29559,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -29634,9 +29671,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -29733,9 +29770,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -29919,9 +29956,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -30101,9 +30138,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -30213,9 +30250,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -30312,9 +30349,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -30500,9 +30537,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -30682,9 +30719,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -30794,9 +30831,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -30893,9 +30930,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -31081,9 +31118,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -31263,9 +31300,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -31375,9 +31412,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -31474,9 +31511,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -31662,9 +31699,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -31844,9 +31881,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -31956,9 +31993,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -32055,9 +32092,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -32243,9 +32280,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2900usize, + start_line: 2922usize, start_col: 22usize, - end_line: 2900usize, + end_line: 2922usize, end_col: 73usize, compile_fail: false, no_run: false, @@ -32425,9 +32462,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2960usize, + start_line: 2982usize, start_col: 22usize, - end_line: 2960usize, + end_line: 2982usize, end_col: 80usize, compile_fail: false, no_run: false, @@ -32537,9 +32574,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2985usize, + start_line: 3007usize, start_col: 22usize, - end_line: 2985usize, + end_line: 3007usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -32636,9 +32673,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3011usize, + start_line: 3033usize, start_col: 22usize, - end_line: 3011usize, + end_line: 3033usize, end_col: 85usize, compile_fail: false, no_run: false, @@ -32824,9 +32861,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33077,9 +33114,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33330,9 +33367,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33583,9 +33620,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -33836,9 +33873,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -34089,9 +34126,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3192usize, + start_line: 3214usize, start_col: 22usize, - end_line: 3192usize, + end_line: 3214usize, end_col: 82usize, compile_fail: false, no_run: false, @@ -34342,9 +34379,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3107usize, + start_line: 3129usize, start_col: 22usize, - end_line: 3107usize, + end_line: 3129usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -34451,9 +34488,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3107usize, + start_line: 3129usize, start_col: 22usize, - end_line: 3107usize, + end_line: 3129usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -34560,9 +34597,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3107usize, + start_line: 3129usize, start_col: 22usize, - end_line: 3107usize, + end_line: 3129usize, end_col: 77usize, compile_fail: false, no_run: false, @@ -34669,9 +34706,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -34837,9 +34874,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35005,9 +35042,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35173,9 +35210,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35341,9 +35378,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35509,9 +35546,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35677,9 +35714,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -35845,9 +35882,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -36013,9 +36050,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -36181,9 +36218,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3351usize, + start_line: 3373usize, start_col: 22usize, - end_line: 3351usize, + end_line: 3373usize, end_col: 83usize, compile_fail: false, no_run: false, @@ -36349,9 +36386,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -36478,9 +36515,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -36588,9 +36625,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -36726,9 +36763,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -36853,9 +36890,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -36963,9 +37000,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -37101,9 +37138,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -37228,9 +37265,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -37338,9 +37375,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -37476,9 +37513,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -37605,9 +37642,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -37715,9 +37752,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -37853,9 +37890,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3465usize, + start_line: 3487usize, start_col: 22usize, - end_line: 3465usize, + end_line: 3487usize, end_col: 72usize, compile_fail: false, no_run: false, @@ -37982,9 +38019,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3499usize, + start_line: 3521usize, start_col: 22usize, - end_line: 3499usize, + end_line: 3521usize, end_col: 69usize, compile_fail: false, no_run: false, @@ -38092,9 +38129,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 3543usize, + start_line: 3565usize, start_col: 22usize, - end_line: 3543usize, + end_line: 3565usize, end_col: 78usize, compile_fail: false, no_run: false, @@ -38230,9 +38267,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38375,9 +38412,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38520,9 +38557,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38665,9 +38702,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38810,9 +38847,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -38955,9 +38992,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39100,9 +39137,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39245,9 +39282,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39390,9 +39427,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39535,9 +39572,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39680,9 +39717,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39825,9 +39862,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2570usize, + start_line: 2592usize, start_col: 22usize, - end_line: 2570usize, + end_line: 2592usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -39970,9 +40007,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40149,9 +40186,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40328,9 +40365,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40507,9 +40544,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40686,9 +40723,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -40865,9 +40902,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41044,9 +41081,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41223,9 +41260,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41402,9 +41439,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41581,9 +41618,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41760,9 +41797,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -41939,9 +41976,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2684usize, + start_line: 2706usize, start_col: 22usize, - end_line: 2684usize, + end_line: 2706usize, end_col: 74usize, compile_fail: false, no_run: false, @@ -42118,9 +42155,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42222,9 +42259,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42326,9 +42363,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42430,9 +42467,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42534,9 +42571,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42638,9 +42675,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42742,9 +42779,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42846,9 +42883,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -42950,9 +42987,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -43054,9 +43091,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -43158,9 +43195,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, @@ -43262,9 +43299,9 @@ pub mod text { ignore: false, ignore_message: ::core::option::Option::None, source_file: "tests/sqlx/src/matrix.rs", - start_line: 2810usize, + start_line: 2832usize, start_col: 22usize, - end_line: 2810usize, + end_line: 2832usize, end_col: 87usize, compile_fail: false, no_run: false, diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index 0ad47a291..b9636f1e8 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -7,7 +7,8 @@ //! plaintexts through a Proxy-mediated Postgres connection. That whole loop //! existed only because the Proxy was the encryption oracle. //! -//! `cipherstash-client` 0.35 exposes the same surface natively. This module +//! `cipherstash-client` (0.38.1, the first release that emits the scalar +//! CLLW-OPE `op` term — CIP-3348) exposes the same surface natively. This module //! owns the bootstrap — `build_cipher()` builds a `ScopedCipher` — //! and the batched helper `encrypt_store()` that wraps `eql::encrypt_eql` and //! returns the resulting EQL payloads as `serde_json::Value`s ready to bind @@ -127,6 +128,7 @@ fn index_type_for(kind: IndexKind) -> IndexType { match kind { IndexKind::Unique => Index::new_unique().index_type, IndexKind::Ore => IndexType::Ore, + IndexKind::Ope => Index::new_ope().index_type, IndexKind::Match => Index::new_match().index_type, // No `Index::new_ste_vec()` constructor exists — SteVec is a struct // variant. `mode: SteVecMode::Standard` (the default) yields the @@ -274,6 +276,9 @@ mod tests { let ore = Index::new(index_type_for(IndexKind::Ore)); assert!(ore.is_ore(), "Ore must map to the ORE index"); + let ope = Index::new(index_type_for(IndexKind::Ope)); + assert!(ope.is_ope(), "Ope must map to the OPE (CLLW-OPE) index"); + let m = Index::new(index_type_for(IndexKind::Match)); assert!(m.is_match(), "Match must map to the match (bloom) index"); } @@ -337,17 +342,29 @@ mod live_tests { use super::*; use serde_json::Value; - /// The index set used by every live test — `Unique` drives the `hm` + /// The index set used by most live tests — `Unique` drives the `hm` /// term, `Ore` drives the `ob` term, so the returned payloads carry /// both. const INT_INDEXES: &[IndexKind] = &[IndexKind::Unique, IndexKind::Ore]; + /// The full ordered-integer index set including `Ope`, which drives the + /// scalar CLLW-OPE `op` term (cipherstash-client 0.38.1+, CIP-3348). + const INT_INDEXES_WITH_OPE: &[IndexKind] = + &[IndexKind::Unique, IndexKind::Ore, IndexKind::Ope]; + /// Assert the well-formed v3 Store shape: the payload is a JSON object /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields, `v = 3`, and no /// `k` discriminator (dropped by the from_v2 conversion). Mirrors the /// per-key assertions in the generated `scalars::integer` matrix suite /// (emitted from the `scalar_types!` list in `scalar_types.rs`). - fn assert_store_shape(payload: &Value) { + /// + /// The `op` (CLLW-OPE) key is pinned in BOTH directions against the + /// index set that produced the payload (CIP-3348): an `ope`-indexed + /// column MUST carry a hex-string `op` term, and a column without the + /// `ope` index MUST NOT — a stray `op` on a non-ope column means the + /// client started emitting the term unconditionally and the fixture + /// conversion targets need re-auditing. + fn assert_store_shape(payload: &Value, indexes: &[IndexKind]) { let obj = payload.as_object().expect("payload must be a JSON object"); for key in ["v", "c", "hm", "ob", "i"] { assert!( @@ -368,15 +385,27 @@ mod live_tests { !obj.contains_key("k"), "a converted scalar payload must not carry `k`; got {payload}" ); - // Tripwire (CIP-3348): the pinned client emits no `op` (CLLW-OPE) - // term, so ope coverage runs on hand-built hex. The first client - // release that emits `op` fails here loudly — add real-ciphertext - // ord_ope fixture coverage (CIP-3348) instead of relaxing this. - assert!( - !obj.contains_key("op"), - "payload carries an `op` term — the client now emits CLLW-OPE; \ - pick up CIP-3348 (real-ciphertext ord_ope coverage); got {payload}" - ); + if indexes.contains(&IndexKind::Ope) { + let op = obj.get("op").and_then(Value::as_str).unwrap_or_else(|| { + panic!( + "an ope-indexed payload must carry a string `op` (CLLW-OPE) \ + term (CIP-3348); got {payload}" + ) + }); + assert!( + !op.is_empty() + && op.len().is_multiple_of(2) + && op.bytes().all(|b| b.is_ascii_hexdigit()), + "`op` must be a non-empty even-length hex string; got {op:?}" + ); + } else { + assert!( + !obj.contains_key("op"), + "a payload without the ope index must NOT carry an `op` term — \ + the client emits CLLW-OPE only for ope-indexed columns \ + (CIP-3348); got {payload}" + ); + } } #[tokio::test] @@ -386,7 +415,64 @@ mod live_tests { .await .expect("encrypt_store should succeed against live ZeroKMS"); assert_eq!(out.len(), 1, "single input should produce single output"); - assert_store_shape(&out[0]); + assert_store_shape(&out[0], INT_INDEXES); + } + + #[tokio::test] + #[ignore = "live ZeroKMS — run via `cargo test --features fixture-gen -- --ignored`"] + async fn encrypt_store_with_ope_index_emits_the_op_term() { + // CIP-3348: cipherstash-client 0.38.1 emits the scalar CLLW-OPE + // term for `ope`-indexed columns; from_v2 routes it through to the + // `_ord_ope`-capable v3 payload as a single hex string (NOT an + // array like `ob`). + let out = encrypt_store("live_ope", "payload", &[-1_i32, 0, 42], INT_INDEXES_WITH_OPE) + .await + .expect("encrypt_store should succeed against live ZeroKMS"); + assert_eq!(out.len(), 3); + for payload in &out { + assert_store_shape(payload, INT_INDEXES_WITH_OPE); + } + } + + #[tokio::test] + #[ignore = "live ZeroKMS — run via `cargo test --features fixture-gen -- --ignored`"] + async fn encrypt_store_ope_term_is_deterministic_for_equal_plaintexts() { + // CLLW-OPE determinism is load-bearing (CIP-3348): the integer + // families route `=`/`<>` through `op`, so two independent + // encryptions of one plaintext MUST yield byte-identical `op` hex + // strings — a randomized term would make op-routed equality + // silently return false negatives. Two separate encrypt_store + // calls = two independent cipher bootstraps, so this pins + // determinism across encryption sessions, not just within a batch. + let first = encrypt_store("live_ope_det", "payload", &[42_i32], INT_INDEXES_WITH_OPE) + .await + .expect("first encryption should succeed against live ZeroKMS"); + let second = encrypt_store("live_ope_det", "payload", &[42_i32], INT_INDEXES_WITH_OPE) + .await + .expect("second encryption should succeed against live ZeroKMS"); + let op_of = |payloads: &[Value]| -> String { + payloads[0] + .get("op") + .and_then(Value::as_str) + .expect("ope-indexed payload must carry a string `op` term") + .to_string() + }; + let (a, b) = (op_of(&first), op_of(&second)); + assert_eq!( + a, b, + "CLLW-OPE must be deterministic: equal plaintexts must produce \ + byte-identical `op` terms (the integer families' `=`/`<>` route \ + through `op`); got {a:?} vs {b:?}" + ); + // And a control: a different plaintext must NOT collide. + let other = encrypt_store("live_ope_det", "payload", &[43_i32], INT_INDEXES_WITH_OPE) + .await + .expect("control encryption should succeed against live ZeroKMS"); + assert_ne!( + a, + op_of(&other), + "distinct plaintexts must yield distinct `op` terms" + ); } #[tokio::test] @@ -402,7 +488,7 @@ mod live_tests { "batch length must equal input length" ); for (i, payload) in out.iter().enumerate() { - assert_store_shape(payload); + assert_store_shape(payload, INT_INDEXES); // Each payload's `i.t` should match the table identifier we // supplied — that's the field consuming code uses to bind a // payload to its source column. diff --git a/tests/sqlx/src/fixtures/eql_doubles.rs b/tests/sqlx/src/fixtures/eql_doubles.rs index da227a785..632a24794 100644 --- a/tests/sqlx/src/fixtures/eql_doubles.rs +++ b/tests/sqlx/src/fixtures/eql_doubles.rs @@ -48,8 +48,10 @@ fn doubled(values: &[T]) -> Vec { /// each encrypted twice. Generic over the type: the fixture name, the plaintext /// source, and the bloom-index decision are all derived from `T` (and the /// catalog), so there are no per-token strings to keep in sync. Indexes mirror -/// the type's catalog fixture so the payload carries the same terms (`hm` + `ob`, -/// plus `bf` for `text`) and the doubles cast cleanly to every comparison domain. +/// the type's catalog fixture so the payload carries the same terms (`hm`, +/// `ob`, `op`, plus `bf` for `text`) and the doubles cast cleanly to every +/// comparison domain — including `_ord_ope`, whose CLLW-OPE determinism the +/// cross-ciphertext suite pins on these rows (CIP-3348). async fn generate_doubles_for() -> Result<()> where T: ScalarType + FixtureValue, @@ -63,7 +65,8 @@ where let sample = doubled(&head); let mut spec = super::spec::FixtureSpec::new(&name) .with_index(super::index_kind::IndexKind::Unique) - .with_index(super::index_kind::IndexKind::Ore); + .with_index(super::index_kind::IndexKind::Ore) + .with_index(super::index_kind::IndexKind::Ope); // text carries the Match (bloom) index too — derived from the catalog, not // hardcoded — so its doubles cast to `text_match` / `text_search` as well. if crate::scalar_domains::token_has_bloom_term(T::PG_TYPE) { diff --git a/tests/sqlx/src/fixtures/index_kind.rs b/tests/sqlx/src/fixtures/index_kind.rs index adb4fc40e..c30d04764 100644 --- a/tests/sqlx/src/fixtures/index_kind.rs +++ b/tests/sqlx/src/fixtures/index_kind.rs @@ -19,6 +19,11 @@ pub enum IndexKind { Unique, /// `ore` — drives `<` / `<=` / `>` / `>=` via ORE block terms. Ore, + /// `ope` — drives ordering (and, for the integer families, `=` / `<>`) + /// via the CLLW-OPE term (`op`): a single hex-encoded order-preserving + /// ciphertext, natively bytea-sortable after hex-decode. Emitted by + /// cipherstash-client 0.38.1+ (CIP-3348). + Ope, /// `match` — drives `LIKE` / `ILIKE` via the bloom filter. Match, /// `ste_vec` — drives the encrypted-JSONB (SteVec) document surface: @@ -32,6 +37,7 @@ impl IndexKind { match self { IndexKind::Unique => "unique", IndexKind::Ore => "ore", + IndexKind::Ope => "ope", IndexKind::Match => "match", IndexKind::SteVec => "ste_vec", } @@ -52,6 +58,7 @@ mod tests { fn renders_as_the_eql_wire_form_string() { assert_eq!(IndexKind::Unique.as_str(), "unique"); assert_eq!(IndexKind::Ore.as_str(), "ore"); + assert_eq!(IndexKind::Ope.as_str(), "ope"); assert_eq!(IndexKind::Match.as_str(), "match"); assert_eq!(IndexKind::SteVec.as_str(), "ste_vec"); } @@ -60,6 +67,7 @@ mod tests { fn display_matches_as_str() { assert_eq!(format!("{}", IndexKind::Unique), "unique"); assert_eq!(format!("{}", IndexKind::Ore), "ore"); + assert_eq!(format!("{}", IndexKind::Ope), "ope"); assert_eq!(format!("{}", IndexKind::Match), "match"); assert_eq!(format!("{}", IndexKind::SteVec), "ste_vec"); } diff --git a/tests/sqlx/src/fixtures/scalar_fixture.rs b/tests/sqlx/src/fixtures/scalar_fixture.rs index 35dcd9bfc..6f9578e66 100644 --- a/tests/sqlx/src/fixtures/scalar_fixture.rs +++ b/tests/sqlx/src/fixtures/scalar_fixture.rs @@ -24,14 +24,15 @@ /// /// - `int` — signed-extreme asserts (`<$ty>::MIN`/`MAX`, `contains(&0)`, /// `any(|v| v < 0)`). These typecheck only for integer plaintexts. Indexes -/// `Unique` + `Ore`. +/// `Unique` + `Ore` + `Ope`. /// - `temporal` — a pivot-presence assert (`min_pivot`/`max_pivot`/zero from the /// `ScalarType` impl all appear in the values). `<$ty>::MIN` / `< 0` don't /// exist for a `chrono::NaiveDate`, so the integer asserts can't be reused. -/// Indexes `Unique` + `Ore`. +/// Indexes `Unique` + `Ore` + `Ope`. /// - `text` — pivot-presence asserts (same as `temporal`; text has no signed -/// extremes), plus a third `Match` index so generated payloads carry `bf` for -/// the `text_match` containment surface. Indexes `Unique` + `Ore` + `Match`. +/// extremes), plus a `Match` index so generated payloads carry `bf` for +/// the `text_match` containment surface. Indexes `Unique` + `Ore` + `Match` +/// + `Ope`. /// /// - `$name` — the fixture name (`"eql_v3_smallint"`), drives every derived path. /// - `$ty` — the Rust plaintext type (`i16` / `chrono::NaiveDate` / `String`). @@ -39,13 +40,14 @@ /// for integers, or the harness accessor (`date_values()` / `text_values()`). /// /// `Unique` drives `=` / `<>` (HMAC); `Ore` drives `<` `<=` `>` `>=` (ORE block -/// terms); `Match` drives `@>` / `<@` (bloom filter). The generated payload is -/// always `jsonb`. +/// terms); `Ope` drives the CLLW-OPE `op` term for the `_ord_ope` domains +/// (cipherstash-client 0.38.1+, CIP-3348); `Match` drives `@>` / `<@` (bloom +/// filter). The generated payload is always `jsonb`. #[macro_export] macro_rules! scalar_fixture { // Integer scalars: signed-extreme property asserts. (int, $name:literal, $ty:ty, $values:expr $(,)?) => { - $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore, Ope]); #[cfg(test)] mod tests { @@ -84,7 +86,7 @@ macro_rules! scalar_fixture { // Temporal scalars: pivot-presence property assert (no signed extremes). (temporal, $name:literal, $ty:ty, $values:expr $(,)?) => { - $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore, Ope]); #[cfg(test)] mod tests { @@ -115,7 +117,7 @@ macro_rules! scalar_fixture { // Text scalars: pivot-presence asserts (like temporal) + the `Match` index // so generated payloads carry `bf` for the `text_match` containment surface. (text, $name:literal, $ty:ty, $values:expr $(,)?) => { - $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore, Match]); + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore, Match, Ope]); #[cfg(test)] mod tests { @@ -144,11 +146,11 @@ macro_rules! scalar_fixture { }; // Numeric scalars (`rust_decimal::Decimal`): ordered, non-chrono. Same - // shape as `temporal` — `[Unique, Ore]` indexes, pivot-presence asserts via - // `OrderedScalar` — but materialised from owned `Decimal` values (no `Match` - // index, no chrono). + // shape as `temporal` — `[Unique, Ore, Ope]` indexes, pivot-presence asserts + // via `OrderedScalar` — but materialised from owned `Decimal` values (no + // `Match` index, no chrono). (numeric, $name:literal, $ty:ty, $values:expr $(,)?) => { - $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore, Ope]); #[cfg(test)] mod tests { @@ -175,10 +177,10 @@ macro_rules! scalar_fixture { }; // Float scalars (`F4`/`F8`): ordered, non-chrono. Same shape as `numeric` — - // `[Unique, Ore]` indexes, pivot-presence asserts via `OrderedScalar` — + // `[Unique, Ore, Ope]` indexes, pivot-presence asserts via `OrderedScalar` — // materialised from the harness float newtypes (no `Match`, no chrono). (float, $name:literal, $ty:ty, $values:expr $(,)?) => { - $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore]); + $crate::scalar_fixture!(@common $name, $ty, $values, [Unique, Ore, Ope]); #[cfg(test)] mod tests { @@ -261,7 +263,8 @@ macro_rules! scalar_fixture { (@common $name:literal, $ty:ty, $values:expr, [$($ix:ident),+ $(,)?]) => { /// The complete fixture definition. `IndexKind::Unique` drives `=` / /// `<>` (HMAC); `IndexKind::Ore` drives `<` `<=` `>` `>=` (ORE block - /// terms); `IndexKind::Match` (when present) drives `@>` / `<@` (bloom). + /// terms); `IndexKind::Ope` drives the CLLW-OPE `op` term (`_ord_ope` + /// domains); `IndexKind::Match` (when present) drives `@>` / `<@` (bloom). pub fn spec() -> $crate::fixtures::FixtureSpec<'static, $ty> { $crate::fixtures::FixtureSpec::new($name) $(.with_index($crate::fixtures::IndexKind::$ix))+ diff --git a/tests/sqlx/src/fixtures/v3_convert.rs b/tests/sqlx/src/fixtures/v3_convert.rs index 3c3feff95..661a2bf05 100644 --- a/tests/sqlx/src/fixtures/v3_convert.rs +++ b/tests/sqlx/src/fixtures/v3_convert.rs @@ -1,7 +1,7 @@ //! Route generated fixture payloads through `eql_bindings::from_v2` — the //! v2 → v3 envelope conversion seam of the fixture pipeline (CIP-3347). //! -//! The pinned cipherstash-client (0.35) emits EQL **v2** storage payloads +//! The pinned cipherstash-client (0.38.1) emits EQL **v2** storage payloads //! (`v: 2`, `k` discriminator). After the envelope bump (#340) every //! `eql_v3` domain CHECK pins `VALUE->>'v' = '3'`, so raw client output can //! no longer be inserted into (or cast to) any v3 domain. This module @@ -21,11 +21,11 @@ //! domain and merges the outputs: //! //! - a domain is coverable when every term it requires was produced by the -//! fixture's indexes (`Unique` → `hm`, `Ore` → `ob`, `Match` → `bf`); -//! - `_ord_ope` domains are NEVER coverable — the pinned client emits no -//! `op` term (CIP-3280), so they are skipped by construction. The ope -//! suites keep their hand-built literal payloads -//! (`tests/encrypted_domain/ope/`); a fixture cannot silently claim ope +//! fixture's indexes (`Unique` → `hm`, `Ore` → `ob`, `Match` → `bf`, +//! `Ope` → `op`). Since cipherstash-client 0.38.1 the `ope` index emits +//! the scalar CLLW-OPE `op` term (a single hex string, NOT an array like +//! `ob`), so `_ord_ope` domains are coverable like any other (CIP-3348); +//! a fixture without the `Ope` index still cannot silently claim ope //! coverage because `from_v2` would fail closed with `MissingTerm`; //! - every produced term must be consumed by at least one selected domain, //! otherwise the generator errors loudly (a `Match` index on a family @@ -42,7 +42,7 @@ use anyhow::{anyhow, bail, Context, Result}; use eql_bindings::from_v2::{from_v2, TargetDomain}; -use eql_domains::{ScalarKind, Term, FIXTURES}; +use eql_domains::{ScalarKind, FIXTURES}; use serde_json::{Map, Value}; use super::index_kind::IndexKind; @@ -77,6 +77,7 @@ fn term_key_for(index: IndexKind) -> Option<&'static str> { match index { IndexKind::Unique => Some("hm"), IndexKind::Ore => Some("ob"), + IndexKind::Ope => Some("op"), IndexKind::Match => Some("bf"), IndexKind::SteVec => None, } @@ -103,13 +104,6 @@ fn targets_for(kind: ScalarKind, indexes: &[IndexKind]) -> Result = Vec::new(); for domain in family.domains { - // The pinned client emits no `op` term (CIP-3280), so an `_ord_ope` - // domain can never be generated from client output — skip it rather - // than fail `MissingTerm` on every fixture. The ope suites use - // hand-built literal payloads instead. - if domain.terms.contains(&Term::Ope) { - continue; - } let required: Vec<&str> = domain.terms.iter().map(|t| t.json_key()).collect(); if !required.iter().all(|key| provided.contains(key)) { continue; @@ -205,13 +199,63 @@ mod tests { assert_eq!(obj.get("hm"), v2_int_payload().get("hm")); assert_eq!(obj.get("ob"), v2_int_payload().get("ob")); - // Nothing else: no `op` (ord_ope is skipped — the client emits no - // OPE term), no stray keys. + // Nothing else: no `op` (the fixture declared no `ope` index, so + // `_ord_ope` is not coverable and its term is not required), no + // stray keys. let mut keys: Vec<&str> = obj.keys().map(String::as_str).collect(); keys.sort_unstable(); assert_eq!(keys, ["c", "hm", "i", "ob", "v"]); } + #[test] + fn ope_indexed_payload_routes_op_through_as_a_single_hex_string() { + // CIP-3348: an `ope`-indexed fixture's payload carries the CLLW-OPE + // `op` term — a SINGLE hex string, not an array like `ob` — and the + // conversion keeps it verbatim for the `_ord_ope` target. + let mut payload = v2_int_payload(); + payload + .as_object_mut() + .unwrap() + .insert("op".into(), json!("00ffab")); + let out = to_v3_payloads( + vec![payload], + ScalarKind::I32, + &[IndexKind::Unique, IndexKind::Ore, IndexKind::Ope], + ) + .unwrap(); + let obj = out[0].as_object().unwrap(); + assert_eq!(obj.get("v"), Some(&json!(3))); + assert_eq!( + obj.get("op"), + Some(&json!("00ffab")), + "`op` must pass through verbatim as a single hex string" + ); + assert!( + obj.get("op").unwrap().is_string(), + "`op` must be a JSON string, not an array" + ); + let mut keys: Vec<&str> = obj.keys().map(String::as_str).collect(); + keys.sort_unstable(); + assert_eq!(keys, ["c", "hm", "i", "ob", "op", "v"]); + } + + #[test] + fn ope_index_without_op_term_fails_closed() { + // An `ope`-indexed fixture whose payload lost `op` must crash the + // generator (`from_v2` MissingTerm on the `_ord_ope` target), not + // write a fixture the `_ord_ope` domain rejects. + let err = to_v3_payloads( + vec![v2_int_payload()], + ScalarKind::I32, + &[IndexKind::Unique, IndexKind::Ore, IndexKind::Ope], + ) + .unwrap_err(); + assert!( + format!("{err:#}").contains("op"), + "error should name the missing `op` term: {err:#}" + ); + } + #[test] fn conversion_preserves_batch_order() { let mut second = v2_int_payload(); diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index 4bed1e595..daffcb5ad 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1910,9 +1910,10 @@ macro_rules! __scalar_matrix_fixture_shape { // A storage-only / encryption-only scalar (`bool`) is encrypted // with NO search index, so its payload carries only `{v,i,c}` — - // no `hm`/`ob`/`bf` term. Every other scalar's proxy fixture + // no `hm`/`ob`/`bf`/`op` term. Every other scalar's fixture // carries `hm` + `ob`, plus `bf` for a Bloom-bearing domain - // (`text`, via `_match`/`_search`; catalog-derived). + // (`text`, via `_match`/`_search`) and `op` for an Ope-bearing + // domain (`_ord_ope`; every ordered family). All catalog-derived. if $crate::scalar_domains::token_is_storage_only(<$scalar as ScalarType>::PG_TYPE) { // The ciphertext (`c`) must still be present. let missing_c: i64 = sqlx::query_scalar(&format!( @@ -1923,7 +1924,7 @@ macro_rules! __scalar_matrix_fixture_shape { "every storage-only payload must carry a `c string` term; missing = {missing_c}"); // And NO index term may be present — that is the storage-only // contract (a term would be a searchable leak on a 2-value column). - for term in ["hm", "ob", "bf"] { + for term in ["hm", "ob", "bf", "op"] { let present: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(*) FROM {table} WHERE payload ? '{term}'", )).fetch_one(&pool).await?; @@ -1941,6 +1942,20 @@ macro_rules! __scalar_matrix_fixture_shape { ("bf array", "payload->'bf' IS NULL OR jsonb_typeof(payload->'bf') <> 'array'"), ); } + // Flipped tripwire (CIP-3348): cipherstash-client 0.38.1 + // emits the scalar CLLW-OPE term, the fixtures declare the + // `ope` index, and the conversion routes `op` through to + // every `_ord_ope`-capable payload. `op` must now be + // PRESENT (a single hex string — NOT an array like `ob`) + // on exactly the scalars whose catalog family declares an + // Ope domain, and absent otherwise (asserted below). + let has_ope = $crate::scalar_domains::token_has_ope_term( + <$scalar as ScalarType>::PG_TYPE); + if has_ope { + term_checks.push( + ("op string", "payload->'op' IS NULL OR jsonb_typeof(payload->'op') <> 'string'"), + ); + } for (label, predicate) in term_checks { let missing: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(*) FROM {table} WHERE {predicate}", @@ -1954,6 +1969,28 @@ macro_rules! __scalar_matrix_fixture_shape { )).fetch_one(&pool).await?; anyhow::ensure!(distinct_hm == n, "{n} distinct values -> {n} distinct hm terms; got {distinct_hm}"); + + if has_ope { + // CLLW-OPE is deterministic AND order-preserving, so + // n distinct plaintexts must map to n distinct `op` + // terms (an injective encryption; collisions would + // make op-routed `=` return false positives). + let distinct_op: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(DISTINCT payload->>'op') FROM {table}", + )).fetch_one(&pool).await?; + anyhow::ensure!(distinct_op == n, + "{n} distinct values -> {n} distinct op terms; got {distinct_op}"); + } else { + // A non-Ope family's fixture must NOT carry `op` — + // its index set never declares `ope`, so a stray key + // means the conversion targets drifted (CIP-3348). + let with_op: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} WHERE payload ? 'op'", + )).fetch_one(&pool).await?; + anyhow::ensure!(with_op == 0, + "fixture payload carries an `op` term but the catalog family \ + declares no Ope domain — conversion targets drifted (CIP-3348)"); + } } // Every eql_v3 domain CHECK pins v = '3' (the #340 envelope @@ -1974,21 +2011,6 @@ macro_rules! __scalar_matrix_fixture_shape { anyhow::ensure!(with_k == 0, "no converted scalar payload may carry the v2 `k` discriminator"); - // Tripwire (CIP-3348): the pinned client emits no `op` - // (CLLW-OPE) term, so the fixture pipeline skips `_ord_ope` - // targets and every ope test runs on hand-built hex. The - // first client release that emits `op` must fail HERE, not - // silently leave the synthetic-only coverage in place: on - // failure, add real-ciphertext ord_ope fixture coverage - // (CIP-3348) and route the new term through the conversion - // targets. - let with_op: i64 = sqlx::query_scalar(&format!( - "SELECT COUNT(*) FROM {table} WHERE payload ? 'op'", - )).fetch_one(&pool).await?; - anyhow::ensure!(with_op == 0, - "fixture payload carries an `op` term — the client now emits CLLW-OPE; \ - pick up CIP-3348 (real-ciphertext ord_ope coverage)"); - // Value-filtering oracle: take the midpoint of FIXTURE_VALUES, // derive its expected id from position, assert exactly one row. if !expected.is_empty() { diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 6b5633e0c..9d14919a6 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -1430,6 +1430,21 @@ pub fn token_has_bloom_term(token: &str) -> bool { .unwrap_or(false) } +/// True when scalar `token` declares any domain carrying the `Ope` term — +/// i.e. its generated fixture is encrypted with the `ope` index and its +/// payload includes an `op` (CLLW-OPE) key: a single hex string, natively +/// bytea-sortable after hex-decode (CIP-3348, cipherstash-client 0.38.1+). +/// Catalog-derived: every ordered family declares an `_ord_ope` domain, so +/// every non-storage-only scalar's fixture carries `op`; a storage-only +/// scalar (`boolean`) does not. +pub fn token_has_ope_term(token: &str) -> bool { + CATALOG + .iter() + .find(|s| s.name == token) + .map(|s| s.domains.iter().any(|d| d.terms.contains(&Term::Ope))) + .unwrap_or(false) +} + /// True when scalar `token` is **storage-only / encryption-only** (a single /// term-less domain, no `_eq`/`_ord`/`_match`) — e.g. `bool`. Catalog-derived /// via `DomainFamily::is_storage_only`. Such a type's fixture is encrypted with no From 791622b779d9f5a457f924188dda6af46ba513bf Mon Sep 17 00:00:00 2001 From: James Sadler Date: Sat, 4 Jul 2026 00:59:19 +1000 Subject: [PATCH 495/599] test(sqlx): real-ciphertext _ord_ope coverage with a CLLW-OPE determinism oracle (CIP-3348) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ope_ord_fixture_smoke! stamps three fixture-backed tests into each of the nine _ord_ope modules: every generated payload carries a string op term and casts into the domain; ORDER BY eql_v3.ord_ope_term over real ciphertexts sorts in plaintext order (ASC + DESC, Rust-sort oracle, same as the matrix ORDER BY arms); and all six comparison operators against the real mid-pivot ciphertext match the plaintext oracle — for the integer families = / <> route through op itself, so this is the real-crypto proof of op-routed equality. - property::cross_ciphertext gains the determinism oracle on the (now ope-indexed) doubles fixtures: two independent encryptions of one plaintext must carry byte-identical op hex terms (the property that makes op-routed = / <> sound; a randomized term would silently return false negatives), distinct plaintexts must carry distinct op terms, and = / <> hold across the distinct-ciphertext pair through _ord_ope itself. - The literal-payload smoke suites stay: they pin the SQL surface (routing, inlining, CHECK discipline); the fixture tests pin the cryptography. --- tests/sqlx/tests/encrypted_domain.rs | 13 +- .../encrypted_domain/ope/bigint_ord_ope.rs | 4 + .../encrypted_domain/ope/date_ord_ope.rs | 4 + .../encrypted_domain/ope/double_ord_ope.rs | 4 + .../encrypted_domain/ope/integer_ord_ope.rs | 4 + .../encrypted_domain/ope/numeric_ord_ope.rs | 4 + .../encrypted_domain/ope/real_ord_ope.rs | 4 + .../encrypted_domain/ope/smallint_ord_ope.rs | 4 + .../tests/encrypted_domain/ope/support.rs | 193 ++++++++++++++++-- .../encrypted_domain/ope/text_ord_ope.rs | 4 + .../encrypted_domain/ope/timestamp_ord_ope.rs | 4 + .../property/cross_ciphertext.rs | 90 +++++++- 12 files changed, 313 insertions(+), 19 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain.rs b/tests/sqlx/tests/encrypted_domain.rs index 7f3d63727..425d729d3 100644 --- a/tests/sqlx/tests/encrypted_domain.rs +++ b/tests/sqlx/tests/encrypted_domain.rs @@ -21,16 +21,19 @@ mod text_smoke; #[path = "encrypted_domain/text/text_match.rs"] mod text_match; -// CLLW-OPE (`op` term, `*_ord_ope` domains) literal-payload smoke suites. The -// pinned cipherstash-client does not emit `op` yet, so these use hand-built -// hex payloads instead of generated fixtures. One TOP-LEVEL module per ordered +// CLLW-OPE (`op` term, `*_ord_ope` domains) smoke suites: hand-built literal +// hex payloads for the SQL surface (routing, inlining, CHECK discipline) PLUS +// real-ciphertext fixture tests (CIP-3348 — cipherstash-client 0.38.1 emits +// `op` and the generated fixtures carry it). One TOP-LEVEL module per ordered // scalar, named `_ord_ope`, so the `test:matrix:catalog-coverage` gate's // dedicated-module pattern (`_::*`) sees every catalog `ord_ope` // domain covered — the same mechanism `text_match` uses for the Bloom domain. // Deliberately NOT under `scalars::` — the matrix-inventory gate treats every // `scalars::::` prefix as a scalar type (same rationale as the text -// suites). `ope_support` carries the shared payload builder and the -// `ope_ord_smoke!` macro the per-type modules invoke. +// suites). The per-test name set is pinned by `snapshots/ope_tests.txt` +// (`mise run test:matrix:inventory:ope`). `ope_support` carries the shared +// payload builder and the `ope_ord_smoke!` / `ope_ord_fixture_smoke!` macros +// the per-type modules invoke. #[path = "encrypted_domain/ope/support.rs"] mod ope_support; diff --git a/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs index e4be3c29b..d0432d513 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs @@ -5,3 +5,7 @@ //! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("bigint_ord_ope"); + +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("bigint_ord_ope", i64, "eql_v3_bigint"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs index be78eb1ed..5cc6b31b8 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs @@ -5,3 +5,7 @@ //! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("date_ord_ope"); + +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("date_ord_ope", chrono::NaiveDate, "eql_v3_date"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs index 48479d0bc..67dd5f1c7 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs @@ -5,3 +5,7 @@ //! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("double_ord_ope"); + +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("double_ord_ope", eql_tests::scalar_domains::F8, "eql_v3_double"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs index d76a26c36..e48dc20a0 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs @@ -8,6 +8,10 @@ use crate::ope_support::ope_cast; crate::ope_ord_smoke!("integer_ord_ope"); +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("integer_ord_ope", i32, "eql_v3_integer"); + #[sqlx::test] async fn ord_ope_functional_index_engages_for_range_and_equality( pool: PgPool, diff --git a/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs index 9f6986db2..1bf7d7f74 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs @@ -5,3 +5,7 @@ //! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("numeric_ord_ope"); + +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("numeric_ord_ope", rust_decimal::Decimal, "eql_v3_numeric"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs index 9b19ecf17..75dd6c0d1 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs @@ -5,3 +5,7 @@ //! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("real_ord_ope"); + +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("real_ord_ope", eql_tests::scalar_domains::F4, "eql_v3_real"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs index a1a32fe7a..ec5f17ccc 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs @@ -5,3 +5,7 @@ //! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("smallint_ord_ope"); + +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("smallint_ord_ope", i16, "eql_v3_smallint"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/support.rs b/tests/sqlx/tests/encrypted_domain/ope/support.rs index 25cd16ed1..0d0fb1882 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/support.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/support.rs @@ -8,19 +8,19 @@ //! be stated directly on hand-built hex strings — deterministic, no //! encryption/fixtures needed. //! -//! **Follow-up (real ciphertexts).** The pinned cipherstash-client does not -//! emit `op` yet, so there is no generated fixture to lean on and these -//! suites use synthetic hex — a deliberate, temporary exception to the -//! "tests run against real encrypted data" rule in CLAUDE.md. Once the -//! client emits `op` for ordered scalars (CIP-3280 landed on client main), -//! the fixture pipeline picks the term up and the matrix/property suites -//! must gain real-ciphertext `ord_ope` coverage — in particular verifying -//! against real crypto that the ciphertext order matches plaintext order and -//! that CLLW-OPE is deterministic (equal plaintexts produce equal `op` -//! terms; the integer families' `=`/`<>` route through `op`, so a randomized -//! term would silently produce false negatives). These literal-payload -//! suites verify the SQL surface (routing, inlining, index engagement, CHECK -//! discipline), not the cryptography. +//! **Real ciphertexts (CIP-3348).** cipherstash-client 0.38.1 emits `op` +//! for `ope`-indexed scalar columns, the generated `eql_v3_` fixtures +//! declare the `ope` index, and the conversion routes the term through — so +//! next to the literal-payload smoke tests (which verify the SQL surface: +//! routing, inlining, index engagement, CHECK discipline) every per-type +//! module also stamps [`ope_ord_fixture_smoke!`]: real-ciphertext assertions +//! that the CLLW-OPE ciphertext order matches plaintext order (ORDER BY + +//! range predicates against the in-table plaintext oracle). CLLW-OPE +//! determinism (equal plaintexts produce byte-identical `op` terms; the +//! integer families' `=`/`<>` route through `op`, so a randomized term would +//! silently produce false negatives) is pinned on the doubles fixtures by +//! `property::cross_ciphertext` and, live, by +//! `fixtures::cipherstash::live_tests`. /// Literal cast expression for an `eql_v3.` payload carrying BOTH the /// exact-equality term `hm` and the CLLW-OPE hex term `op`. Domain CHECKs @@ -126,3 +126,170 @@ macro_rules! ope_ord_smoke { } }; } + +/// Stamp the real-ciphertext `_ord_ope` fixture tests for one scalar +/// (CIP-3348). The generated `fixtures.eql_v3_` table carries +/// client-encrypted payloads whose `op` term came out of cipherstash-client's +/// `ope` index (0.38.1+), so these assertions exercise the actual CLLW-OPE +/// cryptography against the in-table `plaintext` oracle — the coverage the +/// hand-built literal suites above deliberately do not claim. +/// +/// - `$domain` — the ope domain name (`"integer_ord_ope"`). +/// - `$scalar` — the Rust plaintext type (`i32`), which must be `ScalarType`. +/// - `$script` — the fixture script name (`"eql_v3_integer"`). +/// +/// The fixtures path is relative to the per-type module files in +/// `tests/encrypted_domain/ope/` (all nine invokers live in this directory), +/// mirroring the matrix's `script_path` convention. +#[macro_export] +macro_rules! ope_ord_fixture_smoke { + ($domain:literal, $scalar:ty, $script:literal) => { + #[sqlx::test(fixtures(path = "../../../fixtures", scripts($script)))] + async fn ord_ope_fixture_payloads_cast_and_carry_op( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use eql_tests::scalar_domains::ScalarType; + let table = <$scalar as ScalarType>::fixture_table_name(); + let n = <$scalar as ScalarType>::fixture_values().len() as i64; + + // Every generated payload carries a string `op` (CLLW-OPE) term… + let with_op: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT(*) FROM {table} \ + WHERE payload ? 'op' AND jsonb_typeof(payload->'op') = 'string'", + )) + .fetch_one(&pool) + .await?; + assert_eq!( + with_op, n, + "{}: every fixture payload must carry a string `op` term \ + (regenerate fixtures on cipherstash-client 0.38.1+)", + $domain + ); + + // …and every payload casts into the ope domain (the CHECK accepts + // a real client ciphertext; a cast failure errors the query). + let cast_ok: i64 = sqlx::query_scalar(&format!( + "SELECT COUNT((payload)::eql_v3.{}) FROM {table}", + $domain + )) + .fetch_one(&pool) + .await?; + assert_eq!( + cast_ok, n, + "{}: every fixture payload must cast into the domain", + $domain + ); + Ok(()) + } + + #[sqlx::test(fixtures(path = "../../../fixtures", scripts($script)))] + async fn ord_ope_fixture_order_matches_plaintext_order( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use eql_tests::scalar_domains::ScalarType; + let table = <$scalar as ScalarType>::fixture_table_name(); + + // The headline crypto property: CLLW-OPE ciphertext order (native + // bytea comparison over the decoded `op` hex, via the extractor) + // must equal plaintext order. Same Rust-sort oracle as the + // matrix's ORDER BY arms. + let mut expected: Vec<$scalar> = + <$scalar as ScalarType>::fixture_values().to_vec(); + expected.sort(); + + let asc: Vec<$scalar> = sqlx::query_scalar(&format!( + "SELECT plaintext FROM {table} \ + ORDER BY eql_v3.ord_ope_term((payload)::eql_v3.{})", + $domain + )) + .fetch_all(&pool) + .await?; + assert_eq!( + asc, expected, + "{}: ORDER BY ord_ope_term over real ciphertexts must sort in \ + plaintext order", + $domain + ); + + let desc: Vec<$scalar> = sqlx::query_scalar(&format!( + "SELECT plaintext FROM {table} \ + ORDER BY eql_v3.ord_ope_term((payload)::eql_v3.{}) DESC", + $domain + )) + .fetch_all(&pool) + .await?; + let mut expected_desc = expected.clone(); + expected_desc.reverse(); + assert_eq!( + desc, expected_desc, + "{}: ORDER BY ord_ope_term DESC over real ciphertexts must \ + sort in reverse plaintext order", + $domain + ); + Ok(()) + } + + #[sqlx::test(fixtures(path = "../../../fixtures", scripts($script)))] + async fn ord_ope_fixture_range_and_equality_match_plaintext_oracle( + pool: sqlx::PgPool, + ) -> anyhow::Result<()> { + use eql_tests::scalar_domains::{OrderedScalar, ScalarType}; + let table = <$scalar as ScalarType>::fixture_table_name(); + + // Pivot on the interior (mid) fixture value: fetch ITS real + // payload from the table and compare every ordering/equality + // operator's row set against the plaintext oracle. For the + // integer families `=`/`<>` route through `op` itself, so this is + // the real-crypto proof that op-routed equality returns exactly + // the equal-plaintext rows (sound because CLLW-OPE is + // deterministic); for text they route through `hm` per catalog + // ordering. + let mid: $scalar = <$scalar as OrderedScalar>::mid_pivot(); + let mid_lit = <$scalar as ScalarType>::to_sql_literal(&mid); + let pivot_json: String = sqlx::query_scalar(&format!( + "SELECT payload::text FROM {table} WHERE plaintext = {mid_lit}", + )) + .fetch_one(&pool) + .await?; + let pivot_cast = format!( + "'{}'::jsonb::eql_v3.{}", + pivot_json.replace('\'', "''"), + $domain + ); + + let values: Vec<$scalar> = + <$scalar as ScalarType>::fixture_values().to_vec(); + for op in ["<", "<=", ">", ">=", "=", "<>"] { + let mut expected: Vec<$scalar> = values + .iter() + .filter(|v| match op { + "<" => **v < mid, + "<=" => **v <= mid, + ">" => **v > mid, + ">=" => **v >= mid, + "=" => **v == mid, + "<>" => **v != mid, + other => unreachable!("unexpected operator {other}"), + }) + .cloned() + .collect(); + expected.sort(); + let sql = format!( + "SELECT plaintext FROM {table} \ + WHERE (payload)::eql_v3.{domain} {op} ({pivot_cast})", + domain = $domain, + ); + let mut actual: Vec<$scalar> = + sqlx::query_scalar(&sql).fetch_all(&pool).await?; + actual.sort(); + assert_eq!( + actual, expected, + "{}: `{op}` against the real mid-pivot ciphertext must \ + match the plaintext oracle (SQL: {sql})", + $domain + ); + } + Ok(()) + } + }; +} diff --git a/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs index 1a36ada36..a01c5f505 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs @@ -7,6 +7,10 @@ use crate::ope_support::ope_cast; crate::ope_ord_smoke!("text_ord_ope"); +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("text_ord_ope", String, "eql_v3_text"); + #[sqlx::test] async fn equality_routes_through_hm_not_op(pool: PgPool) -> anyhow::Result<()> { // Same hm, different op => equal (hm routing). An op-routed `=` would say diff --git a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs index 8378c7b14..d75324a59 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs @@ -5,3 +5,7 @@ //! reference in `ope/integer_ord_ope.rs`. crate::ope_ord_smoke!("timestamp_ord_ope"); + +// Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted +// `op` terms must order and compare like the plaintext oracle. +crate::ope_ord_fixture_smoke!("timestamp_ord_ope", chrono::DateTime, "eql_v3_timestamp"); diff --git a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs index 126009fdd..ffb3a9933 100644 --- a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs +++ b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs @@ -17,7 +17,13 @@ //! twins (`assert_ord_oracle`), PLUS `=` TRUE / `<>` FALSE on an equal pair //! through `_ord` and `_ord_ore` — the ORE (`ob`) equality path, which routes //! `=` through `compare_ore_block_256_terms(...) = 0` (GUARANTEED equal for -//! two independent encryptions of one value; see the ORE finding in the plan). +//! two independent encryptions of one value; see the ORE finding in the plan); +//! 4. CLLW-OPE determinism (CIP-3348): every equal-plaintext pair carries +//! byte-identical `op` hex terms across its two independent encryptions — +//! the property that makes op-routed `=`/`<>` on the integer families' +//! `_ord_ope` domains sound — and distinct plaintexts carry distinct `op` +//! terms; plus `=` TRUE / `<>` FALSE on the distinct-ciphertext pair +//! through `_ord_ope` itself. //! //! `#[sqlx::test]` per type (its own migrated scratch DB), like the rest of the //! fixture suite. @@ -77,6 +83,83 @@ async fn assert_pair_eq_on( Ok(()) } +/// The `op` (CLLW-OPE) hex term of a doubles-row payload. Fails loudly when +/// the key is missing — the doubles fixtures are generated with the `ope` +/// index (cipherstash-client 0.38.1+), so an op-less payload means stale +/// fixtures. +fn op_term(row: &Row) -> Result { + let payload: serde_json::Value = serde_json::from_str(&row.payload_json)?; + payload + .get("op") + .and_then(serde_json::Value::as_str) + .map(str::to_owned) + .ok_or_else(|| { + anyhow::anyhow!( + "doubles payload for {} carries no string `op` term — regenerate \ + fixtures on cipherstash-client 0.38.1+ (CIP-3348): {}", + T::PG_TYPE, + row.payload_json + ) + }) +} + +/// CLLW-OPE determinism (CIP-3348): two independent encryptions of one +/// plaintext must carry byte-identical `op` hex terms — the property that +/// makes op-routed `=`/`<>` on the `_ord_ope` domains sound (a randomized +/// term would silently return false negatives). Distinct plaintexts must +/// carry distinct `op` terms (order-preserving => injective). +fn assert_ope_determinism(rows: &[Row]) -> Result<()> { + for i in 0..rows.len() { + for j in (i + 1)..rows.len() { + let (op_i, op_j) = (op_term::(&rows[i])?, op_term::(&rows[j])?); + if rows[i].plaintext == rows[j].plaintext { + anyhow::ensure!( + op_i == op_j, + "CLLW-OPE must be deterministic for {}: equal plaintext \ + {:?} produced different `op` terms across two independent \ + encryptions ({op_i:?} vs {op_j:?})", + T::PG_TYPE, + rows[i].plaintext, + ); + } else { + anyhow::ensure!( + op_i != op_j, + "distinct plaintexts ({:?} vs {:?}) for {} must carry \ + distinct `op` terms; both were {op_i:?}", + rows[i].plaintext, + rows[j].plaintext, + T::PG_TYPE, + ); + } + } + } + Ok(()) +} + +/// Like [`assert_pair_eq_on`] but for a domain outside the matrix `Variant` +/// set — the `_ord_ope` domain, whose coverage lives in the dedicated ope +/// suites rather than the matrix. +async fn assert_pair_eq_on_ord_ope( + pool: &PgPool, + a: &Row, + b: &Row, +) -> Result<()> { + let domain = format!("eql_v3.{}_ord_ope", T::PG_TYPE); + let a_cast = format!("'{}'::jsonb::{domain}", a.payload_json.replace('\'', "''")); + let b_cast = format!("'{}'::jsonb::{domain}", b.payload_json.replace('\'', "''")); + let sql = format!("SELECT ({a_cast}) = ({b_cast}), ({a_cast}) <> ({b_cast})"); + let (eq, neq): (Option, Option) = sqlx::query_as(&sql).fetch_one(pool).await?; + anyhow::ensure!( + eq == Some(true), + "cross-ciphertext `=` on {domain} must be TRUE for equal plaintext, got {eq:?}" + ); + anyhow::ensure!( + neq == Some(false), + "cross-ciphertext `<>` on {domain} must be FALSE for equal plaintext, got {neq:?}" + ); + Ok(()) +} + /// The full cross-ciphertext check for an ordered scalar `T`. async fn assert_cross_ciphertext(pool: &PgPool) -> Result<()> { let rows = load_doubles_rows::(pool).await?; @@ -93,6 +176,11 @@ async fn assert_cross_ciphertext(pool: &PgPool) -> Result<()> { assert_ord_oracle::(pool, Variant::OrdOre, &rows).await?; assert_pair_eq_on::(pool, Variant::Ord, a, b).await?; assert_pair_eq_on::(pool, Variant::OrdOre, a, b).await?; + + // (4) CLLW-OPE determinism (CIP-3348) on the real `op` terms, plus the + // op-path equality through `_ord_ope` on the distinct-ciphertext pair. + assert_ope_determinism::(&rows)?; + assert_pair_eq_on_ord_ope::(pool, a, b).await?; Ok(()) } From 3492d64ad6d607a5aa7eaf67446829acc7a32a52 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Sat, 4 Jul 2026 00:59:33 +1000 Subject: [PATCH 496/599] test(sqlx): pin the per-test ope inventory (snapshots/ope_tests.txt) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deferred minor from the #340 review, picked up with CIP-3348: ord_ore had ~83 individually pinned test names in matrix_tests.txt while the nine ope modules had zero. The ope suites live outside scalars:: and their per-type name sets are not uniform (the integer reference goes deeper; text pins its hm-routed equality), so no -normalized baseline fits — the new snapshot pins the FULL un-normalized list (60 tests). Verified by the new test:matrix:inventory:ope task (stub-fixtures + --list, no DB), run in the matrix-coverage CI job alongside the existing inventories, and documented in snapshots/README.md following the matrix_jsonb_entry_tests.txt sibling pattern. --- .github/workflows/test-eql.yml | 1 + mise.toml | 36 ++++++++++++++++++ tests/sqlx/snapshots/README.md | 26 +++++++++++++ tests/sqlx/snapshots/ope_tests.txt | 60 ++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 tests/sqlx/snapshots/ope_tests.txt diff --git a/.github/workflows/test-eql.yml b/.github/workflows/test-eql.yml index 86e9e1048..aa2f9d162 100644 --- a/.github/workflows/test-eql.yml +++ b/.github/workflows/test-eql.yml @@ -441,6 +441,7 @@ jobs: set -euo pipefail mise run test:matrix:inventory mise run test:matrix:inventory:jsonb_entry + mise run test:matrix:inventory:ope mise run test:v3-jsonb:inventory git add -N tests/sqlx/snapshots git diff --exit-code -- tests/sqlx/snapshots \ diff --git a/mise.toml b/mise.toml index c75b7bdb7..29f95a08e 100644 --- a/mise.toml +++ b/mise.toml @@ -549,6 +549,42 @@ fi echo "JSONB-entry matrix inventory OK." """ +[tasks."test:matrix:inventory:ope"] +description = "Verify the CLLW-OPE (_ord_ope) test-name set against snapshots/ope_tests.txt (no database required)" +dir = "{{config_root}}/tests/sqlx" +run = """ +#!/usr/bin/env bash +# The nine `_ord_ope::` suites are SIBLINGS of the scalar matrix inventory, +# NOT folded into it: they live as top-level modules (outside `scalars::`, so +# the type-discovery step does not mis-read them as scalar types) and their +# per-type name sets are not uniform (the integer reference module goes deeper; +# text pins its hm-routed equality), so no single -normalized baseline fits. +# This pins the FULL name list instead — every individual ope test — so a +# deleted/renamed/cfg-hidden ope test shows up as a removed line (the same +# silent-shrinkage gap the scalar snapshot closes; deferred minor from #340, +# picked up with CIP-3348). No database needed. +set -euo pipefail +test -f snapshots/ope_tests.txt || { echo "snapshots/ope_tests.txt missing — regenerate (see snapshots/README.md)." >&2; exit 1; } +# Stub the generated fixtures on a bare / no-creds worktree (see +# test:matrix:inventory), then compile + list. Harmless when real fixtures exist. +EQL_ROOT="{{config_root}}" +source "${EQL_ROOT}/tasks/test/stub-fixtures.sh" +tmp=$(mktemp) +cargo test --no-default-features --test encrypted_domain -- --list \\ + | sed -n 's/: test$//p' \\ + | grep -E '^[a-z0-9_]+_ord_ope::' \\ + | LC_ALL=C sort > "$tmp" +[ -s "$tmp" ] || { echo "No _ord_ope:: tests found in the encrypted_domain binary." >&2; rm -f "$tmp"; exit 1; } +if ! cmp -s "$tmp" snapshots/ope_tests.txt; then + echo "OPE test-name set differs from snapshots/ope_tests.txt." >&2 + diff snapshots/ope_tests.txt "$tmp" >&2 || true + rm -f "$tmp" + exit 1 +fi +rm -f "$tmp" +echo "OPE inventory OK ($(wc -l < snapshots/ope_tests.txt | tr -d ' ') pinned tests)." +""" + [tasks."test:v3-jsonb:inventory"] description = "Verify the v3 jsonb SQLx test-name inventory snapshot (no database required)" dir = "{{config_root}}/tests/sqlx" diff --git a/tests/sqlx/snapshots/README.md b/tests/sqlx/snapshots/README.md index de38512f4..1771e3b71 100644 --- a/tests/sqlx/snapshots/README.md +++ b/tests/sqlx/snapshots/README.md @@ -188,6 +188,32 @@ cargo test --no-default-features --test encrypted_domain -- --list \ | sed -E 's/_integer_/__/' | LC_ALL=C sort -u > snapshots/matrix_jsonb_entry_tests.txt ``` +## ope_tests.txt + +`ope_tests.txt` pins the test-name set for the nine CLLW-OPE suites +(`tests/encrypted_domain/ope/`) — the `_ord_ope::…` modules covering every +catalog `_ord_ope` domain (literal-payload SQL-surface smoke tests plus the +real-ciphertext fixture tests added with CIP-3348). Like +`matrix_jsonb_entry_tests.txt` it is a deliberate **sibling** of the scalar +matrix inventory, **not** folded into it: the ope suites live as top-level +modules (outside `scalars::`, so the type-discovery step does not mis-read +them as scalar types), and their per-type name sets are not uniform — the +integer reference module carries the deeper single-type behaviour (prefix +order, blockers, ORDER BY forms, aggregates) and text pins its hm-routed +equality — so no single ``-normalized baseline fits. The snapshot therefore +pins the **full un-normalized list**: every individual ope test name (the +per-test pinning deferred from #340 review). No database is required (`--list` +only enumerates). + +Verify with `mise run test:matrix:inventory:ope`. Regenerate with: + +```bash +cd tests/sqlx +cargo test --no-default-features --test encrypted_domain -- --list \ + | sed -n 's/: test$//p' | grep -E '^[a-z0-9_]+_ord_ope::' \ + | LC_ALL=C sort > snapshots/ope_tests.txt +``` + ## v3_jsonb_tests.txt `v3_jsonb_tests.txt` pins the SQLx test-name set for the hand-written diff --git a/tests/sqlx/snapshots/ope_tests.txt b/tests/sqlx/snapshots/ope_tests.txt new file mode 100644 index 000000000..2ff288319 --- /dev/null +++ b/tests/sqlx/snapshots/ope_tests.txt @@ -0,0 +1,60 @@ +bigint_ord_ope::ord_ope_check_requires_op +bigint_ord_ope::ord_ope_equality_and_inequality +bigint_ord_ope::ord_ope_fixture_order_matches_plaintext_order +bigint_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +bigint_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +bigint_ord_ope::ord_ope_orders_by_decoded_bytes +date_ord_ope::ord_ope_check_requires_op +date_ord_ope::ord_ope_equality_and_inequality +date_ord_ope::ord_ope_fixture_order_matches_plaintext_order +date_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +date_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +date_ord_ope::ord_ope_orders_by_decoded_bytes +double_ord_ope::ord_ope_check_requires_op +double_ord_ope::ord_ope_equality_and_inequality +double_ord_ope::ord_ope_fixture_order_matches_plaintext_order +double_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +double_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +double_ord_ope::ord_ope_orders_by_decoded_bytes +integer_ord_ope::ord_ope_blocks_unsupported_operators +integer_ord_ope::ord_ope_check_requires_op +integer_ord_ope::ord_ope_equality_and_inequality +integer_ord_ope::ord_ope_fixture_order_matches_plaintext_order +integer_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +integer_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +integer_ord_ope::ord_ope_functional_index_engages_for_range_and_equality +integer_ord_ope::ord_ope_min_max_aggregates +integer_ord_ope::ord_ope_order_by_sorts_by_decoded_bytes +integer_ord_ope::ord_ope_orders_by_decoded_bytes +integer_ord_ope::ord_ope_shorter_prefix_sorts_first +numeric_ord_ope::ord_ope_check_requires_op +numeric_ord_ope::ord_ope_equality_and_inequality +numeric_ord_ope::ord_ope_fixture_order_matches_plaintext_order +numeric_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +numeric_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +numeric_ord_ope::ord_ope_orders_by_decoded_bytes +real_ord_ope::ord_ope_check_requires_op +real_ord_ope::ord_ope_equality_and_inequality +real_ord_ope::ord_ope_fixture_order_matches_plaintext_order +real_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +real_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +real_ord_ope::ord_ope_orders_by_decoded_bytes +smallint_ord_ope::ord_ope_check_requires_op +smallint_ord_ope::ord_ope_equality_and_inequality +smallint_ord_ope::ord_ope_fixture_order_matches_plaintext_order +smallint_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +smallint_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +smallint_ord_ope::ord_ope_orders_by_decoded_bytes +text_ord_ope::equality_routes_through_hm_not_op +text_ord_ope::ord_ope_check_requires_op +text_ord_ope::ord_ope_equality_and_inequality +text_ord_ope::ord_ope_fixture_order_matches_plaintext_order +text_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +text_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +text_ord_ope::ord_ope_orders_by_decoded_bytes +timestamp_ord_ope::ord_ope_check_requires_op +timestamp_ord_ope::ord_ope_equality_and_inequality +timestamp_ord_ope::ord_ope_fixture_order_matches_plaintext_order +timestamp_ord_ope::ord_ope_fixture_payloads_cast_and_carry_op +timestamp_ord_ope::ord_ope_fixture_range_and_equality_match_plaintext_oracle +timestamp_ord_ope::ord_ope_orders_by_decoded_bytes From b6976375798f6ec3ccdabdaa153bce609200a4d4 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Sat, 4 Jul 2026 01:11:32 +1000 Subject: [PATCH 497/599] style(sqlx): rustfmt the CIP-3348 ope coverage files --- tests/sqlx/src/fixtures/cipherstash.rs | 14 +++++++++----- .../tests/encrypted_domain/ope/double_ord_ope.rs | 6 +++++- tests/sqlx/tests/encrypted_domain/ope/support.rs | 9 +++------ .../encrypted_domain/ope/timestamp_ord_ope.rs | 6 +++++- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/tests/sqlx/src/fixtures/cipherstash.rs b/tests/sqlx/src/fixtures/cipherstash.rs index b9636f1e8..fb4d76b1f 100644 --- a/tests/sqlx/src/fixtures/cipherstash.rs +++ b/tests/sqlx/src/fixtures/cipherstash.rs @@ -349,8 +349,7 @@ mod live_tests { /// The full ordered-integer index set including `Ope`, which drives the /// scalar CLLW-OPE `op` term (cipherstash-client 0.38.1+, CIP-3348). - const INT_INDEXES_WITH_OPE: &[IndexKind] = - &[IndexKind::Unique, IndexKind::Ore, IndexKind::Ope]; + const INT_INDEXES_WITH_OPE: &[IndexKind] = &[IndexKind::Unique, IndexKind::Ore, IndexKind::Ope]; /// Assert the well-formed v3 Store shape: the payload is a JSON object /// with non-null `v`, `c`, `hm`, `ob`, and `i` fields, `v = 3`, and no @@ -425,9 +424,14 @@ mod live_tests { // term for `ope`-indexed columns; from_v2 routes it through to the // `_ord_ope`-capable v3 payload as a single hex string (NOT an // array like `ob`). - let out = encrypt_store("live_ope", "payload", &[-1_i32, 0, 42], INT_INDEXES_WITH_OPE) - .await - .expect("encrypt_store should succeed against live ZeroKMS"); + let out = encrypt_store( + "live_ope", + "payload", + &[-1_i32, 0, 42], + INT_INDEXES_WITH_OPE, + ) + .await + .expect("encrypt_store should succeed against live ZeroKMS"); assert_eq!(out.len(), 3); for payload in &out { assert_store_shape(payload, INT_INDEXES_WITH_OPE); diff --git a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs index 67dd5f1c7..334688a21 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs @@ -8,4 +8,8 @@ crate::ope_ord_smoke!("double_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("double_ord_ope", eql_tests::scalar_domains::F8, "eql_v3_double"); +crate::ope_ord_fixture_smoke!( + "double_ord_ope", + eql_tests::scalar_domains::F8, + "eql_v3_double" +); diff --git a/tests/sqlx/tests/encrypted_domain/ope/support.rs b/tests/sqlx/tests/encrypted_domain/ope/support.rs index 0d0fb1882..ae7e039d4 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/support.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/support.rs @@ -193,8 +193,7 @@ macro_rules! ope_ord_fixture_smoke { // bytea comparison over the decoded `op` hex, via the extractor) // must equal plaintext order. Same Rust-sort oracle as the // matrix's ORDER BY arms. - let mut expected: Vec<$scalar> = - <$scalar as ScalarType>::fixture_values().to_vec(); + let mut expected: Vec<$scalar> = <$scalar as ScalarType>::fixture_values().to_vec(); expected.sort(); let asc: Vec<$scalar> = sqlx::query_scalar(&format!( @@ -257,8 +256,7 @@ macro_rules! ope_ord_fixture_smoke { $domain ); - let values: Vec<$scalar> = - <$scalar as ScalarType>::fixture_values().to_vec(); + let values: Vec<$scalar> = <$scalar as ScalarType>::fixture_values().to_vec(); for op in ["<", "<=", ">", ">=", "=", "<>"] { let mut expected: Vec<$scalar> = values .iter() @@ -279,8 +277,7 @@ macro_rules! ope_ord_fixture_smoke { WHERE (payload)::eql_v3.{domain} {op} ({pivot_cast})", domain = $domain, ); - let mut actual: Vec<$scalar> = - sqlx::query_scalar(&sql).fetch_all(&pool).await?; + let mut actual: Vec<$scalar> = sqlx::query_scalar(&sql).fetch_all(&pool).await?; actual.sort(); assert_eq!( actual, expected, diff --git a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs index d75324a59..72bbe94b1 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs @@ -8,4 +8,8 @@ crate::ope_ord_smoke!("timestamp_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("timestamp_ord_ope", chrono::DateTime, "eql_v3_timestamp"); +crate::ope_ord_fixture_smoke!( + "timestamp_ord_ope", + chrono::DateTime, + "eql_v3_timestamp" +); From 0129bb10e2d56b192d3fddbadad883a6db2c8bab Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 4 Jul 2026 11:39:31 +1000 Subject: [PATCH 498/599] docs(claude): point to scripted release paths (release:preview + alpha runbook) CLAUDE.md's release section only described final releases, so cutting an alpha looked unscripted and got hand-rolled with gh release create. Add a callout naming both paths -- mise run release:preview for prereleases (linking docs/development/releasing-an-alpha.md) and the final-release path -- and scope the 'Cutting a release' steps to final releases only. --- CLAUDE.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 616af7546..c7bcdb91e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -238,6 +238,11 @@ Prefer `LANGUAGE SQL` over `LANGUAGE plpgsql` unless you need procedural feature EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style `CHANGELOG.md` and per-version upgrade guides under `docs/upgrading/`. The conventions are documented at the top of `CHANGELOG.md`; what follows is what to do when working in this repo. +**Cutting a release is scripted — don't hand-roll `gh release create`.** There are two paths: + +- **Prerelease (alpha / beta / rc):** run `mise run release:preview` (`tasks/release/preview.sh`). It derives the next `eql--.` tag, does a clean build-verify of the v3 installer/uninstaller, and cuts the GitHub prerelease that triggers the release workflow. Use `--dry-run` first; `--target` defaults to the current branch. It deliberately does **not** touch `CHANGELOG.md` (previews keep entries under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**. +- **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]`, which the workflow's `verify-changelog` job enforces. + ### When you make a user-facing change If your PR adds, changes, removes, deprecates, or fixes anything observable to a caller — new function, new operator, behaviour change, error message change, performance characteristic that callers might notice (e.g. an index now engages), changed default — **add an entry under `## [Unreleased]` in `CHANGELOG.md` as part of the same PR.** @@ -281,6 +286,8 @@ The `eql_v3` PostgreSQL schema name is part of the public API and is **independe ### Cutting a release +This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, use `mise run release:preview` instead — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`. + When a release is being prepared: 1. Confirm `[Unreleased]` is non-empty and entries are coherent. From d453959cd02e5c9c9464b3be56fceef0a837f9f9 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Sat, 4 Jul 2026 12:42:06 +1000 Subject: [PATCH 499/599] fix(v3): convert ore_block_256 opclass-path helpers to plpgsql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jsonb_array_to_bytea_array and jsonb_array_to_ore_block_256 were LANGUAGE sql for inlineability, but their only caller chain — ore_block_256(val) (plpgsql) feeding the btree operator class — can never inline SQL functions. Every compared value instead paid the per-call SQL-function executor: 3.5x the per-call cost of the logic-identical plpgsql form, +43% end-to-end on ORE ordered index scans vs EQL 2.3 (0.513 -> 0.736 ms at 1M rows) and +36% on the composite bloom+ORE-order shape (16.6 -> 22.7 ms). Language-only change; semantics preserved and probed on an installed bundle: NULL / JSON null / non-array inputs still return NULL, and the empty-`ob` COALESCE (#262) still yields an empty (not NULL) terms array, sorting before every non-empty term. The eql-inline-critical markers are kept so pin_search_path leaves both functions unpinned — SET search_path on plpgsql forces per-call configuration switching in the same hot path (verified unpinned post-install). Validated A->B->A on a live 1M-row bench database before this patch was authored: with the plpgsql form, ORE/range_lt_ordered_10 returns to 0.553 ms (within 8% of v2) and COMBO/bloom_ore_order_limit to 13.97 ms (16% faster than v2), with non-ordering controls unmoved. Attribution data: cipherstash/benches#23, v3-regressions-report.md. plpgsql note for reviewers: `SELECT INTO ` assigns field-wise — the row constructor is returned directly. Closes #353 Claude-Session: https://claude.ai/code/session_01StQnoycoFXMDdSpQ6zKDav --- CHANGELOG.md | 2 + src/v3/common.sql | 54 +++++++++++++---------- src/v3/sem/ore_block_256/functions.sql | 59 +++++++++++++++----------- 3 files changed, 67 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b439aa6e2..b9098d5dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,8 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). ### Fixed +- **`ore_block_256` opclass-path helpers converted from `LANGUAGE sql` to plpgsql — restores v2-level ordered-scan performance.** `eql_v3_internal.jsonb_array_to_bytea_array` and `eql_v3_internal.jsonb_array_to_ore_block_256` were `LANGUAGE sql` for inlineability, but their only caller chain (`ore_block_256(val)`, plpgsql, feeding the btree operator class) can never inline SQL functions — every compared value paid the per-call SQL-function executor instead, measured at 3.5× the per-call cost of the logic-identical plpgsql form. Release benchmarks put the end-to-end cost at +43% on ORE ordered index scans vs EQL 2.3 (`0.513 → 0.736 ms` at 1M rows) and +36% on the composite bloom+ORE-order shape (`16.6 → 22.7 ms`); with the plpgsql form both scenarios return to (or beat) the v2 numbers — `0.553 ms` and `13.97 ms` respectively, validated A→B→A on a live 1M-row bench database. Semantics are unchanged: NULL/non-array inputs still return NULL, and the empty-`ob` COALESCE (#262) is preserved. The `eql-inline-critical` markers are retained so the pin_search_path pass keeps both functions unpinned — a `SET search_path` clause on plpgsql forces per-call configuration switching in the same hot path. Full attribution and experiment data: cipherstash/benches#23 (`v3-regressions-report.md`). ([#353](https://github.com/cipherstash/encrypt-query-language/issues/353)) + - **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.integer_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamp` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) diff --git a/src/v3/common.sql b/src/v3/common.sql index 8fe4da2ff..a81ea3724 100644 --- a/src/v3/common.sql +++ b/src/v3/common.sql @@ -18,32 +18,40 @@ --! --! @note Returns NULL if input is JSON null --! @note Each array element is hex-decoded to bytea ---! @note Inlinable `LANGUAGE sql` IMMUTABLE form (no `SET search_path`) so the ---! planner can fold this per-encrypted-value helper into the calling query. ---! This deliberately diverges from the v2 plpgsql equivalent (intentionally ---! left unchanged): the `CASE WHEN jsonb_typeof(val) = 'array'` guard only ---! evaluates the set-returning `jsonb_array_elements_text` for an array, so a ---! non-array JSON scalar returns NULL here instead of raising "cannot extract ---! elements from a scalar". Both callers only ever pass an array or JSON null ---! (`val->'ob'`), so the divergence is unreachable in practice; JSON null and ---! empty array still return NULL exactly as before. +--! @note plpgsql, not `LANGUAGE sql` (issue #353). This helper's ONLY caller +--! chain is `ore_block_256(val)` -> `jsonb_array_to_ore_block_256(val)` — +--! both reached exclusively from plpgsql and btree operator-class support +--! contexts, where SQL functions can NEVER be inlined and instead pay the +--! per-call SQL-function executor (measured 3.5x the per-call cost of the +--! plpgsql equivalent; +43% on ORE ordered scans end-to-end). plpgsql +--! caches its plan across calls. The non-array guard preserves the v3 +--! behaviour (returns NULL for a non-array scalar; the v2 plpgsql original +--! raised) — both callers only ever pass an array or JSON null (`val->'ob'`), +--! so the divergence stays unreachable in practice; JSON null and empty +--! array still return NULL exactly as before. CREATE FUNCTION eql_v3_internal.jsonb_array_to_bytea_array(val jsonb) RETURNS bytea[] IMMUTABLE AS $$ - SELECT CASE WHEN jsonb_typeof(val) = 'array' - THEN ( - SELECT array_agg(decode(value::text, 'hex')::bytea) - FROM jsonb_array_elements_text(val) AS value - ) - ELSE NULL - END; -$$ LANGUAGE sql; +DECLARE + result bytea[]; +BEGIN + IF val IS NULL OR jsonb_typeof(val) != 'array' THEN + RETURN NULL; + END IF; + SELECT array_agg(decode(value::text, 'hex')::bytea) + INTO result + FROM jsonb_array_elements_text(val) AS value; + RETURN result; +END; +$$ LANGUAGE plpgsql; ---! @internal Mark this hand-written helper inline-critical so the post-install ---! pin_search_path pass leaves it unpinned (no `SET search_path`), preserving ---! SQL-function inlining. It takes a bare `jsonb` arg (not a jsonb-backed ---! encrypted DOMAIN), so the structural skip in tasks/pin_search_path_v3.sql does ---! not recognise it; this marker is the documented manual opt-in. +--! @internal Keep the inline-critical marker so the post-install +--! pin_search_path pass leaves this unpinned: a `SET search_path` clause on a +--! plpgsql function forces per-call configuration switching — measurable on a +--! helper invoked per compared value in the ore_block_256 opclass hot path. +--! It takes a bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the +--! structural skip in tasks/pin_search_path_v3.sql does not recognise it; +--! this marker is the documented manual opt-in. COMMENT ON FUNCTION eql_v3_internal.jsonb_array_to_bytea_array(jsonb) IS - 'eql-inline-critical: per-encrypted-value ORE helper; must stay inlinable (unpinned search_path)'; + 'eql-inline-critical: per-encrypted-value ORE opclass-path helper; must stay unpinned (SET search_path adds per-call overhead)'; diff --git a/src/v3/sem/ore_block_256/functions.sql b/src/v3/sem/ore_block_256/functions.sql index e4098ecc5..45f31fdce 100644 --- a/src/v3/sem/ore_block_256/functions.sql +++ b/src/v3/sem/ore_block_256/functions.sql @@ -17,14 +17,15 @@ --! @internal --! @param val jsonb Array of hex-encoded ORE block terms --! @return eql_v3_internal.ore_block_256 ORE block composite, or NULL if input is null ---! @note Inlinable `LANGUAGE sql` IMMUTABLE form (no `SET search_path`) so the ---! planner can fold this per-encrypted-value helper into the calling query. ---! This deliberately diverges from the v2 plpgsql equivalent (intentionally ---! left unchanged): the `CASE WHEN jsonb_typeof(val) = 'array'` guard only ---! evaluates the array path for an array, so a non-array JSON scalar returns ---! NULL here instead of raising. The sole caller (`ore_block_256`) only reaches ---! this when `has_ore_block_256(val)` is true, which now requires `val->'ob'` ---! to be a JSON array, so the non-array branch is unreachable in practice. +--! @note plpgsql, not `LANGUAGE sql` (issue #353). The sole caller +--! (`ore_block_256`) is itself plpgsql, so this function is NEVER reached +--! from an inlinable context — as `LANGUAGE sql` it paid the per-call +--! SQL-function executor on every compared value in the opclass hot path +--! (measured: +43% on ORE ordered scans vs the plpgsql form). The +--! non-array guard preserves the v3 behaviour (returns NULL for a +--! non-array scalar; the v2 plpgsql original raised); the caller only +--! reaches this when `has_ore_block_256(val)` is true, which requires +--! `val->'ob'` to be a JSON array, so that branch stays unreachable. --! An empty array (`ob: []`, what encrypting the empty string `""` produces) --! yields a non-NULL composite with an EMPTY `terms` array — NOT NULL terms. --! The `COALESCE` is load-bearing: `array_agg` over zero rows returns NULL, and @@ -36,25 +37,33 @@ CREATE FUNCTION eql_v3_internal.jsonb_array_to_ore_block_256(val jsonb) RETURNS eql_v3_internal.ore_block_256 IMMUTABLE AS $$ - SELECT CASE WHEN jsonb_typeof(val) = 'array' - THEN ROW(COALESCE( - ( - SELECT array_agg(ROW(b)::eql_v3_internal.ore_block_256_term) - FROM unnest(eql_v3_internal.jsonb_array_to_bytea_array(val)) AS b - ), - ARRAY[]::eql_v3_internal.ore_block_256_term[] - ))::eql_v3_internal.ore_block_256 - ELSE NULL - END; -$$ LANGUAGE sql; +DECLARE + terms eql_v3_internal.ore_block_256_term[]; +BEGIN + IF val IS NULL OR jsonb_typeof(val) != 'array' THEN + RETURN NULL; + END IF; + SELECT array_agg(ROW(b)::eql_v3_internal.ore_block_256_term) + INTO terms + FROM unnest(eql_v3_internal.jsonb_array_to_bytea_array(val)) AS b; + -- plpgsql pitfall: `SELECT INTO ` assigns the + -- select-list columns FIELD-WISE into the variable — return the row + -- constructor directly instead. The COALESCE stays load-bearing for the + -- empty-`ob` case (issue #262): array_agg over zero rows yields NULL, and + -- the comparator needs an EMPTY terms array, not NULL terms. + RETURN ROW(COALESCE(terms, ARRAY[]::eql_v3_internal.ore_block_256_term[]))::eql_v3_internal.ore_block_256; +END; +$$ LANGUAGE plpgsql; ---! @internal Mark this hand-written helper inline-critical so the post-install ---! pin_search_path pass leaves it unpinned (no `SET search_path`), preserving ---! SQL-function inlining. It takes a bare `jsonb` arg (not a jsonb-backed ---! encrypted DOMAIN), so the structural skip in tasks/pin_search_path_v3.sql does ---! not recognise it; this marker is the documented manual opt-in. +--! @internal Keep the inline-critical marker so the post-install +--! pin_search_path pass leaves this unpinned: a `SET search_path` clause on a +--! plpgsql function forces per-call configuration switching — measurable on a +--! helper invoked per compared value in the ore_block_256 opclass hot path. +--! It takes a bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the +--! structural skip in tasks/pin_search_path_v3.sql does not recognise it; +--! this marker is the documented manual opt-in. COMMENT ON FUNCTION eql_v3_internal.jsonb_array_to_ore_block_256(jsonb) IS - 'eql-inline-critical: per-encrypted-value ORE helper; must stay inlinable (unpinned search_path)'; + 'eql-inline-critical: per-encrypted-value ORE opclass-path helper; must stay unpinned (SET search_path adds per-call overhead)'; --! @brief Extract ORE block index term from JSONB payload From 1d5506de92b13048db648834279552eb20e7da9f Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Sat, 4 Jul 2026 12:55:51 +1000 Subject: [PATCH 500/599] test: update inlinability guards for the plpgsql opclass-path helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two failing CI tests encoded the old assumption that jsonb_array_to_bytea_array / jsonb_array_to_ore_block_256 must stay inlinable LANGUAGE sql — the premise the parent commit corrects (their only caller chain is plpgsql + opclass contexts, where SQL functions never inline; issue #353). - Remove both helpers from the inlinable-SQL sets of eql_v3_sem_inline_critical_functions_are_unpinned and eql_v3_sem_inline_critical_helpers_carry_marker. - Add a dedicated guard, eql_v3_ore_block_256_opclass_helpers_are_plpgsql_and_unpinned, asserting the corrected invariant: plpgsql (a revert to LANGUAGE sql reintroduces the +43% regression), IMMUTABLE, marker present, and unpinned (SET search_path on plpgsql adds per-call overhead in the same hot path). All three guard predicates verified by hand against a freshly built and installed bundle (0 offenders each). Claude-Session: https://claude.ai/code/session_01StQnoycoFXMDdSpQ6zKDav --- .../encrypted_domain/family/inlinability.rs | 111 +++++++++++++----- 1 file changed, 84 insertions(+), 27 deletions(-) diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 2a9480edc..142c3a98e 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -96,23 +96,17 @@ async fn no_encrypted_domain_inline_critical_function_is_pinned(pool: PgPool) -> /// regresses to Seq Scan — this test fails instead. /// /// `jsonb_array_to_bytea_array(jsonb)` and -/// `jsonb_array_to_ore_block_256(jsonb)` are included here: both take a -/// bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the structural -/// skip in tasks/pin_search_path_v3.sql does not recognise them — they are kept -/// unpinned by the `eql-inline-critical` COMMENT marker instead. This test -/// asserts the unpinned + inlinable-SQL state directly; the companion -/// `eql_v3_sem_inline_critical_functions_carry_marker` test below asserts the -/// marker itself, so an edit that drops the marker (or a pin_search_path_v3.sql -/// refactor that stops honouring it) fails CI even though both checks live in -/// separate tests. +/// `jsonb_array_to_ore_block_256(jsonb)` are NOT in this test's inlinable-SQL +/// set: their only caller chain (`ore_block_256(val)`, plpgsql, feeding the +/// btree operator class) can never inline a SQL function, so they are plpgsql +/// by design (issue #353) and guarded by the dedicated +/// `eql_v3_ore_block_256_opclass_helpers_are_plpgsql_and_unpinned` test below. #[sqlx::test] async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Result<()> { let rows: Vec<(String,)> = sqlx::query_as( r#" WITH expected(proname, pronargs, arg0, arg1) AS ( VALUES - ('jsonb_array_to_bytea_array', 1, 'jsonb'::regtype, 0::oid), - ('jsonb_array_to_ore_block_256', 1, 'jsonb'::regtype, 0::oid), ('ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('has_ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('meta_data', 1, 'jsonb'::regtype, 0::oid), @@ -145,9 +139,7 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu 'hmac_256', 'bloom_filter', 'ore_cllw', - 'has_ore_cllw', - 'jsonb_array_to_bytea_array', - 'jsonb_array_to_ore_block_256') + 'has_ore_cllw') AND p.proargtypes[0] = 'jsonb'::regtype) OR e.proname IS NOT NULL ) @@ -171,17 +163,17 @@ async fn eql_v3_sem_inline_critical_functions_are_unpinned(pool: PgPool) -> Resu Ok(()) } -/// Companion guard for the two bare-`jsonb` per-encrypted-value helpers -/// (`jsonb_array_to_bytea_array`, `jsonb_array_to_ore_block_256`). The -/// unpinned state asserted above is only DURABLE because each helper carries an -/// `eql-inline-critical` COMMENT marker that `tasks/pin_search_path_v3.sql` honours -/// (it skips pinning functions whose `pg_description` matches -/// `'eql-inline-critical%'`). Neither helper is caught by the structural -/// jsonb-domain skip, so the marker is the ONLY thing keeping them unpinned — -/// an edit that removes the marker, or a pin_search_path_v3.sql refactor that drops -/// the marker handling, would silently re-pin them and break inlining. This test -/// asserts the marker is present (and the helpers are SQL/IMMUTABLE) so that -/// failure surfaces here. +/// Companion guard: the unpinned state asserted above is only DURABLE for +/// bare-`jsonb` helpers because each carries an `eql-inline-critical` COMMENT +/// marker that `tasks/pin_search_path_v3.sql` honours (it skips pinning +/// functions whose `pg_description` matches `'eql-inline-critical%'`). These +/// helpers are not caught by the structural jsonb-domain skip, so the marker +/// is the ONLY thing keeping them unpinned — an edit that removes the marker, +/// or a pin_search_path_v3.sql refactor that drops the marker handling, would +/// silently re-pin them and break inlining. This test asserts the marker is +/// present (and the helpers are SQL/IMMUTABLE). The two plpgsql +/// `jsonb_array_to_*` opclass-path helpers are guarded separately below +/// (issue #353). #[sqlx::test] async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result<()> { // Each expected helper must appear with a present inline-critical marker @@ -191,8 +183,6 @@ async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result r#" WITH expected(proname, pronargs, arg0, arg1) AS ( VALUES - ('jsonb_array_to_bytea_array', 1, 'jsonb'::regtype, 0::oid), - ('jsonb_array_to_ore_block_256', 1, 'jsonb'::regtype, 0::oid), ('ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('has_ore_cllw', 1, 'jsonb'::regtype, 0::oid), ('meta_data', 1, 'jsonb'::regtype, 0::oid), @@ -238,6 +228,73 @@ async fn eql_v3_sem_inline_critical_helpers_carry_marker(pool: PgPool) -> Result Ok(()) } +/// Dedicated guard for the two `ore_block_256` opclass-path helpers +/// (`jsonb_array_to_bytea_array`, `jsonb_array_to_ore_block_256`) — issue #353. +/// +/// Their only caller chain is `ore_block_256(val)` (plpgsql) feeding the btree +/// operator class: neither plpgsql callers nor opclass support contexts can +/// EVER inline a SQL function, so as `LANGUAGE sql` these paid the per-call +/// SQL-function executor on every compared value (measured 3.5x the plpgsql +/// per-call cost; +43% end-to-end on ORE ordered index scans — see +/// cipherstash/benches#23). They are therefore plpgsql BY DESIGN, and must +/// stay: (a) plpgsql — a revert to LANGUAGE sql reintroduces the regression; +/// (b) IMMUTABLE; (c) UNPINNED, via the `eql-inline-critical` marker — a +/// `SET search_path` clause on plpgsql forces per-call configuration +/// switching in the same hot path. +#[sqlx::test] +async fn eql_v3_ore_block_256_opclass_helpers_are_plpgsql_and_unpinned(pool: PgPool) -> Result<()> { + let offenders: Vec<( + String, + Option, + Option, + Option, + Option, + )> = sqlx::query_as( + r#" + WITH expected(proname) AS ( + VALUES ('jsonb_array_to_bytea_array'), ('jsonb_array_to_ore_block_256') + ) + SELECT e.proname, + l.lanname::text, + p.provolatile::text, + d.description, + EXISTS ( + SELECT 1 FROM unnest(coalesce(p.proconfig, '{}'::text[])) c + WHERE c LIKE 'search_path=%' + ) AS pinned + FROM expected e + LEFT JOIN pg_catalog.pg_proc p + ON p.proname = e.proname + AND p.pronamespace = 'eql_v3_internal'::regnamespace + AND p.pronargs = 1 + AND p.proargtypes[0] = 'jsonb'::regtype + LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang + LEFT JOIN pg_catalog.pg_description d + ON d.objoid = p.oid AND d.classoid = 'pg_proc'::regclass + WHERE p.oid IS NULL + OR l.lanname IS DISTINCT FROM 'plpgsql' + OR p.provolatile IS DISTINCT FROM 'i' + OR d.description IS NULL + OR d.description NOT LIKE 'eql-inline-critical%' + OR EXISTS ( + SELECT 1 FROM unnest(coalesce(p.proconfig, '{}'::text[])) c + WHERE c LIKE 'search_path=%' + ) + ORDER BY e.proname + "#, + ) + .fetch_all(&pool) + .await?; + + assert!( + offenders.is_empty(), + "ore_block_256 opclass-path helpers must be plpgsql + IMMUTABLE + \ + marker-unpinned (issue #353) — offenders (proname, lang, volatility, \ + marker, pinned): {offenders:#?}" + ); + Ok(()) +} + #[sqlx::test] async fn every_inline_critical_eligible_domain_has_inline_critical_functions( pool: PgPool, From d8b7e6e914fa9cdc02f20ae491803f08337f229b Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 4 Jul 2026 13:08:44 +1000 Subject: [PATCH 501/599] docs(release): lockstep eql-bindings guidance + release-tasks design spec Extend the alpha runbook with a verified 'Releasing eql-bindings in lockstep' section (correcting the release-plz defaults: git_release_type and release_always both default such that a -alpha.N version publishes as a GitHub pre-release with no config change), point CLAUDE.md's release section at it, and capture the design for unified 'mise run release:*' tasks (release:eql / release:bindings / release:all) as a spec under docs/development/ (docs/superpowers/ is gitignored, so the spec is placed alongside releasing-an-alpha.md instead). --- CLAUDE.md | 2 + .../2026-07-04-release-tasks-design.md | 169 ++++++++++++++++++ docs/development/releasing-an-alpha.md | 86 +++++++++ 3 files changed, 257 insertions(+) create mode 100644 docs/development/2026-07-04-release-tasks-design.md diff --git a/CLAUDE.md b/CLAUDE.md index c7bcdb91e..c07b5c48e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -243,6 +243,8 @@ EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style ` - **Prerelease (alpha / beta / rc):** run `mise run release:preview` (`tasks/release/preview.sh`). It derives the next `eql--.` tag, does a clean build-verify of the v3 installer/uninstaller, and cuts the GitHub prerelease that triggers the release workflow. Use `--dry-run` first; `--target` defaults to the current branch. It deliberately does **not** touch `CHANGELOG.md` (previews keep entries under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**. - **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]`, which the workflow's `verify-changelog` job enforces. +The **`eql-bindings` crate** (published to crates.io by **release-plz** on merge to `main`, tagged `eql-bindings-v`) is generated from the same `eql-domains::CATALOG` as the SQL surface, so we release it in **version lockstep** with each `eql_v3` alpha (`eql-bindings-v3.0.0-alpha.N` ↔ `eql-3.0.0-alpha.N` on the same commit). This is a manual coordination procedure — the two release paths are otherwise decoupled. See the **"Releasing `eql-bindings` in lockstep"** section of `docs/development/releasing-an-alpha.md`. Note: release-plz publishes the *committed* `Cargo.toml` version verbatim and has no absolute-version config — pin with `release-plz set-version eql-bindings@`, never hand-edit the release PR. + ### When you make a user-facing change If your PR adds, changes, removes, deprecates, or fixes anything observable to a caller — new function, new operator, behaviour change, error message change, performance characteristic that callers might notice (e.g. an index now engages), changed default — **add an entry under `## [Unreleased]` in `CHANGELOG.md` as part of the same PR.** diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md new file mode 100644 index 000000000..37bec50cd --- /dev/null +++ b/docs/development/2026-07-04-release-tasks-design.md @@ -0,0 +1,169 @@ +# Design: unified `mise run release:*` tasks (SQL surface + `eql-bindings` crate) + +**Date:** 2026-07-04 +**Status:** Approved design, ready for implementation plan +**Scope:** Add mise tasks to release the two EQL artefacts individually and in lockstep, with a consistent API and approach. + +## Problem + +EQL ships two artefacts generated from the same `eql-domains::CATALOG`: + +1. The **SQL surface** — `release/cipherstash-encrypt.sql` (+ uninstaller), attached to a GitHub Release tagged `eql-`, built by `.github/workflows/release-eql.yml`. +2. The **`eql-bindings` crate** — published to crates.io by release-plz (`.github/workflows/release-plz.yml`), tagged `eql-bindings-v`. + +Today only the SQL side is scripted (`mise run release:preview` → `tasks/release/preview.sh`). The crate side is only documented as a manual procedure. We want: + +- A task to release **the SQL surface** alone. +- A task to release **the crate** alone. +- A task to release **both in version lockstep**, internally composing the two individual tasks. +- A **consistent API and approach** across all three. + +We release in lockstep so a published `eql-bindings-v3.0.0-alpha.N` always corresponds to the SQL surface tagged `eql-3.0.0-alpha.N` at the same commit — both are regenerated from the same catalog, so their versions must not diverge. + +### Hard constraint: alphas are cut from the `eql_v3` branch + +The v3 code is not yet on `main`. Alpha releases must be cut from the **`eql_v3`** branch. Once v3 merges, `main` becomes the release channel. Therefore **the branch/ref is a parameter, defaulting to the current branch** — no task changes when the channel moves from `eql_v3` to `main`. + +## Verified mechanism facts (load-bearing) + +These are verified against the actual tooling (release-plz source, the workflows in this repo, and `gh` against the live repo), not assumed: + +1. **The SQL release is fully local-driven.** `gh release create eql- --target ` is the entire trigger; `release-eql.yml` reacts on `release: published`, builds, and attaches artefacts. `--target` accepts any branch/commit, so cutting from `eql_v3` already works. `release-eql.yml`'s `verify-changelog` job is gated to `prerelease == false`, so prereleases keep their entries under `[Unreleased]`. + +2. **The crate publish happens in CI, not locally.** crates.io auth is OIDC Trusted Publishing (no `CARGO_REGISTRY_TOKEN`), so `cargo publish` cannot run from a laptop. The local task's job is to *initiate*; CI's `release` job publishes. + +3. **`release-plz release` is branch-agnostic.** Its `should_release()` / per-package logic publishes purely on `(version not on crates.io) && (git tag absent)`; there is no default-branch gate in the release path (`release_always` defaults `true`). It tags the **current HEAD** commit via the GitHub API and creates a GitHub Release, auto-marked as a pre-release for a `-alpha.N` version (default `git_release_type = auto`). **No release-plz config change is required.** + +4. **`workflow_dispatch --ref eql_v3` operates on `eql_v3`.** The `release-plz/action` is a composite action that does no internal re-checkout; it runs against whatever `actions/checkout` fetched, which under a dispatched ref is that ref. `fetch-depth: 0` (already set) is required for changelog/tag generation. + +5. **`main` is not branch-protected**, but we deliberately do not rely on direct-push-to-main; the ref-parameterised dispatch model is what generalises across branches. + +6. **release-plz publishes the committed `Cargo.toml` version verbatim** and has **no config field that sets an absolute version**. Pinning is done with `release-plz set-version eql-bindings@`. From a prerelease base, release-plz's default next bump is `-alpha.(N+1)`; to jump to a stable `3.0.0` you must `set-version` explicitly. + +### Required companion change (not a task, but in scope) + +`.github/workflows/release-plz.yml`'s `release-pr` job, when the workflow is dispatched from `eql_v3`, would open a release PR **based on `eql_v3`** (release-plz uses the checked-out branch as the PR base, verified in source). That is needless noise for an alpha. Gate it: + +```yaml +release-pr: + needs: release + if: github.ref == 'refs/heads/main' # skip on eql_v3 (and any non-main) dispatch +``` + +This is harmless on `main` (unchanged behaviour) and suppresses the stray PR on alpha dispatches. + +## Design + +### Consistent model + +Every task follows one lifecycle: + +> **resolve version identity → verify locally → initiate on `--ref` → CI completes → print watch command** + +`--ref` defaults to the current branch (`git rev-parse --abbrev-ref HEAD`). + +### Shared API + +All three tasks accept the identical flag set: + +| Flag | Meaning | Default | +|------|---------|---------| +| `--version` | base SemVer (the `` in the identity) | `3.0.0` | +| `--channel` | preview channel: `alpha` \| `beta` \| `rc` | `alpha` | +| `--pre` | exact prerelease identity (e.g. `3.0.0-alpha.2`), bypassing N-derivation | (derived) | +| `--ref` | branch or commit to release from | current branch | +| `--dry-run` | print the plan, create/publish nothing | off | + +The **canonical shared identity** is `-.`, e.g. `3.0.0-alpha.2`. From it: + +- SQL tag: `eql-` → `eql-3.0.0-alpha.2` +- Crate `Cargo.toml` version: `` → `3.0.0-alpha.2`; release-plz tag: `eql-bindings-v` → `eql-bindings-v3.0.0-alpha.2` + +**Same N ⇒ lockstep.** This preserves the current `eql--.` tag scheme that `preview.sh` already produces. + +### Shared library — the "consistent approach" backbone + +A sourced `tasks/release/_lib.sh` holds the logic common to all three tasks, so they cannot drift: + +- `channel` validation against the `alpha|beta|rc` allowlist. +- `gh` presence + `gh auth status` preflight. +- `--ref` defaulting to the current branch. +- **Identity derivation:** given `--version`/`--channel` (or an explicit `--pre`), compute the next `N`. For a single-artefact task, `N` is `1 + max(existing N for that artefact's tag namespace)`. For `release:all`, `N` is `1 + max(N across BOTH namespaces)` so the two never collide and stay aligned. +- Dry-run echo helpers. + +`preview.sh` already contains ~half of this inline; the refactor extracts it. + +### Task 1 — `release:eql` (SQL surface) + +**File:** `tasks/release/eql.sh` (this is today's `preview.sh`, renamed). + +1. Resolve identity, validate channel, preflight `gh`. +2. Verify the build: `mise run clean && mise run build --version eql-`; assert `release/cipherstash-encrypt.sql` and `-uninstall.sql` are non-empty. +3. Refuse if the `eql-` tag already exists. +4. `gh release create eql- --target --prerelease --title eql- --notes ""`. +5. Print `gh run watch` / `gh release view` hints. + +Reversible (a GitHub prerelease can be deleted). Does **not** touch `CHANGELOG.md`. + +### Task 2 — `release:bindings` (crate) + +**File:** `tasks/release/bindings.sh`. Two internal phases so `release:all` can interleave the SQL step between them: + +**prepare:** +1. Resolve identity, validate, preflight `gh`. +2. Verify the generated surface is in sync on this ref — `mise run types:check` and `mise run codegen:parity` must be clean (guarantees the published crate `src/v3` matches the shipped SQL surface). +3. Refuse if the `eql-bindings-v` tag already exists (release-plz is idempotent, but fail early with a clear message). +4. `release-plz set-version eql-bindings@` (edits `Cargo.toml` + crate `CHANGELOG.md`). +5. Commit (`release: eql-bindings `) and `git push origin ` — the commit must be on the remote before dispatch. + +**publish:** +6. `gh workflow run release-plz.yml --ref ` → CI's `release` job publishes to crates.io, tags `eql-bindings-v` on the pushed HEAD, and cuts a pre-release GitHub Release. +7. Print `gh run watch` hint. + +Standalone `release:bindings` runs prepare then publish back-to-back. Publish is **irreversible** (a crates.io version is burned even if yanked). + +`--dry-run` stops after printing the resolved identity and the `set-version` / dispatch commands it *would* run; it makes no commit, push, or dispatch. + +### Task 3 — `release:all` (lockstep) + +**File:** `tasks/release/all.sh`. Resolves **one** shared `N`, verifies once, then composes the individual tasks in an order that gives both tags the **same commit** with the irreversible step **last**: + +1. Resolve shared identity `-.` (max-N across both namespaces). +2. Verify once: drift gates (`types:check`, `codegen:parity`) + SQL clean build. Abort on any failure before mutating anything. +3. **`bindings.prepare`** — `set-version` + commit + push ``. The set-version commit is now HEAD (the release commit). +4. **`release:eql --ref --pre `** — SQL prerelease on the release commit (reversible). +5. **`bindings.publish --ref `** — dispatch release-plz (irreversible), tagging the same commit. +6. Print watch hints for both CI runs. + +Both `eql-` and `eql-bindings-v` end up on the one set-version commit. Rationale for ordering: the only tree delta between "before" and "after" the set-version commit is `Cargo.toml` + the crate changelog — neither affects the SQL surface — so tagging both on the release commit is exact. Doing the reversible SQL prerelease before the irreversible crate publish means a late failure never leaves a published crate without its SQL counterpart. + +`--dry-run` threads through to both children (no commit, tag, push, or dispatch). + +## Non-goals + +- **No final-release automation.** These tasks cut **prereleases** only (alpha/beta/rc). Promoting `[Unreleased]` → `[]` and cutting a non-prerelease stays the manual `CLAUDE.md` "Cutting a release" flow. (`release:eql` always passes `--prerelease`.) +- **No change to the crate's crates.io Trusted Publishing / OIDC setup**, GPG signing, or the `release`-before-`release-pr` ordering. +- **No auto-merge / branch-protection changes.** We use `workflow_dispatch`, not direct-push-to-main. +- **No `jsonb` domain surface work** (out of scope for the scalar materialiser generally). + +## Documentation updates (in scope for the implementation) + +- **`docs/development/releasing-an-alpha.md`** — replace the manual `set-version`/dispatch steps in the "Releasing `eql-bindings` in lockstep" section with the scripted tasks; **remove the incorrect `git_release_type = "auto"` one-time-config note** (default `auto` already marks `-alpha` GitHub releases as pre-releases — verified in release-plz source). Keep the caveats (no absolute-version config; prerelease auto-increments to `-alpha.(N+1)`; pin via `set-version`; idempotent re-runs). +- **`CLAUDE.md`** — update the release callout so `mise run release:preview` becomes `release:eql`, and add `release:bindings` / `release:all` to the "release is scripted" list. +- **Any reference to `release:preview`** (the rename) — grep and update. + +## Verification + +- **Dry-run each task** (`--dry-run`) and confirm the derived identity, resolved ref, and the exact commands it would run — with nothing mutated. +- **`release:eql`** end-to-end on `eql_v3`: confirm the GitHub prerelease appears with both `.sql` artefacts attached (existing behaviour, must survive the rename). +- **`release:bindings`** end-to-end on `eql_v3`: confirm the workflow dispatch runs the `release` job only (not `release-pr`), publishes to crates.io, and tags `eql-bindings-v` on the pushed commit. +- **`release:all`**: confirm both tags land on the **same** commit and the crate publish is the last irreversible action. +- **Idempotency:** re-running a task for an already-released identity fails fast (tag-exists guard) rather than double-publishing. + +## Open questions + +None blocking. Decisions locked during design: + +- **Rename `release:preview` → `release:eql`** for API symmetry (accept the doc churn). +- **Individual tasks are first-class**, not just internal helpers — SQL-only and bindings-only alphas are supported; `release:all` composes them. +- **`release-pr` job gated to `main`** as the one required workflow change. diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md index ceb1703d6..34e6d5e6c 100644 --- a/docs/development/releasing-an-alpha.md +++ b/docs/development/releasing-an-alpha.md @@ -112,6 +112,92 @@ psql "$DATABASE_URL" -c "\dn eql_v3" # eql_v3 schema present psql "$DATABASE_URL" -c "SELECT eql_v3.version();" # reports the released semver ``` +## Releasing `eql-bindings` in lockstep + +The `eql-bindings` crate (`crates/eql-bindings`, published to crates.io) and the SQL surface +ship from the **same generated source**: the crate's `src/v3` payload bindings and the +`cipherstash-encrypt.sql` installer are both regenerated from `eql-domains::CATALOG`. We release +them **in version lockstep** so a published `eql-bindings-v3.0.0-alpha.N` always corresponds to +the SQL surface tagged `eql-3.0.0-alpha.N` at the **same commit**. + +This is not automatic — the two release paths are deliberately decoupled (different triggers, tag +namespaces, and automation; see `release-plz.toml` and the guards in `release-eql.yml`). Lockstep +is a **manual coordination procedure** you follow per alpha. + +### How the crate is published + +`eql-bindings` is released by **release-plz** (`.github/workflows/release-plz.yml`), triggered by +**push to `main`** — *not* by any GitHub Release. release-plz opens/updates a "release PR"; merging +that PR publishes to crates.io (OIDC trusted publishing), creates the `eql-bindings-v` tag, +and cuts a GitHub Release. Two facts drive the lockstep procedure: + +- **`release-plz release` publishes the committed `Cargo.toml` version verbatim** — it does not bump + at release time. So the version you *commit* is the version that ships. +- **release-plz owns the version in the release PR.** It computes the next bump from conventional + commits (via the `next_version` crate). From a prerelease base it increments the prerelease + counter by default (`3.0.0-alpha.1` → `3.0.0-alpha.2`); it will **not** strip to `3.0.0` on its + own. There is **no config field that sets an absolute version** — you pin with `release-plz set-version`. + +### One-time config + +None required. The default `git_release_type = auto` already marks a `-alpha.N` version as a +GitHub *pre-release* (verified in release-plz source), and `publish` / `git_tag_enable` / +`git_release_enable` all default `true`. Note `release_always` also defaults `true`: the `release` +job publishes any committed `Cargo.toml` version not yet on crates.io on every push to `main` — the +release PR is release-plz's ergonomic path for *proposing* the bump, not a hard publish gate. + +### The lockstep procedure + +The SQL alpha number **N is the driver** (the SQL surface is the primary artefact). The crate +follows it. crates.io publishes are **irreversible** (a burned version can be yanked but never +reused), so we verify both sides, cut the reversible GitHub prerelease first, and merge the +irreversible crate publish last. + +1. **Decide N** — the next SQL alpha, e.g. tag `eql-3.0.0-alpha.2`. + +2. **Pin the crate version on the release commit** (crate is currently `0.1.0`; lockstep jumps it + to the matching semver): + ```bash + release-plz set-version eql-bindings@3.0.0-alpha.2 # edits Cargo.toml + crate CHANGELOG + ``` + Commit and push to `main`. **Verify the release PR shows `3.0.0-alpha.2`, not a recomputed + value** — if a later push regenerated it (e.g. to `-alpha.3`), re-run `set-version` on `main` to + reconverge. Do **not** rely on hand-editing the PR branch; a subsequent push can overwrite it. + +3. **Confirm the generated surface is in sync on that commit** — this is what guarantees the + published crate's `src/v3` matches the shipped `cipherstash-encrypt.sql`: + ```bash + mise run types:check # regenerate + git diff of crates/eql-bindings/src/v3, bindings/, schema/ + mise run codegen:parity # regenerate + git diff of the committed SQL scalar surface + ``` + Both must be clean. (They run in CI too, but check here before publishing anything irreversible.) + +4. **Cut the SQL prerelease** at that commit (reversible — a GitHub prerelease can be deleted). + Use an explicit `--tag` so the number matches the crate exactly: + ```bash + mise run release:preview --tag eql-3.0.0-alpha.2 --target + ``` + This clean-builds and verifies the v3 installer/uninstaller before creating the prerelease. + +5. **Merge the release-plz PR** (irreversible — publishes `eql-bindings-v3.0.0-alpha.2` to + crates.io, tags it, cuts its prerelease GitHub Release). + +Both tags — `eql-3.0.0-alpha.2` and `eql-bindings-v3.0.0-alpha.2` — now sit on one commit with +matching semver. + +### Caveats + +- **No absolute-version config knob.** Pinning is only via `release-plz set-version` / the committed + `Cargo.toml`. `release-plz.toml` has increment-*influencing* fields but nothing that sets a version. +- **No prerelease-increment strategy config.** The default from `-alpha.N` is `-alpha.(N+1)`. To jump + to stable `3.0.0`, run `set-version eql-bindings@3.0.0` explicitly — don't rely on the default. +- **The release PR keeps regenerating** on every `main` push. Pin on `main` (step 2), don't hand-edit + the PR branch — whether a PR-branch edit survives a regeneration is undocumented. +- **release-plz is idempotent** — re-running won't republish an already-published version, so a + failed later step won't double-publish an `-alpha.N` that already went out. +- There is **no upstream precedent** for alpha-pinning in cipherstash-suite's `RELEASING.md`; this + procedure extends its standard conventional-commit flow. + ## Promoting to a final release later When the alpha graduates to a real release, follow `CLAUDE.md` → **"Cutting a release"**: From 60ba7e984931bf93df296206fa5840ab4e791d5c Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Sat, 4 Jul 2026 13:16:19 +1000 Subject: [PATCH 502/599] fix(v3): inline the jsonb_entry CHECK; make the jsonb_query validator plpgsql MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Domain constraints cannot inline SQL functions, so eql_v3.jsonb_entry's CHECK calling eql_v3_internal.is_valid_ste_vec_entry_payload paid the per-call SQL-function executor (~18us) on every cast — the needle cast in every field_eq query, and the ENTIRE measured +19% v2->v3 regression on that scenario (cipherstash/benches#23). The CHECK now mirrors the validator body inline; the leading `VALUE IS NULL OR` preserves the validator's STRICT NULL-passes semantics (a bare COALESCE(..., false) would reject the NULL that `->` returns for a missing selector). Validated A->B->A on a live 100k bench database: 0.0287 -> 0.0137 -> 0.0285 ms/query in-DB, with validator calls dropping to zero. eql_v3.jsonb_query's CHECK CANNOT be inlined — validating the sv elements needs a subquery, which CHECK constraints forbid — so its validator is converted to plpgsql instead (cached plan vs the per-call SQL-function executor; the #353 finding), since the needle cast sits on the per-query hot path of every containment scenario. The eql_v3.json document CHECK is unchanged: it is part of the documented privilege contract (docs/reference/permissions.md, gated by v3_privilege_tests). permissions.md now notes the jsonb_entry cast no longer requires the internal grant; jsonb_query's still does. New family/jsonb_check tests: entry inline-CHECK <-> validator equivalence over a payload-shape corpus (accept/reject + NULL), a hardcoded accept/reject characterization for jsonb_query, and a language guard so a revert of the query validator to LANGUAGE sql fails CI. Closes #354 Claude-Session: https://claude.ai/code/session_01StQnoycoFXMDdSpQ6zKDav --- CHANGELOG.md | 2 + docs/reference/permissions.md | 7 +- src/v3/jsonb/types.sql | 48 +++++- .../encrypted_domain/family/jsonb_check.rs | 160 ++++++++++++++++++ .../sqlx/tests/encrypted_domain/family/mod.rs | 1 + 5 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index b439aa6e2..0dccba2f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,8 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). ### Fixed +- **`eql_v3.jsonb_entry` CHECK inlined; `jsonb_query` validator converted to plpgsql — removes SQL-function-executor overhead from the per-query needle casts.** Domain constraints cannot inline SQL functions, so `jsonb_entry`'s function-call CHECK paid ~18 µs on every cast — the needle cast in every `field_eq` query was the ENTIRE +19% v2→v3 regression on that scenario (in-DB 0.011 → 0.029 ms/query with identical `eq_term` costs; cipherstash/benches#23). The `jsonb_entry` CHECK now mirrors the validator body inline, with a leading `VALUE IS NULL OR` preserving STRICT NULL-passes semantics (equivalence pinned over a payload corpus by `jsonb_check::jsonb_entry_check_matches_validator`). `jsonb_query`'s CHECK cannot be inlined — validating sv elements needs a subquery, which CHECK constraints forbid — so `is_valid_ste_vec_query_payload` is plpgsql instead (cached plan vs per-call SQL-function executor; the #353 finding), guarded by `jsonb_check::jsonb_query_validator_is_plpgsql`. The `eql_v3.json` document CHECK — part of the documented privilege contract — is unchanged; `docs/reference/permissions.md` now notes the `jsonb_entry` cast requires no internal grant. ([#354](https://github.com/cipherstash/encrypt-query-language/issues/354)) + - **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.integer_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239)) - **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamp` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276)) diff --git a/docs/reference/permissions.md b/docs/reference/permissions.md index 10f12bfa0..5aa0f3307 100644 --- a/docs/reference/permissions.md +++ b/docs/reference/permissions.md @@ -73,9 +73,10 @@ Why the internal grant is needed even though you only call public objects: - The **ORE comparison** behind ordering and `MIN`/`MAX` calls pgcrypto `encrypt()`, which the installer places in the `extensions` schema — hence the `USAGE` there. -- **Casting raw jsonb to `eql_v3.json`** fires its domain `CHECK`, - `eql_v3_internal.is_valid_ste_vec_document_payload`. (Scalar domain CHECKs are - pure structural jsonb tests, so casting to a scalar domain needs no internal +- **Casting raw jsonb to `eql_v3.json` or `eql_v3.jsonb_query`** fires a + domain `CHECK` that calls an `eql_v3_internal.is_valid_*` validator. (Scalar + domain CHECKs — and, since issue #354, the `eql_v3.jsonb_entry` CHECK — are + pure structural jsonb tests, so casting to those domains needs no internal grant.) The hand-written jsonb containment **read** path (`eql_v3.ste_vec_contains` and diff --git a/src/v3/jsonb/types.sql b/src/v3/jsonb/types.sql index b4b919e9c..5023b5cc8 100644 --- a/src/v3/jsonb/types.sql +++ b/src/v3/jsonb/types.sql @@ -38,11 +38,18 @@ $$; --! @return boolean True when `val` is `{"sv":[...]}` and every element carries --! string `s`, no ciphertext, and exactly one string term (`hm` XOR --! `oc`). +--! @note plpgsql, not LANGUAGE sql (issues #353/#354): the only caller is the +--! eql_v3.jsonb_query domain CHECK, where a SQL function can never be +--! inlined (and the CHECK itself cannot absorb this body — it needs a +--! subquery over the sv elements, which CHECK constraints forbid). plpgsql +--! caches its plan across calls instead of paying the per-call SQL-function +--! executor on every needle cast. CREATE FUNCTION eql_v3_internal.is_valid_ste_vec_query_payload(val jsonb) RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE + LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT COALESCE( +BEGIN + RETURN COALESCE( jsonb_typeof(val) = 'object' AND jsonb_typeof(val -> 'sv') = 'array' AND NOT EXISTS ( @@ -62,7 +69,8 @@ AS $$ ), false) ), false - ) + ); +END; $$; --! @brief Validate a root SteVec document payload. @@ -119,9 +127,32 @@ CREATE DOMAIN eql_v3.json AS jsonb --! `i`/`v` merged in by `->`) are allowed. --! --! @see src/v3/jsonb/operators.sql +--! +--! @note The CHECK is an INLINE expression, not a call to +--! `eql_v3_internal.is_valid_ste_vec_entry_payload` (issue #354): domain +--! constraints cannot inline SQL functions, so the function-call form paid +--! the per-call SQL-function executor (~18 µs) on EVERY cast — the needle +--! cast in every field_eq query (+19% end-to-end vs v2, the entire measured +--! regression on that scenario; see cipherstash/benches#23). The expression +--! mirrors the validator body; the leading `VALUE IS NULL OR` preserves the +--! validator's STRICT NULL-passes semantics (a bare COALESCE(..., false) +--! would reject NULL, which `->` returns for a missing selector). Keep the +--! two in sync — `jsonb_entry_check_matches_validator` in +--! tests/sqlx pins the equivalence. CREATE DOMAIN eql_v3.jsonb_entry AS jsonb CHECK ( - eql_v3_internal.is_valid_ste_vec_entry_payload(VALUE) + VALUE IS NULL + OR COALESCE( + jsonb_typeof(VALUE) = 'object' + AND jsonb_typeof(VALUE -> 's') = 'string' + AND jsonb_typeof(VALUE -> 'c') = 'string' + AND ( + (jsonb_typeof(VALUE -> 'hm') = 'string' AND NOT (VALUE ? 'oc')) + OR + (jsonb_typeof(VALUE -> 'oc') = 'string' AND NOT (VALUE ? 'hm')) + ), + false + ) ); --! @brief Domain type for an STE-vec containment needle. @@ -135,6 +166,15 @@ CREATE DOMAIN eql_v3.jsonb_entry AS jsonb --! @note Construct from inline JSON via the DOMAIN cast: --! `'{"sv":[{"s":"","hm":""}]}'::eql_v3.jsonb_query`. --! @see eql_v3.to_ste_vec_query +--! +--! @note This CHECK CANNOT be inlined like eql_v3.jsonb_entry's (issue #354): +--! validating the sv elements requires a subquery +--! (`NOT EXISTS (SELECT ... FROM jsonb_array_elements(...))`), and CHECK +--! constraints forbid subqueries. The validator is plpgsql instead (cached +--! plan; substantially cheaper per call than a non-inlined LANGUAGE sql +--! function — the same finding as issue #353), since this cast sits on the +--! per-query hot path of every containment scenario +--! (`$1::jsonb::eql_v3.jsonb_query`). CREATE DOMAIN eql_v3.jsonb_query AS jsonb CHECK ( eql_v3_internal.is_valid_ste_vec_query_payload(VALUE) diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs new file mode 100644 index 000000000..0c18c6275 --- /dev/null +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs @@ -0,0 +1,160 @@ +//! Equivalence guards for the inline SteVec domain CHECK expressions +//! (issue #354). +//! +//! `eql_v3.jsonb_entry` carries an INLINE CHECK expression rather than +//! calling `eql_v3_internal.is_valid_ste_vec_entry_payload`: domain +//! constraints cannot inline SQL functions, so the function-call form paid +//! the per-call SQL-function executor on every cast — the needle cast in +//! every field_eq query, the ENTIRE measured +19% v2→v3 regression on that +//! scenario (cipherstash/benches#23). `jsonb_entry_check_matches_validator` +//! pins the inline expression to the validator (still the source of truth +//! for direct callers) over a corpus of payload shapes; the one intentional +//! divergence is SQL NULL, which both forms accept (the validator via +//! STRICT, the inline expression via a leading `VALUE IS NULL OR`). +//! +//! `eql_v3.jsonb_query`'s CHECK CANNOT be inlined — validating sv elements +//! needs a subquery, which CHECK constraints forbid — so its validator is +//! plpgsql instead (cached plan vs the per-call SQL-function executor; the +//! issue #353 finding). `jsonb_query_check_behaviour` characterises the +//! accept/reject matrix, and `jsonb_query_validator_is_plpgsql` guards the +//! language so a revert to LANGUAGE sql fails here. + +use anyhow::Result; +use sqlx::PgPool; + +/// Try the domain cast for `payload`; Ok(true) = accepted, Ok(false) = CHECK +/// rejection. Any non-CHECK error propagates. +async fn cast_accepts(pool: &PgPool, domain: &str, payload: Option<&str>) -> Result { + let sql = format!("SELECT ($1::jsonb)::{domain} IS NOT DISTINCT FROM $1::jsonb"); + match sqlx::query_scalar::<_, bool>(&sql) + .bind(payload) + .fetch_one(pool) + .await + { + Ok(_) => Ok(true), + Err(e) if e.to_string().contains("check constraint") => Ok(false), + Err(e) => Err(e.into()), + } +} + +/// The validator's verdict for `payload`, with the STRICT NULL-passes rule +/// applied (SQL NULL is accepted by the domain even though the validator +/// returns NULL for it). +async fn validator_accepts(pool: &PgPool, validator: &str, payload: Option<&str>) -> Result { + if payload.is_none() { + return Ok(true); + } + let sql = format!("SELECT eql_v3_internal.{validator}($1::jsonb)"); + Ok(sqlx::query_scalar::<_, bool>(&sql) + .bind(payload) + .fetch_one(pool) + .await?) +} + +async fn assert_equivalent( + pool: &PgPool, + domain: &str, + validator: &str, + candidates: &[Option<&str>], +) -> Result<()> { + for payload in candidates { + let cast = cast_accepts(pool, domain, *payload).await?; + let valid = validator_accepts(pool, validator, *payload).await?; + anyhow::ensure!( + cast == valid, + "{domain} inline CHECK diverges from {validator} for payload {payload:?}: \ + cast accepted = {cast}, validator = {valid}" + ); + } + Ok(()) +} + +#[sqlx::test] +async fn jsonb_entry_check_matches_validator(pool: PgPool) -> Result<()> { + let candidates: &[Option<&str>] = &[ + // SQL NULL — accepted by both forms (STRICT / VALUE IS NULL OR). + None, + // Valid: hm entry, oc entry, extra fields allowed. + Some(r#"{"s":"sel","c":"ct","hm":"h"}"#), + Some(r#"{"s":"sel","c":"ct","oc":"o"}"#), + Some(r#"{"s":"sel","c":"ct","hm":"h","a":true,"i":{},"v":3}"#), + // Invalid: missing s / missing c / both terms / neither term. + Some(r#"{"c":"ct","hm":"h"}"#), + Some(r#"{"s":"sel","hm":"h"}"#), + Some(r#"{"s":"sel","c":"ct","hm":"h","oc":"o"}"#), + Some(r#"{"s":"sel","c":"ct"}"#), + // Invalid: non-string term / non-string s / wrong jsonb types. + Some(r#"{"s":"sel","c":"ct","hm":1}"#), + Some(r#"{"s":1,"c":"ct","hm":"h"}"#), + Some(r#""scalar""#), + Some("5"), + Some("null"), + Some("[]"), + Some("{}"), + ]; + assert_equivalent( + &pool, + "eql_v3.jsonb_entry", + "is_valid_ste_vec_entry_payload", + candidates, + ) + .await +} + +#[sqlx::test] +async fn jsonb_query_check_behaviour(pool: PgPool) -> Result<()> { + // (payload, expected accept) — hardcoded verdicts: the CHECK calls the + // validator, so a validator-equivalence assertion would be tautological. + let candidates: &[(Option<&str>, bool)] = &[ + (None, true), + // Valid: single- and multi-entry needles; empty sv is valid. + (Some(r#"{"sv":[{"s":"sel","hm":"h"}]}"#), true), + ( + Some(r#"{"sv":[{"s":"a","hm":"h"},{"s":"b","oc":"o"}]}"#), + true, + ), + (Some(r#"{"sv":[]}"#), true), + // Invalid: element carries a ciphertext / both terms / neither term / + // missing s. + (Some(r#"{"sv":[{"s":"sel","hm":"h","c":"ct"}]}"#), false), + (Some(r#"{"sv":[{"s":"sel","hm":"h","oc":"o"}]}"#), false), + (Some(r#"{"sv":[{"s":"sel"}]}"#), false), + (Some(r#"{"sv":[{"hm":"h"}]}"#), false), + // Invalid: sv not an array / missing sv / non-object roots. + (Some(r#"{"sv":{"s":"sel","hm":"h"}}"#), false), + (Some("{}"), false), + (Some(r#""scalar""#), false), + (Some("null"), false), + (Some("[]"), false), + ]; + for (payload, expected) in candidates { + let cast = cast_accepts(&pool, "eql_v3.jsonb_query", *payload).await?; + anyhow::ensure!( + cast == *expected, + "eql_v3.jsonb_query cast verdict changed for {payload:?}: \ + accepted = {cast}, expected = {expected}" + ); + } + Ok(()) +} + +/// The jsonb_query validator must stay plpgsql: its only caller is the domain +/// CHECK (a context that can never inline a SQL function), so LANGUAGE sql +/// pays the per-call SQL-function executor on every containment-needle cast +/// (issues #353/#354). A revert fails here. +#[sqlx::test] +async fn jsonb_query_validator_is_plpgsql(pool: PgPool) -> Result<()> { + let lang: String = sqlx::query_scalar( + "SELECT l.lanname FROM pg_proc p \ + JOIN pg_language l ON l.oid = p.prolang \ + WHERE p.proname = 'is_valid_ste_vec_query_payload' \ + AND p.pronamespace = 'eql_v3_internal'::regnamespace", + ) + .fetch_one(&pool) + .await?; + anyhow::ensure!( + lang == "plpgsql", + "is_valid_ste_vec_query_payload must be plpgsql (got {lang})" + ); + Ok(()) +} diff --git a/tests/sqlx/tests/encrypted_domain/family/mod.rs b/tests/sqlx/tests/encrypted_domain/family/mod.rs index e74049aed..9d2570e4b 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mod.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mod.rs @@ -2,6 +2,7 @@ //! the encrypted-domain family (not integer-specific). pub mod inlinability; +pub mod jsonb_check; pub mod jsonb_operator_surface; pub mod mutations; pub mod sem; From ad93e29776ed1b0f881c4acdefadd87542476f3a Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Sat, 4 Jul 2026 13:21:30 +1000 Subject: [PATCH 503/599] docs: mark the CHECK implementation notes @internal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The jsonb_entry / jsonb_query domain doc blocks are public API docs (Doxygen renders src/ with INTERNAL_DOCS at its default NO), and the issue-#354 performance rationale added there is an internal concern — wrap it in @internal/@endinternal so the published docs keep only the user-facing contract. The #357-style notes on the internal validator functions were already excluded via their blocks' @internal tags. Claude-Session: https://claude.ai/code/session_01StQnoycoFXMDdSpQ6zKDav --- src/v3/jsonb/types.sql | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/v3/jsonb/types.sql b/src/v3/jsonb/types.sql index 5023b5cc8..12774ffb6 100644 --- a/src/v3/jsonb/types.sql +++ b/src/v3/jsonb/types.sql @@ -128,17 +128,19 @@ CREATE DOMAIN eql_v3.json AS jsonb --! --! @see src/v3/jsonb/operators.sql --! ---! @note The CHECK is an INLINE expression, not a call to ---! `eql_v3_internal.is_valid_ste_vec_entry_payload` (issue #354): domain ---! constraints cannot inline SQL functions, so the function-call form paid ---! the per-call SQL-function executor (~18 µs) on EVERY cast — the needle ---! cast in every field_eq query (+19% end-to-end vs v2, the entire measured ---! regression on that scenario; see cipherstash/benches#23). The expression ---! mirrors the validator body; the leading `VALUE IS NULL OR` preserves the ---! validator's STRICT NULL-passes semantics (a bare COALESCE(..., false) ---! would reject NULL, which `->` returns for a missing selector). Keep the ---! two in sync — `jsonb_entry_check_matches_validator` in ---! tests/sqlx pins the equivalence. +--! @internal +--! Implementation note (issue #354): the CHECK is an INLINE expression, not a +--! call to `eql_v3_internal.is_valid_ste_vec_entry_payload` — domain +--! constraints cannot inline SQL functions, so the function-call form paid +--! the per-call SQL-function executor (~18 µs) on EVERY cast: the needle +--! cast in every field_eq query (+19% end-to-end vs v2, the entire measured +--! regression on that scenario; see cipherstash/benches#23). The expression +--! mirrors the validator body; the leading `VALUE IS NULL OR` preserves the +--! validator's STRICT NULL-passes semantics (a bare COALESCE(..., false) +--! would reject NULL, which `->` returns for a missing selector). Keep the +--! two in sync — `jsonb_entry_check_matches_validator` in tests/sqlx pins +--! the equivalence. +--! @endinternal CREATE DOMAIN eql_v3.jsonb_entry AS jsonb CHECK ( VALUE IS NULL @@ -167,14 +169,16 @@ CREATE DOMAIN eql_v3.jsonb_entry AS jsonb --! `'{"sv":[{"s":"","hm":""}]}'::eql_v3.jsonb_query`. --! @see eql_v3.to_ste_vec_query --! ---! @note This CHECK CANNOT be inlined like eql_v3.jsonb_entry's (issue #354): ---! validating the sv elements requires a subquery ---! (`NOT EXISTS (SELECT ... FROM jsonb_array_elements(...))`), and CHECK ---! constraints forbid subqueries. The validator is plpgsql instead (cached ---! plan; substantially cheaper per call than a non-inlined LANGUAGE sql ---! function — the same finding as issue #353), since this cast sits on the ---! per-query hot path of every containment scenario ---! (`$1::jsonb::eql_v3.jsonb_query`). +--! @internal +--! Implementation note (issue #354): this CHECK CANNOT be inlined like +--! eql_v3.jsonb_entry's — validating the sv elements requires a subquery +--! (`NOT EXISTS (SELECT ... FROM jsonb_array_elements(...))`), and CHECK +--! constraints forbid subqueries. The validator is plpgsql instead (cached +--! plan; substantially cheaper per call than a non-inlined LANGUAGE sql +--! function — the same finding as issue #353), since this cast sits on the +--! per-query hot path of every containment scenario +--! (`$1::jsonb::eql_v3.jsonb_query`). +--! @endinternal CREATE DOMAIN eql_v3.jsonb_query AS jsonb CHECK ( eql_v3_internal.is_valid_ste_vec_query_payload(VALUE) From 03a3ebaa72ec794ccd63343321d11ff058b619b7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 4 Jul 2026 13:22:10 +1000 Subject: [PATCH 504/599] docs(release): harden release-tasks spec after design review Incorporate review findings into the release-tasks design: - derive N from REMOTE tags across BOTH namespaces for every task (fixes a lockstep-divergence hole and preview.sh's local-tag staleness) - local build verification uses the bare, CI-matching version string (CI strips eql-; preview.sh currently builds the prefixed tag) - bindings prepare requires a clean worktree and stages only the crate files, never git add -A - crate publish dispatches by branch (workflow_dispatch --ref is a branch/tag, not a SHA) with a remote-head SHA guard - release:all waits for release-eql.yml to succeed green before the irreversible crate publish, not merely after creating the prerelease - record the CI-native single-workflow alternative as the recommended longer-term evolution --- .../2026-07-04-release-tasks-design.md | 70 +++++++++++++------ 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md index 37bec50cd..f16644bd7 100644 --- a/docs/development/2026-07-04-release-tasks-design.md +++ b/docs/development/2026-07-04-release-tasks-design.md @@ -34,7 +34,7 @@ These are verified against the actual tooling (release-plz source, the workflows 3. **`release-plz release` is branch-agnostic.** Its `should_release()` / per-package logic publishes purely on `(version not on crates.io) && (git tag absent)`; there is no default-branch gate in the release path (`release_always` defaults `true`). It tags the **current HEAD** commit via the GitHub API and creates a GitHub Release, auto-marked as a pre-release for a `-alpha.N` version (default `git_release_type = auto`). **No release-plz config change is required.** -4. **`workflow_dispatch --ref eql_v3` operates on `eql_v3`.** The `release-plz/action` is a composite action that does no internal re-checkout; it runs against whatever `actions/checkout` fetched, which under a dispatched ref is that ref. `fetch-depth: 0` (already set) is required for changelog/tag generation. +4. **`workflow_dispatch --ref eql_v3` operates on `eql_v3`.** The `release-plz/action` is a composite action that does no internal re-checkout; it runs against whatever `actions/checkout` fetched, which under a dispatched ref is that ref. `fetch-depth: 0` (already set) is required for changelog/tag generation. **`--ref` is a branch/tag name, not a raw SHA** — so the task dispatches by branch and guards the branch-head SHA separately (see Release-safety invariants). It tags whatever commit the branch head points at, hence the guard. 5. **`main` is not branch-protected**, but we deliberately do not rely on direct-push-to-main; the ref-parameterised dispatch model is what generalises across branches. @@ -88,19 +88,29 @@ A sourced `tasks/release/_lib.sh` holds the logic common to all three tasks, so - `channel` validation against the `alpha|beta|rc` allowlist. - `gh` presence + `gh auth status` preflight. - `--ref` defaulting to the current branch. -- **Identity derivation:** given `--version`/`--channel` (or an explicit `--pre`), compute the next `N`. For a single-artefact task, `N` is `1 + max(existing N for that artefact's tag namespace)`. For `release:all`, `N` is `1 + max(N across BOTH namespaces)` so the two never collide and stay aligned. +- **Identity derivation from REMOTE tags, across BOTH namespaces, for every task.** Release tags are created remotely (`gh release create` for SQL; the GitHub API via release-plz for the crate), so local tags are unreliable/stale. The lib first refreshes remote tag state (`git ls-remote --tags origin`, or `git fetch --tags --prune`), then computes `N = 1 + max(N across the SQL `eql--.N` namespace AND the crate `eql-bindings-v-.N` namespace)`. **All tasks derive across both namespaces** — including single-artefact ones — so a bindings-only release can never pick an `N` that collides with or trails the SQL namespace (or vice versa). This directly upholds the lockstep invariant; the previous "derive from your own namespace" rule is rejected because it permits divergence (`eql-bindings-v…-alpha.2` published while `eql-…-alpha.5` exists). An explicit `--pre` bypasses derivation entirely. +- **Tag-exists guards query remote too**, not just local tags, for the same staleness reason. - Dry-run echo helpers. -`preview.sh` already contains ~half of this inline; the refactor extracts it. +`preview.sh` currently derives `N` from **local** `git tag --list` (line 46) — a latent staleness bug the refactor fixes by moving to remote derivation. + +### Release-safety invariants (apply to all tasks) + +These cross-cutting rules live in `_lib.sh` and are non-negotiable — the review that shaped this spec flagged each as a real hole: + +1. **Remote-derived versions & guards** (above): never trust local tags for `N` or existence checks. +2. **Local build verification matches CI's version string exactly.** CI builds with the `eql-`-stripped identity (`mise run build --version "${TAG#eql-}"`, `release-eql.yml`), so the local verify must also build with the **bare** `` (e.g. `3.0.0-alpha.2`), NOT `eql-`. `preview.sh` currently build-verifies the prefixed tag (line 67) — a mismatch that would miss version-string regressions; the refactor corrects it. +3. **Clean worktree + constrained staging before any commit.** The bindings prepare step must fail if the worktree has uncommitted/untracked changes to release-relevant paths, and must stage **only** `crates/eql-bindings/Cargo.toml`, `crates/eql-bindings/CHANGELOG.md`, and `Cargo.lock` (if `set-version` touched it) — never a blanket `git add -A` that could sweep unrelated work into a release commit. +4. **Dispatch by branch ref with a remote-head SHA guard.** `gh workflow run --ref` takes a **branch or tag name, not a raw SHA** (verified). So crate publish dispatches on the **branch** (`--ref `), but immediately before dispatching, assert `git ls-remote origin refs/heads/` still equals the intended release SHA. If another push moved the branch head, abort rather than publish an unintended commit. (The SQL side has no such constraint: `gh release create --target` *does* accept a full SHA, so the SQL tag pins the exact release commit directly.) ### Task 1 — `release:eql` (SQL surface) **File:** `tasks/release/eql.sh` (this is today's `preview.sh`, renamed). -1. Resolve identity, validate channel, preflight `gh`. -2. Verify the build: `mise run clean && mise run build --version eql-`; assert `release/cipherstash-encrypt.sql` and `-uninstall.sql` are non-empty. -3. Refuse if the `eql-` tag already exists. -4. `gh release create eql- --target --prerelease --title eql- --notes ""`. +1. Resolve identity (remote-derived N), validate channel, preflight `gh`. +2. Verify the build with the **bare** identity to match CI: `mise run clean && mise run build --version ` (e.g. `3.0.0-alpha.2`, NOT `eql-3.0.0-alpha.2`); assert `release/cipherstash-encrypt.sql` and `-uninstall.sql` are non-empty. +3. Refuse if the `eql-` tag already exists **on the remote**. +4. `gh release create eql- --target --prerelease --title eql- --notes ""`. (`--target` accepts a full SHA, used by `release:all` to pin the exact release commit.) 5. Print `gh run watch` / `gh release view` hints. Reversible (a GitHub prerelease can be deleted). Does **not** touch `CHANGELOG.md`. @@ -110,15 +120,17 @@ Reversible (a GitHub prerelease can be deleted). Does **not** touch `CHANGELOG.m **File:** `tasks/release/bindings.sh`. Two internal phases so `release:all` can interleave the SQL step between them: **prepare:** -1. Resolve identity, validate, preflight `gh`. -2. Verify the generated surface is in sync on this ref — `mise run types:check` and `mise run codegen:parity` must be clean (guarantees the published crate `src/v3` matches the shipped SQL surface). -3. Refuse if the `eql-bindings-v` tag already exists (release-plz is idempotent, but fail early with a clear message). -4. `release-plz set-version eql-bindings@` (edits `Cargo.toml` + crate `CHANGELOG.md`). -5. Commit (`release: eql-bindings `) and `git push origin ` — the commit must be on the remote before dispatch. +1. Resolve identity (remote-derived N), validate, preflight `gh`. +2. **Require a clean worktree** for release-relevant paths (fail on uncommitted/untracked changes under `crates/eql-bindings/` or the lockfile) so nothing unrelated is swept into the release commit. +3. Verify the generated surface is in sync on this ref — `mise run types:check` and `mise run codegen:parity` must be clean (guarantees the published crate `src/v3` matches the shipped SQL surface). +4. Refuse if the `eql-bindings-v` tag already exists **on the remote** (release-plz is idempotent, but fail early with a clear message). +5. `release-plz set-version eql-bindings@` (edits `Cargo.toml` + crate `CHANGELOG.md`). +6. **Stage only** `crates/eql-bindings/Cargo.toml`, `crates/eql-bindings/CHANGELOG.md`, and `Cargo.lock` (if `set-version` changed it) — never `git add -A`. Commit (`release: eql-bindings `) and `git push origin `; the commit must be on the remote before dispatch. Record the pushed SHA. **publish:** -6. `gh workflow run release-plz.yml --ref ` → CI's `release` job publishes to crates.io, tags `eql-bindings-v` on the pushed HEAD, and cuts a pre-release GitHub Release. -7. Print `gh run watch` hint. +7. **SHA guard:** assert `git ls-remote origin refs/heads/` still equals the SHA recorded in step 6; abort if the branch head moved. +8. Dispatch **by branch** (`--ref` takes a branch/tag, not a SHA): `gh workflow run release-plz.yml --ref ` → CI's `release` job publishes to crates.io, tags `eql-bindings-v` on that commit, and cuts a pre-release GitHub Release. +9. Print `gh run watch` hint. Standalone `release:bindings` runs prepare then publish back-to-back. Publish is **irreversible** (a crates.io version is burned even if yanked). @@ -128,14 +140,15 @@ Standalone `release:bindings` runs prepare then publish back-to-back. Publish is **File:** `tasks/release/all.sh`. Resolves **one** shared `N`, verifies once, then composes the individual tasks in an order that gives both tags the **same commit** with the irreversible step **last**: -1. Resolve shared identity `-.` (max-N across both namespaces). -2. Verify once: drift gates (`types:check`, `codegen:parity`) + SQL clean build. Abort on any failure before mutating anything. -3. **`bindings.prepare`** — `set-version` + commit + push ``. The set-version commit is now HEAD (the release commit). -4. **`release:eql --ref --pre `** — SQL prerelease on the release commit (reversible). -5. **`bindings.publish --ref `** — dispatch release-plz (irreversible), tagging the same commit. -6. Print watch hints for both CI runs. +1. Resolve shared identity `-.` (remote-derived, max-N across both namespaces). +2. Verify once: drift gates (`types:check`, `codegen:parity`) + SQL clean build with the **bare** identity. Abort on any failure before mutating anything. +3. **`bindings.prepare`** — clean-worktree check → `set-version` → stage only the crate files → commit → push ``. **Record the pushed SHA** `S`; this is the release commit. +4. **`release:eql --target S --pre `** — SQL prerelease pinned to `S` by full SHA (reversible; `gh release create --target` accepts a SHA). +5. **Wait for the `release-eql.yml` run to succeed** — `gh run watch` the triggered run until it completes green, confirming the SQL artefacts actually built and attached. **Do not proceed on failure.** (Creating the GitHub prerelease only *triggers* the build; the irreversible crate publish must wait for confirmed SQL success, not merely a created release.) +6. **`bindings.publish --ref `** — SHA guard (`ls-remote` head == `S`) → dispatch release-plz by branch (irreversible), tagging the same commit `S`. +7. Print watch hints for both CI runs. -Both `eql-` and `eql-bindings-v` end up on the one set-version commit. Rationale for ordering: the only tree delta between "before" and "after" the set-version commit is `Cargo.toml` + the crate changelog — neither affects the SQL surface — so tagging both on the release commit is exact. Doing the reversible SQL prerelease before the irreversible crate publish means a late failure never leaves a published crate without its SQL counterpart. +Both `eql-` and `eql-bindings-v` end up on the one set-version commit `S`. Rationale for ordering: the only tree delta introduced by the set-version commit is `Cargo.toml` + the crate changelog (+ maybe the lockfile) — none of which affect the SQL surface — so pinning the SQL tag to `S` and letting release-plz tag `S` is exact. The reversible SQL prerelease goes first **and is confirmed green** before the irreversible crate publish, so no failure path leaves a published crate without a working SQL counterpart. `--dry-run` threads through to both children (no commit, tag, push, or dispatch). @@ -155,10 +168,19 @@ Both `eql-` and `eql-bindings-v` end up on the one set-versi ## Verification - **Dry-run each task** (`--dry-run`) and confirm the derived identity, resolved ref, and the exact commands it would run — with nothing mutated. +- **Remote-derivation:** create a remote-only tag the local clone doesn't have, then confirm `N` derivation and the tag-exists guard both see it (i.e. local staleness can't cause a collision). +- **Cross-namespace N:** with `eql-…-alpha.5` present but no crate alpha tag, confirm `release:bindings` derives `alpha.6` (not `alpha.1`). +- **Version-string parity:** confirm the local verify build uses the bare `` and that `eql_v3.version()` in the built artefact matches what CI would produce. +- **Clean-worktree guard:** with a stray edit under `crates/eql-bindings/`, confirm `release:bindings` prepare aborts and stages nothing. +- **SHA guard:** simulate a branch-head move between prepare and publish; confirm dispatch aborts. - **`release:eql`** end-to-end on `eql_v3`: confirm the GitHub prerelease appears with both `.sql` artefacts attached (existing behaviour, must survive the rename). - **`release:bindings`** end-to-end on `eql_v3`: confirm the workflow dispatch runs the `release` job only (not `release-pr`), publishes to crates.io, and tags `eql-bindings-v` on the pushed commit. -- **`release:all`**: confirm both tags land on the **same** commit and the crate publish is the last irreversible action. -- **Idempotency:** re-running a task for an already-released identity fails fast (tag-exists guard) rather than double-publishing. +- **`release:all`**: confirm both tags land on the **same** commit `S`, that the SQL CI run is awaited green before the crate dispatch, and that the crate publish is the last irreversible action. +- **Idempotency:** re-running a task for an already-released identity fails fast (remote tag-exists guard) rather than double-publishing. + +## Alternatives considered + +**A single `workflow_dispatch` "alpha release" GitHub Actions workflow** with inputs (version, channel), doing the whole sequence — version pin, commit, SQL release, crate publish — inside CI. This is **more auditable and insensitive to laptop state** (no dependence on the operator's local tags, worktree cleanliness, or branch head), which addresses the root concern behind every safeguard above rather than patching each locally. It is deferred because it is a **larger change** (a new workflow that mutates the repo and orchestrates two publish paths, with its own secrets/permissions surface) and because the mise-task entrypoints are wanted as the operator-facing interface regardless. The safeguards in this spec make the local-orchestration form solid in the interim; **the CI-native workflow is the recommended evolution** once the task API has settled, and the mise tasks could then become thin wrappers that trigger it. ## Open questions @@ -167,3 +189,5 @@ None blocking. Decisions locked during design: - **Rename `release:preview` → `release:eql`** for API symmetry (accept the doc churn). - **Individual tasks are first-class**, not just internal helpers — SQL-only and bindings-only alphas are supported; `release:all` composes them. - **`release-pr` job gated to `main`** as the one required workflow change. + +A design review hardened the orchestration against local-state hazards: remote-tag derivation, cross-namespace `N`, clean-worktree + constrained staging, branch-dispatch with a SHA guard, CI-success wait before the irreversible crate publish, and CI-matching build version. These are captured as **Release-safety invariants** and folded into each task above; several also fix latent bugs in today's `preview.sh` (local-tag `N`, prefixed build version). The **CI-native single-workflow** form (see Alternatives) remains the recommended longer-term evolution. From 889efbda3414445d4f1e92cf6577e2c9b154964c Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 4 Jul 2026 13:46:55 +1000 Subject: [PATCH 505/599] docs(release): rework release-tasks spec to CI-native architecture Flip the design so orchestration runs server-side in a workflow_dispatch coordinator (release-alpha.yml) and the mise run release:* tasks become thin triggers (gh workflow run + gh run watch). CI's clean checkout, single actor, and concurrency group eliminate the laptop-orchestration safeguards (remote-tag derivation, clean-worktree check, SHA guard, CI-matching build string) rather than implementing them. Same-commit lockstep and 'SQL green before crate publish' become plain step order in one runner. Records the two implementation decisions (SQL-build factoring; crate-publish invocation) and the future protected-main constraint. --- .../2026-07-04-release-tasks-design.md | 221 +++++++----------- 1 file changed, 79 insertions(+), 142 deletions(-) diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md index f16644bd7..e3ff8fa0f 100644 --- a/docs/development/2026-07-04-release-tasks-design.md +++ b/docs/development/2026-07-04-release-tasks-design.md @@ -1,8 +1,8 @@ -# Design: unified `mise run release:*` tasks (SQL surface + `eql-bindings` crate) +# Design: CI-native alpha releases (SQL surface + `eql-bindings` crate) **Date:** 2026-07-04 -**Status:** Approved design, ready for implementation plan -**Scope:** Add mise tasks to release the two EQL artefacts individually and in lockstep, with a consistent API and approach. +**Status:** Approved design (CI-native), ready for implementation plan +**Scope:** Release the two EQL artefacts — individually and in version lockstep — from a single `workflow_dispatch` GitHub Actions workflow, with thin `mise run release:*` tasks that only *trigger and watch* CI. ## Problem @@ -11,183 +11,120 @@ EQL ships two artefacts generated from the same `eql-domains::CATALOG`: 1. The **SQL surface** — `release/cipherstash-encrypt.sql` (+ uninstaller), attached to a GitHub Release tagged `eql-`, built by `.github/workflows/release-eql.yml`. 2. The **`eql-bindings` crate** — published to crates.io by release-plz (`.github/workflows/release-plz.yml`), tagged `eql-bindings-v`. -Today only the SQL side is scripted (`mise run release:preview` → `tasks/release/preview.sh`). The crate side is only documented as a manual procedure. We want: +We want to cut alpha (prerelease) versions of **the SQL surface alone**, **the crate alone**, and **both in version lockstep**, with a consistent interface. -- A task to release **the SQL surface** alone. -- A task to release **the crate** alone. -- A task to release **both in version lockstep**, internally composing the two individual tasks. -- A **consistent API and approach** across all three. +We release in lockstep so a published `eql-bindings-v3.0.0-alpha.N` always corresponds to the SQL surface tagged `eql-3.0.0-alpha.N` at the **same commit** — both are regenerated from the same catalog, so their versions must not diverge. -We release in lockstep so a published `eql-bindings-v3.0.0-alpha.N` always corresponds to the SQL surface tagged `eql-3.0.0-alpha.N` at the same commit — both are regenerated from the same catalog, so their versions must not diverge. +### Decision: CI-native, not laptop-orchestrated -### Hard constraint: alphas are cut from the `eql_v3` branch - -The v3 code is not yet on `main`. Alpha releases must be cut from the **`eql_v3`** branch. Once v3 merges, `main` becomes the release channel. Therefore **the branch/ref is a parameter, defaulting to the current branch** — no task changes when the channel moves from `eql_v3` to `main`. - -## Verified mechanism facts (load-bearing) - -These are verified against the actual tooling (release-plz source, the workflows in this repo, and `gh` against the live repo), not assumed: - -1. **The SQL release is fully local-driven.** `gh release create eql- --target ` is the entire trigger; `release-eql.yml` reacts on `release: published`, builds, and attaches artefacts. `--target` accepts any branch/commit, so cutting from `eql_v3` already works. `release-eql.yml`'s `verify-changelog` job is gated to `prerelease == false`, so prereleases keep their entries under `[Unreleased]`. - -2. **The crate publish happens in CI, not locally.** crates.io auth is OIDC Trusted Publishing (no `CARGO_REGISTRY_TOKEN`), so `cargo publish` cannot run from a laptop. The local task's job is to *initiate*; CI's `release` job publishes. - -3. **`release-plz release` is branch-agnostic.** Its `should_release()` / per-package logic publishes purely on `(version not on crates.io) && (git tag absent)`; there is no default-branch gate in the release path (`release_always` defaults `true`). It tags the **current HEAD** commit via the GitHub API and creates a GitHub Release, auto-marked as a pre-release for a `-alpha.N` version (default `git_release_type = auto`). **No release-plz config change is required.** - -4. **`workflow_dispatch --ref eql_v3` operates on `eql_v3`.** The `release-plz/action` is a composite action that does no internal re-checkout; it runs against whatever `actions/checkout` fetched, which under a dispatched ref is that ref. `fetch-depth: 0` (already set) is required for changelog/tag generation. **`--ref` is a branch/tag name, not a raw SHA** — so the task dispatches by branch and guards the branch-head SHA separately (see Release-safety invariants). It tags whatever commit the branch head points at, hence the guard. - -5. **`main` is not branch-protected**, but we deliberately do not rely on direct-push-to-main; the ref-parameterised dispatch model is what generalises across branches. - -6. **release-plz publishes the committed `Cargo.toml` version verbatim** and has **no config field that sets an absolute version**. Pinning is done with `release-plz set-version eql-bindings@`. From a prerelease base, release-plz's default next bump is `-alpha.(N+1)`; to jump to a stable `3.0.0` you must `set-version` explicitly. - -### Required companion change (not a task, but in scope) - -`.github/workflows/release-plz.yml`'s `release-pr` job, when the workflow is dispatched from `eql_v3`, would open a release PR **based on `eql_v3`** (release-plz uses the checked-out branch as the PR base, verified in source). That is needless noise for an alpha. Gate it: - -```yaml -release-pr: - needs: release - if: github.ref == 'refs/heads/main' # skip on eql_v3 (and any non-main) dispatch -``` +The orchestration runs **in GitHub Actions**, triggered by `workflow_dispatch`. The `mise run release:*` tasks do nothing but call `gh workflow run … && gh run watch`. -This is harmless on `main` (unchanged behaviour) and suppresses the stray PR on alpha dispatches. +The rejected alternative was a laptop-driven bash orchestrator (`mise` task pins the version, commits, pushes, cuts the SQL release, dispatches the crate publish). It required a stack of defensive safeguards — remote-tag derivation, clean-worktree checks, a branch-head SHA guard, "build with the exact string CI uses" — **all of which exist only because a laptop is an unreliable conductor.** CI removes the root cause: -## Design +| Laptop hazard | Safeguard it needed | CI-native outcome | +|---|---|---| +| Local tags go stale | derive `N` from remote tags | checkout fetches remote tags fresh — no staleness | +| Dirty/leftover worktree | clean-worktree check + constrained staging | runner checkout is always clean | +| Concurrent push races the release | `ls-remote` SHA guard before dispatch | single actor; a concurrency group serialises runs | +| Local build ≠ CI build | build with the `eql-`-stripped identity to match | the build **is** the CI build | -### Consistent model +So CI-native is not "the same work plus a workflow" — it's *less* work, because the safeguards become unnecessary. -Every task follows one lifecycle: - -> **resolve version identity → verify locally → initiate on `--ref` → CI completes → print watch command** - -`--ref` defaults to the current branch (`git rev-parse --abbrev-ref HEAD`). - -### Shared API - -All three tasks accept the identical flag set: - -| Flag | Meaning | Default | -|------|---------|---------| -| `--version` | base SemVer (the `` in the identity) | `3.0.0` | -| `--channel` | preview channel: `alpha` \| `beta` \| `rc` | `alpha` | -| `--pre` | exact prerelease identity (e.g. `3.0.0-alpha.2`), bypassing N-derivation | (derived) | -| `--ref` | branch or commit to release from | current branch | -| `--dry-run` | print the plan, create/publish nothing | off | - -The **canonical shared identity** is `-.`, e.g. `3.0.0-alpha.2`. From it: - -- SQL tag: `eql-` → `eql-3.0.0-alpha.2` -- Crate `Cargo.toml` version: `` → `3.0.0-alpha.2`; release-plz tag: `eql-bindings-v` → `eql-bindings-v3.0.0-alpha.2` +### Hard constraint: alphas are cut from the `eql_v3` branch -**Same N ⇒ lockstep.** This preserves the current `eql--.` tag scheme that `preview.sh` already produces. +The v3 code is not yet on `main`. Alphas are cut from **`eql_v3`**; once v3 merges, `main` becomes the channel. The workflow **runs on the dispatched ref**, so the branch is just the `--ref` of the dispatch — `eql_v3` now, `main` later. (Main-channel branch protection is a future constraint; see [Future: the `main` channel](#future-the-main-channel).) -### Shared library — the "consistent approach" backbone +## Verified mechanism facts (load-bearing) -A sourced `tasks/release/_lib.sh` holds the logic common to all three tasks, so they cannot drift: +Verified against release-plz source, the workflows in this repo, and `gh` against the live repo: -- `channel` validation against the `alpha|beta|rc` allowlist. -- `gh` presence + `gh auth status` preflight. -- `--ref` defaulting to the current branch. -- **Identity derivation from REMOTE tags, across BOTH namespaces, for every task.** Release tags are created remotely (`gh release create` for SQL; the GitHub API via release-plz for the crate), so local tags are unreliable/stale. The lib first refreshes remote tag state (`git ls-remote --tags origin`, or `git fetch --tags --prune`), then computes `N = 1 + max(N across the SQL `eql--.N` namespace AND the crate `eql-bindings-v-.N` namespace)`. **All tasks derive across both namespaces** — including single-artefact ones — so a bindings-only release can never pick an `N` that collides with or trails the SQL namespace (or vice versa). This directly upholds the lockstep invariant; the previous "derive from your own namespace" rule is rejected because it permits divergence (`eql-bindings-v…-alpha.2` published while `eql-…-alpha.5` exists). An explicit `--pre` bypasses derivation entirely. -- **Tag-exists guards query remote too**, not just local tags, for the same staleness reason. -- Dry-run echo helpers. +1. **`release-plz release` is branch-agnostic.** It publishes purely on `(version not on crates.io) && (git tag absent)` — no default-branch gate (`release_always` defaults `true`). It tags the **current HEAD** via the GitHub API and cuts a GitHub Release, auto-marked pre-release for a `-alpha.N` version (default `git_release_type = auto`). **No release-plz config change is required** to publish an alpha from `eql_v3`. +2. **The crate publish must happen in CI.** crates.io auth is OIDC Trusted Publishing (no `CARGO_REGISTRY_TOKEN`), so `cargo publish` cannot run off-CI — reinforcing the CI-native decision. +3. **release-plz publishes the committed `Cargo.toml` version verbatim** and has **no config field that sets an absolute version**. Pinning is `release-plz set-version eql-bindings@`. From a prerelease base its default next bump is `-alpha.(N+1)`; jumping to stable `3.0.0` needs an explicit `set-version`. +4. **The SQL release trigger is a published GitHub Release.** `release-eql.yml` reacts on `release: published`, builds, and attaches the two `.sql` artefacts. It builds with the `eql-`-stripped identity (`mise run build --version "${TAG#eql-}"`), so `eql_v3.version()` reports bare semver. Its `verify-changelog` job is gated to `prerelease == false`, so alphas keep their entries under `[Unreleased]`. +5. **`workflow_dispatch --ref ` runs the workflow on that branch** (`--ref` is a branch/tag name, not a raw SHA). A checkout with `fetch-depth: 0` gives the workflow full history + all remote tags. -`preview.sh` currently derives `N` from **local** `git tag --list` (line 46) — a latent staleness bug the refactor fixes by moving to remote derivation. +## Architecture -### Release-safety invariants (apply to all tasks) +Two layers: a **coordinator workflow** (does everything, server-side) and **thin mise triggers**. -These cross-cutting rules live in `_lib.sh` and are non-negotiable — the review that shaped this spec flagged each as a real hole: +### The coordinator workflow — `.github/workflows/release-alpha.yml` -1. **Remote-derived versions & guards** (above): never trust local tags for `N` or existence checks. -2. **Local build verification matches CI's version string exactly.** CI builds with the `eql-`-stripped identity (`mise run build --version "${TAG#eql-}"`, `release-eql.yml`), so the local verify must also build with the **bare** `` (e.g. `3.0.0-alpha.2`), NOT `eql-`. `preview.sh` currently build-verifies the prefixed tag (line 67) — a mismatch that would miss version-string regressions; the refactor corrects it. -3. **Clean worktree + constrained staging before any commit.** The bindings prepare step must fail if the worktree has uncommitted/untracked changes to release-relevant paths, and must stage **only** `crates/eql-bindings/Cargo.toml`, `crates/eql-bindings/CHANGELOG.md`, and `Cargo.lock` (if `set-version` touched it) — never a blanket `git add -A` that could sweep unrelated work into a release commit. -4. **Dispatch by branch ref with a remote-head SHA guard.** `gh workflow run --ref` takes a **branch or tag name, not a raw SHA** (verified). So crate publish dispatches on the **branch** (`--ref `), but immediately before dispatching, assert `git ls-remote origin refs/heads/` still equals the intended release SHA. If another push moved the branch head, abort rather than publish an unintended commit. (The SQL side has no such constraint: `gh release create --target` *does* accept a full SHA, so the SQL tag pins the exact release commit directly.) +`on: workflow_dispatch`, running on the dispatched ref. Inputs: -### Task 1 — `release:eql` (SQL surface) +| Input | Meaning | Default | +|-------|---------|---------| +| `target` | `eql` \| `bindings` \| `all` — which artefact(s) to release | `all` | +| `version` | base SemVer | `3.0.0` | +| `channel` | `alpha` \| `beta` \| `rc` | `alpha` | +| `pre` | exact prerelease identity (e.g. `3.0.0-alpha.2`), bypassing `N` derivation | (derived) | +| `dry_run` | resolve + verify + print the plan; mutate nothing | `false` | -**File:** `tasks/release/eql.sh` (this is today's `preview.sh`, renamed). +`concurrency: { group: release, cancel-in-progress: false }` — serialises all release runs (and must share a group with `release-plz.yml`'s crate-publish path so the two never race a tag/publish). -1. Resolve identity (remote-derived N), validate channel, preflight `gh`. -2. Verify the build with the **bare** identity to match CI: `mise run clean && mise run build --version ` (e.g. `3.0.0-alpha.2`, NOT `eql-3.0.0-alpha.2`); assert `release/cipherstash-encrypt.sql` and `-uninstall.sql` are non-empty. -3. Refuse if the `eql-` tag already exists **on the remote**. -4. `gh release create eql- --target --prerelease --title eql- --notes ""`. (`--target` accepts a full SHA, used by `release:all` to pin the exact release commit.) -5. Print `gh run watch` / `gh release view` hints. +**Sequence** (a step is skipped when `target` excludes its artefact): -Reversible (a GitHub prerelease can be deleted). Does **not** touch `CHANGELOG.md`. +1. **Resolve identity.** Checkout (`fetch-depth: 0`) → tags are fresh. `identity = pre` if given, else `-.` where `N = 1 + max(N across BOTH tag namespaces: SQL `eql--.N` and crate `eql-bindings-v-.N`)`. Deriving across **both** namespaces (even for a single-artefact release) is what keeps them from diverging — a bindings-only release can never pick an `N` that trails or collides with the SQL namespace. Fail fast if the target tag(s) already exist. +2. **Verify.** Drift gates `types:check` + `codegen:parity` (guarantee the crate `src/v3` matches the shipped SQL); the SQL build itself is the release-eql build (step 4), so no separate "does it build" check is needed. Abort before any mutation on failure. +3. **Pin crate version** *(bindings/all)*. `release-plz set-version eql-bindings@`, commit (GPG-signed, reusing the release-plz signing key), staging **only** the crate files release-plz touched. `git push` to the branch. This is the release commit **S = HEAD**. +4. **SQL release** *(eql/all)*. Create the `eql-` prerelease on **S**; `release-eql.yml` builds + attaches the artefacts. For `all`, **wait for that run to finish green** before step 5. +5. **Crate publish** *(bindings/all)*. Publish + tag `eql-bindings-v` on **S**. Irreversible; runs last. +6. **Summary.** Emit both tags / release URLs to the run summary. -### Task 2 — `release:bindings` (crate) +**Same commit, for free.** Because one runner executes steps 3–5 sequentially and is the only actor, **S** is HEAD throughout: the crate is pinned at S, the SQL release targets S, the crate tag lands on S. No SHA guard, no interleaving push to defend against. Lockstep ordering ("reversible SQL confirmed green before irreversible crate publish") is just step order. -**File:** `tasks/release/bindings.sh`. Two internal phases so `release:all` can interleave the SQL step between them: +**The canonical identity** `-.` yields the SQL tag `eql-`, the crate `Cargo.toml` version ``, and the crate tag `eql-bindings-v`. Same `N` ⇒ lockstep. This preserves the `eql--.` scheme `preview.sh` produces today. -**prepare:** -1. Resolve identity (remote-derived N), validate, preflight `gh`. -2. **Require a clean worktree** for release-relevant paths (fail on uncommitted/untracked changes under `crates/eql-bindings/` or the lockfile) so nothing unrelated is swept into the release commit. -3. Verify the generated surface is in sync on this ref — `mise run types:check` and `mise run codegen:parity` must be clean (guarantees the published crate `src/v3` matches the shipped SQL surface). -4. Refuse if the `eql-bindings-v` tag already exists **on the remote** (release-plz is idempotent, but fail early with a clear message). -5. `release-plz set-version eql-bindings@` (edits `Cargo.toml` + crate `CHANGELOG.md`). -6. **Stage only** `crates/eql-bindings/Cargo.toml`, `crates/eql-bindings/CHANGELOG.md`, and `Cargo.lock` (if `set-version` changed it) — never `git add -A`. Commit (`release: eql-bindings `) and `git push origin `; the commit must be on the remote before dispatch. Record the pushed SHA. +### The thin mise triggers -**publish:** -7. **SHA guard:** assert `git ls-remote origin refs/heads/` still equals the SHA recorded in step 6; abort if the branch head moved. -8. Dispatch **by branch** (`--ref` takes a branch/tag, not a SHA): `gh workflow run release-plz.yml --ref ` → CI's `release` job publishes to crates.io, tags `eql-bindings-v` on that commit, and cuts a pre-release GitHub Release. -9. Print `gh run watch` hint. +`tasks/release/{eql,bindings,all}.sh` — each is a few lines: preflight `gh`, then dispatch the coordinator with the matching `target` and forward `--version` / `--channel` / `--pre` / `--dry-run`, then watch. -Standalone `release:bindings` runs prepare then publish back-to-back. Publish is **irreversible** (a crates.io version is burned even if yanked). +```bash +# release:all (release:eql and release:bindings differ only in target=) +gh workflow run release-alpha.yml --ref "$ref" \ + -f target=all -f version="$version" -f channel="$channel" ${pre:+-f pre="$pre"} ${dry:+-f dry_run=true} +gh run watch "$(gh run list --workflow=release-alpha.yml --branch "$ref" -L1 --json databaseId -q '.[0].databaseId')" +``` -`--dry-run` stops after printing the resolved identity and the `set-version` / dispatch commands it *would* run; it makes no commit, push, or dispatch. +`--ref` defaults to the current branch. No identity resolution, no tag reads, no build happen locally — the task is a remote-control button. This is the "consistent API and approach": all three tasks are the same wrapper with a different `target`. -### Task 3 — `release:all` (lockstep) +### Two implementation decisions to settle in the plan -**File:** `tasks/release/all.sh`. Resolves **one** shared `N`, verifies once, then composes the individual tasks in an order that gives both tags the **same commit** with the irreversible step **last**: +1. **How the coordinator produces SQL artefacts vs `release-eql.yml`.** Creating the prerelease (step 4) fires `release-eql.yml` (`on: release: published`), which is the single SQL-build authority — good (DRY), but the coordinator must then **wait cross-workflow** for that run for the `all` ordering. *Recommended:* extract `release-eql.yml`'s build into a **reusable `workflow_call` workflow** that both `release-eql.yml` (final releases) and the coordinator call inline — no double-build, no cross-workflow polling. *Pragmatic fallback:* keep `release-eql.yml` as-is; the coordinator creates the release and `gh run watch`es the resulting `release-eql.yml` run. +2. **How the coordinator publishes the crate.** *Recommended:* **inline** the `release-plz/action` `command: release` step (single self-contained run, one log, no nested dispatch), reusing the OIDC + GPG setup. Because the coordinator pushes the set-version commit to `eql_v3` (not `main`), `release-plz.yml`'s `push: main` trigger does **not** fire, so no stray `release-pr` is opened — which means the previously-planned `release-pr` gate (`if: github.ref == 'refs/heads/main'`) is **only needed if** we instead dispatch `release-plz.yml`. Settle 1 and 2 together. -1. Resolve shared identity `-.` (remote-derived, max-N across both namespaces). -2. Verify once: drift gates (`types:check`, `codegen:parity`) + SQL clean build with the **bare** identity. Abort on any failure before mutating anything. -3. **`bindings.prepare`** — clean-worktree check → `set-version` → stage only the crate files → commit → push ``. **Record the pushed SHA** `S`; this is the release commit. -4. **`release:eql --target S --pre `** — SQL prerelease pinned to `S` by full SHA (reversible; `gh release create --target` accepts a SHA). -5. **Wait for the `release-eql.yml` run to succeed** — `gh run watch` the triggered run until it completes green, confirming the SQL artefacts actually built and attached. **Do not proceed on failure.** (Creating the GitHub prerelease only *triggers* the build; the irreversible crate publish must wait for confirmed SQL success, not merely a created release.) -6. **`bindings.publish --ref `** — SHA guard (`ls-remote` head == `S`) → dispatch release-plz by branch (irreversible), tagging the same commit `S`. -7. Print watch hints for both CI runs. +## Future: the `main` channel -Both `eql-` and `eql-bindings-v` end up on the one set-version commit `S`. Rationale for ordering: the only tree delta introduced by the set-version commit is `Cargo.toml` + the crate changelog (+ maybe the lockfile) — none of which affect the SQL surface — so pinning the SQL tag to `S` and letting release-plz tag `S` is exact. The reversible SQL prerelease goes first **and is confirmed green** before the irreversible crate publish, so no failure path leaves a published crate without a working SQL counterpart. +Once v3 merges, alphas (and eventually finals) come from `main`. Two things change: -`--dry-run` threads through to both children (no commit, tag, push, or dispatch). +- **Branch protection.** A workflow pushing the set-version commit directly to a protected `main` will be blocked. Options: allow the release bot to push to `main`, or route the crate version bump through the standard release-plz PR flow for the `main` channel. To be decided when v3 merges — out of scope now. +- **`release-plz.yml` on `push: main`.** A set-version commit landing on `main` triggers `release-plz.yml`. release-plz is idempotent (skips an already-published version), but the interaction with the coordinator's inline publish must be reconciled then. ## Non-goals -- **No final-release automation.** These tasks cut **prereleases** only (alpha/beta/rc). Promoting `[Unreleased]` → `[]` and cutting a non-prerelease stays the manual `CLAUDE.md` "Cutting a release" flow. (`release:eql` always passes `--prerelease`.) -- **No change to the crate's crates.io Trusted Publishing / OIDC setup**, GPG signing, or the `release`-before-`release-pr` ordering. -- **No auto-merge / branch-protection changes.** We use `workflow_dispatch`, not direct-push-to-main. -- **No `jsonb` domain surface work** (out of scope for the scalar materialiser generally). +- **No final-release automation.** The coordinator cuts **prereleases** only. Promoting `[Unreleased]` → `[]` and cutting a non-prerelease stays the manual `CLAUDE.md` "Cutting a release" flow. +- **No change to the crate's Trusted Publishing / OIDC / GPG setup.** +- **No solution for the protected-`main` push** (documented as a future constraint above). +- **No `jsonb` domain surface work.** ## Documentation updates (in scope for the implementation) -- **`docs/development/releasing-an-alpha.md`** — replace the manual `set-version`/dispatch steps in the "Releasing `eql-bindings` in lockstep" section with the scripted tasks; **remove the incorrect `git_release_type = "auto"` one-time-config note** (default `auto` already marks `-alpha` GitHub releases as pre-releases — verified in release-plz source). Keep the caveats (no absolute-version config; prerelease auto-increments to `-alpha.(N+1)`; pin via `set-version`; idempotent re-runs). -- **`CLAUDE.md`** — update the release callout so `mise run release:preview` becomes `release:eql`, and add `release:bindings` / `release:all` to the "release is scripted" list. -- **Any reference to `release:preview`** (the rename) — grep and update. +- **`docs/development/releasing-an-alpha.md`** — replace the manual `set-version`/dispatch runbook with "dispatch `release-alpha.yml` (or run `mise run release:*`)". Keep the release-plz caveats that remain true (no absolute-version config; prerelease auto-increments to `-alpha.(N+1)`; pin via `set-version`; idempotent re-runs). The `git_release_type` note is already corrected (default `auto` marks `-alpha` as pre-release). +- **`CLAUDE.md`** — replace the `release:preview` reference with `release:eql` / `release:bindings` / `release:all`, and note that they trigger the `release-alpha.yml` coordinator. +- **Retire/rename `tasks/release/preview.sh`** → the three thin triggers; grep for `release:preview`. ## Verification -- **Dry-run each task** (`--dry-run`) and confirm the derived identity, resolved ref, and the exact commands it would run — with nothing mutated. -- **Remote-derivation:** create a remote-only tag the local clone doesn't have, then confirm `N` derivation and the tag-exists guard both see it (i.e. local staleness can't cause a collision). -- **Cross-namespace N:** with `eql-…-alpha.5` present but no crate alpha tag, confirm `release:bindings` derives `alpha.6` (not `alpha.1`). -- **Version-string parity:** confirm the local verify build uses the bare `` and that `eql_v3.version()` in the built artefact matches what CI would produce. -- **Clean-worktree guard:** with a stray edit under `crates/eql-bindings/`, confirm `release:bindings` prepare aborts and stages nothing. -- **SHA guard:** simulate a branch-head move between prepare and publish; confirm dispatch aborts. -- **`release:eql`** end-to-end on `eql_v3`: confirm the GitHub prerelease appears with both `.sql` artefacts attached (existing behaviour, must survive the rename). -- **`release:bindings`** end-to-end on `eql_v3`: confirm the workflow dispatch runs the `release` job only (not `release-pr`), publishes to crates.io, and tags `eql-bindings-v` on the pushed commit. -- **`release:all`**: confirm both tags land on the **same** commit `S`, that the SQL CI run is awaited green before the crate dispatch, and that the crate publish is the last irreversible action. -- **Idempotency:** re-running a task for an already-released identity fails fast (remote tag-exists guard) rather than double-publishing. - -## Alternatives considered - -**A single `workflow_dispatch` "alpha release" GitHub Actions workflow** with inputs (version, channel), doing the whole sequence — version pin, commit, SQL release, crate publish — inside CI. This is **more auditable and insensitive to laptop state** (no dependence on the operator's local tags, worktree cleanliness, or branch head), which addresses the root concern behind every safeguard above rather than patching each locally. It is deferred because it is a **larger change** (a new workflow that mutates the repo and orchestrates two publish paths, with its own secrets/permissions surface) and because the mise-task entrypoints are wanted as the operator-facing interface regardless. The safeguards in this spec make the local-orchestration form solid in the interim; **the CI-native workflow is the recommended evolution** once the task API has settled, and the mise tasks could then become thin wrappers that trigger it. - -## Open questions - -None blocking. Decisions locked during design: +- **`dry_run`** each target: confirm the resolved identity, ref, and planned actions appear in the run summary with nothing mutated (no tag, release, commit, push, or publish). +- **Cross-namespace `N`:** with `eql-…-alpha.5` present and no crate alpha tag, confirm `target=bindings` resolves `alpha.6` (not `alpha.1`). +- **Tag-exists guard:** dispatching an already-released identity fails fast. +- **`target=eql`** on `eql_v3`: prerelease appears with both `.sql` artefacts attached; no crate commit/tag. +- **`target=bindings`** on `eql_v3`: crate publishes to crates.io, tag `eql-bindings-v` on the pushed commit; **no stray `release-pr`** opened. +- **`target=all`**: both tags land on the **same** commit `S`; the SQL run is awaited green before the crate publish; the crate publish is the last (irreversible) action. +- **Concurrency:** two overlapping dispatches serialise (shared group with `release-plz.yml`), never racing a publish. +- **mise triggers:** each dispatches the coordinator with the correct `target` and forwards flags; nothing release-relevant runs locally. -- **Rename `release:preview` → `release:eql`** for API symmetry (accept the doc churn). -- **Individual tasks are first-class**, not just internal helpers — SQL-only and bindings-only alphas are supported; `release:all` composes them. -- **`release-pr` job gated to `main`** as the one required workflow change. +## Open decisions -A design review hardened the orchestration against local-state hazards: remote-tag derivation, cross-namespace `N`, clean-worktree + constrained staging, branch-dispatch with a SHA guard, CI-success wait before the irreversible crate publish, and CI-matching build version. These are captured as **Release-safety invariants** and folded into each task above; several also fix latent bugs in today's `preview.sh` (local-tag `N`, prefixed build version). The **CI-native single-workflow** form (see Alternatives) remains the recommended longer-term evolution. +- **Coordinator SQL-build factoring** (reusable `workflow_call` vs create-and-wait) and **crate-publish invocation** (inline `release-plz` step vs dispatch `release-plz.yml`) — settle together in the plan; recommendations above. +- **Locked:** CI-native coordinator; thin mise triggers; one identity across both namespaces; prereleases-only; branch as the dispatched ref. From f6970010aa8a9a5e5fd402043fb7071d27002b1f Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 4 Jul 2026 14:39:01 +1000 Subject: [PATCH 506/599] docs(release): finalize CI-native release design after 2nd review Resolve the review findings with verified facts: - SQL builds in-run via a reusable workflow_call, not a release:published event (GITHUB_TOKEN-created release events are suppressed) - crate publishes by dispatching release-plz.yml against the immutable SQL tag (workflow_dispatch is the GITHUB_TOKEN suppression exception; keeps crates.io Trusted Publishing matching release-plz.yml, since TP matches workflow_ref = the entry-point workflow, not job_workflow_ref) - same-commit lockstep guaranteed for target=all by pinning the crate dispatch to the SQL tag - lockstep scope: all=strict same-commit; eql free; bindings requires a matching eql- SQL release (no orphan crate versions) - coordinator uses its own concurrency group; release-pr gated to main; thin mise tasks watch by unique run-name (not -L1) --- .../2026-07-04-release-tasks-design.md | 142 ++++++++++-------- 1 file changed, 77 insertions(+), 65 deletions(-) diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md index e3ff8fa0f..e6c78bfda 100644 --- a/docs/development/2026-07-04-release-tasks-design.md +++ b/docs/development/2026-07-04-release-tasks-design.md @@ -11,120 +11,132 @@ EQL ships two artefacts generated from the same `eql-domains::CATALOG`: 1. The **SQL surface** — `release/cipherstash-encrypt.sql` (+ uninstaller), attached to a GitHub Release tagged `eql-`, built by `.github/workflows/release-eql.yml`. 2. The **`eql-bindings` crate** — published to crates.io by release-plz (`.github/workflows/release-plz.yml`), tagged `eql-bindings-v`. -We want to cut alpha (prerelease) versions of **the SQL surface alone**, **the crate alone**, and **both in version lockstep**, with a consistent interface. - -We release in lockstep so a published `eql-bindings-v3.0.0-alpha.N` always corresponds to the SQL surface tagged `eql-3.0.0-alpha.N` at the **same commit** — both are regenerated from the same catalog, so their versions must not diverge. +We want to cut alpha (prerelease) versions of **the SQL surface alone**, **the crate alone**, and **both in version lockstep**, with a consistent interface. Because both come from the same catalog, their versions must not diverge. ### Decision: CI-native, not laptop-orchestrated -The orchestration runs **in GitHub Actions**, triggered by `workflow_dispatch`. The `mise run release:*` tasks do nothing but call `gh workflow run … && gh run watch`. - -The rejected alternative was a laptop-driven bash orchestrator (`mise` task pins the version, commits, pushes, cuts the SQL release, dispatches the crate publish). It required a stack of defensive safeguards — remote-tag derivation, clean-worktree checks, a branch-head SHA guard, "build with the exact string CI uses" — **all of which exist only because a laptop is an unreliable conductor.** CI removes the root cause: +Orchestration runs **in GitHub Actions** (`workflow_dispatch`); `mise run release:*` only calls `gh workflow run … && gh run watch`. The rejected laptop-orchestrator needed a stack of safeguards (remote-tag derivation, clean-worktree checks, a branch-head SHA guard, "build with the exact string CI uses") — **all of which exist only because a laptop is an unreliable conductor.** CI removes the root cause: | Laptop hazard | Safeguard it needed | CI-native outcome | |---|---|---| -| Local tags go stale | derive `N` from remote tags | checkout fetches remote tags fresh — no staleness | -| Dirty/leftover worktree | clean-worktree check + constrained staging | runner checkout is always clean | -| Concurrent push races the release | `ls-remote` SHA guard before dispatch | single actor; a concurrency group serialises runs | -| Local build ≠ CI build | build with the `eql-`-stripped identity to match | the build **is** the CI build | - -So CI-native is not "the same work plus a workflow" — it's *less* work, because the safeguards become unnecessary. +| Local tags go stale | derive `N` from remote tags | checkout fetches remote tags fresh | +| Dirty/leftover worktree | clean-worktree check | runner checkout is always clean | +| Concurrent push races the release | `ls-remote` SHA guard | dispatch pins an immutable tag; concurrency group serialises | +| Local build ≠ CI build | build with the `eql-`-stripped identity | the build **is** the CI build | ### Hard constraint: alphas are cut from the `eql_v3` branch -The v3 code is not yet on `main`. Alphas are cut from **`eql_v3`**; once v3 merges, `main` becomes the channel. The workflow **runs on the dispatched ref**, so the branch is just the `--ref` of the dispatch — `eql_v3` now, `main` later. (Main-channel branch protection is a future constraint; see [Future: the `main` channel](#future-the-main-channel).) +The v3 code is not yet on `main`. Alphas are cut from **`eql_v3`**; once v3 merges, `main` becomes the channel. The workflow **runs on the dispatched ref**, so the branch is just the `--ref` of the dispatch. (Main-channel branch protection is a future constraint; see [Future](#future-the-main-channel).) ## Verified mechanism facts (load-bearing) -Verified against release-plz source, the workflows in this repo, and `gh` against the live repo: +Verified against release-plz source, crates.io server source, GitHub Actions docs, and this repo's workflows: -1. **`release-plz release` is branch-agnostic.** It publishes purely on `(version not on crates.io) && (git tag absent)` — no default-branch gate (`release_always` defaults `true`). It tags the **current HEAD** via the GitHub API and cuts a GitHub Release, auto-marked pre-release for a `-alpha.N` version (default `git_release_type = auto`). **No release-plz config change is required** to publish an alpha from `eql_v3`. -2. **The crate publish must happen in CI.** crates.io auth is OIDC Trusted Publishing (no `CARGO_REGISTRY_TOKEN`), so `cargo publish` cannot run off-CI — reinforcing the CI-native decision. -3. **release-plz publishes the committed `Cargo.toml` version verbatim** and has **no config field that sets an absolute version**. Pinning is `release-plz set-version eql-bindings@`. From a prerelease base its default next bump is `-alpha.(N+1)`; jumping to stable `3.0.0` needs an explicit `set-version`. -4. **The SQL release trigger is a published GitHub Release.** `release-eql.yml` reacts on `release: published`, builds, and attaches the two `.sql` artefacts. It builds with the `eql-`-stripped identity (`mise run build --version "${TAG#eql-}"`), so `eql_v3.version()` reports bare semver. Its `verify-changelog` job is gated to `prerelease == false`, so alphas keep their entries under `[Unreleased]`. -5. **`workflow_dispatch --ref ` runs the workflow on that branch** (`--ref` is a branch/tag name, not a raw SHA). A checkout with `fetch-depth: 0` gives the workflow full history + all remote tags. +1. **`release-plz release` is branch-agnostic** and publishes on `(version not on crates.io) && (git tag absent)` — no default-branch gate. It tags the **checked-out HEAD** via the GitHub API and cuts a GitHub Release, auto-marked pre-release for a `-alpha.N` version (default `git_release_type = auto`). **No release-plz config change is required.** +2. **The crate publish must happen in CI** — crates.io auth is OIDC Trusted Publishing (no `CARGO_REGISTRY_TOKEN`). +3. **release-plz publishes the committed `Cargo.toml` version verbatim**; pinning is `release-plz set-version eql-bindings@`. No config sets an absolute version. From a prerelease base its default next bump is `-alpha.(N+1)`. +4. **`release-eql.yml` builds with the `eql-`-stripped identity** (`--version "${TAG#eql-}"`) so `eql_v3.version()` reports bare semver; its `verify-changelog` job is gated to `prerelease == false`, so alphas stay under `[Unreleased]`. +5. **GITHUB_TOKEN event suppression + its exceptions.** Events created with the automatic `GITHUB_TOKEN` do **not** trigger new workflow runs — **except `workflow_dispatch` and `repository_dispatch`, which always run.** Therefore: + - Creating a Release or pushing a commit with `GITHUB_TOKEN` will **not** fire `release-eql.yml`'s `on: release` or any `on: push` — so a coordinator must **build SQL in its own run**, not rely on event fan-out. + - A coordinator **can `workflow_dispatch` `release-plz.yml` with `GITHUB_TOKEN`** (no PAT/App token needed). +6. **crates.io Trusted Publishing matches on `workflow_ref` = the entry-point workflow filename, not `job_workflow_ref`** (verified in `crates_io_trustpub` source; opposite of PyPI; undocumented — flagged). So the crate must publish from **`release-plz.yml` as its own dispatched entry point** to keep the existing TP config (`workflow: release-plz.yml`) matching. Publishing via a reusable `workflow_call` from `release-alpha.yml` would make the identity `release-alpha.yml` and **fail** the token exchange unless TP is reconfigured. +7. **`gh workflow run --ref ` dispatches against a tag** (immutable commit), reading the workflow file from that tag's tree. ## Architecture -Two layers: a **coordinator workflow** (does everything, server-side) and **thin mise triggers**. +A **coordinator workflow** does everything server-side; **thin mise triggers** only fire and watch it. -### The coordinator workflow — `.github/workflows/release-alpha.yml` +### The coordinator — `.github/workflows/release-alpha.yml` -`on: workflow_dispatch`, running on the dispatched ref. Inputs: +`on: workflow_dispatch`, runs on the dispatched ref. `concurrency: { group: release-alpha, cancel-in-progress: false }` (serialises coordinator runs; the crate publish is separately serialised by `release-plz.yml`'s existing `release-plz` group). `run-name` includes the resolved identity + target so the exact run is findable. Inputs: | Input | Meaning | Default | |-------|---------|---------| -| `target` | `eql` \| `bindings` \| `all` — which artefact(s) to release | `all` | +| `target` | `all` \| `eql` \| `bindings` | `all` | | `version` | base SemVer | `3.0.0` | | `channel` | `alpha` \| `beta` \| `rc` | `alpha` | -| `pre` | exact prerelease identity (e.g. `3.0.0-alpha.2`), bypassing `N` derivation | (derived) | -| `dry_run` | resolve + verify + print the plan; mutate nothing | `false` | +| `pre` | exact identity (e.g. `3.0.0-alpha.2`), bypassing `N` derivation | (derived) | +| `dry_run` | resolve + verify + print plan; mutate nothing | `false` | + +**Identity** `-.`, with `N = 1 + max(N across BOTH tag namespaces — SQL `eql--.N` and crate `eql-bindings-v-.N`)`, computed from the freshly-fetched tags (`fetch-depth: 0`). Deriving across both namespaces for every target prevents divergence. It yields SQL tag `eql-`, crate version/tag `` / `eql-bindings-v`. + +### `target=all` (lockstep — the normal path) + +1. **Resolve** identity; fail if `eql-` or `eql-bindings-v` already exists. +2. **Verify** drift gates `types:check` + `codegen:parity` (crate `src/v3` matches the shipped SQL). Abort before any mutation on failure. +3. **Pin** — `release-plz set-version eql-bindings@`, commit (GPG-signed) staging only the crate files, `git push` the branch. This is commit **S**. (Push via `GITHUB_TOKEN` fires nothing — intended.) +4. **SQL release, in this run** — build via a reusable `workflow_call` (below), create the `eql-` prerelease **targeting S**, attach the two `.sql` artefacts. If the build fails, the run fails here — before anything irreversible. +5. **Crate publish** — `gh workflow run release-plz.yml --ref eql-` (dispatch against the immutable SQL tag = commit **S**; `GITHUB_TOKEN` works — `workflow_dispatch` exception). `release-plz.yml` runs **as its own entry point** (TP matches), checks out **S**, publishes the crate, tags `eql-bindings-v` on **S**. Its `release-pr` job is skipped because the ref is a tag, not `refs/heads/main` (gate below). +6. **Summary** — link the coordinator run and the dispatched `release-plz.yml` run. + +**Same commit `S`, for free:** the crate is pinned+committed at S, the SQL release targets S, and the crate publish is dispatched against the *tag* that points at S — so both tags land on S with no SHA guard and no race. **Ordering is safe:** the SQL build+release happens in-run and must succeed before step 5 dispatches the (irreversible) crate publish; SQL is reversible, the crate is not. -`concurrency: { group: release, cancel-in-progress: false }` — serialises all release runs (and must share a group with `release-plz.yml`'s crate-publish path so the two never race a tag/publish). +*Decoupling caveat:* the crate publish is a **separate run** (fire-and-forget). The coordinator confirms SQL success before dispatching, but cannot report the publish result in its own summary — the operator watches two runs. Acceptable: the failure direction (crate publish fails after SQL shipped) leaves SQL-without-crate, which is the safe direction. -**Sequence** (a step is skipped when `target` excludes its artefact): +### `target=eql` (SQL only — allowed, no crate) -1. **Resolve identity.** Checkout (`fetch-depth: 0`) → tags are fresh. `identity = pre` if given, else `-.` where `N = 1 + max(N across BOTH tag namespaces: SQL `eql--.N` and crate `eql-bindings-v-.N`)`. Deriving across **both** namespaces (even for a single-artefact release) is what keeps them from diverging — a bindings-only release can never pick an `N` that trails or collides with the SQL namespace. Fail fast if the target tag(s) already exist. -2. **Verify.** Drift gates `types:check` + `codegen:parity` (guarantee the crate `src/v3` matches the shipped SQL); the SQL build itself is the release-eql build (step 4), so no separate "does it build" check is needed. Abort before any mutation on failure. -3. **Pin crate version** *(bindings/all)*. `release-plz set-version eql-bindings@`, commit (GPG-signed, reusing the release-plz signing key), staging **only** the crate files release-plz touched. `git push` to the branch. This is the release commit **S = HEAD**. -4. **SQL release** *(eql/all)*. Create the `eql-` prerelease on **S**; `release-eql.yml` builds + attaches the artefacts. For `all`, **wait for that run to finish green** before step 5. -5. **Crate publish** *(bindings/all)*. Publish + tag `eql-bindings-v` on **S**. Irreversible; runs last. -6. **Summary.** Emit both tags / release URLs to the run summary. +Resolve → verify → build SQL in-run → create `eql-` prerelease on the current branch HEAD. No `set-version`, no commit, no crate. SQL without a crate counterpart is permitted. -**Same commit, for free.** Because one runner executes steps 3–5 sequentially and is the only actor, **S** is HEAD throughout: the crate is pinned at S, the SQL release targets S, the crate tag lands on S. No SHA guard, no interleaving push to defend against. Lockstep ordering ("reversible SQL confirmed green before irreversible crate publish") is just step order. +### `target=bindings` (crate only — requires a matching SQL release) -**The canonical identity** `-.` yields the SQL tag `eql-`, the crate `Cargo.toml` version ``, and the crate tag `eql-bindings-v`. Same `N` ⇒ lockstep. This preserves the `eql--.` scheme `preview.sh` produces today. +Per the lockstep decision, a crate version never ships without a corresponding SQL release of the **same version** (same identity, not necessarily same commit — pinning the crate version is itself a commit, so same-*commit* is only guaranteed by `target=all`). + +1. **Resolve** — `identity` must correspond to an **existing `eql-` tag** (default: the latest `eql--.N` lacking a crate counterpart; or an explicit `--pre`). **Fail if no matching SQL release exists** — this is the invariant. +2. **Verify** drift gates on the current HEAD (so the published `src/v3` matches the catalog; if the catalog is unchanged since the SQL release, it also matches the shipped SQL). +3. **Pin + publish** — `set-version`, commit, push, then dispatch `release-plz.yml --ref ` (or the crate is tagged on the new pin commit). The crate ships at version ``, matching the existing SQL release. + +### The reusable SQL build — `.github/workflows/_build-sql.yml` + +Extract `release-eql.yml`'s build-and-attach into a `workflow_call` reusable workflow (inputs: tag/identity, target release). Called **inline** by the coordinator (so no reliance on the suppressed `release:published` event) **and** by `release-eql.yml` for final (human-created) releases (whose `release:published` event *does* fire, being human-authored). One SQL-build code path, no double build. ### The thin mise triggers -`tasks/release/{eql,bindings,all}.sh` — each is a few lines: preflight `gh`, then dispatch the coordinator with the matching `target` and forward `--version` / `--channel` / `--pre` / `--dry-run`, then watch. +`tasks/release/{all,eql,bindings}.sh` — each preflights `gh`, dispatches the coordinator with the matching `target`, forwards `--version`/`--channel`/`--pre`/`--dry-run`, then watches by the unique `run-name`: ```bash -# release:all (release:eql and release:bindings differ only in target=) gh workflow run release-alpha.yml --ref "$ref" \ -f target=all -f version="$version" -f channel="$channel" ${pre:+-f pre="$pre"} ${dry:+-f dry_run=true} -gh run watch "$(gh run list --workflow=release-alpha.yml --branch "$ref" -L1 --json databaseId -q '.[0].databaseId')" +# find THIS run by the identity in run-name, not `-L1` (which races a concurrent dispatch) ``` -`--ref` defaults to the current branch. No identity resolution, no tag reads, no build happen locally — the task is a remote-control button. This is the "consistent API and approach": all three tasks are the same wrapper with a different `target`. +`--ref` defaults to the current branch. Nothing release-relevant runs locally. -### Two implementation decisions to settle in the plan +## Companion changes (in scope) -1. **How the coordinator produces SQL artefacts vs `release-eql.yml`.** Creating the prerelease (step 4) fires `release-eql.yml` (`on: release: published`), which is the single SQL-build authority — good (DRY), but the coordinator must then **wait cross-workflow** for that run for the `all` ordering. *Recommended:* extract `release-eql.yml`'s build into a **reusable `workflow_call` workflow** that both `release-eql.yml` (final releases) and the coordinator call inline — no double-build, no cross-workflow polling. *Pragmatic fallback:* keep `release-eql.yml` as-is; the coordinator creates the release and `gh run watch`es the resulting `release-eql.yml` run. -2. **How the coordinator publishes the crate.** *Recommended:* **inline** the `release-plz/action` `command: release` step (single self-contained run, one log, no nested dispatch), reusing the OIDC + GPG setup. Because the coordinator pushes the set-version commit to `eql_v3` (not `main`), `release-plz.yml`'s `push: main` trigger does **not** fire, so no stray `release-pr` is opened — which means the previously-planned `release-pr` gate (`if: github.ref == 'refs/heads/main'`) is **only needed if** we instead dispatch `release-plz.yml`. Settle 1 and 2 together. +1. **New `.github/workflows/_build-sql.yml`** (reusable), and `release-eql.yml` refactored to call it. +2. **New `.github/workflows/release-alpha.yml`** (the coordinator). +3. **Gate `release-plz.yml`'s `release-pr` job** with `if: github.ref == 'refs/heads/main'` — so a dispatch against a tag (or feature branch) publishes without opening a stray PR. (No change to `release-plz.yml`'s `concurrency` group; the coordinator uses its own.) +4. **Three thin `tasks/release/*.sh`** + mise task wiring; retire `preview.sh` / `release:preview`. ## Future: the `main` channel -Once v3 merges, alphas (and eventually finals) come from `main`. Two things change: - -- **Branch protection.** A workflow pushing the set-version commit directly to a protected `main` will be blocked. Options: allow the release bot to push to `main`, or route the crate version bump through the standard release-plz PR flow for the `main` channel. To be decided when v3 merges — out of scope now. -- **`release-plz.yml` on `push: main`.** A set-version commit landing on `main` triggers `release-plz.yml`. release-plz is idempotent (skips an already-published version), but the interaction with the coordinator's inline publish must be reconciled then. +When alphas move to `main`: (a) a workflow pushing the set-version commit to a **protected `main`** is blocked — allow the release identity to push, or route the crate bump through release-plz's PR flow for `main`; (b) that push also interacts with `release-plz.yml`'s `push: main` trigger (release-plz is idempotent, but reconcile then). Out of scope now. ## Non-goals -- **No final-release automation.** The coordinator cuts **prereleases** only. Promoting `[Unreleased]` → `[]` and cutting a non-prerelease stays the manual `CLAUDE.md` "Cutting a release" flow. -- **No change to the crate's Trusted Publishing / OIDC / GPG setup.** -- **No solution for the protected-`main` push** (documented as a future constraint above). +- **No final-release automation** — the coordinator cuts **prereleases** only. +- **No change to crates.io Trusted Publishing / OIDC / GPG** — preserved *because* the crate still publishes from `release-plz.yml` as its own entry point (fact 6). This constrains the design: the crate publish must **not** move into a reusable `workflow_call`. +- **No solution for the protected-`main` push** (future constraint above). - **No `jsonb` domain surface work.** -## Documentation updates (in scope for the implementation) +## Verification -- **`docs/development/releasing-an-alpha.md`** — replace the manual `set-version`/dispatch runbook with "dispatch `release-alpha.yml` (or run `mise run release:*`)". Keep the release-plz caveats that remain true (no absolute-version config; prerelease auto-increments to `-alpha.(N+1)`; pin via `set-version`; idempotent re-runs). The `git_release_type` note is already corrected (default `auto` marks `-alpha` as pre-release). -- **`CLAUDE.md`** — replace the `release:preview` reference with `release:eql` / `release:bindings` / `release:all`, and note that they trigger the `release-alpha.yml` coordinator. -- **Retire/rename `tasks/release/preview.sh`** → the three thin triggers; grep for `release:preview`. +- **`dry_run`** each target: resolved identity, ref, and plan appear in the summary; nothing mutated. +- **Cross-namespace `N`:** with `eql-…-alpha.5` present and no crate alpha tag, `target=bindings` refuses (no matching SQL) and `target=all` resolves `alpha.6`. +- **`target=bindings` invariant:** dispatching for an identity with no `eql-` tag fails fast; with one present, the crate ships at that version. +- **`target=all`:** both tags land on the **same** commit `S`; SQL build succeeds in-run before the crate dispatch; TP token exchange succeeds (publish ran as `release-plz.yml`); **no stray `release-pr`**. +- **`target=eql`:** prerelease with both `.sql` artefacts; no crate. +- **GITHUB_TOKEN paths:** confirm the coordinator's `workflow_dispatch` of `release-plz.yml` actually starts a run (exception holds), and that it does **not** rely on any suppressed `release:published`/`push` fan-out. +- **Watch correctness:** two overlapping dispatches — each mise task watches its own run via the identity in `run-name`, not `-L1`. -## Verification +## Alternatives considered -- **`dry_run`** each target: confirm the resolved identity, ref, and planned actions appear in the run summary with nothing mutated (no tag, release, commit, push, or publish). -- **Cross-namespace `N`:** with `eql-…-alpha.5` present and no crate alpha tag, confirm `target=bindings` resolves `alpha.6` (not `alpha.1`). -- **Tag-exists guard:** dispatching an already-released identity fails fast. -- **`target=eql`** on `eql_v3`: prerelease appears with both `.sql` artefacts attached; no crate commit/tag. -- **`target=bindings`** on `eql_v3`: crate publishes to crates.io, tag `eql-bindings-v` on the pushed commit; **no stray `release-pr`** opened. -- **`target=all`**: both tags land on the **same** commit `S`; the SQL run is awaited green before the crate publish; the crate publish is the last (irreversible) action. -- **Concurrency:** two overlapping dispatches serialise (shared group with `release-plz.yml`), never racing a publish. -- **mise triggers:** each dispatches the coordinator with the correct `target` and forwards flags; nothing release-relevant runs locally. +- **Laptop bash orchestrator** (rejected) — needs the safeguard stack CI eliminates. +- **Crate publish via reusable `workflow_call`** (rejected) — cleaner single synchronous run, but crates.io TP matches `workflow_ref` = `release-alpha.yml`, so it would **require adding `release-alpha.yml` to the TP config**. Deferred to keep TP untouched; revisit if a single-run publish is later wanted. +- **GitHub App token to fan out a real `release:published`** (rejected) — unnecessary given the `workflow_dispatch` exception and the reusable inline build. -## Open decisions +## Locked decisions -- **Coordinator SQL-build factoring** (reusable `workflow_call` vs create-and-wait) and **crate-publish invocation** (inline `release-plz` step vs dispatch `release-plz.yml`) — settle together in the plan; recommendations above. -- **Locked:** CI-native coordinator; thin mise triggers; one identity across both namespaces; prereleases-only; branch as the dispatched ref. +- CI-native coordinator; thin mise triggers; identity across both namespaces; prereleases only; branch = dispatched ref. +- **Lockstep scope:** `target=all` guarantees same commit + identity; `target=eql` is free (SQL without crate allowed); `target=bindings` requires a matching `eql-` release to already exist (no orphan crate version; same version, possibly different commit). +- SQL built **in-run** via reusable `workflow_call` (not event fan-out); crate published by **dispatching `release-plz.yml`** against the SQL tag (TP unchanged); `release-pr` gated to `main`. From 34650217940247cc3b4a852d99349ddee9b13cf7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sat, 4 Jul 2026 15:20:19 +1000 Subject: [PATCH 507/599] docs(release): require docs bundle on alphas + add implementation plan Docs bundles are required on alpha releases. Because a GITHUB_TOKEN-created release can't fire the old event-driven publish-docs job, docs must build in-run: extract publish-docs into a reusable _build-docs.yml alongside _build-sql.yml, have the coordinator attach the eql-docs-* bundle after the SQL release is created, and gate the irreversible crate publish on BOTH build jobs (a docs failure aborts before the crate ships). Adds the full writing-plans implementation plan (8 tasks, complete workflow files, per-step verification, staged rollout) and updates the design spec's architecture, companion changes, verification, and locked decisions to match. --- .../2026-07-04-release-tasks-design.md | 22 +- ...07-04-release-tasks-implementation-plan.md | 1257 +++++++++++++++++ 2 files changed, 1269 insertions(+), 10 deletions(-) create mode 100644 docs/development/2026-07-04-release-tasks-implementation-plan.md diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md index e6c78bfda..250c793af 100644 --- a/docs/development/2026-07-04-release-tasks-design.md +++ b/docs/development/2026-07-04-release-tasks-design.md @@ -66,16 +66,17 @@ A **coordinator workflow** does everything server-side; **thin mise triggers** o 2. **Verify** drift gates `types:check` + `codegen:parity` (crate `src/v3` matches the shipped SQL). Abort before any mutation on failure. 3. **Pin** — `release-plz set-version eql-bindings@`, commit (GPG-signed) staging only the crate files, `git push` the branch. This is commit **S**. (Push via `GITHUB_TOKEN` fires nothing — intended.) 4. **SQL release, in this run** — build via a reusable `workflow_call` (below), create the `eql-` prerelease **targeting S**, attach the two `.sql` artefacts. If the build fails, the run fails here — before anything irreversible. -5. **Crate publish** — `gh workflow run release-plz.yml --ref eql-` (dispatch against the immutable SQL tag = commit **S**; `GITHUB_TOKEN` works — `workflow_dispatch` exception). `release-plz.yml` runs **as its own entry point** (TP matches), checks out **S**, publishes the crate, tags `eql-bindings-v` on **S**. Its `release-pr` job is skipped because the ref is a tag, not `refs/heads/main` (gate below). -6. **Summary** — link the coordinator run and the dispatched `release-plz.yml` run. +5. **Docs, in this run** — build + attach the `eql-docs-*` bundle to the same release via a second reusable `workflow_call` (below), after step 4 has created the release. Also runs before anything irreversible. +6. **Crate publish** — `gh workflow run release-plz.yml --ref eql-` (dispatch against the immutable SQL tag = commit **S**; `GITHUB_TOKEN` works — `workflow_dispatch` exception). `release-plz.yml` runs **as its own entry point** (TP matches), checks out **S**, publishes the crate, tags `eql-bindings-v` on **S**. Its `release-pr` job is skipped because the ref is a tag, not `refs/heads/main` (gate below). +7. **Summary** — link the coordinator run and the dispatched `release-plz.yml` run. -**Same commit `S`, for free:** the crate is pinned+committed at S, the SQL release targets S, and the crate publish is dispatched against the *tag* that points at S — so both tags land on S with no SHA guard and no race. **Ordering is safe:** the SQL build+release happens in-run and must succeed before step 5 dispatches the (irreversible) crate publish; SQL is reversible, the crate is not. +**Same commit `S`, for free:** the crate is pinned+committed at S, the SQL release targets S, and the crate publish is dispatched against the *tag* that points at S — so both tags land on S with no SHA guard and no race. **Ordering is safe:** the SQL build+release **and** the docs attach happen in-run and must both succeed before step 6 dispatches the (irreversible) crate publish; the release payload (SQL + docs) is reversible, the crate is not. A docs failure aborts before the crate ships. *Decoupling caveat:* the crate publish is a **separate run** (fire-and-forget). The coordinator confirms SQL success before dispatching, but cannot report the publish result in its own summary — the operator watches two runs. Acceptable: the failure direction (crate publish fails after SQL shipped) leaves SQL-without-crate, which is the safe direction. ### `target=eql` (SQL only — allowed, no crate) -Resolve → verify → build SQL in-run → create `eql-` prerelease on the current branch HEAD. No `set-version`, no commit, no crate. SQL without a crate counterpart is permitted. +Resolve → verify → build SQL in-run → create `eql-` prerelease on the current branch HEAD → attach the `eql-docs-*` bundle in-run. No `set-version`, no commit, no crate. SQL (with docs) without a crate counterpart is permitted. ### `target=bindings` (crate only — requires a matching SQL release) @@ -85,9 +86,9 @@ Per the lockstep decision, a crate version never ships without a corresponding S 2. **Verify** drift gates on the current HEAD (so the published `src/v3` matches the catalog; if the catalog is unchanged since the SQL release, it also matches the shipped SQL). 3. **Pin + publish** — `set-version`, commit, push, then dispatch `release-plz.yml --ref ` (or the crate is tagged on the new pin commit). The crate ships at version ``, matching the existing SQL release. -### The reusable SQL build — `.github/workflows/_build-sql.yml` +### The reusable build workflows — `_build-sql.yml` and `_build-docs.yml` -Extract `release-eql.yml`'s build-and-attach into a `workflow_call` reusable workflow (inputs: tag/identity, target release). Called **inline** by the coordinator (so no reliance on the suppressed `release:published` event) **and** by `release-eql.yml` for final (human-created) releases (whose `release:published` event *does* fire, being human-authored). One SQL-build code path, no double build. +Extract `release-eql.yml`'s two build jobs into `workflow_call` reusable workflows: **`_build-sql.yml`** (from `build-and-publish` — builds + attaches the two `.sql` artefacts, and for the coordinator *creates* the prerelease at commit S) and **`_build-docs.yml`** (from `publish-docs` — doxygen + `docs:generate`/`docs:package`, attaches the `eql-docs-*` bundle to the release). Both are called **inline** by the coordinator (so no reliance on the suppressed `release:published` event) **and** by `release-eql.yml` for final (human-created) releases (whose `release:published` event *does* fire). One code path per artefact, no double build. The docs reusable attaches to the release the SQL reusable created, so in the coordinator the docs job `needs` the SQL job; the crate publish `needs` **both** (a complete SQL+docs payload before the irreversible publish). ### The thin mise triggers @@ -103,7 +104,7 @@ gh workflow run release-alpha.yml --ref "$ref" \ ## Companion changes (in scope) -1. **New `.github/workflows/_build-sql.yml`** (reusable), and `release-eql.yml` refactored to call it. +1. **New `.github/workflows/_build-sql.yml`** and **`.github/workflows/_build-docs.yml`** (reusable), with `release-eql.yml`'s `build-and-publish` and `publish-docs` jobs refactored to call them. Alpha releases keep their `eql-docs-*` bundle (built in-run, since the `GITHUB_TOKEN`-created release can't fire the old event-driven `publish-docs`). 2. **New `.github/workflows/release-alpha.yml`** (the coordinator). 3. **Gate `release-plz.yml`'s `release-pr` job** with `if: github.ref == 'refs/heads/main'` — so a dispatch against a tag (or feature branch) publishes without opening a stray PR. (No change to `release-plz.yml`'s `concurrency` group; the coordinator uses its own.) 4. **Three thin `tasks/release/*.sh`** + mise task wiring; retire `preview.sh` / `release:preview`. @@ -124,8 +125,9 @@ When alphas move to `main`: (a) a workflow pushing the set-version commit to a * - **`dry_run`** each target: resolved identity, ref, and plan appear in the summary; nothing mutated. - **Cross-namespace `N`:** with `eql-…-alpha.5` present and no crate alpha tag, `target=bindings` refuses (no matching SQL) and `target=all` resolves `alpha.6`. - **`target=bindings` invariant:** dispatching for an identity with no `eql-` tag fails fast; with one present, the crate ships at that version. -- **`target=all`:** both tags land on the **same** commit `S`; SQL build succeeds in-run before the crate dispatch; TP token exchange succeeds (publish ran as `release-plz.yml`); **no stray `release-pr`**. -- **`target=eql`:** prerelease with both `.sql` artefacts; no crate. +- **`target=all`:** both tags land on the **same** commit `S`; SQL build **and docs attach** succeed in-run before the crate dispatch; the release carries the two `.sql` + the `eql-docs-*` bundle; TP token exchange succeeds (publish ran as `release-plz.yml`); **no stray `release-pr`**. +- **`target=eql`:** prerelease with both `.sql` artefacts **and the `eql-docs-*` bundle**; no crate. +- **Docs-on-alpha:** confirm a coordinator-cut alpha carries the `eql-docs-*` bundle (built in-run via `_build-docs.yml`), and that a docs-build failure aborts the run before the crate publish. - **GITHUB_TOKEN paths:** confirm the coordinator's `workflow_dispatch` of `release-plz.yml` actually starts a run (exception holds), and that it does **not** rely on any suppressed `release:published`/`push` fan-out. - **Watch correctness:** two overlapping dispatches — each mise task watches its own run via the identity in `run-name`, not `-L1`. @@ -139,4 +141,4 @@ When alphas move to `main`: (a) a workflow pushing the set-version commit to a * - CI-native coordinator; thin mise triggers; identity across both namespaces; prereleases only; branch = dispatched ref. - **Lockstep scope:** `target=all` guarantees same commit + identity; `target=eql` is free (SQL without crate allowed); `target=bindings` requires a matching `eql-` release to already exist (no orphan crate version; same version, possibly different commit). -- SQL built **in-run** via reusable `workflow_call` (not event fan-out); crate published by **dispatching `release-plz.yml`** against the SQL tag (TP unchanged); `release-pr` gated to `main`. +- SQL **and docs** built **in-run** via reusable `workflow_call`s (`_build-sql.yml` + `_build-docs.yml`, not event fan-out) — alphas keep their `eql-docs-*` bundle; crate published by **dispatching `release-plz.yml`** against the SQL tag (TP unchanged); crate publish gated on both build jobs; `release-pr` gated to `main`. diff --git a/docs/development/2026-07-04-release-tasks-implementation-plan.md b/docs/development/2026-07-04-release-tasks-implementation-plan.md new file mode 100644 index 000000000..feedb6d1c --- /dev/null +++ b/docs/development/2026-07-04-release-tasks-implementation-plan.md @@ -0,0 +1,1257 @@ +# CI-native alpha releases (SQL surface + `eql-bindings` crate) — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Cut alpha (prerelease) versions of the EQL SQL surface alone, the `eql-bindings` crate alone, or both in version lockstep, from a single `workflow_dispatch` GitHub Actions coordinator, driven by thin `mise run release:*` tasks that only trigger and watch CI. Alpha releases carry the same assets as finals: the two `.sql` files **and** the packaged docs bundle. + +**Architecture:** A coordinator workflow (`release-alpha.yml`) does all orchestration server-side: it resolves the release identity across both tag namespaces, verifies drift gates, pins + commits the crate version, builds and attaches the SQL release **in-run** via a reusable `_build-sql.yml`, builds and attaches the docs bundle **in-run** via a reusable `_build-docs.yml`, then dispatches the crate publish by triggering `release-plz.yml` against the immutable SQL tag (so crates.io Trusted Publishing still matches `workflow_ref = release-plz.yml`). Thin mise tasks only `gh workflow run` the coordinator and watch the resulting run. + +**Tech Stack:** GitHub Actions (`workflow_call` reusable workflows, `workflow_dispatch`), `gh` CLI, `mise` file-based tasks (auto-discovered from `tasks/`), `release-plz` CLI, doxygen, GPG-signed commits, crates.io OIDC Trusted Publishing. + +## Global Constraints + +These are the spec's **verified, load-bearing facts**. Every task's requirements implicitly include them; violating any is a plan failure. + +- **SQL and docs must build in-run.** A coordinator running under the automatic `GITHUB_TOKEN` **cannot** rely on any `on: release`/`on: push` fan-out — `GITHUB_TOKEN`-created Releases and pushes do **not** trigger new workflow runs. The SQL build+attach *and* the docs build+attach therefore happen inside the coordinator's own run via reusable `workflow_call`s, never by firing `release-eql.yml`. +- **The crate must publish from `release-plz.yml` as its own dispatched entry point.** crates.io Trusted Publishing matches on `workflow_ref` = the entry-point workflow filename (verified opposite to PyPI). Publishing via a reusable `workflow_call` from `release-alpha.yml` would make the identity `release-alpha.yml` and fail the OIDC token exchange. **Do not move the crate publish into a reusable workflow.** The coordinator triggers the publish with `gh workflow run release-plz.yml --ref ` (the `workflow_dispatch` exception means `GITHUB_TOKEN` *can* do this). +- **`target=all` same-commit `S` is achieved by dispatching the crate publish against the immutable SQL tag.** The crate version is pinned+committed at `S`, the SQL release targets `S`, docs are built at `S`, and the crate publish is dispatched against the *tag* `eql-` that points at `S` — so both tags land on `S` with no SHA guard and no race. +- **Ordering is SQL → docs → crate.** SQL and docs are reversible (a GitHub prerelease can be deleted); a crates.io publish is irreversible. The crate publish must be dispatched only **after** a *complete* release (SQL **and** docs) has been built and attached in-run. +- **Identity `-.` with `N = 1 + max(N across BOTH tag namespaces)`** — SQL `eql--.N` and crate `eql-bindings-v-.N` — computed from freshly-fetched tags (`fetch-depth: 0`). Deriving across both namespaces for every target prevents version divergence. +- **`release-eql.yml` builds with the `eql-`-stripped identity** (`mise run build --version "${TAG#eql-}"`) so `eql_v3.version()` reports bare semver. Empty tag → bare `mise run build` DEV default. This behaviour is preserved by the reusable. +- **Blockers/prereleases only.** The coordinator cuts prereleases only. No final-release automation, no `verify-changelog` promotion, no `CHANGELOG.md` edits — alpha entries stay under `[Unreleased]`. +- **`release-plz` config is unchanged.** No TP / OIDC / GPG changes. `release-plz set-version eql-bindings@` is the only pin mechanism (no absolute-version config field exists). +- **Branch = dispatched ref.** Alphas are cut from `eql_v3` today; the workflow runs on the `--ref` of the dispatch. `main`-channel branch protection is out of scope (future). +- **mise tasks are auto-discovered** from the `tasks/` directory (verified: `release:preview` has no `[tasks]` entry in `mise.toml`). A new executable `tasks/release/.sh` with `#MISE`/`#USAGE` headers auto-registers as `release:`; deleting `tasks/release/preview.sh` removes `release:preview`. + +--- + +## File Structure + +| File | Responsibility | Action | +|------|----------------|--------| +| `.github/workflows/_build-sql.yml` | Reusable (`workflow_call`) SQL build + upload-artifact + attach/create-release + Multitudes notify. Single SQL-build code path. | Create (Task 1) | +| `.github/workflows/_build-docs.yml` | Reusable (`workflow_call`) docs generate + package + upload-artifact + attach `eql-docs-*` to an existing release. Single docs-build code path. | Create (Task 2) | +| `.github/workflows/release-eql.yml` | Finals path: `verify-changelog`, delegate SQL build to `_build-sql.yml`, delegate docs to `_build-docs.yml`. | Modify (Task 3) | +| `.github/workflows/release-plz.yml` | Crate publish entry point (unchanged) + `release-pr` job gated to `main`. | Modify (Task 4) | +| `.github/workflows/release-alpha.yml` | The coordinator: resolve → pin → build-sql → build-docs → crate-publish → summary. | Create (Task 5) | +| `tasks/release/all.sh`, `tasks/release/eql.sh`, `tasks/release/bindings.sh` | Thin mise triggers: dispatch coordinator + watch by `run-name`. | Create (Task 6) | +| `tasks/release/preview.sh` | Retired. | Delete (Task 6) | +| `docs/development/releasing-an-alpha.md`, `CLAUDE.md` | Runbook + reference updated to the task/dispatch flow. | Modify (Task 7) | + +--- + +### Task 1: Reusable SQL build — `.github/workflows/_build-sql.yml` + +**Files:** +- Create: `.github/workflows/_build-sql.yml` + +**Interfaces:** +- Produces (the reusable's `workflow_call` inputs — later tasks call with exactly these): + - `ref` (string, default `''`) — git ref/SHA to check out; empty → default `github.sha`. + - `tag` (string, default `''`) — full release tag, e.g. `eql-3.0.0-alpha.2`. Drives the build version via `${TAG#eql-}`; empty → bare `mise run build` DEV default. + - `attach` (boolean, default `false`) — attach the two `.sql` artefacts to a release. + - `target_commitish` (string, default `''`) — when non-empty, **create** a prerelease at this commit; when empty, **attach to an existing** release named by `tag`. + - `prerelease` (boolean, default `false`) — only consulted on the create path. +- Consumes: `secrets: inherit` from the caller (for `MULTITUDES_ACCESS_TOKEN`, referenced only on the `github.event_name == 'release'` path). + +- [ ] **Step 1: Write the full reusable workflow file** + +```yaml +name: "Build SQL (reusable)" + +# Reusable SQL build+attach, extracted from release-eql.yml's build-and-publish +# job. Called INLINE by: +# - release-alpha.yml (the coordinator) — SQL must build in-run because a +# GITHUB_TOKEN-created Release does not fire release-eql.yml's `on: release`. +# - release-eql.yml — for final (human-created) releases, whose `on: release` +# DOES fire (human token). One SQL-build code path, no double build. + +on: + workflow_call: + inputs: + ref: + description: "Git ref/SHA to build from. Empty -> default checkout (github.sha)." + required: false + type: string + default: "" + tag: + description: "Full release tag (e.g. eql-3.0.0-alpha.2). Empty -> DEV build, no attach." + required: false + type: string + default: "" + attach: + description: "Attach the built .sql artefacts to a GitHub Release." + required: false + type: boolean + default: false + target_commitish: + description: "Non-empty -> CREATE a prerelease at this commit; empty -> attach to the existing release named by `tag`." + required: false + type: string + default: "" + prerelease: + description: "Mark the created release as a prerelease (create path only)." + required: false + type: boolean + default: false + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" + MISE_VERBOSE: "1" + +defaults: + run: + shell: bash {0} + +permissions: + contents: write + +jobs: + build: + runs-on: blacksmith-16vcpu-ubuntu-2204 + name: Build EQL + timeout-minutes: 5 + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref }} + + - uses: jdx/mise-action@v3 + with: + version: 2026.4.0 + install: true + cache: true + + - name: Build EQL release + # Strip the `eql-` tag prefix so eql_v3.version() reports bare semver + # (e.g. "3.0.0-alpha.2"). Empty TAG -> ${TAG#eql-} is "" -> DEV default. + env: + TAG: ${{ inputs.tag }} + run: | + mise run build --version "${TAG#eql-}" + + - name: Upload EQL artifacts + uses: actions/upload-artifact@v4 + with: + name: eql-release + path: | + release/cipherstash-encrypt.sql + release/cipherstash-encrypt-uninstall.sql + + # Finals path: the release already exists (human-created); just upload the + # two artefacts. No prerelease flag is set, so the existing release's + # prerelease state is preserved byte-for-byte with the old behaviour. + - name: Attach artefacts to existing release + if: ${{ inputs.attach && inputs.target_commitish == '' }} + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.tag }} + files: | + release/cipherstash-encrypt.sql + release/cipherstash-encrypt-uninstall.sql + + # Coordinator path: no release exists yet — create the prerelease at the + # exact commit `target_commitish` and attach the two artefacts. + - name: Create prerelease at commit + if: ${{ inputs.attach && inputs.target_commitish != '' }} + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.tag }} + target_commitish: ${{ inputs.target_commitish }} + prerelease: ${{ inputs.prerelease }} + name: ${{ inputs.tag }} + body: "Preview (prerelease) of the standalone eql_v3 surface. See [Unreleased] in CHANGELOG.md." + files: | + release/cipherstash-encrypt.sql + release/cipherstash-encrypt-uninstall.sql + + # Preserved from the original build-and-publish job. Only fires for real + # (human) release events; for the coordinator (workflow_dispatch) and PR + # runs the guard is false, so the secret is never referenced there. + - name: Notify Multitudes + if: ${{ github.event_name == 'release' }} + run: | + curl --request POST \ + --fail-with-body \ + --url "https://api.developer.multitudes.co/deployments" \ + --header "Content-Type: application/json" \ + --header "Authorization: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}" \ + --data '{"commitSha": "${{ github.sha }}", "environmentName":"production"}' +``` + +- [ ] **Step 2: Validate the workflow syntax** + +Run: `actionlint .github/workflows/_build-sql.yml` +(If `actionlint` is not installed: `go install github.com/rhysd/actionlint/cmd/actionlint@latest`, or `brew install actionlint`, or download the release binary.) +Expected: no output (exit 0). A reusable workflow with only `on: workflow_call` passes. + +- [ ] **Step 3: Sanity-check the YAML parses** + +Run: `python3 -c "import yaml,sys; yaml.safe_load(open('.github/workflows/_build-sql.yml'))" && echo OK` +Expected: `OK` + +- [ ] **Step 4: Commit** + +```bash +git add .github/workflows/_build-sql.yml +git commit -m "ci(release): add reusable _build-sql.yml (workflow_call SQL build+attach)" +``` + +--- + +### Task 2: Reusable docs build — `.github/workflows/_build-docs.yml` + +**Files:** +- Create: `.github/workflows/_build-docs.yml` + +**Context (from the real `release-eql.yml` `publish-docs` job, lines ~105–156):** it checks out, runs mise-action, installs doxygen (`sudo apt-get update && sudo apt-get install -y doxygen`), runs `mise run docs:generate` then `mise run docs:generate:markdown -- ` (with `set -euo pipefail` so a generate failure fails fast), `mise run docs:package `, uploads `eql-docs-*.{zip,tar.gz}`, then attaches those files to the release. **The Multitudes-notify step lives in `build-and-publish`, NOT `publish-docs`** — so this reusable has no Multitudes step. The original attach step was gated `if: startsWith(github.ref, 'refs/tags/')`; that gate is **dropped** here because the coordinator's `github.ref` is a branch (not a tag), so gating on it would suppress the alpha docs attach. Attachment is instead gated on the passed `tag` being non-empty (matching the finals-on-PR "build but don't attach" behaviour, where `tag` is empty). + +**Interfaces:** +- Produces (the reusable's `workflow_call` inputs — Tasks 3 and 5 call with exactly these): + - `ref` (string, default `''`) — git ref/SHA to build docs from; empty → default `github.sha`. + - `tag` (string, default `''`) — full release tag, e.g. `eql-3.0.0-alpha.2`. Passed to `docs:generate:markdown`/`docs:package` and names the release to attach to. Empty → build docs, do **not** attach (PR/dispatch parity with the original). + +- [ ] **Step 1: Write the full reusable workflow file** + +```yaml +name: "Build docs (reusable)" + +# Reusable docs build+attach, extracted from release-eql.yml's publish-docs job. +# Called INLINE by: +# - release-alpha.yml (the coordinator) — docs must build in-run for the same +# reason as SQL: a GITHUB_TOKEN-created Release does not fire release-eql.yml. +# - release-eql.yml — for final (human-created) releases. +# The release the docs attach to already exists: _build-sql.yml creates it for +# alphas; a human creates it for finals. So this reusable only ATTACHES. + +on: + workflow_call: + inputs: + ref: + description: "Git ref/SHA to build docs from. Empty -> default checkout (github.sha)." + required: false + type: string + default: "" + tag: + description: "Full release tag (e.g. eql-3.0.0-alpha.2). Passed to docs:generate:markdown / docs:package and names the release to attach to. Empty -> build only, no attach." + required: false + type: string + default: "" + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" + MISE_VERBOSE: "1" + +defaults: + run: + shell: bash {0} + +permissions: + contents: write + +jobs: + publish-docs: + runs-on: blacksmith-16vcpu-ubuntu-2204 + name: Build and Publish Documentation + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref }} + + - uses: jdx/mise-action@v3 + with: + version: 2026.4.0 + install: true + cache: true + + - name: Install Doxygen + run: | + sudo apt-get update + sudo apt-get install -y doxygen + + - name: Generate documentation + # Fail fast: the workflow default shell is `bash {0}` (no -e), so without + # this a failure in docs:generate would be masked by the trailing + # docs:generate:markdown command and only surface later in docs:package. + env: + TAG: ${{ inputs.tag }} + run: | + set -euo pipefail + mise run docs:generate + mise run docs:generate:markdown -- "${TAG}" + + - name: Package documentation + env: + TAG: ${{ inputs.tag }} + run: | + mise run docs:package "${TAG}" + + - name: Upload documentation artifacts + uses: actions/upload-artifact@v4 + with: + name: eql-docs + path: | + release/eql-docs-*.zip + release/eql-docs-*.tar.gz + + # Attach only when a real release tag was passed. Empty tag (PR / bare + # dispatch of release-eql.yml) builds docs without attaching, matching the + # original `if: startsWith(github.ref,'refs/tags/')` behaviour without + # relying on github.ref (which is a branch under the coordinator). + - name: Publish documentation to release + if: ${{ inputs.tag != '' }} + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.tag }} + files: | + release/eql-docs-*.zip + release/eql-docs-*.tar.gz +``` + +- [ ] **Step 2: Validate the workflow syntax** + +Run: `actionlint .github/workflows/_build-docs.yml` +Expected: no output (exit 0). + +- [ ] **Step 3: Sanity-check the YAML parses** + +Run: `python3 -c "import yaml,sys; yaml.safe_load(open('.github/workflows/_build-docs.yml'))" && echo OK` +Expected: `OK` + +- [ ] **Step 4: Commit** + +```bash +git add .github/workflows/_build-docs.yml +git commit -m "ci(release): add reusable _build-docs.yml (workflow_call docs build+attach)" +``` + +--- + +### Task 3: Refactor `release-eql.yml` to call the reusables + +**Files:** +- Modify: `.github/workflows/release-eql.yml` (replace the `build-and-publish` job's `steps` with a `uses:` call to `_build-sql.yml`; replace the `publish-docs` job's `steps` with a `uses:` call to `_build-docs.yml`; leave `verify-changelog` unchanged) + +**Interfaces:** +- Consumes: `_build-sql.yml` inputs (Task 1: `ref`, `tag`, `attach`, `target_commitish`, `prerelease`) and `_build-docs.yml` inputs (Task 2: `ref`, `tag`). + +- [ ] **Step 1: Replace the `build-and-publish` job body** + +Replace the entire `build-and-publish:` job (currently a `runs-on`/`steps` job) with a reusable call. **Keep the exact `if:` guard.** + +```yaml + build-and-publish: + name: Build EQL + # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags + # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases. + if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }} + permissions: + contents: write + secrets: inherit + uses: ./.github/workflows/_build-sql.yml + with: + # Finals: build the checked-out release commit (default), attach to the + # existing human-created release, never re-create it. + ref: "" + tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }} + attach: ${{ github.event_name == 'release' && startsWith(github.ref, 'refs/tags/') }} + target_commitish: "" + prerelease: false +``` + +- [ ] **Step 2: Replace the `publish-docs` job body** + +Replace the entire `publish-docs:` job (currently a `runs-on`/`steps` job) with a reusable call. **Keep the exact `if:` guard.** + +```yaml + publish-docs: + name: Build and Publish Documentation + # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags + # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases. + if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }} + permissions: + contents: write + uses: ./.github/workflows/_build-docs.yml + with: + # Finals: build docs at the release commit (default checkout), attach to + # the existing human-created release. Empty tag on PR -> build, no attach. + ref: "" + tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }} +``` + +Keep the `verify-changelog` job exactly as-is. **Keep the top-level `on`, `env`, `defaults`, and `permissions` unchanged** (the reusable jobs still run under them). + +- [ ] **Step 3: Confirm no behaviour change for finals (read-through)** + +Verify by inspection: +- A `release: published` event with an `eql-…` (non-`eql-bindings`) tag → + - `build-and-publish` calls `_build-sql.yml` with `tag = tag_name`, `attach = true`, `target_commitish = ""` → **"Attach artefacts to existing release"** step → same two `.sql` files on the same release, prerelease flag untouched, Multitudes fires. Identical. + - `publish-docs` calls `_build-docs.yml` with `ref = ""` (checkout the release commit = `github.sha`), `tag = tag_name` → builds docs at the release commit and attaches `eql-docs-*` to the existing release. Identical to the old job (which attached because `github.ref` was `refs/tags/…`). +- A `pull_request` run (workflow file changed) → both jobs run with `tag = ''` → build only, no attach (docs build, `if: inputs.tag != ''` false). Identical to before. + +- [ ] **Step 4: Validate** + +Run: `actionlint .github/workflows/release-eql.yml && python3 -c "import yaml; yaml.safe_load(open('.github/workflows/release-eql.yml'))" && echo OK` +Expected: `OK`, no actionlint errors. (actionlint resolves both local `uses:` calls and checks `with:` inputs against Tasks 1 and 2 — a typo'd input name fails here.) + +- [ ] **Step 5: Commit** + +```bash +git add .github/workflows/release-eql.yml +git commit -m "ci(release): route release-eql.yml SQL + docs builds through reusables" +``` + +--- + +### Task 4: Gate `release-plz.yml`'s `release-pr` job to `main` + +**Files:** +- Modify: `.github/workflows/release-plz.yml` (add one `if:` to the `release-pr` job) + +**Interfaces:** +- Produces: a `release-plz.yml` whose `release` job still publishes on any ref (branch-agnostic), but whose `release-pr` job runs **only** on `refs/heads/main`. The coordinator dispatches this workflow against a **tag**, so `release-pr` is skipped → no stray release PR. + +- [ ] **Step 1: Add the `if:` guard to `release-pr`** + +In the `release-pr:` job, add an `if:` as the first key after `name:`: + +```yaml + release-pr: + name: "Release PR" + # Only open/refresh the release PR on push-to-main. A workflow_dispatch + # against a tag (the coordinator's crate-publish path) or a feature branch + # must publish WITHOUT opening a stray recursive release PR. + if: github.ref == 'refs/heads/main' + runs-on: blacksmith-16vcpu-ubuntu-2204 + needs: release + steps: + # ... unchanged ... +``` + +Leave the `release:` job, `concurrency`, `permissions`, `on`, and everything else unchanged. + +- [ ] **Step 2: Verify the gate logic (read-through)** + +- Push to `main` → `github.ref == 'refs/heads/main'` → `release-pr` runs (unchanged). +- Coordinator `gh workflow run release-plz.yml --ref eql-3.0.0-alpha.2` → ref is `refs/tags/…` → `release-pr` **skipped**; `release` still runs, checks out the tag, publishes. +- Manual `workflow_dispatch` on `main` → ref is `refs/heads/main` → `release-pr` runs. + +- [ ] **Step 3: Validate** + +Run: `actionlint .github/workflows/release-plz.yml && python3 -c "import yaml; yaml.safe_load(open('.github/workflows/release-plz.yml'))" && echo OK` +Expected: `OK`. + +- [ ] **Step 4: Commit** + +```bash +git add .github/workflows/release-plz.yml +git commit -m "ci(release): gate release-plz release-pr job to refs/heads/main" +``` + +--- + +### Task 5: The coordinator — `.github/workflows/release-alpha.yml` + +**Files:** +- Create: `.github/workflows/release-alpha.yml` + +**Interfaces:** +- Consumes: `_build-sql.yml` (Task 1) and `_build-docs.yml` (Task 2) via `workflow_call`; `release-plz.yml` (Task 4) via `gh workflow run` (the crate publish entry point). +- Produces (relied on by Task 6's mise tasks): `workflow_dispatch` inputs `target` / `version` / `channel` / `pre` / `dry_run`; a `run-name` that embeds `` and the resolved-or-partial identity so the mise task can find the exact run; `concurrency: { group: release-alpha }`. + +**Job graph:** + +``` +resolve ──> pin ──> build-sql ──> build-docs ──> crate-publish ──> summary + │ │ │ │ │ + └─────────┴──────────┴─────────────┴──────────────┘ (each gated by target + dry_run) +``` + +- `resolve` — always. Derive identity across both namespaces (or accept `pre`); target-specific existence/invariant guards; run drift gates `types:check` + `codegen:parity`. On `dry_run`, print the plan and stop. +- `pin` — `all`/`bindings` only, non-dry: `release-plz set-version`, GPG-signed commit staging crate files, push → commit `S`. +- `build-sql` — `all`/`eql` only, non-dry: reusable call. For `all`, checks out `S` and creates the prerelease at `S`; for `eql`, at branch `github.sha`. +- `build-docs` — `all`/`eql` only, non-dry, **after** `build-sql` (the release must exist to attach docs): reusable call at the same commit `build-sql` used, attaching `eql-docs-*` to the SQL release. +- `crate-publish` — `all`/`bindings` only, non-dry, **after** `build-sql` **and** `build-docs` for `all`: `gh workflow run release-plz.yml --ref `. A docs failure aborts before the crate ships. +- `summary` — always: link the coordinator run and the dispatched `release-plz.yml` run. + +- [ ] **Step 1: Write the coordinator header, inputs, permissions, concurrency, run-name** + +```yaml +name: "Release alpha (coordinator)" + +# CI-native prerelease coordinator for the two EQL artefacts (SQL surface + +# eql-bindings crate). Alphas ship the same assets as finals: two .sql files +# AND the packaged docs bundle. Runs on the DISPATCHED REF. See +# docs/development/2026-07-04-release-tasks-design.md for the full rationale. + +on: + workflow_dispatch: + inputs: + target: + description: "all | eql | bindings" + required: true + type: choice + options: [all, eql, bindings] + default: all + version: + description: "Base SemVer, e.g. 3.0.0" + required: false + type: string + default: "3.0.0" + channel: + description: "alpha | beta | rc" + required: false + type: choice + options: [alpha, beta, rc] + default: alpha + pre: + description: "Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" + required: false + type: string + default: "" + dry_run: + description: "Resolve + verify + print plan; mutate nothing" + required: false + type: boolean + default: false + +# The mise task finds THIS run by the identity + target in run-name (never -L1). +# When `pre` is given the identity is exact; otherwise N is derived server-side, +# so run-name carries version-channel (+ target), and the watcher disambiguates +# by createdAt recency. +run-name: >- + release-alpha ${{ inputs.target }} ${{ inputs.pre != '' && inputs.pre || format('{0}-{1}', inputs.version, inputs.channel) }}${{ inputs.dry_run && ' [dry-run]' || '' }} + +permissions: + contents: write # pin push + prerelease creation + docs/sql attach + actions: write # gh workflow run release-plz.yml (dispatch) + +concurrency: + # Serialise coordinator runs. The crate publish is separately serialised by + # release-plz.yml's own `release-plz` group. Never cancel a release mid-flight. + group: release-alpha + cancel-in-progress: false + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" + MISE_VERBOSE: "1" + +defaults: + run: + shell: bash {0} +``` + +- [ ] **Step 2: Write the `resolve` job** + +```yaml +jobs: + resolve: + name: Resolve identity + verify + runs-on: blacksmith-16vcpu-ubuntu-2204 + timeout-minutes: 15 + outputs: + identity: ${{ steps.derive.outputs.identity }} + sql_tag: ${{ steps.derive.outputs.sql_tag }} + crate_tag: ${{ steps.derive.outputs.crate_tag }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fetch all tags + run: git fetch --tags --force + + - name: Validate inputs + env: + CHANNEL: ${{ inputs.channel }} + TARGET: ${{ inputs.target }} + run: | + set -euo pipefail + case "$CHANNEL" in alpha|beta|rc) ;; *) echo "::error::invalid channel '$CHANNEL'"; exit 1 ;; esac + case "$TARGET" in all|eql|bindings) ;; *) echo "::error::invalid target '$TARGET'"; exit 1 ;; esac + + - name: Derive identity + guards + id: derive + env: + TARGET: ${{ inputs.target }} + VERSION: ${{ inputs.version }} + CHANNEL: ${{ inputs.channel }} + PRE: ${{ inputs.pre }} + run: | + set -euo pipefail + + sql_prefix="eql-${VERSION}-${CHANNEL}." + crate_prefix="eql-bindings-v${VERSION}-${CHANNEL}." + + # Highest N under a tag prefix, or empty. `.` in the prefix is escaped + # so it can't match arbitrary characters in the sed pattern. + highest() { + local prefix="$1" esc + esc="${prefix//./\\.}" + git tag --list "${prefix}*" \ + | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" \ + | sort -n | tail -1 + } + + if [[ -n "$PRE" ]]; then + identity="$PRE" + else + case "$TARGET" in + all|eql) + sql_n=$(highest "$sql_prefix"); sql_n=${sql_n:-0} + crate_n=$(highest "$crate_prefix"); crate_n=${crate_n:-0} + if (( sql_n >= crate_n )); then n=$(( sql_n + 1 )); else n=$(( crate_n + 1 )); fi + identity="${VERSION}-${CHANNEL}.${n}" + ;; + bindings) + # Default: the latest SQL alpha lacking a crate counterpart. + esc="${sql_prefix//./\\.}" + found="" + for n in $(git tag --list "${sql_prefix}*" | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" | sort -rn); do + if ! git rev-parse -q --verify "refs/tags/${crate_prefix}${n}" >/dev/null; then + found="$n"; break + fi + done + if [[ -z "$found" ]]; then + echo "::error::no ${sql_prefix}N SQL release is awaiting a crate publish (nothing to do for target=bindings)"; exit 1 + fi + identity="${VERSION}-${CHANNEL}.${found}" + ;; + esac + fi + + sql_tag="eql-${identity}" + crate_tag="eql-bindings-v${identity}" + + # Target-specific guards. + case "$TARGET" in + all) + if git rev-parse -q --verify "refs/tags/${sql_tag}" >/dev/null; then echo "::error::${sql_tag} already exists"; exit 1; fi + if git rev-parse -q --verify "refs/tags/${crate_tag}" >/dev/null; then echo "::error::${crate_tag} already exists"; exit 1; fi + ;; + eql) + if git rev-parse -q --verify "refs/tags/${sql_tag}" >/dev/null; then echo "::error::${sql_tag} already exists"; exit 1; fi + ;; + bindings) + # Lockstep invariant: a crate version never ships without a + # matching SQL release of the SAME version. + if ! git rev-parse -q --verify "refs/tags/${sql_tag}" >/dev/null; then + echo "::error::${sql_tag} SQL release must exist before publishing the crate (lockstep invariant)"; exit 1 + fi + if git rev-parse -q --verify "refs/tags/${crate_tag}" >/dev/null; then echo "::error::${crate_tag} already exists"; exit 1; fi + ;; + esac + + echo "identity=${identity}" >> "$GITHUB_OUTPUT" + echo "sql_tag=${sql_tag}" >> "$GITHUB_OUTPUT" + echo "crate_tag=${crate_tag}" >> "$GITHUB_OUTPUT" + + - uses: jdx/mise-action@v3 + with: + version: 2026.4.0 + install: true + cache: true + + - name: Verify drift gates (types:check + codegen:parity) + # Both are DB-free: they regenerate the committed bindings / SQL surface + # and `git diff` against the checkout. A drift here means the shipped + # src/v3 would not match the catalog — abort before any mutation. + run: | + set -euo pipefail + mise run types:check + mise run codegen:parity + + - name: Print plan + env: + TARGET: ${{ inputs.target }} + DRY: ${{ inputs.dry_run }} + run: | + set -euo pipefail + { + echo "## Release plan" + echo "" + echo "| field | value |" + echo "|---|---|" + echo "| target | ${TARGET} |" + echo "| identity | ${{ steps.derive.outputs.identity }} |" + echo "| sql_tag | ${{ steps.derive.outputs.sql_tag }} |" + echo "| crate_tag | ${{ steps.derive.outputs.crate_tag }} |" + echo "| ref | ${{ github.ref_name }} @ ${{ github.sha }} |" + echo "| dry_run | ${DRY} |" + } >> "$GITHUB_STEP_SUMMARY" +``` + +Notes on `set -e` safety: every guard uses `if ; then …; fi` (not ` && { fail; }`), so a `git rev-parse` returning non-zero does not abort the script. + +- [ ] **Step 3: Write the `pin` job** + +```yaml + pin: + name: Pin crate version (commit S) + runs-on: blacksmith-16vcpu-ubuntu-2204 + needs: resolve + if: ${{ !inputs.dry_run && (inputs.target == 'all' || inputs.target == 'bindings') }} + timeout-minutes: 15 + outputs: + commit_sha: ${{ steps.commit.outputs.commit_sha }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.ref_name }} # the dispatched branch; push target + fetch-depth: 0 + + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@v7 + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + git_user_signingkey: true + git_commit_gpgsign: true + + - uses: jdx/mise-action@v3 + with: + version: 2026.4.0 + install: true + cache: true + + - name: Install release-plz CLI + # cargo-binstall is a mise tool (fast prebuilt fetch, no source build). + run: cargo binstall --no-confirm release-plz + + - name: Pin + commit + push (commit S) + id: commit + env: + IDENTITY: ${{ needs.resolve.outputs.identity }} + BRANCH: ${{ github.ref_name }} + run: | + set -euo pipefail + release-plz set-version "eql-bindings@${IDENTITY}" + git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock + git commit -S -m "chore(release): pin eql-bindings to ${IDENTITY}" + git push origin "HEAD:${BRANCH}" + echo "commit_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" +``` + +- [ ] **Step 4: Write the `build-sql` reusable-call job** + +```yaml + build-sql: + name: Build + release SQL (in-run) + needs: [resolve, pin] + # all/eql only, non-dry. For `all`, pin must have succeeded; for `eql`, pin + # is skipped (SQL without a crate is allowed). + if: >- + ${{ !cancelled() && !inputs.dry_run + && (inputs.target == 'all' || inputs.target == 'eql') + && needs.resolve.result == 'success' + && (needs.pin.result == 'success' || needs.pin.result == 'skipped') }} + permissions: + contents: write + secrets: inherit + uses: ./.github/workflows/_build-sql.yml + with: + # all: build + release AT commit S (the pin commit). eql: at branch HEAD. + ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || '' }} + tag: ${{ needs.resolve.outputs.sql_tag }} + attach: true + target_commitish: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }} + prerelease: true +``` + +- [ ] **Step 5: Write the `build-docs` reusable-call job** + +```yaml + build-docs: + name: Build + attach docs (in-run) + needs: [resolve, pin, build-sql] + # all/eql only, non-dry. build-sql must have SUCCEEDED first: the docs attach + # to the SQL release, which build-sql creates. A docs failure here blocks the + # (irreversible) crate publish downstream. + if: >- + ${{ !cancelled() && !inputs.dry_run + && (inputs.target == 'all' || inputs.target == 'eql') + && needs.build-sql.result == 'success' }} + permissions: + contents: write + uses: ./.github/workflows/_build-docs.yml + with: + # Same commit build-sql used: pin commit S for `all`, branch HEAD for `eql`. + ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }} + tag: ${{ needs.resolve.outputs.sql_tag }} +``` + +- [ ] **Step 6: Write the `crate-publish` job** + +```yaml + crate-publish: + name: Dispatch crate publish (release-plz.yml) + runs-on: blacksmith-16vcpu-ubuntu-2204 + needs: [resolve, pin, build-sql, build-docs] + # all/bindings only, non-dry. For `all`, a COMPLETE release (SQL + docs) must + # exist first — build-sql AND build-docs must have succeeded — before the + # irreversible crate publish. For `bindings`, build-sql/build-docs are skipped + # (the SQL release + its docs already exist from an earlier target=eql/all run). + if: >- + ${{ !cancelled() && !inputs.dry_run + && (inputs.target == 'all' || inputs.target == 'bindings') + && needs.pin.result == 'success' + && (needs.build-sql.result == 'success' || needs.build-sql.result == 'skipped') + && (needs.build-docs.result == 'success' || needs.build-docs.result == 'skipped') }} + timeout-minutes: 10 + steps: + - name: Dispatch release-plz.yml against the pinned commit + # crates.io Trusted Publishing matches workflow_ref = release-plz.yml, so + # the crate MUST publish from release-plz.yml as its own entry point. + # `workflow_dispatch` is the GITHUB_TOKEN suppression exception, so this + # actually starts a run. For `all` we dispatch against the immutable SQL + # tag (== commit S); for `bindings` against the branch (head == pin S). + env: + GH_TOKEN: ${{ github.token }} + SQL_TAG: ${{ needs.resolve.outputs.sql_tag }} + BRANCH: ${{ github.ref_name }} + TARGET: ${{ inputs.target }} + run: | + set -euo pipefail + if [[ "$TARGET" == "all" ]]; then + ref="$SQL_TAG" + else + ref="$BRANCH" + fi + echo "Dispatching release-plz.yml --ref ${ref}" + gh workflow run release-plz.yml --ref "$ref" + { + echo "## Crate publish dispatched" + echo "" + echo "Dispatched \`release-plz.yml\` against \`${ref}\`." + echo "Watch it separately: it runs as its own entry point (TP matches)." + } >> "$GITHUB_STEP_SUMMARY" +``` + +- [ ] **Step 7: Write the `summary` job** + +```yaml + summary: + name: Summary + runs-on: blacksmith-16vcpu-ubuntu-2204 + needs: [resolve, pin, build-sql, build-docs, crate-publish] + if: always() + steps: + - name: Emit run summary + env: + TARGET: ${{ inputs.target }} + DRY: ${{ inputs.dry_run }} + run: | + set -euo pipefail + { + echo "## release-alpha result" + echo "" + echo "- target: \`${TARGET}\` (dry_run=${DRY})" + echo "- identity: \`${{ needs.resolve.outputs.identity }}\`" + echo "- sql_tag: \`${{ needs.resolve.outputs.sql_tag }}\`" + echo "- crate_tag: \`${{ needs.resolve.outputs.crate_tag }}\`" + echo "- resolve: ${{ needs.resolve.result }} | pin: ${{ needs.pin.result }} | build-sql: ${{ needs.build-sql.result }} | build-docs: ${{ needs.build-docs.result }} | crate-publish: ${{ needs.crate-publish.result }}" + echo "" + echo "Coordinator run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + echo "The crate publish (if dispatched) runs as a SEPARATE release-plz.yml run — watch it in the Actions tab." + } >> "$GITHUB_STEP_SUMMARY" +``` + +- [ ] **Step 8: Validate the coordinator** + +Run: `actionlint .github/workflows/release-alpha.yml && python3 -c "import yaml; yaml.safe_load(open('.github/workflows/release-alpha.yml'))" && echo OK` +Expected: `OK`. actionlint checks: the `uses: ./.github/workflows/_build-sql.yml` and `_build-docs.yml` inputs match Tasks 1 & 2; `needs` references exist; expression syntax valid. + +- [ ] **Step 9: Commit** + +```bash +git add .github/workflows/release-alpha.yml +git commit -m "ci(release): add release-alpha.yml coordinator (SQL + docs in-run, then crate)" +``` + +--- + +### Task 6: Thin mise triggers + retire `preview.sh` + +**Files:** +- Create: `tasks/release/all.sh`, `tasks/release/eql.sh`, `tasks/release/bindings.sh` (auto-register as `release:all` / `release:eql` / `release:bindings`) +- Delete: `tasks/release/preview.sh` (retires `release:preview`) + +**Interfaces:** +- Consumes: `release-alpha.yml` inputs (Task 5): `target`, `version`, `channel`, `pre`, `dry_run`; and the `run-name` shape `release-alpha …`. +- Each task forwards `--version`/`--channel`/`--pre`/`--dry-run` and watches the run it started by matching the `run-name` (never `gh run list -L1`). + +Design note — the three scripts are intentionally near-identical (only `target=` differs), so the dispatch+watch logic is inlined in each rather than sourced from a shared helper. mise auto-discovers **every** file under `tasks/`, so a sourced `tasks/release/_lib.sh` would register as a phantom `release:_lib` task; inlining ~30 thin lines avoids that. This matches the existing self-contained `preview.sh` pattern. + +- [ ] **Step 1: Write `tasks/release/all.sh`** + +```bash +#!/usr/bin/env bash +#MISE description="Cut an alpha of BOTH artefacts in lockstep: dispatch release-alpha.yml (target=all) and watch the run" +#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0" +#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha" +#USAGE flag "--pre
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git ref to dispatch against" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+# Thin trigger: this does NOTHING release-relevant locally. It dispatches the
+# CI-native coordinator (.github/workflows/release-alpha.yml) with target=all
+# and watches THAT run. Same-commit lockstep + all safety live in CI.
+
+target="all"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+[[ -n "$ref" ]] || ref="$(git rev-parse --abbrev-ref HEAD)"
+
+# Correlation string that MUST appear in the coordinator's run-name (see
+# release-alpha.yml). When --pre is given the identity is exact; otherwise the
+# coordinator derives N server-side, so we correlate on version-channel + target
+# and pick the newest matching run created after dispatch.
+correlation="${pre:-${version}-${channel}}"
+
+dispatched_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
+echo "==> Dispatching release-alpha.yml (target=${target}) on ref ${ref}"
+gh workflow run release-alpha.yml --ref "$ref" \
+  -f target="$target" \
+  -f version="$version" \
+  -f channel="$channel" \
+  ${pre:+-f pre="$pre"} \
+  $([[ "$dry_run" == "true" ]] && printf -- '-f dry_run=true')
+
+echo "==> Locating the dispatched run (by run-name '${target} ${correlation}', not -L1)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle,createdAt \
+    --jq "[.[] | select(.createdAt >= \"${dispatched_at}\") | select(.displayTitle | contains(\"${target} ${correlation}\"))] | sort_by(.createdAt) | last | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched release-alpha run"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Coordinator run finished. For target=all, the crate publish runs as a SEPARATE release-plz.yml run — watch it in the Actions tab."
+```
+
+- [ ] **Step 2: Write `tasks/release/eql.sh`**
+
+Identical to `all.sh` except the `#MISE description`, `target`, and the trailing note. Full file:
+
+```bash
+#!/usr/bin/env bash
+#MISE description="Cut an alpha of the SQL surface + docs only: dispatch release-alpha.yml (target=eql) and watch the run"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git ref to dispatch against" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+target="eql"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+[[ -n "$ref" ]] || ref="$(git rev-parse --abbrev-ref HEAD)"
+correlation="${pre:-${version}-${channel}}"
+
+dispatched_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
+echo "==> Dispatching release-alpha.yml (target=${target}) on ref ${ref}"
+gh workflow run release-alpha.yml --ref "$ref" \
+  -f target="$target" \
+  -f version="$version" \
+  -f channel="$channel" \
+  ${pre:+-f pre="$pre"} \
+  $([[ "$dry_run" == "true" ]] && printf -- '-f dry_run=true')
+
+echo "==> Locating the dispatched run (by run-name '${target} ${correlation}', not -L1)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle,createdAt \
+    --jq "[.[] | select(.createdAt >= \"${dispatched_at}\") | select(.displayTitle | contains(\"${target} ${correlation}\"))] | sort_by(.createdAt) | last | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched release-alpha run"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Done. SQL prerelease + docs cut; no crate published (target=eql)."
+```
+
+- [ ] **Step 3: Write `tasks/release/bindings.sh`**
+
+Identical to `eql.sh` except `#MISE description`, `target="bindings"`, and the trailing note. Full file:
+
+```bash
+#!/usr/bin/env bash
+#MISE description="Publish the eql-bindings crate for an EXISTING SQL alpha: dispatch release-alpha.yml (target=bindings) and watch the run"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git ref to dispatch against" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+# target=bindings requires a matching eql- SQL release (which already
+# carries its docs) to already exist — the lockstep invariant, enforced
+# server-side in release-alpha.yml.
+
+target="bindings"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+[[ -n "$ref" ]] || ref="$(git rev-parse --abbrev-ref HEAD)"
+correlation="${pre:-${version}-${channel}}"
+
+dispatched_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
+echo "==> Dispatching release-alpha.yml (target=${target}) on ref ${ref}"
+gh workflow run release-alpha.yml --ref "$ref" \
+  -f target="$target" \
+  -f version="$version" \
+  -f channel="$channel" \
+  ${pre:+-f pre="$pre"} \
+  $([[ "$dry_run" == "true" ]] && printf -- '-f dry_run=true')
+
+echo "==> Locating the dispatched run (by run-name '${target} ${correlation}', not -L1)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle,createdAt \
+    --jq "[.[] | select(.createdAt >= \"${dispatched_at}\") | select(.displayTitle | contains(\"${target} ${correlation}\"))] | sort_by(.createdAt) | last | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched release-alpha run"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Coordinator finished. The crate publish runs as a SEPARATE release-plz.yml run — watch it in the Actions tab."
+```
+
+- [ ] **Step 4: Make the scripts executable and delete `preview.sh`**
+
+```bash
+chmod +x tasks/release/all.sh tasks/release/eql.sh tasks/release/bindings.sh
+git rm tasks/release/preview.sh
+```
+
+- [ ] **Step 5: Verify mise task registration**
+
+Run: `mise tasks ls | grep -E '^release:'`
+Expected: `release:all`, `release:bindings`, `release:eql` present; `release:preview` **absent**.
+
+- [ ] **Step 6: Lint the scripts**
+
+Run: `shellcheck tasks/release/all.sh tasks/release/eql.sh tasks/release/bindings.sh`
+Expected: no errors. (If `shellcheck` is unavailable, `bash -n tasks/release/*.sh` at minimum — expected: no syntax errors.)
+
+- [ ] **Step 7: Commit**
+
+```bash
+git add tasks/release/all.sh tasks/release/eql.sh tasks/release/bindings.sh
+git commit -m "ci(release): add thin release:{all,eql,bindings} mise triggers; retire release:preview"
+```
+
+---
+
+### Task 7: Documentation updates
+
+**Files:**
+- Modify: `docs/development/releasing-an-alpha.md` (replace the manual/`release:preview` runbook with the task/dispatch flow)
+- Modify: `CLAUDE.md` (swap `release:preview` → the three new tasks; note they trigger `release-alpha.yml`)
+- Grep-and-fix any remaining stray `release:preview` references
+
+- [ ] **Step 1: Rewrite `docs/development/releasing-an-alpha.md`**
+
+Replace the "Scripted path (recommended)", "Steps (manual equivalent)", and "Releasing `eql-bindings` in lockstep" sections with the CI-native flow. Key content to include (keep the "What ships", "Why a prerelease is different", "Smoke-test", and "Promoting to a final release" sections, updated where they mention `release:preview`):
+
+- **What ships (unchanged for alphas):** the two `.sql` files **and** the packaged docs bundle (`eql-docs-*.zip`/`.tar.gz`) — the coordinator builds both in-run, so a coordinator-cut alpha carries the same assets as a final release.
+- **The three tasks** and what each dispatches:
+  - `mise run release:all` → coordinator `target=all`: pins the crate to ``, commits+pushes (commit `S`), builds+attaches the SQL prerelease at `S`, builds+attaches docs at `S`, then dispatches `release-plz.yml` against the `eql-` tag to publish the crate at `S`. Both tags land on `S`.
+  - `mise run release:eql` → `target=eql`: SQL prerelease + docs only (no crate). SQL-without-crate is allowed.
+  - `mise run release:bindings` → `target=bindings`: publishes the crate for an **already-existing** `eql-` SQL release (which already carries its docs); fails if none exists.
+- **Flags**: `--version` (default `3.0.0`), `--channel` (`alpha`|`beta`|`rc`), `--pre` (exact identity, bypass `N`), `--ref` (default current branch), `--dry-run` (resolve+verify+print plan, mutate nothing).
+- **Always `--dry-run` first.** Example:
+  ```bash
+  mise run release:all --dry-run
+  mise run release:all                    # -> eql-3.0.0-alpha.N (+ docs) + eql-bindings-v3.0.0-alpha.N on one commit
+  mise run release:eql --channel beta     # -> eql-3.0.0-beta.N (SQL + docs only)
+  mise run release:bindings --pre 3.0.0-alpha.2   # publish the crate for an existing eql-3.0.0-alpha.2
+  ```
+- **Identity derivation** happens **server-side** across both tag namespaces (`N = 1 + max(SQL N, crate N)`), from freshly-fetched tags — no stale local tags.
+- **Two runs to watch for `target=all`/`target=bindings`**: the mise task watches the coordinator run; the crate publish is a **separate** `release-plz.yml` run (fire-and-forget) — watch it in the Actions tab. The failure direction (crate fails after SQL+docs shipped) is the safe one (SQL-without-crate).
+- **Ordering guarantee:** SQL → docs → crate. A docs-build failure aborts before the irreversible crate publish, so a crate never ships against an incomplete release.
+- **The prerequisite for the crate**: crates.io Trusted Publishing is configured for `Workflow: release-plz.yml`; the coordinator dispatches that workflow so the OIDC identity still matches. Do not move the crate publish into the coordinator.
+- Remove all `mise run release:preview`, `--tag`, and `--target ` references; the manual `gh release create` steps; and the entire hand-coordinated lockstep procedure (it is now the coordinator's job). Keep the "Smoke-test the alpha" and "Promoting to a final release later" sections, updating the tag examples to `eql-3.0.0-alpha.N`.
+
+- [ ] **Step 2: Update `CLAUDE.md`**
+
+In the "Release & changelog discipline" section (around line 243), replace the **Prerelease** bullet:
+
+Old:
+```
+- **Prerelease (alpha / beta / rc):** run `mise run release:preview` (`tasks/release/preview.sh`). ...
+```
+New (match the surrounding tone/density):
+```
+- **Prerelease (alpha / beta / rc):** run `mise run release:all` (both artefacts in lockstep), `mise run release:eql` (SQL surface + docs only), or `mise run release:bindings` (crate for an existing SQL alpha). Each is a thin trigger that dispatches the CI-native coordinator `.github/workflows/release-alpha.yml` (`workflow_dispatch`) and watches the run — nothing release-relevant runs locally. The coordinator derives the `-.` identity server-side across both tag namespaces, verifies the drift gates, and (for `all`) pins+commits the crate, builds+attaches the SQL prerelease and the docs bundle in-run, then dispatches the crate publish so both land on one commit. Always `--dry-run` first; `--pre` sets an exact identity; `--ref`/`--channel`/`--version` tune the dispatch. It does **not** touch `CHANGELOG.md` (previews stay under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
+```
+
+Also update the lockstep paragraph immediately below it: replace "This is a manual coordination procedure" with a note that lockstep is now automated by `mise run release:all` / the `release-alpha.yml` coordinator (same-commit `eql-bindings-v` ↔ `eql-`), and update the line-291-area pointer ("For an alpha/beta/rc, use `mise run release:preview` instead") to name the three new tasks.
+
+- [ ] **Step 3: Grep for stray references**
+
+Run:
+```bash
+grep -rn "release:preview\|tasks/release/preview" --include="*.md" --include="*.toml" --include="*.sh" . | grep -v node_modules
+```
+Expected: **no matches** (all migrated). Fix any that remain.
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add docs/development/releasing-an-alpha.md CLAUDE.md
+git commit -m "docs(release): document CI-native release:{all,eql,bindings} flow; drop release:preview"
+```
+
+---
+
+### Task 8: End-to-end validation (staged rollout)
+
+**Files:** none (execution + observation only). This task cannot be fully dry-run: a crates.io publish is irreversible, so a **real alpha is the only true end-to-end test**. Validate in increasing order of irreversibility.
+
+**Precondition:** the branch (`feat/release-tasks`, or wherever this lands) must be **pushed** — `gh workflow run` reads the workflow file from the dispatched ref, so `release-alpha.yml` must exist on that ref.
+
+- [ ] **Step 1: Static validation of all workflows**
+
+Run: `actionlint .github/workflows/_build-sql.yml .github/workflows/_build-docs.yml .github/workflows/release-eql.yml .github/workflows/release-plz.yml .github/workflows/release-alpha.yml`
+Expected: no output (exit 0).
+
+- [ ] **Step 2: `dry_run` each target (mutates nothing)**
+
+```bash
+mise run release:eql --dry-run
+mise run release:all --dry-run
+mise run release:bindings --dry-run   # expect a fast failure if no SQL alpha awaits a crate
+```
+Expected: each dispatches a coordinator run that resolves an identity, prints the plan to the run summary, and **creates no tags/releases/commits**. Confirm via the run's "Release plan" summary. `release:bindings --dry-run` with no eligible SQL release should fail in `resolve` with the lockstep-invariant error — that is correct.
+
+- [ ] **Step 3: Cross-namespace `N` check (read the resolved plan)**
+
+With an `eql-3.0.0-alpha.5` tag present and no crate alpha tag:
+- `mise run release:bindings --pre 3.0.0-alpha.5 --dry-run` → resolves (matching SQL exists).
+- `mise run release:all --dry-run` → plan shows identity `3.0.0-alpha.6` (`N = 1 + max(5, 0)`).
+- `mise run release:bindings --version 3.0.0 --channel alpha --dry-run` (no `--pre`) → resolves to the latest SQL alpha lacking a crate (`alpha.5`).
+
+- [ ] **Step 4: Throwaway `target=eql` smoke release (SQL + docs)**
+
+```bash
+mise run release:eql
+```
+Expected: coordinator run succeeds; a prerelease `eql-3.0.0-alpha.N` is created on the branch HEAD with `cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`, **and** the `eql-docs-*.zip`/`.tar.gz` bundle attached; **no crate published**; **no `release-pr`** anywhere. Verify:
+```bash
+gh release view eql-3.0.0-alpha.N          # two .sql assets + eql-docs-*, marked prerelease
+gh run list --workflow release-plz.yml -L 3   # confirm NO new release-plz run fired
+```
+Then delete the throwaway release + tag if it was only a smoke test:
+```bash
+gh release delete eql-3.0.0-alpha.N --cleanup-tag --yes
+```
+
+- [ ] **Step 5: Docs-failure aborts the crate (fault-injection, optional)**
+
+Confirm the ordering guarantee by observation: in any `target=all` run where `build-docs` fails, `crate-publish` must be **skipped** (its `if` requires `needs.build-docs.result == 'success'`). Read a run's job graph to confirm `crate-publish` did not start when `build-docs` was red. (Do not deliberately break docs on a real publish; verify from run history or a scratch branch.)
+
+- [ ] **Step 6: Real `target=all` end-to-end**
+
+```bash
+mise run release:all
+```
+Expected and to verify:
+- Both tags land on the **same commit `S`**:
+  ```bash
+  git fetch --tags
+  git rev-list -n1 eql-3.0.0-alpha.N
+  git rev-list -n1 eql-bindings-v3.0.0-alpha.N   # equal to the above
+  ```
+- The SQL prerelease + docs bundle were built+attached **in-run** (`build-sql` and `build-docs` jobs green) **before** the crate dispatch.
+- The crate publish ran as a **separate `release-plz.yml` run** (workflow_dispatch), its `release` job green, `release-pr` **skipped** (ref is a tag), and the crates.io **TP token exchange succeeded** (publish ran under `workflow_ref = release-plz.yml`). Confirm:
+  ```bash
+  gh run list --workflow release-plz.yml -L 3      # the dispatched run present
+  gh run view                          # release: success, release-pr: skipped
+  ```
+- `gh release view eql-3.0.0-alpha.N` lists the two `.sql` files + `eql-docs-*`.
+- The `eql-bindings@3.0.0-alpha.N` version is live on crates.io.
+
+- [ ] **Step 7: Watch-correctness under overlap (optional)**
+
+Dispatch two distinguishable runs close together (e.g. `mise run release:eql --dry-run` and `mise run release:all --dry-run`) and confirm each mise invocation watches **its own** run (matched by ` ` in `run-name`), not whichever finished last via `-L1`.
+
+---
+
+## Self-Review
+
+**Spec coverage** (Companion changes + docs-required decision + Verification):
+1. `_build-sql.yml` reusable → Task 1. ✅
+2. `_build-docs.yml` reusable (docs on alphas, per user decision) → Task 2. ✅
+3. `release-eql.yml` refactor (both `build-and-publish` → `_build-sql.yml` and `publish-docs` → `_build-docs.yml`, finals parity) → Task 3. ✅
+4. `release-plz.yml` `release-pr` gated to `main` → Task 4. ✅
+5. `release-alpha.yml` coordinator (inputs, concurrency, run-name, both-namespace identity, all/eql/bindings flows, **in-run docs via `build-docs`**, crate publish via `gh workflow run release-plz.yml --ref `, SQL→docs→crate ordering, bindings "matching SQL must exist" guard) → Task 5. ✅
+6. Three thin `tasks/release/*.sh` + mise wiring, watch-by-run-name, retire `preview.sh` → Task 6. ✅
+7. Doc updates (`releasing-an-alpha.md`, `CLAUDE.md`, stray-ref grep) → Task 7. ✅
+8. Verification (dry_run per target, cross-namespace N, bindings invariant, target=all same-commit + docs + TP + no stray release-pr, target=eql with docs, docs-failure aborts crate, watch correctness) → Task 8. ✅
+
+**Global-constraint fidelity:** SQL and docs build in-run (reusables called inline, never event fan-out); crate publishes from `release-plz.yml` as its own dispatched entry point (TP untouched); same-commit `S` via dispatch against the immutable SQL tag; SQL→docs→crate ordering enforced by `crate-publish` needing both `build-sql` **and** `build-docs` success; identity across both namespaces; prereleases only. ✅
+
+**Type/name consistency:** `_build-sql.yml` inputs (`ref`/`tag`/`attach`/`target_commitish`/`prerelease`) and `_build-docs.yml` inputs (`ref`/`tag`) are each defined once (Tasks 1, 2) and used identically in Tasks 3 and 5. Coordinator outputs (`identity`/`sql_tag`/`crate_tag`, `pin.commit_sha`) and the `build-docs`/`build-sql` `needs` chain are produced and consumed consistently. The `run-name` correlation (` `) matches the mise watcher's `contains("${target} ${correlation}")` filter in Task 6.
+
+---
+
+## Risks and open questions
+
+1. **Docs bundle preserved in-run (resolved).** Per the user's decision, alpha releases carry the docs bundle. The coordinator's `build-docs` job (Task 5) calls the reusable `_build-docs.yml` (Task 2) after `build-sql` succeeds, building docs at the same commit and attaching `eql-docs-*` to the SQL release; `crate-publish` gates on `build-docs` success, so the crate never ships against a docs-less release. **Cost:** each alpha coordinator run adds a doxygen install (`sudo apt-get install -y doxygen`) plus `docs:generate` / `docs:generate:markdown` / `docs:package` (the `publish-docs` timeout is 10 min). No database is required for docs generation. This is the same work finals already do.
+
+2. **Watch ambiguity for identical concurrent dispatches.** `run-name` is fixed at dispatch time and cannot embed a server-derived `N`, so two simultaneous dispatches with **identical** inputs and no `--pre` share a correlation string; the watcher then relies on `createdAt` recency and could attach to the sibling run. The spec's "watch correctness" test uses **distinguishable** inputs (different target/pre), which works. Realistic single-operator use is fine. **Mitigation if it ever bites:** add a hidden `dispatch_id` input echoed into `run-name` — but that adds an input beyond the spec's locked list, so it is deliberately not in this plan.
+
+3. **`release-plz set-version` availability.** The pin job installs `release-plz` via `cargo binstall --no-confirm release-plz` (cargo-binstall is already a mise tool). If binstall has no prebuilt for the runner, it falls back to a source build (slow) or fails. **Alternative if flaky:** pin `"cargo:release-plz" = ""` in `mise.toml [tools]`. Flagged, not chosen, to avoid touching the toolchain manifest unless needed.
+
+4. **`pin` pushes to the branch with `GITHUB_TOKEN`.** This works on the unprotected `eql_v3` branch (correct per spec). On a protected `main` (future) the push is blocked — explicitly out of scope ("Future: the `main` channel").
+
+5. **Cannot fully rehearse the crates.io publish.** `--dry-run` and a throwaway `target=eql` cover everything reversible (now including docs), but the OIDC/TP token exchange and the irreversible publish are only exercised by a real `target=all`/`target=bindings`. The staged rollout in Task 8 (dry-run → throwaway `eql` → real `all`) is the safest available path; the first real `all` should use a low, disposable `N`.
+
+6. **`softprops/action-gh-release` prerelease semantics on the finals path.** The plan keeps the finals SQL attach step free of a `prerelease` input (preserving today's behaviour of not altering the existing release's prerelease flag); the docs reusable likewise only attaches. This was verified against the current file's steps. If a future action-v2 default ever starts clobbering an unset `prerelease`, the finals path would need an explicit passthrough — noted as a watch-item, not a current change.

From 55f42adf5e15f7f4dda0eafcb886bce3adb334f2 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sat, 4 Jul 2026 17:58:26 +1000
Subject: [PATCH 508/599] docs(release): harden release plan + spec after 2nd
 plan review

Apply verified review findings to the CI-native release plan/spec:
- target=bindings now guards branch-HEAD == the SQL tag commit, so the
  follow-up crate is same-source (not just same-version); refuses if the
  branch advanced (use target=all)
- pin step is no-op tolerant -> idempotent retry after a partial target=all
- coordinator guards a pushable refs/heads/* ref for all/bindings; wrappers
  reject detached HEAD
- strict version/pre regex validation in wrappers + coordinator
- wrappers rebuilt as ShellCheck-clean args arrays
- hidden dispatch_id resolves the run-watch ambiguity (identical concurrent
  dispatches now distinguishable)
- new derive-identity.sh + dependency-free unit test; new lint-release.yml
  persistent actionlint+shellcheck CI gate

Rejected the 'empty tag -> DEV' finding: verified ${usage_version:-DEV}
already yields DEV for empty (colon-dash), which release-eql.yml relies on.
---
 .../2026-07-04-release-tasks-design.md        |   8 +-
 ...07-04-release-tasks-implementation-plan.md | 804 ++++++++++++------
 2 files changed, 534 insertions(+), 278 deletions(-)

diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md
index 250c793af..4095c1436 100644
--- a/docs/development/2026-07-04-release-tasks-design.md
+++ b/docs/development/2026-07-04-release-tasks-design.md
@@ -83,8 +83,9 @@ Resolve → verify → build SQL in-run → create `eql-` prerelease o
 Per the lockstep decision, a crate version never ships without a corresponding SQL release of the **same version** (same identity, not necessarily same commit — pinning the crate version is itself a commit, so same-*commit* is only guaranteed by `target=all`).
 
 1. **Resolve** — `identity` must correspond to an **existing `eql-` tag** (default: the latest `eql--.N` lacking a crate counterpart; or an explicit `--pre`). **Fail if no matching SQL release exists** — this is the invariant.
-2. **Verify** drift gates on the current HEAD (so the published `src/v3` matches the catalog; if the catalog is unchanged since the SQL release, it also matches the shipped SQL).
-3. **Pin + publish** — `set-version`, commit, push, then dispatch `release-plz.yml --ref ` (or the crate is tagged on the new pin commit). The crate ships at version ``, matching the existing SQL release.
+2. **Same-source guard** — require the dispatched branch **HEAD to equal the `eql-` tag's commit**. This makes the follow-up crate *same-source*, not merely same-version: the published bindings provably match the code the SQL release shipped. If the branch has advanced past the SQL commit, **abort** and direct the operator to `target=all` for a fresh coherent identity. (This tightens the "same version, possibly different commit" latitude into "same source, +1 metadata commit"; it stays feasible because the pin below only touches `Cargo.toml`/`CHANGELOG`, never `src/v3`.)
+3. **Verify** drift gates on HEAD (`src/v3` matches the catalog).
+4. **Pin + publish** — `set-version`, commit (metadata only) on top of the SQL commit, push the branch (advances by one), then dispatch `release-plz.yml --ref ` (HEAD == pin commit, whose `src/v3` == the SQL release's). The crate ships at ``, same-source with the existing SQL release.
 
 ### The reusable build workflows — `_build-sql.yml` and `_build-docs.yml`
 
@@ -140,5 +141,6 @@ When alphas move to `main`: (a) a workflow pushing the set-version commit to a *
 ## Locked decisions
 
 - CI-native coordinator; thin mise triggers; identity across both namespaces; prereleases only; branch = dispatched ref.
-- **Lockstep scope:** `target=all` guarantees same commit + identity; `target=eql` is free (SQL without crate allowed); `target=bindings` requires a matching `eql-` release to already exist (no orphan crate version; same version, possibly different commit).
+- **Lockstep scope:** `target=all` guarantees same commit + identity; `target=eql` is free (SQL without crate allowed); `target=bindings` requires a matching `eql-` release to already exist **and the branch HEAD to still be at that SQL commit** — so the follow-up crate is *same-source* (no orphan crate version, and the published bindings provably match the shipped SQL). If the branch advanced, `bindings` refuses and points to `target=all`.
+- **Input hardening:** `--version` / `--pre` are strictly regex-validated (`X.Y.Z`, `X.Y.Z-(alpha|beta|rc).N`) in both wrappers and the coordinator before flowing into tags/versions/`jq`/`run-name`; the pin path requires a `refs/heads/*` ref (wrappers reject detached HEAD); a client-generated hidden `dispatch_id` input is echoed into `run-name` so the wrapper watches its **own** run unambiguously; the pin step is no-op-tolerant (idempotent retries after a partial `target=all`). A persistent CI job lints the release workflows/tasks (actionlint + shellcheck).
 - SQL **and docs** built **in-run** via reusable `workflow_call`s (`_build-sql.yml` + `_build-docs.yml`, not event fan-out) — alphas keep their `eql-docs-*` bundle; crate published by **dispatching `release-plz.yml`** against the SQL tag (TP unchanged); crate publish gated on both build jobs; `release-pr` gated to `main`.
diff --git a/docs/development/2026-07-04-release-tasks-implementation-plan.md b/docs/development/2026-07-04-release-tasks-implementation-plan.md
index feedb6d1c..aeae5fccf 100644
--- a/docs/development/2026-07-04-release-tasks-implementation-plan.md
+++ b/docs/development/2026-07-04-release-tasks-implementation-plan.md
@@ -15,12 +15,13 @@ These are the spec's **verified, load-bearing facts**. Every task's requirements
 - **SQL and docs must build in-run.** A coordinator running under the automatic `GITHUB_TOKEN` **cannot** rely on any `on: release`/`on: push` fan-out — `GITHUB_TOKEN`-created Releases and pushes do **not** trigger new workflow runs. The SQL build+attach *and* the docs build+attach therefore happen inside the coordinator's own run via reusable `workflow_call`s, never by firing `release-eql.yml`.
 - **The crate must publish from `release-plz.yml` as its own dispatched entry point.** crates.io Trusted Publishing matches on `workflow_ref` = the entry-point workflow filename (verified opposite to PyPI). Publishing via a reusable `workflow_call` from `release-alpha.yml` would make the identity `release-alpha.yml` and fail the OIDC token exchange. **Do not move the crate publish into a reusable workflow.** The coordinator triggers the publish with `gh workflow run release-plz.yml --ref ` (the `workflow_dispatch` exception means `GITHUB_TOKEN` *can* do this).
 - **`target=all` same-commit `S` is achieved by dispatching the crate publish against the immutable SQL tag.** The crate version is pinned+committed at `S`, the SQL release targets `S`, docs are built at `S`, and the crate publish is dispatched against the *tag* `eql-` that points at `S` — so both tags land on `S` with no SHA guard and no race.
+- **`target=bindings` is same-source, +1 metadata commit.** The crate is published from the **same code** as the referenced `eql-` SQL release. The coordinator requires branch HEAD to currently equal the SQL tag's commit, adds a metadata-only pin commit **on top of it**, and publishes from there — so the crate never ships later code than the SQL release it corresponds to.
 - **Ordering is SQL → docs → crate.** SQL and docs are reversible (a GitHub prerelease can be deleted); a crates.io publish is irreversible. The crate publish must be dispatched only **after** a *complete* release (SQL **and** docs) has been built and attached in-run.
 - **Identity `-.` with `N = 1 + max(N across BOTH tag namespaces)`** — SQL `eql--.N` and crate `eql-bindings-v-.N` — computed from freshly-fetched tags (`fetch-depth: 0`). Deriving across both namespaces for every target prevents version divergence.
-- **`release-eql.yml` builds with the `eql-`-stripped identity** (`mise run build --version "${TAG#eql-}"`) so `eql_v3.version()` reports bare semver. Empty tag → bare `mise run build` DEV default. This behaviour is preserved by the reusable.
+- **`release-eql.yml` builds with the `eql-`-stripped identity** (`mise run build --version "${TAG#eql-}"`) so `eql_v3.version()` reports bare semver. Empty tag → bare `mise run build` DEV default (`build.sh` uses `RELEASE_VERSION=${usage_version:-DEV}`, so **empty *or* unset → `DEV`**; PR runs of `release-eql.yml` rely on this). This behaviour is preserved by the reusable.
 - **Blockers/prereleases only.** The coordinator cuts prereleases only. No final-release automation, no `verify-changelog` promotion, no `CHANGELOG.md` edits — alpha entries stay under `[Unreleased]`.
 - **`release-plz` config is unchanged.** No TP / OIDC / GPG changes. `release-plz set-version eql-bindings@` is the only pin mechanism (no absolute-version config field exists).
-- **Branch = dispatched ref.** Alphas are cut from `eql_v3` today; the workflow runs on the `--ref` of the dispatch. `main`-channel branch protection is out of scope (future).
+- **Branch = dispatched ref.** Alphas are cut from `eql_v3` today; the workflow runs on the `--ref` of the dispatch. For `all`/`bindings` the ref **must be a branch** (the pin pushes to it). `main`-channel branch protection is out of scope (future).
 - **mise tasks are auto-discovered** from the `tasks/` directory (verified: `release:preview` has no `[tasks]` entry in `mise.toml`). A new executable `tasks/release/.sh` with `#MISE`/`#USAGE` headers auto-registers as `release:`; deleting `tasks/release/preview.sh` removes `release:preview`.
 
 ---
@@ -29,14 +30,16 @@ These are the spec's **verified, load-bearing facts**. Every task's requirements
 
 | File | Responsibility | Action |
 |------|----------------|--------|
-| `.github/workflows/_build-sql.yml` | Reusable (`workflow_call`) SQL build + upload-artifact + attach/create-release + Multitudes notify. Single SQL-build code path. | Create (Task 1) |
-| `.github/workflows/_build-docs.yml` | Reusable (`workflow_call`) docs generate + package + upload-artifact + attach `eql-docs-*` to an existing release. Single docs-build code path. | Create (Task 2) |
+| `.github/workflows/_build-sql.yml` | Reusable (`workflow_call`) SQL build + upload-artifact + attach/create-release + Multitudes notify. | Create (Task 1) |
+| `.github/workflows/_build-docs.yml` | Reusable (`workflow_call`) docs generate + package + upload-artifact + attach `eql-docs-*` to an existing release. | Create (Task 2) |
 | `.github/workflows/release-eql.yml` | Finals path: `verify-changelog`, delegate SQL build to `_build-sql.yml`, delegate docs to `_build-docs.yml`. | Modify (Task 3) |
 | `.github/workflows/release-plz.yml` | Crate publish entry point (unchanged) + `release-pr` job gated to `main`. | Modify (Task 4) |
-| `.github/workflows/release-alpha.yml` | The coordinator: resolve → pin → build-sql → build-docs → crate-publish → summary. | Create (Task 5) |
-| `tasks/release/all.sh`, `tasks/release/eql.sh`, `tasks/release/bindings.sh` | Thin mise triggers: dispatch coordinator + watch by `run-name`. | Create (Task 6) |
-| `tasks/release/preview.sh` | Retired. | Delete (Task 6) |
-| `docs/development/releasing-an-alpha.md`, `CLAUDE.md` | Runbook + reference updated to the task/dispatch flow. | Modify (Task 7) |
+| `.github/scripts/derive-identity.sh` + `.github/scripts/derive-identity.test.sh` | Unit-testable identity-derivation function (git seams overridable) + a dependency-free bash test. | Create (Task 5) |
+| `.github/workflows/release-alpha.yml` | The coordinator: resolve → pin → build-sql → build-docs → crate-publish → summary. | Create (Task 6) |
+| `tasks/release/all.sh`, `tasks/release/eql.sh`, `tasks/release/bindings.sh` | Thin mise triggers: dispatch coordinator + watch by unique `dispatch_id`. | Create (Task 7) |
+| `tasks/release/preview.sh` | Retired. | Delete (Task 7) |
+| `.github/workflows/lint-release.yml` | Persistent PR gate: `actionlint` on the release workflows + `shellcheck` on `tasks/release/*.sh` + the identity-derivation unit test. | Create (Task 8) |
+| `docs/development/releasing-an-alpha.md`, `CLAUDE.md` | Runbook + reference updated to the task/dispatch flow. | Modify (Task 9) |
 
 ---
 
@@ -125,7 +128,8 @@ jobs:
 
       - name: Build EQL release
         # Strip the `eql-` tag prefix so eql_v3.version() reports bare semver
-        # (e.g. "3.0.0-alpha.2"). Empty TAG -> ${TAG#eql-} is "" -> DEV default.
+        # (e.g. "3.0.0-alpha.2"). Empty TAG -> ${TAG#eql-} is "" -> build.sh's
+        # ${usage_version:-DEV} yields DEV (empty OR unset both map to DEV).
         env:
           TAG: ${{ inputs.tag }}
         run: |
@@ -184,7 +188,7 @@ jobs:
 
 Run: `actionlint .github/workflows/_build-sql.yml`
 (If `actionlint` is not installed: `go install github.com/rhysd/actionlint/cmd/actionlint@latest`, or `brew install actionlint`, or download the release binary.)
-Expected: no output (exit 0). A reusable workflow with only `on: workflow_call` passes.
+Expected: no output (exit 0).
 
 - [ ] **Step 3: Sanity-check the YAML parses**
 
@@ -205,12 +209,12 @@ git commit -m "ci(release): add reusable _build-sql.yml (workflow_call SQL build
 **Files:**
 - Create: `.github/workflows/_build-docs.yml`
 
-**Context (from the real `release-eql.yml` `publish-docs` job, lines ~105–156):** it checks out, runs mise-action, installs doxygen (`sudo apt-get update && sudo apt-get install -y doxygen`), runs `mise run docs:generate` then `mise run docs:generate:markdown -- ` (with `set -euo pipefail` so a generate failure fails fast), `mise run docs:package `, uploads `eql-docs-*.{zip,tar.gz}`, then attaches those files to the release. **The Multitudes-notify step lives in `build-and-publish`, NOT `publish-docs`** — so this reusable has no Multitudes step. The original attach step was gated `if: startsWith(github.ref, 'refs/tags/')`; that gate is **dropped** here because the coordinator's `github.ref` is a branch (not a tag), so gating on it would suppress the alpha docs attach. Attachment is instead gated on the passed `tag` being non-empty (matching the finals-on-PR "build but don't attach" behaviour, where `tag` is empty).
+**Context (from the real `release-eql.yml` `publish-docs` job, lines ~105–156):** it checks out, runs mise-action, installs doxygen (`sudo apt-get update && sudo apt-get install -y doxygen`), runs `mise run docs:generate` then `mise run docs:generate:markdown -- ` (with `set -euo pipefail` so a generate failure fails fast), `mise run docs:package `, uploads `eql-docs-*.{zip,tar.gz}`, then attaches those files to the release. **The Multitudes-notify step lives in `build-and-publish`, NOT `publish-docs`** — so this reusable has no Multitudes step. The original attach step was gated `if: startsWith(github.ref, 'refs/tags/')`; that gate is **dropped** here because the coordinator's `github.ref` is a branch (not a tag), so gating on it would suppress the alpha docs attach. Attachment is instead gated on the passed `tag` being non-empty.
 
 **Interfaces:**
-- Produces (the reusable's `workflow_call` inputs — Tasks 3 and 5 call with exactly these):
+- Produces (the reusable's `workflow_call` inputs — Tasks 3 and 6 call with exactly these):
   - `ref` (string, default `''`) — git ref/SHA to build docs from; empty → default `github.sha`.
-  - `tag` (string, default `''`) — full release tag, e.g. `eql-3.0.0-alpha.2`. Passed to `docs:generate:markdown`/`docs:package` and names the release to attach to. Empty → build docs, do **not** attach (PR/dispatch parity with the original).
+  - `tag` (string, default `''`) — full release tag. Passed to `docs:generate:markdown`/`docs:package` and names the release to attach to. Empty → build docs, do **not** attach (PR/dispatch parity with the original).
 
 - [ ] **Step 1: Write the full reusable workflow file**
 
@@ -333,28 +337,22 @@ git commit -m "ci(release): add reusable _build-docs.yml (workflow_call docs bui
 ### Task 3: Refactor `release-eql.yml` to call the reusables
 
 **Files:**
-- Modify: `.github/workflows/release-eql.yml` (replace the `build-and-publish` job's `steps` with a `uses:` call to `_build-sql.yml`; replace the `publish-docs` job's `steps` with a `uses:` call to `_build-docs.yml`; leave `verify-changelog` unchanged)
+- Modify: `.github/workflows/release-eql.yml` (`build-and-publish` → `uses: _build-sql.yml`; `publish-docs` → `uses: _build-docs.yml`; leave `verify-changelog` unchanged)
 
 **Interfaces:**
-- Consumes: `_build-sql.yml` inputs (Task 1: `ref`, `tag`, `attach`, `target_commitish`, `prerelease`) and `_build-docs.yml` inputs (Task 2: `ref`, `tag`).
+- Consumes: `_build-sql.yml` inputs (Task 1) and `_build-docs.yml` inputs (Task 2).
 
 - [ ] **Step 1: Replace the `build-and-publish` job body**
 
-Replace the entire `build-and-publish:` job (currently a `runs-on`/`steps` job) with a reusable call. **Keep the exact `if:` guard.**
-
 ```yaml
   build-and-publish:
     name: Build EQL
-    # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags
-    # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases.
     if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
     permissions:
       contents: write
     secrets: inherit
     uses: ./.github/workflows/_build-sql.yml
     with:
-      # Finals: build the checked-out release commit (default), attach to the
-      # existing human-created release, never re-create it.
       ref: ""
       tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }}
       attach: ${{ github.event_name == 'release' && startsWith(github.ref, 'refs/tags/') }}
@@ -364,38 +362,29 @@ Replace the entire `build-and-publish:` job (currently a `runs-on`/`steps` job)
 
 - [ ] **Step 2: Replace the `publish-docs` job body**
 
-Replace the entire `publish-docs:` job (currently a `runs-on`/`steps` job) with a reusable call. **Keep the exact `if:` guard.**
-
 ```yaml
   publish-docs:
     name: Build and Publish Documentation
-    # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags
-    # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases.
     if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
     permissions:
       contents: write
     uses: ./.github/workflows/_build-docs.yml
     with:
-      # Finals: build docs at the release commit (default checkout), attach to
-      # the existing human-created release. Empty tag on PR -> build, no attach.
       ref: ""
       tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }}
 ```
 
-Keep the `verify-changelog` job exactly as-is. **Keep the top-level `on`, `env`, `defaults`, and `permissions` unchanged** (the reusable jobs still run under them).
+Keep `verify-changelog` and the top-level `on`, `env`, `defaults`, `permissions` unchanged.
 
 - [ ] **Step 3: Confirm no behaviour change for finals (read-through)**
 
-Verify by inspection:
-- A `release: published` event with an `eql-…` (non-`eql-bindings`) tag →
-  - `build-and-publish` calls `_build-sql.yml` with `tag = tag_name`, `attach = true`, `target_commitish = ""` → **"Attach artefacts to existing release"** step → same two `.sql` files on the same release, prerelease flag untouched, Multitudes fires. Identical.
-  - `publish-docs` calls `_build-docs.yml` with `ref = ""` (checkout the release commit = `github.sha`), `tag = tag_name` → builds docs at the release commit and attaches `eql-docs-*` to the existing release. Identical to the old job (which attached because `github.ref` was `refs/tags/…`).
-- A `pull_request` run (workflow file changed) → both jobs run with `tag = ''` → build only, no attach (docs build, `if: inputs.tag != ''` false). Identical to before.
+- `release: published` (eql, non-bindings) → `build-and-publish` attaches the two `.sql` to the existing release (Multitudes fires); `publish-docs` builds docs at the release commit and attaches `eql-docs-*`. Identical to before.
+- `pull_request` → both run with `tag = ''` → build only, no attach. Identical.
 
 - [ ] **Step 4: Validate**
 
 Run: `actionlint .github/workflows/release-eql.yml && python3 -c "import yaml; yaml.safe_load(open('.github/workflows/release-eql.yml'))" && echo OK`
-Expected: `OK`, no actionlint errors. (actionlint resolves both local `uses:` calls and checks `with:` inputs against Tasks 1 and 2 — a typo'd input name fails here.)
+Expected: `OK`.
 
 - [ ] **Step 5: Commit**
 
@@ -412,12 +401,10 @@ git commit -m "ci(release): route release-eql.yml SQL + docs builds through reus
 - Modify: `.github/workflows/release-plz.yml` (add one `if:` to the `release-pr` job)
 
 **Interfaces:**
-- Produces: a `release-plz.yml` whose `release` job still publishes on any ref (branch-agnostic), but whose `release-pr` job runs **only** on `refs/heads/main`. The coordinator dispatches this workflow against a **tag**, so `release-pr` is skipped → no stray release PR.
+- Produces: a `release-plz.yml` whose `release` job still publishes on any ref, but whose `release-pr` runs **only** on `refs/heads/main`. A dispatch against a tag skips `release-pr` → no stray release PR.
 
 - [ ] **Step 1: Add the `if:` guard to `release-pr`**
 
-In the `release-pr:` job, add an `if:` as the first key after `name:`:
-
 ```yaml
   release-pr:
     name: "Release PR"
@@ -431,13 +418,11 @@ In the `release-pr:` job, add an `if:` as the first key after `name:`:
       # ... unchanged ...
 ```
 
-Leave the `release:` job, `concurrency`, `permissions`, `on`, and everything else unchanged.
+Leave `release:`, `concurrency`, `permissions`, `on` unchanged.
 
 - [ ] **Step 2: Verify the gate logic (read-through)**
 
-- Push to `main` → `github.ref == 'refs/heads/main'` → `release-pr` runs (unchanged).
-- Coordinator `gh workflow run release-plz.yml --ref eql-3.0.0-alpha.2` → ref is `refs/tags/…` → `release-pr` **skipped**; `release` still runs, checks out the tag, publishes.
-- Manual `workflow_dispatch` on `main` → ref is `refs/heads/main` → `release-pr` runs.
+- Push to `main` → runs. Coordinator `--ref eql-3.0.0-alpha.2` (tag) → `release-pr` **skipped**, `release` runs. Manual dispatch on `main` → runs.
 
 - [ ] **Step 3: Validate**
 
@@ -453,14 +438,173 @@ git commit -m "ci(release): gate release-plz release-pr job to refs/heads/main"
 
 ---
 
-### Task 5: The coordinator — `.github/workflows/release-alpha.yml`
+### Task 5: Identity-derivation helper + unit test — `.github/scripts/`
+
+**Files:**
+- Create: `.github/scripts/derive-identity.sh`
+- Create: `.github/scripts/derive-identity.test.sh`
+
+**Interfaces:**
+- Produces: a `derive_identity    
` bash function that prints the resolved `-.` identity to stdout, computing `N = 1 + max(SQL N, crate N)` for `all`/`eql` and the latest SQL alpha lacking a crate counterpart for `bindings`. Two git seams — `list_tags ` and `tag_exists ` — are overridable so the test can run against a synthetic tag set with **no git repo and no dependencies**. The coordinator (Task 6) sources this file and calls `derive_identity`; the repo-state guards (existence, branch-HEAD==tag-commit, branch ref) stay in the coordinator.
+
+- [ ] **Step 1: Write `.github/scripts/derive-identity.sh`**
+
+```bash
+#!/usr/bin/env bash
+# Identity derivation for release-alpha.yml, factored out so it is unit-testable
+# with a synthetic tag set (see derive-identity.test.sh). The two git seams
+# (list_tags / tag_exists) are overridable by the test harness.
+set -euo pipefail
+
+# Seam: print tag names matching a shell glob. Override in tests.
+list_tags() { git tag --list "$1"; }
+
+# Seam: succeed iff a tag exists. Override in tests.
+tag_exists() { git rev-parse -q --verify "refs/tags/$1" >/dev/null; }
+
+# highest_n  -> highest integer N among tags "N", or empty.
+highest_n() {
+  local prefix="$1" esc
+  esc="${prefix//./\\.}"
+  list_tags "${prefix}*" \
+    | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" \
+    | sort -n | tail -1
+}
+
+# derive_identity    
+# Prints the resolved identity (e.g. 3.0.0-alpha.6). Does NOT run repo-state
+# guards (existence / branch-HEAD) — those stay in the resolve job.
+derive_identity() {
+  local target="$1" version="$2" channel="$3" pre="$4"
+  local sql_prefix="eql-${version}-${channel}."
+  local crate_prefix="eql-bindings-v${version}-${channel}."
+
+  if [[ -n "$pre" ]]; then
+    printf '%s\n' "$pre"; return 0
+  fi
+
+  case "$target" in
+    all|eql)
+      local sql_n crate_n n
+      sql_n=$(highest_n "$sql_prefix");     sql_n=${sql_n:-0}
+      crate_n=$(highest_n "$crate_prefix"); crate_n=${crate_n:-0}
+      if (( sql_n >= crate_n )); then n=$(( sql_n + 1 )); else n=$(( crate_n + 1 )); fi
+      printf '%s\n' "${version}-${channel}.${n}"
+      ;;
+    bindings)
+      local esc found n
+      esc="${sql_prefix//./\\.}"
+      found=""
+      for n in $(list_tags "${sql_prefix}*" | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" | sort -rn); do
+        if ! tag_exists "${crate_prefix}${n}"; then found="$n"; break; fi
+      done
+      if [[ -z "$found" ]]; then
+        echo "error: no ${sql_prefix}N SQL release is awaiting a crate publish" >&2
+        return 1
+      fi
+      printf '%s\n' "${version}-${channel}.${found}"
+      ;;
+    *)
+      echo "error: unknown target '$target'" >&2; return 1
+      ;;
+  esac
+}
+
+# Run derive_identity with CLI args when executed directly (not sourced).
+if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
+  derive_identity "$@"
+fi
+```
+
+- [ ] **Step 2: Write `.github/scripts/derive-identity.test.sh`**
+
+```bash
+#!/usr/bin/env bash
+# Dependency-free unit test for derive_identity: overrides the git seams with a
+# synthetic tag set. No git repo, no bats. Exit 0 = all pass.
+set -uo pipefail
+
+here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+# shellcheck source=/dev/null
+source "${here}/derive-identity.sh"
+
+FAKE_TAGS=()
+list_tags() {
+  local glob="$1" t
+  (( ${#FAKE_TAGS[@]} )) || return 0
+  for t in "${FAKE_TAGS[@]}"; do
+    # shellcheck disable=SC2254
+    case "$t" in $glob) printf '%s\n' "$t" ;; esac
+  done
+}
+tag_exists() {
+  local want="$1" t
+  (( ${#FAKE_TAGS[@]} )) || return 1
+  for t in "${FAKE_TAGS[@]}"; do [[ "$t" == "$want" ]] && return 0; done
+  return 1
+}
+
+fail=0
+check() { #   
+  if [[ "$2" == "$3" ]]; then echo "ok: $1"; else echo "FAIL: $1 — got '$2' want '$3'"; fail=1; fi
+}
+
+FAKE_TAGS=()
+check "all: empty -> .1" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.1"
+
+FAKE_TAGS=(eql-3.0.0-alpha.5)
+check "all: sql .5 -> .6" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.6"
+
+FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.4)
+check "all: crate .4 wins (cross-namespace) -> .5" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.5"
+
+FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.4)
+check "bindings: latest sql lacking crate -> .5" "$(derive_identity bindings 3.0.0 alpha '')" "3.0.0-alpha.5"
+
+FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5)
+if derive_identity bindings 3.0.0 alpha '' >/dev/null 2>&1; then
+  echo "FAIL: bindings should error when none awaiting"; fail=1
+else
+  echo "ok: bindings errors when none awaiting a crate"
+fi
+
+check "pre passthrough" "$(derive_identity all 3.0.0 alpha 3.0.0-alpha.9)" "3.0.0-alpha.9"
+
+# channel isolation: a beta tag must not bump the alpha counter.
+FAKE_TAGS=(eql-3.0.0-beta.7)
+check "all: beta.7 does not affect alpha -> .1" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.1"
+
+exit "$fail"
+```
+
+- [ ] **Step 3: Run the unit test**
+
+Run: `bash .github/scripts/derive-identity.test.sh`
+Expected: every line prefixed `ok:`, exit 0. (This is the same test the CI gate in Task 8 runs.)
+
+- [ ] **Step 4: ShellCheck the scripts**
+
+Run: `shellcheck .github/scripts/derive-identity.sh .github/scripts/derive-identity.test.sh`
+Expected: no errors.
+
+- [ ] **Step 5: Commit**
+
+```bash
+chmod +x .github/scripts/derive-identity.sh .github/scripts/derive-identity.test.sh
+git add .github/scripts/derive-identity.sh .github/scripts/derive-identity.test.sh
+git commit -m "ci(release): add unit-testable identity-derivation helper + test"
+```
+
+---
+
+### Task 6: The coordinator — `.github/workflows/release-alpha.yml`
 
 **Files:**
 - Create: `.github/workflows/release-alpha.yml`
 
 **Interfaces:**
-- Consumes: `_build-sql.yml` (Task 1) and `_build-docs.yml` (Task 2) via `workflow_call`; `release-plz.yml` (Task 4) via `gh workflow run` (the crate publish entry point).
-- Produces (relied on by Task 6's mise tasks): `workflow_dispatch` inputs `target` / `version` / `channel` / `pre` / `dry_run`; a `run-name` that embeds `` and the resolved-or-partial identity so the mise task can find the exact run; `concurrency: { group: release-alpha }`.
+- Consumes: `_build-sql.yml` (Task 1) and `_build-docs.yml` (Task 2) via `workflow_call`; `.github/scripts/derive-identity.sh` (Task 5) sourced in `resolve`; `release-plz.yml` (Task 4) via `gh workflow run`.
+- Produces (relied on by Task 7's mise tasks): `workflow_dispatch` inputs `target` / `version` / `channel` / `pre` / `dry_run` / `dispatch_id`; a `run-name` that embeds ``, the resolved-or-partial identity, and the unique `[]` so the mise task can find the exact run; `concurrency: { group: release-alpha }`.
 
 **Job graph:**
 
@@ -470,12 +614,12 @@ resolve ──> pin ──> build-sql ──> build-docs ──> crate-publish 
    └─────────┴──────────┴─────────────┴──────────────┘  (each gated by target + dry_run)
 ```
 
-- `resolve` — always. Derive identity across both namespaces (or accept `pre`); target-specific existence/invariant guards; run drift gates `types:check` + `codegen:parity`. On `dry_run`, print the plan and stop.
-- `pin` — `all`/`bindings` only, non-dry: `release-plz set-version`, GPG-signed commit staging crate files, push → commit `S`.
+- `resolve` — always. Validate `channel`/`version`/`pre`; guard a pushable **branch** ref for `all`/`bindings`; derive identity (via the Task 5 helper); target-specific existence guards; for `bindings` also guard **branch HEAD == the SQL tag's commit** (same-source); run drift gates `types:check` + `codegen:parity`. On `dry_run`, print the plan and stop.
+- `pin` — `all`/`bindings` only, non-dry: `release-plz set-version`; **no-op tolerant** (skip commit/push when set-version changed nothing); GPG-signed commit staging crate files; push → commit `S`.
 - `build-sql` — `all`/`eql` only, non-dry: reusable call. For `all`, checks out `S` and creates the prerelease at `S`; for `eql`, at branch `github.sha`.
-- `build-docs` — `all`/`eql` only, non-dry, **after** `build-sql` (the release must exist to attach docs): reusable call at the same commit `build-sql` used, attaching `eql-docs-*` to the SQL release.
-- `crate-publish` — `all`/`bindings` only, non-dry, **after** `build-sql` **and** `build-docs` for `all`: `gh workflow run release-plz.yml --ref `. A docs failure aborts before the crate ships.
-- `summary` — always: link the coordinator run and the dispatched `release-plz.yml` run.
+- `build-docs` — `all`/`eql` only, non-dry, **after** `build-sql`: reusable call at the same commit, attaching `eql-docs-*` to the SQL release.
+- `crate-publish` — `all`/`bindings` only, non-dry, **after** `build-sql` **and** `build-docs`: `gh workflow run release-plz.yml --ref `.
+- `summary` — always.
 
 - [ ] **Step 1: Write the coordinator header, inputs, permissions, concurrency, run-name**
 
@@ -484,7 +628,8 @@ name: "Release alpha (coordinator)"
 
 # CI-native prerelease coordinator for the two EQL artefacts (SQL surface +
 # eql-bindings crate). Alphas ship the same assets as finals: two .sql files
-# AND the packaged docs bundle. Runs on the DISPATCHED REF. See
+# AND the packaged docs bundle. Runs on the DISPATCHED REF (a BRANCH for
+# all/bindings, since the crate pin is pushed to it). See
 # docs/development/2026-07-04-release-tasks-design.md for the full rationale.
 
 on:
@@ -517,21 +662,23 @@ on:
         required: false
         type: boolean
         default: false
+      dispatch_id:
+        description: "Client-generated correlation id (the mise wrapper sets this to find its exact run). Leave blank for manual dispatch."
+        required: false
+        type: string
+        default: ""
 
-# The mise task finds THIS run by the identity + target in run-name (never -L1).
-# When `pre` is given the identity is exact; otherwise N is derived server-side,
-# so run-name carries version-channel (+ target), and the watcher disambiguates
-# by createdAt recency.
+# The mise task finds THIS run by the UNIQUE dispatch_id echoed here (never -L1,
+# never a createdAt guess). Identity is exact when `pre` is given; otherwise N is
+# derived server-side and run-name carries version-channel for readability.
 run-name: >-
-  release-alpha ${{ inputs.target }} ${{ inputs.pre != '' && inputs.pre || format('{0}-{1}', inputs.version, inputs.channel) }}${{ inputs.dry_run && ' [dry-run]' || '' }}
+  release-alpha ${{ inputs.target }} ${{ inputs.pre != '' && inputs.pre || format('{0}-{1}', inputs.version, inputs.channel) }}${{ inputs.dry_run && ' [dry-run]' || '' }} [${{ inputs.dispatch_id }}]
 
 permissions:
   contents: write   # pin push + prerelease creation + docs/sql attach
   actions: write    # gh workflow run release-plz.yml (dispatch)
 
 concurrency:
-  # Serialise coordinator runs. The crate publish is separately serialised by
-  # release-plz.yml's own `release-plz` group. Never cancel a release mid-flight.
   group: release-alpha
   cancel-in-progress: false
 
@@ -568,10 +715,29 @@ jobs:
         env:
           CHANNEL: ${{ inputs.channel }}
           TARGET: ${{ inputs.target }}
+          VERSION: ${{ inputs.version }}
+          PRE: ${{ inputs.pre }}
         run: |
           set -euo pipefail
           case "$CHANNEL" in alpha|beta|rc) ;; *) echo "::error::invalid channel '$CHANNEL'"; exit 1 ;; esac
           case "$TARGET" in all|eql|bindings) ;; *) echo "::error::invalid target '$TARGET'"; exit 1 ;; esac
+          [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || { echo "::error::invalid version '$VERSION' (expected X.Y.Z)"; exit 1; }
+          if [[ -n "$PRE" ]]; then
+            [[ "$PRE" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || { echo "::error::invalid pre '$PRE' (expected X.Y.Z-(alpha|beta|rc).N)"; exit 1; }
+          fi
+
+      - name: Guard pushable branch (all/bindings)
+        if: ${{ inputs.target == 'all' || inputs.target == 'bindings' }}
+        env:
+          TARGET: ${{ inputs.target }}
+          REF_TYPE: ${{ github.ref_type }}
+          REF_NAME: ${{ github.ref_name }}
+        run: |
+          set -euo pipefail
+          if [[ "$REF_TYPE" != "branch" ]]; then
+            echo "::error::target=${TARGET} pins+pushes the crate version and requires a BRANCH ref; got ${REF_TYPE} '${REF_NAME}'. Dispatch with --ref ."
+            exit 1
+          fi
 
       - name: Derive identity + guards
         id: derive
@@ -583,50 +749,13 @@ jobs:
         run: |
           set -euo pipefail
 
-          sql_prefix="eql-${VERSION}-${CHANNEL}."
-          crate_prefix="eql-bindings-v${VERSION}-${CHANNEL}."
-
-          # Highest N under a tag prefix, or empty. `.` in the prefix is escaped
-          # so it can't match arbitrary characters in the sed pattern.
-          highest() {
-            local prefix="$1" esc
-            esc="${prefix//./\\.}"
-            git tag --list "${prefix}*" \
-              | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" \
-              | sort -n | tail -1
-          }
-
-          if [[ -n "$PRE" ]]; then
-            identity="$PRE"
-          else
-            case "$TARGET" in
-              all|eql)
-                sql_n=$(highest "$sql_prefix");   sql_n=${sql_n:-0}
-                crate_n=$(highest "$crate_prefix"); crate_n=${crate_n:-0}
-                if (( sql_n >= crate_n )); then n=$(( sql_n + 1 )); else n=$(( crate_n + 1 )); fi
-                identity="${VERSION}-${CHANNEL}.${n}"
-                ;;
-              bindings)
-                # Default: the latest SQL alpha lacking a crate counterpart.
-                esc="${sql_prefix//./\\.}"
-                found=""
-                for n in $(git tag --list "${sql_prefix}*" | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" | sort -rn); do
-                  if ! git rev-parse -q --verify "refs/tags/${crate_prefix}${n}" >/dev/null; then
-                    found="$n"; break
-                  fi
-                done
-                if [[ -z "$found" ]]; then
-                  echo "::error::no ${sql_prefix}N SQL release is awaiting a crate publish (nothing to do for target=bindings)"; exit 1
-                fi
-                identity="${VERSION}-${CHANNEL}.${found}"
-                ;;
-            esac
-          fi
+          # Pure derivation is unit-tested in .github/scripts/derive-identity.test.sh.
+          source .github/scripts/derive-identity.sh
+          identity="$(derive_identity "$TARGET" "$VERSION" "$CHANNEL" "$PRE")"
 
           sql_tag="eql-${identity}"
           crate_tag="eql-bindings-v${identity}"
 
-          # Target-specific guards.
           case "$TARGET" in
             all)
               if git rev-parse -q --verify "refs/tags/${sql_tag}"   >/dev/null; then echo "::error::${sql_tag} already exists";   exit 1; fi
@@ -642,6 +771,14 @@ jobs:
                 echo "::error::${sql_tag} SQL release must exist before publishing the crate (lockstep invariant)"; exit 1
               fi
               if git rev-parse -q --verify "refs/tags/${crate_tag}" >/dev/null; then echo "::error::${crate_tag} already exists"; exit 1; fi
+              # Same-source invariant: the crate must publish from the SAME code as
+              # the SQL release. The pin adds a metadata-only commit ON TOP of the
+              # SQL tag's commit, so branch HEAD must currently equal that commit.
+              head_sha="$(git rev-parse HEAD)"
+              tag_sha="$(git rev-parse "refs/tags/${sql_tag}^{commit}")"
+              if [[ "$head_sha" != "$tag_sha" ]]; then
+                echo "::error::branch HEAD (${head_sha}) has advanced past ${sql_tag} (${tag_sha}); use target=all for a fresh identity"; exit 1
+              fi
               ;;
           esac
 
@@ -656,9 +793,7 @@ jobs:
           cache: true
 
       - name: Verify drift gates (types:check + codegen:parity)
-        # Both are DB-free: they regenerate the committed bindings / SQL surface
-        # and `git diff` against the checkout. A drift here means the shipped
-        # src/v3 would not match the catalog — abort before any mutation.
+        # DB-free: regenerate the committed bindings / SQL surface and git diff.
         run: |
           set -euo pipefail
           mise run types:check
@@ -686,7 +821,7 @@ jobs:
 
 Notes on `set -e` safety: every guard uses `if ; then …; fi` (not ` && { fail; }`), so a `git rev-parse` returning non-zero does not abort the script.
 
-- [ ] **Step 3: Write the `pin` job**
+- [ ] **Step 3: Write the `pin` job (no-op tolerant)**
 
 ```yaml
   pin:
@@ -717,7 +852,6 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
           cache: true
 
       - name: Install release-plz CLI
-        # cargo-binstall is a mise tool (fast prebuilt fetch, no source build).
         run: cargo binstall --no-confirm release-plz
 
       - name: Pin + commit + push (commit S)
@@ -728,9 +862,18 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
         run: |
           set -euo pipefail
           release-plz set-version "eql-bindings@${IDENTITY}"
-          git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock
-          git commit -S -m "chore(release): pin eql-bindings to ${IDENTITY}"
-          git push origin "HEAD:${BRANCH}"
+
+          # Idempotent recovery: on a rerun where the crate is already pinned to
+          # IDENTITY (e.g. SQL+docs shipped but the crate publish failed before
+          # tagging), set-version is a no-op. Skip commit/push and reuse HEAD as S
+          # rather than failing on "nothing to commit".
+          if git diff --quiet && git diff --cached --quiet; then
+            echo "set-version produced no changes (already pinned to ${IDENTITY}); skipping commit/push"
+          else
+            git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock
+            git commit -S -m "chore(release): pin eql-bindings to ${IDENTITY}"
+            git push origin "HEAD:${BRANCH}"
+          fi
           echo "commit_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
 ```
 
@@ -740,8 +883,6 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
   build-sql:
     name: Build + release SQL (in-run)
     needs: [resolve, pin]
-    # all/eql only, non-dry. For `all`, pin must have succeeded; for `eql`, pin
-    # is skipped (SQL without a crate is allowed).
     if: >-
       ${{ !cancelled() && !inputs.dry_run
           && (inputs.target == 'all' || inputs.target == 'eql')
@@ -752,7 +893,6 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
     secrets: inherit
     uses: ./.github/workflows/_build-sql.yml
     with:
-      # all: build + release AT commit S (the pin commit). eql: at branch HEAD.
       ref:              ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || '' }}
       tag:              ${{ needs.resolve.outputs.sql_tag }}
       attach:           true
@@ -766,9 +906,6 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
   build-docs:
     name: Build + attach docs (in-run)
     needs: [resolve, pin, build-sql]
-    # all/eql only, non-dry. build-sql must have SUCCEEDED first: the docs attach
-    # to the SQL release, which build-sql creates. A docs failure here blocks the
-    # (irreversible) crate publish downstream.
     if: >-
       ${{ !cancelled() && !inputs.dry_run
           && (inputs.target == 'all' || inputs.target == 'eql')
@@ -777,7 +914,6 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
       contents: write
     uses: ./.github/workflows/_build-docs.yml
     with:
-      # Same commit build-sql used: pin commit S for `all`, branch HEAD for `eql`.
       ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }}
       tag: ${{ needs.resolve.outputs.sql_tag }}
 ```
@@ -789,10 +925,10 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
     name: Dispatch crate publish (release-plz.yml)
     runs-on: blacksmith-16vcpu-ubuntu-2204
     needs: [resolve, pin, build-sql, build-docs]
-    # all/bindings only, non-dry. For `all`, a COMPLETE release (SQL + docs) must
-    # exist first — build-sql AND build-docs must have succeeded — before the
-    # irreversible crate publish. For `bindings`, build-sql/build-docs are skipped
-    # (the SQL release + its docs already exist from an earlier target=eql/all run).
+    # A COMPLETE release (SQL + docs) must exist first — for `all`, build-sql AND
+    # build-docs must have succeeded — before the irreversible crate publish. For
+    # `bindings`, build-sql/build-docs are skipped (the SQL release + its docs
+    # already exist; the crate publishes same-source from the pin commit).
     if: >-
       ${{ !cancelled() && !inputs.dry_run
           && (inputs.target == 'all' || inputs.target == 'bindings')
@@ -804,9 +940,10 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
       - name: Dispatch release-plz.yml against the pinned commit
         # crates.io Trusted Publishing matches workflow_ref = release-plz.yml, so
         # the crate MUST publish from release-plz.yml as its own entry point.
-        # `workflow_dispatch` is the GITHUB_TOKEN suppression exception, so this
-        # actually starts a run. For `all` we dispatch against the immutable SQL
-        # tag (== commit S); for `bindings` against the branch (head == pin S).
+        # `workflow_dispatch` is the GITHUB_TOKEN suppression exception. For `all`
+        # we dispatch against the immutable SQL tag (== commit S); for `bindings`
+        # against the branch, whose head is the +1 metadata pin commit on top of
+        # the SQL release commit (same source).
         env:
           GH_TOKEN: ${{ github.token }}
           SQL_TAG: ${{ needs.resolve.outputs.sql_tag }}
@@ -861,28 +998,28 @@ Notes on `set -e` safety: every guard uses `if ; then …; fi` (not `
 - [ ] **Step 8: Validate the coordinator**
 
 Run: `actionlint .github/workflows/release-alpha.yml && python3 -c "import yaml; yaml.safe_load(open('.github/workflows/release-alpha.yml'))" && echo OK`
-Expected: `OK`. actionlint checks: the `uses: ./.github/workflows/_build-sql.yml` and `_build-docs.yml` inputs match Tasks 1 & 2; `needs` references exist; expression syntax valid.
+Expected: `OK`.
 
 - [ ] **Step 9: Commit**
 
 ```bash
 git add .github/workflows/release-alpha.yml
-git commit -m "ci(release): add release-alpha.yml coordinator (SQL + docs in-run, then crate)"
+git commit -m "ci(release): add release-alpha.yml coordinator (branch/same-source guards, no-op-tolerant pin, dispatch_id)"
 ```
 
 ---
 
-### Task 6: Thin mise triggers + retire `preview.sh`
+### Task 7: Thin mise triggers + retire `preview.sh`
 
 **Files:**
-- Create: `tasks/release/all.sh`, `tasks/release/eql.sh`, `tasks/release/bindings.sh` (auto-register as `release:all` / `release:eql` / `release:bindings`)
-- Delete: `tasks/release/preview.sh` (retires `release:preview`)
+- Create: `tasks/release/all.sh`, `tasks/release/eql.sh`, `tasks/release/bindings.sh`
+- Delete: `tasks/release/preview.sh`
 
 **Interfaces:**
-- Consumes: `release-alpha.yml` inputs (Task 5): `target`, `version`, `channel`, `pre`, `dry_run`; and the `run-name` shape `release-alpha   …`.
-- Each task forwards `--version`/`--channel`/`--pre`/`--dry-run` and watches the run it started by matching the `run-name` (never `gh run list -L1`).
+- Consumes: `release-alpha.yml` inputs (Task 6): `target`, `version`, `channel`, `pre`, `dry_run`, `dispatch_id`; and the `run-name` which embeds `[]`.
+- Each task validates inputs, builds the dispatch as a **Bash args array** (ShellCheck-clean), generates a unique `dispatch_id`, dispatches, then watches the run whose `displayTitle` **contains that `dispatch_id`** (unambiguous — no `-L1`, no createdAt tiebreak).
 
-Design note — the three scripts are intentionally near-identical (only `target=` differs), so the dispatch+watch logic is inlined in each rather than sourced from a shared helper. mise auto-discovers **every** file under `tasks/`, so a sourced `tasks/release/_lib.sh` would register as a phantom `release:_lib` task; inlining ~30 thin lines avoids that. This matches the existing self-contained `preview.sh` pattern.
+Design note — the three scripts are intentionally near-identical (only `target=` and a couple of messages differ), so the logic is inlined in each. mise auto-discovers **every** file under `tasks/`, so a sourced helper would register as a phantom task; inlining ~40 thin lines avoids that.
 
 - [ ] **Step 1: Write `tasks/release/all.sh`**
 
@@ -892,14 +1029,14 @@ Design note — the three scripts are intentionally near-identical (only `target
 #USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
 #USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
 #USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git ref to dispatch against" default=""
+#USAGE flag "--ref " help="Git branch to dispatch against (the crate pin is pushed here)" default=""
 #USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
 
 set -euo pipefail
 
-# Thin trigger: this does NOTHING release-relevant locally. It dispatches the
-# CI-native coordinator (.github/workflows/release-alpha.yml) with target=all
-# and watches THAT run. Same-commit lockstep + all safety live in CI.
+# Thin trigger: nothing release-relevant runs locally. It dispatches the
+# CI-native coordinator (.github/workflows/release-alpha.yml) with target=all and
+# watches THAT run. Same-commit lockstep + all safety live in CI.
 
 target="all"
 version="${usage_version:-3.0.0}"
@@ -910,46 +1047,52 @@ dry_run="${usage_dry_run:-false}"
 
 err() { echo "error: $*" >&2; exit 1; }
 
+# --- Validate (mirrors the coordinator's resolve guards) ---------------------
 case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
 command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
 gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
 
-[[ -n "$ref" ]] || ref="$(git rev-parse --abbrev-ref HEAD)"
+# target=all pins+pushes the crate version, so it needs a real BRANCH.
+if [[ -z "$ref" ]]; then
+  ref="$(git rev-parse --abbrev-ref HEAD)"
+  [[ "$ref" != "HEAD" ]] || err "detached HEAD; pass --ref  (target=all pushes the crate pin to a branch)"
+fi
 
-# Correlation string that MUST appear in the coordinator's run-name (see
-# release-alpha.yml). When --pre is given the identity is exact; otherwise the
-# coordinator derives N server-side, so we correlate on version-channel + target
-# and pick the newest matching run created after dispatch.
-correlation="${pre:-${version}-${channel}}"
+# Unique correlation id echoed into the coordinator's run-name so we watch the
+# EXACT run we started.
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
 
-dispatched_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
-echo "==> Dispatching release-alpha.yml (target=${target}) on ref ${ref}"
-gh workflow run release-alpha.yml --ref "$ref" \
-  -f target="$target" \
-  -f version="$version" \
-  -f channel="$channel" \
-  ${pre:+-f pre="$pre"} \
-  $([[ "$dry_run" == "true" ]] && printf -- '-f dry_run=true')
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
 
-echo "==> Locating the dispatched run (by run-name '${target} ${correlation}', not -L1)"
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
+
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
 run_id=""
 for _ in $(seq 1 30); do
   run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle,createdAt \
-    --jq "[.[] | select(.createdAt >= \"${dispatched_at}\") | select(.displayTitle | contains(\"${target} ${correlation}\"))] | sort_by(.createdAt) | last | .databaseId")
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
   [[ -n "$run_id" && "$run_id" != "null" ]] && break
   sleep 2
 done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched release-alpha run"
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
 
 echo "==> Watching run ${run_id}"
 gh run watch "$run_id" --exit-status
-echo "==> Coordinator run finished. For target=all, the crate publish runs as a SEPARATE release-plz.yml run — watch it in the Actions tab."
+echo "==> Coordinator finished. For target=all, the crate publish runs as a SEPARATE release-plz.yml run — watch it in the Actions tab."
 ```
 
 - [ ] **Step 2: Write `tasks/release/eql.sh`**
 
-Identical to `all.sh` except the `#MISE description`, `target`, and the trailing note. Full file:
+Identical to `all.sh` except `#MISE description`, `target`, the ref guard (eql needs no push, so **any** ref is allowed — only the unusable `HEAD` default is rejected), and the trailing note. Full file:
 
 ```bash
 #!/usr/bin/env bash
@@ -957,7 +1100,7 @@ Identical to `all.sh` except the `#MISE description`, `target`, and the trailing
 #USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
 #USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
 #USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git ref to dispatch against" default=""
+#USAGE flag "--ref " help="Git ref (branch or tag) to dispatch against" default=""
 #USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
 
 set -euo pipefail
@@ -972,31 +1115,40 @@ dry_run="${usage_dry_run:-false}"
 err() { echo "error: $*" >&2; exit 1; }
 
 case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
 command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
 gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
 
-[[ -n "$ref" ]] || ref="$(git rev-parse --abbrev-ref HEAD)"
-correlation="${pre:-${version}-${channel}}"
+# target=eql does not push, so any ref works; only reject the unusable "HEAD"
+# default from a detached checkout.
+if [[ -z "$ref" ]]; then
+  ref="$(git rev-parse --abbrev-ref HEAD)"
+  [[ "$ref" != "HEAD" ]] || err "detached HEAD; pass --ref "
+fi
+
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
+
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
 
-dispatched_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
-echo "==> Dispatching release-alpha.yml (target=${target}) on ref ${ref}"
-gh workflow run release-alpha.yml --ref "$ref" \
-  -f target="$target" \
-  -f version="$version" \
-  -f channel="$channel" \
-  ${pre:+-f pre="$pre"} \
-  $([[ "$dry_run" == "true" ]] && printf -- '-f dry_run=true')
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
 
-echo "==> Locating the dispatched run (by run-name '${target} ${correlation}', not -L1)"
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
 run_id=""
 for _ in $(seq 1 30); do
   run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle,createdAt \
-    --jq "[.[] | select(.createdAt >= \"${dispatched_at}\") | select(.displayTitle | contains(\"${target} ${correlation}\"))] | sort_by(.createdAt) | last | .databaseId")
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
   [[ -n "$run_id" && "$run_id" != "null" ]] && break
   sleep 2
 done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched release-alpha run"
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
 
 echo "==> Watching run ${run_id}"
 gh run watch "$run_id" --exit-status
@@ -1005,22 +1157,23 @@ echo "==> Done. SQL prerelease + docs cut; no crate published (target=eql)."
 
 - [ ] **Step 3: Write `tasks/release/bindings.sh`**
 
-Identical to `eql.sh` except `#MISE description`, `target="bindings"`, and the trailing note. Full file:
+Identical to `all.sh` except `#MISE description`, `target="bindings"`, the branch-required note, and the trailing note. Full file:
 
 ```bash
 #!/usr/bin/env bash
-#MISE description="Publish the eql-bindings crate for an EXISTING SQL alpha: dispatch release-alpha.yml (target=bindings) and watch the run"
+#MISE description="Publish the eql-bindings crate for an EXISTING SQL alpha (same-source, +1 metadata commit): dispatch release-alpha.yml (target=bindings) and watch"
 #USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
 #USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
 #USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git ref to dispatch against" default=""
+#USAGE flag "--ref " help="Git branch to dispatch against (must currently be AT the eql- commit)" default=""
 #USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
 
 set -euo pipefail
 
-# target=bindings requires a matching eql- SQL release (which already
-# carries its docs) to already exist — the lockstep invariant, enforced
-# server-side in release-alpha.yml.
+# target=bindings publishes the crate SAME-SOURCE from an existing eql-
+# SQL release: the branch must currently be AT that release's commit (the
+# coordinator guards branch-HEAD == SQL-tag-commit), and the pin adds a
+# metadata-only commit on top. Requires a BRANCH (the pin is pushed).
 
 target="bindings"
 version="${usage_version:-3.0.0}"
@@ -1032,31 +1185,38 @@ dry_run="${usage_dry_run:-false}"
 err() { echo "error: $*" >&2; exit 1; }
 
 case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
 command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
 gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
 
-[[ -n "$ref" ]] || ref="$(git rev-parse --abbrev-ref HEAD)"
-correlation="${pre:-${version}-${channel}}"
+if [[ -z "$ref" ]]; then
+  ref="$(git rev-parse --abbrev-ref HEAD)"
+  [[ "$ref" != "HEAD" ]] || err "detached HEAD; pass --ref  (target=bindings pushes the crate pin to a branch)"
+fi
+
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
 
-dispatched_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
-echo "==> Dispatching release-alpha.yml (target=${target}) on ref ${ref}"
-gh workflow run release-alpha.yml --ref "$ref" \
-  -f target="$target" \
-  -f version="$version" \
-  -f channel="$channel" \
-  ${pre:+-f pre="$pre"} \
-  $([[ "$dry_run" == "true" ]] && printf -- '-f dry_run=true')
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
 
-echo "==> Locating the dispatched run (by run-name '${target} ${correlation}', not -L1)"
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
+
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
 run_id=""
 for _ in $(seq 1 30); do
   run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle,createdAt \
-    --jq "[.[] | select(.createdAt >= \"${dispatched_at}\") | select(.displayTitle | contains(\"${target} ${correlation}\"))] | sort_by(.createdAt) | last | .databaseId")
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
   [[ -n "$run_id" && "$run_id" != "null" ]] && break
   sleep 2
 done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched release-alpha run"
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
 
 echo "==> Watching run ${run_id}"
 gh run watch "$run_id" --exit-status
@@ -1075,64 +1235,171 @@ git rm tasks/release/preview.sh
 Run: `mise tasks ls | grep -E '^release:'`
 Expected: `release:all`, `release:bindings`, `release:eql` present; `release:preview` **absent**.
 
-- [ ] **Step 6: Lint the scripts**
+- [ ] **Step 6: ShellCheck the wrappers**
 
 Run: `shellcheck tasks/release/all.sh tasks/release/eql.sh tasks/release/bindings.sh`
-Expected: no errors. (If `shellcheck` is unavailable, `bash -n tasks/release/*.sh` at minimum — expected: no syntax errors.)
+Expected: **no errors** (the args-array construction and quoted expansions clear SC2046/SC2086).
 
 - [ ] **Step 7: Commit**
 
 ```bash
 git add tasks/release/all.sh tasks/release/eql.sh tasks/release/bindings.sh
-git commit -m "ci(release): add thin release:{all,eql,bindings} mise triggers; retire release:preview"
+git commit -m "ci(release): add thin release:{all,eql,bindings} mise triggers (dispatch_id watch); retire release:preview"
+```
+
+---
+
+### Task 8: Persistent CI gate — `.github/workflows/lint-release.yml`
+
+**Files:**
+- Create: `.github/workflows/lint-release.yml`
+
+**Interfaces:**
+- Produces: a PR-triggered job that runs `actionlint` on the release workflows, `shellcheck` on `tasks/release/*.sh` and the `.github/scripts` helpers, and the identity-derivation unit test — turning the previously manual/observational checks into a durable gate.
+
+- [ ] **Step 1: Write the gate workflow**
+
+```yaml
+name: "Lint release tooling"
+
+# Durable gate for the CI-native release machinery. Runs on any PR that touches
+# the release workflows, wrappers, or helper scripts (and manually), so a broken
+# workflow expression, a ShellCheck regression, or a broken identity derivation
+# is caught in review — not on a real alpha.
+
+on:
+  pull_request:
+    paths:
+      - .github/workflows/_build-sql.yml
+      - .github/workflows/_build-docs.yml
+      - .github/workflows/release-eql.yml
+      - .github/workflows/release-plz.yml
+      - .github/workflows/release-alpha.yml
+      - .github/workflows/lint-release.yml
+      - .github/scripts/derive-identity.sh
+      - .github/scripts/derive-identity.test.sh
+      - tasks/release/*.sh
+  workflow_dispatch: {}
+
+permissions:
+  contents: read
+
+defaults:
+  run:
+    shell: bash
+
+jobs:
+  lint:
+    name: actionlint + shellcheck + unit test
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    timeout-minutes: 10
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Install actionlint
+        run: |
+          set -euo pipefail
+          bash <(curl -sSfL https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
+          echo "$PWD" >> "$GITHUB_PATH"
+
+      - name: actionlint (release workflows)
+        run: |
+          set -euo pipefail
+          actionlint \
+            .github/workflows/_build-sql.yml \
+            .github/workflows/_build-docs.yml \
+            .github/workflows/release-eql.yml \
+            .github/workflows/release-plz.yml \
+            .github/workflows/release-alpha.yml \
+            .github/workflows/lint-release.yml
+
+      - name: shellcheck (wrappers + helpers)
+        # shellcheck is preinstalled on ubuntu runners.
+        run: |
+          set -euo pipefail
+          shellcheck \
+            tasks/release/all.sh \
+            tasks/release/eql.sh \
+            tasks/release/bindings.sh \
+            .github/scripts/derive-identity.sh \
+            .github/scripts/derive-identity.test.sh
+
+      - name: identity-derivation unit test
+        run: bash .github/scripts/derive-identity.test.sh
+```
+
+- [ ] **Step 2: Validate the gate workflow itself**
+
+Run: `actionlint .github/workflows/lint-release.yml && python3 -c "import yaml; yaml.safe_load(open('.github/workflows/lint-release.yml'))" && echo OK`
+Expected: `OK`.
+
+- [ ] **Step 3: Dry-run the gate's commands locally**
+
+Run:
+```bash
+shellcheck tasks/release/*.sh .github/scripts/derive-identity.sh .github/scripts/derive-identity.test.sh
+bash .github/scripts/derive-identity.test.sh
+```
+Expected: shellcheck clean; the unit test prints all `ok:` and exits 0.
+
+- [ ] **Step 4: Document the docs-failure fault-injection check (scratch-branch only)**
+
+This proves the SQL→docs→crate ordering guarantee — it cannot run on a real publish, so record it as a **scratch-branch-only** manual procedure (add it under a "Verification" note in `docs/development/releasing-an-alpha.md` in Task 9, and reference it here):
+
+1. On a throwaway branch, temporarily edit `_build-docs.yml`'s "Generate documentation" step to `run: exit 1` (force a docs failure). Commit to the scratch branch only.
+2. `mise run release:eql --ref ` (or `release:all`).
+3. Observe: `build-docs` is **red**, and `crate-publish` (for `all`) is **skipped** — never started — because its `if` requires `needs.build-docs.result == 'success'`. Delete any prerelease/tag the run created and discard the scratch branch.
+4. **Never** run this on a branch you will dispatch a real publish from.
+
+- [ ] **Step 5: Commit**
+
+```bash
+git add .github/workflows/lint-release.yml
+git commit -m "ci(release): add lint-release gate (actionlint + shellcheck + identity unit test)"
 ```
 
 ---
 
-### Task 7: Documentation updates
+### Task 9: Documentation updates
 
 **Files:**
-- Modify: `docs/development/releasing-an-alpha.md` (replace the manual/`release:preview` runbook with the task/dispatch flow)
-- Modify: `CLAUDE.md` (swap `release:preview` → the three new tasks; note they trigger `release-alpha.yml`)
+- Modify: `docs/development/releasing-an-alpha.md`
+- Modify: `CLAUDE.md`
 - Grep-and-fix any remaining stray `release:preview` references
 
 - [ ] **Step 1: Rewrite `docs/development/releasing-an-alpha.md`**
 
-Replace the "Scripted path (recommended)", "Steps (manual equivalent)", and "Releasing `eql-bindings` in lockstep" sections with the CI-native flow. Key content to include (keep the "What ships", "Why a prerelease is different", "Smoke-test", and "Promoting to a final release" sections, updated where they mention `release:preview`):
+Replace the "Scripted path", "Steps (manual equivalent)", and "Releasing `eql-bindings` in lockstep" sections with the CI-native flow. Include:
 
-- **What ships (unchanged for alphas):** the two `.sql` files **and** the packaged docs bundle (`eql-docs-*.zip`/`.tar.gz`) — the coordinator builds both in-run, so a coordinator-cut alpha carries the same assets as a final release.
-- **The three tasks** and what each dispatches:
-  - `mise run release:all` → coordinator `target=all`: pins the crate to ``, commits+pushes (commit `S`), builds+attaches the SQL prerelease at `S`, builds+attaches docs at `S`, then dispatches `release-plz.yml` against the `eql-` tag to publish the crate at `S`. Both tags land on `S`.
-  - `mise run release:eql` → `target=eql`: SQL prerelease + docs only (no crate). SQL-without-crate is allowed.
-  - `mise run release:bindings` → `target=bindings`: publishes the crate for an **already-existing** `eql-` SQL release (which already carries its docs); fails if none exists.
-- **Flags**: `--version` (default `3.0.0`), `--channel` (`alpha`|`beta`|`rc`), `--pre` (exact identity, bypass `N`), `--ref` (default current branch), `--dry-run` (resolve+verify+print plan, mutate nothing).
-- **Always `--dry-run` first.** Example:
+- **What ships (unchanged for alphas):** the two `.sql` files **and** the docs bundle (`eql-docs-*`), both built in-run — same assets as a final release.
+- **The three tasks:**
+  - `mise run release:all` → `target=all`: pins the crate to ``, commits+pushes (commit `S`), builds+attaches SQL + docs at `S`, then dispatches `release-plz.yml` against the `eql-` tag to publish the crate at `S`. Both tags on `S`. **Requires `--ref `** (the pin is pushed).
+  - `mise run release:eql` → `target=eql`: SQL prerelease + docs only (no crate). Any ref works (no push).
+  - `mise run release:bindings` → `target=bindings`: publishes the crate for an **existing** `eql-` SQL release, **same-source** — the branch must currently be **at that release's commit** (the coordinator guards branch-HEAD == SQL-tag-commit) and the pin adds a metadata-only commit on top. Fails fast if no matching SQL release exists, or if the branch has advanced past it (use `release:all` for a fresh identity). **Requires `--ref `**.
+- **Flags:** `--version` (default `3.0.0`, validated `X.Y.Z`), `--channel` (`alpha`|`beta`|`rc`), `--pre` (exact identity, validated `X.Y.Z-(alpha|beta|rc).N`), `--ref`, `--dry-run`.
+- **Always `--dry-run` first.** Examples:
   ```bash
   mise run release:all --dry-run
   mise run release:all                    # -> eql-3.0.0-alpha.N (+ docs) + eql-bindings-v3.0.0-alpha.N on one commit
-  mise run release:eql --channel beta     # -> eql-3.0.0-beta.N (SQL + docs only)
-  mise run release:bindings --pre 3.0.0-alpha.2   # publish the crate for an existing eql-3.0.0-alpha.2
+  mise run release:eql --channel beta     # -> eql-3.0.0-beta.N (SQL + docs)
+  mise run release:bindings --pre 3.0.0-alpha.2   # publish the crate for an existing eql-3.0.0-alpha.2 (same source)
   ```
-- **Identity derivation** happens **server-side** across both tag namespaces (`N = 1 + max(SQL N, crate N)`), from freshly-fetched tags — no stale local tags.
-- **Two runs to watch for `target=all`/`target=bindings`**: the mise task watches the coordinator run; the crate publish is a **separate** `release-plz.yml` run (fire-and-forget) — watch it in the Actions tab. The failure direction (crate fails after SQL+docs shipped) is the safe one (SQL-without-crate).
-- **Ordering guarantee:** SQL → docs → crate. A docs-build failure aborts before the irreversible crate publish, so a crate never ships against an incomplete release.
-- **The prerequisite for the crate**: crates.io Trusted Publishing is configured for `Workflow: release-plz.yml`; the coordinator dispatches that workflow so the OIDC identity still matches. Do not move the crate publish into the coordinator.
-- Remove all `mise run release:preview`, `--tag`, and `--target ` references; the manual `gh release create` steps; and the entire hand-coordinated lockstep procedure (it is now the coordinator's job). Keep the "Smoke-test the alpha" and "Promoting to a final release later" sections, updating the tag examples to `eql-3.0.0-alpha.N`.
+- **Identity derivation** is server-side across both namespaces (`N = 1 + max(SQL N, crate N)`).
+- **Two runs to watch** for `all`/`bindings`: the mise task watches the coordinator run (found via the unique `dispatch_id`); the crate publish is a **separate** `release-plz.yml` run.
+- **Ordering guarantee:** SQL → docs → crate. A docs-build failure aborts before the crate publish.
+- **TP prerequisite:** crates.io Trusted Publishing is configured for `Workflow: release-plz.yml`; the coordinator dispatches that workflow so the identity matches. Do not move the crate publish into the coordinator.
+- Add a **Verification** subsection pointing to the durable gate (`lint-release.yml`: actionlint + shellcheck + `derive-identity.test.sh`) and the **scratch-branch-only** docs-failure fault-injection procedure from Task 8 Step 4.
+- Remove all `mise run release:preview`, `--tag`, `--target `, manual `gh release create`, and hand-coordinated-lockstep content. Keep "Smoke-test the alpha" and "Promoting to a final release later", updating tag examples to `eql-3.0.0-alpha.N`.
 
 - [ ] **Step 2: Update `CLAUDE.md`**
 
-In the "Release & changelog discipline" section (around line 243), replace the **Prerelease** bullet:
+Replace the **Prerelease** bullet (around line 243):
 
-Old:
-```
-- **Prerelease (alpha / beta / rc):** run `mise run release:preview` (`tasks/release/preview.sh`). ...
 ```
-New (match the surrounding tone/density):
-```
-- **Prerelease (alpha / beta / rc):** run `mise run release:all` (both artefacts in lockstep), `mise run release:eql` (SQL surface + docs only), or `mise run release:bindings` (crate for an existing SQL alpha). Each is a thin trigger that dispatches the CI-native coordinator `.github/workflows/release-alpha.yml` (`workflow_dispatch`) and watches the run — nothing release-relevant runs locally. The coordinator derives the `-.` identity server-side across both tag namespaces, verifies the drift gates, and (for `all`) pins+commits the crate, builds+attaches the SQL prerelease and the docs bundle in-run, then dispatches the crate publish so both land on one commit. Always `--dry-run` first; `--pre` sets an exact identity; `--ref`/`--channel`/`--version` tune the dispatch. It does **not** touch `CHANGELOG.md` (previews stay under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
+- **Prerelease (alpha / beta / rc):** run `mise run release:all` (both artefacts in lockstep, same commit), `mise run release:eql` (SQL surface + docs only), or `mise run release:bindings` (crate for an existing SQL alpha, same-source). Each is a thin trigger that dispatches the CI-native coordinator `.github/workflows/release-alpha.yml` (`workflow_dispatch`) and watches the run via a unique `dispatch_id` — nothing release-relevant runs locally. The coordinator derives the `-.` identity server-side across both tag namespaces, verifies the drift gates, and (for `all`) pins+commits the crate, builds+attaches the SQL prerelease and the docs bundle in-run, then dispatches the crate publish so both land on one commit; `all`/`bindings` require `--ref ` (the pin is pushed). Always `--dry-run` first. It does **not** touch `CHANGELOG.md` (previews stay under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
 ```
 
-Also update the lockstep paragraph immediately below it: replace "This is a manual coordination procedure" with a note that lockstep is now automated by `mise run release:all` / the `release-alpha.yml` coordinator (same-commit `eql-bindings-v` ↔ `eql-`), and update the line-291-area pointer ("For an alpha/beta/rc, use `mise run release:preview` instead") to name the three new tasks.
+Also update the lockstep paragraph below it (lockstep is now automated by `mise run release:all` / the coordinator, same-commit) and the line-291-area pointer to name the three new tasks.
 
 - [ ] **Step 3: Grep for stray references**
 
@@ -1140,7 +1407,7 @@ Run:
 ```bash
 grep -rn "release:preview\|tasks/release/preview" --include="*.md" --include="*.toml" --include="*.sh" . | grep -v node_modules
 ```
-Expected: **no matches** (all migrated). Fix any that remain.
+Expected: **no matches**. Fix any that remain.
 
 - [ ] **Step 4: Commit**
 
@@ -1151,107 +1418,94 @@ git commit -m "docs(release): document CI-native release:{all,eql,bindings} flow
 
 ---
 
-### Task 8: End-to-end validation (staged rollout)
-
-**Files:** none (execution + observation only). This task cannot be fully dry-run: a crates.io publish is irreversible, so a **real alpha is the only true end-to-end test**. Validate in increasing order of irreversibility.
+### Task 10: End-to-end validation (staged rollout)
 
-**Precondition:** the branch (`feat/release-tasks`, or wherever this lands) must be **pushed** — `gh workflow run` reads the workflow file from the dispatched ref, so `release-alpha.yml` must exist on that ref.
+**Files:** none (execution + observation only). A crates.io publish is irreversible, so a **real alpha is the only true end-to-end test**. Validate in increasing order of irreversibility. **Precondition:** the branch must be **pushed** (`gh workflow run` reads the workflow file from the dispatched ref).
 
-- [ ] **Step 1: Static validation of all workflows**
+- [ ] **Step 1: Static validation (mirrors the durable gate)**
 
-Run: `actionlint .github/workflows/_build-sql.yml .github/workflows/_build-docs.yml .github/workflows/release-eql.yml .github/workflows/release-plz.yml .github/workflows/release-alpha.yml`
-Expected: no output (exit 0).
+Run:
+```bash
+actionlint .github/workflows/_build-sql.yml .github/workflows/_build-docs.yml .github/workflows/release-eql.yml .github/workflows/release-plz.yml .github/workflows/release-alpha.yml .github/workflows/lint-release.yml
+shellcheck tasks/release/*.sh .github/scripts/derive-identity.sh .github/scripts/derive-identity.test.sh
+bash .github/scripts/derive-identity.test.sh
+```
+Expected: all clean; unit test all `ok:`.
 
 - [ ] **Step 2: `dry_run` each target (mutates nothing)**
 
 ```bash
 mise run release:eql --dry-run
 mise run release:all --dry-run
-mise run release:bindings --dry-run   # expect a fast failure if no SQL alpha awaits a crate
+mise run release:bindings --dry-run   # fast failure if no SQL alpha awaits a crate, or branch advanced past it
 ```
-Expected: each dispatches a coordinator run that resolves an identity, prints the plan to the run summary, and **creates no tags/releases/commits**. Confirm via the run's "Release plan" summary. `release:bindings --dry-run` with no eligible SQL release should fail in `resolve` with the lockstep-invariant error — that is correct.
+Expected: each resolves an identity, prints the plan, creates nothing. Confirm via the run's "Release plan" summary. The wrapper finds its own run via `dispatch_id`.
 
-- [ ] **Step 3: Cross-namespace `N` check (read the resolved plan)**
+- [ ] **Step 3: Cross-namespace `N` + guard checks (read the resolved plan / errors)**
 
-With an `eql-3.0.0-alpha.5` tag present and no crate alpha tag:
-- `mise run release:bindings --pre 3.0.0-alpha.5 --dry-run` → resolves (matching SQL exists).
-- `mise run release:all --dry-run` → plan shows identity `3.0.0-alpha.6` (`N = 1 + max(5, 0)`).
-- `mise run release:bindings --version 3.0.0 --channel alpha --dry-run` (no `--pre`) → resolves to the latest SQL alpha lacking a crate (`alpha.5`).
+- With `eql-3.0.0-alpha.5` present, no crate alpha: `release:all --dry-run` → identity `3.0.0-alpha.6`.
+- `release:bindings --pre 3.0.0-alpha.5 --dry-run` → resolves only if the branch is **at** the `eql-3.0.0-alpha.5` commit; otherwise fails with "branch has advanced past …".
+- `release:all` dispatched against a **tag** ref → `resolve` fails the pushable-branch guard.
+- Invalid inputs: `release:all --version 3.0 --dry-run` and `release:all --pre 3.0.0alpha1 --dry-run` fail fast in the wrapper (and would also fail in `resolve`).
 
 - [ ] **Step 4: Throwaway `target=eql` smoke release (SQL + docs)**
 
 ```bash
 mise run release:eql
 ```
-Expected: coordinator run succeeds; a prerelease `eql-3.0.0-alpha.N` is created on the branch HEAD with `cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`, **and** the `eql-docs-*.zip`/`.tar.gz` bundle attached; **no crate published**; **no `release-pr`** anywhere. Verify:
-```bash
-gh release view eql-3.0.0-alpha.N          # two .sql assets + eql-docs-*, marked prerelease
-gh run list --workflow release-plz.yml -L 3   # confirm NO new release-plz run fired
-```
-Then delete the throwaway release + tag if it was only a smoke test:
-```bash
-gh release delete eql-3.0.0-alpha.N --cleanup-tag --yes
-```
+Expected: prerelease `eql-3.0.0-alpha.N` on branch HEAD with both `.sql` files **and** `eql-docs-*`; **no crate**, **no `release-pr`**. Verify with `gh release view` and `gh run list --workflow release-plz.yml -L 3`. Delete the throwaway: `gh release delete eql-3.0.0-alpha.N --cleanup-tag --yes`.
+
+- [ ] **Step 5: Docs-failure aborts the crate (scratch-branch, optional)**
+
+Run the fault-injection procedure documented in Task 8 Step 4: force `_build-docs.yml` to fail on a scratch branch and confirm `crate-publish` is **skipped**. Never on a real-publish branch.
 
-- [ ] **Step 5: Docs-failure aborts the crate (fault-injection, optional)**
+- [ ] **Step 6: Recovery idempotence (optional)**
 
-Confirm the ordering guarantee by observation: in any `target=all` run where `build-docs` fails, `crate-publish` must be **skipped** (its `if` requires `needs.build-docs.result == 'success'`). Read a run's job graph to confirm `crate-publish` did not start when `build-docs` was red. (Do not deliberately break docs on a real publish; verify from run history or a scratch branch.)
+After a `target=all` where the crate publish failed but SQL+docs shipped, re-running `mise run release:all --pre ` must **not** fail on the pin: `set-version` is a no-op → `pin` skips the commit/push and reuses HEAD as `S`; the run re-dispatches the crate publish. (release-plz itself is idempotent and won't republish an existing version.)
 
-- [ ] **Step 6: Real `target=all` end-to-end**
+- [ ] **Step 7: Real `target=all` end-to-end**
 
 ```bash
 mise run release:all
 ```
-Expected and to verify:
-- Both tags land on the **same commit `S`**:
-  ```bash
-  git fetch --tags
-  git rev-list -n1 eql-3.0.0-alpha.N
-  git rev-list -n1 eql-bindings-v3.0.0-alpha.N   # equal to the above
-  ```
-- The SQL prerelease + docs bundle were built+attached **in-run** (`build-sql` and `build-docs` jobs green) **before** the crate dispatch.
-- The crate publish ran as a **separate `release-plz.yml` run** (workflow_dispatch), its `release` job green, `release-pr` **skipped** (ref is a tag), and the crates.io **TP token exchange succeeded** (publish ran under `workflow_ref = release-plz.yml`). Confirm:
-  ```bash
-  gh run list --workflow release-plz.yml -L 3      # the dispatched run present
-  gh run view                          # release: success, release-pr: skipped
-  ```
-- `gh release view eql-3.0.0-alpha.N` lists the two `.sql` files + `eql-docs-*`.
-- The `eql-bindings@3.0.0-alpha.N` version is live on crates.io.
+Verify: both tags on the **same commit `S`** (`git rev-list -n1 eql-3.0.0-alpha.N` == `git rev-list -n1 eql-bindings-v3.0.0-alpha.N`); SQL + docs built+attached in-run before the crate dispatch; the crate publish ran as a **separate `release-plz.yml` run** with `release` green, `release-pr` **skipped**, **TP token exchange succeeded**; the release lists two `.sql` + `eql-docs-*`; `eql-bindings@3.0.0-alpha.N` live on crates.io.
 
-- [ ] **Step 7: Watch-correctness under overlap (optional)**
+- [ ] **Step 8: Watch-correctness under overlap (optional)**
 
-Dispatch two distinguishable runs close together (e.g. `mise run release:eql --dry-run` and `mise run release:all --dry-run`) and confirm each mise invocation watches **its own** run (matched by ` ` in `run-name`), not whichever finished last via `-L1`.
+Dispatch two runs close together (even with identical inputs) and confirm each mise invocation watches **its own** run via its unique `dispatch_id` in the run-name.
 
 ---
 
 ## Self-Review
 
-**Spec coverage** (Companion changes + docs-required decision + Verification):
-1. `_build-sql.yml` reusable → Task 1. ✅
-2. `_build-docs.yml` reusable (docs on alphas, per user decision) → Task 2. ✅
-3. `release-eql.yml` refactor (both `build-and-publish` → `_build-sql.yml` and `publish-docs` → `_build-docs.yml`, finals parity) → Task 3. ✅
+**Spec coverage** (companion changes + docs decision + review findings + verification):
+1. `_build-sql.yml` → Task 1. ✅
+2. `_build-docs.yml` (docs on alphas) → Task 2. ✅
+3. `release-eql.yml` refactor (both reusables, finals parity) → Task 3. ✅
 4. `release-plz.yml` `release-pr` gated to `main` → Task 4. ✅
-5. `release-alpha.yml` coordinator (inputs, concurrency, run-name, both-namespace identity, all/eql/bindings flows, **in-run docs via `build-docs`**, crate publish via `gh workflow run release-plz.yml --ref `, SQL→docs→crate ordering, bindings "matching SQL must exist" guard) → Task 5. ✅
-6. Three thin `tasks/release/*.sh` + mise wiring, watch-by-run-name, retire `preview.sh` → Task 6. ✅
-7. Doc updates (`releasing-an-alpha.md`, `CLAUDE.md`, stray-ref grep) → Task 7. ✅
-8. Verification (dry_run per target, cross-namespace N, bindings invariant, target=all same-commit + docs + TP + no stray release-pr, target=eql with docs, docs-failure aborts crate, watch correctness) → Task 8. ✅
+5. Unit-testable identity derivation + test (review finding 7) → Task 5. ✅
+6. Coordinator with: cross-namespace identity, all/eql/bindings flows, in-run docs, SQL→docs→crate ordering; **branch-HEAD==SQL-commit same-source guard for bindings** (finding 1); **no-op-tolerant pin** (finding 2); **pushable-branch guard** (finding 3a); **version/pre validation** (finding 4); **`dispatch_id`** in inputs + run-name (finding 6) → Task 6. ✅
+7. Thin wrappers: **args-array/ShellCheck-clean** (finding 5), **detached-HEAD rejection** (finding 3b), **version/pre validation** (finding 4), **`dispatch_id` generation + unambiguous watch** (finding 6); retire `preview.sh` → Task 7. ✅
+8. **Persistent actionlint + shellcheck + unit-test CI gate** + documented docs-failure fault-injection (finding 7) → Task 8. ✅
+9. Docs updates → Task 9. ✅
+10. Verification (dry_run, cross-namespace N, guard failures, invalid-input rejection, target=eql with docs, docs-failure aborts crate, recovery idempotence, same-commit + TP + no stray release-pr, dispatch_id watch) → Task 10. ✅
 
-**Global-constraint fidelity:** SQL and docs build in-run (reusables called inline, never event fan-out); crate publishes from `release-plz.yml` as its own dispatched entry point (TP untouched); same-commit `S` via dispatch against the immutable SQL tag; SQL→docs→crate ordering enforced by `crate-publish` needing both `build-sql` **and** `build-docs` success; identity across both namespaces; prereleases only. ✅
+**Type/name consistency:** reusable inputs are defined once (Tasks 1, 2) and reused in Tasks 3, 6. `derive_identity` (Task 5) is called by the coordinator (Task 6) and the CI gate (Task 8). Coordinator inputs (`target`/`version`/`channel`/`pre`/`dry_run`/`dispatch_id`) match the wrappers (Task 7) and the `run-name` `[]` that the watcher greps. `pin.outputs.commit_sha` (`S`) feeds `build-sql`/`build-docs` `ref`/`target_commitish`; `crate-publish` gates on both build jobs.
 
-**Type/name consistency:** `_build-sql.yml` inputs (`ref`/`tag`/`attach`/`target_commitish`/`prerelease`) and `_build-docs.yml` inputs (`ref`/`tag`) are each defined once (Tasks 1, 2) and used identically in Tasks 3 and 5. Coordinator outputs (`identity`/`sql_tag`/`crate_tag`, `pin.commit_sha`) and the `build-docs`/`build-sql` `needs` chain are produced and consumed consistently. The `run-name` correlation (` `) matches the mise watcher's `contains("${target} ${correlation}")` filter in Task 6.
+**Rejected finding (per the review):** "empty tag → DEV default" is **kept as-is** — `build.sh` uses `${usage_version:-DEV}` (colon-dash), so empty *or* unset → `DEV`, and `release-eql.yml`'s PR runs rely on it. Only a one-line clarifying comment was added in `_build-sql.yml` and the Global Constraints.
 
 ---
 
 ## Risks and open questions
 
-1. **Docs bundle preserved in-run (resolved).** Per the user's decision, alpha releases carry the docs bundle. The coordinator's `build-docs` job (Task 5) calls the reusable `_build-docs.yml` (Task 2) after `build-sql` succeeds, building docs at the same commit and attaching `eql-docs-*` to the SQL release; `crate-publish` gates on `build-docs` success, so the crate never ships against a docs-less release. **Cost:** each alpha coordinator run adds a doxygen install (`sudo apt-get install -y doxygen`) plus `docs:generate` / `docs:generate:markdown` / `docs:package` (the `publish-docs` timeout is 10 min). No database is required for docs generation. This is the same work finals already do.
+1. **Docs bundle preserved in-run (resolved).** `build-docs` (Task 6) attaches `eql-docs-*` after `build-sql`; `crate-publish` gates on `build-docs` success. **Cost:** each alpha run adds a doxygen install + `docs:generate`/`generate:markdown`/`package` (10-min job, no DB).
 
-2. **Watch ambiguity for identical concurrent dispatches.** `run-name` is fixed at dispatch time and cannot embed a server-derived `N`, so two simultaneous dispatches with **identical** inputs and no `--pre` share a correlation string; the watcher then relies on `createdAt` recency and could attach to the sibling run. The spec's "watch correctness" test uses **distinguishable** inputs (different target/pre), which works. Realistic single-operator use is fine. **Mitigation if it ever bites:** add a hidden `dispatch_id` input echoed into `run-name` — but that adds an input beyond the spec's locked list, so it is deliberately not in this plan.
+2. **Watch ambiguity (resolved via `dispatch_id`).** The wrapper generates a unique `dispatch_id` (`uuidgen`, or a PID/RANDOM/epoch fallback), passes it as an input, the coordinator echoes it into `run-name`, and the wrapper finds its run by `displayTitle | contains(dispatch_id)` — no `-L1`, no createdAt tiebreak. Even identical concurrent dispatches are disambiguated. The `lint-release.yml` gate keeps the wrappers ShellCheck-clean so this logic can't silently rot.
 
-3. **`release-plz set-version` availability.** The pin job installs `release-plz` via `cargo binstall --no-confirm release-plz` (cargo-binstall is already a mise tool). If binstall has no prebuilt for the runner, it falls back to a source build (slow) or fails. **Alternative if flaky:** pin `"cargo:release-plz" = ""` in `mise.toml [tools]`. Flagged, not chosen, to avoid touching the toolchain manifest unless needed.
+3. **`release-plz set-version` availability.** Installed via `cargo binstall --no-confirm release-plz` (cargo-binstall is a mise tool). If no prebuilt exists for the runner it falls back to a slow source build. **Alternative if flaky:** pin `"cargo:release-plz"` in `mise.toml [tools]`.
 
-4. **`pin` pushes to the branch with `GITHUB_TOKEN`.** This works on the unprotected `eql_v3` branch (correct per spec). On a protected `main` (future) the push is blocked — explicitly out of scope ("Future: the `main` channel").
+4. **Pin pushes to the branch with `GITHUB_TOKEN`.** Works on the unprotected `eql_v3` branch; the pushable-branch guard (Task 6) fails fast on a tag/detached ref. Protected `main` is future/out-of-scope.
 
-5. **Cannot fully rehearse the crates.io publish.** `--dry-run` and a throwaway `target=eql` cover everything reversible (now including docs), but the OIDC/TP token exchange and the irreversible publish are only exercised by a real `target=all`/`target=bindings`. The staged rollout in Task 8 (dry-run → throwaway `eql` → real `all`) is the safest available path; the first real `all` should use a low, disposable `N`.
+5. **Cannot fully rehearse the crates.io publish.** Everything reversible (dry-run, throwaway `eql`, recovery idempotence, docs-failure fault-injection) is covered; the OIDC/TP exchange and the irreversible publish are exercised only by a real `all`/`bindings`. First real `all` should use a low, disposable `N`.
 
-6. **`softprops/action-gh-release` prerelease semantics on the finals path.** The plan keeps the finals SQL attach step free of a `prerelease` input (preserving today's behaviour of not altering the existing release's prerelease flag); the docs reusable likewise only attaches. This was verified against the current file's steps. If a future action-v2 default ever starts clobbering an unset `prerelease`, the finals path would need an explicit passthrough — noted as a watch-item, not a current change.
+6. **`softprops/action-gh-release` prerelease semantics on the finals path.** The finals SQL attach step sets no `prerelease` input (preserving the existing release's flag); the docs reusable only attaches. Verified against the current file. A future action default change would need an explicit passthrough — watch-item, not a current change.

From cf2130264b035c3b19f36dc2476675211847c182 Mon Sep 17 00:00:00 2001
From: Dan Draper 
Date: Sat, 4 Jul 2026 17:59:38 +1000
Subject: [PATCH 509/599] =?UTF-8?q?docs:=20refresh=20meta=20files=20for=20?=
 =?UTF-8?q?v3=20=E2=80=94=20rebrand=20Protect.js=20=E2=86=92=20CipherStash?=
 =?UTF-8?q?=20Stack,=20fix=20dead=20links,=20add=20SECURITY.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- Rebrand Protect.js → CipherStash Stack and repoint all
  github.com/cipherstash/protectjs links to cipherstash/stack across
  README, SUPABASE, docker/README, docs/README, WHY, proxy-configuration,
  eql-functions, json-support, sql-support, DEVELOPMENT, v3.0 upgrade
  guide (v2.3 guide and CHANGELOG keep historical package names; only
  dead URLs fixed)
- Five links into the stack repo's removed docs/ tree now point at
  cipherstash.com/docs schema reference
- CLAUDE.md: remove eql_v2 leftovers that contradicted the v3 sections
  (eql_v2_encrypted/configuration bullets, src/blake3 directory tree,
  blake3 index-term lists, eql_v2.create_encrypted_index doc example,
  dead docs/api/README.md and retrospectives pointers, deleted
  tests/test_helpers.sql reference); add crates/ to the layout
- Version pins: 2.1.8 examples →  placeholder with a
  pointer to releases (2.1.8 was two minors stale and v3 ships next)
- dbdev/README.md: replace root-README symlink (whose relative links
  all break when rendered on database.dev) with a standalone README
- Add SECURITY.md (latest-release-line policy, security@ reporting,
  notes that crypto lives in the client) and CODE_OF_CONDUCT.md
  (Contributor Covenant, same as the stack repo)
- docs-feedback issue template: CoC link pointed at the proxy repo;
  now points at this repo's new CODE_OF_CONDUCT.md
- v2.3 upgrade guide: note the @cipherstash/protect → @cipherstash/stack
  rename; drop link to the deleted payload-scheme-discipline RFC
- README: contribution pointer CLAUDE.md → DEVELOPMENT.md
---
 .github/ISSUE_TEMPLATE/docs-feedback.yml |   2 +-
 CHANGELOG.md                             |   2 +-
 CLAUDE.md                                |  66 ++++-------
 CODE_OF_CONDUCT.md                       | 133 +++++++++++++++++++++++
 DEVELOPMENT.md                           |   2 +-
 README.md                                |  14 +--
 SECURITY.md                              |  75 +++++++++++++
 SUPABASE.md                              |   4 +-
 dbdev/README.md                          |  15 ++-
 docker/README.md                         |   8 +-
 docs/README.md                           |   2 +-
 docs/concepts/WHY.md                     |  12 +-
 docs/reference/eql-functions.md          |   4 +-
 docs/reference/json-support.md           |   8 +-
 docs/reference/sql-support.md            |   4 +-
 docs/tutorials/proxy-configuration.md    |  10 +-
 docs/upgrading/v2.3.md                   |   3 +-
 docs/upgrading/v3.0.md                   |   2 +-
 18 files changed, 280 insertions(+), 86 deletions(-)
 create mode 100644 CODE_OF_CONDUCT.md
 create mode 100644 SECURITY.md
 mode change 120000 => 100644 dbdev/README.md

diff --git a/.github/ISSUE_TEMPLATE/docs-feedback.yml b/.github/ISSUE_TEMPLATE/docs-feedback.yml
index 255febd2a..49af6b6fb 100644
--- a/.github/ISSUE_TEMPLATE/docs-feedback.yml
+++ b/.github/ISSUE_TEMPLATE/docs-feedback.yml
@@ -35,7 +35,7 @@ body:
     id: terms
     attributes:
       label: Code of conduct
-      description: By submitting this issue, you agree to follow our [Code of conduct](https://github.com/cipherstash/proxy/blob/main/CODE_OF_CONDUCT.md). 
+      description: By submitting this issue, you agree to follow our [Code of conduct](https://github.com/cipherstash/encrypt-query-language/blob/main/CODE_OF_CONDUCT.md). 
       options:
         - label: I agree to follow this project's Code of conduct
           required: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2bc3bc5f6..5e6b42343 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -123,7 +123,7 @@ Each entry that ships in a published release links to the PR that introduced it.
 - **Per-subtype ORE CLLW directories and functions.** `src/ore_cllw_u64_8/` and `src/ore_cllw_var_8/` collapse to `src/ore_cllw/`. Per-subtype function names (`eql_v2.ore_cllw_u64_8`, `eql_v2.compare_ore_cllw_var_8`, `eql_v2.has_ore_cllw_u64_8`, `eql_v2.has_ore_cllw_var_8`, …) collapse to the single-family names `eql_v2.ore_cllw`, `eql_v2.has_ore_cllw`. The composite types `eql_v2.ore_cllw_u64_8` / `eql_v2.ore_cllw_var_8` collapse to `eql_v2.ore_cllw`. Callers using the old names directly must rewrite — see [U-006](docs/upgrading/v2.3.md#u-006-ste_vec-ore-field-consolidation). ([#219](https://github.com/cipherstash/encrypt-query-language/pull/219))
 - **`eql_v2.ore_cllw(eql_v2_encrypted)`, `eql_v2.has_ore_cllw(eql_v2_encrypted)`, and `eql_v2.compare_ore_cllw(eql_v2_encrypted, eql_v2_encrypted)`.** Replaced by the typed `(eql_v2.ste_vec_entry)` overloads (see `Added` and `Changed` entries above). The removed overloads were misleading: they read `oc` from `eql_v2_encrypted.data`, but per the v2.3 payload schema `oc` is sv-element scope only and never lives at the root of a column value. The "fake-root" trick where `->` merged meta + sv element into a new `eql_v2_encrypted` so these overloads could read `oc` is gone alongside them. Callers must now extract via `->` and cast `.data::eql_v2.ste_vec_entry` to reach the typed overload — see [U-006](docs/upgrading/v2.3.md#u-006-ste_vec-ore-field-consolidation). ([#219](https://github.com/cipherstash/encrypt-query-language/pull/219))
 - **OPE-CLLW support on `eql_v2_encrypted`.** The `eql_v2.ope_cllw_u64_65` and `eql_v2.ope_cllw_var_8` types, their extractor/has/compare families, the `opf` / `opv` payload fields, the `op` field, and the `eql_v2.order_by_ope` helper are all removed. OPE moves to a future separate encrypted column type — `eql_v2_encrypted` now exclusively handles ORE for ordered comparisons. v2.2 didn't emit `opf` / `opv` from production `@cipherstash/protect` either, so this is not a customer-facing data migration; it's a tightening of the documented payload surface. ([#219](https://github.com/cipherstash/encrypt-query-language/pull/219))
-- **Root-level `b3` from synthetic test fixtures.** `create_encrypted_json` no longer emits `"b3": "blake3.…"` at the payload root, matching production [`@cipherstash/protect`](https://github.com/cipherstash/protect-js) output. ([#196](https://github.com/cipherstash/encrypt-query-language/pull/196))
+- **Root-level `b3` from synthetic test fixtures.** `create_encrypted_json` no longer emits `"b3": "blake3.…"` at the payload root, matching production [`@cipherstash/protect`](https://github.com/cipherstash/stack) output. ([#196](https://github.com/cipherstash/encrypt-query-language/pull/196))
 - **Pre-release fused `eql_v2.hmac_256(val eql_v2_encrypted, selector text)`.** This overload, added earlier in the 2.3 cycle as the migration path off Blake3 for U-004, is removed before release in favour of the typed chain `eql_v2.eq_term(col -> '')` (XOR-aware — see U-007). The fused form bypassed the typed model and silently NULLed on oc-bearing selectors. Recipe migration: `eql_v2.hmac_256(col, '')` → `eql_v2.eq_term(col -> '')` (or `WHERE col -> '' = $1::eql_v2.ste_vec_entry`); index DDL: `USING hash (eql_v2.hmac_256(col, ''))` → `USING hash (eql_v2.eq_term(col -> ''))`. See [U-007](docs/upgrading/v2.3.md#u-007-typed-arrow-selector).
 
 ### Deprecated
diff --git a/CLAUDE.md b/CLAUDE.md
index d67c31764..9d4c009d0 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -17,10 +17,9 @@ This project uses `mise` for task management. Common commands:
 - `mise run docs:generate` - Generate API documentation (requires doxygen)
   - Outputs XML (primary) and HTML (preview) formats
   - XML suitable for downstream processing/website integration
-  - See `docs/api/README.md` for XML format details
+  - Output is written to `docs/api/` (generated, gitignored)
 - `mise run docs:generate:markdown` - Convert XML to Markdown API reference
-  - Generates single-file API reference: `docs/api/markdown/API.md`
-  - Includes 84 documented functions with parameters, return values, and source links
+  - Generates single-file API reference: `docs/api/markdown/API.md` (all documented functions with parameters, return values, and source links)
 - `mise run docs:validate` - Validate documentation coverage and tags
 - `mise run docs:package` - Package XML docs for distribution (~230KB archive)
 
@@ -46,16 +45,10 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search
 
 ### Core Structure
 - **Schema**: EQL ships two PostgreSQL schemas. `eql_v3` is the public API: the encrypted-domain type families (`integer`, `smallint`, `bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, `double`), query operators, index extractors (`eq_term`/`ord_term`/`match_term`), `min`/`max` aggregates, `version()`, `lints()`, **and the operator-backing comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`, plus the jsonb containment helpers `jsonb_contains`/`jsonb_contained_by`/`jsonb_array`/`ste_vec_contains`). The wrappers are public because they are the function-form equivalent of every supported operator — platforms without operator support (Supabase/PostgREST invoke functions, not operators) call them by name (gated by `tests/sqlx/tests/v3_operator_equivalents_tests.rs`). `eql_v3_internal` holds INTERNAL objects only: the searchable-encrypted-metadata (SEM) index-term **types** (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`, `eql_v3_internal.bloom_filter`, `eql_v3_internal.ore_cllw`, hand-written under `src/v3/sem/`) and their support/constructor/comparator functions, the generated **blockers** (which only raise on unsupported ops), the **aggregate state functions**, and the SteVec CHECK validators. Splitting the index-term TYPES into `eql_v3_internal` keeps the Supabase Studio Table Builder type picker (which lists every type in every non-hidden schema) free of index-term-only types. **Design decision: EQL never grants permissions automatically — the installer issues no `GRANT`/`REVOKE`; access to either schema is strictly opt-in (see `docs/reference/permissions.md`).** Together the two schemas are **self-contained** and install into a database with no other EQL schema present. The earlier `eql_v2` schema (composite `eql_v2_encrypted` column type, database-side configuration management, operator-class-on-column indexing) was **removed in 3.0.0** — see the `[Unreleased]`/3.0.0 entry in `CHANGELOG.md`. `eql_v2` is no longer built or shipped; it survives only in fork-provenance comments under `src/v3/` (the v3 SEM types were forked from the old v2 originals) and in historical records (`CHANGELOG.md`, the v2.x upgrade guides).
-- **Main Type**: `eql_v2_encrypted` - composite type for encrypted columns (stored as JSONB)
-- **Configuration**: `eql_v2_configuration` table tracks encryption configs
-- **Index Types**: Various encrypted index types (blake3, hmac_256, bloom_filter, ore variants)
 
 ### Directory Structure
-- `src/` - Modular SQL components with dependency management
-- `src/encrypted/` - Core encrypted column type implementation
-- `src/operators/` - SQL operators for encrypted data comparisons
-- `src/config/` - Configuration management functions
-- `src/blake3/`, `src/hmac_256/`, `src/bloom_filter/`, `src/ore_*` - Index implementations
+- `src/` - contains only the self-contained `v3` surface (the modular `eql_v2` component directories were removed in 3.0.0)
+- `crates/` - Rust workspace: `eql-domains` (the catalog), `eql-codegen` (SQL/bindings generator), `eql-bindings` (payload bindings), `eql-tests-macros`
 - `src/v3/` - Self-contained `eql_v3` / `eql_v3_internal` surface: `src/v3/schema.sql` (creates both schemas), forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_256`) — now created in `eql_v3_internal` — the generated scalar encrypted-domain families under `src/v3/scalars//` (public domains/extractors **and the supported comparison wrappers** in `eql_v3`; only the blockers and aggregate state functions in `eql_v3_internal`; plus the shared blocker `src/v3/scalars/functions.sql`), and the hand-written encrypted-JSONB (SteVec) surface under `src/v3/jsonb/` (`types.sql`, `functions.sql`, `operators.sql`, `aggregates.sql`, `blockers.sql` — the `eql_v3.json` / `eql_v3.jsonb_entry` / `eql_v3.jsonb_query` domains, their typed operators, the `jsonb_entry` comparison wrappers, the containment engine (`ste_vec_contains`), and the raw-jsonb GIN helpers (`jsonb_array` / `jsonb_contains` / `jsonb_contained_by`) are all public in `eql_v3`; only the SteVec CHECK validators, the `is_ste_vec_array` helper, and the aggregate state functions live in `eql_v3_internal`)
 - `tasks/` - mise task scripts
 - `tests/sqlx/` - Rust/SQLx test framework (PostgreSQL 14-17 support)
@@ -64,9 +57,9 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search
 ### Key Concepts
 - **Dependency System**: SQL files declare dependencies via `-- REQUIRE:` comments
 - **Encrypted Data**: Stored as JSONB payloads with metadata
-- **Index Terms**: Transient types for search operations (blake3, hmac_256, etc.)
+- **Index Terms**: SEM index-term types in `eql_v3_internal` (`hmac_256`, `ore_block_256`, `bloom_filter`, `ore_cllw`)
 - **Operators**: Support comparisons between encrypted and plain JSONB data
-- **CipherStash Proxy**: Required for encryption/decryption operations
+- **Encryption client**: CipherStash Stack or CipherStash Proxy is required for encryption/decryption operations
 
 ### Encrypted-Domain Types
 
@@ -94,7 +87,6 @@ Footguns the spec exists to prevent:
 - Tests run against PostgreSQL 14, 15, 16, 17 using Docker containers
 - Use `mise run test --postgres 14|15|16|17` to test against a specific version
 - Container configuration in `tests/docker-compose.yml`
-- SQL test fixtures and helpers in `tests/test_helpers.sql`
 - Database connection: `localhost:7432` (cipherstash/password)
 
 #### Tests run against real encrypted data (hard requirement)
@@ -114,15 +106,6 @@ cipherstash-client: `mise run test:sqlx:prep` runs `fixture:generate:all` (the
   now generated through the same `FixtureSpec` machinery (`tests/sqlx/src/fixtures/v3_ste_vec.rs`)
   and gitignored/regenerated like every scalar fixture — it is not a committed blob to copy.
 
-## Project Learning & Retrospectives
-
-Valuable lessons and insights from completed work:
-
-- **SQLx Test Migration (2025-10-24)**: See `docs/retrospectives/2025-10-24-sqlx-migration-retrospective.md`
-  - Migrated 40 SQL assertions to Rust/SQLx (100% coverage)
-  - Key insights: Blake3 vs HMAC differences, batch-review pattern effectiveness, coverage metric definitions
-  - Lessons: TDD catches setup issues, infrastructure investment pays off, code review after each batch prevents compound errors
-
 ## Documentation Standards
 
 ### Doxygen Comments
@@ -146,32 +129,21 @@ All SQL functions and types must be documented using Doxygen-style comments:
 ### Documentation Example
 
 ```sql
---! @brief Create encrypted index configuration
---!
---! Initializes a new encrypted index configuration for a table column.
---! The configuration tracks encryption settings and index types.
+--! @brief Convert JSONB hex array to bytea array
+--! @internal
 --!
---! @param p_table_name text Table name (schema-qualified)
---! @param p_column_name text Column name to encrypt
---! @param p_index_type text Type of encrypted index (blake3, hmac_256, etc.)
+--! Converts a JSONB array of hex-encoded strings into a PostgreSQL bytea array.
+--! Used for deserializing binary data (like ORE terms) from JSONB storage.
 --!
---! @return uuid Configuration ID for the created index
+--! @param val jsonb JSONB array of hex-encoded strings
+--! @return bytea[] Array of decoded binary values
 --!
---! @throws unique_violation If configuration already exists for this column
---!
---! @note This function executes DDL and modifies database schema
---! @see eql_v2.activate_encrypted_index
---!
---! @example
---! -- Create blake3 index configuration
---! SELECT eql_v2.create_encrypted_index(
---!   'public.users',
---!   'email',
---!   'blake3'
---! );
-CREATE FUNCTION eql_v2.create_encrypted_index(...)
+--! @note Returns NULL if input is JSON null
+CREATE FUNCTION ...
 ```
 
+(Adapted from a real block in `src/v3/common.sql` — use existing `src/v3` files as the reference for style.)
+
 ### Validation Tools
 
 Verify documentation quality:
@@ -197,8 +169,8 @@ The documentation is generated in **XML format** as the primary output:
 - **Location**: `docs/api/xml/`
 - **Format**: Doxygen XML (v1.15.0) with XSD schemas
 - **Usage**: Machine-readable, suitable for downstream processing
-- **Publishing**: Package with `mise run docs:package` → creates `eql-docs-xml-2.x.tar.gz`
-- **Integration**: See `docs/api/README.md` for XML structure and transformation examples
+- **Publishing**: Package with `mise run docs:package` → creates `eql-docs-xml-.tar.gz`
+- **Integration**: XML output ships with XSD schemas for downstream transformation
 
 HTML output is also generated in `docs/api/html/` for local preview only.
 
@@ -223,7 +195,7 @@ Prefer `LANGUAGE SQL` over `LANGUAGE plpgsql` unless you need procedural feature
 **Why SQL wins for simple functions:**
 
 1. **Inlining** - PostgreSQL can inline simple SQL functions into the calling query, eliminating function call overhead entirely. PL/pgSQL functions are never inlined.
-2. **Index context** - Functions used in index expressions (e.g., `CREATE INDEX ... USING GIN (eql_v2.jsonb_array(col))`) are called on every row insertion/update. Inlining matters.
+2. **Index context** - Functions used in index expressions (e.g., `CREATE INDEX ... USING GIN (eql_v3.jsonb_array(col))`) are called on every row insertion/update. Inlining matters.
 3. **Simple logic** - A CASE expression is a single statement. PL/pgSQL's procedural features aren't needed.
 
 **When PL/pgSQL is appropriate:**
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..3ec2a2f7a
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,133 @@
+
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+  and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+  community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or advances of
+  any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email address,
+  without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official email address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+support@cipherstash.com.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
\ No newline at end of file
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index d9dc4f41c..e822a0dff 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -50,7 +50,7 @@ database with nothing else present.
 > composite encrypted column type, database-side configuration management, and
 > operator-class-on-column indexing. That surface was **removed in 3.0.0**; the
 > repo now builds and ships only `eql_v3`, and the encryption client
-> (CipherStash Proxy / Protect.js) owns the configuration model the database-side
+> (CipherStash Proxy / CipherStash Stack) owns the configuration model the database-side
 > `eql_v2` functions previously provided. You will still see `eql_v2` named in
 > fork-provenance comments under `src/v3/` (the v3 SEM types were forked from the
 > old v2 originals) and in historical records (`CHANGELOG.md`, the v2.x upgrade
diff --git a/README.md b/README.md
index 5f68fae7d..1946a7fb3 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Encrypt Query Language (EQL) is a set of abstractions for transmitting, storing,
 
 > [!TIP]
 > **New to EQL?**
-> EQL is the basis for searchable encryption functionality when using [Protect.js](https://github.com/cipherstash/protectjs) and/or [CipherStash Proxy](https://github.com/cipherstash/proxy).
+> EQL is the basis for searchable encryption functionality when using [CipherStash Stack](https://github.com/cipherstash/stack) and/or [CipherStash Proxy](https://github.com/cipherstash/proxy).
 
 Store encrypted data alongside your existing data:
 
@@ -45,7 +45,7 @@ docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=postgres \
   ghcr.io/cipherstash/postgres-eql:17
 ```
 
-EQL is installed automatically on first boot. Pin a specific version with `:17-2.1.8`. Other PostgreSQL majors are available as `:14`, `:15`, `:16`. See [`docker/README.md`](./docker/README.md) for the full tag scheme and details.
+EQL is installed automatically on first boot. Pin a specific version with `:17-` (see [releases](https://github.com/cipherstash/encrypt-query-language/releases) for available versions). Other PostgreSQL majors are available as `:14`, `:15`, `:16`. See [`docker/README.md`](./docker/README.md) for the full tag scheme and details.
 
 ### Install into an existing database
 
@@ -80,7 +80,7 @@ EQL installs the following components into the `eql_v3` schema:
 
 The `eql_v3` schema holds the encrypted-domain types, their operators and term extractors, and the `MIN` / `MAX` aggregates.
 
-Encrypted columns are typed as `eql_v3` domains (e.g. `eql_v3.text_eq`, `eql_v3.json`), and the searchable surface available on a column is fixed by its domain **variant** — there is no database-side configuration state. Which index terms a value carries is decided by the encryption client (Protect.js / CipherStash Proxy).
+Encrypted columns are typed as `eql_v3` domains (e.g. `eql_v3.text_eq`, `eql_v3.json`), and the searchable surface available on a column is fixed by its domain **variant** — there is no database-side configuration state. Which index terms a value carries is decided by the encryption client (CipherStash Stack / CipherStash Proxy).
 
 Because the domain types live in the `eql_v3` schema, columns depend on them; `DROP SCHEMA eql_v3 CASCADE` removes the surface (and would drop columns typed as those domains). Re-running the install script is idempotent.
 
@@ -183,14 +183,14 @@ CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)
 See the [SQL support matrix](docs/reference/sql-support.md) for every variant and [Database Indexes](docs/reference/database-indexes.md) for the index recipes.
 
 > [!NOTE]
-> You must use [CipherStash Proxy](https://github.com/cipherstash/proxy) or [Protect.js](https://github.com/cipherstash/protectjs) to encrypt and decrypt data. EQL provides the database functions and types, while these tools handle the actual cryptographic operations.
+> You must use [CipherStash Proxy](https://github.com/cipherstash/proxy) or [CipherStash Stack](https://github.com/cipherstash/stack) to encrypt and decrypt data. EQL provides the database functions and types, while these tools handle the actual cryptographic operations.
 
 ## Encrypt configuration
 
 In order to enable searchable encryption, you will need to configure your CipherStash integration appropriately.
 
 - If you are using [CipherStash Proxy](https://github.com/cipherstash/proxy), see [this guide](docs/tutorials/proxy-configuration.md).
-- If you are using [Protect.js](https://github.com/cipherstash/protectjs), use the [Protect.js schema](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md).
+- If you are using [CipherStash Stack](https://github.com/cipherstash/stack), use the [CipherStash Stack schema](https://cipherstash.com/docs/stack/cipherstash/encryption/schema).
 
 ## Performance
 
@@ -251,7 +251,7 @@ All SQL functions, types, and operators include:
 - **@throws** - Exception conditions
 - **@note** - Important notes and caveats
 
-For contribution guidelines, see [CLAUDE.md](./CLAUDE.md).
+For contribution guidelines, see the [development guide](./DEVELOPMENT.md).
 
 ### Validation Tools
 
@@ -275,7 +275,7 @@ These frameworks use EQL to enable searchable encryption functionality in Postgr
 
 | Framework   | Repo                                       |
 | ----------- | ------------------------------------------ |
-| Protect.js  | [Protect.js](https://github.com/cipherstash/protectjs) |
+| CipherStash Stack  | [CipherStash Stack](https://github.com/cipherstash/stack) |
 | Protect.php | [Protect.php](https://github.com/cipherstash/protectphp) |
 | CipherStash Proxy | [CipherStash Proxy](https://github.com/cipherstash/proxy) |
 
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..fa33d9950
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,75 @@
+# Security Policy
+
+CipherStash takes the security of our software, infrastructure, and customers extremely seriously.
+This document describes the security posture and reporting process for this repository.
+
+## Supported Versions
+
+EQL is distributed as a versioned SQL install bundle (`cipherstash-encrypt.sql`) attached to [GitHub releases](https://github.com/cipherstash/encrypt-query-language/releases), as the `ghcr.io/cipherstash/postgres-eql` Docker image, and via [dbdev](https://database.dev/cipherstash/eql).
+
+**Security fixes are released for the latest release line.** Security reports are welcome for any version, but fixes land in the latest release — if you are running an older version, plan to upgrade to receive them.
+
+Note that EQL itself performs no encryption or decryption: cryptographic operations are performed by the encryption client ([CipherStash Stack](https://github.com/cipherstash/stack), [CipherStash Proxy](https://github.com/cipherstash/proxy)). Vulnerabilities in those components are also in scope for the reporting process below — we will route them to the right team.
+
+## Reporting a Vulnerability
+
+If you believe you have found a security vulnerability in any CipherStash code, service, or dependency:
+
+📧 **Please email: `security@cipherstash.com`**
+
+We request that you **do not publicly disclose** the issue before we have had a chance to investigate and provide a fix.
+
+When reporting, please include (as applicable):
+
+- Description of the vulnerability
+- Steps to reproduce
+- Impact assessment or potential misuse
+- Any relevant logs, PoCs, or screenshots
+- Suggested remediation (if you have one)
+
+We will acknowledge receipt within **48 hours** and provide regular updates until the issue is resolved.
+
+## Disclosure & Response Policy
+
+CipherStash follows a **coordinated responsible disclosure** process:
+
+1. **Submit report** privately via `security@cipherstash.com`.
+2. **Acknowledgement** within 48 hours.
+3. **Assessment** of severity using CVSS and internal risk models.
+4. **Fix development** and patch release in a private branch.
+5. **Coordinated disclosure**, including:
+   - New patch release(s)
+   - Security advisory on GitHub
+   - Credit to reporter (optional)
+
+We will never take legal action against good-faith security researchers who follow this policy.
+
+## Scope
+
+The following are **in scope**:
+
+- The `cipherstash/encrypt-query-language` GitHub repository
+- Released SQL install bundles and the `postgres-eql` Docker image recipe
+- EQL's encrypted index-term handling, operators, and type machinery
+- Documentation or code examples that could lead to insecure usage
+- CipherStash's internal infrastructure
+- CipherStash Stack, Proxy, ZeroKMS, or other CipherStash products
+
+The following are **out of scope**:
+
+- Social engineering, physical attacks, or denial-of-service
+- Attacks requiring privileged access to developer machines or CI/CD infrastructure
+
+## Questions?
+
+For general questions about CipherStash security practices (not security incidents), contact:
+
+📧 **support@cipherstash.com**
+
+For vulnerability disclosures:
+
+📧 **security@cipherstash.com**
+
+---
+
+Thank you for helping keep the CipherStash ecosystem secure.
diff --git a/SUPABASE.md b/SUPABASE.md
index 1d5f9e183..7713ab33c 100644
--- a/SUPABASE.md
+++ b/SUPABASE.md
@@ -58,7 +58,7 @@ for the full recipes, GIN containment, and large-table build guidance.
 gone. The searchable surface of a column is fixed by the **domain variant you
 type it as**, and which index terms travel in a value's payload is decided by
 the encryption client — [CipherStash Proxy](https://github.com/cipherstash/proxy)
-or [Protect.js](https://github.com/cipherstash/protectjs):
+or [CipherStash Stack](https://github.com/cipherstash/stack):
 
 - `eql_v3._eq` carries an `hm` term — supports `=` / `<>`, `GROUP BY`, `DISTINCT`.
 - `eql_v3._ord` (and the `_ord_ore` twin) carries an `ob` term — adds `<` `<=` `>` `>=`, `ORDER BY`, `MIN` / `MAX`.
@@ -68,7 +68,7 @@ or [Protect.js](https://github.com/cipherstash/protectjs):
 Configuring those columns is a client-side concern. See:
 
 - [CipherStash Proxy configuration tutorial](./docs/tutorials/proxy-configuration.md)
-- [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md)
+- [CipherStash Stack schema reference](https://cipherstash.com/docs/stack/cipherstash/encryption/schema)
 
 ## Operators on Supabase
 
diff --git a/dbdev/README.md b/dbdev/README.md
deleted file mode 120000
index 32d46ee88..000000000
--- a/dbdev/README.md
+++ /dev/null
@@ -1 +0,0 @@
-../README.md
\ No newline at end of file
diff --git a/dbdev/README.md b/dbdev/README.md
new file mode 100644
index 000000000..7565aff78
--- /dev/null
+++ b/dbdev/README.md
@@ -0,0 +1,14 @@
+# EQL — Encrypt Query Language
+
+Index and search encrypted data in PostgreSQL with SQL.
+
+EQL provides the database-side types, operators, and index machinery for CipherStash searchable encryption. Encryption and decryption are performed by an encryption client — [CipherStash Stack](https://github.com/cipherstash/stack) or [CipherStash Proxy](https://github.com/cipherstash/proxy) — while EQL makes the resulting ciphertext queryable (equality, ordering, text search, JSONB containment) without decrypting it.
+
+> **Note:** The version published to dbdev may lag the [GitHub releases](https://github.com/cipherstash/encrypt-query-language/releases). For the latest version, install the SQL bundle directly from a GitHub release.
+
+## Links
+
+- [Full documentation and installation guide](https://github.com/cipherstash/encrypt-query-language#readme)
+- [Releases](https://github.com/cipherstash/encrypt-query-language/releases)
+- [Issues](https://github.com/cipherstash/encrypt-query-language/issues)
+- [CipherStash documentation](https://cipherstash.com/docs)
diff --git a/docker/README.md b/docker/README.md
index bf570ee30..7e8c4231d 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -33,7 +33,7 @@ Examples:
 
 ```sh
 docker pull ghcr.io/cipherstash/postgres-eql:latest
-docker pull ghcr.io/cipherstash/postgres-eql:17-2.1.8
+docker pull ghcr.io/cipherstash/postgres-eql:17-  # pin a specific EQL release
 docker pull ghcr.io/cipherstash/postgres-eql:14
 ```
 
@@ -57,11 +57,11 @@ The numeric prefix (`10-`) leaves room for users to drop their own `00-*.sql` fi
 From the repo root:
 
 ```sh
-mise run build --version 2.1.8
+mise run build --version 
 cp release/cipherstash-encrypt.sql docker/
 docker build \
   --build-arg PG_VERSION=17 \
-  --build-arg EQL_VERSION=2.1.8 \
+  --build-arg EQL_VERSION= \
   -t postgres-eql:dev \
   docker/
 ```
@@ -69,4 +69,4 @@ docker build \
 ## See also
 
 - [Main EQL README](../README.md) — usage, configuration, and SQL API
-- [CipherStash Proxy](https://github.com/cipherstash/proxy) and [Protect.js](https://github.com/cipherstash/protectjs) — the clients that actually encrypt and decrypt data
+- [CipherStash Proxy](https://github.com/cipherstash/proxy) and [CipherStash Stack](https://github.com/cipherstash/stack) — the clients that actually encrypt and decrypt data
diff --git a/docs/README.md b/docs/README.md
index db983d217..7dccd6340 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -15,7 +15,7 @@ This directory contains the documentation for the Encrypt Query Language (EQL).
 - [Adding a Scalar Encrypted-Domain Type](reference/adding-a-scalar-encrypted-domain-type.md) - How the `eql_v3.` domain families are generated
 - [EQL with JSON and JSONB](reference/json-support.md)
 - [EQL payload / wire format](../crates/eql-bindings/README.md) - Canonical wire types for the encrypted payload (envelope `v`/`i`/`c` and the `hm`/`ob`/`bf` index terms)
-- [Client-side index configuration](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md) - Configuring searchable encryption in Protect.js / CipherStash Proxy
+- [Client-side index configuration](https://cipherstash.com/docs/stack/cipherstash/encryption/schema) - Configuring searchable encryption in CipherStash Stack / CipherStash Proxy
 
 ## Tutorials
 
diff --git a/docs/concepts/WHY.md b/docs/concepts/WHY.md
index 12afcff56..f27311e9e 100644
--- a/docs/concepts/WHY.md
+++ b/docs/concepts/WHY.md
@@ -9,7 +9,7 @@ This page gives a high-level overview of CipherStash's encryption in use solutio
    - [Why use encryption in use?](#why-use-encryption-in-use)
 2. [CipherStash Proxy](#cipherstash-proxy)
    - [How it works](#how-it-works)
-3. [Protect.js](#protectjs)
+3. [CipherStash Stack](#cipherstash-stack)
    - [How it works](#how-it-works-1)
 4. [Encrypt Query Language (EQL)](#encrypt-query-language-eql)
 5. [Best practices](#best-practices)
@@ -53,15 +53,15 @@ This enables encryption in use without significant changes to your application c
 - **Decrypts data**: For read operations, it decrypts the encrypted data retrieved from the database before returning it to the client.
 - **Maintains searchability**: Ensures that the encrypted data is searchable and retrievable without sacrificing performance or application functionality.
 
-## Protect.js
+## CipherStash Stack
 
-Protect.js is an NPM package that provides a set of functions to encrypt and decrypt data.
+CipherStash Stack ([`@cipherstash/stack`](https://github.com/cipherstash/stack)) is an npm package that provides a set of functions to encrypt and decrypt data.
 It is a client-side library that can be used to encrypt and decrypt data in your JS/TS application.
 
 ### How it works
 
-- **Encrypts data**: Protect.js encrypts the plaintext data before sending it to the database.
-- **Decrypts data**: Protect.js decrypts the encrypted data retrieved from the database before returning it to the client.
+- **Encrypts data**: CipherStash Stack encrypts the plaintext data before sending it to the database.
+- **Decrypts data**: CipherStash Stack decrypts the encrypted data retrieved from the database before returning it to the client.
 - **Maintains searchability**: Ensures that the encrypted data is searchable and retrievable without sacrificing performance or application functionality.
 
 ## Encrypt Query Language (EQL)
@@ -80,7 +80,7 @@ EQL allows you to perform queries on encrypted data without decrypting it, suppo
 
 Use one of the CipherStash integrations using EQL to get started.
 
-- [Protect.js](https://github.com/cipherstash/protectjs)
+- [CipherStash Stack](https://github.com/cipherstash/stack)
 - [CipherStash Proxy](https://github.com/cipherstash/proxy)
 - [Protect.php](https://github.com/cipherstash/protectphp)
 
diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md
index b3f736f4c..46a56cfc3 100644
--- a/docs/reference/eql-functions.md
+++ b/docs/reference/eql-functions.md
@@ -2,7 +2,7 @@
 
 A reference for the functions and operators EQL exposes for querying encrypted data in PostgreSQL. The surface lives in the **`eql_v3`** schema and is organised around the per-scalar encrypted-domain types (`eql_v3.` and variants) and the encrypted-JSON document type (`eql_v3.json`).
 
-> **There is no database-side configuration API.** Which index terms a value carries is chosen by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs)); a column's capability is fixed by the **domain variant** you type it as. See [SQL support matrix](./sql-support.md) for the variant/operator table.
+> **There is no database-side configuration API.** Which index terms a value carries is chosen by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [CipherStash Stack](https://github.com/cipherstash/stack)); a column's capability is fixed by the **domain variant** you type it as. See [SQL support matrix](./sql-support.md) for the variant/operator table.
 
 ## Table of Contents
 
@@ -158,7 +158,7 @@ SELECT eql_v3.min(price_jsonb::eql_v3.integer_ord) FROM products;
 - [JSON/JSONB Support](./json-support.md) — `eql_v3.json` worked examples.
 - [SQL support matrix](./sql-support.md) — operators by domain variant.
 - [Payload / wire format](../../crates/eql-bindings/README.md) — canonical encrypted-payload wire types (envelope + index terms).
-- Client-side index configuration — [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md).
+- Client-side index configuration — [CipherStash Stack schema reference](https://cipherstash.com/docs/stack/cipherstash/encryption/schema).
 
 ---
 
diff --git a/docs/reference/json-support.md b/docs/reference/json-support.md
index b0d161150..753bfac4c 100644
--- a/docs/reference/json-support.md
+++ b/docs/reference/json-support.md
@@ -17,7 +17,7 @@ EQL encrypts, decrypts, and searches JSON / JSONB documents using structured enc
 
 ## Storing encrypted JSON
 
-Type the column as `eql_v3.json`. There is no database-side `add_search_config` step — which terms a document carries is decided by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs)); typing the column as `eql_v3.json` is what makes the encrypted operators and functions resolve.
+Type the column as `eql_v3.json`. There is no database-side `add_search_config` step — which terms a document carries is decided by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [CipherStash Stack](https://github.com/cipherstash/stack)); typing the column as `eql_v3.json` is what makes the encrypted operators and functions resolve.
 
 ```sql
 CREATE TABLE users (
@@ -26,7 +26,7 @@ CREATE TABLE users (
 );
 ```
 
-Insert and read through CipherStash Proxy or Protect.js, which encrypt the document into the ste_vec payload on write and decrypt it on read:
+Insert and read through CipherStash Proxy or CipherStash Stack, which encrypt the document into the ste_vec payload on write and decrypt it on read:
 
 ```sql
 SELECT encrypted_json FROM users;   -- decrypted by the client on the way out
@@ -79,7 +79,7 @@ See [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-js
 
 ### Field extraction (`jsonb_path_query`)
 
-Extract fields by **selector hash** — a deterministic identifier the crypto layer emits for a JSON path (not a path string like `$.field`). Selectors are generated during encryption by CipherStash Proxy / Protect.js.
+Extract fields by **selector hash** — a deterministic identifier the crypto layer emits for a JSON path (not a path string like `$.field`). Selectors are generated during encryption by CipherStash Proxy / CipherStash Stack.
 
 ```sql
 -- All entries matching a selector
@@ -200,7 +200,7 @@ Structured Encryption (ste_vec) makes a JSONB document searchable by:
 WHERE encrypted_data @> $1::eql_v3.jsonb_query;
 ```
 
-Encryption and selector generation are handled by CipherStash Proxy or Protect.js, not by EQL directly.
+Encryption and selector generation are handled by CipherStash Proxy or CipherStash Stack, not by EQL directly.
 
 ---
 
diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md
index ef908c8f8..816efb459 100644
--- a/docs/reference/sql-support.md
+++ b/docs/reference/sql-support.md
@@ -7,7 +7,7 @@ EQL ships its searchable-encryption surface as PostgreSQL **domains in the `eql_
 - **per-scalar encrypted-domain types** — `eql_v3.integer`, `eql_v3.text`, `eql_v3.timestamp`, … — one family of domain *variants* per scalar; and
 - **an encrypted-JSON document type** — `eql_v3.json` — for structured-encryption (ste_vec) JSONB.
 
-The capability of a column is fixed by the **domain variant you type it as**. There is no database-side `add_search_config` / `add_column` step: which index terms travel in a value's payload is decided by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs)), and the column's domain variant is what makes the matching operators resolve. Unsupported operators are not silent no-ops — they route to blocker functions that `RAISE` an "operator not supported" exception (a `NULL` operand still raises; the blockers are deliberately not `STRICT`).
+The capability of a column is fixed by the **domain variant you type it as**. There is no database-side `add_search_config` / `add_column` step: which index terms travel in a value's payload is decided by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [CipherStash Stack](https://github.com/cipherstash/stack)), and the column's domain variant is what makes the matching operators resolve. Unsupported operators are not silent no-ops — they route to blocker functions that `RAISE` an "operator not supported" exception (a `NULL` operand still raises; the blockers are deliberately not `STRICT`).
 
 ---
 
@@ -160,7 +160,7 @@ See [EQL with JSON and JSONB](./json-support.md) for worked examples.
 - [EQL Functions Reference](./eql-functions.md) — full list of functions and operators.
 - [Database Indexes for Encrypted Columns](./database-indexes.md) — functional-index and GIN recipes, plus performance guidance.
 - [EQL with JSON and JSONB](./json-support.md) — end-to-end `eql_v3.json` examples.
-- Client-side searchable-encryption configuration — [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md) and [CipherStash Proxy](https://github.com/cipherstash/proxy).
+- Client-side searchable-encryption configuration — [CipherStash Stack schema reference](https://cipherstash.com/docs/stack/cipherstash/encryption/schema) and [CipherStash Proxy](https://github.com/cipherstash/proxy).
 
 ---
 
diff --git a/docs/tutorials/proxy-configuration.md b/docs/tutorials/proxy-configuration.md
index 08e3d3a26..2bca99401 100644
--- a/docs/tutorials/proxy-configuration.md
+++ b/docs/tutorials/proxy-configuration.md
@@ -10,7 +10,7 @@ EQL (the `eql_v3` schema) and the encryption client split responsibilities:
 | --- | --- |
 | Encrypted-column **types** and **operators** (`eql_v3.text_eq`, `eql_v3.json`, `=`, `@>`, …) | **EQL** (this repo) |
 | PostgreSQL **functional indexes** on the term extractors | **EQL** / you |
-| **Which columns are encrypted** and **which index terms** each carries | The **encryption client** — [CipherStash Proxy](https://github.com/cipherstash/proxy) / [Protect.js](https://github.com/cipherstash/protectjs) |
+| **Which columns are encrypted** and **which index terms** each carries | The **encryption client** — [CipherStash Proxy](https://github.com/cipherstash/proxy) / [CipherStash Stack](https://github.com/cipherstash/stack) |
 | Performing **encryption / decryption** on the wire | The encryption client |
 
 > **There is no database-side configuration API in `eql_v3`.** Earlier versions configured searchable encryption with database functions (`add_column`, `add_search_config`). That surface has been removed — configuration now lives entirely in the client. The database's only job is to *store* the encrypted columns (typed as `eql_v3` domains) and *resolve* the encrypted operators.
@@ -18,7 +18,7 @@ EQL (the `eql_v3` schema) and the encryption client split responsibilities:
 ## Prerequisites
 
 - EQL installed into your database (the `eql_v3` surface). See the [README](../../README.md#installation).
-- A running CipherStash Proxy (or a Protect.js client) configured for your workspace.
+- A running CipherStash Proxy (or a CipherStash Stack client) configured for your workspace.
 
 ## 1. Define encrypted columns
 
@@ -44,7 +44,7 @@ The variant fixes the column's searchable surface: `_eq` for `=`, `_ord` for ord
 
 Tell the encryption client which columns to encrypt and which index terms to emit. This is **client-side configuration**, not SQL:
 
-- **Protect.js** — define the columns and indexes in the schema. See the [Protect.js schema reference](https://github.com/cipherstash/protectjs/blob/main/docs/reference/schema.md).
+- **CipherStash Stack** — define the columns and indexes in the schema. See the [CipherStash Stack schema reference](https://cipherstash.com/docs/stack/cipherstash/encryption/schema).
 - **CipherStash Proxy** — configure the encrypted columns in the Proxy's mapping config. See [CipherStash Proxy](https://github.com/cipherstash/proxy).
 
 The terms the client emits (`hm` for equality, `ob` for ordering, `bf` for match, ste_vec for JSON) must match the column's domain variant from step 1 — e.g. configure an equality index for a column typed `eql_v3.text_eq`.
@@ -108,9 +108,9 @@ SELECT encrypted_profile -> 'email_selector'::text FROM users;
 
 ## Frequently asked questions
 
-**Can I use EQL without an encryption client?** No — encryption and decryption are performed by CipherStash Proxy or Protect.js. EQL provides the database-side types, operators, and indexes; the client provides the crypto and the configuration.
+**Can I use EQL without an encryption client?** No — encryption and decryption are performed by CipherStash Proxy or CipherStash Stack. EQL provides the database-side types, operators, and indexes; the client provides the crypto and the configuration.
 
-**How do I choose which columns are searchable, and how?** In the client configuration (Protect.js schema / Proxy mapping), matched to the column's `eql_v3` domain variant. There are no database-side `add_column` / `add_search_config` calls.
+**How do I choose which columns are searchable, and how?** In the client configuration (CipherStash Stack schema / Proxy mapping), matched to the column's `eql_v3` domain variant. There are no database-side `add_column` / `add_search_config` calls.
 
 **Which operators are available on which column?** See the [SQL support matrix](../reference/sql-support.md).
 
diff --git a/docs/upgrading/v2.3.md b/docs/upgrading/v2.3.md
index 284549b00..34b0570a3 100644
--- a/docs/upgrading/v2.3.md
+++ b/docs/upgrading/v2.3.md
@@ -2,6 +2,8 @@
 
 `2.3.0` is a breaking release. **Customers re-encrypt their data as part of the upgrade.** The crypto-side counterpart (`@cipherstash/protect` / `protect-ffi` / proxy) emits a new payload shape for ste_vec elements; EQL 2.3 reads only the new shape.
 
+> **Note:** `@cipherstash/protect` has since been renamed to [`@cipherstash/stack`](https://github.com/cipherstash/stack).
+
 The `eql_v2` schema name, top-level type names, operator names, and the root-level payload structure are unchanged — but the Blake3 (`b3`) family of functions and the `b3` sv-element field are removed, and customer-owned indexes referencing `eql_v2.blake3(col)` must be rebuilt against `eql_v2.eq_term(col -> '')`.
 
 ## TL;DR
@@ -298,5 +300,4 @@ The application-level surface that's hardest to roll back is U-002's "raise inst
 ## See also
 
 - [`CHANGELOG.md`](../../CHANGELOG.md) — full enumeration of changes in 2.3.
-- [Payload scheme discipline RFC](../plans/eql-payload-scheme-discipline-rfc.md) — design context for why the indexing recipe shifted.
 - [Database indexes reference](../reference/database-indexes.md) — canonical recipe for functional indexes.
diff --git a/docs/upgrading/v3.0.md b/docs/upgrading/v3.0.md
index 5e9ffe7c1..7fc67155b 100644
--- a/docs/upgrading/v3.0.md
+++ b/docs/upgrading/v3.0.md
@@ -34,7 +34,7 @@ cipherstash-client that emits `v: 2` cannot insert into `eql_v3` columns after
 this upgrade — the domain `CHECK` rejects the payload at insert/cast time with
 a `check_violation`.
 
-**What to do.** Upgrade the encryption client (Protect.js / protect-ffi /
+**What to do.** Upgrade the encryption client (CipherStash Stack / protect-ffi /
 CipherStash Proxy via cipherstash-client) to a version that emits the v3
 envelope **before** installing EQL 3.0 into a database that receives writes,
 and re-encrypt any stored `eql_v3` payloads that carry `v: 2` (values written

From 098a9c4687fb443167216248996e0f5f4fa207ad Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 18:56:17 +1000
Subject: [PATCH 510/599] ci: refactor alpha release helpers

---
 .github/scripts/derive-identity.sh            |  68 +++++
 .github/scripts/derive-identity.test.sh       |  65 +++++
 .github/scripts/release-alpha-pin-bindings.sh |  37 +++
 .../release-alpha-pin-bindings.test.sh        |  88 +++++++
 .github/scripts/release-alpha-resolve.sh      |  89 +++++++
 .github/scripts/release-alpha-resolve.test.sh | 118 +++++++++
 .github/workflows/lint-release.yml            |  75 ++++++
 .github/workflows/release-alpha.yml           | 248 ++++++++++++++++++
 tasks/release/pin-bindings.sh                 |  15 ++
 tasks/release/resolve-alpha.sh                |  38 +++
 10 files changed, 841 insertions(+)
 create mode 100755 .github/scripts/derive-identity.sh
 create mode 100755 .github/scripts/derive-identity.test.sh
 create mode 100755 .github/scripts/release-alpha-pin-bindings.sh
 create mode 100755 .github/scripts/release-alpha-pin-bindings.test.sh
 create mode 100755 .github/scripts/release-alpha-resolve.sh
 create mode 100755 .github/scripts/release-alpha-resolve.test.sh
 create mode 100644 .github/workflows/lint-release.yml
 create mode 100644 .github/workflows/release-alpha.yml
 create mode 100755 tasks/release/pin-bindings.sh
 create mode 100755 tasks/release/resolve-alpha.sh

diff --git a/.github/scripts/derive-identity.sh b/.github/scripts/derive-identity.sh
new file mode 100755
index 000000000..2b9f8082c
--- /dev/null
+++ b/.github/scripts/derive-identity.sh
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+# Identity derivation for release-alpha.yml. The git seams are overridable by
+# derive-identity.test.sh so this logic can be tested without a repository.
+set -euo pipefail
+
+list_tags() { git tag --list "$1"; }
+
+tag_exists() { git rev-parse -q --verify "refs/tags/$1" >/dev/null; }
+
+highest_n() {
+  local prefix="$1" esc
+  esc="${prefix//./\\.}"
+  list_tags "${prefix}*" \
+    | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" \
+    | sort -n \
+    | tail -1
+}
+
+derive_identity() {
+  local target="$1" version="$2" channel="$3" pre="$4"
+  local sql_prefix="eql-${version}-${channel}."
+  local crate_prefix="eql-bindings-v${version}-${channel}."
+
+  if [[ -n "$pre" ]]; then
+    printf '%s\n' "$pre"
+    return 0
+  fi
+
+  case "$target" in
+    all|eql)
+      local sql_n crate_n n
+      sql_n=$(highest_n "$sql_prefix")
+      sql_n=${sql_n:-0}
+      crate_n=$(highest_n "$crate_prefix")
+      crate_n=${crate_n:-0}
+      if (( sql_n >= crate_n )); then
+        n=$((sql_n + 1))
+      else
+        n=$((crate_n + 1))
+      fi
+      printf '%s\n' "${version}-${channel}.${n}"
+      ;;
+    bindings)
+      local esc found n
+      esc="${sql_prefix//./\\.}"
+      found=""
+      for n in $(list_tags "${sql_prefix}*" | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" | sort -rn); do
+        if ! tag_exists "${crate_prefix}${n}"; then
+          found="$n"
+          break
+        fi
+      done
+      if [[ -z "$found" ]]; then
+        echo "error: no ${sql_prefix}N SQL release is awaiting a crate publish" >&2
+        return 1
+      fi
+      printf '%s\n' "${version}-${channel}.${found}"
+      ;;
+    *)
+      echo "error: unknown target '$target'" >&2
+      return 1
+      ;;
+  esac
+}
+
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+  derive_identity "$@"
+fi
diff --git a/.github/scripts/derive-identity.test.sh b/.github/scripts/derive-identity.test.sh
new file mode 100755
index 000000000..4353ce784
--- /dev/null
+++ b/.github/scripts/derive-identity.test.sh
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash
+# Dependency-free unit test for derive_identity using a synthetic tag set.
+set -uo pipefail
+
+here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+# shellcheck source=/dev/null
+source "${here}/derive-identity.sh"
+
+FAKE_TAGS=()
+# shellcheck disable=SC2329
+list_tags() {
+  local glob="$1" t
+  (( ${#FAKE_TAGS[@]} )) || return 0
+  for t in "${FAKE_TAGS[@]}"; do
+    # shellcheck disable=SC2254
+    case "$t" in $glob) printf '%s\n' "$t" ;; esac
+  done
+}
+
+# shellcheck disable=SC2329
+tag_exists() {
+  local want="$1" t
+  (( ${#FAKE_TAGS[@]} )) || return 1
+  for t in "${FAKE_TAGS[@]}"; do
+    [[ "$t" == "$want" ]] && return 0
+  done
+  return 1
+}
+
+fail=0
+check() {
+  if [[ "$2" == "$3" ]]; then
+    echo "ok: $1"
+  else
+    echo "FAIL: $1 - got '$2' want '$3'"
+    fail=1
+  fi
+}
+
+FAKE_TAGS=()
+check "all: empty -> .1" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.1"
+
+FAKE_TAGS=(eql-3.0.0-alpha.5)
+check "all: sql .5 -> .6" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.6"
+
+FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.4)
+check "all: crate .4 wins (cross-namespace) -> .5" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.5"
+
+FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.4)
+check "bindings: latest sql lacking crate -> .5" "$(derive_identity bindings 3.0.0 alpha '')" "3.0.0-alpha.5"
+
+FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5)
+if derive_identity bindings 3.0.0 alpha '' >/dev/null 2>&1; then
+  echo "FAIL: bindings should error when none awaiting"
+  fail=1
+else
+  echo "ok: bindings errors when none awaiting a crate"
+fi
+
+check "pre passthrough" "$(derive_identity all 3.0.0 alpha 3.0.0-alpha.9)" "3.0.0-alpha.9"
+
+FAKE_TAGS=(eql-3.0.0-beta.7)
+check "all: beta.7 does not affect alpha -> .1" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.1"
+
+exit "$fail"
diff --git a/.github/scripts/release-alpha-pin-bindings.sh b/.github/scripts/release-alpha-pin-bindings.sh
new file mode 100755
index 000000000..d88b32e89
--- /dev/null
+++ b/.github/scripts/release-alpha-pin-bindings.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+# Pin eql-bindings to a prerelease identity, commit the metadata change, and
+# push the selected branch.
+set -euo pipefail
+
+release_alpha_pin_emit_commit_sha() {
+  local commit_sha="$1"
+  echo "commit_sha=${commit_sha}" | tee -a "${GITHUB_OUTPUT:-/dev/null}"
+}
+
+release_alpha_pin_bindings() {
+  local identity="$1" branch="$2"
+  local commit_sha
+  local commit_args=()
+
+  release-plz set-version "eql-bindings@${identity}"
+
+  if git diff --quiet && git diff --cached --quiet; then
+    echo "set-version produced no changes (already pinned to ${identity}); skipping commit/push"
+  else
+    git config user.name "github-actions[bot]"
+    git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+    git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock
+    if [[ "${RELEASE_ALPHA_COMMIT_SIGN:-true}" == "true" ]]; then
+      commit_args=(-S)
+    fi
+    git commit "${commit_args[@]}" -m "chore(release): pin eql-bindings to ${identity}"
+    git push origin "HEAD:${branch}"
+  fi
+
+  commit_sha="$(git rev-parse HEAD)"
+  release_alpha_pin_emit_commit_sha "$commit_sha"
+}
+
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+  release_alpha_pin_bindings "${IDENTITY:?}" "${BRANCH:?}"
+fi
diff --git a/.github/scripts/release-alpha-pin-bindings.test.sh b/.github/scripts/release-alpha-pin-bindings.test.sh
new file mode 100755
index 000000000..f7fa5788e
--- /dev/null
+++ b/.github/scripts/release-alpha-pin-bindings.test.sh
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+# Integration-style tests for release-alpha-pin-bindings.sh in a temp git repo.
+set -uo pipefail
+
+here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+# shellcheck source=/dev/null
+source "${here}/release-alpha-pin-bindings.sh"
+set +e
+
+fail=0
+
+setup_repo() {
+  tmp="$(mktemp -d)"
+  mkdir -p "$tmp/bin" "$tmp/repo/crates/eql-bindings"
+  cat > "$tmp/bin/release-plz" <<'SCRIPT'
+#!/usr/bin/env bash
+set -euo pipefail
+echo "$*" >> "$RELEASE_PLZ_LOG"
+if [[ "${RELEASE_PLZ_TOUCH:-}" == "1" ]]; then
+  printf '[package]\nname = "eql-bindings"\nversion = "%s"\n' "${2#eql-bindings@}" > crates/eql-bindings/Cargo.toml
+fi
+SCRIPT
+  chmod +x "$tmp/bin/release-plz"
+  (
+    cd "$tmp/repo" || exit 1
+    git init -q
+    git config user.email test@example.com
+    git config user.name "Release Test"
+    git config commit.gpgsign false
+    printf '[package]\nname = "eql-bindings"\nversion = "0.0.0"\n' > crates/eql-bindings/Cargo.toml
+    printf '# changelog\n' > crates/eql-bindings/CHANGELOG.md
+    printf '# lock\n' > Cargo.lock
+    git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock
+    git commit -q -m initial
+    git branch -M test-branch
+    git init -q --bare "$tmp/origin.git"
+    git remote add origin "$tmp/origin.git"
+  )
+}
+
+check_noop() {
+  local before after output status
+  setup_repo
+  before="$(cd "$tmp/repo" && git rev-parse HEAD)"
+  output="$(
+    cd "$tmp/repo" || exit 1
+    set -euo pipefail
+    PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" RELEASE_ALPHA_COMMIT_SIGN=false \
+      release_alpha_pin_bindings 3.0.0-alpha.1 test-branch 2>&1
+  )"
+  status=$?
+  after="$(cd "$tmp/repo" && git rev-parse HEAD)"
+  if [[ "$status" -eq 0 && "$before" == "$after" && "$output" == *"commit_sha=${before}"* && "$(cat "$tmp/log")" == "set-version eql-bindings@3.0.0-alpha.1" ]]; then
+    echo "ok: noop emits existing commit"
+  else
+    echo "FAIL: noop status=$status before=$before after=$after output='$output'"
+    fail=1
+  fi
+  rm -rf "$tmp"
+}
+
+check_commit() {
+  local before after subject output status version
+  setup_repo
+  before="$(cd "$tmp/repo" && git rev-parse HEAD)"
+  output="$(
+    cd "$tmp/repo" || exit 1
+    set -euo pipefail
+    PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" RELEASE_PLZ_TOUCH=1 RELEASE_ALPHA_COMMIT_SIGN=false \
+      release_alpha_pin_bindings 3.0.0-alpha.2 test-branch 2>&1
+  )"
+  status=$?
+  after="$(cd "$tmp/repo" && git rev-parse HEAD)"
+  subject="$(cd "$tmp/repo" && git log -1 --format=%s)"
+  version="$(sed -n 's/^version = "\(.*\)"/\1/p' "$tmp/repo/crates/eql-bindings/Cargo.toml")"
+  if [[ "$status" -eq 0 && "$before" != "$after" && "$subject" == "chore(release): pin eql-bindings to 3.0.0-alpha.2" && "$version" == "3.0.0-alpha.2" && "$output" == *"commit_sha=${after}"* ]]; then
+    echo "ok: changed version commits and emits new commit"
+  else
+    echo "FAIL: commit status=$status before=$before after=$after subject='$subject' version='$version' output='$output'"
+    fail=1
+  fi
+  rm -rf "$tmp"
+}
+
+check_noop
+check_commit
+
+exit "$fail"
diff --git a/.github/scripts/release-alpha-resolve.sh b/.github/scripts/release-alpha-resolve.sh
new file mode 100755
index 000000000..051ee785a
--- /dev/null
+++ b/.github/scripts/release-alpha-resolve.sh
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash
+# Resolve and validate release-alpha.yml identity/tag state.
+set -euo pipefail
+
+here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+# shellcheck source=/dev/null
+source "${here}/derive-identity.sh"
+
+git_head_sha() { git rev-parse HEAD; }
+
+tag_commit_sha() { git rev-parse "refs/tags/$1^{commit}"; }
+
+release_alpha_error() {
+  echo "::error::$*" >&2
+}
+
+release_alpha_emit_outputs() {
+  local identity="$1" sql_tag="$2" crate_tag="$3"
+  {
+    echo "identity=${identity}"
+    echo "sql_tag=${sql_tag}"
+    echo "crate_tag=${crate_tag}"
+  } | tee -a "${GITHUB_OUTPUT:-/dev/null}"
+}
+
+release_alpha_resolve() {
+  local target="$1" version="$2" channel="$3" pre="$4" ref_type="$5" ref_name="$6"
+  local identity sql_tag crate_tag head_sha tag_sha
+
+  case "$channel" in
+    alpha|beta|rc) ;;
+    *) release_alpha_error "invalid channel '$channel'"; return 1 ;;
+  esac
+
+  case "$target" in
+    all|eql|bindings) ;;
+    *) release_alpha_error "invalid target '$target'"; return 1 ;;
+  esac
+
+  if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+    release_alpha_error "invalid version '$version' (expected X.Y.Z)"
+    return 1
+  fi
+
+  if [[ -n "$pre" && ! "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]]; then
+    release_alpha_error "invalid pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+    return 1
+  fi
+
+  if [[ "$target" == "all" || "$target" == "bindings" ]]; then
+    if [[ "$ref_type" != "branch" ]]; then
+      release_alpha_error "target=${target} pins+pushes the crate version and requires a branch ref; got ${ref_type} '${ref_name}'. Dispatch with --ref ."
+      return 1
+    fi
+  fi
+
+  identity="$(derive_identity "$target" "$version" "$channel" "$pre")"
+  sql_tag="eql-${identity}"
+  crate_tag="eql-bindings-v${identity}"
+
+  case "$target" in
+    all)
+      if tag_exists "$sql_tag"; then release_alpha_error "${sql_tag} already exists"; return 1; fi
+      if tag_exists "$crate_tag"; then release_alpha_error "${crate_tag} already exists"; return 1; fi
+      ;;
+    eql)
+      if tag_exists "$sql_tag"; then release_alpha_error "${sql_tag} already exists"; return 1; fi
+      ;;
+    bindings)
+      if ! tag_exists "$sql_tag"; then
+        release_alpha_error "${sql_tag} SQL release must exist before publishing the crate"
+        return 1
+      fi
+      if tag_exists "$crate_tag"; then release_alpha_error "${crate_tag} already exists"; return 1; fi
+      head_sha="$(git_head_sha)"
+      tag_sha="$(tag_commit_sha "$sql_tag")"
+      if [[ "$head_sha" != "$tag_sha" ]]; then
+        release_alpha_error "branch HEAD (${head_sha}) has advanced past ${sql_tag} (${tag_sha}); use target=all for a fresh identity"
+        return 1
+      fi
+      ;;
+  esac
+
+  release_alpha_emit_outputs "$identity" "$sql_tag" "$crate_tag"
+}
+
+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
+  release_alpha_resolve "${TARGET:?}" "${VERSION:?}" "${CHANNEL:?}" "${PRE:-}" "${REF_TYPE:?}" "${REF_NAME:?}"
+fi
diff --git a/.github/scripts/release-alpha-resolve.test.sh b/.github/scripts/release-alpha-resolve.test.sh
new file mode 100755
index 000000000..e430b6d0f
--- /dev/null
+++ b/.github/scripts/release-alpha-resolve.test.sh
@@ -0,0 +1,118 @@
+#!/usr/bin/env bash
+# Dependency-free unit tests for release-alpha-resolve.sh using synthetic tags
+# and commit ids.
+set -uo pipefail
+
+here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+# shellcheck source=/dev/null
+source "${here}/release-alpha-resolve.sh"
+set +e
+
+FAKE_TAGS=()
+FAKE_HEAD_SHA="head"
+FAKE_TAG_SHA="head"
+
+# shellcheck disable=SC2329
+list_tags() {
+  local glob="$1" t
+  (( ${#FAKE_TAGS[@]} )) || return 0
+  for t in "${FAKE_TAGS[@]}"; do
+    # shellcheck disable=SC2254
+    case "$t" in $glob) printf '%s\n' "$t" ;; esac
+  done
+}
+
+# shellcheck disable=SC2329
+tag_exists() {
+  local want="$1" t
+  (( ${#FAKE_TAGS[@]} )) || return 1
+  for t in "${FAKE_TAGS[@]}"; do
+    [[ "$t" == "$want" ]] && return 0
+  done
+  return 1
+}
+
+# shellcheck disable=SC2329
+git_head_sha() { printf '%s\n' "$FAKE_HEAD_SHA"; }
+
+# shellcheck disable=SC2329
+tag_commit_sha() { printf '%s\n' "$FAKE_TAG_SHA"; }
+
+fail=0
+
+check_ok() {
+  local name="$1" want="$2" got status
+  shift 2
+  got="$("$@" 2>/tmp/release-alpha-resolve-test.err)"
+  status=$?
+  if [[ "$status" -eq 0 && "$got" == "$want" ]]; then
+    echo "ok: $name"
+  else
+    echo "FAIL: $name - status=$status got '$got' want '$want'"
+    cat /tmp/release-alpha-resolve-test.err
+    fail=1
+  fi
+}
+
+check_fail() {
+  local name="$1" needle="$2" got status
+  shift 2
+  got="$("$@" 2>&1)"
+  status=$?
+  if [[ "$status" -ne 0 && "$got" == *"$needle"* ]]; then
+    echo "ok: $name"
+  else
+    echo "FAIL: $name - status=$status output '$got' missing '$needle'"
+    fail=1
+  fi
+}
+
+FAKE_TAGS=()
+check_ok "all emits derived identity and tags" \
+  $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\ncrate_tag=eql-bindings-v3.0.0-alpha.1' \
+  release_alpha_resolve all 3.0.0 alpha "" branch eql_v3
+
+check_fail "rejects invalid target" "invalid target 'bad'" \
+  release_alpha_resolve bad 3.0.0 alpha "" branch eql_v3
+
+check_fail "rejects invalid channel" "invalid channel 'preview'" \
+  release_alpha_resolve all 3.0.0 preview "" branch eql_v3
+
+check_fail "rejects invalid version" "invalid version '3.0'" \
+  release_alpha_resolve all 3.0 alpha "" branch eql_v3
+
+check_fail "rejects invalid pre" "invalid pre '3.0.0-alpha'" \
+  release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha branch eql_v3
+
+check_fail "all requires branch ref" "requires a branch ref" \
+  release_alpha_resolve all 3.0.0 alpha "" tag v3.0.0
+
+FAKE_TAGS=(eql-3.0.0-alpha.2)
+check_fail "all rejects existing sql tag with explicit pre" "eql-3.0.0-alpha.2 already exists" \
+  release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
+
+FAKE_TAGS=(eql-bindings-v3.0.0-alpha.2)
+check_fail "all rejects existing crate tag with explicit pre" "eql-bindings-v3.0.0-alpha.2 already exists" \
+  release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
+
+FAKE_TAGS=()
+check_fail "bindings rejects missing sql tag" "SQL release must exist before publishing the crate" \
+  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
+
+FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.2)
+check_fail "bindings rejects existing crate tag" "eql-bindings-v3.0.0-alpha.2 already exists" \
+  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
+
+FAKE_TAGS=(eql-3.0.0-alpha.2)
+FAKE_HEAD_SHA="newer"
+FAKE_TAG_SHA="released"
+check_fail "bindings rejects advanced branch" "branch HEAD (newer) has advanced past eql-3.0.0-alpha.2 (released)" \
+  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
+
+FAKE_HEAD_SHA="released"
+FAKE_TAG_SHA="released"
+check_ok "bindings accepts same-source sql tag" \
+  $'identity=3.0.0-alpha.2\nsql_tag=eql-3.0.0-alpha.2\ncrate_tag=eql-bindings-v3.0.0-alpha.2' \
+  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
+
+exit "$fail"
diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml
new file mode 100644
index 000000000..72658a0a6
--- /dev/null
+++ b/.github/workflows/lint-release.yml
@@ -0,0 +1,75 @@
+name: "Lint release tooling"
+
+# Durable gate for the CI-native release machinery. It catches workflow syntax,
+# wrapper shell issues, and identity-derivation regressions before a real alpha.
+
+on:
+  pull_request:
+    paths:
+      - .github/workflows/_build-sql.yml
+      - .github/workflows/_build-docs.yml
+      - .github/workflows/release-eql.yml
+      - .github/workflows/release-plz.yml
+      - .github/workflows/release-alpha.yml
+      - .github/workflows/lint-release.yml
+      - .github/actionlint.yaml
+      - .github/scripts/*.sh
+      - tasks/release/*.sh
+  workflow_dispatch: {}
+
+permissions:
+  contents: read
+
+defaults:
+  run:
+    shell: bash
+
+jobs:
+  lint:
+    name: actionlint + shellcheck + unit test
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    timeout-minutes: 10
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Install actionlint
+        run: |
+          set -euo pipefail
+          bash <(curl -sSfL https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
+          echo "$PWD" >> "$GITHUB_PATH"
+
+      - name: actionlint (release workflows)
+        run: |
+          set -euo pipefail
+          actionlint \
+            .github/workflows/_build-sql.yml \
+            .github/workflows/_build-docs.yml \
+            .github/workflows/release-eql.yml \
+            .github/workflows/release-plz.yml \
+            .github/workflows/release-alpha.yml \
+            .github/workflows/lint-release.yml
+
+      - name: shellcheck (wrappers + helpers)
+        run: |
+          set -euo pipefail
+          shellcheck \
+            tasks/release/all.sh \
+            tasks/release/eql.sh \
+            tasks/release/bindings.sh \
+            tasks/release/resolve-alpha.sh \
+            tasks/release/pin-bindings.sh \
+            .github/scripts/derive-identity.sh \
+            .github/scripts/derive-identity.test.sh \
+            .github/scripts/release-alpha-resolve.sh \
+            .github/scripts/release-alpha-resolve.test.sh \
+            .github/scripts/release-alpha-pin-bindings.sh \
+            .github/scripts/release-alpha-pin-bindings.test.sh
+
+      - name: identity-derivation unit test
+        run: bash .github/scripts/derive-identity.test.sh
+
+      - name: release-alpha resolve unit test
+        run: bash .github/scripts/release-alpha-resolve.test.sh
+
+      - name: release-alpha pin helper test
+        run: bash .github/scripts/release-alpha-pin-bindings.test.sh
diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml
new file mode 100644
index 000000000..fb4cf6eb7
--- /dev/null
+++ b/.github/workflows/release-alpha.yml
@@ -0,0 +1,248 @@
+name: "Release alpha (coordinator)"
+
+# CI-native prerelease coordinator for the EQL SQL surface and eql-bindings
+# crate. SQL and docs build in this run; crate publishing is dispatched to
+# release-plz.yml so crates.io Trusted Publishing sees the expected workflow.
+
+on:
+  workflow_dispatch:
+    inputs:
+      target:
+        description: "all | eql | bindings"
+        required: true
+        type: choice
+        options: [all, eql, bindings]
+        default: all
+      version:
+        description: "Base SemVer, e.g. 3.0.0"
+        required: false
+        type: string
+        default: "3.0.0"
+      channel:
+        description: "alpha | beta | rc"
+        required: false
+        type: choice
+        options: [alpha, beta, rc]
+        default: alpha
+      pre:
+        description: "Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation"
+        required: false
+        type: string
+        default: ""
+      dry_run:
+        description: "Resolve + verify + print plan; mutate nothing"
+        required: false
+        type: boolean
+        default: false
+      dispatch_id:
+        description: "Client-generated correlation id. Leave blank for manual dispatch."
+        required: false
+        type: string
+        default: ""
+
+run-name: >-
+  release-alpha ${{ inputs.target }} ${{ inputs.pre != '' && inputs.pre || format('{0}-{1}', inputs.version, inputs.channel) }}${{ inputs.dry_run && ' [dry-run]' || '' }} [${{ inputs.dispatch_id }}]
+
+permissions:
+  contents: write
+  actions: write
+
+concurrency:
+  group: release-alpha
+  cancel-in-progress: false
+
+env:
+  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
+  MISE_VERBOSE: "1"
+
+defaults:
+  run:
+    shell: bash {0}
+
+jobs:
+  resolve:
+    name: Resolve identity + verify
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    timeout-minutes: 15
+    outputs:
+      identity: ${{ steps.derive.outputs.identity }}
+      sql_tag: ${{ steps.derive.outputs.sql_tag }}
+      crate_tag: ${{ steps.derive.outputs.crate_tag }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+
+      - name: Fetch all tags
+        run: git fetch --tags --force
+
+      - name: Resolve identity + guards
+        id: derive
+        env:
+          TARGET: ${{ inputs.target }}
+          VERSION: ${{ inputs.version }}
+          CHANNEL: ${{ inputs.channel }}
+          PRE: ${{ inputs.pre }}
+          REF_TYPE: ${{ github.ref_type }}
+          REF_NAME: ${{ github.ref_name }}
+        run: .github/scripts/release-alpha-resolve.sh
+
+      - uses: jdx/mise-action@v3
+        with:
+          version: 2026.4.0
+          install: true
+          cache: true
+
+      - name: Verify drift gates (types:check + codegen:parity)
+        run: |
+          set -euo pipefail
+          mise run types:check
+          mise run codegen:parity
+
+      - name: Print plan
+        env:
+          TARGET: ${{ inputs.target }}
+          DRY: ${{ inputs.dry_run }}
+        run: |
+          set -euo pipefail
+          {
+            echo "## Release plan"
+            echo ""
+            echo "| field | value |"
+            echo "|---|---|"
+            echo "| target | ${TARGET} |"
+            echo "| identity | ${{ steps.derive.outputs.identity }} |"
+            echo "| sql_tag | ${{ steps.derive.outputs.sql_tag }} |"
+            echo "| crate_tag | ${{ steps.derive.outputs.crate_tag }} |"
+            echo "| ref | ${{ github.ref_name }} @ ${{ github.sha }} |"
+            echo "| dry_run | ${DRY} |"
+          } >> "$GITHUB_STEP_SUMMARY"
+
+  pin:
+    name: Pin crate version (commit S)
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    needs: resolve
+    if: ${{ !inputs.dry_run && (inputs.target == 'all' || inputs.target == 'bindings') }}
+    timeout-minutes: 15
+    outputs:
+      commit_sha: ${{ steps.commit.outputs.commit_sha }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: ${{ github.ref_name }}
+          fetch-depth: 0
+
+      - name: Import GPG key
+        uses: crazy-max/ghaction-import-gpg@v7
+        with:
+          gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
+          git_user_signingkey: true
+          git_commit_gpgsign: true
+
+      - uses: jdx/mise-action@v3
+        with:
+          version: 2026.4.0
+          install: true
+          cache: true
+
+      - name: Install release-plz CLI
+        run: cargo binstall --no-confirm release-plz
+
+      - name: Pin + commit + push (commit S)
+        id: commit
+        env:
+          IDENTITY: ${{ needs.resolve.outputs.identity }}
+          BRANCH: ${{ github.ref_name }}
+        run: .github/scripts/release-alpha-pin-bindings.sh
+
+  build-sql:
+    name: Build + release SQL (in-run)
+    needs: [resolve, pin]
+    if: >-
+      ${{ !cancelled() && !inputs.dry_run
+          && (inputs.target == 'all' || inputs.target == 'eql')
+          && needs.resolve.result == 'success'
+          && (needs.pin.result == 'success' || needs.pin.result == 'skipped') }}
+    permissions:
+      contents: write
+    secrets: inherit
+    uses: ./.github/workflows/_build-sql.yml
+    with:
+      ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || '' }}
+      tag: ${{ needs.resolve.outputs.sql_tag }}
+      attach: true
+      target_commitish: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }}
+      prerelease: true
+
+  build-docs:
+    name: Build + attach docs (in-run)
+    needs: [resolve, pin, build-sql]
+    if: >-
+      ${{ !cancelled() && !inputs.dry_run
+          && (inputs.target == 'all' || inputs.target == 'eql')
+          && needs.build-sql.result == 'success' }}
+    permissions:
+      contents: write
+    uses: ./.github/workflows/_build-docs.yml
+    with:
+      ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }}
+      tag: ${{ needs.resolve.outputs.sql_tag }}
+
+  crate-publish:
+    name: Dispatch crate publish (release-plz.yml)
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    needs: [resolve, pin, build-sql, build-docs]
+    if: >-
+      ${{ !cancelled() && !inputs.dry_run
+          && (inputs.target == 'all' || inputs.target == 'bindings')
+          && needs.pin.result == 'success'
+          && (needs.build-sql.result == 'success' || needs.build-sql.result == 'skipped')
+          && (needs.build-docs.result == 'success' || needs.build-docs.result == 'skipped') }}
+    timeout-minutes: 10
+    steps:
+      - name: Dispatch release-plz.yml against the pinned commit
+        env:
+          GH_TOKEN: ${{ github.token }}
+          SQL_TAG: ${{ needs.resolve.outputs.sql_tag }}
+          BRANCH: ${{ github.ref_name }}
+          TARGET: ${{ inputs.target }}
+        run: |
+          set -euo pipefail
+          if [[ "$TARGET" == "all" ]]; then
+            ref="$SQL_TAG"
+          else
+            ref="$BRANCH"
+          fi
+          echo "Dispatching release-plz.yml --ref ${ref}"
+          gh workflow run release-plz.yml --ref "$ref"
+          {
+            echo "## Crate publish dispatched"
+            echo ""
+            echo "Dispatched \`release-plz.yml\` against \`${ref}\`."
+            echo "Watch it separately: it runs as its own entry point."
+          } >> "$GITHUB_STEP_SUMMARY"
+
+  summary:
+    name: Summary
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    needs: [resolve, pin, build-sql, build-docs, crate-publish]
+    if: always()
+    steps:
+      - name: Emit run summary
+        env:
+          TARGET: ${{ inputs.target }}
+          DRY: ${{ inputs.dry_run }}
+        run: |
+          set -euo pipefail
+          {
+            echo "## release-alpha result"
+            echo ""
+            echo "- target: \`${TARGET}\` (dry_run=${DRY})"
+            echo "- identity: \`${{ needs.resolve.outputs.identity }}\`"
+            echo "- sql_tag: \`${{ needs.resolve.outputs.sql_tag }}\`"
+            echo "- crate_tag: \`${{ needs.resolve.outputs.crate_tag }}\`"
+            echo "- resolve: ${{ needs.resolve.result }} | pin: ${{ needs.pin.result }} | build-sql: ${{ needs.build-sql.result }} | build-docs: ${{ needs.build-docs.result }} | crate-publish: ${{ needs.crate-publish.result }}"
+            echo ""
+            echo "Coordinator run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
+            echo "The crate publish, if dispatched, runs as a separate release-plz.yml run."
+          } >> "$GITHUB_STEP_SUMMARY"
diff --git a/tasks/release/pin-bindings.sh b/tasks/release/pin-bindings.sh
new file mode 100755
index 000000000..1cb90f82e
--- /dev/null
+++ b/tasks/release/pin-bindings.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+#MISE description="CI-oriented helper: pin eql-bindings to an identity, commit, and push"
+#USAGE flag "--identity " help="Exact prerelease identity, e.g. 3.0.0-alpha.2"
+#USAGE flag "--branch " help="Branch to push the pin commit to"
+
+set -euo pipefail
+
+root="$(git rev-parse --show-toplevel)"
+identity="${usage_identity:-}"
+branch="${usage_branch:-}"
+
+[[ -n "$identity" ]] || { echo "error: --identity is required" >&2; exit 1; }
+[[ -n "$branch" ]] || { echo "error: --branch is required" >&2; exit 1; }
+
+IDENTITY="$identity" BRANCH="$branch" "${root}/.github/scripts/release-alpha-pin-bindings.sh"
diff --git a/tasks/release/resolve-alpha.sh b/tasks/release/resolve-alpha.sh
new file mode 100755
index 000000000..4ef209a70
--- /dev/null
+++ b/tasks/release/resolve-alpha.sh
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+#MISE description="Resolve and validate release-alpha.yml identity/tag guards locally"
+#USAGE flag "--target " help="Release target: all | eql | bindings" default="all"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref-type " help="GitHub ref type: branch | tag" default=""
+#USAGE flag "--ref-name " help="GitHub ref name" default=""
+
+set -euo pipefail
+
+root="$(git rev-parse --show-toplevel)"
+target="${usage_target:-all}"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref_type="${usage_ref_type:-}"
+ref_name="${usage_ref_name:-}"
+
+if [[ -z "$ref_name" ]]; then
+  ref_name="$(git rev-parse --abbrev-ref HEAD)"
+fi
+
+if [[ -z "$ref_type" ]]; then
+  if [[ "$ref_name" == "HEAD" ]]; then
+    ref_type="tag"
+  else
+    ref_type="branch"
+  fi
+fi
+
+TARGET="$target" \
+VERSION="$version" \
+CHANNEL="$channel" \
+PRE="$pre" \
+REF_TYPE="$ref_type" \
+REF_NAME="$ref_name" \
+  "${root}/.github/scripts/release-alpha-resolve.sh"

From 6f731ea6eede88b03801d84f3c5bb116d12dc31a Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 18:59:13 +1000
Subject: [PATCH 511/599] ci(release): wire alpha release tasks to reusable
 builds

---
 .github/actionlint.yaml                |   4 +
 .github/workflows/_build-docs.yml      |  83 +++++++
 .github/workflows/_build-sql.yml       | 110 +++++++++
 .github/workflows/release-eql.yml      | 108 ++-------
 .github/workflows/release-plz.yml      |   3 +
 CLAUDE.md                              |   6 +-
 docs/development/releasing-an-alpha.md | 294 +++++++++++--------------
 tasks/release/all.sh                   |  63 ++++++
 tasks/release/bindings.sh              |  60 +++++
 tasks/release/eql.sh                   |  58 +++++
 tasks/release/preview.sh               |  95 --------
 11 files changed, 526 insertions(+), 358 deletions(-)
 create mode 100644 .github/actionlint.yaml
 create mode 100644 .github/workflows/_build-docs.yml
 create mode 100644 .github/workflows/_build-sql.yml
 create mode 100755 tasks/release/all.sh
 create mode 100755 tasks/release/bindings.sh
 create mode 100755 tasks/release/eql.sh
 delete mode 100755 tasks/release/preview.sh

diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml
new file mode 100644
index 000000000..b6a2e7da2
--- /dev/null
+++ b/.github/actionlint.yaml
@@ -0,0 +1,4 @@
+# actionlint does not know repo-specific / provider-specific runner labels.
+self-hosted-runner:
+  labels:
+    - blacksmith-16vcpu-ubuntu-2204
diff --git a/.github/workflows/_build-docs.yml b/.github/workflows/_build-docs.yml
new file mode 100644
index 000000000..62bf93e42
--- /dev/null
+++ b/.github/workflows/_build-docs.yml
@@ -0,0 +1,83 @@
+name: "Build docs (reusable)"
+
+# Reusable docs build+attach, extracted from release-eql.yml's publish-docs job.
+# The target release already exists: _build-sql.yml creates it for alphas, and
+# a human-created release exists for finals.
+
+on:
+  workflow_call:
+    inputs:
+      ref:
+        description: "Git ref/SHA to build docs from. Empty -> default checkout (github.sha)."
+        required: false
+        type: string
+        default: ""
+      tag:
+        description: "Full release tag. Empty -> build only, no attach."
+        required: false
+        type: string
+        default: ""
+
+env:
+  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
+  MISE_VERBOSE: "1"
+
+defaults:
+  run:
+    shell: bash {0}
+
+permissions:
+  contents: write
+
+jobs:
+  publish-docs:
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    name: Build and Publish Documentation
+    timeout-minutes: 10
+
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: ${{ inputs.ref }}
+
+      - uses: jdx/mise-action@v3
+        with:
+          version: 2026.4.0
+          install: true
+          cache: true
+
+      - name: Install Doxygen
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y doxygen
+
+      - name: Generate documentation
+        env:
+          TAG: ${{ inputs.tag }}
+        run: |
+          set -euo pipefail
+          mise run docs:generate
+          mise run docs:generate:markdown -- "${TAG}"
+
+      - name: Package documentation
+        env:
+          TAG: ${{ inputs.tag }}
+        run: |
+          mise run docs:package "${TAG}"
+
+      - name: Upload documentation artifacts
+        uses: actions/upload-artifact@v4
+        with:
+          name: eql-docs
+          path: |
+            release/eql-docs-*.zip
+            release/eql-docs-*.tar.gz
+
+      - name: Publish documentation to release
+        if: ${{ inputs.tag != '' }}
+        uses: softprops/action-gh-release@v2
+        with:
+          tag_name: ${{ inputs.tag }}
+          files: |
+            release/eql-docs-*.zip
+            release/eql-docs-*.tar.gz
diff --git a/.github/workflows/_build-sql.yml b/.github/workflows/_build-sql.yml
new file mode 100644
index 000000000..58ff1274f
--- /dev/null
+++ b/.github/workflows/_build-sql.yml
@@ -0,0 +1,110 @@
+name: "Build SQL (reusable)"
+
+# Reusable SQL build+attach, extracted from release-eql.yml's build-and-publish
+# job. Called inline by release-alpha.yml and release-eql.yml so SQL releases
+# have one build path.
+
+on:
+  workflow_call:
+    inputs:
+      ref:
+        description: "Git ref/SHA to build from. Empty -> default checkout (github.sha)."
+        required: false
+        type: string
+        default: ""
+      tag:
+        description: "Full release tag (e.g. eql-3.0.0-alpha.2). Empty -> DEV build, no attach."
+        required: false
+        type: string
+        default: ""
+      attach:
+        description: "Attach the built .sql artefacts to a GitHub Release."
+        required: false
+        type: boolean
+        default: false
+      target_commitish:
+        description: "Non-empty -> create a prerelease at this commit; empty -> attach to the existing release named by tag."
+        required: false
+        type: string
+        default: ""
+      prerelease:
+        description: "Mark the created release as a prerelease (create path only)."
+        required: false
+        type: boolean
+        default: false
+
+env:
+  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
+  MISE_VERBOSE: "1"
+
+defaults:
+  run:
+    shell: bash {0}
+
+permissions:
+  contents: write
+
+jobs:
+  build:
+    runs-on: blacksmith-16vcpu-ubuntu-2204
+    name: Build EQL
+    timeout-minutes: 5
+
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: ${{ inputs.ref }}
+
+      - uses: jdx/mise-action@v3
+        with:
+          version: 2026.4.0
+          install: true
+          cache: true
+
+      - name: Build EQL release
+        # Strip `eql-` so eql_v3.version() reports bare semver. Empty TAG
+        # intentionally falls through build.sh's ${usage_version:-DEV} default.
+        env:
+          TAG: ${{ inputs.tag }}
+        run: |
+          mise run build --version "${TAG#eql-}"
+
+      - name: Upload EQL artifacts
+        uses: actions/upload-artifact@v4
+        with:
+          name: eql-release
+          path: |
+            release/cipherstash-encrypt.sql
+            release/cipherstash-encrypt-uninstall.sql
+
+      - name: Attach artefacts to existing release
+        if: ${{ inputs.attach && inputs.target_commitish == '' }}
+        uses: softprops/action-gh-release@v2
+        with:
+          tag_name: ${{ inputs.tag }}
+          files: |
+            release/cipherstash-encrypt.sql
+            release/cipherstash-encrypt-uninstall.sql
+
+      - name: Create prerelease at commit
+        if: ${{ inputs.attach && inputs.target_commitish != '' }}
+        uses: softprops/action-gh-release@v2
+        with:
+          tag_name: ${{ inputs.tag }}
+          target_commitish: ${{ inputs.target_commitish }}
+          prerelease: ${{ inputs.prerelease }}
+          name: ${{ inputs.tag }}
+          body: "Preview (prerelease) of the standalone eql_v3 surface. See [Unreleased] in CHANGELOG.md."
+          files: |
+            release/cipherstash-encrypt.sql
+            release/cipherstash-encrypt-uninstall.sql
+
+      - name: Notify Multitudes
+        if: ${{ github.event_name == 'release' }}
+        run: |
+          curl --request POST \
+            --fail-with-body \
+            --url "https://api.developer.multitudes.co/deployments" \
+            --header "Content-Type: application/json" \
+            --header "Authorization: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}" \
+            --data '{"commitSha": "${{ github.sha }}", "environmentName":"production"}'
diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml
index b5e238829..d589364ef 100644
--- a/.github/workflows/release-eql.yml
+++ b/.github/workflows/release-eql.yml
@@ -51,105 +51,29 @@ jobs:
           echo "Found '## [${version}]' section in CHANGELOG.md."
 
   build-and-publish:
-    runs-on: blacksmith-16vcpu-ubuntu-2204
     name: Build EQL
     # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags
     # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases.
     if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
-    timeout-minutes: 5
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - uses: jdx/mise-action@v3
-        with:
-          version: 2026.4.0 # [default: latest] mise version to install
-          install: true # [default: true] run `mise install`
-          cache: true # [default: true] cache mise using GitHub's cache
-
-      - name: Build EQL release
-        # Strip the `eql-` tag prefix so eql_v3.version() reports bare semver
-        # (e.g. "3.0.0"). Non-release events (workflow_dispatch / PR) have no
-        # tag, so TAG is empty and the build falls back to its DEV default.
-        env:
-          TAG: ${{ github.event.release.tag_name }}
-        run: |
-          mise run build --version "${TAG#eql-}"
-
-      - name: Upload EQL artifacts
-        uses: actions/upload-artifact@v4
-        with:
-          name: eql-release
-          path: |
-            release/cipherstash-encrypt.sql
-            release/cipherstash-encrypt-uninstall.sql
-
-      - name: Publish EQL release artifacts
-        uses: softprops/action-gh-release@v2
-        if: startsWith(github.ref, 'refs/tags/')
-        with:
-          files: |
-            release/cipherstash-encrypt.sql
-            release/cipherstash-encrypt-uninstall.sql
-
-      - name: Notify Multitudes
-        if: github.event_name == 'release'
-        run: |
-          curl --request POST \
-            --fail-with-body \
-            --url "https://api.developer.multitudes.co/deployments" \
-            --header "Content-Type: application/json" \
-            --header "Authorization: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}" \
-            --data '{"commitSha": "${{ github.sha }}", "environmentName":"production"}'
+    permissions:
+      contents: write
+    secrets: inherit
+    uses: ./.github/workflows/_build-sql.yml
+    with:
+      ref: ""
+      tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }}
+      attach: ${{ github.event_name == 'release' && startsWith(github.ref, 'refs/tags/') }}
+      target_commitish: ""
+      prerelease: false
 
   publish-docs:
-    runs-on: blacksmith-16vcpu-ubuntu-2204
     name: Build and Publish Documentation
     # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags
     # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases.
     if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
-    timeout-minutes: 10
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - uses: jdx/mise-action@v3
-        with:
-          version: 2026.4.0 # [default: latest] mise version to install
-          install: true # [default: true] run `mise install`
-          cache: true # [default: true] cache mise using GitHub's cache
-
-      - name: Install Doxygen
-        run: |
-          sudo apt-get update
-          sudo apt-get install -y doxygen
-
-      - name: Generate documentation
-        run: |
-          # Fail fast: the workflow default shell is `bash {0}` (no -e), so
-          # without this a failure in docs:generate would be masked by the
-          # trailing docs:generate:markdown command and only surface later as a
-          # misleading "html not found" in docs:package.
-          set -euo pipefail
-          mise run docs:generate
-          mise run docs:generate:markdown -- ${{ github.event.release.tag_name }}
-
-      - name: Package documentation
-        run: |
-          mise run docs:package ${{ github.event.release.tag_name }}
-
-      - name: Upload documentation artifacts
-        uses: actions/upload-artifact@v4
-        with:
-          name: eql-docs
-          path: |
-            release/eql-docs-*.zip
-            release/eql-docs-*.tar.gz
-
-      - name: Publish documentation to release
-        uses: softprops/action-gh-release@v2
-        if: startsWith(github.ref, 'refs/tags/')
-        with:
-          files: |
-            release/eql-docs-*.zip
-            release/eql-docs-*.tar.gz
+    permissions:
+      contents: write
+    uses: ./.github/workflows/_build-docs.yml
+    with:
+      ref: ""
+      tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }}
diff --git a/.github/workflows/release-plz.yml b/.github/workflows/release-plz.yml
index 690be9d9d..e6188b7d3 100644
--- a/.github/workflows/release-plz.yml
+++ b/.github/workflows/release-plz.yml
@@ -84,6 +84,9 @@ jobs:
 
   release-pr:
     name: "Release PR"
+    # A coordinator dispatch against a tag or feature branch must publish
+    # without opening a recursive release PR.
+    if: github.ref == 'refs/heads/main'
     runs-on: blacksmith-16vcpu-ubuntu-2204
     needs: release
     steps:
diff --git a/CLAUDE.md b/CLAUDE.md
index c07b5c48e..5582f0649 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -240,10 +240,10 @@ EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style `
 
 **Cutting a release is scripted — don't hand-roll `gh release create`.** There are two paths:
 
-- **Prerelease (alpha / beta / rc):** run `mise run release:preview` (`tasks/release/preview.sh`). It derives the next `eql--.` tag, does a clean build-verify of the v3 installer/uninstaller, and cuts the GitHub prerelease that triggers the release workflow. Use `--dry-run` first; `--target` defaults to the current branch. It deliberately does **not** touch `CHANGELOG.md` (previews keep entries under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
+- **Prerelease (alpha / beta / rc):** run `mise run release:all` (SQL + docs and `eql-bindings` in lockstep), `mise run release:eql` (SQL + docs only), or `mise run release:bindings` (crate for an existing SQL alpha, same source). Each task dispatches the CI-native coordinator `.github/workflows/release-alpha.yml` and watches the run via a unique `dispatch_id`; release-relevant work happens in CI. The coordinator derives the `-.` identity across both tag namespaces, verifies drift gates, and builds/attaches the alpha assets in-run. For `release:all`, it also pins the crate, builds SQL + docs, then dispatches `release-plz.yml` so both tags land on one commit. `release:all` and `release:bindings` require `--ref ` because the pin is pushed. Always use `--dry-run` first. It deliberately does **not** touch `CHANGELOG.md` (prerelease entries stay under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
 - **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]`, which the workflow's `verify-changelog` job enforces.
 
-The **`eql-bindings` crate** (published to crates.io by **release-plz** on merge to `main`, tagged `eql-bindings-v`) is generated from the same `eql-domains::CATALOG` as the SQL surface, so we release it in **version lockstep** with each `eql_v3` alpha (`eql-bindings-v3.0.0-alpha.N` ↔ `eql-3.0.0-alpha.N` on the same commit). This is a manual coordination procedure — the two release paths are otherwise decoupled. See the **"Releasing `eql-bindings` in lockstep"** section of `docs/development/releasing-an-alpha.md`. Note: release-plz publishes the *committed* `Cargo.toml` version verbatim and has no absolute-version config — pin with `release-plz set-version eql-bindings@`, never hand-edit the release PR.
+The **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) is generated from the same `eql-domains::CATALOG` as the SQL surface, so `release:all` releases it in **version lockstep** with each `eql_v3` alpha (`eql-bindings-v3.0.0-alpha.N` ↔ `eql-3.0.0-alpha.N` on the same commit). Use `release:bindings` only to publish the crate for an existing SQL alpha; the coordinator enforces that the branch is still at the SQL tag commit before adding the metadata-only pin commit. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the coordinator pins with `release-plz set-version eql-bindings@`.
 
 ### When you make a user-facing change
 
@@ -288,7 +288,7 @@ The `eql_v3` PostgreSQL schema name is part of the public API and is **independe
 
 ### Cutting a release
 
-This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, use `mise run release:preview` instead — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`.
+This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, use `mise run release:all`, `mise run release:eql`, or `mise run release:bindings` instead — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`.
 
 When a release is being prepared:
 
diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md
index 34e6d5e6c..f98573d35 100644
--- a/docs/development/releasing-an-alpha.md
+++ b/docs/development/releasing-an-alpha.md
@@ -1,207 +1,165 @@
 # Releasing an `eql_v3` alpha
 
-A concise runbook for cutting a **prerelease** (alpha/beta/rc) of EQL — primarily
-the standalone `eql_v3` surface. For a final (non-prerelease) release, follow the
-**"Cutting a release"** section of `CLAUDE.md` instead; the difference is called out below.
+A concise runbook for cutting a **prerelease** (alpha/beta/rc) of the EQL SQL
+surface, the `eql-bindings` crate, or both in lockstep. For a final
+(non-prerelease) release, follow the **"Cutting a release"** section of
+`CLAUDE.md` instead.
 
 ## What ships
 
-The release workflow (`.github/workflows/release-eql.yml`, triggered by `release: published`)
-builds with `mise run build --version ` and attaches these artifacts to the GitHub Release:
+Alpha releases ship the same EQL assets as final releases:
 
 | Artifact | What it installs |
 |----------|------------------|
 | `cipherstash-encrypt.sql` / `cipherstash-encrypt-uninstall.sql` | **The standalone, self-contained `eql_v3` surface** (no `eql_v2`) |
-| `eql-docs-*.zip` / `eql-docs-*.tar.gz` | Packaged API documentation (from the `publish-docs` job) |
+| `eql-docs-*.zip` / `eql-docs-*.tar.gz` | Packaged API documentation |
+
+The CI-native alpha coordinator (`.github/workflows/release-alpha.yml`) builds
+and attaches the SQL files and docs bundle **in the same workflow run**. This is
+intentional: releases created by the automatic `GITHUB_TOKEN` do not trigger
+follow-on release workflows, so alpha assets cannot rely on release-event fan-out.
 
 `cipherstash-encrypt.sql` is the only installer: it installs the `eql_v3`
-schema into a database with no `eql_v2` present. (There is no longer a separate
-`-supabase` or `-v3` artifact — the single installer *is* the self-contained v3 surface.)
+schema into a database with no `eql_v2` present. There is no separate
+`-supabase` or `-v3` artifact.
 
 ## Why a prerelease is different
 
-The `verify-changelog` job is gated to **real (non-prerelease) `eql-*` releases**:
+The final-release `verify-changelog` job is gated to **real (non-prerelease)
+`eql-*` releases**:
 
 ```yaml
 if: ${{ github.event_name == 'release' && contains(github.event.release.tag_name, 'eql') && github.event.release.prerelease == false }}
 ```
 
-So for a prerelease you **do not** promote `[Unreleased]` → `[]` in `CHANGELOG.md`.
-Entries stay under `## [Unreleased]` until a final release is cut. The `build-and-publish`
-and `publish-docs` jobs still run (they only require `eql` in the tag), so the artifacts are
-built and attached as normal.
+For a prerelease, do **not** promote `[Unreleased]` to `[]` in
+`CHANGELOG.md`. Entries stay under `## [Unreleased]` until a final release is
+cut.
+
+## CI-native release tasks
+
+Use one of the thin `mise` tasks. Each task dispatches
+`.github/workflows/release-alpha.yml` via `workflow_dispatch`, passes a unique
+`dispatch_id`, and watches that exact run. Release-relevant work happens in CI,
+not locally.
+
+| Task | Coordinator target | Result |
+|------|--------------------|--------|
+| `mise run release:all` | `all` | Pins `eql-bindings` to the resolved identity, commits and pushes the pin, builds and attaches SQL + docs, then dispatches `release-plz.yml` so the crate publishes from the same commit. |
+| `mise run release:eql` | `eql` | Builds and attaches the SQL prerelease + docs only. No crate publish and no pin commit. |
+| `mise run release:bindings` | `bindings` | Publishes `eql-bindings` for an existing `eql-` SQL release from the same source, with a metadata-only pin commit on top. |
 
-## Scripted path (recommended)
+`release:all` and `release:bindings` require `--ref ` because the
+coordinator pushes the crate-version pin. `release:eql` can run against any ref
+because it does not push.
 
-`mise run release:preview` (`tasks/release/preview.sh`) does steps 1, 3 and 4 below:
-it derives the next preview tag, does a clean build, verifies the v3 installer/uninstaller
-are present and non-empty, then creates the GitHub prerelease (which triggers the workflow).
-It does **not** touch `CHANGELOG.md` — previews keep their entries under `[Unreleased]`.
+Common flags:
+
+| Flag | Meaning | Default |
+|------|---------|---------|
+| `--version` | Base SemVer (`X.Y.Z`) | `3.0.0` |
+| `--channel` | Prerelease channel: `alpha` \| `beta` \| `rc` | `alpha` |
+| `--pre` | Exact identity (`X.Y.Z-(alpha\|beta\|rc).N`), bypassing derivation | derived |
+| `--ref` | GitHub ref for `workflow_dispatch` | current branch |
+| `--dry-run` | Resolve, verify, and print the plan without mutating anything | off |
 
-The tag is `eql--.`. "Preview" is the umbrella; `--channel` picks
-`alpha` → `beta` → `rc` and `` auto-increments per channel:
+Examples:
 
 ```bash
-# Derive the next eql-3.0.0-alpha.N tag, build-verify, and cut against the current branch:
-mise run release:preview
+# Always start here: derive identity and run drift gates without publishing.
+mise run release:all --ref eql_v3 --dry-run
 
-# See what it would do without creating anything:
-mise run release:preview --dry-run
+# Ship SQL + docs and the crate in lockstep.
+mise run release:all --ref eql_v3
 
-# Override the base version / channel / exact tag / target:
-mise run release:preview --version 3.0.0 --channel beta   # -> eql-3.0.0-beta.1
-mise run release:preview --tag eql-3.0.0-rc.1 --target eql_v3
+# Ship only the SQL surface + docs.
+mise run release:eql --channel beta
+
+# Publish the crate for an already-existing SQL alpha, same source.
+mise run release:bindings --pre 3.0.0-alpha.2 --ref eql_v3
 ```
 
-| Flag | Meaning | Default |
-|------|---------|---------|
-| `--version` | base SemVer (the `` in the tag) | `3.0.0` |
-| `--channel` | preview channel: `alpha` \| `beta` \| `rc` | `alpha` |
-| `--tag` | exact tag to cut, bypassing derivation | (derived) |
-| `--target` | branch/commit to tag | current branch |
-| `--dry-run` | print the plan, create nothing | off |
-
-It refuses to reuse an existing tag, requires an authenticated `gh`, and requires the tag to
-start with `eql-` (otherwise the workflow's build/docs jobs are skipped). After it runs, jump
-to **"Confirm the workflow attached the artifacts"** and the smoke test below.
-
-## Steps (manual equivalent)
-
-1. **Pick a tag.** It must contain `eql` so the build/docs jobs run, and use a SemVer
-   prerelease suffix:
-   ```text
-   eql-3.0.0-alpha.1
-   ```
-
-2. **Sanity-check `[Unreleased]`.** Confirm the v3 entries you expect are present and coherent.
-   Do **not** rename the section — the prerelease keeps them under `[Unreleased]`.
-
-3. **Verify the build produces the v3 artifacts locally** (the same files the workflow attaches):
-   ```bash
-   mise run clean && mise run build
-   ls -la release/cipherstash-encrypt.sql release/cipherstash-encrypt-uninstall.sql
-   ```
-   Both must be non-empty (the installer is ~900KB+; the uninstaller is small).
-
-4. **Cut the prerelease.** Target the branch carrying the v3 surface and mark it `--prerelease`:
-   ```bash
-   gh release create eql-3.0.0-alpha.1 \
-     --target eql_v3 \
-     --prerelease \
-     --title "eql-3.0.0-alpha.1" \
-     --notes "Alpha of the standalone eql_v3 surface. See [Unreleased] in CHANGELOG.md."
-   ```
-   (Adjust `--target` to whatever branch/commit the v3 work lives on at release time.)
-
-5. **Confirm the workflow attached the artifacts.** Watch the run and check the release page:
-   ```bash
-   gh run watch
-   gh release view eql-3.0.0-alpha.1
-   ```
-   The release should list the two `.sql` artifacts (`cipherstash-encrypt.sql`
-   and `cipherstash-encrypt-uninstall.sql`) plus the packaged docs bundle.
+## Identity and lockstep
+
+The release identity is `-.`, for example
+`3.0.0-alpha.2`. The coordinator derives `N` server-side from freshly fetched
+tags across both namespaces:
+
+- SQL tags: `eql-`
+- Crate tags: `eql-bindings-v`
+
+For `release:all` and `release:eql`, `N` is one greater than the maximum matching
+counter found in either namespace. For `release:bindings`, the coordinator finds
+an existing SQL alpha that does not yet have a matching crate tag.
+
+`release:all` is the normal lockstep path. The coordinator pins the crate,
+commits that metadata change as commit `S`, builds SQL + docs at `S`, creates
+`eql-` at `S`, and dispatches `release-plz.yml` against that immutable
+SQL tag. The resulting `eql-` and `eql-bindings-v` tags land
+on the same commit.
+
+`release:bindings` is for catching up the crate after an existing SQL alpha. The
+branch must currently point at the SQL tag commit. The coordinator verifies that
+`HEAD == eql-`, adds the metadata-only crate pin commit on top, then
+dispatches `release-plz.yml`. This guarantees the crate ships the same generated
+source as the SQL release, not later product code.
+
+## Coordinator checks
+
+Before mutating anything, the coordinator validates inputs, fetches tags, derives
+the identity, checks target-specific tag existence, and runs the drift gates:
+
+```bash
+mise run types:check
+mise run codegen:parity
+```
+
+For `release:all` and `release:bindings`, it also rejects non-branch refs because
+the crate pin must be pushed. For `release:bindings`, it rejects a branch that has
+advanced past the SQL tag.
+
+The crate publish remains a separate `release-plz.yml` run because crates.io
+Trusted Publishing validates the entry-point workflow identity. The coordinator
+dispatches that workflow only after SQL and docs have been built and attached.
+
+## Verification note
+
+The durable PR gate is `.github/workflows/lint-release.yml`. It runs actionlint
+over the release workflows, ShellCheck over the release wrappers and identity
+helper, and `.github/scripts/derive-identity.test.sh`.
+
+The SQL to docs to crate ordering can be exercised safely only on a scratch
+branch, because a real crate publish is irreversible. For a scratch validation,
+temporarily force the docs reusable to fail, run `mise run release:eql --ref
+` or `mise run release:all --ref `, and confirm
+that no crate publish is dispatched when docs attachment fails. Revert the
+scratch change before any real alpha.
 
 ## Smoke-test the alpha
 
-Install the standalone v3 surface into a clean database (no `eql_v2`) and confirm it loads:
+Install the standalone v3 surface into a clean database (no `eql_v2`) and confirm
+it loads:
 
 ```bash
-gh release download eql-3.0.0-alpha.1 -p 'cipherstash-encrypt.sql'
+gh release download eql-3.0.0-alpha.N -p 'cipherstash-encrypt.sql'
 psql "$DATABASE_URL" -f cipherstash-encrypt.sql
-psql "$DATABASE_URL" -c "\dn eql_v3"            # eql_v3 schema present
-psql "$DATABASE_URL" -c "SELECT eql_v3.version();"  # reports the released semver
+psql "$DATABASE_URL" -c "\dn eql_v3"                 # eql_v3 schema present
+psql "$DATABASE_URL" -c "SELECT eql_v3.version();"   # released semver
 ```
 
-## Releasing `eql-bindings` in lockstep
-
-The `eql-bindings` crate (`crates/eql-bindings`, published to crates.io) and the SQL surface
-ship from the **same generated source**: the crate's `src/v3` payload bindings and the
-`cipherstash-encrypt.sql` installer are both regenerated from `eql-domains::CATALOG`. We release
-them **in version lockstep** so a published `eql-bindings-v3.0.0-alpha.N` always corresponds to
-the SQL surface tagged `eql-3.0.0-alpha.N` at the **same commit**.
-
-This is not automatic — the two release paths are deliberately decoupled (different triggers, tag
-namespaces, and automation; see `release-plz.toml` and the guards in `release-eql.yml`). Lockstep
-is a **manual coordination procedure** you follow per alpha.
-
-### How the crate is published
-
-`eql-bindings` is released by **release-plz** (`.github/workflows/release-plz.yml`), triggered by
-**push to `main`** — *not* by any GitHub Release. release-plz opens/updates a "release PR"; merging
-that PR publishes to crates.io (OIDC trusted publishing), creates the `eql-bindings-v` tag,
-and cuts a GitHub Release. Two facts drive the lockstep procedure:
-
-- **`release-plz release` publishes the committed `Cargo.toml` version verbatim** — it does not bump
-  at release time. So the version you *commit* is the version that ships.
-- **release-plz owns the version in the release PR.** It computes the next bump from conventional
-  commits (via the `next_version` crate). From a prerelease base it increments the prerelease
-  counter by default (`3.0.0-alpha.1` → `3.0.0-alpha.2`); it will **not** strip to `3.0.0` on its
-  own. There is **no config field that sets an absolute version** — you pin with `release-plz set-version`.
-
-### One-time config
-
-None required. The default `git_release_type = auto` already marks a `-alpha.N` version as a
-GitHub *pre-release* (verified in release-plz source), and `publish` / `git_tag_enable` /
-`git_release_enable` all default `true`. Note `release_always` also defaults `true`: the `release`
-job publishes any committed `Cargo.toml` version not yet on crates.io on every push to `main` — the
-release PR is release-plz's ergonomic path for *proposing* the bump, not a hard publish gate.
-
-### The lockstep procedure
-
-The SQL alpha number **N is the driver** (the SQL surface is the primary artefact). The crate
-follows it. crates.io publishes are **irreversible** (a burned version can be yanked but never
-reused), so we verify both sides, cut the reversible GitHub prerelease first, and merge the
-irreversible crate publish last.
-
-1. **Decide N** — the next SQL alpha, e.g. tag `eql-3.0.0-alpha.2`.
-
-2. **Pin the crate version on the release commit** (crate is currently `0.1.0`; lockstep jumps it
-   to the matching semver):
-   ```bash
-   release-plz set-version eql-bindings@3.0.0-alpha.2   # edits Cargo.toml + crate CHANGELOG
-   ```
-   Commit and push to `main`. **Verify the release PR shows `3.0.0-alpha.2`, not a recomputed
-   value** — if a later push regenerated it (e.g. to `-alpha.3`), re-run `set-version` on `main` to
-   reconverge. Do **not** rely on hand-editing the PR branch; a subsequent push can overwrite it.
-
-3. **Confirm the generated surface is in sync on that commit** — this is what guarantees the
-   published crate's `src/v3` matches the shipped `cipherstash-encrypt.sql`:
-   ```bash
-   mise run types:check        # regenerate + git diff of crates/eql-bindings/src/v3, bindings/, schema/
-   mise run codegen:parity     # regenerate + git diff of the committed SQL scalar surface
-   ```
-   Both must be clean. (They run in CI too, but check here before publishing anything irreversible.)
-
-4. **Cut the SQL prerelease** at that commit (reversible — a GitHub prerelease can be deleted).
-   Use an explicit `--tag` so the number matches the crate exactly:
-   ```bash
-   mise run release:preview --tag eql-3.0.0-alpha.2 --target 
-   ```
-   This clean-builds and verifies the v3 installer/uninstaller before creating the prerelease.
-
-5. **Merge the release-plz PR** (irreversible — publishes `eql-bindings-v3.0.0-alpha.2` to
-   crates.io, tags it, cuts its prerelease GitHub Release).
-
-Both tags — `eql-3.0.0-alpha.2` and `eql-bindings-v3.0.0-alpha.2` — now sit on one commit with
-matching semver.
-
-### Caveats
-
-- **No absolute-version config knob.** Pinning is only via `release-plz set-version` / the committed
-  `Cargo.toml`. `release-plz.toml` has increment-*influencing* fields but nothing that sets a version.
-- **No prerelease-increment strategy config.** The default from `-alpha.N` is `-alpha.(N+1)`. To jump
-  to stable `3.0.0`, run `set-version eql-bindings@3.0.0` explicitly — don't rely on the default.
-- **The release PR keeps regenerating** on every `main` push. Pin on `main` (step 2), don't hand-edit
-  the PR branch — whether a PR-branch edit survives a regeneration is undocumented.
-- **release-plz is idempotent** — re-running won't republish an already-published version, so a
-  failed later step won't double-publish an `-alpha.N` that already went out.
-- There is **no upstream precedent** for alpha-pinning in cipherstash-suite's `RELEASING.md`; this
-  procedure extends its standard conventional-commit flow.
+For a lockstep release, also confirm both tags point at the same commit:
+
+```bash
+git fetch --tags
+git rev-list -n1 eql-3.0.0-alpha.N
+git rev-list -n1 eql-bindings-v3.0.0-alpha.N
+```
 
 ## Promoting to a final release later
 
-When the alpha graduates to a real release, follow `CLAUDE.md` → **"Cutting a release"**:
-rename `## [Unreleased]` to `## [] — YYYY-MM-DD`, add a fresh empty `[Unreleased]`,
-update the link references at the bottom of `CHANGELOG.md`, then cut a **non-prerelease**
-GitHub release whose body is the new versioned section verbatim. The `verify-changelog`
-job then enforces that the `## []` section exists at the tag.
+When the alpha graduates to a real release, follow `CLAUDE.md` -> **"Cutting a
+release"**: rename `## [Unreleased]` to `## [] - YYYY-MM-DD`, add a
+fresh empty `[Unreleased]`, update the link references at the bottom of
+`CHANGELOG.md`, then cut a **non-prerelease** GitHub release whose body is the
+new versioned section verbatim. The `verify-changelog` job then enforces that
+the `## []` section exists at the tag.
diff --git a/tasks/release/all.sh b/tasks/release/all.sh
new file mode 100755
index 000000000..75d9ffd62
--- /dev/null
+++ b/tasks/release/all.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+#MISE description="Cut an alpha of BOTH artefacts in lockstep: dispatch release-alpha.yml (target=all) and watch the run"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git branch to dispatch against (the crate pin is pushed here)" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+# Thin trigger: nothing release-relevant runs locally. It dispatches the
+# CI-native coordinator (.github/workflows/release-alpha.yml) with target=all and
+# watches THAT run. Same-commit lockstep + all safety live in CI.
+
+target="all"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+# --- Validate (mirrors the coordinator's resolve guards) ---------------------
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+# target=all pins+pushes the crate version, so require an explicit branch.
+if [[ -z "$ref" ]]; then
+  err "missing --ref  (target=all pushes the crate pin to that branch)"
+fi
+
+# Unique correlation id echoed into the coordinator's run-name so we watch the
+# EXACT run we started.
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
+
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
+
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
+
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Coordinator finished. For target=all, the crate publish runs as a SEPARATE release-plz.yml run - watch it in the Actions tab."
diff --git a/tasks/release/bindings.sh b/tasks/release/bindings.sh
new file mode 100755
index 000000000..371f9da3d
--- /dev/null
+++ b/tasks/release/bindings.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+#MISE description="Publish the eql-bindings crate for an EXISTING SQL alpha (same-source, +1 metadata commit): dispatch release-alpha.yml (target=bindings) and watch"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git branch to dispatch against (must currently be AT the eql- commit)" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+# target=bindings publishes the crate SAME-SOURCE from an existing eql-
+# SQL release: the branch must currently be AT that release's commit (the
+# coordinator guards branch-HEAD == SQL-tag-commit), and the pin adds a
+# metadata-only commit on top. Requires a BRANCH (the pin is pushed).
+
+target="bindings"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+if [[ -z "$ref" ]]; then
+  err "missing --ref  (target=bindings pushes the crate pin to that branch)"
+fi
+
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
+
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
+
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
+
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Coordinator finished. The crate publish runs as a SEPARATE release-plz.yml run - watch it in the Actions tab."
diff --git a/tasks/release/eql.sh b/tasks/release/eql.sh
new file mode 100755
index 000000000..6aa18cd44
--- /dev/null
+++ b/tasks/release/eql.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+#MISE description="Cut an alpha of the SQL surface + docs only: dispatch release-alpha.yml (target=eql) and watch the run"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git ref (branch or tag) to dispatch against" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+target="eql"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+# target=eql does not push, so any ref works; only reject the unusable "HEAD"
+# default from a detached checkout.
+if [[ -z "$ref" ]]; then
+  ref="$(git rev-parse --abbrev-ref HEAD)"
+  [[ "$ref" != "HEAD" ]] || err "detached HEAD; pass --ref "
+fi
+
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
+
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
+
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
+
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Done. SQL prerelease + docs cut; no crate published (target=eql)."
diff --git a/tasks/release/preview.sh b/tasks/release/preview.sh
deleted file mode 100755
index b2f5bd84e..000000000
--- a/tasks/release/preview.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="Cut a preview (prerelease) of EQL: derive tag, verify build, create GitHub prerelease"
-#USAGE flag "--version " help="Base SemVer for the release, e.g. 3.0.0" default="3.0.0"
-#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
-#USAGE flag "--tag " help="Exact tag to cut (overrides --version/--channel derivation)" default=""
-#USAGE flag "--target " help="Branch or commit to tag" default=""
-#USAGE flag "--dry-run" help="Print what would happen without creating the release"
-
-set -euo pipefail
-
-# Cut a PREVIEW (prerelease) of EQL — alpha, beta, or rc — primarily the
-# standalone eql_v3 surface. "Preview" is the umbrella; --channel picks alpha/beta/rc.
-#
-# This scripts steps 1, 3 and 4 of docs/development/releasing-an-alpha.md:
-#   - derive the next preview tag (eql--.)
-#   - verify the build produces the v3 installer/uninstaller
-#   - create the GitHub prerelease (which triggers .github/workflows/release-eql.yml)
-#
-# It deliberately does NOT touch CHANGELOG.md: previews keep their entries
-# under [Unreleased] (the verify-changelog job is gated to prerelease == false).
-
-# mise exposes USAGE flags as environment variables; default for bare `bash`.
-version="${usage_version:-3.0.0}"
-channel="${usage_channel:-alpha}"
-tag="${usage_tag:-}"
-target="${usage_target:-}"
-dry_run="${usage_dry_run:-false}"
-
-err() { echo "error: $*" >&2; exit 1; }
-
-# Validate the channel against the allowlist before it flows into tag/notes.
-case "$channel" in
-  alpha|beta|rc) ;;
-  *) err "invalid --channel '${channel}' (expected: alpha | beta | rc)" ;;
-esac
-
-command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
-gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
-
-# --- Derive the tag --------------------------------------------------------
-# If an exact --tag was given, use it. Otherwise find the highest existing
-# eql--. tag and increment N (starting at 1).
-if [[ -z "$tag" ]]; then
-  prefix="eql-${version}-${channel}."
-  # Highest existing N for this base+channel, or 0 if none.
-  last_n=$(git tag --list "${prefix}*" \
-    | sed -n "s/^${prefix}\([0-9]\{1,\}\)$/\1/p" \
-    | sort -n | tail -1)
-  next_n=$(( ${last_n:-0} + 1 ))
-  tag="${prefix}${next_n}"
-fi
-
-[[ "$tag" == eql-* ]] || err "tag must start with 'eql-' (got '$tag') or the build/docs jobs won't run"
-
-if git rev-parse -q --verify "refs/tags/${tag}" >/dev/null; then
-  err "tag '${tag}' already exists"
-fi
-
-# Default the release target to the current branch.
-if [[ -z "$target" ]]; then
-  target=$(git rev-parse --abbrev-ref HEAD)
-fi
-
-# --- Verify the build produces the v3 artifacts ----------------------------
-echo "==> Building (clean) to verify v3 artifacts for ${tag}"
-mise run clean
-mise run build --version "${tag}"
-
-v3_installer="release/cipherstash-encrypt.sql"
-v3_uninstaller="release/cipherstash-encrypt-uninstall.sql"
-for f in "$v3_installer" "$v3_uninstaller"; do
-  [[ -s "$f" ]] || err "expected non-empty build artifact missing: $f"
-done
-echo "==> v3 artifacts present:"
-ls -la "$v3_installer" "$v3_uninstaller"
-
-# --- Create the prerelease -------------------------------------------------
-notes="Preview (${channel}) of the standalone eql_v3 surface. See [Unreleased] in CHANGELOG.md."
-
-if [[ "$dry_run" == "true" ]]; then
-  echo "==> DRY RUN — would create prerelease:"
-  echo "    gh release create ${tag} --target ${target} --prerelease --title ${tag}"
-  exit 0
-fi
-
-echo "==> Creating GitHub prerelease ${tag} (target: ${target})"
-gh release create "${tag}" \
-  --target "${target}" \
-  --prerelease \
-  --title "${tag}" \
-  --notes "${notes}"
-
-echo "==> Done. The release workflow attaches artifacts on tag push."
-echo "    Watch:  gh run watch"
-echo "    Verify: gh release view ${tag}"

From b3f4ea8b8572d1c7c8de808e3150ca8a70f24276 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 19:10:52 +1000
Subject: [PATCH 512/599] ci: pin alpha release from validated sha

---
 .github/workflows/release-alpha.yml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml
index fb4cf6eb7..e20a2161f 100644
--- a/.github/workflows/release-alpha.yml
+++ b/.github/workflows/release-alpha.yml
@@ -129,7 +129,9 @@ jobs:
     steps:
       - uses: actions/checkout@v4
         with:
-          ref: ${{ github.ref_name }}
+          # Pin from the dispatch SHA that resolve validated. Pushing HEAD back
+          # to the branch will fail if the branch advanced meanwhile.
+          ref: ${{ github.sha }}
           fetch-depth: 0
 
       - name: Import GPG key

From 45ff92eeded3f355341885e466b8f1ab55743f96 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 22:36:04 +1000
Subject: [PATCH 513/599] fix release alpha review findings

---
 .github/scripts/derive-identity.sh            | 24 ++++++----
 .github/scripts/derive-identity.test.sh       |  3 ++
 .github/scripts/release-alpha-pin-bindings.sh | 13 ++++-
 .github/scripts/release-alpha-resolve.sh      |  5 ++
 .github/scripts/release-alpha-resolve.test.sh | 15 ++++++
 .github/workflows/_build-docs.yml             |  1 +
 .github/workflows/_build-sql.yml              |  4 ++
 .github/workflows/lint-release.yml            |  4 +-
 .github/workflows/release-alpha.yml           | 47 ++++++++++++++-----
 .github/workflows/release-eql.yml             |  3 +-
 ...07-04-release-tasks-implementation-plan.md | 27 +++++++++--
 docs/development/releasing-an-alpha.md        |  2 +-
 12 files changed, 119 insertions(+), 29 deletions(-)

diff --git a/.github/scripts/derive-identity.sh b/.github/scripts/derive-identity.sh
index 2b9f8082c..d25e5296d 100755
--- a/.github/scripts/derive-identity.sh
+++ b/.github/scripts/derive-identity.sh
@@ -7,11 +7,16 @@ list_tags() { git tag --list "$1"; }
 
 tag_exists() { git rev-parse -q --verify "refs/tags/$1" >/dev/null; }
 
-highest_n() {
+matching_suffixes() {
   local prefix="$1" esc
   esc="${prefix//./\\.}"
   list_tags "${prefix}*" \
-    | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" \
+    | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p"
+}
+
+highest_n() {
+  local prefix="$1"
+  matching_suffixes "$prefix" \
     | sort -n \
     | tail -1
 }
@@ -28,23 +33,24 @@ derive_identity() {
 
   case "$target" in
     all|eql)
-      local sql_n crate_n n
+      local sql_n crate_n sql_n_dec crate_n_dec n
       sql_n=$(highest_n "$sql_prefix")
       sql_n=${sql_n:-0}
       crate_n=$(highest_n "$crate_prefix")
       crate_n=${crate_n:-0}
-      if (( sql_n >= crate_n )); then
-        n=$((sql_n + 1))
+      sql_n_dec=$((10#$sql_n))
+      crate_n_dec=$((10#$crate_n))
+      if (( sql_n_dec >= crate_n_dec )); then
+        n=$((sql_n_dec + 1))
       else
-        n=$((crate_n + 1))
+        n=$((crate_n_dec + 1))
       fi
       printf '%s\n' "${version}-${channel}.${n}"
       ;;
     bindings)
-      local esc found n
-      esc="${sql_prefix//./\\.}"
+      local found n
       found=""
-      for n in $(list_tags "${sql_prefix}*" | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p" | sort -rn); do
+      for n in $(matching_suffixes "$sql_prefix" | sort -rn); do
         if ! tag_exists "${crate_prefix}${n}"; then
           found="$n"
           break
diff --git a/.github/scripts/derive-identity.test.sh b/.github/scripts/derive-identity.test.sh
index 4353ce784..a56c5869d 100755
--- a/.github/scripts/derive-identity.test.sh
+++ b/.github/scripts/derive-identity.test.sh
@@ -46,6 +46,9 @@ check "all: sql .5 -> .6" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.6
 FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.4)
 check "all: crate .4 wins (cross-namespace) -> .5" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.5"
 
+FAKE_TAGS=(eql-3.0.0-alpha.08)
+check "all: leading-zero sql suffix is base-10 -> .9" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.9"
+
 FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.4)
 check "bindings: latest sql lacking crate -> .5" "$(derive_identity bindings 3.0.0 alpha '')" "3.0.0-alpha.5"
 
diff --git a/.github/scripts/release-alpha-pin-bindings.sh b/.github/scripts/release-alpha-pin-bindings.sh
index d88b32e89..a25347baf 100755
--- a/.github/scripts/release-alpha-pin-bindings.sh
+++ b/.github/scripts/release-alpha-pin-bindings.sh
@@ -8,9 +8,17 @@ release_alpha_pin_emit_commit_sha() {
   echo "commit_sha=${commit_sha}" | tee -a "${GITHUB_OUTPUT:-/dev/null}"
 }
 
+release_alpha_pin_push_target() {
+  if [[ -n "${GH_TOKEN:-}" && -n "${GITHUB_REPOSITORY:-}" ]]; then
+    printf 'https://x-access-token:%s@github.com/%s.git\n' "$GH_TOKEN" "$GITHUB_REPOSITORY"
+  else
+    printf 'origin\n'
+  fi
+}
+
 release_alpha_pin_bindings() {
   local identity="$1" branch="$2"
-  local commit_sha
+  local commit_sha push_target
   local commit_args=()
 
   release-plz set-version "eql-bindings@${identity}"
@@ -25,7 +33,8 @@ release_alpha_pin_bindings() {
       commit_args=(-S)
     fi
     git commit "${commit_args[@]}" -m "chore(release): pin eql-bindings to ${identity}"
-    git push origin "HEAD:${branch}"
+    push_target="$(release_alpha_pin_push_target)"
+    git push "$push_target" "HEAD:${branch}"
   fi
 
   commit_sha="$(git rev-parse HEAD)"
diff --git a/.github/scripts/release-alpha-resolve.sh b/.github/scripts/release-alpha-resolve.sh
index 051ee785a..50b2bd157 100755
--- a/.github/scripts/release-alpha-resolve.sh
+++ b/.github/scripts/release-alpha-resolve.sh
@@ -47,6 +47,11 @@ release_alpha_resolve() {
     return 1
   fi
 
+  if [[ -n "$pre" && "$pre" != "${version}-${channel}."* ]]; then
+    release_alpha_error "pre '$pre' does not match version '${version}' and channel '${channel}'"
+    return 1
+  fi
+
   if [[ "$target" == "all" || "$target" == "bindings" ]]; then
     if [[ "$ref_type" != "branch" ]]; then
       release_alpha_error "target=${target} pins+pushes the crate version and requires a branch ref; got ${ref_type} '${ref_name}'. Dispatch with --ref ."
diff --git a/.github/scripts/release-alpha-resolve.test.sh b/.github/scripts/release-alpha-resolve.test.sh
index e430b6d0f..7b56816ec 100755
--- a/.github/scripts/release-alpha-resolve.test.sh
+++ b/.github/scripts/release-alpha-resolve.test.sh
@@ -84,9 +84,24 @@ check_fail "rejects invalid version" "invalid version '3.0'" \
 check_fail "rejects invalid pre" "invalid pre '3.0.0-alpha'" \
   release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha branch eql_v3
 
+check_fail "rejects pre with mismatched version" "does not match version '3.0.0' and channel 'alpha'" \
+  release_alpha_resolve all 3.0.0 alpha 3.1.0-alpha.1 branch eql_v3
+
+check_fail "rejects pre with mismatched channel" "does not match version '3.0.0' and channel 'alpha'" \
+  release_alpha_resolve all 3.0.0 alpha 3.0.0-beta.1 branch eql_v3
+
 check_fail "all requires branch ref" "requires a branch ref" \
   release_alpha_resolve all 3.0.0 alpha "" tag v3.0.0
 
+FAKE_TAGS=(eql-3.0.0-alpha.1)
+check_fail "eql rejects existing sql tag" "eql-3.0.0-alpha.1 already exists" \
+  release_alpha_resolve eql 3.0.0 alpha 3.0.0-alpha.1 tag eql-3.0.0-alpha.1
+
+FAKE_TAGS=()
+check_ok "eql accepts tag ref without branch" \
+  $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\ncrate_tag=eql-bindings-v3.0.0-alpha.1' \
+  release_alpha_resolve eql 3.0.0 alpha "" tag eql-3.0.0-alpha.1
+
 FAKE_TAGS=(eql-3.0.0-alpha.2)
 check_fail "all rejects existing sql tag with explicit pre" "eql-3.0.0-alpha.2 already exists" \
   release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
diff --git a/.github/workflows/_build-docs.yml b/.github/workflows/_build-docs.yml
index 62bf93e42..81a006f7e 100644
--- a/.github/workflows/_build-docs.yml
+++ b/.github/workflows/_build-docs.yml
@@ -38,6 +38,7 @@ jobs:
     steps:
       - uses: actions/checkout@v4
         with:
+          persist-credentials: false
           ref: ${{ inputs.ref }}
 
       - uses: jdx/mise-action@v3
diff --git a/.github/workflows/_build-sql.yml b/.github/workflows/_build-sql.yml
index 58ff1274f..6468d98e8 100644
--- a/.github/workflows/_build-sql.yml
+++ b/.github/workflows/_build-sql.yml
@@ -32,6 +32,9 @@ on:
         required: false
         type: boolean
         default: false
+    secrets:
+      MULTITUDES_ACCESS_TOKEN:
+        required: true
 
 env:
   FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
@@ -53,6 +56,7 @@ jobs:
     steps:
       - uses: actions/checkout@v4
         with:
+          persist-credentials: false
           ref: ${{ inputs.ref }}
 
       - uses: jdx/mise-action@v3
diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml
index 72658a0a6..cfc47b61b 100644
--- a/.github/workflows/lint-release.yml
+++ b/.github/workflows/lint-release.yml
@@ -31,11 +31,13 @@ jobs:
     timeout-minutes: 10
     steps:
       - uses: actions/checkout@v4
+        with:
+          persist-credentials: false
 
       - name: Install actionlint
         run: |
           set -euo pipefail
-          bash <(curl -sSfL https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
+          bash <(curl -sSfL https://raw.githubusercontent.com/rhysd/actionlint/v1.7.7/scripts/download-actionlint.bash) v1.7.7
           echo "$PWD" >> "$GITHUB_PATH"
 
       - name: actionlint (release workflows)
diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml
index e20a2161f..80b9375e8 100644
--- a/.github/workflows/release-alpha.yml
+++ b/.github/workflows/release-alpha.yml
@@ -44,8 +44,7 @@ run-name: >-
   release-alpha ${{ inputs.target }} ${{ inputs.pre != '' && inputs.pre || format('{0}-{1}', inputs.version, inputs.channel) }}${{ inputs.dry_run && ' [dry-run]' || '' }} [${{ inputs.dispatch_id }}]
 
 permissions:
-  contents: write
-  actions: write
+  contents: read
 
 concurrency:
   group: release-alpha
@@ -71,6 +70,7 @@ jobs:
     steps:
       - uses: actions/checkout@v4
         with:
+          persist-credentials: false
           fetch-depth: 0
 
       - name: Fetch all tags
@@ -103,6 +103,11 @@ jobs:
         env:
           TARGET: ${{ inputs.target }}
           DRY: ${{ inputs.dry_run }}
+          IDENTITY: ${{ steps.derive.outputs.identity }}
+          SQL_TAG: ${{ steps.derive.outputs.sql_tag }}
+          CRATE_TAG: ${{ steps.derive.outputs.crate_tag }}
+          REF_NAME: ${{ github.ref_name }}
+          SHA: ${{ github.sha }}
         run: |
           set -euo pipefail
           {
@@ -111,10 +116,10 @@ jobs:
             echo "| field | value |"
             echo "|---|---|"
             echo "| target | ${TARGET} |"
-            echo "| identity | ${{ steps.derive.outputs.identity }} |"
-            echo "| sql_tag | ${{ steps.derive.outputs.sql_tag }} |"
-            echo "| crate_tag | ${{ steps.derive.outputs.crate_tag }} |"
-            echo "| ref | ${{ github.ref_name }} @ ${{ github.sha }} |"
+            echo "| identity | ${IDENTITY} |"
+            echo "| sql_tag | ${SQL_TAG} |"
+            echo "| crate_tag | ${CRATE_TAG} |"
+            echo "| ref | ${REF_NAME} @ ${SHA} |"
             echo "| dry_run | ${DRY} |"
           } >> "$GITHUB_STEP_SUMMARY"
 
@@ -123,12 +128,15 @@ jobs:
     runs-on: blacksmith-16vcpu-ubuntu-2204
     needs: resolve
     if: ${{ !inputs.dry_run && (inputs.target == 'all' || inputs.target == 'bindings') }}
+    permissions:
+      contents: write
     timeout-minutes: 15
     outputs:
       commit_sha: ${{ steps.commit.outputs.commit_sha }}
     steps:
       - uses: actions/checkout@v4
         with:
+          persist-credentials: false
           # Pin from the dispatch SHA that resolve validated. Pushing HEAD back
           # to the branch will fail if the branch advanced meanwhile.
           ref: ${{ github.sha }}
@@ -155,6 +163,7 @@ jobs:
         env:
           IDENTITY: ${{ needs.resolve.outputs.identity }}
           BRANCH: ${{ github.ref_name }}
+          GH_TOKEN: ${{ github.token }}
         run: .github/scripts/release-alpha-pin-bindings.sh
 
   build-sql:
@@ -167,7 +176,8 @@ jobs:
           && (needs.pin.result == 'success' || needs.pin.result == 'skipped') }}
     permissions:
       contents: write
-    secrets: inherit
+    secrets:
+      MULTITUDES_ACCESS_TOKEN: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}
     uses: ./.github/workflows/_build-sql.yml
     with:
       ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || '' }}
@@ -201,6 +211,8 @@ jobs:
           && (needs.build-sql.result == 'success' || needs.build-sql.result == 'skipped')
           && (needs.build-docs.result == 'success' || needs.build-docs.result == 'skipped') }}
     timeout-minutes: 10
+    permissions:
+      actions: write
     steps:
       - name: Dispatch release-plz.yml against the pinned commit
         env:
@@ -234,17 +246,28 @@ jobs:
         env:
           TARGET: ${{ inputs.target }}
           DRY: ${{ inputs.dry_run }}
+          IDENTITY: ${{ needs.resolve.outputs.identity }}
+          SQL_TAG: ${{ needs.resolve.outputs.sql_tag }}
+          CRATE_TAG: ${{ needs.resolve.outputs.crate_tag }}
+          RESOLVE_RESULT: ${{ needs.resolve.result }}
+          PIN_RESULT: ${{ needs.pin.result }}
+          BUILD_SQL_RESULT: ${{ needs.build-sql.result }}
+          BUILD_DOCS_RESULT: ${{ needs.build-docs.result }}
+          CRATE_PUBLISH_RESULT: ${{ needs.crate-publish.result }}
+          SERVER_URL: ${{ github.server_url }}
+          REPOSITORY: ${{ github.repository }}
+          RUN_ID: ${{ github.run_id }}
         run: |
           set -euo pipefail
           {
             echo "## release-alpha result"
             echo ""
             echo "- target: \`${TARGET}\` (dry_run=${DRY})"
-            echo "- identity: \`${{ needs.resolve.outputs.identity }}\`"
-            echo "- sql_tag: \`${{ needs.resolve.outputs.sql_tag }}\`"
-            echo "- crate_tag: \`${{ needs.resolve.outputs.crate_tag }}\`"
-            echo "- resolve: ${{ needs.resolve.result }} | pin: ${{ needs.pin.result }} | build-sql: ${{ needs.build-sql.result }} | build-docs: ${{ needs.build-docs.result }} | crate-publish: ${{ needs.crate-publish.result }}"
+            echo "- identity: \`${IDENTITY}\`"
+            echo "- sql_tag: \`${SQL_TAG}\`"
+            echo "- crate_tag: \`${CRATE_TAG}\`"
+            echo "- resolve: ${RESOLVE_RESULT} | pin: ${PIN_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | crate-publish: ${CRATE_PUBLISH_RESULT}"
             echo ""
-            echo "Coordinator run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
+            echo "Coordinator run: ${SERVER_URL}/${REPOSITORY}/actions/runs/${RUN_ID}"
             echo "The crate publish, if dispatched, runs as a separate release-plz.yml run."
           } >> "$GITHUB_STEP_SUMMARY"
diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml
index d589364ef..920877a7f 100644
--- a/.github/workflows/release-eql.yml
+++ b/.github/workflows/release-eql.yml
@@ -57,7 +57,8 @@ jobs:
     if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
     permissions:
       contents: write
-    secrets: inherit
+    secrets:
+      MULTITUDES_ACCESS_TOKEN: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}
     uses: ./.github/workflows/_build-sql.yml
     with:
       ref: ""
diff --git a/docs/development/2026-07-04-release-tasks-implementation-plan.md b/docs/development/2026-07-04-release-tasks-implementation-plan.md
index aeae5fccf..e8557f6f0 100644
--- a/docs/development/2026-07-04-release-tasks-implementation-plan.md
+++ b/docs/development/2026-07-04-release-tasks-implementation-plan.md
@@ -621,7 +621,15 @@ resolve ──> pin ──> build-sql ──> build-docs ──> crate-publish 
 - `crate-publish` — `all`/`bindings` only, non-dry, **after** `build-sql` **and** `build-docs`: `gh workflow run release-plz.yml --ref `.
 - `summary` — always.
 
-- [ ] **Step 1: Write the coordinator header, inputs, permissions, concurrency, run-name**
+Current implementation note: `release-alpha.yml` now keeps the target-specific
+resolution and pinning logic in script entrypoints. Future changes should start
+from `.github/scripts/release-alpha-resolve.sh` for the `resolve` job contract
+and `.github/scripts/release-alpha-pin-bindings.sh` for the `pin` job contract,
+with their adjacent shell tests as the source of truth. The inline shell blocks
+below are retained as historical context from the original implementation plan,
+not as the active workflow shape.
+
+- [ ] **Step 1: Historical coordinator header, inputs, permissions, concurrency, run-name**
 
 ```yaml
 name: "Release alpha (coordinator)"
@@ -691,7 +699,13 @@ defaults:
     shell: bash {0}
 ```
 
-- [ ] **Step 2: Write the `resolve` job**
+- [ ] **Step 2: Historical `resolve` job sketch**
+
+Current flow: the `resolve` job checks out with full tag history, fetches tags,
+then runs `.github/scripts/release-alpha-resolve.sh` with `TARGET`, `VERSION`,
+`CHANNEL`, `PRE`, `REF_TYPE`, and `REF_NAME`. That script validates the inputs,
+derives or accepts the identity, applies target-specific tag/source guards, and
+emits `identity`, `sql_tag`, and `crate_tag` through `GITHUB_OUTPUT`.
 
 ```yaml
 jobs:
@@ -821,7 +835,14 @@ jobs:
 
 Notes on `set -e` safety: every guard uses `if ; then …; fi` (not ` && { fail; }`), so a `git rev-parse` returning non-zero does not abort the script.
 
-- [ ] **Step 3: Write the `pin` job (no-op tolerant)**
+- [ ] **Step 3: Historical `pin` job sketch**
+
+Current flow: the `pin` job checks out the dispatch SHA, imports the signing key,
+installs `release-plz`, then runs
+`.github/scripts/release-alpha-pin-bindings.sh` with `IDENTITY` and `BRANCH`.
+That script performs the no-op-tolerant `release-plz set-version`, creates the
+signed metadata commit only when files changed, pushes it to the selected branch,
+and emits `commit_sha`.
 
 ```yaml
   pin:
diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md
index f98573d35..5b68f7348 100644
--- a/docs/development/releasing-an-alpha.md
+++ b/docs/development/releasing-an-alpha.md
@@ -60,7 +60,7 @@ Common flags:
 | `--version` | Base SemVer (`X.Y.Z`) | `3.0.0` |
 | `--channel` | Prerelease channel: `alpha` \| `beta` \| `rc` | `alpha` |
 | `--pre` | Exact identity (`X.Y.Z-(alpha\|beta\|rc).N`), bypassing derivation | derived |
-| `--ref` | GitHub ref for `workflow_dispatch` | current branch |
+| `--ref` | GitHub ref for `workflow_dispatch` | current branch for `release:all` and `release:eql`; required explicitly for `release:bindings` |
 | `--dry-run` | Resolve, verify, and print the plan without mutating anything | off |
 
 Examples:

From 0cec133365da08d1bf01a14538e23aa6c4fd84a5 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 12:59:52 +1000
Subject: [PATCH 514/599] test: preserve public domain columns on v3 uninstall

---
 tests/sqlx/tests/v3_uninstall_tests.rs | 177 +++++++++++++++++++++++--
 1 file changed, 166 insertions(+), 11 deletions(-)

diff --git a/tests/sqlx/tests/v3_uninstall_tests.rs b/tests/sqlx/tests/v3_uninstall_tests.rs
index 8536206db..301582983 100644
--- a/tests/sqlx/tests/v3_uninstall_tests.rs
+++ b/tests/sqlx/tests/v3_uninstall_tests.rs
@@ -31,6 +31,37 @@ async fn schema_count(pool: &PgPool) -> Result {
     Ok(n)
 }
 
+async fn run_shipped_uninstaller(pool: &PgPool) -> Result<()> {
+    let uninstall_sql = std::fs::read_to_string(UNINSTALLER).unwrap_or_else(|e| {
+        panic!(
+            "failed to read shipped uninstaller {UNINSTALLER}: {e} — run `mise run build` \
+             (or, in CI, ensure the nextest-archive artifact shipped release/*.sql)"
+        )
+    });
+
+    sqlx::raw_sql(&uninstall_sql).execute(pool).await?;
+    Ok(())
+}
+
+async fn table_exists(pool: &PgPool, table: &str) -> Result {
+    let exists: bool = sqlx::query_scalar(
+        r#"
+        SELECT EXISTS (
+          SELECT 1
+          FROM pg_catalog.pg_class c
+          JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+          WHERE n.nspname = 'public'
+            AND c.relname = $1
+            AND c.relkind = 'r'
+        )
+        "#,
+    )
+    .bind(table)
+    .fetch_one(pool)
+    .await?;
+    Ok(exists)
+}
+
 #[sqlx::test]
 async fn uninstaller_drops_both_schemas(pool: PgPool) -> Result<()> {
     // Sanity: the migration installed both schemas, so the teardown has
@@ -41,17 +72,7 @@ async fn uninstaller_drops_both_schemas(pool: PgPool) -> Result<()> {
         "expected both eql_v3 and eql_v3_internal installed by the migration before uninstall"
     );
 
-    let uninstall_sql = std::fs::read_to_string(UNINSTALLER).unwrap_or_else(|e| {
-        panic!(
-            "failed to read shipped uninstaller {UNINSTALLER}: {e} — run `mise run build` \
-             (or, in CI, ensure the nextest-archive artifact shipped release/*.sql)"
-        )
-    });
-
-    // The uninstaller is multiple statements (DROP SCHEMA … CASCADE, twice), so
-    // it must run over the simple query protocol — `raw_sql` executes the whole
-    // script, unlike `query` which prepares a single statement.
-    sqlx::raw_sql(&uninstall_sql).execute(&pool).await?;
+    run_shipped_uninstaller(&pool).await?;
 
     assert_eq!(
         schema_count(&pool).await?,
@@ -81,3 +102,137 @@ async fn uninstaller_drops_both_schemas(pool: PgPool) -> Result<()> {
 
     Ok(())
 }
+
+#[sqlx::test]
+async fn uninstaller_preserves_application_tables_with_public_domain_columns(
+    pool: PgPool,
+) -> Result<()> {
+    assert_eq!(
+        schema_count(&pool).await?,
+        2,
+        "expected both eql_v3 schemas installed before uninstall"
+    );
+
+    let scalar_payload = r#"{"v":3,"i":{},"c":"scalar-42","hm":"hm-42"}"#;
+    let json_payload = r#"{"i":{},"v":3,"sv":[{"s":"age","c":"cipher-age","hm":"hm-age"}]}"#;
+    let query_payload = r#"{"sv":[{"s":"age","hm":"hm-age"}]}"#;
+    let entry_payload = r#"{"s":"age","c":"cipher-age","hm":"hm-age"}"#;
+
+    sqlx::query(
+        r#"
+        CREATE TABLE public.eql_v3_uninstall_preserve (
+          id integer PRIMARY KEY,
+          scalar_value public.integer_eq NOT NULL,
+          doc_value public.json NOT NULL,
+          query_value public.jsonb_query NOT NULL,
+          entry_value public.jsonb_entry
+        )
+        "#,
+    )
+    .execute(&pool)
+    .await?;
+
+    sqlx::query(
+        r#"
+        INSERT INTO public.eql_v3_uninstall_preserve
+          (id, scalar_value, doc_value, query_value, entry_value)
+        VALUES
+          (
+            1,
+            $1::jsonb::public.integer_eq,
+            $2::jsonb::public.json,
+            $3::jsonb::public.jsonb_query,
+            $4::jsonb::public.jsonb_entry
+          )
+        "#,
+    )
+    .bind(scalar_payload)
+    .bind(json_payload)
+    .bind(query_payload)
+    .bind(entry_payload)
+    .execute(&pool)
+    .await?;
+
+    run_shipped_uninstaller(&pool).await?;
+
+    assert_eq!(
+        schema_count(&pool).await?,
+        0,
+        "uninstaller must drop both EQL-owned schemas"
+    );
+    assert!(
+        table_exists(&pool, "eql_v3_uninstall_preserve").await?,
+        "application table with public domain columns must survive uninstall"
+    );
+
+    let row_count: i64 =
+        sqlx::query_scalar("SELECT count(*) FROM public.eql_v3_uninstall_preserve")
+            .fetch_one(&pool)
+            .await?;
+    assert_eq!(row_count, 1, "row must survive uninstall");
+
+    let column_types: Vec = sqlx::query_scalar(
+        r#"
+        SELECT format('%I.%I', tn.nspname, t.typname)
+        FROM pg_catalog.pg_attribute a
+        JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
+        JOIN pg_catalog.pg_namespace cn ON cn.oid = c.relnamespace
+        JOIN pg_catalog.pg_type t ON t.oid = a.atttypid
+        JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace
+        WHERE cn.nspname = 'public'
+          AND c.relname = 'eql_v3_uninstall_preserve'
+          AND a.attnum > 0
+          AND NOT a.attisdropped
+        ORDER BY a.attnum
+        "#,
+    )
+    .fetch_all(&pool)
+    .await?;
+    assert_eq!(
+        column_types,
+        vec![
+            "pg_catalog.int4",
+            "public.integer_eq",
+            "public.json",
+            "public.jsonb_query",
+            "public.jsonb_entry",
+        ]
+    );
+
+    let values: (
+        serde_json::Value,
+        serde_json::Value,
+        serde_json::Value,
+        serde_json::Value,
+    ) = sqlx::query_as(
+        r#"
+        SELECT
+          scalar_value::jsonb,
+          doc_value::jsonb,
+          query_value::jsonb,
+          entry_value::jsonb
+        FROM public.eql_v3_uninstall_preserve
+        WHERE id = 1
+        "#,
+    )
+    .fetch_one(&pool)
+    .await?;
+    assert_eq!(
+        values.0,
+        serde_json::from_str::(scalar_payload)?
+    );
+    assert_eq!(
+        values.1,
+        serde_json::from_str::(json_payload)?
+    );
+    assert_eq!(
+        values.2,
+        serde_json::from_str::(query_payload)?
+    );
+    assert_eq!(
+        values.3,
+        serde_json::from_str::(entry_payload)?
+    );
+
+    Ok(())
+}

From 4ff4c1e89649c246dddfe8d0173c9156a9d0e8f0 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 13:15:53 +1000
Subject: [PATCH 515/599] test: require v3 user domains in public

---
 tests/sqlx/tests/v3_public_surface_tests.rs | 172 +++++++++++++-------
 1 file changed, 114 insertions(+), 58 deletions(-)

diff --git a/tests/sqlx/tests/v3_public_surface_tests.rs b/tests/sqlx/tests/v3_public_surface_tests.rs
index 5b561d62c..0a8ca629d 100644
--- a/tests/sqlx/tests/v3_public_surface_tests.rs
+++ b/tests/sqlx/tests/v3_public_surface_tests.rs
@@ -8,13 +8,13 @@
 //! would ship unnoticed. These tests close that gap two ways:
 //!
 //!   * `eql_v3_public_surface_matches_golden` — an exhaustive committed snapshot
-//!     of every object visible in `eql_v3` (types, functions, aggregates,
-//!     operators, casts). Any addition/removal/rename forces a conscious
+//!     of every EQL-owned function, aggregate, operator, and cast. Any
+//!     addition/removal/rename forces a conscious
 //!     snapshot update, mirroring the `snapshots/matrix_tests.txt` gate.
 //!   * The placement invariants — structural rules (no naked composite/enum
-//!     types in the public schema; every public type is a jsonb-backed domain;
-//!     every catalog-generated domain landed in `eql_v3`) that are cheaper to
-//!     reason about than the golden and independent of a frozen text file.
+//!     types in the public schema; every user-column type is a public
+//!     jsonb-backed domain; SEM index-term types stay internal) that are cheaper
+//!     to reason about than the golden and independent of a frozen text file.
 //!
 //! The golden is regenerated in place with `EQL_UPDATE_SNAPSHOTS=1` (see
 //! `mise run test:surface:snapshot:regen`); the file lives next to the matrix
@@ -38,19 +38,13 @@ const GOLDEN_PATH: &str = concat!(
     "/snapshots/eql_v3_public_surface.txt"
 );
 
-/// Enumerates every object owned by the `eql_v3` public schema as normalized,
-/// schema-qualified text lines. Run on a connection with
+/// Enumerates every EQL-owned public function, aggregate, operator, and cast as
+/// normalized, schema-qualified text lines. Run on a connection with
 /// `search_path = pg_catalog` so `regtype`/identity-argument rendering
-/// fully-qualifies non-catalog schemas (`eql_v3.*`) and leaves built-ins
-/// (`jsonb`) bare — deterministic across environments and PG versions.
+/// fully-qualifies non-catalog schemas (`eql_v3.*`, `public.*`) and leaves
+/// built-ins (`jsonb`) bare — deterministic across environments and PG
+/// versions.
 const SURFACE_SQL: &str = r#"
-    SELECT format('type %s.%s %s', n.nspname, t.typname, t.typtype)
-    FROM pg_catalog.pg_type t
-    JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
-    WHERE n.nspname = 'eql_v3' AND t.typtype IN ('d','c','e')
-
-    UNION ALL
-
     SELECT format('%s %s.%s(%s)',
       CASE p.prokind
         WHEN 'a' THEN 'aggregate'
@@ -76,14 +70,9 @@ const SURFACE_SQL: &str = r#"
 
     SELECT format('cast %s -> %s', c.castsource::regtype, c.casttarget::regtype)
     FROM pg_catalog.pg_cast c
-    WHERE EXISTS (
-        SELECT 1 FROM pg_catalog.pg_type st
-        JOIN pg_catalog.pg_namespace sn ON sn.oid = st.typnamespace
-        WHERE st.oid = c.castsource AND sn.nspname = 'eql_v3')
-      OR EXISTS (
-        SELECT 1 FROM pg_catalog.pg_type tt
-        JOIN pg_catalog.pg_namespace tn ON tn.oid = tt.typnamespace
-        WHERE tt.oid = c.casttarget AND tn.nspname = 'eql_v3')
+    JOIN pg_catalog.pg_proc p ON p.oid = c.castfunc
+    JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
+    WHERE n.nspname = 'eql_v3'
 "#;
 
 /// Fetch the sorted public-surface entry list.
@@ -101,17 +90,12 @@ async fn public_surface(pool: &PgPool) -> Result> {
     Ok(entries)
 }
 
-/// The catalog-generated domain names, as they appear in SQL: `` for the
-/// storage domain (empty term-name), `_` otherwise. These MUST
-/// live in `eql_v3` (never `eql_v3_internal`), and are a subset of the installed
-/// `eql_v3` domains (the hand-written jsonb-family domains — `json`,
-/// `jsonb_query`, `jsonb_entry` — are the remainder).
-fn catalog_domain_names() -> Vec {
+/// User-column domain names, as they appear in SQL: scalar-family domains plus
+/// the hand-written JSON/JSONB domains. These MUST live in `public` (never
+/// `eql_v3` or `eql_v3_internal`) so application tables using them survive EQL
+/// schema uninstall.
+fn user_domain_names() -> Vec {
     let mut names = Vec::new();
-    // Scalar families only — the jsonb (SteVec) family's domains (`json`,
-    // `jsonb_entry`, `jsonb_query`) use bespoke names, not `_`,
-    // and are the hand-written "remainder" noted above. Iterating the full
-    // CATALOG would fabricate non-existent names like `jsonb_json`.
     for family in eql_domains::scalar_families() {
         for domain in family.domains {
             if domain.name.is_empty() {
@@ -121,6 +105,11 @@ fn catalog_domain_names() -> Vec {
             }
         }
     }
+    names.extend(
+        ["json", "jsonb_entry", "jsonb_query"]
+            .into_iter()
+            .map(String::from),
+    );
     names.sort();
     names
 }
@@ -194,59 +183,126 @@ async fn eql_v3_has_no_naked_composite_or_enum_types(pool: PgPool) -> Result<()>
     Ok(())
 }
 
-/// #2 — Placement invariant: every type in `eql_v3` is a jsonb-backed domain.
-/// The public surface is exclusively jsonb domains (the scalar families plus the
-/// hand-written jsonb-document domains); anything else is misplaced.
+/// #2 — Placement invariant: every user-column domain is public and jsonb-backed.
+/// These are application-column types, so they live in `public` instead of an
+/// EQL-owned schema and are domains directly over `pg_catalog.jsonb`.
+#[sqlx::test]
+async fn user_column_domains_are_public_jsonb_domains(pool: PgPool) -> Result<()> {
+    let installed: Vec<(String, String)> = sqlx::query_as(
+        r#"
+        SELECT t.typname::text, bt.typname::text
+        FROM pg_catalog.pg_type t
+        JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
+        JOIN pg_catalog.pg_type bt ON bt.oid = t.typbasetype
+        WHERE n.nspname = 'public'
+          AND t.typtype = 'd'
+          AND t.typname = ANY($1)
+        ORDER BY t.typname
+        "#,
+    )
+    .bind(user_domain_names())
+    .fetch_all(&pool)
+    .await?;
+
+    let installed: std::collections::BTreeMap = installed.into_iter().collect();
+    let missing: Vec = user_domain_names()
+        .into_iter()
+        .filter(|name| !installed.contains_key(name))
+        .collect();
+    assert!(
+        missing.is_empty(),
+        "user-column domain(s) missing from public: {missing:?}"
+    );
+
+    let non_jsonb: Vec<(String, String)> = installed
+        .into_iter()
+        .filter(|(_, base)| base != "jsonb")
+        .collect();
+    assert!(
+        non_jsonb.is_empty(),
+        "public user-column domains must be jsonb-backed domains: {non_jsonb:?}"
+    );
+    Ok(())
+}
+
+/// #2 — Placement invariant: user-column domains are absent from EQL-owned
+/// schemas. `eql_v3` / `eql_v3_internal` can be uninstalled independently; a
+/// user table column type must not depend on either schema.
 #[sqlx::test]
-async fn every_eql_v3_type_is_a_jsonb_domain(pool: PgPool) -> Result<()> {
+async fn user_column_domains_absent_from_eql_owned_schemas(pool: PgPool) -> Result<()> {
     let offenders: Vec = sqlx::query_scalar(
         r#"
-        SELECT format('%I (typtype=%s, base=%s)',
-                      t.typname, t.typtype, COALESCE(bt.typname, ''))
+        SELECT format('%I.%I', n.nspname, t.typname)
         FROM pg_catalog.pg_type t
         JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
-        LEFT JOIN pg_catalog.pg_type bt ON bt.oid = t.typbasetype
-        WHERE n.nspname = 'eql_v3'
-          AND t.typtype IN ('d', 'c', 'e')
-          AND NOT (t.typtype = 'd' AND bt.typname = 'jsonb')
+        WHERE n.nspname IN ('eql_v3', 'eql_v3_internal')
+          AND t.typtype = 'd'
+          AND t.typname = ANY($1)
         ORDER BY 1
         "#,
     )
+    .bind(user_domain_names())
     .fetch_all(&pool)
     .await?;
     assert!(
         offenders.is_empty(),
-        "every eql_v3 type must be a jsonb-backed domain; found non-jsonb-domain type(s): {offenders:?}"
+        "user-column domains must not exist in droppable EQL-owned schemas: {offenders:?}"
     );
     Ok(())
 }
 
-/// #2 — Placement invariant: every catalog-generated domain landed in `eql_v3`.
-/// Ties the public surface back to `eql_domains::CATALOG` (the source of truth)
-/// independent of the golden text file: a generated domain created in the wrong
-/// schema (or missing) fails here without a manual snapshot update.
+/// #2 — Placement invariant: SEM index-term types remain internal. These are
+/// transient implementation types used by extractors, indexes, and comparator
+/// functions; exposing them as user-column domains would leak implementation
+/// detail into type pickers.
 #[sqlx::test]
-async fn every_catalog_domain_is_present_in_eql_v3(pool: PgPool) -> Result<()> {
-    let installed: Vec = sqlx::query_scalar(
+async fn sem_index_term_types_remain_internal(pool: PgPool) -> Result<()> {
+    let expected = [
+        "bloom_filter",
+        "hmac_256",
+        "ope_cllw",
+        "ore_block_256",
+        "ore_cllw",
+    ];
+    let present: Vec = sqlx::query_scalar(
         r#"
         SELECT t.typname::text
         FROM pg_catalog.pg_type t
         JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
-        WHERE n.nspname = 'eql_v3' AND t.typtype = 'd'
+        WHERE n.nspname = 'eql_v3_internal'
+          AND t.typname = ANY($1)
+        ORDER BY 1
         "#,
     )
+    .bind(expected)
     .fetch_all(&pool)
     .await?;
-    let installed: std::collections::BTreeSet = installed.into_iter().collect();
-
-    let missing: Vec = catalog_domain_names()
+    let present: std::collections::BTreeSet = present.into_iter().collect();
+    let missing: Vec<&str> = expected
         .into_iter()
-        .filter(|name| !installed.contains(name))
+        .filter(|name| !present.contains(*name))
         .collect();
     assert!(
         missing.is_empty(),
-        "catalog-generated domain(s) not found as jsonb domains in eql_v3 \
-         (created in the wrong schema, or not created?): {missing:?}"
+        "SEM/index-term type(s) missing from eql_v3_internal: {missing:?}"
+    );
+
+    let misplaced: Vec = sqlx::query_scalar(
+        r#"
+        SELECT format('%I.%I', n.nspname, t.typname)
+        FROM pg_catalog.pg_type t
+        JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
+        WHERE t.typname = ANY($1)
+          AND n.nspname <> 'eql_v3_internal'
+        ORDER BY 1
+        "#,
+    )
+    .bind(expected)
+    .fetch_all(&pool)
+    .await?;
+    assert!(
+        misplaced.is_empty(),
+        "SEM/index-term types must stay internal: {misplaced:?}"
     );
     Ok(())
 }

From 76c2bf7768a2b102cf6765de6dea8a2ed6e82a03 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 13:31:15 +1000
Subject: [PATCH 516/599] fix: generate v3 scalar domains in public

---
 crates/eql-codegen/src/consts.rs              |  15 +-
 crates/eql-codegen/src/context.rs             |  25 +-
 crates/eql-codegen/src/generate.rs            |  30 +-
 crates/eql-codegen/templates/types.sql.j2     |   6 +-
 src/v3/scalars/bigint/bigint_eq_functions.sql | 386 +++++++++---------
 src/v3/scalars/bigint/bigint_eq_operators.sql |  90 ++--
 src/v3/scalars/bigint/bigint_functions.sql    | 384 ++++++++---------
 src/v3/scalars/bigint/bigint_operators.sql    |  90 ++--
 .../scalars/bigint/bigint_ord_aggregates.sql  |  46 +--
 .../scalars/bigint/bigint_ord_functions.sql   | 378 ++++++++---------
 .../bigint/bigint_ord_ope_aggregates.sql      |  46 +--
 .../bigint/bigint_ord_ope_functions.sql       | 378 ++++++++---------
 .../bigint/bigint_ord_ope_operators.sql       |  90 ++--
 .../scalars/bigint/bigint_ord_operators.sql   |  90 ++--
 .../bigint/bigint_ord_ore_aggregates.sql      |  46 +--
 .../bigint/bigint_ord_ore_functions.sql       | 378 ++++++++---------
 .../bigint/bigint_ord_ore_operators.sql       |  90 ++--
 src/v3/scalars/bigint/bigint_types.sql        |  30 +-
 src/v3/scalars/boolean/boolean_functions.sql  | 384 ++++++++---------
 src/v3/scalars/boolean/boolean_operators.sql  |  90 ++--
 src/v3/scalars/boolean/boolean_types.sql      |   6 +-
 src/v3/scalars/date/date_eq_functions.sql     | 386 +++++++++---------
 src/v3/scalars/date/date_eq_operators.sql     |  90 ++--
 src/v3/scalars/date/date_functions.sql        | 384 ++++++++---------
 src/v3/scalars/date/date_operators.sql        |  90 ++--
 src/v3/scalars/date/date_ord_aggregates.sql   |  46 +--
 src/v3/scalars/date/date_ord_functions.sql    | 378 ++++++++---------
 .../scalars/date/date_ord_ope_aggregates.sql  |  46 +--
 .../scalars/date/date_ord_ope_functions.sql   | 378 ++++++++---------
 .../scalars/date/date_ord_ope_operators.sql   |  90 ++--
 src/v3/scalars/date/date_ord_operators.sql    |  90 ++--
 .../scalars/date/date_ord_ore_aggregates.sql  |  46 +--
 .../scalars/date/date_ord_ore_functions.sql   | 378 ++++++++---------
 .../scalars/date/date_ord_ore_operators.sql   |  90 ++--
 src/v3/scalars/date/date_types.sql            |  30 +-
 src/v3/scalars/double/double_eq_functions.sql | 386 +++++++++---------
 src/v3/scalars/double/double_eq_operators.sql |  90 ++--
 src/v3/scalars/double/double_functions.sql    | 384 ++++++++---------
 src/v3/scalars/double/double_operators.sql    |  90 ++--
 .../scalars/double/double_ord_aggregates.sql  |  46 +--
 .../scalars/double/double_ord_functions.sql   | 378 ++++++++---------
 .../double/double_ord_ope_aggregates.sql      |  46 +--
 .../double/double_ord_ope_functions.sql       | 378 ++++++++---------
 .../double/double_ord_ope_operators.sql       |  90 ++--
 .../scalars/double/double_ord_operators.sql   |  90 ++--
 .../double/double_ord_ore_aggregates.sql      |  46 +--
 .../double/double_ord_ore_functions.sql       | 378 ++++++++---------
 .../double/double_ord_ore_operators.sql       |  90 ++--
 src/v3/scalars/double/double_types.sql        |  30 +-
 .../scalars/integer/integer_eq_functions.sql  | 386 +++++++++---------
 .../scalars/integer/integer_eq_operators.sql  |  90 ++--
 src/v3/scalars/integer/integer_functions.sql  | 384 ++++++++---------
 src/v3/scalars/integer/integer_operators.sql  |  90 ++--
 .../integer/integer_ord_aggregates.sql        |  46 +--
 .../scalars/integer/integer_ord_functions.sql | 378 ++++++++---------
 .../integer/integer_ord_ope_aggregates.sql    |  46 +--
 .../integer/integer_ord_ope_functions.sql     | 378 ++++++++---------
 .../integer/integer_ord_ope_operators.sql     |  90 ++--
 .../scalars/integer/integer_ord_operators.sql |  90 ++--
 .../integer/integer_ord_ore_aggregates.sql    |  46 +--
 .../integer/integer_ord_ore_functions.sql     | 378 ++++++++---------
 .../integer/integer_ord_ore_operators.sql     |  90 ++--
 src/v3/scalars/integer/integer_types.sql      |  30 +-
 .../scalars/numeric/numeric_eq_functions.sql  | 386 +++++++++---------
 .../scalars/numeric/numeric_eq_operators.sql  |  90 ++--
 src/v3/scalars/numeric/numeric_functions.sql  | 384 ++++++++---------
 src/v3/scalars/numeric/numeric_operators.sql  |  90 ++--
 .../numeric/numeric_ord_aggregates.sql        |  46 +--
 .../scalars/numeric/numeric_ord_functions.sql | 378 ++++++++---------
 .../numeric/numeric_ord_ope_aggregates.sql    |  46 +--
 .../numeric/numeric_ord_ope_functions.sql     | 378 ++++++++---------
 .../numeric/numeric_ord_ope_operators.sql     |  90 ++--
 .../scalars/numeric/numeric_ord_operators.sql |  90 ++--
 .../numeric/numeric_ord_ore_aggregates.sql    |  46 +--
 .../numeric/numeric_ord_ore_functions.sql     | 378 ++++++++---------
 .../numeric/numeric_ord_ore_operators.sql     |  90 ++--
 src/v3/scalars/numeric/numeric_types.sql      |  30 +-
 src/v3/scalars/real/real_eq_functions.sql     | 386 +++++++++---------
 src/v3/scalars/real/real_eq_operators.sql     |  90 ++--
 src/v3/scalars/real/real_functions.sql        | 384 ++++++++---------
 src/v3/scalars/real/real_operators.sql        |  90 ++--
 src/v3/scalars/real/real_ord_aggregates.sql   |  46 +--
 src/v3/scalars/real/real_ord_functions.sql    | 378 ++++++++---------
 .../scalars/real/real_ord_ope_aggregates.sql  |  46 +--
 .../scalars/real/real_ord_ope_functions.sql   | 378 ++++++++---------
 .../scalars/real/real_ord_ope_operators.sql   |  90 ++--
 src/v3/scalars/real/real_ord_operators.sql    |  90 ++--
 .../scalars/real/real_ord_ore_aggregates.sql  |  46 +--
 .../scalars/real/real_ord_ore_functions.sql   | 378 ++++++++---------
 .../scalars/real/real_ord_ore_operators.sql   |  90 ++--
 src/v3/scalars/real/real_types.sql            |  30 +-
 .../smallint/smallint_eq_functions.sql        | 386 +++++++++---------
 .../smallint/smallint_eq_operators.sql        |  90 ++--
 .../scalars/smallint/smallint_functions.sql   | 384 ++++++++---------
 .../scalars/smallint/smallint_operators.sql   |  90 ++--
 .../smallint/smallint_ord_aggregates.sql      |  46 +--
 .../smallint/smallint_ord_functions.sql       | 378 ++++++++---------
 .../smallint/smallint_ord_ope_aggregates.sql  |  46 +--
 .../smallint/smallint_ord_ope_functions.sql   | 378 ++++++++---------
 .../smallint/smallint_ord_ope_operators.sql   |  90 ++--
 .../smallint/smallint_ord_operators.sql       |  90 ++--
 .../smallint/smallint_ord_ore_aggregates.sql  |  46 +--
 .../smallint/smallint_ord_ore_functions.sql   | 378 ++++++++---------
 .../smallint/smallint_ord_ore_operators.sql   |  90 ++--
 src/v3/scalars/smallint/smallint_types.sql    |  30 +-
 src/v3/scalars/text/text_eq_functions.sql     | 386 +++++++++---------
 src/v3/scalars/text/text_eq_operators.sql     |  90 ++--
 src/v3/scalars/text/text_functions.sql        | 384 ++++++++---------
 src/v3/scalars/text/text_match_functions.sql  | 386 +++++++++---------
 src/v3/scalars/text/text_match_operators.sql  |  90 ++--
 src/v3/scalars/text/text_operators.sql        |  90 ++--
 src/v3/scalars/text/text_ord_aggregates.sql   |  46 +--
 src/v3/scalars/text/text_ord_functions.sql    | 384 ++++++++---------
 .../scalars/text/text_ord_ope_aggregates.sql  |  46 +--
 .../scalars/text/text_ord_ope_functions.sql   | 384 ++++++++---------
 .../scalars/text/text_ord_ope_operators.sql   |  90 ++--
 src/v3/scalars/text/text_ord_operators.sql    |  90 ++--
 .../scalars/text/text_ord_ore_aggregates.sql  |  46 +--
 .../scalars/text/text_ord_ore_functions.sql   | 384 ++++++++---------
 .../scalars/text/text_ord_ore_operators.sql   |  90 ++--
 .../scalars/text/text_search_aggregates.sql   |  46 +--
 src/v3/scalars/text/text_search_functions.sql | 386 +++++++++---------
 src/v3/scalars/text/text_search_operators.sql |  90 ++--
 src/v3/scalars/text/text_types.sql            |  42 +-
 .../timestamp/timestamp_eq_functions.sql      | 386 +++++++++---------
 .../timestamp/timestamp_eq_operators.sql      |  90 ++--
 .../scalars/timestamp/timestamp_functions.sql | 384 ++++++++---------
 .../scalars/timestamp/timestamp_operators.sql |  90 ++--
 .../timestamp/timestamp_ord_aggregates.sql    |  46 +--
 .../timestamp/timestamp_ord_functions.sql     | 378 ++++++++---------
 .../timestamp_ord_ope_aggregates.sql          |  46 +--
 .../timestamp/timestamp_ord_ope_functions.sql | 378 ++++++++---------
 .../timestamp/timestamp_ord_ope_operators.sql |  90 ++--
 .../timestamp/timestamp_ord_operators.sql     |  90 ++--
 .../timestamp_ord_ore_aggregates.sql          |  46 +--
 .../timestamp/timestamp_ord_ore_functions.sql | 378 ++++++++---------
 .../timestamp/timestamp_ord_ore_operators.sql |  90 ++--
 src/v3/scalars/timestamp/timestamp_types.sql  |  30 +-
 138 files changed, 12152 insertions(+), 12130 deletions(-)

diff --git a/crates/eql-codegen/src/consts.rs b/crates/eql-codegen/src/consts.rs
index 81a314bad..49621a18b 100644
--- a/crates/eql-codegen/src/consts.rs
+++ b/crates/eql-codegen/src/consts.rs
@@ -14,13 +14,14 @@ pub(crate) const AUTO_GENERATED_MARKER: &str = "-- AUTOMATICALLY GENERATED FILE.
 pub(crate) const RUST_GENERATED_MARKER: &str =
     "// @generated by eql-codegen from the eql-domains catalog — do not edit";
 
-/// The public `eql_v3` API surface: the encrypted-domain families, query
-/// operators, index extractors, aggregates, AND the operator-backing comparison
-/// **wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`).
-/// The wrappers are public because they are the function-form equivalent of
-/// every supported operator — required on platforms without operator support
-/// (Supabase/PostgREST calls functions, not operators). Only index-term TYPES
-/// and never-invoked plumbing live in `INTERNAL_SCHEMA`.
+/// The public `eql_v3` API surface: query operators, index extractors,
+/// aggregates, AND the operator-backing comparison **wrappers**
+/// (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`). The wrappers
+/// are public because they are the function-form equivalent of every supported
+/// operator — required on platforms without operator support (Supabase/PostgREST
+/// calls functions, not operators). User-column encrypted domains live in
+/// `public`; only index-term TYPES and never-invoked plumbing live in
+/// `INTERNAL_SCHEMA`.
 pub(crate) const SCHEMA: &str = "eql_v3";
 
 /// The schema housing INTERNAL eql_v3 objects only: the SEM index-term types
diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs
index fdabe04c3..93c7fa2f3 100644
--- a/crates/eql-codegen/src/context.rs
+++ b/crates/eql-codegen/src/context.rs
@@ -122,7 +122,7 @@ pub enum FnEntry {
         function_name: String, // e.g. eq
         args: [SqlParam; 2],
         call_a: String, // e.g. eql_v3.eq_term(a)   (embeds extract_arg cast logic)
-        call_b: String, // e.g. eql_v3.eq_term(b::eql_v3.integer_eq)
+        call_b: String, // e.g. eql_v3.eq_term(b::public.integer_eq)
     },
     Unsupported {
         operator_lit: String,  // sql_str(op), escaped content for the RAISE literal
@@ -137,7 +137,7 @@ pub struct FunctionsContext {
     pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:"
     pub family_name: String,
     pub name: String,       // full domain name (family-name + "_" + domain-name)
-    pub dom: String,        // schema-qualified domain, e.g. eql_v3.integer_eq
+    pub dom: String,        // schema-qualified domain, e.g. public.integer_eq
     pub domain_lit: String, // sql_str(dom), defensively escaped for the RAISE literal
     pub entries: Vec,
 }
@@ -256,10 +256,11 @@ pub struct AggregatesContext {
     pub aggregates: &'static [AggregateOp], // == AGGREGATE_OPS
 }
 
-/// The schema-qualified SQL domain type name, e.g. `eql_v3.integer_eq`.
-/// Port of `domain_name`.
+/// The schema-qualified SQL domain type name, e.g. `public.integer_eq`.
+/// User-column encrypted domains intentionally live in `public` so dropping
+/// EQL-owned schemas cannot drop application columns.
 pub fn domain_name(name: &str) -> String {
-    format!("{SCHEMA}.{name}")
+    format!("public.{name}")
 }
 
 /// The extractor-call SQL for one operand, casting jsonb to the domain first.
@@ -306,8 +307,8 @@ mod tests {
     use super::*;
 
     #[test]
-    fn domain_name_qualifies_with_schema() {
-        assert_eq!(domain_name("integer_eq"), "eql_v3.integer_eq");
+    fn domain_name_qualifies_user_domains_with_public_schema() {
+        assert_eq!(domain_name("integer_eq"), "public.integer_eq");
     }
 
     #[test]
@@ -360,25 +361,25 @@ mod tests {
             // Supported comparison operator carries its planner metadata.
             (
                 "=",
-                "eql_v3.integer_eq",
+                "public.integer_eq",
                 true,
                 Some("COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel"),
             ),
             // The same operator, unsupported on this domain → no metadata line.
-            ("=", "eql_v3.integer", false, None),
+            ("=", "public.integer", false, None),
             // Supported but metadata-less operator (`->`) → still no metadata.
-            ("->", "eql_v3.integer_eq", true, None),
+            ("->", "public.integer_eq", true, None),
             // `@>` carries containment metadata when supported (the Bloom
             // `text_match` path).
             (
                 "@>",
-                "eql_v3.text_match",
+                "public.text_match",
                 true,
                 Some("COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel"),
             ),
             // ... but suppressed when `@>` is a blocker (non-Bloom domains),
             // which is why the integer reference is unchanged.
-            ("@>", "eql_v3.integer_eq", false, None),
+            ("@>", "public.integer_eq", false, None),
         ];
 
         for (symbol, dom, supported, expected) in cases {
diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs
index ace078757..5de9da165 100644
--- a/crates/eql-codegen/src/generate.rs
+++ b/crates/eql-codegen/src/generate.rs
@@ -569,12 +569,21 @@ mod tests {
             "integer_ord_ope",
         ] {
             assert!(
-                sql.contains(&format!("CREATE DOMAIN eql_v3.{dom} AS jsonb")),
+                sql.contains(&format!("CREATE DOMAIN public.{dom} AS jsonb")),
                 "missing {dom}"
             );
         }
     }
 
+    #[test]
+    fn generated_scalar_domains_are_created_only_in_public() {
+        let sql = render_types_file(spec("integer"));
+        assert!(sql.contains("CREATE DOMAIN public.integer AS jsonb"));
+        assert!(sql.contains("CREATE DOMAIN public.integer_eq AS jsonb"));
+        assert!(!sql.contains("CREATE DOMAIN eql_v3."));
+        assert!(!sql.contains("CREATE DOMAIN eql_v3_internal."));
+    }
+
     /// The non-empty-`ob` CHECK (issue #262) is emitted only on ORE-bearing
     /// domains. An empty ORE term (`ob: []`) is what encrypting the empty string
     /// into an ordered column produces; the constraint rejects it at the domain
@@ -596,7 +605,7 @@ mod tests {
             // non-empty-array CHECK on the OPE-bearing domain.
             ("integer_ord_ope", false),
         ] {
-            let head = format!("CREATE DOMAIN eql_v3.{dom} AS jsonb");
+            let head = format!("CREATE DOMAIN public.{dom} AS jsonb");
             let start = sql.find(&head).unwrap_or_else(|| panic!("missing {dom}"));
             // The CHECK ends at the closing `);` of this CREATE DOMAIN block.
             let end = start + sql[start..].find(");").expect("unterminated CHECK");
@@ -628,7 +637,7 @@ mod tests {
         let s = spec("integer");
         let sql = render_functions_file(s.name, domain(s, "eq"));
         assert_eq!(sql.matches("CREATE FUNCTION").count(), 45);
-        assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a eql_v3.integer_eq)"));
+        assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a public.integer_eq)"));
         assert!(sql.contains("RETURNS eql_v3_internal.hmac_256"));
         assert_eq!(
             sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE")
@@ -644,7 +653,7 @@ mod tests {
         let s = spec("integer");
         let sql = render_functions_file(s.name, domain(s, "ord"));
         assert_eq!(sql.matches("CREATE FUNCTION").count(), 45);
-        assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord)"));
+        assert!(sql.contains("CREATE FUNCTION eql_v3.ord_term(a public.integer_ord)"));
         assert!(sql.contains("RETURNS eql_v3_internal.ore_block_256"));
         assert_eq!(
             sql.matches("LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE")
@@ -665,7 +674,7 @@ mod tests {
         let s = spec("integer");
         let sql = render_functions_file(s.name, domain(s, "ord_ope"));
         assert_eq!(sql.matches("CREATE FUNCTION").count(), 45);
-        assert!(sql.contains("CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.integer_ord_ope)"));
+        assert!(sql.contains("CREATE FUNCTION eql_v3.ord_ope_term(a public.integer_ord_ope)"));
         assert!(sql.contains("RETURNS eql_v3_internal.ope_cllw"));
         assert!(sql.contains("-- REQUIRE: src/v3/sem/ope_cllw/functions.sql"));
         assert!(!sql.contains("-- REQUIRE: src/v3/sem/ope_cllw/operators.sql"));
@@ -684,6 +693,17 @@ mod tests {
         assert_eq!(sql.matches("CREATE OPERATOR").count(), 44);
     }
 
+    #[test]
+    fn generated_functions_reference_public_domain_arguments() {
+        let s = spec("integer");
+        let sql = render_functions_file(s.name, domain(s, "eq"));
+        assert!(sql.contains("CREATE FUNCTION eql_v3.eq_term(a public.integer_eq)"));
+        assert!(sql.contains("CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq)"));
+        assert!(sql.contains("CREATE FUNCTION eql_v3.eq(a public.integer_eq, b jsonb)"));
+        assert!(sql.contains("CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_eq)"));
+        assert!(!sql.contains("a eql_v3.integer_eq"));
+    }
+
     #[test]
     fn supported_operators_bind_public_wrapper_blocked_bind_internal() {
         // The operator-equivalent invariant for operator-free platforms: a
diff --git a/crates/eql-codegen/templates/types.sql.j2 b/crates/eql-codegen/templates/types.sql.j2
index 13ec1c628..71a2b27c1 100644
--- a/crates/eql-codegen/templates/types.sql.j2
+++ b/crates/eql-codegen/templates/types.sql.j2
@@ -7,12 +7,12 @@
 DO $$
 BEGIN
 {%- for d in domains %}
-  --! @brief Encrypted domain {{ schema }}.{{ d.name }}.
+  --! @brief Encrypted domain public.{{ d.name }}.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = '{{ d.typname }}' AND typnamespace = '{{ schema }}'::regnamespace
+    WHERE typname = '{{ d.typname }}' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN {{ schema }}.{{ d.name }} AS jsonb
+    CREATE DOMAIN public.{{ d.name }} AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         {%- for k in d.keys %}
diff --git a/src/v3/scalars/bigint/bigint_eq_functions.sql b/src/v3/scalars/bigint/bigint_eq_functions.sql
index 04c0d32cf..818012eb0 100644
--- a/src/v3/scalars/bigint/bigint_eq_functions.sql
+++ b/src/v3/scalars/bigint/bigint_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/bigint/bigint_eq_functions.sql
---! @brief Functions for eql_v3.bigint_eq.
+--! @brief Functions for public.bigint_eq.
 
---! @brief Index extractor for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Index extractor for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.bigint_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.bigint_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.bigint_eq) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_eq.
+--! @brief Operator wrapper for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.bigint_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.bigint_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.bigint_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.bigint_eq) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_eq.
+--! @brief Operator wrapper for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.bigint_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.bigint_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_eq, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param selector text
---! @return eql_v3.bigint_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_eq, selector text)
-RETURNS eql_v3.bigint_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_eq'; END; $$
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_eq, selector text)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param selector integer
---! @return eql_v3.bigint_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_eq, selector integer)
-RETURNS eql_v3.bigint_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_eq'; END; $$
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_eq, selector integer)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param selector eql_v3.bigint_eq
---! @return eql_v3.bigint_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.bigint_eq)
-RETURNS eql_v3.bigint_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_eq'; END; $$
+--! @param selector public.bigint_eq
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_eq)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param selector eql_v3.bigint_eq
+--! @param selector public.bigint_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.bigint_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.bigint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.bigint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.bigint_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.bigint_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.bigint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.bigint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.bigint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
---! @param b eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_eq, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_eq, b public.bigint_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
---! @param a eql_v3.bigint_eq
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_eq.
+--! @brief Unsupported operator blocker for public.bigint_eq.
 --! @param a jsonb
---! @param b eql_v3.bigint_eq
+--! @param b public.bigint_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.bigint_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/bigint/bigint_eq_operators.sql b/src/v3/scalars/bigint/bigint_eq_operators.sql
index 695a3388a..a9cff61fa 100644
--- a/src/v3/scalars/bigint/bigint_eq_operators.sql
+++ b/src/v3/scalars/bigint/bigint_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_eq_functions.sql
 
 --! @file encrypted_domain/bigint/bigint_eq_operators.sql
---! @brief Operators for eql_v3.bigint_eq.
+--! @brief Operators for public.bigint_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text
+  LEFTARG = public.bigint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = integer
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text
+  LEFTARG = public.bigint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = integer
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text
+  LEFTARG = public.bigint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text[]
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text[]
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text[]
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text[]
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text
+  LEFTARG = public.bigint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = integer
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text[]
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = text[]
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_eq, RIGHTARG = jsonb
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_eq
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
 );
diff --git a/src/v3/scalars/bigint/bigint_functions.sql b/src/v3/scalars/bigint/bigint_functions.sql
index 0c8fdf331..64032b892 100644
--- a/src/v3/scalars/bigint/bigint_functions.sql
+++ b/src/v3/scalars/bigint/bigint_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/bigint/bigint_functions.sql
---! @brief Functions for eql_v3.bigint.
+--! @brief Functions for public.bigint.
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.eq(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.neq(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param selector text
---! @return eql_v3.bigint
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint, selector text)
-RETURNS eql_v3.bigint IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint'; END; $$
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint, selector text)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param selector integer
---! @return eql_v3.bigint
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint, selector integer)
-RETURNS eql_v3.bigint IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint'; END; $$
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint, selector integer)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param selector eql_v3.bigint
---! @return eql_v3.bigint
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.bigint)
-RETURNS eql_v3.bigint IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint'; END; $$
+--! @param selector public.bigint
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param selector eql_v3.bigint
+--! @param selector public.bigint
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.bigint, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.bigint, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.bigint, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.bigint, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.bigint, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.bigint, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.bigint, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.bigint, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
---! @param b eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint, b public.bigint)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
---! @param a eql_v3.bigint
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint.
+--! @brief Unsupported operator blocker for public.bigint.
 --! @param a jsonb
---! @param b eql_v3.bigint
+--! @param b public.bigint
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.bigint)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/bigint/bigint_operators.sql b/src/v3/scalars/bigint/bigint_operators.sql
index 23d9ce08a..553ef4728 100644
--- a/src/v3/scalars/bigint/bigint_operators.sql
+++ b/src/v3/scalars/bigint/bigint_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_functions.sql
 
 --! @file encrypted_domain/bigint/bigint_operators.sql
---! @brief Operators for eql_v3.bigint.
+--! @brief Operators for public.bigint.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text
+  LEFTARG = public.bigint, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint, RIGHTARG = integer
+  LEFTARG = public.bigint, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text
+  LEFTARG = public.bigint, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint, RIGHTARG = integer
+  LEFTARG = public.bigint, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text
+  LEFTARG = public.bigint, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text[]
+  LEFTARG = public.bigint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text[]
+  LEFTARG = public.bigint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonpath
+  LEFTARG = public.bigint, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonpath
+  LEFTARG = public.bigint, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text[]
+  LEFTARG = public.bigint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text[]
+  LEFTARG = public.bigint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text
+  LEFTARG = public.bigint, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint, RIGHTARG = integer
+  LEFTARG = public.bigint, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text[]
+  LEFTARG = public.bigint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.bigint, RIGHTARG = text[]
+  LEFTARG = public.bigint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint, RIGHTARG = eql_v3.bigint
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint, RIGHTARG = jsonb
+  LEFTARG = public.bigint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint
+  LEFTARG = jsonb, RIGHTARG = public.bigint
 );
diff --git a/src/v3/scalars/bigint/bigint_ord_aggregates.sql b/src/v3/scalars/bigint/bigint_ord_aggregates.sql
index 5307d633f..1d70282f3 100644
--- a/src/v3/scalars/bigint/bigint_ord_aggregates.sql
+++ b/src/v3/scalars/bigint/bigint_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_ord_operators.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_aggregates.sql
---! @brief Aggregates for eql_v3.bigint_ord.
+--! @brief Aggregates for public.bigint_ord.
 
---! @brief State function for min on eql_v3.bigint_ord.
---! @param state eql_v3.bigint_ord
---! @param value eql_v3.bigint_ord
---! @return eql_v3.bigint_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.bigint_ord, value eql_v3.bigint_ord)
-RETURNS eql_v3.bigint_ord
+--! @brief State function for min on public.bigint_ord.
+--! @param state public.bigint_ord
+--! @param value public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord, value public.bigint_ord)
+RETURNS public.bigint_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.bigint_ord.
---! @param input eql_v3.bigint_ord
---! @return eql_v3.bigint_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.bigint_ord) (
+--! @brief min aggregate for public.bigint_ord.
+--! @param input public.bigint_ord
+--! @return public.bigint_ord
+CREATE AGGREGATE eql_v3.min(public.bigint_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.bigint_ord,
+  stype = public.bigint_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.bigint_ord.
---! @param state eql_v3.bigint_ord
---! @param value eql_v3.bigint_ord
---! @return eql_v3.bigint_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.bigint_ord, value eql_v3.bigint_ord)
-RETURNS eql_v3.bigint_ord
+--! @brief State function for max on public.bigint_ord.
+--! @param state public.bigint_ord
+--! @param value public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord, value public.bigint_ord)
+RETURNS public.bigint_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.bigint_ord.
---! @param input eql_v3.bigint_ord
---! @return eql_v3.bigint_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.bigint_ord) (
+--! @brief max aggregate for public.bigint_ord.
+--! @param input public.bigint_ord
+--! @return public.bigint_ord
+CREATE AGGREGATE eql_v3.max(public.bigint_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.bigint_ord,
+  stype = public.bigint_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/bigint/bigint_ord_functions.sql b/src/v3/scalars/bigint/bigint_ord_functions.sql
index e663f48b7..d6cf0303f 100644
--- a/src/v3/scalars/bigint/bigint_ord_functions.sql
+++ b/src/v3/scalars/bigint/bigint_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_functions.sql
---! @brief Functions for eql_v3.bigint_ord.
+--! @brief Functions for public.bigint_ord.
 
---! @brief Index extractor for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Index extractor for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.bigint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.bigint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
+--! @brief Operator wrapper for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.bigint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.bigint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
+--! @brief Operator wrapper for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.bigint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.bigint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
+--! @brief Operator wrapper for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.bigint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.bigint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
+--! @brief Operator wrapper for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.bigint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.bigint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
+--! @brief Operator wrapper for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.bigint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.bigint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord.
+--! @brief Operator wrapper for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
+--! @brief Unsupported operator blocker for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord, b public.bigint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
+--! @brief Unsupported operator blocker for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param selector text
---! @return eql_v3.bigint_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_ord, selector text)
-RETURNS eql_v3.bigint_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord'; END; $$
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord, selector text)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param selector integer
---! @return eql_v3.bigint_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_ord, selector integer)
-RETURNS eql_v3.bigint_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord'; END; $$
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord, selector integer)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
+--! @brief Unsupported operator blocker for public.bigint_ord.
 --! @param a jsonb
---! @param selector eql_v3.bigint_ord
---! @return eql_v3.bigint_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.bigint_ord)
-RETURNS eql_v3.bigint_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord'; END; $$
+--! @param selector public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
+--! @brief Unsupported operator blocker for public.bigint_ord.
 --! @param a jsonb
---! @param selector eql_v3.bigint_ord
+--! @param selector public.bigint_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.bigint_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.bigint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.bigint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.bigint_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.bigint_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.bigint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.bigint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.bigint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
---! @param b eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_ord, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord, b public.bigint_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
---! @param a eql_v3.bigint_ord
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord.
+--! @brief Unsupported operator blocker for public.bigint_ord.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord
+--! @param b public.bigint_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.bigint_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/bigint/bigint_ord_ope_aggregates.sql b/src/v3/scalars/bigint/bigint_ord_ope_aggregates.sql
index 17641f32e..5bad3f569 100644
--- a/src/v3/scalars/bigint/bigint_ord_ope_aggregates.sql
+++ b/src/v3/scalars/bigint/bigint_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ope_operators.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.bigint_ord_ope.
+--! @brief Aggregates for public.bigint_ord_ope.
 
---! @brief State function for min on eql_v3.bigint_ord_ope.
---! @param state eql_v3.bigint_ord_ope
---! @param value eql_v3.bigint_ord_ope
---! @return eql_v3.bigint_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.bigint_ord_ope, value eql_v3.bigint_ord_ope)
-RETURNS eql_v3.bigint_ord_ope
+--! @brief State function for min on public.bigint_ord_ope.
+--! @param state public.bigint_ord_ope
+--! @param value public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord_ope, value public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.bigint_ord_ope.
---! @param input eql_v3.bigint_ord_ope
---! @return eql_v3.bigint_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.bigint_ord_ope) (
+--! @brief min aggregate for public.bigint_ord_ope.
+--! @param input public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE AGGREGATE eql_v3.min(public.bigint_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.bigint_ord_ope,
+  stype = public.bigint_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.bigint_ord_ope.
---! @param state eql_v3.bigint_ord_ope
---! @param value eql_v3.bigint_ord_ope
---! @return eql_v3.bigint_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.bigint_ord_ope, value eql_v3.bigint_ord_ope)
-RETURNS eql_v3.bigint_ord_ope
+--! @brief State function for max on public.bigint_ord_ope.
+--! @param state public.bigint_ord_ope
+--! @param value public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord_ope, value public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.bigint_ord_ope.
---! @param input eql_v3.bigint_ord_ope
---! @return eql_v3.bigint_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.bigint_ord_ope) (
+--! @brief max aggregate for public.bigint_ord_ope.
+--! @param input public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE AGGREGATE eql_v3.max(public.bigint_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.bigint_ord_ope,
+  stype = public.bigint_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/bigint/bigint_ord_ope_functions.sql b/src/v3/scalars/bigint/bigint_ord_ope_functions.sql
index 92d0442cc..0b6668394 100644
--- a/src/v3/scalars/bigint/bigint_ord_ope_functions.sql
+++ b/src/v3/scalars/bigint/bigint_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_ope_functions.sql
---! @brief Functions for eql_v3.bigint_ord_ope.
+--! @brief Functions for public.bigint_ord_ope.
 
---! @brief Index extractor for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Index extractor for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.bigint_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.bigint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
+--! @brief Operator wrapper for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.bigint_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.bigint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
+--! @brief Operator wrapper for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.bigint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.bigint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
+--! @brief Operator wrapper for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.bigint_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.bigint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
+--! @brief Operator wrapper for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.bigint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.bigint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
+--! @brief Operator wrapper for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.bigint_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.bigint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ope.
+--! @brief Operator wrapper for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.bigint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param selector text
---! @return eql_v3.bigint_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_ord_ope, selector text)
-RETURNS eql_v3.bigint_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord_ope'; END; $$
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ope, selector text)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param selector integer
---! @return eql_v3.bigint_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_ord_ope, selector integer)
-RETURNS eql_v3.bigint_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord_ope'; END; $$
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ope, selector integer)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.bigint_ord_ope
---! @return eql_v3.bigint_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.bigint_ord_ope)
-RETURNS eql_v3.bigint_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord_ope'; END; $$
+--! @param selector public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.bigint_ord_ope
+--! @param selector public.bigint_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.bigint_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.bigint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.bigint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.bigint_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.bigint_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.bigint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.bigint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.bigint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
---! @param b eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_ord_ope, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ope, b public.bigint_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
---! @param a eql_v3.bigint_ord_ope
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ope.
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ope
+--! @param b public.bigint_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.bigint_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/bigint/bigint_ord_ope_operators.sql b/src/v3/scalars/bigint/bigint_ord_ope_operators.sql
index 1fbda4956..162d515ad 100644
--- a/src/v3/scalars/bigint/bigint_ord_ope_operators.sql
+++ b/src/v3/scalars/bigint/bigint_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ope_functions.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_ope_operators.sql
---! @brief Operators for eql_v3.bigint_ord_ope.
+--! @brief Operators for public.bigint_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = integer
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = integer
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = integer
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
 );
diff --git a/src/v3/scalars/bigint/bigint_ord_operators.sql b/src/v3/scalars/bigint/bigint_ord_operators.sql
index 1ac906f8d..138eae971 100644
--- a/src/v3/scalars/bigint/bigint_ord_operators.sql
+++ b/src/v3/scalars/bigint/bigint_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_ord_functions.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_operators.sql
---! @brief Operators for eql_v3.bigint_ord.
+--! @brief Operators for public.bigint_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text
+  LEFTARG = public.bigint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = integer
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text
+  LEFTARG = public.bigint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = integer
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text
+  LEFTARG = public.bigint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text
+  LEFTARG = public.bigint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = integer
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_ord, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
 );
diff --git a/src/v3/scalars/bigint/bigint_ord_ore_aggregates.sql b/src/v3/scalars/bigint/bigint_ord_ore_aggregates.sql
index 9d03f4582..1aa6dc958 100644
--- a/src/v3/scalars/bigint/bigint_ord_ore_aggregates.sql
+++ b/src/v3/scalars/bigint/bigint_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ore_operators.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.bigint_ord_ore.
+--! @brief Aggregates for public.bigint_ord_ore.
 
---! @brief State function for min on eql_v3.bigint_ord_ore.
---! @param state eql_v3.bigint_ord_ore
---! @param value eql_v3.bigint_ord_ore
---! @return eql_v3.bigint_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.bigint_ord_ore, value eql_v3.bigint_ord_ore)
-RETURNS eql_v3.bigint_ord_ore
+--! @brief State function for min on public.bigint_ord_ore.
+--! @param state public.bigint_ord_ore
+--! @param value public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord_ore, value public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.bigint_ord_ore.
---! @param input eql_v3.bigint_ord_ore
---! @return eql_v3.bigint_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.bigint_ord_ore) (
+--! @brief min aggregate for public.bigint_ord_ore.
+--! @param input public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE AGGREGATE eql_v3.min(public.bigint_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.bigint_ord_ore,
+  stype = public.bigint_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.bigint_ord_ore.
---! @param state eql_v3.bigint_ord_ore
---! @param value eql_v3.bigint_ord_ore
---! @return eql_v3.bigint_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.bigint_ord_ore, value eql_v3.bigint_ord_ore)
-RETURNS eql_v3.bigint_ord_ore
+--! @brief State function for max on public.bigint_ord_ore.
+--! @param state public.bigint_ord_ore
+--! @param value public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord_ore, value public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.bigint_ord_ore.
---! @param input eql_v3.bigint_ord_ore
---! @return eql_v3.bigint_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.bigint_ord_ore) (
+--! @brief max aggregate for public.bigint_ord_ore.
+--! @param input public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE AGGREGATE eql_v3.max(public.bigint_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.bigint_ord_ore,
+  stype = public.bigint_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/bigint/bigint_ord_ore_functions.sql b/src/v3/scalars/bigint/bigint_ord_ore_functions.sql
index 0bb73b04a..7974af862 100644
--- a/src/v3/scalars/bigint/bigint_ord_ore_functions.sql
+++ b/src/v3/scalars/bigint/bigint_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_ore_functions.sql
---! @brief Functions for eql_v3.bigint_ord_ore.
+--! @brief Functions for public.bigint_ord_ore.
 
---! @brief Index extractor for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Index extractor for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.bigint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.bigint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
+--! @brief Operator wrapper for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.bigint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.bigint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
+--! @brief Operator wrapper for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.bigint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.bigint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
+--! @brief Operator wrapper for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.bigint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.bigint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
+--! @brief Operator wrapper for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.bigint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.bigint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
+--! @brief Operator wrapper for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.bigint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.bigint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.bigint_ord_ore.
+--! @brief Operator wrapper for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.bigint_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param selector text
---! @return eql_v3.bigint_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_ord_ore, selector text)
-RETURNS eql_v3.bigint_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord_ore'; END; $$
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ore, selector text)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param selector integer
---! @return eql_v3.bigint_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.bigint_ord_ore, selector integer)
-RETURNS eql_v3.bigint_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord_ore'; END; $$
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ore, selector integer)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.bigint_ord_ore
---! @return eql_v3.bigint_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.bigint_ord_ore)
-RETURNS eql_v3.bigint_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.bigint_ord_ore'; END; $$
+--! @param selector public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.bigint_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.bigint_ord_ore
+--! @param selector public.bigint_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.bigint_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.bigint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.bigint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.bigint_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.bigint_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.bigint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.bigint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.bigint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.bigint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
---! @param b eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_ord_ore, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ore, b public.bigint_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
---! @param a eql_v3.bigint_ord_ore
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.bigint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.bigint_ord_ore.
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.bigint_ord_ore
+--! @param b public.bigint_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.bigint_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.bigint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/bigint/bigint_ord_ore_operators.sql b/src/v3/scalars/bigint/bigint_ord_ore_operators.sql
index 9b02900a8..5875623c8 100644
--- a/src/v3/scalars/bigint/bigint_ord_ore_operators.sql
+++ b/src/v3/scalars/bigint/bigint_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ore_functions.sql
 
 --! @file encrypted_domain/bigint/bigint_ord_ore_operators.sql
---! @brief Operators for eql_v3.bigint_ord_ore.
+--! @brief Operators for public.bigint_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = integer
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = integer
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = integer
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.bigint_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.bigint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
 );
diff --git a/src/v3/scalars/bigint/bigint_types.sql b/src/v3/scalars/bigint/bigint_types.sql
index e28392e92..2597bd991 100644
--- a/src/v3/scalars/bigint/bigint_types.sql
+++ b/src/v3/scalars/bigint/bigint_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.bigint.
+  --! @brief Encrypted domain public.bigint.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'bigint' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'bigint' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.bigint AS jsonb
+    CREATE DOMAIN public.bigint AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.bigint_eq.
+  --! @brief Encrypted domain public.bigint_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'bigint_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'bigint_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.bigint_eq AS jsonb
+    CREATE DOMAIN public.bigint_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.bigint_ord_ore.
+  --! @brief Encrypted domain public.bigint_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'bigint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'bigint_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.bigint_ord_ore AS jsonb
+    CREATE DOMAIN public.bigint_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.bigint_ord.
+  --! @brief Encrypted domain public.bigint_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'bigint_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'bigint_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.bigint_ord AS jsonb
+    CREATE DOMAIN public.bigint_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.bigint_ord_ope.
+  --! @brief Encrypted domain public.bigint_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'bigint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'bigint_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.bigint_ord_ope AS jsonb
+    CREATE DOMAIN public.bigint_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/boolean/boolean_functions.sql b/src/v3/scalars/boolean/boolean_functions.sql
index c3c51ce3b..ae096e6b5 100644
--- a/src/v3/scalars/boolean/boolean_functions.sql
+++ b/src/v3/scalars/boolean/boolean_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/boolean/boolean_functions.sql
---! @brief Functions for eql_v3.boolean.
+--! @brief Functions for public.boolean.
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.eq(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.neq(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.lt(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.lte(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.gt(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.gte(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.contains(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.boolean, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.boolean, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.boolean)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param selector text
---! @return eql_v3.boolean
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.boolean, selector text)
-RETURNS eql_v3.boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.boolean'; END; $$
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a public.boolean, selector text)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param selector integer
---! @return eql_v3.boolean
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.boolean, selector integer)
-RETURNS eql_v3.boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.boolean'; END; $$
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a public.boolean, selector integer)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param selector eql_v3.boolean
---! @return eql_v3.boolean
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.boolean)
-RETURNS eql_v3.boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.boolean'; END; $$
+--! @param selector public.boolean
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.boolean)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.boolean, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.boolean, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.boolean, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.boolean, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param selector eql_v3.boolean
+--! @param selector public.boolean
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.boolean)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.boolean, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.boolean, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.boolean, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.boolean, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.boolean, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.boolean, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.boolean, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.boolean, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.boolean, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.boolean, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.boolean, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.boolean, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.boolean, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.boolean, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.boolean, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.boolean, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.boolean, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.boolean, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.boolean, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
---! @param b eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.boolean, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal."||"(a public.boolean, b public.boolean)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
---! @param a eql_v3.boolean
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.boolean, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.boolean, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.boolean.
+--! @brief Unsupported operator blocker for public.boolean.
 --! @param a jsonb
---! @param b eql_v3.boolean
+--! @param b public.boolean
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.boolean)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.boolean)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.boolean'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/boolean/boolean_operators.sql b/src/v3/scalars/boolean/boolean_operators.sql
index e558f5e8e..ffda1c7dc 100644
--- a/src/v3/scalars/boolean/boolean_operators.sql
+++ b/src/v3/scalars/boolean/boolean_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/boolean/boolean_functions.sql
 
 --! @file encrypted_domain/boolean/boolean_operators.sql
---! @brief Operators for eql_v3.boolean.
+--! @brief Operators for public.boolean.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text
+  LEFTARG = public.boolean, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.boolean, RIGHTARG = integer
+  LEFTARG = public.boolean, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text
+  LEFTARG = public.boolean, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.boolean, RIGHTARG = integer
+  LEFTARG = public.boolean, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text
+  LEFTARG = public.boolean, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text[]
+  LEFTARG = public.boolean, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text[]
+  LEFTARG = public.boolean, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonpath
+  LEFTARG = public.boolean, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonpath
+  LEFTARG = public.boolean, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text[]
+  LEFTARG = public.boolean, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text[]
+  LEFTARG = public.boolean, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text
+  LEFTARG = public.boolean, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.boolean, RIGHTARG = integer
+  LEFTARG = public.boolean, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text[]
+  LEFTARG = public.boolean, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.boolean, RIGHTARG = text[]
+  LEFTARG = public.boolean, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.boolean, RIGHTARG = eql_v3.boolean
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.boolean, RIGHTARG = jsonb
+  LEFTARG = public.boolean, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.boolean
+  LEFTARG = jsonb, RIGHTARG = public.boolean
 );
diff --git a/src/v3/scalars/boolean/boolean_types.sql b/src/v3/scalars/boolean/boolean_types.sql
index 42032e5f7..d61df957f 100644
--- a/src/v3/scalars/boolean/boolean_types.sql
+++ b/src/v3/scalars/boolean/boolean_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.boolean.
+  --! @brief Encrypted domain public.boolean.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'boolean' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'boolean' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.boolean AS jsonb
+    CREATE DOMAIN public.boolean AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/date/date_eq_functions.sql b/src/v3/scalars/date/date_eq_functions.sql
index 45dc557be..772793a76 100644
--- a/src/v3/scalars/date/date_eq_functions.sql
+++ b/src/v3/scalars/date/date_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/date/date_eq_functions.sql
---! @brief Functions for eql_v3.date_eq.
+--! @brief Functions for public.date_eq.
 
---! @brief Index extractor for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Index extractor for public.date_eq.
+--! @param a public.date_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.date_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.date_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b public.date_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.date_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.date_eq) $$;
 
---! @brief Operator wrapper for eql_v3.date_eq.
+--! @brief Operator wrapper for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.date_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.date_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b public.date_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.date_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.date_eq) $$;
 
---! @brief Operator wrapper for eql_v3.date_eq.
+--! @brief Operator wrapper for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.date_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.date_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.date_eq, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.date_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.date_eq, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.date_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.date_eq, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.date_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.date_eq, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.date_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_eq, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_eq, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param selector text
---! @return eql_v3.date_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_eq, selector text)
-RETURNS eql_v3.date_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_eq'; END; $$
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.date_eq, selector text)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param selector integer
---! @return eql_v3.date_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_eq, selector integer)
-RETURNS eql_v3.date_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_eq'; END; $$
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.date_eq, selector integer)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param selector eql_v3.date_eq
---! @return eql_v3.date_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.date_eq)
-RETURNS eql_v3.date_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_eq'; END; $$
+--! @param selector public.date_eq
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_eq)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param selector eql_v3.date_eq
+--! @param selector public.date_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.date_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.date_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.date_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.date_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.date_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.date_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.date_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.date_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.date_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
---! @param b eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_eq, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_eq, b public.date_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
---! @param a eql_v3.date_eq
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_eq.
+--! @brief Unsupported operator blocker for public.date_eq.
 --! @param a jsonb
---! @param b eql_v3.date_eq
+--! @param b public.date_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.date_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/date/date_eq_operators.sql b/src/v3/scalars/date/date_eq_operators.sql
index 9168e0452..abb6a578b 100644
--- a/src/v3/scalars/date/date_eq_operators.sql
+++ b/src/v3/scalars/date/date_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/date/date_eq_functions.sql
 
 --! @file encrypted_domain/date/date_eq_operators.sql
---! @brief Operators for eql_v3.date_eq.
+--! @brief Operators for public.date_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text
+  LEFTARG = public.date_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = integer
+  LEFTARG = public.date_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text
+  LEFTARG = public.date_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = integer
+  LEFTARG = public.date_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text
+  LEFTARG = public.date_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text[]
+  LEFTARG = public.date_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text[]
+  LEFTARG = public.date_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonpath
+  LEFTARG = public.date_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonpath
+  LEFTARG = public.date_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text[]
+  LEFTARG = public.date_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text[]
+  LEFTARG = public.date_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text
+  LEFTARG = public.date_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = integer
+  LEFTARG = public.date_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text[]
+  LEFTARG = public.date_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = text[]
+  LEFTARG = public.date_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = eql_v3.date_eq
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_eq, RIGHTARG = jsonb
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_eq
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
 );
diff --git a/src/v3/scalars/date/date_functions.sql b/src/v3/scalars/date/date_functions.sql
index dfd15f676..ea05c818d 100644
--- a/src/v3/scalars/date/date_functions.sql
+++ b/src/v3/scalars/date/date_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/date/date_functions.sql
---! @brief Functions for eql_v3.date.
+--! @brief Functions for public.date.
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.eq(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.neq(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.lt(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.lte(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.gt(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.gte(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.contains(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param selector text
---! @return eql_v3.date
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date, selector text)
-RETURNS eql_v3.date IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date'; END; $$
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a public.date, selector text)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param selector integer
---! @return eql_v3.date
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date, selector integer)
-RETURNS eql_v3.date IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date'; END; $$
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a public.date, selector integer)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param selector eql_v3.date
---! @return eql_v3.date
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.date)
-RETURNS eql_v3.date IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date'; END; $$
+--! @param selector public.date
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param selector eql_v3.date
+--! @param selector public.date
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.date)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.date, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.date, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.date, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.date, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.date, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.date, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.date, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.date, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.date, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.date, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.date, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.date, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.date, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.date, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.date, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
---! @param b eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal."||"(a public.date, b public.date)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
---! @param a eql_v3.date
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.date, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date.
+--! @brief Unsupported operator blocker for public.date.
 --! @param a jsonb
---! @param b eql_v3.date
+--! @param b public.date
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.date)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/date/date_operators.sql b/src/v3/scalars/date/date_operators.sql
index 053fb4873..335bbc33d 100644
--- a/src/v3/scalars/date/date_operators.sql
+++ b/src/v3/scalars/date/date_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/date/date_functions.sql
 
 --! @file encrypted_domain/date/date_operators.sql
---! @brief Operators for eql_v3.date.
+--! @brief Operators for public.date.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date, RIGHTARG = text
+  LEFTARG = public.date, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date, RIGHTARG = integer
+  LEFTARG = public.date, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date, RIGHTARG = text
+  LEFTARG = public.date, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date, RIGHTARG = integer
+  LEFTARG = public.date, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.date, RIGHTARG = text
+  LEFTARG = public.date, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.date, RIGHTARG = text[]
+  LEFTARG = public.date, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.date, RIGHTARG = text[]
+  LEFTARG = public.date, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.date, RIGHTARG = jsonpath
+  LEFTARG = public.date, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.date, RIGHTARG = jsonpath
+  LEFTARG = public.date, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.date, RIGHTARG = text[]
+  LEFTARG = public.date, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.date, RIGHTARG = text[]
+  LEFTARG = public.date, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date, RIGHTARG = text
+  LEFTARG = public.date, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date, RIGHTARG = integer
+  LEFTARG = public.date, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date, RIGHTARG = text[]
+  LEFTARG = public.date, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.date, RIGHTARG = text[]
+  LEFTARG = public.date, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date, RIGHTARG = eql_v3.date
+  LEFTARG = public.date, RIGHTARG = public.date
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date, RIGHTARG = jsonb
+  LEFTARG = public.date, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date
+  LEFTARG = jsonb, RIGHTARG = public.date
 );
diff --git a/src/v3/scalars/date/date_ord_aggregates.sql b/src/v3/scalars/date/date_ord_aggregates.sql
index 2081653b7..cf4a70294 100644
--- a/src/v3/scalars/date/date_ord_aggregates.sql
+++ b/src/v3/scalars/date/date_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/date/date_ord_operators.sql
 
 --! @file encrypted_domain/date/date_ord_aggregates.sql
---! @brief Aggregates for eql_v3.date_ord.
+--! @brief Aggregates for public.date_ord.
 
---! @brief State function for min on eql_v3.date_ord.
---! @param state eql_v3.date_ord
---! @param value eql_v3.date_ord
---! @return eql_v3.date_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.date_ord, value eql_v3.date_ord)
-RETURNS eql_v3.date_ord
+--! @brief State function for min on public.date_ord.
+--! @param state public.date_ord
+--! @param value public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord, value public.date_ord)
+RETURNS public.date_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.date_ord.
---! @param input eql_v3.date_ord
---! @return eql_v3.date_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.date_ord) (
+--! @brief min aggregate for public.date_ord.
+--! @param input public.date_ord
+--! @return public.date_ord
+CREATE AGGREGATE eql_v3.min(public.date_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.date_ord,
+  stype = public.date_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.date_ord.
---! @param state eql_v3.date_ord
---! @param value eql_v3.date_ord
---! @return eql_v3.date_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.date_ord, value eql_v3.date_ord)
-RETURNS eql_v3.date_ord
+--! @brief State function for max on public.date_ord.
+--! @param state public.date_ord
+--! @param value public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord, value public.date_ord)
+RETURNS public.date_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.date_ord.
---! @param input eql_v3.date_ord
---! @return eql_v3.date_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.date_ord) (
+--! @brief max aggregate for public.date_ord.
+--! @param input public.date_ord
+--! @return public.date_ord
+CREATE AGGREGATE eql_v3.max(public.date_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.date_ord,
+  stype = public.date_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/date/date_ord_functions.sql b/src/v3/scalars/date/date_ord_functions.sql
index cfa4cc55a..fd952d03d 100644
--- a/src/v3/scalars/date/date_ord_functions.sql
+++ b/src/v3/scalars/date/date_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/date/date_ord_functions.sql
---! @brief Functions for eql_v3.date_ord.
+--! @brief Functions for public.date_ord.
 
---! @brief Index extractor for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Index extractor for public.date_ord.
+--! @param a public.date_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.date_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.date_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.date_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.date_ord) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
+--! @brief Operator wrapper for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.date_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.date_ord) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
+--! @brief Operator wrapper for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.date_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.date_ord) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
+--! @brief Operator wrapper for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.date_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.date_ord) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
+--! @brief Operator wrapper for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.date_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.date_ord) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
+--! @brief Operator wrapper for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.date_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.date_ord) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord.
+--! @brief Operator wrapper for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord, b public.date_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
+--! @brief Unsupported operator blocker for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord, b public.date_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
+--! @brief Unsupported operator blocker for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param selector text
---! @return eql_v3.date_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_ord, selector text)
-RETURNS eql_v3.date_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord'; END; $$
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord, selector text)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param selector integer
---! @return eql_v3.date_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_ord, selector integer)
-RETURNS eql_v3.date_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord'; END; $$
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord, selector integer)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
+--! @brief Unsupported operator blocker for public.date_ord.
 --! @param a jsonb
---! @param selector eql_v3.date_ord
---! @return eql_v3.date_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.date_ord)
-RETURNS eql_v3.date_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord'; END; $$
+--! @param selector public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
+--! @brief Unsupported operator blocker for public.date_ord.
 --! @param a jsonb
---! @param selector eql_v3.date_ord
+--! @param selector public.date_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.date_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.date_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.date_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.date_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.date_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.date_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.date_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.date_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.date_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
---! @param b eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_ord, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord, b public.date_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
---! @param a eql_v3.date_ord
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord.
+--! @brief Unsupported operator blocker for public.date_ord.
 --! @param a jsonb
---! @param b eql_v3.date_ord
+--! @param b public.date_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.date_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/date/date_ord_ope_aggregates.sql b/src/v3/scalars/date/date_ord_ope_aggregates.sql
index cf9213411..154be31b9 100644
--- a/src/v3/scalars/date/date_ord_ope_aggregates.sql
+++ b/src/v3/scalars/date/date_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/date/date_ord_ope_operators.sql
 
 --! @file encrypted_domain/date/date_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.date_ord_ope.
+--! @brief Aggregates for public.date_ord_ope.
 
---! @brief State function for min on eql_v3.date_ord_ope.
---! @param state eql_v3.date_ord_ope
---! @param value eql_v3.date_ord_ope
---! @return eql_v3.date_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.date_ord_ope, value eql_v3.date_ord_ope)
-RETURNS eql_v3.date_ord_ope
+--! @brief State function for min on public.date_ord_ope.
+--! @param state public.date_ord_ope
+--! @param value public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord_ope, value public.date_ord_ope)
+RETURNS public.date_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.date_ord_ope.
---! @param input eql_v3.date_ord_ope
---! @return eql_v3.date_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.date_ord_ope) (
+--! @brief min aggregate for public.date_ord_ope.
+--! @param input public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE AGGREGATE eql_v3.min(public.date_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.date_ord_ope,
+  stype = public.date_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.date_ord_ope.
---! @param state eql_v3.date_ord_ope
---! @param value eql_v3.date_ord_ope
---! @return eql_v3.date_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.date_ord_ope, value eql_v3.date_ord_ope)
-RETURNS eql_v3.date_ord_ope
+--! @brief State function for max on public.date_ord_ope.
+--! @param state public.date_ord_ope
+--! @param value public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord_ope, value public.date_ord_ope)
+RETURNS public.date_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.date_ord_ope.
---! @param input eql_v3.date_ord_ope
---! @return eql_v3.date_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.date_ord_ope) (
+--! @brief max aggregate for public.date_ord_ope.
+--! @param input public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE AGGREGATE eql_v3.max(public.date_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.date_ord_ope,
+  stype = public.date_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/date/date_ord_ope_functions.sql b/src/v3/scalars/date/date_ord_ope_functions.sql
index 0f73a3eb2..9dcbc7c8e 100644
--- a/src/v3/scalars/date/date_ord_ope_functions.sql
+++ b/src/v3/scalars/date/date_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/date/date_ord_ope_functions.sql
---! @brief Functions for eql_v3.date_ord_ope.
+--! @brief Functions for public.date_ord_ope.
 
---! @brief Index extractor for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Index extractor for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.date_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.date_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
+--! @brief Operator wrapper for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.date_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.date_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
+--! @brief Operator wrapper for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.date_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.date_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
+--! @brief Operator wrapper for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.date_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.date_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
+--! @brief Operator wrapper for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.date_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.date_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
+--! @brief Operator wrapper for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.date_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.date_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ope.
+--! @brief Operator wrapper for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.date_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
+--! @brief Unsupported operator blocker for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
+--! @brief Unsupported operator blocker for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param selector text
---! @return eql_v3.date_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_ord_ope, selector text)
-RETURNS eql_v3.date_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ope'; END; $$
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ope, selector text)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param selector integer
---! @return eql_v3.date_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_ord_ope, selector integer)
-RETURNS eql_v3.date_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ope'; END; $$
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ope, selector integer)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
+--! @brief Unsupported operator blocker for public.date_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.date_ord_ope
---! @return eql_v3.date_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.date_ord_ope)
-RETURNS eql_v3.date_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ope'; END; $$
+--! @param selector public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord_ope)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
+--! @brief Unsupported operator blocker for public.date_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.date_ord_ope
+--! @param selector public.date_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.date_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.date_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.date_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.date_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.date_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.date_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.date_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.date_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
---! @param b eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_ord_ope, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ope, b public.date_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
---! @param a eql_v3.date_ord_ope
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ope.
+--! @brief Unsupported operator blocker for public.date_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ope
+--! @param b public.date_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.date_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/date/date_ord_ope_operators.sql b/src/v3/scalars/date/date_ord_ope_operators.sql
index c366b2154..a37c5dea5 100644
--- a/src/v3/scalars/date/date_ord_ope_operators.sql
+++ b/src/v3/scalars/date/date_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/date/date_ord_ope_functions.sql
 
 --! @file encrypted_domain/date/date_ord_ope_operators.sql
---! @brief Operators for eql_v3.date_ord_ope.
+--! @brief Operators for public.date_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = integer
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = integer
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = integer
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
 );
diff --git a/src/v3/scalars/date/date_ord_operators.sql b/src/v3/scalars/date/date_ord_operators.sql
index 4ad580821..b165ace2c 100644
--- a/src/v3/scalars/date/date_ord_operators.sql
+++ b/src/v3/scalars/date/date_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/date/date_ord_functions.sql
 
 --! @file encrypted_domain/date/date_ord_operators.sql
---! @brief Operators for eql_v3.date_ord.
+--! @brief Operators for public.date_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text
+  LEFTARG = public.date_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = integer
+  LEFTARG = public.date_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text
+  LEFTARG = public.date_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = integer
+  LEFTARG = public.date_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text
+  LEFTARG = public.date_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text[]
+  LEFTARG = public.date_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text[]
+  LEFTARG = public.date_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonpath
+  LEFTARG = public.date_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonpath
+  LEFTARG = public.date_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text[]
+  LEFTARG = public.date_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text[]
+  LEFTARG = public.date_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text
+  LEFTARG = public.date_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = integer
+  LEFTARG = public.date_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text[]
+  LEFTARG = public.date_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = text[]
+  LEFTARG = public.date_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = eql_v3.date_ord
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_ord, RIGHTARG = jsonb
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
 );
diff --git a/src/v3/scalars/date/date_ord_ore_aggregates.sql b/src/v3/scalars/date/date_ord_ore_aggregates.sql
index ba814a6c6..59daacedf 100644
--- a/src/v3/scalars/date/date_ord_ore_aggregates.sql
+++ b/src/v3/scalars/date/date_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/date/date_ord_ore_operators.sql
 
 --! @file encrypted_domain/date/date_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.date_ord_ore.
+--! @brief Aggregates for public.date_ord_ore.
 
---! @brief State function for min on eql_v3.date_ord_ore.
---! @param state eql_v3.date_ord_ore
---! @param value eql_v3.date_ord_ore
---! @return eql_v3.date_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.date_ord_ore, value eql_v3.date_ord_ore)
-RETURNS eql_v3.date_ord_ore
+--! @brief State function for min on public.date_ord_ore.
+--! @param state public.date_ord_ore
+--! @param value public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord_ore, value public.date_ord_ore)
+RETURNS public.date_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.date_ord_ore.
---! @param input eql_v3.date_ord_ore
---! @return eql_v3.date_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.date_ord_ore) (
+--! @brief min aggregate for public.date_ord_ore.
+--! @param input public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE AGGREGATE eql_v3.min(public.date_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.date_ord_ore,
+  stype = public.date_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.date_ord_ore.
---! @param state eql_v3.date_ord_ore
---! @param value eql_v3.date_ord_ore
---! @return eql_v3.date_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.date_ord_ore, value eql_v3.date_ord_ore)
-RETURNS eql_v3.date_ord_ore
+--! @brief State function for max on public.date_ord_ore.
+--! @param state public.date_ord_ore
+--! @param value public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord_ore, value public.date_ord_ore)
+RETURNS public.date_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.date_ord_ore.
---! @param input eql_v3.date_ord_ore
---! @return eql_v3.date_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.date_ord_ore) (
+--! @brief max aggregate for public.date_ord_ore.
+--! @param input public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE AGGREGATE eql_v3.max(public.date_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.date_ord_ore,
+  stype = public.date_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/date/date_ord_ore_functions.sql b/src/v3/scalars/date/date_ord_ore_functions.sql
index 8675fd6ca..2420b0684 100644
--- a/src/v3/scalars/date/date_ord_ore_functions.sql
+++ b/src/v3/scalars/date/date_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/date/date_ord_ore_functions.sql
---! @brief Functions for eql_v3.date_ord_ore.
+--! @brief Functions for public.date_ord_ore.
 
---! @brief Index extractor for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Index extractor for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.date_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.date_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.date_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
+--! @brief Operator wrapper for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.date_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.date_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
+--! @brief Operator wrapper for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.date_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.date_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
+--! @brief Operator wrapper for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.date_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.date_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
+--! @brief Operator wrapper for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.date_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.date_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
+--! @brief Operator wrapper for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.date_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.date_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.date_ord_ore.
+--! @brief Operator wrapper for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.date_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
+--! @brief Unsupported operator blocker for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
+--! @brief Unsupported operator blocker for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param selector text
---! @return eql_v3.date_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_ord_ore, selector text)
-RETURNS eql_v3.date_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ore'; END; $$
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ore, selector text)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param selector integer
---! @return eql_v3.date_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.date_ord_ore, selector integer)
-RETURNS eql_v3.date_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ore'; END; $$
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ore, selector integer)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
+--! @brief Unsupported operator blocker for public.date_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.date_ord_ore
---! @return eql_v3.date_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.date_ord_ore)
-RETURNS eql_v3.date_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.date_ord_ore'; END; $$
+--! @param selector public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord_ore)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.date_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
+--! @brief Unsupported operator blocker for public.date_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.date_ord_ore
+--! @param selector public.date_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.date_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.date_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.date_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.date_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.date_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.date_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.date_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.date_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.date_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
---! @param b eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_ord_ore, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ore, b public.date_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
---! @param a eql_v3.date_ord_ore
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.date_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.date_ord_ore.
+--! @brief Unsupported operator blocker for public.date_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.date_ord_ore
+--! @param b public.date_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.date_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.date_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/date/date_ord_ore_operators.sql b/src/v3/scalars/date/date_ord_ore_operators.sql
index 975227830..1685ab25e 100644
--- a/src/v3/scalars/date/date_ord_ore_operators.sql
+++ b/src/v3/scalars/date/date_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/date/date_ord_ore_functions.sql
 
 --! @file encrypted_domain/date/date_ord_ore_operators.sql
---! @brief Operators for eql_v3.date_ord_ore.
+--! @brief Operators for public.date_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = integer
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = integer
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = integer
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.date_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.date_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
 );
diff --git a/src/v3/scalars/date/date_types.sql b/src/v3/scalars/date/date_types.sql
index 1666c3ee2..98cc6ebc2 100644
--- a/src/v3/scalars/date/date_types.sql
+++ b/src/v3/scalars/date/date_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.date.
+  --! @brief Encrypted domain public.date.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'date' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'date' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.date AS jsonb
+    CREATE DOMAIN public.date AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.date_eq.
+  --! @brief Encrypted domain public.date_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'date_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'date_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.date_eq AS jsonb
+    CREATE DOMAIN public.date_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.date_ord_ore.
+  --! @brief Encrypted domain public.date_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'date_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'date_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.date_ord_ore AS jsonb
+    CREATE DOMAIN public.date_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.date_ord.
+  --! @brief Encrypted domain public.date_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'date_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'date_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.date_ord AS jsonb
+    CREATE DOMAIN public.date_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.date_ord_ope.
+  --! @brief Encrypted domain public.date_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'date_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'date_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.date_ord_ope AS jsonb
+    CREATE DOMAIN public.date_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/double/double_eq_functions.sql b/src/v3/scalars/double/double_eq_functions.sql
index b9ec0cf8b..73c2ec82e 100644
--- a/src/v3/scalars/double/double_eq_functions.sql
+++ b/src/v3/scalars/double/double_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/double/double_eq_functions.sql
---! @brief Functions for eql_v3.double_eq.
+--! @brief Functions for public.double_eq.
 
---! @brief Index extractor for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Index extractor for public.double_eq.
+--! @param a public.double_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.double_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.double_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b public.double_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.double_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.double_eq) $$;
 
---! @brief Operator wrapper for eql_v3.double_eq.
+--! @brief Operator wrapper for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.double_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.double_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b public.double_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.double_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.double_eq) $$;
 
---! @brief Operator wrapper for eql_v3.double_eq.
+--! @brief Operator wrapper for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.double_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.double_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.double_eq, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.double_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.double_eq, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.double_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.double_eq, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.double_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.double_eq, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.double_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_eq, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_eq, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param selector text
---! @return eql_v3.double_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_eq, selector text)
-RETURNS eql_v3.double_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_eq'; END; $$
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.double_eq, selector text)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param selector integer
---! @return eql_v3.double_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_eq, selector integer)
-RETURNS eql_v3.double_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_eq'; END; $$
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.double_eq, selector integer)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param selector eql_v3.double_eq
---! @return eql_v3.double_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.double_eq)
-RETURNS eql_v3.double_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_eq'; END; $$
+--! @param selector public.double_eq
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_eq)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param selector eql_v3.double_eq
+--! @param selector public.double_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.double_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.double_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.double_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.double_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.double_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.double_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.double_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.double_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.double_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
---! @param b eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_eq, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_eq, b public.double_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
---! @param a eql_v3.double_eq
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_eq.
+--! @brief Unsupported operator blocker for public.double_eq.
 --! @param a jsonb
---! @param b eql_v3.double_eq
+--! @param b public.double_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.double_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/double/double_eq_operators.sql b/src/v3/scalars/double/double_eq_operators.sql
index 864d0581e..9f0bc4aa9 100644
--- a/src/v3/scalars/double/double_eq_operators.sql
+++ b/src/v3/scalars/double/double_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/double/double_eq_functions.sql
 
 --! @file encrypted_domain/double/double_eq_operators.sql
---! @brief Operators for eql_v3.double_eq.
+--! @brief Operators for public.double_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text
+  LEFTARG = public.double_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = integer
+  LEFTARG = public.double_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text
+  LEFTARG = public.double_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = integer
+  LEFTARG = public.double_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text
+  LEFTARG = public.double_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text[]
+  LEFTARG = public.double_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text[]
+  LEFTARG = public.double_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonpath
+  LEFTARG = public.double_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonpath
+  LEFTARG = public.double_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text[]
+  LEFTARG = public.double_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text[]
+  LEFTARG = public.double_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text
+  LEFTARG = public.double_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = integer
+  LEFTARG = public.double_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text[]
+  LEFTARG = public.double_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = text[]
+  LEFTARG = public.double_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = eql_v3.double_eq
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_eq, RIGHTARG = jsonb
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_eq
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
 );
diff --git a/src/v3/scalars/double/double_functions.sql b/src/v3/scalars/double/double_functions.sql
index 3783f3b6d..07524abda 100644
--- a/src/v3/scalars/double/double_functions.sql
+++ b/src/v3/scalars/double/double_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/double/double_functions.sql
---! @brief Functions for eql_v3.double.
+--! @brief Functions for public.double.
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.eq(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.neq(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.lt(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.lte(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.gt(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.gte(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.contains(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param selector text
---! @return eql_v3.double
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double, selector text)
-RETURNS eql_v3.double IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double'; END; $$
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a public.double, selector text)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param selector integer
---! @return eql_v3.double
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double, selector integer)
-RETURNS eql_v3.double IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double'; END; $$
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a public.double, selector integer)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param selector eql_v3.double
---! @return eql_v3.double
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.double)
-RETURNS eql_v3.double IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double'; END; $$
+--! @param selector public.double
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param selector eql_v3.double
+--! @param selector public.double
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.double)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.double, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.double, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.double, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.double, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.double, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.double, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.double, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.double, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.double, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.double, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.double, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.double, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.double, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.double, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.double, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
---! @param b eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal."||"(a public.double, b public.double)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
---! @param a eql_v3.double
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.double, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double.
+--! @brief Unsupported operator blocker for public.double.
 --! @param a jsonb
---! @param b eql_v3.double
+--! @param b public.double
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.double)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/double/double_operators.sql b/src/v3/scalars/double/double_operators.sql
index b3ac3cc55..e0b32adf4 100644
--- a/src/v3/scalars/double/double_operators.sql
+++ b/src/v3/scalars/double/double_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/double/double_functions.sql
 
 --! @file encrypted_domain/double/double_operators.sql
---! @brief Operators for eql_v3.double.
+--! @brief Operators for public.double.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double, RIGHTARG = text
+  LEFTARG = public.double, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double, RIGHTARG = integer
+  LEFTARG = public.double, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double, RIGHTARG = text
+  LEFTARG = public.double, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double, RIGHTARG = integer
+  LEFTARG = public.double, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.double, RIGHTARG = text
+  LEFTARG = public.double, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.double, RIGHTARG = text[]
+  LEFTARG = public.double, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.double, RIGHTARG = text[]
+  LEFTARG = public.double, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.double, RIGHTARG = jsonpath
+  LEFTARG = public.double, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.double, RIGHTARG = jsonpath
+  LEFTARG = public.double, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.double, RIGHTARG = text[]
+  LEFTARG = public.double, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.double, RIGHTARG = text[]
+  LEFTARG = public.double, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double, RIGHTARG = text
+  LEFTARG = public.double, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double, RIGHTARG = integer
+  LEFTARG = public.double, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double, RIGHTARG = text[]
+  LEFTARG = public.double, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.double, RIGHTARG = text[]
+  LEFTARG = public.double, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double, RIGHTARG = eql_v3.double
+  LEFTARG = public.double, RIGHTARG = public.double
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double, RIGHTARG = jsonb
+  LEFTARG = public.double, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double
+  LEFTARG = jsonb, RIGHTARG = public.double
 );
diff --git a/src/v3/scalars/double/double_ord_aggregates.sql b/src/v3/scalars/double/double_ord_aggregates.sql
index 7ae64be6b..174e78f99 100644
--- a/src/v3/scalars/double/double_ord_aggregates.sql
+++ b/src/v3/scalars/double/double_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/double/double_ord_operators.sql
 
 --! @file encrypted_domain/double/double_ord_aggregates.sql
---! @brief Aggregates for eql_v3.double_ord.
+--! @brief Aggregates for public.double_ord.
 
---! @brief State function for min on eql_v3.double_ord.
---! @param state eql_v3.double_ord
---! @param value eql_v3.double_ord
---! @return eql_v3.double_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.double_ord, value eql_v3.double_ord)
-RETURNS eql_v3.double_ord
+--! @brief State function for min on public.double_ord.
+--! @param state public.double_ord
+--! @param value public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord, value public.double_ord)
+RETURNS public.double_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.double_ord.
---! @param input eql_v3.double_ord
---! @return eql_v3.double_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.double_ord) (
+--! @brief min aggregate for public.double_ord.
+--! @param input public.double_ord
+--! @return public.double_ord
+CREATE AGGREGATE eql_v3.min(public.double_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.double_ord,
+  stype = public.double_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.double_ord.
---! @param state eql_v3.double_ord
---! @param value eql_v3.double_ord
---! @return eql_v3.double_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.double_ord, value eql_v3.double_ord)
-RETURNS eql_v3.double_ord
+--! @brief State function for max on public.double_ord.
+--! @param state public.double_ord
+--! @param value public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord, value public.double_ord)
+RETURNS public.double_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.double_ord.
---! @param input eql_v3.double_ord
---! @return eql_v3.double_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.double_ord) (
+--! @brief max aggregate for public.double_ord.
+--! @param input public.double_ord
+--! @return public.double_ord
+CREATE AGGREGATE eql_v3.max(public.double_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.double_ord,
+  stype = public.double_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/double/double_ord_functions.sql b/src/v3/scalars/double/double_ord_functions.sql
index d897fbb6e..82c81dba1 100644
--- a/src/v3/scalars/double/double_ord_functions.sql
+++ b/src/v3/scalars/double/double_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/double/double_ord_functions.sql
---! @brief Functions for eql_v3.double_ord.
+--! @brief Functions for public.double_ord.
 
---! @brief Index extractor for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Index extractor for public.double_ord.
+--! @param a public.double_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.double_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.double_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.double_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.double_ord) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
+--! @brief Operator wrapper for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.double_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.double_ord) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
+--! @brief Operator wrapper for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.double_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.double_ord) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
+--! @brief Operator wrapper for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.double_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.double_ord) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
+--! @brief Operator wrapper for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.double_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.double_ord) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
+--! @brief Operator wrapper for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.double_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.double_ord) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord.
+--! @brief Operator wrapper for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord, b public.double_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
+--! @brief Unsupported operator blocker for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord, b public.double_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
+--! @brief Unsupported operator blocker for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param selector text
---! @return eql_v3.double_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_ord, selector text)
-RETURNS eql_v3.double_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord'; END; $$
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord, selector text)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param selector integer
---! @return eql_v3.double_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_ord, selector integer)
-RETURNS eql_v3.double_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord'; END; $$
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord, selector integer)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
+--! @brief Unsupported operator blocker for public.double_ord.
 --! @param a jsonb
---! @param selector eql_v3.double_ord
---! @return eql_v3.double_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.double_ord)
-RETURNS eql_v3.double_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord'; END; $$
+--! @param selector public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
+--! @brief Unsupported operator blocker for public.double_ord.
 --! @param a jsonb
---! @param selector eql_v3.double_ord
+--! @param selector public.double_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.double_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.double_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.double_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.double_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.double_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.double_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.double_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.double_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.double_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
---! @param b eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_ord, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord, b public.double_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
---! @param a eql_v3.double_ord
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord.
+--! @brief Unsupported operator blocker for public.double_ord.
 --! @param a jsonb
---! @param b eql_v3.double_ord
+--! @param b public.double_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.double_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/double/double_ord_ope_aggregates.sql b/src/v3/scalars/double/double_ord_ope_aggregates.sql
index ea688144c..f69c6b70e 100644
--- a/src/v3/scalars/double/double_ord_ope_aggregates.sql
+++ b/src/v3/scalars/double/double_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/double/double_ord_ope_operators.sql
 
 --! @file encrypted_domain/double/double_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.double_ord_ope.
+--! @brief Aggregates for public.double_ord_ope.
 
---! @brief State function for min on eql_v3.double_ord_ope.
---! @param state eql_v3.double_ord_ope
---! @param value eql_v3.double_ord_ope
---! @return eql_v3.double_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.double_ord_ope, value eql_v3.double_ord_ope)
-RETURNS eql_v3.double_ord_ope
+--! @brief State function for min on public.double_ord_ope.
+--! @param state public.double_ord_ope
+--! @param value public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord_ope, value public.double_ord_ope)
+RETURNS public.double_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.double_ord_ope.
---! @param input eql_v3.double_ord_ope
---! @return eql_v3.double_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.double_ord_ope) (
+--! @brief min aggregate for public.double_ord_ope.
+--! @param input public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE AGGREGATE eql_v3.min(public.double_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.double_ord_ope,
+  stype = public.double_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.double_ord_ope.
---! @param state eql_v3.double_ord_ope
---! @param value eql_v3.double_ord_ope
---! @return eql_v3.double_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.double_ord_ope, value eql_v3.double_ord_ope)
-RETURNS eql_v3.double_ord_ope
+--! @brief State function for max on public.double_ord_ope.
+--! @param state public.double_ord_ope
+--! @param value public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord_ope, value public.double_ord_ope)
+RETURNS public.double_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.double_ord_ope.
---! @param input eql_v3.double_ord_ope
---! @return eql_v3.double_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.double_ord_ope) (
+--! @brief max aggregate for public.double_ord_ope.
+--! @param input public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE AGGREGATE eql_v3.max(public.double_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.double_ord_ope,
+  stype = public.double_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/double/double_ord_ope_functions.sql b/src/v3/scalars/double/double_ord_ope_functions.sql
index 251020e30..a86f0e33a 100644
--- a/src/v3/scalars/double/double_ord_ope_functions.sql
+++ b/src/v3/scalars/double/double_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/double/double_ord_ope_functions.sql
---! @brief Functions for eql_v3.double_ord_ope.
+--! @brief Functions for public.double_ord_ope.
 
---! @brief Index extractor for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Index extractor for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.double_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.double_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
+--! @brief Operator wrapper for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.double_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.double_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
+--! @brief Operator wrapper for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.double_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.double_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
+--! @brief Operator wrapper for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.double_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.double_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
+--! @brief Operator wrapper for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.double_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.double_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
+--! @brief Operator wrapper for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.double_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.double_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ope.
+--! @brief Operator wrapper for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.double_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
+--! @brief Unsupported operator blocker for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
+--! @brief Unsupported operator blocker for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param selector text
---! @return eql_v3.double_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_ord_ope, selector text)
-RETURNS eql_v3.double_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord_ope'; END; $$
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ope, selector text)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param selector integer
---! @return eql_v3.double_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_ord_ope, selector integer)
-RETURNS eql_v3.double_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord_ope'; END; $$
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ope, selector integer)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
+--! @brief Unsupported operator blocker for public.double_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.double_ord_ope
---! @return eql_v3.double_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.double_ord_ope)
-RETURNS eql_v3.double_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord_ope'; END; $$
+--! @param selector public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord_ope)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
+--! @brief Unsupported operator blocker for public.double_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.double_ord_ope
+--! @param selector public.double_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.double_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.double_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.double_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.double_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.double_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.double_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.double_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.double_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
---! @param b eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_ord_ope, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ope, b public.double_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
---! @param a eql_v3.double_ord_ope
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ope.
+--! @brief Unsupported operator blocker for public.double_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ope
+--! @param b public.double_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.double_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/double/double_ord_ope_operators.sql b/src/v3/scalars/double/double_ord_ope_operators.sql
index e008c05ab..f10efaa03 100644
--- a/src/v3/scalars/double/double_ord_ope_operators.sql
+++ b/src/v3/scalars/double/double_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/double/double_ord_ope_functions.sql
 
 --! @file encrypted_domain/double/double_ord_ope_operators.sql
---! @brief Operators for eql_v3.double_ord_ope.
+--! @brief Operators for public.double_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = integer
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = integer
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = integer
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
 );
diff --git a/src/v3/scalars/double/double_ord_operators.sql b/src/v3/scalars/double/double_ord_operators.sql
index 8d6181b88..53d608ce6 100644
--- a/src/v3/scalars/double/double_ord_operators.sql
+++ b/src/v3/scalars/double/double_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/double/double_ord_functions.sql
 
 --! @file encrypted_domain/double/double_ord_operators.sql
---! @brief Operators for eql_v3.double_ord.
+--! @brief Operators for public.double_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text
+  LEFTARG = public.double_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = integer
+  LEFTARG = public.double_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text
+  LEFTARG = public.double_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = integer
+  LEFTARG = public.double_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text
+  LEFTARG = public.double_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text[]
+  LEFTARG = public.double_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text[]
+  LEFTARG = public.double_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonpath
+  LEFTARG = public.double_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonpath
+  LEFTARG = public.double_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text[]
+  LEFTARG = public.double_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text[]
+  LEFTARG = public.double_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text
+  LEFTARG = public.double_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = integer
+  LEFTARG = public.double_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text[]
+  LEFTARG = public.double_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = text[]
+  LEFTARG = public.double_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = eql_v3.double_ord
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_ord, RIGHTARG = jsonb
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
 );
diff --git a/src/v3/scalars/double/double_ord_ore_aggregates.sql b/src/v3/scalars/double/double_ord_ore_aggregates.sql
index 2cddf1681..f412c2a23 100644
--- a/src/v3/scalars/double/double_ord_ore_aggregates.sql
+++ b/src/v3/scalars/double/double_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/double/double_ord_ore_operators.sql
 
 --! @file encrypted_domain/double/double_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.double_ord_ore.
+--! @brief Aggregates for public.double_ord_ore.
 
---! @brief State function for min on eql_v3.double_ord_ore.
---! @param state eql_v3.double_ord_ore
---! @param value eql_v3.double_ord_ore
---! @return eql_v3.double_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.double_ord_ore, value eql_v3.double_ord_ore)
-RETURNS eql_v3.double_ord_ore
+--! @brief State function for min on public.double_ord_ore.
+--! @param state public.double_ord_ore
+--! @param value public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord_ore, value public.double_ord_ore)
+RETURNS public.double_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.double_ord_ore.
---! @param input eql_v3.double_ord_ore
---! @return eql_v3.double_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.double_ord_ore) (
+--! @brief min aggregate for public.double_ord_ore.
+--! @param input public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE AGGREGATE eql_v3.min(public.double_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.double_ord_ore,
+  stype = public.double_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.double_ord_ore.
---! @param state eql_v3.double_ord_ore
---! @param value eql_v3.double_ord_ore
---! @return eql_v3.double_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.double_ord_ore, value eql_v3.double_ord_ore)
-RETURNS eql_v3.double_ord_ore
+--! @brief State function for max on public.double_ord_ore.
+--! @param state public.double_ord_ore
+--! @param value public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord_ore, value public.double_ord_ore)
+RETURNS public.double_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.double_ord_ore.
---! @param input eql_v3.double_ord_ore
---! @return eql_v3.double_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.double_ord_ore) (
+--! @brief max aggregate for public.double_ord_ore.
+--! @param input public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE AGGREGATE eql_v3.max(public.double_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.double_ord_ore,
+  stype = public.double_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/double/double_ord_ore_functions.sql b/src/v3/scalars/double/double_ord_ore_functions.sql
index 41ef48f4c..985071413 100644
--- a/src/v3/scalars/double/double_ord_ore_functions.sql
+++ b/src/v3/scalars/double/double_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/double/double_ord_ore_functions.sql
---! @brief Functions for eql_v3.double_ord_ore.
+--! @brief Functions for public.double_ord_ore.
 
---! @brief Index extractor for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Index extractor for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.double_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.double_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.double_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
+--! @brief Operator wrapper for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.double_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.double_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
+--! @brief Operator wrapper for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.double_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.double_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
+--! @brief Operator wrapper for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.double_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.double_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
+--! @brief Operator wrapper for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.double_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.double_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
+--! @brief Operator wrapper for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.double_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.double_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.double_ord_ore.
+--! @brief Operator wrapper for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.double_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
+--! @brief Unsupported operator blocker for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
+--! @brief Unsupported operator blocker for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param selector text
---! @return eql_v3.double_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_ord_ore, selector text)
-RETURNS eql_v3.double_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord_ore'; END; $$
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ore, selector text)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param selector integer
---! @return eql_v3.double_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.double_ord_ore, selector integer)
-RETURNS eql_v3.double_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord_ore'; END; $$
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ore, selector integer)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
+--! @brief Unsupported operator blocker for public.double_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.double_ord_ore
---! @return eql_v3.double_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.double_ord_ore)
-RETURNS eql_v3.double_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.double_ord_ore'; END; $$
+--! @param selector public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord_ore)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.double_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
+--! @brief Unsupported operator blocker for public.double_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.double_ord_ore
+--! @param selector public.double_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.double_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.double_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.double_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.double_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.double_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.double_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.double_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.double_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.double_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
---! @param b eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_ord_ore, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ore, b public.double_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
---! @param a eql_v3.double_ord_ore
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.double_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.double_ord_ore.
+--! @brief Unsupported operator blocker for public.double_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.double_ord_ore
+--! @param b public.double_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.double_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.double_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/double/double_ord_ore_operators.sql b/src/v3/scalars/double/double_ord_ore_operators.sql
index ea3e4a78e..28cf606b5 100644
--- a/src/v3/scalars/double/double_ord_ore_operators.sql
+++ b/src/v3/scalars/double/double_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/double/double_ord_ore_functions.sql
 
 --! @file encrypted_domain/double/double_ord_ore_operators.sql
---! @brief Operators for eql_v3.double_ord_ore.
+--! @brief Operators for public.double_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = integer
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = integer
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = integer
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.double_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.double_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
 );
diff --git a/src/v3/scalars/double/double_types.sql b/src/v3/scalars/double/double_types.sql
index 6dd364136..e51e0e428 100644
--- a/src/v3/scalars/double/double_types.sql
+++ b/src/v3/scalars/double/double_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.double.
+  --! @brief Encrypted domain public.double.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'double' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'double' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.double AS jsonb
+    CREATE DOMAIN public.double AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.double_eq.
+  --! @brief Encrypted domain public.double_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'double_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'double_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.double_eq AS jsonb
+    CREATE DOMAIN public.double_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.double_ord_ore.
+  --! @brief Encrypted domain public.double_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'double_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'double_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.double_ord_ore AS jsonb
+    CREATE DOMAIN public.double_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.double_ord.
+  --! @brief Encrypted domain public.double_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'double_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'double_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.double_ord AS jsonb
+    CREATE DOMAIN public.double_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.double_ord_ope.
+  --! @brief Encrypted domain public.double_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'double_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'double_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.double_ord_ope AS jsonb
+    CREATE DOMAIN public.double_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/integer/integer_eq_functions.sql b/src/v3/scalars/integer/integer_eq_functions.sql
index 581d28bfa..c4e7d5c98 100644
--- a/src/v3/scalars/integer/integer_eq_functions.sql
+++ b/src/v3/scalars/integer/integer_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/integer/integer_eq_functions.sql
---! @brief Functions for eql_v3.integer_eq.
+--! @brief Functions for public.integer_eq.
 
---! @brief Index extractor for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Index extractor for public.integer_eq.
+--! @param a public.integer_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.integer_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.integer_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.integer_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.integer_eq) $$;
 
---! @brief Operator wrapper for eql_v3.integer_eq.
+--! @brief Operator wrapper for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.integer_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.integer_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b public.integer_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.integer_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.integer_eq) $$;
 
---! @brief Operator wrapper for eql_v3.integer_eq.
+--! @brief Operator wrapper for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.integer_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.integer_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.integer_eq, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.integer_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.integer_eq, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.integer_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.integer_eq, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.integer_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.integer_eq, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.integer_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_eq, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_eq, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param selector text
---! @return eql_v3.integer_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_eq, selector text)
-RETURNS eql_v3.integer_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_eq'; END; $$
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_eq, selector text)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param selector integer
---! @return eql_v3.integer_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_eq, selector integer)
-RETURNS eql_v3.integer_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_eq'; END; $$
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_eq, selector integer)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param selector eql_v3.integer_eq
---! @return eql_v3.integer_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.integer_eq)
-RETURNS eql_v3.integer_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_eq'; END; $$
+--! @param selector public.integer_eq
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_eq)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param selector eql_v3.integer_eq
+--! @param selector public.integer_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.integer_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.integer_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.integer_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.integer_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.integer_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.integer_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.integer_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.integer_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
---! @param b eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_eq, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_eq, b public.integer_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
---! @param a eql_v3.integer_eq
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_eq.
+--! @brief Unsupported operator blocker for public.integer_eq.
 --! @param a jsonb
---! @param b eql_v3.integer_eq
+--! @param b public.integer_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.integer_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/integer/integer_eq_operators.sql b/src/v3/scalars/integer/integer_eq_operators.sql
index 4a39435ec..3ab2a81cd 100644
--- a/src/v3/scalars/integer/integer_eq_operators.sql
+++ b/src/v3/scalars/integer/integer_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/integer/integer_eq_functions.sql
 
 --! @file encrypted_domain/integer/integer_eq_operators.sql
---! @brief Operators for eql_v3.integer_eq.
+--! @brief Operators for public.integer_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text
+  LEFTARG = public.integer_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = integer
+  LEFTARG = public.integer_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text
+  LEFTARG = public.integer_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = integer
+  LEFTARG = public.integer_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text
+  LEFTARG = public.integer_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text[]
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text[]
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonpath
+  LEFTARG = public.integer_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonpath
+  LEFTARG = public.integer_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text[]
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text[]
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text
+  LEFTARG = public.integer_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = integer
+  LEFTARG = public.integer_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text[]
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = text[]
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_eq, RIGHTARG = jsonb
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_eq
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
 );
diff --git a/src/v3/scalars/integer/integer_functions.sql b/src/v3/scalars/integer/integer_functions.sql
index 70a913693..f89b747ba 100644
--- a/src/v3/scalars/integer/integer_functions.sql
+++ b/src/v3/scalars/integer/integer_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/integer/integer_functions.sql
---! @brief Functions for eql_v3.integer.
+--! @brief Functions for public.integer.
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.eq(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.neq(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.lt(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.lte(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.gt(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.gte(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param selector text
---! @return eql_v3.integer
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer, selector text)
-RETURNS eql_v3.integer IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer'; END; $$
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a public.integer, selector text)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param selector integer
---! @return eql_v3.integer
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer, selector integer)
-RETURNS eql_v3.integer IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer'; END; $$
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a public.integer, selector integer)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param selector eql_v3.integer
---! @return eql_v3.integer
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.integer)
-RETURNS eql_v3.integer IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer'; END; $$
+--! @param selector public.integer
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param selector eql_v3.integer
+--! @param selector public.integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.integer)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.integer, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.integer, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.integer, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.integer, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.integer, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.integer, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.integer, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.integer, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.integer, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
---! @param b eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer, b public.integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
---! @param a eql_v3.integer
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer.
+--! @brief Unsupported operator blocker for public.integer.
 --! @param a jsonb
---! @param b eql_v3.integer
+--! @param b public.integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.integer)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/integer/integer_operators.sql b/src/v3/scalars/integer/integer_operators.sql
index 4e17cf888..3c4ab6acf 100644
--- a/src/v3/scalars/integer/integer_operators.sql
+++ b/src/v3/scalars/integer/integer_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/integer/integer_functions.sql
 
 --! @file encrypted_domain/integer/integer_operators.sql
---! @brief Operators for eql_v3.integer.
+--! @brief Operators for public.integer.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer, RIGHTARG = text
+  LEFTARG = public.integer, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer, RIGHTARG = integer
+  LEFTARG = public.integer, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer, RIGHTARG = text
+  LEFTARG = public.integer, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer, RIGHTARG = integer
+  LEFTARG = public.integer, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.integer, RIGHTARG = text
+  LEFTARG = public.integer, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.integer, RIGHTARG = text[]
+  LEFTARG = public.integer, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.integer, RIGHTARG = text[]
+  LEFTARG = public.integer, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonpath
+  LEFTARG = public.integer, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonpath
+  LEFTARG = public.integer, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.integer, RIGHTARG = text[]
+  LEFTARG = public.integer, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.integer, RIGHTARG = text[]
+  LEFTARG = public.integer, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer, RIGHTARG = text
+  LEFTARG = public.integer, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer, RIGHTARG = integer
+  LEFTARG = public.integer, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer, RIGHTARG = text[]
+  LEFTARG = public.integer, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.integer, RIGHTARG = text[]
+  LEFTARG = public.integer, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer, RIGHTARG = eql_v3.integer
+  LEFTARG = public.integer, RIGHTARG = public.integer
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer, RIGHTARG = jsonb
+  LEFTARG = public.integer, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer
+  LEFTARG = jsonb, RIGHTARG = public.integer
 );
diff --git a/src/v3/scalars/integer/integer_ord_aggregates.sql b/src/v3/scalars/integer/integer_ord_aggregates.sql
index cb100d873..6ee9b7fb3 100644
--- a/src/v3/scalars/integer/integer_ord_aggregates.sql
+++ b/src/v3/scalars/integer/integer_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/integer/integer_ord_operators.sql
 
 --! @file encrypted_domain/integer/integer_ord_aggregates.sql
---! @brief Aggregates for eql_v3.integer_ord.
+--! @brief Aggregates for public.integer_ord.
 
---! @brief State function for min on eql_v3.integer_ord.
---! @param state eql_v3.integer_ord
---! @param value eql_v3.integer_ord
---! @return eql_v3.integer_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.integer_ord, value eql_v3.integer_ord)
-RETURNS eql_v3.integer_ord
+--! @brief State function for min on public.integer_ord.
+--! @param state public.integer_ord
+--! @param value public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord, value public.integer_ord)
+RETURNS public.integer_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.integer_ord.
---! @param input eql_v3.integer_ord
---! @return eql_v3.integer_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.integer_ord) (
+--! @brief min aggregate for public.integer_ord.
+--! @param input public.integer_ord
+--! @return public.integer_ord
+CREATE AGGREGATE eql_v3.min(public.integer_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.integer_ord,
+  stype = public.integer_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.integer_ord.
---! @param state eql_v3.integer_ord
---! @param value eql_v3.integer_ord
---! @return eql_v3.integer_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.integer_ord, value eql_v3.integer_ord)
-RETURNS eql_v3.integer_ord
+--! @brief State function for max on public.integer_ord.
+--! @param state public.integer_ord
+--! @param value public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord, value public.integer_ord)
+RETURNS public.integer_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.integer_ord.
---! @param input eql_v3.integer_ord
---! @return eql_v3.integer_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.integer_ord) (
+--! @brief max aggregate for public.integer_ord.
+--! @param input public.integer_ord
+--! @return public.integer_ord
+CREATE AGGREGATE eql_v3.max(public.integer_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.integer_ord,
+  stype = public.integer_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/integer/integer_ord_functions.sql b/src/v3/scalars/integer/integer_ord_functions.sql
index 2e91ecd3d..d1296ec9d 100644
--- a/src/v3/scalars/integer/integer_ord_functions.sql
+++ b/src/v3/scalars/integer/integer_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/integer/integer_ord_functions.sql
---! @brief Functions for eql_v3.integer_ord.
+--! @brief Functions for public.integer_ord.
 
---! @brief Index extractor for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Index extractor for public.integer_ord.
+--! @param a public.integer_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.integer_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.integer_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.integer_ord) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
+--! @brief Operator wrapper for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.integer_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.integer_ord) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
+--! @brief Operator wrapper for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.integer_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.integer_ord) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
+--! @brief Operator wrapper for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.integer_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.integer_ord) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
+--! @brief Operator wrapper for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.integer_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.integer_ord) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
+--! @brief Operator wrapper for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.integer_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.integer_ord) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord.
+--! @brief Operator wrapper for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord, b public.integer_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
+--! @brief Unsupported operator blocker for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord, b public.integer_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
+--! @brief Unsupported operator blocker for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param selector text
---! @return eql_v3.integer_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_ord, selector text)
-RETURNS eql_v3.integer_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord'; END; $$
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord, selector text)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param selector integer
---! @return eql_v3.integer_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_ord, selector integer)
-RETURNS eql_v3.integer_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord'; END; $$
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord, selector integer)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
+--! @brief Unsupported operator blocker for public.integer_ord.
 --! @param a jsonb
---! @param selector eql_v3.integer_ord
---! @return eql_v3.integer_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.integer_ord)
-RETURNS eql_v3.integer_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord'; END; $$
+--! @param selector public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
+--! @brief Unsupported operator blocker for public.integer_ord.
 --! @param a jsonb
---! @param selector eql_v3.integer_ord
+--! @param selector public.integer_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.integer_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.integer_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.integer_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.integer_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.integer_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.integer_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.integer_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.integer_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.integer_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
---! @param b eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_ord, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord, b public.integer_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
---! @param a eql_v3.integer_ord
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord.
+--! @brief Unsupported operator blocker for public.integer_ord.
 --! @param a jsonb
---! @param b eql_v3.integer_ord
+--! @param b public.integer_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.integer_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/integer/integer_ord_ope_aggregates.sql b/src/v3/scalars/integer/integer_ord_ope_aggregates.sql
index 7df0832ac..d9539de71 100644
--- a/src/v3/scalars/integer/integer_ord_ope_aggregates.sql
+++ b/src/v3/scalars/integer/integer_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/integer/integer_ord_ope_operators.sql
 
 --! @file encrypted_domain/integer/integer_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.integer_ord_ope.
+--! @brief Aggregates for public.integer_ord_ope.
 
---! @brief State function for min on eql_v3.integer_ord_ope.
---! @param state eql_v3.integer_ord_ope
---! @param value eql_v3.integer_ord_ope
---! @return eql_v3.integer_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.integer_ord_ope, value eql_v3.integer_ord_ope)
-RETURNS eql_v3.integer_ord_ope
+--! @brief State function for min on public.integer_ord_ope.
+--! @param state public.integer_ord_ope
+--! @param value public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord_ope, value public.integer_ord_ope)
+RETURNS public.integer_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.integer_ord_ope.
---! @param input eql_v3.integer_ord_ope
---! @return eql_v3.integer_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.integer_ord_ope) (
+--! @brief min aggregate for public.integer_ord_ope.
+--! @param input public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE AGGREGATE eql_v3.min(public.integer_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.integer_ord_ope,
+  stype = public.integer_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.integer_ord_ope.
---! @param state eql_v3.integer_ord_ope
---! @param value eql_v3.integer_ord_ope
---! @return eql_v3.integer_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.integer_ord_ope, value eql_v3.integer_ord_ope)
-RETURNS eql_v3.integer_ord_ope
+--! @brief State function for max on public.integer_ord_ope.
+--! @param state public.integer_ord_ope
+--! @param value public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord_ope, value public.integer_ord_ope)
+RETURNS public.integer_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.integer_ord_ope.
---! @param input eql_v3.integer_ord_ope
---! @return eql_v3.integer_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.integer_ord_ope) (
+--! @brief max aggregate for public.integer_ord_ope.
+--! @param input public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE AGGREGATE eql_v3.max(public.integer_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.integer_ord_ope,
+  stype = public.integer_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/integer/integer_ord_ope_functions.sql b/src/v3/scalars/integer/integer_ord_ope_functions.sql
index 8bd643e61..28bf30355 100644
--- a/src/v3/scalars/integer/integer_ord_ope_functions.sql
+++ b/src/v3/scalars/integer/integer_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/integer/integer_ord_ope_functions.sql
---! @brief Functions for eql_v3.integer_ord_ope.
+--! @brief Functions for public.integer_ord_ope.
 
---! @brief Index extractor for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Index extractor for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.integer_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.integer_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
+--! @brief Operator wrapper for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.integer_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.integer_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
+--! @brief Operator wrapper for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.integer_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.integer_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
+--! @brief Operator wrapper for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.integer_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.integer_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
+--! @brief Operator wrapper for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.integer_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.integer_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
+--! @brief Operator wrapper for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.integer_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.integer_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ope.
+--! @brief Operator wrapper for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.integer_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param selector text
---! @return eql_v3.integer_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_ord_ope, selector text)
-RETURNS eql_v3.integer_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord_ope'; END; $$
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ope, selector text)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param selector integer
---! @return eql_v3.integer_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_ord_ope, selector integer)
-RETURNS eql_v3.integer_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord_ope'; END; $$
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ope, selector integer)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.integer_ord_ope
---! @return eql_v3.integer_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.integer_ord_ope)
-RETURNS eql_v3.integer_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord_ope'; END; $$
+--! @param selector public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord_ope)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.integer_ord_ope
+--! @param selector public.integer_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.integer_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.integer_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.integer_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.integer_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.integer_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.integer_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.integer_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.integer_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
---! @param b eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_ord_ope, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ope, b public.integer_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
---! @param a eql_v3.integer_ord_ope
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ope.
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ope
+--! @param b public.integer_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.integer_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/integer/integer_ord_ope_operators.sql b/src/v3/scalars/integer/integer_ord_ope_operators.sql
index ca0e094e7..fad0a0729 100644
--- a/src/v3/scalars/integer/integer_ord_ope_operators.sql
+++ b/src/v3/scalars/integer/integer_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/integer/integer_ord_ope_functions.sql
 
 --! @file encrypted_domain/integer/integer_ord_ope_operators.sql
---! @brief Operators for eql_v3.integer_ord_ope.
+--! @brief Operators for public.integer_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = integer
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = integer
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = integer
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
 );
diff --git a/src/v3/scalars/integer/integer_ord_operators.sql b/src/v3/scalars/integer/integer_ord_operators.sql
index 38ca86827..af1e92540 100644
--- a/src/v3/scalars/integer/integer_ord_operators.sql
+++ b/src/v3/scalars/integer/integer_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/integer/integer_ord_functions.sql
 
 --! @file encrypted_domain/integer/integer_ord_operators.sql
---! @brief Operators for eql_v3.integer_ord.
+--! @brief Operators for public.integer_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text
+  LEFTARG = public.integer_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = integer
+  LEFTARG = public.integer_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text
+  LEFTARG = public.integer_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = integer
+  LEFTARG = public.integer_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text
+  LEFTARG = public.integer_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text[]
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text[]
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonpath
+  LEFTARG = public.integer_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonpath
+  LEFTARG = public.integer_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text[]
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text[]
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text
+  LEFTARG = public.integer_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = integer
+  LEFTARG = public.integer_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text[]
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = text[]
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_ord, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
 );
diff --git a/src/v3/scalars/integer/integer_ord_ore_aggregates.sql b/src/v3/scalars/integer/integer_ord_ore_aggregates.sql
index 7c50f1d0c..67f78db6b 100644
--- a/src/v3/scalars/integer/integer_ord_ore_aggregates.sql
+++ b/src/v3/scalars/integer/integer_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/integer/integer_ord_ore_operators.sql
 
 --! @file encrypted_domain/integer/integer_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.integer_ord_ore.
+--! @brief Aggregates for public.integer_ord_ore.
 
---! @brief State function for min on eql_v3.integer_ord_ore.
---! @param state eql_v3.integer_ord_ore
---! @param value eql_v3.integer_ord_ore
---! @return eql_v3.integer_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.integer_ord_ore, value eql_v3.integer_ord_ore)
-RETURNS eql_v3.integer_ord_ore
+--! @brief State function for min on public.integer_ord_ore.
+--! @param state public.integer_ord_ore
+--! @param value public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord_ore, value public.integer_ord_ore)
+RETURNS public.integer_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.integer_ord_ore.
---! @param input eql_v3.integer_ord_ore
---! @return eql_v3.integer_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.integer_ord_ore) (
+--! @brief min aggregate for public.integer_ord_ore.
+--! @param input public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE AGGREGATE eql_v3.min(public.integer_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.integer_ord_ore,
+  stype = public.integer_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.integer_ord_ore.
---! @param state eql_v3.integer_ord_ore
---! @param value eql_v3.integer_ord_ore
---! @return eql_v3.integer_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.integer_ord_ore, value eql_v3.integer_ord_ore)
-RETURNS eql_v3.integer_ord_ore
+--! @brief State function for max on public.integer_ord_ore.
+--! @param state public.integer_ord_ore
+--! @param value public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord_ore, value public.integer_ord_ore)
+RETURNS public.integer_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.integer_ord_ore.
---! @param input eql_v3.integer_ord_ore
---! @return eql_v3.integer_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.integer_ord_ore) (
+--! @brief max aggregate for public.integer_ord_ore.
+--! @param input public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE AGGREGATE eql_v3.max(public.integer_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.integer_ord_ore,
+  stype = public.integer_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/integer/integer_ord_ore_functions.sql b/src/v3/scalars/integer/integer_ord_ore_functions.sql
index ca2d050a3..a6cc532ef 100644
--- a/src/v3/scalars/integer/integer_ord_ore_functions.sql
+++ b/src/v3/scalars/integer/integer_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/integer/integer_ord_ore_functions.sql
---! @brief Functions for eql_v3.integer_ord_ore.
+--! @brief Functions for public.integer_ord_ore.
 
---! @brief Index extractor for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Index extractor for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.integer_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.integer_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.integer_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
+--! @brief Operator wrapper for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.integer_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.integer_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
+--! @brief Operator wrapper for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.integer_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.integer_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
+--! @brief Operator wrapper for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.integer_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.integer_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
+--! @brief Operator wrapper for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.integer_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.integer_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
+--! @brief Operator wrapper for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.integer_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.integer_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.integer_ord_ore.
+--! @brief Operator wrapper for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.integer_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param selector text
---! @return eql_v3.integer_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_ord_ore, selector text)
-RETURNS eql_v3.integer_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord_ore'; END; $$
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ore, selector text)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param selector integer
---! @return eql_v3.integer_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.integer_ord_ore, selector integer)
-RETURNS eql_v3.integer_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord_ore'; END; $$
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ore, selector integer)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.integer_ord_ore
---! @return eql_v3.integer_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.integer_ord_ore)
-RETURNS eql_v3.integer_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.integer_ord_ore'; END; $$
+--! @param selector public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord_ore)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.integer_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.integer_ord_ore
+--! @param selector public.integer_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.integer_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.integer_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.integer_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.integer_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.integer_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.integer_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.integer_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.integer_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.integer_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
---! @param b eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_ord_ore, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ore, b public.integer_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
---! @param a eql_v3.integer_ord_ore
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.integer_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.integer_ord_ore.
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.integer_ord_ore
+--! @param b public.integer_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.integer_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.integer_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/integer/integer_ord_ore_operators.sql b/src/v3/scalars/integer/integer_ord_ore_operators.sql
index 87c3b8924..59c654a02 100644
--- a/src/v3/scalars/integer/integer_ord_ore_operators.sql
+++ b/src/v3/scalars/integer/integer_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/integer/integer_ord_ore_functions.sql
 
 --! @file encrypted_domain/integer/integer_ord_ore_operators.sql
---! @brief Operators for eql_v3.integer_ord_ore.
+--! @brief Operators for public.integer_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = integer
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = integer
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = integer
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.integer_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.integer_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
 );
diff --git a/src/v3/scalars/integer/integer_types.sql b/src/v3/scalars/integer/integer_types.sql
index 5358eb3db..7f1cd577d 100644
--- a/src/v3/scalars/integer/integer_types.sql
+++ b/src/v3/scalars/integer/integer_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.integer.
+  --! @brief Encrypted domain public.integer.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'integer' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'integer' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.integer AS jsonb
+    CREATE DOMAIN public.integer AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.integer_eq.
+  --! @brief Encrypted domain public.integer_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'integer_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'integer_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.integer_eq AS jsonb
+    CREATE DOMAIN public.integer_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.integer_ord_ore.
+  --! @brief Encrypted domain public.integer_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'integer_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'integer_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.integer_ord_ore AS jsonb
+    CREATE DOMAIN public.integer_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.integer_ord.
+  --! @brief Encrypted domain public.integer_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'integer_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'integer_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.integer_ord AS jsonb
+    CREATE DOMAIN public.integer_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.integer_ord_ope.
+  --! @brief Encrypted domain public.integer_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'integer_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'integer_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.integer_ord_ope AS jsonb
+    CREATE DOMAIN public.integer_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/numeric/numeric_eq_functions.sql b/src/v3/scalars/numeric/numeric_eq_functions.sql
index da7ef0027..f630ab43b 100644
--- a/src/v3/scalars/numeric/numeric_eq_functions.sql
+++ b/src/v3/scalars/numeric/numeric_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/numeric/numeric_eq_functions.sql
---! @brief Functions for eql_v3.numeric_eq.
+--! @brief Functions for public.numeric_eq.
 
---! @brief Index extractor for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Index extractor for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.numeric_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.numeric_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.numeric_eq) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_eq.
+--! @brief Operator wrapper for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.numeric_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.numeric_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.numeric_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.numeric_eq) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_eq.
+--! @brief Operator wrapper for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.numeric_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.numeric_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_eq, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param selector text
---! @return eql_v3.numeric_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_eq, selector text)
-RETURNS eql_v3.numeric_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_eq'; END; $$
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_eq, selector text)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param selector integer
---! @return eql_v3.numeric_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_eq, selector integer)
-RETURNS eql_v3.numeric_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_eq'; END; $$
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_eq, selector integer)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param selector eql_v3.numeric_eq
---! @return eql_v3.numeric_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.numeric_eq)
-RETURNS eql_v3.numeric_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_eq'; END; $$
+--! @param selector public.numeric_eq
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_eq)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param selector eql_v3.numeric_eq
+--! @param selector public.numeric_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.numeric_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.numeric_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.numeric_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.numeric_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.numeric_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.numeric_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.numeric_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.numeric_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
---! @param b eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_eq, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_eq, b public.numeric_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
---! @param a eql_v3.numeric_eq
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_eq.
+--! @brief Unsupported operator blocker for public.numeric_eq.
 --! @param a jsonb
---! @param b eql_v3.numeric_eq
+--! @param b public.numeric_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.numeric_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/numeric/numeric_eq_operators.sql b/src/v3/scalars/numeric/numeric_eq_operators.sql
index fe537ca2d..41b4a5e5d 100644
--- a/src/v3/scalars/numeric/numeric_eq_operators.sql
+++ b/src/v3/scalars/numeric/numeric_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_eq_functions.sql
 
 --! @file encrypted_domain/numeric/numeric_eq_operators.sql
---! @brief Operators for eql_v3.numeric_eq.
+--! @brief Operators for public.numeric_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text
+  LEFTARG = public.numeric_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = integer
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text
+  LEFTARG = public.numeric_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = integer
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text
+  LEFTARG = public.numeric_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[]
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[]
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[]
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[]
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text
+  LEFTARG = public.numeric_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = integer
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[]
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = text[]
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_eq, RIGHTARG = jsonb
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_eq
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
 );
diff --git a/src/v3/scalars/numeric/numeric_functions.sql b/src/v3/scalars/numeric/numeric_functions.sql
index c8826cb36..da813608d 100644
--- a/src/v3/scalars/numeric/numeric_functions.sql
+++ b/src/v3/scalars/numeric/numeric_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/numeric/numeric_functions.sql
---! @brief Functions for eql_v3.numeric.
+--! @brief Functions for public.numeric.
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.eq(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.neq(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param selector text
---! @return eql_v3.numeric
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric, selector text)
-RETURNS eql_v3.numeric IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric'; END; $$
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric, selector text)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param selector integer
---! @return eql_v3.numeric
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric, selector integer)
-RETURNS eql_v3.numeric IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric'; END; $$
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric, selector integer)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param selector eql_v3.numeric
---! @return eql_v3.numeric
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.numeric)
-RETURNS eql_v3.numeric IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric'; END; $$
+--! @param selector public.numeric
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param selector eql_v3.numeric
+--! @param selector public.numeric
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.numeric, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.numeric, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.numeric, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.numeric, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.numeric, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.numeric, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.numeric, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.numeric, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
---! @param b eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric, b public.numeric)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
---! @param a eql_v3.numeric
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric.
+--! @brief Unsupported operator blocker for public.numeric.
 --! @param a jsonb
---! @param b eql_v3.numeric
+--! @param b public.numeric
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.numeric)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/numeric/numeric_operators.sql b/src/v3/scalars/numeric/numeric_operators.sql
index 74bf996b1..119f35f1c 100644
--- a/src/v3/scalars/numeric/numeric_operators.sql
+++ b/src/v3/scalars/numeric/numeric_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_functions.sql
 
 --! @file encrypted_domain/numeric/numeric_operators.sql
---! @brief Operators for eql_v3.numeric.
+--! @brief Operators for public.numeric.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text
+  LEFTARG = public.numeric, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric, RIGHTARG = integer
+  LEFTARG = public.numeric, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text
+  LEFTARG = public.numeric, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric, RIGHTARG = integer
+  LEFTARG = public.numeric, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text
+  LEFTARG = public.numeric, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text[]
+  LEFTARG = public.numeric, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text[]
+  LEFTARG = public.numeric, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonpath
+  LEFTARG = public.numeric, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonpath
+  LEFTARG = public.numeric, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text[]
+  LEFTARG = public.numeric, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text[]
+  LEFTARG = public.numeric, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text
+  LEFTARG = public.numeric, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric, RIGHTARG = integer
+  LEFTARG = public.numeric, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text[]
+  LEFTARG = public.numeric, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.numeric, RIGHTARG = text[]
+  LEFTARG = public.numeric, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric, RIGHTARG = eql_v3.numeric
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric, RIGHTARG = jsonb
+  LEFTARG = public.numeric, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric
+  LEFTARG = jsonb, RIGHTARG = public.numeric
 );
diff --git a/src/v3/scalars/numeric/numeric_ord_aggregates.sql b/src/v3/scalars/numeric/numeric_ord_aggregates.sql
index cfbaefc52..41cecf627 100644
--- a/src/v3/scalars/numeric/numeric_ord_aggregates.sql
+++ b/src/v3/scalars/numeric/numeric_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_ord_operators.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_aggregates.sql
---! @brief Aggregates for eql_v3.numeric_ord.
+--! @brief Aggregates for public.numeric_ord.
 
---! @brief State function for min on eql_v3.numeric_ord.
---! @param state eql_v3.numeric_ord
---! @param value eql_v3.numeric_ord
---! @return eql_v3.numeric_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.numeric_ord, value eql_v3.numeric_ord)
-RETURNS eql_v3.numeric_ord
+--! @brief State function for min on public.numeric_ord.
+--! @param state public.numeric_ord
+--! @param value public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord, value public.numeric_ord)
+RETURNS public.numeric_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.numeric_ord.
---! @param input eql_v3.numeric_ord
---! @return eql_v3.numeric_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.numeric_ord) (
+--! @brief min aggregate for public.numeric_ord.
+--! @param input public.numeric_ord
+--! @return public.numeric_ord
+CREATE AGGREGATE eql_v3.min(public.numeric_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.numeric_ord,
+  stype = public.numeric_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.numeric_ord.
---! @param state eql_v3.numeric_ord
---! @param value eql_v3.numeric_ord
---! @return eql_v3.numeric_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.numeric_ord, value eql_v3.numeric_ord)
-RETURNS eql_v3.numeric_ord
+--! @brief State function for max on public.numeric_ord.
+--! @param state public.numeric_ord
+--! @param value public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord, value public.numeric_ord)
+RETURNS public.numeric_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.numeric_ord.
---! @param input eql_v3.numeric_ord
---! @return eql_v3.numeric_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.numeric_ord) (
+--! @brief max aggregate for public.numeric_ord.
+--! @param input public.numeric_ord
+--! @return public.numeric_ord
+CREATE AGGREGATE eql_v3.max(public.numeric_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.numeric_ord,
+  stype = public.numeric_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/numeric/numeric_ord_functions.sql b/src/v3/scalars/numeric/numeric_ord_functions.sql
index bcbed17c5..80a85d4a6 100644
--- a/src/v3/scalars/numeric/numeric_ord_functions.sql
+++ b/src/v3/scalars/numeric/numeric_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_functions.sql
---! @brief Functions for eql_v3.numeric_ord.
+--! @brief Functions for public.numeric_ord.
 
---! @brief Index extractor for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Index extractor for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.numeric_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.numeric_ord) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
+--! @brief Operator wrapper for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.numeric_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.numeric_ord) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
+--! @brief Operator wrapper for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.numeric_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.numeric_ord) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
+--! @brief Operator wrapper for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.numeric_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.numeric_ord) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
+--! @brief Operator wrapper for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.numeric_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.numeric_ord) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
+--! @brief Operator wrapper for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.numeric_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.numeric_ord) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord.
+--! @brief Operator wrapper for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
+--! @brief Unsupported operator blocker for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord, b public.numeric_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
+--! @brief Unsupported operator blocker for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param selector text
---! @return eql_v3.numeric_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_ord, selector text)
-RETURNS eql_v3.numeric_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord'; END; $$
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord, selector text)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param selector integer
---! @return eql_v3.numeric_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_ord, selector integer)
-RETURNS eql_v3.numeric_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord'; END; $$
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord, selector integer)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
+--! @brief Unsupported operator blocker for public.numeric_ord.
 --! @param a jsonb
---! @param selector eql_v3.numeric_ord
---! @return eql_v3.numeric_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.numeric_ord)
-RETURNS eql_v3.numeric_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord'; END; $$
+--! @param selector public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
+--! @brief Unsupported operator blocker for public.numeric_ord.
 --! @param a jsonb
---! @param selector eql_v3.numeric_ord
+--! @param selector public.numeric_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.numeric_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.numeric_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.numeric_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.numeric_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.numeric_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.numeric_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.numeric_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.numeric_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
---! @param b eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_ord, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord, b public.numeric_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
---! @param a eql_v3.numeric_ord
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord.
+--! @brief Unsupported operator blocker for public.numeric_ord.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord
+--! @param b public.numeric_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.numeric_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/numeric/numeric_ord_ope_aggregates.sql b/src/v3/scalars/numeric/numeric_ord_ope_aggregates.sql
index ef4f8b465..2e0cbb20a 100644
--- a/src/v3/scalars/numeric/numeric_ord_ope_aggregates.sql
+++ b/src/v3/scalars/numeric/numeric_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ope_operators.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.numeric_ord_ope.
+--! @brief Aggregates for public.numeric_ord_ope.
 
---! @brief State function for min on eql_v3.numeric_ord_ope.
---! @param state eql_v3.numeric_ord_ope
---! @param value eql_v3.numeric_ord_ope
---! @return eql_v3.numeric_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.numeric_ord_ope, value eql_v3.numeric_ord_ope)
-RETURNS eql_v3.numeric_ord_ope
+--! @brief State function for min on public.numeric_ord_ope.
+--! @param state public.numeric_ord_ope
+--! @param value public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord_ope, value public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.numeric_ord_ope.
---! @param input eql_v3.numeric_ord_ope
---! @return eql_v3.numeric_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.numeric_ord_ope) (
+--! @brief min aggregate for public.numeric_ord_ope.
+--! @param input public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE AGGREGATE eql_v3.min(public.numeric_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.numeric_ord_ope,
+  stype = public.numeric_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.numeric_ord_ope.
---! @param state eql_v3.numeric_ord_ope
---! @param value eql_v3.numeric_ord_ope
---! @return eql_v3.numeric_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.numeric_ord_ope, value eql_v3.numeric_ord_ope)
-RETURNS eql_v3.numeric_ord_ope
+--! @brief State function for max on public.numeric_ord_ope.
+--! @param state public.numeric_ord_ope
+--! @param value public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord_ope, value public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.numeric_ord_ope.
---! @param input eql_v3.numeric_ord_ope
---! @return eql_v3.numeric_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.numeric_ord_ope) (
+--! @brief max aggregate for public.numeric_ord_ope.
+--! @param input public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE AGGREGATE eql_v3.max(public.numeric_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.numeric_ord_ope,
+  stype = public.numeric_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/numeric/numeric_ord_ope_functions.sql b/src/v3/scalars/numeric/numeric_ord_ope_functions.sql
index 18f4d5e70..a848a55a5 100644
--- a/src/v3/scalars/numeric/numeric_ord_ope_functions.sql
+++ b/src/v3/scalars/numeric/numeric_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_ope_functions.sql
---! @brief Functions for eql_v3.numeric_ord_ope.
+--! @brief Functions for public.numeric_ord_ope.
 
---! @brief Index extractor for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Index extractor for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.numeric_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.numeric_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
+--! @brief Operator wrapper for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.numeric_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.numeric_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
+--! @brief Operator wrapper for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.numeric_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.numeric_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
+--! @brief Operator wrapper for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.numeric_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.numeric_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
+--! @brief Operator wrapper for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.numeric_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.numeric_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
+--! @brief Operator wrapper for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.numeric_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.numeric_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ope.
+--! @brief Operator wrapper for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.numeric_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param selector text
---! @return eql_v3.numeric_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_ord_ope, selector text)
-RETURNS eql_v3.numeric_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ope'; END; $$
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ope, selector text)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param selector integer
---! @return eql_v3.numeric_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_ord_ope, selector integer)
-RETURNS eql_v3.numeric_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ope'; END; $$
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ope, selector integer)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.numeric_ord_ope
---! @return eql_v3.numeric_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.numeric_ord_ope)
-RETURNS eql_v3.numeric_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ope'; END; $$
+--! @param selector public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.numeric_ord_ope
+--! @param selector public.numeric_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.numeric_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.numeric_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.numeric_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.numeric_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.numeric_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.numeric_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.numeric_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.numeric_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
---! @param b eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_ord_ope, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ope, b public.numeric_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
---! @param a eql_v3.numeric_ord_ope
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ope.
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ope
+--! @param b public.numeric_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.numeric_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/numeric/numeric_ord_ope_operators.sql b/src/v3/scalars/numeric/numeric_ord_ope_operators.sql
index 13b4854e0..1374c7995 100644
--- a/src/v3/scalars/numeric/numeric_ord_ope_operators.sql
+++ b/src/v3/scalars/numeric/numeric_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ope_functions.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_ope_operators.sql
---! @brief Operators for eql_v3.numeric_ord_ope.
+--! @brief Operators for public.numeric_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = integer
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = integer
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = integer
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
 );
diff --git a/src/v3/scalars/numeric/numeric_ord_operators.sql b/src/v3/scalars/numeric/numeric_ord_operators.sql
index 65855996a..1f5e0f86b 100644
--- a/src/v3/scalars/numeric/numeric_ord_operators.sql
+++ b/src/v3/scalars/numeric/numeric_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_ord_functions.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_operators.sql
---! @brief Operators for eql_v3.numeric_ord.
+--! @brief Operators for public.numeric_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text
+  LEFTARG = public.numeric_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = integer
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text
+  LEFTARG = public.numeric_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = integer
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text
+  LEFTARG = public.numeric_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text
+  LEFTARG = public.numeric_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = integer
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_ord, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
 );
diff --git a/src/v3/scalars/numeric/numeric_ord_ore_aggregates.sql b/src/v3/scalars/numeric/numeric_ord_ore_aggregates.sql
index 25a24e678..c28f234f6 100644
--- a/src/v3/scalars/numeric/numeric_ord_ore_aggregates.sql
+++ b/src/v3/scalars/numeric/numeric_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_operators.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.numeric_ord_ore.
+--! @brief Aggregates for public.numeric_ord_ore.
 
---! @brief State function for min on eql_v3.numeric_ord_ore.
---! @param state eql_v3.numeric_ord_ore
---! @param value eql_v3.numeric_ord_ore
---! @return eql_v3.numeric_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.numeric_ord_ore, value eql_v3.numeric_ord_ore)
-RETURNS eql_v3.numeric_ord_ore
+--! @brief State function for min on public.numeric_ord_ore.
+--! @param state public.numeric_ord_ore
+--! @param value public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord_ore, value public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.numeric_ord_ore.
---! @param input eql_v3.numeric_ord_ore
---! @return eql_v3.numeric_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.numeric_ord_ore) (
+--! @brief min aggregate for public.numeric_ord_ore.
+--! @param input public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE AGGREGATE eql_v3.min(public.numeric_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.numeric_ord_ore,
+  stype = public.numeric_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.numeric_ord_ore.
---! @param state eql_v3.numeric_ord_ore
---! @param value eql_v3.numeric_ord_ore
---! @return eql_v3.numeric_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.numeric_ord_ore, value eql_v3.numeric_ord_ore)
-RETURNS eql_v3.numeric_ord_ore
+--! @brief State function for max on public.numeric_ord_ore.
+--! @param state public.numeric_ord_ore
+--! @param value public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord_ore, value public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.numeric_ord_ore.
---! @param input eql_v3.numeric_ord_ore
---! @return eql_v3.numeric_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.numeric_ord_ore) (
+--! @brief max aggregate for public.numeric_ord_ore.
+--! @param input public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE AGGREGATE eql_v3.max(public.numeric_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.numeric_ord_ore,
+  stype = public.numeric_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/numeric/numeric_ord_ore_functions.sql b/src/v3/scalars/numeric/numeric_ord_ore_functions.sql
index 43680d566..a78b3644f 100644
--- a/src/v3/scalars/numeric/numeric_ord_ore_functions.sql
+++ b/src/v3/scalars/numeric/numeric_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_ore_functions.sql
---! @brief Functions for eql_v3.numeric_ord_ore.
+--! @brief Functions for public.numeric_ord_ore.
 
---! @brief Index extractor for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Index extractor for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.numeric_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
+--! @brief Operator wrapper for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.numeric_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
+--! @brief Operator wrapper for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.numeric_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
+--! @brief Operator wrapper for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.numeric_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
+--! @brief Operator wrapper for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.numeric_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
+--! @brief Operator wrapper for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.numeric_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.numeric_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.numeric_ord_ore.
+--! @brief Operator wrapper for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.numeric_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param selector text
---! @return eql_v3.numeric_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_ord_ore, selector text)
-RETURNS eql_v3.numeric_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ore'; END; $$
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ore, selector text)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param selector integer
---! @return eql_v3.numeric_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.numeric_ord_ore, selector integer)
-RETURNS eql_v3.numeric_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ore'; END; $$
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ore, selector integer)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.numeric_ord_ore
---! @return eql_v3.numeric_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.numeric_ord_ore)
-RETURNS eql_v3.numeric_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.numeric_ord_ore'; END; $$
+--! @param selector public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.numeric_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.numeric_ord_ore
+--! @param selector public.numeric_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.numeric_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.numeric_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.numeric_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.numeric_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.numeric_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.numeric_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.numeric_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.numeric_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.numeric_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
---! @param b eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_ord_ore, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ore, b public.numeric_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
---! @param a eql_v3.numeric_ord_ore
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.numeric_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.numeric_ord_ore.
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.numeric_ord_ore
+--! @param b public.numeric_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.numeric_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.numeric_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/numeric/numeric_ord_ore_operators.sql b/src/v3/scalars/numeric/numeric_ord_ore_operators.sql
index 0909100f6..5c4e7f8be 100644
--- a/src/v3/scalars/numeric/numeric_ord_ore_operators.sql
+++ b/src/v3/scalars/numeric/numeric_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_functions.sql
 
 --! @file encrypted_domain/numeric/numeric_ord_ore_operators.sql
---! @brief Operators for eql_v3.numeric_ord_ore.
+--! @brief Operators for public.numeric_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = integer
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = integer
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = integer
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.numeric_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.numeric_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
 );
diff --git a/src/v3/scalars/numeric/numeric_types.sql b/src/v3/scalars/numeric/numeric_types.sql
index 1b421236b..a38abe2ec 100644
--- a/src/v3/scalars/numeric/numeric_types.sql
+++ b/src/v3/scalars/numeric/numeric_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.numeric.
+  --! @brief Encrypted domain public.numeric.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'numeric' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'numeric' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.numeric AS jsonb
+    CREATE DOMAIN public.numeric AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.numeric_eq.
+  --! @brief Encrypted domain public.numeric_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'numeric_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'numeric_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.numeric_eq AS jsonb
+    CREATE DOMAIN public.numeric_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.numeric_ord_ore.
+  --! @brief Encrypted domain public.numeric_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'numeric_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'numeric_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.numeric_ord_ore AS jsonb
+    CREATE DOMAIN public.numeric_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.numeric_ord.
+  --! @brief Encrypted domain public.numeric_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'numeric_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'numeric_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.numeric_ord AS jsonb
+    CREATE DOMAIN public.numeric_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.numeric_ord_ope.
+  --! @brief Encrypted domain public.numeric_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'numeric_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'numeric_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.numeric_ord_ope AS jsonb
+    CREATE DOMAIN public.numeric_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/real/real_eq_functions.sql b/src/v3/scalars/real/real_eq_functions.sql
index 2b2023e92..3d399bdfc 100644
--- a/src/v3/scalars/real/real_eq_functions.sql
+++ b/src/v3/scalars/real/real_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/real/real_eq_functions.sql
---! @brief Functions for eql_v3.real_eq.
+--! @brief Functions for public.real_eq.
 
---! @brief Index extractor for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Index extractor for public.real_eq.
+--! @param a public.real_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.real_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.real_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b public.real_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.real_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.real_eq) $$;
 
---! @brief Operator wrapper for eql_v3.real_eq.
+--! @brief Operator wrapper for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.real_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.real_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b public.real_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.real_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.real_eq) $$;
 
---! @brief Operator wrapper for eql_v3.real_eq.
+--! @brief Operator wrapper for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.real_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.real_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.real_eq, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.real_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.real_eq, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.real_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.real_eq, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.real_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.real_eq, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.real_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_eq, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_eq, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param selector text
---! @return eql_v3.real_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_eq, selector text)
-RETURNS eql_v3.real_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_eq'; END; $$
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.real_eq, selector text)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param selector integer
---! @return eql_v3.real_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_eq, selector integer)
-RETURNS eql_v3.real_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_eq'; END; $$
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.real_eq, selector integer)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param selector eql_v3.real_eq
---! @return eql_v3.real_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.real_eq)
-RETURNS eql_v3.real_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_eq'; END; $$
+--! @param selector public.real_eq
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_eq)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param selector eql_v3.real_eq
+--! @param selector public.real_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.real_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.real_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.real_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.real_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.real_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.real_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.real_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.real_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.real_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
---! @param b eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_eq, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_eq, b public.real_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
---! @param a eql_v3.real_eq
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_eq.
+--! @brief Unsupported operator blocker for public.real_eq.
 --! @param a jsonb
---! @param b eql_v3.real_eq
+--! @param b public.real_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.real_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/real/real_eq_operators.sql b/src/v3/scalars/real/real_eq_operators.sql
index ddc103cac..079e7aebc 100644
--- a/src/v3/scalars/real/real_eq_operators.sql
+++ b/src/v3/scalars/real/real_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/real/real_eq_functions.sql
 
 --! @file encrypted_domain/real/real_eq_operators.sql
---! @brief Operators for eql_v3.real_eq.
+--! @brief Operators for public.real_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text
+  LEFTARG = public.real_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = integer
+  LEFTARG = public.real_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text
+  LEFTARG = public.real_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = integer
+  LEFTARG = public.real_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text
+  LEFTARG = public.real_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text[]
+  LEFTARG = public.real_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text[]
+  LEFTARG = public.real_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonpath
+  LEFTARG = public.real_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonpath
+  LEFTARG = public.real_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text[]
+  LEFTARG = public.real_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text[]
+  LEFTARG = public.real_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text
+  LEFTARG = public.real_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = integer
+  LEFTARG = public.real_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text[]
+  LEFTARG = public.real_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = text[]
+  LEFTARG = public.real_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = eql_v3.real_eq
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_eq, RIGHTARG = jsonb
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_eq
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
 );
diff --git a/src/v3/scalars/real/real_functions.sql b/src/v3/scalars/real/real_functions.sql
index 61e24eade..a11bc18a9 100644
--- a/src/v3/scalars/real/real_functions.sql
+++ b/src/v3/scalars/real/real_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/real/real_functions.sql
---! @brief Functions for eql_v3.real.
+--! @brief Functions for public.real.
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.eq(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.neq(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.lt(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.lte(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.gt(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.gte(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.contains(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param selector text
---! @return eql_v3.real
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real, selector text)
-RETURNS eql_v3.real IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real'; END; $$
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a public.real, selector text)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param selector integer
---! @return eql_v3.real
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real, selector integer)
-RETURNS eql_v3.real IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real'; END; $$
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a public.real, selector integer)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param selector eql_v3.real
---! @return eql_v3.real
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.real)
-RETURNS eql_v3.real IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real'; END; $$
+--! @param selector public.real
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param selector eql_v3.real
+--! @param selector public.real
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.real)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.real, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.real, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.real, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.real, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.real, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.real, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.real, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.real, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.real, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.real, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.real, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.real, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.real, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.real, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.real, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
---! @param b eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal."||"(a public.real, b public.real)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
---! @param a eql_v3.real
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.real, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real.
+--! @brief Unsupported operator blocker for public.real.
 --! @param a jsonb
---! @param b eql_v3.real
+--! @param b public.real
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.real)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/real/real_operators.sql b/src/v3/scalars/real/real_operators.sql
index c46f32874..24359d790 100644
--- a/src/v3/scalars/real/real_operators.sql
+++ b/src/v3/scalars/real/real_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/real/real_functions.sql
 
 --! @file encrypted_domain/real/real_operators.sql
---! @brief Operators for eql_v3.real.
+--! @brief Operators for public.real.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real, RIGHTARG = text
+  LEFTARG = public.real, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real, RIGHTARG = integer
+  LEFTARG = public.real, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real, RIGHTARG = text
+  LEFTARG = public.real, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real, RIGHTARG = integer
+  LEFTARG = public.real, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.real, RIGHTARG = text
+  LEFTARG = public.real, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.real, RIGHTARG = text[]
+  LEFTARG = public.real, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.real, RIGHTARG = text[]
+  LEFTARG = public.real, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.real, RIGHTARG = jsonpath
+  LEFTARG = public.real, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.real, RIGHTARG = jsonpath
+  LEFTARG = public.real, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.real, RIGHTARG = text[]
+  LEFTARG = public.real, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.real, RIGHTARG = text[]
+  LEFTARG = public.real, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real, RIGHTARG = text
+  LEFTARG = public.real, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real, RIGHTARG = integer
+  LEFTARG = public.real, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real, RIGHTARG = text[]
+  LEFTARG = public.real, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.real, RIGHTARG = text[]
+  LEFTARG = public.real, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real, RIGHTARG = eql_v3.real
+  LEFTARG = public.real, RIGHTARG = public.real
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real, RIGHTARG = jsonb
+  LEFTARG = public.real, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real
+  LEFTARG = jsonb, RIGHTARG = public.real
 );
diff --git a/src/v3/scalars/real/real_ord_aggregates.sql b/src/v3/scalars/real/real_ord_aggregates.sql
index 110ea5d89..c1c583044 100644
--- a/src/v3/scalars/real/real_ord_aggregates.sql
+++ b/src/v3/scalars/real/real_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/real/real_ord_operators.sql
 
 --! @file encrypted_domain/real/real_ord_aggregates.sql
---! @brief Aggregates for eql_v3.real_ord.
+--! @brief Aggregates for public.real_ord.
 
---! @brief State function for min on eql_v3.real_ord.
---! @param state eql_v3.real_ord
---! @param value eql_v3.real_ord
---! @return eql_v3.real_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.real_ord, value eql_v3.real_ord)
-RETURNS eql_v3.real_ord
+--! @brief State function for min on public.real_ord.
+--! @param state public.real_ord
+--! @param value public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord, value public.real_ord)
+RETURNS public.real_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.real_ord.
---! @param input eql_v3.real_ord
---! @return eql_v3.real_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.real_ord) (
+--! @brief min aggregate for public.real_ord.
+--! @param input public.real_ord
+--! @return public.real_ord
+CREATE AGGREGATE eql_v3.min(public.real_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.real_ord,
+  stype = public.real_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.real_ord.
---! @param state eql_v3.real_ord
---! @param value eql_v3.real_ord
---! @return eql_v3.real_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.real_ord, value eql_v3.real_ord)
-RETURNS eql_v3.real_ord
+--! @brief State function for max on public.real_ord.
+--! @param state public.real_ord
+--! @param value public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord, value public.real_ord)
+RETURNS public.real_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.real_ord.
---! @param input eql_v3.real_ord
---! @return eql_v3.real_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.real_ord) (
+--! @brief max aggregate for public.real_ord.
+--! @param input public.real_ord
+--! @return public.real_ord
+CREATE AGGREGATE eql_v3.max(public.real_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.real_ord,
+  stype = public.real_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/real/real_ord_functions.sql b/src/v3/scalars/real/real_ord_functions.sql
index 5a355153e..820ef7007 100644
--- a/src/v3/scalars/real/real_ord_functions.sql
+++ b/src/v3/scalars/real/real_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/real/real_ord_functions.sql
---! @brief Functions for eql_v3.real_ord.
+--! @brief Functions for public.real_ord.
 
---! @brief Index extractor for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Index extractor for public.real_ord.
+--! @param a public.real_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.real_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.real_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.real_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.real_ord) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
+--! @brief Operator wrapper for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.real_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.real_ord) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
+--! @brief Operator wrapper for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.real_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.real_ord) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
+--! @brief Operator wrapper for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.real_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.real_ord) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
+--! @brief Operator wrapper for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.real_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.real_ord) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
+--! @brief Operator wrapper for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.real_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.real_ord) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord.
+--! @brief Operator wrapper for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord, b public.real_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
+--! @brief Unsupported operator blocker for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord, b public.real_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
+--! @brief Unsupported operator blocker for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param selector text
---! @return eql_v3.real_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_ord, selector text)
-RETURNS eql_v3.real_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord'; END; $$
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord, selector text)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param selector integer
---! @return eql_v3.real_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_ord, selector integer)
-RETURNS eql_v3.real_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord'; END; $$
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord, selector integer)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
+--! @brief Unsupported operator blocker for public.real_ord.
 --! @param a jsonb
---! @param selector eql_v3.real_ord
---! @return eql_v3.real_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.real_ord)
-RETURNS eql_v3.real_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord'; END; $$
+--! @param selector public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
+--! @brief Unsupported operator blocker for public.real_ord.
 --! @param a jsonb
---! @param selector eql_v3.real_ord
+--! @param selector public.real_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.real_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.real_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.real_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.real_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.real_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.real_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.real_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.real_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.real_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
---! @param b eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_ord, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord, b public.real_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
---! @param a eql_v3.real_ord
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord.
+--! @brief Unsupported operator blocker for public.real_ord.
 --! @param a jsonb
---! @param b eql_v3.real_ord
+--! @param b public.real_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.real_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/real/real_ord_ope_aggregates.sql b/src/v3/scalars/real/real_ord_ope_aggregates.sql
index cb3c37a34..ccdd18ebe 100644
--- a/src/v3/scalars/real/real_ord_ope_aggregates.sql
+++ b/src/v3/scalars/real/real_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/real/real_ord_ope_operators.sql
 
 --! @file encrypted_domain/real/real_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.real_ord_ope.
+--! @brief Aggregates for public.real_ord_ope.
 
---! @brief State function for min on eql_v3.real_ord_ope.
---! @param state eql_v3.real_ord_ope
---! @param value eql_v3.real_ord_ope
---! @return eql_v3.real_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.real_ord_ope, value eql_v3.real_ord_ope)
-RETURNS eql_v3.real_ord_ope
+--! @brief State function for min on public.real_ord_ope.
+--! @param state public.real_ord_ope
+--! @param value public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord_ope, value public.real_ord_ope)
+RETURNS public.real_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.real_ord_ope.
---! @param input eql_v3.real_ord_ope
---! @return eql_v3.real_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.real_ord_ope) (
+--! @brief min aggregate for public.real_ord_ope.
+--! @param input public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE AGGREGATE eql_v3.min(public.real_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.real_ord_ope,
+  stype = public.real_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.real_ord_ope.
---! @param state eql_v3.real_ord_ope
---! @param value eql_v3.real_ord_ope
---! @return eql_v3.real_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.real_ord_ope, value eql_v3.real_ord_ope)
-RETURNS eql_v3.real_ord_ope
+--! @brief State function for max on public.real_ord_ope.
+--! @param state public.real_ord_ope
+--! @param value public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord_ope, value public.real_ord_ope)
+RETURNS public.real_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.real_ord_ope.
---! @param input eql_v3.real_ord_ope
---! @return eql_v3.real_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.real_ord_ope) (
+--! @brief max aggregate for public.real_ord_ope.
+--! @param input public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE AGGREGATE eql_v3.max(public.real_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.real_ord_ope,
+  stype = public.real_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/real/real_ord_ope_functions.sql b/src/v3/scalars/real/real_ord_ope_functions.sql
index f6a0abf8f..51bacfd74 100644
--- a/src/v3/scalars/real/real_ord_ope_functions.sql
+++ b/src/v3/scalars/real/real_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/real/real_ord_ope_functions.sql
---! @brief Functions for eql_v3.real_ord_ope.
+--! @brief Functions for public.real_ord_ope.
 
---! @brief Index extractor for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Index extractor for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.real_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.real_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
+--! @brief Operator wrapper for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.real_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.real_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
+--! @brief Operator wrapper for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.real_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.real_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
+--! @brief Operator wrapper for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.real_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.real_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
+--! @brief Operator wrapper for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.real_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.real_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
+--! @brief Operator wrapper for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.real_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.real_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ope.
+--! @brief Operator wrapper for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.real_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
+--! @brief Unsupported operator blocker for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
+--! @brief Unsupported operator blocker for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param selector text
---! @return eql_v3.real_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_ord_ope, selector text)
-RETURNS eql_v3.real_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord_ope'; END; $$
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ope, selector text)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param selector integer
---! @return eql_v3.real_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_ord_ope, selector integer)
-RETURNS eql_v3.real_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord_ope'; END; $$
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ope, selector integer)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
+--! @brief Unsupported operator blocker for public.real_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.real_ord_ope
---! @return eql_v3.real_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.real_ord_ope)
-RETURNS eql_v3.real_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord_ope'; END; $$
+--! @param selector public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord_ope)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
+--! @brief Unsupported operator blocker for public.real_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.real_ord_ope
+--! @param selector public.real_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.real_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.real_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.real_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.real_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.real_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.real_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.real_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.real_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
---! @param b eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_ord_ope, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ope, b public.real_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
---! @param a eql_v3.real_ord_ope
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ope.
+--! @brief Unsupported operator blocker for public.real_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ope
+--! @param b public.real_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.real_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/real/real_ord_ope_operators.sql b/src/v3/scalars/real/real_ord_ope_operators.sql
index 9265f70d6..2f0156172 100644
--- a/src/v3/scalars/real/real_ord_ope_operators.sql
+++ b/src/v3/scalars/real/real_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/real/real_ord_ope_functions.sql
 
 --! @file encrypted_domain/real/real_ord_ope_operators.sql
---! @brief Operators for eql_v3.real_ord_ope.
+--! @brief Operators for public.real_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = integer
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = integer
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = integer
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
 );
diff --git a/src/v3/scalars/real/real_ord_operators.sql b/src/v3/scalars/real/real_ord_operators.sql
index e3bbb52e3..6796bc13f 100644
--- a/src/v3/scalars/real/real_ord_operators.sql
+++ b/src/v3/scalars/real/real_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/real/real_ord_functions.sql
 
 --! @file encrypted_domain/real/real_ord_operators.sql
---! @brief Operators for eql_v3.real_ord.
+--! @brief Operators for public.real_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text
+  LEFTARG = public.real_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = integer
+  LEFTARG = public.real_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text
+  LEFTARG = public.real_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = integer
+  LEFTARG = public.real_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text
+  LEFTARG = public.real_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text[]
+  LEFTARG = public.real_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text[]
+  LEFTARG = public.real_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonpath
+  LEFTARG = public.real_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonpath
+  LEFTARG = public.real_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text[]
+  LEFTARG = public.real_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text[]
+  LEFTARG = public.real_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text
+  LEFTARG = public.real_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = integer
+  LEFTARG = public.real_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text[]
+  LEFTARG = public.real_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = text[]
+  LEFTARG = public.real_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = eql_v3.real_ord
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_ord, RIGHTARG = jsonb
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
 );
diff --git a/src/v3/scalars/real/real_ord_ore_aggregates.sql b/src/v3/scalars/real/real_ord_ore_aggregates.sql
index 5e42f0d4b..13488c3d1 100644
--- a/src/v3/scalars/real/real_ord_ore_aggregates.sql
+++ b/src/v3/scalars/real/real_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/real/real_ord_ore_operators.sql
 
 --! @file encrypted_domain/real/real_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.real_ord_ore.
+--! @brief Aggregates for public.real_ord_ore.
 
---! @brief State function for min on eql_v3.real_ord_ore.
---! @param state eql_v3.real_ord_ore
---! @param value eql_v3.real_ord_ore
---! @return eql_v3.real_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.real_ord_ore, value eql_v3.real_ord_ore)
-RETURNS eql_v3.real_ord_ore
+--! @brief State function for min on public.real_ord_ore.
+--! @param state public.real_ord_ore
+--! @param value public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord_ore, value public.real_ord_ore)
+RETURNS public.real_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.real_ord_ore.
---! @param input eql_v3.real_ord_ore
---! @return eql_v3.real_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.real_ord_ore) (
+--! @brief min aggregate for public.real_ord_ore.
+--! @param input public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE AGGREGATE eql_v3.min(public.real_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.real_ord_ore,
+  stype = public.real_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.real_ord_ore.
---! @param state eql_v3.real_ord_ore
---! @param value eql_v3.real_ord_ore
---! @return eql_v3.real_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.real_ord_ore, value eql_v3.real_ord_ore)
-RETURNS eql_v3.real_ord_ore
+--! @brief State function for max on public.real_ord_ore.
+--! @param state public.real_ord_ore
+--! @param value public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord_ore, value public.real_ord_ore)
+RETURNS public.real_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.real_ord_ore.
---! @param input eql_v3.real_ord_ore
---! @return eql_v3.real_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.real_ord_ore) (
+--! @brief max aggregate for public.real_ord_ore.
+--! @param input public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE AGGREGATE eql_v3.max(public.real_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.real_ord_ore,
+  stype = public.real_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/real/real_ord_ore_functions.sql b/src/v3/scalars/real/real_ord_ore_functions.sql
index 8edbb1a1d..d8f1457a8 100644
--- a/src/v3/scalars/real/real_ord_ore_functions.sql
+++ b/src/v3/scalars/real/real_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/real/real_ord_ore_functions.sql
---! @brief Functions for eql_v3.real_ord_ore.
+--! @brief Functions for public.real_ord_ore.
 
---! @brief Index extractor for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Index extractor for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.real_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.real_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.real_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
+--! @brief Operator wrapper for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.real_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.real_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
+--! @brief Operator wrapper for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.real_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.real_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
+--! @brief Operator wrapper for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.real_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.real_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
+--! @brief Operator wrapper for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.real_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.real_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
+--! @brief Operator wrapper for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.real_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.real_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.real_ord_ore.
+--! @brief Operator wrapper for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.real_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
+--! @brief Unsupported operator blocker for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
+--! @brief Unsupported operator blocker for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param selector text
---! @return eql_v3.real_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_ord_ore, selector text)
-RETURNS eql_v3.real_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord_ore'; END; $$
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ore, selector text)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param selector integer
---! @return eql_v3.real_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.real_ord_ore, selector integer)
-RETURNS eql_v3.real_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord_ore'; END; $$
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ore, selector integer)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
+--! @brief Unsupported operator blocker for public.real_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.real_ord_ore
---! @return eql_v3.real_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.real_ord_ore)
-RETURNS eql_v3.real_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.real_ord_ore'; END; $$
+--! @param selector public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord_ore)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.real_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
+--! @brief Unsupported operator blocker for public.real_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.real_ord_ore
+--! @param selector public.real_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.real_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.real_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.real_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.real_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.real_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.real_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.real_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.real_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.real_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
---! @param b eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_ord_ore, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ore, b public.real_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
---! @param a eql_v3.real_ord_ore
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.real_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.real_ord_ore.
+--! @brief Unsupported operator blocker for public.real_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.real_ord_ore
+--! @param b public.real_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.real_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.real_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/real/real_ord_ore_operators.sql b/src/v3/scalars/real/real_ord_ore_operators.sql
index 15585b172..7782cb4f6 100644
--- a/src/v3/scalars/real/real_ord_ore_operators.sql
+++ b/src/v3/scalars/real/real_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/real/real_ord_ore_functions.sql
 
 --! @file encrypted_domain/real/real_ord_ore_operators.sql
---! @brief Operators for eql_v3.real_ord_ore.
+--! @brief Operators for public.real_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = integer
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = integer
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = integer
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.real_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.real_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
 );
diff --git a/src/v3/scalars/real/real_types.sql b/src/v3/scalars/real/real_types.sql
index d21083b22..8bf6a2511 100644
--- a/src/v3/scalars/real/real_types.sql
+++ b/src/v3/scalars/real/real_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.real.
+  --! @brief Encrypted domain public.real.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'real' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'real' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.real AS jsonb
+    CREATE DOMAIN public.real AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.real_eq.
+  --! @brief Encrypted domain public.real_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'real_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'real_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.real_eq AS jsonb
+    CREATE DOMAIN public.real_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.real_ord_ore.
+  --! @brief Encrypted domain public.real_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'real_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'real_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.real_ord_ore AS jsonb
+    CREATE DOMAIN public.real_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.real_ord.
+  --! @brief Encrypted domain public.real_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'real_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'real_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.real_ord AS jsonb
+    CREATE DOMAIN public.real_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.real_ord_ope.
+  --! @brief Encrypted domain public.real_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'real_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'real_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.real_ord_ope AS jsonb
+    CREATE DOMAIN public.real_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/smallint/smallint_eq_functions.sql b/src/v3/scalars/smallint/smallint_eq_functions.sql
index 0bc22472e..d3dbf167e 100644
--- a/src/v3/scalars/smallint/smallint_eq_functions.sql
+++ b/src/v3/scalars/smallint/smallint_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/smallint/smallint_eq_functions.sql
---! @brief Functions for eql_v3.smallint_eq.
+--! @brief Functions for public.smallint_eq.
 
---! @brief Index extractor for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Index extractor for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.smallint_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.smallint_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.smallint_eq) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_eq.
+--! @brief Operator wrapper for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.smallint_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.smallint_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.smallint_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.smallint_eq) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_eq.
+--! @brief Operator wrapper for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.smallint_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.smallint_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_eq, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param selector text
---! @return eql_v3.smallint_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_eq, selector text)
-RETURNS eql_v3.smallint_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_eq'; END; $$
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_eq, selector text)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param selector integer
---! @return eql_v3.smallint_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_eq, selector integer)
-RETURNS eql_v3.smallint_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_eq'; END; $$
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_eq, selector integer)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param selector eql_v3.smallint_eq
---! @return eql_v3.smallint_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.smallint_eq)
-RETURNS eql_v3.smallint_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_eq'; END; $$
+--! @param selector public.smallint_eq
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_eq)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param selector eql_v3.smallint_eq
+--! @param selector public.smallint_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.smallint_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.smallint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.smallint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.smallint_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.smallint_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.smallint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.smallint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.smallint_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
---! @param b eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_eq, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_eq, b public.smallint_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
---! @param a eql_v3.smallint_eq
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_eq.
+--! @brief Unsupported operator blocker for public.smallint_eq.
 --! @param a jsonb
---! @param b eql_v3.smallint_eq
+--! @param b public.smallint_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.smallint_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/smallint/smallint_eq_operators.sql b/src/v3/scalars/smallint/smallint_eq_operators.sql
index 993d424cc..4f5c77fb2 100644
--- a/src/v3/scalars/smallint/smallint_eq_operators.sql
+++ b/src/v3/scalars/smallint/smallint_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_eq_functions.sql
 
 --! @file encrypted_domain/smallint/smallint_eq_operators.sql
---! @brief Operators for eql_v3.smallint_eq.
+--! @brief Operators for public.smallint_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text
+  LEFTARG = public.smallint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = integer
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text
+  LEFTARG = public.smallint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = integer
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text
+  LEFTARG = public.smallint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text[]
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text[]
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text[]
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text[]
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text
+  LEFTARG = public.smallint_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = integer
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text[]
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = text[]
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_eq, RIGHTARG = jsonb
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_eq
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
 );
diff --git a/src/v3/scalars/smallint/smallint_functions.sql b/src/v3/scalars/smallint/smallint_functions.sql
index 9e606da53..fa1e9c81e 100644
--- a/src/v3/scalars/smallint/smallint_functions.sql
+++ b/src/v3/scalars/smallint/smallint_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/smallint/smallint_functions.sql
---! @brief Functions for eql_v3.smallint.
+--! @brief Functions for public.smallint.
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.eq(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.neq(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param selector text
---! @return eql_v3.smallint
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint, selector text)
-RETURNS eql_v3.smallint IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint'; END; $$
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint, selector text)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param selector integer
---! @return eql_v3.smallint
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint, selector integer)
-RETURNS eql_v3.smallint IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint'; END; $$
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint, selector integer)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param selector eql_v3.smallint
---! @return eql_v3.smallint
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.smallint)
-RETURNS eql_v3.smallint IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint'; END; $$
+--! @param selector public.smallint
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param selector eql_v3.smallint
+--! @param selector public.smallint
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.smallint, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.smallint, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.smallint, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.smallint, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.smallint, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.smallint, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.smallint, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.smallint, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
---! @param b eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint, b public.smallint)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
---! @param a eql_v3.smallint
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint.
+--! @brief Unsupported operator blocker for public.smallint.
 --! @param a jsonb
---! @param b eql_v3.smallint
+--! @param b public.smallint
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.smallint)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/smallint/smallint_operators.sql b/src/v3/scalars/smallint/smallint_operators.sql
index 3a3bfc443..91709828b 100644
--- a/src/v3/scalars/smallint/smallint_operators.sql
+++ b/src/v3/scalars/smallint/smallint_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_functions.sql
 
 --! @file encrypted_domain/smallint/smallint_operators.sql
---! @brief Operators for eql_v3.smallint.
+--! @brief Operators for public.smallint.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text
+  LEFTARG = public.smallint, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint, RIGHTARG = integer
+  LEFTARG = public.smallint, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text
+  LEFTARG = public.smallint, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint, RIGHTARG = integer
+  LEFTARG = public.smallint, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text
+  LEFTARG = public.smallint, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text[]
+  LEFTARG = public.smallint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text[]
+  LEFTARG = public.smallint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonpath
+  LEFTARG = public.smallint, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonpath
+  LEFTARG = public.smallint, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text[]
+  LEFTARG = public.smallint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text[]
+  LEFTARG = public.smallint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text
+  LEFTARG = public.smallint, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint, RIGHTARG = integer
+  LEFTARG = public.smallint, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text[]
+  LEFTARG = public.smallint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.smallint, RIGHTARG = text[]
+  LEFTARG = public.smallint, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint, RIGHTARG = eql_v3.smallint
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint, RIGHTARG = jsonb
+  LEFTARG = public.smallint, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint
+  LEFTARG = jsonb, RIGHTARG = public.smallint
 );
diff --git a/src/v3/scalars/smallint/smallint_ord_aggregates.sql b/src/v3/scalars/smallint/smallint_ord_aggregates.sql
index 53c02e062..40815bde2 100644
--- a/src/v3/scalars/smallint/smallint_ord_aggregates.sql
+++ b/src/v3/scalars/smallint/smallint_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_ord_operators.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_aggregates.sql
---! @brief Aggregates for eql_v3.smallint_ord.
+--! @brief Aggregates for public.smallint_ord.
 
---! @brief State function for min on eql_v3.smallint_ord.
---! @param state eql_v3.smallint_ord
---! @param value eql_v3.smallint_ord
---! @return eql_v3.smallint_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.smallint_ord, value eql_v3.smallint_ord)
-RETURNS eql_v3.smallint_ord
+--! @brief State function for min on public.smallint_ord.
+--! @param state public.smallint_ord
+--! @param value public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord, value public.smallint_ord)
+RETURNS public.smallint_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.smallint_ord.
---! @param input eql_v3.smallint_ord
---! @return eql_v3.smallint_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.smallint_ord) (
+--! @brief min aggregate for public.smallint_ord.
+--! @param input public.smallint_ord
+--! @return public.smallint_ord
+CREATE AGGREGATE eql_v3.min(public.smallint_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.smallint_ord,
+  stype = public.smallint_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.smallint_ord.
---! @param state eql_v3.smallint_ord
---! @param value eql_v3.smallint_ord
---! @return eql_v3.smallint_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.smallint_ord, value eql_v3.smallint_ord)
-RETURNS eql_v3.smallint_ord
+--! @brief State function for max on public.smallint_ord.
+--! @param state public.smallint_ord
+--! @param value public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord, value public.smallint_ord)
+RETURNS public.smallint_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.smallint_ord.
---! @param input eql_v3.smallint_ord
---! @return eql_v3.smallint_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.smallint_ord) (
+--! @brief max aggregate for public.smallint_ord.
+--! @param input public.smallint_ord
+--! @return public.smallint_ord
+CREATE AGGREGATE eql_v3.max(public.smallint_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.smallint_ord,
+  stype = public.smallint_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/smallint/smallint_ord_functions.sql b/src/v3/scalars/smallint/smallint_ord_functions.sql
index 054f0f98a..a973fbe1c 100644
--- a/src/v3/scalars/smallint/smallint_ord_functions.sql
+++ b/src/v3/scalars/smallint/smallint_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_functions.sql
---! @brief Functions for eql_v3.smallint_ord.
+--! @brief Functions for public.smallint_ord.
 
---! @brief Index extractor for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Index extractor for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.smallint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.smallint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
+--! @brief Operator wrapper for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.smallint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.smallint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
+--! @brief Operator wrapper for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.smallint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.smallint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
+--! @brief Operator wrapper for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.smallint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.smallint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
+--! @brief Operator wrapper for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.smallint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.smallint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
+--! @brief Operator wrapper for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.smallint_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.smallint_ord) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord.
+--! @brief Operator wrapper for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
+--! @brief Unsupported operator blocker for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord, b public.smallint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
+--! @brief Unsupported operator blocker for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param selector text
---! @return eql_v3.smallint_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_ord, selector text)
-RETURNS eql_v3.smallint_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord'; END; $$
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord, selector text)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param selector integer
---! @return eql_v3.smallint_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_ord, selector integer)
-RETURNS eql_v3.smallint_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord'; END; $$
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord, selector integer)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
+--! @brief Unsupported operator blocker for public.smallint_ord.
 --! @param a jsonb
---! @param selector eql_v3.smallint_ord
---! @return eql_v3.smallint_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.smallint_ord)
-RETURNS eql_v3.smallint_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord'; END; $$
+--! @param selector public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
+--! @brief Unsupported operator blocker for public.smallint_ord.
 --! @param a jsonb
---! @param selector eql_v3.smallint_ord
+--! @param selector public.smallint_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.smallint_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.smallint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.smallint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.smallint_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.smallint_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.smallint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.smallint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.smallint_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
---! @param b eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_ord, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord, b public.smallint_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
---! @param a eql_v3.smallint_ord
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord.
+--! @brief Unsupported operator blocker for public.smallint_ord.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord
+--! @param b public.smallint_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.smallint_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/smallint/smallint_ord_ope_aggregates.sql b/src/v3/scalars/smallint/smallint_ord_ope_aggregates.sql
index a7afd8f96..2775aba1f 100644
--- a/src/v3/scalars/smallint/smallint_ord_ope_aggregates.sql
+++ b/src/v3/scalars/smallint/smallint_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ope_operators.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.smallint_ord_ope.
+--! @brief Aggregates for public.smallint_ord_ope.
 
---! @brief State function for min on eql_v3.smallint_ord_ope.
---! @param state eql_v3.smallint_ord_ope
---! @param value eql_v3.smallint_ord_ope
---! @return eql_v3.smallint_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.smallint_ord_ope, value eql_v3.smallint_ord_ope)
-RETURNS eql_v3.smallint_ord_ope
+--! @brief State function for min on public.smallint_ord_ope.
+--! @param state public.smallint_ord_ope
+--! @param value public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord_ope, value public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.smallint_ord_ope.
---! @param input eql_v3.smallint_ord_ope
---! @return eql_v3.smallint_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.smallint_ord_ope) (
+--! @brief min aggregate for public.smallint_ord_ope.
+--! @param input public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE AGGREGATE eql_v3.min(public.smallint_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.smallint_ord_ope,
+  stype = public.smallint_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.smallint_ord_ope.
---! @param state eql_v3.smallint_ord_ope
---! @param value eql_v3.smallint_ord_ope
---! @return eql_v3.smallint_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.smallint_ord_ope, value eql_v3.smallint_ord_ope)
-RETURNS eql_v3.smallint_ord_ope
+--! @brief State function for max on public.smallint_ord_ope.
+--! @param state public.smallint_ord_ope
+--! @param value public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord_ope, value public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.smallint_ord_ope.
---! @param input eql_v3.smallint_ord_ope
---! @return eql_v3.smallint_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.smallint_ord_ope) (
+--! @brief max aggregate for public.smallint_ord_ope.
+--! @param input public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE AGGREGATE eql_v3.max(public.smallint_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.smallint_ord_ope,
+  stype = public.smallint_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/smallint/smallint_ord_ope_functions.sql b/src/v3/scalars/smallint/smallint_ord_ope_functions.sql
index 1160167b8..ff4d115f6 100644
--- a/src/v3/scalars/smallint/smallint_ord_ope_functions.sql
+++ b/src/v3/scalars/smallint/smallint_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_ope_functions.sql
---! @brief Functions for eql_v3.smallint_ord_ope.
+--! @brief Functions for public.smallint_ord_ope.
 
---! @brief Index extractor for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Index extractor for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.smallint_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.smallint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
+--! @brief Operator wrapper for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.smallint_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.smallint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
+--! @brief Operator wrapper for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.smallint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.smallint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
+--! @brief Operator wrapper for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.smallint_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.smallint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
+--! @brief Operator wrapper for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.smallint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.smallint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
+--! @brief Operator wrapper for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.smallint_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.smallint_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ope.
+--! @brief Operator wrapper for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.smallint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param selector text
---! @return eql_v3.smallint_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_ord_ope, selector text)
-RETURNS eql_v3.smallint_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord_ope'; END; $$
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ope, selector text)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param selector integer
---! @return eql_v3.smallint_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_ord_ope, selector integer)
-RETURNS eql_v3.smallint_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord_ope'; END; $$
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ope, selector integer)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.smallint_ord_ope
---! @return eql_v3.smallint_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.smallint_ord_ope)
-RETURNS eql_v3.smallint_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord_ope'; END; $$
+--! @param selector public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.smallint_ord_ope
+--! @param selector public.smallint_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.smallint_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.smallint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.smallint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.smallint_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.smallint_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.smallint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.smallint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.smallint_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
---! @param b eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_ord_ope, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ope, b public.smallint_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
---! @param a eql_v3.smallint_ord_ope
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ope.
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ope
+--! @param b public.smallint_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.smallint_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/smallint/smallint_ord_ope_operators.sql b/src/v3/scalars/smallint/smallint_ord_ope_operators.sql
index db4fb7570..df4f7b9b6 100644
--- a/src/v3/scalars/smallint/smallint_ord_ope_operators.sql
+++ b/src/v3/scalars/smallint/smallint_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ope_functions.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_ope_operators.sql
---! @brief Operators for eql_v3.smallint_ord_ope.
+--! @brief Operators for public.smallint_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = integer
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = integer
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = integer
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
 );
diff --git a/src/v3/scalars/smallint/smallint_ord_operators.sql b/src/v3/scalars/smallint/smallint_ord_operators.sql
index 9879374d3..bf9588bcb 100644
--- a/src/v3/scalars/smallint/smallint_ord_operators.sql
+++ b/src/v3/scalars/smallint/smallint_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_ord_functions.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_operators.sql
---! @brief Operators for eql_v3.smallint_ord.
+--! @brief Operators for public.smallint_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text
+  LEFTARG = public.smallint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = integer
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text
+  LEFTARG = public.smallint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = integer
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text
+  LEFTARG = public.smallint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text
+  LEFTARG = public.smallint_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = integer
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_ord, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
 );
diff --git a/src/v3/scalars/smallint/smallint_ord_ore_aggregates.sql b/src/v3/scalars/smallint/smallint_ord_ore_aggregates.sql
index 474af4950..018c68586 100644
--- a/src/v3/scalars/smallint/smallint_ord_ore_aggregates.sql
+++ b/src/v3/scalars/smallint/smallint_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ore_operators.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.smallint_ord_ore.
+--! @brief Aggregates for public.smallint_ord_ore.
 
---! @brief State function for min on eql_v3.smallint_ord_ore.
---! @param state eql_v3.smallint_ord_ore
---! @param value eql_v3.smallint_ord_ore
---! @return eql_v3.smallint_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.smallint_ord_ore, value eql_v3.smallint_ord_ore)
-RETURNS eql_v3.smallint_ord_ore
+--! @brief State function for min on public.smallint_ord_ore.
+--! @param state public.smallint_ord_ore
+--! @param value public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord_ore, value public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.smallint_ord_ore.
---! @param input eql_v3.smallint_ord_ore
---! @return eql_v3.smallint_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.smallint_ord_ore) (
+--! @brief min aggregate for public.smallint_ord_ore.
+--! @param input public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE AGGREGATE eql_v3.min(public.smallint_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.smallint_ord_ore,
+  stype = public.smallint_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.smallint_ord_ore.
---! @param state eql_v3.smallint_ord_ore
---! @param value eql_v3.smallint_ord_ore
---! @return eql_v3.smallint_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.smallint_ord_ore, value eql_v3.smallint_ord_ore)
-RETURNS eql_v3.smallint_ord_ore
+--! @brief State function for max on public.smallint_ord_ore.
+--! @param state public.smallint_ord_ore
+--! @param value public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord_ore, value public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.smallint_ord_ore.
---! @param input eql_v3.smallint_ord_ore
---! @return eql_v3.smallint_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.smallint_ord_ore) (
+--! @brief max aggregate for public.smallint_ord_ore.
+--! @param input public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE AGGREGATE eql_v3.max(public.smallint_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.smallint_ord_ore,
+  stype = public.smallint_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/smallint/smallint_ord_ore_functions.sql b/src/v3/scalars/smallint/smallint_ord_ore_functions.sql
index f0aff96f9..faff596a1 100644
--- a/src/v3/scalars/smallint/smallint_ord_ore_functions.sql
+++ b/src/v3/scalars/smallint/smallint_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_ore_functions.sql
---! @brief Functions for eql_v3.smallint_ord_ore.
+--! @brief Functions for public.smallint_ord_ore.
 
---! @brief Index extractor for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Index extractor for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.smallint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.smallint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
+--! @brief Operator wrapper for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.smallint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.smallint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
+--! @brief Operator wrapper for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.smallint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.smallint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
+--! @brief Operator wrapper for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.smallint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.smallint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
+--! @brief Operator wrapper for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.smallint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.smallint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
+--! @brief Operator wrapper for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.smallint_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.smallint_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.smallint_ord_ore.
+--! @brief Operator wrapper for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.smallint_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param selector text
---! @return eql_v3.smallint_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_ord_ore, selector text)
-RETURNS eql_v3.smallint_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord_ore'; END; $$
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ore, selector text)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param selector integer
---! @return eql_v3.smallint_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.smallint_ord_ore, selector integer)
-RETURNS eql_v3.smallint_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord_ore'; END; $$
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ore, selector integer)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.smallint_ord_ore
---! @return eql_v3.smallint_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.smallint_ord_ore)
-RETURNS eql_v3.smallint_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.smallint_ord_ore'; END; $$
+--! @param selector public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.smallint_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.smallint_ord_ore
+--! @param selector public.smallint_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.smallint_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.smallint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.smallint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.smallint_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.smallint_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.smallint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.smallint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.smallint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.smallint_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
---! @param b eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_ord_ore, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ore, b public.smallint_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
---! @param a eql_v3.smallint_ord_ore
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.smallint_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.smallint_ord_ore.
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.smallint_ord_ore
+--! @param b public.smallint_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.smallint_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.smallint_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/smallint/smallint_ord_ore_operators.sql b/src/v3/scalars/smallint/smallint_ord_ore_operators.sql
index 1cc789d01..6bb25ab15 100644
--- a/src/v3/scalars/smallint/smallint_ord_ore_operators.sql
+++ b/src/v3/scalars/smallint/smallint_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ore_functions.sql
 
 --! @file encrypted_domain/smallint/smallint_ord_ore_operators.sql
---! @brief Operators for eql_v3.smallint_ord_ore.
+--! @brief Operators for public.smallint_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = integer
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = integer
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = integer
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.smallint_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.smallint_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
 );
diff --git a/src/v3/scalars/smallint/smallint_types.sql b/src/v3/scalars/smallint/smallint_types.sql
index 27cf1db33..6165b605b 100644
--- a/src/v3/scalars/smallint/smallint_types.sql
+++ b/src/v3/scalars/smallint/smallint_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.smallint.
+  --! @brief Encrypted domain public.smallint.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'smallint' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'smallint' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.smallint AS jsonb
+    CREATE DOMAIN public.smallint AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.smallint_eq.
+  --! @brief Encrypted domain public.smallint_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'smallint_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'smallint_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.smallint_eq AS jsonb
+    CREATE DOMAIN public.smallint_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.smallint_ord_ore.
+  --! @brief Encrypted domain public.smallint_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'smallint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'smallint_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.smallint_ord_ore AS jsonb
+    CREATE DOMAIN public.smallint_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.smallint_ord.
+  --! @brief Encrypted domain public.smallint_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'smallint_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'smallint_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.smallint_ord AS jsonb
+    CREATE DOMAIN public.smallint_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.smallint_ord_ope.
+  --! @brief Encrypted domain public.smallint_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'smallint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'smallint_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.smallint_ord_ope AS jsonb
+    CREATE DOMAIN public.smallint_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/text/text_eq_functions.sql b/src/v3/scalars/text/text_eq_functions.sql
index 96ad19bef..fc0bcd3eb 100644
--- a/src/v3/scalars/text/text_eq_functions.sql
+++ b/src/v3/scalars/text/text_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/text/text_eq_functions.sql
---! @brief Functions for eql_v3.text_eq.
+--! @brief Functions for public.text_eq.
 
---! @brief Index extractor for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Index extractor for public.text_eq.
+--! @param a public.text_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.text_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b public.text_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_eq) $$;
 
---! @brief Operator wrapper for eql_v3.text_eq.
+--! @brief Operator wrapper for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b public.text_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_eq) $$;
 
---! @brief Operator wrapper for eql_v3.text_eq.
+--! @brief Operator wrapper for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.text_eq, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.text_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.text_eq, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.text_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.text_eq, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.text_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.text_eq, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.text_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_eq, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_eq, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param selector text
---! @return eql_v3.text_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_eq, selector text)
-RETURNS eql_v3.text_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_eq'; END; $$
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.text_eq, selector text)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param selector integer
---! @return eql_v3.text_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_eq, selector integer)
-RETURNS eql_v3.text_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_eq'; END; $$
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.text_eq, selector integer)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param selector eql_v3.text_eq
---! @return eql_v3.text_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.text_eq)
-RETURNS eql_v3.text_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_eq'; END; $$
+--! @param selector public.text_eq
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_eq)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param selector eql_v3.text_eq
+--! @param selector public.text_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.text_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.text_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.text_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.text_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.text_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.text_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.text_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.text_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.text_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
---! @param b eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_eq, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_eq, b public.text_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
---! @param a eql_v3.text_eq
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_eq.
+--! @brief Unsupported operator blocker for public.text_eq.
 --! @param a jsonb
---! @param b eql_v3.text_eq
+--! @param b public.text_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.text_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/text/text_eq_operators.sql b/src/v3/scalars/text/text_eq_operators.sql
index 122ec90c1..03702f828 100644
--- a/src/v3/scalars/text/text_eq_operators.sql
+++ b/src/v3/scalars/text/text_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/text/text_eq_functions.sql
 
 --! @file encrypted_domain/text/text_eq_operators.sql
---! @brief Operators for eql_v3.text_eq.
+--! @brief Operators for public.text_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text
+  LEFTARG = public.text_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = integer
+  LEFTARG = public.text_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text
+  LEFTARG = public.text_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = integer
+  LEFTARG = public.text_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text
+  LEFTARG = public.text_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text[]
+  LEFTARG = public.text_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text[]
+  LEFTARG = public.text_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonpath
+  LEFTARG = public.text_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonpath
+  LEFTARG = public.text_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text[]
+  LEFTARG = public.text_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text[]
+  LEFTARG = public.text_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text
+  LEFTARG = public.text_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = integer
+  LEFTARG = public.text_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text[]
+  LEFTARG = public.text_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = text[]
+  LEFTARG = public.text_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = eql_v3.text_eq
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_eq, RIGHTARG = jsonb
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_eq
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
 );
diff --git a/src/v3/scalars/text/text_functions.sql b/src/v3/scalars/text/text_functions.sql
index 9285478c7..4f959ada4 100644
--- a/src/v3/scalars/text/text_functions.sql
+++ b/src/v3/scalars/text/text_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/text/text_functions.sql
---! @brief Functions for eql_v3.text.
+--! @brief Functions for public.text.
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.eq(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.neq(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.lt(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.lte(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.gt(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.gte(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.contains(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param selector text
---! @return eql_v3.text
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text, selector text)
-RETURNS eql_v3.text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text'; END; $$
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a public.text, selector text)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param selector integer
---! @return eql_v3.text
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text, selector integer)
-RETURNS eql_v3.text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text'; END; $$
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a public.text, selector integer)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param selector eql_v3.text
---! @return eql_v3.text
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.text)
-RETURNS eql_v3.text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text'; END; $$
+--! @param selector public.text
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param selector eql_v3.text
+--! @param selector public.text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.text)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.text, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.text, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.text, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.text, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.text, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.text, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.text, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.text, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.text, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.text, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.text, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.text, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.text, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.text, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.text, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
---! @param b eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal."||"(a public.text, b public.text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
---! @param a eql_v3.text
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.text, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text.
+--! @brief Unsupported operator blocker for public.text.
 --! @param a jsonb
---! @param b eql_v3.text
+--! @param b public.text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.text)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/text/text_match_functions.sql b/src/v3/scalars/text/text_match_functions.sql
index 0041e459e..1d37e2931 100644
--- a/src/v3/scalars/text/text_match_functions.sql
+++ b/src/v3/scalars/text/text_match_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/bloom_filter/functions.sql
 
 --! @file encrypted_domain/text/text_match_functions.sql
---! @brief Functions for eql_v3.text_match.
+--! @brief Functions for public.text_match.
 
---! @brief Index extractor for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Index extractor for public.text_match.
+--! @param a public.text_match
 --! @return eql_v3_internal.bloom_filter
-CREATE FUNCTION eql_v3.match_term(a eql_v3.text_match)
+CREATE FUNCTION eql_v3.match_term(a public.text_match)
 RETURNS eql_v3_internal.bloom_filter
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.eq(a public.text_match, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.text_match, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.neq(a public.text_match, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.text_match, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.lt(a public.text_match, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.text_match, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.lte(a public.text_match, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.text_match, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.gt(a public.text_match, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.text_match, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.gte(a public.text_match, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.text_match, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text_match)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Operator wrapper for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3.contains(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3.contains(a public.text_match, b public.text_match)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.contains(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3.contains(a public.text_match, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::eql_v3.text_match) $$;
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::public.text_match) $$;
 
---! @brief Operator wrapper for eql_v3.text_match.
+--! @brief Operator wrapper for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3.contains(a jsonb, b public.text_match)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a::eql_v3.text_match) @> eql_v3.match_term(b) $$;
+AS $$ SELECT eql_v3.match_term(a::public.text_match) @> eql_v3.match_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b public.text_match)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::eql_v3.text_match) $$;
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::public.text_match) $$;
 
---! @brief Operator wrapper for eql_v3.text_match.
+--! @brief Operator wrapper for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return boolean
-CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3.contained_by(a jsonb, b public.text_match)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a::eql_v3.text_match) <@ eql_v3.match_term(b) $$;
+AS $$ SELECT eql_v3.match_term(a::public.text_match) <@ eql_v3.match_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param selector text
---! @return eql_v3.text_match
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_match, selector text)
-RETURNS eql_v3.text_match IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_match'; END; $$
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a public.text_match, selector text)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param selector integer
---! @return eql_v3.text_match
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_match, selector integer)
-RETURNS eql_v3.text_match IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_match'; END; $$
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a public.text_match, selector integer)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param selector eql_v3.text_match
---! @return eql_v3.text_match
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.text_match)
-RETURNS eql_v3.text_match IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_match'; END; $$
+--! @param selector public.text_match
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_match)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_match, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_match, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_match, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_match, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param selector eql_v3.text_match
+--! @param selector public.text_match
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_match)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.text_match, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.text_match, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.text_match, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_match, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.text_match, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_match, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.text_match, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_match, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.text_match, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_match, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.text_match, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_match, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.text_match, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_match, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_match, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_match, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_match, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.text_match, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_match, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
---! @param b eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_match, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_match, b public.text_match)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
---! @param a eql_v3.text_match
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_match, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_match, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_match.
+--! @brief Unsupported operator blocker for public.text_match.
 --! @param a jsonb
---! @param b eql_v3.text_match
+--! @param b public.text_match
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.text_match)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_match)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_match'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/text/text_match_operators.sql b/src/v3/scalars/text/text_match_operators.sql
index 37dfd72fa..5e8b95ec9 100644
--- a/src/v3/scalars/text/text_match_operators.sql
+++ b/src/v3/scalars/text/text_match_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/text/text_match_functions.sql
 
 --! @file encrypted_domain/text/text_match_operators.sql
---! @brief Operators for eql_v3.text_match.
+--! @brief Operators for public.text_match.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb
+  LEFTARG = public.text_match, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb
+  LEFTARG = public.text_match, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb
+  LEFTARG = public.text_match, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb
+  LEFTARG = public.text_match, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb
+  LEFTARG = public.text_match, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb
+  LEFTARG = public.text_match, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3.contains,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match,
   COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3.contains,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb,
+  LEFTARG = public.text_match, RIGHTARG = jsonb,
   COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match,
+  LEFTARG = jsonb, RIGHTARG = public.text_match,
   COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3.contained_by,
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match,
   COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3.contained_by,
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb,
+  LEFTARG = public.text_match, RIGHTARG = jsonb,
   COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match,
+  LEFTARG = jsonb, RIGHTARG = public.text_match,
   COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text
+  LEFTARG = public.text_match, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_match, RIGHTARG = integer
+  LEFTARG = public.text_match, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text
+  LEFTARG = public.text_match, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_match, RIGHTARG = integer
+  LEFTARG = public.text_match, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text
+  LEFTARG = public.text_match, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text[]
+  LEFTARG = public.text_match, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text[]
+  LEFTARG = public.text_match, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonpath
+  LEFTARG = public.text_match, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonpath
+  LEFTARG = public.text_match, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text[]
+  LEFTARG = public.text_match, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text[]
+  LEFTARG = public.text_match, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text
+  LEFTARG = public.text_match, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_match, RIGHTARG = integer
+  LEFTARG = public.text_match, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text[]
+  LEFTARG = public.text_match, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.text_match, RIGHTARG = text[]
+  LEFTARG = public.text_match, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_match, RIGHTARG = eql_v3.text_match
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_match, RIGHTARG = jsonb
+  LEFTARG = public.text_match, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_match
+  LEFTARG = jsonb, RIGHTARG = public.text_match
 );
diff --git a/src/v3/scalars/text/text_operators.sql b/src/v3/scalars/text/text_operators.sql
index 5d642468b..0351756de 100644
--- a/src/v3/scalars/text/text_operators.sql
+++ b/src/v3/scalars/text/text_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/text/text_functions.sql
 
 --! @file encrypted_domain/text/text_operators.sql
---! @brief Operators for eql_v3.text.
+--! @brief Operators for public.text.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text, RIGHTARG = text
+  LEFTARG = public.text, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text, RIGHTARG = integer
+  LEFTARG = public.text, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text, RIGHTARG = text
+  LEFTARG = public.text, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text, RIGHTARG = integer
+  LEFTARG = public.text, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.text, RIGHTARG = text
+  LEFTARG = public.text, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.text, RIGHTARG = text[]
+  LEFTARG = public.text, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.text, RIGHTARG = text[]
+  LEFTARG = public.text, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.text, RIGHTARG = jsonpath
+  LEFTARG = public.text, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.text, RIGHTARG = jsonpath
+  LEFTARG = public.text, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.text, RIGHTARG = text[]
+  LEFTARG = public.text, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.text, RIGHTARG = text[]
+  LEFTARG = public.text, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text, RIGHTARG = text
+  LEFTARG = public.text, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text, RIGHTARG = integer
+  LEFTARG = public.text, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text, RIGHTARG = text[]
+  LEFTARG = public.text, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.text, RIGHTARG = text[]
+  LEFTARG = public.text, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text, RIGHTARG = eql_v3.text
+  LEFTARG = public.text, RIGHTARG = public.text
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text, RIGHTARG = jsonb
+  LEFTARG = public.text, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text
+  LEFTARG = jsonb, RIGHTARG = public.text
 );
diff --git a/src/v3/scalars/text/text_ord_aggregates.sql b/src/v3/scalars/text/text_ord_aggregates.sql
index 399eae9be..db4fbf5f7 100644
--- a/src/v3/scalars/text/text_ord_aggregates.sql
+++ b/src/v3/scalars/text/text_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/text/text_ord_operators.sql
 
 --! @file encrypted_domain/text/text_ord_aggregates.sql
---! @brief Aggregates for eql_v3.text_ord.
+--! @brief Aggregates for public.text_ord.
 
---! @brief State function for min on eql_v3.text_ord.
---! @param state eql_v3.text_ord
---! @param value eql_v3.text_ord
---! @return eql_v3.text_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.text_ord, value eql_v3.text_ord)
-RETURNS eql_v3.text_ord
+--! @brief State function for min on public.text_ord.
+--! @param state public.text_ord
+--! @param value public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord, value public.text_ord)
+RETURNS public.text_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.text_ord.
---! @param input eql_v3.text_ord
---! @return eql_v3.text_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.text_ord) (
+--! @brief min aggregate for public.text_ord.
+--! @param input public.text_ord
+--! @return public.text_ord
+CREATE AGGREGATE eql_v3.min(public.text_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.text_ord,
+  stype = public.text_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.text_ord.
---! @param state eql_v3.text_ord
---! @param value eql_v3.text_ord
---! @return eql_v3.text_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.text_ord, value eql_v3.text_ord)
-RETURNS eql_v3.text_ord
+--! @brief State function for max on public.text_ord.
+--! @param state public.text_ord
+--! @param value public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord, value public.text_ord)
+RETURNS public.text_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.text_ord.
---! @param input eql_v3.text_ord
---! @return eql_v3.text_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.text_ord) (
+--! @brief max aggregate for public.text_ord.
+--! @param input public.text_ord
+--! @return public.text_ord
+CREATE AGGREGATE eql_v3.max(public.text_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.text_ord,
+  stype = public.text_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/text/text_ord_functions.sql b/src/v3/scalars/text/text_ord_functions.sql
index 600cb037d..13612a7ac 100644
--- a/src/v3/scalars/text/text_ord_functions.sql
+++ b/src/v3/scalars/text/text_ord_functions.sql
@@ -7,398 +7,398 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/text/text_ord_functions.sql
---! @brief Functions for eql_v3.text_ord.
+--! @brief Functions for public.text_ord.
 
---! @brief Index extractor for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Index extractor for public.text_ord.
+--! @param a public.text_ord
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_ord)
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Index extractor for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Index extractor for public.text_ord.
+--! @param a public.text_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.text_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_ord) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
+--! @brief Operator wrapper for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_ord) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
+--! @brief Operator wrapper for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.text_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_ord) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
+--! @brief Operator wrapper for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.text_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_ord) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
+--! @brief Operator wrapper for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.text_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_ord) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
+--! @brief Operator wrapper for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.text_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_ord) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord.
+--! @brief Operator wrapper for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord, b public.text_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
+--! @brief Unsupported operator blocker for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord, b public.text_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
+--! @brief Unsupported operator blocker for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param selector text
---! @return eql_v3.text_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_ord, selector text)
-RETURNS eql_v3.text_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord'; END; $$
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord, selector text)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param selector integer
---! @return eql_v3.text_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_ord, selector integer)
-RETURNS eql_v3.text_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord'; END; $$
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord, selector integer)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
+--! @brief Unsupported operator blocker for public.text_ord.
 --! @param a jsonb
---! @param selector eql_v3.text_ord
---! @return eql_v3.text_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.text_ord)
-RETURNS eql_v3.text_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord'; END; $$
+--! @param selector public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
+--! @brief Unsupported operator blocker for public.text_ord.
 --! @param a jsonb
---! @param selector eql_v3.text_ord
+--! @param selector public.text_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.text_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.text_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.text_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.text_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.text_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.text_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.text_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.text_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.text_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
---! @param b eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_ord, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord, b public.text_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
---! @param a eql_v3.text_ord
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord.
+--! @brief Unsupported operator blocker for public.text_ord.
 --! @param a jsonb
---! @param b eql_v3.text_ord
+--! @param b public.text_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.text_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/text/text_ord_ope_aggregates.sql b/src/v3/scalars/text/text_ord_ope_aggregates.sql
index 866a8a8bf..b7483db00 100644
--- a/src/v3/scalars/text/text_ord_ope_aggregates.sql
+++ b/src/v3/scalars/text/text_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/text/text_ord_ope_operators.sql
 
 --! @file encrypted_domain/text/text_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.text_ord_ope.
+--! @brief Aggregates for public.text_ord_ope.
 
---! @brief State function for min on eql_v3.text_ord_ope.
---! @param state eql_v3.text_ord_ope
---! @param value eql_v3.text_ord_ope
---! @return eql_v3.text_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.text_ord_ope, value eql_v3.text_ord_ope)
-RETURNS eql_v3.text_ord_ope
+--! @brief State function for min on public.text_ord_ope.
+--! @param state public.text_ord_ope
+--! @param value public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord_ope, value public.text_ord_ope)
+RETURNS public.text_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.text_ord_ope.
---! @param input eql_v3.text_ord_ope
---! @return eql_v3.text_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.text_ord_ope) (
+--! @brief min aggregate for public.text_ord_ope.
+--! @param input public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE AGGREGATE eql_v3.min(public.text_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.text_ord_ope,
+  stype = public.text_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.text_ord_ope.
---! @param state eql_v3.text_ord_ope
---! @param value eql_v3.text_ord_ope
---! @return eql_v3.text_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.text_ord_ope, value eql_v3.text_ord_ope)
-RETURNS eql_v3.text_ord_ope
+--! @brief State function for max on public.text_ord_ope.
+--! @param state public.text_ord_ope
+--! @param value public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord_ope, value public.text_ord_ope)
+RETURNS public.text_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.text_ord_ope.
---! @param input eql_v3.text_ord_ope
---! @return eql_v3.text_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.text_ord_ope) (
+--! @brief max aggregate for public.text_ord_ope.
+--! @param input public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE AGGREGATE eql_v3.max(public.text_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.text_ord_ope,
+  stype = public.text_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/text/text_ord_ope_functions.sql b/src/v3/scalars/text/text_ord_ope_functions.sql
index eeb44a476..33954f625 100644
--- a/src/v3/scalars/text/text_ord_ope_functions.sql
+++ b/src/v3/scalars/text/text_ord_ope_functions.sql
@@ -6,398 +6,398 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/text/text_ord_ope_functions.sql
---! @brief Functions for eql_v3.text_ord_ope.
+--! @brief Functions for public.text_ord_ope.
 
---! @brief Index extractor for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Index extractor for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ope)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Index extractor for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Index extractor for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.text_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_ord_ope) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
+--! @brief Operator wrapper for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord_ope) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ope) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_ord_ope) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
+--! @brief Operator wrapper for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord_ope) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ope) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.text_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
+--! @brief Operator wrapper for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.text_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.text_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
+--! @brief Operator wrapper for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.text_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.text_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
+--! @brief Operator wrapper for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.text_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.text_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ope.
+--! @brief Operator wrapper for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.text_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
+--! @brief Unsupported operator blocker for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
+--! @brief Unsupported operator blocker for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param selector text
---! @return eql_v3.text_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_ord_ope, selector text)
-RETURNS eql_v3.text_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ope'; END; $$
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ope, selector text)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param selector integer
---! @return eql_v3.text_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_ord_ope, selector integer)
-RETURNS eql_v3.text_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ope'; END; $$
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ope, selector integer)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
+--! @brief Unsupported operator blocker for public.text_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.text_ord_ope
---! @return eql_v3.text_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.text_ord_ope)
-RETURNS eql_v3.text_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ope'; END; $$
+--! @param selector public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord_ope)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
+--! @brief Unsupported operator blocker for public.text_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.text_ord_ope
+--! @param selector public.text_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.text_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.text_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.text_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.text_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.text_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.text_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.text_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.text_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
---! @param b eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_ord_ope, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ope, b public.text_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
---! @param a eql_v3.text_ord_ope
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ope.
+--! @brief Unsupported operator blocker for public.text_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ope
+--! @param b public.text_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.text_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/text/text_ord_ope_operators.sql b/src/v3/scalars/text/text_ord_ope_operators.sql
index 3e7c08f1e..442231085 100644
--- a/src/v3/scalars/text/text_ord_ope_operators.sql
+++ b/src/v3/scalars/text/text_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/text/text_ord_ope_functions.sql
 
 --! @file encrypted_domain/text/text_ord_ope_operators.sql
---! @brief Operators for eql_v3.text_ord_ope.
+--! @brief Operators for public.text_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = integer
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = integer
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = integer
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
 );
diff --git a/src/v3/scalars/text/text_ord_operators.sql b/src/v3/scalars/text/text_ord_operators.sql
index a943b96a0..9ed8a7dd1 100644
--- a/src/v3/scalars/text/text_ord_operators.sql
+++ b/src/v3/scalars/text/text_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/text/text_ord_functions.sql
 
 --! @file encrypted_domain/text/text_ord_operators.sql
---! @brief Operators for eql_v3.text_ord.
+--! @brief Operators for public.text_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text
+  LEFTARG = public.text_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = integer
+  LEFTARG = public.text_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text
+  LEFTARG = public.text_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = integer
+  LEFTARG = public.text_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text
+  LEFTARG = public.text_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text[]
+  LEFTARG = public.text_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text[]
+  LEFTARG = public.text_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonpath
+  LEFTARG = public.text_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonpath
+  LEFTARG = public.text_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text[]
+  LEFTARG = public.text_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text[]
+  LEFTARG = public.text_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text
+  LEFTARG = public.text_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = integer
+  LEFTARG = public.text_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text[]
+  LEFTARG = public.text_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = text[]
+  LEFTARG = public.text_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = eql_v3.text_ord
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_ord, RIGHTARG = jsonb
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
 );
diff --git a/src/v3/scalars/text/text_ord_ore_aggregates.sql b/src/v3/scalars/text/text_ord_ore_aggregates.sql
index 04909a2a5..e4fd913b6 100644
--- a/src/v3/scalars/text/text_ord_ore_aggregates.sql
+++ b/src/v3/scalars/text/text_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/text/text_ord_ore_operators.sql
 
 --! @file encrypted_domain/text/text_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.text_ord_ore.
+--! @brief Aggregates for public.text_ord_ore.
 
---! @brief State function for min on eql_v3.text_ord_ore.
---! @param state eql_v3.text_ord_ore
---! @param value eql_v3.text_ord_ore
---! @return eql_v3.text_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.text_ord_ore, value eql_v3.text_ord_ore)
-RETURNS eql_v3.text_ord_ore
+--! @brief State function for min on public.text_ord_ore.
+--! @param state public.text_ord_ore
+--! @param value public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord_ore, value public.text_ord_ore)
+RETURNS public.text_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.text_ord_ore.
---! @param input eql_v3.text_ord_ore
---! @return eql_v3.text_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.text_ord_ore) (
+--! @brief min aggregate for public.text_ord_ore.
+--! @param input public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE AGGREGATE eql_v3.min(public.text_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.text_ord_ore,
+  stype = public.text_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.text_ord_ore.
---! @param state eql_v3.text_ord_ore
---! @param value eql_v3.text_ord_ore
---! @return eql_v3.text_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.text_ord_ore, value eql_v3.text_ord_ore)
-RETURNS eql_v3.text_ord_ore
+--! @brief State function for max on public.text_ord_ore.
+--! @param state public.text_ord_ore
+--! @param value public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord_ore, value public.text_ord_ore)
+RETURNS public.text_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.text_ord_ore.
---! @param input eql_v3.text_ord_ore
---! @return eql_v3.text_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.text_ord_ore) (
+--! @brief max aggregate for public.text_ord_ore.
+--! @param input public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE AGGREGATE eql_v3.max(public.text_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.text_ord_ore,
+  stype = public.text_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/text/text_ord_ore_functions.sql b/src/v3/scalars/text/text_ord_ore_functions.sql
index 3e86f3e95..c306c8731 100644
--- a/src/v3/scalars/text/text_ord_ore_functions.sql
+++ b/src/v3/scalars/text/text_ord_ore_functions.sql
@@ -7,398 +7,398 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/text/text_ord_ore_functions.sql
---! @brief Functions for eql_v3.text_ord_ore.
+--! @brief Functions for public.text_ord_ore.
 
---! @brief Index extractor for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Index extractor for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ore)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Index extractor for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Index extractor for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.text_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_ord_ore) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
+--! @brief Operator wrapper for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord_ore) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ore) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_ord_ore) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
+--! @brief Operator wrapper for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_ord_ore) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ore) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.text_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
+--! @brief Operator wrapper for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.text_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
+--! @brief Operator wrapper for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.text_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
+--! @brief Operator wrapper for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.text_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.text_ord_ore.
+--! @brief Operator wrapper for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
+--! @brief Unsupported operator blocker for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
+--! @brief Unsupported operator blocker for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param selector text
---! @return eql_v3.text_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_ord_ore, selector text)
-RETURNS eql_v3.text_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ore'; END; $$
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ore, selector text)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param selector integer
---! @return eql_v3.text_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_ord_ore, selector integer)
-RETURNS eql_v3.text_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ore'; END; $$
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ore, selector integer)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
+--! @brief Unsupported operator blocker for public.text_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.text_ord_ore
---! @return eql_v3.text_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.text_ord_ore)
-RETURNS eql_v3.text_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_ord_ore'; END; $$
+--! @param selector public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord_ore)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
+--! @brief Unsupported operator blocker for public.text_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.text_ord_ore
+--! @param selector public.text_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.text_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.text_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.text_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.text_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.text_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.text_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.text_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.text_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
---! @param b eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_ord_ore, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ore, b public.text_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
---! @param a eql_v3.text_ord_ore
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_ord_ore.
+--! @brief Unsupported operator blocker for public.text_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.text_ord_ore
+--! @param b public.text_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.text_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/text/text_ord_ore_operators.sql b/src/v3/scalars/text/text_ord_ore_operators.sql
index e6afaf5b2..aeaa8bcb4 100644
--- a/src/v3/scalars/text/text_ord_ore_operators.sql
+++ b/src/v3/scalars/text/text_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/text/text_ord_ore_functions.sql
 
 --! @file encrypted_domain/text/text_ord_ore_operators.sql
---! @brief Operators for eql_v3.text_ord_ore.
+--! @brief Operators for public.text_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = integer
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = integer
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = integer
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
 );
diff --git a/src/v3/scalars/text/text_search_aggregates.sql b/src/v3/scalars/text/text_search_aggregates.sql
index 7b9acb7c2..0315dc4d2 100644
--- a/src/v3/scalars/text/text_search_aggregates.sql
+++ b/src/v3/scalars/text/text_search_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/text/text_search_operators.sql
 
 --! @file encrypted_domain/text/text_search_aggregates.sql
---! @brief Aggregates for eql_v3.text_search.
+--! @brief Aggregates for public.text_search.
 
---! @brief State function for min on eql_v3.text_search.
---! @param state eql_v3.text_search
---! @param value eql_v3.text_search
---! @return eql_v3.text_search
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.text_search, value eql_v3.text_search)
-RETURNS eql_v3.text_search
+--! @brief State function for min on public.text_search.
+--! @param state public.text_search
+--! @param value public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_search, value public.text_search)
+RETURNS public.text_search
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.text_search.
---! @param input eql_v3.text_search
---! @return eql_v3.text_search
-CREATE AGGREGATE eql_v3.min(eql_v3.text_search) (
+--! @brief min aggregate for public.text_search.
+--! @param input public.text_search
+--! @return public.text_search
+CREATE AGGREGATE eql_v3.min(public.text_search) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.text_search,
+  stype = public.text_search,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.text_search.
---! @param state eql_v3.text_search
---! @param value eql_v3.text_search
---! @return eql_v3.text_search
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.text_search, value eql_v3.text_search)
-RETURNS eql_v3.text_search
+--! @brief State function for max on public.text_search.
+--! @param state public.text_search
+--! @param value public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_search, value public.text_search)
+RETURNS public.text_search
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.text_search.
---! @param input eql_v3.text_search
---! @return eql_v3.text_search
-CREATE AGGREGATE eql_v3.max(eql_v3.text_search) (
+--! @brief max aggregate for public.text_search.
+--! @param input public.text_search
+--! @return public.text_search
+CREATE AGGREGATE eql_v3.max(public.text_search) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.text_search,
+  stype = public.text_search,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/text/text_search_functions.sql b/src/v3/scalars/text/text_search_functions.sql
index f97132b2c..685b6229c 100644
--- a/src/v3/scalars/text/text_search_functions.sql
+++ b/src/v3/scalars/text/text_search_functions.sql
@@ -8,400 +8,400 @@
 -- REQUIRE: src/v3/sem/bloom_filter/functions.sql
 
 --! @file encrypted_domain/text/text_search_functions.sql
---! @brief Functions for eql_v3.text_search.
+--! @brief Functions for public.text_search.
 
---! @brief Index extractor for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.text_search)
+CREATE FUNCTION eql_v3.eq_term(a public.text_search)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Index extractor for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.text_search)
+CREATE FUNCTION eql_v3.ord_term(a public.text_search)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Index extractor for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
 --! @return eql_v3_internal.bloom_filter
-CREATE FUNCTION eql_v3.match_term(a eql_v3.text_search)
+CREATE FUNCTION eql_v3.match_term(a public.text_search)
 RETURNS eql_v3_internal.bloom_filter
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.eq(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_search) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_search) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.neq(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.text_search) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.text_search) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.lt(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.lte(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.gt(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.gte(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.text_search) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.contains(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.contains(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.contains(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.contains(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.contains(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.contains(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a::eql_v3.text_search) @> eql_v3.match_term(b) $$;
+AS $$ SELECT eql_v3.match_term(a::public.text_search) @> eql_v3.match_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.contained_by(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::eql_v3.text_search) $$;
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::public.text_search) $$;
 
---! @brief Operator wrapper for eql_v3.text_search.
+--! @brief Operator wrapper for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return boolean
-CREATE FUNCTION eql_v3.contained_by(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3.contained_by(a jsonb, b public.text_search)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.match_term(a::eql_v3.text_search) <@ eql_v3.match_term(b) $$;
+AS $$ SELECT eql_v3.match_term(a::public.text_search) <@ eql_v3.match_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param selector text
---! @return eql_v3.text_search
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_search, selector text)
-RETURNS eql_v3.text_search IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_search'; END; $$
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a public.text_search, selector text)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param selector integer
---! @return eql_v3.text_search
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.text_search, selector integer)
-RETURNS eql_v3.text_search IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_search'; END; $$
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a public.text_search, selector integer)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
+--! @brief Unsupported operator blocker for public.text_search.
 --! @param a jsonb
---! @param selector eql_v3.text_search
---! @return eql_v3.text_search
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.text_search)
-RETURNS eql_v3.text_search IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.text_search'; END; $$
+--! @param selector public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_search)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_search, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_search, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.text_search, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_search, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
+--! @brief Unsupported operator blocker for public.text_search.
 --! @param a jsonb
---! @param selector eql_v3.text_search
+--! @param selector public.text_search
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.text_search)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_search)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.text_search, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.text_search, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.text_search, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_search, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.text_search, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_search, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.text_search, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_search, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.text_search, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_search, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.text_search, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_search, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.text_search, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_search, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_search, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_search, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.text_search, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.text_search, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_search, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
---! @param b eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_search, b eql_v3.text_search)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_search, b public.text_search)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
---! @param a eql_v3.text_search
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.text_search, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.text_search, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.text_search.
+--! @brief Unsupported operator blocker for public.text_search.
 --! @param a jsonb
---! @param b eql_v3.text_search
+--! @param b public.text_search
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.text_search)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_search)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.text_search'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/text/text_search_operators.sql b/src/v3/scalars/text/text_search_operators.sql
index a73ce94d0..f0aa09ccf 100644
--- a/src/v3/scalars/text/text_search_operators.sql
+++ b/src/v3/scalars/text/text_search_operators.sql
@@ -4,248 +4,248 @@
 -- REQUIRE: src/v3/scalars/text/text_search_functions.sql
 
 --! @file encrypted_domain/text/text_search_operators.sql
---! @brief Operators for eql_v3.text_search.
+--! @brief Operators for public.text_search.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3.contains,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3.contains,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3.contained_by,
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
   COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3.contained_by,
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
   COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
   COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text
+  LEFTARG = public.text_search, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.text_search, RIGHTARG = integer
+  LEFTARG = public.text_search, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search
+  LEFTARG = jsonb, RIGHTARG = public.text_search
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text
+  LEFTARG = public.text_search, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.text_search, RIGHTARG = integer
+  LEFTARG = public.text_search, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search
+  LEFTARG = jsonb, RIGHTARG = public.text_search
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text
+  LEFTARG = public.text_search, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text[]
+  LEFTARG = public.text_search, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text[]
+  LEFTARG = public.text_search, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonpath
+  LEFTARG = public.text_search, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonpath
+  LEFTARG = public.text_search, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text[]
+  LEFTARG = public.text_search, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text[]
+  LEFTARG = public.text_search, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text
+  LEFTARG = public.text_search, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_search, RIGHTARG = integer
+  LEFTARG = public.text_search, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text[]
+  LEFTARG = public.text_search, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.text_search, RIGHTARG = text[]
+  LEFTARG = public.text_search, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_search, RIGHTARG = eql_v3.text_search
+  LEFTARG = public.text_search, RIGHTARG = public.text_search
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.text_search, RIGHTARG = jsonb
+  LEFTARG = public.text_search, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.text_search
+  LEFTARG = jsonb, RIGHTARG = public.text_search
 );
diff --git a/src/v3/scalars/text/text_types.sql b/src/v3/scalars/text/text_types.sql
index cfe7b414f..e6bec0f10 100644
--- a/src/v3/scalars/text/text_types.sql
+++ b/src/v3/scalars/text/text_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.text.
+  --! @brief Encrypted domain public.text.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'text' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'text' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.text AS jsonb
+    CREATE DOMAIN public.text AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.text_eq.
+  --! @brief Encrypted domain public.text_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'text_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'text_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.text_eq AS jsonb
+    CREATE DOMAIN public.text_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.text_match.
+  --! @brief Encrypted domain public.text_match.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'text_match' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'text_match' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.text_match AS jsonb
+    CREATE DOMAIN public.text_match AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -53,12 +53,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.text_ord_ore.
+  --! @brief Encrypted domain public.text_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'text_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'text_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.text_ord_ore AS jsonb
+    CREATE DOMAIN public.text_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -72,12 +72,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.text_ord.
+  --! @brief Encrypted domain public.text_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'text_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'text_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.text_ord AS jsonb
+    CREATE DOMAIN public.text_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -91,12 +91,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.text_ord_ope.
+  --! @brief Encrypted domain public.text_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'text_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'text_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.text_ord_ope AS jsonb
+    CREATE DOMAIN public.text_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -108,12 +108,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.text_search.
+  --! @brief Encrypted domain public.text_search.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'text_search' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'text_search' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.text_search AS jsonb
+    CREATE DOMAIN public.text_search AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
diff --git a/src/v3/scalars/timestamp/timestamp_eq_functions.sql b/src/v3/scalars/timestamp/timestamp_eq_functions.sql
index 27c83149c..5d3514178 100644
--- a/src/v3/scalars/timestamp/timestamp_eq_functions.sql
+++ b/src/v3/scalars/timestamp/timestamp_eq_functions.sql
@@ -5,402 +5,402 @@
 -- REQUIRE: src/v3/sem/hmac_256/functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_eq_functions.sql
---! @brief Functions for eql_v3.timestamp_eq.
+--! @brief Functions for public.timestamp_eq.
 
---! @brief Index extractor for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Index extractor for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @return eql_v3_internal.hmac_256
-CREATE FUNCTION eql_v3.eq_term(a eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3.eq_term(a public.timestamp_eq)
 RETURNS eql_v3_internal.hmac_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::eql_v3.timestamp_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.timestamp_eq) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_eq.
+--! @brief Operator wrapper for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.timestamp_eq) = eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.timestamp_eq) = eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::eql_v3.timestamp_eq) $$;
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.timestamp_eq) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_eq.
+--! @brief Operator wrapper for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_eq)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.eq_term(a::eql_v3.timestamp_eq) <> eql_v3.eq_term(b) $$;
+AS $$ SELECT eql_v3.eq_term(a::public.timestamp_eq) <> eql_v3.eq_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_eq, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_eq)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param selector text
---! @return eql_v3.timestamp_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_eq, selector text)
-RETURNS eql_v3.timestamp_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_eq'; END; $$
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_eq, selector text)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param selector integer
---! @return eql_v3.timestamp_eq
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_eq, selector integer)
-RETURNS eql_v3.timestamp_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_eq'; END; $$
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_eq, selector integer)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_eq
---! @return eql_v3.timestamp_eq
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.timestamp_eq)
-RETURNS eql_v3.timestamp_eq IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_eq'; END; $$
+--! @param selector public.timestamp_eq
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_eq)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_eq, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_eq, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_eq, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_eq, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_eq
+--! @param selector public.timestamp_eq
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_eq)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.timestamp_eq, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_eq, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.timestamp_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.timestamp_eq, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_eq, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.timestamp_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.timestamp_eq, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_eq, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.timestamp_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.timestamp_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_eq, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_eq, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_eq, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_eq, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.timestamp_eq, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_eq, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
---! @param b eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_eq, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_eq, b public.timestamp_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
---! @param a eql_v3.timestamp_eq
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_eq, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_eq, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_eq.
+--! @brief Unsupported operator blocker for public.timestamp_eq.
 --! @param a jsonb
---! @param b eql_v3.timestamp_eq
+--! @param b public.timestamp_eq
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.timestamp_eq)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_eq)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_eq'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/timestamp/timestamp_eq_operators.sql b/src/v3/scalars/timestamp/timestamp_eq_operators.sql
index 37bf8b76f..9ffc3b22b 100644
--- a/src/v3/scalars/timestamp/timestamp_eq_operators.sql
+++ b/src/v3/scalars/timestamp/timestamp_eq_operators.sql
@@ -4,230 +4,230 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_eq_functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_eq_operators.sql
---! @brief Operators for eql_v3.timestamp_eq.
+--! @brief Operators for public.timestamp_eq.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = integer
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = integer
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text[]
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text[]
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text[]
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text[]
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = integer
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text[]
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = text[]
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_eq, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_eq
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
 );
diff --git a/src/v3/scalars/timestamp/timestamp_functions.sql b/src/v3/scalars/timestamp/timestamp_functions.sql
index 440dceb12..63203ba08 100644
--- a/src/v3/scalars/timestamp/timestamp_functions.sql
+++ b/src/v3/scalars/timestamp/timestamp_functions.sql
@@ -4,400 +4,400 @@
 -- REQUIRE: src/v3/scalars/functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_functions.sql
---! @brief Functions for eql_v3.timestamp.
+--! @brief Functions for public.timestamp.
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.eq(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.eq(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.eq(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.neq(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.neq(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.neq(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lt(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.lte(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gt(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.gte(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param selector text
---! @return eql_v3.timestamp
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp, selector text)
-RETURNS eql_v3.timestamp IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp'; END; $$
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp, selector text)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param selector integer
---! @return eql_v3.timestamp
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp, selector integer)
-RETURNS eql_v3.timestamp IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp'; END; $$
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp, selector integer)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param selector eql_v3.timestamp
---! @return eql_v3.timestamp
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.timestamp)
-RETURNS eql_v3.timestamp IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp'; END; $$
+--! @param selector public.timestamp
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param selector eql_v3.timestamp
+--! @param selector public.timestamp
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.timestamp, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.timestamp, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.timestamp, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.timestamp, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.timestamp, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.timestamp, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.timestamp, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.timestamp, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
---! @param b eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp, b public.timestamp)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
---! @param a eql_v3.timestamp
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp.
+--! @brief Unsupported operator blocker for public.timestamp.
 --! @param a jsonb
---! @param b eql_v3.timestamp
+--! @param b public.timestamp
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.timestamp)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/timestamp/timestamp_operators.sql b/src/v3/scalars/timestamp/timestamp_operators.sql
index 78397fd66..01e39278e 100644
--- a/src/v3/scalars/timestamp/timestamp_operators.sql
+++ b/src/v3/scalars/timestamp/timestamp_operators.sql
@@ -4,224 +4,224 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_operators.sql
---! @brief Operators for eql_v3.timestamp.
+--! @brief Operators for public.timestamp.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3_internal.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3_internal.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3_internal.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3_internal.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3_internal.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3_internal.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text
+  LEFTARG = public.timestamp, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = integer
+  LEFTARG = public.timestamp, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text
+  LEFTARG = public.timestamp, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = integer
+  LEFTARG = public.timestamp, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text
+  LEFTARG = public.timestamp, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text[]
+  LEFTARG = public.timestamp, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text[]
+  LEFTARG = public.timestamp, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text[]
+  LEFTARG = public.timestamp, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text[]
+  LEFTARG = public.timestamp, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text
+  LEFTARG = public.timestamp, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = integer
+  LEFTARG = public.timestamp, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text[]
+  LEFTARG = public.timestamp, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = text[]
+  LEFTARG = public.timestamp, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = eql_v3.timestamp
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp, RIGHTARG = jsonb
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
 );
diff --git a/src/v3/scalars/timestamp/timestamp_ord_aggregates.sql b/src/v3/scalars/timestamp/timestamp_ord_aggregates.sql
index 5ba633d16..351c73683 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_aggregates.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_operators.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_aggregates.sql
---! @brief Aggregates for eql_v3.timestamp_ord.
+--! @brief Aggregates for public.timestamp_ord.
 
---! @brief State function for min on eql_v3.timestamp_ord.
---! @param state eql_v3.timestamp_ord
---! @param value eql_v3.timestamp_ord
---! @return eql_v3.timestamp_ord
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.timestamp_ord, value eql_v3.timestamp_ord)
-RETURNS eql_v3.timestamp_ord
+--! @brief State function for min on public.timestamp_ord.
+--! @param state public.timestamp_ord
+--! @param value public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord, value public.timestamp_ord)
+RETURNS public.timestamp_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.timestamp_ord.
---! @param input eql_v3.timestamp_ord
---! @return eql_v3.timestamp_ord
-CREATE AGGREGATE eql_v3.min(eql_v3.timestamp_ord) (
+--! @brief min aggregate for public.timestamp_ord.
+--! @param input public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.timestamp_ord,
+  stype = public.timestamp_ord,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.timestamp_ord.
---! @param state eql_v3.timestamp_ord
---! @param value eql_v3.timestamp_ord
---! @return eql_v3.timestamp_ord
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.timestamp_ord, value eql_v3.timestamp_ord)
-RETURNS eql_v3.timestamp_ord
+--! @brief State function for max on public.timestamp_ord.
+--! @param state public.timestamp_ord
+--! @param value public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord, value public.timestamp_ord)
+RETURNS public.timestamp_ord
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.timestamp_ord.
---! @param input eql_v3.timestamp_ord
---! @return eql_v3.timestamp_ord
-CREATE AGGREGATE eql_v3.max(eql_v3.timestamp_ord) (
+--! @brief max aggregate for public.timestamp_ord.
+--! @param input public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.timestamp_ord,
+  stype = public.timestamp_ord,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/timestamp/timestamp_ord_functions.sql b/src/v3/scalars/timestamp/timestamp_ord_functions.sql
index cc03f1a7b..db36b63ca 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_functions.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_functions.sql
---! @brief Functions for eql_v3.timestamp_ord.
+--! @brief Functions for public.timestamp_ord.
 
---! @brief Index extractor for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Index extractor for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.timestamp_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.timestamp_ord) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
+--! @brief Operator wrapper for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.timestamp_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.timestamp_ord) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
+--! @brief Operator wrapper for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.timestamp_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.timestamp_ord) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
+--! @brief Operator wrapper for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.timestamp_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.timestamp_ord) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
+--! @brief Operator wrapper for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.timestamp_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.timestamp_ord) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
+--! @brief Operator wrapper for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.timestamp_ord) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.timestamp_ord) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord.
+--! @brief Operator wrapper for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
+--! @brief Unsupported operator blocker for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
+--! @brief Unsupported operator blocker for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param selector text
---! @return eql_v3.timestamp_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_ord, selector text)
-RETURNS eql_v3.timestamp_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord'; END; $$
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord, selector text)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param selector integer
---! @return eql_v3.timestamp_ord
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_ord, selector integer)
-RETURNS eql_v3.timestamp_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord'; END; $$
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord, selector integer)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
+--! @brief Unsupported operator blocker for public.timestamp_ord.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_ord
---! @return eql_v3.timestamp_ord
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.timestamp_ord)
-RETURNS eql_v3.timestamp_ord IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord'; END; $$
+--! @param selector public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_ord, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_ord, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
+--! @brief Unsupported operator blocker for public.timestamp_ord.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_ord
+--! @param selector public.timestamp_ord
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.timestamp_ord, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.timestamp_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.timestamp_ord, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.timestamp_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.timestamp_ord, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.timestamp_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.timestamp_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.timestamp_ord, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
---! @param b eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_ord, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord, b public.timestamp_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
---! @param a eql_v3.timestamp_ord
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_ord, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord.
+--! @brief Unsupported operator blocker for public.timestamp_ord.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord
+--! @param b public.timestamp_ord
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.timestamp_ord)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/timestamp/timestamp_ord_ope_aggregates.sql b/src/v3/scalars/timestamp/timestamp_ord_ope_aggregates.sql
index 38cad47ee..e27b00085 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_ope_aggregates.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_ope_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ope_operators.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_ope_aggregates.sql
---! @brief Aggregates for eql_v3.timestamp_ord_ope.
+--! @brief Aggregates for public.timestamp_ord_ope.
 
---! @brief State function for min on eql_v3.timestamp_ord_ope.
---! @param state eql_v3.timestamp_ord_ope
---! @param value eql_v3.timestamp_ord_ope
---! @return eql_v3.timestamp_ord_ope
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.timestamp_ord_ope, value eql_v3.timestamp_ord_ope)
-RETURNS eql_v3.timestamp_ord_ope
+--! @brief State function for min on public.timestamp_ord_ope.
+--! @param state public.timestamp_ord_ope
+--! @param value public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord_ope, value public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.timestamp_ord_ope.
---! @param input eql_v3.timestamp_ord_ope
---! @return eql_v3.timestamp_ord_ope
-CREATE AGGREGATE eql_v3.min(eql_v3.timestamp_ord_ope) (
+--! @brief min aggregate for public.timestamp_ord_ope.
+--! @param input public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord_ope) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.timestamp_ord_ope,
+  stype = public.timestamp_ord_ope,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.timestamp_ord_ope.
---! @param state eql_v3.timestamp_ord_ope
---! @param value eql_v3.timestamp_ord_ope
---! @return eql_v3.timestamp_ord_ope
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.timestamp_ord_ope, value eql_v3.timestamp_ord_ope)
-RETURNS eql_v3.timestamp_ord_ope
+--! @brief State function for max on public.timestamp_ord_ope.
+--! @param state public.timestamp_ord_ope
+--! @param value public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord_ope, value public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.timestamp_ord_ope.
---! @param input eql_v3.timestamp_ord_ope
---! @return eql_v3.timestamp_ord_ope
-CREATE AGGREGATE eql_v3.max(eql_v3.timestamp_ord_ope) (
+--! @brief max aggregate for public.timestamp_ord_ope.
+--! @param input public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord_ope) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.timestamp_ord_ope,
+  stype = public.timestamp_ord_ope,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql b/src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql
index 2d38a932f..83e1989a9 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql
@@ -5,390 +5,390 @@
 -- REQUIRE: src/v3/sem/ope_cllw/functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_ope_functions.sql
---! @brief Functions for eql_v3.timestamp_ord_ope.
+--! @brief Functions for public.timestamp_ord_ope.
 
---! @brief Index extractor for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Index extractor for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @return eql_v3_internal.ope_cllw
-CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.ord_ope_term(a public.timestamp_ord_ope)
 RETURNS eql_v3_internal.ope_cllw
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::eql_v3.timestamp_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
+--! @brief Operator wrapper for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.timestamp_ord_ope) = eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) = eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::eql_v3.timestamp_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
+--! @brief Operator wrapper for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.timestamp_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) <> eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::eql_v3.timestamp_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
+--! @brief Operator wrapper for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.timestamp_ord_ope) < eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) < eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::eql_v3.timestamp_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
+--! @brief Operator wrapper for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.timestamp_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) <= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::eql_v3.timestamp_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
+--! @brief Operator wrapper for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.timestamp_ord_ope) > eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) > eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::eql_v3.timestamp_ord_ope) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ope.
+--! @brief Operator wrapper for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_ope_term(a::eql_v3.timestamp_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) >= eql_v3.ord_ope_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ope, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord_ope)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param selector text
---! @return eql_v3.timestamp_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_ord_ope, selector text)
-RETURNS eql_v3.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord_ope'; END; $$
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ope, selector text)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param selector integer
---! @return eql_v3.timestamp_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_ord_ope, selector integer)
-RETURNS eql_v3.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord_ope'; END; $$
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ope, selector integer)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_ord_ope
---! @return eql_v3.timestamp_ord_ope
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.timestamp_ord_ope)
-RETURNS eql_v3.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord_ope'; END; $$
+--! @param selector public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_ord_ope, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ope, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_ord_ope, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ope, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_ord_ope
+--! @param selector public.timestamp_ord_ope
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord_ope)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.timestamp_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord_ope, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.timestamp_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.timestamp_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord_ope, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.timestamp_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.timestamp_ord_ope, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord_ope, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.timestamp_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.timestamp_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord_ope, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord_ope, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord_ope, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.timestamp_ord_ope, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord_ope, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
---! @param b eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_ord_ope, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
---! @param a eql_v3.timestamp_ord_ope
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_ord_ope, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ope, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ope.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.timestamp_ord_ope)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord_ope)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord_ope'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/timestamp/timestamp_ord_ope_operators.sql b/src/v3/scalars/timestamp/timestamp_ord_ope_operators.sql
index 8129cae46..99a920343 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_ope_operators.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_ope_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_ope_operators.sql
---! @brief Operators for eql_v3.timestamp_ord_ope.
+--! @brief Operators for public.timestamp_ord_ope.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_ord_ope, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ope
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
 );
diff --git a/src/v3/scalars/timestamp/timestamp_ord_operators.sql b/src/v3/scalars/timestamp/timestamp_ord_operators.sql
index 8c9b5ed9b..b0b8e924a 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_operators.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_operators.sql
---! @brief Operators for eql_v3.timestamp_ord.
+--! @brief Operators for public.timestamp_ord.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_ord, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
 );
diff --git a/src/v3/scalars/timestamp/timestamp_ord_ore_aggregates.sql b/src/v3/scalars/timestamp/timestamp_ord_ore_aggregates.sql
index 6beb918b8..0bd3e97c7 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_ore_aggregates.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_ore_aggregates.sql
@@ -5,14 +5,14 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ore_operators.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_ore_aggregates.sql
---! @brief Aggregates for eql_v3.timestamp_ord_ore.
+--! @brief Aggregates for public.timestamp_ord_ore.
 
---! @brief State function for min on eql_v3.timestamp_ord_ore.
---! @param state eql_v3.timestamp_ord_ore
---! @param value eql_v3.timestamp_ord_ore
---! @return eql_v3.timestamp_ord_ore
-CREATE FUNCTION eql_v3_internal.min_sfunc(state eql_v3.timestamp_ord_ore, value eql_v3.timestamp_ord_ore)
-RETURNS eql_v3.timestamp_ord_ore
+--! @brief State function for min on public.timestamp_ord_ore.
+--! @param state public.timestamp_ord_ore
+--! @param value public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord_ore, value public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -24,22 +24,22 @@ BEGIN
 END;
 $$;
 
---! @brief min aggregate for eql_v3.timestamp_ord_ore.
---! @param input eql_v3.timestamp_ord_ore
---! @return eql_v3.timestamp_ord_ore
-CREATE AGGREGATE eql_v3.min(eql_v3.timestamp_ord_ore) (
+--! @brief min aggregate for public.timestamp_ord_ore.
+--! @param input public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord_ore) (
   sfunc = eql_v3_internal.min_sfunc,
-  stype = eql_v3.timestamp_ord_ore,
+  stype = public.timestamp_ord_ore,
   combinefunc = eql_v3_internal.min_sfunc,
   parallel = safe
 );
 
---! @brief State function for max on eql_v3.timestamp_ord_ore.
---! @param state eql_v3.timestamp_ord_ore
---! @param value eql_v3.timestamp_ord_ore
---! @return eql_v3.timestamp_ord_ore
-CREATE FUNCTION eql_v3_internal.max_sfunc(state eql_v3.timestamp_ord_ore, value eql_v3.timestamp_ord_ore)
-RETURNS eql_v3.timestamp_ord_ore
+--! @brief State function for max on public.timestamp_ord_ore.
+--! @param state public.timestamp_ord_ore
+--! @param value public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord_ore, value public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore
 LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
 SET search_path = pg_catalog, extensions, public
 AS $$
@@ -51,12 +51,12 @@ BEGIN
 END;
 $$;
 
---! @brief max aggregate for eql_v3.timestamp_ord_ore.
---! @param input eql_v3.timestamp_ord_ore
---! @return eql_v3.timestamp_ord_ore
-CREATE AGGREGATE eql_v3.max(eql_v3.timestamp_ord_ore) (
+--! @brief max aggregate for public.timestamp_ord_ore.
+--! @param input public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord_ore) (
   sfunc = eql_v3_internal.max_sfunc,
-  stype = eql_v3.timestamp_ord_ore,
+  stype = public.timestamp_ord_ore,
   combinefunc = eql_v3_internal.max_sfunc,
   parallel = safe
 );
diff --git a/src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql b/src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql
index b0e5932ae..cfd17520e 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql
@@ -6,390 +6,390 @@
 -- REQUIRE: src/v3/sem/ore_block_256/operators.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_ore_functions.sql
---! @brief Functions for eql_v3.timestamp_ord_ore.
+--! @brief Functions for public.timestamp_ord_ore.
 
---! @brief Index extractor for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Index extractor for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @return eql_v3_internal.ore_block_256
-CREATE FUNCTION eql_v3.ord_term(a eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord_ore)
 RETURNS eql_v3_internal.ore_block_256
 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::eql_v3.timestamp_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
+--! @brief Operator wrapper for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.eq(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord_ore) = eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) = eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::eql_v3.timestamp_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
+--! @brief Operator wrapper for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.neq(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord_ore) <> eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) <> eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::eql_v3.timestamp_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
+--! @brief Operator wrapper for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lt(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord_ore) < eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) < eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::eql_v3.timestamp_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
+--! @brief Operator wrapper for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.lte(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord_ore) <= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) <= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::eql_v3.timestamp_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
+--! @brief Operator wrapper for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gt(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord_ore) > eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) > eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
 AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::eql_v3.timestamp_ord_ore) $$;
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
 
---! @brief Operator wrapper for eql_v3.timestamp_ord_ore.
+--! @brief Operator wrapper for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3.gte(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
-AS $$ SELECT eql_v3.ord_term(a::eql_v3.timestamp_ord_ore) >= eql_v3.ord_term(b) $$;
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) >= eql_v3.ord_term(b) $$;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contains(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ore, b jsonb)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return boolean
-CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord_ore)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param selector text
---! @return eql_v3.timestamp_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_ord_ore, selector text)
-RETURNS eql_v3.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord_ore'; END; $$
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ore, selector text)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param selector integer
---! @return eql_v3.timestamp_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a eql_v3.timestamp_ord_ore, selector integer)
-RETURNS eql_v3.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord_ore'; END; $$
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ore, selector integer)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_ord_ore
---! @return eql_v3.timestamp_ord_ore
-CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector eql_v3.timestamp_ord_ore)
-RETURNS eql_v3.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'eql_v3.timestamp_ord_ore'; END; $$
+--! @param selector public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param selector text
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_ord_ore, selector text)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ore, selector text)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param selector integer
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a eql_v3.timestamp_ord_ore, selector integer)
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ore, selector integer)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param selector eql_v3.timestamp_ord_ore
+--! @param selector public.timestamp_ord_ore
 --! @return text
-CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord_ore)
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?"(a eql_v3.timestamp_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord_ore, b text)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?|"(a eql_v3.timestamp_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text[]
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."?&"(a eql_v3.timestamp_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord_ore, b text[])
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@?"(a eql_v3.timestamp_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonpath
 --! @return boolean
-CREATE FUNCTION eql_v3_internal."@@"(a eql_v3.timestamp_ord_ore, b jsonpath)
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord_ore, b jsonpath)
 RETURNS boolean IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#>"(a eql_v3.timestamp_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text[]
 --! @return text
-CREATE FUNCTION eql_v3_internal."#>>"(a eql_v3.timestamp_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord_ore, b text[])
 RETURNS text IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord_ore, b text)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b text)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b integer
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord_ore, b integer)
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b integer)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."-"(a eql_v3.timestamp_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b text[]
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."#-"(a eql_v3.timestamp_ord_ore, b text[])
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord_ore, b text[])
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
---! @param b eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_ord_ore, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
---! @param a eql_v3.timestamp_ord_ore
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
 --! @param b jsonb
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a eql_v3.timestamp_ord_ore, b jsonb)
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ore, b jsonb)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
 
---! @brief Unsupported operator blocker for eql_v3.timestamp_ord_ore.
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
 --! @param a jsonb
---! @param b eql_v3.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
 --! @return jsonb
-CREATE FUNCTION eql_v3_internal."||"(a jsonb, b eql_v3.timestamp_ord_ore)
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord_ore)
 RETURNS jsonb IMMUTABLE PARALLEL SAFE
-AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'eql_v3.timestamp_ord_ore'; END; $$
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
 LANGUAGE plpgsql;
diff --git a/src/v3/scalars/timestamp/timestamp_ord_ore_operators.sql b/src/v3/scalars/timestamp/timestamp_ord_ore_operators.sql
index 5696e644b..068c745eb 100644
--- a/src/v3/scalars/timestamp/timestamp_ord_ore_operators.sql
+++ b/src/v3/scalars/timestamp/timestamp_ord_ore_operators.sql
@@ -4,242 +4,242 @@
 -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql
 
 --! @file encrypted_domain/timestamp/timestamp_ord_ore_operators.sql
---! @brief Operators for eql_v3.timestamp_ord_ore.
+--! @brief Operators for public.timestamp_ord_ore.
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR = (
   FUNCTION = eql_v3.eq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR <> (
   FUNCTION = eql_v3.neq,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR < (
   FUNCTION = eql_v3.lt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR <= (
   FUNCTION = eql_v3.lte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR > (
   FUNCTION = eql_v3.gt,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR >= (
   FUNCTION = eql_v3.gte,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
   COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR @> (
   FUNCTION = eql_v3_internal.contains,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR <@ (
   FUNCTION = eql_v3_internal.contained_by,
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR -> (
   FUNCTION = eql_v3_internal."->",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR ->> (
   FUNCTION = eql_v3_internal."->>",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
 );
 
 CREATE OPERATOR ? (
   FUNCTION = eql_v3_internal."?",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR ?| (
   FUNCTION = eql_v3_internal."?|",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR ?& (
   FUNCTION = eql_v3_internal."?&",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR @? (
   FUNCTION = eql_v3_internal."@?",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR @@ (
   FUNCTION = eql_v3_internal."@@",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonpath
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonpath
 );
 
 CREATE OPERATOR #> (
   FUNCTION = eql_v3_internal."#>",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #>> (
   FUNCTION = eql_v3_internal."#>>",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = integer
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
 );
 
 CREATE OPERATOR - (
   FUNCTION = eql_v3_internal."-",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR #- (
   FUNCTION = eql_v3_internal."#-",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = text[]
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = eql_v3.timestamp_ord_ore, RIGHTARG = jsonb
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
 );
 
 CREATE OPERATOR || (
   FUNCTION = eql_v3_internal."||",
-  LEFTARG = jsonb, RIGHTARG = eql_v3.timestamp_ord_ore
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
 );
diff --git a/src/v3/scalars/timestamp/timestamp_types.sql b/src/v3/scalars/timestamp/timestamp_types.sql
index 639198e93..f60272c45 100644
--- a/src/v3/scalars/timestamp/timestamp_types.sql
+++ b/src/v3/scalars/timestamp/timestamp_types.sql
@@ -6,12 +6,12 @@
 
 DO $$
 BEGIN
-  --! @brief Encrypted domain eql_v3.timestamp.
+  --! @brief Encrypted domain public.timestamp.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'timestamp' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'timestamp' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.timestamp AS jsonb
+    CREATE DOMAIN public.timestamp AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -21,12 +21,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.timestamp_eq.
+  --! @brief Encrypted domain public.timestamp_eq.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'timestamp_eq' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.timestamp_eq AS jsonb
+    CREATE DOMAIN public.timestamp_eq AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -37,12 +37,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.timestamp_ord_ore.
+  --! @brief Encrypted domain public.timestamp_ord_ore.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.timestamp_ord_ore AS jsonb
+    CREATE DOMAIN public.timestamp_ord_ore AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -55,12 +55,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.timestamp_ord.
+  --! @brief Encrypted domain public.timestamp_ord.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'timestamp_ord' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.timestamp_ord AS jsonb
+    CREATE DOMAIN public.timestamp_ord AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'
@@ -73,12 +73,12 @@ BEGIN
       );
   END IF;
 
-  --! @brief Encrypted domain eql_v3.timestamp_ord_ope.
+  --! @brief Encrypted domain public.timestamp_ord_ope.
   IF NOT EXISTS (
     SELECT 1 FROM pg_type
-    WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+    WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'public'::regnamespace
   ) THEN
-    CREATE DOMAIN eql_v3.timestamp_ord_ope AS jsonb
+    CREATE DOMAIN public.timestamp_ord_ope AS jsonb
       CHECK (
         jsonb_typeof(VALUE) = 'object'
         AND VALUE ? 'v'

From 872a0a20407d1ecf6f5c68940be25fd8ad787883 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Sun, 5 Jul 2026 14:14:54 +1000
Subject: [PATCH 517/599] fix(bindings): report v3 user domains in public

---
 crates/eql-bindings/bindings/v3/Bigint.ts     |   2 +-
 crates/eql-bindings/bindings/v3/BigintEq.ts   |   2 +-
 crates/eql-bindings/bindings/v3/BigintOrd.ts  |   2 +-
 .../eql-bindings/bindings/v3/BigintOrdOpe.ts  |   2 +-
 .../eql-bindings/bindings/v3/BigintOrdOre.ts  |   2 +-
 crates/eql-bindings/bindings/v3/Boolean.ts    |   2 +-
 crates/eql-bindings/bindings/v3/Date.ts       |   2 +-
 crates/eql-bindings/bindings/v3/DateEq.ts     |   2 +-
 crates/eql-bindings/bindings/v3/DateOrd.ts    |   2 +-
 crates/eql-bindings/bindings/v3/DateOrdOpe.ts |   2 +-
 crates/eql-bindings/bindings/v3/DateOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Double.ts     |   2 +-
 crates/eql-bindings/bindings/v3/DoubleEq.ts   |   2 +-
 crates/eql-bindings/bindings/v3/DoubleOrd.ts  |   2 +-
 .../eql-bindings/bindings/v3/DoubleOrdOpe.ts  |   2 +-
 .../eql-bindings/bindings/v3/DoubleOrdOre.ts  |   2 +-
 crates/eql-bindings/bindings/v3/Integer.ts    |   2 +-
 crates/eql-bindings/bindings/v3/IntegerEq.ts  |   2 +-
 crates/eql-bindings/bindings/v3/IntegerOrd.ts |   2 +-
 .../eql-bindings/bindings/v3/IntegerOrdOpe.ts |   2 +-
 .../eql-bindings/bindings/v3/IntegerOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Numeric.ts    |   2 +-
 crates/eql-bindings/bindings/v3/NumericEq.ts  |   2 +-
 crates/eql-bindings/bindings/v3/NumericOrd.ts |   2 +-
 .../eql-bindings/bindings/v3/NumericOrdOpe.ts |   2 +-
 .../eql-bindings/bindings/v3/NumericOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Real.ts       |   2 +-
 crates/eql-bindings/bindings/v3/RealEq.ts     |   2 +-
 crates/eql-bindings/bindings/v3/RealOrd.ts    |   2 +-
 crates/eql-bindings/bindings/v3/RealOrdOpe.ts |   2 +-
 crates/eql-bindings/bindings/v3/RealOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Selector.ts   |   2 +-
 crates/eql-bindings/bindings/v3/Smallint.ts   |   2 +-
 crates/eql-bindings/bindings/v3/SmallintEq.ts |   2 +-
 .../eql-bindings/bindings/v3/SmallintOrd.ts   |   2 +-
 .../bindings/v3/SmallintOrdOpe.ts             |   2 +-
 .../bindings/v3/SmallintOrdOre.ts             |   2 +-
 .../bindings/v3/SteVecDocument.ts             |   2 +-
 .../eql-bindings/bindings/v3/SteVecEntry.ts   |   2 +-
 .../eql-bindings/bindings/v3/SteVecQuery.ts   |   2 +-
 crates/eql-bindings/bindings/v3/Text.ts       |   2 +-
 crates/eql-bindings/bindings/v3/TextEq.ts     |   2 +-
 crates/eql-bindings/bindings/v3/TextMatch.ts  |   2 +-
 crates/eql-bindings/bindings/v3/TextOrd.ts    |   2 +-
 crates/eql-bindings/bindings/v3/TextOrdOpe.ts |   2 +-
 crates/eql-bindings/bindings/v3/TextOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/TextSearch.ts |   2 +-
 crates/eql-bindings/bindings/v3/Timestamp.ts  |   2 +-
 .../eql-bindings/bindings/v3/TimestampEq.ts   |   2 +-
 .../eql-bindings/bindings/v3/TimestampOrd.ts  |   2 +-
 .../bindings/v3/TimestampOrdOpe.ts            |   2 +-
 .../bindings/v3/TimestampOrdOre.ts            |   2 +-
 crates/eql-bindings/schema/v3/bigint.json     |   2 +-
 crates/eql-bindings/schema/v3/bigint_eq.json  |   2 +-
 crates/eql-bindings/schema/v3/bigint_ord.json |   2 +-
 .../schema/v3/bigint_ord_ope.json             |   2 +-
 .../schema/v3/bigint_ord_ore.json             |   2 +-
 crates/eql-bindings/schema/v3/boolean.json    |   2 +-
 crates/eql-bindings/schema/v3/date.json       |   2 +-
 crates/eql-bindings/schema/v3/date_eq.json    |   2 +-
 crates/eql-bindings/schema/v3/date_ord.json   |   2 +-
 .../eql-bindings/schema/v3/date_ord_ope.json  |   2 +-
 .../eql-bindings/schema/v3/date_ord_ore.json  |   2 +-
 crates/eql-bindings/schema/v3/double.json     |   2 +-
 crates/eql-bindings/schema/v3/double_eq.json  |   2 +-
 crates/eql-bindings/schema/v3/double_ord.json |   2 +-
 .../schema/v3/double_ord_ope.json             |   2 +-
 .../schema/v3/double_ord_ore.json             |   2 +-
 crates/eql-bindings/schema/v3/integer.json    |   2 +-
 crates/eql-bindings/schema/v3/integer_eq.json |   2 +-
 .../eql-bindings/schema/v3/integer_ord.json   |   2 +-
 .../schema/v3/integer_ord_ope.json            |   2 +-
 .../schema/v3/integer_ord_ore.json            |   2 +-
 crates/eql-bindings/schema/v3/json.json       |   6 +-
 .../eql-bindings/schema/v3/jsonb_entry.json   |   4 +-
 .../eql-bindings/schema/v3/jsonb_query.json   |   4 +-
 crates/eql-bindings/schema/v3/numeric.json    |   2 +-
 crates/eql-bindings/schema/v3/numeric_eq.json |   2 +-
 .../eql-bindings/schema/v3/numeric_ord.json   |   2 +-
 .../schema/v3/numeric_ord_ope.json            |   2 +-
 .../schema/v3/numeric_ord_ore.json            |   2 +-
 crates/eql-bindings/schema/v3/real.json       |   2 +-
 crates/eql-bindings/schema/v3/real_eq.json    |   2 +-
 crates/eql-bindings/schema/v3/real_ord.json   |   2 +-
 .../eql-bindings/schema/v3/real_ord_ope.json  |   2 +-
 .../eql-bindings/schema/v3/real_ord_ore.json  |   2 +-
 crates/eql-bindings/schema/v3/smallint.json   |   2 +-
 .../eql-bindings/schema/v3/smallint_eq.json   |   2 +-
 .../eql-bindings/schema/v3/smallint_ord.json  |   2 +-
 .../schema/v3/smallint_ord_ope.json           |   2 +-
 .../schema/v3/smallint_ord_ore.json           |   2 +-
 crates/eql-bindings/schema/v3/text.json       |   2 +-
 crates/eql-bindings/schema/v3/text_eq.json    |   2 +-
 crates/eql-bindings/schema/v3/text_match.json |   2 +-
 crates/eql-bindings/schema/v3/text_ord.json   |   2 +-
 .../eql-bindings/schema/v3/text_ord_ope.json  |   2 +-
 .../eql-bindings/schema/v3/text_ord_ore.json  |   2 +-
 .../eql-bindings/schema/v3/text_search.json   |   2 +-
 crates/eql-bindings/schema/v3/timestamp.json  |   2 +-
 .../eql-bindings/schema/v3/timestamp_eq.json  |   2 +-
 .../eql-bindings/schema/v3/timestamp_ord.json |   2 +-
 .../schema/v3/timestamp_ord_ope.json          |   2 +-
 .../schema/v3/timestamp_ord_ore.json          |   2 +-
 crates/eql-bindings/src/from_v2/target.rs     |   2 +-
 crates/eql-bindings/src/lib.rs                |   2 +-
 crates/eql-bindings/src/v3/bigint.rs          |  20 ++--
 crates/eql-bindings/src/v3/boolean.rs         |   4 +-
 crates/eql-bindings/src/v3/date.rs            |  20 ++--
 crates/eql-bindings/src/v3/domain_type.rs     |  10 +-
 crates/eql-bindings/src/v3/double.rs          |  20 ++--
 crates/eql-bindings/src/v3/integer.rs         |  20 ++--
 crates/eql-bindings/src/v3/jsonb.rs           |  12 +--
 crates/eql-bindings/src/v3/numeric.rs         |  20 ++--
 crates/eql-bindings/src/v3/payload.rs         | 102 +++++++++---------
 crates/eql-bindings/src/v3/query_payload.rs   |   6 +-
 crates/eql-bindings/src/v3/real.rs            |  20 ++--
 crates/eql-bindings/src/v3/smallint.rs        |  20 ++--
 crates/eql-bindings/src/v3/terms.rs           |   2 +-
 crates/eql-bindings/src/v3/text.rs            |  28 ++---
 crates/eql-bindings/src/v3/timestamp.rs       |  20 ++--
 crates/eql-bindings/tests/catalog_parity.rs   |  18 ++--
 crates/eql-bindings/tests/domain_payload.rs   |  10 +-
 crates/eql-bindings/tests/from_v2.rs          |   2 +-
 crates/eql-bindings/tests/query_payload.rs    |   6 +-
 crates/eql-bindings/tests/v3_conformance.rs   |  96 ++++++++---------
 crates/eql-codegen/src/bindings.rs            |  38 +++----
 126 files changed, 356 insertions(+), 356 deletions(-)

diff --git a/crates/eql-bindings/bindings/v3/Bigint.ts b/crates/eql-bindings/bindings/v3/Bigint.ts
index a569b6815..809944c6b 100644
--- a/crates/eql-bindings/bindings/v3/Bigint.ts
+++ b/crates/eql-bindings/bindings/v3/Bigint.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.bigint` — storage-only domain.
+ * `public.bigint` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintEq.ts b/crates/eql-bindings/bindings/v3/BigintEq.ts
index efccc4368..28ed32e72 100644
--- a/crates/eql-bindings/bindings/v3/BigintEq.ts
+++ b/crates/eql-bindings/bindings/v3/BigintEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.bigint_eq` — equality domain.
+ * `public.bigint_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintOrd.ts b/crates/eql-bindings/bindings/v3/BigintOrd.ts
index 8840bbee8..945c36831 100644
--- a/crates/eql-bindings/bindings/v3/BigintOrd.ts
+++ b/crates/eql-bindings/bindings/v3/BigintOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.bigint_ord` — ordering domain.
+ * `public.bigint_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts b/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts
index 16f73ff23..9ca0bc5d8 100644
--- a/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.bigint_ord_ope` — ordering domain.
+ * `public.bigint_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOre.ts b/crates/eql-bindings/bindings/v3/BigintOrdOre.ts
index 289e07cc0..c40be04bf 100644
--- a/crates/eql-bindings/bindings/v3/BigintOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/BigintOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.bigint_ord_ore` — ordering domain.
+ * `public.bigint_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Boolean.ts b/crates/eql-bindings/bindings/v3/Boolean.ts
index 1257eae98..96fc814fa 100644
--- a/crates/eql-bindings/bindings/v3/Boolean.ts
+++ b/crates/eql-bindings/bindings/v3/Boolean.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.boolean` — storage-only domain.
+ * `public.boolean` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Date.ts b/crates/eql-bindings/bindings/v3/Date.ts
index 08a16cd62..1926b4d4c 100644
--- a/crates/eql-bindings/bindings/v3/Date.ts
+++ b/crates/eql-bindings/bindings/v3/Date.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.date` — storage-only domain.
+ * `public.date` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateEq.ts b/crates/eql-bindings/bindings/v3/DateEq.ts
index cb1770f91..fb6e600b9 100644
--- a/crates/eql-bindings/bindings/v3/DateEq.ts
+++ b/crates/eql-bindings/bindings/v3/DateEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.date_eq` — equality domain.
+ * `public.date_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateOrd.ts b/crates/eql-bindings/bindings/v3/DateOrd.ts
index f038cde74..326fc3c9a 100644
--- a/crates/eql-bindings/bindings/v3/DateOrd.ts
+++ b/crates/eql-bindings/bindings/v3/DateOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.date_ord` — ordering domain.
+ * `public.date_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateOrdOpe.ts b/crates/eql-bindings/bindings/v3/DateOrdOpe.ts
index 2d69e5ef0..f3a43723e 100644
--- a/crates/eql-bindings/bindings/v3/DateOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/DateOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.date_ord_ope` — ordering domain.
+ * `public.date_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateOrdOre.ts b/crates/eql-bindings/bindings/v3/DateOrdOre.ts
index 53235f461..f6e28e4e4 100644
--- a/crates/eql-bindings/bindings/v3/DateOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/DateOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.date_ord_ore` — ordering domain.
+ * `public.date_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Double.ts b/crates/eql-bindings/bindings/v3/Double.ts
index 3a7cce03c..cd0d5c806 100644
--- a/crates/eql-bindings/bindings/v3/Double.ts
+++ b/crates/eql-bindings/bindings/v3/Double.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.double` — storage-only domain.
+ * `public.double` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleEq.ts b/crates/eql-bindings/bindings/v3/DoubleEq.ts
index aa7f5462e..e4218fae8 100644
--- a/crates/eql-bindings/bindings/v3/DoubleEq.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.double_eq` — equality domain.
+ * `public.double_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleOrd.ts b/crates/eql-bindings/bindings/v3/DoubleOrd.ts
index 365c1388f..be98e9f3c 100644
--- a/crates/eql-bindings/bindings/v3/DoubleOrd.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.double_ord` — ordering domain.
+ * `public.double_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts
index 6a86f6d35..85c3a1bd1 100644
--- a/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.double_ord_ope` — ordering domain.
+ * `public.double_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts
index 8bed025c2..10a64ad15 100644
--- a/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.double_ord_ore` — ordering domain.
+ * `public.double_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Integer.ts b/crates/eql-bindings/bindings/v3/Integer.ts
index 22620a971..d7fe5263a 100644
--- a/crates/eql-bindings/bindings/v3/Integer.ts
+++ b/crates/eql-bindings/bindings/v3/Integer.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.integer` — storage-only domain.
+ * `public.integer` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerEq.ts b/crates/eql-bindings/bindings/v3/IntegerEq.ts
index 682ab4e8c..51079950e 100644
--- a/crates/eql-bindings/bindings/v3/IntegerEq.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.integer_eq` — equality domain.
+ * `public.integer_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerOrd.ts b/crates/eql-bindings/bindings/v3/IntegerOrd.ts
index 00699d733..e7b016e49 100644
--- a/crates/eql-bindings/bindings/v3/IntegerOrd.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.integer_ord` — ordering domain.
+ * `public.integer_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts
index b8f1f5ba8..19c948db9 100644
--- a/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.integer_ord_ope` — ordering domain.
+ * `public.integer_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts
index 4c6414198..eddb18e22 100644
--- a/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.integer_ord_ore` — ordering domain.
+ * `public.integer_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Numeric.ts b/crates/eql-bindings/bindings/v3/Numeric.ts
index 99277adcf..5d231394b 100644
--- a/crates/eql-bindings/bindings/v3/Numeric.ts
+++ b/crates/eql-bindings/bindings/v3/Numeric.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.numeric` — storage-only domain.
+ * `public.numeric` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericEq.ts b/crates/eql-bindings/bindings/v3/NumericEq.ts
index f318b3017..784641e71 100644
--- a/crates/eql-bindings/bindings/v3/NumericEq.ts
+++ b/crates/eql-bindings/bindings/v3/NumericEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.numeric_eq` — equality domain.
+ * `public.numeric_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericOrd.ts b/crates/eql-bindings/bindings/v3/NumericOrd.ts
index 6945e4d1f..b99627eaf 100644
--- a/crates/eql-bindings/bindings/v3/NumericOrd.ts
+++ b/crates/eql-bindings/bindings/v3/NumericOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.numeric_ord` — ordering domain.
+ * `public.numeric_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts b/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts
index 2a474cbaa..4e470ed80 100644
--- a/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.numeric_ord_ope` — ordering domain.
+ * `public.numeric_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOre.ts b/crates/eql-bindings/bindings/v3/NumericOrdOre.ts
index 3c14fcaa2..a3362d632 100644
--- a/crates/eql-bindings/bindings/v3/NumericOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/NumericOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.numeric_ord_ore` — ordering domain.
+ * `public.numeric_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Real.ts b/crates/eql-bindings/bindings/v3/Real.ts
index 3a67c124b..e7e4af203 100644
--- a/crates/eql-bindings/bindings/v3/Real.ts
+++ b/crates/eql-bindings/bindings/v3/Real.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.real` — storage-only domain.
+ * `public.real` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealEq.ts b/crates/eql-bindings/bindings/v3/RealEq.ts
index bd43ff3b7..2b565ff73 100644
--- a/crates/eql-bindings/bindings/v3/RealEq.ts
+++ b/crates/eql-bindings/bindings/v3/RealEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.real_eq` — equality domain.
+ * `public.real_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealOrd.ts b/crates/eql-bindings/bindings/v3/RealOrd.ts
index cd9440302..eecebcb3f 100644
--- a/crates/eql-bindings/bindings/v3/RealOrd.ts
+++ b/crates/eql-bindings/bindings/v3/RealOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.real_ord` — ordering domain.
+ * `public.real_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealOrdOpe.ts b/crates/eql-bindings/bindings/v3/RealOrdOpe.ts
index e27bbab9d..c60d0ceb3 100644
--- a/crates/eql-bindings/bindings/v3/RealOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/RealOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.real_ord_ope` — ordering domain.
+ * `public.real_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealOrdOre.ts b/crates/eql-bindings/bindings/v3/RealOrdOre.ts
index 0e2c27b79..58b42ddae 100644
--- a/crates/eql-bindings/bindings/v3/RealOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/RealOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.real_ord_ore` — ordering domain.
+ * `public.real_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Selector.ts b/crates/eql-bindings/bindings/v3/Selector.ts
index 7e7bc5341..56c8dfcff 100644
--- a/crates/eql-bindings/bindings/v3/Selector.ts
+++ b/crates/eql-bindings/bindings/v3/Selector.ts
@@ -2,6 +2,6 @@
 
 /**
  * A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an
- * encrypted document (`eql_v3.json`); present on every entry and query element.
+ * encrypted document (`public.json`); present on every entry and query element.
  */
 export type Selector = string;
diff --git a/crates/eql-bindings/bindings/v3/Smallint.ts b/crates/eql-bindings/bindings/v3/Smallint.ts
index 7cea9f940..0450a7e32 100644
--- a/crates/eql-bindings/bindings/v3/Smallint.ts
+++ b/crates/eql-bindings/bindings/v3/Smallint.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.smallint` — storage-only domain.
+ * `public.smallint` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintEq.ts b/crates/eql-bindings/bindings/v3/SmallintEq.ts
index ffc529e05..f4ddfb50a 100644
--- a/crates/eql-bindings/bindings/v3/SmallintEq.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.smallint_eq` — equality domain.
+ * `public.smallint_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintOrd.ts b/crates/eql-bindings/bindings/v3/SmallintOrd.ts
index 4f9a61ba4..caf148562 100644
--- a/crates/eql-bindings/bindings/v3/SmallintOrd.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.smallint_ord` — ordering domain.
+ * `public.smallint_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts
index 6d4996323..81da5a430 100644
--- a/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.smallint_ord_ope` — ordering domain.
+ * `public.smallint_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts
index 72f1ca2d0..acee4059a 100644
--- a/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.smallint_ord_ore` — ordering domain.
+ * `public.smallint_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SteVecDocument.ts b/crates/eql-bindings/bindings/v3/SteVecDocument.ts
index 73fa3e6b0..75e5f820c 100644
--- a/crates/eql-bindings/bindings/v3/SteVecDocument.ts
+++ b/crates/eql-bindings/bindings/v3/SteVecDocument.ts
@@ -5,7 +5,7 @@ import type { SteVecEntry } from "./SteVecEntry";
 import type { SteVecForm } from "./SteVecForm";
 
 /**
- * `eql_v3.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
+ * `public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
  * no root ciphertext). Strict. `k` is the `"sv"` form discriminator (see
  * [`SteVecForm`]) — carried on the real wire, so the strict struct models it.
  */
diff --git a/crates/eql-bindings/bindings/v3/SteVecEntry.ts b/crates/eql-bindings/bindings/v3/SteVecEntry.ts
index 1763232b1..848849f69 100644
--- a/crates/eql-bindings/bindings/v3/SteVecEntry.ts
+++ b/crates/eql-bindings/bindings/v3/SteVecEntry.ts
@@ -5,7 +5,7 @@ import type { OreCllw } from "./OreCllw";
 import type { Selector } from "./Selector";
 
 /**
- * `eql_v3.jsonb_entry` — one sv element (returned by `->`). Carries a selector
+ * `public.jsonb_entry` — one sv element (returned by `->`). Carries a selector
  * `s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of
  * `hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the
  * root `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.
diff --git a/crates/eql-bindings/bindings/v3/SteVecQuery.ts b/crates/eql-bindings/bindings/v3/SteVecQuery.ts
index c4cca2025..7d4d64a8d 100644
--- a/crates/eql-bindings/bindings/v3/SteVecQuery.ts
+++ b/crates/eql-bindings/bindings/v3/SteVecQuery.ts
@@ -2,6 +2,6 @@
 import type { SteVecQueryEntry } from "./SteVecQueryEntry";
 
 /**
- * `eql_v3.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.
+ * `public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.
  */
 export type SteVecQuery = { sv: Array, };
diff --git a/crates/eql-bindings/bindings/v3/Text.ts b/crates/eql-bindings/bindings/v3/Text.ts
index a6274a5da..65309716c 100644
--- a/crates/eql-bindings/bindings/v3/Text.ts
+++ b/crates/eql-bindings/bindings/v3/Text.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.text` — storage-only domain.
+ * `public.text` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextEq.ts b/crates/eql-bindings/bindings/v3/TextEq.ts
index e3e5c7b5c..c0f7744e0 100644
--- a/crates/eql-bindings/bindings/v3/TextEq.ts
+++ b/crates/eql-bindings/bindings/v3/TextEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.text_eq` — equality domain.
+ * `public.text_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextMatch.ts b/crates/eql-bindings/bindings/v3/TextMatch.ts
index f1f85c9e3..39c401bb1 100644
--- a/crates/eql-bindings/bindings/v3/TextMatch.ts
+++ b/crates/eql-bindings/bindings/v3/TextMatch.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.text_match` — match domain.
+ * `public.text_match` — match domain.
  *
  * Operators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextOrd.ts b/crates/eql-bindings/bindings/v3/TextOrd.ts
index f6c7c856d..bff3ab55c 100644
--- a/crates/eql-bindings/bindings/v3/TextOrd.ts
+++ b/crates/eql-bindings/bindings/v3/TextOrd.ts
@@ -6,7 +6,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.text_ord` — ordering domain.
+ * `public.text_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextOrdOpe.ts b/crates/eql-bindings/bindings/v3/TextOrdOpe.ts
index cd2ebb87c..e681f9f86 100644
--- a/crates/eql-bindings/bindings/v3/TextOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/TextOrdOpe.ts
@@ -6,7 +6,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.text_ord_ope` — ordering domain.
+ * `public.text_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextOrdOre.ts b/crates/eql-bindings/bindings/v3/TextOrdOre.ts
index f1e264af5..ce5e29d0a 100644
--- a/crates/eql-bindings/bindings/v3/TextOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/TextOrdOre.ts
@@ -6,7 +6,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.text_ord_ore` — ordering domain.
+ * `public.text_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextSearch.ts b/crates/eql-bindings/bindings/v3/TextSearch.ts
index fe46d46cf..d9ce8c69c 100644
--- a/crates/eql-bindings/bindings/v3/TextSearch.ts
+++ b/crates/eql-bindings/bindings/v3/TextSearch.ts
@@ -7,7 +7,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.text_search` — search domain.
+ * `public.text_search` — search domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Timestamp.ts b/crates/eql-bindings/bindings/v3/Timestamp.ts
index d17678a79..87a4b9e7b 100644
--- a/crates/eql-bindings/bindings/v3/Timestamp.ts
+++ b/crates/eql-bindings/bindings/v3/Timestamp.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.timestamp` — storage-only domain.
+ * `public.timestamp` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampEq.ts b/crates/eql-bindings/bindings/v3/TimestampEq.ts
index 0f71f1dfd..63feac8d8 100644
--- a/crates/eql-bindings/bindings/v3/TimestampEq.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.timestamp_eq` — equality domain.
+ * `public.timestamp_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampOrd.ts b/crates/eql-bindings/bindings/v3/TimestampOrd.ts
index e41c78ea4..f22750626 100644
--- a/crates/eql-bindings/bindings/v3/TimestampOrd.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.timestamp_ord` — ordering domain.
+ * `public.timestamp_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts
index ae7b52ba3..1beaa8030 100644
--- a/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.timestamp_ord_ope` — ordering domain.
+ * `public.timestamp_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts
index c708f30f3..dc27811f1 100644
--- a/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `eql_v3.timestamp_ord_ore` — ordering domain.
+ * `public.timestamp_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/schema/v3/bigint.json b/crates/eql-bindings/schema/v3/bigint.json
index 133413dca..e6cb310f4 100644
--- a/crates/eql-bindings/schema/v3/bigint.json
+++ b/crates/eql-bindings/schema/v3/bigint.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/bigint.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.bigint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.bigint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/bigint_eq.json b/crates/eql-bindings/schema/v3/bigint_eq.json
index 0eb8a5c74..9309eef16 100644
--- a/crates/eql-bindings/schema/v3/bigint_eq.json
+++ b/crates/eql-bindings/schema/v3/bigint_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/bigint_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.bigint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.bigint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/bigint_ord.json b/crates/eql-bindings/schema/v3/bigint_ord.json
index 91a8e02eb..7cce23859 100644
--- a/crates/eql-bindings/schema/v3/bigint_ord.json
+++ b/crates/eql-bindings/schema/v3/bigint_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.bigint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.bigint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/bigint_ord_ope.json b/crates/eql-bindings/schema/v3/bigint_ord_ope.json
index 89a9635aa..cd7bdd447 100644
--- a/crates/eql-bindings/schema/v3/bigint_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/bigint_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.bigint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.bigint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/bigint_ord_ore.json b/crates/eql-bindings/schema/v3/bigint_ord_ore.json
index 06e8b8543..f2a94eb39 100644
--- a/crates/eql-bindings/schema/v3/bigint_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/bigint_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.bigint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.bigint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/boolean.json b/crates/eql-bindings/schema/v3/boolean.json
index 44aa4099e..958b89de6 100644
--- a/crates/eql-bindings/schema/v3/boolean.json
+++ b/crates/eql-bindings/schema/v3/boolean.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/boolean.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.boolean` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.boolean` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/date.json b/crates/eql-bindings/schema/v3/date.json
index 84431396f..fbf9a8720 100644
--- a/crates/eql-bindings/schema/v3/date.json
+++ b/crates/eql-bindings/schema/v3/date.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/date.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.date` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.date` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/date_eq.json b/crates/eql-bindings/schema/v3/date_eq.json
index 0164aae66..fc0f52262 100644
--- a/crates/eql-bindings/schema/v3/date_eq.json
+++ b/crates/eql-bindings/schema/v3/date_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.date_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.date_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/date_ord.json b/crates/eql-bindings/schema/v3/date_ord.json
index a9e018c59..8c3a540fb 100644
--- a/crates/eql-bindings/schema/v3/date_ord.json
+++ b/crates/eql-bindings/schema/v3/date_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.date_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.date_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/date_ord_ope.json b/crates/eql-bindings/schema/v3/date_ord_ope.json
index 74e6be8b8..105c5ff87 100644
--- a/crates/eql-bindings/schema/v3/date_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/date_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.date_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.date_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/date_ord_ore.json b/crates/eql-bindings/schema/v3/date_ord_ore.json
index cabbf473d..ea862d5af 100644
--- a/crates/eql-bindings/schema/v3/date_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/date_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.date_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.date_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/double.json b/crates/eql-bindings/schema/v3/double.json
index bd9b52e10..cef5d433f 100644
--- a/crates/eql-bindings/schema/v3/double.json
+++ b/crates/eql-bindings/schema/v3/double.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/double.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.double` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.double` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/double_eq.json b/crates/eql-bindings/schema/v3/double_eq.json
index db8536608..67ceb5ce2 100644
--- a/crates/eql-bindings/schema/v3/double_eq.json
+++ b/crates/eql-bindings/schema/v3/double_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/double_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.double_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.double_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/double_ord.json b/crates/eql-bindings/schema/v3/double_ord.json
index a1f1a11ae..4554ce3de 100644
--- a/crates/eql-bindings/schema/v3/double_ord.json
+++ b/crates/eql-bindings/schema/v3/double_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/double_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.double_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.double_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/double_ord_ope.json b/crates/eql-bindings/schema/v3/double_ord_ope.json
index 7c11cf2b5..e7ae20677 100644
--- a/crates/eql-bindings/schema/v3/double_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/double_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.double_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.double_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/double_ord_ore.json b/crates/eql-bindings/schema/v3/double_ord_ore.json
index 49c114732..0fcbdeb6b 100644
--- a/crates/eql-bindings/schema/v3/double_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/double_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.double_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.double_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer.json b/crates/eql-bindings/schema/v3/integer.json
index b7fe1db44..d0ebfe286 100644
--- a/crates/eql-bindings/schema/v3/integer.json
+++ b/crates/eql-bindings/schema/v3/integer.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/integer.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.integer` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.integer` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer_eq.json b/crates/eql-bindings/schema/v3/integer_eq.json
index 3a937e6a6..75bc84dfa 100644
--- a/crates/eql-bindings/schema/v3/integer_eq.json
+++ b/crates/eql-bindings/schema/v3/integer_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/integer_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.integer_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.integer_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer_ord.json b/crates/eql-bindings/schema/v3/integer_ord.json
index 0a5a43e4c..08dcd2109 100644
--- a/crates/eql-bindings/schema/v3/integer_ord.json
+++ b/crates/eql-bindings/schema/v3/integer_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.integer_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.integer_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer_ord_ope.json b/crates/eql-bindings/schema/v3/integer_ord_ope.json
index 4299a0f62..7b8b504ac 100644
--- a/crates/eql-bindings/schema/v3/integer_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/integer_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.integer_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.integer_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer_ord_ore.json b/crates/eql-bindings/schema/v3/integer_ord_ore.json
index d30ae9756..3521f1087 100644
--- a/crates/eql-bindings/schema/v3/integer_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/integer_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.integer_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.integer_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/json.json b/crates/eql-bindings/schema/v3/json.json
index f82752346..546a80c0e 100644
--- a/crates/eql-bindings/schema/v3/json.json
+++ b/crates/eql-bindings/schema/v3/json.json
@@ -37,7 +37,7 @@
       "type": "integer"
     },
     "Selector": {
-      "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`eql_v3.json`); present on every entry and query element.",
+      "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`public.json`); present on every entry and query element.",
       "type": "string"
     },
     "SteVecEntry": {
@@ -65,7 +65,7 @@
           "type": "object"
         }
       ],
-      "description": "`eql_v3.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
+      "description": "`public.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
       "properties": {
         "a": {
           "type": [
@@ -95,7 +95,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/json.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,\nno root ciphertext). Strict. `k` is the `\"sv\"` form discriminator (see\n[`SteVecForm`]) — carried on the real wire, so the strict struct models it.",
+  "description": "`public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,\nno root ciphertext). Strict. `k` is the `\"sv\"` form discriminator (see\n[`SteVecForm`]) — carried on the real wire, so the strict struct models it.",
   "properties": {
     "i": {
       "$ref": "#/$defs/Identifier"
diff --git a/crates/eql-bindings/schema/v3/jsonb_entry.json b/crates/eql-bindings/schema/v3/jsonb_entry.json
index ff46ab66b..c38667838 100644
--- a/crates/eql-bindings/schema/v3/jsonb_entry.json
+++ b/crates/eql-bindings/schema/v3/jsonb_entry.json
@@ -13,7 +13,7 @@
       "type": "string"
     },
     "Selector": {
-      "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`eql_v3.json`); present on every entry and query element.",
+      "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`public.json`); present on every entry and query element.",
       "type": "string"
     }
   },
@@ -43,7 +43,7 @@
       "type": "object"
     }
   ],
-  "description": "`eql_v3.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
+  "description": "`public.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
   "properties": {
     "a": {
       "type": [
diff --git a/crates/eql-bindings/schema/v3/jsonb_query.json b/crates/eql-bindings/schema/v3/jsonb_query.json
index 8055824ed..d33e4fe83 100644
--- a/crates/eql-bindings/schema/v3/jsonb_query.json
+++ b/crates/eql-bindings/schema/v3/jsonb_query.json
@@ -9,7 +9,7 @@
       "type": "string"
     },
     "Selector": {
-      "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`eql_v3.json`); present on every entry and query element.",
+      "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`public.json`); present on every entry and query element.",
       "type": "string"
     },
     "SteVecQueryEntry": {
@@ -52,7 +52,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/jsonb_query.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.",
+  "description": "`public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.",
   "properties": {
     "sv": {
       "items": {
diff --git a/crates/eql-bindings/schema/v3/numeric.json b/crates/eql-bindings/schema/v3/numeric.json
index 2d4103414..c8deb4041 100644
--- a/crates/eql-bindings/schema/v3/numeric.json
+++ b/crates/eql-bindings/schema/v3/numeric.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/numeric.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.numeric` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.numeric` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_eq.json b/crates/eql-bindings/schema/v3/numeric_eq.json
index fdb9946ca..20ce2e84f 100644
--- a/crates/eql-bindings/schema/v3/numeric_eq.json
+++ b/crates/eql-bindings/schema/v3/numeric_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.numeric_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.numeric_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_ord.json b/crates/eql-bindings/schema/v3/numeric_ord.json
index 66b8ec471..a93457e21 100644
--- a/crates/eql-bindings/schema/v3/numeric_ord.json
+++ b/crates/eql-bindings/schema/v3/numeric_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.numeric_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.numeric_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ope.json b/crates/eql-bindings/schema/v3/numeric_ord_ope.json
index e10bce221..198724c8c 100644
--- a/crates/eql-bindings/schema/v3/numeric_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/numeric_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.numeric_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.numeric_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ore.json b/crates/eql-bindings/schema/v3/numeric_ord_ore.json
index 581b93bfe..48ffe1a3e 100644
--- a/crates/eql-bindings/schema/v3/numeric_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/numeric_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.numeric_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.numeric_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/real.json b/crates/eql-bindings/schema/v3/real.json
index 9d313a5c4..e62f8db5a 100644
--- a/crates/eql-bindings/schema/v3/real.json
+++ b/crates/eql-bindings/schema/v3/real.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/real.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.real` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.real` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/real_eq.json b/crates/eql-bindings/schema/v3/real_eq.json
index 10c11d77a..c5714a700 100644
--- a/crates/eql-bindings/schema/v3/real_eq.json
+++ b/crates/eql-bindings/schema/v3/real_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/real_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.real_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.real_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/real_ord.json b/crates/eql-bindings/schema/v3/real_ord.json
index 1a6dc2f94..b0304add5 100644
--- a/crates/eql-bindings/schema/v3/real_ord.json
+++ b/crates/eql-bindings/schema/v3/real_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/real_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.real_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.real_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/real_ord_ope.json b/crates/eql-bindings/schema/v3/real_ord_ope.json
index 061e11aa7..88b9f05d2 100644
--- a/crates/eql-bindings/schema/v3/real_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/real_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.real_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.real_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/real_ord_ore.json b/crates/eql-bindings/schema/v3/real_ord_ore.json
index 95239e9f4..dadf63852 100644
--- a/crates/eql-bindings/schema/v3/real_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/real_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.real_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.real_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint.json b/crates/eql-bindings/schema/v3/smallint.json
index d5af74391..5270797b9 100644
--- a/crates/eql-bindings/schema/v3/smallint.json
+++ b/crates/eql-bindings/schema/v3/smallint.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/smallint.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.smallint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.smallint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_eq.json b/crates/eql-bindings/schema/v3/smallint_eq.json
index 5c219af9a..9427016f7 100644
--- a/crates/eql-bindings/schema/v3/smallint_eq.json
+++ b/crates/eql-bindings/schema/v3/smallint_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/smallint_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.smallint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.smallint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_ord.json b/crates/eql-bindings/schema/v3/smallint_ord.json
index 8b7f03f30..32dfac9e4 100644
--- a/crates/eql-bindings/schema/v3/smallint_ord.json
+++ b/crates/eql-bindings/schema/v3/smallint_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.smallint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.smallint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ope.json b/crates/eql-bindings/schema/v3/smallint_ord_ope.json
index ef6e777e7..52a582166 100644
--- a/crates/eql-bindings/schema/v3/smallint_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/smallint_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.smallint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.smallint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ore.json b/crates/eql-bindings/schema/v3/smallint_ord_ore.json
index 441d55237..92e8b1929 100644
--- a/crates/eql-bindings/schema/v3/smallint_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/smallint_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.smallint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.smallint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text.json b/crates/eql-bindings/schema/v3/text.json
index 1d51c1e9b..35cf29063 100644
--- a/crates/eql-bindings/schema/v3/text.json
+++ b/crates/eql-bindings/schema/v3/text.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/text.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.text` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.text` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_eq.json b/crates/eql-bindings/schema/v3/text_eq.json
index d57a3b06e..cc7949f57 100644
--- a/crates/eql-bindings/schema/v3/text_eq.json
+++ b/crates/eql-bindings/schema/v3/text_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.text_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.text_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_match.json b/crates/eql-bindings/schema/v3/text_match.json
index 42339edb4..157c83950 100644
--- a/crates/eql-bindings/schema/v3/text_match.json
+++ b/crates/eql-bindings/schema/v3/text_match.json
@@ -42,7 +42,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.text_match` — match domain.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.",
+  "description": "`public.text_match` — match domain.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.",
   "properties": {
     "bf": {
       "$ref": "#/$defs/BloomFilter"
diff --git a/crates/eql-bindings/schema/v3/text_ord.json b/crates/eql-bindings/schema/v3/text_ord.json
index f8d391070..9ac1f2ae8 100644
--- a/crates/eql-bindings/schema/v3/text_ord.json
+++ b/crates/eql-bindings/schema/v3/text_ord.json
@@ -43,7 +43,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.text_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
+  "description": "`public.text_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_ord_ope.json b/crates/eql-bindings/schema/v3/text_ord_ope.json
index 2062207c2..4b25588f0 100644
--- a/crates/eql-bindings/schema/v3/text_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/text_ord_ope.json
@@ -40,7 +40,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.text_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.",
+  "description": "`public.text_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_ord_ore.json b/crates/eql-bindings/schema/v3/text_ord_ore.json
index 2f5fe1483..67e0afcb2 100644
--- a/crates/eql-bindings/schema/v3/text_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/text_ord_ore.json
@@ -43,7 +43,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.text_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
+  "description": "`public.text_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_search.json b/crates/eql-bindings/schema/v3/text_search.json
index 50414f3af..4d146221d 100644
--- a/crates/eql-bindings/schema/v3/text_search.json
+++ b/crates/eql-bindings/schema/v3/text_search.json
@@ -53,7 +53,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/text_search.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.text_search` — search domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.",
+  "description": "`public.text_search` — search domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.",
   "properties": {
     "bf": {
       "$ref": "#/$defs/BloomFilter"
diff --git a/crates/eql-bindings/schema/v3/timestamp.json b/crates/eql-bindings/schema/v3/timestamp.json
index 83961845d..523b588fd 100644
--- a/crates/eql-bindings/schema/v3/timestamp.json
+++ b/crates/eql-bindings/schema/v3/timestamp.json
@@ -32,7 +32,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/timestamp.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.timestamp` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.timestamp` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_eq.json b/crates/eql-bindings/schema/v3/timestamp_eq.json
index 0dfe462d8..cfb61fa3c 100644
--- a/crates/eql-bindings/schema/v3/timestamp_eq.json
+++ b/crates/eql-bindings/schema/v3/timestamp_eq.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.timestamp_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.timestamp_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_ord.json b/crates/eql-bindings/schema/v3/timestamp_ord.json
index f941820e6..c7bdc3688 100644
--- a/crates/eql-bindings/schema/v3/timestamp_ord.json
+++ b/crates/eql-bindings/schema/v3/timestamp_ord.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.timestamp_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.timestamp_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ope.json b/crates/eql-bindings/schema/v3/timestamp_ord_ope.json
index fdf15dd7c..f87426ef8 100644
--- a/crates/eql-bindings/schema/v3/timestamp_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/timestamp_ord_ope.json
@@ -36,7 +36,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.timestamp_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.timestamp_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ore.json b/crates/eql-bindings/schema/v3/timestamp_ord_ore.json
index 795926dad..0eb48eb74 100644
--- a/crates/eql-bindings/schema/v3/timestamp_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/timestamp_ord_ore.json
@@ -39,7 +39,7 @@
   "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`eql_v3.timestamp_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.timestamp_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/src/from_v2/target.rs b/crates/eql-bindings/src/from_v2/target.rs
index 6dda6996c..2e08d181d 100644
--- a/crates/eql-bindings/src/from_v2/target.rs
+++ b/crates/eql-bindings/src/from_v2/target.rs
@@ -16,7 +16,7 @@ pub enum TargetDomain {
     /// A flat scalar domain (`integer`, `text_eq`, `integer_ord_ope`, …): the v2
     /// payload must be the `k: "ct"` form.
     Scalar(ScalarTarget),
-    /// The SteVec document domain `eql_v3.json`: the v2 payload must be the
+    /// The SteVec document domain `public.json`: the v2 payload must be the
     /// `k: "sv"` form.
     Json,
 }
diff --git a/crates/eql-bindings/src/lib.rs b/crates/eql-bindings/src/lib.rs
index c6cf1191d..f283382f2 100644
--- a/crates/eql-bindings/src/lib.rs
+++ b/crates/eql-bindings/src/lib.rs
@@ -16,7 +16,7 @@
 //! derivable from the scalar catalog.
 //!
 //! The [`v3`] module holds the `eql_v3` encrypted-domain types: one struct
-//! per SQL domain (`eql_v3.integer_eq`, `eql_v3.text_match`, …),
+//! per SQL domain (`public.integer_eq`, `public.text_match`, …),
 //! *capability-encoded* — index terms are required fields, never `Option`.
 //! The generated flat-scalar payload structs mirror the scalar subset of
 //! `eql-domains::CATALOG` 1:1, enforced by `tests/catalog_parity.rs`; the
diff --git a/crates/eql-bindings/src/v3/bigint.rs b/crates/eql-bindings/src/v3/bigint.rs
index 5c1eff2a2..fdfbb6e63 100644
--- a/crates/eql-bindings/src/v3/bigint.rs
+++ b/crates/eql-bindings/src/v3/bigint.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.bigint` — storage-only domain.
+/// `public.bigint` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Bigint {
 }
 impl DomainType for Bigint {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.bigint"
+        "public.bigint"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Bigint {
         schema_for!(Bigint)
     }
 }
-/// `eql_v3.bigint_eq` — equality domain.
+/// `public.bigint_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct BigintEq {
 }
 impl DomainType for BigintEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.bigint_eq"
+        "public.bigint_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for BigintEq {
         schema_for!(BigintEq)
     }
 }
-/// `eql_v3.bigint_ord_ore` — ordering domain.
+/// `public.bigint_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct BigintOrdOre {
 }
 impl DomainType for BigintOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.bigint_ord_ore"
+        "public.bigint_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for BigintOrdOre {
         schema_for!(BigintOrdOre)
     }
 }
-/// `eql_v3.bigint_ord` — ordering domain.
+/// `public.bigint_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct BigintOrd {
 }
 impl DomainType for BigintOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.bigint_ord"
+        "public.bigint_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for BigintOrd {
         schema_for!(BigintOrd)
     }
 }
-/// `eql_v3.bigint_ord_ope` — ordering domain.
+/// `public.bigint_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct BigintOrdOpe {
 }
 impl DomainType for BigintOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.bigint_ord_ope"
+        "public.bigint_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/boolean.rs b/crates/eql-bindings/src/v3/boolean.rs
index fb290dbf7..f4a5faea3 100644
--- a/crates/eql-bindings/src/v3/boolean.rs
+++ b/crates/eql-bindings/src/v3/boolean.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.boolean` — storage-only domain.
+/// `public.boolean` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Boolean {
 }
 impl DomainType for Boolean {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.boolean"
+        "public.boolean"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs
index b84a68d40..44fbf427e 100644
--- a/crates/eql-bindings/src/v3/date.rs
+++ b/crates/eql-bindings/src/v3/date.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.date` — storage-only domain.
+/// `public.date` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Date {
 }
 impl DomainType for Date {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.date"
+        "public.date"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Date {
         schema_for!(Date)
     }
 }
-/// `eql_v3.date_eq` — equality domain.
+/// `public.date_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct DateEq {
 }
 impl DomainType for DateEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.date_eq"
+        "public.date_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for DateEq {
         schema_for!(DateEq)
     }
 }
-/// `eql_v3.date_ord_ore` — ordering domain.
+/// `public.date_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct DateOrdOre {
 }
 impl DomainType for DateOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.date_ord_ore"
+        "public.date_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for DateOrdOre {
         schema_for!(DateOrdOre)
     }
 }
-/// `eql_v3.date_ord` — ordering domain.
+/// `public.date_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct DateOrd {
 }
 impl DomainType for DateOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.date_ord"
+        "public.date_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for DateOrd {
         schema_for!(DateOrd)
     }
 }
-/// `eql_v3.date_ord_ope` — ordering domain.
+/// `public.date_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct DateOrdOpe {
 }
 impl DomainType for DateOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.date_ord_ope"
+        "public.date_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/domain_type.rs b/crates/eql-bindings/src/v3/domain_type.rs
index d411d4f24..351329bb8 100644
--- a/crates/eql-bindings/src/v3/domain_type.rs
+++ b/crates/eql-bindings/src/v3/domain_type.rs
@@ -9,8 +9,8 @@ use std::marker::PhantomData;
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::Deserialize;
 
-/// The PostgreSQL schema every domain in this module inhabits.
-pub const SQL_SCHEMA: &str = "eql_v3";
+/// The PostgreSQL schema every user-column domain in this module inhabits.
+pub const SQL_SCHEMA: &str = "public";
 
 /// Base URL for the canonical `$id` of every published v3 JSON Schema.
 /// The per-domain `$id` is `{SCHEMA_ID_BASE}{domain}.json` (see
@@ -26,7 +26,7 @@ pub const SCHEMA_ID_BASE: &str = "https://schemas.cipherstash.com/eql/v3/";
 /// published JSON Schema wire contract is pinned by `tests/catalog_parity.rs`.
 /// Public so FFI consumers can enumerate the protocol surface too.
 pub trait DomainType {
-    /// Fully-qualified SQL domain name, e.g. `"eql_v3.integer_eq"` — the
+    /// Fully-qualified SQL domain name, e.g. `"public.integer_eq"` — the
     /// per-type fact everything else derives from, defined once in each
     /// type's impl.
     ///
@@ -45,8 +45,8 @@ pub trait DomainType {
     /// `DomainFamily::domain_name`.
     fn domain(&self) -> &'static str {
         self.sql_domain()
-            .strip_prefix("eql_v3.")
-            .expect("sql_domain must be qualified with the eql_v3 schema")
+            .strip_prefix("public.")
+            .expect("sql_domain must be qualified with the public schema")
     }
 
     /// Canonical `$id` for this domain's published JSON Schema —
diff --git a/crates/eql-bindings/src/v3/double.rs b/crates/eql-bindings/src/v3/double.rs
index 083053b32..6bbc906e3 100644
--- a/crates/eql-bindings/src/v3/double.rs
+++ b/crates/eql-bindings/src/v3/double.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.double` — storage-only domain.
+/// `public.double` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Double {
 }
 impl DomainType for Double {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.double"
+        "public.double"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Double {
         schema_for!(Double)
     }
 }
-/// `eql_v3.double_eq` — equality domain.
+/// `public.double_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct DoubleEq {
 }
 impl DomainType for DoubleEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.double_eq"
+        "public.double_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for DoubleEq {
         schema_for!(DoubleEq)
     }
 }
-/// `eql_v3.double_ord_ore` — ordering domain.
+/// `public.double_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct DoubleOrdOre {
 }
 impl DomainType for DoubleOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.double_ord_ore"
+        "public.double_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for DoubleOrdOre {
         schema_for!(DoubleOrdOre)
     }
 }
-/// `eql_v3.double_ord` — ordering domain.
+/// `public.double_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct DoubleOrd {
 }
 impl DomainType for DoubleOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.double_ord"
+        "public.double_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for DoubleOrd {
         schema_for!(DoubleOrd)
     }
 }
-/// `eql_v3.double_ord_ope` — ordering domain.
+/// `public.double_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct DoubleOrdOpe {
 }
 impl DomainType for DoubleOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.double_ord_ope"
+        "public.double_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/integer.rs b/crates/eql-bindings/src/v3/integer.rs
index 90c45aae4..6e51ba526 100644
--- a/crates/eql-bindings/src/v3/integer.rs
+++ b/crates/eql-bindings/src/v3/integer.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.integer` — storage-only domain.
+/// `public.integer` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Integer {
 }
 impl DomainType for Integer {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.integer"
+        "public.integer"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Integer {
         schema_for!(Integer)
     }
 }
-/// `eql_v3.integer_eq` — equality domain.
+/// `public.integer_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct IntegerEq {
 }
 impl DomainType for IntegerEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.integer_eq"
+        "public.integer_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for IntegerEq {
         schema_for!(IntegerEq)
     }
 }
-/// `eql_v3.integer_ord_ore` — ordering domain.
+/// `public.integer_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct IntegerOrdOre {
 }
 impl DomainType for IntegerOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.integer_ord_ore"
+        "public.integer_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for IntegerOrdOre {
         schema_for!(IntegerOrdOre)
     }
 }
-/// `eql_v3.integer_ord` — ordering domain.
+/// `public.integer_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct IntegerOrd {
 }
 impl DomainType for IntegerOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.integer_ord"
+        "public.integer_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for IntegerOrd {
         schema_for!(IntegerOrd)
     }
 }
-/// `eql_v3.integer_ord_ope` — ordering domain.
+/// `public.integer_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct IntegerOrdOpe {
 }
 impl DomainType for IntegerOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.integer_ord_ope"
+        "public.integer_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/jsonb.rs b/crates/eql-bindings/src/v3/jsonb.rs
index 08112a3b5..7f22c4cab 100644
--- a/crates/eql-bindings/src/v3/jsonb.rs
+++ b/crates/eql-bindings/src/v3/jsonb.rs
@@ -71,7 +71,7 @@ impl JsonSchema for SteVecForm {
     }
 }
 
-/// `eql_v3.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
+/// `public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
 /// no root ciphertext). Strict. `k` is the `"sv"` form discriminator (see
 /// [`SteVecForm`]) — carried on the real wire, so the strict struct models it.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -84,7 +84,7 @@ pub struct SteVecDocument {
     pub sv: Vec,
 }
 
-/// `eql_v3.jsonb_entry` — one sv element (returned by `->`). Carries a selector
+/// `public.jsonb_entry` — one sv element (returned by `->`). Carries a selector
 /// `s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of
 /// `hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the
 /// root `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.
@@ -105,7 +105,7 @@ pub struct SteVecEntry {
     pub term: SteVecTerm,
 }
 
-/// `eql_v3.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.
+/// `public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
 #[ts(export, export_to = "v3/")]
 #[serde(deny_unknown_fields)]
@@ -155,6 +155,6 @@ macro_rules! ste_vec_domain_type {
     };
 }
 
-ste_vec_domain_type!(SteVecDocument, "eql_v3.json");
-ste_vec_domain_type!(SteVecEntry, "eql_v3.jsonb_entry");
-ste_vec_domain_type!(SteVecQuery, "eql_v3.jsonb_query");
+ste_vec_domain_type!(SteVecDocument, "public.json");
+ste_vec_domain_type!(SteVecEntry, "public.jsonb_entry");
+ste_vec_domain_type!(SteVecQuery, "public.jsonb_query");
diff --git a/crates/eql-bindings/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs
index c03a0c89f..cd02ccfdc 100644
--- a/crates/eql-bindings/src/v3/numeric.rs
+++ b/crates/eql-bindings/src/v3/numeric.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.numeric` — storage-only domain.
+/// `public.numeric` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Numeric {
 }
 impl DomainType for Numeric {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.numeric"
+        "public.numeric"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Numeric {
         schema_for!(Numeric)
     }
 }
-/// `eql_v3.numeric_eq` — equality domain.
+/// `public.numeric_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct NumericEq {
 }
 impl DomainType for NumericEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.numeric_eq"
+        "public.numeric_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for NumericEq {
         schema_for!(NumericEq)
     }
 }
-/// `eql_v3.numeric_ord_ore` — ordering domain.
+/// `public.numeric_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct NumericOrdOre {
 }
 impl DomainType for NumericOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.numeric_ord_ore"
+        "public.numeric_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for NumericOrdOre {
         schema_for!(NumericOrdOre)
     }
 }
-/// `eql_v3.numeric_ord` — ordering domain.
+/// `public.numeric_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct NumericOrd {
 }
 impl DomainType for NumericOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.numeric_ord"
+        "public.numeric_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for NumericOrd {
         schema_for!(NumericOrd)
     }
 }
-/// `eql_v3.numeric_ord_ope` — ordering domain.
+/// `public.numeric_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct NumericOrdOpe {
 }
 impl DomainType for NumericOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.numeric_ord_ope"
+        "public.numeric_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/payload.rs b/crates/eql-bindings/src/v3/payload.rs
index f71ff84a9..850404747 100644
--- a/crates/eql-bindings/src/v3/payload.rs
+++ b/crates/eql-bindings/src/v3/payload.rs
@@ -4,7 +4,7 @@ use super::domain_type::DomainType;
 use serde::{Deserialize, Serialize};
 /// Every stored-payload v3 domain in one type: one variant per flat
 /// scalar domain in `eql-domains::CATALOG` plus the SteVec document
-/// (`eql_v3.json`). Generated from the catalog, so it cannot drift
+/// (`public.json`). Generated from the catalog, so it cannot drift
 /// when the catalog grows.
 ///
 /// Serialization is exactly the inner struct's (`#[serde(untagged)]`
@@ -17,103 +17,103 @@ use serde::{Deserialize, Serialize};
 #[derive(Clone, Debug, PartialEq, Serialize)]
 #[serde(untagged)]
 pub enum DomainPayload {
-    /// The `eql_v3.integer` payload.
+    /// The `public.integer` payload.
     Integer(super::integer::Integer),
-    /// The `eql_v3.integer_eq` payload.
+    /// The `public.integer_eq` payload.
     IntegerEq(super::integer::IntegerEq),
-    /// The `eql_v3.integer_ord_ore` payload.
+    /// The `public.integer_ord_ore` payload.
     IntegerOrdOre(super::integer::IntegerOrdOre),
-    /// The `eql_v3.integer_ord` payload.
+    /// The `public.integer_ord` payload.
     IntegerOrd(super::integer::IntegerOrd),
-    /// The `eql_v3.integer_ord_ope` payload.
+    /// The `public.integer_ord_ope` payload.
     IntegerOrdOpe(super::integer::IntegerOrdOpe),
-    /// The `eql_v3.smallint` payload.
+    /// The `public.smallint` payload.
     Smallint(super::smallint::Smallint),
-    /// The `eql_v3.smallint_eq` payload.
+    /// The `public.smallint_eq` payload.
     SmallintEq(super::smallint::SmallintEq),
-    /// The `eql_v3.smallint_ord_ore` payload.
+    /// The `public.smallint_ord_ore` payload.
     SmallintOrdOre(super::smallint::SmallintOrdOre),
-    /// The `eql_v3.smallint_ord` payload.
+    /// The `public.smallint_ord` payload.
     SmallintOrd(super::smallint::SmallintOrd),
-    /// The `eql_v3.smallint_ord_ope` payload.
+    /// The `public.smallint_ord_ope` payload.
     SmallintOrdOpe(super::smallint::SmallintOrdOpe),
-    /// The `eql_v3.bigint` payload.
+    /// The `public.bigint` payload.
     Bigint(super::bigint::Bigint),
-    /// The `eql_v3.bigint_eq` payload.
+    /// The `public.bigint_eq` payload.
     BigintEq(super::bigint::BigintEq),
-    /// The `eql_v3.bigint_ord_ore` payload.
+    /// The `public.bigint_ord_ore` payload.
     BigintOrdOre(super::bigint::BigintOrdOre),
-    /// The `eql_v3.bigint_ord` payload.
+    /// The `public.bigint_ord` payload.
     BigintOrd(super::bigint::BigintOrd),
-    /// The `eql_v3.bigint_ord_ope` payload.
+    /// The `public.bigint_ord_ope` payload.
     BigintOrdOpe(super::bigint::BigintOrdOpe),
-    /// The `eql_v3.date` payload.
+    /// The `public.date` payload.
     Date(super::date::Date),
-    /// The `eql_v3.date_eq` payload.
+    /// The `public.date_eq` payload.
     DateEq(super::date::DateEq),
-    /// The `eql_v3.date_ord_ore` payload.
+    /// The `public.date_ord_ore` payload.
     DateOrdOre(super::date::DateOrdOre),
-    /// The `eql_v3.date_ord` payload.
+    /// The `public.date_ord` payload.
     DateOrd(super::date::DateOrd),
-    /// The `eql_v3.date_ord_ope` payload.
+    /// The `public.date_ord_ope` payload.
     DateOrdOpe(super::date::DateOrdOpe),
-    /// The `eql_v3.timestamp` payload.
+    /// The `public.timestamp` payload.
     Timestamp(super::timestamp::Timestamp),
-    /// The `eql_v3.timestamp_eq` payload.
+    /// The `public.timestamp_eq` payload.
     TimestampEq(super::timestamp::TimestampEq),
-    /// The `eql_v3.timestamp_ord_ore` payload.
+    /// The `public.timestamp_ord_ore` payload.
     TimestampOrdOre(super::timestamp::TimestampOrdOre),
-    /// The `eql_v3.timestamp_ord` payload.
+    /// The `public.timestamp_ord` payload.
     TimestampOrd(super::timestamp::TimestampOrd),
-    /// The `eql_v3.timestamp_ord_ope` payload.
+    /// The `public.timestamp_ord_ope` payload.
     TimestampOrdOpe(super::timestamp::TimestampOrdOpe),
-    /// The `eql_v3.numeric` payload.
+    /// The `public.numeric` payload.
     Numeric(super::numeric::Numeric),
-    /// The `eql_v3.numeric_eq` payload.
+    /// The `public.numeric_eq` payload.
     NumericEq(super::numeric::NumericEq),
-    /// The `eql_v3.numeric_ord_ore` payload.
+    /// The `public.numeric_ord_ore` payload.
     NumericOrdOre(super::numeric::NumericOrdOre),
-    /// The `eql_v3.numeric_ord` payload.
+    /// The `public.numeric_ord` payload.
     NumericOrd(super::numeric::NumericOrd),
-    /// The `eql_v3.numeric_ord_ope` payload.
+    /// The `public.numeric_ord_ope` payload.
     NumericOrdOpe(super::numeric::NumericOrdOpe),
-    /// The `eql_v3.text` payload.
+    /// The `public.text` payload.
     Text(super::text::Text),
-    /// The `eql_v3.text_eq` payload.
+    /// The `public.text_eq` payload.
     TextEq(super::text::TextEq),
-    /// The `eql_v3.text_match` payload.
+    /// The `public.text_match` payload.
     TextMatch(super::text::TextMatch),
-    /// The `eql_v3.text_ord_ore` payload.
+    /// The `public.text_ord_ore` payload.
     TextOrdOre(super::text::TextOrdOre),
-    /// The `eql_v3.text_ord` payload.
+    /// The `public.text_ord` payload.
     TextOrd(super::text::TextOrd),
-    /// The `eql_v3.text_ord_ope` payload.
+    /// The `public.text_ord_ope` payload.
     TextOrdOpe(super::text::TextOrdOpe),
-    /// The `eql_v3.text_search` payload.
+    /// The `public.text_search` payload.
     TextSearch(super::text::TextSearch),
-    /// The `eql_v3.boolean` payload.
+    /// The `public.boolean` payload.
     Boolean(super::boolean::Boolean),
-    /// The `eql_v3.real` payload.
+    /// The `public.real` payload.
     Real(super::real::Real),
-    /// The `eql_v3.real_eq` payload.
+    /// The `public.real_eq` payload.
     RealEq(super::real::RealEq),
-    /// The `eql_v3.real_ord_ore` payload.
+    /// The `public.real_ord_ore` payload.
     RealOrdOre(super::real::RealOrdOre),
-    /// The `eql_v3.real_ord` payload.
+    /// The `public.real_ord` payload.
     RealOrd(super::real::RealOrd),
-    /// The `eql_v3.real_ord_ope` payload.
+    /// The `public.real_ord_ope` payload.
     RealOrdOpe(super::real::RealOrdOpe),
-    /// The `eql_v3.double` payload.
+    /// The `public.double` payload.
     Double(super::double::Double),
-    /// The `eql_v3.double_eq` payload.
+    /// The `public.double_eq` payload.
     DoubleEq(super::double::DoubleEq),
-    /// The `eql_v3.double_ord_ore` payload.
+    /// The `public.double_ord_ore` payload.
     DoubleOrdOre(super::double::DoubleOrdOre),
-    /// The `eql_v3.double_ord` payload.
+    /// The `public.double_ord` payload.
     DoubleOrd(super::double::DoubleOrd),
-    /// The `eql_v3.double_ord_ope` payload.
+    /// The `public.double_ord_ope` payload.
     DoubleOrdOpe(super::double::DoubleOrdOpe),
-    /// The `eql_v3.json` payload.
+    /// The `public.json` payload.
     SteVecDocument(super::jsonb::SteVecDocument),
 }
 impl DomainPayload {
@@ -294,7 +294,7 @@ impl DomainPayload {
             Self::SteVecDocument(payload) => payload,
         }
     }
-    /// Fully-qualified SQL domain name, e.g. `"eql_v3.integer_eq"`.
+    /// Fully-qualified SQL domain name, e.g. `"public.integer_eq"`.
     pub fn sql_domain(&self) -> &'static str {
         self.as_domain_type().sql_domain()
     }
diff --git a/crates/eql-bindings/src/v3/query_payload.rs b/crates/eql-bindings/src/v3/query_payload.rs
index 6145baece..12224610b 100644
--- a/crates/eql-bindings/src/v3/query_payload.rs
+++ b/crates/eql-bindings/src/v3/query_payload.rs
@@ -26,7 +26,7 @@ use super::domain_type::DomainType;
 use super::jsonb::SteVecQuery;
 
 /// Every v3 query payload shape in one type. Today that is exactly one:
-/// the SteVec containment needle ([`SteVecQuery`], `eql_v3.jsonb_query`).
+/// the SteVec containment needle ([`SteVecQuery`], `public.jsonb_query`).
 ///
 /// Serialization is exactly the inner type's (`#[serde(untagged)]` adds no
 /// tagging), so typing a query payload never changes the wire. Deliberately
@@ -51,7 +51,7 @@ use super::jsonb::SteVecQuery;
 #[derive(Clone, Debug, PartialEq, Serialize)]
 #[serde(untagged)]
 pub enum QueryPayload {
-    /// The `eql_v3.jsonb_query` containment needle (`{sv: [{s, hm|oc}]}`).
+    /// The `public.jsonb_query` containment needle (`{sv: [{s, hm|oc}]}`).
     SteVec(SteVecQuery),
 }
 
@@ -81,7 +81,7 @@ impl QueryPayload {
         }
     }
 
-    /// Fully-qualified SQL domain name, e.g. `"eql_v3.jsonb_query"`.
+    /// Fully-qualified SQL domain name, e.g. `"public.jsonb_query"`.
     pub fn sql_domain(&self) -> &'static str {
         self.as_domain_type().sql_domain()
     }
diff --git a/crates/eql-bindings/src/v3/real.rs b/crates/eql-bindings/src/v3/real.rs
index 9532aa888..dfa119597 100644
--- a/crates/eql-bindings/src/v3/real.rs
+++ b/crates/eql-bindings/src/v3/real.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.real` — storage-only domain.
+/// `public.real` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Real {
 }
 impl DomainType for Real {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.real"
+        "public.real"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Real {
         schema_for!(Real)
     }
 }
-/// `eql_v3.real_eq` — equality domain.
+/// `public.real_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct RealEq {
 }
 impl DomainType for RealEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.real_eq"
+        "public.real_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for RealEq {
         schema_for!(RealEq)
     }
 }
-/// `eql_v3.real_ord_ore` — ordering domain.
+/// `public.real_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct RealOrdOre {
 }
 impl DomainType for RealOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.real_ord_ore"
+        "public.real_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for RealOrdOre {
         schema_for!(RealOrdOre)
     }
 }
-/// `eql_v3.real_ord` — ordering domain.
+/// `public.real_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct RealOrd {
 }
 impl DomainType for RealOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.real_ord"
+        "public.real_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for RealOrd {
         schema_for!(RealOrd)
     }
 }
-/// `eql_v3.real_ord_ope` — ordering domain.
+/// `public.real_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct RealOrdOpe {
 }
 impl DomainType for RealOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.real_ord_ope"
+        "public.real_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/smallint.rs b/crates/eql-bindings/src/v3/smallint.rs
index 11da66e43..25156d3c8 100644
--- a/crates/eql-bindings/src/v3/smallint.rs
+++ b/crates/eql-bindings/src/v3/smallint.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.smallint` — storage-only domain.
+/// `public.smallint` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Smallint {
 }
 impl DomainType for Smallint {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.smallint"
+        "public.smallint"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Smallint {
         schema_for!(Smallint)
     }
 }
-/// `eql_v3.smallint_eq` — equality domain.
+/// `public.smallint_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct SmallintEq {
 }
 impl DomainType for SmallintEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.smallint_eq"
+        "public.smallint_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for SmallintEq {
         schema_for!(SmallintEq)
     }
 }
-/// `eql_v3.smallint_ord_ore` — ordering domain.
+/// `public.smallint_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct SmallintOrdOre {
 }
 impl DomainType for SmallintOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.smallint_ord_ore"
+        "public.smallint_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for SmallintOrdOre {
         schema_for!(SmallintOrdOre)
     }
 }
-/// `eql_v3.smallint_ord` — ordering domain.
+/// `public.smallint_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct SmallintOrd {
 }
 impl DomainType for SmallintOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.smallint_ord"
+        "public.smallint_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for SmallintOrd {
         schema_for!(SmallintOrd)
     }
 }
-/// `eql_v3.smallint_ord_ope` — ordering domain.
+/// `public.smallint_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct SmallintOrdOpe {
 }
 impl DomainType for SmallintOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.smallint_ord_ope"
+        "public.smallint_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/terms.rs b/crates/eql-bindings/src/v3/terms.rs
index d8d9c05dc..057b13a10 100644
--- a/crates/eql-bindings/src/v3/terms.rs
+++ b/crates/eql-bindings/src/v3/terms.rs
@@ -37,7 +37,7 @@ pub struct Hmac256(pub String);
 pub struct OreCllw(pub String);
 
 /// A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an
-/// encrypted document (`eql_v3.json`); present on every entry and query element.
+/// encrypted document (`public.json`); present on every entry and query element.
 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, TS, JsonSchema)]
 #[ts(export, export_to = "v3/")]
 pub struct Selector(pub String);
diff --git a/crates/eql-bindings/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs
index f159917f5..ee56c7389 100644
--- a/crates/eql-bindings/src/v3/text.rs
+++ b/crates/eql-bindings/src/v3/text.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.text` — storage-only domain.
+/// `public.text` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Text {
 }
 impl DomainType for Text {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.text"
+        "public.text"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Text {
         schema_for!(Text)
     }
 }
-/// `eql_v3.text_eq` — equality domain.
+/// `public.text_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct TextEq {
 }
 impl DomainType for TextEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.text_eq"
+        "public.text_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for TextEq {
         schema_for!(TextEq)
     }
 }
-/// `eql_v3.text_match` — match domain.
+/// `public.text_match` — match domain.
 ///
 /// Operators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct TextMatch {
 }
 impl DomainType for TextMatch {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.text_match"
+        "public.text_match"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for TextMatch {
         schema_for!(TextMatch)
     }
 }
-/// `eql_v3.text_ord_ore` — ordering domain.
+/// `public.text_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -116,7 +116,7 @@ pub struct TextOrdOre {
 }
 impl DomainType for TextOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.text_ord_ore"
+        "public.text_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -134,7 +134,7 @@ impl DomainType for TextOrdOre {
         schema_for!(TextOrdOre)
     }
 }
-/// `eql_v3.text_ord` — ordering domain.
+/// `public.text_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -149,7 +149,7 @@ pub struct TextOrd {
 }
 impl DomainType for TextOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.text_ord"
+        "public.text_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -167,7 +167,7 @@ impl DomainType for TextOrd {
         schema_for!(TextOrd)
     }
 }
-/// `eql_v3.text_ord_ope` — ordering domain.
+/// `public.text_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -182,7 +182,7 @@ pub struct TextOrdOpe {
 }
 impl DomainType for TextOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.text_ord_ope"
+        "public.text_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -200,7 +200,7 @@ impl DomainType for TextOrdOpe {
         schema_for!(TextOrdOpe)
     }
 }
-/// `eql_v3.text_search` — search domain.
+/// `public.text_search` — search domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -216,7 +216,7 @@ pub struct TextSearch {
 }
 impl DomainType for TextSearch {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.text_search"
+        "public.text_search"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/timestamp.rs b/crates/eql-bindings/src/v3/timestamp.rs
index 3cf9d6269..f4d207157 100644
--- a/crates/eql-bindings/src/v3/timestamp.rs
+++ b/crates/eql-bindings/src/v3/timestamp.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `eql_v3.timestamp` — storage-only domain.
+/// `public.timestamp` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Timestamp {
 }
 impl DomainType for Timestamp {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.timestamp"
+        "public.timestamp"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Timestamp {
         schema_for!(Timestamp)
     }
 }
-/// `eql_v3.timestamp_eq` — equality domain.
+/// `public.timestamp_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct TimestampEq {
 }
 impl DomainType for TimestampEq {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.timestamp_eq"
+        "public.timestamp_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for TimestampEq {
         schema_for!(TimestampEq)
     }
 }
-/// `eql_v3.timestamp_ord_ore` — ordering domain.
+/// `public.timestamp_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct TimestampOrdOre {
 }
 impl DomainType for TimestampOrdOre {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.timestamp_ord_ore"
+        "public.timestamp_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for TimestampOrdOre {
         schema_for!(TimestampOrdOre)
     }
 }
-/// `eql_v3.timestamp_ord` — ordering domain.
+/// `public.timestamp_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct TimestampOrd {
 }
 impl DomainType for TimestampOrd {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.timestamp_ord"
+        "public.timestamp_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for TimestampOrd {
         schema_for!(TimestampOrd)
     }
 }
-/// `eql_v3.timestamp_ord_ope` — ordering domain.
+/// `public.timestamp_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct TimestampOrdOpe {
 }
 impl DomainType for TimestampOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "eql_v3.timestamp_ord_ope"
+        "public.timestamp_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/tests/catalog_parity.rs b/crates/eql-bindings/tests/catalog_parity.rs
index e71f8b0cb..17f4b4089 100644
--- a/crates/eql-bindings/tests/catalog_parity.rs
+++ b/crates/eql-bindings/tests/catalog_parity.rs
@@ -72,7 +72,7 @@ fn schema_required_keys_match_catalog_terms() {
 #[test]
 fn inventory_exactly_covers_catalog_in_order() {
     // `domain_name` is correct for every shape (including the jsonb family's
-    // one documented exception, the `eql_v3.json` document domain — see
+    // one documented exception, the `public.json` document domain — see
     // `Domain::full_name`), so no per-shape branch is needed here.
     let expected: Vec = CATALOG
         .iter()
@@ -259,12 +259,12 @@ fn schemas_are_strict() {
 ///
 /// KEEP IN SYNC with the canonical `SteVecPayload`
 /// (`eql-payload-v2.3.schema.json`) and `is_valid_ste_vec_{document,entry,query}_payload`:
-/// - `eql_v3.json`      requires `v` `k` `i` `sv`           (document; `k` = "sv"
+/// - `public.json`      requires `v` `k` `i` `sv`           (document; `k` = "sv"
 ///   form discriminator, required by the canonical SteVecPayload and carried on
 ///   every real payload — the SQL CHECK is laxer and only mandates `v`/`i`/`sv`,
 ///   but the binding models the real wire, which always carries `k`)
-/// - `eql_v3.jsonb_entry` requires `s` `c` + exactly one of `hm` XOR `oc`
-/// - `eql_v3.jsonb_query`  requires `sv`; each element `s` + `hm` XOR `oc`, no `c`
+/// - `public.jsonb_entry` requires `s` `c` + exactly one of `hm` XOR `oc`
+/// - `public.jsonb_query`  requires `sv`; each element `s` + `hm` XOR `oc`, no `c`
 #[test]
 fn jsonb_schema_required_keys_match_the_sql_check_contract() {
     let entries = v3::all();
@@ -293,7 +293,7 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() {
     assert_eq!(
         required(&doc, "/required", "json"),
         set(&["v", "k", "i", "sv"]),
-        "eql_v3.json required keys must match the SteVec document wire contract"
+        "public.json required keys must match the SteVec document wire contract"
     );
 
     // Entry: {s, c} + hm XOR oc. The XOR is expressed as an untagged `anyOf`
@@ -304,7 +304,7 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() {
     assert_eq!(
         required(&entry, "/required", "jsonb_entry"),
         set(&["s", "c"]),
-        "eql_v3.jsonb_entry base required keys must be s + c"
+        "public.jsonb_entry base required keys must be s + c"
     );
     let entry_alts = entry
         .pointer("/anyOf")
@@ -320,7 +320,7 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() {
         entry_alt_required.len() == 2
             && entry_alt_required.contains(&set(&["hm"]))
             && entry_alt_required.contains(&set(&["oc"])),
-        "eql_v3.jsonb_entry anyOf must offer exactly the hm-only and oc-only term \
+        "public.jsonb_entry anyOf must offer exactly the hm-only and oc-only term \
          alternatives (each arm a singleton), got {entry_alt_required:?}"
     );
 
@@ -330,7 +330,7 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() {
     assert_eq!(
         required(&query, "/required", "jsonb_query"),
         set(&["sv"]),
-        "eql_v3.jsonb_query required keys must be sv"
+        "public.jsonb_query required keys must be sv"
     );
     let elem_required = required(
         &query,
@@ -360,7 +360,7 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() {
         query_alt_required.len() == 2
             && query_alt_required.contains(&set(&["hm"]))
             && query_alt_required.contains(&set(&["oc"])),
-        "eql_v3.jsonb_query element anyOf must offer exactly the hm-only and \
+        "public.jsonb_query element anyOf must offer exactly the hm-only and \
          oc-only term alternatives (each arm a singleton), got {query_alt_required:?}"
     );
 }
diff --git a/crates/eql-bindings/tests/domain_payload.rs b/crates/eql-bindings/tests/domain_payload.rs
index 8a42c8822..b8363f08e 100644
--- a/crates/eql-bindings/tests/domain_payload.rs
+++ b/crates/eql-bindings/tests/domain_payload.rs
@@ -90,10 +90,10 @@ fn assert_serialization_pin(v2: &Value, t: TargetDomain) -> DomainPayload {
 fn typed_scalar_single_term_yields_the_matching_variant() {
     let typed = assert_serialization_pin(&v2_ct_full(), target("integer_eq"));
     assert_eq!(typed.domain(), "integer_eq");
-    assert_eq!(typed.sql_domain(), "eql_v3.integer_eq");
+    assert_eq!(typed.sql_domain(), "public.integer_eq");
     match &typed {
         DomainPayload::IntegerEq(p) => {
-            assert_eq!(p.sql_domain(), "eql_v3.integer_eq");
+            assert_eq!(p.sql_domain(), "public.integer_eq");
         }
         other => panic!("expected IntegerEq, got {other:?}"),
     }
@@ -126,7 +126,7 @@ fn typed_scalar_multi_term_yields_text_search() {
 fn typed_ste_vec_document_yields_ste_vec_document() {
     let typed = assert_serialization_pin(&v2_sv(), TargetDomain::Json);
     assert_eq!(typed.domain(), "json");
-    assert_eq!(typed.sql_domain(), "eql_v3.json");
+    assert_eq!(typed.sql_domain(), "public.json");
     match &typed {
         DomainPayload::SteVecDocument(doc) => {
             assert_eq!(doc.sv.len(), 2, "entry order/count preserved");
@@ -230,7 +230,7 @@ fn parse_constructs_every_stored_payload_domain() {
 fn parse_returns_none_for_unknown_domains() {
     for name in [
         "int5",
-        "eql_v3.integer_eq",
+        "public.integer_eq",
         "",
         "jsonb",
         "jsonb_entry",
@@ -269,6 +269,6 @@ fn parse_is_strict_exactly_like_the_binding_struct() {
 fn as_domain_type_exposes_the_inner_trait_object() {
     let typed = from_v2_typed(&v2_ct_full(), target("bigint_ord_ope")).unwrap();
     let dt: &dyn DomainType = typed.as_domain_type();
-    assert_eq!(dt.sql_domain(), "eql_v3.bigint_ord_ope");
+    assert_eq!(dt.sql_domain(), "public.bigint_ord_ope");
     assert_eq!(dt.domain(), "bigint_ord_ope");
 }
diff --git a/crates/eql-bindings/tests/from_v2.rs b/crates/eql-bindings/tests/from_v2.rs
index ccbb42af5..b5d2d3c16 100644
--- a/crates/eql-bindings/tests/from_v2.rs
+++ b/crates/eql-bindings/tests/from_v2.rs
@@ -93,7 +93,7 @@ fn parse_resolves_every_catalog_scalar_domain_and_json() {
 
 #[test]
 fn parse_rejects_unknown_domain_names() {
-    for name in ["int5", "text_like", "eql_v3.integer_eq", "", "jsonb"] {
+    for name in ["int5", "text_like", "public.integer_eq", "", "jsonb"] {
         let parsed = TargetDomain::parse(name);
         assert!(
             matches!(parsed, Err(FromV2Error::UnknownDomain { .. })),
diff --git a/crates/eql-bindings/tests/query_payload.rs b/crates/eql-bindings/tests/query_payload.rs
index 220da5769..fcc11d4dd 100644
--- a/crates/eql-bindings/tests/query_payload.rs
+++ b/crates/eql-bindings/tests/query_payload.rs
@@ -67,11 +67,11 @@ fn typed_needle_yields_the_ste_vec_variant() {
     });
     let typed = assert_serialization_pin(&v2);
     assert_eq!(typed.domain(), "jsonb_query");
-    assert_eq!(typed.sql_domain(), "eql_v3.jsonb_query");
+    assert_eq!(typed.sql_domain(), "public.jsonb_query");
     match &typed {
         QueryPayload::SteVec(q) => {
             assert_eq!(q.sv.len(), 2, "entry order/count preserved");
-            assert_eq!(q.sql_domain(), "eql_v3.jsonb_query");
+            assert_eq!(q.sql_domain(), "public.jsonb_query");
         }
     }
 }
@@ -196,7 +196,7 @@ fn parse_returns_none_for_non_query_domains() {
         "json",
         "jsonb_entry",
         "integer_eq",
-        "eql_v3.jsonb_query",
+        "public.jsonb_query",
         "",
     ] {
         assert!(
diff --git a/crates/eql-bindings/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs
index 785cb3669..3a60294aa 100644
--- a/crates/eql-bindings/tests/v3_conformance.rs
+++ b/crates/eql-bindings/tests/v3_conformance.rs
@@ -17,7 +17,7 @@ fn integer_storage_round_trips() {
     });
     let parsed: Integer = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(Integer::sql_domain_static(), "eql_v3.integer");
+    assert_eq!(Integer::sql_domain_static(), "public.integer");
 }
 
 #[test]
@@ -30,7 +30,7 @@ fn integer_eq_round_trips() {
     });
     let parsed: IntegerEq = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(IntegerEq::sql_domain_static(), "eql_v3.integer_eq");
+    assert_eq!(IntegerEq::sql_domain_static(), "public.integer_eq");
 }
 
 #[test]
@@ -46,7 +46,7 @@ fn integer_ord_round_trips() {
     // `_ord_ore` is the same shape under the scheme-explicit domain name.
     let parsed: IntegerOrdOre = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(IntegerOrdOre::sql_domain_static(), "eql_v3.integer_ord_ore");
+    assert_eq!(IntegerOrdOre::sql_domain_static(), "public.integer_ord_ore");
 }
 
 #[test]
@@ -61,7 +61,7 @@ fn integer_ord_ope_round_trips() {
     });
     let parsed: IntegerOrdOpe = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(IntegerOrdOpe::sql_domain_static(), "eql_v3.integer_ord_ope");
+    assert_eq!(IntegerOrdOpe::sql_domain_static(), "public.integer_ord_ope");
 }
 
 #[test]
@@ -234,54 +234,54 @@ fn non_integer_tokens_round_trip_every_domain() {
         }};
     }
 
-    round_trip!(Smallint, storage("a"), "eql_v3.smallint");
-    round_trip!(SmallintEq, eq("a"), "eql_v3.smallint_eq");
-    round_trip!(SmallintOrd, ord("a"), "eql_v3.smallint_ord");
-    round_trip!(SmallintOrdOre, ord("a"), "eql_v3.smallint_ord_ore");
-    round_trip!(SmallintOrdOpe, ope("a"), "eql_v3.smallint_ord_ope");
+    round_trip!(Smallint, storage("a"), "public.smallint");
+    round_trip!(SmallintEq, eq("a"), "public.smallint_eq");
+    round_trip!(SmallintOrd, ord("a"), "public.smallint_ord");
+    round_trip!(SmallintOrdOre, ord("a"), "public.smallint_ord_ore");
+    round_trip!(SmallintOrdOpe, ope("a"), "public.smallint_ord_ope");
 
-    round_trip!(Bigint, storage("a"), "eql_v3.bigint");
-    round_trip!(BigintEq, eq("a"), "eql_v3.bigint_eq");
-    round_trip!(BigintOrd, ord("a"), "eql_v3.bigint_ord");
-    round_trip!(BigintOrdOre, ord("a"), "eql_v3.bigint_ord_ore");
-    round_trip!(BigintOrdOpe, ope("a"), "eql_v3.bigint_ord_ope");
+    round_trip!(Bigint, storage("a"), "public.bigint");
+    round_trip!(BigintEq, eq("a"), "public.bigint_eq");
+    round_trip!(BigintOrd, ord("a"), "public.bigint_ord");
+    round_trip!(BigintOrdOre, ord("a"), "public.bigint_ord_ore");
+    round_trip!(BigintOrdOpe, ope("a"), "public.bigint_ord_ope");
 
-    round_trip!(Date, storage("a"), "eql_v3.date");
-    round_trip!(DateEq, eq("a"), "eql_v3.date_eq");
-    round_trip!(DateOrd, ord("a"), "eql_v3.date_ord");
-    round_trip!(DateOrdOre, ord("a"), "eql_v3.date_ord_ore");
-    round_trip!(DateOrdOpe, ope("a"), "eql_v3.date_ord_ope");
+    round_trip!(Date, storage("a"), "public.date");
+    round_trip!(DateEq, eq("a"), "public.date_eq");
+    round_trip!(DateOrd, ord("a"), "public.date_ord");
+    round_trip!(DateOrdOre, ord("a"), "public.date_ord_ore");
+    round_trip!(DateOrdOpe, ope("a"), "public.date_ord_ope");
 
     // numeric is the first scalar whose native ORE term exceeds 8 blocks (14);
     // the wire shape is identical, so the same `ord` builder applies.
-    round_trip!(Numeric, storage("a"), "eql_v3.numeric");
-    round_trip!(NumericEq, eq("a"), "eql_v3.numeric_eq");
-    round_trip!(NumericOrd, ord("a"), "eql_v3.numeric_ord");
-    round_trip!(NumericOrdOre, ord("a"), "eql_v3.numeric_ord_ore");
-    round_trip!(NumericOrdOpe, ope("a"), "eql_v3.numeric_ord_ope");
+    round_trip!(Numeric, storage("a"), "public.numeric");
+    round_trip!(NumericEq, eq("a"), "public.numeric_eq");
+    round_trip!(NumericOrd, ord("a"), "public.numeric_ord");
+    round_trip!(NumericOrdOre, ord("a"), "public.numeric_ord_ore");
+    round_trip!(NumericOrdOpe, ope("a"), "public.numeric_ord_ope");
 
     // real/double are the float scalars (renamed from float4/float8); they carry
     // the same ordered-token wire shape as the int scalars (`hm` eq, `ob` ord).
-    round_trip!(Real, storage("a"), "eql_v3.real");
-    round_trip!(RealEq, eq("a"), "eql_v3.real_eq");
-    round_trip!(RealOrd, ord("a"), "eql_v3.real_ord");
-    round_trip!(RealOrdOre, ord("a"), "eql_v3.real_ord_ore");
+    round_trip!(Real, storage("a"), "public.real");
+    round_trip!(RealEq, eq("a"), "public.real_eq");
+    round_trip!(RealOrd, ord("a"), "public.real_ord");
+    round_trip!(RealOrdOre, ord("a"), "public.real_ord_ore");
 
-    round_trip!(Double, storage("a"), "eql_v3.double");
-    round_trip!(DoubleEq, eq("a"), "eql_v3.double_eq");
-    round_trip!(DoubleOrd, ord("a"), "eql_v3.double_ord");
-    round_trip!(DoubleOrdOre, ord("a"), "eql_v3.double_ord_ore");
+    round_trip!(Double, storage("a"), "public.double");
+    round_trip!(DoubleEq, eq("a"), "public.double_eq");
+    round_trip!(DoubleOrd, ord("a"), "public.double_ord");
+    round_trip!(DoubleOrdOre, ord("a"), "public.double_ord_ore");
 
     // boolean is storage-only (no eq/ord term) — just the shared envelope.
-    round_trip!(Boolean, storage("a"), "eql_v3.boolean");
+    round_trip!(Boolean, storage("a"), "public.boolean");
 
     // text_match is covered by `text_match_round_trips_signed_bloom_filter`.
-    round_trip!(Text, storage("a"), "eql_v3.text");
-    round_trip!(TextEq, eq("a"), "eql_v3.text_eq");
-    round_trip!(TextOrd, text_ord("a"), "eql_v3.text_ord");
-    round_trip!(TextOrdOre, text_ord("a"), "eql_v3.text_ord_ore");
-    round_trip!(TextOrdOpe, text_ope("a"), "eql_v3.text_ord_ope");
-    round_trip!(TextSearch, text_search("a"), "eql_v3.text_search");
+    round_trip!(Text, storage("a"), "public.text");
+    round_trip!(TextEq, eq("a"), "public.text_eq");
+    round_trip!(TextOrd, text_ord("a"), "public.text_ord");
+    round_trip!(TextOrdOre, text_ord("a"), "public.text_ord_ore");
+    round_trip!(TextOrdOpe, text_ope("a"), "public.text_ord_ope");
+    round_trip!(TextSearch, text_search("a"), "public.text_search");
 }
 
 #[test]
@@ -304,7 +304,7 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     });
     let parsed: Timestamp = serde_json::from_value(storage.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), storage);
-    assert_eq!(Timestamp::sql_domain_static(), "eql_v3.timestamp");
+    assert_eq!(Timestamp::sql_domain_static(), "public.timestamp");
 
     // Equality: envelope + hm.
     let with_hm = json!({
@@ -315,7 +315,7 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     });
     let parsed: TimestampEq = serde_json::from_value(with_hm.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_hm);
-    assert_eq!(TimestampEq::sql_domain_static(), "eql_v3.timestamp_eq");
+    assert_eq!(TimestampEq::sql_domain_static(), "public.timestamp_eq");
 
     // Ordered: envelope + ob (a 12-block array on the wire; shape is the same).
     let with_ob = json!({
@@ -326,12 +326,12 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     });
     let parsed: TimestampOrd = serde_json::from_value(with_ob.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_ob);
-    assert_eq!(TimestampOrd::sql_domain_static(), "eql_v3.timestamp_ord");
+    assert_eq!(TimestampOrd::sql_domain_static(), "public.timestamp_ord");
     let parsed: TimestampOrdOre = serde_json::from_value(with_ob.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_ob);
     assert_eq!(
         TimestampOrdOre::sql_domain_static(),
-        "eql_v3.timestamp_ord_ore"
+        "public.timestamp_ord_ore"
     );
 
     // OPE ordered: envelope + op (a single CLLW-OPE hex string).
@@ -345,7 +345,7 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_op);
     assert_eq!(
         TimestampOrdOpe::sql_domain_static(),
-        "eql_v3.timestamp_ord_ope"
+        "public.timestamp_ord_ope"
     );
 
     // The searchable domains cannot let their term silently become optional.
@@ -386,7 +386,7 @@ fn stevec_document_round_trips_and_enforces_envelope() {
     });
     let parsed: SteVecDocument = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(SteVecDocument::sql_domain_static(), "eql_v3.json");
+    assert_eq!(SteVecDocument::sql_domain_static(), "public.json");
 
     // Envelope negatives (parity with the scalar integer tests) — now including `k`.
     for missing in ["v", "k", "i", "sv"] {
@@ -472,7 +472,7 @@ fn stevec_query_round_trips() {
     let wire = json!({ "sv": [ { "s": "sel", "hm": "deadbeef" } ] });
     let parsed: SteVecQuery = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(SteVecQuery::sql_domain_static(), "eql_v3.jsonb_query");
+    assert_eq!(SteVecQuery::sql_domain_static(), "public.jsonb_query");
     // Unknown top-level key rejected (SteVecQuery has no flatten field).
     assert!(serde_json::from_value::(json!({ "sv": [], "bogus": 1 })).is_err());
     // NOTE: a query ELEMENT carrying `c` is NOT rejected here — SteVecQueryEntry
@@ -515,8 +515,8 @@ fn stevec_document_and_query_schemas_are_strict() {
     let sq = serde_json::to_value(q.schema()).unwrap();
     assert_eq!(sq.pointer("/additionalProperties"), Some(&json!(false)));
     // SteVecDocument/Query domain names.
-    assert_eq!(SteVecDocument::sql_domain_static(), "eql_v3.json");
-    assert_eq!(SteVecQuery::sql_domain_static(), "eql_v3.jsonb_query");
+    assert_eq!(SteVecDocument::sql_domain_static(), "public.json");
+    assert_eq!(SteVecQuery::sql_domain_static(), "public.jsonb_query");
 }
 
 #[test]
diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs
index f269fe815..15bb93698 100644
--- a/crates/eql-codegen/src/bindings.rs
+++ b/crates/eql-codegen/src/bindings.rs
@@ -84,7 +84,7 @@ fn capability_label(domain_name: &str) -> &'static str {
 }
 
 /// Render the catalog-derived struct doc lines for a domain: a summary line
-/// (`` `eql_v3.` — 
__key` per PostgreSQL's auto-naming. let err = sqlx::query(&format!( - "INSERT INTO v3_unique (id, val) VALUES (3, {p42}::jsonb::eql_v3.integer_eq)" + "INSERT INTO v3_unique (id, val) VALUES (3, {p42}::jsonb::public.integer_eq)" )) .execute(&pool) .await @@ -157,7 +157,7 @@ async fn unique_on_integer_eq_column_constrains_raw_payload(pool: PgPool) -> any } // =========================================================================== -// FOREIGN KEY — child referencing a parent `eql_v3.integer` PRIMARY KEY column. +// FOREIGN KEY — child referencing a parent `public.integer` PRIMARY KEY column. // // FK on a jsonb-backed domain IS feasible: a PRIMARY KEY / UNIQUE on the parent // column resolves against the base type (`jsonb`) btree opclass (jsonb has a @@ -167,7 +167,7 @@ async fn unique_on_integer_eq_column_constrains_raw_payload(pool: PgPool) -> any // PK/UNIQUE uses the inherited jsonb btree opclass and works. // =========================================================================== -/// A FOREIGN KEY from a child `eql_v3.integer` column to a parent `eql_v3.integer` +/// A FOREIGN KEY from a child `public.integer` column to a parent `public.integer` /// PRIMARY KEY column: a matching (byte-identical) reference is accepted, a /// dangling reference is rejected (23503). /// @@ -184,8 +184,8 @@ async fn unique_on_integer_eq_column_constrains_raw_payload(pool: PgPool) -> any /// integrity. #[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_integer")))] async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<()> { - // Parent with a PRIMARY KEY on an eql_v3.integer (jsonb-backed domain) column. - sqlx::query("CREATE TABLE v3_parent (ref eql_v3.integer PRIMARY KEY)") + // Parent with a PRIMARY KEY on an public.integer (jsonb-backed domain) column. + sqlx::query("CREATE TABLE v3_parent (ref public.integer PRIMARY KEY)") .execute(&pool) .await?; @@ -193,7 +193,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( sqlx::query( "CREATE TABLE v3_child ( id bigint PRIMARY KEY, - parent_ref eql_v3.integer REFERENCES v3_parent(ref) + parent_ref public.integer REFERENCES v3_parent(ref) )", ) .execute(&pool) @@ -215,7 +215,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( // Seed the parent with the 42-payload. sqlx::query(&format!( - "INSERT INTO v3_parent (ref) VALUES ({p42}::jsonb::eql_v3.integer)" + "INSERT INTO v3_parent (ref) VALUES ({p42}::jsonb::public.integer)" )) .execute(&pool) .await?; @@ -223,7 +223,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( // Child row with a byte-identical reference resolves (deterministic fixture // bytes), so the FK is satisfied. sqlx::query(&format!( - "INSERT INTO v3_child (id, parent_ref) VALUES (1, {p42}::jsonb::eql_v3.integer)" + "INSERT INTO v3_child (id, parent_ref) VALUES (1, {p42}::jsonb::public.integer)" )) .execute(&pool) .await?; @@ -236,7 +236,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( // Child row referencing a payload NOT present in the parent (different // plaintext → different jsonb) violates the FK (23503). let err = sqlx::query(&format!( - "INSERT INTO v3_child (id, parent_ref) VALUES (2, {p100}::jsonb::eql_v3.integer)" + "INSERT INTO v3_child (id, parent_ref) VALUES (2, {p100}::jsonb::public.integer)" )) .execute(&pool) .await diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 142c3a98e..9eda3f1ad 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -10,7 +10,7 @@ //! on the *identity predicate*: a `LANGUAGE sql`, `IMMUTABLE` function //! taking at least one argument typed as a jsonb-backed DOMAIN of the //! encrypted-domain families — a domain in the `eql_v3` schema (e.g. -//! `eql_v3.integer_eq`). The identity +//! `public.integer_eq`). The identity //! predicate is proconfig-independent — it describes what a function //! intrinsically IS, not whether it has been pinned. //! diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs index 0c18c6275..85767afbf 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs @@ -1,8 +1,8 @@ //! Equivalence guards for the inline SteVec domain CHECK expressions //! (issue #354). //! -//! `eql_v3.jsonb_entry` carries an INLINE CHECK expression rather than -//! calling `eql_v3_internal.is_valid_ste_vec_entry_payload`: domain +//! `public.jsonb_entry` carries an INLINE CHECK expression rather than +//! calling `public.eql_v3_is_valid_ste_vec_entry_payload`: domain //! constraints cannot inline SQL functions, so the function-call form paid //! the per-call SQL-function executor on every cast — the needle cast in //! every field_eq query, the ENTIRE measured +19% v2→v3 regression on that @@ -12,7 +12,7 @@ //! divergence is SQL NULL, which both forms accept (the validator via //! STRICT, the inline expression via a leading `VALUE IS NULL OR`). //! -//! `eql_v3.jsonb_query`'s CHECK CANNOT be inlined — validating sv elements +//! `public.jsonb_query`'s CHECK CANNOT be inlined — validating sv elements //! needs a subquery, which CHECK constraints forbid — so its validator is //! plpgsql instead (cached plan vs the per-call SQL-function executor; the //! issue #353 finding). `jsonb_query_check_behaviour` characterises the @@ -44,7 +44,7 @@ async fn validator_accepts(pool: &PgPool, validator: &str, payload: Option<&str> if payload.is_none() { return Ok(true); } - let sql = format!("SELECT eql_v3_internal.{validator}($1::jsonb)"); + let sql = format!("SELECT public.{validator}($1::jsonb)"); Ok(sqlx::query_scalar::<_, bool>(&sql) .bind(payload) .fetch_one(pool) @@ -94,8 +94,8 @@ async fn jsonb_entry_check_matches_validator(pool: PgPool) -> Result<()> { ]; assert_equivalent( &pool, - "eql_v3.jsonb_entry", - "is_valid_ste_vec_entry_payload", + "public.jsonb_entry", + "eql_v3_is_valid_ste_vec_entry_payload", candidates, ) .await @@ -128,10 +128,10 @@ async fn jsonb_query_check_behaviour(pool: PgPool) -> Result<()> { (Some("[]"), false), ]; for (payload, expected) in candidates { - let cast = cast_accepts(&pool, "eql_v3.jsonb_query", *payload).await?; + let cast = cast_accepts(&pool, "public.jsonb_query", *payload).await?; anyhow::ensure!( cast == *expected, - "eql_v3.jsonb_query cast verdict changed for {payload:?}: \ + "public.jsonb_query cast verdict changed for {payload:?}: \ accepted = {cast}, expected = {expected}" ); } @@ -147,14 +147,14 @@ async fn jsonb_query_validator_is_plpgsql(pool: PgPool) -> Result<()> { let lang: String = sqlx::query_scalar( "SELECT l.lanname FROM pg_proc p \ JOIN pg_language l ON l.oid = p.prolang \ - WHERE p.proname = 'is_valid_ste_vec_query_payload' \ - AND p.pronamespace = 'eql_v3_internal'::regnamespace", + WHERE p.proname = 'eql_v3_is_valid_ste_vec_query_payload' \ + AND p.pronamespace = 'public'::regnamespace", ) .fetch_one(&pool) .await?; anyhow::ensure!( lang == "plpgsql", - "is_valid_ste_vec_query_payload must be plpgsql (got {lang})" + "eql_v3_is_valid_ste_vec_query_payload must be plpgsql (got {lang})" ); Ok(()) } diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index 5f928f3d2..2212787c9 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -1,6 +1,6 @@ //! Structural guard for the blocked native-jsonb operator enumeration. //! -//! The storage-only domains (`eql_v3.integer`, future scalars) promise that +//! The storage-only domains (`public.integer`, future scalars) promise that //! *every* native jsonb operator is blocked, so an encrypted column can never //! fall through to plaintext-jsonb semantics. That promise rests on the //! enumerated operator surface in `crates/eql-codegen/src/operator_surface.rs` diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index b539358ca..9fb36d9f2 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -36,23 +36,23 @@ async fn mutate(pool: &PgPool, ddl: &str) -> Result<()> { // catch a blocker that silently stopped raising. #[sqlx::test] async fn disabling_storage_eq_blocker_flips_blocker_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::eql_v3.integer = $2::jsonb::eql_v3.integer"; + let sql = "SELECT $1::jsonb::public.integer = $2::jsonb::public.integer"; // Baseline: the storage `=` blocker raises. assert_raises( &pool, sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("eql_v3.integer", "="), + &blocker_msg("public.integer", "="), ) .await?; // Mutation: replace the plpgsql blocker with an inlinable SQL body that // returns true. CREATE OR REPLACE keeps the oid, so the `=` operator on - // (eql_v3.integer, eql_v3.integer) now resolves to this no-raise body. + // (public.integer, public.integer) now resolves to this no-raise body. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3_internal.eq(a eql_v3.integer, b eql_v3.integer) \ + "CREATE OR REPLACE FUNCTION eql_v3_internal.eq(a public.integer, b public.integer) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -96,14 +96,14 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( // Baseline: `=` on (ord, ord) declares a RESTRICT estimator. ensure!( restrict_present(&pool).await?, - "baseline: `=` on eql_v3.integer_ord must declare a RESTRICT estimator" + "baseline: `=` on public.integer_ord must declare a RESTRICT estimator" ); // Mutation: unset RESTRICT. DROP OPERATOR would hit COMMUTATOR/NEGATOR // dependency links; ALTER ... SET (RESTRICT = NONE) avoids that. mutate( &pool, - "ALTER OPERATOR = (eql_v3.integer_ord, eql_v3.integer_ord) SET (RESTRICT = NONE)", + "ALTER OPERATOR = (public.integer_ord, public.integer_ord) SET (RESTRICT = NONE)", ) .await?; @@ -130,7 +130,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul .await?; let count_sql = "SELECT count(*) FROM fixtures.eql_v3_integer \ - WHERE (payload - 'hm')::eql_v3.integer_ord = $1::jsonb::eql_v3.integer_ord"; + WHERE (payload - 'hm')::public.integer_ord = $1::jsonb::public.integer_ord"; // Baseline: with `hm` stripped, `=` still matches the pivot via `ord_term` // (the `ob` term survives) — exactly one row. @@ -148,7 +148,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // nothing. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.integer_ord, b eql_v3.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.integer_ord, b public.integer_ord) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) = eql_v3_internal.hmac_256(b::jsonb) $$", ) @@ -171,7 +171,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // the `supported_null` arm has teeth. #[sqlx::test] async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::eql_v3.integer_eq = $2::jsonb::eql_v3.integer_eq"; + let sql = "SELECT $1::jsonb::public.integer_eq = $2::jsonb::public.integer_eq"; // Baseline: STRICT `=` propagates NULL when one side is NULL. assert_null(&pool, sql, &[Some(PLACEHOLDER_PAYLOAD), None]).await?; @@ -180,7 +180,7 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // keeps the oid; the operator now ignores NULL semantics. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.integer_eq, b eql_v3.integer_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -205,9 +205,9 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // sort key. Blocking `<` alone must not disturb ORDER BY. #[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { - let lt_sql = "SELECT $1::jsonb::eql_v3.integer_ord < $2::jsonb::eql_v3.integer_ord"; + let lt_sql = "SELECT $1::jsonb::public.integer_ord < $2::jsonb::public.integer_ord"; let order_by_sql = "SELECT plaintext FROM fixtures.eql_v3_integer \ - ORDER BY eql_v3.ord_term(payload::eql_v3.integer_ord) ASC"; + ORDER BY eql_v3.ord_term(payload::public.integer_ord) ASC"; let mut ascending: Vec = ::fixture_values().to_vec(); ascending.sort(); @@ -219,8 +219,8 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // post-mutation `assert_raises` below, where the `lt` blocker raises before // the comparator ever inspects the term. let lt_baseline: Option = sqlx::query_scalar( - "SELECT (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $1)::eql_v3.integer_ord \ - < (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $2)::eql_v3.integer_ord", + "SELECT (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $1)::public.integer_ord \ + < (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $2)::public.integer_ord", ) .bind(ascending[0]) .bind(ascending[1]) @@ -240,9 +240,9 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // LANGUAGE plpgsql and non-STRICT so the RAISE always fires. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.lt(a eql_v3.integer_ord, b eql_v3.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.lt(a public.integer_ord, b public.integer_ord) \ RETURNS boolean LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE \ - AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.integer_ord', '<'); END; $$", + AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.integer_ord', '<'); END; $$", ) .await?; @@ -251,7 +251,7 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { &pool, lt_sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("eql_v3.integer_ord", "<"), + &blocker_msg("public.integer_ord", "<"), ) .await?; @@ -291,7 +291,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { .await?; let count_sql = "SELECT count(*) FROM fixtures.eql_v3_integer \ - WHERE (payload - 'ob')::eql_v3.integer_eq = $1::jsonb::eql_v3.integer_eq"; + WHERE (payload - 'ob')::public.integer_eq = $1::jsonb::public.integer_eq"; // Baseline: with `ob` stripped, `=` still matches the pivot via `eq_term` // (the `hm` term survives) — exactly one row. @@ -308,7 +308,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // `eql_v3_internal.ore_block_256(jsonb)` raises rather than matching. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a eql_v3.integer_eq, b eql_v3.integer_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) = eql_v3_internal.ore_block_256(b::jsonb) $$", ) @@ -342,7 +342,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { #[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { let order_by_desc = "SELECT plaintext FROM fixtures.eql_v3_integer \ - ORDER BY eql_v3.ord_term(payload::eql_v3.integer_ord) DESC"; + ORDER BY eql_v3.ord_term(payload::public.integer_ord) DESC"; let mut descending: Vec = ::fixture_values().to_vec(); descending.sort(); @@ -361,7 +361,7 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { // function body. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a public.integer_ord) \ RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $mutbody$ SELECT eql_v3_internal.ore_block_256('{esc}'::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), @@ -392,9 +392,9 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re const NULL_ROWS: usize = 3; let order_by = format!( "SELECT plaintext FROM ( \ - SELECT plaintext, payload::eql_v3.integer_ord AS value FROM fixtures.eql_v3_integer \ + SELECT plaintext, payload::public.integer_ord AS value FROM fixtures.eql_v3_integer \ UNION ALL \ - SELECT NULL::integer, NULL::eql_v3.integer_ord FROM generate_series(1, {NULL_ROWS}) \ + SELECT NULL::integer, NULL::public.integer_ord FROM generate_series(1, {NULL_ROWS}) \ ) s \ ORDER BY eql_v3.ord_term(value) ASC NULLS LAST" ); @@ -416,10 +416,10 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re // unchanged. Unique dollar-quote tag guards the embedded jsonb literal. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a eql_v3.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a public.integer_ord) \ RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ AS $mutbody$ SELECT eql_v3_internal.ore_block_256(\ - coalesce(a, '{esc}'::jsonb::eql_v3.integer_ord)::jsonb) $mutbody$", + coalesce(a, '{esc}'::jsonb::public.integer_ord)::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); mutate(&pool, &ddl).await?; diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index 9316b6255..cb888746a 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -13,7 +13,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { // ordered domains are `[Ore]`-only — ORE is lossless for integers, so `=` // routes through `ord_term`, unlike text where `=` routes through `eq_term`. let storage = ScalarDomainSpec::new::(Variant::Storage); - assert_eq!(storage.sql_domain, "eql_v3.integer"); + assert_eq!(storage.sql_domain, "public.integer"); assert!(!storage.supports_eq()); assert!(!storage.supports_ord()); assert_eq!(storage.primary_extractor(), None); @@ -23,7 +23,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { ); let eq = ScalarDomainSpec::new::(Variant::Eq); - assert_eq!(eq.sql_domain, "eql_v3.integer_eq"); + assert_eq!(eq.sql_domain, "public.integer_eq"); assert!(eq.supports_eq()); assert!(!eq.supports_ord()); assert_eq!(eq.primary_extractor().as_deref(), Some("eql_v3.eq_term")); @@ -34,7 +34,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { ); let ord = ScalarDomainSpec::new::(Variant::Ord); - assert_eq!(ord.sql_domain, "eql_v3.integer_ord"); + assert_eq!(ord.sql_domain, "public.integer_ord"); assert!(ord.supports_ord()); assert_eq!(ord.primary_extractor().as_deref(), Some("eql_v3.ord_term")); // integer_ord is `[Ore]`-only: equality routes through ORE (lossless for ints). @@ -52,7 +52,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { ); let ord_ore = ScalarDomainSpec::new::(Variant::OrdOre); - assert_eq!(ord_ore.sql_domain, "eql_v3.integer_ord_ore"); + assert_eq!(ord_ore.sql_domain, "public.integer_ord_ore"); assert!(ord_ore.supports_ord()); assert_eq!( ord_ore.primary_extractor().as_deref(), @@ -139,7 +139,7 @@ async fn placeholder_payload_casts_to_every_declared_domain(pool: PgPool) -> Res #[sqlx::test] async fn no_cross_variant_operator_is_declared(pool: PgPool) -> Result<()> { // The SCALAR family deliberately does NOT define ANY operator that mixes - // two different capability variants — e.g. `eql_v3.integer_eq = eql_v3.integer_ord` + // two different capability variants — e.g. `public.integer_eq = public.integer_ord` // would resolve against jsonb (the ultimate base type) and silently // bypass the per-variant blockers. The query below has no `oprname` // filter, so it catches a cross-variant operator of any kind, not just diff --git a/tests/sqlx/tests/encrypted_domain/float_special.rs b/tests/sqlx/tests/encrypted_domain/float_special.rs index 391c11e75..2e70d2f62 100644 --- a/tests/sqlx/tests/encrypted_domain/float_special.rs +++ b/tests/sqlx/tests/encrypted_domain/float_special.rs @@ -41,22 +41,22 @@ async fn encrypt_specials(values: &[F8]) -> Result> { Ok(payloads.into_iter().map(|p| p.to_string()).collect()) } -/// Cast a payload literal to `eql_v3.double` and read it back, proving the domain +/// Cast a payload literal to `public.double` and read it back, proving the domain /// CHECK accepts the encrypted special value. async fn cast_passes_check(pool: &PgPool, payload: &str) -> Result<()> { - let sql = "SELECT ($1::jsonb::eql_v3.double) IS NOT NULL"; + let sql = "SELECT ($1::jsonb::public.double) IS NOT NULL"; let ok: bool = sqlx::query_scalar(sql) .bind(payload) .fetch_one(pool) .await?; - anyhow::ensure!(ok, "payload failed the eql_v3.double CHECK: {payload}"); + anyhow::ensure!(ok, "payload failed the public.double CHECK: {payload}"); Ok(()) } /// Compare two payloads under an operator on the `_ord` domain, returning the /// boolean result. Used to pin the discovered NaN/±0/±Inf outcomes. async fn ord_cmp(pool: &PgPool, a: &str, op: &str, b: &str) -> Result { - let d = "eql_v3.double_ord"; + let d = "public.double_ord"; let sql = format!("SELECT ($1::jsonb::{d} {op} $2::jsonb::{d})"); Ok(sqlx::query_scalar(&sql) .bind(a) @@ -67,7 +67,7 @@ async fn ord_cmp(pool: &PgPool, a: &str, op: &str, b: &str) -> Result { /// Equality under the `_eq` domain (HMAC). async fn eq_cmp(pool: &PgPool, a: &str, b: &str) -> Result { - let d = "eql_v3.double_eq"; + let d = "public.double_eq"; let sql = format!("SELECT ($1::jsonb::{d} = $2::jsonb::{d})"); Ok(sqlx::query_scalar(&sql) .bind(a) @@ -85,7 +85,7 @@ async fn setup() -> Result { #[tokio::test] async fn nan_encrypts_and_passes_check() -> Result<()> { // Encrypting f64::NAN succeeds (no panic) and yields a structurally valid - // eql_v3.double payload. This is the one universal NaN guarantee. + // public.double payload. This is the one universal NaN guarantee. let pool = setup().await?; let payloads = encrypt_specials(&[F8(f64::NAN)]).await?; assert_eq!(payloads.len(), 1); diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index 4c924e0f5..c36906190 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -63,8 +63,8 @@ async fn jsonb_entry_integer_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result // (the ordered term the matrix's ore_cllw paths require). let invalid: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(*) FROM fixtures.v3_doc_integer \ - WHERE NOT eql_v3_internal.is_valid_ste_vec_entry_payload((payload -> '{SELECTOR}'::text)::jsonb) \ - OR NOT eql_v3.has_ore_cllw((payload -> '{SELECTOR}'::text)::eql_v3.jsonb_entry)", + WHERE NOT public.eql_v3_is_valid_ste_vec_entry_payload((payload -> '{SELECTOR}'::text)::jsonb) \ + OR NOT eql_v3.has_ore_cllw((payload -> '{SELECTOR}'::text)::public.jsonb_entry)", )) .fetch_one(&pool) .await?; @@ -104,8 +104,8 @@ async fn jsonb_entry_integer_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result #[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_integer")))] async fn jsonb_entry_integer_selector_matches_fixture(pool: sqlx::PgPool) -> anyhow::Result<()> { // The `$.field` ORE-CLLW entry is the sv element carrying `oc`. Cast the - // `eql_v3.json` payload to bare jsonb FIRST so `-> 'sv'` is the native array - // accessor, not the custom `eql_v3.json -> text` selector-lookup operator. + // `public.json` payload to bare jsonb FIRST so `-> 'sv'` is the native array + // accessor, not the custom `public.json -> text` selector-lookup operator. let live: Vec = sqlx::query_scalar( "SELECT DISTINCT elem ->> 's' \ FROM fixtures.v3_doc_integer, \ @@ -144,8 +144,8 @@ async fn jsonb_entry_integer_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow: FROM fixtures.v3_doc_integer a \ JOIN fixtures.v3_doc_integer b ON a.id < b.id \ WHERE a.plaintext <> b.plaintext \ - AND eql_v3.ore_cllw((a.payload -> '{SELECTOR}'::text)::eql_v3.jsonb_entry) \ - = eql_v3.ore_cllw((b.payload -> '{SELECTOR}'::text)::eql_v3.jsonb_entry)", + AND eql_v3.ore_cllw((a.payload -> '{SELECTOR}'::text)::public.jsonb_entry) \ + = eql_v3.ore_cllw((b.payload -> '{SELECTOR}'::text)::public.jsonb_entry)", )) .fetch_one(&pool) .await?; @@ -161,7 +161,7 @@ async fn jsonb_entry_integer_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow: // driver, which sweeps a bare-jsonb RHS that flattens to native `jsonb < jsonb` // for entries). Builds the ore_cllw functional btree and asserts each ORDERING // op (which inlines to `ore_cllw(value) ore_cllw(const)`) engages it, using -// the domain-cast RHS (`''::eql_v3.jsonb_entry`) so the entry operator +// the domain-cast RHS (`''::public.jsonb_entry`) so the entry operator // resolves rather than native jsonb. // // VALIDITY ONLY: forces `enable_seqscan = off` on the ~17-row fixture, so a @@ -179,12 +179,12 @@ async fn jsonb_entry_integer_index_engages(pool: sqlx::PgPool) -> anyhow::Result let lit = payload.replace('\'', "''"); let mut tx = pool.begin().await?; - sqlx::query("CREATE TEMP TABLE entry_idx (value eql_v3.jsonb_entry) ON COMMIT DROP") + sqlx::query("CREATE TEMP TABLE entry_idx (value public.jsonb_entry) ON COMMIT DROP") .execute(&mut *tx) .await?; sqlx::query(&format!( "INSERT INTO entry_idx(value) \ - SELECT (payload -> '{sel}'::text)::eql_v3.jsonb_entry FROM fixtures.v3_doc_integer", + SELECT (payload -> '{sel}'::text)::public.jsonb_entry FROM fixtures.v3_doc_integer", )) .execute(&mut *tx) .await?; @@ -198,7 +198,7 @@ async fn jsonb_entry_integer_index_engages(pool: sqlx::PgPool) -> anyhow::Result for op in ["<", "<=", ">", ">="] { let query = - format!("SELECT * FROM entry_idx WHERE value {op} '{lit}'::eql_v3.jsonb_entry",); + format!("SELECT * FROM entry_idx WHERE value {op} '{lit}'::public.jsonb_entry",); eql_tests::matrix::assert_index_scan_uses( &mut *tx, &query, @@ -228,7 +228,7 @@ async fn jsonb_entry_integer_aggregate_ignores_oc_less_entries( pool: sqlx::PgPool, ) -> anyhow::Result<()> { let sel = SELECTOR; - // A valid eql_v3.jsonb_entry that is NOT orderable: string s, string c, + // A valid public.jsonb_entry that is NOT orderable: string s, string c, // exactly one of hm/oc — here `hm`, so `eql_v3.ore_cllw(entry)` is NULL. let oc_less = r#"{"s":"forged","c":"x","hm":"00"}"#; @@ -241,18 +241,18 @@ async fn jsonb_entry_integer_aggregate_ignores_oc_less_entries( let high = *sorted.last().expect("fixture is non-empty"); let mut tx = pool.begin().await?; - sqlx::query("CREATE TEMP TABLE oc_mix (value eql_v3.jsonb_entry) ON COMMIT DROP") + sqlx::query("CREATE TEMP TABLE oc_mix (value public.jsonb_entry) ON COMMIT DROP") .execute(&mut *tx) .await?; // SEED position: the oc-less entry is inserted FIRST, so the STRICT seed is // non-orderable — the exact case the sfunc guard must survive. - sqlx::query("INSERT INTO oc_mix(value) VALUES ($1::jsonb::eql_v3.jsonb_entry)") + sqlx::query("INSERT INTO oc_mix(value) VALUES ($1::jsonb::public.jsonb_entry)") .bind(oc_less) .execute(&mut *tx) .await?; sqlx::query(&format!( "INSERT INTO oc_mix(value) \ - SELECT (payload -> '{sel}'::text)::eql_v3.jsonb_entry \ + SELECT (payload -> '{sel}'::text)::public.jsonb_entry \ FROM fixtures.v3_doc_integer WHERE plaintext IN ({low}, {high})", )) .execute(&mut *tx) @@ -261,13 +261,13 @@ async fn jsonb_entry_integer_aggregate_ignores_oc_less_entries( // Expected extrema: the orderable entries for the smallest / largest integer, // NOT the oc-less seed. let expect_min: String = sqlx::query_scalar(&format!( - "SELECT ((payload -> '{sel}'::text)::eql_v3.jsonb_entry)::text \ + "SELECT ((payload -> '{sel}'::text)::public.jsonb_entry)::text \ FROM fixtures.v3_doc_integer WHERE plaintext = {low}", )) .fetch_one(&mut *tx) .await?; let expect_max: String = sqlx::query_scalar(&format!( - "SELECT ((payload -> '{sel}'::text)::eql_v3.jsonb_entry)::text \ + "SELECT ((payload -> '{sel}'::text)::public.jsonb_entry)::text \ FROM fixtures.v3_doc_integer WHERE plaintext = {high}", )) .fetch_one(&mut *tx) diff --git a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs index 5cc6b31b8..eab235383 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs @@ -1,4 +1,4 @@ -//! `eql_v3.date_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.date_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer diff --git a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs index 334688a21..699f4921b 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs @@ -1,4 +1,4 @@ -//! `eql_v3.double_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.double_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer diff --git a/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs index e48dc20a0..e86e9f85d 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs @@ -1,4 +1,4 @@ -//! `eql_v3.integer_ord_ope` smoke suite: the shared `_ord_ope` tests plus the +//! `public.integer_ord_ope` smoke suite: the shared `_ord_ope` tests plus the //! deeper single-type behaviour (bytea prefix order, blockers, ORDER BY forms, //! MIN/MAX aggregates) exercised once on the integer reference — the ope surface //! is byte-identical across the ordered families modulo the domain name, so @@ -24,7 +24,7 @@ async fn ord_ope_functional_index_engages_for_range_and_equality( // opclass — the same mechanism as `hm` equality. `enable_seqscan = off` // proves usability only (the matrix's scale tests own preference). let mut tx = pool.begin().await?; - sqlx::query("CREATE TABLE ope_idx (id int, payload eql_v3.integer_ord_ope)") + sqlx::query("CREATE TABLE ope_idx (id int, payload public.integer_ord_ope)") .execute(&mut *tx) .await?; for (id, op) in [(1, "00"), (2, "0a"), (3, "7f"), (4, "ff"), (5, "ffff")] { @@ -97,7 +97,7 @@ async fn ord_ope_order_by_sorts_by_decoded_bytes(pool: PgPool) -> anyhow::Result // opclass). `ORDER BY col USING <` must REJECT: the design forbids // opclasses on the domains themselves (see the matrix's order_by_using // rejection category). - sqlx::query("CREATE TABLE ope_smoke (id int, payload eql_v3.integer_ord_ope)") + sqlx::query("CREATE TABLE ope_smoke (id int, payload public.integer_ord_ope)") .execute(&pool) .await?; // Insert out of byte order: 0xff (3rd), 0x00ff (1st), 0x0100 (2nd). @@ -133,7 +133,7 @@ async fn ord_ope_order_by_sorts_by_decoded_bytes(pool: PgPool) -> anyhow::Result #[sqlx::test] async fn ord_ope_min_max_aggregates(pool: PgPool) -> anyhow::Result<()> { - sqlx::query("CREATE TABLE ope_agg (payload eql_v3.integer_ord_ope)") + sqlx::query("CREATE TABLE ope_agg (payload public.integer_ord_ope)") .execute(&pool) .await?; for op in ["0a", "00", "ff"] { diff --git a/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs index 75dd6c0d1..300905d7f 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs @@ -1,4 +1,4 @@ -//! `eql_v3.real_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.real_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer diff --git a/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs index a01c5f505..7c073b93f 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs @@ -1,4 +1,4 @@ -//! `eql_v3.text_ord_ope` smoke suite: the shared `_ord_ope` tests plus the +//! `public.text_ord_ope` smoke suite: the shared `_ord_ope` tests plus the //! text-specific routing contract — `=` / `<>` resolve through `hm` (exact //! HMAC), never the OPE term, because OPE over text is not equality-lossless //! (the same rule as `text_ord`'s `[Hm, Ore]`). diff --git a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs index 72bbe94b1..5f49738cb 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs @@ -1,4 +1,4 @@ -//! `eql_v3.timestamp_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.timestamp_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index e5afa3cfa..a97731623 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -278,8 +278,8 @@ fn real_and_double_share_index_terms_for_the_same_value() -> Result<()> { }; let sql = format!( "SELECT {} = {}", - ord_term(&f4_payloads[0], "eql_v3.real_ord_ore"), - ord_term(&f8_payloads[0], "eql_v3.double_ord_ore"), + ord_term(&f4_payloads[0], "public.real_ord_ore"), + ord_term(&f8_payloads[0], "public.double_ord_ore"), ); let ore_equal: Option = rt .block_on(sqlx::query_scalar(&sql).fetch_one(&pool)) diff --git a/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs b/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs index f73a56e3f..abd8b57af 100644 --- a/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs +++ b/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs @@ -13,7 +13,7 @@ //! fixtures load, exactly like `fixture_oracle.rs`. It is a `#[sqlx::test]` //! (its own migrated scratch DB), so the fixtures load into an isolated database. //! The `Variant` enum models no `_match` member, so the domain -//! (`eql_v3.text_match`) is named directly. +//! (`public.text_match`) is named directly. use super::fixture_oracle::load_fixtures; use anyhow::Result; @@ -21,8 +21,8 @@ use eql_tests::property::assert_match_smoke; use eql_tests::scalar_domains::{fetch_fixture_payload, MatchScalar}; use sqlx::PgPool; -/// `eql_v3.text_match` — the bloom-filter (`bf`) domain (`@>`/`<@`). -const TEXT_MATCH_DOMAIN: &str = "eql_v3.text_match"; +/// `public.text_match` — the bloom-filter (`bf`) domain (`@>`/`<@`). +const TEXT_MATCH_DOMAIN: &str = "public.text_match"; #[sqlx::test] async fn text_match_smoke(pool: PgPool) -> Result<()> { diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index 1098a1e10..a7343f02d 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -1,4 +1,4 @@ -//! Match-containment coverage for `eql_v3.text_match` — separate from the +//! Match-containment coverage for `public.text_match` — separate from the //! ordered matrix because `@>` is asymmetric/probabilistic, not a total order. //! Asserts against the generated `eql_v3_text` fixtures (which carry `bf`). use sqlx::PgPool; @@ -18,7 +18,7 @@ async fn payload_for(pool: &PgPool, plaintext: &str) -> anyhow::Result anyhow::Result<()> { let p = payload_for(&pool, "aardvark").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::eql_v3.text_match) @> ($1::jsonb::eql_v3.text_match)", + "SELECT ($1::jsonb::public.text_match) @> ($1::jsonb::public.text_match)", ) .bind(&p) .fetch_one(&pool) @@ -32,7 +32,7 @@ async fn haystack_contains_substring_needle(pool: PgPool) -> anyhow::Result<()> let hay = payload_for(&pool, "aardvark").await?; let needle = payload_for(&pool, "aard").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match)", + "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match)", ) .bind(&hay) .bind(&needle) @@ -52,7 +52,7 @@ async fn disjoint_value_does_not_match(pool: PgPool) -> anyhow::Result<()> { let hay = payload_for(&pool, "aard").await?; let needle = payload_for(&pool, "zzzz").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match)", + "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match)", ) .bind(&hay) .bind(&needle) @@ -76,7 +76,7 @@ async fn match_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { .execute(&mut *tx) .await?; sqlx::query(&format!( - "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::eql_v3.text_match))" + "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::public.text_match))" )) .execute(&mut *tx) .await?; @@ -85,8 +85,8 @@ async fn match_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { // hardcoded query (it interpolates directly and takes no binds). let query = format!( "SELECT 1 FROM {TABLE} \ - WHERE eql_v3.match_term(payload::eql_v3.text_match) \ - @> eql_v3.match_term((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::eql_v3.text_match)" + WHERE eql_v3.match_term(payload::public.text_match) \ + @> eql_v3.match_term((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::public.text_match)" ); eql_tests::matrix::assert_index_scan_uses( &mut *tx, @@ -112,7 +112,7 @@ async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> .execute(&mut *tx) .await?; sqlx::query(&format!( - "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::eql_v3.text_match))" + "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::public.text_match))" )) .execute(&mut *tx) .await?; @@ -121,8 +121,8 @@ async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> // a hardcoded query string (it interpolates directly and takes no binds). let query = format!( "SELECT 1 FROM {TABLE} \ - WHERE (payload::eql_v3.text_match) \ - @> ((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::eql_v3.text_match)" + WHERE (payload::public.text_match) \ + @> ((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::public.text_match)" ); eql_tests::matrix::assert_index_scan_uses( &mut *tx, @@ -142,7 +142,7 @@ async fn needle_contained_by_haystack(pool: PgPool) -> anyhow::Result<()> { let needle = payload_for(&pool, "aard").await?; let hay = payload_for(&pool, "aardvark").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::eql_v3.text_match) <@ ($2::jsonb::eql_v3.text_match)", + "SELECT ($1::jsonb::public.text_match) <@ ($2::jsonb::public.text_match)", ) .bind(&needle) .bind(&hay) @@ -165,7 +165,7 @@ async fn disjoint_value_not_contained_by(pool: PgPool) -> anyhow::Result<()> { let needle = payload_for(&pool, "zzzz").await?; let hay = payload_for(&pool, "aard").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::eql_v3.text_match) <@ ($2::jsonb::eql_v3.text_match)", + "SELECT ($1::jsonb::public.text_match) <@ ($2::jsonb::public.text_match)", ) .bind(&needle) .bind(&hay) @@ -186,8 +186,8 @@ async fn contains_and_contained_by_are_commutative(pool: PgPool) -> anyhow::Resu let sup = payload_for(&pool, "aardvark").await?; let sub = payload_for(&pool, "aard").await?; let (contains, contained_by): (bool, bool) = sqlx::query_as( - "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match), - ($2::jsonb::eql_v3.text_match) <@ ($1::jsonb::eql_v3.text_match)", + "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match), + ($2::jsonb::public.text_match) <@ ($1::jsonb::public.text_match)", ) .bind(&sup) .bind(&sub) @@ -214,9 +214,9 @@ async fn direct_contains_function_matches_operator(pool: PgPool) -> anyhow::Resu let zzzz = payload_for(&pool, "zzzz").await?; let (fn_hit, op_hit, fn_miss): (bool, bool, bool) = sqlx::query_as( - "SELECT eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match), - ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match), - eql_v3.contains($1::jsonb::eql_v3.text_match, $3::jsonb::eql_v3.text_match)", + "SELECT eql_v3.contains($1::jsonb::public.text_match, $2::jsonb::public.text_match), + ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match), + eql_v3.contains($1::jsonb::public.text_match, $3::jsonb::public.text_match)", ) .bind(&hay) .bind(&aard) @@ -245,9 +245,9 @@ async fn direct_contained_by_function_matches_operator(pool: PgPool) -> anyhow:: let zzzz = payload_for(&pool, "zzzz").await?; let (fn_hit, op_hit, fn_miss): (bool, bool, bool) = sqlx::query_as( - "SELECT eql_v3.contained_by($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match), - ($1::jsonb::eql_v3.text_match) <@ ($2::jsonb::eql_v3.text_match), - eql_v3.contained_by($3::jsonb::eql_v3.text_match, $1::jsonb::eql_v3.text_match)", + "SELECT eql_v3.contained_by($1::jsonb::public.text_match, $2::jsonb::public.text_match), + ($1::jsonb::public.text_match) <@ ($2::jsonb::public.text_match), + eql_v3.contained_by($3::jsonb::public.text_match, $1::jsonb::public.text_match)", ) .bind(&aard) .bind(&hay) @@ -282,11 +282,11 @@ async fn mixed_jsonb_domain_overloads_agree(pool: PgPool) -> anyhow::Result<()> // DIFFERENT overload resolves; all must equal the all-domain baseline. let row: (bool, bool, bool, bool, bool) = sqlx::query_as( "SELECT - eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match), -- baseline (domain,domain) - eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb), -- (domain, jsonb) - eql_v3.contains($1::jsonb, $2::jsonb::eql_v3.text_match), -- (jsonb, domain) - eql_v3.contained_by($2::jsonb::eql_v3.text_match, $1::jsonb), -- (domain, jsonb) - eql_v3.contained_by($2::jsonb, $1::jsonb::eql_v3.text_match) -- (jsonb, domain) + eql_v3.contains($1::jsonb::public.text_match, $2::jsonb::public.text_match), -- baseline (domain,domain) + eql_v3.contains($1::jsonb::public.text_match, $2::jsonb), -- (domain, jsonb) + eql_v3.contains($1::jsonb, $2::jsonb::public.text_match), -- (jsonb, domain) + eql_v3.contained_by($2::jsonb::public.text_match, $1::jsonb), -- (domain, jsonb) + eql_v3.contained_by($2::jsonb, $1::jsonb::public.text_match) -- (jsonb, domain) ", ) .bind(&hay) @@ -328,9 +328,9 @@ async fn direct_functions_propagate_null(pool: PgPool) -> anyhow::Result<()> { // $1 NULL, $2 a real payload — and the reverse — across both functions, both // operand positions, and a mixed jsonb overload. for sql in [ - "SELECT eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match)", - "SELECT eql_v3.contained_by($1::jsonb::eql_v3.text_match, $2::jsonb::eql_v3.text_match)", - "SELECT eql_v3.contains($1::jsonb::eql_v3.text_match, $2::jsonb)", // mixed (domain, jsonb) + "SELECT eql_v3.contains($1::jsonb::public.text_match, $2::jsonb::public.text_match)", + "SELECT eql_v3.contained_by($1::jsonb::public.text_match, $2::jsonb::public.text_match)", + "SELECT eql_v3.contains($1::jsonb::public.text_match, $2::jsonb)", // mixed (domain, jsonb) ] { eql_tests::assert_null(&pool, sql, &[None, Some(BF)]).await?; eql_tests::assert_null(&pool, sql, &[Some(BF), None]).await?; @@ -351,7 +351,7 @@ async fn bloom_matches_where_like_would_not(pool: PgPool) -> anyhow::Result<()> // 1. bloom DOES match. let bloom_hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::eql_v3.text_match) @> ($2::jsonb::eql_v3.text_match)", + "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match)", ) .bind(&hay) .bind(&needle) diff --git a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs index d5c9b0505..5fe5dd780 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs @@ -1,24 +1,24 @@ -//! Literal-payload smoke tests for the generated `eql_v3.text_match` surface: +//! Literal-payload smoke tests for the generated `public.text_match` surface: //! `@>` / `<@` containment engages (supported wrappers), `=` raises (blocker), //! `~~`/`~~*` are absent (no pattern-match), and the domain CHECK requires `bf`. //! Uses hand-written jsonb payloads carrying `bf` — no encryption/fixtures //! needed. The fixture-backed containment behaviour lives in `text_match.rs`. use sqlx::PgPool; -/// Build a literal `eql_v3.text_match` cast expression carrying bloom array +/// Build a literal `public.text_match` cast expression carrying bloom array /// `bf` (e.g. `"[1,2,3]"` or `"[]"`). Lets these tests state set-containment /// semantics directly on `bf` arrays — deterministic, with no encryption and no /// bloom false positives to reason about. fn match_cast(bf: &str) -> String { - format!("'{{\"v\":\"3\",\"i\":{{}},\"c\":\"x\",\"bf\":{bf}}}'::jsonb::eql_v3.text_match") + format!("'{{\"v\":\"3\",\"i\":{{}},\"c\":\"x\",\"bf\":{bf}}}'::jsonb::public.text_match") } #[sqlx::test] async fn text_match_at_contains_engages(pool: PgPool) -> anyhow::Result<()> { // self-containment: a filter contains a subset of itself let hit: bool = sqlx::query_scalar( - "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::eql_v3.text_match) - @> ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[2]}'::jsonb::eql_v3.text_match)", + "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::public.text_match) + @> ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[2]}'::jsonb::public.text_match)", ) .fetch_one(&pool) .await?; @@ -29,8 +29,8 @@ async fn text_match_at_contains_engages(pool: PgPool) -> anyhow::Result<()> { #[sqlx::test] async fn text_match_eq_is_blocked(pool: PgPool) -> anyhow::Result<()> { let err = sqlx::query( - "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::eql_v3.text_match) - = ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::eql_v3.text_match)", + "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::public.text_match) + = ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::public.text_match)", ) .execute(&pool) .await @@ -50,8 +50,8 @@ async fn empty_bloom_has_empty_set_semantics(pool: PgPool) -> anyhow::Result<()> // literal payloads so the assertion is deterministic and independent of how // the encryptor renders a `bf` for a degenerate plaintext. const NON_EMPTY: &str = - "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::eql_v3.text_match"; - const EMPTY: &str = "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[]}'::jsonb::eql_v3.text_match"; + "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::public.text_match"; + const EMPTY: &str = "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[]}'::jsonb::public.text_match"; let everything_contains_empty: bool = sqlx::query_scalar(&format!("SELECT ({NON_EMPTY}) @> ({EMPTY})")) @@ -80,7 +80,7 @@ async fn match_null_propagates(pool: PgPool) -> anyhow::Result<()> { const BF: &str = r#"{"v":"3","i":{},"c":"x","bf":[1,2,3]}"#; for op in ["@>", "<@"] { let sql = - format!("SELECT ($1::jsonb::eql_v3.text_match) {op} ($2::jsonb::eql_v3.text_match)"); + format!("SELECT ($1::jsonb::public.text_match) {op} ($2::jsonb::public.text_match)"); eql_tests::assert_null(&pool, &sql, &[None, Some(BF)]).await?; eql_tests::assert_null(&pool, &sql, &[Some(BF), None]).await?; } @@ -157,12 +157,12 @@ async fn text_match_containment_requires_all_elements(pool: PgPool) -> anyhow::R async fn text_match_like_ilike_absent(pool: PgPool) -> anyhow::Result<()> { // The bloom containment surface replaces deprecated `LIKE`/`ILIKE`, but it is // NOT a pattern-match operator. `~~`/`~~*` are deliberately not declared on - // eql_v3.text_match, so they resolve to PostgreSQL's "operator does not + // public.text_match, so they resolve to PostgreSQL's "operator does not // exist" rather than an EQL blocker. Pin that they stay absent on the very // domain a `LIKE` user would reach for. const BF: &str = r#"{"v":"3","i":{},"c":"x","bf":[1]}"#; for op in ["~~", "~~*"] { - let sql = format!("SELECT $1::jsonb::eql_v3.text_match {op} $2::jsonb::eql_v3.text_match"); + let sql = format!("SELECT $1::jsonb::public.text_match {op} $2::jsonb::public.text_match"); eql_tests::assert_raises( &pool, &sql, @@ -176,14 +176,14 @@ async fn text_match_like_ilike_absent(pool: PgPool) -> anyhow::Result<()> { #[sqlx::test] async fn text_match_payload_check_rejects_missing_bf(pool: PgPool) -> anyhow::Result<()> { - // The generated eql_v3.text_match domain CHECK requires the `bf` key + // The generated public.text_match domain CHECK requires the `bf` key // (src/v3/scalars/text/text_types.sql). A well-formed envelope lacking `bf` // must be rejected at the cast, so a match query can never silently run // against a payload that carries no bloom term. const NO_BF: &str = r#"{"v":"3","i":{},"c":"x"}"#; eql_tests::assert_raises( &pool, - "SELECT $1::jsonb::eql_v3.text_match", + "SELECT $1::jsonb::public.text_match", &[Some(NO_BF)], "violates check constraint", ) diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index edd9252fb..6aaf6e46e 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -118,15 +118,15 @@ async fn lint_categories_are_well_known(pool: PgPool) -> Result<()> { /// planner can fold or elide the call when the result is provably unused /// (a dead CASE branch, a folded predicate), silently bypassing the RAISE /// and re-enabling the operator. See CLAUDE.md footguns. This test plants -/// a fake LANGUAGE sql blocker on `eql_v3.integer` and asserts the lint +/// a fake LANGUAGE sql blocker on `public.integer` and asserts the lint /// surfaces it under category `blocker_language`. #[sqlx::test] async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v3.test_bad_blocker_sql(a eql_v3.integer, b eql_v3.integer) + CREATE FUNCTION eql_v3.test_bad_blocker_sql(a public.integer, b public.integer) RETURNS boolean LANGUAGE sql IMMUTABLE - AS $$ SELECT eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.integer', '=') $$; + AS $$ SELECT eql_v3_internal.encrypted_domain_unsupported_bool('public.integer', '=') $$; "#, ) .execute(&pool) @@ -156,15 +156,15 @@ async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { /// A blocker marked `STRICT` lets PostgreSQL skip the body and return NULL /// on a NULL argument — silently bypassing the "operator not supported" /// RAISE. See CLAUDE.md footguns. This test plants a fake STRICT plpgsql -/// blocker on `eql_v3.integer` and asserts the lint surfaces it under +/// blocker on `public.integer` and asserts the lint surfaces it under /// `blocker_strict`. #[sqlx::test] async fn lint_flags_strict_blocker(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v3.test_bad_blocker_strict(a eql_v3.integer, b eql_v3.integer) + CREATE FUNCTION eql_v3.test_bad_blocker_strict(a public.integer, b public.integer) RETURNS boolean LANGUAGE plpgsql IMMUTABLE STRICT - AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('eql_v3.integer', '='); END; $$; + AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.integer', '='); END; $$; "#, ) .execute(&pool) @@ -208,7 +208,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( | "inlinability_volatility" | "inlinability_set_clause" | "inlinability_secdef" - ) && r.object_name.contains("eql_v3.integer") + ) && r.object_name.contains("public.integer") && (r.object_name.contains("operator =(") || r.object_name.contains("operator ->(") || r.object_name.contains("operator ?(")) @@ -231,7 +231,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( /// surfaces it under `domain_over_domain`. #[sqlx::test] async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { - sqlx::query(r#"CREATE DOMAIN eql_v3.test_baddom AS eql_v3.integer;"#) + sqlx::query(r#"CREATE DOMAIN eql_v3.test_baddom AS public.integer;"#) .execute(&pool) .await?; diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index 71cbe9f38..8bbd959e2 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -353,7 +353,7 @@ async fn timestamp_term_is_12_blocks(pool: PgPool) -> Result<()> { let width: i32 = sqlx::query_scalar( "SELECT octet_length((((eql_v3.ord_term( \ (SELECT payload FROM fixtures.eql_v3_timestamp WHERE plaintext = '1970-01-01T00:00:00Z'::timestamptz) \ - ::eql_v3.timestamp_ord)).terms)[1]).bytes)", + ::public.timestamp_ord)).terms)[1]).bytes)", ) .fetch_one(&pool) .await?; diff --git a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs index a984f4279..8aa96c951 100644 --- a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs @@ -2,7 +2,7 @@ //! the one test that ties eql-bindings to real cipherstash crypto AND to the //! hand-written src/v3/jsonb/types.sql domain CHECK simultaneously. //! -//! The fixture (`fixtures.v3_ste_vec`, column `payload eql_v3.json`) is GENERATED +//! The fixture (`fixtures.v3_ste_vec`, column `payload public.json`) is GENERATED //! by encrypting JSON documents through cipherstash-client's SteVec pipeline //! (`mise run fixture:generate:all`), so this exercises the bindings against the //! same wire shape the domain CHECK (`is_valid_ste_vec_document_payload`) @@ -65,7 +65,7 @@ async fn real_ste_vec_row_parses_into_document_and_entries(pool: PgPool) -> anyh #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn real_ste_vec_query_parses_into_bindings(pool: PgPool) -> anyhow::Result<()> { // `eql_v3.to_ste_vec_query` turns an encrypted document into a containment - // needle (`eql_v3.jsonb_query`), the shape a caller builds a `@>` / `<@` + // needle (`public.jsonb_query`), the shape a caller builds a `@>` / `<@` // query from. Parse a REAL one into `SteVecQuery` (and, transitively, its // `SteVecQueryEntry` elements), tying those two bindings to real crypto and // the hand-written `is_valid_ste_vec_query_payload` CHECK — the document/entry diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs index 4289bed23..c6535f74f 100644 --- a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -4,12 +4,12 @@ //! This binary reads `pg_operator`, not the fixture. It verifies BOTH sides of //! the surface: //! 1. Every native jsonb operator symbol is either a supported root symbol OR -//! has an `eql_v3.json`-bound blocker (so a column can never silently route +//! has an `public.json`-bound blocker (so a column can never silently route //! to plaintext-jsonb semantics). //! 2. Every supported symbol is bound with EXACTLY the intended safe operand //! signatures, and unsupported root-document comparison signatures -//! (`eql_v3.json = eql_v3.json`, etc.) are blocked. -//! 3. Every blocker is bound to `eql_v3.json` with PostgreSQL's real native +//! (`public.json = public.json`, etc.) are blocked. +//! 3. Every blocker is bound to `public.json` with PostgreSQL's real native //! RHS type for that operator. //! //! Design source of truth: @@ -18,11 +18,11 @@ use sqlx::PgPool; use std::collections::BTreeSet; -/// Root-document operator symbols the surface SUPPORTS (an `eql_v3.json`-bound +/// Root-document operator symbols the surface SUPPORTS (an `public.json`-bound /// operator, not a blocker). const SUPPORTED_ROOT_SYMBOLS: &[&str] = &["@>", "<@", "->", "->>"]; -/// Entry comparison symbols on `eql_v3.jsonb_entry`. +/// Entry comparison symbols on `public.jsonb_entry`. const SUPPORTED_ENTRY_SYMBOLS: &[&str] = &["=", "<>", "<", "<=", ">", ">="]; /// Native jsonb operators the surface BLOCKS (each raises "is not supported"). @@ -36,9 +36,9 @@ async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result = sqlx::query_as( r#" WITH d AS ( - SELECT 'eql_v3.json'::regtype AS j, - 'eql_v3.jsonb_entry'::regtype AS e, - 'eql_v3.jsonb_query'::regtype AS q + SELECT 'public.json'::regtype AS j, + 'public.jsonb_entry'::regtype AS e, + 'public.jsonb_query'::regtype AS q ) SELECT o.oprname, pg_catalog.format_type(o.oprleft, NULL) AS lhs, @@ -53,10 +53,15 @@ async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result String { - ty.replace("eql_v3.\"json\"", "eql_v3.json") + match ty { + "\"json\"" => "public.json".to_string(), + "jsonb_entry" => "public.jsonb_entry".to_string(), + "jsonb_query" => "public.jsonb_query".to_string(), + _ => ty.replace("public.\"json\"", "public.json"), + } } // ============================================================================ @@ -81,11 +86,11 @@ async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<( "expected pg_operator to expose jsonb operators" ); - // The blocked symbols MUST each have an eql_v3.json-bound operator. + // The blocked symbols MUST each have an public.json-bound operator. let bound: Vec<(String, String, String)> = v3_jsonb_operators(&pool).await?; let json_bound_symbols: BTreeSet = bound .iter() - .filter(|(_, l, r)| norm(l) == "eql_v3.json" || norm(r) == "eql_v3.json") + .filter(|(_, l, r)| norm(l) == "public.json" || norm(r) == "public.json") .map(|(n, _, _)| n.clone()) .collect(); @@ -104,9 +109,9 @@ async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<( assert!( unaccounted.is_empty(), "native jsonb operator(s) neither supported, blocked, nor an intentionally-native \ - comparison on eql_v3.json: {unaccounted:#?}. Each would route an encrypted column \ + comparison on public.json: {unaccounted:#?}. Each would route an encrypted column \ to native plaintext-jsonb semantics (e.g. key/path extraction). Add a supported \ - wrapper or an eql_v3.json-bound blocker." + wrapper or an public.json-bound blocker." ); // And every blocked symbol must actually be bound (no missing blocker). @@ -118,7 +123,7 @@ async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<( } assert!( missing_blockers.is_empty(), - "blocked symbol(s) have no eql_v3.json-bound operator: {missing_blockers:?}" + "blocked symbol(s) have no public.json-bound operator: {missing_blockers:?}" ); Ok(()) } @@ -138,23 +143,23 @@ async fn v3_jsonb_surface_supported_signatures(pool: PgPool) -> anyhow::Result<( // Exact supported operand signatures (verified against operators.sql). let expected_supported: &[(&str, &str, &str)] = &[ // containment - ("@>", "eql_v3.json", "eql_v3.json"), - ("@>", "eql_v3.json", "eql_v3.jsonb_query"), - ("@>", "eql_v3.json", "eql_v3.jsonb_entry"), - ("<@", "eql_v3.json", "eql_v3.json"), - ("<@", "eql_v3.jsonb_query", "eql_v3.json"), - ("<@", "eql_v3.jsonb_entry", "eql_v3.json"), + ("@>", "public.json", "public.json"), + ("@>", "public.json", "public.jsonb_query"), + ("@>", "public.json", "public.jsonb_entry"), + ("<@", "public.json", "public.json"), + ("<@", "public.jsonb_query", "public.json"), + ("<@", "public.jsonb_entry", "public.json"), // path access - ("->", "eql_v3.json", "text"), - ("->", "eql_v3.json", "integer"), - ("->>", "eql_v3.json", "text"), + ("->", "public.json", "text"), + ("->", "public.json", "integer"), + ("->>", "public.json", "text"), // entry comparisons - ("=", "eql_v3.jsonb_entry", "eql_v3.jsonb_entry"), - ("<>", "eql_v3.jsonb_entry", "eql_v3.jsonb_entry"), - ("<", "eql_v3.jsonb_entry", "eql_v3.jsonb_entry"), - ("<=", "eql_v3.jsonb_entry", "eql_v3.jsonb_entry"), - (">", "eql_v3.jsonb_entry", "eql_v3.jsonb_entry"), - (">=", "eql_v3.jsonb_entry", "eql_v3.jsonb_entry"), + ("=", "public.jsonb_entry", "public.jsonb_entry"), + ("<>", "public.jsonb_entry", "public.jsonb_entry"), + ("<", "public.jsonb_entry", "public.jsonb_entry"), + ("<=", "public.jsonb_entry", "public.jsonb_entry"), + (">", "public.jsonb_entry", "public.jsonb_entry"), + (">=", "public.jsonb_entry", "public.jsonb_entry"), ]; let mut missing: Vec<(&str, &str, &str)> = Vec::new(); @@ -183,7 +188,7 @@ async fn v3_jsonb_surface_root_comparisons_blocked(pool: PgPool) -> anyhow::Resu pg_catalog.format_type(o.oprright, NULL) FROM pg_operator o WHERE o.oprname IN ('=', '<>', '<', '<=', '>', '>=') - AND ('eql_v3.json'::regtype IN (o.oprleft, o.oprright)) + AND ('public.json'::regtype IN (o.oprleft, o.oprright)) ORDER BY 1, 2, 3 "#, ) @@ -195,9 +200,9 @@ async fn v3_jsonb_surface_root_comparisons_blocked(pool: PgPool) -> anyhow::Resu .collect(); for op in ["=", "<>", "<", "<=", ">", ">="] { for (l, r) in [ - ("eql_v3.json", "eql_v3.json"), - ("eql_v3.json", "jsonb"), - ("jsonb", "eql_v3.json"), + ("public.json", "public.json"), + ("public.json", "jsonb"), + ("jsonb", "public.json"), ] { assert!( have.contains(&(op.to_string(), l.to_string(), r.to_string())), @@ -226,9 +231,9 @@ async fn v3_jsonb_surface_entry_mixed_shapes_absent(pool: PgPool) -> anyhow::Res pg_catalog.format_type(o.oprright, NULL) FROM pg_operator o WHERE o.oprname IN ('=', '<>', '<', '<=', '>', '>=') - AND ('eql_v3.jsonb_entry'::regtype IN (o.oprleft, o.oprright)) - AND NOT (o.oprleft = 'eql_v3.jsonb_entry'::regtype - AND o.oprright = 'eql_v3.jsonb_entry'::regtype) + AND ('public.jsonb_entry'::regtype IN (o.oprleft, o.oprright)) + AND NOT (o.oprleft = 'public.jsonb_entry'::regtype + AND o.oprright = 'public.jsonb_entry'::regtype) "#, ) .fetch_all(&pool) @@ -244,8 +249,8 @@ async fn v3_jsonb_surface_entry_mixed_shapes_absent(pool: PgPool) -> anyhow::Res r#" SELECT o.oprname FROM pg_operator o - WHERE o.oprleft = 'eql_v3.jsonb_entry'::regtype - AND o.oprright = 'eql_v3.jsonb_entry'::regtype + WHERE o.oprleft = 'public.jsonb_entry'::regtype + AND o.oprright = 'public.jsonb_entry'::regtype "#, ) .fetch_all(&pool) @@ -262,7 +267,7 @@ async fn v3_jsonb_surface_entry_mixed_shapes_absent(pool: PgPool) -> anyhow::Res } // ============================================================================ -// (3) Each blocker is bound to eql_v3.json with PostgreSQL's real native RHS +// (3) Each blocker is bound to public.json with PostgreSQL's real native RHS // type for that operator. // ============================================================================ @@ -277,45 +282,45 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> // Exact blocker operand signatures with PostgreSQL's real native RHS types // (verified against blockers.sql and the live catalog). let expected_blockers: &[(&str, &str, &str)] = &[ - ("?", "eql_v3.json", "text"), - ("?|", "eql_v3.json", "text[]"), - ("?&", "eql_v3.json", "text[]"), - ("@?", "eql_v3.json", "jsonpath"), - ("@@", "eql_v3.json", "jsonpath"), - ("#>", "eql_v3.json", "text[]"), - ("#>>", "eql_v3.json", "text[]"), - ("-", "eql_v3.json", "text"), - ("-", "eql_v3.json", "integer"), - ("-", "eql_v3.json", "text[]"), - ("#-", "eql_v3.json", "text[]"), - ("||", "eql_v3.json", "jsonb"), + ("?", "public.json", "text"), + ("?|", "public.json", "text[]"), + ("?&", "public.json", "text[]"), + ("@?", "public.json", "jsonpath"), + ("@@", "public.json", "jsonpath"), + ("#>", "public.json", "text[]"), + ("#>>", "public.json", "text[]"), + ("-", "public.json", "text"), + ("-", "public.json", "integer"), + ("-", "public.json", "text[]"), + ("#-", "public.json", "text[]"), + ("||", "public.json", "jsonb"), // concat is also blocked with the domain on the RIGHT. - ("||", "jsonb", "eql_v3.json"), + ("||", "jsonb", "public.json"), // root comparisons are blocked for every typed domain/jsonb shape. - ("=", "eql_v3.json", "eql_v3.json"), - ("=", "eql_v3.json", "jsonb"), - ("=", "jsonb", "eql_v3.json"), - ("<>", "eql_v3.json", "eql_v3.json"), - ("<>", "eql_v3.json", "jsonb"), - ("<>", "jsonb", "eql_v3.json"), - ("<", "eql_v3.json", "eql_v3.json"), - ("<", "eql_v3.json", "jsonb"), - ("<", "jsonb", "eql_v3.json"), - ("<=", "eql_v3.json", "eql_v3.json"), - ("<=", "eql_v3.json", "jsonb"), - ("<=", "jsonb", "eql_v3.json"), - (">", "eql_v3.json", "eql_v3.json"), - (">", "eql_v3.json", "jsonb"), - (">", "jsonb", "eql_v3.json"), - (">=", "eql_v3.json", "eql_v3.json"), - (">=", "eql_v3.json", "jsonb"), - (">=", "jsonb", "eql_v3.json"), + ("=", "public.json", "public.json"), + ("=", "public.json", "jsonb"), + ("=", "jsonb", "public.json"), + ("<>", "public.json", "public.json"), + ("<>", "public.json", "jsonb"), + ("<>", "jsonb", "public.json"), + ("<", "public.json", "public.json"), + ("<", "public.json", "jsonb"), + ("<", "jsonb", "public.json"), + ("<=", "public.json", "public.json"), + ("<=", "public.json", "jsonb"), + ("<=", "jsonb", "public.json"), + (">", "public.json", "public.json"), + (">", "public.json", "jsonb"), + (">", "jsonb", "public.json"), + (">=", "public.json", "public.json"), + (">=", "public.json", "jsonb"), + (">=", "jsonb", "public.json"), // mixed jsonb containment shapes are blocked; safe forms use json, // jsonb_query, or jsonb_entry. - ("@>", "eql_v3.json", "jsonb"), - ("@>", "jsonb", "eql_v3.json"), - ("<@", "eql_v3.json", "jsonb"), - ("<@", "jsonb", "eql_v3.json"), + ("@>", "public.json", "jsonb"), + ("@>", "jsonb", "public.json"), + ("<@", "public.json", "jsonb"), + ("<@", "jsonb", "public.json"), ]; let mut missing: Vec<(&str, &str, &str)> = Vec::new(); @@ -329,7 +334,7 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> "expected blocker signature(s) are absent: {missing:#?}" ); - // Every blocked symbol's eql_v3.json-bound operator backs a non-STRICT + // Every blocked symbol's public.json-bound operator backs a non-STRICT // plpgsql blocker function (proisstrict = false), so a NULL domain operand // still raises rather than short-circuiting to NULL. let strict_offenders: Vec<(String, String)> = sqlx::query_as( @@ -337,7 +342,7 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> SELECT o.oprname, p.proname FROM pg_operator o JOIN pg_proc p ON p.oid = o.oprcode - WHERE ('eql_v3.json'::regtype IN (o.oprleft, o.oprright)) + WHERE ('public.json'::regtype IN (o.oprleft, o.oprright)) AND o.oprname IN ('?', '?|', '?&', '@?', '@@', '#>', '#>>', '-', '#-', '||', '=', '<>', '<', '<=', '>', '>=', '@>', '<@') AND p.proname LIKE 'jsonb_blocked%' @@ -448,8 +453,8 @@ async fn assert_composed_blocked(pool: &PgPool, sql: &str) -> anyhow::Result<()> #[sqlx::test] async fn v3_jsonb_blocked_composed_expression_raises(pool: PgPool) -> anyhow::Result<()> { - // A valid eql_v3.json document literal (empty sv array satisfies the CHECK). - let j = r#"'{"i":{},"v":3,"sv":[]}'::eql_v3.json"#; + // A valid public.json document literal (empty sv array satisfies the CHECK). + let j = r#"'{"i":{},"v":3,"sv":[]}'::public.json"#; // Each case wraps a blocked operator (whose return type was boolean before // the fix) in a surrounding operator that only resolves against the NATIVE diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index 628f38e13..d13a7ba68 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -1,5 +1,5 @@ //! Parameterized test harness for the `eql_v3` encrypted-JSONB (SteVec) surface -//! (`eql_v3.json` / `eql_v3.jsonb_entry` / `eql_v3.jsonb_query`). +//! (`public.json` / `public.jsonb_entry` / `public.jsonb_query`). //! //! Design source of truth: //! `docs/superpowers/plans/2026-06-09-eql-v3-jsonb-test-harness-design.md`. @@ -10,7 +10,7 @@ //! `{scalar type}`, because a SteVec value is a *document* (a collection of //! leaves addressed by selector), so it does not fit `scalar_matrix!`. //! -//! CRITICAL correctness rule: `eql_v3.json` is a DOMAIN over `jsonb`. +//! CRITICAL correctness rule: `public.json` is a DOMAIN over `jsonb`. //! PostgreSQL resolves `domain OP untyped_literal` to the NATIVE jsonb operator //! (the domain flattens to its base type for unknown-typed literals). So every //! `->`/`->>` selector operand and every blocker RHS operand below is @@ -93,7 +93,7 @@ fn oc_entry(oc_hex: &str) -> String { entry(SEL_HELLO_OC, "oc", oc_hex) } -/// Build a document literal (`eql_v3.json`-shaped) wrapping the given sv element +/// Build a document literal (`public.json`-shaped) wrapping the given sv element /// literals (each already a JSON object string). fn doc(elems: &[String]) -> String { format!( @@ -146,23 +146,23 @@ macro_rules! v3_jsonb_eq_correctness { // = is true iff terms equal. let eq_same: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::eql_v3.jsonb_entry = '{same_b}'::eql_v3.jsonb_entry" + "SELECT '{same_a}'::public.jsonb_entry = '{same_b}'::public.jsonb_entry" )).fetch_one(&pool).await?; assert!(eq_same, "{} entries with equal terms must be =", $field); let eq_diff: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::eql_v3.jsonb_entry = '{diff_b}'::eql_v3.jsonb_entry" + "SELECT '{same_a}'::public.jsonb_entry = '{diff_b}'::public.jsonb_entry" )).fetch_one(&pool).await?; assert!(!eq_diff, "{} entries with differing terms must NOT be =", $field); // <> is the exact negation of =. let neq_same: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::eql_v3.jsonb_entry <> '{same_b}'::eql_v3.jsonb_entry" + "SELECT '{same_a}'::public.jsonb_entry <> '{same_b}'::public.jsonb_entry" )).fetch_one(&pool).await?; assert!(!neq_same, "<> must be false when terms equal"); let neq_diff: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::eql_v3.jsonb_entry <> '{diff_b}'::eql_v3.jsonb_entry" + "SELECT '{same_a}'::public.jsonb_entry <> '{diff_b}'::public.jsonb_entry" )).fetch_one(&pool).await?; assert!(neq_diff, "<> must be true when terms differ"); @@ -200,21 +200,21 @@ macro_rules! v3_jsonb_ord_correctness { // mid `op` (something strictly greater): the "lo < hi" position. let against_greater: bool = sqlx::query_scalar(&format!( - "SELECT '{mid}'::eql_v3.jsonb_entry {} '{hi}'::eql_v3.jsonb_entry", $op + "SELECT '{mid}'::public.jsonb_entry {} '{hi}'::public.jsonb_entry", $op )).fetch_one(&pool).await?; assert_eq!(against_greater, $lo_rel, "oc {} against a strictly-greater leaf", $op); // mid `op` (equal term). let against_equal: bool = sqlx::query_scalar(&format!( - "SELECT '{mid}'::eql_v3.jsonb_entry {} '{lo}'::eql_v3.jsonb_entry", $op + "SELECT '{mid}'::public.jsonb_entry {} '{lo}'::public.jsonb_entry", $op )).fetch_one(&pool).await?; assert_eq!(against_equal, $eq_rel, "oc {} against an equal-term leaf", $op); // hi `op` (something strictly smaller). let against_smaller: bool = sqlx::query_scalar(&format!( - "SELECT '{hi}'::eql_v3.jsonb_entry {} '{lo}'::eql_v3.jsonb_entry", $op + "SELECT '{hi}'::public.jsonb_entry {} '{lo}'::public.jsonb_entry", $op )).fetch_one(&pool).await?; assert_eq!(against_smaller, $hi_rel, "oc {} against a strictly-smaller leaf", $op); @@ -240,7 +240,7 @@ async fn v3_jsonb_oc_ladder_is_total_order(pool: PgPool) -> anyhow::Result<()> { let lo = oc_entry(w[0]); let hi = oc_entry(w[1]); let ok: bool = sqlx::query_scalar(&format!( - "SELECT '{lo}'::eql_v3.jsonb_entry < '{hi}'::eql_v3.jsonb_entry" + "SELECT '{lo}'::public.jsonb_entry < '{hi}'::public.jsonb_entry" )) .fetch_one(&pool) .await?; @@ -254,7 +254,7 @@ async fn v3_jsonb_oc_ladder_is_total_order(pool: PgPool) -> anyhow::Result<()> { let first = oc_entry(OC_LADDER[0]); let last = oc_entry(OC_LADDER[OC_LADDER.len() - 1]); let end: bool = sqlx::query_scalar(&format!( - "SELECT '{first}'::eql_v3.jsonb_entry < '{last}'::eql_v3.jsonb_entry" + "SELECT '{first}'::public.jsonb_entry < '{last}'::public.jsonb_entry" )) .fetch_one(&pool) .await?; @@ -277,7 +277,7 @@ async fn v3_jsonb_entry_entry_shape_resolves(pool: PgPool) -> anyhow::Result<()> // Each of the six entry operators resolves on (entry, entry) and returns bool. for op in ["=", "<>", "<", "<=", ">", ">="] { let _v: bool = sqlx::query_scalar(&format!( - "SELECT '{a}'::eql_v3.jsonb_entry {op} '{b}'::eql_v3.jsonb_entry" + "SELECT '{a}'::public.jsonb_entry {op} '{b}'::public.jsonb_entry" )) .fetch_one(&pool) .await?; @@ -306,7 +306,7 @@ async fn v3_jsonb_containment_hm_only(pool: PgPool) -> anyhow::Result<()> { let root_hm = root_hm_term(&pool).await?; let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -317,7 +317,7 @@ async fn v3_jsonb_containment_hm_only(pool: PgPool) -> anyhow::Result<()> { // Commutator: jsonb_query <@ json must agree row-for-row. let hits_rev: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::eql_v3.jsonb_query <@ payload" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.jsonb_query <@ payload" )) .fetch_one(&pool) .await?; @@ -337,7 +337,7 @@ async fn v3_jsonb_containment_oc_only(pool: PgPool) -> anyhow::Result<()> { // Row 1 must be among the matches (oc terms can repeat across rows). let row1: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -345,12 +345,12 @@ async fn v3_jsonb_containment_oc_only(pool: PgPool) -> anyhow::Result<()> { // Commutator agreement over the whole table. let fwd: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" )) .fetch_one(&pool) .await?; let rev: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::eql_v3.jsonb_query <@ payload" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.jsonb_query <@ payload" )) .fetch_one(&pool) .await?; @@ -403,7 +403,7 @@ async fn v3_jsonb_containment_mixed(pool: PgPool) -> anyhow::Result<()> { let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm), (SEL_HELLO_OC, "oc", &oc)]); let row1: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -426,7 +426,7 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // Self-containment (json @> json). let self_c: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::eql_v3.json @> '{full}'::eql_v3.json" + "SELECT '{full}'::public.json @> '{full}'::public.json" )) .fetch_one(&pool) .await?; @@ -434,12 +434,12 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // Superset @> subset, and commutator subset <@ superset. let sup: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::eql_v3.json @> '{subset}'::eql_v3.json" + "SELECT '{full}'::public.json @> '{subset}'::public.json" )) .fetch_one(&pool) .await?; let sub: bool = sqlx::query_scalar(&format!( - "SELECT '{subset}'::eql_v3.json <@ '{full}'::eql_v3.json" + "SELECT '{subset}'::public.json <@ '{full}'::public.json" )) .fetch_one(&pool) .await?; @@ -450,7 +450,7 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // Subset does NOT contain superset. let backwards: bool = sqlx::query_scalar(&format!( - "SELECT '{subset}'::eql_v3.json @> '{full}'::eql_v3.json" + "SELECT '{subset}'::public.json @> '{full}'::public.json" )) .fetch_one(&pool) .await?; @@ -459,12 +459,12 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // entry-needle overload (json @> jsonb_entry) + reverse (entry <@ json). let ent = entry(SEL_ROOT_HM, "hm", HM_TERM_FORGED); let by_entry: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::eql_v3.json @> '{ent}'::eql_v3.jsonb_entry" + "SELECT '{full}'::public.json @> '{ent}'::public.jsonb_entry" )) .fetch_one(&pool) .await?; let by_entry_rev: bool = sqlx::query_scalar(&format!( - "SELECT '{ent}'::eql_v3.jsonb_entry <@ '{full}'::eql_v3.json" + "SELECT '{ent}'::public.jsonb_entry <@ '{full}'::public.json" )) .fetch_one(&pool) .await?; @@ -523,7 +523,7 @@ async fn v3_jsonb_raw_helpers_contains_and_contained_by(pool: PgPool) -> anyhow: // The raw helper must agree with the typed `@>` operator (which binds to // eql_v3.ste_vec_contains, not this function) on the same well-formed inputs. let typed: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::eql_v3.json @> '{subset}'::eql_v3.json" + "SELECT '{full}'::public.json @> '{subset}'::public.json" )) .fetch_one(&pool) .await?; @@ -543,7 +543,7 @@ async fn v3_jsonb_raw_helpers_contains_and_contained_by(pool: PgPool) -> anyhow: async fn v3_jsonb_has_ore_cllw_entry_branches(pool: PgPool) -> anyhow::Result<()> { let with_oc = oc_entry(OC_LADDER[0]); let has_oc: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.has_ore_cllw('{with_oc}'::eql_v3.jsonb_entry)" + "SELECT eql_v3.has_ore_cllw('{with_oc}'::public.jsonb_entry)" )) .fetch_one(&pool) .await?; @@ -551,7 +551,7 @@ async fn v3_jsonb_has_ore_cllw_entry_branches(pool: PgPool) -> anyhow::Result<() let hm_only = entry(SEL_ROOT_HM, "hm", HM_TERM_FORGED); let has_no_oc: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.has_ore_cllw('{hm_only}'::eql_v3.jsonb_entry)" + "SELECT eql_v3.has_ore_cllw('{hm_only}'::public.jsonb_entry)" )) .fetch_one(&pool) .await?; @@ -625,7 +625,7 @@ async fn v3_jsonb_containment_rejects_wrong_bytes(pool: PgPool) -> anyhow::Resul let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -637,7 +637,7 @@ async fn v3_jsonb_containment_rejects_wrong_bytes(pool: PgPool) -> anyhow::Resul // Real selector, WRONG hm bytes — must match nothing. let n = needle(&[(SEL_ROOT_HM, "hm", "deadbeefdeadbeefdeadbeefdeadbeef")]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -664,12 +664,12 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R let oc_needle = needle(&[(COLLIDE_SEL, "oc", COLLIDE_TERM)]); let hm_needle = needle(&[(COLLIDE_SEL, "hm", COLLIDE_TERM)]); let collide_accept: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::eql_v3.json @> '{hm_needle}'::eql_v3.jsonb_query" + "SELECT '{hm_doc}'::public.json @> '{hm_needle}'::public.jsonb_query" )) .fetch_one(&pool) .await?; let collide_reject: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::eql_v3.json @> '{oc_needle}'::eql_v3.jsonb_query" + "SELECT '{hm_doc}'::public.json @> '{oc_needle}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -685,7 +685,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -697,7 +697,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R // An `oc`-field needle carrying the real hm term at the hm selector: rejects. let n = needle(&[(SEL_ROOT_HM, "oc", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -715,7 +715,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R .await?; let n2 = needle(&[(SEL_HELLO_OC, "hm", &oc)]); let hits2: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n2}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n2}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -733,7 +733,7 @@ async fn v3_jsonb_containment_rejects_wrong_selector(pool: PgPool) -> anyhow::Re let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -745,7 +745,7 @@ async fn v3_jsonb_containment_rejects_wrong_selector(pool: PgPool) -> anyhow::Re // Right term bytes, but a selector that exists in no fixture row. let n = needle(&[("ffffffffffffffffffffffffffffffff", "hm", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" )) .fetch_one(&pool) .await?; @@ -793,23 +793,23 @@ const NN_DOC: &str = r#"{"i":{},"v":3,"sv":[]}"#; v3_jsonb_supported_null!( // entry comparisons (= <> < <= > >=), NULL on each side - (entry_eq_lhs, "SELECT NULL::eql_v3.jsonb_entry = '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::eql_v3.jsonb_entry"), - (entry_eq_rhs, "SELECT '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::eql_v3.jsonb_entry = NULL::eql_v3.jsonb_entry"), - (entry_neq_lhs, "SELECT NULL::eql_v3.jsonb_entry <> '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::eql_v3.jsonb_entry"), - (entry_lt_lhs, "SELECT NULL::eql_v3.jsonb_entry < '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.jsonb_entry"), - (entry_lte_lhs, "SELECT NULL::eql_v3.jsonb_entry <= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.jsonb_entry"), - (entry_gt_lhs, "SELECT NULL::eql_v3.jsonb_entry > '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.jsonb_entry"), - (entry_gte_lhs, "SELECT NULL::eql_v3.jsonb_entry >= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::eql_v3.jsonb_entry"), + (entry_eq_lhs, "SELECT NULL::public.jsonb_entry = '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.jsonb_entry"), + (entry_eq_rhs, "SELECT '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.jsonb_entry = NULL::public.jsonb_entry"), + (entry_neq_lhs, "SELECT NULL::public.jsonb_entry <> '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.jsonb_entry"), + (entry_lt_lhs, "SELECT NULL::public.jsonb_entry < '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), + (entry_lte_lhs, "SELECT NULL::public.jsonb_entry <= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), + (entry_gt_lhs, "SELECT NULL::public.jsonb_entry > '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), + (entry_gte_lhs, "SELECT NULL::public.jsonb_entry >= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), // document containment: json @> json - (doc_contains_doc_lhs, "SELECT NULL::eql_v3.json @> '{\"i\":{},\"v\":3,\"sv\":[]}'::eql_v3.json"), - (doc_contains_doc_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::eql_v3.json @> NULL::eql_v3.json"), + (doc_contains_doc_lhs, "SELECT NULL::public.json @> '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), + (doc_contains_doc_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.json"), // json @> jsonb_query / json @> jsonb_entry - (doc_contains_query_lhs, "SELECT NULL::eql_v3.json @> '{\"sv\":[]}'::eql_v3.jsonb_query"), - (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::eql_v3.json @> NULL::eql_v3.jsonb_query"), - (doc_contains_entry_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::eql_v3.json @> NULL::eql_v3.jsonb_entry"), + (doc_contains_query_lhs, "SELECT NULL::public.json @> '{\"sv\":[]}'::public.jsonb_query"), + (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.jsonb_query"), + (doc_contains_entry_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.jsonb_entry"), // <@ reverses - (query_contained_lhs, "SELECT NULL::eql_v3.jsonb_query <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::eql_v3.json"), - (entry_contained_lhs, "SELECT NULL::eql_v3.jsonb_entry <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::eql_v3.json"), + (query_contained_lhs, "SELECT NULL::public.jsonb_query <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), + (entry_contained_lhs, "SELECT NULL::public.jsonb_entry <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), ); // The `-> text` / `-> int` / `->> text` accessors return non-boolean types, so @@ -818,19 +818,19 @@ v3_jsonb_supported_null!( #[sqlx::test] async fn v3_jsonb_arrow_accessors_supported_null(pool: PgPool) -> anyhow::Result<()> { let arrow_text: Option = - sqlx::query_scalar("SELECT (NULL::eql_v3.json -> 'x'::text)::jsonb::text") + sqlx::query_scalar("SELECT (NULL::public.json -> 'x'::text)::jsonb::text") .fetch_one(&pool) .await?; assert!(arrow_text.is_none(), "json -> text must propagate NULL"); let arrow_int: Option = - sqlx::query_scalar("SELECT (NULL::eql_v3.json -> 0::integer)::jsonb::text") + sqlx::query_scalar("SELECT (NULL::public.json -> 0::integer)::jsonb::text") .fetch_one(&pool) .await?; assert!(arrow_int.is_none(), "json -> int must propagate NULL"); let arrow_text_text: Option = - sqlx::query_scalar("SELECT NULL::eql_v3.json ->> 'x'::text") + sqlx::query_scalar("SELECT NULL::public.json ->> 'x'::text") .fetch_one(&pool) .await?; assert!( @@ -839,7 +839,7 @@ async fn v3_jsonb_arrow_accessors_supported_null(pool: PgPool) -> anyhow::Result ); let arrow_int_text: Option = - sqlx::query_scalar("SELECT NULL::eql_v3.json ->> 0::integer") + sqlx::query_scalar("SELECT NULL::public.json ->> 0::integer") .fetch_one(&pool) .await?; assert!(arrow_int_text.is_none(), "json ->> int must propagate NULL"); @@ -857,7 +857,7 @@ macro_rules! v3_jsonb_blocker_cases { $( paste::paste! { #[sqlx::test] async fn [](pool: PgPool) -> anyhow::Result<()> { - let lhs = format!("'{}'::eql_v3.json", NN_DOC); + let lhs = format!("'{}'::public.json", NN_DOC); let msg = "is not supported"; // Domain on the left, real-typed RHS — must raise. @@ -866,16 +866,16 @@ macro_rules! v3_jsonb_blocker_cases { // Non-STRICT proof: NULL domain LHS must STILL raise (a STRICT // blocker would short-circuit to NULL and bypass the exception). - let null_lhs = format!("SELECT NULL::eql_v3.json {} {}", $op, $rhs); + let null_lhs = format!("SELECT NULL::public.json {} {}", $op, $rhs); eql_tests::assert_raises(&pool, &null_lhs, &[], msg).await?; // Domain on the RIGHT, only where the surface defines that form. let rhs_dom: Option<&str> = $rhs_domain; if let Some(_) = rhs_dom { - let sql = format!("SELECT {} {} '{}'::eql_v3.json", $rhs, $op, NN_DOC); + let sql = format!("SELECT {} {} '{}'::public.json", $rhs, $op, NN_DOC); eql_tests::assert_raises(&pool, &sql, &[], msg).await?; // Non-STRICT proof for the right-domain form. - let null_rhs = format!("SELECT {} {} NULL::eql_v3.json", $rhs, $op); + let null_rhs = format!("SELECT {} {} NULL::public.json", $rhs, $op); eql_tests::assert_raises(&pool, &null_rhs, &[], msg).await?; } Ok(()) @@ -959,8 +959,8 @@ v3_jsonb_blocker_cases!( #[sqlx::test] async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Result<()> { - let lhs = format!("'{}'::eql_v3.json", NN_DOC); - let rhs = format!("'{}'::eql_v3.json", NN_DOC); + let lhs = format!("'{}'::public.json", NN_DOC); + let rhs = format!("'{}'::public.json", NN_DOC); for op in ["=", "<>", "<", "<=", ">", ">="] { let sql = format!("SELECT {lhs} {op} {rhs}"); eql_tests::assert_raises(&pool, &sql, &[], "is not supported").await?; @@ -970,7 +970,7 @@ async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Resu // D7 (negative control) — pins the domain-flattening rule that makes the typed // RHS in `v3_jsonb_blocker_cases!` LOAD-BEARING (file header, lines 13–20). A -// BARE (unknown-typed) operand flattens `eql_v3.json` to native `jsonb`, so the +// BARE (unknown-typed) operand flattens `public.json` to native `jsonb`, so the // SAME operator that RAISES with a typed RHS in D7 must SUCCEED here — resolving // to native and returning a value, never reaching our blocker. Without this, the // `::text` / `::jsonb` typing in D7 could silently become unnecessary (or, worse, @@ -978,7 +978,7 @@ async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Resu // would notice. See the "Typed operands" caveat in `docs/reference/json-support.md`. #[sqlx::test] async fn v3_jsonb_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Result<()> { - let doc = format!("'{}'::eql_v3.json", NN_DOC); + let doc = format!("'{}'::public.json", NN_DOC); // `?` is blocked with a typed RHS in D7 (`question`). Bare `'sv'` is unknown // -> native `jsonb ? text` -> top-level key present -> TRUE, no raise. @@ -1027,7 +1027,7 @@ async fn v3_jsonb_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Resul // D7 (negative control, finding #1) — the `->`/`->>` SUPPORTED operators are the // DANGEROUS face of domain-flattening. Unlike the blockers above (typed RHS // RAISES, bare RHS merely succeeds-as-native), `->`/`->>` SILENTLY return a WRONG -// answer for a bare untyped selector: `doc -> 'sel'` flattens `eql_v3.json` to +// answer for a bare untyped selector: `doc -> 'sel'` flattens `public.json` to // native `jsonb -> text` (a root-key lookup on the envelope), NOT the v3 // selector-lookup operator. This pins BOTH which operator binds (`pg_typeof`) and // the user-visible divergence, so a future resolution change in either direction @@ -1040,7 +1040,7 @@ async fn v3_jsonb_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Resul // "Typed operands" caveat in `docs/reference/json-support.md`. #[sqlx::test] async fn v3_jsonb_arrow_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Result<()> { - let doc = format!("'{}'::eql_v3.json", NN_DOC); + let doc = format!("'{}'::public.json", NN_DOC); // --- `->` : which operator binds? ------------------------------------- // Bare selector -> NATIVE `jsonb -> text` (result type is `jsonb`). @@ -1050,15 +1050,15 @@ async fn v3_jsonb_arrow_bare_operand_flattens_to_native(pool: PgPool) -> anyhow: assert_eq!( bare_ty, "jsonb", "bare `->` must flatten to native `jsonb -> text`; binding the v3 operator \ - (eql_v3.jsonb_entry) here would mean the domain-flattening contract changed" + (public.jsonb_entry) here would mean the domain-flattening contract changed" ); - // Typed selector -> the v3 operator (result type is `eql_v3.jsonb_entry`). + // Typed selector -> the v3 operator (result type is `public.jsonb_entry`). let typed_ty: String = sqlx::query_scalar(&format!("SELECT pg_typeof({doc} -> 'sv'::text)::text")) .fetch_one(&pool) .await?; - assert_eq!( - typed_ty, "eql_v3.jsonb_entry", + assert!( + matches!(typed_ty.as_str(), "public.jsonb_entry" | "jsonb_entry"), "typed `-> 'sv'::text` must bind the v3 selector-lookup operator" ); @@ -1130,7 +1130,7 @@ macro_rules! v3_jsonb_payload_reject { v3_jsonb_payload_reject!( v3_jsonb_json_payload_check, - "eql_v3.json", + "public.json", [ "[]", // non-object "{\"v\":3,\"sv\":[]}", // missing i @@ -1148,7 +1148,7 @@ v3_jsonb_payload_reject!( v3_jsonb_payload_reject!( v3_jsonb_ste_vec_entry_payload_check, - "eql_v3.jsonb_entry", + "public.jsonb_entry", [ "[]", // non-object "{\"s\":\"x\",\"hm\":\"00\"}", // missing c @@ -1164,7 +1164,7 @@ v3_jsonb_payload_reject!( v3_jsonb_payload_reject!( v3_jsonb_ste_vec_query_payload_check, - "eql_v3.jsonb_query", + "public.jsonb_query", [ "[]", // non-object "{\"sv\":{}}", // sv not an array @@ -1183,18 +1183,18 @@ v3_jsonb_payload_reject!( #[sqlx::test] async fn v3_jsonb_payload_check_accepts_valid(pool: PgPool) -> anyhow::Result<()> { let ok_doc: bool = - sqlx::query_scalar("SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::eql_v3.json IS NOT NULL") + sqlx::query_scalar("SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json IS NOT NULL") .fetch_one(&pool) .await?; assert!(ok_doc); let ok_entry: bool = sqlx::query_scalar( - "SELECT '{\"s\":\"x\",\"c\":\"y\",\"hm\":\"00\"}'::eql_v3.jsonb_entry IS NOT NULL", + "SELECT '{\"s\":\"x\",\"c\":\"y\",\"hm\":\"00\"}'::public.jsonb_entry IS NOT NULL", ) .fetch_one(&pool) .await?; assert!(ok_entry); let ok_query: bool = sqlx::query_scalar( - "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"00\"}]}'::eql_v3.jsonb_query IS NOT NULL", + "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"00\"}]}'::public.jsonb_query IS NOT NULL", ) .fetch_one(&pool) .await?; @@ -1204,7 +1204,7 @@ async fn v3_jsonb_payload_check_accepts_valid(pool: PgPool) -> anyhow::Result<() /// D9 — the cipherstash-client SteVec envelope SHAPE (the extra top-level /// `k:"sv"` the generator emits, plus the per-entry `a` array marker) must pass -/// the `eql_v3.json` domain CHECK. The static fixture lacked `k`; the generated +/// the `public.json` domain CHECK. The static fixture lacked `k`; the generated /// fixture carries it, so this guards the generated fixture against a CHECK /// rejection independently of live encryption (no creds, no fixture load). #[sqlx::test] @@ -1216,12 +1216,12 @@ async fn v3_jsonb_generator_envelope_shape_accepted(pool: PgPool) -> anyhow::Res {"s":"3a114ad13d25b030f41175114347de59","c":"ct","oc":"00010203","a":false} ] }"#; - let ok: bool = sqlx::query_scalar(&format!("SELECT '{envelope}'::eql_v3.json IS NOT NULL")) + let ok: bool = sqlx::query_scalar(&format!("SELECT '{envelope}'::public.json IS NOT NULL")) .fetch_one(&pool) .await?; assert!( ok, - "cipherstash SteVec envelope (root k:\"sv\" + per-entry a) must pass the eql_v3.json CHECK" + "cipherstash SteVec envelope (root k:\"sv\" + per-entry a) must pass the public.json CHECK" ); Ok(()) } @@ -1243,14 +1243,14 @@ async fn v3_jsonb_path_query_match_and_miss(pool: PgPool) -> anyhow::Result<()> let d = array_doc(); // Matching selector returns exactly one entry row, whose selector is 'aa'. let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::eql_v3.json::jsonb, 'aa')" + "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::public.json::jsonb, 'aa')" )) .fetch_one(&pool) .await?; assert_eq!(hits, 1, "one entry matches selector 'aa'"); let sel: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_path_query('{d}'::eql_v3.json::jsonb, 'aa') AS e" + "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_path_query('{d}'::public.json::jsonb, 'aa') AS e" )) .fetch_one(&pool) .await?; @@ -1258,7 +1258,7 @@ async fn v3_jsonb_path_query_match_and_miss(pool: PgPool) -> anyhow::Result<()> // Missing selector returns an empty set. let miss: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::eql_v3.json::jsonb, 'zz')" + "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::public.json::jsonb, 'zz')" )) .fetch_one(&pool) .await?; @@ -1270,14 +1270,14 @@ async fn v3_jsonb_path_query_match_and_miss(pool: PgPool) -> anyhow::Result<()> async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { let d = array_doc(); let exists: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.jsonb_path_exists('{d}'::eql_v3.json::jsonb, 'bb')" + "SELECT eql_v3.jsonb_path_exists('{d}'::public.json::jsonb, 'bb')" )) .fetch_one(&pool) .await?; assert!(exists, "selector 'bb' exists"); let missing: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.jsonb_path_exists('{d}'::eql_v3.json::jsonb, 'zz')" + "SELECT eql_v3.jsonb_path_exists('{d}'::public.json::jsonb, 'zz')" )) .fetch_one(&pool) .await?; @@ -1285,7 +1285,7 @@ async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { // query_first returns the matching entry (selector 'bb'). let first_sel: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::eql_v3.json::jsonb, 'bb'))" + "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::public.json::jsonb, 'bb'))" )) .fetch_one(&pool) .await?; @@ -1293,7 +1293,7 @@ async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { // query_first on a miss returns NULL. let first_miss: Option = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::eql_v3.json::jsonb, 'zz'))" + "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::public.json::jsonb, 'zz'))" )) .fetch_one(&pool) .await?; @@ -1305,30 +1305,30 @@ async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { async fn v3_jsonb_array_length_and_elements(pool: PgPool) -> anyhow::Result<()> { let d = array_doc(); let len: i32 = sqlx::query_scalar(&format!( - "SELECT eql_v3.jsonb_array_length('{d}'::eql_v3.json::jsonb)" + "SELECT eql_v3.jsonb_array_length('{d}'::public.json::jsonb)" )) .fetch_one(&pool) .await?; assert_eq!(len, 2, "array doc has two elements"); let n: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_array_elements('{d}'::eql_v3.json::jsonb)" + "SELECT count(*) FROM eql_v3.jsonb_array_elements('{d}'::public.json::jsonb)" )) .fetch_one(&pool) .await?; assert_eq!(n, 2, "jsonb_array_elements yields one row per element"); - // jsonb_array_elements returns SETOF eql_v3.jsonb_entry — the rows are + // jsonb_array_elements returns SETOF public.jsonb_entry — the rows are // valid entries (the entry extractor accepts them). let sels: Vec = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_array_elements('{d}'::eql_v3.json::jsonb) AS e ORDER BY 1" + "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_array_elements('{d}'::public.json::jsonb) AS e ORDER BY 1" )) .fetch_all(&pool) .await?; assert_eq!(sels, vec!["aa".to_string(), "bb".to_string()]); let texts: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_array_elements_text('{d}'::eql_v3.json::jsonb)" + "SELECT count(*) FROM eql_v3.jsonb_array_elements_text('{d}'::public.json::jsonb)" )) .fetch_one(&pool) .await?; @@ -1340,11 +1340,11 @@ async fn v3_jsonb_array_length_and_elements(pool: PgPool) -> anyhow::Result<()> async fn v3_jsonb_array_length_non_array_raises(pool: PgPool) -> anyhow::Result<()> { // A document WITHOUT the `a:true` array flag is not an array. let not_array = r#"{"i":{},"v":3,"sv":[{"s":"aa","c":"x","hm":"00"}]}"#; - let sql = format!("SELECT eql_v3.jsonb_array_length('{not_array}'::eql_v3.json::jsonb)"); + let sql = format!("SELECT eql_v3.jsonb_array_length('{not_array}'::public.json::jsonb)"); eql_tests::assert_raises(&pool, &sql, &[], "non-array").await?; let sql2 = format!( - "SELECT count(*) FROM eql_v3.jsonb_array_elements('{not_array}'::eql_v3.json::jsonb)" + "SELECT count(*) FROM eql_v3.jsonb_array_elements('{not_array}'::public.json::jsonb)" ); eql_tests::assert_raises(&pool, &sql2, &[], "non-array").await?; Ok(()) @@ -1371,7 +1371,7 @@ async fn v3_jsonb_index_to_ste_vec_query_gin_engages(pool: PgPool) -> anyhow::Re let root_hm = root_hm_term(&pool).await?; let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let query = - format!("SELECT id FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.jsonb_query"); + format!("SELECT id FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query"); assert_index_scan_uses( &mut *tx, &query, @@ -1451,19 +1451,19 @@ async fn v3_jsonb_to_ste_vec_query_gin_is_cost_chosen(pool: PgPool) -> anyhow::R ); let mut tx = pool.begin().await?; - sqlx::query("CREATE TEMP TABLE v3_jsonb_scale (payload eql_v3.json) ON COMMIT DROP") + sqlx::query("CREATE TEMP TABLE v3_jsonb_scale (payload public.json) ON COMMIT DROP") .execute(&mut *tx) .await?; // The bulk: 5000 copies of the filler document. sqlx::query( "INSERT INTO v3_jsonb_scale(payload) \ - SELECT $1::jsonb::eql_v3.json FROM generate_series(1, 5000)", + SELECT $1::jsonb::public.json FROM generate_series(1, 5000)", ) .bind(&filler_payload) .execute(&mut *tx) .await?; // The single selective pivot document. - sqlx::query("INSERT INTO v3_jsonb_scale(payload) VALUES ($1::jsonb::eql_v3.json)") + sqlx::query("INSERT INTO v3_jsonb_scale(payload) VALUES ($1::jsonb::public.json)") .bind(&pivot_payload) .execute(&mut *tx) .await?; @@ -1483,7 +1483,7 @@ async fn v3_jsonb_to_ste_vec_query_gin_is_cost_chosen(pool: PgPool) -> anyhow::R // oc, exactly the single pivot row contains it. let n = needle(&[(SEL_HELLO_OC, "oc", &pivot_oc)]); let query = - format!("SELECT count(*) FROM v3_jsonb_scale WHERE payload @> '{n}'::eql_v3.jsonb_query"); + format!("SELECT count(*) FROM v3_jsonb_scale WHERE payload @> '{n}'::public.jsonb_query"); assert_index_scan_uses( &mut *tx, &query, @@ -1552,20 +1552,20 @@ async fn v3_jsonb_arrow_integer_index_on_array(pool: PgPool) -> anyhow::Result<( // `-> 0` / `-> 1` index the sv array positionally (native jsonb path), not a // selector lookup. Selectors come out in array order. let i0: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector('{d}'::eql_v3.json -> 0::integer)" + "SELECT eql_v3.selector('{d}'::public.json -> 0::integer)" )) .fetch_one(&pool) .await?; assert_eq!(i0, "aa", "-> 0 must index the first sv element"); let i1: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector('{d}'::eql_v3.json -> 1::integer)" + "SELECT eql_v3.selector('{d}'::public.json -> 1::integer)" )) .fetch_one(&pool) .await?; assert_eq!(i1, "bb", "-> 1 must index the second sv element"); - let t1: String = sqlx::query_scalar(&format!("SELECT '{d}'::eql_v3.json ->> 1::integer")) + let t1: String = sqlx::query_scalar(&format!("SELECT '{d}'::public.json ->> 1::integer")) .fetch_one(&pool) .await?; assert!( @@ -1576,7 +1576,7 @@ async fn v3_jsonb_arrow_integer_index_on_array(pool: PgPool) -> anyhow::Result<( // Regression: `-> 'sv'::text` is a SELECTOR lookup (our text operator), NOT // native key access — there is no element with selector 'sv', so NULL. let sv_lookup: Option = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector('{d}'::eql_v3.json -> 'sv'::text)" + "SELECT eql_v3.selector('{d}'::public.json -> 'sv'::text)" )) .fetch_one(&pool) .await?; @@ -1618,8 +1618,8 @@ async fn v3_jsonb_entry_operators_declare_commutator_negator(pool: PgPool) -> an FROM pg_operator o LEFT JOIN pg_operator com ON com.oid = o.oprcom LEFT JOIN pg_operator neg ON neg.oid = o.oprnegate - WHERE o.oprleft = 'eql_v3.jsonb_entry'::regtype - AND o.oprright = 'eql_v3.jsonb_entry'::regtype + WHERE o.oprleft = 'public.jsonb_entry'::regtype + AND o.oprright = 'public.jsonb_entry'::regtype ORDER BY o.oprname "#, ) @@ -1663,8 +1663,8 @@ async fn v3_jsonb_entry_eq_does_not_declare_hashes_or_merges(pool: PgPool) -> an SELECT oprcanhash, oprcanmerge FROM pg_operator WHERE oprname = '=' - AND oprleft = 'eql_v3.jsonb_entry'::regtype - AND oprright = 'eql_v3.jsonb_entry'::regtype + AND oprleft = 'public.jsonb_entry'::regtype + AND oprright = 'public.jsonb_entry'::regtype "#, ) .fetch_one(&pool) diff --git a/tests/sqlx/tests/v3_operator_equivalents_tests.rs b/tests/sqlx/tests/v3_operator_equivalents_tests.rs index 0b035a79b..74aa9d0ca 100644 --- a/tests/sqlx/tests/v3_operator_equivalents_tests.rs +++ b/tests/sqlx/tests/v3_operator_equivalents_tests.rs @@ -120,8 +120,8 @@ async fn core_public_function_equivalents_exist_in_eql_v3(pool: PgPool) -> Resul /// #3 — Guard the split's other half: the pieces that MUST stay internal remain /// in `eql_v3_internal` (never leak into the public surface). Blockers, aggregate -/// state functions, index-term type constructors, and CHECK validators are -/// implementation detail, not caller entrypoints. +/// state functions, and index-term type constructors are implementation detail, +/// not caller entrypoints. #[sqlx::test] async fn internal_only_helpers_stay_out_of_eql_v3(pool: PgPool) -> Result<()> { // Names that must NOT appear as functions in the public schema. @@ -130,7 +130,6 @@ async fn internal_only_helpers_stay_out_of_eql_v3(pool: PgPool) -> Result<()> { "max_sfunc", "jsonb_entry_min_sfunc", "jsonb_entry_max_sfunc", - "is_valid_ste_vec_entry_payload", "is_ste_vec_array", "compare_ore_cllw_term", "ore_block_256_eq", diff --git a/tests/sqlx/tests/v3_privilege_tests.rs b/tests/sqlx/tests/v3_privilege_tests.rs index 997225fff..cbf5fb5ef 100644 --- a/tests/sqlx/tests/v3_privilege_tests.rs +++ b/tests/sqlx/tests/v3_privilege_tests.rs @@ -11,9 +11,10 @@ //! //! Not every path crosses the boundary, and the tests below pin the difference: //! the hand-written jsonb (SteVec) `ste_vec_contains` read path is `plpgsql` -//! (never inlined) and runs under the public grant alone, whereas *casting* raw -//! jsonb to `eql_v3.json` fires the domain CHECK → `eql_v3_internal` -//! `is_valid_ste_vec_document_payload` and does require the internal grant. +//! (never inlined) and runs under the public grant alone. Casting raw jsonb to +//! `public.json` also stays outside `eql_v3_internal`: the domain CHECK calls +//! public validators so application table columns can survive EQL schema +//! uninstall without dependency edges back into the droppable schemas. //! //! The `#[sqlx::test]` harness runs as a cluster superuser, so it can //! `CREATE ROLE` / `SET ROLE`. Roles are cluster-global (not per-database), so @@ -30,22 +31,22 @@ use sqlx::PgPool; /// constructor — inlined into the query, that constructor call requires the /// caller to hold `eql_v3_internal`, so the path exercises BOTH schemas. const EQ_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer \ - WHERE payload::eql_v3.integer_eq = payload::eql_v3.integer_eq"; + WHERE payload::public.integer_eq = payload::public.integer_eq"; /// A real ordering query using the `<` *operator* on `integer_ord`, which dispatches /// through `eql_v3.lt` → `eql_v3.ord_term` → the `eql_v3_internal.ore_block_256` -/// constructor + comparator. NB: `ORDER BY payload::eql_v3.integer_ord` alone does +/// constructor + comparator. NB: `ORDER BY payload::public.integer_ord` alone does /// NOT work here — a bare domain has no ORE opclass, so it silently falls back to /// built-in jsonb ordering and never crosses into `eql_v3_internal`. The `<` /// operator is what genuinely exercises the encrypted ordering path. const ORD_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer a, fixtures.eql_v3_integer b \ - WHERE a.payload::eql_v3.integer_ord < b.payload::eql_v3.integer_ord"; + WHERE a.payload::public.integer_ord < b.payload::public.integer_ord"; /// A real aggregate (`eql_v3.min` on `integer_ord`). The public aggregate dispatches /// into its state function `eql_v3_internal.min_sfunc`, so it requires the /// internal grant. -const AGG_QUERY: &str = "SELECT eql_v3.min(payload::eql_v3.integer_ord) \ +const AGG_QUERY: &str = "SELECT eql_v3.min(payload::public.integer_ord) \ FROM fixtures.eql_v3_integer"; /// A real jsonb (SteVec) containment READ path. `eql_v3.ste_vec_contains` is @@ -54,10 +55,10 @@ const AGG_QUERY: &str = "SELECT eql_v3.min(payload::eql_v3.integer_ord) \ const JSONB_READ_QUERY: &str = "SELECT eql_v3.ste_vec_contains(payload, payload) \ FROM fixtures.v3_ste_vec LIMIT 1"; -/// A real jsonb WRITE path: casting raw jsonb to the `eql_v3.json` domain fires -/// the domain CHECK, which calls `eql_v3_internal.is_valid_ste_vec_document_payload` -/// — so, unlike the containment read, this crosses into `eql_v3_internal`. -const JSONB_WRITE_QUERY: &str = "SELECT (payload::jsonb)::eql_v3.json \ +/// A real jsonb WRITE path: casting raw jsonb to the `public.json` domain fires +/// the domain CHECK, which calls public validators and does not cross into +/// `eql_v3_internal`. +const JSONB_WRITE_QUERY: &str = "SELECT (payload::jsonb)::public.json \ FROM fixtures.v3_ste_vec LIMIT 1"; /// Derive a unique, valid role name from the per-test database name so parallel @@ -240,11 +241,11 @@ async fn runtime_role_without_internal_grant_is_denied(pool: PgPool) -> Result<( } // ============================================================================ -// jsonb (SteVec) surface — read path is public-only; write/validate path is not +// jsonb (SteVec) surface — read and write/validate paths avoid eql_v3_internal // ============================================================================ /// Positive (jsonb): a runtime role granted USAGE + EXECUTE on BOTH schemas can -/// run both the SteVec containment read and the `eql_v3.json` cast (write) path. +/// run both the SteVec containment read and the `public.json` cast (write) path. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn runtime_role_with_both_schema_grants_can_query_jsonb(pool: PgPool) -> Result<()> { let mut conn = pool.acquire().await?; @@ -266,8 +267,8 @@ async fn runtime_role_with_both_schema_grants_can_query_jsonb(pool: PgPool) -> R "a SteVec document contains itself; containment should return true under the runtime role" ); - // Cast (write) path fires the eql_v3_internal CHECK validator; must succeed - // when the internal grant is present. + // Cast (write) path fires the public CHECK validator and succeeds with the + // full runtime grants. sqlx::query(JSONB_WRITE_QUERY).fetch_one(&mut *conn).await?; sqlx::query("RESET ROLE").execute(&mut *conn).await?; @@ -276,11 +277,9 @@ async fn runtime_role_with_both_schema_grants_can_query_jsonb(pool: PgPool) -> R } /// Boundary (jsonb): a runtime role granted only the PUBLIC schema (`eql_v3`) -/// characterises the SteVec split precisely — the `plpgsql` containment READ -/// runs under the public grant alone, but casting raw jsonb to `eql_v3.json` -/// fires the domain CHECK → `eql_v3_internal.is_valid_ste_vec_document_payload` -/// and is denied. Pins that the SteVec CHECK validators are genuinely internal -/// (the write/validate path cannot be reached with the public grant only). +/// characterises the SteVec split precisely — both the `plpgsql` containment +/// READ and the `public.json` domain CHECK validator path run without the +/// internal grant. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn runtime_role_without_internal_grant_jsonb_boundary(pool: PgPool) -> Result<()> { let mut conn = pool.acquire().await?; @@ -303,12 +302,9 @@ async fn runtime_role_without_internal_grant_jsonb_boundary(pool: PgPool) -> Res "SteVec containment read should succeed with the public eql_v3 grant alone" ); - // Write/validate path: denied without eql_v3_internal (CHECK validator). - let err = sqlx::query(JSONB_WRITE_QUERY) - .fetch_one(&mut *conn) - .await - .expect_err("cast to eql_v3.json must be denied without eql_v3_internal grant"); - assert_insufficient_privilege(err, "eql_v3.json cast"); + // Write/validate path: allowed without eql_v3_internal because CHECK + // validators live in public and are not EQL-owned schema dependencies. + sqlx::query(JSONB_WRITE_QUERY).fetch_one(&mut *conn).await?; sqlx::query("RESET ROLE").execute(&mut *conn).await?; drop_role(&mut conn, &role).await?; diff --git a/tests/sqlx/tests/v3_public_surface_tests.rs b/tests/sqlx/tests/v3_public_surface_tests.rs index 0a8ca629d..2c439c8e2 100644 --- a/tests/sqlx/tests/v3_public_surface_tests.rs +++ b/tests/sqlx/tests/v3_public_surface_tests.rs @@ -251,6 +251,66 @@ async fn user_column_domains_absent_from_eql_owned_schemas(pool: PgPool) -> Resu Ok(()) } +/// #2 — Dependency invariant: public user-column domain CHECK constraints do not +/// depend on objects in droppable EQL-owned schemas. Otherwise an EQL uninstall +/// can still cascade into application table columns even when the domain type +/// itself lives in `public`. +#[sqlx::test] +async fn public_user_domain_constraints_do_not_depend_on_eql_owned_schemas( + pool: PgPool, +) -> Result<()> { + let textual_refs: Vec = sqlx::query_scalar( + r#" + SELECT format('%I.%I.%I: %s', tn.nspname, t.typname, c.conname, + pg_catalog.pg_get_constraintdef(c.oid)) + FROM pg_catalog.pg_constraint c + JOIN pg_catalog.pg_type t ON t.oid = c.contypid + JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace + WHERE tn.nspname = 'public' + AND t.typtype = 'd' + AND t.typname = ANY($1) + AND pg_catalog.pg_get_constraintdef(c.oid) ~ '\m(eql_v3|eql_v3_internal)\.' + ORDER BY 1 + "#, + ) + .bind(user_domain_names()) + .fetch_all(&pool) + .await?; + assert!( + textual_refs.is_empty(), + "public user-domain CHECK constraint(s) reference EQL-owned schemas: {textual_refs:?}" + ); + + let dependency_refs: Vec = sqlx::query_scalar( + r#" + SELECT format('%I.%I.%I depends on function %I.%I(%s)', + tn.nspname, t.typname, c.conname, + pn.nspname, p.proname, + pg_catalog.pg_get_function_identity_arguments(p.oid)) + FROM pg_catalog.pg_constraint c + JOIN pg_catalog.pg_type t ON t.oid = c.contypid + JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace + JOIN pg_catalog.pg_depend d ON d.classid = 'pg_constraint'::regclass + AND d.objid = c.oid + JOIN pg_catalog.pg_proc p ON p.oid = d.refobjid + JOIN pg_catalog.pg_namespace pn ON pn.oid = p.pronamespace + WHERE tn.nspname = 'public' + AND t.typtype = 'd' + AND t.typname = ANY($1) + AND pn.nspname IN ('eql_v3', 'eql_v3_internal') + ORDER BY 1 + "#, + ) + .bind(user_domain_names()) + .fetch_all(&pool) + .await?; + assert!( + dependency_refs.is_empty(), + "public user-domain CHECK constraint(s) depend on EQL-owned functions: {dependency_refs:?}" + ); + Ok(()) +} + /// #2 — Placement invariant: SEM index-term types remain internal. These are /// transient implementation types used by extractors, indexes, and comparator /// functions; exposing them as user-column domains would leak implementation diff --git a/tests/sqlx/tests/v3_text_empty_constraint_tests.rs b/tests/sqlx/tests/v3_text_empty_constraint_tests.rs index 2022b705e..c0560c603 100644 --- a/tests/sqlx/tests/v3_text_empty_constraint_tests.rs +++ b/tests/sqlx/tests/v3_text_empty_constraint_tests.rs @@ -5,7 +5,7 @@ //! (`ob: []`, verified against cipherstash-client) — the only value that does. //! Rather than ordering such a degenerate term, the ORE-bearing domains reject //! it at the boundary: their `CHECK` requires `ob` to be a non-empty array, so -//! casting an empty-`ob` payload to `eql_v3.text_ord` / `eql_v3.text_ord_ore` +//! casting an empty-`ob` payload to `public.text_ord` / `public.text_ord_ore` //! fails with a check violation (SQLSTATE `23514`). The comparator's //! "empty sorts first" cardinality guard remains in place as defense-in-depth //! for any path that bypasses the domain (e.g. a composite built directly). @@ -21,12 +21,12 @@ use anyhow::Result; use eql_tests::assert_db_error; use sqlx::PgPool; -/// Casting the empty-string row (`id = 1`, `ob: []`) to `eql_v3.text_ord` is +/// Casting the empty-string row (`id = 1`, `ob: []`) to `public.text_ord` is /// rejected by the domain's non-empty-`ob` CHECK. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] async fn empty_string_rejected_by_text_ord(pool: PgPool) -> Result<()> { let err = - sqlx::query("SELECT payload::eql_v3.text_ord FROM fixtures.v3_text_empty WHERE id = 1") + sqlx::query("SELECT payload::public.text_ord FROM fixtures.v3_text_empty WHERE id = 1") .fetch_all(&pool) .await .expect_err("empty ORE term (ob: []) must violate the text_ord CHECK"); @@ -35,11 +35,11 @@ async fn empty_string_rejected_by_text_ord(pool: PgPool) -> Result<()> { Ok(()) } -/// Same rejection for the `eql_v3.text_ord_ore` domain. +/// Same rejection for the `public.text_ord_ore` domain. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] async fn empty_string_rejected_by_text_ord_ore(pool: PgPool) -> Result<()> { let err = - sqlx::query("SELECT payload::eql_v3.text_ord_ore FROM fixtures.v3_text_empty WHERE id = 1") + sqlx::query("SELECT payload::public.text_ord_ore FROM fixtures.v3_text_empty WHERE id = 1") .fetch_all(&pool) .await .expect_err("empty ORE term (ob: []) must violate the text_ord_ore CHECK"); @@ -48,13 +48,13 @@ async fn empty_string_rejected_by_text_ord_ore(pool: PgPool) -> Result<()> { } /// The non-empty controls (`"frank"`, `"zebra"`) carry a real `ob` array, so -/// they cast cleanly into `eql_v3.text_ord` — the CHECK only rejects the empty +/// they cast cleanly into `public.text_ord` — the CHECK only rejects the empty /// term, not ordered text in general. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] async fn non_empty_controls_accepted_by_text_ord(pool: PgPool) -> Result<()> { let plaintexts: Vec = sqlx::query_scalar( "SELECT plaintext FROM fixtures.v3_text_empty \ - WHERE id IN (2, 3) AND payload::eql_v3.text_ord IS NOT NULL \ + WHERE id IN (2, 3) AND payload::public.text_ord IS NOT NULL \ ORDER BY id", ) .fetch_all(&pool) @@ -74,7 +74,7 @@ async fn non_empty_controls_order_under_text_ord(pool: PgPool) -> Result<()> { let plaintexts: Vec = sqlx::query_scalar( "SELECT plaintext FROM fixtures.v3_text_empty \ WHERE id IN (2, 3) \ - ORDER BY eql_v3.ord_term(payload::eql_v3.text_ord) ASC", + ORDER BY eql_v3.ord_term(payload::public.text_ord) ASC", ) .fetch_all(&pool) .await?; diff --git a/tests/sqlx/tests/v3_uninstall_tests.rs b/tests/sqlx/tests/v3_uninstall_tests.rs index 301582983..8f4322f18 100644 --- a/tests/sqlx/tests/v3_uninstall_tests.rs +++ b/tests/sqlx/tests/v3_uninstall_tests.rs @@ -21,6 +21,7 @@ use sqlx::PgPool; /// `tasks/build.sh` produces it by appending `tasks/uninstall-v3.sql` verbatim, /// so this file IS the shipped teardown. const UNINSTALLER: &str = "../../release/cipherstash-encrypt-uninstall.sql"; +const INSTALLER: &str = "../../release/cipherstash-encrypt.sql"; async fn schema_count(pool: &PgPool) -> Result { let n: i64 = sqlx::query_scalar( @@ -43,6 +44,18 @@ async fn run_shipped_uninstaller(pool: &PgPool) -> Result<()> { Ok(()) } +async fn run_shipped_installer(pool: &PgPool) -> Result<()> { + let install_sql = std::fs::read_to_string(INSTALLER).unwrap_or_else(|e| { + panic!( + "failed to read shipped installer {INSTALLER}: {e} — run `mise run build` \ + (or, in CI, ensure the nextest-archive artifact shipped release/*.sql)" + ) + }); + + sqlx::raw_sql(&install_sql).execute(pool).await?; + Ok(()) +} + async fn table_exists(pool: &PgPool, table: &str) -> Result { let exists: bool = sqlx::query_scalar( r#" @@ -62,6 +75,10 @@ async fn table_exists(pool: &PgPool, table: &str) -> Result { Ok(exists) } +fn normalize_regtype_name(name: String) -> String { + name.replace("public.\"json\"", "public.json") +} + #[sqlx::test] async fn uninstaller_drops_both_schemas(pool: PgPool) -> Result<()> { // Sanity: the migration installed both schemas, so the teardown has @@ -103,6 +120,52 @@ async fn uninstaller_drops_both_schemas(pool: PgPool) -> Result<()> { Ok(()) } +#[sqlx::test] +async fn shipped_installer_can_run_over_existing_public_domains(pool: PgPool) -> Result<()> { + assert_eq!( + schema_count(&pool).await?, + 2, + "expected both eql_v3 schemas installed by the migration before repeat install" + ); + + run_shipped_installer(&pool).await?; + + assert_eq!( + schema_count(&pool).await?, + 2, + "repeat install must recreate both EQL-owned schemas" + ); + + let mut public_domains: Vec = sqlx::query_scalar( + r#" + SELECT format('%I.%I', n.nspname, t.typname) + FROM pg_catalog.pg_type t + JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE n.nspname = 'public' + AND t.typname IN ('integer_eq', 'json', 'jsonb_entry', 'jsonb_query') + ORDER BY 1 + "#, + ) + .fetch_all(&pool) + .await? + .into_iter() + .map(normalize_regtype_name) + .collect(); + public_domains.sort(); + assert_eq!( + public_domains, + vec![ + "public.integer_eq", + "public.json", + "public.jsonb_entry", + "public.jsonb_query", + ], + "repeat install must keep public user-column domains available" + ); + + Ok(()) +} + #[sqlx::test] async fn uninstaller_preserves_application_tables_with_public_domain_columns( pool: PgPool, @@ -187,7 +250,10 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( "#, ) .fetch_all(&pool) - .await?; + .await? + .into_iter() + .map(normalize_regtype_name) + .collect(); assert_eq!( column_types, vec![ From ee2d531dc4423e4f280de792e0bab9e35d7f4721 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Sun, 5 Jul 2026 22:34:07 +1000 Subject: [PATCH 520/599] fix: update sqlx test domain casts --- tests/sqlx/src/scalar_domains.rs | 14 ++++++------ .../tests/encrypted_domain/family/support.rs | 2 +- .../tests/encrypted_domain/ope/support.rs | 16 +++++++------- .../property/cross_ciphertext.rs | 2 +- tests/sqlx/tests/encrypted_domain/signed.rs | 2 +- .../sqlx/tests/ore_block_comparator_tests.rs | 22 +++++++++---------- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/sqlx/src/scalar_domains.rs b/tests/sqlx/src/scalar_domains.rs index 89f762805..ff7271ade 100644 --- a/tests/sqlx/src/scalar_domains.rs +++ b/tests/sqlx/src/scalar_domains.rs @@ -4,14 +4,14 @@ //! double) is one ` => ` line in the `scalar_types!` list //! (`scalar_types.rs`) plus an `EqlPlaintext` impl and a catalog row. //! The `impl ScalarType` below is generated from that list. Everything -//! else — the four `eql_v3_{,_eq,_ord,_ord_ore}` domains, per-domain +//! else — the four `public.{,_eq,_ord,_ord_ore}` domains, per-domain //! payload shapes, supported operators, index extractor expressions, //! ground-truth result sets — is derived from `T::PG_TYPE`, //! `T::fixture_values()`, and the `Variant` enum. //! //! # Plaintext oracle columns: `PG_TYPE` vs `PLAINTEXT_SQL_TYPE` //! -//! EQL stores encrypted values as **jsonb**: every `eql_v3.*` domain is +//! EQL stores encrypted values as **jsonb**: every `public.*` domain is //! `CREATE DOMAIN … AS jsonb`, and the ciphertext + index terms live inside the //! JSON payload. No concrete Postgres scalar type appears in the product at all. //! @@ -27,7 +27,7 @@ //! play: //! //! - [`ScalarType::PG_TYPE`] — the **EQL domain token / identifier**: the suffix -//! in the SQL domain name (`eql_v3._ord`) and the fixture table name +//! in the SQL domain name (`public._ord`) and the fixture table name //! (`fixtures.eql_v3_`), plus capability lookups. Never a plaintext //! column type. //! - [`ScalarType::PLAINTEXT_SQL_TYPE`] — the **actual Postgres storage type** @@ -90,7 +90,7 @@ pub trait ScalarType: + sqlx::Type { /// The EQL domain token / identifier — the suffix in the SQL domain name - /// (`eql_v3._ord`) and the fixture script/table name + /// (`public._ord`) and the fixture script/table name /// (`fixtures.eql_v3_`). Examples: `"integer"`, `"timestamp"`. This is /// an *identifier*, not necessarily a valid plaintext column type — see /// [`ScalarType::PLAINTEXT_SQL_TYPE`] and the module docs. @@ -136,11 +136,11 @@ pub trait ScalarType: } /// SQL domain the comparable value is cast to. Default: the generated - /// scalar domain `eql_v3.`. A non-scalar surface + /// scalar domain `public.`. A non-scalar surface /// (e.g. a SteVec entry, whose single domain `public.jsonb_entry` is /// variant-independent) overrides this to ignore the suffix. fn sql_domain(variant: Variant) -> String { - format!("eql_v3.{}{}", Self::PG_TYPE, variant.suffix()) + format!("public.{}{}", Self::PG_TYPE, variant.suffix()) } /// SQL expression that yields the comparable value from a fixture row. @@ -1306,7 +1306,7 @@ impl Variant { /// Runtime spec built from `(T, Variant)`. The matrix macro consumes /// this; nothing here is `const` because `sql_domain` is derived via -/// `format!` from `T::PG_TYPE`. The domains live in the `eql_v3` schema, +/// `format!` from `T::PG_TYPE`. The domains live in the `public` schema, /// so `sql_domain` is schema-qualified (e.g. `public.integer_eq`). #[derive(Debug, Clone)] pub struct ScalarDomainSpec { diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index cb888746a..d16f25b0d 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -122,7 +122,7 @@ async fn placeholder_payload_casts_to_every_declared_domain(pool: PgPool) -> Res // (Was i32-only with a TODO to generalize; the TODO is now done.) for spec in eql_domains::scalar_families() { for domain in spec.domains { - let sql_domain = format!("eql_v3.{}", spec.domain_name(domain)); + let sql_domain = format!("public.{}", spec.domain_name(domain)); let sql = format!("SELECT $1::jsonb::{sql_domain}"); sqlx::query(&sql) .bind(PLACEHOLDER_PAYLOAD) diff --git a/tests/sqlx/tests/encrypted_domain/ope/support.rs b/tests/sqlx/tests/encrypted_domain/ope/support.rs index ae7e039d4..fa13fbf37 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/support.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/support.rs @@ -22,14 +22,14 @@ //! `property::cross_ciphertext` and, live, by //! `fixtures::cipherstash::live_tests`. -/// Literal cast expression for an `eql_v3.` payload carrying BOTH the +/// Literal cast expression for a `public.` payload carrying BOTH the /// exact-equality term `hm` and the CLLW-OPE hex term `op`. Domain CHECKs /// assert key *presence*, not absence of extras, so one builder serves both /// the `[Ope]` integer-family domains (which ignore `hm`) and text's /// `[Hm, Ope]` (which requires it). pub fn ope_cast(domain: &str, hm: &str, op_hex: &str) -> String { format!( - "'{{\"v\":3,\"i\":{{}},\"c\":\"x\",\"hm\":\"{hm}\",\"op\":\"{op_hex}\"}}'::jsonb::eql_v3.{domain}" + "'{{\"v\":3,\"i\":{{}},\"c\":\"x\",\"hm\":\"{hm}\",\"op\":\"{op_hex}\"}}'::jsonb::public.{domain}" ) } @@ -111,7 +111,7 @@ macro_rules! ope_ord_smoke { // envelope + hm fails at the cast boundary (hm is present, so for // text the sole missing key is `op` too). let err = sqlx::query(&format!( - "SELECT '{{\"v\":3,\"i\":{{}},\"c\":\"x\",\"hm\":\"aa\"}}'::jsonb::eql_v3.{}", + "SELECT '{{\"v\":3,\"i\":{{}},\"c\":\"x\",\"hm\":\"aa\"}}'::jsonb::public.{}", $domain )) .execute(&pool) @@ -169,7 +169,7 @@ macro_rules! ope_ord_fixture_smoke { // …and every payload casts into the ope domain (the CHECK accepts // a real client ciphertext; a cast failure errors the query). let cast_ok: i64 = sqlx::query_scalar(&format!( - "SELECT COUNT((payload)::eql_v3.{}) FROM {table}", + "SELECT COUNT((payload)::public.{}) FROM {table}", $domain )) .fetch_one(&pool) @@ -198,7 +198,7 @@ macro_rules! ope_ord_fixture_smoke { let asc: Vec<$scalar> = sqlx::query_scalar(&format!( "SELECT plaintext FROM {table} \ - ORDER BY eql_v3.ord_ope_term((payload)::eql_v3.{})", + ORDER BY eql_v3.ord_ope_term((payload)::public.{})", $domain )) .fetch_all(&pool) @@ -212,7 +212,7 @@ macro_rules! ope_ord_fixture_smoke { let desc: Vec<$scalar> = sqlx::query_scalar(&format!( "SELECT plaintext FROM {table} \ - ORDER BY eql_v3.ord_ope_term((payload)::eql_v3.{}) DESC", + ORDER BY eql_v3.ord_ope_term((payload)::public.{}) DESC", $domain )) .fetch_all(&pool) @@ -251,7 +251,7 @@ macro_rules! ope_ord_fixture_smoke { .fetch_one(&pool) .await?; let pivot_cast = format!( - "'{}'::jsonb::eql_v3.{}", + "'{}'::jsonb::public.{}", pivot_json.replace('\'', "''"), $domain ); @@ -274,7 +274,7 @@ macro_rules! ope_ord_fixture_smoke { expected.sort(); let sql = format!( "SELECT plaintext FROM {table} \ - WHERE (payload)::eql_v3.{domain} {op} ({pivot_cast})", + WHERE (payload)::public.{domain} {op} ({pivot_cast})", domain = $domain, ); let mut actual: Vec<$scalar> = sqlx::query_scalar(&sql).fetch_all(&pool).await?; diff --git a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs index ffb3a9933..10ba5b595 100644 --- a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs +++ b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs @@ -144,7 +144,7 @@ async fn assert_pair_eq_on_ord_ope( a: &Row, b: &Row, ) -> Result<()> { - let domain = format!("eql_v3.{}_ord_ope", T::PG_TYPE); + let domain = format!("public.{}_ord_ope", T::PG_TYPE); let a_cast = format!("'{}'::jsonb::{domain}", a.payload_json.replace('\'', "''")); let b_cast = format!("'{}'::jsonb::{domain}", b.payload_json.replace('\'', "''")); let sql = format!("SELECT ({a_cast}) = ({b_cast}), ({a_cast}) <> ({b_cast})"); diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs index f591bc11e..0eb361b9f 100644 --- a/tests/sqlx/tests/encrypted_domain/signed.rs +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -21,7 +21,7 @@ use sqlx::PgPool; /// `min_pivot() < origin() < max_pivot()` holds through the encrypted `_ord` /// domain's `<` operator (ORE block comparison), spanning the sign boundary. async fn sign_boundary_is_monotonic(pool: &PgPool) -> anyhow::Result<()> { - let d = format!("eql_v3.{}_ord", T::PG_TYPE); + let d = format!("public.{}_ord", T::PG_TYPE); // Fixtures straddling the origin: min is below it, max above it. let below = sql_string_literal(&fetch_fixture_payload::(pool, T::min_pivot()).await?); diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index 8bbd959e2..a54fcfbb4 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -33,8 +33,8 @@ async fn compare_fixture_pair( ) -> Result { let sql = format!( "SELECT eql_v3_internal.compare_ore_block_256_terms( \ - eql_v3.ord_term((SELECT payload FROM fixtures.{table} WHERE plaintext = {lo})::eql_v3.{ord_domain}), \ - eql_v3.ord_term((SELECT payload FROM fixtures.{table} WHERE plaintext = {hi})::eql_v3.{ord_domain}))" + eql_v3.ord_term((SELECT payload FROM fixtures.{table} WHERE plaintext = {lo})::public.{ord_domain}), \ + eql_v3.ord_term((SELECT payload FROM fixtures.{table} WHERE plaintext = {hi})::public.{ord_domain}))" ); Ok(sqlx::query_scalar::<_, i32>(&sql).fetch_one(pool).await?) } @@ -93,8 +93,8 @@ async fn assert_orders_like_oracle( let order_violations: i64 = sqlx::query_scalar(&format!( "SELECT count(*) FROM ore_sample a JOIN ore_sample b ON a.rank < b.rank \ WHERE eql_v3_internal.compare_ore_block_256_terms( \ - eql_v3.ord_term(a.payload::eql_v3.{ord_domain}), \ - eql_v3.ord_term(b.payload::eql_v3.{ord_domain})) <> -1" + eql_v3.ord_term(a.payload::public.{ord_domain}), \ + eql_v3.ord_term(b.payload::public.{ord_domain})) <> -1" )) .fetch_one(&mut *conn) .await?; @@ -107,11 +107,11 @@ async fn assert_orders_like_oracle( let antisymmetry_violations: i64 = sqlx::query_scalar(&format!( "SELECT count(*) FROM ore_sample a JOIN ore_sample b ON a.rank <> b.rank \ WHERE eql_v3_internal.compare_ore_block_256_terms( \ - eql_v3.ord_term(a.payload::eql_v3.{ord_domain}), \ - eql_v3.ord_term(b.payload::eql_v3.{ord_domain})) \ + eql_v3.ord_term(a.payload::public.{ord_domain}), \ + eql_v3.ord_term(b.payload::public.{ord_domain})) \ <> - eql_v3_internal.compare_ore_block_256_terms( \ - eql_v3.ord_term(b.payload::eql_v3.{ord_domain}), \ - eql_v3.ord_term(a.payload::eql_v3.{ord_domain}))" + eql_v3.ord_term(b.payload::public.{ord_domain}), \ + eql_v3.ord_term(a.payload::public.{ord_domain}))" )) .fetch_one(&mut *conn) .await?; @@ -306,7 +306,7 @@ async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { let width: i32 = sqlx::query_scalar( "SELECT octet_length((((eql_v3.ord_term( \ (SELECT payload FROM fixtures.eql_v3_numeric WHERE plaintext = (-1000000)::numeric) \ - ::eql_v3.numeric_ord)).terms)[1]).bytes)", + ::public.numeric_ord)).terms)[1]).bytes)", ) .fetch_one(&pool) .await?; @@ -430,8 +430,8 @@ async fn wide_block_term_compares_equal_to_itself(pool: PgPool) -> Result<()> { async fn compare_collision_ids(pool: &PgPool, a: i64, b: i64) -> Result { let sql = format!( "SELECT eql_v3_internal.compare_ore_block_256_terms( \ - eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {a})::eql_v3.numeric_ord), \ - eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {b})::eql_v3.numeric_ord))" + eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {a})::public.numeric_ord), \ + eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {b})::public.numeric_ord))" ); Ok(sqlx::query_scalar::<_, i32>(&sql).fetch_one(pool).await?) } From 552a23492f90f9445d594ef5cc947c9bebf1cab9 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 6 Jul 2026 08:00:40 +1000 Subject: [PATCH 521/599] fix actionlint installer version argument --- .github/workflows/lint-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml index cfc47b61b..0347e990b 100644 --- a/.github/workflows/lint-release.yml +++ b/.github/workflows/lint-release.yml @@ -37,7 +37,7 @@ jobs: - name: Install actionlint run: | set -euo pipefail - bash <(curl -sSfL https://raw.githubusercontent.com/rhysd/actionlint/v1.7.7/scripts/download-actionlint.bash) v1.7.7 + bash <(curl -sSfL https://raw.githubusercontent.com/rhysd/actionlint/v1.7.7/scripts/download-actionlint.bash) 1.7.7 echo "$PWD" >> "$GITHUB_PATH" - name: actionlint (release workflows) From 4c568506835180dcd68162bc291a43251ee4ddb4 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 6 Jul 2026 08:17:45 +1000 Subject: [PATCH 522/599] fix: include public domains in v3 lints --- src/v3/lint/lints.sql | 45 +++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/v3/lint/lints.sql b/src/v3/lint/lints.sql index ea52009e2..bed8e8365 100644 --- a/src/v3/lint/lints.sql +++ b/src/v3/lint/lints.sql @@ -83,9 +83,29 @@ RETURNS TABLE ( LANGUAGE sql STABLE AS $$ WITH - -- All operators where at least one operand is an `eql_v3` type. Limits - -- the scope of the lint to the operator surface customers actually hit - -- via SQL (`col = val`, `col @> '...'` and friends). + -- User-column encrypted domains now live in public so application tables + -- survive EQL uninstall. Keep this separate from owned_schemas(): public is + -- not installer-owned, but its EQL jsonb-backed domains are still the domain + -- types whose blockers/operator surfaces the lint must understand. + encrypted_domain_types AS ( + SELECT + dt.oid AS typid + FROM pg_catalog.pg_type dt + JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype + JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace + WHERE dt.typtype = 'd' + AND bt.typname = 'jsonb' + AND bn.nspname = 'pg_catalog' + AND ( + dn.nspname = 'public' + OR dn.nspname = ANY(eql_v3_internal.owned_schemas()) + ) + ), + + -- All operators where at least one operand is an EQL-owned type or a public + -- encrypted domain. Limits the scope of the lint to the operator surface + -- customers actually hit via SQL (`col = val`, `col @> '...'` and friends). eql_operators AS ( SELECT op.oid AS oprid, @@ -98,7 +118,10 @@ AS $$ WHERE EXISTS ( SELECT 1 FROM pg_type t WHERE t.oid IN (op.oprleft, op.oprright) - AND t.typnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY(eql_v3_internal.owned_schemas())) + AND ( + t.typnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY(eql_v3_internal.owned_schemas())) + OR t.oid IN (SELECT typid FROM encrypted_domain_types) + ) ) ), @@ -126,7 +149,7 @@ AS $$ -- `encrypted_domain_unsupported_*` helper calls — `_bool` for boolean -- blockers, `_jsonb` for the native-jsonb-operator blockers; plus the -- literal `is not supported for` for older path-operator blockers) AND - -- that take at least one `eql_v3` domain over jsonb argument. The argument + -- that take at least one encrypted domain over jsonb argument. The argument -- filter excludes the shared `encrypted_domain_unsupported_*(text, text)` -- helpers themselves, which contain the marker in their body but are not -- blockers (they take text arguments, not a domain). @@ -145,12 +168,7 @@ AS $$ AND EXISTS ( SELECT 1 FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ) - JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ - JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace - JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype - WHERE dt.typtype = 'd' - AND bt.typname = 'jsonb' - AND dn.nspname = ANY(eql_v3_internal.owned_schemas()) + JOIN encrypted_domain_types edt ON edt.typid = arg.typ ) ) @@ -328,7 +346,7 @@ AS $$ WHERE dt.typtype = 'd' AND dn.nspname = ANY(eql_v3_internal.owned_schemas()) AND bt.typtype = 'd' - AND bn.nspname = ANY(eql_v3_internal.owned_schemas()) + AND bt.oid IN (SELECT typid FROM encrypted_domain_types) -- ┌─────────────────────────────────────────────────────────────────┐ -- │ Domain opclass: an operator class declared FOR TYPE on an │ @@ -349,8 +367,7 @@ AS $$ JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace - WHERE t.typtype = 'd' - AND tn.nspname = ANY(eql_v3_internal.owned_schemas()) + WHERE t.oid IN (SELECT typid FROM encrypted_domain_types) -- ┌─────────────────────────────────────────────────────────────────┐ -- │ Schema placement: the public `eql_v3` schema must hold only the │ From 0a1cfec5ec742eac3f74ced360b1c6255c2270f7 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 6 Jul 2026 10:51:35 +1000 Subject: [PATCH 523/599] fix(release): address alpha review feedback --- .github/scripts/release-alpha-pin-bindings.sh | 17 +++++++++++++---- .../scripts/release-alpha-pin-bindings.test.sh | 15 +++++++++++++++ .github/workflows/_build-sql.yml | 2 +- .github/workflows/release-alpha.yml | 10 +++++----- docs/development/releasing-an-alpha.md | 2 +- 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/.github/scripts/release-alpha-pin-bindings.sh b/.github/scripts/release-alpha-pin-bindings.sh index a25347baf..7aa84191b 100755 --- a/.github/scripts/release-alpha-pin-bindings.sh +++ b/.github/scripts/release-alpha-pin-bindings.sh @@ -10,15 +10,25 @@ release_alpha_pin_emit_commit_sha() { release_alpha_pin_push_target() { if [[ -n "${GH_TOKEN:-}" && -n "${GITHUB_REPOSITORY:-}" ]]; then - printf 'https://x-access-token:%s@github.com/%s.git\n' "$GH_TOKEN" "$GITHUB_REPOSITORY" + printf 'https://github.com/%s.git\n' "$GITHUB_REPOSITORY" else printf 'origin\n' fi } +release_alpha_pin_push() { + local branch="$1" push_target + push_target="$(release_alpha_pin_push_target)" + if [[ -n "${GH_TOKEN:-}" && -n "${GITHUB_REPOSITORY:-}" ]]; then + git -c "http.https://github.com/.extraheader=AUTHORIZATION: bearer ${GH_TOKEN}" push "$push_target" "HEAD:${branch}" + else + git push "$push_target" "HEAD:${branch}" + fi +} + release_alpha_pin_bindings() { local identity="$1" branch="$2" - local commit_sha push_target + local commit_sha local commit_args=() release-plz set-version "eql-bindings@${identity}" @@ -33,8 +43,7 @@ release_alpha_pin_bindings() { commit_args=(-S) fi git commit "${commit_args[@]}" -m "chore(release): pin eql-bindings to ${identity}" - push_target="$(release_alpha_pin_push_target)" - git push "$push_target" "HEAD:${branch}" + release_alpha_pin_push "$branch" fi commit_sha="$(git rev-parse HEAD)" diff --git a/.github/scripts/release-alpha-pin-bindings.test.sh b/.github/scripts/release-alpha-pin-bindings.test.sh index f7fa5788e..1cf74c369 100755 --- a/.github/scripts/release-alpha-pin-bindings.test.sh +++ b/.github/scripts/release-alpha-pin-bindings.test.sh @@ -82,7 +82,22 @@ check_commit() { rm -rf "$tmp" } +check_push_target_keeps_token_out_of_url() { + local output + output="$( + GH_TOKEN=super-secret-token GITHUB_REPOSITORY=cipherstash/encrypt-query-language \ + release_alpha_pin_push_target + )" + if [[ "$output" == "https://github.com/cipherstash/encrypt-query-language.git" && "$output" != *"super-secret-token"* ]]; then + echo "ok: authenticated push target keeps token out of URL" + else + echo "FAIL: push target exposed token or used unexpected URL: '$output'" + fail=1 + fi +} + check_noop check_commit +check_push_target_keeps_token_out_of_url exit "$fail" diff --git a/.github/workflows/_build-sql.yml b/.github/workflows/_build-sql.yml index 6468d98e8..44bb0c4d5 100644 --- a/.github/workflows/_build-sql.yml +++ b/.github/workflows/_build-sql.yml @@ -34,7 +34,7 @@ on: default: false secrets: MULTITUDES_ACCESS_TOKEN: - required: true + required: false env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml index 80b9375e8..57994016c 100644 --- a/.github/workflows/release-alpha.yml +++ b/.github/workflows/release-alpha.yml @@ -230,10 +230,10 @@ jobs: echo "Dispatching release-plz.yml --ref ${ref}" gh workflow run release-plz.yml --ref "$ref" { - echo "## Crate publish dispatched" + echo "## Crate publish dispatch accepted" echo "" - echo "Dispatched \`release-plz.yml\` against \`${ref}\`." - echo "Watch it separately: it runs as its own entry point." + echo "Crate publish DISPATCHED against \`${ref}\`." + echo "Verify the separate \`release-plz.yml\` run reaches a terminal success state before treating the crate as published." } >> "$GITHUB_STEP_SUMMARY" summary: @@ -266,8 +266,8 @@ jobs: echo "- identity: \`${IDENTITY}\`" echo "- sql_tag: \`${SQL_TAG}\`" echo "- crate_tag: \`${CRATE_TAG}\`" - echo "- resolve: ${RESOLVE_RESULT} | pin: ${PIN_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | crate-publish: ${CRATE_PUBLISH_RESULT}" + echo "- resolve: ${RESOLVE_RESULT} | pin: ${PIN_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | crate-publish-dispatch: ${CRATE_PUBLISH_RESULT}" echo "" echo "Coordinator run: ${SERVER_URL}/${REPOSITORY}/actions/runs/${RUN_ID}" - echo "The crate publish, if dispatched, runs as a separate release-plz.yml run." + echo "Crate publish is only DISPATCHED by this coordinator. Verify the separate release-plz.yml run before treating the crate publish as successful." } >> "$GITHUB_STEP_SUMMARY" diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md index 5b68f7348..606700ae1 100644 --- a/docs/development/releasing-an-alpha.md +++ b/docs/development/releasing-an-alpha.md @@ -60,7 +60,7 @@ Common flags: | `--version` | Base SemVer (`X.Y.Z`) | `3.0.0` | | `--channel` | Prerelease channel: `alpha` \| `beta` \| `rc` | `alpha` | | `--pre` | Exact identity (`X.Y.Z-(alpha\|beta\|rc).N`), bypassing derivation | derived | -| `--ref` | GitHub ref for `workflow_dispatch` | current branch for `release:all` and `release:eql`; required explicitly for `release:bindings` | +| `--ref` | GitHub ref for `workflow_dispatch` | required explicitly for `release:all` and `release:bindings`; current branch for `release:eql` | | `--dry-run` | Resolve, verify, and print the plan without mutating anything | off | Examples: From f795d8096f885ba5c87205d7d998ca68abfebd67 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 6 Jul 2026 11:19:29 +1000 Subject: [PATCH 524/599] docs: sync v3 schema references to public domains The public-domain migration (#363) moved the encrypted-domain types to the public schema (eql_v3 holds operators/extractors/wrappers/aggregates, eql_v3_internal holds SEM index-term types). Bring the user-facing docs into line with the shipped surface: - README.md: domain types qualified public./_eq/_ord (component table, schema prose, getting-started); correct the DROP SCHEMA eql_v3 CASCADE note (public-typed columns survive uninstall by design); fix broken doc-validation script paths to tasks/docs/validate/*.sh. - SUPABASE.md: re-qualify domain types public._eq/_ord and the min/max aggregate argument type; fix the false "in the eql_v3 schema" claim. - DEVELOPMENT.md: scalar tree example bool/ -> boolean/. --- DEVELOPMENT.md | 2 +- README.md | 18 +++++++++--------- SUPABASE.md | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index e822a0dff..291f0438a 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -85,7 +85,7 @@ These are the important files and directories in the repo: │ │ ├── sem/ <-- hand-written SEM index-term types (hmac_256, ore_block_256, …) │ │ ├── scalars/ <-- generated scalar domain families, one dir per type │ │ │ ├── functions.sql <-- shared blocker for native jsonb operators -│ │ │ └── / <-- e.g. integer/, text/, bool/ (generated, committed in place) +│ │ │ └── / <-- e.g. integer/, text/, boolean/ (generated, committed in place) │ │ ├── jsonb/ <-- jsonb SteVec support │ │ └── lint/ <-- structural lints │ ├── deps-v3.txt <-- REQUIRE edges for the v3 surface diff --git a/README.md b/README.md index 8dae2f0d7..b8b305fce 100644 --- a/README.md +++ b/README.md @@ -70,19 +70,19 @@ EQL installs the following components into the `eql_v3` schema: | Name | Entity Type | Purpose | | --------------------------------------------------- | ------------- | ------------------------------------------------------------------- | -| `eql_v3` | Schema | Holds all EQL types, operators, functions, and aggregates | -| `eql_v3.`, `eql_v3._eq`, `eql_v3._ord` | Domain types | Per-scalar encrypted columns (one family per scalar: `integer`, `text`, `timestamp`, …) | +| `eql_v3` | Schema | Holds EQL operators, term extractors, comparison wrappers, and aggregates | +| `public.`, `public._eq`, `public._ord` | Domain types | Per-scalar encrypted columns (one family per scalar: `integer`, `text`, `timestamp`, …) | | `public.json` | Domain type | Encrypted JSON (structured-encryption) documents | | `eql_v3.eq_term` / `ord_term` / `match_term` | Functions | Index-term extractors for functional indexes | ### `eql_v3` Schema -The `eql_v3` schema holds the encrypted-domain types, their operators and term extractors, and the `MIN` / `MAX` aggregates. +The `eql_v3` schema holds the operators, term extractors, comparison wrappers, and `MIN` / `MAX` aggregates for the encrypted-domain types. The encrypted-domain types themselves live in `public` (see below), and the internal SEM index-term types live in `eql_v3_internal`. -Encrypted columns are typed as `eql_v3` domains (e.g. `public.text_eq`, `public.json`), and the searchable surface available on a column is fixed by its domain **variant** — there is no database-side configuration state. Which index terms a value carries is decided by the encryption client (CipherStash Stack / CipherStash Proxy). +Encrypted columns are typed as `public` domains (e.g. `public.text_eq`, `public.json`), and the searchable surface available on a column is fixed by its domain **variant** — there is no database-side configuration state. Which index terms a value carries is decided by the encryption client (CipherStash Stack / CipherStash Proxy). -Because the domain types live in the `eql_v3` schema, columns depend on them; `DROP SCHEMA eql_v3 CASCADE` removes the surface (and would drop columns typed as those domains). Re-running the install script is idempotent. +The domain types deliberately live in `public`, not `eql_v3`, so application tables survive an EQL uninstall: `DROP SCHEMA eql_v3 CASCADE` removes the operators, extractors, and aggregates but leaves the `public`-typed columns (and their data) intact. Re-running the install script is idempotent. ## Database Permissions @@ -165,7 +165,7 @@ Once EQL is installed in your PostgreSQL database, you can start using encrypted ### Enable encrypted columns -Define encrypted columns using an `eql_v3` domain type. Type the column as the **variant** for the capability you need — `public.text_eq` for equality, `eql_v3._ord` for range/ordering, `public.text_match` for full-text, `public.json` for encrypted JSON. Each is stored as `jsonb` with a `CHECK` constraint that validates the encrypted payload. +Define encrypted columns using a `public` encrypted-domain type. Type the column as the **variant** for the capability you need — `public.text_eq` for equality, `public._ord` for range/ordering, `public.text_match` for full-text, `public.json` for encrypted JSON. Each is stored as `jsonb` with a `CHECK` constraint that validates the encrypted payload. **Example:** @@ -262,9 +262,9 @@ Verify documentation quality using these scripts: mise run docs:validate # Or run individual checks -./tasks/check-doc-coverage.sh # Check 100% coverage -./tasks/validate-required-tags.sh # Validate @brief, @param, @return -./tasks/validate-documented-sql.sh # Validate SQL syntax +./tasks/docs/validate/coverage.sh # Check 100% coverage +./tasks/docs/validate/required-tags.sh # Validate @brief, @param, @return +./tasks/docs/validate/documented-sql.sh # Validate SQL syntax ``` Documentation validation runs automatically in CI for all pull requests. diff --git a/SUPABASE.md b/SUPABASE.md index 01a1f8c85..f3b3ce951 100644 --- a/SUPABASE.md +++ b/SUPABASE.md @@ -17,7 +17,7 @@ and Supabase [does not support custom operators](https://github.com/supabase/sup so that recipe needed a cut-down build. `eql_v3` removes the dependency entirely. Every encrypted column is typed as -a `jsonb`-backed **domain** in the `eql_v3` schema (for example +a `jsonb`-backed **domain** in the `public` schema (for example `public.text_eq`, `public.integer_ord`, `public.json`), and search is driven by **functional indexes over small term-extractor functions** rather than an operator class on the column: @@ -60,8 +60,8 @@ type it as**, and which index terms travel in a value's payload is decided by the encryption client — [CipherStash Proxy](https://github.com/cipherstash/proxy) or [CipherStash Stack](https://github.com/cipherstash/stack): -- `eql_v3._eq` carries an `hm` term — supports `=` / `<>`, `GROUP BY`, `DISTINCT`. -- `eql_v3._ord` (and the `_ord_ore` twin) carries an `ob` term — adds `<` `<=` `>` `>=`, `ORDER BY`, `MIN` / `MAX`. +- `public._eq` carries an `hm` term — supports `=` / `<>`, `GROUP BY`, `DISTINCT`. +- `public._ord` (and the `_ord_ore` twin) carries an `ob` term — adds `<` `<=` `>` `>=`, `ORDER BY`, `MIN` / `MAX`. - `public.text_match` carries a `bf` term — supports bloom-filter token containment (`@>` / `<@`). - `public.text_search` carries all three terms — equality, ordering, and containment on `text`. @@ -142,7 +142,7 @@ for the full explanation. ### Aggregates `MIN` / `MAX` `MIN` / `MAX` are exposed on the ordered variants as -`eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the +`eql_v3.min(public._ord)` / `eql_v3.max(public._ord)` (and the `_ord_ore` twin). Type the column as `_ord`, or cast at the call site: ```sql From 33e4c4986151833755bcf0410ac6ca38d1e3bdcc Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 6 Jul 2026 11:39:45 +1000 Subject: [PATCH 525/599] docs(reference): sync reference docs to public/eql_v3/eql_v3_internal split and current codegen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the public-domain migration (#363), correcting the reference docs the same way as the top-level docs. Schema-qualifier fixes (domains are in public, SEM types in eql_v3_internal, the eql_v3.* function/operator/aggregate API is unchanged): - sql-support.md: domains public.; SEM types eql_v3_internal.*; corrected the false 'DROP SCHEMA eql_v3 CASCADE removes the domains' claim; aggregate argument types public._ord. - eql-functions.md: extractor RETURN types eql_v3_internal.hmac_256/ ore_block_256/bloom_filter; prose domain placeholders public.. - database-indexes.md: domain-type placeholders public._*. - json-support.md: fix stale on-page TOC anchor (#querying-publicjson). Codegen currency fixes: - adding-a-scalar-encrypted-domain-type.md: friendly const names (INTEGER/INTEGER_FIXTURES/INTEGER_VALUES, not INT4*); boolean_*.sql / scalars/boolean/ (not bool); corrected CLI subcommand list; domains in public. - catalog-driven-architecture.md: friendly names throughout (INTEGER…, IntegerEq, eql_v3_integer, v3_doc_integer); add the missing Ope (CLLW-OPE) term axis to the class diagram, capability table (provides_ordering true for Ore and Ope), and the 5-domain/7-domain shape descriptions; real integer/ file tree; CLI six modes (list-schemas); file counts (TS 63, JSON 51); JSONB in the catalog family list. --- .../adding-a-scalar-encrypted-domain-type.md | 60 +++++---- docs/reference/catalog-driven-architecture.md | 114 +++++++++++------- docs/reference/database-indexes.md | 10 +- docs/reference/eql-functions.md | 20 +-- docs/reference/json-support.md | 2 +- docs/reference/sql-support.md | 24 ++-- 6 files changed, 132 insertions(+), 98 deletions(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index bbe057a76..cdd42972b 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -8,10 +8,12 @@ Read top-down to ship a type; drop into the reference half when something breaks or you need the *why*. A scalar encrypted-domain type is a family of concrete `jsonb` domains in the -**`eql_v3`** schema (`eql_v3.`, `eql_v3._eq`, -`eql_v3._ord`, …), dropped by `DROP SCHEMA eql_v3 CASCADE`. Their +**`public`** schema (`public.`, `public._eq`, +`public._ord`, …). The domains deliberately live in `public`, **not** +`eql_v3`, so that application columns typed as an encrypted domain survive an +uninstall: `DROP SCHEMA eql_v3 CASCADE` does **not** drop them. Their extractors, comparison wrappers, and MIN/MAX -aggregates also live in `eql_v3`; the searchable-encrypted-metadata (SEM) +aggregates — the callable surface — do live in `eql_v3`; the searchable-encrypted-metadata (SEM) index-term types they return (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`, `eql_v3_internal.ope_cllw`) live in the **`eql_v3_internal`** schema — hand-written under @@ -40,7 +42,7 @@ To add a scalar type `` (e.g. `bigint`), with Rust type `` (e.g. `i64`): plaintext fixture `values`) in the `fixtures` module (§2). If the type needs a new scalar width, add a `ScalarKind` variant first; if it needs new term behaviour, that goes in the `Term` enum's `impl`, never in catalog data. -2. **Materialise the value list** — `int_values!(_VALUES, , );` +2. **Materialise the value list** — `int_values!(_VALUES, , _FIXTURES);` next to `CATALOG`, pinned by a `values_tests` assertion (§2). This is the single source the SQLx matrix reads; there is no generated `_values.rs`. 3. **Wire the SQLx matrix oracle** — for an integer type, copy the two small @@ -98,15 +100,15 @@ with a `TypeFixtures` record in ```rust // The structural catalog row — name + domains only: -const INT4: DomainFamily = DomainFamily { +const INTEGER: DomainFamily = DomainFamily { name: "integer", domains: ORDERED_INT_DOMAINS, // storage, _eq (hm), _ord_ore (ore), _ord (ore), _ord_ope (ope) }; // The fixture-layer record — kind + plaintext values — joined back to the // catalog row by `family.name`: -pub const INT4_FIXTURES: TypeFixtures = TypeFixtures { - family: &crate::INT4, +pub const INTEGER_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::INTEGER, kind: ScalarKind::I32, values: fixtures!(int i32; Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), @@ -212,7 +214,7 @@ range-checks each `Int` literal against the kind at compile time (`N(-40000)` for an `i16` kind does not compile): ```rust -// the `values:` expression of INT4_FIXTURES (a `TypeFixtures`): +// the `values:` expression of INTEGER_FIXTURES (a `TypeFixtures`): values: fixtures!(int i32; Min, N(-100), N(-1), Zero, N(1), N(2), N(5), N(10), N(17), N(25), N(42), N(50), N(100), N(250), N(1000), N(9999), Max), @@ -237,10 +239,10 @@ result counts, include useful boundaries, and cover omitted-term negative cases. The plaintext list is **not** rendered to a generated file. The `int_values!` macro (in `crates/eql-domains/src/fixtures/values.rs`) materialises a `Fixture` list into a typed `pub const -_VALUES: &[]` at compile time (`INT4_VALUES`, `INT2_VALUES`): +_VALUES: &[]` at compile time (`INTEGER_VALUES`, `SMALLINT_VALUES`): ```rust -int_values!(INT4_VALUES, i32, INT4_FIXTURES); +int_values!(INTEGER_VALUES, i32, INTEGER_FIXTURES); ``` Both consumers reference that single symbol — the fixture generator @@ -538,7 +540,7 @@ This is the contract the generated SQL satisfies. You normally never read it to The generator emits `src/v3/scalars//_types.sql` (committed in place; regenerated on every build) with one idempotent `DO $$ ... $$` block. Every -domain is a concrete domain over `jsonb` in the `eql_v3` schema — **never** +domain is a concrete domain over `jsonb` in the `public` schema — **never** `CREATE DOMAIN a AS b` over another generated domain (PostgreSQL resolves operators against the underlying base type, bypassing the fixed surface). Each domain's `CHECK` requires: @@ -737,7 +739,7 @@ unreachable. Invariants encoded in the renderers / templates and guarded by - **SQL-literal injection is structurally prevented** — every interpolated single-quoted literal passes through `sql_str` (`crates/eql-codegen/src/consts.rs`), which doubles embedded single quotes. -- **No domain-over-domain** — every domain is `CREATE DOMAIN eql_v3. AS +- **No domain-over-domain** — every domain is `CREATE DOMAIN public. AS jsonb` (`types_file_has_all_five_domains`). - **No operator class on a domain** — the generator emits operators, not operator classes. @@ -795,19 +797,25 @@ ninety hand-written declarations that must agree with each other and with runs as `cargo run -p eql-codegen` (no subcommand), which calls `generate::generate_all` (`crates/eql-codegen/src/generate.rs`) over every row of `eql_domains::CATALOG`, writing each type's SQL into -`src/v3/scalars//`. Three subcommands round out the surface: -`-- list-types` prints the catalog tokens one per line (consumed by the fixture -and matrix-inventory enumeration); `-- dump-catalog` prints the catalog surface +`src/v3/scalars//`. Five subcommands round out the surface: +`list-types` prints the catalog tokens one per line (consumed by the fixture +and matrix-inventory enumeration); `list-schemas` prints the schemas the +`eql_v3` surface owns, public first (consumed by `mise run test:schemas:parity`); +`dump-catalog` prints the catalog surface (types → domains → supported operators) as JSON (consumed by the -catalog-coverage / log-verification gates); and `-- bindings` regenerates the +catalog-coverage / log-verification gates); `bindings` regenerates the committed `eql-bindings` Rust payload types (the first step of `mise run -types:generate`). `main` (`crates/eql-codegen/src/main.rs`) recognises exactly -these four forms (no-arg generate-all, `list-types`, `dump-catalog`, -`bindings`); any other argument is a usage error. - -The generator targets two schemas: `SCHEMA = "eql_v3"` -(`crates/eql-codegen/src/consts.rs`) qualifies the domain families and the -public callable surface, while `INTERNAL_SCHEMA = "eql_v3_internal"` qualifies +types:generate`); and `clean` removes the generated SQL surface (marker-aware). +`main` (`crates/eql-codegen/src/main.rs`) recognises exactly +these six forms (no-arg generate-all, `list-types`, `list-schemas`, +`dump-catalog`, `bindings`, `clean`); any other argument is a usage error. + +The generator targets three schemas. The **domain families themselves are +created in `public`** (`CREATE DOMAIN public. AS jsonb`) so application +columns survive an `eql_v3` uninstall. `SCHEMA = "eql_v3"` +(`crates/eql-codegen/src/consts.rs`) qualifies only the **callable surface** — +the extractors, comparison wrappers, and aggregates — while +`INTERNAL_SCHEMA = "eql_v3_internal"` qualifies the SEM index-term types the extractors return (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`, `eql_v3_internal.ope_cllw`) and the aggregate state functions, so the generated SQL is entirely self-contained within the two @@ -969,8 +977,8 @@ What makes it storage-only: term-less storage domain); it is *also* `is_eq_only()` (no `_ord`), so the harness checks storage-only **first**. - **Generator: no changes needed.** The SQL generator already handles a - zero-term, single-domain type — it emits exactly three files (`bool_types.sql`, - `bool_functions.sql`, `bool_operators.sql`; no `_aggregates.sql`, since no + zero-term, single-domain type — it emits exactly three files (`boolean_types.sql`, + `boolean_functions.sql`, `boolean_operators.sql`; no `_aggregates.sql`, since no ordered domain). All 44 functions are `plpgsql` blockers, all 44 `CREATE OPERATOR` statements back onto them: every comparison/containment/path operator reachable through domain fallback raises. The domain `CHECK` still pins `{v,i,c}` + `VALUE->>'v' = '3'`. @@ -1005,6 +1013,6 @@ What makes it storage-only: (`shape="storage_only"`). Everything else is the standard path: one catalog row, regenerate, commit the -generated `src/v3/scalars/bool/` SQL (3 files), no edits to +generated `src/v3/scalars/boolean/` SQL (3 files), no edits to `pin_search_path_v3.sql` or `splinter.sh` (a storage-only type emits only blockers — no extractors/wrappers/aggregates, so no new inline-critical names). diff --git a/docs/reference/catalog-driven-architecture.md b/docs/reference/catalog-driven-architecture.md index 7f85cd541..b28a0f281 100644 --- a/docs/reference/catalog-driven-architecture.md +++ b/docs/reference/catalog-driven-architecture.md @@ -16,9 +16,9 @@ gates guarantee the derived artifacts never drift from it. ```mermaid flowchart TD subgraph SOT["① SOURCE OF TRUTH — crates/eql-domains"] - CAT["CATALOG: &[DomainFamily]
(10 scalar families)"] + CAT["CATALOG: &[DomainFamily]
(11 families: 10 scalar + jsonb)"] FIX["FIXTURES: &[TypeFixtures]
(plaintext value lists)"] - TERM["Term enum impls
(Hm / Ore / Bloom capabilities)"] + TERM["Term enum impls
(Hm / Ore / Bloom / Ope capabilities)"] CAT -.compile-time parity guard.- FIX end @@ -70,12 +70,13 @@ Everything starts in `crates/eql-domains/src/lib.rs`: ```rust pub const CATALOG: &[DomainFamily] = &[ - INT4, INT2, INT8, DATE, TIMESTAMP, - NUMERIC, TEXT, BOOL, FLOAT4, FLOAT8, + INTEGER, SMALLINT, BIGINT, DATE, TIMESTAMP, NUMERIC, TEXT, BOOLEAN, REAL, DOUBLE, JSONB, ]; ``` Order is **load-bearing** — it drives generation order, inventory order, and snapshot order. +Ten of the eleven rows are `Shape::Scalar` families; the eleventh, `JSONB`, is the hand-written +SteVec family (see §2.3). Scalar-only consumers iterate `scalar_families()`, which filters `JSONB` out. ### 2.1 The data model @@ -86,7 +87,7 @@ classDiagram +domains: &[Domain] } class Domain { - +name: &str // "", "eq", "ord", "ord_ore", "match", "search" + +name: &str // "", "eq", "ord", "ord_ore", "ord_ope", "match", "search" +terms: &[Term] } class Term { @@ -94,6 +95,7 @@ classDiagram Hm Ore Bloom + Ope } class Role { <> @@ -121,8 +123,8 @@ classDiagram - **`DomainFamily`** = one scalar type (`name` + the public domains it carries). - **`Domain`** = one operator/index capability surface (a bare suffix + fixed terms). The empty - name `""` is the storage-only domain (`public.integer`); `eq`, `ord`, `ord_ore`, `match`, - `search` are the searchable ones. + name `""` is the storage-only domain (`public.integer`); `eq`, `ord`, `ord_ore`, `ord_ope`, + `match`, `search` are the searchable ones. - **`Term`** = an index-term type. *This is where capability lives.* ### 2.2 The `Term` enum is the capability engine @@ -130,15 +132,21 @@ classDiagram A `Term` answers every question the generators need, via exhaustive `impl` methods (`crates/eql-domains/src/term.rs`). This table *is* the contract: -| Method | `Hm` | `Ore` | `Bloom` | -|--------|------|-------|---------| -| `json_key()` | `"hm"` | `"ob"` | `"bf"` | -| `extractor()` | `eq_term` | `ord_term` | `match_term` | -| `ctor()` | `hmac_256` | `ore_block_256` | `bloom_filter` | -| `binding_newtype()` | `Hmac256` | `OreBlock256` | `BloomFilter` | -| `role()` | `Eq` | `Ord` | `Match` | -| `operators()` | `= <>` | `= <> < <= > >=` | `@> <@` | -| `provides_ordering()` | `false` | `true` | `false` | +| Method | `Hm` | `Ore` | `Bloom` | `Ope` | +|--------|------|-------|---------|-------| +| `json_key()` | `"hm"` | `"ob"` | `"bf"` | `"op"` | +| `extractor()` | `eq_term` | `ord_term` | `match_term` | `ord_ope_term` | +| `ctor()` | `hmac_256` | `ore_block_256` | `bloom_filter` | `ope_cllw` | +| `binding_newtype()` | `Hmac256` | `OreBlock256` | `BloomFilter` | `OpeCllw` | +| `role()` | `Eq` | `Ord` | `Match` | `Ord` | +| `operators()` | `= <>` | `= <> < <= > >=` | `@> <@` | `= <> < <= > >=` | +| `provides_ordering()` | `false` | `true` | `false` | `true` | + +`Ope` is the CLLW-OPE term: a hex-encoded ciphertext that is natively `bytea`-sortable after +hex-decode (no custom comparison protocol), so — like `Hm` — its extractor is the whole SEM +surface and it deliberately does *not* reuse `ord_term`'s extractor name (a shared name would +collapse a mixed `[Ore, Ope]` domain under `dedupe_terms_by(Term::extractor)`). +`provides_ordering()` is `true` for **both** `Ore` and `Ope`. Cross-term helpers compose these into the per-domain answers the renderers consume: `operators_for_terms`, `term_json_keys`, `payload_terms`, `nonempty_array_keys`, @@ -161,11 +169,11 @@ fail loudly if they drift into an unreviewed shape. The eleventh `CATALOG` famil flowchart LR subgraph ordered["ordered (8 families)"] direction TB - o1["storage []"] --> o2["_eq [Hm]"] --> o3["_ord_ore [Ore]"] --> o4["_ord [Ore]"] + o1["storage []"] --> o2["_eq [Hm]"] --> o3["_ord_ore [Ore]"] --> o4["_ord [Ore]"] --> o5["_ord_ope [Ope]"] end subgraph text["text-search (text)"] direction TB - t1["storage []"] --> t2["_eq [Hm]"] --> t3["_match [Bloom]"] --> t4["_ord_ore [Hm,Ore]"] --> t5["_ord [Hm,Ore]"] --> t6["_search [Hm,Ore,Bloom]"] + t1["storage []"] --> t2["_eq [Hm]"] --> t3["_match [Bloom]"] --> t4["_ord_ore [Hm,Ore]"] --> t5["_ord [Hm,Ore]"] --> t6["_ord_ope [Hm,Ope]"] --> t7["_search [Hm,Ore,Bloom]"] end subgraph storage["storage-only (bool)"] s1["storage []"] @@ -205,8 +213,8 @@ hand-written in `crates/eql-bindings/src/v3/jsonb.rs` — only inventory members that names/kinds align by index — a mismatch is a *build error*, not a runtime surprise. ```rust -pub const INT4_FIXTURES: TypeFixtures = TypeFixtures { - family: &crate::INT4, +pub const INTEGER_FIXTURES: TypeFixtures = TypeFixtures { + family: &crate::INTEGER, kind: ScalarKind::I32, values: fixtures!(int i32; Min, N(-100), N(-1), Zero, N(1), /* ... */ N(9999), Max), @@ -214,7 +222,7 @@ pub const INT4_FIXTURES: TypeFixtures = TypeFixtures { ``` The `int_values!` / `text_values!` macros materialize these to typed const slices -(`INT4_VALUES: &[i32]`, `TEXT_VALUES: &[&str]`) at compile time — resolving `Min`/`Max`/`Zero` +(`INTEGER_VALUES: &[i32]`, `TEXT_VALUES: &[&str]`) at compile time — resolving `Min`/`Max`/`Zero` sentinels to kind bounds and **panicking the build on an out-of-range integer literal**. No generated `.rs` round-trip; the source of truth is the catalog row itself. @@ -222,17 +230,21 @@ generated `.rs` round-trip; the source of truth is the catalog row itself. ## 3. Layer ② — The Generator (`eql-codegen`) -The CLI (`crates/eql-codegen/src/main.rs`) has five modes: +The CLI (`crates/eql-codegen/src/main.rs`) has six modes: ```mermaid flowchart LR CLI["eql-codegen"] --> A["(no args)
generate_all → SQL surface"] CLI --> B["bindings
generate_bindings → Rust bindings"] CLI --> E["clean
clean_all → remove generated SQL"] - CLI --> C["list-types
catalog tokens, one per line"] + CLI --> C["list-types
scalar_families() tokens, one per line"] + CLI --> F["list-schemas
owned schemas (public first)"] CLI --> D["dump-catalog
JSON of types→domains→ops"] ``` +`list-schemas` prints the schemas the `eql_v3` surface owns (`eql_v3`, then `eql_v3_internal`), +consumed by `test:schemas:parity` to keep the Rust consts and the SQL `owned_schemas()` array in lockstep. + Both generators follow the same crash-safe **render-all → preflight → write-all → delete-orphans** model, so a render panic or write error can never leave the tree with files deleted-but-not-rewritten: @@ -278,9 +290,9 @@ Each `*_functions.sql` mixes three entry kinds, selected per operator: | Kind | Template | Language | Purpose | |------|----------|----------|---------| -| **Extractor** | `extractor.sql.j2` | `LANGUAGE sql` (inlinable) | `eq_term(integer_eq) → hmac_256` | -| **Wrapper** | `wrapper.sql.j2` | `LANGUAGE sql` (inlinable) | `eq(a,b) → eq_term(a)=eq_term(b)` | -| **Blocker** | `unsupported.sql.j2` | **`LANGUAGE plpgsql`** | `RAISE EXCEPTION 'operator % not supported'` | +| **Extractor** | `functions/extractor.sql.j2` | `LANGUAGE sql` (inlinable) | `eq_term(integer_eq) → hmac_256` | +| **Wrapper** | `functions/wrapper.sql.j2` | `LANGUAGE sql` (inlinable) | `eq(a,b) → eq_term(a)=eq_term(b)` | +| **Blocker** | `functions/unsupported.sql.j2` | **`LANGUAGE plpgsql`** | `RAISE EXCEPTION 'operator % not supported'` | > **Two footguns the renderers enforce structurally (with tests):** > - **Blockers are never `STRICT`** — a `STRICT` blocker returns `NULL` on `NULL` args, @@ -337,16 +349,22 @@ distinctions become visible — e.g. `text_ord` lists `v i c hm ob` (dual-term) ```text src/v3/scalars/ ├── functions.sql ← hand-written shared blocker helper (COMMITTED) -├── integer/ -│ ├── integer_types.sql (generated, committed) -│ ├── integer_functions.sql (storage-only blockers) -│ ├── integer_eq_functions.sql (eq_term extractor + eq/neq wrappers) -│ ├── integer_eq_operators.sql (CREATE OPERATOR) +├── integer/ (14 generated files) +│ ├── integer_types.sql (generated, committed) +│ ├── integer_functions.sql (storage-only blockers) +│ ├── integer_operators.sql (storage-only operator blockers) +│ ├── integer_eq_functions.sql (eq_term extractor + eq/neq wrappers) +│ ├── integer_eq_operators.sql (CREATE OPERATOR) +│ ├── integer_ord_ore_functions.sql +│ ├── integer_ord_ore_operators.sql +│ ├── integer_ord_ore_aggregates.sql (min/max) │ ├── integer_ord_functions.sql │ ├── integer_ord_operators.sql -│ ├── integer_ord_aggregates.sql (min/max) -│ ├── integer_ord_ore_*.sql -│ └── integer_extensions.sql ← hand-written, COMMITTED (if present) +│ ├── integer_ord_aggregates.sql (min/max) +│ ├── integer_ord_ope_functions.sql +│ ├── integer_ord_ope_operators.sql +│ └── integer_ord_ope_aggregates.sql (min/max) +│ (integer_extensions.sql ← hand-written, COMMITTED, only if present) └── ... ``` @@ -386,17 +404,17 @@ A generated struct (`integer.rs`): #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] -pub struct Int4Eq { +pub struct IntegerEq { pub v: SchemaVersion, pub i: Identifier, pub c: Ciphertext, pub hm: Hmac256, } -impl DomainType for Int4Eq { +impl DomainType for IntegerEq { fn sql_domain_static() -> &'static str { "public.integer_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() } - fn schema(&self) -> Schema { schema_for!(Int4Eq) } + fn schema(&self) -> Schema { schema_for!(IntegerEq) } } ``` @@ -416,8 +434,8 @@ operator blocked). ```mermaid flowchart LR - RS["Rust structs
#[derive(TS, JsonSchema)]"] -->|ts-rs export
via cargo test -p eql-bindings| TS["crates/eql-bindings/bindings/v3/Int4Eq.ts
(45 files)"] - RS -->|schemars via tests/export.rs
injects $id| JS["crates/eql-bindings/schema/v3/integer_eq.json
(39 files)"] + RS["Rust structs
#[derive(TS, JsonSchema)]"] -->|ts-rs export
via cargo test -p eql-bindings| TS["crates/eql-bindings/bindings/v3/IntegerEq.ts
(63 files)"] + RS -->|schemars via tests/export.rs
injects $id| JS["crates/eql-bindings/schema/v3/integer_eq.json
(51 files)"] ``` - **TypeScript:** one `.ts` per domain, importing co-located term types; newtypes become @@ -443,14 +461,14 @@ plaintext values through cipherstash-client. ```mermaid flowchart TD - CV["eql_domains::INT4_VALUES
(catalog plaintexts)"] --> SPEC["FixtureSpec::new("eql_v3_int4")
.with_index(Unique).with_index(Ore)
.with_values(INT4_VALUES)"] + CV["eql_domains::INTEGER_VALUES
(catalog plaintexts)"] --> SPEC["FixtureSpec::new("eql_v3_integer")
.with_index(Unique).with_index(Ore).with_index(Ope)
.with_values(INTEGER_VALUES)"] SPEC --> RUN["spec().run()"] RUN --> ENC["cipherstash::encrypt_store()
→ ZeroKMS (one batch round-trip)"] ENC --> INS["INSERT encrypted payloads into working table"] - INS --> SQL["tests/sqlx/fixtures/eql_v3_int4.sql
(gitignored; {v,i,c,hm,ob} payloads)"] + INS --> SQL["tests/sqlx/fixtures/eql_v3_integer.sql
(gitignored; {v,i,c,hm,ob,op} payloads)"] DISP["generate_all_fixtures.rs
for spec in CATALOG"] --> RUN - DISP -.also.-> EXTRA["non-catalog fixtures
(v3_ste_vec, v3_doc_int4,
v3_numeric_collision, v3_text_empty,
eql_v3_<T>_doubles)"] + DISP -.also.-> EXTRA["non-catalog fixtures
(v3_ste_vec, v3_doc_integer,
v3_numeric_collision, v3_text_empty,
eql_v3_<T>_doubles)"] ``` - The entry point (`generate_all_fixtures.rs`) **iterates `CATALOG` directly**, dispatching @@ -458,7 +476,7 @@ flowchart TD with no fixture wiring fails, so silently-missing fixtures are impossible. - Gated behind `--features fixture-gen`; requires CipherStash creds (ZeroKMS + client key). **CI has them.** This is by design — there are *no* committed/static fixture exceptions. -- Non-catalog fixtures (`v3_ste_vec`, `v3_doc_int4`, `v3_numeric_collision`, +- Non-catalog fixtures (`v3_ste_vec`, `v3_doc_integer`, `v3_numeric_collision`, `v3_text_empty`, and per-type `eql_v3__doubles`) ride the same generation pipeline, so they are generated and gitignored too — not committed blobs. @@ -522,6 +540,14 @@ its matrix wiring fails the `list-types` cross-check. When you change which matr macro emits, regenerate (`test:matrix:snapshots:regen`) and commit the baseline in the same change. +Two **sibling** matrices sit beside these four scalar baselines, each with its own no-DB +inventory gate: + +- `tests/sqlx/snapshots/ope_tests.txt` pins the CLLW-OPE (`_ord_ope`) test-name set, + gated by `mise run test:matrix:inventory:ope`. +- `tests/sqlx/snapshots/matrix_jsonb_entry_tests.txt` pins the `jsonb_entry::…` behaviour + matrix, gated by `mise run test:matrix:inventory:jsonb_entry`. + ### 6.3 Determinism & drift gates ```mermaid @@ -592,7 +618,7 @@ tests. Everything else is one row, the compiler, and the generators. | Fixture plaintexts | `crates/eql-domains/src/fixtures/record.rs`, `crates/eql-domains/src/fixtures/values.rs` | | Catalog invariant tests | `crates/eql-domains/src/tests.rs`, `crates/eql-domains/src/proptest_invariants.rs` | | CLI | `crates/eql-codegen/src/main.rs` | -| SQL renderers | `crates/eql-codegen/src/generate.rs`, `crates/eql-codegen/src/context.rs`, `crates/eql-codegen/templates/*.j2` | +| SQL renderers | `crates/eql-codegen/src/generate.rs`, `crates/eql-codegen/src/context.rs`, `crates/eql-codegen/templates/*.j2` (extractor/wrapper/unsupported templates under `crates/eql-codegen/templates/functions/*.j2`) | | Operator catalog | `crates/eql-codegen/src/operator_surface.rs` | | Bindings renderer | `crates/eql-codegen/src/bindings.rs` | | File-ownership guards | `crates/eql-codegen/src/writer.rs` | diff --git a/docs/reference/database-indexes.md b/docs/reference/database-indexes.md index 6a72e2850..1baa0e3ca 100644 --- a/docs/reference/database-indexes.md +++ b/docs/reference/database-indexes.md @@ -23,11 +23,11 @@ The model is simple and uniform across every encrypted-domain type: **index a fu Each capability has one canonical functional-index recipe. Type the column as the domain variant that carries the term (see [SQL support matrix](./sql-support.md)), then index the matching extractor: ```sql --- Equality (hash index on the eq_term extractor) — eql_v3._eq / _ord / text_search +-- Equality (hash index on the eq_term extractor) — public._eq / _ord / text_search CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)); --- Ordering / range (btree index on the ord_term extractor) — eql_v3._ord / _ord_ore +-- Ordering / range (btree index on the ord_term extractor) — public._ord / _ord_ore CREATE INDEX events_at_ord ON events USING btree (eql_v3.ord_term(encrypted_at)); @@ -72,8 +72,8 @@ For PostgreSQL to use a functional index on an encrypted column, **all** of thes Capability travels in the payload, chosen by the encryption client and reflected in the column's domain variant: -- **Equality** needs an `hm` (hmac_256) term — `eql_v3._eq`, `eql_v3._ord`, or `public.text_search`. -- **Range / ordering** needs an `ob` (ore_block_256) term — `eql_v3._ord` / `_ord_ore` or `public.text_search`. +- **Equality** needs an `hm` (hmac_256) term — `public._eq`, `public._ord`, or `public.text_search`. +- **Range / ordering** needs an `ob` (ore_block_256) term — `public._ord` / `_ord_ore` or `public.text_search`. - **Text containment** needs a `bf` (bloom_filter) term — `public.text_match` or `public.text_search`. A value with only a bloom term will not drive an equality index, and vice versa. @@ -101,7 +101,7 @@ WHERE encrypted_email = '{"hm":"abc"}'::jsonb; ### Equality Queries -A column typed `eql_v3._eq` (or `_ord`, or `text_search`) with a hash index on `eql_v3.eq_term(col)`: +A column typed `public._eq` (or `_ord`, or `text_search`) with a hash index on `eql_v3.eq_term(col)`: ```sql CREATE INDEX users_email_eq ON users USING hash (eql_v3.eq_term(encrypted_email)); diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index b833fc6b5..030b94da8 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -1,6 +1,6 @@ # EQL Functions Reference -A reference for the functions and operators EQL exposes for querying encrypted data in PostgreSQL. The surface lives in the **`eql_v3`** schema and is organised around the per-scalar encrypted-domain types (`eql_v3.` and variants) and the encrypted-JSON document type (`public.json`). +A reference for the functions and operators EQL exposes for querying encrypted data in PostgreSQL. The surface lives in the **`eql_v3`** schema and is organised around the per-scalar encrypted-domain types (`public.` and variants) and the encrypted-JSON document type (`public.json`). > **There is no database-side configuration API.** Which index terms a value carries is chosen by the encryption client ([CipherStash Proxy](https://github.com/cipherstash/proxy) / [CipherStash Stack](https://github.com/cipherstash/stack)); a column's capability is fixed by the **domain variant** you type it as. See [SQL support matrix](./sql-support.md) for the variant/operator table. @@ -20,7 +20,7 @@ EQL overloads standard PostgreSQL operators on the encrypted-domain types. Type ### Equality — `=` `<>` -On `eql_v3._eq`, `eql_v3._ord` / `_ord_ore`, and `public.text_search` (carry an `hm` term): +On `public._eq`, `public._ord` / `_ord_ore`, and `public.text_search` (carry an `hm` term): ```sql SELECT * FROM users WHERE encrypted_email = $1; @@ -30,7 +30,7 @@ SELECT * FROM users WHERE encrypted_email <> $1; ### Range — `<` `<=` `>` `>=` -On `eql_v3._ord` / `_ord_ore` and `public.text_search` (carry an `ob` ORE term): +On `public._ord` / `_ord_ore` and `public.text_search` (carry an `ob` ORE term): ```sql SELECT * FROM events WHERE encrypted_at < $1::public.timestamp_ord; @@ -84,16 +84,16 @@ There are no `like` / `ilike` function forms — text matching is `eql_v3.contai ## Index Term Extraction -These extract the index term from an encrypted-domain value. They are generated per eq/ord/match-capable variant of every scalar type, are inlinable (so a functional index on the extractor engages), and return the self-contained `eql_v3` SEM index-term types. See [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md). +These extract the index term from an encrypted-domain value. They are generated per eq/ord/match-capable variant of every scalar type, are inlinable (so a functional index on the extractor engages), and return the self-contained `eql_v3_internal` SEM index-term types. See [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md). ```sql -- Equality term (hm) -eql_v3.eq_term(a public.integer_eq) RETURNS eql_v3.hmac_256 +eql_v3.eq_term(a public.integer_eq) RETURNS eql_v3_internal.hmac_256 -- Ordering term (ob) -eql_v3.ord_term(a public.integer_ord) RETURNS eql_v3.ore_block_256 -eql_v3.ord_term(a public.integer_ord_ore) RETURNS eql_v3.ore_block_256 +eql_v3.ord_term(a public.integer_ord) RETURNS eql_v3_internal.ore_block_256 +eql_v3.ord_term(a public.integer_ord_ore) RETURNS eql_v3_internal.ore_block_256 -- Text-match term (bf) -eql_v3.match_term(a public.text_match) RETURNS eql_v3.bloom_filter +eql_v3.match_term(a public.text_match) RETURNS eql_v3_internal.bloom_filter ``` **Example — functional indexes on the extracted terms** (see [Database Indexes](./database-indexes.md)): @@ -104,7 +104,7 @@ CREATE INDEX ON users USING btree (eql_v3.ord_term(salary_ord)); CREATE INDEX ON users USING gin (eql_v3.match_term(name_match)); ``` -> The full per-domain operator / wrapper / blocker surface (and the `eql_v3.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v3t) and the [scalar encrypted-domain type reference](./adding-a-scalar-encrypted-domain-type.md). +> The full per-domain operator / wrapper / blocker surface (and the `public.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v3t) and the [scalar encrypted-domain type reference](./adding-a-scalar-encrypted-domain-type.md). The `public.json` document type extracts entry-level terms with `eql_v3.eq_term(public.jsonb_entry)` and `eql_v3.ore_cllw(public.jsonb_entry)` — see [json-support.md](./json-support.md). @@ -120,7 +120,7 @@ The full encrypted-JSONB function surface — containment, `->` / `->>`, `eql_v3 ### `eql_v3.min()` / `eql_v3.max()` (per-domain) -Returns the minimum or maximum encrypted value on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`eql_v3._ord`, `eql_v3._ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. +Returns the minimum or maximum encrypted value on an ordered encrypted-domain column. Defined per ord-capable variant of every scalar type (`public._ord`, `public._ord_ore`); the input type selects the aggregate via PostgreSQL's overload resolution. ```sql -- integer — generated for every ordered variant of every scalar type. diff --git a/docs/reference/json-support.md b/docs/reference/json-support.md index 0927d5890..2f1b9e6d7 100644 --- a/docs/reference/json-support.md +++ b/docs/reference/json-support.md @@ -6,7 +6,7 @@ EQL encrypts, decrypts, and searches JSON / JSONB documents using structured enc - [Storing encrypted JSON](#storing-encrypted-json) - [Typed operands (important)](#typed-operands-important) -- [Querying `public.json`](#querying-eql_v3json) +- [Querying `public.json`](#querying-publicjson) - [Containment queries (`@>`, `<@`)](#containment-queries) - [Field extraction (`jsonb_path_query`)](#field-extraction-jsonb_path_query) - [JSON path operators (`->`, `->>`)](#json-path-operators) diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index b0ae15e58..044f7d164 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -2,7 +2,7 @@ This page summarises which SQL operators and language features work against EQL-encrypted columns, and which encrypted-domain **type** each one requires. -EQL ships its searchable-encryption surface as PostgreSQL **domains in the `eql_v3` schema**: +EQL ships its searchable-encryption surface as PostgreSQL **domains in the `public` schema**: - **per-scalar encrypted-domain types** — `public.integer`, `public.text`, `public.timestamp`, … — one family of domain *variants* per scalar; and - **an encrypted-JSON document type** — `public.json` — for structured-encryption (ste_vec) JSONB. @@ -11,22 +11,22 @@ The capability of a column is fixed by the **domain variant you type it as**. Th --- -## Encrypted-domain scalar types (`eql_v3.`) +## Encrypted-domain scalar types (`public.`) -Each scalar type `` is a family of `jsonb`-backed domains in `eql_v3`. The catalog scalar tokens that ship today are: +Each scalar type `` is a family of `jsonb`-backed domains in `public`. The catalog scalar tokens that ship today are: `smallint`, `integer`, `bigint`, `numeric`, `real`, `double`, `date`, `timestamp`, `text`, `boolean`. -(See [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md) for how the family is generated.) The domains live in the `eql_v3` schema — `DROP SCHEMA eql_v3 CASCADE` removes them — and their extracted index-term types are the self-contained `eql_v3` SEM types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.bloom_filter`). +(See [Adding a Scalar Encrypted-Domain Type](./adding-a-scalar-encrypted-domain-type.md) for how the family is generated.) The domains live in the `public` schema, so they survive `DROP SCHEMA eql_v3 CASCADE` — dropping `eql_v3` removes the operators, extractors, and aggregates but leaves the `public`-typed columns and their data intact. Their extracted index-term types are the self-contained `eql_v3_internal` SEM types (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`, `eql_v3_internal.bloom_filter`). Every scalar generates a storage-only variant plus the query variants its capabilities allow: | Domain variant | Index term carried | Extractor (for indexing) | `=` `<>` | `<` `<=` `>` `>=` | `MIN` / `MAX` | `@>` `<@` | | ----------------------------- | ------------------------- | ------------------------ | :------: | :---------------: | :-----------: | :-------: | -| `eql_v3.` | none (storage only) | — | ❌ | ❌ | ❌ | ❌ | -| `eql_v3._eq` | `hm` (hmac_256) | `eql_v3.eq_term(col)` | ✅ | ❌ | ❌ | ❌ | -| `eql_v3._ord` / `_ord_ore` | `ob` (ore_block_256) | `eql_v3.ord_term(col)` | ✅ | ✅ | ✅ | ❌ | -| `eql_v3._ord_ope` | `op` (ope_cllw) | `eql_v3.ord_ope_term(col)` | ✅ | ✅ | ✅ | ❌ | +| `public.` | none (storage only) | — | ❌ | ❌ | ❌ | ❌ | +| `public._eq` | `hm` (hmac_256) | `eql_v3.eq_term(col)` | ✅ | ❌ | ❌ | ❌ | +| `public._ord` / `_ord_ore` | `ob` (ore_block_256) | `eql_v3.ord_term(col)` | ✅ | ✅ | ✅ | ❌ | +| `public._ord_ope` | `op` (ope_cllw) | `eql_v3.ord_ope_term(col)` | ✅ | ✅ | ✅ | ❌ | | `public.text_match` | `bf` (bloom_filter) | `eql_v3.match_term(col)` | ❌ | ❌ | ❌ | ✅\* | | `public.text_search` | `hm` + `ob` + `bf` | all three extractors | ✅ | ✅ | ✅ | ✅\* | @@ -34,13 +34,13 @@ Every scalar generates a storage-only variant plus the query variants its capabi Notes: -- The bare `eql_v3.` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site, e.g. `col::public.integer_ord`) when you need to query. +- The bare `public.` variant carries no index term and **blocks every comparison operator** — it is storage / decryption only. Type the column as `_eq` or `_ord` (or cast at the call site, e.g. `col::public.integer_ord`) when you need to query. - `_ord` and `_ord_ore` are **twins**: byte-identical surfaces backed by the ORE block term. Pick the name that documents intent ("ordered" vs "ordered via ORE block"); both support the full ordered surface and the `MIN` / `MAX` aggregates. - `_ord_ope` exposes the **same ordered surface** backed by the CLLW-OPE term instead: `op` is a hex-encoded, order-preserving ciphertext compared by native bytea ordering after hex-decode (no custom comparison protocol). On `text_ord_ope`, `=` / `<>` route through `hm` (exact HMAC), like `text_ord` — OPE over text is not equality-lossless. - `=` / `<>` is the only searchable surface for `_eq`. On `_ord` variants the equality operators are available too (alongside the ordered ones). - `boolean` is **storage-only** by design — a two-value column has too little cardinality for any searchable index to be safe, so it ships only `public.boolean` (no `_eq` / `_ord`). - `LIKE` / `ILIKE` (`~~` / `~~*`) and the native JSONB operators are **blocked on every scalar domain variant** — they are meaningless on a scalar payload. Text matching is the bloom-filter `@>` on `text_match`, not `LIKE`. -- `MIN` / `MAX` are exposed only on the ordered variants, as `eql_v3.min(eql_v3._ord)` / `eql_v3.max(...)` (and the `_ord_ore` twin) — see [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). +- `MIN` / `MAX` are exposed only on the ordered variants, as `eql_v3.min(public._ord)` / `eql_v3.max(...)` (and the `_ord_ore` twin) — see [EQL Functions Reference](./eql-functions.md#eql_v3min--eql_v3max-per-domain). --- @@ -48,7 +48,7 @@ Notes: A ✅ means the operator resolves on a column typed as that domain variant. A ❌ means the operator is blocked (it raises) for that variant. -| SQL operator | Meaning | `eql_v3.` | `_eq` | `_ord` / `_ord_ore` / `_ord_ope` | `text_match` | `text_search` | +| SQL operator | Meaning | `public.` | `_eq` | `_ord` / `_ord_ore` / `_ord_ope` | `text_match` | `text_search` | | ------------------------- | ------------------------------ | :----------: | :---: | :-----------------: | :----------: | :-----------: | | `=` | Equality | ❌ | ✅ | ✅ | ❌ | ✅ | | `<>` / `!=` | Inequality | ❌ | ✅ | ✅ | ❌ | ✅ | @@ -77,7 +77,7 @@ This matrix covers higher-level SQL constructs. As above, ✅ requires the colum | `WHERE col IN (…)` | desugars to `=` | `_eq`, `_ord`, `text_search` | | `ORDER BY col` | meaningful only with an ORE term | `_ord`, `text_search` | | `GROUP BY col` / `DISTINCT` | needs an equality term | `_eq`, `_ord`, `text_search` | -| `MIN(col)` / `MAX(col)` | `eql_v3.min(eql_v3._ord)` / `max` — type the column as `_ord` or cast at the call site (`eql_v3.min(col::public.integer_ord)`) | `_ord` | +| `MIN(col)` / `MAX(col)` | `eql_v3.min(public._ord)` / `max` — type the column as `_ord` or cast at the call site (`eql_v3.min(col::public.integer_ord)`) | `_ord` | | `COUNT(col)` / `COUNT(DISTINCT col)` | plain `COUNT(col)` needs no term; `DISTINCT` needs an equality term | any / `_eq` for `DISTINCT` | | `JOIN … ON lhs.col = rhs.col` | both sides must share the same keyset and a matching variant | `_eq`, `_ord`, `text_search` | From b63db45916e8c96a78294f49051e428150b8e330 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 6 Jul 2026 11:47:56 +1000 Subject: [PATCH 526/599] docs(reference): fix broken cross-doc anchor and list-schemas ordering - eql-functions.md: the SQL-support link targeted the pre-rename anchor (#encrypted-domain-scalar-types-eql_v3t); the heading was renamed to public. this branch, so point at #encrypted-domain-scalar-types-publict. - catalog-driven-architecture.md / adding-a-scalar: list-schemas prints owned_schemas() = [eql_v3, eql_v3_internal] (public is not emitted), so correct the 'public first' label to 'eql_v3 first'. --- docs/reference/adding-a-scalar-encrypted-domain-type.md | 2 +- docs/reference/catalog-driven-architecture.md | 2 +- docs/reference/eql-functions.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/reference/adding-a-scalar-encrypted-domain-type.md b/docs/reference/adding-a-scalar-encrypted-domain-type.md index cdd42972b..4cb820f5e 100644 --- a/docs/reference/adding-a-scalar-encrypted-domain-type.md +++ b/docs/reference/adding-a-scalar-encrypted-domain-type.md @@ -800,7 +800,7 @@ runs as `cargo run -p eql-codegen` (no subcommand), which calls `src/v3/scalars//`. Five subcommands round out the surface: `list-types` prints the catalog tokens one per line (consumed by the fixture and matrix-inventory enumeration); `list-schemas` prints the schemas the -`eql_v3` surface owns, public first (consumed by `mise run test:schemas:parity`); +`eql_v3` surface owns (`eql_v3`, then `eql_v3_internal`; consumed by `mise run test:schemas:parity`); `dump-catalog` prints the catalog surface (types → domains → supported operators) as JSON (consumed by the catalog-coverage / log-verification gates); `bindings` regenerates the diff --git a/docs/reference/catalog-driven-architecture.md b/docs/reference/catalog-driven-architecture.md index b28a0f281..2af1100f9 100644 --- a/docs/reference/catalog-driven-architecture.md +++ b/docs/reference/catalog-driven-architecture.md @@ -238,7 +238,7 @@ flowchart LR CLI --> B["bindings
generate_bindings → Rust bindings"] CLI --> E["clean
clean_all → remove generated SQL"] CLI --> C["list-types
scalar_families() tokens, one per line"] - CLI --> F["list-schemas
owned schemas (public first)"] + CLI --> F["list-schemas
owned schemas (eql_v3 first)"] CLI --> D["dump-catalog
JSON of types→domains→ops"] ``` diff --git a/docs/reference/eql-functions.md b/docs/reference/eql-functions.md index 030b94da8..ade9629b8 100644 --- a/docs/reference/eql-functions.md +++ b/docs/reference/eql-functions.md @@ -104,7 +104,7 @@ CREATE INDEX ON users USING btree (eql_v3.ord_term(salary_ord)); CREATE INDEX ON users USING gin (eql_v3.match_term(name_match)); ``` -> The full per-domain operator / wrapper / blocker surface (and the `public.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-eql_v3t) and the [scalar encrypted-domain type reference](./adding-a-scalar-encrypted-domain-type.md). +> The full per-domain operator / wrapper / blocker surface (and the `public.` / `_eq` / `_ord` / `_ord_ore` domain types themselves) is documented in [SQL support](./sql-support.md#encrypted-domain-scalar-types-publict) and the [scalar encrypted-domain type reference](./adding-a-scalar-encrypted-domain-type.md). The `public.json` document type extracts entry-level terms with `eql_v3.eq_term(public.jsonb_entry)` and `eql_v3.ore_cllw(public.jsonb_entry)` — see [json-support.md](./json-support.md). From 1ddc23e69cab652c17a10005b7a4fa716613c142 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 6 Jul 2026 11:52:20 +1000 Subject: [PATCH 527/599] ci(release): verify alpha pin signatures --- .../release-alpha-verify-commit-signature.sh | 25 ++++++ ...ease-alpha-verify-commit-signature.test.sh | 81 +++++++++++++++++++ .github/workflows/lint-release.yml | 7 +- .github/workflows/release-alpha.yml | 6 ++ 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100755 .github/scripts/release-alpha-verify-commit-signature.sh create mode 100755 .github/scripts/release-alpha-verify-commit-signature.test.sh diff --git a/.github/scripts/release-alpha-verify-commit-signature.sh b/.github/scripts/release-alpha-verify-commit-signature.sh new file mode 100755 index 000000000..dd61d33e2 --- /dev/null +++ b/.github/scripts/release-alpha-verify-commit-signature.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Verify that GitHub accepts a pushed commit's signature as valid. +set -euo pipefail + +release_alpha_verify_commit_signature() { + local commit_sha="$1" repo verification verified reason + repo="${GITHUB_REPOSITORY:?}" + + verification="$( + gh api "repos/${repo}/commits/${commit_sha}" \ + --jq '.commit.verification | "\(.verified) \(.reason)"' + )" + read -r verified reason <<< "$verification" + + if [[ "$verified" != "true" || "$reason" != "valid" ]]; then + echo "error: commit ${commit_sha} is not GitHub-verified (verified=${verified:-} reason=${reason:-})" >&2 + return 1 + fi + + echo "GitHub verified signed commit ${commit_sha} (${reason})" +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + release_alpha_verify_commit_signature "${1:?commit sha required}" +fi diff --git a/.github/scripts/release-alpha-verify-commit-signature.test.sh b/.github/scripts/release-alpha-verify-commit-signature.test.sh new file mode 100755 index 000000000..73288089d --- /dev/null +++ b/.github/scripts/release-alpha-verify-commit-signature.test.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# Tests for release-alpha-verify-commit-signature.sh with a stubbed gh CLI. +set -uo pipefail + +here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=/dev/null +source "${here}/release-alpha-verify-commit-signature.sh" +set +e + +fail=0 + +setup_gh() { + tmp="$(mktemp -d)" + mkdir -p "$tmp/bin" + cat > "$tmp/bin/gh" <<'SCRIPT' +#!/usr/bin/env bash +set -euo pipefail +echo "$*" >> "$GH_STUB_LOG" +printf '%s %s\n' "${GH_VERIFIED:-true}" "${GH_REASON:-valid}" +SCRIPT + chmod +x "$tmp/bin/gh" +} + +check_valid_signature() { + local output status + setup_gh + output="$( + PATH="$tmp/bin:$PATH" GH_STUB_LOG="$tmp/log" GITHUB_REPOSITORY=cipherstash/encrypt-query-language \ + release_alpha_verify_commit_signature abc123 2>&1 + )" + status=$? + if [[ "$status" -eq 0 && "$output" == *"GitHub verified signed commit abc123 (valid)"* && "$(cat "$tmp/log")" == *"repos/cipherstash/encrypt-query-language/commits/abc123"* ]]; then + echo "ok: valid GitHub verification passes" + else + echo "FAIL: valid signature status=$status output='$output' log='$(cat "$tmp/log" 2>/dev/null)'" + fail=1 + fi + rm -rf "$tmp" +} + +check_unverified_signature_fails() { + local output status + setup_gh + output="$( + PATH="$tmp/bin:$PATH" GH_STUB_LOG="$tmp/log" GITHUB_REPOSITORY=cipherstash/encrypt-query-language \ + GH_VERIFIED=false GH_REASON=unknown_key \ + release_alpha_verify_commit_signature abc123 2>&1 + )" + status=$? + if [[ "$status" -ne 0 && "$output" == *"not GitHub-verified"* && "$output" == *"reason=unknown_key"* ]]; then + echo "ok: unverified GitHub signature fails" + else + echo "FAIL: unverified signature status=$status output='$output'" + fail=1 + fi + rm -rf "$tmp" +} + +check_non_valid_reason_fails() { + local output status + setup_gh + output="$( + PATH="$tmp/bin:$PATH" GH_STUB_LOG="$tmp/log" GITHUB_REPOSITORY=cipherstash/encrypt-query-language \ + GH_VERIFIED=true GH_REASON=unverified_email \ + release_alpha_verify_commit_signature abc123 2>&1 + )" + status=$? + if [[ "$status" -ne 0 && "$output" == *"not GitHub-verified"* && "$output" == *"reason=unverified_email"* ]]; then + echo "ok: non-valid GitHub verification reason fails" + else + echo "FAIL: non-valid reason status=$status output='$output'" + fail=1 + fi + rm -rf "$tmp" +} + +check_valid_signature +check_unverified_signature_fails +check_non_valid_reason_fails + +exit "$fail" diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml index 0347e990b..d389382a8 100644 --- a/.github/workflows/lint-release.yml +++ b/.github/workflows/lint-release.yml @@ -65,7 +65,9 @@ jobs: .github/scripts/release-alpha-resolve.sh \ .github/scripts/release-alpha-resolve.test.sh \ .github/scripts/release-alpha-pin-bindings.sh \ - .github/scripts/release-alpha-pin-bindings.test.sh + .github/scripts/release-alpha-pin-bindings.test.sh \ + .github/scripts/release-alpha-verify-commit-signature.sh \ + .github/scripts/release-alpha-verify-commit-signature.test.sh - name: identity-derivation unit test run: bash .github/scripts/derive-identity.test.sh @@ -75,3 +77,6 @@ jobs: - name: release-alpha pin helper test run: bash .github/scripts/release-alpha-pin-bindings.test.sh + + - name: release-alpha signature verification helper test + run: bash .github/scripts/release-alpha-verify-commit-signature.test.sh diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml index 57994016c..a37812a17 100644 --- a/.github/workflows/release-alpha.yml +++ b/.github/workflows/release-alpha.yml @@ -166,6 +166,12 @@ jobs: GH_TOKEN: ${{ github.token }} run: .github/scripts/release-alpha-pin-bindings.sh + - name: Verify pin commit signature + env: + GH_TOKEN: ${{ github.token }} + COMMIT_SHA: ${{ steps.commit.outputs.commit_sha }} + run: .github/scripts/release-alpha-verify-commit-signature.sh "$COMMIT_SHA" + build-sql: name: Build + release SQL (in-run) needs: [resolve, pin] From 09297df3136c48cab628f56c79e766a1c246739d Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 00:29:31 +1000 Subject: [PATCH 528/599] docs: emit a JSON API manifest alongside the Markdown reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds `docs:generate:json` (tasks/docs/generate/xml-to-json.py), which converts the Doxygen XML into a structured `eql-manifest.json`, reusing xml-to-markdown's extraction so the JSON manifest and the Markdown reference never diverge in how they read the XML. Packaged into the `eql-docs-` release archives and run in the release workflow after the Markdown step. The manifest is a machine-readable API surface (per function: signature, brief, description, params, returns, throws, notes, source) for downstream consumers — docs generation, agents, and drift-checking hand-written reference pages against the shipped EQL version. Additive; the Markdown path and outputs are unchanged. Includes tasks/docs/generate/test_xml_to_json.py. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- .github/workflows/_build-docs.yml | 1 + tasks/docs/generate/json.sh | 20 ++++ tasks/docs/generate/test_xml_to_json.py | 83 ++++++++++++++++ tasks/docs/generate/xml-to-json.py | 124 ++++++++++++++++++++++++ tasks/docs/package.sh | 10 +- 5 files changed, 236 insertions(+), 2 deletions(-) create mode 100755 tasks/docs/generate/json.sh create mode 100755 tasks/docs/generate/test_xml_to_json.py create mode 100755 tasks/docs/generate/xml-to-json.py diff --git a/.github/workflows/_build-docs.yml b/.github/workflows/_build-docs.yml index 81a006f7e..a07cd982e 100644 --- a/.github/workflows/_build-docs.yml +++ b/.github/workflows/_build-docs.yml @@ -59,6 +59,7 @@ jobs: set -euo pipefail mise run docs:generate mise run docs:generate:markdown -- "${TAG}" + mise run docs:generate:json -- "${TAG}" - name: Package documentation env: diff --git a/tasks/docs/generate/json.sh b/tasks/docs/generate/json.sh new file mode 100755 index 000000000..91316701e --- /dev/null +++ b/tasks/docs/generate/json.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +#MISE description="Generate JSON manifest from XML documentation" +#USAGE arg "version" help="Version to include in the manifest" default="DEV" + +VERSION=${ARGC_VERSION:-DEV} + +echo "Converting XML to JSON manifest..." + +# Ensure XML exists +if [ ! -d "docs/api/xml" ]; then + echo "warning: XML documentation not found" + echo "Generating XML documentation..." + mise run --output prefix docs:generate +fi + +# Run converter +mise run --output prefix docs:generate:xml-to-json docs/api/xml docs/api/json "$VERSION" + +echo "" +echo "✓ JSON manifest: docs/api/json/eql-manifest.json" diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py new file mode 100755 index 000000000..c7c7ca583 --- /dev/null +++ b/tasks/docs/generate/test_xml_to_json.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +""" +Tests for xml-to-json.py + +Verifies the JSON manifest is built from the same Doxygen XML extraction as +the Markdown reference (reuse of process_function), and has the expected shape. +""" + +import importlib.util +import json +import tempfile +from pathlib import Path + +# xml-to-json.py is hyphenated → load by path. +_spec = importlib.util.spec_from_file_location( + "eql_xml_to_json", Path(__file__).parent / "xml-to-json.py" +) +_mod = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_mod) +build_manifest = _mod.build_manifest + +SAMPLE_XML = """ + + + + hmac_256 + (val jsonb) RETURNS text + + val + jsonb + + Compute the HMAC-SHA-256 term for a value. + + Used for equality search. + + + val + jsonb the encrypted value + + + the HMAC term + + + + + +""" + + +def test_build_manifest_shape(): + with tempfile.TemporaryDirectory() as d: + (Path(d) / "hmac.xml").write_text(SAMPLE_XML) + manifest = build_manifest(Path(d), "1.2.3") + + assert manifest["name"] == "eql" + assert manifest["version"] == "1.2.3" + assert manifest["counts"]["functions"] == 1 + assert manifest["counts"]["public"] == 1 + + fn = manifest["functions"][0] + assert fn["name"] == "hmac_256" + assert fn["visibility"] == "public" + assert "HMAC" in fn["brief"] + assert fn["returns"]["description"] == "the HMAC term" + assert fn["source"] == {"file": "src/hmac_256/functions.sql", "line": 12} + assert any(p["name"] == "val" for p in fn["params"]) + + # Must be JSON-serializable. + json.dumps(manifest) + + +def test_skips_index_and_doxyfile(): + with tempfile.TemporaryDirectory() as d: + (Path(d) / "index.xml").write_text(SAMPLE_XML) + (Path(d) / "Doxyfile.xml").write_text(SAMPLE_XML) + manifest = build_manifest(Path(d), "DEV") + assert manifest["counts"]["functions"] == 0 + + +if __name__ == "__main__": + test_build_manifest_shape() + test_skips_index_and_doxyfile() + print("✓ all tests passed") diff --git a/tasks/docs/generate/xml-to-json.py b/tasks/docs/generate/xml-to-json.py new file mode 100755 index 000000000..d75b72c5c --- /dev/null +++ b/tasks/docs/generate/xml-to-json.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +#MISE hide=true +""" +Doxygen XML -> structured JSON manifest for EQL's SQL API. + +A machine-readable companion to xml-to-markdown.py. Same Doxygen XML, same +SQL-via-Doxygen quirk handling (parameter name/type swap, operator names in +brief text, RETURNS extraction) — this emits JSON instead of Markdown, for +downstream consumers: docs generation, agents, and drift checks against the +hand-written reference. + +Reuses the extraction in xml-to-markdown.py so the manifest and the Markdown +reference can never diverge in how they read the XML. + +Usage: xml-to-json.py [output_dir] [version] +""" + +import importlib.util +import json +import sys +import xml.etree.ElementTree as ET +from pathlib import Path + +# xml-to-markdown.py has a hyphen in its name, so it can't be `import`ed +# normally; load it by path and reuse process_function verbatim. +_spec = importlib.util.spec_from_file_location( + "eql_xml_to_markdown", Path(__file__).parent / "xml-to-markdown.py" +) +_mod = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_mod) +process_function = _mod.process_function + + +def _strip_ticks(value): + return value.strip("`").strip() if value else "" + + +def _int_or_none(value): + try: + return int(value) + except (TypeError, ValueError): + return None + + +def _to_entry(func): + """Shape one extracted function into a manifest entry.""" + return { + "name": func["name"], + "signature": func["signature"], + "visibility": "private" if func["is_private"] else "public", + "brief": func["brief"], + "description": func["detailed"], + "params": func["params"], # [{name, type, description}] + "returns": { + "type": _strip_ticks(func["return_type"]), + "description": func["return_desc"], + }, + "throws": func["exceptions"], + "notes": func["notes"], + "warnings": func["warnings"], + "seeAlso": func["see_also"], + "source": {"file": func["source"], "line": _int_or_none(func["line"])}, + } + + +def build_manifest(xml_dir: Path, version: str) -> dict: + functions = [] + for xml_file in sorted(xml_dir.glob("*.xml")): + if xml_file.name in ("index.xml", "Doxyfile.xml"): + continue + try: + root = ET.parse(xml_file).getroot() + except ET.ParseError as exc: + print(f"Warning: failed to parse {xml_file.name}: {exc}", file=sys.stderr) + continue + for memberdef in root.findall('.//memberdef[@kind="function"]'): + func = process_function(memberdef) + if func: + functions.append(func) + + functions.sort(key=lambda f: (f["is_private"], f["name"], f["signature"])) + + return { + "$schema": "https://schemas.cipherstash.com/eql/manifest/v1.json", + "name": "eql", + "version": version, + "generatedFrom": "doxygen-xml", + "counts": { + "functions": len(functions), + "public": sum(1 for f in functions if not f["is_private"]), + "private": sum(1 for f in functions if f["is_private"]), + }, + "functions": [_to_entry(f) for f in functions], + } + + +def main(): + if len(sys.argv) < 2: + print("Usage: xml-to-json.py [output_dir] [version]") + sys.exit(1) + + xml_dir = Path(sys.argv[1]) + output_dir = Path(sys.argv[2]) if len(sys.argv) > 2 else Path("docs/api/json") + version = sys.argv[3] if len(sys.argv) > 3 else "DEV" + + if not xml_dir.exists(): + print(f"Error: XML directory not found: {xml_dir}") + sys.exit(1) + + manifest = build_manifest(xml_dir, version) + output_dir.mkdir(parents=True, exist_ok=True) + output_file = output_dir / "eql-manifest.json" + output_file.write_text(json.dumps(manifest, indent=2) + "\n") + + counts = manifest["counts"] + print(f"✓ Generated JSON manifest: {output_file}") + print( + f" Functions: {counts['functions']} " + f"({counts['public']} public, {counts['private']} private)" + ) + + +if __name__ == "__main__": + main() diff --git a/tasks/docs/package.sh b/tasks/docs/package.sh index 81ed50e0c..89706b3d7 100755 --- a/tasks/docs/package.sh +++ b/tasks/docs/package.sh @@ -28,6 +28,12 @@ if [ ! -d "${DOCS_DIR}/xml" ] || [ -z "$(ls -A ${DOCS_DIR}/xml/*.xml 2>/dev/null exit 1 fi +if [ ! -f "${DOCS_DIR}/json/eql-manifest.json" ]; then + echo "Error: ${DOCS_DIR}/json/eql-manifest.json not found" + echo "Run 'mise run docs:generate:json' first to generate the JSON manifest" + exit 1 +fi + # Create output directory @@ -38,11 +44,11 @@ echo "Creating archives..." cd "${DOCS_DIR}" # Create ZIP archive with all documentation formats -zip -r -q "../../${OUTPUT_DIR}/eql-docs-${VERSION}.zip" markdown/API.md xml/*.xml html/ +zip -r -q "../../${OUTPUT_DIR}/eql-docs-${VERSION}.zip" markdown/API.md json/eql-manifest.json xml/*.xml html/ echo "Created ${OUTPUT_DIR}/eql-docs-${VERSION}.zip" # Create tarball with all documentation formats -tar czf "../../${OUTPUT_DIR}/eql-docs-${VERSION}.tar.gz" markdown/API.md xml/ html/ +tar czf "../../${OUTPUT_DIR}/eql-docs-${VERSION}.tar.gz" markdown/API.md json/ xml/ html/ echo "Created ${OUTPUT_DIR}/eql-docs-${VERSION}.tar.gz" cd ../.. From 8bd430a2e8b3bbe28284f2189c3670501ee8d0cf Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 09:54:11 +1000 Subject: [PATCH 529/599] docs: include the encrypted domain/variant matrix in the manifest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Doxygen doesn't extract CREATE DOMAIN, but the domain variants (eql_v3._eq / _ord / _ord_ore / _ord_ope / _match / _search) are the core of the EQL v3 surface — arguably the most important thing to document. Parse the generated `src/v3/**/*_types.sql` (source of truth: the Rust catalog in crates/eql-domains) and derive each domain's capability structurally from its CHECK keys — hm=equality, ob/op=order, bf=match, sv=json — plus the extractor function per term (hmac_256 / ore_block_256 / bloom_filter). The manifest now carries a `domains` array (name, type, variant, base, terms, capabilities, termFunctions, source) alongside `functions`. No DB or Rust build required. Verified against the real v3 SQL (51 domains): e.g. text_search → [equality, order, match], integer_ord → [order], storage-only types → [storage]. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- tasks/docs/generate/test_xml_to_json.py | 36 +++++++- tasks/docs/generate/xml-to-json.py | 109 ++++++++++++++++++++++-- 2 files changed, 139 insertions(+), 6 deletions(-) diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py index c7c7ca583..8798d20c8 100755 --- a/tasks/docs/generate/test_xml_to_json.py +++ b/tasks/docs/generate/test_xml_to_json.py @@ -18,6 +18,23 @@ _mod = importlib.util.module_from_spec(_spec) _spec.loader.exec_module(_mod) build_manifest = _mod.build_manifest +parse_domains = _mod.parse_domains + +DOMAIN_SQL = """DO $$ +BEGIN + --! @brief Encrypted domain eql_v3.text_eq. + IF NOT EXISTS (SELECT 1) THEN + CREATE DOMAIN eql_v3.text_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '3' + ); + END IF; +END $$;""" SAMPLE_XML = """ @@ -50,7 +67,7 @@ def test_build_manifest_shape(): with tempfile.TemporaryDirectory() as d: (Path(d) / "hmac.xml").write_text(SAMPLE_XML) - manifest = build_manifest(Path(d), "1.2.3") + manifest = build_manifest(Path(d), "1.2.3", src_dir=Path(d)) assert manifest["name"] == "eql" assert manifest["version"] == "1.2.3" @@ -77,7 +94,24 @@ def test_skips_index_and_doxyfile(): assert manifest["counts"]["functions"] == 0 +def test_parse_domains(): + with tempfile.TemporaryDirectory() as d: + (Path(d) / "text_types.sql").write_text(DOMAIN_SQL) + domains = parse_domains(Path(d)) + + assert len(domains) == 1 + dm = domains[0] + assert dm["name"] == "eql_v3.text_eq" + assert dm["type"] == "text" + assert dm["variant"] == "eq" + assert dm["terms"] == ["hm"] # envelope keys (v/i/c) excluded + assert dm["capabilities"] == ["equality"] + assert dm["termFunctions"] == ["eql_v3.hmac_256"] + assert dm["brief"] == "Encrypted domain eql_v3.text_eq." + + if __name__ == "__main__": test_build_manifest_shape() test_skips_index_and_doxyfile() + test_parse_domains() print("✓ all tests passed") diff --git a/tasks/docs/generate/xml-to-json.py b/tasks/docs/generate/xml-to-json.py index d75b72c5c..efc569851 100755 --- a/tasks/docs/generate/xml-to-json.py +++ b/tasks/docs/generate/xml-to-json.py @@ -12,11 +12,16 @@ Reuses the extraction in xml-to-markdown.py so the manifest and the Markdown reference can never diverge in how they read the XML. -Usage: xml-to-json.py [output_dir] [version] +Doxygen does not extract CREATE DOMAIN, so the manifest also parses the +generated domain SQL to emit the encrypted domain/variant matrix (the core of +the EQL v3 surface) — each domain's capability derived from its CHECK keys. + +Usage: xml-to-json.py [output_dir] [version] [sql_src_dir] """ import importlib.util import json +import re import sys import xml.etree.ElementTree as ET from pathlib import Path @@ -63,7 +68,96 @@ def _to_entry(func): } -def build_manifest(xml_dir: Path, version: str) -> dict: +# ── Encrypted domains ──────────────────────────────────────────────────────── +# Doxygen does not extract CREATE DOMAIN, but the domain/variant matrix is the +# core of the EQL v3 surface. The generated `*_types.sql` (source of truth: the +# Rust catalog in crates/eql-domains) encodes each domain's capability +# STRUCTURALLY as the required CHECK keys, so we derive it directly: +# hm = HMAC equality · ob = ORE order · op = OPE order · bf = bloom match · +# sv = STE-vec (JSON). v/i/c are the envelope, not index terms. +_ENVELOPE_KEYS = {"v", "i", "c", "k"} +_TERM_CAPABILITY = { + "hm": "equality", + "ob": "order", + "op": "order", + "bf": "match", + "sv": "json", +} +# Term -> extractor function (from crates/eql-domains/src/term.rs). +_TERM_FUNCTION = { + "hm": "eql_v3.hmac_256", + "ob": "eql_v3.ore_block_256", + "bf": "eql_v3.bloom_filter", +} +# Longest-first so `_ord_ore` wins over `_ord`. +_VARIANT_SUFFIXES = ("_ord_ore", "_ord_ope", "_ord", "_eq", "_match", "_search") + +_DOMAIN_RE = re.compile(r"CREATE DOMAIN eql_v3\.([a-z0-9_]+)\s+AS\s+([a-z_]+)", re.I) +_KEY_RE = re.compile(r"VALUE \? '([a-z0-9]+)'") +_BRIEF_RE = re.compile(r"--!\s*@brief\s+(.*)") + + +def _build_domain(name, base, brief, terms, source_file, line): + scalar_type, variant = name, "" + for suffix in _VARIANT_SUFFIXES: + if name.endswith(suffix): + scalar_type, variant = name[: -len(suffix)], suffix[1:] + break + + capabilities = [] + for term in terms: + cap = _TERM_CAPABILITY.get(term) + if cap and cap not in capabilities: + capabilities.append(cap) + if not capabilities: + capabilities = ["storage"] + + return { + "name": f"eql_v3.{name}", + "type": scalar_type, + "variant": variant, + "base": base, + "brief": brief, + "terms": terms, + "capabilities": capabilities, + "termFunctions": [_TERM_FUNCTION[t] for t in terms if t in _TERM_FUNCTION], + "source": {"file": str(source_file), "line": line}, + } + + +def parse_domains(src_dir: Path) -> list: + """Extract eql_v3 CREATE DOMAIN definitions + their capability from the SQL.""" + if not src_dir.exists(): + print(f"Warning: SQL source dir not found: {src_dir}; skipping domains", file=sys.stderr) + return [] + + domains = [] + for sql_file in sorted(src_dir.rglob("*.sql")): + lines = sql_file.read_text().splitlines() + last_brief = "" + for i, line in enumerate(lines): + brief_match = _BRIEF_RE.search(line) + if brief_match: + last_brief = brief_match.group(1).strip() + domain_match = _DOMAIN_RE.search(line) + if not domain_match: + continue + name, base = domain_match.group(1), domain_match.group(2) + # Collect CHECK keys until the block closes or the next domain begins. + keys = [] + for follow in lines[i + 1:]: + if _DOMAIN_RE.search(follow) or re.match(r"\s*\);", follow): + break + keys.extend(_KEY_RE.findall(follow)) + terms = [k for k in dict.fromkeys(keys) if k not in _ENVELOPE_KEYS] + domains.append(_build_domain(name, base, last_brief, terms, sql_file, i + 1)) + last_brief = "" + + domains.sort(key=lambda d: (d["type"], d["name"])) + return domains + + +def build_manifest(xml_dir: Path, version: str, src_dir: Path = Path("src/v3")) -> dict: functions = [] for xml_file in sorted(xml_dir.glob("*.xml")): if xml_file.name in ("index.xml", "Doxyfile.xml"): @@ -79,35 +173,39 @@ def build_manifest(xml_dir: Path, version: str) -> dict: functions.append(func) functions.sort(key=lambda f: (f["is_private"], f["name"], f["signature"])) + domains = parse_domains(src_dir) return { "$schema": "https://schemas.cipherstash.com/eql/manifest/v1.json", "name": "eql", "version": version, - "generatedFrom": "doxygen-xml", + "generatedFrom": "doxygen-xml + sql-domains", "counts": { "functions": len(functions), "public": sum(1 for f in functions if not f["is_private"]), "private": sum(1 for f in functions if f["is_private"]), + "domains": len(domains), }, "functions": [_to_entry(f) for f in functions], + "domains": domains, } def main(): if len(sys.argv) < 2: - print("Usage: xml-to-json.py [output_dir] [version]") + print("Usage: xml-to-json.py [output_dir] [version] [sql_src_dir]") sys.exit(1) xml_dir = Path(sys.argv[1]) output_dir = Path(sys.argv[2]) if len(sys.argv) > 2 else Path("docs/api/json") version = sys.argv[3] if len(sys.argv) > 3 else "DEV" + src_dir = Path(sys.argv[4]) if len(sys.argv) > 4 else Path("src/v3") if not xml_dir.exists(): print(f"Error: XML directory not found: {xml_dir}") sys.exit(1) - manifest = build_manifest(xml_dir, version) + manifest = build_manifest(xml_dir, version, src_dir) output_dir.mkdir(parents=True, exist_ok=True) output_file = output_dir / "eql-manifest.json" output_file.write_text(json.dumps(manifest, indent=2) + "\n") @@ -118,6 +216,7 @@ def main(): f" Functions: {counts['functions']} " f"({counts['public']} public, {counts['private']} private)" ) + print(f" Domains: {counts['domains']}") if __name__ == "__main__": From d09852a71ca912b4f9a23db5547052f1dd837005 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 10:43:04 +1000 Subject: [PATCH 530/599] docs: source the domain matrix from the Rust catalog, not SQL parsing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The scalar domains are 100% generated from eql_domains::CATALOG, so read the domain/variant matrix straight from the source of truth via `eql-codegen dump-catalog` (which already emits JSON) instead of parsing the generated *_types.sql. No drift from SQL-format changes, authoritative type tokens (integer/bigint/…, not int4/int8), and the exact SQL operators each domain supports (new `supportedOperators` field). More accurate, too: `_ord` domains now correctly report equality + order — ORE comparison collapses to equality, so `=`/`<>` are supported — which the CHECK-key derivation missed. json.sh emits docs/api/json/eql-catalog.json (cargo run -p eql-codegen dump-catalog) and passes it to the converter. Covers the 48 catalog (scalar) domains; the 3 hand-written jsonb domains (json/jsonb_entry/jsonb_query) are not in the catalog and remain a follow-up. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- tasks/docs/generate/json.sh | 10 +- tasks/docs/generate/test_xml_to_json.py | 61 +++++----- tasks/docs/generate/xml-to-json.py | 141 ++++++++---------------- 3 files changed, 86 insertions(+), 126 deletions(-) diff --git a/tasks/docs/generate/json.sh b/tasks/docs/generate/json.sh index 91316701e..cb0991840 100755 --- a/tasks/docs/generate/json.sh +++ b/tasks/docs/generate/json.sh @@ -13,8 +13,14 @@ if [ ! -d "docs/api/xml" ]; then mise run --output prefix docs:generate fi -# Run converter -mise run --output prefix docs:generate:xml-to-json docs/api/xml docs/api/json "$VERSION" +# Emit the authoritative domain/variant matrix straight from the Rust catalog +# (eql_domains::CATALOG) — the source of truth the generated SQL is rendered from. +mkdir -p docs/api/json +echo "Dumping domain catalog (eql-codegen dump-catalog)..." +cargo run -q -p eql-codegen dump-catalog > docs/api/json/eql-catalog.json + +# Run converter (functions from XML, domains from the catalog dump) +mise run --output prefix docs:generate:xml-to-json docs/api/xml docs/api/json "$VERSION" docs/api/json/eql-catalog.json echo "" echo "✓ JSON manifest: docs/api/json/eql-manifest.json" diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py index 8798d20c8..0070ac1e1 100755 --- a/tasks/docs/generate/test_xml_to_json.py +++ b/tasks/docs/generate/test_xml_to_json.py @@ -18,23 +18,19 @@ _mod = importlib.util.module_from_spec(_spec) _spec.loader.exec_module(_mod) build_manifest = _mod.build_manifest -parse_domains = _mod.parse_domains - -DOMAIN_SQL = """DO $$ -BEGIN - --! @brief Encrypted domain eql_v3.text_eq. - IF NOT EXISTS (SELECT 1) THEN - CREATE DOMAIN eql_v3.text_eq AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'hm' - AND VALUE->>'v' = '3' - ); - END IF; -END $$;""" +load_domains = _mod.load_domains + +# Shape of `eql-codegen dump-catalog` output. +CATALOG_JSON = """{ + "types": [ + { "token": "text", "is_eq_only": false, "domains": [ + { "segment": "storage", "suffix": "", "supported_ops": [] }, + { "segment": "eq", "suffix": "_eq", "supported_ops": ["=", "<>"] }, + { "segment": "search", "suffix": "_search", + "supported_ops": ["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] } + ]} + ] +}""" SAMPLE_XML = """ @@ -67,7 +63,10 @@ def test_build_manifest_shape(): with tempfile.TemporaryDirectory() as d: (Path(d) / "hmac.xml").write_text(SAMPLE_XML) - manifest = build_manifest(Path(d), "1.2.3", src_dir=Path(d)) + (Path(d) / "empty-catalog.json").write_text('{"types": []}') + manifest = build_manifest( + Path(d), "1.2.3", catalog_path=Path(d) / "empty-catalog.json" + ) assert manifest["name"] == "eql" assert manifest["version"] == "1.2.3" @@ -94,24 +93,24 @@ def test_skips_index_and_doxyfile(): assert manifest["counts"]["functions"] == 0 -def test_parse_domains(): +def test_load_domains(): with tempfile.TemporaryDirectory() as d: - (Path(d) / "text_types.sql").write_text(DOMAIN_SQL) - domains = parse_domains(Path(d)) + cat = Path(d) / "eql-catalog.json" + cat.write_text(CATALOG_JSON) + domains = load_domains(cat) - assert len(domains) == 1 - dm = domains[0] - assert dm["name"] == "eql_v3.text_eq" - assert dm["type"] == "text" - assert dm["variant"] == "eq" - assert dm["terms"] == ["hm"] # envelope keys (v/i/c) excluded - assert dm["capabilities"] == ["equality"] - assert dm["termFunctions"] == ["eql_v3.hmac_256"] - assert dm["brief"] == "Encrypted domain eql_v3.text_eq." + by_name = {x["name"]: x for x in domains} + assert by_name["public.text"]["capabilities"] == ["storage"] + assert by_name["public.text_eq"]["type"] == "text" + assert by_name["public.text_eq"]["variant"] == "eq" + assert by_name["public.text_eq"]["capabilities"] == ["equality"] + assert by_name["public.text_eq"]["supportedOperators"] == ["=", "<>"] + # text_search carries all three capabilities, derived from its operators. + assert by_name["public.text_search"]["capabilities"] == ["equality", "order", "match"] if __name__ == "__main__": test_build_manifest_shape() test_skips_index_and_doxyfile() - test_parse_domains() + test_load_domains() print("✓ all tests passed") diff --git a/tasks/docs/generate/xml-to-json.py b/tasks/docs/generate/xml-to-json.py index efc569851..25ec2eeac 100755 --- a/tasks/docs/generate/xml-to-json.py +++ b/tasks/docs/generate/xml-to-json.py @@ -12,16 +12,15 @@ Reuses the extraction in xml-to-markdown.py so the manifest and the Markdown reference can never diverge in how they read the XML. -Doxygen does not extract CREATE DOMAIN, so the manifest also parses the -generated domain SQL to emit the encrypted domain/variant matrix (the core of -the EQL v3 surface) — each domain's capability derived from its CHECK keys. +Doxygen does not extract CREATE DOMAIN, so the manifest reads the encrypted +domain/variant matrix (the core of the EQL v3 surface) straight from the Rust +catalog via `eql-codegen dump-catalog` — authoritative type names + operators. -Usage: xml-to-json.py [output_dir] [version] [sql_src_dir] +Usage: xml-to-json.py [output_dir] [version] [catalog_json] """ import importlib.util import json -import re import sys import xml.etree.ElementTree as ET from pathlib import Path @@ -68,96 +67,50 @@ def _to_entry(func): } -# ── Encrypted domains ──────────────────────────────────────────────────────── -# Doxygen does not extract CREATE DOMAIN, but the domain/variant matrix is the -# core of the EQL v3 surface. The generated `*_types.sql` (source of truth: the -# Rust catalog in crates/eql-domains) encodes each domain's capability -# STRUCTURALLY as the required CHECK keys, so we derive it directly: -# hm = HMAC equality · ob = ORE order · op = OPE order · bf = bloom match · -# sv = STE-vec (JSON). v/i/c are the envelope, not index terms. -_ENVELOPE_KEYS = {"v", "i", "c", "k"} -_TERM_CAPABILITY = { - "hm": "equality", - "ob": "order", - "op": "order", - "bf": "match", - "sv": "json", -} -# Term -> extractor function (from crates/eql-domains/src/term.rs). -_TERM_FUNCTION = { - "hm": "eql_v3.hmac_256", - "ob": "eql_v3.ore_block_256", - "bf": "eql_v3.bloom_filter", -} -# Longest-first so `_ord_ore` wins over `_ord`. -_VARIANT_SUFFIXES = ("_ord_ore", "_ord_ope", "_ord", "_eq", "_match", "_search") - -_DOMAIN_RE = re.compile(r"CREATE DOMAIN eql_v3\.([a-z0-9_]+)\s+AS\s+([a-z_]+)", re.I) -_KEY_RE = re.compile(r"VALUE \? '([a-z0-9]+)'") -_BRIEF_RE = re.compile(r"--!\s*@brief\s+(.*)") - - -def _build_domain(name, base, brief, terms, source_file, line): - scalar_type, variant = name, "" - for suffix in _VARIANT_SUFFIXES: - if name.endswith(suffix): - scalar_type, variant = name[: -len(suffix)], suffix[1:] - break - - capabilities = [] - for term in terms: - cap = _TERM_CAPABILITY.get(term) - if cap and cap not in capabilities: - capabilities.append(cap) - if not capabilities: - capabilities = ["storage"] - - return { - "name": f"eql_v3.{name}", - "type": scalar_type, - "variant": variant, - "base": base, - "brief": brief, - "terms": terms, - "capabilities": capabilities, - "termFunctions": [_TERM_FUNCTION[t] for t in terms if t in _TERM_FUNCTION], - "source": {"file": str(source_file), "line": line}, - } - - -def parse_domains(src_dir: Path) -> list: - """Extract eql_v3 CREATE DOMAIN definitions + their capability from the SQL.""" - if not src_dir.exists(): - print(f"Warning: SQL source dir not found: {src_dir}; skipping domains", file=sys.stderr) +# ── Encrypted domains (from the Rust catalog) ──────────────────────────────── +# The domain/variant matrix is the core of the EQL v3 surface. Rather than parse +# the generated SQL (one step removed, format-fragile), read it straight from the +# source of truth: `eql-codegen dump-catalog` serializes eql_domains::CATALOG — +# authoritative type tokens plus the exact SQL operators each domain supports. +def _capabilities_from_ops(ops): + caps = [] + if any(o in ops for o in ("=", "<>")): + caps.append("equality") + if any(o in ops for o in ("<", "<=", ">", ">=")): + caps.append("order") + if any(o in ops for o in ("@>", "<@")): + caps.append("match") + return caps or ["storage"] + + +def load_domains(catalog_path: Path) -> list: + """Map `eql-codegen dump-catalog` JSON into manifest domain entries.""" + if not catalog_path.exists(): + print(f"Warning: catalog dump not found: {catalog_path}; skipping domains", file=sys.stderr) return [] + catalog = json.loads(catalog_path.read_text()) domains = [] - for sql_file in sorted(src_dir.rglob("*.sql")): - lines = sql_file.read_text().splitlines() - last_brief = "" - for i, line in enumerate(lines): - brief_match = _BRIEF_RE.search(line) - if brief_match: - last_brief = brief_match.group(1).strip() - domain_match = _DOMAIN_RE.search(line) - if not domain_match: - continue - name, base = domain_match.group(1), domain_match.group(2) - # Collect CHECK keys until the block closes or the next domain begins. - keys = [] - for follow in lines[i + 1:]: - if _DOMAIN_RE.search(follow) or re.match(r"\s*\);", follow): - break - keys.extend(_KEY_RE.findall(follow)) - terms = [k for k in dict.fromkeys(keys) if k not in _ENVELOPE_KEYS] - domains.append(_build_domain(name, base, last_brief, terms, sql_file, i + 1)) - last_brief = "" - + for type_entry in catalog.get("types", []): + token = type_entry["token"] + for dom in type_entry["domains"]: + suffix = dom.get("suffix", "") + ops = dom.get("supported_ops", []) + domains.append({ + # v3 user domains live in the `public` schema (public-domain + # migration on eql_v3); the catalog dump emits the bare token. + "name": f"public.{token}{suffix}", + "type": token, + "variant": suffix.lstrip("_"), + "base": "jsonb", + "capabilities": _capabilities_from_ops(ops), + "supportedOperators": ops, + }) domains.sort(key=lambda d: (d["type"], d["name"])) return domains -def build_manifest(xml_dir: Path, version: str, src_dir: Path = Path("src/v3")) -> dict: +def build_manifest(xml_dir: Path, version: str, catalog_path: Path = Path("docs/api/json/eql-catalog.json")) -> dict: functions = [] for xml_file in sorted(xml_dir.glob("*.xml")): if xml_file.name in ("index.xml", "Doxyfile.xml"): @@ -173,13 +126,13 @@ def build_manifest(xml_dir: Path, version: str, src_dir: Path = Path("src/v3")) functions.append(func) functions.sort(key=lambda f: (f["is_private"], f["name"], f["signature"])) - domains = parse_domains(src_dir) + domains = load_domains(catalog_path) return { "$schema": "https://schemas.cipherstash.com/eql/manifest/v1.json", "name": "eql", "version": version, - "generatedFrom": "doxygen-xml + sql-domains", + "generatedFrom": "doxygen-xml + catalog", "counts": { "functions": len(functions), "public": sum(1 for f in functions if not f["is_private"]), @@ -193,19 +146,21 @@ def build_manifest(xml_dir: Path, version: str, src_dir: Path = Path("src/v3")) def main(): if len(sys.argv) < 2: - print("Usage: xml-to-json.py [output_dir] [version] [sql_src_dir]") + print("Usage: xml-to-json.py [output_dir] [version] [catalog_json]") sys.exit(1) xml_dir = Path(sys.argv[1]) output_dir = Path(sys.argv[2]) if len(sys.argv) > 2 else Path("docs/api/json") version = sys.argv[3] if len(sys.argv) > 3 else "DEV" - src_dir = Path(sys.argv[4]) if len(sys.argv) > 4 else Path("src/v3") + catalog_path = ( + Path(sys.argv[4]) if len(sys.argv) > 4 else Path("docs/api/json/eql-catalog.json") + ) if not xml_dir.exists(): print(f"Error: XML directory not found: {xml_dir}") sys.exit(1) - manifest = build_manifest(xml_dir, version, src_dir) + manifest = build_manifest(xml_dir, version, catalog_path) output_dir.mkdir(parents=True, exist_ok=True) output_file = output_dir / "eql-manifest.json" output_file.write_text(json.dumps(manifest, indent=2) + "\n") From 85ed74dd87655beabbc20120fde6f49e56336923 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 12:05:54 +1000 Subject: [PATCH 531/599] docs: dump the jsonb domains + per-domain terms/extractors in the manifest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves #365 and #366 — both via the catalog dump, no SQL autogen. eql_domains::CATALOG (Shape::SteVec), but their SQL is deliberately hand-written (hand-tuned CHECKs, #354) and `scalar_families()` filters them out of the dump. Add them as a new **additive** `stevec` field on `CatalogDump` — scalar-only consumers (the fixture-coverage task) read only `types[]`, so they're unaffected. The manifest now carries all 51 domains (48 scalar + 3 jsonb). from eql_domains::Term) to each `DomainEntry`, linking a domain to its extractor functions (e.g. integer_ord -> eql_v3.ord_term). Authoritative — resolves the docs drift-lint false-flags on eq_term / ord_term / match_term. Both fields are additive; all eql-codegen + eql-domains tests pass (89 + 91). The manifest generator maps them through (termFunctions on scalars; the jsonb family as `json`-capability domains). Full pipeline verified end-to-end (doxygen -> XML + dump-catalog -> 984 functions + 51 domains). Stacked on #364. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- crates/eql-codegen/src/dump.rs | 80 ++++++++++++++++++++++++- tasks/docs/generate/test_xml_to_json.py | 21 ++++++- tasks/docs/generate/xml-to-json.py | 23 +++++++ 3 files changed, 119 insertions(+), 5 deletions(-) diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index f8f3cd07b..065cf40f3 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -8,10 +8,15 @@ use eql_domains::Term; use serde::Serialize; -/// The catalog surface: every scalar type and its domains. +/// The catalog surface: every scalar type and its domains, plus the non-scalar +/// SteVec (`jsonb`) family. #[derive(Serialize)] pub struct CatalogDump { pub types: Vec, + /// The `jsonb` (SteVec) family — `eql_v3.json` / `jsonb_entry` / `jsonb_query`. + /// Their SQL is hand-written under `src/v3/jsonb/`; the catalog owns only + /// their inventory (scalar-only consumers ignore this field). + pub stevec: Vec, } #[derive(Serialize)] @@ -36,6 +41,44 @@ pub struct DomainEntry { /// SQL operators the domain's terms support, in catalog order. Empty for /// the storage domain (no terms). pub supported_ops: Vec<&'static str>, + /// The index terms this domain carries, with their extractor + SEM ctor. + pub terms: Vec, +} + +/// A domain's index term: payload key + generated extractor + SEM constructor +/// (from `eql_domains::Term`) — links a domain to its extractor functions. +#[derive(Serialize)] +pub struct TermInfo { + /// Payload key: `hm` / `ob` / `bf` / `op`. + pub key: &'static str, + /// Generated extractor function (unqualified): `eq_term` / `ord_term` / + /// `match_term` / `ord_ope_term`. + pub extractor: &'static str, + /// SEM index-term constructor (unqualified): `hmac_256` / `ore_block_256` / + /// `bloom_filter` / `ope_cllw`. + pub ctor: &'static str, +} + +/// One `jsonb` (SteVec) domain: catalog inventory only — its SQL surface +/// (CHECK, operators) is hand-written and not derivable from the catalog. +#[derive(Serialize)] +pub struct SteVecEntry { + /// The `eql_v3`-relative domain name: `json` / `jsonb_entry` / `jsonb_query`. + pub full_name: String, + /// The catalog domain name: `json` / `entry` / `query`. + pub name: &'static str, + pub terms: Vec, +} + +fn term_infos(terms: &[Term]) -> Vec { + terms + .iter() + .map(|t| TermInfo { + key: t.json_key(), + extractor: t.extractor(), + ctor: t.ctor(), + }) + .collect() } /// Build the catalog surface description from `eql_domains::CATALOG`. @@ -57,6 +100,7 @@ pub fn dump_catalog() -> CatalogDump { format!("_{}", d.name) }, supported_ops: Term::operators_for_terms(d.terms), + terms: term_infos(d.terms), }) .collect(); TypeEntry { @@ -66,7 +110,21 @@ pub fn dump_catalog() -> CatalogDump { } }) .collect(); - CatalogDump { types } + + // The hand-written SteVec (jsonb) family — catalog inventory only. Kept out + // of `types` so scalar-only consumers (the fixture-coverage task) are + // unaffected; the docs manifest reads both `types` and `stevec`. + let stevec = eql_domains::JSONB + .domains + .iter() + .map(|d| SteVecEntry { + full_name: d.full_name(eql_domains::JSONB.name), + name: d.name, + terms: term_infos(d.terms), + }) + .collect(); + + CatalogDump { types, stevec } } #[cfg(test)] @@ -109,6 +167,24 @@ mod tests { assert_eq!(ord_ope.supported_ops, ["=", "<>", "<", "<=", ">", ">="]); } + #[test] + fn ordered_domain_exposes_its_extractor_and_ctor() { + let dump = dump_catalog(); + let integer = dump.types.iter().find(|t| t.token == "integer").unwrap(); + let ord = integer.domains.iter().find(|d| d.segment == "ord").unwrap(); + assert_eq!(ord.terms.len(), 1); + assert_eq!(ord.terms[0].key, "ob"); + assert_eq!(ord.terms[0].extractor, "ord_term"); + assert_eq!(ord.terms[0].ctor, "ore_block_256"); + } + + #[test] + fn stevec_jsonb_family_is_dumped() { + let dump = dump_catalog(); + let names: Vec<&str> = dump.stevec.iter().map(|e| e.full_name.as_str()).collect(); + assert_eq!(names, ["json", "jsonb_entry", "jsonb_query"]); + } + /// Pins the hand-re-derived `suffix` wire field — the one channel with no /// other automated reader — so its underscore-prefixed values stay /// byte-stable after the catalog dropped the leading underscore from its diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py index 0070ac1e1..07d894597 100755 --- a/tasks/docs/generate/test_xml_to_json.py +++ b/tasks/docs/generate/test_xml_to_json.py @@ -24,11 +24,20 @@ CATALOG_JSON = """{ "types": [ { "token": "text", "is_eq_only": false, "domains": [ - { "segment": "storage", "suffix": "", "supported_ops": [] }, - { "segment": "eq", "suffix": "_eq", "supported_ops": ["=", "<>"] }, + { "segment": "storage", "suffix": "", "supported_ops": [], "terms": [] }, + { "segment": "eq", "suffix": "_eq", "supported_ops": ["=", "<>"], + "terms": [{"key": "hm", "extractor": "eq_term", "ctor": "hmac_256"}] }, { "segment": "search", "suffix": "_search", - "supported_ops": ["=", "<>", "<", "<=", ">", ">=", "@>", "<@"] } + "supported_ops": ["=", "<>", "<", "<=", ">", ">=", "@>", "<@"], + "terms": [ + {"key": "hm", "extractor": "eq_term", "ctor": "hmac_256"}, + {"key": "bf", "extractor": "match_term", "ctor": "bloom_filter"} + ] } ]} + ], + "stevec": [ + { "full_name": "json", "name": "json", "terms": [] }, + { "full_name": "jsonb_entry", "name": "entry", "terms": [] } ] }""" @@ -100,13 +109,19 @@ def test_load_domains(): domains = load_domains(cat) by_name = {x["name"]: x for x in domains} + # v3 user domains live in `public`; the extractor functions are `eql_v3`. assert by_name["public.text"]["capabilities"] == ["storage"] assert by_name["public.text_eq"]["type"] == "text" assert by_name["public.text_eq"]["variant"] == "eq" assert by_name["public.text_eq"]["capabilities"] == ["equality"] assert by_name["public.text_eq"]["supportedOperators"] == ["=", "<>"] + assert by_name["public.text_eq"]["termFunctions"] == ["eql_v3.eq_term"] # text_search carries all three capabilities, derived from its operators. assert by_name["public.text_search"]["capabilities"] == ["equality", "order", "match"] + # SteVec (jsonb) domains come from the `stevec` section. + assert "public.json" in by_name + assert by_name["public.jsonb_entry"]["capabilities"] == ["json"] + assert by_name["public.jsonb_entry"]["shape"] == "stevec" if __name__ == "__main__": diff --git a/tasks/docs/generate/xml-to-json.py b/tasks/docs/generate/xml-to-json.py index 25ec2eeac..2d2f2ff3d 100755 --- a/tasks/docs/generate/xml-to-json.py +++ b/tasks/docs/generate/xml-to-json.py @@ -83,6 +83,11 @@ def _capabilities_from_ops(ops): return caps or ["storage"] +def _term_functions(terms): + """Qualified extractor functions for a domain's terms (e.g. eql_v3.ord_term).""" + return [f"eql_v3.{t['extractor']}" for t in terms] + + def load_domains(catalog_path: Path) -> list: """Map `eql-codegen dump-catalog` JSON into manifest domain entries.""" if not catalog_path.exists(): @@ -91,6 +96,8 @@ def load_domains(catalog_path: Path) -> list: catalog = json.loads(catalog_path.read_text()) domains = [] + + # Scalar families: capability + operators + extractor functions. for type_entry in catalog.get("types", []): token = type_entry["token"] for dom in type_entry["domains"]: @@ -105,7 +112,23 @@ def load_domains(catalog_path: Path) -> list: "base": "jsonb", "capabilities": _capabilities_from_ops(ops), "supportedOperators": ops, + "termFunctions": _term_functions(dom.get("terms", [])), }) + + # SteVec (jsonb) family: hand-written SQL, catalog inventory only. Like the + # scalar domains these live in `public`; the extractor functions are eql_v3. + for entry in catalog.get("stevec", []): + domains.append({ + "name": f"public.{entry['full_name']}", + "type": "jsonb", + "variant": "", + "base": "jsonb", + "shape": "stevec", + "capabilities": ["json"], + "supportedOperators": [], + "termFunctions": _term_functions(entry.get("terms", [])), + }) + domains.sort(key=lambda d: (d["type"], d["name"])) return domains From ab7f84e2cccd851d793314f195afc82e3b29a4a9 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 15:16:02 +1000 Subject: [PATCH 532/599] address review: fix jsonb schema in docs + hardcode ste_vec terms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per @tobyhede's review on #368: - dump.rs doc comments referenced `eql_v3.json` / "eql_v3-relative" — the jsonb domains resolve under `public` (only the extractor *functions* are eql_v3). Corrected the CatalogDump.stevec and SteVecEntry.full_name docs. - The catalog models no per-SteVec-entry terms (JSONB_DOMAINS carry `terms: &[]`, enforced by `shape_and_terms_are_consistent`), so `term_infos(d.terms)` was provably empty and the searchable SteVec family rendered inert (no termFunctions). Hardcode the real hand-written ste_vec extractors for now: `hm` -> eq_term, `oc` -> ore_cllw (src/v3/jsonb/operators.sql). The manifest now links public.json / jsonb_entry / jsonb_query to eql_v3.eq_term / eql_v3.ore_cllw. Operators for the SteVec family remain a follow-up (DB introspection of pg_operator is the reliable source). Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- crates/eql-codegen/src/dump.rs | 33 +++++++++++++++++++++---- tasks/docs/generate/test_xml_to_json.py | 14 ++++++++--- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 065cf40f3..8089d9136 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -13,9 +13,9 @@ use serde::Serialize; #[derive(Serialize)] pub struct CatalogDump { pub types: Vec, - /// The `jsonb` (SteVec) family — `eql_v3.json` / `jsonb_entry` / `jsonb_query`. - /// Their SQL is hand-written under `src/v3/jsonb/`; the catalog owns only - /// their inventory (scalar-only consumers ignore this field). + /// The `jsonb` (SteVec) family — `public.json` / `public.jsonb_entry` / + /// `public.jsonb_query`. Their SQL is hand-written under `src/v3/jsonb/`; the + /// catalog owns only their inventory (scalar-only consumers ignore this field). pub stevec: Vec, } @@ -63,7 +63,8 @@ pub struct TermInfo { /// (CHECK, operators) is hand-written and not derivable from the catalog. #[derive(Serialize)] pub struct SteVecEntry { - /// The `eql_v3`-relative domain name: `json` / `jsonb_entry` / `jsonb_query`. + /// The bare domain name (resolved under the `public` schema, like a scalar's + /// `integer_eq`): `json` / `jsonb_entry` / `jsonb_query`. pub full_name: String, /// The catalog domain name: `json` / `entry` / `query`. pub name: &'static str, @@ -81,6 +82,22 @@ fn term_infos(terms: &[Term]) -> Vec { .collect() } +/// Index terms for the `jsonb` (SteVec) family, hardcoded for now. +/// +/// The catalog does not model per-SteVec-entry terms — `JSONB_DOMAINS` declare +/// `terms: &[]` and the `shape_and_terms_are_consistent` invariant fails CI if a +/// non-`Scalar` domain ever gains one — so `term_infos(d.terms)` is provably +/// empty here, which would render the searchable SteVec family inert in the +/// manifest. Until the catalog carries them, source the real hand-written +/// extractors (`src/v3/jsonb/operators.sql`): every sv entry carries `hm` +/// (hash-equality, `eql_v3.eq_term`) or `oc` (CLLW-ORE ordering, `eql_v3.ore_cllw`). +fn stevec_terms() -> Vec { + vec![ + TermInfo { key: "hm", extractor: "eq_term", ctor: "hmac_256" }, + TermInfo { key: "oc", extractor: "ore_cllw", ctor: "ore_cllw" }, + ] +} + /// Build the catalog surface description from `eql_domains::CATALOG`. pub fn dump_catalog() -> CatalogDump { let types = eql_domains::scalar_families() @@ -120,7 +137,8 @@ pub fn dump_catalog() -> CatalogDump { .map(|d| SteVecEntry { full_name: d.full_name(eql_domains::JSONB.name), name: d.name, - terms: term_infos(d.terms), + // Catalog terms are empty for SteVec (see stevec_terms); hardcode. + terms: stevec_terms(), }) .collect(); @@ -183,6 +201,11 @@ mod tests { let dump = dump_catalog(); let names: Vec<&str> = dump.stevec.iter().map(|e| e.full_name.as_str()).collect(); assert_eq!(names, ["json", "jsonb_entry", "jsonb_query"]); + + // The (hardcoded) SteVec extractors are surfaced, not left empty. + let entry = &dump.stevec[0]; + let extractors: Vec<&str> = entry.terms.iter().map(|t| t.extractor).collect(); + assert_eq!(extractors, ["eq_term", "ore_cllw"]); } /// Pins the hand-re-derived `suffix` wire field — the one channel with no diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py index 07d894597..de307e044 100755 --- a/tasks/docs/generate/test_xml_to_json.py +++ b/tasks/docs/generate/test_xml_to_json.py @@ -36,8 +36,14 @@ ]} ], "stevec": [ - { "full_name": "json", "name": "json", "terms": [] }, - { "full_name": "jsonb_entry", "name": "entry", "terms": [] } + { "full_name": "json", "name": "json", "terms": [ + {"key": "hm", "extractor": "eq_term", "ctor": "hmac_256"}, + {"key": "oc", "extractor": "ore_cllw", "ctor": "ore_cllw"} + ] }, + { "full_name": "jsonb_entry", "name": "entry", "terms": [ + {"key": "hm", "extractor": "eq_term", "ctor": "hmac_256"}, + {"key": "oc", "extractor": "ore_cllw", "ctor": "ore_cllw"} + ] } ] }""" @@ -118,10 +124,12 @@ def test_load_domains(): assert by_name["public.text_eq"]["termFunctions"] == ["eql_v3.eq_term"] # text_search carries all three capabilities, derived from its operators. assert by_name["public.text_search"]["capabilities"] == ["equality", "order", "match"] - # SteVec (jsonb) domains come from the `stevec` section. + # SteVec (jsonb) domains come from the `stevec` section, with hardcoded + # extractors (hm -> eq_term, oc -> ore_cllw) so the family isn't inert. assert "public.json" in by_name assert by_name["public.jsonb_entry"]["capabilities"] == ["json"] assert by_name["public.jsonb_entry"]["shape"] == "stevec" + assert by_name["public.jsonb_entry"]["termFunctions"] == ["eql_v3.eq_term", "eql_v3.ore_cllw"] if __name__ == "__main__": From f1b110d0bc7c034849e6917b0ca830f5949e6b40 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 15:34:14 +1000 Subject: [PATCH 533/599] style: rustfmt stevec_terms() struct literals The inline TermInfo { .. } literals added in the review-response commit tripped cargo fmt --check (Rust workspace crates CI). Expand them to the one-field-per-line form rustfmt wants. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- crates/eql-codegen/src/dump.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 8089d9136..7eb710d1f 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -93,8 +93,16 @@ fn term_infos(terms: &[Term]) -> Vec { /// (hash-equality, `eql_v3.eq_term`) or `oc` (CLLW-ORE ordering, `eql_v3.ore_cllw`). fn stevec_terms() -> Vec { vec![ - TermInfo { key: "hm", extractor: "eq_term", ctor: "hmac_256" }, - TermInfo { key: "oc", extractor: "ore_cllw", ctor: "ore_cllw" }, + TermInfo { + key: "hm", + extractor: "eq_term", + ctor: "hmac_256", + }, + TermInfo { + key: "oc", + extractor: "ore_cllw", + ctor: "ore_cllw", + }, ] } From e00880a0e682820af5e75465285314ec1c8fe50c Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 16:22:25 +1000 Subject: [PATCH 534/599] fix(dump): scope SteVec terms to jsonb_entry only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hardcoded hm/oc terms were stamped onto all three SteVec domains, but per src/v3/jsonb/{functions,operators}.sql the eq_term/ore_cllw extractors take public.jsonb_entry (the sv *element* type) exclusively: - eq_term(jsonb_entry) -> = / <> (coalesce(hm, oc)) - ore_cllw(jsonb_entry) -> < <= > >= (oc) The public.json container and public.jsonb_query domains carry no term extractors — their surface is containment (@>, <@) and path navigation. stevec_terms() now keys on the catalog domain name and returns terms only for `entry`; json/query resolve to []. Tests assert the per-domain split. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- crates/eql-codegen/src/dump.rs | 52 +++++++++++++++++++------ tasks/docs/generate/test_xml_to_json.py | 16 ++++---- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 7eb710d1f..fb6248d33 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -68,6 +68,9 @@ pub struct SteVecEntry { pub full_name: String, /// The catalog domain name: `json` / `entry` / `query`. pub name: &'static str, + /// Index terms for this SteVec domain. Non-empty only for `jsonb_entry` + /// (the sv element type); the `json` container and `jsonb_query` domains + /// carry no term extractors — see `stevec_terms`. pub terms: Vec, } @@ -82,16 +85,24 @@ fn term_infos(terms: &[Term]) -> Vec { .collect() } -/// Index terms for the `jsonb` (SteVec) family, hardcoded for now. +/// Index terms for one `jsonb` (SteVec) domain, hardcoded for now. /// /// The catalog does not model per-SteVec-entry terms — `JSONB_DOMAINS` declare /// `terms: &[]` and the `shape_and_terms_are_consistent` invariant fails CI if a /// non-`Scalar` domain ever gains one — so `term_infos(d.terms)` is provably -/// empty here, which would render the searchable SteVec family inert in the -/// manifest. Until the catalog carries them, source the real hand-written -/// extractors (`src/v3/jsonb/operators.sql`): every sv entry carries `hm` -/// (hash-equality, `eql_v3.eq_term`) or `oc` (CLLW-ORE ordering, `eql_v3.ore_cllw`). -fn stevec_terms() -> Vec { +/// empty here. Until the catalog carries them, source the real hand-written +/// extractors from `src/v3/jsonb/{functions,operators}.sql`. +/// +/// Terms live on `jsonb_entry` — the sv *element* type — ONLY: `eql_v3.eq_term` +/// reads `coalesce(hm, oc)` for `=`/`<>`, and `eql_v3.ore_cllw` reads `oc` for +/// `<`/`<=`/`>`/`>=`. The `json` container and `jsonb_query` domains carry no +/// term extractors (their surface is containment `@>`/`<@` and path navigation), +/// so they return no terms. Keyed on the catalog domain name (`json`/`entry`/ +/// `query`). +fn stevec_terms(name: &str) -> Vec { + if name != "entry" { + return Vec::new(); + } vec![ TermInfo { key: "hm", @@ -145,8 +156,9 @@ pub fn dump_catalog() -> CatalogDump { .map(|d| SteVecEntry { full_name: d.full_name(eql_domains::JSONB.name), name: d.name, - // Catalog terms are empty for SteVec (see stevec_terms); hardcode. - terms: stevec_terms(), + // Catalog terms are empty for SteVec; hardcode per-domain — only + // `jsonb_entry` carries extractors (see stevec_terms). + terms: stevec_terms(d.name), }) .collect(); @@ -210,10 +222,26 @@ mod tests { let names: Vec<&str> = dump.stevec.iter().map(|e| e.full_name.as_str()).collect(); assert_eq!(names, ["json", "jsonb_entry", "jsonb_query"]); - // The (hardcoded) SteVec extractors are surfaced, not left empty. - let entry = &dump.stevec[0]; - let extractors: Vec<&str> = entry.terms.iter().map(|t| t.extractor).collect(); - assert_eq!(extractors, ["eq_term", "ore_cllw"]); + let by_name = |n: &str| { + dump.stevec + .iter() + .find(|e| e.full_name == n) + .unwrap_or_else(|| panic!("{n} present")) + }; + + // Term extractors live on `jsonb_entry` (the sv element type) ONLY: + // `eq_term` (hm/oc equality) + `ore_cllw` (oc ordering). + let entry_extractors: Vec<&str> = by_name("jsonb_entry") + .terms + .iter() + .map(|t| t.extractor) + .collect(); + assert_eq!(entry_extractors, ["eq_term", "ore_cllw"]); + + // The `json` container and `jsonb_query` domains carry no term + // extractors — their surface is containment (@>, <@) and path nav. + assert!(by_name("json").terms.is_empty()); + assert!(by_name("jsonb_query").terms.is_empty()); } /// Pins the hand-re-derived `suffix` wire field — the one channel with no diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py index de307e044..52930da2a 100755 --- a/tasks/docs/generate/test_xml_to_json.py +++ b/tasks/docs/generate/test_xml_to_json.py @@ -36,14 +36,12 @@ ]} ], "stevec": [ - { "full_name": "json", "name": "json", "terms": [ - {"key": "hm", "extractor": "eq_term", "ctor": "hmac_256"}, - {"key": "oc", "extractor": "ore_cllw", "ctor": "ore_cllw"} - ] }, + { "full_name": "json", "name": "json", "terms": [] }, { "full_name": "jsonb_entry", "name": "entry", "terms": [ {"key": "hm", "extractor": "eq_term", "ctor": "hmac_256"}, {"key": "oc", "extractor": "ore_cllw", "ctor": "ore_cllw"} - ] } + ] }, + { "full_name": "jsonb_query", "name": "query", "terms": [] } ] }""" @@ -124,9 +122,11 @@ def test_load_domains(): assert by_name["public.text_eq"]["termFunctions"] == ["eql_v3.eq_term"] # text_search carries all three capabilities, derived from its operators. assert by_name["public.text_search"]["capabilities"] == ["equality", "order", "match"] - # SteVec (jsonb) domains come from the `stevec` section, with hardcoded - # extractors (hm -> eq_term, oc -> ore_cllw) so the family isn't inert. - assert "public.json" in by_name + # SteVec (jsonb) domains come from the `stevec` section. Term extractors are + # hardcoded on `jsonb_entry` (the sv element type) ONLY — hm -> eq_term, + # oc -> ore_cllw; the `json` container and `jsonb_query` carry none. + assert by_name["public.json"]["termFunctions"] == [] + assert by_name["public.jsonb_query"]["termFunctions"] == [] assert by_name["public.jsonb_entry"]["capabilities"] == ["json"] assert by_name["public.jsonb_entry"]["shape"] == "stevec" assert by_name["public.jsonb_entry"]["termFunctions"] == ["eql_v3.eq_term", "eql_v3.ore_cllw"] From f3a86612e44cde1e86a753f987ce3264ecab1dad Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 17:31:01 +1000 Subject: [PATCH 535/599] =?UTF-8?q?fix(docs):=20repair=20Doxygen=20SQL=20e?= =?UTF-8?q?xtraction=20=E2=80=94=20coverage=20gaps=20+=20private=20split?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Markdown/JSON API extraction runs Doxygen's C++ parser over raw SQL, which silently dropped functions and misclassified visibility: - `::type` casts in `LANGUAGE sql` bodies read as C++ `::` scope resolution and dropped the whole enclosing CREATE FUNCTION memberdef — losing jsonb_path_query / jsonb_path_query_first and ~hundreds of generated eql_v3_internal extractor overloads. - Regular `-- …` SQL comments parsed as code, minting phantom functions (overloads, extractor, queries, accessor, inlinable). - `is_private` keyed on a leading `_` in the function NAME, but internal functions live in the `eql_v3_internal` schema, so none were flagged (984 functions, all reported public). - `@example` in version.sql detached its doc comment (dropping `version` entirely); and `*.template` sources were documented alongside their generated `.sql`, duplicating `version` with $RELEASE_VERSION placeholder text. Fixes: - doxygen-filter.sh: strip `$$…$$` bodies and neutralize `--` comments so Doxygen sees only clean declarations + `//!` doc comments. - xml-to-markdown.py: treat the `eql_v3_internal` schema as private. - Doxyfile: document only `*.sql` (drop `*.template`; version.sql is build-generated from the template before Doxygen runs). - version.template: replace `@example` with plain prose. Result: manifest 984 → 1680 functions (986 public, 694 private, 0 false-positive private); version + jsonb_path_query(_first) now present; phantom functions gone. Domains unchanged (catalog-sourced). All doc-gen tests + SQL coverage validation pass. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- Doxyfile | 6 +++- src/v3/version.template | 6 ++-- tasks/docs/doxygen-filter.sh | 40 ++++++++++++++++++++++++-- tasks/docs/generate/xml-to-markdown.py | 11 +++++-- 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/Doxyfile b/Doxyfile index 3e5bb7209..0994f1097 100644 --- a/Doxyfile +++ b/Doxyfile @@ -45,7 +45,11 @@ XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- INPUT = src/ -FILE_PATTERNS = *.sql *.template +# Only the generated *.sql is documented. *.template files are build-time +# sources (they still carry $RELEASE_VERSION placeholders and duplicate their +# generated .sql), so documenting them produced a spurious second `version` +# memberdef with placeholder text. +FILE_PATTERNS = *.sql RECURSIVE = YES EXCLUDE_PATTERNS = *_test.sql diff --git a/src/v3/version.template b/src/v3/version.template index 0849b0b08..828635352 100644 --- a/src/v3/version.template +++ b/src/v3/version.template @@ -21,10 +21,8 @@ DROP FUNCTION IF EXISTS eql_v3.version(); --! --! @note Auto-generated during build from src/v3/version.template --! ---! @example ---! -- Check installed EQL version ---! SELECT eql_v3.version(); ---! -- Returns: '3.0.0' +--! Example: `SELECT eql_v3.version()` returns the installed version string, +--! e.g. `'3.0.0'` (or `'DEV'` for development builds). CREATE FUNCTION eql_v3.version() RETURNS text IMMUTABLE STRICT PARALLEL SAFE diff --git a/tasks/docs/doxygen-filter.sh b/tasks/docs/doxygen-filter.sh index ab196dd9c..8ffa65246 100755 --- a/tasks/docs/doxygen-filter.sh +++ b/tasks/docs/doxygen-filter.sh @@ -1,5 +1,41 @@ #!/usr/bin/env bash #MISE description="Doxygen input filter for SQL files" -# Converts SQL-style comments (--!) to C++-style comments (//!) -sed 's/^--!/\/\/!/g' "$1" +# Prepares SQL for Doxygen's C++ parser. Two transforms: +# +# 1. `--!` doc comments -> `//!` so Doxygen sees them. +# 2. Strip dollar-quoted function bodies (`$$ ... $$`), leaving just the +# declaration and its trailing clauses. Doxygen parses SQL heuristically as +# C++, and body SQL derails it: a `::type` cast reads as C++ scope +# resolution and drops the whole enclosing CREATE FUNCTION memberdef (this +# silently lost jsonb_path_query and ~hundreds of generated extractor +# overloads), while keywords/calls in bodies (`SELECT`, `RETURN NEXT`, +# `array_length(...)`) get mis-parsed as spurious functions. Bodies carry no +# documentation, so removing them is lossless for the generated reference +# and leaves Doxygen only clean `CREATE FUNCTION name(args) RETURNS ...` +# declarations to read. Only bare `$$` quoting is used in this codebase. +awk ' + /^--!/ { print "//!" substr($0, 4); next } + { + out = "" + s = $0 + while (length(s) > 0) { + p = index(s, "$$") + if (inbody) { + if (p == 0) { s = ""; break } # whole remainder is body: drop + s = substr(s, p + 2) # resume after the closing $$ + inbody = 0 + } else { + if (p == 0) { out = out s; break } # no body marker: keep as-is + out = out substr(s, 1, p - 1) # keep code before opening $$ + s = substr(s, p + 2) + inbody = 1 + } + } + # Regular SQL `--` comments read as C++ code to Doxygen (e.g. + # `-- per-entry overloads (...)` mints a phantom `overloads(...)` function), + # so neutralize them to C++ line comments on the (body-stripped) code. + gsub(/--/, "//", out) + print out + } +' "$1" diff --git a/tasks/docs/generate/xml-to-markdown.py b/tasks/docs/generate/xml-to-markdown.py index 02ce371b5..f838547fc 100755 --- a/tasks/docs/generate/xml-to-markdown.py +++ b/tasks/docs/generate/xml-to-markdown.py @@ -203,8 +203,15 @@ def process_function(memberdef): if op_match: func_name = op_match.group(1) # Use operator as function name - # Check if this is a private/internal function - is_private = func_name.startswith('_') + # Check if this is a private/internal function. + # Internal functions live in the `eql_v3_internal` schema. Doxygen puts the + # schema in the memberdef (e.g. "CREATE FUNCTION eql_v3_internal"), + # not the , so a schema check is required — the older bare + # leading-underscore convention alone flags none of them (which left the + # whole surface reported as public). Keep the underscore check too. + type_elem = memberdef.find('type') + type_text = extract_para_text(type_elem) if type_elem is not None else '' + is_private = func_name.startswith('_') or 'eql_v3_internal' in type_text # Extract descriptions brief = extract_description(memberdef.find('briefdescription')) From 88fdd1433ef43a4a4ed2f12a16fd85be67c63d1b Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 17:56:51 +1000 Subject: [PATCH 536/599] test(docs): cover internal-schema private detection; guard filter args MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Copilot review on #369: - test_xml_to_markdown.py: add test_internal_schema_is_private, exercising process_function directly — asserts eql_v3_internal.* -> private and eql_v3.* -> public, so the schema-based visibility can't silently regress to the old leading-underscore heuristic. - doxygen-filter.sh: set -euo pipefail + explicit one-arg check, so a stray invocation fails fast (exit 2) instead of awk blocking on stdin. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- tasks/docs/doxygen-filter.sh | 9 +++++ tasks/docs/generate/test_xml_to_markdown.py | 45 +++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/tasks/docs/doxygen-filter.sh b/tasks/docs/doxygen-filter.sh index 8ffa65246..b64bd806a 100755 --- a/tasks/docs/doxygen-filter.sh +++ b/tasks/docs/doxygen-filter.sh @@ -1,5 +1,14 @@ #!/usr/bin/env bash #MISE description="Doxygen input filter for SQL files" +set -euo pipefail + +# Doxygen always calls an INPUT_FILTER with exactly one filename. Guard it so a +# stray invocation fails fast instead of `awk` blocking on stdin and hanging the +# docs job. +if [ "$#" -ne 1 ]; then + echo "usage: $(basename "$0") " >&2 + exit 2 +fi # Prepares SQL for Doxygen's C++ parser. Two transforms: # diff --git a/tasks/docs/generate/test_xml_to_markdown.py b/tasks/docs/generate/test_xml_to_markdown.py index 77fb6cd5a..c547c9703 100755 --- a/tasks/docs/generate/test_xml_to_markdown.py +++ b/tasks/docs/generate/test_xml_to_markdown.py @@ -155,6 +155,50 @@ def test_schema_qualified_type(): print("✓ Schema-qualified type test passed") +def _load_process_function(): + """Load process_function from the hyphenated module by path.""" + import importlib.util + + spec = importlib.util.spec_from_file_location( + "eql_xml_to_markdown", Path(__file__).parent / "xml-to-markdown.py" + ) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod.process_function + +def test_internal_schema_is_private(): + """Functions in the eql_v3_internal schema are flagged private via . + + Doxygen puts the schema in the memberdef ("CREATE FUNCTION + eql_v3_internal"), not the , so visibility is a schema check. Guards + against regressing to the old leading-underscore-name heuristic, which + flagged none of the internal surface (reporting everything public). + """ + from xml.etree import ElementTree as ET + + process_function = _load_process_function() + + def memberdef(schema, fn): + return ET.fromstring(f''' + + {fn} + CREATE FUNCTION {schema} + (val jsonb) RETURNS bytea + Extract a term. + + + ''') + + internal = process_function(memberdef("eql_v3_internal", "eq_term")) + assert internal is not None, "internal function should be extracted" + assert internal["is_private"] is True, "eql_v3_internal.* must be private" + + public = process_function(memberdef("eql_v3", "jsonb_path_query")) + assert public is not None, "public function should be extracted" + assert public["is_private"] is False, "eql_v3.* must be public" + + print("✓ Internal-schema private detection test passed") + if __name__ == '__main__': print("Running xml-to-markdown tests...\n") @@ -163,6 +207,7 @@ def test_schema_qualified_type(): test_variants_no_self_reference() test_param_name_type_swap() test_schema_qualified_type() + test_internal_schema_is_private() print("\n✅ All tests passed!") sys.exit(0) From 5f593eeffa3bd15c994b2c957f4173ca11fdf503 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Mon, 6 Jul 2026 19:34:09 +1000 Subject: [PATCH 537/599] fix(docs): skip name-dropped CREATE FUNCTION mis-parses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to #369. Doxygen drops the real name of `CREATE FUNCTION .(... a . ...)` when an operand type is schema-qualified (e.g. `b public.text_ord`), leaving the schema as . ~290 of these internal "Unsupported operator blocker" helpers surfaced as bogus functions named `eql_v3_internal`/`eql_v3`, mislabeled public (is_private keyed on , but the schema landed in ) — inflating the public surface 696 -> 986 and rendering a bogus `eql_v3_internal` entry on the docs page. Skip them, keyed on (CREATE FUNCTION) rather than the brief: their brief reads "Unsupported operator blocker for ...", which the operator-symbol recovery would otherwise mis-match and remap to a junk name (`Unsupported`). Genuine CREATE OPERATORs (definition CREATE OPERATOR) are still recovered from the brief. Manifest: 1680 -> 1390 functions (696 public, 694 private); no schema-named entries; all real functions retained. Adds test_schema_name_misparse_is_skipped. Claude-Session: https://claude.ai/code/session_01CqDNqLSEEkCi7xAJFq7HJA --- tasks/docs/generate/test_xml_to_markdown.py | 44 +++++++++++++++++++++ tasks/docs/generate/xml-to-markdown.py | 38 ++++++++++++------ 2 files changed, 71 insertions(+), 11 deletions(-) diff --git a/tasks/docs/generate/test_xml_to_markdown.py b/tasks/docs/generate/test_xml_to_markdown.py index c547c9703..4516f2089 100755 --- a/tasks/docs/generate/test_xml_to_markdown.py +++ b/tasks/docs/generate/test_xml_to_markdown.py @@ -199,6 +199,49 @@ def memberdef(schema, fn): print("✓ Internal-schema private detection test passed") +def test_schema_name_misparse_is_skipped(): + """Name-dropped CREATE FUNCTION mis-parses are skipped, operators are kept. + + Doxygen drops the real name of `CREATE FUNCTION .(... a + . ...)`, leaving the schema as . These internal + "Unsupported operator blocker" helpers carry the word "operator" in their + brief, so the skip must key on (CREATE FUNCTION), not the + brief — otherwise they'd be mis-remapped to a junk operator name and + mislabeled public. A genuine CREATE OPERATOR is still recovered. + """ + from xml.etree import ElementTree as ET + + process_function = _load_process_function() + + # Mis-parsed CREATE FUNCTION (schema as name, "operator" in the brief). + misfn = ET.fromstring(''' + + eql_v3_internal + CREATE FUNCTION eql_v3_internal + CREATE FUNCTION + (a jsonb, b public.text_ord) RETURNS jsonb + Unsupported operator blocker for public.text_ord. + + + ''') + assert process_function(misfn) is None, "name-dropped CREATE FUNCTION must be skipped" + + # Genuine CREATE OPERATOR — recover the symbol from the brief, keep it. + op = ET.fromstring(''' + + public + CREATE OPERATOR public.->> + CREATE OPERATOR + (public.json, text) + ->> operator with text selector. + + + ''') + res = process_function(op) + assert res is not None and res["name"] == "->>", "CREATE OPERATOR symbol must be recovered" + + print("✓ Schema-name mis-parse skip test passed") + if __name__ == '__main__': print("Running xml-to-markdown tests...\n") @@ -208,6 +251,7 @@ def memberdef(schema, fn): test_param_name_type_swap() test_schema_qualified_type() test_internal_schema_is_private() + test_schema_name_misparse_is_skipped() print("\n✅ All tests passed!") sys.exit(0) diff --git a/tasks/docs/generate/xml-to-markdown.py b/tasks/docs/generate/xml-to-markdown.py index f838547fc..76afc9281 100755 --- a/tasks/docs/generate/xml-to-markdown.py +++ b/tasks/docs/generate/xml-to-markdown.py @@ -191,17 +191,34 @@ def process_function(memberdef): if func_name.upper() in sql_intrinsics: return None - # For SQL operators, Doxygen uses schema name as function name - # Extract actual operator from brief description + # Doxygen puts a SCHEMA where the function name should be in two cases, + # told apart by the (CREATE OPERATOR vs CREATE FUNCTION): + # 1. CREATE OPERATOR — Doxygen names it by schema and puts the operator + # symbol in the brief ("->> operator with ..."); recover it. + # 2. CREATE FUNCTION .(... . ...) where a + # schema-qualified operand type derails the C++ parser: it drops the + # real name, leaving the schema as . Unrecoverable, and these are + # the internal "Unsupported operator blocker" helpers — skip them. + # NB their brief contains the word "operator" ("Unsupported operator + # blocker for ..."), so the skip must key on , NOT the + # brief, or they'd be mis-remapped to a junk operator name. Left in, + # ~hundreds surface as bogus `eql_v3_internal` functions mislabeled + # public. brief_elem = memberdef.find('briefdescription') - if func_name in ['eql_v2', 'eql_v3', 'public'] and brief_elem is not None: - brief_para = brief_elem.find('para') - if brief_para is not None and brief_para.text: - # Check if brief starts with an operator (like "->>" or "->") - import re - op_match = re.match(r'^([^\s]+)\s+operator', brief_para.text.strip()) - if op_match: - func_name = op_match.group(1) # Use operator as function name + if func_name in ['eql_v2', 'eql_v3', 'eql_v3_internal', 'public']: + definition = extract_para_text(memberdef.find('definition')) + if definition.upper().startswith('CREATE FUNCTION'): + return None # name-dropped CREATE FUNCTION mis-parse + brief_para = brief_elem.find('para') if brief_elem is not None else None + op_match = ( + re.match(r'^([^\s]+)\s+operator', brief_para.text.strip()) + if brief_para is not None and brief_para.text + else None + ) + if op_match: + func_name = op_match.group(1) # CREATE OPERATOR: use the operator symbol + else: + return None # unrecoverable schema-named mis-parse # Check if this is a private/internal function. # Internal functions live in the `eql_v3_internal` schema. Doxygen puts the @@ -286,7 +303,6 @@ def process_function(memberdef): if argsstring is not None and argsstring.text: # Look for RETURNS keyword in argsstring - import re returns_match = re.search(r'RETURNS\s+([^\s]+)', argsstring.text) if returns_match: return_type_text = returns_match.group(1) From d79b672e4ded78d51e5b2f89c3c25afc15035740 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 12:26:26 +1000 Subject: [PATCH 538/599] feat(eql-bindings): v3 scalar query-operand bindings (CIP-3432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Client-side half of the EQL v3 query-term surface: the enveloped, per-capability query operand `{v, i, }` (envelope minus the ciphertext `c`) for every term-bearing scalar domain, plus its conversion from the v2 payload. Generator (eql-codegen/src/bindings.rs): - render_query_struct: a `Query` twin per term-bearing domain = the storage struct minus `c`, on `public._query`, with deny_unknown_fields enforcing the no-`c` contract. Storage-only domains (no operators) get no twin. - render_query_payload_rs: `QueryPayload` is now catalog-generated (one variant per twin + the SteVec needle), superseding the hand-written single-variant enum — enveloped + per-capability makes it catalog-per-domain. - all_query(): a separate query inventory, kept OUT of all() so query domains never resolve as stored from_v2 conversion targets. Bindings (eql-bindings, regenerated + hand-written): - Regenerated family files + query_payload.rs + inventory.rs. - 38 TypeScript bindings (bindings/v3/*Query.ts) + 38 JSON Schemas (schema/v3/*_query.json); export.rs chains all_query(). - from_v2::convert_scalar_query hoists the v2 payload's required terms into `{v:3, i, }` (drops c/k; bf reinterpreted to smallint[]); both query entry points route through QueryPayload::parse per target; storage-only scalars stay UnsupportedQueryTarget. Verified: `mise run test:crates` (fmt + clippy -D warnings + tests) green. SQL surface (public._query domains + consuming operators/functions) and sqlx conformance are NOT in this commit — they need Postgres + CS creds to validate. See the PR description. CIP-3432 --- crates/eql-bindings/CHANGELOG.md | 24 ++ .../eql-bindings/bindings/v3/BigintEqQuery.ts | 11 + .../bindings/v3/BigintOrdOpeQuery.ts | 11 + .../bindings/v3/BigintOrdOreQuery.ts | 11 + .../bindings/v3/BigintOrdQuery.ts | 11 + .../eql-bindings/bindings/v3/DateEqQuery.ts | 11 + .../bindings/v3/DateOrdOpeQuery.ts | 11 + .../bindings/v3/DateOrdOreQuery.ts | 11 + .../eql-bindings/bindings/v3/DateOrdQuery.ts | 11 + .../eql-bindings/bindings/v3/DoubleEqQuery.ts | 11 + .../bindings/v3/DoubleOrdOpeQuery.ts | 11 + .../bindings/v3/DoubleOrdOreQuery.ts | 11 + .../bindings/v3/DoubleOrdQuery.ts | 11 + .../bindings/v3/IntegerEqQuery.ts | 11 + .../bindings/v3/IntegerOrdOpeQuery.ts | 11 + .../bindings/v3/IntegerOrdOreQuery.ts | 11 + .../bindings/v3/IntegerOrdQuery.ts | 11 + .../bindings/v3/NumericEqQuery.ts | 11 + .../bindings/v3/NumericOrdOpeQuery.ts | 11 + .../bindings/v3/NumericOrdOreQuery.ts | 11 + .../bindings/v3/NumericOrdQuery.ts | 11 + .../eql-bindings/bindings/v3/RealEqQuery.ts | 11 + .../bindings/v3/RealOrdOpeQuery.ts | 11 + .../bindings/v3/RealOrdOreQuery.ts | 11 + .../eql-bindings/bindings/v3/RealOrdQuery.ts | 11 + .../bindings/v3/SmallintEqQuery.ts | 11 + .../bindings/v3/SmallintOrdOpeQuery.ts | 11 + .../bindings/v3/SmallintOrdOreQuery.ts | 11 + .../bindings/v3/SmallintOrdQuery.ts | 11 + .../eql-bindings/bindings/v3/TextEqQuery.ts | 11 + .../bindings/v3/TextMatchQuery.ts | 11 + .../bindings/v3/TextOrdOpeQuery.ts | 12 + .../bindings/v3/TextOrdOreQuery.ts | 12 + .../eql-bindings/bindings/v3/TextOrdQuery.ts | 12 + .../bindings/v3/TextSearchQuery.ts | 13 + .../bindings/v3/TimestampEqQuery.ts | 11 + .../bindings/v3/TimestampOrdOpeQuery.ts | 11 + .../bindings/v3/TimestampOrdOreQuery.ts | 11 + .../bindings/v3/TimestampOrdQuery.ts | 11 + .../schema/v3/bigint_eq_query.json | 54 +++ .../schema/v3/bigint_ord_ope_query.json | 54 +++ .../schema/v3/bigint_ord_ore_query.json | 57 +++ .../schema/v3/bigint_ord_query.json | 57 +++ .../eql-bindings/schema/v3/date_eq_query.json | 54 +++ .../schema/v3/date_ord_ope_query.json | 54 +++ .../schema/v3/date_ord_ore_query.json | 57 +++ .../schema/v3/date_ord_query.json | 57 +++ .../schema/v3/double_eq_query.json | 54 +++ .../schema/v3/double_ord_ope_query.json | 54 +++ .../schema/v3/double_ord_ore_query.json | 57 +++ .../schema/v3/double_ord_query.json | 57 +++ .../schema/v3/integer_eq_query.json | 54 +++ .../schema/v3/integer_ord_ope_query.json | 54 +++ .../schema/v3/integer_ord_ore_query.json | 57 +++ .../schema/v3/integer_ord_query.json | 57 +++ .../schema/v3/numeric_eq_query.json | 54 +++ .../schema/v3/numeric_ord_ope_query.json | 54 +++ .../schema/v3/numeric_ord_ore_query.json | 57 +++ .../schema/v3/numeric_ord_query.json | 57 +++ .../eql-bindings/schema/v3/real_eq_query.json | 54 +++ .../schema/v3/real_ord_ope_query.json | 54 +++ .../schema/v3/real_ord_ore_query.json | 57 +++ .../schema/v3/real_ord_query.json | 57 +++ .../schema/v3/smallint_eq_query.json | 54 +++ .../schema/v3/smallint_ord_ope_query.json | 54 +++ .../schema/v3/smallint_ord_ore_query.json | 57 +++ .../schema/v3/smallint_ord_query.json | 57 +++ .../eql-bindings/schema/v3/text_eq_query.json | 54 +++ .../schema/v3/text_match_query.json | 60 +++ .../schema/v3/text_ord_ope_query.json | 62 +++ .../schema/v3/text_ord_ore_query.json | 65 +++ .../schema/v3/text_ord_query.json | 65 +++ .../schema/v3/text_search_query.json | 79 ++++ .../schema/v3/timestamp_eq_query.json | 54 +++ .../schema/v3/timestamp_ord_ope_query.json | 54 +++ .../schema/v3/timestamp_ord_ore_query.json | 57 +++ .../schema/v3/timestamp_ord_query.json | 57 +++ crates/eql-bindings/src/from_v2/mod.rs | 148 ++++--- crates/eql-bindings/src/v3/bigint.rs | 124 ++++++ crates/eql-bindings/src/v3/date.rs | 124 ++++++ crates/eql-bindings/src/v3/double.rs | 124 ++++++ crates/eql-bindings/src/v3/integer.rs | 124 ++++++ crates/eql-bindings/src/v3/inventory.rs | 54 ++- crates/eql-bindings/src/v3/mod.rs | 2 +- crates/eql-bindings/src/v3/numeric.rs | 124 ++++++ crates/eql-bindings/src/v3/query_payload.rs | 327 ++++++++++++--- crates/eql-bindings/src/v3/real.rs | 124 ++++++ crates/eql-bindings/src/v3/smallint.rs | 124 ++++++ crates/eql-bindings/src/v3/text.rs | 191 +++++++++ crates/eql-bindings/src/v3/timestamp.rs | 124 ++++++ crates/eql-bindings/tests/export.rs | 5 +- crates/eql-bindings/tests/from_v2.rs | 24 +- crates/eql-bindings/tests/query_payload.rs | 84 +++- crates/eql-codegen/src/bindings.rs | 379 +++++++++++++++++- crates/eql-codegen/tests/cli.rs | 4 +- 95 files changed, 4664 insertions(+), 154 deletions(-) create mode 100644 crates/eql-bindings/bindings/v3/BigintEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/BigintOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DateEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DateOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DoubleEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/IntegerEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/NumericEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/NumericOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/RealEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/RealOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/SmallintEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TextEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TextMatchQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TextOrdQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TextSearchQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TimestampEqQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts create mode 100644 crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts create mode 100644 crates/eql-bindings/schema/v3/bigint_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/bigint_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/bigint_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/bigint_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/date_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/date_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/date_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/date_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/double_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/double_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/double_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/double_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/integer_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/integer_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/integer_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/integer_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/numeric_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/numeric_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/numeric_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/numeric_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/real_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/real_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/real_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/real_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/smallint_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/smallint_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/smallint_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/smallint_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/text_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/text_match_query.json create mode 100644 crates/eql-bindings/schema/v3/text_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/text_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/text_ord_query.json create mode 100644 crates/eql-bindings/schema/v3/text_search_query.json create mode 100644 crates/eql-bindings/schema/v3/timestamp_eq_query.json create mode 100644 crates/eql-bindings/schema/v3/timestamp_ord_ope_query.json create mode 100644 crates/eql-bindings/schema/v3/timestamp_ord_ore_query.json create mode 100644 crates/eql-bindings/schema/v3/timestamp_ord_query.json diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index b088fbec9..5d17f845e 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- **Scalar query-operand bindings (CIP-3432).** Every term-bearing scalar + domain now has a generated query twin — `IntegerEqQuery`, `IntegerOrdOpeQuery`, + `TextSearchQuery`, … — the **enveloped term-only** operand `{v, i, }` + (envelope minus the ciphertext `c`) for its `public._query` query + domain, with matching TypeScript bindings (`bindings/v3/*Query.ts`) and JSON + Schemas (`schema/v3/*_query.json`). Storage-only domains (no operators) get no + twin. `QueryPayload` is now catalog-generated — a variant per query twin plus + the SteVec containment needle — superseding the hand-written single-variant + enum. A new `all_query()` inventory exposes the query twins separately from + `all()` (which stays the stored + SteVec conversion-target inventory). + +### Changed + +- **`from_v2_query` / `from_v2_query_typed` now convert scalar query targets.** + A term-bearing scalar target hoists the v2 payload's required terms into the + `{v: 3, i, }` operand for its `_query` domain (dropping the + stored `c`/`k`; `bf` reinterpreted to signed `smallint[]`), validated through + the generated `QueryPayload`. Storage-only scalar targets still return + `UnsupportedQueryTarget`. Previously every scalar query target failed closed. + ## [0.4.2] - 2026-07-03 ### Fixed diff --git a/crates/eql-bindings/bindings/v3/BigintEqQuery.ts b/crates/eql-bindings/bindings/v3/BigintEqQuery.ts new file mode 100644 index 000000000..bdf9c2268 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/BigintEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type BigintEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts new file mode 100644 index 000000000..4de2db413 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type BigintOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts new file mode 100644 index 000000000..35e548217 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type BigintOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts new file mode 100644 index 000000000..27a7a7096 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type BigintOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/DateEqQuery.ts b/crates/eql-bindings/bindings/v3/DateEqQuery.ts new file mode 100644 index 000000000..335e2fb96 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DateEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type DateEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts new file mode 100644 index 000000000..298bf2b7b --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type DateOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts new file mode 100644 index 000000000..2717bf235 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type DateOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/DateOrdQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdQuery.ts new file mode 100644 index 000000000..632fbdfb0 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DateOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type DateOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts b/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts new file mode 100644 index 000000000..c4c906e4c --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type DoubleEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts new file mode 100644 index 000000000..3e128a99d --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type DoubleOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts new file mode 100644 index 000000000..7f686a036 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type DoubleOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts new file mode 100644 index 000000000..972799ff9 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type DoubleOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts b/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts new file mode 100644 index 000000000..2fe9d70a6 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type IntegerEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts new file mode 100644 index 000000000..fba5a5269 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type IntegerOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts new file mode 100644 index 000000000..5ad3c0414 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type IntegerOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts new file mode 100644 index 000000000..855461e5c --- /dev/null +++ b/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type IntegerOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/NumericEqQuery.ts b/crates/eql-bindings/bindings/v3/NumericEqQuery.ts new file mode 100644 index 000000000..006d35c59 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/NumericEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type NumericEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts new file mode 100644 index 000000000..0b69f372e --- /dev/null +++ b/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type NumericOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts new file mode 100644 index 000000000..42f0c138a --- /dev/null +++ b/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type NumericOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts new file mode 100644 index 000000000..ee8dcb744 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type NumericOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/RealEqQuery.ts b/crates/eql-bindings/bindings/v3/RealEqQuery.ts new file mode 100644 index 000000000..938ebd35e --- /dev/null +++ b/crates/eql-bindings/bindings/v3/RealEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type RealEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts new file mode 100644 index 000000000..2b7554584 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type RealOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts new file mode 100644 index 000000000..626ab64cc --- /dev/null +++ b/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type RealOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/RealOrdQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdQuery.ts new file mode 100644 index 000000000..3932d80f3 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/RealOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type RealOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts b/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts new file mode 100644 index 000000000..ab9f0f460 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type SmallintEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts new file mode 100644 index 000000000..95ebc6a6d --- /dev/null +++ b/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type SmallintOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts new file mode 100644 index 000000000..fc9aad722 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type SmallintOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts new file mode 100644 index 000000000..79196471f --- /dev/null +++ b/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type SmallintOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/TextEqQuery.ts b/crates/eql-bindings/bindings/v3/TextEqQuery.ts new file mode 100644 index 000000000..80bc5726a --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TextEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type TextEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/TextMatchQuery.ts b/crates/eql-bindings/bindings/v3/TextMatchQuery.ts new file mode 100644 index 000000000..5b2186427 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TextMatchQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { BloomFilter } from "./BloomFilter"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_match_query` — match domain query operand. + * + * Operators: `@>` `<@`. Required keys: `v` `i` `bf`. + */ +export type TextMatchQuery = { v: SchemaVersion, i: Identifier, bf: BloomFilter, }; diff --git a/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts new file mode 100644 index 000000000..f56e48854 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`. + */ +export type TextOrdOpeQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts new file mode 100644 index 000000000..39714e018 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. + */ +export type TextOrdOreQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/TextOrdQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdQuery.ts new file mode 100644 index 000000000..bffe6d452 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TextOrdQuery.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. + */ +export type TextOrdQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/TextSearchQuery.ts b/crates/eql-bindings/bindings/v3/TextSearchQuery.ts new file mode 100644 index 000000000..95f880203 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TextSearchQuery.ts @@ -0,0 +1,13 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { BloomFilter } from "./BloomFilter"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_search_query` — search domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`. + */ +export type TextSearchQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, ob: OreBlock256, bf: BloomFilter, }; diff --git a/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts b/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts new file mode 100644 index 000000000..9957cfadc --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_eq_query` — equality domain query operand. + * + * Operators: `=` `<>`. Required keys: `v` `i` `hm`. + */ +export type TimestampEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, }; diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts new file mode 100644 index 000000000..3aa566c09 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_ord_ope_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. + */ +export type TimestampOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, }; diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts new file mode 100644 index 000000000..dde9a9651 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_ord_ore_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type TimestampOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts new file mode 100644 index 000000000..40a87a216 --- /dev/null +++ b/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_ord_query` — ordering domain query operand. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. + */ +export type TimestampOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, }; diff --git a/crates/eql-bindings/schema/v3/bigint_eq_query.json b/crates/eql-bindings/schema/v3/bigint_eq_query.json new file mode 100644 index 000000000..9288fdc32 --- /dev/null +++ b/crates/eql-bindings/schema/v3/bigint_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "BigintEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/bigint_ord_ope_query.json b/crates/eql-bindings/schema/v3/bigint_ord_ope_query.json new file mode 100644 index 000000000..38dc59f27 --- /dev/null +++ b/crates/eql-bindings/schema/v3/bigint_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "BigintOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/bigint_ord_ore_query.json b/crates/eql-bindings/schema/v3/bigint_ord_ore_query.json new file mode 100644 index 000000000..74b2a1927 --- /dev/null +++ b/crates/eql-bindings/schema/v3/bigint_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "BigintOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/bigint_ord_query.json b/crates/eql-bindings/schema/v3/bigint_ord_query.json new file mode 100644 index 000000000..98c4bd655 --- /dev/null +++ b/crates/eql-bindings/schema/v3/bigint_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "BigintOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/date_eq_query.json b/crates/eql-bindings/schema/v3/date_eq_query.json new file mode 100644 index 000000000..ab1ca29f8 --- /dev/null +++ b/crates/eql-bindings/schema/v3/date_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "DateEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/date_ord_ope_query.json b/crates/eql-bindings/schema/v3/date_ord_ope_query.json new file mode 100644 index 000000000..59906195c --- /dev/null +++ b/crates/eql-bindings/schema/v3/date_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "DateOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/date_ord_ore_query.json b/crates/eql-bindings/schema/v3/date_ord_ore_query.json new file mode 100644 index 000000000..f7d0cc7fb --- /dev/null +++ b/crates/eql-bindings/schema/v3/date_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "DateOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/date_ord_query.json b/crates/eql-bindings/schema/v3/date_ord_query.json new file mode 100644 index 000000000..d38dd1e3c --- /dev/null +++ b/crates/eql-bindings/schema/v3/date_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "DateOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/double_eq_query.json b/crates/eql-bindings/schema/v3/double_eq_query.json new file mode 100644 index 000000000..85fee1c0c --- /dev/null +++ b/crates/eql-bindings/schema/v3/double_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "DoubleEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/double_ord_ope_query.json b/crates/eql-bindings/schema/v3/double_ord_ope_query.json new file mode 100644 index 000000000..d4fca8bff --- /dev/null +++ b/crates/eql-bindings/schema/v3/double_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "DoubleOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/double_ord_ore_query.json b/crates/eql-bindings/schema/v3/double_ord_ore_query.json new file mode 100644 index 000000000..a02376bb4 --- /dev/null +++ b/crates/eql-bindings/schema/v3/double_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "DoubleOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/double_ord_query.json b/crates/eql-bindings/schema/v3/double_ord_query.json new file mode 100644 index 000000000..c2d4d88e4 --- /dev/null +++ b/crates/eql-bindings/schema/v3/double_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "DoubleOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/integer_eq_query.json b/crates/eql-bindings/schema/v3/integer_eq_query.json new file mode 100644 index 000000000..9083fdcc5 --- /dev/null +++ b/crates/eql-bindings/schema/v3/integer_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "IntegerEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/integer_ord_ope_query.json b/crates/eql-bindings/schema/v3/integer_ord_ope_query.json new file mode 100644 index 000000000..8e72ca611 --- /dev/null +++ b/crates/eql-bindings/schema/v3/integer_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "IntegerOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/integer_ord_ore_query.json b/crates/eql-bindings/schema/v3/integer_ord_ore_query.json new file mode 100644 index 000000000..0f7e43152 --- /dev/null +++ b/crates/eql-bindings/schema/v3/integer_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "IntegerOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/integer_ord_query.json b/crates/eql-bindings/schema/v3/integer_ord_query.json new file mode 100644 index 000000000..f42a34899 --- /dev/null +++ b/crates/eql-bindings/schema/v3/integer_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "IntegerOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/numeric_eq_query.json b/crates/eql-bindings/schema/v3/numeric_eq_query.json new file mode 100644 index 000000000..535d7425d --- /dev/null +++ b/crates/eql-bindings/schema/v3/numeric_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "NumericEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ope_query.json b/crates/eql-bindings/schema/v3/numeric_ord_ope_query.json new file mode 100644 index 000000000..15525ad8c --- /dev/null +++ b/crates/eql-bindings/schema/v3/numeric_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "NumericOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ore_query.json b/crates/eql-bindings/schema/v3/numeric_ord_ore_query.json new file mode 100644 index 000000000..3b8f12209 --- /dev/null +++ b/crates/eql-bindings/schema/v3/numeric_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "NumericOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/numeric_ord_query.json b/crates/eql-bindings/schema/v3/numeric_ord_query.json new file mode 100644 index 000000000..71ae7d757 --- /dev/null +++ b/crates/eql-bindings/schema/v3/numeric_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "NumericOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/real_eq_query.json b/crates/eql-bindings/schema/v3/real_eq_query.json new file mode 100644 index 000000000..3f5176f4f --- /dev/null +++ b/crates/eql-bindings/schema/v3/real_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "RealEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/real_ord_ope_query.json b/crates/eql-bindings/schema/v3/real_ord_ope_query.json new file mode 100644 index 000000000..429604ae8 --- /dev/null +++ b/crates/eql-bindings/schema/v3/real_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "RealOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/real_ord_ore_query.json b/crates/eql-bindings/schema/v3/real_ord_ore_query.json new file mode 100644 index 000000000..eb1b73816 --- /dev/null +++ b/crates/eql-bindings/schema/v3/real_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "RealOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/real_ord_query.json b/crates/eql-bindings/schema/v3/real_ord_query.json new file mode 100644 index 000000000..ec12f83d6 --- /dev/null +++ b/crates/eql-bindings/schema/v3/real_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "RealOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/smallint_eq_query.json b/crates/eql-bindings/schema/v3/smallint_eq_query.json new file mode 100644 index 000000000..d05d8d080 --- /dev/null +++ b/crates/eql-bindings/schema/v3/smallint_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "SmallintEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ope_query.json b/crates/eql-bindings/schema/v3/smallint_ord_ope_query.json new file mode 100644 index 000000000..9778bfff2 --- /dev/null +++ b/crates/eql-bindings/schema/v3/smallint_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "SmallintOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ore_query.json b/crates/eql-bindings/schema/v3/smallint_ord_ore_query.json new file mode 100644 index 000000000..c29e09753 --- /dev/null +++ b/crates/eql-bindings/schema/v3/smallint_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "SmallintOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/smallint_ord_query.json b/crates/eql-bindings/schema/v3/smallint_ord_query.json new file mode 100644 index 000000000..475e08bd7 --- /dev/null +++ b/crates/eql-bindings/schema/v3/smallint_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "SmallintOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/text_eq_query.json b/crates/eql-bindings/schema/v3/text_eq_query.json new file mode 100644 index 000000000..833281305 --- /dev/null +++ b/crates/eql-bindings/schema/v3/text_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "TextEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/text_match_query.json b/crates/eql-bindings/schema/v3/text_match_query.json new file mode 100644 index 000000000..476bd52da --- /dev/null +++ b/crates/eql-bindings/schema/v3/text_match_query.json @@ -0,0 +1,60 @@ +{ + "$defs": { + "BloomFilter": { + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", + "items": { + "format": "int16", + "maximum": 32767, + "minimum": -32768, + "type": "integer" + }, + "type": "array" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_match_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_match_query` — match domain query operand.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `bf`.", + "properties": { + "bf": { + "$ref": "#/$defs/BloomFilter" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "bf" + ], + "title": "TextMatchQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/text_ord_ope_query.json b/crates/eql-bindings/schema/v3/text_ord_ope_query.json new file mode 100644 index 000000000..d3758fea8 --- /dev/null +++ b/crates/eql-bindings/schema/v3/text_ord_ope_query.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm", + "op" + ], + "title": "TextOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/text_ord_ore_query.json b/crates/eql-bindings/schema/v3/text_ord_ore_query.json new file mode 100644 index 000000000..cdd266373 --- /dev/null +++ b/crates/eql-bindings/schema/v3/text_ord_ore_query.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm", + "ob" + ], + "title": "TextOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/text_ord_query.json b/crates/eql-bindings/schema/v3/text_ord_query.json new file mode 100644 index 000000000..79fd6c436 --- /dev/null +++ b/crates/eql-bindings/schema/v3/text_ord_query.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm", + "ob" + ], + "title": "TextOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/text_search_query.json b/crates/eql-bindings/schema/v3/text_search_query.json new file mode 100644 index 000000000..b19db9d53 --- /dev/null +++ b/crates/eql-bindings/schema/v3/text_search_query.json @@ -0,0 +1,79 @@ +{ + "$defs": { + "BloomFilter": { + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", + "items": { + "format": "int16", + "maximum": 32767, + "minimum": -32768, + "type": "integer" + }, + "type": "array" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_search_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_search_query` — search domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`.", + "properties": { + "bf": { + "$ref": "#/$defs/BloomFilter" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm", + "ob", + "bf" + ], + "title": "TextSearchQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/timestamp_eq_query.json b/crates/eql-bindings/schema/v3/timestamp_eq_query.json new file mode 100644 index 000000000..a49427932 --- /dev/null +++ b/crates/eql-bindings/schema/v3/timestamp_eq_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_eq_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "hm" + ], + "title": "TimestampEqQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ope_query.json b/crates/eql-bindings/schema/v3/timestamp_ord_ope_query.json new file mode 100644 index 000000000..02ef7beb5 --- /dev/null +++ b/crates/eql-bindings/schema/v3/timestamp_ord_ope_query.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ope_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "op" + ], + "title": "TimestampOrdOpeQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ore_query.json b/crates/eql-bindings/schema/v3/timestamp_ord_ore_query.json new file mode 100644 index 000000000..6f9700b32 --- /dev/null +++ b/crates/eql-bindings/schema/v3/timestamp_ord_ore_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ore_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "TimestampOrdOreQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_query.json b/crates/eql-bindings/schema/v3/timestamp_ord_query.json new file mode 100644 index 000000000..2dfdc5279 --- /dev/null +++ b/crates/eql-bindings/schema/v3/timestamp_ord_query.json @@ -0,0 +1,57 @@ +{ + "$defs": { + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "ob" + ], + "title": "TimestampOrdQuery", + "type": "object" +} \ No newline at end of file diff --git a/crates/eql-bindings/src/from_v2/mod.rs b/crates/eql-bindings/src/from_v2/mod.rs index 9623efb0a..9f099d8c6 100644 --- a/crates/eql-bindings/src/from_v2/mod.rs +++ b/crates/eql-bindings/src/from_v2/mod.rs @@ -60,15 +60,16 @@ //! //! ## Query payloads //! -//! [`from_v2_query`] covers the jsonb containment needle -//! (`{sv: [{s, hm|oc}]}` → the [`crate::v3::jsonb::SteVecQuery`] shape), -//! normalizing entries down to `s` + one term exactly as the SQL cast +//! [`from_v2_query`] covers both query shapes. The jsonb containment needle +//! (`{sv: [{s, hm|oc}]}` → [`crate::v3::jsonb::SteVecQuery`]) normalizes +//! entries down to `s` + one term exactly as the SQL cast //! `eql_v3.to_ste_vec_query` does (stray `a` markers and `c` ciphertexts are -//! stripped). Scalar query targets return -//! [`FromV2Error::UnsupportedQueryTarget`]: no v3 scalar query wire shape -//! exists (every scalar domain CHECK requires the ciphertext `c` a query -//! payload omits), and this crate will not invent one ahead of the mapper -//! redesign. +//! stripped). A term-bearing scalar target hoists the target's required terms +//! into the enveloped term-only operand `{v: 3, i, }` for its +//! `_query` domain — the query counterpart of the stored conversion, +//! dropping `c`/`k` (CIP-3432). A STORAGE-ONLY scalar target (no terms, no +//! operators) has no query operand and returns +//! [`FromV2Error::UnsupportedQueryTarget`]. //! //! Query conversion has the same entry-point split as the stored-payload //! side: [`from_v2_query`] validates the converted needle and returns the @@ -162,26 +163,28 @@ fn convert(v2: &Value, target: TargetDomain) -> Result { } } -/// Convert an EQL v2.3 QUERY payload into the v3 query payload for `target`. +/// Convert an EQL v2.3 QUERY payload into the v3 query operand for `target`. /// -/// Only [`TargetDomain::Json`] is supported: the v2 containment needle -/// (`{sv: [{s, hm|oc}]}`, per the v2.3 schema's `SteVecQueryPayload`) -/// converts to the [`crate::v3::jsonb::SteVecQuery`] shape, entries -/// normalized to `s` + exactly one term (mirroring `eql_v3.to_ste_vec_query` -/// — stray `a`/`c` keys are stripped, so a stored document payload can also -/// be normalized into a needle). A `v`/`k` envelope, if present, must be -/// v2/`sv`; `i` is dropped. +/// [`TargetDomain::Json`]: the v2 containment needle (`{sv: [{s, hm|oc}]}`, the +/// v2.3 `SteVecQueryPayload`) converts to the [`crate::v3::jsonb::SteVecQuery`] +/// shape — entries normalized to `s` + exactly one term (mirroring +/// `eql_v3.to_ste_vec_query`; stray `a`/`c` keys are stripped, so a stored +/// document payload can also be normalized into a needle), `i` dropped. /// -/// Scalar targets return [`FromV2Error::UnsupportedQueryTarget`]: v2 scalar -/// query payloads omit `c`, no v3 scalar domain admits a `c`-less payload, -/// and this crate will not invent a wire shape ahead of the mapper redesign. +/// A term-bearing [`TargetDomain::Scalar`]: the target's required terms are +/// hoisted into the enveloped term-only operand `{v: 3, i, }` for its +/// `_query` domain, dropping `c`/`k` (`bf` reinterpreted to signed +/// `smallint[]`). A storage-only scalar target has no operators and returns +/// [`FromV2Error::UnsupportedQueryTarget`]. /// -/// Wire-oriented callers keep the `Value`; callers that want the needle -/// typed use [`from_v2_query_typed`] instead (same conversion, same -/// failures, one strict parse either way). +/// Wire-oriented callers keep the `Value`; callers that want it typed use +/// [`from_v2_query_typed`] instead (same conversion, same failures, one strict +/// parse either way). pub fn from_v2_query(v2: &Value, target: TargetDomain) -> Result { let out = convert_query(v2, target)?; - validate_as(QUERY_DOMAIN, &out)?; + // Validate through the generated QueryPayload strict parser (the query-side + // counterpart of validate_as), keyed on the target's `_query` domain. + parse_query(&query_domain_name(target), &out)?; Ok(out) } @@ -197,27 +200,35 @@ pub fn from_v2_query(v2: &Value, target: TargetDomain) -> Result_query` [`QueryPayload`] +/// variant. pub fn from_v2_query_typed(v2: &Value, target: TargetDomain) -> Result { let out = convert_query(v2, target)?; - QueryPayload::parse(QUERY_DOMAIN, &out) - .unwrap_or_else(|| { - // QUERY_DOMAIN is the literal "jsonb_query", which QueryPayload - // resolves to its SteVec variant. - unreachable!("query domain {QUERY_DOMAIN} must have a QueryPayload variant") - }) - .map_err(FromV2Error::Invalid) + parse_query(&query_domain_name(target), &out) +} + +/// The unqualified query-operand domain a target converts into: the scalar +/// twin `_query`, or `jsonb_query` for the SteVec needle. (Replaces the +/// old single `QUERY_DOMAIN` constant now that scalar query shapes exist.) +fn query_domain_name(target: TargetDomain) -> String { + match target { + TargetDomain::Json => "jsonb_query".to_string(), + TargetDomain::Scalar(t) => format!("{}_query", t.domain()), + } } -/// The (unqualified) SQL domain of every convertible query payload. A single -/// constant is honest today: [`convert_query`] only converts the jsonb -/// containment needle, so both entry points validate/parse as `jsonb_query`. -/// When the mapper redesign ships scalar query shapes, the domain becomes a -/// function of the target and this constant dissolves. -const QUERY_DOMAIN: &str = "jsonb_query"; +/// Validate `out` through the generated [`QueryPayload`] strict parser, keeping +/// the parsed variant. Every domain [`query_domain_name`] produces is a +/// QueryPayload variant (the scalar twins + the SteVec needle), so a `None` +/// return is unreachable — but `convert_query` guards storage-only scalar +/// targets first, so this is only ever called for a real query domain. +fn parse_query(domain: &str, out: &Value) -> Result { + QueryPayload::parse(domain, out) + .unwrap_or_else(|| unreachable!("query domain {domain} must have a QueryPayload variant")) + .map_err(FromV2Error::Invalid) +} /// The shared conversion path behind [`from_v2_query`] / /// [`from_v2_query_typed`]: dispatch on the target and build the v3 query @@ -225,13 +236,56 @@ const QUERY_DOMAIN: &str = "jsonb_query"; /// point does that exactly once (validate-and-discard in [`from_v2_query`], /// parse-and-keep in [`from_v2_query_typed`]). fn convert_query(v2: &Value, target: TargetDomain) -> Result { - let scalar = match target { - TargetDomain::Json => return convert_ste_vec_query(v2), - TargetDomain::Scalar(t) => t, - }; - Err(FromV2Error::UnsupportedQueryTarget { - domain: scalar.domain().into(), - }) + match target { + TargetDomain::Json => convert_ste_vec_query(v2), + TargetDomain::Scalar(t) => convert_scalar_query(v2, t), + } +} + +/// v2 scalar query payload → v3 enveloped term-only operand `{v: 3, i, +/// }` for `target`'s `_query` domain. Hoists exactly the target's +/// required terms out of the v2 payload (a query operand may omit the v2 +/// envelope), dropping `c`/`k` — the query counterpart of [`convert_scalar`] +/// (which keeps `c`). A STORAGE-ONLY target (no terms, no operators) has no +/// query operand and returns [`FromV2Error::UnsupportedQueryTarget`]. +fn convert_scalar_query(v2: &Value, target: ScalarTarget) -> Result { + if target.term_json_keys().is_empty() { + return Err(FromV2Error::UnsupportedQueryTarget { + domain: target.domain().into(), + }); + } + let obj = v2 + .as_object() + .ok_or_else(|| invalid("a query payload must be a JSON object"))?; + // A versioned input must be v2; a query operand may omit the envelope. + if let Some(v) = obj.get("v") { + if v.as_u64() != Some(V2_WIRE_VERSION) { + return Err(FromV2Error::UnsupportedVersion { found: v.as_u64() }); + } + } + let mut out = Map::new(); + out.insert("v".into(), json!(crate::EQL_SCHEMA_VERSION)); + if let Some(i) = obj.get("i") { + out.insert("i".into(), i.clone()); + // Absent `i` fails the entry point's final strict parse (the query + // domain requires `{v, i, }`). + } + for &key in target.term_json_keys() { + let val = obj.get(key).ok_or_else(|| FromV2Error::MissingTerm { + domain: target.domain().into(), + key: key.into(), + entry: None, + })?; + // `hm`/`ob`/`op` are representation-identical in v2 and v3; `bf` is + // reinterpreted from v2 unsigned bit positions to signed smallint[]. + let converted = if key == "bf" { + convert_bloom(val)? + } else { + val.clone() + }; + out.insert(key.into(), converted); + } + Ok(Value::Object(out)) } /// Lenient v3 envelope probe for format sniffing (protect-ffi / proxy): true diff --git a/crates/eql-bindings/src/v3/bigint.rs b/crates/eql-bindings/src/v3/bigint.rs index fdfbb6e63..9951b2186 100644 --- a/crates/eql-bindings/src/v3/bigint.rs +++ b/crates/eql-bindings/src/v3/bigint.rs @@ -165,3 +165,127 @@ impl DomainType for BigintOrdOpe { schema_for!(BigintOrdOpe) } } +/// `public.bigint_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct BigintEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for BigintEqQuery { + fn sql_domain_static() -> &'static str { + "public.bigint_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + BigintEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(BigintEqQuery) + } +} +/// `public.bigint_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct BigintOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for BigintOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.bigint_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + BigintOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(BigintOrdOreQuery) + } +} +/// `public.bigint_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct BigintOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for BigintOrdQuery { + fn sql_domain_static() -> &'static str { + "public.bigint_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + BigintOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(BigintOrdQuery) + } +} +/// `public.bigint_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct BigintOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for BigintOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.bigint_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + BigintOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(BigintOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs index 44fbf427e..198c7de22 100644 --- a/crates/eql-bindings/src/v3/date.rs +++ b/crates/eql-bindings/src/v3/date.rs @@ -165,3 +165,127 @@ impl DomainType for DateOrdOpe { schema_for!(DateOrdOpe) } } +/// `public.date_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DateEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for DateEqQuery { + fn sql_domain_static() -> &'static str { + "public.date_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DateEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DateEqQuery) + } +} +/// `public.date_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DateOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for DateOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.date_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DateOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DateOrdOreQuery) + } +} +/// `public.date_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DateOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for DateOrdQuery { + fn sql_domain_static() -> &'static str { + "public.date_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DateOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DateOrdQuery) + } +} +/// `public.date_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DateOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for DateOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.date_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DateOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DateOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/src/v3/double.rs b/crates/eql-bindings/src/v3/double.rs index 6bbc906e3..93f050df8 100644 --- a/crates/eql-bindings/src/v3/double.rs +++ b/crates/eql-bindings/src/v3/double.rs @@ -165,3 +165,127 @@ impl DomainType for DoubleOrdOpe { schema_for!(DoubleOrdOpe) } } +/// `public.double_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DoubleEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for DoubleEqQuery { + fn sql_domain_static() -> &'static str { + "public.double_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DoubleEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DoubleEqQuery) + } +} +/// `public.double_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DoubleOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for DoubleOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.double_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DoubleOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DoubleOrdOreQuery) + } +} +/// `public.double_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DoubleOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for DoubleOrdQuery { + fn sql_domain_static() -> &'static str { + "public.double_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DoubleOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DoubleOrdQuery) + } +} +/// `public.double_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct DoubleOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for DoubleOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.double_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + DoubleOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(DoubleOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/src/v3/integer.rs b/crates/eql-bindings/src/v3/integer.rs index 6e51ba526..631b57da6 100644 --- a/crates/eql-bindings/src/v3/integer.rs +++ b/crates/eql-bindings/src/v3/integer.rs @@ -165,3 +165,127 @@ impl DomainType for IntegerOrdOpe { schema_for!(IntegerOrdOpe) } } +/// `public.integer_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct IntegerEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for IntegerEqQuery { + fn sql_domain_static() -> &'static str { + "public.integer_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + IntegerEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(IntegerEqQuery) + } +} +/// `public.integer_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct IntegerOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for IntegerOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.integer_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + IntegerOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(IntegerOrdOreQuery) + } +} +/// `public.integer_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct IntegerOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for IntegerOrdQuery { + fn sql_domain_static() -> &'static str { + "public.integer_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + IntegerOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(IntegerOrdQuery) + } +} +/// `public.integer_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct IntegerOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for IntegerOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.integer_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + IntegerOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(IntegerOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/src/v3/inventory.rs b/crates/eql-bindings/src/v3/inventory.rs index 1df00474c..1a08dba09 100644 --- a/crates/eql-bindings/src/v3/inventory.rs +++ b/crates/eql-bindings/src/v3/inventory.rs @@ -1,8 +1,11 @@ // @generated by eql-codegen from the eql-domains catalog — do not edit -//! The `all()` inventory — every v3 domain payload type in eql-domains::CATALOG order. Generated from the catalog; the DomainType trait, the shared newtypes, and the architectural module doc stay hand-written (domain_type.rs / terms.rs / mod.rs). +//! The `all()` / `all_query()` inventories — every v3 stored and query-operand payload type in eql-domains::CATALOG order. Generated from the catalog; the DomainType trait, the shared newtypes, and the architectural module doc stay hand-written (domain_type.rs / terms.rs / mod.rs). use super::domain_type::DomainType; use std::marker::PhantomData; -/// Every v3 domain type, in `eql-domains::CATALOG` order — generated. +/// Every v3 stored-payload + SteVec domain type, in +/// `eql-domains::CATALOG` order — generated. This is the inventory +/// `from_v2::TargetDomain` resolves conversion targets against; query +/// twins are NOT here (see [`all_query`]). pub fn all() -> Vec> { vec![ Box::new(PhantomData::), @@ -58,3 +61,50 @@ pub fn all() -> Vec> { Box::new(PhantomData::), ] } +/// Every v3 QUERY-operand twin (`public._query`, the enveloped +/// term-only operand), in `eql-domains::CATALOG` order — generated. +/// Separate from [`all`] so query domains never resolve as stored +/// conversion targets; used by the JSON Schema export and query +/// validation. +pub fn all_query() -> Vec> { + vec![ + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + Box::new(PhantomData::), + ] +} diff --git a/crates/eql-bindings/src/v3/mod.rs b/crates/eql-bindings/src/v3/mod.rs index ec288a9ec..82dde2dec 100644 --- a/crates/eql-bindings/src/v3/mod.rs +++ b/crates/eql-bindings/src/v3/mod.rs @@ -151,6 +151,6 @@ pub mod text; pub mod timestamp; pub use domain_type::{DomainType, SCHEMA_ID_BASE, SQL_SCHEMA}; -pub use inventory::all; +pub use inventory::{all, all_query}; pub use payload::DomainPayload; pub use query_payload::QueryPayload; diff --git a/crates/eql-bindings/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs index cd02ccfdc..044a9c8ef 100644 --- a/crates/eql-bindings/src/v3/numeric.rs +++ b/crates/eql-bindings/src/v3/numeric.rs @@ -165,3 +165,127 @@ impl DomainType for NumericOrdOpe { schema_for!(NumericOrdOpe) } } +/// `public.numeric_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct NumericEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for NumericEqQuery { + fn sql_domain_static() -> &'static str { + "public.numeric_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + NumericEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(NumericEqQuery) + } +} +/// `public.numeric_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct NumericOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for NumericOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.numeric_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + NumericOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(NumericOrdOreQuery) + } +} +/// `public.numeric_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct NumericOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for NumericOrdQuery { + fn sql_domain_static() -> &'static str { + "public.numeric_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + NumericOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(NumericOrdQuery) + } +} +/// `public.numeric_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct NumericOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for NumericOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.numeric_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + NumericOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(NumericOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/src/v3/query_payload.rs b/crates/eql-bindings/src/v3/query_payload.rs index 12224610b..f66f8e29e 100644 --- a/crates/eql-bindings/src/v3/query_payload.rs +++ b/crates/eql-bindings/src/v3/query_payload.rs @@ -1,92 +1,289 @@ -//! The `QueryPayload` enum — every v3 QUERY payload shape in one Rust type — -//! HAND-WRITTEN, unlike the generated [`DomainPayload`](super::DomainPayload). -//! -//! ## Why hand-written and not codegen-emitted -//! -//! `DomainPayload` is generated because its variant set IS the catalog: one -//! variant per stored-payload domain, so a catalog change must reshape the -//! enum. Query payloads are **term-shaped, not catalog-per-domain**: a scalar -//! query value is a single index term (one Ore / Ope / Bloom / Hm value, not -//! a per-domain envelope), and the term set lives in the hand-written -//! `Term`-level code (`terms.rs`, mirroring `Term::ctor()` in `eql-domains`) -//! rather than in the catalog rows the generator walks. With the variant set -//! anchored to that stable hand-written surface — and exactly one variant -//! constructible today — a generator would add drift surface, not remove it. -//! This module lives next to the equally hand-written `jsonb.rs` that defines -//! its inner type. -//! -//! ## Why there is only one variant today -//! -//! See [`QueryPayload`]: the scalar-term variants are deliberately absent -//! until the eql-mapper redesign defines a v3 scalar-query wire shape. - -use serde::Serialize; - +// @generated by eql-codegen from the eql-domains catalog — do not edit +//! The generated `QueryPayload` enum — every v3 QUERY-operand domain in one Rust type. Generated from the catalog; the DomainType trait, the shared newtypes, and the architectural module doc stay hand-written (domain_type.rs / terms.rs / mod.rs). use super::domain_type::DomainType; -use super::jsonb::SteVecQuery; - -/// Every v3 query payload shape in one type. Today that is exactly one: -/// the SteVec containment needle ([`SteVecQuery`], `public.jsonb_query`). +use serde::{Deserialize, Serialize}; +/// Every v3 QUERY-operand shape in one type: one variant per term-bearing +/// scalar query twin (`public._query`, the enveloped term-only +/// operand — `{v, i, }`, no `c`) plus the SteVec containment +/// needle (`public.jsonb_query`). Generated from the catalog, so it +/// cannot drift when the catalog grows. /// -/// Serialization is exactly the inner type's (`#[serde(untagged)]` adds no -/// tagging), so typing a query payload never changes the wire. Deliberately -/// NO `Deserialize` — a variant is only constructible from a KNOWN domain -/// ([`QueryPayload::parse`] or [`crate::from_v2::from_v2_query_typed`]), -/// never inferred from bytes — and no ts-rs/schemars: the enum adds no wire -/// shape of its own, so it must not churn the exported TS/JSON-Schema -/// artifacts. -/// -/// ## Future scalar-term variants (deliberately absent) -/// -/// A scalar query value is a SINGLE index term — one `Ore` ([`super::terms::OreBlock256`]), -/// `Ope` ([`super::terms::OpeCllw`]), `Bloom` ([`super::terms::BloomFilter`]), -/// or `Hm` ([`super::terms::Hmac256`]) term value — not a stored envelope -/// (every scalar domain CHECK requires the ciphertext `c` a query payload -/// omits). No v3 scalar-query wire shape exists yet, and this crate will not -/// invent one ahead of the eql-mapper redesign: the converter fails closed -/// ([`crate::from_v2::FromV2Error::UnsupportedQueryTarget`]) instead. When -/// the mapper redesign defines the shape, this enum grows the matching -/// single-term variants and [`crate::from_v2::from_v2_query_typed`] starts -/// producing them. +/// Serialization is exactly the inner struct's (`#[serde(untagged)]` +/// adds no tagging), so typing a query operand never changes the wire. +/// Deliberately NO `Deserialize`: cross-token operands are byte-identical +/// on the wire, so a variant is only constructible from a KNOWN domain +/// — [`QueryPayload::parse`] or [`crate::from_v2::from_v2_query_typed`] — +/// never inferred from bytes. No ts-rs/schemars: it adds no wire shape. #[derive(Clone, Debug, PartialEq, Serialize)] #[serde(untagged)] pub enum QueryPayload { - /// The `public.jsonb_query` containment needle (`{sv: [{s, hm|oc}]}`). - SteVec(SteVecQuery), + /// The `public.integer_eq_query` query operand. + IntegerEqQuery(super::integer::IntegerEqQuery), + /// The `public.integer_ord_ore_query` query operand. + IntegerOrdOreQuery(super::integer::IntegerOrdOreQuery), + /// The `public.integer_ord_query` query operand. + IntegerOrdQuery(super::integer::IntegerOrdQuery), + /// The `public.integer_ord_ope_query` query operand. + IntegerOrdOpeQuery(super::integer::IntegerOrdOpeQuery), + /// The `public.smallint_eq_query` query operand. + SmallintEqQuery(super::smallint::SmallintEqQuery), + /// The `public.smallint_ord_ore_query` query operand. + SmallintOrdOreQuery(super::smallint::SmallintOrdOreQuery), + /// The `public.smallint_ord_query` query operand. + SmallintOrdQuery(super::smallint::SmallintOrdQuery), + /// The `public.smallint_ord_ope_query` query operand. + SmallintOrdOpeQuery(super::smallint::SmallintOrdOpeQuery), + /// The `public.bigint_eq_query` query operand. + BigintEqQuery(super::bigint::BigintEqQuery), + /// The `public.bigint_ord_ore_query` query operand. + BigintOrdOreQuery(super::bigint::BigintOrdOreQuery), + /// The `public.bigint_ord_query` query operand. + BigintOrdQuery(super::bigint::BigintOrdQuery), + /// The `public.bigint_ord_ope_query` query operand. + BigintOrdOpeQuery(super::bigint::BigintOrdOpeQuery), + /// The `public.date_eq_query` query operand. + DateEqQuery(super::date::DateEqQuery), + /// The `public.date_ord_ore_query` query operand. + DateOrdOreQuery(super::date::DateOrdOreQuery), + /// The `public.date_ord_query` query operand. + DateOrdQuery(super::date::DateOrdQuery), + /// The `public.date_ord_ope_query` query operand. + DateOrdOpeQuery(super::date::DateOrdOpeQuery), + /// The `public.timestamp_eq_query` query operand. + TimestampEqQuery(super::timestamp::TimestampEqQuery), + /// The `public.timestamp_ord_ore_query` query operand. + TimestampOrdOreQuery(super::timestamp::TimestampOrdOreQuery), + /// The `public.timestamp_ord_query` query operand. + TimestampOrdQuery(super::timestamp::TimestampOrdQuery), + /// The `public.timestamp_ord_ope_query` query operand. + TimestampOrdOpeQuery(super::timestamp::TimestampOrdOpeQuery), + /// The `public.numeric_eq_query` query operand. + NumericEqQuery(super::numeric::NumericEqQuery), + /// The `public.numeric_ord_ore_query` query operand. + NumericOrdOreQuery(super::numeric::NumericOrdOreQuery), + /// The `public.numeric_ord_query` query operand. + NumericOrdQuery(super::numeric::NumericOrdQuery), + /// The `public.numeric_ord_ope_query` query operand. + NumericOrdOpeQuery(super::numeric::NumericOrdOpeQuery), + /// The `public.text_eq_query` query operand. + TextEqQuery(super::text::TextEqQuery), + /// The `public.text_match_query` query operand. + TextMatchQuery(super::text::TextMatchQuery), + /// The `public.text_ord_ore_query` query operand. + TextOrdOreQuery(super::text::TextOrdOreQuery), + /// The `public.text_ord_query` query operand. + TextOrdQuery(super::text::TextOrdQuery), + /// The `public.text_ord_ope_query` query operand. + TextOrdOpeQuery(super::text::TextOrdOpeQuery), + /// The `public.text_search_query` query operand. + TextSearchQuery(super::text::TextSearchQuery), + /// The `public.real_eq_query` query operand. + RealEqQuery(super::real::RealEqQuery), + /// The `public.real_ord_ore_query` query operand. + RealOrdOreQuery(super::real::RealOrdOreQuery), + /// The `public.real_ord_query` query operand. + RealOrdQuery(super::real::RealOrdQuery), + /// The `public.real_ord_ope_query` query operand. + RealOrdOpeQuery(super::real::RealOrdOpeQuery), + /// The `public.double_eq_query` query operand. + DoubleEqQuery(super::double::DoubleEqQuery), + /// The `public.double_ord_ore_query` query operand. + DoubleOrdOreQuery(super::double::DoubleOrdOreQuery), + /// The `public.double_ord_query` query operand. + DoubleOrdQuery(super::double::DoubleOrdQuery), + /// The `public.double_ord_ope_query` query operand. + DoubleOrdOpeQuery(super::double::DoubleOrdOpeQuery), + /// The `public.jsonb_query` query operand. + SteVec(super::jsonb::SteVecQuery), } - impl QueryPayload { - /// Strictly parse `value` as `domain`'s QUERY payload, KEEPING the parsed - /// value — the query-side counterpart of - /// [`DomainPayload::parse`](super::DomainPayload::parse). `domain` is the - /// unqualified name (`"jsonb_query"`). `None` when `domain` is not a - /// query-payload domain (stored-payload domains and the sv entry shape - /// included); `Some(Err)` when the strict parse fails - /// ([`SteVecQuery`] is `deny_unknown_fields` at the root). + /// Strictly parse `value` as `domain`'s query payload, KEEPING the + /// parsed value — the query-side counterpart of + /// [`super::DomainPayload::parse`]. `domain` is the unqualified name + /// (`"integer_eq_query"`, `"jsonb_query"`, …). `None` when `domain` + /// is not a query-operand domain; `Some(Err)` when the strict parse + /// fails (`deny_unknown_fields` rejects a stray `c`). pub fn parse( domain: &str, value: &serde_json::Value, ) -> Option> { - use serde::Deserialize as _; match domain { - "jsonb_query" => Some(SteVecQuery::deserialize(value).map(Self::SteVec)), + "integer_eq_query" => { + Some(super::integer::IntegerEqQuery::deserialize(value).map(Self::IntegerEqQuery)) + } + "integer_ord_ore_query" => Some( + super::integer::IntegerOrdOreQuery::deserialize(value) + .map(Self::IntegerOrdOreQuery), + ), + "integer_ord_query" => { + Some(super::integer::IntegerOrdQuery::deserialize(value).map(Self::IntegerOrdQuery)) + } + "integer_ord_ope_query" => Some( + super::integer::IntegerOrdOpeQuery::deserialize(value) + .map(Self::IntegerOrdOpeQuery), + ), + "smallint_eq_query" => Some( + super::smallint::SmallintEqQuery::deserialize(value).map(Self::SmallintEqQuery), + ), + "smallint_ord_ore_query" => Some( + super::smallint::SmallintOrdOreQuery::deserialize(value) + .map(Self::SmallintOrdOreQuery), + ), + "smallint_ord_query" => Some( + super::smallint::SmallintOrdQuery::deserialize(value).map(Self::SmallintOrdQuery), + ), + "smallint_ord_ope_query" => Some( + super::smallint::SmallintOrdOpeQuery::deserialize(value) + .map(Self::SmallintOrdOpeQuery), + ), + "bigint_eq_query" => { + Some(super::bigint::BigintEqQuery::deserialize(value).map(Self::BigintEqQuery)) + } + "bigint_ord_ore_query" => Some( + super::bigint::BigintOrdOreQuery::deserialize(value).map(Self::BigintOrdOreQuery), + ), + "bigint_ord_query" => { + Some(super::bigint::BigintOrdQuery::deserialize(value).map(Self::BigintOrdQuery)) + } + "bigint_ord_ope_query" => Some( + super::bigint::BigintOrdOpeQuery::deserialize(value).map(Self::BigintOrdOpeQuery), + ), + "date_eq_query" => { + Some(super::date::DateEqQuery::deserialize(value).map(Self::DateEqQuery)) + } + "date_ord_ore_query" => { + Some(super::date::DateOrdOreQuery::deserialize(value).map(Self::DateOrdOreQuery)) + } + "date_ord_query" => { + Some(super::date::DateOrdQuery::deserialize(value).map(Self::DateOrdQuery)) + } + "date_ord_ope_query" => { + Some(super::date::DateOrdOpeQuery::deserialize(value).map(Self::DateOrdOpeQuery)) + } + "timestamp_eq_query" => Some( + super::timestamp::TimestampEqQuery::deserialize(value).map(Self::TimestampEqQuery), + ), + "timestamp_ord_ore_query" => Some( + super::timestamp::TimestampOrdOreQuery::deserialize(value) + .map(Self::TimestampOrdOreQuery), + ), + "timestamp_ord_query" => Some( + super::timestamp::TimestampOrdQuery::deserialize(value) + .map(Self::TimestampOrdQuery), + ), + "timestamp_ord_ope_query" => Some( + super::timestamp::TimestampOrdOpeQuery::deserialize(value) + .map(Self::TimestampOrdOpeQuery), + ), + "numeric_eq_query" => { + Some(super::numeric::NumericEqQuery::deserialize(value).map(Self::NumericEqQuery)) + } + "numeric_ord_ore_query" => Some( + super::numeric::NumericOrdOreQuery::deserialize(value) + .map(Self::NumericOrdOreQuery), + ), + "numeric_ord_query" => { + Some(super::numeric::NumericOrdQuery::deserialize(value).map(Self::NumericOrdQuery)) + } + "numeric_ord_ope_query" => Some( + super::numeric::NumericOrdOpeQuery::deserialize(value) + .map(Self::NumericOrdOpeQuery), + ), + "text_eq_query" => { + Some(super::text::TextEqQuery::deserialize(value).map(Self::TextEqQuery)) + } + "text_match_query" => { + Some(super::text::TextMatchQuery::deserialize(value).map(Self::TextMatchQuery)) + } + "text_ord_ore_query" => { + Some(super::text::TextOrdOreQuery::deserialize(value).map(Self::TextOrdOreQuery)) + } + "text_ord_query" => { + Some(super::text::TextOrdQuery::deserialize(value).map(Self::TextOrdQuery)) + } + "text_ord_ope_query" => { + Some(super::text::TextOrdOpeQuery::deserialize(value).map(Self::TextOrdOpeQuery)) + } + "text_search_query" => { + Some(super::text::TextSearchQuery::deserialize(value).map(Self::TextSearchQuery)) + } + "real_eq_query" => { + Some(super::real::RealEqQuery::deserialize(value).map(Self::RealEqQuery)) + } + "real_ord_ore_query" => { + Some(super::real::RealOrdOreQuery::deserialize(value).map(Self::RealOrdOreQuery)) + } + "real_ord_query" => { + Some(super::real::RealOrdQuery::deserialize(value).map(Self::RealOrdQuery)) + } + "real_ord_ope_query" => { + Some(super::real::RealOrdOpeQuery::deserialize(value).map(Self::RealOrdOpeQuery)) + } + "double_eq_query" => { + Some(super::double::DoubleEqQuery::deserialize(value).map(Self::DoubleEqQuery)) + } + "double_ord_ore_query" => Some( + super::double::DoubleOrdOreQuery::deserialize(value).map(Self::DoubleOrdOreQuery), + ), + "double_ord_query" => { + Some(super::double::DoubleOrdQuery::deserialize(value).map(Self::DoubleOrdQuery)) + } + "double_ord_ope_query" => Some( + super::double::DoubleOrdOpeQuery::deserialize(value).map(Self::DoubleOrdOpeQuery), + ), + "jsonb_query" => Some(super::jsonb::SteVecQuery::deserialize(value).map(Self::SteVec)), _ => None, } } - /// The inner payload as a [`DomainType`] trait object. pub fn as_domain_type(&self) -> &dyn DomainType { match self { + Self::IntegerEqQuery(payload) => payload, + Self::IntegerOrdOreQuery(payload) => payload, + Self::IntegerOrdQuery(payload) => payload, + Self::IntegerOrdOpeQuery(payload) => payload, + Self::SmallintEqQuery(payload) => payload, + Self::SmallintOrdOreQuery(payload) => payload, + Self::SmallintOrdQuery(payload) => payload, + Self::SmallintOrdOpeQuery(payload) => payload, + Self::BigintEqQuery(payload) => payload, + Self::BigintOrdOreQuery(payload) => payload, + Self::BigintOrdQuery(payload) => payload, + Self::BigintOrdOpeQuery(payload) => payload, + Self::DateEqQuery(payload) => payload, + Self::DateOrdOreQuery(payload) => payload, + Self::DateOrdQuery(payload) => payload, + Self::DateOrdOpeQuery(payload) => payload, + Self::TimestampEqQuery(payload) => payload, + Self::TimestampOrdOreQuery(payload) => payload, + Self::TimestampOrdQuery(payload) => payload, + Self::TimestampOrdOpeQuery(payload) => payload, + Self::NumericEqQuery(payload) => payload, + Self::NumericOrdOreQuery(payload) => payload, + Self::NumericOrdQuery(payload) => payload, + Self::NumericOrdOpeQuery(payload) => payload, + Self::TextEqQuery(payload) => payload, + Self::TextMatchQuery(payload) => payload, + Self::TextOrdOreQuery(payload) => payload, + Self::TextOrdQuery(payload) => payload, + Self::TextOrdOpeQuery(payload) => payload, + Self::TextSearchQuery(payload) => payload, + Self::RealEqQuery(payload) => payload, + Self::RealOrdOreQuery(payload) => payload, + Self::RealOrdQuery(payload) => payload, + Self::RealOrdOpeQuery(payload) => payload, + Self::DoubleEqQuery(payload) => payload, + Self::DoubleOrdOreQuery(payload) => payload, + Self::DoubleOrdQuery(payload) => payload, + Self::DoubleOrdOpeQuery(payload) => payload, Self::SteVec(payload) => payload, } } - - /// Fully-qualified SQL domain name, e.g. `"public.jsonb_query"`. + /// Fully-qualified SQL domain name, e.g. `"public.integer_eq_query"`. pub fn sql_domain(&self) -> &'static str { self.as_domain_type().sql_domain() } - - /// Unqualified SQL domain name, e.g. `"jsonb_query"` — the name + /// Unqualified SQL domain name, e.g. `"integer_eq_query"` — the name /// [`QueryPayload::parse`] accepts. pub fn domain(&self) -> &'static str { self.as_domain_type().domain() diff --git a/crates/eql-bindings/src/v3/real.rs b/crates/eql-bindings/src/v3/real.rs index dfa119597..5337a014a 100644 --- a/crates/eql-bindings/src/v3/real.rs +++ b/crates/eql-bindings/src/v3/real.rs @@ -165,3 +165,127 @@ impl DomainType for RealOrdOpe { schema_for!(RealOrdOpe) } } +/// `public.real_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct RealEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for RealEqQuery { + fn sql_domain_static() -> &'static str { + "public.real_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + RealEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(RealEqQuery) + } +} +/// `public.real_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct RealOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for RealOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.real_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + RealOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(RealOrdOreQuery) + } +} +/// `public.real_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct RealOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for RealOrdQuery { + fn sql_domain_static() -> &'static str { + "public.real_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + RealOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(RealOrdQuery) + } +} +/// `public.real_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct RealOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for RealOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.real_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + RealOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(RealOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/src/v3/smallint.rs b/crates/eql-bindings/src/v3/smallint.rs index 25156d3c8..a16891098 100644 --- a/crates/eql-bindings/src/v3/smallint.rs +++ b/crates/eql-bindings/src/v3/smallint.rs @@ -165,3 +165,127 @@ impl DomainType for SmallintOrdOpe { schema_for!(SmallintOrdOpe) } } +/// `public.smallint_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct SmallintEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for SmallintEqQuery { + fn sql_domain_static() -> &'static str { + "public.smallint_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + SmallintEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(SmallintEqQuery) + } +} +/// `public.smallint_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct SmallintOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for SmallintOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.smallint_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + SmallintOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(SmallintOrdOreQuery) + } +} +/// `public.smallint_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct SmallintOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for SmallintOrdQuery { + fn sql_domain_static() -> &'static str { + "public.smallint_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + SmallintOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(SmallintOrdQuery) + } +} +/// `public.smallint_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct SmallintOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for SmallintOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.smallint_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + SmallintOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(SmallintOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs index ee56c7389..698870acb 100644 --- a/crates/eql-bindings/src/v3/text.rs +++ b/crates/eql-bindings/src/v3/text.rs @@ -234,3 +234,194 @@ impl DomainType for TextSearch { schema_for!(TextSearch) } } +/// `public.text_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TextEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for TextEqQuery { + fn sql_domain_static() -> &'static str { + "public.text_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TextEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TextEqQuery) + } +} +/// `public.text_match_query` — match domain query operand. +/// +/// Operators: `@>` `<@`. Required keys: `v` `i` `bf`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TextMatchQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub bf: BloomFilter, +} +impl DomainType for TextMatchQuery { + fn sql_domain_static() -> &'static str { + "public.text_match_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["bf"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TextMatchQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TextMatchQuery) + } +} +/// `public.text_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TextOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, + pub ob: OreBlock256, +} +impl DomainType for TextOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.text_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm", "ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TextOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TextOrdOreQuery) + } +} +/// `public.text_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TextOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, + pub ob: OreBlock256, +} +impl DomainType for TextOrdQuery { + fn sql_domain_static() -> &'static str { + "public.text_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm", "ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TextOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TextOrdQuery) + } +} +/// `public.text_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TextOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, + pub op: OpeCllw, +} +impl DomainType for TextOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.text_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm", "op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TextOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TextOrdOpeQuery) + } +} +/// `public.text_search_query` — search domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TextSearchQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, + pub ob: OreBlock256, + pub bf: BloomFilter, +} +impl DomainType for TextSearchQuery { + fn sql_domain_static() -> &'static str { + "public.text_search_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm", "ob", "bf"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TextSearchQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TextSearchQuery) + } +} diff --git a/crates/eql-bindings/src/v3/timestamp.rs b/crates/eql-bindings/src/v3/timestamp.rs index f4d207157..8972bf494 100644 --- a/crates/eql-bindings/src/v3/timestamp.rs +++ b/crates/eql-bindings/src/v3/timestamp.rs @@ -165,3 +165,127 @@ impl DomainType for TimestampOrdOpe { schema_for!(TimestampOrdOpe) } } +/// `public.timestamp_eq_query` — equality domain query operand. +/// +/// Operators: `=` `<>`. Required keys: `v` `i` `hm`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TimestampEqQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub hm: Hmac256, +} +impl DomainType for TimestampEqQuery { + fn sql_domain_static() -> &'static str { + "public.timestamp_eq_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["hm"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TimestampEqQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TimestampEqQuery) + } +} +/// `public.timestamp_ord_ore_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TimestampOrdOreQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for TimestampOrdOreQuery { + fn sql_domain_static() -> &'static str { + "public.timestamp_ord_ore_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TimestampOrdOreQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TimestampOrdOreQuery) + } +} +/// `public.timestamp_ord_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TimestampOrdQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub ob: OreBlock256, +} +impl DomainType for TimestampOrdQuery { + fn sql_domain_static() -> &'static str { + "public.timestamp_ord_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["ob"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TimestampOrdQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TimestampOrdQuery) + } +} +/// `public.timestamp_ord_ope_query` — ordering domain query operand. +/// +/// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] +#[ts(export, export_to = "v3/")] +#[serde(deny_unknown_fields)] +pub struct TimestampOrdOpeQuery { + pub v: SchemaVersion, + pub i: Identifier, + pub op: OpeCllw, +} +impl DomainType for TimestampOrdOpeQuery { + fn sql_domain_static() -> &'static str { + "public.timestamp_ord_ope_query" + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&["op"]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + TimestampOrdOpeQuery::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(TimestampOrdOpeQuery) + } +} diff --git a/crates/eql-bindings/tests/export.rs b/crates/eql-bindings/tests/export.rs index d01e56059..a79853cf9 100644 --- a/crates/eql-bindings/tests/export.rs +++ b/crates/eql-bindings/tests/export.rs @@ -22,7 +22,10 @@ fn dump_v3_json_schemas() { std::fs::remove_dir_all(&dir).unwrap(); } std::fs::create_dir_all(&dir).unwrap(); - for entry in v3::all() { + // Both the stored/SteVec inventory and the query-operand twins: query + // domains are a wire shape consumers validate, so they get JSON Schema too + // (parity with the ts-rs export, which picks them up via `#[ts(export)]`). + for entry in v3::all().into_iter().chain(v3::all_query()) { let mut schema = serde_json::to_value(entry.schema()).unwrap(); // schemars 0.8 emits no $id; inject the canonical one (the URL format // lives on DomainType::schema_id, pinned by tests/catalog_parity.rs). diff --git a/crates/eql-bindings/tests/from_v2.rs b/crates/eql-bindings/tests/from_v2.rs index b5d2d3c16..42a316b2f 100644 --- a/crates/eql-bindings/tests/from_v2.rs +++ b/crates/eql-bindings/tests/from_v2.rs @@ -431,15 +431,23 @@ fn ste_vec_query_entry_term_errors_match_document_rules() { } #[test] -fn scalar_query_targets_are_unsupported() { - // No v3 scalar query wire shape exists (every scalar domain CHECK - // requires `c`); inventing one here would guess ahead of the mapper - // redesign, so the converter refuses. - let query = json!({ "v": 2, "k": "ct", "i": ident(), "hm": HEX }); - let err = from_v2_query(&query, target("text_eq")).unwrap_err(); +fn scalar_query_hoists_terms_and_storage_only_is_unsupported() { + // CIP-3432: a term-bearing scalar target hoists its terms into the + // enveloped term-only `_query` operand — `{v:3, i, }`, dropping + // the stored `c`/`k`. A storage-only target has no operators, so it stays + // UnsupportedQueryTarget. + let query = json!({ "v": 2, "k": "ct", "i": ident(), "c": CIPHERTEXT, "hm": HEX }); + let out = from_v2_query(&query, target("text_eq")).expect("text_eq query hoist succeeds"); + assert_eq!( + out, + json!({ "v": 3, "i": ident(), "hm": HEX }), + "hoist keeps v/i + the hm term, drops c/k" + ); + + let err = from_v2_query(&query, target("boolean")).unwrap_err(); match err { - FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, "text_eq"), - other => panic!("expected UnsupportedQueryTarget, got {other:?}"), + FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, "boolean"), + other => panic!("expected UnsupportedQueryTarget for storage-only, got {other:?}"), } } diff --git a/crates/eql-bindings/tests/query_payload.rs b/crates/eql-bindings/tests/query_payload.rs index fcc11d4dd..14b4d259b 100644 --- a/crates/eql-bindings/tests/query_payload.rs +++ b/crates/eql-bindings/tests/query_payload.rs @@ -1,4 +1,4 @@ -//! Tests for the hand-written [`QueryPayload`] enum and the typed query +//! Tests for the generated [`QueryPayload`] enum and the typed query //! conversion path [`from_v2_query_typed`]. //! //! The load-bearing contract mirrors `tests/domain_payload.rs`: the @@ -7,7 +7,8 @@ //! is `#[serde(untagged)]`, so typing a query payload can never change the //! wire) — plus failure parity: both entry points reject the same inputs with //! the same errors, including [`FromV2Error::UnsupportedQueryTarget`] for -//! EVERY scalar target (no v3 scalar-query wire shape exists yet). +//! STORAGE-ONLY scalar targets (term-bearing scalars now hoist to their +//! `_query` operand — CIP-3432). use eql_bindings::from_v2::{from_v2_query, from_v2_query_typed, FromV2Error, TargetDomain}; use eql_bindings::v3::{DomainType, QueryPayload}; @@ -73,6 +74,7 @@ fn typed_needle_yields_the_ste_vec_variant() { assert_eq!(q.sv.len(), 2, "entry order/count preserved"); assert_eq!(q.sql_domain(), "public.jsonb_query"); } + other => panic!("a jsonb target must yield the SteVec needle, got {other:?}"), } } @@ -98,26 +100,78 @@ fn typed_needle_normalizes_exactly_like_from_v2_query() { // from_v2_query_typed — failure parity with from_v2_query // --------------------------------------------------------------------------- +/// A v2 `k:"ct"` scalar payload carrying representative values for `term_keys` +/// PLUS a stray `c` (which a query hoist must drop). Empty `term_keys` → just +/// the `{v,k,i,c}` envelope. +fn v2_scalar_query(term_keys: &[&str]) -> Value { + let mut obj = json!({ "v": 2, "k": "ct", "i": ident(), "c": CIPHERTEXT }); + let map = obj.as_object_mut().unwrap(); + for &k in term_keys { + let term = match k { + "hm" | "op" => json!(HEX), + "ob" => json!([HEX, HEX]), + "bf" => json!([1, 2, 3]), + other => panic!("unhandled term key {other}"), + }; + map.insert(k.into(), term); + } + obj +} + #[test] -fn every_scalar_target_is_unsupported_on_both_entry_points() { - // No v3 scalar-query wire shape exists (every scalar domain CHECK - // requires the ciphertext `c` a query payload omits); QueryPayload fails - // closed rather than inventing one ahead of the mapper redesign — - // exhaustively, for every scalar domain in the catalog, on BOTH entry - // points. - let query = json!({ "v": 2, "k": "ct", "i": ident(), "hm": HEX }); +fn scalar_query_hoist_and_storage_only_unsupported() { + // CIP-3432: a term-bearing scalar target hoists the v2 payload's required + // terms into the enveloped term-only operand `{v:3, i, }` for its + // `_query` domain (dropping `c`/`k`); a storage-only scalar target + // (no operators) still fails closed with UnsupportedQueryTarget. Exhaustive + // over the catalog, both entry points, with the typed==untyped pin. for family in eql_domains::scalar_families() { for domain in family.domains { let name = family.domain_name(domain); let t = target(&name); - match from_v2_query_typed(&query, t).unwrap_err() { - FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, name), - other => panic!("expected UnsupportedQueryTarget for {name}, got {other:?}"), + let term_keys: Vec<&str> = eql_domains::Term::term_json_keys(domain.terms); + let v2 = v2_scalar_query(&term_keys); + + if term_keys.is_empty() { + for err in [ + from_v2_query_typed(&v2, t).unwrap_err(), + from_v2_query(&v2, t).unwrap_err(), + ] { + match err { + FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, name), + other => { + panic!("expected UnsupportedQueryTarget for {name}, got {other:?}") + } + } + } + continue; } - match from_v2_query(&query, t).unwrap_err() { - FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, name), - other => panic!("expected UnsupportedQueryTarget for {name}, got {other:?}"), + + let out = + from_v2_query(&v2, t).unwrap_or_else(|e| panic!("{name} hoist failed: {e:?}")); + let obj = out.as_object().unwrap(); + assert_eq!(obj.get("v").and_then(Value::as_u64), Some(3), "{name} v:3"); + assert!(obj.contains_key("i"), "{name} keeps i"); + assert!(!obj.contains_key("c"), "{name} query drops c"); + assert!(!obj.contains_key("k"), "{name} query drops k"); + for k in &term_keys { + assert!(obj.contains_key(*k), "{name} keeps term {k}"); } + assert_eq!( + obj.len(), + 2 + term_keys.len(), + "{name} is exactly v+i+terms" + ); + + let typed = + from_v2_query_typed(&v2, t).unwrap_or_else(|e| panic!("{name} typed hoist: {e:?}")); + assert_eq!(typed.domain(), format!("{name}_query"), "{name} domain"); + assert_eq!(typed.sql_domain(), format!("public.{name}_query")); + assert_eq!( + serde_json::to_value(&typed).unwrap(), + out, + "{name}: typed to_value must equal from_v2_query" + ); } } } diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index 15bb93698..b9426699c 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -189,9 +189,87 @@ fn render_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { } } +/// One query-operand payload struct + its `DomainType` impl for a capability +/// domain: the storage struct MINUS the `c` ciphertext. A query operand carries +/// only index terms (no stored ciphertext), so its `public._query` domain +/// admits exactly `{v, i, }` — `deny_unknown_fields` makes a stray `c` +/// (or any storage key) a parse error, mirroring the SQL `_query` domain +/// CHECK (CIP-3432). Emitted only for term-bearing domains: a storage-only +/// domain has no operators, so no query operand. +fn render_query_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { + let full = domain.full_name(family.name); + let ident = format_ident!("{}Query", domain.struct_ident(family.name)); + let sql_domain = format!("public.{full}_query"); + + // Query doc: same capability label + operator union as storage, but the + // required-key list drops `c` (query operands omit the ciphertext). + let summary = format!( + " `public.{full}_query` — {} query operand.", + capability_label(domain.name) + ); + let ops = Term::operators_for_terms(domain.terms); + let ops_str = ops + .iter() + .map(|o| format!("`{o}`")) + .collect::>() + .join(" "); + let keys_str = ["v", "i"] + .into_iter() + .chain(Term::term_json_keys(domain.terms)) + .map(|k| format!("`{k}`")) + .collect::>() + .join(" "); + let detail = format!(" Operators: {ops_str}. Required keys: {keys_str}."); + + // Envelope minus `c`: `v`/`i` only. Kept in lockstep with the storage + // struct's envelope triple (see `envelope_fields_match_catalog_keys`). + let mut fields = TokenStream::new(); + fields.extend(quote! { pub v: SchemaVersion, }); + fields.extend(quote! { pub i: Identifier, }); + for term in Term::payload_terms(domain.terms) { + let fid = format_ident!("{}", term.json_key()); + let tid = format_ident!("{}", term.binding_newtype()); + fields.extend(quote! { pub #fid: #tid, }); + } + let term_keys = Term::term_json_keys(domain.terms); + + quote! { + #[doc = #summary] + #[doc = ""] + #[doc = #detail] + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] + #[ts(export, export_to = "v3/")] + #[serde(deny_unknown_fields)] + pub struct #ident { + #fields + } + + impl DomainType for #ident { + fn sql_domain_static() -> &'static str { + #sql_domain + } + fn sql_domain(&self) -> &'static str { + Self::sql_domain_static() + } + fn term_json_keys_static() -> Option<&'static [&'static str]> { + Some(&[#(#term_keys),*]) + } + fn term_json_keys(&self) -> Option<&'static [&'static str]> { + Self::term_json_keys_static() + } + fn parse_value(&self, value: &serde_json::Value) -> Result<(), serde_json::Error> { + #ident::deserialize(value).map(|_| ()) + } + fn schema(&self) -> Schema { + schema_for!(#ident) + } + } + } +} + /// Render a whole family module (`integer.rs`, `text.rs`, …): the import header /// (exactly the term newtypes the family uses) followed by every domain's -/// struct + impl. +/// storage struct + impl, then a query twin for each term-bearing domain. pub fn render_family_bindings(family: &DomainFamily) -> String { let mut used: Vec<&'static str> = vec!["Ciphertext"]; for d in family.domains { @@ -204,10 +282,19 @@ pub fn render_family_bindings(family: &DomainFamily) -> String { } let used_idents: Vec<_> = used.iter().map(|t| format_ident!("{t}")).collect(); + // Storage structs for every domain, then a query twin for each term-bearing + // domain (storage-only domains have no operators, so no query operand). let structs: TokenStream = family .domains .iter() .map(|d| render_struct(family, d)) + .chain( + family + .domains + .iter() + .filter(|d| !d.terms.is_empty()) + .map(|d| render_query_struct(family, d)), + ) .collect(); let mod_doc = format!( @@ -252,10 +339,31 @@ pub fn render_inventory_rs() -> String { }) .collect(); - let mod_doc = " The `all()` inventory — every v3 domain payload type in \ - eql-domains::CATALOG order. Generated from the catalog; the \ - DomainType trait, the shared newtypes, and the architectural \ - module doc stay hand-written (domain_type.rs / terms.rs / mod.rs)."; + // The QUERY-operand inventory: one twin per term-bearing scalar domain, + // in CATALOG order. Kept SEPARATE from `all()` — `all()` is the stored + + // SteVec inventory that `from_v2::TargetDomain` and `catalog_parity` + // resolve against, and query twins must not appear there as conversion + // targets. `all_query()` gives the schema export (and query validation) a + // handle on the twins without polluting `all()`. + let query_entries: TokenStream = eql_domains::scalar_families() + .flat_map(|f| { + let m = format_ident!("{}", f.name); + f.domains + .iter() + .filter(|d| !d.terms.is_empty()) + .map(move |d| { + let s = format_ident!("{}Query", d.struct_ident(f.name)); + quote! { Box::new(PhantomData::), } + }) + .collect::>() + }) + .collect(); + + let mod_doc = " The `all()` / `all_query()` inventories — every v3 stored and \ + query-operand payload type in eql-domains::CATALOG order. \ + Generated from the catalog; the DomainType trait, the shared \ + newtypes, and the architectural module doc stay hand-written \ + (domain_type.rs / terms.rs / mod.rs)."; let file = quote! { #![doc = #mod_doc] @@ -264,12 +372,26 @@ pub fn render_inventory_rs() -> String { use super::domain_type::DomainType; - /// Every v3 domain type, in `eql-domains::CATALOG` order — generated. + /// Every v3 stored-payload + SteVec domain type, in + /// `eql-domains::CATALOG` order — generated. This is the inventory + /// `from_v2::TargetDomain` resolves conversion targets against; query + /// twins are NOT here (see [`all_query`]). pub fn all() -> Vec> { vec![ #all_entries ] } + + /// Every v3 QUERY-operand twin (`public._query`, the enveloped + /// term-only operand), in `eql-domains::CATALOG` order — generated. + /// Separate from [`all`] so query domains never resolve as stored + /// conversion targets; used by the JSON Schema export and query + /// validation. + pub fn all_query() -> Vec> { + vec![ + #query_entries + ] + } }; format_rs(file) @@ -394,6 +516,142 @@ pub fn render_payload_rs() -> String { format_rs(file) } +/// The catalog's QUERY-operand domains, in a stable order: a query twin for +/// every term-bearing scalar domain (`public._query`), then the SteVec +/// containment needle (`public.jsonb_query`). Exactly the shapes the generated +/// `QueryPayload` spans and `from_v2_query` can target. Returned as +/// `(module, variant ident, struct ident, unqualified query-domain name)`; the +/// SteVec needle keeps the `SteVec` variant name the `from_v2` query path +/// already uses (its struct is the hand-written `SteVecQuery`). +fn query_payload_domains() -> Vec<(String, String, String, String)> { + let mut out: Vec<(String, String, String, String)> = eql_domains::scalar_families() + .flat_map(|f| { + f.domains + .iter() + .filter(|d| !d.terms.is_empty()) + .map(move |d| { + let q = format!("{}Query", d.struct_ident(f.name)); + ( + f.name.to_string(), + q.clone(), + q, + format!("{}_query", d.full_name(f.name)), + ) + }) + }) + .collect(); + out.push(( + "jsonb".into(), + "SteVec".into(), + "SteVecQuery".into(), + "jsonb_query".into(), + )); + out +} + +/// Render the generated `crates/eql-bindings/src/v3/query_payload.rs`: the +/// `QueryPayload` enum spanning every QUERY-operand domain — a variant per +/// term-bearing scalar query twin (`public._query`) plus the SteVec +/// containment needle (`public.jsonb_query`) — with its +/// construct-from-known-domain `parse` constructor. +/// +/// Generated for the same reason as [`render_payload_rs`]'s `DomainPayload`: +/// enveloped, per-capability query payloads (CIP-3432) are catalog-per-domain +/// (one twin per capability domain), so the variant set IS the catalog and must +/// reshape with it. Serialize-only + `#[serde(untagged)]` + no ts-rs/schemars, +/// exactly like `DomainPayload`: the enum adds no wire shape (each variant +/// serializes as its inner struct) and must not churn the exported TS/JSON. +pub fn render_query_payload_rs() -> String { + let mut variants = TokenStream::new(); + let mut parse_arms = TokenStream::new(); + let mut inner_arms = TokenStream::new(); + for (module, variant, strukt, key) in query_payload_domains() { + let m = format_ident!("{module}"); + let v = format_ident!("{variant}"); + let s = format_ident!("{strukt}"); + let doc = format!(" The `public.{key}` query operand."); + variants.extend(quote! { + #[doc = #doc] + #v(super::#m::#s), + }); + parse_arms.extend(quote! { + #key => Some(super::#m::#s::deserialize(value).map(Self::#v)), + }); + inner_arms.extend(quote! { + Self::#v(payload) => payload, + }); + } + + let mod_doc = " The generated `QueryPayload` enum — every v3 QUERY-operand \ + domain in one Rust type. Generated from the catalog; the \ + DomainType trait, the shared newtypes, and the architectural \ + module doc stay hand-written (domain_type.rs / terms.rs / mod.rs)."; + + let file = quote! { + #![doc = #mod_doc] + + use serde::{Deserialize, Serialize}; + + use super::domain_type::DomainType; + + /// Every v3 QUERY-operand shape in one type: one variant per term-bearing + /// scalar query twin (`public._query`, the enveloped term-only + /// operand — `{v, i, }`, no `c`) plus the SteVec containment + /// needle (`public.jsonb_query`). Generated from the catalog, so it + /// cannot drift when the catalog grows. + /// + /// Serialization is exactly the inner struct's (`#[serde(untagged)]` + /// adds no tagging), so typing a query operand never changes the wire. + /// Deliberately NO `Deserialize`: cross-token operands are byte-identical + /// on the wire, so a variant is only constructible from a KNOWN domain + /// — [`QueryPayload::parse`] or [`crate::from_v2::from_v2_query_typed`] — + /// never inferred from bytes. No ts-rs/schemars: it adds no wire shape. + #[derive(Clone, Debug, PartialEq, Serialize)] + #[serde(untagged)] + pub enum QueryPayload { + #variants + } + + impl QueryPayload { + /// Strictly parse `value` as `domain`'s query payload, KEEPING the + /// parsed value — the query-side counterpart of + /// [`super::DomainPayload::parse`]. `domain` is the unqualified name + /// (`"integer_eq_query"`, `"jsonb_query"`, …). `None` when `domain` + /// is not a query-operand domain; `Some(Err)` when the strict parse + /// fails (`deny_unknown_fields` rejects a stray `c`). + pub fn parse( + domain: &str, + value: &serde_json::Value, + ) -> Option> { + match domain { + #parse_arms + _ => None, + } + } + + /// The inner payload as a [`DomainType`] trait object. + pub fn as_domain_type(&self) -> &dyn DomainType { + match self { + #inner_arms + } + } + + /// Fully-qualified SQL domain name, e.g. `"public.integer_eq_query"`. + pub fn sql_domain(&self) -> &'static str { + self.as_domain_type().sql_domain() + } + + /// Unqualified SQL domain name, e.g. `"integer_eq_query"` — the name + /// [`QueryPayload::parse`] accepts. + pub fn domain(&self) -> &'static str { + self.as_domain_type().domain() + } + } + }; + + format_rs(file) +} + /// Relative path (from repo root) of the generated v3 bindings directory. const V3_BINDINGS_DIR: &str = "crates/eql-bindings/src/v3"; @@ -414,6 +672,7 @@ fn render_bindings(dir: &Path) -> Vec<(PathBuf, String)> { }) .collect(); rendered.push((dir.join("payload.rs"), render_payload_rs())); + rendered.push((dir.join("query_payload.rs"), render_query_payload_rs())); rendered.push((dir.join("inventory.rs"), render_inventory_rs())); rendered } @@ -489,15 +748,16 @@ mod tests { ] { assert!(out.contains(s), "missing {s}"); } + // 5 storage structs + 4 query twins (every term-bearing domain). assert_eq!( out.matches( "#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]" ) .count(), - 5 + 9 ); - assert_eq!(out.matches("#[ts(export, export_to = \"v3/\")]").count(), 5); - assert_eq!(out.matches("#[serde(deny_unknown_fields)]").count(), 5); + assert_eq!(out.matches("#[ts(export, export_to = \"v3/\")]").count(), 9); + assert_eq!(out.matches("#[serde(deny_unknown_fields)]").count(), 9); assert!(out.contains("`public.integer_eq` — equality domain.")); assert!(out.contains("`public.integer` — storage-only domain.")); assert!(out.contains("`public.integer_ord` — ordering domain.")); @@ -519,6 +779,45 @@ mod tests { assert!(!out.contains("BloomFilter")); } + #[test] + fn query_twins_drop_c_and_name_query_domains() { + // CIP-3432: every term-bearing capability domain gets a `Query` + // twin = the storage struct minus `c`, on the `public._query` + // domain. Storage-only domains (no operators) get no twin. + let out = render_family_bindings(family("integer")); + for s in [ + "struct IntegerEqQuery ", + "struct IntegerOrdOreQuery ", + "struct IntegerOrdQuery ", + "struct IntegerOrdOpeQuery ", + ] { + assert!(out.contains(s), "missing {s}"); + } + assert!( + !out.contains("struct IntegerQuery "), + "storage-only `integer` has no operators, so no query twin" + ); + // Query operand = envelope minus `c`, then the term(s). + assert_eq!(field_idents(&out, "IntegerEqQuery"), ["v", "i", "hm"]); + assert_eq!(field_idents(&out, "IntegerOrdQuery"), ["v", "i", "ob"]); + assert_eq!(field_idents(&out, "IntegerOrdOpeQuery"), ["v", "i", "op"]); + assert!(out.contains("\"public.integer_eq_query\"")); + assert!(out.contains("impl DomainType for IntegerEqQuery")); + assert!(out.contains("schema_for!(IntegerEqQuery)")); + assert!(out.contains("`public.integer_eq_query` — equality domain query operand.")); + // Query twin term keys mirror the storage domain's. + assert!(out.contains(r#"&["op"]"#)); + + // Dual-term text domains keep BOTH terms in the query twin, still no `c`. + let text = render_family_bindings(family("text")); + assert_eq!(field_idents(&text, "TextOrdQuery"), ["v", "i", "hm", "ob"]); + assert_eq!( + field_idents(&text, "TextSearchQuery"), + ["v", "i", "hm", "ob", "bf"] + ); + assert!(text.contains("`public.text_match_query` — match domain query operand.")); + } + #[test] fn struct_doc_carries_derivable_operators_and_required_keys() { // The struct doc is derived entirely from catalog data already present: @@ -601,7 +900,7 @@ mod tests { let tmp = crate::writer::test_support::tempdir(); let written = generate_bindings(tmp.path()).unwrap(); let dir = tmp.path().join("crates/eql-bindings/src/v3"); - assert_eq!(written.len(), eql_domains::scalar_families().count() + 2); + assert_eq!(written.len(), eql_domains::scalar_families().count() + 3); assert!(dir.join("integer.rs").is_file()); assert!(dir.join("text.rs").is_file()); assert!(dir.join("payload.rs").is_file()); @@ -634,7 +933,7 @@ mod tests { let rendered = render_bindings(&dir); - assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 2); + assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 3); assert_eq!( std::fs::read_to_string(&sentinel).unwrap(), "SENTINEL", @@ -699,6 +998,51 @@ mod tests { assert!(out.contains("pub fn domain(&self) -> &'static str")); } + #[test] + fn query_payload_enum_spans_query_twins_and_stevec_needle() { + // CIP-3432: QueryPayload is now generated — one variant per term-bearing + // scalar query twin (`_query`) plus the SteVec needle + // (`jsonb_query`), in query_payload_domains() order (scalars, then + // SteVec). Serialize-only + untagged + no export derives, like + // DomainPayload. + let out = render_query_payload_rs(); + assert!(out.starts_with(crate::consts::RUST_GENERATED_MARKER)); + + let variants = variant_idents(&out, "QueryPayload"); + // First variant is a scalar twin; last is the SteVec needle. + assert!(variants.contains(&"IntegerEqQuery".to_string())); + assert!(variants.contains(&"TextSearchQuery".to_string())); + assert_eq!(variants.last().unwrap(), "SteVec"); + // No storage-only domain twin (they have no operators). + assert!(!variants.contains(&"IntegerQuery".to_string())); + assert!(!variants.contains(&"BooleanQuery".to_string())); + // One scalar variant per term-bearing scalar domain, + 1 for SteVec. + let term_bearing: usize = eql_domains::scalar_families() + .flat_map(|f| f.domains.iter()) + .filter(|d| !d.terms.is_empty()) + .count(); + assert_eq!(variants.len(), term_bearing + 1); + + // parse arms keyed on the unqualified query-domain names. + assert!(out.contains(r#""integer_eq_query" =>"#)); + assert!(out.contains("IntegerEqQuery::deserialize(value).map(Self::IntegerEqQuery)")); + assert!(out.contains(r#""jsonb_query" =>"#)); + assert!(out.contains("SteVecQuery::deserialize(value).map(Self::SteVec)")); + assert!(out.contains("_ => None,")); + + // Serialize-only, untagged, no export derives (mirrors DomainPayload). + assert!(out.contains("#[derive(Clone, Debug, PartialEq, Serialize)]")); + assert!(out.contains("#[serde(untagged)]")); + assert!( + !out.contains("#[derive(Clone, Debug, PartialEq, Serialize, Deserialize"), + "QueryPayload must not derive Deserialize" + ); + assert!(!out.contains("#[ts("), "no ts-rs export on QueryPayload"); + assert!(!out.contains("JsonSchema"), "no schemars on QueryPayload"); + assert!(out.contains("pub fn parse(")); + assert!(out.contains("pub fn as_domain_type(&self) -> &dyn DomainType")); + } + #[test] fn payload_enum_is_untagged_serialize_only_with_no_export_derives() { // The wire form must be exactly the inner struct's, and DomainPayload @@ -744,9 +1088,18 @@ mod tests { "missing {ty}" ); } + // Both inventories: all() (every CATALOG domain) + all_query() (a twin + // per term-bearing scalar domain). + assert!(out.contains("pub fn all() -> Vec>")); + assert!(out.contains("pub fn all_query() -> Vec>")); let entries = out.matches("Box::new(PhantomData::<").count(); let domains: usize = eql_domains::CATALOG.iter().map(|f| f.domains.len()).sum(); - assert_eq!(entries, domains); + let query_twins: usize = eql_domains::scalar_families() + .flat_map(|f| f.domains.iter()) + .filter(|d| !d.terms.is_empty()) + .count(); + assert_eq!(entries, domains + query_twins); + assert!(out.contains("PhantomData::")); } #[test] @@ -833,7 +1186,7 @@ mod tests { "jsonb.rs is hand-written; the generator must not emit it" ); // One file per scalar family + payload + inventory. - assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 2); + assert_eq!(rendered.len(), eql_domains::scalar_families().count() + 3); } #[test] diff --git a/crates/eql-codegen/tests/cli.rs b/crates/eql-codegen/tests/cli.rs index fb2d4f326..2bfba964b 100644 --- a/crates/eql-codegen/tests/cli.rs +++ b/crates/eql-codegen/tests/cli.rs @@ -34,7 +34,7 @@ fn tempdir() -> TempDir { /// `EQL_CODEGEN_OUT_ROOT` tree so the smoke test proves the subcommand honours /// the output-root override (test isolation) and never touches the committed /// `crates/eql-bindings/src/v3/*.rs`. The count is one file per catalog family -/// plus `payload.rs` and `inventory.rs`. +/// plus `payload.rs`, `query_payload.rs`, and `inventory.rs`. #[test] fn bindings_subcommand_succeeds_and_reports_count() { let out_root = tempdir(); @@ -49,7 +49,7 @@ fn bindings_subcommand_succeeds_and_reports_count() { String::from_utf8_lossy(&out.stderr) ); let stdout = String::from_utf8_lossy(&out.stdout); - let expected = eql_domains::scalar_families().count() + 2; + let expected = eql_domains::scalar_families().count() + 3; assert!( stdout.contains(&format!("bindings: ok ({expected} files)")), "expected 'bindings: ok ({expected} files)' in stdout, got:\n{stdout}" From 9c62e8c9248bcc0656fac546ab7b0301bede6564 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 12:27:28 +1000 Subject: [PATCH 539/599] chore: gitignore .claude session dir --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a419ab9ac..6f08e3ef2 100644 --- a/.gitignore +++ b/.gitignore @@ -257,3 +257,4 @@ nextest.tar.zst # Working notes retained on disk but intentionally not committed docs/decisions/2026-06-10-eql-v3-json-type-kind.md docs/handoff/2026-06-10-v3-jsonb-fixture-alignment.md +.claude/ From 2cdc89c9c3a564570183cdb69b3381a279d63568 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 14:36:09 +1000 Subject: [PATCH 540/599] feat(eql v3 sql): generate public._query operand domains (CIP-3432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SQL half, part 1: a `public._query` domain per term-bearing scalar domain — the index-terms-only twin (`{v, i, }`) that query operators will consume. CHECK asserts the envelope-minus-`c` + terms and FORBIDS `c` (a query operand carries no ciphertext), mirroring the Rust binding's deny_unknown_fields. - context.rs: DomainBlock gains `forbidden_keys`; `query_domain_block` builds the twin (keys = v/i + terms, forbidden = [c]). - templates/query_types.sql.j2: idempotent CREATE DOMAIN with the no-`c` CHECK. - generate.rs: `render_query_types_file` → `_query_types.sql`, wired into `render_type` for families with any term-bearing domain. Validated: `mise run build` assembles; the full surface (38 query domains) installs cleanly into a fresh PG (`test:clean_install_v3`); and the CHECK semantics verified directly — `{v,i,hm}` accepted, a payload with `c` or a missing term rejected. Still to do: query extractors + wrappers + operators binding (storage_domain, _query), and sqlx conformance (needs CS creds). CIP-3432 --- crates/eql-codegen/src/context.rs | 41 +++++++ crates/eql-codegen/src/generate.rs | 36 +++++- .../eql-codegen/templates/query_types.sql.j2 | 33 +++++ src/v3/scalars/bigint/bigint_query_types.sql | 77 ++++++++++++ src/v3/scalars/date/date_query_types.sql | 77 ++++++++++++ src/v3/scalars/double/double_query_types.sql | 77 ++++++++++++ .../scalars/integer/integer_query_types.sql | 77 ++++++++++++ .../scalars/numeric/numeric_query_types.sql | 77 ++++++++++++ src/v3/scalars/real/real_query_types.sql | 77 ++++++++++++ .../scalars/smallint/smallint_query_types.sql | 77 ++++++++++++ src/v3/scalars/text/text_query_types.sql | 116 ++++++++++++++++++ .../timestamp/timestamp_query_types.sql | 77 ++++++++++++ 12 files changed, 840 insertions(+), 2 deletions(-) create mode 100644 crates/eql-codegen/templates/query_types.sql.j2 create mode 100644 src/v3/scalars/bigint/bigint_query_types.sql create mode 100644 src/v3/scalars/date/date_query_types.sql create mode 100644 src/v3/scalars/double/double_query_types.sql create mode 100644 src/v3/scalars/integer/integer_query_types.sql create mode 100644 src/v3/scalars/numeric/numeric_query_types.sql create mode 100644 src/v3/scalars/real/real_query_types.sql create mode 100644 src/v3/scalars/smallint/smallint_query_types.sql create mode 100644 src/v3/scalars/text/text_query_types.sql create mode 100644 src/v3/scalars/timestamp/timestamp_query_types.sql diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 93c7fa2f3..febd19099 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -16,6 +16,11 @@ pub fn environment() -> minijinja::Environment<'static> { env.set_keep_trailing_newline(true); env.add_template("types.sql", include_str!("../templates/types.sql.j2")) .expect("types.sql template"); + env.add_template( + "query_types.sql", + include_str!("../templates/query_types.sql.j2"), + ) + .expect("query_types.sql template"); env.add_template( "functions.sql", include_str!("../templates/functions.sql.j2"), @@ -65,6 +70,11 @@ pub struct DomainBlock { // stays term-agnostic — it renders a non-empty-array CHECK per key without // hardcoding `ob`. Empty for non-ORE domains. See issue #262. pub nonempty_array_keys: Vec, + // sql_str-escaped keys the payload must NOT carry. Empty for storage domains; + // `['c']` for a query-operand twin, whose CHECK forbids the ciphertext (a + // query operand is index-terms-only — CIP-3432). The template renders a + // `NOT (VALUE ? k)` clause per key. + pub forbidden_keys: Vec, } #[derive(serde::Serialize)] @@ -95,6 +105,37 @@ pub fn domain_block(family_name: &str, domain: &Domain) -> DomainBlock { .into_iter() .map(sql_str) .collect(), + // Storage domains forbid nothing; the query twin forbids `c`. + forbidden_keys: vec![], + } +} + +/// The query-operand twin block for a term-bearing domain: `public._query`, +/// keys = envelope-minus-`c` (`v`/`i`) + the domain's terms, with `c` FORBIDDEN +/// (a query operand carries no ciphertext — CIP-3432). Same non-empty-array term +/// rule as the storage block. +pub fn query_domain_block(family_name: &str, domain: &Domain) -> DomainBlock { + let name = format!("{}_query", domain.full_name(family_name)); + + // Envelope minus the ciphertext `c`, then the domain's terms. + let mut keys: Vec = ENVELOPE_KEYS + .iter() + .filter(|&&k| k != "c") + .map(|k| sql_str(k)) + .collect(); + for k in Term::term_json_keys(domain.terms) { + keys.push(sql_str(k)); + } + + DomainBlock { + typname: sql_str(&name), + name, + keys, + nonempty_array_keys: Term::nonempty_array_keys(domain.terms) + .into_iter() + .map(sql_str) + .collect(), + forbidden_keys: vec![sql_str("c")], } } diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 5de9da165..ff4b56457 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -56,6 +56,28 @@ pub fn render_types_file(spec: &DomainFamily) -> String { .expect("render types.sql") } +/// Body for _query_types.sql: a `public._query` operand domain per +/// TERM-BEARING domain — the index-terms-only twin (no `c`) whose operators +/// consume a query operand (CIP-3432). Storage-only domains have no operators, +/// so no query twin. +pub fn render_query_types_file(spec: &DomainFamily) -> String { + use crate::context::{environment, query_domain_block, TypesContext}; + let ctx = TypesContext { + family_name: spec.name.to_string(), + domains: spec + .domains + .iter() + .filter(|d| !d.terms.is_empty()) + .map(|d| query_domain_block(spec.name, d)) + .collect(), + }; + environment() + .get_template("query_types.sql") + .unwrap() + .render(&ctx) + .expect("render query_types.sql") +} + /// REQUIRE edges for a domain's _functions.sql. Port of `_functions_requires`. fn functions_requires(family_name: &str, terms: &[Term]) -> Vec { let mut reqs = vec![ @@ -215,6 +237,14 @@ pub fn render_type(spec: &DomainFamily, out_dir: &Path) -> Vec<(PathBuf, String) out_dir.join(format!("{family_name}_types.sql")), render_types_file(spec), )]; + // Query-operand twin domains (term-only, no `c`) — only for families with at + // least one term-bearing domain (storage-only families have no query surface). + if spec.domains.iter().any(|d| !d.terms.is_empty()) { + rendered.push(( + out_dir.join(format!("{family_name}_query_types.sql")), + render_query_types_file(spec), + )); + } for d in spec.domains { let name = d.full_name(family_name); rendered.push(( @@ -394,6 +424,8 @@ mod tests { .map(|p| p.file_name().unwrap().to_str().unwrap().to_string()) .collect(); assert!(names.contains(&"integer_types.sql".to_string())); + // Query-operand twin domains (term-only, no `c`) for the family. + assert!(names.contains(&"integer_query_types.sql".to_string())); for dom in [ "integer", "integer_eq", @@ -409,8 +441,8 @@ mod tests { assert!(names.contains(&"integer_ord_ore_aggregates.sql".to_string())); assert!(names.contains(&"integer_ord_aggregates.sql".to_string())); assert!(names.contains(&"integer_ord_ope_aggregates.sql".to_string())); - // 1 types + 2 per domain (5 domains) + 3 ord-capable aggregates. - assert_eq!(written.len(), 14); + // 1 types + 1 query_types + 2 per domain (5 domains) + 3 ord-capable aggregates. + assert_eq!(written.len(), 15); for p in &written { assert!(fs::read_to_string(p) .unwrap() diff --git a/crates/eql-codegen/templates/query_types.sql.j2 b/crates/eql-codegen/templates/query_types.sql.j2 new file mode 100644 index 000000000..c600770ad --- /dev/null +++ b/crates/eql-codegen/templates/query_types.sql.j2 @@ -0,0 +1,33 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/{{ family_name }}/{{ family_name }}_query_types.sql +--! @brief Query-operand domains for {{ family_name }} (index-terms-only, no ciphertext). + +DO $$ +BEGIN +{%- for d in domains %} + --! @brief Query-operand domain public.{{ d.name }} (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = '{{ d.typname }}' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.{{ d.name }} AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + {%- for k in d.keys %} + AND VALUE ? '{{ k }}' + {%- endfor %} + {%- for k in d.forbidden_keys %} + AND NOT (VALUE ? '{{ k }}') + {%- endfor %} + {%- for k in d.nonempty_array_keys %} + AND jsonb_typeof(VALUE -> '{{ k }}') = 'array' + AND jsonb_array_length(VALUE -> '{{ k }}') > 0 + {%- endfor %} + AND VALUE->>'v' = '3' + ); + END IF; +{% endfor -%} +END +$$; diff --git a/src/v3/scalars/bigint/bigint_query_types.sql b/src/v3/scalars/bigint/bigint_query_types.sql new file mode 100644 index 000000000..1d995bf0f --- /dev/null +++ b/src/v3/scalars/bigint/bigint_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/bigint/bigint_query_types.sql +--! @brief Query-operand domains for bigint (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.bigint_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'bigint_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.bigint_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.bigint_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'bigint_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.bigint_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.bigint_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'bigint_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.bigint_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.bigint_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'bigint_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.bigint_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/date/date_query_types.sql b/src/v3/scalars/date/date_query_types.sql new file mode 100644 index 000000000..d02dac1cb --- /dev/null +++ b/src/v3/scalars/date/date_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/date/date_query_types.sql +--! @brief Query-operand domains for date (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.date_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.date_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.date_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.date_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.date_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.date_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.date_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'date_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.date_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/double/double_query_types.sql b/src/v3/scalars/double/double_query_types.sql new file mode 100644 index 000000000..49c82a1f7 --- /dev/null +++ b/src/v3/scalars/double/double_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/double/double_query_types.sql +--! @brief Query-operand domains for double (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.double_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'double_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.double_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.double_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'double_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.double_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.double_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'double_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.double_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.double_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'double_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.double_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/integer/integer_query_types.sql b/src/v3/scalars/integer/integer_query_types.sql new file mode 100644 index 000000000..0578ef0cd --- /dev/null +++ b/src/v3/scalars/integer/integer_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/integer/integer_query_types.sql +--! @brief Query-operand domains for integer (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.integer_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'integer_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.integer_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.integer_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'integer_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.integer_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.integer_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'integer_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.integer_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.integer_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'integer_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.integer_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/numeric/numeric_query_types.sql b/src/v3/scalars/numeric/numeric_query_types.sql new file mode 100644 index 000000000..9ade8f12e --- /dev/null +++ b/src/v3/scalars/numeric/numeric_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/numeric/numeric_query_types.sql +--! @brief Query-operand domains for numeric (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.numeric_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.numeric_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.numeric_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.numeric_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.numeric_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.numeric_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.numeric_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'numeric_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.numeric_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/real/real_query_types.sql b/src/v3/scalars/real/real_query_types.sql new file mode 100644 index 000000000..698652948 --- /dev/null +++ b/src/v3/scalars/real/real_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/real/real_query_types.sql +--! @brief Query-operand domains for real (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.real_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'real_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.real_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.real_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'real_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.real_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.real_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'real_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.real_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.real_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'real_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.real_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/smallint/smallint_query_types.sql b/src/v3/scalars/smallint/smallint_query_types.sql new file mode 100644 index 000000000..35bcce7e4 --- /dev/null +++ b/src/v3/scalars/smallint/smallint_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/smallint/smallint_query_types.sql +--! @brief Query-operand domains for smallint (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.smallint_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'smallint_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.smallint_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.smallint_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'smallint_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.smallint_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.smallint_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'smallint_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.smallint_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.smallint_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'smallint_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.smallint_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/text/text_query_types.sql b/src/v3/scalars/text/text_query_types.sql new file mode 100644 index 000000000..2214e3238 --- /dev/null +++ b/src/v3/scalars/text/text_query_types.sql @@ -0,0 +1,116 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/text/text_query_types.sql +--! @brief Query-operand domains for text (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.text_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.text_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.text_match_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_match_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.text_match_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'bf' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.text_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.text_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.text_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.text_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.text_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.text_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.text_search_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'text_search_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.text_search_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND VALUE ? 'ob' + AND VALUE ? 'bf' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; diff --git a/src/v3/scalars/timestamp/timestamp_query_types.sql b/src/v3/scalars/timestamp/timestamp_query_types.sql new file mode 100644 index 000000000..9c440e0a9 --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_query_types.sql @@ -0,0 +1,77 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql + +--! @file v3/scalars/timestamp/timestamp_query_types.sql +--! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). + +DO $$ +BEGIN + --! @brief Query-operand domain public.timestamp_eq_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_eq_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_eq_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.timestamp_ord_ore_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord_ore_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord_ore_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.timestamp_ord_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + --! @brief Query-operand domain public.timestamp_ord_ope_query (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord_ope_query' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord_ope_query AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; +END +$$; From 080d7521dd8ffe41784adca984e1ed92dd2328a5 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 15:32:30 +1000 Subject: [PATCH 541/599] =?UTF-8?q?feat(eql=20v3=20sql):=20generate=20quer?= =?UTF-8?q?y=20operators=20binding=20storage=E2=86=94query=20domains=20(CI?= =?UTF-8?q?P-3432)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SQL half, part 2: per term-bearing domain, a `_query_functions.sql` + `_query_operators.sql` giving query operands a public SQL entry point. - `render_query_functions_file`: query-operand extractor OVERLOADS (the same eq_term/ord_term, on `public._query`) + comparison WRAPPERS binding `(storage, query)` and its `(query, storage)` commutator — supported operators only, `extractor(a) extractor(b)`, no ciphertext cast. - `render_query_operators_file`: `CREATE OPERATOR` for each, both directions, reusing the existing planner metadata (COMMUTATOR/NEGATOR/RESTRICT/JOIN). - Wired into `render_type` for term-bearing domains; reuses the storage `functions.sql` / `operators.sql` templates unchanged. Semantically validated against REAL fixture ciphertext (local PG): a term-only operand `{v,i,hm}` (no `c`) matches the stored row through `= (public.integer_eq, public.integer_eq_query)` — self-match hit all 17 integer fixture rows, and a plaintext=0 operand matched exactly the plaintext=0 row. Full surface installs clean (`test:clean_install_v3`). Next: sqlx conformance test with fresh in-test encryption (increment 6). CIP-3432 --- crates/eql-codegen/src/generate.rs | 125 +++++++++++++- .../bigint/bigint_eq_query_functions.sql | 47 ++++++ .../bigint/bigint_eq_query_operators.sql | 31 ++++ .../bigint/bigint_ord_ope_query_functions.sql | 111 ++++++++++++ .../bigint/bigint_ord_ope_query_operators.sql | 79 +++++++++ .../bigint/bigint_ord_ore_query_functions.sql | 111 ++++++++++++ .../bigint/bigint_ord_ore_query_operators.sql | 79 +++++++++ .../bigint/bigint_ord_query_functions.sql | 111 ++++++++++++ .../bigint/bigint_ord_query_operators.sql | 79 +++++++++ .../scalars/date/date_eq_query_functions.sql | 47 ++++++ .../scalars/date/date_eq_query_operators.sql | 31 ++++ .../date/date_ord_ope_query_functions.sql | 111 ++++++++++++ .../date/date_ord_ope_query_operators.sql | 79 +++++++++ .../date/date_ord_ore_query_functions.sql | 111 ++++++++++++ .../date/date_ord_ore_query_operators.sql | 79 +++++++++ .../scalars/date/date_ord_query_functions.sql | 111 ++++++++++++ .../scalars/date/date_ord_query_operators.sql | 79 +++++++++ .../double/double_eq_query_functions.sql | 47 ++++++ .../double/double_eq_query_operators.sql | 31 ++++ .../double/double_ord_ope_query_functions.sql | 111 ++++++++++++ .../double/double_ord_ope_query_operators.sql | 79 +++++++++ .../double/double_ord_ore_query_functions.sql | 111 ++++++++++++ .../double/double_ord_ore_query_operators.sql | 79 +++++++++ .../double/double_ord_query_functions.sql | 111 ++++++++++++ .../double/double_ord_query_operators.sql | 79 +++++++++ .../integer/integer_eq_query_functions.sql | 47 ++++++ .../integer/integer_eq_query_operators.sql | 31 ++++ .../integer_ord_ope_query_functions.sql | 111 ++++++++++++ .../integer_ord_ope_query_operators.sql | 79 +++++++++ .../integer_ord_ore_query_functions.sql | 111 ++++++++++++ .../integer_ord_ore_query_operators.sql | 79 +++++++++ .../integer/integer_ord_query_functions.sql | 111 ++++++++++++ .../integer/integer_ord_query_operators.sql | 79 +++++++++ .../numeric/numeric_eq_query_functions.sql | 47 ++++++ .../numeric/numeric_eq_query_operators.sql | 31 ++++ .../numeric_ord_ope_query_functions.sql | 111 ++++++++++++ .../numeric_ord_ope_query_operators.sql | 79 +++++++++ .../numeric_ord_ore_query_functions.sql | 111 ++++++++++++ .../numeric_ord_ore_query_operators.sql | 79 +++++++++ .../numeric/numeric_ord_query_functions.sql | 111 ++++++++++++ .../numeric/numeric_ord_query_operators.sql | 79 +++++++++ .../scalars/real/real_eq_query_functions.sql | 47 ++++++ .../scalars/real/real_eq_query_operators.sql | 31 ++++ .../real/real_ord_ope_query_functions.sql | 111 ++++++++++++ .../real/real_ord_ope_query_operators.sql | 79 +++++++++ .../real/real_ord_ore_query_functions.sql | 111 ++++++++++++ .../real/real_ord_ore_query_operators.sql | 79 +++++++++ .../scalars/real/real_ord_query_functions.sql | 111 ++++++++++++ .../scalars/real/real_ord_query_operators.sql | 79 +++++++++ .../smallint/smallint_eq_query_functions.sql | 47 ++++++ .../smallint/smallint_eq_query_operators.sql | 31 ++++ .../smallint_ord_ope_query_functions.sql | 111 ++++++++++++ .../smallint_ord_ope_query_operators.sql | 79 +++++++++ .../smallint_ord_ore_query_functions.sql | 111 ++++++++++++ .../smallint_ord_ore_query_operators.sql | 79 +++++++++ .../smallint/smallint_ord_query_functions.sql | 111 ++++++++++++ .../smallint/smallint_ord_query_operators.sql | 79 +++++++++ .../scalars/text/text_eq_query_functions.sql | 47 ++++++ .../scalars/text/text_eq_query_operators.sql | 31 ++++ .../text/text_match_query_functions.sql | 47 ++++++ .../text/text_match_query_operators.sql | 31 ++++ .../text/text_ord_ope_query_functions.sql | 119 +++++++++++++ .../text/text_ord_ope_query_operators.sql | 79 +++++++++ .../text/text_ord_ore_query_functions.sql | 119 +++++++++++++ .../text/text_ord_ore_query_operators.sql | 79 +++++++++ .../scalars/text/text_ord_query_functions.sql | 119 +++++++++++++ .../scalars/text/text_ord_query_operators.sql | 79 +++++++++ .../text/text_search_query_functions.sql | 159 ++++++++++++++++++ .../text/text_search_query_operators.sql | 103 ++++++++++++ .../timestamp_eq_query_functions.sql | 47 ++++++ .../timestamp_eq_query_operators.sql | 31 ++++ .../timestamp_ord_ope_query_functions.sql | 111 ++++++++++++ .../timestamp_ord_ope_query_operators.sql | 79 +++++++++ .../timestamp_ord_ore_query_functions.sql | 111 ++++++++++++ .../timestamp_ord_ore_query_operators.sql | 79 +++++++++ .../timestamp_ord_query_functions.sql | 111 ++++++++++++ .../timestamp_ord_query_operators.sql | 79 +++++++++ 77 files changed, 6319 insertions(+), 2 deletions(-) create mode 100644 src/v3/scalars/bigint/bigint_eq_query_functions.sql create mode 100644 src/v3/scalars/bigint/bigint_eq_query_operators.sql create mode 100644 src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/bigint/bigint_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/bigint/bigint_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/bigint/bigint_ord_query_functions.sql create mode 100644 src/v3/scalars/bigint/bigint_ord_query_operators.sql create mode 100644 src/v3/scalars/date/date_eq_query_functions.sql create mode 100644 src/v3/scalars/date/date_eq_query_operators.sql create mode 100644 src/v3/scalars/date/date_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/date/date_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/date/date_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/date/date_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/date/date_ord_query_functions.sql create mode 100644 src/v3/scalars/date/date_ord_query_operators.sql create mode 100644 src/v3/scalars/double/double_eq_query_functions.sql create mode 100644 src/v3/scalars/double/double_eq_query_operators.sql create mode 100644 src/v3/scalars/double/double_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/double/double_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/double/double_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/double/double_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/double/double_ord_query_functions.sql create mode 100644 src/v3/scalars/double/double_ord_query_operators.sql create mode 100644 src/v3/scalars/integer/integer_eq_query_functions.sql create mode 100644 src/v3/scalars/integer/integer_eq_query_operators.sql create mode 100644 src/v3/scalars/integer/integer_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/integer/integer_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/integer/integer_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/integer/integer_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/integer/integer_ord_query_functions.sql create mode 100644 src/v3/scalars/integer/integer_ord_query_operators.sql create mode 100644 src/v3/scalars/numeric/numeric_eq_query_functions.sql create mode 100644 src/v3/scalars/numeric/numeric_eq_query_operators.sql create mode 100644 src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/numeric/numeric_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/numeric/numeric_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/numeric/numeric_ord_query_functions.sql create mode 100644 src/v3/scalars/numeric/numeric_ord_query_operators.sql create mode 100644 src/v3/scalars/real/real_eq_query_functions.sql create mode 100644 src/v3/scalars/real/real_eq_query_operators.sql create mode 100644 src/v3/scalars/real/real_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/real/real_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/real/real_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/real/real_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/real/real_ord_query_functions.sql create mode 100644 src/v3/scalars/real/real_ord_query_operators.sql create mode 100644 src/v3/scalars/smallint/smallint_eq_query_functions.sql create mode 100644 src/v3/scalars/smallint/smallint_eq_query_operators.sql create mode 100644 src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/smallint/smallint_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/smallint/smallint_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/smallint/smallint_ord_query_functions.sql create mode 100644 src/v3/scalars/smallint/smallint_ord_query_operators.sql create mode 100644 src/v3/scalars/text/text_eq_query_functions.sql create mode 100644 src/v3/scalars/text/text_eq_query_operators.sql create mode 100644 src/v3/scalars/text/text_match_query_functions.sql create mode 100644 src/v3/scalars/text/text_match_query_operators.sql create mode 100644 src/v3/scalars/text/text_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/text/text_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/text/text_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/text/text_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/text/text_ord_query_functions.sql create mode 100644 src/v3/scalars/text/text_ord_query_operators.sql create mode 100644 src/v3/scalars/text/text_search_query_functions.sql create mode 100644 src/v3/scalars/text/text_search_query_operators.sql create mode 100644 src/v3/scalars/timestamp/timestamp_eq_query_functions.sql create mode 100644 src/v3/scalars/timestamp/timestamp_eq_query_operators.sql create mode 100644 src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql create mode 100644 src/v3/scalars/timestamp/timestamp_ord_ope_query_operators.sql create mode 100644 src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql create mode 100644 src/v3/scalars/timestamp/timestamp_ord_ore_query_operators.sql create mode 100644 src/v3/scalars/timestamp/timestamp_ord_query_functions.sql create mode 100644 src/v3/scalars/timestamp/timestamp_ord_query_operators.sql diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index ff4b56457..7f5b8430f 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -189,6 +189,106 @@ pub fn render_operators_file(family_name: &str, domain: &Domain) -> String { .expect("render operators.sql") } +/// REQUIRE path for a family's _query_types.sql. +fn query_types_path(family_name: &str) -> String { + scalar_path(family_name, &format!("{family_name}_query_types.sql")) +} + +/// Body for a term-bearing domain's _query_functions.sql (CIP-3432): the +/// query-operand extractor OVERLOADS (the same extractors, on +/// `public._query`) plus the comparison WRAPPERS binding the storage +/// domain to its query twin — for the domain's SUPPORTED operators only, in +/// both directions. Reuses the same `functions.sql` template as the storage +/// surface; a query operand carries the same terms, so each wrapper compares +/// `extractor(a)` to `extractor(b)` with no ciphertext cast. +pub fn render_query_functions_file(family_name: &str, domain: &Domain) -> String { + use crate::consts::sql_str; + use crate::context::{ + domain_name, environment, extractor_entry, wrapper_entry, FunctionsContext, + }; + let name = domain.full_name(family_name); + let query_name = format!("{name}_query"); + let storage_dom = domain_name(&name); + let query_dom = domain_name(&query_name); + let supported = Term::operators_for_terms(domain.terms); + + let mut entries = Vec::new(); + // Extractor overloads on the query domain (the template renders `a {{ dom }}` + // with dom = the query domain). + for term in Term::extractor_terms(domain.terms) { + entries.push(extractor_entry(term)); + } + // Comparison wrappers: (storage, query) and its (query, storage) commutator, + // for supported operators only (a query operand is never sent for a blocked + // operator). `is_supported(op) ⟹ extractor_for_operator is Some`. + for op in OPERATORS { + if !supported.contains(&op.symbol) { + continue; + } + let extractor = Term::extractor_for_operator(domain.terms, op.symbol) + .expect("a supported operator resolves an extractor"); + entries.push(wrapper_entry(&query_dom, op, &storage_dom, &query_dom, extractor)); + entries.push(wrapper_entry(&query_dom, op, &query_dom, &storage_dom, extractor)); + } + + let ctx = FunctionsContext { + requires: vec![ + V3_SCHEMA.to_string(), + query_types_path(family_name), + scalar_path(family_name, &format!("{name}_functions.sql")), + ], + family_name: family_name.to_string(), + name: query_name, + domain_lit: sql_str(&query_dom), + dom: query_dom, + entries, + }; + environment() + .get_template("functions.sql") + .unwrap() + .render(&ctx) + .expect("render query functions.sql") +} + +/// Body for a term-bearing domain's _query_operators.sql (CIP-3432): a +/// `CREATE OPERATOR` binding `(storage_domain, _query)` for every +/// supported operator, plus its `(_query, storage_domain)` commutator, so +/// `col $1::public._query` resolves to the query wrapper. +pub fn render_query_operators_file(family_name: &str, domain: &Domain) -> String { + use crate::context::{domain_name, environment, operator_entry, OperatorsContext}; + let name = domain.full_name(family_name); + let query_name = format!("{name}_query"); + let storage_dom = domain_name(&name); + let query_dom = domain_name(&query_name); + let supported = Term::operators_for_terms(domain.terms); + + let mut operators = Vec::new(); + for op in OPERATORS { + if !supported.contains(&op.symbol) { + continue; + } + operators.push(operator_entry(op, &storage_dom, &query_dom, true)); + operators.push(operator_entry(op, &query_dom, &storage_dom, true)); + } + + let ctx = OperatorsContext { + requires: vec![ + V3_SCHEMA.to_string(), + query_types_path(family_name), + scalar_path(family_name, &format!("{query_name}_functions.sql")), + ], + family_name: family_name.to_string(), + name: query_name, + dom: query_dom, + operators, + }; + environment() + .get_template("operators.sql") + .unwrap() + .render(&ctx) + .expect("render query operators.sql") +} + /// Body for a domain's _aggregates.sql, or None if not ord-capable. /// Port of `render_aggregates_file`. pub fn render_aggregates_file(family_name: &str, domain: &Domain) -> Option { @@ -255,6 +355,19 @@ pub fn render_type(spec: &DomainFamily, out_dir: &Path) -> Vec<(PathBuf, String) out_dir.join(format!("{name}_operators.sql")), render_operators_file(family_name, d), )); + // Query-operand surface (CIP-3432): extractor overloads + wrappers + + // operators binding the storage domain to its `_query` twin. Only + // term-bearing domains have a query twin (storage-only = no operators). + if !d.terms.is_empty() { + rendered.push(( + out_dir.join(format!("{name}_query_functions.sql")), + render_query_functions_file(family_name, d), + )); + rendered.push(( + out_dir.join(format!("{name}_query_operators.sql")), + render_query_operators_file(family_name, d), + )); + } if let Some(agg) = render_aggregates_file(family_name, d) { rendered.push((out_dir.join(format!("{name}_aggregates.sql")), agg)); } @@ -436,13 +549,21 @@ mod tests { assert!(names.contains(&format!("{dom}_functions.sql"))); assert!(names.contains(&format!("{dom}_operators.sql"))); } + // Query-operand functions/operators for the term-bearing domains only + // (not the storage-only bare `integer`). + for dom in ["integer_eq", "integer_ord_ore", "integer_ord", "integer_ord_ope"] { + assert!(names.contains(&format!("{dom}_query_functions.sql"))); + assert!(names.contains(&format!("{dom}_query_operators.sql"))); + } + assert!(!names.contains(&"integer_query_functions.sql".to_string())); assert!(!names.contains(&"integer_aggregates.sql".to_string())); assert!(!names.contains(&"integer_eq_aggregates.sql".to_string())); assert!(names.contains(&"integer_ord_ore_aggregates.sql".to_string())); assert!(names.contains(&"integer_ord_aggregates.sql".to_string())); assert!(names.contains(&"integer_ord_ope_aggregates.sql".to_string())); - // 1 types + 1 query_types + 2 per domain (5 domains) + 3 ord-capable aggregates. - assert_eq!(written.len(), 15); + // 1 types + 1 query_types + 2 per domain (5) + 2 query per term-bearing + // domain (4) + 3 ord-capable aggregates = 1+1+10+8+3. + assert_eq!(written.len(), 23); for p in &written { assert!(fs::read_to_string(p) .unwrap() diff --git a/src/v3/scalars/bigint/bigint_eq_query_functions.sql b/src/v3/scalars/bigint/bigint_eq_query_functions.sql new file mode 100644 index 000000000..592d291e0 --- /dev/null +++ b/src/v3/scalars/bigint/bigint_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_eq_functions.sql + +--! @file encrypted_domain/bigint/bigint_eq_query_functions.sql +--! @brief Functions for public.bigint_eq_query. + +--! @brief Index extractor for public.bigint_eq_query. +--! @param a public.bigint_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.bigint_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.bigint_eq_query. +--! @param a public.bigint_eq +--! @param b public.bigint_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b public.bigint_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.bigint_eq_query. +--! @param a public.bigint_eq_query +--! @param b public.bigint_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_eq_query, b public.bigint_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.bigint_eq_query. +--! @param a public.bigint_eq +--! @param b public.bigint_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b public.bigint_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.bigint_eq_query. +--! @param a public.bigint_eq_query +--! @param b public.bigint_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_eq_query, b public.bigint_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_eq_query_operators.sql b/src/v3/scalars/bigint/bigint_eq_query_operators.sql new file mode 100644 index 000000000..2b2e482da --- /dev/null +++ b/src/v3/scalars/bigint/bigint_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_eq_query_functions.sql + +--! @file encrypted_domain/bigint/bigint_eq_query_operators.sql +--! @brief Operators for public.bigint_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_eq_query, RIGHTARG = public.bigint_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_eq_query, RIGHTARG = public.bigint_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql b/src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql new file mode 100644 index 000000000..bfcd81f0c --- /dev/null +++ b/src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_ord_ope_functions.sql + +--! @file encrypted_domain/bigint/bigint_ord_ope_query_functions.sql +--! @brief Functions for public.bigint_ord_ope_query. + +--! @brief Index extractor for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.bigint_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope +--! @param b public.bigint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope_query +--! @param b public.bigint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope +--! @param b public.bigint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope_query +--! @param b public.bigint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope +--! @param b public.bigint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope_query +--! @param b public.bigint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope +--! @param b public.bigint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope_query +--! @param b public.bigint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope +--! @param b public.bigint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope_query +--! @param b public.bigint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope +--! @param b public.bigint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @param a public.bigint_ord_ope_query +--! @param b public.bigint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_ord_ope_query_operators.sql b/src/v3/scalars/bigint/bigint_ord_ope_query_operators.sql new file mode 100644 index 000000000..b0cd809eb --- /dev/null +++ b/src/v3/scalars/bigint/bigint_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql + +--! @file encrypted_domain/bigint/bigint_ord_ope_query_operators.sql +--! @brief Operators for public.bigint_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql b/src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql new file mode 100644 index 000000000..98ab4bc62 --- /dev/null +++ b/src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_ord_ore_functions.sql + +--! @file encrypted_domain/bigint/bigint_ord_ore_query_functions.sql +--! @brief Functions for public.bigint_ord_ore_query. + +--! @brief Index extractor for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore +--! @param b public.bigint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore_query +--! @param b public.bigint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore +--! @param b public.bigint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore_query +--! @param b public.bigint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore +--! @param b public.bigint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore_query +--! @param b public.bigint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore +--! @param b public.bigint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore_query +--! @param b public.bigint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore +--! @param b public.bigint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore_query +--! @param b public.bigint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore +--! @param b public.bigint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @param a public.bigint_ord_ore_query +--! @param b public.bigint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_ord_ore_query_operators.sql b/src/v3/scalars/bigint/bigint_ord_ore_query_operators.sql new file mode 100644 index 000000000..ad938b635 --- /dev/null +++ b/src/v3/scalars/bigint/bigint_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql + +--! @file encrypted_domain/bigint/bigint_ord_ore_query_operators.sql +--! @brief Operators for public.bigint_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/bigint/bigint_ord_query_functions.sql b/src/v3/scalars/bigint/bigint_ord_query_functions.sql new file mode 100644 index 000000000..0f3a31b56 --- /dev/null +++ b/src/v3/scalars/bigint/bigint_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_ord_functions.sql + +--! @file encrypted_domain/bigint/bigint_ord_query_functions.sql +--! @brief Functions for public.bigint_ord_query. + +--! @brief Index extractor for public.bigint_ord_query. +--! @param a public.bigint_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord +--! @param b public.bigint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b public.bigint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord_query +--! @param b public.bigint_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_query, b public.bigint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord +--! @param b public.bigint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b public.bigint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord_query +--! @param b public.bigint_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_query, b public.bigint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord +--! @param b public.bigint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b public.bigint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord_query +--! @param b public.bigint_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_query, b public.bigint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord +--! @param b public.bigint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b public.bigint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord_query +--! @param b public.bigint_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_query, b public.bigint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord +--! @param b public.bigint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b public.bigint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord_query +--! @param b public.bigint_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_query, b public.bigint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord +--! @param b public.bigint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b public.bigint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.bigint_ord_query. +--! @param a public.bigint_ord_query +--! @param b public.bigint_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_query, b public.bigint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_ord_query_operators.sql b/src/v3/scalars/bigint/bigint_ord_query_operators.sql new file mode 100644 index 000000000..eb9e0a3a5 --- /dev/null +++ b/src/v3/scalars/bigint/bigint_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/bigint_ord_query_functions.sql + +--! @file encrypted_domain/bigint/bigint_ord_query_operators.sql +--! @brief Operators for public.bigint_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/date/date_eq_query_functions.sql b/src/v3/scalars/date/date_eq_query_functions.sql new file mode 100644 index 000000000..fd852e89a --- /dev/null +++ b/src/v3/scalars/date/date_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_eq_functions.sql + +--! @file encrypted_domain/date/date_eq_query_functions.sql +--! @brief Functions for public.date_eq_query. + +--! @brief Index extractor for public.date_eq_query. +--! @param a public.date_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.date_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.date_eq_query. +--! @param a public.date_eq +--! @param b public.date_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_eq, b public.date_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.date_eq_query. +--! @param a public.date_eq_query +--! @param b public.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_eq_query, b public.date_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.date_eq_query. +--! @param a public.date_eq +--! @param b public.date_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_eq, b public.date_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.date_eq_query. +--! @param a public.date_eq_query +--! @param b public.date_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_eq_query, b public.date_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/date/date_eq_query_operators.sql b/src/v3/scalars/date/date_eq_query_operators.sql new file mode 100644 index 000000000..00a07f230 --- /dev/null +++ b/src/v3/scalars/date/date_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_eq_query_functions.sql + +--! @file encrypted_domain/date/date_eq_query_operators.sql +--! @brief Operators for public.date_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_eq, RIGHTARG = public.date_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_eq_query, RIGHTARG = public.date_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_eq, RIGHTARG = public.date_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_eq_query, RIGHTARG = public.date_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/date/date_ord_ope_query_functions.sql b/src/v3/scalars/date/date_ord_ope_query_functions.sql new file mode 100644 index 000000000..458e5adc5 --- /dev/null +++ b/src/v3/scalars/date/date_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_ope_functions.sql + +--! @file encrypted_domain/date/date_ord_ope_query_functions.sql +--! @brief Functions for public.date_ord_ope_query. + +--! @brief Index extractor for public.date_ord_ope_query. +--! @param a public.date_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.date_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope +--! @param b public.date_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope_query +--! @param b public.date_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_ord_ope_query, b public.date_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope +--! @param b public.date_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope_query +--! @param b public.date_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_ord_ope_query, b public.date_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope +--! @param b public.date_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope_query +--! @param b public.date_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.date_ord_ope_query, b public.date_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope +--! @param b public.date_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope_query +--! @param b public.date_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.date_ord_ope_query, b public.date_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope +--! @param b public.date_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope_query +--! @param b public.date_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.date_ord_ope_query, b public.date_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope +--! @param b public.date_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ope_query. +--! @param a public.date_ord_ope_query +--! @param b public.date_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.date_ord_ope_query, b public.date_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/date/date_ord_ope_query_operators.sql b/src/v3/scalars/date/date_ord_ope_query_operators.sql new file mode 100644 index 000000000..12648c7ba --- /dev/null +++ b/src/v3/scalars/date/date_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_ope_query_functions.sql + +--! @file encrypted_domain/date/date_ord_ope_query_operators.sql +--! @brief Operators for public.date_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/date/date_ord_ore_query_functions.sql b/src/v3/scalars/date/date_ord_ore_query_functions.sql new file mode 100644 index 000000000..30557d02c --- /dev/null +++ b/src/v3/scalars/date/date_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_ore_functions.sql + +--! @file encrypted_domain/date/date_ord_ore_query_functions.sql +--! @brief Functions for public.date_ord_ore_query. + +--! @brief Index extractor for public.date_ord_ore_query. +--! @param a public.date_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.date_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore +--! @param b public.date_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore_query +--! @param b public.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_ord_ore_query, b public.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore +--! @param b public.date_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore_query +--! @param b public.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_ord_ore_query, b public.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore +--! @param b public.date_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore_query +--! @param b public.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.date_ord_ore_query, b public.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore +--! @param b public.date_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore_query +--! @param b public.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.date_ord_ore_query, b public.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore +--! @param b public.date_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore_query +--! @param b public.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.date_ord_ore_query, b public.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore +--! @param b public.date_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_ore_query. +--! @param a public.date_ord_ore_query +--! @param b public.date_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.date_ord_ore_query, b public.date_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/date/date_ord_ore_query_operators.sql b/src/v3/scalars/date/date_ord_ore_query_operators.sql new file mode 100644 index 000000000..57a711730 --- /dev/null +++ b/src/v3/scalars/date/date_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_ore_query_functions.sql + +--! @file encrypted_domain/date/date_ord_ore_query_operators.sql +--! @brief Operators for public.date_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/date/date_ord_query_functions.sql b/src/v3/scalars/date/date_ord_query_functions.sql new file mode 100644 index 000000000..5802622d2 --- /dev/null +++ b/src/v3/scalars/date/date_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_functions.sql + +--! @file encrypted_domain/date/date_ord_query_functions.sql +--! @brief Functions for public.date_ord_query. + +--! @brief Index extractor for public.date_ord_query. +--! @param a public.date_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.date_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord +--! @param b public.date_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_ord, b public.date_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord_query +--! @param b public.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.date_ord_query, b public.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord +--! @param b public.date_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_ord, b public.date_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord_query +--! @param b public.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.date_ord_query, b public.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord +--! @param b public.date_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.date_ord, b public.date_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord_query +--! @param b public.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.date_ord_query, b public.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord +--! @param b public.date_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.date_ord, b public.date_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord_query +--! @param b public.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.date_ord_query, b public.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord +--! @param b public.date_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.date_ord, b public.date_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord_query +--! @param b public.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.date_ord_query, b public.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord +--! @param b public.date_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.date_ord, b public.date_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.date_ord_query. +--! @param a public.date_ord_query +--! @param b public.date_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.date_ord_query, b public.date_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/date/date_ord_query_operators.sql b/src/v3/scalars/date/date_ord_query_operators.sql new file mode 100644 index 000000000..83f9aa950 --- /dev/null +++ b/src/v3/scalars/date/date_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/date_ord_query_functions.sql + +--! @file encrypted_domain/date/date_ord_query_operators.sql +--! @brief Operators for public.date_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/double/double_eq_query_functions.sql b/src/v3/scalars/double/double_eq_query_functions.sql new file mode 100644 index 000000000..a73af71db --- /dev/null +++ b/src/v3/scalars/double/double_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_eq_functions.sql + +--! @file encrypted_domain/double/double_eq_query_functions.sql +--! @brief Functions for public.double_eq_query. + +--! @brief Index extractor for public.double_eq_query. +--! @param a public.double_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.double_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.double_eq_query. +--! @param a public.double_eq +--! @param b public.double_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_eq, b public.double_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.double_eq_query. +--! @param a public.double_eq_query +--! @param b public.double_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_eq_query, b public.double_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.double_eq_query. +--! @param a public.double_eq +--! @param b public.double_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_eq, b public.double_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.double_eq_query. +--! @param a public.double_eq_query +--! @param b public.double_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_eq_query, b public.double_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/double/double_eq_query_operators.sql b/src/v3/scalars/double/double_eq_query_operators.sql new file mode 100644 index 000000000..33c205ba8 --- /dev/null +++ b/src/v3/scalars/double/double_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_eq_query_functions.sql + +--! @file encrypted_domain/double/double_eq_query_operators.sql +--! @brief Operators for public.double_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_eq, RIGHTARG = public.double_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_eq_query, RIGHTARG = public.double_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_eq, RIGHTARG = public.double_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_eq_query, RIGHTARG = public.double_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/double/double_ord_ope_query_functions.sql b/src/v3/scalars/double/double_ord_ope_query_functions.sql new file mode 100644 index 000000000..6474a7d77 --- /dev/null +++ b/src/v3/scalars/double/double_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_ord_ope_functions.sql + +--! @file encrypted_domain/double/double_ord_ope_query_functions.sql +--! @brief Functions for public.double_ord_ope_query. + +--! @brief Index extractor for public.double_ord_ope_query. +--! @param a public.double_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.double_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope +--! @param b public.double_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope_query +--! @param b public.double_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_ord_ope_query, b public.double_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope +--! @param b public.double_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope_query +--! @param b public.double_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_ord_ope_query, b public.double_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope +--! @param b public.double_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope_query +--! @param b public.double_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.double_ord_ope_query, b public.double_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope +--! @param b public.double_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope_query +--! @param b public.double_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.double_ord_ope_query, b public.double_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope +--! @param b public.double_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope_query +--! @param b public.double_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.double_ord_ope_query, b public.double_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope +--! @param b public.double_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ope_query. +--! @param a public.double_ord_ope_query +--! @param b public.double_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.double_ord_ope_query, b public.double_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/double/double_ord_ope_query_operators.sql b/src/v3/scalars/double/double_ord_ope_query_operators.sql new file mode 100644 index 000000000..73c7adb31 --- /dev/null +++ b/src/v3/scalars/double/double_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_ord_ope_query_functions.sql + +--! @file encrypted_domain/double/double_ord_ope_query_operators.sql +--! @brief Operators for public.double_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/double/double_ord_ore_query_functions.sql b/src/v3/scalars/double/double_ord_ore_query_functions.sql new file mode 100644 index 000000000..372d0d0b8 --- /dev/null +++ b/src/v3/scalars/double/double_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_ord_ore_functions.sql + +--! @file encrypted_domain/double/double_ord_ore_query_functions.sql +--! @brief Functions for public.double_ord_ore_query. + +--! @brief Index extractor for public.double_ord_ore_query. +--! @param a public.double_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.double_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore +--! @param b public.double_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore_query +--! @param b public.double_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_ord_ore_query, b public.double_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore +--! @param b public.double_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore_query +--! @param b public.double_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_ord_ore_query, b public.double_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore +--! @param b public.double_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore_query +--! @param b public.double_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.double_ord_ore_query, b public.double_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore +--! @param b public.double_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore_query +--! @param b public.double_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.double_ord_ore_query, b public.double_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore +--! @param b public.double_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore_query +--! @param b public.double_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.double_ord_ore_query, b public.double_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore +--! @param b public.double_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_ore_query. +--! @param a public.double_ord_ore_query +--! @param b public.double_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.double_ord_ore_query, b public.double_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/double/double_ord_ore_query_operators.sql b/src/v3/scalars/double/double_ord_ore_query_operators.sql new file mode 100644 index 000000000..3fcf71a85 --- /dev/null +++ b/src/v3/scalars/double/double_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_ord_ore_query_functions.sql + +--! @file encrypted_domain/double/double_ord_ore_query_operators.sql +--! @brief Operators for public.double_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/double/double_ord_query_functions.sql b/src/v3/scalars/double/double_ord_query_functions.sql new file mode 100644 index 000000000..8096cb985 --- /dev/null +++ b/src/v3/scalars/double/double_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_ord_functions.sql + +--! @file encrypted_domain/double/double_ord_query_functions.sql +--! @brief Functions for public.double_ord_query. + +--! @brief Index extractor for public.double_ord_query. +--! @param a public.double_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.double_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord +--! @param b public.double_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_ord, b public.double_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord_query +--! @param b public.double_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.double_ord_query, b public.double_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord +--! @param b public.double_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_ord, b public.double_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord_query +--! @param b public.double_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.double_ord_query, b public.double_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord +--! @param b public.double_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.double_ord, b public.double_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord_query +--! @param b public.double_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.double_ord_query, b public.double_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord +--! @param b public.double_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.double_ord, b public.double_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord_query +--! @param b public.double_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.double_ord_query, b public.double_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord +--! @param b public.double_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.double_ord, b public.double_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord_query +--! @param b public.double_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.double_ord_query, b public.double_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord +--! @param b public.double_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.double_ord, b public.double_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.double_ord_query. +--! @param a public.double_ord_query +--! @param b public.double_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.double_ord_query, b public.double_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/double/double_ord_query_operators.sql b/src/v3/scalars/double/double_ord_query_operators.sql new file mode 100644 index 000000000..ebf23083d --- /dev/null +++ b/src/v3/scalars/double/double_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/double_ord_query_functions.sql + +--! @file encrypted_domain/double/double_ord_query_operators.sql +--! @brief Operators for public.double_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/integer/integer_eq_query_functions.sql b/src/v3/scalars/integer/integer_eq_query_functions.sql new file mode 100644 index 000000000..b6443c1ba --- /dev/null +++ b/src/v3/scalars/integer/integer_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_eq_functions.sql + +--! @file encrypted_domain/integer/integer_eq_query_functions.sql +--! @brief Functions for public.integer_eq_query. + +--! @brief Index extractor for public.integer_eq_query. +--! @param a public.integer_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.integer_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.integer_eq_query. +--! @param a public.integer_eq +--! @param b public.integer_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.integer_eq_query. +--! @param a public.integer_eq_query +--! @param b public.integer_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_eq_query, b public.integer_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.integer_eq_query. +--! @param a public.integer_eq +--! @param b public.integer_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_eq, b public.integer_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.integer_eq_query. +--! @param a public.integer_eq_query +--! @param b public.integer_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_eq_query, b public.integer_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/integer/integer_eq_query_operators.sql b/src/v3/scalars/integer/integer_eq_query_operators.sql new file mode 100644 index 000000000..e2bdc0aa9 --- /dev/null +++ b/src/v3/scalars/integer/integer_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_eq_query_functions.sql + +--! @file encrypted_domain/integer/integer_eq_query_operators.sql +--! @brief Operators for public.integer_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_eq_query, RIGHTARG = public.integer_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_eq_query, RIGHTARG = public.integer_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/integer/integer_ord_ope_query_functions.sql b/src/v3/scalars/integer/integer_ord_ope_query_functions.sql new file mode 100644 index 000000000..292ccce18 --- /dev/null +++ b/src/v3/scalars/integer/integer_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_ord_ope_functions.sql + +--! @file encrypted_domain/integer/integer_ord_ope_query_functions.sql +--! @brief Functions for public.integer_ord_ope_query. + +--! @brief Index extractor for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.integer_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope +--! @param b public.integer_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope_query +--! @param b public.integer_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope_query, b public.integer_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope +--! @param b public.integer_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope_query +--! @param b public.integer_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope_query, b public.integer_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope +--! @param b public.integer_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope_query +--! @param b public.integer_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope_query, b public.integer_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope +--! @param b public.integer_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope_query +--! @param b public.integer_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope_query, b public.integer_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope +--! @param b public.integer_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope_query +--! @param b public.integer_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope_query, b public.integer_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope +--! @param b public.integer_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ope_query. +--! @param a public.integer_ord_ope_query +--! @param b public.integer_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope_query, b public.integer_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/integer/integer_ord_ope_query_operators.sql b/src/v3/scalars/integer/integer_ord_ope_query_operators.sql new file mode 100644 index 000000000..083420371 --- /dev/null +++ b/src/v3/scalars/integer/integer_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_ord_ope_query_functions.sql + +--! @file encrypted_domain/integer/integer_ord_ope_query_operators.sql +--! @brief Operators for public.integer_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/integer/integer_ord_ore_query_functions.sql b/src/v3/scalars/integer/integer_ord_ore_query_functions.sql new file mode 100644 index 000000000..288a77dea --- /dev/null +++ b/src/v3/scalars/integer/integer_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_ord_ore_functions.sql + +--! @file encrypted_domain/integer/integer_ord_ore_query_functions.sql +--! @brief Functions for public.integer_ord_ore_query. + +--! @brief Index extractor for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.integer_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore +--! @param b public.integer_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore_query +--! @param b public.integer_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore_query, b public.integer_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore +--! @param b public.integer_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore_query +--! @param b public.integer_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore_query, b public.integer_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore +--! @param b public.integer_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore_query +--! @param b public.integer_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore_query, b public.integer_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore +--! @param b public.integer_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore_query +--! @param b public.integer_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore_query, b public.integer_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore +--! @param b public.integer_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore_query +--! @param b public.integer_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore_query, b public.integer_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore +--! @param b public.integer_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_ore_query. +--! @param a public.integer_ord_ore_query +--! @param b public.integer_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore_query, b public.integer_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/integer/integer_ord_ore_query_operators.sql b/src/v3/scalars/integer/integer_ord_ore_query_operators.sql new file mode 100644 index 000000000..1646eb223 --- /dev/null +++ b/src/v3/scalars/integer/integer_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_ord_ore_query_functions.sql + +--! @file encrypted_domain/integer/integer_ord_ore_query_operators.sql +--! @brief Operators for public.integer_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/integer/integer_ord_query_functions.sql b/src/v3/scalars/integer/integer_ord_query_functions.sql new file mode 100644 index 000000000..1aa56ca0a --- /dev/null +++ b/src/v3/scalars/integer/integer_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_ord_functions.sql + +--! @file encrypted_domain/integer/integer_ord_query_functions.sql +--! @brief Functions for public.integer_ord_query. + +--! @brief Index extractor for public.integer_ord_query. +--! @param a public.integer_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.integer_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord +--! @param b public.integer_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_ord, b public.integer_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord_query +--! @param b public.integer_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.integer_ord_query, b public.integer_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord +--! @param b public.integer_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_ord, b public.integer_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord_query +--! @param b public.integer_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.integer_ord_query, b public.integer_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord +--! @param b public.integer_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.integer_ord, b public.integer_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord_query +--! @param b public.integer_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.integer_ord_query, b public.integer_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord +--! @param b public.integer_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.integer_ord, b public.integer_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord_query +--! @param b public.integer_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.integer_ord_query, b public.integer_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord +--! @param b public.integer_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.integer_ord, b public.integer_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord_query +--! @param b public.integer_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.integer_ord_query, b public.integer_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord +--! @param b public.integer_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.integer_ord, b public.integer_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.integer_ord_query. +--! @param a public.integer_ord_query +--! @param b public.integer_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.integer_ord_query, b public.integer_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/integer/integer_ord_query_operators.sql b/src/v3/scalars/integer/integer_ord_query_operators.sql new file mode 100644 index 000000000..b3d7888d5 --- /dev/null +++ b/src/v3/scalars/integer/integer_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/integer_ord_query_functions.sql + +--! @file encrypted_domain/integer/integer_ord_query_operators.sql +--! @brief Operators for public.integer_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/numeric/numeric_eq_query_functions.sql b/src/v3/scalars/numeric/numeric_eq_query_functions.sql new file mode 100644 index 000000000..a94e23f3d --- /dev/null +++ b/src/v3/scalars/numeric/numeric_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_eq_functions.sql + +--! @file encrypted_domain/numeric/numeric_eq_query_functions.sql +--! @brief Functions for public.numeric_eq_query. + +--! @brief Index extractor for public.numeric_eq_query. +--! @param a public.numeric_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.numeric_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.numeric_eq_query. +--! @param a public.numeric_eq +--! @param b public.numeric_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b public.numeric_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.numeric_eq_query. +--! @param a public.numeric_eq_query +--! @param b public.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_eq_query, b public.numeric_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.numeric_eq_query. +--! @param a public.numeric_eq +--! @param b public.numeric_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b public.numeric_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.numeric_eq_query. +--! @param a public.numeric_eq_query +--! @param b public.numeric_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_eq_query, b public.numeric_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_eq_query_operators.sql b/src/v3/scalars/numeric/numeric_eq_query_operators.sql new file mode 100644 index 000000000..c0a27401b --- /dev/null +++ b/src/v3/scalars/numeric/numeric_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_eq_query_functions.sql + +--! @file encrypted_domain/numeric/numeric_eq_query_operators.sql +--! @brief Operators for public.numeric_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_eq_query, RIGHTARG = public.numeric_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_eq_query, RIGHTARG = public.numeric_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql b/src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql new file mode 100644 index 000000000..51ee095ce --- /dev/null +++ b/src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_ope_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_ope_query_functions.sql +--! @brief Functions for public.numeric_ord_ope_query. + +--! @brief Index extractor for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.numeric_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope +--! @param b public.numeric_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope_query +--! @param b public.numeric_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope +--! @param b public.numeric_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope_query +--! @param b public.numeric_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope +--! @param b public.numeric_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope_query +--! @param b public.numeric_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope +--! @param b public.numeric_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope_query +--! @param b public.numeric_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope +--! @param b public.numeric_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope_query +--! @param b public.numeric_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope +--! @param b public.numeric_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @param a public.numeric_ord_ope_query +--! @param b public.numeric_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_ord_ope_query_operators.sql b/src/v3/scalars/numeric/numeric_ord_ope_query_operators.sql new file mode 100644 index 000000000..bf609f805 --- /dev/null +++ b/src/v3/scalars/numeric/numeric_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_ope_query_operators.sql +--! @brief Operators for public.numeric_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql b/src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql new file mode 100644 index 000000000..d317895d8 --- /dev/null +++ b/src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_ore_query_functions.sql +--! @brief Functions for public.numeric_ord_ore_query. + +--! @brief Index extractor for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore +--! @param b public.numeric_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore_query +--! @param b public.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore +--! @param b public.numeric_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore_query +--! @param b public.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore +--! @param b public.numeric_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore_query +--! @param b public.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore +--! @param b public.numeric_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore_query +--! @param b public.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore +--! @param b public.numeric_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore_query +--! @param b public.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore +--! @param b public.numeric_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @param a public.numeric_ord_ore_query +--! @param b public.numeric_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_ord_ore_query_operators.sql b/src/v3/scalars/numeric/numeric_ord_ore_query_operators.sql new file mode 100644 index 000000000..aef45def1 --- /dev/null +++ b/src/v3/scalars/numeric/numeric_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_ore_query_operators.sql +--! @brief Operators for public.numeric_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/numeric/numeric_ord_query_functions.sql b/src/v3/scalars/numeric/numeric_ord_query_functions.sql new file mode 100644 index 000000000..f88fd2cf4 --- /dev/null +++ b/src/v3/scalars/numeric/numeric_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_query_functions.sql +--! @brief Functions for public.numeric_ord_query. + +--! @brief Index extractor for public.numeric_ord_query. +--! @param a public.numeric_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord +--! @param b public.numeric_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b public.numeric_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord_query +--! @param b public.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_query, b public.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord +--! @param b public.numeric_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b public.numeric_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord_query +--! @param b public.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_query, b public.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord +--! @param b public.numeric_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b public.numeric_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord_query +--! @param b public.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_query, b public.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord +--! @param b public.numeric_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b public.numeric_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord_query +--! @param b public.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_query, b public.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord +--! @param b public.numeric_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b public.numeric_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord_query +--! @param b public.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_query, b public.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord +--! @param b public.numeric_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b public.numeric_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.numeric_ord_query. +--! @param a public.numeric_ord_query +--! @param b public.numeric_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_query, b public.numeric_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_ord_query_operators.sql b/src/v3/scalars/numeric/numeric_ord_query_operators.sql new file mode 100644 index 000000000..e16290705 --- /dev/null +++ b/src/v3/scalars/numeric/numeric_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/numeric_ord_query_functions.sql + +--! @file encrypted_domain/numeric/numeric_ord_query_operators.sql +--! @brief Operators for public.numeric_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/real/real_eq_query_functions.sql b/src/v3/scalars/real/real_eq_query_functions.sql new file mode 100644 index 000000000..2413a984b --- /dev/null +++ b/src/v3/scalars/real/real_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_eq_functions.sql + +--! @file encrypted_domain/real/real_eq_query_functions.sql +--! @brief Functions for public.real_eq_query. + +--! @brief Index extractor for public.real_eq_query. +--! @param a public.real_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.real_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.real_eq_query. +--! @param a public.real_eq +--! @param b public.real_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_eq, b public.real_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.real_eq_query. +--! @param a public.real_eq_query +--! @param b public.real_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_eq_query, b public.real_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.real_eq_query. +--! @param a public.real_eq +--! @param b public.real_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_eq, b public.real_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.real_eq_query. +--! @param a public.real_eq_query +--! @param b public.real_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_eq_query, b public.real_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/real/real_eq_query_operators.sql b/src/v3/scalars/real/real_eq_query_operators.sql new file mode 100644 index 000000000..51dadf82f --- /dev/null +++ b/src/v3/scalars/real/real_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_eq_query_functions.sql + +--! @file encrypted_domain/real/real_eq_query_operators.sql +--! @brief Operators for public.real_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_eq, RIGHTARG = public.real_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_eq_query, RIGHTARG = public.real_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_eq, RIGHTARG = public.real_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_eq_query, RIGHTARG = public.real_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/real/real_ord_ope_query_functions.sql b/src/v3/scalars/real/real_ord_ope_query_functions.sql new file mode 100644 index 000000000..b26b34d82 --- /dev/null +++ b/src/v3/scalars/real/real_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_ord_ope_functions.sql + +--! @file encrypted_domain/real/real_ord_ope_query_functions.sql +--! @brief Functions for public.real_ord_ope_query. + +--! @brief Index extractor for public.real_ord_ope_query. +--! @param a public.real_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.real_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope +--! @param b public.real_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope_query +--! @param b public.real_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_ord_ope_query, b public.real_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope +--! @param b public.real_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope_query +--! @param b public.real_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_ord_ope_query, b public.real_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope +--! @param b public.real_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope_query +--! @param b public.real_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.real_ord_ope_query, b public.real_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope +--! @param b public.real_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope_query +--! @param b public.real_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.real_ord_ope_query, b public.real_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope +--! @param b public.real_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope_query +--! @param b public.real_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.real_ord_ope_query, b public.real_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope +--! @param b public.real_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ope_query. +--! @param a public.real_ord_ope_query +--! @param b public.real_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.real_ord_ope_query, b public.real_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/real/real_ord_ope_query_operators.sql b/src/v3/scalars/real/real_ord_ope_query_operators.sql new file mode 100644 index 000000000..2df12e8f2 --- /dev/null +++ b/src/v3/scalars/real/real_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_ord_ope_query_functions.sql + +--! @file encrypted_domain/real/real_ord_ope_query_operators.sql +--! @brief Operators for public.real_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/real/real_ord_ore_query_functions.sql b/src/v3/scalars/real/real_ord_ore_query_functions.sql new file mode 100644 index 000000000..3ca14a58e --- /dev/null +++ b/src/v3/scalars/real/real_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_ord_ore_functions.sql + +--! @file encrypted_domain/real/real_ord_ore_query_functions.sql +--! @brief Functions for public.real_ord_ore_query. + +--! @brief Index extractor for public.real_ord_ore_query. +--! @param a public.real_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.real_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore +--! @param b public.real_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore_query +--! @param b public.real_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_ord_ore_query, b public.real_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore +--! @param b public.real_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore_query +--! @param b public.real_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_ord_ore_query, b public.real_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore +--! @param b public.real_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore_query +--! @param b public.real_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.real_ord_ore_query, b public.real_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore +--! @param b public.real_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore_query +--! @param b public.real_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.real_ord_ore_query, b public.real_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore +--! @param b public.real_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore_query +--! @param b public.real_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.real_ord_ore_query, b public.real_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore +--! @param b public.real_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_ore_query. +--! @param a public.real_ord_ore_query +--! @param b public.real_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.real_ord_ore_query, b public.real_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/real/real_ord_ore_query_operators.sql b/src/v3/scalars/real/real_ord_ore_query_operators.sql new file mode 100644 index 000000000..16c10fa38 --- /dev/null +++ b/src/v3/scalars/real/real_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_ord_ore_query_functions.sql + +--! @file encrypted_domain/real/real_ord_ore_query_operators.sql +--! @brief Operators for public.real_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/real/real_ord_query_functions.sql b/src/v3/scalars/real/real_ord_query_functions.sql new file mode 100644 index 000000000..b1dc852dc --- /dev/null +++ b/src/v3/scalars/real/real_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_ord_functions.sql + +--! @file encrypted_domain/real/real_ord_query_functions.sql +--! @brief Functions for public.real_ord_query. + +--! @brief Index extractor for public.real_ord_query. +--! @param a public.real_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.real_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord +--! @param b public.real_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_ord, b public.real_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord_query +--! @param b public.real_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.real_ord_query, b public.real_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord +--! @param b public.real_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_ord, b public.real_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord_query +--! @param b public.real_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.real_ord_query, b public.real_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord +--! @param b public.real_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.real_ord, b public.real_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord_query +--! @param b public.real_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.real_ord_query, b public.real_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord +--! @param b public.real_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.real_ord, b public.real_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord_query +--! @param b public.real_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.real_ord_query, b public.real_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord +--! @param b public.real_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.real_ord, b public.real_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord_query +--! @param b public.real_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.real_ord_query, b public.real_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord +--! @param b public.real_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.real_ord, b public.real_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.real_ord_query. +--! @param a public.real_ord_query +--! @param b public.real_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.real_ord_query, b public.real_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/real/real_ord_query_operators.sql b/src/v3/scalars/real/real_ord_query_operators.sql new file mode 100644 index 000000000..c8e1230c4 --- /dev/null +++ b/src/v3/scalars/real/real_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/real_ord_query_functions.sql + +--! @file encrypted_domain/real/real_ord_query_operators.sql +--! @brief Operators for public.real_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/smallint/smallint_eq_query_functions.sql b/src/v3/scalars/smallint/smallint_eq_query_functions.sql new file mode 100644 index 000000000..609f8ad8a --- /dev/null +++ b/src/v3/scalars/smallint/smallint_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_eq_functions.sql + +--! @file encrypted_domain/smallint/smallint_eq_query_functions.sql +--! @brief Functions for public.smallint_eq_query. + +--! @brief Index extractor for public.smallint_eq_query. +--! @param a public.smallint_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.smallint_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.smallint_eq_query. +--! @param a public.smallint_eq +--! @param b public.smallint_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b public.smallint_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.smallint_eq_query. +--! @param a public.smallint_eq_query +--! @param b public.smallint_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_eq_query, b public.smallint_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.smallint_eq_query. +--! @param a public.smallint_eq +--! @param b public.smallint_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b public.smallint_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.smallint_eq_query. +--! @param a public.smallint_eq_query +--! @param b public.smallint_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_eq_query, b public.smallint_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_eq_query_operators.sql b/src/v3/scalars/smallint/smallint_eq_query_operators.sql new file mode 100644 index 000000000..c2324c77e --- /dev/null +++ b/src/v3/scalars/smallint/smallint_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_eq_query_functions.sql + +--! @file encrypted_domain/smallint/smallint_eq_query_operators.sql +--! @brief Operators for public.smallint_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_eq_query, RIGHTARG = public.smallint_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_eq_query, RIGHTARG = public.smallint_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql b/src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql new file mode 100644 index 000000000..0d023bb8d --- /dev/null +++ b/src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_ord_ope_functions.sql + +--! @file encrypted_domain/smallint/smallint_ord_ope_query_functions.sql +--! @brief Functions for public.smallint_ord_ope_query. + +--! @brief Index extractor for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.smallint_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope +--! @param b public.smallint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope_query +--! @param b public.smallint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope +--! @param b public.smallint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope_query +--! @param b public.smallint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope +--! @param b public.smallint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope_query +--! @param b public.smallint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope +--! @param b public.smallint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope_query +--! @param b public.smallint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope +--! @param b public.smallint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope_query +--! @param b public.smallint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope +--! @param b public.smallint_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @param a public.smallint_ord_ope_query +--! @param b public.smallint_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_ord_ope_query_operators.sql b/src/v3/scalars/smallint/smallint_ord_ope_query_operators.sql new file mode 100644 index 000000000..1fd9a7081 --- /dev/null +++ b/src/v3/scalars/smallint/smallint_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql + +--! @file encrypted_domain/smallint/smallint_ord_ope_query_operators.sql +--! @brief Operators for public.smallint_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql b/src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql new file mode 100644 index 000000000..5d30b06dc --- /dev/null +++ b/src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_ord_ore_functions.sql + +--! @file encrypted_domain/smallint/smallint_ord_ore_query_functions.sql +--! @brief Functions for public.smallint_ord_ore_query. + +--! @brief Index extractor for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore +--! @param b public.smallint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore_query +--! @param b public.smallint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore +--! @param b public.smallint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore_query +--! @param b public.smallint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore +--! @param b public.smallint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore_query +--! @param b public.smallint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore +--! @param b public.smallint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore_query +--! @param b public.smallint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore +--! @param b public.smallint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore_query +--! @param b public.smallint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore +--! @param b public.smallint_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @param a public.smallint_ord_ore_query +--! @param b public.smallint_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_ord_ore_query_operators.sql b/src/v3/scalars/smallint/smallint_ord_ore_query_operators.sql new file mode 100644 index 000000000..4536a5a26 --- /dev/null +++ b/src/v3/scalars/smallint/smallint_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql + +--! @file encrypted_domain/smallint/smallint_ord_ore_query_operators.sql +--! @brief Operators for public.smallint_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/smallint/smallint_ord_query_functions.sql b/src/v3/scalars/smallint/smallint_ord_query_functions.sql new file mode 100644 index 000000000..22593c6be --- /dev/null +++ b/src/v3/scalars/smallint/smallint_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_ord_functions.sql + +--! @file encrypted_domain/smallint/smallint_ord_query_functions.sql +--! @brief Functions for public.smallint_ord_query. + +--! @brief Index extractor for public.smallint_ord_query. +--! @param a public.smallint_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord +--! @param b public.smallint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b public.smallint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord_query +--! @param b public.smallint_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_query, b public.smallint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord +--! @param b public.smallint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b public.smallint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord_query +--! @param b public.smallint_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_query, b public.smallint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord +--! @param b public.smallint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b public.smallint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord_query +--! @param b public.smallint_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_query, b public.smallint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord +--! @param b public.smallint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b public.smallint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord_query +--! @param b public.smallint_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_query, b public.smallint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord +--! @param b public.smallint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b public.smallint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord_query +--! @param b public.smallint_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_query, b public.smallint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord +--! @param b public.smallint_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b public.smallint_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.smallint_ord_query. +--! @param a public.smallint_ord_query +--! @param b public.smallint_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_query, b public.smallint_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_ord_query_operators.sql b/src/v3/scalars/smallint/smallint_ord_query_operators.sql new file mode 100644 index 000000000..3f3844135 --- /dev/null +++ b/src/v3/scalars/smallint/smallint_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/smallint_ord_query_functions.sql + +--! @file encrypted_domain/smallint/smallint_ord_query_operators.sql +--! @brief Operators for public.smallint_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/text/text_eq_query_functions.sql b/src/v3/scalars/text/text_eq_query_functions.sql new file mode 100644 index 000000000..783a32ab1 --- /dev/null +++ b/src/v3/scalars/text/text_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_eq_functions.sql + +--! @file encrypted_domain/text/text_eq_query_functions.sql +--! @brief Functions for public.text_eq_query. + +--! @brief Index extractor for public.text_eq_query. +--! @param a public.text_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.text_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.text_eq_query. +--! @param a public.text_eq +--! @param b public.text_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_eq, b public.text_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_eq_query. +--! @param a public.text_eq_query +--! @param b public.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_eq_query, b public.text_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_eq_query. +--! @param a public.text_eq +--! @param b public.text_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_eq, b public.text_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_eq_query. +--! @param a public.text_eq_query +--! @param b public.text_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_eq_query, b public.text_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/text/text_eq_query_operators.sql b/src/v3/scalars/text/text_eq_query_operators.sql new file mode 100644 index 000000000..7fd1b6b6c --- /dev/null +++ b/src/v3/scalars/text/text_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_eq_query_functions.sql + +--! @file encrypted_domain/text/text_eq_query_operators.sql +--! @brief Operators for public.text_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_eq, RIGHTARG = public.text_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_eq_query, RIGHTARG = public.text_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_eq, RIGHTARG = public.text_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_eq_query, RIGHTARG = public.text_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/text/text_match_query_functions.sql b/src/v3/scalars/text/text_match_query_functions.sql new file mode 100644 index 000000000..c94726fd6 --- /dev/null +++ b/src/v3/scalars/text/text_match_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_match_functions.sql + +--! @file encrypted_domain/text/text_match_query_functions.sql +--! @brief Functions for public.text_match_query. + +--! @brief Index extractor for public.text_match_query. +--! @param a public.text_match_query +--! @return eql_v3_internal.bloom_filter +CREATE FUNCTION eql_v3.match_term(a public.text_match_query) +RETURNS eql_v3_internal.bloom_filter +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$; + +--! @brief Operator wrapper for public.text_match_query. +--! @param a public.text_match +--! @param b public.text_match_query +--! @return boolean +CREATE FUNCTION eql_v3.contains(a public.text_match, b public.text_match_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for public.text_match_query. +--! @param a public.text_match_query +--! @param b public.text_match +--! @return boolean +CREATE FUNCTION eql_v3.contains(a public.text_match_query, b public.text_match) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for public.text_match_query. +--! @param a public.text_match +--! @param b public.text_match_query +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a public.text_match, b public.text_match_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for public.text_match_query. +--! @param a public.text_match_query +--! @param b public.text_match +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a public.text_match_query, b public.text_match) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; diff --git a/src/v3/scalars/text/text_match_query_operators.sql b/src/v3/scalars/text/text_match_query_operators.sql new file mode 100644 index 000000000..713df68ea --- /dev/null +++ b/src/v3/scalars/text/text_match_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_match_query_functions.sql + +--! @file encrypted_domain/text/text_match_query_operators.sql +--! @brief Operators for public.text_match_query. + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = public.text_match, RIGHTARG = public.text_match_query, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = public.text_match_query, RIGHTARG = public.text_match, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = public.text_match, RIGHTARG = public.text_match_query, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = public.text_match_query, RIGHTARG = public.text_match, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); diff --git a/src/v3/scalars/text/text_ord_ope_query_functions.sql b/src/v3/scalars/text/text_ord_ope_query_functions.sql new file mode 100644 index 000000000..0cb386234 --- /dev/null +++ b/src/v3/scalars/text/text_ord_ope_query_functions.sql @@ -0,0 +1,119 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_ope_functions.sql + +--! @file encrypted_domain/text/text_ord_ope_query_functions.sql +--! @brief Functions for public.text_ord_ope_query. + +--! @brief Index extractor for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ope_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Index extractor for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.text_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope +--! @param b public.text_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @param b public.text_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_ord_ope_query, b public.text_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope +--! @param b public.text_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @param b public.text_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_ord_ope_query, b public.text_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope +--! @param b public.text_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @param b public.text_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_ord_ope_query, b public.text_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope +--! @param b public.text_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @param b public.text_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_ord_ope_query, b public.text_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope +--! @param b public.text_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @param b public.text_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_ord_ope_query, b public.text_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope +--! @param b public.text_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ope_query. +--! @param a public.text_ord_ope_query +--! @param b public.text_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_ord_ope_query, b public.text_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/text/text_ord_ope_query_operators.sql b/src/v3/scalars/text/text_ord_ope_query_operators.sql new file mode 100644 index 000000000..7fe4bcf70 --- /dev/null +++ b/src/v3/scalars/text/text_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_ope_query_functions.sql + +--! @file encrypted_domain/text/text_ord_ope_query_operators.sql +--! @brief Operators for public.text_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/text/text_ord_ore_query_functions.sql b/src/v3/scalars/text/text_ord_ore_query_functions.sql new file mode 100644 index 000000000..483056931 --- /dev/null +++ b/src/v3/scalars/text/text_ord_ore_query_functions.sql @@ -0,0 +1,119 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_ore_functions.sql + +--! @file encrypted_domain/text/text_ord_ore_query_functions.sql +--! @brief Functions for public.text_ord_ore_query. + +--! @brief Index extractor for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ore_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Index extractor for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.text_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore +--! @param b public.text_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @param b public.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_ord_ore_query, b public.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore +--! @param b public.text_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @param b public.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_ord_ore_query, b public.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore +--! @param b public.text_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @param b public.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_ord_ore_query, b public.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore +--! @param b public.text_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @param b public.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_ord_ore_query, b public.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore +--! @param b public.text_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @param b public.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_ord_ore_query, b public.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore +--! @param b public.text_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_ore_query. +--! @param a public.text_ord_ore_query +--! @param b public.text_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_ord_ore_query, b public.text_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/text/text_ord_ore_query_operators.sql b/src/v3/scalars/text/text_ord_ore_query_operators.sql new file mode 100644 index 000000000..0cce1e386 --- /dev/null +++ b/src/v3/scalars/text/text_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_ore_query_functions.sql + +--! @file encrypted_domain/text/text_ord_ore_query_operators.sql +--! @brief Operators for public.text_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/text/text_ord_query_functions.sql b/src/v3/scalars/text/text_ord_query_functions.sql new file mode 100644 index 000000000..abb9b0c56 --- /dev/null +++ b/src/v3/scalars/text/text_ord_query_functions.sql @@ -0,0 +1,119 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_functions.sql + +--! @file encrypted_domain/text/text_ord_query_functions.sql +--! @brief Functions for public.text_ord_query. + +--! @brief Index extractor for public.text_ord_query. +--! @param a public.text_ord_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.text_ord_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Index extractor for public.text_ord_query. +--! @param a public.text_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.text_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord +--! @param b public.text_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_ord, b public.text_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord_query +--! @param b public.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_ord_query, b public.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord +--! @param b public.text_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_ord, b public.text_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord_query +--! @param b public.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_ord_query, b public.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord +--! @param b public.text_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_ord, b public.text_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord_query +--! @param b public.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_ord_query, b public.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord +--! @param b public.text_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_ord, b public.text_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord_query +--! @param b public.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_ord_query, b public.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord +--! @param b public.text_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_ord, b public.text_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord_query +--! @param b public.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_ord_query, b public.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord +--! @param b public.text_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_ord, b public.text_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_ord_query. +--! @param a public.text_ord_query +--! @param b public.text_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_ord_query, b public.text_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/text/text_ord_query_operators.sql b/src/v3/scalars/text/text_ord_query_operators.sql new file mode 100644 index 000000000..5cd8721ed --- /dev/null +++ b/src/v3/scalars/text/text_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_ord_query_functions.sql + +--! @file encrypted_domain/text/text_ord_query_operators.sql +--! @brief Operators for public.text_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/text/text_search_query_functions.sql b/src/v3/scalars/text/text_search_query_functions.sql new file mode 100644 index 000000000..d6830b778 --- /dev/null +++ b/src/v3/scalars/text/text_search_query_functions.sql @@ -0,0 +1,159 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_search_functions.sql + +--! @file encrypted_domain/text/text_search_query_functions.sql +--! @brief Functions for public.text_search_query. + +--! @brief Index extractor for public.text_search_query. +--! @param a public.text_search_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.text_search_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Index extractor for public.text_search_query. +--! @param a public.text_search_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.text_search_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Index extractor for public.text_search_query. +--! @param a public.text_search_query +--! @return eql_v3_internal.bloom_filter +CREATE FUNCTION eql_v3.match_term(a public.text_search_query) +RETURNS eql_v3_internal.bloom_filter +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.contains(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.contains(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search +--! @param b public.text_search_query +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a public.text_search, b public.text_search_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; + +--! @brief Operator wrapper for public.text_search_query. +--! @param a public.text_search_query +--! @param b public.text_search +--! @return boolean +CREATE FUNCTION eql_v3.contained_by(a public.text_search_query, b public.text_search) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; diff --git a/src/v3/scalars/text/text_search_query_operators.sql b/src/v3/scalars/text/text_search_query_operators.sql new file mode 100644 index 000000000..47e58fbff --- /dev/null +++ b/src/v3/scalars/text/text_search_query_operators.sql @@ -0,0 +1,103 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/text_search_query_functions.sql + +--! @file encrypted_domain/text/text_search_query_operators.sql +--! @brief Operators for public.text_search_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR @> ( + FUNCTION = eql_v3.contains, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); + +CREATE OPERATOR <@ ( + FUNCTION = eql_v3.contained_by, + LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel +); diff --git a/src/v3/scalars/timestamp/timestamp_eq_query_functions.sql b/src/v3/scalars/timestamp/timestamp_eq_query_functions.sql new file mode 100644 index 000000000..1c0c2af22 --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_eq_query_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_eq_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_eq_query_functions.sql +--! @brief Functions for public.timestamp_eq_query. + +--! @brief Index extractor for public.timestamp_eq_query. +--! @param a public.timestamp_eq_query +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.timestamp_eq_query) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.timestamp_eq_query. +--! @param a public.timestamp_eq +--! @param b public.timestamp_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_eq_query. +--! @param a public.timestamp_eq_query +--! @param b public.timestamp_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_eq_query, b public.timestamp_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_eq_query. +--! @param a public.timestamp_eq +--! @param b public.timestamp_eq_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_eq_query. +--! @param a public.timestamp_eq_query +--! @param b public.timestamp_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_eq_query, b public.timestamp_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_eq_query_operators.sql b/src/v3/scalars/timestamp/timestamp_eq_query_operators.sql new file mode 100644 index 000000000..5623510e9 --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_eq_query_operators.sql @@ -0,0 +1,31 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_eq_query_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_eq_query_operators.sql +--! @brief Operators for public.timestamp_eq_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_eq_query, RIGHTARG = public.timestamp_eq, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_eq_query, RIGHTARG = public.timestamp_eq, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); diff --git a/src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql b/src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql new file mode 100644 index 000000000..d66933c6d --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_ord_ope_query_functions.sql +--! @brief Functions for public.timestamp_ord_ope_query. + +--! @brief Index extractor for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope_query +--! @return eql_v3_internal.ope_cllw +CREATE FUNCTION eql_v3.ord_ope_term(a public.timestamp_ord_ope_query) +RETURNS eql_v3_internal.ope_cllw +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope +--! @param b public.timestamp_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope_query +--! @param b public.timestamp_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope +--! @param b public.timestamp_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope_query +--! @param b public.timestamp_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope +--! @param b public.timestamp_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope_query +--! @param b public.timestamp_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope +--! @param b public.timestamp_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope_query +--! @param b public.timestamp_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope +--! @param b public.timestamp_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope_query +--! @param b public.timestamp_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope +--! @param b public.timestamp_ord_ope_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @param a public.timestamp_ord_ope_query +--! @param b public.timestamp_ord_ope +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_ord_ope_query_operators.sql b/src/v3/scalars/timestamp/timestamp_ord_ope_query_operators.sql new file mode 100644 index 000000000..b84577166 --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_ord_ope_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_ord_ope_query_operators.sql +--! @brief Operators for public.timestamp_ord_ope_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql b/src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql new file mode 100644 index 000000000..d43610831 --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_ord_ore_query_functions.sql +--! @brief Functions for public.timestamp_ord_ore_query. + +--! @brief Index extractor for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord_ore_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore +--! @param b public.timestamp_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore_query +--! @param b public.timestamp_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore +--! @param b public.timestamp_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore_query +--! @param b public.timestamp_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore +--! @param b public.timestamp_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore_query +--! @param b public.timestamp_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore +--! @param b public.timestamp_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore_query +--! @param b public.timestamp_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore +--! @param b public.timestamp_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore_query +--! @param b public.timestamp_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore +--! @param b public.timestamp_ord_ore_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @param a public.timestamp_ord_ore_query +--! @param b public.timestamp_ord_ore +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_ord_ore_query_operators.sql b/src/v3/scalars/timestamp/timestamp_ord_ore_query_operators.sql new file mode 100644 index 000000000..3596318ef --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_ord_ore_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_ord_ore_query_operators.sql +--! @brief Operators for public.timestamp_ord_ore_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); diff --git a/src/v3/scalars/timestamp/timestamp_ord_query_functions.sql b/src/v3/scalars/timestamp/timestamp_ord_query_functions.sql new file mode 100644 index 000000000..2fcc5a43e --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_ord_query_functions.sql @@ -0,0 +1,111 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_ord_query_functions.sql +--! @brief Functions for public.timestamp_ord_query. + +--! @brief Index extractor for public.timestamp_ord_query. +--! @param a public.timestamp_ord_query +--! @return eql_v3_internal.ore_block_256 +CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord_query) +RETURNS eql_v3_internal.ore_block_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord +--! @param b public.timestamp_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord_query +--! @param b public.timestamp_ord +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_query, b public.timestamp_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord +--! @param b public.timestamp_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord_query +--! @param b public.timestamp_ord +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_query, b public.timestamp_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord +--! @param b public.timestamp_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord_query +--! @param b public.timestamp_ord +--! @return boolean +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_query, b public.timestamp_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord +--! @param b public.timestamp_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord_query +--! @param b public.timestamp_ord +--! @return boolean +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_query, b public.timestamp_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord +--! @param b public.timestamp_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord_query +--! @param b public.timestamp_ord +--! @return boolean +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_query, b public.timestamp_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord +--! @param b public.timestamp_ord_query +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord_query) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; + +--! @brief Operator wrapper for public.timestamp_ord_query. +--! @param a public.timestamp_ord_query +--! @param b public.timestamp_ord +--! @return boolean +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_query, b public.timestamp_ord) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_ord_query_operators.sql b/src/v3/scalars/timestamp/timestamp_ord_query_operators.sql new file mode 100644 index 000000000..0e12faaa0 --- /dev/null +++ b/src/v3/scalars/timestamp/timestamp_ord_query_operators.sql @@ -0,0 +1,79 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_query_functions.sql + +--! @file encrypted_domain/timestamp/timestamp_ord_query_operators.sql +--! @brief Operators for public.timestamp_ord_query. + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR = ( + FUNCTION = eql_v3.eq, + LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR <> ( + FUNCTION = eql_v3.neq, + LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR < ( + FUNCTION = eql_v3.lt, + LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR <= ( + FUNCTION = eql_v3.lte, + LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR > ( + FUNCTION = eql_v3.gt, + LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); + +CREATE OPERATOR >= ( + FUNCTION = eql_v3.gte, + LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel +); From 4b561024b3ab7f8f80f36b6c55090e2bdef28baa Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 15:38:00 +1000 Subject: [PATCH 542/599] test(eql v3): fresh-encryption conformance for scalar query operands (CIP-3432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit End-to-end proof of the query-operand surface with FRESH ZeroKMS encryption for both stored values and the query value (gated behind `proptest-e2e`, like the rest of the fresh-encryption suite): - eq: a term-only operand `{v,i,hm}` (no `c`), INDEPENDENTLY encrypted, matches exactly the equal stored rows via `= (integer_eq, integer_eq_query)`; a never-stored value matches nothing. - ord: a term-only ORE operand orders correctly (`< 25` → the rows below 25), and the `(query, storage)` commutator direction resolves too. - security: a ciphertext-bearing operand (full storage payload) is rejected by the `_query` domain's no-`c` CHECK. Verified locally against Postgres 17: 3 passed. CIP-3432 --- .../tests/v3_scalar_query_operand_tests.rs | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 tests/sqlx/tests/v3_scalar_query_operand_tests.rs diff --git a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs new file mode 100644 index 000000000..a2798d382 --- /dev/null +++ b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs @@ -0,0 +1,135 @@ +//! CIP-3432 conformance: a term-only query operand (`public._query` — the +//! index terms only, NO ciphertext `c`) matches stored rows through the +//! generated query operators, using FRESH ZeroKMS encryption for both the +//! stored values AND the query value. +//! +//! This is the end-to-end proof the operator surface exists for: two +//! INDEPENDENT encryptions of the same plaintext produce equal index terms that +//! the `(storage_domain, _query)` operator equates — with the query +//! operand carrying no decryptable ciphertext. Gated behind `proptest-e2e` +//! (needs `CS_*` creds at test time), like the rest of the fresh-encryption +//! suite. +#![cfg(feature = "proptest-e2e")] + +use anyhow::Result; +use eql_tests::fixtures::cipherstash::encrypt_store; +use eql_tests::fixtures::index_kind::IndexKind; +use serde_json::Value; +use sqlx::PgPool; + +/// Drop the ciphertext `c` from a stored v3 payload, yielding the term-only +/// query operand a client sends (structurally what `from_v2_query` produces). +fn to_query_operand(mut stored: Value) -> Value { + stored + .as_object_mut() + .expect("a v3 payload is a JSON object") + .remove("c"); + stored +} + +/// One fresh ZeroKMS encryption of a single value, returned as its v3 payload. +async fn encrypt_one(value: i32, indexes: &[IndexKind]) -> Result { + let mut payloads = encrypt_store("qtest", "payload", &[value], indexes).await?; + Ok(payloads.pop().expect("one value in, one payload out")) +} + +#[sqlx::test] +async fn eq_term_only_operand_matches_exactly_the_equal_rows(pool: PgPool) -> Result<()> { + // Store 10, 20, 30, 20 (a deliberate duplicate 20) as `integer_eq`. + let stored = encrypt_store( + "qtest", + "payload", + &[10i32, 20, 30, 20], + &[IndexKind::Unique], + ) + .await?; + sqlx::query("CREATE TABLE q (id int GENERATED ALWAYS AS IDENTITY, val public.integer_eq)") + .execute(&pool) + .await?; + for p in &stored { + sqlx::query("INSERT INTO q (val) VALUES ($1::jsonb::public.integer_eq)") + .bind(p.to_string()) + .execute(&pool) + .await?; + } + + // INDEPENDENTLY encrypt the query value 20 → term-only operand (no `c`). + let operand = to_query_operand(encrypt_one(20, &[IndexKind::Unique]).await?); + assert!( + !operand.as_object().unwrap().contains_key("c"), + "the query operand must carry no ciphertext" + ); + + let matches: i64 = + sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.integer_eq_query") + .bind(operand.to_string()) + .fetch_one(&pool) + .await?; + assert_eq!( + matches, 2, + "a term-only operand for 20 matches exactly the two stored 20s" + ); + + // A value never stored matches nothing (the eq-false branch). + let absent = to_query_operand(encrypt_one(99, &[IndexKind::Unique]).await?); + let none: i64 = + sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.integer_eq_query") + .bind(absent.to_string()) + .fetch_one(&pool) + .await?; + assert_eq!(none, 0, "a value never stored matches no rows"); + Ok(()) +} + +#[sqlx::test] +async fn ord_term_only_operand_orders_via_the_ore_operator(pool: PgPool) -> Result<()> { + // Store 10, 20, 30 as `integer_ord` (ORE block term). + let stored = encrypt_store("qtest", "payload", &[10i32, 20, 30], &[IndexKind::Ore]).await?; + sqlx::query("CREATE TABLE q (id int GENERATED ALWAYS AS IDENTITY, val public.integer_ord)") + .execute(&pool) + .await?; + for p in &stored { + sqlx::query("INSERT INTO q (val) VALUES ($1::jsonb::public.integer_ord)") + .bind(p.to_string()) + .execute(&pool) + .await?; + } + + // A term-only ordering operand for 25 (never stored): `< 25` → {10, 20}. + let operand = to_query_operand(encrypt_one(25, &[IndexKind::Ore]).await?); + let below: i64 = sqlx::query_scalar( + "SELECT count(*) FROM q WHERE val < $1::jsonb::public.integer_ord_query", + ) + .bind(operand.to_string()) + .fetch_one(&pool) + .await?; + assert_eq!(below, 2, "`< 25` matches the two rows below 25 (10, 20)"); + + // The commutator direction resolves too: `operand > val`. + let above: i64 = sqlx::query_scalar( + "SELECT count(*) FROM q WHERE $1::jsonb::public.integer_ord_query > val", + ) + .bind(operand.to_string()) + .fetch_one(&pool) + .await?; + assert_eq!(above, 2, "`25 > val` resolves the commutator and matches 10, 20"); + Ok(()) +} + +#[sqlx::test] +async fn query_domain_rejects_a_ciphertext_bearing_operand(pool: PgPool) -> Result<()> { + // The no-`c` CHECK is the security contract: a full storage payload (with + // `c`) must not be accepted as a query operand. + let stored = encrypt_one(7, &[IndexKind::Unique]).await?; + assert!(stored.as_object().unwrap().contains_key("c")); + let err = sqlx::query("SELECT $1::jsonb::public.integer_eq_query") + .bind(stored.to_string()) + .execute(&pool) + .await + .expect_err("a ciphertext-bearing operand must violate the query-domain CHECK"); + assert!( + err.to_string().contains("violates check constraint"), + "expected a CHECK violation, got: {err}" + ); + Ok(()) +} From b4bcdb6cb0b5443c66f9396944af84c1f73e14b1 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 15:39:48 +1000 Subject: [PATCH 543/599] docs(changelog): scalar query-operand surface (CIP-3432) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b5a090d8..152169529 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added +- **Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373)) - **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350)) - **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349)) - **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed. From b925e26ebf17db6b59a30c36456dc043be8a61f9 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 15:49:01 +1000 Subject: [PATCH 544/599] test(eql v3): add query operators/wrappers to the public surface golden (CIP-3432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Regenerated eql_v3_public_surface.txt — 423 additions, 0 removals, all `*_query` wrappers/extractors. Confirms the query surface is purely additive (no existing operator changed). --- .../sqlx/snapshots/eql_v3_public_surface.txt | 423 ++++++++++++++++++ 1 file changed, 423 insertions(+) diff --git a/tests/sqlx/snapshots/eql_v3_public_surface.txt b/tests/sqlx/snapshots/eql_v3_public_surface.txt index 5ac99b0ec..0fb88f423 100644 --- a/tests/sqlx/snapshots/eql_v3_public_surface.txt +++ b/tests/sqlx/snapshots/eql_v3_public_surface.txt @@ -72,14 +72,22 @@ function eql_v3.contained_by(a jsonb, b public.text_match) function eql_v3.contained_by(a jsonb, b public.text_search) function eql_v3.contained_by(a public.text_match, b jsonb) function eql_v3.contained_by(a public.text_match, b public.text_match) +function eql_v3.contained_by(a public.text_match, b public.text_match_query) +function eql_v3.contained_by(a public.text_match_query, b public.text_match) function eql_v3.contained_by(a public.text_search, b jsonb) function eql_v3.contained_by(a public.text_search, b public.text_search) +function eql_v3.contained_by(a public.text_search, b public.text_search_query) +function eql_v3.contained_by(a public.text_search_query, b public.text_search) function eql_v3.contains(a jsonb, b public.text_match) function eql_v3.contains(a jsonb, b public.text_search) function eql_v3.contains(a public.text_match, b jsonb) function eql_v3.contains(a public.text_match, b public.text_match) +function eql_v3.contains(a public.text_match, b public.text_match_query) +function eql_v3.contains(a public.text_match_query, b public.text_match) function eql_v3.contains(a public.text_search, b jsonb) function eql_v3.contains(a public.text_search, b public.text_search) +function eql_v3.contains(a public.text_search, b public.text_search_query) +function eql_v3.contains(a public.text_search_query, b public.text_search) function eql_v3.eq(a jsonb, b public.bigint_eq) function eql_v3.eq(a jsonb, b public.bigint_ord) function eql_v3.eq(a jsonb, b public.bigint_ord_ope) @@ -119,92 +127,179 @@ function eql_v3.eq(a jsonb, b public.timestamp_ord_ope) function eql_v3.eq(a jsonb, b public.timestamp_ord_ore) function eql_v3.eq(a public.bigint_eq, b jsonb) function eql_v3.eq(a public.bigint_eq, b public.bigint_eq) +function eql_v3.eq(a public.bigint_eq, b public.bigint_eq_query) +function eql_v3.eq(a public.bigint_eq_query, b public.bigint_eq) function eql_v3.eq(a public.bigint_ord, b jsonb) function eql_v3.eq(a public.bigint_ord, b public.bigint_ord) +function eql_v3.eq(a public.bigint_ord, b public.bigint_ord_query) function eql_v3.eq(a public.bigint_ord_ope, b jsonb) function eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +function eql_v3.eq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) function eql_v3.eq(a public.bigint_ord_ore, b jsonb) function eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +function eql_v3.eq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +function eql_v3.eq(a public.bigint_ord_query, b public.bigint_ord) function eql_v3.eq(a public.date_eq, b jsonb) function eql_v3.eq(a public.date_eq, b public.date_eq) +function eql_v3.eq(a public.date_eq, b public.date_eq_query) +function eql_v3.eq(a public.date_eq_query, b public.date_eq) function eql_v3.eq(a public.date_ord, b jsonb) function eql_v3.eq(a public.date_ord, b public.date_ord) +function eql_v3.eq(a public.date_ord, b public.date_ord_query) function eql_v3.eq(a public.date_ord_ope, b jsonb) function eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope) +function eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope_query) +function eql_v3.eq(a public.date_ord_ope_query, b public.date_ord_ope) function eql_v3.eq(a public.date_ord_ore, b jsonb) function eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore) +function eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore_query) +function eql_v3.eq(a public.date_ord_ore_query, b public.date_ord_ore) +function eql_v3.eq(a public.date_ord_query, b public.date_ord) function eql_v3.eq(a public.double_eq, b jsonb) function eql_v3.eq(a public.double_eq, b public.double_eq) +function eql_v3.eq(a public.double_eq, b public.double_eq_query) +function eql_v3.eq(a public.double_eq_query, b public.double_eq) function eql_v3.eq(a public.double_ord, b jsonb) function eql_v3.eq(a public.double_ord, b public.double_ord) +function eql_v3.eq(a public.double_ord, b public.double_ord_query) function eql_v3.eq(a public.double_ord_ope, b jsonb) function eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope) +function eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope_query) +function eql_v3.eq(a public.double_ord_ope_query, b public.double_ord_ope) function eql_v3.eq(a public.double_ord_ore, b jsonb) function eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore) +function eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore_query) +function eql_v3.eq(a public.double_ord_ore_query, b public.double_ord_ore) +function eql_v3.eq(a public.double_ord_query, b public.double_ord) function eql_v3.eq(a public.integer_eq, b jsonb) function eql_v3.eq(a public.integer_eq, b public.integer_eq) +function eql_v3.eq(a public.integer_eq, b public.integer_eq_query) +function eql_v3.eq(a public.integer_eq_query, b public.integer_eq) function eql_v3.eq(a public.integer_ord, b jsonb) function eql_v3.eq(a public.integer_ord, b public.integer_ord) +function eql_v3.eq(a public.integer_ord, b public.integer_ord_query) function eql_v3.eq(a public.integer_ord_ope, b jsonb) function eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope) +function eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope_query) +function eql_v3.eq(a public.integer_ord_ope_query, b public.integer_ord_ope) function eql_v3.eq(a public.integer_ord_ore, b jsonb) function eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore) +function eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore_query) +function eql_v3.eq(a public.integer_ord_ore_query, b public.integer_ord_ore) +function eql_v3.eq(a public.integer_ord_query, b public.integer_ord) function eql_v3.eq(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.eq(a public.numeric_eq, b jsonb) function eql_v3.eq(a public.numeric_eq, b public.numeric_eq) +function eql_v3.eq(a public.numeric_eq, b public.numeric_eq_query) +function eql_v3.eq(a public.numeric_eq_query, b public.numeric_eq) function eql_v3.eq(a public.numeric_ord, b jsonb) function eql_v3.eq(a public.numeric_ord, b public.numeric_ord) +function eql_v3.eq(a public.numeric_ord, b public.numeric_ord_query) function eql_v3.eq(a public.numeric_ord_ope, b jsonb) function eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +function eql_v3.eq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) function eql_v3.eq(a public.numeric_ord_ore, b jsonb) function eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +function eql_v3.eq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +function eql_v3.eq(a public.numeric_ord_query, b public.numeric_ord) function eql_v3.eq(a public.real_eq, b jsonb) function eql_v3.eq(a public.real_eq, b public.real_eq) +function eql_v3.eq(a public.real_eq, b public.real_eq_query) +function eql_v3.eq(a public.real_eq_query, b public.real_eq) function eql_v3.eq(a public.real_ord, b jsonb) function eql_v3.eq(a public.real_ord, b public.real_ord) +function eql_v3.eq(a public.real_ord, b public.real_ord_query) function eql_v3.eq(a public.real_ord_ope, b jsonb) function eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope_query) +function eql_v3.eq(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.eq(a public.real_ord_ore, b jsonb) function eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore_query) +function eql_v3.eq(a public.real_ord_ore_query, b public.real_ord_ore) +function eql_v3.eq(a public.real_ord_query, b public.real_ord) function eql_v3.eq(a public.smallint_eq, b jsonb) function eql_v3.eq(a public.smallint_eq, b public.smallint_eq) +function eql_v3.eq(a public.smallint_eq, b public.smallint_eq_query) +function eql_v3.eq(a public.smallint_eq_query, b public.smallint_eq) function eql_v3.eq(a public.smallint_ord, b jsonb) function eql_v3.eq(a public.smallint_ord, b public.smallint_ord) +function eql_v3.eq(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.eq(a public.smallint_ord_ope, b jsonb) function eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +function eql_v3.eq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.eq(a public.smallint_ord_ore, b jsonb) function eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +function eql_v3.eq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +function eql_v3.eq(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.eq(a public.text_eq, b jsonb) function eql_v3.eq(a public.text_eq, b public.text_eq) +function eql_v3.eq(a public.text_eq, b public.text_eq_query) +function eql_v3.eq(a public.text_eq_query, b public.text_eq) function eql_v3.eq(a public.text_ord, b jsonb) function eql_v3.eq(a public.text_ord, b public.text_ord) +function eql_v3.eq(a public.text_ord, b public.text_ord_query) function eql_v3.eq(a public.text_ord_ope, b jsonb) function eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope_query) +function eql_v3.eq(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.eq(a public.text_ord_ore, b jsonb) function eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore_query) +function eql_v3.eq(a public.text_ord_ore_query, b public.text_ord_ore) +function eql_v3.eq(a public.text_ord_query, b public.text_ord) function eql_v3.eq(a public.text_search, b jsonb) function eql_v3.eq(a public.text_search, b public.text_search) +function eql_v3.eq(a public.text_search, b public.text_search_query) +function eql_v3.eq(a public.text_search_query, b public.text_search) function eql_v3.eq(a public.timestamp_eq, b jsonb) function eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq) +function eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq_query) +function eql_v3.eq(a public.timestamp_eq_query, b public.timestamp_eq) function eql_v3.eq(a public.timestamp_ord, b jsonb) function eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.eq(a public.timestamp_ord_ope, b jsonb) function eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +function eql_v3.eq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.eq(a public.timestamp_ord_ore, b jsonb) function eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +function eql_v3.eq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +function eql_v3.eq(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.eq_term(a public.bigint_eq) +function eql_v3.eq_term(a public.bigint_eq_query) function eql_v3.eq_term(a public.date_eq) +function eql_v3.eq_term(a public.date_eq_query) function eql_v3.eq_term(a public.double_eq) +function eql_v3.eq_term(a public.double_eq_query) function eql_v3.eq_term(a public.integer_eq) +function eql_v3.eq_term(a public.integer_eq_query) function eql_v3.eq_term(a public.numeric_eq) +function eql_v3.eq_term(a public.numeric_eq_query) function eql_v3.eq_term(a public.real_eq) +function eql_v3.eq_term(a public.real_eq_query) function eql_v3.eq_term(a public.smallint_eq) +function eql_v3.eq_term(a public.smallint_eq_query) function eql_v3.eq_term(a public.text_eq) +function eql_v3.eq_term(a public.text_eq_query) function eql_v3.eq_term(a public.text_ord) function eql_v3.eq_term(a public.text_ord_ope) +function eql_v3.eq_term(a public.text_ord_ope_query) function eql_v3.eq_term(a public.text_ord_ore) +function eql_v3.eq_term(a public.text_ord_ore_query) +function eql_v3.eq_term(a public.text_ord_query) function eql_v3.eq_term(a public.text_search) +function eql_v3.eq_term(a public.text_search_query) function eql_v3.eq_term(a public.timestamp_eq) +function eql_v3.eq_term(a public.timestamp_eq_query) function eql_v3.eq_term(entry public.jsonb_entry) function eql_v3.gt(a jsonb, b public.bigint_ord) function eql_v3.gt(a jsonb, b public.bigint_ord_ope) @@ -236,61 +331,117 @@ function eql_v3.gt(a jsonb, b public.timestamp_ord_ope) function eql_v3.gt(a jsonb, b public.timestamp_ord_ore) function eql_v3.gt(a public.bigint_ord, b jsonb) function eql_v3.gt(a public.bigint_ord, b public.bigint_ord) +function eql_v3.gt(a public.bigint_ord, b public.bigint_ord_query) function eql_v3.gt(a public.bigint_ord_ope, b jsonb) function eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +function eql_v3.gt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) function eql_v3.gt(a public.bigint_ord_ore, b jsonb) function eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +function eql_v3.gt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +function eql_v3.gt(a public.bigint_ord_query, b public.bigint_ord) function eql_v3.gt(a public.date_ord, b jsonb) function eql_v3.gt(a public.date_ord, b public.date_ord) +function eql_v3.gt(a public.date_ord, b public.date_ord_query) function eql_v3.gt(a public.date_ord_ope, b jsonb) function eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope) +function eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope_query) +function eql_v3.gt(a public.date_ord_ope_query, b public.date_ord_ope) function eql_v3.gt(a public.date_ord_ore, b jsonb) function eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore) +function eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore_query) +function eql_v3.gt(a public.date_ord_ore_query, b public.date_ord_ore) +function eql_v3.gt(a public.date_ord_query, b public.date_ord) function eql_v3.gt(a public.double_ord, b jsonb) function eql_v3.gt(a public.double_ord, b public.double_ord) +function eql_v3.gt(a public.double_ord, b public.double_ord_query) function eql_v3.gt(a public.double_ord_ope, b jsonb) function eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope) +function eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope_query) +function eql_v3.gt(a public.double_ord_ope_query, b public.double_ord_ope) function eql_v3.gt(a public.double_ord_ore, b jsonb) function eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore) +function eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore_query) +function eql_v3.gt(a public.double_ord_ore_query, b public.double_ord_ore) +function eql_v3.gt(a public.double_ord_query, b public.double_ord) function eql_v3.gt(a public.integer_ord, b jsonb) function eql_v3.gt(a public.integer_ord, b public.integer_ord) +function eql_v3.gt(a public.integer_ord, b public.integer_ord_query) function eql_v3.gt(a public.integer_ord_ope, b jsonb) function eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope) +function eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope_query) +function eql_v3.gt(a public.integer_ord_ope_query, b public.integer_ord_ope) function eql_v3.gt(a public.integer_ord_ore, b jsonb) function eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore) +function eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore_query) +function eql_v3.gt(a public.integer_ord_ore_query, b public.integer_ord_ore) +function eql_v3.gt(a public.integer_ord_query, b public.integer_ord) function eql_v3.gt(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.gt(a public.numeric_ord, b jsonb) function eql_v3.gt(a public.numeric_ord, b public.numeric_ord) +function eql_v3.gt(a public.numeric_ord, b public.numeric_ord_query) function eql_v3.gt(a public.numeric_ord_ope, b jsonb) function eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +function eql_v3.gt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) function eql_v3.gt(a public.numeric_ord_ore, b jsonb) function eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +function eql_v3.gt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +function eql_v3.gt(a public.numeric_ord_query, b public.numeric_ord) function eql_v3.gt(a public.real_ord, b jsonb) function eql_v3.gt(a public.real_ord, b public.real_ord) +function eql_v3.gt(a public.real_ord, b public.real_ord_query) function eql_v3.gt(a public.real_ord_ope, b jsonb) function eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope_query) +function eql_v3.gt(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.gt(a public.real_ord_ore, b jsonb) function eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore_query) +function eql_v3.gt(a public.real_ord_ore_query, b public.real_ord_ore) +function eql_v3.gt(a public.real_ord_query, b public.real_ord) function eql_v3.gt(a public.smallint_ord, b jsonb) function eql_v3.gt(a public.smallint_ord, b public.smallint_ord) +function eql_v3.gt(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.gt(a public.smallint_ord_ope, b jsonb) function eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +function eql_v3.gt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.gt(a public.smallint_ord_ore, b jsonb) function eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +function eql_v3.gt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +function eql_v3.gt(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.gt(a public.text_ord, b jsonb) function eql_v3.gt(a public.text_ord, b public.text_ord) +function eql_v3.gt(a public.text_ord, b public.text_ord_query) function eql_v3.gt(a public.text_ord_ope, b jsonb) function eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope_query) +function eql_v3.gt(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.gt(a public.text_ord_ore, b jsonb) function eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore_query) +function eql_v3.gt(a public.text_ord_ore_query, b public.text_ord_ore) +function eql_v3.gt(a public.text_ord_query, b public.text_ord) function eql_v3.gt(a public.text_search, b jsonb) function eql_v3.gt(a public.text_search, b public.text_search) +function eql_v3.gt(a public.text_search, b public.text_search_query) +function eql_v3.gt(a public.text_search_query, b public.text_search) function eql_v3.gt(a public.timestamp_ord, b jsonb) function eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.gt(a public.timestamp_ord_ope, b jsonb) function eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +function eql_v3.gt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.gt(a public.timestamp_ord_ore, b jsonb) function eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +function eql_v3.gt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +function eql_v3.gt(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.gte(a jsonb, b public.bigint_ord) function eql_v3.gte(a jsonb, b public.bigint_ord_ope) function eql_v3.gte(a jsonb, b public.bigint_ord_ore) @@ -321,61 +472,117 @@ function eql_v3.gte(a jsonb, b public.timestamp_ord_ope) function eql_v3.gte(a jsonb, b public.timestamp_ord_ore) function eql_v3.gte(a public.bigint_ord, b jsonb) function eql_v3.gte(a public.bigint_ord, b public.bigint_ord) +function eql_v3.gte(a public.bigint_ord, b public.bigint_ord_query) function eql_v3.gte(a public.bigint_ord_ope, b jsonb) function eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +function eql_v3.gte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) function eql_v3.gte(a public.bigint_ord_ore, b jsonb) function eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +function eql_v3.gte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +function eql_v3.gte(a public.bigint_ord_query, b public.bigint_ord) function eql_v3.gte(a public.date_ord, b jsonb) function eql_v3.gte(a public.date_ord, b public.date_ord) +function eql_v3.gte(a public.date_ord, b public.date_ord_query) function eql_v3.gte(a public.date_ord_ope, b jsonb) function eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope) +function eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope_query) +function eql_v3.gte(a public.date_ord_ope_query, b public.date_ord_ope) function eql_v3.gte(a public.date_ord_ore, b jsonb) function eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore) +function eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore_query) +function eql_v3.gte(a public.date_ord_ore_query, b public.date_ord_ore) +function eql_v3.gte(a public.date_ord_query, b public.date_ord) function eql_v3.gte(a public.double_ord, b jsonb) function eql_v3.gte(a public.double_ord, b public.double_ord) +function eql_v3.gte(a public.double_ord, b public.double_ord_query) function eql_v3.gte(a public.double_ord_ope, b jsonb) function eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope) +function eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope_query) +function eql_v3.gte(a public.double_ord_ope_query, b public.double_ord_ope) function eql_v3.gte(a public.double_ord_ore, b jsonb) function eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore) +function eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore_query) +function eql_v3.gte(a public.double_ord_ore_query, b public.double_ord_ore) +function eql_v3.gte(a public.double_ord_query, b public.double_ord) function eql_v3.gte(a public.integer_ord, b jsonb) function eql_v3.gte(a public.integer_ord, b public.integer_ord) +function eql_v3.gte(a public.integer_ord, b public.integer_ord_query) function eql_v3.gte(a public.integer_ord_ope, b jsonb) function eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope) +function eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope_query) +function eql_v3.gte(a public.integer_ord_ope_query, b public.integer_ord_ope) function eql_v3.gte(a public.integer_ord_ore, b jsonb) function eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore) +function eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore_query) +function eql_v3.gte(a public.integer_ord_ore_query, b public.integer_ord_ore) +function eql_v3.gte(a public.integer_ord_query, b public.integer_ord) function eql_v3.gte(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.gte(a public.numeric_ord, b jsonb) function eql_v3.gte(a public.numeric_ord, b public.numeric_ord) +function eql_v3.gte(a public.numeric_ord, b public.numeric_ord_query) function eql_v3.gte(a public.numeric_ord_ope, b jsonb) function eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +function eql_v3.gte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) function eql_v3.gte(a public.numeric_ord_ore, b jsonb) function eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +function eql_v3.gte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +function eql_v3.gte(a public.numeric_ord_query, b public.numeric_ord) function eql_v3.gte(a public.real_ord, b jsonb) function eql_v3.gte(a public.real_ord, b public.real_ord) +function eql_v3.gte(a public.real_ord, b public.real_ord_query) function eql_v3.gte(a public.real_ord_ope, b jsonb) function eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope_query) +function eql_v3.gte(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.gte(a public.real_ord_ore, b jsonb) function eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore_query) +function eql_v3.gte(a public.real_ord_ore_query, b public.real_ord_ore) +function eql_v3.gte(a public.real_ord_query, b public.real_ord) function eql_v3.gte(a public.smallint_ord, b jsonb) function eql_v3.gte(a public.smallint_ord, b public.smallint_ord) +function eql_v3.gte(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.gte(a public.smallint_ord_ope, b jsonb) function eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +function eql_v3.gte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.gte(a public.smallint_ord_ore, b jsonb) function eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +function eql_v3.gte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +function eql_v3.gte(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.gte(a public.text_ord, b jsonb) function eql_v3.gte(a public.text_ord, b public.text_ord) +function eql_v3.gte(a public.text_ord, b public.text_ord_query) function eql_v3.gte(a public.text_ord_ope, b jsonb) function eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope_query) +function eql_v3.gte(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.gte(a public.text_ord_ore, b jsonb) function eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore_query) +function eql_v3.gte(a public.text_ord_ore_query, b public.text_ord_ore) +function eql_v3.gte(a public.text_ord_query, b public.text_ord) function eql_v3.gte(a public.text_search, b jsonb) function eql_v3.gte(a public.text_search, b public.text_search) +function eql_v3.gte(a public.text_search, b public.text_search_query) +function eql_v3.gte(a public.text_search_query, b public.text_search) function eql_v3.gte(a public.timestamp_ord, b jsonb) function eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.gte(a public.timestamp_ord_ope, b jsonb) function eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +function eql_v3.gte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.gte(a public.timestamp_ord_ore, b jsonb) function eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +function eql_v3.gte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +function eql_v3.gte(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.has_ore_cllw(entry public.jsonb_entry) function eql_v3.jsonb_array(val jsonb) function eql_v3.jsonb_array_elements(val jsonb) @@ -417,61 +624,117 @@ function eql_v3.lt(a jsonb, b public.timestamp_ord_ope) function eql_v3.lt(a jsonb, b public.timestamp_ord_ore) function eql_v3.lt(a public.bigint_ord, b jsonb) function eql_v3.lt(a public.bigint_ord, b public.bigint_ord) +function eql_v3.lt(a public.bigint_ord, b public.bigint_ord_query) function eql_v3.lt(a public.bigint_ord_ope, b jsonb) function eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +function eql_v3.lt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) function eql_v3.lt(a public.bigint_ord_ore, b jsonb) function eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +function eql_v3.lt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +function eql_v3.lt(a public.bigint_ord_query, b public.bigint_ord) function eql_v3.lt(a public.date_ord, b jsonb) function eql_v3.lt(a public.date_ord, b public.date_ord) +function eql_v3.lt(a public.date_ord, b public.date_ord_query) function eql_v3.lt(a public.date_ord_ope, b jsonb) function eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope) +function eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope_query) +function eql_v3.lt(a public.date_ord_ope_query, b public.date_ord_ope) function eql_v3.lt(a public.date_ord_ore, b jsonb) function eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore) +function eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore_query) +function eql_v3.lt(a public.date_ord_ore_query, b public.date_ord_ore) +function eql_v3.lt(a public.date_ord_query, b public.date_ord) function eql_v3.lt(a public.double_ord, b jsonb) function eql_v3.lt(a public.double_ord, b public.double_ord) +function eql_v3.lt(a public.double_ord, b public.double_ord_query) function eql_v3.lt(a public.double_ord_ope, b jsonb) function eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope) +function eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope_query) +function eql_v3.lt(a public.double_ord_ope_query, b public.double_ord_ope) function eql_v3.lt(a public.double_ord_ore, b jsonb) function eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore) +function eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore_query) +function eql_v3.lt(a public.double_ord_ore_query, b public.double_ord_ore) +function eql_v3.lt(a public.double_ord_query, b public.double_ord) function eql_v3.lt(a public.integer_ord, b jsonb) function eql_v3.lt(a public.integer_ord, b public.integer_ord) +function eql_v3.lt(a public.integer_ord, b public.integer_ord_query) function eql_v3.lt(a public.integer_ord_ope, b jsonb) function eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope) +function eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope_query) +function eql_v3.lt(a public.integer_ord_ope_query, b public.integer_ord_ope) function eql_v3.lt(a public.integer_ord_ore, b jsonb) function eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore) +function eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore_query) +function eql_v3.lt(a public.integer_ord_ore_query, b public.integer_ord_ore) +function eql_v3.lt(a public.integer_ord_query, b public.integer_ord) function eql_v3.lt(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.lt(a public.numeric_ord, b jsonb) function eql_v3.lt(a public.numeric_ord, b public.numeric_ord) +function eql_v3.lt(a public.numeric_ord, b public.numeric_ord_query) function eql_v3.lt(a public.numeric_ord_ope, b jsonb) function eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +function eql_v3.lt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) function eql_v3.lt(a public.numeric_ord_ore, b jsonb) function eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +function eql_v3.lt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +function eql_v3.lt(a public.numeric_ord_query, b public.numeric_ord) function eql_v3.lt(a public.real_ord, b jsonb) function eql_v3.lt(a public.real_ord, b public.real_ord) +function eql_v3.lt(a public.real_ord, b public.real_ord_query) function eql_v3.lt(a public.real_ord_ope, b jsonb) function eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope_query) +function eql_v3.lt(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.lt(a public.real_ord_ore, b jsonb) function eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore_query) +function eql_v3.lt(a public.real_ord_ore_query, b public.real_ord_ore) +function eql_v3.lt(a public.real_ord_query, b public.real_ord) function eql_v3.lt(a public.smallint_ord, b jsonb) function eql_v3.lt(a public.smallint_ord, b public.smallint_ord) +function eql_v3.lt(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.lt(a public.smallint_ord_ope, b jsonb) function eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +function eql_v3.lt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.lt(a public.smallint_ord_ore, b jsonb) function eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +function eql_v3.lt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +function eql_v3.lt(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.lt(a public.text_ord, b jsonb) function eql_v3.lt(a public.text_ord, b public.text_ord) +function eql_v3.lt(a public.text_ord, b public.text_ord_query) function eql_v3.lt(a public.text_ord_ope, b jsonb) function eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope_query) +function eql_v3.lt(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.lt(a public.text_ord_ore, b jsonb) function eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore_query) +function eql_v3.lt(a public.text_ord_ore_query, b public.text_ord_ore) +function eql_v3.lt(a public.text_ord_query, b public.text_ord) function eql_v3.lt(a public.text_search, b jsonb) function eql_v3.lt(a public.text_search, b public.text_search) +function eql_v3.lt(a public.text_search, b public.text_search_query) +function eql_v3.lt(a public.text_search_query, b public.text_search) function eql_v3.lt(a public.timestamp_ord, b jsonb) function eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.lt(a public.timestamp_ord_ope, b jsonb) function eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +function eql_v3.lt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.lt(a public.timestamp_ord_ore, b jsonb) function eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +function eql_v3.lt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +function eql_v3.lt(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.lte(a jsonb, b public.bigint_ord) function eql_v3.lte(a jsonb, b public.bigint_ord_ope) function eql_v3.lte(a jsonb, b public.bigint_ord_ore) @@ -502,63 +765,121 @@ function eql_v3.lte(a jsonb, b public.timestamp_ord_ope) function eql_v3.lte(a jsonb, b public.timestamp_ord_ore) function eql_v3.lte(a public.bigint_ord, b jsonb) function eql_v3.lte(a public.bigint_ord, b public.bigint_ord) +function eql_v3.lte(a public.bigint_ord, b public.bigint_ord_query) function eql_v3.lte(a public.bigint_ord_ope, b jsonb) function eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +function eql_v3.lte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) function eql_v3.lte(a public.bigint_ord_ore, b jsonb) function eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +function eql_v3.lte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +function eql_v3.lte(a public.bigint_ord_query, b public.bigint_ord) function eql_v3.lte(a public.date_ord, b jsonb) function eql_v3.lte(a public.date_ord, b public.date_ord) +function eql_v3.lte(a public.date_ord, b public.date_ord_query) function eql_v3.lte(a public.date_ord_ope, b jsonb) function eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope) +function eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope_query) +function eql_v3.lte(a public.date_ord_ope_query, b public.date_ord_ope) function eql_v3.lte(a public.date_ord_ore, b jsonb) function eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore) +function eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore_query) +function eql_v3.lte(a public.date_ord_ore_query, b public.date_ord_ore) +function eql_v3.lte(a public.date_ord_query, b public.date_ord) function eql_v3.lte(a public.double_ord, b jsonb) function eql_v3.lte(a public.double_ord, b public.double_ord) +function eql_v3.lte(a public.double_ord, b public.double_ord_query) function eql_v3.lte(a public.double_ord_ope, b jsonb) function eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope) +function eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope_query) +function eql_v3.lte(a public.double_ord_ope_query, b public.double_ord_ope) function eql_v3.lte(a public.double_ord_ore, b jsonb) function eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore) +function eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore_query) +function eql_v3.lte(a public.double_ord_ore_query, b public.double_ord_ore) +function eql_v3.lte(a public.double_ord_query, b public.double_ord) function eql_v3.lte(a public.integer_ord, b jsonb) function eql_v3.lte(a public.integer_ord, b public.integer_ord) +function eql_v3.lte(a public.integer_ord, b public.integer_ord_query) function eql_v3.lte(a public.integer_ord_ope, b jsonb) function eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope) +function eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope_query) +function eql_v3.lte(a public.integer_ord_ope_query, b public.integer_ord_ope) function eql_v3.lte(a public.integer_ord_ore, b jsonb) function eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore) +function eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore_query) +function eql_v3.lte(a public.integer_ord_ore_query, b public.integer_ord_ore) +function eql_v3.lte(a public.integer_ord_query, b public.integer_ord) function eql_v3.lte(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.lte(a public.numeric_ord, b jsonb) function eql_v3.lte(a public.numeric_ord, b public.numeric_ord) +function eql_v3.lte(a public.numeric_ord, b public.numeric_ord_query) function eql_v3.lte(a public.numeric_ord_ope, b jsonb) function eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +function eql_v3.lte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) function eql_v3.lte(a public.numeric_ord_ore, b jsonb) function eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +function eql_v3.lte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +function eql_v3.lte(a public.numeric_ord_query, b public.numeric_ord) function eql_v3.lte(a public.real_ord, b jsonb) function eql_v3.lte(a public.real_ord, b public.real_ord) +function eql_v3.lte(a public.real_ord, b public.real_ord_query) function eql_v3.lte(a public.real_ord_ope, b jsonb) function eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope_query) +function eql_v3.lte(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.lte(a public.real_ord_ore, b jsonb) function eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore_query) +function eql_v3.lte(a public.real_ord_ore_query, b public.real_ord_ore) +function eql_v3.lte(a public.real_ord_query, b public.real_ord) function eql_v3.lte(a public.smallint_ord, b jsonb) function eql_v3.lte(a public.smallint_ord, b public.smallint_ord) +function eql_v3.lte(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.lte(a public.smallint_ord_ope, b jsonb) function eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +function eql_v3.lte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.lte(a public.smallint_ord_ore, b jsonb) function eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +function eql_v3.lte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +function eql_v3.lte(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.lte(a public.text_ord, b jsonb) function eql_v3.lte(a public.text_ord, b public.text_ord) +function eql_v3.lte(a public.text_ord, b public.text_ord_query) function eql_v3.lte(a public.text_ord_ope, b jsonb) function eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope_query) +function eql_v3.lte(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.lte(a public.text_ord_ore, b jsonb) function eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore_query) +function eql_v3.lte(a public.text_ord_ore_query, b public.text_ord_ore) +function eql_v3.lte(a public.text_ord_query, b public.text_ord) function eql_v3.lte(a public.text_search, b jsonb) function eql_v3.lte(a public.text_search, b public.text_search) +function eql_v3.lte(a public.text_search, b public.text_search_query) +function eql_v3.lte(a public.text_search_query, b public.text_search) function eql_v3.lte(a public.timestamp_ord, b jsonb) function eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.lte(a public.timestamp_ord_ope, b jsonb) function eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +function eql_v3.lte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.lte(a public.timestamp_ord_ore, b jsonb) function eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +function eql_v3.lte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +function eql_v3.lte(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.match_term(a public.text_match) +function eql_v3.match_term(a public.text_match_query) function eql_v3.match_term(a public.text_search) +function eql_v3.match_term(a public.text_search_query) function eql_v3.meta_data(val jsonb) function eql_v3.neq(a jsonb, b public.bigint_eq) function eql_v3.neq(a jsonb, b public.bigint_ord) @@ -599,107 +920,209 @@ function eql_v3.neq(a jsonb, b public.timestamp_ord_ope) function eql_v3.neq(a jsonb, b public.timestamp_ord_ore) function eql_v3.neq(a public.bigint_eq, b jsonb) function eql_v3.neq(a public.bigint_eq, b public.bigint_eq) +function eql_v3.neq(a public.bigint_eq, b public.bigint_eq_query) +function eql_v3.neq(a public.bigint_eq_query, b public.bigint_eq) function eql_v3.neq(a public.bigint_ord, b jsonb) function eql_v3.neq(a public.bigint_ord, b public.bigint_ord) +function eql_v3.neq(a public.bigint_ord, b public.bigint_ord_query) function eql_v3.neq(a public.bigint_ord_ope, b jsonb) function eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +function eql_v3.neq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) function eql_v3.neq(a public.bigint_ord_ore, b jsonb) function eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +function eql_v3.neq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +function eql_v3.neq(a public.bigint_ord_query, b public.bigint_ord) function eql_v3.neq(a public.date_eq, b jsonb) function eql_v3.neq(a public.date_eq, b public.date_eq) +function eql_v3.neq(a public.date_eq, b public.date_eq_query) +function eql_v3.neq(a public.date_eq_query, b public.date_eq) function eql_v3.neq(a public.date_ord, b jsonb) function eql_v3.neq(a public.date_ord, b public.date_ord) +function eql_v3.neq(a public.date_ord, b public.date_ord_query) function eql_v3.neq(a public.date_ord_ope, b jsonb) function eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope) +function eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope_query) +function eql_v3.neq(a public.date_ord_ope_query, b public.date_ord_ope) function eql_v3.neq(a public.date_ord_ore, b jsonb) function eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore) +function eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore_query) +function eql_v3.neq(a public.date_ord_ore_query, b public.date_ord_ore) +function eql_v3.neq(a public.date_ord_query, b public.date_ord) function eql_v3.neq(a public.double_eq, b jsonb) function eql_v3.neq(a public.double_eq, b public.double_eq) +function eql_v3.neq(a public.double_eq, b public.double_eq_query) +function eql_v3.neq(a public.double_eq_query, b public.double_eq) function eql_v3.neq(a public.double_ord, b jsonb) function eql_v3.neq(a public.double_ord, b public.double_ord) +function eql_v3.neq(a public.double_ord, b public.double_ord_query) function eql_v3.neq(a public.double_ord_ope, b jsonb) function eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope) +function eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope_query) +function eql_v3.neq(a public.double_ord_ope_query, b public.double_ord_ope) function eql_v3.neq(a public.double_ord_ore, b jsonb) function eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore) +function eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore_query) +function eql_v3.neq(a public.double_ord_ore_query, b public.double_ord_ore) +function eql_v3.neq(a public.double_ord_query, b public.double_ord) function eql_v3.neq(a public.integer_eq, b jsonb) function eql_v3.neq(a public.integer_eq, b public.integer_eq) +function eql_v3.neq(a public.integer_eq, b public.integer_eq_query) +function eql_v3.neq(a public.integer_eq_query, b public.integer_eq) function eql_v3.neq(a public.integer_ord, b jsonb) function eql_v3.neq(a public.integer_ord, b public.integer_ord) +function eql_v3.neq(a public.integer_ord, b public.integer_ord_query) function eql_v3.neq(a public.integer_ord_ope, b jsonb) function eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope) +function eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope_query) +function eql_v3.neq(a public.integer_ord_ope_query, b public.integer_ord_ope) function eql_v3.neq(a public.integer_ord_ore, b jsonb) function eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore) +function eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore_query) +function eql_v3.neq(a public.integer_ord_ore_query, b public.integer_ord_ore) +function eql_v3.neq(a public.integer_ord_query, b public.integer_ord) function eql_v3.neq(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.neq(a public.numeric_eq, b jsonb) function eql_v3.neq(a public.numeric_eq, b public.numeric_eq) +function eql_v3.neq(a public.numeric_eq, b public.numeric_eq_query) +function eql_v3.neq(a public.numeric_eq_query, b public.numeric_eq) function eql_v3.neq(a public.numeric_ord, b jsonb) function eql_v3.neq(a public.numeric_ord, b public.numeric_ord) +function eql_v3.neq(a public.numeric_ord, b public.numeric_ord_query) function eql_v3.neq(a public.numeric_ord_ope, b jsonb) function eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +function eql_v3.neq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) function eql_v3.neq(a public.numeric_ord_ore, b jsonb) function eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +function eql_v3.neq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +function eql_v3.neq(a public.numeric_ord_query, b public.numeric_ord) function eql_v3.neq(a public.real_eq, b jsonb) function eql_v3.neq(a public.real_eq, b public.real_eq) +function eql_v3.neq(a public.real_eq, b public.real_eq_query) +function eql_v3.neq(a public.real_eq_query, b public.real_eq) function eql_v3.neq(a public.real_ord, b jsonb) function eql_v3.neq(a public.real_ord, b public.real_ord) +function eql_v3.neq(a public.real_ord, b public.real_ord_query) function eql_v3.neq(a public.real_ord_ope, b jsonb) function eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope_query) +function eql_v3.neq(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.neq(a public.real_ord_ore, b jsonb) function eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore_query) +function eql_v3.neq(a public.real_ord_ore_query, b public.real_ord_ore) +function eql_v3.neq(a public.real_ord_query, b public.real_ord) function eql_v3.neq(a public.smallint_eq, b jsonb) function eql_v3.neq(a public.smallint_eq, b public.smallint_eq) +function eql_v3.neq(a public.smallint_eq, b public.smallint_eq_query) +function eql_v3.neq(a public.smallint_eq_query, b public.smallint_eq) function eql_v3.neq(a public.smallint_ord, b jsonb) function eql_v3.neq(a public.smallint_ord, b public.smallint_ord) +function eql_v3.neq(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.neq(a public.smallint_ord_ope, b jsonb) function eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +function eql_v3.neq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.neq(a public.smallint_ord_ore, b jsonb) function eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +function eql_v3.neq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +function eql_v3.neq(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.neq(a public.text_eq, b jsonb) function eql_v3.neq(a public.text_eq, b public.text_eq) +function eql_v3.neq(a public.text_eq, b public.text_eq_query) +function eql_v3.neq(a public.text_eq_query, b public.text_eq) function eql_v3.neq(a public.text_ord, b jsonb) function eql_v3.neq(a public.text_ord, b public.text_ord) +function eql_v3.neq(a public.text_ord, b public.text_ord_query) function eql_v3.neq(a public.text_ord_ope, b jsonb) function eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope_query) +function eql_v3.neq(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.neq(a public.text_ord_ore, b jsonb) function eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore_query) +function eql_v3.neq(a public.text_ord_ore_query, b public.text_ord_ore) +function eql_v3.neq(a public.text_ord_query, b public.text_ord) function eql_v3.neq(a public.text_search, b jsonb) function eql_v3.neq(a public.text_search, b public.text_search) +function eql_v3.neq(a public.text_search, b public.text_search_query) +function eql_v3.neq(a public.text_search_query, b public.text_search) function eql_v3.neq(a public.timestamp_eq, b jsonb) function eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq) +function eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq_query) +function eql_v3.neq(a public.timestamp_eq_query, b public.timestamp_eq) function eql_v3.neq(a public.timestamp_ord, b jsonb) function eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.neq(a public.timestamp_ord_ope, b jsonb) function eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +function eql_v3.neq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.neq(a public.timestamp_ord_ore, b jsonb) function eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +function eql_v3.neq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +function eql_v3.neq(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.ord_ope_term(a public.bigint_ord_ope) +function eql_v3.ord_ope_term(a public.bigint_ord_ope_query) function eql_v3.ord_ope_term(a public.date_ord_ope) +function eql_v3.ord_ope_term(a public.date_ord_ope_query) function eql_v3.ord_ope_term(a public.double_ord_ope) +function eql_v3.ord_ope_term(a public.double_ord_ope_query) function eql_v3.ord_ope_term(a public.integer_ord_ope) +function eql_v3.ord_ope_term(a public.integer_ord_ope_query) function eql_v3.ord_ope_term(a public.numeric_ord_ope) +function eql_v3.ord_ope_term(a public.numeric_ord_ope_query) function eql_v3.ord_ope_term(a public.real_ord_ope) +function eql_v3.ord_ope_term(a public.real_ord_ope_query) function eql_v3.ord_ope_term(a public.smallint_ord_ope) +function eql_v3.ord_ope_term(a public.smallint_ord_ope_query) function eql_v3.ord_ope_term(a public.text_ord_ope) +function eql_v3.ord_ope_term(a public.text_ord_ope_query) function eql_v3.ord_ope_term(a public.timestamp_ord_ope) +function eql_v3.ord_ope_term(a public.timestamp_ord_ope_query) function eql_v3.ord_term(a public.bigint_ord) function eql_v3.ord_term(a public.bigint_ord_ore) +function eql_v3.ord_term(a public.bigint_ord_ore_query) +function eql_v3.ord_term(a public.bigint_ord_query) function eql_v3.ord_term(a public.date_ord) function eql_v3.ord_term(a public.date_ord_ore) +function eql_v3.ord_term(a public.date_ord_ore_query) +function eql_v3.ord_term(a public.date_ord_query) function eql_v3.ord_term(a public.double_ord) function eql_v3.ord_term(a public.double_ord_ore) +function eql_v3.ord_term(a public.double_ord_ore_query) +function eql_v3.ord_term(a public.double_ord_query) function eql_v3.ord_term(a public.integer_ord) function eql_v3.ord_term(a public.integer_ord_ore) +function eql_v3.ord_term(a public.integer_ord_ore_query) +function eql_v3.ord_term(a public.integer_ord_query) function eql_v3.ord_term(a public.numeric_ord) function eql_v3.ord_term(a public.numeric_ord_ore) +function eql_v3.ord_term(a public.numeric_ord_ore_query) +function eql_v3.ord_term(a public.numeric_ord_query) function eql_v3.ord_term(a public.real_ord) function eql_v3.ord_term(a public.real_ord_ore) +function eql_v3.ord_term(a public.real_ord_ore_query) +function eql_v3.ord_term(a public.real_ord_query) function eql_v3.ord_term(a public.smallint_ord) function eql_v3.ord_term(a public.smallint_ord_ore) +function eql_v3.ord_term(a public.smallint_ord_ore_query) +function eql_v3.ord_term(a public.smallint_ord_query) function eql_v3.ord_term(a public.text_ord) function eql_v3.ord_term(a public.text_ord_ore) +function eql_v3.ord_term(a public.text_ord_ore_query) +function eql_v3.ord_term(a public.text_ord_query) function eql_v3.ord_term(a public.text_search) +function eql_v3.ord_term(a public.text_search_query) function eql_v3.ord_term(a public.timestamp_ord) function eql_v3.ord_term(a public.timestamp_ord_ore) +function eql_v3.ord_term(a public.timestamp_ord_ore_query) +function eql_v3.ord_term(a public.timestamp_ord_query) function eql_v3.ore_cllw(entry public.jsonb_entry) function eql_v3.selector(entry public.jsonb_entry) function eql_v3.selector(val jsonb) From 1fe716772373d42889b982bcac72119f90292add Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 16:20:11 +1000 Subject: [PATCH 545/599] test(eql v3): cover every scalar query-operand domain in the matrix (CIP-3432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends the shared oracle engine so EVERY generated `_query` domain is exercised against real ciphertext, across all scalar types — folded into existing round trips (no added DB load, no new flakiness): - assert_eq_oracle / assert_ord_oracle: each all-pairs SELECT now also drives the term-only query operand (payload minus `c`) through the `(storage, _query)` operators, both directions. Covers _eq_query, _ord_query, _ord_ore_query for all 9 families in BOTH the fixture and e2e (fresh-encryption) suites. - Overload::DomainQuery: a fourth named-function overload (RHS = _query), reaching text_search_query, which the operator oracle (text runs via _eq/_ord/_ord_ore) never touches. - assert_match_smoke: four query-operand containment rows cover text_match_query (`contains`/`contained_by` with a bloom needle). - ope_ord_fixture_smoke!: each range/equality predicate also runs against the term-only operand, covering _ord_ope_query for all families. jsonb_query already has semantic coverage (v3_jsonb_tests D4). With the standalone fresh-encryption conformance, all 38 scalar query domains + jsonb_query are now tested. Full fixture oracle suite: 42 passed. CIP-3432 --- tests/sqlx/src/property.rs | 140 ++++++++++++++++-- .../tests/encrypted_domain/ope/support.rs | 46 ++++-- .../tests/v3_scalar_query_operand_tests.rs | 5 +- 3 files changed, 162 insertions(+), 29 deletions(-) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index 5186d3169..cf4b04848 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -57,13 +57,19 @@ pub struct Row { pub payload_json: String, } -/// One ordering-oracle result row: `(lt, lte, gt, gte, ord_term_lt)` for a pair. +/// One ordering-oracle result row for a pair: the storage operators +/// `(lt, lte, gt, gte, ord_term_lt)` followed by the CIP-3432 query-operand +/// operators `(lt_q, lte_q, gt_q, gte_q)`. type OrdRow = ( Option, Option, Option, Option, Option, + Option, + Option, + Option, + Option, ); /// Cast a JSON text literal into a domain value: `''::jsonb::`. @@ -78,6 +84,23 @@ fn jsonb(payload_json: &str) -> String { format!("'{}'::jsonb", payload_json.replace('\'', "''")) } +/// Cast a JSON text literal into a QUERY-operand value: strip the ciphertext +/// `c` (a query operand carries index terms only) and cast to `_query`. +/// This is exactly what a client sends — the stored envelope minus `c` — and +/// the RHS the `(storage, _query)` query operators consume (CIP-3432). +fn query_cast(payload_json: &str, domain: &str) -> String { + let mut v: serde_json::Value = + serde_json::from_str(payload_json).expect("payload_json is valid JSON"); + if let Some(obj) = v.as_object_mut() { + obj.remove("c"); + } + format!( + "'{}'::jsonb::{}_query", + v.to_string().replace('\'', "''"), + domain + ) +} + /// Equality oracle: for every ordered pair `(a, b)` in `rows`, /// `a = b` (SQL, on the `_eq` domain) ⇔ `a.plaintext == b.plaintext`, and /// `a <> b` is its negation. @@ -86,12 +109,25 @@ pub async fn assert_eq_oracle(pool: &PgPool, rows: &[Row]) -> for a in rows { for b in rows { let want = a.plaintext == b.plaintext; + let a_dom = cast(&a.payload_json, &domain); + let b_dom = cast(&b.payload_json, &domain); + // CIP-3432: the SAME pair also exercises the term-only query operand + // (the stored payload minus its ciphertext `c`) through the + // `(storage, _query)` operators, in both directions — folded + // into this one round trip so query coverage adds no DB load. + let a_qry = query_cast(&a.payload_json, &domain); + let b_qry = query_cast(&b.payload_json, &domain); let sql = format!( - "SELECT ({a_cast}) = ({b_cast}), ({a_cast}) <> ({b_cast})", - a_cast = cast(&a.payload_json, &domain), - b_cast = cast(&b.payload_json, &domain), + "SELECT ({a_dom}) = ({b_dom}), ({a_dom}) <> ({b_dom}), \ + ({a_dom}) = ({b_qry}), ({a_dom}) <> ({b_qry}), ({a_qry}) = ({b_dom})" ); - let (eq, neq): (Option, Option) = sqlx::query_as(&sql) + let (eq, neq, eq_q, neq_q, eq_qc): ( + Option, + Option, + Option, + Option, + Option, + ) = sqlx::query_as(&sql) .fetch_one(pool) .await .with_context(|| format!("eq-oracle pair query: {sql}"))?; @@ -108,6 +144,24 @@ pub async fn assert_eq_oracle(pool: &PgPool, rows: &[Row]) -> b.plaintext, !want ); + anyhow::ensure!( + eq_q == Some(want), + "query `=` mismatch on {domain}_query: {:?} vs {:?} want {want}, got {eq_q:?}", + a.plaintext, + b.plaintext + ); + anyhow::ensure!( + neq_q == Some(!want), + "query `<>` mismatch on {domain}_query: {:?} vs {:?}", + a.plaintext, + b.plaintext + ); + anyhow::ensure!( + eq_qc == Some(want), + "commutator query `=` mismatch on {domain}_query: {:?} vs {:?}", + a.plaintext, + b.plaintext + ); } } Ok(()) @@ -131,16 +185,23 @@ pub async fn assert_ord_oracle( for b in rows { let a_cast = cast(&a.payload_json, &domain); let b_cast = cast(&b.payload_json, &domain); + // CIP-3432: the term-only query operand for `b` (payload minus `c`), + // exercised through `(storage, _query)` ordering in the SAME + // round trip (no added DB load). + let b_qry = query_cast(&b.payload_json, &domain); let sql = format!( "SELECT ({a}) < ({b}), ({a}) <= ({b}), ({a}) > ({b}), ({a}) >= ({b}), \ - eql_v3.ord_term({a}) < eql_v3.ord_term({b})", + eql_v3.ord_term({a}) < eql_v3.ord_term({b}), \ + ({a}) < ({bq}), ({a}) <= ({bq}), ({a}) > ({bq}), ({a}) >= ({bq})", a = a_cast, b = b_cast, + bq = b_qry, ); - let (lt, lte, gt, gte, term_lt): OrdRow = sqlx::query_as(&sql) - .fetch_one(pool) - .await - .with_context(|| format!("ord-oracle pair query: {sql}"))?; + let (lt, lte, gt, gte, term_lt, lt_q, lte_q, gt_q, gte_q): OrdRow = + sqlx::query_as(&sql) + .fetch_one(pool) + .await + .with_context(|| format!("ord-oracle pair query: {sql}"))?; let pa = &a.plaintext; let pb = &b.plaintext; @@ -158,6 +219,22 @@ pub async fn assert_ord_oracle( term_lt == Some(pa < pb), "ord_term ordering mismatch on {domain}: {pa:?}<{pb:?}" ); + anyhow::ensure!( + lt_q == Some(pa < pb), + "query `<` mismatch on {domain}_query: {pa:?}<{pb:?}" + ); + anyhow::ensure!( + lte_q == Some(pa <= pb), + "query `<=` mismatch on {domain}_query: {pa:?}<={pb:?}" + ); + anyhow::ensure!( + gt_q == Some(pa > pb), + "query `>` mismatch on {domain}_query: {pa:?}>{pb:?}" + ); + anyhow::ensure!( + gte_q == Some(pa >= pb), + "query `>=` mismatch on {domain}_query: {pa:?}>={pb:?}" + ); } } Ok(()) @@ -173,23 +250,31 @@ pub enum Overload { DomainDomain, DomainJsonb, JsonbDomain, + /// CIP-3432: the RHS is the term-only query operand (`_query`, the + /// payload minus `c`) — the `(storage, _query)` function overload. The + /// facet that reaches `text_search_query`, which the operator oracle (which + /// runs text via `_eq`/`_ord`/`_ord_ore`, not `_search`) never touches. + DomainQuery, } impl Overload { - /// All three overloads, for the per-pair fan-out. - pub const ALL: [Overload; 3] = [ + /// All overloads, for the per-pair fan-out. + pub const ALL: [Overload; 4] = [ Overload::DomainDomain, Overload::DomainJsonb, Overload::JsonbDomain, + Overload::DomainQuery, ]; /// The `(left, right)` operand SQL expressions for JSON literals `la`/`lb`, - /// casting the domain side via [`cast`] and leaving the jsonb side bare. + /// casting the domain side via [`cast`] and leaving the jsonb side bare (or, + /// for `DomainQuery`, casting the RHS to the term-only query domain). fn operands(self, la: &str, lb: &str, domain: &str) -> (String, String) { match self { Overload::DomainDomain => (cast(la, domain), cast(lb, domain)), Overload::DomainJsonb => (cast(la, domain), jsonb(lb)), Overload::JsonbDomain => (jsonb(la), cast(lb, domain)), + Overload::DomainQuery => (cast(la, domain), query_cast(lb, domain)), } } } @@ -416,10 +501,15 @@ pub async fn assert_match_smoke( let haystack = cast(haystack_json, domain); let needle = cast(needle_json, domain); let disjoint = cast(disjoint_json, domain); + // CIP-3432: the term-only query operands (bloom `bf`, no ciphertext `c`), + // consumed by the `(text_match, text_match_query)` containment operators. + let needle_q = query_cast(needle_json, domain); + let disjoint_q = query_cast(disjoint_json, domain); // `contains(a, b)` = `match_term(a) @> match_term(b)` (a's bits ⊇ b's); - // `contained_by` is its mirror. Each row: (label, sql, expected). - let cases: [(&str, String, bool); 6] = [ + // `contained_by` is its mirror. Each row: (label, sql, expected). The last + // four rows drive the same containment through a term-only query operand. + let cases: [(&str, String, bool); 10] = [ ( "contains(haystack, needle)", format!("eql_v3.contains({haystack}, {needle})"), @@ -450,6 +540,26 @@ pub async fn assert_match_smoke( format!("eql_v3.contained_by({disjoint}, {haystack})"), false, ), + ( + "contains(haystack, needle_query) [CIP-3432]", + format!("eql_v3.contains({haystack}, {needle_q})"), + true, + ), + ( + "contains(haystack, disjoint_query) [CIP-3432]", + format!("eql_v3.contains({haystack}, {disjoint_q})"), + false, + ), + ( + "contained_by(needle_query, haystack) [CIP-3432]", + format!("eql_v3.contained_by({needle_q}, {haystack})"), + true, + ), + ( + "contained_by(disjoint_query, haystack) [CIP-3432]", + format!("eql_v3.contained_by({disjoint_q}, {haystack})"), + false, + ), ]; let sql = format!( "SELECT {}", diff --git a/tests/sqlx/tests/encrypted_domain/ope/support.rs b/tests/sqlx/tests/encrypted_domain/ope/support.rs index fa13fbf37..a42ca510e 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/support.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/support.rs @@ -256,6 +256,23 @@ macro_rules! ope_ord_fixture_smoke { $domain ); + // CIP-3432: the term-only query operand — the pivot payload minus + // its ciphertext `c`, cast to `_query`. Every predicate must + // match the SAME oracle through the `(storage, _query)` + // operators as through the full-envelope operand. + let pivot_query_cast = { + let mut v: serde_json::Value = + serde_json::from_str(&pivot_json).expect("pivot payload is valid JSON"); + if let Some(o) = v.as_object_mut() { + o.remove("c"); + } + format!( + "'{}'::jsonb::public.{}_query", + v.to_string().replace('\'', "''"), + $domain + ) + }; + let values: Vec<$scalar> = <$scalar as ScalarType>::fixture_values().to_vec(); for op in ["<", "<=", ">", ">=", "=", "<>"] { let mut expected: Vec<$scalar> = values @@ -272,19 +289,22 @@ macro_rules! ope_ord_fixture_smoke { .cloned() .collect(); expected.sort(); - let sql = format!( - "SELECT plaintext FROM {table} \ - WHERE (payload)::public.{domain} {op} ({pivot_cast})", - domain = $domain, - ); - let mut actual: Vec<$scalar> = sqlx::query_scalar(&sql).fetch_all(&pool).await?; - actual.sort(); - assert_eq!( - actual, expected, - "{}: `{op}` against the real mid-pivot ciphertext must \ - match the plaintext oracle (SQL: {sql})", - $domain - ); + for (label, rhs) in [("storage", &pivot_cast), ("query", &pivot_query_cast)] { + let sql = format!( + "SELECT plaintext FROM {table} \ + WHERE (payload)::public.{domain} {op} ({rhs})", + domain = $domain, + ); + let mut actual: Vec<$scalar> = + sqlx::query_scalar(&sql).fetch_all(&pool).await?; + actual.sort(); + assert_eq!( + actual, expected, + "{}: `{op}` against the real mid-pivot ciphertext ({label} operand) \ + must match the plaintext oracle (SQL: {sql})", + $domain + ); + } } Ok(()) } diff --git a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs index a2798d382..0f4a72f47 100644 --- a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs +++ b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs @@ -112,7 +112,10 @@ async fn ord_term_only_operand_orders_via_the_ore_operator(pool: PgPool) -> Resu .bind(operand.to_string()) .fetch_one(&pool) .await?; - assert_eq!(above, 2, "`25 > val` resolves the commutator and matches 10, 20"); + assert_eq!( + above, 2, + "`25 > val` resolves the commutator and matches 10, 20" + ); Ok(()) } From 9a89fc938187bc27dfea1f0ba83d2843932c6375 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 16:26:59 +1000 Subject: [PATCH 546/599] style(eql-codegen): rustfmt the query render functions (CIP-3432) --- crates/eql-codegen/src/generate.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 7f5b8430f..0d3b38ea4 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -227,8 +227,20 @@ pub fn render_query_functions_file(family_name: &str, domain: &Domain) -> String } let extractor = Term::extractor_for_operator(domain.terms, op.symbol) .expect("a supported operator resolves an extractor"); - entries.push(wrapper_entry(&query_dom, op, &storage_dom, &query_dom, extractor)); - entries.push(wrapper_entry(&query_dom, op, &query_dom, &storage_dom, extractor)); + entries.push(wrapper_entry( + &query_dom, + op, + &storage_dom, + &query_dom, + extractor, + )); + entries.push(wrapper_entry( + &query_dom, + op, + &query_dom, + &storage_dom, + extractor, + )); } let ctx = FunctionsContext { @@ -551,7 +563,12 @@ mod tests { } // Query-operand functions/operators for the term-bearing domains only // (not the storage-only bare `integer`). - for dom in ["integer_eq", "integer_ord_ore", "integer_ord", "integer_ord_ope"] { + for dom in [ + "integer_eq", + "integer_ord_ore", + "integer_ord", + "integer_ord_ope", + ] { assert!(names.contains(&format!("{dom}_query_functions.sql"))); assert!(names.contains(&format!("{dom}_query_operators.sql"))); } From 13e1a3d234d8cdf5f92e69795e6414c44eccefcc Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 16:53:09 +1000 Subject: [PATCH 547/599] test(eql v3): matrix planner_metadata counts the query operators (CIP-3432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new (storage, _query) + commutator operators add 2 arg shapes per operator, so every term-bearing domain now has ops×5 operators (3 storage + 2 query), not ops×3. CI's SQLx shards caught this. Verified: planner_metadata 48/48 pass. --- tests/sqlx/src/matrix.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index cdf00d7f7..f2b23b3bc 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1505,10 +1505,15 @@ macro_rules! __scalar_matrix_planner_metadata_case { let rows: Vec<(String, String, String, bool, bool, bool, bool)> = sqlx::query_as(&sql).fetch_all(&pool).await?; - let expected = ops.len() * 3; + // 5 arg shapes per operator: the 3 storage shapes — (d,d), + // (d,jsonb), (jsonb,d) — plus the 2 CIP-3432 query-operand shapes + // — (d, d_query), (d_query, d). Every term-bearing domain the + // planner-metadata suite runs on has a `_query` twin, so + // the count is uniformly ops x 5. + let expected = ops.len() * 5; anyhow::ensure!( rows.len() == expected, - "expected {expected} rows ({n_ops} ops x 3 arg shapes) on {d}, got {got}", + "expected {expected} rows ({n_ops} ops x 5 arg shapes: 3 storage + 2 query) on {d}, got {got}", n_ops = ops.len(), got = rows.len(), ); From f677e9aebbe469c9754ecb4d50d2f370bea8b13c Mon Sep 17 00:00:00 2001 From: James Sadler Date: Tue, 7 Jul 2026 16:53:09 +1000 Subject: [PATCH 548/599] =?UTF-8?q?docs(eql=20v3):=20address=20review=20?= =?UTF-8?q?=E2=80=94=20query-twin=20blocker=20rationale=20+=20cast=20note?= =?UTF-8?q?=20(CIP-3432)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - generate.rs: comment in render_query_functions_file explaining why query twins emit no blockers (the realistic coloperand path is covered by the storage domain's jsonb blockers; blocking operandoperand would be the full matrix for zero real-world coverage). [review finding #1] - query_types.sql.j2: @note that query operands must be cast to their _query domain in a predicate (uncast literal RHS is ambiguous with the jsonb overload). [review finding #3] --- crates/eql-codegen/src/generate.rs | 9 +++++++++ crates/eql-codegen/templates/query_types.sql.j2 | 4 ++++ src/v3/scalars/bigint/bigint_query_types.sql | 4 ++++ src/v3/scalars/date/date_query_types.sql | 4 ++++ src/v3/scalars/double/double_query_types.sql | 4 ++++ src/v3/scalars/integer/integer_query_types.sql | 4 ++++ src/v3/scalars/numeric/numeric_query_types.sql | 4 ++++ src/v3/scalars/real/real_query_types.sql | 4 ++++ src/v3/scalars/smallint/smallint_query_types.sql | 4 ++++ src/v3/scalars/text/text_query_types.sql | 4 ++++ src/v3/scalars/timestamp/timestamp_query_types.sql | 4 ++++ 11 files changed, 49 insertions(+) diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 0d3b38ea4..6951a3594 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -221,6 +221,15 @@ pub fn render_query_functions_file(family_name: &str, domain: &Domain) -> String // Comparison wrappers: (storage, query) and its (query, storage) commutator, // for supported operators only (a query operand is never sent for a blocked // operator). `is_supported(op) ⟹ extractor_for_operator is Some`. + // + // Query twins deliberately emit NO blockers (unlike the storage surface). A + // query operand only ever appears as the RHS of `col operand`, and for + // an unsupported `` that predicate resolves against the STORAGE domain's + // `(, jsonb)` blocker (the query operand degrades to its `jsonb` + // base), which raises — so the realistic path is already protected. The only + // unblocked cases are nonsensical `operand operand` / `operand + // jsonb`, which no caller writes; blocking them would mean emitting the full + // blocker matrix against every query twin for zero real-world coverage. for op in OPERATORS { if !supported.contains(&op.symbol) { continue; diff --git a/crates/eql-codegen/templates/query_types.sql.j2 b/crates/eql-codegen/templates/query_types.sql.j2 index c600770ad..8c427a8ab 100644 --- a/crates/eql-codegen/templates/query_types.sql.j2 +++ b/crates/eql-codegen/templates/query_types.sql.j2 @@ -3,6 +3,10 @@ --! @file v3/scalars/{{ family_name }}/{{ family_name }}_query_types.sql --! @brief Query-operand domains for {{ family_name }} (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.{{ family_name }}_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/bigint/bigint_query_types.sql b/src/v3/scalars/bigint/bigint_query_types.sql index 1d995bf0f..1d24d71a1 100644 --- a/src/v3/scalars/bigint/bigint_query_types.sql +++ b/src/v3/scalars/bigint/bigint_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/bigint/bigint_query_types.sql --! @brief Query-operand domains for bigint (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.bigint_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/date/date_query_types.sql b/src/v3/scalars/date/date_query_types.sql index d02dac1cb..df72d8e43 100644 --- a/src/v3/scalars/date/date_query_types.sql +++ b/src/v3/scalars/date/date_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/date/date_query_types.sql --! @brief Query-operand domains for date (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.date_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/double/double_query_types.sql b/src/v3/scalars/double/double_query_types.sql index 49c82a1f7..74d4a209f 100644 --- a/src/v3/scalars/double/double_query_types.sql +++ b/src/v3/scalars/double/double_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/double/double_query_types.sql --! @brief Query-operand domains for double (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.double_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/integer/integer_query_types.sql b/src/v3/scalars/integer/integer_query_types.sql index 0578ef0cd..570ed6339 100644 --- a/src/v3/scalars/integer/integer_query_types.sql +++ b/src/v3/scalars/integer/integer_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/integer/integer_query_types.sql --! @brief Query-operand domains for integer (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.integer_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/numeric/numeric_query_types.sql b/src/v3/scalars/numeric/numeric_query_types.sql index 9ade8f12e..80884d1b0 100644 --- a/src/v3/scalars/numeric/numeric_query_types.sql +++ b/src/v3/scalars/numeric/numeric_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/numeric/numeric_query_types.sql --! @brief Query-operand domains for numeric (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.numeric_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/real/real_query_types.sql b/src/v3/scalars/real/real_query_types.sql index 698652948..20c71fe1f 100644 --- a/src/v3/scalars/real/real_query_types.sql +++ b/src/v3/scalars/real/real_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/real/real_query_types.sql --! @brief Query-operand domains for real (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.real_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/smallint/smallint_query_types.sql b/src/v3/scalars/smallint/smallint_query_types.sql index 35bcce7e4..8a47fbcad 100644 --- a/src/v3/scalars/smallint/smallint_query_types.sql +++ b/src/v3/scalars/smallint/smallint_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/smallint/smallint_query_types.sql --! @brief Query-operand domains for smallint (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.smallint_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/text/text_query_types.sql b/src/v3/scalars/text/text_query_types.sql index 2214e3238..00150db4b 100644 --- a/src/v3/scalars/text/text_query_types.sql +++ b/src/v3/scalars/text/text_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/text/text_query_types.sql --! @brief Query-operand domains for text (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.text_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN diff --git a/src/v3/scalars/timestamp/timestamp_query_types.sql b/src/v3/scalars/timestamp/timestamp_query_types.sql index 9c440e0a9..0bf9a6188 100644 --- a/src/v3/scalars/timestamp/timestamp_query_types.sql +++ b/src/v3/scalars/timestamp/timestamp_query_types.sql @@ -3,6 +3,10 @@ --! @file v3/scalars/timestamp/timestamp_query_types.sql --! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). +--! @note Cast a query operand explicitly to its `_query` domain in a predicate +--! (e.g. `WHERE col = $1::public.timestamp_eq_query`). A bare, +--! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! operator overloads and will not resolve. DO $$ BEGIN From c8a93db6d099967a440ba5304a07aafe4da59d37 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 7 Jul 2026 18:05:27 +1000 Subject: [PATCH 549/599] fix(v3): install SEM btree operator classes conditionally (Supabase / non-superuser) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CREATE OPERATOR FAMILY / CLASS require superuser, so the single-transaction eql_v3 installer aborted at the first CREATE OPERATOR FAMILY on Supabase and other managed Postgres (SQLSTATE 42501, "must be superuser"), leaving eql_v3 uninstallable there despite the surface being otherwise managed-Postgres compatible. Wrap both src/v3/sem/*/operator_class.sql family+class creations in a DO block that catches insufficient_privilege and continues with a NOTICE. One artifact now installs everywhere: superuser installs create the default btree opclass as before (self-managed PG, SQLx matrix); non-superuser installs skip it and fall back to the OPE ordering domains, whose extractor return types carry a native btree opclass. Non-privilege errors still propagate. Also removes stale in-file comments claiming these files were excluded by a `**/*operator_class.sql` build glob — the v3 build globs src/v3 wholesale. Verified: live Supabase (both skipped, install commits, 0 opclasses, 36 OPE domains) and a local superuser cluster (both opclasses created). --- CHANGELOG.md | 1 + src/v3/sem/ore_block_256/operator_class.sql | 40 ++++++++++++++----- src/v3/sem/ore_cllw/operator_class.sql | 44 +++++++++++++++------ 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 152169529..e65613c5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). ### Fixed +- **The `eql_v3` installer now runs on managed Postgres without superuser — the two SEM btree operator classes install conditionally.** `release/cipherstash-encrypt.sql` created `eql_v3_internal.ore_block_256_operator_class` and `eql_v3_internal.ore_cllw_ops` with bare `CREATE OPERATOR FAMILY` / `CREATE OPERATOR CLASS`, which PostgreSQL restricts to superusers. On Supabase (and most hosted Postgres), the installer runs as a non-superuser role, so the whole single-transaction install aborted at the first `CREATE OPERATOR FAMILY` with `must be superuser to create an operator family` (SQLSTATE `42501`) — leaving `eql_v3` uninstallable there despite the surface being otherwise managed-Postgres compatible. Both `operator_class.sql` files now wrap their family+class creation in a `DO` block that catches `insufficient_privilege` and continues with a `NOTICE`, so one artifact installs everywhere: superuser installs (self-managed Postgres, the SQLx test matrix) create the default btree opclass as before; non-superuser installs skip it and fall back to the order-preserving (OPE) ordering domains, whose extractor return types carry a native btree opclass and need no custom class. Any non-privilege error from the DDL still propagates. Verified end-to-end against live Supabase (skips, install commits, 0 opclasses) and a local superuser cluster (creates both opclasses). Also corrects the stale in-file comments claiming these files were excluded by a `**/*operator_class.sql` build glob — the v3 build (`tasks/build.sh`) globs `src/v3` wholesale and has no such exclusion. - **`eql_v3.jsonb_entry` CHECK inlined; `jsonb_query` validator converted to plpgsql — removes SQL-function-executor overhead from the per-query needle casts.** Domain constraints cannot inline SQL functions, so `jsonb_entry`'s function-call CHECK paid ~18 µs on every cast — the needle cast in every `field_eq` query was the ENTIRE +19% v2→v3 regression on that scenario (in-DB 0.011 → 0.029 ms/query with identical `eq_term` costs; cipherstash/benches#23). The `jsonb_entry` CHECK now mirrors the validator body inline, with a leading `VALUE IS NULL OR` preserving STRICT NULL-passes semantics (equivalence pinned over a payload corpus by `jsonb_check::jsonb_entry_check_matches_validator`). `jsonb_query`'s CHECK cannot be inlined — validating sv elements needs a subquery, which CHECK constraints forbid — so `is_valid_ste_vec_query_payload` is plpgsql instead (cached plan vs per-call SQL-function executor; the #353 finding), guarded by `jsonb_check::jsonb_query_validator_is_plpgsql`. The `eql_v3.json` document CHECK — part of the documented privilege contract — is unchanged; `docs/reference/permissions.md` now notes the `jsonb_entry` cast requires no internal grant. ([#354](https://github.com/cipherstash/encrypt-query-language/issues/354)) - **`ore_block_256` opclass-path helpers converted from `LANGUAGE sql` to plpgsql — restores v2-level ordered-scan performance.** `eql_v3_internal.jsonb_array_to_bytea_array` and `eql_v3_internal.jsonb_array_to_ore_block_256` were `LANGUAGE sql` for inlineability, but their only caller chain (`ore_block_256(val)`, plpgsql, feeding the btree operator class) can never inline SQL functions — every compared value paid the per-call SQL-function executor instead, measured at 3.5× the per-call cost of the logic-identical plpgsql form. Release benchmarks put the end-to-end cost at +43% on ORE ordered index scans vs EQL 2.3 (`0.513 → 0.736 ms` at 1M rows) and +36% on the composite bloom+ORE-order shape (`16.6 → 22.7 ms`); with the plpgsql form both scenarios return to (or beat) the v2 numbers — `0.553 ms` and `13.97 ms` respectively, validated A→B→A on a live 1M-row bench database. Semantics are unchanged: NULL/non-array inputs still return NULL, and the empty-`ob` COALESCE (#262) is preserved. The `eql-inline-critical` markers are retained so the pin_search_path pass keeps both functions unpinned — a `SET search_path` clause on plpgsql forces per-call configuration switching in the same hot path. Full attribution and experiment data: cipherstash/benches#23 (`v3-regressions-report.md`). ([#353](https://github.com/cipherstash/encrypt-query-language/issues/353)) diff --git a/src/v3/sem/ore_block_256/operator_class.sql b/src/v3/sem/ore_block_256/operator_class.sql index f36cb3d47..55933fd9d 100644 --- a/src/v3/sem/ore_block_256/operator_class.sql +++ b/src/v3/sem/ore_block_256/operator_class.sql @@ -8,20 +8,40 @@ --! --! Gives the composite type its DEFAULT btree opclass so the recommended --! functional index `CREATE INDEX ON t (eql_v3_internal.ord_term(col))` engages without ---! an explicit opclass annotation (design D4). Excluded from the Supabase build ---! variant by the `**/*operator_class.sql` glob. +--! an explicit opclass annotation (design D4). +--! +--! @note Creating an operator family/class requires superuser: Postgres forbids +--! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index +--! integrity. Managed platforms (Supabase, and most hosted Postgres) run +--! the installer as a non-superuser role, so the DO block below ATTEMPTS +--! the creation and skips it on insufficient_privilege (SQLSTATE 42501), +--! letting the single installer run everywhere. When the class is absent, +--! ORE ordered scans over eql_v3_internal.ore_block_256 are unavailable, +--! but the order-preserving (OPE) ordering domains — whose extractor +--! return types carry a native btree opclass — still index without it. On +--! superuser installs (self-managed Postgres, the SQLx test matrix) the +--! class is created normally. Any non-privilege error still propagates. +--! @see eql_v3_internal.compare_ore_block_256_terms ---! @brief B-tree operator family for ORE block types -CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree; +DO $do$ +BEGIN + EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree'; ---! @brief B-tree operator class for ORE block encrypted values ---! ---! Supports operators: <, <=, =, >=, >. Uses comparison function ---! compare_ore_block_256_terms. -CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class DEFAULT FOR TYPE eql_v3_internal.ore_block_256 USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS + EXECUTE $ddl$ + CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class + DEFAULT FOR TYPE eql_v3_internal.ore_block_256 + USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS OPERATOR 1 public.<, OPERATOR 2 public.<=, OPERATOR 3 public.=, OPERATOR 4 public.>=, OPERATOR 5 public.>, - FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256); + FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256) + $ddl$; + + RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_block_256_operator_class'; +EXCEPTION + WHEN insufficient_privilege THEN + RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_block_256_operator_class (requires superuser); ORE ordered indexes on ore_block_256 unavailable, OPE ordering domains unaffected'; +END; +$do$; diff --git a/src/v3/sem/ore_cllw/operator_class.sql b/src/v3/sem/ore_cllw/operator_class.sql index 854bd9455..7b5419ec2 100644 --- a/src/v3/sem/ore_cllw/operator_class.sql +++ b/src/v3/sem/ore_cllw/operator_class.sql @@ -12,18 +12,38 @@ --! CLLW protocol needs iteration) and is called once per index-entry pair --! during build / search, not per-row in the outer query. --! ---! @note Excluded from the Supabase build variant by the build glob ---! `**/*operator_class.sql`. +--! @note Creating an operator family/class requires superuser: Postgres forbids +--! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index +--! integrity. Managed platforms (Supabase, and most hosted Postgres) run +--! the installer as a non-superuser role, so the DO block below ATTEMPTS +--! the creation and skips it on insufficient_privilege (SQLSTATE 42501), +--! letting the single installer run everywhere. When the class is absent, +--! ORE ordered scans over eql_v3_internal.ore_cllw are unavailable, but +--! the order-preserving (OPE) ordering domains — whose extractor return +--! types carry a native btree opclass — still index without it. On +--! superuser installs (self-managed Postgres, the SQLx test matrix) the +--! class is created normally. Any non-privilege error still propagates. --! @see eql_v3_internal.compare_ore_cllw_term -CREATE OPERATOR FAMILY eql_v3_internal.ore_cllw_ops USING btree; +DO $do$ +BEGIN + EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_cllw_ops USING btree'; -CREATE OPERATOR CLASS eql_v3_internal.ore_cllw_ops - DEFAULT FOR TYPE eql_v3_internal.ore_cllw - USING btree FAMILY eql_v3_internal.ore_cllw_ops AS - OPERATOR 1 public.< (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 2 public.<= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 3 public.= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 4 public.>= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 5 public.> (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - FUNCTION 1 eql_v3_internal.compare_ore_cllw_term(eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw); + EXECUTE $ddl$ + CREATE OPERATOR CLASS eql_v3_internal.ore_cllw_ops + DEFAULT FOR TYPE eql_v3_internal.ore_cllw + USING btree FAMILY eql_v3_internal.ore_cllw_ops AS + OPERATOR 1 public.< (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), + OPERATOR 2 public.<= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), + OPERATOR 3 public.= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), + OPERATOR 4 public.>= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), + OPERATOR 5 public.> (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), + FUNCTION 1 eql_v3_internal.compare_ore_cllw_term(eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw) + $ddl$; + + RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_cllw_ops'; +EXCEPTION + WHEN insufficient_privilege THEN + RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_cllw_ops (requires superuser); ORE ordered indexes on ore_cllw unavailable, OPE ordering domains unaffected'; +END; +$do$; From 51fbf68ff3843e7d42b7202e9295f4e5e79da4d0 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 7 Jul 2026 18:07:12 +1000 Subject: [PATCH 550/599] docs(changelog): link the conditional-opclass fix to #375 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e65613c5e..957c147e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,7 +73,7 @@ Each entry that ships in a published release links to the PR that introduced it. - **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent). ### Fixed -- **The `eql_v3` installer now runs on managed Postgres without superuser — the two SEM btree operator classes install conditionally.** `release/cipherstash-encrypt.sql` created `eql_v3_internal.ore_block_256_operator_class` and `eql_v3_internal.ore_cllw_ops` with bare `CREATE OPERATOR FAMILY` / `CREATE OPERATOR CLASS`, which PostgreSQL restricts to superusers. On Supabase (and most hosted Postgres), the installer runs as a non-superuser role, so the whole single-transaction install aborted at the first `CREATE OPERATOR FAMILY` with `must be superuser to create an operator family` (SQLSTATE `42501`) — leaving `eql_v3` uninstallable there despite the surface being otherwise managed-Postgres compatible. Both `operator_class.sql` files now wrap their family+class creation in a `DO` block that catches `insufficient_privilege` and continues with a `NOTICE`, so one artifact installs everywhere: superuser installs (self-managed Postgres, the SQLx test matrix) create the default btree opclass as before; non-superuser installs skip it and fall back to the order-preserving (OPE) ordering domains, whose extractor return types carry a native btree opclass and need no custom class. Any non-privilege error from the DDL still propagates. Verified end-to-end against live Supabase (skips, install commits, 0 opclasses) and a local superuser cluster (creates both opclasses). Also corrects the stale in-file comments claiming these files were excluded by a `**/*operator_class.sql` build glob — the v3 build (`tasks/build.sh`) globs `src/v3` wholesale and has no such exclusion. +- **The `eql_v3` installer now runs on managed Postgres without superuser — the two SEM btree operator classes install conditionally.** `release/cipherstash-encrypt.sql` created `eql_v3_internal.ore_block_256_operator_class` and `eql_v3_internal.ore_cllw_ops` with bare `CREATE OPERATOR FAMILY` / `CREATE OPERATOR CLASS`, which PostgreSQL restricts to superusers. On Supabase (and most hosted Postgres), the installer runs as a non-superuser role, so the whole single-transaction install aborted at the first `CREATE OPERATOR FAMILY` with `must be superuser to create an operator family` (SQLSTATE `42501`) — leaving `eql_v3` uninstallable there despite the surface being otherwise managed-Postgres compatible. Both `operator_class.sql` files now wrap their family+class creation in a `DO` block that catches `insufficient_privilege` and continues with a `NOTICE`, so one artifact installs everywhere: superuser installs (self-managed Postgres, the SQLx test matrix) create the default btree opclass as before; non-superuser installs skip it and fall back to the order-preserving (OPE) ordering domains, whose extractor return types carry a native btree opclass and need no custom class. Any non-privilege error from the DDL still propagates. Verified end-to-end against live Supabase (skips, install commits, 0 opclasses) and a local superuser cluster (creates both opclasses). Also corrects the stale in-file comments claiming these files were excluded by a `**/*operator_class.sql` build glob — the v3 build (`tasks/build.sh`) globs `src/v3` wholesale and has no such exclusion. ([#375](https://github.com/cipherstash/encrypt-query-language/pull/375)) - **`eql_v3.jsonb_entry` CHECK inlined; `jsonb_query` validator converted to plpgsql — removes SQL-function-executor overhead from the per-query needle casts.** Domain constraints cannot inline SQL functions, so `jsonb_entry`'s function-call CHECK paid ~18 µs on every cast — the needle cast in every `field_eq` query was the ENTIRE +19% v2→v3 regression on that scenario (in-DB 0.011 → 0.029 ms/query with identical `eq_term` costs; cipherstash/benches#23). The `jsonb_entry` CHECK now mirrors the validator body inline, with a leading `VALUE IS NULL OR` preserving STRICT NULL-passes semantics (equivalence pinned over a payload corpus by `jsonb_check::jsonb_entry_check_matches_validator`). `jsonb_query`'s CHECK cannot be inlined — validating sv elements needs a subquery, which CHECK constraints forbid — so `is_valid_ste_vec_query_payload` is plpgsql instead (cached plan vs per-call SQL-function executor; the #353 finding), guarded by `jsonb_check::jsonb_query_validator_is_plpgsql`. The `eql_v3.json` document CHECK — part of the documented privilege contract — is unchanged; `docs/reference/permissions.md` now notes the `jsonb_entry` cast requires no internal grant. ([#354](https://github.com/cipherstash/encrypt-query-language/issues/354)) - **`ore_block_256` opclass-path helpers converted from `LANGUAGE sql` to plpgsql — restores v2-level ordered-scan performance.** `eql_v3_internal.jsonb_array_to_bytea_array` and `eql_v3_internal.jsonb_array_to_ore_block_256` were `LANGUAGE sql` for inlineability, but their only caller chain (`ore_block_256(val)`, plpgsql, feeding the btree operator class) can never inline SQL functions — every compared value paid the per-call SQL-function executor instead, measured at 3.5× the per-call cost of the logic-identical plpgsql form. Release benchmarks put the end-to-end cost at +43% on ORE ordered index scans vs EQL 2.3 (`0.513 → 0.736 ms` at 1M rows) and +36% on the composite bloom+ORE-order shape (`16.6 → 22.7 ms`); with the plpgsql form both scenarios return to (or beat) the v2 numbers — `0.553 ms` and `13.97 ms` respectively, validated A→B→A on a live 1M-row bench database. Semantics are unchanged: NULL/non-array inputs still return NULL, and the empty-`ob` COALESCE (#262) is preserved. The `eql-inline-critical` markers are retained so the pin_search_path pass keeps both functions unpinned — a `SET search_path` clause on plpgsql forces per-call configuration switching in the same hot path. Full attribution and experiment data: cipherstash/benches#23 (`v3-regressions-report.md`). ([#353](https://github.com/cipherstash/encrypt-query-language/issues/353)) From 85c2178d05c99827d2a4c47b8baa4d72c63d5176 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 7 Jul 2026 18:59:04 +1000 Subject: [PATCH 551/599] feat(v3): COMMENT ON DOMAIN for every encrypted domain type The v3 encrypted domains are jsonb-backed, so introspection that resolves a domain to its base type (e.g. Supabase's table editor via postgres-meta) shows them as bare `jsonb` with no hint they are EQL encrypted columns. Attach a one-line COMMENT ON DOMAIN to every public encrypted domain so the type is self-documenting: visible via psql \dD, obj_description(), and any tool that reads pg_type comments (Supabase's types introspection surfaces it). Scalar domains: the comment is code-generated. A new DomainBlock.comment field derives capability text from the domain's terms (Term::operators_for_terms), so it tracks the generated CHECK/operator surface and can't drift; the DO-block templates emit COMMENT ON DOMAIN after each idempotent CREATE DOMAIN (re-applied on reinstall so comment-text changes propagate). Query-operand (_query) twins get a matching 'index terms only; no ciphertext' comment. The three hand-written jsonb SteVec domains (json / jsonb_entry / jsonb_query) get hand-written comments. No behaviour change; comments only. Generated SQL regenerated in place. --- crates/eql-codegen/src/context.rs | 33 +++++++++++++++++++ .../eql-codegen/templates/query_types.sql.j2 | 2 ++ crates/eql-codegen/templates/types.sql.j2 | 2 ++ src/v3/jsonb/types.sql | 6 ++++ src/v3/scalars/bigint/bigint_query_types.sql | 8 +++++ src/v3/scalars/bigint/bigint_types.sql | 10 ++++++ src/v3/scalars/boolean/boolean_types.sql | 2 ++ src/v3/scalars/date/date_query_types.sql | 8 +++++ src/v3/scalars/date/date_types.sql | 10 ++++++ src/v3/scalars/double/double_query_types.sql | 8 +++++ src/v3/scalars/double/double_types.sql | 10 ++++++ .../scalars/integer/integer_query_types.sql | 8 +++++ src/v3/scalars/integer/integer_types.sql | 10 ++++++ .../scalars/numeric/numeric_query_types.sql | 8 +++++ src/v3/scalars/numeric/numeric_types.sql | 10 ++++++ src/v3/scalars/real/real_query_types.sql | 8 +++++ src/v3/scalars/real/real_types.sql | 10 ++++++ .../scalars/smallint/smallint_query_types.sql | 8 +++++ src/v3/scalars/smallint/smallint_types.sql | 10 ++++++ src/v3/scalars/text/text_query_types.sql | 12 +++++++ src/v3/scalars/text/text_types.sql | 14 ++++++++ .../timestamp/timestamp_query_types.sql | 8 +++++ src/v3/scalars/timestamp/timestamp_types.sql | 10 ++++++ 23 files changed, 215 insertions(+) diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index febd19099..1162b4036 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -75,6 +75,37 @@ pub struct DomainBlock { // query operand is index-terms-only — CIP-3432). The template renders a // `NOT (VALUE ? k)` clause per key. pub forbidden_keys: Vec, + // sql_str-escaped one-line human description rendered as `COMMENT ON DOMAIN`. + // Capability text is derived from the domain's terms (via + // `Term::operators_for_terms`), so it can't drift from the generated CHECK / + // operators. Surfaced by `\dD`, `obj_description`, and tooling that reads + // pg_type comments (e.g. Supabase's `types` introspection). + pub comment: String, +} + +/// One-line description baked into `COMMENT ON DOMAIN` for a stored/searchable +/// encrypted domain. Capability is derived from the terms (term-agnostic via +/// `operators_for_terms`) so it tracks the generated surface automatically. +fn scalar_domain_comment(family_name: &str, domain: &Domain) -> String { + let ops = Term::operators_for_terms(domain.terms); + let capability = if ops.is_empty() { + "storage only, not searchable".to_string() + } else { + format!("searchable via {}", ops.join(" ")) + }; + sql_str(&format!( + "EQL v3 encrypted {family_name} column ({capability}). jsonb-backed CipherStash searchable-encryption domain." + )) +} + +/// `COMMENT ON DOMAIN` text for a `_query` operand twin: index-terms-only, no +/// ciphertext. +fn query_domain_comment(family_name: &str, domain: &Domain) -> String { + let ops = Term::operators_for_terms(domain.terms); + sql_str(&format!( + "EQL v3 query operand for encrypted {family_name} (searchable via {}). Index terms only; carries no ciphertext (c).", + ops.join(" ") + )) } #[derive(serde::Serialize)] @@ -107,6 +138,7 @@ pub fn domain_block(family_name: &str, domain: &Domain) -> DomainBlock { .collect(), // Storage domains forbid nothing; the query twin forbids `c`. forbidden_keys: vec![], + comment: scalar_domain_comment(family_name, domain), } } @@ -136,6 +168,7 @@ pub fn query_domain_block(family_name: &str, domain: &Domain) -> DomainBlock { .map(sql_str) .collect(), forbidden_keys: vec![sql_str("c")], + comment: query_domain_comment(family_name, domain), } } diff --git a/crates/eql-codegen/templates/query_types.sql.j2 b/crates/eql-codegen/templates/query_types.sql.j2 index 8c427a8ab..3a4d1725d 100644 --- a/crates/eql-codegen/templates/query_types.sql.j2 +++ b/crates/eql-codegen/templates/query_types.sql.j2 @@ -32,6 +32,8 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.{{ d.name }} IS '{{ d.comment }}'; {% endfor -%} END $$; diff --git a/crates/eql-codegen/templates/types.sql.j2 b/crates/eql-codegen/templates/types.sql.j2 index 71a2b27c1..cc854121c 100644 --- a/crates/eql-codegen/templates/types.sql.j2 +++ b/crates/eql-codegen/templates/types.sql.j2 @@ -25,6 +25,8 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.{{ d.name }} IS '{{ d.comment }}'; {% endfor -%} END $$; diff --git a/src/v3/jsonb/types.sql b/src/v3/jsonb/types.sql index ac91d74e4..1f4e28698 100644 --- a/src/v3/jsonb/types.sql +++ b/src/v3/jsonb/types.sql @@ -123,6 +123,8 @@ BEGIN public.eql_v3_is_valid_ste_vec_document_payload(VALUE) ); END IF; + + COMMENT ON DOMAIN public.json IS 'EQL v3 encrypted JSONB document (SteVec). Searchable without decryption via containment (@>, <@), field/array access, and per-leaf equality/order. jsonb-backed CipherStash searchable-encryption domain.'; END $$; @@ -172,6 +174,8 @@ BEGIN ) ); END IF; + + COMMENT ON DOMAIN public.jsonb_entry IS 'EQL v3 encrypted JSONB leaf entry (single sv element). Returned by ->; accepted by eql_v3.eq_term / eql_v3.ore_cllw for per-leaf equality and ordered search. jsonb-backed CipherStash searchable-encryption domain.'; END $$; @@ -208,6 +212,8 @@ BEGIN public.eql_v3_is_valid_ste_vec_query_payload(VALUE) ); END IF; + + COMMENT ON DOMAIN public.jsonb_query IS 'EQL v3 encrypted JSONB containment needle (query operand). Index terms only; carries no ciphertext (c). Right-hand side of @> / <@ containment. jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/bigint/bigint_query_types.sql b/src/v3/scalars/bigint/bigint_query_types.sql index 1d24d71a1..f7b553f80 100644 --- a/src/v3/scalars/bigint/bigint_query_types.sql +++ b/src/v3/scalars/bigint/bigint_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.bigint_eq_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.bigint_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.bigint_ord_ore_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.bigint_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.bigint_ord_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.bigint_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.bigint_ord_ope_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/bigint/bigint_types.sql b/src/v3/scalars/bigint/bigint_types.sql index 2597bd991..a065c4dfb 100644 --- a/src/v3/scalars/bigint/bigint_types.sql +++ b/src/v3/scalars/bigint/bigint_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.bigint IS 'EQL v3 encrypted bigint column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.bigint_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.bigint_eq IS 'EQL v3 encrypted bigint column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.bigint_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.bigint_ord_ore IS 'EQL v3 encrypted bigint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.bigint_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.bigint_ord IS 'EQL v3 encrypted bigint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.bigint_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.bigint_ord_ope IS 'EQL v3 encrypted bigint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/boolean/boolean_types.sql b/src/v3/scalars/boolean/boolean_types.sql index d61df957f..0aef95baa 100644 --- a/src/v3/scalars/boolean/boolean_types.sql +++ b/src/v3/scalars/boolean/boolean_types.sql @@ -20,5 +20,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.boolean IS 'EQL v3 encrypted boolean column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/date/date_query_types.sql b/src/v3/scalars/date/date_query_types.sql index df72d8e43..429fc50f5 100644 --- a/src/v3/scalars/date/date_query_types.sql +++ b/src/v3/scalars/date/date_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.date_eq_query IS 'EQL v3 query operand for encrypted date (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.date_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.date_ord_ore_query IS 'EQL v3 query operand for encrypted date (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.date_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.date_ord_query IS 'EQL v3 query operand for encrypted date (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.date_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.date_ord_ope_query IS 'EQL v3 query operand for encrypted date (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/date/date_types.sql b/src/v3/scalars/date/date_types.sql index 98cc6ebc2..c36dcac3b 100644 --- a/src/v3/scalars/date/date_types.sql +++ b/src/v3/scalars/date/date_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.date IS 'EQL v3 encrypted date column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.date_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.date_eq IS 'EQL v3 encrypted date column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.date_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.date_ord_ore IS 'EQL v3 encrypted date column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.date_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.date_ord IS 'EQL v3 encrypted date column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.date_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.date_ord_ope IS 'EQL v3 encrypted date column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/double/double_query_types.sql b/src/v3/scalars/double/double_query_types.sql index 74d4a209f..bdd948c4a 100644 --- a/src/v3/scalars/double/double_query_types.sql +++ b/src/v3/scalars/double/double_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.double_eq_query IS 'EQL v3 query operand for encrypted double (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.double_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.double_ord_ore_query IS 'EQL v3 query operand for encrypted double (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.double_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.double_ord_query IS 'EQL v3 query operand for encrypted double (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.double_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.double_ord_ope_query IS 'EQL v3 query operand for encrypted double (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/double/double_types.sql b/src/v3/scalars/double/double_types.sql index e51e0e428..430b24414 100644 --- a/src/v3/scalars/double/double_types.sql +++ b/src/v3/scalars/double/double_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.double IS 'EQL v3 encrypted double column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.double_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.double_eq IS 'EQL v3 encrypted double column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.double_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.double_ord_ore IS 'EQL v3 encrypted double column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.double_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.double_ord IS 'EQL v3 encrypted double column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.double_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.double_ord_ope IS 'EQL v3 encrypted double column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/integer/integer_query_types.sql b/src/v3/scalars/integer/integer_query_types.sql index 570ed6339..ddefd9df8 100644 --- a/src/v3/scalars/integer/integer_query_types.sql +++ b/src/v3/scalars/integer/integer_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.integer_eq_query IS 'EQL v3 query operand for encrypted integer (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.integer_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.integer_ord_ore_query IS 'EQL v3 query operand for encrypted integer (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.integer_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.integer_ord_query IS 'EQL v3 query operand for encrypted integer (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.integer_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.integer_ord_ope_query IS 'EQL v3 query operand for encrypted integer (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/integer/integer_types.sql b/src/v3/scalars/integer/integer_types.sql index 7f1cd577d..a875cb918 100644 --- a/src/v3/scalars/integer/integer_types.sql +++ b/src/v3/scalars/integer/integer_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.integer IS 'EQL v3 encrypted integer column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.integer_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.integer_eq IS 'EQL v3 encrypted integer column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.integer_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.integer_ord_ore IS 'EQL v3 encrypted integer column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.integer_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.integer_ord IS 'EQL v3 encrypted integer column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.integer_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.integer_ord_ope IS 'EQL v3 encrypted integer column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/numeric/numeric_query_types.sql b/src/v3/scalars/numeric/numeric_query_types.sql index 80884d1b0..1c5529bb0 100644 --- a/src/v3/scalars/numeric/numeric_query_types.sql +++ b/src/v3/scalars/numeric/numeric_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.numeric_eq_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.numeric_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.numeric_ord_ore_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.numeric_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.numeric_ord_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.numeric_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.numeric_ord_ope_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/numeric/numeric_types.sql b/src/v3/scalars/numeric/numeric_types.sql index a38abe2ec..d910668f2 100644 --- a/src/v3/scalars/numeric/numeric_types.sql +++ b/src/v3/scalars/numeric/numeric_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.numeric IS 'EQL v3 encrypted numeric column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.numeric_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.numeric_eq IS 'EQL v3 encrypted numeric column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.numeric_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.numeric_ord_ore IS 'EQL v3 encrypted numeric column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.numeric_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.numeric_ord IS 'EQL v3 encrypted numeric column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.numeric_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.numeric_ord_ope IS 'EQL v3 encrypted numeric column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/real/real_query_types.sql b/src/v3/scalars/real/real_query_types.sql index 20c71fe1f..0bd0bfb19 100644 --- a/src/v3/scalars/real/real_query_types.sql +++ b/src/v3/scalars/real/real_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.real_eq_query IS 'EQL v3 query operand for encrypted real (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.real_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.real_ord_ore_query IS 'EQL v3 query operand for encrypted real (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.real_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.real_ord_query IS 'EQL v3 query operand for encrypted real (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.real_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.real_ord_ope_query IS 'EQL v3 query operand for encrypted real (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/real/real_types.sql b/src/v3/scalars/real/real_types.sql index 8bf6a2511..e56db1a44 100644 --- a/src/v3/scalars/real/real_types.sql +++ b/src/v3/scalars/real/real_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.real IS 'EQL v3 encrypted real column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.real_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.real_eq IS 'EQL v3 encrypted real column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.real_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.real_ord_ore IS 'EQL v3 encrypted real column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.real_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.real_ord IS 'EQL v3 encrypted real column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.real_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.real_ord_ope IS 'EQL v3 encrypted real column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/smallint/smallint_query_types.sql b/src/v3/scalars/smallint/smallint_query_types.sql index 8a47fbcad..2dde2c89e 100644 --- a/src/v3/scalars/smallint/smallint_query_types.sql +++ b/src/v3/scalars/smallint/smallint_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.smallint_eq_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.smallint_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.smallint_ord_ore_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.smallint_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.smallint_ord_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.smallint_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.smallint_ord_ope_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/smallint/smallint_types.sql b/src/v3/scalars/smallint/smallint_types.sql index 6165b605b..0aa41c3d1 100644 --- a/src/v3/scalars/smallint/smallint_types.sql +++ b/src/v3/scalars/smallint/smallint_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.smallint IS 'EQL v3 encrypted smallint column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.smallint_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.smallint_eq IS 'EQL v3 encrypted smallint column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.smallint_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.smallint_ord_ore IS 'EQL v3 encrypted smallint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.smallint_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.smallint_ord IS 'EQL v3 encrypted smallint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.smallint_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.smallint_ord_ope IS 'EQL v3 encrypted smallint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/text/text_query_types.sql b/src/v3/scalars/text/text_query_types.sql index 00150db4b..b90047fa2 100644 --- a/src/v3/scalars/text/text_query_types.sql +++ b/src/v3/scalars/text/text_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_eq_query IS 'EQL v3 query operand for encrypted text (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.text_match_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -42,6 +44,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_match_query IS 'EQL v3 query operand for encrypted text (searchable via @> <@). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.text_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -61,6 +65,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_ord_ore_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.text_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -80,6 +86,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_ord_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.text_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -97,6 +105,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_ord_ope_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.text_search_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -116,5 +126,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.text_search_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >= @> <@). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/text/text_types.sql b/src/v3/scalars/text/text_types.sql index e6bec0f10..b3caf95b9 100644 --- a/src/v3/scalars/text/text_types.sql +++ b/src/v3/scalars/text/text_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text IS 'EQL v3 encrypted text column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.text_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_eq IS 'EQL v3 encrypted text column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.text_match. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -53,6 +57,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_match IS 'EQL v3 encrypted text column (searchable via @> <@). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.text_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -72,6 +78,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_ord_ore IS 'EQL v3 encrypted text column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.text_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -91,6 +99,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_ord IS 'EQL v3 encrypted text column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.text_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -108,6 +118,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.text_ord_ope IS 'EQL v3 encrypted text column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.text_search. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -127,5 +139,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.text_search IS 'EQL v3 encrypted text column (searchable via = <> < <= > >= @> <@). jsonb-backed CipherStash searchable-encryption domain.'; END $$; diff --git a/src/v3/scalars/timestamp/timestamp_query_types.sql b/src/v3/scalars/timestamp/timestamp_query_types.sql index 0bf9a6188..1800c8899 100644 --- a/src/v3/scalars/timestamp/timestamp_query_types.sql +++ b/src/v3/scalars/timestamp/timestamp_query_types.sql @@ -26,6 +26,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.timestamp_eq_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <>). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.timestamp_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -44,6 +46,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.timestamp_ord_ore_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.timestamp_ord_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -62,6 +66,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.timestamp_ord_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + --! @brief Query-operand domain public.timestamp_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -77,5 +83,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.timestamp_ord_ope_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; END $$; diff --git a/src/v3/scalars/timestamp/timestamp_types.sql b/src/v3/scalars/timestamp/timestamp_types.sql index f60272c45..0250638c9 100644 --- a/src/v3/scalars/timestamp/timestamp_types.sql +++ b/src/v3/scalars/timestamp/timestamp_types.sql @@ -21,6 +21,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.timestamp IS 'EQL v3 encrypted timestamp column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.timestamp_eq. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -37,6 +39,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.timestamp_eq IS 'EQL v3 encrypted timestamp column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.timestamp_ord_ore. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -55,6 +59,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL v3 encrypted timestamp column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.timestamp_ord. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -73,6 +79,8 @@ BEGIN ); END IF; + COMMENT ON DOMAIN public.timestamp_ord IS 'EQL v3 encrypted timestamp column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + --! @brief Encrypted domain public.timestamp_ord_ope. IF NOT EXISTS ( SELECT 1 FROM pg_type @@ -88,5 +96,7 @@ BEGIN AND VALUE->>'v' = '3' ); END IF; + + COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL v3 encrypted timestamp column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; END $$; From 1d2c35d62c4a11310333591f43a5ee9d033e8ffe Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 7 Jul 2026 19:01:51 +1000 Subject: [PATCH 552/599] docs(changelog): add entry for domain-type comments (#377) --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 152169529..aedd2ba9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added +- **`COMMENT ON DOMAIN` on every `eql_v3` encrypted domain type.** The v3 encrypted domains are `jsonb`-backed, so introspection that resolves a domain to its base type renders them as a bare `jsonb` with no hint they are EQL-encrypted, searchable columns (most visibly the Supabase table editor, whose grid reads `postgres-meta`'s base-type-resolved `format`). Every `public` encrypted domain now carries a one-line `COMMENT ON DOMAIN`, so the type is self-documenting via `psql \dD`, `obj_description(oid,'pg_type')`, and any tool that reads `pg_type` comments (Supabase's `types` introspection surfaces exactly this). No behaviour change — comments only. Scalar-domain comments are **code-generated**: a new `DomainBlock.comment` field derives the capability text from the domain's terms (`Term::operators_for_terms`), so it tracks the generated CHECK/operator surface and can't drift (`text_match` → "searchable via @> <@", an ORE `_ord` → "= <> < <= > >=", storage-only → "not searchable"); the DO-block templates emit the comment after each idempotent `CREATE DOMAIN`, re-applied on reinstall so comment-text changes propagate. The `_query` operand twins get a matching "index terms only; carries no ciphertext (c)" comment, and the three hand-written jsonb SteVec domains (`json` / `jsonb_entry` / `jsonb_query`) get hand-written comments. ([#377](https://github.com/cipherstash/encrypt-query-language/pull/377), closes [#376](https://github.com/cipherstash/encrypt-query-language/issues/376)) + - **Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373)) - **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350)) - **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349)) From 00cec6215debe8520874f7e7302fb19a39a06a96 Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Tue, 7 Jul 2026 20:23:24 +1000 Subject: [PATCH 553/599] refactor(v3): make domain-type comments terse (one-line in type pickers) The first cut wrapped to ~3 lines in Supabase Studio's type picker. Drop the 'jsonb-backed CipherStash searchable-encryption domain.' boilerplate and compress capability to plain words (equality / ordering / containment / storage only), derived from the operator set. E.g. 'EQL encrypted numeric (equality, ordering)'. Longest is now 62 chars vs ~110. --- CHANGELOG.md | 2 +- crates/eql-codegen/src/context.rs | 43 +++++++++++++------ src/v3/jsonb/types.sql | 6 +-- src/v3/scalars/bigint/bigint_query_types.sql | 8 ++-- src/v3/scalars/bigint/bigint_types.sql | 10 ++--- src/v3/scalars/boolean/boolean_types.sql | 2 +- src/v3/scalars/date/date_query_types.sql | 8 ++-- src/v3/scalars/date/date_types.sql | 10 ++--- src/v3/scalars/double/double_query_types.sql | 8 ++-- src/v3/scalars/double/double_types.sql | 10 ++--- .../scalars/integer/integer_query_types.sql | 8 ++-- src/v3/scalars/integer/integer_types.sql | 10 ++--- .../scalars/numeric/numeric_query_types.sql | 8 ++-- src/v3/scalars/numeric/numeric_types.sql | 10 ++--- src/v3/scalars/real/real_query_types.sql | 8 ++-- src/v3/scalars/real/real_types.sql | 10 ++--- .../scalars/smallint/smallint_query_types.sql | 8 ++-- src/v3/scalars/smallint/smallint_types.sql | 10 ++--- src/v3/scalars/text/text_query_types.sql | 12 +++--- src/v3/scalars/text/text_types.sql | 14 +++--- .../timestamp/timestamp_query_types.sql | 8 ++-- src/v3/scalars/timestamp/timestamp_types.sql | 10 ++--- 22 files changed, 119 insertions(+), 104 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aedd2ba9f..93b1ec696 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Added -- **`COMMENT ON DOMAIN` on every `eql_v3` encrypted domain type.** The v3 encrypted domains are `jsonb`-backed, so introspection that resolves a domain to its base type renders them as a bare `jsonb` with no hint they are EQL-encrypted, searchable columns (most visibly the Supabase table editor, whose grid reads `postgres-meta`'s base-type-resolved `format`). Every `public` encrypted domain now carries a one-line `COMMENT ON DOMAIN`, so the type is self-documenting via `psql \dD`, `obj_description(oid,'pg_type')`, and any tool that reads `pg_type` comments (Supabase's `types` introspection surfaces exactly this). No behaviour change — comments only. Scalar-domain comments are **code-generated**: a new `DomainBlock.comment` field derives the capability text from the domain's terms (`Term::operators_for_terms`), so it tracks the generated CHECK/operator surface and can't drift (`text_match` → "searchable via @> <@", an ORE `_ord` → "= <> < <= > >=", storage-only → "not searchable"); the DO-block templates emit the comment after each idempotent `CREATE DOMAIN`, re-applied on reinstall so comment-text changes propagate. The `_query` operand twins get a matching "index terms only; carries no ciphertext (c)" comment, and the three hand-written jsonb SteVec domains (`json` / `jsonb_entry` / `jsonb_query`) get hand-written comments. ([#377](https://github.com/cipherstash/encrypt-query-language/pull/377), closes [#376](https://github.com/cipherstash/encrypt-query-language/issues/376)) +- **`COMMENT ON DOMAIN` on every `eql_v3` encrypted domain type.** The v3 encrypted domains are `jsonb`-backed, so introspection that resolves a domain to its base type renders them as a bare `jsonb` with no hint they are EQL-encrypted, searchable columns (most visibly the Supabase table editor, whose grid reads `postgres-meta`'s base-type-resolved `format`). Every `public` encrypted domain now carries a one-line `COMMENT ON DOMAIN`, so the type is self-documenting via `psql \dD`, `obj_description(oid,'pg_type')`, and any tool that reads `pg_type` comments (Supabase's `types` introspection surfaces exactly this). No behaviour change — comments only. Scalar-domain comments are **code-generated**: a new `DomainBlock.comment` field derives the capability text from the domain's terms (`Term::operators_for_terms`), so it tracks the generated CHECK/operator surface and can't drift. Comments are deliberately terse so they fit one line in type pickers (e.g. Supabase Studio): `text_match` → "EQL encrypted text (containment)", an ORE `_ord` → "EQL encrypted numeric (equality, ordering)", storage-only → "EQL encrypted numeric (storage only)". The DO-block templates emit the comment after each idempotent `CREATE DOMAIN`, re-applied on reinstall so comment-text changes propagate. The `_query` operand twins get a matching "EQL query operand (…)" comment, and the three hand-written jsonb SteVec domains (`json` / `jsonb_entry` / `jsonb_query`) get hand-written comments. ([#377](https://github.com/cipherstash/encrypt-query-language/pull/377), closes [#376](https://github.com/cipherstash/encrypt-query-language/issues/376)) - **Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373)) - **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350)) diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 1162b4036..493d1f320 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -83,28 +83,43 @@ pub struct DomainBlock { pub comment: String, } -/// One-line description baked into `COMMENT ON DOMAIN` for a stored/searchable -/// encrypted domain. Capability is derived from the terms (term-agnostic via -/// `operators_for_terms`) so it tracks the generated surface automatically. -fn scalar_domain_comment(family_name: &str, domain: &Domain) -> String { +/// Concise capability phrase from a domain's operator set — `equality`, +/// `ordering`, `containment` (joined), or `storage only` when term-less. Derived +/// from `operators_for_terms` so it tracks the generated surface; kept short so +/// the `COMMENT ON DOMAIN` fits one line in type pickers (e.g. Supabase Studio). +fn capability_phrase(domain: &Domain) -> String { let ops = Term::operators_for_terms(domain.terms); - let capability = if ops.is_empty() { - "storage only, not searchable".to_string() + let mut caps = Vec::new(); + if ops.contains(&"=") { + caps.push("equality"); + } + if ops.contains(&"<") { + caps.push("ordering"); + } + if ops.contains(&"@>") { + caps.push("containment"); + } + if caps.is_empty() { + "storage only".to_string() } else { - format!("searchable via {}", ops.join(" ")) - }; + caps.join(", ") + } +} + +/// Terse one-line `COMMENT ON DOMAIN` for a stored/searchable encrypted domain, +/// e.g. `EQL encrypted numeric (equality, ordering)`. +fn scalar_domain_comment(family_name: &str, domain: &Domain) -> String { sql_str(&format!( - "EQL v3 encrypted {family_name} column ({capability}). jsonb-backed CipherStash searchable-encryption domain." + "EQL encrypted {family_name} ({})", + capability_phrase(domain) )) } -/// `COMMENT ON DOMAIN` text for a `_query` operand twin: index-terms-only, no -/// ciphertext. +/// Terse `COMMENT ON DOMAIN` for a `_query` operand twin (index-terms-only). fn query_domain_comment(family_name: &str, domain: &Domain) -> String { - let ops = Term::operators_for_terms(domain.terms); sql_str(&format!( - "EQL v3 query operand for encrypted {family_name} (searchable via {}). Index terms only; carries no ciphertext (c).", - ops.join(" ") + "EQL {family_name} query operand ({})", + capability_phrase(domain) )) } diff --git a/src/v3/jsonb/types.sql b/src/v3/jsonb/types.sql index 1f4e28698..e1200a540 100644 --- a/src/v3/jsonb/types.sql +++ b/src/v3/jsonb/types.sql @@ -124,7 +124,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.json IS 'EQL v3 encrypted JSONB document (SteVec). Searchable without decryption via containment (@>, <@), field/array access, and per-leaf equality/order. jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.json IS 'EQL encrypted JSONB document (containment, equality, ordering)'; END $$; @@ -175,7 +175,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.jsonb_entry IS 'EQL v3 encrypted JSONB leaf entry (single sv element). Returned by ->; accepted by eql_v3.eq_term / eql_v3.ore_cllw for per-leaf equality and ordered search. jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.jsonb_entry IS 'EQL encrypted JSONB leaf entry (equality, ordering)'; END $$; @@ -213,7 +213,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.jsonb_query IS 'EQL v3 encrypted JSONB containment needle (query operand). Index terms only; carries no ciphertext (c). Right-hand side of @> / <@ containment. jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.jsonb_query IS 'EQL JSONB query operand (containment)'; END $$; diff --git a/src/v3/scalars/bigint/bigint_query_types.sql b/src/v3/scalars/bigint/bigint_query_types.sql index f7b553f80..6a5221e2e 100644 --- a/src/v3/scalars/bigint/bigint_query_types.sql +++ b/src/v3/scalars/bigint/bigint_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_eq_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.bigint_eq_query IS 'EQL bigint query operand (equality)'; --! @brief Query-operand domain public.bigint_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_ore_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.bigint_ord_ore_query IS 'EQL bigint query operand (equality, ordering)'; --! @brief Query-operand domain public.bigint_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.bigint_ord_query IS 'EQL bigint query operand (equality, ordering)'; --! @brief Query-operand domain public.bigint_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_ope_query IS 'EQL v3 query operand for encrypted bigint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.bigint_ord_ope_query IS 'EQL bigint query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/bigint/bigint_types.sql b/src/v3/scalars/bigint/bigint_types.sql index a065c4dfb..02c263a7d 100644 --- a/src/v3/scalars/bigint/bigint_types.sql +++ b/src/v3/scalars/bigint/bigint_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint IS 'EQL v3 encrypted bigint column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.bigint IS 'EQL encrypted bigint (storage only)'; --! @brief Encrypted domain public.bigint_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_eq IS 'EQL v3 encrypted bigint column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.bigint_eq IS 'EQL encrypted bigint (equality)'; --! @brief Encrypted domain public.bigint_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_ore IS 'EQL v3 encrypted bigint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.bigint_ord_ore IS 'EQL encrypted bigint (equality, ordering)'; --! @brief Encrypted domain public.bigint_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord IS 'EQL v3 encrypted bigint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.bigint_ord IS 'EQL encrypted bigint (equality, ordering)'; --! @brief Encrypted domain public.bigint_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_ope IS 'EQL v3 encrypted bigint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.bigint_ord_ope IS 'EQL encrypted bigint (equality, ordering)'; END $$; diff --git a/src/v3/scalars/boolean/boolean_types.sql b/src/v3/scalars/boolean/boolean_types.sql index 0aef95baa..2db3f5f4d 100644 --- a/src/v3/scalars/boolean/boolean_types.sql +++ b/src/v3/scalars/boolean/boolean_types.sql @@ -21,6 +21,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.boolean IS 'EQL v3 encrypted boolean column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.boolean IS 'EQL encrypted boolean (storage only)'; END $$; diff --git a/src/v3/scalars/date/date_query_types.sql b/src/v3/scalars/date/date_query_types.sql index 429fc50f5..1f163444a 100644 --- a/src/v3/scalars/date/date_query_types.sql +++ b/src/v3/scalars/date/date_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_eq_query IS 'EQL v3 query operand for encrypted date (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.date_eq_query IS 'EQL date query operand (equality)'; --! @brief Query-operand domain public.date_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_ore_query IS 'EQL v3 query operand for encrypted date (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.date_ord_ore_query IS 'EQL date query operand (equality, ordering)'; --! @brief Query-operand domain public.date_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_query IS 'EQL v3 query operand for encrypted date (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.date_ord_query IS 'EQL date query operand (equality, ordering)'; --! @brief Query-operand domain public.date_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_ope_query IS 'EQL v3 query operand for encrypted date (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.date_ord_ope_query IS 'EQL date query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/date/date_types.sql b/src/v3/scalars/date/date_types.sql index c36dcac3b..290b59020 100644 --- a/src/v3/scalars/date/date_types.sql +++ b/src/v3/scalars/date/date_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date IS 'EQL v3 encrypted date column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.date IS 'EQL encrypted date (storage only)'; --! @brief Encrypted domain public.date_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_eq IS 'EQL v3 encrypted date column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.date_eq IS 'EQL encrypted date (equality)'; --! @brief Encrypted domain public.date_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_ore IS 'EQL v3 encrypted date column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.date_ord_ore IS 'EQL encrypted date (equality, ordering)'; --! @brief Encrypted domain public.date_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord IS 'EQL v3 encrypted date column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.date_ord IS 'EQL encrypted date (equality, ordering)'; --! @brief Encrypted domain public.date_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_ope IS 'EQL v3 encrypted date column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.date_ord_ope IS 'EQL encrypted date (equality, ordering)'; END $$; diff --git a/src/v3/scalars/double/double_query_types.sql b/src/v3/scalars/double/double_query_types.sql index bdd948c4a..57ec15ef6 100644 --- a/src/v3/scalars/double/double_query_types.sql +++ b/src/v3/scalars/double/double_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_eq_query IS 'EQL v3 query operand for encrypted double (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.double_eq_query IS 'EQL double query operand (equality)'; --! @brief Query-operand domain public.double_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_ore_query IS 'EQL v3 query operand for encrypted double (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.double_ord_ore_query IS 'EQL double query operand (equality, ordering)'; --! @brief Query-operand domain public.double_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_query IS 'EQL v3 query operand for encrypted double (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.double_ord_query IS 'EQL double query operand (equality, ordering)'; --! @brief Query-operand domain public.double_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_ope_query IS 'EQL v3 query operand for encrypted double (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.double_ord_ope_query IS 'EQL double query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/double/double_types.sql b/src/v3/scalars/double/double_types.sql index 430b24414..c615491e4 100644 --- a/src/v3/scalars/double/double_types.sql +++ b/src/v3/scalars/double/double_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double IS 'EQL v3 encrypted double column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.double IS 'EQL encrypted double (storage only)'; --! @brief Encrypted domain public.double_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_eq IS 'EQL v3 encrypted double column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.double_eq IS 'EQL encrypted double (equality)'; --! @brief Encrypted domain public.double_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_ore IS 'EQL v3 encrypted double column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.double_ord_ore IS 'EQL encrypted double (equality, ordering)'; --! @brief Encrypted domain public.double_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord IS 'EQL v3 encrypted double column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.double_ord IS 'EQL encrypted double (equality, ordering)'; --! @brief Encrypted domain public.double_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_ope IS 'EQL v3 encrypted double column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.double_ord_ope IS 'EQL encrypted double (equality, ordering)'; END $$; diff --git a/src/v3/scalars/integer/integer_query_types.sql b/src/v3/scalars/integer/integer_query_types.sql index ddefd9df8..baaffea4a 100644 --- a/src/v3/scalars/integer/integer_query_types.sql +++ b/src/v3/scalars/integer/integer_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_eq_query IS 'EQL v3 query operand for encrypted integer (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.integer_eq_query IS 'EQL integer query operand (equality)'; --! @brief Query-operand domain public.integer_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_ore_query IS 'EQL v3 query operand for encrypted integer (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.integer_ord_ore_query IS 'EQL integer query operand (equality, ordering)'; --! @brief Query-operand domain public.integer_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_query IS 'EQL v3 query operand for encrypted integer (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.integer_ord_query IS 'EQL integer query operand (equality, ordering)'; --! @brief Query-operand domain public.integer_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_ope_query IS 'EQL v3 query operand for encrypted integer (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.integer_ord_ope_query IS 'EQL integer query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/integer/integer_types.sql b/src/v3/scalars/integer/integer_types.sql index a875cb918..0b72b2b5c 100644 --- a/src/v3/scalars/integer/integer_types.sql +++ b/src/v3/scalars/integer/integer_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer IS 'EQL v3 encrypted integer column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.integer IS 'EQL encrypted integer (storage only)'; --! @brief Encrypted domain public.integer_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_eq IS 'EQL v3 encrypted integer column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.integer_eq IS 'EQL encrypted integer (equality)'; --! @brief Encrypted domain public.integer_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_ore IS 'EQL v3 encrypted integer column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.integer_ord_ore IS 'EQL encrypted integer (equality, ordering)'; --! @brief Encrypted domain public.integer_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord IS 'EQL v3 encrypted integer column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.integer_ord IS 'EQL encrypted integer (equality, ordering)'; --! @brief Encrypted domain public.integer_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_ope IS 'EQL v3 encrypted integer column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.integer_ord_ope IS 'EQL encrypted integer (equality, ordering)'; END $$; diff --git a/src/v3/scalars/numeric/numeric_query_types.sql b/src/v3/scalars/numeric/numeric_query_types.sql index 1c5529bb0..846db569f 100644 --- a/src/v3/scalars/numeric/numeric_query_types.sql +++ b/src/v3/scalars/numeric/numeric_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_eq_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.numeric_eq_query IS 'EQL numeric query operand (equality)'; --! @brief Query-operand domain public.numeric_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_ore_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.numeric_ord_ore_query IS 'EQL numeric query operand (equality, ordering)'; --! @brief Query-operand domain public.numeric_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.numeric_ord_query IS 'EQL numeric query operand (equality, ordering)'; --! @brief Query-operand domain public.numeric_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_ope_query IS 'EQL v3 query operand for encrypted numeric (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.numeric_ord_ope_query IS 'EQL numeric query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/numeric/numeric_types.sql b/src/v3/scalars/numeric/numeric_types.sql index d910668f2..8e67247e3 100644 --- a/src/v3/scalars/numeric/numeric_types.sql +++ b/src/v3/scalars/numeric/numeric_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric IS 'EQL v3 encrypted numeric column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.numeric IS 'EQL encrypted numeric (storage only)'; --! @brief Encrypted domain public.numeric_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_eq IS 'EQL v3 encrypted numeric column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.numeric_eq IS 'EQL encrypted numeric (equality)'; --! @brief Encrypted domain public.numeric_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_ore IS 'EQL v3 encrypted numeric column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.numeric_ord_ore IS 'EQL encrypted numeric (equality, ordering)'; --! @brief Encrypted domain public.numeric_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord IS 'EQL v3 encrypted numeric column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.numeric_ord IS 'EQL encrypted numeric (equality, ordering)'; --! @brief Encrypted domain public.numeric_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_ope IS 'EQL v3 encrypted numeric column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.numeric_ord_ope IS 'EQL encrypted numeric (equality, ordering)'; END $$; diff --git a/src/v3/scalars/real/real_query_types.sql b/src/v3/scalars/real/real_query_types.sql index 0bd0bfb19..e328ae225 100644 --- a/src/v3/scalars/real/real_query_types.sql +++ b/src/v3/scalars/real/real_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_eq_query IS 'EQL v3 query operand for encrypted real (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.real_eq_query IS 'EQL real query operand (equality)'; --! @brief Query-operand domain public.real_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_ore_query IS 'EQL v3 query operand for encrypted real (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.real_ord_ore_query IS 'EQL real query operand (equality, ordering)'; --! @brief Query-operand domain public.real_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_query IS 'EQL v3 query operand for encrypted real (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.real_ord_query IS 'EQL real query operand (equality, ordering)'; --! @brief Query-operand domain public.real_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_ope_query IS 'EQL v3 query operand for encrypted real (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.real_ord_ope_query IS 'EQL real query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/real/real_types.sql b/src/v3/scalars/real/real_types.sql index e56db1a44..5b9c1b3e6 100644 --- a/src/v3/scalars/real/real_types.sql +++ b/src/v3/scalars/real/real_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real IS 'EQL v3 encrypted real column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.real IS 'EQL encrypted real (storage only)'; --! @brief Encrypted domain public.real_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_eq IS 'EQL v3 encrypted real column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.real_eq IS 'EQL encrypted real (equality)'; --! @brief Encrypted domain public.real_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_ore IS 'EQL v3 encrypted real column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.real_ord_ore IS 'EQL encrypted real (equality, ordering)'; --! @brief Encrypted domain public.real_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord IS 'EQL v3 encrypted real column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.real_ord IS 'EQL encrypted real (equality, ordering)'; --! @brief Encrypted domain public.real_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_ope IS 'EQL v3 encrypted real column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.real_ord_ope IS 'EQL encrypted real (equality, ordering)'; END $$; diff --git a/src/v3/scalars/smallint/smallint_query_types.sql b/src/v3/scalars/smallint/smallint_query_types.sql index 2dde2c89e..6a8623e43 100644 --- a/src/v3/scalars/smallint/smallint_query_types.sql +++ b/src/v3/scalars/smallint/smallint_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_eq_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.smallint_eq_query IS 'EQL smallint query operand (equality)'; --! @brief Query-operand domain public.smallint_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_ore_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.smallint_ord_ore_query IS 'EQL smallint query operand (equality, ordering)'; --! @brief Query-operand domain public.smallint_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.smallint_ord_query IS 'EQL smallint query operand (equality, ordering)'; --! @brief Query-operand domain public.smallint_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_ope_query IS 'EQL v3 query operand for encrypted smallint (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.smallint_ord_ope_query IS 'EQL smallint query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/smallint/smallint_types.sql b/src/v3/scalars/smallint/smallint_types.sql index 0aa41c3d1..dffa500ae 100644 --- a/src/v3/scalars/smallint/smallint_types.sql +++ b/src/v3/scalars/smallint/smallint_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint IS 'EQL v3 encrypted smallint column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.smallint IS 'EQL encrypted smallint (storage only)'; --! @brief Encrypted domain public.smallint_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_eq IS 'EQL v3 encrypted smallint column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.smallint_eq IS 'EQL encrypted smallint (equality)'; --! @brief Encrypted domain public.smallint_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_ore IS 'EQL v3 encrypted smallint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.smallint_ord_ore IS 'EQL encrypted smallint (equality, ordering)'; --! @brief Encrypted domain public.smallint_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord IS 'EQL v3 encrypted smallint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.smallint_ord IS 'EQL encrypted smallint (equality, ordering)'; --! @brief Encrypted domain public.smallint_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_ope IS 'EQL v3 encrypted smallint column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.smallint_ord_ope IS 'EQL encrypted smallint (equality, ordering)'; END $$; diff --git a/src/v3/scalars/text/text_query_types.sql b/src/v3/scalars/text/text_query_types.sql index b90047fa2..8552e9268 100644 --- a/src/v3/scalars/text/text_query_types.sql +++ b/src/v3/scalars/text/text_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_eq_query IS 'EQL v3 query operand for encrypted text (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.text_eq_query IS 'EQL text query operand (equality)'; --! @brief Query-operand domain public.text_match_query (term-only; no `c`). IF NOT EXISTS ( @@ -44,7 +44,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_match_query IS 'EQL v3 query operand for encrypted text (searchable via @> <@). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.text_match_query IS 'EQL text query operand (containment)'; --! @brief Query-operand domain public.text_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -65,7 +65,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_ore_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.text_ord_ore_query IS 'EQL text query operand (equality, ordering)'; --! @brief Query-operand domain public.text_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -86,7 +86,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.text_ord_query IS 'EQL text query operand (equality, ordering)'; --! @brief Query-operand domain public.text_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -105,7 +105,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_ope_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.text_ord_ope_query IS 'EQL text query operand (equality, ordering)'; --! @brief Query-operand domain public.text_search_query (term-only; no `c`). IF NOT EXISTS ( @@ -127,6 +127,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_search_query IS 'EQL v3 query operand for encrypted text (searchable via = <> < <= > >= @> <@). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.text_search_query IS 'EQL text query operand (equality, ordering, containment)'; END $$; diff --git a/src/v3/scalars/text/text_types.sql b/src/v3/scalars/text/text_types.sql index b3caf95b9..3630768fa 100644 --- a/src/v3/scalars/text/text_types.sql +++ b/src/v3/scalars/text/text_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text IS 'EQL v3 encrypted text column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.text IS 'EQL encrypted text (storage only)'; --! @brief Encrypted domain public.text_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_eq IS 'EQL v3 encrypted text column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.text_eq IS 'EQL encrypted text (equality)'; --! @brief Encrypted domain public.text_match. IF NOT EXISTS ( @@ -57,7 +57,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_match IS 'EQL v3 encrypted text column (searchable via @> <@). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.text_match IS 'EQL encrypted text (containment)'; --! @brief Encrypted domain public.text_ord_ore. IF NOT EXISTS ( @@ -78,7 +78,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_ore IS 'EQL v3 encrypted text column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.text_ord_ore IS 'EQL encrypted text (equality, ordering)'; --! @brief Encrypted domain public.text_ord. IF NOT EXISTS ( @@ -99,7 +99,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord IS 'EQL v3 encrypted text column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.text_ord IS 'EQL encrypted text (equality, ordering)'; --! @brief Encrypted domain public.text_ord_ope. IF NOT EXISTS ( @@ -118,7 +118,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_ope IS 'EQL v3 encrypted text column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.text_ord_ope IS 'EQL encrypted text (equality, ordering)'; --! @brief Encrypted domain public.text_search. IF NOT EXISTS ( @@ -140,6 +140,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_search IS 'EQL v3 encrypted text column (searchable via = <> < <= > >= @> <@). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.text_search IS 'EQL encrypted text (equality, ordering, containment)'; END $$; diff --git a/src/v3/scalars/timestamp/timestamp_query_types.sql b/src/v3/scalars/timestamp/timestamp_query_types.sql index 1800c8899..0ed26a7eb 100644 --- a/src/v3/scalars/timestamp/timestamp_query_types.sql +++ b/src/v3/scalars/timestamp/timestamp_query_types.sql @@ -26,7 +26,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_eq_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <>). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.timestamp_eq_query IS 'EQL timestamp query operand (equality)'; --! @brief Query-operand domain public.timestamp_ord_ore_query (term-only; no `c`). IF NOT EXISTS ( @@ -46,7 +46,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_ore_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.timestamp_ord_ore_query IS 'EQL timestamp query operand (equality, ordering)'; --! @brief Query-operand domain public.timestamp_ord_query (term-only; no `c`). IF NOT EXISTS ( @@ -66,7 +66,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.timestamp_ord_query IS 'EQL timestamp query operand (equality, ordering)'; --! @brief Query-operand domain public.timestamp_ord_ope_query (term-only; no `c`). IF NOT EXISTS ( @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_ope_query IS 'EQL v3 query operand for encrypted timestamp (searchable via = <> < <= > >=). Index terms only; carries no ciphertext (c).'; + COMMENT ON DOMAIN public.timestamp_ord_ope_query IS 'EQL timestamp query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/timestamp/timestamp_types.sql b/src/v3/scalars/timestamp/timestamp_types.sql index 0250638c9..8cca5ca80 100644 --- a/src/v3/scalars/timestamp/timestamp_types.sql +++ b/src/v3/scalars/timestamp/timestamp_types.sql @@ -21,7 +21,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp IS 'EQL v3 encrypted timestamp column (storage only, not searchable). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.timestamp IS 'EQL encrypted timestamp (storage only)'; --! @brief Encrypted domain public.timestamp_eq. IF NOT EXISTS ( @@ -39,7 +39,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_eq IS 'EQL v3 encrypted timestamp column (searchable via = <>). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.timestamp_eq IS 'EQL encrypted timestamp (equality)'; --! @brief Encrypted domain public.timestamp_ord_ore. IF NOT EXISTS ( @@ -59,7 +59,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL v3 encrypted timestamp column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL encrypted timestamp (equality, ordering)'; --! @brief Encrypted domain public.timestamp_ord. IF NOT EXISTS ( @@ -79,7 +79,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord IS 'EQL v3 encrypted timestamp column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.timestamp_ord IS 'EQL encrypted timestamp (equality, ordering)'; --! @brief Encrypted domain public.timestamp_ord_ope. IF NOT EXISTS ( @@ -97,6 +97,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL v3 encrypted timestamp column (searchable via = <> < <= > >=). jsonb-backed CipherStash searchable-encryption domain.'; + COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL encrypted timestamp (equality, ordering)'; END $$; From 24bd6f40d314bebbeb424f36da7def027f828474 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Wed, 8 Jul 2026 01:10:48 +1000 Subject: [PATCH 554/599] feat(eql v3)!: query-operand domains renamed to the query_ prefix (CIP-3442) Every scalar query twin is now public.query_ (query_integer_eq, ...), and the hand-written SteVec containment needle follows the same convention: public.jsonb_query -> public.query_jsonb. Domain::query_name (eql-domains) is the single source of truth for the twin naming; Domain::full_name carries the needle's documented exception alongside the existing public.json one. Why: the query operands live in public beside the column domains they twin, so Supabase Studio's Table Builder type picker interleaved never-a-column-type operands with the actual column types. A shared query_ prefix sorts every query operand together, apart from the column domains. Generated artifacts regenerated in place: src/v3/scalars (file names follow the domain names; old files orphan-swept), eql-bindings Rust/TS/JSON (query_.json schema files), and the public-surface golden snapshot. CHANGELOG entries updated/added and U-002 added to docs/upgrading/v3.0.md (the suffix names shipped only in 3.0.0 pre-releases). --- CHANGELOG.md | 1 + CLAUDE.md | 4 +- SUPABASE.md | 2 +- crates/eql-bindings/CHANGELOG.md | 24 +- .../eql-bindings/bindings/v3/BigintEqQuery.ts | 2 +- .../bindings/v3/BigintOrdOpeQuery.ts | 2 +- .../bindings/v3/BigintOrdOreQuery.ts | 2 +- .../bindings/v3/BigintOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/DateEqQuery.ts | 2 +- .../bindings/v3/DateOrdOpeQuery.ts | 2 +- .../bindings/v3/DateOrdOreQuery.ts | 2 +- .../eql-bindings/bindings/v3/DateOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/DoubleEqQuery.ts | 2 +- .../bindings/v3/DoubleOrdOpeQuery.ts | 2 +- .../bindings/v3/DoubleOrdOreQuery.ts | 2 +- .../bindings/v3/DoubleOrdQuery.ts | 2 +- .../bindings/v3/IntegerEqQuery.ts | 2 +- .../bindings/v3/IntegerOrdOpeQuery.ts | 2 +- .../bindings/v3/IntegerOrdOreQuery.ts | 2 +- .../bindings/v3/IntegerOrdQuery.ts | 2 +- .../bindings/v3/NumericEqQuery.ts | 2 +- .../bindings/v3/NumericOrdOpeQuery.ts | 2 +- .../bindings/v3/NumericOrdOreQuery.ts | 2 +- .../bindings/v3/NumericOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/RealEqQuery.ts | 2 +- .../bindings/v3/RealOrdOpeQuery.ts | 2 +- .../bindings/v3/RealOrdOreQuery.ts | 2 +- .../eql-bindings/bindings/v3/RealOrdQuery.ts | 2 +- .../bindings/v3/SmallintEqQuery.ts | 2 +- .../bindings/v3/SmallintOrdOpeQuery.ts | 2 +- .../bindings/v3/SmallintOrdOreQuery.ts | 2 +- .../bindings/v3/SmallintOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/SteVecQuery.ts | 2 +- .../eql-bindings/bindings/v3/TextEqQuery.ts | 2 +- .../bindings/v3/TextMatchQuery.ts | 2 +- .../bindings/v3/TextOrdOpeQuery.ts | 2 +- .../bindings/v3/TextOrdOreQuery.ts | 2 +- .../eql-bindings/bindings/v3/TextOrdQuery.ts | 2 +- .../bindings/v3/TextSearchQuery.ts | 2 +- .../bindings/v3/TimestampEqQuery.ts | 2 +- .../bindings/v3/TimestampOrdOpeQuery.ts | 2 +- .../bindings/v3/TimestampOrdOreQuery.ts | 2 +- .../bindings/v3/TimestampOrdQuery.ts | 2 +- ...int_eq_query.json => query_bigint_eq.json} | 4 +- ...t_ord_query.json => query_bigint_ord.json} | 4 +- ...e_query.json => query_bigint_ord_ope.json} | 4 +- ...e_query.json => query_bigint_ord_ore.json} | 4 +- ...{date_eq_query.json => query_date_eq.json} | 4 +- ...ate_ord_query.json => query_date_ord.json} | 4 +- ...ope_query.json => query_date_ord_ope.json} | 4 +- ...ore_query.json => query_date_ord_ore.json} | 4 +- ...ble_eq_query.json => query_double_eq.json} | 4 +- ...e_ord_query.json => query_double_ord.json} | 4 +- ...e_query.json => query_double_ord_ope.json} | 4 +- ...e_query.json => query_double_ord_ore.json} | 4 +- ...er_eq_query.json => query_integer_eq.json} | 4 +- ..._ord_query.json => query_integer_ord.json} | 4 +- ..._query.json => query_integer_ord_ope.json} | 4 +- ..._query.json => query_integer_ord_ore.json} | 4 +- .../v3/{jsonb_query.json => query_jsonb.json} | 4 +- ...ic_eq_query.json => query_numeric_eq.json} | 4 +- ..._ord_query.json => query_numeric_ord.json} | 4 +- ..._query.json => query_numeric_ord_ope.json} | 4 +- ..._query.json => query_numeric_ord_ore.json} | 4 +- ...{real_eq_query.json => query_real_eq.json} | 4 +- ...eal_ord_query.json => query_real_ord.json} | 4 +- ...ope_query.json => query_real_ord_ope.json} | 4 +- ...ore_query.json => query_real_ord_ore.json} | 4 +- ...t_eq_query.json => query_smallint_eq.json} | 4 +- ...ord_query.json => query_smallint_ord.json} | 4 +- ...query.json => query_smallint_ord_ope.json} | 4 +- ...query.json => query_smallint_ord_ore.json} | 4 +- ...{text_eq_query.json => query_text_eq.json} | 4 +- ...match_query.json => query_text_match.json} | 4 +- ...ext_ord_query.json => query_text_ord.json} | 4 +- ...ope_query.json => query_text_ord_ope.json} | 4 +- ...ore_query.json => query_text_ord_ore.json} | 4 +- ...arch_query.json => query_text_search.json} | 4 +- ..._eq_query.json => query_timestamp_eq.json} | 4 +- ...rd_query.json => query_timestamp_ord.json} | 4 +- ...uery.json => query_timestamp_ord_ope.json} | 4 +- ...uery.json => query_timestamp_ord_ore.json} | 4 +- crates/eql-bindings/src/from_v2/error.rs | 4 +- crates/eql-bindings/src/from_v2/mod.rs | 23 +- crates/eql-bindings/src/from_v2/target.rs | 2 +- crates/eql-bindings/src/v3/bigint.rs | 16 +- crates/eql-bindings/src/v3/date.rs | 16 +- crates/eql-bindings/src/v3/double.rs | 16 +- crates/eql-bindings/src/v3/integer.rs | 16 +- crates/eql-bindings/src/v3/inventory.rs | 2 +- crates/eql-bindings/src/v3/jsonb.rs | 4 +- crates/eql-bindings/src/v3/numeric.rs | 16 +- crates/eql-bindings/src/v3/query_payload.rs | 166 ++-- crates/eql-bindings/src/v3/real.rs | 16 +- crates/eql-bindings/src/v3/smallint.rs | 16 +- crates/eql-bindings/src/v3/text.rs | 24 +- crates/eql-bindings/src/v3/timestamp.rs | 16 +- crates/eql-bindings/tests/catalog_parity.rs | 24 +- crates/eql-bindings/tests/domain_payload.rs | 4 +- crates/eql-bindings/tests/from_v2.rs | 4 +- crates/eql-bindings/tests/query_payload.rs | 26 +- crates/eql-bindings/tests/v3_conformance.rs | 4 +- crates/eql-codegen/src/bindings.rs | 58 +- crates/eql-codegen/src/context.rs | 4 +- crates/eql-codegen/src/dump.rs | 16 +- crates/eql-codegen/src/generate.rs | 39 +- .../eql-codegen/templates/query_types.sql.j2 | 8 +- crates/eql-domains/src/lib.rs | 4 +- crates/eql-domains/src/spec.rs | 67 +- crates/eql-domains/src/tests.rs | 8 + docs/reference/catalog-driven-architecture.md | 2 +- docs/reference/database-indexes.md | 4 +- docs/reference/json-support.md | 12 +- docs/reference/permissions.md | 2 +- docs/reference/sql-support.md | 4 +- docs/tutorials/proxy-configuration.md | 4 +- docs/upgrading/v3.0.md | 44 +- src/v3/jsonb/operators.sql | 16 +- src/v3/jsonb/types.sql | 26 +- ...ions.sql => query_bigint_eq_functions.sql} | 36 +- .../query_bigint_eq_operators.sql} | 16 +- ...ons.sql => query_bigint_ord_functions.sql} | 84 +- ...sql => query_bigint_ord_ope_functions.sql} | 84 +- ...sql => query_bigint_ord_ope_operators.sql} | 32 +- .../query_bigint_ord_operators.sql} | 32 +- ...sql => query_bigint_ord_ore_functions.sql} | 84 +- ...sql => query_bigint_ord_ore_operators.sql} | 32 +- ...query_types.sql => query_bigint_types.sql} | 40 +- ...ctions.sql => query_date_eq_functions.sql} | 36 +- .../query_date_eq_operators.sql} | 16 +- ...tions.sql => query_date_ord_functions.sql} | 84 +- ...s.sql => query_date_ord_ope_functions.sql} | 84 +- ...s.sql => query_date_ord_ope_operators.sql} | 32 +- .../query_date_ord_operators.sql} | 32 +- ...s.sql => query_date_ord_ore_functions.sql} | 84 +- .../query_date_ord_ore_operators.sql} | 32 +- ...e_query_types.sql => query_date_types.sql} | 40 +- ...ions.sql => query_double_eq_functions.sql} | 36 +- .../query_double_eq_operators.sql} | 16 +- ...ons.sql => query_double_ord_functions.sql} | 84 +- ...sql => query_double_ord_ope_functions.sql} | 84 +- ...sql => query_double_ord_ope_operators.sql} | 32 +- .../query_double_ord_operators.sql} | 32 +- ...sql => query_double_ord_ore_functions.sql} | 84 +- ...sql => query_double_ord_ore_operators.sql} | 32 +- ...query_types.sql => query_double_types.sql} | 40 +- ...ons.sql => query_integer_eq_functions.sql} | 36 +- .../query_integer_eq_operators.sql} | 16 +- ...ns.sql => query_integer_ord_functions.sql} | 84 +- ...ql => query_integer_ord_ope_functions.sql} | 84 +- ...ql => query_integer_ord_ope_operators.sql} | 32 +- .../query_integer_ord_operators.sql} | 32 +- ...ql => query_integer_ord_ore_functions.sql} | 84 +- ...ql => query_integer_ord_ore_operators.sql} | 32 +- ...uery_types.sql => query_integer_types.sql} | 40 +- ...ons.sql => query_numeric_eq_functions.sql} | 36 +- .../query_numeric_eq_operators.sql} | 16 +- ...ns.sql => query_numeric_ord_functions.sql} | 84 +- ...ql => query_numeric_ord_ope_functions.sql} | 84 +- ...ql => query_numeric_ord_ope_operators.sql} | 32 +- .../query_numeric_ord_operators.sql} | 32 +- ...ql => query_numeric_ord_ore_functions.sql} | 84 +- ...ql => query_numeric_ord_ore_operators.sql} | 32 +- ...uery_types.sql => query_numeric_types.sql} | 40 +- ...ctions.sql => query_real_eq_functions.sql} | 36 +- ...rators.sql => query_real_eq_operators.sql} | 16 +- ...tions.sql => query_real_ord_functions.sql} | 84 +- ...s.sql => query_real_ord_ope_functions.sql} | 84 +- ...s.sql => query_real_ord_ope_operators.sql} | 32 +- ...ators.sql => query_real_ord_operators.sql} | 32 +- ...s.sql => query_real_ord_ore_functions.sql} | 84 +- .../query_real_ord_ore_operators.sql} | 32 +- ...l_query_types.sql => query_real_types.sql} | 40 +- ...ns.sql => query_smallint_eq_functions.sql} | 36 +- ...rs.sql => query_smallint_eq_operators.sql} | 16 +- ...s.sql => query_smallint_ord_functions.sql} | 84 +- ...l => query_smallint_ord_ope_functions.sql} | 84 +- ...l => query_smallint_ord_ope_operators.sql} | 32 +- ...s.sql => query_smallint_ord_operators.sql} | 32 +- ...l => query_smallint_ord_ore_functions.sql} | 84 +- ...l => query_smallint_ord_ore_operators.sql} | 32 +- ...ery_types.sql => query_smallint_types.sql} | 40 +- ...ctions.sql => query_text_eq_functions.sql} | 36 +- .../query_text_eq_operators.sql} | 16 +- ...ons.sql => query_text_match_functions.sql} | 36 +- ...ors.sql => query_text_match_operators.sql} | 16 +- ...tions.sql => query_text_ord_functions.sql} | 90 +- ...s.sql => query_text_ord_ope_functions.sql} | 90 +- ...s.sql => query_text_ord_ope_operators.sql} | 32 +- .../query_text_ord_operators.sql} | 32 +- ...s.sql => query_text_ord_ore_functions.sql} | 90 +- ...s.sql => query_text_ord_ore_operators.sql} | 32 +- ...ns.sql => query_text_search_functions.sql} | 120 +-- ...rs.sql => query_text_search_operators.sql} | 40 +- ...t_query_types.sql => query_text_types.sql} | 56 +- .../query_timestamp_eq_functions.sql | 47 + ...s.sql => query_timestamp_eq_operators.sql} | 16 +- ....sql => query_timestamp_ord_functions.sql} | 84 +- ... => query_timestamp_ord_ope_functions.sql} | 84 +- ... => query_timestamp_ord_ope_operators.sql} | 32 +- ....sql => query_timestamp_ord_operators.sql} | 32 +- ... => query_timestamp_ord_ore_functions.sql} | 84 +- ... => query_timestamp_ord_ore_operators.sql} | 32 +- ...ry_types.sql => query_timestamp_types.sql} | 40 +- .../timestamp_eq_query_functions.sql | 47 - tasks/docs/generate/test_xml_to_json.py | 6 +- tasks/test/clean_install_v3.sh | 4 +- tasks/test/splinter.sh | 4 +- .../sqlx/snapshots/eql_v3_public_surface.txt | 852 +++++++++--------- tests/sqlx/src/matrix.rs | 4 +- tests/sqlx/src/property.rs | 43 +- .../encrypted_domain/family/jsonb_check.rs | 16 +- .../tests/encrypted_domain/family/support.rs | 6 +- .../tests/encrypted_domain/ope/support.rs | 9 +- tests/sqlx/tests/payload_schema_tests.rs | 4 +- tests/sqlx/tests/v3_jsonb_bindings_tests.rs | 2 +- .../tests/v3_jsonb_operator_surface_tests.rs | 10 +- tests/sqlx/tests/v3_jsonb_tests.rs | 52 +- tests/sqlx/tests/v3_public_surface_tests.rs | 2 +- .../tests/v3_scalar_query_operand_tests.rs | 14 +- tests/sqlx/tests/v3_uninstall_tests.rs | 10 +- 221 files changed, 3204 insertions(+), 3096 deletions(-) rename crates/eql-bindings/schema/v3/{bigint_eq_query.json => query_bigint_eq.json} (91%) rename crates/eql-bindings/schema/v3/{bigint_ord_query.json => query_bigint_ord.json} (92%) rename crates/eql-bindings/schema/v3/{bigint_ord_ope_query.json => query_bigint_ord_ope.json} (92%) rename crates/eql-bindings/schema/v3/{bigint_ord_ore_query.json => query_bigint_ord_ore.json} (92%) rename crates/eql-bindings/schema/v3/{date_eq_query.json => query_date_eq.json} (91%) rename crates/eql-bindings/schema/v3/{date_ord_query.json => query_date_ord.json} (92%) rename crates/eql-bindings/schema/v3/{date_ord_ope_query.json => query_date_ord_ope.json} (92%) rename crates/eql-bindings/schema/v3/{date_ord_ore_query.json => query_date_ord_ore.json} (92%) rename crates/eql-bindings/schema/v3/{double_eq_query.json => query_double_eq.json} (91%) rename crates/eql-bindings/schema/v3/{double_ord_query.json => query_double_ord.json} (92%) rename crates/eql-bindings/schema/v3/{double_ord_ope_query.json => query_double_ord_ope.json} (92%) rename crates/eql-bindings/schema/v3/{double_ord_ore_query.json => query_double_ord_ore.json} (92%) rename crates/eql-bindings/schema/v3/{integer_eq_query.json => query_integer_eq.json} (90%) rename crates/eql-bindings/schema/v3/{integer_ord_query.json => query_integer_ord.json} (92%) rename crates/eql-bindings/schema/v3/{integer_ord_ope_query.json => query_integer_ord_ope.json} (92%) rename crates/eql-bindings/schema/v3/{integer_ord_ore_query.json => query_integer_ord_ore.json} (92%) rename crates/eql-bindings/schema/v3/{jsonb_query.json => query_jsonb.json} (94%) rename crates/eql-bindings/schema/v3/{numeric_eq_query.json => query_numeric_eq.json} (90%) rename crates/eql-bindings/schema/v3/{numeric_ord_query.json => query_numeric_ord.json} (92%) rename crates/eql-bindings/schema/v3/{numeric_ord_ope_query.json => query_numeric_ord_ope.json} (92%) rename crates/eql-bindings/schema/v3/{numeric_ord_ore_query.json => query_numeric_ord_ore.json} (92%) rename crates/eql-bindings/schema/v3/{real_eq_query.json => query_real_eq.json} (91%) rename crates/eql-bindings/schema/v3/{real_ord_query.json => query_real_ord.json} (92%) rename crates/eql-bindings/schema/v3/{real_ord_ope_query.json => query_real_ord_ope.json} (92%) rename crates/eql-bindings/schema/v3/{real_ord_ore_query.json => query_real_ord_ore.json} (92%) rename crates/eql-bindings/schema/v3/{smallint_eq_query.json => query_smallint_eq.json} (90%) rename crates/eql-bindings/schema/v3/{smallint_ord_query.json => query_smallint_ord.json} (92%) rename crates/eql-bindings/schema/v3/{smallint_ord_ope_query.json => query_smallint_ord_ope.json} (92%) rename crates/eql-bindings/schema/v3/{smallint_ord_ore_query.json => query_smallint_ord_ore.json} (92%) rename crates/eql-bindings/schema/v3/{text_eq_query.json => query_text_eq.json} (91%) rename crates/eql-bindings/schema/v3/{text_match_query.json => query_text_match.json} (91%) rename crates/eql-bindings/schema/v3/{text_ord_query.json => query_text_ord.json} (93%) rename crates/eql-bindings/schema/v3/{text_ord_ope_query.json => query_text_ord_ope.json} (93%) rename crates/eql-bindings/schema/v3/{text_ord_ore_query.json => query_text_ord_ore.json} (93%) rename crates/eql-bindings/schema/v3/{text_search_query.json => query_text_search.json} (94%) rename crates/eql-bindings/schema/v3/{timestamp_eq_query.json => query_timestamp_eq.json} (90%) rename crates/eql-bindings/schema/v3/{timestamp_ord_query.json => query_timestamp_ord.json} (92%) rename crates/eql-bindings/schema/v3/{timestamp_ord_ope_query.json => query_timestamp_ord_ope.json} (91%) rename crates/eql-bindings/schema/v3/{timestamp_ord_ore_query.json => query_timestamp_ord_ore.json} (92%) rename src/v3/scalars/bigint/{bigint_eq_query_functions.sql => query_bigint_eq_functions.sql} (50%) rename src/v3/scalars/{double/double_eq_query_operators.sql => bigint/query_bigint_eq_operators.sql} (52%) rename src/v3/scalars/bigint/{bigint_ord_query_functions.sql => query_bigint_ord_functions.sql} (51%) rename src/v3/scalars/bigint/{bigint_ord_ope_query_functions.sql => query_bigint_ord_ope_functions.sql} (51%) rename src/v3/scalars/bigint/{bigint_ord_ope_query_operators.sql => query_bigint_ord_ope_operators.sql} (60%) rename src/v3/scalars/{double/double_ord_query_operators.sql => bigint/query_bigint_ord_operators.sql} (60%) rename src/v3/scalars/bigint/{bigint_ord_ore_query_functions.sql => query_bigint_ord_ore_functions.sql} (50%) rename src/v3/scalars/bigint/{bigint_ord_ore_query_operators.sql => query_bigint_ord_ore_operators.sql} (60%) rename src/v3/scalars/bigint/{bigint_query_types.sql => query_bigint_types.sql} (58%) rename src/v3/scalars/date/{date_eq_query_functions.sql => query_date_eq_functions.sql} (50%) rename src/v3/scalars/{text/text_eq_query_operators.sql => date/query_date_eq_operators.sql} (53%) rename src/v3/scalars/date/{date_ord_query_functions.sql => query_date_ord_functions.sql} (51%) rename src/v3/scalars/date/{date_ord_ope_query_functions.sql => query_date_ord_ope_functions.sql} (51%) rename src/v3/scalars/date/{date_ord_ope_query_operators.sql => query_date_ord_ope_operators.sql} (60%) rename src/v3/scalars/{text/text_ord_query_operators.sql => date/query_date_ord_operators.sql} (61%) rename src/v3/scalars/date/{date_ord_ore_query_functions.sql => query_date_ord_ore_functions.sql} (50%) rename src/v3/scalars/{real/real_ord_ore_query_operators.sql => date/query_date_ord_ore_operators.sql} (60%) rename src/v3/scalars/date/{date_query_types.sql => query_date_types.sql} (58%) rename src/v3/scalars/double/{double_eq_query_functions.sql => query_double_eq_functions.sql} (50%) rename src/v3/scalars/{bigint/bigint_eq_query_operators.sql => double/query_double_eq_operators.sql} (52%) rename src/v3/scalars/double/{double_ord_query_functions.sql => query_double_ord_functions.sql} (51%) rename src/v3/scalars/double/{double_ord_ope_query_functions.sql => query_double_ord_ope_functions.sql} (51%) rename src/v3/scalars/double/{double_ord_ope_query_operators.sql => query_double_ord_ope_operators.sql} (60%) rename src/v3/scalars/{bigint/bigint_ord_query_operators.sql => double/query_double_ord_operators.sql} (60%) rename src/v3/scalars/double/{double_ord_ore_query_functions.sql => query_double_ord_ore_functions.sql} (50%) rename src/v3/scalars/double/{double_ord_ore_query_operators.sql => query_double_ord_ore_operators.sql} (60%) rename src/v3/scalars/double/{double_query_types.sql => query_double_types.sql} (58%) rename src/v3/scalars/integer/{integer_eq_query_functions.sql => query_integer_eq_functions.sql} (50%) rename src/v3/scalars/{numeric/numeric_eq_query_operators.sql => integer/query_integer_eq_operators.sql} (52%) rename src/v3/scalars/integer/{integer_ord_query_functions.sql => query_integer_ord_functions.sql} (51%) rename src/v3/scalars/integer/{integer_ord_ope_query_functions.sql => query_integer_ord_ope_functions.sql} (51%) rename src/v3/scalars/integer/{integer_ord_ope_query_operators.sql => query_integer_ord_ope_operators.sql} (60%) rename src/v3/scalars/{numeric/numeric_ord_query_operators.sql => integer/query_integer_ord_operators.sql} (60%) rename src/v3/scalars/integer/{integer_ord_ore_query_functions.sql => query_integer_ord_ore_functions.sql} (50%) rename src/v3/scalars/integer/{integer_ord_ore_query_operators.sql => query_integer_ord_ore_operators.sql} (60%) rename src/v3/scalars/integer/{integer_query_types.sql => query_integer_types.sql} (59%) rename src/v3/scalars/numeric/{numeric_eq_query_functions.sql => query_numeric_eq_functions.sql} (50%) rename src/v3/scalars/{integer/integer_eq_query_operators.sql => numeric/query_numeric_eq_operators.sql} (52%) rename src/v3/scalars/numeric/{numeric_ord_query_functions.sql => query_numeric_ord_functions.sql} (51%) rename src/v3/scalars/numeric/{numeric_ord_ope_query_functions.sql => query_numeric_ord_ope_functions.sql} (51%) rename src/v3/scalars/numeric/{numeric_ord_ope_query_operators.sql => query_numeric_ord_ope_operators.sql} (60%) rename src/v3/scalars/{integer/integer_ord_query_operators.sql => numeric/query_numeric_ord_operators.sql} (60%) rename src/v3/scalars/numeric/{numeric_ord_ore_query_functions.sql => query_numeric_ord_ore_functions.sql} (50%) rename src/v3/scalars/numeric/{numeric_ord_ore_query_operators.sql => query_numeric_ord_ore_operators.sql} (60%) rename src/v3/scalars/numeric/{numeric_query_types.sql => query_numeric_types.sql} (59%) rename src/v3/scalars/real/{real_eq_query_functions.sql => query_real_eq_functions.sql} (50%) rename src/v3/scalars/real/{real_eq_query_operators.sql => query_real_eq_operators.sql} (53%) rename src/v3/scalars/real/{real_ord_query_functions.sql => query_real_ord_functions.sql} (51%) rename src/v3/scalars/real/{real_ord_ope_query_functions.sql => query_real_ord_ope_functions.sql} (51%) rename src/v3/scalars/real/{real_ord_ope_query_operators.sql => query_real_ord_ope_operators.sql} (60%) rename src/v3/scalars/real/{real_ord_query_operators.sql => query_real_ord_operators.sql} (61%) rename src/v3/scalars/real/{real_ord_ore_query_functions.sql => query_real_ord_ore_functions.sql} (50%) rename src/v3/scalars/{date/date_ord_ore_query_operators.sql => real/query_real_ord_ore_operators.sql} (60%) rename src/v3/scalars/real/{real_query_types.sql => query_real_types.sql} (58%) rename src/v3/scalars/smallint/{smallint_eq_query_functions.sql => query_smallint_eq_functions.sql} (50%) rename src/v3/scalars/smallint/{smallint_eq_query_operators.sql => query_smallint_eq_operators.sql} (52%) rename src/v3/scalars/smallint/{smallint_ord_query_functions.sql => query_smallint_ord_functions.sql} (50%) rename src/v3/scalars/smallint/{smallint_ord_ope_query_functions.sql => query_smallint_ord_ope_functions.sql} (51%) rename src/v3/scalars/smallint/{smallint_ord_ope_query_operators.sql => query_smallint_ord_ope_operators.sql} (60%) rename src/v3/scalars/smallint/{smallint_ord_query_operators.sql => query_smallint_ord_operators.sql} (60%) rename src/v3/scalars/smallint/{smallint_ord_ore_query_functions.sql => query_smallint_ord_ore_functions.sql} (50%) rename src/v3/scalars/smallint/{smallint_ord_ore_query_operators.sql => query_smallint_ord_ore_operators.sql} (60%) rename src/v3/scalars/smallint/{smallint_query_types.sql => query_smallint_types.sql} (59%) rename src/v3/scalars/text/{text_eq_query_functions.sql => query_text_eq_functions.sql} (50%) rename src/v3/scalars/{date/date_eq_query_operators.sql => text/query_text_eq_operators.sql} (53%) rename src/v3/scalars/text/{text_match_query_functions.sql => query_text_match_functions.sql} (54%) rename src/v3/scalars/text/{text_match_query_operators.sql => query_text_match_operators.sql} (51%) rename src/v3/scalars/text/{text_ord_query_functions.sql => query_text_ord_functions.sql} (51%) rename src/v3/scalars/text/{text_ord_ope_query_functions.sql => query_text_ord_ope_functions.sql} (51%) rename src/v3/scalars/text/{text_ord_ope_query_operators.sql => query_text_ord_ope_operators.sql} (60%) rename src/v3/scalars/{date/date_ord_query_operators.sql => text/query_text_ord_operators.sql} (61%) rename src/v3/scalars/text/{text_ord_ore_query_functions.sql => query_text_ord_ore_functions.sql} (50%) rename src/v3/scalars/text/{text_ord_ore_query_operators.sql => query_text_ord_ore_operators.sql} (60%) rename src/v3/scalars/text/{text_search_query_functions.sql => query_text_search_functions.sql} (52%) rename src/v3/scalars/text/{text_search_query_operators.sql => query_text_search_operators.sql} (61%) rename src/v3/scalars/text/{text_query_types.sql => query_text_types.sql} (60%) create mode 100644 src/v3/scalars/timestamp/query_timestamp_eq_functions.sql rename src/v3/scalars/timestamp/{timestamp_eq_query_operators.sql => query_timestamp_eq_operators.sql} (52%) rename src/v3/scalars/timestamp/{timestamp_ord_query_functions.sql => query_timestamp_ord_functions.sql} (50%) rename src/v3/scalars/timestamp/{timestamp_ord_ope_query_functions.sql => query_timestamp_ord_ope_functions.sql} (54%) rename src/v3/scalars/timestamp/{timestamp_ord_ope_query_operators.sql => query_timestamp_ord_ope_operators.sql} (60%) rename src/v3/scalars/timestamp/{timestamp_ord_query_operators.sql => query_timestamp_ord_operators.sql} (60%) rename src/v3/scalars/timestamp/{timestamp_ord_ore_query_functions.sql => query_timestamp_ord_ore_functions.sql} (53%) rename src/v3/scalars/timestamp/{timestamp_ord_ore_query_operators.sql => query_timestamp_ord_ore_operators.sql} (60%) rename src/v3/scalars/timestamp/{timestamp_query_types.sql => query_timestamp_types.sql} (59%) delete mode 100644 src/v3/scalars/timestamp/timestamp_eq_query_functions.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index aa2440b37..f952cac63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Changed +- **Query-operand domains renamed from the `_query` suffix to a `query_` prefix (CIP-3442).** Every scalar query twin introduced by the query-operand surface (above) is now `public.query_` — `query_integer_eq`, `query_text_ord`, `query_timestamp_ord_ope`, … — and the encrypted-JSONB containment needle follows the same convention: `public.jsonb_query` is now `public.query_jsonb`. Predicates cast accordingly (`WHERE col = $1::public.query_integer_eq`; `WHERE doc @> $1::public.query_jsonb`), the `eql-bindings` `DomainType::sql_domain` strings, `QueryPayload::parse` domain names, and the exported JSON Schema file names (`schema/v3/query_.json`) all carry the new names, and `from_v2_query` / `from_v2_query_typed` target them. This supersedes the `_query` naming in the earlier `[Unreleased]` entries; the old names shipped only in 3.0.0 pre-releases. **Why:** the query-operand domains live in `public` alongside the column domains they twin, so Supabase Studio's Table Builder type picker (and any alphabetical type listing) interleaved them with the actual column types (`integer_eq` next to `integer_eq_query`). A shared `query_` prefix makes every never-a-column-type query operand sort together, apart from the column domains. See [U-002](docs/upgrading/v3.0.md#u-002-query-operand-domains-use-the-query_-prefix) in the 3.0 upgrade guide. ([CIP-3442](https://linear.app/cipherstash/issue/CIP-3442)) - **The `eql_v3` tier's JSON envelope version is now `v: 3` (was `v: 2`).** Every `eql_v3` domain CHECK — the generated scalar families and the hand-written `eql_v3.json` SteVec document domain — now pins `VALUE->>'v' = '3'`, and the canonical payload bindings (`SchemaVersion` in `eql-bindings`, the emitted TypeScript alias, and the JSON Schema `const`) accept exactly `3`, rejecting the legacy `2` at the type boundary. The v3 tier previously carried the v2 wire version for continuity; with the tier now diverging from the legacy wire (the new `op` term), the envelope version matches the schema generation. The legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json` and its validation tests) is unchanged and stays `v: 2`. **Compatibility:** payloads produced for the v3 tier must now carry `v: 3` — a cipherstash-client that emits `v: 2` cannot insert into `eql_v3` domain columns until it is updated to emit the v3 envelope. See [U-001](docs/upgrading/v3.0.md#u-001-eql_v3-payloads-carry-v-3) in the 3.0 upgrade guide. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340)) - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`integer`, `bigint`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) diff --git a/CLAUDE.md b/CLAUDE.md index 9e07cf81f..3f59ef1c0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,7 +49,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Directory Structure - `src/` - contains only the self-contained `v3` surface (the modular `eql_v2` component directories were removed in 3.0.0) - `crates/` - Rust workspace: `eql-domains` (the catalog), `eql-codegen` (SQL/bindings generator), `eql-bindings` (payload bindings), `eql-tests-macros` -- `src/v3/` - Self-contained `eql_v3` / `eql_v3_internal` surface: `src/v3/schema.sql` (creates both schemas), forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_256`) — now created in `eql_v3_internal` — the generated scalar encrypted-domain families under `src/v3/scalars//` (user-column domains in `public`; extractors **and the supported comparison wrappers** in `eql_v3`; only the blockers and aggregate state functions in `eql_v3_internal`; plus the shared blocker `src/v3/scalars/functions.sql`), and the hand-written encrypted-JSONB (SteVec) surface under `src/v3/jsonb/` (`types.sql`, `functions.sql`, `operators.sql`, `aggregates.sql`, `blockers.sql` — the `public.json` / `public.jsonb_entry` / `public.jsonb_query` domains and CHECK validators live in `public`; typed operators, `jsonb_entry` comparison wrappers, the containment engine (`ste_vec_contains`), and raw-jsonb GIN helpers (`jsonb_array` / `jsonb_contains` / `jsonb_contained_by`) live in `eql_v3`; only the `is_ste_vec_array` helper and aggregate state functions live in `eql_v3_internal`) +- `src/v3/` - Self-contained `eql_v3` / `eql_v3_internal` surface: `src/v3/schema.sql` (creates both schemas), forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_256`) — now created in `eql_v3_internal` — the generated scalar encrypted-domain families under `src/v3/scalars//` (user-column domains in `public`; extractors **and the supported comparison wrappers** in `eql_v3`; only the blockers and aggregate state functions in `eql_v3_internal`; plus the shared blocker `src/v3/scalars/functions.sql`), and the hand-written encrypted-JSONB (SteVec) surface under `src/v3/jsonb/` (`types.sql`, `functions.sql`, `operators.sql`, `aggregates.sql`, `blockers.sql` — the `public.json` / `public.jsonb_entry` / `public.query_jsonb` domains and CHECK validators live in `public`; typed operators, `jsonb_entry` comparison wrappers, the containment engine (`ste_vec_contains`), and raw-jsonb GIN helpers (`jsonb_array` / `jsonb_contains` / `jsonb_contained_by`) live in `eql_v3`; only the `is_ste_vec_array` helper and aggregate state functions live in `eql_v3_internal`) - `tasks/` - mise task scripts - `tests/sqlx/` - Rust/SQLx test framework (PostgreSQL 14-17 support) - `release/` - Generated SQL installation files @@ -63,7 +63,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`public` schema**, one domain per operator/index capability (`public.` storage-only, `public._eq`, `public._ord`). The domains are `public.integer`, `public.integer_eq`, `public.integer_ord`, `public.integer_ord_ore`; their extractors (`eql_v3.eq_term`, `eql_v3.ord_term`), aggregates (`eql_v3.min`/`max`), **and the supported comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) all live in **`eql_v3`** — the wrappers are public so every operator has a callable function equivalent (Supabase/PostgREST). Only the **blockers** (for unsupported operators — they just raise), the **aggregate state functions**, and the SEM index-term types the extractors/wrappers return and construct (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`) live in **`eql_v3_internal`** — hand-written under `src/v3/sem/`, schema-qualified via the codegen's `INTERNAL_SCHEMA` constant for the generated surface (the codegen's `SCHEMA` constant qualifies the public wrappers; the `operator_entry` renderer picks the backing function's schema by whether the operator is supported) — so the whole v3 surface (both schemas together) is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `public.integer` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `integer`, `smallint`, `bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, and `double`, all following this materializer pattern. `jsonb` is a `CATALOG` family too, but a permanently **hand-written**, not generated, one: its three domains (`public.json` document, `public.jsonb_entry`, `public.jsonb_query`) carry `Shape::SteVecDocument` / `SteVecEntry` / `SteVecQuery` (the `Shape` enum in `crates/eql-domains/src/lib.rs`) instead of `Shape::Scalar`, and their SQL lives under `src/v3/jsonb/` rather than `src/v3/scalars//` — `eql-codegen` renders SQL only for `scalar_families()` (the `Shape::Scalar` rows), so the fixed-envelope ordered-scalar materializer described below never touches `jsonb`. This is a deliberate, permanent split, not a gap awaiting a future generator. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`public` schema**, one domain per operator/index capability (`public.` storage-only, `public._eq`, `public._ord`). The domains are `public.integer`, `public.integer_eq`, `public.integer_ord`, `public.integer_ord_ore`; their extractors (`eql_v3.eq_term`, `eql_v3.ord_term`), aggregates (`eql_v3.min`/`max`), **and the supported comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) all live in **`eql_v3`** — the wrappers are public so every operator has a callable function equivalent (Supabase/PostgREST). Only the **blockers** (for unsupported operators — they just raise), the **aggregate state functions**, and the SEM index-term types the extractors/wrappers return and construct (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`) live in **`eql_v3_internal`** — hand-written under `src/v3/sem/`, schema-qualified via the codegen's `INTERNAL_SCHEMA` constant for the generated surface (the codegen's `SCHEMA` constant qualifies the public wrappers; the `operator_entry` renderer picks the backing function's schema by whether the operator is supported) — so the whole v3 surface (both schemas together) is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `public.integer` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `integer`, `smallint`, `bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, and `double`, all following this materializer pattern. `jsonb` is a `CATALOG` family too, but a permanently **hand-written**, not generated, one: its three domains (`public.json` document, `public.jsonb_entry`, `public.query_jsonb`) carry `Shape::SteVecDocument` / `SteVecEntry` / `SteVecQuery` (the `Shape` enum in `crates/eql-domains/src/lib.rs`) instead of `Shape::Scalar`, and their SQL lives under `src/v3/jsonb/` rather than `src/v3/scalars//` — `eql-codegen` renders SQL only for `scalar_families()` (the `Shape::Scalar` rows), so the fixed-envelope ordered-scalar materializer described below never touches `jsonb`. This is a deliberate, permanent split, not a gap awaiting a future generator. Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `DomainFamily` giving the type `name` (e.g. `bigint`), its `ScalarKind` (the `kind` field), the `Domain`s mapping each generated (bare) domain name to its fixed index `Term`s (`eq => [Hm]`, `ord`/`ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are **committed in place** under `src/v3/scalars//` and drift-gated by `mise run codegen:parity` (regenerate in place + `git diff` + untracked check — the same regenerate-and-diff pattern `types:check` uses for the committed bindings). They are still machine-generated: change the catalog and rebuild, never hand-edit (CI fails on drift). The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` (see above) never enters this pipeline: every consumer here (`generate_all`, `list-types`, the SQLx matrix) iterates `eql_domains::scalar_families()`, which excludes any non-`Shape::Scalar` row, so `jsonb` is invisible to the materializer and the matrix by construction, not by a per-type exception. diff --git a/SUPABASE.md b/SUPABASE.md index f3b3ce951..2e251cc46 100644 --- a/SUPABASE.md +++ b/SUPABASE.md @@ -181,7 +181,7 @@ the `eql_v3.jsonb_path_*` helper functions, all without operator classes: ```sql -- Document containment (GIN-indexable on Supabase) -SELECT * FROM orders WHERE data_encrypted @> $1::public.jsonb_query; +SELECT * FROM orders WHERE data_encrypted @> $1::public.query_jsonb; -- Field access (selector is the deterministic selector hash, typed as text) SELECT data_encrypted -> ''::text FROM orders; diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index 5d17f845e..1c38662b4 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -12,19 +12,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Scalar query-operand bindings (CIP-3432).** Every term-bearing scalar domain now has a generated query twin — `IntegerEqQuery`, `IntegerOrdOpeQuery`, `TextSearchQuery`, … — the **enveloped term-only** operand `{v, i, }` - (envelope minus the ciphertext `c`) for its `public._query` query + (envelope minus the ciphertext `c`) for its `public.query_` query domain, with matching TypeScript bindings (`bindings/v3/*Query.ts`) and JSON - Schemas (`schema/v3/*_query.json`). Storage-only domains (no operators) get no - twin. `QueryPayload` is now catalog-generated — a variant per query twin plus - the SteVec containment needle — superseding the hand-written single-variant - enum. A new `all_query()` inventory exposes the query twins separately from - `all()` (which stays the stored + SteVec conversion-target inventory). + Schemas (`schema/v3/query_.json`). Storage-only domains (no operators) + get no twin. `QueryPayload` is now catalog-generated — a variant per query + twin plus the SteVec containment needle — superseding the hand-written + single-variant enum. A new `all_query()` inventory exposes the query twins + separately from `all()` (which stays the stored + SteVec conversion-target + inventory). ### Changed +- **Query-operand domain names switched to the `query_` prefix + (CIP-3442).** The SQL domain names carried by the query twins — in + `DomainType::sql_domain`, the names `QueryPayload::parse` accepts, and the + exported JSON Schema file names — are now `query_` / + `public.query_` (e.g. `query_integer_eq`), and the SteVec containment + needle is `query_jsonb` (was `jsonb_query`). Matches the renamed SQL surface + so query types sort apart from column types in Supabase Studio's type + picker; supersedes the `_query` naming shipped only in 3.0.0 + pre-releases. - **`from_v2_query` / `from_v2_query_typed` now convert scalar query targets.** A term-bearing scalar target hoists the v2 payload's required terms into the - `{v: 3, i, }` operand for its `_query` domain (dropping the + `{v: 3, i, }` operand for its `query_` domain (dropping the stored `c`/`k`; `bf` reinterpreted to signed `smallint[]`), validated through the generated `QueryPayload`. Storage-only scalar targets still return `UnsupportedQueryTarget`. Previously every scalar query target failed closed. diff --git a/crates/eql-bindings/bindings/v3/BigintEqQuery.ts b/crates/eql-bindings/bindings/v3/BigintEqQuery.ts index bdf9c2268..f78e98000 100644 --- a/crates/eql-bindings/bindings/v3/BigintEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.bigint_eq_query` — equality domain query operand. + * `public.query_bigint_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts index 4de2db413..aee86f6fc 100644 --- a/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.bigint_ord_ope_query` — ordering domain query operand. + * `public.query_bigint_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts index 35e548217..7b70a7d0c 100644 --- a/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.bigint_ord_ore_query` — ordering domain query operand. + * `public.query_bigint_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts index 27a7a7096..5e71c0b24 100644 --- a/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.bigint_ord_query` — ordering domain query operand. + * `public.query_bigint_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DateEqQuery.ts b/crates/eql-bindings/bindings/v3/DateEqQuery.ts index 335e2fb96..707ca4099 100644 --- a/crates/eql-bindings/bindings/v3/DateEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.date_eq_query` — equality domain query operand. + * `public.query_date_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts index 298bf2b7b..63f5fe30f 100644 --- a/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.date_ord_ope_query` — ordering domain query operand. + * `public.query_date_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts index 2717bf235..b013cfdd4 100644 --- a/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.date_ord_ore_query` — ordering domain query operand. + * `public.query_date_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DateOrdQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdQuery.ts index 632fbdfb0..76d4bfc57 100644 --- a/crates/eql-bindings/bindings/v3/DateOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.date_ord_query` — ordering domain query operand. + * `public.query_date_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts b/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts index c4c906e4c..585ad61bb 100644 --- a/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.double_eq_query` — equality domain query operand. + * `public.query_double_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts index 3e128a99d..74f15a670 100644 --- a/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.double_ord_ope_query` — ordering domain query operand. + * `public.query_double_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts index 7f686a036..26fc2a6c5 100644 --- a/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.double_ord_ore_query` — ordering domain query operand. + * `public.query_double_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts index 972799ff9..3b568a68e 100644 --- a/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.double_ord_query` — ordering domain query operand. + * `public.query_double_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts b/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts index 2fe9d70a6..378c53ba2 100644 --- a/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.integer_eq_query` — equality domain query operand. + * `public.query_integer_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts index fba5a5269..e1d1d0e36 100644 --- a/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.integer_ord_ope_query` — ordering domain query operand. + * `public.query_integer_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts index 5ad3c0414..1c074a983 100644 --- a/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.integer_ord_ore_query` — ordering domain query operand. + * `public.query_integer_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts index 855461e5c..6086d6c26 100644 --- a/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.integer_ord_query` — ordering domain query operand. + * `public.query_integer_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericEqQuery.ts b/crates/eql-bindings/bindings/v3/NumericEqQuery.ts index 006d35c59..ef3da9f3b 100644 --- a/crates/eql-bindings/bindings/v3/NumericEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.numeric_eq_query` — equality domain query operand. + * `public.query_numeric_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts index 0b69f372e..2ed5dc25d 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.numeric_ord_ope_query` — ordering domain query operand. + * `public.query_numeric_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts index 42f0c138a..663b73a30 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.numeric_ord_ore_query` — ordering domain query operand. + * `public.query_numeric_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts index ee8dcb744..57814b511 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.numeric_ord_query` — ordering domain query operand. + * `public.query_numeric_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/RealEqQuery.ts b/crates/eql-bindings/bindings/v3/RealEqQuery.ts index 938ebd35e..974ebca18 100644 --- a/crates/eql-bindings/bindings/v3/RealEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.real_eq_query` — equality domain query operand. + * `public.query_real_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts index 2b7554584..dc419d03b 100644 --- a/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.real_ord_ope_query` — ordering domain query operand. + * `public.query_real_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts index 626ab64cc..34d342041 100644 --- a/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.real_ord_ore_query` — ordering domain query operand. + * `public.query_real_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/RealOrdQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdQuery.ts index 3932d80f3..4f2c87eb1 100644 --- a/crates/eql-bindings/bindings/v3/RealOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.real_ord_query` — ordering domain query operand. + * `public.query_real_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts b/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts index ab9f0f460..dbff41d30 100644 --- a/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.smallint_eq_query` — equality domain query operand. + * `public.query_smallint_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts index 95ebc6a6d..d66e49c43 100644 --- a/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.smallint_ord_ope_query` — ordering domain query operand. + * `public.query_smallint_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts index fc9aad722..ae9f64171 100644 --- a/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.smallint_ord_ore_query` — ordering domain query operand. + * `public.query_smallint_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts index 79196471f..f3536cc63 100644 --- a/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.smallint_ord_query` — ordering domain query operand. + * `public.query_smallint_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/SteVecQuery.ts b/crates/eql-bindings/bindings/v3/SteVecQuery.ts index 7d4d64a8d..f2d6734f1 100644 --- a/crates/eql-bindings/bindings/v3/SteVecQuery.ts +++ b/crates/eql-bindings/bindings/v3/SteVecQuery.ts @@ -2,6 +2,6 @@ import type { SteVecQueryEntry } from "./SteVecQueryEntry"; /** - * `public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict. + * `public.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict. */ export type SteVecQuery = { sv: Array, }; diff --git a/crates/eql-bindings/bindings/v3/TextEqQuery.ts b/crates/eql-bindings/bindings/v3/TextEqQuery.ts index 80bc5726a..1cc9400bf 100644 --- a/crates/eql-bindings/bindings/v3/TextEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.text_eq_query` — equality domain query operand. + * `public.query_text_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/TextMatchQuery.ts b/crates/eql-bindings/bindings/v3/TextMatchQuery.ts index 5b2186427..20d0ca751 100644 --- a/crates/eql-bindings/bindings/v3/TextMatchQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextMatchQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.text_match_query` — match domain query operand. + * `public.query_text_match` — match domain query operand. * * Operators: `@>` `<@`. Required keys: `v` `i` `bf`. */ diff --git a/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts index f56e48854..5b54b77d3 100644 --- a/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts @@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.text_ord_ope_query` — ordering domain query operand. + * `public.query_text_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts index 39714e018..422279de9 100644 --- a/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts @@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.text_ord_ore_query` — ordering domain query operand. + * `public.query_text_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/TextOrdQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdQuery.ts index bffe6d452..dbc69e6c5 100644 --- a/crates/eql-bindings/bindings/v3/TextOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextOrdQuery.ts @@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.text_ord_query` — ordering domain query operand. + * `public.query_text_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/TextSearchQuery.ts b/crates/eql-bindings/bindings/v3/TextSearchQuery.ts index 95f880203..fdc56f349 100644 --- a/crates/eql-bindings/bindings/v3/TextSearchQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextSearchQuery.ts @@ -6,7 +6,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.text_search_query` — search domain query operand. + * `public.query_text_search` — search domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts b/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts index 9957cfadc..0c82e6877 100644 --- a/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.timestamp_eq_query` — equality domain query operand. + * `public.query_timestamp_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts index 3aa566c09..8acff6dc1 100644 --- a/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.timestamp_ord_ope_query` — ordering domain query operand. + * `public.query_timestamp_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts index dde9a9651..c6bd44de5 100644 --- a/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.timestamp_ord_ore_query` — ordering domain query operand. + * `public.query_timestamp_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts index 40a87a216..06d140a72 100644 --- a/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.timestamp_ord_query` — ordering domain query operand. + * `public.query_timestamp_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/schema/v3/bigint_eq_query.json b/crates/eql-bindings/schema/v3/query_bigint_eq.json similarity index 91% rename from crates/eql-bindings/schema/v3/bigint_eq_query.json rename to crates/eql-bindings/schema/v3/query_bigint_eq.json index 9288fdc32..a41e36661 100644 --- a/crates/eql-bindings/schema/v3/bigint_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_bigint_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/bigint_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.bigint_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_bigint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/bigint_ord_query.json b/crates/eql-bindings/schema/v3/query_bigint_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/bigint_ord_query.json rename to crates/eql-bindings/schema/v3/query_bigint_ord.json index 98c4bd655..e8ec99d0f 100644 --- a/crates/eql-bindings/schema/v3/bigint_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_bigint_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.bigint_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_bigint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/bigint_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_bigint_ord_ope.json similarity index 92% rename from crates/eql-bindings/schema/v3/bigint_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_bigint_ord_ope.json index 38dc59f27..cb94a32bc 100644 --- a/crates/eql-bindings/schema/v3/bigint_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_bigint_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.bigint_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_bigint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/bigint_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_bigint_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/bigint_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_bigint_ord_ore.json index 74b2a1927..6a563d707 100644 --- a/crates/eql-bindings/schema/v3/bigint_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_bigint_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.bigint_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_bigint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/date_eq_query.json b/crates/eql-bindings/schema/v3/query_date_eq.json similarity index 91% rename from crates/eql-bindings/schema/v3/date_eq_query.json rename to crates/eql-bindings/schema/v3/query_date_eq.json index ab1ca29f8..7344ae272 100644 --- a/crates/eql-bindings/schema/v3/date_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_date_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/date_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_date_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.date_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_date_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/date_ord_query.json b/crates/eql-bindings/schema/v3/query_date_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/date_ord_query.json rename to crates/eql-bindings/schema/v3/query_date_ord.json index d38dd1e3c..4e9451214 100644 --- a/crates/eql-bindings/schema/v3/date_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_date_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.date_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_date_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/date_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_date_ord_ope.json similarity index 92% rename from crates/eql-bindings/schema/v3/date_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_date_ord_ope.json index 59906195c..240eed1a9 100644 --- a/crates/eql-bindings/schema/v3/date_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_date_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.date_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_date_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/date_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_date_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/date_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_date_ord_ore.json index f7d0cc7fb..8566b6c9c 100644 --- a/crates/eql-bindings/schema/v3/date_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_date_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.date_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_date_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/double_eq_query.json b/crates/eql-bindings/schema/v3/query_double_eq.json similarity index 91% rename from crates/eql-bindings/schema/v3/double_eq_query.json rename to crates/eql-bindings/schema/v3/query_double_eq.json index 85fee1c0c..29c30d53c 100644 --- a/crates/eql-bindings/schema/v3/double_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_double_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/double_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_double_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.double_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_double_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/double_ord_query.json b/crates/eql-bindings/schema/v3/query_double_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/double_ord_query.json rename to crates/eql-bindings/schema/v3/query_double_ord.json index c2d4d88e4..a02a18af8 100644 --- a/crates/eql-bindings/schema/v3/double_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_double_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.double_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_double_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/double_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_double_ord_ope.json similarity index 92% rename from crates/eql-bindings/schema/v3/double_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_double_ord_ope.json index d4fca8bff..d9eea5cfe 100644 --- a/crates/eql-bindings/schema/v3/double_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_double_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.double_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_double_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/double_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_double_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/double_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_double_ord_ore.json index a02376bb4..fdf9a2fac 100644 --- a/crates/eql-bindings/schema/v3/double_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_double_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.double_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_double_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/integer_eq_query.json b/crates/eql-bindings/schema/v3/query_integer_eq.json similarity index 90% rename from crates/eql-bindings/schema/v3/integer_eq_query.json rename to crates/eql-bindings/schema/v3/query_integer_eq.json index 9083fdcc5..5afe889a3 100644 --- a/crates/eql-bindings/schema/v3/integer_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_integer_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/integer_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.integer_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_integer_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/integer_ord_query.json b/crates/eql-bindings/schema/v3/query_integer_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/integer_ord_query.json rename to crates/eql-bindings/schema/v3/query_integer_ord.json index f42a34899..5b78689e1 100644 --- a/crates/eql-bindings/schema/v3/integer_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_integer_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.integer_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_integer_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/integer_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_integer_ord_ope.json similarity index 92% rename from crates/eql-bindings/schema/v3/integer_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_integer_ord_ope.json index 8e72ca611..6cab032d8 100644 --- a/crates/eql-bindings/schema/v3/integer_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_integer_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.integer_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_integer_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/integer_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_integer_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/integer_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_integer_ord_ore.json index 0f7e43152..d433907af 100644 --- a/crates/eql-bindings/schema/v3/integer_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_integer_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.integer_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_integer_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/jsonb_query.json b/crates/eql-bindings/schema/v3/query_jsonb.json similarity index 94% rename from crates/eql-bindings/schema/v3/jsonb_query.json rename to crates/eql-bindings/schema/v3/query_jsonb.json index d33e4fe83..639243505 100644 --- a/crates/eql-bindings/schema/v3/jsonb_query.json +++ b/crates/eql-bindings/schema/v3/query_jsonb.json @@ -49,10 +49,10 @@ "type": "object" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/jsonb_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_jsonb.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.", + "description": "`public.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict.", "properties": { "sv": { "items": { diff --git a/crates/eql-bindings/schema/v3/numeric_eq_query.json b/crates/eql-bindings/schema/v3/query_numeric_eq.json similarity index 90% rename from crates/eql-bindings/schema/v3/numeric_eq_query.json rename to crates/eql-bindings/schema/v3/query_numeric_eq.json index 535d7425d..e81c3d62c 100644 --- a/crates/eql-bindings/schema/v3/numeric_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_numeric_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.numeric_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_numeric_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/numeric_ord_query.json b/crates/eql-bindings/schema/v3/query_numeric_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/numeric_ord_query.json rename to crates/eql-bindings/schema/v3/query_numeric_ord.json index 71ae7d757..41c383cd4 100644 --- a/crates/eql-bindings/schema/v3/numeric_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_numeric_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.numeric_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_numeric_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_numeric_ord_ope.json similarity index 92% rename from crates/eql-bindings/schema/v3/numeric_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_numeric_ord_ope.json index 15525ad8c..a6a5d830f 100644 --- a/crates/eql-bindings/schema/v3/numeric_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_numeric_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.numeric_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_numeric_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_numeric_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/numeric_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_numeric_ord_ore.json index 3b8f12209..08029e6eb 100644 --- a/crates/eql-bindings/schema/v3/numeric_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_numeric_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.numeric_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_numeric_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/real_eq_query.json b/crates/eql-bindings/schema/v3/query_real_eq.json similarity index 91% rename from crates/eql-bindings/schema/v3/real_eq_query.json rename to crates/eql-bindings/schema/v3/query_real_eq.json index 3f5176f4f..008aa3a64 100644 --- a/crates/eql-bindings/schema/v3/real_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_real_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/real_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_real_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.real_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_real_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/real_ord_query.json b/crates/eql-bindings/schema/v3/query_real_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/real_ord_query.json rename to crates/eql-bindings/schema/v3/query_real_ord.json index ec12f83d6..c63fd1667 100644 --- a/crates/eql-bindings/schema/v3/real_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_real_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.real_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_real_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/real_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_real_ord_ope.json similarity index 92% rename from crates/eql-bindings/schema/v3/real_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_real_ord_ope.json index 429604ae8..83d2d5da2 100644 --- a/crates/eql-bindings/schema/v3/real_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_real_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.real_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_real_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/real_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_real_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/real_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_real_ord_ore.json index eb1b73816..1a2292cc1 100644 --- a/crates/eql-bindings/schema/v3/real_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_real_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.real_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_real_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/smallint_eq_query.json b/crates/eql-bindings/schema/v3/query_smallint_eq.json similarity index 90% rename from crates/eql-bindings/schema/v3/smallint_eq_query.json rename to crates/eql-bindings/schema/v3/query_smallint_eq.json index d05d8d080..f470ad5b7 100644 --- a/crates/eql-bindings/schema/v3/smallint_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_smallint_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/smallint_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.smallint_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_smallint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/smallint_ord_query.json b/crates/eql-bindings/schema/v3/query_smallint_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/smallint_ord_query.json rename to crates/eql-bindings/schema/v3/query_smallint_ord.json index 475e08bd7..77516f124 100644 --- a/crates/eql-bindings/schema/v3/smallint_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_smallint_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.smallint_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_smallint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_smallint_ord_ope.json similarity index 92% rename from crates/eql-bindings/schema/v3/smallint_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_smallint_ord_ope.json index 9778bfff2..884f8bf80 100644 --- a/crates/eql-bindings/schema/v3/smallint_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_smallint_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.smallint_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_smallint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_smallint_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/smallint_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_smallint_ord_ore.json index c29e09753..c798f0318 100644 --- a/crates/eql-bindings/schema/v3/smallint_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_smallint_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.smallint_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_smallint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/text_eq_query.json b/crates/eql-bindings/schema/v3/query_text_eq.json similarity index 91% rename from crates/eql-bindings/schema/v3/text_eq_query.json rename to crates/eql-bindings/schema/v3/query_text_eq.json index 833281305..187acd175 100644 --- a/crates/eql-bindings/schema/v3/text_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_text_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/text_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_text_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.text_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_text_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/text_match_query.json b/crates/eql-bindings/schema/v3/query_text_match.json similarity index 91% rename from crates/eql-bindings/schema/v3/text_match_query.json rename to crates/eql-bindings/schema/v3/query_text_match.json index 476bd52da..aa3985098 100644 --- a/crates/eql-bindings/schema/v3/text_match_query.json +++ b/crates/eql-bindings/schema/v3/query_text_match.json @@ -35,10 +35,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/text_match_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_text_match.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.text_match_query` — match domain query operand.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `bf`.", + "description": "`public.query_text_match` — match domain query operand.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `bf`.", "properties": { "bf": { "$ref": "#/$defs/BloomFilter" diff --git a/crates/eql-bindings/schema/v3/text_ord_query.json b/crates/eql-bindings/schema/v3/query_text_ord.json similarity index 93% rename from crates/eql-bindings/schema/v3/text_ord_query.json rename to crates/eql-bindings/schema/v3/query_text_ord.json index 79fd6c436..4165b1d89 100644 --- a/crates/eql-bindings/schema/v3/text_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_text_ord.json @@ -36,10 +36,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.text_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", + "description": "`public.query_text_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/text_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_text_ord_ope.json similarity index 93% rename from crates/eql-bindings/schema/v3/text_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_text_ord_ope.json index d3758fea8..3de613974 100644 --- a/crates/eql-bindings/schema/v3/text_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_text_ord_ope.json @@ -33,10 +33,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.text_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`.", + "description": "`public.query_text_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/text_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_text_ord_ore.json similarity index 93% rename from crates/eql-bindings/schema/v3/text_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_text_ord_ore.json index cdd266373..c76d3f36d 100644 --- a/crates/eql-bindings/schema/v3/text_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_text_ord_ore.json @@ -36,10 +36,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.text_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", + "description": "`public.query_text_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/text_search_query.json b/crates/eql-bindings/schema/v3/query_text_search.json similarity index 94% rename from crates/eql-bindings/schema/v3/text_search_query.json rename to crates/eql-bindings/schema/v3/query_text_search.json index b19db9d53..7fe1613c4 100644 --- a/crates/eql-bindings/schema/v3/text_search_query.json +++ b/crates/eql-bindings/schema/v3/query_text_search.json @@ -46,10 +46,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/text_search_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_text_search.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.text_search_query` — search domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`.", + "description": "`public.query_text_search` — search domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`.", "properties": { "bf": { "$ref": "#/$defs/BloomFilter" diff --git a/crates/eql-bindings/schema/v3/timestamp_eq_query.json b/crates/eql-bindings/schema/v3/query_timestamp_eq.json similarity index 90% rename from crates/eql-bindings/schema/v3/timestamp_eq_query.json rename to crates/eql-bindings/schema/v3/query_timestamp_eq.json index a49427932..58ea64da2 100644 --- a/crates/eql-bindings/schema/v3/timestamp_eq_query.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_eq.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_eq_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.timestamp_eq_query` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`public.query_timestamp_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_query.json b/crates/eql-bindings/schema/v3/query_timestamp_ord.json similarity index 92% rename from crates/eql-bindings/schema/v3/timestamp_ord_query.json rename to crates/eql-bindings/schema/v3/query_timestamp_ord.json index 2dfdc5279..d02a604b4 100644 --- a/crates/eql-bindings/schema/v3/timestamp_ord_query.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_ord.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.timestamp_ord_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_timestamp_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ope_query.json b/crates/eql-bindings/schema/v3/query_timestamp_ord_ope.json similarity index 91% rename from crates/eql-bindings/schema/v3/timestamp_ord_ope_query.json rename to crates/eql-bindings/schema/v3/query_timestamp_ord_ope.json index 02ef7beb5..f0db072d1 100644 --- a/crates/eql-bindings/schema/v3/timestamp_ord_ope_query.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_ord_ope.json @@ -29,10 +29,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ope_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.timestamp_ord_ope_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`public.query_timestamp_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ore_query.json b/crates/eql-bindings/schema/v3/query_timestamp_ord_ore.json similarity index 92% rename from crates/eql-bindings/schema/v3/timestamp_ord_ore_query.json rename to crates/eql-bindings/schema/v3/query_timestamp_ord_ore.json index 6f9700b32..7535b51ce 100644 --- a/crates/eql-bindings/schema/v3/timestamp_ord_ore_query.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_ord_ore.json @@ -32,10 +32,10 @@ "type": "integer" } }, - "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ore_query.json", + "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.timestamp_ord_ore_query` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`public.query_timestamp_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/src/from_v2/error.rs b/crates/eql-bindings/src/from_v2/error.rs index 0b976deae..e9013d68d 100644 --- a/crates/eql-bindings/src/from_v2/error.rs +++ b/crates/eql-bindings/src/from_v2/error.rs @@ -24,7 +24,7 @@ pub enum FromV2Error { }, /// [`TargetDomain::parse`](super::TargetDomain::parse) did not find the /// name in the catalog-generated inventory (or it names a SteVec shape — - /// `jsonb_entry` / `jsonb_query` — that is not a conversion target). + /// `jsonb_entry` / `query_jsonb` — that is not a conversion target). UnknownDomain { /// The name that failed to resolve. name: String, @@ -35,7 +35,7 @@ pub enum FromV2Error { /// is [`FromV2Error::AmbiguousTerm`]) with `entry` locating the offender. MissingTerm { /// The (unqualified) target domain name, e.g. `text_eq`, or the - /// SteVec shape (`json` / `jsonb_query`) for per-entry terms. + /// SteVec shape (`json` / `query_jsonb`) for per-entry terms. domain: String, /// The missing wire key (`hm`/`ob`/`bf`/`op`, or `hm|oc` for entries). key: String, diff --git a/crates/eql-bindings/src/from_v2/mod.rs b/crates/eql-bindings/src/from_v2/mod.rs index 9f099d8c6..977c1e732 100644 --- a/crates/eql-bindings/src/from_v2/mod.rs +++ b/crates/eql-bindings/src/from_v2/mod.rs @@ -66,7 +66,7 @@ //! `eql_v3.to_ste_vec_query` does (stray `a` markers and `c` ciphertexts are //! stripped). A term-bearing scalar target hoists the target's required terms //! into the enveloped term-only operand `{v: 3, i, }` for its -//! `_query` domain — the query counterpart of the stored conversion, +//! `query_` domain — the query counterpart of the stored conversion, //! dropping `c`/`k` (CIP-3432). A STORAGE-ONLY scalar target (no terms, no //! operators) has no query operand and returns //! [`FromV2Error::UnsupportedQueryTarget`]. @@ -173,7 +173,7 @@ fn convert(v2: &Value, target: TargetDomain) -> Result { /// /// A term-bearing [`TargetDomain::Scalar`]: the target's required terms are /// hoisted into the enveloped term-only operand `{v: 3, i, }` for its -/// `_query` domain, dropping `c`/`k` (`bf` reinterpreted to signed +/// `query_` domain, dropping `c`/`k` (`bf` reinterpreted to signed /// `smallint[]`). A storage-only scalar target has no operators and returns /// [`FromV2Error::UnsupportedQueryTarget`]. /// @@ -183,7 +183,7 @@ fn convert(v2: &Value, target: TargetDomain) -> Result { pub fn from_v2_query(v2: &Value, target: TargetDomain) -> Result { let out = convert_query(v2, target)?; // Validate through the generated QueryPayload strict parser (the query-side - // counterpart of validate_as), keyed on the target's `_query` domain. + // counterpart of validate_as), keyed on the target's `query_` domain. parse_query(&query_domain_name(target), &out)?; Ok(out) } @@ -202,7 +202,7 @@ pub fn from_v2_query(v2: &Value, target: TargetDomain) -> Result_query` [`QueryPayload`] +/// term-bearing scalars yield the matching `query_` [`QueryPayload`] /// variant. pub fn from_v2_query_typed(v2: &Value, target: TargetDomain) -> Result { let out = convert_query(v2, target)?; @@ -210,12 +210,13 @@ pub fn from_v2_query_typed(v2: &Value, target: TargetDomain) -> Result_query`, or `jsonb_query` for the SteVec needle. (Replaces the -/// old single `QUERY_DOMAIN` constant now that scalar query shapes exist.) +/// twin `query_`, or `query_jsonb` for the hand-written SteVec needle — +/// both on the query-operand PREFIX convention (CIP-3442). (Replaces the old +/// single `QUERY_DOMAIN` constant now that scalar query shapes exist.) fn query_domain_name(target: TargetDomain) -> String { match target { - TargetDomain::Json => "jsonb_query".to_string(), - TargetDomain::Scalar(t) => format!("{}_query", t.domain()), + TargetDomain::Json => "query_jsonb".to_string(), + TargetDomain::Scalar(t) => format!("query_{}", t.domain()), } } @@ -243,7 +244,7 @@ fn convert_query(v2: &Value, target: TargetDomain) -> Result } /// v2 scalar query payload → v3 enveloped term-only operand `{v: 3, i, -/// }` for `target`'s `_query` domain. Hoists exactly the target's +/// }` for `target`'s `query_` domain. Hoists exactly the target's /// required terms out of the v2 payload (a query operand may omit the v2 /// envelope), dropping `c`/`k` — the query counterpart of [`convert_scalar`] /// (which keeps `c`). A STORAGE-ONLY target (no terms, no operators) has no @@ -335,7 +336,7 @@ fn validate_as(domain: &str, value: &Value) -> Result<(), FromV2Error> { .find(|d| d.domain() == domain) .unwrap_or_else(|| { // `domain` always came from the same inventory via - // `TargetDomain::parse` (or is the literal "json"/"jsonb_query"). + // `TargetDomain::parse` (or is the literal "json"/"query_jsonb"). unreachable!("domain {domain} resolved by parse must be in the inventory") }); entry.parse_value(value).map_err(FromV2Error::Invalid) @@ -483,7 +484,7 @@ impl EntryShape { fn domain(self) -> &'static str { match self { Self::Document => "json", - Self::Query => "jsonb_query", + Self::Query => "query_jsonb", } } } diff --git a/crates/eql-bindings/src/from_v2/target.rs b/crates/eql-bindings/src/from_v2/target.rs index 2e08d181d..e77e1de23 100644 --- a/crates/eql-bindings/src/from_v2/target.rs +++ b/crates/eql-bindings/src/from_v2/target.rs @@ -50,7 +50,7 @@ impl TargetDomain { /// Shape-aware: scalar domains resolve to [`TargetDomain::Scalar`] with /// their catalog term keys; the SteVec document domain `json` resolves to /// [`TargetDomain::Json`]; the remaining SteVec shapes (`jsonb_entry`, - /// `jsonb_query`) are inventory members but not conversion targets, so + /// `query_jsonb`) are inventory members but not conversion targets, so /// they — like any unknown name — return /// [`FromV2Error::UnknownDomain`]. pub fn parse(name: &str) -> Result { diff --git a/crates/eql-bindings/src/v3/bigint.rs b/crates/eql-bindings/src/v3/bigint.rs index 9951b2186..3e9ee2d09 100644 --- a/crates/eql-bindings/src/v3/bigint.rs +++ b/crates/eql-bindings/src/v3/bigint.rs @@ -165,7 +165,7 @@ impl DomainType for BigintOrdOpe { schema_for!(BigintOrdOpe) } } -/// `public.bigint_eq_query` — equality domain query operand. +/// `public.query_bigint_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct BigintEqQuery { } impl DomainType for BigintEqQuery { fn sql_domain_static() -> &'static str { - "public.bigint_eq_query" + "public.query_bigint_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for BigintEqQuery { schema_for!(BigintEqQuery) } } -/// `public.bigint_ord_ore_query` — ordering domain query operand. +/// `public.query_bigint_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct BigintOrdOreQuery { } impl DomainType for BigintOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.bigint_ord_ore_query" + "public.query_bigint_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for BigintOrdOreQuery { schema_for!(BigintOrdOreQuery) } } -/// `public.bigint_ord_query` — ordering domain query operand. +/// `public.query_bigint_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct BigintOrdQuery { } impl DomainType for BigintOrdQuery { fn sql_domain_static() -> &'static str { - "public.bigint_ord_query" + "public.query_bigint_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for BigintOrdQuery { schema_for!(BigintOrdQuery) } } -/// `public.bigint_ord_ope_query` — ordering domain query operand. +/// `public.query_bigint_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct BigintOrdOpeQuery { } impl DomainType for BigintOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.bigint_ord_ope_query" + "public.query_bigint_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs index 198c7de22..d64a426a6 100644 --- a/crates/eql-bindings/src/v3/date.rs +++ b/crates/eql-bindings/src/v3/date.rs @@ -165,7 +165,7 @@ impl DomainType for DateOrdOpe { schema_for!(DateOrdOpe) } } -/// `public.date_eq_query` — equality domain query operand. +/// `public.query_date_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct DateEqQuery { } impl DomainType for DateEqQuery { fn sql_domain_static() -> &'static str { - "public.date_eq_query" + "public.query_date_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for DateEqQuery { schema_for!(DateEqQuery) } } -/// `public.date_ord_ore_query` — ordering domain query operand. +/// `public.query_date_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct DateOrdOreQuery { } impl DomainType for DateOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.date_ord_ore_query" + "public.query_date_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for DateOrdOreQuery { schema_for!(DateOrdOreQuery) } } -/// `public.date_ord_query` — ordering domain query operand. +/// `public.query_date_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct DateOrdQuery { } impl DomainType for DateOrdQuery { fn sql_domain_static() -> &'static str { - "public.date_ord_query" + "public.query_date_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for DateOrdQuery { schema_for!(DateOrdQuery) } } -/// `public.date_ord_ope_query` — ordering domain query operand. +/// `public.query_date_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct DateOrdOpeQuery { } impl DomainType for DateOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.date_ord_ope_query" + "public.query_date_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/double.rs b/crates/eql-bindings/src/v3/double.rs index 93f050df8..1dc24359c 100644 --- a/crates/eql-bindings/src/v3/double.rs +++ b/crates/eql-bindings/src/v3/double.rs @@ -165,7 +165,7 @@ impl DomainType for DoubleOrdOpe { schema_for!(DoubleOrdOpe) } } -/// `public.double_eq_query` — equality domain query operand. +/// `public.query_double_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct DoubleEqQuery { } impl DomainType for DoubleEqQuery { fn sql_domain_static() -> &'static str { - "public.double_eq_query" + "public.query_double_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for DoubleEqQuery { schema_for!(DoubleEqQuery) } } -/// `public.double_ord_ore_query` — ordering domain query operand. +/// `public.query_double_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct DoubleOrdOreQuery { } impl DomainType for DoubleOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.double_ord_ore_query" + "public.query_double_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for DoubleOrdOreQuery { schema_for!(DoubleOrdOreQuery) } } -/// `public.double_ord_query` — ordering domain query operand. +/// `public.query_double_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct DoubleOrdQuery { } impl DomainType for DoubleOrdQuery { fn sql_domain_static() -> &'static str { - "public.double_ord_query" + "public.query_double_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for DoubleOrdQuery { schema_for!(DoubleOrdQuery) } } -/// `public.double_ord_ope_query` — ordering domain query operand. +/// `public.query_double_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct DoubleOrdOpeQuery { } impl DomainType for DoubleOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.double_ord_ope_query" + "public.query_double_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/integer.rs b/crates/eql-bindings/src/v3/integer.rs index 631b57da6..ab582392f 100644 --- a/crates/eql-bindings/src/v3/integer.rs +++ b/crates/eql-bindings/src/v3/integer.rs @@ -165,7 +165,7 @@ impl DomainType for IntegerOrdOpe { schema_for!(IntegerOrdOpe) } } -/// `public.integer_eq_query` — equality domain query operand. +/// `public.query_integer_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct IntegerEqQuery { } impl DomainType for IntegerEqQuery { fn sql_domain_static() -> &'static str { - "public.integer_eq_query" + "public.query_integer_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for IntegerEqQuery { schema_for!(IntegerEqQuery) } } -/// `public.integer_ord_ore_query` — ordering domain query operand. +/// `public.query_integer_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct IntegerOrdOreQuery { } impl DomainType for IntegerOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.integer_ord_ore_query" + "public.query_integer_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for IntegerOrdOreQuery { schema_for!(IntegerOrdOreQuery) } } -/// `public.integer_ord_query` — ordering domain query operand. +/// `public.query_integer_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct IntegerOrdQuery { } impl DomainType for IntegerOrdQuery { fn sql_domain_static() -> &'static str { - "public.integer_ord_query" + "public.query_integer_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for IntegerOrdQuery { schema_for!(IntegerOrdQuery) } } -/// `public.integer_ord_ope_query` — ordering domain query operand. +/// `public.query_integer_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct IntegerOrdOpeQuery { } impl DomainType for IntegerOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.integer_ord_ope_query" + "public.query_integer_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/inventory.rs b/crates/eql-bindings/src/v3/inventory.rs index 1a08dba09..f91fce708 100644 --- a/crates/eql-bindings/src/v3/inventory.rs +++ b/crates/eql-bindings/src/v3/inventory.rs @@ -61,7 +61,7 @@ pub fn all() -> Vec> { Box::new(PhantomData::), ] } -/// Every v3 QUERY-operand twin (`public._query`, the enveloped +/// Every v3 QUERY-operand twin (`public.query_`, the enveloped /// term-only operand), in `eql-domains::CATALOG` order — generated. /// Separate from [`all`] so query domains never resolve as stored /// conversion targets; used by the JSON Schema export and query diff --git a/crates/eql-bindings/src/v3/jsonb.rs b/crates/eql-bindings/src/v3/jsonb.rs index 7f22c4cab..40af3b6da 100644 --- a/crates/eql-bindings/src/v3/jsonb.rs +++ b/crates/eql-bindings/src/v3/jsonb.rs @@ -105,7 +105,7 @@ pub struct SteVecEntry { pub term: SteVecTerm, } -/// `public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict. +/// `public.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] @@ -157,4 +157,4 @@ macro_rules! ste_vec_domain_type { ste_vec_domain_type!(SteVecDocument, "public.json"); ste_vec_domain_type!(SteVecEntry, "public.jsonb_entry"); -ste_vec_domain_type!(SteVecQuery, "public.jsonb_query"); +ste_vec_domain_type!(SteVecQuery, "public.query_jsonb"); diff --git a/crates/eql-bindings/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs index 044a9c8ef..75cbd69c5 100644 --- a/crates/eql-bindings/src/v3/numeric.rs +++ b/crates/eql-bindings/src/v3/numeric.rs @@ -165,7 +165,7 @@ impl DomainType for NumericOrdOpe { schema_for!(NumericOrdOpe) } } -/// `public.numeric_eq_query` — equality domain query operand. +/// `public.query_numeric_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct NumericEqQuery { } impl DomainType for NumericEqQuery { fn sql_domain_static() -> &'static str { - "public.numeric_eq_query" + "public.query_numeric_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for NumericEqQuery { schema_for!(NumericEqQuery) } } -/// `public.numeric_ord_ore_query` — ordering domain query operand. +/// `public.query_numeric_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct NumericOrdOreQuery { } impl DomainType for NumericOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.numeric_ord_ore_query" + "public.query_numeric_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for NumericOrdOreQuery { schema_for!(NumericOrdOreQuery) } } -/// `public.numeric_ord_query` — ordering domain query operand. +/// `public.query_numeric_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct NumericOrdQuery { } impl DomainType for NumericOrdQuery { fn sql_domain_static() -> &'static str { - "public.numeric_ord_query" + "public.query_numeric_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for NumericOrdQuery { schema_for!(NumericOrdQuery) } } -/// `public.numeric_ord_ope_query` — ordering domain query operand. +/// `public.query_numeric_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct NumericOrdOpeQuery { } impl DomainType for NumericOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.numeric_ord_ope_query" + "public.query_numeric_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/query_payload.rs b/crates/eql-bindings/src/v3/query_payload.rs index f66f8e29e..d1afdc2f1 100644 --- a/crates/eql-bindings/src/v3/query_payload.rs +++ b/crates/eql-bindings/src/v3/query_payload.rs @@ -3,9 +3,9 @@ use super::domain_type::DomainType; use serde::{Deserialize, Serialize}; /// Every v3 QUERY-operand shape in one type: one variant per term-bearing -/// scalar query twin (`public._query`, the enveloped term-only +/// scalar query twin (`public.query_`, the enveloped term-only /// operand — `{v, i, }`, no `c`) plus the SteVec containment -/// needle (`public.jsonb_query`). Generated from the catalog, so it +/// needle (`public.query_jsonb`). Generated from the catalog, so it /// cannot drift when the catalog grows. /// /// Serialization is exactly the inner struct's (`#[serde(untagged)]` @@ -17,90 +17,90 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq, Serialize)] #[serde(untagged)] pub enum QueryPayload { - /// The `public.integer_eq_query` query operand. + /// The `public.query_integer_eq` query operand. IntegerEqQuery(super::integer::IntegerEqQuery), - /// The `public.integer_ord_ore_query` query operand. + /// The `public.query_integer_ord_ore` query operand. IntegerOrdOreQuery(super::integer::IntegerOrdOreQuery), - /// The `public.integer_ord_query` query operand. + /// The `public.query_integer_ord` query operand. IntegerOrdQuery(super::integer::IntegerOrdQuery), - /// The `public.integer_ord_ope_query` query operand. + /// The `public.query_integer_ord_ope` query operand. IntegerOrdOpeQuery(super::integer::IntegerOrdOpeQuery), - /// The `public.smallint_eq_query` query operand. + /// The `public.query_smallint_eq` query operand. SmallintEqQuery(super::smallint::SmallintEqQuery), - /// The `public.smallint_ord_ore_query` query operand. + /// The `public.query_smallint_ord_ore` query operand. SmallintOrdOreQuery(super::smallint::SmallintOrdOreQuery), - /// The `public.smallint_ord_query` query operand. + /// The `public.query_smallint_ord` query operand. SmallintOrdQuery(super::smallint::SmallintOrdQuery), - /// The `public.smallint_ord_ope_query` query operand. + /// The `public.query_smallint_ord_ope` query operand. SmallintOrdOpeQuery(super::smallint::SmallintOrdOpeQuery), - /// The `public.bigint_eq_query` query operand. + /// The `public.query_bigint_eq` query operand. BigintEqQuery(super::bigint::BigintEqQuery), - /// The `public.bigint_ord_ore_query` query operand. + /// The `public.query_bigint_ord_ore` query operand. BigintOrdOreQuery(super::bigint::BigintOrdOreQuery), - /// The `public.bigint_ord_query` query operand. + /// The `public.query_bigint_ord` query operand. BigintOrdQuery(super::bigint::BigintOrdQuery), - /// The `public.bigint_ord_ope_query` query operand. + /// The `public.query_bigint_ord_ope` query operand. BigintOrdOpeQuery(super::bigint::BigintOrdOpeQuery), - /// The `public.date_eq_query` query operand. + /// The `public.query_date_eq` query operand. DateEqQuery(super::date::DateEqQuery), - /// The `public.date_ord_ore_query` query operand. + /// The `public.query_date_ord_ore` query operand. DateOrdOreQuery(super::date::DateOrdOreQuery), - /// The `public.date_ord_query` query operand. + /// The `public.query_date_ord` query operand. DateOrdQuery(super::date::DateOrdQuery), - /// The `public.date_ord_ope_query` query operand. + /// The `public.query_date_ord_ope` query operand. DateOrdOpeQuery(super::date::DateOrdOpeQuery), - /// The `public.timestamp_eq_query` query operand. + /// The `public.query_timestamp_eq` query operand. TimestampEqQuery(super::timestamp::TimestampEqQuery), - /// The `public.timestamp_ord_ore_query` query operand. + /// The `public.query_timestamp_ord_ore` query operand. TimestampOrdOreQuery(super::timestamp::TimestampOrdOreQuery), - /// The `public.timestamp_ord_query` query operand. + /// The `public.query_timestamp_ord` query operand. TimestampOrdQuery(super::timestamp::TimestampOrdQuery), - /// The `public.timestamp_ord_ope_query` query operand. + /// The `public.query_timestamp_ord_ope` query operand. TimestampOrdOpeQuery(super::timestamp::TimestampOrdOpeQuery), - /// The `public.numeric_eq_query` query operand. + /// The `public.query_numeric_eq` query operand. NumericEqQuery(super::numeric::NumericEqQuery), - /// The `public.numeric_ord_ore_query` query operand. + /// The `public.query_numeric_ord_ore` query operand. NumericOrdOreQuery(super::numeric::NumericOrdOreQuery), - /// The `public.numeric_ord_query` query operand. + /// The `public.query_numeric_ord` query operand. NumericOrdQuery(super::numeric::NumericOrdQuery), - /// The `public.numeric_ord_ope_query` query operand. + /// The `public.query_numeric_ord_ope` query operand. NumericOrdOpeQuery(super::numeric::NumericOrdOpeQuery), - /// The `public.text_eq_query` query operand. + /// The `public.query_text_eq` query operand. TextEqQuery(super::text::TextEqQuery), - /// The `public.text_match_query` query operand. + /// The `public.query_text_match` query operand. TextMatchQuery(super::text::TextMatchQuery), - /// The `public.text_ord_ore_query` query operand. + /// The `public.query_text_ord_ore` query operand. TextOrdOreQuery(super::text::TextOrdOreQuery), - /// The `public.text_ord_query` query operand. + /// The `public.query_text_ord` query operand. TextOrdQuery(super::text::TextOrdQuery), - /// The `public.text_ord_ope_query` query operand. + /// The `public.query_text_ord_ope` query operand. TextOrdOpeQuery(super::text::TextOrdOpeQuery), - /// The `public.text_search_query` query operand. + /// The `public.query_text_search` query operand. TextSearchQuery(super::text::TextSearchQuery), - /// The `public.real_eq_query` query operand. + /// The `public.query_real_eq` query operand. RealEqQuery(super::real::RealEqQuery), - /// The `public.real_ord_ore_query` query operand. + /// The `public.query_real_ord_ore` query operand. RealOrdOreQuery(super::real::RealOrdOreQuery), - /// The `public.real_ord_query` query operand. + /// The `public.query_real_ord` query operand. RealOrdQuery(super::real::RealOrdQuery), - /// The `public.real_ord_ope_query` query operand. + /// The `public.query_real_ord_ope` query operand. RealOrdOpeQuery(super::real::RealOrdOpeQuery), - /// The `public.double_eq_query` query operand. + /// The `public.query_double_eq` query operand. DoubleEqQuery(super::double::DoubleEqQuery), - /// The `public.double_ord_ore_query` query operand. + /// The `public.query_double_ord_ore` query operand. DoubleOrdOreQuery(super::double::DoubleOrdOreQuery), - /// The `public.double_ord_query` query operand. + /// The `public.query_double_ord` query operand. DoubleOrdQuery(super::double::DoubleOrdQuery), - /// The `public.double_ord_ope_query` query operand. + /// The `public.query_double_ord_ope` query operand. DoubleOrdOpeQuery(super::double::DoubleOrdOpeQuery), - /// The `public.jsonb_query` query operand. + /// The `public.query_jsonb` query operand. SteVec(super::jsonb::SteVecQuery), } impl QueryPayload { /// Strictly parse `value` as `domain`'s query payload, KEEPING the /// parsed value — the query-side counterpart of /// [`super::DomainPayload::parse`]. `domain` is the unqualified name - /// (`"integer_eq_query"`, `"jsonb_query"`, …). `None` when `domain` + /// (`"query_integer_eq"`, `"query_jsonb"`, …). `None` when `domain` /// is not a query-operand domain; `Some(Err)` when the strict parse /// fails (`deny_unknown_fields` rejects a stray `c`). pub fn parse( @@ -108,130 +108,130 @@ impl QueryPayload { value: &serde_json::Value, ) -> Option> { match domain { - "integer_eq_query" => { + "query_integer_eq" => { Some(super::integer::IntegerEqQuery::deserialize(value).map(Self::IntegerEqQuery)) } - "integer_ord_ore_query" => Some( + "query_integer_ord_ore" => Some( super::integer::IntegerOrdOreQuery::deserialize(value) .map(Self::IntegerOrdOreQuery), ), - "integer_ord_query" => { + "query_integer_ord" => { Some(super::integer::IntegerOrdQuery::deserialize(value).map(Self::IntegerOrdQuery)) } - "integer_ord_ope_query" => Some( + "query_integer_ord_ope" => Some( super::integer::IntegerOrdOpeQuery::deserialize(value) .map(Self::IntegerOrdOpeQuery), ), - "smallint_eq_query" => Some( + "query_smallint_eq" => Some( super::smallint::SmallintEqQuery::deserialize(value).map(Self::SmallintEqQuery), ), - "smallint_ord_ore_query" => Some( + "query_smallint_ord_ore" => Some( super::smallint::SmallintOrdOreQuery::deserialize(value) .map(Self::SmallintOrdOreQuery), ), - "smallint_ord_query" => Some( + "query_smallint_ord" => Some( super::smallint::SmallintOrdQuery::deserialize(value).map(Self::SmallintOrdQuery), ), - "smallint_ord_ope_query" => Some( + "query_smallint_ord_ope" => Some( super::smallint::SmallintOrdOpeQuery::deserialize(value) .map(Self::SmallintOrdOpeQuery), ), - "bigint_eq_query" => { + "query_bigint_eq" => { Some(super::bigint::BigintEqQuery::deserialize(value).map(Self::BigintEqQuery)) } - "bigint_ord_ore_query" => Some( + "query_bigint_ord_ore" => Some( super::bigint::BigintOrdOreQuery::deserialize(value).map(Self::BigintOrdOreQuery), ), - "bigint_ord_query" => { + "query_bigint_ord" => { Some(super::bigint::BigintOrdQuery::deserialize(value).map(Self::BigintOrdQuery)) } - "bigint_ord_ope_query" => Some( + "query_bigint_ord_ope" => Some( super::bigint::BigintOrdOpeQuery::deserialize(value).map(Self::BigintOrdOpeQuery), ), - "date_eq_query" => { + "query_date_eq" => { Some(super::date::DateEqQuery::deserialize(value).map(Self::DateEqQuery)) } - "date_ord_ore_query" => { + "query_date_ord_ore" => { Some(super::date::DateOrdOreQuery::deserialize(value).map(Self::DateOrdOreQuery)) } - "date_ord_query" => { + "query_date_ord" => { Some(super::date::DateOrdQuery::deserialize(value).map(Self::DateOrdQuery)) } - "date_ord_ope_query" => { + "query_date_ord_ope" => { Some(super::date::DateOrdOpeQuery::deserialize(value).map(Self::DateOrdOpeQuery)) } - "timestamp_eq_query" => Some( + "query_timestamp_eq" => Some( super::timestamp::TimestampEqQuery::deserialize(value).map(Self::TimestampEqQuery), ), - "timestamp_ord_ore_query" => Some( + "query_timestamp_ord_ore" => Some( super::timestamp::TimestampOrdOreQuery::deserialize(value) .map(Self::TimestampOrdOreQuery), ), - "timestamp_ord_query" => Some( + "query_timestamp_ord" => Some( super::timestamp::TimestampOrdQuery::deserialize(value) .map(Self::TimestampOrdQuery), ), - "timestamp_ord_ope_query" => Some( + "query_timestamp_ord_ope" => Some( super::timestamp::TimestampOrdOpeQuery::deserialize(value) .map(Self::TimestampOrdOpeQuery), ), - "numeric_eq_query" => { + "query_numeric_eq" => { Some(super::numeric::NumericEqQuery::deserialize(value).map(Self::NumericEqQuery)) } - "numeric_ord_ore_query" => Some( + "query_numeric_ord_ore" => Some( super::numeric::NumericOrdOreQuery::deserialize(value) .map(Self::NumericOrdOreQuery), ), - "numeric_ord_query" => { + "query_numeric_ord" => { Some(super::numeric::NumericOrdQuery::deserialize(value).map(Self::NumericOrdQuery)) } - "numeric_ord_ope_query" => Some( + "query_numeric_ord_ope" => Some( super::numeric::NumericOrdOpeQuery::deserialize(value) .map(Self::NumericOrdOpeQuery), ), - "text_eq_query" => { + "query_text_eq" => { Some(super::text::TextEqQuery::deserialize(value).map(Self::TextEqQuery)) } - "text_match_query" => { + "query_text_match" => { Some(super::text::TextMatchQuery::deserialize(value).map(Self::TextMatchQuery)) } - "text_ord_ore_query" => { + "query_text_ord_ore" => { Some(super::text::TextOrdOreQuery::deserialize(value).map(Self::TextOrdOreQuery)) } - "text_ord_query" => { + "query_text_ord" => { Some(super::text::TextOrdQuery::deserialize(value).map(Self::TextOrdQuery)) } - "text_ord_ope_query" => { + "query_text_ord_ope" => { Some(super::text::TextOrdOpeQuery::deserialize(value).map(Self::TextOrdOpeQuery)) } - "text_search_query" => { + "query_text_search" => { Some(super::text::TextSearchQuery::deserialize(value).map(Self::TextSearchQuery)) } - "real_eq_query" => { + "query_real_eq" => { Some(super::real::RealEqQuery::deserialize(value).map(Self::RealEqQuery)) } - "real_ord_ore_query" => { + "query_real_ord_ore" => { Some(super::real::RealOrdOreQuery::deserialize(value).map(Self::RealOrdOreQuery)) } - "real_ord_query" => { + "query_real_ord" => { Some(super::real::RealOrdQuery::deserialize(value).map(Self::RealOrdQuery)) } - "real_ord_ope_query" => { + "query_real_ord_ope" => { Some(super::real::RealOrdOpeQuery::deserialize(value).map(Self::RealOrdOpeQuery)) } - "double_eq_query" => { + "query_double_eq" => { Some(super::double::DoubleEqQuery::deserialize(value).map(Self::DoubleEqQuery)) } - "double_ord_ore_query" => Some( + "query_double_ord_ore" => Some( super::double::DoubleOrdOreQuery::deserialize(value).map(Self::DoubleOrdOreQuery), ), - "double_ord_query" => { + "query_double_ord" => { Some(super::double::DoubleOrdQuery::deserialize(value).map(Self::DoubleOrdQuery)) } - "double_ord_ope_query" => Some( + "query_double_ord_ope" => Some( super::double::DoubleOrdOpeQuery::deserialize(value).map(Self::DoubleOrdOpeQuery), ), - "jsonb_query" => Some(super::jsonb::SteVecQuery::deserialize(value).map(Self::SteVec)), + "query_jsonb" => Some(super::jsonb::SteVecQuery::deserialize(value).map(Self::SteVec)), _ => None, } } @@ -279,11 +279,11 @@ impl QueryPayload { Self::SteVec(payload) => payload, } } - /// Fully-qualified SQL domain name, e.g. `"public.integer_eq_query"`. + /// Fully-qualified SQL domain name, e.g. `"public.query_integer_eq"`. pub fn sql_domain(&self) -> &'static str { self.as_domain_type().sql_domain() } - /// Unqualified SQL domain name, e.g. `"integer_eq_query"` — the name + /// Unqualified SQL domain name, e.g. `"query_integer_eq"` — the name /// [`QueryPayload::parse`] accepts. pub fn domain(&self) -> &'static str { self.as_domain_type().domain() diff --git a/crates/eql-bindings/src/v3/real.rs b/crates/eql-bindings/src/v3/real.rs index 5337a014a..8565282dd 100644 --- a/crates/eql-bindings/src/v3/real.rs +++ b/crates/eql-bindings/src/v3/real.rs @@ -165,7 +165,7 @@ impl DomainType for RealOrdOpe { schema_for!(RealOrdOpe) } } -/// `public.real_eq_query` — equality domain query operand. +/// `public.query_real_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct RealEqQuery { } impl DomainType for RealEqQuery { fn sql_domain_static() -> &'static str { - "public.real_eq_query" + "public.query_real_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for RealEqQuery { schema_for!(RealEqQuery) } } -/// `public.real_ord_ore_query` — ordering domain query operand. +/// `public.query_real_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct RealOrdOreQuery { } impl DomainType for RealOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.real_ord_ore_query" + "public.query_real_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for RealOrdOreQuery { schema_for!(RealOrdOreQuery) } } -/// `public.real_ord_query` — ordering domain query operand. +/// `public.query_real_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct RealOrdQuery { } impl DomainType for RealOrdQuery { fn sql_domain_static() -> &'static str { - "public.real_ord_query" + "public.query_real_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for RealOrdQuery { schema_for!(RealOrdQuery) } } -/// `public.real_ord_ope_query` — ordering domain query operand. +/// `public.query_real_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct RealOrdOpeQuery { } impl DomainType for RealOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.real_ord_ope_query" + "public.query_real_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/smallint.rs b/crates/eql-bindings/src/v3/smallint.rs index a16891098..337c52296 100644 --- a/crates/eql-bindings/src/v3/smallint.rs +++ b/crates/eql-bindings/src/v3/smallint.rs @@ -165,7 +165,7 @@ impl DomainType for SmallintOrdOpe { schema_for!(SmallintOrdOpe) } } -/// `public.smallint_eq_query` — equality domain query operand. +/// `public.query_smallint_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct SmallintEqQuery { } impl DomainType for SmallintEqQuery { fn sql_domain_static() -> &'static str { - "public.smallint_eq_query" + "public.query_smallint_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for SmallintEqQuery { schema_for!(SmallintEqQuery) } } -/// `public.smallint_ord_ore_query` — ordering domain query operand. +/// `public.query_smallint_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct SmallintOrdOreQuery { } impl DomainType for SmallintOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.smallint_ord_ore_query" + "public.query_smallint_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for SmallintOrdOreQuery { schema_for!(SmallintOrdOreQuery) } } -/// `public.smallint_ord_query` — ordering domain query operand. +/// `public.query_smallint_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct SmallintOrdQuery { } impl DomainType for SmallintOrdQuery { fn sql_domain_static() -> &'static str { - "public.smallint_ord_query" + "public.query_smallint_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for SmallintOrdQuery { schema_for!(SmallintOrdQuery) } } -/// `public.smallint_ord_ope_query` — ordering domain query operand. +/// `public.query_smallint_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct SmallintOrdOpeQuery { } impl DomainType for SmallintOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.smallint_ord_ope_query" + "public.query_smallint_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs index 698870acb..a68decf39 100644 --- a/crates/eql-bindings/src/v3/text.rs +++ b/crates/eql-bindings/src/v3/text.rs @@ -234,7 +234,7 @@ impl DomainType for TextSearch { schema_for!(TextSearch) } } -/// `public.text_eq_query` — equality domain query operand. +/// `public.query_text_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -247,7 +247,7 @@ pub struct TextEqQuery { } impl DomainType for TextEqQuery { fn sql_domain_static() -> &'static str { - "public.text_eq_query" + "public.query_text_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -265,7 +265,7 @@ impl DomainType for TextEqQuery { schema_for!(TextEqQuery) } } -/// `public.text_match_query` — match domain query operand. +/// `public.query_text_match` — match domain query operand. /// /// Operators: `@>` `<@`. Required keys: `v` `i` `bf`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -278,7 +278,7 @@ pub struct TextMatchQuery { } impl DomainType for TextMatchQuery { fn sql_domain_static() -> &'static str { - "public.text_match_query" + "public.query_text_match" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -296,7 +296,7 @@ impl DomainType for TextMatchQuery { schema_for!(TextMatchQuery) } } -/// `public.text_ord_ore_query` — ordering domain query operand. +/// `public.query_text_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -310,7 +310,7 @@ pub struct TextOrdOreQuery { } impl DomainType for TextOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.text_ord_ore_query" + "public.query_text_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -328,7 +328,7 @@ impl DomainType for TextOrdOreQuery { schema_for!(TextOrdOreQuery) } } -/// `public.text_ord_query` — ordering domain query operand. +/// `public.query_text_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -342,7 +342,7 @@ pub struct TextOrdQuery { } impl DomainType for TextOrdQuery { fn sql_domain_static() -> &'static str { - "public.text_ord_query" + "public.query_text_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -360,7 +360,7 @@ impl DomainType for TextOrdQuery { schema_for!(TextOrdQuery) } } -/// `public.text_ord_ope_query` — ordering domain query operand. +/// `public.query_text_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -374,7 +374,7 @@ pub struct TextOrdOpeQuery { } impl DomainType for TextOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.text_ord_ope_query" + "public.query_text_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -392,7 +392,7 @@ impl DomainType for TextOrdOpeQuery { schema_for!(TextOrdOpeQuery) } } -/// `public.text_search_query` — search domain query operand. +/// `public.query_text_search` — search domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -407,7 +407,7 @@ pub struct TextSearchQuery { } impl DomainType for TextSearchQuery { fn sql_domain_static() -> &'static str { - "public.text_search_query" + "public.query_text_search" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/timestamp.rs b/crates/eql-bindings/src/v3/timestamp.rs index 8972bf494..d0fe54a5f 100644 --- a/crates/eql-bindings/src/v3/timestamp.rs +++ b/crates/eql-bindings/src/v3/timestamp.rs @@ -165,7 +165,7 @@ impl DomainType for TimestampOrdOpe { schema_for!(TimestampOrdOpe) } } -/// `public.timestamp_eq_query` — equality domain query operand. +/// `public.query_timestamp_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct TimestampEqQuery { } impl DomainType for TimestampEqQuery { fn sql_domain_static() -> &'static str { - "public.timestamp_eq_query" + "public.query_timestamp_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for TimestampEqQuery { schema_for!(TimestampEqQuery) } } -/// `public.timestamp_ord_ore_query` — ordering domain query operand. +/// `public.query_timestamp_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct TimestampOrdOreQuery { } impl DomainType for TimestampOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.timestamp_ord_ore_query" + "public.query_timestamp_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for TimestampOrdOreQuery { schema_for!(TimestampOrdOreQuery) } } -/// `public.timestamp_ord_query` — ordering domain query operand. +/// `public.query_timestamp_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct TimestampOrdQuery { } impl DomainType for TimestampOrdQuery { fn sql_domain_static() -> &'static str { - "public.timestamp_ord_query" + "public.query_timestamp_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for TimestampOrdQuery { schema_for!(TimestampOrdQuery) } } -/// `public.timestamp_ord_ope_query` — ordering domain query operand. +/// `public.query_timestamp_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct TimestampOrdOpeQuery { } impl DomainType for TimestampOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.timestamp_ord_ope_query" + "public.query_timestamp_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/tests/catalog_parity.rs b/crates/eql-bindings/tests/catalog_parity.rs index 17f4b4089..921d94a37 100644 --- a/crates/eql-bindings/tests/catalog_parity.rs +++ b/crates/eql-bindings/tests/catalog_parity.rs @@ -155,8 +155,8 @@ fn parse_value_validates_through_the_inventory() { "sv": [ { "s": "sel", "c": "ct", "hm": "deadbeef" } ] }); assert!(entry("json").parse_value(&doc).is_ok()); - assert!(entry("jsonb_query").parse_value(&doc).is_err()); - assert!(entry("jsonb_query") + assert!(entry("query_jsonb").parse_value(&doc).is_err()); + assert!(entry("query_jsonb") .parse_value(&json!({ "sv": [ { "s": "sel", "hm": "deadbeef" } ] })) .is_ok()); } @@ -264,7 +264,7 @@ fn schemas_are_strict() { /// every real payload — the SQL CHECK is laxer and only mandates `v`/`i`/`sv`, /// but the binding models the real wire, which always carries `k`) /// - `public.jsonb_entry` requires `s` `c` + exactly one of `hm` XOR `oc` -/// - `public.jsonb_query` requires `sv`; each element `s` + `hm` XOR `oc`, no `c` +/// - `public.query_jsonb` requires `sv`; each element `s` + `hm` XOR `oc`, no `c` #[test] fn jsonb_schema_required_keys_match_the_sql_check_contract() { let entries = v3::all(); @@ -326,24 +326,24 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() { // Query: {sv}. The element (SteVecQueryEntry) requires `s` + hm XOR oc and // carries NO ciphertext `c` — the "queries never carry ciphertext" rule. - let query = schema_of("jsonb_query"); + let query = schema_of("query_jsonb"); assert_eq!( - required(&query, "/required", "jsonb_query"), + required(&query, "/required", "query_jsonb"), set(&["sv"]), - "public.jsonb_query required keys must be sv" + "public.query_jsonb required keys must be sv" ); let elem_required = required( &query, "/$defs/SteVecQueryEntry/required", - "jsonb_query element", + "query_jsonb element", ); assert!( elem_required.contains("s"), - "jsonb_query element must require a selector s, got {elem_required:?}" + "query_jsonb element must require a selector s, got {elem_required:?}" ); assert!( !elem_required.contains("c"), - "jsonb_query element must NOT require a ciphertext c \ + "query_jsonb element must NOT require a ciphertext c \ (is_valid_ste_vec_query_payload forbids it), got {elem_required:?}" ); // Same arm-wise check as jsonb_entry: the query element's hm XOR oc union must @@ -351,16 +351,16 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() { let query_alts = query .pointer("/$defs/SteVecQueryEntry/anyOf") .and_then(|v| v.as_array()) - .expect("jsonb_query element schema must carry an anyOf term union"); + .expect("query_jsonb element schema must carry an anyOf term union"); let query_alt_required: Vec> = query_alts .iter() - .map(|alt| required(alt, "/required", "jsonb_query element anyOf")) + .map(|alt| required(alt, "/required", "query_jsonb element anyOf")) .collect(); assert!( query_alt_required.len() == 2 && query_alt_required.contains(&set(&["hm"])) && query_alt_required.contains(&set(&["oc"])), - "public.jsonb_query element anyOf must offer exactly the hm-only and \ + "public.query_jsonb element anyOf must offer exactly the hm-only and \ oc-only term alternatives (each arm a singleton), got {query_alt_required:?}" ); } diff --git a/crates/eql-bindings/tests/domain_payload.rs b/crates/eql-bindings/tests/domain_payload.rs index b8363f08e..3eb82680f 100644 --- a/crates/eql-bindings/tests/domain_payload.rs +++ b/crates/eql-bindings/tests/domain_payload.rs @@ -209,7 +209,7 @@ fn parse_constructs_every_stored_payload_domain() { } else if stored { from_v2(&v2_ct_full(), target(&name)).unwrap() } else { - // jsonb_entry / jsonb_query: inventory members but not stored + // jsonb_entry / query_jsonb: inventory members but not stored // payloads — no DomainPayload variant, parse returns None. assert!( DomainPayload::parse(&name, &json!({})).is_none(), @@ -234,7 +234,7 @@ fn parse_returns_none_for_unknown_domains() { "", "jsonb", "jsonb_entry", - "jsonb_query", + "query_jsonb", ] { assert!( DomainPayload::parse(name, &json!({})).is_none(), diff --git a/crates/eql-bindings/tests/from_v2.rs b/crates/eql-bindings/tests/from_v2.rs index 42a316b2f..8605c517d 100644 --- a/crates/eql-bindings/tests/from_v2.rs +++ b/crates/eql-bindings/tests/from_v2.rs @@ -417,12 +417,12 @@ fn ste_vec_query_entry_term_errors_match_document_rules() { from_v2_query(&both, TargetDomain::Json).unwrap_err(), FromV2Error::AmbiguousTerm { entry: 0 } )); - // The query path names ITS shape (jsonb_query, not json) and locates the + // The query path names ITS shape (query_jsonb, not json) and locates the // entry. let neither = json!({ "sv": [ { "s": SELECTOR, "hm": HEX }, { "s": SELECTOR } ] }); match from_v2_query(&neither, TargetDomain::Json).unwrap_err() { FromV2Error::MissingTerm { domain, key, entry } => { - assert_eq!(domain, "jsonb_query"); + assert_eq!(domain, "query_jsonb"); assert_eq!(key, "hm|oc"); assert_eq!(entry, Some(1)); } diff --git a/crates/eql-bindings/tests/query_payload.rs b/crates/eql-bindings/tests/query_payload.rs index 14b4d259b..059c5012f 100644 --- a/crates/eql-bindings/tests/query_payload.rs +++ b/crates/eql-bindings/tests/query_payload.rs @@ -8,7 +8,7 @@ //! wire) — plus failure parity: both entry points reject the same inputs with //! the same errors, including [`FromV2Error::UnsupportedQueryTarget`] for //! STORAGE-ONLY scalar targets (term-bearing scalars now hoist to their -//! `_query` operand — CIP-3432). +//! `query_` operand — CIP-3432, prefix naming CIP-3442). use eql_bindings::from_v2::{from_v2_query, from_v2_query_typed, FromV2Error, TargetDomain}; use eql_bindings::v3::{DomainType, QueryPayload}; @@ -67,12 +67,12 @@ fn typed_needle_yields_the_ste_vec_variant() { ] }); let typed = assert_serialization_pin(&v2); - assert_eq!(typed.domain(), "jsonb_query"); - assert_eq!(typed.sql_domain(), "public.jsonb_query"); + assert_eq!(typed.domain(), "query_jsonb"); + assert_eq!(typed.sql_domain(), "public.query_jsonb"); match &typed { QueryPayload::SteVec(q) => { assert_eq!(q.sv.len(), 2, "entry order/count preserved"); - assert_eq!(q.sql_domain(), "public.jsonb_query"); + assert_eq!(q.sql_domain(), "public.query_jsonb"); } other => panic!("a jsonb target must yield the SteVec needle, got {other:?}"), } @@ -122,7 +122,7 @@ fn v2_scalar_query(term_keys: &[&str]) -> Value { fn scalar_query_hoist_and_storage_only_unsupported() { // CIP-3432: a term-bearing scalar target hoists the v2 payload's required // terms into the enveloped term-only operand `{v:3, i, }` for its - // `_query` domain (dropping `c`/`k`); a storage-only scalar target + // `query_` domain (dropping `c`/`k`); a storage-only scalar target // (no operators) still fails closed with UnsupportedQueryTarget. Exhaustive // over the catalog, both entry points, with the typed==untyped pin. for family in eql_domains::scalar_families() { @@ -165,8 +165,8 @@ fn scalar_query_hoist_and_storage_only_unsupported() { let typed = from_v2_query_typed(&v2, t).unwrap_or_else(|e| panic!("{name} typed hoist: {e:?}")); - assert_eq!(typed.domain(), format!("{name}_query"), "{name} domain"); - assert_eq!(typed.sql_domain(), format!("public.{name}_query")); + assert_eq!(typed.domain(), format!("query_{name}"), "{name} domain"); + assert_eq!(typed.sql_domain(), format!("public.query_{name}")); assert_eq!( serde_json::to_value(&typed).unwrap(), out, @@ -186,7 +186,7 @@ fn typed_entry_term_errors_match_from_v2_query() { let neither = json!({ "sv": [ { "s": SELECTOR, "hm": HEX }, { "s": SELECTOR } ] }); match from_v2_query_typed(&neither, TargetDomain::Json).unwrap_err() { FromV2Error::MissingTerm { domain, key, entry } => { - assert_eq!(domain, "jsonb_query"); + assert_eq!(domain, "query_jsonb"); assert_eq!(key, "hm|oc"); assert_eq!(entry, Some(1)); } @@ -224,10 +224,10 @@ fn typed_rejects_the_same_envelopes_as_from_v2_query() { #[test] fn parse_constructs_the_needle_from_its_domain_name() { let needle = json!({ "sv": [ { "s": SELECTOR, "hm": HEX } ] }); - let parsed = QueryPayload::parse("jsonb_query", &needle) - .expect("jsonb_query must be a QueryPayload domain") + let parsed = QueryPayload::parse("query_jsonb", &needle) + .expect("query_jsonb must be a QueryPayload domain") .expect("strict parse must succeed"); - assert_eq!(parsed.domain(), "jsonb_query"); + assert_eq!(parsed.domain(), "query_jsonb"); assert_eq!(serde_json::to_value(&parsed).unwrap(), needle); } @@ -237,7 +237,7 @@ fn parse_is_strict_exactly_like_the_binding_struct() { // fails, exactly as the untyped path's validate_as does. let stray = json!({ "sv": [ { "s": SELECTOR, "hm": HEX } ], "extra": 1 }); assert!( - QueryPayload::parse("jsonb_query", &stray).unwrap().is_err(), + QueryPayload::parse("query_jsonb", &stray).unwrap().is_err(), "deny_unknown_fields must reject a stray root key" ); } @@ -250,7 +250,7 @@ fn parse_returns_none_for_non_query_domains() { "json", "jsonb_entry", "integer_eq", - "public.jsonb_query", + "public.query_jsonb", "", ] { assert!( diff --git a/crates/eql-bindings/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs index 3a60294aa..d013d50ea 100644 --- a/crates/eql-bindings/tests/v3_conformance.rs +++ b/crates/eql-bindings/tests/v3_conformance.rs @@ -472,7 +472,7 @@ fn stevec_query_round_trips() { let wire = json!({ "sv": [ { "s": "sel", "hm": "deadbeef" } ] }); let parsed: SteVecQuery = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!(SteVecQuery::sql_domain_static(), "public.jsonb_query"); + assert_eq!(SteVecQuery::sql_domain_static(), "public.query_jsonb"); // Unknown top-level key rejected (SteVecQuery has no flatten field). assert!(serde_json::from_value::(json!({ "sv": [], "bogus": 1 })).is_err()); // NOTE: a query ELEMENT carrying `c` is NOT rejected here — SteVecQueryEntry @@ -516,7 +516,7 @@ fn stevec_document_and_query_schemas_are_strict() { assert_eq!(sq.pointer("/additionalProperties"), Some(&json!(false))); // SteVecDocument/Query domain names. assert_eq!(SteVecDocument::sql_domain_static(), "public.json"); - assert_eq!(SteVecQuery::sql_domain_static(), "public.jsonb_query"); + assert_eq!(SteVecQuery::sql_domain_static(), "public.query_jsonb"); } #[test] diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index b9426699c..655ebd370 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -191,20 +191,20 @@ fn render_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { /// One query-operand payload struct + its `DomainType` impl for a capability /// domain: the storage struct MINUS the `c` ciphertext. A query operand carries -/// only index terms (no stored ciphertext), so its `public._query` domain +/// only index terms (no stored ciphertext), so its `public.query_` domain /// admits exactly `{v, i, }` — `deny_unknown_fields` makes a stray `c` -/// (or any storage key) a parse error, mirroring the SQL `_query` domain +/// (or any storage key) a parse error, mirroring the SQL `query_` domain /// CHECK (CIP-3432). Emitted only for term-bearing domains: a storage-only /// domain has no operators, so no query operand. fn render_query_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { - let full = domain.full_name(family.name); + let query_name = domain.query_name(family.name); let ident = format_ident!("{}Query", domain.struct_ident(family.name)); - let sql_domain = format!("public.{full}_query"); + let sql_domain = format!("public.{query_name}"); // Query doc: same capability label + operator union as storage, but the // required-key list drops `c` (query operands omit the ciphertext). let summary = format!( - " `public.{full}_query` — {} query operand.", + " `public.{query_name}` — {} query operand.", capability_label(domain.name) ); let ops = Term::operators_for_terms(domain.terms); @@ -382,7 +382,7 @@ pub fn render_inventory_rs() -> String { ] } - /// Every v3 QUERY-operand twin (`public._query`, the enveloped + /// Every v3 QUERY-operand twin (`public.query_`, the enveloped /// term-only operand), in `eql-domains::CATALOG` order — generated. /// Separate from [`all`] so query domains never resolve as stored /// conversion targets; used by the JSON Schema export and query @@ -517,8 +517,8 @@ pub fn render_payload_rs() -> String { } /// The catalog's QUERY-operand domains, in a stable order: a query twin for -/// every term-bearing scalar domain (`public._query`), then the SteVec -/// containment needle (`public.jsonb_query`). Exactly the shapes the generated +/// every term-bearing scalar domain (`public.query_`), then the SteVec +/// containment needle (`public.query_jsonb`). Exactly the shapes the generated /// `QueryPayload` spans and `from_v2_query` can target. Returned as /// `(module, variant ident, struct ident, unqualified query-domain name)`; the /// SteVec needle keeps the `SteVec` variant name the `from_v2` query path @@ -531,12 +531,7 @@ fn query_payload_domains() -> Vec<(String, String, String, String)> { .filter(|d| !d.terms.is_empty()) .map(move |d| { let q = format!("{}Query", d.struct_ident(f.name)); - ( - f.name.to_string(), - q.clone(), - q, - format!("{}_query", d.full_name(f.name)), - ) + (f.name.to_string(), q.clone(), q, d.query_name(f.name)) }) }) .collect(); @@ -544,15 +539,15 @@ fn query_payload_domains() -> Vec<(String, String, String, String)> { "jsonb".into(), "SteVec".into(), "SteVecQuery".into(), - "jsonb_query".into(), + "query_jsonb".into(), )); out } /// Render the generated `crates/eql-bindings/src/v3/query_payload.rs`: the /// `QueryPayload` enum spanning every QUERY-operand domain — a variant per -/// term-bearing scalar query twin (`public._query`) plus the SteVec -/// containment needle (`public.jsonb_query`) — with its +/// term-bearing scalar query twin (`public.query_`) plus the SteVec +/// containment needle (`public.query_jsonb`) — with its /// construct-from-known-domain `parse` constructor. /// /// Generated for the same reason as [`render_payload_rs`]'s `DomainPayload`: @@ -595,9 +590,9 @@ pub fn render_query_payload_rs() -> String { use super::domain_type::DomainType; /// Every v3 QUERY-operand shape in one type: one variant per term-bearing - /// scalar query twin (`public._query`, the enveloped term-only + /// scalar query twin (`public.query_`, the enveloped term-only /// operand — `{v, i, }`, no `c`) plus the SteVec containment - /// needle (`public.jsonb_query`). Generated from the catalog, so it + /// needle (`public.query_jsonb`). Generated from the catalog, so it /// cannot drift when the catalog grows. /// /// Serialization is exactly the inner struct's (`#[serde(untagged)]` @@ -616,7 +611,7 @@ pub fn render_query_payload_rs() -> String { /// Strictly parse `value` as `domain`'s query payload, KEEPING the /// parsed value — the query-side counterpart of /// [`super::DomainPayload::parse`]. `domain` is the unqualified name - /// (`"integer_eq_query"`, `"jsonb_query"`, …). `None` when `domain` + /// (`"query_integer_eq"`, `"query_jsonb"`, …). `None` when `domain` /// is not a query-operand domain; `Some(Err)` when the strict parse /// fails (`deny_unknown_fields` rejects a stray `c`). pub fn parse( @@ -636,12 +631,12 @@ pub fn render_query_payload_rs() -> String { } } - /// Fully-qualified SQL domain name, e.g. `"public.integer_eq_query"`. + /// Fully-qualified SQL domain name, e.g. `"public.query_integer_eq"`. pub fn sql_domain(&self) -> &'static str { self.as_domain_type().sql_domain() } - /// Unqualified SQL domain name, e.g. `"integer_eq_query"` — the name + /// Unqualified SQL domain name, e.g. `"query_integer_eq"` — the name /// [`QueryPayload::parse`] accepts. pub fn domain(&self) -> &'static str { self.as_domain_type().domain() @@ -782,8 +777,9 @@ mod tests { #[test] fn query_twins_drop_c_and_name_query_domains() { // CIP-3432: every term-bearing capability domain gets a `Query` - // twin = the storage struct minus `c`, on the `public._query` - // domain. Storage-only domains (no operators) get no twin. + // twin = the storage struct minus `c`, on the `public.query_` + // domain (prefix naming — CIP-3442). Storage-only domains (no + // operators) get no twin. let out = render_family_bindings(family("integer")); for s in [ "struct IntegerEqQuery ", @@ -801,10 +797,10 @@ mod tests { assert_eq!(field_idents(&out, "IntegerEqQuery"), ["v", "i", "hm"]); assert_eq!(field_idents(&out, "IntegerOrdQuery"), ["v", "i", "ob"]); assert_eq!(field_idents(&out, "IntegerOrdOpeQuery"), ["v", "i", "op"]); - assert!(out.contains("\"public.integer_eq_query\"")); + assert!(out.contains("\"public.query_integer_eq\"")); assert!(out.contains("impl DomainType for IntegerEqQuery")); assert!(out.contains("schema_for!(IntegerEqQuery)")); - assert!(out.contains("`public.integer_eq_query` — equality domain query operand.")); + assert!(out.contains("`public.query_integer_eq` — equality domain query operand.")); // Query twin term keys mirror the storage domain's. assert!(out.contains(r#"&["op"]"#)); @@ -815,7 +811,7 @@ mod tests { field_idents(&text, "TextSearchQuery"), ["v", "i", "hm", "ob", "bf"] ); - assert!(text.contains("`public.text_match_query` — match domain query operand.")); + assert!(text.contains("`public.query_text_match` — match domain query operand.")); } #[test] @@ -1001,8 +997,8 @@ mod tests { #[test] fn query_payload_enum_spans_query_twins_and_stevec_needle() { // CIP-3432: QueryPayload is now generated — one variant per term-bearing - // scalar query twin (`_query`) plus the SteVec needle - // (`jsonb_query`), in query_payload_domains() order (scalars, then + // scalar query twin (`query_`) plus the SteVec needle + // (`query_jsonb`), in query_payload_domains() order (scalars, then // SteVec). Serialize-only + untagged + no export derives, like // DomainPayload. let out = render_query_payload_rs(); @@ -1024,9 +1020,9 @@ mod tests { assert_eq!(variants.len(), term_bearing + 1); // parse arms keyed on the unqualified query-domain names. - assert!(out.contains(r#""integer_eq_query" =>"#)); + assert!(out.contains(r#""query_integer_eq" =>"#)); assert!(out.contains("IntegerEqQuery::deserialize(value).map(Self::IntegerEqQuery)")); - assert!(out.contains(r#""jsonb_query" =>"#)); + assert!(out.contains(r#""query_jsonb" =>"#)); assert!(out.contains("SteVecQuery::deserialize(value).map(Self::SteVec)")); assert!(out.contains("_ => None,")); diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 493d1f320..2cf5ad3ea 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -157,12 +157,12 @@ pub fn domain_block(family_name: &str, domain: &Domain) -> DomainBlock { } } -/// The query-operand twin block for a term-bearing domain: `public._query`, +/// The query-operand twin block for a term-bearing domain: `public.query_`, /// keys = envelope-minus-`c` (`v`/`i`) + the domain's terms, with `c` FORBIDDEN /// (a query operand carries no ciphertext — CIP-3432). Same non-empty-array term /// rule as the storage block. pub fn query_domain_block(family_name: &str, domain: &Domain) -> DomainBlock { - let name = format!("{}_query", domain.full_name(family_name)); + let name = domain.query_name(family_name); // Envelope minus the ciphertext `c`, then the domain's terms. let mut keys: Vec = ENVELOPE_KEYS diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index fb6248d33..684d49b8b 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -14,7 +14,7 @@ use serde::Serialize; pub struct CatalogDump { pub types: Vec, /// The `jsonb` (SteVec) family — `public.json` / `public.jsonb_entry` / - /// `public.jsonb_query`. Their SQL is hand-written under `src/v3/jsonb/`; the + /// `public.query_jsonb`. Their SQL is hand-written under `src/v3/jsonb/`; the /// catalog owns only their inventory (scalar-only consumers ignore this field). pub stevec: Vec, } @@ -64,12 +64,12 @@ pub struct TermInfo { #[derive(Serialize)] pub struct SteVecEntry { /// The bare domain name (resolved under the `public` schema, like a scalar's - /// `integer_eq`): `json` / `jsonb_entry` / `jsonb_query`. + /// `integer_eq`): `json` / `jsonb_entry` / `query_jsonb`. pub full_name: String, /// The catalog domain name: `json` / `entry` / `query`. pub name: &'static str, /// Index terms for this SteVec domain. Non-empty only for `jsonb_entry` - /// (the sv element type); the `json` container and `jsonb_query` domains + /// (the sv element type); the `json` container and `query_jsonb` domains /// carry no term extractors — see `stevec_terms`. pub terms: Vec, } @@ -95,7 +95,7 @@ fn term_infos(terms: &[Term]) -> Vec { /// /// Terms live on `jsonb_entry` — the sv *element* type — ONLY: `eql_v3.eq_term` /// reads `coalesce(hm, oc)` for `=`/`<>`, and `eql_v3.ore_cllw` reads `oc` for -/// `<`/`<=`/`>`/`>=`. The `json` container and `jsonb_query` domains carry no +/// `<`/`<=`/`>`/`>=`. The `json` container and `query_jsonb` domains carry no /// term extractors (their surface is containment `@>`/`<@` and path navigation), /// so they return no terms. Keyed on the catalog domain name (`json`/`entry`/ /// `query`). @@ -220,7 +220,7 @@ mod tests { fn stevec_jsonb_family_is_dumped() { let dump = dump_catalog(); let names: Vec<&str> = dump.stevec.iter().map(|e| e.full_name.as_str()).collect(); - assert_eq!(names, ["json", "jsonb_entry", "jsonb_query"]); + assert_eq!(names, ["json", "jsonb_entry", "query_jsonb"]); let by_name = |n: &str| { dump.stevec @@ -238,10 +238,10 @@ mod tests { .collect(); assert_eq!(entry_extractors, ["eq_term", "ore_cllw"]); - // The `json` container and `jsonb_query` domains carry no term + // The `json` container and `query_jsonb` domains carry no term // extractors — their surface is containment (@>, <@) and path nav. assert!(by_name("json").terms.is_empty()); - assert!(by_name("jsonb_query").terms.is_empty()); + assert!(by_name("query_jsonb").terms.is_empty()); } /// Pins the hand-re-derived `suffix` wire field — the one channel with no @@ -288,7 +288,7 @@ mod tests { // `list-types` / `dump-catalog` output the scalar-matrix tooling consumes) // must NOT surface the SteVec `jsonb` family: it has no `scalars::jsonb::*` // matrix and no generated SQL surface, even though two of its three - // domain names (`public.jsonb_entry` / `public.jsonb_query`) now follow + // domain names (`public.jsonb_entry` / `public.query_jsonb`) now follow // the family+suffix string convention — the payload shape is still not // flat. This pins the exclusion directly at the codegen surface rather // than relying only on the transitive `scalar_families()` guard in diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 6951a3594..88bce5068 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -56,7 +56,7 @@ pub fn render_types_file(spec: &DomainFamily) -> String { .expect("render types.sql") } -/// Body for _query_types.sql: a `public._query` operand domain per +/// Body for query__types.sql: a `public.query_` operand domain per /// TERM-BEARING domain — the index-terms-only twin (no `c`) whose operators /// consume a query operand (CIP-3432). Storage-only domains have no operators, /// so no query twin. @@ -189,14 +189,14 @@ pub fn render_operators_file(family_name: &str, domain: &Domain) -> String { .expect("render operators.sql") } -/// REQUIRE path for a family's _query_types.sql. +/// REQUIRE path for a family's query__types.sql. fn query_types_path(family_name: &str) -> String { - scalar_path(family_name, &format!("{family_name}_query_types.sql")) + scalar_path(family_name, &format!("query_{family_name}_types.sql")) } -/// Body for a term-bearing domain's _query_functions.sql (CIP-3432): the +/// Body for a term-bearing domain's query__functions.sql (CIP-3432): the /// query-operand extractor OVERLOADS (the same extractors, on -/// `public._query`) plus the comparison WRAPPERS binding the storage +/// `public.query_`) plus the comparison WRAPPERS binding the storage /// domain to its query twin — for the domain's SUPPORTED operators only, in /// both directions. Reuses the same `functions.sql` template as the storage /// surface; a query operand carries the same terms, so each wrapper compares @@ -207,7 +207,7 @@ pub fn render_query_functions_file(family_name: &str, domain: &Domain) -> String domain_name, environment, extractor_entry, wrapper_entry, FunctionsContext, }; let name = domain.full_name(family_name); - let query_name = format!("{name}_query"); + let query_name = domain.query_name(family_name); let storage_dom = domain_name(&name); let query_dom = domain_name(&query_name); let supported = Term::operators_for_terms(domain.terms); @@ -271,14 +271,14 @@ pub fn render_query_functions_file(family_name: &str, domain: &Domain) -> String .expect("render query functions.sql") } -/// Body for a term-bearing domain's _query_operators.sql (CIP-3432): a -/// `CREATE OPERATOR` binding `(storage_domain, _query)` for every -/// supported operator, plus its `(_query, storage_domain)` commutator, so -/// `col $1::public._query` resolves to the query wrapper. +/// Body for a term-bearing domain's query__operators.sql (CIP-3432): a +/// `CREATE OPERATOR` binding `(storage_domain, query_)` for every +/// supported operator, plus its `(query_, storage_domain)` commutator, so +/// `col $1::public.query_` resolves to the query wrapper. pub fn render_query_operators_file(family_name: &str, domain: &Domain) -> String { use crate::context::{domain_name, environment, operator_entry, OperatorsContext}; let name = domain.full_name(family_name); - let query_name = format!("{name}_query"); + let query_name = domain.query_name(family_name); let storage_dom = domain_name(&name); let query_dom = domain_name(&query_name); let supported = Term::operators_for_terms(domain.terms); @@ -362,7 +362,7 @@ pub fn render_type(spec: &DomainFamily, out_dir: &Path) -> Vec<(PathBuf, String) // least one term-bearing domain (storage-only families have no query surface). if spec.domains.iter().any(|d| !d.terms.is_empty()) { rendered.push(( - out_dir.join(format!("{family_name}_query_types.sql")), + out_dir.join(format!("query_{family_name}_types.sql")), render_query_types_file(spec), )); } @@ -377,15 +377,16 @@ pub fn render_type(spec: &DomainFamily, out_dir: &Path) -> Vec<(PathBuf, String) render_operators_file(family_name, d), )); // Query-operand surface (CIP-3432): extractor overloads + wrappers + - // operators binding the storage domain to its `_query` twin. Only + // operators binding the storage domain to its `query_` twin. Only // term-bearing domains have a query twin (storage-only = no operators). if !d.terms.is_empty() { + let query_name = d.query_name(family_name); rendered.push(( - out_dir.join(format!("{name}_query_functions.sql")), + out_dir.join(format!("{query_name}_functions.sql")), render_query_functions_file(family_name, d), )); rendered.push(( - out_dir.join(format!("{name}_query_operators.sql")), + out_dir.join(format!("{query_name}_operators.sql")), render_query_operators_file(family_name, d), )); } @@ -559,7 +560,7 @@ mod tests { .collect(); assert!(names.contains(&"integer_types.sql".to_string())); // Query-operand twin domains (term-only, no `c`) for the family. - assert!(names.contains(&"integer_query_types.sql".to_string())); + assert!(names.contains(&"query_integer_types.sql".to_string())); for dom in [ "integer", "integer_eq", @@ -578,10 +579,10 @@ mod tests { "integer_ord", "integer_ord_ope", ] { - assert!(names.contains(&format!("{dom}_query_functions.sql"))); - assert!(names.contains(&format!("{dom}_query_operators.sql"))); + assert!(names.contains(&format!("query_{dom}_functions.sql"))); + assert!(names.contains(&format!("query_{dom}_operators.sql"))); } - assert!(!names.contains(&"integer_query_functions.sql".to_string())); + assert!(!names.contains(&"query_integer_functions.sql".to_string())); assert!(!names.contains(&"integer_aggregates.sql".to_string())); assert!(!names.contains(&"integer_eq_aggregates.sql".to_string())); assert!(names.contains(&"integer_ord_ore_aggregates.sql".to_string())); diff --git a/crates/eql-codegen/templates/query_types.sql.j2 b/crates/eql-codegen/templates/query_types.sql.j2 index 3a4d1725d..5a0ae592a 100644 --- a/crates/eql-codegen/templates/query_types.sql.j2 +++ b/crates/eql-codegen/templates/query_types.sql.j2 @@ -1,11 +1,11 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/{{ family_name }}/{{ family_name }}_query_types.sql +--! @file v3/scalars/{{ family_name }}/query_{{ family_name }}_types.sql --! @brief Query-operand domains for {{ family_name }} (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.{{ family_name }}_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_{{ family_name }}_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ diff --git a/crates/eql-domains/src/lib.rs b/crates/eql-domains/src/lib.rs index b89ad08ca..8a711db85 100644 --- a/crates/eql-domains/src/lib.rs +++ b/crates/eql-domains/src/lib.rs @@ -135,7 +135,7 @@ pub enum Shape { Scalar, /// A `jsonb` family payload: `public.json` (`{v, i, sv: [entry]}`), /// `public.jsonb_entry` (`{s, c, a?, #[flatten] SteVecTerm}`), or - /// `public.jsonb_query` (`{sv: [query-entry]}`). The three differ in + /// `public.query_jsonb` (`{sv: [query-entry]}`). The three differ in /// payload body but share the non-flat-scalar shape, so a single variant /// covers them; `Domain.name` (`"json"`/`"entry"`/`"query"`) already /// disambiguates which one a given domain is (see `Domain::full_name` / @@ -435,7 +435,7 @@ const JSONB_DOMAINS: &[Domain] = &[ /// `jsonb` — the encrypted-JSONB (SteVec) family: `public.json` (document, the /// one explicit-name exception — see `JSONB_DOMAINS`), `public.jsonb_entry` -/// (one sv element), `public.jsonb_query` (containment needle). The Rust +/// (one sv element), `public.query_jsonb` (containment needle). The Rust /// struct *bodies* are hand-written (`crates/eql-bindings/src/v3/jsonb.rs`, /// not derivable from the catalog); `Domain::rust_struct_name` derives their /// *identifiers* (`SteVecDocument`/`SteVecEntry`/`SteVecQuery`) from diff --git a/crates/eql-domains/src/spec.rs b/crates/eql-domains/src/spec.rs index bb7fe8a0e..4de3d5b30 100644 --- a/crates/eql-domains/src/spec.rs +++ b/crates/eql-domains/src/spec.rs @@ -11,16 +11,25 @@ impl Domain { /// the `_` join — codegen builds every domain name through this, so the /// "domain name starts with the family name" rule is structural. /// - /// One documented exception: the `jsonb` family's document domain - /// (`public.json`, `Domain.name == "json"`) predates the catalog and - /// doesn't follow the family+suffix convention (`family_name` is - /// `"jsonb"`, not `"json"`), so its `name` is returned verbatim instead of - /// being joined. Every other domain — scalar or the other two SteVec - /// shapes — uses the join. + /// Two documented exceptions, both on the `jsonb` family: + /// + /// - the document domain (`public.json`, `Domain.name == "json"`) predates + /// the catalog and doesn't follow the family+suffix convention + /// (`family_name` is `"jsonb"`, not `"json"`), so its `name` is returned + /// verbatim instead of being joined; + /// - the containment needle (`Domain.name == "query"`) follows the + /// query-operand PREFIX convention (CIP-3442): `query_jsonb`, matching + /// the scalar `query_` twins so every query-operand type sorts + /// apart from the column domains in alphabetical type listings. + /// + /// Every other domain — scalar or the SteVec entry — uses the join. pub fn full_name(&self, family_name: &str) -> String { if matches!(self.shape, crate::Shape::SteVec) && self.name == "json" { return self.name.to_string(); } + if matches!(self.shape, crate::Shape::SteVec) && self.name == "query" { + return format!("query_{family_name}"); + } if self.name.is_empty() { family_name.to_string() } else { @@ -28,6 +37,18 @@ impl Domain { } } + /// The full (unqualified) name of this domain's query-operand twin under + /// `family_name`: the `query_` PREFIX joined to [`Self::full_name`] + /// (`"query_integer_eq"`). The **single** site that owns the query-twin + /// naming convention — codegen (SQL + bindings) builds every query-domain + /// name through this. A prefix (not the earlier `_query` suffix) so query + /// operands sort together, apart from the column domains they twin, in + /// alphabetical type listings such as Supabase Studio's type picker + /// (CIP-3442). + pub fn query_name(&self, family_name: &str) -> String { + format!("query_{}", self.full_name(family_name)) + } + /// The PascalCase Rust/TS struct identifier for this domain under /// `family_name`: the [`Self::full_name`] snake_case name mangled to /// PascalCase (`"integer_ord_ore"` -> `"IntegerOrdOre"`, storage `""` -> @@ -159,6 +180,24 @@ mod tests { assert_eq!(eq.struct_ident("double"), "DoubleEq"); } + #[test] + fn query_name_prefixes_the_full_name() { + // `query_` is a PREFIX so query twins sort apart from the column + // domains in alphabetical type listings (Supabase Studio — CIP-3442). + let eq = Domain { + name: "eq", + terms: &[Term::Hm], + shape: Shape::Scalar, + }; + assert_eq!(eq.query_name("integer"), "query_integer_eq"); + let ord_ore = Domain { + name: "ord_ore", + terms: &[Term::Ore], + shape: Shape::Scalar, + }; + assert_eq!(ord_ore.query_name("timestamp"), "query_timestamp_ord_ore"); + } + #[test] fn scalar_families_exclude_non_scalar_families_after_jsonb_flip() { use crate::{scalar_families, CATALOG, JSONB}; @@ -171,16 +210,18 @@ mod tests { } #[test] - fn jsonb_domain_names_follow_the_family_suffix_convention() { - // Entry/query carry the same family+suffix naming as every scalar - // family. The document is the one documented exception — its - // established name `json` doesn't match the family name `jsonb`, so - // `full_name` returns it verbatim rather than concatenating. Real SQL - // names: public.json, public.jsonb_entry, public.jsonb_query. + fn jsonb_domain_names_follow_the_documented_conventions() { + // The entry carries the family+suffix naming every scalar family uses. + // The document is one documented exception — its established name + // `json` doesn't match the family name `jsonb`, so `full_name` returns + // it verbatim rather than concatenating. The containment needle is the + // other — it follows the query-operand PREFIX convention (CIP-3442), + // like the scalar `query_` twins. Real SQL names: public.json, + // public.jsonb_entry, public.query_jsonb. use crate::JSONB; assert_eq!(JSONB.domain_name(&JSONB.domains[0]), "json"); assert_eq!(JSONB.domain_name(&JSONB.domains[1]), "jsonb_entry"); - assert_eq!(JSONB.domain_name(&JSONB.domains[2]), "jsonb_query"); + assert_eq!(JSONB.domain_name(&JSONB.domains[2]), "query_jsonb"); } #[test] diff --git a/crates/eql-domains/src/tests.rs b/crates/eql-domains/src/tests.rs index fe99c7882..01752802f 100644 --- a/crates/eql-domains/src/tests.rs +++ b/crates/eql-domains/src/tests.rs @@ -1244,6 +1244,14 @@ mod invariant_tests { if s.name == "jsonb" && d.name == "json" { continue; } + // The jsonb containment needle follows the query-operand + // PREFIX convention (CIP-3442) instead: `query_`, + // matching the scalar `query_` twins — see + // `Domain::full_name`. + if s.name == "jsonb" && d.name == "query" { + assert_eq!(s.domain_name(d), format!("query_{}", s.name)); + continue; + } let name = s.domain_name(d); assert!( name == s.name || name.starts_with(&format!("{}_", s.name)), diff --git a/docs/reference/catalog-driven-architecture.md b/docs/reference/catalog-driven-architecture.md index 2af1100f9..083beb169 100644 --- a/docs/reference/catalog-driven-architecture.md +++ b/docs/reference/catalog-driven-architecture.md @@ -190,7 +190,7 @@ flowchart LR | `boolean` | Bool | storage-only (2-value cardinality leak → no searchable index) | **`jsonb` sits outside this classification.** It carries three domains — `public.json` -(document), `public.jsonb_entry` (one `sv` leaf), `public.jsonb_query` (containment +(document), `public.jsonb_entry` (one `sv` leaf), `public.query_jsonb` (containment needle) — each tagged `Shape::SteVec` rather than `Shape::Scalar`, with an empty flat `terms` list: capability lives *structurally* inside the payload (per-`sv`-leaf `hm` XOR `oc`), not as a family-level `Term` set. `Domain.name` (`"json"`/`"entry"`/`"query"`) diff --git a/docs/reference/database-indexes.md b/docs/reference/database-indexes.md index 1baa0e3ca..7481b4523 100644 --- a/docs/reference/database-indexes.md +++ b/docs/reference/database-indexes.md @@ -181,11 +181,11 @@ CREATE INDEX orders_data_gin ON orders USING gin (eql_v3.to_ste_vec_query(data_encrypted)::jsonb jsonb_path_ops); ANALYZE orders; -SELECT * FROM orders WHERE data_encrypted @> $1::public.jsonb_query; +SELECT * FROM orders WHERE data_encrypted @> $1::public.query_jsonb; -- Bitmap Index Scan on orders_data_gin ``` -The needle must be typed — `$1::public.jsonb_query`, another `public.json`, or an `public.jsonb_entry`. A bare untyped literal falls through to native `jsonb @>`. +The needle must be typed — `$1::public.query_jsonb`, another `public.json`, or an `public.jsonb_entry`. A bare untyped literal falls through to native `jsonb @>`. ### GIN vs B-tree / hash diff --git a/docs/reference/json-support.md b/docs/reference/json-support.md index 2f1b9e6d7..fbc2febce 100644 --- a/docs/reference/json-support.md +++ b/docs/reference/json-support.md @@ -43,7 +43,7 @@ Always give the operand a known type: ```sql -- ✅ correct — typed operand resolves to the eql_v3 operator WHERE doc -> 'email'::text = $1 -WHERE doc @> $1::public.jsonb_query +WHERE doc @> $1::public.query_jsonb WHERE doc -> $1 -- a text parameter (the CipherStash Proxy interface) -- ⚠ wrong — bare untyped literal resolves to native jsonb -> text, returns NULL @@ -56,11 +56,11 @@ This is **intrinsic to the domain type-kind**, not a bug: the only way to remove ### Containment queries (`@>`, `<@`) -`@>` tests whether the encrypted document contains a structure; `<@` is the reverse. The needle must be **typed** — another `public.json`, an `public.jsonb_query`, or an `public.jsonb_entry`: +`@>` tests whether the encrypted document contains a structure; `<@` is the reverse. The needle must be **typed** — another `public.json`, an `public.query_jsonb`, or an `public.jsonb_entry`: ```sql SELECT * FROM examples -WHERE encrypted_json @> $1::public.jsonb_query; +WHERE encrypted_json @> $1::public.query_jsonb; ``` This is the encrypted equivalent of the plaintext `jsonb_column @> '{"top":{"nested":["a"]}}'`. @@ -72,7 +72,7 @@ CREATE INDEX examples_json_gin ON examples USING gin (eql_v3.to_ste_vec_query(encrypted_json)::jsonb jsonb_path_ops); ANALYZE examples; -SELECT * FROM examples WHERE encrypted_json @> $1::public.jsonb_query; +SELECT * FROM examples WHERE encrypted_json @> $1::public.query_jsonb; ``` See [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment) for the full setup. @@ -145,7 +145,7 @@ GROUP BY eql_v3.eq_term(encrypted_json -> 'color_selector'::text); - **`eql_v3.ste_vec(val jsonb) RETURNS jsonb[]`** — extracts the ste_vec index array from an encrypted payload. - **`eql_v3.ste_vec_contains(a public.json, b public.json) RETURNS boolean`** — true if all ste_vec terms in `b` exist in `a`; backs the `@>` operator. -- **`eql_v3.to_ste_vec_query(val public.json) RETURNS public.jsonb_query`** — the GIN-indexable query shape `@>` inlines to. +- **`eql_v3.to_ste_vec_query(val public.json) RETURNS public.query_jsonb`** — the GIN-indexable query shape `@>` inlines to. - **`eql_v3.meta_data(val jsonb)`**, **`eql_v3.ciphertext(val jsonb)`**, **`eql_v3.selector(val jsonb)` / `(entry public.jsonb_entry)`** — envelope / ciphertext / selector accessors. ### Path query functions @@ -197,7 +197,7 @@ Structured Encryption (ste_vec) makes a JSONB document searchable by: ```sql -- Find records where account.email = "alice@example.com" -WHERE encrypted_data @> $1::public.jsonb_query; +WHERE encrypted_data @> $1::public.query_jsonb; ``` Encryption and selector generation are handled by CipherStash Proxy or CipherStash Stack, not by EQL directly. diff --git a/docs/reference/permissions.md b/docs/reference/permissions.md index 23c9d0ee8..005db29eb 100644 --- a/docs/reference/permissions.md +++ b/docs/reference/permissions.md @@ -73,7 +73,7 @@ Why the internal grant is needed even though you only call public objects: - The **ORE comparison** behind ordering and `MIN`/`MAX` calls pgcrypto `encrypt()`, which the installer places in the `extensions` schema — hence the `USAGE` there. -- **Casting raw jsonb to `public.json` or `public.jsonb_query`** fires a +- **Casting raw jsonb to `public.json` or `public.query_jsonb`** fires a domain `CHECK` that calls an `eql_v3_internal.is_valid_*` validator. (Scalar domain CHECKs — and, since issue #354, the `public.jsonb_entry` CHECK — are pure structural jsonb tests, so casting to those domains needs no internal diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index 044f7d164..17c539edf 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -136,7 +136,7 @@ The search capabilities available on a value extracted via `->` or `eql_v3.jsonb | SQL form | Resolves to | Returns / notes | | -------------------------------- | -------------------------------------------------- | --------------- | -| `doc @> needle` / `needle <@ doc` | `eql_v3."@>"` / `eql_v3."<@"` | document containment; GIN-indexable via `eql_v3.to_ste_vec_query(doc)::jsonb` — see [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment). `needle` must be typed (`$1::public.jsonb_query`, another `public.json`, or an `public.jsonb_entry`). | +| `doc @> needle` / `needle <@ doc` | `eql_v3."@>"` / `eql_v3."<@"` | document containment; GIN-indexable via `eql_v3.to_ste_vec_query(doc)::jsonb` — see [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment). `needle` must be typed (`$1::public.query_jsonb`, another `public.json`, or an `public.jsonb_entry`). | | `doc -> 'sel'::text` / `doc -> N` | `eql_v3."->"` | field / 0-based array-element access; returns `public.jsonb_entry`. | | `doc ->> 'sel'::text` | `eql_v3."->>"` | the matching entry serialized as `text` (ciphertext JSON, **not** decrypted plaintext). | | extracted-leaf `=` `<>` | `eql_v3.eq_term(public.jsonb_entry)` | equality on a value extracted via `->` (e.g. `doc -> 'sel'::text = $1`). | @@ -145,7 +145,7 @@ The search capabilities available on a value extracted via `->` or `eql_v3.jsonb | `eql_v3.jsonb_path_query(doc, sel)` | path query | set-returning; yields encrypted entries. Also `jsonb_path_query_first`, `jsonb_path_exists`. | | `eql_v3.jsonb_array_length/elements/elements_text(doc)` | array helpers | length / set-returning elements / element text. | -> **Typed operands (important).** The selector / needle operand must carry a **known type** — a typed parameter (`$1`, which the Proxy supplies) or an explicit cast (`doc -> 'sel'::text`, `$1::public.jsonb_query`). A bare untyped literal (`doc -> 'sel'`) resolves to the **native `jsonb` operator** (PostgreSQL reduces the `public.json` domain to its `jsonb` base type for an unknown-typed RHS) and silently returns native jsonb semantics instead of the encrypted operator. +> **Typed operands (important).** The selector / needle operand must carry a **known type** — a typed parameter (`$1`, which the Proxy supplies) or an explicit cast (`doc -> 'sel'::text`, `$1::public.query_jsonb`). A bare untyped literal (`doc -> 'sel'`) resolves to the **native `jsonb` operator** (PostgreSQL reduces the `public.json` domain to its `jsonb` base type for an unknown-typed RHS) and silently returns native jsonb semantics instead of the encrypted operator. ### Blocked JSONB operators diff --git a/docs/tutorials/proxy-configuration.md b/docs/tutorials/proxy-configuration.md index 58003918e..f4adb1978 100644 --- a/docs/tutorials/proxy-configuration.md +++ b/docs/tutorials/proxy-configuration.md @@ -102,7 +102,7 @@ SELECT * FROM users WHERE encrypted_name @> $1::public.text_match; **Encrypted JSON** (`public.json`) — containment and field access; see [EQL with JSON and JSONB](../reference/json-support.md): ```sql -SELECT * FROM users WHERE encrypted_profile @> $1::public.jsonb_query; +SELECT * FROM users WHERE encrypted_profile @> $1::public.query_jsonb; SELECT encrypted_profile -> 'email_selector'::text FROM users; ``` @@ -118,7 +118,7 @@ SELECT encrypted_profile -> 'email_selector'::text FROM users; ## Troubleshooting -**Operator resolves to native `jsonb` / returns `NULL` instead of searching.** The query operand was an untyped literal, so PostgreSQL flattened the `eql_v3` domain to `jsonb`. Type the operand (`$1::public.text_eq`, `$1::public.jsonb_query`) — the Proxy does this automatically. +**Operator resolves to native `jsonb` / returns `NULL` instead of searching.** The query operand was an untyped literal, so PostgreSQL flattened the `eql_v3` domain to `jsonb`. Type the operand (`$1::public.text_eq`, `$1::public.query_jsonb`) — the Proxy does this automatically. **`=` returns no rows.** The column's values do not carry an `hm` equality term. Confirm the client is configured to emit the right term for the column's variant (step 2), and that data was written through the Proxy after configuring it. diff --git a/docs/upgrading/v3.0.md b/docs/upgrading/v3.0.md index 6fefc1f2f..9f04fb4c5 100644 --- a/docs/upgrading/v3.0.md +++ b/docs/upgrading/v3.0.md @@ -8,12 +8,14 @@ release is prepared. ## TL;DR 1. **The `eql_v3` JSON envelope version is now `v: 3`** ([U-001](#u-001-eql_v3-payloads-carry-v-3)). Every `eql_v3` domain `CHECK` pins `VALUE->>'v' = '3'`, and the published payload bindings (Rust / TypeScript / JSON Schema) accept exactly `3`. Payloads carrying the legacy `v: 2` are rejected on insert or cast. +2. **Query-operand domains are named `query_`, not `_query`** ([U-002](#u-002-query-operand-domains-use-the-query_-prefix)). `public.integer_eq_query` → `public.query_integer_eq`, and the encrypted-JSONB containment needle `public.jsonb_query` → `public.query_jsonb`. Only affects 3.0.0 pre-release adopters — the suffix names never shipped in a final release. ## Compatibility | Component | Status | | --- | --- | -| `eql_v3` schema name, domain names, operator names | **Unchanged.** | +| `eql_v3` schema name, column-domain names, operator names | **Unchanged.** | +| Query-operand domain names (`_query`, `jsonb_query` — 3.0.0 pre-releases only) | **Changed.** Renamed to `query_` / `query_jsonb` — see U-002. | | `eql_v3` payload envelope version (`v`) | **Changed.** `2` → `3`. Re-encryption / re-emission with a v3-envelope client required — see U-001. | | `eql_v3` payload term keys (`hm` / `ob` / `bf`, new `op`) | **Unchanged** (additive `op`). | | Legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json`) | **Unchanged.** Stays `v: 2`. | @@ -50,3 +52,43 @@ SELECT '{"v":2,"i":{},"c":"x","hm":"aa"}'::jsonb::public.text_eq; -- Must succeed: SELECT '{"v":3,"i":{},"c":"x","hm":"aa"}'::jsonb::public.text_eq; ``` + +### U-002: Query-operand domains use the `query_` prefix + +**What changed.** The query-operand domains — the index-terms-only twins a +client casts query parameters to — are named with a `query_` PREFIX instead of +the `_query` suffix used during the 3.0.0 pre-releases: `public.query_` +for every term-bearing scalar domain (`public.query_integer_eq`, +`public.query_text_ord`, …) and `public.query_jsonb` for the encrypted-JSONB +containment needle (was `public.jsonb_query`). The suffix names never shipped +in a final release. + +**Why.** The query-operand domains live in `public` alongside the column +domains they twin, so alphabetical type listings — most visibly Supabase +Studio's Table Builder type picker — interleaved never-a-column-type query +operands with the actual column types (`integer_eq` next to +`integer_eq_query`). The shared `query_` prefix makes every query operand sort +together, apart from the column domains. + +**Who is affected.** Only adopters of the 3.0.0 pre-releases. Any SQL casting +to a `_query` domain (`WHERE col = $1::public.integer_eq_query`, +`WHERE doc @> $1::public.jsonb_query`), and any client resolving the +`eql-bindings` query domains by name (`QueryPayload::parse("integer_eq_query", …)`, +the `schema/v3/*_query.json` JSON Schema files). + +**What to do.** Rename the casts (`$1::public.query_integer_eq`, +`$1::public.query_jsonb`) and update `eql-bindings` to the matching release +(the `DomainType::sql_domain` strings, `QueryPayload::parse` names, and JSON +Schema file names follow the new convention). GIN containment indexes built +over `eql_v3.to_ste_vec_query(col)` are unaffected — the function name is +unchanged; only the domain type was renamed. + +**Verification.** + +```sql +-- Must succeed (the renamed operand domains exist): +SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::public.query_text_eq; +SELECT '{"sv":[{"s":"aa","hm":"bb"}]}'::jsonb::public.query_jsonb; +-- Must fail with "type does not exist" (the pre-release names are gone): +SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::public.text_eq_query; +``` diff --git a/src/v3/jsonb/operators.sql b/src/v3/jsonb/operators.sql index 7e511a68b..f71ab1f04 100644 --- a/src/v3/jsonb/operators.sql +++ b/src/v3/jsonb/operators.sql @@ -144,15 +144,15 @@ CREATE OPERATOR @>( RIGHTARG=public.json ); ---! @brief @> contains operator with an jsonb_query needle. +--! @brief @> contains operator with an query_jsonb needle. --! --! Inlines to native `jsonb @>` over `eql_v3.to_ste_vec_query(a)::jsonb`, so a --! functional GIN index on the same expression engages. --! --! @param a public.json Container. ---! @param b public.jsonb_query Query payload. +--! @param b public.query_jsonb Query payload. --! @return boolean True if a contains b. -CREATE FUNCTION eql_v3."@>"(a public.json, b public.jsonb_query) +CREATE FUNCTION eql_v3."@>"(a public.json, b public.query_jsonb) RETURNS boolean LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -162,7 +162,7 @@ $$; CREATE OPERATOR @>( FUNCTION=eql_v3."@>", LEFTARG=public.json, - RIGHTARG=public.jsonb_query + RIGHTARG=public.query_jsonb ); --! @brief @> contains operator with a single jsonb_entry needle. @@ -219,11 +219,11 @@ CREATE OPERATOR <@( RIGHTARG=public.json ); ---! @brief <@ contained-by operator with an jsonb_query LHS. ---! @param a public.jsonb_query Query payload. +--! @brief <@ contained-by operator with an query_jsonb LHS. +--! @param a public.query_jsonb Query payload. --! @param b public.json Container. --! @return boolean True if b contains a. -CREATE FUNCTION eql_v3."<@"(a public.jsonb_query, b public.json) +CREATE FUNCTION eql_v3."<@"(a public.query_jsonb, b public.json) RETURNS boolean LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -232,7 +232,7 @@ $$; CREATE OPERATOR <@( FUNCTION=eql_v3."<@", - LEFTARG=public.jsonb_query, + LEFTARG=public.query_jsonb, RIGHTARG=public.json ); diff --git a/src/v3/jsonb/types.sql b/src/v3/jsonb/types.sql index e1200a540..c36c8e6e6 100644 --- a/src/v3/jsonb/types.sql +++ b/src/v3/jsonb/types.sql @@ -8,7 +8,7 @@ --! blockers.sql can attach): --! - public.json — storage/root: an EQL envelope object ({i, v, ...}). --! - public.jsonb_entry — a single sv element (returned by `->`). ---! - public.jsonb_query — a containment needle (sv elements, no ciphertext). +--! - public.query_jsonb — a containment needle (sv elements, no ciphertext). --! @brief Validate a single SteVec entry payload. --! @internal @@ -39,7 +39,7 @@ $$; --! string `s`, no ciphertext, and exactly one string term (`hm` XOR --! `oc`). --! @note plpgsql, not LANGUAGE sql (issues #353/#354): the only caller is the ---! public.jsonb_query domain CHECK, where a SQL function can never be +--! public.query_jsonb domain CHECK, where a SQL function can never be --! inlined (and the CHECK itself cannot absorb this body — it needs a --! subquery over the sv elements, which CHECK constraints forbid). plpgsql --! caches its plan across calls instead of paying the per-call SQL-function @@ -188,7 +188,7 @@ $$; --! `jsonb @>`. --! --! @note Construct from inline JSON via the DOMAIN cast: ---! `'{"sv":[{"s":"","hm":""}]}'::public.jsonb_query`. +--! `'{"sv":[{"s":"","hm":""}]}'::public.query_jsonb`. --! @see eql_v3.to_ste_vec_query --! --! @internal @@ -199,25 +199,25 @@ $$; --! plan; substantially cheaper per call than a non-inlined LANGUAGE sql --! function — the same finding as issue #353), since this cast sits on the --! per-query hot path of every containment scenario ---! (`$1::jsonb::public.jsonb_query`). +--! (`$1::jsonb::public.query_jsonb`). --! @endinternal DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'jsonb_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_jsonb' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.jsonb_query AS jsonb + CREATE DOMAIN public.query_jsonb AS jsonb CHECK ( public.eql_v3_is_valid_ste_vec_query_payload(VALUE) ); END IF; - COMMENT ON DOMAIN public.jsonb_query IS 'EQL JSONB query operand (containment)'; + COMMENT ON DOMAIN public.query_jsonb IS 'EQL JSONB query operand (containment)'; END $$; ---! @brief Convert a public.json to a jsonb_query needle. +--! @brief Convert a public.json to a query_jsonb needle. --! --! Normalises each sv element down to the matching-relevant fields: `s` plus --! exactly one of `hm` / `oc`. Other fields (`c`, `a`, `i`/`v`, anything else) @@ -226,10 +226,10 @@ $$; --! `GIN (eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops)`. --! --! @param e public.json Source encrypted payload ---! @return public.jsonb_query Query-shaped needle, sv elements normalised. ---! @see public.jsonb_query +--! @return public.query_jsonb Query-shaped needle, sv elements normalised. +--! @see public.query_jsonb CREATE FUNCTION eql_v3.to_ste_vec_query(e public.json) - RETURNS public.jsonb_query + RETURNS public.query_jsonb LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT jsonb_build_object( @@ -247,9 +247,9 @@ AS $$ FROM jsonb_array_elements(e::jsonb -> 'sv') AS elem), '[]'::jsonb ) - )::public.jsonb_query + )::public.query_jsonb $$; -CREATE CAST (public.json AS public.jsonb_query) +CREATE CAST (public.json AS public.query_jsonb) WITH FUNCTION eql_v3.to_ste_vec_query AS ASSIGNMENT; diff --git a/src/v3/scalars/bigint/bigint_eq_query_functions.sql b/src/v3/scalars/bigint/query_bigint_eq_functions.sql similarity index 50% rename from src/v3/scalars/bigint/bigint_eq_query_functions.sql rename to src/v3/scalars/bigint/query_bigint_eq_functions.sql index 592d291e0..724ed1c4a 100644 --- a/src/v3/scalars/bigint/bigint_eq_query_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql -- REQUIRE: src/v3/scalars/bigint/bigint_eq_functions.sql ---! @file encrypted_domain/bigint/bigint_eq_query_functions.sql ---! @brief Functions for public.bigint_eq_query. +--! @file encrypted_domain/bigint/query_bigint_eq_functions.sql +--! @brief Functions for public.query_bigint_eq. ---! @brief Index extractor for public.bigint_eq_query. ---! @param a public.bigint_eq_query +--! @brief Index extractor for public.query_bigint_eq. +--! @param a public.query_bigint_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.bigint_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_bigint_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.bigint_eq_query. +--! @brief Operator wrapper for public.query_bigint_eq. --! @param a public.bigint_eq ---! @param b public.bigint_eq_query +--! @param b public.query_bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b public.bigint_eq_query) +CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b public.query_bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.bigint_eq_query. ---! @param a public.bigint_eq_query +--! @brief Operator wrapper for public.query_bigint_eq. +--! @param a public.query_bigint_eq --! @param b public.bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_eq_query, b public.bigint_eq) +CREATE FUNCTION eql_v3.eq(a public.query_bigint_eq, b public.bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.bigint_eq_query. +--! @brief Operator wrapper for public.query_bigint_eq. --! @param a public.bigint_eq ---! @param b public.bigint_eq_query +--! @param b public.query_bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b public.bigint_eq_query) +CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b public.query_bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.bigint_eq_query. ---! @param a public.bigint_eq_query +--! @brief Operator wrapper for public.query_bigint_eq. +--! @param a public.query_bigint_eq --! @param b public.bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_eq_query, b public.bigint_eq) +CREATE FUNCTION eql_v3.neq(a public.query_bigint_eq, b public.bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/double/double_eq_query_operators.sql b/src/v3/scalars/bigint/query_bigint_eq_operators.sql similarity index 52% rename from src/v3/scalars/double/double_eq_query_operators.sql rename to src/v3/scalars/bigint/query_bigint_eq_operators.sql index 33c205ba8..afcb37978 100644 --- a/src/v3/scalars/double/double_eq_query_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql --- REQUIRE: src/v3/scalars/double/double_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_eq_functions.sql ---! @file encrypted_domain/double/double_eq_query_operators.sql ---! @brief Operators for public.double_eq_query. +--! @file encrypted_domain/bigint/query_bigint_eq_operators.sql +--! @brief Operators for public.query_bigint_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_eq, RIGHTARG = public.double_eq_query, + LEFTARG = public.bigint_eq, RIGHTARG = public.query_bigint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_eq_query, RIGHTARG = public.double_eq, + LEFTARG = public.query_bigint_eq, RIGHTARG = public.bigint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_eq, RIGHTARG = public.double_eq_query, + LEFTARG = public.bigint_eq, RIGHTARG = public.query_bigint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_eq_query, RIGHTARG = public.double_eq, + LEFTARG = public.query_bigint_eq, RIGHTARG = public.bigint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/bigint/bigint_ord_query_functions.sql b/src/v3/scalars/bigint/query_bigint_ord_functions.sql similarity index 51% rename from src/v3/scalars/bigint/bigint_ord_query_functions.sql rename to src/v3/scalars/bigint/query_bigint_ord_functions.sql index 0f3a31b56..cd3b90348 100644 --- a/src/v3/scalars/bigint/bigint_ord_query_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql -- REQUIRE: src/v3/scalars/bigint/bigint_ord_functions.sql ---! @file encrypted_domain/bigint/bigint_ord_query_functions.sql ---! @brief Functions for public.bigint_ord_query. +--! @file encrypted_domain/bigint/query_bigint_ord_functions.sql +--! @brief Functions for public.query_bigint_ord. ---! @brief Index extractor for public.bigint_ord_query. ---! @param a public.bigint_ord_query +--! @brief Index extractor for public.query_bigint_ord. +--! @param a public.query_bigint_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_bigint_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.bigint_ord_query. +--! @brief Operator wrapper for public.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.bigint_ord_query +--! @param b public.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b public.bigint_ord_query) +CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b public.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. ---! @param a public.bigint_ord_query +--! @brief Operator wrapper for public.query_bigint_ord. +--! @param a public.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord_query, b public.bigint_ord) +CREATE FUNCTION eql_v3.eq(a public.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. +--! @brief Operator wrapper for public.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.bigint_ord_query +--! @param b public.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b public.bigint_ord_query) +CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b public.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. ---! @param a public.bigint_ord_query +--! @brief Operator wrapper for public.query_bigint_ord. +--! @param a public.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord_query, b public.bigint_ord) +CREATE FUNCTION eql_v3.neq(a public.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. +--! @brief Operator wrapper for public.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.bigint_ord_query +--! @param b public.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b public.bigint_ord_query) +CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b public.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. ---! @param a public.bigint_ord_query +--! @brief Operator wrapper for public.query_bigint_ord. +--! @param a public.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord_query, b public.bigint_ord) +CREATE FUNCTION eql_v3.lt(a public.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. +--! @brief Operator wrapper for public.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.bigint_ord_query +--! @param b public.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b public.bigint_ord_query) +CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b public.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. ---! @param a public.bigint_ord_query +--! @brief Operator wrapper for public.query_bigint_ord. +--! @param a public.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord_query, b public.bigint_ord) +CREATE FUNCTION eql_v3.lte(a public.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. +--! @brief Operator wrapper for public.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.bigint_ord_query +--! @param b public.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b public.bigint_ord_query) +CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b public.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. ---! @param a public.bigint_ord_query +--! @brief Operator wrapper for public.query_bigint_ord. +--! @param a public.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord_query, b public.bigint_ord) +CREATE FUNCTION eql_v3.gt(a public.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. +--! @brief Operator wrapper for public.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.bigint_ord_query +--! @param b public.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b public.bigint_ord_query) +CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b public.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_query. ---! @param a public.bigint_ord_query +--! @brief Operator wrapper for public.query_bigint_ord. +--! @param a public.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord_query, b public.bigint_ord) +CREATE FUNCTION eql_v3.gte(a public.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql b/src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql rename to src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql index bfcd81f0c..93a678c77 100644 --- a/src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ope_functions.sql ---! @file encrypted_domain/bigint/bigint_ord_ope_query_functions.sql ---! @brief Functions for public.bigint_ord_ope_query. +--! @file encrypted_domain/bigint/query_bigint_ord_ope_functions.sql +--! @brief Functions for public.query_bigint_ord_ope. ---! @brief Index extractor for public.bigint_ord_ope_query. ---! @param a public.bigint_ord_ope_query +--! @brief Index extractor for public.query_bigint_ord_ope. +--! @param a public.query_bigint_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.bigint_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_bigint_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @brief Operator wrapper for public.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.bigint_ord_ope_query +--! @param b public.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. ---! @param a public.bigint_ord_ope_query +--! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @param a public.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @brief Operator wrapper for public.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.bigint_ord_ope_query +--! @param b public.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. ---! @param a public.bigint_ord_ope_query +--! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @param a public.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @brief Operator wrapper for public.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.bigint_ord_ope_query +--! @param b public.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. ---! @param a public.bigint_ord_ope_query +--! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @param a public.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @brief Operator wrapper for public.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.bigint_ord_ope_query +--! @param b public.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. ---! @param a public.bigint_ord_ope_query +--! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @param a public.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @brief Operator wrapper for public.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.bigint_ord_ope_query +--! @param b public.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. ---! @param a public.bigint_ord_ope_query +--! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @param a public.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. +--! @brief Operator wrapper for public.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.bigint_ord_ope_query +--! @param b public.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ope_query. ---! @param a public.bigint_ord_ope_query +--! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @param a public.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_ord_ope_query_operators.sql b/src/v3/scalars/bigint/query_bigint_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/bigint/bigint_ord_ope_query_operators.sql rename to src/v3/scalars/bigint/query_bigint_ord_ope_operators.sql index b0cd809eb..ac3869ae4 100644 --- a/src/v3/scalars/bigint/bigint_ord_ope_query_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql --- REQUIRE: src/v3/scalars/bigint/bigint_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql ---! @file encrypted_domain/bigint/bigint_ord_ope_query_operators.sql ---! @brief Operators for public.bigint_ord_ope_query. +--! @file encrypted_domain/bigint/query_bigint_ord_ope_operators.sql +--! @brief Operators for public.query_bigint_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope_query, + LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord_ope_query, RIGHTARG = public.bigint_ord_ope, + LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/double/double_ord_query_operators.sql b/src/v3/scalars/bigint/query_bigint_ord_operators.sql similarity index 60% rename from src/v3/scalars/double/double_ord_query_operators.sql rename to src/v3/scalars/bigint/query_bigint_ord_operators.sql index ebf23083d..8549053d8 100644 --- a/src/v3/scalars/double/double_ord_query_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql --- REQUIRE: src/v3/scalars/double/double_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_ord_functions.sql ---! @file encrypted_domain/double/double_ord_query_operators.sql ---! @brief Operators for public.double_ord_query. +--! @file encrypted_domain/bigint/query_bigint_ord_operators.sql +--! @brief Operators for public.query_bigint_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord, RIGHTARG = public.double_ord_query, + LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord_query, RIGHTARG = public.double_ord, + LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql b/src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql rename to src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql index 98ab4bc62..498a110dd 100644 --- a/src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ore_functions.sql ---! @file encrypted_domain/bigint/bigint_ord_ore_query_functions.sql ---! @brief Functions for public.bigint_ord_ore_query. +--! @file encrypted_domain/bigint/query_bigint_ord_ore_functions.sql +--! @brief Functions for public.query_bigint_ord_ore. ---! @brief Index extractor for public.bigint_ord_ore_query. ---! @param a public.bigint_ord_ore_query +--! @brief Index extractor for public.query_bigint_ord_ore. +--! @param a public.query_bigint_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_bigint_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @brief Operator wrapper for public.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.bigint_ord_ore_query +--! @param b public.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. ---! @param a public.bigint_ord_ore_query +--! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @param a public.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @brief Operator wrapper for public.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.bigint_ord_ore_query +--! @param b public.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. ---! @param a public.bigint_ord_ore_query +--! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @param a public.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @brief Operator wrapper for public.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.bigint_ord_ore_query +--! @param b public.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. ---! @param a public.bigint_ord_ore_query +--! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @param a public.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @brief Operator wrapper for public.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.bigint_ord_ore_query +--! @param b public.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. ---! @param a public.bigint_ord_ore_query +--! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @param a public.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @brief Operator wrapper for public.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.bigint_ord_ore_query +--! @param b public.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. ---! @param a public.bigint_ord_ore_query +--! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @param a public.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. +--! @brief Operator wrapper for public.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.bigint_ord_ore_query +--! @param b public.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.bigint_ord_ore_query. ---! @param a public.bigint_ord_ore_query +--! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @param a public.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_ord_ore_query_operators.sql b/src/v3/scalars/bigint/query_bigint_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/bigint/bigint_ord_ore_query_operators.sql rename to src/v3/scalars/bigint/query_bigint_ord_ore_operators.sql index ad938b635..d11a3581c 100644 --- a/src/v3/scalars/bigint/bigint_ord_ore_query_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql --- REQUIRE: src/v3/scalars/bigint/bigint_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql +-- REQUIRE: src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql ---! @file encrypted_domain/bigint/bigint_ord_ore_query_operators.sql ---! @brief Operators for public.bigint_ord_ore_query. +--! @file encrypted_domain/bigint/query_bigint_ord_ore_operators.sql +--! @brief Operators for public.query_bigint_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore_query, + LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord_ore_query, RIGHTARG = public.bigint_ord_ore, + LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/bigint/bigint_query_types.sql b/src/v3/scalars/bigint/query_bigint_types.sql similarity index 58% rename from src/v3/scalars/bigint/bigint_query_types.sql rename to src/v3/scalars/bigint/query_bigint_types.sql index 6a5221e2e..9b29246a1 100644 --- a/src/v3/scalars/bigint/bigint_query_types.sql +++ b/src/v3/scalars/bigint/query_bigint_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/bigint/bigint_query_types.sql +--! @file v3/scalars/bigint/query_bigint_types.sql --! @brief Query-operand domains for bigint (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.bigint_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_bigint_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.bigint_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_bigint_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'bigint_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.bigint_eq_query AS jsonb + CREATE DOMAIN public.query_bigint_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_eq_query IS 'EQL bigint query operand (equality)'; + COMMENT ON DOMAIN public.query_bigint_eq IS 'EQL bigint query operand (equality)'; - --! @brief Query-operand domain public.bigint_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_bigint_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'bigint_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.bigint_ord_ore_query AS jsonb + CREATE DOMAIN public.query_bigint_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_ore_query IS 'EQL bigint query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_bigint_ord_ore IS 'EQL bigint query operand (equality, ordering)'; - --! @brief Query-operand domain public.bigint_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_bigint_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'bigint_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.bigint_ord_query AS jsonb + CREATE DOMAIN public.query_bigint_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_query IS 'EQL bigint query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_bigint_ord IS 'EQL bigint query operand (equality, ordering)'; - --! @brief Query-operand domain public.bigint_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_bigint_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'bigint_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.bigint_ord_ope_query AS jsonb + CREATE DOMAIN public.query_bigint_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.bigint_ord_ope_query IS 'EQL bigint query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_bigint_ord_ope IS 'EQL bigint query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/date/date_eq_query_functions.sql b/src/v3/scalars/date/query_date_eq_functions.sql similarity index 50% rename from src/v3/scalars/date/date_eq_query_functions.sql rename to src/v3/scalars/date/query_date_eq_functions.sql index fd852e89a..0335e3a61 100644 --- a/src/v3/scalars/date/date_eq_query_functions.sql +++ b/src/v3/scalars/date/query_date_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql -- REQUIRE: src/v3/scalars/date/date_eq_functions.sql ---! @file encrypted_domain/date/date_eq_query_functions.sql ---! @brief Functions for public.date_eq_query. +--! @file encrypted_domain/date/query_date_eq_functions.sql +--! @brief Functions for public.query_date_eq. ---! @brief Index extractor for public.date_eq_query. ---! @param a public.date_eq_query +--! @brief Index extractor for public.query_date_eq. +--! @param a public.query_date_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.date_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_date_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.date_eq_query. +--! @brief Operator wrapper for public.query_date_eq. --! @param a public.date_eq ---! @param b public.date_eq_query +--! @param b public.query_date_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_eq, b public.date_eq_query) +CREATE FUNCTION eql_v3.eq(a public.date_eq, b public.query_date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.date_eq_query. ---! @param a public.date_eq_query +--! @brief Operator wrapper for public.query_date_eq. +--! @param a public.query_date_eq --! @param b public.date_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_eq_query, b public.date_eq) +CREATE FUNCTION eql_v3.eq(a public.query_date_eq, b public.date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.date_eq_query. +--! @brief Operator wrapper for public.query_date_eq. --! @param a public.date_eq ---! @param b public.date_eq_query +--! @param b public.query_date_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_eq, b public.date_eq_query) +CREATE FUNCTION eql_v3.neq(a public.date_eq, b public.query_date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.date_eq_query. ---! @param a public.date_eq_query +--! @brief Operator wrapper for public.query_date_eq. +--! @param a public.query_date_eq --! @param b public.date_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_eq_query, b public.date_eq) +CREATE FUNCTION eql_v3.neq(a public.query_date_eq, b public.date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/text/text_eq_query_operators.sql b/src/v3/scalars/date/query_date_eq_operators.sql similarity index 53% rename from src/v3/scalars/text/text_eq_query_operators.sql rename to src/v3/scalars/date/query_date_eq_operators.sql index 7fd1b6b6c..cd7b69882 100644 --- a/src/v3/scalars/text/text_eq_query_operators.sql +++ b/src/v3/scalars/date/query_date_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql --- REQUIRE: src/v3/scalars/text/text_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_eq_functions.sql ---! @file encrypted_domain/text/text_eq_query_operators.sql ---! @brief Operators for public.text_eq_query. +--! @file encrypted_domain/date/query_date_eq_operators.sql +--! @brief Operators for public.query_date_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_eq, RIGHTARG = public.text_eq_query, + LEFTARG = public.date_eq, RIGHTARG = public.query_date_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_eq_query, RIGHTARG = public.text_eq, + LEFTARG = public.query_date_eq, RIGHTARG = public.date_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_eq, RIGHTARG = public.text_eq_query, + LEFTARG = public.date_eq, RIGHTARG = public.query_date_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_eq_query, RIGHTARG = public.text_eq, + LEFTARG = public.query_date_eq, RIGHTARG = public.date_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/date/date_ord_query_functions.sql b/src/v3/scalars/date/query_date_ord_functions.sql similarity index 51% rename from src/v3/scalars/date/date_ord_query_functions.sql rename to src/v3/scalars/date/query_date_ord_functions.sql index 5802622d2..bd9e42e27 100644 --- a/src/v3/scalars/date/date_ord_query_functions.sql +++ b/src/v3/scalars/date/query_date_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql -- REQUIRE: src/v3/scalars/date/date_ord_functions.sql ---! @file encrypted_domain/date/date_ord_query_functions.sql ---! @brief Functions for public.date_ord_query. +--! @file encrypted_domain/date/query_date_ord_functions.sql +--! @brief Functions for public.query_date_ord. ---! @brief Index extractor for public.date_ord_query. ---! @param a public.date_ord_query +--! @brief Index extractor for public.query_date_ord. +--! @param a public.query_date_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.date_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_date_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.date_ord_query. +--! @brief Operator wrapper for public.query_date_ord. --! @param a public.date_ord ---! @param b public.date_ord_query +--! @param b public.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord, b public.date_ord_query) +CREATE FUNCTION eql_v3.eq(a public.date_ord, b public.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. ---! @param a public.date_ord_query +--! @brief Operator wrapper for public.query_date_ord. +--! @param a public.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord_query, b public.date_ord) +CREATE FUNCTION eql_v3.eq(a public.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. +--! @brief Operator wrapper for public.query_date_ord. --! @param a public.date_ord ---! @param b public.date_ord_query +--! @param b public.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord, b public.date_ord_query) +CREATE FUNCTION eql_v3.neq(a public.date_ord, b public.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. ---! @param a public.date_ord_query +--! @brief Operator wrapper for public.query_date_ord. +--! @param a public.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord_query, b public.date_ord) +CREATE FUNCTION eql_v3.neq(a public.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. +--! @brief Operator wrapper for public.query_date_ord. --! @param a public.date_ord ---! @param b public.date_ord_query +--! @param b public.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord, b public.date_ord_query) +CREATE FUNCTION eql_v3.lt(a public.date_ord, b public.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. ---! @param a public.date_ord_query +--! @brief Operator wrapper for public.query_date_ord. +--! @param a public.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord_query, b public.date_ord) +CREATE FUNCTION eql_v3.lt(a public.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. +--! @brief Operator wrapper for public.query_date_ord. --! @param a public.date_ord ---! @param b public.date_ord_query +--! @param b public.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord, b public.date_ord_query) +CREATE FUNCTION eql_v3.lte(a public.date_ord, b public.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. ---! @param a public.date_ord_query +--! @brief Operator wrapper for public.query_date_ord. +--! @param a public.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord_query, b public.date_ord) +CREATE FUNCTION eql_v3.lte(a public.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. +--! @brief Operator wrapper for public.query_date_ord. --! @param a public.date_ord ---! @param b public.date_ord_query +--! @param b public.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord, b public.date_ord_query) +CREATE FUNCTION eql_v3.gt(a public.date_ord, b public.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. ---! @param a public.date_ord_query +--! @brief Operator wrapper for public.query_date_ord. +--! @param a public.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord_query, b public.date_ord) +CREATE FUNCTION eql_v3.gt(a public.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. +--! @brief Operator wrapper for public.query_date_ord. --! @param a public.date_ord ---! @param b public.date_ord_query +--! @param b public.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord, b public.date_ord_query) +CREATE FUNCTION eql_v3.gte(a public.date_ord, b public.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_query. ---! @param a public.date_ord_query +--! @brief Operator wrapper for public.query_date_ord. +--! @param a public.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord_query, b public.date_ord) +CREATE FUNCTION eql_v3.gte(a public.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/date/date_ord_ope_query_functions.sql b/src/v3/scalars/date/query_date_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/date/date_ord_ope_query_functions.sql rename to src/v3/scalars/date/query_date_ord_ope_functions.sql index 458e5adc5..a4db297dd 100644 --- a/src/v3/scalars/date/date_ord_ope_query_functions.sql +++ b/src/v3/scalars/date/query_date_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql -- REQUIRE: src/v3/scalars/date/date_ord_ope_functions.sql ---! @file encrypted_domain/date/date_ord_ope_query_functions.sql ---! @brief Functions for public.date_ord_ope_query. +--! @file encrypted_domain/date/query_date_ord_ope_functions.sql +--! @brief Functions for public.query_date_ord_ope. ---! @brief Index extractor for public.date_ord_ope_query. ---! @param a public.date_ord_ope_query +--! @brief Index extractor for public.query_date_ord_ope. +--! @param a public.query_date_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.date_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_date_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. +--! @brief Operator wrapper for public.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.date_ord_ope_query +--! @param b public.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b public.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. ---! @param a public.date_ord_ope_query +--! @brief Operator wrapper for public.query_date_ord_ope. +--! @param a public.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord_ope_query, b public.date_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. +--! @brief Operator wrapper for public.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.date_ord_ope_query +--! @param b public.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b public.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. ---! @param a public.date_ord_ope_query +--! @brief Operator wrapper for public.query_date_ord_ope. +--! @param a public.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord_ope_query, b public.date_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. +--! @brief Operator wrapper for public.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.date_ord_ope_query +--! @param b public.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b public.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. ---! @param a public.date_ord_ope_query +--! @brief Operator wrapper for public.query_date_ord_ope. +--! @param a public.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord_ope_query, b public.date_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. +--! @brief Operator wrapper for public.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.date_ord_ope_query +--! @param b public.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b public.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. ---! @param a public.date_ord_ope_query +--! @brief Operator wrapper for public.query_date_ord_ope. +--! @param a public.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord_ope_query, b public.date_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. +--! @brief Operator wrapper for public.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.date_ord_ope_query +--! @param b public.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b public.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. ---! @param a public.date_ord_ope_query +--! @brief Operator wrapper for public.query_date_ord_ope. +--! @param a public.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord_ope_query, b public.date_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. +--! @brief Operator wrapper for public.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.date_ord_ope_query +--! @param b public.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b public.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ope_query. ---! @param a public.date_ord_ope_query +--! @brief Operator wrapper for public.query_date_ord_ope. +--! @param a public.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord_ope_query, b public.date_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/date/date_ord_ope_query_operators.sql b/src/v3/scalars/date/query_date_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/date/date_ord_ope_query_operators.sql rename to src/v3/scalars/date/query_date_ord_ope_operators.sql index 12648c7ba..c62710e2f 100644 --- a/src/v3/scalars/date/date_ord_ope_query_operators.sql +++ b/src/v3/scalars/date/query_date_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql --- REQUIRE: src/v3/scalars/date/date_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_ord_ope_functions.sql ---! @file encrypted_domain/date/date_ord_ope_query_operators.sql ---! @brief Operators for public.date_ord_ope_query. +--! @file encrypted_domain/date/query_date_ord_ope_operators.sql +--! @brief Operators for public.query_date_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope_query, + LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord_ope_query, RIGHTARG = public.date_ord_ope, + LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/text/text_ord_query_operators.sql b/src/v3/scalars/date/query_date_ord_operators.sql similarity index 61% rename from src/v3/scalars/text/text_ord_query_operators.sql rename to src/v3/scalars/date/query_date_ord_operators.sql index 5cd8721ed..9d2995ef4 100644 --- a/src/v3/scalars/text/text_ord_query_operators.sql +++ b/src/v3/scalars/date/query_date_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql --- REQUIRE: src/v3/scalars/text/text_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_ord_functions.sql ---! @file encrypted_domain/text/text_ord_query_operators.sql ---! @brief Operators for public.text_ord_query. +--! @file encrypted_domain/date/query_date_ord_operators.sql +--! @brief Operators for public.query_date_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord, RIGHTARG = public.text_ord_query, + LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord_query, RIGHTARG = public.text_ord, + LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/date/date_ord_ore_query_functions.sql b/src/v3/scalars/date/query_date_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/date/date_ord_ore_query_functions.sql rename to src/v3/scalars/date/query_date_ord_ore_functions.sql index 30557d02c..57c9910e1 100644 --- a/src/v3/scalars/date/date_ord_ore_query_functions.sql +++ b/src/v3/scalars/date/query_date_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql -- REQUIRE: src/v3/scalars/date/date_ord_ore_functions.sql ---! @file encrypted_domain/date/date_ord_ore_query_functions.sql ---! @brief Functions for public.date_ord_ore_query. +--! @file encrypted_domain/date/query_date_ord_ore_functions.sql +--! @brief Functions for public.query_date_ord_ore. ---! @brief Index extractor for public.date_ord_ore_query. ---! @param a public.date_ord_ore_query +--! @brief Index extractor for public.query_date_ord_ore. +--! @param a public.query_date_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.date_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_date_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. +--! @brief Operator wrapper for public.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.date_ord_ore_query +--! @param b public.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b public.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. ---! @param a public.date_ord_ore_query +--! @brief Operator wrapper for public.query_date_ord_ore. +--! @param a public.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord_ore_query, b public.date_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. +--! @brief Operator wrapper for public.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.date_ord_ore_query +--! @param b public.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b public.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. ---! @param a public.date_ord_ore_query +--! @brief Operator wrapper for public.query_date_ord_ore. +--! @param a public.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord_ore_query, b public.date_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. +--! @brief Operator wrapper for public.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.date_ord_ore_query +--! @param b public.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b public.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. ---! @param a public.date_ord_ore_query +--! @brief Operator wrapper for public.query_date_ord_ore. +--! @param a public.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord_ore_query, b public.date_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. +--! @brief Operator wrapper for public.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.date_ord_ore_query +--! @param b public.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b public.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. ---! @param a public.date_ord_ore_query +--! @brief Operator wrapper for public.query_date_ord_ore. +--! @param a public.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord_ore_query, b public.date_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. +--! @brief Operator wrapper for public.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.date_ord_ore_query +--! @param b public.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b public.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. ---! @param a public.date_ord_ore_query +--! @brief Operator wrapper for public.query_date_ord_ore. +--! @param a public.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord_ore_query, b public.date_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. +--! @brief Operator wrapper for public.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.date_ord_ore_query +--! @param b public.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b public.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.date_ord_ore_query. ---! @param a public.date_ord_ore_query +--! @brief Operator wrapper for public.query_date_ord_ore. +--! @param a public.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord_ore_query, b public.date_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/real/real_ord_ore_query_operators.sql b/src/v3/scalars/date/query_date_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/real/real_ord_ore_query_operators.sql rename to src/v3/scalars/date/query_date_ord_ore_operators.sql index 16c10fa38..ebbd636a8 100644 --- a/src/v3/scalars/real/real_ord_ore_query_operators.sql +++ b/src/v3/scalars/date/query_date_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql --- REQUIRE: src/v3/scalars/real/real_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/date/query_date_types.sql +-- REQUIRE: src/v3/scalars/date/query_date_ord_ore_functions.sql ---! @file encrypted_domain/real/real_ord_ore_query_operators.sql ---! @brief Operators for public.real_ord_ore_query. +--! @file encrypted_domain/date/query_date_ord_ore_operators.sql +--! @brief Operators for public.query_date_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore_query, + LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord_ore_query, RIGHTARG = public.real_ord_ore, + LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/date/date_query_types.sql b/src/v3/scalars/date/query_date_types.sql similarity index 58% rename from src/v3/scalars/date/date_query_types.sql rename to src/v3/scalars/date/query_date_types.sql index 1f163444a..3028542e4 100644 --- a/src/v3/scalars/date/date_query_types.sql +++ b/src/v3/scalars/date/query_date_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/date/date_query_types.sql +--! @file v3/scalars/date/query_date_types.sql --! @brief Query-operand domains for date (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.date_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_date_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.date_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_date_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'date_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.date_eq_query AS jsonb + CREATE DOMAIN public.query_date_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_eq_query IS 'EQL date query operand (equality)'; + COMMENT ON DOMAIN public.query_date_eq IS 'EQL date query operand (equality)'; - --! @brief Query-operand domain public.date_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_date_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'date_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.date_ord_ore_query AS jsonb + CREATE DOMAIN public.query_date_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_ore_query IS 'EQL date query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_date_ord_ore IS 'EQL date query operand (equality, ordering)'; - --! @brief Query-operand domain public.date_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_date_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'date_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.date_ord_query AS jsonb + CREATE DOMAIN public.query_date_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_query IS 'EQL date query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_date_ord IS 'EQL date query operand (equality, ordering)'; - --! @brief Query-operand domain public.date_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_date_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'date_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.date_ord_ope_query AS jsonb + CREATE DOMAIN public.query_date_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.date_ord_ope_query IS 'EQL date query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_date_ord_ope IS 'EQL date query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/double/double_eq_query_functions.sql b/src/v3/scalars/double/query_double_eq_functions.sql similarity index 50% rename from src/v3/scalars/double/double_eq_query_functions.sql rename to src/v3/scalars/double/query_double_eq_functions.sql index a73af71db..a03aaa587 100644 --- a/src/v3/scalars/double/double_eq_query_functions.sql +++ b/src/v3/scalars/double/query_double_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql -- REQUIRE: src/v3/scalars/double/double_eq_functions.sql ---! @file encrypted_domain/double/double_eq_query_functions.sql ---! @brief Functions for public.double_eq_query. +--! @file encrypted_domain/double/query_double_eq_functions.sql +--! @brief Functions for public.query_double_eq. ---! @brief Index extractor for public.double_eq_query. ---! @param a public.double_eq_query +--! @brief Index extractor for public.query_double_eq. +--! @param a public.query_double_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.double_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_double_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.double_eq_query. +--! @brief Operator wrapper for public.query_double_eq. --! @param a public.double_eq ---! @param b public.double_eq_query +--! @param b public.query_double_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_eq, b public.double_eq_query) +CREATE FUNCTION eql_v3.eq(a public.double_eq, b public.query_double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.double_eq_query. ---! @param a public.double_eq_query +--! @brief Operator wrapper for public.query_double_eq. +--! @param a public.query_double_eq --! @param b public.double_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_eq_query, b public.double_eq) +CREATE FUNCTION eql_v3.eq(a public.query_double_eq, b public.double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.double_eq_query. +--! @brief Operator wrapper for public.query_double_eq. --! @param a public.double_eq ---! @param b public.double_eq_query +--! @param b public.query_double_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_eq, b public.double_eq_query) +CREATE FUNCTION eql_v3.neq(a public.double_eq, b public.query_double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.double_eq_query. ---! @param a public.double_eq_query +--! @brief Operator wrapper for public.query_double_eq. +--! @param a public.query_double_eq --! @param b public.double_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_eq_query, b public.double_eq) +CREATE FUNCTION eql_v3.neq(a public.query_double_eq, b public.double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/bigint/bigint_eq_query_operators.sql b/src/v3/scalars/double/query_double_eq_operators.sql similarity index 52% rename from src/v3/scalars/bigint/bigint_eq_query_operators.sql rename to src/v3/scalars/double/query_double_eq_operators.sql index 2b2e482da..1b642ec96 100644 --- a/src/v3/scalars/bigint/bigint_eq_query_operators.sql +++ b/src/v3/scalars/double/query_double_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql --- REQUIRE: src/v3/scalars/bigint/bigint_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_eq_functions.sql ---! @file encrypted_domain/bigint/bigint_eq_query_operators.sql ---! @brief Operators for public.bigint_eq_query. +--! @file encrypted_domain/double/query_double_eq_operators.sql +--! @brief Operators for public.query_double_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq_query, + LEFTARG = public.double_eq, RIGHTARG = public.query_double_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_eq_query, RIGHTARG = public.bigint_eq, + LEFTARG = public.query_double_eq, RIGHTARG = public.double_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq_query, + LEFTARG = public.double_eq, RIGHTARG = public.query_double_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_eq_query, RIGHTARG = public.bigint_eq, + LEFTARG = public.query_double_eq, RIGHTARG = public.double_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/double/double_ord_query_functions.sql b/src/v3/scalars/double/query_double_ord_functions.sql similarity index 51% rename from src/v3/scalars/double/double_ord_query_functions.sql rename to src/v3/scalars/double/query_double_ord_functions.sql index 8096cb985..abef36162 100644 --- a/src/v3/scalars/double/double_ord_query_functions.sql +++ b/src/v3/scalars/double/query_double_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql -- REQUIRE: src/v3/scalars/double/double_ord_functions.sql ---! @file encrypted_domain/double/double_ord_query_functions.sql ---! @brief Functions for public.double_ord_query. +--! @file encrypted_domain/double/query_double_ord_functions.sql +--! @brief Functions for public.query_double_ord. ---! @brief Index extractor for public.double_ord_query. ---! @param a public.double_ord_query +--! @brief Index extractor for public.query_double_ord. +--! @param a public.query_double_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.double_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_double_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.double_ord_query. +--! @brief Operator wrapper for public.query_double_ord. --! @param a public.double_ord ---! @param b public.double_ord_query +--! @param b public.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord, b public.double_ord_query) +CREATE FUNCTION eql_v3.eq(a public.double_ord, b public.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. ---! @param a public.double_ord_query +--! @brief Operator wrapper for public.query_double_ord. +--! @param a public.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord_query, b public.double_ord) +CREATE FUNCTION eql_v3.eq(a public.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. +--! @brief Operator wrapper for public.query_double_ord. --! @param a public.double_ord ---! @param b public.double_ord_query +--! @param b public.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord, b public.double_ord_query) +CREATE FUNCTION eql_v3.neq(a public.double_ord, b public.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. ---! @param a public.double_ord_query +--! @brief Operator wrapper for public.query_double_ord. +--! @param a public.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord_query, b public.double_ord) +CREATE FUNCTION eql_v3.neq(a public.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. +--! @brief Operator wrapper for public.query_double_ord. --! @param a public.double_ord ---! @param b public.double_ord_query +--! @param b public.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord, b public.double_ord_query) +CREATE FUNCTION eql_v3.lt(a public.double_ord, b public.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. ---! @param a public.double_ord_query +--! @brief Operator wrapper for public.query_double_ord. +--! @param a public.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord_query, b public.double_ord) +CREATE FUNCTION eql_v3.lt(a public.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. +--! @brief Operator wrapper for public.query_double_ord. --! @param a public.double_ord ---! @param b public.double_ord_query +--! @param b public.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord, b public.double_ord_query) +CREATE FUNCTION eql_v3.lte(a public.double_ord, b public.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. ---! @param a public.double_ord_query +--! @brief Operator wrapper for public.query_double_ord. +--! @param a public.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord_query, b public.double_ord) +CREATE FUNCTION eql_v3.lte(a public.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. +--! @brief Operator wrapper for public.query_double_ord. --! @param a public.double_ord ---! @param b public.double_ord_query +--! @param b public.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord, b public.double_ord_query) +CREATE FUNCTION eql_v3.gt(a public.double_ord, b public.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. ---! @param a public.double_ord_query +--! @brief Operator wrapper for public.query_double_ord. +--! @param a public.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord_query, b public.double_ord) +CREATE FUNCTION eql_v3.gt(a public.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. +--! @brief Operator wrapper for public.query_double_ord. --! @param a public.double_ord ---! @param b public.double_ord_query +--! @param b public.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord, b public.double_ord_query) +CREATE FUNCTION eql_v3.gte(a public.double_ord, b public.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_query. ---! @param a public.double_ord_query +--! @brief Operator wrapper for public.query_double_ord. +--! @param a public.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord_query, b public.double_ord) +CREATE FUNCTION eql_v3.gte(a public.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/double/double_ord_ope_query_functions.sql b/src/v3/scalars/double/query_double_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/double/double_ord_ope_query_functions.sql rename to src/v3/scalars/double/query_double_ord_ope_functions.sql index 6474a7d77..bcc347c2b 100644 --- a/src/v3/scalars/double/double_ord_ope_query_functions.sql +++ b/src/v3/scalars/double/query_double_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql -- REQUIRE: src/v3/scalars/double/double_ord_ope_functions.sql ---! @file encrypted_domain/double/double_ord_ope_query_functions.sql ---! @brief Functions for public.double_ord_ope_query. +--! @file encrypted_domain/double/query_double_ord_ope_functions.sql +--! @brief Functions for public.query_double_ord_ope. ---! @brief Index extractor for public.double_ord_ope_query. ---! @param a public.double_ord_ope_query +--! @brief Index extractor for public.query_double_ord_ope. +--! @param a public.query_double_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.double_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_double_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. +--! @brief Operator wrapper for public.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.double_ord_ope_query +--! @param b public.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b public.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. ---! @param a public.double_ord_ope_query +--! @brief Operator wrapper for public.query_double_ord_ope. +--! @param a public.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord_ope_query, b public.double_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. +--! @brief Operator wrapper for public.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.double_ord_ope_query +--! @param b public.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b public.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. ---! @param a public.double_ord_ope_query +--! @brief Operator wrapper for public.query_double_ord_ope. +--! @param a public.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord_ope_query, b public.double_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. +--! @brief Operator wrapper for public.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.double_ord_ope_query +--! @param b public.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b public.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. ---! @param a public.double_ord_ope_query +--! @brief Operator wrapper for public.query_double_ord_ope. +--! @param a public.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord_ope_query, b public.double_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. +--! @brief Operator wrapper for public.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.double_ord_ope_query +--! @param b public.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b public.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. ---! @param a public.double_ord_ope_query +--! @brief Operator wrapper for public.query_double_ord_ope. +--! @param a public.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord_ope_query, b public.double_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. +--! @brief Operator wrapper for public.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.double_ord_ope_query +--! @param b public.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b public.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. ---! @param a public.double_ord_ope_query +--! @brief Operator wrapper for public.query_double_ord_ope. +--! @param a public.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord_ope_query, b public.double_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. +--! @brief Operator wrapper for public.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.double_ord_ope_query +--! @param b public.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b public.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ope_query. ---! @param a public.double_ord_ope_query +--! @brief Operator wrapper for public.query_double_ord_ope. +--! @param a public.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord_ope_query, b public.double_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/double/double_ord_ope_query_operators.sql b/src/v3/scalars/double/query_double_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/double/double_ord_ope_query_operators.sql rename to src/v3/scalars/double/query_double_ord_ope_operators.sql index 73c7adb31..507561139 100644 --- a/src/v3/scalars/double/double_ord_ope_query_operators.sql +++ b/src/v3/scalars/double/query_double_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql --- REQUIRE: src/v3/scalars/double/double_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_ord_ope_functions.sql ---! @file encrypted_domain/double/double_ord_ope_query_operators.sql ---! @brief Operators for public.double_ord_ope_query. +--! @file encrypted_domain/double/query_double_ord_ope_operators.sql +--! @brief Operators for public.query_double_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope_query, + LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord_ope_query, RIGHTARG = public.double_ord_ope, + LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/bigint/bigint_ord_query_operators.sql b/src/v3/scalars/double/query_double_ord_operators.sql similarity index 60% rename from src/v3/scalars/bigint/bigint_ord_query_operators.sql rename to src/v3/scalars/double/query_double_ord_operators.sql index eb9e0a3a5..68b53dda9 100644 --- a/src/v3/scalars/bigint/bigint_ord_query_operators.sql +++ b/src/v3/scalars/double/query_double_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/bigint/bigint_query_types.sql --- REQUIRE: src/v3/scalars/bigint/bigint_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_ord_functions.sql ---! @file encrypted_domain/bigint/bigint_ord_query_operators.sql ---! @brief Operators for public.bigint_ord_query. +--! @file encrypted_domain/double/query_double_ord_operators.sql +--! @brief Operators for public.query_double_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord_query, + LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord_query, RIGHTARG = public.bigint_ord, + LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/double/double_ord_ore_query_functions.sql b/src/v3/scalars/double/query_double_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/double/double_ord_ore_query_functions.sql rename to src/v3/scalars/double/query_double_ord_ore_functions.sql index 372d0d0b8..59dfa1a41 100644 --- a/src/v3/scalars/double/double_ord_ore_query_functions.sql +++ b/src/v3/scalars/double/query_double_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql -- REQUIRE: src/v3/scalars/double/double_ord_ore_functions.sql ---! @file encrypted_domain/double/double_ord_ore_query_functions.sql ---! @brief Functions for public.double_ord_ore_query. +--! @file encrypted_domain/double/query_double_ord_ore_functions.sql +--! @brief Functions for public.query_double_ord_ore. ---! @brief Index extractor for public.double_ord_ore_query. ---! @param a public.double_ord_ore_query +--! @brief Index extractor for public.query_double_ord_ore. +--! @param a public.query_double_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.double_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_double_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. +--! @brief Operator wrapper for public.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.double_ord_ore_query +--! @param b public.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b public.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. ---! @param a public.double_ord_ore_query +--! @brief Operator wrapper for public.query_double_ord_ore. +--! @param a public.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord_ore_query, b public.double_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. +--! @brief Operator wrapper for public.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.double_ord_ore_query +--! @param b public.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b public.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. ---! @param a public.double_ord_ore_query +--! @brief Operator wrapper for public.query_double_ord_ore. +--! @param a public.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord_ore_query, b public.double_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. +--! @brief Operator wrapper for public.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.double_ord_ore_query +--! @param b public.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b public.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. ---! @param a public.double_ord_ore_query +--! @brief Operator wrapper for public.query_double_ord_ore. +--! @param a public.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord_ore_query, b public.double_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. +--! @brief Operator wrapper for public.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.double_ord_ore_query +--! @param b public.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b public.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. ---! @param a public.double_ord_ore_query +--! @brief Operator wrapper for public.query_double_ord_ore. +--! @param a public.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord_ore_query, b public.double_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. +--! @brief Operator wrapper for public.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.double_ord_ore_query +--! @param b public.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b public.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. ---! @param a public.double_ord_ore_query +--! @brief Operator wrapper for public.query_double_ord_ore. +--! @param a public.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord_ore_query, b public.double_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. +--! @brief Operator wrapper for public.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.double_ord_ore_query +--! @param b public.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b public.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.double_ord_ore_query. ---! @param a public.double_ord_ore_query +--! @brief Operator wrapper for public.query_double_ord_ore. +--! @param a public.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord_ore_query, b public.double_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/double/double_ord_ore_query_operators.sql b/src/v3/scalars/double/query_double_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/double/double_ord_ore_query_operators.sql rename to src/v3/scalars/double/query_double_ord_ore_operators.sql index 3fcf71a85..1295c2d3b 100644 --- a/src/v3/scalars/double/double_ord_ore_query_operators.sql +++ b/src/v3/scalars/double/query_double_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/double/double_query_types.sql --- REQUIRE: src/v3/scalars/double/double_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/double/query_double_types.sql +-- REQUIRE: src/v3/scalars/double/query_double_ord_ore_functions.sql ---! @file encrypted_domain/double/double_ord_ore_query_operators.sql ---! @brief Operators for public.double_ord_ore_query. +--! @file encrypted_domain/double/query_double_ord_ore_operators.sql +--! @brief Operators for public.query_double_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore_query, + LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord_ore_query, RIGHTARG = public.double_ord_ore, + LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/double/double_query_types.sql b/src/v3/scalars/double/query_double_types.sql similarity index 58% rename from src/v3/scalars/double/double_query_types.sql rename to src/v3/scalars/double/query_double_types.sql index 57ec15ef6..dd2914480 100644 --- a/src/v3/scalars/double/double_query_types.sql +++ b/src/v3/scalars/double/query_double_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/double/double_query_types.sql +--! @file v3/scalars/double/query_double_types.sql --! @brief Query-operand domains for double (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.double_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_double_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.double_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_double_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'double_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.double_eq_query AS jsonb + CREATE DOMAIN public.query_double_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_eq_query IS 'EQL double query operand (equality)'; + COMMENT ON DOMAIN public.query_double_eq IS 'EQL double query operand (equality)'; - --! @brief Query-operand domain public.double_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_double_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'double_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.double_ord_ore_query AS jsonb + CREATE DOMAIN public.query_double_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_ore_query IS 'EQL double query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_double_ord_ore IS 'EQL double query operand (equality, ordering)'; - --! @brief Query-operand domain public.double_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_double_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'double_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.double_ord_query AS jsonb + CREATE DOMAIN public.query_double_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_query IS 'EQL double query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_double_ord IS 'EQL double query operand (equality, ordering)'; - --! @brief Query-operand domain public.double_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_double_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'double_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.double_ord_ope_query AS jsonb + CREATE DOMAIN public.query_double_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.double_ord_ope_query IS 'EQL double query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_double_ord_ope IS 'EQL double query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/integer/integer_eq_query_functions.sql b/src/v3/scalars/integer/query_integer_eq_functions.sql similarity index 50% rename from src/v3/scalars/integer/integer_eq_query_functions.sql rename to src/v3/scalars/integer/query_integer_eq_functions.sql index b6443c1ba..92a70d1c0 100644 --- a/src/v3/scalars/integer/integer_eq_query_functions.sql +++ b/src/v3/scalars/integer/query_integer_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql -- REQUIRE: src/v3/scalars/integer/integer_eq_functions.sql ---! @file encrypted_domain/integer/integer_eq_query_functions.sql ---! @brief Functions for public.integer_eq_query. +--! @file encrypted_domain/integer/query_integer_eq_functions.sql +--! @brief Functions for public.query_integer_eq. ---! @brief Index extractor for public.integer_eq_query. ---! @param a public.integer_eq_query +--! @brief Index extractor for public.query_integer_eq. +--! @param a public.query_integer_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.integer_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_integer_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.integer_eq_query. +--! @brief Operator wrapper for public.query_integer_eq. --! @param a public.integer_eq ---! @param b public.integer_eq_query +--! @param b public.query_integer_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq_query) +CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.query_integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.integer_eq_query. ---! @param a public.integer_eq_query +--! @brief Operator wrapper for public.query_integer_eq. +--! @param a public.query_integer_eq --! @param b public.integer_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_eq_query, b public.integer_eq) +CREATE FUNCTION eql_v3.eq(a public.query_integer_eq, b public.integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.integer_eq_query. +--! @brief Operator wrapper for public.query_integer_eq. --! @param a public.integer_eq ---! @param b public.integer_eq_query +--! @param b public.query_integer_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_eq, b public.integer_eq_query) +CREATE FUNCTION eql_v3.neq(a public.integer_eq, b public.query_integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.integer_eq_query. ---! @param a public.integer_eq_query +--! @brief Operator wrapper for public.query_integer_eq. +--! @param a public.query_integer_eq --! @param b public.integer_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_eq_query, b public.integer_eq) +CREATE FUNCTION eql_v3.neq(a public.query_integer_eq, b public.integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_eq_query_operators.sql b/src/v3/scalars/integer/query_integer_eq_operators.sql similarity index 52% rename from src/v3/scalars/numeric/numeric_eq_query_operators.sql rename to src/v3/scalars/integer/query_integer_eq_operators.sql index c0a27401b..a55f2dff1 100644 --- a/src/v3/scalars/numeric/numeric_eq_query_operators.sql +++ b/src/v3/scalars/integer/query_integer_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql --- REQUIRE: src/v3/scalars/numeric/numeric_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_eq_functions.sql ---! @file encrypted_domain/numeric/numeric_eq_query_operators.sql ---! @brief Operators for public.numeric_eq_query. +--! @file encrypted_domain/integer/query_integer_eq_operators.sql +--! @brief Operators for public.query_integer_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq_query, + LEFTARG = public.integer_eq, RIGHTARG = public.query_integer_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_eq_query, RIGHTARG = public.numeric_eq, + LEFTARG = public.query_integer_eq, RIGHTARG = public.integer_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq_query, + LEFTARG = public.integer_eq, RIGHTARG = public.query_integer_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_eq_query, RIGHTARG = public.numeric_eq, + LEFTARG = public.query_integer_eq, RIGHTARG = public.integer_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/integer/integer_ord_query_functions.sql b/src/v3/scalars/integer/query_integer_ord_functions.sql similarity index 51% rename from src/v3/scalars/integer/integer_ord_query_functions.sql rename to src/v3/scalars/integer/query_integer_ord_functions.sql index 1aa56ca0a..b03ba07da 100644 --- a/src/v3/scalars/integer/integer_ord_query_functions.sql +++ b/src/v3/scalars/integer/query_integer_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql -- REQUIRE: src/v3/scalars/integer/integer_ord_functions.sql ---! @file encrypted_domain/integer/integer_ord_query_functions.sql ---! @brief Functions for public.integer_ord_query. +--! @file encrypted_domain/integer/query_integer_ord_functions.sql +--! @brief Functions for public.query_integer_ord. ---! @brief Index extractor for public.integer_ord_query. ---! @param a public.integer_ord_query +--! @brief Index extractor for public.query_integer_ord. +--! @param a public.query_integer_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.integer_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_integer_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.integer_ord_query. +--! @brief Operator wrapper for public.query_integer_ord. --! @param a public.integer_ord ---! @param b public.integer_ord_query +--! @param b public.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord, b public.integer_ord_query) +CREATE FUNCTION eql_v3.eq(a public.integer_ord, b public.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. ---! @param a public.integer_ord_query +--! @brief Operator wrapper for public.query_integer_ord. +--! @param a public.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord_query, b public.integer_ord) +CREATE FUNCTION eql_v3.eq(a public.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. +--! @brief Operator wrapper for public.query_integer_ord. --! @param a public.integer_ord ---! @param b public.integer_ord_query +--! @param b public.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord, b public.integer_ord_query) +CREATE FUNCTION eql_v3.neq(a public.integer_ord, b public.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. ---! @param a public.integer_ord_query +--! @brief Operator wrapper for public.query_integer_ord. +--! @param a public.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord_query, b public.integer_ord) +CREATE FUNCTION eql_v3.neq(a public.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. +--! @brief Operator wrapper for public.query_integer_ord. --! @param a public.integer_ord ---! @param b public.integer_ord_query +--! @param b public.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord, b public.integer_ord_query) +CREATE FUNCTION eql_v3.lt(a public.integer_ord, b public.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. ---! @param a public.integer_ord_query +--! @brief Operator wrapper for public.query_integer_ord. +--! @param a public.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord_query, b public.integer_ord) +CREATE FUNCTION eql_v3.lt(a public.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. +--! @brief Operator wrapper for public.query_integer_ord. --! @param a public.integer_ord ---! @param b public.integer_ord_query +--! @param b public.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord, b public.integer_ord_query) +CREATE FUNCTION eql_v3.lte(a public.integer_ord, b public.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. ---! @param a public.integer_ord_query +--! @brief Operator wrapper for public.query_integer_ord. +--! @param a public.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord_query, b public.integer_ord) +CREATE FUNCTION eql_v3.lte(a public.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. +--! @brief Operator wrapper for public.query_integer_ord. --! @param a public.integer_ord ---! @param b public.integer_ord_query +--! @param b public.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord, b public.integer_ord_query) +CREATE FUNCTION eql_v3.gt(a public.integer_ord, b public.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. ---! @param a public.integer_ord_query +--! @brief Operator wrapper for public.query_integer_ord. +--! @param a public.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord_query, b public.integer_ord) +CREATE FUNCTION eql_v3.gt(a public.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. +--! @brief Operator wrapper for public.query_integer_ord. --! @param a public.integer_ord ---! @param b public.integer_ord_query +--! @param b public.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord, b public.integer_ord_query) +CREATE FUNCTION eql_v3.gte(a public.integer_ord, b public.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_query. ---! @param a public.integer_ord_query +--! @brief Operator wrapper for public.query_integer_ord. +--! @param a public.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord_query, b public.integer_ord) +CREATE FUNCTION eql_v3.gte(a public.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/integer/integer_ord_ope_query_functions.sql b/src/v3/scalars/integer/query_integer_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/integer/integer_ord_ope_query_functions.sql rename to src/v3/scalars/integer/query_integer_ord_ope_functions.sql index 292ccce18..42a10eb7d 100644 --- a/src/v3/scalars/integer/integer_ord_ope_query_functions.sql +++ b/src/v3/scalars/integer/query_integer_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql -- REQUIRE: src/v3/scalars/integer/integer_ord_ope_functions.sql ---! @file encrypted_domain/integer/integer_ord_ope_query_functions.sql ---! @brief Functions for public.integer_ord_ope_query. +--! @file encrypted_domain/integer/query_integer_ord_ope_functions.sql +--! @brief Functions for public.query_integer_ord_ope. ---! @brief Index extractor for public.integer_ord_ope_query. ---! @param a public.integer_ord_ope_query +--! @brief Index extractor for public.query_integer_ord_ope. +--! @param a public.query_integer_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.integer_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_integer_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. +--! @brief Operator wrapper for public.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.integer_ord_ope_query +--! @param b public.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b public.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. ---! @param a public.integer_ord_ope_query +--! @brief Operator wrapper for public.query_integer_ord_ope. +--! @param a public.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope_query, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. +--! @brief Operator wrapper for public.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.integer_ord_ope_query +--! @param b public.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b public.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. ---! @param a public.integer_ord_ope_query +--! @brief Operator wrapper for public.query_integer_ord_ope. +--! @param a public.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope_query, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. +--! @brief Operator wrapper for public.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.integer_ord_ope_query +--! @param b public.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b public.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. ---! @param a public.integer_ord_ope_query +--! @brief Operator wrapper for public.query_integer_ord_ope. +--! @param a public.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope_query, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. +--! @brief Operator wrapper for public.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.integer_ord_ope_query +--! @param b public.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b public.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. ---! @param a public.integer_ord_ope_query +--! @brief Operator wrapper for public.query_integer_ord_ope. +--! @param a public.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope_query, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. +--! @brief Operator wrapper for public.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.integer_ord_ope_query +--! @param b public.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b public.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. ---! @param a public.integer_ord_ope_query +--! @brief Operator wrapper for public.query_integer_ord_ope. +--! @param a public.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope_query, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. +--! @brief Operator wrapper for public.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.integer_ord_ope_query +--! @param b public.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b public.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ope_query. ---! @param a public.integer_ord_ope_query +--! @brief Operator wrapper for public.query_integer_ord_ope. +--! @param a public.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope_query, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/integer/integer_ord_ope_query_operators.sql b/src/v3/scalars/integer/query_integer_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/integer/integer_ord_ope_query_operators.sql rename to src/v3/scalars/integer/query_integer_ord_ope_operators.sql index 083420371..5afb93ce2 100644 --- a/src/v3/scalars/integer/integer_ord_ope_query_operators.sql +++ b/src/v3/scalars/integer/query_integer_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql --- REQUIRE: src/v3/scalars/integer/integer_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_ord_ope_functions.sql ---! @file encrypted_domain/integer/integer_ord_ope_query_operators.sql ---! @brief Operators for public.integer_ord_ope_query. +--! @file encrypted_domain/integer/query_integer_ord_ope_operators.sql +--! @brief Operators for public.query_integer_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope_query, + LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord_ope_query, RIGHTARG = public.integer_ord_ope, + LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/numeric/numeric_ord_query_operators.sql b/src/v3/scalars/integer/query_integer_ord_operators.sql similarity index 60% rename from src/v3/scalars/numeric/numeric_ord_query_operators.sql rename to src/v3/scalars/integer/query_integer_ord_operators.sql index e16290705..94b527910 100644 --- a/src/v3/scalars/numeric/numeric_ord_query_operators.sql +++ b/src/v3/scalars/integer/query_integer_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql --- REQUIRE: src/v3/scalars/numeric/numeric_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_ord_functions.sql ---! @file encrypted_domain/numeric/numeric_ord_query_operators.sql ---! @brief Operators for public.numeric_ord_query. +--! @file encrypted_domain/integer/query_integer_ord_operators.sql +--! @brief Operators for public.query_integer_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord_query, + LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord_query, RIGHTARG = public.numeric_ord, + LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/integer/integer_ord_ore_query_functions.sql b/src/v3/scalars/integer/query_integer_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/integer/integer_ord_ore_query_functions.sql rename to src/v3/scalars/integer/query_integer_ord_ore_functions.sql index 288a77dea..6e7b9a88b 100644 --- a/src/v3/scalars/integer/integer_ord_ore_query_functions.sql +++ b/src/v3/scalars/integer/query_integer_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql -- REQUIRE: src/v3/scalars/integer/integer_ord_ore_functions.sql ---! @file encrypted_domain/integer/integer_ord_ore_query_functions.sql ---! @brief Functions for public.integer_ord_ore_query. +--! @file encrypted_domain/integer/query_integer_ord_ore_functions.sql +--! @brief Functions for public.query_integer_ord_ore. ---! @brief Index extractor for public.integer_ord_ore_query. ---! @param a public.integer_ord_ore_query +--! @brief Index extractor for public.query_integer_ord_ore. +--! @param a public.query_integer_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.integer_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_integer_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. +--! @brief Operator wrapper for public.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.integer_ord_ore_query +--! @param b public.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b public.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. ---! @param a public.integer_ord_ore_query +--! @brief Operator wrapper for public.query_integer_ord_ore. +--! @param a public.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore_query, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. +--! @brief Operator wrapper for public.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.integer_ord_ore_query +--! @param b public.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b public.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. ---! @param a public.integer_ord_ore_query +--! @brief Operator wrapper for public.query_integer_ord_ore. +--! @param a public.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore_query, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. +--! @brief Operator wrapper for public.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.integer_ord_ore_query +--! @param b public.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b public.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. ---! @param a public.integer_ord_ore_query +--! @brief Operator wrapper for public.query_integer_ord_ore. +--! @param a public.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore_query, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. +--! @brief Operator wrapper for public.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.integer_ord_ore_query +--! @param b public.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b public.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. ---! @param a public.integer_ord_ore_query +--! @brief Operator wrapper for public.query_integer_ord_ore. +--! @param a public.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore_query, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. +--! @brief Operator wrapper for public.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.integer_ord_ore_query +--! @param b public.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b public.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. ---! @param a public.integer_ord_ore_query +--! @brief Operator wrapper for public.query_integer_ord_ore. +--! @param a public.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore_query, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. +--! @brief Operator wrapper for public.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.integer_ord_ore_query +--! @param b public.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b public.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.integer_ord_ore_query. ---! @param a public.integer_ord_ore_query +--! @brief Operator wrapper for public.query_integer_ord_ore. +--! @param a public.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore_query, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/integer/integer_ord_ore_query_operators.sql b/src/v3/scalars/integer/query_integer_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/integer/integer_ord_ore_query_operators.sql rename to src/v3/scalars/integer/query_integer_ord_ore_operators.sql index 1646eb223..0432a8fa6 100644 --- a/src/v3/scalars/integer/integer_ord_ore_query_operators.sql +++ b/src/v3/scalars/integer/query_integer_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql --- REQUIRE: src/v3/scalars/integer/integer_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql +-- REQUIRE: src/v3/scalars/integer/query_integer_ord_ore_functions.sql ---! @file encrypted_domain/integer/integer_ord_ore_query_operators.sql ---! @brief Operators for public.integer_ord_ore_query. +--! @file encrypted_domain/integer/query_integer_ord_ore_operators.sql +--! @brief Operators for public.query_integer_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore_query, + LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord_ore_query, RIGHTARG = public.integer_ord_ore, + LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/integer/integer_query_types.sql b/src/v3/scalars/integer/query_integer_types.sql similarity index 59% rename from src/v3/scalars/integer/integer_query_types.sql rename to src/v3/scalars/integer/query_integer_types.sql index baaffea4a..fe3c09131 100644 --- a/src/v3/scalars/integer/integer_query_types.sql +++ b/src/v3/scalars/integer/query_integer_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/integer/integer_query_types.sql +--! @file v3/scalars/integer/query_integer_types.sql --! @brief Query-operand domains for integer (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.integer_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_integer_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.integer_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_integer_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'integer_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.integer_eq_query AS jsonb + CREATE DOMAIN public.query_integer_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_eq_query IS 'EQL integer query operand (equality)'; + COMMENT ON DOMAIN public.query_integer_eq IS 'EQL integer query operand (equality)'; - --! @brief Query-operand domain public.integer_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_integer_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'integer_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.integer_ord_ore_query AS jsonb + CREATE DOMAIN public.query_integer_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_ore_query IS 'EQL integer query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_integer_ord_ore IS 'EQL integer query operand (equality, ordering)'; - --! @brief Query-operand domain public.integer_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_integer_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'integer_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.integer_ord_query AS jsonb + CREATE DOMAIN public.query_integer_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_query IS 'EQL integer query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_integer_ord IS 'EQL integer query operand (equality, ordering)'; - --! @brief Query-operand domain public.integer_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_integer_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'integer_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.integer_ord_ope_query AS jsonb + CREATE DOMAIN public.query_integer_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.integer_ord_ope_query IS 'EQL integer query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_integer_ord_ope IS 'EQL integer query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/numeric/numeric_eq_query_functions.sql b/src/v3/scalars/numeric/query_numeric_eq_functions.sql similarity index 50% rename from src/v3/scalars/numeric/numeric_eq_query_functions.sql rename to src/v3/scalars/numeric/query_numeric_eq_functions.sql index a94e23f3d..04cddc550 100644 --- a/src/v3/scalars/numeric/numeric_eq_query_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql -- REQUIRE: src/v3/scalars/numeric/numeric_eq_functions.sql ---! @file encrypted_domain/numeric/numeric_eq_query_functions.sql ---! @brief Functions for public.numeric_eq_query. +--! @file encrypted_domain/numeric/query_numeric_eq_functions.sql +--! @brief Functions for public.query_numeric_eq. ---! @brief Index extractor for public.numeric_eq_query. ---! @param a public.numeric_eq_query +--! @brief Index extractor for public.query_numeric_eq. +--! @param a public.query_numeric_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.numeric_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_numeric_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.numeric_eq_query. +--! @brief Operator wrapper for public.query_numeric_eq. --! @param a public.numeric_eq ---! @param b public.numeric_eq_query +--! @param b public.query_numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b public.numeric_eq_query) +CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b public.query_numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.numeric_eq_query. ---! @param a public.numeric_eq_query +--! @brief Operator wrapper for public.query_numeric_eq. +--! @param a public.query_numeric_eq --! @param b public.numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_eq_query, b public.numeric_eq) +CREATE FUNCTION eql_v3.eq(a public.query_numeric_eq, b public.numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.numeric_eq_query. +--! @brief Operator wrapper for public.query_numeric_eq. --! @param a public.numeric_eq ---! @param b public.numeric_eq_query +--! @param b public.query_numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b public.numeric_eq_query) +CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b public.query_numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.numeric_eq_query. ---! @param a public.numeric_eq_query +--! @brief Operator wrapper for public.query_numeric_eq. +--! @param a public.query_numeric_eq --! @param b public.numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_eq_query, b public.numeric_eq) +CREATE FUNCTION eql_v3.neq(a public.query_numeric_eq, b public.numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/integer/integer_eq_query_operators.sql b/src/v3/scalars/numeric/query_numeric_eq_operators.sql similarity index 52% rename from src/v3/scalars/integer/integer_eq_query_operators.sql rename to src/v3/scalars/numeric/query_numeric_eq_operators.sql index e2bdc0aa9..059e28885 100644 --- a/src/v3/scalars/integer/integer_eq_query_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql --- REQUIRE: src/v3/scalars/integer/integer_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_eq_functions.sql ---! @file encrypted_domain/integer/integer_eq_query_operators.sql ---! @brief Operators for public.integer_eq_query. +--! @file encrypted_domain/numeric/query_numeric_eq_operators.sql +--! @brief Operators for public.query_numeric_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq_query, + LEFTARG = public.numeric_eq, RIGHTARG = public.query_numeric_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_eq_query, RIGHTARG = public.integer_eq, + LEFTARG = public.query_numeric_eq, RIGHTARG = public.numeric_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq_query, + LEFTARG = public.numeric_eq, RIGHTARG = public.query_numeric_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_eq_query, RIGHTARG = public.integer_eq, + LEFTARG = public.query_numeric_eq, RIGHTARG = public.numeric_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/numeric/numeric_ord_query_functions.sql b/src/v3/scalars/numeric/query_numeric_ord_functions.sql similarity index 51% rename from src/v3/scalars/numeric/numeric_ord_query_functions.sql rename to src/v3/scalars/numeric/query_numeric_ord_functions.sql index f88fd2cf4..6c19c0140 100644 --- a/src/v3/scalars/numeric/numeric_ord_query_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql -- REQUIRE: src/v3/scalars/numeric/numeric_ord_functions.sql ---! @file encrypted_domain/numeric/numeric_ord_query_functions.sql ---! @brief Functions for public.numeric_ord_query. +--! @file encrypted_domain/numeric/query_numeric_ord_functions.sql +--! @brief Functions for public.query_numeric_ord. ---! @brief Index extractor for public.numeric_ord_query. ---! @param a public.numeric_ord_query +--! @brief Index extractor for public.query_numeric_ord. +--! @param a public.query_numeric_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_numeric_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.numeric_ord_query. +--! @brief Operator wrapper for public.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.numeric_ord_query +--! @param b public.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b public.numeric_ord_query) +CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b public.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. ---! @param a public.numeric_ord_query +--! @brief Operator wrapper for public.query_numeric_ord. +--! @param a public.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord_query, b public.numeric_ord) +CREATE FUNCTION eql_v3.eq(a public.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. +--! @brief Operator wrapper for public.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.numeric_ord_query +--! @param b public.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b public.numeric_ord_query) +CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b public.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. ---! @param a public.numeric_ord_query +--! @brief Operator wrapper for public.query_numeric_ord. +--! @param a public.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord_query, b public.numeric_ord) +CREATE FUNCTION eql_v3.neq(a public.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. +--! @brief Operator wrapper for public.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.numeric_ord_query +--! @param b public.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b public.numeric_ord_query) +CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b public.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. ---! @param a public.numeric_ord_query +--! @brief Operator wrapper for public.query_numeric_ord. +--! @param a public.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord_query, b public.numeric_ord) +CREATE FUNCTION eql_v3.lt(a public.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. +--! @brief Operator wrapper for public.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.numeric_ord_query +--! @param b public.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b public.numeric_ord_query) +CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b public.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. ---! @param a public.numeric_ord_query +--! @brief Operator wrapper for public.query_numeric_ord. +--! @param a public.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord_query, b public.numeric_ord) +CREATE FUNCTION eql_v3.lte(a public.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. +--! @brief Operator wrapper for public.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.numeric_ord_query +--! @param b public.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b public.numeric_ord_query) +CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b public.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. ---! @param a public.numeric_ord_query +--! @brief Operator wrapper for public.query_numeric_ord. +--! @param a public.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord_query, b public.numeric_ord) +CREATE FUNCTION eql_v3.gt(a public.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. +--! @brief Operator wrapper for public.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.numeric_ord_query +--! @param b public.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b public.numeric_ord_query) +CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b public.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_query. ---! @param a public.numeric_ord_query +--! @brief Operator wrapper for public.query_numeric_ord. +--! @param a public.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord_query, b public.numeric_ord) +CREATE FUNCTION eql_v3.gte(a public.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql b/src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql rename to src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql index 51ee095ce..69fa69786 100644 --- a/src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ope_functions.sql ---! @file encrypted_domain/numeric/numeric_ord_ope_query_functions.sql ---! @brief Functions for public.numeric_ord_ope_query. +--! @file encrypted_domain/numeric/query_numeric_ord_ope_functions.sql +--! @brief Functions for public.query_numeric_ord_ope. ---! @brief Index extractor for public.numeric_ord_ope_query. ---! @param a public.numeric_ord_ope_query +--! @brief Index extractor for public.query_numeric_ord_ope. +--! @param a public.query_numeric_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.numeric_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_numeric_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @brief Operator wrapper for public.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.numeric_ord_ope_query +--! @param b public.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. ---! @param a public.numeric_ord_ope_query +--! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @param a public.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @brief Operator wrapper for public.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.numeric_ord_ope_query +--! @param b public.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. ---! @param a public.numeric_ord_ope_query +--! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @param a public.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @brief Operator wrapper for public.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.numeric_ord_ope_query +--! @param b public.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. ---! @param a public.numeric_ord_ope_query +--! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @param a public.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @brief Operator wrapper for public.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.numeric_ord_ope_query +--! @param b public.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. ---! @param a public.numeric_ord_ope_query +--! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @param a public.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @brief Operator wrapper for public.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.numeric_ord_ope_query +--! @param b public.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. ---! @param a public.numeric_ord_ope_query +--! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @param a public.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. +--! @brief Operator wrapper for public.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.numeric_ord_ope_query +--! @param b public.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ope_query. ---! @param a public.numeric_ord_ope_query +--! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @param a public.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_ord_ope_query_operators.sql b/src/v3/scalars/numeric/query_numeric_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/numeric/numeric_ord_ope_query_operators.sql rename to src/v3/scalars/numeric/query_numeric_ord_ope_operators.sql index bf609f805..bb68f8b8f 100644 --- a/src/v3/scalars/numeric/numeric_ord_ope_query_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql --- REQUIRE: src/v3/scalars/numeric/numeric_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql ---! @file encrypted_domain/numeric/numeric_ord_ope_query_operators.sql ---! @brief Operators for public.numeric_ord_ope_query. +--! @file encrypted_domain/numeric/query_numeric_ord_ope_operators.sql +--! @brief Operators for public.query_numeric_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope_query, + LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord_ope_query, RIGHTARG = public.numeric_ord_ope, + LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/integer/integer_ord_query_operators.sql b/src/v3/scalars/numeric/query_numeric_ord_operators.sql similarity index 60% rename from src/v3/scalars/integer/integer_ord_query_operators.sql rename to src/v3/scalars/numeric/query_numeric_ord_operators.sql index b3d7888d5..8059c2831 100644 --- a/src/v3/scalars/integer/integer_ord_query_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/integer/integer_query_types.sql --- REQUIRE: src/v3/scalars/integer/integer_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_ord_functions.sql ---! @file encrypted_domain/integer/integer_ord_query_operators.sql ---! @brief Operators for public.integer_ord_query. +--! @file encrypted_domain/numeric/query_numeric_ord_operators.sql +--! @brief Operators for public.query_numeric_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord_query, + LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord_query, RIGHTARG = public.integer_ord, + LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql b/src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql rename to src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql index d317895d8..54072d518 100644 --- a/src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_functions.sql ---! @file encrypted_domain/numeric/numeric_ord_ore_query_functions.sql ---! @brief Functions for public.numeric_ord_ore_query. +--! @file encrypted_domain/numeric/query_numeric_ord_ore_functions.sql +--! @brief Functions for public.query_numeric_ord_ore. ---! @brief Index extractor for public.numeric_ord_ore_query. ---! @param a public.numeric_ord_ore_query +--! @brief Index extractor for public.query_numeric_ord_ore. +--! @param a public.query_numeric_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_numeric_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @brief Operator wrapper for public.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.numeric_ord_ore_query +--! @param b public.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. ---! @param a public.numeric_ord_ore_query +--! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @param a public.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @brief Operator wrapper for public.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.numeric_ord_ore_query +--! @param b public.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. ---! @param a public.numeric_ord_ore_query +--! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @param a public.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @brief Operator wrapper for public.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.numeric_ord_ore_query +--! @param b public.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. ---! @param a public.numeric_ord_ore_query +--! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @param a public.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @brief Operator wrapper for public.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.numeric_ord_ore_query +--! @param b public.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. ---! @param a public.numeric_ord_ore_query +--! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @param a public.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @brief Operator wrapper for public.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.numeric_ord_ore_query +--! @param b public.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. ---! @param a public.numeric_ord_ore_query +--! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @param a public.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. +--! @brief Operator wrapper for public.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.numeric_ord_ore_query +--! @param b public.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.numeric_ord_ore_query. ---! @param a public.numeric_ord_ore_query +--! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @param a public.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/numeric/numeric_ord_ore_query_operators.sql b/src/v3/scalars/numeric/query_numeric_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/numeric/numeric_ord_ore_query_operators.sql rename to src/v3/scalars/numeric/query_numeric_ord_ore_operators.sql index aef45def1..f50c15c34 100644 --- a/src/v3/scalars/numeric/numeric_ord_ore_query_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/numeric/numeric_query_types.sql --- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql +-- REQUIRE: src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql ---! @file encrypted_domain/numeric/numeric_ord_ore_query_operators.sql ---! @brief Operators for public.numeric_ord_ore_query. +--! @file encrypted_domain/numeric/query_numeric_ord_ore_operators.sql +--! @brief Operators for public.query_numeric_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore_query, + LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord_ore_query, RIGHTARG = public.numeric_ord_ore, + LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/numeric/numeric_query_types.sql b/src/v3/scalars/numeric/query_numeric_types.sql similarity index 59% rename from src/v3/scalars/numeric/numeric_query_types.sql rename to src/v3/scalars/numeric/query_numeric_types.sql index 846db569f..021ef0264 100644 --- a/src/v3/scalars/numeric/numeric_query_types.sql +++ b/src/v3/scalars/numeric/query_numeric_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/numeric/numeric_query_types.sql +--! @file v3/scalars/numeric/query_numeric_types.sql --! @brief Query-operand domains for numeric (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.numeric_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_numeric_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.numeric_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_numeric_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'numeric_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.numeric_eq_query AS jsonb + CREATE DOMAIN public.query_numeric_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_eq_query IS 'EQL numeric query operand (equality)'; + COMMENT ON DOMAIN public.query_numeric_eq IS 'EQL numeric query operand (equality)'; - --! @brief Query-operand domain public.numeric_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_numeric_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'numeric_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.numeric_ord_ore_query AS jsonb + CREATE DOMAIN public.query_numeric_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_ore_query IS 'EQL numeric query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_numeric_ord_ore IS 'EQL numeric query operand (equality, ordering)'; - --! @brief Query-operand domain public.numeric_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_numeric_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'numeric_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.numeric_ord_query AS jsonb + CREATE DOMAIN public.query_numeric_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_query IS 'EQL numeric query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_numeric_ord IS 'EQL numeric query operand (equality, ordering)'; - --! @brief Query-operand domain public.numeric_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_numeric_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'numeric_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.numeric_ord_ope_query AS jsonb + CREATE DOMAIN public.query_numeric_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.numeric_ord_ope_query IS 'EQL numeric query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_numeric_ord_ope IS 'EQL numeric query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/real/real_eq_query_functions.sql b/src/v3/scalars/real/query_real_eq_functions.sql similarity index 50% rename from src/v3/scalars/real/real_eq_query_functions.sql rename to src/v3/scalars/real/query_real_eq_functions.sql index 2413a984b..b0f7184f5 100644 --- a/src/v3/scalars/real/real_eq_query_functions.sql +++ b/src/v3/scalars/real/query_real_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql -- REQUIRE: src/v3/scalars/real/real_eq_functions.sql ---! @file encrypted_domain/real/real_eq_query_functions.sql ---! @brief Functions for public.real_eq_query. +--! @file encrypted_domain/real/query_real_eq_functions.sql +--! @brief Functions for public.query_real_eq. ---! @brief Index extractor for public.real_eq_query. ---! @param a public.real_eq_query +--! @brief Index extractor for public.query_real_eq. +--! @param a public.query_real_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.real_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_real_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.real_eq_query. +--! @brief Operator wrapper for public.query_real_eq. --! @param a public.real_eq ---! @param b public.real_eq_query +--! @param b public.query_real_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_eq, b public.real_eq_query) +CREATE FUNCTION eql_v3.eq(a public.real_eq, b public.query_real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.real_eq_query. ---! @param a public.real_eq_query +--! @brief Operator wrapper for public.query_real_eq. +--! @param a public.query_real_eq --! @param b public.real_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_eq_query, b public.real_eq) +CREATE FUNCTION eql_v3.eq(a public.query_real_eq, b public.real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.real_eq_query. +--! @brief Operator wrapper for public.query_real_eq. --! @param a public.real_eq ---! @param b public.real_eq_query +--! @param b public.query_real_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_eq, b public.real_eq_query) +CREATE FUNCTION eql_v3.neq(a public.real_eq, b public.query_real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.real_eq_query. ---! @param a public.real_eq_query +--! @brief Operator wrapper for public.query_real_eq. +--! @param a public.query_real_eq --! @param b public.real_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_eq_query, b public.real_eq) +CREATE FUNCTION eql_v3.neq(a public.query_real_eq, b public.real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/real/real_eq_query_operators.sql b/src/v3/scalars/real/query_real_eq_operators.sql similarity index 53% rename from src/v3/scalars/real/real_eq_query_operators.sql rename to src/v3/scalars/real/query_real_eq_operators.sql index 51dadf82f..dd199b286 100644 --- a/src/v3/scalars/real/real_eq_query_operators.sql +++ b/src/v3/scalars/real/query_real_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql --- REQUIRE: src/v3/scalars/real/real_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_eq_functions.sql ---! @file encrypted_domain/real/real_eq_query_operators.sql ---! @brief Operators for public.real_eq_query. +--! @file encrypted_domain/real/query_real_eq_operators.sql +--! @brief Operators for public.query_real_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_eq, RIGHTARG = public.real_eq_query, + LEFTARG = public.real_eq, RIGHTARG = public.query_real_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_eq_query, RIGHTARG = public.real_eq, + LEFTARG = public.query_real_eq, RIGHTARG = public.real_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_eq, RIGHTARG = public.real_eq_query, + LEFTARG = public.real_eq, RIGHTARG = public.query_real_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_eq_query, RIGHTARG = public.real_eq, + LEFTARG = public.query_real_eq, RIGHTARG = public.real_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/real/real_ord_query_functions.sql b/src/v3/scalars/real/query_real_ord_functions.sql similarity index 51% rename from src/v3/scalars/real/real_ord_query_functions.sql rename to src/v3/scalars/real/query_real_ord_functions.sql index b1dc852dc..57063597a 100644 --- a/src/v3/scalars/real/real_ord_query_functions.sql +++ b/src/v3/scalars/real/query_real_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql -- REQUIRE: src/v3/scalars/real/real_ord_functions.sql ---! @file encrypted_domain/real/real_ord_query_functions.sql ---! @brief Functions for public.real_ord_query. +--! @file encrypted_domain/real/query_real_ord_functions.sql +--! @brief Functions for public.query_real_ord. ---! @brief Index extractor for public.real_ord_query. ---! @param a public.real_ord_query +--! @brief Index extractor for public.query_real_ord. +--! @param a public.query_real_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.real_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_real_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.real_ord_query. +--! @brief Operator wrapper for public.query_real_ord. --! @param a public.real_ord ---! @param b public.real_ord_query +--! @param b public.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord, b public.real_ord_query) +CREATE FUNCTION eql_v3.eq(a public.real_ord, b public.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. ---! @param a public.real_ord_query +--! @brief Operator wrapper for public.query_real_ord. +--! @param a public.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord_query, b public.real_ord) +CREATE FUNCTION eql_v3.eq(a public.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. +--! @brief Operator wrapper for public.query_real_ord. --! @param a public.real_ord ---! @param b public.real_ord_query +--! @param b public.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord, b public.real_ord_query) +CREATE FUNCTION eql_v3.neq(a public.real_ord, b public.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. ---! @param a public.real_ord_query +--! @brief Operator wrapper for public.query_real_ord. +--! @param a public.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord_query, b public.real_ord) +CREATE FUNCTION eql_v3.neq(a public.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. +--! @brief Operator wrapper for public.query_real_ord. --! @param a public.real_ord ---! @param b public.real_ord_query +--! @param b public.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord, b public.real_ord_query) +CREATE FUNCTION eql_v3.lt(a public.real_ord, b public.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. ---! @param a public.real_ord_query +--! @brief Operator wrapper for public.query_real_ord. +--! @param a public.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord_query, b public.real_ord) +CREATE FUNCTION eql_v3.lt(a public.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. +--! @brief Operator wrapper for public.query_real_ord. --! @param a public.real_ord ---! @param b public.real_ord_query +--! @param b public.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord, b public.real_ord_query) +CREATE FUNCTION eql_v3.lte(a public.real_ord, b public.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. ---! @param a public.real_ord_query +--! @brief Operator wrapper for public.query_real_ord. +--! @param a public.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord_query, b public.real_ord) +CREATE FUNCTION eql_v3.lte(a public.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. +--! @brief Operator wrapper for public.query_real_ord. --! @param a public.real_ord ---! @param b public.real_ord_query +--! @param b public.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord, b public.real_ord_query) +CREATE FUNCTION eql_v3.gt(a public.real_ord, b public.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. ---! @param a public.real_ord_query +--! @brief Operator wrapper for public.query_real_ord. +--! @param a public.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord_query, b public.real_ord) +CREATE FUNCTION eql_v3.gt(a public.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. +--! @brief Operator wrapper for public.query_real_ord. --! @param a public.real_ord ---! @param b public.real_ord_query +--! @param b public.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord, b public.real_ord_query) +CREATE FUNCTION eql_v3.gte(a public.real_ord, b public.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_query. ---! @param a public.real_ord_query +--! @brief Operator wrapper for public.query_real_ord. +--! @param a public.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord_query, b public.real_ord) +CREATE FUNCTION eql_v3.gte(a public.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/real/real_ord_ope_query_functions.sql b/src/v3/scalars/real/query_real_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/real/real_ord_ope_query_functions.sql rename to src/v3/scalars/real/query_real_ord_ope_functions.sql index b26b34d82..b22493711 100644 --- a/src/v3/scalars/real/real_ord_ope_query_functions.sql +++ b/src/v3/scalars/real/query_real_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql -- REQUIRE: src/v3/scalars/real/real_ord_ope_functions.sql ---! @file encrypted_domain/real/real_ord_ope_query_functions.sql ---! @brief Functions for public.real_ord_ope_query. +--! @file encrypted_domain/real/query_real_ord_ope_functions.sql +--! @brief Functions for public.query_real_ord_ope. ---! @brief Index extractor for public.real_ord_ope_query. ---! @param a public.real_ord_ope_query +--! @brief Index extractor for public.query_real_ord_ope. +--! @param a public.query_real_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.real_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_real_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. +--! @brief Operator wrapper for public.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.real_ord_ope_query +--! @param b public.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b public.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. ---! @param a public.real_ord_ope_query +--! @brief Operator wrapper for public.query_real_ord_ope. +--! @param a public.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord_ope_query, b public.real_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. +--! @brief Operator wrapper for public.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.real_ord_ope_query +--! @param b public.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b public.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. ---! @param a public.real_ord_ope_query +--! @brief Operator wrapper for public.query_real_ord_ope. +--! @param a public.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord_ope_query, b public.real_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. +--! @brief Operator wrapper for public.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.real_ord_ope_query +--! @param b public.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b public.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. ---! @param a public.real_ord_ope_query +--! @brief Operator wrapper for public.query_real_ord_ope. +--! @param a public.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord_ope_query, b public.real_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. +--! @brief Operator wrapper for public.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.real_ord_ope_query +--! @param b public.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b public.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. ---! @param a public.real_ord_ope_query +--! @brief Operator wrapper for public.query_real_ord_ope. +--! @param a public.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord_ope_query, b public.real_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. +--! @brief Operator wrapper for public.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.real_ord_ope_query +--! @param b public.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b public.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. ---! @param a public.real_ord_ope_query +--! @brief Operator wrapper for public.query_real_ord_ope. +--! @param a public.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord_ope_query, b public.real_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. +--! @brief Operator wrapper for public.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.real_ord_ope_query +--! @param b public.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b public.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ope_query. ---! @param a public.real_ord_ope_query +--! @brief Operator wrapper for public.query_real_ord_ope. +--! @param a public.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord_ope_query, b public.real_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/real/real_ord_ope_query_operators.sql b/src/v3/scalars/real/query_real_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/real/real_ord_ope_query_operators.sql rename to src/v3/scalars/real/query_real_ord_ope_operators.sql index 2df12e8f2..9e69b1a41 100644 --- a/src/v3/scalars/real/real_ord_ope_query_operators.sql +++ b/src/v3/scalars/real/query_real_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql --- REQUIRE: src/v3/scalars/real/real_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_ord_ope_functions.sql ---! @file encrypted_domain/real/real_ord_ope_query_operators.sql ---! @brief Operators for public.real_ord_ope_query. +--! @file encrypted_domain/real/query_real_ord_ope_operators.sql +--! @brief Operators for public.query_real_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope_query, + LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord_ope_query, RIGHTARG = public.real_ord_ope, + LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/real/real_ord_query_operators.sql b/src/v3/scalars/real/query_real_ord_operators.sql similarity index 61% rename from src/v3/scalars/real/real_ord_query_operators.sql rename to src/v3/scalars/real/query_real_ord_operators.sql index c8e1230c4..dd9b83857 100644 --- a/src/v3/scalars/real/real_ord_query_operators.sql +++ b/src/v3/scalars/real/query_real_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql --- REQUIRE: src/v3/scalars/real/real_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_ord_functions.sql ---! @file encrypted_domain/real/real_ord_query_operators.sql ---! @brief Operators for public.real_ord_query. +--! @file encrypted_domain/real/query_real_ord_operators.sql +--! @brief Operators for public.query_real_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord, RIGHTARG = public.real_ord_query, + LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord_query, RIGHTARG = public.real_ord, + LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/real/real_ord_ore_query_functions.sql b/src/v3/scalars/real/query_real_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/real/real_ord_ore_query_functions.sql rename to src/v3/scalars/real/query_real_ord_ore_functions.sql index 3ca14a58e..2254c983d 100644 --- a/src/v3/scalars/real/real_ord_ore_query_functions.sql +++ b/src/v3/scalars/real/query_real_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/real/real_query_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql -- REQUIRE: src/v3/scalars/real/real_ord_ore_functions.sql ---! @file encrypted_domain/real/real_ord_ore_query_functions.sql ---! @brief Functions for public.real_ord_ore_query. +--! @file encrypted_domain/real/query_real_ord_ore_functions.sql +--! @brief Functions for public.query_real_ord_ore. ---! @brief Index extractor for public.real_ord_ore_query. ---! @param a public.real_ord_ore_query +--! @brief Index extractor for public.query_real_ord_ore. +--! @param a public.query_real_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.real_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_real_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. +--! @brief Operator wrapper for public.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.real_ord_ore_query +--! @param b public.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b public.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. ---! @param a public.real_ord_ore_query +--! @brief Operator wrapper for public.query_real_ord_ore. +--! @param a public.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord_ore_query, b public.real_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. +--! @brief Operator wrapper for public.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.real_ord_ore_query +--! @param b public.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b public.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. ---! @param a public.real_ord_ore_query +--! @brief Operator wrapper for public.query_real_ord_ore. +--! @param a public.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord_ore_query, b public.real_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. +--! @brief Operator wrapper for public.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.real_ord_ore_query +--! @param b public.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b public.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. ---! @param a public.real_ord_ore_query +--! @brief Operator wrapper for public.query_real_ord_ore. +--! @param a public.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord_ore_query, b public.real_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. +--! @brief Operator wrapper for public.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.real_ord_ore_query +--! @param b public.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b public.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. ---! @param a public.real_ord_ore_query +--! @brief Operator wrapper for public.query_real_ord_ore. +--! @param a public.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord_ore_query, b public.real_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. +--! @brief Operator wrapper for public.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.real_ord_ore_query +--! @param b public.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b public.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. ---! @param a public.real_ord_ore_query +--! @brief Operator wrapper for public.query_real_ord_ore. +--! @param a public.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord_ore_query, b public.real_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. +--! @brief Operator wrapper for public.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.real_ord_ore_query +--! @param b public.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b public.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.real_ord_ore_query. ---! @param a public.real_ord_ore_query +--! @brief Operator wrapper for public.query_real_ord_ore. +--! @param a public.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord_ore_query, b public.real_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/date/date_ord_ore_query_operators.sql b/src/v3/scalars/real/query_real_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/date/date_ord_ore_query_operators.sql rename to src/v3/scalars/real/query_real_ord_ore_operators.sql index 57a711730..7db0a3632 100644 --- a/src/v3/scalars/date/date_ord_ore_query_operators.sql +++ b/src/v3/scalars/real/query_real_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql --- REQUIRE: src/v3/scalars/date/date_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/real/query_real_types.sql +-- REQUIRE: src/v3/scalars/real/query_real_ord_ore_functions.sql ---! @file encrypted_domain/date/date_ord_ore_query_operators.sql ---! @brief Operators for public.date_ord_ore_query. +--! @file encrypted_domain/real/query_real_ord_ore_operators.sql +--! @brief Operators for public.query_real_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore_query, + LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord_ore_query, RIGHTARG = public.date_ord_ore, + LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/real/real_query_types.sql b/src/v3/scalars/real/query_real_types.sql similarity index 58% rename from src/v3/scalars/real/real_query_types.sql rename to src/v3/scalars/real/query_real_types.sql index e328ae225..2317e83fd 100644 --- a/src/v3/scalars/real/real_query_types.sql +++ b/src/v3/scalars/real/query_real_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/real/real_query_types.sql +--! @file v3/scalars/real/query_real_types.sql --! @brief Query-operand domains for real (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.real_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_real_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.real_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_real_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'real_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.real_eq_query AS jsonb + CREATE DOMAIN public.query_real_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_eq_query IS 'EQL real query operand (equality)'; + COMMENT ON DOMAIN public.query_real_eq IS 'EQL real query operand (equality)'; - --! @brief Query-operand domain public.real_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_real_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'real_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.real_ord_ore_query AS jsonb + CREATE DOMAIN public.query_real_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_ore_query IS 'EQL real query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_real_ord_ore IS 'EQL real query operand (equality, ordering)'; - --! @brief Query-operand domain public.real_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_real_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'real_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.real_ord_query AS jsonb + CREATE DOMAIN public.query_real_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_query IS 'EQL real query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_real_ord IS 'EQL real query operand (equality, ordering)'; - --! @brief Query-operand domain public.real_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_real_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'real_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.real_ord_ope_query AS jsonb + CREATE DOMAIN public.query_real_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.real_ord_ope_query IS 'EQL real query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_real_ord_ope IS 'EQL real query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/smallint/smallint_eq_query_functions.sql b/src/v3/scalars/smallint/query_smallint_eq_functions.sql similarity index 50% rename from src/v3/scalars/smallint/smallint_eq_query_functions.sql rename to src/v3/scalars/smallint/query_smallint_eq_functions.sql index 609f8ad8a..61efc4101 100644 --- a/src/v3/scalars/smallint/smallint_eq_query_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql -- REQUIRE: src/v3/scalars/smallint/smallint_eq_functions.sql ---! @file encrypted_domain/smallint/smallint_eq_query_functions.sql ---! @brief Functions for public.smallint_eq_query. +--! @file encrypted_domain/smallint/query_smallint_eq_functions.sql +--! @brief Functions for public.query_smallint_eq. ---! @brief Index extractor for public.smallint_eq_query. ---! @param a public.smallint_eq_query +--! @brief Index extractor for public.query_smallint_eq. +--! @param a public.query_smallint_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.smallint_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_smallint_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.smallint_eq_query. +--! @brief Operator wrapper for public.query_smallint_eq. --! @param a public.smallint_eq ---! @param b public.smallint_eq_query +--! @param b public.query_smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b public.smallint_eq_query) +CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b public.query_smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.smallint_eq_query. ---! @param a public.smallint_eq_query +--! @brief Operator wrapper for public.query_smallint_eq. +--! @param a public.query_smallint_eq --! @param b public.smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_eq_query, b public.smallint_eq) +CREATE FUNCTION eql_v3.eq(a public.query_smallint_eq, b public.smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.smallint_eq_query. +--! @brief Operator wrapper for public.query_smallint_eq. --! @param a public.smallint_eq ---! @param b public.smallint_eq_query +--! @param b public.query_smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b public.smallint_eq_query) +CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b public.query_smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.smallint_eq_query. ---! @param a public.smallint_eq_query +--! @brief Operator wrapper for public.query_smallint_eq. +--! @param a public.query_smallint_eq --! @param b public.smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_eq_query, b public.smallint_eq) +CREATE FUNCTION eql_v3.neq(a public.query_smallint_eq, b public.smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_eq_query_operators.sql b/src/v3/scalars/smallint/query_smallint_eq_operators.sql similarity index 52% rename from src/v3/scalars/smallint/smallint_eq_query_operators.sql rename to src/v3/scalars/smallint/query_smallint_eq_operators.sql index c2324c77e..7e727dfa2 100644 --- a/src/v3/scalars/smallint/smallint_eq_query_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql --- REQUIRE: src/v3/scalars/smallint/smallint_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_eq_functions.sql ---! @file encrypted_domain/smallint/smallint_eq_query_operators.sql ---! @brief Operators for public.smallint_eq_query. +--! @file encrypted_domain/smallint/query_smallint_eq_operators.sql +--! @brief Operators for public.query_smallint_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq_query, + LEFTARG = public.smallint_eq, RIGHTARG = public.query_smallint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_eq_query, RIGHTARG = public.smallint_eq, + LEFTARG = public.query_smallint_eq, RIGHTARG = public.smallint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq_query, + LEFTARG = public.smallint_eq, RIGHTARG = public.query_smallint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_eq_query, RIGHTARG = public.smallint_eq, + LEFTARG = public.query_smallint_eq, RIGHTARG = public.smallint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/smallint/smallint_ord_query_functions.sql b/src/v3/scalars/smallint/query_smallint_ord_functions.sql similarity index 50% rename from src/v3/scalars/smallint/smallint_ord_query_functions.sql rename to src/v3/scalars/smallint/query_smallint_ord_functions.sql index 22593c6be..77274e0a6 100644 --- a/src/v3/scalars/smallint/smallint_ord_query_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql -- REQUIRE: src/v3/scalars/smallint/smallint_ord_functions.sql ---! @file encrypted_domain/smallint/smallint_ord_query_functions.sql ---! @brief Functions for public.smallint_ord_query. +--! @file encrypted_domain/smallint/query_smallint_ord_functions.sql +--! @brief Functions for public.query_smallint_ord. ---! @brief Index extractor for public.smallint_ord_query. ---! @param a public.smallint_ord_query +--! @brief Index extractor for public.query_smallint_ord. +--! @param a public.query_smallint_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_smallint_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.smallint_ord_query. +--! @brief Operator wrapper for public.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.smallint_ord_query +--! @param b public.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b public.smallint_ord_query) +CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b public.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. ---! @param a public.smallint_ord_query +--! @brief Operator wrapper for public.query_smallint_ord. +--! @param a public.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord_query, b public.smallint_ord) +CREATE FUNCTION eql_v3.eq(a public.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. +--! @brief Operator wrapper for public.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.smallint_ord_query +--! @param b public.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b public.smallint_ord_query) +CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b public.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. ---! @param a public.smallint_ord_query +--! @brief Operator wrapper for public.query_smallint_ord. +--! @param a public.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord_query, b public.smallint_ord) +CREATE FUNCTION eql_v3.neq(a public.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. +--! @brief Operator wrapper for public.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.smallint_ord_query +--! @param b public.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b public.smallint_ord_query) +CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b public.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. ---! @param a public.smallint_ord_query +--! @brief Operator wrapper for public.query_smallint_ord. +--! @param a public.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord_query, b public.smallint_ord) +CREATE FUNCTION eql_v3.lt(a public.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. +--! @brief Operator wrapper for public.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.smallint_ord_query +--! @param b public.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b public.smallint_ord_query) +CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b public.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. ---! @param a public.smallint_ord_query +--! @brief Operator wrapper for public.query_smallint_ord. +--! @param a public.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord_query, b public.smallint_ord) +CREATE FUNCTION eql_v3.lte(a public.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. +--! @brief Operator wrapper for public.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.smallint_ord_query +--! @param b public.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b public.smallint_ord_query) +CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b public.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. ---! @param a public.smallint_ord_query +--! @brief Operator wrapper for public.query_smallint_ord. +--! @param a public.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord_query, b public.smallint_ord) +CREATE FUNCTION eql_v3.gt(a public.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. +--! @brief Operator wrapper for public.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.smallint_ord_query +--! @param b public.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b public.smallint_ord_query) +CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b public.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_query. ---! @param a public.smallint_ord_query +--! @brief Operator wrapper for public.query_smallint_ord. +--! @param a public.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord_query, b public.smallint_ord) +CREATE FUNCTION eql_v3.gte(a public.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql b/src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql rename to src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql index 0d023bb8d..36b4eda37 100644 --- a/src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ope_functions.sql ---! @file encrypted_domain/smallint/smallint_ord_ope_query_functions.sql ---! @brief Functions for public.smallint_ord_ope_query. +--! @file encrypted_domain/smallint/query_smallint_ord_ope_functions.sql +--! @brief Functions for public.query_smallint_ord_ope. ---! @brief Index extractor for public.smallint_ord_ope_query. ---! @param a public.smallint_ord_ope_query +--! @brief Index extractor for public.query_smallint_ord_ope. +--! @param a public.query_smallint_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.smallint_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_smallint_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @brief Operator wrapper for public.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.smallint_ord_ope_query +--! @param b public.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. ---! @param a public.smallint_ord_ope_query +--! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @param a public.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @brief Operator wrapper for public.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.smallint_ord_ope_query +--! @param b public.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. ---! @param a public.smallint_ord_ope_query +--! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @param a public.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @brief Operator wrapper for public.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.smallint_ord_ope_query +--! @param b public.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. ---! @param a public.smallint_ord_ope_query +--! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @param a public.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @brief Operator wrapper for public.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.smallint_ord_ope_query +--! @param b public.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. ---! @param a public.smallint_ord_ope_query +--! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @param a public.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @brief Operator wrapper for public.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.smallint_ord_ope_query +--! @param b public.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. ---! @param a public.smallint_ord_ope_query +--! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @param a public.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. +--! @brief Operator wrapper for public.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.smallint_ord_ope_query +--! @param b public.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ope_query. ---! @param a public.smallint_ord_ope_query +--! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @param a public.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_ord_ope_query_operators.sql b/src/v3/scalars/smallint/query_smallint_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/smallint/smallint_ord_ope_query_operators.sql rename to src/v3/scalars/smallint/query_smallint_ord_ope_operators.sql index 1fd9a7081..320bec16c 100644 --- a/src/v3/scalars/smallint/smallint_ord_ope_query_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql --- REQUIRE: src/v3/scalars/smallint/smallint_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql ---! @file encrypted_domain/smallint/smallint_ord_ope_query_operators.sql ---! @brief Operators for public.smallint_ord_ope_query. +--! @file encrypted_domain/smallint/query_smallint_ord_ope_operators.sql +--! @brief Operators for public.query_smallint_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope_query, + LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord_ope_query, RIGHTARG = public.smallint_ord_ope, + LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/smallint/smallint_ord_query_operators.sql b/src/v3/scalars/smallint/query_smallint_ord_operators.sql similarity index 60% rename from src/v3/scalars/smallint/smallint_ord_query_operators.sql rename to src/v3/scalars/smallint/query_smallint_ord_operators.sql index 3f3844135..e82b3b026 100644 --- a/src/v3/scalars/smallint/smallint_ord_query_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql --- REQUIRE: src/v3/scalars/smallint/smallint_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_ord_functions.sql ---! @file encrypted_domain/smallint/smallint_ord_query_operators.sql ---! @brief Operators for public.smallint_ord_query. +--! @file encrypted_domain/smallint/query_smallint_ord_operators.sql +--! @brief Operators for public.query_smallint_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord_query, + LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord_query, RIGHTARG = public.smallint_ord, + LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql b/src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql rename to src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql index 5d30b06dc..b0ae24749 100644 --- a/src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ore_functions.sql ---! @file encrypted_domain/smallint/smallint_ord_ore_query_functions.sql ---! @brief Functions for public.smallint_ord_ore_query. +--! @file encrypted_domain/smallint/query_smallint_ord_ore_functions.sql +--! @brief Functions for public.query_smallint_ord_ore. ---! @brief Index extractor for public.smallint_ord_ore_query. ---! @param a public.smallint_ord_ore_query +--! @brief Index extractor for public.query_smallint_ord_ore. +--! @param a public.query_smallint_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_smallint_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @brief Operator wrapper for public.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.smallint_ord_ore_query +--! @param b public.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. ---! @param a public.smallint_ord_ore_query +--! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @param a public.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @brief Operator wrapper for public.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.smallint_ord_ore_query +--! @param b public.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. ---! @param a public.smallint_ord_ore_query +--! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @param a public.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @brief Operator wrapper for public.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.smallint_ord_ore_query +--! @param b public.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. ---! @param a public.smallint_ord_ore_query +--! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @param a public.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @brief Operator wrapper for public.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.smallint_ord_ore_query +--! @param b public.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. ---! @param a public.smallint_ord_ore_query +--! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @param a public.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @brief Operator wrapper for public.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.smallint_ord_ore_query +--! @param b public.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. ---! @param a public.smallint_ord_ore_query +--! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @param a public.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. +--! @brief Operator wrapper for public.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.smallint_ord_ore_query +--! @param b public.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.smallint_ord_ore_query. ---! @param a public.smallint_ord_ore_query +--! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @param a public.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/smallint/smallint_ord_ore_query_operators.sql b/src/v3/scalars/smallint/query_smallint_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/smallint/smallint_ord_ore_query_operators.sql rename to src/v3/scalars/smallint/query_smallint_ord_ore_operators.sql index 4536a5a26..d198009a0 100644 --- a/src/v3/scalars/smallint/smallint_ord_ore_query_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/smallint/smallint_query_types.sql --- REQUIRE: src/v3/scalars/smallint/smallint_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql +-- REQUIRE: src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql ---! @file encrypted_domain/smallint/smallint_ord_ore_query_operators.sql ---! @brief Operators for public.smallint_ord_ore_query. +--! @file encrypted_domain/smallint/query_smallint_ord_ore_operators.sql +--! @brief Operators for public.query_smallint_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore_query, + LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord_ore_query, RIGHTARG = public.smallint_ord_ore, + LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/smallint/smallint_query_types.sql b/src/v3/scalars/smallint/query_smallint_types.sql similarity index 59% rename from src/v3/scalars/smallint/smallint_query_types.sql rename to src/v3/scalars/smallint/query_smallint_types.sql index 6a8623e43..bb772cb4e 100644 --- a/src/v3/scalars/smallint/smallint_query_types.sql +++ b/src/v3/scalars/smallint/query_smallint_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/smallint/smallint_query_types.sql +--! @file v3/scalars/smallint/query_smallint_types.sql --! @brief Query-operand domains for smallint (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.smallint_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_smallint_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.smallint_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_smallint_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'smallint_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.smallint_eq_query AS jsonb + CREATE DOMAIN public.query_smallint_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_eq_query IS 'EQL smallint query operand (equality)'; + COMMENT ON DOMAIN public.query_smallint_eq IS 'EQL smallint query operand (equality)'; - --! @brief Query-operand domain public.smallint_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_smallint_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'smallint_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.smallint_ord_ore_query AS jsonb + CREATE DOMAIN public.query_smallint_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_ore_query IS 'EQL smallint query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_smallint_ord_ore IS 'EQL smallint query operand (equality, ordering)'; - --! @brief Query-operand domain public.smallint_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_smallint_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'smallint_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.smallint_ord_query AS jsonb + CREATE DOMAIN public.query_smallint_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_query IS 'EQL smallint query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_smallint_ord IS 'EQL smallint query operand (equality, ordering)'; - --! @brief Query-operand domain public.smallint_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_smallint_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'smallint_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.smallint_ord_ope_query AS jsonb + CREATE DOMAIN public.query_smallint_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.smallint_ord_ope_query IS 'EQL smallint query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_smallint_ord_ope IS 'EQL smallint query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/text/text_eq_query_functions.sql b/src/v3/scalars/text/query_text_eq_functions.sql similarity index 50% rename from src/v3/scalars/text/text_eq_query_functions.sql rename to src/v3/scalars/text/query_text_eq_functions.sql index 783a32ab1..37562d87c 100644 --- a/src/v3/scalars/text/text_eq_query_functions.sql +++ b/src/v3/scalars/text/query_text_eq_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql -- REQUIRE: src/v3/scalars/text/text_eq_functions.sql ---! @file encrypted_domain/text/text_eq_query_functions.sql ---! @brief Functions for public.text_eq_query. +--! @file encrypted_domain/text/query_text_eq_functions.sql +--! @brief Functions for public.query_text_eq. ---! @brief Index extractor for public.text_eq_query. ---! @param a public.text_eq_query +--! @brief Index extractor for public.query_text_eq. +--! @param a public.query_text_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.text_eq_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_text_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.text_eq_query. +--! @brief Operator wrapper for public.query_text_eq. --! @param a public.text_eq ---! @param b public.text_eq_query +--! @param b public.query_text_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_eq, b public.text_eq_query) +CREATE FUNCTION eql_v3.eq(a public.text_eq, b public.query_text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_eq_query. ---! @param a public.text_eq_query +--! @brief Operator wrapper for public.query_text_eq. +--! @param a public.query_text_eq --! @param b public.text_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_eq_query, b public.text_eq) +CREATE FUNCTION eql_v3.eq(a public.query_text_eq, b public.text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_eq_query. +--! @brief Operator wrapper for public.query_text_eq. --! @param a public.text_eq ---! @param b public.text_eq_query +--! @param b public.query_text_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_eq, b public.text_eq_query) +CREATE FUNCTION eql_v3.neq(a public.text_eq, b public.query_text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_eq_query. ---! @param a public.text_eq_query +--! @brief Operator wrapper for public.query_text_eq. +--! @param a public.query_text_eq --! @param b public.text_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_eq_query, b public.text_eq) +CREATE FUNCTION eql_v3.neq(a public.query_text_eq, b public.text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/date/date_eq_query_operators.sql b/src/v3/scalars/text/query_text_eq_operators.sql similarity index 53% rename from src/v3/scalars/date/date_eq_query_operators.sql rename to src/v3/scalars/text/query_text_eq_operators.sql index 00a07f230..d8289bd74 100644 --- a/src/v3/scalars/date/date_eq_query_operators.sql +++ b/src/v3/scalars/text/query_text_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql --- REQUIRE: src/v3/scalars/date/date_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_eq_functions.sql ---! @file encrypted_domain/date/date_eq_query_operators.sql ---! @brief Operators for public.date_eq_query. +--! @file encrypted_domain/text/query_text_eq_operators.sql +--! @brief Operators for public.query_text_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_eq, RIGHTARG = public.date_eq_query, + LEFTARG = public.text_eq, RIGHTARG = public.query_text_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_eq_query, RIGHTARG = public.date_eq, + LEFTARG = public.query_text_eq, RIGHTARG = public.text_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_eq, RIGHTARG = public.date_eq_query, + LEFTARG = public.text_eq, RIGHTARG = public.query_text_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_eq_query, RIGHTARG = public.date_eq, + LEFTARG = public.query_text_eq, RIGHTARG = public.text_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/text/text_match_query_functions.sql b/src/v3/scalars/text/query_text_match_functions.sql similarity index 54% rename from src/v3/scalars/text/text_match_query_functions.sql rename to src/v3/scalars/text/query_text_match_functions.sql index c94726fd6..aefe4d6ec 100644 --- a/src/v3/scalars/text/text_match_query_functions.sql +++ b/src/v3/scalars/text/query_text_match_functions.sql @@ -1,47 +1,47 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql -- REQUIRE: src/v3/scalars/text/text_match_functions.sql ---! @file encrypted_domain/text/text_match_query_functions.sql ---! @brief Functions for public.text_match_query. +--! @file encrypted_domain/text/query_text_match_functions.sql +--! @brief Functions for public.query_text_match. ---! @brief Index extractor for public.text_match_query. ---! @param a public.text_match_query +--! @brief Index extractor for public.query_text_match. +--! @param a public.query_text_match --! @return eql_v3_internal.bloom_filter -CREATE FUNCTION eql_v3.match_term(a public.text_match_query) +CREATE FUNCTION eql_v3.match_term(a public.query_text_match) RETURNS eql_v3_internal.bloom_filter LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$; ---! @brief Operator wrapper for public.text_match_query. +--! @brief Operator wrapper for public.query_text_match. --! @param a public.text_match ---! @param b public.text_match_query +--! @param b public.query_text_match --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.text_match, b public.text_match_query) +CREATE FUNCTION eql_v3.contains(a public.text_match, b public.query_text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.text_match_query. ---! @param a public.text_match_query +--! @brief Operator wrapper for public.query_text_match. +--! @param a public.query_text_match --! @param b public.text_match --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.text_match_query, b public.text_match) +CREATE FUNCTION eql_v3.contains(a public.query_text_match, b public.text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.text_match_query. +--! @brief Operator wrapper for public.query_text_match. --! @param a public.text_match ---! @param b public.text_match_query +--! @param b public.query_text_match --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.text_match, b public.text_match_query) +CREATE FUNCTION eql_v3.contained_by(a public.text_match, b public.query_text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.text_match_query. ---! @param a public.text_match_query +--! @brief Operator wrapper for public.query_text_match. +--! @param a public.query_text_match --! @param b public.text_match --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.text_match_query, b public.text_match) +CREATE FUNCTION eql_v3.contained_by(a public.query_text_match, b public.text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; diff --git a/src/v3/scalars/text/text_match_query_operators.sql b/src/v3/scalars/text/query_text_match_operators.sql similarity index 51% rename from src/v3/scalars/text/text_match_query_operators.sql rename to src/v3/scalars/text/query_text_match_operators.sql index 713df68ea..81bb88dc6 100644 --- a/src/v3/scalars/text/text_match_query_operators.sql +++ b/src/v3/scalars/text/query_text_match_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql --- REQUIRE: src/v3/scalars/text/text_match_query_functions.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_match_functions.sql ---! @file encrypted_domain/text/text_match_query_operators.sql ---! @brief Operators for public.text_match_query. +--! @file encrypted_domain/text/query_text_match_operators.sql +--! @brief Operators for public.query_text_match. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.text_match, RIGHTARG = public.text_match_query, + LEFTARG = public.text_match, RIGHTARG = public.query_text_match, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.text_match_query, RIGHTARG = public.text_match, + LEFTARG = public.query_text_match, RIGHTARG = public.text_match, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.text_match, RIGHTARG = public.text_match_query, + LEFTARG = public.text_match, RIGHTARG = public.query_text_match, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.text_match_query, RIGHTARG = public.text_match, + LEFTARG = public.query_text_match, RIGHTARG = public.text_match, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); diff --git a/src/v3/scalars/text/text_ord_query_functions.sql b/src/v3/scalars/text/query_text_ord_functions.sql similarity index 51% rename from src/v3/scalars/text/text_ord_query_functions.sql rename to src/v3/scalars/text/query_text_ord_functions.sql index abb9b0c56..2f7460989 100644 --- a/src/v3/scalars/text/text_ord_query_functions.sql +++ b/src/v3/scalars/text/query_text_ord_functions.sql @@ -1,119 +1,119 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql -- REQUIRE: src/v3/scalars/text/text_ord_functions.sql ---! @file encrypted_domain/text/text_ord_query_functions.sql ---! @brief Functions for public.text_ord_query. +--! @file encrypted_domain/text/query_text_ord_functions.sql +--! @brief Functions for public.query_text_ord. ---! @brief Index extractor for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Index extractor for public.query_text_ord. +--! @param a public.query_text_ord --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.text_ord_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_text_ord) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Index extractor for public.query_text_ord. +--! @param a public.query_text_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.text_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_text_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.text_ord_query. +--! @brief Operator wrapper for public.query_text_ord. --! @param a public.text_ord ---! @param b public.text_ord_query +--! @param b public.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord, b public.text_ord_query) +CREATE FUNCTION eql_v3.eq(a public.text_ord, b public.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Operator wrapper for public.query_text_ord. +--! @param a public.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord_query, b public.text_ord) +CREATE FUNCTION eql_v3.eq(a public.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. +--! @brief Operator wrapper for public.query_text_ord. --! @param a public.text_ord ---! @param b public.text_ord_query +--! @param b public.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord, b public.text_ord_query) +CREATE FUNCTION eql_v3.neq(a public.text_ord, b public.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Operator wrapper for public.query_text_ord. +--! @param a public.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord_query, b public.text_ord) +CREATE FUNCTION eql_v3.neq(a public.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. +--! @brief Operator wrapper for public.query_text_ord. --! @param a public.text_ord ---! @param b public.text_ord_query +--! @param b public.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord, b public.text_ord_query) +CREATE FUNCTION eql_v3.lt(a public.text_ord, b public.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Operator wrapper for public.query_text_ord. +--! @param a public.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord_query, b public.text_ord) +CREATE FUNCTION eql_v3.lt(a public.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. +--! @brief Operator wrapper for public.query_text_ord. --! @param a public.text_ord ---! @param b public.text_ord_query +--! @param b public.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord, b public.text_ord_query) +CREATE FUNCTION eql_v3.lte(a public.text_ord, b public.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Operator wrapper for public.query_text_ord. +--! @param a public.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord_query, b public.text_ord) +CREATE FUNCTION eql_v3.lte(a public.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. +--! @brief Operator wrapper for public.query_text_ord. --! @param a public.text_ord ---! @param b public.text_ord_query +--! @param b public.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord, b public.text_ord_query) +CREATE FUNCTION eql_v3.gt(a public.text_ord, b public.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Operator wrapper for public.query_text_ord. +--! @param a public.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord_query, b public.text_ord) +CREATE FUNCTION eql_v3.gt(a public.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. +--! @brief Operator wrapper for public.query_text_ord. --! @param a public.text_ord ---! @param b public.text_ord_query +--! @param b public.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord, b public.text_ord_query) +CREATE FUNCTION eql_v3.gte(a public.text_ord, b public.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_query. ---! @param a public.text_ord_query +--! @brief Operator wrapper for public.query_text_ord. +--! @param a public.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord_query, b public.text_ord) +CREATE FUNCTION eql_v3.gte(a public.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/text/text_ord_ope_query_functions.sql b/src/v3/scalars/text/query_text_ord_ope_functions.sql similarity index 51% rename from src/v3/scalars/text/text_ord_ope_query_functions.sql rename to src/v3/scalars/text/query_text_ord_ope_functions.sql index 0cb386234..473a408e4 100644 --- a/src/v3/scalars/text/text_ord_ope_query_functions.sql +++ b/src/v3/scalars/text/query_text_ord_ope_functions.sql @@ -1,119 +1,119 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql -- REQUIRE: src/v3/scalars/text/text_ord_ope_functions.sql ---! @file encrypted_domain/text/text_ord_ope_query_functions.sql ---! @brief Functions for public.text_ord_ope_query. +--! @file encrypted_domain/text/query_text_ord_ope_functions.sql +--! @brief Functions for public.query_text_ord_ope. ---! @brief Index extractor for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Index extractor for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ope_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_text_ord_ope) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Index extractor for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.text_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_text_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. +--! @brief Operator wrapper for public.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.text_ord_ope_query +--! @param b public.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b public.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Operator wrapper for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord_ope_query, b public.text_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. +--! @brief Operator wrapper for public.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.text_ord_ope_query +--! @param b public.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b public.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Operator wrapper for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord_ope_query, b public.text_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. +--! @brief Operator wrapper for public.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.text_ord_ope_query +--! @param b public.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b public.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Operator wrapper for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord_ope_query, b public.text_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. +--! @brief Operator wrapper for public.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.text_ord_ope_query +--! @param b public.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b public.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Operator wrapper for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord_ope_query, b public.text_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. +--! @brief Operator wrapper for public.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.text_ord_ope_query +--! @param b public.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b public.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Operator wrapper for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord_ope_query, b public.text_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. +--! @brief Operator wrapper for public.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.text_ord_ope_query +--! @param b public.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b public.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ope_query. ---! @param a public.text_ord_ope_query +--! @brief Operator wrapper for public.query_text_ord_ope. +--! @param a public.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord_ope_query, b public.text_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/text/text_ord_ope_query_operators.sql b/src/v3/scalars/text/query_text_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/text/text_ord_ope_query_operators.sql rename to src/v3/scalars/text/query_text_ord_ope_operators.sql index 7fe4bcf70..6ab49eec8 100644 --- a/src/v3/scalars/text/text_ord_ope_query_operators.sql +++ b/src/v3/scalars/text/query_text_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql --- REQUIRE: src/v3/scalars/text/text_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_ord_ope_functions.sql ---! @file encrypted_domain/text/text_ord_ope_query_operators.sql ---! @brief Operators for public.text_ord_ope_query. +--! @file encrypted_domain/text/query_text_ord_ope_operators.sql +--! @brief Operators for public.query_text_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope_query, + LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord_ope_query, RIGHTARG = public.text_ord_ope, + LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/date/date_ord_query_operators.sql b/src/v3/scalars/text/query_text_ord_operators.sql similarity index 61% rename from src/v3/scalars/date/date_ord_query_operators.sql rename to src/v3/scalars/text/query_text_ord_operators.sql index 83f9aa950..d57382ed0 100644 --- a/src/v3/scalars/date/date_ord_query_operators.sql +++ b/src/v3/scalars/text/query_text_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/date/date_query_types.sql --- REQUIRE: src/v3/scalars/date/date_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_ord_functions.sql ---! @file encrypted_domain/date/date_ord_query_operators.sql ---! @brief Operators for public.date_ord_query. +--! @file encrypted_domain/text/query_text_ord_operators.sql +--! @brief Operators for public.query_text_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord, RIGHTARG = public.date_ord_query, + LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord_query, RIGHTARG = public.date_ord, + LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/text/text_ord_ore_query_functions.sql b/src/v3/scalars/text/query_text_ord_ore_functions.sql similarity index 50% rename from src/v3/scalars/text/text_ord_ore_query_functions.sql rename to src/v3/scalars/text/query_text_ord_ore_functions.sql index 483056931..7d8b3bf8e 100644 --- a/src/v3/scalars/text/text_ord_ore_query_functions.sql +++ b/src/v3/scalars/text/query_text_ord_ore_functions.sql @@ -1,119 +1,119 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql -- REQUIRE: src/v3/scalars/text/text_ord_ore_functions.sql ---! @file encrypted_domain/text/text_ord_ore_query_functions.sql ---! @brief Functions for public.text_ord_ore_query. +--! @file encrypted_domain/text/query_text_ord_ore_functions.sql +--! @brief Functions for public.query_text_ord_ore. ---! @brief Index extractor for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Index extractor for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ore_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_text_ord_ore) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Index extractor for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.text_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_text_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. +--! @brief Operator wrapper for public.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.text_ord_ore_query +--! @param b public.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b public.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Operator wrapper for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord_ore_query, b public.text_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. +--! @brief Operator wrapper for public.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.text_ord_ore_query +--! @param b public.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b public.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Operator wrapper for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord_ore_query, b public.text_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. +--! @brief Operator wrapper for public.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.text_ord_ore_query +--! @param b public.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b public.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Operator wrapper for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord_ore_query, b public.text_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. +--! @brief Operator wrapper for public.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.text_ord_ore_query +--! @param b public.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b public.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Operator wrapper for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord_ore_query, b public.text_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. +--! @brief Operator wrapper for public.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.text_ord_ore_query +--! @param b public.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b public.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Operator wrapper for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord_ore_query, b public.text_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. +--! @brief Operator wrapper for public.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.text_ord_ore_query +--! @param b public.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b public.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_ord_ore_query. ---! @param a public.text_ord_ore_query +--! @brief Operator wrapper for public.query_text_ord_ore. +--! @param a public.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord_ore_query, b public.text_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/text/text_ord_ore_query_operators.sql b/src/v3/scalars/text/query_text_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/text/text_ord_ore_query_operators.sql rename to src/v3/scalars/text/query_text_ord_ore_operators.sql index 0cce1e386..41a18eac0 100644 --- a/src/v3/scalars/text/text_ord_ore_query_operators.sql +++ b/src/v3/scalars/text/query_text_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql --- REQUIRE: src/v3/scalars/text/text_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_ord_ore_functions.sql ---! @file encrypted_domain/text/text_ord_ore_query_operators.sql ---! @brief Operators for public.text_ord_ore_query. +--! @file encrypted_domain/text/query_text_ord_ore_operators.sql +--! @brief Operators for public.query_text_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore_query, + LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord_ore_query, RIGHTARG = public.text_ord_ore, + LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/text/text_search_query_functions.sql b/src/v3/scalars/text/query_text_search_functions.sql similarity index 52% rename from src/v3/scalars/text/text_search_query_functions.sql rename to src/v3/scalars/text/query_text_search_functions.sql index d6830b778..ed7f76b12 100644 --- a/src/v3/scalars/text/text_search_query_functions.sql +++ b/src/v3/scalars/text/query_text_search_functions.sql @@ -1,159 +1,159 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql -- REQUIRE: src/v3/scalars/text/text_search_functions.sql ---! @file encrypted_domain/text/text_search_query_functions.sql ---! @brief Functions for public.text_search_query. +--! @file encrypted_domain/text/query_text_search_functions.sql +--! @brief Functions for public.query_text_search. ---! @brief Index extractor for public.text_search_query. ---! @param a public.text_search_query +--! @brief Index extractor for public.query_text_search. +--! @param a public.query_text_search --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.text_search_query) +CREATE FUNCTION eql_v3.eq_term(a public.query_text_search) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.text_search_query. ---! @param a public.text_search_query +--! @brief Index extractor for public.query_text_search. +--! @param a public.query_text_search --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.text_search_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_text_search) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Index extractor for public.text_search_query. ---! @param a public.text_search_query +--! @brief Index extractor for public.query_text_search. +--! @param a public.query_text_search --! @return eql_v3_internal.bloom_filter -CREATE FUNCTION eql_v3.match_term(a public.text_search_query) +CREATE FUNCTION eql_v3.match_term(a public.query_text_search) RETURNS eql_v3_internal.bloom_filter LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.eq(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.eq(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.neq(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.neq(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.lt(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.lt(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.lte(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.lte(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.gt(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.gt(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.gte(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.gte(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.contains(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.contains(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. +--! @brief Operator wrapper for public.query_text_search. --! @param a public.text_search ---! @param b public.text_search_query +--! @param b public.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.text_search, b public.text_search_query) +CREATE FUNCTION eql_v3.contained_by(a public.text_search, b public.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.text_search_query. ---! @param a public.text_search_query +--! @brief Operator wrapper for public.query_text_search. +--! @param a public.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.text_search_query, b public.text_search) +CREATE FUNCTION eql_v3.contained_by(a public.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; diff --git a/src/v3/scalars/text/text_search_query_operators.sql b/src/v3/scalars/text/query_text_search_operators.sql similarity index 61% rename from src/v3/scalars/text/text_search_query_operators.sql rename to src/v3/scalars/text/query_text_search_operators.sql index 47e58fbff..e2aba1159 100644 --- a/src/v3/scalars/text/text_search_query_operators.sql +++ b/src/v3/scalars/text/query_text_search_operators.sql @@ -1,103 +1,103 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/text/text_query_types.sql --- REQUIRE: src/v3/scalars/text/text_search_query_functions.sql +-- REQUIRE: src/v3/scalars/text/query_text_types.sql +-- REQUIRE: src/v3/scalars/text/query_text_search_functions.sql ---! @file encrypted_domain/text/text_search_query_operators.sql ---! @brief Operators for public.text_search_query. +--! @file encrypted_domain/text/query_text_search_operators.sql +--! @brief Operators for public.query_text_search. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.text_search, RIGHTARG = public.text_search_query, + LEFTARG = public.text_search, RIGHTARG = public.query_text_search, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.text_search_query, RIGHTARG = public.text_search, + LEFTARG = public.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); diff --git a/src/v3/scalars/text/text_query_types.sql b/src/v3/scalars/text/query_text_types.sql similarity index 60% rename from src/v3/scalars/text/text_query_types.sql rename to src/v3/scalars/text/query_text_types.sql index 8552e9268..3fae03082 100644 --- a/src/v3/scalars/text/text_query_types.sql +++ b/src/v3/scalars/text/query_text_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/text/text_query_types.sql +--! @file v3/scalars/text/query_text_types.sql --! @brief Query-operand domains for text (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.text_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_text_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.text_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_text_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'text_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.text_eq_query AS jsonb + CREATE DOMAIN public.query_text_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_eq_query IS 'EQL text query operand (equality)'; + COMMENT ON DOMAIN public.query_text_eq IS 'EQL text query operand (equality)'; - --! @brief Query-operand domain public.text_match_query (term-only; no `c`). + --! @brief Query-operand domain public.query_text_match (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'text_match_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_match' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.text_match_query AS jsonb + CREATE DOMAIN public.query_text_match AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -44,14 +44,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_match_query IS 'EQL text query operand (containment)'; + COMMENT ON DOMAIN public.query_text_match IS 'EQL text query operand (containment)'; - --! @brief Query-operand domain public.text_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_text_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'text_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.text_ord_ore_query AS jsonb + CREATE DOMAIN public.query_text_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -65,14 +65,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_ore_query IS 'EQL text query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_text_ord_ore IS 'EQL text query operand (equality, ordering)'; - --! @brief Query-operand domain public.text_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_text_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'text_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.text_ord_query AS jsonb + CREATE DOMAIN public.query_text_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -86,14 +86,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_query IS 'EQL text query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_text_ord IS 'EQL text query operand (equality, ordering)'; - --! @brief Query-operand domain public.text_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_text_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'text_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.text_ord_ope_query AS jsonb + CREATE DOMAIN public.query_text_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -105,14 +105,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_ord_ope_query IS 'EQL text query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_text_ord_ope IS 'EQL text query operand (equality, ordering)'; - --! @brief Query-operand domain public.text_search_query (term-only; no `c`). + --! @brief Query-operand domain public.query_text_search (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'text_search_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_search' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.text_search_query AS jsonb + CREATE DOMAIN public.query_text_search AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -127,6 +127,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.text_search_query IS 'EQL text query operand (equality, ordering, containment)'; + COMMENT ON DOMAIN public.query_text_search IS 'EQL text query operand (equality, ordering, containment)'; END $$; diff --git a/src/v3/scalars/timestamp/query_timestamp_eq_functions.sql b/src/v3/scalars/timestamp/query_timestamp_eq_functions.sql new file mode 100644 index 000000000..c906eefd3 --- /dev/null +++ b/src/v3/scalars/timestamp/query_timestamp_eq_functions.sql @@ -0,0 +1,47 @@ +-- AUTOMATICALLY GENERATED FILE. +-- REQUIRE: src/v3/schema.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql +-- REQUIRE: src/v3/scalars/timestamp/timestamp_eq_functions.sql + +--! @file encrypted_domain/timestamp/query_timestamp_eq_functions.sql +--! @brief Functions for public.query_timestamp_eq. + +--! @brief Index extractor for public.query_timestamp_eq. +--! @param a public.query_timestamp_eq +--! @return eql_v3_internal.hmac_256 +CREATE FUNCTION eql_v3.eq_term(a public.query_timestamp_eq) +RETURNS eql_v3_internal.hmac_256 +LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; + +--! @brief Operator wrapper for public.query_timestamp_eq. +--! @param a public.timestamp_eq +--! @param b public.query_timestamp_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b public.query_timestamp_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.query_timestamp_eq. +--! @param a public.query_timestamp_eq +--! @param b public.timestamp_eq +--! @return boolean +CREATE FUNCTION eql_v3.eq(a public.query_timestamp_eq, b public.timestamp_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.query_timestamp_eq. +--! @param a public.timestamp_eq +--! @param b public.query_timestamp_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b public.query_timestamp_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @brief Operator wrapper for public.query_timestamp_eq. +--! @param a public.query_timestamp_eq +--! @param b public.timestamp_eq +--! @return boolean +CREATE FUNCTION eql_v3.neq(a public.query_timestamp_eq, b public.timestamp_eq) +RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE +AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_eq_query_operators.sql b/src/v3/scalars/timestamp/query_timestamp_eq_operators.sql similarity index 52% rename from src/v3/scalars/timestamp/timestamp_eq_query_operators.sql rename to src/v3/scalars/timestamp/query_timestamp_eq_operators.sql index 5623510e9..d23f0f0d7 100644 --- a/src/v3/scalars/timestamp/timestamp_eq_query_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_eq_operators.sql @@ -1,31 +1,31 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_eq_query_functions.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_eq_functions.sql ---! @file encrypted_domain/timestamp/timestamp_eq_query_operators.sql ---! @brief Operators for public.timestamp_eq_query. +--! @file encrypted_domain/timestamp/query_timestamp_eq_operators.sql +--! @brief Operators for public.query_timestamp_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq_query, + LEFTARG = public.timestamp_eq, RIGHTARG = public.query_timestamp_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_eq_query, RIGHTARG = public.timestamp_eq, + LEFTARG = public.query_timestamp_eq, RIGHTARG = public.timestamp_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq_query, + LEFTARG = public.timestamp_eq, RIGHTARG = public.query_timestamp_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_eq_query, RIGHTARG = public.timestamp_eq, + LEFTARG = public.query_timestamp_eq, RIGHTARG = public.timestamp_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/timestamp/timestamp_ord_query_functions.sql b/src/v3/scalars/timestamp/query_timestamp_ord_functions.sql similarity index 50% rename from src/v3/scalars/timestamp/timestamp_ord_query_functions.sql rename to src/v3/scalars/timestamp/query_timestamp_ord_functions.sql index 2fcc5a43e..15beab859 100644 --- a/src/v3/scalars/timestamp/timestamp_ord_query_functions.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_functions.sql ---! @file encrypted_domain/timestamp/timestamp_ord_query_functions.sql ---! @brief Functions for public.timestamp_ord_query. +--! @file encrypted_domain/timestamp/query_timestamp_ord_functions.sql +--! @brief Functions for public.query_timestamp_ord. ---! @brief Index extractor for public.timestamp_ord_query. ---! @param a public.timestamp_ord_query +--! @brief Index extractor for public.query_timestamp_ord. +--! @param a public.query_timestamp_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_timestamp_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. +--! @brief Operator wrapper for public.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.timestamp_ord_query +--! @param b public.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord_query) +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b public.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. ---! @param a public.timestamp_ord_query +--! @brief Operator wrapper for public.query_timestamp_ord. +--! @param a public.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_query, b public.timestamp_ord) +CREATE FUNCTION eql_v3.eq(a public.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. +--! @brief Operator wrapper for public.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.timestamp_ord_query +--! @param b public.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord_query) +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b public.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. ---! @param a public.timestamp_ord_query +--! @brief Operator wrapper for public.query_timestamp_ord. +--! @param a public.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_query, b public.timestamp_ord) +CREATE FUNCTION eql_v3.neq(a public.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. +--! @brief Operator wrapper for public.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.timestamp_ord_query +--! @param b public.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord_query) +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b public.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. ---! @param a public.timestamp_ord_query +--! @brief Operator wrapper for public.query_timestamp_ord. +--! @param a public.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_query, b public.timestamp_ord) +CREATE FUNCTION eql_v3.lt(a public.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. +--! @brief Operator wrapper for public.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.timestamp_ord_query +--! @param b public.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord_query) +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b public.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. ---! @param a public.timestamp_ord_query +--! @brief Operator wrapper for public.query_timestamp_ord. +--! @param a public.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_query, b public.timestamp_ord) +CREATE FUNCTION eql_v3.lte(a public.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. +--! @brief Operator wrapper for public.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.timestamp_ord_query +--! @param b public.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord_query) +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b public.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. ---! @param a public.timestamp_ord_query +--! @brief Operator wrapper for public.query_timestamp_ord. +--! @param a public.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_query, b public.timestamp_ord) +CREATE FUNCTION eql_v3.gt(a public.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. +--! @brief Operator wrapper for public.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.timestamp_ord_query +--! @param b public.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord_query) +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b public.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_query. ---! @param a public.timestamp_ord_query +--! @brief Operator wrapper for public.query_timestamp_ord. +--! @param a public.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_query, b public.timestamp_ord) +CREATE FUNCTION eql_v3.gte(a public.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql similarity index 54% rename from src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql rename to src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql index d66933c6d..b8bc6d98d 100644 --- a/src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql ---! @file encrypted_domain/timestamp/timestamp_ord_ope_query_functions.sql ---! @brief Functions for public.timestamp_ord_ope_query. +--! @file encrypted_domain/timestamp/query_timestamp_ord_ope_functions.sql +--! @brief Functions for public.query_timestamp_ord_ope. ---! @brief Index extractor for public.timestamp_ord_ope_query. ---! @param a public.timestamp_ord_ope_query +--! @brief Index extractor for public.query_timestamp_ord_ope. +--! @param a public.query_timestamp_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.timestamp_ord_ope_query) +CREATE FUNCTION eql_v3.ord_ope_term(a public.query_timestamp_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.timestamp_ord_ope_query +--! @param b public.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. ---! @param a public.timestamp_ord_ope_query +--! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @param a public.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.timestamp_ord_ope_query +--! @param b public.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. ---! @param a public.timestamp_ord_ope_query +--! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @param a public.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.timestamp_ord_ope_query +--! @param b public.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. ---! @param a public.timestamp_ord_ope_query +--! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @param a public.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.timestamp_ord_ope_query +--! @param b public.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. ---! @param a public.timestamp_ord_ope_query +--! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @param a public.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.timestamp_ord_ope_query +--! @param b public.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. ---! @param a public.timestamp_ord_ope_query +--! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @param a public.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.timestamp_ord_ope_query +--! @param b public.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ope_query. ---! @param a public.timestamp_ord_ope_query +--! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @param a public.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_ord_ope_query_operators.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ope_operators.sql similarity index 60% rename from src/v3/scalars/timestamp/timestamp_ord_ope_query_operators.sql rename to src/v3/scalars/timestamp/query_timestamp_ord_ope_operators.sql index b84577166..b00192888 100644 --- a/src/v3/scalars/timestamp/timestamp_ord_ope_query_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ope_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ope_query_functions.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql ---! @file encrypted_domain/timestamp/timestamp_ord_ope_query_operators.sql ---! @brief Operators for public.timestamp_ord_ope_query. +--! @file encrypted_domain/timestamp/query_timestamp_ord_ope_operators.sql +--! @brief Operators for public.query_timestamp_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope_query, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord_ope_query, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/timestamp/timestamp_ord_query_operators.sql b/src/v3/scalars/timestamp/query_timestamp_ord_operators.sql similarity index 60% rename from src/v3/scalars/timestamp/timestamp_ord_query_operators.sql rename to src/v3/scalars/timestamp/query_timestamp_ord_operators.sql index 0e12faaa0..951c98e47 100644 --- a/src/v3/scalars/timestamp/timestamp_ord_query_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_query_functions.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_ord_functions.sql ---! @file encrypted_domain/timestamp/timestamp_ord_query_operators.sql ---! @brief Operators for public.timestamp_ord_query. +--! @file encrypted_domain/timestamp/query_timestamp_ord_operators.sql +--! @brief Operators for public.query_timestamp_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord_query, + LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord_query, RIGHTARG = public.timestamp_ord, + LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql similarity index 53% rename from src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql rename to src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql index d43610831..e16c78cfb 100644 --- a/src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql @@ -1,111 +1,111 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql ---! @file encrypted_domain/timestamp/timestamp_ord_ore_query_functions.sql ---! @brief Functions for public.timestamp_ord_ore_query. +--! @file encrypted_domain/timestamp/query_timestamp_ord_ore_functions.sql +--! @brief Functions for public.query_timestamp_ord_ore. ---! @brief Index extractor for public.timestamp_ord_ore_query. ---! @param a public.timestamp_ord_ore_query +--! @brief Index extractor for public.query_timestamp_ord_ore. +--! @param a public.query_timestamp_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord_ore_query) +CREATE FUNCTION eql_v3.ord_term(a public.query_timestamp_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.timestamp_ord_ore_query +--! @param b public.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. ---! @param a public.timestamp_ord_ore_query +--! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @param a public.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.timestamp_ord_ore_query +--! @param b public.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. ---! @param a public.timestamp_ord_ore_query +--! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @param a public.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.timestamp_ord_ore_query +--! @param b public.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. ---! @param a public.timestamp_ord_ore_query +--! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @param a public.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.timestamp_ord_ore_query +--! @param b public.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. ---! @param a public.timestamp_ord_ore_query +--! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @param a public.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.timestamp_ord_ore_query +--! @param b public.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. ---! @param a public.timestamp_ord_ore_query +--! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @param a public.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. +--! @brief Operator wrapper for public.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.timestamp_ord_ore_query +--! @param b public.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.timestamp_ord_ore_query. ---! @param a public.timestamp_ord_ore_query +--! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @param a public.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/timestamp/timestamp_ord_ore_query_operators.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ore_operators.sql similarity index 60% rename from src/v3/scalars/timestamp/timestamp_ord_ore_query_operators.sql rename to src/v3/scalars/timestamp/query_timestamp_ord_ore_operators.sql index 3596318ef..51bac6fce 100644 --- a/src/v3/scalars/timestamp/timestamp_ord_ore_query_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ore_operators.sql @@ -1,79 +1,79 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ore_query_functions.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql +-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql ---! @file encrypted_domain/timestamp/timestamp_ord_ore_query_operators.sql ---! @brief Operators for public.timestamp_ord_ore_query. +--! @file encrypted_domain/timestamp/query_timestamp_ord_ore_operators.sql +--! @brief Operators for public.query_timestamp_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore_query, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord_ore_query, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/timestamp/timestamp_query_types.sql b/src/v3/scalars/timestamp/query_timestamp_types.sql similarity index 59% rename from src/v3/scalars/timestamp/timestamp_query_types.sql rename to src/v3/scalars/timestamp/query_timestamp_types.sql index 0ed26a7eb..fb40a1381 100644 --- a/src/v3/scalars/timestamp/timestamp_query_types.sql +++ b/src/v3/scalars/timestamp/query_timestamp_types.sql @@ -1,21 +1,21 @@ -- AUTOMATICALLY GENERATED FILE. -- REQUIRE: src/v3/schema.sql ---! @file v3/scalars/timestamp/timestamp_query_types.sql +--! @file v3/scalars/timestamp/query_timestamp_types.sql --! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). ---! @note Cast a query operand explicitly to its `_query` domain in a predicate ---! (e.g. `WHERE col = $1::public.timestamp_eq_query`). A bare, ---! uncast literal RHS is ambiguous between the `_query` and `jsonb` +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::public.query_timestamp_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.timestamp_eq_query (term-only; no `c`). + --! @brief Query-operand domain public.query_timestamp_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'timestamp_eq_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_eq' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.timestamp_eq_query AS jsonb + CREATE DOMAIN public.query_timestamp_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +26,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_eq_query IS 'EQL timestamp query operand (equality)'; + COMMENT ON DOMAIN public.query_timestamp_eq IS 'EQL timestamp query operand (equality)'; - --! @brief Query-operand domain public.timestamp_ord_ore_query (term-only; no `c`). + --! @brief Query-operand domain public.query_timestamp_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord_ore_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.timestamp_ord_ore_query AS jsonb + CREATE DOMAIN public.query_timestamp_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +46,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_ore_query IS 'EQL timestamp query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)'; - --! @brief Query-operand domain public.timestamp_ord_query (term-only; no `c`). + --! @brief Query-operand domain public.query_timestamp_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_ord' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.timestamp_ord_query AS jsonb + CREATE DOMAIN public.query_timestamp_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +66,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_query IS 'EQL timestamp query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)'; - --! @brief Query-operand domain public.timestamp_ord_ope_query (term-only; no `c`). + --! @brief Query-operand domain public.query_timestamp_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord_ope_query' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'public'::regnamespace ) THEN - CREATE DOMAIN public.timestamp_ord_ope_query AS jsonb + CREATE DOMAIN public.query_timestamp_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +84,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.timestamp_ord_ope_query IS 'EQL timestamp query operand (equality, ordering)'; + COMMENT ON DOMAIN public.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/timestamp/timestamp_eq_query_functions.sql b/src/v3/scalars/timestamp/timestamp_eq_query_functions.sql deleted file mode 100644 index 1c0c2af22..000000000 --- a/src/v3/scalars/timestamp/timestamp_eq_query_functions.sql +++ /dev/null @@ -1,47 +0,0 @@ --- AUTOMATICALLY GENERATED FILE. --- REQUIRE: src/v3/schema.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_query_types.sql --- REQUIRE: src/v3/scalars/timestamp/timestamp_eq_functions.sql - ---! @file encrypted_domain/timestamp/timestamp_eq_query_functions.sql ---! @brief Functions for public.timestamp_eq_query. - ---! @brief Index extractor for public.timestamp_eq_query. ---! @param a public.timestamp_eq_query ---! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.timestamp_eq_query) -RETURNS eql_v3_internal.hmac_256 -LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; - ---! @brief Operator wrapper for public.timestamp_eq_query. ---! @param a public.timestamp_eq ---! @param b public.timestamp_eq_query ---! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq_query) -RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; - ---! @brief Operator wrapper for public.timestamp_eq_query. ---! @param a public.timestamp_eq_query ---! @param b public.timestamp_eq ---! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_eq_query, b public.timestamp_eq) -RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; - ---! @brief Operator wrapper for public.timestamp_eq_query. ---! @param a public.timestamp_eq ---! @param b public.timestamp_eq_query ---! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq_query) -RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; - ---! @brief Operator wrapper for public.timestamp_eq_query. ---! @param a public.timestamp_eq_query ---! @param b public.timestamp_eq ---! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_eq_query, b public.timestamp_eq) -RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py index 52930da2a..6cd925819 100755 --- a/tasks/docs/generate/test_xml_to_json.py +++ b/tasks/docs/generate/test_xml_to_json.py @@ -41,7 +41,7 @@ {"key": "hm", "extractor": "eq_term", "ctor": "hmac_256"}, {"key": "oc", "extractor": "ore_cllw", "ctor": "ore_cllw"} ] }, - { "full_name": "jsonb_query", "name": "query", "terms": [] } + { "full_name": "query_jsonb", "name": "query", "terms": [] } ] }""" @@ -124,9 +124,9 @@ def test_load_domains(): assert by_name["public.text_search"]["capabilities"] == ["equality", "order", "match"] # SteVec (jsonb) domains come from the `stevec` section. Term extractors are # hardcoded on `jsonb_entry` (the sv element type) ONLY — hm -> eq_term, - # oc -> ore_cllw; the `json` container and `jsonb_query` carry none. + # oc -> ore_cllw; the `json` container and `query_jsonb` carry none. assert by_name["public.json"]["termFunctions"] == [] - assert by_name["public.jsonb_query"]["termFunctions"] == [] + assert by_name["public.query_jsonb"]["termFunctions"] == [] assert by_name["public.jsonb_entry"]["capabilities"] == ["json"] assert by_name["public.jsonb_entry"]["shape"] == "stevec" assert by_name["public.jsonb_entry"]["termFunctions"] == ["eql_v3.eq_term", "eql_v3.ore_cllw"] diff --git a/tasks/test/clean_install_v3.sh b/tasks/test/clean_install_v3.sh index 497f813f7..55d7637c4 100755 --- a/tasks/test/clean_install_v3.sh +++ b/tasks/test/clean_install_v3.sh @@ -77,9 +77,9 @@ INSERT INTO v3_json_smoke VALUES SELECT (e -> 'sel'::text)::jsonb ->> 'hm' FROM v3_json_smoke WHERE id = 1; SELECT e ->> 'sel'::text FROM v3_json_smoke WHERE id = 1; SELECT count(*) FROM v3_json_smoke -WHERE e @> '{"sv":[{"s":"sel","hm":"00"}]}'::public.jsonb_query; +WHERE e @> '{"sv":[{"s":"sel","hm":"00"}]}'::public.query_jsonb; SELECT count(*) FROM v3_json_smoke -WHERE '{"sv":[{"s":"sel","hm":"00"}]}'::public.jsonb_query <@ e; +WHERE '{"sv":[{"s":"sel","hm":"00"}]}'::public.query_jsonb <@ e; -- Documented GIN expression installs cleanly in a v3-only database. CREATE INDEX v3_json_smoke_gin diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index f14461980..a9d51b167 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -94,7 +94,7 @@ function_search_path_mutable eql_v3_internal ore_cllw_gte function Inner compara function_search_path_mutable eql_v3 ord_ope_term function CLLW-OPE order term extractor for the public *_ord_ope domains: returns eql_v3_internal.ope_cllw, a domain over bytea that inherits the native bytea comparison operators and DEFAULT btree opclass. Used inside the inlinable comparison wrappers and as the functional-index expression USING btree (eql_v3.ord_ope_term(col)); must inline so the whole chain folds to native bytea comparisons the index can match. One overload per *_ord_ope domain. function_search_path_mutable eql_v3_internal ope_cllw function CLLW-OPE extractor for the eql_v3 SEM fork (now in eql_v3_internal): inlinable SQL (jsonb) constructor used inside eql_v3.ord_ope_term, hex-decoding `op` to the bytea-backed eql_v3_internal.ope_cllw domain. The domain inherits bytea's native comparison operators and btree opclass, so the WHOLE comparison chain (wrapper -> ord_ope_term -> this) is inlinable SQL and the functional btree index on eql_v3.ord_ope_term(col) engages structurally — the hmac_256 pattern. Carries the `eql-inline-critical` COMMENT marker (bare jsonb arg escapes the structural domain-arg skip). # Encrypted-JSONB document surface (src/v3/jsonb): the hand-written public.json / -# jsonb_entry / jsonb_query domains and their selector/extractor/operator +# jsonb_entry / query_jsonb domains and their selector/extractor/operator # functions. Inlinable for functional-index matching; left unpinned by # tasks/pin_search_path_v3.sql via either # the structural jsonb-domain-arg skip or the documented `eql-inline-critical` @@ -109,7 +109,7 @@ function_search_path_mutable eql_v3 has_ore_cllw function ORE-CLLW presence chec function_search_path_mutable eql_v3_internal ore_cllw function ORE-CLLW constructor for the eql_v3 SEM fork (now in eql_v3_internal): inlinable SQL (jsonb) constructor. Takes bare jsonb, not a jsonb-backed domain, so it is left unpinned via the explicit inline-critical OID clause in pin_search_path_v3.sql (mirrors eql_v3_internal.hmac_256/bloom_filter) rather than the structural skip. Distinct from the eql_v3.ore_cllw(jsonb_entry) extractor overload, which stays public. function_search_path_mutable eql_v3_internal has_ore_cllw function ORE-CLLW presence check for the eql_v3 SEM fork (now in eql_v3_internal): inlinable SQL (jsonb) counterpart to eql_v3_internal.ore_cllw. Same inline-critical OID rationale. Distinct from the eql_v3.has_ore_cllw(jsonb_entry) overload, which stays public. function_search_path_mutable eql_v3 selector function STE-vec entry selector extractor: typed (public.jsonb_entry) overload, inlinable so `eql_v3.selector(col -> 'sel')` folds into the calling query. Structural domain-arg skip. The (jsonb) overload is plpgsql with a pinned search_path and does not surface. -function_search_path_mutable eql_v3 to_ste_vec_query function Encrypted-JSONB query-document constructor (CAST WITH FUNCTION for public.jsonb_query): inlinable SQL over a public.json domain arg, structural domain-arg skip. Builds the ste_vec query value the @>/<@ wrappers compare against; must inline to fold into the calling query. +function_search_path_mutable eql_v3 to_ste_vec_query function Encrypted-JSONB query-document constructor (CAST WITH FUNCTION for public.query_jsonb): inlinable SQL over a public.json domain arg, structural domain-arg skip. Builds the ste_vec query value the @>/<@ wrappers compare against; must inline to fold into the calling query. function_search_path_mutable eql_v3 jsonb_array function ste_vec deterministic-field array extractor on the eql_v3 encrypted-JSONB surface: public inlinable SQL (raw jsonb arg) behind the documented functional GIN index expression eql_v3.jsonb_array(col). Takes bare jsonb, so it carries the documented `eql-inline-critical` COMMENT marker that pin_search_path_v3.sql honours rather than the structural skip. function_search_path_mutable eql_v3 jsonb_contains function Public GIN-inlining containment helper (function-form of @> over raw jsonb): unfolds to eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b). Carries the `eql-inline-critical` COMMENT marker. function_search_path_mutable eql_v3 jsonb_contained_by function Public GIN-inlining reverse-containment helper (function-form of <@ over raw jsonb): same as eql_v3.jsonb_contains. diff --git a/tests/sqlx/snapshots/eql_v3_public_surface.txt b/tests/sqlx/snapshots/eql_v3_public_surface.txt index 0fb88f423..7c2f9c64a 100644 --- a/tests/sqlx/snapshots/eql_v3_public_surface.txt +++ b/tests/sqlx/snapshots/eql_v3_public_surface.txt @@ -56,38 +56,38 @@ aggregate eql_v3.min(public.text_search) aggregate eql_v3.min(public.timestamp_ord) aggregate eql_v3.min(public.timestamp_ord_ope) aggregate eql_v3.min(public.timestamp_ord_ore) -cast public."json" -> public.jsonb_query +cast public."json" -> public.query_jsonb function eql_v3.->(e public."json", selector integer) function eql_v3.->(e public."json", selector text) function eql_v3.->>(e public."json", selector integer) function eql_v3.->>(e public."json", selector text) function eql_v3.<@(a public."json", b public."json") function eql_v3.<@(a public.jsonb_entry, b public."json") -function eql_v3.<@(a public.jsonb_query, b public."json") +function eql_v3.<@(a public.query_jsonb, b public."json") function eql_v3.@>(a public."json", b public."json") function eql_v3.@>(a public."json", b public.jsonb_entry) -function eql_v3.@>(a public."json", b public.jsonb_query) +function eql_v3.@>(a public."json", b public.query_jsonb) function eql_v3.ciphertext(val jsonb) function eql_v3.contained_by(a jsonb, b public.text_match) function eql_v3.contained_by(a jsonb, b public.text_search) +function eql_v3.contained_by(a public.query_text_match, b public.text_match) +function eql_v3.contained_by(a public.query_text_search, b public.text_search) function eql_v3.contained_by(a public.text_match, b jsonb) +function eql_v3.contained_by(a public.text_match, b public.query_text_match) function eql_v3.contained_by(a public.text_match, b public.text_match) -function eql_v3.contained_by(a public.text_match, b public.text_match_query) -function eql_v3.contained_by(a public.text_match_query, b public.text_match) function eql_v3.contained_by(a public.text_search, b jsonb) +function eql_v3.contained_by(a public.text_search, b public.query_text_search) function eql_v3.contained_by(a public.text_search, b public.text_search) -function eql_v3.contained_by(a public.text_search, b public.text_search_query) -function eql_v3.contained_by(a public.text_search_query, b public.text_search) function eql_v3.contains(a jsonb, b public.text_match) function eql_v3.contains(a jsonb, b public.text_search) +function eql_v3.contains(a public.query_text_match, b public.text_match) +function eql_v3.contains(a public.query_text_search, b public.text_search) function eql_v3.contains(a public.text_match, b jsonb) +function eql_v3.contains(a public.text_match, b public.query_text_match) function eql_v3.contains(a public.text_match, b public.text_match) -function eql_v3.contains(a public.text_match, b public.text_match_query) -function eql_v3.contains(a public.text_match_query, b public.text_match) function eql_v3.contains(a public.text_search, b jsonb) +function eql_v3.contains(a public.text_search, b public.query_text_search) function eql_v3.contains(a public.text_search, b public.text_search) -function eql_v3.contains(a public.text_search, b public.text_search_query) -function eql_v3.contains(a public.text_search_query, b public.text_search) function eql_v3.eq(a jsonb, b public.bigint_eq) function eql_v3.eq(a jsonb, b public.bigint_ord) function eql_v3.eq(a jsonb, b public.bigint_ord_ope) @@ -127,179 +127,179 @@ function eql_v3.eq(a jsonb, b public.timestamp_ord_ope) function eql_v3.eq(a jsonb, b public.timestamp_ord_ore) function eql_v3.eq(a public.bigint_eq, b jsonb) function eql_v3.eq(a public.bigint_eq, b public.bigint_eq) -function eql_v3.eq(a public.bigint_eq, b public.bigint_eq_query) -function eql_v3.eq(a public.bigint_eq_query, b public.bigint_eq) +function eql_v3.eq(a public.bigint_eq, b public.query_bigint_eq) function eql_v3.eq(a public.bigint_ord, b jsonb) function eql_v3.eq(a public.bigint_ord, b public.bigint_ord) -function eql_v3.eq(a public.bigint_ord, b public.bigint_ord_query) +function eql_v3.eq(a public.bigint_ord, b public.query_bigint_ord) function eql_v3.eq(a public.bigint_ord_ope, b jsonb) function eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) -function eql_v3.eq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +function eql_v3.eq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) function eql_v3.eq(a public.bigint_ord_ore, b jsonb) function eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) -function eql_v3.eq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) -function eql_v3.eq(a public.bigint_ord_query, b public.bigint_ord) +function eql_v3.eq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) function eql_v3.eq(a public.date_eq, b jsonb) function eql_v3.eq(a public.date_eq, b public.date_eq) -function eql_v3.eq(a public.date_eq, b public.date_eq_query) -function eql_v3.eq(a public.date_eq_query, b public.date_eq) +function eql_v3.eq(a public.date_eq, b public.query_date_eq) function eql_v3.eq(a public.date_ord, b jsonb) function eql_v3.eq(a public.date_ord, b public.date_ord) -function eql_v3.eq(a public.date_ord, b public.date_ord_query) +function eql_v3.eq(a public.date_ord, b public.query_date_ord) function eql_v3.eq(a public.date_ord_ope, b jsonb) function eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope_query) -function eql_v3.eq(a public.date_ord_ope_query, b public.date_ord_ope) +function eql_v3.eq(a public.date_ord_ope, b public.query_date_ord_ope) function eql_v3.eq(a public.date_ord_ore, b jsonb) function eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore_query) -function eql_v3.eq(a public.date_ord_ore_query, b public.date_ord_ore) -function eql_v3.eq(a public.date_ord_query, b public.date_ord) +function eql_v3.eq(a public.date_ord_ore, b public.query_date_ord_ore) function eql_v3.eq(a public.double_eq, b jsonb) function eql_v3.eq(a public.double_eq, b public.double_eq) -function eql_v3.eq(a public.double_eq, b public.double_eq_query) -function eql_v3.eq(a public.double_eq_query, b public.double_eq) +function eql_v3.eq(a public.double_eq, b public.query_double_eq) function eql_v3.eq(a public.double_ord, b jsonb) function eql_v3.eq(a public.double_ord, b public.double_ord) -function eql_v3.eq(a public.double_ord, b public.double_ord_query) +function eql_v3.eq(a public.double_ord, b public.query_double_ord) function eql_v3.eq(a public.double_ord_ope, b jsonb) function eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope_query) -function eql_v3.eq(a public.double_ord_ope_query, b public.double_ord_ope) +function eql_v3.eq(a public.double_ord_ope, b public.query_double_ord_ope) function eql_v3.eq(a public.double_ord_ore, b jsonb) function eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore_query) -function eql_v3.eq(a public.double_ord_ore_query, b public.double_ord_ore) -function eql_v3.eq(a public.double_ord_query, b public.double_ord) +function eql_v3.eq(a public.double_ord_ore, b public.query_double_ord_ore) function eql_v3.eq(a public.integer_eq, b jsonb) function eql_v3.eq(a public.integer_eq, b public.integer_eq) -function eql_v3.eq(a public.integer_eq, b public.integer_eq_query) -function eql_v3.eq(a public.integer_eq_query, b public.integer_eq) +function eql_v3.eq(a public.integer_eq, b public.query_integer_eq) function eql_v3.eq(a public.integer_ord, b jsonb) function eql_v3.eq(a public.integer_ord, b public.integer_ord) -function eql_v3.eq(a public.integer_ord, b public.integer_ord_query) +function eql_v3.eq(a public.integer_ord, b public.query_integer_ord) function eql_v3.eq(a public.integer_ord_ope, b jsonb) function eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope_query) -function eql_v3.eq(a public.integer_ord_ope_query, b public.integer_ord_ope) +function eql_v3.eq(a public.integer_ord_ope, b public.query_integer_ord_ope) function eql_v3.eq(a public.integer_ord_ore, b jsonb) function eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore_query) -function eql_v3.eq(a public.integer_ord_ore_query, b public.integer_ord_ore) -function eql_v3.eq(a public.integer_ord_query, b public.integer_ord) +function eql_v3.eq(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.eq(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.eq(a public.numeric_eq, b jsonb) function eql_v3.eq(a public.numeric_eq, b public.numeric_eq) -function eql_v3.eq(a public.numeric_eq, b public.numeric_eq_query) -function eql_v3.eq(a public.numeric_eq_query, b public.numeric_eq) +function eql_v3.eq(a public.numeric_eq, b public.query_numeric_eq) function eql_v3.eq(a public.numeric_ord, b jsonb) function eql_v3.eq(a public.numeric_ord, b public.numeric_ord) -function eql_v3.eq(a public.numeric_ord, b public.numeric_ord_query) +function eql_v3.eq(a public.numeric_ord, b public.query_numeric_ord) function eql_v3.eq(a public.numeric_ord_ope, b jsonb) function eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) -function eql_v3.eq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +function eql_v3.eq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) function eql_v3.eq(a public.numeric_ord_ore, b jsonb) function eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) -function eql_v3.eq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) -function eql_v3.eq(a public.numeric_ord_query, b public.numeric_ord) +function eql_v3.eq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +function eql_v3.eq(a public.query_bigint_eq, b public.bigint_eq) +function eql_v3.eq(a public.query_bigint_ord, b public.bigint_ord) +function eql_v3.eq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.eq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.eq(a public.query_date_eq, b public.date_eq) +function eql_v3.eq(a public.query_date_ord, b public.date_ord) +function eql_v3.eq(a public.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.eq(a public.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.eq(a public.query_double_eq, b public.double_eq) +function eql_v3.eq(a public.query_double_ord, b public.double_ord) +function eql_v3.eq(a public.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.eq(a public.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.eq(a public.query_integer_eq, b public.integer_eq) +function eql_v3.eq(a public.query_integer_ord, b public.integer_ord) +function eql_v3.eq(a public.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.eq(a public.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.eq(a public.query_numeric_eq, b public.numeric_eq) +function eql_v3.eq(a public.query_numeric_ord, b public.numeric_ord) +function eql_v3.eq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.eq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.eq(a public.query_real_eq, b public.real_eq) +function eql_v3.eq(a public.query_real_ord, b public.real_ord) +function eql_v3.eq(a public.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.eq(a public.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.eq(a public.query_smallint_eq, b public.smallint_eq) +function eql_v3.eq(a public.query_smallint_ord, b public.smallint_ord) +function eql_v3.eq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.eq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.eq(a public.query_text_eq, b public.text_eq) +function eql_v3.eq(a public.query_text_ord, b public.text_ord) +function eql_v3.eq(a public.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.eq(a public.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.eq(a public.query_text_search, b public.text_search) +function eql_v3.eq(a public.query_timestamp_eq, b public.timestamp_eq) +function eql_v3.eq(a public.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.eq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.eq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.eq(a public.real_eq, b jsonb) +function eql_v3.eq(a public.real_eq, b public.query_real_eq) function eql_v3.eq(a public.real_eq, b public.real_eq) -function eql_v3.eq(a public.real_eq, b public.real_eq_query) -function eql_v3.eq(a public.real_eq_query, b public.real_eq) function eql_v3.eq(a public.real_ord, b jsonb) +function eql_v3.eq(a public.real_ord, b public.query_real_ord) function eql_v3.eq(a public.real_ord, b public.real_ord) -function eql_v3.eq(a public.real_ord, b public.real_ord_query) function eql_v3.eq(a public.real_ord_ope, b jsonb) +function eql_v3.eq(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope) -function eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope_query) -function eql_v3.eq(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.eq(a public.real_ord_ore, b jsonb) +function eql_v3.eq(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore) -function eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore_query) -function eql_v3.eq(a public.real_ord_ore_query, b public.real_ord_ore) -function eql_v3.eq(a public.real_ord_query, b public.real_ord) function eql_v3.eq(a public.smallint_eq, b jsonb) +function eql_v3.eq(a public.smallint_eq, b public.query_smallint_eq) function eql_v3.eq(a public.smallint_eq, b public.smallint_eq) -function eql_v3.eq(a public.smallint_eq, b public.smallint_eq_query) -function eql_v3.eq(a public.smallint_eq_query, b public.smallint_eq) function eql_v3.eq(a public.smallint_ord, b jsonb) +function eql_v3.eq(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.eq(a public.smallint_ord, b public.smallint_ord) -function eql_v3.eq(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.eq(a public.smallint_ord_ope, b jsonb) +function eql_v3.eq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) -function eql_v3.eq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.eq(a public.smallint_ord_ore, b jsonb) +function eql_v3.eq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) -function eql_v3.eq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) -function eql_v3.eq(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.eq(a public.text_eq, b jsonb) +function eql_v3.eq(a public.text_eq, b public.query_text_eq) function eql_v3.eq(a public.text_eq, b public.text_eq) -function eql_v3.eq(a public.text_eq, b public.text_eq_query) -function eql_v3.eq(a public.text_eq_query, b public.text_eq) function eql_v3.eq(a public.text_ord, b jsonb) +function eql_v3.eq(a public.text_ord, b public.query_text_ord) function eql_v3.eq(a public.text_ord, b public.text_ord) -function eql_v3.eq(a public.text_ord, b public.text_ord_query) function eql_v3.eq(a public.text_ord_ope, b jsonb) +function eql_v3.eq(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope) -function eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope_query) -function eql_v3.eq(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.eq(a public.text_ord_ore, b jsonb) +function eql_v3.eq(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore) -function eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore_query) -function eql_v3.eq(a public.text_ord_ore_query, b public.text_ord_ore) -function eql_v3.eq(a public.text_ord_query, b public.text_ord) function eql_v3.eq(a public.text_search, b jsonb) +function eql_v3.eq(a public.text_search, b public.query_text_search) function eql_v3.eq(a public.text_search, b public.text_search) -function eql_v3.eq(a public.text_search, b public.text_search_query) -function eql_v3.eq(a public.text_search_query, b public.text_search) function eql_v3.eq(a public.timestamp_eq, b jsonb) +function eql_v3.eq(a public.timestamp_eq, b public.query_timestamp_eq) function eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq) -function eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq_query) -function eql_v3.eq(a public.timestamp_eq_query, b public.timestamp_eq) function eql_v3.eq(a public.timestamp_ord, b jsonb) +function eql_v3.eq(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord) -function eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.eq(a public.timestamp_ord_ope, b jsonb) +function eql_v3.eq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) -function eql_v3.eq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.eq(a public.timestamp_ord_ore, b jsonb) +function eql_v3.eq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore) -function eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) -function eql_v3.eq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) -function eql_v3.eq(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.eq_term(a public.bigint_eq) -function eql_v3.eq_term(a public.bigint_eq_query) function eql_v3.eq_term(a public.date_eq) -function eql_v3.eq_term(a public.date_eq_query) function eql_v3.eq_term(a public.double_eq) -function eql_v3.eq_term(a public.double_eq_query) function eql_v3.eq_term(a public.integer_eq) -function eql_v3.eq_term(a public.integer_eq_query) function eql_v3.eq_term(a public.numeric_eq) -function eql_v3.eq_term(a public.numeric_eq_query) +function eql_v3.eq_term(a public.query_bigint_eq) +function eql_v3.eq_term(a public.query_date_eq) +function eql_v3.eq_term(a public.query_double_eq) +function eql_v3.eq_term(a public.query_integer_eq) +function eql_v3.eq_term(a public.query_numeric_eq) +function eql_v3.eq_term(a public.query_real_eq) +function eql_v3.eq_term(a public.query_smallint_eq) +function eql_v3.eq_term(a public.query_text_eq) +function eql_v3.eq_term(a public.query_text_ord) +function eql_v3.eq_term(a public.query_text_ord_ope) +function eql_v3.eq_term(a public.query_text_ord_ore) +function eql_v3.eq_term(a public.query_text_search) +function eql_v3.eq_term(a public.query_timestamp_eq) function eql_v3.eq_term(a public.real_eq) -function eql_v3.eq_term(a public.real_eq_query) function eql_v3.eq_term(a public.smallint_eq) -function eql_v3.eq_term(a public.smallint_eq_query) function eql_v3.eq_term(a public.text_eq) -function eql_v3.eq_term(a public.text_eq_query) function eql_v3.eq_term(a public.text_ord) function eql_v3.eq_term(a public.text_ord_ope) -function eql_v3.eq_term(a public.text_ord_ope_query) function eql_v3.eq_term(a public.text_ord_ore) -function eql_v3.eq_term(a public.text_ord_ore_query) -function eql_v3.eq_term(a public.text_ord_query) function eql_v3.eq_term(a public.text_search) -function eql_v3.eq_term(a public.text_search_query) function eql_v3.eq_term(a public.timestamp_eq) -function eql_v3.eq_term(a public.timestamp_eq_query) function eql_v3.eq_term(entry public.jsonb_entry) function eql_v3.gt(a jsonb, b public.bigint_ord) function eql_v3.gt(a jsonb, b public.bigint_ord_ope) @@ -331,117 +331,117 @@ function eql_v3.gt(a jsonb, b public.timestamp_ord_ope) function eql_v3.gt(a jsonb, b public.timestamp_ord_ore) function eql_v3.gt(a public.bigint_ord, b jsonb) function eql_v3.gt(a public.bigint_ord, b public.bigint_ord) -function eql_v3.gt(a public.bigint_ord, b public.bigint_ord_query) +function eql_v3.gt(a public.bigint_ord, b public.query_bigint_ord) function eql_v3.gt(a public.bigint_ord_ope, b jsonb) function eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) -function eql_v3.gt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +function eql_v3.gt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) function eql_v3.gt(a public.bigint_ord_ore, b jsonb) function eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) -function eql_v3.gt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) -function eql_v3.gt(a public.bigint_ord_query, b public.bigint_ord) +function eql_v3.gt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) function eql_v3.gt(a public.date_ord, b jsonb) function eql_v3.gt(a public.date_ord, b public.date_ord) -function eql_v3.gt(a public.date_ord, b public.date_ord_query) +function eql_v3.gt(a public.date_ord, b public.query_date_ord) function eql_v3.gt(a public.date_ord_ope, b jsonb) function eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope_query) -function eql_v3.gt(a public.date_ord_ope_query, b public.date_ord_ope) +function eql_v3.gt(a public.date_ord_ope, b public.query_date_ord_ope) function eql_v3.gt(a public.date_ord_ore, b jsonb) function eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore_query) -function eql_v3.gt(a public.date_ord_ore_query, b public.date_ord_ore) -function eql_v3.gt(a public.date_ord_query, b public.date_ord) +function eql_v3.gt(a public.date_ord_ore, b public.query_date_ord_ore) function eql_v3.gt(a public.double_ord, b jsonb) function eql_v3.gt(a public.double_ord, b public.double_ord) -function eql_v3.gt(a public.double_ord, b public.double_ord_query) +function eql_v3.gt(a public.double_ord, b public.query_double_ord) function eql_v3.gt(a public.double_ord_ope, b jsonb) function eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope_query) -function eql_v3.gt(a public.double_ord_ope_query, b public.double_ord_ope) +function eql_v3.gt(a public.double_ord_ope, b public.query_double_ord_ope) function eql_v3.gt(a public.double_ord_ore, b jsonb) function eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore_query) -function eql_v3.gt(a public.double_ord_ore_query, b public.double_ord_ore) -function eql_v3.gt(a public.double_ord_query, b public.double_ord) +function eql_v3.gt(a public.double_ord_ore, b public.query_double_ord_ore) function eql_v3.gt(a public.integer_ord, b jsonb) function eql_v3.gt(a public.integer_ord, b public.integer_ord) -function eql_v3.gt(a public.integer_ord, b public.integer_ord_query) +function eql_v3.gt(a public.integer_ord, b public.query_integer_ord) function eql_v3.gt(a public.integer_ord_ope, b jsonb) function eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope_query) -function eql_v3.gt(a public.integer_ord_ope_query, b public.integer_ord_ope) +function eql_v3.gt(a public.integer_ord_ope, b public.query_integer_ord_ope) function eql_v3.gt(a public.integer_ord_ore, b jsonb) function eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore_query) -function eql_v3.gt(a public.integer_ord_ore_query, b public.integer_ord_ore) -function eql_v3.gt(a public.integer_ord_query, b public.integer_ord) +function eql_v3.gt(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.gt(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.gt(a public.numeric_ord, b jsonb) function eql_v3.gt(a public.numeric_ord, b public.numeric_ord) -function eql_v3.gt(a public.numeric_ord, b public.numeric_ord_query) +function eql_v3.gt(a public.numeric_ord, b public.query_numeric_ord) function eql_v3.gt(a public.numeric_ord_ope, b jsonb) function eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) -function eql_v3.gt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +function eql_v3.gt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) function eql_v3.gt(a public.numeric_ord_ore, b jsonb) function eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) -function eql_v3.gt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) -function eql_v3.gt(a public.numeric_ord_query, b public.numeric_ord) +function eql_v3.gt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +function eql_v3.gt(a public.query_bigint_ord, b public.bigint_ord) +function eql_v3.gt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.gt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.gt(a public.query_date_ord, b public.date_ord) +function eql_v3.gt(a public.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.gt(a public.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.gt(a public.query_double_ord, b public.double_ord) +function eql_v3.gt(a public.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.gt(a public.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.gt(a public.query_integer_ord, b public.integer_ord) +function eql_v3.gt(a public.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.gt(a public.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.gt(a public.query_numeric_ord, b public.numeric_ord) +function eql_v3.gt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.gt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.gt(a public.query_real_ord, b public.real_ord) +function eql_v3.gt(a public.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.gt(a public.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.gt(a public.query_smallint_ord, b public.smallint_ord) +function eql_v3.gt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gt(a public.query_text_ord, b public.text_ord) +function eql_v3.gt(a public.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.gt(a public.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.gt(a public.query_text_search, b public.text_search) +function eql_v3.gt(a public.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.gt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.gt(a public.real_ord, b jsonb) +function eql_v3.gt(a public.real_ord, b public.query_real_ord) function eql_v3.gt(a public.real_ord, b public.real_ord) -function eql_v3.gt(a public.real_ord, b public.real_ord_query) function eql_v3.gt(a public.real_ord_ope, b jsonb) +function eql_v3.gt(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope) -function eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope_query) -function eql_v3.gt(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.gt(a public.real_ord_ore, b jsonb) +function eql_v3.gt(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore) -function eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore_query) -function eql_v3.gt(a public.real_ord_ore_query, b public.real_ord_ore) -function eql_v3.gt(a public.real_ord_query, b public.real_ord) function eql_v3.gt(a public.smallint_ord, b jsonb) +function eql_v3.gt(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.gt(a public.smallint_ord, b public.smallint_ord) -function eql_v3.gt(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.gt(a public.smallint_ord_ope, b jsonb) +function eql_v3.gt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) -function eql_v3.gt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.gt(a public.smallint_ord_ore, b jsonb) +function eql_v3.gt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) -function eql_v3.gt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) -function eql_v3.gt(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.gt(a public.text_ord, b jsonb) +function eql_v3.gt(a public.text_ord, b public.query_text_ord) function eql_v3.gt(a public.text_ord, b public.text_ord) -function eql_v3.gt(a public.text_ord, b public.text_ord_query) function eql_v3.gt(a public.text_ord_ope, b jsonb) +function eql_v3.gt(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope) -function eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope_query) -function eql_v3.gt(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.gt(a public.text_ord_ore, b jsonb) +function eql_v3.gt(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore) -function eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore_query) -function eql_v3.gt(a public.text_ord_ore_query, b public.text_ord_ore) -function eql_v3.gt(a public.text_ord_query, b public.text_ord) function eql_v3.gt(a public.text_search, b jsonb) +function eql_v3.gt(a public.text_search, b public.query_text_search) function eql_v3.gt(a public.text_search, b public.text_search) -function eql_v3.gt(a public.text_search, b public.text_search_query) -function eql_v3.gt(a public.text_search_query, b public.text_search) function eql_v3.gt(a public.timestamp_ord, b jsonb) +function eql_v3.gt(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord) -function eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.gt(a public.timestamp_ord_ope, b jsonb) +function eql_v3.gt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) -function eql_v3.gt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.gt(a public.timestamp_ord_ore, b jsonb) +function eql_v3.gt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore) -function eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) -function eql_v3.gt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) -function eql_v3.gt(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.gte(a jsonb, b public.bigint_ord) function eql_v3.gte(a jsonb, b public.bigint_ord_ope) function eql_v3.gte(a jsonb, b public.bigint_ord_ore) @@ -472,117 +472,117 @@ function eql_v3.gte(a jsonb, b public.timestamp_ord_ope) function eql_v3.gte(a jsonb, b public.timestamp_ord_ore) function eql_v3.gte(a public.bigint_ord, b jsonb) function eql_v3.gte(a public.bigint_ord, b public.bigint_ord) -function eql_v3.gte(a public.bigint_ord, b public.bigint_ord_query) +function eql_v3.gte(a public.bigint_ord, b public.query_bigint_ord) function eql_v3.gte(a public.bigint_ord_ope, b jsonb) function eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) -function eql_v3.gte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +function eql_v3.gte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) function eql_v3.gte(a public.bigint_ord_ore, b jsonb) function eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) -function eql_v3.gte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) -function eql_v3.gte(a public.bigint_ord_query, b public.bigint_ord) +function eql_v3.gte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) function eql_v3.gte(a public.date_ord, b jsonb) function eql_v3.gte(a public.date_ord, b public.date_ord) -function eql_v3.gte(a public.date_ord, b public.date_ord_query) +function eql_v3.gte(a public.date_ord, b public.query_date_ord) function eql_v3.gte(a public.date_ord_ope, b jsonb) function eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope_query) -function eql_v3.gte(a public.date_ord_ope_query, b public.date_ord_ope) +function eql_v3.gte(a public.date_ord_ope, b public.query_date_ord_ope) function eql_v3.gte(a public.date_ord_ore, b jsonb) function eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore_query) -function eql_v3.gte(a public.date_ord_ore_query, b public.date_ord_ore) -function eql_v3.gte(a public.date_ord_query, b public.date_ord) +function eql_v3.gte(a public.date_ord_ore, b public.query_date_ord_ore) function eql_v3.gte(a public.double_ord, b jsonb) function eql_v3.gte(a public.double_ord, b public.double_ord) -function eql_v3.gte(a public.double_ord, b public.double_ord_query) +function eql_v3.gte(a public.double_ord, b public.query_double_ord) function eql_v3.gte(a public.double_ord_ope, b jsonb) function eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope_query) -function eql_v3.gte(a public.double_ord_ope_query, b public.double_ord_ope) +function eql_v3.gte(a public.double_ord_ope, b public.query_double_ord_ope) function eql_v3.gte(a public.double_ord_ore, b jsonb) function eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore_query) -function eql_v3.gte(a public.double_ord_ore_query, b public.double_ord_ore) -function eql_v3.gte(a public.double_ord_query, b public.double_ord) +function eql_v3.gte(a public.double_ord_ore, b public.query_double_ord_ore) function eql_v3.gte(a public.integer_ord, b jsonb) function eql_v3.gte(a public.integer_ord, b public.integer_ord) -function eql_v3.gte(a public.integer_ord, b public.integer_ord_query) +function eql_v3.gte(a public.integer_ord, b public.query_integer_ord) function eql_v3.gte(a public.integer_ord_ope, b jsonb) function eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope_query) -function eql_v3.gte(a public.integer_ord_ope_query, b public.integer_ord_ope) +function eql_v3.gte(a public.integer_ord_ope, b public.query_integer_ord_ope) function eql_v3.gte(a public.integer_ord_ore, b jsonb) function eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore_query) -function eql_v3.gte(a public.integer_ord_ore_query, b public.integer_ord_ore) -function eql_v3.gte(a public.integer_ord_query, b public.integer_ord) +function eql_v3.gte(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.gte(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.gte(a public.numeric_ord, b jsonb) function eql_v3.gte(a public.numeric_ord, b public.numeric_ord) -function eql_v3.gte(a public.numeric_ord, b public.numeric_ord_query) +function eql_v3.gte(a public.numeric_ord, b public.query_numeric_ord) function eql_v3.gte(a public.numeric_ord_ope, b jsonb) function eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) -function eql_v3.gte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +function eql_v3.gte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) function eql_v3.gte(a public.numeric_ord_ore, b jsonb) function eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) -function eql_v3.gte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) -function eql_v3.gte(a public.numeric_ord_query, b public.numeric_ord) +function eql_v3.gte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +function eql_v3.gte(a public.query_bigint_ord, b public.bigint_ord) +function eql_v3.gte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.gte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.gte(a public.query_date_ord, b public.date_ord) +function eql_v3.gte(a public.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.gte(a public.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.gte(a public.query_double_ord, b public.double_ord) +function eql_v3.gte(a public.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.gte(a public.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.gte(a public.query_integer_ord, b public.integer_ord) +function eql_v3.gte(a public.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.gte(a public.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.gte(a public.query_numeric_ord, b public.numeric_ord) +function eql_v3.gte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.gte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.gte(a public.query_real_ord, b public.real_ord) +function eql_v3.gte(a public.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.gte(a public.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.gte(a public.query_smallint_ord, b public.smallint_ord) +function eql_v3.gte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gte(a public.query_text_ord, b public.text_ord) +function eql_v3.gte(a public.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.gte(a public.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.gte(a public.query_text_search, b public.text_search) +function eql_v3.gte(a public.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.gte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.gte(a public.real_ord, b jsonb) +function eql_v3.gte(a public.real_ord, b public.query_real_ord) function eql_v3.gte(a public.real_ord, b public.real_ord) -function eql_v3.gte(a public.real_ord, b public.real_ord_query) function eql_v3.gte(a public.real_ord_ope, b jsonb) +function eql_v3.gte(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope) -function eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope_query) -function eql_v3.gte(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.gte(a public.real_ord_ore, b jsonb) +function eql_v3.gte(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore) -function eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore_query) -function eql_v3.gte(a public.real_ord_ore_query, b public.real_ord_ore) -function eql_v3.gte(a public.real_ord_query, b public.real_ord) function eql_v3.gte(a public.smallint_ord, b jsonb) +function eql_v3.gte(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.gte(a public.smallint_ord, b public.smallint_ord) -function eql_v3.gte(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.gte(a public.smallint_ord_ope, b jsonb) +function eql_v3.gte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) -function eql_v3.gte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.gte(a public.smallint_ord_ore, b jsonb) +function eql_v3.gte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) -function eql_v3.gte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) -function eql_v3.gte(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.gte(a public.text_ord, b jsonb) +function eql_v3.gte(a public.text_ord, b public.query_text_ord) function eql_v3.gte(a public.text_ord, b public.text_ord) -function eql_v3.gte(a public.text_ord, b public.text_ord_query) function eql_v3.gte(a public.text_ord_ope, b jsonb) +function eql_v3.gte(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope) -function eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope_query) -function eql_v3.gte(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.gte(a public.text_ord_ore, b jsonb) +function eql_v3.gte(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore) -function eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore_query) -function eql_v3.gte(a public.text_ord_ore_query, b public.text_ord_ore) -function eql_v3.gte(a public.text_ord_query, b public.text_ord) function eql_v3.gte(a public.text_search, b jsonb) +function eql_v3.gte(a public.text_search, b public.query_text_search) function eql_v3.gte(a public.text_search, b public.text_search) -function eql_v3.gte(a public.text_search, b public.text_search_query) -function eql_v3.gte(a public.text_search_query, b public.text_search) function eql_v3.gte(a public.timestamp_ord, b jsonb) +function eql_v3.gte(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord) -function eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.gte(a public.timestamp_ord_ope, b jsonb) +function eql_v3.gte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) -function eql_v3.gte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.gte(a public.timestamp_ord_ore, b jsonb) +function eql_v3.gte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore) -function eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) -function eql_v3.gte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) -function eql_v3.gte(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.has_ore_cllw(entry public.jsonb_entry) function eql_v3.jsonb_array(val jsonb) function eql_v3.jsonb_array_elements(val jsonb) @@ -624,117 +624,117 @@ function eql_v3.lt(a jsonb, b public.timestamp_ord_ope) function eql_v3.lt(a jsonb, b public.timestamp_ord_ore) function eql_v3.lt(a public.bigint_ord, b jsonb) function eql_v3.lt(a public.bigint_ord, b public.bigint_ord) -function eql_v3.lt(a public.bigint_ord, b public.bigint_ord_query) +function eql_v3.lt(a public.bigint_ord, b public.query_bigint_ord) function eql_v3.lt(a public.bigint_ord_ope, b jsonb) function eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope_query) -function eql_v3.lt(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +function eql_v3.lt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) function eql_v3.lt(a public.bigint_ord_ore, b jsonb) function eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore_query) -function eql_v3.lt(a public.bigint_ord_ore_query, b public.bigint_ord_ore) -function eql_v3.lt(a public.bigint_ord_query, b public.bigint_ord) +function eql_v3.lt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) function eql_v3.lt(a public.date_ord, b jsonb) function eql_v3.lt(a public.date_ord, b public.date_ord) -function eql_v3.lt(a public.date_ord, b public.date_ord_query) +function eql_v3.lt(a public.date_ord, b public.query_date_ord) function eql_v3.lt(a public.date_ord_ope, b jsonb) function eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope_query) -function eql_v3.lt(a public.date_ord_ope_query, b public.date_ord_ope) +function eql_v3.lt(a public.date_ord_ope, b public.query_date_ord_ope) function eql_v3.lt(a public.date_ord_ore, b jsonb) function eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore_query) -function eql_v3.lt(a public.date_ord_ore_query, b public.date_ord_ore) -function eql_v3.lt(a public.date_ord_query, b public.date_ord) +function eql_v3.lt(a public.date_ord_ore, b public.query_date_ord_ore) function eql_v3.lt(a public.double_ord, b jsonb) function eql_v3.lt(a public.double_ord, b public.double_ord) -function eql_v3.lt(a public.double_ord, b public.double_ord_query) +function eql_v3.lt(a public.double_ord, b public.query_double_ord) function eql_v3.lt(a public.double_ord_ope, b jsonb) function eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope_query) -function eql_v3.lt(a public.double_ord_ope_query, b public.double_ord_ope) +function eql_v3.lt(a public.double_ord_ope, b public.query_double_ord_ope) function eql_v3.lt(a public.double_ord_ore, b jsonb) function eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore_query) -function eql_v3.lt(a public.double_ord_ore_query, b public.double_ord_ore) -function eql_v3.lt(a public.double_ord_query, b public.double_ord) +function eql_v3.lt(a public.double_ord_ore, b public.query_double_ord_ore) function eql_v3.lt(a public.integer_ord, b jsonb) function eql_v3.lt(a public.integer_ord, b public.integer_ord) -function eql_v3.lt(a public.integer_ord, b public.integer_ord_query) +function eql_v3.lt(a public.integer_ord, b public.query_integer_ord) function eql_v3.lt(a public.integer_ord_ope, b jsonb) function eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope_query) -function eql_v3.lt(a public.integer_ord_ope_query, b public.integer_ord_ope) +function eql_v3.lt(a public.integer_ord_ope, b public.query_integer_ord_ope) function eql_v3.lt(a public.integer_ord_ore, b jsonb) function eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore_query) -function eql_v3.lt(a public.integer_ord_ore_query, b public.integer_ord_ore) -function eql_v3.lt(a public.integer_ord_query, b public.integer_ord) +function eql_v3.lt(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.lt(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.lt(a public.numeric_ord, b jsonb) function eql_v3.lt(a public.numeric_ord, b public.numeric_ord) -function eql_v3.lt(a public.numeric_ord, b public.numeric_ord_query) +function eql_v3.lt(a public.numeric_ord, b public.query_numeric_ord) function eql_v3.lt(a public.numeric_ord_ope, b jsonb) function eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope_query) -function eql_v3.lt(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +function eql_v3.lt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) function eql_v3.lt(a public.numeric_ord_ore, b jsonb) function eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore_query) -function eql_v3.lt(a public.numeric_ord_ore_query, b public.numeric_ord_ore) -function eql_v3.lt(a public.numeric_ord_query, b public.numeric_ord) +function eql_v3.lt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +function eql_v3.lt(a public.query_bigint_ord, b public.bigint_ord) +function eql_v3.lt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.lt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.lt(a public.query_date_ord, b public.date_ord) +function eql_v3.lt(a public.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.lt(a public.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.lt(a public.query_double_ord, b public.double_ord) +function eql_v3.lt(a public.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.lt(a public.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.lt(a public.query_integer_ord, b public.integer_ord) +function eql_v3.lt(a public.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.lt(a public.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.lt(a public.query_numeric_ord, b public.numeric_ord) +function eql_v3.lt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.lt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.lt(a public.query_real_ord, b public.real_ord) +function eql_v3.lt(a public.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.lt(a public.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.lt(a public.query_smallint_ord, b public.smallint_ord) +function eql_v3.lt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lt(a public.query_text_ord, b public.text_ord) +function eql_v3.lt(a public.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.lt(a public.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.lt(a public.query_text_search, b public.text_search) +function eql_v3.lt(a public.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.lt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.lt(a public.real_ord, b jsonb) +function eql_v3.lt(a public.real_ord, b public.query_real_ord) function eql_v3.lt(a public.real_ord, b public.real_ord) -function eql_v3.lt(a public.real_ord, b public.real_ord_query) function eql_v3.lt(a public.real_ord_ope, b jsonb) +function eql_v3.lt(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope) -function eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope_query) -function eql_v3.lt(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.lt(a public.real_ord_ore, b jsonb) +function eql_v3.lt(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore) -function eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore_query) -function eql_v3.lt(a public.real_ord_ore_query, b public.real_ord_ore) -function eql_v3.lt(a public.real_ord_query, b public.real_ord) function eql_v3.lt(a public.smallint_ord, b jsonb) +function eql_v3.lt(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.lt(a public.smallint_ord, b public.smallint_ord) -function eql_v3.lt(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.lt(a public.smallint_ord_ope, b jsonb) +function eql_v3.lt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope_query) -function eql_v3.lt(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.lt(a public.smallint_ord_ore, b jsonb) +function eql_v3.lt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore_query) -function eql_v3.lt(a public.smallint_ord_ore_query, b public.smallint_ord_ore) -function eql_v3.lt(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.lt(a public.text_ord, b jsonb) +function eql_v3.lt(a public.text_ord, b public.query_text_ord) function eql_v3.lt(a public.text_ord, b public.text_ord) -function eql_v3.lt(a public.text_ord, b public.text_ord_query) function eql_v3.lt(a public.text_ord_ope, b jsonb) +function eql_v3.lt(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope) -function eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope_query) -function eql_v3.lt(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.lt(a public.text_ord_ore, b jsonb) +function eql_v3.lt(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore) -function eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore_query) -function eql_v3.lt(a public.text_ord_ore_query, b public.text_ord_ore) -function eql_v3.lt(a public.text_ord_query, b public.text_ord) function eql_v3.lt(a public.text_search, b jsonb) +function eql_v3.lt(a public.text_search, b public.query_text_search) function eql_v3.lt(a public.text_search, b public.text_search) -function eql_v3.lt(a public.text_search, b public.text_search_query) -function eql_v3.lt(a public.text_search_query, b public.text_search) function eql_v3.lt(a public.timestamp_ord, b jsonb) +function eql_v3.lt(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord) -function eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.lt(a public.timestamp_ord_ope, b jsonb) +function eql_v3.lt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) -function eql_v3.lt(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.lt(a public.timestamp_ord_ore, b jsonb) +function eql_v3.lt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore) -function eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) -function eql_v3.lt(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) -function eql_v3.lt(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.lte(a jsonb, b public.bigint_ord) function eql_v3.lte(a jsonb, b public.bigint_ord_ope) function eql_v3.lte(a jsonb, b public.bigint_ord_ore) @@ -765,121 +765,121 @@ function eql_v3.lte(a jsonb, b public.timestamp_ord_ope) function eql_v3.lte(a jsonb, b public.timestamp_ord_ore) function eql_v3.lte(a public.bigint_ord, b jsonb) function eql_v3.lte(a public.bigint_ord, b public.bigint_ord) -function eql_v3.lte(a public.bigint_ord, b public.bigint_ord_query) +function eql_v3.lte(a public.bigint_ord, b public.query_bigint_ord) function eql_v3.lte(a public.bigint_ord_ope, b jsonb) function eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope_query) -function eql_v3.lte(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +function eql_v3.lte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) function eql_v3.lte(a public.bigint_ord_ore, b jsonb) function eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore_query) -function eql_v3.lte(a public.bigint_ord_ore_query, b public.bigint_ord_ore) -function eql_v3.lte(a public.bigint_ord_query, b public.bigint_ord) +function eql_v3.lte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) function eql_v3.lte(a public.date_ord, b jsonb) function eql_v3.lte(a public.date_ord, b public.date_ord) -function eql_v3.lte(a public.date_ord, b public.date_ord_query) +function eql_v3.lte(a public.date_ord, b public.query_date_ord) function eql_v3.lte(a public.date_ord_ope, b jsonb) function eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope_query) -function eql_v3.lte(a public.date_ord_ope_query, b public.date_ord_ope) +function eql_v3.lte(a public.date_ord_ope, b public.query_date_ord_ope) function eql_v3.lte(a public.date_ord_ore, b jsonb) function eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore_query) -function eql_v3.lte(a public.date_ord_ore_query, b public.date_ord_ore) -function eql_v3.lte(a public.date_ord_query, b public.date_ord) +function eql_v3.lte(a public.date_ord_ore, b public.query_date_ord_ore) function eql_v3.lte(a public.double_ord, b jsonb) function eql_v3.lte(a public.double_ord, b public.double_ord) -function eql_v3.lte(a public.double_ord, b public.double_ord_query) +function eql_v3.lte(a public.double_ord, b public.query_double_ord) function eql_v3.lte(a public.double_ord_ope, b jsonb) function eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope_query) -function eql_v3.lte(a public.double_ord_ope_query, b public.double_ord_ope) +function eql_v3.lte(a public.double_ord_ope, b public.query_double_ord_ope) function eql_v3.lte(a public.double_ord_ore, b jsonb) function eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore_query) -function eql_v3.lte(a public.double_ord_ore_query, b public.double_ord_ore) -function eql_v3.lte(a public.double_ord_query, b public.double_ord) +function eql_v3.lte(a public.double_ord_ore, b public.query_double_ord_ore) function eql_v3.lte(a public.integer_ord, b jsonb) function eql_v3.lte(a public.integer_ord, b public.integer_ord) -function eql_v3.lte(a public.integer_ord, b public.integer_ord_query) +function eql_v3.lte(a public.integer_ord, b public.query_integer_ord) function eql_v3.lte(a public.integer_ord_ope, b jsonb) function eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope_query) -function eql_v3.lte(a public.integer_ord_ope_query, b public.integer_ord_ope) +function eql_v3.lte(a public.integer_ord_ope, b public.query_integer_ord_ope) function eql_v3.lte(a public.integer_ord_ore, b jsonb) function eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore_query) -function eql_v3.lte(a public.integer_ord_ore_query, b public.integer_ord_ore) -function eql_v3.lte(a public.integer_ord_query, b public.integer_ord) +function eql_v3.lte(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.lte(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.lte(a public.numeric_ord, b jsonb) function eql_v3.lte(a public.numeric_ord, b public.numeric_ord) -function eql_v3.lte(a public.numeric_ord, b public.numeric_ord_query) +function eql_v3.lte(a public.numeric_ord, b public.query_numeric_ord) function eql_v3.lte(a public.numeric_ord_ope, b jsonb) function eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope_query) -function eql_v3.lte(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +function eql_v3.lte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) function eql_v3.lte(a public.numeric_ord_ore, b jsonb) function eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore_query) -function eql_v3.lte(a public.numeric_ord_ore_query, b public.numeric_ord_ore) -function eql_v3.lte(a public.numeric_ord_query, b public.numeric_ord) +function eql_v3.lte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +function eql_v3.lte(a public.query_bigint_ord, b public.bigint_ord) +function eql_v3.lte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.lte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.lte(a public.query_date_ord, b public.date_ord) +function eql_v3.lte(a public.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.lte(a public.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.lte(a public.query_double_ord, b public.double_ord) +function eql_v3.lte(a public.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.lte(a public.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.lte(a public.query_integer_ord, b public.integer_ord) +function eql_v3.lte(a public.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.lte(a public.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.lte(a public.query_numeric_ord, b public.numeric_ord) +function eql_v3.lte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.lte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.lte(a public.query_real_ord, b public.real_ord) +function eql_v3.lte(a public.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.lte(a public.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.lte(a public.query_smallint_ord, b public.smallint_ord) +function eql_v3.lte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lte(a public.query_text_ord, b public.text_ord) +function eql_v3.lte(a public.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.lte(a public.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.lte(a public.query_text_search, b public.text_search) +function eql_v3.lte(a public.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.lte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.lte(a public.real_ord, b jsonb) +function eql_v3.lte(a public.real_ord, b public.query_real_ord) function eql_v3.lte(a public.real_ord, b public.real_ord) -function eql_v3.lte(a public.real_ord, b public.real_ord_query) function eql_v3.lte(a public.real_ord_ope, b jsonb) +function eql_v3.lte(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope) -function eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope_query) -function eql_v3.lte(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.lte(a public.real_ord_ore, b jsonb) +function eql_v3.lte(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore) -function eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore_query) -function eql_v3.lte(a public.real_ord_ore_query, b public.real_ord_ore) -function eql_v3.lte(a public.real_ord_query, b public.real_ord) function eql_v3.lte(a public.smallint_ord, b jsonb) +function eql_v3.lte(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.lte(a public.smallint_ord, b public.smallint_ord) -function eql_v3.lte(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.lte(a public.smallint_ord_ope, b jsonb) +function eql_v3.lte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope_query) -function eql_v3.lte(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.lte(a public.smallint_ord_ore, b jsonb) +function eql_v3.lte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore_query) -function eql_v3.lte(a public.smallint_ord_ore_query, b public.smallint_ord_ore) -function eql_v3.lte(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.lte(a public.text_ord, b jsonb) +function eql_v3.lte(a public.text_ord, b public.query_text_ord) function eql_v3.lte(a public.text_ord, b public.text_ord) -function eql_v3.lte(a public.text_ord, b public.text_ord_query) function eql_v3.lte(a public.text_ord_ope, b jsonb) +function eql_v3.lte(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope) -function eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope_query) -function eql_v3.lte(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.lte(a public.text_ord_ore, b jsonb) +function eql_v3.lte(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore) -function eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore_query) -function eql_v3.lte(a public.text_ord_ore_query, b public.text_ord_ore) -function eql_v3.lte(a public.text_ord_query, b public.text_ord) function eql_v3.lte(a public.text_search, b jsonb) +function eql_v3.lte(a public.text_search, b public.query_text_search) function eql_v3.lte(a public.text_search, b public.text_search) -function eql_v3.lte(a public.text_search, b public.text_search_query) -function eql_v3.lte(a public.text_search_query, b public.text_search) function eql_v3.lte(a public.timestamp_ord, b jsonb) +function eql_v3.lte(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord) -function eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.lte(a public.timestamp_ord_ope, b jsonb) +function eql_v3.lte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) -function eql_v3.lte(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.lte(a public.timestamp_ord_ore, b jsonb) +function eql_v3.lte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore) -function eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) -function eql_v3.lte(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) -function eql_v3.lte(a public.timestamp_ord_query, b public.timestamp_ord) +function eql_v3.match_term(a public.query_text_match) +function eql_v3.match_term(a public.query_text_search) function eql_v3.match_term(a public.text_match) -function eql_v3.match_term(a public.text_match_query) function eql_v3.match_term(a public.text_search) -function eql_v3.match_term(a public.text_search_query) function eql_v3.meta_data(val jsonb) function eql_v3.neq(a jsonb, b public.bigint_eq) function eql_v3.neq(a jsonb, b public.bigint_ord) @@ -920,209 +920,209 @@ function eql_v3.neq(a jsonb, b public.timestamp_ord_ope) function eql_v3.neq(a jsonb, b public.timestamp_ord_ore) function eql_v3.neq(a public.bigint_eq, b jsonb) function eql_v3.neq(a public.bigint_eq, b public.bigint_eq) -function eql_v3.neq(a public.bigint_eq, b public.bigint_eq_query) -function eql_v3.neq(a public.bigint_eq_query, b public.bigint_eq) +function eql_v3.neq(a public.bigint_eq, b public.query_bigint_eq) function eql_v3.neq(a public.bigint_ord, b jsonb) function eql_v3.neq(a public.bigint_ord, b public.bigint_ord) -function eql_v3.neq(a public.bigint_ord, b public.bigint_ord_query) +function eql_v3.neq(a public.bigint_ord, b public.query_bigint_ord) function eql_v3.neq(a public.bigint_ord_ope, b jsonb) function eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope_query) -function eql_v3.neq(a public.bigint_ord_ope_query, b public.bigint_ord_ope) +function eql_v3.neq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) function eql_v3.neq(a public.bigint_ord_ore, b jsonb) function eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore_query) -function eql_v3.neq(a public.bigint_ord_ore_query, b public.bigint_ord_ore) -function eql_v3.neq(a public.bigint_ord_query, b public.bigint_ord) +function eql_v3.neq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) function eql_v3.neq(a public.date_eq, b jsonb) function eql_v3.neq(a public.date_eq, b public.date_eq) -function eql_v3.neq(a public.date_eq, b public.date_eq_query) -function eql_v3.neq(a public.date_eq_query, b public.date_eq) +function eql_v3.neq(a public.date_eq, b public.query_date_eq) function eql_v3.neq(a public.date_ord, b jsonb) function eql_v3.neq(a public.date_ord, b public.date_ord) -function eql_v3.neq(a public.date_ord, b public.date_ord_query) +function eql_v3.neq(a public.date_ord, b public.query_date_ord) function eql_v3.neq(a public.date_ord_ope, b jsonb) function eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope_query) -function eql_v3.neq(a public.date_ord_ope_query, b public.date_ord_ope) +function eql_v3.neq(a public.date_ord_ope, b public.query_date_ord_ope) function eql_v3.neq(a public.date_ord_ore, b jsonb) function eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore_query) -function eql_v3.neq(a public.date_ord_ore_query, b public.date_ord_ore) -function eql_v3.neq(a public.date_ord_query, b public.date_ord) +function eql_v3.neq(a public.date_ord_ore, b public.query_date_ord_ore) function eql_v3.neq(a public.double_eq, b jsonb) function eql_v3.neq(a public.double_eq, b public.double_eq) -function eql_v3.neq(a public.double_eq, b public.double_eq_query) -function eql_v3.neq(a public.double_eq_query, b public.double_eq) +function eql_v3.neq(a public.double_eq, b public.query_double_eq) function eql_v3.neq(a public.double_ord, b jsonb) function eql_v3.neq(a public.double_ord, b public.double_ord) -function eql_v3.neq(a public.double_ord, b public.double_ord_query) +function eql_v3.neq(a public.double_ord, b public.query_double_ord) function eql_v3.neq(a public.double_ord_ope, b jsonb) function eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope_query) -function eql_v3.neq(a public.double_ord_ope_query, b public.double_ord_ope) +function eql_v3.neq(a public.double_ord_ope, b public.query_double_ord_ope) function eql_v3.neq(a public.double_ord_ore, b jsonb) function eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore_query) -function eql_v3.neq(a public.double_ord_ore_query, b public.double_ord_ore) -function eql_v3.neq(a public.double_ord_query, b public.double_ord) +function eql_v3.neq(a public.double_ord_ore, b public.query_double_ord_ore) function eql_v3.neq(a public.integer_eq, b jsonb) function eql_v3.neq(a public.integer_eq, b public.integer_eq) -function eql_v3.neq(a public.integer_eq, b public.integer_eq_query) -function eql_v3.neq(a public.integer_eq_query, b public.integer_eq) +function eql_v3.neq(a public.integer_eq, b public.query_integer_eq) function eql_v3.neq(a public.integer_ord, b jsonb) function eql_v3.neq(a public.integer_ord, b public.integer_ord) -function eql_v3.neq(a public.integer_ord, b public.integer_ord_query) +function eql_v3.neq(a public.integer_ord, b public.query_integer_ord) function eql_v3.neq(a public.integer_ord_ope, b jsonb) function eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope_query) -function eql_v3.neq(a public.integer_ord_ope_query, b public.integer_ord_ope) +function eql_v3.neq(a public.integer_ord_ope, b public.query_integer_ord_ope) function eql_v3.neq(a public.integer_ord_ore, b jsonb) function eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore_query) -function eql_v3.neq(a public.integer_ord_ore_query, b public.integer_ord_ore) -function eql_v3.neq(a public.integer_ord_query, b public.integer_ord) +function eql_v3.neq(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.neq(a public.jsonb_entry, b public.jsonb_entry) function eql_v3.neq(a public.numeric_eq, b jsonb) function eql_v3.neq(a public.numeric_eq, b public.numeric_eq) -function eql_v3.neq(a public.numeric_eq, b public.numeric_eq_query) -function eql_v3.neq(a public.numeric_eq_query, b public.numeric_eq) +function eql_v3.neq(a public.numeric_eq, b public.query_numeric_eq) function eql_v3.neq(a public.numeric_ord, b jsonb) function eql_v3.neq(a public.numeric_ord, b public.numeric_ord) -function eql_v3.neq(a public.numeric_ord, b public.numeric_ord_query) +function eql_v3.neq(a public.numeric_ord, b public.query_numeric_ord) function eql_v3.neq(a public.numeric_ord_ope, b jsonb) function eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope_query) -function eql_v3.neq(a public.numeric_ord_ope_query, b public.numeric_ord_ope) +function eql_v3.neq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) function eql_v3.neq(a public.numeric_ord_ore, b jsonb) function eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore_query) -function eql_v3.neq(a public.numeric_ord_ore_query, b public.numeric_ord_ore) -function eql_v3.neq(a public.numeric_ord_query, b public.numeric_ord) +function eql_v3.neq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +function eql_v3.neq(a public.query_bigint_eq, b public.bigint_eq) +function eql_v3.neq(a public.query_bigint_ord, b public.bigint_ord) +function eql_v3.neq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.neq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.neq(a public.query_date_eq, b public.date_eq) +function eql_v3.neq(a public.query_date_ord, b public.date_ord) +function eql_v3.neq(a public.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.neq(a public.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.neq(a public.query_double_eq, b public.double_eq) +function eql_v3.neq(a public.query_double_ord, b public.double_ord) +function eql_v3.neq(a public.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.neq(a public.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.neq(a public.query_integer_eq, b public.integer_eq) +function eql_v3.neq(a public.query_integer_ord, b public.integer_ord) +function eql_v3.neq(a public.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.neq(a public.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.neq(a public.query_numeric_eq, b public.numeric_eq) +function eql_v3.neq(a public.query_numeric_ord, b public.numeric_ord) +function eql_v3.neq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.neq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.neq(a public.query_real_eq, b public.real_eq) +function eql_v3.neq(a public.query_real_ord, b public.real_ord) +function eql_v3.neq(a public.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.neq(a public.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.neq(a public.query_smallint_eq, b public.smallint_eq) +function eql_v3.neq(a public.query_smallint_ord, b public.smallint_ord) +function eql_v3.neq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.neq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.neq(a public.query_text_eq, b public.text_eq) +function eql_v3.neq(a public.query_text_ord, b public.text_ord) +function eql_v3.neq(a public.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.neq(a public.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.neq(a public.query_text_search, b public.text_search) +function eql_v3.neq(a public.query_timestamp_eq, b public.timestamp_eq) +function eql_v3.neq(a public.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.neq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.neq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.neq(a public.real_eq, b jsonb) +function eql_v3.neq(a public.real_eq, b public.query_real_eq) function eql_v3.neq(a public.real_eq, b public.real_eq) -function eql_v3.neq(a public.real_eq, b public.real_eq_query) -function eql_v3.neq(a public.real_eq_query, b public.real_eq) function eql_v3.neq(a public.real_ord, b jsonb) +function eql_v3.neq(a public.real_ord, b public.query_real_ord) function eql_v3.neq(a public.real_ord, b public.real_ord) -function eql_v3.neq(a public.real_ord, b public.real_ord_query) function eql_v3.neq(a public.real_ord_ope, b jsonb) +function eql_v3.neq(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope) -function eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope_query) -function eql_v3.neq(a public.real_ord_ope_query, b public.real_ord_ope) function eql_v3.neq(a public.real_ord_ore, b jsonb) +function eql_v3.neq(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore) -function eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore_query) -function eql_v3.neq(a public.real_ord_ore_query, b public.real_ord_ore) -function eql_v3.neq(a public.real_ord_query, b public.real_ord) function eql_v3.neq(a public.smallint_eq, b jsonb) +function eql_v3.neq(a public.smallint_eq, b public.query_smallint_eq) function eql_v3.neq(a public.smallint_eq, b public.smallint_eq) -function eql_v3.neq(a public.smallint_eq, b public.smallint_eq_query) -function eql_v3.neq(a public.smallint_eq_query, b public.smallint_eq) function eql_v3.neq(a public.smallint_ord, b jsonb) +function eql_v3.neq(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.neq(a public.smallint_ord, b public.smallint_ord) -function eql_v3.neq(a public.smallint_ord, b public.smallint_ord_query) function eql_v3.neq(a public.smallint_ord_ope, b jsonb) +function eql_v3.neq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope_query) -function eql_v3.neq(a public.smallint_ord_ope_query, b public.smallint_ord_ope) function eql_v3.neq(a public.smallint_ord_ore, b jsonb) +function eql_v3.neq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore_query) -function eql_v3.neq(a public.smallint_ord_ore_query, b public.smallint_ord_ore) -function eql_v3.neq(a public.smallint_ord_query, b public.smallint_ord) function eql_v3.neq(a public.text_eq, b jsonb) +function eql_v3.neq(a public.text_eq, b public.query_text_eq) function eql_v3.neq(a public.text_eq, b public.text_eq) -function eql_v3.neq(a public.text_eq, b public.text_eq_query) -function eql_v3.neq(a public.text_eq_query, b public.text_eq) function eql_v3.neq(a public.text_ord, b jsonb) +function eql_v3.neq(a public.text_ord, b public.query_text_ord) function eql_v3.neq(a public.text_ord, b public.text_ord) -function eql_v3.neq(a public.text_ord, b public.text_ord_query) function eql_v3.neq(a public.text_ord_ope, b jsonb) +function eql_v3.neq(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope) -function eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope_query) -function eql_v3.neq(a public.text_ord_ope_query, b public.text_ord_ope) function eql_v3.neq(a public.text_ord_ore, b jsonb) +function eql_v3.neq(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore) -function eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore_query) -function eql_v3.neq(a public.text_ord_ore_query, b public.text_ord_ore) -function eql_v3.neq(a public.text_ord_query, b public.text_ord) function eql_v3.neq(a public.text_search, b jsonb) +function eql_v3.neq(a public.text_search, b public.query_text_search) function eql_v3.neq(a public.text_search, b public.text_search) -function eql_v3.neq(a public.text_search, b public.text_search_query) -function eql_v3.neq(a public.text_search_query, b public.text_search) function eql_v3.neq(a public.timestamp_eq, b jsonb) +function eql_v3.neq(a public.timestamp_eq, b public.query_timestamp_eq) function eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq) -function eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq_query) -function eql_v3.neq(a public.timestamp_eq_query, b public.timestamp_eq) function eql_v3.neq(a public.timestamp_ord, b jsonb) +function eql_v3.neq(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord) -function eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord_query) function eql_v3.neq(a public.timestamp_ord_ope, b jsonb) +function eql_v3.neq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope_query) -function eql_v3.neq(a public.timestamp_ord_ope_query, b public.timestamp_ord_ope) function eql_v3.neq(a public.timestamp_ord_ore, b jsonb) +function eql_v3.neq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore) -function eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore_query) -function eql_v3.neq(a public.timestamp_ord_ore_query, b public.timestamp_ord_ore) -function eql_v3.neq(a public.timestamp_ord_query, b public.timestamp_ord) function eql_v3.ord_ope_term(a public.bigint_ord_ope) -function eql_v3.ord_ope_term(a public.bigint_ord_ope_query) function eql_v3.ord_ope_term(a public.date_ord_ope) -function eql_v3.ord_ope_term(a public.date_ord_ope_query) function eql_v3.ord_ope_term(a public.double_ord_ope) -function eql_v3.ord_ope_term(a public.double_ord_ope_query) function eql_v3.ord_ope_term(a public.integer_ord_ope) -function eql_v3.ord_ope_term(a public.integer_ord_ope_query) function eql_v3.ord_ope_term(a public.numeric_ord_ope) -function eql_v3.ord_ope_term(a public.numeric_ord_ope_query) +function eql_v3.ord_ope_term(a public.query_bigint_ord_ope) +function eql_v3.ord_ope_term(a public.query_date_ord_ope) +function eql_v3.ord_ope_term(a public.query_double_ord_ope) +function eql_v3.ord_ope_term(a public.query_integer_ord_ope) +function eql_v3.ord_ope_term(a public.query_numeric_ord_ope) +function eql_v3.ord_ope_term(a public.query_real_ord_ope) +function eql_v3.ord_ope_term(a public.query_smallint_ord_ope) +function eql_v3.ord_ope_term(a public.query_text_ord_ope) +function eql_v3.ord_ope_term(a public.query_timestamp_ord_ope) function eql_v3.ord_ope_term(a public.real_ord_ope) -function eql_v3.ord_ope_term(a public.real_ord_ope_query) function eql_v3.ord_ope_term(a public.smallint_ord_ope) -function eql_v3.ord_ope_term(a public.smallint_ord_ope_query) function eql_v3.ord_ope_term(a public.text_ord_ope) -function eql_v3.ord_ope_term(a public.text_ord_ope_query) function eql_v3.ord_ope_term(a public.timestamp_ord_ope) -function eql_v3.ord_ope_term(a public.timestamp_ord_ope_query) function eql_v3.ord_term(a public.bigint_ord) function eql_v3.ord_term(a public.bigint_ord_ore) -function eql_v3.ord_term(a public.bigint_ord_ore_query) -function eql_v3.ord_term(a public.bigint_ord_query) function eql_v3.ord_term(a public.date_ord) function eql_v3.ord_term(a public.date_ord_ore) -function eql_v3.ord_term(a public.date_ord_ore_query) -function eql_v3.ord_term(a public.date_ord_query) function eql_v3.ord_term(a public.double_ord) function eql_v3.ord_term(a public.double_ord_ore) -function eql_v3.ord_term(a public.double_ord_ore_query) -function eql_v3.ord_term(a public.double_ord_query) function eql_v3.ord_term(a public.integer_ord) function eql_v3.ord_term(a public.integer_ord_ore) -function eql_v3.ord_term(a public.integer_ord_ore_query) -function eql_v3.ord_term(a public.integer_ord_query) function eql_v3.ord_term(a public.numeric_ord) function eql_v3.ord_term(a public.numeric_ord_ore) -function eql_v3.ord_term(a public.numeric_ord_ore_query) -function eql_v3.ord_term(a public.numeric_ord_query) +function eql_v3.ord_term(a public.query_bigint_ord) +function eql_v3.ord_term(a public.query_bigint_ord_ore) +function eql_v3.ord_term(a public.query_date_ord) +function eql_v3.ord_term(a public.query_date_ord_ore) +function eql_v3.ord_term(a public.query_double_ord) +function eql_v3.ord_term(a public.query_double_ord_ore) +function eql_v3.ord_term(a public.query_integer_ord) +function eql_v3.ord_term(a public.query_integer_ord_ore) +function eql_v3.ord_term(a public.query_numeric_ord) +function eql_v3.ord_term(a public.query_numeric_ord_ore) +function eql_v3.ord_term(a public.query_real_ord) +function eql_v3.ord_term(a public.query_real_ord_ore) +function eql_v3.ord_term(a public.query_smallint_ord) +function eql_v3.ord_term(a public.query_smallint_ord_ore) +function eql_v3.ord_term(a public.query_text_ord) +function eql_v3.ord_term(a public.query_text_ord_ore) +function eql_v3.ord_term(a public.query_text_search) +function eql_v3.ord_term(a public.query_timestamp_ord) +function eql_v3.ord_term(a public.query_timestamp_ord_ore) function eql_v3.ord_term(a public.real_ord) function eql_v3.ord_term(a public.real_ord_ore) -function eql_v3.ord_term(a public.real_ord_ore_query) -function eql_v3.ord_term(a public.real_ord_query) function eql_v3.ord_term(a public.smallint_ord) function eql_v3.ord_term(a public.smallint_ord_ore) -function eql_v3.ord_term(a public.smallint_ord_ore_query) -function eql_v3.ord_term(a public.smallint_ord_query) function eql_v3.ord_term(a public.text_ord) function eql_v3.ord_term(a public.text_ord_ore) -function eql_v3.ord_term(a public.text_ord_ore_query) -function eql_v3.ord_term(a public.text_ord_query) function eql_v3.ord_term(a public.text_search) -function eql_v3.ord_term(a public.text_search_query) function eql_v3.ord_term(a public.timestamp_ord) function eql_v3.ord_term(a public.timestamp_ord_ore) -function eql_v3.ord_term(a public.timestamp_ord_ore_query) -function eql_v3.ord_term(a public.timestamp_ord_query) function eql_v3.ore_cllw(entry public.jsonb_entry) function eql_v3.selector(entry public.jsonb_entry) function eql_v3.selector(val jsonb) diff --git a/tests/sqlx/src/matrix.rs b/tests/sqlx/src/matrix.rs index f2b23b3bc..aa6b5814e 100644 --- a/tests/sqlx/src/matrix.rs +++ b/tests/sqlx/src/matrix.rs @@ -1507,8 +1507,8 @@ macro_rules! __scalar_matrix_planner_metadata_case { // 5 arg shapes per operator: the 3 storage shapes — (d,d), // (d,jsonb), (jsonb,d) — plus the 2 CIP-3432 query-operand shapes - // — (d, d_query), (d_query, d). Every term-bearing domain the - // planner-metadata suite runs on has a `_query` twin, so + // — (d, query_d), (query_d, d). Every term-bearing domain the + // planner-metadata suite runs on has a `query_` twin, so // the count is uniformly ops x 5. let expected = ops.len() * 5; anyhow::ensure!( diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index cf4b04848..a8c430a0b 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -85,19 +85,26 @@ fn jsonb(payload_json: &str) -> String { } /// Cast a JSON text literal into a QUERY-operand value: strip the ciphertext -/// `c` (a query operand carries index terms only) and cast to `_query`. -/// This is exactly what a client sends — the stored envelope minus `c` — and -/// the RHS the `(storage, _query)` query operators consume (CIP-3432). +/// `c` (a query operand carries index terms only) and cast to the domain's +/// `query_` twin (prefix naming — CIP-3442). This is exactly what a +/// client sends — the stored envelope minus `c` — and the RHS the +/// `(storage, query_)` query operators consume (CIP-3432). fn query_cast(payload_json: &str, domain: &str) -> String { let mut v: serde_json::Value = serde_json::from_str(payload_json).expect("payload_json is valid JSON"); if let Some(obj) = v.as_object_mut() { obj.remove("c"); } + // `domain` is schema-qualified (`public.integer_eq`); the twin prefixes the + // unqualified name (`public.query_integer_eq`). + let query_domain = match domain.rsplit_once('.') { + Some((schema, name)) => format!("{schema}.query_{name}"), + None => format!("query_{domain}"), + }; format!( - "'{}'::jsonb::{}_query", + "'{}'::jsonb::{}", v.to_string().replace('\'', "''"), - domain + query_domain ) } @@ -113,7 +120,7 @@ pub async fn assert_eq_oracle(pool: &PgPool, rows: &[Row]) -> let b_dom = cast(&b.payload_json, &domain); // CIP-3432: the SAME pair also exercises the term-only query operand // (the stored payload minus its ciphertext `c`) through the - // `(storage, _query)` operators, in both directions — folded + // `(storage, query_)` operators, in both directions — folded // into this one round trip so query coverage adds no DB load. let a_qry = query_cast(&a.payload_json, &domain); let b_qry = query_cast(&b.payload_json, &domain); @@ -146,19 +153,19 @@ pub async fn assert_eq_oracle(pool: &PgPool, rows: &[Row]) -> ); anyhow::ensure!( eq_q == Some(want), - "query `=` mismatch on {domain}_query: {:?} vs {:?} want {want}, got {eq_q:?}", + "query `=` mismatch on the query twin of {domain}: {:?} vs {:?} want {want}, got {eq_q:?}", a.plaintext, b.plaintext ); anyhow::ensure!( neq_q == Some(!want), - "query `<>` mismatch on {domain}_query: {:?} vs {:?}", + "query `<>` mismatch on the query twin of {domain}: {:?} vs {:?}", a.plaintext, b.plaintext ); anyhow::ensure!( eq_qc == Some(want), - "commutator query `=` mismatch on {domain}_query: {:?} vs {:?}", + "commutator query `=` mismatch on the query twin of {domain}: {:?} vs {:?}", a.plaintext, b.plaintext ); @@ -186,7 +193,7 @@ pub async fn assert_ord_oracle( let a_cast = cast(&a.payload_json, &domain); let b_cast = cast(&b.payload_json, &domain); // CIP-3432: the term-only query operand for `b` (payload minus `c`), - // exercised through `(storage, _query)` ordering in the SAME + // exercised through `(storage, query_)` ordering in the SAME // round trip (no added DB load). let b_qry = query_cast(&b.payload_json, &domain); let sql = format!( @@ -221,19 +228,19 @@ pub async fn assert_ord_oracle( ); anyhow::ensure!( lt_q == Some(pa < pb), - "query `<` mismatch on {domain}_query: {pa:?}<{pb:?}" + "query `<` mismatch on the query twin of {domain}: {pa:?}<{pb:?}" ); anyhow::ensure!( lte_q == Some(pa <= pb), - "query `<=` mismatch on {domain}_query: {pa:?}<={pb:?}" + "query `<=` mismatch on the query twin of {domain}: {pa:?}<={pb:?}" ); anyhow::ensure!( gt_q == Some(pa > pb), - "query `>` mismatch on {domain}_query: {pa:?}>{pb:?}" + "query `>` mismatch on the query twin of {domain}: {pa:?}>{pb:?}" ); anyhow::ensure!( gte_q == Some(pa >= pb), - "query `>=` mismatch on {domain}_query: {pa:?}>={pb:?}" + "query `>=` mismatch on the query twin of {domain}: {pa:?}>={pb:?}" ); } } @@ -250,9 +257,9 @@ pub enum Overload { DomainDomain, DomainJsonb, JsonbDomain, - /// CIP-3432: the RHS is the term-only query operand (`_query`, the - /// payload minus `c`) — the `(storage, _query)` function overload. The - /// facet that reaches `text_search_query`, which the operator oracle (which + /// CIP-3432: the RHS is the term-only query operand (`query_`, the + /// payload minus `c`) — the `(storage, query_)` function overload. The + /// facet that reaches `query_text_search`, which the operator oracle (which /// runs text via `_eq`/`_ord`/`_ord_ore`, not `_search`) never touches. DomainQuery, } @@ -502,7 +509,7 @@ pub async fn assert_match_smoke( let needle = cast(needle_json, domain); let disjoint = cast(disjoint_json, domain); // CIP-3432: the term-only query operands (bloom `bf`, no ciphertext `c`), - // consumed by the `(text_match, text_match_query)` containment operators. + // consumed by the `(text_match, query_text_match)` containment operators. let needle_q = query_cast(needle_json, domain); let disjoint_q = query_cast(disjoint_json, domain); diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs index 85767afbf..89ee9930b 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs @@ -12,11 +12,11 @@ //! divergence is SQL NULL, which both forms accept (the validator via //! STRICT, the inline expression via a leading `VALUE IS NULL OR`). //! -//! `public.jsonb_query`'s CHECK CANNOT be inlined — validating sv elements +//! `public.query_jsonb`'s CHECK CANNOT be inlined — validating sv elements //! needs a subquery, which CHECK constraints forbid — so its validator is //! plpgsql instead (cached plan vs the per-call SQL-function executor; the -//! issue #353 finding). `jsonb_query_check_behaviour` characterises the -//! accept/reject matrix, and `jsonb_query_validator_is_plpgsql` guards the +//! issue #353 finding). `query_jsonb_check_behaviour` characterises the +//! accept/reject matrix, and `query_jsonb_validator_is_plpgsql` guards the //! language so a revert to LANGUAGE sql fails here. use anyhow::Result; @@ -102,7 +102,7 @@ async fn jsonb_entry_check_matches_validator(pool: PgPool) -> Result<()> { } #[sqlx::test] -async fn jsonb_query_check_behaviour(pool: PgPool) -> Result<()> { +async fn query_jsonb_check_behaviour(pool: PgPool) -> Result<()> { // (payload, expected accept) — hardcoded verdicts: the CHECK calls the // validator, so a validator-equivalence assertion would be tautological. let candidates: &[(Option<&str>, bool)] = &[ @@ -128,22 +128,22 @@ async fn jsonb_query_check_behaviour(pool: PgPool) -> Result<()> { (Some("[]"), false), ]; for (payload, expected) in candidates { - let cast = cast_accepts(&pool, "public.jsonb_query", *payload).await?; + let cast = cast_accepts(&pool, "public.query_jsonb", *payload).await?; anyhow::ensure!( cast == *expected, - "public.jsonb_query cast verdict changed for {payload:?}: \ + "public.query_jsonb cast verdict changed for {payload:?}: \ accepted = {cast}, expected = {expected}" ); } Ok(()) } -/// The jsonb_query validator must stay plpgsql: its only caller is the domain +/// The query_jsonb validator must stay plpgsql: its only caller is the domain /// CHECK (a context that can never inline a SQL function), so LANGUAGE sql /// pays the per-call SQL-function executor on every containment-needle cast /// (issues #353/#354). A revert fails here. #[sqlx::test] -async fn jsonb_query_validator_is_plpgsql(pool: PgPool) -> Result<()> { +async fn query_jsonb_validator_is_plpgsql(pool: PgPool) -> Result<()> { let lang: String = sqlx::query_scalar( "SELECT l.lanname FROM pg_proc p \ JOIN pg_language l ON l.oid = p.prolang \ diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index d16f25b0d..bc6576d17 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -146,17 +146,17 @@ async fn no_cross_variant_operator_is_declared(pool: PgPool) -> Result<()> { // `=`. If someone accidentally adds such an operator, this test fails. // // The jsonb DOCUMENT surface is excluded: it intentionally defines - // cross-type containment operators (`json @> jsonb_query`, + // cross-type containment operators (`json @> query_jsonb`, // `json @> jsonb_entry` and their `<@` commutators) — the documented // document-containment API, not scalar capability variants that must - // resolve to a blocker. So `json` / `jsonb_entry` / `jsonb_query` are + // resolve to a blocker. So `json` / `jsonb_entry` / `query_jsonb` are // out of scope for this scalar-variant guard. // // The check is structural (`pg_operator`) rather than dynamic // ("invoke and see it raise") so a future PG version with stricter // operator resolution doesn't mask the regression. // Derive the excluded (non-scalar) domain names from the catalog rather than - // hardcoding `'json', 'jsonb_entry', 'jsonb_query'` — a future rename or a + // hardcoding `'json', 'jsonb_entry', 'query_jsonb'` — a future rename or a // second non-scalar family stays covered automatically (the names come from // the same `DomainFamily::domain_name` the SQL surface is generated through). let excluded: Vec = eql_domains::CATALOG diff --git a/tests/sqlx/tests/encrypted_domain/ope/support.rs b/tests/sqlx/tests/encrypted_domain/ope/support.rs index a42ca510e..c66c99ae6 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/support.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/support.rs @@ -257,9 +257,10 @@ macro_rules! ope_ord_fixture_smoke { ); // CIP-3432: the term-only query operand — the pivot payload minus - // its ciphertext `c`, cast to `_query`. Every predicate must - // match the SAME oracle through the `(storage, _query)` - // operators as through the full-envelope operand. + // its ciphertext `c`, cast to `query_` (prefix naming — + // CIP-3442). Every predicate must match the SAME oracle through the + // `(storage, query_)` operators as through the + // full-envelope operand. let pivot_query_cast = { let mut v: serde_json::Value = serde_json::from_str(&pivot_json).expect("pivot payload is valid JSON"); @@ -267,7 +268,7 @@ macro_rules! ope_ord_fixture_smoke { o.remove("c"); } format!( - "'{}'::jsonb::public.{}_query", + "'{}'::jsonb::public.query_{}", v.to_string().replace('\'', "''"), $domain ) diff --git a/tests/sqlx/tests/payload_schema_tests.rs b/tests/sqlx/tests/payload_schema_tests.rs index ce46ef8b9..6919ebf7c 100644 --- a/tests/sqlx/tests/payload_schema_tests.rs +++ b/tests/sqlx/tests/payload_schema_tests.rs @@ -598,9 +598,9 @@ fn from_v2_query_output_validates_against_published_v3_schema() { }); let out = from_v2_query(&v2, TargetDomain::Json).expect("query conversion must succeed"); assert_valid( - &load_v3_schema("jsonb_query"), + &load_v3_schema("query_jsonb"), &out, - "from_v2_query output for jsonb_query", + "from_v2_query output for query_jsonb", ); } diff --git a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs index 8aa96c951..e35c9b3e0 100644 --- a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs @@ -65,7 +65,7 @@ async fn real_ste_vec_row_parses_into_document_and_entries(pool: PgPool) -> anyh #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn real_ste_vec_query_parses_into_bindings(pool: PgPool) -> anyhow::Result<()> { // `eql_v3.to_ste_vec_query` turns an encrypted document into a containment - // needle (`public.jsonb_query`), the shape a caller builds a `@>` / `<@` + // needle (`public.query_jsonb`), the shape a caller builds a `@>` / `<@` // query from. Parse a REAL one into `SteVecQuery` (and, transitively, its // `SteVecQueryEntry` elements), tying those two bindings to real crypto and // the hand-written `is_valid_ste_vec_query_payload` CHECK — the document/entry diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs index c6535f74f..b112d8287 100644 --- a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -38,7 +38,7 @@ async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result String { match ty { "\"json\"" => "public.json".to_string(), "jsonb_entry" => "public.jsonb_entry".to_string(), - "jsonb_query" => "public.jsonb_query".to_string(), + "query_jsonb" => "public.query_jsonb".to_string(), _ => ty.replace("public.\"json\"", "public.json"), } } @@ -144,10 +144,10 @@ async fn v3_jsonb_surface_supported_signatures(pool: PgPool) -> anyhow::Result<( let expected_supported: &[(&str, &str, &str)] = &[ // containment ("@>", "public.json", "public.json"), - ("@>", "public.json", "public.jsonb_query"), + ("@>", "public.json", "public.query_jsonb"), ("@>", "public.json", "public.jsonb_entry"), ("<@", "public.json", "public.json"), - ("<@", "public.jsonb_query", "public.json"), + ("<@", "public.query_jsonb", "public.json"), ("<@", "public.jsonb_entry", "public.json"), // path access ("->", "public.json", "text"), @@ -316,7 +316,7 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> (">=", "public.json", "jsonb"), (">=", "jsonb", "public.json"), // mixed jsonb containment shapes are blocked; safe forms use json, - // jsonb_query, or jsonb_entry. + // query_jsonb, or jsonb_entry. ("@>", "public.json", "jsonb"), ("@>", "jsonb", "public.json"), ("<@", "public.json", "jsonb"), diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index d13a7ba68..62aa5f93a 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -1,5 +1,5 @@ //! Parameterized test harness for the `eql_v3` encrypted-JSONB (SteVec) surface -//! (`public.json` / `public.jsonb_entry` / `public.jsonb_query`). +//! (`public.json` / `public.jsonb_entry` / `public.query_jsonb`). //! //! Design source of truth: //! `docs/superpowers/plans/2026-06-09-eql-v3-jsonb-test-harness-design.md`. @@ -102,7 +102,7 @@ fn doc(elems: &[String]) -> String { ) } -/// Build a `jsonb_query` needle literal from `(selector, term_field, hex)` +/// Build a `query_jsonb` needle literal from `(selector, term_field, hex)` /// triples (each element carries `s` + exactly one term, never `c`). fn needle(elems: &[(&str, &str, &str)]) -> String { let parts: Vec = elems @@ -306,7 +306,7 @@ async fn v3_jsonb_containment_hm_only(pool: PgPool) -> anyhow::Result<()> { let root_hm = root_hm_term(&pool).await?; let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -315,9 +315,9 @@ async fn v3_jsonb_containment_hm_only(pool: PgPool) -> anyhow::Result<()> { "every fixture row carries the constant root hm" ); - // Commutator: jsonb_query <@ json must agree row-for-row. + // Commutator: query_jsonb <@ json must agree row-for-row. let hits_rev: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.jsonb_query <@ payload" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.query_jsonb <@ payload" )) .fetch_one(&pool) .await?; @@ -337,7 +337,7 @@ async fn v3_jsonb_containment_oc_only(pool: PgPool) -> anyhow::Result<()> { // Row 1 must be among the matches (oc terms can repeat across rows). let row1: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -345,12 +345,12 @@ async fn v3_jsonb_containment_oc_only(pool: PgPool) -> anyhow::Result<()> { // Commutator agreement over the whole table. let fwd: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" )) .fetch_one(&pool) .await?; let rev: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.jsonb_query <@ payload" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.query_jsonb <@ payload" )) .fetch_one(&pool) .await?; @@ -403,7 +403,7 @@ async fn v3_jsonb_containment_mixed(pool: PgPool) -> anyhow::Result<()> { let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm), (SEL_HELLO_OC, "oc", &oc)]); let row1: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -625,7 +625,7 @@ async fn v3_jsonb_containment_rejects_wrong_bytes(pool: PgPool) -> anyhow::Resul let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -637,7 +637,7 @@ async fn v3_jsonb_containment_rejects_wrong_bytes(pool: PgPool) -> anyhow::Resul // Real selector, WRONG hm bytes — must match nothing. let n = needle(&[(SEL_ROOT_HM, "hm", "deadbeefdeadbeefdeadbeefdeadbeef")]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -664,12 +664,12 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R let oc_needle = needle(&[(COLLIDE_SEL, "oc", COLLIDE_TERM)]); let hm_needle = needle(&[(COLLIDE_SEL, "hm", COLLIDE_TERM)]); let collide_accept: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::public.json @> '{hm_needle}'::public.jsonb_query" + "SELECT '{hm_doc}'::public.json @> '{hm_needle}'::public.query_jsonb" )) .fetch_one(&pool) .await?; let collide_reject: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::public.json @> '{oc_needle}'::public.jsonb_query" + "SELECT '{hm_doc}'::public.json @> '{oc_needle}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -685,7 +685,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -697,7 +697,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R // An `oc`-field needle carrying the real hm term at the hm selector: rejects. let n = needle(&[(SEL_ROOT_HM, "oc", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -715,7 +715,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R .await?; let n2 = needle(&[(SEL_HELLO_OC, "hm", &oc)]); let hits2: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n2}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n2}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -733,7 +733,7 @@ async fn v3_jsonb_containment_rejects_wrong_selector(pool: PgPool) -> anyhow::Re let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -745,7 +745,7 @@ async fn v3_jsonb_containment_rejects_wrong_selector(pool: PgPool) -> anyhow::Re // Right term bytes, but a selector that exists in no fixture row. let n = needle(&[("ffffffffffffffffffffffffffffffff", "hm", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" )) .fetch_one(&pool) .await?; @@ -803,12 +803,12 @@ v3_jsonb_supported_null!( // document containment: json @> json (doc_contains_doc_lhs, "SELECT NULL::public.json @> '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), (doc_contains_doc_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.json"), - // json @> jsonb_query / json @> jsonb_entry - (doc_contains_query_lhs, "SELECT NULL::public.json @> '{\"sv\":[]}'::public.jsonb_query"), - (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.jsonb_query"), + // json @> query_jsonb / json @> jsonb_entry + (doc_contains_query_lhs, "SELECT NULL::public.json @> '{\"sv\":[]}'::public.query_jsonb"), + (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.query_jsonb"), (doc_contains_entry_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.jsonb_entry"), // <@ reverses - (query_contained_lhs, "SELECT NULL::public.jsonb_query <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), + (query_contained_lhs, "SELECT NULL::public.query_jsonb <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), (entry_contained_lhs, "SELECT NULL::public.jsonb_entry <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), ); @@ -1164,7 +1164,7 @@ v3_jsonb_payload_reject!( v3_jsonb_payload_reject!( v3_jsonb_ste_vec_query_payload_check, - "public.jsonb_query", + "public.query_jsonb", [ "[]", // non-object "{\"sv\":{}}", // sv not an array @@ -1194,7 +1194,7 @@ async fn v3_jsonb_payload_check_accepts_valid(pool: PgPool) -> anyhow::Result<() .await?; assert!(ok_entry); let ok_query: bool = sqlx::query_scalar( - "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"00\"}]}'::public.jsonb_query IS NOT NULL", + "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"00\"}]}'::public.query_jsonb IS NOT NULL", ) .fetch_one(&pool) .await?; @@ -1371,7 +1371,7 @@ async fn v3_jsonb_index_to_ste_vec_query_gin_engages(pool: PgPool) -> anyhow::Re let root_hm = root_hm_term(&pool).await?; let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let query = - format!("SELECT id FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.jsonb_query"); + format!("SELECT id FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb"); assert_index_scan_uses( &mut *tx, &query, @@ -1483,7 +1483,7 @@ async fn v3_jsonb_to_ste_vec_query_gin_is_cost_chosen(pool: PgPool) -> anyhow::R // oc, exactly the single pivot row contains it. let n = needle(&[(SEL_HELLO_OC, "oc", &pivot_oc)]); let query = - format!("SELECT count(*) FROM v3_jsonb_scale WHERE payload @> '{n}'::public.jsonb_query"); + format!("SELECT count(*) FROM v3_jsonb_scale WHERE payload @> '{n}'::public.query_jsonb"); assert_index_scan_uses( &mut *tx, &query, diff --git a/tests/sqlx/tests/v3_public_surface_tests.rs b/tests/sqlx/tests/v3_public_surface_tests.rs index 2c439c8e2..4c7941098 100644 --- a/tests/sqlx/tests/v3_public_surface_tests.rs +++ b/tests/sqlx/tests/v3_public_surface_tests.rs @@ -106,7 +106,7 @@ fn user_domain_names() -> Vec { } } names.extend( - ["json", "jsonb_entry", "jsonb_query"] + ["json", "jsonb_entry", "query_jsonb"] .into_iter() .map(String::from), ); diff --git a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs index 0f4a72f47..304ba743b 100644 --- a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs +++ b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs @@ -1,11 +1,11 @@ -//! CIP-3432 conformance: a term-only query operand (`public._query` — the +//! CIP-3432 conformance: a term-only query operand (`public.query_` — the //! index terms only, NO ciphertext `c`) matches stored rows through the //! generated query operators, using FRESH ZeroKMS encryption for both the //! stored values AND the query value. //! //! This is the end-to-end proof the operator surface exists for: two //! INDEPENDENT encryptions of the same plaintext produce equal index terms that -//! the `(storage_domain, _query)` operator equates — with the query +//! the `(storage_domain, query_)` operator equates — with the query //! operand carrying no decryptable ciphertext. Gated behind `proptest-e2e` //! (needs `CS_*` creds at test time), like the rest of the fresh-encryption //! suite. @@ -61,7 +61,7 @@ async fn eq_term_only_operand_matches_exactly_the_equal_rows(pool: PgPool) -> Re ); let matches: i64 = - sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.integer_eq_query") + sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.query_integer_eq") .bind(operand.to_string()) .fetch_one(&pool) .await?; @@ -73,7 +73,7 @@ async fn eq_term_only_operand_matches_exactly_the_equal_rows(pool: PgPool) -> Re // A value never stored matches nothing (the eq-false branch). let absent = to_query_operand(encrypt_one(99, &[IndexKind::Unique]).await?); let none: i64 = - sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.integer_eq_query") + sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.query_integer_eq") .bind(absent.to_string()) .fetch_one(&pool) .await?; @@ -98,7 +98,7 @@ async fn ord_term_only_operand_orders_via_the_ore_operator(pool: PgPool) -> Resu // A term-only ordering operand for 25 (never stored): `< 25` → {10, 20}. let operand = to_query_operand(encrypt_one(25, &[IndexKind::Ore]).await?); let below: i64 = sqlx::query_scalar( - "SELECT count(*) FROM q WHERE val < $1::jsonb::public.integer_ord_query", + "SELECT count(*) FROM q WHERE val < $1::jsonb::public.query_integer_ord", ) .bind(operand.to_string()) .fetch_one(&pool) @@ -107,7 +107,7 @@ async fn ord_term_only_operand_orders_via_the_ore_operator(pool: PgPool) -> Resu // The commutator direction resolves too: `operand > val`. let above: i64 = sqlx::query_scalar( - "SELECT count(*) FROM q WHERE $1::jsonb::public.integer_ord_query > val", + "SELECT count(*) FROM q WHERE $1::jsonb::public.query_integer_ord > val", ) .bind(operand.to_string()) .fetch_one(&pool) @@ -125,7 +125,7 @@ async fn query_domain_rejects_a_ciphertext_bearing_operand(pool: PgPool) -> Resu // `c`) must not be accepted as a query operand. let stored = encrypt_one(7, &[IndexKind::Unique]).await?; assert!(stored.as_object().unwrap().contains_key("c")); - let err = sqlx::query("SELECT $1::jsonb::public.integer_eq_query") + let err = sqlx::query("SELECT $1::jsonb::public.query_integer_eq") .bind(stored.to_string()) .execute(&pool) .await diff --git a/tests/sqlx/tests/v3_uninstall_tests.rs b/tests/sqlx/tests/v3_uninstall_tests.rs index 8f4322f18..59b66afc9 100644 --- a/tests/sqlx/tests/v3_uninstall_tests.rs +++ b/tests/sqlx/tests/v3_uninstall_tests.rs @@ -142,7 +142,7 @@ async fn shipped_installer_can_run_over_existing_public_domains(pool: PgPool) -> FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = 'public' - AND t.typname IN ('integer_eq', 'json', 'jsonb_entry', 'jsonb_query') + AND t.typname IN ('integer_eq', 'json', 'jsonb_entry', 'query_jsonb') ORDER BY 1 "#, ) @@ -158,7 +158,7 @@ async fn shipped_installer_can_run_over_existing_public_domains(pool: PgPool) -> "public.integer_eq", "public.json", "public.jsonb_entry", - "public.jsonb_query", + "public.query_jsonb", ], "repeat install must keep public user-column domains available" ); @@ -187,7 +187,7 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( id integer PRIMARY KEY, scalar_value public.integer_eq NOT NULL, doc_value public.json NOT NULL, - query_value public.jsonb_query NOT NULL, + query_value public.query_jsonb NOT NULL, entry_value public.jsonb_entry ) "#, @@ -204,7 +204,7 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( 1, $1::jsonb::public.integer_eq, $2::jsonb::public.json, - $3::jsonb::public.jsonb_query, + $3::jsonb::public.query_jsonb, $4::jsonb::public.jsonb_entry ) "#, @@ -260,7 +260,7 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( "pg_catalog.int4", "public.integer_eq", "public.json", - "public.jsonb_query", + "public.query_jsonb", "public.jsonb_entry", ] ); From c6f5e01d9ddb7f03d5c07d3b607dd0c030d16330 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Wed, 8 Jul 2026 01:10:56 +1000 Subject: [PATCH 555/599] test(eql v3): make the operator-equivalents structural scan non-vacuous MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The #1 gate filtered operand types on nspname = 'eql_v3', but no type lives in that schema (domains are in public, SEM term types in eql_v3_internal), so the scan matched zero operators and passed vacuously — the invariant was really held up by the name checks and the codegen. Identify EQL operands by catalog domain name in the public namespace instead (including the query_ twins), and assert the scan matches a healthy floor of operators before trusting an empty offender list. --- .../tests/v3_operator_equivalents_tests.rs | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/tests/sqlx/tests/v3_operator_equivalents_tests.rs b/tests/sqlx/tests/v3_operator_equivalents_tests.rs index 74aa9d0ca..887bf0fef 100644 --- a/tests/sqlx/tests/v3_operator_equivalents_tests.rs +++ b/tests/sqlx/tests/v3_operator_equivalents_tests.rs @@ -23,17 +23,48 @@ use anyhow::Result; use sqlx::PgPool; -/// #1 — Every operator that operates on an `eql_v3` domain and is backed by a +/// Every EQL domain name in the `public` schema, from the catalog: the storage +/// and capability domains of every family (including the jsonb SteVec three) +/// plus the `query_` operand twin of every term-bearing scalar domain. +/// The structural scan below identifies "an EQL operator" by these names — the +/// domains deliberately live in `public` (dropping EQL-owned schemas must not +/// drop application columns), so a namespace filter alone cannot find them. +fn eql_public_domain_names() -> Vec { + let mut names: Vec = eql_domains::CATALOG + .iter() + .flat_map(|f| f.domains.iter().map(move |d| d.full_name(f.name))) + .collect(); + names.extend(eql_domains::scalar_families().flat_map(|f| { + f.domains + .iter() + .filter(|d| !d.terms.is_empty()) + .map(move |d| d.query_name(f.name)) + })); + names +} + +/// #1 — Every operator that operates on an EQL domain and is backed by a /// real comparison WRAPPER (a `LANGUAGE sql` function — blockers are /// `LANGUAGE plpgsql`) must have that wrapper in the PUBLIC `eql_v3` schema. /// /// An offender is a supported operator whose function equivalent is hidden in /// `eql_v3_internal`, where an operator-free caller cannot reach it. +/// +/// EQL domains are identified by catalog name in the `public` namespace (no +/// type lives in the `eql_v3` schema itself — an earlier `nspname = 'eql_v3'` +/// filter matched zero operators and the scan passed vacuously). The test +/// first asserts the scan MATCHES a healthy number of operators, so it can +/// never silently rot back into vacuous-pass. #[sqlx::test] async fn every_supported_eql_v3_operator_has_a_public_function_equivalent( pool: PgPool, ) -> Result<()> { - let offenders: Vec<(String, String, String)> = sqlx::query_as( + let domains = eql_public_domain_names(); + + // All operators touching an EQL domain, wrapper-backed (LANGUAGE sql) or + // not, with the backing function's schema. One scan, partitioned in Rust: + // non-vacuousness first, then the offender assertion. + let scanned: Vec<(String, String, String, String)> = sqlx::query_as( r#" SELECT o.oprname::text, @@ -41,7 +72,8 @@ async fn every_supported_eql_v3_operator_has_a_public_function_equivalent( format('%s %s %s', lt.typname, o.oprname, - COALESCE(rt.typname, '')) AS operator_shape + COALESCE(rt.typname, '')) AS operator_shape, + l.lanname::text FROM pg_catalog.pg_operator o JOIN pg_catalog.pg_proc p ON p.oid = o.oprcode JOIN pg_catalog.pg_namespace pn ON pn.oid = p.pronamespace @@ -50,15 +82,36 @@ async fn every_supported_eql_v3_operator_has_a_public_function_equivalent( JOIN pg_catalog.pg_namespace ln ON ln.oid = lt.typnamespace LEFT JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright LEFT JOIN pg_catalog.pg_namespace rn ON rn.oid = rt.typnamespace - WHERE (ln.nspname = 'eql_v3' OR rn.nspname = 'eql_v3') -- touches an eql_v3 domain - AND l.lanname = 'sql' -- a supported wrapper, not a plpgsql blocker - AND pn.nspname <> 'eql_v3' -- OFFENDER: backing wrapper is not public + WHERE (ln.nspname = 'public' AND lt.typname = ANY($1)) + OR (rn.nspname = 'public' AND rt.typname = ANY($1)) ORDER BY 3, 1 "#, ) + .bind(&domains) .fetch_all(&pool) .await?; + // Anti-vacuousness guard: the generated surface binds hundreds of + // operators to EQL domains (10 scalar families x supported ops x operand + // shapes, plus the jsonb surface). If the scan stops matching, the filter + // is broken — fail loudly instead of passing on an empty set. + assert!( + scanned.len() >= 100, + "the structural scan matched only {} operators on EQL domains — the \ + domain-name filter is broken (vacuous pass), fix the query instead of \ + trusting an empty offender list", + scanned.len() + ); + + // A supported wrapper is LANGUAGE sql (blockers are plpgsql and stay + // internal by design). Its backing function must be public. + let offenders: Vec<&(String, String, String, String)> = scanned + .iter() + .filter(|(_, backing_fn, _, lanname)| { + lanname == "sql" && !backing_fn.starts_with("eql_v3.") + }) + .collect(); + assert!( offenders.is_empty(), "Supported eql_v3 operators must be backed by a PUBLIC eql_v3 function so \ From 39aee45f4eaba09c338baa2bdc974e89f1a51076 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Wed, 8 Jul 2026 12:19:02 +1000 Subject: [PATCH 556/599] feat(eql v3)!: move query-operand domains into the eql_v3 schema (CIP-3442) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every query-operand domain — the scalar query_ twins and the jsonb containment needle query_jsonb — now lives in eql_v3, not public: WHERE col = $1::eql_v3.query_integer_eq; WHERE doc @> $1::eql_v3.query_jsonb. Why: a query operand is never a valid column type, so it does not belong in the column-type namespace. The survive-schema-drop rationale for public placement (dropping EQL-owned schemas must not drop application columns) doesn't apply to a type no application column should use; in eql_v3 the operands are versioned and uninstalled with the rest of the public API surface, and casting requires the same USAGE ON SCHEMA eql_v3 a querying role already needs for the extractors and wrappers. - codegen: query_domain_name qualifies query twins with SCHEMA; the query_types template creates/comments the domains in eql_v3. - bindings: DomainType::sql_domain is eql_v3.query_; DomainType::domain now strips whichever schema qualifies sql_domain. - Uninstall semantics pinned: a column misusing a query-operand domain is dropped with the schema (CASCADE); column-domain tables still survive. - New public-surface pin: query_operand_domains_are_eql_v3_jsonb_domains (mirror of the user-column placement pins, which now exclude the needle). - Docs: U-002 extended to cover the schema move; permissions.md gains the query-operand cast row; CHANGELOG entries updated. --- CHANGELOG.md | 2 +- CLAUDE.md | 4 +- SUPABASE.md | 2 +- crates/eql-bindings/CHANGELOG.md | 23 +- .../eql-bindings/bindings/v3/BigintEqQuery.ts | 2 +- .../bindings/v3/BigintOrdOpeQuery.ts | 2 +- .../bindings/v3/BigintOrdOreQuery.ts | 2 +- .../bindings/v3/BigintOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/DateEqQuery.ts | 2 +- .../bindings/v3/DateOrdOpeQuery.ts | 2 +- .../bindings/v3/DateOrdOreQuery.ts | 2 +- .../eql-bindings/bindings/v3/DateOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/DoubleEqQuery.ts | 2 +- .../bindings/v3/DoubleOrdOpeQuery.ts | 2 +- .../bindings/v3/DoubleOrdOreQuery.ts | 2 +- .../bindings/v3/DoubleOrdQuery.ts | 2 +- .../bindings/v3/IntegerEqQuery.ts | 2 +- .../bindings/v3/IntegerOrdOpeQuery.ts | 2 +- .../bindings/v3/IntegerOrdOreQuery.ts | 2 +- .../bindings/v3/IntegerOrdQuery.ts | 2 +- .../bindings/v3/NumericEqQuery.ts | 2 +- .../bindings/v3/NumericOrdOpeQuery.ts | 2 +- .../bindings/v3/NumericOrdOreQuery.ts | 2 +- .../bindings/v3/NumericOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/RealEqQuery.ts | 2 +- .../bindings/v3/RealOrdOpeQuery.ts | 2 +- .../bindings/v3/RealOrdOreQuery.ts | 2 +- .../eql-bindings/bindings/v3/RealOrdQuery.ts | 2 +- .../bindings/v3/SmallintEqQuery.ts | 2 +- .../bindings/v3/SmallintOrdOpeQuery.ts | 2 +- .../bindings/v3/SmallintOrdOreQuery.ts | 2 +- .../bindings/v3/SmallintOrdQuery.ts | 2 +- .../eql-bindings/bindings/v3/SteVecQuery.ts | 2 +- .../eql-bindings/bindings/v3/TextEqQuery.ts | 2 +- .../bindings/v3/TextMatchQuery.ts | 2 +- .../bindings/v3/TextOrdOpeQuery.ts | 2 +- .../bindings/v3/TextOrdOreQuery.ts | 2 +- .../eql-bindings/bindings/v3/TextOrdQuery.ts | 2 +- .../bindings/v3/TextSearchQuery.ts | 2 +- .../bindings/v3/TimestampEqQuery.ts | 2 +- .../bindings/v3/TimestampOrdOpeQuery.ts | 2 +- .../bindings/v3/TimestampOrdOreQuery.ts | 2 +- .../bindings/v3/TimestampOrdQuery.ts | 2 +- .../schema/v3/query_bigint_eq.json | 2 +- .../schema/v3/query_bigint_ord.json | 2 +- .../schema/v3/query_bigint_ord_ope.json | 2 +- .../schema/v3/query_bigint_ord_ore.json | 2 +- .../eql-bindings/schema/v3/query_date_eq.json | 2 +- .../schema/v3/query_date_ord.json | 2 +- .../schema/v3/query_date_ord_ope.json | 2 +- .../schema/v3/query_date_ord_ore.json | 2 +- .../schema/v3/query_double_eq.json | 2 +- .../schema/v3/query_double_ord.json | 2 +- .../schema/v3/query_double_ord_ope.json | 2 +- .../schema/v3/query_double_ord_ore.json | 2 +- .../schema/v3/query_integer_eq.json | 2 +- .../schema/v3/query_integer_ord.json | 2 +- .../schema/v3/query_integer_ord_ope.json | 2 +- .../schema/v3/query_integer_ord_ore.json | 2 +- .../eql-bindings/schema/v3/query_jsonb.json | 2 +- .../schema/v3/query_numeric_eq.json | 2 +- .../schema/v3/query_numeric_ord.json | 2 +- .../schema/v3/query_numeric_ord_ope.json | 2 +- .../schema/v3/query_numeric_ord_ore.json | 2 +- .../eql-bindings/schema/v3/query_real_eq.json | 2 +- .../schema/v3/query_real_ord.json | 2 +- .../schema/v3/query_real_ord_ope.json | 2 +- .../schema/v3/query_real_ord_ore.json | 2 +- .../schema/v3/query_smallint_eq.json | 2 +- .../schema/v3/query_smallint_ord.json | 2 +- .../schema/v3/query_smallint_ord_ope.json | 2 +- .../schema/v3/query_smallint_ord_ore.json | 2 +- .../eql-bindings/schema/v3/query_text_eq.json | 2 +- .../schema/v3/query_text_match.json | 2 +- .../schema/v3/query_text_ord.json | 2 +- .../schema/v3/query_text_ord_ope.json | 2 +- .../schema/v3/query_text_ord_ore.json | 2 +- .../schema/v3/query_text_search.json | 2 +- .../schema/v3/query_timestamp_eq.json | 2 +- .../schema/v3/query_timestamp_ord.json | 2 +- .../schema/v3/query_timestamp_ord_ope.json | 2 +- .../schema/v3/query_timestamp_ord_ore.json | 2 +- crates/eql-bindings/src/v3/bigint.rs | 16 +- crates/eql-bindings/src/v3/date.rs | 16 +- crates/eql-bindings/src/v3/domain_type.rs | 13 +- crates/eql-bindings/src/v3/double.rs | 16 +- crates/eql-bindings/src/v3/integer.rs | 16 +- crates/eql-bindings/src/v3/inventory.rs | 2 +- crates/eql-bindings/src/v3/jsonb.rs | 4 +- crates/eql-bindings/src/v3/numeric.rs | 16 +- crates/eql-bindings/src/v3/query_payload.rs | 84 +- crates/eql-bindings/src/v3/real.rs | 16 +- crates/eql-bindings/src/v3/smallint.rs | 16 +- crates/eql-bindings/src/v3/text.rs | 24 +- crates/eql-bindings/src/v3/timestamp.rs | 16 +- crates/eql-bindings/tests/catalog_parity.rs | 6 +- crates/eql-bindings/tests/query_payload.rs | 8 +- crates/eql-bindings/tests/v3_conformance.rs | 4 +- crates/eql-codegen/src/bindings.rs | 35 +- crates/eql-codegen/src/context.rs | 10 + crates/eql-codegen/src/dump.rs | 4 +- crates/eql-codegen/src/generate.rs | 15 +- .../eql-codegen/templates/query_types.sql.j2 | 14 +- docs/reference/catalog-driven-architecture.md | 2 +- docs/reference/database-indexes.md | 4 +- docs/reference/json-support.md | 12 +- docs/reference/permissions.md | 3 +- docs/reference/sql-support.md | 4 +- docs/tutorials/proxy-configuration.md | 4 +- docs/upgrading/v3.0.md | 72 +- src/v3/jsonb/operators.sql | 12 +- src/v3/jsonb/types.sql | 24 +- .../bigint/query_bigint_eq_functions.sql | 32 +- .../bigint/query_bigint_eq_operators.sql | 10 +- .../bigint/query_bigint_ord_functions.sql | 80 +- .../bigint/query_bigint_ord_ope_functions.sql | 80 +- .../bigint/query_bigint_ord_ope_operators.sql | 26 +- .../bigint/query_bigint_ord_operators.sql | 26 +- .../bigint/query_bigint_ord_ore_functions.sql | 80 +- .../bigint/query_bigint_ord_ore_operators.sql | 26 +- src/v3/scalars/bigint/query_bigint_types.sql | 38 +- .../scalars/date/query_date_eq_functions.sql | 32 +- .../scalars/date/query_date_eq_operators.sql | 10 +- .../scalars/date/query_date_ord_functions.sql | 80 +- .../date/query_date_ord_ope_functions.sql | 80 +- .../date/query_date_ord_ope_operators.sql | 26 +- .../scalars/date/query_date_ord_operators.sql | 26 +- .../date/query_date_ord_ore_functions.sql | 80 +- .../date/query_date_ord_ore_operators.sql | 26 +- src/v3/scalars/date/query_date_types.sql | 38 +- .../double/query_double_eq_functions.sql | 32 +- .../double/query_double_eq_operators.sql | 10 +- .../double/query_double_ord_functions.sql | 80 +- .../double/query_double_ord_ope_functions.sql | 80 +- .../double/query_double_ord_ope_operators.sql | 26 +- .../double/query_double_ord_operators.sql | 26 +- .../double/query_double_ord_ore_functions.sql | 80 +- .../double/query_double_ord_ore_operators.sql | 26 +- src/v3/scalars/double/query_double_types.sql | 38 +- .../integer/query_integer_eq_functions.sql | 32 +- .../integer/query_integer_eq_operators.sql | 10 +- .../integer/query_integer_ord_functions.sql | 80 +- .../query_integer_ord_ope_functions.sql | 80 +- .../query_integer_ord_ope_operators.sql | 26 +- .../integer/query_integer_ord_operators.sql | 26 +- .../query_integer_ord_ore_functions.sql | 80 +- .../query_integer_ord_ore_operators.sql | 26 +- .../scalars/integer/query_integer_types.sql | 38 +- .../numeric/query_numeric_eq_functions.sql | 32 +- .../numeric/query_numeric_eq_operators.sql | 10 +- .../numeric/query_numeric_ord_functions.sql | 80 +- .../query_numeric_ord_ope_functions.sql | 80 +- .../query_numeric_ord_ope_operators.sql | 26 +- .../numeric/query_numeric_ord_operators.sql | 26 +- .../query_numeric_ord_ore_functions.sql | 80 +- .../query_numeric_ord_ore_operators.sql | 26 +- .../scalars/numeric/query_numeric_types.sql | 38 +- .../scalars/real/query_real_eq_functions.sql | 32 +- .../scalars/real/query_real_eq_operators.sql | 10 +- .../scalars/real/query_real_ord_functions.sql | 80 +- .../real/query_real_ord_ope_functions.sql | 80 +- .../real/query_real_ord_ope_operators.sql | 26 +- .../scalars/real/query_real_ord_operators.sql | 26 +- .../real/query_real_ord_ore_functions.sql | 80 +- .../real/query_real_ord_ore_operators.sql | 26 +- src/v3/scalars/real/query_real_types.sql | 38 +- .../smallint/query_smallint_eq_functions.sql | 32 +- .../smallint/query_smallint_eq_operators.sql | 10 +- .../smallint/query_smallint_ord_functions.sql | 80 +- .../query_smallint_ord_ope_functions.sql | 80 +- .../query_smallint_ord_ope_operators.sql | 26 +- .../smallint/query_smallint_ord_operators.sql | 26 +- .../query_smallint_ord_ore_functions.sql | 80 +- .../query_smallint_ord_ore_operators.sql | 26 +- .../scalars/smallint/query_smallint_types.sql | 38 +- .../scalars/text/query_text_eq_functions.sql | 32 +- .../scalars/text/query_text_eq_operators.sql | 10 +- .../text/query_text_match_functions.sql | 32 +- .../text/query_text_match_operators.sql | 10 +- .../scalars/text/query_text_ord_functions.sql | 86 +- .../text/query_text_ord_ope_functions.sql | 86 +- .../text/query_text_ord_ope_operators.sql | 26 +- .../scalars/text/query_text_ord_operators.sql | 26 +- .../text/query_text_ord_ore_functions.sql | 86 +- .../text/query_text_ord_ore_operators.sql | 26 +- .../text/query_text_search_functions.sql | 116 +-- .../text/query_text_search_operators.sql | 34 +- src/v3/scalars/text/query_text_types.sql | 54 +- .../query_timestamp_eq_functions.sql | 32 +- .../query_timestamp_eq_operators.sql | 10 +- .../query_timestamp_ord_functions.sql | 80 +- .../query_timestamp_ord_ope_functions.sql | 80 +- .../query_timestamp_ord_ope_operators.sql | 26 +- .../query_timestamp_ord_operators.sql | 26 +- .../query_timestamp_ord_ore_functions.sql | 80 +- .../query_timestamp_ord_ore_operators.sql | 26 +- .../timestamp/query_timestamp_types.sql | 38 +- tasks/docs/generate/test_xml_to_json.py | 2 +- tasks/docs/generate/xml-to-json.py | 9 +- tasks/test/clean_install_v3.sh | 4 +- tasks/test/splinter.sh | 2 +- .../sqlx/snapshots/eql_v3_public_surface.txt | 852 +++++++++--------- tests/sqlx/src/property.rs | 13 +- .../encrypted_domain/family/jsonb_check.rs | 6 +- .../tests/encrypted_domain/ope/support.rs | 2 +- tests/sqlx/tests/v3_jsonb_bindings_tests.rs | 2 +- .../tests/v3_jsonb_operator_surface_tests.rs | 8 +- tests/sqlx/tests/v3_jsonb_tests.rs | 46 +- .../tests/v3_operator_equivalents_tests.rs | 58 +- tests/sqlx/tests/v3_public_surface_tests.rs | 92 +- .../tests/v3_scalar_query_operand_tests.rs | 12 +- tests/sqlx/tests/v3_uninstall_tests.rs | 95 +- 212 files changed, 2959 insertions(+), 2727 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f952cac63..d35e1e5f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,7 +62,7 @@ Each entry that ships in a published release links to the PR that introduced it. ### Changed -- **Query-operand domains renamed from the `_query` suffix to a `query_` prefix (CIP-3442).** Every scalar query twin introduced by the query-operand surface (above) is now `public.query_` — `query_integer_eq`, `query_text_ord`, `query_timestamp_ord_ope`, … — and the encrypted-JSONB containment needle follows the same convention: `public.jsonb_query` is now `public.query_jsonb`. Predicates cast accordingly (`WHERE col = $1::public.query_integer_eq`; `WHERE doc @> $1::public.query_jsonb`), the `eql-bindings` `DomainType::sql_domain` strings, `QueryPayload::parse` domain names, and the exported JSON Schema file names (`schema/v3/query_.json`) all carry the new names, and `from_v2_query` / `from_v2_query_typed` target them. This supersedes the `_query` naming in the earlier `[Unreleased]` entries; the old names shipped only in 3.0.0 pre-releases. **Why:** the query-operand domains live in `public` alongside the column domains they twin, so Supabase Studio's Table Builder type picker (and any alphabetical type listing) interleaved them with the actual column types (`integer_eq` next to `integer_eq_query`). A shared `query_` prefix makes every never-a-column-type query operand sort together, apart from the column domains. See [U-002](docs/upgrading/v3.0.md#u-002-query-operand-domains-use-the-query_-prefix) in the 3.0 upgrade guide. ([CIP-3442](https://linear.app/cipherstash/issue/CIP-3442)) +- **Query-operand domains renamed to a `query_` prefix AND moved into the `eql_v3` schema (CIP-3442).** Every scalar query twin introduced by the query-operand surface (above) is now `eql_v3.query_` — `query_integer_eq`, `query_text_ord`, `query_timestamp_ord_ope`, … — and the encrypted-JSONB containment needle follows the same convention: `public.jsonb_query` is now `eql_v3.query_jsonb`. Predicates cast accordingly (`WHERE col = $1::eql_v3.query_integer_eq`; `WHERE doc @> $1::eql_v3.query_jsonb`), the `eql-bindings` `DomainType::sql_domain` strings, `QueryPayload::parse` domain names, and the exported JSON Schema file names (`schema/v3/query_.json`) all carry the new names, and `from_v2_query` / `from_v2_query_typed` target them. This supersedes the `_query` naming in the earlier `[Unreleased]` entries; the old names shipped only in 3.0.0 pre-releases. **Why the prefix:** alphabetical type listings interleaved never-a-column-type query operands with the actual column types (`integer_eq` next to `integer_eq_query`); the shared `query_` prefix sorts every query operand together. **Why the schema move:** query operands are never valid column types, so they don't belong in `public` — the column-type namespace whose survive-schema-drop rationale (dropping EQL-owned schemas must not drop application columns) doesn't apply to them. In `eql_v3` they are versioned with the rest of the public API surface, are uninstalled with it (a column misusing a query domain is dropped by the uninstaller's CASCADE — pinned by the uninstall suite), and casting a query operand requires the same `USAGE ON SCHEMA eql_v3` a caller already needs for the extractors and comparison wrappers. See [U-002](docs/upgrading/v3.0.md#u-002-query-operand-domains-are-eql_v3query_name) in the 3.0 upgrade guide. ([CIP-3442](https://linear.app/cipherstash/issue/CIP-3442)) - **The `eql_v3` tier's JSON envelope version is now `v: 3` (was `v: 2`).** Every `eql_v3` domain CHECK — the generated scalar families and the hand-written `eql_v3.json` SteVec document domain — now pins `VALUE->>'v' = '3'`, and the canonical payload bindings (`SchemaVersion` in `eql-bindings`, the emitted TypeScript alias, and the JSON Schema `const`) accept exactly `3`, rejecting the legacy `2` at the type boundary. The v3 tier previously carried the v2 wire version for continuity; with the tier now diverging from the legacy wire (the new `op` term), the envelope version matches the schema generation. The legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json` and its validation tests) is unchanged and stays `v: 2`. **Compatibility:** payloads produced for the v3 tier must now carry `v: 3` — a cipherstash-client that emits `v: 2` cannot insert into `eql_v3` domain columns until it is updated to emit the v3 envelope. See [U-001](docs/upgrading/v3.0.md#u-001-eql_v3-payloads-carry-v-3) in the 3.0 upgrade guide. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340)) - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`integer`, `bigint`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252)) diff --git a/CLAUDE.md b/CLAUDE.md index 3f59ef1c0..1fa402d40 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,7 +49,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Directory Structure - `src/` - contains only the self-contained `v3` surface (the modular `eql_v2` component directories were removed in 3.0.0) - `crates/` - Rust workspace: `eql-domains` (the catalog), `eql-codegen` (SQL/bindings generator), `eql-bindings` (payload bindings), `eql-tests-macros` -- `src/v3/` - Self-contained `eql_v3` / `eql_v3_internal` surface: `src/v3/schema.sql` (creates both schemas), forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_256`) — now created in `eql_v3_internal` — the generated scalar encrypted-domain families under `src/v3/scalars//` (user-column domains in `public`; extractors **and the supported comparison wrappers** in `eql_v3`; only the blockers and aggregate state functions in `eql_v3_internal`; plus the shared blocker `src/v3/scalars/functions.sql`), and the hand-written encrypted-JSONB (SteVec) surface under `src/v3/jsonb/` (`types.sql`, `functions.sql`, `operators.sql`, `aggregates.sql`, `blockers.sql` — the `public.json` / `public.jsonb_entry` / `public.query_jsonb` domains and CHECK validators live in `public`; typed operators, `jsonb_entry` comparison wrappers, the containment engine (`ste_vec_contains`), and raw-jsonb GIN helpers (`jsonb_array` / `jsonb_contains` / `jsonb_contained_by`) live in `eql_v3`; only the `is_ste_vec_array` helper and aggregate state functions live in `eql_v3_internal`) +- `src/v3/` - Self-contained `eql_v3` / `eql_v3_internal` surface: `src/v3/schema.sql` (creates both schemas), forked `src/v3/crypto.sql` / `src/v3/common.sql`, hand-written SEM index-term types under `src/v3/sem/` (`hmac_256`, `ore_block_256`) — now created in `eql_v3_internal` — the generated scalar encrypted-domain families under `src/v3/scalars//` (user-column domains in `public`; extractors **and the supported comparison wrappers** in `eql_v3`; only the blockers and aggregate state functions in `eql_v3_internal`; plus the shared blocker `src/v3/scalars/functions.sql`), and the hand-written encrypted-JSONB (SteVec) surface under `src/v3/jsonb/` (`types.sql`, `functions.sql`, `operators.sql`, `aggregates.sql`, `blockers.sql` — the `public.json` / `public.jsonb_entry` column domains and their CHECK validators live in `public`, while the containment needle `eql_v3.query_jsonb` — a query operand, never a column type — lives in `eql_v3` (CIP-3442); typed operators, `jsonb_entry` comparison wrappers, the containment engine (`ste_vec_contains`), and raw-jsonb GIN helpers (`jsonb_array` / `jsonb_contains` / `jsonb_contained_by`) live in `eql_v3`; only the `is_ste_vec_array` helper and aggregate state functions live in `eql_v3_internal`) - `tasks/` - mise task scripts - `tests/sqlx/` - Rust/SQLx test framework (PostgreSQL 14-17 support) - `release/` - Generated SQL installation files @@ -63,7 +63,7 @@ This is the **Encrypt Query Language (EQL)** - a PostgreSQL extension for search ### Encrypted-Domain Types -`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`public` schema**, one domain per operator/index capability (`public.` storage-only, `public._eq`, `public._ord`). The domains are `public.integer`, `public.integer_eq`, `public.integer_ord`, `public.integer_ord_ore`; their extractors (`eql_v3.eq_term`, `eql_v3.ord_term`), aggregates (`eql_v3.min`/`max`), **and the supported comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) all live in **`eql_v3`** — the wrappers are public so every operator has a callable function equivalent (Supabase/PostgREST). Only the **blockers** (for unsupported operators — they just raise), the **aggregate state functions**, and the SEM index-term types the extractors/wrappers return and construct (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`) live in **`eql_v3_internal`** — hand-written under `src/v3/sem/`, schema-qualified via the codegen's `INTERNAL_SCHEMA` constant for the generated surface (the codegen's `SCHEMA` constant qualifies the public wrappers; the `operator_entry` renderer picks the backing function's schema by whether the operator is supported) — so the whole v3 surface (both schemas together) is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `public.integer` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `integer`, `smallint`, `bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, and `double`, all following this materializer pattern. `jsonb` is a `CATALOG` family too, but a permanently **hand-written**, not generated, one: its three domains (`public.json` document, `public.jsonb_entry`, `public.query_jsonb`) carry `Shape::SteVecDocument` / `SteVecEntry` / `SteVecQuery` (the `Shape` enum in `crates/eql-domains/src/lib.rs`) instead of `Shape::Scalar`, and their SQL lives under `src/v3/jsonb/` rather than `src/v3/scalars//` — `eql-codegen` renders SQL only for `scalar_families()` (the `Shape::Scalar` rows), so the fixed-envelope ordered-scalar materializer described below never touches `jsonb`. This is a deliberate, permanent split, not a gap awaiting a future generator. +`src/v3/scalars/` holds the generated **encrypted-domain type families** — jsonb-backed PostgreSQL domains in the **`public` schema**, one domain per operator/index capability (`public.` storage-only, `public._eq`, `public._ord`), plus an `eql_v3.query__` **query-operand twin** per term-bearing domain (index-terms-only, no ciphertext `c`; in `eql_v3`, not `public`, because a query operand is never a column type — CIP-3442). The domains are `public.integer`, `public.integer_eq`, `public.integer_ord`, `public.integer_ord_ore`; their extractors (`eql_v3.eq_term`, `eql_v3.ord_term`), aggregates (`eql_v3.min`/`max`), **and the supported comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) all live in **`eql_v3`** — the wrappers are public so every operator has a callable function equivalent (Supabase/PostgREST). Only the **blockers** (for unsupported operators — they just raise), the **aggregate state functions**, and the SEM index-term types the extractors/wrappers return and construct (`eql_v3_internal.hmac_256`, `eql_v3_internal.ore_block_256`) live in **`eql_v3_internal`** — hand-written under `src/v3/sem/`, schema-qualified via the codegen's `INTERNAL_SCHEMA` constant for the generated surface (the codegen's `SCHEMA` constant qualifies the public wrappers; the `operator_entry` renderer picks the backing function's schema by whether the operator is supported) — so the whole v3 surface (both schemas together) is self-contained (no `eql_v2.` appears anywhere in v3 SQL; CI gates this via `mise run test:self_contained_v3` and the self-contained `release/cipherstash-encrypt.sql` installer). `public.integer` (PR #239, supersedes #225) is the reference scalar implementation; the catalog now generates a full surface for `integer`, `smallint`, `bigint`, `date`, `timestamp`, `numeric`, `text`, `boolean`, `real`, and `double`, all following this materializer pattern. `jsonb` is a `CATALOG` family too, but a permanently **hand-written**, not generated, one: its three domains (`public.json` document, `public.jsonb_entry`, `eql_v3.query_jsonb`) carry `Shape::SteVecDocument` / `SteVecEntry` / `SteVecQuery` (the `Shape` enum in `crates/eql-domains/src/lib.rs`) instead of `Shape::Scalar`, and their SQL lives under `src/v3/jsonb/` rather than `src/v3/scalars//` — `eql-codegen` renders SQL only for `scalar_families()` (the `Shape::Scalar` rows), so the fixed-envelope ordered-scalar materializer described below never touches `jsonb`. This is a deliberate, permanent split, not a gap awaiting a future generator. Adding a scalar encrypted-domain type is one row in the Rust catalog `eql-domains::CATALOG` (`crates/eql-domains/src/lib.rs`): a `DomainFamily` giving the type `name` (e.g. `bigint`), its `ScalarKind` (the `kind` field), the `Domain`s mapping each generated (bare) domain name to its fixed index `Term`s (`eq => [Hm]`, `ord`/`ord_ore => [Ore]`), and the `Fixture` value list. Term capabilities are fixed in the `Term` enum's `impl` methods (with unit tests): `Hm` provides equality, and `Ore` provides equality plus ordering. There is no TOML manifest and no Python — the catalog is the source of truth, validated by the compiler (an undefined term or unknown scalar is a compile error) plus catalog `#[test]`s. `mise run build` runs `cargo run -p eql-codegen`, which regenerates the scalar SQL surface into `src/v3/scalars//` from `CATALOG` at the start of every build; that surface includes supported comparison wrappers plus blockers for native `jsonb` operators that would otherwise be reachable through domain fallback. `cargo run -p eql-codegen` regenerates every type at once (the same call `mise run build` uses; there is no per-type codegen task). The generated `*_types.sql` / `*_functions.sql` / `*_operators.sql` / `*_aggregates.sql` files are **committed in place** under `src/v3/scalars//` and drift-gated by `mise run codegen:parity` (regenerate in place + `git diff` + untracked check — the same regenerate-and-diff pattern `types:check` uses for the committed bindings). They are still machine-generated: change the catalog and rebuild, never hand-edit (CI fails on drift). The per-type plaintext fixture lists the SQLx matrix consumes are **not** a generated file — they are materialised from each `CATALOG` row at compile time as `eql_domains::INT4_VALUES` / `INT2_VALUES` (the `int_values!` macro) and read directly by `ScalarType::FIXTURE_VALUES`; a Rust source of truth no longer round-trips through a committed generated `.rs`. Generated SQL carries a `-- AUTOMATICALLY GENERATED FILE` header (the project-wide marker `docs:validate` greps on); change the catalog and rebuild, never hand-edit. Hand-written SQL beyond the fixed surface goes in `src/v3/scalars//_extensions.sql` with no auto-generated header and explicit `-- REQUIRE:` edges — that file IS committed. `jsonb` (see above) never enters this pipeline: every consumer here (`generate_all`, `list-types`, the SQLx matrix) iterates `eql_domains::scalar_families()`, which excludes any non-`Shape::Scalar` row, so `jsonb` is invisible to the materializer and the matrix by construction, not by a per-type exception. diff --git a/SUPABASE.md b/SUPABASE.md index 2e251cc46..8a0f7ce21 100644 --- a/SUPABASE.md +++ b/SUPABASE.md @@ -181,7 +181,7 @@ the `eql_v3.jsonb_path_*` helper functions, all without operator classes: ```sql -- Document containment (GIN-indexable on Supabase) -SELECT * FROM orders WHERE data_encrypted @> $1::public.query_jsonb; +SELECT * FROM orders WHERE data_encrypted @> $1::eql_v3.query_jsonb; -- Field access (selector is the deterministic selector hash, typed as text) SELECT data_encrypted -> ''::text FROM orders; diff --git a/crates/eql-bindings/CHANGELOG.md b/crates/eql-bindings/CHANGELOG.md index 1c38662b4..6c96e809a 100644 --- a/crates/eql-bindings/CHANGELOG.md +++ b/crates/eql-bindings/CHANGELOG.md @@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Scalar query-operand bindings (CIP-3432).** Every term-bearing scalar domain now has a generated query twin — `IntegerEqQuery`, `IntegerOrdOpeQuery`, `TextSearchQuery`, … — the **enveloped term-only** operand `{v, i, }` - (envelope minus the ciphertext `c`) for its `public.query_` query + (envelope minus the ciphertext `c`) for its `eql_v3.query_` query domain, with matching TypeScript bindings (`bindings/v3/*Query.ts`) and JSON Schemas (`schema/v3/query_.json`). Storage-only domains (no operators) get no twin. `QueryPayload` is now catalog-generated — a variant per query @@ -23,15 +23,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- **Query-operand domain names switched to the `query_` prefix - (CIP-3442).** The SQL domain names carried by the query twins — in - `DomainType::sql_domain`, the names `QueryPayload::parse` accepts, and the - exported JSON Schema file names — are now `query_` / - `public.query_` (e.g. `query_integer_eq`), and the SteVec containment - needle is `query_jsonb` (was `jsonb_query`). Matches the renamed SQL surface - so query types sort apart from column types in Supabase Studio's type - picker; supersedes the `_query` naming shipped only in 3.0.0 - pre-releases. +- **Query-operand domain names switched to the `query_` prefix, homed + in the `eql_v3` schema (CIP-3442).** The SQL domain names carried by the + query twins — in `DomainType::sql_domain`, the names `QueryPayload::parse` + accepts, and the exported JSON Schema file names — are now `query_` / + `eql_v3.query_` (e.g. `query_integer_eq`), and the SteVec containment + needle is `eql_v3.query_jsonb` (was `public.jsonb_query`). + `DomainType::domain` now strips whichever schema qualifies `sql_domain` + (`public.` for column domains, `eql_v3.` for query operands) instead of + assuming `public.`. Matches the renamed/relocated SQL surface — query + operands are never column types, so they leave the `public` column-type + namespace; supersedes the `public._query` naming shipped only in + 3.0.0 pre-releases. - **`from_v2_query` / `from_v2_query_typed` now convert scalar query targets.** A term-bearing scalar target hoists the v2 payload's required terms into the `{v: 3, i, }` operand for its `query_` domain (dropping the diff --git a/crates/eql-bindings/bindings/v3/BigintEqQuery.ts b/crates/eql-bindings/bindings/v3/BigintEqQuery.ts index f78e98000..7166ab6c8 100644 --- a/crates/eql-bindings/bindings/v3/BigintEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_bigint_eq` — equality domain query operand. + * `eql_v3.query_bigint_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts index aee86f6fc..7c01b2c77 100644 --- a/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_bigint_ord_ope` — ordering domain query operand. + * `eql_v3.query_bigint_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts index 7b70a7d0c..28b2fc2a7 100644 --- a/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_bigint_ord_ore` — ordering domain query operand. + * `eql_v3.query_bigint_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts b/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts index 5e71c0b24..219b6f2dd 100644 --- a/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/BigintOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_bigint_ord` — ordering domain query operand. + * `eql_v3.query_bigint_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DateEqQuery.ts b/crates/eql-bindings/bindings/v3/DateEqQuery.ts index 707ca4099..39b987447 100644 --- a/crates/eql-bindings/bindings/v3/DateEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_date_eq` — equality domain query operand. + * `eql_v3.query_date_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts index 63f5fe30f..396687d7b 100644 --- a/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_date_ord_ope` — ordering domain query operand. + * `eql_v3.query_date_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts index b013cfdd4..726326377 100644 --- a/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_date_ord_ore` — ordering domain query operand. + * `eql_v3.query_date_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DateOrdQuery.ts b/crates/eql-bindings/bindings/v3/DateOrdQuery.ts index 76d4bfc57..bf3bfa66b 100644 --- a/crates/eql-bindings/bindings/v3/DateOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/DateOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_date_ord` — ordering domain query operand. + * `eql_v3.query_date_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts b/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts index 585ad61bb..3ec5ce8e7 100644 --- a/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_double_eq` — equality domain query operand. + * `eql_v3.query_double_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts index 74f15a670..7aab5ae6e 100644 --- a/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_double_ord_ope` — ordering domain query operand. + * `eql_v3.query_double_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts index 26fc2a6c5..937c44c41 100644 --- a/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_double_ord_ore` — ordering domain query operand. + * `eql_v3.query_double_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts b/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts index 3b568a68e..9b35d87d3 100644 --- a/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/DoubleOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_double_ord` — ordering domain query operand. + * `eql_v3.query_double_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts b/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts index 378c53ba2..c63844234 100644 --- a/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_integer_eq` — equality domain query operand. + * `eql_v3.query_integer_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts index e1d1d0e36..a04709d0b 100644 --- a/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_integer_ord_ope` — ordering domain query operand. + * `eql_v3.query_integer_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts index 1c074a983..e7c4c9e0b 100644 --- a/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_integer_ord_ore` — ordering domain query operand. + * `eql_v3.query_integer_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts b/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts index 6086d6c26..27952f861 100644 --- a/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/IntegerOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_integer_ord` — ordering domain query operand. + * `eql_v3.query_integer_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericEqQuery.ts b/crates/eql-bindings/bindings/v3/NumericEqQuery.ts index ef3da9f3b..aa4cd6883 100644 --- a/crates/eql-bindings/bindings/v3/NumericEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_numeric_eq` — equality domain query operand. + * `eql_v3.query_numeric_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts index 2ed5dc25d..f6f2fd8ca 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_numeric_ord_ope` — ordering domain query operand. + * `eql_v3.query_numeric_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts index 663b73a30..1b3c39a82 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_numeric_ord_ore` — ordering domain query operand. + * `eql_v3.query_numeric_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts b/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts index 57814b511..f2c7a2fc8 100644 --- a/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/NumericOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_numeric_ord` — ordering domain query operand. + * `eql_v3.query_numeric_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/RealEqQuery.ts b/crates/eql-bindings/bindings/v3/RealEqQuery.ts index 974ebca18..7eb74e86b 100644 --- a/crates/eql-bindings/bindings/v3/RealEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_real_eq` — equality domain query operand. + * `eql_v3.query_real_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts index dc419d03b..d815c3cea 100644 --- a/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_real_ord_ope` — ordering domain query operand. + * `eql_v3.query_real_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts index 34d342041..08d72e5c6 100644 --- a/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_real_ord_ore` — ordering domain query operand. + * `eql_v3.query_real_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/RealOrdQuery.ts b/crates/eql-bindings/bindings/v3/RealOrdQuery.ts index 4f2c87eb1..9867c5af4 100644 --- a/crates/eql-bindings/bindings/v3/RealOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/RealOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_real_ord` — ordering domain query operand. + * `eql_v3.query_real_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts b/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts index dbff41d30..a7909d960 100644 --- a/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_smallint_eq` — equality domain query operand. + * `eql_v3.query_smallint_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts index d66e49c43..5924a30f4 100644 --- a/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_smallint_ord_ope` — ordering domain query operand. + * `eql_v3.query_smallint_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts index ae9f64171..78e4f38d9 100644 --- a/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_smallint_ord_ore` — ordering domain query operand. + * `eql_v3.query_smallint_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts b/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts index f3536cc63..7eabe8d72 100644 --- a/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/SmallintOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_smallint_ord` — ordering domain query operand. + * `eql_v3.query_smallint_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/SteVecQuery.ts b/crates/eql-bindings/bindings/v3/SteVecQuery.ts index f2d6734f1..eb1cab954 100644 --- a/crates/eql-bindings/bindings/v3/SteVecQuery.ts +++ b/crates/eql-bindings/bindings/v3/SteVecQuery.ts @@ -2,6 +2,6 @@ import type { SteVecQueryEntry } from "./SteVecQueryEntry"; /** - * `public.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict. + * `eql_v3.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict. */ export type SteVecQuery = { sv: Array, }; diff --git a/crates/eql-bindings/bindings/v3/TextEqQuery.ts b/crates/eql-bindings/bindings/v3/TextEqQuery.ts index 1cc9400bf..00bfdb41e 100644 --- a/crates/eql-bindings/bindings/v3/TextEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_text_eq` — equality domain query operand. + * `eql_v3.query_text_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/TextMatchQuery.ts b/crates/eql-bindings/bindings/v3/TextMatchQuery.ts index 20d0ca751..4e525ab6c 100644 --- a/crates/eql-bindings/bindings/v3/TextMatchQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextMatchQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_text_match` — match domain query operand. + * `eql_v3.query_text_match` — match domain query operand. * * Operators: `@>` `<@`. Required keys: `v` `i` `bf`. */ diff --git a/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts index 5b54b77d3..ae7e69259 100644 --- a/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextOrdOpeQuery.ts @@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_text_ord_ope` — ordering domain query operand. + * `eql_v3.query_text_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts index 422279de9..00290b7cc 100644 --- a/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextOrdOreQuery.ts @@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_text_ord_ore` — ordering domain query operand. + * `eql_v3.query_text_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/TextOrdQuery.ts b/crates/eql-bindings/bindings/v3/TextOrdQuery.ts index dbc69e6c5..4fc033acb 100644 --- a/crates/eql-bindings/bindings/v3/TextOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextOrdQuery.ts @@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_text_ord` — ordering domain query operand. + * `eql_v3.query_text_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/TextSearchQuery.ts b/crates/eql-bindings/bindings/v3/TextSearchQuery.ts index fdc56f349..7a2f6c822 100644 --- a/crates/eql-bindings/bindings/v3/TextSearchQuery.ts +++ b/crates/eql-bindings/bindings/v3/TextSearchQuery.ts @@ -6,7 +6,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_text_search` — search domain query operand. + * `eql_v3.query_text_search` — search domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts b/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts index 0c82e6877..afc2e9820 100644 --- a/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampEqQuery.ts @@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_timestamp_eq` — equality domain query operand. + * `eql_v3.query_timestamp_eq` — equality domain query operand. * * Operators: `=` `<>`. Required keys: `v` `i` `hm`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts index 8acff6dc1..d35251ae3 100644 --- a/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampOrdOpeQuery.ts @@ -4,7 +4,7 @@ import type { OpeCllw } from "./OpeCllw"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_timestamp_ord_ope` — ordering domain query operand. + * `eql_v3.query_timestamp_ord_ope` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts index c6bd44de5..c5979fdbc 100644 --- a/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampOrdOreQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_timestamp_ord_ore` — ordering domain query operand. + * `eql_v3.query_timestamp_ord_ore` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts b/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts index 06d140a72..65c9ab5d5 100644 --- a/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts +++ b/crates/eql-bindings/bindings/v3/TimestampOrdQuery.ts @@ -4,7 +4,7 @@ import type { OreBlock256 } from "./OreBlock256"; import type { SchemaVersion } from "./SchemaVersion"; /** - * `public.query_timestamp_ord` — ordering domain query operand. + * `eql_v3.query_timestamp_ord` — ordering domain query operand. * * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. */ diff --git a/crates/eql-bindings/schema/v3/query_bigint_eq.json b/crates/eql-bindings/schema/v3/query_bigint_eq.json index a41e36661..1836bf657 100644 --- a/crates/eql-bindings/schema/v3/query_bigint_eq.json +++ b/crates/eql-bindings/schema/v3/query_bigint_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_bigint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_bigint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_bigint_ord.json b/crates/eql-bindings/schema/v3/query_bigint_ord.json index e8ec99d0f..027c55b16 100644 --- a/crates/eql-bindings/schema/v3/query_bigint_ord.json +++ b/crates/eql-bindings/schema/v3/query_bigint_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_bigint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_bigint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_bigint_ord_ope.json b/crates/eql-bindings/schema/v3/query_bigint_ord_ope.json index cb94a32bc..e1f7de0ed 100644 --- a/crates/eql-bindings/schema/v3/query_bigint_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_bigint_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_bigint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_bigint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_bigint_ord_ore.json b/crates/eql-bindings/schema/v3/query_bigint_ord_ore.json index 6a563d707..eed10008b 100644 --- a/crates/eql-bindings/schema/v3/query_bigint_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_bigint_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_bigint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_bigint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_date_eq.json b/crates/eql-bindings/schema/v3/query_date_eq.json index 7344ae272..984858364 100644 --- a/crates/eql-bindings/schema/v3/query_date_eq.json +++ b/crates/eql-bindings/schema/v3/query_date_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_date_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_date_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_date_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_date_ord.json b/crates/eql-bindings/schema/v3/query_date_ord.json index 4e9451214..a958a401c 100644 --- a/crates/eql-bindings/schema/v3/query_date_ord.json +++ b/crates/eql-bindings/schema/v3/query_date_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_date_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_date_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_date_ord_ope.json b/crates/eql-bindings/schema/v3/query_date_ord_ope.json index 240eed1a9..92e8e960f 100644 --- a/crates/eql-bindings/schema/v3/query_date_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_date_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_date_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_date_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_date_ord_ore.json b/crates/eql-bindings/schema/v3/query_date_ord_ore.json index 8566b6c9c..cc68f5d67 100644 --- a/crates/eql-bindings/schema/v3/query_date_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_date_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_date_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_date_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_double_eq.json b/crates/eql-bindings/schema/v3/query_double_eq.json index 29c30d53c..7aee106cd 100644 --- a/crates/eql-bindings/schema/v3/query_double_eq.json +++ b/crates/eql-bindings/schema/v3/query_double_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_double_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_double_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_double_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_double_ord.json b/crates/eql-bindings/schema/v3/query_double_ord.json index a02a18af8..73f779672 100644 --- a/crates/eql-bindings/schema/v3/query_double_ord.json +++ b/crates/eql-bindings/schema/v3/query_double_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_double_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_double_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_double_ord_ope.json b/crates/eql-bindings/schema/v3/query_double_ord_ope.json index d9eea5cfe..2e47c813d 100644 --- a/crates/eql-bindings/schema/v3/query_double_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_double_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_double_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_double_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_double_ord_ore.json b/crates/eql-bindings/schema/v3/query_double_ord_ore.json index fdf9a2fac..8d62e570d 100644 --- a/crates/eql-bindings/schema/v3/query_double_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_double_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_double_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_double_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_integer_eq.json b/crates/eql-bindings/schema/v3/query_integer_eq.json index 5afe889a3..d83ab492d 100644 --- a/crates/eql-bindings/schema/v3/query_integer_eq.json +++ b/crates/eql-bindings/schema/v3/query_integer_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_integer_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_integer_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_integer_ord.json b/crates/eql-bindings/schema/v3/query_integer_ord.json index 5b78689e1..01861ace6 100644 --- a/crates/eql-bindings/schema/v3/query_integer_ord.json +++ b/crates/eql-bindings/schema/v3/query_integer_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_integer_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_integer_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_integer_ord_ope.json b/crates/eql-bindings/schema/v3/query_integer_ord_ope.json index 6cab032d8..07df17da1 100644 --- a/crates/eql-bindings/schema/v3/query_integer_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_integer_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_integer_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_integer_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_integer_ord_ore.json b/crates/eql-bindings/schema/v3/query_integer_ord_ore.json index d433907af..039a9076e 100644 --- a/crates/eql-bindings/schema/v3/query_integer_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_integer_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_integer_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_integer_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_jsonb.json b/crates/eql-bindings/schema/v3/query_jsonb.json index 639243505..f08f6b7bf 100644 --- a/crates/eql-bindings/schema/v3/query_jsonb.json +++ b/crates/eql-bindings/schema/v3/query_jsonb.json @@ -52,7 +52,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_jsonb.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict.", + "description": "`eql_v3.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict.", "properties": { "sv": { "items": { diff --git a/crates/eql-bindings/schema/v3/query_numeric_eq.json b/crates/eql-bindings/schema/v3/query_numeric_eq.json index e81c3d62c..199d48472 100644 --- a/crates/eql-bindings/schema/v3/query_numeric_eq.json +++ b/crates/eql-bindings/schema/v3/query_numeric_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_numeric_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_numeric_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_numeric_ord.json b/crates/eql-bindings/schema/v3/query_numeric_ord.json index 41c383cd4..3e826a01d 100644 --- a/crates/eql-bindings/schema/v3/query_numeric_ord.json +++ b/crates/eql-bindings/schema/v3/query_numeric_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_numeric_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_numeric_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_numeric_ord_ope.json b/crates/eql-bindings/schema/v3/query_numeric_ord_ope.json index a6a5d830f..93edbc906 100644 --- a/crates/eql-bindings/schema/v3/query_numeric_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_numeric_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_numeric_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_numeric_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_numeric_ord_ore.json b/crates/eql-bindings/schema/v3/query_numeric_ord_ore.json index 08029e6eb..9ee42bbbd 100644 --- a/crates/eql-bindings/schema/v3/query_numeric_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_numeric_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_numeric_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_numeric_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_real_eq.json b/crates/eql-bindings/schema/v3/query_real_eq.json index 008aa3a64..50a2e5b03 100644 --- a/crates/eql-bindings/schema/v3/query_real_eq.json +++ b/crates/eql-bindings/schema/v3/query_real_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_real_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_real_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_real_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_real_ord.json b/crates/eql-bindings/schema/v3/query_real_ord.json index c63fd1667..5e1aa53ac 100644 --- a/crates/eql-bindings/schema/v3/query_real_ord.json +++ b/crates/eql-bindings/schema/v3/query_real_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_real_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_real_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_real_ord_ope.json b/crates/eql-bindings/schema/v3/query_real_ord_ope.json index 83d2d5da2..38a5a337a 100644 --- a/crates/eql-bindings/schema/v3/query_real_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_real_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_real_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_real_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_real_ord_ore.json b/crates/eql-bindings/schema/v3/query_real_ord_ore.json index 1a2292cc1..7f062dda9 100644 --- a/crates/eql-bindings/schema/v3/query_real_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_real_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_real_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_real_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_smallint_eq.json b/crates/eql-bindings/schema/v3/query_smallint_eq.json index f470ad5b7..77fe5e24c 100644 --- a/crates/eql-bindings/schema/v3/query_smallint_eq.json +++ b/crates/eql-bindings/schema/v3/query_smallint_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_smallint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_smallint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_smallint_ord.json b/crates/eql-bindings/schema/v3/query_smallint_ord.json index 77516f124..2302c2c55 100644 --- a/crates/eql-bindings/schema/v3/query_smallint_ord.json +++ b/crates/eql-bindings/schema/v3/query_smallint_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_smallint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_smallint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_smallint_ord_ope.json b/crates/eql-bindings/schema/v3/query_smallint_ord_ope.json index 884f8bf80..aaef17d03 100644 --- a/crates/eql-bindings/schema/v3/query_smallint_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_smallint_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_smallint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_smallint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_smallint_ord_ore.json b/crates/eql-bindings/schema/v3/query_smallint_ord_ore.json index c798f0318..b3e2cd7aa 100644 --- a/crates/eql-bindings/schema/v3/query_smallint_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_smallint_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_smallint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_smallint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_text_eq.json b/crates/eql-bindings/schema/v3/query_text_eq.json index 187acd175..b0ec58ca3 100644 --- a/crates/eql-bindings/schema/v3/query_text_eq.json +++ b/crates/eql-bindings/schema/v3/query_text_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_text_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_text_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_text_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_text_match.json b/crates/eql-bindings/schema/v3/query_text_match.json index aa3985098..d7a781677 100644 --- a/crates/eql-bindings/schema/v3/query_text_match.json +++ b/crates/eql-bindings/schema/v3/query_text_match.json @@ -38,7 +38,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_text_match.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_text_match` — match domain query operand.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `bf`.", + "description": "`eql_v3.query_text_match` — match domain query operand.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `bf`.", "properties": { "bf": { "$ref": "#/$defs/BloomFilter" diff --git a/crates/eql-bindings/schema/v3/query_text_ord.json b/crates/eql-bindings/schema/v3/query_text_ord.json index 4165b1d89..6e8412be3 100644 --- a/crates/eql-bindings/schema/v3/query_text_ord.json +++ b/crates/eql-bindings/schema/v3/query_text_ord.json @@ -39,7 +39,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_text_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", + "description": "`eql_v3.query_text_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_text_ord_ope.json b/crates/eql-bindings/schema/v3/query_text_ord_ope.json index 3de613974..21a2d4621 100644 --- a/crates/eql-bindings/schema/v3/query_text_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_text_ord_ope.json @@ -36,7 +36,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_text_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`.", + "description": "`eql_v3.query_text_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_text_ord_ore.json b/crates/eql-bindings/schema/v3/query_text_ord_ore.json index c76d3f36d..850d4623c 100644 --- a/crates/eql-bindings/schema/v3/query_text_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_text_ord_ore.json @@ -39,7 +39,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_text_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", + "description": "`eql_v3.query_text_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_text_search.json b/crates/eql-bindings/schema/v3/query_text_search.json index 7fe1613c4..909eafc67 100644 --- a/crates/eql-bindings/schema/v3/query_text_search.json +++ b/crates/eql-bindings/schema/v3/query_text_search.json @@ -49,7 +49,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_text_search.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_text_search` — search domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`.", + "description": "`eql_v3.query_text_search` — search domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`.", "properties": { "bf": { "$ref": "#/$defs/BloomFilter" diff --git a/crates/eql-bindings/schema/v3/query_timestamp_eq.json b/crates/eql-bindings/schema/v3/query_timestamp_eq.json index 58ea64da2..f3e7ca3e0 100644 --- a/crates/eql-bindings/schema/v3/query_timestamp_eq.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_eq.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_eq.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_timestamp_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", + "description": "`eql_v3.query_timestamp_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.", "properties": { "hm": { "$ref": "#/$defs/Hmac256" diff --git a/crates/eql-bindings/schema/v3/query_timestamp_ord.json b/crates/eql-bindings/schema/v3/query_timestamp_ord.json index d02a604b4..5a6af8ac4 100644 --- a/crates/eql-bindings/schema/v3/query_timestamp_ord.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_ord.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_timestamp_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_timestamp_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_timestamp_ord_ope.json b/crates/eql-bindings/schema/v3/query_timestamp_ord_ope.json index f0db072d1..dc2bf8aae 100644 --- a/crates/eql-bindings/schema/v3/query_timestamp_ord_ope.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_ord_ope.json @@ -32,7 +32,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ope.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_timestamp_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", + "description": "`eql_v3.query_timestamp_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/schema/v3/query_timestamp_ord_ore.json b/crates/eql-bindings/schema/v3/query_timestamp_ord_ore.json index 7535b51ce..4322bd7fc 100644 --- a/crates/eql-bindings/schema/v3/query_timestamp_ord_ore.json +++ b/crates/eql-bindings/schema/v3/query_timestamp_ord_ore.json @@ -35,7 +35,7 @@ "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ore.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "description": "`public.query_timestamp_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", + "description": "`eql_v3.query_timestamp_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.", "properties": { "i": { "$ref": "#/$defs/Identifier" diff --git a/crates/eql-bindings/src/v3/bigint.rs b/crates/eql-bindings/src/v3/bigint.rs index 3e9ee2d09..dff8c373c 100644 --- a/crates/eql-bindings/src/v3/bigint.rs +++ b/crates/eql-bindings/src/v3/bigint.rs @@ -165,7 +165,7 @@ impl DomainType for BigintOrdOpe { schema_for!(BigintOrdOpe) } } -/// `public.query_bigint_eq` — equality domain query operand. +/// `eql_v3.query_bigint_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct BigintEqQuery { } impl DomainType for BigintEqQuery { fn sql_domain_static() -> &'static str { - "public.query_bigint_eq" + "eql_v3.query_bigint_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for BigintEqQuery { schema_for!(BigintEqQuery) } } -/// `public.query_bigint_ord_ore` — ordering domain query operand. +/// `eql_v3.query_bigint_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct BigintOrdOreQuery { } impl DomainType for BigintOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_bigint_ord_ore" + "eql_v3.query_bigint_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for BigintOrdOreQuery { schema_for!(BigintOrdOreQuery) } } -/// `public.query_bigint_ord` — ordering domain query operand. +/// `eql_v3.query_bigint_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct BigintOrdQuery { } impl DomainType for BigintOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_bigint_ord" + "eql_v3.query_bigint_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for BigintOrdQuery { schema_for!(BigintOrdQuery) } } -/// `public.query_bigint_ord_ope` — ordering domain query operand. +/// `eql_v3.query_bigint_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct BigintOrdOpeQuery { } impl DomainType for BigintOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_bigint_ord_ope" + "eql_v3.query_bigint_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs index d64a426a6..2e4b8b7b8 100644 --- a/crates/eql-bindings/src/v3/date.rs +++ b/crates/eql-bindings/src/v3/date.rs @@ -165,7 +165,7 @@ impl DomainType for DateOrdOpe { schema_for!(DateOrdOpe) } } -/// `public.query_date_eq` — equality domain query operand. +/// `eql_v3.query_date_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct DateEqQuery { } impl DomainType for DateEqQuery { fn sql_domain_static() -> &'static str { - "public.query_date_eq" + "eql_v3.query_date_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for DateEqQuery { schema_for!(DateEqQuery) } } -/// `public.query_date_ord_ore` — ordering domain query operand. +/// `eql_v3.query_date_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct DateOrdOreQuery { } impl DomainType for DateOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_date_ord_ore" + "eql_v3.query_date_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for DateOrdOreQuery { schema_for!(DateOrdOreQuery) } } -/// `public.query_date_ord` — ordering domain query operand. +/// `eql_v3.query_date_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct DateOrdQuery { } impl DomainType for DateOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_date_ord" + "eql_v3.query_date_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for DateOrdQuery { schema_for!(DateOrdQuery) } } -/// `public.query_date_ord_ope` — ordering domain query operand. +/// `eql_v3.query_date_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct DateOrdOpeQuery { } impl DomainType for DateOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_date_ord_ope" + "eql_v3.query_date_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/domain_type.rs b/crates/eql-bindings/src/v3/domain_type.rs index 351329bb8..c2cf64fa3 100644 --- a/crates/eql-bindings/src/v3/domain_type.rs +++ b/crates/eql-bindings/src/v3/domain_type.rs @@ -9,7 +9,10 @@ use std::marker::PhantomData; use schemars::{schema_for, JsonSchema, Schema}; use serde::Deserialize; -/// The PostgreSQL schema every user-column domain in this module inhabits. +/// The PostgreSQL schema every user-COLUMN domain in this module inhabits. +/// The `query_` operand twins are NOT column types and live in `eql_v3` +/// instead (CIP-3442) — dropping the EQL-owned schema can never drop an +/// application column, and a query operand is never an application column. pub const SQL_SCHEMA: &str = "public"; /// Base URL for the canonical `$id` of every published v3 JSON Schema. @@ -41,12 +44,14 @@ pub trait DomainType { fn sql_domain(&self) -> &'static str; /// Unqualified SQL domain name (e.g. `"integer_eq"`) — [`Self::sql_domain`] - /// minus the schema qualifier; matches `eql-domains` + /// minus the schema qualifier (`public.` for column domains, `eql_v3.` for + /// the query-operand twins); matches `eql-domains` /// `DomainFamily::domain_name`. fn domain(&self) -> &'static str { self.sql_domain() - .strip_prefix("public.") - .expect("sql_domain must be qualified with the public schema") + .split_once('.') + .expect("sql_domain must be schema-qualified") + .1 } /// Canonical `$id` for this domain's published JSON Schema — diff --git a/crates/eql-bindings/src/v3/double.rs b/crates/eql-bindings/src/v3/double.rs index 1dc24359c..b3a92522a 100644 --- a/crates/eql-bindings/src/v3/double.rs +++ b/crates/eql-bindings/src/v3/double.rs @@ -165,7 +165,7 @@ impl DomainType for DoubleOrdOpe { schema_for!(DoubleOrdOpe) } } -/// `public.query_double_eq` — equality domain query operand. +/// `eql_v3.query_double_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct DoubleEqQuery { } impl DomainType for DoubleEqQuery { fn sql_domain_static() -> &'static str { - "public.query_double_eq" + "eql_v3.query_double_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for DoubleEqQuery { schema_for!(DoubleEqQuery) } } -/// `public.query_double_ord_ore` — ordering domain query operand. +/// `eql_v3.query_double_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct DoubleOrdOreQuery { } impl DomainType for DoubleOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_double_ord_ore" + "eql_v3.query_double_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for DoubleOrdOreQuery { schema_for!(DoubleOrdOreQuery) } } -/// `public.query_double_ord` — ordering domain query operand. +/// `eql_v3.query_double_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct DoubleOrdQuery { } impl DomainType for DoubleOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_double_ord" + "eql_v3.query_double_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for DoubleOrdQuery { schema_for!(DoubleOrdQuery) } } -/// `public.query_double_ord_ope` — ordering domain query operand. +/// `eql_v3.query_double_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct DoubleOrdOpeQuery { } impl DomainType for DoubleOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_double_ord_ope" + "eql_v3.query_double_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/integer.rs b/crates/eql-bindings/src/v3/integer.rs index ab582392f..cd16e1484 100644 --- a/crates/eql-bindings/src/v3/integer.rs +++ b/crates/eql-bindings/src/v3/integer.rs @@ -165,7 +165,7 @@ impl DomainType for IntegerOrdOpe { schema_for!(IntegerOrdOpe) } } -/// `public.query_integer_eq` — equality domain query operand. +/// `eql_v3.query_integer_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct IntegerEqQuery { } impl DomainType for IntegerEqQuery { fn sql_domain_static() -> &'static str { - "public.query_integer_eq" + "eql_v3.query_integer_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for IntegerEqQuery { schema_for!(IntegerEqQuery) } } -/// `public.query_integer_ord_ore` — ordering domain query operand. +/// `eql_v3.query_integer_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct IntegerOrdOreQuery { } impl DomainType for IntegerOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_integer_ord_ore" + "eql_v3.query_integer_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for IntegerOrdOreQuery { schema_for!(IntegerOrdOreQuery) } } -/// `public.query_integer_ord` — ordering domain query operand. +/// `eql_v3.query_integer_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct IntegerOrdQuery { } impl DomainType for IntegerOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_integer_ord" + "eql_v3.query_integer_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for IntegerOrdQuery { schema_for!(IntegerOrdQuery) } } -/// `public.query_integer_ord_ope` — ordering domain query operand. +/// `eql_v3.query_integer_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct IntegerOrdOpeQuery { } impl DomainType for IntegerOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_integer_ord_ope" + "eql_v3.query_integer_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/inventory.rs b/crates/eql-bindings/src/v3/inventory.rs index f91fce708..f35a3c889 100644 --- a/crates/eql-bindings/src/v3/inventory.rs +++ b/crates/eql-bindings/src/v3/inventory.rs @@ -61,7 +61,7 @@ pub fn all() -> Vec> { Box::new(PhantomData::), ] } -/// Every v3 QUERY-operand twin (`public.query_`, the enveloped +/// Every v3 QUERY-operand twin (`eql_v3.query_`, the enveloped /// term-only operand), in `eql-domains::CATALOG` order — generated. /// Separate from [`all`] so query domains never resolve as stored /// conversion targets; used by the JSON Schema export and query diff --git a/crates/eql-bindings/src/v3/jsonb.rs b/crates/eql-bindings/src/v3/jsonb.rs index 40af3b6da..2f44f841d 100644 --- a/crates/eql-bindings/src/v3/jsonb.rs +++ b/crates/eql-bindings/src/v3/jsonb.rs @@ -105,7 +105,7 @@ pub struct SteVecEntry { pub term: SteVecTerm, } -/// `public.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict. +/// `eql_v3.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] #[ts(export, export_to = "v3/")] #[serde(deny_unknown_fields)] @@ -157,4 +157,4 @@ macro_rules! ste_vec_domain_type { ste_vec_domain_type!(SteVecDocument, "public.json"); ste_vec_domain_type!(SteVecEntry, "public.jsonb_entry"); -ste_vec_domain_type!(SteVecQuery, "public.query_jsonb"); +ste_vec_domain_type!(SteVecQuery, "eql_v3.query_jsonb"); diff --git a/crates/eql-bindings/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs index 75cbd69c5..790ef8cac 100644 --- a/crates/eql-bindings/src/v3/numeric.rs +++ b/crates/eql-bindings/src/v3/numeric.rs @@ -165,7 +165,7 @@ impl DomainType for NumericOrdOpe { schema_for!(NumericOrdOpe) } } -/// `public.query_numeric_eq` — equality domain query operand. +/// `eql_v3.query_numeric_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct NumericEqQuery { } impl DomainType for NumericEqQuery { fn sql_domain_static() -> &'static str { - "public.query_numeric_eq" + "eql_v3.query_numeric_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for NumericEqQuery { schema_for!(NumericEqQuery) } } -/// `public.query_numeric_ord_ore` — ordering domain query operand. +/// `eql_v3.query_numeric_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct NumericOrdOreQuery { } impl DomainType for NumericOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_numeric_ord_ore" + "eql_v3.query_numeric_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for NumericOrdOreQuery { schema_for!(NumericOrdOreQuery) } } -/// `public.query_numeric_ord` — ordering domain query operand. +/// `eql_v3.query_numeric_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct NumericOrdQuery { } impl DomainType for NumericOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_numeric_ord" + "eql_v3.query_numeric_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for NumericOrdQuery { schema_for!(NumericOrdQuery) } } -/// `public.query_numeric_ord_ope` — ordering domain query operand. +/// `eql_v3.query_numeric_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct NumericOrdOpeQuery { } impl DomainType for NumericOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_numeric_ord_ope" + "eql_v3.query_numeric_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/query_payload.rs b/crates/eql-bindings/src/v3/query_payload.rs index d1afdc2f1..1c4a003cf 100644 --- a/crates/eql-bindings/src/v3/query_payload.rs +++ b/crates/eql-bindings/src/v3/query_payload.rs @@ -3,9 +3,9 @@ use super::domain_type::DomainType; use serde::{Deserialize, Serialize}; /// Every v3 QUERY-operand shape in one type: one variant per term-bearing -/// scalar query twin (`public.query_`, the enveloped term-only +/// scalar query twin (`eql_v3.query_`, the enveloped term-only /// operand — `{v, i, }`, no `c`) plus the SteVec containment -/// needle (`public.query_jsonb`). Generated from the catalog, so it +/// needle (`eql_v3.query_jsonb`). Generated from the catalog, so it /// cannot drift when the catalog grows. /// /// Serialization is exactly the inner struct's (`#[serde(untagged)]` @@ -17,83 +17,83 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq, Serialize)] #[serde(untagged)] pub enum QueryPayload { - /// The `public.query_integer_eq` query operand. + /// The `eql_v3.query_integer_eq` query operand. IntegerEqQuery(super::integer::IntegerEqQuery), - /// The `public.query_integer_ord_ore` query operand. + /// The `eql_v3.query_integer_ord_ore` query operand. IntegerOrdOreQuery(super::integer::IntegerOrdOreQuery), - /// The `public.query_integer_ord` query operand. + /// The `eql_v3.query_integer_ord` query operand. IntegerOrdQuery(super::integer::IntegerOrdQuery), - /// The `public.query_integer_ord_ope` query operand. + /// The `eql_v3.query_integer_ord_ope` query operand. IntegerOrdOpeQuery(super::integer::IntegerOrdOpeQuery), - /// The `public.query_smallint_eq` query operand. + /// The `eql_v3.query_smallint_eq` query operand. SmallintEqQuery(super::smallint::SmallintEqQuery), - /// The `public.query_smallint_ord_ore` query operand. + /// The `eql_v3.query_smallint_ord_ore` query operand. SmallintOrdOreQuery(super::smallint::SmallintOrdOreQuery), - /// The `public.query_smallint_ord` query operand. + /// The `eql_v3.query_smallint_ord` query operand. SmallintOrdQuery(super::smallint::SmallintOrdQuery), - /// The `public.query_smallint_ord_ope` query operand. + /// The `eql_v3.query_smallint_ord_ope` query operand. SmallintOrdOpeQuery(super::smallint::SmallintOrdOpeQuery), - /// The `public.query_bigint_eq` query operand. + /// The `eql_v3.query_bigint_eq` query operand. BigintEqQuery(super::bigint::BigintEqQuery), - /// The `public.query_bigint_ord_ore` query operand. + /// The `eql_v3.query_bigint_ord_ore` query operand. BigintOrdOreQuery(super::bigint::BigintOrdOreQuery), - /// The `public.query_bigint_ord` query operand. + /// The `eql_v3.query_bigint_ord` query operand. BigintOrdQuery(super::bigint::BigintOrdQuery), - /// The `public.query_bigint_ord_ope` query operand. + /// The `eql_v3.query_bigint_ord_ope` query operand. BigintOrdOpeQuery(super::bigint::BigintOrdOpeQuery), - /// The `public.query_date_eq` query operand. + /// The `eql_v3.query_date_eq` query operand. DateEqQuery(super::date::DateEqQuery), - /// The `public.query_date_ord_ore` query operand. + /// The `eql_v3.query_date_ord_ore` query operand. DateOrdOreQuery(super::date::DateOrdOreQuery), - /// The `public.query_date_ord` query operand. + /// The `eql_v3.query_date_ord` query operand. DateOrdQuery(super::date::DateOrdQuery), - /// The `public.query_date_ord_ope` query operand. + /// The `eql_v3.query_date_ord_ope` query operand. DateOrdOpeQuery(super::date::DateOrdOpeQuery), - /// The `public.query_timestamp_eq` query operand. + /// The `eql_v3.query_timestamp_eq` query operand. TimestampEqQuery(super::timestamp::TimestampEqQuery), - /// The `public.query_timestamp_ord_ore` query operand. + /// The `eql_v3.query_timestamp_ord_ore` query operand. TimestampOrdOreQuery(super::timestamp::TimestampOrdOreQuery), - /// The `public.query_timestamp_ord` query operand. + /// The `eql_v3.query_timestamp_ord` query operand. TimestampOrdQuery(super::timestamp::TimestampOrdQuery), - /// The `public.query_timestamp_ord_ope` query operand. + /// The `eql_v3.query_timestamp_ord_ope` query operand. TimestampOrdOpeQuery(super::timestamp::TimestampOrdOpeQuery), - /// The `public.query_numeric_eq` query operand. + /// The `eql_v3.query_numeric_eq` query operand. NumericEqQuery(super::numeric::NumericEqQuery), - /// The `public.query_numeric_ord_ore` query operand. + /// The `eql_v3.query_numeric_ord_ore` query operand. NumericOrdOreQuery(super::numeric::NumericOrdOreQuery), - /// The `public.query_numeric_ord` query operand. + /// The `eql_v3.query_numeric_ord` query operand. NumericOrdQuery(super::numeric::NumericOrdQuery), - /// The `public.query_numeric_ord_ope` query operand. + /// The `eql_v3.query_numeric_ord_ope` query operand. NumericOrdOpeQuery(super::numeric::NumericOrdOpeQuery), - /// The `public.query_text_eq` query operand. + /// The `eql_v3.query_text_eq` query operand. TextEqQuery(super::text::TextEqQuery), - /// The `public.query_text_match` query operand. + /// The `eql_v3.query_text_match` query operand. TextMatchQuery(super::text::TextMatchQuery), - /// The `public.query_text_ord_ore` query operand. + /// The `eql_v3.query_text_ord_ore` query operand. TextOrdOreQuery(super::text::TextOrdOreQuery), - /// The `public.query_text_ord` query operand. + /// The `eql_v3.query_text_ord` query operand. TextOrdQuery(super::text::TextOrdQuery), - /// The `public.query_text_ord_ope` query operand. + /// The `eql_v3.query_text_ord_ope` query operand. TextOrdOpeQuery(super::text::TextOrdOpeQuery), - /// The `public.query_text_search` query operand. + /// The `eql_v3.query_text_search` query operand. TextSearchQuery(super::text::TextSearchQuery), - /// The `public.query_real_eq` query operand. + /// The `eql_v3.query_real_eq` query operand. RealEqQuery(super::real::RealEqQuery), - /// The `public.query_real_ord_ore` query operand. + /// The `eql_v3.query_real_ord_ore` query operand. RealOrdOreQuery(super::real::RealOrdOreQuery), - /// The `public.query_real_ord` query operand. + /// The `eql_v3.query_real_ord` query operand. RealOrdQuery(super::real::RealOrdQuery), - /// The `public.query_real_ord_ope` query operand. + /// The `eql_v3.query_real_ord_ope` query operand. RealOrdOpeQuery(super::real::RealOrdOpeQuery), - /// The `public.query_double_eq` query operand. + /// The `eql_v3.query_double_eq` query operand. DoubleEqQuery(super::double::DoubleEqQuery), - /// The `public.query_double_ord_ore` query operand. + /// The `eql_v3.query_double_ord_ore` query operand. DoubleOrdOreQuery(super::double::DoubleOrdOreQuery), - /// The `public.query_double_ord` query operand. + /// The `eql_v3.query_double_ord` query operand. DoubleOrdQuery(super::double::DoubleOrdQuery), - /// The `public.query_double_ord_ope` query operand. + /// The `eql_v3.query_double_ord_ope` query operand. DoubleOrdOpeQuery(super::double::DoubleOrdOpeQuery), - /// The `public.query_jsonb` query operand. + /// The `eql_v3.query_jsonb` query operand. SteVec(super::jsonb::SteVecQuery), } impl QueryPayload { @@ -279,7 +279,7 @@ impl QueryPayload { Self::SteVec(payload) => payload, } } - /// Fully-qualified SQL domain name, e.g. `"public.query_integer_eq"`. + /// Fully-qualified SQL domain name, e.g. `"eql_v3.query_integer_eq"`. pub fn sql_domain(&self) -> &'static str { self.as_domain_type().sql_domain() } diff --git a/crates/eql-bindings/src/v3/real.rs b/crates/eql-bindings/src/v3/real.rs index 8565282dd..31201219d 100644 --- a/crates/eql-bindings/src/v3/real.rs +++ b/crates/eql-bindings/src/v3/real.rs @@ -165,7 +165,7 @@ impl DomainType for RealOrdOpe { schema_for!(RealOrdOpe) } } -/// `public.query_real_eq` — equality domain query operand. +/// `eql_v3.query_real_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct RealEqQuery { } impl DomainType for RealEqQuery { fn sql_domain_static() -> &'static str { - "public.query_real_eq" + "eql_v3.query_real_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for RealEqQuery { schema_for!(RealEqQuery) } } -/// `public.query_real_ord_ore` — ordering domain query operand. +/// `eql_v3.query_real_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct RealOrdOreQuery { } impl DomainType for RealOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_real_ord_ore" + "eql_v3.query_real_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for RealOrdOreQuery { schema_for!(RealOrdOreQuery) } } -/// `public.query_real_ord` — ordering domain query operand. +/// `eql_v3.query_real_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct RealOrdQuery { } impl DomainType for RealOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_real_ord" + "eql_v3.query_real_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for RealOrdQuery { schema_for!(RealOrdQuery) } } -/// `public.query_real_ord_ope` — ordering domain query operand. +/// `eql_v3.query_real_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct RealOrdOpeQuery { } impl DomainType for RealOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_real_ord_ope" + "eql_v3.query_real_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/smallint.rs b/crates/eql-bindings/src/v3/smallint.rs index 337c52296..bb1a78881 100644 --- a/crates/eql-bindings/src/v3/smallint.rs +++ b/crates/eql-bindings/src/v3/smallint.rs @@ -165,7 +165,7 @@ impl DomainType for SmallintOrdOpe { schema_for!(SmallintOrdOpe) } } -/// `public.query_smallint_eq` — equality domain query operand. +/// `eql_v3.query_smallint_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct SmallintEqQuery { } impl DomainType for SmallintEqQuery { fn sql_domain_static() -> &'static str { - "public.query_smallint_eq" + "eql_v3.query_smallint_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for SmallintEqQuery { schema_for!(SmallintEqQuery) } } -/// `public.query_smallint_ord_ore` — ordering domain query operand. +/// `eql_v3.query_smallint_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct SmallintOrdOreQuery { } impl DomainType for SmallintOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_smallint_ord_ore" + "eql_v3.query_smallint_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for SmallintOrdOreQuery { schema_for!(SmallintOrdOreQuery) } } -/// `public.query_smallint_ord` — ordering domain query operand. +/// `eql_v3.query_smallint_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct SmallintOrdQuery { } impl DomainType for SmallintOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_smallint_ord" + "eql_v3.query_smallint_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for SmallintOrdQuery { schema_for!(SmallintOrdQuery) } } -/// `public.query_smallint_ord_ope` — ordering domain query operand. +/// `eql_v3.query_smallint_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct SmallintOrdOpeQuery { } impl DomainType for SmallintOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_smallint_ord_ope" + "eql_v3.query_smallint_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs index a68decf39..e777b5d0a 100644 --- a/crates/eql-bindings/src/v3/text.rs +++ b/crates/eql-bindings/src/v3/text.rs @@ -234,7 +234,7 @@ impl DomainType for TextSearch { schema_for!(TextSearch) } } -/// `public.query_text_eq` — equality domain query operand. +/// `eql_v3.query_text_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -247,7 +247,7 @@ pub struct TextEqQuery { } impl DomainType for TextEqQuery { fn sql_domain_static() -> &'static str { - "public.query_text_eq" + "eql_v3.query_text_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -265,7 +265,7 @@ impl DomainType for TextEqQuery { schema_for!(TextEqQuery) } } -/// `public.query_text_match` — match domain query operand. +/// `eql_v3.query_text_match` — match domain query operand. /// /// Operators: `@>` `<@`. Required keys: `v` `i` `bf`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -278,7 +278,7 @@ pub struct TextMatchQuery { } impl DomainType for TextMatchQuery { fn sql_domain_static() -> &'static str { - "public.query_text_match" + "eql_v3.query_text_match" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -296,7 +296,7 @@ impl DomainType for TextMatchQuery { schema_for!(TextMatchQuery) } } -/// `public.query_text_ord_ore` — ordering domain query operand. +/// `eql_v3.query_text_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -310,7 +310,7 @@ pub struct TextOrdOreQuery { } impl DomainType for TextOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_text_ord_ore" + "eql_v3.query_text_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -328,7 +328,7 @@ impl DomainType for TextOrdOreQuery { schema_for!(TextOrdOreQuery) } } -/// `public.query_text_ord` — ordering domain query operand. +/// `eql_v3.query_text_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -342,7 +342,7 @@ pub struct TextOrdQuery { } impl DomainType for TextOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_text_ord" + "eql_v3.query_text_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -360,7 +360,7 @@ impl DomainType for TextOrdQuery { schema_for!(TextOrdQuery) } } -/// `public.query_text_ord_ope` — ordering domain query operand. +/// `eql_v3.query_text_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -374,7 +374,7 @@ pub struct TextOrdOpeQuery { } impl DomainType for TextOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_text_ord_ope" + "eql_v3.query_text_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -392,7 +392,7 @@ impl DomainType for TextOrdOpeQuery { schema_for!(TextOrdOpeQuery) } } -/// `public.query_text_search` — search domain query operand. +/// `eql_v3.query_text_search` — search domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -407,7 +407,7 @@ pub struct TextSearchQuery { } impl DomainType for TextSearchQuery { fn sql_domain_static() -> &'static str { - "public.query_text_search" + "eql_v3.query_text_search" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/src/v3/timestamp.rs b/crates/eql-bindings/src/v3/timestamp.rs index d0fe54a5f..5a5b3ce4c 100644 --- a/crates/eql-bindings/src/v3/timestamp.rs +++ b/crates/eql-bindings/src/v3/timestamp.rs @@ -165,7 +165,7 @@ impl DomainType for TimestampOrdOpe { schema_for!(TimestampOrdOpe) } } -/// `public.query_timestamp_eq` — equality domain query operand. +/// `eql_v3.query_timestamp_eq` — equality domain query operand. /// /// Operators: `=` `<>`. Required keys: `v` `i` `hm`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -178,7 +178,7 @@ pub struct TimestampEqQuery { } impl DomainType for TimestampEqQuery { fn sql_domain_static() -> &'static str { - "public.query_timestamp_eq" + "eql_v3.query_timestamp_eq" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -196,7 +196,7 @@ impl DomainType for TimestampEqQuery { schema_for!(TimestampEqQuery) } } -/// `public.query_timestamp_ord_ore` — ordering domain query operand. +/// `eql_v3.query_timestamp_ord_ore` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -209,7 +209,7 @@ pub struct TimestampOrdOreQuery { } impl DomainType for TimestampOrdOreQuery { fn sql_domain_static() -> &'static str { - "public.query_timestamp_ord_ore" + "eql_v3.query_timestamp_ord_ore" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -227,7 +227,7 @@ impl DomainType for TimestampOrdOreQuery { schema_for!(TimestampOrdOreQuery) } } -/// `public.query_timestamp_ord` — ordering domain query operand. +/// `eql_v3.query_timestamp_ord` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -240,7 +240,7 @@ pub struct TimestampOrdQuery { } impl DomainType for TimestampOrdQuery { fn sql_domain_static() -> &'static str { - "public.query_timestamp_ord" + "eql_v3.query_timestamp_ord" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() @@ -258,7 +258,7 @@ impl DomainType for TimestampOrdQuery { schema_for!(TimestampOrdQuery) } } -/// `public.query_timestamp_ord_ope` — ordering domain query operand. +/// `eql_v3.query_timestamp_ord_ope` — ordering domain query operand. /// /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)] @@ -271,7 +271,7 @@ pub struct TimestampOrdOpeQuery { } impl DomainType for TimestampOrdOpeQuery { fn sql_domain_static() -> &'static str { - "public.query_timestamp_ord_ope" + "eql_v3.query_timestamp_ord_ope" } fn sql_domain(&self) -> &'static str { Self::sql_domain_static() diff --git a/crates/eql-bindings/tests/catalog_parity.rs b/crates/eql-bindings/tests/catalog_parity.rs index 921d94a37..5e2d91bc8 100644 --- a/crates/eql-bindings/tests/catalog_parity.rs +++ b/crates/eql-bindings/tests/catalog_parity.rs @@ -264,7 +264,7 @@ fn schemas_are_strict() { /// every real payload — the SQL CHECK is laxer and only mandates `v`/`i`/`sv`, /// but the binding models the real wire, which always carries `k`) /// - `public.jsonb_entry` requires `s` `c` + exactly one of `hm` XOR `oc` -/// - `public.query_jsonb` requires `sv`; each element `s` + `hm` XOR `oc`, no `c` +/// - `eql_v3.query_jsonb` requires `sv`; each element `s` + `hm` XOR `oc`, no `c` #[test] fn jsonb_schema_required_keys_match_the_sql_check_contract() { let entries = v3::all(); @@ -330,7 +330,7 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() { assert_eq!( required(&query, "/required", "query_jsonb"), set(&["sv"]), - "public.query_jsonb required keys must be sv" + "eql_v3.query_jsonb required keys must be sv" ); let elem_required = required( &query, @@ -360,7 +360,7 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() { query_alt_required.len() == 2 && query_alt_required.contains(&set(&["hm"])) && query_alt_required.contains(&set(&["oc"])), - "public.query_jsonb element anyOf must offer exactly the hm-only and \ + "eql_v3.query_jsonb element anyOf must offer exactly the hm-only and \ oc-only term alternatives (each arm a singleton), got {query_alt_required:?}" ); } diff --git a/crates/eql-bindings/tests/query_payload.rs b/crates/eql-bindings/tests/query_payload.rs index 059c5012f..39ed85842 100644 --- a/crates/eql-bindings/tests/query_payload.rs +++ b/crates/eql-bindings/tests/query_payload.rs @@ -68,11 +68,11 @@ fn typed_needle_yields_the_ste_vec_variant() { }); let typed = assert_serialization_pin(&v2); assert_eq!(typed.domain(), "query_jsonb"); - assert_eq!(typed.sql_domain(), "public.query_jsonb"); + assert_eq!(typed.sql_domain(), "eql_v3.query_jsonb"); match &typed { QueryPayload::SteVec(q) => { assert_eq!(q.sv.len(), 2, "entry order/count preserved"); - assert_eq!(q.sql_domain(), "public.query_jsonb"); + assert_eq!(q.sql_domain(), "eql_v3.query_jsonb"); } other => panic!("a jsonb target must yield the SteVec needle, got {other:?}"), } @@ -166,7 +166,7 @@ fn scalar_query_hoist_and_storage_only_unsupported() { let typed = from_v2_query_typed(&v2, t).unwrap_or_else(|e| panic!("{name} typed hoist: {e:?}")); assert_eq!(typed.domain(), format!("query_{name}"), "{name} domain"); - assert_eq!(typed.sql_domain(), format!("public.query_{name}")); + assert_eq!(typed.sql_domain(), format!("eql_v3.query_{name}")); assert_eq!( serde_json::to_value(&typed).unwrap(), out, @@ -250,7 +250,7 @@ fn parse_returns_none_for_non_query_domains() { "json", "jsonb_entry", "integer_eq", - "public.query_jsonb", + "eql_v3.query_jsonb", "", ] { assert!( diff --git a/crates/eql-bindings/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs index d013d50ea..7665e5c0e 100644 --- a/crates/eql-bindings/tests/v3_conformance.rs +++ b/crates/eql-bindings/tests/v3_conformance.rs @@ -472,7 +472,7 @@ fn stevec_query_round_trips() { let wire = json!({ "sv": [ { "s": "sel", "hm": "deadbeef" } ] }); let parsed: SteVecQuery = serde_json::from_value(wire.clone()).unwrap(); assert_eq!(serde_json::to_value(&parsed).unwrap(), wire); - assert_eq!(SteVecQuery::sql_domain_static(), "public.query_jsonb"); + assert_eq!(SteVecQuery::sql_domain_static(), "eql_v3.query_jsonb"); // Unknown top-level key rejected (SteVecQuery has no flatten field). assert!(serde_json::from_value::(json!({ "sv": [], "bogus": 1 })).is_err()); // NOTE: a query ELEMENT carrying `c` is NOT rejected here — SteVecQueryEntry @@ -516,7 +516,7 @@ fn stevec_document_and_query_schemas_are_strict() { assert_eq!(sq.pointer("/additionalProperties"), Some(&json!(false))); // SteVecDocument/Query domain names. assert_eq!(SteVecDocument::sql_domain_static(), "public.json"); - assert_eq!(SteVecQuery::sql_domain_static(), "public.query_jsonb"); + assert_eq!(SteVecQuery::sql_domain_static(), "eql_v3.query_jsonb"); } #[test] diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs index 655ebd370..2d4d3f568 100644 --- a/crates/eql-codegen/src/bindings.rs +++ b/crates/eql-codegen/src/bindings.rs @@ -191,7 +191,7 @@ fn render_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { /// One query-operand payload struct + its `DomainType` impl for a capability /// domain: the storage struct MINUS the `c` ciphertext. A query operand carries -/// only index terms (no stored ciphertext), so its `public.query_` domain +/// only index terms (no stored ciphertext), so its `eql_v3.query_` domain /// admits exactly `{v, i, }` — `deny_unknown_fields` makes a stray `c` /// (or any storage key) a parse error, mirroring the SQL `query_` domain /// CHECK (CIP-3432). Emitted only for term-bearing domains: a storage-only @@ -199,12 +199,14 @@ fn render_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { fn render_query_struct(family: &DomainFamily, domain: &Domain) -> TokenStream { let query_name = domain.query_name(family.name); let ident = format_ident!("{}Query", domain.struct_ident(family.name)); - let sql_domain = format!("public.{query_name}"); + // Query operands live in the public-API schema, NOT `public`: they are + // never valid column types (CIP-3442). + let sql_domain = format!("eql_v3.{query_name}"); // Query doc: same capability label + operator union as storage, but the // required-key list drops `c` (query operands omit the ciphertext). let summary = format!( - " `public.{query_name}` — {} query operand.", + " `eql_v3.{query_name}` — {} query operand.", capability_label(domain.name) ); let ops = Term::operators_for_terms(domain.terms); @@ -382,7 +384,7 @@ pub fn render_inventory_rs() -> String { ] } - /// Every v3 QUERY-operand twin (`public.query_`, the enveloped + /// Every v3 QUERY-operand twin (`eql_v3.query_`, the enveloped /// term-only operand), in `eql-domains::CATALOG` order — generated. /// Separate from [`all`] so query domains never resolve as stored /// conversion targets; used by the JSON Schema export and query @@ -517,8 +519,8 @@ pub fn render_payload_rs() -> String { } /// The catalog's QUERY-operand domains, in a stable order: a query twin for -/// every term-bearing scalar domain (`public.query_`), then the SteVec -/// containment needle (`public.query_jsonb`). Exactly the shapes the generated +/// every term-bearing scalar domain (`eql_v3.query_`), then the SteVec +/// containment needle (`eql_v3.query_jsonb`). Exactly the shapes the generated /// `QueryPayload` spans and `from_v2_query` can target. Returned as /// `(module, variant ident, struct ident, unqualified query-domain name)`; the /// SteVec needle keeps the `SteVec` variant name the `from_v2` query path @@ -546,8 +548,8 @@ fn query_payload_domains() -> Vec<(String, String, String, String)> { /// Render the generated `crates/eql-bindings/src/v3/query_payload.rs`: the /// `QueryPayload` enum spanning every QUERY-operand domain — a variant per -/// term-bearing scalar query twin (`public.query_`) plus the SteVec -/// containment needle (`public.query_jsonb`) — with its +/// term-bearing scalar query twin (`eql_v3.query_`) plus the SteVec +/// containment needle (`eql_v3.query_jsonb`) — with its /// construct-from-known-domain `parse` constructor. /// /// Generated for the same reason as [`render_payload_rs`]'s `DomainPayload`: @@ -564,7 +566,8 @@ pub fn render_query_payload_rs() -> String { let m = format_ident!("{module}"); let v = format_ident!("{variant}"); let s = format_ident!("{strukt}"); - let doc = format!(" The `public.{key}` query operand."); + // Every query-operand domain lives in eql_v3 (CIP-3442). + let doc = format!(" The `eql_v3.{key}` query operand."); variants.extend(quote! { #[doc = #doc] #v(super::#m::#s), @@ -590,9 +593,9 @@ pub fn render_query_payload_rs() -> String { use super::domain_type::DomainType; /// Every v3 QUERY-operand shape in one type: one variant per term-bearing - /// scalar query twin (`public.query_`, the enveloped term-only + /// scalar query twin (`eql_v3.query_`, the enveloped term-only /// operand — `{v, i, }`, no `c`) plus the SteVec containment - /// needle (`public.query_jsonb`). Generated from the catalog, so it + /// needle (`eql_v3.query_jsonb`). Generated from the catalog, so it /// cannot drift when the catalog grows. /// /// Serialization is exactly the inner struct's (`#[serde(untagged)]` @@ -631,7 +634,7 @@ pub fn render_query_payload_rs() -> String { } } - /// Fully-qualified SQL domain name, e.g. `"public.query_integer_eq"`. + /// Fully-qualified SQL domain name, e.g. `"eql_v3.query_integer_eq"`. pub fn sql_domain(&self) -> &'static str { self.as_domain_type().sql_domain() } @@ -777,7 +780,7 @@ mod tests { #[test] fn query_twins_drop_c_and_name_query_domains() { // CIP-3432: every term-bearing capability domain gets a `Query` - // twin = the storage struct minus `c`, on the `public.query_` + // twin = the storage struct minus `c`, on the `eql_v3.query_` // domain (prefix naming — CIP-3442). Storage-only domains (no // operators) get no twin. let out = render_family_bindings(family("integer")); @@ -797,10 +800,10 @@ mod tests { assert_eq!(field_idents(&out, "IntegerEqQuery"), ["v", "i", "hm"]); assert_eq!(field_idents(&out, "IntegerOrdQuery"), ["v", "i", "ob"]); assert_eq!(field_idents(&out, "IntegerOrdOpeQuery"), ["v", "i", "op"]); - assert!(out.contains("\"public.query_integer_eq\"")); + assert!(out.contains("\"eql_v3.query_integer_eq\"")); assert!(out.contains("impl DomainType for IntegerEqQuery")); assert!(out.contains("schema_for!(IntegerEqQuery)")); - assert!(out.contains("`public.query_integer_eq` — equality domain query operand.")); + assert!(out.contains("`eql_v3.query_integer_eq` — equality domain query operand.")); // Query twin term keys mirror the storage domain's. assert!(out.contains(r#"&["op"]"#)); @@ -811,7 +814,7 @@ mod tests { field_idents(&text, "TextSearchQuery"), ["v", "i", "hm", "ob", "bf"] ); - assert!(text.contains("`public.query_text_match` — match domain query operand.")); + assert!(text.contains("`eql_v3.query_text_match` — match domain query operand.")); } #[test] diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs index 2cf5ad3ea..816dd1130 100644 --- a/crates/eql-codegen/src/context.rs +++ b/crates/eql-codegen/src/context.rs @@ -352,6 +352,16 @@ pub fn domain_name(name: &str) -> String { format!("public.{name}") } +/// The schema-qualified name of a QUERY-OPERAND domain, e.g. +/// `eql_v3.query_integer_eq`. Query twins live in the public-API `SCHEMA` +/// (not `public`) — they are never valid column types, so the +/// application-columns-survive-schema-drop rationale behind `domain_name` +/// does not apply, and keeping them out of `public` keeps the column-type +/// namespace to actual column types (CIP-3442). +pub fn query_domain_name(name: &str) -> String { + format!("{SCHEMA}.{name}") +} + /// The extractor-call SQL for one operand, casting jsonb to the domain first. /// Port of `_extract_arg`. `dom` is the schema-qualified domain name. pub fn extract_arg(arg_type: &str, extractor: &str, dom: &str, arg: &str) -> String { diff --git a/crates/eql-codegen/src/dump.rs b/crates/eql-codegen/src/dump.rs index 684d49b8b..1164b6c28 100644 --- a/crates/eql-codegen/src/dump.rs +++ b/crates/eql-codegen/src/dump.rs @@ -14,7 +14,7 @@ use serde::Serialize; pub struct CatalogDump { pub types: Vec, /// The `jsonb` (SteVec) family — `public.json` / `public.jsonb_entry` / - /// `public.query_jsonb`. Their SQL is hand-written under `src/v3/jsonb/`; the + /// `eql_v3.query_jsonb`. Their SQL is hand-written under `src/v3/jsonb/`; the /// catalog owns only their inventory (scalar-only consumers ignore this field). pub stevec: Vec, } @@ -288,7 +288,7 @@ mod tests { // `list-types` / `dump-catalog` output the scalar-matrix tooling consumes) // must NOT surface the SteVec `jsonb` family: it has no `scalars::jsonb::*` // matrix and no generated SQL surface, even though two of its three - // domain names (`public.jsonb_entry` / `public.query_jsonb`) now follow + // domain names (`public.jsonb_entry` / `eql_v3.query_jsonb`) now follow // the family+suffix string convention — the payload shape is still not // flat. This pins the exclusion directly at the codegen surface rather // than relying only on the transitive `scalar_families()` guard in diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs index 88bce5068..a943dccae 100644 --- a/crates/eql-codegen/src/generate.rs +++ b/crates/eql-codegen/src/generate.rs @@ -196,7 +196,7 @@ fn query_types_path(family_name: &str) -> String { /// Body for a term-bearing domain's query__functions.sql (CIP-3432): the /// query-operand extractor OVERLOADS (the same extractors, on -/// `public.query_`) plus the comparison WRAPPERS binding the storage +/// `eql_v3.query_`) plus the comparison WRAPPERS binding the storage /// domain to its query twin — for the domain's SUPPORTED operators only, in /// both directions. Reuses the same `functions.sql` template as the storage /// surface; a query operand carries the same terms, so each wrapper compares @@ -204,12 +204,13 @@ fn query_types_path(family_name: &str) -> String { pub fn render_query_functions_file(family_name: &str, domain: &Domain) -> String { use crate::consts::sql_str; use crate::context::{ - domain_name, environment, extractor_entry, wrapper_entry, FunctionsContext, + domain_name, environment, extractor_entry, query_domain_name, wrapper_entry, + FunctionsContext, }; let name = domain.full_name(family_name); let query_name = domain.query_name(family_name); let storage_dom = domain_name(&name); - let query_dom = domain_name(&query_name); + let query_dom = query_domain_name(&query_name); let supported = Term::operators_for_terms(domain.terms); let mut entries = Vec::new(); @@ -274,13 +275,15 @@ pub fn render_query_functions_file(family_name: &str, domain: &Domain) -> String /// Body for a term-bearing domain's query__operators.sql (CIP-3432): a /// `CREATE OPERATOR` binding `(storage_domain, query_)` for every /// supported operator, plus its `(query_, storage_domain)` commutator, so -/// `col $1::public.query_` resolves to the query wrapper. +/// `col $1::eql_v3.query_` resolves to the query wrapper. pub fn render_query_operators_file(family_name: &str, domain: &Domain) -> String { - use crate::context::{domain_name, environment, operator_entry, OperatorsContext}; + use crate::context::{ + domain_name, environment, operator_entry, query_domain_name, OperatorsContext, + }; let name = domain.full_name(family_name); let query_name = domain.query_name(family_name); let storage_dom = domain_name(&name); - let query_dom = domain_name(&query_name); + let query_dom = query_domain_name(&query_name); let supported = Term::operators_for_terms(domain.terms); let mut operators = Vec::new(); diff --git a/crates/eql-codegen/templates/query_types.sql.j2 b/crates/eql-codegen/templates/query_types.sql.j2 index 5a0ae592a..2dee7bf01 100644 --- a/crates/eql-codegen/templates/query_types.sql.j2 +++ b/crates/eql-codegen/templates/query_types.sql.j2 @@ -3,20 +3,24 @@ --! @file v3/scalars/{{ family_name }}/query_{{ family_name }}_types.sql --! @brief Query-operand domains for {{ family_name }} (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `{{ schema }}` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_{{ family_name }}_eq`). A bare, +--! (e.g. `WHERE col = $1::{{ schema }}.query_{{ family_name }}_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN {%- for d in domains %} - --! @brief Query-operand domain public.{{ d.name }} (term-only; no `c`). + --! @brief Query-operand domain {{ schema }}.{{ d.name }} (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = '{{ d.typname }}' AND typnamespace = 'public'::regnamespace + WHERE typname = '{{ d.typname }}' AND typnamespace = '{{ schema }}'::regnamespace ) THEN - CREATE DOMAIN public.{{ d.name }} AS jsonb + CREATE DOMAIN {{ schema }}.{{ d.name }} AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' {%- for k in d.keys %} @@ -33,7 +37,7 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.{{ d.name }} IS '{{ d.comment }}'; + COMMENT ON DOMAIN {{ schema }}.{{ d.name }} IS '{{ d.comment }}'; {% endfor -%} END $$; diff --git a/docs/reference/catalog-driven-architecture.md b/docs/reference/catalog-driven-architecture.md index 083beb169..749af1924 100644 --- a/docs/reference/catalog-driven-architecture.md +++ b/docs/reference/catalog-driven-architecture.md @@ -190,7 +190,7 @@ flowchart LR | `boolean` | Bool | storage-only (2-value cardinality leak → no searchable index) | **`jsonb` sits outside this classification.** It carries three domains — `public.json` -(document), `public.jsonb_entry` (one `sv` leaf), `public.query_jsonb` (containment +(document), `public.jsonb_entry` (one `sv` leaf), `eql_v3.query_jsonb` (containment needle) — each tagged `Shape::SteVec` rather than `Shape::Scalar`, with an empty flat `terms` list: capability lives *structurally* inside the payload (per-`sv`-leaf `hm` XOR `oc`), not as a family-level `Term` set. `Domain.name` (`"json"`/`"entry"`/`"query"`) diff --git a/docs/reference/database-indexes.md b/docs/reference/database-indexes.md index 7481b4523..abe0d4068 100644 --- a/docs/reference/database-indexes.md +++ b/docs/reference/database-indexes.md @@ -181,11 +181,11 @@ CREATE INDEX orders_data_gin ON orders USING gin (eql_v3.to_ste_vec_query(data_encrypted)::jsonb jsonb_path_ops); ANALYZE orders; -SELECT * FROM orders WHERE data_encrypted @> $1::public.query_jsonb; +SELECT * FROM orders WHERE data_encrypted @> $1::eql_v3.query_jsonb; -- Bitmap Index Scan on orders_data_gin ``` -The needle must be typed — `$1::public.query_jsonb`, another `public.json`, or an `public.jsonb_entry`. A bare untyped literal falls through to native `jsonb @>`. +The needle must be typed — `$1::eql_v3.query_jsonb`, another `public.json`, or an `public.jsonb_entry`. A bare untyped literal falls through to native `jsonb @>`. ### GIN vs B-tree / hash diff --git a/docs/reference/json-support.md b/docs/reference/json-support.md index fbc2febce..0bf217c57 100644 --- a/docs/reference/json-support.md +++ b/docs/reference/json-support.md @@ -43,7 +43,7 @@ Always give the operand a known type: ```sql -- ✅ correct — typed operand resolves to the eql_v3 operator WHERE doc -> 'email'::text = $1 -WHERE doc @> $1::public.query_jsonb +WHERE doc @> $1::eql_v3.query_jsonb WHERE doc -> $1 -- a text parameter (the CipherStash Proxy interface) -- ⚠ wrong — bare untyped literal resolves to native jsonb -> text, returns NULL @@ -56,11 +56,11 @@ This is **intrinsic to the domain type-kind**, not a bug: the only way to remove ### Containment queries (`@>`, `<@`) -`@>` tests whether the encrypted document contains a structure; `<@` is the reverse. The needle must be **typed** — another `public.json`, an `public.query_jsonb`, or an `public.jsonb_entry`: +`@>` tests whether the encrypted document contains a structure; `<@` is the reverse. The needle must be **typed** — another `public.json`, an `eql_v3.query_jsonb`, or an `public.jsonb_entry`: ```sql SELECT * FROM examples -WHERE encrypted_json @> $1::public.query_jsonb; +WHERE encrypted_json @> $1::eql_v3.query_jsonb; ``` This is the encrypted equivalent of the plaintext `jsonb_column @> '{"top":{"nested":["a"]}}'`. @@ -72,7 +72,7 @@ CREATE INDEX examples_json_gin ON examples USING gin (eql_v3.to_ste_vec_query(encrypted_json)::jsonb jsonb_path_ops); ANALYZE examples; -SELECT * FROM examples WHERE encrypted_json @> $1::public.query_jsonb; +SELECT * FROM examples WHERE encrypted_json @> $1::eql_v3.query_jsonb; ``` See [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment) for the full setup. @@ -145,7 +145,7 @@ GROUP BY eql_v3.eq_term(encrypted_json -> 'color_selector'::text); - **`eql_v3.ste_vec(val jsonb) RETURNS jsonb[]`** — extracts the ste_vec index array from an encrypted payload. - **`eql_v3.ste_vec_contains(a public.json, b public.json) RETURNS boolean`** — true if all ste_vec terms in `b` exist in `a`; backs the `@>` operator. -- **`eql_v3.to_ste_vec_query(val public.json) RETURNS public.query_jsonb`** — the GIN-indexable query shape `@>` inlines to. +- **`eql_v3.to_ste_vec_query(val public.json) RETURNS eql_v3.query_jsonb`** — the GIN-indexable query shape `@>` inlines to. - **`eql_v3.meta_data(val jsonb)`**, **`eql_v3.ciphertext(val jsonb)`**, **`eql_v3.selector(val jsonb)` / `(entry public.jsonb_entry)`** — envelope / ciphertext / selector accessors. ### Path query functions @@ -197,7 +197,7 @@ Structured Encryption (ste_vec) makes a JSONB document searchable by: ```sql -- Find records where account.email = "alice@example.com" -WHERE encrypted_data @> $1::public.query_jsonb; +WHERE encrypted_data @> $1::eql_v3.query_jsonb; ``` Encryption and selector generation are handled by CipherStash Proxy or CipherStash Stack, not by EQL directly. diff --git a/docs/reference/permissions.md b/docs/reference/permissions.md index 005db29eb..88ca3128b 100644 --- a/docs/reference/permissions.md +++ b/docs/reference/permissions.md @@ -60,6 +60,7 @@ needs `USAGE` on it anyway. The exact requirement is path-dependent: | jsonb containment read (`@>` `<@` / `ste_vec_contains`) | ✅ | — | — | | Cast/write raw JSON → `public.json` | ✅ | ✅ | — | | Cast/write raw JSON → a scalar domain (`public.integer`…) | ✅ | — | — | +| Cast a query operand → `eql_v3.query_` / `eql_v3.query_jsonb` | ✅ | — | — | Why the internal grant is needed even though you only call public objects: @@ -73,7 +74,7 @@ Why the internal grant is needed even though you only call public objects: - The **ORE comparison** behind ordering and `MIN`/`MAX` calls pgcrypto `encrypt()`, which the installer places in the `extensions` schema — hence the `USAGE` there. -- **Casting raw jsonb to `public.json` or `public.query_jsonb`** fires a +- **Casting raw jsonb to `public.json` or `eql_v3.query_jsonb`** fires a domain `CHECK` that calls an `eql_v3_internal.is_valid_*` validator. (Scalar domain CHECKs — and, since issue #354, the `public.jsonb_entry` CHECK — are pure structural jsonb tests, so casting to those domains needs no internal diff --git a/docs/reference/sql-support.md b/docs/reference/sql-support.md index 17c539edf..a48d03572 100644 --- a/docs/reference/sql-support.md +++ b/docs/reference/sql-support.md @@ -136,7 +136,7 @@ The search capabilities available on a value extracted via `->` or `eql_v3.jsonb | SQL form | Resolves to | Returns / notes | | -------------------------------- | -------------------------------------------------- | --------------- | -| `doc @> needle` / `needle <@ doc` | `eql_v3."@>"` / `eql_v3."<@"` | document containment; GIN-indexable via `eql_v3.to_ste_vec_query(doc)::jsonb` — see [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment). `needle` must be typed (`$1::public.query_jsonb`, another `public.json`, or an `public.jsonb_entry`). | +| `doc @> needle` / `needle <@ doc` | `eql_v3."@>"` / `eql_v3."<@"` | document containment; GIN-indexable via `eql_v3.to_ste_vec_query(doc)::jsonb` — see [GIN Indexes for JSONB Containment](./database-indexes.md#gin-indexes-for-jsonb-containment). `needle` must be typed (`$1::eql_v3.query_jsonb`, another `public.json`, or an `public.jsonb_entry`). | | `doc -> 'sel'::text` / `doc -> N` | `eql_v3."->"` | field / 0-based array-element access; returns `public.jsonb_entry`. | | `doc ->> 'sel'::text` | `eql_v3."->>"` | the matching entry serialized as `text` (ciphertext JSON, **not** decrypted plaintext). | | extracted-leaf `=` `<>` | `eql_v3.eq_term(public.jsonb_entry)` | equality on a value extracted via `->` (e.g. `doc -> 'sel'::text = $1`). | @@ -145,7 +145,7 @@ The search capabilities available on a value extracted via `->` or `eql_v3.jsonb | `eql_v3.jsonb_path_query(doc, sel)` | path query | set-returning; yields encrypted entries. Also `jsonb_path_query_first`, `jsonb_path_exists`. | | `eql_v3.jsonb_array_length/elements/elements_text(doc)` | array helpers | length / set-returning elements / element text. | -> **Typed operands (important).** The selector / needle operand must carry a **known type** — a typed parameter (`$1`, which the Proxy supplies) or an explicit cast (`doc -> 'sel'::text`, `$1::public.query_jsonb`). A bare untyped literal (`doc -> 'sel'`) resolves to the **native `jsonb` operator** (PostgreSQL reduces the `public.json` domain to its `jsonb` base type for an unknown-typed RHS) and silently returns native jsonb semantics instead of the encrypted operator. +> **Typed operands (important).** The selector / needle operand must carry a **known type** — a typed parameter (`$1`, which the Proxy supplies) or an explicit cast (`doc -> 'sel'::text`, `$1::eql_v3.query_jsonb`). A bare untyped literal (`doc -> 'sel'`) resolves to the **native `jsonb` operator** (PostgreSQL reduces the `public.json` domain to its `jsonb` base type for an unknown-typed RHS) and silently returns native jsonb semantics instead of the encrypted operator. ### Blocked JSONB operators diff --git a/docs/tutorials/proxy-configuration.md b/docs/tutorials/proxy-configuration.md index f4adb1978..7b4ddd9a8 100644 --- a/docs/tutorials/proxy-configuration.md +++ b/docs/tutorials/proxy-configuration.md @@ -102,7 +102,7 @@ SELECT * FROM users WHERE encrypted_name @> $1::public.text_match; **Encrypted JSON** (`public.json`) — containment and field access; see [EQL with JSON and JSONB](../reference/json-support.md): ```sql -SELECT * FROM users WHERE encrypted_profile @> $1::public.query_jsonb; +SELECT * FROM users WHERE encrypted_profile @> $1::eql_v3.query_jsonb; SELECT encrypted_profile -> 'email_selector'::text FROM users; ``` @@ -118,7 +118,7 @@ SELECT encrypted_profile -> 'email_selector'::text FROM users; ## Troubleshooting -**Operator resolves to native `jsonb` / returns `NULL` instead of searching.** The query operand was an untyped literal, so PostgreSQL flattened the `eql_v3` domain to `jsonb`. Type the operand (`$1::public.text_eq`, `$1::public.query_jsonb`) — the Proxy does this automatically. +**Operator resolves to native `jsonb` / returns `NULL` instead of searching.** The query operand was an untyped literal, so PostgreSQL flattened the `eql_v3` domain to `jsonb`. Type the operand (`$1::public.text_eq`, `$1::eql_v3.query_jsonb`) — the Proxy does this automatically. **`=` returns no rows.** The column's values do not carry an `hm` equality term. Confirm the client is configured to emit the right term for the column's variant (step 2), and that data was written through the Proxy after configuring it. diff --git a/docs/upgrading/v3.0.md b/docs/upgrading/v3.0.md index 9f04fb4c5..7772cf6cb 100644 --- a/docs/upgrading/v3.0.md +++ b/docs/upgrading/v3.0.md @@ -8,14 +8,14 @@ release is prepared. ## TL;DR 1. **The `eql_v3` JSON envelope version is now `v: 3`** ([U-001](#u-001-eql_v3-payloads-carry-v-3)). Every `eql_v3` domain `CHECK` pins `VALUE->>'v' = '3'`, and the published payload bindings (Rust / TypeScript / JSON Schema) accept exactly `3`. Payloads carrying the legacy `v: 2` are rejected on insert or cast. -2. **Query-operand domains are named `query_`, not `_query`** ([U-002](#u-002-query-operand-domains-use-the-query_-prefix)). `public.integer_eq_query` → `public.query_integer_eq`, and the encrypted-JSONB containment needle `public.jsonb_query` → `public.query_jsonb`. Only affects 3.0.0 pre-release adopters — the suffix names never shipped in a final release. +2. **Query-operand domains are `eql_v3.query_`** ([U-002](#u-002-query-operand-domains-are-eql_v3query_name)). Renamed from the `_query` suffix to a `query_` prefix AND moved from `public` into the `eql_v3` schema: `public.integer_eq_query` → `eql_v3.query_integer_eq`, and the encrypted-JSONB containment needle `public.jsonb_query` → `eql_v3.query_jsonb`. Only affects 3.0.0 pre-release adopters — the old names never shipped in a final release. ## Compatibility | Component | Status | | --- | --- | | `eql_v3` schema name, column-domain names, operator names | **Unchanged.** | -| Query-operand domain names (`_query`, `jsonb_query` — 3.0.0 pre-releases only) | **Changed.** Renamed to `query_` / `query_jsonb` — see U-002. | +| Query-operand domains (`public._query`, `public.jsonb_query` — 3.0.0 pre-releases only) | **Changed.** Now `eql_v3.query_` / `eql_v3.query_jsonb` — see U-002. | | `eql_v3` payload envelope version (`v`) | **Changed.** `2` → `3`. Re-encryption / re-emission with a v3-envelope client required — see U-001. | | `eql_v3` payload term keys (`hm` / `ob` / `bf`, new `op`) | **Unchanged** (additive `op`). | | Legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json`) | **Unchanged.** Stays `v: 2`. | @@ -53,42 +53,62 @@ SELECT '{"v":2,"i":{},"c":"x","hm":"aa"}'::jsonb::public.text_eq; SELECT '{"v":3,"i":{},"c":"x","hm":"aa"}'::jsonb::public.text_eq; ``` -### U-002: Query-operand domains use the `query_` prefix +### U-002: Query-operand domains are `eql_v3.query_` **What changed.** The query-operand domains — the index-terms-only twins a -client casts query parameters to — are named with a `query_` PREFIX instead of -the `_query` suffix used during the 3.0.0 pre-releases: `public.query_` -for every term-bearing scalar domain (`public.query_integer_eq`, -`public.query_text_ord`, …) and `public.query_jsonb` for the encrypted-JSONB -containment needle (was `public.jsonb_query`). The suffix names never shipped -in a final release. - -**Why.** The query-operand domains live in `public` alongside the column -domains they twin, so alphabetical type listings — most visibly Supabase -Studio's Table Builder type picker — interleaved never-a-column-type query -operands with the actual column types (`integer_eq` next to -`integer_eq_query`). The shared `query_` prefix makes every query operand sort -together, apart from the column domains. +client casts query parameters to — changed identity in two coordinated ways +relative to the 3.0.0 pre-releases: + +1. **Named with a `query_` PREFIX** instead of the `_query` suffix: + `query_integer_eq`, `query_text_ord`, …, and `query_jsonb` for the + encrypted-JSONB containment needle (was `jsonb_query`). +2. **Moved from `public` into the `eql_v3` schema**: `eql_v3.query_integer_eq`, + `eql_v3.query_jsonb`, …. + +The old names never shipped in a final release. The column-type domains +(`public.integer_eq`, `public.json`, `public.jsonb_entry`, …) are unchanged — +they stay in `public` so dropping EQL-owned schemas can never drop an +application column. + +**Why.** A query operand is never a valid column type, so it doesn't belong in +the column-type namespace: in `public` the operands interleaved with the +actual column types in alphabetical type listings (most visibly Supabase +Studio's Table Builder type picker), and the survive-schema-drop rationale for +`public` placement doesn't apply to a type no application column should use. +In `eql_v3` the operands are versioned and uninstalled with the rest of the +public API surface, and the `query_` prefix keeps them sorted together +wherever they are listed. **Who is affected.** Only adopters of the 3.0.0 pre-releases. Any SQL casting -to a `_query` domain (`WHERE col = $1::public.integer_eq_query`, +to a pre-release query domain (`WHERE col = $1::public.integer_eq_query`, `WHERE doc @> $1::public.jsonb_query`), and any client resolving the `eql-bindings` query domains by name (`QueryPayload::parse("integer_eq_query", …)`, the `schema/v3/*_query.json` JSON Schema files). -**What to do.** Rename the casts (`$1::public.query_integer_eq`, -`$1::public.query_jsonb`) and update `eql-bindings` to the matching release -(the `DomainType::sql_domain` strings, `QueryPayload::parse` names, and JSON -Schema file names follow the new convention). GIN containment indexes built -over `eql_v3.to_ste_vec_query(col)` are unaffected — the function name is -unchanged; only the domain type was renamed. +**What to do.** + +- Rename the casts: `$1::eql_v3.query_integer_eq`, `$1::eql_v3.query_jsonb`. +- Update `eql-bindings` to the matching release (the + `DomainType::sql_domain` strings, `QueryPayload::parse` names, and JSON + Schema file names follow the new convention). +- Grants: casting to an `eql_v3` domain requires `USAGE ON SCHEMA eql_v3` — + the same grant a querying role already needs for the extractors and + comparison wrappers (see `docs/reference/permissions.md`), so no new grant + is expected in practice. +- Audit for misuse: if any table column was declared with a pre-release + query-operand type, move it to the matching storage domain — from 3.0.0 the + uninstaller's `DROP SCHEMA eql_v3 CASCADE` drops query-operand-typed + columns with the schema. +- GIN containment indexes built over `eql_v3.to_ste_vec_query(col)` are + unaffected — the function name is unchanged; only the domain type moved. **Verification.** ```sql --- Must succeed (the renamed operand domains exist): -SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::public.query_text_eq; -SELECT '{"sv":[{"s":"aa","hm":"bb"}]}'::jsonb::public.query_jsonb; +-- Must succeed (the relocated operand domains exist): +SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::eql_v3.query_text_eq; +SELECT '{"sv":[{"s":"aa","hm":"bb"}]}'::jsonb::eql_v3.query_jsonb; -- Must fail with "type does not exist" (the pre-release names are gone): SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::public.text_eq_query; +SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::public.query_text_eq; ``` diff --git a/src/v3/jsonb/operators.sql b/src/v3/jsonb/operators.sql index f71ab1f04..fa7ec9319 100644 --- a/src/v3/jsonb/operators.sql +++ b/src/v3/jsonb/operators.sql @@ -150,9 +150,9 @@ CREATE OPERATOR @>( --! functional GIN index on the same expression engages. --! --! @param a public.json Container. ---! @param b public.query_jsonb Query payload. +--! @param b eql_v3.query_jsonb Query payload. --! @return boolean True if a contains b. -CREATE FUNCTION eql_v3."@>"(a public.json, b public.query_jsonb) +CREATE FUNCTION eql_v3."@>"(a public.json, b eql_v3.query_jsonb) RETURNS boolean LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -162,7 +162,7 @@ $$; CREATE OPERATOR @>( FUNCTION=eql_v3."@>", LEFTARG=public.json, - RIGHTARG=public.query_jsonb + RIGHTARG=eql_v3.query_jsonb ); --! @brief @> contains operator with a single jsonb_entry needle. @@ -220,10 +220,10 @@ CREATE OPERATOR <@( ); --! @brief <@ contained-by operator with an query_jsonb LHS. ---! @param a public.query_jsonb Query payload. +--! @param a eql_v3.query_jsonb Query payload. --! @param b public.json Container. --! @return boolean True if b contains a. -CREATE FUNCTION eql_v3."<@"(a public.query_jsonb, b public.json) +CREATE FUNCTION eql_v3."<@"(a eql_v3.query_jsonb, b public.json) RETURNS boolean LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE AS $$ @@ -232,7 +232,7 @@ $$; CREATE OPERATOR <@( FUNCTION=eql_v3."<@", - LEFTARG=public.query_jsonb, + LEFTARG=eql_v3.query_jsonb, RIGHTARG=public.json ); diff --git a/src/v3/jsonb/types.sql b/src/v3/jsonb/types.sql index c36c8e6e6..89b822981 100644 --- a/src/v3/jsonb/types.sql +++ b/src/v3/jsonb/types.sql @@ -8,7 +8,7 @@ --! blockers.sql can attach): --! - public.json — storage/root: an EQL envelope object ({i, v, ...}). --! - public.jsonb_entry — a single sv element (returned by `->`). ---! - public.query_jsonb — a containment needle (sv elements, no ciphertext). +--! - eql_v3.query_jsonb — a containment needle (sv elements, no ciphertext). --! @brief Validate a single SteVec entry payload. --! @internal @@ -39,7 +39,7 @@ $$; --! string `s`, no ciphertext, and exactly one string term (`hm` XOR --! `oc`). --! @note plpgsql, not LANGUAGE sql (issues #353/#354): the only caller is the ---! public.query_jsonb domain CHECK, where a SQL function can never be +--! eql_v3.query_jsonb domain CHECK, where a SQL function can never be --! inlined (and the CHECK itself cannot absorb this body — it needs a --! subquery over the sv elements, which CHECK constraints forbid). plpgsql --! caches its plan across calls instead of paying the per-call SQL-function @@ -188,7 +188,7 @@ $$; --! `jsonb @>`. --! --! @note Construct from inline JSON via the DOMAIN cast: ---! `'{"sv":[{"s":"","hm":""}]}'::public.query_jsonb`. +--! `'{"sv":[{"s":"","hm":""}]}'::eql_v3.query_jsonb`. --! @see eql_v3.to_ste_vec_query --! --! @internal @@ -199,21 +199,21 @@ $$; --! plan; substantially cheaper per call than a non-inlined LANGUAGE sql --! function — the same finding as issue #353), since this cast sits on the --! per-query hot path of every containment scenario ---! (`$1::jsonb::public.query_jsonb`). +--! (`$1::jsonb::eql_v3.query_jsonb`). --! @endinternal DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_jsonb' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_jsonb' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_jsonb AS jsonb + CREATE DOMAIN eql_v3.query_jsonb AS jsonb CHECK ( public.eql_v3_is_valid_ste_vec_query_payload(VALUE) ); END IF; - COMMENT ON DOMAIN public.query_jsonb IS 'EQL JSONB query operand (containment)'; + COMMENT ON DOMAIN eql_v3.query_jsonb IS 'EQL JSONB query operand (containment)'; END $$; @@ -226,10 +226,10 @@ $$; --! `GIN (eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops)`. --! --! @param e public.json Source encrypted payload ---! @return public.query_jsonb Query-shaped needle, sv elements normalised. ---! @see public.query_jsonb +--! @return eql_v3.query_jsonb Query-shaped needle, sv elements normalised. +--! @see eql_v3.query_jsonb CREATE FUNCTION eql_v3.to_ste_vec_query(e public.json) - RETURNS public.query_jsonb + RETURNS eql_v3.query_jsonb LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT jsonb_build_object( @@ -247,9 +247,9 @@ AS $$ FROM jsonb_array_elements(e::jsonb -> 'sv') AS elem), '[]'::jsonb ) - )::public.query_jsonb + )::eql_v3.query_jsonb $$; -CREATE CAST (public.json AS public.query_jsonb) +CREATE CAST (public.json AS eql_v3.query_jsonb) WITH FUNCTION eql_v3.to_ste_vec_query AS ASSIGNMENT; diff --git a/src/v3/scalars/bigint/query_bigint_eq_functions.sql b/src/v3/scalars/bigint/query_bigint_eq_functions.sql index 724ed1c4a..c6673878a 100644 --- a/src/v3/scalars/bigint/query_bigint_eq_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/bigint/bigint_eq_functions.sql --! @file encrypted_domain/bigint/query_bigint_eq_functions.sql ---! @brief Functions for public.query_bigint_eq. +--! @brief Functions for eql_v3.query_bigint_eq. ---! @brief Index extractor for public.query_bigint_eq. ---! @param a public.query_bigint_eq +--! @brief Index extractor for eql_v3.query_bigint_eq. +--! @param a eql_v3.query_bigint_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_bigint_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_bigint_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_bigint_eq. +--! @brief Operator wrapper for eql_v3.query_bigint_eq. --! @param a public.bigint_eq ---! @param b public.query_bigint_eq +--! @param b eql_v3.query_bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b public.query_bigint_eq) +CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b eql_v3.query_bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_eq. ---! @param a public.query_bigint_eq +--! @brief Operator wrapper for eql_v3.query_bigint_eq. +--! @param a eql_v3.query_bigint_eq --! @param b public.bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_bigint_eq, b public.bigint_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_eq, b public.bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_eq. +--! @brief Operator wrapper for eql_v3.query_bigint_eq. --! @param a public.bigint_eq ---! @param b public.query_bigint_eq +--! @param b eql_v3.query_bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b public.query_bigint_eq) +CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b eql_v3.query_bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_eq. ---! @param a public.query_bigint_eq +--! @brief Operator wrapper for eql_v3.query_bigint_eq. +--! @param a eql_v3.query_bigint_eq --! @param b public.bigint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_bigint_eq, b public.bigint_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_eq, b public.bigint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/bigint/query_bigint_eq_operators.sql b/src/v3/scalars/bigint/query_bigint_eq_operators.sql index afcb37978..9b0268c4f 100644 --- a/src/v3/scalars/bigint/query_bigint_eq_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/bigint/query_bigint_eq_functions.sql --! @file encrypted_domain/bigint/query_bigint_eq_operators.sql ---! @brief Operators for public.query_bigint_eq. +--! @brief Operators for eql_v3.query_bigint_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_eq, RIGHTARG = public.query_bigint_eq, + LEFTARG = public.bigint_eq, RIGHTARG = eql_v3.query_bigint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_bigint_eq, RIGHTARG = public.bigint_eq, + LEFTARG = eql_v3.query_bigint_eq, RIGHTARG = public.bigint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_eq, RIGHTARG = public.query_bigint_eq, + LEFTARG = public.bigint_eq, RIGHTARG = eql_v3.query_bigint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_bigint_eq, RIGHTARG = public.bigint_eq, + LEFTARG = eql_v3.query_bigint_eq, RIGHTARG = public.bigint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/bigint/query_bigint_ord_functions.sql b/src/v3/scalars/bigint/query_bigint_ord_functions.sql index cd3b90348..a2796ba1c 100644 --- a/src/v3/scalars/bigint/query_bigint_ord_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/bigint/bigint_ord_functions.sql --! @file encrypted_domain/bigint/query_bigint_ord_functions.sql ---! @brief Functions for public.query_bigint_ord. +--! @brief Functions for eql_v3.query_bigint_ord. ---! @brief Index extractor for public.query_bigint_ord. ---! @param a public.query_bigint_ord +--! @brief Index extractor for eql_v3.query_bigint_ord. +--! @param a eql_v3.query_bigint_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_bigint_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_bigint_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_bigint_ord. +--! @brief Operator wrapper for eql_v3.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.query_bigint_ord +--! @param b eql_v3.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b public.query_bigint_ord) +CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b eql_v3.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. ---! @param a public.query_bigint_ord +--! @brief Operator wrapper for eql_v3.query_bigint_ord. +--! @param a eql_v3.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_bigint_ord, b public.bigint_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. +--! @brief Operator wrapper for eql_v3.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.query_bigint_ord +--! @param b eql_v3.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b public.query_bigint_ord) +CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b eql_v3.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. ---! @param a public.query_bigint_ord +--! @brief Operator wrapper for eql_v3.query_bigint_ord. +--! @param a eql_v3.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_bigint_ord, b public.bigint_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. +--! @brief Operator wrapper for eql_v3.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.query_bigint_ord +--! @param b eql_v3.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b public.query_bigint_ord) +CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b eql_v3.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. ---! @param a public.query_bigint_ord +--! @brief Operator wrapper for eql_v3.query_bigint_ord. +--! @param a eql_v3.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_bigint_ord, b public.bigint_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. +--! @brief Operator wrapper for eql_v3.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.query_bigint_ord +--! @param b eql_v3.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b public.query_bigint_ord) +CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b eql_v3.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. ---! @param a public.query_bigint_ord +--! @brief Operator wrapper for eql_v3.query_bigint_ord. +--! @param a eql_v3.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_bigint_ord, b public.bigint_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. +--! @brief Operator wrapper for eql_v3.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.query_bigint_ord +--! @param b eql_v3.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b public.query_bigint_ord) +CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b eql_v3.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. ---! @param a public.query_bigint_ord +--! @brief Operator wrapper for eql_v3.query_bigint_ord. +--! @param a eql_v3.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_bigint_ord, b public.bigint_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. +--! @brief Operator wrapper for eql_v3.query_bigint_ord. --! @param a public.bigint_ord ---! @param b public.query_bigint_ord +--! @param b eql_v3.query_bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b public.query_bigint_ord) +CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b eql_v3.query_bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord. ---! @param a public.query_bigint_ord +--! @brief Operator wrapper for eql_v3.query_bigint_ord. +--! @param a eql_v3.query_bigint_ord --! @param b public.bigint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_bigint_ord, b public.bigint_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord, b public.bigint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql b/src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql index 93a678c77..9d7e00a36 100644 --- a/src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ope_functions.sql --! @file encrypted_domain/bigint/query_bigint_ord_ope_functions.sql ---! @brief Functions for public.query_bigint_ord_ope. +--! @brief Functions for eql_v3.query_bigint_ord_ope. ---! @brief Index extractor for public.query_bigint_ord_ope. ---! @param a public.query_bigint_ord_ope +--! @brief Index extractor for eql_v3.query_bigint_ord_ope. +--! @param a eql_v3.query_bigint_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_bigint_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_bigint_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.query_bigint_ord_ope +--! @param b eql_v3.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. ---! @param a public.query_bigint_ord_ope +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. +--! @param a eql_v3.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.query_bigint_ord_ope +--! @param b eql_v3.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. ---! @param a public.query_bigint_ord_ope +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. +--! @param a eql_v3.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.query_bigint_ord_ope +--! @param b eql_v3.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. ---! @param a public.query_bigint_ord_ope +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. +--! @param a eql_v3.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.query_bigint_ord_ope +--! @param b eql_v3.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. ---! @param a public.query_bigint_ord_ope +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. +--! @param a eql_v3.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.query_bigint_ord_ope +--! @param b eql_v3.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. ---! @param a public.query_bigint_ord_ope +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. +--! @param a eql_v3.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. --! @param a public.bigint_ord_ope ---! @param b public.query_bigint_ord_ope +--! @param b eql_v3.query_bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ope. ---! @param a public.query_bigint_ord_ope +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope. +--! @param a eql_v3.query_bigint_ord_ope --! @param b public.bigint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/bigint/query_bigint_ord_ope_operators.sql b/src/v3/scalars/bigint/query_bigint_ord_ope_operators.sql index ac3869ae4..40681965c 100644 --- a/src/v3/scalars/bigint/query_bigint_ord_ope_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/bigint/query_bigint_ord_ope_functions.sql --! @file encrypted_domain/bigint/query_bigint_ord_ope_operators.sql ---! @brief Operators for public.query_bigint_ord_ope. +--! @brief Operators for eql_v3.query_bigint_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, + LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, + LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, + LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, + LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, + LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, + LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, + LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, + LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, + LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, + LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord_ope, RIGHTARG = public.query_bigint_ord_ope, + LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, + LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/bigint/query_bigint_ord_operators.sql b/src/v3/scalars/bigint/query_bigint_ord_operators.sql index 8549053d8..cd11a78dc 100644 --- a/src/v3/scalars/bigint/query_bigint_ord_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/bigint/query_bigint_ord_functions.sql --! @file encrypted_domain/bigint/query_bigint_ord_operators.sql ---! @brief Operators for public.query_bigint_ord. +--! @brief Operators for eql_v3.query_bigint_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, + LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, + LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, + LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, + LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, + LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, + LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, + LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, + LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, + LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, + LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord, RIGHTARG = public.query_bigint_ord, + LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_bigint_ord, RIGHTARG = public.bigint_ord, + LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql b/src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql index 498a110dd..f12a75b35 100644 --- a/src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/bigint/bigint_ord_ore_functions.sql --! @file encrypted_domain/bigint/query_bigint_ord_ore_functions.sql ---! @brief Functions for public.query_bigint_ord_ore. +--! @brief Functions for eql_v3.query_bigint_ord_ore. ---! @brief Index extractor for public.query_bigint_ord_ore. ---! @param a public.query_bigint_ord_ore +--! @brief Index extractor for eql_v3.query_bigint_ord_ore. +--! @param a eql_v3.query_bigint_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_bigint_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_bigint_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.query_bigint_ord_ore +--! @param b eql_v3.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. ---! @param a public.query_bigint_ord_ore +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. +--! @param a eql_v3.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.query_bigint_ord_ore +--! @param b eql_v3.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. ---! @param a public.query_bigint_ord_ore +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. +--! @param a eql_v3.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.query_bigint_ord_ore +--! @param b eql_v3.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. ---! @param a public.query_bigint_ord_ore +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. +--! @param a eql_v3.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.query_bigint_ord_ore +--! @param b eql_v3.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. ---! @param a public.query_bigint_ord_ore +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. +--! @param a eql_v3.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.query_bigint_ord_ore +--! @param b eql_v3.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. ---! @param a public.query_bigint_ord_ore +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. +--! @param a eql_v3.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. --! @param a public.bigint_ord_ore ---! @param b public.query_bigint_ord_ore +--! @param b eql_v3.query_bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_bigint_ord_ore. ---! @param a public.query_bigint_ord_ore +--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore. +--! @param a eql_v3.query_bigint_ord_ore --! @param b public.bigint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/bigint/query_bigint_ord_ore_operators.sql b/src/v3/scalars/bigint/query_bigint_ord_ore_operators.sql index d11a3581c..84358a8c8 100644 --- a/src/v3/scalars/bigint/query_bigint_ord_ore_operators.sql +++ b/src/v3/scalars/bigint/query_bigint_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/bigint/query_bigint_ord_ore_functions.sql --! @file encrypted_domain/bigint/query_bigint_ord_ore_operators.sql ---! @brief Operators for public.query_bigint_ord_ore. +--! @brief Operators for eql_v3.query_bigint_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, + LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, + LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, + LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, + LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, + LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, + LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, + LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, + LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, + LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, + LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.bigint_ord_ore, RIGHTARG = public.query_bigint_ord_ore, + LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, + LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/bigint/query_bigint_types.sql b/src/v3/scalars/bigint/query_bigint_types.sql index 9b29246a1..e4570d506 100644 --- a/src/v3/scalars/bigint/query_bigint_types.sql +++ b/src/v3/scalars/bigint/query_bigint_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/bigint/query_bigint_types.sql --! @brief Query-operand domains for bigint (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_bigint_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_bigint_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_bigint_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_bigint_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_bigint_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_bigint_eq AS jsonb + CREATE DOMAIN eql_v3.query_bigint_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_bigint_eq IS 'EQL bigint query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_bigint_eq IS 'EQL bigint query operand (equality)'; - --! @brief Query-operand domain public.query_bigint_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_bigint_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_bigint_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_bigint_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_bigint_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_bigint_ord_ore IS 'EQL bigint query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_bigint_ord_ore IS 'EQL bigint query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_bigint_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_bigint_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_bigint_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_bigint_ord AS jsonb + CREATE DOMAIN eql_v3.query_bigint_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_bigint_ord IS 'EQL bigint query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_bigint_ord IS 'EQL bigint query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_bigint_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_bigint_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_bigint_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_bigint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_bigint_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_bigint_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_bigint_ord_ope IS 'EQL bigint query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_bigint_ord_ope IS 'EQL bigint query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/date/query_date_eq_functions.sql b/src/v3/scalars/date/query_date_eq_functions.sql index 0335e3a61..88f557f69 100644 --- a/src/v3/scalars/date/query_date_eq_functions.sql +++ b/src/v3/scalars/date/query_date_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/date/date_eq_functions.sql --! @file encrypted_domain/date/query_date_eq_functions.sql ---! @brief Functions for public.query_date_eq. +--! @brief Functions for eql_v3.query_date_eq. ---! @brief Index extractor for public.query_date_eq. ---! @param a public.query_date_eq +--! @brief Index extractor for eql_v3.query_date_eq. +--! @param a eql_v3.query_date_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_date_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_date_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_date_eq. +--! @brief Operator wrapper for eql_v3.query_date_eq. --! @param a public.date_eq ---! @param b public.query_date_eq +--! @param b eql_v3.query_date_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_eq, b public.query_date_eq) +CREATE FUNCTION eql_v3.eq(a public.date_eq, b eql_v3.query_date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_date_eq. ---! @param a public.query_date_eq +--! @brief Operator wrapper for eql_v3.query_date_eq. +--! @param a eql_v3.query_date_eq --! @param b public.date_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_date_eq, b public.date_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_eq, b public.date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_date_eq. +--! @brief Operator wrapper for eql_v3.query_date_eq. --! @param a public.date_eq ---! @param b public.query_date_eq +--! @param b eql_v3.query_date_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_eq, b public.query_date_eq) +CREATE FUNCTION eql_v3.neq(a public.date_eq, b eql_v3.query_date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_date_eq. ---! @param a public.query_date_eq +--! @brief Operator wrapper for eql_v3.query_date_eq. +--! @param a eql_v3.query_date_eq --! @param b public.date_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_date_eq, b public.date_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_eq, b public.date_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/date/query_date_eq_operators.sql b/src/v3/scalars/date/query_date_eq_operators.sql index cd7b69882..b816f1cee 100644 --- a/src/v3/scalars/date/query_date_eq_operators.sql +++ b/src/v3/scalars/date/query_date_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/date/query_date_eq_functions.sql --! @file encrypted_domain/date/query_date_eq_operators.sql ---! @brief Operators for public.query_date_eq. +--! @brief Operators for eql_v3.query_date_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_eq, RIGHTARG = public.query_date_eq, + LEFTARG = public.date_eq, RIGHTARG = eql_v3.query_date_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_date_eq, RIGHTARG = public.date_eq, + LEFTARG = eql_v3.query_date_eq, RIGHTARG = public.date_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_eq, RIGHTARG = public.query_date_eq, + LEFTARG = public.date_eq, RIGHTARG = eql_v3.query_date_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_date_eq, RIGHTARG = public.date_eq, + LEFTARG = eql_v3.query_date_eq, RIGHTARG = public.date_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/date/query_date_ord_functions.sql b/src/v3/scalars/date/query_date_ord_functions.sql index bd9e42e27..c3990ccda 100644 --- a/src/v3/scalars/date/query_date_ord_functions.sql +++ b/src/v3/scalars/date/query_date_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/date/date_ord_functions.sql --! @file encrypted_domain/date/query_date_ord_functions.sql ---! @brief Functions for public.query_date_ord. +--! @brief Functions for eql_v3.query_date_ord. ---! @brief Index extractor for public.query_date_ord. ---! @param a public.query_date_ord +--! @brief Index extractor for eql_v3.query_date_ord. +--! @param a eql_v3.query_date_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_date_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_date_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_date_ord. +--! @brief Operator wrapper for eql_v3.query_date_ord. --! @param a public.date_ord ---! @param b public.query_date_ord +--! @param b eql_v3.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord, b public.query_date_ord) +CREATE FUNCTION eql_v3.eq(a public.date_ord, b eql_v3.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. ---! @param a public.query_date_ord +--! @brief Operator wrapper for eql_v3.query_date_ord. +--! @param a eql_v3.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_date_ord, b public.date_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. +--! @brief Operator wrapper for eql_v3.query_date_ord. --! @param a public.date_ord ---! @param b public.query_date_ord +--! @param b eql_v3.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord, b public.query_date_ord) +CREATE FUNCTION eql_v3.neq(a public.date_ord, b eql_v3.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. ---! @param a public.query_date_ord +--! @brief Operator wrapper for eql_v3.query_date_ord. +--! @param a eql_v3.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_date_ord, b public.date_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. +--! @brief Operator wrapper for eql_v3.query_date_ord. --! @param a public.date_ord ---! @param b public.query_date_ord +--! @param b eql_v3.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord, b public.query_date_ord) +CREATE FUNCTION eql_v3.lt(a public.date_ord, b eql_v3.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. ---! @param a public.query_date_ord +--! @brief Operator wrapper for eql_v3.query_date_ord. +--! @param a eql_v3.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_date_ord, b public.date_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. +--! @brief Operator wrapper for eql_v3.query_date_ord. --! @param a public.date_ord ---! @param b public.query_date_ord +--! @param b eql_v3.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord, b public.query_date_ord) +CREATE FUNCTION eql_v3.lte(a public.date_ord, b eql_v3.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. ---! @param a public.query_date_ord +--! @brief Operator wrapper for eql_v3.query_date_ord. +--! @param a eql_v3.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_date_ord, b public.date_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. +--! @brief Operator wrapper for eql_v3.query_date_ord. --! @param a public.date_ord ---! @param b public.query_date_ord +--! @param b eql_v3.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord, b public.query_date_ord) +CREATE FUNCTION eql_v3.gt(a public.date_ord, b eql_v3.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. ---! @param a public.query_date_ord +--! @brief Operator wrapper for eql_v3.query_date_ord. +--! @param a eql_v3.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_date_ord, b public.date_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. +--! @brief Operator wrapper for eql_v3.query_date_ord. --! @param a public.date_ord ---! @param b public.query_date_ord +--! @param b eql_v3.query_date_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord, b public.query_date_ord) +CREATE FUNCTION eql_v3.gte(a public.date_ord, b eql_v3.query_date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord. ---! @param a public.query_date_ord +--! @brief Operator wrapper for eql_v3.query_date_ord. +--! @param a eql_v3.query_date_ord --! @param b public.date_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_date_ord, b public.date_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord, b public.date_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/date/query_date_ord_ope_functions.sql b/src/v3/scalars/date/query_date_ord_ope_functions.sql index a4db297dd..f2f631fae 100644 --- a/src/v3/scalars/date/query_date_ord_ope_functions.sql +++ b/src/v3/scalars/date/query_date_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/date/date_ord_ope_functions.sql --! @file encrypted_domain/date/query_date_ord_ope_functions.sql ---! @brief Functions for public.query_date_ord_ope. +--! @brief Functions for eql_v3.query_date_ord_ope. ---! @brief Index extractor for public.query_date_ord_ope. ---! @param a public.query_date_ord_ope +--! @brief Index extractor for eql_v3.query_date_ord_ope. +--! @param a eql_v3.query_date_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_date_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_date_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.query_date_ord_ope +--! @param b eql_v3.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b public.query_date_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b eql_v3.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. ---! @param a public.query_date_ord_ope +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. +--! @param a eql_v3.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_date_ord_ope, b public.date_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.query_date_ord_ope +--! @param b eql_v3.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b public.query_date_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b eql_v3.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. ---! @param a public.query_date_ord_ope +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. +--! @param a eql_v3.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_date_ord_ope, b public.date_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.query_date_ord_ope +--! @param b eql_v3.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b public.query_date_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b eql_v3.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. ---! @param a public.query_date_ord_ope +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. +--! @param a eql_v3.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_date_ord_ope, b public.date_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.query_date_ord_ope +--! @param b eql_v3.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b public.query_date_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b eql_v3.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. ---! @param a public.query_date_ord_ope +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. +--! @param a eql_v3.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_date_ord_ope, b public.date_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.query_date_ord_ope +--! @param b eql_v3.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b public.query_date_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b eql_v3.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. ---! @param a public.query_date_ord_ope +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. +--! @param a eql_v3.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_date_ord_ope, b public.date_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. --! @param a public.date_ord_ope ---! @param b public.query_date_ord_ope +--! @param b eql_v3.query_date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b public.query_date_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b eql_v3.query_date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ope. ---! @param a public.query_date_ord_ope +--! @brief Operator wrapper for eql_v3.query_date_ord_ope. +--! @param a eql_v3.query_date_ord_ope --! @param b public.date_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_date_ord_ope, b public.date_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord_ope, b public.date_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/date/query_date_ord_ope_operators.sql b/src/v3/scalars/date/query_date_ord_ope_operators.sql index c62710e2f..5da774020 100644 --- a/src/v3/scalars/date/query_date_ord_ope_operators.sql +++ b/src/v3/scalars/date/query_date_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/date/query_date_ord_ope_functions.sql --! @file encrypted_domain/date/query_date_ord_ope_operators.sql ---! @brief Operators for public.query_date_ord_ope. +--! @brief Operators for eql_v3.query_date_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, + LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, + LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, + LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, + LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, + LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, + LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, + LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, + LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, + LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, + LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord_ope, RIGHTARG = public.query_date_ord_ope, + LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_date_ord_ope, RIGHTARG = public.date_ord_ope, + LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/date/query_date_ord_operators.sql b/src/v3/scalars/date/query_date_ord_operators.sql index 9d2995ef4..f55618fe4 100644 --- a/src/v3/scalars/date/query_date_ord_operators.sql +++ b/src/v3/scalars/date/query_date_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/date/query_date_ord_functions.sql --! @file encrypted_domain/date/query_date_ord_operators.sql ---! @brief Operators for public.query_date_ord. +--! @brief Operators for eql_v3.query_date_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, + LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, + LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, + LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, + LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, + LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, + LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, + LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, + LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, + LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, + LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord, RIGHTARG = public.query_date_ord, + LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_date_ord, RIGHTARG = public.date_ord, + LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/date/query_date_ord_ore_functions.sql b/src/v3/scalars/date/query_date_ord_ore_functions.sql index 57c9910e1..e89d554c8 100644 --- a/src/v3/scalars/date/query_date_ord_ore_functions.sql +++ b/src/v3/scalars/date/query_date_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/date/date_ord_ore_functions.sql --! @file encrypted_domain/date/query_date_ord_ore_functions.sql ---! @brief Functions for public.query_date_ord_ore. +--! @brief Functions for eql_v3.query_date_ord_ore. ---! @brief Index extractor for public.query_date_ord_ore. ---! @param a public.query_date_ord_ore +--! @brief Index extractor for eql_v3.query_date_ord_ore. +--! @param a eql_v3.query_date_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_date_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_date_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.query_date_ord_ore +--! @param b eql_v3.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b public.query_date_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b eql_v3.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. ---! @param a public.query_date_ord_ore +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. +--! @param a eql_v3.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_date_ord_ore, b public.date_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.query_date_ord_ore +--! @param b eql_v3.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b public.query_date_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b eql_v3.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. ---! @param a public.query_date_ord_ore +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. +--! @param a eql_v3.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_date_ord_ore, b public.date_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.query_date_ord_ore +--! @param b eql_v3.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b public.query_date_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b eql_v3.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. ---! @param a public.query_date_ord_ore +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. +--! @param a eql_v3.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_date_ord_ore, b public.date_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.query_date_ord_ore +--! @param b eql_v3.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b public.query_date_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b eql_v3.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. ---! @param a public.query_date_ord_ore +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. +--! @param a eql_v3.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_date_ord_ore, b public.date_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.query_date_ord_ore +--! @param b eql_v3.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b public.query_date_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b eql_v3.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. ---! @param a public.query_date_ord_ore +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. +--! @param a eql_v3.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_date_ord_ore, b public.date_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. --! @param a public.date_ord_ore ---! @param b public.query_date_ord_ore +--! @param b eql_v3.query_date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b public.query_date_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b eql_v3.query_date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_date_ord_ore. ---! @param a public.query_date_ord_ore +--! @brief Operator wrapper for eql_v3.query_date_ord_ore. +--! @param a eql_v3.query_date_ord_ore --! @param b public.date_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_date_ord_ore, b public.date_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord_ore, b public.date_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/date/query_date_ord_ore_operators.sql b/src/v3/scalars/date/query_date_ord_ore_operators.sql index ebbd636a8..0bc871590 100644 --- a/src/v3/scalars/date/query_date_ord_ore_operators.sql +++ b/src/v3/scalars/date/query_date_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/date/query_date_ord_ore_functions.sql --! @file encrypted_domain/date/query_date_ord_ore_operators.sql ---! @brief Operators for public.query_date_ord_ore. +--! @brief Operators for eql_v3.query_date_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, + LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, + LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, + LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, + LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, + LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, + LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, + LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, + LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, + LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, + LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.date_ord_ore, RIGHTARG = public.query_date_ord_ore, + LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_date_ord_ore, RIGHTARG = public.date_ord_ore, + LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/date/query_date_types.sql b/src/v3/scalars/date/query_date_types.sql index 3028542e4..6ba8c8f44 100644 --- a/src/v3/scalars/date/query_date_types.sql +++ b/src/v3/scalars/date/query_date_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/date/query_date_types.sql --! @brief Query-operand domains for date (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_date_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_date_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_date_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_date_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_date_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_date_eq AS jsonb + CREATE DOMAIN eql_v3.query_date_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_date_eq IS 'EQL date query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_date_eq IS 'EQL date query operand (equality)'; - --! @brief Query-operand domain public.query_date_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_date_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_date_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_date_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_date_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_date_ord_ore IS 'EQL date query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_date_ord_ore IS 'EQL date query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_date_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_date_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_date_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_date_ord AS jsonb + CREATE DOMAIN eql_v3.query_date_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_date_ord IS 'EQL date query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_date_ord IS 'EQL date query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_date_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_date_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_date_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_date_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_date_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_date_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_date_ord_ope IS 'EQL date query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_date_ord_ope IS 'EQL date query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/double/query_double_eq_functions.sql b/src/v3/scalars/double/query_double_eq_functions.sql index a03aaa587..f0c6aa0c8 100644 --- a/src/v3/scalars/double/query_double_eq_functions.sql +++ b/src/v3/scalars/double/query_double_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/double/double_eq_functions.sql --! @file encrypted_domain/double/query_double_eq_functions.sql ---! @brief Functions for public.query_double_eq. +--! @brief Functions for eql_v3.query_double_eq. ---! @brief Index extractor for public.query_double_eq. ---! @param a public.query_double_eq +--! @brief Index extractor for eql_v3.query_double_eq. +--! @param a eql_v3.query_double_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_double_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_double_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_double_eq. +--! @brief Operator wrapper for eql_v3.query_double_eq. --! @param a public.double_eq ---! @param b public.query_double_eq +--! @param b eql_v3.query_double_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_eq, b public.query_double_eq) +CREATE FUNCTION eql_v3.eq(a public.double_eq, b eql_v3.query_double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_double_eq. ---! @param a public.query_double_eq +--! @brief Operator wrapper for eql_v3.query_double_eq. +--! @param a eql_v3.query_double_eq --! @param b public.double_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_double_eq, b public.double_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_eq, b public.double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_double_eq. +--! @brief Operator wrapper for eql_v3.query_double_eq. --! @param a public.double_eq ---! @param b public.query_double_eq +--! @param b eql_v3.query_double_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_eq, b public.query_double_eq) +CREATE FUNCTION eql_v3.neq(a public.double_eq, b eql_v3.query_double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_double_eq. ---! @param a public.query_double_eq +--! @brief Operator wrapper for eql_v3.query_double_eq. +--! @param a eql_v3.query_double_eq --! @param b public.double_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_double_eq, b public.double_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_eq, b public.double_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/double/query_double_eq_operators.sql b/src/v3/scalars/double/query_double_eq_operators.sql index 1b642ec96..a2d581cbe 100644 --- a/src/v3/scalars/double/query_double_eq_operators.sql +++ b/src/v3/scalars/double/query_double_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/double/query_double_eq_functions.sql --! @file encrypted_domain/double/query_double_eq_operators.sql ---! @brief Operators for public.query_double_eq. +--! @brief Operators for eql_v3.query_double_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_eq, RIGHTARG = public.query_double_eq, + LEFTARG = public.double_eq, RIGHTARG = eql_v3.query_double_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_double_eq, RIGHTARG = public.double_eq, + LEFTARG = eql_v3.query_double_eq, RIGHTARG = public.double_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_eq, RIGHTARG = public.query_double_eq, + LEFTARG = public.double_eq, RIGHTARG = eql_v3.query_double_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_double_eq, RIGHTARG = public.double_eq, + LEFTARG = eql_v3.query_double_eq, RIGHTARG = public.double_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/double/query_double_ord_functions.sql b/src/v3/scalars/double/query_double_ord_functions.sql index abef36162..276a6bd24 100644 --- a/src/v3/scalars/double/query_double_ord_functions.sql +++ b/src/v3/scalars/double/query_double_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/double/double_ord_functions.sql --! @file encrypted_domain/double/query_double_ord_functions.sql ---! @brief Functions for public.query_double_ord. +--! @brief Functions for eql_v3.query_double_ord. ---! @brief Index extractor for public.query_double_ord. ---! @param a public.query_double_ord +--! @brief Index extractor for eql_v3.query_double_ord. +--! @param a eql_v3.query_double_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_double_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_double_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_double_ord. +--! @brief Operator wrapper for eql_v3.query_double_ord. --! @param a public.double_ord ---! @param b public.query_double_ord +--! @param b eql_v3.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord, b public.query_double_ord) +CREATE FUNCTION eql_v3.eq(a public.double_ord, b eql_v3.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. ---! @param a public.query_double_ord +--! @brief Operator wrapper for eql_v3.query_double_ord. +--! @param a eql_v3.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_double_ord, b public.double_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. +--! @brief Operator wrapper for eql_v3.query_double_ord. --! @param a public.double_ord ---! @param b public.query_double_ord +--! @param b eql_v3.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord, b public.query_double_ord) +CREATE FUNCTION eql_v3.neq(a public.double_ord, b eql_v3.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. ---! @param a public.query_double_ord +--! @brief Operator wrapper for eql_v3.query_double_ord. +--! @param a eql_v3.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_double_ord, b public.double_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. +--! @brief Operator wrapper for eql_v3.query_double_ord. --! @param a public.double_ord ---! @param b public.query_double_ord +--! @param b eql_v3.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord, b public.query_double_ord) +CREATE FUNCTION eql_v3.lt(a public.double_ord, b eql_v3.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. ---! @param a public.query_double_ord +--! @brief Operator wrapper for eql_v3.query_double_ord. +--! @param a eql_v3.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_double_ord, b public.double_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. +--! @brief Operator wrapper for eql_v3.query_double_ord. --! @param a public.double_ord ---! @param b public.query_double_ord +--! @param b eql_v3.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord, b public.query_double_ord) +CREATE FUNCTION eql_v3.lte(a public.double_ord, b eql_v3.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. ---! @param a public.query_double_ord +--! @brief Operator wrapper for eql_v3.query_double_ord. +--! @param a eql_v3.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_double_ord, b public.double_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. +--! @brief Operator wrapper for eql_v3.query_double_ord. --! @param a public.double_ord ---! @param b public.query_double_ord +--! @param b eql_v3.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord, b public.query_double_ord) +CREATE FUNCTION eql_v3.gt(a public.double_ord, b eql_v3.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. ---! @param a public.query_double_ord +--! @brief Operator wrapper for eql_v3.query_double_ord. +--! @param a eql_v3.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_double_ord, b public.double_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. +--! @brief Operator wrapper for eql_v3.query_double_ord. --! @param a public.double_ord ---! @param b public.query_double_ord +--! @param b eql_v3.query_double_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord, b public.query_double_ord) +CREATE FUNCTION eql_v3.gte(a public.double_ord, b eql_v3.query_double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord. ---! @param a public.query_double_ord +--! @brief Operator wrapper for eql_v3.query_double_ord. +--! @param a eql_v3.query_double_ord --! @param b public.double_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_double_ord, b public.double_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord, b public.double_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/double/query_double_ord_ope_functions.sql b/src/v3/scalars/double/query_double_ord_ope_functions.sql index bcc347c2b..01e431dd6 100644 --- a/src/v3/scalars/double/query_double_ord_ope_functions.sql +++ b/src/v3/scalars/double/query_double_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/double/double_ord_ope_functions.sql --! @file encrypted_domain/double/query_double_ord_ope_functions.sql ---! @brief Functions for public.query_double_ord_ope. +--! @brief Functions for eql_v3.query_double_ord_ope. ---! @brief Index extractor for public.query_double_ord_ope. ---! @param a public.query_double_ord_ope +--! @brief Index extractor for eql_v3.query_double_ord_ope. +--! @param a eql_v3.query_double_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_double_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_double_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.query_double_ord_ope +--! @param b eql_v3.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b public.query_double_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b eql_v3.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. ---! @param a public.query_double_ord_ope +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. +--! @param a eql_v3.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_double_ord_ope, b public.double_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.query_double_ord_ope +--! @param b eql_v3.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b public.query_double_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b eql_v3.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. ---! @param a public.query_double_ord_ope +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. +--! @param a eql_v3.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_double_ord_ope, b public.double_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.query_double_ord_ope +--! @param b eql_v3.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b public.query_double_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b eql_v3.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. ---! @param a public.query_double_ord_ope +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. +--! @param a eql_v3.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_double_ord_ope, b public.double_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.query_double_ord_ope +--! @param b eql_v3.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b public.query_double_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b eql_v3.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. ---! @param a public.query_double_ord_ope +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. +--! @param a eql_v3.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_double_ord_ope, b public.double_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.query_double_ord_ope +--! @param b eql_v3.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b public.query_double_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b eql_v3.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. ---! @param a public.query_double_ord_ope +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. +--! @param a eql_v3.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_double_ord_ope, b public.double_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. --! @param a public.double_ord_ope ---! @param b public.query_double_ord_ope +--! @param b eql_v3.query_double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b public.query_double_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b eql_v3.query_double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ope. ---! @param a public.query_double_ord_ope +--! @brief Operator wrapper for eql_v3.query_double_ord_ope. +--! @param a eql_v3.query_double_ord_ope --! @param b public.double_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_double_ord_ope, b public.double_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord_ope, b public.double_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/double/query_double_ord_ope_operators.sql b/src/v3/scalars/double/query_double_ord_ope_operators.sql index 507561139..ce292ca0d 100644 --- a/src/v3/scalars/double/query_double_ord_ope_operators.sql +++ b/src/v3/scalars/double/query_double_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/double/query_double_ord_ope_functions.sql --! @file encrypted_domain/double/query_double_ord_ope_operators.sql ---! @brief Operators for public.query_double_ord_ope. +--! @brief Operators for eql_v3.query_double_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, + LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, + LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, + LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, + LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, + LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, + LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, + LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, + LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, + LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, + LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord_ope, RIGHTARG = public.query_double_ord_ope, + LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_double_ord_ope, RIGHTARG = public.double_ord_ope, + LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/double/query_double_ord_operators.sql b/src/v3/scalars/double/query_double_ord_operators.sql index 68b53dda9..8f1aa007b 100644 --- a/src/v3/scalars/double/query_double_ord_operators.sql +++ b/src/v3/scalars/double/query_double_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/double/query_double_ord_functions.sql --! @file encrypted_domain/double/query_double_ord_operators.sql ---! @brief Operators for public.query_double_ord. +--! @brief Operators for eql_v3.query_double_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, + LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, + LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, + LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, + LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, + LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, + LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, + LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, + LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, + LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, + LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord, RIGHTARG = public.query_double_ord, + LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_double_ord, RIGHTARG = public.double_ord, + LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/double/query_double_ord_ore_functions.sql b/src/v3/scalars/double/query_double_ord_ore_functions.sql index 59dfa1a41..07a345400 100644 --- a/src/v3/scalars/double/query_double_ord_ore_functions.sql +++ b/src/v3/scalars/double/query_double_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/double/double_ord_ore_functions.sql --! @file encrypted_domain/double/query_double_ord_ore_functions.sql ---! @brief Functions for public.query_double_ord_ore. +--! @brief Functions for eql_v3.query_double_ord_ore. ---! @brief Index extractor for public.query_double_ord_ore. ---! @param a public.query_double_ord_ore +--! @brief Index extractor for eql_v3.query_double_ord_ore. +--! @param a eql_v3.query_double_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_double_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_double_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.query_double_ord_ore +--! @param b eql_v3.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b public.query_double_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b eql_v3.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. ---! @param a public.query_double_ord_ore +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. +--! @param a eql_v3.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_double_ord_ore, b public.double_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.query_double_ord_ore +--! @param b eql_v3.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b public.query_double_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b eql_v3.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. ---! @param a public.query_double_ord_ore +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. +--! @param a eql_v3.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_double_ord_ore, b public.double_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.query_double_ord_ore +--! @param b eql_v3.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b public.query_double_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b eql_v3.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. ---! @param a public.query_double_ord_ore +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. +--! @param a eql_v3.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_double_ord_ore, b public.double_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.query_double_ord_ore +--! @param b eql_v3.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b public.query_double_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b eql_v3.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. ---! @param a public.query_double_ord_ore +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. +--! @param a eql_v3.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_double_ord_ore, b public.double_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.query_double_ord_ore +--! @param b eql_v3.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b public.query_double_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b eql_v3.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. ---! @param a public.query_double_ord_ore +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. +--! @param a eql_v3.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_double_ord_ore, b public.double_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. --! @param a public.double_ord_ore ---! @param b public.query_double_ord_ore +--! @param b eql_v3.query_double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b public.query_double_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b eql_v3.query_double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_double_ord_ore. ---! @param a public.query_double_ord_ore +--! @brief Operator wrapper for eql_v3.query_double_ord_ore. +--! @param a eql_v3.query_double_ord_ore --! @param b public.double_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_double_ord_ore, b public.double_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord_ore, b public.double_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/double/query_double_ord_ore_operators.sql b/src/v3/scalars/double/query_double_ord_ore_operators.sql index 1295c2d3b..abcb7a04e 100644 --- a/src/v3/scalars/double/query_double_ord_ore_operators.sql +++ b/src/v3/scalars/double/query_double_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/double/query_double_ord_ore_functions.sql --! @file encrypted_domain/double/query_double_ord_ore_operators.sql ---! @brief Operators for public.query_double_ord_ore. +--! @brief Operators for eql_v3.query_double_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, + LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, + LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, + LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, + LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, + LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, + LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, + LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, + LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, + LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, + LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.double_ord_ore, RIGHTARG = public.query_double_ord_ore, + LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_double_ord_ore, RIGHTARG = public.double_ord_ore, + LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/double/query_double_types.sql b/src/v3/scalars/double/query_double_types.sql index dd2914480..fa2ba08a7 100644 --- a/src/v3/scalars/double/query_double_types.sql +++ b/src/v3/scalars/double/query_double_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/double/query_double_types.sql --! @brief Query-operand domains for double (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_double_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_double_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_double_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_double_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_double_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_double_eq AS jsonb + CREATE DOMAIN eql_v3.query_double_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_double_eq IS 'EQL double query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_double_eq IS 'EQL double query operand (equality)'; - --! @brief Query-operand domain public.query_double_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_double_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_double_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_double_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_double_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_double_ord_ore IS 'EQL double query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_double_ord_ore IS 'EQL double query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_double_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_double_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_double_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_double_ord AS jsonb + CREATE DOMAIN eql_v3.query_double_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_double_ord IS 'EQL double query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_double_ord IS 'EQL double query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_double_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_double_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_double_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_double_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_double_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_double_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_double_ord_ope IS 'EQL double query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_double_ord_ope IS 'EQL double query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/integer/query_integer_eq_functions.sql b/src/v3/scalars/integer/query_integer_eq_functions.sql index 92a70d1c0..aaf29c15d 100644 --- a/src/v3/scalars/integer/query_integer_eq_functions.sql +++ b/src/v3/scalars/integer/query_integer_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/integer/integer_eq_functions.sql --! @file encrypted_domain/integer/query_integer_eq_functions.sql ---! @brief Functions for public.query_integer_eq. +--! @brief Functions for eql_v3.query_integer_eq. ---! @brief Index extractor for public.query_integer_eq. ---! @param a public.query_integer_eq +--! @brief Index extractor for eql_v3.query_integer_eq. +--! @param a eql_v3.query_integer_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_integer_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_integer_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_integer_eq. +--! @brief Operator wrapper for eql_v3.query_integer_eq. --! @param a public.integer_eq ---! @param b public.query_integer_eq +--! @param b eql_v3.query_integer_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.query_integer_eq) +CREATE FUNCTION eql_v3.eq(a public.integer_eq, b eql_v3.query_integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_integer_eq. ---! @param a public.query_integer_eq +--! @brief Operator wrapper for eql_v3.query_integer_eq. +--! @param a eql_v3.query_integer_eq --! @param b public.integer_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_integer_eq, b public.integer_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_eq, b public.integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_integer_eq. +--! @brief Operator wrapper for eql_v3.query_integer_eq. --! @param a public.integer_eq ---! @param b public.query_integer_eq +--! @param b eql_v3.query_integer_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_eq, b public.query_integer_eq) +CREATE FUNCTION eql_v3.neq(a public.integer_eq, b eql_v3.query_integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_integer_eq. ---! @param a public.query_integer_eq +--! @brief Operator wrapper for eql_v3.query_integer_eq. +--! @param a eql_v3.query_integer_eq --! @param b public.integer_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_integer_eq, b public.integer_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_eq, b public.integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/integer/query_integer_eq_operators.sql b/src/v3/scalars/integer/query_integer_eq_operators.sql index a55f2dff1..b85365b19 100644 --- a/src/v3/scalars/integer/query_integer_eq_operators.sql +++ b/src/v3/scalars/integer/query_integer_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/integer/query_integer_eq_functions.sql --! @file encrypted_domain/integer/query_integer_eq_operators.sql ---! @brief Operators for public.query_integer_eq. +--! @brief Operators for eql_v3.query_integer_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_eq, RIGHTARG = public.query_integer_eq, + LEFTARG = public.integer_eq, RIGHTARG = eql_v3.query_integer_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_integer_eq, RIGHTARG = public.integer_eq, + LEFTARG = eql_v3.query_integer_eq, RIGHTARG = public.integer_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_eq, RIGHTARG = public.query_integer_eq, + LEFTARG = public.integer_eq, RIGHTARG = eql_v3.query_integer_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_integer_eq, RIGHTARG = public.integer_eq, + LEFTARG = eql_v3.query_integer_eq, RIGHTARG = public.integer_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/integer/query_integer_ord_functions.sql b/src/v3/scalars/integer/query_integer_ord_functions.sql index b03ba07da..8f75fcd04 100644 --- a/src/v3/scalars/integer/query_integer_ord_functions.sql +++ b/src/v3/scalars/integer/query_integer_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/integer/integer_ord_functions.sql --! @file encrypted_domain/integer/query_integer_ord_functions.sql ---! @brief Functions for public.query_integer_ord. +--! @brief Functions for eql_v3.query_integer_ord. ---! @brief Index extractor for public.query_integer_ord. ---! @param a public.query_integer_ord +--! @brief Index extractor for eql_v3.query_integer_ord. +--! @param a eql_v3.query_integer_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_integer_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_integer_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_integer_ord. +--! @brief Operator wrapper for eql_v3.query_integer_ord. --! @param a public.integer_ord ---! @param b public.query_integer_ord +--! @param b eql_v3.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord, b public.query_integer_ord) +CREATE FUNCTION eql_v3.eq(a public.integer_ord, b eql_v3.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. ---! @param a public.query_integer_ord +--! @brief Operator wrapper for eql_v3.query_integer_ord. +--! @param a eql_v3.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_integer_ord, b public.integer_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. +--! @brief Operator wrapper for eql_v3.query_integer_ord. --! @param a public.integer_ord ---! @param b public.query_integer_ord +--! @param b eql_v3.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord, b public.query_integer_ord) +CREATE FUNCTION eql_v3.neq(a public.integer_ord, b eql_v3.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. ---! @param a public.query_integer_ord +--! @brief Operator wrapper for eql_v3.query_integer_ord. +--! @param a eql_v3.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_integer_ord, b public.integer_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. +--! @brief Operator wrapper for eql_v3.query_integer_ord. --! @param a public.integer_ord ---! @param b public.query_integer_ord +--! @param b eql_v3.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord, b public.query_integer_ord) +CREATE FUNCTION eql_v3.lt(a public.integer_ord, b eql_v3.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. ---! @param a public.query_integer_ord +--! @brief Operator wrapper for eql_v3.query_integer_ord. +--! @param a eql_v3.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_integer_ord, b public.integer_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. +--! @brief Operator wrapper for eql_v3.query_integer_ord. --! @param a public.integer_ord ---! @param b public.query_integer_ord +--! @param b eql_v3.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord, b public.query_integer_ord) +CREATE FUNCTION eql_v3.lte(a public.integer_ord, b eql_v3.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. ---! @param a public.query_integer_ord +--! @brief Operator wrapper for eql_v3.query_integer_ord. +--! @param a eql_v3.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_integer_ord, b public.integer_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. +--! @brief Operator wrapper for eql_v3.query_integer_ord. --! @param a public.integer_ord ---! @param b public.query_integer_ord +--! @param b eql_v3.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord, b public.query_integer_ord) +CREATE FUNCTION eql_v3.gt(a public.integer_ord, b eql_v3.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. ---! @param a public.query_integer_ord +--! @brief Operator wrapper for eql_v3.query_integer_ord. +--! @param a eql_v3.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_integer_ord, b public.integer_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. +--! @brief Operator wrapper for eql_v3.query_integer_ord. --! @param a public.integer_ord ---! @param b public.query_integer_ord +--! @param b eql_v3.query_integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord, b public.query_integer_ord) +CREATE FUNCTION eql_v3.gte(a public.integer_ord, b eql_v3.query_integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord. ---! @param a public.query_integer_ord +--! @brief Operator wrapper for eql_v3.query_integer_ord. +--! @param a eql_v3.query_integer_ord --! @param b public.integer_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_integer_ord, b public.integer_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord, b public.integer_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/integer/query_integer_ord_ope_functions.sql b/src/v3/scalars/integer/query_integer_ord_ope_functions.sql index 42a10eb7d..59e5a97ca 100644 --- a/src/v3/scalars/integer/query_integer_ord_ope_functions.sql +++ b/src/v3/scalars/integer/query_integer_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/integer/integer_ord_ope_functions.sql --! @file encrypted_domain/integer/query_integer_ord_ope_functions.sql ---! @brief Functions for public.query_integer_ord_ope. +--! @brief Functions for eql_v3.query_integer_ord_ope. ---! @brief Index extractor for public.query_integer_ord_ope. ---! @param a public.query_integer_ord_ope +--! @brief Index extractor for eql_v3.query_integer_ord_ope. +--! @param a eql_v3.query_integer_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_integer_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_integer_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.query_integer_ord_ope +--! @param b eql_v3.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b public.query_integer_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. ---! @param a public.query_integer_ord_ope +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. +--! @param a eql_v3.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_integer_ord_ope, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.query_integer_ord_ope +--! @param b eql_v3.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b public.query_integer_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. ---! @param a public.query_integer_ord_ope +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. +--! @param a eql_v3.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_integer_ord_ope, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.query_integer_ord_ope +--! @param b eql_v3.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b public.query_integer_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. ---! @param a public.query_integer_ord_ope +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. +--! @param a eql_v3.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_integer_ord_ope, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.query_integer_ord_ope +--! @param b eql_v3.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b public.query_integer_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. ---! @param a public.query_integer_ord_ope +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. +--! @param a eql_v3.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_integer_ord_ope, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.query_integer_ord_ope +--! @param b eql_v3.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b public.query_integer_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. ---! @param a public.query_integer_ord_ope +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. +--! @param a eql_v3.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_integer_ord_ope, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. --! @param a public.integer_ord_ope ---! @param b public.query_integer_ord_ope +--! @param b eql_v3.query_integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b public.query_integer_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ope. ---! @param a public.query_integer_ord_ope +--! @brief Operator wrapper for eql_v3.query_integer_ord_ope. +--! @param a eql_v3.query_integer_ord_ope --! @param b public.integer_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_integer_ord_ope, b public.integer_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/integer/query_integer_ord_ope_operators.sql b/src/v3/scalars/integer/query_integer_ord_ope_operators.sql index 5afb93ce2..1e6ca6c70 100644 --- a/src/v3/scalars/integer/query_integer_ord_ope_operators.sql +++ b/src/v3/scalars/integer/query_integer_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/integer/query_integer_ord_ope_functions.sql --! @file encrypted_domain/integer/query_integer_ord_ope_operators.sql ---! @brief Operators for public.query_integer_ord_ope. +--! @brief Operators for eql_v3.query_integer_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, + LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, + LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, + LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, + LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, + LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, + LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, + LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, + LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, + LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, + LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord_ope, RIGHTARG = public.query_integer_ord_ope, + LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, + LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/integer/query_integer_ord_operators.sql b/src/v3/scalars/integer/query_integer_ord_operators.sql index 94b527910..040676bcc 100644 --- a/src/v3/scalars/integer/query_integer_ord_operators.sql +++ b/src/v3/scalars/integer/query_integer_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/integer/query_integer_ord_functions.sql --! @file encrypted_domain/integer/query_integer_ord_operators.sql ---! @brief Operators for public.query_integer_ord. +--! @brief Operators for eql_v3.query_integer_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, + LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, + LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, + LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, + LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, + LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, + LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, + LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, + LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, + LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, + LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord, RIGHTARG = public.query_integer_ord, + LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_integer_ord, RIGHTARG = public.integer_ord, + LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/integer/query_integer_ord_ore_functions.sql b/src/v3/scalars/integer/query_integer_ord_ore_functions.sql index 6e7b9a88b..d9a388cae 100644 --- a/src/v3/scalars/integer/query_integer_ord_ore_functions.sql +++ b/src/v3/scalars/integer/query_integer_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/integer/integer_ord_ore_functions.sql --! @file encrypted_domain/integer/query_integer_ord_ore_functions.sql ---! @brief Functions for public.query_integer_ord_ore. +--! @brief Functions for eql_v3.query_integer_ord_ore. ---! @brief Index extractor for public.query_integer_ord_ore. ---! @param a public.query_integer_ord_ore +--! @brief Index extractor for eql_v3.query_integer_ord_ore. +--! @param a eql_v3.query_integer_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_integer_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_integer_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.query_integer_ord_ore +--! @param b eql_v3.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b public.query_integer_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. ---! @param a public.query_integer_ord_ore +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. +--! @param a eql_v3.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_integer_ord_ore, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.query_integer_ord_ore +--! @param b eql_v3.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b public.query_integer_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. ---! @param a public.query_integer_ord_ore +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. +--! @param a eql_v3.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_integer_ord_ore, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.query_integer_ord_ore +--! @param b eql_v3.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b public.query_integer_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. ---! @param a public.query_integer_ord_ore +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. +--! @param a eql_v3.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_integer_ord_ore, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.query_integer_ord_ore +--! @param b eql_v3.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b public.query_integer_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. ---! @param a public.query_integer_ord_ore +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. +--! @param a eql_v3.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_integer_ord_ore, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.query_integer_ord_ore +--! @param b eql_v3.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b public.query_integer_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. ---! @param a public.query_integer_ord_ore +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. +--! @param a eql_v3.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_integer_ord_ore, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. --! @param a public.integer_ord_ore ---! @param b public.query_integer_ord_ore +--! @param b eql_v3.query_integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b public.query_integer_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_integer_ord_ore. ---! @param a public.query_integer_ord_ore +--! @brief Operator wrapper for eql_v3.query_integer_ord_ore. +--! @param a eql_v3.query_integer_ord_ore --! @param b public.integer_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_integer_ord_ore, b public.integer_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/integer/query_integer_ord_ore_operators.sql b/src/v3/scalars/integer/query_integer_ord_ore_operators.sql index 0432a8fa6..4190c3f82 100644 --- a/src/v3/scalars/integer/query_integer_ord_ore_operators.sql +++ b/src/v3/scalars/integer/query_integer_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/integer/query_integer_ord_ore_functions.sql --! @file encrypted_domain/integer/query_integer_ord_ore_operators.sql ---! @brief Operators for public.query_integer_ord_ore. +--! @brief Operators for eql_v3.query_integer_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, + LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, + LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, + LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, + LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, + LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, + LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, + LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, + LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, + LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, + LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.integer_ord_ore, RIGHTARG = public.query_integer_ord_ore, + LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, + LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/integer/query_integer_types.sql b/src/v3/scalars/integer/query_integer_types.sql index fe3c09131..a736fc2ad 100644 --- a/src/v3/scalars/integer/query_integer_types.sql +++ b/src/v3/scalars/integer/query_integer_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/integer/query_integer_types.sql --! @brief Query-operand domains for integer (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_integer_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_integer_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_integer_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_integer_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_integer_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_integer_eq AS jsonb + CREATE DOMAIN eql_v3.query_integer_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_integer_eq IS 'EQL integer query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_integer_eq IS 'EQL integer query operand (equality)'; - --! @brief Query-operand domain public.query_integer_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_integer_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_integer_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_integer_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_integer_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_integer_ord_ore IS 'EQL integer query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_integer_ord_ore IS 'EQL integer query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_integer_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_integer_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_integer_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_integer_ord AS jsonb + CREATE DOMAIN eql_v3.query_integer_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_integer_ord IS 'EQL integer query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_integer_ord IS 'EQL integer query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_integer_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_integer_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_integer_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_integer_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_integer_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_integer_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_integer_ord_ope IS 'EQL integer query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_integer_ord_ope IS 'EQL integer query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/numeric/query_numeric_eq_functions.sql b/src/v3/scalars/numeric/query_numeric_eq_functions.sql index 04cddc550..870c43157 100644 --- a/src/v3/scalars/numeric/query_numeric_eq_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/numeric/numeric_eq_functions.sql --! @file encrypted_domain/numeric/query_numeric_eq_functions.sql ---! @brief Functions for public.query_numeric_eq. +--! @brief Functions for eql_v3.query_numeric_eq. ---! @brief Index extractor for public.query_numeric_eq. ---! @param a public.query_numeric_eq +--! @brief Index extractor for eql_v3.query_numeric_eq. +--! @param a eql_v3.query_numeric_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_numeric_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_numeric_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_numeric_eq. +--! @brief Operator wrapper for eql_v3.query_numeric_eq. --! @param a public.numeric_eq ---! @param b public.query_numeric_eq +--! @param b eql_v3.query_numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b public.query_numeric_eq) +CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b eql_v3.query_numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_eq. ---! @param a public.query_numeric_eq +--! @brief Operator wrapper for eql_v3.query_numeric_eq. +--! @param a eql_v3.query_numeric_eq --! @param b public.numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_numeric_eq, b public.numeric_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_eq, b public.numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_eq. +--! @brief Operator wrapper for eql_v3.query_numeric_eq. --! @param a public.numeric_eq ---! @param b public.query_numeric_eq +--! @param b eql_v3.query_numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b public.query_numeric_eq) +CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b eql_v3.query_numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_eq. ---! @param a public.query_numeric_eq +--! @brief Operator wrapper for eql_v3.query_numeric_eq. +--! @param a eql_v3.query_numeric_eq --! @param b public.numeric_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_numeric_eq, b public.numeric_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_eq, b public.numeric_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/numeric/query_numeric_eq_operators.sql b/src/v3/scalars/numeric/query_numeric_eq_operators.sql index 059e28885..6d2b56196 100644 --- a/src/v3/scalars/numeric/query_numeric_eq_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/numeric/query_numeric_eq_functions.sql --! @file encrypted_domain/numeric/query_numeric_eq_operators.sql ---! @brief Operators for public.query_numeric_eq. +--! @brief Operators for eql_v3.query_numeric_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_eq, RIGHTARG = public.query_numeric_eq, + LEFTARG = public.numeric_eq, RIGHTARG = eql_v3.query_numeric_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_numeric_eq, RIGHTARG = public.numeric_eq, + LEFTARG = eql_v3.query_numeric_eq, RIGHTARG = public.numeric_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_eq, RIGHTARG = public.query_numeric_eq, + LEFTARG = public.numeric_eq, RIGHTARG = eql_v3.query_numeric_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_numeric_eq, RIGHTARG = public.numeric_eq, + LEFTARG = eql_v3.query_numeric_eq, RIGHTARG = public.numeric_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/numeric/query_numeric_ord_functions.sql b/src/v3/scalars/numeric/query_numeric_ord_functions.sql index 6c19c0140..7b81fd20e 100644 --- a/src/v3/scalars/numeric/query_numeric_ord_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/numeric/numeric_ord_functions.sql --! @file encrypted_domain/numeric/query_numeric_ord_functions.sql ---! @brief Functions for public.query_numeric_ord. +--! @brief Functions for eql_v3.query_numeric_ord. ---! @brief Index extractor for public.query_numeric_ord. ---! @param a public.query_numeric_ord +--! @brief Index extractor for eql_v3.query_numeric_ord. +--! @param a eql_v3.query_numeric_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_numeric_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_numeric_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_numeric_ord. +--! @brief Operator wrapper for eql_v3.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.query_numeric_ord +--! @param b eql_v3.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b public.query_numeric_ord) +CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b eql_v3.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. ---! @param a public.query_numeric_ord +--! @brief Operator wrapper for eql_v3.query_numeric_ord. +--! @param a eql_v3.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_numeric_ord, b public.numeric_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. +--! @brief Operator wrapper for eql_v3.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.query_numeric_ord +--! @param b eql_v3.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b public.query_numeric_ord) +CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b eql_v3.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. ---! @param a public.query_numeric_ord +--! @brief Operator wrapper for eql_v3.query_numeric_ord. +--! @param a eql_v3.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_numeric_ord, b public.numeric_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. +--! @brief Operator wrapper for eql_v3.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.query_numeric_ord +--! @param b eql_v3.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b public.query_numeric_ord) +CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b eql_v3.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. ---! @param a public.query_numeric_ord +--! @brief Operator wrapper for eql_v3.query_numeric_ord. +--! @param a eql_v3.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_numeric_ord, b public.numeric_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. +--! @brief Operator wrapper for eql_v3.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.query_numeric_ord +--! @param b eql_v3.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b public.query_numeric_ord) +CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b eql_v3.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. ---! @param a public.query_numeric_ord +--! @brief Operator wrapper for eql_v3.query_numeric_ord. +--! @param a eql_v3.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_numeric_ord, b public.numeric_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. +--! @brief Operator wrapper for eql_v3.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.query_numeric_ord +--! @param b eql_v3.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b public.query_numeric_ord) +CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b eql_v3.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. ---! @param a public.query_numeric_ord +--! @brief Operator wrapper for eql_v3.query_numeric_ord. +--! @param a eql_v3.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_numeric_ord, b public.numeric_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. +--! @brief Operator wrapper for eql_v3.query_numeric_ord. --! @param a public.numeric_ord ---! @param b public.query_numeric_ord +--! @param b eql_v3.query_numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b public.query_numeric_ord) +CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b eql_v3.query_numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord. ---! @param a public.query_numeric_ord +--! @brief Operator wrapper for eql_v3.query_numeric_ord. +--! @param a eql_v3.query_numeric_ord --! @param b public.numeric_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_numeric_ord, b public.numeric_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord, b public.numeric_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql b/src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql index 69fa69786..d903cd346 100644 --- a/src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ope_functions.sql --! @file encrypted_domain/numeric/query_numeric_ord_ope_functions.sql ---! @brief Functions for public.query_numeric_ord_ope. +--! @brief Functions for eql_v3.query_numeric_ord_ope. ---! @brief Index extractor for public.query_numeric_ord_ope. ---! @param a public.query_numeric_ord_ope +--! @brief Index extractor for eql_v3.query_numeric_ord_ope. +--! @param a eql_v3.query_numeric_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_numeric_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_numeric_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.query_numeric_ord_ope +--! @param b eql_v3.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. ---! @param a public.query_numeric_ord_ope +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. +--! @param a eql_v3.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.query_numeric_ord_ope +--! @param b eql_v3.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. ---! @param a public.query_numeric_ord_ope +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. +--! @param a eql_v3.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.query_numeric_ord_ope +--! @param b eql_v3.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. ---! @param a public.query_numeric_ord_ope +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. +--! @param a eql_v3.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.query_numeric_ord_ope +--! @param b eql_v3.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. ---! @param a public.query_numeric_ord_ope +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. +--! @param a eql_v3.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.query_numeric_ord_ope +--! @param b eql_v3.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. ---! @param a public.query_numeric_ord_ope +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. +--! @param a eql_v3.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. --! @param a public.numeric_ord_ope ---! @param b public.query_numeric_ord_ope +--! @param b eql_v3.query_numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ope. ---! @param a public.query_numeric_ord_ope +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope. +--! @param a eql_v3.query_numeric_ord_ope --! @param b public.numeric_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/numeric/query_numeric_ord_ope_operators.sql b/src/v3/scalars/numeric/query_numeric_ord_ope_operators.sql index bb68f8b8f..6550de6d6 100644 --- a/src/v3/scalars/numeric/query_numeric_ord_ope_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/numeric/query_numeric_ord_ope_functions.sql --! @file encrypted_domain/numeric/query_numeric_ord_ope_operators.sql ---! @brief Operators for public.query_numeric_ord_ope. +--! @brief Operators for eql_v3.query_numeric_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, + LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, + LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, + LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, + LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, + LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, + LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, + LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, + LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, + LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, + LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord_ope, RIGHTARG = public.query_numeric_ord_ope, + LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, + LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/numeric/query_numeric_ord_operators.sql b/src/v3/scalars/numeric/query_numeric_ord_operators.sql index 8059c2831..eea11a3bc 100644 --- a/src/v3/scalars/numeric/query_numeric_ord_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/numeric/query_numeric_ord_functions.sql --! @file encrypted_domain/numeric/query_numeric_ord_operators.sql ---! @brief Operators for public.query_numeric_ord. +--! @brief Operators for eql_v3.query_numeric_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, + LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, + LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, + LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, + LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, + LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, + LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, + LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, + LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, + LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, + LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord, RIGHTARG = public.query_numeric_ord, + LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_numeric_ord, RIGHTARG = public.numeric_ord, + LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql b/src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql index 54072d518..74c45e922 100644 --- a/src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/numeric/numeric_ord_ore_functions.sql --! @file encrypted_domain/numeric/query_numeric_ord_ore_functions.sql ---! @brief Functions for public.query_numeric_ord_ore. +--! @brief Functions for eql_v3.query_numeric_ord_ore. ---! @brief Index extractor for public.query_numeric_ord_ore. ---! @param a public.query_numeric_ord_ore +--! @brief Index extractor for eql_v3.query_numeric_ord_ore. +--! @param a eql_v3.query_numeric_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_numeric_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_numeric_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.query_numeric_ord_ore +--! @param b eql_v3.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. ---! @param a public.query_numeric_ord_ore +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. +--! @param a eql_v3.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.query_numeric_ord_ore +--! @param b eql_v3.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. ---! @param a public.query_numeric_ord_ore +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. +--! @param a eql_v3.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.query_numeric_ord_ore +--! @param b eql_v3.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. ---! @param a public.query_numeric_ord_ore +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. +--! @param a eql_v3.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.query_numeric_ord_ore +--! @param b eql_v3.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. ---! @param a public.query_numeric_ord_ore +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. +--! @param a eql_v3.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.query_numeric_ord_ore +--! @param b eql_v3.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. ---! @param a public.query_numeric_ord_ore +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. +--! @param a eql_v3.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. --! @param a public.numeric_ord_ore ---! @param b public.query_numeric_ord_ore +--! @param b eql_v3.query_numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_numeric_ord_ore. ---! @param a public.query_numeric_ord_ore +--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore. +--! @param a eql_v3.query_numeric_ord_ore --! @param b public.numeric_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/numeric/query_numeric_ord_ore_operators.sql b/src/v3/scalars/numeric/query_numeric_ord_ore_operators.sql index f50c15c34..cbb36b565 100644 --- a/src/v3/scalars/numeric/query_numeric_ord_ore_operators.sql +++ b/src/v3/scalars/numeric/query_numeric_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/numeric/query_numeric_ord_ore_functions.sql --! @file encrypted_domain/numeric/query_numeric_ord_ore_operators.sql ---! @brief Operators for public.query_numeric_ord_ore. +--! @brief Operators for eql_v3.query_numeric_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, + LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, + LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, + LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, + LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, + LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, + LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, + LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, + LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, + LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, + LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.numeric_ord_ore, RIGHTARG = public.query_numeric_ord_ore, + LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, + LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/numeric/query_numeric_types.sql b/src/v3/scalars/numeric/query_numeric_types.sql index 021ef0264..33c650f53 100644 --- a/src/v3/scalars/numeric/query_numeric_types.sql +++ b/src/v3/scalars/numeric/query_numeric_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/numeric/query_numeric_types.sql --! @brief Query-operand domains for numeric (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_numeric_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_numeric_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_numeric_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_numeric_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_numeric_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_numeric_eq AS jsonb + CREATE DOMAIN eql_v3.query_numeric_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_numeric_eq IS 'EQL numeric query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_numeric_eq IS 'EQL numeric query operand (equality)'; - --! @brief Query-operand domain public.query_numeric_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_numeric_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_numeric_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_numeric_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_numeric_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_numeric_ord_ore IS 'EQL numeric query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_numeric_ord_ore IS 'EQL numeric query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_numeric_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_numeric_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_numeric_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_numeric_ord AS jsonb + CREATE DOMAIN eql_v3.query_numeric_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_numeric_ord IS 'EQL numeric query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_numeric_ord IS 'EQL numeric query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_numeric_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_numeric_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_numeric_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_numeric_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_numeric_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_numeric_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_numeric_ord_ope IS 'EQL numeric query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_numeric_ord_ope IS 'EQL numeric query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/real/query_real_eq_functions.sql b/src/v3/scalars/real/query_real_eq_functions.sql index b0f7184f5..167d00f02 100644 --- a/src/v3/scalars/real/query_real_eq_functions.sql +++ b/src/v3/scalars/real/query_real_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/real/real_eq_functions.sql --! @file encrypted_domain/real/query_real_eq_functions.sql ---! @brief Functions for public.query_real_eq. +--! @brief Functions for eql_v3.query_real_eq. ---! @brief Index extractor for public.query_real_eq. ---! @param a public.query_real_eq +--! @brief Index extractor for eql_v3.query_real_eq. +--! @param a eql_v3.query_real_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_real_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_real_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_real_eq. +--! @brief Operator wrapper for eql_v3.query_real_eq. --! @param a public.real_eq ---! @param b public.query_real_eq +--! @param b eql_v3.query_real_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_eq, b public.query_real_eq) +CREATE FUNCTION eql_v3.eq(a public.real_eq, b eql_v3.query_real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_real_eq. ---! @param a public.query_real_eq +--! @brief Operator wrapper for eql_v3.query_real_eq. +--! @param a eql_v3.query_real_eq --! @param b public.real_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_real_eq, b public.real_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_eq, b public.real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_real_eq. +--! @brief Operator wrapper for eql_v3.query_real_eq. --! @param a public.real_eq ---! @param b public.query_real_eq +--! @param b eql_v3.query_real_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_eq, b public.query_real_eq) +CREATE FUNCTION eql_v3.neq(a public.real_eq, b eql_v3.query_real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_real_eq. ---! @param a public.query_real_eq +--! @brief Operator wrapper for eql_v3.query_real_eq. +--! @param a eql_v3.query_real_eq --! @param b public.real_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_real_eq, b public.real_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_eq, b public.real_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/real/query_real_eq_operators.sql b/src/v3/scalars/real/query_real_eq_operators.sql index dd199b286..a15a7f8f5 100644 --- a/src/v3/scalars/real/query_real_eq_operators.sql +++ b/src/v3/scalars/real/query_real_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/real/query_real_eq_functions.sql --! @file encrypted_domain/real/query_real_eq_operators.sql ---! @brief Operators for public.query_real_eq. +--! @brief Operators for eql_v3.query_real_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_eq, RIGHTARG = public.query_real_eq, + LEFTARG = public.real_eq, RIGHTARG = eql_v3.query_real_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_real_eq, RIGHTARG = public.real_eq, + LEFTARG = eql_v3.query_real_eq, RIGHTARG = public.real_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_eq, RIGHTARG = public.query_real_eq, + LEFTARG = public.real_eq, RIGHTARG = eql_v3.query_real_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_real_eq, RIGHTARG = public.real_eq, + LEFTARG = eql_v3.query_real_eq, RIGHTARG = public.real_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/real/query_real_ord_functions.sql b/src/v3/scalars/real/query_real_ord_functions.sql index 57063597a..f68239223 100644 --- a/src/v3/scalars/real/query_real_ord_functions.sql +++ b/src/v3/scalars/real/query_real_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/real/real_ord_functions.sql --! @file encrypted_domain/real/query_real_ord_functions.sql ---! @brief Functions for public.query_real_ord. +--! @brief Functions for eql_v3.query_real_ord. ---! @brief Index extractor for public.query_real_ord. ---! @param a public.query_real_ord +--! @brief Index extractor for eql_v3.query_real_ord. +--! @param a eql_v3.query_real_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_real_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_real_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_real_ord. +--! @brief Operator wrapper for eql_v3.query_real_ord. --! @param a public.real_ord ---! @param b public.query_real_ord +--! @param b eql_v3.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord, b public.query_real_ord) +CREATE FUNCTION eql_v3.eq(a public.real_ord, b eql_v3.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. ---! @param a public.query_real_ord +--! @brief Operator wrapper for eql_v3.query_real_ord. +--! @param a eql_v3.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_real_ord, b public.real_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. +--! @brief Operator wrapper for eql_v3.query_real_ord. --! @param a public.real_ord ---! @param b public.query_real_ord +--! @param b eql_v3.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord, b public.query_real_ord) +CREATE FUNCTION eql_v3.neq(a public.real_ord, b eql_v3.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. ---! @param a public.query_real_ord +--! @brief Operator wrapper for eql_v3.query_real_ord. +--! @param a eql_v3.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_real_ord, b public.real_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. +--! @brief Operator wrapper for eql_v3.query_real_ord. --! @param a public.real_ord ---! @param b public.query_real_ord +--! @param b eql_v3.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord, b public.query_real_ord) +CREATE FUNCTION eql_v3.lt(a public.real_ord, b eql_v3.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. ---! @param a public.query_real_ord +--! @brief Operator wrapper for eql_v3.query_real_ord. +--! @param a eql_v3.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_real_ord, b public.real_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. +--! @brief Operator wrapper for eql_v3.query_real_ord. --! @param a public.real_ord ---! @param b public.query_real_ord +--! @param b eql_v3.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord, b public.query_real_ord) +CREATE FUNCTION eql_v3.lte(a public.real_ord, b eql_v3.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. ---! @param a public.query_real_ord +--! @brief Operator wrapper for eql_v3.query_real_ord. +--! @param a eql_v3.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_real_ord, b public.real_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. +--! @brief Operator wrapper for eql_v3.query_real_ord. --! @param a public.real_ord ---! @param b public.query_real_ord +--! @param b eql_v3.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord, b public.query_real_ord) +CREATE FUNCTION eql_v3.gt(a public.real_ord, b eql_v3.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. ---! @param a public.query_real_ord +--! @brief Operator wrapper for eql_v3.query_real_ord. +--! @param a eql_v3.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_real_ord, b public.real_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. +--! @brief Operator wrapper for eql_v3.query_real_ord. --! @param a public.real_ord ---! @param b public.query_real_ord +--! @param b eql_v3.query_real_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord, b public.query_real_ord) +CREATE FUNCTION eql_v3.gte(a public.real_ord, b eql_v3.query_real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord. ---! @param a public.query_real_ord +--! @brief Operator wrapper for eql_v3.query_real_ord. +--! @param a eql_v3.query_real_ord --! @param b public.real_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_real_ord, b public.real_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord, b public.real_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/real/query_real_ord_ope_functions.sql b/src/v3/scalars/real/query_real_ord_ope_functions.sql index b22493711..3a1e87fb8 100644 --- a/src/v3/scalars/real/query_real_ord_ope_functions.sql +++ b/src/v3/scalars/real/query_real_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/real/real_ord_ope_functions.sql --! @file encrypted_domain/real/query_real_ord_ope_functions.sql ---! @brief Functions for public.query_real_ord_ope. +--! @brief Functions for eql_v3.query_real_ord_ope. ---! @brief Index extractor for public.query_real_ord_ope. ---! @param a public.query_real_ord_ope +--! @brief Index extractor for eql_v3.query_real_ord_ope. +--! @param a eql_v3.query_real_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_real_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_real_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.query_real_ord_ope +--! @param b eql_v3.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b public.query_real_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b eql_v3.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. ---! @param a public.query_real_ord_ope +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. +--! @param a eql_v3.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_real_ord_ope, b public.real_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.query_real_ord_ope +--! @param b eql_v3.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b public.query_real_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b eql_v3.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. ---! @param a public.query_real_ord_ope +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. +--! @param a eql_v3.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_real_ord_ope, b public.real_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.query_real_ord_ope +--! @param b eql_v3.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b public.query_real_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b eql_v3.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. ---! @param a public.query_real_ord_ope +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. +--! @param a eql_v3.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_real_ord_ope, b public.real_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.query_real_ord_ope +--! @param b eql_v3.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b public.query_real_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b eql_v3.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. ---! @param a public.query_real_ord_ope +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. +--! @param a eql_v3.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_real_ord_ope, b public.real_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.query_real_ord_ope +--! @param b eql_v3.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b public.query_real_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b eql_v3.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. ---! @param a public.query_real_ord_ope +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. +--! @param a eql_v3.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_real_ord_ope, b public.real_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. --! @param a public.real_ord_ope ---! @param b public.query_real_ord_ope +--! @param b eql_v3.query_real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b public.query_real_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b eql_v3.query_real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ope. ---! @param a public.query_real_ord_ope +--! @brief Operator wrapper for eql_v3.query_real_ord_ope. +--! @param a eql_v3.query_real_ord_ope --! @param b public.real_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_real_ord_ope, b public.real_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord_ope, b public.real_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/real/query_real_ord_ope_operators.sql b/src/v3/scalars/real/query_real_ord_ope_operators.sql index 9e69b1a41..7d4c92f34 100644 --- a/src/v3/scalars/real/query_real_ord_ope_operators.sql +++ b/src/v3/scalars/real/query_real_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/real/query_real_ord_ope_functions.sql --! @file encrypted_domain/real/query_real_ord_ope_operators.sql ---! @brief Operators for public.query_real_ord_ope. +--! @brief Operators for eql_v3.query_real_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, + LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, + LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, + LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, + LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, + LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, + LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, + LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, + LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, + LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, + LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord_ope, RIGHTARG = public.query_real_ord_ope, + LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_real_ord_ope, RIGHTARG = public.real_ord_ope, + LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/real/query_real_ord_operators.sql b/src/v3/scalars/real/query_real_ord_operators.sql index dd9b83857..3611558bc 100644 --- a/src/v3/scalars/real/query_real_ord_operators.sql +++ b/src/v3/scalars/real/query_real_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/real/query_real_ord_functions.sql --! @file encrypted_domain/real/query_real_ord_operators.sql ---! @brief Operators for public.query_real_ord. +--! @brief Operators for eql_v3.query_real_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, + LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, + LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, + LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, + LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, + LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, + LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, + LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, + LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, + LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, + LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord, RIGHTARG = public.query_real_ord, + LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_real_ord, RIGHTARG = public.real_ord, + LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/real/query_real_ord_ore_functions.sql b/src/v3/scalars/real/query_real_ord_ore_functions.sql index 2254c983d..a84edd3dd 100644 --- a/src/v3/scalars/real/query_real_ord_ore_functions.sql +++ b/src/v3/scalars/real/query_real_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/real/real_ord_ore_functions.sql --! @file encrypted_domain/real/query_real_ord_ore_functions.sql ---! @brief Functions for public.query_real_ord_ore. +--! @brief Functions for eql_v3.query_real_ord_ore. ---! @brief Index extractor for public.query_real_ord_ore. ---! @param a public.query_real_ord_ore +--! @brief Index extractor for eql_v3.query_real_ord_ore. +--! @param a eql_v3.query_real_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_real_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_real_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.query_real_ord_ore +--! @param b eql_v3.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b public.query_real_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b eql_v3.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. ---! @param a public.query_real_ord_ore +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. +--! @param a eql_v3.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_real_ord_ore, b public.real_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.query_real_ord_ore +--! @param b eql_v3.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b public.query_real_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b eql_v3.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. ---! @param a public.query_real_ord_ore +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. +--! @param a eql_v3.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_real_ord_ore, b public.real_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.query_real_ord_ore +--! @param b eql_v3.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b public.query_real_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b eql_v3.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. ---! @param a public.query_real_ord_ore +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. +--! @param a eql_v3.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_real_ord_ore, b public.real_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.query_real_ord_ore +--! @param b eql_v3.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b public.query_real_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b eql_v3.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. ---! @param a public.query_real_ord_ore +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. +--! @param a eql_v3.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_real_ord_ore, b public.real_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.query_real_ord_ore +--! @param b eql_v3.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b public.query_real_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b eql_v3.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. ---! @param a public.query_real_ord_ore +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. +--! @param a eql_v3.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_real_ord_ore, b public.real_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. --! @param a public.real_ord_ore ---! @param b public.query_real_ord_ore +--! @param b eql_v3.query_real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b public.query_real_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b eql_v3.query_real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_real_ord_ore. ---! @param a public.query_real_ord_ore +--! @brief Operator wrapper for eql_v3.query_real_ord_ore. +--! @param a eql_v3.query_real_ord_ore --! @param b public.real_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_real_ord_ore, b public.real_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord_ore, b public.real_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/real/query_real_ord_ore_operators.sql b/src/v3/scalars/real/query_real_ord_ore_operators.sql index 7db0a3632..3e76d82d0 100644 --- a/src/v3/scalars/real/query_real_ord_ore_operators.sql +++ b/src/v3/scalars/real/query_real_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/real/query_real_ord_ore_functions.sql --! @file encrypted_domain/real/query_real_ord_ore_operators.sql ---! @brief Operators for public.query_real_ord_ore. +--! @brief Operators for eql_v3.query_real_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, + LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, + LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, + LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, + LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, + LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, + LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, + LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, + LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, + LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, + LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.real_ord_ore, RIGHTARG = public.query_real_ord_ore, + LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_real_ord_ore, RIGHTARG = public.real_ord_ore, + LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/real/query_real_types.sql b/src/v3/scalars/real/query_real_types.sql index 2317e83fd..00d94d19c 100644 --- a/src/v3/scalars/real/query_real_types.sql +++ b/src/v3/scalars/real/query_real_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/real/query_real_types.sql --! @brief Query-operand domains for real (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_real_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_real_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_real_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_real_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_real_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_real_eq AS jsonb + CREATE DOMAIN eql_v3.query_real_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_real_eq IS 'EQL real query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_real_eq IS 'EQL real query operand (equality)'; - --! @brief Query-operand domain public.query_real_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_real_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_real_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_real_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_real_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_real_ord_ore IS 'EQL real query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_real_ord_ore IS 'EQL real query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_real_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_real_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_real_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_real_ord AS jsonb + CREATE DOMAIN eql_v3.query_real_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_real_ord IS 'EQL real query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_real_ord IS 'EQL real query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_real_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_real_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_real_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_real_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_real_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_real_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_real_ord_ope IS 'EQL real query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_real_ord_ope IS 'EQL real query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/smallint/query_smallint_eq_functions.sql b/src/v3/scalars/smallint/query_smallint_eq_functions.sql index 61efc4101..68193eb45 100644 --- a/src/v3/scalars/smallint/query_smallint_eq_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/smallint/smallint_eq_functions.sql --! @file encrypted_domain/smallint/query_smallint_eq_functions.sql ---! @brief Functions for public.query_smallint_eq. +--! @brief Functions for eql_v3.query_smallint_eq. ---! @brief Index extractor for public.query_smallint_eq. ---! @param a public.query_smallint_eq +--! @brief Index extractor for eql_v3.query_smallint_eq. +--! @param a eql_v3.query_smallint_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_smallint_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_smallint_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_smallint_eq. +--! @brief Operator wrapper for eql_v3.query_smallint_eq. --! @param a public.smallint_eq ---! @param b public.query_smallint_eq +--! @param b eql_v3.query_smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b public.query_smallint_eq) +CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b eql_v3.query_smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_eq. ---! @param a public.query_smallint_eq +--! @brief Operator wrapper for eql_v3.query_smallint_eq. +--! @param a eql_v3.query_smallint_eq --! @param b public.smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_smallint_eq, b public.smallint_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_eq, b public.smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_eq. +--! @brief Operator wrapper for eql_v3.query_smallint_eq. --! @param a public.smallint_eq ---! @param b public.query_smallint_eq +--! @param b eql_v3.query_smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b public.query_smallint_eq) +CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b eql_v3.query_smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_eq. ---! @param a public.query_smallint_eq +--! @brief Operator wrapper for eql_v3.query_smallint_eq. +--! @param a eql_v3.query_smallint_eq --! @param b public.smallint_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_smallint_eq, b public.smallint_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_eq, b public.smallint_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/smallint/query_smallint_eq_operators.sql b/src/v3/scalars/smallint/query_smallint_eq_operators.sql index 7e727dfa2..aa88ee81d 100644 --- a/src/v3/scalars/smallint/query_smallint_eq_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/smallint/query_smallint_eq_functions.sql --! @file encrypted_domain/smallint/query_smallint_eq_operators.sql ---! @brief Operators for public.query_smallint_eq. +--! @brief Operators for eql_v3.query_smallint_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_eq, RIGHTARG = public.query_smallint_eq, + LEFTARG = public.smallint_eq, RIGHTARG = eql_v3.query_smallint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_smallint_eq, RIGHTARG = public.smallint_eq, + LEFTARG = eql_v3.query_smallint_eq, RIGHTARG = public.smallint_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_eq, RIGHTARG = public.query_smallint_eq, + LEFTARG = public.smallint_eq, RIGHTARG = eql_v3.query_smallint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_smallint_eq, RIGHTARG = public.smallint_eq, + LEFTARG = eql_v3.query_smallint_eq, RIGHTARG = public.smallint_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/smallint/query_smallint_ord_functions.sql b/src/v3/scalars/smallint/query_smallint_ord_functions.sql index 77274e0a6..35a6f4797 100644 --- a/src/v3/scalars/smallint/query_smallint_ord_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/smallint/smallint_ord_functions.sql --! @file encrypted_domain/smallint/query_smallint_ord_functions.sql ---! @brief Functions for public.query_smallint_ord. +--! @brief Functions for eql_v3.query_smallint_ord. ---! @brief Index extractor for public.query_smallint_ord. ---! @param a public.query_smallint_ord +--! @brief Index extractor for eql_v3.query_smallint_ord. +--! @param a eql_v3.query_smallint_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_smallint_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_smallint_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_smallint_ord. +--! @brief Operator wrapper for eql_v3.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.query_smallint_ord +--! @param b eql_v3.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b public.query_smallint_ord) +CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b eql_v3.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. ---! @param a public.query_smallint_ord +--! @brief Operator wrapper for eql_v3.query_smallint_ord. +--! @param a eql_v3.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_smallint_ord, b public.smallint_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. +--! @brief Operator wrapper for eql_v3.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.query_smallint_ord +--! @param b eql_v3.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b public.query_smallint_ord) +CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b eql_v3.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. ---! @param a public.query_smallint_ord +--! @brief Operator wrapper for eql_v3.query_smallint_ord. +--! @param a eql_v3.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_smallint_ord, b public.smallint_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. +--! @brief Operator wrapper for eql_v3.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.query_smallint_ord +--! @param b eql_v3.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b public.query_smallint_ord) +CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b eql_v3.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. ---! @param a public.query_smallint_ord +--! @brief Operator wrapper for eql_v3.query_smallint_ord. +--! @param a eql_v3.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_smallint_ord, b public.smallint_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. +--! @brief Operator wrapper for eql_v3.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.query_smallint_ord +--! @param b eql_v3.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b public.query_smallint_ord) +CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b eql_v3.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. ---! @param a public.query_smallint_ord +--! @brief Operator wrapper for eql_v3.query_smallint_ord. +--! @param a eql_v3.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_smallint_ord, b public.smallint_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. +--! @brief Operator wrapper for eql_v3.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.query_smallint_ord +--! @param b eql_v3.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b public.query_smallint_ord) +CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b eql_v3.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. ---! @param a public.query_smallint_ord +--! @brief Operator wrapper for eql_v3.query_smallint_ord. +--! @param a eql_v3.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_smallint_ord, b public.smallint_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. +--! @brief Operator wrapper for eql_v3.query_smallint_ord. --! @param a public.smallint_ord ---! @param b public.query_smallint_ord +--! @param b eql_v3.query_smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b public.query_smallint_ord) +CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b eql_v3.query_smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord. ---! @param a public.query_smallint_ord +--! @brief Operator wrapper for eql_v3.query_smallint_ord. +--! @param a eql_v3.query_smallint_ord --! @param b public.smallint_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_smallint_ord, b public.smallint_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord, b public.smallint_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql b/src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql index 36b4eda37..d668ec404 100644 --- a/src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ope_functions.sql --! @file encrypted_domain/smallint/query_smallint_ord_ope_functions.sql ---! @brief Functions for public.query_smallint_ord_ope. +--! @brief Functions for eql_v3.query_smallint_ord_ope. ---! @brief Index extractor for public.query_smallint_ord_ope. ---! @param a public.query_smallint_ord_ope +--! @brief Index extractor for eql_v3.query_smallint_ord_ope. +--! @param a eql_v3.query_smallint_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_smallint_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_smallint_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.query_smallint_ord_ope +--! @param b eql_v3.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. ---! @param a public.query_smallint_ord_ope +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. +--! @param a eql_v3.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.query_smallint_ord_ope +--! @param b eql_v3.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. ---! @param a public.query_smallint_ord_ope +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. +--! @param a eql_v3.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.query_smallint_ord_ope +--! @param b eql_v3.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. ---! @param a public.query_smallint_ord_ope +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. +--! @param a eql_v3.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.query_smallint_ord_ope +--! @param b eql_v3.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. ---! @param a public.query_smallint_ord_ope +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. +--! @param a eql_v3.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.query_smallint_ord_ope +--! @param b eql_v3.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. ---! @param a public.query_smallint_ord_ope +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. +--! @param a eql_v3.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. --! @param a public.smallint_ord_ope ---! @param b public.query_smallint_ord_ope +--! @param b eql_v3.query_smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ope. ---! @param a public.query_smallint_ord_ope +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope. +--! @param a eql_v3.query_smallint_ord_ope --! @param b public.smallint_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/smallint/query_smallint_ord_ope_operators.sql b/src/v3/scalars/smallint/query_smallint_ord_ope_operators.sql index 320bec16c..94fd2e460 100644 --- a/src/v3/scalars/smallint/query_smallint_ord_ope_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/smallint/query_smallint_ord_ope_functions.sql --! @file encrypted_domain/smallint/query_smallint_ord_ope_operators.sql ---! @brief Operators for public.query_smallint_ord_ope. +--! @brief Operators for eql_v3.query_smallint_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, + LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, + LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, + LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, + LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, + LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, + LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, + LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, + LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, + LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, + LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord_ope, RIGHTARG = public.query_smallint_ord_ope, + LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, + LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/smallint/query_smallint_ord_operators.sql b/src/v3/scalars/smallint/query_smallint_ord_operators.sql index e82b3b026..7cf266447 100644 --- a/src/v3/scalars/smallint/query_smallint_ord_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/smallint/query_smallint_ord_functions.sql --! @file encrypted_domain/smallint/query_smallint_ord_operators.sql ---! @brief Operators for public.query_smallint_ord. +--! @brief Operators for eql_v3.query_smallint_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, + LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, + LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, + LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, + LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, + LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, + LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, + LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, + LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, + LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, + LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord, RIGHTARG = public.query_smallint_ord, + LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_smallint_ord, RIGHTARG = public.smallint_ord, + LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql b/src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql index b0ae24749..4c057d78d 100644 --- a/src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/smallint/smallint_ord_ore_functions.sql --! @file encrypted_domain/smallint/query_smallint_ord_ore_functions.sql ---! @brief Functions for public.query_smallint_ord_ore. +--! @brief Functions for eql_v3.query_smallint_ord_ore. ---! @brief Index extractor for public.query_smallint_ord_ore. ---! @param a public.query_smallint_ord_ore +--! @brief Index extractor for eql_v3.query_smallint_ord_ore. +--! @param a eql_v3.query_smallint_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_smallint_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_smallint_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.query_smallint_ord_ore +--! @param b eql_v3.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. ---! @param a public.query_smallint_ord_ore +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. +--! @param a eql_v3.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.query_smallint_ord_ore +--! @param b eql_v3.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. ---! @param a public.query_smallint_ord_ore +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. +--! @param a eql_v3.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.query_smallint_ord_ore +--! @param b eql_v3.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. ---! @param a public.query_smallint_ord_ore +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. +--! @param a eql_v3.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.query_smallint_ord_ore +--! @param b eql_v3.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. ---! @param a public.query_smallint_ord_ore +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. +--! @param a eql_v3.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.query_smallint_ord_ore +--! @param b eql_v3.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. ---! @param a public.query_smallint_ord_ore +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. +--! @param a eql_v3.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. --! @param a public.smallint_ord_ore ---! @param b public.query_smallint_ord_ore +--! @param b eql_v3.query_smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_smallint_ord_ore. ---! @param a public.query_smallint_ord_ore +--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore. +--! @param a eql_v3.query_smallint_ord_ore --! @param b public.smallint_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/smallint/query_smallint_ord_ore_operators.sql b/src/v3/scalars/smallint/query_smallint_ord_ore_operators.sql index d198009a0..04c6b6018 100644 --- a/src/v3/scalars/smallint/query_smallint_ord_ore_operators.sql +++ b/src/v3/scalars/smallint/query_smallint_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/smallint/query_smallint_ord_ore_functions.sql --! @file encrypted_domain/smallint/query_smallint_ord_ore_operators.sql ---! @brief Operators for public.query_smallint_ord_ore. +--! @brief Operators for eql_v3.query_smallint_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, + LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, + LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, + LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, + LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, + LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, + LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, + LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, + LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, + LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, + LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.smallint_ord_ore, RIGHTARG = public.query_smallint_ord_ore, + LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, + LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/smallint/query_smallint_types.sql b/src/v3/scalars/smallint/query_smallint_types.sql index bb772cb4e..2cae4cdd7 100644 --- a/src/v3/scalars/smallint/query_smallint_types.sql +++ b/src/v3/scalars/smallint/query_smallint_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/smallint/query_smallint_types.sql --! @brief Query-operand domains for smallint (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_smallint_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_smallint_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_smallint_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_smallint_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_smallint_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_smallint_eq AS jsonb + CREATE DOMAIN eql_v3.query_smallint_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_smallint_eq IS 'EQL smallint query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_smallint_eq IS 'EQL smallint query operand (equality)'; - --! @brief Query-operand domain public.query_smallint_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_smallint_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_smallint_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_smallint_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_smallint_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_smallint_ord_ore IS 'EQL smallint query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_smallint_ord_ore IS 'EQL smallint query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_smallint_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_smallint_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_smallint_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_smallint_ord AS jsonb + CREATE DOMAIN eql_v3.query_smallint_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_smallint_ord IS 'EQL smallint query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_smallint_ord IS 'EQL smallint query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_smallint_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_smallint_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_smallint_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_smallint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_smallint_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_smallint_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_smallint_ord_ope IS 'EQL smallint query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_smallint_ord_ope IS 'EQL smallint query operand (equality, ordering)'; END $$; diff --git a/src/v3/scalars/text/query_text_eq_functions.sql b/src/v3/scalars/text/query_text_eq_functions.sql index 37562d87c..7ffc6aced 100644 --- a/src/v3/scalars/text/query_text_eq_functions.sql +++ b/src/v3/scalars/text/query_text_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/text/text_eq_functions.sql --! @file encrypted_domain/text/query_text_eq_functions.sql ---! @brief Functions for public.query_text_eq. +--! @brief Functions for eql_v3.query_text_eq. ---! @brief Index extractor for public.query_text_eq. ---! @param a public.query_text_eq +--! @brief Index extractor for eql_v3.query_text_eq. +--! @param a eql_v3.query_text_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_text_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_text_eq. +--! @brief Operator wrapper for eql_v3.query_text_eq. --! @param a public.text_eq ---! @param b public.query_text_eq +--! @param b eql_v3.query_text_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_eq, b public.query_text_eq) +CREATE FUNCTION eql_v3.eq(a public.text_eq, b eql_v3.query_text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_eq. ---! @param a public.query_text_eq +--! @brief Operator wrapper for eql_v3.query_text_eq. +--! @param a eql_v3.query_text_eq --! @param b public.text_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_text_eq, b public.text_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_eq, b public.text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_eq. +--! @brief Operator wrapper for eql_v3.query_text_eq. --! @param a public.text_eq ---! @param b public.query_text_eq +--! @param b eql_v3.query_text_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_eq, b public.query_text_eq) +CREATE FUNCTION eql_v3.neq(a public.text_eq, b eql_v3.query_text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_eq. ---! @param a public.query_text_eq +--! @brief Operator wrapper for eql_v3.query_text_eq. +--! @param a eql_v3.query_text_eq --! @param b public.text_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_text_eq, b public.text_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_eq, b public.text_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/text/query_text_eq_operators.sql b/src/v3/scalars/text/query_text_eq_operators.sql index d8289bd74..ada949cff 100644 --- a/src/v3/scalars/text/query_text_eq_operators.sql +++ b/src/v3/scalars/text/query_text_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/text/query_text_eq_functions.sql --! @file encrypted_domain/text/query_text_eq_operators.sql ---! @brief Operators for public.query_text_eq. +--! @brief Operators for eql_v3.query_text_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_eq, RIGHTARG = public.query_text_eq, + LEFTARG = public.text_eq, RIGHTARG = eql_v3.query_text_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_text_eq, RIGHTARG = public.text_eq, + LEFTARG = eql_v3.query_text_eq, RIGHTARG = public.text_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_eq, RIGHTARG = public.query_text_eq, + LEFTARG = public.text_eq, RIGHTARG = eql_v3.query_text_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_text_eq, RIGHTARG = public.text_eq, + LEFTARG = eql_v3.query_text_eq, RIGHTARG = public.text_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/text/query_text_match_functions.sql b/src/v3/scalars/text/query_text_match_functions.sql index aefe4d6ec..fc3f9a060 100644 --- a/src/v3/scalars/text/query_text_match_functions.sql +++ b/src/v3/scalars/text/query_text_match_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/text/text_match_functions.sql --! @file encrypted_domain/text/query_text_match_functions.sql ---! @brief Functions for public.query_text_match. +--! @brief Functions for eql_v3.query_text_match. ---! @brief Index extractor for public.query_text_match. ---! @param a public.query_text_match +--! @brief Index extractor for eql_v3.query_text_match. +--! @param a eql_v3.query_text_match --! @return eql_v3_internal.bloom_filter -CREATE FUNCTION eql_v3.match_term(a public.query_text_match) +CREATE FUNCTION eql_v3.match_term(a eql_v3.query_text_match) RETURNS eql_v3_internal.bloom_filter LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$; ---! @brief Operator wrapper for public.query_text_match. +--! @brief Operator wrapper for eql_v3.query_text_match. --! @param a public.text_match ---! @param b public.query_text_match +--! @param b eql_v3.query_text_match --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.text_match, b public.query_text_match) +CREATE FUNCTION eql_v3.contains(a public.text_match, b eql_v3.query_text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.query_text_match. ---! @param a public.query_text_match +--! @brief Operator wrapper for eql_v3.query_text_match. +--! @param a eql_v3.query_text_match --! @param b public.text_match --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.query_text_match, b public.text_match) +CREATE FUNCTION eql_v3.contains(a eql_v3.query_text_match, b public.text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.query_text_match. +--! @brief Operator wrapper for eql_v3.query_text_match. --! @param a public.text_match ---! @param b public.query_text_match +--! @param b eql_v3.query_text_match --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.text_match, b public.query_text_match) +CREATE FUNCTION eql_v3.contained_by(a public.text_match, b eql_v3.query_text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.query_text_match. ---! @param a public.query_text_match +--! @brief Operator wrapper for eql_v3.query_text_match. +--! @param a eql_v3.query_text_match --! @param b public.text_match --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.query_text_match, b public.text_match) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.query_text_match, b public.text_match) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; diff --git a/src/v3/scalars/text/query_text_match_operators.sql b/src/v3/scalars/text/query_text_match_operators.sql index 81bb88dc6..3d4fcc2c6 100644 --- a/src/v3/scalars/text/query_text_match_operators.sql +++ b/src/v3/scalars/text/query_text_match_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/text/query_text_match_functions.sql --! @file encrypted_domain/text/query_text_match_operators.sql ---! @brief Operators for public.query_text_match. +--! @brief Operators for eql_v3.query_text_match. CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.text_match, RIGHTARG = public.query_text_match, + LEFTARG = public.text_match, RIGHTARG = eql_v3.query_text_match, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.query_text_match, RIGHTARG = public.text_match, + LEFTARG = eql_v3.query_text_match, RIGHTARG = public.text_match, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.text_match, RIGHTARG = public.query_text_match, + LEFTARG = public.text_match, RIGHTARG = eql_v3.query_text_match, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.query_text_match, RIGHTARG = public.text_match, + LEFTARG = eql_v3.query_text_match, RIGHTARG = public.text_match, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); diff --git a/src/v3/scalars/text/query_text_ord_functions.sql b/src/v3/scalars/text/query_text_ord_functions.sql index 2f7460989..c2f209a0e 100644 --- a/src/v3/scalars/text/query_text_ord_functions.sql +++ b/src/v3/scalars/text/query_text_ord_functions.sql @@ -4,116 +4,116 @@ -- REQUIRE: src/v3/scalars/text/text_ord_functions.sql --! @file encrypted_domain/text/query_text_ord_functions.sql ---! @brief Functions for public.query_text_ord. +--! @brief Functions for eql_v3.query_text_ord. ---! @brief Index extractor for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Index extractor for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_text_ord) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Index extractor for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_text_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_text_ord. +--! @brief Operator wrapper for eql_v3.query_text_ord. --! @param a public.text_ord ---! @param b public.query_text_ord +--! @param b eql_v3.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord, b public.query_text_ord) +CREATE FUNCTION eql_v3.eq(a public.text_ord, b eql_v3.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Operator wrapper for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_text_ord, b public.text_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. +--! @brief Operator wrapper for eql_v3.query_text_ord. --! @param a public.text_ord ---! @param b public.query_text_ord +--! @param b eql_v3.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord, b public.query_text_ord) +CREATE FUNCTION eql_v3.neq(a public.text_ord, b eql_v3.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Operator wrapper for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_text_ord, b public.text_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. +--! @brief Operator wrapper for eql_v3.query_text_ord. --! @param a public.text_ord ---! @param b public.query_text_ord +--! @param b eql_v3.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord, b public.query_text_ord) +CREATE FUNCTION eql_v3.lt(a public.text_ord, b eql_v3.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Operator wrapper for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_text_ord, b public.text_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. +--! @brief Operator wrapper for eql_v3.query_text_ord. --! @param a public.text_ord ---! @param b public.query_text_ord +--! @param b eql_v3.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord, b public.query_text_ord) +CREATE FUNCTION eql_v3.lte(a public.text_ord, b eql_v3.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Operator wrapper for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_text_ord, b public.text_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. +--! @brief Operator wrapper for eql_v3.query_text_ord. --! @param a public.text_ord ---! @param b public.query_text_ord +--! @param b eql_v3.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord, b public.query_text_ord) +CREATE FUNCTION eql_v3.gt(a public.text_ord, b eql_v3.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Operator wrapper for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_text_ord, b public.text_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. +--! @brief Operator wrapper for eql_v3.query_text_ord. --! @param a public.text_ord ---! @param b public.query_text_ord +--! @param b eql_v3.query_text_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord, b public.query_text_ord) +CREATE FUNCTION eql_v3.gte(a public.text_ord, b eql_v3.query_text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord. ---! @param a public.query_text_ord +--! @brief Operator wrapper for eql_v3.query_text_ord. +--! @param a eql_v3.query_text_ord --! @param b public.text_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_text_ord, b public.text_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord, b public.text_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/text/query_text_ord_ope_functions.sql b/src/v3/scalars/text/query_text_ord_ope_functions.sql index 473a408e4..df5c46164 100644 --- a/src/v3/scalars/text/query_text_ord_ope_functions.sql +++ b/src/v3/scalars/text/query_text_ord_ope_functions.sql @@ -4,116 +4,116 @@ -- REQUIRE: src/v3/scalars/text/text_ord_ope_functions.sql --! @file encrypted_domain/text/query_text_ord_ope_functions.sql ---! @brief Functions for public.query_text_ord_ope. +--! @brief Functions for eql_v3.query_text_ord_ope. ---! @brief Index extractor for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Index extractor for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_text_ord_ope) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord_ope) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Index extractor for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_text_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_text_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.query_text_ord_ope +--! @param b eql_v3.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b public.query_text_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b eql_v3.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_text_ord_ope, b public.text_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.query_text_ord_ope +--! @param b eql_v3.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b public.query_text_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b eql_v3.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_text_ord_ope, b public.text_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.query_text_ord_ope +--! @param b eql_v3.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b public.query_text_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b eql_v3.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_text_ord_ope, b public.text_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.query_text_ord_ope +--! @param b eql_v3.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b public.query_text_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b eql_v3.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_text_ord_ope, b public.text_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.query_text_ord_ope +--! @param b eql_v3.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b public.query_text_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b eql_v3.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_text_ord_ope, b public.text_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. --! @param a public.text_ord_ope ---! @param b public.query_text_ord_ope +--! @param b eql_v3.query_text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b public.query_text_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b eql_v3.query_text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ope. ---! @param a public.query_text_ord_ope +--! @brief Operator wrapper for eql_v3.query_text_ord_ope. +--! @param a eql_v3.query_text_ord_ope --! @param b public.text_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_text_ord_ope, b public.text_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord_ope, b public.text_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/text/query_text_ord_ope_operators.sql b/src/v3/scalars/text/query_text_ord_ope_operators.sql index 6ab49eec8..a28be3f10 100644 --- a/src/v3/scalars/text/query_text_ord_ope_operators.sql +++ b/src/v3/scalars/text/query_text_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/text/query_text_ord_ope_functions.sql --! @file encrypted_domain/text/query_text_ord_ope_operators.sql ---! @brief Operators for public.query_text_ord_ope. +--! @brief Operators for eql_v3.query_text_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, + LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, + LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, + LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, + LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, + LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, + LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, + LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, + LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, + LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, + LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord_ope, RIGHTARG = public.query_text_ord_ope, + LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_text_ord_ope, RIGHTARG = public.text_ord_ope, + LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/text/query_text_ord_operators.sql b/src/v3/scalars/text/query_text_ord_operators.sql index d57382ed0..e71c0b886 100644 --- a/src/v3/scalars/text/query_text_ord_operators.sql +++ b/src/v3/scalars/text/query_text_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/text/query_text_ord_functions.sql --! @file encrypted_domain/text/query_text_ord_operators.sql ---! @brief Operators for public.query_text_ord. +--! @brief Operators for eql_v3.query_text_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, + LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, + LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, + LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, + LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, + LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, + LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, + LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, + LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, + LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, + LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord, RIGHTARG = public.query_text_ord, + LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_text_ord, RIGHTARG = public.text_ord, + LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/text/query_text_ord_ore_functions.sql b/src/v3/scalars/text/query_text_ord_ore_functions.sql index 7d8b3bf8e..c69dc11cf 100644 --- a/src/v3/scalars/text/query_text_ord_ore_functions.sql +++ b/src/v3/scalars/text/query_text_ord_ore_functions.sql @@ -4,116 +4,116 @@ -- REQUIRE: src/v3/scalars/text/text_ord_ore_functions.sql --! @file encrypted_domain/text/query_text_ord_ore_functions.sql ---! @brief Functions for public.query_text_ord_ore. +--! @brief Functions for eql_v3.query_text_ord_ore. ---! @brief Index extractor for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Index extractor for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_text_ord_ore) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord_ore) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Index extractor for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_text_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.query_text_ord_ore +--! @param b eql_v3.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b public.query_text_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b eql_v3.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_text_ord_ore, b public.text_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.query_text_ord_ore +--! @param b eql_v3.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b public.query_text_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b eql_v3.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_text_ord_ore, b public.text_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.query_text_ord_ore +--! @param b eql_v3.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b public.query_text_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b eql_v3.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_text_ord_ore, b public.text_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.query_text_ord_ore +--! @param b eql_v3.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b public.query_text_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b eql_v3.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_text_ord_ore, b public.text_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.query_text_ord_ore +--! @param b eql_v3.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b public.query_text_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b eql_v3.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_text_ord_ore, b public.text_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. --! @param a public.text_ord_ore ---! @param b public.query_text_ord_ore +--! @param b eql_v3.query_text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b public.query_text_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b eql_v3.query_text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_ord_ore. ---! @param a public.query_text_ord_ore +--! @brief Operator wrapper for eql_v3.query_text_ord_ore. +--! @param a eql_v3.query_text_ord_ore --! @param b public.text_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_text_ord_ore, b public.text_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord_ore, b public.text_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/text/query_text_ord_ore_operators.sql b/src/v3/scalars/text/query_text_ord_ore_operators.sql index 41a18eac0..e75150fd2 100644 --- a/src/v3/scalars/text/query_text_ord_ore_operators.sql +++ b/src/v3/scalars/text/query_text_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/text/query_text_ord_ore_functions.sql --! @file encrypted_domain/text/query_text_ord_ore_operators.sql ---! @brief Operators for public.query_text_ord_ore. +--! @brief Operators for eql_v3.query_text_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, + LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, + LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, + LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, + LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, + LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, + LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, + LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, + LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, + LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, + LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_ord_ore, RIGHTARG = public.query_text_ord_ore, + LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_text_ord_ore, RIGHTARG = public.text_ord_ore, + LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/text/query_text_search_functions.sql b/src/v3/scalars/text/query_text_search_functions.sql index ed7f76b12..56255c179 100644 --- a/src/v3/scalars/text/query_text_search_functions.sql +++ b/src/v3/scalars/text/query_text_search_functions.sql @@ -4,156 +4,156 @@ -- REQUIRE: src/v3/scalars/text/text_search_functions.sql --! @file encrypted_domain/text/query_text_search_functions.sql ---! @brief Functions for public.query_text_search. +--! @brief Functions for eql_v3.query_text_search. ---! @brief Index extractor for public.query_text_search. ---! @param a public.query_text_search +--! @brief Index extractor for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_text_search) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_search) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Index extractor for public.query_text_search. ---! @param a public.query_text_search +--! @brief Index extractor for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_text_search) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_search) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Index extractor for public.query_text_search. ---! @param a public.query_text_search +--! @brief Index extractor for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @return eql_v3_internal.bloom_filter -CREATE FUNCTION eql_v3.match_term(a public.query_text_search) +CREATE FUNCTION eql_v3.match_term(a eql_v3.query_text_search) RETURNS eql_v3_internal.bloom_filter LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.eq(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.neq(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.lt(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.lte(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.gt(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.gte(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.contains(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.contains(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.contains(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. +--! @brief Operator wrapper for eql_v3.query_text_search. --! @param a public.text_search ---! @param b public.query_text_search +--! @param b eql_v3.query_text_search --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.text_search, b public.query_text_search) +CREATE FUNCTION eql_v3.contained_by(a public.text_search, b eql_v3.query_text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; ---! @brief Operator wrapper for public.query_text_search. ---! @param a public.query_text_search +--! @brief Operator wrapper for eql_v3.query_text_search. +--! @param a eql_v3.query_text_search --! @param b public.text_search --! @return boolean -CREATE FUNCTION eql_v3.contained_by(a public.query_text_search, b public.text_search) +CREATE FUNCTION eql_v3.contained_by(a eql_v3.query_text_search, b public.text_search) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$; diff --git a/src/v3/scalars/text/query_text_search_operators.sql b/src/v3/scalars/text/query_text_search_operators.sql index e2aba1159..42baa00ac 100644 --- a/src/v3/scalars/text/query_text_search_operators.sql +++ b/src/v3/scalars/text/query_text_search_operators.sql @@ -4,100 +4,100 @@ -- REQUIRE: src/v3/scalars/text/query_text_search_functions.sql --! @file encrypted_domain/text/query_text_search_operators.sql ---! @brief Operators for public.query_text_search. +--! @brief Operators for eql_v3.query_text_search. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR @> ( FUNCTION = eql_v3.contains, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.text_search, RIGHTARG = public.query_text_search, + LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); CREATE OPERATOR <@ ( FUNCTION = eql_v3.contained_by, - LEFTARG = public.query_text_search, RIGHTARG = public.text_search, + LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search, COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel ); diff --git a/src/v3/scalars/text/query_text_types.sql b/src/v3/scalars/text/query_text_types.sql index 3fae03082..4356326ae 100644 --- a/src/v3/scalars/text/query_text_types.sql +++ b/src/v3/scalars/text/query_text_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/text/query_text_types.sql --! @brief Query-operand domains for text (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_text_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_text_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_text_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_text_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_text_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_text_eq AS jsonb + CREATE DOMAIN eql_v3.query_text_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_text_eq IS 'EQL text query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_text_eq IS 'EQL text query operand (equality)'; - --! @brief Query-operand domain public.query_text_match (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_text_match (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_text_match' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_match' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_text_match AS jsonb + CREATE DOMAIN eql_v3.query_text_match AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -44,14 +48,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_text_match IS 'EQL text query operand (containment)'; + COMMENT ON DOMAIN eql_v3.query_text_match IS 'EQL text query operand (containment)'; - --! @brief Query-operand domain public.query_text_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_text_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_text_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_text_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_text_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -65,14 +69,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_text_ord_ore IS 'EQL text query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_text_ord_ore IS 'EQL text query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_text_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_text_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_text_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_text_ord AS jsonb + CREATE DOMAIN eql_v3.query_text_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -86,14 +90,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_text_ord IS 'EQL text query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_text_ord IS 'EQL text query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_text_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_text_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_text_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_text_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_text_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -105,14 +109,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_text_ord_ope IS 'EQL text query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_text_ord_ope IS 'EQL text query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_text_search (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_text_search (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_text_search' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_text_search' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_text_search AS jsonb + CREATE DOMAIN eql_v3.query_text_search AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -127,6 +131,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_text_search IS 'EQL text query operand (equality, ordering, containment)'; + COMMENT ON DOMAIN eql_v3.query_text_search IS 'EQL text query operand (equality, ordering, containment)'; END $$; diff --git a/src/v3/scalars/timestamp/query_timestamp_eq_functions.sql b/src/v3/scalars/timestamp/query_timestamp_eq_functions.sql index c906eefd3..cae7ce21e 100644 --- a/src/v3/scalars/timestamp/query_timestamp_eq_functions.sql +++ b/src/v3/scalars/timestamp/query_timestamp_eq_functions.sql @@ -4,44 +4,44 @@ -- REQUIRE: src/v3/scalars/timestamp/timestamp_eq_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_eq_functions.sql ---! @brief Functions for public.query_timestamp_eq. +--! @brief Functions for eql_v3.query_timestamp_eq. ---! @brief Index extractor for public.query_timestamp_eq. ---! @param a public.query_timestamp_eq +--! @brief Index extractor for eql_v3.query_timestamp_eq. +--! @param a eql_v3.query_timestamp_eq --! @return eql_v3_internal.hmac_256 -CREATE FUNCTION eql_v3.eq_term(a public.query_timestamp_eq) +CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_timestamp_eq) RETURNS eql_v3_internal.hmac_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_timestamp_eq. +--! @brief Operator wrapper for eql_v3.query_timestamp_eq. --! @param a public.timestamp_eq ---! @param b public.query_timestamp_eq +--! @param b eql_v3.query_timestamp_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b public.query_timestamp_eq) +CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b eql_v3.query_timestamp_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_eq. ---! @param a public.query_timestamp_eq +--! @brief Operator wrapper for eql_v3.query_timestamp_eq. +--! @param a eql_v3.query_timestamp_eq --! @param b public.timestamp_eq --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_timestamp_eq, b public.timestamp_eq) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_eq, b public.timestamp_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_eq. +--! @brief Operator wrapper for eql_v3.query_timestamp_eq. --! @param a public.timestamp_eq ---! @param b public.query_timestamp_eq +--! @param b eql_v3.query_timestamp_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b public.query_timestamp_eq) +CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b eql_v3.query_timestamp_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_eq. ---! @param a public.query_timestamp_eq +--! @brief Operator wrapper for eql_v3.query_timestamp_eq. +--! @param a eql_v3.query_timestamp_eq --! @param b public.timestamp_eq --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_timestamp_eq, b public.timestamp_eq) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_eq, b public.timestamp_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; diff --git a/src/v3/scalars/timestamp/query_timestamp_eq_operators.sql b/src/v3/scalars/timestamp/query_timestamp_eq_operators.sql index d23f0f0d7..602ac5e38 100644 --- a/src/v3/scalars/timestamp/query_timestamp_eq_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_eq_operators.sql @@ -4,28 +4,28 @@ -- REQUIRE: src/v3/scalars/timestamp/query_timestamp_eq_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_eq_operators.sql ---! @brief Operators for public.query_timestamp_eq. +--! @brief Operators for eql_v3.query_timestamp_eq. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_eq, RIGHTARG = public.query_timestamp_eq, + LEFTARG = public.timestamp_eq, RIGHTARG = eql_v3.query_timestamp_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_timestamp_eq, RIGHTARG = public.timestamp_eq, + LEFTARG = eql_v3.query_timestamp_eq, RIGHTARG = public.timestamp_eq, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_eq, RIGHTARG = public.query_timestamp_eq, + LEFTARG = public.timestamp_eq, RIGHTARG = eql_v3.query_timestamp_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_timestamp_eq, RIGHTARG = public.timestamp_eq, + LEFTARG = eql_v3.query_timestamp_eq, RIGHTARG = public.timestamp_eq, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); diff --git a/src/v3/scalars/timestamp/query_timestamp_ord_functions.sql b/src/v3/scalars/timestamp/query_timestamp_ord_functions.sql index 15beab859..2232de244 100644 --- a/src/v3/scalars/timestamp/query_timestamp_ord_functions.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_ord_functions.sql ---! @brief Functions for public.query_timestamp_ord. +--! @brief Functions for eql_v3.query_timestamp_ord. ---! @brief Index extractor for public.query_timestamp_ord. ---! @param a public.query_timestamp_ord +--! @brief Index extractor for eql_v3.query_timestamp_ord. +--! @param a eql_v3.query_timestamp_ord --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_timestamp_ord) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_timestamp_ord) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.query_timestamp_ord +--! @param b eql_v3.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b public.query_timestamp_ord) +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b eql_v3.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. ---! @param a public.query_timestamp_ord +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. +--! @param a eql_v3.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_timestamp_ord, b public.timestamp_ord) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.query_timestamp_ord +--! @param b eql_v3.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b public.query_timestamp_ord) +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b eql_v3.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. ---! @param a public.query_timestamp_ord +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. +--! @param a eql_v3.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_timestamp_ord, b public.timestamp_ord) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.query_timestamp_ord +--! @param b eql_v3.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b public.query_timestamp_ord) +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b eql_v3.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. ---! @param a public.query_timestamp_ord +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. +--! @param a eql_v3.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_timestamp_ord, b public.timestamp_ord) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.query_timestamp_ord +--! @param b eql_v3.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b public.query_timestamp_ord) +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b eql_v3.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. ---! @param a public.query_timestamp_ord +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. +--! @param a eql_v3.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_timestamp_ord, b public.timestamp_ord) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.query_timestamp_ord +--! @param b eql_v3.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b public.query_timestamp_ord) +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b eql_v3.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. ---! @param a public.query_timestamp_ord +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. +--! @param a eql_v3.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_timestamp_ord, b public.timestamp_ord) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. --! @param a public.timestamp_ord ---! @param b public.query_timestamp_ord +--! @param b eql_v3.query_timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b public.query_timestamp_ord) +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b eql_v3.query_timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord. ---! @param a public.query_timestamp_ord +--! @brief Operator wrapper for eql_v3.query_timestamp_ord. +--! @param a eql_v3.query_timestamp_ord --! @param b public.timestamp_ord --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_timestamp_ord, b public.timestamp_ord) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord, b public.timestamp_ord) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql index b8bc6d98d..7a0e884b8 100644 --- a/src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ope_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_ord_ope_functions.sql ---! @brief Functions for public.query_timestamp_ord_ope. +--! @brief Functions for eql_v3.query_timestamp_ord_ope. ---! @brief Index extractor for public.query_timestamp_ord_ope. ---! @param a public.query_timestamp_ord_ope +--! @brief Index extractor for eql_v3.query_timestamp_ord_ope. +--! @param a eql_v3.query_timestamp_ord_ope --! @return eql_v3_internal.ope_cllw -CREATE FUNCTION eql_v3.ord_ope_term(a public.query_timestamp_ord_ope) +CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_timestamp_ord_ope) RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.query_timestamp_ord_ope +--! @param b eql_v3.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. ---! @param a public.query_timestamp_ord_ope +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. +--! @param a eql_v3.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.query_timestamp_ord_ope +--! @param b eql_v3.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. ---! @param a public.query_timestamp_ord_ope +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. +--! @param a eql_v3.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.query_timestamp_ord_ope +--! @param b eql_v3.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. ---! @param a public.query_timestamp_ord_ope +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. +--! @param a eql_v3.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.query_timestamp_ord_ope +--! @param b eql_v3.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. ---! @param a public.query_timestamp_ord_ope +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. +--! @param a eql_v3.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.query_timestamp_ord_ope +--! @param b eql_v3.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. ---! @param a public.query_timestamp_ord_ope +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. +--! @param a eql_v3.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. --! @param a public.timestamp_ord_ope ---! @param b public.query_timestamp_ord_ope +--! @param b eql_v3.query_timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ope. ---! @param a public.query_timestamp_ord_ope +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope. +--! @param a eql_v3.query_timestamp_ord_ope --! @param b public.timestamp_ord_ope --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; diff --git a/src/v3/scalars/timestamp/query_timestamp_ord_ope_operators.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ope_operators.sql index b00192888..f145fc2f9 100644 --- a/src/v3/scalars/timestamp/query_timestamp_ord_ope_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ope_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/timestamp/query_timestamp_ord_ope_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_ord_ope_operators.sql ---! @brief Operators for public.query_timestamp_ord_ope. +--! @brief Operators for eql_v3.query_timestamp_ord_ope. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.query_timestamp_ord_ope, + LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, + LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/timestamp/query_timestamp_ord_operators.sql b/src/v3/scalars/timestamp/query_timestamp_ord_operators.sql index 951c98e47..bf23dc146 100644 --- a/src/v3/scalars/timestamp/query_timestamp_ord_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/timestamp/query_timestamp_ord_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_ord_operators.sql ---! @brief Operators for public.query_timestamp_ord. +--! @brief Operators for eql_v3.query_timestamp_ord. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, + LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, + LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, + LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, + LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, + LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, + LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, + LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, + LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, + LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, + LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord, RIGHTARG = public.query_timestamp_ord, + LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_timestamp_ord, RIGHTARG = public.timestamp_ord, + LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql index e16c78cfb..db1cc47d3 100644 --- a/src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql @@ -4,108 +4,108 @@ -- REQUIRE: src/v3/scalars/timestamp/timestamp_ord_ore_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_ord_ore_functions.sql ---! @brief Functions for public.query_timestamp_ord_ore. +--! @brief Functions for eql_v3.query_timestamp_ord_ore. ---! @brief Index extractor for public.query_timestamp_ord_ore. ---! @param a public.query_timestamp_ord_ore +--! @brief Index extractor for eql_v3.query_timestamp_ord_ore. +--! @param a eql_v3.query_timestamp_ord_ore --! @return eql_v3_internal.ore_block_256 -CREATE FUNCTION eql_v3.ord_term(a public.query_timestamp_ord_ore) +CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_timestamp_ord_ore) RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.query_timestamp_ord_ore +--! @param b eql_v3.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) +CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. ---! @param a public.query_timestamp_ord_ore +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. +--! @param a eql_v3.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.eq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.query_timestamp_ord_ore +--! @param b eql_v3.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) +CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. ---! @param a public.query_timestamp_ord_ore +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. +--! @param a eql_v3.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.neq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.query_timestamp_ord_ore +--! @param b eql_v3.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) +CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. ---! @param a public.query_timestamp_ord_ore +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. +--! @param a eql_v3.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.query_timestamp_ord_ore +--! @param b eql_v3.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) +CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. ---! @param a public.query_timestamp_ord_ore +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. +--! @param a eql_v3.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.lte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.query_timestamp_ord_ore +--! @param b eql_v3.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) +CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. ---! @param a public.query_timestamp_ord_ore +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. +--! @param a eql_v3.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. --! @param a public.timestamp_ord_ore ---! @param b public.query_timestamp_ord_ore +--! @param b eql_v3.query_timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) +CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; ---! @brief Operator wrapper for public.query_timestamp_ord_ore. ---! @param a public.query_timestamp_ord_ore +--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore. +--! @param a eql_v3.query_timestamp_ord_ore --! @param b public.timestamp_ord_ore --! @return boolean -CREATE FUNCTION eql_v3.gte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$; diff --git a/src/v3/scalars/timestamp/query_timestamp_ord_ore_operators.sql b/src/v3/scalars/timestamp/query_timestamp_ord_ore_operators.sql index 51bac6fce..5a7f28542 100644 --- a/src/v3/scalars/timestamp/query_timestamp_ord_ore_operators.sql +++ b/src/v3/scalars/timestamp/query_timestamp_ord_ore_operators.sql @@ -4,76 +4,76 @@ -- REQUIRE: src/v3/scalars/timestamp/query_timestamp_ord_ore_functions.sql --! @file encrypted_domain/timestamp/query_timestamp_ord_ore_operators.sql ---! @brief Operators for public.query_timestamp_ord_ore. +--! @brief Operators for eql_v3.query_timestamp_ord_ore. CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR = ( FUNCTION = eql_v3.eq, - LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR <> ( FUNCTION = eql_v3.neq, - LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR < ( FUNCTION = eql_v3.lt, - LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR <= ( FUNCTION = eql_v3.lte, - LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR > ( FUNCTION = eql_v3.gt, - LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.query_timestamp_ord_ore, + LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); CREATE OPERATOR >= ( FUNCTION = eql_v3.gte, - LEFTARG = public.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, + LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore, COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); diff --git a/src/v3/scalars/timestamp/query_timestamp_types.sql b/src/v3/scalars/timestamp/query_timestamp_types.sql index fb40a1381..11ac5d65f 100644 --- a/src/v3/scalars/timestamp/query_timestamp_types.sql +++ b/src/v3/scalars/timestamp/query_timestamp_types.sql @@ -3,19 +3,23 @@ --! @file v3/scalars/timestamp/query_timestamp_types.sql --! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. --! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::public.query_timestamp_eq`). A bare, +--! (e.g. `WHERE col = $1::eql_v3.query_timestamp_eq`). A bare, --! uncast literal RHS is ambiguous between the `query_` and `jsonb` --! operator overloads and will not resolve. DO $$ BEGIN - --! @brief Query-operand domain public.query_timestamp_eq (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_timestamp_eq (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_eq' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_timestamp_eq AS jsonb + CREATE DOMAIN eql_v3.query_timestamp_eq AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -26,14 +30,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_timestamp_eq IS 'EQL timestamp query operand (equality)'; + COMMENT ON DOMAIN eql_v3.query_timestamp_eq IS 'EQL timestamp query operand (equality)'; - --! @brief Query-operand domain public.query_timestamp_ord_ore (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_timestamp_ord_ore (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_timestamp_ord_ore AS jsonb + CREATE DOMAIN eql_v3.query_timestamp_ord_ore AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -46,14 +50,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_timestamp_ord (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_timestamp_ord (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_timestamp_ord AS jsonb + CREATE DOMAIN eql_v3.query_timestamp_ord AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -66,14 +70,14 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)'; - --! @brief Query-operand domain public.query_timestamp_ord_ope (term-only; no `c`). + --! @brief Query-operand domain eql_v3.query_timestamp_ord_ope (term-only; no `c`). IF NOT EXISTS ( SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'public'::regnamespace + WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace ) THEN - CREATE DOMAIN public.query_timestamp_ord_ope AS jsonb + CREATE DOMAIN eql_v3.query_timestamp_ord_ope AS jsonb CHECK ( jsonb_typeof(VALUE) = 'object' AND VALUE ? 'v' @@ -84,6 +88,6 @@ BEGIN ); END IF; - COMMENT ON DOMAIN public.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)'; + COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)'; END $$; diff --git a/tasks/docs/generate/test_xml_to_json.py b/tasks/docs/generate/test_xml_to_json.py index 6cd925819..fe3e8e940 100755 --- a/tasks/docs/generate/test_xml_to_json.py +++ b/tasks/docs/generate/test_xml_to_json.py @@ -126,7 +126,7 @@ def test_load_domains(): # hardcoded on `jsonb_entry` (the sv element type) ONLY — hm -> eq_term, # oc -> ore_cllw; the `json` container and `query_jsonb` carry none. assert by_name["public.json"]["termFunctions"] == [] - assert by_name["public.query_jsonb"]["termFunctions"] == [] + assert by_name["eql_v3.query_jsonb"]["termFunctions"] == [] assert by_name["public.jsonb_entry"]["capabilities"] == ["json"] assert by_name["public.jsonb_entry"]["shape"] == "stevec" assert by_name["public.jsonb_entry"]["termFunctions"] == ["eql_v3.eq_term", "eql_v3.ore_cllw"] diff --git a/tasks/docs/generate/xml-to-json.py b/tasks/docs/generate/xml-to-json.py index 2d2f2ff3d..54d1af282 100755 --- a/tasks/docs/generate/xml-to-json.py +++ b/tasks/docs/generate/xml-to-json.py @@ -115,11 +115,14 @@ def load_domains(catalog_path: Path) -> list: "termFunctions": _term_functions(dom.get("terms", [])), }) - # SteVec (jsonb) family: hand-written SQL, catalog inventory only. Like the - # scalar domains these live in `public`; the extractor functions are eql_v3. + # SteVec (jsonb) family: hand-written SQL, catalog inventory only. The + # column-type domains (`json`, `jsonb_entry`) live in `public`; the + # containment needle (`query_jsonb`) is a query operand, never a column + # type, and lives in `eql_v3` (CIP-3442). Extractor functions are eql_v3. for entry in catalog.get("stevec", []): + schema = "eql_v3" if entry["full_name"].startswith("query_") else "public" domains.append({ - "name": f"public.{entry['full_name']}", + "name": f"{schema}.{entry['full_name']}", "type": "jsonb", "variant": "", "base": "jsonb", diff --git a/tasks/test/clean_install_v3.sh b/tasks/test/clean_install_v3.sh index 55d7637c4..c896c4eb3 100755 --- a/tasks/test/clean_install_v3.sh +++ b/tasks/test/clean_install_v3.sh @@ -77,9 +77,9 @@ INSERT INTO v3_json_smoke VALUES SELECT (e -> 'sel'::text)::jsonb ->> 'hm' FROM v3_json_smoke WHERE id = 1; SELECT e ->> 'sel'::text FROM v3_json_smoke WHERE id = 1; SELECT count(*) FROM v3_json_smoke -WHERE e @> '{"sv":[{"s":"sel","hm":"00"}]}'::public.query_jsonb; +WHERE e @> '{"sv":[{"s":"sel","hm":"00"}]}'::eql_v3.query_jsonb; SELECT count(*) FROM v3_json_smoke -WHERE '{"sv":[{"s":"sel","hm":"00"}]}'::public.query_jsonb <@ e; +WHERE '{"sv":[{"s":"sel","hm":"00"}]}'::eql_v3.query_jsonb <@ e; -- Documented GIN expression installs cleanly in a v3-only database. CREATE INDEX v3_json_smoke_gin diff --git a/tasks/test/splinter.sh b/tasks/test/splinter.sh index a9d51b167..e87e1cd1c 100755 --- a/tasks/test/splinter.sh +++ b/tasks/test/splinter.sh @@ -109,7 +109,7 @@ function_search_path_mutable eql_v3 has_ore_cllw function ORE-CLLW presence chec function_search_path_mutable eql_v3_internal ore_cllw function ORE-CLLW constructor for the eql_v3 SEM fork (now in eql_v3_internal): inlinable SQL (jsonb) constructor. Takes bare jsonb, not a jsonb-backed domain, so it is left unpinned via the explicit inline-critical OID clause in pin_search_path_v3.sql (mirrors eql_v3_internal.hmac_256/bloom_filter) rather than the structural skip. Distinct from the eql_v3.ore_cllw(jsonb_entry) extractor overload, which stays public. function_search_path_mutable eql_v3_internal has_ore_cllw function ORE-CLLW presence check for the eql_v3 SEM fork (now in eql_v3_internal): inlinable SQL (jsonb) counterpart to eql_v3_internal.ore_cllw. Same inline-critical OID rationale. Distinct from the eql_v3.has_ore_cllw(jsonb_entry) overload, which stays public. function_search_path_mutable eql_v3 selector function STE-vec entry selector extractor: typed (public.jsonb_entry) overload, inlinable so `eql_v3.selector(col -> 'sel')` folds into the calling query. Structural domain-arg skip. The (jsonb) overload is plpgsql with a pinned search_path and does not surface. -function_search_path_mutable eql_v3 to_ste_vec_query function Encrypted-JSONB query-document constructor (CAST WITH FUNCTION for public.query_jsonb): inlinable SQL over a public.json domain arg, structural domain-arg skip. Builds the ste_vec query value the @>/<@ wrappers compare against; must inline to fold into the calling query. +function_search_path_mutable eql_v3 to_ste_vec_query function Encrypted-JSONB query-document constructor (CAST WITH FUNCTION for eql_v3.query_jsonb): inlinable SQL over a public.json domain arg, structural domain-arg skip. Builds the ste_vec query value the @>/<@ wrappers compare against; must inline to fold into the calling query. function_search_path_mutable eql_v3 jsonb_array function ste_vec deterministic-field array extractor on the eql_v3 encrypted-JSONB surface: public inlinable SQL (raw jsonb arg) behind the documented functional GIN index expression eql_v3.jsonb_array(col). Takes bare jsonb, so it carries the documented `eql-inline-critical` COMMENT marker that pin_search_path_v3.sql honours rather than the structural skip. function_search_path_mutable eql_v3 jsonb_contains function Public GIN-inlining containment helper (function-form of @> over raw jsonb): unfolds to eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b). Carries the `eql-inline-critical` COMMENT marker. function_search_path_mutable eql_v3 jsonb_contained_by function Public GIN-inlining reverse-containment helper (function-form of <@ over raw jsonb): same as eql_v3.jsonb_contains. diff --git a/tests/sqlx/snapshots/eql_v3_public_surface.txt b/tests/sqlx/snapshots/eql_v3_public_surface.txt index 7c2f9c64a..6773adb2d 100644 --- a/tests/sqlx/snapshots/eql_v3_public_surface.txt +++ b/tests/sqlx/snapshots/eql_v3_public_surface.txt @@ -56,38 +56,75 @@ aggregate eql_v3.min(public.text_search) aggregate eql_v3.min(public.timestamp_ord) aggregate eql_v3.min(public.timestamp_ord_ope) aggregate eql_v3.min(public.timestamp_ord_ore) -cast public."json" -> public.query_jsonb +cast public."json" -> eql_v3.query_jsonb function eql_v3.->(e public."json", selector integer) function eql_v3.->(e public."json", selector text) function eql_v3.->>(e public."json", selector integer) function eql_v3.->>(e public."json", selector text) +function eql_v3.<@(a eql_v3.query_jsonb, b public."json") function eql_v3.<@(a public."json", b public."json") function eql_v3.<@(a public.jsonb_entry, b public."json") -function eql_v3.<@(a public.query_jsonb, b public."json") +function eql_v3.@>(a public."json", b eql_v3.query_jsonb) function eql_v3.@>(a public."json", b public."json") function eql_v3.@>(a public."json", b public.jsonb_entry) -function eql_v3.@>(a public."json", b public.query_jsonb) function eql_v3.ciphertext(val jsonb) +function eql_v3.contained_by(a eql_v3.query_text_match, b public.text_match) +function eql_v3.contained_by(a eql_v3.query_text_search, b public.text_search) function eql_v3.contained_by(a jsonb, b public.text_match) function eql_v3.contained_by(a jsonb, b public.text_search) -function eql_v3.contained_by(a public.query_text_match, b public.text_match) -function eql_v3.contained_by(a public.query_text_search, b public.text_search) +function eql_v3.contained_by(a public.text_match, b eql_v3.query_text_match) function eql_v3.contained_by(a public.text_match, b jsonb) -function eql_v3.contained_by(a public.text_match, b public.query_text_match) function eql_v3.contained_by(a public.text_match, b public.text_match) +function eql_v3.contained_by(a public.text_search, b eql_v3.query_text_search) function eql_v3.contained_by(a public.text_search, b jsonb) -function eql_v3.contained_by(a public.text_search, b public.query_text_search) function eql_v3.contained_by(a public.text_search, b public.text_search) +function eql_v3.contains(a eql_v3.query_text_match, b public.text_match) +function eql_v3.contains(a eql_v3.query_text_search, b public.text_search) function eql_v3.contains(a jsonb, b public.text_match) function eql_v3.contains(a jsonb, b public.text_search) -function eql_v3.contains(a public.query_text_match, b public.text_match) -function eql_v3.contains(a public.query_text_search, b public.text_search) +function eql_v3.contains(a public.text_match, b eql_v3.query_text_match) function eql_v3.contains(a public.text_match, b jsonb) -function eql_v3.contains(a public.text_match, b public.query_text_match) function eql_v3.contains(a public.text_match, b public.text_match) +function eql_v3.contains(a public.text_search, b eql_v3.query_text_search) function eql_v3.contains(a public.text_search, b jsonb) -function eql_v3.contains(a public.text_search, b public.query_text_search) function eql_v3.contains(a public.text_search, b public.text_search) +function eql_v3.eq(a eql_v3.query_bigint_eq, b public.bigint_eq) +function eql_v3.eq(a eql_v3.query_bigint_ord, b public.bigint_ord) +function eql_v3.eq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.eq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.eq(a eql_v3.query_date_eq, b public.date_eq) +function eql_v3.eq(a eql_v3.query_date_ord, b public.date_ord) +function eql_v3.eq(a eql_v3.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.eq(a eql_v3.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.eq(a eql_v3.query_double_eq, b public.double_eq) +function eql_v3.eq(a eql_v3.query_double_ord, b public.double_ord) +function eql_v3.eq(a eql_v3.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.eq(a eql_v3.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.eq(a eql_v3.query_integer_eq, b public.integer_eq) +function eql_v3.eq(a eql_v3.query_integer_ord, b public.integer_ord) +function eql_v3.eq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.eq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.eq(a eql_v3.query_numeric_eq, b public.numeric_eq) +function eql_v3.eq(a eql_v3.query_numeric_ord, b public.numeric_ord) +function eql_v3.eq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.eq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.eq(a eql_v3.query_real_eq, b public.real_eq) +function eql_v3.eq(a eql_v3.query_real_ord, b public.real_ord) +function eql_v3.eq(a eql_v3.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.eq(a eql_v3.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.eq(a eql_v3.query_smallint_eq, b public.smallint_eq) +function eql_v3.eq(a eql_v3.query_smallint_ord, b public.smallint_ord) +function eql_v3.eq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.eq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.eq(a eql_v3.query_text_eq, b public.text_eq) +function eql_v3.eq(a eql_v3.query_text_ord, b public.text_ord) +function eql_v3.eq(a eql_v3.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.eq(a eql_v3.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.eq(a eql_v3.query_text_search, b public.text_search) +function eql_v3.eq(a eql_v3.query_timestamp_eq, b public.timestamp_eq) +function eql_v3.eq(a eql_v3.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.eq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.eq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.eq(a jsonb, b public.bigint_eq) function eql_v3.eq(a jsonb, b public.bigint_ord) function eql_v3.eq(a jsonb, b public.bigint_ord_ope) @@ -125,173 +162,136 @@ function eql_v3.eq(a jsonb, b public.timestamp_eq) function eql_v3.eq(a jsonb, b public.timestamp_ord) function eql_v3.eq(a jsonb, b public.timestamp_ord_ope) function eql_v3.eq(a jsonb, b public.timestamp_ord_ore) +function eql_v3.eq(a public.bigint_eq, b eql_v3.query_bigint_eq) function eql_v3.eq(a public.bigint_eq, b jsonb) function eql_v3.eq(a public.bigint_eq, b public.bigint_eq) -function eql_v3.eq(a public.bigint_eq, b public.query_bigint_eq) +function eql_v3.eq(a public.bigint_ord, b eql_v3.query_bigint_ord) function eql_v3.eq(a public.bigint_ord, b jsonb) function eql_v3.eq(a public.bigint_ord, b public.bigint_ord) -function eql_v3.eq(a public.bigint_ord, b public.query_bigint_ord) +function eql_v3.eq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) function eql_v3.eq(a public.bigint_ord_ope, b jsonb) function eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.eq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +function eql_v3.eq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) function eql_v3.eq(a public.bigint_ord_ore, b jsonb) function eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.eq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +function eql_v3.eq(a public.date_eq, b eql_v3.query_date_eq) function eql_v3.eq(a public.date_eq, b jsonb) function eql_v3.eq(a public.date_eq, b public.date_eq) -function eql_v3.eq(a public.date_eq, b public.query_date_eq) +function eql_v3.eq(a public.date_ord, b eql_v3.query_date_ord) function eql_v3.eq(a public.date_ord, b jsonb) function eql_v3.eq(a public.date_ord, b public.date_ord) -function eql_v3.eq(a public.date_ord, b public.query_date_ord) +function eql_v3.eq(a public.date_ord_ope, b eql_v3.query_date_ord_ope) function eql_v3.eq(a public.date_ord_ope, b jsonb) function eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.eq(a public.date_ord_ope, b public.query_date_ord_ope) +function eql_v3.eq(a public.date_ord_ore, b eql_v3.query_date_ord_ore) function eql_v3.eq(a public.date_ord_ore, b jsonb) function eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.eq(a public.date_ord_ore, b public.query_date_ord_ore) +function eql_v3.eq(a public.double_eq, b eql_v3.query_double_eq) function eql_v3.eq(a public.double_eq, b jsonb) function eql_v3.eq(a public.double_eq, b public.double_eq) -function eql_v3.eq(a public.double_eq, b public.query_double_eq) +function eql_v3.eq(a public.double_ord, b eql_v3.query_double_ord) function eql_v3.eq(a public.double_ord, b jsonb) function eql_v3.eq(a public.double_ord, b public.double_ord) -function eql_v3.eq(a public.double_ord, b public.query_double_ord) +function eql_v3.eq(a public.double_ord_ope, b eql_v3.query_double_ord_ope) function eql_v3.eq(a public.double_ord_ope, b jsonb) function eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.eq(a public.double_ord_ope, b public.query_double_ord_ope) +function eql_v3.eq(a public.double_ord_ore, b eql_v3.query_double_ord_ore) function eql_v3.eq(a public.double_ord_ore, b jsonb) function eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.eq(a public.double_ord_ore, b public.query_double_ord_ore) +function eql_v3.eq(a public.integer_eq, b eql_v3.query_integer_eq) function eql_v3.eq(a public.integer_eq, b jsonb) function eql_v3.eq(a public.integer_eq, b public.integer_eq) -function eql_v3.eq(a public.integer_eq, b public.query_integer_eq) +function eql_v3.eq(a public.integer_ord, b eql_v3.query_integer_ord) function eql_v3.eq(a public.integer_ord, b jsonb) function eql_v3.eq(a public.integer_ord, b public.integer_ord) -function eql_v3.eq(a public.integer_ord, b public.query_integer_ord) +function eql_v3.eq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) function eql_v3.eq(a public.integer_ord_ope, b jsonb) function eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.eq(a public.integer_ord_ope, b public.query_integer_ord_ope) +function eql_v3.eq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) function eql_v3.eq(a public.integer_ord_ore, b jsonb) function eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.eq(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.eq(a public.jsonb_entry, b public.jsonb_entry) +function eql_v3.eq(a public.numeric_eq, b eql_v3.query_numeric_eq) function eql_v3.eq(a public.numeric_eq, b jsonb) function eql_v3.eq(a public.numeric_eq, b public.numeric_eq) -function eql_v3.eq(a public.numeric_eq, b public.query_numeric_eq) +function eql_v3.eq(a public.numeric_ord, b eql_v3.query_numeric_ord) function eql_v3.eq(a public.numeric_ord, b jsonb) function eql_v3.eq(a public.numeric_ord, b public.numeric_ord) -function eql_v3.eq(a public.numeric_ord, b public.query_numeric_ord) +function eql_v3.eq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) function eql_v3.eq(a public.numeric_ord_ope, b jsonb) function eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.eq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +function eql_v3.eq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) function eql_v3.eq(a public.numeric_ord_ore, b jsonb) function eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.eq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) -function eql_v3.eq(a public.query_bigint_eq, b public.bigint_eq) -function eql_v3.eq(a public.query_bigint_ord, b public.bigint_ord) -function eql_v3.eq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.eq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.eq(a public.query_date_eq, b public.date_eq) -function eql_v3.eq(a public.query_date_ord, b public.date_ord) -function eql_v3.eq(a public.query_date_ord_ope, b public.date_ord_ope) -function eql_v3.eq(a public.query_date_ord_ore, b public.date_ord_ore) -function eql_v3.eq(a public.query_double_eq, b public.double_eq) -function eql_v3.eq(a public.query_double_ord, b public.double_ord) -function eql_v3.eq(a public.query_double_ord_ope, b public.double_ord_ope) -function eql_v3.eq(a public.query_double_ord_ore, b public.double_ord_ore) -function eql_v3.eq(a public.query_integer_eq, b public.integer_eq) -function eql_v3.eq(a public.query_integer_ord, b public.integer_ord) -function eql_v3.eq(a public.query_integer_ord_ope, b public.integer_ord_ope) -function eql_v3.eq(a public.query_integer_ord_ore, b public.integer_ord_ore) -function eql_v3.eq(a public.query_numeric_eq, b public.numeric_eq) -function eql_v3.eq(a public.query_numeric_ord, b public.numeric_ord) -function eql_v3.eq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.eq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.eq(a public.query_real_eq, b public.real_eq) -function eql_v3.eq(a public.query_real_ord, b public.real_ord) -function eql_v3.eq(a public.query_real_ord_ope, b public.real_ord_ope) -function eql_v3.eq(a public.query_real_ord_ore, b public.real_ord_ore) -function eql_v3.eq(a public.query_smallint_eq, b public.smallint_eq) -function eql_v3.eq(a public.query_smallint_ord, b public.smallint_ord) -function eql_v3.eq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.eq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.eq(a public.query_text_eq, b public.text_eq) -function eql_v3.eq(a public.query_text_ord, b public.text_ord) -function eql_v3.eq(a public.query_text_ord_ope, b public.text_ord_ope) -function eql_v3.eq(a public.query_text_ord_ore, b public.text_ord_ore) -function eql_v3.eq(a public.query_text_search, b public.text_search) -function eql_v3.eq(a public.query_timestamp_eq, b public.timestamp_eq) -function eql_v3.eq(a public.query_timestamp_ord, b public.timestamp_ord) -function eql_v3.eq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.eq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.eq(a public.real_eq, b eql_v3.query_real_eq) function eql_v3.eq(a public.real_eq, b jsonb) -function eql_v3.eq(a public.real_eq, b public.query_real_eq) function eql_v3.eq(a public.real_eq, b public.real_eq) +function eql_v3.eq(a public.real_ord, b eql_v3.query_real_ord) function eql_v3.eq(a public.real_ord, b jsonb) -function eql_v3.eq(a public.real_ord, b public.query_real_ord) function eql_v3.eq(a public.real_ord, b public.real_ord) +function eql_v3.eq(a public.real_ord_ope, b eql_v3.query_real_ord_ope) function eql_v3.eq(a public.real_ord_ope, b jsonb) -function eql_v3.eq(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.eq(a public.real_ord_ore, b eql_v3.query_real_ord_ore) function eql_v3.eq(a public.real_ord_ore, b jsonb) -function eql_v3.eq(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.eq(a public.smallint_eq, b eql_v3.query_smallint_eq) function eql_v3.eq(a public.smallint_eq, b jsonb) -function eql_v3.eq(a public.smallint_eq, b public.query_smallint_eq) function eql_v3.eq(a public.smallint_eq, b public.smallint_eq) +function eql_v3.eq(a public.smallint_ord, b eql_v3.query_smallint_ord) function eql_v3.eq(a public.smallint_ord, b jsonb) -function eql_v3.eq(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.eq(a public.smallint_ord, b public.smallint_ord) +function eql_v3.eq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) function eql_v3.eq(a public.smallint_ord_ope, b jsonb) -function eql_v3.eq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.eq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) function eql_v3.eq(a public.smallint_ord_ore, b jsonb) -function eql_v3.eq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.eq(a public.text_eq, b eql_v3.query_text_eq) function eql_v3.eq(a public.text_eq, b jsonb) -function eql_v3.eq(a public.text_eq, b public.query_text_eq) function eql_v3.eq(a public.text_eq, b public.text_eq) +function eql_v3.eq(a public.text_ord, b eql_v3.query_text_ord) function eql_v3.eq(a public.text_ord, b jsonb) -function eql_v3.eq(a public.text_ord, b public.query_text_ord) function eql_v3.eq(a public.text_ord, b public.text_ord) +function eql_v3.eq(a public.text_ord_ope, b eql_v3.query_text_ord_ope) function eql_v3.eq(a public.text_ord_ope, b jsonb) -function eql_v3.eq(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.eq(a public.text_ord_ore, b eql_v3.query_text_ord_ore) function eql_v3.eq(a public.text_ord_ore, b jsonb) -function eql_v3.eq(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.eq(a public.text_search, b eql_v3.query_text_search) function eql_v3.eq(a public.text_search, b jsonb) -function eql_v3.eq(a public.text_search, b public.query_text_search) function eql_v3.eq(a public.text_search, b public.text_search) +function eql_v3.eq(a public.timestamp_eq, b eql_v3.query_timestamp_eq) function eql_v3.eq(a public.timestamp_eq, b jsonb) -function eql_v3.eq(a public.timestamp_eq, b public.query_timestamp_eq) function eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq) +function eql_v3.eq(a public.timestamp_ord, b eql_v3.query_timestamp_ord) function eql_v3.eq(a public.timestamp_ord, b jsonb) -function eql_v3.eq(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.eq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) function eql_v3.eq(a public.timestamp_ord_ope, b jsonb) -function eql_v3.eq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.eq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) function eql_v3.eq(a public.timestamp_ord_ore, b jsonb) -function eql_v3.eq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.eq_term(a eql_v3.query_bigint_eq) +function eql_v3.eq_term(a eql_v3.query_date_eq) +function eql_v3.eq_term(a eql_v3.query_double_eq) +function eql_v3.eq_term(a eql_v3.query_integer_eq) +function eql_v3.eq_term(a eql_v3.query_numeric_eq) +function eql_v3.eq_term(a eql_v3.query_real_eq) +function eql_v3.eq_term(a eql_v3.query_smallint_eq) +function eql_v3.eq_term(a eql_v3.query_text_eq) +function eql_v3.eq_term(a eql_v3.query_text_ord) +function eql_v3.eq_term(a eql_v3.query_text_ord_ope) +function eql_v3.eq_term(a eql_v3.query_text_ord_ore) +function eql_v3.eq_term(a eql_v3.query_text_search) +function eql_v3.eq_term(a eql_v3.query_timestamp_eq) function eql_v3.eq_term(a public.bigint_eq) function eql_v3.eq_term(a public.date_eq) function eql_v3.eq_term(a public.double_eq) function eql_v3.eq_term(a public.integer_eq) function eql_v3.eq_term(a public.numeric_eq) -function eql_v3.eq_term(a public.query_bigint_eq) -function eql_v3.eq_term(a public.query_date_eq) -function eql_v3.eq_term(a public.query_double_eq) -function eql_v3.eq_term(a public.query_integer_eq) -function eql_v3.eq_term(a public.query_numeric_eq) -function eql_v3.eq_term(a public.query_real_eq) -function eql_v3.eq_term(a public.query_smallint_eq) -function eql_v3.eq_term(a public.query_text_eq) -function eql_v3.eq_term(a public.query_text_ord) -function eql_v3.eq_term(a public.query_text_ord_ope) -function eql_v3.eq_term(a public.query_text_ord_ore) -function eql_v3.eq_term(a public.query_text_search) -function eql_v3.eq_term(a public.query_timestamp_eq) function eql_v3.eq_term(a public.real_eq) function eql_v3.eq_term(a public.smallint_eq) function eql_v3.eq_term(a public.text_eq) @@ -301,6 +301,34 @@ function eql_v3.eq_term(a public.text_ord_ore) function eql_v3.eq_term(a public.text_search) function eql_v3.eq_term(a public.timestamp_eq) function eql_v3.eq_term(entry public.jsonb_entry) +function eql_v3.gt(a eql_v3.query_bigint_ord, b public.bigint_ord) +function eql_v3.gt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.gt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.gt(a eql_v3.query_date_ord, b public.date_ord) +function eql_v3.gt(a eql_v3.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.gt(a eql_v3.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.gt(a eql_v3.query_double_ord, b public.double_ord) +function eql_v3.gt(a eql_v3.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.gt(a eql_v3.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.gt(a eql_v3.query_integer_ord, b public.integer_ord) +function eql_v3.gt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.gt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.gt(a eql_v3.query_numeric_ord, b public.numeric_ord) +function eql_v3.gt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.gt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.gt(a eql_v3.query_real_ord, b public.real_ord) +function eql_v3.gt(a eql_v3.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.gt(a eql_v3.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.gt(a eql_v3.query_smallint_ord, b public.smallint_ord) +function eql_v3.gt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gt(a eql_v3.query_text_ord, b public.text_ord) +function eql_v3.gt(a eql_v3.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.gt(a eql_v3.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.gt(a eql_v3.query_text_search, b public.text_search) +function eql_v3.gt(a eql_v3.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.gt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.gt(a jsonb, b public.bigint_ord) function eql_v3.gt(a jsonb, b public.bigint_ord_ope) function eql_v3.gt(a jsonb, b public.bigint_ord_ore) @@ -329,119 +357,119 @@ function eql_v3.gt(a jsonb, b public.text_search) function eql_v3.gt(a jsonb, b public.timestamp_ord) function eql_v3.gt(a jsonb, b public.timestamp_ord_ope) function eql_v3.gt(a jsonb, b public.timestamp_ord_ore) +function eql_v3.gt(a public.bigint_ord, b eql_v3.query_bigint_ord) function eql_v3.gt(a public.bigint_ord, b jsonb) function eql_v3.gt(a public.bigint_ord, b public.bigint_ord) -function eql_v3.gt(a public.bigint_ord, b public.query_bigint_ord) +function eql_v3.gt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) function eql_v3.gt(a public.bigint_ord_ope, b jsonb) function eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.gt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +function eql_v3.gt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) function eql_v3.gt(a public.bigint_ord_ore, b jsonb) function eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.gt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +function eql_v3.gt(a public.date_ord, b eql_v3.query_date_ord) function eql_v3.gt(a public.date_ord, b jsonb) function eql_v3.gt(a public.date_ord, b public.date_ord) -function eql_v3.gt(a public.date_ord, b public.query_date_ord) +function eql_v3.gt(a public.date_ord_ope, b eql_v3.query_date_ord_ope) function eql_v3.gt(a public.date_ord_ope, b jsonb) function eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.gt(a public.date_ord_ope, b public.query_date_ord_ope) +function eql_v3.gt(a public.date_ord_ore, b eql_v3.query_date_ord_ore) function eql_v3.gt(a public.date_ord_ore, b jsonb) function eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.gt(a public.date_ord_ore, b public.query_date_ord_ore) +function eql_v3.gt(a public.double_ord, b eql_v3.query_double_ord) function eql_v3.gt(a public.double_ord, b jsonb) function eql_v3.gt(a public.double_ord, b public.double_ord) -function eql_v3.gt(a public.double_ord, b public.query_double_ord) +function eql_v3.gt(a public.double_ord_ope, b eql_v3.query_double_ord_ope) function eql_v3.gt(a public.double_ord_ope, b jsonb) function eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.gt(a public.double_ord_ope, b public.query_double_ord_ope) +function eql_v3.gt(a public.double_ord_ore, b eql_v3.query_double_ord_ore) function eql_v3.gt(a public.double_ord_ore, b jsonb) function eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.gt(a public.double_ord_ore, b public.query_double_ord_ore) +function eql_v3.gt(a public.integer_ord, b eql_v3.query_integer_ord) function eql_v3.gt(a public.integer_ord, b jsonb) function eql_v3.gt(a public.integer_ord, b public.integer_ord) -function eql_v3.gt(a public.integer_ord, b public.query_integer_ord) +function eql_v3.gt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) function eql_v3.gt(a public.integer_ord_ope, b jsonb) function eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.gt(a public.integer_ord_ope, b public.query_integer_ord_ope) +function eql_v3.gt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) function eql_v3.gt(a public.integer_ord_ore, b jsonb) function eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.gt(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.gt(a public.jsonb_entry, b public.jsonb_entry) +function eql_v3.gt(a public.numeric_ord, b eql_v3.query_numeric_ord) function eql_v3.gt(a public.numeric_ord, b jsonb) function eql_v3.gt(a public.numeric_ord, b public.numeric_ord) -function eql_v3.gt(a public.numeric_ord, b public.query_numeric_ord) +function eql_v3.gt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) function eql_v3.gt(a public.numeric_ord_ope, b jsonb) function eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.gt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +function eql_v3.gt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) function eql_v3.gt(a public.numeric_ord_ore, b jsonb) function eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.gt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) -function eql_v3.gt(a public.query_bigint_ord, b public.bigint_ord) -function eql_v3.gt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.gt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.gt(a public.query_date_ord, b public.date_ord) -function eql_v3.gt(a public.query_date_ord_ope, b public.date_ord_ope) -function eql_v3.gt(a public.query_date_ord_ore, b public.date_ord_ore) -function eql_v3.gt(a public.query_double_ord, b public.double_ord) -function eql_v3.gt(a public.query_double_ord_ope, b public.double_ord_ope) -function eql_v3.gt(a public.query_double_ord_ore, b public.double_ord_ore) -function eql_v3.gt(a public.query_integer_ord, b public.integer_ord) -function eql_v3.gt(a public.query_integer_ord_ope, b public.integer_ord_ope) -function eql_v3.gt(a public.query_integer_ord_ore, b public.integer_ord_ore) -function eql_v3.gt(a public.query_numeric_ord, b public.numeric_ord) -function eql_v3.gt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.gt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.gt(a public.query_real_ord, b public.real_ord) -function eql_v3.gt(a public.query_real_ord_ope, b public.real_ord_ope) -function eql_v3.gt(a public.query_real_ord_ore, b public.real_ord_ore) -function eql_v3.gt(a public.query_smallint_ord, b public.smallint_ord) -function eql_v3.gt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.gt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.gt(a public.query_text_ord, b public.text_ord) -function eql_v3.gt(a public.query_text_ord_ope, b public.text_ord_ope) -function eql_v3.gt(a public.query_text_ord_ore, b public.text_ord_ore) -function eql_v3.gt(a public.query_text_search, b public.text_search) -function eql_v3.gt(a public.query_timestamp_ord, b public.timestamp_ord) -function eql_v3.gt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.gt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.gt(a public.real_ord, b eql_v3.query_real_ord) function eql_v3.gt(a public.real_ord, b jsonb) -function eql_v3.gt(a public.real_ord, b public.query_real_ord) function eql_v3.gt(a public.real_ord, b public.real_ord) +function eql_v3.gt(a public.real_ord_ope, b eql_v3.query_real_ord_ope) function eql_v3.gt(a public.real_ord_ope, b jsonb) -function eql_v3.gt(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.gt(a public.real_ord_ore, b eql_v3.query_real_ord_ore) function eql_v3.gt(a public.real_ord_ore, b jsonb) -function eql_v3.gt(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.gt(a public.smallint_ord, b eql_v3.query_smallint_ord) function eql_v3.gt(a public.smallint_ord, b jsonb) -function eql_v3.gt(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.gt(a public.smallint_ord, b public.smallint_ord) +function eql_v3.gt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) function eql_v3.gt(a public.smallint_ord_ope, b jsonb) -function eql_v3.gt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) function eql_v3.gt(a public.smallint_ord_ore, b jsonb) -function eql_v3.gt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gt(a public.text_ord, b eql_v3.query_text_ord) function eql_v3.gt(a public.text_ord, b jsonb) -function eql_v3.gt(a public.text_ord, b public.query_text_ord) function eql_v3.gt(a public.text_ord, b public.text_ord) +function eql_v3.gt(a public.text_ord_ope, b eql_v3.query_text_ord_ope) function eql_v3.gt(a public.text_ord_ope, b jsonb) -function eql_v3.gt(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.gt(a public.text_ord_ore, b eql_v3.query_text_ord_ore) function eql_v3.gt(a public.text_ord_ore, b jsonb) -function eql_v3.gt(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.gt(a public.text_search, b eql_v3.query_text_search) function eql_v3.gt(a public.text_search, b jsonb) -function eql_v3.gt(a public.text_search, b public.query_text_search) function eql_v3.gt(a public.text_search, b public.text_search) +function eql_v3.gt(a public.timestamp_ord, b eql_v3.query_timestamp_ord) function eql_v3.gt(a public.timestamp_ord, b jsonb) -function eql_v3.gt(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.gt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) function eql_v3.gt(a public.timestamp_ord_ope, b jsonb) -function eql_v3.gt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) function eql_v3.gt(a public.timestamp_ord_ore, b jsonb) -function eql_v3.gt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.gte(a eql_v3.query_bigint_ord, b public.bigint_ord) +function eql_v3.gte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.gte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.gte(a eql_v3.query_date_ord, b public.date_ord) +function eql_v3.gte(a eql_v3.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.gte(a eql_v3.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.gte(a eql_v3.query_double_ord, b public.double_ord) +function eql_v3.gte(a eql_v3.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.gte(a eql_v3.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.gte(a eql_v3.query_integer_ord, b public.integer_ord) +function eql_v3.gte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.gte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.gte(a eql_v3.query_numeric_ord, b public.numeric_ord) +function eql_v3.gte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.gte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.gte(a eql_v3.query_real_ord, b public.real_ord) +function eql_v3.gte(a eql_v3.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.gte(a eql_v3.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.gte(a eql_v3.query_smallint_ord, b public.smallint_ord) +function eql_v3.gte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gte(a eql_v3.query_text_ord, b public.text_ord) +function eql_v3.gte(a eql_v3.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.gte(a eql_v3.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.gte(a eql_v3.query_text_search, b public.text_search) +function eql_v3.gte(a eql_v3.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.gte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.gte(a jsonb, b public.bigint_ord) function eql_v3.gte(a jsonb, b public.bigint_ord_ope) function eql_v3.gte(a jsonb, b public.bigint_ord_ore) @@ -470,118 +498,90 @@ function eql_v3.gte(a jsonb, b public.text_search) function eql_v3.gte(a jsonb, b public.timestamp_ord) function eql_v3.gte(a jsonb, b public.timestamp_ord_ope) function eql_v3.gte(a jsonb, b public.timestamp_ord_ore) +function eql_v3.gte(a public.bigint_ord, b eql_v3.query_bigint_ord) function eql_v3.gte(a public.bigint_ord, b jsonb) function eql_v3.gte(a public.bigint_ord, b public.bigint_ord) -function eql_v3.gte(a public.bigint_ord, b public.query_bigint_ord) +function eql_v3.gte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) function eql_v3.gte(a public.bigint_ord_ope, b jsonb) function eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.gte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +function eql_v3.gte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) function eql_v3.gte(a public.bigint_ord_ore, b jsonb) function eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.gte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +function eql_v3.gte(a public.date_ord, b eql_v3.query_date_ord) function eql_v3.gte(a public.date_ord, b jsonb) function eql_v3.gte(a public.date_ord, b public.date_ord) -function eql_v3.gte(a public.date_ord, b public.query_date_ord) +function eql_v3.gte(a public.date_ord_ope, b eql_v3.query_date_ord_ope) function eql_v3.gte(a public.date_ord_ope, b jsonb) function eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.gte(a public.date_ord_ope, b public.query_date_ord_ope) +function eql_v3.gte(a public.date_ord_ore, b eql_v3.query_date_ord_ore) function eql_v3.gte(a public.date_ord_ore, b jsonb) function eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.gte(a public.date_ord_ore, b public.query_date_ord_ore) +function eql_v3.gte(a public.double_ord, b eql_v3.query_double_ord) function eql_v3.gte(a public.double_ord, b jsonb) function eql_v3.gte(a public.double_ord, b public.double_ord) -function eql_v3.gte(a public.double_ord, b public.query_double_ord) +function eql_v3.gte(a public.double_ord_ope, b eql_v3.query_double_ord_ope) function eql_v3.gte(a public.double_ord_ope, b jsonb) function eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.gte(a public.double_ord_ope, b public.query_double_ord_ope) +function eql_v3.gte(a public.double_ord_ore, b eql_v3.query_double_ord_ore) function eql_v3.gte(a public.double_ord_ore, b jsonb) function eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.gte(a public.double_ord_ore, b public.query_double_ord_ore) +function eql_v3.gte(a public.integer_ord, b eql_v3.query_integer_ord) function eql_v3.gte(a public.integer_ord, b jsonb) function eql_v3.gte(a public.integer_ord, b public.integer_ord) -function eql_v3.gte(a public.integer_ord, b public.query_integer_ord) +function eql_v3.gte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) function eql_v3.gte(a public.integer_ord_ope, b jsonb) function eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.gte(a public.integer_ord_ope, b public.query_integer_ord_ope) +function eql_v3.gte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) function eql_v3.gte(a public.integer_ord_ore, b jsonb) function eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.gte(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.gte(a public.jsonb_entry, b public.jsonb_entry) +function eql_v3.gte(a public.numeric_ord, b eql_v3.query_numeric_ord) function eql_v3.gte(a public.numeric_ord, b jsonb) function eql_v3.gte(a public.numeric_ord, b public.numeric_ord) -function eql_v3.gte(a public.numeric_ord, b public.query_numeric_ord) +function eql_v3.gte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) function eql_v3.gte(a public.numeric_ord_ope, b jsonb) function eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.gte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +function eql_v3.gte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) function eql_v3.gte(a public.numeric_ord_ore, b jsonb) function eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.gte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) -function eql_v3.gte(a public.query_bigint_ord, b public.bigint_ord) -function eql_v3.gte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.gte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.gte(a public.query_date_ord, b public.date_ord) -function eql_v3.gte(a public.query_date_ord_ope, b public.date_ord_ope) -function eql_v3.gte(a public.query_date_ord_ore, b public.date_ord_ore) -function eql_v3.gte(a public.query_double_ord, b public.double_ord) -function eql_v3.gte(a public.query_double_ord_ope, b public.double_ord_ope) -function eql_v3.gte(a public.query_double_ord_ore, b public.double_ord_ore) -function eql_v3.gte(a public.query_integer_ord, b public.integer_ord) -function eql_v3.gte(a public.query_integer_ord_ope, b public.integer_ord_ope) -function eql_v3.gte(a public.query_integer_ord_ore, b public.integer_ord_ore) -function eql_v3.gte(a public.query_numeric_ord, b public.numeric_ord) -function eql_v3.gte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.gte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.gte(a public.query_real_ord, b public.real_ord) -function eql_v3.gte(a public.query_real_ord_ope, b public.real_ord_ope) -function eql_v3.gte(a public.query_real_ord_ore, b public.real_ord_ore) -function eql_v3.gte(a public.query_smallint_ord, b public.smallint_ord) -function eql_v3.gte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.gte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.gte(a public.query_text_ord, b public.text_ord) -function eql_v3.gte(a public.query_text_ord_ope, b public.text_ord_ope) -function eql_v3.gte(a public.query_text_ord_ore, b public.text_ord_ore) -function eql_v3.gte(a public.query_text_search, b public.text_search) -function eql_v3.gte(a public.query_timestamp_ord, b public.timestamp_ord) -function eql_v3.gte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.gte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.gte(a public.real_ord, b eql_v3.query_real_ord) function eql_v3.gte(a public.real_ord, b jsonb) -function eql_v3.gte(a public.real_ord, b public.query_real_ord) function eql_v3.gte(a public.real_ord, b public.real_ord) +function eql_v3.gte(a public.real_ord_ope, b eql_v3.query_real_ord_ope) function eql_v3.gte(a public.real_ord_ope, b jsonb) -function eql_v3.gte(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.gte(a public.real_ord_ore, b eql_v3.query_real_ord_ore) function eql_v3.gte(a public.real_ord_ore, b jsonb) -function eql_v3.gte(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.gte(a public.smallint_ord, b eql_v3.query_smallint_ord) function eql_v3.gte(a public.smallint_ord, b jsonb) -function eql_v3.gte(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.gte(a public.smallint_ord, b public.smallint_ord) +function eql_v3.gte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) function eql_v3.gte(a public.smallint_ord_ope, b jsonb) -function eql_v3.gte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.gte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) function eql_v3.gte(a public.smallint_ord_ore, b jsonb) -function eql_v3.gte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.gte(a public.text_ord, b eql_v3.query_text_ord) function eql_v3.gte(a public.text_ord, b jsonb) -function eql_v3.gte(a public.text_ord, b public.query_text_ord) function eql_v3.gte(a public.text_ord, b public.text_ord) +function eql_v3.gte(a public.text_ord_ope, b eql_v3.query_text_ord_ope) function eql_v3.gte(a public.text_ord_ope, b jsonb) -function eql_v3.gte(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.gte(a public.text_ord_ore, b eql_v3.query_text_ord_ore) function eql_v3.gte(a public.text_ord_ore, b jsonb) -function eql_v3.gte(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.gte(a public.text_search, b eql_v3.query_text_search) function eql_v3.gte(a public.text_search, b jsonb) -function eql_v3.gte(a public.text_search, b public.query_text_search) function eql_v3.gte(a public.text_search, b public.text_search) +function eql_v3.gte(a public.timestamp_ord, b eql_v3.query_timestamp_ord) function eql_v3.gte(a public.timestamp_ord, b jsonb) -function eql_v3.gte(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.gte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) function eql_v3.gte(a public.timestamp_ord_ope, b jsonb) -function eql_v3.gte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.gte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) function eql_v3.gte(a public.timestamp_ord_ore, b jsonb) -function eql_v3.gte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.has_ore_cllw(entry public.jsonb_entry) function eql_v3.jsonb_array(val jsonb) @@ -594,6 +594,34 @@ function eql_v3.jsonb_path_exists(val jsonb, selector text) function eql_v3.jsonb_path_query(val jsonb, selector text) function eql_v3.jsonb_path_query_first(val jsonb, selector text) function eql_v3.lints() +function eql_v3.lt(a eql_v3.query_bigint_ord, b public.bigint_ord) +function eql_v3.lt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.lt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.lt(a eql_v3.query_date_ord, b public.date_ord) +function eql_v3.lt(a eql_v3.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.lt(a eql_v3.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.lt(a eql_v3.query_double_ord, b public.double_ord) +function eql_v3.lt(a eql_v3.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.lt(a eql_v3.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.lt(a eql_v3.query_integer_ord, b public.integer_ord) +function eql_v3.lt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.lt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.lt(a eql_v3.query_numeric_ord, b public.numeric_ord) +function eql_v3.lt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.lt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.lt(a eql_v3.query_real_ord, b public.real_ord) +function eql_v3.lt(a eql_v3.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.lt(a eql_v3.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.lt(a eql_v3.query_smallint_ord, b public.smallint_ord) +function eql_v3.lt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lt(a eql_v3.query_text_ord, b public.text_ord) +function eql_v3.lt(a eql_v3.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.lt(a eql_v3.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.lt(a eql_v3.query_text_search, b public.text_search) +function eql_v3.lt(a eql_v3.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.lt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.lt(a jsonb, b public.bigint_ord) function eql_v3.lt(a jsonb, b public.bigint_ord_ope) function eql_v3.lt(a jsonb, b public.bigint_ord_ore) @@ -622,119 +650,119 @@ function eql_v3.lt(a jsonb, b public.text_search) function eql_v3.lt(a jsonb, b public.timestamp_ord) function eql_v3.lt(a jsonb, b public.timestamp_ord_ope) function eql_v3.lt(a jsonb, b public.timestamp_ord_ore) +function eql_v3.lt(a public.bigint_ord, b eql_v3.query_bigint_ord) function eql_v3.lt(a public.bigint_ord, b jsonb) function eql_v3.lt(a public.bigint_ord, b public.bigint_ord) -function eql_v3.lt(a public.bigint_ord, b public.query_bigint_ord) +function eql_v3.lt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) function eql_v3.lt(a public.bigint_ord_ope, b jsonb) function eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.lt(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +function eql_v3.lt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) function eql_v3.lt(a public.bigint_ord_ore, b jsonb) function eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.lt(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +function eql_v3.lt(a public.date_ord, b eql_v3.query_date_ord) function eql_v3.lt(a public.date_ord, b jsonb) function eql_v3.lt(a public.date_ord, b public.date_ord) -function eql_v3.lt(a public.date_ord, b public.query_date_ord) +function eql_v3.lt(a public.date_ord_ope, b eql_v3.query_date_ord_ope) function eql_v3.lt(a public.date_ord_ope, b jsonb) function eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.lt(a public.date_ord_ope, b public.query_date_ord_ope) +function eql_v3.lt(a public.date_ord_ore, b eql_v3.query_date_ord_ore) function eql_v3.lt(a public.date_ord_ore, b jsonb) function eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.lt(a public.date_ord_ore, b public.query_date_ord_ore) +function eql_v3.lt(a public.double_ord, b eql_v3.query_double_ord) function eql_v3.lt(a public.double_ord, b jsonb) function eql_v3.lt(a public.double_ord, b public.double_ord) -function eql_v3.lt(a public.double_ord, b public.query_double_ord) +function eql_v3.lt(a public.double_ord_ope, b eql_v3.query_double_ord_ope) function eql_v3.lt(a public.double_ord_ope, b jsonb) function eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.lt(a public.double_ord_ope, b public.query_double_ord_ope) +function eql_v3.lt(a public.double_ord_ore, b eql_v3.query_double_ord_ore) function eql_v3.lt(a public.double_ord_ore, b jsonb) function eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.lt(a public.double_ord_ore, b public.query_double_ord_ore) +function eql_v3.lt(a public.integer_ord, b eql_v3.query_integer_ord) function eql_v3.lt(a public.integer_ord, b jsonb) function eql_v3.lt(a public.integer_ord, b public.integer_ord) -function eql_v3.lt(a public.integer_ord, b public.query_integer_ord) +function eql_v3.lt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) function eql_v3.lt(a public.integer_ord_ope, b jsonb) function eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.lt(a public.integer_ord_ope, b public.query_integer_ord_ope) +function eql_v3.lt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) function eql_v3.lt(a public.integer_ord_ore, b jsonb) function eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.lt(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.lt(a public.jsonb_entry, b public.jsonb_entry) +function eql_v3.lt(a public.numeric_ord, b eql_v3.query_numeric_ord) function eql_v3.lt(a public.numeric_ord, b jsonb) function eql_v3.lt(a public.numeric_ord, b public.numeric_ord) -function eql_v3.lt(a public.numeric_ord, b public.query_numeric_ord) +function eql_v3.lt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) function eql_v3.lt(a public.numeric_ord_ope, b jsonb) function eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.lt(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +function eql_v3.lt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) function eql_v3.lt(a public.numeric_ord_ore, b jsonb) function eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.lt(a public.numeric_ord_ore, b public.query_numeric_ord_ore) -function eql_v3.lt(a public.query_bigint_ord, b public.bigint_ord) -function eql_v3.lt(a public.query_bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.lt(a public.query_bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.lt(a public.query_date_ord, b public.date_ord) -function eql_v3.lt(a public.query_date_ord_ope, b public.date_ord_ope) -function eql_v3.lt(a public.query_date_ord_ore, b public.date_ord_ore) -function eql_v3.lt(a public.query_double_ord, b public.double_ord) -function eql_v3.lt(a public.query_double_ord_ope, b public.double_ord_ope) -function eql_v3.lt(a public.query_double_ord_ore, b public.double_ord_ore) -function eql_v3.lt(a public.query_integer_ord, b public.integer_ord) -function eql_v3.lt(a public.query_integer_ord_ope, b public.integer_ord_ope) -function eql_v3.lt(a public.query_integer_ord_ore, b public.integer_ord_ore) -function eql_v3.lt(a public.query_numeric_ord, b public.numeric_ord) -function eql_v3.lt(a public.query_numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.lt(a public.query_numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.lt(a public.query_real_ord, b public.real_ord) -function eql_v3.lt(a public.query_real_ord_ope, b public.real_ord_ope) -function eql_v3.lt(a public.query_real_ord_ore, b public.real_ord_ore) -function eql_v3.lt(a public.query_smallint_ord, b public.smallint_ord) -function eql_v3.lt(a public.query_smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.lt(a public.query_smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.lt(a public.query_text_ord, b public.text_ord) -function eql_v3.lt(a public.query_text_ord_ope, b public.text_ord_ope) -function eql_v3.lt(a public.query_text_ord_ore, b public.text_ord_ore) -function eql_v3.lt(a public.query_text_search, b public.text_search) -function eql_v3.lt(a public.query_timestamp_ord, b public.timestamp_ord) -function eql_v3.lt(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.lt(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.lt(a public.real_ord, b eql_v3.query_real_ord) function eql_v3.lt(a public.real_ord, b jsonb) -function eql_v3.lt(a public.real_ord, b public.query_real_ord) function eql_v3.lt(a public.real_ord, b public.real_ord) +function eql_v3.lt(a public.real_ord_ope, b eql_v3.query_real_ord_ope) function eql_v3.lt(a public.real_ord_ope, b jsonb) -function eql_v3.lt(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.lt(a public.real_ord_ore, b eql_v3.query_real_ord_ore) function eql_v3.lt(a public.real_ord_ore, b jsonb) -function eql_v3.lt(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.lt(a public.smallint_ord, b eql_v3.query_smallint_ord) function eql_v3.lt(a public.smallint_ord, b jsonb) -function eql_v3.lt(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.lt(a public.smallint_ord, b public.smallint_ord) +function eql_v3.lt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) function eql_v3.lt(a public.smallint_ord_ope, b jsonb) -function eql_v3.lt(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) function eql_v3.lt(a public.smallint_ord_ore, b jsonb) -function eql_v3.lt(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lt(a public.text_ord, b eql_v3.query_text_ord) function eql_v3.lt(a public.text_ord, b jsonb) -function eql_v3.lt(a public.text_ord, b public.query_text_ord) function eql_v3.lt(a public.text_ord, b public.text_ord) +function eql_v3.lt(a public.text_ord_ope, b eql_v3.query_text_ord_ope) function eql_v3.lt(a public.text_ord_ope, b jsonb) -function eql_v3.lt(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.lt(a public.text_ord_ore, b eql_v3.query_text_ord_ore) function eql_v3.lt(a public.text_ord_ore, b jsonb) -function eql_v3.lt(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.lt(a public.text_search, b eql_v3.query_text_search) function eql_v3.lt(a public.text_search, b jsonb) -function eql_v3.lt(a public.text_search, b public.query_text_search) function eql_v3.lt(a public.text_search, b public.text_search) +function eql_v3.lt(a public.timestamp_ord, b eql_v3.query_timestamp_ord) function eql_v3.lt(a public.timestamp_ord, b jsonb) -function eql_v3.lt(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.lt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) function eql_v3.lt(a public.timestamp_ord_ope, b jsonb) -function eql_v3.lt(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) function eql_v3.lt(a public.timestamp_ord_ore, b jsonb) -function eql_v3.lt(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.lte(a eql_v3.query_bigint_ord, b public.bigint_ord) +function eql_v3.lte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.lte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.lte(a eql_v3.query_date_ord, b public.date_ord) +function eql_v3.lte(a eql_v3.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.lte(a eql_v3.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.lte(a eql_v3.query_double_ord, b public.double_ord) +function eql_v3.lte(a eql_v3.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.lte(a eql_v3.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.lte(a eql_v3.query_integer_ord, b public.integer_ord) +function eql_v3.lte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.lte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.lte(a eql_v3.query_numeric_ord, b public.numeric_ord) +function eql_v3.lte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.lte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.lte(a eql_v3.query_real_ord, b public.real_ord) +function eql_v3.lte(a eql_v3.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.lte(a eql_v3.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.lte(a eql_v3.query_smallint_ord, b public.smallint_ord) +function eql_v3.lte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lte(a eql_v3.query_text_ord, b public.text_ord) +function eql_v3.lte(a eql_v3.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.lte(a eql_v3.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.lte(a eql_v3.query_text_search, b public.text_search) +function eql_v3.lte(a eql_v3.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.lte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.lte(a jsonb, b public.bigint_ord) function eql_v3.lte(a jsonb, b public.bigint_ord_ope) function eql_v3.lte(a jsonb, b public.bigint_ord_ore) @@ -763,124 +791,133 @@ function eql_v3.lte(a jsonb, b public.text_search) function eql_v3.lte(a jsonb, b public.timestamp_ord) function eql_v3.lte(a jsonb, b public.timestamp_ord_ope) function eql_v3.lte(a jsonb, b public.timestamp_ord_ore) +function eql_v3.lte(a public.bigint_ord, b eql_v3.query_bigint_ord) function eql_v3.lte(a public.bigint_ord, b jsonb) function eql_v3.lte(a public.bigint_ord, b public.bigint_ord) -function eql_v3.lte(a public.bigint_ord, b public.query_bigint_ord) +function eql_v3.lte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) function eql_v3.lte(a public.bigint_ord_ope, b jsonb) function eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.lte(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +function eql_v3.lte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) function eql_v3.lte(a public.bigint_ord_ore, b jsonb) function eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.lte(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +function eql_v3.lte(a public.date_ord, b eql_v3.query_date_ord) function eql_v3.lte(a public.date_ord, b jsonb) function eql_v3.lte(a public.date_ord, b public.date_ord) -function eql_v3.lte(a public.date_ord, b public.query_date_ord) +function eql_v3.lte(a public.date_ord_ope, b eql_v3.query_date_ord_ope) function eql_v3.lte(a public.date_ord_ope, b jsonb) function eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.lte(a public.date_ord_ope, b public.query_date_ord_ope) +function eql_v3.lte(a public.date_ord_ore, b eql_v3.query_date_ord_ore) function eql_v3.lte(a public.date_ord_ore, b jsonb) function eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.lte(a public.date_ord_ore, b public.query_date_ord_ore) +function eql_v3.lte(a public.double_ord, b eql_v3.query_double_ord) function eql_v3.lte(a public.double_ord, b jsonb) function eql_v3.lte(a public.double_ord, b public.double_ord) -function eql_v3.lte(a public.double_ord, b public.query_double_ord) +function eql_v3.lte(a public.double_ord_ope, b eql_v3.query_double_ord_ope) function eql_v3.lte(a public.double_ord_ope, b jsonb) function eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.lte(a public.double_ord_ope, b public.query_double_ord_ope) +function eql_v3.lte(a public.double_ord_ore, b eql_v3.query_double_ord_ore) function eql_v3.lte(a public.double_ord_ore, b jsonb) function eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.lte(a public.double_ord_ore, b public.query_double_ord_ore) +function eql_v3.lte(a public.integer_ord, b eql_v3.query_integer_ord) function eql_v3.lte(a public.integer_ord, b jsonb) function eql_v3.lte(a public.integer_ord, b public.integer_ord) -function eql_v3.lte(a public.integer_ord, b public.query_integer_ord) +function eql_v3.lte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) function eql_v3.lte(a public.integer_ord_ope, b jsonb) function eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.lte(a public.integer_ord_ope, b public.query_integer_ord_ope) +function eql_v3.lte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) function eql_v3.lte(a public.integer_ord_ore, b jsonb) function eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.lte(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.lte(a public.jsonb_entry, b public.jsonb_entry) +function eql_v3.lte(a public.numeric_ord, b eql_v3.query_numeric_ord) function eql_v3.lte(a public.numeric_ord, b jsonb) function eql_v3.lte(a public.numeric_ord, b public.numeric_ord) -function eql_v3.lte(a public.numeric_ord, b public.query_numeric_ord) +function eql_v3.lte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) function eql_v3.lte(a public.numeric_ord_ope, b jsonb) function eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.lte(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +function eql_v3.lte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) function eql_v3.lte(a public.numeric_ord_ore, b jsonb) function eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.lte(a public.numeric_ord_ore, b public.query_numeric_ord_ore) -function eql_v3.lte(a public.query_bigint_ord, b public.bigint_ord) -function eql_v3.lte(a public.query_bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.lte(a public.query_bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.lte(a public.query_date_ord, b public.date_ord) -function eql_v3.lte(a public.query_date_ord_ope, b public.date_ord_ope) -function eql_v3.lte(a public.query_date_ord_ore, b public.date_ord_ore) -function eql_v3.lte(a public.query_double_ord, b public.double_ord) -function eql_v3.lte(a public.query_double_ord_ope, b public.double_ord_ope) -function eql_v3.lte(a public.query_double_ord_ore, b public.double_ord_ore) -function eql_v3.lte(a public.query_integer_ord, b public.integer_ord) -function eql_v3.lte(a public.query_integer_ord_ope, b public.integer_ord_ope) -function eql_v3.lte(a public.query_integer_ord_ore, b public.integer_ord_ore) -function eql_v3.lte(a public.query_numeric_ord, b public.numeric_ord) -function eql_v3.lte(a public.query_numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.lte(a public.query_numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.lte(a public.query_real_ord, b public.real_ord) -function eql_v3.lte(a public.query_real_ord_ope, b public.real_ord_ope) -function eql_v3.lte(a public.query_real_ord_ore, b public.real_ord_ore) -function eql_v3.lte(a public.query_smallint_ord, b public.smallint_ord) -function eql_v3.lte(a public.query_smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.lte(a public.query_smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.lte(a public.query_text_ord, b public.text_ord) -function eql_v3.lte(a public.query_text_ord_ope, b public.text_ord_ope) -function eql_v3.lte(a public.query_text_ord_ore, b public.text_ord_ore) -function eql_v3.lte(a public.query_text_search, b public.text_search) -function eql_v3.lte(a public.query_timestamp_ord, b public.timestamp_ord) -function eql_v3.lte(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.lte(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.lte(a public.real_ord, b eql_v3.query_real_ord) function eql_v3.lte(a public.real_ord, b jsonb) -function eql_v3.lte(a public.real_ord, b public.query_real_ord) function eql_v3.lte(a public.real_ord, b public.real_ord) +function eql_v3.lte(a public.real_ord_ope, b eql_v3.query_real_ord_ope) function eql_v3.lte(a public.real_ord_ope, b jsonb) -function eql_v3.lte(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.lte(a public.real_ord_ore, b eql_v3.query_real_ord_ore) function eql_v3.lte(a public.real_ord_ore, b jsonb) -function eql_v3.lte(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.lte(a public.smallint_ord, b eql_v3.query_smallint_ord) function eql_v3.lte(a public.smallint_ord, b jsonb) -function eql_v3.lte(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.lte(a public.smallint_ord, b public.smallint_ord) +function eql_v3.lte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) function eql_v3.lte(a public.smallint_ord_ope, b jsonb) -function eql_v3.lte(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.lte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) function eql_v3.lte(a public.smallint_ord_ore, b jsonb) -function eql_v3.lte(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.lte(a public.text_ord, b eql_v3.query_text_ord) function eql_v3.lte(a public.text_ord, b jsonb) -function eql_v3.lte(a public.text_ord, b public.query_text_ord) function eql_v3.lte(a public.text_ord, b public.text_ord) +function eql_v3.lte(a public.text_ord_ope, b eql_v3.query_text_ord_ope) function eql_v3.lte(a public.text_ord_ope, b jsonb) -function eql_v3.lte(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.lte(a public.text_ord_ore, b eql_v3.query_text_ord_ore) function eql_v3.lte(a public.text_ord_ore, b jsonb) -function eql_v3.lte(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.lte(a public.text_search, b eql_v3.query_text_search) function eql_v3.lte(a public.text_search, b jsonb) -function eql_v3.lte(a public.text_search, b public.query_text_search) function eql_v3.lte(a public.text_search, b public.text_search) +function eql_v3.lte(a public.timestamp_ord, b eql_v3.query_timestamp_ord) function eql_v3.lte(a public.timestamp_ord, b jsonb) -function eql_v3.lte(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.lte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) function eql_v3.lte(a public.timestamp_ord_ope, b jsonb) -function eql_v3.lte(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.lte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) function eql_v3.lte(a public.timestamp_ord_ore, b jsonb) -function eql_v3.lte(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore) -function eql_v3.match_term(a public.query_text_match) -function eql_v3.match_term(a public.query_text_search) +function eql_v3.match_term(a eql_v3.query_text_match) +function eql_v3.match_term(a eql_v3.query_text_search) function eql_v3.match_term(a public.text_match) function eql_v3.match_term(a public.text_search) function eql_v3.meta_data(val jsonb) +function eql_v3.neq(a eql_v3.query_bigint_eq, b public.bigint_eq) +function eql_v3.neq(a eql_v3.query_bigint_ord, b public.bigint_ord) +function eql_v3.neq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope) +function eql_v3.neq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore) +function eql_v3.neq(a eql_v3.query_date_eq, b public.date_eq) +function eql_v3.neq(a eql_v3.query_date_ord, b public.date_ord) +function eql_v3.neq(a eql_v3.query_date_ord_ope, b public.date_ord_ope) +function eql_v3.neq(a eql_v3.query_date_ord_ore, b public.date_ord_ore) +function eql_v3.neq(a eql_v3.query_double_eq, b public.double_eq) +function eql_v3.neq(a eql_v3.query_double_ord, b public.double_ord) +function eql_v3.neq(a eql_v3.query_double_ord_ope, b public.double_ord_ope) +function eql_v3.neq(a eql_v3.query_double_ord_ore, b public.double_ord_ore) +function eql_v3.neq(a eql_v3.query_integer_eq, b public.integer_eq) +function eql_v3.neq(a eql_v3.query_integer_ord, b public.integer_ord) +function eql_v3.neq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope) +function eql_v3.neq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore) +function eql_v3.neq(a eql_v3.query_numeric_eq, b public.numeric_eq) +function eql_v3.neq(a eql_v3.query_numeric_ord, b public.numeric_ord) +function eql_v3.neq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope) +function eql_v3.neq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore) +function eql_v3.neq(a eql_v3.query_real_eq, b public.real_eq) +function eql_v3.neq(a eql_v3.query_real_ord, b public.real_ord) +function eql_v3.neq(a eql_v3.query_real_ord_ope, b public.real_ord_ope) +function eql_v3.neq(a eql_v3.query_real_ord_ore, b public.real_ord_ore) +function eql_v3.neq(a eql_v3.query_smallint_eq, b public.smallint_eq) +function eql_v3.neq(a eql_v3.query_smallint_ord, b public.smallint_ord) +function eql_v3.neq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.neq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.neq(a eql_v3.query_text_eq, b public.text_eq) +function eql_v3.neq(a eql_v3.query_text_ord, b public.text_ord) +function eql_v3.neq(a eql_v3.query_text_ord_ope, b public.text_ord_ope) +function eql_v3.neq(a eql_v3.query_text_ord_ore, b public.text_ord_ore) +function eql_v3.neq(a eql_v3.query_text_search, b public.text_search) +function eql_v3.neq(a eql_v3.query_timestamp_eq, b public.timestamp_eq) +function eql_v3.neq(a eql_v3.query_timestamp_ord, b public.timestamp_ord) +function eql_v3.neq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.neq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore) function eql_v3.neq(a jsonb, b public.bigint_eq) function eql_v3.neq(a jsonb, b public.bigint_ord) function eql_v3.neq(a jsonb, b public.bigint_ord_ope) @@ -918,173 +955,155 @@ function eql_v3.neq(a jsonb, b public.timestamp_eq) function eql_v3.neq(a jsonb, b public.timestamp_ord) function eql_v3.neq(a jsonb, b public.timestamp_ord_ope) function eql_v3.neq(a jsonb, b public.timestamp_ord_ore) +function eql_v3.neq(a public.bigint_eq, b eql_v3.query_bigint_eq) function eql_v3.neq(a public.bigint_eq, b jsonb) function eql_v3.neq(a public.bigint_eq, b public.bigint_eq) -function eql_v3.neq(a public.bigint_eq, b public.query_bigint_eq) +function eql_v3.neq(a public.bigint_ord, b eql_v3.query_bigint_ord) function eql_v3.neq(a public.bigint_ord, b jsonb) function eql_v3.neq(a public.bigint_ord, b public.bigint_ord) -function eql_v3.neq(a public.bigint_ord, b public.query_bigint_ord) +function eql_v3.neq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope) function eql_v3.neq(a public.bigint_ord_ope, b jsonb) function eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.neq(a public.bigint_ord_ope, b public.query_bigint_ord_ope) +function eql_v3.neq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore) function eql_v3.neq(a public.bigint_ord_ore, b jsonb) function eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.neq(a public.bigint_ord_ore, b public.query_bigint_ord_ore) +function eql_v3.neq(a public.date_eq, b eql_v3.query_date_eq) function eql_v3.neq(a public.date_eq, b jsonb) function eql_v3.neq(a public.date_eq, b public.date_eq) -function eql_v3.neq(a public.date_eq, b public.query_date_eq) +function eql_v3.neq(a public.date_ord, b eql_v3.query_date_ord) function eql_v3.neq(a public.date_ord, b jsonb) function eql_v3.neq(a public.date_ord, b public.date_ord) -function eql_v3.neq(a public.date_ord, b public.query_date_ord) +function eql_v3.neq(a public.date_ord_ope, b eql_v3.query_date_ord_ope) function eql_v3.neq(a public.date_ord_ope, b jsonb) function eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope) -function eql_v3.neq(a public.date_ord_ope, b public.query_date_ord_ope) +function eql_v3.neq(a public.date_ord_ore, b eql_v3.query_date_ord_ore) function eql_v3.neq(a public.date_ord_ore, b jsonb) function eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore) -function eql_v3.neq(a public.date_ord_ore, b public.query_date_ord_ore) +function eql_v3.neq(a public.double_eq, b eql_v3.query_double_eq) function eql_v3.neq(a public.double_eq, b jsonb) function eql_v3.neq(a public.double_eq, b public.double_eq) -function eql_v3.neq(a public.double_eq, b public.query_double_eq) +function eql_v3.neq(a public.double_ord, b eql_v3.query_double_ord) function eql_v3.neq(a public.double_ord, b jsonb) function eql_v3.neq(a public.double_ord, b public.double_ord) -function eql_v3.neq(a public.double_ord, b public.query_double_ord) +function eql_v3.neq(a public.double_ord_ope, b eql_v3.query_double_ord_ope) function eql_v3.neq(a public.double_ord_ope, b jsonb) function eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope) -function eql_v3.neq(a public.double_ord_ope, b public.query_double_ord_ope) +function eql_v3.neq(a public.double_ord_ore, b eql_v3.query_double_ord_ore) function eql_v3.neq(a public.double_ord_ore, b jsonb) function eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore) -function eql_v3.neq(a public.double_ord_ore, b public.query_double_ord_ore) +function eql_v3.neq(a public.integer_eq, b eql_v3.query_integer_eq) function eql_v3.neq(a public.integer_eq, b jsonb) function eql_v3.neq(a public.integer_eq, b public.integer_eq) -function eql_v3.neq(a public.integer_eq, b public.query_integer_eq) +function eql_v3.neq(a public.integer_ord, b eql_v3.query_integer_ord) function eql_v3.neq(a public.integer_ord, b jsonb) function eql_v3.neq(a public.integer_ord, b public.integer_ord) -function eql_v3.neq(a public.integer_ord, b public.query_integer_ord) +function eql_v3.neq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope) function eql_v3.neq(a public.integer_ord_ope, b jsonb) function eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope) -function eql_v3.neq(a public.integer_ord_ope, b public.query_integer_ord_ope) +function eql_v3.neq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore) function eql_v3.neq(a public.integer_ord_ore, b jsonb) function eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore) -function eql_v3.neq(a public.integer_ord_ore, b public.query_integer_ord_ore) function eql_v3.neq(a public.jsonb_entry, b public.jsonb_entry) +function eql_v3.neq(a public.numeric_eq, b eql_v3.query_numeric_eq) function eql_v3.neq(a public.numeric_eq, b jsonb) function eql_v3.neq(a public.numeric_eq, b public.numeric_eq) -function eql_v3.neq(a public.numeric_eq, b public.query_numeric_eq) +function eql_v3.neq(a public.numeric_ord, b eql_v3.query_numeric_ord) function eql_v3.neq(a public.numeric_ord, b jsonb) function eql_v3.neq(a public.numeric_ord, b public.numeric_ord) -function eql_v3.neq(a public.numeric_ord, b public.query_numeric_ord) +function eql_v3.neq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope) function eql_v3.neq(a public.numeric_ord_ope, b jsonb) function eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.neq(a public.numeric_ord_ope, b public.query_numeric_ord_ope) +function eql_v3.neq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore) function eql_v3.neq(a public.numeric_ord_ore, b jsonb) function eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.neq(a public.numeric_ord_ore, b public.query_numeric_ord_ore) -function eql_v3.neq(a public.query_bigint_eq, b public.bigint_eq) -function eql_v3.neq(a public.query_bigint_ord, b public.bigint_ord) -function eql_v3.neq(a public.query_bigint_ord_ope, b public.bigint_ord_ope) -function eql_v3.neq(a public.query_bigint_ord_ore, b public.bigint_ord_ore) -function eql_v3.neq(a public.query_date_eq, b public.date_eq) -function eql_v3.neq(a public.query_date_ord, b public.date_ord) -function eql_v3.neq(a public.query_date_ord_ope, b public.date_ord_ope) -function eql_v3.neq(a public.query_date_ord_ore, b public.date_ord_ore) -function eql_v3.neq(a public.query_double_eq, b public.double_eq) -function eql_v3.neq(a public.query_double_ord, b public.double_ord) -function eql_v3.neq(a public.query_double_ord_ope, b public.double_ord_ope) -function eql_v3.neq(a public.query_double_ord_ore, b public.double_ord_ore) -function eql_v3.neq(a public.query_integer_eq, b public.integer_eq) -function eql_v3.neq(a public.query_integer_ord, b public.integer_ord) -function eql_v3.neq(a public.query_integer_ord_ope, b public.integer_ord_ope) -function eql_v3.neq(a public.query_integer_ord_ore, b public.integer_ord_ore) -function eql_v3.neq(a public.query_numeric_eq, b public.numeric_eq) -function eql_v3.neq(a public.query_numeric_ord, b public.numeric_ord) -function eql_v3.neq(a public.query_numeric_ord_ope, b public.numeric_ord_ope) -function eql_v3.neq(a public.query_numeric_ord_ore, b public.numeric_ord_ore) -function eql_v3.neq(a public.query_real_eq, b public.real_eq) -function eql_v3.neq(a public.query_real_ord, b public.real_ord) -function eql_v3.neq(a public.query_real_ord_ope, b public.real_ord_ope) -function eql_v3.neq(a public.query_real_ord_ore, b public.real_ord_ore) -function eql_v3.neq(a public.query_smallint_eq, b public.smallint_eq) -function eql_v3.neq(a public.query_smallint_ord, b public.smallint_ord) -function eql_v3.neq(a public.query_smallint_ord_ope, b public.smallint_ord_ope) -function eql_v3.neq(a public.query_smallint_ord_ore, b public.smallint_ord_ore) -function eql_v3.neq(a public.query_text_eq, b public.text_eq) -function eql_v3.neq(a public.query_text_ord, b public.text_ord) -function eql_v3.neq(a public.query_text_ord_ope, b public.text_ord_ope) -function eql_v3.neq(a public.query_text_ord_ore, b public.text_ord_ore) -function eql_v3.neq(a public.query_text_search, b public.text_search) -function eql_v3.neq(a public.query_timestamp_eq, b public.timestamp_eq) -function eql_v3.neq(a public.query_timestamp_ord, b public.timestamp_ord) -function eql_v3.neq(a public.query_timestamp_ord_ope, b public.timestamp_ord_ope) -function eql_v3.neq(a public.query_timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.neq(a public.real_eq, b eql_v3.query_real_eq) function eql_v3.neq(a public.real_eq, b jsonb) -function eql_v3.neq(a public.real_eq, b public.query_real_eq) function eql_v3.neq(a public.real_eq, b public.real_eq) +function eql_v3.neq(a public.real_ord, b eql_v3.query_real_ord) function eql_v3.neq(a public.real_ord, b jsonb) -function eql_v3.neq(a public.real_ord, b public.query_real_ord) function eql_v3.neq(a public.real_ord, b public.real_ord) +function eql_v3.neq(a public.real_ord_ope, b eql_v3.query_real_ord_ope) function eql_v3.neq(a public.real_ord_ope, b jsonb) -function eql_v3.neq(a public.real_ord_ope, b public.query_real_ord_ope) function eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope) +function eql_v3.neq(a public.real_ord_ore, b eql_v3.query_real_ord_ore) function eql_v3.neq(a public.real_ord_ore, b jsonb) -function eql_v3.neq(a public.real_ord_ore, b public.query_real_ord_ore) function eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore) +function eql_v3.neq(a public.smallint_eq, b eql_v3.query_smallint_eq) function eql_v3.neq(a public.smallint_eq, b jsonb) -function eql_v3.neq(a public.smallint_eq, b public.query_smallint_eq) function eql_v3.neq(a public.smallint_eq, b public.smallint_eq) +function eql_v3.neq(a public.smallint_ord, b eql_v3.query_smallint_ord) function eql_v3.neq(a public.smallint_ord, b jsonb) -function eql_v3.neq(a public.smallint_ord, b public.query_smallint_ord) function eql_v3.neq(a public.smallint_ord, b public.smallint_ord) +function eql_v3.neq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope) function eql_v3.neq(a public.smallint_ord_ope, b jsonb) -function eql_v3.neq(a public.smallint_ord_ope, b public.query_smallint_ord_ope) function eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope) +function eql_v3.neq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore) function eql_v3.neq(a public.smallint_ord_ore, b jsonb) -function eql_v3.neq(a public.smallint_ord_ore, b public.query_smallint_ord_ore) function eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore) +function eql_v3.neq(a public.text_eq, b eql_v3.query_text_eq) function eql_v3.neq(a public.text_eq, b jsonb) -function eql_v3.neq(a public.text_eq, b public.query_text_eq) function eql_v3.neq(a public.text_eq, b public.text_eq) +function eql_v3.neq(a public.text_ord, b eql_v3.query_text_ord) function eql_v3.neq(a public.text_ord, b jsonb) -function eql_v3.neq(a public.text_ord, b public.query_text_ord) function eql_v3.neq(a public.text_ord, b public.text_ord) +function eql_v3.neq(a public.text_ord_ope, b eql_v3.query_text_ord_ope) function eql_v3.neq(a public.text_ord_ope, b jsonb) -function eql_v3.neq(a public.text_ord_ope, b public.query_text_ord_ope) function eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope) +function eql_v3.neq(a public.text_ord_ore, b eql_v3.query_text_ord_ore) function eql_v3.neq(a public.text_ord_ore, b jsonb) -function eql_v3.neq(a public.text_ord_ore, b public.query_text_ord_ore) function eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore) +function eql_v3.neq(a public.text_search, b eql_v3.query_text_search) function eql_v3.neq(a public.text_search, b jsonb) -function eql_v3.neq(a public.text_search, b public.query_text_search) function eql_v3.neq(a public.text_search, b public.text_search) +function eql_v3.neq(a public.timestamp_eq, b eql_v3.query_timestamp_eq) function eql_v3.neq(a public.timestamp_eq, b jsonb) -function eql_v3.neq(a public.timestamp_eq, b public.query_timestamp_eq) function eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq) +function eql_v3.neq(a public.timestamp_ord, b eql_v3.query_timestamp_ord) function eql_v3.neq(a public.timestamp_ord, b jsonb) -function eql_v3.neq(a public.timestamp_ord, b public.query_timestamp_ord) function eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord) +function eql_v3.neq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope) function eql_v3.neq(a public.timestamp_ord_ope, b jsonb) -function eql_v3.neq(a public.timestamp_ord_ope, b public.query_timestamp_ord_ope) function eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope) +function eql_v3.neq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore) function eql_v3.neq(a public.timestamp_ord_ore, b jsonb) -function eql_v3.neq(a public.timestamp_ord_ore, b public.query_timestamp_ord_ore) function eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore) +function eql_v3.ord_ope_term(a eql_v3.query_bigint_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_date_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_double_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_integer_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_numeric_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_real_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_smallint_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_text_ord_ope) +function eql_v3.ord_ope_term(a eql_v3.query_timestamp_ord_ope) function eql_v3.ord_ope_term(a public.bigint_ord_ope) function eql_v3.ord_ope_term(a public.date_ord_ope) function eql_v3.ord_ope_term(a public.double_ord_ope) function eql_v3.ord_ope_term(a public.integer_ord_ope) function eql_v3.ord_ope_term(a public.numeric_ord_ope) -function eql_v3.ord_ope_term(a public.query_bigint_ord_ope) -function eql_v3.ord_ope_term(a public.query_date_ord_ope) -function eql_v3.ord_ope_term(a public.query_double_ord_ope) -function eql_v3.ord_ope_term(a public.query_integer_ord_ope) -function eql_v3.ord_ope_term(a public.query_numeric_ord_ope) -function eql_v3.ord_ope_term(a public.query_real_ord_ope) -function eql_v3.ord_ope_term(a public.query_smallint_ord_ope) -function eql_v3.ord_ope_term(a public.query_text_ord_ope) -function eql_v3.ord_ope_term(a public.query_timestamp_ord_ope) function eql_v3.ord_ope_term(a public.real_ord_ope) function eql_v3.ord_ope_term(a public.smallint_ord_ope) function eql_v3.ord_ope_term(a public.text_ord_ope) function eql_v3.ord_ope_term(a public.timestamp_ord_ope) +function eql_v3.ord_term(a eql_v3.query_bigint_ord) +function eql_v3.ord_term(a eql_v3.query_bigint_ord_ore) +function eql_v3.ord_term(a eql_v3.query_date_ord) +function eql_v3.ord_term(a eql_v3.query_date_ord_ore) +function eql_v3.ord_term(a eql_v3.query_double_ord) +function eql_v3.ord_term(a eql_v3.query_double_ord_ore) +function eql_v3.ord_term(a eql_v3.query_integer_ord) +function eql_v3.ord_term(a eql_v3.query_integer_ord_ore) +function eql_v3.ord_term(a eql_v3.query_numeric_ord) +function eql_v3.ord_term(a eql_v3.query_numeric_ord_ore) +function eql_v3.ord_term(a eql_v3.query_real_ord) +function eql_v3.ord_term(a eql_v3.query_real_ord_ore) +function eql_v3.ord_term(a eql_v3.query_smallint_ord) +function eql_v3.ord_term(a eql_v3.query_smallint_ord_ore) +function eql_v3.ord_term(a eql_v3.query_text_ord) +function eql_v3.ord_term(a eql_v3.query_text_ord_ore) +function eql_v3.ord_term(a eql_v3.query_text_search) +function eql_v3.ord_term(a eql_v3.query_timestamp_ord) +function eql_v3.ord_term(a eql_v3.query_timestamp_ord_ore) function eql_v3.ord_term(a public.bigint_ord) function eql_v3.ord_term(a public.bigint_ord_ore) function eql_v3.ord_term(a public.date_ord) @@ -1095,25 +1114,6 @@ function eql_v3.ord_term(a public.integer_ord) function eql_v3.ord_term(a public.integer_ord_ore) function eql_v3.ord_term(a public.numeric_ord) function eql_v3.ord_term(a public.numeric_ord_ore) -function eql_v3.ord_term(a public.query_bigint_ord) -function eql_v3.ord_term(a public.query_bigint_ord_ore) -function eql_v3.ord_term(a public.query_date_ord) -function eql_v3.ord_term(a public.query_date_ord_ore) -function eql_v3.ord_term(a public.query_double_ord) -function eql_v3.ord_term(a public.query_double_ord_ore) -function eql_v3.ord_term(a public.query_integer_ord) -function eql_v3.ord_term(a public.query_integer_ord_ore) -function eql_v3.ord_term(a public.query_numeric_ord) -function eql_v3.ord_term(a public.query_numeric_ord_ore) -function eql_v3.ord_term(a public.query_real_ord) -function eql_v3.ord_term(a public.query_real_ord_ore) -function eql_v3.ord_term(a public.query_smallint_ord) -function eql_v3.ord_term(a public.query_smallint_ord_ore) -function eql_v3.ord_term(a public.query_text_ord) -function eql_v3.ord_term(a public.query_text_ord_ore) -function eql_v3.ord_term(a public.query_text_search) -function eql_v3.ord_term(a public.query_timestamp_ord) -function eql_v3.ord_term(a public.query_timestamp_ord_ore) function eql_v3.ord_term(a public.real_ord) function eql_v3.ord_term(a public.real_ord_ore) function eql_v3.ord_term(a public.smallint_ord) diff --git a/tests/sqlx/src/property.rs b/tests/sqlx/src/property.rs index a8c430a0b..d4228c1c1 100644 --- a/tests/sqlx/src/property.rs +++ b/tests/sqlx/src/property.rs @@ -95,12 +95,15 @@ fn query_cast(payload_json: &str, domain: &str) -> String { if let Some(obj) = v.as_object_mut() { obj.remove("c"); } - // `domain` is schema-qualified (`public.integer_eq`); the twin prefixes the - // unqualified name (`public.query_integer_eq`). - let query_domain = match domain.rsplit_once('.') { - Some((schema, name)) => format!("{schema}.query_{name}"), - None => format!("query_{domain}"), + // `domain` is schema-qualified (`public.integer_eq`); the twin prefixes + // the unqualified name and lives in the eql_v3 schema, not `public` + // (query operands are never column types — CIP-3442): + // `eql_v3.query_integer_eq`. + let bare = match domain.rsplit_once('.') { + Some((_, name)) => name, + None => domain, }; + let query_domain = format!("eql_v3.query_{bare}"); format!( "'{}'::jsonb::{}", v.to_string().replace('\'', "''"), diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs index 89ee9930b..3fe4f31fc 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs @@ -12,7 +12,7 @@ //! divergence is SQL NULL, which both forms accept (the validator via //! STRICT, the inline expression via a leading `VALUE IS NULL OR`). //! -//! `public.query_jsonb`'s CHECK CANNOT be inlined — validating sv elements +//! `eql_v3.query_jsonb`'s CHECK CANNOT be inlined — validating sv elements //! needs a subquery, which CHECK constraints forbid — so its validator is //! plpgsql instead (cached plan vs the per-call SQL-function executor; the //! issue #353 finding). `query_jsonb_check_behaviour` characterises the @@ -128,10 +128,10 @@ async fn query_jsonb_check_behaviour(pool: PgPool) -> Result<()> { (Some("[]"), false), ]; for (payload, expected) in candidates { - let cast = cast_accepts(&pool, "public.query_jsonb", *payload).await?; + let cast = cast_accepts(&pool, "eql_v3.query_jsonb", *payload).await?; anyhow::ensure!( cast == *expected, - "public.query_jsonb cast verdict changed for {payload:?}: \ + "eql_v3.query_jsonb cast verdict changed for {payload:?}: \ accepted = {cast}, expected = {expected}" ); } diff --git a/tests/sqlx/tests/encrypted_domain/ope/support.rs b/tests/sqlx/tests/encrypted_domain/ope/support.rs index c66c99ae6..d52aa062e 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/support.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/support.rs @@ -268,7 +268,7 @@ macro_rules! ope_ord_fixture_smoke { o.remove("c"); } format!( - "'{}'::jsonb::public.query_{}", + "'{}'::jsonb::eql_v3.query_{}", v.to_string().replace('\'', "''"), $domain ) diff --git a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs index e35c9b3e0..000922915 100644 --- a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs @@ -65,7 +65,7 @@ async fn real_ste_vec_row_parses_into_document_and_entries(pool: PgPool) -> anyh #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn real_ste_vec_query_parses_into_bindings(pool: PgPool) -> anyhow::Result<()> { // `eql_v3.to_ste_vec_query` turns an encrypted document into a containment - // needle (`public.query_jsonb`), the shape a caller builds a `@>` / `<@` + // needle (`eql_v3.query_jsonb`), the shape a caller builds a `@>` / `<@` // query from. Parse a REAL one into `SteVecQuery` (and, transitively, its // `SteVecQueryEntry` elements), tying those two bindings to real crypto and // the hand-written `is_valid_ste_vec_query_payload` CHECK — the document/entry diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs index b112d8287..9e4c6b8a1 100644 --- a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -38,7 +38,7 @@ async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result String { match ty { "\"json\"" => "public.json".to_string(), "jsonb_entry" => "public.jsonb_entry".to_string(), - "query_jsonb" => "public.query_jsonb".to_string(), + "query_jsonb" => "eql_v3.query_jsonb".to_string(), _ => ty.replace("public.\"json\"", "public.json"), } } @@ -144,10 +144,10 @@ async fn v3_jsonb_surface_supported_signatures(pool: PgPool) -> anyhow::Result<( let expected_supported: &[(&str, &str, &str)] = &[ // containment ("@>", "public.json", "public.json"), - ("@>", "public.json", "public.query_jsonb"), + ("@>", "public.json", "eql_v3.query_jsonb"), ("@>", "public.json", "public.jsonb_entry"), ("<@", "public.json", "public.json"), - ("<@", "public.query_jsonb", "public.json"), + ("<@", "eql_v3.query_jsonb", "public.json"), ("<@", "public.jsonb_entry", "public.json"), // path access ("->", "public.json", "text"), diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index 62aa5f93a..fbbe163e2 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -1,5 +1,5 @@ //! Parameterized test harness for the `eql_v3` encrypted-JSONB (SteVec) surface -//! (`public.json` / `public.jsonb_entry` / `public.query_jsonb`). +//! (`public.json` / `public.jsonb_entry` / `eql_v3.query_jsonb`). //! //! Design source of truth: //! `docs/superpowers/plans/2026-06-09-eql-v3-jsonb-test-harness-design.md`. @@ -306,7 +306,7 @@ async fn v3_jsonb_containment_hm_only(pool: PgPool) -> anyhow::Result<()> { let root_hm = root_hm_term(&pool).await?; let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -317,7 +317,7 @@ async fn v3_jsonb_containment_hm_only(pool: PgPool) -> anyhow::Result<()> { // Commutator: query_jsonb <@ json must agree row-for-row. let hits_rev: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.query_jsonb <@ payload" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::eql_v3.query_jsonb <@ payload" )) .fetch_one(&pool) .await?; @@ -337,7 +337,7 @@ async fn v3_jsonb_containment_oc_only(pool: PgPool) -> anyhow::Result<()> { // Row 1 must be among the matches (oc terms can repeat across rows). let row1: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -345,12 +345,12 @@ async fn v3_jsonb_containment_oc_only(pool: PgPool) -> anyhow::Result<()> { // Commutator agreement over the whole table. let fwd: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; let rev: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::public.query_jsonb <@ payload" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE '{n}'::eql_v3.query_jsonb <@ payload" )) .fetch_one(&pool) .await?; @@ -403,7 +403,7 @@ async fn v3_jsonb_containment_mixed(pool: PgPool) -> anyhow::Result<()> { let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm), (SEL_HELLO_OC, "oc", &oc)]); let row1: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE id = 1 AND payload @> '{n}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -625,7 +625,7 @@ async fn v3_jsonb_containment_rejects_wrong_bytes(pool: PgPool) -> anyhow::Resul let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -637,7 +637,7 @@ async fn v3_jsonb_containment_rejects_wrong_bytes(pool: PgPool) -> anyhow::Resul // Real selector, WRONG hm bytes — must match nothing. let n = needle(&[(SEL_ROOT_HM, "hm", "deadbeefdeadbeefdeadbeefdeadbeef")]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -664,12 +664,12 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R let oc_needle = needle(&[(COLLIDE_SEL, "oc", COLLIDE_TERM)]); let hm_needle = needle(&[(COLLIDE_SEL, "hm", COLLIDE_TERM)]); let collide_accept: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::public.json @> '{hm_needle}'::public.query_jsonb" + "SELECT '{hm_doc}'::public.json @> '{hm_needle}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; let collide_reject: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::public.json @> '{oc_needle}'::public.query_jsonb" + "SELECT '{hm_doc}'::public.json @> '{oc_needle}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -685,7 +685,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -697,7 +697,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R // An `oc`-field needle carrying the real hm term at the hm selector: rejects. let n = needle(&[(SEL_ROOT_HM, "oc", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -715,7 +715,7 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R .await?; let n2 = needle(&[(SEL_HELLO_OC, "hm", &oc)]); let hits2: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n2}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n2}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -733,7 +733,7 @@ async fn v3_jsonb_containment_rejects_wrong_selector(pool: PgPool) -> anyhow::Re let root_hm = root_hm_term(&pool).await?; let good = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let good_hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{good}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -745,7 +745,7 @@ async fn v3_jsonb_containment_rejects_wrong_selector(pool: PgPool) -> anyhow::Re // Right term bytes, but a selector that exists in no fixture row. let n = needle(&[("ffffffffffffffffffffffffffffffff", "hm", &root_hm)]); let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb" + "SELECT count(*) FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -804,11 +804,11 @@ v3_jsonb_supported_null!( (doc_contains_doc_lhs, "SELECT NULL::public.json @> '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), (doc_contains_doc_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.json"), // json @> query_jsonb / json @> jsonb_entry - (doc_contains_query_lhs, "SELECT NULL::public.json @> '{\"sv\":[]}'::public.query_jsonb"), - (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.query_jsonb"), + (doc_contains_query_lhs, "SELECT NULL::public.json @> '{\"sv\":[]}'::eql_v3.query_jsonb"), + (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::eql_v3.query_jsonb"), (doc_contains_entry_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.jsonb_entry"), // <@ reverses - (query_contained_lhs, "SELECT NULL::public.query_jsonb <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), + (query_contained_lhs, "SELECT NULL::eql_v3.query_jsonb <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), (entry_contained_lhs, "SELECT NULL::public.jsonb_entry <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), ); @@ -1164,7 +1164,7 @@ v3_jsonb_payload_reject!( v3_jsonb_payload_reject!( v3_jsonb_ste_vec_query_payload_check, - "public.query_jsonb", + "eql_v3.query_jsonb", [ "[]", // non-object "{\"sv\":{}}", // sv not an array @@ -1194,7 +1194,7 @@ async fn v3_jsonb_payload_check_accepts_valid(pool: PgPool) -> anyhow::Result<() .await?; assert!(ok_entry); let ok_query: bool = sqlx::query_scalar( - "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"00\"}]}'::public.query_jsonb IS NOT NULL", + "SELECT '{\"sv\":[{\"s\":\"x\",\"hm\":\"00\"}]}'::eql_v3.query_jsonb IS NOT NULL", ) .fetch_one(&pool) .await?; @@ -1371,7 +1371,7 @@ async fn v3_jsonb_index_to_ste_vec_query_gin_engages(pool: PgPool) -> anyhow::Re let root_hm = root_hm_term(&pool).await?; let n = needle(&[(SEL_ROOT_HM, "hm", &root_hm)]); let query = - format!("SELECT id FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::public.query_jsonb"); + format!("SELECT id FROM fixtures.v3_ste_vec WHERE payload @> '{n}'::eql_v3.query_jsonb"); assert_index_scan_uses( &mut *tx, &query, @@ -1483,7 +1483,7 @@ async fn v3_jsonb_to_ste_vec_query_gin_is_cost_chosen(pool: PgPool) -> anyhow::R // oc, exactly the single pivot row contains it. let n = needle(&[(SEL_HELLO_OC, "oc", &pivot_oc)]); let query = - format!("SELECT count(*) FROM v3_jsonb_scale WHERE payload @> '{n}'::public.query_jsonb"); + format!("SELECT count(*) FROM v3_jsonb_scale WHERE payload @> '{n}'::eql_v3.query_jsonb"); assert_index_scan_uses( &mut *tx, &query, diff --git a/tests/sqlx/tests/v3_operator_equivalents_tests.rs b/tests/sqlx/tests/v3_operator_equivalents_tests.rs index 887bf0fef..f41bb5a8c 100644 --- a/tests/sqlx/tests/v3_operator_equivalents_tests.rs +++ b/tests/sqlx/tests/v3_operator_equivalents_tests.rs @@ -23,23 +23,36 @@ use anyhow::Result; use sqlx::PgPool; -/// Every EQL domain name in the `public` schema, from the catalog: the storage -/// and capability domains of every family (including the jsonb SteVec three) -/// plus the `query_` operand twin of every term-bearing scalar domain. -/// The structural scan below identifies "an EQL operator" by these names — the -/// domains deliberately live in `public` (dropping EQL-owned schemas must not -/// drop application columns), so a namespace filter alone cannot find them. +/// Every EQL COLUMN-domain name in the `public` schema, from the catalog: the +/// storage and capability domains of every family. The jsonb needle +/// (`query_jsonb`) is a query operand and lives in `eql_v3`, so `full_name`s +/// starting with `query_` are excluded here (see [`eql_query_domain_names`]). +/// The structural scan below identifies "an EQL operator" by these names — +/// the column domains deliberately live in `public` (dropping EQL-owned +/// schemas must not drop application columns), so a namespace filter alone +/// cannot find them. fn eql_public_domain_names() -> Vec { - let mut names: Vec = eql_domains::CATALOG + eql_domains::CATALOG .iter() .flat_map(|f| f.domains.iter().map(move |d| d.full_name(f.name))) + .filter(|n| !n.starts_with("query_")) + .collect() +} + +/// Every EQL QUERY-OPERAND domain name, from the catalog: the `query_` +/// twin of every term-bearing scalar domain plus the jsonb containment needle +/// (`query_jsonb`). These live in the `eql_v3` schema (CIP-3442) — never +/// valid column types, so they don't share the column domains' `public` home. +fn eql_query_domain_names() -> Vec { + let mut names: Vec = eql_domains::scalar_families() + .flat_map(|f| { + f.domains + .iter() + .filter(|d| !d.terms.is_empty()) + .map(move |d| d.query_name(f.name)) + }) .collect(); - names.extend(eql_domains::scalar_families().flat_map(|f| { - f.domains - .iter() - .filter(|d| !d.terms.is_empty()) - .map(move |d| d.query_name(f.name)) - })); + names.push("query_jsonb".to_string()); names } @@ -50,16 +63,18 @@ fn eql_public_domain_names() -> Vec { /// An offender is a supported operator whose function equivalent is hidden in /// `eql_v3_internal`, where an operator-free caller cannot reach it. /// -/// EQL domains are identified by catalog name in the `public` namespace (no -/// type lives in the `eql_v3` schema itself — an earlier `nspname = 'eql_v3'` -/// filter matched zero operators and the scan passed vacuously). The test -/// first asserts the scan MATCHES a healthy number of operators, so it can -/// never silently rot back into vacuous-pass. +/// EQL operands are identified by catalog name in their home namespace — +/// column domains in `public`, query-operand twins in `eql_v3` (an earlier +/// bare `nspname = 'eql_v3'` filter matched zero operators, before the query +/// domains moved there, and the scan passed vacuously). The test first +/// asserts the scan MATCHES a healthy number of operators, so it can never +/// silently rot back into vacuous-pass. #[sqlx::test] async fn every_supported_eql_v3_operator_has_a_public_function_equivalent( pool: PgPool, ) -> Result<()> { - let domains = eql_public_domain_names(); + let column_domains = eql_public_domain_names(); + let query_domains = eql_query_domain_names(); // All operators touching an EQL domain, wrapper-backed (LANGUAGE sql) or // not, with the backing function's schema. One scan, partitioned in Rust: @@ -84,10 +99,13 @@ async fn every_supported_eql_v3_operator_has_a_public_function_equivalent( LEFT JOIN pg_catalog.pg_namespace rn ON rn.oid = rt.typnamespace WHERE (ln.nspname = 'public' AND lt.typname = ANY($1)) OR (rn.nspname = 'public' AND rt.typname = ANY($1)) + OR (ln.nspname = 'eql_v3' AND lt.typname = ANY($2)) + OR (rn.nspname = 'eql_v3' AND rt.typname = ANY($2)) ORDER BY 3, 1 "#, ) - .bind(&domains) + .bind(&column_domains) + .bind(&query_domains) .fetch_all(&pool) .await?; diff --git a/tests/sqlx/tests/v3_public_surface_tests.rs b/tests/sqlx/tests/v3_public_surface_tests.rs index 4c7941098..df2030a2d 100644 --- a/tests/sqlx/tests/v3_public_surface_tests.rs +++ b/tests/sqlx/tests/v3_public_surface_tests.rs @@ -91,9 +91,11 @@ async fn public_surface(pool: &PgPool) -> Result> { } /// User-column domain names, as they appear in SQL: scalar-family domains plus -/// the hand-written JSON/JSONB domains. These MUST live in `public` (never -/// `eql_v3` or `eql_v3_internal`) so application tables using them survive EQL -/// schema uninstall. +/// the hand-written JSON/JSONB column domains. These MUST live in `public` +/// (never `eql_v3` or `eql_v3_internal`) so application tables using them +/// survive EQL schema uninstall. The query-operand domains are deliberately +/// NOT here — they are never column types and live in `eql_v3` (CIP-3442); +/// see [`query_domain_names`]. fn user_domain_names() -> Vec { let mut names = Vec::new(); for family in eql_domains::scalar_families() { @@ -105,11 +107,26 @@ fn user_domain_names() -> Vec { } } } - names.extend( - ["json", "jsonb_entry", "query_jsonb"] - .into_iter() - .map(String::from), - ); + names.extend(["json", "jsonb_entry"].into_iter().map(String::from)); + names.sort(); + names +} + +/// Query-operand domain names: the `query_` twin of every term-bearing +/// scalar domain plus the jsonb containment needle. These MUST live in +/// `eql_v3` (never `public`) — a query operand is not a column type, so it +/// stays out of the column-type namespace and is uninstalled with the EQL +/// surface (CIP-3442). +fn query_domain_names() -> Vec { + let mut names: Vec = eql_domains::scalar_families() + .flat_map(|f| { + f.domains + .iter() + .filter(|d| !d.terms.is_empty()) + .map(move |d| d.query_name(f.name)) + }) + .collect(); + names.push("query_jsonb".to_string()); names.sort(); names } @@ -251,6 +268,65 @@ async fn user_column_domains_absent_from_eql_owned_schemas(pool: PgPool) -> Resu Ok(()) } +/// #2 — Placement invariant (mirror): every query-operand domain lives in +/// `eql_v3` as a jsonb-backed domain, and none leaks into `public`. A query +/// operand is never a column type, so it is versioned and uninstalled with +/// the EQL surface instead of sharing the column domains' `public` home +/// (CIP-3442). +#[sqlx::test] +async fn query_operand_domains_are_eql_v3_jsonb_domains(pool: PgPool) -> Result<()> { + let installed: Vec<(String, String, String)> = sqlx::query_as( + r#" + SELECT n.nspname::text, t.typname::text, bt.typname::text + FROM pg_catalog.pg_type t + JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace + JOIN pg_catalog.pg_type bt ON bt.oid = t.typbasetype + WHERE n.nspname IN ('public', 'eql_v3', 'eql_v3_internal') + AND t.typtype = 'd' + AND t.typname = ANY($1) + ORDER BY t.typname + "#, + ) + .bind(query_domain_names()) + .fetch_all(&pool) + .await?; + + let misplaced: Vec = installed + .iter() + .filter(|(schema, _, _)| schema != "eql_v3") + .map(|(schema, name, _)| format!("{schema}.{name}")) + .collect(); + assert!( + misplaced.is_empty(), + "query-operand domains must live in eql_v3 only: {misplaced:?}" + ); + + let in_eql_v3: Vec<&String> = installed + .iter() + .filter(|(schema, _, _)| schema == "eql_v3") + .map(|(_, name, _)| name) + .collect(); + let missing: Vec = query_domain_names() + .into_iter() + .filter(|name| !in_eql_v3.contains(&name)) + .collect(); + assert!( + missing.is_empty(), + "query-operand domain(s) missing from eql_v3: {missing:?}" + ); + + let non_jsonb: Vec = installed + .iter() + .filter(|(_, _, base)| base != "jsonb") + .map(|(_, name, base)| format!("{name} (base {base})")) + .collect(); + assert!( + non_jsonb.is_empty(), + "eql_v3 query-operand domains must be jsonb-backed domains: {non_jsonb:?}" + ); + Ok(()) +} + /// #2 — Dependency invariant: public user-column domain CHECK constraints do not /// depend on objects in droppable EQL-owned schemas. Otherwise an EQL uninstall /// can still cascade into application table columns even when the domain type diff --git a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs index 304ba743b..755d9a41d 100644 --- a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs +++ b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs @@ -1,4 +1,4 @@ -//! CIP-3432 conformance: a term-only query operand (`public.query_` — the +//! CIP-3432 conformance: a term-only query operand (`eql_v3.query_` — the //! index terms only, NO ciphertext `c`) matches stored rows through the //! generated query operators, using FRESH ZeroKMS encryption for both the //! stored values AND the query value. @@ -61,7 +61,7 @@ async fn eq_term_only_operand_matches_exactly_the_equal_rows(pool: PgPool) -> Re ); let matches: i64 = - sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.query_integer_eq") + sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::eql_v3.query_integer_eq") .bind(operand.to_string()) .fetch_one(&pool) .await?; @@ -73,7 +73,7 @@ async fn eq_term_only_operand_matches_exactly_the_equal_rows(pool: PgPool) -> Re // A value never stored matches nothing (the eq-false branch). let absent = to_query_operand(encrypt_one(99, &[IndexKind::Unique]).await?); let none: i64 = - sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::public.query_integer_eq") + sqlx::query_scalar("SELECT count(*) FROM q WHERE val = $1::jsonb::eql_v3.query_integer_eq") .bind(absent.to_string()) .fetch_one(&pool) .await?; @@ -98,7 +98,7 @@ async fn ord_term_only_operand_orders_via_the_ore_operator(pool: PgPool) -> Resu // A term-only ordering operand for 25 (never stored): `< 25` → {10, 20}. let operand = to_query_operand(encrypt_one(25, &[IndexKind::Ore]).await?); let below: i64 = sqlx::query_scalar( - "SELECT count(*) FROM q WHERE val < $1::jsonb::public.query_integer_ord", + "SELECT count(*) FROM q WHERE val < $1::jsonb::eql_v3.query_integer_ord", ) .bind(operand.to_string()) .fetch_one(&pool) @@ -107,7 +107,7 @@ async fn ord_term_only_operand_orders_via_the_ore_operator(pool: PgPool) -> Resu // The commutator direction resolves too: `operand > val`. let above: i64 = sqlx::query_scalar( - "SELECT count(*) FROM q WHERE $1::jsonb::public.query_integer_ord > val", + "SELECT count(*) FROM q WHERE $1::jsonb::eql_v3.query_integer_ord > val", ) .bind(operand.to_string()) .fetch_one(&pool) @@ -125,7 +125,7 @@ async fn query_domain_rejects_a_ciphertext_bearing_operand(pool: PgPool) -> Resu // `c`) must not be accepted as a query operand. let stored = encrypt_one(7, &[IndexKind::Unique]).await?; assert!(stored.as_object().unwrap().contains_key("c")); - let err = sqlx::query("SELECT $1::jsonb::public.query_integer_eq") + let err = sqlx::query("SELECT $1::jsonb::eql_v3.query_integer_eq") .bind(stored.to_string()) .execute(&pool) .await diff --git a/tests/sqlx/tests/v3_uninstall_tests.rs b/tests/sqlx/tests/v3_uninstall_tests.rs index 59b66afc9..7833be142 100644 --- a/tests/sqlx/tests/v3_uninstall_tests.rs +++ b/tests/sqlx/tests/v3_uninstall_tests.rs @@ -142,7 +142,7 @@ async fn shipped_installer_can_run_over_existing_public_domains(pool: PgPool) -> FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = 'public' - AND t.typname IN ('integer_eq', 'json', 'jsonb_entry', 'query_jsonb') + AND t.typname IN ('integer_eq', 'json', 'jsonb_entry') ORDER BY 1 "#, ) @@ -154,15 +154,34 @@ async fn shipped_installer_can_run_over_existing_public_domains(pool: PgPool) -> public_domains.sort(); assert_eq!( public_domains, - vec![ - "public.integer_eq", - "public.json", - "public.jsonb_entry", - "public.query_jsonb", - ], + vec!["public.integer_eq", "public.json", "public.jsonb_entry"], "repeat install must keep public user-column domains available" ); + // The query-operand domains are NOT column types and live in the EQL-owned + // eql_v3 schema (CIP-3442); a repeat install recreates them there. + let mut query_domains: Vec = sqlx::query_scalar( + r#" + SELECT format('%I.%I', n.nspname, t.typname) + FROM pg_catalog.pg_type t + JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE n.nspname = 'eql_v3' + AND t.typname IN ('query_integer_eq', 'query_jsonb') + ORDER BY 1 + "#, + ) + .fetch_all(&pool) + .await? + .into_iter() + .map(normalize_regtype_name) + .collect(); + query_domains.sort(); + assert_eq!( + query_domains, + vec!["eql_v3.query_integer_eq", "eql_v3.query_jsonb"], + "repeat install must recreate the eql_v3 query-operand domains" + ); + Ok(()) } @@ -178,7 +197,6 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( let scalar_payload = r#"{"v":3,"i":{},"c":"scalar-42","hm":"hm-42"}"#; let json_payload = r#"{"i":{},"v":3,"sv":[{"s":"age","c":"cipher-age","hm":"hm-age"}]}"#; - let query_payload = r#"{"sv":[{"s":"age","hm":"hm-age"}]}"#; let entry_payload = r#"{"s":"age","c":"cipher-age","hm":"hm-age"}"#; sqlx::query( @@ -187,7 +205,6 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( id integer PRIMARY KEY, scalar_value public.integer_eq NOT NULL, doc_value public.json NOT NULL, - query_value public.query_jsonb NOT NULL, entry_value public.jsonb_entry ) "#, @@ -198,24 +215,37 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( sqlx::query( r#" INSERT INTO public.eql_v3_uninstall_preserve - (id, scalar_value, doc_value, query_value, entry_value) + (id, scalar_value, doc_value, entry_value) VALUES ( 1, $1::jsonb::public.integer_eq, $2::jsonb::public.json, - $3::jsonb::public.query_jsonb, - $4::jsonb::public.jsonb_entry + $3::jsonb::public.jsonb_entry ) "#, ) .bind(scalar_payload) .bind(json_payload) - .bind(query_payload) .bind(entry_payload) .execute(&pool) .await?; + // The inverse contract (CIP-3442): a query-operand domain is NOT a column + // type and lives in the EQL-owned eql_v3 schema, so a column misusing it + // is dropped with the schema. Pin that a table holding one loses exactly + // that column on uninstall (CASCADE), while the table itself survives. + sqlx::query( + r#" + CREATE TABLE public.eql_v3_uninstall_query_misuse ( + id integer PRIMARY KEY, + misused_query_value eql_v3.query_jsonb + ) + "#, + ) + .execute(&pool) + .await?; + run_shipped_uninstaller(&pool).await?; assert_eq!( @@ -260,22 +290,15 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( "pg_catalog.int4", "public.integer_eq", "public.json", - "public.query_jsonb", "public.jsonb_entry", ] ); - let values: ( - serde_json::Value, - serde_json::Value, - serde_json::Value, - serde_json::Value, - ) = sqlx::query_as( + let values: (serde_json::Value, serde_json::Value, serde_json::Value) = sqlx::query_as( r#" SELECT scalar_value::jsonb, doc_value::jsonb, - query_value::jsonb, entry_value::jsonb FROM public.eql_v3_uninstall_preserve WHERE id = 1 @@ -293,11 +316,35 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( ); assert_eq!( values.2, - serde_json::from_str::(query_payload)? + serde_json::from_str::(entry_payload)? ); + + // The misuse table survives, but its query-operand column went down with + // the eql_v3 schema (DROP SCHEMA ... CASCADE drops the domain, which + // cascades to columns of that type). + assert!( + table_exists(&pool, "eql_v3_uninstall_query_misuse").await?, + "the misuse table itself must survive uninstall" + ); + let misuse_columns: Vec = sqlx::query_scalar( + r#" + SELECT a.attname + FROM pg_catalog.pg_attribute a + JOIN pg_catalog.pg_class c ON c.oid = a.attrelid + JOIN pg_catalog.pg_namespace cn ON cn.oid = c.relnamespace + WHERE cn.nspname = 'public' + AND c.relname = 'eql_v3_uninstall_query_misuse' + AND a.attnum > 0 + AND NOT a.attisdropped + ORDER BY a.attnum + "#, + ) + .fetch_all(&pool) + .await?; assert_eq!( - values.3, - serde_json::from_str::(entry_payload)? + misuse_columns, + vec!["id"], + "a column typed as an eql_v3 query-operand domain is dropped with the schema" ); Ok(()) From 457f3a77103990def867143f826a3c0bbfdd11be Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 7 Jul 2026 11:51:16 +1000 Subject: [PATCH 557/599] feat(typescript): scaffold @cipherstash/eql package --- .npmrc | 2 + package.json | 18 + packages/eql/README.md | 13 + packages/eql/package.json | 55 ++ packages/eql/src/index.ts | 3 + packages/eql/src/schema.ts | 9 + packages/eql/src/sql.ts | 47 + packages/eql/tsconfig.json | 14 + packages/eql/tsup.config.ts | 14 + pnpm-lock.yaml | 1602 +++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 11 + 11 files changed, 1788 insertions(+) create mode 100644 .npmrc create mode 100644 package.json create mode 100644 packages/eql/README.md create mode 100644 packages/eql/package.json create mode 100644 packages/eql/src/index.ts create mode 100644 packages/eql/src/schema.ts create mode 100644 packages/eql/src/sql.ts create mode 100644 packages/eql/tsconfig.json create mode 100644 packages/eql/tsup.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..30bff92b1 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +@cipherstash:registry=https://registry.npmjs.org/ +registry=https://registry.npmjs.org/ diff --git a/package.json b/package.json new file mode 100644 index 000000000..36b7ff3d6 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "@cipherstash/eql-workspace", + "private": true, + "type": "module", + "packageManager": "pnpm@10.33.2", + "scripts": { + "build": "pnpm --filter @cipherstash/eql build", + "test": "pnpm --filter @cipherstash/eql test", + "types:generate": "pnpm --filter @cipherstash/eql sync:generated", + "types:check": "pnpm --filter @cipherstash/eql check:generated" + }, + "devDependencies": { + "@types/node": "^22.13.14", + "tsup": "^8.5.0", + "typescript": "^5.8.3", + "vitest": "^3.2.4" + } +} diff --git a/packages/eql/README.md b/packages/eql/README.md new file mode 100644 index 000000000..172f62594 --- /dev/null +++ b/packages/eql/README.md @@ -0,0 +1,13 @@ +# @cipherstash/eql + +Canonical EQL v3 TypeScript wire types, JSON Schemas, and SQL release assets. + +```ts +import type { IntegerEq, TextSearch } from '@cipherstash/eql' +import { schemaId } from '@cipherstash/eql/schema' +import { readInstallSql, releaseManifest } from '@cipherstash/eql/sql' +``` + +The generated TypeScript types and JSON Schemas come from the Rust +`eql-bindings` crate. The SQL files bundled in a published package are built +from the same repository commit and release identity as the generated bindings. diff --git a/packages/eql/package.json b/packages/eql/package.json new file mode 100644 index 000000000..20d260673 --- /dev/null +++ b/packages/eql/package.json @@ -0,0 +1,55 @@ +{ + "name": "@cipherstash/eql", + "version": "0.0.0", + "description": "Canonical EQL v3 wire types, JSON schemas, and SQL bundle.", + "keywords": ["eql", "cipherstash", "encryption", "postgres", "typescript"], + "bugs": { + "url": "https://github.com/cipherstash/encrypt-query-language/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cipherstash/encrypt-query-language.git", + "directory": "packages/eql" + }, + "license": "MIT", + "author": "CipherStash ", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "./schema": { + "types": "./dist/schema.d.ts", + "import": "./dist/schema.js", + "require": "./dist/schema.cjs" + }, + "./schema/v3/*.json": "./dist/schema/v3/*.json", + "./sql": { + "types": "./dist/sql.d.ts", + "import": "./dist/sql.js", + "require": "./dist/sql.cjs" + }, + "./sql/*": "./dist/sql/*", + "./package.json": "./package.json" + }, + "files": ["dist", "README.md"], + "scripts": { + "sync:generated": "node scripts/sync-generated.mjs", + "check:generated": "node scripts/sync-generated.mjs --check", + "build": "tsup", + "dev": "tsup --watch", + "test": "vitest run", + "release": "pnpm run check:generated && pnpm run build && npm publish --access public --provenance" + }, + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@types/node": "catalog:", + "tsup": "catalog:", + "typescript": "catalog:", + "vitest": "catalog:" + } +} diff --git a/packages/eql/src/index.ts b/packages/eql/src/index.ts new file mode 100644 index 000000000..5367bf6c5 --- /dev/null +++ b/packages/eql/src/index.ts @@ -0,0 +1,3 @@ +export type * from './generated/v3' +export { schemaIds, schemaNames } from './schema' +export type { EqlReleaseManifest } from './sql' diff --git a/packages/eql/src/schema.ts b/packages/eql/src/schema.ts new file mode 100644 index 000000000..652fd21be --- /dev/null +++ b/packages/eql/src/schema.ts @@ -0,0 +1,9 @@ +import { schemaIds, schemaNames } from './generated/schema-manifest' + +export { schemaIds, schemaNames } + +export type EqlSchemaName = (typeof schemaNames)[number] + +export function schemaId(name: EqlSchemaName): string { + return schemaIds[name] +} diff --git a/packages/eql/src/sql.ts b/packages/eql/src/sql.ts new file mode 100644 index 000000000..a909e2c05 --- /dev/null +++ b/packages/eql/src/sql.ts @@ -0,0 +1,47 @@ +import { existsSync, readFileSync } from 'node:fs' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { releaseManifest } from './generated/release-manifest' + +export interface EqlReleaseManifest { + eqlVersion: string + schemaVersion: 3 + installSqlSha256: string + uninstallSqlSha256: string +} + +declare const __dirname: string | undefined + +const here = + typeof __dirname === 'string' + ? __dirname + : dirname(fileURLToPath(import.meta.url)) + +const sqlDir = existsSync(join(here, 'sql')) + ? join(here, 'sql') + : join(here, '..', 'sql') + +export { releaseManifest } + +export function installSqlPath(): string { + return join(sqlDir, 'cipherstash-encrypt.sql') +} + +export function uninstallSqlPath(): string { + return join(sqlDir, 'cipherstash-encrypt-uninstall.sql') +} + +export function readInstallSql(): string { + return readSqlFile(installSqlPath()) +} + +export function readUninstallSql(): string { + return readSqlFile(uninstallSqlPath()) +} + +function readSqlFile(path: string): string { + if (!existsSync(path)) { + throw new Error(`EQL SQL asset is missing from package: ${path}`) + } + return readFileSync(path, 'utf8') +} diff --git a/packages/eql/tsconfig.json b/packages/eql/tsconfig.json new file mode 100644 index 000000000..32f4794c2 --- /dev/null +++ b/packages/eql/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "skipLibCheck": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/eql/tsup.config.ts b/packages/eql/tsup.config.ts new file mode 100644 index 000000000..7ff355c99 --- /dev/null +++ b/packages/eql/tsup.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['src/index.ts', 'src/schema.ts', 'src/sql.ts'], + format: ['cjs', 'esm'], + sourcemap: true, + dts: true, + clean: true, + external: ['node:fs', 'node:path', 'node:url'], + async onSuccess() { + const { copyAssets } = await import('./scripts/copy-assets.mjs') + await copyAssets() + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..47a82b5bc --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1602 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +catalogs: + default: + '@types/node': + specifier: ^22.13.14 + version: 22.20.0 + tsup: + specifier: ^8.5.0 + version: 8.5.1 + typescript: + specifier: ^5.8.3 + version: 5.9.3 + vitest: + specifier: ^3.2.4 + version: 3.2.6 + +importers: + + .: + devDependencies: + '@types/node': + specifier: ^22.13.14 + version: 22.20.0 + tsup: + specifier: ^8.5.0 + version: 8.5.1(postcss@8.5.16)(typescript@5.9.3) + typescript: + specifier: ^5.8.3 + version: 5.9.3 + vitest: + specifier: ^3.2.4 + version: 3.2.6(@types/node@22.20.0) + + packages/eql: + devDependencies: + '@types/node': + specifier: 'catalog:' + version: 22.20.0 + tsup: + specifier: 'catalog:' + version: 8.5.1(postcss@8.5.16)(typescript@5.9.3) + typescript: + specifier: 'catalog:' + version: 5.9.3 + vitest: + specifier: 'catalog:' + version: 3.2.6(@types/node@22.20.0) + +packages: + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + cpu: [x64] + os: [win32] + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/node@22.20.0': + resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} + + '@vitest/expect@3.2.6': + resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} + + '@vitest/mocker@3.2.6': + resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.6': + resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} + + '@vitest/runner@3.2.6': + resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} + + '@vitest/snapshot@3.2.6': + resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} + + '@vitest/spy@3.2.6': + resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} + + '@vitest/utils@3.2.6': + resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + engines: {node: ^10 || ^12 || >=14} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.6: + resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.6 + '@vitest/ui': 3.2.6 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + +snapshots: + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/node@22.20.0': + dependencies: + undici-types: 6.21.0 + + '@vitest/expect@3.2.6': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.6(vite@7.3.6(@types/node@22.20.0))': + dependencies: + '@vitest/spy': 3.2.6 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.6(@types/node@22.20.0) + + '@vitest/pretty-format@3.2.6': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.6': + dependencies: + '@vitest/utils': 3.2.6 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.6': + dependencies: + '@vitest/pretty-format': 3.2.6 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.6': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.6': + dependencies: + '@vitest/pretty-format': 3.2.6 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + acorn@8.17.0: {} + + any-promise@1.3.0: {} + + assertion-error@2.0.1: {} + + bundle-require@5.1.0(esbuild@0.27.7): + dependencies: + esbuild: 0.27.7 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + check-error@2.1.3: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + commander@4.1.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + es-module-lexer@1.7.0: {} + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + expect-type@1.4.0: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.62.2 + + fsevents@2.3.3: + optional: true + + joycon@3.1.1: {} + + js-tokens@9.0.1: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + loupe@3.2.1: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mlly@1.8.2: + dependencies: + acorn: 8.17.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.15: {} + + object-assign@4.1.1: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + postcss-load-config@6.0.1(postcss@8.5.16): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.16 + + postcss@8.5.16: + dependencies: + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + readdirp@4.1.2: {} + + resolve-from@5.0.0: {} + + rollup@4.62.2: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 + fsevents: 2.3.3 + + siginfo@2.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.7.6: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tsup@8.5.1(postcss@8.5.16)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.7) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.16) + resolve-from: 5.0.0 + rollup: 4.62.2 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.16 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + typescript@5.9.3: {} + + ufo@1.6.4: {} + + undici-types@6.21.0: {} + + vite-node@3.2.4(@types/node@22.20.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.6(@types/node@22.20.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.6(@types/node@22.20.0): + dependencies: + esbuild: 0.28.1 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.16 + rollup: 4.62.2 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.20.0 + fsevents: 2.3.3 + + vitest@3.2.6(@types/node@22.20.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.6 + '@vitest/mocker': 3.2.6(vite@7.3.6(@types/node@22.20.0)) + '@vitest/pretty-format': 3.2.6 + '@vitest/runner': 3.2.6 + '@vitest/snapshot': 3.2.6 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.4.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.6(@types/node@22.20.0) + vite-node: 3.2.4(@types/node@22.20.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.20.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..0dbf0b7a7 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,11 @@ +packages: + - "packages/*" + +catalog: + "@types/node": "^22.13.14" + "tsup": "^8.5.0" + "typescript": "^5.8.3" + "vitest": "^3.2.4" + +minimumReleaseAge: 10080 +blockExoticSubdeps: true From 0ee038ab15f2b3012bd1e85af29ef60218fa29a3 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 7 Jul 2026 11:52:54 +1000 Subject: [PATCH 558/599] feat(typescript): generate npm package types and schemas --- mise.toml | 33 ++++- packages/eql/scripts/copy-assets.mjs | 23 ++++ packages/eql/scripts/sync-generated.mjs | 116 ++++++++++++++++ .../eql/src/generated/release-manifest.ts | 6 + packages/eql/src/generated/schema-manifest.ts | 107 +++++++++++++++ .../eql/src/generated/schema/v3/bigint.json | 54 ++++++++ .../src/generated/schema/v3/bigint_eq.json | 62 +++++++++ .../src/generated/schema/v3/bigint_ord.json | 65 +++++++++ .../generated/schema/v3/bigint_ord_ope.json | 62 +++++++++ .../generated/schema/v3/bigint_ord_ore.json | 65 +++++++++ .../eql/src/generated/schema/v3/boolean.json | 54 ++++++++ .../eql/src/generated/schema/v3/date.json | 54 ++++++++ .../eql/src/generated/schema/v3/date_eq.json | 62 +++++++++ .../eql/src/generated/schema/v3/date_ord.json | 65 +++++++++ .../src/generated/schema/v3/date_ord_ope.json | 62 +++++++++ .../src/generated/schema/v3/date_ord_ore.json | 65 +++++++++ .../eql/src/generated/schema/v3/double.json | 54 ++++++++ .../src/generated/schema/v3/double_eq.json | 62 +++++++++ .../src/generated/schema/v3/double_ord.json | 65 +++++++++ .../generated/schema/v3/double_ord_ope.json | 62 +++++++++ .../generated/schema/v3/double_ord_ore.json | 65 +++++++++ .../eql/src/generated/schema/v3/integer.json | 54 ++++++++ .../src/generated/schema/v3/integer_eq.json | 62 +++++++++ .../src/generated/schema/v3/integer_ord.json | 65 +++++++++ .../generated/schema/v3/integer_ord_ope.json | 62 +++++++++ .../generated/schema/v3/integer_ord_ore.json | 65 +++++++++ .../eql/src/generated/schema/v3/json.json | 124 ++++++++++++++++++ .../src/generated/schema/v3/jsonb_entry.json | 67 ++++++++++ .../src/generated/schema/v3/jsonb_query.json | 69 ++++++++++ .../eql/src/generated/schema/v3/numeric.json | 54 ++++++++ .../src/generated/schema/v3/numeric_eq.json | 62 +++++++++ .../src/generated/schema/v3/numeric_ord.json | 65 +++++++++ .../generated/schema/v3/numeric_ord_ope.json | 62 +++++++++ .../generated/schema/v3/numeric_ord_ore.json | 65 +++++++++ .../eql/src/generated/schema/v3/real.json | 54 ++++++++ .../eql/src/generated/schema/v3/real_eq.json | 62 +++++++++ .../eql/src/generated/schema/v3/real_ord.json | 65 +++++++++ .../src/generated/schema/v3/real_ord_ope.json | 62 +++++++++ .../src/generated/schema/v3/real_ord_ore.json | 65 +++++++++ .../eql/src/generated/schema/v3/smallint.json | 54 ++++++++ .../src/generated/schema/v3/smallint_eq.json | 62 +++++++++ .../src/generated/schema/v3/smallint_ord.json | 65 +++++++++ .../generated/schema/v3/smallint_ord_ope.json | 62 +++++++++ .../generated/schema/v3/smallint_ord_ore.json | 65 +++++++++ .../eql/src/generated/schema/v3/text.json | 54 ++++++++ .../eql/src/generated/schema/v3/text_eq.json | 62 +++++++++ .../src/generated/schema/v3/text_match.json | 68 ++++++++++ .../eql/src/generated/schema/v3/text_ord.json | 73 +++++++++++ .../src/generated/schema/v3/text_ord_ope.json | 70 ++++++++++ .../src/generated/schema/v3/text_ord_ore.json | 73 +++++++++++ .../src/generated/schema/v3/text_search.json | 87 ++++++++++++ .../src/generated/schema/v3/timestamp.json | 54 ++++++++ .../src/generated/schema/v3/timestamp_eq.json | 62 +++++++++ .../generated/schema/v3/timestamp_ord.json | 65 +++++++++ .../schema/v3/timestamp_ord_ope.json | 62 +++++++++ .../schema/v3/timestamp_ord_ore.json | 65 +++++++++ packages/eql/src/generated/v3/Bigint.ts | 11 ++ packages/eql/src/generated/v3/BigintEq.ts | 12 ++ packages/eql/src/generated/v3/BigintOrd.ts | 12 ++ packages/eql/src/generated/v3/BigintOrdOpe.ts | 12 ++ packages/eql/src/generated/v3/BigintOrdOre.ts | 12 ++ packages/eql/src/generated/v3/BloomFilter.ts | 11 ++ packages/eql/src/generated/v3/Boolean.ts | 11 ++ packages/eql/src/generated/v3/Ciphertext.ts | 8 ++ packages/eql/src/generated/v3/Date.ts | 11 ++ packages/eql/src/generated/v3/DateEq.ts | 12 ++ packages/eql/src/generated/v3/DateOrd.ts | 12 ++ packages/eql/src/generated/v3/DateOrdOpe.ts | 12 ++ packages/eql/src/generated/v3/DateOrdOre.ts | 12 ++ packages/eql/src/generated/v3/Double.ts | 11 ++ packages/eql/src/generated/v3/DoubleEq.ts | 12 ++ packages/eql/src/generated/v3/DoubleOrd.ts | 12 ++ packages/eql/src/generated/v3/DoubleOrdOpe.ts | 12 ++ packages/eql/src/generated/v3/DoubleOrdOre.ts | 12 ++ packages/eql/src/generated/v3/Hmac256.ts | 7 + packages/eql/src/generated/v3/Identifier.ts | 16 +++ packages/eql/src/generated/v3/Integer.ts | 11 ++ packages/eql/src/generated/v3/IntegerEq.ts | 12 ++ packages/eql/src/generated/v3/IntegerOrd.ts | 12 ++ .../eql/src/generated/v3/IntegerOrdOpe.ts | 12 ++ .../eql/src/generated/v3/IntegerOrdOre.ts | 12 ++ packages/eql/src/generated/v3/Numeric.ts | 11 ++ packages/eql/src/generated/v3/NumericEq.ts | 12 ++ packages/eql/src/generated/v3/NumericOrd.ts | 12 ++ .../eql/src/generated/v3/NumericOrdOpe.ts | 12 ++ .../eql/src/generated/v3/NumericOrdOre.ts | 12 ++ packages/eql/src/generated/v3/OpeCllw.ts | 11 ++ packages/eql/src/generated/v3/OreBlock256.ts | 11 ++ packages/eql/src/generated/v3/OreCllw.ts | 9 ++ packages/eql/src/generated/v3/Real.ts | 11 ++ packages/eql/src/generated/v3/RealEq.ts | 12 ++ packages/eql/src/generated/v3/RealOrd.ts | 12 ++ packages/eql/src/generated/v3/RealOrdOpe.ts | 12 ++ packages/eql/src/generated/v3/RealOrdOre.ts | 12 ++ .../eql/src/generated/v3/SchemaVersion.ts | 12 ++ packages/eql/src/generated/v3/Selector.ts | 7 + packages/eql/src/generated/v3/Smallint.ts | 11 ++ packages/eql/src/generated/v3/SmallintEq.ts | 12 ++ packages/eql/src/generated/v3/SmallintOrd.ts | 12 ++ .../eql/src/generated/v3/SmallintOrdOpe.ts | 12 ++ .../eql/src/generated/v3/SmallintOrdOre.ts | 12 ++ .../eql/src/generated/v3/SteVecDocument.ts | 12 ++ packages/eql/src/generated/v3/SteVecEntry.ts | 13 ++ packages/eql/src/generated/v3/SteVecForm.ts | 20 +++ packages/eql/src/generated/v3/SteVecQuery.ts | 7 + .../eql/src/generated/v3/SteVecQueryEntry.ts | 11 ++ packages/eql/src/generated/v3/SteVecTerm.ts | 9 ++ packages/eql/src/generated/v3/Text.ts | 11 ++ packages/eql/src/generated/v3/TextEq.ts | 12 ++ packages/eql/src/generated/v3/TextMatch.ts | 12 ++ packages/eql/src/generated/v3/TextOrd.ts | 13 ++ packages/eql/src/generated/v3/TextOrdOpe.ts | 13 ++ packages/eql/src/generated/v3/TextOrdOre.ts | 13 ++ packages/eql/src/generated/v3/TextSearch.ts | 14 ++ packages/eql/src/generated/v3/Timestamp.ts | 11 ++ packages/eql/src/generated/v3/TimestampEq.ts | 12 ++ packages/eql/src/generated/v3/TimestampOrd.ts | 12 ++ .../eql/src/generated/v3/TimestampOrdOpe.ts | 12 ++ .../eql/src/generated/v3/TimestampOrdOre.ts | 12 ++ packages/eql/src/generated/v3/index.ts | 63 +++++++++ 120 files changed, 4345 insertions(+), 3 deletions(-) create mode 100644 packages/eql/scripts/copy-assets.mjs create mode 100644 packages/eql/scripts/sync-generated.mjs create mode 100644 packages/eql/src/generated/release-manifest.ts create mode 100644 packages/eql/src/generated/schema-manifest.ts create mode 100644 packages/eql/src/generated/schema/v3/bigint.json create mode 100644 packages/eql/src/generated/schema/v3/bigint_eq.json create mode 100644 packages/eql/src/generated/schema/v3/bigint_ord.json create mode 100644 packages/eql/src/generated/schema/v3/bigint_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/bigint_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/boolean.json create mode 100644 packages/eql/src/generated/schema/v3/date.json create mode 100644 packages/eql/src/generated/schema/v3/date_eq.json create mode 100644 packages/eql/src/generated/schema/v3/date_ord.json create mode 100644 packages/eql/src/generated/schema/v3/date_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/date_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/double.json create mode 100644 packages/eql/src/generated/schema/v3/double_eq.json create mode 100644 packages/eql/src/generated/schema/v3/double_ord.json create mode 100644 packages/eql/src/generated/schema/v3/double_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/double_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/integer.json create mode 100644 packages/eql/src/generated/schema/v3/integer_eq.json create mode 100644 packages/eql/src/generated/schema/v3/integer_ord.json create mode 100644 packages/eql/src/generated/schema/v3/integer_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/integer_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/json.json create mode 100644 packages/eql/src/generated/schema/v3/jsonb_entry.json create mode 100644 packages/eql/src/generated/schema/v3/jsonb_query.json create mode 100644 packages/eql/src/generated/schema/v3/numeric.json create mode 100644 packages/eql/src/generated/schema/v3/numeric_eq.json create mode 100644 packages/eql/src/generated/schema/v3/numeric_ord.json create mode 100644 packages/eql/src/generated/schema/v3/numeric_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/numeric_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/real.json create mode 100644 packages/eql/src/generated/schema/v3/real_eq.json create mode 100644 packages/eql/src/generated/schema/v3/real_ord.json create mode 100644 packages/eql/src/generated/schema/v3/real_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/real_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/smallint.json create mode 100644 packages/eql/src/generated/schema/v3/smallint_eq.json create mode 100644 packages/eql/src/generated/schema/v3/smallint_ord.json create mode 100644 packages/eql/src/generated/schema/v3/smallint_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/smallint_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/text.json create mode 100644 packages/eql/src/generated/schema/v3/text_eq.json create mode 100644 packages/eql/src/generated/schema/v3/text_match.json create mode 100644 packages/eql/src/generated/schema/v3/text_ord.json create mode 100644 packages/eql/src/generated/schema/v3/text_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/text_ord_ore.json create mode 100644 packages/eql/src/generated/schema/v3/text_search.json create mode 100644 packages/eql/src/generated/schema/v3/timestamp.json create mode 100644 packages/eql/src/generated/schema/v3/timestamp_eq.json create mode 100644 packages/eql/src/generated/schema/v3/timestamp_ord.json create mode 100644 packages/eql/src/generated/schema/v3/timestamp_ord_ope.json create mode 100644 packages/eql/src/generated/schema/v3/timestamp_ord_ore.json create mode 100644 packages/eql/src/generated/v3/Bigint.ts create mode 100644 packages/eql/src/generated/v3/BigintEq.ts create mode 100644 packages/eql/src/generated/v3/BigintOrd.ts create mode 100644 packages/eql/src/generated/v3/BigintOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/BigintOrdOre.ts create mode 100644 packages/eql/src/generated/v3/BloomFilter.ts create mode 100644 packages/eql/src/generated/v3/Boolean.ts create mode 100644 packages/eql/src/generated/v3/Ciphertext.ts create mode 100644 packages/eql/src/generated/v3/Date.ts create mode 100644 packages/eql/src/generated/v3/DateEq.ts create mode 100644 packages/eql/src/generated/v3/DateOrd.ts create mode 100644 packages/eql/src/generated/v3/DateOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/DateOrdOre.ts create mode 100644 packages/eql/src/generated/v3/Double.ts create mode 100644 packages/eql/src/generated/v3/DoubleEq.ts create mode 100644 packages/eql/src/generated/v3/DoubleOrd.ts create mode 100644 packages/eql/src/generated/v3/DoubleOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/DoubleOrdOre.ts create mode 100644 packages/eql/src/generated/v3/Hmac256.ts create mode 100644 packages/eql/src/generated/v3/Identifier.ts create mode 100644 packages/eql/src/generated/v3/Integer.ts create mode 100644 packages/eql/src/generated/v3/IntegerEq.ts create mode 100644 packages/eql/src/generated/v3/IntegerOrd.ts create mode 100644 packages/eql/src/generated/v3/IntegerOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/IntegerOrdOre.ts create mode 100644 packages/eql/src/generated/v3/Numeric.ts create mode 100644 packages/eql/src/generated/v3/NumericEq.ts create mode 100644 packages/eql/src/generated/v3/NumericOrd.ts create mode 100644 packages/eql/src/generated/v3/NumericOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/NumericOrdOre.ts create mode 100644 packages/eql/src/generated/v3/OpeCllw.ts create mode 100644 packages/eql/src/generated/v3/OreBlock256.ts create mode 100644 packages/eql/src/generated/v3/OreCllw.ts create mode 100644 packages/eql/src/generated/v3/Real.ts create mode 100644 packages/eql/src/generated/v3/RealEq.ts create mode 100644 packages/eql/src/generated/v3/RealOrd.ts create mode 100644 packages/eql/src/generated/v3/RealOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/RealOrdOre.ts create mode 100644 packages/eql/src/generated/v3/SchemaVersion.ts create mode 100644 packages/eql/src/generated/v3/Selector.ts create mode 100644 packages/eql/src/generated/v3/Smallint.ts create mode 100644 packages/eql/src/generated/v3/SmallintEq.ts create mode 100644 packages/eql/src/generated/v3/SmallintOrd.ts create mode 100644 packages/eql/src/generated/v3/SmallintOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/SmallintOrdOre.ts create mode 100644 packages/eql/src/generated/v3/SteVecDocument.ts create mode 100644 packages/eql/src/generated/v3/SteVecEntry.ts create mode 100644 packages/eql/src/generated/v3/SteVecForm.ts create mode 100644 packages/eql/src/generated/v3/SteVecQuery.ts create mode 100644 packages/eql/src/generated/v3/SteVecQueryEntry.ts create mode 100644 packages/eql/src/generated/v3/SteVecTerm.ts create mode 100644 packages/eql/src/generated/v3/Text.ts create mode 100644 packages/eql/src/generated/v3/TextEq.ts create mode 100644 packages/eql/src/generated/v3/TextMatch.ts create mode 100644 packages/eql/src/generated/v3/TextOrd.ts create mode 100644 packages/eql/src/generated/v3/TextOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/TextOrdOre.ts create mode 100644 packages/eql/src/generated/v3/TextSearch.ts create mode 100644 packages/eql/src/generated/v3/Timestamp.ts create mode 100644 packages/eql/src/generated/v3/TimestampEq.ts create mode 100644 packages/eql/src/generated/v3/TimestampOrd.ts create mode 100644 packages/eql/src/generated/v3/TimestampOrdOpe.ts create mode 100644 packages/eql/src/generated/v3/TimestampOrdOre.ts create mode 100644 packages/eql/src/generated/v3/index.ts diff --git a/mise.toml b/mise.toml index 29f95a08e..85ce98a60 100644 --- a/mise.toml +++ b/mise.toml @@ -250,12 +250,13 @@ depends = ["types:generate"] run = """ #!/usr/bin/env bash set -euo pipefail -git diff --exit-code -- crates/eql-bindings/src/v3 crates/eql-bindings/bindings crates/eql-bindings/schema || { - echo "eql-bindings generated Rust/TS/JSON are stale — run 'mise run types:generate' and commit the result" >&2 +pnpm --filter @cipherstash/eql sync:generated +git diff --exit-code -- crates/eql-bindings/src/v3 crates/eql-bindings/bindings crates/eql-bindings/schema packages/eql/src/generated || { + echo "eql-bindings generated Rust/TS/JSON or @cipherstash/eql package output is stale — run 'mise run types:generate' and 'mise run typescript:generate' and commit the result" >&2 exit 1 } # git diff is blind to brand-new files; untracked output is stale too. -untracked=$(git ls-files --others --exclude-standard -- crates/eql-bindings/src/v3 crates/eql-bindings/bindings crates/eql-bindings/schema) +untracked=$(git ls-files --others --exclude-standard -- crates/eql-bindings/src/v3 crates/eql-bindings/bindings crates/eql-bindings/schema packages/eql/src/generated) if [ -n "$untracked" ]; then echo "eql-bindings has uncommitted generated files:" >&2 echo "$untracked" >&2 @@ -263,6 +264,32 @@ if [ -n "$untracked" ]; then fi """ +[tasks."typescript:generate"] +description = "Regenerate @cipherstash/eql TypeScript package source from eql-bindings outputs" +dir = "{{config_root}}" +depends = ["types:generate"] +run = "pnpm --filter @cipherstash/eql sync:generated" + +[tasks."typescript:check"] +description = "Verify @cipherstash/eql generated package source is fresh" +dir = "{{config_root}}" +depends = ["types:generate"] +run = """ +#!/usr/bin/env bash +set -euo pipefail +pnpm --filter @cipherstash/eql sync:generated +git diff --exit-code -- packages/eql/src/generated || { + echo "@cipherstash/eql generated files are stale — run 'mise run typescript:generate' and commit the result" >&2 + exit 1 +} +untracked=$(git ls-files --others --exclude-standard -- packages/eql/src/generated) +if [ -n "$untracked" ]; then + echo "@cipherstash/eql has uncommitted generated files:" >&2 + echo "$untracked" >&2 + exit 1 +fi +""" + [tasks."test:matrix:inventory"] description = "Verify the matrix test-name set against the canonical snapshot (its derived eq-only subset, the committed text superset, or the storage-only set), catalog-cross-checked (no database required)" dir = "{{config_root}}/tests/sqlx" diff --git a/packages/eql/scripts/copy-assets.mjs b/packages/eql/scripts/copy-assets.mjs new file mode 100644 index 000000000..cc4439f6d --- /dev/null +++ b/packages/eql/scripts/copy-assets.mjs @@ -0,0 +1,23 @@ +import { cpSync, existsSync, mkdirSync, rmSync } from 'node:fs' +import { dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..') +const repoRoot = resolve(packageRoot, '../..') + +export async function copyAssets() { + const dist = join(packageRoot, 'dist') + const schemaSrc = join(packageRoot, 'src/generated/schema') + const sqlSrc = join(packageRoot, 'sql') + + mkdirSync(dist, { recursive: true }) + + rmSync(join(dist, 'schema'), { recursive: true, force: true }) + cpSync(schemaSrc, join(dist, 'schema'), { recursive: true }) + + rmSync(join(dist, 'sql'), { recursive: true, force: true }) + if (!existsSync(sqlSrc)) { + throw new Error('packages/eql/sql is missing; run mise run release:prepare_bindings_assets --version before building a release package') + } + cpSync(sqlSrc, join(dist, 'sql'), { recursive: true }) +} diff --git a/packages/eql/scripts/sync-generated.mjs b/packages/eql/scripts/sync-generated.mjs new file mode 100644 index 000000000..d785162e0 --- /dev/null +++ b/packages/eql/scripts/sync-generated.mjs @@ -0,0 +1,116 @@ +import { + existsSync, + mkdirSync, + readFileSync, + readdirSync, + rmSync, + statSync, + writeFileSync, +} from 'node:fs' +import { basename, dirname, join, relative, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..') +const repoRoot = resolve(packageRoot, '../..') +const check = process.argv.includes('--check') + +const sourceBindings = join(repoRoot, 'crates/eql-bindings/bindings/v3') +const sourceSchemas = join(repoRoot, 'crates/eql-bindings/schema/v3') +const generatedRoot = join(packageRoot, 'src/generated') +const generatedBindings = join(generatedRoot, 'v3') +const generatedSchemas = join(generatedRoot, 'schema/v3') + +function listFiles(dir, suffix) { + return readdirSorted(dir).filter((name) => name.endsWith(suffix)) +} + +function readdirSorted(dir) { + return readdirSync(dir).sort((a, b) => a.localeCompare(b)) +} + +function read(path) { + return readFileSync(path, 'utf8') +} + +function write(path, contents) { + mkdirSync(dirname(path), { recursive: true }) + writeFileSync(path, contents) +} + +function copyText(src, dest) { + write(dest, read(src)) +} + +function renderTypeBarrel(files) { + const exports = files + .map((file) => `export type * from './${basename(file, '.ts')}'`) + .join('\n') + return `${exports}\n` +} + +function renderSchemaManifest(files) { + const entries = files.map((file) => { + const name = basename(file, '.json') + const json = JSON.parse(read(join(sourceSchemas, file))) + return { name, id: json.$id } + }) + const names = entries.map((entry) => ` '${entry.name}',`).join('\n') + const ids = entries.map((entry) => ` ${JSON.stringify(entry.name)}: ${JSON.stringify(entry.id)},`).join('\n') + return `export const schemaNames = [\n${names}\n] as const\n\nexport const schemaIds = {\n${ids}\n} as const\n` +} + +function renderReleaseManifest() { + if (preservedReleaseManifest !== undefined) return preservedReleaseManifest + return `export const releaseManifest = {\n eqlVersion: 'DEV',\n schemaVersion: 3,\n installSqlSha256: '',\n uninstallSqlSha256: '',\n} as const\n` +} + +function snapshot(dir) { + if (!existsSync(dir)) return new Map() + const out = new Map() + walk(dir, (path) => out.set(relative(dir, path), read(path))) + return out +} + +function walk(dir, visit) { + for (const name of readdirSorted(dir)) { + const path = join(dir, name) + const stat = statSync(path) + if (stat.isDirectory()) walk(path, visit) + else visit(path) + } +} + +function assertUnchanged(before, dir) { + const after = snapshot(dir) + const beforeJson = JSON.stringify([...before.entries()].sort()) + const afterJson = JSON.stringify([...after.entries()].sort()) + if (beforeJson !== afterJson) { + throw new Error('@cipherstash/eql generated files are stale; run `pnpm --filter @cipherstash/eql sync:generated`') + } +} + +const before = snapshot(generatedRoot) +const releaseManifestPath = join(generatedRoot, 'release-manifest.ts') +const preservedReleaseManifest = existsSync(releaseManifestPath) + ? read(releaseManifestPath) + : undefined +rmSync(generatedRoot, { recursive: true, force: true }) + +const bindingFiles = listFiles(sourceBindings, '.ts') +for (const file of bindingFiles) { + copyText(join(sourceBindings, file), join(generatedBindings, file)) +} +write(join(generatedBindings, 'index.ts'), renderTypeBarrel(bindingFiles)) + +const schemaFiles = listFiles(sourceSchemas, '.json') +for (const file of schemaFiles) { + copyText(join(sourceSchemas, file), join(generatedSchemas, file)) +} +write(join(generatedRoot, 'schema-manifest.ts'), renderSchemaManifest(schemaFiles)) +write(join(generatedRoot, 'release-manifest.ts'), renderReleaseManifest()) + +if (check) { + assertUnchanged(before, generatedRoot) +} + +console.log(`synced ${bindingFiles.length} TypeScript bindings and ${schemaFiles.length} JSON schemas`) diff --git a/packages/eql/src/generated/release-manifest.ts b/packages/eql/src/generated/release-manifest.ts new file mode 100644 index 000000000..26d825c59 --- /dev/null +++ b/packages/eql/src/generated/release-manifest.ts @@ -0,0 +1,6 @@ +export const releaseManifest = { + eqlVersion: 'DEV', + schemaVersion: 3, + installSqlSha256: '', + uninstallSqlSha256: '', +} as const diff --git a/packages/eql/src/generated/schema-manifest.ts b/packages/eql/src/generated/schema-manifest.ts new file mode 100644 index 000000000..0ab6804fb --- /dev/null +++ b/packages/eql/src/generated/schema-manifest.ts @@ -0,0 +1,107 @@ +export const schemaNames = [ + 'bigint_eq', + 'bigint_ord_ope', + 'bigint_ord_ore', + 'bigint_ord', + 'bigint', + 'boolean', + 'date_eq', + 'date_ord_ope', + 'date_ord_ore', + 'date_ord', + 'date', + 'double_eq', + 'double_ord_ope', + 'double_ord_ore', + 'double_ord', + 'double', + 'integer_eq', + 'integer_ord_ope', + 'integer_ord_ore', + 'integer_ord', + 'integer', + 'json', + 'jsonb_entry', + 'jsonb_query', + 'numeric_eq', + 'numeric_ord_ope', + 'numeric_ord_ore', + 'numeric_ord', + 'numeric', + 'real_eq', + 'real_ord_ope', + 'real_ord_ore', + 'real_ord', + 'real', + 'smallint_eq', + 'smallint_ord_ope', + 'smallint_ord_ore', + 'smallint_ord', + 'smallint', + 'text_eq', + 'text_match', + 'text_ord_ope', + 'text_ord_ore', + 'text_ord', + 'text_search', + 'text', + 'timestamp_eq', + 'timestamp_ord_ope', + 'timestamp_ord_ore', + 'timestamp_ord', + 'timestamp', +] as const + +export const schemaIds = { + "bigint_eq": "https://schemas.cipherstash.com/eql/v3/bigint_eq.json", + "bigint_ord_ope": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ope.json", + "bigint_ord_ore": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ore.json", + "bigint_ord": "https://schemas.cipherstash.com/eql/v3/bigint_ord.json", + "bigint": "https://schemas.cipherstash.com/eql/v3/bigint.json", + "boolean": "https://schemas.cipherstash.com/eql/v3/boolean.json", + "date_eq": "https://schemas.cipherstash.com/eql/v3/date_eq.json", + "date_ord_ope": "https://schemas.cipherstash.com/eql/v3/date_ord_ope.json", + "date_ord_ore": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", + "date_ord": "https://schemas.cipherstash.com/eql/v3/date_ord.json", + "date": "https://schemas.cipherstash.com/eql/v3/date.json", + "double_eq": "https://schemas.cipherstash.com/eql/v3/double_eq.json", + "double_ord_ope": "https://schemas.cipherstash.com/eql/v3/double_ord_ope.json", + "double_ord_ore": "https://schemas.cipherstash.com/eql/v3/double_ord_ore.json", + "double_ord": "https://schemas.cipherstash.com/eql/v3/double_ord.json", + "double": "https://schemas.cipherstash.com/eql/v3/double.json", + "integer_eq": "https://schemas.cipherstash.com/eql/v3/integer_eq.json", + "integer_ord_ope": "https://schemas.cipherstash.com/eql/v3/integer_ord_ope.json", + "integer_ord_ore": "https://schemas.cipherstash.com/eql/v3/integer_ord_ore.json", + "integer_ord": "https://schemas.cipherstash.com/eql/v3/integer_ord.json", + "integer": "https://schemas.cipherstash.com/eql/v3/integer.json", + "json": "https://schemas.cipherstash.com/eql/v3/json.json", + "jsonb_entry": "https://schemas.cipherstash.com/eql/v3/jsonb_entry.json", + "jsonb_query": "https://schemas.cipherstash.com/eql/v3/jsonb_query.json", + "numeric_eq": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json", + "numeric_ord_ope": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ope.json", + "numeric_ord_ore": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json", + "numeric_ord": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json", + "numeric": "https://schemas.cipherstash.com/eql/v3/numeric.json", + "real_eq": "https://schemas.cipherstash.com/eql/v3/real_eq.json", + "real_ord_ope": "https://schemas.cipherstash.com/eql/v3/real_ord_ope.json", + "real_ord_ore": "https://schemas.cipherstash.com/eql/v3/real_ord_ore.json", + "real_ord": "https://schemas.cipherstash.com/eql/v3/real_ord.json", + "real": "https://schemas.cipherstash.com/eql/v3/real.json", + "smallint_eq": "https://schemas.cipherstash.com/eql/v3/smallint_eq.json", + "smallint_ord_ope": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ope.json", + "smallint_ord_ore": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ore.json", + "smallint_ord": "https://schemas.cipherstash.com/eql/v3/smallint_ord.json", + "smallint": "https://schemas.cipherstash.com/eql/v3/smallint.json", + "text_eq": "https://schemas.cipherstash.com/eql/v3/text_eq.json", + "text_match": "https://schemas.cipherstash.com/eql/v3/text_match.json", + "text_ord_ope": "https://schemas.cipherstash.com/eql/v3/text_ord_ope.json", + "text_ord_ore": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", + "text_ord": "https://schemas.cipherstash.com/eql/v3/text_ord.json", + "text_search": "https://schemas.cipherstash.com/eql/v3/text_search.json", + "text": "https://schemas.cipherstash.com/eql/v3/text.json", + "timestamp_eq": "https://schemas.cipherstash.com/eql/v3/timestamp_eq.json", + "timestamp_ord_ope": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ope.json", + "timestamp_ord_ore": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ore.json", + "timestamp_ord": "https://schemas.cipherstash.com/eql/v3/timestamp_ord.json", + "timestamp": "https://schemas.cipherstash.com/eql/v3/timestamp.json", +} as const diff --git a/packages/eql/src/generated/schema/v3/bigint.json b/packages/eql/src/generated/schema/v3/bigint.json new file mode 100644 index 000000000..e6cb310f4 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/bigint.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Bigint", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/bigint_eq.json b/packages/eql/src/generated/schema/v3/bigint_eq.json new file mode 100644 index 000000000..9309eef16 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/bigint_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "BigintEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/bigint_ord.json b/packages/eql/src/generated/schema/v3/bigint_ord.json new file mode 100644 index 000000000..7cce23859 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/bigint_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "BigintOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/bigint_ord_ope.json b/packages/eql/src/generated/schema/v3/bigint_ord_ope.json new file mode 100644 index 000000000..cd7bdd447 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/bigint_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "BigintOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/bigint_ord_ore.json b/packages/eql/src/generated/schema/v3/bigint_ord_ore.json new file mode 100644 index 000000000..f2a94eb39 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/bigint_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.bigint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "BigintOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/boolean.json b/packages/eql/src/generated/schema/v3/boolean.json new file mode 100644 index 000000000..958b89de6 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/boolean.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/boolean.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.boolean` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Boolean", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/date.json b/packages/eql/src/generated/schema/v3/date.json new file mode 100644 index 000000000..fbf9a8720 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/date.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Date", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/date_eq.json b/packages/eql/src/generated/schema/v3/date_eq.json new file mode 100644 index 000000000..fc0f52262 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/date_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "DateEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/date_ord.json b/packages/eql/src/generated/schema/v3/date_ord.json new file mode 100644 index 000000000..8c3a540fb --- /dev/null +++ b/packages/eql/src/generated/schema/v3/date_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "DateOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/date_ord_ope.json b/packages/eql/src/generated/schema/v3/date_ord_ope.json new file mode 100644 index 000000000..105c5ff87 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/date_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "DateOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/date_ord_ore.json b/packages/eql/src/generated/schema/v3/date_ord_ore.json new file mode 100644 index 000000000..ea862d5af --- /dev/null +++ b/packages/eql/src/generated/schema/v3/date_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.date_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "DateOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/double.json b/packages/eql/src/generated/schema/v3/double.json new file mode 100644 index 000000000..cef5d433f --- /dev/null +++ b/packages/eql/src/generated/schema/v3/double.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Double", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/double_eq.json b/packages/eql/src/generated/schema/v3/double_eq.json new file mode 100644 index 000000000..67ceb5ce2 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/double_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "DoubleEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/double_ord.json b/packages/eql/src/generated/schema/v3/double_ord.json new file mode 100644 index 000000000..4554ce3de --- /dev/null +++ b/packages/eql/src/generated/schema/v3/double_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "DoubleOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/double_ord_ope.json b/packages/eql/src/generated/schema/v3/double_ord_ope.json new file mode 100644 index 000000000..e7ae20677 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/double_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "DoubleOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/double_ord_ore.json b/packages/eql/src/generated/schema/v3/double_ord_ore.json new file mode 100644 index 000000000..0fcbdeb6b --- /dev/null +++ b/packages/eql/src/generated/schema/v3/double_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.double_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "DoubleOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/integer.json b/packages/eql/src/generated/schema/v3/integer.json new file mode 100644 index 000000000..d0ebfe286 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/integer.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Integer", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/integer_eq.json b/packages/eql/src/generated/schema/v3/integer_eq.json new file mode 100644 index 000000000..75bc84dfa --- /dev/null +++ b/packages/eql/src/generated/schema/v3/integer_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "IntegerEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/integer_ord.json b/packages/eql/src/generated/schema/v3/integer_ord.json new file mode 100644 index 000000000..08dcd2109 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/integer_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "IntegerOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/integer_ord_ope.json b/packages/eql/src/generated/schema/v3/integer_ord_ope.json new file mode 100644 index 000000000..7b8b504ac --- /dev/null +++ b/packages/eql/src/generated/schema/v3/integer_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "IntegerOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/integer_ord_ore.json b/packages/eql/src/generated/schema/v3/integer_ord_ore.json new file mode 100644 index 000000000..3521f1087 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/integer_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.integer_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "IntegerOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/json.json b/packages/eql/src/generated/schema/v3/json.json new file mode 100644 index 000000000..546a80c0e --- /dev/null +++ b/packages/eql/src/generated/schema/v3/json.json @@ -0,0 +1,124 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreCllw": { + "description": "CLLW-ORE ordered term — the `oc` wire key of a SteVec entry. Backs entry\nordering (`<` `<=` `>` `>=`) and equality on ordered leaves. SQL-side\nconstructor: `eql_v3.ore_cllw`. A SteVec entry carries exactly one of `hm`\n(equality) XOR `oc` (ordering) — enforced by the SQL domain CHECK.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + }, + "Selector": { + "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`public.json`); present on every entry and query element.", + "type": "string" + }, + "SteVecEntry": { + "anyOf": [ + { + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + } + }, + "required": [ + "hm" + ], + "type": "object" + }, + { + "properties": { + "oc": { + "$ref": "#/$defs/OreCllw" + } + }, + "required": [ + "oc" + ], + "type": "object" + } + ], + "description": "`public.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.", + "properties": { + "a": { + "type": [ + "boolean", + "null" + ] + }, + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "s": { + "$ref": "#/$defs/Selector" + } + }, + "required": [ + "s", + "c" + ], + "type": "object" + }, + "SteVecForm": { + "const": "sv", + "description": "The `k` envelope form discriminator — always `\"sv\"` for a SteVec document.", + "type": "string" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/json.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,\nno root ciphertext). Strict. `k` is the `\"sv\"` form discriminator (see\n[`SteVecForm`]) — carried on the real wire, so the strict struct models it.", + "properties": { + "i": { + "$ref": "#/$defs/Identifier" + }, + "k": { + "$ref": "#/$defs/SteVecForm" + }, + "sv": { + "items": { + "$ref": "#/$defs/SteVecEntry" + }, + "type": "array" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "k", + "i", + "sv" + ], + "title": "SteVecDocument", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/jsonb_entry.json b/packages/eql/src/generated/schema/v3/jsonb_entry.json new file mode 100644 index 000000000..c38667838 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/jsonb_entry.json @@ -0,0 +1,67 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "OreCllw": { + "description": "CLLW-ORE ordered term — the `oc` wire key of a SteVec entry. Backs entry\nordering (`<` `<=` `>` `>=`) and equality on ordered leaves. SQL-side\nconstructor: `eql_v3.ore_cllw`. A SteVec entry carries exactly one of `hm`\n(equality) XOR `oc` (ordering) — enforced by the SQL domain CHECK.", + "type": "string" + }, + "Selector": { + "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`public.json`); present on every entry and query element.", + "type": "string" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/jsonb_entry.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "anyOf": [ + { + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + } + }, + "required": [ + "hm" + ], + "type": "object" + }, + { + "properties": { + "oc": { + "$ref": "#/$defs/OreCllw" + } + }, + "required": [ + "oc" + ], + "type": "object" + } + ], + "description": "`public.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.", + "properties": { + "a": { + "type": [ + "boolean", + "null" + ] + }, + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "s": { + "$ref": "#/$defs/Selector" + } + }, + "required": [ + "s", + "c" + ], + "title": "SteVecEntry", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/jsonb_query.json b/packages/eql/src/generated/schema/v3/jsonb_query.json new file mode 100644 index 000000000..d33e4fe83 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/jsonb_query.json @@ -0,0 +1,69 @@ +{ + "$defs": { + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "OreCllw": { + "description": "CLLW-ORE ordered term — the `oc` wire key of a SteVec entry. Backs entry\nordering (`<` `<=` `>` `>=`) and equality on ordered leaves. SQL-side\nconstructor: `eql_v3.ore_cllw`. A SteVec entry carries exactly one of `hm`\n(equality) XOR `oc` (ordering) — enforced by the SQL domain CHECK.", + "type": "string" + }, + "Selector": { + "description": "A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an\nencrypted document (`public.json`); present on every entry and query element.", + "type": "string" + }, + "SteVecQueryEntry": { + "anyOf": [ + { + "properties": { + "hm": { + "$ref": "#/$defs/Hmac256" + } + }, + "required": [ + "hm" + ], + "type": "object" + }, + { + "properties": { + "oc": { + "$ref": "#/$defs/OreCllw" + } + }, + "required": [ + "oc" + ], + "type": "object" + } + ], + "description": "One element of a SteVec containment needle: a selector plus one term, and\n(per the SQL CHECK) no ciphertext. LAX for the same flatten reason as\n`SteVecEntry`; the \"no `c`\" contract is enforced by `is_valid_ste_vec_query_payload`.", + "properties": { + "s": { + "$ref": "#/$defs/Selector" + } + }, + "required": [ + "s" + ], + "type": "object" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/jsonb_query.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.", + "properties": { + "sv": { + "items": { + "$ref": "#/$defs/SteVecQueryEntry" + }, + "type": "array" + } + }, + "required": [ + "sv" + ], + "title": "SteVecQuery", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/numeric.json b/packages/eql/src/generated/schema/v3/numeric.json new file mode 100644 index 000000000..c8deb4041 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/numeric.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Numeric", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/numeric_eq.json b/packages/eql/src/generated/schema/v3/numeric_eq.json new file mode 100644 index 000000000..20ce2e84f --- /dev/null +++ b/packages/eql/src/generated/schema/v3/numeric_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "NumericEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/numeric_ord.json b/packages/eql/src/generated/schema/v3/numeric_ord.json new file mode 100644 index 000000000..a93457e21 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/numeric_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "NumericOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/numeric_ord_ope.json b/packages/eql/src/generated/schema/v3/numeric_ord_ope.json new file mode 100644 index 000000000..198724c8c --- /dev/null +++ b/packages/eql/src/generated/schema/v3/numeric_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "NumericOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/numeric_ord_ore.json b/packages/eql/src/generated/schema/v3/numeric_ord_ore.json new file mode 100644 index 000000000..48ffe1a3e --- /dev/null +++ b/packages/eql/src/generated/schema/v3/numeric_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.numeric_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "NumericOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/real.json b/packages/eql/src/generated/schema/v3/real.json new file mode 100644 index 000000000..e62f8db5a --- /dev/null +++ b/packages/eql/src/generated/schema/v3/real.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Real", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/real_eq.json b/packages/eql/src/generated/schema/v3/real_eq.json new file mode 100644 index 000000000..c5714a700 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/real_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "RealEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/real_ord.json b/packages/eql/src/generated/schema/v3/real_ord.json new file mode 100644 index 000000000..b0304add5 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/real_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "RealOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/real_ord_ope.json b/packages/eql/src/generated/schema/v3/real_ord_ope.json new file mode 100644 index 000000000..88b9f05d2 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/real_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "RealOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/real_ord_ore.json b/packages/eql/src/generated/schema/v3/real_ord_ore.json new file mode 100644 index 000000000..dadf63852 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/real_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.real_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "RealOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/smallint.json b/packages/eql/src/generated/schema/v3/smallint.json new file mode 100644 index 000000000..5270797b9 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/smallint.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Smallint", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/smallint_eq.json b/packages/eql/src/generated/schema/v3/smallint_eq.json new file mode 100644 index 000000000..9427016f7 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/smallint_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "SmallintEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/smallint_ord.json b/packages/eql/src/generated/schema/v3/smallint_ord.json new file mode 100644 index 000000000..32dfac9e4 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/smallint_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "SmallintOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/smallint_ord_ope.json b/packages/eql/src/generated/schema/v3/smallint_ord_ope.json new file mode 100644 index 000000000..52a582166 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/smallint_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "SmallintOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/smallint_ord_ore.json b/packages/eql/src/generated/schema/v3/smallint_ord_ore.json new file mode 100644 index 000000000..92e8b1929 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/smallint_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.smallint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "SmallintOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/text.json b/packages/eql/src/generated/schema/v3/text.json new file mode 100644 index 000000000..35cf29063 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/text.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Text", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/text_eq.json b/packages/eql/src/generated/schema/v3/text_eq.json new file mode 100644 index 000000000..cc7949f57 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/text_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "TextEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/text_match.json b/packages/eql/src/generated/schema/v3/text_match.json new file mode 100644 index 000000000..157c83950 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/text_match.json @@ -0,0 +1,68 @@ +{ + "$defs": { + "BloomFilter": { + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", + "items": { + "format": "int16", + "maximum": 32767, + "minimum": -32768, + "type": "integer" + }, + "type": "array" + }, + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_match` — match domain.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.", + "properties": { + "bf": { + "$ref": "#/$defs/BloomFilter" + }, + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "bf" + ], + "title": "TextMatch", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/text_ord.json b/packages/eql/src/generated/schema/v3/text_ord.json new file mode 100644 index 000000000..9ac1f2ae8 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/text_ord.json @@ -0,0 +1,73 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm", + "ob" + ], + "title": "TextOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/text_ord_ope.json b/packages/eql/src/generated/schema/v3/text_ord_ope.json new file mode 100644 index 000000000..4b25588f0 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/text_ord_ope.json @@ -0,0 +1,70 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm", + "op" + ], + "title": "TextOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/text_ord_ore.json b/packages/eql/src/generated/schema/v3/text_ord_ore.json new file mode 100644 index 000000000..67e0afcb2 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/text_ord_ore.json @@ -0,0 +1,73 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm", + "ob" + ], + "title": "TextOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/text_search.json b/packages/eql/src/generated/schema/v3/text_search.json new file mode 100644 index 000000000..4d146221d --- /dev/null +++ b/packages/eql/src/generated/schema/v3/text_search.json @@ -0,0 +1,87 @@ +{ + "$defs": { + "BloomFilter": { + "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.", + "items": { + "format": "int16", + "maximum": 32767, + "minimum": -32768, + "type": "integer" + }, + "type": "array" + }, + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/text_search.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.text_search` — search domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.", + "properties": { + "bf": { + "$ref": "#/$defs/BloomFilter" + }, + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm", + "ob", + "bf" + ], + "title": "TextSearch", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/timestamp.json b/packages/eql/src/generated/schema/v3/timestamp.json new file mode 100644 index 000000000..523b588fd --- /dev/null +++ b/packages/eql/src/generated/schema/v3/timestamp.json @@ -0,0 +1,54 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c" + ], + "title": "Timestamp", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/timestamp_eq.json b/packages/eql/src/generated/schema/v3/timestamp_eq.json new file mode 100644 index 000000000..cfb61fa3c --- /dev/null +++ b/packages/eql/src/generated/schema/v3/timestamp_eq.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Hmac256": { + "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_eq.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "hm": { + "$ref": "#/$defs/Hmac256" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "hm" + ], + "title": "TimestampEq", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/timestamp_ord.json b/packages/eql/src/generated/schema/v3/timestamp_ord.json new file mode 100644 index 000000000..c7bdc3688 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/timestamp_ord.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "TimestampOrd", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/timestamp_ord_ope.json b/packages/eql/src/generated/schema/v3/timestamp_ord_ope.json new file mode 100644 index 000000000..f87426ef8 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/timestamp_ord_ope.json @@ -0,0 +1,62 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OpeCllw": { + "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.", + "type": "string" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ope.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "op": { + "$ref": "#/$defs/OpeCllw" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "op" + ], + "title": "TimestampOrdOpe", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/schema/v3/timestamp_ord_ore.json b/packages/eql/src/generated/schema/v3/timestamp_ord_ore.json new file mode 100644 index 000000000..0eb48eb74 --- /dev/null +++ b/packages/eql/src/generated/schema/v3/timestamp_ord_ore.json @@ -0,0 +1,65 @@ +{ + "$defs": { + "Ciphertext": { + "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.", + "type": "string" + }, + "Identifier": { + "additionalProperties": false, + "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.", + "properties": { + "c": { + "description": "Column name.", + "type": "string" + }, + "t": { + "description": "Table name.", + "type": "string" + } + }, + "required": [ + "t", + "c" + ], + "type": "object" + }, + "OreBlock256": { + "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "SchemaVersion": { + "const": 3, + "description": "The envelope version field (`v`) — always exactly `3` on the wire.", + "type": "integer" + } + }, + "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ore.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "`public.timestamp_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.", + "properties": { + "c": { + "$ref": "#/$defs/Ciphertext" + }, + "i": { + "$ref": "#/$defs/Identifier" + }, + "ob": { + "$ref": "#/$defs/OreBlock256" + }, + "v": { + "$ref": "#/$defs/SchemaVersion" + } + }, + "required": [ + "v", + "i", + "c", + "ob" + ], + "title": "TimestampOrdOre", + "type": "object" +} \ No newline at end of file diff --git a/packages/eql/src/generated/v3/Bigint.ts b/packages/eql/src/generated/v3/Bigint.ts new file mode 100644 index 000000000..809944c6b --- /dev/null +++ b/packages/eql/src/generated/v3/Bigint.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Bigint = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/BigintEq.ts b/packages/eql/src/generated/v3/BigintEq.ts new file mode 100644 index 000000000..28ed32e72 --- /dev/null +++ b/packages/eql/src/generated/v3/BigintEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type BigintEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/BigintOrd.ts b/packages/eql/src/generated/v3/BigintOrd.ts new file mode 100644 index 000000000..945c36831 --- /dev/null +++ b/packages/eql/src/generated/v3/BigintOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type BigintOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/BigintOrdOpe.ts b/packages/eql/src/generated/v3/BigintOrdOpe.ts new file mode 100644 index 000000000..9ca0bc5d8 --- /dev/null +++ b/packages/eql/src/generated/v3/BigintOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type BigintOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/BigintOrdOre.ts b/packages/eql/src/generated/v3/BigintOrdOre.ts new file mode 100644 index 000000000..c40be04bf --- /dev/null +++ b/packages/eql/src/generated/v3/BigintOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.bigint_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type BigintOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/BloomFilter.ts b/packages/eql/src/generated/v3/BloomFilter.ts new file mode 100644 index 000000000..6861ce1c5 --- /dev/null +++ b/packages/eql/src/generated/v3/BloomFilter.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Bloom-filter match term — the `bf` wire key. Backs the `_match` domains + * (`@>`/`<@` containment). + * + * **Signed** i16, not u16: EQL stores the filter as PostgreSQL `smallint[]`, + * and filters sized above 32768 emit upper-half bit positions as negative + * signed values. + */ +export type BloomFilter = Array; diff --git a/packages/eql/src/generated/v3/Boolean.ts b/packages/eql/src/generated/v3/Boolean.ts new file mode 100644 index 000000000..96fc814fa --- /dev/null +++ b/packages/eql/src/generated/v3/Boolean.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.boolean` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Boolean = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/Ciphertext.ts b/packages/eql/src/generated/v3/Ciphertext.ts new file mode 100644 index 000000000..7beff648e --- /dev/null +++ b/packages/eql/src/generated/v3/Ciphertext.ts @@ -0,0 +1,8 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * mp_base85 source ciphertext — the `c` envelope key. + * + * Required by every v3 domain CHECK; present on every payload. + */ +export type Ciphertext = string; diff --git a/packages/eql/src/generated/v3/Date.ts b/packages/eql/src/generated/v3/Date.ts new file mode 100644 index 000000000..1926b4d4c --- /dev/null +++ b/packages/eql/src/generated/v3/Date.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Date = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/DateEq.ts b/packages/eql/src/generated/v3/DateEq.ts new file mode 100644 index 000000000..fb6e600b9 --- /dev/null +++ b/packages/eql/src/generated/v3/DateEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type DateEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/DateOrd.ts b/packages/eql/src/generated/v3/DateOrd.ts new file mode 100644 index 000000000..326fc3c9a --- /dev/null +++ b/packages/eql/src/generated/v3/DateOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type DateOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/DateOrdOpe.ts b/packages/eql/src/generated/v3/DateOrdOpe.ts new file mode 100644 index 000000000..f3a43723e --- /dev/null +++ b/packages/eql/src/generated/v3/DateOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type DateOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/DateOrdOre.ts b/packages/eql/src/generated/v3/DateOrdOre.ts new file mode 100644 index 000000000..f6e28e4e4 --- /dev/null +++ b/packages/eql/src/generated/v3/DateOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.date_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type DateOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/Double.ts b/packages/eql/src/generated/v3/Double.ts new file mode 100644 index 000000000..cd0d5c806 --- /dev/null +++ b/packages/eql/src/generated/v3/Double.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Double = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/DoubleEq.ts b/packages/eql/src/generated/v3/DoubleEq.ts new file mode 100644 index 000000000..e4218fae8 --- /dev/null +++ b/packages/eql/src/generated/v3/DoubleEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type DoubleEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/DoubleOrd.ts b/packages/eql/src/generated/v3/DoubleOrd.ts new file mode 100644 index 000000000..be98e9f3c --- /dev/null +++ b/packages/eql/src/generated/v3/DoubleOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type DoubleOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/DoubleOrdOpe.ts b/packages/eql/src/generated/v3/DoubleOrdOpe.ts new file mode 100644 index 000000000..85c3a1bd1 --- /dev/null +++ b/packages/eql/src/generated/v3/DoubleOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type DoubleOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/DoubleOrdOre.ts b/packages/eql/src/generated/v3/DoubleOrdOre.ts new file mode 100644 index 000000000..10a64ad15 --- /dev/null +++ b/packages/eql/src/generated/v3/DoubleOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.double_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type DoubleOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/Hmac256.ts b/packages/eql/src/generated/v3/Hmac256.ts new file mode 100644 index 000000000..e6fc7db2e --- /dev/null +++ b/packages/eql/src/generated/v3/Hmac256.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains + * (`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`. + */ +export type Hmac256 = string; diff --git a/packages/eql/src/generated/v3/Identifier.ts b/packages/eql/src/generated/v3/Identifier.ts new file mode 100644 index 000000000..d8914e8f8 --- /dev/null +++ b/packages/eql/src/generated/v3/Identifier.ts @@ -0,0 +1,16 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Table + column identifier — wire shape `{"t": "...", "c": "..."}`. + * + * Shared by every payload. + */ +export type Identifier = { +/** + * Table name. + */ +t: string, +/** + * Column name. + */ +c: string, }; diff --git a/packages/eql/src/generated/v3/Integer.ts b/packages/eql/src/generated/v3/Integer.ts new file mode 100644 index 000000000..d7fe5263a --- /dev/null +++ b/packages/eql/src/generated/v3/Integer.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Integer = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/IntegerEq.ts b/packages/eql/src/generated/v3/IntegerEq.ts new file mode 100644 index 000000000..51079950e --- /dev/null +++ b/packages/eql/src/generated/v3/IntegerEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type IntegerEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/IntegerOrd.ts b/packages/eql/src/generated/v3/IntegerOrd.ts new file mode 100644 index 000000000..e7b016e49 --- /dev/null +++ b/packages/eql/src/generated/v3/IntegerOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type IntegerOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/IntegerOrdOpe.ts b/packages/eql/src/generated/v3/IntegerOrdOpe.ts new file mode 100644 index 000000000..19c948db9 --- /dev/null +++ b/packages/eql/src/generated/v3/IntegerOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type IntegerOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/IntegerOrdOre.ts b/packages/eql/src/generated/v3/IntegerOrdOre.ts new file mode 100644 index 000000000..eddb18e22 --- /dev/null +++ b/packages/eql/src/generated/v3/IntegerOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.integer_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type IntegerOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/Numeric.ts b/packages/eql/src/generated/v3/Numeric.ts new file mode 100644 index 000000000..5d231394b --- /dev/null +++ b/packages/eql/src/generated/v3/Numeric.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Numeric = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/NumericEq.ts b/packages/eql/src/generated/v3/NumericEq.ts new file mode 100644 index 000000000..784641e71 --- /dev/null +++ b/packages/eql/src/generated/v3/NumericEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type NumericEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/NumericOrd.ts b/packages/eql/src/generated/v3/NumericOrd.ts new file mode 100644 index 000000000..b99627eaf --- /dev/null +++ b/packages/eql/src/generated/v3/NumericOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type NumericOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/NumericOrdOpe.ts b/packages/eql/src/generated/v3/NumericOrdOpe.ts new file mode 100644 index 000000000..4e470ed80 --- /dev/null +++ b/packages/eql/src/generated/v3/NumericOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type NumericOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/NumericOrdOre.ts b/packages/eql/src/generated/v3/NumericOrdOre.ts new file mode 100644 index 000000000..a3362d632 --- /dev/null +++ b/packages/eql/src/generated/v3/NumericOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.numeric_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type NumericOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/OpeCllw.ts b/packages/eql/src/generated/v3/OpeCllw.ts new file mode 100644 index 000000000..06179cf4e --- /dev/null +++ b/packages/eql/src/generated/v3/OpeCllw.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope` + * domains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext, + * sortable via native bytea comparison after hex-decode — unlike `ob` + * (block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side + * constructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the + * SteVec CLLW-*ORE* term compared by the custom per-byte protocol. + */ +export type OpeCllw = string; diff --git a/packages/eql/src/generated/v3/OreBlock256.ts b/packages/eql/src/generated/v3/OreBlock256.ts new file mode 100644 index 000000000..c5fd7c510 --- /dev/null +++ b/packages/eql/src/generated/v3/OreBlock256.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore` + * domains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's + * domain, so it serves equality too. The block count is width-agnostic on the + * wire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the + * array just carries more block strings. SQL-side constructor: + * `eql_v3_internal.ore_block_256`. + */ +export type OreBlock256 = Array; diff --git a/packages/eql/src/generated/v3/OreCllw.ts b/packages/eql/src/generated/v3/OreCllw.ts new file mode 100644 index 000000000..35ab1247d --- /dev/null +++ b/packages/eql/src/generated/v3/OreCllw.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * CLLW-ORE ordered term — the `oc` wire key of a SteVec entry. Backs entry + * ordering (`<` `<=` `>` `>=`) and equality on ordered leaves. SQL-side + * constructor: `eql_v3.ore_cllw`. A SteVec entry carries exactly one of `hm` + * (equality) XOR `oc` (ordering) — enforced by the SQL domain CHECK. + */ +export type OreCllw = string; diff --git a/packages/eql/src/generated/v3/Real.ts b/packages/eql/src/generated/v3/Real.ts new file mode 100644 index 000000000..e7e4af203 --- /dev/null +++ b/packages/eql/src/generated/v3/Real.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Real = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/RealEq.ts b/packages/eql/src/generated/v3/RealEq.ts new file mode 100644 index 000000000..2b565ff73 --- /dev/null +++ b/packages/eql/src/generated/v3/RealEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type RealEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/RealOrd.ts b/packages/eql/src/generated/v3/RealOrd.ts new file mode 100644 index 000000000..eecebcb3f --- /dev/null +++ b/packages/eql/src/generated/v3/RealOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type RealOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/RealOrdOpe.ts b/packages/eql/src/generated/v3/RealOrdOpe.ts new file mode 100644 index 000000000..c60d0ceb3 --- /dev/null +++ b/packages/eql/src/generated/v3/RealOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type RealOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/RealOrdOre.ts b/packages/eql/src/generated/v3/RealOrdOre.ts new file mode 100644 index 000000000..58b42ddae --- /dev/null +++ b/packages/eql/src/generated/v3/RealOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.real_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type RealOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/SchemaVersion.ts b/packages/eql/src/generated/v3/SchemaVersion.ts new file mode 100644 index 000000000..05f6e343a --- /dev/null +++ b/packages/eql/src/generated/v3/SchemaVersion.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * The envelope version field (`v`) — always exactly [`EQL_SCHEMA_VERSION`] + * on the wire. + * + * Deserialization rejects any other value: the Rust analogue of the domain + * CHECK's `VALUE->>'v' = '3'`, so a wrong-version payload fails at the type + * boundary instead of at INSERT. The inner value is private; the only + * constructible instance is the current version. + */ +export type SchemaVersion = 3; diff --git a/packages/eql/src/generated/v3/Selector.ts b/packages/eql/src/generated/v3/Selector.ts new file mode 100644 index 000000000..56c8dfcff --- /dev/null +++ b/packages/eql/src/generated/v3/Selector.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * A SteVec selector — the `s` wire key. Addresses a JSON path leaf within an + * encrypted document (`public.json`); present on every entry and query element. + */ +export type Selector = string; diff --git a/packages/eql/src/generated/v3/Smallint.ts b/packages/eql/src/generated/v3/Smallint.ts new file mode 100644 index 000000000..0450a7e32 --- /dev/null +++ b/packages/eql/src/generated/v3/Smallint.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Smallint = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/SmallintEq.ts b/packages/eql/src/generated/v3/SmallintEq.ts new file mode 100644 index 000000000..f4ddfb50a --- /dev/null +++ b/packages/eql/src/generated/v3/SmallintEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type SmallintEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/SmallintOrd.ts b/packages/eql/src/generated/v3/SmallintOrd.ts new file mode 100644 index 000000000..caf148562 --- /dev/null +++ b/packages/eql/src/generated/v3/SmallintOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type SmallintOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/SmallintOrdOpe.ts b/packages/eql/src/generated/v3/SmallintOrdOpe.ts new file mode 100644 index 000000000..81da5a430 --- /dev/null +++ b/packages/eql/src/generated/v3/SmallintOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type SmallintOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/SmallintOrdOre.ts b/packages/eql/src/generated/v3/SmallintOrdOre.ts new file mode 100644 index 000000000..acee4059a --- /dev/null +++ b/packages/eql/src/generated/v3/SmallintOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.smallint_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type SmallintOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/SteVecDocument.ts b/packages/eql/src/generated/v3/SteVecDocument.ts new file mode 100644 index 000000000..75e5f820c --- /dev/null +++ b/packages/eql/src/generated/v3/SteVecDocument.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; +import type { SteVecEntry } from "./SteVecEntry"; +import type { SteVecForm } from "./SteVecForm"; + +/** + * `public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`, + * no root ciphertext). Strict. `k` is the `"sv"` form discriminator (see + * [`SteVecForm`]) — carried on the real wire, so the strict struct models it. + */ +export type SteVecDocument = { v: SchemaVersion, k: SteVecForm, i: Identifier, sv: Array, }; diff --git a/packages/eql/src/generated/v3/SteVecEntry.ts b/packages/eql/src/generated/v3/SteVecEntry.ts new file mode 100644 index 000000000..848849f69 --- /dev/null +++ b/packages/eql/src/generated/v3/SteVecEntry.ts @@ -0,0 +1,13 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { OreCllw } from "./OreCllw"; +import type { Selector } from "./Selector"; + +/** + * `public.jsonb_entry` — one sv element (returned by `->`). Carries a selector + * `s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of + * `hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the + * root `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK. + */ +export type SteVecEntry = { s: Selector, c: Ciphertext, a?: boolean | null, } & ({ hm: Hmac256, } | { oc: OreCllw, }); diff --git a/packages/eql/src/generated/v3/SteVecForm.ts b/packages/eql/src/generated/v3/SteVecForm.ts new file mode 100644 index 000000000..e7c62ef93 --- /dev/null +++ b/packages/eql/src/generated/v3/SteVecForm.ts @@ -0,0 +1,20 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * The `k` envelope key — the EQL payload **form discriminator**, always the + * literal `"sv"` for an encrypted-JSONB document. + * + * `k` distinguishes the payload forms in the canonical wire contract (`"ct"` = + * scalar ciphertext, `"sv"` = STE-vec). `eql_v3` itself does not consume `k` + * (the typed domain + the structural `c`-vs-`sv` shape already discriminate, + * and no `eql_v3` SQL reads it), but the canonical `SteVecPayload` + * (`eql-payload-v2.3.schema.json`, `required: [v,k,i,sv]`) mandates it and + * cipherstash-client emits it on every SteVec document — so the strict document + * struct must model it or it rejects the real wire. + * + * Pinned exactly like [`SchemaVersion`] pins `v`: deserialization rejects any + * value other than `"sv"`, so a scalar (`k:"ct"`) payload cannot be read back + * as a document. The inner value is private; the only constructible instance is + * [`SteVecForm::SV`]. + */ +export type SteVecForm = "sv"; diff --git a/packages/eql/src/generated/v3/SteVecQuery.ts b/packages/eql/src/generated/v3/SteVecQuery.ts new file mode 100644 index 000000000..7d4d64a8d --- /dev/null +++ b/packages/eql/src/generated/v3/SteVecQuery.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { SteVecQueryEntry } from "./SteVecQueryEntry"; + +/** + * `public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict. + */ +export type SteVecQuery = { sv: Array, }; diff --git a/packages/eql/src/generated/v3/SteVecQueryEntry.ts b/packages/eql/src/generated/v3/SteVecQueryEntry.ts new file mode 100644 index 000000000..c3210a2f2 --- /dev/null +++ b/packages/eql/src/generated/v3/SteVecQueryEntry.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { OreCllw } from "./OreCllw"; +import type { Selector } from "./Selector"; + +/** + * One element of a SteVec containment needle: a selector plus one term, and + * (per the SQL CHECK) no ciphertext. LAX for the same flatten reason as + * `SteVecEntry`; the "no `c`" contract is enforced by `is_valid_ste_vec_query_payload`. + */ +export type SteVecQueryEntry = { s: Selector, } & ({ hm: Hmac256, } | { oc: OreCllw, }); diff --git a/packages/eql/src/generated/v3/SteVecTerm.ts b/packages/eql/src/generated/v3/SteVecTerm.ts new file mode 100644 index 000000000..03c62046d --- /dev/null +++ b/packages/eql/src/generated/v3/SteVecTerm.ts @@ -0,0 +1,9 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Hmac256 } from "./Hmac256"; +import type { OreCllw } from "./OreCllw"; + +/** + * The per-entry deterministic term: exactly one of `hm` (HMAC equality) or `oc` + * (CLLW-ORE ordering). Untagged — a document mixes both across its `sv` array. + */ +export type SteVecTerm = { hm: Hmac256, } | { oc: OreCllw, }; diff --git a/packages/eql/src/generated/v3/Text.ts b/packages/eql/src/generated/v3/Text.ts new file mode 100644 index 000000000..65309716c --- /dev/null +++ b/packages/eql/src/generated/v3/Text.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Text = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/TextEq.ts b/packages/eql/src/generated/v3/TextEq.ts new file mode 100644 index 000000000..c0f7744e0 --- /dev/null +++ b/packages/eql/src/generated/v3/TextEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type TextEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/TextMatch.ts b/packages/eql/src/generated/v3/TextMatch.ts new file mode 100644 index 000000000..39c401bb1 --- /dev/null +++ b/packages/eql/src/generated/v3/TextMatch.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { BloomFilter } from "./BloomFilter"; +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_match` — match domain. + * + * Operators: `@>` `<@`. Required keys: `v` `i` `c` `bf`. + */ +export type TextMatch = { v: SchemaVersion, i: Identifier, c: Ciphertext, bf: BloomFilter, }; diff --git a/packages/eql/src/generated/v3/TextOrd.ts b/packages/eql/src/generated/v3/TextOrd.ts new file mode 100644 index 000000000..bff3ab55c --- /dev/null +++ b/packages/eql/src/generated/v3/TextOrd.ts @@ -0,0 +1,13 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`. + */ +export type TextOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/TextOrdOpe.ts b/packages/eql/src/generated/v3/TextOrdOpe.ts new file mode 100644 index 000000000..e681f9f86 --- /dev/null +++ b/packages/eql/src/generated/v3/TextOrdOpe.ts @@ -0,0 +1,13 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`. + */ +export type TextOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/TextOrdOre.ts b/packages/eql/src/generated/v3/TextOrdOre.ts new file mode 100644 index 000000000..ce5e29d0a --- /dev/null +++ b/packages/eql/src/generated/v3/TextOrdOre.ts @@ -0,0 +1,13 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`. + */ +export type TextOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/TextSearch.ts b/packages/eql/src/generated/v3/TextSearch.ts new file mode 100644 index 000000000..d9ce8c69c --- /dev/null +++ b/packages/eql/src/generated/v3/TextSearch.ts @@ -0,0 +1,14 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { BloomFilter } from "./BloomFilter"; +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.text_search` — search domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`. + */ +export type TextSearch = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, ob: OreBlock256, bf: BloomFilter, }; diff --git a/packages/eql/src/generated/v3/Timestamp.ts b/packages/eql/src/generated/v3/Timestamp.ts new file mode 100644 index 000000000..87a4b9e7b --- /dev/null +++ b/packages/eql/src/generated/v3/Timestamp.ts @@ -0,0 +1,11 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp` — storage-only domain. + * + * Operators: none. Required keys: `v` `i` `c`. + */ +export type Timestamp = { v: SchemaVersion, i: Identifier, c: Ciphertext, }; diff --git a/packages/eql/src/generated/v3/TimestampEq.ts b/packages/eql/src/generated/v3/TimestampEq.ts new file mode 100644 index 000000000..63feac8d8 --- /dev/null +++ b/packages/eql/src/generated/v3/TimestampEq.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Hmac256 } from "./Hmac256"; +import type { Identifier } from "./Identifier"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_eq` — equality domain. + * + * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`. + */ +export type TimestampEq = { v: SchemaVersion, i: Identifier, c: Ciphertext, hm: Hmac256, }; diff --git a/packages/eql/src/generated/v3/TimestampOrd.ts b/packages/eql/src/generated/v3/TimestampOrd.ts new file mode 100644 index 000000000..f22750626 --- /dev/null +++ b/packages/eql/src/generated/v3/TimestampOrd.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_ord` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type TimestampOrd = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/TimestampOrdOpe.ts b/packages/eql/src/generated/v3/TimestampOrdOpe.ts new file mode 100644 index 000000000..1beaa8030 --- /dev/null +++ b/packages/eql/src/generated/v3/TimestampOrdOpe.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OpeCllw } from "./OpeCllw"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_ord_ope` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`. + */ +export type TimestampOrdOpe = { v: SchemaVersion, i: Identifier, c: Ciphertext, op: OpeCllw, }; diff --git a/packages/eql/src/generated/v3/TimestampOrdOre.ts b/packages/eql/src/generated/v3/TimestampOrdOre.ts new file mode 100644 index 000000000..dc27811f1 --- /dev/null +++ b/packages/eql/src/generated/v3/TimestampOrdOre.ts @@ -0,0 +1,12 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { Ciphertext } from "./Ciphertext"; +import type { Identifier } from "./Identifier"; +import type { OreBlock256 } from "./OreBlock256"; +import type { SchemaVersion } from "./SchemaVersion"; + +/** + * `public.timestamp_ord_ore` — ordering domain. + * + * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`. + */ +export type TimestampOrdOre = { v: SchemaVersion, i: Identifier, c: Ciphertext, ob: OreBlock256, }; diff --git a/packages/eql/src/generated/v3/index.ts b/packages/eql/src/generated/v3/index.ts new file mode 100644 index 000000000..9c4bded3c --- /dev/null +++ b/packages/eql/src/generated/v3/index.ts @@ -0,0 +1,63 @@ +export type * from './Bigint' +export type * from './BigintEq' +export type * from './BigintOrd' +export type * from './BigintOrdOpe' +export type * from './BigintOrdOre' +export type * from './BloomFilter' +export type * from './Boolean' +export type * from './Ciphertext' +export type * from './Date' +export type * from './DateEq' +export type * from './DateOrd' +export type * from './DateOrdOpe' +export type * from './DateOrdOre' +export type * from './Double' +export type * from './DoubleEq' +export type * from './DoubleOrd' +export type * from './DoubleOrdOpe' +export type * from './DoubleOrdOre' +export type * from './Hmac256' +export type * from './Identifier' +export type * from './Integer' +export type * from './IntegerEq' +export type * from './IntegerOrd' +export type * from './IntegerOrdOpe' +export type * from './IntegerOrdOre' +export type * from './Numeric' +export type * from './NumericEq' +export type * from './NumericOrd' +export type * from './NumericOrdOpe' +export type * from './NumericOrdOre' +export type * from './OpeCllw' +export type * from './OreBlock256' +export type * from './OreCllw' +export type * from './Real' +export type * from './RealEq' +export type * from './RealOrd' +export type * from './RealOrdOpe' +export type * from './RealOrdOre' +export type * from './SchemaVersion' +export type * from './Selector' +export type * from './Smallint' +export type * from './SmallintEq' +export type * from './SmallintOrd' +export type * from './SmallintOrdOpe' +export type * from './SmallintOrdOre' +export type * from './SteVecDocument' +export type * from './SteVecEntry' +export type * from './SteVecForm' +export type * from './SteVecQuery' +export type * from './SteVecQueryEntry' +export type * from './SteVecTerm' +export type * from './Text' +export type * from './TextEq' +export type * from './TextMatch' +export type * from './TextOrd' +export type * from './TextOrdOpe' +export type * from './TextOrdOre' +export type * from './TextSearch' +export type * from './Timestamp' +export type * from './TimestampEq' +export type * from './TimestampOrd' +export type * from './TimestampOrdOpe' +export type * from './TimestampOrdOre' From 35c21887b73e464b5da975de36a3939b29e76bbf Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 7 Jul 2026 11:57:43 +1000 Subject: [PATCH 559/599] feat(release): bundle exact SQL in language bindings --- crates/eql-bindings/Cargo.toml | 9 +++ .../sql/cipherstash-encrypt-uninstall.sql | 1 + .../eql-bindings/sql/cipherstash-encrypt.sql | 1 + crates/eql-bindings/sql/release-manifest.json | 6 ++ crates/eql-bindings/src/lib.rs | 1 + crates/eql-bindings/src/sql.rs | 10 ++++ mise.toml | 5 ++ .../eql/sql/cipherstash-encrypt-uninstall.sql | 1 + packages/eql/sql/cipherstash-encrypt.sql | 1 + packages/eql/sql/release-manifest.json | 6 ++ tasks/release/prepare-bindings-assets.sh | 56 +++++++++++++++++++ 11 files changed, 97 insertions(+) create mode 100644 crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql create mode 100644 crates/eql-bindings/sql/cipherstash-encrypt.sql create mode 100644 crates/eql-bindings/sql/release-manifest.json create mode 100644 crates/eql-bindings/src/sql.rs create mode 100644 packages/eql/sql/cipherstash-encrypt-uninstall.sql create mode 100644 packages/eql/sql/cipherstash-encrypt.sql create mode 100644 packages/eql/sql/release-manifest.json create mode 100755 tasks/release/prepare-bindings-assets.sh diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index a80c47618..0052c4f47 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -11,6 +11,15 @@ homepage = "https://github.com/cipherstash/encrypt-query-language" readme = "README.md" keywords = ["encryption", "postgres", "eql", "cipherstash", "searchable"] categories = ["cryptography", "database"] +include = [ + "Cargo.toml", + "README.md", + "CHANGELOG.md", + "src/**", + "bindings/**", + "schema/**", + "sql/**", +] [dependencies] serde = { version = "1", features = ["derive"] } diff --git a/crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql b/crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql new file mode 100644 index 000000000..cb60f3296 --- /dev/null +++ b/crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql @@ -0,0 +1 @@ +-- DEV placeholder. Release automation overwrites this file with exact-version EQL uninstall SQL before publishing. diff --git a/crates/eql-bindings/sql/cipherstash-encrypt.sql b/crates/eql-bindings/sql/cipherstash-encrypt.sql new file mode 100644 index 000000000..a30f106d9 --- /dev/null +++ b/crates/eql-bindings/sql/cipherstash-encrypt.sql @@ -0,0 +1 @@ +-- DEV placeholder. Release automation overwrites this file with exact-version EQL SQL before publishing. diff --git a/crates/eql-bindings/sql/release-manifest.json b/crates/eql-bindings/sql/release-manifest.json new file mode 100644 index 000000000..f25e4219f --- /dev/null +++ b/crates/eql-bindings/sql/release-manifest.json @@ -0,0 +1,6 @@ +{ + "eqlVersion": "DEV", + "schemaVersion": 3, + "installSqlSha256": "", + "uninstallSqlSha256": "" +} diff --git a/crates/eql-bindings/src/lib.rs b/crates/eql-bindings/src/lib.rs index f283382f2..71bed9ed3 100644 --- a/crates/eql-bindings/src/lib.rs +++ b/crates/eql-bindings/src/lib.rs @@ -31,6 +31,7 @@ use serde::{Deserialize, Serialize}; use ts_rs::TS; pub mod from_v2; +pub mod sql; pub mod v3; /// EQL wire-format version. Hard-coded to `3` for every payload in the diff --git a/crates/eql-bindings/src/sql.rs b/crates/eql-bindings/src/sql.rs new file mode 100644 index 000000000..1b7b317c3 --- /dev/null +++ b/crates/eql-bindings/src/sql.rs @@ -0,0 +1,10 @@ +//! Exact SQL assets bundled with a published `eql-bindings` release. + +/// Release metadata for the SQL bundle. +pub const RELEASE_MANIFEST_JSON: &str = include_str!("../sql/release-manifest.json"); + +/// Self-contained EQL v3 install SQL for this crate version. +pub const INSTALL_SQL: &str = include_str!("../sql/cipherstash-encrypt.sql"); + +/// Self-contained EQL v3 uninstall SQL for this crate version. +pub const UNINSTALL_SQL: &str = include_str!("../sql/cipherstash-encrypt-uninstall.sql"); diff --git a/mise.toml b/mise.toml index 85ce98a60..71a907735 100644 --- a/mise.toml +++ b/mise.toml @@ -53,6 +53,11 @@ run = """ rm -f release/cipherstash-encrypt.sql """ +[tasks."release:prepare_bindings_assets"] +description = "Prepare exact-version SQL assets for Rust and TypeScript binding packages" +dir = "{{config_root}}" +run = "tasks/release/prepare-bindings-assets.sh" + [tasks."test:sqlx:prep"] description = "Prepare the SQLx test DB: cp built EQL into migrations, migrate, regenerate fixtures" # `build` produces release/cipherstash-encrypt.sql (the self-contained eql_v3 diff --git a/packages/eql/sql/cipherstash-encrypt-uninstall.sql b/packages/eql/sql/cipherstash-encrypt-uninstall.sql new file mode 100644 index 000000000..cb60f3296 --- /dev/null +++ b/packages/eql/sql/cipherstash-encrypt-uninstall.sql @@ -0,0 +1 @@ +-- DEV placeholder. Release automation overwrites this file with exact-version EQL uninstall SQL before publishing. diff --git a/packages/eql/sql/cipherstash-encrypt.sql b/packages/eql/sql/cipherstash-encrypt.sql new file mode 100644 index 000000000..a30f106d9 --- /dev/null +++ b/packages/eql/sql/cipherstash-encrypt.sql @@ -0,0 +1 @@ +-- DEV placeholder. Release automation overwrites this file with exact-version EQL SQL before publishing. diff --git a/packages/eql/sql/release-manifest.json b/packages/eql/sql/release-manifest.json new file mode 100644 index 000000000..f25e4219f --- /dev/null +++ b/packages/eql/sql/release-manifest.json @@ -0,0 +1,6 @@ +{ + "eqlVersion": "DEV", + "schemaVersion": 3, + "installSqlSha256": "", + "uninstallSqlSha256": "" +} diff --git a/tasks/release/prepare-bindings-assets.sh b/tasks/release/prepare-bindings-assets.sh new file mode 100755 index 000000000..5b2e1ffd9 --- /dev/null +++ b/tasks/release/prepare-bindings-assets.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +#MISE description="Build exact-version SQL and copy it into Rust and TypeScript binding package asset directories" +#USAGE flag "--version " help="Exact release identity, e.g. 3.0.0-alpha.7" + +set -euo pipefail + +version="${usage_version:-}" +# Support both invocation styles: as a mise file task (dashed name) usage +# parsing sets `usage_version`; via the toml wrapper (underscore name) mise +# appends `--version ` to the command, so parse positional args too. +while [[ $# -gt 0 ]]; do + case "$1" in + --version) version="${2:-}"; shift 2 ;; + --version=*) version="${1#*=}"; shift ;; + *) shift ;; + esac +done +if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]]; then + echo "error: --version must be an exact prerelease identity (X.Y.Z-(alpha|beta|rc).N)" >&2 + exit 1 +fi + +mise run build --version "$version" + +install_sql="release/cipherstash-encrypt.sql" +uninstall_sql="release/cipherstash-encrypt-uninstall.sql" +test -f "$install_sql" +test -f "$uninstall_sql" + +install_hash="$(shasum -a 256 "$install_sql" | awk '{print $1}')" +uninstall_hash="$(shasum -a 256 "$uninstall_sql" | awk '{print $1}')" + +for dir in crates/eql-bindings/sql packages/eql/sql; do + mkdir -p "$dir" + cp "$install_sql" "$dir/cipherstash-encrypt.sql" + cp "$uninstall_sql" "$dir/cipherstash-encrypt-uninstall.sql" + cat > "$dir/release-manifest.json" < packages/eql/src/generated/release-manifest.ts < Date: Tue, 7 Jul 2026 11:58:58 +1000 Subject: [PATCH 560/599] ci(release): publish TypeScript bindings to npm --- .github/workflows/lint-release.yml | 2 + .github/workflows/release-typescript.yml | 106 +++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 .github/workflows/release-typescript.yml diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml index d389382a8..938fa3618 100644 --- a/.github/workflows/lint-release.yml +++ b/.github/workflows/lint-release.yml @@ -10,6 +10,7 @@ on: - .github/workflows/_build-docs.yml - .github/workflows/release-eql.yml - .github/workflows/release-plz.yml + - .github/workflows/release-typescript.yml - .github/workflows/release-alpha.yml - .github/workflows/lint-release.yml - .github/actionlint.yaml @@ -48,6 +49,7 @@ jobs: .github/workflows/_build-docs.yml \ .github/workflows/release-eql.yml \ .github/workflows/release-plz.yml \ + .github/workflows/release-typescript.yml \ .github/workflows/release-alpha.yml \ .github/workflows/lint-release.yml diff --git a/.github/workflows/release-typescript.yml b/.github/workflows/release-typescript.yml new file mode 100644 index 000000000..4646dc00d --- /dev/null +++ b/.github/workflows/release-typescript.yml @@ -0,0 +1,106 @@ +name: "Release TypeScript bindings (npm)" + +permissions: + contents: write + id-token: write + +on: + workflow_dispatch: + inputs: + identity: + description: "Exact prerelease identity, e.g. 3.0.0-alpha.7" + required: true + type: string + +concurrency: + group: release-typescript + cancel-in-progress: false + +defaults: + run: + shell: bash {0} + +jobs: + publish: + name: Publish @cipherstash/eql + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: pnpm/action-setup@v6.0.8 + name: Install pnpm + with: + run_install: false + cache: false + + - uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Upgrade npm for OIDC trusted publishing + run: npm install -g npm@^11.5.1 + + - uses: jdx/mise-action@v3 + with: + version: 2026.4.0 + install: true + cache: true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Verify package version matches dispatch identity + run: | + set -euo pipefail + actual="$(node -p "require('./packages/eql/package.json').version")" + test "$actual" = "${{ inputs.identity }}" || { + echo "package version ${actual} does not match identity ${{ inputs.identity }}" >&2 + exit 1 + } + + - name: Prepare exact SQL assets + run: mise run release:prepare_bindings_assets --version "${{ inputs.identity }}" + + - name: Verify generated TypeScript package surface + run: mise run typescript:check + + - name: Verify release manifest matches SQL assets + run: | + set -euo pipefail + node - <<'NODE' + const { createHash } = require('node:crypto') + const { readFileSync } = require('node:fs') + const manifest = require('./packages/eql/sql/release-manifest.json') + const identity = process.env.IDENTITY + const sha256 = (path) => createHash('sha256').update(readFileSync(path)).digest('hex') + if (manifest.eqlVersion !== identity) { + throw new Error(`manifest eqlVersion ${manifest.eqlVersion} does not match ${identity}`) + } + if (manifest.installSqlSha256 !== sha256('./packages/eql/sql/cipherstash-encrypt.sql')) { + throw new Error('install SQL hash mismatch') + } + if (manifest.uninstallSqlSha256 !== sha256('./packages/eql/sql/cipherstash-encrypt-uninstall.sql')) { + throw new Error('uninstall SQL hash mismatch') + } + NODE + env: + IDENTITY: ${{ inputs.identity }} + + - name: Build package + run: pnpm --filter @cipherstash/eql build + + - name: Publish package + working-directory: packages/eql + run: npm publish --access public --provenance + + - name: Tag TypeScript release + run: | + set -euo pipefail + tag="eql-typescript-v${{ inputs.identity }}" + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git tag "$tag" + git push origin "refs/tags/${tag}" From 53e23dcc91f94114e7e7f75187f4f8a1cbaf27d2 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 7 Jul 2026 12:03:26 +1000 Subject: [PATCH 561/599] ci(release): resolve language binding targets --- .github/scripts/derive-identity.sh | 58 ++++++++++++------- .github/scripts/derive-identity.test.sh | 21 ++++++- .github/scripts/release-alpha-resolve.sh | 41 +++++++++---- .github/scripts/release-alpha-resolve.test.sh | 37 +++++++++--- 4 files changed, 111 insertions(+), 46 deletions(-) diff --git a/.github/scripts/derive-identity.sh b/.github/scripts/derive-identity.sh index d25e5296d..6b325a8bc 100755 --- a/.github/scripts/derive-identity.sh +++ b/.github/scripts/derive-identity.sh @@ -24,7 +24,8 @@ highest_n() { derive_identity() { local target="$1" version="$2" channel="$3" pre="$4" local sql_prefix="eql-${version}-${channel}." - local crate_prefix="eql-bindings-v${version}-${channel}." + local rust_prefix="eql-bindings-v${version}-${channel}." + local typescript_prefix="eql-typescript-v${version}-${channel}." if [[ -n "$pre" ]]; then printf '%s\n' "$pre" @@ -33,33 +34,46 @@ derive_identity() { case "$target" in all|eql) - local sql_n crate_n sql_n_dec crate_n_dec n - sql_n=$(highest_n "$sql_prefix") - sql_n=${sql_n:-0} - crate_n=$(highest_n "$crate_prefix") - crate_n=${crate_n:-0} - sql_n_dec=$((10#$sql_n)) - crate_n_dec=$((10#$crate_n)) - if (( sql_n_dec >= crate_n_dec )); then - n=$((sql_n_dec + 1)) - else - n=$((crate_n_dec + 1)) - fi - printf '%s\n' "${version}-${channel}.${n}" + # Fresh identity = one past the highest N across ALL tag namespaces + # (SQL, Rust, TypeScript) so a new release never reuses an N that any + # language package already claimed. + local sql_n rust_n typescript_n n + sql_n=$(highest_n "$sql_prefix"); sql_n=${sql_n:-0} + rust_n=$(highest_n "$rust_prefix"); rust_n=${rust_n:-0} + typescript_n=$(highest_n "$typescript_prefix"); typescript_n=${typescript_n:-0} + n=$((10#$sql_n)) + if (( 10#$rust_n > n )); then n=$((10#$rust_n)); fi + if (( 10#$typescript_n > n )); then n=$((10#$typescript_n)); fi + printf '%s\n' "${version}-${channel}.$((n + 1))" + ;; + rust) + # Newest SQL release still missing a Rust binding tag. + local found n + found="" + for n in $(matching_suffixes "$sql_prefix" | sort -rn); do + if ! tag_exists "${rust_prefix}${n}"; then found="$n"; break; fi + done + [[ -n "$found" ]] || { echo "error: no ${sql_prefix}N SQL release is awaiting a Rust binding publish" >&2; return 1; } + printf '%s\n' "${version}-${channel}.${found}" + ;; + typescript) + # Newest SQL release still missing a TypeScript binding tag. + local found n + found="" + for n in $(matching_suffixes "$sql_prefix" | sort -rn); do + if ! tag_exists "${typescript_prefix}${n}"; then found="$n"; break; fi + done + [[ -n "$found" ]] || { echo "error: no ${sql_prefix}N SQL release is awaiting a TypeScript binding publish" >&2; return 1; } + printf '%s\n' "${version}-${channel}.${found}" ;; bindings) + # Newest SQL release still missing ANY language binding tag. local found n found="" for n in $(matching_suffixes "$sql_prefix" | sort -rn); do - if ! tag_exists "${crate_prefix}${n}"; then - found="$n" - break - fi + if ! tag_exists "${rust_prefix}${n}" || ! tag_exists "${typescript_prefix}${n}"; then found="$n"; break; fi done - if [[ -z "$found" ]]; then - echo "error: no ${sql_prefix}N SQL release is awaiting a crate publish" >&2 - return 1 - fi + [[ -n "$found" ]] || { echo "error: no ${sql_prefix}N SQL release is awaiting a language binding publish" >&2; return 1; } printf '%s\n' "${version}-${channel}.${found}" ;; *) diff --git a/.github/scripts/derive-identity.test.sh b/.github/scripts/derive-identity.test.sh index a56c5869d..063cc2298 100755 --- a/.github/scripts/derive-identity.test.sh +++ b/.github/scripts/derive-identity.test.sh @@ -52,14 +52,29 @@ check "all: leading-zero sql suffix is base-10 -> .9" "$(derive_identity all 3.0 FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.4) check "bindings: latest sql lacking crate -> .5" "$(derive_identity bindings 3.0.0 alpha '')" "3.0.0-alpha.5" -FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5) +# bindings now means ALL language bindings: it only errors once every language +# tag exists for the newest SQL release. +FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5 eql-typescript-v3.0.0-alpha.5) if derive_identity bindings 3.0.0 alpha '' >/dev/null 2>&1; then - echo "FAIL: bindings should error when none awaiting" + echo "FAIL: bindings should error when all language tags exist" fail=1 else - echo "ok: bindings errors when none awaiting a crate" + echo "ok: bindings errors when all language tags exist" fi +# Fresh identity is one past the highest N across all three tag namespaces. +FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.4 eql-typescript-v3.0.0-alpha.6) +check "all derives after all namespaces" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.7" + +FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5) +check "typescript finds sql lacking ts package" "$(derive_identity typescript 3.0.0 alpha '')" "3.0.0-alpha.5" + +FAKE_TAGS=(eql-3.0.0-alpha.5 eql-typescript-v3.0.0-alpha.5) +check "rust finds sql lacking rust package" "$(derive_identity rust 3.0.0 alpha '')" "3.0.0-alpha.5" + +FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5) +check "bindings finds sql lacking one language package" "$(derive_identity bindings 3.0.0 alpha '')" "3.0.0-alpha.5" + check "pre passthrough" "$(derive_identity all 3.0.0 alpha 3.0.0-alpha.9)" "3.0.0-alpha.9" FAKE_TAGS=(eql-3.0.0-beta.7) diff --git a/.github/scripts/release-alpha-resolve.sh b/.github/scripts/release-alpha-resolve.sh index 50b2bd157..380d02879 100755 --- a/.github/scripts/release-alpha-resolve.sh +++ b/.github/scripts/release-alpha-resolve.sh @@ -15,17 +15,21 @@ release_alpha_error() { } release_alpha_emit_outputs() { - local identity="$1" sql_tag="$2" crate_tag="$3" + local identity="$1" sql_tag="$2" rust_tag="$3" typescript_tag="$4" publish_rust="$5" publish_typescript="$6" { echo "identity=${identity}" echo "sql_tag=${sql_tag}" - echo "crate_tag=${crate_tag}" + echo "rust_tag=${rust_tag}" + echo "typescript_tag=${typescript_tag}" + echo "publish_rust=${publish_rust}" + echo "publish_typescript=${publish_typescript}" } | tee -a "${GITHUB_OUTPUT:-/dev/null}" } release_alpha_resolve() { local target="$1" version="$2" channel="$3" pre="$4" ref_type="$5" ref_name="$6" - local identity sql_tag crate_tag head_sha tag_sha + local identity sql_tag rust_tag typescript_tag head_sha tag_sha + local publish_rust=false publish_typescript=false case "$channel" in alpha|beta|rc) ;; @@ -33,7 +37,7 @@ release_alpha_resolve() { esac case "$target" in - all|eql|bindings) ;; + all|eql|bindings|rust|typescript) ;; *) release_alpha_error "invalid target '$target'"; return 1 ;; esac @@ -52,31 +56,39 @@ release_alpha_resolve() { return 1 fi - if [[ "$target" == "all" || "$target" == "bindings" ]]; then + if [[ "$target" == "all" || "$target" == "bindings" || "$target" == "rust" || "$target" == "typescript" ]]; then if [[ "$ref_type" != "branch" ]]; then - release_alpha_error "target=${target} pins+pushes the crate version and requires a branch ref; got ${ref_type} '${ref_name}'. Dispatch with --ref ." + release_alpha_error "target=${target} pins+pushes package versions and requires a branch ref; got ${ref_type} '${ref_name}'. Dispatch with --ref ." return 1 fi fi identity="$(derive_identity "$target" "$version" "$channel" "$pre")" sql_tag="eql-${identity}" - crate_tag="eql-bindings-v${identity}" + rust_tag="eql-bindings-v${identity}" + typescript_tag="eql-typescript-v${identity}" + + case "$target" in + all|bindings|rust) if ! tag_exists "$rust_tag"; then publish_rust=true; fi ;; + esac + case "$target" in + all|bindings|typescript) if ! tag_exists "$typescript_tag"; then publish_typescript=true; fi ;; + esac case "$target" in all) if tag_exists "$sql_tag"; then release_alpha_error "${sql_tag} already exists"; return 1; fi - if tag_exists "$crate_tag"; then release_alpha_error "${crate_tag} already exists"; return 1; fi + if tag_exists "$rust_tag"; then release_alpha_error "${rust_tag} already exists"; return 1; fi + if tag_exists "$typescript_tag"; then release_alpha_error "${typescript_tag} already exists"; return 1; fi ;; eql) if tag_exists "$sql_tag"; then release_alpha_error "${sql_tag} already exists"; return 1; fi ;; - bindings) + bindings|rust|typescript) if ! tag_exists "$sql_tag"; then - release_alpha_error "${sql_tag} SQL release must exist before publishing the crate" + release_alpha_error "${sql_tag} SQL release must exist before publishing language bindings" return 1 fi - if tag_exists "$crate_tag"; then release_alpha_error "${crate_tag} already exists"; return 1; fi head_sha="$(git_head_sha)" tag_sha="$(tag_commit_sha "$sql_tag")" if [[ "$head_sha" != "$tag_sha" ]]; then @@ -86,7 +98,12 @@ release_alpha_resolve() { ;; esac - release_alpha_emit_outputs "$identity" "$sql_tag" "$crate_tag" + if [[ "$target" != "eql" && "$publish_rust" == false && "$publish_typescript" == false ]]; then + release_alpha_error "all requested language binding tags already exist for ${identity}" + return 1 + fi + + release_alpha_emit_outputs "$identity" "$sql_tag" "$rust_tag" "$typescript_tag" "$publish_rust" "$publish_typescript" } if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then diff --git a/.github/scripts/release-alpha-resolve.test.sh b/.github/scripts/release-alpha-resolve.test.sh index 7b56816ec..d1f577e3a 100755 --- a/.github/scripts/release-alpha-resolve.test.sh +++ b/.github/scripts/release-alpha-resolve.test.sh @@ -68,8 +68,8 @@ check_fail() { } FAKE_TAGS=() -check_ok "all emits derived identity and tags" \ - $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\ncrate_tag=eql-bindings-v3.0.0-alpha.1' \ +check_ok "all emits identity, all tags, publish true/true" \ + $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\nrust_tag=eql-bindings-v3.0.0-alpha.1\ntypescript_tag=eql-typescript-v3.0.0-alpha.1\npublish_rust=true\npublish_typescript=true' \ release_alpha_resolve all 3.0.0 alpha "" branch eql_v3 check_fail "rejects invalid target" "invalid target 'bad'" \ @@ -98,8 +98,8 @@ check_fail "eql rejects existing sql tag" "eql-3.0.0-alpha.1 already exists" \ release_alpha_resolve eql 3.0.0 alpha 3.0.0-alpha.1 tag eql-3.0.0-alpha.1 FAKE_TAGS=() -check_ok "eql accepts tag ref without branch" \ - $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\ncrate_tag=eql-bindings-v3.0.0-alpha.1' \ +check_ok "eql accepts tag ref without branch, publish false/false" \ + $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\nrust_tag=eql-bindings-v3.0.0-alpha.1\ntypescript_tag=eql-typescript-v3.0.0-alpha.1\npublish_rust=false\npublish_typescript=false' \ release_alpha_resolve eql 3.0.0 alpha "" tag eql-3.0.0-alpha.1 FAKE_TAGS=(eql-3.0.0-alpha.2) @@ -107,15 +107,34 @@ check_fail "all rejects existing sql tag with explicit pre" "eql-3.0.0-alpha.2 a release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 FAKE_TAGS=(eql-bindings-v3.0.0-alpha.2) -check_fail "all rejects existing crate tag with explicit pre" "eql-bindings-v3.0.0-alpha.2 already exists" \ +check_fail "all rejects existing rust tag with explicit pre" "eql-bindings-v3.0.0-alpha.2 already exists" \ + release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 + +FAKE_TAGS=(eql-typescript-v3.0.0-alpha.2) +check_fail "all rejects existing typescript tag with explicit pre" "eql-typescript-v3.0.0-alpha.2 already exists" \ release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 FAKE_TAGS=() -check_fail "bindings rejects missing sql tag" "SQL release must exist before publishing the crate" \ +check_fail "bindings rejects missing sql tag" "SQL release must exist before publishing language bindings" \ release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 +FAKE_TAGS=() +check_fail "rust rejects missing sql tag" "SQL release must exist before publishing language bindings" \ + release_alpha_resolve rust 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 + +FAKE_TAGS=() +check_fail "typescript rejects missing sql tag" "SQL release must exist before publishing language bindings" \ + release_alpha_resolve typescript 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 + +FAKE_HEAD_SHA="head" +FAKE_TAG_SHA="head" FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.2) -check_fail "bindings rejects existing crate tag" "eql-bindings-v3.0.0-alpha.2 already exists" \ +check_ok "bindings publishes only TypeScript when Rust tag exists" \ + $'identity=3.0.0-alpha.2\nsql_tag=eql-3.0.0-alpha.2\nrust_tag=eql-bindings-v3.0.0-alpha.2\ntypescript_tag=eql-typescript-v3.0.0-alpha.2\npublish_rust=false\npublish_typescript=true' \ + release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 + +FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.2 eql-typescript-v3.0.0-alpha.2) +check_fail "bindings rejects when both language tags exist" "all requested language binding tags already exist" \ release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 FAKE_TAGS=(eql-3.0.0-alpha.2) @@ -126,8 +145,8 @@ check_fail "bindings rejects advanced branch" "branch HEAD (newer) has advanced FAKE_HEAD_SHA="released" FAKE_TAG_SHA="released" -check_ok "bindings accepts same-source sql tag" \ - $'identity=3.0.0-alpha.2\nsql_tag=eql-3.0.0-alpha.2\ncrate_tag=eql-bindings-v3.0.0-alpha.2' \ +check_ok "bindings accepts same-source sql tag, publish true/true" \ + $'identity=3.0.0-alpha.2\nsql_tag=eql-3.0.0-alpha.2\nrust_tag=eql-bindings-v3.0.0-alpha.2\ntypescript_tag=eql-typescript-v3.0.0-alpha.2\npublish_rust=true\npublish_typescript=true' \ release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3 exit "$fail" From a282a3a0247e0459ae8faf841eba8ad55bb3d607 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 7 Jul 2026 12:07:24 +1000 Subject: [PATCH 562/599] ci(release): pin selected language binding packages --- .github/scripts/release-alpha-pin-bindings.sh | 28 +++++++-- .../release-alpha-pin-bindings.test.sh | 63 ++++++++++++++++--- tasks/release/pin-bindings.sh | 9 ++- 3 files changed, 85 insertions(+), 15 deletions(-) diff --git a/.github/scripts/release-alpha-pin-bindings.sh b/.github/scripts/release-alpha-pin-bindings.sh index 7aa84191b..d923c7567 100755 --- a/.github/scripts/release-alpha-pin-bindings.sh +++ b/.github/scripts/release-alpha-pin-bindings.sh @@ -27,22 +27,38 @@ release_alpha_pin_push() { } release_alpha_pin_bindings() { - local identity="$1" branch="$2" + local identity="$1" branch="$2" publish_rust="$3" publish_typescript="$4" local commit_sha local commit_args=() - release-plz set-version "eql-bindings@${identity}" + if [[ "$publish_rust" == "true" ]]; then + release-plz set-version "eql-bindings@${identity}" + fi + + if [[ "$publish_typescript" == "true" ]]; then + node -e "const fs=require('fs'); const p='packages/eql/package.json'; const j=JSON.parse(fs.readFileSync(p,'utf8')); j.version=process.argv[1]; fs.writeFileSync(p, JSON.stringify(j,null,2)+'\n')" "$identity" + pnpm install --lockfile-only + fi + + if [[ "$publish_rust" == "true" || "$publish_typescript" == "true" ]]; then + mise run release:prepare_bindings_assets --version "$identity" + fi if git diff --quiet && git diff --cached --quiet; then - echo "set-version produced no changes (already pinned to ${identity}); skipping commit/push" + echo "package versions already pinned to ${identity}; skipping commit/push" else git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock + if [[ "$publish_rust" == "true" ]]; then + git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock crates/eql-bindings/sql + fi + if [[ "$publish_typescript" == "true" ]]; then + git add packages/eql/package.json pnpm-lock.yaml packages/eql/sql packages/eql/src/generated/release-manifest.ts + fi if [[ "${RELEASE_ALPHA_COMMIT_SIGN:-true}" == "true" ]]; then commit_args=(-S) fi - git commit "${commit_args[@]}" -m "chore(release): pin eql-bindings to ${identity}" + git commit "${commit_args[@]}" -m "chore(release): pin language bindings to ${identity}" release_alpha_pin_push "$branch" fi @@ -51,5 +67,5 @@ release_alpha_pin_bindings() { } if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - release_alpha_pin_bindings "${IDENTITY:?}" "${BRANCH:?}" + release_alpha_pin_bindings "${IDENTITY:?}" "${BRANCH:?}" "${PUBLISH_RUST:?}" "${PUBLISH_TYPESCRIPT:?}" fi diff --git a/.github/scripts/release-alpha-pin-bindings.test.sh b/.github/scripts/release-alpha-pin-bindings.test.sh index 1cf74c369..2e6a2300e 100755 --- a/.github/scripts/release-alpha-pin-bindings.test.sh +++ b/.github/scripts/release-alpha-pin-bindings.test.sh @@ -11,7 +11,7 @@ fail=0 setup_repo() { tmp="$(mktemp -d)" - mkdir -p "$tmp/bin" "$tmp/repo/crates/eql-bindings" + mkdir -p "$tmp/bin" "$tmp/repo/crates/eql-bindings" "$tmp/repo/packages/eql" cat > "$tmp/bin/release-plz" <<'SCRIPT' #!/usr/bin/env bash set -euo pipefail @@ -21,6 +21,23 @@ if [[ "${RELEASE_PLZ_TOUCH:-}" == "1" ]]; then fi SCRIPT chmod +x "$tmp/bin/release-plz" + # Fake pnpm: the pin script runs `pnpm install --lockfile-only` for a + # TypeScript pin. Just record the call so we don't touch the network. + cat > "$tmp/bin/pnpm" <<'SCRIPT' +#!/usr/bin/env bash +set -euo pipefail +echo "$*" >> "$PNPM_LOG" +SCRIPT + chmod +x "$tmp/bin/pnpm" + # Fake mise: the pin script runs `mise run release:prepare_bindings_assets`. + # The real SQL-asset build is covered elsewhere; here we only need a no-op so + # the git commit/version-pin logic is what's under test. + cat > "$tmp/bin/mise" <<'SCRIPT' +#!/usr/bin/env bash +set -euo pipefail +echo "$*" >> "$MISE_LOG" +SCRIPT + chmod +x "$tmp/bin/mise" ( cd "$tmp/repo" || exit 1 git init -q @@ -30,7 +47,15 @@ SCRIPT printf '[package]\nname = "eql-bindings"\nversion = "0.0.0"\n' > crates/eql-bindings/Cargo.toml printf '# changelog\n' > crates/eql-bindings/CHANGELOG.md printf '# lock\n' > Cargo.lock - git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock + # Asset directories the pin script `git add`s must exist to be added. + mkdir -p crates/eql-bindings/sql packages/eql/src/generated + printf -- '-- placeholder\n' > crates/eql-bindings/sql/cipherstash-encrypt.sql + mkdir -p packages/eql/sql + printf -- '-- placeholder\n' > packages/eql/sql/cipherstash-encrypt.sql + printf '{\n "name": "@cipherstash/eql",\n "version": "0.0.0"\n}\n' > packages/eql/package.json + printf 'lockfileVersion: "9.0"\n' > pnpm-lock.yaml + printf "export const releaseManifest = { eqlVersion: 'DEV' } as const\n" > packages/eql/src/generated/release-manifest.ts + git add -A git commit -q -m initial git branch -M test-branch git init -q --bare "$tmp/origin.git" @@ -45,8 +70,8 @@ check_noop() { output="$( cd "$tmp/repo" || exit 1 set -euo pipefail - PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" RELEASE_ALPHA_COMMIT_SIGN=false \ - release_alpha_pin_bindings 3.0.0-alpha.1 test-branch 2>&1 + PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" MISE_LOG="$tmp/mise-log" PNPM_LOG="$tmp/pnpm-log" RELEASE_ALPHA_COMMIT_SIGN=false \ + release_alpha_pin_bindings 3.0.0-alpha.1 test-branch true false 2>&1 )" status=$? after="$(cd "$tmp/repo" && git rev-parse HEAD)" @@ -66,14 +91,14 @@ check_commit() { output="$( cd "$tmp/repo" || exit 1 set -euo pipefail - PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" RELEASE_PLZ_TOUCH=1 RELEASE_ALPHA_COMMIT_SIGN=false \ - release_alpha_pin_bindings 3.0.0-alpha.2 test-branch 2>&1 + PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" MISE_LOG="$tmp/mise-log" PNPM_LOG="$tmp/pnpm-log" RELEASE_PLZ_TOUCH=1 RELEASE_ALPHA_COMMIT_SIGN=false \ + release_alpha_pin_bindings 3.0.0-alpha.2 test-branch true false 2>&1 )" status=$? after="$(cd "$tmp/repo" && git rev-parse HEAD)" subject="$(cd "$tmp/repo" && git log -1 --format=%s)" version="$(sed -n 's/^version = "\(.*\)"/\1/p' "$tmp/repo/crates/eql-bindings/Cargo.toml")" - if [[ "$status" -eq 0 && "$before" != "$after" && "$subject" == "chore(release): pin eql-bindings to 3.0.0-alpha.2" && "$version" == "3.0.0-alpha.2" && "$output" == *"commit_sha=${after}"* ]]; then + if [[ "$status" -eq 0 && "$before" != "$after" && "$subject" == "chore(release): pin language bindings to 3.0.0-alpha.2" && "$version" == "3.0.0-alpha.2" && "$output" == *"commit_sha=${after}"* ]]; then echo "ok: changed version commits and emits new commit" else echo "FAIL: commit status=$status before=$before after=$after subject='$subject' version='$version' output='$output'" @@ -82,6 +107,29 @@ check_commit() { rm -rf "$tmp" } +check_typescript_commit() { + local before after subject output status version + setup_repo + before="$(cd "$tmp/repo" && git rev-parse HEAD)" + output="$( + cd "$tmp/repo" || exit 1 + set -euo pipefail + PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" MISE_LOG="$tmp/mise-log" PNPM_LOG="$tmp/pnpm-log" RELEASE_ALPHA_COMMIT_SIGN=false \ + release_alpha_pin_bindings 3.0.0-alpha.3 test-branch false true 2>&1 + )" + status=$? + after="$(cd "$tmp/repo" && git rev-parse HEAD)" + subject="$(cd "$tmp/repo" && git log -1 --format=%s)" + version="$(node -e "console.log(require('$tmp/repo/packages/eql/package.json').version)")" + if [[ "$status" -eq 0 && "$before" != "$after" && "$subject" == "chore(release): pin language bindings to 3.0.0-alpha.3" && "$version" == "3.0.0-alpha.3" ]]; then + echo "ok: typescript version commits" + else + echo "FAIL: typescript commit status=$status before=$before after=$after subject='$subject' version='$version' output='$output'" + fail=1 + fi + rm -rf "$tmp" +} + check_push_target_keeps_token_out_of_url() { local output output="$( @@ -98,6 +146,7 @@ check_push_target_keeps_token_out_of_url() { check_noop check_commit +check_typescript_commit check_push_target_keeps_token_out_of_url exit "$fail" diff --git a/tasks/release/pin-bindings.sh b/tasks/release/pin-bindings.sh index 1cb90f82e..dc9e73fea 100755 --- a/tasks/release/pin-bindings.sh +++ b/tasks/release/pin-bindings.sh @@ -1,15 +1,20 @@ #!/usr/bin/env bash -#MISE description="CI-oriented helper: pin eql-bindings to an identity, commit, and push" +#MISE description="CI-oriented helper: pin language binding package versions to an identity, commit, and push" #USAGE flag "--identity " help="Exact prerelease identity, e.g. 3.0.0-alpha.2" #USAGE flag "--branch " help="Branch to push the pin commit to" +#USAGE flag "--publish-rust " help="Pin the Rust eql-bindings crate (true/false)" default="true" +#USAGE flag "--publish-typescript " help="Pin the TypeScript @cipherstash/eql package (true/false)" default="true" set -euo pipefail root="$(git rev-parse --show-toplevel)" identity="${usage_identity:-}" branch="${usage_branch:-}" +publish_rust="${usage_publish_rust:-true}" +publish_typescript="${usage_publish_typescript:-true}" [[ -n "$identity" ]] || { echo "error: --identity is required" >&2; exit 1; } [[ -n "$branch" ]] || { echo "error: --branch is required" >&2; exit 1; } -IDENTITY="$identity" BRANCH="$branch" "${root}/.github/scripts/release-alpha-pin-bindings.sh" +IDENTITY="$identity" BRANCH="$branch" PUBLISH_RUST="$publish_rust" PUBLISH_TYPESCRIPT="$publish_typescript" \ + "${root}/.github/scripts/release-alpha-pin-bindings.sh" From 2ee4439c0c51af54ab63ee6f82f32adcf5a04ea1 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 7 Jul 2026 12:09:42 +1000 Subject: [PATCH 563/599] ci(release): publish all language bindings from coordinator --- .github/workflows/release-alpha.yml | 96 +++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml index a37812a17..9e91d742a 100644 --- a/.github/workflows/release-alpha.yml +++ b/.github/workflows/release-alpha.yml @@ -8,10 +8,10 @@ on: workflow_dispatch: inputs: target: - description: "all | eql | bindings" + description: "all | eql | bindings | rust | typescript" required: true type: choice - options: [all, eql, bindings] + options: [all, eql, bindings, rust, typescript] default: all version: description: "Base SemVer, e.g. 3.0.0" @@ -66,7 +66,10 @@ jobs: outputs: identity: ${{ steps.derive.outputs.identity }} sql_tag: ${{ steps.derive.outputs.sql_tag }} - crate_tag: ${{ steps.derive.outputs.crate_tag }} + rust_tag: ${{ steps.derive.outputs.rust_tag }} + typescript_tag: ${{ steps.derive.outputs.typescript_tag }} + publish_rust: ${{ steps.derive.outputs.publish_rust }} + publish_typescript: ${{ steps.derive.outputs.publish_typescript }} steps: - uses: actions/checkout@v4 with: @@ -105,7 +108,10 @@ jobs: DRY: ${{ inputs.dry_run }} IDENTITY: ${{ steps.derive.outputs.identity }} SQL_TAG: ${{ steps.derive.outputs.sql_tag }} - CRATE_TAG: ${{ steps.derive.outputs.crate_tag }} + RUST_TAG: ${{ steps.derive.outputs.rust_tag }} + TYPESCRIPT_TAG: ${{ steps.derive.outputs.typescript_tag }} + PUBLISH_RUST: ${{ steps.derive.outputs.publish_rust }} + PUBLISH_TYPESCRIPT: ${{ steps.derive.outputs.publish_typescript }} REF_NAME: ${{ github.ref_name }} SHA: ${{ github.sha }} run: | @@ -118,16 +124,17 @@ jobs: echo "| target | ${TARGET} |" echo "| identity | ${IDENTITY} |" echo "| sql_tag | ${SQL_TAG} |" - echo "| crate_tag | ${CRATE_TAG} |" + echo "| rust_tag | ${RUST_TAG} (publish=${PUBLISH_RUST}) |" + echo "| typescript_tag | ${TYPESCRIPT_TAG} (publish=${PUBLISH_TYPESCRIPT}) |" echo "| ref | ${REF_NAME} @ ${SHA} |" echo "| dry_run | ${DRY} |" } >> "$GITHUB_STEP_SUMMARY" pin: - name: Pin crate version (commit S) + name: Pin package versions (commit S) runs-on: blacksmith-16vcpu-ubuntu-2204 needs: resolve - if: ${{ !inputs.dry_run && (inputs.target == 'all' || inputs.target == 'bindings') }} + if: ${{ !inputs.dry_run && (inputs.target == 'all' || inputs.target == 'bindings' || inputs.target == 'rust' || inputs.target == 'typescript') }} permissions: contents: write timeout-minutes: 15 @@ -155,6 +162,15 @@ jobs: install: true cache: true + - uses: pnpm/action-setup@v6.0.8 + with: + run_install: false + cache: false + + - uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Install release-plz CLI run: cargo binstall --no-confirm release-plz @@ -164,6 +180,8 @@ jobs: IDENTITY: ${{ needs.resolve.outputs.identity }} BRANCH: ${{ github.ref_name }} GH_TOKEN: ${{ github.token }} + PUBLISH_RUST: ${{ needs.resolve.outputs.publish_rust }} + PUBLISH_TYPESCRIPT: ${{ needs.resolve.outputs.publish_typescript }} run: .github/scripts/release-alpha-pin-bindings.sh - name: Verify pin commit signature @@ -206,13 +224,13 @@ jobs: ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }} tag: ${{ needs.resolve.outputs.sql_tag }} - crate-publish: - name: Dispatch crate publish (release-plz.yml) + rust-publish: + name: Dispatch Rust crate publish (release-plz.yml) runs-on: blacksmith-16vcpu-ubuntu-2204 needs: [resolve, pin, build-sql, build-docs] if: >- ${{ !cancelled() && !inputs.dry_run - && (inputs.target == 'all' || inputs.target == 'bindings') + && needs.resolve.outputs.publish_rust == 'true' && needs.pin.result == 'success' && (needs.build-sql.result == 'success' || needs.build-sql.result == 'skipped') && (needs.build-docs.result == 'success' || needs.build-docs.result == 'skipped') }} @@ -236,16 +254,53 @@ jobs: echo "Dispatching release-plz.yml --ref ${ref}" gh workflow run release-plz.yml --ref "$ref" { - echo "## Crate publish dispatch accepted" + echo "## Rust crate publish dispatch accepted" echo "" - echo "Crate publish DISPATCHED against \`${ref}\`." + echo "Rust crate publish DISPATCHED against \`${ref}\`." echo "Verify the separate \`release-plz.yml\` run reaches a terminal success state before treating the crate as published." } >> "$GITHUB_STEP_SUMMARY" + typescript-publish: + name: Dispatch TypeScript publish (release-typescript.yml) + runs-on: blacksmith-16vcpu-ubuntu-2204 + needs: [resolve, pin, build-sql, build-docs] + if: >- + ${{ !cancelled() && !inputs.dry_run + && needs.resolve.outputs.publish_typescript == 'true' + && needs.pin.result == 'success' + && (needs.build-sql.result == 'success' || needs.build-sql.result == 'skipped') + && (needs.build-docs.result == 'success' || needs.build-docs.result == 'skipped') }} + timeout-minutes: 10 + permissions: + actions: write + steps: + - name: Dispatch release-typescript.yml against the pinned commit + env: + GH_TOKEN: ${{ github.token }} + SQL_TAG: ${{ needs.resolve.outputs.sql_tag }} + BRANCH: ${{ github.ref_name }} + TARGET: ${{ inputs.target }} + IDENTITY: ${{ needs.resolve.outputs.identity }} + run: | + set -euo pipefail + if [[ "$TARGET" == "all" ]]; then + ref="$SQL_TAG" + else + ref="$BRANCH" + fi + echo "Dispatching release-typescript.yml --ref ${ref}" + gh workflow run release-typescript.yml --ref "$ref" -f identity="$IDENTITY" + { + echo "## TypeScript publish dispatch accepted" + echo "" + echo "TypeScript npm publish DISPATCHED against \`${ref}\`." + echo "Verify the separate \`release-typescript.yml\` run reaches a terminal success state before treating the package as published." + } >> "$GITHUB_STEP_SUMMARY" + summary: name: Summary runs-on: blacksmith-16vcpu-ubuntu-2204 - needs: [resolve, pin, build-sql, build-docs, crate-publish] + needs: [resolve, pin, build-sql, build-docs, rust-publish, typescript-publish] if: always() steps: - name: Emit run summary @@ -254,12 +309,16 @@ jobs: DRY: ${{ inputs.dry_run }} IDENTITY: ${{ needs.resolve.outputs.identity }} SQL_TAG: ${{ needs.resolve.outputs.sql_tag }} - CRATE_TAG: ${{ needs.resolve.outputs.crate_tag }} + RUST_TAG: ${{ needs.resolve.outputs.rust_tag }} + TYPESCRIPT_TAG: ${{ needs.resolve.outputs.typescript_tag }} + PUBLISH_RUST: ${{ needs.resolve.outputs.publish_rust }} + PUBLISH_TYPESCRIPT: ${{ needs.resolve.outputs.publish_typescript }} RESOLVE_RESULT: ${{ needs.resolve.result }} PIN_RESULT: ${{ needs.pin.result }} BUILD_SQL_RESULT: ${{ needs.build-sql.result }} BUILD_DOCS_RESULT: ${{ needs.build-docs.result }} - CRATE_PUBLISH_RESULT: ${{ needs.crate-publish.result }} + RUST_PUBLISH_RESULT: ${{ needs.rust-publish.result }} + TYPESCRIPT_PUBLISH_RESULT: ${{ needs.typescript-publish.result }} SERVER_URL: ${{ github.server_url }} REPOSITORY: ${{ github.repository }} RUN_ID: ${{ github.run_id }} @@ -271,9 +330,10 @@ jobs: echo "- target: \`${TARGET}\` (dry_run=${DRY})" echo "- identity: \`${IDENTITY}\`" echo "- sql_tag: \`${SQL_TAG}\`" - echo "- crate_tag: \`${CRATE_TAG}\`" - echo "- resolve: ${RESOLVE_RESULT} | pin: ${PIN_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | crate-publish-dispatch: ${CRATE_PUBLISH_RESULT}" + echo "- rust_tag: \`${RUST_TAG}\` (publish=${PUBLISH_RUST})" + echo "- typescript_tag: \`${TYPESCRIPT_TAG}\` (publish=${PUBLISH_TYPESCRIPT})" + echo "- resolve: ${RESOLVE_RESULT} | pin: ${PIN_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | rust-publish-dispatch: ${RUST_PUBLISH_RESULT} | typescript-publish-dispatch: ${TYPESCRIPT_PUBLISH_RESULT}" echo "" echo "Coordinator run: ${SERVER_URL}/${REPOSITORY}/actions/runs/${RUN_ID}" - echo "Crate publish is only DISPATCHED by this coordinator. Verify the separate release-plz.yml run before treating the crate publish as successful." + echo "Rust and TypeScript publishes are DISPATCHED by this coordinator. Verify the separate release-plz.yml and release-typescript.yml runs before treating package publishes as successful." } >> "$GITHUB_STEP_SUMMARY" From f589fbbd70e14adb520026edf4f0fe69e7e09e24 Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 7 Jul 2026 12:12:10 +1000 Subject: [PATCH 564/599] chore(release): add language-specific release wrappers --- .github/workflows/lint-release.yml | 3 ++ tasks/release/all.sh | 8 ++-- tasks/release/bindings.sh | 14 +++---- tasks/release/rust.sh | 60 +++++++++++++++++++++++++++++ tasks/release/typescript.sh | 61 ++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 11 deletions(-) create mode 100755 tasks/release/rust.sh create mode 100755 tasks/release/typescript.sh diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml index 938fa3618..3d52206ab 100644 --- a/.github/workflows/lint-release.yml +++ b/.github/workflows/lint-release.yml @@ -60,6 +60,9 @@ jobs: tasks/release/all.sh \ tasks/release/eql.sh \ tasks/release/bindings.sh \ + tasks/release/rust.sh \ + tasks/release/typescript.sh \ + tasks/release/prepare-bindings-assets.sh \ tasks/release/resolve-alpha.sh \ tasks/release/pin-bindings.sh \ .github/scripts/derive-identity.sh \ diff --git a/tasks/release/all.sh b/tasks/release/all.sh index 75d9ffd62..85e3131a4 100755 --- a/tasks/release/all.sh +++ b/tasks/release/all.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#MISE description="Cut an alpha of BOTH artefacts in lockstep: dispatch release-alpha.yml (target=all) and watch the run" +#MISE description="Cut an alpha of SQL + docs + ALL language binding packages in lockstep: dispatch release-alpha.yml (target=all) and watch" #USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0" #USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha" #USAGE flag "--pre
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
@@ -31,9 +31,9 @@ fi
 command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
 gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
 
-# target=all pins+pushes the crate version, so require an explicit branch.
+# target=all pins+pushes language package versions, so require an explicit branch.
 if [[ -z "$ref" ]]; then
-  err "missing --ref  (target=all pushes the crate pin to that branch)"
+  err "missing --ref  (target=all pushes language package pins to that branch)"
 fi
 
 # Unique correlation id echoed into the coordinator's run-name so we watch the
@@ -60,4 +60,4 @@ done
 
 echo "==> Watching run ${run_id}"
 gh run watch "$run_id" --exit-status
-echo "==> Coordinator finished. For target=all, the crate publish runs as a SEPARATE release-plz.yml run - watch it in the Actions tab."
+echo "==> Coordinator finished. Rust and TypeScript package publishes run as SEPARATE release workflows - watch them in the Actions tab."
diff --git a/tasks/release/bindings.sh b/tasks/release/bindings.sh
index 371f9da3d..43bf0e30b 100755
--- a/tasks/release/bindings.sh
+++ b/tasks/release/bindings.sh
@@ -1,5 +1,5 @@
 #!/usr/bin/env bash
-#MISE description="Publish the eql-bindings crate for an EXISTING SQL alpha (same-source, +1 metadata commit): dispatch release-alpha.yml (target=bindings) and watch"
+#MISE description="Publish ALL language EQL bindings for an EXISTING SQL alpha: dispatch release-alpha.yml (target=bindings) and watch"
 #USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
 #USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
 #USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
@@ -8,10 +8,10 @@
 
 set -euo pipefail
 
-# target=bindings publishes the crate SAME-SOURCE from an existing eql-
-# SQL release: the branch must currently be AT that release's commit (the
-# coordinator guards branch-HEAD == SQL-tag-commit), and the pin adds a
-# metadata-only commit on top. Requires a BRANCH (the pin is pushed).
+# target=bindings publishes missing language binding packages SAME-SOURCE from
+# an existing eql- SQL release. The branch must currently be AT that
+# release's commit; the coordinator pins package metadata on top and dispatches
+# the language-specific publish workflows.
 
 target="bindings"
 version="${usage_version:-3.0.0}"
@@ -32,7 +32,7 @@ command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
 gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
 
 if [[ -z "$ref" ]]; then
-  err "missing --ref  (target=bindings pushes the crate pin to that branch)"
+  err "missing --ref  (target=bindings pushes language package pins to that branch)"
 fi
 
 dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
@@ -57,4 +57,4 @@ done
 
 echo "==> Watching run ${run_id}"
 gh run watch "$run_id" --exit-status
-echo "==> Coordinator finished. The crate publish runs as a SEPARATE release-plz.yml run - watch it in the Actions tab."
+echo "==> Coordinator finished. Language package publishes run as SEPARATE release workflows - watch them in the Actions tab."
diff --git a/tasks/release/rust.sh b/tasks/release/rust.sh
new file mode 100755
index 000000000..07242d0c4
--- /dev/null
+++ b/tasks/release/rust.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+#MISE description="Publish the Rust EQL bindings for an EXISTING SQL alpha: dispatch release-alpha.yml (target=rust) and watch"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git branch to dispatch against (must currently be AT the eql- commit)" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+# target=rust publishes the Rust eql-bindings crate SAME-SOURCE from an existing
+# eql- SQL release: the branch must currently be AT that release's
+# commit (the coordinator guards branch-HEAD == SQL-tag-commit), and the pin
+# adds a metadata-only commit on top. Requires a BRANCH (the pin is pushed).
+
+target="rust"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+if [[ -z "$ref" ]]; then
+  err "missing --ref  (target=rust pushes the Rust package pin to that branch)"
+fi
+
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
+
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
+
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
+
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Coordinator finished. The Rust crate publish runs as a SEPARATE release-plz.yml run - watch it in the Actions tab."
diff --git a/tasks/release/typescript.sh b/tasks/release/typescript.sh
new file mode 100755
index 000000000..d7c8588ef
--- /dev/null
+++ b/tasks/release/typescript.sh
@@ -0,0 +1,61 @@
+#!/usr/bin/env bash
+#MISE description="Publish the TypeScript EQL bindings for an EXISTING SQL alpha: dispatch release-alpha.yml (target=typescript) and watch"
+#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
+#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
+#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
+#USAGE flag "--ref " help="Git branch to dispatch against (must currently be AT the eql- commit)" default=""
+#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
+
+set -euo pipefail
+
+# target=typescript publishes the TypeScript @cipherstash/eql package SAME-SOURCE
+# from an existing eql- SQL release: the branch must currently be AT
+# that release's commit (the coordinator guards branch-HEAD == SQL-tag-commit),
+# and the pin adds a metadata-only commit on top. Requires a BRANCH (the pin is
+# pushed).
+
+target="typescript"
+version="${usage_version:-3.0.0}"
+channel="${usage_channel:-alpha}"
+pre="${usage_pre:-}"
+ref="${usage_ref:-}"
+dry_run="${usage_dry_run:-false}"
+
+err() { echo "error: $*" >&2; exit 1; }
+
+case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
+[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
+if [[ -n "$pre" ]]; then
+  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
+fi
+
+command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
+gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
+
+if [[ -z "$ref" ]]; then
+  err "missing --ref  (target=typescript pushes the TypeScript package pin to that branch)"
+fi
+
+dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
+
+args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
+[[ -n "$pre" ]] && args+=(-f pre="$pre")
+[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
+
+echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
+gh workflow run release-alpha.yml "${args[@]}"
+
+echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
+run_id=""
+for _ in $(seq 1 30); do
+  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
+    --json databaseId,displayTitle \
+    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
+  [[ -n "$run_id" && "$run_id" != "null" ]] && break
+  sleep 2
+done
+[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
+
+echo "==> Watching run ${run_id}"
+gh run watch "$run_id" --exit-status
+echo "==> Coordinator finished. The TypeScript npm publish runs as a SEPARATE release-typescript.yml run - watch it in the Actions tab."

From c0dd84a84bb08d066fb2428151f8dda1b28539e7 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Tue, 7 Jul 2026 12:23:06 +1000
Subject: [PATCH 565/599] test(typescript): cover generated EQL package surface

---
 packages/eql/src/index.test.ts | 33 +++++++++++++++++++++++++++++++++
 packages/eql/src/sql.test.ts   | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)
 create mode 100644 packages/eql/src/index.test.ts
 create mode 100644 packages/eql/src/sql.test.ts

diff --git a/packages/eql/src/index.test.ts b/packages/eql/src/index.test.ts
new file mode 100644
index 000000000..e2f938954
--- /dev/null
+++ b/packages/eql/src/index.test.ts
@@ -0,0 +1,33 @@
+import { describe, expect, test } from 'vitest'
+import { schemaId, schemaIds, schemaNames } from './schema'
+import type { IntegerEq, TextSearch } from './index'
+
+describe('@cipherstash/eql generated surface', () => {
+  test('exports schema metadata for generated domains', () => {
+    expect(schemaNames).toContain('integer_eq')
+    expect(schemaNames).toContain('text_search')
+    expect(schemaId('integer_eq')).toBe('https://schemas.cipherstash.com/eql/v3/integer_eq.json')
+    expect(schemaIds.text_search).toBe('https://schemas.cipherstash.com/eql/v3/text_search.json')
+  })
+
+  test('generated wire types are usable by TypeScript consumers', () => {
+    const integer: IntegerEq = {
+      v: 3,
+      i: { t: 'users', c: 'age' },
+      c: 'mp_base85_ciphertext',
+      hm: 'deadbeef',
+    }
+
+    const text: TextSearch = {
+      v: 3,
+      i: { t: 'users', c: 'email' },
+      c: 'mp_base85_ciphertext',
+      hm: 'deadbeef',
+      ob: ['ore'],
+      bf: [1, 2, 3],
+    }
+
+    expect(integer.v).toBe(3)
+    expect(text.bf).toEqual([1, 2, 3])
+  })
+})
diff --git a/packages/eql/src/sql.test.ts b/packages/eql/src/sql.test.ts
new file mode 100644
index 000000000..11b4b0a0c
--- /dev/null
+++ b/packages/eql/src/sql.test.ts
@@ -0,0 +1,34 @@
+import { existsSync } from 'node:fs'
+import { describe, expect, test } from 'vitest'
+import { installSqlPath, readInstallSql, releaseManifest, uninstallSqlPath } from './sql'
+
+describe('@cipherstash/eql SQL assets', () => {
+  test('release manifest shape is stable', () => {
+    expect(releaseManifest.schemaVersion).toBe(3)
+    expect(releaseManifest).toHaveProperty('eqlVersion')
+    expect(releaseManifest).toHaveProperty('installSqlSha256')
+    expect(releaseManifest).toHaveProperty('uninstallSqlSha256')
+  })
+
+  test('SQL path helpers point at packaged filenames', () => {
+    expect(installSqlPath()).toMatch(/cipherstash-encrypt\.sql$/)
+    expect(uninstallSqlPath()).toMatch(/cipherstash-encrypt-uninstall\.sql$/)
+  })
+
+  test('readInstallSql reads prepared assets, the DEV placeholder, or fails clearly', () => {
+    // Three valid states: no bundled SQL yet (throws), the committed DEV
+    // placeholder (before `release:prepare_bindings_assets`), or real
+    // exact-version SQL (after prep, e.g. in the publish workflow). The
+    // release manifest is the deterministic signal for which state we're in.
+    if (!existsSync(installSqlPath())) {
+      expect(() => readInstallSql()).toThrow(/EQL SQL asset is missing/)
+      return
+    }
+    const sql = readInstallSql()
+    if (releaseManifest.eqlVersion === 'DEV') {
+      expect(sql).toContain('DEV placeholder')
+    } else {
+      expect(sql).toContain('eql_v3')
+    }
+  })
+})

From f2240bc4e85432944c079990b17ccc42a97d984e Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Tue, 7 Jul 2026 12:24:36 +1000
Subject: [PATCH 566/599] docs(release): describe language binding releases

---
 README.md                              |  8 +++++++
 crates/eql-bindings/README.md          |  4 ++++
 docs/development/releasing-an-alpha.md | 32 ++++++++++++++++++++------
 3 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/README.md b/README.md
index b8b305fce..c1f8911a6 100644
--- a/README.md
+++ b/README.md
@@ -85,6 +85,14 @@ Encrypted columns are typed as `public` domains (e.g. `public.text_eq`, `public.
 The domain types deliberately live in `public`, not `eql_v3`, so application tables survive an EQL uninstall: `DROP SCHEMA eql_v3 CASCADE` removes the operators, extractors, and aggregates but leaves the `public`-typed columns (and their data) intact. Re-running the install script is idempotent.
 
 
+### Release artifacts
+
+EQL v3 prereleases can ship three artifacts under one identity: the SQL + docs
+GitHub release, the Rust `eql-bindings` crate, and the TypeScript
+`@cipherstash/eql` npm package. The language packages bundle the exact SQL
+installer they were generated against.
+
+
 ## Database Permissions
 
 EQL requires specific database privileges to install and operate correctly. The permissions needed depend on your deployment pattern.
diff --git a/crates/eql-bindings/README.md b/crates/eql-bindings/README.md
index d706f125d..1f95bb6a5 100644
--- a/crates/eql-bindings/README.md
+++ b/crates/eql-bindings/README.md
@@ -75,6 +75,10 @@ working tree dirty if the checked-in copies were stale. Only `types:generate`
 isolates the writes (it exports into a temp dir and swaps them in after the
 build succeeds).
 
+Published `eql-bindings` crates also include `eql_bindings::sql`, which exposes
+the exact self-contained SQL installer and uninstaller built for the same EQL
+release identity as the Rust wire types.
+
 ## Future direction: self-describing payloads
 
 On the wire, a v3 payload is discriminated only by *which key is present*
diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md
index 606700ae1..4323c1ec4 100644
--- a/docs/development/releasing-an-alpha.md
+++ b/docs/development/releasing-an-alpha.md
@@ -45,13 +45,31 @@ not locally.
 
 | Task | Coordinator target | Result |
 |------|--------------------|--------|
-| `mise run release:all` | `all` | Pins `eql-bindings` to the resolved identity, commits and pushes the pin, builds and attaches SQL + docs, then dispatches `release-plz.yml` so the crate publishes from the same commit. |
-| `mise run release:eql` | `eql` | Builds and attaches the SQL prerelease + docs only. No crate publish and no pin commit. |
-| `mise run release:bindings` | `bindings` | Publishes `eql-bindings` for an existing `eql-` SQL release from the same source, with a metadata-only pin commit on top. |
-
-`release:all` and `release:bindings` require `--ref ` because the
-coordinator pushes the crate-version pin. `release:eql` can run against any ref
-because it does not push.
+| `mise run release:all` | `all` | Pins Rust + TypeScript package versions, builds and releases SQL + docs, then dispatches Rust and TypeScript package publishes from the same release identity. |
+| `mise run release:eql` | `eql` | Builds and releases SQL + docs only. No language package publish. |
+| `mise run release:bindings` | `bindings` | Publishes all missing language binding packages for an existing same-source SQL prerelease. |
+| `mise run release:rust` | `rust` | Publishes only the Rust `eql-bindings` crate for an existing same-source SQL prerelease. |
+| `mise run release:typescript` | `typescript` | Publishes only the TypeScript `@cipherstash/eql` npm package for an existing same-source SQL prerelease. |
+
+`release:all`, `release:bindings`, `release:rust`, and `release:typescript`
+require `--ref ` because the coordinator pushes the package-version pin.
+`release:eql` can run against any ref because it does not push.
+
+Language binding package tags:
+
+- Rust: `eql-bindings-v`
+- TypeScript: `eql-typescript-v`
+
+`target=bindings` means all language bindings, not only the Rust crate. Specific
+language targets use language names (`rust`, `typescript`) rather than
+package-manager names (`crate`, `npm`) so the operator interface remains stable
+if packaging changes later.
+
+The TypeScript publish workflow uses npm trusted publishing and must run on
+GitHub-hosted `ubuntu-latest`. Do not move `release-typescript.yml` to a
+Blacksmith/self-hosted runner: npm provenance rejects self-hosted runners. The
+workflow intentionally has `id-token: write`, upgrades npm to `^11.5.1`, and
+does not use `NPM_TOKEN`.
 
 Common flags:
 

From 093202c1d33678132bbe928ddf95eeedc90d93dc Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Tue, 7 Jul 2026 12:41:11 +1000
Subject: [PATCH 567/599] docs(release): align runbook, CLAUDE.md, and
 changelog with language-binding release surface

---
 CHANGELOG.md                           |  2 +
 CLAUDE.md                              |  6 +-
 docs/development/releasing-an-alpha.md | 83 ++++++++++++++++----------
 tasks/release/resolve-alpha.sh         |  2 +-
 4 files changed, 57 insertions(+), 36 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d35e1e5f6..75e218c2e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@ Each entry that ships in a published release links to the PR that introduced it.
 - **`COMMENT ON DOMAIN` on every `eql_v3` encrypted domain type.** The v3 encrypted domains are `jsonb`-backed, so introspection that resolves a domain to its base type renders them as a bare `jsonb` with no hint they are EQL-encrypted, searchable columns (most visibly the Supabase table editor, whose grid reads `postgres-meta`'s base-type-resolved `format`). Every `public` encrypted domain now carries a one-line `COMMENT ON DOMAIN`, so the type is self-documenting via `psql \dD`, `obj_description(oid,'pg_type')`, and any tool that reads `pg_type` comments (Supabase's `types` introspection surfaces exactly this). No behaviour change — comments only. Scalar-domain comments are **code-generated**: a new `DomainBlock.comment` field derives the capability text from the domain's terms (`Term::operators_for_terms`), so it tracks the generated CHECK/operator surface and can't drift. Comments are deliberately terse so they fit one line in type pickers (e.g. Supabase Studio): `text_match` → "EQL encrypted text (containment)", an ORE `_ord` → "EQL encrypted numeric (equality, ordering)", storage-only → "EQL encrypted numeric (storage only)". The DO-block templates emit the comment after each idempotent `CREATE DOMAIN`, re-applied on reinstall so comment-text changes propagate. The `_query` operand twins get a matching "EQL  query operand (…)" comment, and the three hand-written jsonb SteVec domains (`json` / `jsonb_entry` / `jsonb_query`) get hand-written comments. ([#377](https://github.com/cipherstash/encrypt-query-language/pull/377), closes [#376](https://github.com/cipherstash/encrypt-query-language/issues/376))
 
 - **Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373))
+- **First-class language-binding releases: the `@cipherstash/eql` npm package and crate-bundled SQL.** EQL v3 now ships its canonical wire types as a TypeScript npm package (`@cipherstash/eql`, under `packages/eql/`) alongside the existing Rust `eql-bindings` crate — both generated from `eql-domains::CATALOG` (the TS package is derived from the crate's `bindings/` + `schema/` outputs, drift-gated by `mise run typescript:check`). Each language package bundles the **exact** self-contained SQL installer/uninstaller it was generated against: the crate exposes it as `eql_bindings::sql` (`INSTALL_SQL`, `UNINSTALL_SQL`, `RELEASE_MANIFEST_JSON`), and the npm package via its `./sql` / `./sql/*` subpath exports (plus a `releaseManifest` and `readInstallSql()`/`readUninstallSql()` helpers) — so a consumer pins wire types and the matching DDL together. Prereleases can now cut all three artifacts under one identity — the SQL + docs GitHub release, the crate (crates.io, tag `eql-bindings-v`), and the npm package (tag `eql-typescript-v`): `mise run release:all` releases the lot in lockstep, `mise run release:bindings` publishes all language packages for an existing SQL alpha, and `mise run release:rust` / `mise run release:typescript` publish a single language. Why: type information was lost at every hop from EQL to downstream tools; a versioned, single-source package per language (bundled with the SQL it targets) removes hand-copying and installer/type drift.
 - **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350))
 - **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349))
 - **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed.
@@ -63,6 +64,7 @@ Each entry that ships in a published release links to the PR that introduced it.
 ### Changed
 
 - **Query-operand domains renamed to a `query_` prefix AND moved into the `eql_v3` schema (CIP-3442).** Every scalar query twin introduced by the query-operand surface (above) is now `eql_v3.query_` — `query_integer_eq`, `query_text_ord`, `query_timestamp_ord_ope`, … — and the encrypted-JSONB containment needle follows the same convention: `public.jsonb_query` is now `eql_v3.query_jsonb`. Predicates cast accordingly (`WHERE col = $1::eql_v3.query_integer_eq`; `WHERE doc @> $1::eql_v3.query_jsonb`), the `eql-bindings` `DomainType::sql_domain` strings, `QueryPayload::parse` domain names, and the exported JSON Schema file names (`schema/v3/query_.json`) all carry the new names, and `from_v2_query` / `from_v2_query_typed` target them. This supersedes the `_query` naming in the earlier `[Unreleased]` entries; the old names shipped only in 3.0.0 pre-releases. **Why the prefix:** alphabetical type listings interleaved never-a-column-type query operands with the actual column types (`integer_eq` next to `integer_eq_query`); the shared `query_` prefix sorts every query operand together. **Why the schema move:** query operands are never valid column types, so they don't belong in `public` — the column-type namespace whose survive-schema-drop rationale (dropping EQL-owned schemas must not drop application columns) doesn't apply to them. In `eql_v3` they are versioned with the rest of the public API surface, are uninstalled with it (a column misusing a query domain is dropped by the uninstaller's CASCADE — pinned by the uninstall suite), and casting a query operand requires the same `USAGE ON SCHEMA eql_v3` a caller already needs for the extractors and comparison wrappers. See [U-002](docs/upgrading/v3.0.md#u-002-query-operand-domains-are-eql_v3query_name) in the 3.0 upgrade guide. ([CIP-3442](https://linear.app/cipherstash/issue/CIP-3442))
+- **Release coordinator: `bindings` now means all language packages, plus new `rust` / `typescript` targets.** The `release-alpha.yml` coordinator target `bindings` previously published only the Rust crate; it now publishes every missing language binding package (Rust crate **and** the `@cipherstash/eql` npm package) for an existing same-source SQL prerelease, and two single-language targets were added: `rust` (crate only) and `typescript` (npm only), surfaced as `mise run release:rust` / `mise run release:typescript`. Identity derivation now spans three tag namespaces (`eql-`, `eql-bindings-v`, `eql-typescript-v`) so a fresh alpha never reuses an `N` any language already claimed. The `all` target pins and publishes the SQL surface, docs, and both language packages under one identity on one commit. Why: language names (`rust`/`typescript`) keep the operator interface stable independent of packaging, and `bindings` meaning "all bindings" matches operator expectations now that there is more than one. Only affects release operators; no change to the installed EQL surface or wire format.
 - **The `eql_v3` tier's JSON envelope version is now `v: 3` (was `v: 2`).** Every `eql_v3` domain CHECK — the generated scalar families and the hand-written `eql_v3.json` SteVec document domain — now pins `VALUE->>'v' = '3'`, and the canonical payload bindings (`SchemaVersion` in `eql-bindings`, the emitted TypeScript alias, and the JSON Schema `const`) accept exactly `3`, rejecting the legacy `2` at the type boundary. The v3 tier previously carried the v2 wire version for continuity; with the tier now diverging from the legacy wire (the new `op` term), the envelope version matches the schema generation. The legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json` and its validation tests) is unchanged and stays `v: 2`. **Compatibility:** payloads produced for the v3 tier must now carry `v: 3` — a cipherstash-client that emits `v: 2` cannot insert into `eql_v3` domain columns until it is updated to emit the v3 envelope. See [U-001](docs/upgrading/v3.0.md#u-001-eql_v3-payloads-carry-v-3) in the 3.0 upgrade guide. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340))
 - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252))
 - **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`integer`, `bigint`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252))
diff --git a/CLAUDE.md b/CLAUDE.md
index 1fa402d40..eaedbf120 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -212,10 +212,10 @@ EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style `
 
 **Cutting a release is scripted — don't hand-roll `gh release create`.** There are two paths:
 
-- **Prerelease (alpha / beta / rc):** run `mise run release:all` (SQL + docs and `eql-bindings` in lockstep), `mise run release:eql` (SQL + docs only), or `mise run release:bindings` (crate for an existing SQL alpha, same source). Each task dispatches the CI-native coordinator `.github/workflows/release-alpha.yml` and watches the run via a unique `dispatch_id`; release-relevant work happens in CI. The coordinator derives the `-.` identity across both tag namespaces, verifies drift gates, and builds/attaches the alpha assets in-run. For `release:all`, it also pins the crate, builds SQL + docs, then dispatches `release-plz.yml` so both tags land on one commit. `release:all` and `release:bindings` require `--ref ` because the pin is pushed. Always use `--dry-run` first. It deliberately does **not** touch `CHANGELOG.md` (prerelease entries stay under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
+- **Prerelease (alpha / beta / rc):** run `mise run release:all` (SQL + docs + **all** language binding packages — the Rust `eql-bindings` crate and the TypeScript `@cipherstash/eql` npm package — in lockstep), `mise run release:eql` (SQL + docs only), `mise run release:bindings` (all language packages for an existing SQL alpha, same source), or the single-language variants `mise run release:rust` / `mise run release:typescript`. Each task dispatches the CI-native coordinator `.github/workflows/release-alpha.yml` and watches the run via a unique `dispatch_id`; release-relevant work happens in CI. The coordinator derives the `-.` identity across all three tag namespaces (`eql-`, `eql-bindings-v`, `eql-typescript-v`), verifies drift gates, and builds/attaches the alpha assets in-run. For `release:all`, it also pins the selected package versions, builds SQL + docs, then dispatches `release-plz.yml` and `release-typescript.yml` so all tags land on one commit. `release:all`, `release:bindings`, `release:rust`, and `release:typescript` require `--ref ` because the pin is pushed. Always use `--dry-run` first. It deliberately does **not** touch `CHANGELOG.md` (prerelease entries stay under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
 - **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]`, which the workflow's `verify-changelog` job enforces.
 
-The **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) is generated from the same `eql-domains::CATALOG` as the SQL surface, so `release:all` releases it in **version lockstep** with each `eql_v3` alpha (`eql-bindings-v3.0.0-alpha.N` ↔ `eql-3.0.0-alpha.N` on the same commit). Use `release:bindings` only to publish the crate for an existing SQL alpha; the coordinator enforces that the branch is still at the SQL tag commit before adding the metadata-only pin commit. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the coordinator pins with `release-plz set-version eql-bindings@`.
+The **language binding packages** are generated from the same `eql-domains::CATALOG` as the SQL surface: the **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) and the **`@cipherstash/eql` npm package** (published via npm trusted publishing by `release-typescript.yml`, tagged `eql-typescript-v`). Both bundle the exact self-contained SQL installer/uninstaller they were generated against (the crate exposes it as `eql_bindings::sql`; the npm package via its `./sql` subpath exports). `release:all` releases them in **version lockstep** with each `eql_v3` alpha (`eql-bindings-v3.0.0-alpha.N` ↔ `eql-typescript-v3.0.0-alpha.N` ↔ `eql-3.0.0-alpha.N` on the same commit). Use `release:bindings` to publish all missing language packages for an existing SQL alpha, or `release:rust` / `release:typescript` for a single language; the coordinator enforces that the branch is still at the SQL tag commit before adding the metadata-only pin commit. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the coordinator pins with `release-plz set-version eql-bindings@`.
 
 ### When you make a user-facing change
 
@@ -260,7 +260,7 @@ The `eql_v3` PostgreSQL schema name is part of the public API and is **independe
 
 ### Cutting a release
 
-This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, use `mise run release:all`, `mise run release:eql`, or `mise run release:bindings` instead — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`.
+This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, use `mise run release:all`, `mise run release:eql`, `mise run release:bindings`, `mise run release:rust`, or `mise run release:typescript` instead — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`.
 
 When a release is being prepared:
 
diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md
index 4323c1ec4..5106b7c6c 100644
--- a/docs/development/releasing-an-alpha.md
+++ b/docs/development/releasing-an-alpha.md
@@ -1,7 +1,8 @@
 # Releasing an `eql_v3` alpha
 
 A concise runbook for cutting a **prerelease** (alpha/beta/rc) of the EQL SQL
-surface, the `eql-bindings` crate, or both in lockstep. For a final
+surface, its language binding packages (the `eql-bindings` crate and the
+`@cipherstash/eql` npm package), or all of them in lockstep. For a final
 (non-prerelease) release, follow the **"Cutting a release"** section of
 `CLAUDE.md` instead.
 
@@ -78,7 +79,7 @@ Common flags:
 | `--version` | Base SemVer (`X.Y.Z`) | `3.0.0` |
 | `--channel` | Prerelease channel: `alpha` \| `beta` \| `rc` | `alpha` |
 | `--pre` | Exact identity (`X.Y.Z-(alpha\|beta\|rc).N`), bypassing derivation | derived |
-| `--ref` | GitHub ref for `workflow_dispatch` | required explicitly for `release:all` and `release:bindings`; current branch for `release:eql` |
+| `--ref` | GitHub ref for `workflow_dispatch` | required explicitly for `release:all`, `release:bindings`, `release:rust`, and `release:typescript`; current branch for `release:eql` |
 | `--dry-run` | Resolve, verify, and print the plan without mutating anything | off |
 
 Examples:
@@ -87,40 +88,51 @@ Examples:
 # Always start here: derive identity and run drift gates without publishing.
 mise run release:all --ref eql_v3 --dry-run
 
-# Ship SQL + docs and the crate in lockstep.
+# Ship SQL + docs and all language packages in lockstep.
 mise run release:all --ref eql_v3
 
 # Ship only the SQL surface + docs.
 mise run release:eql --channel beta
 
-# Publish the crate for an already-existing SQL alpha, same source.
+# Publish all language packages for an already-existing SQL alpha, same source.
 mise run release:bindings --pre 3.0.0-alpha.2 --ref eql_v3
+
+# Publish only one language package (crate-only / npm-only) for an existing SQL alpha.
+mise run release:rust --pre 3.0.0-alpha.2 --ref eql_v3
+mise run release:typescript --pre 3.0.0-alpha.2 --ref eql_v3
 ```
 
 ## Identity and lockstep
 
 The release identity is `-.`, for example
 `3.0.0-alpha.2`. The coordinator derives `N` server-side from freshly fetched
-tags across both namespaces:
+tags across all three namespaces:
 
 - SQL tags: `eql-`
-- Crate tags: `eql-bindings-v`
+- Rust tags: `eql-bindings-v`
+- TypeScript tags: `eql-typescript-v`
 
 For `release:all` and `release:eql`, `N` is one greater than the maximum matching
-counter found in either namespace. For `release:bindings`, the coordinator finds
-an existing SQL alpha that does not yet have a matching crate tag.
-
-`release:all` is the normal lockstep path. The coordinator pins the crate,
-commits that metadata change as commit `S`, builds SQL + docs at `S`, creates
-`eql-` at `S`, and dispatches `release-plz.yml` against that immutable
-SQL tag. The resulting `eql-` and `eql-bindings-v` tags land
-on the same commit.
-
-`release:bindings` is for catching up the crate after an existing SQL alpha. The
+counter found in **any** of the three namespaces. For `release:bindings`, the
+coordinator finds the newest SQL alpha still missing a Rust **or** TypeScript
+binding tag. For `release:rust` / `release:typescript`, it finds the newest SQL
+alpha still missing that specific language's tag.
+
+`release:all` is the normal lockstep path. The coordinator pins the requested
+package version(s) — the crate (`release-plz set-version`) and/or the npm package
+(`package.json` + lockfile) — commits that metadata change as commit `S`, builds
+SQL + docs at `S`, creates `eql-` at `S`, and dispatches
+`release-plz.yml` and `release-typescript.yml` against that immutable SQL tag.
+The resulting `eql-`, `eql-bindings-v`, and
+`eql-typescript-v` tags all land on the same commit.
+
+`release:bindings` catches up the language packages after an existing SQL alpha;
+`release:rust` and `release:typescript` are the single-language equivalents. The
 branch must currently point at the SQL tag commit. The coordinator verifies that
-`HEAD == eql-`, adds the metadata-only crate pin commit on top, then
-dispatches `release-plz.yml`. This guarantees the crate ships the same generated
-source as the SQL release, not later product code.
+`HEAD == eql-`, adds the metadata-only package pin commit on top, then
+dispatches the language-specific publish workflow(s). This guarantees the
+packages ship the same generated source as the SQL release, not later product
+code.
 
 ## Coordinator checks
 
@@ -132,13 +144,18 @@ mise run types:check
 mise run codegen:parity
 ```
 
-For `release:all` and `release:bindings`, it also rejects non-branch refs because
-the crate pin must be pushed. For `release:bindings`, it rejects a branch that has
-advanced past the SQL tag.
+For `release:all`, `release:bindings`, `release:rust`, and `release:typescript`,
+it also rejects non-branch refs because the package-version pin must be pushed.
+For `release:bindings`, `release:rust`, and `release:typescript`, it rejects a
+branch that has advanced past the SQL tag. For any binding target, it also fails
+fast if every requested language tag already exists for that identity (nothing
+left to publish).
 
-The crate publish remains a separate `release-plz.yml` run because crates.io
-Trusted Publishing validates the entry-point workflow identity. The coordinator
-dispatches that workflow only after SQL and docs have been built and attached.
+The Rust crate publish remains a separate `release-plz.yml` run because crates.io
+Trusted Publishing validates the entry-point workflow identity; the TypeScript
+publish is likewise a separate `release-typescript.yml` run (npm trusted
+publishing requires OIDC on a GitHub-hosted runner). The coordinator dispatches
+each workflow only after SQL and docs have been built and attached.
 
 ## Verification note
 
@@ -146,12 +163,13 @@ The durable PR gate is `.github/workflows/lint-release.yml`. It runs actionlint
 over the release workflows, ShellCheck over the release wrappers and identity
 helper, and `.github/scripts/derive-identity.test.sh`.
 
-The SQL to docs to crate ordering can be exercised safely only on a scratch
-branch, because a real crate publish is irreversible. For a scratch validation,
-temporarily force the docs reusable to fail, run `mise run release:eql --ref
-` or `mise run release:all --ref `, and confirm
-that no crate publish is dispatched when docs attachment fails. Revert the
-scratch change before any real alpha.
+The SQL to docs to package ordering can be exercised safely only on a scratch
+branch, because a real package publish (Rust or TypeScript) is irreversible. For
+a scratch validation, temporarily force the docs reusable to fail, run `mise run
+release:eql --ref ` or `mise run release:all --ref
+`, and confirm that no package publish (Rust or TypeScript) is
+dispatched when docs attachment fails. Revert the scratch change before any real
+alpha.
 
 ## Smoke-test the alpha
 
@@ -165,12 +183,13 @@ psql "$DATABASE_URL" -c "\dn eql_v3"                 # eql_v3 schema present
 psql "$DATABASE_URL" -c "SELECT eql_v3.version();"   # released semver
 ```
 
-For a lockstep release, also confirm both tags point at the same commit:
+For a lockstep release, also confirm all tags point at the same commit:
 
 ```bash
 git fetch --tags
 git rev-list -n1 eql-3.0.0-alpha.N
 git rev-list -n1 eql-bindings-v3.0.0-alpha.N
+git rev-list -n1 eql-typescript-v3.0.0-alpha.N
 ```
 
 ## Promoting to a final release later
diff --git a/tasks/release/resolve-alpha.sh b/tasks/release/resolve-alpha.sh
index 4ef209a70..59d80fdbd 100755
--- a/tasks/release/resolve-alpha.sh
+++ b/tasks/release/resolve-alpha.sh
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 #MISE description="Resolve and validate release-alpha.yml identity/tag guards locally"
-#USAGE flag "--target " help="Release target: all | eql | bindings" default="all"
+#USAGE flag "--target " help="Release target: all | eql | bindings | rust | typescript" default="all"
 #USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
 #USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
 #USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""

From e0a236b66adb6b93650e4a5780d7083b3e42bc22 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Tue, 7 Jul 2026 12:51:47 +1000
Subject: [PATCH 568/599] ci(release): harden release-typescript workflow
 (injection, retry-safety, creds)

- F1: pass inputs.identity via env instead of interpolating into run bodies
  (command-injection fix across the version-check, prepare, and tag steps)
- F2: make npm publish and tag creation idempotent for retry-safety
- F3: checkout with persist-credentials: false; authenticate the tag push
  explicitly via extraheader to the repo URL
- F4: mkdir -p before writing the generated release manifest
- add .github/scripts/release-typescript-workflow.test.sh regression guard
  and wire it into lint-release.yml
---
 .../release-typescript-workflow.test.sh       | 62 +++++++++++++++++++
 .github/workflows/lint-release.yml            |  6 +-
 .github/workflows/release-typescript.yml      | 51 ++++++++++++---
 tasks/release/prepare-bindings-assets.sh      |  1 +
 4 files changed, 110 insertions(+), 10 deletions(-)
 create mode 100644 .github/scripts/release-typescript-workflow.test.sh

diff --git a/.github/scripts/release-typescript-workflow.test.sh b/.github/scripts/release-typescript-workflow.test.sh
new file mode 100644
index 000000000..914a429ec
--- /dev/null
+++ b/.github/scripts/release-typescript-workflow.test.sh
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+# Regression guard for the security hardening of
+# .github/workflows/release-typescript.yml. These are structural invariants —
+# they pin the fixes for the code-review findings so they cannot silently
+# regress. Dependency-free; no network, no Actions runner needed.
+set -uo pipefail
+
+here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+wf="${here}/../workflows/release-typescript.yml"
+
+fail=0
+pass() { echo "ok: $1"; }
+fault() { echo "FAIL: $1"; fail=1; }
+
+[[ -f "$wf" ]] || { echo "FAIL: workflow not found at $wf"; exit 1; }
+
+# --- F1: no command injection via workflow inputs ---------------------------
+# `${{ inputs.* }}` must ONLY appear as an `env:` entry (`NAME: ${{ inputs.x }}`),
+# never interpolated into a `run:` script body (GitHub expands the expression
+# into the script text before bash runs → arbitrary command execution).
+offenders="$(grep -nE '\$\{\{ *inputs\.' "$wf" \
+  | grep -vE '^[0-9]+:[[:space:]]*[A-Za-z_][A-Za-z0-9_]*: \$\{\{ inputs\.[a-z_]+ \}\}$' \
+  || true)"
+if [[ -z "$offenders" ]]; then
+  pass "F1: workflow inputs are only surfaced via env:, never in run: bodies"
+else
+  fault "F1: inputs.* interpolated into a run: body (injection risk):"
+  echo "$offenders"
+fi
+
+# --- F3: checkout must not persist git credentials --------------------------
+if grep -qE 'persist-credentials: false' "$wf"; then
+  pass "F3: checkout sets persist-credentials: false"
+else
+  fault "F3: checkout is missing persist-credentials: false"
+fi
+
+# --- F3: the tag push must be authenticated (extraheader), not bare origin --
+if grep -qE 'extraheader=AUTHORIZATION' "$wf"; then
+  pass "F3: tag push authenticates via git extraheader"
+else
+  fault "F3: authenticated push pattern (extraheader) missing"
+fi
+if grep -qE 'git push origin "refs/tags' "$wf"; then
+  fault "F3: bare 'git push origin' remains (unauthenticated once creds are not persisted)"
+else
+  pass "F3: no bare 'git push origin' tag push"
+fi
+
+# --- F2: publish and tag must be retry-safe (idempotent) --------------------
+if grep -qE 'npm view' "$wf"; then
+  pass "F2: publish is idempotent (npm view existence guard)"
+else
+  fault "F2: idempotent publish guard (npm view) missing"
+fi
+if grep -qE 'ls-remote' "$wf"; then
+  pass "F2: tag creation is idempotent (ls-remote existence guard)"
+else
+  fault "F2: idempotent tag guard (ls-remote) missing"
+fi
+
+exit "$fail"
diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml
index 3d52206ab..0509b920b 100644
--- a/.github/workflows/lint-release.yml
+++ b/.github/workflows/lint-release.yml
@@ -72,7 +72,8 @@ jobs:
             .github/scripts/release-alpha-pin-bindings.sh \
             .github/scripts/release-alpha-pin-bindings.test.sh \
             .github/scripts/release-alpha-verify-commit-signature.sh \
-            .github/scripts/release-alpha-verify-commit-signature.test.sh
+            .github/scripts/release-alpha-verify-commit-signature.test.sh \
+            .github/scripts/release-typescript-workflow.test.sh
 
       - name: identity-derivation unit test
         run: bash .github/scripts/derive-identity.test.sh
@@ -85,3 +86,6 @@ jobs:
 
       - name: release-alpha signature verification helper test
         run: bash .github/scripts/release-alpha-verify-commit-signature.test.sh
+
+      - name: release-typescript workflow security guard test
+        run: bash .github/scripts/release-typescript-workflow.test.sh
diff --git a/.github/workflows/release-typescript.yml b/.github/workflows/release-typescript.yml
index 4646dc00d..c0055fce3 100644
--- a/.github/workflows/release-typescript.yml
+++ b/.github/workflows/release-typescript.yml
@@ -29,6 +29,10 @@ jobs:
       - uses: actions/checkout@v4
         with:
           fetch-depth: 0
+          # Do not leave the git token in .git/config across pnpm install /
+          # npm publish / build (a compromised lifecycle script could read it).
+          # The final tag push re-authenticates explicitly via extraheader.
+          persist-credentials: false
 
       - uses: pnpm/action-setup@v6.0.8
         name: Install pnpm
@@ -53,16 +57,20 @@ jobs:
         run: pnpm install --frozen-lockfile
 
       - name: Verify package version matches dispatch identity
+        env:
+          IDENTITY: ${{ inputs.identity }}
         run: |
           set -euo pipefail
           actual="$(node -p "require('./packages/eql/package.json').version")"
-          test "$actual" = "${{ inputs.identity }}" || {
-            echo "package version ${actual} does not match identity ${{ inputs.identity }}" >&2
+          test "$actual" = "$IDENTITY" || {
+            echo "package version ${actual} does not match identity ${IDENTITY}" >&2
             exit 1
           }
 
       - name: Prepare exact SQL assets
-        run: mise run release:prepare_bindings_assets --version "${{ inputs.identity }}"
+        env:
+          IDENTITY: ${{ inputs.identity }}
+        run: mise run release:prepare_bindings_assets --version "$IDENTITY"
 
       - name: Verify generated TypeScript package surface
         run: mise run typescript:check
@@ -94,13 +102,38 @@ jobs:
 
       - name: Publish package
         working-directory: packages/eql
-        run: npm publish --access public --provenance
+        env:
+          IDENTITY: ${{ inputs.identity }}
+        run: |
+          set -euo pipefail
+          # Idempotent: a rerun after a partial failure (e.g. the tag push
+          # below failed) must not die on republishing an existing version.
+          if [ -n "$(npm view "@cipherstash/eql@${IDENTITY}" version 2>/dev/null)" ]; then
+            echo "@cipherstash/eql@${IDENTITY} is already published; skipping publish"
+          else
+            npm publish --access public --provenance
+          fi
 
       - name: Tag TypeScript release
+        env:
+          IDENTITY: ${{ inputs.identity }}
+          GH_TOKEN: ${{ github.token }}
+          REPO: ${{ github.repository }}
         run: |
           set -euo pipefail
-          tag="eql-typescript-v${{ inputs.identity }}"
-          git config user.name "github-actions[bot]"
-          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
-          git tag "$tag"
-          git push origin "refs/tags/${tag}"
+          tag="eql-typescript-v${IDENTITY}"
+          repo_url="https://github.com/${REPO}.git"
+          # persist-credentials: false leaves no cached token, so authenticate
+          # this push explicitly (same extraheader pattern as
+          # release-alpha-pin-bindings.sh) rather than relying on `origin`.
+          auth=(-c "http.https://github.com/.extraheader=AUTHORIZATION: bearer ${GH_TOKEN}")
+          # Idempotent: if the tag already exists on the remote (e.g. from a
+          # prior partial run), skip — do not force-overwrite a different commit.
+          if git "${auth[@]}" ls-remote --exit-code --tags "$repo_url" "refs/tags/${tag}" >/dev/null 2>&1; then
+            echo "tag ${tag} already exists on the remote; skipping"
+          else
+            git config user.name "github-actions[bot]"
+            git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+            git tag "$tag"
+            git "${auth[@]}" push "$repo_url" "refs/tags/${tag}"
+          fi
diff --git a/tasks/release/prepare-bindings-assets.sh b/tasks/release/prepare-bindings-assets.sh
index 5b2e1ffd9..ae61764e5 100755
--- a/tasks/release/prepare-bindings-assets.sh
+++ b/tasks/release/prepare-bindings-assets.sh
@@ -44,6 +44,7 @@ for dir in crates/eql-bindings/sql packages/eql/sql; do
 JSON
 done
 
+mkdir -p packages/eql/src/generated
 cat > packages/eql/src/generated/release-manifest.ts <
Date: Tue, 7 Jul 2026 13:53:37 +1000
Subject: [PATCH 569/599] feat(release): adopt changesets as the lockstep
 version source

Changesets owns @cipherstash/eql's version V (alpha pre-mode); scripts/sync-lockstep-versions.mjs derives the crate + bundled-SQL versions from V via the root 'version' script. prepare-bindings-assets accepts stable X.Y.Z too.
---
 .changeset/README.md                     |  25 +
 .changeset/config.json                   |  11 +
 .changeset/pre.json                      |   8 +
 package.json                             |  10 +-
 packages/eql/package.json                |  15 +-
 pnpm-lock.yaml                           | 785 +++++++++++++++++++++++
 scripts/sync-lockstep-versions.mjs       |  47 ++
 tasks/release/prepare-bindings-assets.sh |   4 +-
 8 files changed, 899 insertions(+), 6 deletions(-)
 create mode 100644 .changeset/README.md
 create mode 100644 .changeset/config.json
 create mode 100644 .changeset/pre.json
 create mode 100644 scripts/sync-lockstep-versions.mjs

diff --git a/.changeset/README.md b/.changeset/README.md
new file mode 100644
index 000000000..a24ba3dbe
--- /dev/null
+++ b/.changeset/README.md
@@ -0,0 +1,25 @@
+# Changesets
+
+This directory drives EQL's release versioning. `@cipherstash/eql`'s version is
+the **single source of truth** for the whole EQL release identity `V`: the SQL
+surface (`eql-V`), the Rust crate (`eql-bindings-vV`), and the npm package
+(`@cipherstash/eql@V`) are all released at `V`, derived from the version
+changesets computes here (see `scripts/sync-lockstep-versions.mjs`).
+
+Because SQL, the crate, and npm are generated from one catalog at one commit,
+**every releasable change needs a changeset** — including SQL-only or crate-only
+changes — so that `V` moves for all three.
+
+Add one with `pnpm changeset`, or hand-write a `.changeset/.md`:
+
+```md
+---
+'@cipherstash/eql': minor   # patch | minor | major
+---
+
+User-facing description of what changed and why.
+```
+
+Prereleases (alpha/beta/rc) use changesets pre-mode; see
+`docs/development/releasing-an-alpha.md`. See
+https://github.com/changesets/changesets for the tool docs.
diff --git a/.changeset/config.json b/.changeset/config.json
new file mode 100644
index 000000000..edef2ebc1
--- /dev/null
+++ b/.changeset/config.json
@@ -0,0 +1,11 @@
+{
+  "$schema": "https://unpkg.com/@changesets/config@3.0.3/schema.json",
+  "changelog": "@changesets/cli/changelog",
+  "commit": false,
+  "fixed": [],
+  "linked": [],
+  "access": "restricted",
+  "baseBranch": "main",
+  "updateInternalDependencies": "patch",
+  "ignore": []
+}
diff --git a/.changeset/pre.json b/.changeset/pre.json
new file mode 100644
index 000000000..f75859b1d
--- /dev/null
+++ b/.changeset/pre.json
@@ -0,0 +1,8 @@
+{
+  "mode": "pre",
+  "tag": "alpha",
+  "initialVersions": {
+    "@cipherstash/eql": "3.0.0-alpha.2"
+  },
+  "changesets": []
+}
diff --git a/package.json b/package.json
index 36b7ff3d6..a8d183446 100644
--- a/package.json
+++ b/package.json
@@ -7,10 +7,18 @@
     "build": "pnpm --filter @cipherstash/eql build",
     "test": "pnpm --filter @cipherstash/eql test",
     "types:generate": "pnpm --filter @cipherstash/eql sync:generated",
-    "types:check": "pnpm --filter @cipherstash/eql check:generated"
+    "types:check": "pnpm --filter @cipherstash/eql check:generated",
+    "changeset": "changeset",
+    "changeset:version": "changeset version",
+    "version": "changeset version && node scripts/sync-lockstep-versions.mjs",
+    "release": "pnpm run build && changeset publish",
+    "lint:workflow-cache": "node scripts/lint-no-workflow-caching.mjs",
+    "test:scripts": "vitest run --config scripts/vitest.config.mjs"
   },
   "devDependencies": {
+    "@changesets/cli": "^2.31.0",
     "@types/node": "^22.13.14",
+    "js-yaml": "^4.1.0",
     "tsup": "^8.5.0",
     "typescript": "^5.8.3",
     "vitest": "^3.2.4"
diff --git a/packages/eql/package.json b/packages/eql/package.json
index 20d260673..04628f0bc 100644
--- a/packages/eql/package.json
+++ b/packages/eql/package.json
@@ -1,8 +1,14 @@
 {
   "name": "@cipherstash/eql",
-  "version": "0.0.0",
+  "version": "3.0.0-alpha.2",
   "description": "Canonical EQL v3 wire types, JSON schemas, and SQL bundle.",
-  "keywords": ["eql", "cipherstash", "encryption", "postgres", "typescript"],
+  "keywords": [
+    "eql",
+    "cipherstash",
+    "encryption",
+    "postgres",
+    "typescript"
+  ],
   "bugs": {
     "url": "https://github.com/cipherstash/encrypt-query-language/issues"
   },
@@ -34,7 +40,10 @@
     "./sql/*": "./dist/sql/*",
     "./package.json": "./package.json"
   },
-  "files": ["dist", "README.md"],
+  "files": [
+    "dist",
+    "README.md"
+  ],
   "scripts": {
     "sync:generated": "node scripts/sync-generated.mjs",
     "check:generated": "node scripts/sync-generated.mjs --check",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 47a82b5bc..b6bb3277c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -23,9 +23,15 @@ importers:
 
   .:
     devDependencies:
+      '@changesets/cli':
+        specifier: ^2.31.0
+        version: 2.31.0(@types/node@22.20.0)
       '@types/node':
         specifier: ^22.13.14
         version: 22.20.0
+      js-yaml:
+        specifier: ^4.1.0
+        version: 4.3.0
       tsup:
         specifier: ^8.5.0
         version: 8.5.1(postcss@8.5.16)(typescript@5.9.3)
@@ -53,6 +59,65 @@ importers:
 
 packages:
 
+  '@babel/runtime@7.29.7':
+    resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
+    engines: {node: '>=6.9.0'}
+
+  '@changesets/apply-release-plan@7.1.1':
+    resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==}
+
+  '@changesets/assemble-release-plan@6.0.10':
+    resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==}
+
+  '@changesets/changelog-git@0.2.1':
+    resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==}
+
+  '@changesets/cli@2.31.0':
+    resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==}
+    hasBin: true
+
+  '@changesets/config@3.1.4':
+    resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==}
+
+  '@changesets/errors@0.2.0':
+    resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
+
+  '@changesets/get-dependents-graph@2.1.4':
+    resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==}
+
+  '@changesets/get-release-plan@4.0.16':
+    resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==}
+
+  '@changesets/get-version-range-type@0.4.0':
+    resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
+
+  '@changesets/git@3.0.4':
+    resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==}
+
+  '@changesets/logger@0.1.1':
+    resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==}
+
+  '@changesets/parse@0.4.3':
+    resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==}
+
+  '@changesets/pre@2.0.2':
+    resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==}
+
+  '@changesets/read@0.6.7':
+    resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==}
+
+  '@changesets/should-skip-package@0.1.2':
+    resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==}
+
+  '@changesets/types@4.1.0':
+    resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==}
+
+  '@changesets/types@6.1.0':
+    resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==}
+
+  '@changesets/write@0.4.0':
+    resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
+
   '@esbuild/aix-ppc64@0.27.7':
     resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
     engines: {node: '>=18'}
@@ -365,6 +430,15 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@inquirer/external-editor@1.0.3':
+    resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
   '@jridgewell/gen-mapping@0.3.13':
     resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
 
@@ -378,6 +452,24 @@ packages:
   '@jridgewell/trace-mapping@0.3.31':
     resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
 
+  '@manypkg/find-root@1.1.0':
+    resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
+
+  '@manypkg/get-packages@1.1.3':
+    resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
+
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
   '@rollup/rollup-android-arm-eabi@4.62.2':
     resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==}
     cpu: [arm]
@@ -525,6 +617,9 @@ packages:
   '@types/estree@1.0.9':
     resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
 
+  '@types/node@12.20.55':
+    resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+
   '@types/node@22.20.0':
     resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==}
 
@@ -562,13 +657,39 @@ packages:
     engines: {node: '>=0.4.0'}
     hasBin: true
 
+  ansi-colors@4.1.3:
+    resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+    engines: {node: '>=6'}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
   any-promise@1.3.0:
     resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
 
+  argparse@1.0.10:
+    resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+  argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  array-union@2.1.0:
+    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+    engines: {node: '>=8'}
+
   assertion-error@2.0.1:
     resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
     engines: {node: '>=12'}
 
+  better-path-resolve@1.0.0:
+    resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
+    engines: {node: '>=4'}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
   bundle-require@5.1.0:
     resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -583,6 +704,9 @@ packages:
     resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
     engines: {node: '>=18'}
 
+  chardet@2.2.0:
+    resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==}
+
   check-error@2.1.3:
     resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==}
     engines: {node: '>= 16'}
@@ -602,6 +726,10 @@ packages:
     resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
     engines: {node: ^14.18.0 || >=16.10.0}
 
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
   debug@4.4.3:
     resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
     engines: {node: '>=6.0'}
@@ -615,6 +743,18 @@ packages:
     resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
     engines: {node: '>=6'}
 
+  detect-indent@6.1.0:
+    resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+    engines: {node: '>=8'}
+
+  dir-glob@3.0.1:
+    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+    engines: {node: '>=8'}
+
+  enquirer@2.4.1:
+    resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
+    engines: {node: '>=8.6'}
+
   es-module-lexer@1.7.0:
     resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
 
@@ -628,6 +768,11 @@ packages:
     engines: {node: '>=18'}
     hasBin: true
 
+  esprima@4.0.1:
+    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+    engines: {node: '>=4'}
+    hasBin: true
+
   estree-walker@3.0.3:
     resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
 
@@ -635,6 +780,16 @@ packages:
     resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
     engines: {node: '>=12.0.0'}
 
+  extendable-error@0.1.7:
+    resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fastq@1.20.1:
+    resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
   fdir@6.5.0:
     resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
     engines: {node: '>=12.0.0'}
@@ -644,14 +799,76 @@ packages:
       picomatch:
         optional: true
 
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  find-up@4.1.0:
+    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+    engines: {node: '>=8'}
+
   fix-dts-default-cjs-exports@1.0.1:
     resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==}
 
+  fs-extra@7.0.1:
+    resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+    engines: {node: '>=6 <7 || >=8'}
+
+  fs-extra@8.1.0:
+    resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+    engines: {node: '>=6 <7 || >=8'}
+
   fsevents@2.3.3:
     resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
     os: [darwin]
 
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  globby@11.1.0:
+    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+    engines: {node: '>=10'}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  human-id@4.2.0:
+    resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==}
+    hasBin: true
+
+  iconv-lite@0.7.2:
+    resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+    engines: {node: '>=0.10.0'}
+
+  ignore@5.3.2:
+    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+    engines: {node: '>= 4'}
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-subdir@1.2.0:
+    resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==}
+    engines: {node: '>=4'}
+
+  is-windows@1.0.2:
+    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+    engines: {node: '>=0.10.0'}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
   joycon@3.1.1:
     resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
     engines: {node: '>=10'}
@@ -659,6 +876,17 @@ packages:
   js-tokens@9.0.1:
     resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
 
+  js-yaml@3.15.0:
+    resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==}
+    hasBin: true
+
+  js-yaml@4.3.0:
+    resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==}
+    hasBin: true
+
+  jsonfile@4.0.0:
+    resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+
   lilconfig@3.1.3:
     resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
     engines: {node: '>=14'}
@@ -670,15 +898,34 @@ packages:
     resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
+  locate-path@5.0.0:
+    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+    engines: {node: '>=8'}
+
+  lodash.startcase@4.4.0:
+    resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+
   loupe@3.2.1:
     resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
 
   magic-string@0.30.21:
     resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
 
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
   mlly@1.8.2:
     resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
 
+  mri@1.2.0:
+    resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+    engines: {node: '>=4'}
+
   ms@2.1.3:
     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
 
@@ -694,6 +941,44 @@ packages:
     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
     engines: {node: '>=0.10.0'}
 
+  outdent@0.5.0:
+    resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
+
+  p-filter@2.1.0:
+    resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==}
+    engines: {node: '>=8'}
+
+  p-limit@2.3.0:
+    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+    engines: {node: '>=6'}
+
+  p-locate@4.1.0:
+    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+    engines: {node: '>=8'}
+
+  p-map@2.1.0:
+    resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
+    engines: {node: '>=6'}
+
+  p-try@2.2.0:
+    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+    engines: {node: '>=6'}
+
+  package-manager-detector@0.2.11:
+    resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
+
+  path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-type@4.0.0:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
+
   pathe@2.0.3:
     resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
 
@@ -704,10 +989,18 @@ packages:
   picocolors@1.1.1:
     resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
 
+  picomatch@2.3.2:
+    resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+    engines: {node: '>=8.6'}
+
   picomatch@4.0.4:
     resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
     engines: {node: '>=12'}
 
+  pify@4.0.1:
+    resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+    engines: {node: '>=6'}
+
   pirates@4.0.7:
     resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
     engines: {node: '>= 6'}
@@ -737,6 +1030,21 @@ packages:
     resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==}
     engines: {node: ^10 || ^12 || >=14}
 
+  prettier@2.8.8:
+    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+
+  quansync@0.2.11:
+    resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  read-yaml-file@1.1.0:
+    resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==}
+    engines: {node: '>=6'}
+
   readdirp@4.1.2:
     resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
     engines: {node: '>= 14.18.0'}
@@ -745,14 +1053,45 @@ packages:
     resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
     engines: {node: '>=8'}
 
+  reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
   rollup@4.62.2:
     resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
     hasBin: true
 
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  semver@7.8.5:
+    resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
   siginfo@2.0.0:
     resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
 
+  signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  slash@3.0.0:
+    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+    engines: {node: '>=8'}
+
   source-map-js@1.2.1:
     resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
     engines: {node: '>=0.10.0'}
@@ -761,12 +1100,26 @@ packages:
     resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
     engines: {node: '>= 12'}
 
+  spawndamnit@3.0.1:
+    resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==}
+
+  sprintf-js@1.0.3:
+    resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
   stackback@0.0.2:
     resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
 
   std-env@3.10.0:
     resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
 
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-bom@3.0.0:
+    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+    engines: {node: '>=4'}
+
   strip-literal@3.1.0:
     resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
 
@@ -775,6 +1128,10 @@ packages:
     engines: {node: '>=16 || 14 >=14.17'}
     hasBin: true
 
+  term-size@2.2.1:
+    resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
+    engines: {node: '>=8'}
+
   thenify-all@1.6.0:
     resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
     engines: {node: '>=0.8'}
@@ -804,6 +1161,10 @@ packages:
     resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==}
     engines: {node: '>=14.0.0'}
 
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
   tree-kill@1.2.2:
     resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
     hasBin: true
@@ -841,6 +1202,10 @@ packages:
   undici-types@6.21.0:
     resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
 
+  universalify@0.1.2:
+    resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+    engines: {node: '>= 4.0.0'}
+
   vite-node@3.2.4:
     resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -914,6 +1279,11 @@ packages:
       jsdom:
         optional: true
 
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
   why-is-node-running@2.3.0:
     resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
     engines: {node: '>=8'}
@@ -921,6 +1291,151 @@ packages:
 
 snapshots:
 
+  '@babel/runtime@7.29.7': {}
+
+  '@changesets/apply-release-plan@7.1.1':
+    dependencies:
+      '@changesets/config': 3.1.4
+      '@changesets/get-version-range-type': 0.4.0
+      '@changesets/git': 3.0.4
+      '@changesets/should-skip-package': 0.1.2
+      '@changesets/types': 6.1.0
+      '@manypkg/get-packages': 1.1.3
+      detect-indent: 6.1.0
+      fs-extra: 7.0.1
+      lodash.startcase: 4.4.0
+      outdent: 0.5.0
+      prettier: 2.8.8
+      resolve-from: 5.0.0
+      semver: 7.8.5
+
+  '@changesets/assemble-release-plan@6.0.10':
+    dependencies:
+      '@changesets/errors': 0.2.0
+      '@changesets/get-dependents-graph': 2.1.4
+      '@changesets/should-skip-package': 0.1.2
+      '@changesets/types': 6.1.0
+      '@manypkg/get-packages': 1.1.3
+      semver: 7.8.5
+
+  '@changesets/changelog-git@0.2.1':
+    dependencies:
+      '@changesets/types': 6.1.0
+
+  '@changesets/cli@2.31.0(@types/node@22.20.0)':
+    dependencies:
+      '@changesets/apply-release-plan': 7.1.1
+      '@changesets/assemble-release-plan': 6.0.10
+      '@changesets/changelog-git': 0.2.1
+      '@changesets/config': 3.1.4
+      '@changesets/errors': 0.2.0
+      '@changesets/get-dependents-graph': 2.1.4
+      '@changesets/get-release-plan': 4.0.16
+      '@changesets/git': 3.0.4
+      '@changesets/logger': 0.1.1
+      '@changesets/pre': 2.0.2
+      '@changesets/read': 0.6.7
+      '@changesets/should-skip-package': 0.1.2
+      '@changesets/types': 6.1.0
+      '@changesets/write': 0.4.0
+      '@inquirer/external-editor': 1.0.3(@types/node@22.20.0)
+      '@manypkg/get-packages': 1.1.3
+      ansi-colors: 4.1.3
+      enquirer: 2.4.1
+      fs-extra: 7.0.1
+      mri: 1.2.0
+      package-manager-detector: 0.2.11
+      picocolors: 1.1.1
+      resolve-from: 5.0.0
+      semver: 7.8.5
+      spawndamnit: 3.0.1
+      term-size: 2.2.1
+    transitivePeerDependencies:
+      - '@types/node'
+
+  '@changesets/config@3.1.4':
+    dependencies:
+      '@changesets/errors': 0.2.0
+      '@changesets/get-dependents-graph': 2.1.4
+      '@changesets/logger': 0.1.1
+      '@changesets/should-skip-package': 0.1.2
+      '@changesets/types': 6.1.0
+      '@manypkg/get-packages': 1.1.3
+      fs-extra: 7.0.1
+      micromatch: 4.0.8
+
+  '@changesets/errors@0.2.0':
+    dependencies:
+      extendable-error: 0.1.7
+
+  '@changesets/get-dependents-graph@2.1.4':
+    dependencies:
+      '@changesets/types': 6.1.0
+      '@manypkg/get-packages': 1.1.3
+      picocolors: 1.1.1
+      semver: 7.8.5
+
+  '@changesets/get-release-plan@4.0.16':
+    dependencies:
+      '@changesets/assemble-release-plan': 6.0.10
+      '@changesets/config': 3.1.4
+      '@changesets/pre': 2.0.2
+      '@changesets/read': 0.6.7
+      '@changesets/types': 6.1.0
+      '@manypkg/get-packages': 1.1.3
+
+  '@changesets/get-version-range-type@0.4.0': {}
+
+  '@changesets/git@3.0.4':
+    dependencies:
+      '@changesets/errors': 0.2.0
+      '@manypkg/get-packages': 1.1.3
+      is-subdir: 1.2.0
+      micromatch: 4.0.8
+      spawndamnit: 3.0.1
+
+  '@changesets/logger@0.1.1':
+    dependencies:
+      picocolors: 1.1.1
+
+  '@changesets/parse@0.4.3':
+    dependencies:
+      '@changesets/types': 6.1.0
+      js-yaml: 4.3.0
+
+  '@changesets/pre@2.0.2':
+    dependencies:
+      '@changesets/errors': 0.2.0
+      '@changesets/types': 6.1.0
+      '@manypkg/get-packages': 1.1.3
+      fs-extra: 7.0.1
+
+  '@changesets/read@0.6.7':
+    dependencies:
+      '@changesets/git': 3.0.4
+      '@changesets/logger': 0.1.1
+      '@changesets/parse': 0.4.3
+      '@changesets/types': 6.1.0
+      fs-extra: 7.0.1
+      p-filter: 2.1.0
+      picocolors: 1.1.1
+
+  '@changesets/should-skip-package@0.1.2':
+    dependencies:
+      '@changesets/types': 6.1.0
+      '@manypkg/get-packages': 1.1.3
+
+  '@changesets/types@4.1.0': {}
+
+  '@changesets/types@6.1.0': {}
+
+  '@changesets/write@0.4.0':
+    dependencies:
+      '@changesets/types': 6.1.0
+      fs-extra: 7.0.1
+      human-id: 4.2.0
+      prettier: 2.8.8
+
   '@esbuild/aix-ppc64@0.27.7':
     optional: true
 
@@ -1077,6 +1592,13 @@ snapshots:
   '@esbuild/win32-x64@0.28.1':
     optional: true
 
+  '@inquirer/external-editor@1.0.3(@types/node@22.20.0)':
+    dependencies:
+      chardet: 2.2.0
+      iconv-lite: 0.7.2
+    optionalDependencies:
+      '@types/node': 22.20.0
+
   '@jridgewell/gen-mapping@0.3.13':
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.5
@@ -1091,6 +1613,34 @@ snapshots:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.5.5
 
+  '@manypkg/find-root@1.1.0':
+    dependencies:
+      '@babel/runtime': 7.29.7
+      '@types/node': 12.20.55
+      find-up: 4.1.0
+      fs-extra: 8.1.0
+
+  '@manypkg/get-packages@1.1.3':
+    dependencies:
+      '@babel/runtime': 7.29.7
+      '@changesets/types': 4.1.0
+      '@manypkg/find-root': 1.1.0
+      fs-extra: 8.1.0
+      globby: 11.1.0
+      read-yaml-file: 1.1.0
+
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.20.1
+
   '@rollup/rollup-android-arm-eabi@4.62.2':
     optional: true
 
@@ -1175,6 +1725,8 @@ snapshots:
 
   '@types/estree@1.0.9': {}
 
+  '@types/node@12.20.55': {}
+
   '@types/node@22.20.0':
     dependencies:
       undici-types: 6.21.0
@@ -1223,10 +1775,30 @@ snapshots:
 
   acorn@8.17.0: {}
 
+  ansi-colors@4.1.3: {}
+
+  ansi-regex@5.0.1: {}
+
   any-promise@1.3.0: {}
 
+  argparse@1.0.10:
+    dependencies:
+      sprintf-js: 1.0.3
+
+  argparse@2.0.1: {}
+
+  array-union@2.1.0: {}
+
   assertion-error@2.0.1: {}
 
+  better-path-resolve@1.0.0:
+    dependencies:
+      is-windows: 1.0.2
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
   bundle-require@5.1.0(esbuild@0.27.7):
     dependencies:
       esbuild: 0.27.7
@@ -1242,6 +1814,8 @@ snapshots:
       loupe: 3.2.1
       pathval: 2.0.1
 
+  chardet@2.2.0: {}
+
   check-error@2.1.3: {}
 
   chokidar@4.0.3:
@@ -1254,12 +1828,29 @@ snapshots:
 
   consola@3.4.2: {}
 
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
   debug@4.4.3:
     dependencies:
       ms: 2.1.3
 
   deep-eql@5.0.2: {}
 
+  detect-indent@6.1.0: {}
+
+  dir-glob@3.0.1:
+    dependencies:
+      path-type: 4.0.0
+
+  enquirer@2.4.1:
+    dependencies:
+      ansi-colors: 4.1.3
+      strip-ansi: 6.0.1
+
   es-module-lexer@1.7.0: {}
 
   esbuild@0.27.7:
@@ -1320,41 +1911,143 @@ snapshots:
       '@esbuild/win32-ia32': 0.28.1
       '@esbuild/win32-x64': 0.28.1
 
+  esprima@4.0.1: {}
+
   estree-walker@3.0.3:
     dependencies:
       '@types/estree': 1.0.9
 
   expect-type@1.4.0: {}
 
+  extendable-error@0.1.7: {}
+
+  fast-glob@3.3.3:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fastq@1.20.1:
+    dependencies:
+      reusify: 1.1.0
+
   fdir@6.5.0(picomatch@4.0.4):
     optionalDependencies:
       picomatch: 4.0.4
 
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  find-up@4.1.0:
+    dependencies:
+      locate-path: 5.0.0
+      path-exists: 4.0.0
+
   fix-dts-default-cjs-exports@1.0.1:
     dependencies:
       magic-string: 0.30.21
       mlly: 1.8.2
       rollup: 4.62.2
 
+  fs-extra@7.0.1:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 4.0.0
+      universalify: 0.1.2
+
+  fs-extra@8.1.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 4.0.0
+      universalify: 0.1.2
+
   fsevents@2.3.3:
     optional: true
 
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  globby@11.1.0:
+    dependencies:
+      array-union: 2.1.0
+      dir-glob: 3.0.1
+      fast-glob: 3.3.3
+      ignore: 5.3.2
+      merge2: 1.4.1
+      slash: 3.0.0
+
+  graceful-fs@4.2.11: {}
+
+  human-id@4.2.0: {}
+
+  iconv-lite@0.7.2:
+    dependencies:
+      safer-buffer: 2.1.2
+
+  ignore@5.3.2: {}
+
+  is-extglob@2.1.1: {}
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-number@7.0.0: {}
+
+  is-subdir@1.2.0:
+    dependencies:
+      better-path-resolve: 1.0.0
+
+  is-windows@1.0.2: {}
+
+  isexe@2.0.0: {}
+
   joycon@3.1.1: {}
 
   js-tokens@9.0.1: {}
 
+  js-yaml@3.15.0:
+    dependencies:
+      argparse: 1.0.10
+      esprima: 4.0.1
+
+  js-yaml@4.3.0:
+    dependencies:
+      argparse: 2.0.1
+
+  jsonfile@4.0.0:
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
   lilconfig@3.1.3: {}
 
   lines-and-columns@1.2.4: {}
 
   load-tsconfig@0.2.5: {}
 
+  locate-path@5.0.0:
+    dependencies:
+      p-locate: 4.1.0
+
+  lodash.startcase@4.4.0: {}
+
   loupe@3.2.1: {}
 
   magic-string@0.30.21:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.5
 
+  merge2@1.4.1: {}
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.2
+
   mlly@1.8.2:
     dependencies:
       acorn: 8.17.0
@@ -1362,6 +2055,8 @@ snapshots:
       pkg-types: 1.3.1
       ufo: 1.6.4
 
+  mri@1.2.0: {}
+
   ms@2.1.3: {}
 
   mz@2.7.0:
@@ -1374,14 +2069,46 @@ snapshots:
 
   object-assign@4.1.1: {}
 
+  outdent@0.5.0: {}
+
+  p-filter@2.1.0:
+    dependencies:
+      p-map: 2.1.0
+
+  p-limit@2.3.0:
+    dependencies:
+      p-try: 2.2.0
+
+  p-locate@4.1.0:
+    dependencies:
+      p-limit: 2.3.0
+
+  p-map@2.1.0: {}
+
+  p-try@2.2.0: {}
+
+  package-manager-detector@0.2.11:
+    dependencies:
+      quansync: 0.2.11
+
+  path-exists@4.0.0: {}
+
+  path-key@3.1.1: {}
+
+  path-type@4.0.0: {}
+
   pathe@2.0.3: {}
 
   pathval@2.0.1: {}
 
   picocolors@1.1.1: {}
 
+  picomatch@2.3.2: {}
+
   picomatch@4.0.4: {}
 
+  pify@4.0.1: {}
+
   pirates@4.0.7: {}
 
   pkg-types@1.3.1:
@@ -1402,10 +2129,25 @@ snapshots:
       picocolors: 1.1.1
       source-map-js: 1.2.1
 
+  prettier@2.8.8: {}
+
+  quansync@0.2.11: {}
+
+  queue-microtask@1.2.3: {}
+
+  read-yaml-file@1.1.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      js-yaml: 3.15.0
+      pify: 4.0.1
+      strip-bom: 3.0.0
+
   readdirp@4.1.2: {}
 
   resolve-from@5.0.0: {}
 
+  reusify@1.1.0: {}
+
   rollup@4.62.2:
     dependencies:
       '@types/estree': 1.0.9
@@ -1437,16 +2179,47 @@ snapshots:
       '@rollup/rollup-win32-x64-msvc': 4.62.2
       fsevents: 2.3.3
 
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  safer-buffer@2.1.2: {}
+
+  semver@7.8.5: {}
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
   siginfo@2.0.0: {}
 
+  signal-exit@4.1.0: {}
+
+  slash@3.0.0: {}
+
   source-map-js@1.2.1: {}
 
   source-map@0.7.6: {}
 
+  spawndamnit@3.0.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      signal-exit: 4.1.0
+
+  sprintf-js@1.0.3: {}
+
   stackback@0.0.2: {}
 
   std-env@3.10.0: {}
 
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-bom@3.0.0: {}
+
   strip-literal@3.1.0:
     dependencies:
       js-tokens: 9.0.1
@@ -1461,6 +2234,8 @@ snapshots:
       tinyglobby: 0.2.17
       ts-interface-checker: 0.1.13
 
+  term-size@2.2.1: {}
+
   thenify-all@1.6.0:
     dependencies:
       thenify: 3.3.1
@@ -1484,6 +2259,10 @@ snapshots:
 
   tinyspy@4.0.4: {}
 
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
   tree-kill@1.2.2: {}
 
   ts-interface-checker@0.1.13: {}
@@ -1522,6 +2301,8 @@ snapshots:
 
   undici-types@6.21.0: {}
 
+  universalify@0.1.2: {}
+
   vite-node@3.2.4(@types/node@22.20.0):
     dependencies:
       cac: 6.7.14
@@ -1596,6 +2377,10 @@ snapshots:
       - tsx
       - yaml
 
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
   why-is-node-running@2.3.0:
     dependencies:
       siginfo: 2.0.0
diff --git a/scripts/sync-lockstep-versions.mjs b/scripts/sync-lockstep-versions.mjs
new file mode 100644
index 000000000..31e9b5c5e
--- /dev/null
+++ b/scripts/sync-lockstep-versions.mjs
@@ -0,0 +1,47 @@
+// Propagate the changesets-computed npm version to the rest of the EQL release.
+//
+// `@cipherstash/eql`'s package.json version (owned by `changeset version`) is the
+// single source of truth for the EQL release identity V. SQL, the Rust crate,
+// and the npm package all ship at V (they're generated from one catalog at one
+// commit). This runs as the second half of the root `version` script — right
+// after `changeset version` — so the resulting "Version Packages" commit is a
+// complete, consistent lockstep bump (which release-plz then publishes verbatim
+// from the committed tree).
+//
+// It:
+//   1. reads V from packages/eql/package.json,
+//   2. sets crates/eql-bindings/Cargo.toml [package] version = V,
+//   3. runs `mise run release:prepare_bindings_assets --version V`, which builds
+//      the exact-version SQL and writes it (+ release manifests) into both the
+//      crate and the npm package.
+
+import { execFileSync } from 'node:child_process'
+import { readFileSync, writeFileSync } from 'node:fs'
+import { dirname, join } from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
+
+const pkgPath = join(repoRoot, 'packages/eql/package.json')
+const version = JSON.parse(readFileSync(pkgPath, 'utf8')).version
+if (typeof version !== 'string' || version.length === 0) {
+  throw new Error(`could not read a version from ${pkgPath}`)
+}
+
+// Set the crate's [package] version. Only the package version sits at column 0
+// as `version = "..."`; dependency versions are inline (`{ version = "1" }`).
+const cargoPath = join(repoRoot, 'crates/eql-bindings/Cargo.toml')
+const cargo = readFileSync(cargoPath, 'utf8')
+const cargoNext = cargo.replace(/^version = "[^"]*"$/m, `version = "${version}"`)
+if (cargoNext === cargo) {
+  throw new Error(`did not find a [package] version line to update in ${cargoPath}`)
+}
+writeFileSync(cargoPath, cargoNext)
+
+// Build the exact-version SQL and copy it (+ manifests) into both packages.
+execFileSync('mise', ['run', 'release:prepare_bindings_assets', '--version', version], {
+  cwd: repoRoot,
+  stdio: 'inherit',
+})
+
+console.log(`synced EQL lockstep version ${version} to Cargo.toml + bundled SQL assets`)
diff --git a/tasks/release/prepare-bindings-assets.sh b/tasks/release/prepare-bindings-assets.sh
index ae61764e5..9840a976f 100755
--- a/tasks/release/prepare-bindings-assets.sh
+++ b/tasks/release/prepare-bindings-assets.sh
@@ -15,8 +15,8 @@ while [[ $# -gt 0 ]]; do
     *) shift ;;
   esac
 done
-if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]]; then
-  echo "error: --version must be an exact prerelease identity (X.Y.Z-(alpha|beta|rc).N)" >&2
+if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-(alpha|beta|rc)\.[0-9]+)?$ ]]; then
+  echo "error: --version must be an exact release identity (X.Y.Z or X.Y.Z-(alpha|beta|rc).N)" >&2
   exit 1
 fi
 

From cd303db1a0c85653e98f2522f0c25dcfec18eae4 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Tue, 7 Jul 2026 13:58:09 +1000
Subject: [PATCH 570/599] ci(release): changesets release.yml (npm+SQL+docs);
 release-plz publish-only
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

release.yml is the changesets-driven entry point (Version PR via version:, npm publish via publish:, then SQL+docs release at V). release-plz.yml drops its release-pr job — changesets owns versioning; it publishes the committed Cargo.toml V on push to main.
---
 .github/workflows/release-plz.yml |  56 +++----------
 .github/workflows/release.yml     | 135 ++++++++++++++++++++++++++++++
 2 files changed, 145 insertions(+), 46 deletions(-)
 create mode 100644 .github/workflows/release.yml

diff --git a/.github/workflows/release-plz.yml b/.github/workflows/release-plz.yml
index e6188b7d3..605ffdc64 100644
--- a/.github/workflows/release-plz.yml
+++ b/.github/workflows/release-plz.yml
@@ -1,19 +1,16 @@
 name: "Release eql-bindings (crates.io)"
 
-# Publishes the `eql-bindings` crate to crates.io via release-plz. Mirrors the
-# canonical cipherstash-suite release-plz setup (crates.io Trusted Publishing
-# via OIDC — no long-lived token; GPG-signed release commits/tags; `release`
-# before `release-pr`) and keeps EQL's own infra conventions (blacksmith runner,
-# mise toolchain).
+# Publishes the `eql-bindings` crate to crates.io via release-plz (crates.io
+# Trusted Publishing via OIDC — no long-lived token; GPG-signed release
+# commits/tags; blacksmith runner + mise toolchain).
 #
-# Flow (see also cipherstash-suite RELEASING.md):
-#   1. Push to main -> `release-pr` opens/updates a release PR (version bump +
-#      crates/eql-bindings/CHANGELOG.md from conventional commits).
-#   2. Merge that PR -> `release` publishes to crates.io, tags, and cuts a
-#      GitHub Release.
-# `release-pr` runs AFTER `release` (needs: release): if it ran first it would
-# see the just-merged `chore: release` commit as unreleased and open a recursive
-# release PR. (cipherstash-suite commit 02a989405.)
+# Publish-only: crate versioning is owned by CHANGESETS, not release-plz. The
+# changesets "Version Packages" PR bumps crates/eql-bindings/Cargo.toml to the
+# lockstep version V (scripts/sync-lockstep-versions.mjs) alongside the npm
+# package. On push to main, `release` publishes the committed Cargo.toml version
+# V to crates.io (no-op when V is already published) and tags eql-bindings-vV.
+# There is deliberately NO release-plz `release-pr` job — changesets opens the
+# version PR, so a release-plz PR would fight it.
 #
 # One-time crates.io setup (Trusted Publishing): on the eql-bindings crate's
 # Settings -> Trusted Publishing, add a GitHub publisher with
@@ -81,36 +78,3 @@ jobs:
           command: release
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
-  release-pr:
-    name: "Release PR"
-    # A coordinator dispatch against a tag or feature branch must publish
-    # without opening a recursive release PR.
-    if: github.ref == 'refs/heads/main'
-    runs-on: blacksmith-16vcpu-ubuntu-2204
-    needs: release
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          fetch-depth: 0
-
-      - name: Import GPG key
-        uses: crazy-max/ghaction-import-gpg@v7
-        with:
-          gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
-          git_user_signingkey: true
-          git_commit_gpgsign: true
-          git_tag_gpgsign: true
-
-      - uses: jdx/mise-action@v3
-        with:
-          version: 2026.4.0
-          install: true
-          cache: true
-
-      - name: Run release-plz release-pr
-        uses: release-plz/action@v0.5
-        with:
-          command: release-pr
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..3164d8ad6
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,135 @@
+name: "Release (changesets)"
+
+# Single release entry point for the EQL lockstep artifacts, driven by
+# changesets. On push to main:
+#   - if changesets are pending -> changesets/action opens/updates the
+#     "Version Packages" PR. Its `version:` command bumps @cipherstash/eql AND
+#     derives the crate version + bundled SQL to the same V
+#     (scripts/sync-lockstep-versions.mjs), so the merged commit is a complete,
+#     consistent lockstep bump.
+#   - if none are pending (the Version PR just merged) -> it publishes the npm
+#     package (@cipherstash/eql@V) via OIDC trusted publishing, and this
+#     workflow then builds+attaches the SQL GitHub release (eql-V) and docs.
+#
+# The Rust crate publishes independently from release-plz.yml (its own
+# push-to-main trigger publishes the committed Cargo.toml version V; crates.io
+# Trusted Publishing requires that workflow as the entry point). npm auth is
+# OIDC only (no NPM_TOKEN).
+#
+# One-time npm setup (Trusted Publishing): on the @cipherstash/eql package's
+# Settings -> Trusted Publisher, add a GitHub publisher with
+#   Organization: cipherstash   Repository: encrypt-query-language
+#   Workflow: release.yml
+# For the brand-new package, bootstrap the first publish out-of-band, then all
+# subsequent publishes are OIDC.
+
+permissions:
+  id-token: write # npm OIDC trusted publishing
+  contents: write # changesets commits the Version PR / tags; SQL release attach
+  pull-requests: write # changesets opens the Version PR
+
+on:
+  push:
+    branches:
+      - main
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: false
+
+defaults:
+  run:
+    shell: bash {0}
+
+jobs:
+  release:
+    name: Version or publish (changesets)
+    # GitHub-hosted (not Blacksmith): npm provenance from OIDC trusted
+    # publishing is only accepted from github-hosted runners (self-hosted -> E422).
+    runs-on: ubuntu-latest
+    timeout-minutes: 20
+    outputs:
+      published: ${{ steps.changesets.outputs.published }}
+      version: ${{ steps.ver.outputs.version }}
+      prerelease: ${{ steps.ver.outputs.prerelease }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+
+      - uses: pnpm/action-setup@v6.0.8
+        name: Install pnpm
+        with:
+          run_install: false
+          cache: false
+
+      - uses: actions/setup-node@v4
+        with:
+          node-version: 22
+
+      - name: Upgrade npm for OIDC trusted publishing
+        run: npm install -g npm@^11.5.1
+
+      - uses: jdx/mise-action@v3
+        with:
+          version: 2026.4.0
+          install: true
+          cache: true
+
+      - name: Install dependencies
+        run: pnpm install --frozen-lockfile
+
+      # `version:` runs `changeset version && sync-lockstep-versions.mjs` (bumps
+      # package.json + Cargo.toml + builds/bundles SQL to V) for the Version PR;
+      # `publish:` runs `pnpm run build && changeset publish` to publish npm.
+      - name: Version or publish
+        id: changesets
+        uses: changesets/action@v1.8.0
+        with:
+          version: pnpm run version
+          publish: pnpm run release
+          commitMode: "github-api"
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Resolve published version
+        id: ver
+        if: steps.changesets.outputs.published == 'true'
+        env:
+          PUBLISHED: ${{ steps.changesets.outputs.publishedPackages }}
+        run: |
+          set -euo pipefail
+          version="$(node -e "const p=JSON.parse(process.env.PUBLISHED);const e=p.find(x=>x.name==='@cipherstash/eql');if(!e){process.exit(1)}console.log(e.version)")"
+          echo "version=${version}" >> "$GITHUB_OUTPUT"
+          if [[ "$version" == *-* ]]; then
+            echo "prerelease=true" >> "$GITHUB_OUTPUT"
+          else
+            echo "prerelease=false" >> "$GITHUB_OUTPUT"
+          fi
+
+  build-sql:
+    name: Build + attach SQL release
+    needs: release
+    if: ${{ needs.release.outputs.published == 'true' }}
+    permissions:
+      contents: write
+    secrets:
+      MULTITUDES_ACCESS_TOKEN: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}
+    uses: ./.github/workflows/_build-sql.yml
+    with:
+      ref: ${{ github.sha }}
+      tag: eql-${{ needs.release.outputs.version }}
+      attach: true
+      target_commitish: ${{ github.sha }}
+      prerelease: ${{ needs.release.outputs.prerelease == 'true' }}
+
+  build-docs:
+    name: Build + attach docs
+    needs: [release, build-sql]
+    if: ${{ needs.release.outputs.published == 'true' }}
+    permissions:
+      contents: write
+    uses: ./.github/workflows/_build-docs.yml
+    with:
+      ref: ${{ github.sha }}
+      tag: eql-${{ needs.release.outputs.version }}

From 221b6385fee563c14b0c76e8260b50c6000d6aab Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 10:32:03 +1000
Subject: [PATCH 571/599] ci(release): guard package workflow caches

---
 .github/workflows/lint-release.yml        | 20 +++++
 scripts/lint-no-workflow-caching.mjs      | 89 +++++++++++++++++++++++
 scripts/lint-no-workflow-caching.test.mjs | 61 ++++++++++++++++
 scripts/vitest.config.mjs                 |  8 ++
 4 files changed, 178 insertions(+)
 create mode 100644 scripts/lint-no-workflow-caching.mjs
 create mode 100644 scripts/lint-no-workflow-caching.test.mjs
 create mode 100644 scripts/vitest.config.mjs

diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml
index 0509b920b..af34df782 100644
--- a/.github/workflows/lint-release.yml
+++ b/.github/workflows/lint-release.yml
@@ -15,6 +15,8 @@ on:
       - .github/workflows/lint-release.yml
       - .github/actionlint.yaml
       - .github/scripts/*.sh
+      - package.json
+      - scripts/*.mjs
       - tasks/release/*.sh
   workflow_dispatch: {}
 
@@ -89,3 +91,21 @@ jobs:
 
       - name: release-typescript workflow security guard test
         run: bash .github/scripts/release-typescript-workflow.test.sh
+
+      - uses: pnpm/action-setup@v6.0.8
+        name: Install pnpm
+        with:
+          run_install: false
+          cache: false
+
+      - uses: actions/setup-node@v4
+        with:
+          node-version: 22
+
+      - name: Install JS dependencies
+        run: pnpm install --frozen-lockfile
+
+      - name: release workflow supply-chain cache guard
+        run: |
+          pnpm run lint:workflow-cache
+          pnpm run test:scripts
diff --git a/scripts/lint-no-workflow-caching.mjs b/scripts/lint-no-workflow-caching.mjs
new file mode 100644
index 000000000..3fa5246b5
--- /dev/null
+++ b/scripts/lint-no-workflow-caching.mjs
@@ -0,0 +1,89 @@
+#!/usr/bin/env node
+import { readFileSync } from 'node:fs'
+import { resolve } from 'node:path'
+import process from 'node:process'
+import yaml from 'js-yaml'
+
+const defaultWorkflowFiles = [
+  '.github/workflows/release.yml',
+  '.github/workflows/release-typescript.yml',
+  '.github/workflows/release-alpha.yml',
+]
+
+function asArray(value) {
+  return Array.isArray(value) ? value : []
+}
+
+function stepLabel(file, jobName, index, step) {
+  const name = step.name ? ` "${step.name}"` : ''
+  const uses = step.uses ? ` (${step.uses})` : ''
+  return `${file}: job ${jobName} step ${index + 1}${name}${uses}`
+}
+
+function readWorkflow(file) {
+  return yaml.load(readFileSync(file, 'utf8'))
+}
+
+function isExplicitlyDisabled(value) {
+  return value === false || value === 'false'
+}
+
+function isConfiguredAndNotDisabled(value) {
+  return value !== undefined && !isExplicitlyDisabled(value)
+}
+
+function hasCacheInput(step, names) {
+  const withBlock = step.with ?? {}
+  return names.some((name) => Object.hasOwn(withBlock, name))
+}
+
+export function lintWorkflowDocument(document, file = '') {
+  const errors = []
+  const jobs = document?.jobs ?? {}
+
+  for (const [jobName, job] of Object.entries(jobs)) {
+    for (const [index, step] of asArray(job?.steps).entries()) {
+      if (!step || typeof step !== 'object' || !step.uses) continue
+
+      const label = stepLabel(file, jobName, index, step)
+      const action = String(step.uses).toLowerCase()
+      const withBlock = step.with ?? {}
+
+      if (action.startsWith('pnpm/action-setup@')) {
+        if (!hasCacheInput(step, ['cache']) || !isExplicitlyDisabled(withBlock.cache)) {
+          errors.push(`${label}: pnpm/action-setup must set with.cache: false in release workflows`)
+        }
+      }
+
+      if (action.startsWith('actions/setup-node@')) {
+        if (isConfiguredAndNotDisabled(withBlock.cache)) {
+          errors.push(`${label}: actions/setup-node dependency cache must stay disabled`)
+        }
+        if (isConfiguredAndNotDisabled(withBlock['package-manager-cache'])) {
+          errors.push(`${label}: actions/setup-node package-manager-cache must stay disabled`)
+        }
+      }
+
+      if (action.startsWith('actions/cache@')) {
+        errors.push(`${label}: actions/cache is not allowed in release workflows that install or publish packages`)
+      }
+    }
+  }
+
+  return errors
+}
+
+export function lintWorkflowFiles(files = defaultWorkflowFiles) {
+  return files.flatMap((file) => lintWorkflowDocument(readWorkflow(file), file))
+}
+
+if (import.meta.url === `file://${process.argv[1]}`) {
+  const files = process.argv.slice(2).map((file) => resolve(file))
+  const errors = lintWorkflowFiles(files.length > 0 ? files : defaultWorkflowFiles)
+
+  for (const error of errors) {
+    console.error(error)
+  }
+
+  process.exit(errors.length === 0 ? 0 : 1)
+}
diff --git a/scripts/lint-no-workflow-caching.test.mjs b/scripts/lint-no-workflow-caching.test.mjs
new file mode 100644
index 000000000..a554e7316
--- /dev/null
+++ b/scripts/lint-no-workflow-caching.test.mjs
@@ -0,0 +1,61 @@
+import { describe, expect, test } from 'vitest'
+import { lintWorkflowDocument } from './lint-no-workflow-caching.mjs'
+
+describe('release workflow dependency cache guard', () => {
+  test('accepts explicit pnpm cache disablement and uncached setup-node', () => {
+    const errors = lintWorkflowDocument({
+      jobs: {
+        publish: {
+          steps: [
+            {
+              uses: 'pnpm/action-setup@v6.0.8',
+              with: { run_install: false, cache: false },
+            },
+            {
+              uses: 'actions/setup-node@v4',
+              with: { 'node-version': 22 },
+            },
+          ],
+        },
+      },
+    })
+
+    expect(errors).toEqual([])
+  })
+
+  test('rejects missing or enabled pnpm action caches', () => {
+    const errors = lintWorkflowDocument({
+      jobs: {
+        publish: {
+          steps: [
+            { uses: 'pnpm/action-setup@v6.0.8', with: { run_install: false } },
+            { uses: 'pnpm/action-setup@v6.0.8', with: { cache: true } },
+          ],
+        },
+      },
+    })
+
+    expect(errors).toHaveLength(2)
+    expect(errors[0]).toContain('with.cache: false')
+    expect(errors[1]).toContain('with.cache: false')
+  })
+
+  test('rejects setup-node package manager caches and actions/cache', () => {
+    const errors = lintWorkflowDocument({
+      jobs: {
+        publish: {
+          steps: [
+            { uses: 'actions/setup-node@v4', with: { cache: 'pnpm' } },
+            { uses: 'actions/setup-node@v4', with: { 'package-manager-cache': true } },
+            { uses: 'actions/cache@v4', with: { path: '~/.pnpm-store' } },
+          ],
+        },
+      },
+    })
+
+    expect(errors).toHaveLength(3)
+    expect(errors[0]).toContain('setup-node dependency cache')
+    expect(errors[1]).toContain('package-manager-cache')
+    expect(errors[2]).toContain('actions/cache is not allowed')
+  })
+})
diff --git a/scripts/vitest.config.mjs b/scripts/vitest.config.mjs
new file mode 100644
index 000000000..57ce12275
--- /dev/null
+++ b/scripts/vitest.config.mjs
@@ -0,0 +1,8 @@
+import { defineConfig } from 'vitest/config'
+
+export default defineConfig({
+  test: {
+    environment: 'node',
+    include: ['scripts/**/*.test.mjs'],
+  },
+})

From 4190365499ed48323646fc226ca66e77c3073769 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 10:49:00 +1000
Subject: [PATCH 572/599] fix(release): publish npm prereleases with dist tag

---
 .github/workflows/release-typescript.yml |  7 ++++++-
 packages/eql/package.json                |  2 +-
 packages/eql/scripts/npm-publish.mjs     | 20 ++++++++++++++++++++
 3 files changed, 27 insertions(+), 2 deletions(-)
 create mode 100644 packages/eql/scripts/npm-publish.mjs

diff --git a/.github/workflows/release-typescript.yml b/.github/workflows/release-typescript.yml
index c0055fce3..18748ef69 100644
--- a/.github/workflows/release-typescript.yml
+++ b/.github/workflows/release-typescript.yml
@@ -111,7 +111,12 @@ jobs:
           if [ -n "$(npm view "@cipherstash/eql@${IDENTITY}" version 2>/dev/null)" ]; then
             echo "@cipherstash/eql@${IDENTITY} is already published; skipping publish"
           else
-            npm publish --access public --provenance
+            publish_tag="latest"
+            if [[ "$IDENTITY" == *-* ]]; then
+              prerelease="${IDENTITY#*-}"
+              publish_tag="${prerelease%%.*}"
+            fi
+            npm publish --access public --provenance --tag "$publish_tag"
           fi
 
       - name: Tag TypeScript release
diff --git a/packages/eql/package.json b/packages/eql/package.json
index 04628f0bc..61e9c7852 100644
--- a/packages/eql/package.json
+++ b/packages/eql/package.json
@@ -50,7 +50,7 @@
     "build": "tsup",
     "dev": "tsup --watch",
     "test": "vitest run",
-    "release": "pnpm run check:generated && pnpm run build && npm publish --access public --provenance"
+    "release": "pnpm run check:generated && pnpm run build && node scripts/npm-publish.mjs"
   },
   "publishConfig": {
     "access": "public"
diff --git a/packages/eql/scripts/npm-publish.mjs b/packages/eql/scripts/npm-publish.mjs
new file mode 100644
index 000000000..3159a230b
--- /dev/null
+++ b/packages/eql/scripts/npm-publish.mjs
@@ -0,0 +1,20 @@
+#!/usr/bin/env node
+import { readFileSync } from 'node:fs'
+import { dirname, resolve } from 'node:path'
+import { spawnSync } from 'node:child_process'
+import { fileURLToPath } from 'node:url'
+
+const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')
+const pkg = JSON.parse(readFileSync(resolve(packageRoot, 'package.json'), 'utf8'))
+const prerelease = pkg.version.match(/-(alpha|beta|rc)\./)
+const tag = prerelease ? prerelease[1] : 'latest'
+
+console.log(`publishing ${pkg.name}@${pkg.version} with npm dist-tag '${tag}'`)
+
+const result = spawnSync(
+  'npm',
+  ['publish', '--access', 'public', '--provenance', '--tag', tag, ...process.argv.slice(2)],
+  { cwd: packageRoot, stdio: 'inherit' },
+)
+
+process.exit(result.status ?? 1)

From 2e9cd6f06a30fa9637b050ab270f71a83ba84240 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 11:59:55 +1000
Subject: [PATCH 573/599] ci(release): unify prerelease entrypoint

---
 .github/workflows/README.md            |   1 +
 .github/workflows/lint-release.yml     |   2 +
 .github/workflows/release.yml          | 247 ++++++++++++++++++++++---
 CLAUDE.md                              |   4 +-
 docs/development/releasing-an-alpha.md | 156 +++++-----------
 5 files changed, 281 insertions(+), 129 deletions(-)

diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index fe9e0943c..983006410 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -20,6 +20,7 @@ actually runs).
 | **test-eql.yml** | `pull_request`, `merge_group`, `workflow_dispatch` | Full test/lint/validate matrix; the one required check | **Yes** — `ci-required` |
 | **release-eql.yml** | `release: published`, `pull_request` (paths), `workflow_dispatch` | Build release SQL + docs; PR runs everything **but** the publish step | No |
 | **release-postgres-eql-image.yml** | `release: published`, `workflow_dispatch` | Build & push the Postgres+EQL Docker image to GHCR | No |
+| **release.yml** | `push: main`, `push: eql_v3`, `workflow_dispatch` | Unified release entrypoint: production on `main`, prerelease on `eql_v3` when the commit is an explicit `chore(release): ...` marker | No |
 | **release-plz.yml** | `push: main`, `workflow_dispatch` | Publish the `eql-bindings` crate to crates.io (Trusted Publishing) + open the release PR | No |
 | **bench-eql.yml** | `push: main` (paths), `schedule` 02:00 UTC daily, `workflow_dispatch` | `test:bench` (bench cargo feature). **Never runs on PRs** | No |
 | **macro-expand-eql.yml** | `schedule` 03:00 UTC daily, `workflow_dispatch` | Regenerate the integer `cargo expand` matrix snapshot; needs pinned nightly | **No — explicitly non-blocking** |
diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml
index af34df782..2085cdb57 100644
--- a/.github/workflows/lint-release.yml
+++ b/.github/workflows/lint-release.yml
@@ -10,6 +10,7 @@ on:
       - .github/workflows/_build-docs.yml
       - .github/workflows/release-eql.yml
       - .github/workflows/release-plz.yml
+      - .github/workflows/release.yml
       - .github/workflows/release-typescript.yml
       - .github/workflows/release-alpha.yml
       - .github/workflows/lint-release.yml
@@ -51,6 +52,7 @@ jobs:
             .github/workflows/_build-docs.yml \
             .github/workflows/release-eql.yml \
             .github/workflows/release-plz.yml \
+            .github/workflows/release.yml \
             .github/workflows/release-typescript.yml \
             .github/workflows/release-alpha.yml \
             .github/workflows/lint-release.yml
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 3164d8ad6..1f91f1553 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,27 +1,18 @@
-name: "Release (changesets)"
-
-# Single release entry point for the EQL lockstep artifacts, driven by
-# changesets. On push to main:
-#   - if changesets are pending -> changesets/action opens/updates the
-#     "Version Packages" PR. Its `version:` command bumps @cipherstash/eql AND
-#     derives the crate version + bundled SQL to the same V
-#     (scripts/sync-lockstep-versions.mjs), so the merged commit is a complete,
-#     consistent lockstep bump.
-#   - if none are pending (the Version PR just merged) -> it publishes the npm
-#     package (@cipherstash/eql@V) via OIDC trusted publishing, and this
-#     workflow then builds+attaches the SQL GitHub release (eql-V) and docs.
+name: "Release"
+
+# Single release entry point for the EQL release line.
+#
+# - `main` uses Changesets to version and publish the production release.
+# - `eql_v3` can cut prereleases from an explicit conventional release commit.
+#   The release commit itself is the marker: `chore(release): ...`.
 #
-# The Rust crate publishes independently from release-plz.yml (its own
-# push-to-main trigger publishes the committed Cargo.toml version V; crates.io
-# Trusted Publishing requires that workflow as the entry point). npm auth is
-# OIDC only (no NPM_TOKEN).
+# Prereleases publish the npm package directly from this workflow and dispatch
+# the Rust crate publish through `release-plz.yml` so crates.io Trusted
+# Publishing still sees the correct entry-point workflow. The SQL GitHub
+# release and docs are built in the same workflow run.
 #
-# One-time npm setup (Trusted Publishing): on the @cipherstash/eql package's
-# Settings -> Trusted Publisher, add a GitHub publisher with
-#   Organization: cipherstash   Repository: encrypt-query-language
-#   Workflow: release.yml
-# For the brand-new package, bootstrap the first publish out-of-band, then all
-# subsequent publishes are OIDC.
+# npm Trusted Publishing must be configured for this workflow filename:
+# `release.yml`.
 
 permissions:
   id-token: write # npm OIDC trusted publishing
@@ -32,6 +23,8 @@ on:
   push:
     branches:
       - main
+      - eql_v3
+  workflow_dispatch: {}
 
 concurrency:
   group: ${{ github.workflow }}-${{ github.ref }}
@@ -42,8 +35,57 @@ defaults:
     shell: bash {0}
 
 jobs:
+  classify:
+    name: Classify release intent
+    runs-on: ubuntu-latest
+    timeout-minutes: 5
+    outputs:
+      mode: ${{ steps.classify.outputs.mode }}
+      version: ${{ steps.classify.outputs.version }}
+      prerelease: ${{ steps.classify.outputs.prerelease }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+
+      - id: classify
+        run: |
+          set -euo pipefail
+          branch="${GITHUB_REF_NAME}"
+          subject="$(git log -1 --format=%s)"
+          mode="skip"
+          version=""
+          prerelease="false"
+
+          if [[ "$branch" == "main" ]]; then
+            mode="production"
+          elif [[ "$branch" == "eql_v3" ]]; then
+            case "$subject" in
+              chore\(release\):*|release:*)
+                mode="prerelease"
+                ;;
+            esac
+          fi
+
+          if [[ "$mode" == "prerelease" ]]; then
+            version="$(node -p "require('./packages/eql/package.json').version")"
+            if [[ "$version" != *-* ]]; then
+              echo "::error::prerelease release commits must already pin a prerelease version in packages/eql/package.json" >&2
+              exit 1
+            fi
+            prerelease="true"
+          fi
+
+          {
+            echo "mode=$mode"
+            echo "version=$version"
+            echo "prerelease=$prerelease"
+          } >> "$GITHUB_OUTPUT"
+
   release:
     name: Version or publish (changesets)
+    needs: classify
+    if: ${{ needs.classify.outputs.mode == 'production' }}
     # GitHub-hosted (not Blacksmith): npm provenance from OIDC trusted
     # publishing is only accepted from github-hosted runners (self-hosted -> E422).
     runs-on: ubuntu-latest
@@ -133,3 +175,164 @@ jobs:
     with:
       ref: ${{ github.sha }}
       tag: eql-${{ needs.release.outputs.version }}
+
+  prerelease-build-sql:
+    name: Build + attach prerelease SQL
+    needs: classify
+    if: ${{ needs.classify.outputs.mode == 'prerelease' }}
+    permissions:
+      contents: write
+    secrets:
+      MULTITUDES_ACCESS_TOKEN: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}
+    uses: ./.github/workflows/_build-sql.yml
+    with:
+      ref: ${{ github.sha }}
+      tag: eql-${{ needs.classify.outputs.version }}
+      attach: true
+      target_commitish: ${{ github.sha }}
+      prerelease: true
+
+  prerelease-build-docs:
+    name: Build + attach prerelease docs
+    needs: [classify, prerelease-build-sql]
+    if: ${{ needs.classify.outputs.mode == 'prerelease' }}
+    permissions:
+      contents: write
+    uses: ./.github/workflows/_build-docs.yml
+    with:
+      ref: ${{ github.sha }}
+      tag: eql-${{ needs.classify.outputs.version }}
+
+  prerelease-publish-npm:
+    name: Publish prerelease npm package
+    needs: [classify, prerelease-build-sql, prerelease-build-docs]
+    if: ${{ needs.classify.outputs.mode == 'prerelease' }}
+    runs-on: ubuntu-latest
+    timeout-minutes: 15
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          persist-credentials: false
+
+      - uses: pnpm/action-setup@v6.0.8
+        name: Install pnpm
+        with:
+          run_install: false
+          cache: false
+
+      - uses: actions/setup-node@v4
+        with:
+          node-version: 22
+
+      - name: Upgrade npm for OIDC trusted publishing
+        run: npm install -g npm@^11.5.1
+
+      - uses: jdx/mise-action@v3
+        with:
+          version: 2026.4.0
+          install: true
+          cache: true
+
+      - name: Install dependencies
+        run: pnpm install --frozen-lockfile
+
+      - name: Verify prerelease marker and version
+        env:
+          VERSION: ${{ needs.classify.outputs.version }}
+        run: |
+          set -euo pipefail
+          actual="$(node -p "require('./packages/eql/package.json').version")"
+          test "$actual" = "$VERSION" || {
+            echo "package version ${actual} does not match prerelease identity ${VERSION}" >&2
+            exit 1
+          }
+
+      - name: Prepare exact SQL assets
+        env:
+          VERSION: ${{ needs.classify.outputs.version }}
+        run: mise run release:prepare_bindings_assets --version "$VERSION"
+
+      - name: Build package
+        run: pnpm --filter @cipherstash/eql build
+
+      - name: Publish package
+        working-directory: packages/eql
+        env:
+          VERSION: ${{ needs.classify.outputs.version }}
+        run: |
+          set -euo pipefail
+          if [ -n "$(npm view "@cipherstash/eql@${VERSION}" version 2>/dev/null)" ]; then
+            echo "@cipherstash/eql@${VERSION} is already published; skipping publish"
+          else
+            node scripts/npm-publish.mjs
+          fi
+
+      - name: Tag TypeScript release
+        env:
+          VERSION: ${{ needs.classify.outputs.version }}
+          GH_TOKEN: ${{ github.token }}
+          REPO: ${{ github.repository }}
+        run: |
+          set -euo pipefail
+          tag="eql-typescript-v${VERSION}"
+          repo_url="https://github.com/${REPO}.git"
+          auth=(-c "http.https://github.com/.extraheader=AUTHORIZATION: bearer ${GH_TOKEN}")
+          if git "${auth[@]}" ls-remote --exit-code --tags "$repo_url" "refs/tags/${tag}" >/dev/null 2>&1; then
+            echo "tag ${tag} already exists on the remote; skipping"
+          else
+            git config user.name "github-actions[bot]"
+            git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+            git tag "$tag"
+            git "${auth[@]}" push "$repo_url" "refs/tags/${tag}"
+          fi
+
+  prerelease-publish-rust:
+    name: Dispatch prerelease Rust publish
+    needs: [classify, prerelease-build-sql, prerelease-build-docs]
+    if: ${{ needs.classify.outputs.mode == 'prerelease' }}
+    runs-on: ubuntu-latest
+    timeout-minutes: 10
+    permissions:
+      actions: write
+    steps:
+      - name: Dispatch release-plz.yml against the prerelease commit
+        env:
+          GH_TOKEN: ${{ github.token }}
+          BRANCH: ${{ github.ref_name }}
+        run: |
+          set -euo pipefail
+          gh workflow run release-plz.yml --ref "$BRANCH"
+
+  summary:
+    name: Summary
+    runs-on: ubuntu-latest
+    needs: [classify, release, build-sql, build-docs, prerelease-build-sql, prerelease-build-docs, prerelease-publish-npm, prerelease-publish-rust]
+    if: always()
+    steps:
+      - name: Emit run summary
+        env:
+          MODE: ${{ needs.classify.outputs.mode }}
+          VERSION: ${{ needs.classify.outputs.version }}
+          CLASSIFY_RESULT: ${{ needs.classify.result }}
+          RELEASE_RESULT: ${{ needs.release.result }}
+          BUILD_SQL_RESULT: ${{ needs.build-sql.result }}
+          BUILD_DOCS_RESULT: ${{ needs.build-docs.result }}
+          PRE_BUILD_SQL_RESULT: ${{ needs.prerelease-build-sql.result }}
+          PRE_BUILD_DOCS_RESULT: ${{ needs.prerelease-build-docs.result }}
+          PRE_PUBLISH_NPM_RESULT: ${{ needs.prerelease-publish-npm.result }}
+          PRE_PUBLISH_RUST_RESULT: ${{ needs.prerelease-publish-rust.result }}
+          SERVER_URL: ${{ github.server_url }}
+          REPOSITORY: ${{ github.repository }}
+          RUN_ID: ${{ github.run_id }}
+        run: |
+          set -euo pipefail
+          {
+            echo "## Release result"
+            echo ""
+            echo "- mode: \`${MODE}\`"
+            echo "- version: \`${VERSION}\`"
+            echo "- classify: ${CLASSIFY_RESULT} | release: ${RELEASE_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | prerelease-build-sql: ${PRE_BUILD_SQL_RESULT} | prerelease-build-docs: ${PRE_BUILD_DOCS_RESULT} | prerelease-publish-npm: ${PRE_PUBLISH_NPM_RESULT} | prerelease-publish-rust: ${PRE_PUBLISH_RUST_RESULT}"
+            echo ""
+            echo "Run: ${SERVER_URL}/${REPOSITORY}/actions/runs/${RUN_ID}"
+          } >> "$GITHUB_STEP_SUMMARY"
diff --git a/CLAUDE.md b/CLAUDE.md
index eaedbf120..742f2f0e9 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -212,10 +212,10 @@ EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style `
 
 **Cutting a release is scripted — don't hand-roll `gh release create`.** There are two paths:
 
-- **Prerelease (alpha / beta / rc):** run `mise run release:all` (SQL + docs + **all** language binding packages — the Rust `eql-bindings` crate and the TypeScript `@cipherstash/eql` npm package — in lockstep), `mise run release:eql` (SQL + docs only), `mise run release:bindings` (all language packages for an existing SQL alpha, same source), or the single-language variants `mise run release:rust` / `mise run release:typescript`. Each task dispatches the CI-native coordinator `.github/workflows/release-alpha.yml` and watches the run via a unique `dispatch_id`; release-relevant work happens in CI. The coordinator derives the `-.` identity across all three tag namespaces (`eql-`, `eql-bindings-v`, `eql-typescript-v`), verifies drift gates, and builds/attaches the alpha assets in-run. For `release:all`, it also pins the selected package versions, builds SQL + docs, then dispatches `release-plz.yml` and `release-typescript.yml` so all tags land on one commit. `release:all`, `release:bindings`, `release:rust`, and `release:typescript` require `--ref ` because the pin is pushed. Always use `--dry-run` first. It deliberately does **not** touch `CHANGELOG.md` (prerelease entries stay under `[Unreleased]`). Full runbook: **`docs/development/releasing-an-alpha.md`**.
+- **Prerelease:** use the unified `release.yml` workflow. On `main` it runs the production release path; on `eql_v3` it only publishes when the push is an explicit conventional release commit (`chore(release): ...`). Release-relevant work happens in CI, and prerelease runs still build SQL + docs + language packages in the same workflow. The npm package is published directly by `release.yml`; the Rust crate still publishes via `release-plz.yml` because crates.io Trusted Publishing needs that workflow entry point. Always use `--dry-run` first when invoking the release tasks or workflow manually. It deliberately does **not** touch `CHANGELOG.md` for prereleases (`[Unreleased]` stays put). Full runbook: **`docs/development/releasing-an-alpha.md`**.
 - **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]`, which the workflow's `verify-changelog` job enforces.
 
-The **language binding packages** are generated from the same `eql-domains::CATALOG` as the SQL surface: the **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) and the **`@cipherstash/eql` npm package** (published via npm trusted publishing by `release-typescript.yml`, tagged `eql-typescript-v`). Both bundle the exact self-contained SQL installer/uninstaller they were generated against (the crate exposes it as `eql_bindings::sql`; the npm package via its `./sql` subpath exports). `release:all` releases them in **version lockstep** with each `eql_v3` alpha (`eql-bindings-v3.0.0-alpha.N` ↔ `eql-typescript-v3.0.0-alpha.N` ↔ `eql-3.0.0-alpha.N` on the same commit). Use `release:bindings` to publish all missing language packages for an existing SQL alpha, or `release:rust` / `release:typescript` for a single language; the coordinator enforces that the branch is still at the SQL tag commit before adding the metadata-only pin commit. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the coordinator pins with `release-plz set-version eql-bindings@`.
+The **language binding packages** are generated from the same `eql-domains::CATALOG` as the SQL surface: the **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) and the **`@cipherstash/eql` npm package** (published via npm Trusted Publishing from `release.yml`, tagged `eql-typescript-v`). Both bundle the exact self-contained SQL installer/uninstaller they were generated against (the crate exposes it as `eql_bindings::sql`; the npm package via its `./sql` subpath exports). Prerelease release commits on `eql_v3` carry the committed version and bundled SQL for the release; `release.yml` publishes that commit as the prerelease and then dispatches `release-plz.yml` for the crate. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the release commit must already carry the version pin.
 
 ### When you make a user-facing change
 
diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md
index 5106b7c6c..8fb347e0f 100644
--- a/docs/development/releasing-an-alpha.md
+++ b/docs/development/releasing-an-alpha.md
@@ -1,10 +1,9 @@
-# Releasing an `eql_v3` alpha
+# Releasing from `release.yml`
 
-A concise runbook for cutting a **prerelease** (alpha/beta/rc) of the EQL SQL
-surface, its language binding packages (the `eql-bindings` crate and the
-`@cipherstash/eql` npm package), or all of them in lockstep. For a final
-(non-prerelease) release, follow the **"Cutting a release"** section of
-`CLAUDE.md` instead.
+A concise runbook for cutting a **prerelease** of the EQL SQL surface, its
+language binding packages (the `eql-bindings` crate and the `@cipherstash/eql`
+npm package), or all of them in lockstep. For a final (non-prerelease) release,
+follow the **"Cutting a release"** section of `CLAUDE.md` instead.
 
 ## What ships
 
@@ -15,10 +14,12 @@ Alpha releases ship the same EQL assets as final releases:
 | `cipherstash-encrypt.sql` / `cipherstash-encrypt-uninstall.sql` | **The standalone, self-contained `eql_v3` surface** (no `eql_v2`) |
 | `eql-docs-*.zip` / `eql-docs-*.tar.gz` | Packaged API documentation |
 
-The CI-native alpha coordinator (`.github/workflows/release-alpha.yml`) builds
-and attaches the SQL files and docs bundle **in the same workflow run**. This is
-intentional: releases created by the automatic `GITHUB_TOKEN` do not trigger
-follow-on release workflows, so alpha assets cannot rely on release-event fan-out.
+The CI-native release workflow (`.github/workflows/release.yml`) builds and
+attaches the SQL files and docs bundle **in the same workflow run**. On
+`eql_v3`, prerelease runs only proceed when the push is an explicit conventional
+release commit (`chore(release): ...`). This is intentional: releases created
+by the automatic `GITHUB_TOKEN` do not trigger follow-on release workflows, so
+the SQL/docs/package publish work has to happen in one release run.
 
 `cipherstash-encrypt.sql` is the only installer: it installs the `eql_v3`
 schema into a database with no `eql_v2` present. There is no separate
@@ -37,125 +38,71 @@ For a prerelease, do **not** promote `[Unreleased]` to `[]` in
 `CHANGELOG.md`. Entries stay under `## [Unreleased]` until a final release is
 cut.
 
-## CI-native release tasks
+## CI-native release workflow
 
-Use one of the thin `mise` tasks. Each task dispatches
-`.github/workflows/release-alpha.yml` via `workflow_dispatch`, passes a unique
-`dispatch_id`, and watches that exact run. Release-relevant work happens in CI,
-not locally.
+Use `.github/workflows/release.yml` directly. It is the single release
+entrypoint:
 
-| Task | Coordinator target | Result |
-|------|--------------------|--------|
-| `mise run release:all` | `all` | Pins Rust + TypeScript package versions, builds and releases SQL + docs, then dispatches Rust and TypeScript package publishes from the same release identity. |
-| `mise run release:eql` | `eql` | Builds and releases SQL + docs only. No language package publish. |
-| `mise run release:bindings` | `bindings` | Publishes all missing language binding packages for an existing same-source SQL prerelease. |
-| `mise run release:rust` | `rust` | Publishes only the Rust `eql-bindings` crate for an existing same-source SQL prerelease. |
-| `mise run release:typescript` | `typescript` | Publishes only the TypeScript `@cipherstash/eql` npm package for an existing same-source SQL prerelease. |
+- `main` runs the production release path.
+- `eql_v3` runs the prerelease path only when the push commit is an explicit
+  conventional release marker such as `chore(release): ...`.
+- `workflow_dispatch` is available for manual testing on any ref.
 
-`release:all`, `release:bindings`, `release:rust`, and `release:typescript`
-require `--ref ` because the coordinator pushes the package-version pin.
-`release:eql` can run against any ref because it does not push.
+Release-relevant work happens in CI, not locally. For a prerelease test, push a
+marker commit on `eql_v3`, or dispatch the workflow manually against a branch
+that already contains the marker commit.
 
-Language binding package tags:
+Language binding package tags remain:
 
 - Rust: `eql-bindings-v`
 - TypeScript: `eql-typescript-v`
 
-`target=bindings` means all language bindings, not only the Rust crate. Specific
-language targets use language names (`rust`, `typescript`) rather than
-package-manager names (`crate`, `npm`) so the operator interface remains stable
-if packaging changes later.
-
-The TypeScript publish workflow uses npm trusted publishing and must run on
-GitHub-hosted `ubuntu-latest`. Do not move `release-typescript.yml` to a
-Blacksmith/self-hosted runner: npm provenance rejects self-hosted runners. The
-workflow intentionally has `id-token: write`, upgrades npm to `^11.5.1`, and
-does not use `NPM_TOKEN`.
-
-Common flags:
-
-| Flag | Meaning | Default |
-|------|---------|---------|
-| `--version` | Base SemVer (`X.Y.Z`) | `3.0.0` |
-| `--channel` | Prerelease channel: `alpha` \| `beta` \| `rc` | `alpha` |
-| `--pre` | Exact identity (`X.Y.Z-(alpha\|beta\|rc).N`), bypassing derivation | derived |
-| `--ref` | GitHub ref for `workflow_dispatch` | required explicitly for `release:all`, `release:bindings`, `release:rust`, and `release:typescript`; current branch for `release:eql` |
-| `--dry-run` | Resolve, verify, and print the plan without mutating anything | off |
+The prerelease path publishes the npm package directly from `release.yml` and
+dispatches `release-plz.yml` for the Rust crate after SQL and docs are built.
+The release commit must already carry the prerelease package version and
+generated SQL/doc assets.
 
 Examples:
 
 ```bash
-# Always start here: derive identity and run drift gates without publishing.
-mise run release:all --ref eql_v3 --dry-run
-
-# Ship SQL + docs and all language packages in lockstep.
-mise run release:all --ref eql_v3
+# Dispatch the unified release workflow on the prerelease branch.
+gh workflow run release.yml --ref eql_v3
 
-# Ship only the SQL surface + docs.
-mise run release:eql --channel beta
-
-# Publish all language packages for an already-existing SQL alpha, same source.
-mise run release:bindings --pre 3.0.0-alpha.2 --ref eql_v3
-
-# Publish only one language package (crate-only / npm-only) for an existing SQL alpha.
-mise run release:rust --pre 3.0.0-alpha.2 --ref eql_v3
-mise run release:typescript --pre 3.0.0-alpha.2 --ref eql_v3
+# Test the same release flow on a scratch branch that contains the marker commit.
+gh workflow run release.yml --ref 
 ```
 
 ## Identity and lockstep
 
-The release identity is `-.`, for example
-`3.0.0-alpha.2`. The coordinator derives `N` server-side from freshly fetched
-tags across all three namespaces:
+Prerelease identity is `-alpha.`, for example `3.0.0-alpha.2`.
+`release.yml` derives `N` server-side from freshly fetched tags across all
+three namespaces:
 
 - SQL tags: `eql-`
 - Rust tags: `eql-bindings-v`
 - TypeScript tags: `eql-typescript-v`
 
-For `release:all` and `release:eql`, `N` is one greater than the maximum matching
-counter found in **any** of the three namespaces. For `release:bindings`, the
-coordinator finds the newest SQL alpha still missing a Rust **or** TypeScript
-binding tag. For `release:rust` / `release:typescript`, it finds the newest SQL
-alpha still missing that specific language's tag.
-
-`release:all` is the normal lockstep path. The coordinator pins the requested
-package version(s) — the crate (`release-plz set-version`) and/or the npm package
-(`package.json` + lockfile) — commits that metadata change as commit `S`, builds
-SQL + docs at `S`, creates `eql-` at `S`, and dispatches
-`release-plz.yml` and `release-typescript.yml` against that immutable SQL tag.
-The resulting `eql-`, `eql-bindings-v`, and
-`eql-typescript-v` tags all land on the same commit.
-
-`release:bindings` catches up the language packages after an existing SQL alpha;
-`release:rust` and `release:typescript` are the single-language equivalents. The
-branch must currently point at the SQL tag commit. The coordinator verifies that
-`HEAD == eql-`, adds the metadata-only package pin commit on top, then
-dispatches the language-specific publish workflow(s). This guarantees the
-packages ship the same generated source as the SQL release, not later product
-code.
+The release identity is still `-alpha.` for prereleases. The
+workflow derives `N` from the relevant tags and validates that the prerelease
+version is already pinned in `packages/eql/package.json`.
+
+The workflow builds SQL and docs in the same run, publishes the npm package
+directly, and dispatches `release-plz.yml` for the crate so all release-facing
+artifacts come from the same source commit.
 
 ## Coordinator checks
 
-Before mutating anything, the coordinator validates inputs, fetches tags, derives
-the identity, checks target-specific tag existence, and runs the drift gates:
+Before mutating anything, `release.yml` validates the explicit release marker,
+fetches tags, derives the identity, and runs the drift gates:
 
 ```bash
 mise run types:check
 mise run codegen:parity
 ```
 
-For `release:all`, `release:bindings`, `release:rust`, and `release:typescript`,
-it also rejects non-branch refs because the package-version pin must be pushed.
-For `release:bindings`, `release:rust`, and `release:typescript`, it rejects a
-branch that has advanced past the SQL tag. For any binding target, it also fails
-fast if every requested language tag already exists for that identity (nothing
-left to publish).
-
-The Rust crate publish remains a separate `release-plz.yml` run because crates.io
-Trusted Publishing validates the entry-point workflow identity; the TypeScript
-publish is likewise a separate `release-typescript.yml` run (npm trusted
-publishing requires OIDC on a GitHub-hosted runner). The coordinator dispatches
-each workflow only after SQL and docs have been built and attached.
+For prereleases, the workflow rejects commits on `eql_v3` unless the commit
+subject is an explicit release marker. It also rejects prerelease commits whose
+package version is not already prerelease-shaped.
 
 ## Verification note
 
@@ -163,13 +110,12 @@ The durable PR gate is `.github/workflows/lint-release.yml`. It runs actionlint
 over the release workflows, ShellCheck over the release wrappers and identity
 helper, and `.github/scripts/derive-identity.test.sh`.
 
-The SQL to docs to package ordering can be exercised safely only on a scratch
-branch, because a real package publish (Rust or TypeScript) is irreversible. For
-a scratch validation, temporarily force the docs reusable to fail, run `mise run
-release:eql --ref ` or `mise run release:all --ref
-`, and confirm that no package publish (Rust or TypeScript) is
-dispatched when docs attachment fails. Revert the scratch change before any real
-alpha.
+The SQL-to-docs-to-publish ordering can be exercised safely only on a scratch
+branch, because a real package publish is irreversible. For a scratch
+validation, temporarily force the docs reusable to fail, dispatch
+`release.yml` against the prerelease branch, and confirm that no package
+publish is dispatched when docs attachment fails. Revert the scratch change
+before any real prerelease.
 
 ## Smoke-test the alpha
 

From 42123b31168f6222d22bc7732ca32806fa65a37d Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 12:54:46 +1000
Subject: [PATCH 574/599] ci(release): consolidate to a single release.yml
 process

Collapse the release surface onto the unified release.yml (production from
main via changesets; alpha/prerelease from eql_v3 via a chore(release):
commit). Remove the parallel machinery and roll the remaining release
artifacts into the one workflow.

- Remove the legacy alpha coordinator: release-alpha.yml, release-typescript.yml,
  the .github/scripts helpers (derive-identity, release-alpha-resolve,
  release-alpha-pin-bindings, release-alpha-verify-commit-signature,
  release-typescript-workflow guard) and their tests, and the tasks/release/*
  wrappers (all/eql/bindings/rust/typescript/resolve-alpha/pin-bindings).
- Remove release-eql.yml: the old manual final-release path. release.yml now
  builds + attaches the SQL + docs release itself; a GITHUB_TOKEN-created
  release never triggered its on: release fan-out, and changesets manages the
  changelog (its verify-changelog gate is obsolete).
- Restore the Multitudes production-deploy notification into the automated
  path: re-gate the _build-sql.yml step to fire on release.yml's non-prerelease
  SQL release (the old event_name == 'release' gate never matched under push).
- Roll the Postgres+EQL image build into release.yml: a build-image job
  dispatches release-postgres-eql-image.yml on production finals
  (update_floating_tags=true). Drop its dormant on: release trigger and the
  dead release-event branch; workflow_dispatch stays for manual/alpha images.
- Harden .changeset/config.json access to "public" (was "restricted"; inert for
  @cipherstash/eql today via publishConfig, but a footgun for future packages).
- Fix crates/eql-bindings/README.md (v3 envelope is v: 3, not v: 2) and align
  the release docs (CLAUDE.md, releasing-an-alpha.md, workflows/README.md,
  README badge, CHANGELOG) plus the lint-release gate to the single workflow.
- Mark the superseded 2026-07-04 coordinator design snapshots as historical.
---
 .changeset/config.json                        |   2 +-
 .github/scripts/derive-identity.sh            |  88 -----
 .github/scripts/derive-identity.test.sh       |  83 -----
 .github/scripts/release-alpha-pin-bindings.sh |  71 ----
 .../release-alpha-pin-bindings.test.sh        | 152 --------
 .github/scripts/release-alpha-resolve.sh      | 111 ------
 .github/scripts/release-alpha-resolve.test.sh | 152 --------
 .../release-alpha-verify-commit-signature.sh  |  25 --
 ...ease-alpha-verify-commit-signature.test.sh |  81 -----
 .../release-typescript-workflow.test.sh       |  62 ----
 .github/workflows/README.md                   |   8 +-
 .github/workflows/_build-docs.yml             |   6 +-
 .github/workflows/_build-sql.yml              |  11 +-
 .github/workflows/lint-release.yml            |  44 +--
 .github/workflows/release-alpha.yml           | 339 ------------------
 .github/workflows/release-eql.yml             |  80 -----
 .../workflows/release-postgres-eql-image.yml  |  38 +-
 .github/workflows/release-typescript.yml      | 144 --------
 .github/workflows/release.yml                 |  30 +-
 CHANGELOG.md                                  |   1 +
 CLAUDE.md                                     |   8 +-
 README.md                                     |   2 +-
 crates/eql-bindings/README.md                 |   4 +-
 .../2026-07-04-release-tasks-design.md        |   8 +
 ...07-04-release-tasks-implementation-plan.md |   6 +
 docs/development/releasing-an-alpha.md        |   5 +-
 scripts/lint-no-workflow-caching.mjs          |   6 +-
 tasks/release/all.sh                          |  63 ----
 tasks/release/bindings.sh                     |  60 ----
 tasks/release/eql.sh                          |  58 ---
 tasks/release/pin-bindings.sh                 |  20 --
 tasks/release/resolve-alpha.sh                |  38 --
 tasks/release/rust.sh                         |  60 ----
 tasks/release/typescript.sh                   |  61 ----
 34 files changed, 87 insertions(+), 1840 deletions(-)
 delete mode 100755 .github/scripts/derive-identity.sh
 delete mode 100755 .github/scripts/derive-identity.test.sh
 delete mode 100755 .github/scripts/release-alpha-pin-bindings.sh
 delete mode 100755 .github/scripts/release-alpha-pin-bindings.test.sh
 delete mode 100755 .github/scripts/release-alpha-resolve.sh
 delete mode 100755 .github/scripts/release-alpha-resolve.test.sh
 delete mode 100755 .github/scripts/release-alpha-verify-commit-signature.sh
 delete mode 100755 .github/scripts/release-alpha-verify-commit-signature.test.sh
 delete mode 100644 .github/scripts/release-typescript-workflow.test.sh
 delete mode 100644 .github/workflows/release-alpha.yml
 delete mode 100644 .github/workflows/release-eql.yml
 delete mode 100644 .github/workflows/release-typescript.yml
 delete mode 100755 tasks/release/all.sh
 delete mode 100755 tasks/release/bindings.sh
 delete mode 100755 tasks/release/eql.sh
 delete mode 100755 tasks/release/pin-bindings.sh
 delete mode 100755 tasks/release/resolve-alpha.sh
 delete mode 100755 tasks/release/rust.sh
 delete mode 100755 tasks/release/typescript.sh

diff --git a/.changeset/config.json b/.changeset/config.json
index edef2ebc1..428ac5988 100644
--- a/.changeset/config.json
+++ b/.changeset/config.json
@@ -4,7 +4,7 @@
   "commit": false,
   "fixed": [],
   "linked": [],
-  "access": "restricted",
+  "access": "public",
   "baseBranch": "main",
   "updateInternalDependencies": "patch",
   "ignore": []
diff --git a/.github/scripts/derive-identity.sh b/.github/scripts/derive-identity.sh
deleted file mode 100755
index 6b325a8bc..000000000
--- a/.github/scripts/derive-identity.sh
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env bash
-# Identity derivation for release-alpha.yml. The git seams are overridable by
-# derive-identity.test.sh so this logic can be tested without a repository.
-set -euo pipefail
-
-list_tags() { git tag --list "$1"; }
-
-tag_exists() { git rev-parse -q --verify "refs/tags/$1" >/dev/null; }
-
-matching_suffixes() {
-  local prefix="$1" esc
-  esc="${prefix//./\\.}"
-  list_tags "${prefix}*" \
-    | sed -n "s/^${esc}\([0-9]\{1,\}\)$/\1/p"
-}
-
-highest_n() {
-  local prefix="$1"
-  matching_suffixes "$prefix" \
-    | sort -n \
-    | tail -1
-}
-
-derive_identity() {
-  local target="$1" version="$2" channel="$3" pre="$4"
-  local sql_prefix="eql-${version}-${channel}."
-  local rust_prefix="eql-bindings-v${version}-${channel}."
-  local typescript_prefix="eql-typescript-v${version}-${channel}."
-
-  if [[ -n "$pre" ]]; then
-    printf '%s\n' "$pre"
-    return 0
-  fi
-
-  case "$target" in
-    all|eql)
-      # Fresh identity = one past the highest N across ALL tag namespaces
-      # (SQL, Rust, TypeScript) so a new release never reuses an N that any
-      # language package already claimed.
-      local sql_n rust_n typescript_n n
-      sql_n=$(highest_n "$sql_prefix"); sql_n=${sql_n:-0}
-      rust_n=$(highest_n "$rust_prefix"); rust_n=${rust_n:-0}
-      typescript_n=$(highest_n "$typescript_prefix"); typescript_n=${typescript_n:-0}
-      n=$((10#$sql_n))
-      if (( 10#$rust_n > n )); then n=$((10#$rust_n)); fi
-      if (( 10#$typescript_n > n )); then n=$((10#$typescript_n)); fi
-      printf '%s\n' "${version}-${channel}.$((n + 1))"
-      ;;
-    rust)
-      # Newest SQL release still missing a Rust binding tag.
-      local found n
-      found=""
-      for n in $(matching_suffixes "$sql_prefix" | sort -rn); do
-        if ! tag_exists "${rust_prefix}${n}"; then found="$n"; break; fi
-      done
-      [[ -n "$found" ]] || { echo "error: no ${sql_prefix}N SQL release is awaiting a Rust binding publish" >&2; return 1; }
-      printf '%s\n' "${version}-${channel}.${found}"
-      ;;
-    typescript)
-      # Newest SQL release still missing a TypeScript binding tag.
-      local found n
-      found=""
-      for n in $(matching_suffixes "$sql_prefix" | sort -rn); do
-        if ! tag_exists "${typescript_prefix}${n}"; then found="$n"; break; fi
-      done
-      [[ -n "$found" ]] || { echo "error: no ${sql_prefix}N SQL release is awaiting a TypeScript binding publish" >&2; return 1; }
-      printf '%s\n' "${version}-${channel}.${found}"
-      ;;
-    bindings)
-      # Newest SQL release still missing ANY language binding tag.
-      local found n
-      found=""
-      for n in $(matching_suffixes "$sql_prefix" | sort -rn); do
-        if ! tag_exists "${rust_prefix}${n}" || ! tag_exists "${typescript_prefix}${n}"; then found="$n"; break; fi
-      done
-      [[ -n "$found" ]] || { echo "error: no ${sql_prefix}N SQL release is awaiting a language binding publish" >&2; return 1; }
-      printf '%s\n' "${version}-${channel}.${found}"
-      ;;
-    *)
-      echo "error: unknown target '$target'" >&2
-      return 1
-      ;;
-  esac
-}
-
-if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
-  derive_identity "$@"
-fi
diff --git a/.github/scripts/derive-identity.test.sh b/.github/scripts/derive-identity.test.sh
deleted file mode 100755
index 063cc2298..000000000
--- a/.github/scripts/derive-identity.test.sh
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env bash
-# Dependency-free unit test for derive_identity using a synthetic tag set.
-set -uo pipefail
-
-here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${here}/derive-identity.sh"
-
-FAKE_TAGS=()
-# shellcheck disable=SC2329
-list_tags() {
-  local glob="$1" t
-  (( ${#FAKE_TAGS[@]} )) || return 0
-  for t in "${FAKE_TAGS[@]}"; do
-    # shellcheck disable=SC2254
-    case "$t" in $glob) printf '%s\n' "$t" ;; esac
-  done
-}
-
-# shellcheck disable=SC2329
-tag_exists() {
-  local want="$1" t
-  (( ${#FAKE_TAGS[@]} )) || return 1
-  for t in "${FAKE_TAGS[@]}"; do
-    [[ "$t" == "$want" ]] && return 0
-  done
-  return 1
-}
-
-fail=0
-check() {
-  if [[ "$2" == "$3" ]]; then
-    echo "ok: $1"
-  else
-    echo "FAIL: $1 - got '$2' want '$3'"
-    fail=1
-  fi
-}
-
-FAKE_TAGS=()
-check "all: empty -> .1" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.1"
-
-FAKE_TAGS=(eql-3.0.0-alpha.5)
-check "all: sql .5 -> .6" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.6"
-
-FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.4)
-check "all: crate .4 wins (cross-namespace) -> .5" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.5"
-
-FAKE_TAGS=(eql-3.0.0-alpha.08)
-check "all: leading-zero sql suffix is base-10 -> .9" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.9"
-
-FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.4)
-check "bindings: latest sql lacking crate -> .5" "$(derive_identity bindings 3.0.0 alpha '')" "3.0.0-alpha.5"
-
-# bindings now means ALL language bindings: it only errors once every language
-# tag exists for the newest SQL release.
-FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5 eql-typescript-v3.0.0-alpha.5)
-if derive_identity bindings 3.0.0 alpha '' >/dev/null 2>&1; then
-  echo "FAIL: bindings should error when all language tags exist"
-  fail=1
-else
-  echo "ok: bindings errors when all language tags exist"
-fi
-
-# Fresh identity is one past the highest N across all three tag namespaces.
-FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.4 eql-typescript-v3.0.0-alpha.6)
-check "all derives after all namespaces" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.7"
-
-FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5)
-check "typescript finds sql lacking ts package" "$(derive_identity typescript 3.0.0 alpha '')" "3.0.0-alpha.5"
-
-FAKE_TAGS=(eql-3.0.0-alpha.5 eql-typescript-v3.0.0-alpha.5)
-check "rust finds sql lacking rust package" "$(derive_identity rust 3.0.0 alpha '')" "3.0.0-alpha.5"
-
-FAKE_TAGS=(eql-3.0.0-alpha.5 eql-bindings-v3.0.0-alpha.5)
-check "bindings finds sql lacking one language package" "$(derive_identity bindings 3.0.0 alpha '')" "3.0.0-alpha.5"
-
-check "pre passthrough" "$(derive_identity all 3.0.0 alpha 3.0.0-alpha.9)" "3.0.0-alpha.9"
-
-FAKE_TAGS=(eql-3.0.0-beta.7)
-check "all: beta.7 does not affect alpha -> .1" "$(derive_identity all 3.0.0 alpha '')" "3.0.0-alpha.1"
-
-exit "$fail"
diff --git a/.github/scripts/release-alpha-pin-bindings.sh b/.github/scripts/release-alpha-pin-bindings.sh
deleted file mode 100755
index d923c7567..000000000
--- a/.github/scripts/release-alpha-pin-bindings.sh
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/env bash
-# Pin eql-bindings to a prerelease identity, commit the metadata change, and
-# push the selected branch.
-set -euo pipefail
-
-release_alpha_pin_emit_commit_sha() {
-  local commit_sha="$1"
-  echo "commit_sha=${commit_sha}" | tee -a "${GITHUB_OUTPUT:-/dev/null}"
-}
-
-release_alpha_pin_push_target() {
-  if [[ -n "${GH_TOKEN:-}" && -n "${GITHUB_REPOSITORY:-}" ]]; then
-    printf 'https://github.com/%s.git\n' "$GITHUB_REPOSITORY"
-  else
-    printf 'origin\n'
-  fi
-}
-
-release_alpha_pin_push() {
-  local branch="$1" push_target
-  push_target="$(release_alpha_pin_push_target)"
-  if [[ -n "${GH_TOKEN:-}" && -n "${GITHUB_REPOSITORY:-}" ]]; then
-    git -c "http.https://github.com/.extraheader=AUTHORIZATION: bearer ${GH_TOKEN}" push "$push_target" "HEAD:${branch}"
-  else
-    git push "$push_target" "HEAD:${branch}"
-  fi
-}
-
-release_alpha_pin_bindings() {
-  local identity="$1" branch="$2" publish_rust="$3" publish_typescript="$4"
-  local commit_sha
-  local commit_args=()
-
-  if [[ "$publish_rust" == "true" ]]; then
-    release-plz set-version "eql-bindings@${identity}"
-  fi
-
-  if [[ "$publish_typescript" == "true" ]]; then
-    node -e "const fs=require('fs'); const p='packages/eql/package.json'; const j=JSON.parse(fs.readFileSync(p,'utf8')); j.version=process.argv[1]; fs.writeFileSync(p, JSON.stringify(j,null,2)+'\n')" "$identity"
-    pnpm install --lockfile-only
-  fi
-
-  if [[ "$publish_rust" == "true" || "$publish_typescript" == "true" ]]; then
-    mise run release:prepare_bindings_assets --version "$identity"
-  fi
-
-  if git diff --quiet && git diff --cached --quiet; then
-    echo "package versions already pinned to ${identity}; skipping commit/push"
-  else
-    git config user.name "github-actions[bot]"
-    git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
-    if [[ "$publish_rust" == "true" ]]; then
-      git add crates/eql-bindings/Cargo.toml crates/eql-bindings/CHANGELOG.md Cargo.lock crates/eql-bindings/sql
-    fi
-    if [[ "$publish_typescript" == "true" ]]; then
-      git add packages/eql/package.json pnpm-lock.yaml packages/eql/sql packages/eql/src/generated/release-manifest.ts
-    fi
-    if [[ "${RELEASE_ALPHA_COMMIT_SIGN:-true}" == "true" ]]; then
-      commit_args=(-S)
-    fi
-    git commit "${commit_args[@]}" -m "chore(release): pin language bindings to ${identity}"
-    release_alpha_pin_push "$branch"
-  fi
-
-  commit_sha="$(git rev-parse HEAD)"
-  release_alpha_pin_emit_commit_sha "$commit_sha"
-}
-
-if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
-  release_alpha_pin_bindings "${IDENTITY:?}" "${BRANCH:?}" "${PUBLISH_RUST:?}" "${PUBLISH_TYPESCRIPT:?}"
-fi
diff --git a/.github/scripts/release-alpha-pin-bindings.test.sh b/.github/scripts/release-alpha-pin-bindings.test.sh
deleted file mode 100755
index 2e6a2300e..000000000
--- a/.github/scripts/release-alpha-pin-bindings.test.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/usr/bin/env bash
-# Integration-style tests for release-alpha-pin-bindings.sh in a temp git repo.
-set -uo pipefail
-
-here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${here}/release-alpha-pin-bindings.sh"
-set +e
-
-fail=0
-
-setup_repo() {
-  tmp="$(mktemp -d)"
-  mkdir -p "$tmp/bin" "$tmp/repo/crates/eql-bindings" "$tmp/repo/packages/eql"
-  cat > "$tmp/bin/release-plz" <<'SCRIPT'
-#!/usr/bin/env bash
-set -euo pipefail
-echo "$*" >> "$RELEASE_PLZ_LOG"
-if [[ "${RELEASE_PLZ_TOUCH:-}" == "1" ]]; then
-  printf '[package]\nname = "eql-bindings"\nversion = "%s"\n' "${2#eql-bindings@}" > crates/eql-bindings/Cargo.toml
-fi
-SCRIPT
-  chmod +x "$tmp/bin/release-plz"
-  # Fake pnpm: the pin script runs `pnpm install --lockfile-only` for a
-  # TypeScript pin. Just record the call so we don't touch the network.
-  cat > "$tmp/bin/pnpm" <<'SCRIPT'
-#!/usr/bin/env bash
-set -euo pipefail
-echo "$*" >> "$PNPM_LOG"
-SCRIPT
-  chmod +x "$tmp/bin/pnpm"
-  # Fake mise: the pin script runs `mise run release:prepare_bindings_assets`.
-  # The real SQL-asset build is covered elsewhere; here we only need a no-op so
-  # the git commit/version-pin logic is what's under test.
-  cat > "$tmp/bin/mise" <<'SCRIPT'
-#!/usr/bin/env bash
-set -euo pipefail
-echo "$*" >> "$MISE_LOG"
-SCRIPT
-  chmod +x "$tmp/bin/mise"
-  (
-    cd "$tmp/repo" || exit 1
-    git init -q
-    git config user.email test@example.com
-    git config user.name "Release Test"
-    git config commit.gpgsign false
-    printf '[package]\nname = "eql-bindings"\nversion = "0.0.0"\n' > crates/eql-bindings/Cargo.toml
-    printf '# changelog\n' > crates/eql-bindings/CHANGELOG.md
-    printf '# lock\n' > Cargo.lock
-    # Asset directories the pin script `git add`s must exist to be added.
-    mkdir -p crates/eql-bindings/sql packages/eql/src/generated
-    printf -- '-- placeholder\n' > crates/eql-bindings/sql/cipherstash-encrypt.sql
-    mkdir -p packages/eql/sql
-    printf -- '-- placeholder\n' > packages/eql/sql/cipherstash-encrypt.sql
-    printf '{\n  "name": "@cipherstash/eql",\n  "version": "0.0.0"\n}\n' > packages/eql/package.json
-    printf 'lockfileVersion: "9.0"\n' > pnpm-lock.yaml
-    printf "export const releaseManifest = { eqlVersion: 'DEV' } as const\n" > packages/eql/src/generated/release-manifest.ts
-    git add -A
-    git commit -q -m initial
-    git branch -M test-branch
-    git init -q --bare "$tmp/origin.git"
-    git remote add origin "$tmp/origin.git"
-  )
-}
-
-check_noop() {
-  local before after output status
-  setup_repo
-  before="$(cd "$tmp/repo" && git rev-parse HEAD)"
-  output="$(
-    cd "$tmp/repo" || exit 1
-    set -euo pipefail
-    PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" MISE_LOG="$tmp/mise-log" PNPM_LOG="$tmp/pnpm-log" RELEASE_ALPHA_COMMIT_SIGN=false \
-      release_alpha_pin_bindings 3.0.0-alpha.1 test-branch true false 2>&1
-  )"
-  status=$?
-  after="$(cd "$tmp/repo" && git rev-parse HEAD)"
-  if [[ "$status" -eq 0 && "$before" == "$after" && "$output" == *"commit_sha=${before}"* && "$(cat "$tmp/log")" == "set-version eql-bindings@3.0.0-alpha.1" ]]; then
-    echo "ok: noop emits existing commit"
-  else
-    echo "FAIL: noop status=$status before=$before after=$after output='$output'"
-    fail=1
-  fi
-  rm -rf "$tmp"
-}
-
-check_commit() {
-  local before after subject output status version
-  setup_repo
-  before="$(cd "$tmp/repo" && git rev-parse HEAD)"
-  output="$(
-    cd "$tmp/repo" || exit 1
-    set -euo pipefail
-    PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" MISE_LOG="$tmp/mise-log" PNPM_LOG="$tmp/pnpm-log" RELEASE_PLZ_TOUCH=1 RELEASE_ALPHA_COMMIT_SIGN=false \
-      release_alpha_pin_bindings 3.0.0-alpha.2 test-branch true false 2>&1
-  )"
-  status=$?
-  after="$(cd "$tmp/repo" && git rev-parse HEAD)"
-  subject="$(cd "$tmp/repo" && git log -1 --format=%s)"
-  version="$(sed -n 's/^version = "\(.*\)"/\1/p' "$tmp/repo/crates/eql-bindings/Cargo.toml")"
-  if [[ "$status" -eq 0 && "$before" != "$after" && "$subject" == "chore(release): pin language bindings to 3.0.0-alpha.2" && "$version" == "3.0.0-alpha.2" && "$output" == *"commit_sha=${after}"* ]]; then
-    echo "ok: changed version commits and emits new commit"
-  else
-    echo "FAIL: commit status=$status before=$before after=$after subject='$subject' version='$version' output='$output'"
-    fail=1
-  fi
-  rm -rf "$tmp"
-}
-
-check_typescript_commit() {
-  local before after subject output status version
-  setup_repo
-  before="$(cd "$tmp/repo" && git rev-parse HEAD)"
-  output="$(
-    cd "$tmp/repo" || exit 1
-    set -euo pipefail
-    PATH="$tmp/bin:$PATH" RELEASE_PLZ_LOG="$tmp/log" MISE_LOG="$tmp/mise-log" PNPM_LOG="$tmp/pnpm-log" RELEASE_ALPHA_COMMIT_SIGN=false \
-      release_alpha_pin_bindings 3.0.0-alpha.3 test-branch false true 2>&1
-  )"
-  status=$?
-  after="$(cd "$tmp/repo" && git rev-parse HEAD)"
-  subject="$(cd "$tmp/repo" && git log -1 --format=%s)"
-  version="$(node -e "console.log(require('$tmp/repo/packages/eql/package.json').version)")"
-  if [[ "$status" -eq 0 && "$before" != "$after" && "$subject" == "chore(release): pin language bindings to 3.0.0-alpha.3" && "$version" == "3.0.0-alpha.3" ]]; then
-    echo "ok: typescript version commits"
-  else
-    echo "FAIL: typescript commit status=$status before=$before after=$after subject='$subject' version='$version' output='$output'"
-    fail=1
-  fi
-  rm -rf "$tmp"
-}
-
-check_push_target_keeps_token_out_of_url() {
-  local output
-  output="$(
-    GH_TOKEN=super-secret-token GITHUB_REPOSITORY=cipherstash/encrypt-query-language \
-      release_alpha_pin_push_target
-  )"
-  if [[ "$output" == "https://github.com/cipherstash/encrypt-query-language.git" && "$output" != *"super-secret-token"* ]]; then
-    echo "ok: authenticated push target keeps token out of URL"
-  else
-    echo "FAIL: push target exposed token or used unexpected URL: '$output'"
-    fail=1
-  fi
-}
-
-check_noop
-check_commit
-check_typescript_commit
-check_push_target_keeps_token_out_of_url
-
-exit "$fail"
diff --git a/.github/scripts/release-alpha-resolve.sh b/.github/scripts/release-alpha-resolve.sh
deleted file mode 100755
index 380d02879..000000000
--- a/.github/scripts/release-alpha-resolve.sh
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env bash
-# Resolve and validate release-alpha.yml identity/tag state.
-set -euo pipefail
-
-here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${here}/derive-identity.sh"
-
-git_head_sha() { git rev-parse HEAD; }
-
-tag_commit_sha() { git rev-parse "refs/tags/$1^{commit}"; }
-
-release_alpha_error() {
-  echo "::error::$*" >&2
-}
-
-release_alpha_emit_outputs() {
-  local identity="$1" sql_tag="$2" rust_tag="$3" typescript_tag="$4" publish_rust="$5" publish_typescript="$6"
-  {
-    echo "identity=${identity}"
-    echo "sql_tag=${sql_tag}"
-    echo "rust_tag=${rust_tag}"
-    echo "typescript_tag=${typescript_tag}"
-    echo "publish_rust=${publish_rust}"
-    echo "publish_typescript=${publish_typescript}"
-  } | tee -a "${GITHUB_OUTPUT:-/dev/null}"
-}
-
-release_alpha_resolve() {
-  local target="$1" version="$2" channel="$3" pre="$4" ref_type="$5" ref_name="$6"
-  local identity sql_tag rust_tag typescript_tag head_sha tag_sha
-  local publish_rust=false publish_typescript=false
-
-  case "$channel" in
-    alpha|beta|rc) ;;
-    *) release_alpha_error "invalid channel '$channel'"; return 1 ;;
-  esac
-
-  case "$target" in
-    all|eql|bindings|rust|typescript) ;;
-    *) release_alpha_error "invalid target '$target'"; return 1 ;;
-  esac
-
-  if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
-    release_alpha_error "invalid version '$version' (expected X.Y.Z)"
-    return 1
-  fi
-
-  if [[ -n "$pre" && ! "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]]; then
-    release_alpha_error "invalid pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
-    return 1
-  fi
-
-  if [[ -n "$pre" && "$pre" != "${version}-${channel}."* ]]; then
-    release_alpha_error "pre '$pre' does not match version '${version}' and channel '${channel}'"
-    return 1
-  fi
-
-  if [[ "$target" == "all" || "$target" == "bindings" || "$target" == "rust" || "$target" == "typescript" ]]; then
-    if [[ "$ref_type" != "branch" ]]; then
-      release_alpha_error "target=${target} pins+pushes package versions and requires a branch ref; got ${ref_type} '${ref_name}'. Dispatch with --ref ."
-      return 1
-    fi
-  fi
-
-  identity="$(derive_identity "$target" "$version" "$channel" "$pre")"
-  sql_tag="eql-${identity}"
-  rust_tag="eql-bindings-v${identity}"
-  typescript_tag="eql-typescript-v${identity}"
-
-  case "$target" in
-    all|bindings|rust) if ! tag_exists "$rust_tag"; then publish_rust=true; fi ;;
-  esac
-  case "$target" in
-    all|bindings|typescript) if ! tag_exists "$typescript_tag"; then publish_typescript=true; fi ;;
-  esac
-
-  case "$target" in
-    all)
-      if tag_exists "$sql_tag"; then release_alpha_error "${sql_tag} already exists"; return 1; fi
-      if tag_exists "$rust_tag"; then release_alpha_error "${rust_tag} already exists"; return 1; fi
-      if tag_exists "$typescript_tag"; then release_alpha_error "${typescript_tag} already exists"; return 1; fi
-      ;;
-    eql)
-      if tag_exists "$sql_tag"; then release_alpha_error "${sql_tag} already exists"; return 1; fi
-      ;;
-    bindings|rust|typescript)
-      if ! tag_exists "$sql_tag"; then
-        release_alpha_error "${sql_tag} SQL release must exist before publishing language bindings"
-        return 1
-      fi
-      head_sha="$(git_head_sha)"
-      tag_sha="$(tag_commit_sha "$sql_tag")"
-      if [[ "$head_sha" != "$tag_sha" ]]; then
-        release_alpha_error "branch HEAD (${head_sha}) has advanced past ${sql_tag} (${tag_sha}); use target=all for a fresh identity"
-        return 1
-      fi
-      ;;
-  esac
-
-  if [[ "$target" != "eql" && "$publish_rust" == false && "$publish_typescript" == false ]]; then
-    release_alpha_error "all requested language binding tags already exist for ${identity}"
-    return 1
-  fi
-
-  release_alpha_emit_outputs "$identity" "$sql_tag" "$rust_tag" "$typescript_tag" "$publish_rust" "$publish_typescript"
-}
-
-if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
-  release_alpha_resolve "${TARGET:?}" "${VERSION:?}" "${CHANNEL:?}" "${PRE:-}" "${REF_TYPE:?}" "${REF_NAME:?}"
-fi
diff --git a/.github/scripts/release-alpha-resolve.test.sh b/.github/scripts/release-alpha-resolve.test.sh
deleted file mode 100755
index d1f577e3a..000000000
--- a/.github/scripts/release-alpha-resolve.test.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/usr/bin/env bash
-# Dependency-free unit tests for release-alpha-resolve.sh using synthetic tags
-# and commit ids.
-set -uo pipefail
-
-here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${here}/release-alpha-resolve.sh"
-set +e
-
-FAKE_TAGS=()
-FAKE_HEAD_SHA="head"
-FAKE_TAG_SHA="head"
-
-# shellcheck disable=SC2329
-list_tags() {
-  local glob="$1" t
-  (( ${#FAKE_TAGS[@]} )) || return 0
-  for t in "${FAKE_TAGS[@]}"; do
-    # shellcheck disable=SC2254
-    case "$t" in $glob) printf '%s\n' "$t" ;; esac
-  done
-}
-
-# shellcheck disable=SC2329
-tag_exists() {
-  local want="$1" t
-  (( ${#FAKE_TAGS[@]} )) || return 1
-  for t in "${FAKE_TAGS[@]}"; do
-    [[ "$t" == "$want" ]] && return 0
-  done
-  return 1
-}
-
-# shellcheck disable=SC2329
-git_head_sha() { printf '%s\n' "$FAKE_HEAD_SHA"; }
-
-# shellcheck disable=SC2329
-tag_commit_sha() { printf '%s\n' "$FAKE_TAG_SHA"; }
-
-fail=0
-
-check_ok() {
-  local name="$1" want="$2" got status
-  shift 2
-  got="$("$@" 2>/tmp/release-alpha-resolve-test.err)"
-  status=$?
-  if [[ "$status" -eq 0 && "$got" == "$want" ]]; then
-    echo "ok: $name"
-  else
-    echo "FAIL: $name - status=$status got '$got' want '$want'"
-    cat /tmp/release-alpha-resolve-test.err
-    fail=1
-  fi
-}
-
-check_fail() {
-  local name="$1" needle="$2" got status
-  shift 2
-  got="$("$@" 2>&1)"
-  status=$?
-  if [[ "$status" -ne 0 && "$got" == *"$needle"* ]]; then
-    echo "ok: $name"
-  else
-    echo "FAIL: $name - status=$status output '$got' missing '$needle'"
-    fail=1
-  fi
-}
-
-FAKE_TAGS=()
-check_ok "all emits identity, all tags, publish true/true" \
-  $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\nrust_tag=eql-bindings-v3.0.0-alpha.1\ntypescript_tag=eql-typescript-v3.0.0-alpha.1\npublish_rust=true\npublish_typescript=true' \
-  release_alpha_resolve all 3.0.0 alpha "" branch eql_v3
-
-check_fail "rejects invalid target" "invalid target 'bad'" \
-  release_alpha_resolve bad 3.0.0 alpha "" branch eql_v3
-
-check_fail "rejects invalid channel" "invalid channel 'preview'" \
-  release_alpha_resolve all 3.0.0 preview "" branch eql_v3
-
-check_fail "rejects invalid version" "invalid version '3.0'" \
-  release_alpha_resolve all 3.0 alpha "" branch eql_v3
-
-check_fail "rejects invalid pre" "invalid pre '3.0.0-alpha'" \
-  release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha branch eql_v3
-
-check_fail "rejects pre with mismatched version" "does not match version '3.0.0' and channel 'alpha'" \
-  release_alpha_resolve all 3.0.0 alpha 3.1.0-alpha.1 branch eql_v3
-
-check_fail "rejects pre with mismatched channel" "does not match version '3.0.0' and channel 'alpha'" \
-  release_alpha_resolve all 3.0.0 alpha 3.0.0-beta.1 branch eql_v3
-
-check_fail "all requires branch ref" "requires a branch ref" \
-  release_alpha_resolve all 3.0.0 alpha "" tag v3.0.0
-
-FAKE_TAGS=(eql-3.0.0-alpha.1)
-check_fail "eql rejects existing sql tag" "eql-3.0.0-alpha.1 already exists" \
-  release_alpha_resolve eql 3.0.0 alpha 3.0.0-alpha.1 tag eql-3.0.0-alpha.1
-
-FAKE_TAGS=()
-check_ok "eql accepts tag ref without branch, publish false/false" \
-  $'identity=3.0.0-alpha.1\nsql_tag=eql-3.0.0-alpha.1\nrust_tag=eql-bindings-v3.0.0-alpha.1\ntypescript_tag=eql-typescript-v3.0.0-alpha.1\npublish_rust=false\npublish_typescript=false' \
-  release_alpha_resolve eql 3.0.0 alpha "" tag eql-3.0.0-alpha.1
-
-FAKE_TAGS=(eql-3.0.0-alpha.2)
-check_fail "all rejects existing sql tag with explicit pre" "eql-3.0.0-alpha.2 already exists" \
-  release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_TAGS=(eql-bindings-v3.0.0-alpha.2)
-check_fail "all rejects existing rust tag with explicit pre" "eql-bindings-v3.0.0-alpha.2 already exists" \
-  release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_TAGS=(eql-typescript-v3.0.0-alpha.2)
-check_fail "all rejects existing typescript tag with explicit pre" "eql-typescript-v3.0.0-alpha.2 already exists" \
-  release_alpha_resolve all 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_TAGS=()
-check_fail "bindings rejects missing sql tag" "SQL release must exist before publishing language bindings" \
-  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_TAGS=()
-check_fail "rust rejects missing sql tag" "SQL release must exist before publishing language bindings" \
-  release_alpha_resolve rust 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_TAGS=()
-check_fail "typescript rejects missing sql tag" "SQL release must exist before publishing language bindings" \
-  release_alpha_resolve typescript 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_HEAD_SHA="head"
-FAKE_TAG_SHA="head"
-FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.2)
-check_ok "bindings publishes only TypeScript when Rust tag exists" \
-  $'identity=3.0.0-alpha.2\nsql_tag=eql-3.0.0-alpha.2\nrust_tag=eql-bindings-v3.0.0-alpha.2\ntypescript_tag=eql-typescript-v3.0.0-alpha.2\npublish_rust=false\npublish_typescript=true' \
-  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_TAGS=(eql-3.0.0-alpha.2 eql-bindings-v3.0.0-alpha.2 eql-typescript-v3.0.0-alpha.2)
-check_fail "bindings rejects when both language tags exist" "all requested language binding tags already exist" \
-  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_TAGS=(eql-3.0.0-alpha.2)
-FAKE_HEAD_SHA="newer"
-FAKE_TAG_SHA="released"
-check_fail "bindings rejects advanced branch" "branch HEAD (newer) has advanced past eql-3.0.0-alpha.2 (released)" \
-  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-FAKE_HEAD_SHA="released"
-FAKE_TAG_SHA="released"
-check_ok "bindings accepts same-source sql tag, publish true/true" \
-  $'identity=3.0.0-alpha.2\nsql_tag=eql-3.0.0-alpha.2\nrust_tag=eql-bindings-v3.0.0-alpha.2\ntypescript_tag=eql-typescript-v3.0.0-alpha.2\npublish_rust=true\npublish_typescript=true' \
-  release_alpha_resolve bindings 3.0.0 alpha 3.0.0-alpha.2 branch eql_v3
-
-exit "$fail"
diff --git a/.github/scripts/release-alpha-verify-commit-signature.sh b/.github/scripts/release-alpha-verify-commit-signature.sh
deleted file mode 100755
index dd61d33e2..000000000
--- a/.github/scripts/release-alpha-verify-commit-signature.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-# Verify that GitHub accepts a pushed commit's signature as valid.
-set -euo pipefail
-
-release_alpha_verify_commit_signature() {
-  local commit_sha="$1" repo verification verified reason
-  repo="${GITHUB_REPOSITORY:?}"
-
-  verification="$(
-    gh api "repos/${repo}/commits/${commit_sha}" \
-      --jq '.commit.verification | "\(.verified) \(.reason)"'
-  )"
-  read -r verified reason <<< "$verification"
-
-  if [[ "$verified" != "true" || "$reason" != "valid" ]]; then
-    echo "error: commit ${commit_sha} is not GitHub-verified (verified=${verified:-} reason=${reason:-})" >&2
-    return 1
-  fi
-
-  echo "GitHub verified signed commit ${commit_sha} (${reason})"
-}
-
-if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
-  release_alpha_verify_commit_signature "${1:?commit sha required}"
-fi
diff --git a/.github/scripts/release-alpha-verify-commit-signature.test.sh b/.github/scripts/release-alpha-verify-commit-signature.test.sh
deleted file mode 100755
index 73288089d..000000000
--- a/.github/scripts/release-alpha-verify-commit-signature.test.sh
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/env bash
-# Tests for release-alpha-verify-commit-signature.sh with a stubbed gh CLI.
-set -uo pipefail
-
-here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-# shellcheck source=/dev/null
-source "${here}/release-alpha-verify-commit-signature.sh"
-set +e
-
-fail=0
-
-setup_gh() {
-  tmp="$(mktemp -d)"
-  mkdir -p "$tmp/bin"
-  cat > "$tmp/bin/gh" <<'SCRIPT'
-#!/usr/bin/env bash
-set -euo pipefail
-echo "$*" >> "$GH_STUB_LOG"
-printf '%s %s\n' "${GH_VERIFIED:-true}" "${GH_REASON:-valid}"
-SCRIPT
-  chmod +x "$tmp/bin/gh"
-}
-
-check_valid_signature() {
-  local output status
-  setup_gh
-  output="$(
-    PATH="$tmp/bin:$PATH" GH_STUB_LOG="$tmp/log" GITHUB_REPOSITORY=cipherstash/encrypt-query-language \
-      release_alpha_verify_commit_signature abc123 2>&1
-  )"
-  status=$?
-  if [[ "$status" -eq 0 && "$output" == *"GitHub verified signed commit abc123 (valid)"* && "$(cat "$tmp/log")" == *"repos/cipherstash/encrypt-query-language/commits/abc123"* ]]; then
-    echo "ok: valid GitHub verification passes"
-  else
-    echo "FAIL: valid signature status=$status output='$output' log='$(cat "$tmp/log" 2>/dev/null)'"
-    fail=1
-  fi
-  rm -rf "$tmp"
-}
-
-check_unverified_signature_fails() {
-  local output status
-  setup_gh
-  output="$(
-    PATH="$tmp/bin:$PATH" GH_STUB_LOG="$tmp/log" GITHUB_REPOSITORY=cipherstash/encrypt-query-language \
-      GH_VERIFIED=false GH_REASON=unknown_key \
-      release_alpha_verify_commit_signature abc123 2>&1
-  )"
-  status=$?
-  if [[ "$status" -ne 0 && "$output" == *"not GitHub-verified"* && "$output" == *"reason=unknown_key"* ]]; then
-    echo "ok: unverified GitHub signature fails"
-  else
-    echo "FAIL: unverified signature status=$status output='$output'"
-    fail=1
-  fi
-  rm -rf "$tmp"
-}
-
-check_non_valid_reason_fails() {
-  local output status
-  setup_gh
-  output="$(
-    PATH="$tmp/bin:$PATH" GH_STUB_LOG="$tmp/log" GITHUB_REPOSITORY=cipherstash/encrypt-query-language \
-      GH_VERIFIED=true GH_REASON=unverified_email \
-      release_alpha_verify_commit_signature abc123 2>&1
-  )"
-  status=$?
-  if [[ "$status" -ne 0 && "$output" == *"not GitHub-verified"* && "$output" == *"reason=unverified_email"* ]]; then
-    echo "ok: non-valid GitHub verification reason fails"
-  else
-    echo "FAIL: non-valid reason status=$status output='$output'"
-    fail=1
-  fi
-  rm -rf "$tmp"
-}
-
-check_valid_signature
-check_unverified_signature_fails
-check_non_valid_reason_fails
-
-exit "$fail"
diff --git a/.github/scripts/release-typescript-workflow.test.sh b/.github/scripts/release-typescript-workflow.test.sh
deleted file mode 100644
index 914a429ec..000000000
--- a/.github/scripts/release-typescript-workflow.test.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env bash
-# Regression guard for the security hardening of
-# .github/workflows/release-typescript.yml. These are structural invariants —
-# they pin the fixes for the code-review findings so they cannot silently
-# regress. Dependency-free; no network, no Actions runner needed.
-set -uo pipefail
-
-here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-wf="${here}/../workflows/release-typescript.yml"
-
-fail=0
-pass() { echo "ok: $1"; }
-fault() { echo "FAIL: $1"; fail=1; }
-
-[[ -f "$wf" ]] || { echo "FAIL: workflow not found at $wf"; exit 1; }
-
-# --- F1: no command injection via workflow inputs ---------------------------
-# `${{ inputs.* }}` must ONLY appear as an `env:` entry (`NAME: ${{ inputs.x }}`),
-# never interpolated into a `run:` script body (GitHub expands the expression
-# into the script text before bash runs → arbitrary command execution).
-offenders="$(grep -nE '\$\{\{ *inputs\.' "$wf" \
-  | grep -vE '^[0-9]+:[[:space:]]*[A-Za-z_][A-Za-z0-9_]*: \$\{\{ inputs\.[a-z_]+ \}\}$' \
-  || true)"
-if [[ -z "$offenders" ]]; then
-  pass "F1: workflow inputs are only surfaced via env:, never in run: bodies"
-else
-  fault "F1: inputs.* interpolated into a run: body (injection risk):"
-  echo "$offenders"
-fi
-
-# --- F3: checkout must not persist git credentials --------------------------
-if grep -qE 'persist-credentials: false' "$wf"; then
-  pass "F3: checkout sets persist-credentials: false"
-else
-  fault "F3: checkout is missing persist-credentials: false"
-fi
-
-# --- F3: the tag push must be authenticated (extraheader), not bare origin --
-if grep -qE 'extraheader=AUTHORIZATION' "$wf"; then
-  pass "F3: tag push authenticates via git extraheader"
-else
-  fault "F3: authenticated push pattern (extraheader) missing"
-fi
-if grep -qE 'git push origin "refs/tags' "$wf"; then
-  fault "F3: bare 'git push origin' remains (unauthenticated once creds are not persisted)"
-else
-  pass "F3: no bare 'git push origin' tag push"
-fi
-
-# --- F2: publish and tag must be retry-safe (idempotent) --------------------
-if grep -qE 'npm view' "$wf"; then
-  pass "F2: publish is idempotent (npm view existence guard)"
-else
-  fault "F2: idempotent publish guard (npm view) missing"
-fi
-if grep -qE 'ls-remote' "$wf"; then
-  pass "F2: tag creation is idempotent (ls-remote existence guard)"
-else
-  fault "F2: idempotent tag guard (ls-remote) missing"
-fi
-
-exit "$fail"
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 983006410..608df3cad 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -18,8 +18,7 @@ actually runs).
 | Workflow | Triggers | What it does | Gates merge? |
 |---|---|---|---|
 | **test-eql.yml** | `pull_request`, `merge_group`, `workflow_dispatch` | Full test/lint/validate matrix; the one required check | **Yes** — `ci-required` |
-| **release-eql.yml** | `release: published`, `pull_request` (paths), `workflow_dispatch` | Build release SQL + docs; PR runs everything **but** the publish step | No |
-| **release-postgres-eql-image.yml** | `release: published`, `workflow_dispatch` | Build & push the Postgres+EQL Docker image to GHCR | No |
+| **release-postgres-eql-image.yml** | `workflow_dispatch` (dispatched by `release.yml` on production finals) | Build & push the Postgres+EQL Docker image to GHCR | No |
 | **release.yml** | `push: main`, `push: eql_v3`, `workflow_dispatch` | Unified release entrypoint: production on `main`, prerelease on `eql_v3` when the commit is an explicit `chore(release): ...` marker | No |
 | **release-plz.yml** | `push: main`, `workflow_dispatch` | Publish the `eql-bindings` crate to crates.io (Trusted Publishing) + open the release PR | No |
 | **bench-eql.yml** | `push: main` (paths), `schedule` 02:00 UTC daily, `workflow_dispatch` | `test:bench` (bench cargo feature). **Never runs on PRs** | No |
@@ -34,8 +33,9 @@ snapshots surface on the nightly schedule, not on the PR that caused them.
 There are two independent release flows keyed on distinct git tags:
 
 - **`eql-`** (e.g. `eql-3.0.0`) — the EQL **SQL surface** release, cut
-  manually as a GitHub Release. Drives `release-eql.yml`,
-  `release-postgres-eql-image.yml`, and `rebuild-docs.yml`.
+  by `release.yml` (production on `main`, prerelease on `eql_v3`), which builds
+  and attaches the SQL + docs in-run. On production finals `release.yml` also
+  dispatches `release-postgres-eql-image.yml` (the Postgres+EQL Docker image).
 - **`eql-bindings-v`** (e.g. `eql-bindings-v0.1.0`) — the **`eql-bindings`
   Rust crate** release, cut automatically by `release-plz.yml` when its release
   PR merges. Publishes to crates.io only.
diff --git a/.github/workflows/_build-docs.yml b/.github/workflows/_build-docs.yml
index a07cd982e..8a30f98ad 100644
--- a/.github/workflows/_build-docs.yml
+++ b/.github/workflows/_build-docs.yml
@@ -1,8 +1,8 @@
 name: "Build docs (reusable)"
 
-# Reusable docs build+attach, extracted from release-eql.yml's publish-docs job.
-# The target release already exists: _build-sql.yml creates it for alphas, and
-# a human-created release exists for finals.
+# Reusable docs build+attach. Called inline by release.yml (production and
+# prerelease paths). The target release already exists: _build-sql.yml creates
+# it in the same run before this docs job attaches to it.
 
 on:
   workflow_call:
diff --git a/.github/workflows/_build-sql.yml b/.github/workflows/_build-sql.yml
index 44bb0c4d5..cb26c52e7 100644
--- a/.github/workflows/_build-sql.yml
+++ b/.github/workflows/_build-sql.yml
@@ -1,8 +1,7 @@
 name: "Build SQL (reusable)"
 
-# Reusable SQL build+attach, extracted from release-eql.yml's build-and-publish
-# job. Called inline by release-alpha.yml and release-eql.yml so SQL releases
-# have one build path.
+# Reusable SQL build+attach. Called inline by release.yml (production and
+# prerelease paths) so SQL releases have one build path.
 
 on:
   workflow_call:
@@ -104,7 +103,11 @@ jobs:
             release/cipherstash-encrypt-uninstall.sql
 
       - name: Notify Multitudes
-        if: ${{ github.event_name == 'release' }}
+        # Production deploy tracking: fire only when release.yml creates a
+        # non-prerelease SQL release (attach + create path + not a prerelease).
+        # release.yml runs on `push`, so the old `event_name == 'release'` gate
+        # never matched under the unified workflow.
+        if: ${{ inputs.attach && !inputs.prerelease && inputs.target_commitish != '' }}
         run: |
           curl --request POST \
             --fail-with-body \
diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml
index 2085cdb57..250fd6a8e 100644
--- a/.github/workflows/lint-release.yml
+++ b/.github/workflows/lint-release.yml
@@ -1,21 +1,17 @@
 name: "Lint release tooling"
 
-# Durable gate for the CI-native release machinery. It catches workflow syntax,
-# wrapper shell issues, and identity-derivation regressions before a real alpha.
+# Durable gate for the release machinery. It catches workflow syntax, wrapper
+# shell issues, and supply-chain cache regressions before a real release.
 
 on:
   pull_request:
     paths:
       - .github/workflows/_build-sql.yml
       - .github/workflows/_build-docs.yml
-      - .github/workflows/release-eql.yml
       - .github/workflows/release-plz.yml
       - .github/workflows/release.yml
-      - .github/workflows/release-typescript.yml
-      - .github/workflows/release-alpha.yml
       - .github/workflows/lint-release.yml
       - .github/actionlint.yaml
-      - .github/scripts/*.sh
       - package.json
       - scripts/*.mjs
       - tasks/release/*.sh
@@ -50,49 +46,15 @@ jobs:
           actionlint \
             .github/workflows/_build-sql.yml \
             .github/workflows/_build-docs.yml \
-            .github/workflows/release-eql.yml \
             .github/workflows/release-plz.yml \
             .github/workflows/release.yml \
-            .github/workflows/release-typescript.yml \
-            .github/workflows/release-alpha.yml \
             .github/workflows/lint-release.yml
 
       - name: shellcheck (wrappers + helpers)
         run: |
           set -euo pipefail
           shellcheck \
-            tasks/release/all.sh \
-            tasks/release/eql.sh \
-            tasks/release/bindings.sh \
-            tasks/release/rust.sh \
-            tasks/release/typescript.sh \
-            tasks/release/prepare-bindings-assets.sh \
-            tasks/release/resolve-alpha.sh \
-            tasks/release/pin-bindings.sh \
-            .github/scripts/derive-identity.sh \
-            .github/scripts/derive-identity.test.sh \
-            .github/scripts/release-alpha-resolve.sh \
-            .github/scripts/release-alpha-resolve.test.sh \
-            .github/scripts/release-alpha-pin-bindings.sh \
-            .github/scripts/release-alpha-pin-bindings.test.sh \
-            .github/scripts/release-alpha-verify-commit-signature.sh \
-            .github/scripts/release-alpha-verify-commit-signature.test.sh \
-            .github/scripts/release-typescript-workflow.test.sh
-
-      - name: identity-derivation unit test
-        run: bash .github/scripts/derive-identity.test.sh
-
-      - name: release-alpha resolve unit test
-        run: bash .github/scripts/release-alpha-resolve.test.sh
-
-      - name: release-alpha pin helper test
-        run: bash .github/scripts/release-alpha-pin-bindings.test.sh
-
-      - name: release-alpha signature verification helper test
-        run: bash .github/scripts/release-alpha-verify-commit-signature.test.sh
-
-      - name: release-typescript workflow security guard test
-        run: bash .github/scripts/release-typescript-workflow.test.sh
+            tasks/release/prepare-bindings-assets.sh
 
       - uses: pnpm/action-setup@v6.0.8
         name: Install pnpm
diff --git a/.github/workflows/release-alpha.yml b/.github/workflows/release-alpha.yml
deleted file mode 100644
index 9e91d742a..000000000
--- a/.github/workflows/release-alpha.yml
+++ /dev/null
@@ -1,339 +0,0 @@
-name: "Release alpha (coordinator)"
-
-# CI-native prerelease coordinator for the EQL SQL surface and eql-bindings
-# crate. SQL and docs build in this run; crate publishing is dispatched to
-# release-plz.yml so crates.io Trusted Publishing sees the expected workflow.
-
-on:
-  workflow_dispatch:
-    inputs:
-      target:
-        description: "all | eql | bindings | rust | typescript"
-        required: true
-        type: choice
-        options: [all, eql, bindings, rust, typescript]
-        default: all
-      version:
-        description: "Base SemVer, e.g. 3.0.0"
-        required: false
-        type: string
-        default: "3.0.0"
-      channel:
-        description: "alpha | beta | rc"
-        required: false
-        type: choice
-        options: [alpha, beta, rc]
-        default: alpha
-      pre:
-        description: "Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation"
-        required: false
-        type: string
-        default: ""
-      dry_run:
-        description: "Resolve + verify + print plan; mutate nothing"
-        required: false
-        type: boolean
-        default: false
-      dispatch_id:
-        description: "Client-generated correlation id. Leave blank for manual dispatch."
-        required: false
-        type: string
-        default: ""
-
-run-name: >-
-  release-alpha ${{ inputs.target }} ${{ inputs.pre != '' && inputs.pre || format('{0}-{1}', inputs.version, inputs.channel) }}${{ inputs.dry_run && ' [dry-run]' || '' }} [${{ inputs.dispatch_id }}]
-
-permissions:
-  contents: read
-
-concurrency:
-  group: release-alpha
-  cancel-in-progress: false
-
-env:
-  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
-  MISE_VERBOSE: "1"
-
-defaults:
-  run:
-    shell: bash {0}
-
-jobs:
-  resolve:
-    name: Resolve identity + verify
-    runs-on: blacksmith-16vcpu-ubuntu-2204
-    timeout-minutes: 15
-    outputs:
-      identity: ${{ steps.derive.outputs.identity }}
-      sql_tag: ${{ steps.derive.outputs.sql_tag }}
-      rust_tag: ${{ steps.derive.outputs.rust_tag }}
-      typescript_tag: ${{ steps.derive.outputs.typescript_tag }}
-      publish_rust: ${{ steps.derive.outputs.publish_rust }}
-      publish_typescript: ${{ steps.derive.outputs.publish_typescript }}
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          persist-credentials: false
-          fetch-depth: 0
-
-      - name: Fetch all tags
-        run: git fetch --tags --force
-
-      - name: Resolve identity + guards
-        id: derive
-        env:
-          TARGET: ${{ inputs.target }}
-          VERSION: ${{ inputs.version }}
-          CHANNEL: ${{ inputs.channel }}
-          PRE: ${{ inputs.pre }}
-          REF_TYPE: ${{ github.ref_type }}
-          REF_NAME: ${{ github.ref_name }}
-        run: .github/scripts/release-alpha-resolve.sh
-
-      - uses: jdx/mise-action@v3
-        with:
-          version: 2026.4.0
-          install: true
-          cache: true
-
-      - name: Verify drift gates (types:check + codegen:parity)
-        run: |
-          set -euo pipefail
-          mise run types:check
-          mise run codegen:parity
-
-      - name: Print plan
-        env:
-          TARGET: ${{ inputs.target }}
-          DRY: ${{ inputs.dry_run }}
-          IDENTITY: ${{ steps.derive.outputs.identity }}
-          SQL_TAG: ${{ steps.derive.outputs.sql_tag }}
-          RUST_TAG: ${{ steps.derive.outputs.rust_tag }}
-          TYPESCRIPT_TAG: ${{ steps.derive.outputs.typescript_tag }}
-          PUBLISH_RUST: ${{ steps.derive.outputs.publish_rust }}
-          PUBLISH_TYPESCRIPT: ${{ steps.derive.outputs.publish_typescript }}
-          REF_NAME: ${{ github.ref_name }}
-          SHA: ${{ github.sha }}
-        run: |
-          set -euo pipefail
-          {
-            echo "## Release plan"
-            echo ""
-            echo "| field | value |"
-            echo "|---|---|"
-            echo "| target | ${TARGET} |"
-            echo "| identity | ${IDENTITY} |"
-            echo "| sql_tag | ${SQL_TAG} |"
-            echo "| rust_tag | ${RUST_TAG} (publish=${PUBLISH_RUST}) |"
-            echo "| typescript_tag | ${TYPESCRIPT_TAG} (publish=${PUBLISH_TYPESCRIPT}) |"
-            echo "| ref | ${REF_NAME} @ ${SHA} |"
-            echo "| dry_run | ${DRY} |"
-          } >> "$GITHUB_STEP_SUMMARY"
-
-  pin:
-    name: Pin package versions (commit S)
-    runs-on: blacksmith-16vcpu-ubuntu-2204
-    needs: resolve
-    if: ${{ !inputs.dry_run && (inputs.target == 'all' || inputs.target == 'bindings' || inputs.target == 'rust' || inputs.target == 'typescript') }}
-    permissions:
-      contents: write
-    timeout-minutes: 15
-    outputs:
-      commit_sha: ${{ steps.commit.outputs.commit_sha }}
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          persist-credentials: false
-          # Pin from the dispatch SHA that resolve validated. Pushing HEAD back
-          # to the branch will fail if the branch advanced meanwhile.
-          ref: ${{ github.sha }}
-          fetch-depth: 0
-
-      - name: Import GPG key
-        uses: crazy-max/ghaction-import-gpg@v7
-        with:
-          gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
-          git_user_signingkey: true
-          git_commit_gpgsign: true
-
-      - uses: jdx/mise-action@v3
-        with:
-          version: 2026.4.0
-          install: true
-          cache: true
-
-      - uses: pnpm/action-setup@v6.0.8
-        with:
-          run_install: false
-          cache: false
-
-      - uses: actions/setup-node@v4
-        with:
-          node-version: 22
-
-      - name: Install release-plz CLI
-        run: cargo binstall --no-confirm release-plz
-
-      - name: Pin + commit + push (commit S)
-        id: commit
-        env:
-          IDENTITY: ${{ needs.resolve.outputs.identity }}
-          BRANCH: ${{ github.ref_name }}
-          GH_TOKEN: ${{ github.token }}
-          PUBLISH_RUST: ${{ needs.resolve.outputs.publish_rust }}
-          PUBLISH_TYPESCRIPT: ${{ needs.resolve.outputs.publish_typescript }}
-        run: .github/scripts/release-alpha-pin-bindings.sh
-
-      - name: Verify pin commit signature
-        env:
-          GH_TOKEN: ${{ github.token }}
-          COMMIT_SHA: ${{ steps.commit.outputs.commit_sha }}
-        run: .github/scripts/release-alpha-verify-commit-signature.sh "$COMMIT_SHA"
-
-  build-sql:
-    name: Build + release SQL (in-run)
-    needs: [resolve, pin]
-    if: >-
-      ${{ !cancelled() && !inputs.dry_run
-          && (inputs.target == 'all' || inputs.target == 'eql')
-          && needs.resolve.result == 'success'
-          && (needs.pin.result == 'success' || needs.pin.result == 'skipped') }}
-    permissions:
-      contents: write
-    secrets:
-      MULTITUDES_ACCESS_TOKEN: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}
-    uses: ./.github/workflows/_build-sql.yml
-    with:
-      ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || '' }}
-      tag: ${{ needs.resolve.outputs.sql_tag }}
-      attach: true
-      target_commitish: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }}
-      prerelease: true
-
-  build-docs:
-    name: Build + attach docs (in-run)
-    needs: [resolve, pin, build-sql]
-    if: >-
-      ${{ !cancelled() && !inputs.dry_run
-          && (inputs.target == 'all' || inputs.target == 'eql')
-          && needs.build-sql.result == 'success' }}
-    permissions:
-      contents: write
-    uses: ./.github/workflows/_build-docs.yml
-    with:
-      ref: ${{ inputs.target == 'all' && needs.pin.outputs.commit_sha || github.sha }}
-      tag: ${{ needs.resolve.outputs.sql_tag }}
-
-  rust-publish:
-    name: Dispatch Rust crate publish (release-plz.yml)
-    runs-on: blacksmith-16vcpu-ubuntu-2204
-    needs: [resolve, pin, build-sql, build-docs]
-    if: >-
-      ${{ !cancelled() && !inputs.dry_run
-          && needs.resolve.outputs.publish_rust == 'true'
-          && needs.pin.result == 'success'
-          && (needs.build-sql.result == 'success' || needs.build-sql.result == 'skipped')
-          && (needs.build-docs.result == 'success' || needs.build-docs.result == 'skipped') }}
-    timeout-minutes: 10
-    permissions:
-      actions: write
-    steps:
-      - name: Dispatch release-plz.yml against the pinned commit
-        env:
-          GH_TOKEN: ${{ github.token }}
-          SQL_TAG: ${{ needs.resolve.outputs.sql_tag }}
-          BRANCH: ${{ github.ref_name }}
-          TARGET: ${{ inputs.target }}
-        run: |
-          set -euo pipefail
-          if [[ "$TARGET" == "all" ]]; then
-            ref="$SQL_TAG"
-          else
-            ref="$BRANCH"
-          fi
-          echo "Dispatching release-plz.yml --ref ${ref}"
-          gh workflow run release-plz.yml --ref "$ref"
-          {
-            echo "## Rust crate publish dispatch accepted"
-            echo ""
-            echo "Rust crate publish DISPATCHED against \`${ref}\`."
-            echo "Verify the separate \`release-plz.yml\` run reaches a terminal success state before treating the crate as published."
-          } >> "$GITHUB_STEP_SUMMARY"
-
-  typescript-publish:
-    name: Dispatch TypeScript publish (release-typescript.yml)
-    runs-on: blacksmith-16vcpu-ubuntu-2204
-    needs: [resolve, pin, build-sql, build-docs]
-    if: >-
-      ${{ !cancelled() && !inputs.dry_run
-          && needs.resolve.outputs.publish_typescript == 'true'
-          && needs.pin.result == 'success'
-          && (needs.build-sql.result == 'success' || needs.build-sql.result == 'skipped')
-          && (needs.build-docs.result == 'success' || needs.build-docs.result == 'skipped') }}
-    timeout-minutes: 10
-    permissions:
-      actions: write
-    steps:
-      - name: Dispatch release-typescript.yml against the pinned commit
-        env:
-          GH_TOKEN: ${{ github.token }}
-          SQL_TAG: ${{ needs.resolve.outputs.sql_tag }}
-          BRANCH: ${{ github.ref_name }}
-          TARGET: ${{ inputs.target }}
-          IDENTITY: ${{ needs.resolve.outputs.identity }}
-        run: |
-          set -euo pipefail
-          if [[ "$TARGET" == "all" ]]; then
-            ref="$SQL_TAG"
-          else
-            ref="$BRANCH"
-          fi
-          echo "Dispatching release-typescript.yml --ref ${ref}"
-          gh workflow run release-typescript.yml --ref "$ref" -f identity="$IDENTITY"
-          {
-            echo "## TypeScript publish dispatch accepted"
-            echo ""
-            echo "TypeScript npm publish DISPATCHED against \`${ref}\`."
-            echo "Verify the separate \`release-typescript.yml\` run reaches a terminal success state before treating the package as published."
-          } >> "$GITHUB_STEP_SUMMARY"
-
-  summary:
-    name: Summary
-    runs-on: blacksmith-16vcpu-ubuntu-2204
-    needs: [resolve, pin, build-sql, build-docs, rust-publish, typescript-publish]
-    if: always()
-    steps:
-      - name: Emit run summary
-        env:
-          TARGET: ${{ inputs.target }}
-          DRY: ${{ inputs.dry_run }}
-          IDENTITY: ${{ needs.resolve.outputs.identity }}
-          SQL_TAG: ${{ needs.resolve.outputs.sql_tag }}
-          RUST_TAG: ${{ needs.resolve.outputs.rust_tag }}
-          TYPESCRIPT_TAG: ${{ needs.resolve.outputs.typescript_tag }}
-          PUBLISH_RUST: ${{ needs.resolve.outputs.publish_rust }}
-          PUBLISH_TYPESCRIPT: ${{ needs.resolve.outputs.publish_typescript }}
-          RESOLVE_RESULT: ${{ needs.resolve.result }}
-          PIN_RESULT: ${{ needs.pin.result }}
-          BUILD_SQL_RESULT: ${{ needs.build-sql.result }}
-          BUILD_DOCS_RESULT: ${{ needs.build-docs.result }}
-          RUST_PUBLISH_RESULT: ${{ needs.rust-publish.result }}
-          TYPESCRIPT_PUBLISH_RESULT: ${{ needs.typescript-publish.result }}
-          SERVER_URL: ${{ github.server_url }}
-          REPOSITORY: ${{ github.repository }}
-          RUN_ID: ${{ github.run_id }}
-        run: |
-          set -euo pipefail
-          {
-            echo "## release-alpha result"
-            echo ""
-            echo "- target: \`${TARGET}\` (dry_run=${DRY})"
-            echo "- identity: \`${IDENTITY}\`"
-            echo "- sql_tag: \`${SQL_TAG}\`"
-            echo "- rust_tag: \`${RUST_TAG}\` (publish=${PUBLISH_RUST})"
-            echo "- typescript_tag: \`${TYPESCRIPT_TAG}\` (publish=${PUBLISH_TYPESCRIPT})"
-            echo "- resolve: ${RESOLVE_RESULT} | pin: ${PIN_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | rust-publish-dispatch: ${RUST_PUBLISH_RESULT} | typescript-publish-dispatch: ${TYPESCRIPT_PUBLISH_RESULT}"
-            echo ""
-            echo "Coordinator run: ${SERVER_URL}/${REPOSITORY}/actions/runs/${RUN_ID}"
-            echo "Rust and TypeScript publishes are DISPATCHED by this coordinator. Verify the separate release-plz.yml and release-typescript.yml runs before treating package publishes as successful."
-          } >> "$GITHUB_STEP_SUMMARY"
diff --git a/.github/workflows/release-eql.yml b/.github/workflows/release-eql.yml
deleted file mode 100644
index 920877a7f..000000000
--- a/.github/workflows/release-eql.yml
+++ /dev/null
@@ -1,80 +0,0 @@
-name: "Release EQL"
-
-on:
-  release:
-    types:
-      - published
-  pull_request: # runs everything but the last step
-    branches:
-      - main
-    paths:
-      - .github/workflows/release-eql.yml
-  # Useful for debugging
-  workflow_dispatch:
-
-env:
-  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
-  MISE_VERBOSE: "1"
-
-defaults:
-  run:
-    shell: bash {0}
-
-permissions:
-  contents: write
-
-jobs:
-  verify-changelog:
-    runs-on: blacksmith-16vcpu-ubuntu-2204
-    name: Verify CHANGELOG entry
-    # Only real (non-prerelease) eql-* releases. Pre-releases keep their
-    # entries under [Unreleased] until the final release is cut. The
-    # `!startsWith(...'eql-bindings')` guard excludes the eql-bindings crate
-    # tags (eql-bindings-v*) cut by release-plz — those are Rust-crate releases,
-    # not SQL-surface releases.
-    if: ${{ github.event_name == 'release' && contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings') && github.event.release.prerelease == false }}
-    timeout-minutes: 5
-
-    steps:
-      - uses: actions/checkout@v4
-
-      - name: CHANGELOG.md has a section for this release
-        env:
-          TAG: ${{ github.event.release.tag_name }}
-        run: |
-          version="${TAG#eql-}"
-          escaped="${version//./\\.}"
-          if ! grep -qE "^## \[${escaped}\]" CHANGELOG.md; then
-            echo "::error file=CHANGELOG.md::No '## [${version}]' section in CHANGELOG.md at tag ${TAG}. The release was cut without promoting [Unreleased] -> [${version}] first. See the 'Cutting a release' section of CLAUDE.md."
-            exit 1
-          fi
-          echo "Found '## [${version}]' section in CHANGELOG.md."
-
-  build-and-publish:
-    name: Build EQL
-    # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags
-    # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases.
-    if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
-    permissions:
-      contents: write
-    secrets:
-      MULTITUDES_ACCESS_TOKEN: ${{ secrets.MULTITUDES_ACCESS_TOKEN }}
-    uses: ./.github/workflows/_build-sql.yml
-    with:
-      ref: ""
-      tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }}
-      attach: ${{ github.event_name == 'release' && startsWith(github.ref, 'refs/tags/') }}
-      target_commitish: ""
-      prerelease: false
-
-  publish-docs:
-    name: Build and Publish Documentation
-    # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags
-    # (eql-bindings-v*) cut by release-plz, which are not SQL-surface releases.
-    if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
-    permissions:
-      contents: write
-    uses: ./.github/workflows/_build-docs.yml
-    with:
-      ref: ""
-      tag: ${{ github.event_name == 'release' && github.event.release.tag_name || '' }}
diff --git a/.github/workflows/release-postgres-eql-image.yml b/.github/workflows/release-postgres-eql-image.yml
index 2319d0339..a311fd703 100644
--- a/.github/workflows/release-postgres-eql-image.yml
+++ b/.github/workflows/release-postgres-eql-image.yml
@@ -1,9 +1,10 @@
 name: "Release Postgres + EQL image"
 
 on:
-  release:
-    types:
-      - published
+  # Driven by release.yml on production finals (it dispatches this workflow with
+  # update_floating_tags=true), plus manual runs. Not `on: release`: a
+  # GITHUB_TOKEN-created release does not trigger `on: release` fan-out, whereas
+  # a GITHUB_TOKEN workflow_dispatch does — so release.yml dispatches instead.
   workflow_dispatch:
     inputs:
       eql_version:
@@ -33,17 +34,13 @@ jobs:
   build-sql:
     runs-on: blacksmith-16vcpu-ubuntu-2204
     name: Build EQL SQL
-    # `!startsWith(...'eql-bindings')` excludes the eql-bindings crate tags
-    # (eql-bindings-v*) cut by release-plz — a Rust-crate release must not build
-    # a Postgres+EQL image. Downstream jobs `needs: build-sql`, so they skip too.
-    if: ${{ github.event_name != 'release' || (contains(github.event.release.tag_name, 'eql') && !startsWith(github.event.release.tag_name, 'eql-bindings')) }}
     timeout-minutes: 5
     outputs:
       # Used for image tags, e.g. "2.1.8" -> ghcr.io/.../postgres-eql:17-2.1.8
       eql_version: ${{ steps.ver.outputs.eql_version }}
       # Passed to `mise run build --version`. Bare semver (no `eql-` prefix),
-      # matching release-eql.yml, so eql_v3.version() in the image is
-      # byte-identical to the SQL release.
+      # matching the SQL release build (_build-sql.yml), so eql_v3.version() in
+      # the image is byte-identical to the SQL release.
       build_version: ${{ steps.ver.outputs.build_version }}
       update_floating_tags: ${{ steps.ver.outputs.update_floating_tags }}
 
@@ -58,24 +55,19 @@ jobs:
 
       - name: Compute EQL version and tag policy
         id: ver
+        # eql_version is passed in as bare semver (release.yml sends
+        # needs.release.outputs.version, e.g. "3.0.0"), used both as the image
+        # tag and, verbatim, as the `mise run build --version` value so
+        # eql_v3.version() in the image is byte-identical to the SQL release.
         env:
-          EVENT_NAME: ${{ github.event_name }}
-          RELEASE_TAG: ${{ github.event.release.tag_name }}
           INPUT_VERSION: ${{ inputs.eql_version }}
           INPUT_FLOATING: ${{ inputs.update_floating_tags }}
         run: |
-          if [[ "$EVENT_NAME" == "release" ]]; then
-            eql_version="${RELEASE_TAG#eql-}"     # e.g. "2.1.8"
-            build_version="$eql_version"          # bare semver for eql_v3.version()
-            floating="true"
-          else
-            eql_version="$INPUT_VERSION"
-            build_version="$INPUT_VERSION"
-            floating="$INPUT_FLOATING"
-          fi
-          echo "eql_version=${eql_version}" >> "$GITHUB_OUTPUT"
-          echo "build_version=${build_version}" >> "$GITHUB_OUTPUT"
-          echo "update_floating_tags=${floating}" >> "$GITHUB_OUTPUT"
+          {
+            echo "eql_version=${INPUT_VERSION}"
+            echo "build_version=${INPUT_VERSION}"
+            echo "update_floating_tags=${INPUT_FLOATING}"
+          } >> "$GITHUB_OUTPUT"
 
       - name: Build EQL release SQL
         run: mise run build --version ${{ steps.ver.outputs.build_version }}
diff --git a/.github/workflows/release-typescript.yml b/.github/workflows/release-typescript.yml
deleted file mode 100644
index 18748ef69..000000000
--- a/.github/workflows/release-typescript.yml
+++ /dev/null
@@ -1,144 +0,0 @@
-name: "Release TypeScript bindings (npm)"
-
-permissions:
-  contents: write
-  id-token: write
-
-on:
-  workflow_dispatch:
-    inputs:
-      identity:
-        description: "Exact prerelease identity, e.g. 3.0.0-alpha.7"
-        required: true
-        type: string
-
-concurrency:
-  group: release-typescript
-  cancel-in-progress: false
-
-defaults:
-  run:
-    shell: bash {0}
-
-jobs:
-  publish:
-    name: Publish @cipherstash/eql
-    runs-on: ubuntu-latest
-    timeout-minutes: 15
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          fetch-depth: 0
-          # Do not leave the git token in .git/config across pnpm install /
-          # npm publish / build (a compromised lifecycle script could read it).
-          # The final tag push re-authenticates explicitly via extraheader.
-          persist-credentials: false
-
-      - uses: pnpm/action-setup@v6.0.8
-        name: Install pnpm
-        with:
-          run_install: false
-          cache: false
-
-      - uses: actions/setup-node@v4
-        with:
-          node-version: 22
-
-      - name: Upgrade npm for OIDC trusted publishing
-        run: npm install -g npm@^11.5.1
-
-      - uses: jdx/mise-action@v3
-        with:
-          version: 2026.4.0
-          install: true
-          cache: true
-
-      - name: Install dependencies
-        run: pnpm install --frozen-lockfile
-
-      - name: Verify package version matches dispatch identity
-        env:
-          IDENTITY: ${{ inputs.identity }}
-        run: |
-          set -euo pipefail
-          actual="$(node -p "require('./packages/eql/package.json').version")"
-          test "$actual" = "$IDENTITY" || {
-            echo "package version ${actual} does not match identity ${IDENTITY}" >&2
-            exit 1
-          }
-
-      - name: Prepare exact SQL assets
-        env:
-          IDENTITY: ${{ inputs.identity }}
-        run: mise run release:prepare_bindings_assets --version "$IDENTITY"
-
-      - name: Verify generated TypeScript package surface
-        run: mise run typescript:check
-
-      - name: Verify release manifest matches SQL assets
-        run: |
-          set -euo pipefail
-          node - <<'NODE'
-          const { createHash } = require('node:crypto')
-          const { readFileSync } = require('node:fs')
-          const manifest = require('./packages/eql/sql/release-manifest.json')
-          const identity = process.env.IDENTITY
-          const sha256 = (path) => createHash('sha256').update(readFileSync(path)).digest('hex')
-          if (manifest.eqlVersion !== identity) {
-            throw new Error(`manifest eqlVersion ${manifest.eqlVersion} does not match ${identity}`)
-          }
-          if (manifest.installSqlSha256 !== sha256('./packages/eql/sql/cipherstash-encrypt.sql')) {
-            throw new Error('install SQL hash mismatch')
-          }
-          if (manifest.uninstallSqlSha256 !== sha256('./packages/eql/sql/cipherstash-encrypt-uninstall.sql')) {
-            throw new Error('uninstall SQL hash mismatch')
-          }
-          NODE
-        env:
-          IDENTITY: ${{ inputs.identity }}
-
-      - name: Build package
-        run: pnpm --filter @cipherstash/eql build
-
-      - name: Publish package
-        working-directory: packages/eql
-        env:
-          IDENTITY: ${{ inputs.identity }}
-        run: |
-          set -euo pipefail
-          # Idempotent: a rerun after a partial failure (e.g. the tag push
-          # below failed) must not die on republishing an existing version.
-          if [ -n "$(npm view "@cipherstash/eql@${IDENTITY}" version 2>/dev/null)" ]; then
-            echo "@cipherstash/eql@${IDENTITY} is already published; skipping publish"
-          else
-            publish_tag="latest"
-            if [[ "$IDENTITY" == *-* ]]; then
-              prerelease="${IDENTITY#*-}"
-              publish_tag="${prerelease%%.*}"
-            fi
-            npm publish --access public --provenance --tag "$publish_tag"
-          fi
-
-      - name: Tag TypeScript release
-        env:
-          IDENTITY: ${{ inputs.identity }}
-          GH_TOKEN: ${{ github.token }}
-          REPO: ${{ github.repository }}
-        run: |
-          set -euo pipefail
-          tag="eql-typescript-v${IDENTITY}"
-          repo_url="https://github.com/${REPO}.git"
-          # persist-credentials: false leaves no cached token, so authenticate
-          # this push explicitly (same extraheader pattern as
-          # release-alpha-pin-bindings.sh) rather than relying on `origin`.
-          auth=(-c "http.https://github.com/.extraheader=AUTHORIZATION: bearer ${GH_TOKEN}")
-          # Idempotent: if the tag already exists on the remote (e.g. from a
-          # prior partial run), skip — do not force-overwrite a different commit.
-          if git "${auth[@]}" ls-remote --exit-code --tags "$repo_url" "refs/tags/${tag}" >/dev/null 2>&1; then
-            echo "tag ${tag} already exists on the remote; skipping"
-          else
-            git config user.name "github-actions[bot]"
-            git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
-            git tag "$tag"
-            git "${auth[@]}" push "$repo_url" "refs/tags/${tag}"
-          fi
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 1f91f1553..a35990d9a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -176,6 +176,31 @@ jobs:
       ref: ${{ github.sha }}
       tag: eql-${{ needs.release.outputs.version }}
 
+  build-image:
+    name: Dispatch Postgres + EQL image build
+    needs: [release, build-sql, build-docs]
+    # Production finals only: the floating :latest / : image tags must
+    # not move for a prerelease. Alpha images can still be built on demand via
+    # release-postgres-eql-image.yml's workflow_dispatch. Dispatched (not an
+    # `on: release` fan-out) because a GITHUB_TOKEN-created release does not
+    # trigger `on: release`, whereas a GITHUB_TOKEN workflow_dispatch does.
+    if: ${{ needs.release.outputs.published == 'true' && needs.release.outputs.prerelease == 'false' }}
+    runs-on: ubuntu-latest
+    timeout-minutes: 10
+    permissions:
+      actions: write
+    steps:
+      - name: Dispatch release-postgres-eql-image.yml
+        env:
+          GH_TOKEN: ${{ github.token }}
+          BRANCH: ${{ github.ref_name }}
+          VERSION: ${{ needs.release.outputs.version }}
+        run: |
+          set -euo pipefail
+          gh workflow run release-postgres-eql-image.yml --ref "$BRANCH" \
+            -f eql_version="$VERSION" \
+            -f update_floating_tags=true
+
   prerelease-build-sql:
     name: Build + attach prerelease SQL
     needs: classify
@@ -307,7 +332,7 @@ jobs:
   summary:
     name: Summary
     runs-on: ubuntu-latest
-    needs: [classify, release, build-sql, build-docs, prerelease-build-sql, prerelease-build-docs, prerelease-publish-npm, prerelease-publish-rust]
+    needs: [classify, release, build-sql, build-docs, build-image, prerelease-build-sql, prerelease-build-docs, prerelease-publish-npm, prerelease-publish-rust]
     if: always()
     steps:
       - name: Emit run summary
@@ -318,6 +343,7 @@ jobs:
           RELEASE_RESULT: ${{ needs.release.result }}
           BUILD_SQL_RESULT: ${{ needs.build-sql.result }}
           BUILD_DOCS_RESULT: ${{ needs.build-docs.result }}
+          BUILD_IMAGE_RESULT: ${{ needs.build-image.result }}
           PRE_BUILD_SQL_RESULT: ${{ needs.prerelease-build-sql.result }}
           PRE_BUILD_DOCS_RESULT: ${{ needs.prerelease-build-docs.result }}
           PRE_PUBLISH_NPM_RESULT: ${{ needs.prerelease-publish-npm.result }}
@@ -332,7 +358,7 @@ jobs:
             echo ""
             echo "- mode: \`${MODE}\`"
             echo "- version: \`${VERSION}\`"
-            echo "- classify: ${CLASSIFY_RESULT} | release: ${RELEASE_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | prerelease-build-sql: ${PRE_BUILD_SQL_RESULT} | prerelease-build-docs: ${PRE_BUILD_DOCS_RESULT} | prerelease-publish-npm: ${PRE_PUBLISH_NPM_RESULT} | prerelease-publish-rust: ${PRE_PUBLISH_RUST_RESULT}"
+            echo "- classify: ${CLASSIFY_RESULT} | release: ${RELEASE_RESULT} | build-sql: ${BUILD_SQL_RESULT} | build-docs: ${BUILD_DOCS_RESULT} | build-image: ${BUILD_IMAGE_RESULT} | prerelease-build-sql: ${PRE_BUILD_SQL_RESULT} | prerelease-build-docs: ${PRE_BUILD_DOCS_RESULT} | prerelease-publish-npm: ${PRE_PUBLISH_NPM_RESULT} | prerelease-publish-rust: ${PRE_PUBLISH_RUST_RESULT}"
             echo ""
             echo "Run: ${SERVER_URL}/${REPOSITORY}/actions/runs/${RUN_ID}"
           } >> "$GITHUB_STEP_SUMMARY"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 75e218c2e..3f0df5e2b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,7 @@ Each entry that ships in a published release links to the PR that introduced it.
 
 - **Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373))
 - **First-class language-binding releases: the `@cipherstash/eql` npm package and crate-bundled SQL.** EQL v3 now ships its canonical wire types as a TypeScript npm package (`@cipherstash/eql`, under `packages/eql/`) alongside the existing Rust `eql-bindings` crate — both generated from `eql-domains::CATALOG` (the TS package is derived from the crate's `bindings/` + `schema/` outputs, drift-gated by `mise run typescript:check`). Each language package bundles the **exact** self-contained SQL installer/uninstaller it was generated against: the crate exposes it as `eql_bindings::sql` (`INSTALL_SQL`, `UNINSTALL_SQL`, `RELEASE_MANIFEST_JSON`), and the npm package via its `./sql` / `./sql/*` subpath exports (plus a `releaseManifest` and `readInstallSql()`/`readUninstallSql()` helpers) — so a consumer pins wire types and the matching DDL together. Prereleases can now cut all three artifacts under one identity — the SQL + docs GitHub release, the crate (crates.io, tag `eql-bindings-v`), and the npm package (tag `eql-typescript-v`): `mise run release:all` releases the lot in lockstep, `mise run release:bindings` publishes all language packages for an existing SQL alpha, and `mise run release:rust` / `mise run release:typescript` publish a single language. Why: type information was lost at every hop from EQL to downstream tools; a versioned, single-source package per language (bundled with the SQL it targets) removes hand-copying and installer/type drift.
+- **First-class language-binding releases: the `@cipherstash/eql` npm package and crate-bundled SQL.** EQL v3 now ships its canonical wire types as a TypeScript npm package (`@cipherstash/eql`, under `packages/eql/`) alongside the existing Rust `eql-bindings` crate — both generated from `eql-domains::CATALOG` (the TS package is derived from the crate's `bindings/` + `schema/` outputs, drift-gated by `mise run typescript:check`). Each language package bundles the **exact** self-contained SQL installer/uninstaller it was generated against: the crate exposes it as `eql_bindings::sql` (`INSTALL_SQL`, `UNINSTALL_SQL`, `RELEASE_MANIFEST_JSON`), and the npm package via its `./sql` / `./sql/*` subpath exports (plus a `releaseManifest` and `readInstallSql()`/`readUninstallSql()` helpers) — so a consumer pins wire types and the matching DDL together. Prereleases can now cut all three artifacts under one identity — the SQL + docs GitHub release, the crate (crates.io, tag `eql-bindings-v`), and the npm package (tag `eql-typescript-v`): a single unified `release.yml` workflow publishes them in lockstep from an explicit `chore(release): ...` commit on the `eql_v3` branch (npm directly, the crate dispatched through `release-plz.yml` for crates.io Trusted Publishing). Why: type information was lost at every hop from EQL to downstream tools; a versioned, single-source package per language (bundled with the SQL it targets) removes hand-copying and installer/type drift.
 - **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350))
 - **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349))
 - **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed.
diff --git a/CLAUDE.md b/CLAUDE.md
index 742f2f0e9..11109eb29 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -212,8 +212,8 @@ EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style `
 
 **Cutting a release is scripted — don't hand-roll `gh release create`.** There are two paths:
 
-- **Prerelease:** use the unified `release.yml` workflow. On `main` it runs the production release path; on `eql_v3` it only publishes when the push is an explicit conventional release commit (`chore(release): ...`). Release-relevant work happens in CI, and prerelease runs still build SQL + docs + language packages in the same workflow. The npm package is published directly by `release.yml`; the Rust crate still publishes via `release-plz.yml` because crates.io Trusted Publishing needs that workflow entry point. Always use `--dry-run` first when invoking the release tasks or workflow manually. It deliberately does **not** touch `CHANGELOG.md` for prereleases (`[Unreleased]` stays put). Full runbook: **`docs/development/releasing-an-alpha.md`**.
-- **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]`, which the workflow's `verify-changelog` job enforces.
+- **Prerelease:** use the unified `release.yml` workflow. On `main` it runs the production release path; on `eql_v3` it only publishes when the push is an explicit conventional release commit (`chore(release): ...`). Release-relevant work happens in CI, and prerelease runs still build SQL + docs + language packages in the same workflow. The npm package is published directly by `release.yml`; the Rust crate still publishes via `release-plz.yml` because crates.io Trusted Publishing needs that workflow entry point. Validate on a scratch branch before cutting a real prerelease — a package publish is irreversible. It deliberately does **not** touch `CHANGELOG.md` for prereleases (`[Unreleased]` stays put). Full runbook: **`docs/development/releasing-an-alpha.md`**.
+- **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]` in `CHANGELOG.md`. Finals are cut from `main` through the unified `release.yml` (changesets versions/publishes, then the same run builds and attaches the SQL + docs release).
 
 The **language binding packages** are generated from the same `eql-domains::CATALOG` as the SQL surface: the **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) and the **`@cipherstash/eql` npm package** (published via npm Trusted Publishing from `release.yml`, tagged `eql-typescript-v`). Both bundle the exact self-contained SQL installer/uninstaller they were generated against (the crate exposes it as `eql_bindings::sql`; the npm package via its `./sql` subpath exports). Prerelease release commits on `eql_v3` carry the committed version and bundled SQL for the release; `release.yml` publishes that commit as the prerelease and then dispatches `release-plz.yml` for the crate. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the release commit must already carry the version pin.
 
@@ -260,12 +260,12 @@ The `eql_v3` PostgreSQL schema name is part of the public API and is **independe
 
 ### Cutting a release
 
-This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, use `mise run release:all`, `mise run release:eql`, `mise run release:bindings`, `mise run release:rust`, or `mise run release:typescript` instead — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`.
+This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, cut a prerelease from the `eql_v3` branch via the unified `release.yml` workflow — push an explicit `chore(release): ...` commit that already pins the prerelease version in `packages/eql/package.json` — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`.
 
 When a release is being prepared:
 
 1. Confirm `[Unreleased]` is non-empty and entries are coherent.
 2. Rename `## [Unreleased]` to `## [] — YYYY-MM-DD` and add a fresh empty `[Unreleased]` above it.
 3. Update the link references at the bottom of `CHANGELOG.md` (new `[Unreleased]` compare URL, new `[]` tag URL).
-4. Commit, then create the GitHub release. The release workflow (`.github/workflows/release-eql.yml`) takes the tag and builds artefacts.
+4. Commit to `main`. The unified `release.yml` workflow publishes the release and builds + attaches the SQL + docs artefacts to the `eql-` release it creates.
 5. The `[]` section is the GitHub release body — paste it verbatim.
diff --git a/README.md b/README.md
index c1f8911a6..2a37c05b6 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Encrypt Query Language (EQL)
 
 [![Test EQL](https://github.com/cipherstash/encrypt-query-language/actions/workflows/test-eql.yml/badge.svg?branch=main)](https://github.com/cipherstash/encrypt-query-language/actions/workflows/test-eql.yml)
-[![Release EQL](https://github.com/cipherstash/encrypt-query-language/actions/workflows/release-eql.yml/badge.svg?event=release)](https://github.com/cipherstash/encrypt-query-language/actions/workflows/release-eql.yml)
+[![Release EQL](https://github.com/cipherstash/encrypt-query-language/actions/workflows/release.yml/badge.svg?branch=main)](https://github.com/cipherstash/encrypt-query-language/actions/workflows/release.yml)
 
 Encrypt Query Language (EQL) is a set of abstractions for transmitting, storing, and interacting with encrypted data and indexes in PostgreSQL.
 
diff --git a/crates/eql-bindings/README.md b/crates/eql-bindings/README.md
index 1f95bb6a5..f7c9536ac 100644
--- a/crates/eql-bindings/README.md
+++ b/crates/eql-bindings/README.md
@@ -38,8 +38,8 @@ Shared wire fields are reusable newtypes in
 | `BloomFilter` | `bf` | `Vec` (signed!) | `_match` domains |
 
 Note "v3" names the SQL schema generation (`eql_v3.*`); the JSON envelope
-version is still `v: 2` — the generated domain CHECKs assert it, and the wire
-field names are unchanged from v2 (the purpose-named rename in
+version is `v: 3` — the generated domain CHECKs assert `VALUE->>'v' = '3'`, and
+the wire field names are unchanged from v2 (the purpose-named rename in
 `docs/plans/eql-payload-scheme-discipline-rfc.md` is deferred).
 
 ## Drift protection
diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md
index 4095c1436..da9d6bda5 100644
--- a/docs/development/2026-07-04-release-tasks-design.md
+++ b/docs/development/2026-07-04-release-tasks-design.md
@@ -1,5 +1,13 @@
 # Design: CI-native alpha releases (SQL surface + `eql-bindings` crate)
 
+> **SUPERSEDED (historical record).** The `workflow_dispatch` coordinator with
+> `mise run release:*` targets and a `crate-publish`/`crate_tag` job described
+> below was never shipped. Releases now run through the single unified
+> `.github/workflows/release.yml` (production from `main` via changesets;
+> alpha/prerelease from `eql_v3` via a `chore(release): ...` commit). See
+> `docs/development/releasing-an-alpha.md` for the current process. This file is
+> kept only as a point-in-time design snapshot.
+
 **Date:** 2026-07-04
 **Status:** Approved design (CI-native), ready for implementation plan
 **Scope:** Release the two EQL artefacts — individually and in version lockstep — from a single `workflow_dispatch` GitHub Actions workflow, with thin `mise run release:*` tasks that only *trigger and watch* CI.
diff --git a/docs/development/2026-07-04-release-tasks-implementation-plan.md b/docs/development/2026-07-04-release-tasks-implementation-plan.md
index e8557f6f0..94f9e7922 100644
--- a/docs/development/2026-07-04-release-tasks-implementation-plan.md
+++ b/docs/development/2026-07-04-release-tasks-implementation-plan.md
@@ -1,5 +1,11 @@
 # CI-native alpha releases (SQL surface + `eql-bindings` crate) — Implementation Plan
 
+> **SUPERSEDED (historical record).** The `workflow_dispatch` coordinator with
+> `mise run release:*` targets and a `crate-publish`/`crate_tag` job described
+> below was never shipped. Releases now run through the single unified
+> `.github/workflows/release.yml`. See `docs/development/releasing-an-alpha.md`
+> for the current process. This file is kept only as a point-in-time snapshot.
+
 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
 
 **Goal:** Cut alpha (prerelease) versions of the EQL SQL surface alone, the `eql-bindings` crate alone, or both in version lockstep, from a single `workflow_dispatch` GitHub Actions coordinator, driven by thin `mise run release:*` tasks that only trigger and watch CI. Alpha releases carry the same assets as finals: the two `.sql` files **and** the packaged docs bundle.
diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md
index 8fb347e0f..f006dd025 100644
--- a/docs/development/releasing-an-alpha.md
+++ b/docs/development/releasing-an-alpha.md
@@ -107,8 +107,9 @@ package version is not already prerelease-shaped.
 ## Verification note
 
 The durable PR gate is `.github/workflows/lint-release.yml`. It runs actionlint
-over the release workflows, ShellCheck over the release wrappers and identity
-helper, and `.github/scripts/derive-identity.test.sh`.
+over the release workflows, ShellCheck over `tasks/release/prepare-bindings-assets.sh`,
+and the supply-chain cache guard (`lint:workflow-cache`) plus the script unit
+tests (`test:scripts`).
 
 The SQL-to-docs-to-publish ordering can be exercised safely only on a scratch
 branch, because a real package publish is irreversible. For a scratch
diff --git a/scripts/lint-no-workflow-caching.mjs b/scripts/lint-no-workflow-caching.mjs
index 3fa5246b5..6df74d2e4 100644
--- a/scripts/lint-no-workflow-caching.mjs
+++ b/scripts/lint-no-workflow-caching.mjs
@@ -4,11 +4,7 @@ import { resolve } from 'node:path'
 import process from 'node:process'
 import yaml from 'js-yaml'
 
-const defaultWorkflowFiles = [
-  '.github/workflows/release.yml',
-  '.github/workflows/release-typescript.yml',
-  '.github/workflows/release-alpha.yml',
-]
+const defaultWorkflowFiles = ['.github/workflows/release.yml']
 
 function asArray(value) {
   return Array.isArray(value) ? value : []
diff --git a/tasks/release/all.sh b/tasks/release/all.sh
deleted file mode 100755
index 85e3131a4..000000000
--- a/tasks/release/all.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="Cut an alpha of SQL + docs + ALL language binding packages in lockstep: dispatch release-alpha.yml (target=all) and watch"
-#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
-#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
-#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git branch to dispatch against (the crate pin is pushed here)" default=""
-#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
-
-set -euo pipefail
-
-# Thin trigger: nothing release-relevant runs locally. It dispatches the
-# CI-native coordinator (.github/workflows/release-alpha.yml) with target=all and
-# watches THAT run. Same-commit lockstep + all safety live in CI.
-
-target="all"
-version="${usage_version:-3.0.0}"
-channel="${usage_channel:-alpha}"
-pre="${usage_pre:-}"
-ref="${usage_ref:-}"
-dry_run="${usage_dry_run:-false}"
-
-err() { echo "error: $*" >&2; exit 1; }
-
-# --- Validate (mirrors the coordinator's resolve guards) ---------------------
-case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
-[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
-if [[ -n "$pre" ]]; then
-  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
-fi
-
-command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
-gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
-
-# target=all pins+pushes language package versions, so require an explicit branch.
-if [[ -z "$ref" ]]; then
-  err "missing --ref  (target=all pushes language package pins to that branch)"
-fi
-
-# Unique correlation id echoed into the coordinator's run-name so we watch the
-# EXACT run we started.
-dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
-
-args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
-[[ -n "$pre" ]] && args+=(-f pre="$pre")
-[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
-
-echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
-gh workflow run release-alpha.yml "${args[@]}"
-
-echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
-run_id=""
-for _ in $(seq 1 30); do
-  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle \
-    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
-  [[ -n "$run_id" && "$run_id" != "null" ]] && break
-  sleep 2
-done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
-
-echo "==> Watching run ${run_id}"
-gh run watch "$run_id" --exit-status
-echo "==> Coordinator finished. Rust and TypeScript package publishes run as SEPARATE release workflows - watch them in the Actions tab."
diff --git a/tasks/release/bindings.sh b/tasks/release/bindings.sh
deleted file mode 100755
index 43bf0e30b..000000000
--- a/tasks/release/bindings.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="Publish ALL language EQL bindings for an EXISTING SQL alpha: dispatch release-alpha.yml (target=bindings) and watch"
-#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
-#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
-#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git branch to dispatch against (must currently be AT the eql- commit)" default=""
-#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
-
-set -euo pipefail
-
-# target=bindings publishes missing language binding packages SAME-SOURCE from
-# an existing eql- SQL release. The branch must currently be AT that
-# release's commit; the coordinator pins package metadata on top and dispatches
-# the language-specific publish workflows.
-
-target="bindings"
-version="${usage_version:-3.0.0}"
-channel="${usage_channel:-alpha}"
-pre="${usage_pre:-}"
-ref="${usage_ref:-}"
-dry_run="${usage_dry_run:-false}"
-
-err() { echo "error: $*" >&2; exit 1; }
-
-case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
-[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
-if [[ -n "$pre" ]]; then
-  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
-fi
-
-command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
-gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
-
-if [[ -z "$ref" ]]; then
-  err "missing --ref  (target=bindings pushes language package pins to that branch)"
-fi
-
-dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
-
-args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
-[[ -n "$pre" ]] && args+=(-f pre="$pre")
-[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
-
-echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
-gh workflow run release-alpha.yml "${args[@]}"
-
-echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
-run_id=""
-for _ in $(seq 1 30); do
-  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle \
-    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
-  [[ -n "$run_id" && "$run_id" != "null" ]] && break
-  sleep 2
-done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
-
-echo "==> Watching run ${run_id}"
-gh run watch "$run_id" --exit-status
-echo "==> Coordinator finished. Language package publishes run as SEPARATE release workflows - watch them in the Actions tab."
diff --git a/tasks/release/eql.sh b/tasks/release/eql.sh
deleted file mode 100755
index 6aa18cd44..000000000
--- a/tasks/release/eql.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="Cut an alpha of the SQL surface + docs only: dispatch release-alpha.yml (target=eql) and watch the run"
-#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
-#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
-#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git ref (branch or tag) to dispatch against" default=""
-#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
-
-set -euo pipefail
-
-target="eql"
-version="${usage_version:-3.0.0}"
-channel="${usage_channel:-alpha}"
-pre="${usage_pre:-}"
-ref="${usage_ref:-}"
-dry_run="${usage_dry_run:-false}"
-
-err() { echo "error: $*" >&2; exit 1; }
-
-case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
-[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
-if [[ -n "$pre" ]]; then
-  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
-fi
-
-command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
-gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
-
-# target=eql does not push, so any ref works; only reject the unusable "HEAD"
-# default from a detached checkout.
-if [[ -z "$ref" ]]; then
-  ref="$(git rev-parse --abbrev-ref HEAD)"
-  [[ "$ref" != "HEAD" ]] || err "detached HEAD; pass --ref "
-fi
-
-dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
-
-args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
-[[ -n "$pre" ]] && args+=(-f pre="$pre")
-[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
-
-echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
-gh workflow run release-alpha.yml "${args[@]}"
-
-echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
-run_id=""
-for _ in $(seq 1 30); do
-  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle \
-    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
-  [[ -n "$run_id" && "$run_id" != "null" ]] && break
-  sleep 2
-done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
-
-echo "==> Watching run ${run_id}"
-gh run watch "$run_id" --exit-status
-echo "==> Done. SQL prerelease + docs cut; no crate published (target=eql)."
diff --git a/tasks/release/pin-bindings.sh b/tasks/release/pin-bindings.sh
deleted file mode 100755
index dc9e73fea..000000000
--- a/tasks/release/pin-bindings.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="CI-oriented helper: pin language binding package versions to an identity, commit, and push"
-#USAGE flag "--identity " help="Exact prerelease identity, e.g. 3.0.0-alpha.2"
-#USAGE flag "--branch " help="Branch to push the pin commit to"
-#USAGE flag "--publish-rust " help="Pin the Rust eql-bindings crate (true/false)" default="true"
-#USAGE flag "--publish-typescript " help="Pin the TypeScript @cipherstash/eql package (true/false)" default="true"
-
-set -euo pipefail
-
-root="$(git rev-parse --show-toplevel)"
-identity="${usage_identity:-}"
-branch="${usage_branch:-}"
-publish_rust="${usage_publish_rust:-true}"
-publish_typescript="${usage_publish_typescript:-true}"
-
-[[ -n "$identity" ]] || { echo "error: --identity is required" >&2; exit 1; }
-[[ -n "$branch" ]] || { echo "error: --branch is required" >&2; exit 1; }
-
-IDENTITY="$identity" BRANCH="$branch" PUBLISH_RUST="$publish_rust" PUBLISH_TYPESCRIPT="$publish_typescript" \
-  "${root}/.github/scripts/release-alpha-pin-bindings.sh"
diff --git a/tasks/release/resolve-alpha.sh b/tasks/release/resolve-alpha.sh
deleted file mode 100755
index 59d80fdbd..000000000
--- a/tasks/release/resolve-alpha.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="Resolve and validate release-alpha.yml identity/tag guards locally"
-#USAGE flag "--target " help="Release target: all | eql | bindings | rust | typescript" default="all"
-#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
-#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
-#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref-type " help="GitHub ref type: branch | tag" default=""
-#USAGE flag "--ref-name " help="GitHub ref name" default=""
-
-set -euo pipefail
-
-root="$(git rev-parse --show-toplevel)"
-target="${usage_target:-all}"
-version="${usage_version:-3.0.0}"
-channel="${usage_channel:-alpha}"
-pre="${usage_pre:-}"
-ref_type="${usage_ref_type:-}"
-ref_name="${usage_ref_name:-}"
-
-if [[ -z "$ref_name" ]]; then
-  ref_name="$(git rev-parse --abbrev-ref HEAD)"
-fi
-
-if [[ -z "$ref_type" ]]; then
-  if [[ "$ref_name" == "HEAD" ]]; then
-    ref_type="tag"
-  else
-    ref_type="branch"
-  fi
-fi
-
-TARGET="$target" \
-VERSION="$version" \
-CHANNEL="$channel" \
-PRE="$pre" \
-REF_TYPE="$ref_type" \
-REF_NAME="$ref_name" \
-  "${root}/.github/scripts/release-alpha-resolve.sh"
diff --git a/tasks/release/rust.sh b/tasks/release/rust.sh
deleted file mode 100755
index 07242d0c4..000000000
--- a/tasks/release/rust.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="Publish the Rust EQL bindings for an EXISTING SQL alpha: dispatch release-alpha.yml (target=rust) and watch"
-#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
-#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
-#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git branch to dispatch against (must currently be AT the eql- commit)" default=""
-#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
-
-set -euo pipefail
-
-# target=rust publishes the Rust eql-bindings crate SAME-SOURCE from an existing
-# eql- SQL release: the branch must currently be AT that release's
-# commit (the coordinator guards branch-HEAD == SQL-tag-commit), and the pin
-# adds a metadata-only commit on top. Requires a BRANCH (the pin is pushed).
-
-target="rust"
-version="${usage_version:-3.0.0}"
-channel="${usage_channel:-alpha}"
-pre="${usage_pre:-}"
-ref="${usage_ref:-}"
-dry_run="${usage_dry_run:-false}"
-
-err() { echo "error: $*" >&2; exit 1; }
-
-case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
-[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
-if [[ -n "$pre" ]]; then
-  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
-fi
-
-command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
-gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
-
-if [[ -z "$ref" ]]; then
-  err "missing --ref  (target=rust pushes the Rust package pin to that branch)"
-fi
-
-dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
-
-args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
-[[ -n "$pre" ]] && args+=(-f pre="$pre")
-[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
-
-echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
-gh workflow run release-alpha.yml "${args[@]}"
-
-echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
-run_id=""
-for _ in $(seq 1 30); do
-  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle \
-    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
-  [[ -n "$run_id" && "$run_id" != "null" ]] && break
-  sleep 2
-done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
-
-echo "==> Watching run ${run_id}"
-gh run watch "$run_id" --exit-status
-echo "==> Coordinator finished. The Rust crate publish runs as a SEPARATE release-plz.yml run - watch it in the Actions tab."
diff --git a/tasks/release/typescript.sh b/tasks/release/typescript.sh
deleted file mode 100755
index d7c8588ef..000000000
--- a/tasks/release/typescript.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env bash
-#MISE description="Publish the TypeScript EQL bindings for an EXISTING SQL alpha: dispatch release-alpha.yml (target=typescript) and watch"
-#USAGE flag "--version " help="Base SemVer, e.g. 3.0.0" default="3.0.0"
-#USAGE flag "--channel " help="Preview channel: alpha | beta | rc" default="alpha"
-#USAGE flag "--pre 
" help="Exact identity (e.g. 3.0.0-alpha.2), bypassing N derivation" default=""
-#USAGE flag "--ref " help="Git branch to dispatch against (must currently be AT the eql- commit)" default=""
-#USAGE flag "--dry-run" help="Resolve + verify + print plan; mutate nothing"
-
-set -euo pipefail
-
-# target=typescript publishes the TypeScript @cipherstash/eql package SAME-SOURCE
-# from an existing eql- SQL release: the branch must currently be AT
-# that release's commit (the coordinator guards branch-HEAD == SQL-tag-commit),
-# and the pin adds a metadata-only commit on top. Requires a BRANCH (the pin is
-# pushed).
-
-target="typescript"
-version="${usage_version:-3.0.0}"
-channel="${usage_channel:-alpha}"
-pre="${usage_pre:-}"
-ref="${usage_ref:-}"
-dry_run="${usage_dry_run:-false}"
-
-err() { echo "error: $*" >&2; exit 1; }
-
-case "$channel" in alpha|beta|rc) ;; *) err "invalid --channel '$channel' (expected: alpha | beta | rc)" ;; esac
-[[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || err "invalid --version '$version' (expected X.Y.Z)"
-if [[ -n "$pre" ]]; then
-  [[ "$pre" =~ ^[0-9]+\.[0-9]+\.[0-9]+-(alpha|beta|rc)\.[0-9]+$ ]] || err "invalid --pre '$pre' (expected X.Y.Z-(alpha|beta|rc).N)"
-fi
-
-command -v gh >/dev/null 2>&1 || err "gh CLI not found (https://cli.github.com)"
-gh auth status >/dev/null 2>&1 || err "gh is not authenticated; run 'gh auth login'"
-
-if [[ -z "$ref" ]]; then
-  err "missing --ref  (target=typescript pushes the TypeScript package pin to that branch)"
-fi
-
-dispatch_id="$(uuidgen 2>/dev/null || echo "$$-$RANDOM-$(date +%s)")"
-
-args=(--ref "$ref" -f target="$target" -f version="$version" -f channel="$channel" -f dispatch_id="$dispatch_id")
-[[ -n "$pre" ]] && args+=(-f pre="$pre")
-[[ "$dry_run" == "true" ]] && args+=(-f dry_run=true)
-
-echo "==> Dispatching release-alpha.yml (target=${target}, dispatch_id=${dispatch_id}) on ref ${ref}"
-gh workflow run release-alpha.yml "${args[@]}"
-
-echo "==> Locating the dispatched run by dispatch_id (unambiguous)"
-run_id=""
-for _ in $(seq 1 30); do
-  run_id=$(gh run list --workflow release-alpha.yml --event workflow_dispatch \
-    --json databaseId,displayTitle \
-    --jq "[.[] | select(.displayTitle | contains(\"${dispatch_id}\"))] | first | .databaseId")
-  [[ -n "$run_id" && "$run_id" != "null" ]] && break
-  sleep 2
-done
-[[ -n "$run_id" && "$run_id" != "null" ]] || err "could not find the dispatched run (dispatch_id=${dispatch_id})"
-
-echo "==> Watching run ${run_id}"
-gh run watch "$run_id" --exit-status
-echo "==> Coordinator finished. The TypeScript npm publish runs as a SEPARATE release-typescript.yml run - watch it in the Actions tab."

From 7d20b43abc16b382d88e0cc6113cbb2930c8c758 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 13:06:46 +1000
Subject: [PATCH 575/599] docs(release): replace alpha runbook with
 comprehensive release doc
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add docs/development/releasing.md — a single reference covering the whole
release architecture (one release.yml, both modes, four artifacts, one lockstep
version): production via changesets on main, prerelease/alpha on eql_v3, the
lockstep versioning mechanism (changesets -> sync-lockstep-versions.mjs ->
Cargo + bundled SQL), tag namespaces, the GITHUB_TOKEN inline-vs-dispatch model,
the changesets pre-mode footgun, and verify/smoke-test steps.

Delete docs/development/releasing-an-alpha.md: it was alpha-only and had gone
stale after the release.yml consolidation (referenced the deleted
verify-changelog job, server-side N derivation, and the coordinator). Repoint
CLAUDE.md, .changeset/README.md, and the superseded design-snapshot banners at
the new doc.
---
 .changeset/README.md                          |   2 +-
 CLAUDE.md                                     |   4 +-
 .../2026-07-04-release-tasks-design.md        |   2 +-
 ...07-04-release-tasks-implementation-plan.md |   2 +-
 docs/development/releasing-an-alpha.md        | 149 -------------
 docs/development/releasing.md                 | 206 ++++++++++++++++++
 6 files changed, 211 insertions(+), 154 deletions(-)
 delete mode 100644 docs/development/releasing-an-alpha.md
 create mode 100644 docs/development/releasing.md

diff --git a/.changeset/README.md b/.changeset/README.md
index a24ba3dbe..853b888a0 100644
--- a/.changeset/README.md
+++ b/.changeset/README.md
@@ -21,5 +21,5 @@ User-facing description of what changed and why.
 ```
 
 Prereleases (alpha/beta/rc) use changesets pre-mode; see
-`docs/development/releasing-an-alpha.md`. See
+`docs/development/releasing.md`. See
 https://github.com/changesets/changesets for the tool docs.
diff --git a/CLAUDE.md b/CLAUDE.md
index 11109eb29..345d2b54e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -212,7 +212,7 @@ EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style `
 
 **Cutting a release is scripted — don't hand-roll `gh release create`.** There are two paths:
 
-- **Prerelease:** use the unified `release.yml` workflow. On `main` it runs the production release path; on `eql_v3` it only publishes when the push is an explicit conventional release commit (`chore(release): ...`). Release-relevant work happens in CI, and prerelease runs still build SQL + docs + language packages in the same workflow. The npm package is published directly by `release.yml`; the Rust crate still publishes via `release-plz.yml` because crates.io Trusted Publishing needs that workflow entry point. Validate on a scratch branch before cutting a real prerelease — a package publish is irreversible. It deliberately does **not** touch `CHANGELOG.md` for prereleases (`[Unreleased]` stays put). Full runbook: **`docs/development/releasing-an-alpha.md`**.
+- **Prerelease:** use the unified `release.yml` workflow. On `main` it runs the production release path; on `eql_v3` it only publishes when the push is an explicit conventional release commit (`chore(release): ...`). Release-relevant work happens in CI, and prerelease runs still build SQL + docs + language packages in the same workflow. The npm package is published directly by `release.yml`; the Rust crate still publishes via `release-plz.yml` because crates.io Trusted Publishing needs that workflow entry point. Validate on a scratch branch before cutting a real prerelease — a package publish is irreversible. It deliberately does **not** touch `CHANGELOG.md` for prereleases (`[Unreleased]` stays put). Full reference: **`docs/development/releasing.md`**.
 - **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]` in `CHANGELOG.md`. Finals are cut from `main` through the unified `release.yml` (changesets versions/publishes, then the same run builds and attaches the SQL + docs release).
 
 The **language binding packages** are generated from the same `eql-domains::CATALOG` as the SQL surface: the **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) and the **`@cipherstash/eql` npm package** (published via npm Trusted Publishing from `release.yml`, tagged `eql-typescript-v`). Both bundle the exact self-contained SQL installer/uninstaller they were generated against (the crate exposes it as `eql_bindings::sql`; the npm package via its `./sql` subpath exports). Prerelease release commits on `eql_v3` carry the committed version and bundled SQL for the release; `release.yml` publishes that commit as the prerelease and then dispatches `release-plz.yml` for the crate. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the release commit must already carry the version pin.
@@ -260,7 +260,7 @@ The `eql_v3` PostgreSQL schema name is part of the public API and is **independe
 
 ### Cutting a release
 
-This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, cut a prerelease from the `eql_v3` branch via the unified `release.yml` workflow — push an explicit `chore(release): ...` commit that already pins the prerelease version in `packages/eql/package.json` — see the pointer at the top of this section and `docs/development/releasing-an-alpha.md`.
+This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, cut a prerelease from the `eql_v3` branch via the unified `release.yml` workflow — push an explicit `chore(release): ...` commit that already pins the prerelease version in `packages/eql/package.json` — see the pointer at the top of this section and `docs/development/releasing.md`.
 
 When a release is being prepared:
 
diff --git a/docs/development/2026-07-04-release-tasks-design.md b/docs/development/2026-07-04-release-tasks-design.md
index da9d6bda5..6cd90c685 100644
--- a/docs/development/2026-07-04-release-tasks-design.md
+++ b/docs/development/2026-07-04-release-tasks-design.md
@@ -5,7 +5,7 @@
 > below was never shipped. Releases now run through the single unified
 > `.github/workflows/release.yml` (production from `main` via changesets;
 > alpha/prerelease from `eql_v3` via a `chore(release): ...` commit). See
-> `docs/development/releasing-an-alpha.md` for the current process. This file is
+> `docs/development/releasing.md` for the current process. This file is
 > kept only as a point-in-time design snapshot.
 
 **Date:** 2026-07-04
diff --git a/docs/development/2026-07-04-release-tasks-implementation-plan.md b/docs/development/2026-07-04-release-tasks-implementation-plan.md
index 94f9e7922..2b25b3b62 100644
--- a/docs/development/2026-07-04-release-tasks-implementation-plan.md
+++ b/docs/development/2026-07-04-release-tasks-implementation-plan.md
@@ -3,7 +3,7 @@
 > **SUPERSEDED (historical record).** The `workflow_dispatch` coordinator with
 > `mise run release:*` targets and a `crate-publish`/`crate_tag` job described
 > below was never shipped. Releases now run through the single unified
-> `.github/workflows/release.yml`. See `docs/development/releasing-an-alpha.md`
+> `.github/workflows/release.yml`. See `docs/development/releasing.md`
 > for the current process. This file is kept only as a point-in-time snapshot.
 
 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
diff --git a/docs/development/releasing-an-alpha.md b/docs/development/releasing-an-alpha.md
deleted file mode 100644
index f006dd025..000000000
--- a/docs/development/releasing-an-alpha.md
+++ /dev/null
@@ -1,149 +0,0 @@
-# Releasing from `release.yml`
-
-A concise runbook for cutting a **prerelease** of the EQL SQL surface, its
-language binding packages (the `eql-bindings` crate and the `@cipherstash/eql`
-npm package), or all of them in lockstep. For a final (non-prerelease) release,
-follow the **"Cutting a release"** section of `CLAUDE.md` instead.
-
-## What ships
-
-Alpha releases ship the same EQL assets as final releases:
-
-| Artifact | What it installs |
-|----------|------------------|
-| `cipherstash-encrypt.sql` / `cipherstash-encrypt-uninstall.sql` | **The standalone, self-contained `eql_v3` surface** (no `eql_v2`) |
-| `eql-docs-*.zip` / `eql-docs-*.tar.gz` | Packaged API documentation |
-
-The CI-native release workflow (`.github/workflows/release.yml`) builds and
-attaches the SQL files and docs bundle **in the same workflow run**. On
-`eql_v3`, prerelease runs only proceed when the push is an explicit conventional
-release commit (`chore(release): ...`). This is intentional: releases created
-by the automatic `GITHUB_TOKEN` do not trigger follow-on release workflows, so
-the SQL/docs/package publish work has to happen in one release run.
-
-`cipherstash-encrypt.sql` is the only installer: it installs the `eql_v3`
-schema into a database with no `eql_v2` present. There is no separate
-`-supabase` or `-v3` artifact.
-
-## Why a prerelease is different
-
-The final-release `verify-changelog` job is gated to **real (non-prerelease)
-`eql-*` releases**:
-
-```yaml
-if: ${{ github.event_name == 'release' && contains(github.event.release.tag_name, 'eql') && github.event.release.prerelease == false }}
-```
-
-For a prerelease, do **not** promote `[Unreleased]` to `[]` in
-`CHANGELOG.md`. Entries stay under `## [Unreleased]` until a final release is
-cut.
-
-## CI-native release workflow
-
-Use `.github/workflows/release.yml` directly. It is the single release
-entrypoint:
-
-- `main` runs the production release path.
-- `eql_v3` runs the prerelease path only when the push commit is an explicit
-  conventional release marker such as `chore(release): ...`.
-- `workflow_dispatch` is available for manual testing on any ref.
-
-Release-relevant work happens in CI, not locally. For a prerelease test, push a
-marker commit on `eql_v3`, or dispatch the workflow manually against a branch
-that already contains the marker commit.
-
-Language binding package tags remain:
-
-- Rust: `eql-bindings-v`
-- TypeScript: `eql-typescript-v`
-
-The prerelease path publishes the npm package directly from `release.yml` and
-dispatches `release-plz.yml` for the Rust crate after SQL and docs are built.
-The release commit must already carry the prerelease package version and
-generated SQL/doc assets.
-
-Examples:
-
-```bash
-# Dispatch the unified release workflow on the prerelease branch.
-gh workflow run release.yml --ref eql_v3
-
-# Test the same release flow on a scratch branch that contains the marker commit.
-gh workflow run release.yml --ref 
-```
-
-## Identity and lockstep
-
-Prerelease identity is `-alpha.`, for example `3.0.0-alpha.2`.
-`release.yml` derives `N` server-side from freshly fetched tags across all
-three namespaces:
-
-- SQL tags: `eql-`
-- Rust tags: `eql-bindings-v`
-- TypeScript tags: `eql-typescript-v`
-
-The release identity is still `-alpha.` for prereleases. The
-workflow derives `N` from the relevant tags and validates that the prerelease
-version is already pinned in `packages/eql/package.json`.
-
-The workflow builds SQL and docs in the same run, publishes the npm package
-directly, and dispatches `release-plz.yml` for the crate so all release-facing
-artifacts come from the same source commit.
-
-## Coordinator checks
-
-Before mutating anything, `release.yml` validates the explicit release marker,
-fetches tags, derives the identity, and runs the drift gates:
-
-```bash
-mise run types:check
-mise run codegen:parity
-```
-
-For prereleases, the workflow rejects commits on `eql_v3` unless the commit
-subject is an explicit release marker. It also rejects prerelease commits whose
-package version is not already prerelease-shaped.
-
-## Verification note
-
-The durable PR gate is `.github/workflows/lint-release.yml`. It runs actionlint
-over the release workflows, ShellCheck over `tasks/release/prepare-bindings-assets.sh`,
-and the supply-chain cache guard (`lint:workflow-cache`) plus the script unit
-tests (`test:scripts`).
-
-The SQL-to-docs-to-publish ordering can be exercised safely only on a scratch
-branch, because a real package publish is irreversible. For a scratch
-validation, temporarily force the docs reusable to fail, dispatch
-`release.yml` against the prerelease branch, and confirm that no package
-publish is dispatched when docs attachment fails. Revert the scratch change
-before any real prerelease.
-
-## Smoke-test the alpha
-
-Install the standalone v3 surface into a clean database (no `eql_v2`) and confirm
-it loads:
-
-```bash
-gh release download eql-3.0.0-alpha.N -p 'cipherstash-encrypt.sql'
-psql "$DATABASE_URL" -f cipherstash-encrypt.sql
-psql "$DATABASE_URL" -c "\dn eql_v3"                 # eql_v3 schema present
-psql "$DATABASE_URL" -c "SELECT eql_v3.version();"   # released semver
-```
-
-For a lockstep release, also confirm all tags point at the same commit:
-
-```bash
-git fetch --tags
-git rev-list -n1 eql-3.0.0-alpha.N
-git rev-list -n1 eql-bindings-v3.0.0-alpha.N
-git rev-list -n1 eql-typescript-v3.0.0-alpha.N
-```
-
-## Promoting to a final release later
-
-When the alpha graduates to a real release, follow `CLAUDE.md` -> **"Cutting a
-release"**: rename `## [Unreleased]` to `## [] - YYYY-MM-DD`, add a
-fresh empty `[Unreleased]`, update the link references at the bottom of
-`CHANGELOG.md`, then cut a **non-prerelease** GitHub release whose body is the
-new versioned section verbatim. The `verify-changelog` job then enforces that
-the `## []` section exists at the tag.
diff --git a/docs/development/releasing.md b/docs/development/releasing.md
new file mode 100644
index 000000000..3e36d8d8d
--- /dev/null
+++ b/docs/development/releasing.md
@@ -0,0 +1,206 @@
+# EQL release process
+
+How EQL is released: one workflow, two modes, four artifacts, one version.
+
+## Architecture overview
+
+There is a **single release entrypoint**, `.github/workflows/release.yml`. Its
+`classify` job branches on the branch and the head commit:
+
+| Branch | Condition | Mode |
+|--------|-----------|------|
+| `main` | any push | **production** — final release via Changesets |
+| `eql_v3` | head commit subject is `chore(release): …` or `release: …` | **prerelease** — alpha/beta/rc |
+| anything else | — | `skip` |
+
+`workflow_dispatch` is available on any ref for manual testing.
+
+Every release — production or prerelease — publishes the same four artifacts at
+**one lockstep version `V`**, all from a single source commit:
+
+| Artifact | Where | Git tag |
+|----------|-------|---------|
+| SQL surface (`cipherstash-encrypt.sql` + uninstaller) + docs bundle | GitHub Release | `eql-V` |
+| `eql-bindings` Rust crate | crates.io | `eql-bindings-vV` |
+| `@cipherstash/eql` npm package | npmjs.com | `eql-typescript-vV` |
+| Postgres + EQL Docker image (production finals only) | `ghcr.io/cipherstash/postgres-eql` | image tags `:-V` |
+
+There is no separate coordinator workflow and no per-language release task. The
+old `release-alpha.yml` coordinator, `release-eql.yml`, and the `mise run
+release:*` dispatch tasks were removed when this consolidated onto `release.yml`.
+
+## Lockstep versioning
+
+`@cipherstash/eql`'s `package.json` **version is the single source of truth**
+for `V`. Everything else is derived from it, because the SQL surface, the crate,
+and the npm package are all generated from one catalog (`eql-domains::CATALOG`)
+at one commit.
+
+The root `version` script is the mechanism:
+
+```
+pnpm run version  ==  changeset version && node scripts/sync-lockstep-versions.mjs
+```
+
+1. `changeset version` consumes the pending `.changeset/*.md` files and bumps
+   `packages/eql/package.json` to the next `V`.
+2. `scripts/sync-lockstep-versions.mjs` reads that `V` and propagates it:
+   - sets `crates/eql-bindings/Cargo.toml` `[package] version = V`;
+   - runs `mise run release:prepare_bindings_assets --version V`, which builds
+     the **exact-version** SQL (`mise run build --version V`) and copies it —
+     plus a sha256 `release-manifest.json` — into both `crates/eql-bindings/sql/`
+     and `packages/eql/sql/`.
+
+The result is one "Version Packages" commit where `package.json`, `Cargo.toml`,
+and the bundled SQL all agree on `V`. release-plz later publishes the committed
+`Cargo.toml` version verbatim (it has no absolute-version config), so the commit
+must already carry the pin — which this script guarantees.
+
+**Because all three targets move together, every releasable change needs a
+changeset** — including SQL-only or crate-only changes. See `.changeset/README.md`.
+
+## Production release (`main`)
+
+Final releases use the standard two-step Changesets flow:
+
+1. **Merge feature PRs to `main`.** Each carries a changeset. On each push to
+   `main`, `release.yml`'s `release` job runs `changesets/action`, which opens or
+   updates a **"Version Packages" PR** (running `pnpm run version` above — the
+   lockstep bump).
+2. **Merge the "Version Packages" PR.** With no pending changesets left, the
+   `changesets/action` run instead executes `publish` (`pnpm run release` =
+   `pnpm run build && changeset publish`) and publishes `@cipherstash/eql` to
+   npm under the `latest` dist-tag (npm OIDC trusted publishing).
+
+When the publish succeeds, the rest of `release.yml` fans out on the same commit:
+
+- `build-sql` → creates and attaches the SQL installer/uninstaller to the
+  `eql-V` GitHub Release, and fires the Multitudes production-deploy
+  notification.
+- `build-docs` → attaches the `eql-docs-*` bundle.
+- `build-image` → dispatches `release-postgres-eql-image.yml` to build and push
+  the multi-arch Postgres + EQL images, including the floating `:latest` /
+  `:` / `:V` tags (production finals only).
+
+The **Rust crate** publishes in parallel: merging the Version PR is a push to
+`main`, which triggers `release-plz.yml` (publish-only — versioning is owned by
+Changesets, not release-plz). It publishes the committed `Cargo.toml` `V` to
+crates.io and tags `eql-bindings-vV`.
+
+### Cutting the changelog for a final release
+
+EQL keeps a Keep-a-Changelog `CHANGELOG.md`. When promoting to a final release,
+rename `## [Unreleased]` to `## [V] — YYYY-MM-DD`, add a fresh empty
+`[Unreleased]`, and update the link references at the bottom. See the
+**"Cutting a release"** section of `CLAUDE.md` for the changelog discipline.
+
+## Prerelease / alpha (`eql_v3`)
+
+Prereleases are cut from the `eql_v3` feature branch. Unlike the production path,
+the prerelease path does **not** run Changesets in CI — it publishes a version
+that is **already pinned** in the repo.
+
+1. **Enter pre-mode and pin the version locally.** Changesets pre-mode
+   (`.changeset/pre.json`, `mode: "pre"`, `tag: "alpha"`) is what makes
+   `changeset version` emit `X.Y.Z-alpha.N`. Run `changeset version` (which also
+   runs `sync-lockstep-versions.mjs`) so `packages/eql/package.json`,
+   `Cargo.toml`, and the bundled SQL all carry the prerelease identity.
+2. **Commit with the release marker and push to `eql_v3`.** The commit subject
+   must be `chore(release): …` (or `release: …`) — that marker is what
+   `classify` keys on. `classify` reads the version from `package.json` and
+   **rejects the run** if it is not prerelease-shaped (`*-*`).
+3. `release.yml` then runs the prerelease jobs:
+   - `prerelease-build-sql` / `prerelease-build-docs` → create the prerelease
+     `eql-V` GitHub Release with SQL + docs.
+   - `prerelease-publish-npm` → publishes `@cipherstash/eql@V` (dist-tag `alpha`
+     via `scripts/npm-publish.mjs`) and creates the `eql-typescript-vV` tag.
+     Both steps are idempotent (`npm view` / `git ls-remote` guards) so a rerun
+     after a partial failure converges.
+   - `prerelease-publish-rust` → dispatches `release-plz.yml --ref eql_v3` to
+     publish the crate and tag `eql-bindings-vV`.
+
+Prereleases **do not** promote `[Unreleased]` in `CHANGELOG.md` (entries stay
+put) and **do not** build the Docker image (floating tags must not move for an
+alpha; build one on demand via the image workflow's `workflow_dispatch`).
+
+```bash
+# Cut the prerelease (after the chore(release): commit is on eql_v3):
+gh workflow run release.yml --ref eql_v3
+
+# Dry-run the same flow on a scratch branch that contains the marker commit:
+gh workflow run release.yml --ref 
+```
+
+> **Footgun — exit pre-mode before a final release.** `.changeset/pre.json`
+> lives on `eql_v3`. If it reaches `main`, `changeset version` there will emit
+> alpha-suffixed "final" versions. Run `changeset pre exit` (and merge that)
+> before cutting a production release from `main`.
+
+## Artifacts & tag namespaces
+
+Three independent git tag families, all keyed to the same identity `V`:
+
+- **`eql-V`** (e.g. `eql-3.0.0`, `eql-3.0.0-alpha.2`) — the EQL **SQL surface**
+  GitHub Release (installer + uninstaller + docs bundle). Drives the Docker
+  image (production) and any `push: tags` consumers.
+- **`eql-bindings-vV`** — the **`eql-bindings` Rust crate** on crates.io.
+- **`eql-typescript-vV`** — the **`@cipherstash/eql` npm package**.
+
+The npm dist-tag is `latest` for finals and the channel name (`alpha` / `beta` /
+`rc`) for prereleases. Each language package bundles the **exact** self-contained
+SQL it was generated against (`eql_bindings::sql`; npm `./sql` subpath), so a
+consumer pins wire types and the matching DDL together.
+
+## The `GITHUB_TOKEN` dispatch model
+
+Why some steps run inline and others are dispatched: **a release or a tag created
+using the automatic `GITHUB_TOKEN` does not trigger downstream `on: release` /
+`on: push` workflows** — but a `workflow_dispatch` (or `repository_dispatch`)
+*initiated* by `GITHUB_TOKEN` **does**. So `release.yml`:
+
+- builds + attaches SQL and docs **inline** (reusable `_build-sql.yml` /
+  `_build-docs.yml`);
+- publishes npm **inline**;
+- **dispatches** the crate publish (`release-plz.yml`) and the Docker image
+  (`release-postgres-eql-image.yml`) via `gh workflow run`.
+
+In production the crate publish is triggered by the human merge of the Version PR
+(a real push to `main`), so release-plz runs from its own `on: push: main`. In
+the prerelease path, `release.yml` dispatches release-plz explicitly.
+
+Dispatched jobs are fire-and-forget: `release.yml` does not block on the
+release-plz or image runs — check them in the Actions tab.
+
+## Verify
+
+The durable PR gate is `.github/workflows/lint-release.yml`: actionlint over the
+release workflows, ShellCheck over `tasks/release/prepare-bindings-assets.sh`,
+and the supply-chain cache guard (`lint:workflow-cache`) plus the script unit
+tests (`test:scripts`). The generated-surface drift gates (`mise run
+types:check`, `mise run codegen:parity`) run in the main test workflow.
+
+Ordering guarantee — **a failed docs build blocks the package publish** — because
+`prerelease-publish-npm` (and `-rust`) `needs` the docs job. To validate on a
+scratch branch without a real publish: temporarily force the docs reusable to
+fail, dispatch `release.yml` against the scratch branch, and confirm no publish
+runs. Revert before any real release.
+
+### Smoke-test a release
+
+Install the standalone `eql_v3` surface into a clean database (no `eql_v2`):
+
+```bash
+gh release download eql-3.0.0-alpha.N -p 'cipherstash-encrypt.sql'
+psql "$DATABASE_URL" -f cipherstash-encrypt.sql
+psql "$DATABASE_URL" -c "\dn eql_v3"                 # eql_v3 schema present
+psql "$DATABASE_URL" -c "SELECT eql_v3.version();"   # released semver
+```
+
+Confirm the lockstep tags point at one commit:
+
+```bash
+git fetch --tags
+git rev-list -n1 eql-3.0.0-alpha.N
+git rev-list -n1 eql-bindings-v3.0.0-alpha.N
+git rev-list -n1 eql-typescript-v3.0.0-alpha.N
+```

From 25d0bd614a4a2721d294e27e106a05c94021c5a2 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 13:36:39 +1000
Subject: [PATCH 576/599] ci(release): harden Multitudes notify and pin image
 dispatch to the release tag

- Notify Multitudes (_build-sql.yml): add continue-on-error. It is the last
  step of build-sql and uses `curl --fail-with-body`; on the production path
  npm + SQL have already published upstream, so a Multitudes outage / empty
  token must not fail build-sql and skip build-docs / build-image.
- build-image (release.yml): dispatch release-postgres-eql-image.yml against
  the eql- tag instead of the branch. build-sql (a `needs`) already
  created that tag at the release commit, so pinning to it builds the image
  from the exact released source even if the branch advanced since publish.
---
 .github/workflows/_build-sql.yml | 5 +++++
 .github/workflows/release.yml    | 8 ++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/_build-sql.yml b/.github/workflows/_build-sql.yml
index cb26c52e7..bd5977978 100644
--- a/.github/workflows/_build-sql.yml
+++ b/.github/workflows/_build-sql.yml
@@ -107,7 +107,12 @@ jobs:
         # non-prerelease SQL release (attach + create path + not a prerelease).
         # release.yml runs on `push`, so the old `event_name == 'release'` gate
         # never matched under the unified workflow.
+        # continue-on-error: a deploy-tracking ping is not part of the release
+        # itself. If Multitudes is down / rate-limits / the token is empty, the
+        # curl failing must not fail build-sql and skip downstream build-docs /
+        # build-image after npm + SQL have already published.
         if: ${{ inputs.attach && !inputs.prerelease && inputs.target_commitish != '' }}
+        continue-on-error: true
         run: |
           curl --request POST \
             --fail-with-body \
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index a35990d9a..f3e7b548b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -191,13 +191,17 @@ jobs:
       actions: write
     steps:
       - name: Dispatch release-postgres-eql-image.yml
+        # Dispatch against the eql- tag, not the branch: build-sql
+        # (a `needs`) already created that tag at the release commit via
+        # _build-sql.yml's target_commitish, and the image workflow file exists
+        # at that commit. Pinning to the tag builds the image from the exact
+        # released source even if the branch has advanced since publish.
         env:
           GH_TOKEN: ${{ github.token }}
-          BRANCH: ${{ github.ref_name }}
           VERSION: ${{ needs.release.outputs.version }}
         run: |
           set -euo pipefail
-          gh workflow run release-postgres-eql-image.yml --ref "$BRANCH" \
+          gh workflow run release-postgres-eql-image.yml --ref "eql-${VERSION}" \
             -f eql_version="$VERSION" \
             -f update_floating_tags=true
 

From b8df5e4327bcbdac0dc60577daea6071a110b760 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 14:08:00 +1000
Subject: [PATCH 577/599] docs: make Changesets the canonical changelog +
 version owner

Way 2 is now canonical: contributors add a changeset (`.changeset/*.md`); Changesets
owns both the version bump and CHANGELOG.md generation. Retire the manual
`## [Unreleased]` promotion everywhere the docs still described it.

- CLAUDE.md "Release & changelog discipline": add a changeset (not a CHANGELOG.md
  entry); the entry is the changeset body; the bump type is the changeset
  frontmatter; "Cutting a release" is now the Changesets Version-PR flow.
- CHANGELOG.md preamble: state the file is Changesets-generated, not hand-edited.
- DEVELOPMENT.md "Releasing": replace the manual GitHub-release flow (and the
  stale release-eql.yml reference) with the release.yml + Changesets model.
- releasing.md: changelog section rewritten to the Changesets model; fix the
  prerelease changelog note.
- docs/upgrading/v3.0.md: drop the stale `[Unreleased]` phrasing.
---
 CHANGELOG.md                  |  4 +--
 CLAUDE.md                     | 47 ++++++++++++++++++++++-------------
 DEVELOPMENT.md                | 32 +++++++++++-------------
 docs/development/releasing.md | 22 ++++++++++------
 docs/upgrading/v3.0.md        |  2 +-
 5 files changed, 62 insertions(+), 45 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3f0df5e2b..4c94db32b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ All notable changes to EQL are recorded in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and EQL adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The `eql_v2` schema name is part of the public API and is independent of the EQL release version — bumping EQL's major version does not rename the schema.
 
-Tags follow `eql-` (e.g. `eql-2.3.0`); the GitHub release for that tag drives the release workflow.
+Tags follow `eql-` (e.g. `eql-2.3.0`); `release.yml` cuts the tag and its GitHub release.
 
 ## How to read this file
 
@@ -16,7 +16,7 @@ Tags follow `eql-` (e.g. `eql-2.3.0`); the GitHub release for that tag
 - **Security** — fixes that affect confidentiality, integrity, or availability.
 - **Upgrade notes** — for releases that change behaviour callers should be aware of (even when no API breaks), a pointer to `docs/upgrading/.md` with numbered notes (`U-NNN`) and a verification checklist.
 
-Each entry that ships in a published release links to the PR that introduced it. Unreleased work lives in the `[Unreleased]` section at the top; entries are promoted into a versioned section when a release is cut.
+This file is generated by [Changesets](https://github.com/changesets/changesets) from the `.changeset/*.md` files added in each PR — it is **not hand-edited**. Add a changeset for every releasable change (see `.changeset/README.md`); Changesets writes the versioned section, and links each entry to its PR, when a release is cut.
 
 ## [Unreleased]
 
diff --git a/CLAUDE.md b/CLAUDE.md
index 345d2b54e..5e253e2be 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -208,20 +208,24 @@ Prefer `LANGUAGE SQL` over `LANGUAGE plpgsql` unless you need procedural feature
 
 ## Release & changelog discipline
 
-EQL maintains a [Keep-a-Changelog](https://keepachangelog.com/en/1.1.0/)-style `CHANGELOG.md` and per-version upgrade guides under `docs/upgrading/`. The conventions are documented at the top of `CHANGELOG.md`; what follows is what to do when working in this repo.
+EQL's release version and `CHANGELOG.md` are both owned by **[Changesets](https://github.com/changesets/changesets)**. `@cipherstash/eql`'s package version is the single source of truth for the release identity `V` (SQL, the crate, and npm all ship at `V` — see `docs/development/releasing.md`), and `CHANGELOG.md` is **generated from the `.changeset/*.md` files** you add, not hand-edited. Per-version upgrade guides live under `docs/upgrading/`. What follows is what to do when working in this repo.
 
-**Cutting a release is scripted — don't hand-roll `gh release create`.** There are two paths:
+**Cutting a release is scripted — don't hand-roll `gh release create`, and don't hand-edit `CHANGELOG.md`.** The single entrypoint is `.github/workflows/release.yml`:
 
-- **Prerelease:** use the unified `release.yml` workflow. On `main` it runs the production release path; on `eql_v3` it only publishes when the push is an explicit conventional release commit (`chore(release): ...`). Release-relevant work happens in CI, and prerelease runs still build SQL + docs + language packages in the same workflow. The npm package is published directly by `release.yml`; the Rust crate still publishes via `release-plz.yml` because crates.io Trusted Publishing needs that workflow entry point. Validate on a scratch branch before cutting a real prerelease — a package publish is irreversible. It deliberately does **not** touch `CHANGELOG.md` for prereleases (`[Unreleased]` stays put). Full reference: **`docs/development/releasing.md`**.
-- **Final (non-prerelease) release:** follow **"Cutting a release"** below — this one *does* promote `[Unreleased]` → `[]` in `CHANGELOG.md`. Finals are cut from `main` through the unified `release.yml` (changesets versions/publishes, then the same run builds and attaches the SQL + docs release).
+- **Final (non-prerelease) release** — from `main`. Changesets maintains a "Version Packages" PR that bumps `V` **and writes the `CHANGELOG.md` section** from the pending changesets; merging that PR triggers `release.yml` to publish npm, publish the crate (via `release-plz.yml`, which crates.io Trusted Publishing requires as the entry point), and build + attach the `eql-` SQL + docs release.
+- **Prerelease (alpha/beta/rc)** — from `eql_v3`, via an explicit conventional release commit (`chore(release): ...`) that already pins the prerelease version (Changesets pre-mode). `release.yml` builds SQL + docs and publishes all language packages in one run. Validate on a scratch branch before cutting a real prerelease — a package publish is irreversible.
+
+Full reference for both: **`docs/development/releasing.md`**.
 
 The **language binding packages** are generated from the same `eql-domains::CATALOG` as the SQL surface: the **`eql-bindings` crate** (published to crates.io by **release-plz**, tagged `eql-bindings-v`) and the **`@cipherstash/eql` npm package** (published via npm Trusted Publishing from `release.yml`, tagged `eql-typescript-v`). Both bundle the exact self-contained SQL installer/uninstaller they were generated against (the crate exposes it as `eql_bindings::sql`; the npm package via its `./sql` subpath exports). Prerelease release commits on `eql_v3` carry the committed version and bundled SQL for the release; `release.yml` publishes that commit as the prerelease and then dispatches `release-plz.yml` for the crate. release-plz publishes the committed `Cargo.toml` version verbatim and has no absolute-version config, so the release commit must already carry the version pin.
 
 ### When you make a user-facing change
 
-If your PR adds, changes, removes, deprecates, or fixes anything observable to a caller — new function, new operator, behaviour change, error message change, performance characteristic that callers might notice (e.g. an index now engages), changed default — **add an entry under `## [Unreleased]` in `CHANGELOG.md` as part of the same PR.**
+If your PR adds, changes, removes, deprecates, or fixes anything observable to a caller — new function, new operator, behaviour change, error message change, performance characteristic that callers might notice (e.g. an index now engages), changed default — **add a changeset in the same PR** (`pnpm changeset`, or hand-write a `.changeset/.md`). Do **not** edit `CHANGELOG.md` directly — Changesets assembles it from changeset files at release time.
+
+Because SQL, the crate, and npm all release in lockstep at one version, **every releasable change needs a changeset** — including SQL-only or crate-only changes. See `.changeset/README.md`.
 
-User-facing means: someone outside EQL would care. If in doubt, add the entry; it's cheap.
+User-facing means: someone outside EQL would care. If in doubt, add the changeset; it's cheap.
 
 What does *not* need an entry:
 
@@ -231,13 +235,22 @@ What does *not* need an entry:
 - Documentation typo fixes
 - Doxygen comments
 
-### How to write the entry
+### How to write the changeset
+
+A changeset is a small markdown file: YAML frontmatter selecting the bump type, then the entry body.
 
-Pick the right section (`Added` / `Changed` / `Deprecated` / `Removed` / `Fixed` / `Security`). Lead with the user-visible fact, then a short "Why." explanation, then a PR link in parentheses. Match the tone and density of existing entries — a single dense paragraph per entry, not a bullet list.
+```md
+---
+'@cipherstash/eql': minor   # patch | minor | major — see Versioning below
+---
 
-Example entry (real entry from `2.3.0`):
+**Lead with the user-visible fact.** Then a short "Why." explanation. Match the tone
+and density of existing entries — a single dense paragraph, not a bullet list.
+```
+
+The body becomes the `CHANGELOG.md` entry; Changesets adds the version heading and the PR/commit link (don't add one by hand). Example body (adapted from `2.3.0`):
 
-> **`=`, `<>`, `~~` (`LIKE`), `~~*` (`ILIKE`) on `eql_v2_encrypted` are now inlinable SQL functions.** The planner can structurally match these operators against the documented functional indexes (`eql_v2.hmac_256(col)` for equality, `eql_v2.bloom_filter(col)` for `LIKE`/`ILIKE`), so bare-form queries (`WHERE col = $1`) engage the index without per-query rewriting. Previously these operators wrapped multi-branch PL/pgSQL bodies that the planner could not inline, forcing seq scans on Supabase / managed Postgres installations that lack operator-class indexes. ([#193](...), [#196](...))
+> **`=`, `<>`, `~~` (`LIKE`), `~~*` (`ILIKE`) on `eql_v2_encrypted` are now inlinable SQL functions.** The planner can structurally match these operators against the documented functional indexes (`eql_v2.hmac_256(col)` for equality, `eql_v2.bloom_filter(col)` for `LIKE`/`ILIKE`), so bare-form queries (`WHERE col = $1`) engage the index without per-query rewriting. Previously these operators wrapped multi-branch PL/pgSQL bodies that the planner could not inline, forcing seq scans on Supabase / managed Postgres installations that lack operator-class indexes.
 
 ### When a change warrants an upgrade note
 
@@ -258,14 +271,14 @@ The `eql_v3` PostgreSQL schema name is part of the public API and is **independe
 - **Minor (`2.x.0`)** — additive changes, behaviour changes that don't break the public API (signatures, schema name, payload format, operator names)
 - **Major (`3.0.0`)** — only for changes that break the public API. Do not reach for a major bump just because a behaviour change has wide blast radius — that's what upgrade notes are for.
 
+Declare the chosen bump in your changeset's frontmatter (`'@cipherstash/eql': patch|minor|major`). Changesets aggregates all pending changesets to compute the next `V`, which `sync-lockstep-versions.mjs` then propagates to the crate and the bundled SQL.
+
 ### Cutting a release
 
-This section is for **final (non-prerelease) releases**. For an alpha/beta/rc, cut a prerelease from the `eql_v3` branch via the unified `release.yml` workflow — push an explicit `chore(release): ...` commit that already pins the prerelease version in `packages/eql/package.json` — see the pointer at the top of this section and `docs/development/releasing.md`.
+Releases are cut by **Changesets**, not by hand — see **`docs/development/releasing.md`** for the full runbook (production and prerelease). In short, for a final release from `main`:
 
-When a release is being prepared:
+1. Ensure the work to release has merged to `main`, each PR carrying a changeset.
+2. Changesets maintains a **"Version Packages" PR** that bumps `V` and writes the `CHANGELOG.md` section from the pending changesets. Review it.
+3. Merge that PR. `release.yml` then publishes npm, dispatches the crate publish, and builds + attaches the `eql-` SQL + docs release automatically.
 
-1. Confirm `[Unreleased]` is non-empty and entries are coherent.
-2. Rename `## [Unreleased]` to `## [] — YYYY-MM-DD` and add a fresh empty `[Unreleased]` above it.
-3. Update the link references at the bottom of `CHANGELOG.md` (new `[Unreleased]` compare URL, new `[]` tag URL).
-4. Commit to `main`. The unified `release.yml` workflow publishes the release and builds + attaches the SQL + docs artefacts to the `eql-` release it creates.
-5. The `[]` section is the GitHub release body — paste it verbatim.
+Do not hand-edit `CHANGELOG.md` or create the GitHub release manually — Changesets and `release.yml` own all of it.
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 291f0438a..2b351ae03 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -402,23 +402,21 @@ generation tasks (`mise run docs:generate`).
 
 ## Releasing
 
-To cut a [release](https://github.com/cipherstash/encrypt-query-language/releases) of EQL:
-
-1. Draft a [new release](https://github.com/cipherstash/encrypt-query-language/releases/new) on GitHub.
-1. Choose a tag, and create a new one with the prefix `eql-` followed by a
-   [semver](https://semver.org/) (for example, `eql-1.2.3`).
-1. Generate the release notes.
-1. Optionally set the release to be the latest (you can mark a release as latest
-   later if you are testing it first).
-1. Click `Publish release`.
-
-This triggers the
-[Release EQL](https://github.com/cipherstash/encrypt-query-language/actions/workflows/release-eql.yml)
-workflow, which builds and attaches artifacts to the release.
-
-See `CHANGELOG.md` and `docs/upgrading/` for changelog and upgrade-note
-discipline — user-facing changes need a `## [Unreleased]` changelog entry in the
-same PR, and behaviour callers should be aware of needs a numbered upgrade note.
+EQL releases through a single workflow, `.github/workflows/release.yml`, driven
+by **[Changesets](https://github.com/changesets/changesets)** — you do not create
+GitHub releases by hand. Finals are cut from `main` (merge the Changesets
+"Version Packages" PR); prereleases from `eql_v3` (an explicit `chore(release):`
+commit). `release.yml` builds and attaches the SQL + docs artifacts, publishes
+the `@cipherstash/eql` npm package and the `eql-bindings` crate, and creates the
+`eql-` release — all at one lockstep version.
+
+For the full runbook and release architecture, see
+**[`docs/development/releasing.md`](./docs/development/releasing.md)**.
+
+User-facing changes need a **changeset** in the same PR (`pnpm changeset`) —
+Changesets assembles `CHANGELOG.md` and computes the version from these files, so
+do not hand-edit `CHANGELOG.md`. Behaviour callers should be aware of also needs
+a numbered upgrade note under `docs/upgrading/`.
 
 #### Public documentation updates
 
diff --git a/docs/development/releasing.md b/docs/development/releasing.md
index 3e36d8d8d..2b7a40f03 100644
--- a/docs/development/releasing.md
+++ b/docs/development/releasing.md
@@ -87,12 +87,16 @@ The **Rust crate** publishes in parallel: merging the Version PR is a push to
 Changesets, not release-plz). It publishes the committed `Cargo.toml` `V` to
 crates.io and tags `eql-bindings-vV`.
 
-### Cutting the changelog for a final release
+### Changelog
 
-EQL keeps a Keep-a-Changelog `CHANGELOG.md`. When promoting to a final release,
-rename `## [Unreleased]` to `## [V] — YYYY-MM-DD`, add a fresh empty
-`[Unreleased]`, and update the link references at the bottom. See the
-**"Cutting a release"** section of `CLAUDE.md` for the changelog discipline.
+`CHANGELOG.md` is owned by **Changesets** — it is generated from the
+`.changeset/*.md` files, not hand-edited. Every releasable change adds a
+changeset (`pnpm changeset`): its frontmatter selects the bump
+(`patch`/`minor`/`major`) and its body becomes the entry. `changeset version`
+(run in the "Version Packages" PR for finals, and locally in pre-mode when
+pinning a prerelease) writes the versioned section and computes `V`. See
+`.changeset/README.md` and the **"Release & changelog discipline"** section of
+`CLAUDE.md`.
 
 ## Prerelease / alpha (`eql_v3`)
 
@@ -119,9 +123,11 @@ that is **already pinned** in the repo.
    - `prerelease-publish-rust` → dispatches `release-plz.yml --ref eql_v3` to
      publish the crate and tag `eql-bindings-vV`.
 
-Prereleases **do not** promote `[Unreleased]` in `CHANGELOG.md` (entries stay
-put) and **do not** build the Docker image (floating tags must not move for an
-alpha; build one on demand via the image workflow's `workflow_dispatch`).
+Prereleases keep the pending changesets **unconsumed** — Changesets pre-mode
+emits a `X.Y.Z-alpha.N` entry but the changesets are only finalized into the
+release section when the final version is cut — and **do not** build the Docker
+image (floating tags must not move for an alpha; build one on demand via the
+image workflow's `workflow_dispatch`).
 
 ```bash
 # Cut the prerelease (after the chore(release): commit is on eql_v3):
diff --git a/docs/upgrading/v3.0.md b/docs/upgrading/v3.0.md
index 7772cf6cb..c592f09eb 100644
--- a/docs/upgrading/v3.0.md
+++ b/docs/upgrading/v3.0.md
@@ -2,7 +2,7 @@
 
 `3.0.0` is a breaking release. This guide currently covers the `eql_v3`
 envelope-version bump; the release owner extends it with notes for the other
-`[Unreleased]` breaking changes (notably the `eql_v2` schema removal) as the
+pending breaking changes (notably the `eql_v2` schema removal) as the
 release is prepared.
 
 ## TL;DR

From b8d796bf2b3008d44a565d4bc76caded2e1ef9fb Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 14:29:41 +1000
Subject: [PATCH 578/599] docs(changelog): backfill pending [Unreleased]
 entries into changesets
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Migrate the hand-written CHANGELOG.md `## [Unreleased]` block (the pending 3.0.0
notes) into 33 Changesets files, so Changesets — now the canonical owner —
generates the release section. De-duplicated in the process:

- dropped 6 exact duplicates and 7 stale pre-rename duplicates (the scalar types
  were renamed int4->integer, int2->smallint, int8->bigint, bool->boolean,
  float4->real, float8->double; both old- and new-name entries were present).
- bump per entry by nature: 4 major (eql_v2 removed, envelope v:3, eql_v3_internal
  move, sole installer), 24 minor, 5 patch -> aggregate resolves to 3.0.0.
- full dense prose + PR links preserved verbatim in each changeset body.

Remove the `[Unreleased]` block and its compare-URL link reference from
CHANGELOG.md; historical `## [2.x.y]` sections are untouched. `changeset status`
confirms a major bump for @cipherstash/eql.
---
 .changeset/eql-239-2.md                     | 5 +++++
 .changeset/eql-239-3.md                     | 5 +++++
 .changeset/eql-239.md                       | 5 +++++
 .changeset/eql-241-2.md                     | 5 +++++
 .changeset/eql-241.md                       | 5 +++++
 .changeset/eql-243.md                       | 5 +++++
 .changeset/eql-252.md                       | 5 +++++
 .changeset/eql-253.md                       | 5 +++++
 .changeset/eql-255.md                       | 5 +++++
 .changeset/eql-256.md                       | 5 +++++
 .changeset/eql-257.md                       | 5 +++++
 .changeset/eql-260.md                       | 5 +++++
 .changeset/eql-262.md                       | 5 +++++
 .changeset/eql-267-2.md                     | 5 +++++
 .changeset/eql-267.md                       | 5 +++++
 .changeset/eql-293.md                       | 5 +++++
 .changeset/eql-295.md                       | 5 +++++
 .changeset/eql-299.md                       | 5 +++++
 .changeset/eql-307.md                       | 5 +++++
 .changeset/eql-336.md                       | 5 +++++
 .changeset/eql-340-2.md                     | 5 +++++
 .changeset/eql-340.md                       | 5 +++++
 .changeset/eql-341.md                       | 5 +++++
 .changeset/eql-349.md                       | 5 +++++
 .changeset/eql-350.md                       | 5 +++++
 .changeset/eql-353.md                       | 5 +++++
 .changeset/eql-354.md                       | 5 +++++
 .changeset/eql-internal-schema.md           | 5 +++++
 .changeset/eql-language-binding-releases.md | 5 +++++
 .changeset/eql-lints-schema-placement.md    | 5 +++++
 .changeset/eql-sole-installer.md            | 5 +++++
 .changeset/eql-v2-removed.md                | 5 +++++
 .changeset/eql-version-fn.md                | 5 +++++
 CHANGELOG.md                                | 1 -
 34 files changed, 165 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/eql-239-2.md
 create mode 100644 .changeset/eql-239-3.md
 create mode 100644 .changeset/eql-239.md
 create mode 100644 .changeset/eql-241-2.md
 create mode 100644 .changeset/eql-241.md
 create mode 100644 .changeset/eql-243.md
 create mode 100644 .changeset/eql-252.md
 create mode 100644 .changeset/eql-253.md
 create mode 100644 .changeset/eql-255.md
 create mode 100644 .changeset/eql-256.md
 create mode 100644 .changeset/eql-257.md
 create mode 100644 .changeset/eql-260.md
 create mode 100644 .changeset/eql-262.md
 create mode 100644 .changeset/eql-267-2.md
 create mode 100644 .changeset/eql-267.md
 create mode 100644 .changeset/eql-293.md
 create mode 100644 .changeset/eql-295.md
 create mode 100644 .changeset/eql-299.md
 create mode 100644 .changeset/eql-307.md
 create mode 100644 .changeset/eql-336.md
 create mode 100644 .changeset/eql-340-2.md
 create mode 100644 .changeset/eql-340.md
 create mode 100644 .changeset/eql-341.md
 create mode 100644 .changeset/eql-349.md
 create mode 100644 .changeset/eql-350.md
 create mode 100644 .changeset/eql-353.md
 create mode 100644 .changeset/eql-354.md
 create mode 100644 .changeset/eql-internal-schema.md
 create mode 100644 .changeset/eql-language-binding-releases.md
 create mode 100644 .changeset/eql-lints-schema-placement.md
 create mode 100644 .changeset/eql-sole-installer.md
 create mode 100644 .changeset/eql-v2-removed.md
 create mode 100644 .changeset/eql-version-fn.md

diff --git a/.changeset/eql-239-2.md b/.changeset/eql-239-2.md
new file mode 100644
index 000000000..64314a7d6
--- /dev/null
+++ b/.changeset/eql-239-2.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239))
diff --git a/.changeset/eql-239-3.md b/.changeset/eql-239-3.md
new file mode 100644
index 000000000..4f1611ecd
--- /dev/null
+++ b/.changeset/eql-239-3.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': patch
+---
+
+**`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.integer_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239))
diff --git a/.changeset/eql-239.md b/.changeset/eql-239.md
new file mode 100644
index 000000000..e41ebbee5
--- /dev/null
+++ b/.changeset/eql-239.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3` encrypted-domain schema, with the `integer` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `integer` columns: `eql_v3.integer` (storage-only), `eql_v3.integer_eq` (`=` / `<>` via HMAC), and `eql_v3.integer_ord` / `eql_v3.integer_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225))
diff --git a/.changeset/eql-241-2.md b/.changeset/eql-241-2.md
new file mode 100644
index 000000000..9323d9147
--- /dev/null
+++ b/.changeset/eql-241-2.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': patch
+---
+
+**The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamp` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276))
diff --git a/.changeset/eql-241.md b/.changeset/eql-241.md
new file mode 100644
index 000000000..c2c17591b
--- /dev/null
+++ b/.changeset/eql-241.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.numeric` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `numeric` / `decimal` columns — `eql_v3.numeric` (storage-only), `eql_v3.numeric_eq` (`=` / `<>` via HMAC), and `eql_v3.numeric_ord` / `eql_v3.numeric_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 14-block ORE) — generated from the `numeric` row in `eql-scalars::CATALOG`. cipherstash encrypts `Plaintext::Decimal` at native 14-block ORE width; ordering matches `rust_decimal::Decimal` ordering exactly (equivalent scales such as `1` and `1.0` collide, like Postgres `numeric`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors. Why: a type-safe, ordered encrypted decimal column, the first scalar to exercise an ORE term wider than 8 blocks. ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276))
diff --git a/.changeset/eql-243.md b/.changeset/eql-243.md
new file mode 100644
index 000000000..f52ab8229
--- /dev/null
+++ b/.changeset/eql-243.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.smallint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `smallint` columns — `eql_v3.smallint` (storage-only), `eql_v3.smallint_eq` (`=` / `<>` via HMAC), and `eql_v3.smallint_ord` / `eql_v3.smallint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `smallint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `integer` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243))
diff --git a/.changeset/eql-252.md b/.changeset/eql-252.md
new file mode 100644
index 000000000..d8128084e
--- /dev/null
+++ b/.changeset/eql-252.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`integer`, `bigint`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252))
diff --git a/.changeset/eql-253.md b/.changeset/eql-253.md
new file mode 100644
index 000000000..7c1068fe1
--- /dev/null
+++ b/.changeset/eql-253.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.bigint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `bigint` columns — `eql_v3.bigint` (storage-only), `eql_v3.bigint_eq` (`=` / `<>` via HMAC), and `eql_v3.bigint_ord` / `eql_v3.bigint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `bigint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253))
diff --git a/.changeset/eql-255.md b/.changeset/eql-255.md
new file mode 100644
index 000000000..dda254d65
--- /dev/null
+++ b/.changeset/eql-255.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255))
diff --git a/.changeset/eql-256.md b/.changeset/eql-256.md
new file mode 100644
index 000000000..8ceef6bf3
--- /dev/null
+++ b/.changeset/eql-256.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256))
diff --git a/.changeset/eql-257.md b/.changeset/eql-257.md
new file mode 100644
index 000000000..bbf8db9ef
--- /dev/null
+++ b/.changeset/eql-257.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.timestamp` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `timestamp` columns — `eql_v3.timestamp` (storage-only), `eql_v3.timestamp_eq` (`=` / `<>` via HMAC), and `eql_v3.timestamp_ord` / `eql_v3.timestamp_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 12-block ORE) — generated from the `timestamp` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast, so the stored value is a UTC instant (Postgres `timestamp with time zone`) wearing the SQL-standard name `timestamp` to match the cipherstash cast / `ColumnType::Timestamp` / `Plaintext::Timestamp` convention. Ordering works because the `eql_v3` ORE block comparator now derives its block count from the ciphertext width (see the comparator entry below) instead of assuming 8. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257))
diff --git a/.changeset/eql-260.md b/.changeset/eql-260.md
new file mode 100644
index 000000000..6363cb050
--- /dev/null
+++ b/.changeset/eql-260.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260))
diff --git a/.changeset/eql-262.md b/.changeset/eql-262.md
new file mode 100644
index 000000000..0286c6559
--- /dev/null
+++ b/.changeset/eql-262.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': patch
+---
+
+**An empty ORE term (`ob: []`) is now rejected by the ORE-bearing `eql_v3` domains instead of silently corrupting ordered queries.** Encrypting the empty string `""` as ordered text produces an empty ORE term (`ob: []`) — the only value that does — and previously an `""` row silently dropped out of `ORDER BY`, was wrongly returned by `eql_v3.max`, and threw off range-query counts (the `eql_v3.ore_block_256` extractor collapsed `ob: []` to NULL index terms). The ORE-bearing domains (`_ord` / `_ord_ore`, and text `_search`) now carry a `CHECK` requiring `ob` to be a non-empty array, so casting or inserting an empty-`ob` payload into an ordered column fails loudly with a check violation (SQLSTATE `23514`) rather than producing an unorderable row. This affects only the empty string in an ordered column: every non-empty string and every fixed-width scalar (int / date / numeric / float) always produces a non-empty `ob`. Storage and equality are unaffected — `""` can still be encrypted into a storage-only (`eql_v3.text`) or equality (`eql_v3.text_eq`) column with a real ciphertext (`c`) and HMAC (`hm`). As defense-in-depth for any path that bypasses the domain (e.g. a comparator composite built directly), the comparator also orders a zero-term ORE composite before every non-empty value (empty sorts first); a genuine SQL `NULL` row is unchanged and keeps standard `NULLS FIRST` / `NULLS LAST` semantics (the extractor is `STRICT`). ([#262](https://github.com/cipherstash/encrypt-query-language/issues/262))
diff --git a/.changeset/eql-267-2.md b/.changeset/eql-267-2.md
new file mode 100644
index 000000000..fd33f59e5
--- /dev/null
+++ b/.changeset/eql-267-2.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.jsonb_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267))
diff --git a/.changeset/eql-267.md b/.changeset/eql-267.md
new file mode 100644
index 000000000..12e401e9f
--- /dev/null
+++ b/.changeset/eql-267.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.jsonb_entry` (a single sv element) and `eql_v3.jsonb_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267))
diff --git a/.changeset/eql-293.md b/.changeset/eql-293.md
new file mode 100644
index 000000000..afe04e3f8
--- /dev/null
+++ b/.changeset/eql-293.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`smallint`/`integer`/`bigint`/`date`/`timestamp`/`numeric`/`text`). Equality across two independent encryptions of one value is exercised credential-free by the fixture suite via committed per-type *doubles* fixtures (each plaintext encrypted twice — `property::cross_ciphertext`), through both the `hm` (`_eq`) and ORE (`_ord`/`_ord_ore`) equality paths, and additionally by the e2e suite via fresh duplicate plaintexts each run. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293))
diff --git a/.changeset/eql-295.md b/.changeset/eql-295.md
new file mode 100644
index 000000000..603f95e44
--- /dev/null
+++ b/.changeset/eql-295.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.boolean` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `boolean` columns — `eql_v3.boolean` — generated from the `boolean` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `boolean` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295))
diff --git a/.changeset/eql-299.md b/.changeset/eql-299.md
new file mode 100644
index 000000000..02a33c8d6
--- /dev/null
+++ b/.changeset/eql-299.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.real` / `eql_v3.double` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.real` / `eql_v3.double` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `real` / `double` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `real` vs `double` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `bigint`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299))
diff --git a/.changeset/eql-307.md b/.changeset/eql-307.md
new file mode 100644
index 000000000..ad78eed04
--- /dev/null
+++ b/.changeset/eql-307.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307))
diff --git a/.changeset/eql-336.md b/.changeset/eql-336.md
new file mode 100644
index 000000000..3bacf6b6c
--- /dev/null
+++ b/.changeset/eql-336.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3` encrypted-JSONB (SteVec) payload bindings — Rust, TypeScript, and JSON Schema.** JSONB is now a first-class member of `eql-domains::CATALOG`, so its payload types ship as canonical, drift-gated bindings alongside the scalar families: `SteVecDocument` (`eql_v3.json`), `SteVecEntry` (`eql_v3.jsonb_entry`), `SteVecQuery` (`eql_v3.jsonb_query`), plus the shared untagged `SteVecTerm` (`{hm} | {oc}`), `SteVecQueryEntry`, and the `OreCllw` / `Selector` term newtypes — under `crates/eql-bindings/src/v3/jsonb.rs`, `bindings/v3/*.ts`, and `schema/v3/*.json`, drift-gated by `types:check`. A new `Shape` discriminant on each catalog domain lets scalar-only consumers filter and all-family consumers branch; the SteVec struct bodies and the encrypted-JSONB SQL surface stay hand-written (the generator skips SteVec shapes but still drives the bindings inventory). The bindings are parsed against a real generated SteVec ciphertext row in the SQLx suite, tying them to real crypto and the SQL domain CHECK. Why: the SteVec wire types were the only `eql_v3` payloads without generated, drift-gated bindings — protocol consumers (`cipherstash-client`, `protect-ffi`, CipherStash Proxy) can now depend on canonical, catalog-checked encrypted-JSONB types. ([#336](https://github.com/cipherstash/encrypt-query-language/pull/336))
diff --git a/.changeset/eql-340-2.md b/.changeset/eql-340-2.md
new file mode 100644
index 000000000..df4d681d9
--- /dev/null
+++ b/.changeset/eql-340-2.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': major
+---
+
+**The `eql_v3` tier's JSON envelope version is now `v: 3` (was `v: 2`).** Every `eql_v3` domain CHECK — the generated scalar families and the hand-written `eql_v3.json` SteVec document domain — now pins `VALUE->>'v' = '3'`, and the canonical payload bindings (`SchemaVersion` in `eql-bindings`, the emitted TypeScript alias, and the JSON Schema `const`) accept exactly `3`, rejecting the legacy `2` at the type boundary. The v3 tier previously carried the v2 wire version for continuity; with the tier now diverging from the legacy wire (the new `op` term), the envelope version matches the schema generation. The legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json` and its validation tests) is unchanged and stays `v: 2`. **Compatibility:** payloads produced for the v3 tier must now carry `v: 3` — a cipherstash-client that emits `v: 2` cannot insert into `eql_v3` domain columns until it is updated to emit the v3 envelope. See [U-001](docs/upgrading/v3.0.md#u-001-eql_v3-payloads-carry-v-3) in the 3.0 upgrade guide. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340))
diff --git a/.changeset/eql-340.md b/.changeset/eql-340.md
new file mode 100644
index 000000000..c59a31569
--- /dev/null
+++ b/.changeset/eql-340.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3._ord_ope` encrypted-domain variants — CLLW-OPE ordering across every ordered scalar family.** Every ordered scalar family (`int2`, `int4`, `int8`, `date`, `timestamp`, `numeric`, `text`, `float4`, `float8`) gains an `_ord_ope` domain backed by a new CLLW-OPE index term: the `op` payload key carries a hex-encoded OPE ciphertext that is order-preserving under plain byte comparison, so ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) reduces to hex-decode + native bytea comparison via the new self-contained SEM type `eql_v3_internal.ope_cllw` — no custom N-block comparison protocol, unlike the `_ord` / `_ord_ore` block-ORE domains. Integer-family `_ord_ope` domains carry `[op]` alone (OPE equality is lossless for them); `text_ord_ope` carries `[hm, op]` so `=` / `<>` stay exact via HMAC (OPE over text is not equality-lossless, matching `text_ord`). Index via a functional btree index on the new `eql_v3.ord_ope_term(col)` extractor (its `eql_v3_internal.ope_cllw` return type is a domain over `bytea`, inheriting the native comparison operators and DEFAULT btree opclass — the whole comparison chain stays inlinable, so the index engages structurally), not an operator class on the domain. This revives the v2.2-era `opf` / `opv` order-preserving terms under the modern single `op` wire key that cipherstash-client re-emits for ordered scalars (CIP-3280). Rust / TypeScript / JSON Schema payload bindings (`Int4OrdOpe`, `TextOrdOpe`, … with the `OpeCllw` term newtype) ship alongside, drift-gated by `types:check`. `bool` stays storage-only, and the combined `text_search` domain deliberately stays `[hm, ob, bf]` — adding `op` to its CHECK would widen it for no new operator capability (OPE's operators are already covered via `Ore`); with the pinned client now emitting `op` (0.38.1, CIP-3348) this is a standing design decision to revisit separately. Why: OPE terms are natively index-sortable, giving ordered encrypted columns a cheaper comparison path than the block-ORE protocol. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340))
diff --git a/.changeset/eql-341.md b/.changeset/eql-341.md
new file mode 100644
index 000000000..8e1ba0f02
--- /dev/null
+++ b/.changeset/eql-341.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_bindings::from_v2` — EQL v2.3 → v3 wire payload conversion.** The `eql-bindings` crate gains a converter from the v2.3 payloads cipherstash-client emits (reference contract: `docs/reference/schema/eql-payload-v2.3.schema.json`) into `eql_v3` payloads: `from_v2(v2, target)` for stored scalar (`k:"ct"`) and SteVec (`k:"sv"`) payloads, `from_v2_query(v2, target)` for the jsonb containment needle (→ the `eql_v3.jsonb_query` shape, normalized like `eql_v3.to_ste_vec_query`), and `is_v3_payload` as a lenient envelope probe for format sniffing. The target domain is explicit input — every v2 index term is optional on the wire, so capability cannot be inferred — and `TargetDomain::parse` resolves names against the catalog-generated inventory (via the new `DomainType::term_json_keys`), so accepted names and required term keys cannot drift from `eql-domains::CATALOG`. Conversion copies `i`/`c` verbatim, emits `v: 3`, copies exactly the term keys the target requires (failing closed with `MissingTerm` otherwise), drops `k` and unneeded terms (SteVec documents instead keep `k: "sv"` — the v3 document models the form discriminator), and reinterprets `bf` from v2's unsigned bit positions into the signed `smallint[]` representation (`32768..=65535` wrap negative; beyond is `BloomOutOfRange`); SteVec `sv` entry order is preserved verbatim because `sv[0]` carries the record ciphertext downstream decryption depends on. Every output is validated through the target's binding struct before being returned, and representative conversions are validated against the published JSON Schemas in `crates/eql-bindings/schema/v3/` by the `test:schema` suite. Scalar QUERY targets return `UnsupportedQueryTarget`: no v3 scalar query wire shape exists (every scalar domain CHECK requires `c`), and none is invented ahead of the mapper redesign. Why: protect-ffi, the benches, and potentially Proxy need a single, fail-closed upgrade path from the v2 wire while cipherstash-client still emits it. ([#341](https://github.com/cipherstash/encrypt-query-language/pull/341))
diff --git a/.changeset/eql-349.md b/.changeset/eql-349.md
new file mode 100644
index 000000000..9b9957aae
--- /dev/null
+++ b/.changeset/eql-349.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349))
diff --git a/.changeset/eql-350.md b/.changeset/eql-350.md
new file mode 100644
index 000000000..243b7ac34
--- /dev/null
+++ b/.changeset/eql-350.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350))
diff --git a/.changeset/eql-353.md b/.changeset/eql-353.md
new file mode 100644
index 000000000..2210fb2bd
--- /dev/null
+++ b/.changeset/eql-353.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': patch
+---
+
+**`ore_block_256` opclass-path helpers converted from `LANGUAGE sql` to plpgsql — restores v2-level ordered-scan performance.** `eql_v3_internal.jsonb_array_to_bytea_array` and `eql_v3_internal.jsonb_array_to_ore_block_256` were `LANGUAGE sql` for inlineability, but their only caller chain (`ore_block_256(val)`, plpgsql, feeding the btree operator class) can never inline SQL functions — every compared value paid the per-call SQL-function executor instead, measured at 3.5× the per-call cost of the logic-identical plpgsql form. Release benchmarks put the end-to-end cost at +43% on ORE ordered index scans vs EQL 2.3 (`0.513 → 0.736 ms` at 1M rows) and +36% on the composite bloom+ORE-order shape (`16.6 → 22.7 ms`); with the plpgsql form both scenarios return to (or beat) the v2 numbers — `0.553 ms` and `13.97 ms` respectively, validated A→B→A on a live 1M-row bench database. Semantics are unchanged: NULL/non-array inputs still return NULL, and the empty-`ob` COALESCE (#262) is preserved. The `eql-inline-critical` markers are retained so the pin_search_path pass keeps both functions unpinned — a `SET search_path` clause on plpgsql forces per-call configuration switching in the same hot path. Full attribution and experiment data: cipherstash/benches#23 (`v3-regressions-report.md`). ([#353](https://github.com/cipherstash/encrypt-query-language/issues/353))
diff --git a/.changeset/eql-354.md b/.changeset/eql-354.md
new file mode 100644
index 000000000..bac36dab0
--- /dev/null
+++ b/.changeset/eql-354.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': patch
+---
+
+**`eql_v3.jsonb_entry` CHECK inlined; `jsonb_query` validator converted to plpgsql — removes SQL-function-executor overhead from the per-query needle casts.** Domain constraints cannot inline SQL functions, so `jsonb_entry`'s function-call CHECK paid ~18 µs on every cast — the needle cast in every `field_eq` query was the ENTIRE +19% v2→v3 regression on that scenario (in-DB 0.011 → 0.029 ms/query with identical `eq_term` costs; cipherstash/benches#23). The `jsonb_entry` CHECK now mirrors the validator body inline, with a leading `VALUE IS NULL OR` preserving STRICT NULL-passes semantics (equivalence pinned over a payload corpus by `jsonb_check::jsonb_entry_check_matches_validator`). `jsonb_query`'s CHECK cannot be inlined — validating sv elements needs a subquery, which CHECK constraints forbid — so `is_valid_ste_vec_query_payload` is plpgsql instead (cached plan vs per-call SQL-function executor; the #353 finding), guarded by `jsonb_check::jsonb_query_validator_is_plpgsql`. The `eql_v3.json` document CHECK — part of the documented privilege contract — is unchanged; `docs/reference/permissions.md` now notes the `jsonb_entry` cast requires no internal grant. ([#354](https://github.com/cipherstash/encrypt-query-language/issues/354))
diff --git a/.changeset/eql-internal-schema.md b/.changeset/eql-internal-schema.md
new file mode 100644
index 000000000..a33c1ad79
--- /dev/null
+++ b/.changeset/eql-internal-schema.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': major
+---
+
+**Internal `eql_v3` index-term types and plumbing moved to a new `eql_v3_internal` schema; `eql_v3` stays the public API — including a callable function equivalent for every operator.** `eql_v3_internal` holds INTERNAL objects only: the SEM index-term **types** (`hmac_256`, `bloom_filter`, `ore_block_256`(+`_term`), `ore_cllw`) and their support functions/operators/opclasses, the generated unsupported-operator **blockers** and the shared `encrypted_domain_unsupported_*` / `jsonb_blocked_*` helpers, the **aggregate state functions**, and the encrypted-JSONB CHECK validators + `jsonb_array_to_bytea_array`. `eql_v3` keeps the full public surface: the column-type domains (all scalar families + `eql_v3.json` / `eql_v3.jsonb_entry` / `eql_v3.jsonb_query`), query operators, index extractors (`eq_term` / `ord_term` / `match_term` and the jsonb access functions), `min` / `max` aggregates, the `json → jsonb_query` cast, `version()`, `lints()`, **and — crucially — the operator-backing comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) plus the jsonb containment helpers (`jsonb_contains`/`jsonb_contained_by`/`jsonb_array`/`ste_vec_contains`). Why the wrappers stay public: they are the function-form equivalent of every supported operator, and not every platform can invoke custom operators — Supabase/PostgREST exposes the database through an auto-generated REST/RPC layer that calls **functions**, not operators (`WHERE col = $1` is not expressible there, but `eql_v3.eq(col, $1)` is). Only index-term-only TYPES need to be hidden (Supabase Studio's Table Builder type picker lists every type in every non-hidden schema); the callable wrappers do not, so they remain public. A new gate, `tests/sqlx/tests/v3_operator_equivalents_tests.rs`, fails CI if any supported operator's backing wrapper is hidden in `eql_v3_internal`. **Design decision — EQL never grants permissions automatically.** The installer issues no `GRANT`/`REVOKE`; access to `eql_v3` (and, where a public operator/aggregate dispatches into it, `eql_v3_internal`) is strictly opt-in — a deployment grants `USAGE` / `EXECUTE` deliberately (see [`docs/reference/permissions.md`](docs/reference/permissions.md)). This is a breaking schema-layout change for existing installs: audit each runtime role's grants against `docs/reference/permissions.md`.
diff --git a/.changeset/eql-language-binding-releases.md b/.changeset/eql-language-binding-releases.md
new file mode 100644
index 000000000..5a1a097e3
--- /dev/null
+++ b/.changeset/eql-language-binding-releases.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**First-class language-binding releases: the `@cipherstash/eql` npm package and crate-bundled SQL.** EQL v3 now ships its canonical wire types as a TypeScript npm package (`@cipherstash/eql`, under `packages/eql/`) alongside the existing Rust `eql-bindings` crate — both generated from `eql-domains::CATALOG` (the TS package is derived from the crate's `bindings/` + `schema/` outputs, drift-gated by `mise run typescript:check`). Each language package bundles the **exact** self-contained SQL installer/uninstaller it was generated against: the crate exposes it as `eql_bindings::sql` (`INSTALL_SQL`, `UNINSTALL_SQL`, `RELEASE_MANIFEST_JSON`), and the npm package via its `./sql` / `./sql/*` subpath exports (plus a `releaseManifest` and `readInstallSql()`/`readUninstallSql()` helpers) — so a consumer pins wire types and the matching DDL together. Prereleases can now cut all three artifacts under one identity — the SQL + docs GitHub release, the crate (crates.io, tag `eql-bindings-v`), and the npm package (tag `eql-typescript-v`): a single unified `release.yml` workflow publishes them in lockstep from an explicit `chore(release): ...` commit on the `eql_v3` branch (npm directly, the crate dispatched through `release-plz.yml` for crates.io Trusted Publishing). Why: type information was lost at every hop from EQL to downstream tools; a versioned, single-source package per language (bundled with the SQL it targets) removes hand-copying and installer/type drift.
diff --git a/.changeset/eql-lints-schema-placement.md b/.changeset/eql-lints-schema-placement.md
new file mode 100644
index 000000000..a9685b90a
--- /dev/null
+++ b/.changeset/eql-lints-schema-placement.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.lints()` gains a `schema_placement` category.** `SELECT * FROM eql_v3.lints() WHERE category = 'schema_placement'` reports, at severity `error`, any naked composite or enum TYPE that has been created in the public `eql_v3` schema — an internal index-term type (e.g. `ore_block_256_term`) that belongs in `eql_v3_internal`. Why: the `eql_v3` / `eql_v3_internal` split exists to keep index-term-only types out of the Supabase Table Builder type picker; this lint makes a placement regression self-detecting at runtime (the CI-side net is the placement invariant in `tests/sqlx/tests/v3_public_surface_tests.rs`). A clean install reports zero `schema_placement` rows.
diff --git a/.changeset/eql-sole-installer.md b/.changeset/eql-sole-installer.md
new file mode 100644
index 000000000..b75c295fc
--- /dev/null
+++ b/.changeset/eql-sole-installer.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': major
+---
+
+**The self-contained `eql_v3` installer is now the sole release artifact, shipped under the canonical name `release/cipherstash-encrypt.sql` (+ `cipherstash-encrypt-uninstall.sql`).** The combined, Supabase, and Protect build variants are removed; `mise run build` now produces only the `eql_v3` surface, written under the canonical name that the combined build previously used — so existing install URLs keep working. Why: with `eql_v2` removed (see below), there is a single SQL surface to build, install, and test.
diff --git a/.changeset/eql-v2-removed.md b/.changeset/eql-v2-removed.md
new file mode 100644
index 000000000..3a0ba2c9b
--- /dev/null
+++ b/.changeset/eql-v2-removed.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': major
+---
+
+**The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent).
diff --git a/.changeset/eql-version-fn.md b/.changeset/eql-version-fn.md
new file mode 100644
index 000000000..adb3125ad
--- /dev/null
+++ b/.changeset/eql-version-fn.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4c94db32b..63a40c997 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -152,7 +152,6 @@ See [`docs/upgrading/v2.3.md`](docs/upgrading/v2.3.md). Eight numbered notes cov
 
 (Backfill pending — entries for tagged 2.x releases will be added retroactively from `git log` in a follow-up.)
 
-[Unreleased]: https://github.com/cipherstash/encrypt-query-language/compare/eql-2.3.1...HEAD
 [2.3.1]: https://github.com/cipherstash/encrypt-query-language/releases/tag/eql-2.3.1
 [2.3.0]: https://github.com/cipherstash/encrypt-query-language/releases/tag/eql-2.3.0
 [2.2.1]: https://github.com/cipherstash/encrypt-query-language/releases/tag/eql-2.2.1

From da4039d3a512879bbf91f4cafc6734ec960a4307 Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 14:58:41 +1000
Subject: [PATCH 579/599] chore(rebase): reconcile with eql_v3 (query-operand
 domains + changelog)

Rebased onto eql_v3, which added the query-operand domain surface
(query_ in eql_v3, CIP-3432/3442), COMMENT ON DOMAIN, and the
conditional SEM opclass install. Reconcile the branch-local work:

- Regenerate eql-bindings + @cipherstash/eql bindings from the updated
  catalog (adds the query_ schemas/types; jsonb_query -> query_jsonb).
- Convert base's four new CHANGELOG [Unreleased] entries (#377, #373,
  CIP-3442, #375) into changesets and remove the reconstructed
  [Unreleased] block (Changesets owns the changelog).
---
 .changeset/eql-3442.md                        |  5 ++
 .changeset/eql-373.md                         |  5 ++
 .changeset/eql-375.md                         |  5 ++
 .changeset/eql-377.md                         |  5 ++
 CHANGELOG.md                                  | 71 ----------------
 packages/eql/src/generated/schema-manifest.ts | 80 ++++++++++++++++++-
 .../generated/schema/v3/query_bigint_eq.json  | 54 +++++++++++++
 .../generated/schema/v3/query_bigint_ord.json | 57 +++++++++++++
 .../schema/v3/query_bigint_ord_ope.json       | 54 +++++++++++++
 .../schema/v3/query_bigint_ord_ore.json       | 57 +++++++++++++
 .../generated/schema/v3/query_date_eq.json    | 54 +++++++++++++
 .../generated/schema/v3/query_date_ord.json   | 57 +++++++++++++
 .../schema/v3/query_date_ord_ope.json         | 54 +++++++++++++
 .../schema/v3/query_date_ord_ore.json         | 57 +++++++++++++
 .../generated/schema/v3/query_double_eq.json  | 54 +++++++++++++
 .../generated/schema/v3/query_double_ord.json | 57 +++++++++++++
 .../schema/v3/query_double_ord_ope.json       | 54 +++++++++++++
 .../schema/v3/query_double_ord_ore.json       | 57 +++++++++++++
 .../generated/schema/v3/query_integer_eq.json | 54 +++++++++++++
 .../schema/v3/query_integer_ord.json          | 57 +++++++++++++
 .../schema/v3/query_integer_ord_ope.json      | 54 +++++++++++++
 .../schema/v3/query_integer_ord_ore.json      | 57 +++++++++++++
 .../v3/{jsonb_query.json => query_jsonb.json} |  4 +-
 .../generated/schema/v3/query_numeric_eq.json | 54 +++++++++++++
 .../schema/v3/query_numeric_ord.json          | 57 +++++++++++++
 .../schema/v3/query_numeric_ord_ope.json      | 54 +++++++++++++
 .../schema/v3/query_numeric_ord_ore.json      | 57 +++++++++++++
 .../generated/schema/v3/query_real_eq.json    | 54 +++++++++++++
 .../generated/schema/v3/query_real_ord.json   | 57 +++++++++++++
 .../schema/v3/query_real_ord_ope.json         | 54 +++++++++++++
 .../schema/v3/query_real_ord_ore.json         | 57 +++++++++++++
 .../schema/v3/query_smallint_eq.json          | 54 +++++++++++++
 .../schema/v3/query_smallint_ord.json         | 57 +++++++++++++
 .../schema/v3/query_smallint_ord_ope.json     | 54 +++++++++++++
 .../schema/v3/query_smallint_ord_ore.json     | 57 +++++++++++++
 .../generated/schema/v3/query_text_eq.json    | 54 +++++++++++++
 .../generated/schema/v3/query_text_match.json | 60 ++++++++++++++
 .../generated/schema/v3/query_text_ord.json   | 65 +++++++++++++++
 .../schema/v3/query_text_ord_ope.json         | 62 ++++++++++++++
 .../schema/v3/query_text_ord_ore.json         | 65 +++++++++++++++
 .../schema/v3/query_text_search.json          | 79 ++++++++++++++++++
 .../schema/v3/query_timestamp_eq.json         | 54 +++++++++++++
 .../schema/v3/query_timestamp_ord.json        | 57 +++++++++++++
 .../schema/v3/query_timestamp_ord_ope.json    | 54 +++++++++++++
 .../schema/v3/query_timestamp_ord_ore.json    | 57 +++++++++++++
 .../eql/src/generated/v3/BigintEqQuery.ts     | 11 +++
 .../eql/src/generated/v3/BigintOrdOpeQuery.ts | 11 +++
 .../eql/src/generated/v3/BigintOrdOreQuery.ts | 11 +++
 .../eql/src/generated/v3/BigintOrdQuery.ts    | 11 +++
 packages/eql/src/generated/v3/DateEqQuery.ts  | 11 +++
 .../eql/src/generated/v3/DateOrdOpeQuery.ts   | 11 +++
 .../eql/src/generated/v3/DateOrdOreQuery.ts   | 11 +++
 packages/eql/src/generated/v3/DateOrdQuery.ts | 11 +++
 .../eql/src/generated/v3/DoubleEqQuery.ts     | 11 +++
 .../eql/src/generated/v3/DoubleOrdOpeQuery.ts | 11 +++
 .../eql/src/generated/v3/DoubleOrdOreQuery.ts | 11 +++
 .../eql/src/generated/v3/DoubleOrdQuery.ts    | 11 +++
 .../eql/src/generated/v3/IntegerEqQuery.ts    | 11 +++
 .../src/generated/v3/IntegerOrdOpeQuery.ts    | 11 +++
 .../src/generated/v3/IntegerOrdOreQuery.ts    | 11 +++
 .../eql/src/generated/v3/IntegerOrdQuery.ts   | 11 +++
 .../eql/src/generated/v3/NumericEqQuery.ts    | 11 +++
 .../src/generated/v3/NumericOrdOpeQuery.ts    | 11 +++
 .../src/generated/v3/NumericOrdOreQuery.ts    | 11 +++
 .../eql/src/generated/v3/NumericOrdQuery.ts   | 11 +++
 packages/eql/src/generated/v3/RealEqQuery.ts  | 11 +++
 .../eql/src/generated/v3/RealOrdOpeQuery.ts   | 11 +++
 .../eql/src/generated/v3/RealOrdOreQuery.ts   | 11 +++
 packages/eql/src/generated/v3/RealOrdQuery.ts | 11 +++
 .../eql/src/generated/v3/SmallintEqQuery.ts   | 11 +++
 .../src/generated/v3/SmallintOrdOpeQuery.ts   | 11 +++
 .../src/generated/v3/SmallintOrdOreQuery.ts   | 11 +++
 .../eql/src/generated/v3/SmallintOrdQuery.ts  | 11 +++
 packages/eql/src/generated/v3/SteVecQuery.ts  |  2 +-
 packages/eql/src/generated/v3/TextEqQuery.ts  | 11 +++
 .../eql/src/generated/v3/TextMatchQuery.ts    | 11 +++
 .../eql/src/generated/v3/TextOrdOpeQuery.ts   | 12 +++
 .../eql/src/generated/v3/TextOrdOreQuery.ts   | 12 +++
 packages/eql/src/generated/v3/TextOrdQuery.ts | 12 +++
 .../eql/src/generated/v3/TextSearchQuery.ts   | 13 +++
 .../eql/src/generated/v3/TimestampEqQuery.ts  | 11 +++
 .../src/generated/v3/TimestampOrdOpeQuery.ts  | 11 +++
 .../src/generated/v3/TimestampOrdOreQuery.ts  | 11 +++
 .../eql/src/generated/v3/TimestampOrdQuery.ts | 11 +++
 packages/eql/src/generated/v3/index.ts        | 38 +++++++++
 85 files changed, 2723 insertions(+), 76 deletions(-)
 create mode 100644 .changeset/eql-3442.md
 create mode 100644 .changeset/eql-373.md
 create mode 100644 .changeset/eql-375.md
 create mode 100644 .changeset/eql-377.md
 create mode 100644 packages/eql/src/generated/schema/v3/query_bigint_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_bigint_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_bigint_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_bigint_ord_ore.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_date_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_date_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_date_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_date_ord_ore.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_double_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_double_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_double_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_double_ord_ore.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_integer_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_integer_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_integer_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_integer_ord_ore.json
 rename packages/eql/src/generated/schema/v3/{jsonb_query.json => query_jsonb.json} (94%)
 create mode 100644 packages/eql/src/generated/schema/v3/query_numeric_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_numeric_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_numeric_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_numeric_ord_ore.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_real_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_real_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_real_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_real_ord_ore.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_smallint_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_smallint_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_smallint_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_smallint_ord_ore.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_text_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_text_match.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_text_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_text_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_text_ord_ore.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_text_search.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_timestamp_eq.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_timestamp_ord.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_timestamp_ord_ope.json
 create mode 100644 packages/eql/src/generated/schema/v3/query_timestamp_ord_ore.json
 create mode 100644 packages/eql/src/generated/v3/BigintEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/BigintOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/BigintOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/BigintOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DateEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DateOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DateOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DateOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DoubleEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DoubleOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DoubleOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/DoubleOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/IntegerEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/IntegerOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/IntegerOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/IntegerOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/NumericEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/NumericOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/NumericOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/NumericOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/RealEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/RealOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/RealOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/RealOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/SmallintEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/SmallintOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/SmallintOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/SmallintOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TextEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TextMatchQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TextOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TextOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TextOrdQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TextSearchQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TimestampEqQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TimestampOrdOpeQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TimestampOrdOreQuery.ts
 create mode 100644 packages/eql/src/generated/v3/TimestampOrdQuery.ts

diff --git a/.changeset/eql-3442.md b/.changeset/eql-3442.md
new file mode 100644
index 000000000..1ed557f57
--- /dev/null
+++ b/.changeset/eql-3442.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**Query-operand domains renamed to a `query_` prefix AND moved into the `eql_v3` schema (CIP-3442).** Every scalar query twin introduced by the query-operand surface (above) is now `eql_v3.query_` — `query_integer_eq`, `query_text_ord`, `query_timestamp_ord_ope`, … — and the encrypted-JSONB containment needle follows the same convention: `public.jsonb_query` is now `eql_v3.query_jsonb`. Predicates cast accordingly (`WHERE col = $1::eql_v3.query_integer_eq`; `WHERE doc @> $1::eql_v3.query_jsonb`), the `eql-bindings` `DomainType::sql_domain` strings, `QueryPayload::parse` domain names, and the exported JSON Schema file names (`schema/v3/query_.json`) all carry the new names, and `from_v2_query` / `from_v2_query_typed` target them. This supersedes the `_query` naming in the earlier `[Unreleased]` entries; the old names shipped only in 3.0.0 pre-releases. **Why the prefix:** alphabetical type listings interleaved never-a-column-type query operands with the actual column types (`integer_eq` next to `integer_eq_query`); the shared `query_` prefix sorts every query operand together. **Why the schema move:** query operands are never valid column types, so they don't belong in `public` — the column-type namespace whose survive-schema-drop rationale (dropping EQL-owned schemas must not drop application columns) doesn't apply to them. In `eql_v3` they are versioned with the rest of the public API surface, are uninstalled with it (a column misusing a query domain is dropped by the uninstaller's CASCADE — pinned by the uninstall suite), and casting a query operand requires the same `USAGE ON SCHEMA eql_v3` a caller already needs for the extractors and comparison wrappers. See [U-002](docs/upgrading/v3.0.md#u-002-query-operand-domains-are-eql_v3query_name) in the 3.0 upgrade guide. ([CIP-3442](https://linear.app/cipherstash/issue/CIP-3442))
diff --git a/.changeset/eql-373.md b/.changeset/eql-373.md
new file mode 100644
index 000000000..07a33b9d2
--- /dev/null
+++ b/.changeset/eql-373.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373))
diff --git a/.changeset/eql-375.md b/.changeset/eql-375.md
new file mode 100644
index 000000000..91e9bc29f
--- /dev/null
+++ b/.changeset/eql-375.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': patch
+---
+
+**The `eql_v3` installer now runs on managed Postgres without superuser — the two SEM btree operator classes install conditionally.** `release/cipherstash-encrypt.sql` created `eql_v3_internal.ore_block_256_operator_class` and `eql_v3_internal.ore_cllw_ops` with bare `CREATE OPERATOR FAMILY` / `CREATE OPERATOR CLASS`, which PostgreSQL restricts to superusers. On Supabase (and most hosted Postgres), the installer runs as a non-superuser role, so the whole single-transaction install aborted at the first `CREATE OPERATOR FAMILY` with `must be superuser to create an operator family` (SQLSTATE `42501`) — leaving `eql_v3` uninstallable there despite the surface being otherwise managed-Postgres compatible. Both `operator_class.sql` files now wrap their family+class creation in a `DO` block that catches `insufficient_privilege` and continues with a `NOTICE`, so one artifact installs everywhere: superuser installs (self-managed Postgres, the SQLx test matrix) create the default btree opclass as before; non-superuser installs skip it and fall back to the order-preserving (OPE) ordering domains, whose extractor return types carry a native btree opclass and need no custom class. Any non-privilege error from the DDL still propagates. Verified end-to-end against live Supabase (skips, install commits, 0 opclasses) and a local superuser cluster (creates both opclasses). Also corrects the stale in-file comments claiming these files were excluded by a `**/*operator_class.sql` build glob — the v3 build (`tasks/build.sh`) globs `src/v3` wholesale and has no such exclusion. ([#375](https://github.com/cipherstash/encrypt-query-language/pull/375))
diff --git a/.changeset/eql-377.md b/.changeset/eql-377.md
new file mode 100644
index 000000000..8aacfa2d0
--- /dev/null
+++ b/.changeset/eql-377.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**`COMMENT ON DOMAIN` on every `eql_v3` encrypted domain type.** The v3 encrypted domains are `jsonb`-backed, so introspection that resolves a domain to its base type renders them as a bare `jsonb` with no hint they are EQL-encrypted, searchable columns (most visibly the Supabase table editor, whose grid reads `postgres-meta`'s base-type-resolved `format`). Every `public` encrypted domain now carries a one-line `COMMENT ON DOMAIN`, so the type is self-documenting via `psql \dD`, `obj_description(oid,'pg_type')`, and any tool that reads `pg_type` comments (Supabase's `types` introspection surfaces exactly this). No behaviour change — comments only. Scalar-domain comments are **code-generated**: a new `DomainBlock.comment` field derives the capability text from the domain's terms (`Term::operators_for_terms`), so it tracks the generated CHECK/operator surface and can't drift. Comments are deliberately terse so they fit one line in type pickers (e.g. Supabase Studio): `text_match` → "EQL encrypted text (containment)", an ORE `_ord` → "EQL encrypted numeric (equality, ordering)", storage-only → "EQL encrypted numeric (storage only)". The DO-block templates emit the comment after each idempotent `CREATE DOMAIN`, re-applied on reinstall so comment-text changes propagate. The `_query` operand twins get a matching "EQL  query operand (…)" comment, and the three hand-written jsonb SteVec domains (`json` / `jsonb_entry` / `jsonb_query`) get hand-written comments. ([#377](https://github.com/cipherstash/encrypt-query-language/pull/377), closes [#376](https://github.com/cipherstash/encrypt-query-language/issues/376))
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 63a40c997..c60fa2807 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,77 +18,6 @@ Tags follow `eql-` (e.g. `eql-2.3.0`); `release.yml` cuts the tag and i
 
 This file is generated by [Changesets](https://github.com/changesets/changesets) from the `.changeset/*.md` files added in each PR — it is **not hand-edited**. Add a changeset for every releasable change (see `.changeset/README.md`); Changesets writes the versioned section, and links each entry to its PR, when a release is cut.
 
-## [Unreleased]
-
-### Added
-
-- **`COMMENT ON DOMAIN` on every `eql_v3` encrypted domain type.** The v3 encrypted domains are `jsonb`-backed, so introspection that resolves a domain to its base type renders them as a bare `jsonb` with no hint they are EQL-encrypted, searchable columns (most visibly the Supabase table editor, whose grid reads `postgres-meta`'s base-type-resolved `format`). Every `public` encrypted domain now carries a one-line `COMMENT ON DOMAIN`, so the type is self-documenting via `psql \dD`, `obj_description(oid,'pg_type')`, and any tool that reads `pg_type` comments (Supabase's `types` introspection surfaces exactly this). No behaviour change — comments only. Scalar-domain comments are **code-generated**: a new `DomainBlock.comment` field derives the capability text from the domain's terms (`Term::operators_for_terms`), so it tracks the generated CHECK/operator surface and can't drift. Comments are deliberately terse so they fit one line in type pickers (e.g. Supabase Studio): `text_match` → "EQL encrypted text (containment)", an ORE `_ord` → "EQL encrypted numeric (equality, ordering)", storage-only → "EQL encrypted numeric (storage only)". The DO-block templates emit the comment after each idempotent `CREATE DOMAIN`, re-applied on reinstall so comment-text changes propagate. The `_query` operand twins get a matching "EQL  query operand (…)" comment, and the three hand-written jsonb SteVec domains (`json` / `jsonb_entry` / `jsonb_query`) get hand-written comments. ([#377](https://github.com/cipherstash/encrypt-query-language/pull/377), closes [#376](https://github.com/cipherstash/encrypt-query-language/issues/376))
-
-- **Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373))
-- **First-class language-binding releases: the `@cipherstash/eql` npm package and crate-bundled SQL.** EQL v3 now ships its canonical wire types as a TypeScript npm package (`@cipherstash/eql`, under `packages/eql/`) alongside the existing Rust `eql-bindings` crate — both generated from `eql-domains::CATALOG` (the TS package is derived from the crate's `bindings/` + `schema/` outputs, drift-gated by `mise run typescript:check`). Each language package bundles the **exact** self-contained SQL installer/uninstaller it was generated against: the crate exposes it as `eql_bindings::sql` (`INSTALL_SQL`, `UNINSTALL_SQL`, `RELEASE_MANIFEST_JSON`), and the npm package via its `./sql` / `./sql/*` subpath exports (plus a `releaseManifest` and `readInstallSql()`/`readUninstallSql()` helpers) — so a consumer pins wire types and the matching DDL together. Prereleases can now cut all three artifacts under one identity — the SQL + docs GitHub release, the crate (crates.io, tag `eql-bindings-v`), and the npm package (tag `eql-typescript-v`): `mise run release:all` releases the lot in lockstep, `mise run release:bindings` publishes all language packages for an existing SQL alpha, and `mise run release:rust` / `mise run release:typescript` publish a single language. Why: type information was lost at every hop from EQL to downstream tools; a versioned, single-source package per language (bundled with the SQL it targets) removes hand-copying and installer/type drift.
-- **First-class language-binding releases: the `@cipherstash/eql` npm package and crate-bundled SQL.** EQL v3 now ships its canonical wire types as a TypeScript npm package (`@cipherstash/eql`, under `packages/eql/`) alongside the existing Rust `eql-bindings` crate — both generated from `eql-domains::CATALOG` (the TS package is derived from the crate's `bindings/` + `schema/` outputs, drift-gated by `mise run typescript:check`). Each language package bundles the **exact** self-contained SQL installer/uninstaller it was generated against: the crate exposes it as `eql_bindings::sql` (`INSTALL_SQL`, `UNINSTALL_SQL`, `RELEASE_MANIFEST_JSON`), and the npm package via its `./sql` / `./sql/*` subpath exports (plus a `releaseManifest` and `readInstallSql()`/`readUninstallSql()` helpers) — so a consumer pins wire types and the matching DDL together. Prereleases can now cut all three artifacts under one identity — the SQL + docs GitHub release, the crate (crates.io, tag `eql-bindings-v`), and the npm package (tag `eql-typescript-v`): a single unified `release.yml` workflow publishes them in lockstep from an explicit `chore(release): ...` commit on the `eql_v3` branch (npm directly, the crate dispatched through `release-plz.yml` for crates.io Trusted Publishing). Why: type information was lost at every hop from EQL to downstream tools; a versioned, single-source package per language (bundled with the SQL it targets) removes hand-copying and installer/type drift.
-- **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350))
-- **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349))
-- **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed.
-- **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307))
-- **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.jsonb_entry` (a single sv element) and `eql_v3.jsonb_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267))
-- **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225))
-- **`eql_bindings::from_v2` — EQL v2.3 → v3 wire payload conversion.** The `eql-bindings` crate gains a converter from the v2.3 payloads cipherstash-client emits (reference contract: `docs/reference/schema/eql-payload-v2.3.schema.json`) into `eql_v3` payloads: `from_v2(v2, target)` for stored scalar (`k:"ct"`) and SteVec (`k:"sv"`) payloads, `from_v2_query(v2, target)` for the jsonb containment needle (→ the `eql_v3.jsonb_query` shape, normalized like `eql_v3.to_ste_vec_query`), and `is_v3_payload` as a lenient envelope probe for format sniffing. The target domain is explicit input — every v2 index term is optional on the wire, so capability cannot be inferred — and `TargetDomain::parse` resolves names against the catalog-generated inventory (via the new `DomainType::term_json_keys`), so accepted names and required term keys cannot drift from `eql-domains::CATALOG`. Conversion copies `i`/`c` verbatim, emits `v: 3`, copies exactly the term keys the target requires (failing closed with `MissingTerm` otherwise), drops `k` and unneeded terms (SteVec documents instead keep `k: "sv"` — the v3 document models the form discriminator), and reinterprets `bf` from v2's unsigned bit positions into the signed `smallint[]` representation (`32768..=65535` wrap negative; beyond is `BloomOutOfRange`); SteVec `sv` entry order is preserved verbatim because `sv[0]` carries the record ciphertext downstream decryption depends on. Every output is validated through the target's binding struct before being returned, and representative conversions are validated against the published JSON Schemas in `crates/eql-bindings/schema/v3/` by the `test:schema` suite. Scalar QUERY targets return `UnsupportedQueryTarget`: no v3 scalar query wire shape exists (every scalar domain CHECK requires `c`), and none is invented ahead of the mapper redesign. Why: protect-ffi, the benches, and potentially Proxy need a single, fail-closed upgrade path from the v2 wire while cipherstash-client still emits it. ([#341](https://github.com/cipherstash/encrypt-query-language/pull/341))
-- **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed.- **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt-v3.sql`, `cipherstash-encrypt-v3-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307))
-- **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.jsonb_entry` (a single sv element) and `eql_v3.jsonb_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a *bare untyped* literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt-v3.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267))
-- **`eql_v3` encrypted-domain schema, with the `int4` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `int4` columns: `eql_v3.int4` (storage-only), `eql_v3.int4_eq` (`=` / `<>` via HMAC), and `eql_v3.int4_ord` / `eql_v3.int4_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '3'` — see the envelope-version entry under Changed) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225))
-- **`eql_v3.int2` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int2` columns — `eql_v3.int2` (storage-only), `eql_v3.int2_eq` (`=` / `<>` via HMAC), and `eql_v3.int2_ord` / `eql_v3.int2_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int2` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `int4` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243))
-- **`eql_v3.int8` encrypted-domain type family.** Four jsonb-backed domains for encrypted `int8` columns — `eql_v3.int8` (storage-only), `eql_v3.int8_eq` (`=` / `<>` via HMAC), and `eql_v3.int8_ord` / `eql_v3.int8_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `int8` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253))
-- **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256))
-- **`eql_v3` encrypted-domain schema, with the `integer` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `integer` columns: `eql_v3.integer` (storage-only), `eql_v3.integer_eq` (`=` / `<>` via HMAC), and `eql_v3.integer_ord` / `eql_v3.integer_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225))
-- **`eql_v3.smallint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `smallint` columns — `eql_v3.smallint` (storage-only), `eql_v3.smallint_eq` (`=` / `<>` via HMAC), and `eql_v3.smallint_ord` / `eql_v3.smallint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `smallint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `integer` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243))
-- **`eql_v3.bigint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `bigint` columns — `eql_v3.bigint` (storage-only), `eql_v3.bigint_eq` (`=` / `<>` via HMAC), and `eql_v3.bigint_ord` / `eql_v3.bigint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `bigint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253))
-- **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256))
-- **`eql_v3.timestamp` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `timestamp` columns — `eql_v3.timestamp` (storage-only), `eql_v3.timestamp_eq` (`=` / `<>` via HMAC), and `eql_v3.timestamp_ord` / `eql_v3.timestamp_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 12-block ORE) — generated from the `timestamp` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast, so the stored value is a UTC instant (Postgres `timestamp with time zone`) wearing the SQL-standard name `timestamp` to match the cipherstash cast / `ColumnType::Timestamp` / `Plaintext::Timestamp` convention. Ordering works because the `eql_v3` ORE block comparator now derives its block count from the ciphertext width (see the comparator entry below) instead of assuming 8. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257))
-- **`eql_v3.numeric` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `numeric` / `decimal` columns — `eql_v3.numeric` (storage-only), `eql_v3.numeric_eq` (`=` / `<>` via HMAC), and `eql_v3.numeric_ord` / `eql_v3.numeric_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 14-block ORE) — generated from the `numeric` row in `eql-scalars::CATALOG`. cipherstash encrypts `Plaintext::Decimal` at native 14-block ORE width; ordering matches `rust_decimal::Decimal` ordering exactly (equivalent scales such as `1` and `1.0` collide, like Postgres `numeric`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors. Why: a type-safe, ordered encrypted decimal column, the first scalar to exercise an ORE term wider than 8 blocks. ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276))
-- **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239))
-- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260))
-- **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255))
-- **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` domain — deliberately *not* SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality (which always routes through `Hm`). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260))
-- **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`smallint`/`integer`/`bigint`/`date`/`timestamp`/`numeric`/`text`). Equality across two independent encryptions of one value is exercised credential-free by the fixture suite via committed per-type *doubles* fixtures (each plaintext encrypted twice — `property::cross_ciphertext`), through both the `hm` (`_eq`) and ORE (`_ord`/`_ord_ore`) equality paths, and additionally by the e2e suite via fresh duplicate plaintexts each run. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293))
-- **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_u64_8_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255))
-- **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.jsonb_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267))
-- **`eql_v3.bool` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `bool` columns — `eql_v3.bool` — generated from the `bool` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `bool` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '3'` — see the envelope-version entry under Changed). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295))
-- **`eql_v3.float4` / `eql_v3.float8` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.float4` / `eql_v3.float8` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `float4` / `float8` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.int4` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `float4` vs `float8` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `int8`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299))
-- **`eql_v3.boolean` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `boolean` columns — `eql_v3.boolean` — generated from the `boolean` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `boolean` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295))
-- **`eql_v3.real` / `eql_v3.double` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.real` / `eql_v3.double` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `real` / `double` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `real` vs `double` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `bigint`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299))
-- **`eql_v3` encrypted-JSONB (SteVec) payload bindings — Rust, TypeScript, and JSON Schema.** JSONB is now a first-class member of `eql-domains::CATALOG`, so its payload types ship as canonical, drift-gated bindings alongside the scalar families: `SteVecDocument` (`eql_v3.json`), `SteVecEntry` (`eql_v3.jsonb_entry`), `SteVecQuery` (`eql_v3.jsonb_query`), plus the shared untagged `SteVecTerm` (`{hm} | {oc}`), `SteVecQueryEntry`, and the `OreCllw` / `Selector` term newtypes — under `crates/eql-bindings/src/v3/jsonb.rs`, `bindings/v3/*.ts`, and `schema/v3/*.json`, drift-gated by `types:check`. A new `Shape` discriminant on each catalog domain lets scalar-only consumers filter and all-family consumers branch; the SteVec struct bodies and the encrypted-JSONB SQL surface stay hand-written (the generator skips SteVec shapes but still drives the bindings inventory). The bindings are parsed against a real generated SteVec ciphertext row in the SQLx suite, tying them to real crypto and the SQL domain CHECK. Why: the SteVec wire types were the only `eql_v3` payloads without generated, drift-gated bindings — protocol consumers (`cipherstash-client`, `protect-ffi`, CipherStash Proxy) can now depend on canonical, catalog-checked encrypted-JSONB types. ([#336](https://github.com/cipherstash/encrypt-query-language/pull/336))
-- **`eql_v3._ord_ope` encrypted-domain variants — CLLW-OPE ordering across every ordered scalar family.** Every ordered scalar family (`int2`, `int4`, `int8`, `date`, `timestamp`, `numeric`, `text`, `float4`, `float8`) gains an `_ord_ope` domain backed by a new CLLW-OPE index term: the `op` payload key carries a hex-encoded OPE ciphertext that is order-preserving under plain byte comparison, so ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) reduces to hex-decode + native bytea comparison via the new self-contained SEM type `eql_v3_internal.ope_cllw` — no custom N-block comparison protocol, unlike the `_ord` / `_ord_ore` block-ORE domains. Integer-family `_ord_ope` domains carry `[op]` alone (OPE equality is lossless for them); `text_ord_ope` carries `[hm, op]` so `=` / `<>` stay exact via HMAC (OPE over text is not equality-lossless, matching `text_ord`). Index via a functional btree index on the new `eql_v3.ord_ope_term(col)` extractor (its `eql_v3_internal.ope_cllw` return type is a domain over `bytea`, inheriting the native comparison operators and DEFAULT btree opclass — the whole comparison chain stays inlinable, so the index engages structurally), not an operator class on the domain. This revives the v2.2-era `opf` / `opv` order-preserving terms under the modern single `op` wire key that cipherstash-client re-emits for ordered scalars (CIP-3280). Rust / TypeScript / JSON Schema payload bindings (`Int4OrdOpe`, `TextOrdOpe`, … with the `OpeCllw` term newtype) ship alongside, drift-gated by `types:check`. `bool` stays storage-only, and the combined `text_search` domain deliberately stays `[hm, ob, bf]` — adding `op` to its CHECK would widen it for no new operator capability (OPE's operators are already covered via `Ore`); with the pinned client now emitting `op` (0.38.1, CIP-3348) this is a standing design decision to revisit separately. Why: OPE terms are natively index-sortable, giving ordered encrypted columns a cheaper comparison path than the block-ORE protocol. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340))
-
-- **`eql_v3.lints()` gains a `schema_placement` category.** `SELECT * FROM eql_v3.lints() WHERE category = 'schema_placement'` reports, at severity `error`, any naked composite or enum TYPE that has been created in the public `eql_v3` schema — an internal index-term type (e.g. `ore_block_256_term`) that belongs in `eql_v3_internal`. Why: the `eql_v3` / `eql_v3_internal` split exists to keep index-term-only types out of the Supabase Table Builder type picker; this lint makes a placement regression self-detecting at runtime (the CI-side net is the placement invariant in `tests/sqlx/tests/v3_public_surface_tests.rs`). A clean install reports zero `schema_placement` rows.
-
-### Changed
-
-- **Query-operand domains renamed to a `query_` prefix AND moved into the `eql_v3` schema (CIP-3442).** Every scalar query twin introduced by the query-operand surface (above) is now `eql_v3.query_` — `query_integer_eq`, `query_text_ord`, `query_timestamp_ord_ope`, … — and the encrypted-JSONB containment needle follows the same convention: `public.jsonb_query` is now `eql_v3.query_jsonb`. Predicates cast accordingly (`WHERE col = $1::eql_v3.query_integer_eq`; `WHERE doc @> $1::eql_v3.query_jsonb`), the `eql-bindings` `DomainType::sql_domain` strings, `QueryPayload::parse` domain names, and the exported JSON Schema file names (`schema/v3/query_.json`) all carry the new names, and `from_v2_query` / `from_v2_query_typed` target them. This supersedes the `_query` naming in the earlier `[Unreleased]` entries; the old names shipped only in 3.0.0 pre-releases. **Why the prefix:** alphabetical type listings interleaved never-a-column-type query operands with the actual column types (`integer_eq` next to `integer_eq_query`); the shared `query_` prefix sorts every query operand together. **Why the schema move:** query operands are never valid column types, so they don't belong in `public` — the column-type namespace whose survive-schema-drop rationale (dropping EQL-owned schemas must not drop application columns) doesn't apply to them. In `eql_v3` they are versioned with the rest of the public API surface, are uninstalled with it (a column misusing a query domain is dropped by the uninstaller's CASCADE — pinned by the uninstall suite), and casting a query operand requires the same `USAGE ON SCHEMA eql_v3` a caller already needs for the extractors and comparison wrappers. See [U-002](docs/upgrading/v3.0.md#u-002-query-operand-domains-are-eql_v3query_name) in the 3.0 upgrade guide. ([CIP-3442](https://linear.app/cipherstash/issue/CIP-3442))
-- **Release coordinator: `bindings` now means all language packages, plus new `rust` / `typescript` targets.** The `release-alpha.yml` coordinator target `bindings` previously published only the Rust crate; it now publishes every missing language binding package (Rust crate **and** the `@cipherstash/eql` npm package) for an existing same-source SQL prerelease, and two single-language targets were added: `rust` (crate only) and `typescript` (npm only), surfaced as `mise run release:rust` / `mise run release:typescript`. Identity derivation now spans three tag namespaces (`eql-`, `eql-bindings-v`, `eql-typescript-v`) so a fresh alpha never reuses an `N` any language already claimed. The `all` target pins and publishes the SQL surface, docs, and both language packages under one identity on one commit. Why: language names (`rust`/`typescript`) keep the operator interface stable independent of packaging, and `bindings` meaning "all bindings" matches operator expectations now that there is more than one. Only affects release operators; no change to the installed EQL surface or wire format.
-- **The `eql_v3` tier's JSON envelope version is now `v: 3` (was `v: 2`).** Every `eql_v3` domain CHECK — the generated scalar families and the hand-written `eql_v3.json` SteVec document domain — now pins `VALUE->>'v' = '3'`, and the canonical payload bindings (`SchemaVersion` in `eql-bindings`, the emitted TypeScript alias, and the JSON Schema `const`) accept exactly `3`, rejecting the legacy `2` at the type boundary. The v3 tier previously carried the v2 wire version for continuity; with the tier now diverging from the legacy wire (the new `op` term), the envelope version matches the schema generation. The legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json` and its validation tests) is unchanged and stays `v: 2`. **Compatibility:** payloads produced for the v3 tier must now carry `v: 3` — a cipherstash-client that emits `v: 2` cannot insert into `eql_v3` domain columns until it is updated to emit the v3 envelope. See [U-001](docs/upgrading/v3.0.md#u-001-eql_v3-payloads-carry-v-3) in the 3.0 upgrade guide. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340))
-- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`int4`, `int8`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252))
-- **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`integer`, `bigint`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252))
-
-- **The self-contained `eql_v3` installer is now the sole release artifact, shipped under the canonical name `release/cipherstash-encrypt.sql` (+ `cipherstash-encrypt-uninstall.sql`).** The combined, Supabase, and Protect build variants are removed; `mise run build` now produces only the `eql_v3` surface, written under the canonical name that the combined build previously used — so existing install URLs keep working. Why: with `eql_v2` removed (see below), there is a single SQL surface to build, install, and test.
-
-- **Internal `eql_v3` index-term types and plumbing moved to a new `eql_v3_internal` schema; `eql_v3` stays the public API — including a callable function equivalent for every operator.** `eql_v3_internal` holds INTERNAL objects only: the SEM index-term **types** (`hmac_256`, `bloom_filter`, `ore_block_256`(+`_term`), `ore_cllw`) and their support functions/operators/opclasses, the generated unsupported-operator **blockers** and the shared `encrypted_domain_unsupported_*` / `jsonb_blocked_*` helpers, the **aggregate state functions**, and the encrypted-JSONB CHECK validators + `jsonb_array_to_bytea_array`. `eql_v3` keeps the full public surface: the column-type domains (all scalar families + `eql_v3.json` / `eql_v3.jsonb_entry` / `eql_v3.jsonb_query`), query operators, index extractors (`eq_term` / `ord_term` / `match_term` and the jsonb access functions), `min` / `max` aggregates, the `json → jsonb_query` cast, `version()`, `lints()`, **and — crucially — the operator-backing comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) plus the jsonb containment helpers (`jsonb_contains`/`jsonb_contained_by`/`jsonb_array`/`ste_vec_contains`). Why the wrappers stay public: they are the function-form equivalent of every supported operator, and not every platform can invoke custom operators — Supabase/PostgREST exposes the database through an auto-generated REST/RPC layer that calls **functions**, not operators (`WHERE col = $1` is not expressible there, but `eql_v3.eq(col, $1)` is). Only index-term-only TYPES need to be hidden (Supabase Studio's Table Builder type picker lists every type in every non-hidden schema); the callable wrappers do not, so they remain public. A new gate, `tests/sqlx/tests/v3_operator_equivalents_tests.rs`, fails CI if any supported operator's backing wrapper is hidden in `eql_v3_internal`. **Design decision — EQL never grants permissions automatically.** The installer issues no `GRANT`/`REVOKE`; access to `eql_v3` (and, where a public operator/aggregate dispatches into it, `eql_v3_internal`) is strictly opt-in — a deployment grants `USAGE` / `EXECUTE` deliberately (see [`docs/reference/permissions.md`](docs/reference/permissions.md)). This is a breaking schema-layout change for existing installs: audit each runtime role's grants against `docs/reference/permissions.md`.
-
-### Removed
-
-- **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent).
-### Fixed
-
-- **The `eql_v3` installer now runs on managed Postgres without superuser — the two SEM btree operator classes install conditionally.** `release/cipherstash-encrypt.sql` created `eql_v3_internal.ore_block_256_operator_class` and `eql_v3_internal.ore_cllw_ops` with bare `CREATE OPERATOR FAMILY` / `CREATE OPERATOR CLASS`, which PostgreSQL restricts to superusers. On Supabase (and most hosted Postgres), the installer runs as a non-superuser role, so the whole single-transaction install aborted at the first `CREATE OPERATOR FAMILY` with `must be superuser to create an operator family` (SQLSTATE `42501`) — leaving `eql_v3` uninstallable there despite the surface being otherwise managed-Postgres compatible. Both `operator_class.sql` files now wrap their family+class creation in a `DO` block that catches `insufficient_privilege` and continues with a `NOTICE`, so one artifact installs everywhere: superuser installs (self-managed Postgres, the SQLx test matrix) create the default btree opclass as before; non-superuser installs skip it and fall back to the order-preserving (OPE) ordering domains, whose extractor return types carry a native btree opclass and need no custom class. Any non-privilege error from the DDL still propagates. Verified end-to-end against live Supabase (skips, install commits, 0 opclasses) and a local superuser cluster (creates both opclasses). Also corrects the stale in-file comments claiming these files were excluded by a `**/*operator_class.sql` build glob — the v3 build (`tasks/build.sh`) globs `src/v3` wholesale and has no such exclusion. ([#375](https://github.com/cipherstash/encrypt-query-language/pull/375))
-- **`eql_v3.jsonb_entry` CHECK inlined; `jsonb_query` validator converted to plpgsql — removes SQL-function-executor overhead from the per-query needle casts.** Domain constraints cannot inline SQL functions, so `jsonb_entry`'s function-call CHECK paid ~18 µs on every cast — the needle cast in every `field_eq` query was the ENTIRE +19% v2→v3 regression on that scenario (in-DB 0.011 → 0.029 ms/query with identical `eq_term` costs; cipherstash/benches#23). The `jsonb_entry` CHECK now mirrors the validator body inline, with a leading `VALUE IS NULL OR` preserving STRICT NULL-passes semantics (equivalence pinned over a payload corpus by `jsonb_check::jsonb_entry_check_matches_validator`). `jsonb_query`'s CHECK cannot be inlined — validating sv elements needs a subquery, which CHECK constraints forbid — so `is_valid_ste_vec_query_payload` is plpgsql instead (cached plan vs per-call SQL-function executor; the #353 finding), guarded by `jsonb_check::jsonb_query_validator_is_plpgsql`. The `eql_v3.json` document CHECK — part of the documented privilege contract — is unchanged; `docs/reference/permissions.md` now notes the `jsonb_entry` cast requires no internal grant. ([#354](https://github.com/cipherstash/encrypt-query-language/issues/354))
-- **`ore_block_256` opclass-path helpers converted from `LANGUAGE sql` to plpgsql — restores v2-level ordered-scan performance.** `eql_v3_internal.jsonb_array_to_bytea_array` and `eql_v3_internal.jsonb_array_to_ore_block_256` were `LANGUAGE sql` for inlineability, but their only caller chain (`ore_block_256(val)`, plpgsql, feeding the btree operator class) can never inline SQL functions — every compared value paid the per-call SQL-function executor instead, measured at 3.5× the per-call cost of the logic-identical plpgsql form. Release benchmarks put the end-to-end cost at +43% on ORE ordered index scans vs EQL 2.3 (`0.513 → 0.736 ms` at 1M rows) and +36% on the composite bloom+ORE-order shape (`16.6 → 22.7 ms`); with the plpgsql form both scenarios return to (or beat) the v2 numbers — `0.553 ms` and `13.97 ms` respectively, validated A→B→A on a live 1M-row bench database. Semantics are unchanged: NULL/non-array inputs still return NULL, and the empty-`ob` COALESCE (#262) is preserved. The `eql-inline-critical` markers are retained so the pin_search_path pass keeps both functions unpinned — a `SET search_path` clause on plpgsql forces per-call configuration switching in the same hot path. Full attribution and experiment data: cipherstash/benches#23 (`v3-regressions-report.md`). ([#353](https://github.com/cipherstash/encrypt-query-language/issues/353))
-
-- **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.integer_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239))
-
-- **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamp` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276))
-
-- **An empty ORE term (`ob: []`) is now rejected by the ORE-bearing `eql_v3` domains instead of silently corrupting ordered queries.** Encrypting the empty string `""` as ordered text produces an empty ORE term (`ob: []`) — the only value that does — and previously an `""` row silently dropped out of `ORDER BY`, was wrongly returned by `eql_v3.max`, and threw off range-query counts (the `eql_v3.ore_block_256` extractor collapsed `ob: []` to NULL index terms). The ORE-bearing domains (`_ord` / `_ord_ore`, and text `_search`) now carry a `CHECK` requiring `ob` to be a non-empty array, so casting or inserting an empty-`ob` payload into an ordered column fails loudly with a check violation (SQLSTATE `23514`) rather than producing an unorderable row. This affects only the empty string in an ordered column: every non-empty string and every fixed-width scalar (int / date / numeric / float) always produces a non-empty `ob`. Storage and equality are unaffected — `""` can still be encrypted into a storage-only (`eql_v3.text`) or equality (`eql_v3.text_eq`) column with a real ciphertext (`c`) and HMAC (`hm`). As defense-in-depth for any path that bypasses the domain (e.g. a comparator composite built directly), the comparator also orders a zero-term ORE composite before every non-empty value (empty sorts first); a genuine SQL `NULL` row is unchanged and keeps standard `NULLS FIRST` / `NULLS LAST` semantics (the extractor is `STRICT`). ([#262](https://github.com/cipherstash/encrypt-query-language/issues/262))
-
 ## [2.3.1] — 2026-05-21
 
 ### Fixed
diff --git a/packages/eql/src/generated/schema-manifest.ts b/packages/eql/src/generated/schema-manifest.ts
index 0ab6804fb..c7b4fa347 100644
--- a/packages/eql/src/generated/schema-manifest.ts
+++ b/packages/eql/src/generated/schema-manifest.ts
@@ -22,12 +22,50 @@ export const schemaNames = [
   'integer',
   'json',
   'jsonb_entry',
-  'jsonb_query',
   'numeric_eq',
   'numeric_ord_ope',
   'numeric_ord_ore',
   'numeric_ord',
   'numeric',
+  'query_bigint_eq',
+  'query_bigint_ord_ope',
+  'query_bigint_ord_ore',
+  'query_bigint_ord',
+  'query_date_eq',
+  'query_date_ord_ope',
+  'query_date_ord_ore',
+  'query_date_ord',
+  'query_double_eq',
+  'query_double_ord_ope',
+  'query_double_ord_ore',
+  'query_double_ord',
+  'query_integer_eq',
+  'query_integer_ord_ope',
+  'query_integer_ord_ore',
+  'query_integer_ord',
+  'query_jsonb',
+  'query_numeric_eq',
+  'query_numeric_ord_ope',
+  'query_numeric_ord_ore',
+  'query_numeric_ord',
+  'query_real_eq',
+  'query_real_ord_ope',
+  'query_real_ord_ore',
+  'query_real_ord',
+  'query_smallint_eq',
+  'query_smallint_ord_ope',
+  'query_smallint_ord_ore',
+  'query_smallint_ord',
+  'query_text_eq',
+  'query_text_match',
+  'query_text_ord_ope',
+  'query_text_ord_ore',
+  'query_text_ord',
+  'query_text_search',
+  'query_timestamp_eq',
+  'query_timestamp_ord_ope',
+  'query_timestamp_ord_ore',
+  'query_timestamp_ord',
   'real_eq',
   'real_ord_ope',
   'real_ord_ore',
@@ -76,12 +114,50 @@ export const schemaIds = {
   "integer": "https://schemas.cipherstash.com/eql/v3/integer.json",
   "json": "https://schemas.cipherstash.com/eql/v3/json.json",
   "jsonb_entry": "https://schemas.cipherstash.com/eql/v3/jsonb_entry.json",
-  "jsonb_query": "https://schemas.cipherstash.com/eql/v3/jsonb_query.json",
   "numeric_eq": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json",
   "numeric_ord_ope": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ope.json",
   "numeric_ord_ore": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json",
   "numeric_ord": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json",
   "numeric": "https://schemas.cipherstash.com/eql/v3/numeric.json",
+  "query_bigint_eq": "https://schemas.cipherstash.com/eql/v3/query_bigint_eq.json",
+  "query_bigint_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ope.json",
+  "query_bigint_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ore.json",
+  "query_bigint_ord": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord.json",
+  "query_date_eq": "https://schemas.cipherstash.com/eql/v3/query_date_eq.json",
+  "query_date_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ope.json",
+  "query_date_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ore.json",
+  "query_date_ord": "https://schemas.cipherstash.com/eql/v3/query_date_ord.json",
+  "query_double_eq": "https://schemas.cipherstash.com/eql/v3/query_double_eq.json",
+  "query_double_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ope.json",
+  "query_double_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ore.json",
+  "query_double_ord": "https://schemas.cipherstash.com/eql/v3/query_double_ord.json",
+  "query_integer_eq": "https://schemas.cipherstash.com/eql/v3/query_integer_eq.json",
+  "query_integer_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ope.json",
+  "query_integer_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ore.json",
+  "query_integer_ord": "https://schemas.cipherstash.com/eql/v3/query_integer_ord.json",
+  "query_jsonb": "https://schemas.cipherstash.com/eql/v3/query_jsonb.json",
+  "query_numeric_eq": "https://schemas.cipherstash.com/eql/v3/query_numeric_eq.json",
+  "query_numeric_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ope.json",
+  "query_numeric_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ore.json",
+  "query_numeric_ord": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord.json",
+  "query_real_eq": "https://schemas.cipherstash.com/eql/v3/query_real_eq.json",
+  "query_real_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ope.json",
+  "query_real_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ore.json",
+  "query_real_ord": "https://schemas.cipherstash.com/eql/v3/query_real_ord.json",
+  "query_smallint_eq": "https://schemas.cipherstash.com/eql/v3/query_smallint_eq.json",
+  "query_smallint_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ope.json",
+  "query_smallint_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ore.json",
+  "query_smallint_ord": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord.json",
+  "query_text_eq": "https://schemas.cipherstash.com/eql/v3/query_text_eq.json",
+  "query_text_match": "https://schemas.cipherstash.com/eql/v3/query_text_match.json",
+  "query_text_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ope.json",
+  "query_text_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ore.json",
+  "query_text_ord": "https://schemas.cipherstash.com/eql/v3/query_text_ord.json",
+  "query_text_search": "https://schemas.cipherstash.com/eql/v3/query_text_search.json",
+  "query_timestamp_eq": "https://schemas.cipherstash.com/eql/v3/query_timestamp_eq.json",
+  "query_timestamp_ord_ope": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ope.json",
+  "query_timestamp_ord_ore": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ore.json",
+  "query_timestamp_ord": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord.json",
   "real_eq": "https://schemas.cipherstash.com/eql/v3/real_eq.json",
   "real_ord_ope": "https://schemas.cipherstash.com/eql/v3/real_ord_ope.json",
   "real_ord_ore": "https://schemas.cipherstash.com/eql/v3/real_ord_ore.json",
diff --git a/packages/eql/src/generated/schema/v3/query_bigint_eq.json b/packages/eql/src/generated/schema/v3/query_bigint_eq.json
new file mode 100644
index 000000000..1836bf657
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_bigint_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_bigint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "BigintEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_bigint_ord.json b/packages/eql/src/generated/schema/v3/query_bigint_ord.json
new file mode 100644
index 000000000..027c55b16
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_bigint_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_bigint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "BigintOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_bigint_ord_ope.json b/packages/eql/src/generated/schema/v3/query_bigint_ord_ope.json
new file mode 100644
index 000000000..e1f7de0ed
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_bigint_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_bigint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "BigintOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_bigint_ord_ore.json b/packages/eql/src/generated/schema/v3/query_bigint_ord_ore.json
new file mode 100644
index 000000000..eed10008b
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_bigint_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_bigint_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_bigint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "BigintOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_date_eq.json b/packages/eql/src/generated/schema/v3/query_date_eq.json
new file mode 100644
index 000000000..984858364
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_date_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_date_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_date_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "DateEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_date_ord.json b/packages/eql/src/generated/schema/v3/query_date_ord.json
new file mode 100644
index 000000000..a958a401c
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_date_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_date_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "DateOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_date_ord_ope.json b/packages/eql/src/generated/schema/v3/query_date_ord_ope.json
new file mode 100644
index 000000000..92e8e960f
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_date_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_date_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "DateOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_date_ord_ore.json b/packages/eql/src/generated/schema/v3/query_date_ord_ore.json
new file mode 100644
index 000000000..cc68f5d67
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_date_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_date_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_date_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "DateOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_double_eq.json b/packages/eql/src/generated/schema/v3/query_double_eq.json
new file mode 100644
index 000000000..7aee106cd
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_double_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_double_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_double_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "DoubleEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_double_ord.json b/packages/eql/src/generated/schema/v3/query_double_ord.json
new file mode 100644
index 000000000..73f779672
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_double_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_double_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "DoubleOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_double_ord_ope.json b/packages/eql/src/generated/schema/v3/query_double_ord_ope.json
new file mode 100644
index 000000000..2e47c813d
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_double_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_double_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "DoubleOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_double_ord_ore.json b/packages/eql/src/generated/schema/v3/query_double_ord_ore.json
new file mode 100644
index 000000000..8d62e570d
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_double_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_double_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_double_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "DoubleOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_integer_eq.json b/packages/eql/src/generated/schema/v3/query_integer_eq.json
new file mode 100644
index 000000000..d83ab492d
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_integer_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_integer_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "IntegerEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_integer_ord.json b/packages/eql/src/generated/schema/v3/query_integer_ord.json
new file mode 100644
index 000000000..01861ace6
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_integer_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_integer_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "IntegerOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_integer_ord_ope.json b/packages/eql/src/generated/schema/v3/query_integer_ord_ope.json
new file mode 100644
index 000000000..07df17da1
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_integer_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_integer_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "IntegerOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_integer_ord_ore.json b/packages/eql/src/generated/schema/v3/query_integer_ord_ore.json
new file mode 100644
index 000000000..039a9076e
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_integer_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_integer_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_integer_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "IntegerOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/jsonb_query.json b/packages/eql/src/generated/schema/v3/query_jsonb.json
similarity index 94%
rename from packages/eql/src/generated/schema/v3/jsonb_query.json
rename to packages/eql/src/generated/schema/v3/query_jsonb.json
index d33e4fe83..f08f6b7bf 100644
--- a/packages/eql/src/generated/schema/v3/jsonb_query.json
+++ b/packages/eql/src/generated/schema/v3/query_jsonb.json
@@ -49,10 +49,10 @@
       "type": "object"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/jsonb_query.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_jsonb.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.",
+  "description": "`eql_v3.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict.",
   "properties": {
     "sv": {
       "items": {
diff --git a/packages/eql/src/generated/schema/v3/query_numeric_eq.json b/packages/eql/src/generated/schema/v3/query_numeric_eq.json
new file mode 100644
index 000000000..199d48472
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_numeric_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_numeric_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "NumericEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_numeric_ord.json b/packages/eql/src/generated/schema/v3/query_numeric_ord.json
new file mode 100644
index 000000000..3e826a01d
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_numeric_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_numeric_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "NumericOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_numeric_ord_ope.json b/packages/eql/src/generated/schema/v3/query_numeric_ord_ope.json
new file mode 100644
index 000000000..93edbc906
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_numeric_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_numeric_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "NumericOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_numeric_ord_ore.json b/packages/eql/src/generated/schema/v3/query_numeric_ord_ore.json
new file mode 100644
index 000000000..9ee42bbbd
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_numeric_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_numeric_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_numeric_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "NumericOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_real_eq.json b/packages/eql/src/generated/schema/v3/query_real_eq.json
new file mode 100644
index 000000000..50a2e5b03
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_real_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_real_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_real_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "RealEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_real_ord.json b/packages/eql/src/generated/schema/v3/query_real_ord.json
new file mode 100644
index 000000000..5e1aa53ac
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_real_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_real_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "RealOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_real_ord_ope.json b/packages/eql/src/generated/schema/v3/query_real_ord_ope.json
new file mode 100644
index 000000000..38a5a337a
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_real_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_real_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "RealOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_real_ord_ore.json b/packages/eql/src/generated/schema/v3/query_real_ord_ore.json
new file mode 100644
index 000000000..7f062dda9
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_real_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_real_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_real_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "RealOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_smallint_eq.json b/packages/eql/src/generated/schema/v3/query_smallint_eq.json
new file mode 100644
index 000000000..77fe5e24c
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_smallint_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_smallint_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "SmallintEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_smallint_ord.json b/packages/eql/src/generated/schema/v3/query_smallint_ord.json
new file mode 100644
index 000000000..2302c2c55
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_smallint_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_smallint_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "SmallintOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_smallint_ord_ope.json b/packages/eql/src/generated/schema/v3/query_smallint_ord_ope.json
new file mode 100644
index 000000000..aaef17d03
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_smallint_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_smallint_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "SmallintOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_smallint_ord_ore.json b/packages/eql/src/generated/schema/v3/query_smallint_ord_ore.json
new file mode 100644
index 000000000..b3e2cd7aa
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_smallint_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_smallint_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_smallint_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "SmallintOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_text_eq.json b/packages/eql/src/generated/schema/v3/query_text_eq.json
new file mode 100644
index 000000000..b0ec58ca3
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_text_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_text_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_text_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "TextEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_text_match.json b/packages/eql/src/generated/schema/v3/query_text_match.json
new file mode 100644
index 000000000..d7a781677
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_text_match.json
@@ -0,0 +1,60 @@
+{
+  "$defs": {
+    "BloomFilter": {
+      "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.",
+      "items": {
+        "format": "int16",
+        "maximum": 32767,
+        "minimum": -32768,
+        "type": "integer"
+      },
+      "type": "array"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_text_match.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_text_match` — match domain query operand.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `bf`.",
+  "properties": {
+    "bf": {
+      "$ref": "#/$defs/BloomFilter"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "bf"
+  ],
+  "title": "TextMatchQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_text_ord.json b/packages/eql/src/generated/schema/v3/query_text_ord.json
new file mode 100644
index 000000000..6e8412be3
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_text_ord.json
@@ -0,0 +1,65 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_text_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm",
+    "ob"
+  ],
+  "title": "TextOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_text_ord_ope.json b/packages/eql/src/generated/schema/v3/query_text_ord_ope.json
new file mode 100644
index 000000000..21a2d4621
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_text_ord_ope.json
@@ -0,0 +1,62 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_text_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm",
+    "op"
+  ],
+  "title": "TextOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_text_ord_ore.json b/packages/eql/src/generated/schema/v3/query_text_ord_ore.json
new file mode 100644
index 000000000..850d4623c
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_text_ord_ore.json
@@ -0,0 +1,65 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_text_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_text_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm",
+    "ob"
+  ],
+  "title": "TextOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_text_search.json b/packages/eql/src/generated/schema/v3/query_text_search.json
new file mode 100644
index 000000000..909eafc67
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_text_search.json
@@ -0,0 +1,79 @@
+{
+  "$defs": {
+    "BloomFilter": {
+      "description": "Bloom-filter match term — the `bf` wire key. Backs the `_match` domains (`@>`/`<@` containment). Signed i16: EQL stores the filter as PostgreSQL `smallint[]`, and filters sized above 32768 emit upper-half bit positions as negative signed values.",
+      "items": {
+        "format": "int16",
+        "maximum": 32767,
+        "minimum": -32768,
+        "type": "integer"
+      },
+      "type": "array"
+    },
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_text_search.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_text_search` — search domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`.",
+  "properties": {
+    "bf": {
+      "$ref": "#/$defs/BloomFilter"
+    },
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm",
+    "ob",
+    "bf"
+  ],
+  "title": "TextSearchQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_timestamp_eq.json b/packages/eql/src/generated/schema/v3/query_timestamp_eq.json
new file mode 100644
index 000000000..f3e7ca3e0
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_timestamp_eq.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Hmac256": {
+      "description": "HMAC-SHA-256 equality term — the `hm` wire key. Backs the `_eq` domains\n(`=`, `<>`). SQL-side constructor: `eql_v3_internal.hmac_256`.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_eq.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_timestamp_eq` — equality domain query operand.\n\nOperators: `=` `<>`. Required keys: `v` `i` `hm`.",
+  "properties": {
+    "hm": {
+      "$ref": "#/$defs/Hmac256"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "hm"
+  ],
+  "title": "TimestampEqQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_timestamp_ord.json b/packages/eql/src/generated/schema/v3/query_timestamp_ord.json
new file mode 100644
index 000000000..5a6af8ac4
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_timestamp_ord.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_timestamp_ord` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "TimestampOrdQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_timestamp_ord_ope.json b/packages/eql/src/generated/schema/v3/query_timestamp_ord_ope.json
new file mode 100644
index 000000000..dc2bf8aae
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_timestamp_ord_ope.json
@@ -0,0 +1,54 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OpeCllw": {
+      "description": "CLLW-OPE order term — the `op` wire key. Backs the scalar `_ord_ope`\ndomains (`=` `<>` `<` `<=` `>` `>=`): a hex-encoded CLLW OPE ciphertext,\nsortable via native bytea comparison after hex-decode — unlike `ob`\n(block-ORE) and `oc` (CLLW-ORE) it needs no custom comparator. SQL-side\nconstructor: `eql_v3_internal.ope_cllw`. Distinct from [`OreCllw`] (`oc`), the\nSteVec CLLW-*ORE* term compared by the custom per-byte protocol.",
+      "type": "string"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ope.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_timestamp_ord_ope` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "op": {
+      "$ref": "#/$defs/OpeCllw"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "op"
+  ],
+  "title": "TimestampOrdOpeQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/query_timestamp_ord_ore.json b/packages/eql/src/generated/schema/v3/query_timestamp_ord_ore.json
new file mode 100644
index 000000000..4322bd7fc
--- /dev/null
+++ b/packages/eql/src/generated/schema/v3/query_timestamp_ord_ore.json
@@ -0,0 +1,57 @@
+{
+  "$defs": {
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/query_timestamp_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`eql_v3.query_timestamp_ord_ore` — ordering domain query operand.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.",
+  "properties": {
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "ob"
+  ],
+  "title": "TimestampOrdOreQuery",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/packages/eql/src/generated/v3/BigintEqQuery.ts b/packages/eql/src/generated/v3/BigintEqQuery.ts
new file mode 100644
index 000000000..7166ab6c8
--- /dev/null
+++ b/packages/eql/src/generated/v3/BigintEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_bigint_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type BigintEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/BigintOrdOpeQuery.ts b/packages/eql/src/generated/v3/BigintOrdOpeQuery.ts
new file mode 100644
index 000000000..7c01b2c77
--- /dev/null
+++ b/packages/eql/src/generated/v3/BigintOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_bigint_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type BigintOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/BigintOrdOreQuery.ts b/packages/eql/src/generated/v3/BigintOrdOreQuery.ts
new file mode 100644
index 000000000..28b2fc2a7
--- /dev/null
+++ b/packages/eql/src/generated/v3/BigintOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_bigint_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type BigintOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/BigintOrdQuery.ts b/packages/eql/src/generated/v3/BigintOrdQuery.ts
new file mode 100644
index 000000000..219b6f2dd
--- /dev/null
+++ b/packages/eql/src/generated/v3/BigintOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_bigint_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type BigintOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/DateEqQuery.ts b/packages/eql/src/generated/v3/DateEqQuery.ts
new file mode 100644
index 000000000..39b987447
--- /dev/null
+++ b/packages/eql/src/generated/v3/DateEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_date_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type DateEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/DateOrdOpeQuery.ts b/packages/eql/src/generated/v3/DateOrdOpeQuery.ts
new file mode 100644
index 000000000..396687d7b
--- /dev/null
+++ b/packages/eql/src/generated/v3/DateOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_date_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type DateOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/DateOrdOreQuery.ts b/packages/eql/src/generated/v3/DateOrdOreQuery.ts
new file mode 100644
index 000000000..726326377
--- /dev/null
+++ b/packages/eql/src/generated/v3/DateOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_date_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type DateOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/DateOrdQuery.ts b/packages/eql/src/generated/v3/DateOrdQuery.ts
new file mode 100644
index 000000000..bf3bfa66b
--- /dev/null
+++ b/packages/eql/src/generated/v3/DateOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_date_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type DateOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/DoubleEqQuery.ts b/packages/eql/src/generated/v3/DoubleEqQuery.ts
new file mode 100644
index 000000000..3ec5ce8e7
--- /dev/null
+++ b/packages/eql/src/generated/v3/DoubleEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_double_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type DoubleEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/DoubleOrdOpeQuery.ts b/packages/eql/src/generated/v3/DoubleOrdOpeQuery.ts
new file mode 100644
index 000000000..7aab5ae6e
--- /dev/null
+++ b/packages/eql/src/generated/v3/DoubleOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_double_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type DoubleOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/DoubleOrdOreQuery.ts b/packages/eql/src/generated/v3/DoubleOrdOreQuery.ts
new file mode 100644
index 000000000..937c44c41
--- /dev/null
+++ b/packages/eql/src/generated/v3/DoubleOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_double_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type DoubleOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/DoubleOrdQuery.ts b/packages/eql/src/generated/v3/DoubleOrdQuery.ts
new file mode 100644
index 000000000..9b35d87d3
--- /dev/null
+++ b/packages/eql/src/generated/v3/DoubleOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_double_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type DoubleOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/IntegerEqQuery.ts b/packages/eql/src/generated/v3/IntegerEqQuery.ts
new file mode 100644
index 000000000..c63844234
--- /dev/null
+++ b/packages/eql/src/generated/v3/IntegerEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_integer_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type IntegerEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/IntegerOrdOpeQuery.ts b/packages/eql/src/generated/v3/IntegerOrdOpeQuery.ts
new file mode 100644
index 000000000..a04709d0b
--- /dev/null
+++ b/packages/eql/src/generated/v3/IntegerOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_integer_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type IntegerOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/IntegerOrdOreQuery.ts b/packages/eql/src/generated/v3/IntegerOrdOreQuery.ts
new file mode 100644
index 000000000..e7c4c9e0b
--- /dev/null
+++ b/packages/eql/src/generated/v3/IntegerOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_integer_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type IntegerOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/IntegerOrdQuery.ts b/packages/eql/src/generated/v3/IntegerOrdQuery.ts
new file mode 100644
index 000000000..27952f861
--- /dev/null
+++ b/packages/eql/src/generated/v3/IntegerOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_integer_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type IntegerOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/NumericEqQuery.ts b/packages/eql/src/generated/v3/NumericEqQuery.ts
new file mode 100644
index 000000000..aa4cd6883
--- /dev/null
+++ b/packages/eql/src/generated/v3/NumericEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_numeric_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type NumericEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/NumericOrdOpeQuery.ts b/packages/eql/src/generated/v3/NumericOrdOpeQuery.ts
new file mode 100644
index 000000000..f6f2fd8ca
--- /dev/null
+++ b/packages/eql/src/generated/v3/NumericOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_numeric_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type NumericOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/NumericOrdOreQuery.ts b/packages/eql/src/generated/v3/NumericOrdOreQuery.ts
new file mode 100644
index 000000000..1b3c39a82
--- /dev/null
+++ b/packages/eql/src/generated/v3/NumericOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_numeric_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type NumericOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/NumericOrdQuery.ts b/packages/eql/src/generated/v3/NumericOrdQuery.ts
new file mode 100644
index 000000000..f2c7a2fc8
--- /dev/null
+++ b/packages/eql/src/generated/v3/NumericOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_numeric_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type NumericOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/RealEqQuery.ts b/packages/eql/src/generated/v3/RealEqQuery.ts
new file mode 100644
index 000000000..7eb74e86b
--- /dev/null
+++ b/packages/eql/src/generated/v3/RealEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_real_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type RealEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/RealOrdOpeQuery.ts b/packages/eql/src/generated/v3/RealOrdOpeQuery.ts
new file mode 100644
index 000000000..d815c3cea
--- /dev/null
+++ b/packages/eql/src/generated/v3/RealOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_real_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type RealOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/RealOrdOreQuery.ts b/packages/eql/src/generated/v3/RealOrdOreQuery.ts
new file mode 100644
index 000000000..08d72e5c6
--- /dev/null
+++ b/packages/eql/src/generated/v3/RealOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_real_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type RealOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/RealOrdQuery.ts b/packages/eql/src/generated/v3/RealOrdQuery.ts
new file mode 100644
index 000000000..9867c5af4
--- /dev/null
+++ b/packages/eql/src/generated/v3/RealOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_real_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type RealOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/SmallintEqQuery.ts b/packages/eql/src/generated/v3/SmallintEqQuery.ts
new file mode 100644
index 000000000..a7909d960
--- /dev/null
+++ b/packages/eql/src/generated/v3/SmallintEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_smallint_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type SmallintEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/SmallintOrdOpeQuery.ts b/packages/eql/src/generated/v3/SmallintOrdOpeQuery.ts
new file mode 100644
index 000000000..5924a30f4
--- /dev/null
+++ b/packages/eql/src/generated/v3/SmallintOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_smallint_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type SmallintOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/SmallintOrdOreQuery.ts b/packages/eql/src/generated/v3/SmallintOrdOreQuery.ts
new file mode 100644
index 000000000..78e4f38d9
--- /dev/null
+++ b/packages/eql/src/generated/v3/SmallintOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_smallint_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type SmallintOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/SmallintOrdQuery.ts b/packages/eql/src/generated/v3/SmallintOrdQuery.ts
new file mode 100644
index 000000000..7eabe8d72
--- /dev/null
+++ b/packages/eql/src/generated/v3/SmallintOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_smallint_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type SmallintOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/SteVecQuery.ts b/packages/eql/src/generated/v3/SteVecQuery.ts
index 7d4d64a8d..eb1cab954 100644
--- a/packages/eql/src/generated/v3/SteVecQuery.ts
+++ b/packages/eql/src/generated/v3/SteVecQuery.ts
@@ -2,6 +2,6 @@
 import type { SteVecQueryEntry } from "./SteVecQueryEntry";
 
 /**
- * `public.jsonb_query` — a containment needle (`{sv:[query-entry]}`). Strict.
+ * `eql_v3.query_jsonb` — a containment needle (`{sv:[query-entry]}`). Strict.
  */
 export type SteVecQuery = { sv: Array, };
diff --git a/packages/eql/src/generated/v3/TextEqQuery.ts b/packages/eql/src/generated/v3/TextEqQuery.ts
new file mode 100644
index 000000000..00bfdb41e
--- /dev/null
+++ b/packages/eql/src/generated/v3/TextEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_text_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type TextEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/TextMatchQuery.ts b/packages/eql/src/generated/v3/TextMatchQuery.ts
new file mode 100644
index 000000000..4e525ab6c
--- /dev/null
+++ b/packages/eql/src/generated/v3/TextMatchQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { BloomFilter } from "./BloomFilter";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_text_match` — match domain query operand.
+ *
+ * Operators: `@>` `<@`. Required keys: `v` `i` `bf`.
+ */
+export type TextMatchQuery = { v: SchemaVersion, i: Identifier, bf: BloomFilter, };
diff --git a/packages/eql/src/generated/v3/TextOrdOpeQuery.ts b/packages/eql/src/generated/v3/TextOrdOpeQuery.ts
new file mode 100644
index 000000000..ae7e69259
--- /dev/null
+++ b/packages/eql/src/generated/v3/TextOrdOpeQuery.ts
@@ -0,0 +1,12 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_text_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `op`.
+ */
+export type TextOrdOpeQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/TextOrdOreQuery.ts b/packages/eql/src/generated/v3/TextOrdOreQuery.ts
new file mode 100644
index 000000000..00290b7cc
--- /dev/null
+++ b/packages/eql/src/generated/v3/TextOrdOreQuery.ts
@@ -0,0 +1,12 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_text_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.
+ */
+export type TextOrdOreQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/TextOrdQuery.ts b/packages/eql/src/generated/v3/TextOrdQuery.ts
new file mode 100644
index 000000000..4fc033acb
--- /dev/null
+++ b/packages/eql/src/generated/v3/TextOrdQuery.ts
@@ -0,0 +1,12 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_text_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `hm` `ob`.
+ */
+export type TextOrdQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/TextSearchQuery.ts b/packages/eql/src/generated/v3/TextSearchQuery.ts
new file mode 100644
index 000000000..7a2f6c822
--- /dev/null
+++ b/packages/eql/src/generated/v3/TextSearchQuery.ts
@@ -0,0 +1,13 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { BloomFilter } from "./BloomFilter";
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_text_search` — search domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `hm` `ob` `bf`.
+ */
+export type TextSearchQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, ob: OreBlock256, bf: BloomFilter, };
diff --git a/packages/eql/src/generated/v3/TimestampEqQuery.ts b/packages/eql/src/generated/v3/TimestampEqQuery.ts
new file mode 100644
index 000000000..afc2e9820
--- /dev/null
+++ b/packages/eql/src/generated/v3/TimestampEqQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Hmac256 } from "./Hmac256";
+import type { Identifier } from "./Identifier";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_timestamp_eq` — equality domain query operand.
+ *
+ * Operators: `=` `<>`. Required keys: `v` `i` `hm`.
+ */
+export type TimestampEqQuery = { v: SchemaVersion, i: Identifier, hm: Hmac256, };
diff --git a/packages/eql/src/generated/v3/TimestampOrdOpeQuery.ts b/packages/eql/src/generated/v3/TimestampOrdOpeQuery.ts
new file mode 100644
index 000000000..d35251ae3
--- /dev/null
+++ b/packages/eql/src/generated/v3/TimestampOrdOpeQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OpeCllw } from "./OpeCllw";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_timestamp_ord_ope` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `op`.
+ */
+export type TimestampOrdOpeQuery = { v: SchemaVersion, i: Identifier, op: OpeCllw, };
diff --git a/packages/eql/src/generated/v3/TimestampOrdOreQuery.ts b/packages/eql/src/generated/v3/TimestampOrdOreQuery.ts
new file mode 100644
index 000000000..c5979fdbc
--- /dev/null
+++ b/packages/eql/src/generated/v3/TimestampOrdOreQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_timestamp_ord_ore` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type TimestampOrdOreQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/TimestampOrdQuery.ts b/packages/eql/src/generated/v3/TimestampOrdQuery.ts
new file mode 100644
index 000000000..65c9ab5d5
--- /dev/null
+++ b/packages/eql/src/generated/v3/TimestampOrdQuery.ts
@@ -0,0 +1,11 @@
+// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
+import type { Identifier } from "./Identifier";
+import type { OreBlock256 } from "./OreBlock256";
+import type { SchemaVersion } from "./SchemaVersion";
+
+/**
+ * `eql_v3.query_timestamp_ord` — ordering domain query operand.
+ *
+ * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `ob`.
+ */
+export type TimestampOrdQuery = { v: SchemaVersion, i: Identifier, ob: OreBlock256, };
diff --git a/packages/eql/src/generated/v3/index.ts b/packages/eql/src/generated/v3/index.ts
index 9c4bded3c..8e273d3a7 100644
--- a/packages/eql/src/generated/v3/index.ts
+++ b/packages/eql/src/generated/v3/index.ts
@@ -1,48 +1,76 @@
 export type * from './Bigint'
 export type * from './BigintEq'
+export type * from './BigintEqQuery'
 export type * from './BigintOrd'
 export type * from './BigintOrdOpe'
+export type * from './BigintOrdOpeQuery'
 export type * from './BigintOrdOre'
+export type * from './BigintOrdOreQuery'
+export type * from './BigintOrdQuery'
 export type * from './BloomFilter'
 export type * from './Boolean'
 export type * from './Ciphertext'
 export type * from './Date'
 export type * from './DateEq'
+export type * from './DateEqQuery'
 export type * from './DateOrd'
 export type * from './DateOrdOpe'
+export type * from './DateOrdOpeQuery'
 export type * from './DateOrdOre'
+export type * from './DateOrdOreQuery'
+export type * from './DateOrdQuery'
 export type * from './Double'
 export type * from './DoubleEq'
+export type * from './DoubleEqQuery'
 export type * from './DoubleOrd'
 export type * from './DoubleOrdOpe'
+export type * from './DoubleOrdOpeQuery'
 export type * from './DoubleOrdOre'
+export type * from './DoubleOrdOreQuery'
+export type * from './DoubleOrdQuery'
 export type * from './Hmac256'
 export type * from './Identifier'
 export type * from './Integer'
 export type * from './IntegerEq'
+export type * from './IntegerEqQuery'
 export type * from './IntegerOrd'
 export type * from './IntegerOrdOpe'
+export type * from './IntegerOrdOpeQuery'
 export type * from './IntegerOrdOre'
+export type * from './IntegerOrdOreQuery'
+export type * from './IntegerOrdQuery'
 export type * from './Numeric'
 export type * from './NumericEq'
+export type * from './NumericEqQuery'
 export type * from './NumericOrd'
 export type * from './NumericOrdOpe'
+export type * from './NumericOrdOpeQuery'
 export type * from './NumericOrdOre'
+export type * from './NumericOrdOreQuery'
+export type * from './NumericOrdQuery'
 export type * from './OpeCllw'
 export type * from './OreBlock256'
 export type * from './OreCllw'
 export type * from './Real'
 export type * from './RealEq'
+export type * from './RealEqQuery'
 export type * from './RealOrd'
 export type * from './RealOrdOpe'
+export type * from './RealOrdOpeQuery'
 export type * from './RealOrdOre'
+export type * from './RealOrdOreQuery'
+export type * from './RealOrdQuery'
 export type * from './SchemaVersion'
 export type * from './Selector'
 export type * from './Smallint'
 export type * from './SmallintEq'
+export type * from './SmallintEqQuery'
 export type * from './SmallintOrd'
 export type * from './SmallintOrdOpe'
+export type * from './SmallintOrdOpeQuery'
 export type * from './SmallintOrdOre'
+export type * from './SmallintOrdOreQuery'
+export type * from './SmallintOrdQuery'
 export type * from './SteVecDocument'
 export type * from './SteVecEntry'
 export type * from './SteVecForm'
@@ -51,13 +79,23 @@ export type * from './SteVecQueryEntry'
 export type * from './SteVecTerm'
 export type * from './Text'
 export type * from './TextEq'
+export type * from './TextEqQuery'
 export type * from './TextMatch'
+export type * from './TextMatchQuery'
 export type * from './TextOrd'
 export type * from './TextOrdOpe'
+export type * from './TextOrdOpeQuery'
 export type * from './TextOrdOre'
+export type * from './TextOrdOreQuery'
+export type * from './TextOrdQuery'
 export type * from './TextSearch'
+export type * from './TextSearchQuery'
 export type * from './Timestamp'
 export type * from './TimestampEq'
+export type * from './TimestampEqQuery'
 export type * from './TimestampOrd'
 export type * from './TimestampOrdOpe'
+export type * from './TimestampOrdOpeQuery'
 export type * from './TimestampOrdOre'
+export type * from './TimestampOrdOreQuery'
+export type * from './TimestampOrdQuery'

From 25a2001b00737f0b9dacbee81b26d9104eb144f7 Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 15:05:32 +1000
Subject: [PATCH 580/599] fix(ci): drop the pnpm dependency from the
 generated-output gates
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

types:check / typescript:generate / typescript:check invoked
'pnpm --filter @cipherstash/eql sync:generated', but the contexts that run
them — test-eql.yml's Rust workspace crates job and the pre-commit hook —
provision mise tools only, so CI failed with 'pnpm: command not found'
(exit 127).

sync-generated.mjs uses node builtins exclusively; it needs neither pnpm's
workspace resolution nor node_modules. Invoke it with node directly and add
node to mise [tools] so every mise-run context has it. pnpm remains a
package-workflow concern (lint-release.yml and release.yml set it up
explicitly).
---
 mise.toml | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/mise.toml b/mise.toml
index 71a907735..088b6416c 100644
--- a/mise.toml
+++ b/mise.toml
@@ -16,6 +16,10 @@
 # so every job that runs mise-action dies before any tools install. The
 # prebuilt binary has no compiler/MSRV dependency. Downstream cargo: tools
 # below are then fetched as prebuilt binaries via this cargo-binstall.
+# Node drives the @cipherstash/eql generated-output gates (types:check /
+# typescript:check invoke packages/eql/scripts/sync-generated.mjs directly —
+# node builtins only, no pnpm/node_modules needed at gate time).
+"node" = "22"
 "cargo-binstall" = "latest"
 "cargo:sqlx-cli" = "latest"
 # Installed via the already-present cargo-binstall (fast in CI). Drives the
@@ -255,7 +259,10 @@ depends = ["types:generate"]
 run = """
 #!/usr/bin/env bash
 set -euo pipefail
-pnpm --filter @cipherstash/eql sync:generated
+# node, not pnpm: sync-generated.mjs uses only node builtins, and this gate
+# runs in contexts (test-eql.yml's Rust job, the pre-commit hook) that
+# provision mise tools but not pnpm/node_modules.
+node packages/eql/scripts/sync-generated.mjs
 git diff --exit-code -- crates/eql-bindings/src/v3 crates/eql-bindings/bindings crates/eql-bindings/schema packages/eql/src/generated || {
   echo "eql-bindings generated Rust/TS/JSON or @cipherstash/eql package output is stale — run 'mise run types:generate' and 'mise run typescript:generate' and commit the result" >&2
   exit 1
@@ -273,7 +280,7 @@ fi
 description = "Regenerate @cipherstash/eql TypeScript package source from eql-bindings outputs"
 dir = "{{config_root}}"
 depends = ["types:generate"]
-run = "pnpm --filter @cipherstash/eql sync:generated"
+run = "node packages/eql/scripts/sync-generated.mjs"
 
 [tasks."typescript:check"]
 description = "Verify @cipherstash/eql generated package source is fresh"
@@ -282,7 +289,7 @@ depends = ["types:generate"]
 run = """
 #!/usr/bin/env bash
 set -euo pipefail
-pnpm --filter @cipherstash/eql sync:generated
+node packages/eql/scripts/sync-generated.mjs
 git diff --exit-code -- packages/eql/src/generated || {
   echo "@cipherstash/eql generated files are stale — run 'mise run typescript:generate' and commit the result" >&2
   exit 1

From 13c4a814af44c3cc2105ac52336732210c0aa75f Mon Sep 17 00:00:00 2001
From: Toby Hede 
Date: Wed, 8 Jul 2026 15:13:21 +1000
Subject: [PATCH 581/599] docs(claude): note that regenerating committed
 generated code is a deterministic no-op, not a conflict to resolve

---
 CLAUDE.md | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/CLAUDE.md b/CLAUDE.md
index 5e253e2be..939cb8b0a 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -73,6 +73,17 @@ The same generator also emits the **Rust payload bindings** under `crates/eql-bi
 
 Regeneration is deterministic: an identical `CATALOG` produces byte-identical SQL. If `mise run build` produces unexpected output, the change is in `crates/eql-domains/src` (the catalog/terms) or `crates/eql-codegen/src` (the renderers) — not in random run-to-run variation.
 
+**Committed generated code is never "in conflict" and never needs analysis — the generator is the source of truth.** After anything that changes the catalog (a merge/rebase that pulls in catalog changes, a `crates/eql-domains` edit), the committed generated surfaces (`src/v3/scalars/`, `crates/eql-bindings/{bindings,schema}`, `packages/eql/src/generated`) are brought up to date by **regenerating and committing** — it is a deterministic no-op, not a merge to resolve:
+
+```
+cargo clean   # only if a stale incremental cache makes eql-codegen misbehave (see below)
+mise run types:generate && mise run typescript:generate   # regenerate bindings
+mise run build                                            # regenerate SQL surface
+git add -A && git commit
+```
+
+Do **not** run the drift gates (`types:check` / `typescript:check` / `codegen:parity`) to "diagnose" a stale generated tree — a failing gate after a catalog change trivially means "regenerate and commit," nothing more; run the gates only to *confirm* after committing. And if `eql-codegen` fails to compile against source that is byte-identical to a base that compiles (e.g. `no method named …` on a catalog type), it is a **stale cargo incremental cache**, not a semantic merge break — `cargo clean` fixes it; do not go forensic on the code.
+
 Footguns the spec exists to prevent:
 
 - **Blockers must never be `STRICT`.** A `STRICT` blocker lets PostgreSQL skip the body and return `NULL` on a `NULL` argument, silently bypassing the "operator not supported" exception.

From 792c78d84ce386ba4e109acbab9e0f5cf4da9a16 Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 15:42:37 +1000
Subject: [PATCH 582/599] =?UTF-8?q?fix(release):=20address=20review=20find?=
 =?UTF-8?q?ings=20=E2=80=94=20publish=20guards,=20marker=20tightening,=20c?=
 =?UTF-8?q?ache=20lint=20coverage?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Addresses the remaining items from the changes-requested review
(https://github.com/cipherstash/encrypt-query-language/pull/374#pullrequestreview-4650993985):

- DEV-placeholder publish guards (finding 6): release-plz.yml refuses to
  publish when the committed crates/eql-bindings/sql bundle wasn't prepared
  for the crate's version (enforced only when the version isn't already on
  crates.io, so routine no-op runs still pass); the npm package gains a
  prepublishOnly gate (scripts/verify-release-assets.mjs) that covers BOTH
  publish paths — changeset publish (production) and npm-publish.mjs
  (prerelease) shell out to npm publish, which runs it.
- Prerelease marker (finding 7): classify accepts exactly 'chore(release):'
  (a bare 'release:' doc commit can no longer trigger a publish) and
  short-circuits to skip when the identity's eql-typescript-v tag already
  exists.
- One-identity-one-commit (finding 8): prerelease-publish-rust dispatches
  release-plz.yml against the eql- tag (same pattern as build-image), not
  the branch, so the crate publishes from the exact release commit.
- Supply chain (findings 9/10): npm pinned to an exact version in both
  publish jobs; mise-action cache disabled in release.yml and release-plz.yml
  and the no-workflow-caching lint extended to cover jdx/mise-action (with
  release-plz.yml added to its default file set, plus test cases).
- Changelog ownership (finding 5): CHANGELOG.md header, CLAUDE.md, and
  releasing.md now say what is true — Changesets maintains
  packages/eql/CHANGELOG.md (the lockstep release changelog); the root file
  is the frozen pre-3.0 archive.
- Access-model note (finding 12): releasing.md documents that prerelease
  publishes are gated by eql_v3 push access + branch protection.
- Tests (coverage finding): bumpCargoPackageVersion extracted from
  sync-lockstep-versions.mjs, now section-anchored (can never rewrite a
  column-0 version line outside [package]) with vitest coverage;
  prepare-bindings-assets.test.sh covers the version-validation gate (wired
  into lint-release.yml).
- Nits: no defaults.run.shell 'bash {0}' override in release.yml /
  release-plz.yml (GitHub's default bash is -eo pipefail); unused repoRoot
  dropped from copy-assets.mjs.
---
 .github/workflows/lint-release.yml            |  6 +-
 .github/workflows/release-plz.yml             | 38 +++++++++--
 .github/workflows/release.yml                 | 49 ++++++++++----
 CHANGELOG.md                                  |  2 +-
 CLAUDE.md                                     |  2 +-
 docs/development/releasing.md                 | 32 ++++++---
 packages/eql/package.json                     |  1 +
 packages/eql/scripts/copy-assets.mjs          |  1 -
 packages/eql/scripts/npm-publish.mjs          |  3 +
 .../eql/scripts/verify-release-assets.mjs     | 38 +++++++++++
 scripts/lint-no-workflow-caching.mjs          | 14 +++-
 scripts/lint-no-workflow-caching.test.mjs     | 25 +++++++
 scripts/sync-lockstep-versions.mjs            | 62 +++++++++++------
 scripts/sync-lockstep-versions.test.mjs       | 58 ++++++++++++++++
 tasks/release/prepare-bindings-assets.test.sh | 66 +++++++++++++++++++
 15 files changed, 347 insertions(+), 50 deletions(-)
 create mode 100644 packages/eql/scripts/verify-release-assets.mjs
 create mode 100644 scripts/sync-lockstep-versions.test.mjs
 create mode 100755 tasks/release/prepare-bindings-assets.test.sh

diff --git a/.github/workflows/lint-release.yml b/.github/workflows/lint-release.yml
index 250fd6a8e..b63c21091 100644
--- a/.github/workflows/lint-release.yml
+++ b/.github/workflows/lint-release.yml
@@ -54,7 +54,11 @@ jobs:
         run: |
           set -euo pipefail
           shellcheck \
-            tasks/release/prepare-bindings-assets.sh
+            tasks/release/prepare-bindings-assets.sh \
+            tasks/release/prepare-bindings-assets.test.sh
+
+      - name: prepare-bindings-assets validation unit test
+        run: bash tasks/release/prepare-bindings-assets.test.sh
 
       - uses: pnpm/action-setup@v6.0.8
         name: Install pnpm
diff --git a/.github/workflows/release-plz.yml b/.github/workflows/release-plz.yml
index 605ffdc64..8a6950fd9 100644
--- a/.github/workflows/release-plz.yml
+++ b/.github/workflows/release-plz.yml
@@ -37,9 +37,8 @@ env:
   FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
   MISE_VERBOSE: "1"
 
-defaults:
-  run:
-    shell: bash {0}
+# No `defaults.run.shell` override: GitHub's default `bash` shell runs with
+# `-eo pipefail` — the right default for a publish workflow.
 
 # Static group: push-to-main and workflow_dispatch share it so two release-plz
 # invocations never race a tag/publish. Never cancel — a cancelled release could
@@ -70,7 +69,38 @@ jobs:
         with:
           version: 2026.4.0
           install: true
-          cache: true
+          # Publish workflows must not restore caches (lint-no-workflow-caching
+          # covers mise-action): a poisoned toolchain cache would run inside the
+          # job that holds crates.io OIDC publishing power.
+          cache: false
+
+      # The crate bundles its SQL via include_str! on COMMITTED files, and
+      # release-plz publishes the committed tree verbatim. Refuse to publish a
+      # crate whose bundled SQL wasn't prepared for this exact version — e.g. a
+      # hand-pinned Cargo.toml without running `pnpm run version` would
+      # otherwise ship the DEV placeholder as its "exact SQL". Enforced only
+      # when this run would actually publish (the committed version is not on
+      # crates.io yet): routine no-op runs on main between releases carry the
+      # DEV placeholder legitimately. A crates.io API failure fails towards
+      # ENFORCING the guard, never towards skipping it.
+      - name: Verify bundled SQL matches the crate version
+        run: |
+          set -euo pipefail
+          cargo_version="$(grep -m1 '^version = ' crates/eql-bindings/Cargo.toml | cut -d'"' -f2)"
+          published="$(curl -fsSL --retry 3 "https://crates.io/api/v1/crates/eql-bindings/versions" | jq -r '.versions[].num' | grep -Fx "$cargo_version" || true)"
+          if [[ -n "$published" ]]; then
+            echo "eql-bindings@${cargo_version} is already on crates.io; this run is a publish no-op — skipping the bundled-SQL guard"
+            exit 0
+          fi
+          manifest_version="$(jq -r '.eqlVersion' crates/eql-bindings/sql/release-manifest.json)"
+          if [[ "$manifest_version" != "$cargo_version" ]]; then
+            echo "::error::crates/eql-bindings/sql/release-manifest.json eqlVersion ('$manifest_version') does not match Cargo.toml version ('$cargo_version') — the bundled SQL was not prepared for this release. Run 'pnpm run version' (or 'mise run release:prepare_bindings_assets --version $cargo_version') and commit the result." >&2
+            exit 1
+          fi
+          if ! grep -q "eql_v3" crates/eql-bindings/sql/cipherstash-encrypt.sql; then
+            echo "::error::crates/eql-bindings/sql/cipherstash-encrypt.sql looks like the DEV placeholder — refusing to publish it as release SQL." >&2
+            exit 1
+          fi
 
       - name: Run release-plz release
         uses: release-plz/action@v0.5
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f3e7b548b..badcbd503 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -30,9 +30,10 @@ concurrency:
   group: ${{ github.workflow }}-${{ github.ref }}
   cancel-in-progress: false
 
-defaults:
-  run:
-    shell: bash {0}
+# No `defaults.run.shell` override: GitHub's default `bash` shell runs with
+# `-eo pipefail`, which is exactly what a publish workflow wants. (An explicit
+# `bash {0}` would silently DISABLE errexit/pipefail for any step that forgets
+# its own `set -euo pipefail`.)
 
 jobs:
   classify:
@@ -60,8 +61,11 @@ jobs:
           if [[ "$branch" == "main" ]]; then
             mode="production"
           elif [[ "$branch" == "eql_v3" ]]; then
+            # Exactly `chore(release):` — a bare `release:` prefix would let an
+            # unrelated commit ("release: fix runbook") re-trigger the publish
+            # pipeline for the currently pinned identity.
             case "$subject" in
-              chore\(release\):*|release:*)
+              chore\(release\):*)
                 mode="prerelease"
                 ;;
             esac
@@ -73,7 +77,17 @@ jobs:
               echo "::error::prerelease release commits must already pin a prerelease version in packages/eql/package.json" >&2
               exit 1
             fi
-            prerelease="true"
+            # Idempotency short-circuit: if this identity's npm tag already
+            # exists, the release was already cut — a re-push of the marker (or
+            # a rerun) must not re-publish. Individual steps are also
+            # idempotent; this just skips the whole pipeline up front.
+            if git ls-remote --exit-code --tags origin "refs/tags/eql-typescript-v${version}" >/dev/null 2>&1; then
+              echo "eql-typescript-v${version} already exists; prerelease ${version} was already published — skipping"
+              mode="skip"
+              version=""
+            else
+              prerelease="true"
+            fi
           fi
 
           {
@@ -110,13 +124,16 @@ jobs:
           node-version: 22
 
       - name: Upgrade npm for OIDC trusted publishing
-        run: npm install -g npm@^11.5.1
+        run: npm install -g npm@11.5.1
 
       - uses: jdx/mise-action@v3
         with:
           version: 2026.4.0
           install: true
-          cache: true
+          # Publish workflows must not restore caches (lint-no-workflow-caching
+          # covers mise-action too): a poisoned toolchain cache would run inside
+          # the job that holds npm OIDC publishing power.
+          cache: false
 
       - name: Install dependencies
         run: pnpm install --frozen-lockfile
@@ -255,13 +272,16 @@ jobs:
           node-version: 22
 
       - name: Upgrade npm for OIDC trusted publishing
-        run: npm install -g npm@^11.5.1
+        run: npm install -g npm@11.5.1
 
       - uses: jdx/mise-action@v3
         with:
           version: 2026.4.0
           install: true
-          cache: true
+          # Publish workflows must not restore caches (lint-no-workflow-caching
+          # covers mise-action too): a poisoned toolchain cache would run inside
+          # the job that holds npm OIDC publishing power.
+          cache: false
 
       - name: Install dependencies
         run: pnpm install --frozen-lockfile
@@ -325,13 +345,18 @@ jobs:
     permissions:
       actions: write
     steps:
-      - name: Dispatch release-plz.yml against the prerelease commit
+      - name: Dispatch release-plz.yml against the prerelease tag
+        # Dispatch against the eql- tag, not the branch (same pattern
+        # as build-image): prerelease-build-sql (a `needs`) created that tag at
+        # the release commit, so the crate publishes from the EXACT commit the
+        # SQL + npm artifacts shipped from even if eql_v3 has advanced since
+        # the marker push — preserving the one-identity-one-commit invariant.
         env:
           GH_TOKEN: ${{ github.token }}
-          BRANCH: ${{ github.ref_name }}
+          VERSION: ${{ needs.classify.outputs.version }}
         run: |
           set -euo pipefail
-          gh workflow run release-plz.yml --ref "$BRANCH"
+          gh workflow run release-plz.yml --ref "eql-${VERSION}"
 
   summary:
     name: Summary
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c60fa2807..a0a3a66c4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,7 +16,7 @@ Tags follow `eql-` (e.g. `eql-2.3.0`); `release.yml` cuts the tag and i
 - **Security** — fixes that affect confidentiality, integrity, or availability.
 - **Upgrade notes** — for releases that change behaviour callers should be aware of (even when no API breaks), a pointer to `docs/upgrading/.md` with numbered notes (`U-NNN`) and a verification checklist.
 
-This file is generated by [Changesets](https://github.com/changesets/changesets) from the `.changeset/*.md` files added in each PR — it is **not hand-edited**. Add a changeset for every releasable change (see `.changeset/README.md`); Changesets writes the versioned section, and links each entry to its PR, when a release is cut.
+**From 3.0.0, release notes move to [`packages/eql/CHANGELOG.md`](packages/eql/CHANGELOG.md)** — assembled by [Changesets](https://github.com/changesets/changesets) from the `.changeset/*.md` files added in each PR (Changesets writes per-package changelogs; since SQL, the `eql-bindings` crate, and the `@cipherstash/eql` npm package release in lockstep at one version, that file is the changelog for the whole release). Add a changeset for every releasable change (see `.changeset/README.md`); don't hand-edit either changelog. This file is preserved as the pre-3.0 history and is no longer appended to.
 
 ## [2.3.1] — 2026-05-21
 
diff --git a/CLAUDE.md b/CLAUDE.md
index 939cb8b0a..c2b3067e3 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -219,7 +219,7 @@ Prefer `LANGUAGE SQL` over `LANGUAGE plpgsql` unless you need procedural feature
 
 ## Release & changelog discipline
 
-EQL's release version and `CHANGELOG.md` are both owned by **[Changesets](https://github.com/changesets/changesets)**. `@cipherstash/eql`'s package version is the single source of truth for the release identity `V` (SQL, the crate, and npm all ship at `V` — see `docs/development/releasing.md`), and `CHANGELOG.md` is **generated from the `.changeset/*.md` files** you add, not hand-edited. Per-version upgrade guides live under `docs/upgrading/`. What follows is what to do when working in this repo.
+EQL's release version and changelog are both owned by **[Changesets](https://github.com/changesets/changesets)**. `@cipherstash/eql`'s package version is the single source of truth for the release identity `V` (SQL, the crate, and npm all ship at `V` — see `docs/development/releasing.md`), and the release changelog — **`packages/eql/CHANGELOG.md`** (Changesets writes per-package changelogs; with everything in lockstep at one version, that file covers the whole release) — is **generated from the `.changeset/*.md` files** you add, not hand-edited. The root `CHANGELOG.md` is the frozen pre-3.0 archive. Per-version upgrade guides live under `docs/upgrading/`. What follows is what to do when working in this repo.
 
 **Cutting a release is scripted — don't hand-roll `gh release create`, and don't hand-edit `CHANGELOG.md`.** The single entrypoint is `.github/workflows/release.yml`:
 
diff --git a/docs/development/releasing.md b/docs/development/releasing.md
index 2b7a40f03..1f9f02f90 100644
--- a/docs/development/releasing.md
+++ b/docs/development/releasing.md
@@ -89,9 +89,13 @@ crates.io and tags `eql-bindings-vV`.
 
 ### Changelog
 
-`CHANGELOG.md` is owned by **Changesets** — it is generated from the
-`.changeset/*.md` files, not hand-edited. Every releasable change adds a
-changeset (`pnpm changeset`): its frontmatter selects the bump
+The release changelog is owned by **Changesets** — generated from the
+`.changeset/*.md` files, not hand-edited. Changesets writes *per-package*
+changelogs, so the file it maintains is **`packages/eql/CHANGELOG.md`**; since
+SQL, the crate, and the npm package release in lockstep at one version, that
+file is the changelog for the whole release. (The root `CHANGELOG.md` is the
+frozen pre-3.0 archive and is no longer appended to.) Every releasable change
+adds a changeset (`pnpm changeset`): its frontmatter selects the bump
 (`patch`/`minor`/`major`) and its body becomes the entry. `changeset version`
 (run in the "Version Packages" PR for finals, and locally in pre-mode when
 pinning a prerelease) writes the versioned section and computes `V`. See
@@ -110,9 +114,17 @@ that is **already pinned** in the repo.
    runs `sync-lockstep-versions.mjs`) so `packages/eql/package.json`,
    `Cargo.toml`, and the bundled SQL all carry the prerelease identity.
 2. **Commit with the release marker and push to `eql_v3`.** The commit subject
-   must be `chore(release): …` (or `release: …`) — that marker is what
-   `classify` keys on. `classify` reads the version from `package.json` and
-   **rejects the run** if it is not prerelease-shaped (`*-*`).
+   must be exactly `chore(release): …` — that marker is what `classify` keys
+   on (a bare `release:` prefix is deliberately NOT a marker, so an unrelated
+   commit can't trigger a publish). `classify` reads the version from
+   `package.json`, **rejects the run** if it is not prerelease-shaped (`*-*`),
+   and **skips** it if the `eql-typescript-vV` tag already exists (the identity
+   was already released — re-pushing a marker never republishes).
+
+   > **Access model:** a prerelease publish is gated by push access to
+   > `eql_v3` (plus this marker convention) — there is no separate release
+   > approval or commit-signature gate. Branch protection on `eql_v3` is the
+   > control; keep force-push restricted and reviews required there.
 3. `release.yml` then runs the prerelease jobs:
    - `prerelease-build-sql` / `prerelease-build-docs` → create the prerelease
      `eql-V` GitHub Release with SQL + docs.
@@ -120,8 +132,12 @@ that is **already pinned** in the repo.
      via `scripts/npm-publish.mjs`) and creates the `eql-typescript-vV` tag.
      Both steps are idempotent (`npm view` / `git ls-remote` guards) so a rerun
      after a partial failure converges.
-   - `prerelease-publish-rust` → dispatches `release-plz.yml --ref eql_v3` to
-     publish the crate and tag `eql-bindings-vV`.
+   - `prerelease-publish-rust` → dispatches `release-plz.yml` against the
+     `eql-V` **tag** (created by `prerelease-build-sql` at the release commit),
+     so the crate publishes from the exact commit the SQL + npm artifacts
+     shipped from even if `eql_v3` has advanced since. release-plz refuses to
+     publish if the committed `crates/eql-bindings/sql/` bundle wasn't prepared
+     for the crate's version (the DEV-placeholder guard).
 
 Prereleases keep the pending changesets **unconsumed** — Changesets pre-mode
 emits a `X.Y.Z-alpha.N` entry but the changesets are only finalized into the
diff --git a/packages/eql/package.json b/packages/eql/package.json
index 61e9c7852..117b77d5c 100644
--- a/packages/eql/package.json
+++ b/packages/eql/package.json
@@ -48,6 +48,7 @@
     "sync:generated": "node scripts/sync-generated.mjs",
     "check:generated": "node scripts/sync-generated.mjs --check",
     "build": "tsup",
+    "prepublishOnly": "node scripts/verify-release-assets.mjs",
     "dev": "tsup --watch",
     "test": "vitest run",
     "release": "pnpm run check:generated && pnpm run build && node scripts/npm-publish.mjs"
diff --git a/packages/eql/scripts/copy-assets.mjs b/packages/eql/scripts/copy-assets.mjs
index cc4439f6d..6c305d086 100644
--- a/packages/eql/scripts/copy-assets.mjs
+++ b/packages/eql/scripts/copy-assets.mjs
@@ -3,7 +3,6 @@ import { dirname, join, resolve } from 'node:path'
 import { fileURLToPath } from 'node:url'
 
 const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')
-const repoRoot = resolve(packageRoot, '../..')
 
 export async function copyAssets() {
   const dist = join(packageRoot, 'dist')
diff --git a/packages/eql/scripts/npm-publish.mjs b/packages/eql/scripts/npm-publish.mjs
index 3159a230b..3c940c0ed 100644
--- a/packages/eql/scripts/npm-publish.mjs
+++ b/packages/eql/scripts/npm-publish.mjs
@@ -11,6 +11,9 @@ const tag = prerelease ? prerelease[1] : 'latest'
 
 console.log(`publishing ${pkg.name}@${pkg.version} with npm dist-tag '${tag}'`)
 
+// The bundled-SQL freshness guard lives in prepublishOnly
+// (scripts/verify-release-assets.mjs), which `npm publish` runs for every
+// publish path — including `changeset publish` on the production side.
 const result = spawnSync(
   'npm',
   ['publish', '--access', 'public', '--provenance', '--tag', tag, ...process.argv.slice(2)],
diff --git a/packages/eql/scripts/verify-release-assets.mjs b/packages/eql/scripts/verify-release-assets.mjs
new file mode 100644
index 000000000..7692bf10a
--- /dev/null
+++ b/packages/eql/scripts/verify-release-assets.mjs
@@ -0,0 +1,38 @@
+#!/usr/bin/env node
+// prepublishOnly gate: the package bundles the exact-version SQL it was
+// generated against, so publishing with a stale/placeholder bundle is a
+// correctness bug in the published artifact. npm runs prepublishOnly for every
+// publish path — `changeset publish` (production) and scripts/npm-publish.mjs
+// (prerelease) both shell out to `npm publish` — so this guards both.
+import { existsSync, readFileSync } from 'node:fs'
+import { dirname, resolve } from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')
+const pkg = JSON.parse(readFileSync(resolve(packageRoot, 'package.json'), 'utf8'))
+
+const manifestPath = resolve(packageRoot, 'sql/release-manifest.json')
+if (!existsSync(manifestPath)) {
+  console.error(
+    `refusing to publish: ${manifestPath} is missing — run 'mise run release:prepare_bindings_assets --version ${pkg.version}' first`,
+  )
+  process.exit(1)
+}
+
+const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'))
+if (manifest.eqlVersion !== pkg.version) {
+  console.error(
+    `refusing to publish: sql/release-manifest.json eqlVersion ('${manifest.eqlVersion}') does not match package.json version ('${pkg.version}') — the bundled SQL was not prepared for this release. Run 'mise run release:prepare_bindings_assets --version ${pkg.version}' and rebuild.`,
+  )
+  process.exit(1)
+}
+
+const installSql = readFileSync(resolve(packageRoot, 'sql/cipherstash-encrypt.sql'), 'utf8')
+if (!installSql.includes('eql_v3')) {
+  console.error(
+    'refusing to publish: sql/cipherstash-encrypt.sql looks like the DEV placeholder — the bundled SQL was not prepared for this release.',
+  )
+  process.exit(1)
+}
+
+console.log(`release assets verified for ${pkg.name}@${pkg.version}`)
diff --git a/scripts/lint-no-workflow-caching.mjs b/scripts/lint-no-workflow-caching.mjs
index 6df74d2e4..78f1ea116 100644
--- a/scripts/lint-no-workflow-caching.mjs
+++ b/scripts/lint-no-workflow-caching.mjs
@@ -4,7 +4,10 @@ import { resolve } from 'node:path'
 import process from 'node:process'
 import yaml from 'js-yaml'
 
-const defaultWorkflowFiles = ['.github/workflows/release.yml']
+const defaultWorkflowFiles = [
+  '.github/workflows/release.yml',
+  '.github/workflows/release-plz.yml',
+]
 
 function asArray(value) {
   return Array.isArray(value) ? value : []
@@ -51,6 +54,15 @@ export function lintWorkflowDocument(document, file = '') {
         }
       }
 
+      // mise-action restores an executable toolchain from cache — the same
+      // poisoned-cache vector as node/pnpm dependency caches, running inside
+      // jobs that hold npm/crates.io OIDC publishing power.
+      if (action.startsWith('jdx/mise-action@')) {
+        if (!hasCacheInput(step, ['cache']) || !isExplicitlyDisabled(withBlock.cache)) {
+          errors.push(`${label}: jdx/mise-action must set with.cache: false in release workflows`)
+        }
+      }
+
       if (action.startsWith('actions/setup-node@')) {
         if (isConfiguredAndNotDisabled(withBlock.cache)) {
           errors.push(`${label}: actions/setup-node dependency cache must stay disabled`)
diff --git a/scripts/lint-no-workflow-caching.test.mjs b/scripts/lint-no-workflow-caching.test.mjs
index a554e7316..a8b9ae2c8 100644
--- a/scripts/lint-no-workflow-caching.test.mjs
+++ b/scripts/lint-no-workflow-caching.test.mjs
@@ -40,6 +40,31 @@ describe('release workflow dependency cache guard', () => {
     expect(errors[1]).toContain('with.cache: false')
   })
 
+  test('accepts mise-action with cache disabled, rejects missing or enabled cache', () => {
+    const ok = lintWorkflowDocument({
+      jobs: {
+        publish: {
+          steps: [{ uses: 'jdx/mise-action@v3', with: { install: true, cache: false } }],
+        },
+      },
+    })
+    expect(ok).toEqual([])
+
+    const errors = lintWorkflowDocument({
+      jobs: {
+        publish: {
+          steps: [
+            { uses: 'jdx/mise-action@v3', with: { install: true } },
+            { uses: 'jdx/mise-action@v3', with: { install: true, cache: true } },
+          ],
+        },
+      },
+    })
+    expect(errors).toHaveLength(2)
+    expect(errors[0]).toContain('jdx/mise-action must set with.cache: false')
+    expect(errors[1]).toContain('jdx/mise-action must set with.cache: false')
+  })
+
   test('rejects setup-node package manager caches and actions/cache', () => {
     const errors = lintWorkflowDocument({
       jobs: {
diff --git a/scripts/sync-lockstep-versions.mjs b/scripts/sync-lockstep-versions.mjs
index 31e9b5c5e..46c57faad 100644
--- a/scripts/sync-lockstep-versions.mjs
+++ b/scripts/sync-lockstep-versions.mjs
@@ -19,29 +19,49 @@ import { execFileSync } from 'node:child_process'
 import { readFileSync, writeFileSync } from 'node:fs'
 import { dirname, join } from 'node:path'
 import { fileURLToPath } from 'node:url'
+import process from 'node:process'
 
-const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
-
-const pkgPath = join(repoRoot, 'packages/eql/package.json')
-const version = JSON.parse(readFileSync(pkgPath, 'utf8')).version
-if (typeof version !== 'string' || version.length === 0) {
-  throw new Error(`could not read a version from ${pkgPath}`)
+// Set the `[package]` section's version in Cargo.toml text. Anchored to the
+// section header rather than "first `version = ...` line in the file" so a
+// dependency table that happens to carry a column-0 `version = "..."` line
+// (e.g. `[dependencies.foo]` long form) can never be rewritten by mistake.
+// Exported for scripts/sync-lockstep-versions.test.mjs.
+export function bumpCargoPackageVersion(cargo, version) {
+  const packageSection = cargo.match(/^\[package\]\n(?:(?!^\[).*\n)*/m)
+  if (!packageSection) {
+    throw new Error('no [package] section found in Cargo.toml')
+  }
+  const updated = packageSection[0].replace(
+    /^version = "[^"]*"$/m,
+    `version = "${version}"`,
+  )
+  if (updated === packageSection[0]) {
+    throw new Error('did not find a version line in the [package] section')
+  }
+  return cargo.replace(packageSection[0], updated)
 }
 
-// Set the crate's [package] version. Only the package version sits at column 0
-// as `version = "..."`; dependency versions are inline (`{ version = "1" }`).
-const cargoPath = join(repoRoot, 'crates/eql-bindings/Cargo.toml')
-const cargo = readFileSync(cargoPath, 'utf8')
-const cargoNext = cargo.replace(/^version = "[^"]*"$/m, `version = "${version}"`)
-if (cargoNext === cargo) {
-  throw new Error(`did not find a [package] version line to update in ${cargoPath}`)
-}
-writeFileSync(cargoPath, cargoNext)
+function main() {
+  const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
+
+  const pkgPath = join(repoRoot, 'packages/eql/package.json')
+  const version = JSON.parse(readFileSync(pkgPath, 'utf8')).version
+  if (typeof version !== 'string' || version.length === 0) {
+    throw new Error(`could not read a version from ${pkgPath}`)
+  }
+
+  const cargoPath = join(repoRoot, 'crates/eql-bindings/Cargo.toml')
+  writeFileSync(cargoPath, bumpCargoPackageVersion(readFileSync(cargoPath, 'utf8'), version))
 
-// Build the exact-version SQL and copy it (+ manifests) into both packages.
-execFileSync('mise', ['run', 'release:prepare_bindings_assets', '--version', version], {
-  cwd: repoRoot,
-  stdio: 'inherit',
-})
+  // Build the exact-version SQL and copy it (+ manifests) into both packages.
+  execFileSync('mise', ['run', 'release:prepare_bindings_assets', '--version', version], {
+    cwd: repoRoot,
+    stdio: 'inherit',
+  })
 
-console.log(`synced EQL lockstep version ${version} to Cargo.toml + bundled SQL assets`)
+  console.log(`synced EQL lockstep version ${version} to Cargo.toml + bundled SQL assets`)
+}
+
+if (import.meta.url === `file://${process.argv[1]}`) {
+  main()
+}
diff --git a/scripts/sync-lockstep-versions.test.mjs b/scripts/sync-lockstep-versions.test.mjs
new file mode 100644
index 000000000..9824e041d
--- /dev/null
+++ b/scripts/sync-lockstep-versions.test.mjs
@@ -0,0 +1,58 @@
+import { describe, expect, test } from 'vitest'
+import { bumpCargoPackageVersion } from './sync-lockstep-versions.mjs'
+
+const CARGO = `[package]
+name = "eql-bindings"
+version = "0.4.2"
+edition = "2021"
+
+[dependencies]
+serde = { version = "1", features = ["derive"] }
+`
+
+describe('lockstep Cargo.toml version bump', () => {
+  test('rewrites only the [package] version', () => {
+    const out = bumpCargoPackageVersion(CARGO, '3.0.0-alpha.7')
+    expect(out).toContain('version = "3.0.0-alpha.7"')
+    expect(out).toContain('serde = { version = "1", features = ["derive"] }')
+    expect(out).not.toContain('version = "0.4.2"')
+  })
+
+  test('never rewrites a column-0 version line outside [package]', () => {
+    const longFormDeps = `[dependencies.serde]
+version = "1"
+
+[package]
+name = "eql-bindings"
+version = "0.4.2"
+`
+    const out = bumpCargoPackageVersion(longFormDeps, '3.0.0')
+    expect(out).toContain('[dependencies.serde]\nversion = "1"')
+    expect(out).toContain('name = "eql-bindings"\nversion = "3.0.0"')
+  })
+
+  test('fails loudly when there is no [package] section or version line', () => {
+    expect(() => bumpCargoPackageVersion('[dependencies]\nserde = "1"\n', '3.0.0')).toThrow(
+      /no \[package\] section/,
+    )
+    expect(() =>
+      bumpCargoPackageVersion('[package]\nname = "eql-bindings"\n', '3.0.0'),
+    ).toThrow(/did not find a version line/)
+  })
+
+  test('round-trips the real crate manifest shape', () => {
+    const real = `[package]
+name = "eql-bindings"
+version = "3.0.0-alpha.2"
+edition = "2021"
+license = "MIT"
+
+[dependencies]
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+`
+    const out = bumpCargoPackageVersion(real, '3.0.0-alpha.3')
+    expect(out.match(/version = "3\.0\.0-alpha\.3"/g)).toHaveLength(1)
+    expect(out).toContain('serde_json = "1"')
+  })
+})
diff --git a/tasks/release/prepare-bindings-assets.test.sh b/tasks/release/prepare-bindings-assets.test.sh
new file mode 100755
index 000000000..3a0644e36
--- /dev/null
+++ b/tasks/release/prepare-bindings-assets.test.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+# Unit test for prepare-bindings-assets.sh's version validation — the gate
+# between an operator typo and building/bundling SQL under a wrong identity.
+# The build path itself is not exercised: a stub `mise` on PATH proves that a
+# valid version reaches the build step (stub exit code observed), while every
+# invalid identity must be rejected before any build runs.
+
+set -euo pipefail
+
+script="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/prepare-bindings-assets.sh"
+failures=0
+
+expect_reject() {
+  local version="$1"
+  if out=$("$script" --version "$version" 2>&1); then
+    echo "FAIL: --version '$version' should have been rejected" >&2
+    failures=$((failures + 1))
+  elif [[ "$out" != *"exact release identity"* ]]; then
+    echo "FAIL: --version '$version' rejected with unexpected message: $out" >&2
+    failures=$((failures + 1))
+  else
+    echo "ok: rejects '$version'"
+  fi
+}
+
+expect_accept() {
+  local version="$1"
+  # Stub mise: exit 42 so we can observe that validation passed and the build
+  # step was reached, without running a real build.
+  local stub_dir
+  stub_dir="$(mktemp -d)"
+  cat > "$stub_dir/mise" <<'EOF'
+#!/usr/bin/env bash
+exit 42
+EOF
+  chmod +x "$stub_dir/mise"
+  set +e
+  PATH="$stub_dir:$PATH" "$script" --version "$version" >/dev/null 2>&1
+  local rc=$?
+  set -e
+  rm -rf "$stub_dir"
+  if [[ "$rc" -ne 42 ]]; then
+    echo "FAIL: --version '$version' should pass validation and reach the build (expected rc 42, got $rc)" >&2
+    failures=$((failures + 1))
+  else
+    echo "ok: accepts '$version'"
+  fi
+}
+
+expect_reject ""
+expect_reject "3.0.0-alpha"          # channel without .N
+expect_reject "3.0.0-alpha.1.2"      # extra segment
+expect_reject "3.0.0-nightly.1"      # unknown channel
+expect_reject "v3.0.0"               # tag-style prefix
+expect_reject "3.0"                  # not full semver
+expect_reject "3.0.0-alpha.1; rm -rf /" # metacharacters never reach a shell
+
+expect_accept "3.0.0"
+expect_accept "3.0.0-alpha.7"
+expect_accept "10.20.30-rc.2"
+
+if [[ "$failures" -gt 0 ]]; then
+  echo "prepare-bindings-assets.test.sh: ${failures} failure(s)" >&2
+  exit 1
+fi
+echo "prepare-bindings-assets.test.sh: all assertions passed"

From b5c586f593af10babc63c7472b4d574bf352544c Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 16:11:01 +1000
Subject: [PATCH 583/599] chore(release): eql 3.0.0-alpha.3

Lockstep prerelease pin via 'pnpm run version' (changesets pre-mode):
package.json, Cargo.toml, and the bundled exact-version SQL assets all
carry 3.0.0-alpha.3. Pushing this marker commit to eql_v3 triggers
release.yml's prerelease path: SQL + docs GitHub release (eql-3.0.0-alpha.3),
npm publish (@cipherstash/eql, dist-tag alpha, tag eql-typescript-v3.0.0-alpha.3),
and the dispatched crate publish (eql-bindings-v3.0.0-alpha.3).
---
 .changeset/pre.json                           |    40 +-
 Cargo.lock                                    |     2 +-
 crates/eql-bindings/Cargo.toml                |     2 +-
 .../sql/cipherstash-encrypt-uninstall.sql     |     9 +-
 .../eql-bindings/sql/cipherstash-encrypt.sql  | 43369 +++++++++++++++-
 crates/eql-bindings/sql/release-manifest.json |     6 +-
 packages/eql/CHANGELOG.md                     |    49 +
 packages/eql/package.json                     |     2 +-
 .../eql/sql/cipherstash-encrypt-uninstall.sql |     9 +-
 packages/eql/sql/cipherstash-encrypt.sql      | 43369 +++++++++++++++-
 packages/eql/sql/release-manifest.json        |     6 +-
 .../eql/src/generated/release-manifest.ts     |     6 +-
 12 files changed, 86852 insertions(+), 17 deletions(-)
 create mode 100644 packages/eql/CHANGELOG.md

diff --git a/.changeset/pre.json b/.changeset/pre.json
index f75859b1d..fbb320289 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -4,5 +4,43 @@
   "initialVersions": {
     "@cipherstash/eql": "3.0.0-alpha.2"
   },
-  "changesets": []
+  "changesets": [
+    "eql-239-2",
+    "eql-239-3",
+    "eql-239",
+    "eql-241-2",
+    "eql-241",
+    "eql-243",
+    "eql-252",
+    "eql-253",
+    "eql-255",
+    "eql-256",
+    "eql-257",
+    "eql-260",
+    "eql-262",
+    "eql-267-2",
+    "eql-267",
+    "eql-293",
+    "eql-295",
+    "eql-299",
+    "eql-307",
+    "eql-336",
+    "eql-340-2",
+    "eql-340",
+    "eql-341",
+    "eql-3442",
+    "eql-349",
+    "eql-350",
+    "eql-353",
+    "eql-354",
+    "eql-373",
+    "eql-375",
+    "eql-377",
+    "eql-internal-schema",
+    "eql-language-binding-releases",
+    "eql-lints-schema-placement",
+    "eql-sole-installer",
+    "eql-v2-removed",
+    "eql-version-fn"
+  ]
 }
diff --git a/Cargo.lock b/Cargo.lock
index f3ecf0a1a..33104ef90 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1164,7 +1164,7 @@ dependencies = [
 
 [[package]]
 name = "eql-bindings"
-version = "0.4.2"
+version = "3.0.0-alpha.3"
 dependencies = [
  "eql-domains",
  "schemars",
diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml
index 0052c4f47..e17b52b89 100644
--- a/crates/eql-bindings/Cargo.toml
+++ b/crates/eql-bindings/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "eql-bindings"
-version = "0.4.2"
+version = "3.0.0-alpha.3"
 edition = "2021"
 description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)."
 # crates.io metadata. `license` is REQUIRED by crates.io — publish fails without
diff --git a/crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql b/crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql
index cb60f3296..7c9dd57f1 100644
--- a/crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql
+++ b/crates/eql-bindings/sql/cipherstash-encrypt-uninstall.sql
@@ -1 +1,8 @@
--- DEV placeholder. Release automation overwrites this file with exact-version EQL uninstall SQL before publishing.
+-- Uninstall the standalone eql_v3 surface. CASCADE removes the domains, SEM
+-- types, operators, opclass, and any columns typed with the eql_v3 domains.
+DROP SCHEMA IF EXISTS eql_v3 CASCADE;
+
+-- Drop the internal implementation schema after eql_v3 (eql_v3's extractors and
+-- operators depend on eql_v3_internal types; dropping eql_v3 first with CASCADE
+-- removes those dependents, then eql_v3_internal drops cleanly).
+DROP SCHEMA IF EXISTS eql_v3_internal CASCADE;
diff --git a/crates/eql-bindings/sql/cipherstash-encrypt.sql b/crates/eql-bindings/sql/cipherstash-encrypt.sql
index a30f106d9..617a1bddc 100644
--- a/crates/eql-bindings/sql/cipherstash-encrypt.sql
+++ b/crates/eql-bindings/sql/cipherstash-encrypt.sql
@@ -1 +1,43368 @@
--- DEV placeholder. Release automation overwrites this file with exact-version EQL SQL before publishing.
+--! @file v3/schema.sql
+--! @brief EQL v3 schema creation
+--!
+--! Creates the eql_v3 and eql_v3_internal schemas. User-column encrypted
+--! domains (public.integer, public.bigint, and future scalar domains) live in
+--! public so application tables survive EQL schema uninstall. eql_v3 is the
+--! public API for index-term extractors, aggregates, AND the operator-backing
+--! comparison wrappers
+--! (eq/neq/lt/lte/gt/gte/contains/contained_by, plus the jsonb containment
+--! helpers). The wrappers are public because they are the function-form
+--! equivalent of every supported operator: platforms without operator support
+--! (Supabase/PostgREST calls functions, not operators) invoke them by name.
+--! eql_v3_internal houses INTERNAL implementation objects only: the
+--! searchable-encrypted-metadata (SEM) index-term types
+--! (eql_v3_internal.hmac_256, eql_v3_internal.ore_block_256) and their support
+--! functions, the unsupported-operator blockers (which only raise), and the
+--! aggregate state functions. Together the two schemas are self-contained —
+--! they own every type they need and have no runtime dependency on another EQL
+--! schema.
+--!
+--! Drops existing schema if present to support clean reinstallation.
+--!
+--! @warning DROP SCHEMA CASCADE will remove all objects in the schema
+--! @note eql_v3 is a new, additional schema for the encrypted-domain families.
+--!
+--! @note DESIGN DECISION — EQL never grants permissions automatically. This
+--!       installer issues no GRANT (or REVOKE) on eql_v3 or eql_v3_internal:
+--!       access is strictly opt-in. A deployment that exposes EQL to
+--!       non-owner roles (e.g. Supabase `authenticated`/`anon` via PostgREST)
+--!       must explicitly `GRANT USAGE ON SCHEMA eql_v3` and `GRANT EXECUTE` on
+--!       the functions it needs. This is intentional least-privilege, not an
+--!       oversight — see docs/reference/permissions.md. eql_v3_internal is not
+--!       part of the public API and normally needs no grant; where a caller
+--!       reaches an internal object indirectly (a public operator/aggregate
+--!       whose backing state-fn/blocker lives there), grant it deliberately.
+
+--! @brief Drop existing EQL v3 schema
+--! @warning CASCADE will drop all dependent objects
+DROP SCHEMA IF EXISTS eql_v3 CASCADE;
+
+--! @brief Create EQL v3 schema
+--! @note Houses the encrypted-domain type families
+CREATE SCHEMA eql_v3;
+
+--! @brief Drop existing EQL v3 internal schema
+--! @warning CASCADE will drop all dependent objects
+DROP SCHEMA IF EXISTS eql_v3_internal CASCADE;
+
+--! @brief Create EQL v3 internal implementation schema
+--! @note Houses INTERNAL eql_v3 objects only: SEM index-term TYPES + their
+--!       support/constructor/comparator functions, the unsupported-operator
+--!       blockers (which only raise), the aggregate state functions, and the
+--!       SteVec CHECK validators. Kept out of the public `eql_v3` surface so
+--!       internal index-term TYPES do not clutter the Supabase Table Builder
+--!       type picker. NOTE: the operator-backing comparison *wrappers* are NOT
+--!       here — they are public in `eql_v3` so every operator has a callable
+--!       function equivalent for platforms without operator support.
+CREATE SCHEMA eql_v3_internal;
+COMMENT ON SCHEMA eql_v3_internal IS
+  'EQL internal implementation detail; not a public API surface.';
+
+--! @brief Schemas owned by the eql_v3 surface
+--!
+--! Single source of truth for tooling that must enumerate every schema this
+--! installer owns (`eql_v3.lints()`, `tasks/pin_search_path_v3.sql`), so a
+--! future third eql_v3-family schema is one array literal to edit instead of
+--! a hardcoded schema-name predicate repeated at every call site. Keep in
+--! sync with the `SCHEMA` / `INTERNAL_SCHEMA` constants in
+--! `crates/eql-codegen/src/consts.rs` — those drive what codegen emits into
+--! each schema; this drives what tooling scans across both.
+--!
+--! @return name[] The schema names eql_v3 owns (public + internal).
+CREATE FUNCTION eql_v3_internal.owned_schemas()
+  RETURNS name[]
+  LANGUAGE sql IMMUTABLE PARALLEL SAFE
+AS $$
+  SELECT ARRAY['eql_v3', 'eql_v3_internal']::name[]
+$$;
+
+--! @file v3/sem/ore_block_256/types.sql
+--! @brief ORE block index-term types (eql_v3 SEM).
+--!
+--! Self-contained eql_v3 copies of the Order-Revealing Encryption block types
+--! (design D1/D3). The eql_v2 originals are unchanged.
+
+--! @brief ORE block term type for Order-Revealing Encryption
+--!
+--! Composite type representing a single ORE block term. Stores encrypted data
+--! as bytea that enables range comparisons without decryption.
+CREATE TYPE eql_v3_internal.ore_block_256_term AS (
+  bytes bytea
+);
+
+
+--! @brief ORE block index term type for range queries
+--!
+--! Composite type containing an array of ORE block terms. The array is stored
+--! in the 'ob' field of encrypted data payloads.
+--!
+--! @note Transient type used only during query execution.
+CREATE TYPE eql_v3_internal.ore_block_256 AS (
+  terms eql_v3_internal.ore_block_256_term[]
+);
+
+--! @file v3/crypto.sql
+--! @brief PostgreSQL pgcrypto extension enablement (eql_v3 fork)
+--!
+--! Forked from src/crypto.sql (design D8) so the entire eql_v3 dependency
+--! closure lives under src/v3/. Enables the pgcrypto extension which provides
+--! cryptographic functions used by the eql_v3 ORE comparison path.
+--!
+--! Installs pgcrypto into the `extensions` schema (Supabase convention) to
+--! avoid the `extension_in_public` lint. Every EQL function that uses pgcrypto
+--! has `pg_catalog, extensions, public` on its `search_path`, so a pre-existing
+--! install in `public` keeps working — and a pre-existing install anywhere else
+--! will be rejected at install time. The body is idempotent
+--! (`CREATE SCHEMA IF NOT EXISTS`, `pg_extension` guard), so running it
+--! alongside the eql_v2 copy in a combined install is safe.
+--!
+--! @note pgcrypto provides functions like digest(), hmac(), gen_random_bytes()
+
+--! @brief Create extensions schema (Supabase convention)
+CREATE SCHEMA IF NOT EXISTS extensions;
+
+--! @brief Enable pgcrypto extension and validate its schema
+DO $$
+DECLARE
+  pgcrypto_schema name;
+BEGIN
+  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pgcrypto') THEN
+    CREATE EXTENSION pgcrypto WITH SCHEMA extensions;
+  END IF;
+
+  SELECT n.nspname INTO pgcrypto_schema
+  FROM pg_extension e
+  JOIN pg_namespace n ON n.oid = e.extnamespace
+  WHERE e.extname = 'pgcrypto';
+
+  IF pgcrypto_schema = 'extensions' THEN
+    -- expected location, nothing to say
+    NULL;
+  ELSIF pgcrypto_schema = 'public' THEN
+    RAISE NOTICE
+      'pgcrypto is installed in the `public` schema. EQL works against this layout, '
+      'but Supabase splinter will flag it as `extension_in_public`. Move it with: '
+      'ALTER EXTENSION pgcrypto SET SCHEMA extensions';
+  ELSE
+    RAISE EXCEPTION
+      'pgcrypto is installed in schema `%`, which is not on the EQL function search_path '
+      '(pg_catalog, extensions, public). EQL cryptographic operations would fail at '
+      'runtime. Relocate the extension before installing EQL: '
+      'ALTER EXTENSION pgcrypto SET SCHEMA extensions',
+      pgcrypto_schema;
+  END IF;
+END $$;
+
+--! @file v3/common.sql
+--! @brief Common utility functions for the self-contained eql_v3 surface.
+--!
+--! Forked from src/common.sql (design D7) so the eql_v3 ORE constructor owns the
+--! one transitive helper it needs without reaching into another schema. The
+--! eql_v2 original is unchanged.
+
+--! @brief Convert JSONB hex array to bytea array
+--! @internal
+--!
+--! Converts a JSONB array of hex-encoded strings into a PostgreSQL bytea array.
+--! Used for deserializing binary data (like ORE terms) from JSONB storage.
+--!
+--! @param val jsonb JSONB array of hex-encoded strings
+--! @return bytea[] Array of decoded binary values
+--!
+--! @note Returns NULL if input is JSON null
+--! @note Each array element is hex-decoded to bytea
+--! @note plpgsql, not `LANGUAGE sql` (issue #353). This helper's ONLY caller
+--!   chain is `ore_block_256(val)` -> `jsonb_array_to_ore_block_256(val)` —
+--!   both reached exclusively from plpgsql and btree operator-class support
+--!   contexts, where SQL functions can NEVER be inlined and instead pay the
+--!   per-call SQL-function executor (measured 3.5x the per-call cost of the
+--!   plpgsql equivalent; +43% on ORE ordered scans end-to-end). plpgsql
+--!   caches its plan across calls. The non-array guard preserves the v3
+--!   behaviour (returns NULL for a non-array scalar; the v2 plpgsql original
+--!   raised) — both callers only ever pass an array or JSON null (`val->'ob'`),
+--!   so the divergence stays unreachable in practice; JSON null and empty
+--!   array still return NULL exactly as before.
+CREATE FUNCTION eql_v3_internal.jsonb_array_to_bytea_array(val jsonb)
+RETURNS bytea[]
+  IMMUTABLE
+AS $$
+DECLARE
+  result bytea[];
+BEGIN
+  IF val IS NULL OR jsonb_typeof(val) != 'array' THEN
+    RETURN NULL;
+  END IF;
+  SELECT array_agg(decode(value::text, 'hex')::bytea)
+    INTO result
+  FROM jsonb_array_elements_text(val) AS value;
+  RETURN result;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @internal Keep the inline-critical marker so the post-install
+--! pin_search_path pass leaves this unpinned: a `SET search_path` clause on a
+--! plpgsql function forces per-call configuration switching — measurable on a
+--! helper invoked per compared value in the ore_block_256 opclass hot path.
+--! It takes a bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the
+--! structural skip in tasks/pin_search_path_v3.sql does not recognise it;
+--! this marker is the documented manual opt-in.
+COMMENT ON FUNCTION eql_v3_internal.jsonb_array_to_bytea_array(jsonb) IS
+  'eql-inline-critical: per-encrypted-value ORE opclass-path helper; must stay unpinned (SET search_path adds per-call overhead)';
+
+--! @file v3/sem/hmac_256/types.sql
+--! @brief HMAC-SHA256 index term type (eql_v3 SEM)
+--!
+--! Domain type representing HMAC-SHA256 hash values. Used for exact-match
+--! encrypted searches. The hash is stored in the 'hm' field of encrypted data
+--! payloads. Self-contained eql_v3 copy (design D1/D3); the eql_v2 original is
+--! unchanged.
+--!
+--! @note Transient type used only during query execution.
+CREATE DOMAIN eql_v3_internal.hmac_256 AS text;
+
+--! @file v3/sem/bloom_filter/types.sql
+--! @brief Self-contained eql_v3 Bloom-filter SEM index-term type.
+
+--! @brief Bloom-filter index term: a bit array stored as smallint[].
+--!
+--! Backs the `match` capability (`@>` / `<@`) on `eql_v3_internal.text_match`. The
+--! filter is read from the `bf` field of an encrypted jsonb payload. Native
+--! `smallint[]` array-containment (`@>`/`<@`) is inherited through the domain,
+--! so this type needs no custom operators.
+--!
+--! @note Self-contained: references no eql_v2 symbol.
+CREATE DOMAIN eql_v3_internal.bloom_filter AS smallint[];
+
+--! @file v3/scalars/functions.sql
+--! @brief Shared blocker helper for the eql_v3 encrypted-domain families.
+--!
+--! Per-domain wrapper functions live in src/v3/scalars//.
+--! Blockers in those files delegate to encrypted_domain_unsupported_bool
+--! so every domain raises a uniform domain-specific error rather than
+--! letting an unsupported operator fall through to native jsonb
+--! behaviour.
+
+--! @brief Shared blocker helper. Raises 'operator X is not supported
+--!        for TYPE' so unsupported domain operators surface a clear
+--!        error rather than fall through to native jsonb behaviour.
+--! @param type_name Domain type name (eql_v3.*)
+--! @param operator_name Operator symbol (=, <, @>, ->, etc.)
+--! @return boolean (never returns; always raises)
+CREATE FUNCTION eql_v3_internal.encrypted_domain_unsupported_bool(type_name text, operator_name text)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Shared blocker helper returning jsonb. Identical to
+--!        encrypted_domain_unsupported_bool but typed for blockers shadowing
+--!        native operators whose result is jsonb (#>, -, #-, ||), so composed
+--!        expressions resolve and the body raises rather than failing earlier
+--!        with a misleading 'operator does not exist' on a boolean result.
+--! @param type_name Domain type name (eql_v3.*)
+--! @param operator_name Operator symbol (#>, -, #-, ||, etc.)
+--! @return jsonb (never returns; always raises)
+CREATE FUNCTION eql_v3_internal.encrypted_domain_unsupported_jsonb(type_name text, operator_name text)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Shared blocker helper returning text. Identical to
+--!        encrypted_domain_unsupported_bool but typed for blockers shadowing
+--!        the native #>> operator whose result is text.
+--! @param type_name Domain type name (eql_v3.*)
+--! @param operator_name Operator symbol (#>>)
+--! @return text (never returns; always raises)
+CREATE FUNCTION eql_v3_internal.encrypted_domain_unsupported_text(type_name text, operator_name text)
+RETURNS text
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @file v3/sem/hmac_256/functions.sql
+--! @brief HMAC-SHA256 index-term extraction from a jsonb payload (eql_v3 SEM).
+--!
+--! jsonb-only subset of src/hmac_256/functions.sql. The encrypted-column and
+--! ste_vec-entry overloads are intentionally omitted — the eql_v3 scalar
+--! domains extract from the jsonb payload directly via a cast to the domain.
+--! (Doc comments deliberately avoid naming eql_v2 symbols so the
+--! self-containment grep stays clean.)
+
+--! @brief Extract HMAC-SHA256 index term from JSONB payload
+--!
+--! Inlinable single-statement SQL — the planner can fold this into the calling
+--! query so functional hash/btree indexes built on `eql_v3_internal.eq_term(col)`
+--! (which calls this) engage structurally.
+--!
+--! @param val jsonb containing encrypted EQL payload
+--! @return eql_v3_internal.hmac_256 HMAC-SHA256 hash value, or NULL when `hm` is absent
+CREATE FUNCTION eql_v3_internal.hmac_256(val jsonb)
+  RETURNS eql_v3_internal.hmac_256
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (val ->> 'hm')::eql_v3_internal.hmac_256
+$$;
+
+
+--! @brief Check if JSONB payload contains HMAC-SHA256 index term
+--!
+--! @param val jsonb containing encrypted EQL payload
+--! @return boolean True if 'hm' field is present and non-null
+CREATE FUNCTION eql_v3_internal.has_hmac_256(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (val ->> 'hm') IS NOT NULL
+$$;
+
+--! @file v3/sem/ore_block_256/functions.sql
+--! @brief ORE block construction, extraction, and comparison (eql_v3 SEM).
+--!
+--! jsonb-only subset of src/ore_block_u64_8_256/functions.sql. The
+--! encrypted-column overloads are omitted; the helper jsonb_array_to_bytea_array
+--! and pgcrypto encrypt() are reached via the forked src/v3/common.sql and
+--! src/v3/crypto.sql so the whole closure stays under src/v3. (Doc comments
+--! deliberately avoid naming eql_v2 symbols so the self-containment grep stays
+--! clean.)
+
+--! @brief Convert JSONB array to ORE block composite type
+--! @internal
+--! @param val jsonb Array of hex-encoded ORE block terms
+--! @return eql_v3_internal.ore_block_256 ORE block composite, or NULL if input is null
+--! @note plpgsql, not `LANGUAGE sql` (issue #353). The sole caller
+--!   (`ore_block_256`) is itself plpgsql, so this function is NEVER reached
+--!   from an inlinable context — as `LANGUAGE sql` it paid the per-call
+--!   SQL-function executor on every compared value in the opclass hot path
+--!   (measured: +43% on ORE ordered scans vs the plpgsql form). The
+--!   non-array guard preserves the v3 behaviour (returns NULL for a
+--!   non-array scalar; the v2 plpgsql original raised); the caller only
+--!   reaches this when `has_ore_block_256(val)` is true, which requires
+--!   `val->'ob'` to be a JSON array, so that branch stays unreachable.
+--!   An empty array (`ob: []`, what encrypting the empty string `""` produces)
+--!   yields a non-NULL composite with an EMPTY `terms` array — NOT NULL terms.
+--!   The `COALESCE` is load-bearing: `array_agg` over zero rows returns NULL, and
+--!   NULL terms make the comparator return NULL (so an empty-text row silently
+--!   drops out of ordered queries). An empty array instead engages the
+--!   comparator's `cardinality = 0` guard, which sorts empty BEFORE every
+--!   non-empty term. See issue #262 (pinned by T7).
+CREATE FUNCTION eql_v3_internal.jsonb_array_to_ore_block_256(val jsonb)
+RETURNS eql_v3_internal.ore_block_256
+  IMMUTABLE
+AS $$
+DECLARE
+  terms eql_v3_internal.ore_block_256_term[];
+BEGIN
+  IF val IS NULL OR jsonb_typeof(val) != 'array' THEN
+    RETURN NULL;
+  END IF;
+  SELECT array_agg(ROW(b)::eql_v3_internal.ore_block_256_term)
+    INTO terms
+  FROM unnest(eql_v3_internal.jsonb_array_to_bytea_array(val)) AS b;
+  -- plpgsql pitfall: `SELECT  INTO ` assigns the
+  -- select-list columns FIELD-WISE into the variable — return the row
+  -- constructor directly instead. The COALESCE stays load-bearing for the
+  -- empty-`ob` case (issue #262): array_agg over zero rows yields NULL, and
+  -- the comparator needs an EMPTY terms array, not NULL terms.
+  RETURN ROW(COALESCE(terms, ARRAY[]::eql_v3_internal.ore_block_256_term[]))::eql_v3_internal.ore_block_256;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @internal Keep the inline-critical marker so the post-install
+--! pin_search_path pass leaves this unpinned: a `SET search_path` clause on a
+--! plpgsql function forces per-call configuration switching — measurable on a
+--! helper invoked per compared value in the ore_block_256 opclass hot path.
+--! It takes a bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the
+--! structural skip in tasks/pin_search_path_v3.sql does not recognise it;
+--! this marker is the documented manual opt-in.
+COMMENT ON FUNCTION eql_v3_internal.jsonb_array_to_ore_block_256(jsonb) IS
+  'eql-inline-critical: per-encrypted-value ORE opclass-path helper; must stay unpinned (SET search_path adds per-call overhead)';
+
+
+--! @brief Extract ORE block index term from JSONB payload
+--! @param val jsonb containing encrypted EQL payload
+--! @return eql_v3_internal.ore_block_256 ORE block index term
+--! @throws Exception if 'ob' field is missing
+CREATE FUNCTION eql_v3_internal.ore_block_256(val jsonb)
+  RETURNS eql_v3_internal.ore_block_256
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    -- Declared STRICT: PostgreSQL returns NULL for a NULL argument without
+    -- entering the body, so no explicit `val IS NULL` guard is needed.
+    IF eql_v3_internal.has_ore_block_256(val) THEN
+      RETURN eql_v3_internal.jsonb_array_to_ore_block_256(val->'ob');
+    END IF;
+    RAISE 'Expected an ore index (ob) value in json: %', val;
+  END;
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Check if JSONB payload contains an ORE block index term
+--! @param val jsonb containing encrypted EQL payload
+--! @return boolean True only if the 'ob' field is present and is a JSON array
+--! @note A well-formed ORE index term is always a JSON array of block terms, so
+--!   this guard treats a present-but-non-array `ob` (a scalar or object) as
+--!   absent. That makes the extractor `ore_block_256(val)` RAISE on a
+--!   structurally invalid `ob` payload at the boundary instead of silently
+--!   degrading it to a NULL index term in `jsonb_array_to_ore_block_256`. The
+--!   previous `val ->> 'ob' IS NOT NULL` form stringified scalars/objects and so
+--!   reported them as present. `{}` (absent `ob`) and `{"ob": null}` (JSON null)
+--!   both remain `false`.
+CREATE FUNCTION eql_v3_internal.has_ore_block_256(val jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    RETURN COALESCE(jsonb_typeof(val -> 'ob') = 'array', false);
+  END;
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Compare two ORE block terms using cryptographic comparison
+--! @internal
+--! @param a eql_v3_internal.ore_block_256_term First ORE term
+--! @param b eql_v3_internal.ore_block_256_term Second ORE term
+--! @return integer -1 if a < b, 0 if a = b, 1 if a > b
+--! @throws Exception if ciphertexts are different lengths
+--! @note Marked `IMMUTABLE` (the three `compare_ore_block_256_term(s)`
+--!   overloads all are). This deliberately diverges from the v2 originals,
+--!   which carry no volatility marker and so default to `VOLATILE`. The
+--!   comparison is deterministic — its only crypto call, pgcrypto `encrypt()`,
+--!   is itself `IMMUTABLE STRICT PARALLEL SAFE` — so `IMMUTABLE` lets the
+--!   planner fold/cache these in ordering and index contexts. NOT `STRICT`:
+--!   the NULL-handling branches below are load-bearing for the array overload.
+CREATE FUNCTION eql_v3_internal.compare_ore_block_256_term(a eql_v3_internal.ore_block_256_term, b eql_v3_internal.ore_block_256_term)
+  RETURNS integer
+  IMMUTABLE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    eq boolean := true;
+    unequal_block smallint := 0;
+    hash_key bytea;
+    data_block bytea;
+    encrypt_block bytea;
+    target_block bytea;
+
+    left_block_size CONSTANT smallint := 16;
+    right_block_size CONSTANT smallint := 32;
+
+    -- Block count N is DERIVED from the ciphertext length, not hardcoded to 8.
+    -- Wire format per term:
+    --   [ N PRP bytes ][ N*16B left blocks ][ 16B hash key ][ N*32B right blocks ]
+    --   octet_length = 17*N + 16 + 32*N = 49*N + 16  =>  N = (octet_length - 16) / 49
+    -- This serves integer (N=8, 408B), timestamp (N=12, 604B), and numeric
+    -- (N=14, 702B) with one comparator.
+    n            integer;
+    left_offset  integer;  -- ordinal offset of the first left block (1 + N PRP bytes)
+    right_offset integer;  -- ordinal start of the right CT (= total left CT length = 17*N)
+
+    indicator smallint := 0;
+  BEGIN
+    IF a IS NULL AND b IS NULL THEN
+      RETURN 0;
+    END IF;
+
+    IF a IS NULL THEN
+      RETURN -1;
+    END IF;
+
+    IF b IS NULL THEN
+      RETURN 1;
+    END IF;
+
+    IF bit_length(a.bytes) != bit_length(b.bytes) THEN
+      RAISE EXCEPTION 'Ciphertexts are different lengths';
+    END IF;
+
+    -- Well-formedness: length must be exactly 49*N + 16 for some N >= 1. The
+    -- modulo alone is insufficient -- a 16-byte term passes (16 - 16) % 49 = 0
+    -- and derives N = 0, which would fall through to the all-blocks-equal path
+    -- and return 0 instead of raising. The `<= 16` clause is load-bearing.
+    IF octet_length(a.bytes) <= 16 OR (octet_length(a.bytes) - 16) % 49 != 0 THEN
+      RAISE EXCEPTION 'Malformed ORE term: % bytes', octet_length(a.bytes);
+    END IF;
+
+    n := (octet_length(a.bytes) - 16) / 49;
+    left_offset := 1 + n;     -- left blocks begin right after the N PRP bytes
+    right_offset := 17 * n;   -- right CT begins right after the 17*N-byte left CT
+
+    FOR block IN 0..n-1 LOOP
+      -- Compare each PRP byte (the first N bytes) and its 16-byte left block.
+      IF
+        substr(a.bytes, 1 + block, 1) != substr(b.bytes, 1 + block, 1)
+        OR substr(a.bytes, left_offset + left_block_size * block, left_block_size) != substr(b.bytes, left_offset + left_block_size * block, left_block_size)
+      THEN
+        IF eq THEN
+          unequal_block := block;
+        END IF;
+        eq = false;
+      END IF;
+    END LOOP;
+
+    IF eq THEN
+      RETURN 0::integer;
+    END IF;
+
+    -- Hash key is the IV from the right CT of b.
+    hash_key := substr(b.bytes, right_offset + 1, 16);
+
+    -- First right block is at right_offset + nonce_size (ordinally indexed).
+    target_block := substr(b.bytes, right_offset + 17 + (unequal_block * right_block_size), right_block_size);
+
+    data_block := substr(a.bytes, left_offset + (left_block_size * unequal_block), left_block_size);
+
+    encrypt_block := encrypt(data_block::bytea, hash_key::bytea, 'aes-ecb');
+
+    indicator := (
+      get_bit(
+        encrypt_block,
+        0
+      ) + get_bit(target_block, get_byte(a.bytes, unequal_block))) % 2;
+
+    IF indicator = 1 THEN
+      RETURN 1::integer;
+    ELSE
+      RETURN -1::integer;
+    END IF;
+  END;
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Compare arrays of ORE block terms recursively
+--! @internal
+--! @param a eql_v3_internal.ore_block_256_term[] First array
+--! @param b eql_v3_internal.ore_block_256_term[] Second array
+--! @return integer -1/0/1, or NULL if either array is NULL
+CREATE FUNCTION eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256_term[], b eql_v3_internal.ore_block_256_term[])
+RETURNS integer
+  IMMUTABLE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    cmp_result integer;
+  BEGIN
+    IF a IS NULL OR b IS NULL THEN
+      RETURN NULL;
+    END IF;
+
+    IF cardinality(a) = 0 AND cardinality(b) = 0 THEN
+      RETURN 0;
+    END IF;
+
+    IF (cardinality(a) = 0) AND cardinality(b) > 0 THEN
+      RETURN -1;
+    END IF;
+
+    IF cardinality(a) > 0 AND (cardinality(b) = 0) THEN
+      RETURN 1;
+    END IF;
+
+    cmp_result := eql_v3_internal.compare_ore_block_256_term(a[1], b[1]);
+
+    IF cmp_result = 0 THEN
+      RETURN eql_v3_internal.compare_ore_block_256_terms(a[2:array_length(a,1)], b[2:array_length(b,1)]);
+    END IF;
+
+    RETURN cmp_result;
+  END
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Compare ORE block composite types
+--! @internal
+--! @param a eql_v3_internal.ore_block_256 First ORE block
+--! @param b eql_v3_internal.ore_block_256 Second ORE block
+--! @return integer -1/0/1
+CREATE FUNCTION eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS integer
+  IMMUTABLE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    RETURN eql_v3_internal.compare_ore_block_256_terms(a.terms, b.terms);
+  END
+$$ LANGUAGE plpgsql;
+
+--! @file v3/sem/ore_block_256/operators.sql
+--! @brief Comparison operators on eql_v3_internal.ore_block_256.
+--!
+--! The six backing functions are inlinable single-statement SQL so the planner
+--! can fold the eql_v3 comparison wrappers through to functional-index matching.
+
+--! @brief Equality backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the ORE blocks are equal
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_eq(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) = 0
+$$;
+
+--! @brief Not-equal backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the ORE blocks are not equal
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_neq(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) <> 0
+$$;
+
+--! @brief Less-than backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is less than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_lt(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) = -1
+$$;
+
+--! @brief Less-than-or-equal backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is less than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_lte(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) != 1
+$$;
+
+--! @brief Greater-than backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is greater than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_gt(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) = 1
+$$;
+
+--! @brief Greater-than-or-equal backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is greater than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_gte(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) != -1
+$$;
+
+
+--! @brief = operator for ORE block types
+--!
+--! COMMUTATOR is the operator itself: equality is symmetric. Required for the
+--! MERGES flag — without it the planner raises "could not find commutator" the
+--! first time an ore_block equality is used as a join qual (e.g. via the inlined
+--! eql_v3_internal._ord_ore equality wrappers).
+CREATE OPERATOR public.= (
+  FUNCTION=eql_v3_internal.ore_block_256_eq,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.=),
+  NEGATOR = OPERATOR(public.<>),
+  RESTRICT = eqsel,
+  JOIN = eqjoinsel,
+  HASHES,
+  MERGES
+);
+
+--! @brief <> operator for ORE block types
+CREATE OPERATOR public.<> (
+  FUNCTION=eql_v3_internal.ore_block_256_neq,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.<>),
+  NEGATOR = OPERATOR(public.=),
+  RESTRICT = neqsel,
+  JOIN = neqjoinsel,
+  MERGES
+);
+
+--! @brief > operator for ORE block types
+CREATE OPERATOR public.> (
+  FUNCTION=eql_v3_internal.ore_block_256_gt,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.<),
+  NEGATOR = OPERATOR(public.<=),
+  RESTRICT = scalargtsel,
+  JOIN = scalargtjoinsel
+);
+
+--! @brief < operator for ORE block types
+CREATE OPERATOR public.< (
+  FUNCTION=eql_v3_internal.ore_block_256_lt,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.>),
+  NEGATOR = OPERATOR(public.>=),
+  RESTRICT = scalarltsel,
+  JOIN = scalarltjoinsel
+);
+
+--! @brief <= operator for ORE block types
+CREATE OPERATOR public.<= (
+  FUNCTION=eql_v3_internal.ore_block_256_lte,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.>=),
+  NEGATOR = OPERATOR(public.>),
+  RESTRICT = scalarlesel,
+  JOIN = scalarlejoinsel
+);
+
+--! @brief >= operator for ORE block types
+CREATE OPERATOR public.>= (
+  FUNCTION=eql_v3_internal.ore_block_256_gte,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.<=),
+  NEGATOR = OPERATOR(public.<),
+  RESTRICT = scalargesel,
+  JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/real/real_types.sql
+--! @brief Encrypted-domain types for real.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.real.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real IS 'EQL encrypted real (storage only)';
+
+  --! @brief Encrypted domain public.real_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_eq IS 'EQL encrypted real (equality)';
+
+  --! @brief Encrypted domain public.real_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_ord_ore IS 'EQL encrypted real (equality, ordering)';
+
+  --! @brief Encrypted domain public.real_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_ord IS 'EQL encrypted real (equality, ordering)';
+
+  --! @brief Encrypted domain public.real_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_ord_ope IS 'EQL encrypted real (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ore_functions.sql
+--! @brief Functions for public.real_ord_ore.
+
+--! @brief Index extractor for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.real_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector text
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ore, selector text)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector integer
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ore, selector integer)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param selector public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord_ore)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param selector public.real_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/smallint/smallint_types.sql
+--! @brief Encrypted-domain types for smallint.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.smallint.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint IS 'EQL encrypted smallint (storage only)';
+
+  --! @brief Encrypted domain public.smallint_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_eq IS 'EQL encrypted smallint (equality)';
+
+  --! @brief Encrypted domain public.smallint_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_ord_ore IS 'EQL encrypted smallint (equality, ordering)';
+
+  --! @brief Encrypted domain public.smallint_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_ord IS 'EQL encrypted smallint (equality, ordering)';
+
+  --! @brief Encrypted domain public.smallint_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_ord_ope IS 'EQL encrypted smallint (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_eq_functions.sql
+--! @brief Functions for public.smallint_eq.
+
+--! @brief Index extractor for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.smallint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.smallint_eq) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.smallint_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.smallint_eq) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.smallint_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector text
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_eq, selector text)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector integer
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_eq, selector integer)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param selector public.smallint_eq
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_eq)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param selector public.smallint_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_eq, b public.smallint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/date/date_types.sql
+--! @brief Encrypted-domain types for date.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.date.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date IS 'EQL encrypted date (storage only)';
+
+  --! @brief Encrypted domain public.date_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_eq IS 'EQL encrypted date (equality)';
+
+  --! @brief Encrypted domain public.date_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_ord_ore IS 'EQL encrypted date (equality, ordering)';
+
+  --! @brief Encrypted domain public.date_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_ord IS 'EQL encrypted date (equality, ordering)';
+
+  --! @brief Encrypted domain public.date_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_ord_ope IS 'EQL encrypted date (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/numeric/numeric_types.sql
+--! @brief Encrypted-domain types for numeric.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.numeric.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric IS 'EQL encrypted numeric (storage only)';
+
+  --! @brief Encrypted domain public.numeric_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_eq IS 'EQL encrypted numeric (equality)';
+
+  --! @brief Encrypted domain public.numeric_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_ord_ore IS 'EQL encrypted numeric (equality, ordering)';
+
+  --! @brief Encrypted domain public.numeric_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_ord IS 'EQL encrypted numeric (equality, ordering)';
+
+  --! @brief Encrypted domain public.numeric_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_ord_ope IS 'EQL encrypted numeric (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/double/double_types.sql
+--! @brief Encrypted-domain types for double.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.double.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double IS 'EQL encrypted double (storage only)';
+
+  --! @brief Encrypted domain public.double_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_eq IS 'EQL encrypted double (equality)';
+
+  --! @brief Encrypted domain public.double_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_ord_ore IS 'EQL encrypted double (equality, ordering)';
+
+  --! @brief Encrypted domain public.double_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_ord IS 'EQL encrypted double (equality, ordering)';
+
+  --! @brief Encrypted domain public.double_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_ord_ope IS 'EQL encrypted double (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_eq_functions.sql
+--! @brief Functions for public.double_eq.
+
+--! @brief Index extractor for public.double_eq.
+--! @param a public.double_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.double_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.double_eq) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.double_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.double_eq) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.double_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector text
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.double_eq, selector text)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector integer
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.double_eq, selector integer)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param selector public.double_eq
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_eq)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param selector public.double_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_eq, b public.double_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/integer/integer_types.sql
+--! @brief Encrypted-domain types for integer.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.integer.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer IS 'EQL encrypted integer (storage only)';
+
+  --! @brief Encrypted domain public.integer_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_eq IS 'EQL encrypted integer (equality)';
+
+  --! @brief Encrypted domain public.integer_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_ord_ore IS 'EQL encrypted integer (equality, ordering)';
+
+  --! @brief Encrypted domain public.integer_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_ord IS 'EQL encrypted integer (equality, ordering)';
+
+  --! @brief Encrypted domain public.integer_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_ord_ope IS 'EQL encrypted integer (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/text/text_types.sql
+--! @brief Encrypted-domain types for text.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.text.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text IS 'EQL encrypted text (storage only)';
+
+  --! @brief Encrypted domain public.text_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_eq IS 'EQL encrypted text (equality)';
+
+  --! @brief Encrypted domain public.text_match.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_match' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_match AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'bf'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_match IS 'EQL encrypted text (containment)';
+
+  --! @brief Encrypted domain public.text_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_ord_ore IS 'EQL encrypted text (equality, ordering)';
+
+  --! @brief Encrypted domain public.text_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_ord IS 'EQL encrypted text (equality, ordering)';
+
+  --! @brief Encrypted domain public.text_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_ord_ope IS 'EQL encrypted text (equality, ordering)';
+
+  --! @brief Encrypted domain public.text_search.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_search' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_search AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND VALUE ? 'bf'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_search IS 'EQL encrypted text (equality, ordering, containment)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_functions.sql
+--! @brief Functions for public.text_ord.
+
+--! @brief Index extractor for public.text_ord.
+--! @param a public.text_ord
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_ord.
+--! @param a public.text_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.text_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector text
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord, selector text)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector integer
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord, selector integer)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param selector public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param selector public.text_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord, b public.text_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @file v3/sem/bloom_filter/functions.sql
+--! @brief Extractor for the eql_v3 Bloom-filter SEM index term.
+--!
+--! jsonb-only subset of src/bloom_filter/functions.sql. The encrypted-column
+--! overloads are intentionally omitted — the eql_v3 scalar domains extract from
+--! the jsonb payload directly via a cast to the domain. (Doc comments
+--! deliberately avoid naming eql_v2 symbols so the self-containment grep stays
+--! clean.)
+
+--! @brief Test whether a jsonb payload carries a Bloom-filter (`bf`) term.
+--!
+--! @param val jsonb The encrypted payload.
+--! @return boolean True when the `bf` key is present and non-null.
+--!
+--! @internal Defined for parity with the eql_v3 SEM index-term predicates
+--! (`has_hmac_256` / `has_ore_block_256`); it is not currently called by
+--! the extractor below, which gates on value-shape inline, nor by the generated
+--! domain CHECK, which tests `bf` presence via the envelope-key skeleton. Kept
+--! as the canonical presence test for callers that need one.
+CREATE FUNCTION eql_v3_internal.has_bloom_filter(val jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    RETURN val ? 'bf' AND val ->> 'bf' IS NOT NULL;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract the Bloom-filter index term from a jsonb payload.
+--!
+--! Inlinable single-statement SQL — the planner can fold this into the calling
+--! query so the functional GIN index built on `eql_v3_internal.match_term(col)` (which
+--! calls this) engages structurally. Mirrors `eql_v3_internal.hmac_256(jsonb)`: no RAISE
+--! and no pinned `search_path`. Returns NULL when `bf` is absent or present but
+--! not a json array, rather than raising. The `text_match` domain CHECK
+--! guarantees the `bf` *key* is present but not that it is an array, so a
+--! non-array `bf` (e.g. `{"bf": null}`) can reach here even on a typed value;
+--! gating on `jsonb_typeof(...) = 'array'` returns NULL for that case — and for
+--! raw jsonb outside the domain — instead of erroring inside
+--! `jsonb_array_elements`. NULL, like the HMAC extractor, is the right answer. An
+--! empty `bf` array yields an empty filter (contains nothing, contained by
+--! everything), matching set-containment semantics.
+--!
+--! @param val jsonb The encrypted payload.
+--! @return eql_v3_internal.bloom_filter The `bf` array as a smallint[] domain value, or
+--!   NULL when `bf` is absent or not a json array.
+CREATE FUNCTION eql_v3_internal.bloom_filter(val jsonb)
+  RETURNS eql_v3_internal.bloom_filter
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE WHEN jsonb_typeof(val -> 'bf') = 'array'
+    THEN ARRAY(SELECT jsonb_array_elements(val -> 'bf'))::eql_v3_internal.bloom_filter
+  END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/timestamp/timestamp_types.sql
+--! @brief Encrypted-domain types for timestamp.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.timestamp.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp IS 'EQL encrypted timestamp (storage only)';
+
+  --! @brief Encrypted domain public.timestamp_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_eq IS 'EQL encrypted timestamp (equality)';
+
+  --! @brief Encrypted domain public.timestamp_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL encrypted timestamp (equality, ordering)';
+
+  --! @brief Encrypted domain public.timestamp_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_ord IS 'EQL encrypted timestamp (equality, ordering)';
+
+  --! @brief Encrypted domain public.timestamp_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL encrypted timestamp (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_eq_functions.sql
+--! @brief Functions for public.timestamp_eq.
+
+--! @brief Index extractor for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.timestamp_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.timestamp_eq) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.timestamp_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.timestamp_eq) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.timestamp_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector text
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_eq, selector text)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector integer
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_eq, selector integer)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param selector public.timestamp_eq
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_eq)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param selector public.timestamp_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @file v3/sem/ope_cllw/types.sql
+--! @brief CLLW OPE index term type for scalar range queries (eql_v3 SEM)
+--!
+--! Domain type representing a CLLW (Copyless Logarithmic Width)
+--! Order-Preserving Encryption term. The ciphertext is stored hex-encoded in
+--! the `op` field of encrypted scalar payloads (the `_ord_ope` domains); the
+--! domain carries the hex-decoded bytes.
+--!
+--! A DOMAIN over bytea, not a composite: the OPE ciphertext is
+--! order-preserving under plain byte comparison, so the domain inherits
+--! bytea's native comparison operators and DEFAULT btree operator class
+--! outright — no hand-written operators, comparator, or operator class (the
+--! same pattern as eql_v3_internal.hmac_256 over text). That keeps the whole
+--! comparison chain inlinable, so a functional btree index on
+--! `eql_v3.ord_ope_term(col)` engages structurally for the `_ord_ope`
+--! domains' comparison operators. Contrast eql_v3_internal.ore_cllw (`oc`), the SteVec
+--! CLLW-*ORE* composite compared by a custom per-byte protocol.
+--!
+--! @note Transient type used only during query execution.
+--! @see eql_v3_internal.ope_cllw
+CREATE DOMAIN eql_v3_internal.ope_cllw AS bytea;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/bigint/bigint_types.sql
+--! @brief Encrypted-domain types for bigint.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.bigint.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint IS 'EQL encrypted bigint (storage only)';
+
+  --! @brief Encrypted domain public.bigint_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_eq IS 'EQL encrypted bigint (equality)';
+
+  --! @brief Encrypted domain public.bigint_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_ord_ore IS 'EQL encrypted bigint (equality, ordering)';
+
+  --! @brief Encrypted domain public.bigint_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_ord IS 'EQL encrypted bigint (equality, ordering)';
+
+  --! @brief Encrypted domain public.bigint_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_ord_ope IS 'EQL encrypted bigint (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_functions.sql
+--! @brief Functions for public.bigint.
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector text
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint, selector text)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector integer
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint, selector integer)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param selector public.bigint
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param selector public.bigint
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint, b public.bigint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_functions.sql
+--! @brief Functions for public.bigint_ord.
+
+--! @brief Index extractor for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector text
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord, selector text)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector integer
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord, selector integer)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param selector public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param selector public.bigint_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord, b public.bigint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/bigint/query_bigint_types.sql
+--! @brief Query-operand domains for bigint (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_bigint_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_bigint_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_eq IS 'EQL bigint query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_bigint_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_ord_ore IS 'EQL bigint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_bigint_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_ord IS 'EQL bigint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_bigint_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_ord_ope IS 'EQL bigint query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ore_functions.sql
+--! @brief Functions for public.bigint_ord_ore.
+
+--! @brief Index extractor for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector text
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ore, selector text)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector integer
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ore, selector integer)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @file v3/sem/ope_cllw/functions.sql
+--! @brief CLLW OPE index-term extraction from a jsonb payload (eql_v3 SEM).
+
+--! @brief Extract CLLW OPE index term from JSONB payload
+--!
+--! Returns the CLLW OPE ciphertext from the `op` field of an encrypted scalar
+--! payload, hex-decoded to the bytea-backed eql_v3_internal.ope_cllw domain.
+--!
+--! Inlinable single-statement SQL — the body is a strict expression of the
+--! argument (`->>` and `decode` are both STRICT), so the planner folds this
+--! into the calling query and functional btree indexes built on
+--! `eql_v3.ord_ope_term(col)` (which calls this) engage structurally, the
+--! same way the hmac_256 equality chain does.
+--!
+--! **Missing-`op` semantics**: `val ->> 'op'` is NULL when `op` is absent and
+--! the strict chain propagates it, so the extractor returns SQL NULL and
+--! btree's NULL handling filters those rows from range queries.
+--!
+--! @param val jsonb containing encrypted EQL payload
+--! @return eql_v3_internal.ope_cllw Hex-decoded CLLW OPE term, or NULL when `op` is
+--!         absent
+CREATE FUNCTION eql_v3_internal.ope_cllw(val jsonb)
+  RETURNS eql_v3_internal.ope_cllw
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT decode(val ->> 'op', 'hex')::eql_v3_internal.ope_cllw
+$$;
+
+COMMENT ON FUNCTION eql_v3_internal.ope_cllw(jsonb) IS
+  'eql-inline-critical: raw-jsonb CLLW OPE extractor; must stay inlinable (unpinned search_path)';
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ore_operators.sql
+--! @brief Operators for public.bigint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_operators.sql
+--! @brief Operators for public.bigint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_functions.sql
+--! @brief Functions for eql_v3.query_bigint_ord.
+
+--! @brief Index extractor for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_bigint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/real/query_real_types.sql
+--! @brief Query-operand domains for real (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_real_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_real_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_eq IS 'EQL real query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_real_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_ord_ore IS 'EQL real query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_real_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_ord IS 'EQL real query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_real_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_ord_ope IS 'EQL real query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_real_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_real_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_functions.sql
+--! @brief Functions for public.real_ord.
+
+--! @brief Index extractor for public.real_ord.
+--! @param a public.real_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.real_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector text
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord, selector text)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector integer
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord, selector integer)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param selector public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param selector public.real_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord, b public.real_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_eq_functions.sql
+--! @brief Functions for public.real_eq.
+
+--! @brief Index extractor for public.real_eq.
+--! @param a public.real_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.real_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.real_eq) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.real_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.real_eq) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.real_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector text
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.real_eq, selector text)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector integer
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.real_eq, selector integer)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param selector public.real_eq
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_eq)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param selector public.real_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_eq, b public.real_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ope_functions.sql
+--! @brief Functions for public.real_ord_ope.
+
+--! @brief Index extractor for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.real_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector text
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ope, selector text)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector integer
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ope, selector integer)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param selector public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord_ope)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param selector public.real_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_eq_functions.sql
+--! @brief Functions for eql_v3.query_real_eq.
+
+--! @brief Index extractor for eql_v3.query_real_eq.
+--! @param a eql_v3.query_real_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_real_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a public.real_eq
+--! @param b eql_v3.query_real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b eql_v3.query_real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a eql_v3.query_real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a public.real_eq
+--! @param b eql_v3.query_real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b eql_v3.query_real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a eql_v3.query_real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_real_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_real_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ore_functions.sql
+--! @brief Functions for public.smallint_ord_ore.
+
+--! @brief Index extractor for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector text
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ore, selector text)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector integer
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ore, selector integer)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ore_operators.sql
+--! @brief Operators for public.smallint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/smallint/query_smallint_types.sql
+--! @brief Query-operand domains for smallint (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_smallint_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_smallint_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_eq IS 'EQL smallint query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_smallint_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_ord_ore IS 'EQL smallint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_smallint_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_ord IS 'EQL smallint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_smallint_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_ord_ope IS 'EQL smallint query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ope_functions.sql
+--! @brief Functions for public.smallint_ord_ope.
+
+--! @brief Index extractor for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.smallint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector text
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ope, selector text)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector integer
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ope, selector integer)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_functions.sql
+--! @brief Functions for public.smallint_ord.
+
+--! @brief Index extractor for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector text
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord, selector text)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector integer
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord, selector integer)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param selector public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param selector public.smallint_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord, b public.smallint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_eq_functions.sql
+--! @brief Functions for eql_v3.query_smallint_eq.
+
+--! @brief Index extractor for eql_v3.query_smallint_eq.
+--! @param a eql_v3.query_smallint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_smallint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a public.smallint_eq
+--! @param b eql_v3.query_smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b eql_v3.query_smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a eql_v3.query_smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a public.smallint_eq
+--! @param b eql_v3.query_smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b eql_v3.query_smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a eql_v3.query_smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_functions.sql
+--! @brief Functions for eql_v3.query_smallint_ord.
+
+--! @brief Index extractor for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_smallint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_functions.sql
+--! @brief Functions for public.smallint.
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector text
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint, selector text)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector integer
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint, selector integer)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param selector public.smallint
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param selector public.smallint
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint, b public.smallint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ope_operators.sql
+--! @brief Operators for public.smallint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_functions.sql
+--! @brief Functions for public.date_ord.
+
+--! @brief Index extractor for public.date_ord.
+--! @param a public.date_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.date_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector text
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord, selector text)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector integer
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord, selector integer)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param selector public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param selector public.date_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord, b public.date_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/date/query_date_types.sql
+--! @brief Query-operand domains for date (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_date_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_date_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_eq IS 'EQL date query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_date_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_ord_ore IS 'EQL date query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_date_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_ord IS 'EQL date query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_date_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_ord_ope IS 'EQL date query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_functions.sql
+--! @brief Functions for eql_v3.query_date_ord.
+
+--! @brief Index extractor for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_date_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ore_functions.sql
+--! @brief Functions for public.date_ord_ore.
+
+--! @brief Index extractor for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.date_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector text
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ore, selector text)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector integer
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ore, selector integer)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param selector public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord_ore)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param selector public.date_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ope_functions.sql
+--! @brief Functions for public.date_ord_ope.
+
+--! @brief Index extractor for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.date_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector text
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ope, selector text)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector integer
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ope, selector integer)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param selector public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord_ope)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param selector public.date_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_eq_functions.sql
+--! @brief Functions for public.date_eq.
+
+--! @brief Index extractor for public.date_eq.
+--! @param a public.date_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.date_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.date_eq) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.date_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.date_eq) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.date_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector text
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.date_eq, selector text)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector integer
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.date_eq, selector integer)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param selector public.date_eq
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_eq)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param selector public.date_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_eq, b public.date_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_functions.sql
+--! @brief Functions for public.date.
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector text
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a public.date, selector text)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector integer
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a public.date, selector integer)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param selector public.date
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param selector public.date
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date, b public.date)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ore_operators.sql
+--! @brief Operators for public.date_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ope_operators.sql
+--! @brief Operators for public.date_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/numeric/query_numeric_types.sql
+--! @brief Query-operand domains for numeric (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_numeric_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_numeric_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_eq IS 'EQL numeric query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_numeric_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_ord_ore IS 'EQL numeric query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_numeric_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_ord IS 'EQL numeric query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_numeric_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_ord_ope IS 'EQL numeric query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_eq_functions.sql
+--! @brief Functions for public.numeric_eq.
+
+--! @brief Index extractor for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.numeric_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.numeric_eq) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.numeric_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.numeric_eq) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.numeric_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector text
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_eq, selector text)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector integer
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_eq, selector integer)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param selector public.numeric_eq
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_eq)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param selector public.numeric_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_eq, b public.numeric_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_functions.sql
+--! @brief Functions for public.numeric_ord.
+
+--! @brief Index extractor for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector text
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord, selector text)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector integer
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord, selector integer)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param selector public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param selector public.numeric_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord, b public.numeric_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_functions.sql
+--! @brief Functions for eql_v3.query_numeric_ord.
+
+--! @brief Index extractor for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_numeric_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ore_functions.sql
+--! @brief Functions for public.numeric_ord_ore.
+
+--! @brief Index extractor for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector text
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ore, selector text)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector integer
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ore, selector integer)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_numeric_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_numeric_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ope_functions.sql
+--! @brief Functions for public.numeric_ord_ope.
+
+--! @brief Index extractor for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.numeric_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector text
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ope, selector text)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector integer
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ope, selector integer)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_numeric_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_numeric_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ore_operators.sql
+--! @brief Operators for public.numeric_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ope_operators.sql
+--! @brief Operators for public.numeric_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/double/query_double_types.sql
+--! @brief Query-operand domains for double (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_double_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_double_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_eq IS 'EQL double query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_double_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_ord_ore IS 'EQL double query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_double_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_ord IS 'EQL double query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_double_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_ord_ope IS 'EQL double query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_functions.sql
+--! @brief Functions for public.double_ord.
+
+--! @brief Index extractor for public.double_ord.
+--! @param a public.double_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.double_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector text
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord, selector text)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector integer
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord, selector integer)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param selector public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param selector public.double_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord, b public.double_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ore_functions.sql
+--! @brief Functions for public.double_ord_ore.
+
+--! @brief Index extractor for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.double_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector text
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ore, selector text)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector integer
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ore, selector integer)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param selector public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord_ore)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param selector public.double_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ope_functions.sql
+--! @brief Functions for public.double_ord_ope.
+
+--! @brief Index extractor for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.double_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector text
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ope, selector text)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector integer
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ope, selector integer)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param selector public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord_ope)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param selector public.double_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_operators.sql
+--! @brief Operators for public.double_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ope_operators.sql
+--! @brief Operators for public.double_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_functions.sql
+--! @brief Functions for public.double.
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector text
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a public.double, selector text)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector integer
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a public.double, selector integer)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param selector public.double
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param selector public.double
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double, b public.double)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_eq_functions.sql
+--! @brief Functions for eql_v3.query_double_eq.
+
+--! @brief Index extractor for eql_v3.query_double_eq.
+--! @param a eql_v3.query_double_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_double_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a public.double_eq
+--! @param b eql_v3.query_double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b eql_v3.query_double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a eql_v3.query_double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a public.double_eq
+--! @param b eql_v3.query_double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b eql_v3.query_double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a eql_v3.query_double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ore_operators.sql
+--! @brief Operators for public.double_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_eq_functions.sql
+--! @brief Functions for public.integer_eq.
+
+--! @brief Index extractor for public.integer_eq.
+--! @param a public.integer_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.integer_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.integer_eq) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.integer_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.integer_eq) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.integer_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector text
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_eq, selector text)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector integer
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_eq, selector integer)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param selector public.integer_eq
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_eq)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param selector public.integer_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_eq, b public.integer_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_functions.sql
+--! @brief Functions for public.integer_ord.
+
+--! @brief Index extractor for public.integer_ord.
+--! @param a public.integer_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.integer_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector text
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord, selector text)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector integer
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord, selector integer)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param selector public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param selector public.integer_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord, b public.integer_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_operators.sql
+--! @brief Operators for public.integer_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ore_functions.sql
+--! @brief Functions for public.integer_ord_ore.
+
+--! @brief Index extractor for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.integer_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector text
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ore, selector text)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector integer
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ore, selector integer)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param selector public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord_ore)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param selector public.integer_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ore_operators.sql
+--! @brief Operators for public.integer_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/integer/query_integer_types.sql
+--! @brief Query-operand domains for integer (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_integer_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_integer_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_eq IS 'EQL integer query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_integer_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_ord_ore IS 'EQL integer query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_integer_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_ord IS 'EQL integer query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_integer_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_ord_ope IS 'EQL integer query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ope_functions.sql
+--! @brief Functions for public.integer_ord_ope.
+
+--! @brief Index extractor for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.integer_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector text
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ope, selector text)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector integer
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ope, selector integer)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param selector public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord_ope)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param selector public.integer_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_functions.sql
+--! @brief Functions for public.integer.
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector text
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a public.integer, selector text)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector integer
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a public.integer, selector integer)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param selector public.integer
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param selector public.integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer, b public.integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_eq_functions.sql
+--! @brief Functions for eql_v3.query_integer_eq.
+
+--! @brief Index extractor for eql_v3.query_integer_eq.
+--! @param a eql_v3.query_integer_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_integer_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a public.integer_eq
+--! @param b eql_v3.query_integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b eql_v3.query_integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a eql_v3.query_integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a public.integer_eq
+--! @param b eql_v3.query_integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b eql_v3.query_integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a eql_v3.query_integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/text/query_text_types.sql
+--! @brief Query-operand domains for text (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_text_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_text_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_eq IS 'EQL text query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_text_match (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_match' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_match AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'bf'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_match IS 'EQL text query operand (containment)';
+
+  --! @brief Query-operand domain eql_v3.query_text_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_ord_ore IS 'EQL text query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_text_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_ord IS 'EQL text query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_text_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_ord_ope IS 'EQL text query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_text_search (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_search' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_search AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND VALUE ? 'bf'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_search IS 'EQL text query operand (equality, ordering, containment)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_match_functions.sql
+--! @brief Functions for public.text_match.
+
+--! @brief Index extractor for public.text_match.
+--! @param a public.text_match
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a public.text_match)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_match, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::public.text_match) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a jsonb, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_match) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::public.text_match) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a jsonb, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_match) <@ eql_v3.match_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector text
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a public.text_match, selector text)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector integer
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a public.text_match, selector integer)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param selector public.text_match
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_match)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_match, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_match, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param selector public.text_match
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_match)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_match, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_match, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_match, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_match, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_match, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_match, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_match, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_match, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_match, b public.text_match)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_match, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_match)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ope_functions.sql
+--! @brief Functions for public.text_ord_ope.
+
+--! @brief Index extractor for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ope)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.text_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ope) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ope) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector text
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ope, selector text)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector integer
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ope, selector integer)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param selector public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord_ope)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param selector public.text_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_functions.sql
+--! @brief Functions for eql_v3.query_text_ord.
+
+--! @brief Index extractor for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ore_functions.sql
+--! @brief Functions for public.text_ord_ore.
+
+--! @brief Index extractor for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ore)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.text_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ore) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ore) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector text
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ore, selector text)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector integer
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ore, selector integer)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param selector public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord_ore)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param selector public.text_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_eq_functions.sql
+--! @brief Functions for public.text_eq.
+
+--! @brief Index extractor for public.text_eq.
+--! @param a public.text_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_eq) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_eq) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector text
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.text_eq, selector text)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector integer
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.text_eq, selector integer)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param selector public.text_eq
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_eq)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param selector public.text_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_eq, b public.text_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_search_functions.sql
+--! @brief Functions for public.text_search.
+
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_search)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.text_search)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a public.text_search)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_search) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_search) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_search) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_search) <@ eql_v3.match_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector text
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a public.text_search, selector text)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector integer
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a public.text_search, selector integer)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a jsonb
+--! @param selector public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_search)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_search, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_search, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a jsonb
+--! @param selector public.text_search
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_search)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_search, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_search, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_search, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_search, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_search, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_search, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_search, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_search, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_search, b public.text_search)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_search, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_search)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ore_operators.sql
+--! @brief Operators for public.text_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_operators.sql
+--! @brief Operators for public.text_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ore_functions.sql
+--! @brief Functions for public.timestamp_ord_ore.
+
+--! @brief Index extractor for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector text
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ore, selector text)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector integer
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ore, selector integer)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_functions.sql
+--! @brief Functions for public.timestamp_ord.
+
+--! @brief Index extractor for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector text
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord, selector text)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector integer
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord, selector integer)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param selector public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param selector public.timestamp_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_operators.sql
+--! @brief Operators for public.timestamp_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/timestamp/query_timestamp_types.sql
+--! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_timestamp_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_timestamp_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_eq IS 'EQL timestamp query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_timestamp_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_timestamp_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_timestamp_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_eq_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_eq.
+
+--! @brief Index extractor for eql_v3.query_timestamp_eq.
+--! @param a eql_v3.query_timestamp_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_timestamp_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b eql_v3.query_timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b eql_v3.query_timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a eql_v3.query_timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b eql_v3.query_timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b eql_v3.query_timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a eql_v3.query_timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ope_functions.sql
+--! @brief Functions for public.timestamp_ord_ope.
+
+--! @brief Index extractor for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.timestamp_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector text
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ope, selector text)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector integer
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ope, selector integer)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ope_operators.sql
+--! @brief Operators for public.timestamp_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ore_operators.sql
+--! @brief Operators for public.timestamp_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+--! @file v3/sem/ore_cllw/types.sql
+--! @brief CLLW ORE index term type for STE-vec range queries (eql_v3 SEM)
+--!
+--! Composite type for CLLW (Copyless Logarithmic Width) Order-Revealing
+--! Encryption. The ciphertext is stored in the `oc` field of encrypted data
+--! payloads (Standard-mode `ste_vec` elements). Used by the range operators
+--! (`<`, `<=`, `>`, `>=`) when an sv element carries an `oc` term.
+--!
+--! The wire-format `oc` value is a hex string with a leading domain-tag byte
+--! (`0x00` numeric, `0x01` string) followed by the CLLW ciphertext. The
+--! decoded `bytes` field carries the full byte string including the tag — the
+--! comparator is variable-length capable, so numeric and string values within
+--! the same column order correctly: the domain tag separates the ranges
+--! (numeric < string) and the within-domain comparison falls through to the
+--! CLLW per-byte protocol.
+--!
+--! @note This is a transient type used only during query execution.
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE TYPE eql_v3_internal.ore_cllw AS (
+  bytes bytea
+);
+
+--! @file v3/sem/ore_cllw/functions.sql
+--! @brief CLLW ORE index-term extraction and comparison (eql_v3 SEM).
+
+--! @brief Extract CLLW ORE index term from raw jsonb
+--!
+--! Returns the CLLW ORE ciphertext from the `oc` field of a single sv element
+--! supplied as raw jsonb. Inlinable single-statement SQL — the planner folds
+--! the body into the calling query.
+--!
+--! **Missing-`oc` semantics**: returns SQL-level NULL (not a composite with
+--! NULL bytes) when `oc` is absent, so btree's NULL handling filters those
+--! rows from range queries.
+--!
+--! @param val jsonb An object carrying an `oc` field
+--! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL
+--!         when the `oc` field is absent.
+--! @see eql_v3_internal.has_ore_cllw
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw(val jsonb)
+  RETURNS eql_v3_internal.ore_cllw
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE WHEN val ->> 'oc' IS NULL THEN NULL
+              ELSE ROW(decode(val ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw
+         END
+$$;
+
+COMMENT ON FUNCTION eql_v3_internal.ore_cllw(jsonb) IS
+  'eql-inline-critical: raw-jsonb CLLW extractor; must stay inlinable (unpinned search_path)';
+
+--! @brief Check if a raw jsonb value contains a CLLW ORE index term
+--! @param val jsonb An object that may carry an `oc` field
+--! @return boolean True if `oc` field is present and non-null
+CREATE FUNCTION eql_v3_internal.has_ore_cllw(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT val ->> 'oc' IS NOT NULL
+$$;
+
+COMMENT ON FUNCTION eql_v3_internal.has_ore_cllw(jsonb) IS
+  'eql-inline-critical: raw-jsonb CLLW presence helper; must stay inlinable (unpinned search_path)';
+
+--! @brief CLLW per-byte comparison helper
+--! @internal
+--!
+--! Byte-by-byte comparison implementing the CLLW order-revealing protocol.
+--! Identify the index of the first differing byte; if `(y_byte + 1) == x_byte`
+--! (mod 256) there, then x > y; otherwise x < y. Equal inputs return 0. Inputs
+--! MUST be the same length (the caller guarantees this). Stays `LANGUAGE
+--! plpgsql` — the per-byte loop can't be a single inlinable SQL expression.
+--!
+--! @param a bytea First CLLW ciphertext slice
+--! @param b bytea Second CLLW ciphertext slice
+--! @return integer -1, 0, or 1
+--! @throws Exception if inputs are different lengths
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term_bytes(a bytea, b bytea)
+RETURNS int
+  SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+    len_a INT;
+    len_b INT;
+    i INT;
+    first_diff INT := 0;
+BEGIN
+
+    len_a := LENGTH(a);
+    len_b := LENGTH(b);
+
+    IF len_a != len_b THEN
+      RAISE EXCEPTION 'ore_cllw index terms are not the same length';
+    END IF;
+
+    FOR i IN 1..len_a LOOP
+        IF first_diff = 0 AND get_byte(a, i - 1) != get_byte(b, i - 1) THEN
+            first_diff := i;
+        END IF;
+    END LOOP;
+
+    IF first_diff = 0 THEN
+        RETURN 0;
+    END IF;
+
+    IF ((get_byte(b, first_diff - 1) + 1) & 255) = get_byte(a, first_diff - 1) THEN
+        RETURN 1;
+    ELSE
+        RETURN -1;
+    END IF;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Variable-length CLLW ORE term comparison
+--! @internal
+--!
+--! Three-way comparison of two CLLW ORE ciphertext terms of potentially
+--! different lengths. Compares the shared prefix via the CLLW per-byte
+--! protocol; on equal prefixes, the shorter input sorts first. The leading
+--! domain-tag byte makes numeric (`0x00`) sort before string (`0x01`). Stays
+--! `LANGUAGE plpgsql` because it dispatches to `compare_ore_cllw_term_bytes`.
+--!
+--! btree filters NULL composites at the row level, so this should never see a
+--! NULL composite under normal operation; the IS-NULL guard returns NULL
+--! defensively. A non-NULL composite with NULL `bytes` is a contract violation
+--! — the extractor returns SQL NULL (not ROW(NULL)) on missing `oc`, so raise
+--! loudly rather than silently misorder.
+--!
+--! @param a eql_v3_internal.ore_cllw First term
+--! @param b eql_v3_internal.ore_cllw Second term
+--! @return integer -1, 0, or 1; NULL if either composite is NULL
+--! @throws Exception if either composite has a NULL `bytes` field
+--! @see eql_v3_internal.compare_ore_cllw_term_bytes
+CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+RETURNS int
+  SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+    len_a INT;
+    len_b INT;
+    common_len INT;
+    cmp_result INT;
+BEGIN
+    -- The `::text` cast is load-bearing, not a stylistic choice. For the
+    -- single-field `ore_cllw` composite, `ROW(NULL)::ore_cllw IS NULL` is TRUE
+    -- but `(ROW(NULL)::ore_cllw)::text IS NULL` is FALSE. Casting to text first
+    -- means a NULL-component composite falls THROUGH to the RAISE below (the
+    -- extractor-invariant violation) instead of silently returning NULL and
+    -- masking it. A plain `a IS NULL` would reintroduce that masking bug.
+    IF a::text IS NULL OR b::text IS NULL THEN
+      RETURN NULL;
+    END IF;
+
+    IF a.bytes IS NULL OR b.bytes IS NULL THEN
+      RAISE EXCEPTION 'eql_v3_internal.compare_ore_cllw_term: composite has NULL bytes field — extractor invariant violated. Check that the index expression uses eql_v3_internal.ore_cllw(...) and not a hand-crafted ROW(NULL).';
+    END IF;
+
+    len_a := LENGTH(a.bytes);
+    len_b := LENGTH(b.bytes);
+
+    IF len_a = 0 AND len_b = 0 THEN
+        RETURN 0;
+    ELSIF len_a = 0 THEN
+        RETURN -1;
+    ELSIF len_b = 0 THEN
+        RETURN 1;
+    END IF;
+
+    IF len_a < len_b THEN
+        common_len := len_a;
+    ELSE
+        common_len := len_b;
+    END IF;
+
+    cmp_result := eql_v3_internal.compare_ore_cllw_term_bytes(
+      SUBSTRING(a.bytes FROM 1 FOR common_len),
+      SUBSTRING(b.bytes FROM 1 FOR common_len)
+    );
+
+    IF cmp_result = -1 THEN
+        RETURN -1;
+    ELSIF cmp_result = 1 THEN
+        RETURN 1;
+    END IF;
+
+    IF len_a < len_b THEN
+        RETURN -1;
+    ELSIF len_a > len_b THEN
+        RETURN 1;
+    ELSE
+        RETURN 0;
+    END IF;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @file v3/jsonb/types.sql
+--! @brief Domain types for the eql_v3 encrypted-JSONB (SteVec) surface.
+--!
+--! Three jsonb-backed domains (none over another domain — operators resolve
+--! against the ultimate base type jsonb, so the native-jsonb firewall in
+--! blockers.sql can attach):
+--!   - public.json     — storage/root: an EQL envelope object ({i, v, ...}).
+--!   - public.jsonb_entry — a single sv element (returned by `->`).
+--!   - eql_v3.query_jsonb  — a containment needle (sv elements, no ciphertext).
+
+--! @brief Validate a single SteVec entry payload.
+--! @internal
+--! @param val jsonb Candidate entry payload.
+--! @return boolean True when `val` is an sv entry with string `s`, string `c`,
+--!         and exactly one string deterministic term (`hm` XOR `oc`).
+CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_entry_payload(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT COALESCE(
+    jsonb_typeof(val) = 'object'
+     AND jsonb_typeof(val -> 's') = 'string'
+     AND jsonb_typeof(val -> 'c') = 'string'
+     AND (
+       (jsonb_typeof(val -> 'hm') = 'string' AND NOT (val ? 'oc'))
+       OR
+       (jsonb_typeof(val -> 'oc') = 'string' AND NOT (val ? 'hm'))
+     ),
+    false
+  )
+$$;
+
+--! @brief Validate a SteVec containment query payload.
+--! @internal
+--! @param val jsonb Candidate query payload.
+--! @return boolean True when `val` is `{"sv":[...]}` and every element carries
+--!         string `s`, no ciphertext, and exactly one string term (`hm` XOR
+--!         `oc`).
+--! @note plpgsql, not LANGUAGE sql (issues #353/#354): the only caller is the
+--!   eql_v3.query_jsonb domain CHECK, where a SQL function can never be
+--!   inlined (and the CHECK itself cannot absorb this body — it needs a
+--!   subquery over the sv elements, which CHECK constraints forbid). plpgsql
+--!   caches its plan across calls instead of paying the per-call SQL-function
+--!   executor on every needle cast.
+CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_query_payload(val jsonb)
+  RETURNS boolean
+  LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+BEGIN
+  RETURN COALESCE(
+    jsonb_typeof(val) = 'object'
+     AND jsonb_typeof(val -> 'sv') = 'array'
+     AND NOT EXISTS (
+       SELECT 1
+       FROM jsonb_array_elements(
+         CASE WHEN jsonb_typeof(val -> 'sv') = 'array' THEN val -> 'sv' ELSE '[]'::jsonb END
+       ) AS elem
+       WHERE NOT COALESCE((
+         jsonb_typeof(elem) = 'object'
+         AND jsonb_typeof(elem -> 's') = 'string'
+         AND NOT (elem ? 'c')
+         AND (
+           (jsonb_typeof(elem -> 'hm') = 'string' AND NOT (elem ? 'oc'))
+           OR
+           (jsonb_typeof(elem -> 'oc') = 'string' AND NOT (elem ? 'hm'))
+         )
+       ), false)
+     ),
+    false
+  );
+END;
+$$;
+
+--! @brief Validate a root SteVec document payload.
+--! @internal
+--! @param val jsonb Candidate document payload.
+--! @return boolean True when `val` is an encrypted document envelope with
+--!         `v = 3`, `i`, an `sv` array, and valid sv entry elements.
+CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_document_payload(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT COALESCE(
+    jsonb_typeof(val) = 'object'
+     AND val ? 'v'
+     AND val ->> 'v' = '3'
+     AND val ? 'i'
+     AND jsonb_typeof(val -> 'sv') = 'array'
+     AND NOT EXISTS (
+       SELECT 1
+       FROM jsonb_array_elements(
+         CASE WHEN jsonb_typeof(val -> 'sv') = 'array' THEN val -> 'sv' ELSE '[]'::jsonb END
+       ) AS elem
+       WHERE NOT public.eql_v3_is_valid_ste_vec_entry_payload(elem)
+     ),
+    false
+  )
+$$;
+
+--! @brief Storage/root domain for an encrypted JSONB column.
+--!
+--! CHECK: a JSON object carrying the EQL envelope (`v = 3` version and `i` index
+--! metadata). Root `c` is intentionally NOT required — an sv-array root payload
+--! is `{i, v, sv}` with no root ciphertext. The CHECK now also requires an `sv`
+--! array, so the domain accepts only SteVec **document** payloads and rejects
+--! encrypted *scalar* payloads (which carry `c`/`hm`/`ob` but no `sv`) — this is
+--! what keeps `public.json` a typed document domain rather than a generic
+--! encrypted envelope. The firewall in blockers.sql attaches to this domain to
+--! stop native jsonb operators from reaching a column value.
+--!
+--! @note Constructing from inline JSON uses the standard DOMAIN cast:
+--!       `'{"i":{},"v":3,"sv":[...]}'::public.json`.
+DO $$
+BEGIN
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'json' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.json AS jsonb
+      CHECK (
+        public.eql_v3_is_valid_ste_vec_document_payload(VALUE)
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.json IS 'EQL encrypted JSONB document (containment, equality, ordering)';
+END
+$$;
+
+--! @brief Domain type for an individual sv element.
+--!
+--! A single element inside an `sv` array: a JSON object that carries a selector
+--! (`s`), a ciphertext (`c`), and **exactly one** of `hm` (HMAC-256, for
+--! hash-equality) or `oc` (CLLW ORE, for ordered queries) — they are mutually
+--! exclusive. This is the type returned by `->` and accepted by the per-entry
+--! extractors `eql_v3.eq_term` / `eql_v3.ore_cllw`. Extra fields (`a`, root
+--! `i`/`v` merged in by `->`) are allowed.
+--!
+--! @see src/v3/jsonb/operators.sql
+--!
+--! @internal
+--! Implementation note (issue #354): the CHECK is an INLINE expression, not a
+--! call to `public.eql_v3_is_valid_ste_vec_entry_payload` — domain
+--! constraints cannot inline SQL functions, so the function-call form paid
+--! the per-call SQL-function executor (~18 µs) on EVERY cast: the needle
+--! cast in every field_eq query (+19% end-to-end vs v2, the entire measured
+--! regression on that scenario; see cipherstash/benches#23). The expression
+--! mirrors the validator body; the leading `VALUE IS NULL OR` preserves the
+--! validator's STRICT NULL-passes semantics (a bare COALESCE(..., false)
+--! would reject NULL, which `->` returns for a missing selector). Keep the
+--! two in sync — `jsonb_entry_check_matches_validator` in tests/sqlx pins
+--! the equivalence.
+--! @endinternal
+DO $$
+BEGIN
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'jsonb_entry' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.jsonb_entry AS jsonb
+      CHECK (
+        VALUE IS NULL
+        OR COALESCE(
+          jsonb_typeof(VALUE) = 'object'
+           AND jsonb_typeof(VALUE -> 's') = 'string'
+           AND jsonb_typeof(VALUE -> 'c') = 'string'
+           AND (
+             (jsonb_typeof(VALUE -> 'hm') = 'string' AND NOT (VALUE ? 'oc'))
+             OR
+             (jsonb_typeof(VALUE -> 'oc') = 'string' AND NOT (VALUE ? 'hm'))
+           ),
+          false
+        )
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.jsonb_entry IS 'EQL encrypted JSONB leaf entry (equality, ordering)';
+END
+$$;
+
+--! @brief Domain type for an STE-vec containment needle.
+--!
+--! A query-shaped payload `{"sv":[...]}` whose elements carry selector + index
+--! term but **never** a ciphertext (`c`). Each element must carry `s` and
+--! exactly one deterministic term (`hm` XOR `oc`). Typing the needle this way
+--! stops selector-only needles from casting and matching every row via bare
+--! `jsonb @>`.
+--!
+--! @note Construct from inline JSON via the DOMAIN cast:
+--!       `'{"sv":[{"s":"","hm":""}]}'::eql_v3.query_jsonb`.
+--! @see eql_v3.to_ste_vec_query
+--!
+--! @internal
+--! Implementation note (issue #354): this CHECK CANNOT be inlined like
+--! public.jsonb_entry's — validating the sv elements requires a subquery
+--! (`NOT EXISTS (SELECT ... FROM jsonb_array_elements(...))`), and CHECK
+--! constraints forbid subqueries. The validator is plpgsql instead (cached
+--! plan; substantially cheaper per call than a non-inlined LANGUAGE sql
+--! function — the same finding as issue #353), since this cast sits on the
+--! per-query hot path of every containment scenario
+--! (`$1::jsonb::eql_v3.query_jsonb`).
+--! @endinternal
+DO $$
+BEGIN
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_jsonb' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_jsonb AS jsonb
+      CHECK (
+        public.eql_v3_is_valid_ste_vec_query_payload(VALUE)
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_jsonb IS 'EQL JSONB query operand (containment)';
+END
+$$;
+
+--! @brief Convert a public.json to a query_jsonb needle.
+--!
+--! Normalises each sv element down to the matching-relevant fields: `s` plus
+--! exactly one of `hm` / `oc`. Other fields (`c`, `a`, `i`/`v`, anything else)
+--! are stripped. This is the canonical needle shape for `@>` containment.
+--! Designed for use as a functional GIN index expression:
+--!   `GIN (eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops)`.
+--!
+--! @param e public.json Source encrypted payload
+--! @return eql_v3.query_jsonb Query-shaped needle, sv elements normalised.
+--! @see eql_v3.query_jsonb
+CREATE FUNCTION eql_v3.to_ste_vec_query(e public.json)
+  RETURNS eql_v3.query_jsonb
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT jsonb_build_object(
+    'sv',
+    coalesce(
+      (SELECT jsonb_agg(
+                jsonb_strip_nulls(
+                  jsonb_build_object(
+                    's',  elem -> 's',
+                    'hm', elem -> 'hm',
+                    'oc', elem -> 'oc'
+                  )
+                )
+              )
+       FROM jsonb_array_elements(e::jsonb -> 'sv') AS elem),
+      '[]'::jsonb
+    )
+  )::eql_v3.query_jsonb
+$$;
+
+CREATE CAST (public.json AS eql_v3.query_jsonb)
+  WITH FUNCTION eql_v3.to_ste_vec_query
+  AS ASSIGNMENT;
+
+--! @file v3/jsonb/functions.sql
+--! @brief Extractors, containment engine, and path/array functions for the
+--!        eql_v3 encrypted-JSONB (SteVec) surface.
+--!
+--! `selector` parameters here are *encrypted-side* selector hashes — the
+--! deterministic hash the crypto layer emits in the `s` field of each sv
+--! element. Plaintext JSONPaths are never accepted at runtime.
+
+------------------------------------------------------------------------------
+-- Envelope helpers (eql_v3 owns these; jsonb-only)
+------------------------------------------------------------------------------
+
+--! @brief Extract metadata (i, v) from a raw jsonb encrypted value.
+--! @param val jsonb encrypted EQL payload
+--! @return jsonb Metadata object with `i` and `v` fields.
+CREATE FUNCTION eql_v3.meta_data(val jsonb)
+  RETURNS jsonb
+  IMMUTABLE STRICT PARALLEL SAFE
+  LANGUAGE SQL
+AS $$
+  SELECT jsonb_build_object('i', val->'i', 'v', val->'v');
+$$;
+
+COMMENT ON FUNCTION eql_v3.meta_data(jsonb) IS
+  'eql-inline-critical: raw-jsonb envelope helper used by v3 jsonb wrappers; must stay inlinable (unpinned search_path)';
+
+--! @brief Extract ciphertext (c) from a raw jsonb encrypted value.
+--! @param val jsonb encrypted EQL payload
+--! @return text Base64-encoded ciphertext.
+--! @throws Exception if `c` is absent.
+CREATE FUNCTION eql_v3.ciphertext(val jsonb)
+  RETURNS text
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    IF val ? 'c' THEN
+      RETURN val->>'c';
+    END IF;
+    RAISE 'Expected a ciphertext (c) value in json: %', val;
+  END;
+$$ LANGUAGE plpgsql;
+
+------------------------------------------------------------------------------
+-- Selector extractors
+------------------------------------------------------------------------------
+
+--! @brief Extract selector (s) from a raw jsonb encrypted value.
+--! @param val jsonb encrypted EQL payload
+--! @return text The selector value.
+--! @throws Exception if `s` is absent.
+CREATE FUNCTION eql_v3.selector(val jsonb)
+  RETURNS text
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    IF val ? 's' THEN
+      RETURN val->>'s';
+    END IF;
+    RAISE 'Expected a selector index (s) value in json: %', val;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract selector (s) from a ste_vec entry. The DOMAIN CHECK
+--!        guarantees `s` is present, so this is a simple field access.
+--! @param entry public.jsonb_entry
+--! @return text The selector value.
+CREATE FUNCTION eql_v3.selector(entry public.jsonb_entry)
+  RETURNS text
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT entry ->> 's'
+$$;
+
+------------------------------------------------------------------------------
+-- Equality-term extractor (XOR-aware: coalesce(hm, oc))
+------------------------------------------------------------------------------
+
+--! @brief XOR-aware equality term extractor for public.jsonb_entry.
+--!
+--! Returns the bytea of whichever deterministic term the sv entry carries —
+--! `hm` (HMAC-256) or `oc` (CLLW ORE). The two byte distributions are disjoint
+--! by construction, so byte equality on the coalesce is unambiguous. Canonical
+--! equality extractor used by `=` / `<>` on jsonb_entry.
+--!
+--! @param entry public.jsonb_entry
+--! @return bytea Decoded `hm` or `oc` bytes (NULL if entry is NULL).
+CREATE FUNCTION eql_v3.eq_term(entry public.jsonb_entry)
+  RETURNS bytea
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT decode(coalesce(entry ->> 'hm', entry ->> 'oc'), 'hex')
+$$;
+
+------------------------------------------------------------------------------
+-- ORE CLLW per-entry overloads (live here so sem/ore_cllw stays a leaf)
+------------------------------------------------------------------------------
+
+--! @brief Extract CLLW ORE index term from a ste_vec entry.
+--!
+--! `oc` is only ever present on an sv element, never at a root encrypted value,
+--! so the typed overload accepts public.jsonb_entry. Returns SQL NULL when
+--! `oc` is absent (btree NULL-filters such rows from range queries).
+--!
+--! @param entry public.jsonb_entry
+--! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL.
+--! @see eql_v3.has_ore_cllw
+CREATE FUNCTION eql_v3.ore_cllw(entry public.jsonb_entry)
+  RETURNS eql_v3_internal.ore_cllw
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE WHEN entry ->> 'oc' IS NULL THEN NULL
+              ELSE ROW(decode(entry ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw
+         END
+$$;
+
+--! @brief Check if a ste_vec entry contains a CLLW ORE index term.
+--! @param entry public.jsonb_entry
+--! @return boolean True if `oc` is present and non-null.
+CREATE FUNCTION eql_v3.has_ore_cllw(entry public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT entry ->> 'oc' IS NOT NULL
+$$;
+
+------------------------------------------------------------------------------
+-- sv-array helpers
+------------------------------------------------------------------------------
+
+--! @brief Extract the sv element array as raw jsonb[].
+--!
+--! Returns the elements of `sv` (or a single-element array wrapping the value
+--! when there is no `sv`). No envelope re-wrapping — raw jsonb elements.
+--!
+--! @param val jsonb encrypted EQL payload
+--! @return jsonb[] Array of sv elements.
+CREATE FUNCTION eql_v3.ste_vec(val jsonb)
+  RETURNS jsonb[]
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb;
+    ary jsonb[];
+  BEGIN
+    IF val ? 'sv' THEN
+      sv := val->'sv';
+    ELSE
+      sv := jsonb_build_array(val);
+    END IF;
+
+    SELECT array_agg(elem)
+      INTO ary
+      FROM jsonb_array_elements(sv) AS elem;
+
+    RETURN ary;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Check if a jsonb payload is marked as an sv array (`a` flag true).
+--! @param val jsonb encrypted EQL payload
+--! @return boolean True if `a` is present and true.
+CREATE FUNCTION eql_v3_internal.is_ste_vec_array(val jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    IF val ? 'a' THEN
+      RETURN (val->>'a')::boolean;
+    END IF;
+    RETURN false;
+  END;
+$$ LANGUAGE plpgsql;
+
+------------------------------------------------------------------------------
+-- Deterministic-fields array for GIN containment
+------------------------------------------------------------------------------
+
+--! @brief Extract deterministic search fields (s, hm, oc, op) per sv element.
+--!
+--! Excludes non-deterministic ciphertext so PostgreSQL's native jsonb `@>` can
+--! compare for containment. Use for GIN indexes and containment queries.
+--!
+--! @param val jsonb encrypted EQL payload
+--! @return jsonb[] Array of objects with only deterministic fields.
+CREATE FUNCTION eql_v3.jsonb_array(val jsonb)
+RETURNS jsonb[]
+IMMUTABLE STRICT PARALLEL SAFE
+LANGUAGE SQL
+AS $$
+  SELECT ARRAY(
+    SELECT jsonb_object_agg(kv.key, kv.value)
+    FROM jsonb_array_elements(
+      CASE WHEN val ? 'sv' THEN val->'sv' ELSE jsonb_build_array(val) END
+    ) AS elem,
+    LATERAL jsonb_each(elem) AS kv(key, value)
+    WHERE kv.key IN ('s', 'hm', 'oc', 'op')
+    GROUP BY elem
+  );
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_array(jsonb) IS
+  'eql-inline-critical: raw-jsonb deterministic-field array helper; must stay inlinable (unpinned search_path)';
+
+------------------------------------------------------------------------------
+-- Containment
+------------------------------------------------------------------------------
+
+--! @brief GIN-indexable containment check: does `a` contain all of `b`?
+--! @param a jsonb Container payload.
+--! @param b jsonb Search payload.
+--! @return boolean True if a contains all deterministic elements of b.
+--! @note Public raw-`jsonb[]` containment helper over the extracted
+--!       deterministic fields — the function-form entrypoint for containment on
+--!       platforms without operator support (Supabase/PostgREST). The typed
+--!       `public.json` `@>` operator does NOT call this function — it binds to
+--!       `eql_v3.ste_vec_contains` instead — but both agree on the result (a
+--!       parity test pins this). Also the documented GIN index expression
+--!       (`eql_v3.jsonb_array(col)`); see docs/reference/database-indexes.md.
+CREATE FUNCTION eql_v3.jsonb_contains(a jsonb, b jsonb)
+RETURNS boolean
+IMMUTABLE STRICT PARALLEL SAFE
+LANGUAGE SQL
+AS $$
+  SELECT eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b);
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_contains(jsonb, jsonb) IS
+  'eql-inline-critical: raw-jsonb containment helper; must stay inlinable (unpinned search_path)';
+
+--! @brief GIN-indexable "is contained by" check.
+--! @param a jsonb Payload to check.
+--! @param b jsonb Container payload.
+--! @return boolean True if all elements of a are contained in b.
+--! @note Public raw-`jsonb[]` reverse-containment helper — the function-form
+--!       entrypoint for `<@` on platforms without operator support. The typed
+--!       `public.json` `<@` operator binds to `eql_v3.ste_vec_contains` instead,
+--!       but both agree on the result.
+CREATE FUNCTION eql_v3.jsonb_contained_by(a jsonb, b jsonb)
+RETURNS boolean
+IMMUTABLE STRICT PARALLEL SAFE
+LANGUAGE SQL
+AS $$
+  SELECT eql_v3.jsonb_array(a) <@ eql_v3.jsonb_array(b);
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_contained_by(jsonb, jsonb) IS
+  'eql-inline-critical: raw-jsonb contained-by helper; must stay inlinable (unpinned search_path)';
+
+--! @brief Check if an sv array contains a specific sv element.
+--!
+--! Match = selector equal AND eq_term equal (byte-equality over coalesce(hm,
+--! oc)). This collapses the v2 hm/oc CASE: under the XOR contract both terms
+--! are deterministic and byte-disjoint, so either one is a valid equality
+--! discriminator and a single byte comparison is correct.
+--!
+--! ASSUMPTION (locked by a negative test in v3_jsonb_tests.rs): hm and oc byte
+--! distributions never collide at a given selector. The crypto layer configures
+--! a selector for eq XOR ordered, so both sides of a real comparison carry the
+--! same term type; and an oc value carries a leading domain-tag byte an hm never
+--! has. Unlike v2's explicit `has_hmac(both)`/`has_ore_cllw(both)`/`ELSE false`
+--! CASE, this collapse would wrongly match an hm needle against an oc leaf if
+--! their hex bytes were ever identical — which the contract prevents. The
+--! negative-containment test guards against regression.
+--!
+--! @param a jsonb[] sv array to search within.
+--! @param b jsonb sv element to search for.
+--! @return boolean True if b is found in any element of a.
+CREATE FUNCTION eql_v3.ste_vec_contains(a jsonb[], b jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    result boolean;
+    _a jsonb;
+  BEGIN
+    result := false;
+
+    FOR idx IN 1..array_length(a, 1) LOOP
+      _a := a[idx];
+      result := result OR (
+        eql_v3.selector(_a) = eql_v3.selector(b)
+        AND eql_v3.eq_term(_a::public.jsonb_entry) = eql_v3.eq_term(b::public.jsonb_entry)
+      );
+      EXIT WHEN result;
+    END LOOP;
+
+    RETURN result;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Does encrypted value `a` contain all sv elements of `b`?
+--!
+--! Empty b is always contained. Each element of b must match selector + eq_term
+--! in some element of a.
+--!
+--! @param a public.json Container.
+--! @param b public.json Elements to find.
+--! @return boolean True if all elements of b are contained in a.
+--! @see eql_v3.ste_vec_contains(jsonb[], jsonb)
+CREATE FUNCTION eql_v3.ste_vec_contains(a public.json, b public.json)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    result boolean;
+    sv_a jsonb[];
+    sv_b jsonb[];
+    _b jsonb;
+  BEGIN
+    sv_a := eql_v3.ste_vec(a);
+    sv_b := eql_v3.ste_vec(b);
+
+    IF array_length(sv_b, 1) IS NULL THEN
+      RETURN true;
+    END IF;
+
+    IF array_length(sv_a, 1) IS NULL THEN
+      RETURN false;
+    END IF;
+
+    result := true;
+
+    FOR idx IN 1..array_length(sv_b, 1) LOOP
+      _b := sv_b[idx];
+      result := result AND eql_v3.ste_vec_contains(sv_a, _b);
+    END LOOP;
+
+    RETURN result;
+  END;
+$$ LANGUAGE plpgsql;
+
+------------------------------------------------------------------------------
+-- Path queries (text selector only)
+------------------------------------------------------------------------------
+
+--! @brief Query encrypted JSONB for sv elements matching `selector`.
+--!
+--! Returns one jsonb_entry row per matching encrypted element. Returns empty
+--! set on no match. It deliberately does not wrap multiple matches as an
+--! public.json document, because the root document domain requires an `sv`
+--! array and single leaves belong to public.jsonb_entry.
+--!
+--! @param val jsonb encrypted EQL payload with `sv`.
+--! @param selector text Selector hash (`s` value).
+--! @return SETOF public.jsonb_entry Matching encrypted entries.
+--! @see eql_v3.jsonb_path_query_first
+CREATE FUNCTION eql_v3.jsonb_path_query(val jsonb, selector text)
+  RETURNS SETOF public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (eql_v3.meta_data(val) || elem)::public.jsonb_entry
+  FROM jsonb_array_elements(val -> 'sv') elem
+  WHERE elem ->> 's' = selector
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_path_query(jsonb, text) IS
+  'eql-inline-critical: raw-jsonb path query helper; must stay inlinable (unpinned search_path)';
+
+--! @brief Check if a selector path exists in encrypted JSONB.
+--! @param val jsonb encrypted EQL payload.
+--! @param selector text Selector hash to test.
+--! @return boolean True if a matching element exists.
+CREATE FUNCTION eql_v3.jsonb_path_exists(val jsonb, selector text)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT EXISTS (
+    SELECT 1 FROM jsonb_array_elements(val -> 'sv') elem
+    WHERE elem ->> 's' = selector
+  );
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_path_exists(jsonb, text) IS
+  'eql-inline-critical: raw-jsonb path exists helper; must stay inlinable (unpinned search_path)';
+
+--! @brief Get the first sv element matching `selector`, or NULL.
+--! @param val jsonb encrypted EQL payload.
+--! @param selector text Selector hash to match.
+--! @return public.jsonb_entry First matching element or NULL.
+CREATE FUNCTION eql_v3.jsonb_path_query_first(val jsonb, selector text)
+  RETURNS public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (eql_v3.meta_data(val) || elem)::public.jsonb_entry
+  FROM jsonb_array_elements(val -> 'sv') elem
+  WHERE elem ->> 's' = selector
+  LIMIT 1
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_path_query_first(jsonb, text) IS
+  'eql-inline-critical: raw-jsonb path first helper; must stay inlinable (unpinned search_path)';
+
+------------------------------------------------------------------------------
+-- Array functions
+------------------------------------------------------------------------------
+
+--! @brief Get the length of an encrypted JSONB array.
+--! @param val jsonb encrypted EQL payload (must have `a` flag true).
+--! @return integer Number of elements.
+--! @throws Exception 'cannot get array length of a non-array' if not an array.
+CREATE FUNCTION eql_v3.jsonb_array_length(val jsonb)
+  RETURNS integer
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb[];
+  BEGIN
+    IF eql_v3_internal.is_ste_vec_array(val) THEN
+      sv := eql_v3.ste_vec(val);
+      RETURN array_length(sv, 1);
+    END IF;
+
+    RAISE 'cannot get array length of a non-array';
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract elements of an encrypted JSONB array as rows.
+--! @param val jsonb encrypted EQL payload (must have `a` flag true).
+--! @return SETOF public.jsonb_entry One row per element (metadata preserved).
+--! @throws Exception 'cannot extract elements from non-array' if not an array.
+CREATE FUNCTION eql_v3.jsonb_array_elements(val jsonb)
+  RETURNS SETOF public.jsonb_entry
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb[];
+    meta jsonb;
+    item jsonb;
+  BEGIN
+    IF NOT eql_v3_internal.is_ste_vec_array(val) THEN
+      RAISE 'cannot extract elements from non-array';
+    END IF;
+
+    meta := eql_v3.meta_data(val);
+    sv := eql_v3.ste_vec(val);
+
+    FOR idx IN 1..array_length(sv, 1) LOOP
+      item = sv[idx];
+      RETURN NEXT (meta || item)::public.jsonb_entry;
+    END LOOP;
+
+    RETURN;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract elements of an encrypted JSONB array as ciphertext text.
+--! @param val jsonb encrypted EQL payload (must have `a` flag true).
+--! @return SETOF text One ciphertext per element.
+--! @throws Exception 'cannot extract elements from non-array' if not an array.
+CREATE FUNCTION eql_v3.jsonb_array_elements_text(val jsonb)
+  RETURNS SETOF text
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb[];
+  BEGIN
+    IF NOT eql_v3_internal.is_ste_vec_array(val) THEN
+      RAISE 'cannot extract elements from non-array';
+    END IF;
+
+    sv := eql_v3.ste_vec(val);
+
+    FOR idx IN 1..array_length(sv, 1) LOOP
+      RETURN NEXT eql_v3.ciphertext(sv[idx]);
+    END LOOP;
+
+    RETURN;
+  END;
+$$ LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE
+-- Source is src/v3/version.template
+
+DROP FUNCTION IF EXISTS eql_v3.version();
+
+--! @file v3/version.sql
+--! @brief EQL version reporting (self-contained eql_v3 surface)
+--!
+--! This file is auto-generated from src/v3/version.template during build.
+--! The 3.0.0-alpha.3 placeholder is replaced with the actual release
+--! version (bare semver, e.g. "3.0.0") supplied via `mise run build --version`,
+--! or "DEV" for development builds.
+
+--! @brief Get the installed EQL version string
+--!
+--! Returns the version string for the installed EQL library. This value is
+--! baked in at build time from the release tag.
+--!
+--! @return text Version string (e.g. "3.0.0" or "DEV" for development builds)
+--!
+--! @note Auto-generated during build from src/v3/version.template
+--!
+--! Example: `SELECT eql_v3.version()` returns the installed version string,
+--! e.g. `'3.0.0'` (or `'DEV'` for development builds).
+CREATE FUNCTION eql_v3.version()
+  RETURNS text
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT '3.0.0-alpha.3';
+$$ LANGUAGE SQL;
+
+--! @brief Schema-level version marker for obj_description() discoverability
+--!
+--! Mirrors eql_v3.version() as a comment on the schema so the installed
+--! version can also be read via obj_description('eql_v3'::regnamespace).
+COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.3';
+
+--! @brief EQL lint: detect non-inlinable operator implementation functions
+--!
+--! Returns one row per violation found in the installed `eql_v3` surface. The
+--! Postgres planner can only inline a function during index matching when:
+--!
+--!   * `LANGUAGE sql` (plpgsql / C / etc. cannot be inlined)
+--!   * `IMMUTABLE` or `STABLE` volatility (VOLATILE cannot be inlined into
+--!     index expressions)
+--!   * No `SET` clauses (e.g. `SET search_path = ...`)
+--!   * Not `SECURITY DEFINER`
+--!   * Single-statement SELECT body
+--!
+--! @note The single-statement SELECT body condition is **not yet checked** by
+--! this lint. A `LANGUAGE sql` function with a multi-statement body, a CTE,
+--! or any pre-SELECT statement will pass all four implemented checks while
+--! remaining non-inlinable. Implementing the check requires walking `prosrc`
+--! (or `pg_get_functiondef`); tracked as a follow-up.
+--!
+--! Operators on `eql_v3` types (the jsonb-backed encrypted-domain families and
+--! the SEM index-term types `eql_v3_internal.ore_block_256`, `eql_v3_internal.ore_cllw`) whose
+--! implementation functions fail any of these rules silently fall back to seq
+--! scan when the documented functional indexes (`eql_v3.eq_term(col)`,
+--! `eql_v3.ord_term(col)`) are in place. This lint surfaces every such case.
+--!
+--! Severity:
+--!   `error`   — fixable, blocks index matching, ship-blocking.
+--!   `warning` — likely-fixable, may not block matching but signals intent.
+--!   `info`    — observational; useful for review, not a defect on its own.
+--!
+--! Categories:
+--!   `inlinability_language`   — implementation function isn't `LANGUAGE sql`.
+--!   `inlinability_volatility` — implementation function is VOLATILE.
+--!   `inlinability_set_clause` — implementation function has a `SET` clause.
+--!   `inlinability_secdef`     — implementation function is `SECURITY DEFINER`.
+--!   `inlinability_transitive` — implementation function is itself inlinable
+--!                                but its body invokes a non-inlinable function
+--!                                (depth 1; the planner can't peek through
+--!                                that boundary).
+--!   `blocker_language`        — encrypted-domain blocker is not LANGUAGE
+--!                                plpgsql. The planner can inline / elide a
+--!                                LANGUAGE sql body when the result is
+--!                                provably unused, silently bypassing the
+--!                                RAISE that the blocker exists to perform.
+--!   `blocker_strict`          — encrypted-domain blocker is STRICT.
+--!                                PostgreSQL skips the body and returns NULL
+--!                                on NULL arguments, silently bypassing the
+--!                                RAISE.
+--!   `domain_over_domain`      — an `eql_v3` encrypted domain is derived from
+--!                                another encrypted domain rather than jsonb.
+--!                                Operators resolve against the ultimate base
+--!                                type, so the derived domain does not
+--!                                inherit the base domain's blocker surface.
+--!   `domain_opclass`          — an operator class is declared FOR TYPE on an
+--!                                `eql_v3` encrypted domain. Opclasses on
+--!                                domains bypass operator resolution; use a
+--!                                functional index on the extractor instead.
+--!   `schema_placement`        — a naked composite or enum TYPE lives in the
+--!                                public `eql_v3` schema. Internal index-term
+--!                                types (e.g. `ore_block_256_term`) belong in
+--!                                `eql_v3_internal`; a composite/enum in
+--!                                `eql_v3` clutters the Supabase Table Builder
+--!                                type picker, which the schema split exists to
+--!                                prevent. Move it to `eql_v3_internal`.
+--!
+--! @example
+--! ```
+--! SELECT severity, category, object_name, message
+--!   FROM eql_v3.lints()
+--!  WHERE severity = 'error'
+--!  ORDER BY category, object_name;
+--! ```
+--!
+--! @return SETOF record (severity text, category text, object_name text, message text)
+CREATE OR REPLACE FUNCTION eql_v3.lints()
+RETURNS TABLE (
+  severity text,
+  category text,
+  object_name text,
+  message text
+)
+LANGUAGE sql STABLE
+AS $$
+  WITH
+  -- User-column encrypted domains now live in public so application tables
+  -- survive EQL uninstall. Keep this separate from owned_schemas(): public is
+  -- not installer-owned, but its EQL jsonb-backed domains are still the domain
+  -- types whose blockers/operator surfaces the lint must understand.
+  encrypted_domain_types AS (
+    SELECT
+      dt.oid AS typid
+    FROM pg_catalog.pg_type dt
+    JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace
+    JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype
+    JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace
+    WHERE dt.typtype = 'd'
+      AND bt.typname = 'jsonb'
+      AND bn.nspname = 'pg_catalog'
+      AND (
+           dn.nspname = 'public'
+        OR dn.nspname = ANY(eql_v3_internal.owned_schemas())
+      )
+  ),
+
+  -- All operators where at least one operand is an EQL-owned type or a public
+  -- encrypted domain. Limits the scope of the lint to the operator surface
+  -- customers actually hit via SQL (`col = val`, `col @> '...'` and friends).
+  eql_operators AS (
+    SELECT
+      op.oid              AS oprid,
+      op.oprname          AS opname,
+      op.oprcode          AS implfunc,
+      op.oprleft::regtype AS lhs,
+      op.oprright::regtype AS rhs,
+      op.oprcode::regprocedure AS impl_signature
+    FROM pg_operator op
+    WHERE EXISTS (
+        SELECT 1 FROM pg_type t
+         WHERE t.oid IN (op.oprleft, op.oprright)
+           AND (
+                t.typnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY(eql_v3_internal.owned_schemas()))
+             OR t.oid IN (SELECT typid FROM encrypted_domain_types)
+           )
+      )
+  ),
+
+  -- Cross-join with each operator's implementation function metadata.
+  -- One row per operator; columns describe the inlinability of the impl.
+  op_impl AS (
+    SELECT
+      eo.opname,
+      eo.lhs,
+      eo.rhs,
+      eo.implfunc                                  AS impl_oid,
+      eo.impl_signature::text                       AS impl_signature,
+      lang_l.lanname                                AS lang,
+      p.provolatile                                 AS volatility,
+      p.proconfig                                   AS config,
+      p.prosecdef                                   AS secdef,
+      p.prosrc                                      AS body
+    FROM eql_operators eo
+    JOIN pg_proc p ON p.oid = eo.implfunc
+    JOIN pg_language lang_l ON lang_l.oid = p.prolang
+  ),
+
+  -- Encrypted-domain blockers: functions in `eql_v3` whose body contains
+  -- a blocker marker emitted by the codegen (any of the
+  -- `encrypted_domain_unsupported_*` helper calls — `_bool` for boolean
+  -- blockers, `_jsonb` for the native-jsonb-operator blockers; plus the
+  -- literal `is not supported for` for older path-operator blockers) AND
+  -- that take at least one encrypted domain over jsonb argument. The argument
+  -- filter excludes the shared `encrypted_domain_unsupported_*(text, text)`
+  -- helpers themselves, which contain the marker in their body but are not
+  -- blockers (they take text arguments, not a domain).
+  encrypted_domain_blockers AS (
+    SELECT
+      p.oid                                        AS oid,
+      p.oid::regprocedure::text                    AS signature,
+      lang_l.lanname                               AS lang,
+      p.proisstrict                                AS isstrict
+    FROM pg_catalog.pg_proc p
+    JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
+    JOIN pg_catalog.pg_language lang_l ON lang_l.oid = p.prolang
+    WHERE n.nspname = ANY(eql_v3_internal.owned_schemas())
+      AND (p.prosrc LIKE '%encrypted_domain_unsupported%'
+        OR p.prosrc LIKE '%is not supported for%')
+      AND EXISTS (
+        SELECT 1
+        FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ)
+        JOIN encrypted_domain_types edt ON edt.typid = arg.typ
+      )
+  )
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Direct inlinability checks: each row examines one operator's    │
+  -- │ implementation function and emits a violation if any rule is    │
+  -- │ broken. Multiple violations on the same function become         │
+  -- │ multiple rows (developers see every reason it doesn't inline).  │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  SELECT
+    'error'                                                             AS severity,
+    'inlinability_language'                                             AS category,
+    format('operator %s(%s, %s) -> %s',
+           opname, lhs, rhs, impl_signature)                            AS object_name,
+    format(
+      'Operator implementation function is `LANGUAGE %s`; only `LANGUAGE sql` functions can be inlined by the planner. Bare `col %s val` queries fall back to seq scan even when a matching functional index exists.',
+      lang, opname)                                                     AS message
+  FROM op_impl
+  WHERE lang <> 'sql'
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_volatility',
+    format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature),
+    format(
+      'Operator implementation function is `VOLATILE`. The Postgres planner refuses to inline volatile functions into index expressions, so functional indexes never engage. Mark the function `IMMUTABLE` (or `STABLE` if it depends on session state).',
+      opname)
+  FROM op_impl
+  WHERE volatility = 'v'
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_set_clause',
+    format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature),
+    format(
+      'Operator implementation function has a `SET` clause (e.g. `SET search_path = ...`). Per Postgres function-inlining rules, any `SET` clause blocks inlining. Use schema-qualified identifiers in the body and remove the `SET` clause to allow the planner to inline.')
+  FROM op_impl
+  WHERE config IS NOT NULL
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_secdef',
+    format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature),
+    'Operator implementation function is `SECURITY DEFINER`. Such functions cannot be inlined; remove `SECURITY DEFINER` or use a non-inlinable wrapper layer.'
+  FROM op_impl
+  WHERE secdef
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Transitive inlinability: an operator implementation function    │
+  -- │ that's itself inlinable can still fail to inline if its body    │
+  -- │ calls a non-inlinable function. Walk one level via pg_depend.   │
+  -- │                                                                 │
+  -- │ Postgres records function-to-function dependencies in           │
+  -- │ pg_depend with deptype 'n' (normal) when one function references│
+  -- │ another in its body — but only at CREATE time and only for      │
+  -- │ direct calls. This is good enough for v1; deeper transitive     │
+  -- │ analysis is a follow-up.                                        │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_transitive',
+    format('operator %s(%s, %s) -> %s', oi.opname, oi.lhs, oi.rhs,
+           oi.impl_signature),
+    format(
+      'Operator implementation function is inlinable but invokes non-inlinable function `%s` (lang=%s, volatility=%s%s). The chain blocks at depth 1: the planner inlines the outer call but cannot reduce the inner call into an index expression.',
+      called.proname,
+      called_lang.lanname,
+      CASE called.provolatile
+        WHEN 'i' THEN 'IMMUTABLE'
+        WHEN 's' THEN 'STABLE'
+        WHEN 'v' THEN 'VOLATILE'
+      END,
+      CASE WHEN called.proconfig IS NOT NULL
+           THEN ', has SET clause'
+           ELSE '' END)
+  FROM op_impl oi
+  -- Only worth the transitive check if the outer function is otherwise
+  -- inlinable — otherwise the direct lints above already report it.
+  JOIN pg_proc outer_p ON outer_p.oid = oi.impl_signature::regprocedure
+  JOIN pg_depend d
+    ON d.classid = 'pg_proc'::regclass
+   AND d.objid = outer_p.oid
+   AND d.refclassid = 'pg_proc'::regclass
+   AND d.deptype = 'n'
+  JOIN pg_proc called ON called.oid = d.refobjid
+  JOIN pg_language called_lang ON called_lang.oid = called.prolang
+  WHERE oi.lang = 'sql'
+    AND oi.volatility IN ('i', 's')
+    AND oi.config IS NULL
+    AND NOT oi.secdef
+    AND called.oid <> outer_p.oid
+    AND (
+         called_lang.lanname <> 'sql'
+      OR called.provolatile = 'v'
+      OR called.proconfig IS NOT NULL
+      OR called.prosecdef
+    )
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Encrypted-domain footguns: blockers exist to RAISE, so they     │
+  -- │ have inverted inlinability requirements vs operator impls.      │
+  -- │ A LANGUAGE sql blocker can be elided by the planner; a STRICT   │
+  -- │ blocker returns NULL on NULL args. Both silently re-enable      │
+  -- │ operators the storage variant is supposed to block.             │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'blocker_language',
+    format('function %s', signature),
+    format(
+      'Encrypted-domain blocker is `LANGUAGE %s`; must be `LANGUAGE plpgsql` so the RAISE is opaque to the planner. A `LANGUAGE sql` body is inlinable and may be elided when the result is provably unused, silently re-enabling the operator.',
+      lang)
+  FROM encrypted_domain_blockers
+  WHERE lang <> 'plpgsql'
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'blocker_strict',
+    format('function %s', signature),
+    'Encrypted-domain blocker is `STRICT`. PostgreSQL skips the body and returns NULL on a NULL argument, silently bypassing the RAISE. Remove `STRICT`.'
+  FROM encrypted_domain_blockers
+  WHERE isstrict
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Domain identity: an encrypted-domain must be defined directly   │
+  -- │ over jsonb. Operators resolve against the ultimate base type,   │
+  -- │ so domain-over-domain inherits jsonb's operator surface and not │
+  -- │ the base domain's blockers.                                     │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'domain_over_domain',
+    format('domain %I.%I', dn.nspname, dt.typname),
+    format(
+      'Domain `%s.%s` is derived from another encrypted-domain `%s.%s` rather than jsonb. Operators resolve against the ultimate base type, so the derived domain does not inherit the base domain''s operator surface and storage blockers do not engage. Define this domain directly over jsonb.',
+      dn.nspname, dt.typname, bn.nspname, bt.typname)
+  FROM pg_catalog.pg_type dt
+  JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace
+  JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype
+  JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace
+  WHERE dt.typtype = 'd'
+    AND dn.nspname = ANY(eql_v3_internal.owned_schemas())
+    AND bt.typtype = 'd'
+    AND bt.oid IN (SELECT typid FROM encrypted_domain_types)
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Domain opclass: an operator class declared FOR TYPE on an       │
+  -- │ encrypted-domain bypasses operator resolution at index time.    │
+  -- │ Use a functional index on the extractor instead.                │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'domain_opclass',
+    format('opclass %I.%I FOR TYPE %s.%s', cn.nspname, oc.opcname, tn.nspname, t.typname),
+    format(
+      'Operator class `%s.%s` is declared FOR TYPE `%s.%s`, which is an encrypted-domain type. Opclasses on domains bypass operator resolution. Use a functional index on the extractor (e.g. `%s.eq_term(col)`, `%s.ord_term(col)`) instead.',
+      cn.nspname, oc.opcname, tn.nspname, t.typname, tn.nspname, tn.nspname)
+  FROM pg_catalog.pg_opclass oc
+  JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype
+  JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace
+  JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace
+  WHERE t.oid IN (SELECT typid FROM encrypted_domain_types)
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Schema placement: the public `eql_v3` schema must hold only the  │
+  -- │ jsonb-backed encrypted-domain types. A naked composite/enum type │
+  -- │ there is an internal index-term type in the wrong schema — it     │
+  -- │ clutters the Supabase type picker the split exists to keep clean. │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'schema_placement',
+    format('type %I.%I', n.nspname, t.typname),
+    format(
+      'Type `%s.%s` is a %s in the public `eql_v3` schema. Only jsonb-backed encrypted-domain types belong in `eql_v3`; internal index-term types belong in `eql_v3_internal` so they stay out of the Supabase Table Builder type picker. Move it to `eql_v3_internal`.',
+      n.nspname, t.typname,
+      CASE t.typtype WHEN 'c' THEN 'composite type' WHEN 'e' THEN 'enum type' ELSE 'type' END)
+  FROM pg_catalog.pg_type t
+  JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
+  WHERE n.nspname = 'eql_v3'
+    AND t.typtype IN ('c', 'e')
+
+  ORDER BY 1, 2, 3;
+$$;
+
+COMMENT ON FUNCTION eql_v3.lints() IS
+  'EQL lint: returns one row per non-inlinable operator implementation. '
+  'Run `SELECT * FROM eql_v3.lints() WHERE severity = ''error''` for a '
+  'CI-gateable check that all operator implementations on eql_v3 types are '
+  'eligible for planner inlining.';
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_operators.sql
+--! @brief Operators for public.bigint.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_eq_functions.sql
+--! @brief Functions for public.bigint_eq.
+
+--! @brief Index extractor for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.bigint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.bigint_eq) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.bigint_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.bigint_eq) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.bigint_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector text
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_eq, selector text)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector integer
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_eq, selector integer)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param selector public.bigint_eq
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_eq)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param selector public.bigint_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_eq, b public.bigint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_bigint_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_bigint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_eq_functions.sql
+--! @brief Functions for eql_v3.query_bigint_eq.
+
+--! @brief Index extractor for eql_v3.query_bigint_eq.
+--! @param a eql_v3.query_bigint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_bigint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a public.bigint_eq
+--! @param b eql_v3.query_bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b eql_v3.query_bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a eql_v3.query_bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a public.bigint_eq
+--! @param b eql_v3.query_bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b eql_v3.query_bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a eql_v3.query_bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ope_functions.sql
+--! @brief Functions for public.bigint_ord_ope.
+
+--! @brief Index extractor for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.bigint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector text
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ope, selector text)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector integer
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ope, selector integer)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ore_aggregates.sql
+--! @brief Aggregates for public.bigint_ord_ore.
+
+--! @brief State function for min on public.bigint_ord_ore.
+--! @param state public.bigint_ord_ore
+--! @param value public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord_ore, value public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.bigint_ord_ore.
+--! @param input public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE AGGREGATE eql_v3.min(public.bigint_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.bigint_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.bigint_ord_ore.
+--! @param state public.bigint_ord_ore
+--! @param value public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord_ore, value public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.bigint_ord_ore.
+--! @param input public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE AGGREGATE eql_v3.max(public.bigint_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.bigint_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_aggregates.sql
+--! @brief Aggregates for public.bigint_ord.
+
+--! @brief State function for min on public.bigint_ord.
+--! @param state public.bigint_ord
+--! @param value public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord, value public.bigint_ord)
+RETURNS public.bigint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.bigint_ord.
+--! @param input public.bigint_ord
+--! @return public.bigint_ord
+CREATE AGGREGATE eql_v3.min(public.bigint_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.bigint_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.bigint_ord.
+--! @param state public.bigint_ord
+--! @param value public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord, value public.bigint_ord)
+RETURNS public.bigint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.bigint_ord.
+--! @param input public.bigint_ord
+--! @return public.bigint_ord
+CREATE AGGREGATE eql_v3.max(public.bigint_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.bigint_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_bigint_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_bigint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_operators.sql
+--! @brief Operators for eql_v3.query_bigint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ope_operators.sql
+--! @brief Operators for public.bigint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_eq_operators.sql
+--! @brief Operators for eql_v3.query_bigint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = eql_v3.query_bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_eq, RIGHTARG = eql_v3.query_bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_bigint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_eq_operators.sql
+--! @brief Operators for public.bigint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ope_aggregates.sql
+--! @brief Aggregates for public.bigint_ord_ope.
+
+--! @brief State function for min on public.bigint_ord_ope.
+--! @param state public.bigint_ord_ope
+--! @param value public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord_ope, value public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.bigint_ord_ope.
+--! @param input public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE AGGREGATE eql_v3.min(public.bigint_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.bigint_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.bigint_ord_ope.
+--! @param state public.bigint_ord_ope
+--! @param value public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord_ope, value public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.bigint_ord_ope.
+--! @param input public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE AGGREGATE eql_v3.max(public.bigint_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.bigint_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_bigint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_real_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ore_operators.sql
+--! @brief Operators for public.real_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_operators.sql
+--! @brief Operators for public.real_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_functions.sql
+--! @brief Functions for eql_v3.query_real_ord.
+
+--! @brief Index extractor for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_real_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ore_aggregates.sql
+--! @brief Aggregates for public.real_ord_ore.
+
+--! @brief State function for min on public.real_ord_ore.
+--! @param state public.real_ord_ore
+--! @param value public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord_ore, value public.real_ord_ore)
+RETURNS public.real_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.real_ord_ore.
+--! @param input public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE AGGREGATE eql_v3.min(public.real_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.real_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.real_ord_ore.
+--! @param state public.real_ord_ore
+--! @param value public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord_ore, value public.real_ord_ore)
+RETURNS public.real_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.real_ord_ore.
+--! @param input public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE AGGREGATE eql_v3.max(public.real_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.real_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ope_operators.sql
+--! @brief Operators for public.real_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_eq_operators.sql
+--! @brief Operators for eql_v3.query_real_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_eq, RIGHTARG = eql_v3.query_real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_eq, RIGHTARG = eql_v3.query_real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_real_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_functions.sql
+--! @brief Functions for public.real.
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector text
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a public.real, selector text)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector integer
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a public.real, selector integer)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param selector public.real
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param selector public.real
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real, b public.real)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_aggregates.sql
+--! @brief Aggregates for public.real_ord.
+
+--! @brief State function for min on public.real_ord.
+--! @param state public.real_ord
+--! @param value public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord, value public.real_ord)
+RETURNS public.real_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.real_ord.
+--! @param input public.real_ord
+--! @return public.real_ord
+CREATE AGGREGATE eql_v3.min(public.real_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.real_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.real_ord.
+--! @param state public.real_ord
+--! @param value public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord, value public.real_ord)
+RETURNS public.real_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.real_ord.
+--! @param input public.real_ord
+--! @return public.real_ord
+CREATE AGGREGATE eql_v3.max(public.real_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.real_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_operators.sql
+--! @brief Operators for eql_v3.query_real_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_operators.sql
+--! @brief Operators for public.real.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ope_aggregates.sql
+--! @brief Aggregates for public.real_ord_ope.
+
+--! @brief State function for min on public.real_ord_ope.
+--! @param state public.real_ord_ope
+--! @param value public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord_ope, value public.real_ord_ope)
+RETURNS public.real_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.real_ord_ope.
+--! @param input public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE AGGREGATE eql_v3.min(public.real_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.real_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.real_ord_ope.
+--! @param state public.real_ord_ope
+--! @param value public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord_ope, value public.real_ord_ope)
+RETURNS public.real_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.real_ord_ope.
+--! @param input public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE AGGREGATE eql_v3.max(public.real_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.real_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_eq_operators.sql
+--! @brief Operators for public.real_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ore_aggregates.sql
+--! @brief Aggregates for public.smallint_ord_ore.
+
+--! @brief State function for min on public.smallint_ord_ore.
+--! @param state public.smallint_ord_ore
+--! @param value public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord_ore, value public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.smallint_ord_ore.
+--! @param input public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE AGGREGATE eql_v3.min(public.smallint_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.smallint_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.smallint_ord_ore.
+--! @param state public.smallint_ord_ore
+--! @param value public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord_ore, value public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.smallint_ord_ore.
+--! @param input public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE AGGREGATE eql_v3.max(public.smallint_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.smallint_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_smallint_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_smallint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_smallint_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_smallint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_operators.sql
+--! @brief Operators for public.smallint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_eq_operators.sql
+--! @brief Operators for eql_v3.query_smallint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = eql_v3.query_smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_eq, RIGHTARG = eql_v3.query_smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_operators.sql
+--! @brief Operators for eql_v3.query_smallint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_operators.sql
+--! @brief Operators for public.smallint.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_smallint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_eq_operators.sql
+--! @brief Operators for public.smallint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ope_aggregates.sql
+--! @brief Aggregates for public.smallint_ord_ope.
+
+--! @brief State function for min on public.smallint_ord_ope.
+--! @param state public.smallint_ord_ope
+--! @param value public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord_ope, value public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.smallint_ord_ope.
+--! @param input public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE AGGREGATE eql_v3.min(public.smallint_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.smallint_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.smallint_ord_ope.
+--! @param state public.smallint_ord_ope
+--! @param value public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord_ope, value public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.smallint_ord_ope.
+--! @param input public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE AGGREGATE eql_v3.max(public.smallint_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.smallint_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_smallint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_aggregates.sql
+--! @brief Aggregates for public.smallint_ord.
+
+--! @brief State function for min on public.smallint_ord.
+--! @param state public.smallint_ord
+--! @param value public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord, value public.smallint_ord)
+RETURNS public.smallint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.smallint_ord.
+--! @param input public.smallint_ord
+--! @return public.smallint_ord
+CREATE AGGREGATE eql_v3.min(public.smallint_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.smallint_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.smallint_ord.
+--! @param state public.smallint_ord
+--! @param value public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord, value public.smallint_ord)
+RETURNS public.smallint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.smallint_ord.
+--! @param input public.smallint_ord
+--! @return public.smallint_ord
+CREATE AGGREGATE eql_v3.max(public.smallint_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.smallint_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_operators.sql
+--! @brief Operators for eql_v3.query_date_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_date_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_date_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_date_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_date_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_eq_operators.sql
+--! @brief Operators for public.date_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_operators.sql
+--! @brief Operators for public.date.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ore_aggregates.sql
+--! @brief Aggregates for public.date_ord_ore.
+
+--! @brief State function for min on public.date_ord_ore.
+--! @param state public.date_ord_ore
+--! @param value public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord_ore, value public.date_ord_ore)
+RETURNS public.date_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.date_ord_ore.
+--! @param input public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE AGGREGATE eql_v3.min(public.date_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.date_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.date_ord_ore.
+--! @param state public.date_ord_ore
+--! @param value public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord_ore, value public.date_ord_ore)
+RETURNS public.date_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.date_ord_ore.
+--! @param input public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE AGGREGATE eql_v3.max(public.date_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.date_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_eq_functions.sql
+--! @brief Functions for eql_v3.query_date_eq.
+
+--! @brief Index extractor for eql_v3.query_date_eq.
+--! @param a eql_v3.query_date_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_date_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a public.date_eq
+--! @param b eql_v3.query_date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b eql_v3.query_date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a eql_v3.query_date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a public.date_eq
+--! @param b eql_v3.query_date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b eql_v3.query_date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a eql_v3.query_date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ope_aggregates.sql
+--! @brief Aggregates for public.date_ord_ope.
+
+--! @brief State function for min on public.date_ord_ope.
+--! @param state public.date_ord_ope
+--! @param value public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord_ope, value public.date_ord_ope)
+RETURNS public.date_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.date_ord_ope.
+--! @param input public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE AGGREGATE eql_v3.min(public.date_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.date_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.date_ord_ope.
+--! @param state public.date_ord_ope
+--! @param value public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord_ope, value public.date_ord_ope)
+RETURNS public.date_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.date_ord_ope.
+--! @param input public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE AGGREGATE eql_v3.max(public.date_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.date_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_date_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_operators.sql
+--! @brief Operators for public.date_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_aggregates.sql
+--! @brief Aggregates for public.date_ord.
+
+--! @brief State function for min on public.date_ord.
+--! @param state public.date_ord
+--! @param value public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord, value public.date_ord)
+RETURNS public.date_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.date_ord.
+--! @param input public.date_ord
+--! @return public.date_ord
+CREATE AGGREGATE eql_v3.min(public.date_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.date_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.date_ord.
+--! @param state public.date_ord
+--! @param value public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord, value public.date_ord)
+RETURNS public.date_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.date_ord.
+--! @param input public.date_ord
+--! @return public.date_ord
+CREATE AGGREGATE eql_v3.max(public.date_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.date_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_eq_operators.sql
+--! @brief Operators for eql_v3.query_date_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_eq, RIGHTARG = eql_v3.query_date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_eq, RIGHTARG = eql_v3.query_date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_date_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_eq_functions.sql
+--! @brief Functions for eql_v3.query_numeric_eq.
+
+--! @brief Index extractor for eql_v3.query_numeric_eq.
+--! @param a eql_v3.query_numeric_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_numeric_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a public.numeric_eq
+--! @param b eql_v3.query_numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b eql_v3.query_numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a eql_v3.query_numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a public.numeric_eq
+--! @param b eql_v3.query_numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b eql_v3.query_numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a eql_v3.query_numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_operators.sql
+--! @brief Operators for eql_v3.query_numeric_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_numeric_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_functions.sql
+--! @brief Functions for public.numeric.
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector text
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric, selector text)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector integer
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric, selector integer)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param selector public.numeric
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param selector public.numeric
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric, b public.numeric)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_numeric_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_eq_operators.sql
+--! @brief Operators for public.numeric_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ore_aggregates.sql
+--! @brief Aggregates for public.numeric_ord_ore.
+
+--! @brief State function for min on public.numeric_ord_ore.
+--! @param state public.numeric_ord_ore
+--! @param value public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord_ore, value public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.numeric_ord_ore.
+--! @param input public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE AGGREGATE eql_v3.min(public.numeric_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.numeric_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.numeric_ord_ore.
+--! @param state public.numeric_ord_ore
+--! @param value public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord_ore, value public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.numeric_ord_ore.
+--! @param input public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE AGGREGATE eql_v3.max(public.numeric_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.numeric_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_operators.sql
+--! @brief Operators for public.numeric.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_eq_operators.sql
+--! @brief Operators for eql_v3.query_numeric_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = eql_v3.query_numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_eq, RIGHTARG = eql_v3.query_numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ope_aggregates.sql
+--! @brief Aggregates for public.numeric_ord_ope.
+
+--! @brief State function for min on public.numeric_ord_ope.
+--! @param state public.numeric_ord_ope
+--! @param value public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord_ope, value public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.numeric_ord_ope.
+--! @param input public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE AGGREGATE eql_v3.min(public.numeric_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.numeric_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.numeric_ord_ope.
+--! @param state public.numeric_ord_ope
+--! @param value public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord_ope, value public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.numeric_ord_ope.
+--! @param input public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE AGGREGATE eql_v3.max(public.numeric_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.numeric_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_operators.sql
+--! @brief Operators for public.numeric_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_aggregates.sql
+--! @brief Aggregates for public.numeric_ord.
+
+--! @brief State function for min on public.numeric_ord.
+--! @param state public.numeric_ord
+--! @param value public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord, value public.numeric_ord)
+RETURNS public.numeric_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.numeric_ord.
+--! @param input public.numeric_ord
+--! @return public.numeric_ord
+CREATE AGGREGATE eql_v3.min(public.numeric_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.numeric_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.numeric_ord.
+--! @param state public.numeric_ord
+--! @param value public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord, value public.numeric_ord)
+RETURNS public.numeric_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.numeric_ord.
+--! @param input public.numeric_ord
+--! @return public.numeric_ord
+CREATE AGGREGATE eql_v3.max(public.numeric_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.numeric_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/boolean/boolean_types.sql
+--! @brief Encrypted-domain types for boolean.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.boolean.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'boolean' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.boolean AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.boolean IS 'EQL encrypted boolean (storage only)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/boolean/boolean_functions.sql
+--! @brief Functions for public.boolean.
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector text
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a public.boolean, selector text)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector integer
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a public.boolean, selector integer)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param selector public.boolean
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.boolean)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.boolean, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.boolean, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param selector public.boolean
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.boolean)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.boolean, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.boolean, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.boolean, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.boolean, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.boolean, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.boolean, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.boolean, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.boolean, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.boolean, b public.boolean)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.boolean, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.boolean)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/boolean/boolean_operators.sql
+--! @brief Operators for public.boolean.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.boolean, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.boolean, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.boolean, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.boolean, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.boolean, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_functions.sql
+--! @brief Functions for eql_v3.query_double_ord.
+
+--! @brief Index extractor for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_double_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_double_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_double_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_aggregates.sql
+--! @brief Aggregates for public.double_ord.
+
+--! @brief State function for min on public.double_ord.
+--! @param state public.double_ord
+--! @param value public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord, value public.double_ord)
+RETURNS public.double_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.double_ord.
+--! @param input public.double_ord
+--! @return public.double_ord
+CREATE AGGREGATE eql_v3.min(public.double_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.double_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.double_ord.
+--! @param state public.double_ord
+--! @param value public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord, value public.double_ord)
+RETURNS public.double_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.double_ord.
+--! @param input public.double_ord
+--! @return public.double_ord
+CREATE AGGREGATE eql_v3.max(public.double_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.double_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ope_aggregates.sql
+--! @brief Aggregates for public.double_ord_ope.
+
+--! @brief State function for min on public.double_ord_ope.
+--! @param state public.double_ord_ope
+--! @param value public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord_ope, value public.double_ord_ope)
+RETURNS public.double_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.double_ord_ope.
+--! @param input public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE AGGREGATE eql_v3.min(public.double_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.double_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.double_ord_ope.
+--! @param state public.double_ord_ope
+--! @param value public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord_ope, value public.double_ord_ope)
+RETURNS public.double_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.double_ord_ope.
+--! @param input public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE AGGREGATE eql_v3.max(public.double_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.double_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_operators.sql
+--! @brief Operators for public.double.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_eq_operators.sql
+--! @brief Operators for eql_v3.query_double_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_eq, RIGHTARG = eql_v3.query_double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_eq, RIGHTARG = eql_v3.query_double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_double_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_double_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_eq_operators.sql
+--! @brief Operators for public.double_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_double_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_operators.sql
+--! @brief Operators for eql_v3.query_double_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ore_aggregates.sql
+--! @brief Aggregates for public.double_ord_ore.
+
+--! @brief State function for min on public.double_ord_ore.
+--! @param state public.double_ord_ore
+--! @param value public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord_ore, value public.double_ord_ore)
+RETURNS public.double_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.double_ord_ore.
+--! @param input public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE AGGREGATE eql_v3.min(public.double_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.double_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.double_ord_ore.
+--! @param state public.double_ord_ore
+--! @param value public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord_ore, value public.double_ord_ore)
+RETURNS public.double_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.double_ord_ore.
+--! @param input public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE AGGREGATE eql_v3.max(public.double_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.double_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_double_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_aggregates.sql
+--! @brief Aggregates for public.integer_ord.
+
+--! @brief State function for min on public.integer_ord.
+--! @param state public.integer_ord
+--! @param value public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord, value public.integer_ord)
+RETURNS public.integer_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.integer_ord.
+--! @param input public.integer_ord
+--! @return public.integer_ord
+CREATE AGGREGATE eql_v3.min(public.integer_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.integer_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.integer_ord.
+--! @param state public.integer_ord
+--! @param value public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord, value public.integer_ord)
+RETURNS public.integer_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.integer_ord.
+--! @param input public.integer_ord
+--! @return public.integer_ord
+CREATE AGGREGATE eql_v3.max(public.integer_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.integer_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ore_aggregates.sql
+--! @brief Aggregates for public.integer_ord_ore.
+
+--! @brief State function for min on public.integer_ord_ore.
+--! @param state public.integer_ord_ore
+--! @param value public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord_ore, value public.integer_ord_ore)
+RETURNS public.integer_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.integer_ord_ore.
+--! @param input public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE AGGREGATE eql_v3.min(public.integer_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.integer_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.integer_ord_ore.
+--! @param state public.integer_ord_ore
+--! @param value public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord_ore, value public.integer_ord_ore)
+RETURNS public.integer_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.integer_ord_ore.
+--! @param input public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE AGGREGATE eql_v3.max(public.integer_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.integer_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_integer_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_integer_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ope_operators.sql
+--! @brief Operators for public.integer_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_integer_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_integer_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_operators.sql
+--! @brief Operators for public.integer.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_eq_operators.sql
+--! @brief Operators for eql_v3.query_integer_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_eq, RIGHTARG = eql_v3.query_integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_eq, RIGHTARG = eql_v3.query_integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_functions.sql
+--! @brief Functions for eql_v3.query_integer_ord.
+
+--! @brief Index extractor for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_integer_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_integer_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_eq_operators.sql
+--! @brief Operators for public.integer_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_operators.sql
+--! @brief Operators for eql_v3.query_integer_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ope_aggregates.sql
+--! @brief Aggregates for public.integer_ord_ope.
+
+--! @brief State function for min on public.integer_ord_ope.
+--! @param state public.integer_ord_ope
+--! @param value public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord_ope, value public.integer_ord_ope)
+RETURNS public.integer_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.integer_ord_ope.
+--! @param input public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE AGGREGATE eql_v3.min(public.integer_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.integer_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.integer_ord_ope.
+--! @param state public.integer_ord_ope
+--! @param value public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord_ope, value public.integer_ord_ope)
+RETURNS public.integer_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.integer_ord_ope.
+--! @param input public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE AGGREGATE eql_v3.max(public.integer_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.integer_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_integer_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_match_functions.sql
+--! @brief Functions for eql_v3.query_text_match.
+
+--! @brief Index extractor for eql_v3.query_text_match.
+--! @param a eql_v3.query_text_match
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a eql_v3.query_text_match)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a public.text_match
+--! @param b eql_v3.query_text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_match, b eql_v3.query_text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a eql_v3.query_text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a eql_v3.query_text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a public.text_match
+--! @param b eql_v3.query_text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b eql_v3.query_text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a eql_v3.query_text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a eql_v3.query_text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_functions.sql
+--! @brief Functions for public.text.
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector text
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a public.text, selector text)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector integer
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a public.text, selector integer)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param selector public.text
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param selector public.text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text, b public.text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_text_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord_ope)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_text_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_operators.sql
+--! @brief Operators for eql_v3.query_text_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_eq_functions.sql
+--! @brief Functions for eql_v3.query_text_eq.
+
+--! @brief Index extractor for eql_v3.query_text_eq.
+--! @param a eql_v3.query_text_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a public.text_eq
+--! @param b eql_v3.query_text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b eql_v3.query_text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a eql_v3.query_text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a public.text_eq
+--! @param b eql_v3.query_text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b eql_v3.query_text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a eql_v3.query_text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_match_operators.sql
+--! @brief Operators for public.text_match.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_match, RIGHTARG = jsonb,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_match, RIGHTARG = jsonb,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_match, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_match, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_match, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_match, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_match, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_search_operators.sql
+--! @brief Operators for public.text_search.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_search, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_search
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_search, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_search
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_search, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_search, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_search, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_search, RIGHTARG = public.text_search
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_search, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_search
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_text_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord_ore)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_search_functions.sql
+--! @brief Functions for eql_v3.query_text_search.
+
+--! @brief Index extractor for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_search)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_search)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a eql_v3.query_text_search)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_eq_operators.sql
+--! @brief Operators for public.text_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ore_aggregates.sql
+--! @brief Aggregates for public.text_ord_ore.
+
+--! @brief State function for min on public.text_ord_ore.
+--! @param state public.text_ord_ore
+--! @param value public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord_ore, value public.text_ord_ore)
+RETURNS public.text_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_ord_ore.
+--! @param input public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE AGGREGATE eql_v3.min(public.text_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_ord_ore.
+--! @param state public.text_ord_ore
+--! @param value public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord_ore, value public.text_ord_ore)
+RETURNS public.text_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_ord_ore.
+--! @param input public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE AGGREGATE eql_v3.max(public.text_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_aggregates.sql
+--! @brief Aggregates for public.text_ord.
+
+--! @brief State function for min on public.text_ord.
+--! @param state public.text_ord
+--! @param value public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord, value public.text_ord)
+RETURNS public.text_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_ord.
+--! @param input public.text_ord
+--! @return public.text_ord
+CREATE AGGREGATE eql_v3.min(public.text_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_ord.
+--! @param state public.text_ord
+--! @param value public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord, value public.text_ord)
+RETURNS public.text_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_ord.
+--! @param input public.text_ord
+--! @return public.text_ord
+CREATE AGGREGATE eql_v3.max(public.text_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_text_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ope_operators.sql
+--! @brief Operators for public.text_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ope_aggregates.sql
+--! @brief Aggregates for public.text_ord_ope.
+
+--! @brief State function for min on public.text_ord_ope.
+--! @param state public.text_ord_ope
+--! @param value public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord_ope, value public.text_ord_ope)
+RETURNS public.text_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_ord_ope.
+--! @param input public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE AGGREGATE eql_v3.min(public.text_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_ord_ope.
+--! @param state public.text_ord_ope
+--! @param value public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord_ope, value public.text_ord_ope)
+RETURNS public.text_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_ord_ope.
+--! @param input public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE AGGREGATE eql_v3.max(public.text_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_match_operators.sql
+--! @brief Operators for eql_v3.query_text_match.
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_match, RIGHTARG = eql_v3.query_text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = eql_v3.query_text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_match, RIGHTARG = eql_v3.query_text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = eql_v3.query_text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_operators.sql
+--! @brief Operators for public.text.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_search_aggregates.sql
+--! @brief Aggregates for public.text_search.
+
+--! @brief State function for min on public.text_search.
+--! @param state public.text_search
+--! @param value public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_search, value public.text_search)
+RETURNS public.text_search
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_search.
+--! @param input public.text_search
+--! @return public.text_search
+CREATE AGGREGATE eql_v3.min(public.text_search) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_search,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_search.
+--! @param state public.text_search
+--! @param value public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_search, value public.text_search)
+RETURNS public.text_search
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_search.
+--! @param input public.text_search
+--! @return public.text_search
+CREATE AGGREGATE eql_v3.max(public.text_search) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_search,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_search_operators.sql
+--! @brief Operators for eql_v3.query_text_search.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_eq_operators.sql
+--! @brief Operators for eql_v3.query_text_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_eq, RIGHTARG = eql_v3.query_text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_eq, RIGHTARG = eql_v3.query_text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_text_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_functions.sql
+--! @brief Functions for public.timestamp.
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector text
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp, selector text)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector integer
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp, selector integer)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param selector public.timestamp
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param selector public.timestamp
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp, b public.timestamp)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_aggregates.sql
+--! @brief Aggregates for public.timestamp_ord.
+
+--! @brief State function for min on public.timestamp_ord.
+--! @param state public.timestamp_ord
+--! @param value public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord, value public.timestamp_ord)
+RETURNS public.timestamp_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.timestamp_ord.
+--! @param input public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.timestamp_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.timestamp_ord.
+--! @param state public.timestamp_ord
+--! @param value public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord, value public.timestamp_ord)
+RETURNS public.timestamp_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.timestamp_ord.
+--! @param input public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.timestamp_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_timestamp_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_eq_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = eql_v3.query_timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = eql_v3.query_timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_eq_operators.sql
+--! @brief Operators for public.timestamp_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_timestamp_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ope_aggregates.sql
+--! @brief Aggregates for public.timestamp_ord_ope.
+
+--! @brief State function for min on public.timestamp_ord_ope.
+--! @param state public.timestamp_ord_ope
+--! @param value public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord_ope, value public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.timestamp_ord_ope.
+--! @param input public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.timestamp_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.timestamp_ord_ope.
+--! @param state public.timestamp_ord_ope
+--! @param value public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord_ope, value public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.timestamp_ord_ope.
+--! @param input public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.timestamp_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_ord.
+
+--! @brief Index extractor for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_timestamp_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ore_aggregates.sql
+--! @brief Aggregates for public.timestamp_ord_ore.
+
+--! @brief State function for min on public.timestamp_ord_ore.
+--! @param state public.timestamp_ord_ore
+--! @param value public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord_ore, value public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.timestamp_ord_ore.
+--! @param input public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.timestamp_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.timestamp_ord_ore.
+--! @param state public.timestamp_ord_ore
+--! @param value public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord_ore, value public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.timestamp_ord_ore.
+--! @param input public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.timestamp_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_operators.sql
+--! @brief Operators for public.timestamp.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+--! @file v3/sem/ore_block_256/operator_class.sql
+--! @brief B-tree operator family + default class on eql_v3_internal.ore_block_256.
+--!
+--! Gives the composite type its DEFAULT btree opclass so the recommended
+--! functional index `CREATE INDEX ON t (eql_v3_internal.ord_term(col))` engages without
+--! an explicit opclass annotation (design D4).
+--!
+--! @note Creating an operator family/class requires superuser: Postgres forbids
+--!       CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index
+--!       integrity. Managed platforms (Supabase, and most hosted Postgres) run
+--!       the installer as a non-superuser role, so the DO block below ATTEMPTS
+--!       the creation and skips it on insufficient_privilege (SQLSTATE 42501),
+--!       letting the single installer run everywhere. When the class is absent,
+--!       ORE ordered scans over eql_v3_internal.ore_block_256 are unavailable,
+--!       but the order-preserving (OPE) ordering domains — whose extractor
+--!       return types carry a native btree opclass — still index without it. On
+--!       superuser installs (self-managed Postgres, the SQLx test matrix) the
+--!       class is created normally. Any non-privilege error still propagates.
+--! @see eql_v3_internal.compare_ore_block_256_terms
+
+DO $do$
+BEGIN
+  EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree';
+
+  EXECUTE $ddl$
+    CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class
+      DEFAULT FOR TYPE eql_v3_internal.ore_block_256
+      USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS
+        OPERATOR 1 public.<,
+        OPERATOR 2 public.<=,
+        OPERATOR 3 public.=,
+        OPERATOR 4 public.>=,
+        OPERATOR 5 public.>,
+        FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+  $ddl$;
+
+  RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_block_256_operator_class';
+EXCEPTION
+  WHEN insufficient_privilege THEN
+    RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_block_256_operator_class (requires superuser); ORE ordered indexes on ore_block_256 unavailable, OPE ordering domains unaffected';
+END;
+$do$;
+
+--! @file v3/sem/ore_cllw/operators.sql
+--! @brief Comparison operators on the eql_v3_internal.ore_cllw composite type.
+--!
+--! Each backing function reduces to a single SELECT over
+--! eql_v3_internal.compare_ore_cllw_term(a, b) and is inlinable so the planner can fold
+--! it through to functional-index matching. The inner comparator is plpgsql
+--! (per-byte loop) and is not inlined — fine for index *match*.
+--!
+--! @note Deliberately no HASHES / MERGES — the CLLW protocol gives ordering,
+--!       not a hash; there is no merge-joinable opclass on the other side.
+--! @see eql_v3_internal.compare_ore_cllw_term
+
+--! @brief Equality backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the CLLW ORE terms are equal
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_eq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 0
+$$;
+
+--! @brief Not-equal backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the CLLW ORE terms are not equal
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_neq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 0
+$$;
+
+--! @brief Less-than backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is less than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_lt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = -1
+$$;
+
+--! @brief Less-than-or-equal backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is less than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_lte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 1
+$$;
+
+--! @brief Greater-than backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is greater than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_gt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 1
+$$;
+
+--! @brief Greater-than-or-equal backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is greater than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_gte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> -1
+$$;
+
+
+CREATE OPERATOR public.= (
+  FUNCTION = eql_v3_internal.ore_cllw_eq,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.=),
+  NEGATOR = OPERATOR(public.<>),
+  RESTRICT = eqsel,
+  JOIN = eqjoinsel
+);
+
+CREATE OPERATOR public.<> (
+  FUNCTION = eql_v3_internal.ore_cllw_neq,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.<>),
+  NEGATOR = OPERATOR(public.=),
+  RESTRICT = neqsel,
+  JOIN = neqjoinsel
+);
+
+CREATE OPERATOR public.< (
+  FUNCTION = eql_v3_internal.ore_cllw_lt,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.>),
+  NEGATOR = OPERATOR(public.>=),
+  RESTRICT = scalarltsel,
+  JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR public.<= (
+  FUNCTION = eql_v3_internal.ore_cllw_lte,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.>=),
+  NEGATOR = OPERATOR(public.>),
+  RESTRICT = scalarlesel,
+  JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR public.> (
+  FUNCTION = eql_v3_internal.ore_cllw_gt,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.<),
+  NEGATOR = OPERATOR(public.<=),
+  RESTRICT = scalargtsel,
+  JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR public.>= (
+  FUNCTION = eql_v3_internal.ore_cllw_gte,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.<=),
+  NEGATOR = OPERATOR(public.<),
+  RESTRICT = scalargesel,
+  JOIN = scalargejoinsel
+);
+
+--! @file v3/sem/ore_cllw/operator_class.sql
+--! @brief Btree operator class on the eql_v3_internal.ore_cllw composite type.
+--!
+--! DEFAULT FOR TYPE so a functional btree index on eql_v3_internal.ore_cllw(expr)
+--! engages without an explicit opclass annotation. FUNCTION 1 is the three-way
+--! comparator btree's internal sort uses; it is plpgsql by design (per-byte
+--! CLLW protocol needs iteration) and is called once per index-entry pair
+--! during build / search, not per-row in the outer query.
+--!
+--! @note Creating an operator family/class requires superuser: Postgres forbids
+--!       CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index
+--!       integrity. Managed platforms (Supabase, and most hosted Postgres) run
+--!       the installer as a non-superuser role, so the DO block below ATTEMPTS
+--!       the creation and skips it on insufficient_privilege (SQLSTATE 42501),
+--!       letting the single installer run everywhere. When the class is absent,
+--!       ORE ordered scans over eql_v3_internal.ore_cllw are unavailable, but
+--!       the order-preserving (OPE) ordering domains — whose extractor return
+--!       types carry a native btree opclass — still index without it. On
+--!       superuser installs (self-managed Postgres, the SQLx test matrix) the
+--!       class is created normally. Any non-privilege error still propagates.
+--! @see eql_v3_internal.compare_ore_cllw_term
+
+DO $do$
+BEGIN
+  EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_cllw_ops USING btree';
+
+  EXECUTE $ddl$
+    CREATE OPERATOR CLASS eql_v3_internal.ore_cllw_ops
+      DEFAULT FOR TYPE eql_v3_internal.ore_cllw
+      USING btree FAMILY eql_v3_internal.ore_cllw_ops AS
+        OPERATOR 1 public.<  (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 2 public.<= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 3 public.=  (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 4 public.>= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 5 public.>  (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        FUNCTION 1 eql_v3_internal.compare_ore_cllw_term(eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw)
+  $ddl$;
+
+  RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_cllw_ops';
+EXCEPTION
+  WHEN insufficient_privilege THEN
+    RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_cllw_ops (requires superuser); ORE ordered indexes on ore_cllw unavailable, OPE ordering domains unaffected';
+END;
+$do$;
+
+--! @file v3/jsonb/aggregates.sql
+--! @brief min / max aggregates over public.jsonb_entry.
+--!
+--! SteVec document entries extracted at a selector (`doc -> 'sel'`) order by
+--! their CLLW ORE (`oc`) term, so the extremum is picked by comparing
+--! `eql_v3.ore_cllw(entry)` rather than the scalar Block-ORE `ord_term` the
+--! generated scalar ord aggregates use. Same STRICT + PARALLEL SAFE shape as the
+--! generated scalar `min`/`max` so partial/parallel aggregation is available on
+--! large GROUP BY workloads.
+--!
+--! Per the encrypted-domain footgun rules the state functions are
+--! `LANGUAGE plpgsql` with the pinned `search_path` — a `LANGUAGE sql` body would
+--! be inlinable and the planner could elide it.
+--!
+--! @note **Only `oc`-carrying entries are orderable.** `eql_v3.ore_cllw(entry)`
+--!   returns NULL when an entry has no `oc` (CLLW ORE) term — the same entries a
+--!   `eql_v3.ore_cllw` btree NULL-filters from range scans. The state functions
+--!   therefore IGNORE `oc`-less entries (they never become or survive as the
+--!   extremum), so `min`/`max` is well-defined over a mix of `oc`-carrying and
+--!   `oc`-less entries and is not corrupted by an `oc`-less seed. A naive
+--!   `ore_cllw(value) < ore_cllw(state)` would be NULL whenever either side
+--!   lacks `oc`, pinning a wrong (`oc`-less) extremum when the first aggregated
+--!   row is `oc`-less. An all-`oc`-less input has no orderable extremum and
+--!   returns the (arbitrary) STRICT seed.
+
+--! @brief State function for min on public.jsonb_entry.
+--!
+--! Keeps whichever orderable entry has the lesser CLLW ORE term. STRICT, so SQL
+--! NULL entries are skipped by the aggregate machinery; `oc`-less (non-orderable)
+--! entries are skipped explicitly (see the @note on this file).
+--!
+--! @param state public.jsonb_entry Running extremum.
+--! @param value public.jsonb_entry Candidate entry.
+--! @return public.jsonb_entry The lesser orderable entry by `ore_cllw`.
+CREATE FUNCTION eql_v3_internal.jsonb_entry_min_sfunc(
+  state public.jsonb_entry,
+  value public.jsonb_entry
+)
+RETURNS public.jsonb_entry
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+  value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value);
+  state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state);
+BEGIN
+  -- A non-orderable (oc-less) candidate never replaces the running extremum.
+  IF value_ore IS NULL THEN
+    RETURN state;
+  END IF;
+  -- Adopt the candidate when the running extremum is itself non-orderable
+  -- (e.g. an oc-less STRICT seed) or strictly greater.
+  IF state_ore IS NULL OR value_ore < state_ore THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate over public.jsonb_entry.
+--! @param input public.jsonb_entry
+--! @return public.jsonb_entry The entry with the smallest CLLW ORE term.
+CREATE AGGREGATE eql_v3.min(public.jsonb_entry) (
+  sfunc = eql_v3_internal.jsonb_entry_min_sfunc,
+  stype = public.jsonb_entry,
+  combinefunc = eql_v3_internal.jsonb_entry_min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.jsonb_entry.
+--!
+--! Keeps whichever orderable entry has the greater CLLW ORE term. `oc`-less
+--! entries are skipped, mirroring `jsonb_entry_min_sfunc` (see the file @note).
+--!
+--! @param state public.jsonb_entry Running extremum.
+--! @param value public.jsonb_entry Candidate entry.
+--! @return public.jsonb_entry The greater orderable entry by `ore_cllw`.
+CREATE FUNCTION eql_v3_internal.jsonb_entry_max_sfunc(
+  state public.jsonb_entry,
+  value public.jsonb_entry
+)
+RETURNS public.jsonb_entry
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+  value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value);
+  state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state);
+BEGIN
+  -- A non-orderable (oc-less) candidate never replaces the running extremum.
+  IF value_ore IS NULL THEN
+    RETURN state;
+  END IF;
+  -- Adopt the candidate when the running extremum is itself non-orderable
+  -- (e.g. an oc-less STRICT seed) or strictly lesser.
+  IF state_ore IS NULL OR value_ore > state_ore THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate over public.jsonb_entry.
+--! @param input public.jsonb_entry
+--! @return public.jsonb_entry The entry with the largest CLLW ORE term.
+CREATE AGGREGATE eql_v3.max(public.jsonb_entry) (
+  sfunc = eql_v3_internal.jsonb_entry_max_sfunc,
+  stype = public.jsonb_entry,
+  combinefunc = eql_v3_internal.jsonb_entry_max_sfunc,
+  parallel = safe
+);
+
+--! @file v3/jsonb/operators.sql
+--! @brief Operators on public.json and public.jsonb_entry.
+
+------------------------------------------------------------------------------
+-- -> field accessor (returns jsonb_entry)
+------------------------------------------------------------------------------
+
+--! @brief -> operator with text selector.
+--!
+--! Returns the sv entry whose `s` equals @p selector, with root `i`/`v` merged
+--! in. Inlinable: `WHERE col -> 'sel' = $1` reduces structurally to
+--! `eql_v3.eq_term(col -> 'sel') = eql_v3.eq_term($1)` and matches a functional
+--! index on `eql_v3.eq_term(col -> 'sel')`.
+--!
+--! @warning The selector operand MUST carry a known type — a text-typed
+--!   parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::text`).
+--!   A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> text`
+--!   operator and silently returns native jsonb semantics (a root-key lookup,
+--!   typically NULL), NOT this operator: PostgreSQL reduces the `public.json`
+--!   domain to its base type `jsonb` when resolving an unknown-typed RHS, and the
+--!   native base-type operator wins the exact-match tiebreak. This is intrinsic to
+--!   the domain type-kind and applies to the native-jsonb blockers too. See
+--!   the "Typed operands" caveat in docs/reference/json-support.md.
+--!
+--! @param e public.json Root encrypted payload.
+--! @param selector text Selector hash.
+--! @return public.jsonb_entry Matching entry merged with root meta, or NULL.
+CREATE FUNCTION eql_v3."->"(e public.json, selector text)
+  RETURNS public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (
+    eql_v3.meta_data(e) ||
+    jsonb_path_query_first(
+      e,
+      '$.sv[*] ? (@.s == $sel)'::jsonpath,
+      jsonb_build_object('sel', selector)
+    )
+  )::public.jsonb_entry
+$$;
+
+CREATE OPERATOR ->(
+  FUNCTION=eql_v3."->",
+  LEFTARG=public.json,
+  RIGHTARG=text
+);
+
+--! @brief -> operator with integer array index (0-based, JSONB convention).
+--! @param e public.json Encrypted sv-array payload.
+--! @param selector integer Array index.
+--! @return public.jsonb_entry Matching entry merged with root meta, or NULL.
+CREATE FUNCTION eql_v3."->"(e public.json, selector integer)
+  RETURNS public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE
+    WHEN eql_v3_internal.is_ste_vec_array(e) THEN
+      -- NOTE: `e::jsonb` makes the native-jsonb traversal explicit. `'sv'` is an
+      -- unknown-typed literal, so `e -> 'sv'` already flattens `public.json` to
+      -- its base type and binds native `jsonb -> text` (see the @warning above) —
+      -- the custom `->(public.json, text)` operator does NOT capture a bare
+      -- untyped literal. The cast documents that intent and guards the `-> selector`
+      -- (integer) hop from ever resolving to the v3 `->(public.json, integer)`
+      -- operator instead of native array access.
+      (eql_v3.meta_data(e) || (e::jsonb -> 'sv' -> selector))::public.jsonb_entry
+    ELSE NULL
+  END
+$$;
+
+CREATE OPERATOR ->(
+  FUNCTION=eql_v3."->",
+  LEFTARG=public.json,
+  RIGHTARG=integer
+);
+
+------------------------------------------------------------------------------
+-- ->> field accessor (alias of -> coerced to text)
+------------------------------------------------------------------------------
+
+--! @brief ->> operator with text selector. Inlinable alias of -> coerced to
+--!        text.
+--!
+--! Intentional v2 parity: this serializes the entire matched jsonb_entry
+--! object as JSON text. It does not decrypt or return scalar plaintext like
+--! native `jsonb ->>`.
+--! @param e public.json Encrypted payload.
+--! @param selector text Field selector hash.
+--! @return text The matching entry as text.
+CREATE FUNCTION eql_v3."->>"(e public.json, selector text)
+  RETURNS text
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."->"(e, selector)::jsonb::text
+$$;
+
+CREATE OPERATOR ->> (
+  FUNCTION=eql_v3."->>",
+  LEFTARG=public.json,
+  RIGHTARG=text
+);
+
+--! @brief ->> operator with integer array index. Inlinable alias of
+--!        ->(json, integer) coerced to text.
+--! @param e public.json Encrypted sv-array payload.
+--! @param selector integer Array index.
+--! @return text The matching entry as text.
+CREATE FUNCTION eql_v3."->>"(e public.json, selector integer)
+  RETURNS text
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."->"(e, selector)::jsonb::text
+$$;
+
+CREATE OPERATOR ->> (
+  FUNCTION=eql_v3."->>",
+  LEFTARG=public.json,
+  RIGHTARG=integer
+);
+
+------------------------------------------------------------------------------
+-- @> containment
+------------------------------------------------------------------------------
+
+--! @brief @> contains operator (document, document).
+--! @param a public.json Container.
+--! @param b public.json Contained value.
+--! @return boolean True if a contains b.
+--! @see eql_v3.ste_vec_contains
+CREATE FUNCTION eql_v3."@>"(a public.json, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ste_vec_contains(a, b)
+$$;
+
+CREATE OPERATOR @>(
+  FUNCTION=eql_v3."@>",
+  LEFTARG=public.json,
+  RIGHTARG=public.json
+);
+
+--! @brief @> contains operator with an query_jsonb needle.
+--!
+--! Inlines to native `jsonb @>` over `eql_v3.to_ste_vec_query(a)::jsonb`, so a
+--! functional GIN index on the same expression engages.
+--!
+--! @param a public.json Container.
+--! @param b eql_v3.query_jsonb Query payload.
+--! @return boolean True if a contains b.
+CREATE FUNCTION eql_v3."@>"(a public.json, b eql_v3.query_jsonb)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.to_ste_vec_query(a)::jsonb @> b::jsonb
+$$;
+
+CREATE OPERATOR @>(
+  FUNCTION=eql_v3."@>",
+  LEFTARG=public.json,
+  RIGHTARG=eql_v3.query_jsonb
+);
+
+--! @brief @> contains operator with a single jsonb_entry needle.
+--!
+--! Wraps the entry into a single-element sv array (stripping `c`) and reduces
+--! to the same `to_ste_vec_query(a)::jsonb @> needle::jsonb` form.
+--!
+--! @param a public.json Container.
+--! @param b public.jsonb_entry Single entry.
+--! @return boolean True if a contains an sv entry matching b.
+CREATE FUNCTION eql_v3."@>"(a public.json, b public.jsonb_entry)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.to_ste_vec_query(a)::jsonb
+       @> jsonb_build_object(
+            'sv',
+            jsonb_build_array(
+              jsonb_strip_nulls(
+                jsonb_build_object(
+                  's',  b -> 's',
+                  'hm', b -> 'hm',
+                  'oc', b -> 'oc'
+                )
+              )
+            )
+          )
+$$;
+
+CREATE OPERATOR @>(
+  FUNCTION=eql_v3."@>",
+  LEFTARG=public.json,
+  RIGHTARG=public.jsonb_entry
+);
+
+------------------------------------------------------------------------------
+-- <@ contained-by (reverse of @>)
+------------------------------------------------------------------------------
+
+--! @brief <@ contained-by operator (document, document).
+--! @param a public.json Contained value.
+--! @param b public.json Container.
+--! @return boolean True if a is contained by b.
+CREATE FUNCTION eql_v3."<@"(a public.json, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ste_vec_contains(b, a)
+$$;
+
+CREATE OPERATOR <@(
+  FUNCTION=eql_v3."<@",
+  LEFTARG=public.json,
+  RIGHTARG=public.json
+);
+
+--! @brief <@ contained-by operator with an query_jsonb LHS.
+--! @param a eql_v3.query_jsonb Query payload.
+--! @param b public.json Container.
+--! @return boolean True if b contains a.
+CREATE FUNCTION eql_v3."<@"(a eql_v3.query_jsonb, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."@>"(b, a)
+$$;
+
+CREATE OPERATOR <@(
+  FUNCTION=eql_v3."<@",
+  LEFTARG=eql_v3.query_jsonb,
+  RIGHTARG=public.json
+);
+
+--! @brief <@ contained-by operator with a jsonb_entry LHS.
+--! @param a public.jsonb_entry Single entry.
+--! @param b public.json Container.
+--! @return boolean True if b contains a.
+CREATE FUNCTION eql_v3."<@"(a public.jsonb_entry, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."@>"(b, a)
+$$;
+
+CREATE OPERATOR <@(
+  FUNCTION=eql_v3."<@",
+  LEFTARG=public.jsonb_entry,
+  RIGHTARG=public.json
+);
+
+------------------------------------------------------------------------------
+-- jsonb_entry comparisons
+------------------------------------------------------------------------------
+
+--! @brief Equality on jsonb_entry via eq_term (hm-or-oc byte equality).
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if the entries are equal
+CREATE FUNCTION eql_v3.eq(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b)
+$$;
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = =,
+  NEGATOR  = <>,
+  RESTRICT = eqsel,
+  JOIN     = eqjoinsel
+);
+
+--! @brief Inequality on jsonb_entry via eq_term.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if the entries are not equal
+CREATE FUNCTION eql_v3.neq(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b)
+$$;
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = <>,
+  NEGATOR  = =,
+  RESTRICT = neqsel,
+  JOIN     = neqjoinsel
+);
+
+--! @brief Less-than on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is less than b
+CREATE FUNCTION eql_v3.lt(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) < eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = >,
+  NEGATOR  = >=,
+  RESTRICT = scalarltsel,
+  JOIN     = scalarltjoinsel
+);
+
+--! @brief Less-than-or-equal on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is less than or equal to b
+CREATE FUNCTION eql_v3.lte(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) <= eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = >=,
+  NEGATOR  = >,
+  RESTRICT = scalarlesel,
+  JOIN     = scalarlejoinsel
+);
+
+--! @brief Greater-than on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is greater than b
+CREATE FUNCTION eql_v3.gt(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) > eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = <,
+  NEGATOR  = <=,
+  RESTRICT = scalargtsel,
+  JOIN     = scalargtjoinsel
+);
+
+--! @brief Greater-than-or-equal on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is greater than or equal to b
+CREATE FUNCTION eql_v3.gte(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) >= eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = <=,
+  NEGATOR  = <,
+  RESTRICT = scalargesel,
+  JOIN     = scalargejoinsel
+);
+
+--! @file v3/jsonb/blockers.sql
+--! @brief Native-jsonb firewall for public.json.
+--!
+--! public.json SUPPORTS @> <@ -> ->> (see operators.sql). Comparisons
+--! = <> < <= > >= are supported on public.jsonb_entry only, not on the root
+--! document domain.
+--! Every OTHER native jsonb operator reachable via domain fallback against the
+--! base type jsonb is BLOCKED here so an encrypted column can never silently
+--! route to plaintext-jsonb semantics. The blocked set is KNOWN_JSONB_OPERATORS
+--! minus the supported ops: ? ?| ?& @? @@ #> #>> - #- ||.
+--!
+--! Each blocker is LANGUAGE plpgsql (NEVER STRICT — a STRICT blocker would let
+--! PostgreSQL skip the body and return NULL on a NULL argument, bypassing the
+--! exception) and delegates to the shared eql_v3.encrypted_domain_unsupported_*
+--! helpers. Each blocker's RETURNS type matches the native operator it shadows
+--! (#> -> jsonb, #>> -> text, - / #- / || -> jsonb; the rest are boolean) so a
+--! composed expression resolves and the body raises 'operator not supported',
+--! rather than failing earlier with a misleading 'operator does not exist' on a
+--! boolean intermediate. The bound operator must resolve before native fallback,
+--! so the firewall fires.
+
+--! @brief Blocker: ? (key/element exists).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_exists(a public.json, b text)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '?');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal.jsonb_blocked_exists,
+  LEFTARG = public.json,
+  RIGHTARG = text
+);
+
+--! @brief Blocker: ?| (any key exists).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_exists_any(a public.json, b text[])
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '?|');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal.jsonb_blocked_exists_any,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: ?& (all keys exist).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_exists_all(a public.json, b text[])
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '?&');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal.jsonb_blocked_exists_all,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: @? (jsonpath exists).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonpath Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_jsonpath_exists(a public.json, b jsonpath)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@?');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal.jsonb_blocked_jsonpath_exists,
+  LEFTARG = public.json,
+  RIGHTARG = jsonpath
+);
+
+--! @brief Blocker: @@ (jsonpath predicate).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonpath Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_jsonpath_match(a public.json, b jsonpath)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@@');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal.jsonb_blocked_jsonpath_match,
+  LEFTARG = public.json,
+  RIGHTARG = jsonpath
+);
+
+--! @brief Blocker: #> (path extract, native returns jsonb).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_path_extract(a public.json, b text[])
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '#>');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_path_extract,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: #>> (path extract as text).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return text Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_path_extract_text(a public.json, b text[])
+RETURNS text
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_text('public.json', '#>>');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_path_extract_text,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: - (delete key, text RHS; native returns jsonb).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_text(a public.json, b text)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_text,
+  LEFTARG = public.json,
+  RIGHTARG = text
+);
+
+--! @brief Blocker: - (delete index, integer RHS).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b integer Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_int(a public.json, b integer)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_int,
+  LEFTARG = public.json,
+  RIGHTARG = integer
+);
+
+--! @brief Blocker: - (delete keys, text[] RHS).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_array(a public.json, b text[])
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_array,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: #- (delete at path).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_path(a public.json, b text[])
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '#-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_path,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: || (concatenate, encrypted on the left).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_concat(a public.json, b jsonb)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '||');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal.jsonb_blocked_concat,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+--! @brief Blocker: || (concatenate, encrypted on the right).
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_concat_rhs(a jsonb, b public.json)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '||');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal.jsonb_blocked_concat_rhs,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+------------------------------------------------------------------------------
+-- Root-document comparison blockers.
+------------------------------------------------------------------------------
+
+--! @brief Blocker: root public.json document comparisons.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_compare_json_json(a public.json, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', 'comparison');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: root public.json-to-jsonb comparisons.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_compare_json_jsonb(a public.json, b jsonb)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', 'comparison');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: root jsonb-to-public.json comparisons.
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_compare_jsonb_json(a jsonb, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', 'comparison');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+------------------------------------------------------------------------------
+-- Mixed jsonb containment blockers.
+------------------------------------------------------------------------------
+
+--! @brief Blocker: @> with encrypted root document and native jsonb.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contains_json_jsonb(a public.json, b jsonb)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@>');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: @> with native jsonb and encrypted root document.
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contains_jsonb_json(a jsonb, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@>');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: <@ with encrypted root document and native jsonb.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contained_json_jsonb(a public.json, b jsonb)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '<@');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: <@ with native jsonb and encrypted root document.
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contained_jsonb_json(a jsonb, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '<@');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contains_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contains_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contained_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contained_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+--! @file pin_search_path_v3.sql
+--! @brief Post-install: pin search_path on every eql_v3.* function.
+--!
+--! Appended verbatim by `tasks/build.sh` to the end of the v3-only release
+--! artifact, AFTER all src/v3/**/*.sql files have been concatenated. It lives
+--! outside src/ so it stays out of the dependency graph.
+--!
+--! Iterates over functions in the `eql_v3` and `eql_v3_internal` schemas and
+--! applies a fixed `search_path` via `ALTER FUNCTION ... SET search_path = ...`,
+--! satisfying Supabase splinter's `function_search_path_mutable` lint.
+--!
+--! @note A SET clause disables SQL-function inlining. The inline-critical SEM
+--!       helpers (ore_block_256_*, ore_cllw_*, ore_cllw/has_ore_cllw,
+--!       ope_cllw, hmac_256, bloom_filter over jsonb) and the
+--!       encrypted-domain family (recognised structurally, including public
+--!       user-column domains) are deliberately left unpinned.
+--! @see tasks/test/splinter.sh
+--! @see tasks/build.sh
+
+DO $$
+DECLARE
+  fn_oid oid;
+  inline_critical_oids oid[];
+  jsonb_oid oid;
+BEGIN
+  SELECT t.oid INTO jsonb_oid
+  FROM pg_catalog.pg_type t
+  JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
+  WHERE n.nspname = 'pg_catalog' AND t.typname = 'jsonb';
+
+  IF jsonb_oid IS NULL THEN
+    RAISE EXCEPTION 'pin_search_path_v3: type pg_catalog.jsonb not found';
+  END IF;
+
+  -- eql_v3 SEM index-term functions that must stay inlinable for
+  -- functional-index matching (no SET, IMMUTABLE). Mirrors the eql_v3 clause
+  -- in the legacy combined pin_search_path.sql.
+  SELECT pg_catalog.array_agg(p.oid) INTO inline_critical_oids
+  FROM pg_catalog.pg_proc p
+  JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
+  WHERE n.nspname = ANY(eql_v3_internal.owned_schemas())
+    AND (
+      (p.pronargs = 2
+        AND p.proname IN ('ore_block_256_eq', 'ore_block_256_neq',
+                          'ore_block_256_lt', 'ore_block_256_lte',
+                          'ore_block_256_gt', 'ore_block_256_gte'))
+      OR (p.pronargs = 2
+        AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq',
+                          'ore_cllw_lt', 'ore_cllw_lte',
+                          'ore_cllw_gt', 'ore_cllw_gte'))
+      OR (p.pronargs = 1
+        AND p.proname IN ('ore_cllw', 'has_ore_cllw')
+        AND p.proargtypes[0] = jsonb_oid)
+      -- The CLLW-OPE surface is the extractor alone: eql_v3_internal.ope_cllw is a
+      -- domain over bytea (native comparison operators and btree opclass),
+      -- so there are no ope-specific comparison functions to keep inlinable.
+      OR (p.pronargs = 1
+        AND p.proname = 'ope_cllw'
+        AND p.proargtypes[0] = jsonb_oid)
+      OR (p.pronargs = 1
+        AND p.proname = 'hmac_256'
+        AND p.proargtypes[0] = jsonb_oid)
+      OR (p.pronargs = 1
+        AND p.proname = 'bloom_filter'
+        AND p.proargtypes[0] = jsonb_oid)
+    );
+
+  FOR fn_oid IN
+    SELECT p.oid
+    FROM pg_catalog.pg_proc p
+    JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
+    WHERE n.nspname = ANY(eql_v3_internal.owned_schemas())
+      AND p.prokind IN ('f', 'w')
+      AND NOT EXISTS (
+        SELECT 1 FROM pg_catalog.unnest(coalesce(p.proconfig, '{}'::text[])) c
+        WHERE c LIKE 'search_path=%'
+      )
+      AND NOT (p.oid = ANY (coalesce(inline_critical_oids, '{}'::oid[])))
+      -- Encrypted-domain family — structural skip: LANGUAGE sql, IMMUTABLE,
+      -- taking >=1 argument typed as a jsonb-backed DOMAIN. User-column
+      -- domains live in public; implementation-only domains live in EQL-owned
+      -- schemas.
+      AND NOT (
+        p.prolang = (SELECT l.oid FROM pg_catalog.pg_language l
+                     WHERE l.lanname = 'sql')
+        AND p.provolatile = 'i'
+        AND EXISTS (
+          SELECT 1
+          FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ)
+          JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ
+          JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace
+          WHERE dt.typtype = 'd'
+            AND dt.typbasetype = jsonb_oid
+            AND (
+              dn.nspname = 'public'
+              OR dn.nspname = ANY(eql_v3_internal.owned_schemas())
+            )
+        )
+      )
+      -- Comment-marker fallback for hand-written inline-critical extension
+      -- functions that take no domain argument.
+      AND NOT EXISTS (
+        SELECT 1 FROM pg_catalog.pg_description d
+        WHERE d.objoid = p.oid
+          AND d.classoid = 'pg_catalog.pg_proc'::regclass
+          AND d.description LIKE 'eql-inline-critical%'
+      )
+  LOOP
+    EXECUTE pg_catalog.format(
+      'ALTER FUNCTION %s SET search_path = pg_catalog, extensions, public',
+      fn_oid::regprocedure
+    );
+  END LOOP;
+END $$;
diff --git a/crates/eql-bindings/sql/release-manifest.json b/crates/eql-bindings/sql/release-manifest.json
index f25e4219f..34cad1950 100644
--- a/crates/eql-bindings/sql/release-manifest.json
+++ b/crates/eql-bindings/sql/release-manifest.json
@@ -1,6 +1,6 @@
 {
-  "eqlVersion": "DEV",
+  "eqlVersion": "3.0.0-alpha.3",
   "schemaVersion": 3,
-  "installSqlSha256": "",
-  "uninstallSqlSha256": ""
+  "installSqlSha256": "ec7af1b334cd9ba2d6356bcb3eec41a4db5bfc6e39108de74484134aa90b7929",
+  "uninstallSqlSha256": "b1b5131b8175c5d04da9ada108d25c81c5772b15fad79a6c419ebb32d18c60a9"
 }
diff --git a/packages/eql/CHANGELOG.md b/packages/eql/CHANGELOG.md
new file mode 100644
index 000000000..1bd58b28a
--- /dev/null
+++ b/packages/eql/CHANGELOG.md
@@ -0,0 +1,49 @@
+# @cipherstash/eql
+
+## 3.0.0-alpha.3
+
+### Major Changes
+
+- b8d796b: **The `eql_v3` tier's JSON envelope version is now `v: 3` (was `v: 2`).** Every `eql_v3` domain CHECK — the generated scalar families and the hand-written `eql_v3.json` SteVec document domain — now pins `VALUE->>'v' = '3'`, and the canonical payload bindings (`SchemaVersion` in `eql-bindings`, the emitted TypeScript alias, and the JSON Schema `const`) accept exactly `3`, rejecting the legacy `2` at the type boundary. The v3 tier previously carried the v2 wire version for continuity; with the tier now diverging from the legacy wire (the new `op` term), the envelope version matches the schema generation. The legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json` and its validation tests) is unchanged and stays `v: 2`. **Compatibility:** payloads produced for the v3 tier must now carry `v: 3` — a cipherstash-client that emits `v: 2` cannot insert into `eql_v3` domain columns until it is updated to emit the v3 envelope. See [U-001](docs/upgrading/v3.0.md#u-001-eql_v3-payloads-carry-v-3) in the 3.0 upgrade guide. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340))
+- b8d796b: **Internal `eql_v3` index-term types and plumbing moved to a new `eql_v3_internal` schema; `eql_v3` stays the public API — including a callable function equivalent for every operator.** `eql_v3_internal` holds INTERNAL objects only: the SEM index-term **types** (`hmac_256`, `bloom_filter`, `ore_block_256`(+`_term`), `ore_cllw`) and their support functions/operators/opclasses, the generated unsupported-operator **blockers** and the shared `encrypted_domain_unsupported_*` / `jsonb_blocked_*` helpers, the **aggregate state functions**, and the encrypted-JSONB CHECK validators + `jsonb_array_to_bytea_array`. `eql_v3` keeps the full public surface: the column-type domains (all scalar families + `eql_v3.json` / `eql_v3.jsonb_entry` / `eql_v3.jsonb_query`), query operators, index extractors (`eq_term` / `ord_term` / `match_term` and the jsonb access functions), `min` / `max` aggregates, the `json → jsonb_query` cast, `version()`, `lints()`, **and — crucially — the operator-backing comparison wrappers** (`eq`/`neq`/`lt`/`lte`/`gt`/`gte`/`contains`/`contained_by`) plus the jsonb containment helpers (`jsonb_contains`/`jsonb_contained_by`/`jsonb_array`/`ste_vec_contains`). Why the wrappers stay public: they are the function-form equivalent of every supported operator, and not every platform can invoke custom operators — Supabase/PostgREST exposes the database through an auto-generated REST/RPC layer that calls **functions**, not operators (`WHERE col = $1` is not expressible there, but `eql_v3.eq(col, $1)` is). Only index-term-only TYPES need to be hidden (Supabase Studio's Table Builder type picker lists every type in every non-hidden schema); the callable wrappers do not, so they remain public. A new gate, `tests/sqlx/tests/v3_operator_equivalents_tests.rs`, fails CI if any supported operator's backing wrapper is hidden in `eql_v3_internal`. **Design decision — EQL never grants permissions automatically.** The installer issues no `GRANT`/`REVOKE`; access to `eql_v3` (and, where a public operator/aggregate dispatches into it, `eql_v3_internal`) is strictly opt-in — a deployment grants `USAGE` / `EXECUTE` deliberately (see [`docs/reference/permissions.md`](docs/reference/permissions.md)). This is a breaking schema-layout change for existing installs: audit each runtime role's grants against `docs/reference/permissions.md`.
+- b8d796b: **The self-contained `eql_v3` installer is now the sole release artifact, shipped under the canonical name `release/cipherstash-encrypt.sql` (+ `cipherstash-encrypt-uninstall.sql`).** The combined, Supabase, and Protect build variants are removed; `mise run build` now produces only the `eql_v3` surface, written under the canonical name that the combined build previously used — so existing install URLs keep working. Why: with `eql_v2` removed (see below), there is a single SQL surface to build, install, and test.
+- b8d796b: **The `eql_v2` schema and its entire surface are removed — EQL now ships only the self-contained `eql_v3` encrypted-domain surface.** Dropped with no `eql_v3` replacement: the `eql_v2_encrypted` composite column type and its operators (`=`, `<>`, `~~`/`~~*` `LIKE`/`ILIKE`, containment `@>`/`<@`, ORE comparisons), database-side configuration management (`eql_v2_configuration`, `add_search_config`, `add_column`, `migrate_config`, `diff_config`, `create_encrypted_columns`), the `encryptindex` migration machinery, boolean operators on the encrypted column type, operator-class-on-column indexing, and `GROUP BY` / `grouped_value` on the encrypted column type. Searchable-encryption capabilities (equality, ordered range, `MIN`/`MAX`, encrypted-JSONB document containment and path access) are all provided by the `eql_v3` encrypted-domain families and document surface. Why: `eql_v3` is now fully self-contained — it owns its own SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_block_256`, `eql_v3.ore_cllw`, `eql_v3.bloom_filter`) and installs into a database with no `eql_v2` present — and the encryption client (CipherStash Proxy / ProtectJS) now owns the configuration model the database-side `eql_v2` functions previously provided. This is a major (3.0.0) public-API break; callers using the `eql_v2` schema migrate to the `eql_v3` encrypted-domain types. The user-facing reference documentation and tutorials have been migrated to teach only the `eql_v3` surface — the `eql_v2`-based examples, the database-side configuration guide, and the operator-class-on-column indexing recipe are removed. No per-capability migration guide is provided for the dropped capabilities (they have no `eql_v3` equivalent).
+
+### Minor Changes
+
+- b8d796b: **Per-domain `MIN` / `MAX` aggregates for the encrypted-domain family.** `eql_v3.min(eql_v3._ord)` / `eql_v3.max(eql_v3._ord)` (and the `_ord_ore` twin) are generated for every ord-capable scalar variant, giving type-safe extrema on domain-typed columns — comparison routes through the variant's `<` / `>` operator (ORE block term, no decryption). The aggregates are declared `PARALLEL = SAFE` with a combine function (the state function itself — min/max are associative), so PostgreSQL can use partial/parallel aggregation on large `GROUP BY` workloads. Why: the new domain types previously had no equivalent of the composite-type aggregates. The existing `eql_v2.min(eql_v2_encrypted)` / `eql_v2.max(eql_v2_encrypted)` aggregates are **retained** and continue to work on `eql_v2_encrypted` columns; the per-domain aggregates are additive and coexist with them. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239))
+- b8d796b: **`eql_v3` encrypted-domain schema, with the `integer` family as its first member.** Encrypted-domain type families now live in a new, additional `eql_v3` schema (the existing `eql_v2` schema is unchanged — it keeps the core types/operators and stays the documented public API). Four jsonb-backed domains for encrypted `integer` columns: `eql_v3.integer` (storage-only), `eql_v3.integer_eq` (`=` / `<>` via HMAC), and `eql_v3.integer_ord` / `eql_v3.integer_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms). Supported comparisons resolve to inlinable wrappers; the native `jsonb` operator surface reachable through domain fallback is blocked (raises rather than silently mis-resolving). Each domain's `CHECK` requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and the variant's index term(s), and pins the payload version (`VALUE->>'v' = '2'`, matching `eql_v2._encrypted_check_v`) — so a missing key or wrong-version payload is rejected on insert or cast rather than surfacing later at query time. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. The extractors return the searchable-encrypted-metadata index-term types `eql_v3.hmac_256` / `eql_v3.ore_block_256`, which `eql_v3` owns directly (see the self-contained `eql_v3` schema entry below). Why: a type-safe, per-capability encrypted integer column instead of the untyped `eql_v2_encrypted`, namespaced under its own schema. This is the reference scalar implementation for the generated domain family. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239), supersedes [#225](https://github.com/cipherstash/encrypt-query-language/pull/225))
+- b8d796b: **`eql_v3.numeric` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `numeric` / `decimal` columns — `eql_v3.numeric` (storage-only), `eql_v3.numeric_eq` (`=` / `<>` via HMAC), and `eql_v3.numeric_ord` / `eql_v3.numeric_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 14-block ORE) — generated from the `numeric` row in `eql-scalars::CATALOG`. cipherstash encrypts `Plaintext::Decimal` at native 14-block ORE width; ordering matches `rust_decimal::Decimal` ordering exactly (equivalent scales such as `1` and `1.0` collide, like Postgres `numeric`). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors. Why: a type-safe, ordered encrypted decimal column, the first scalar to exercise an ORE term wider than 8 blocks. ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276))
+- b8d796b: **`eql_v3.smallint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `smallint` columns — `eql_v3.smallint` (storage-only), `eql_v3.smallint_eq` (`=` / `<>` via HMAC), and `eql_v3.smallint_ord` / `eql_v3.smallint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `smallint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `smallint` column, proving the scalar generator generalizes beyond the `integer` reference. ([#243](https://github.com/cipherstash/encrypt-query-language/pull/243))
+- b8d796b: **Scalar encrypted-domain types are now defined in a Rust catalog, not TOML manifests; the Python codegen toolchain is removed.** Adding a scalar encrypted-domain type (`integer`, `bigint`, …) is now one row in `eql-scalars::CATALOG` (`crates/eql-scalars/src/lib.rs`) instead of authoring `tasks/codegen/types/.toml`. `mise run build` regenerates the gitignored SQL surface via `cargo run -p eql-codegen` (Rust, std-only) rather than the Python generator. The catalog row's `Fixture` list is the single source of truth for that type's plaintext fixtures: the SQLx test matrix reads it directly as a compile-time-materialised const (`eql_scalars::INT4_VALUES` / `INT2_VALUES`, `ScalarType::FIXTURE_VALUES`), so there is no longer a generated, committed `tests/sqlx/src/fixtures/_values.rs` — a Rust source of truth no longer round-trips through generated Rust. The shipped SQL is unchanged — `release/*.sql` is byte-identical across the cutover — so there is no change for callers installing EQL; this only affects contributors who extend the scalar domain families. The `python` mise tool, the `pytest`-based `test:codegen` (now `cargo test -p eql-scalars -p eql-codegen`), the per-type `mise run codegen:domain` tasks, and the per-type `tests/sqlx/snapshots/_matrix_tests.txt` baselines (collapsed into one catalog-reconciled `tests/sqlx/snapshots/matrix_tests.txt`) are gone. Why: a single compiler-validated source of truth shared by the generator and the SQLx test harness, and one fewer toolchain in the build/test path — building and testing EQL no longer needs Python (Python remains only for the separate docs-markdown tooling). ([#252](https://github.com/cipherstash/encrypt-query-language/pull/252))
+- b8d796b: **`eql_v3.bigint` encrypted-domain type family.** Four jsonb-backed domains for encrypted `bigint` columns — `eql_v3.bigint` (storage-only), `eql_v3.bigint_eq` (`=` / `<>` via HMAC), and `eql_v3.bigint_ord` / `eql_v3.bigint_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `bigint` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted `bigint` column, extending the scalar generator across the full 64-bit integer width. ([#253](https://github.com/cipherstash/encrypt-query-language/pull/253))
+- b8d796b: **Self-contained `eql_v3` schema + standalone `release/cipherstash-encrypt.sql` installer.** The `eql_v3` encrypted-domain surface no longer depends on `eql_v2` at runtime: it now owns its own copies of the searchable-encrypted-metadata (SEM) index-term types — `eql_v3.hmac_256` and `eql_v3.ore_block_256` (with its btree operator class) — so the `eql_v3.eq_term` / `eql_v3.ord_term` extractors return `eql_v3` types and no `eql_v2.` appears anywhere in the v3 SQL. The whole v3 surface relocated under a single `src/v3/` tree (`src/v3/sem/` for the hand-written SEM types, `src/v3/scalars/` for the generated domain families). A new build variant ships the `eql_v3` schema on its own as `release/cipherstash-encrypt.sql`, installable into a database with no `eql_v2` present; a CI gate greps that artifact and its dependency closure to keep it `eql_v2`-free. Why: a clean foundation for the per-scalar encrypted-domain model to stand alone, ahead of it replacing the `eql_v2_encrypted` composite column type. This is additive — a new schema and a new artifact — and leaves `eql_v2` byte-for-byte unchanged. ([#255](https://github.com/cipherstash/encrypt-query-language/pull/255))
+- b8d796b: **`eql_v3.date` encrypted-domain type family.** Four jsonb-backed domains for encrypted `date` columns — `eql_v3.date` (storage-only), `eql_v3.date_eq` (`=` / `<>` via HMAC), and `eql_v3.date_ord` / `eql_v3.date_ord_ore` (also `<` `<=` `>` `>=` via ORE block terms, with `MIN` / `MAX` aggregates) — generated from the `date` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Plaintexts encrypt under the `date` cast and compare via the same ORE block terms as the integer scalars (ORE is plaintext-agnostic — dates order like integers). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: the first **non-integer ordered** scalar encrypted-domain type — a type-safe, per-capability encrypted `date` column — proving the generator and SQLx test matrix generalize beyond fixed-width integers. ([#256](https://github.com/cipherstash/encrypt-query-language/pull/256))
+- b8d796b: **`eql_v3.timestamp` encrypted-domain type family (ordered).** Four jsonb-backed domains for encrypted `timestamp` columns — `eql_v3.timestamp` (storage-only), `eql_v3.timestamp_eq` (`=` / `<>` via HMAC), and `eql_v3.timestamp_ord` / `eql_v3.timestamp_ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 12-block ORE) — generated from the `timestamp` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.date` family. Values are **UTC-normalized** (cipherstash has no timezone-preserving type): plaintexts encrypt under the `timestamp` cast, so the stored value is a UTC instant (Postgres `timestamp with time zone`) wearing the SQL-standard name `timestamp` to match the cipherstash cast / `ColumnType::Timestamp` / `Plaintext::Timestamp` convention. Ordering works because the `eql_v3` ORE block comparator now derives its block count from the ciphertext width (see the comparator entry below) instead of assuming 8. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. ([#257](https://github.com/cipherstash/encrypt-query-language/pull/257))
+- b8d796b: **`eql_v3.text` encrypted-domain family (`text`, `text_eq`, `text_match`, `text_ord`, `text_ord_ore`, `text_search`).** Adds equality (`=` / `<>` via HMAC), match (`@>` / `<@` via a new self-contained `eql_v3.bloom_filter` SEM index term), and ORE ordering (`<` `<=` `>` `>=`, `min` / `max`) for encrypted text, at parity with EQL v2 text — generated from the `text` row in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. `text` is the first scalar to add a new index `Term` (`Bloom`) and the first non-integer, unbounded ordered kind (lexicographic pivots, hand-written `impl ScalarType`). The combined **`text_search`** domain carries all three capabilities in one type — `=` / `<>` via HMAC, `<` `<=` `>` `>=` / `min` / `max` via ORE, and `@>` / `<@` via bloom filter. Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` / `eql_v3.match_term` extractors, not an operator class on the domain. Why: brings searchable encrypted text to the namespaced, `eql_v2`-free `eql_v3` surface. Match is exposed as bloom-filter containment on the `text_match` / `text_search` domains — deliberately _not_ SQL `LIKE` (no wildcard/anchoring; probabilistic ngram containment) — and never backs equality. **Equality on the ordered text domains (`text_ord`, `text_ord_ore`) and on `text_search` always routes `=` / `<>` through `hm` (exact HMAC), never the ORE term — ORE is not exact-equality for text** (integer ordered domains keep exact ORE equality, which is lossless for them). ([#260](https://github.com/cipherstash/encrypt-query-language/pull/260))
+- b8d796b: **`eql_v3.min` / `eql_v3.max` aggregates over `eql_v3.jsonb_entry`.** SteVec document entries extracted at a selector (`doc -> 'sel'`) can now be aggregated like ordered scalars: `eql_v3.min(doc -> 'sel')` / `eql_v3.max(...)` return the entry with the smallest / largest ordered leaf. Ordering routes through the entry's `oc` (CLLW ORE) term via `eql_v3.ore_cllw` — the same comparator the entry `<` / `<=` / `>` / `>=` operators use, not the scalar Block-ORE `ord_term`. Only `oc`-carrying entries are orderable: an entry without an `oc` term (`eql_v3.ore_cllw` returns NULL) is non-orderable and is ignored by the aggregate — the same way the `eql_v3.ore_cllw` btree NULL-filters such rows — so a mix of `oc`-carrying and `oc`-less entries yields the extremum of the orderable subset rather than a corrupted result. Declared `PARALLEL = SAFE` with a combine function (the state function itself), so partial / parallel aggregation is available on large `GROUP BY` workloads. Why: brings encrypted-JSONB entry ordering to parity with the scalar encrypted-domain families' `MIN` / `MAX`, and lets the shared scalar behaviour matrix cover entry aggregation. Additive — the document and entry comparison surface is otherwise unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267))
+- b8d796b: **`eql_v3` encrypted-JSONB (SteVec) document type.** A self-contained encrypted-JSONB surface in the `eql_v3` schema: the storage domain `eql_v3.json` plus `eql_v3.jsonb_entry` (a single sv element) and `eql_v3.jsonb_query` (a containment needle). Encrypted JSON documents are searchable without decryption via document containment (`@>`, `<@`), field/array access (`->`, `->>`, `jsonb_path_query` / `_exists` / `_query_first`, `jsonb_array_length` / `_elements` / `_elements_text`), entry equality (`=`, `<>`) on extracted leaves, and entry-level ordered range (`<`, `<=`, `>`, `>=`) on ordered leaves via CLLW ORE (`eql_v3.ore_cllw`). Comparisons are leaf-level only: root-document `=`, `<>`, `<`, `<=`, `>`, `>=` are blocked (they raise rather than falling through to native whole-`jsonb` comparison). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ore_cllw` extractors (entry equality / ordering) and `eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops` GIN (containment); ordered leaves get a default btree opclass on `eql_v3.ore_cllw`. Every other native `jsonb` operator reachable through domain fallback (`?`, `?|`, `?&`, `@?`, `@@`, `#>`, `#>>`, `-`, `#-`, `||`, and the root comparisons above) is blocked — it raises rather than silently routing to plaintext-jsonb semantics. Note: because `eql_v3.json` is a `jsonb` domain, selector/operand literals must be typed (`col -> 'sel'::text` — the CipherStash Proxy interface passes typed parameters); a _bare untyped_ literal (`col -> 'sel'`) resolves to the native `jsonb` operator instead of the encrypted one (PostgreSQL reduces the domain to its base type for unknown-typed literals), and the same caveat applies to the native-jsonb blockers — see the "Typed operands" caveat in `docs/reference/json-support.md`. The whole surface owns its SEM index-term types (`eql_v3.hmac_256`, `eql_v3.ore_cllw`) and has no `eql_v2` dependency (CI-gated by `test:self_contained_v3` and the standalone `release/cipherstash-encrypt.sql` installer). Why: a type-safe, searchable encrypted JSONB document column namespaced under `eql_v3`, complementing the scalar encrypted-domain families. The existing `eql_v2` SteVec surface on `eql_v2_encrypted` is unchanged. ([#267](https://github.com/cipherstash/encrypt-query-language/pull/267))
+- b8d796b: **Property-based tests for the `eql_v3` encrypted scalar domains.** A harness of three suites asserts SQL operator results agree with a plaintext oracle across a generated input space: a pure-Rust **catalog** suite (no database) over the term/scalar catalog, a **fixture** suite that runs an all-pairs oracle over the committed real-ciphertext fixtures (the curated catalog values per type), and an **e2e** suite (gated behind the `proptest-e2e` cargo feature) that batch-encrypts freshly generated plaintexts end-to-end through ZeroKMS each run. Beyond the operator oracles, the fixture suite drives **function-double** oracles — the generated `eql_v3.eq`/`neq`/`lt`/`lte`/`gt`/`gte` functions across all three overloads (domain–domain, domain–jsonb, jsonb–domain) — plus **term-extractor identity** (`eq_term`==`hm`, `ord_term`==`ob`) and an example-based bloom **match** smoke for the text `_match` domain. Covers the equality (`=`/`<>`) and ordering (`<`/`<=`/`>`/`>=`, `ord_term` sort order) operator and function oracles plus NULL/blocker/CHECK edge cases, across every fixtured scalar (`smallint`/`integer`/`bigint`/`date`/`timestamp`/`numeric`/`text`). Equality across two independent encryptions of one value is exercised credential-free by the fixture suite via committed per-type _doubles_ fixtures (each plaintext encrypted twice — `property::cross_ciphertext`), through both the `hm` (`_eq`) and ORE (`_ord`/`_ord_ore`) equality paths, and additionally by the e2e suite via fresh duplicate plaintexts each run. Why: the prior matrix exercised fixed pivots only; property tests over the whole fixture set catch operator/oracle disagreements across the value space, and the e2e suite adds defence in depth by re-encrypting every run rather than pinning a frozen ciphertext snapshot. ([#293](https://github.com/cipherstash/encrypt-query-language/pull/293))
+- b8d796b: **`eql_v3.boolean` encrypted-domain type family (storage-only / encryption-only).** A single jsonb-backed domain for encrypted `boolean` columns — `eql_v3.boolean` — generated from the `boolean` row in `eql-scalars::CATALOG`. Unlike every other scalar family, `boolean` is **encryption-only**: it carries no SEM index term and exposes **no** `_eq` / `_ord` domains, so the value is encrypted at rest and decrypted by the proxy but is **not searchable server-side**. This is deliberate — a two-value column has so little cardinality that any searchable index (even HMAC equality) would trivially leak the plaintext distribution. Every comparison / containment / path operator reachable through domain fallback (`=`, `<>`, `<`, `<=`, `>`, `>=`, `@>`, `<@`, `->`, `->>`, …) is blocked (raises rather than silently routing to plaintext-`jsonb` semantics); the domain `CHECK` still requires the EQL envelope (`v`, `i`), the ciphertext (`c`), and pins the payload version (`VALUE->>'v' = '2'`). The encrypted payload is `{v,i,c}` only — no `hm` / `ob` / `bf` term. Why: lets callers encrypt a low-cardinality boolean column at rest without offering a server-side search surface that would leak it; the first **storage-only** member of the generated scalar encrypted-domain family. ([#295](https://github.com/cipherstash/encrypt-query-language/pull/295))
+- b8d796b: **`eql_v3.real` / `eql_v3.double` encrypted-domain type families (ordered).** Four jsonb-backed domains each for encrypted `real` / `double precision` columns — `eql_v3.real` / `eql_v3.double` (storage-only), `eql_v3._eq` (`=` / `<>` via HMAC), and `eql_v3._ord` / `eql_v3._ord_ore` (also `<` `<=` `>` `>=`, `MIN` / `MAX` via 8-block ORE) — generated from the `real` / `double` rows in `eql-scalars::CATALOG` by the same materializer as the `eql_v3.integer` reference. Both widths encrypt through a single f64 crypto path (`Plaintext::Float`): a `real` is widened to f64 before encryption (exact and monotonic), so `real` vs `double` is purely a Postgres-surface distinction — the `hm` equality term is byte-identical and the ORE terms compare equal under the `eql_v3.ore_block_256` operator (the ORE term itself is probabilistic — a fresh per-ciphertext nonce — so it is never byte-identical, even same-width; ordering is decided by the ORE comparator, not by raw bytes). Ordering is correct for all non-NaN values via the standard monotonic IEEE-754 byte mapping (`f64::ENCODED_LEN == 8`, same as `bigint`); `-0.0` canonicalizes to `+0.0` and `±Inf` order correctly. NaN is unordered and unspecified in the encoder — it can be encrypted and stored but is not given a meaningful comparison guarantee (any NaN rejection is client-side). Index via a functional index on the `eql_v3.eq_term` / `eql_v3.ord_term` extractors, not an operator class on the domain. Why: a type-safe, per-capability encrypted IEEE-754 float column, closing the gap for `real` / `double` columns that had no v3 equivalent (the v3 `numeric` family is arbitrary-precision decimal, not binary float). ([#299](https://github.com/cipherstash/encrypt-query-language/pull/299))
+- b8d796b: **The standalone `eql_v3` installer and uninstaller (`cipherstash-encrypt.sql`, `cipherstash-encrypt-uninstall.sql`) are now attached to GitHub Releases.** The self-contained `eql_v3` surface was already built by the release pipeline but never published, so it could not be installed from a release. The release workflow now uploads both files as build artifacts and attaches them to the published release, enabling `eql_v3` (alpha) installs straight from a GitHub Release. ([#307](https://github.com/cipherstash/encrypt-query-language/pull/307))
+- b8d796b: **`eql_v3` encrypted-JSONB (SteVec) payload bindings — Rust, TypeScript, and JSON Schema.** JSONB is now a first-class member of `eql-domains::CATALOG`, so its payload types ship as canonical, drift-gated bindings alongside the scalar families: `SteVecDocument` (`eql_v3.json`), `SteVecEntry` (`eql_v3.jsonb_entry`), `SteVecQuery` (`eql_v3.jsonb_query`), plus the shared untagged `SteVecTerm` (`{hm} | {oc}`), `SteVecQueryEntry`, and the `OreCllw` / `Selector` term newtypes — under `crates/eql-bindings/src/v3/jsonb.rs`, `bindings/v3/*.ts`, and `schema/v3/*.json`, drift-gated by `types:check`. A new `Shape` discriminant on each catalog domain lets scalar-only consumers filter and all-family consumers branch; the SteVec struct bodies and the encrypted-JSONB SQL surface stay hand-written (the generator skips SteVec shapes but still drives the bindings inventory). The bindings are parsed against a real generated SteVec ciphertext row in the SQLx suite, tying them to real crypto and the SQL domain CHECK. Why: the SteVec wire types were the only `eql_v3` payloads without generated, drift-gated bindings — protocol consumers (`cipherstash-client`, `protect-ffi`, CipherStash Proxy) can now depend on canonical, catalog-checked encrypted-JSONB types. ([#336](https://github.com/cipherstash/encrypt-query-language/pull/336))
+- b8d796b: **`eql_v3._ord_ope` encrypted-domain variants — CLLW-OPE ordering across every ordered scalar family.** Every ordered scalar family (`int2`, `int4`, `int8`, `date`, `timestamp`, `numeric`, `text`, `float4`, `float8`) gains an `_ord_ope` domain backed by a new CLLW-OPE index term: the `op` payload key carries a hex-encoded OPE ciphertext that is order-preserving under plain byte comparison, so ordering (`<` `<=` `>` `>=`, `MIN` / `MAX`) reduces to hex-decode + native bytea comparison via the new self-contained SEM type `eql_v3_internal.ope_cllw` — no custom N-block comparison protocol, unlike the `_ord` / `_ord_ore` block-ORE domains. Integer-family `_ord_ope` domains carry `[op]` alone (OPE equality is lossless for them); `text_ord_ope` carries `[hm, op]` so `=` / `<>` stay exact via HMAC (OPE over text is not equality-lossless, matching `text_ord`). Index via a functional btree index on the new `eql_v3.ord_ope_term(col)` extractor (its `eql_v3_internal.ope_cllw` return type is a domain over `bytea`, inheriting the native comparison operators and DEFAULT btree opclass — the whole comparison chain stays inlinable, so the index engages structurally), not an operator class on the domain. This revives the v2.2-era `opf` / `opv` order-preserving terms under the modern single `op` wire key that cipherstash-client re-emits for ordered scalars (CIP-3280). Rust / TypeScript / JSON Schema payload bindings (`Int4OrdOpe`, `TextOrdOpe`, … with the `OpeCllw` term newtype) ship alongside, drift-gated by `types:check`. `bool` stays storage-only, and the combined `text_search` domain deliberately stays `[hm, ob, bf]` — adding `op` to its CHECK would widen it for no new operator capability (OPE's operators are already covered via `Ore`); with the pinned client now emitting `op` (0.38.1, CIP-3348) this is a standing design decision to revisit separately. Why: OPE terms are natively index-sortable, giving ordered encrypted columns a cheaper comparison path than the block-ORE protocol. ([#340](https://github.com/cipherstash/encrypt-query-language/pull/340))
+- b8d796b: **`eql_bindings::from_v2` — EQL v2.3 → v3 wire payload conversion.** The `eql-bindings` crate gains a converter from the v2.3 payloads cipherstash-client emits (reference contract: `docs/reference/schema/eql-payload-v2.3.schema.json`) into `eql_v3` payloads: `from_v2(v2, target)` for stored scalar (`k:"ct"`) and SteVec (`k:"sv"`) payloads, `from_v2_query(v2, target)` for the jsonb containment needle (→ the `eql_v3.jsonb_query` shape, normalized like `eql_v3.to_ste_vec_query`), and `is_v3_payload` as a lenient envelope probe for format sniffing. The target domain is explicit input — every v2 index term is optional on the wire, so capability cannot be inferred — and `TargetDomain::parse` resolves names against the catalog-generated inventory (via the new `DomainType::term_json_keys`), so accepted names and required term keys cannot drift from `eql-domains::CATALOG`. Conversion copies `i`/`c` verbatim, emits `v: 3`, copies exactly the term keys the target requires (failing closed with `MissingTerm` otherwise), drops `k` and unneeded terms (SteVec documents instead keep `k: "sv"` — the v3 document models the form discriminator), and reinterprets `bf` from v2's unsigned bit positions into the signed `smallint[]` representation (`32768..=65535` wrap negative; beyond is `BloomOutOfRange`); SteVec `sv` entry order is preserved verbatim because `sv[0]` carries the record ciphertext downstream decryption depends on. Every output is validated through the target's binding struct before being returned, and representative conversions are validated against the published JSON Schemas in `crates/eql-bindings/schema/v3/` by the `test:schema` suite. Scalar QUERY targets return `UnsupportedQueryTarget`: no v3 scalar query wire shape exists (every scalar domain CHECK requires `c`), and none is invented ahead of the mapper redesign. Why: protect-ffi, the benches, and potentially Proxy need a single, fail-closed upgrade path from the v2 wire while cipherstash-client still emits it. ([#341](https://github.com/cipherstash/encrypt-query-language/pull/341))
+- da4039d: **Query-operand domains renamed to a `query_` prefix AND moved into the `eql_v3` schema (CIP-3442).** Every scalar query twin introduced by the query-operand surface (above) is now `eql_v3.query_` — `query_integer_eq`, `query_text_ord`, `query_timestamp_ord_ope`, … — and the encrypted-JSONB containment needle follows the same convention: `public.jsonb_query` is now `eql_v3.query_jsonb`. Predicates cast accordingly (`WHERE col = $1::eql_v3.query_integer_eq`; `WHERE doc @> $1::eql_v3.query_jsonb`), the `eql-bindings` `DomainType::sql_domain` strings, `QueryPayload::parse` domain names, and the exported JSON Schema file names (`schema/v3/query_.json`) all carry the new names, and `from_v2_query` / `from_v2_query_typed` target them. This supersedes the `_query` naming in the earlier `[Unreleased]` entries; the old names shipped only in 3.0.0 pre-releases. **Why the prefix:** alphabetical type listings interleaved never-a-column-type query operands with the actual column types (`integer_eq` next to `integer_eq_query`); the shared `query_` prefix sorts every query operand together. **Why the schema move:** query operands are never valid column types, so they don't belong in `public` — the column-type namespace whose survive-schema-drop rationale (dropping EQL-owned schemas must not drop application columns) doesn't apply to them. In `eql_v3` they are versioned with the rest of the public API surface, are uninstalled with it (a column misusing a query domain is dropped by the uninstaller's CASCADE — pinned by the uninstall suite), and casting a query operand requires the same `USAGE ON SCHEMA eql_v3` a caller already needs for the extractors and comparison wrappers. See [U-002](docs/upgrading/v3.0.md#u-002-query-operand-domains-are-eql_v3query_name) in the 3.0 upgrade guide. ([CIP-3442](https://linear.app/cipherstash/issue/CIP-3442))
+- b8d796b: **`eql_bindings::DomainPayload` + `from_v2_typed` — typed domain payloads.** The `eql-bindings` crate gains a catalog-generated `DomainPayload` enum spanning every stored-payload domain (one variant per catalog family/domain pair mapping to its binding struct — `IntegerEq`, `TextSearch`, … — plus `SteVecDocument` for `eql_v3.json`) and `from_v2_typed(v2, target)`, the typed twin of `from_v2` that returns the enum variant instead of a shape-erased `serde_json::Value`. The enum is generated by `eql-codegen bindings` alongside the family structs and inventory (drift-gated by `types:check`), serializes exactly as the inner struct (`#[serde(untagged)]`, Serialize-only — `serde_json::to_value(&from_v2_typed(v2, t)?)` equals `from_v2(v2, t)?` byte-for-byte, pinned in tests), and deliberately has no `Deserialize`: cross-token payloads are byte-identical on the wire, so a variant is only constructible from a known target domain (`DomainPayload::parse`), never inferred from bytes. Both conversion entry points share one path and the final strict parse through the target's binding struct still happens exactly once (`from_v2` validates and discards; `from_v2_typed` keeps it). No new TypeScript/JSON-Schema artifacts — the exported wire surface is unchanged. Why: protect-ffi had to store converted payloads type-erased (`V3(serde_json::Value)`) because no typed value was obtainable from eql-bindings; it can now hold `V3(DomainPayload)` without re-parsing or a hand-written enum that drifts as the catalog grows. ([#349](https://github.com/cipherstash/encrypt-query-language/pull/349))
+- b8d796b: **`eql_bindings::QueryPayload` + `from_v2_query_typed` — typed query payloads (eql-bindings 0.4.0).** The `eql-bindings` crate gains a `QueryPayload` enum spanning every v3 QUERY payload shape and `from_v2_query_typed(v2, target)`, the typed twin of `from_v2_query` that returns the enum variant instead of a shape-erased `serde_json::Value` — completing the typed-conversion surface started by `DomainPayload`/`from_v2_typed` (storage payloads, see below). Today the enum has exactly one variant, `SteVec(SteVecQuery)` (the `eql_v3.jsonb_query` containment needle — the only query conversion that exists): a scalar query value is a SINGLE index term (one Ore / Ope / Bloom / Hm term value, not a stored envelope), and no v3 scalar-query wire shape exists yet, so the scalar-term variants are deliberately absent and both entry points keep failing closed with `UnsupportedQueryTarget` rather than inventing a shape ahead of the eql-mapper redesign. Unlike `DomainPayload` (generated — its variant set IS the catalog), `QueryPayload` is hand-written next to the equally hand-written SteVec types: its variants are term-shaped, anchored to the stable hand-written `Term`-level surface (`terms.rs`), not to catalog rows a generator walks. Serialize-only (`#[serde(untagged)]` — `serde_json::to_value(&from_v2_query_typed(v2, t)?)` equals `from_v2_query(v2, t)?` byte-for-byte, pinned in tests), no `Deserialize` (a variant is only constructible from a known domain via `QueryPayload::parse`, never inferred from bytes), and no ts-rs/schemars derives (the enum adds no wire shape, so the exported TS/JSON-Schema artifacts are unchanged). Both query entry points share one conversion path and the final strict parse happens exactly once (`from_v2_query` validates and discards; `from_v2_query_typed` keeps it). Why: protect-ffi can now hold converted containment needles typed instead of as `serde_json::Value`, adopting after the eql-bindings 0.4.0 release. ([#350](https://github.com/cipherstash/encrypt-query-language/pull/350))
+- da4039d: **Scalar query-operand surface — term-only query domains and operators (CIP-3432).** Every term-bearing scalar domain now has a paired `public._query` domain (`integer_eq_query`, `integer_ord_ope_query`, `text_search_query`, …): the **index-terms-only** query operand `{v, i, }` — the storage envelope minus the ciphertext `c`, enforced by the domain CHECK (a `c`-bearing operand is rejected). Each supported operator gains a `CREATE OPERATOR` binding `(storage_domain, _query)` (and its commutator), so `WHERE col = $1::public.integer_eq_query` / `col < $1::public.integer_ord_query` resolve against a term-only operand — a public, supported SQL entry point that never requires shipping a decryptable ciphertext in the query. **Why:** query operands travel through PostgREST query strings, URL logs, proxies, and SQL logs; they should carry index terms only, not a full storage envelope. On the client side, `eql_bindings::QueryPayload` is now **catalog-generated** with a variant per query twin (superseding the interim hand-written single-variant enum below), and `from_v2_query` / `from_v2_query_typed` now convert scalar targets by hoisting the required terms out of the v2 payload (storage-only domains, having no operators, still return `UnsupportedQueryTarget`). End-to-end conformance is proven against fresh ZeroKMS encryption: an independently-encrypted term-only operand matches exactly the equal (or, for ORE, correctly-ordered) stored rows. ([#373](https://github.com/cipherstash/encrypt-query-language/pull/373))
+- da4039d: **`COMMENT ON DOMAIN` on every `eql_v3` encrypted domain type.** The v3 encrypted domains are `jsonb`-backed, so introspection that resolves a domain to its base type renders them as a bare `jsonb` with no hint they are EQL-encrypted, searchable columns (most visibly the Supabase table editor, whose grid reads `postgres-meta`'s base-type-resolved `format`). Every `public` encrypted domain now carries a one-line `COMMENT ON DOMAIN`, so the type is self-documenting via `psql \dD`, `obj_description(oid,'pg_type')`, and any tool that reads `pg_type` comments (Supabase's `types` introspection surfaces exactly this). No behaviour change — comments only. Scalar-domain comments are **code-generated**: a new `DomainBlock.comment` field derives the capability text from the domain's terms (`Term::operators_for_terms`), so it tracks the generated CHECK/operator surface and can't drift. Comments are deliberately terse so they fit one line in type pickers (e.g. Supabase Studio): `text_match` → "EQL encrypted text (containment)", an ORE `_ord` → "EQL encrypted numeric (equality, ordering)", storage-only → "EQL encrypted numeric (storage only)". The DO-block templates emit the comment after each idempotent `CREATE DOMAIN`, re-applied on reinstall so comment-text changes propagate. The `_query` operand twins get a matching "EQL  query operand (…)" comment, and the three hand-written jsonb SteVec domains (`json` / `jsonb_entry` / `jsonb_query`) get hand-written comments. ([#377](https://github.com/cipherstash/encrypt-query-language/pull/377), closes [#376](https://github.com/cipherstash/encrypt-query-language/issues/376))
+- b8d796b: **First-class language-binding releases: the `@cipherstash/eql` npm package and crate-bundled SQL.** EQL v3 now ships its canonical wire types as a TypeScript npm package (`@cipherstash/eql`, under `packages/eql/`) alongside the existing Rust `eql-bindings` crate — both generated from `eql-domains::CATALOG` (the TS package is derived from the crate's `bindings/` + `schema/` outputs, drift-gated by `mise run typescript:check`). Each language package bundles the **exact** self-contained SQL installer/uninstaller it was generated against: the crate exposes it as `eql_bindings::sql` (`INSTALL_SQL`, `UNINSTALL_SQL`, `RELEASE_MANIFEST_JSON`), and the npm package via its `./sql` / `./sql/*` subpath exports (plus a `releaseManifest` and `readInstallSql()`/`readUninstallSql()` helpers) — so a consumer pins wire types and the matching DDL together. Prereleases can now cut all three artifacts under one identity — the SQL + docs GitHub release, the crate (crates.io, tag `eql-bindings-v`), and the npm package (tag `eql-typescript-v`): a single unified `release.yml` workflow publishes them in lockstep from an explicit `chore(release): ...` commit on the `eql_v3` branch (npm directly, the crate dispatched through `release-plz.yml` for crates.io Trusted Publishing). Why: type information was lost at every hop from EQL to downstream tools; a versioned, single-source package per language (bundled with the SQL it targets) removes hand-copying and installer/type drift.
+- b8d796b: **`eql_v3.lints()` gains a `schema_placement` category.** `SELECT * FROM eql_v3.lints() WHERE category = 'schema_placement'` reports, at severity `error`, any naked composite or enum TYPE that has been created in the public `eql_v3` schema — an internal index-term type (e.g. `ore_block_256_term`) that belongs in `eql_v3_internal`. Why: the `eql_v3` / `eql_v3_internal` split exists to keep index-term-only types out of the Supabase Table Builder type picker; this lint makes a placement regression self-detecting at runtime (the CI-side net is the placement invariant in `tests/sqlx/tests/v3_public_surface_tests.rs`). A clean install reports zero `schema_placement` rows.
+- b8d796b: **`eql_v3.version()` — version introspection on the self-contained `eql_v3` surface.** `SELECT eql_v3.version()` returns the installed EQL version as bare-semver text (e.g. `'3.0.0'`, or `'DEV'` for local builds); the same value is published as the `eql_v3` schema comment, so it is also readable via `obj_description('eql_v3'::regnamespace)`. The version is baked in at build time from the release tag via `mise run build --version` (now passed as prefix-stripped semver by both release workflows). This replaces the removed `eql_v2.version()` (dropped with the rest of the `eql_v2` surface — see Removed): the "which EQL is installed?" probe moves to `eql_v3`, consistent with the schema namespace move. Why: the self-contained `eql_v3` surface had no version-introspection point after `eql_v2` was removed.
+
+### Patch Changes
+
+- b8d796b: **`=` / `<>` on `eql_v2.ore_block_u64_8_256` now declare a `COMMUTATOR`, so equality joins over the ORE term no longer raise.** Both operators set `COMMUTATOR` to themselves (equality and inequality are symmetric, so each is its own commutator). Why: without it the planner raised `could not find commutator for operator` the first time an `ore_block_u64_8_256` equality was used as a join / mergejoin qualifier (e.g. via the inlined `eql_v3.integer_ord_ore` equality wrappers, since the operators carry `MERGES`). This only enables previously-erroring join plans — it cannot change which rows match or their ordering. ([#239](https://github.com/cipherstash/encrypt-query-language/pull/239))
+- b8d796b: **The `eql_v3` ORE block comparator now orders ciphertexts of any block count, not just 8.** `eql_v3.compare_ore_block_256_term` derives the block count `N` from the term length (`octet_length = 49·N + 16`) instead of hardcoding 8, so encrypted types whose native ORE width exceeds 8 blocks — `numeric` (14) and `timestamp` (12) — order, range-query, `ORDER BY`, and `MIN`/`MAX` correctly instead of silently mis-ordering. Malformed terms (length not `49·N + 16` for `N ≥ 1`) now raise instead of returning a bogus comparison. The self-contained `eql_v3` SEM type was renamed `eql_v3.ore_block_u64_8_256 → eql_v3.ore_block_256` to reflect that it is width-agnostic (the `eql_v2` type is unchanged). No effect on existing 8-block types (a no-op for `N = 8`). ([#241](https://github.com/cipherstash/encrypt-query-language/issues/241), [#276](https://github.com/cipherstash/encrypt-query-language/pull/276))
+- b8d796b: **An empty ORE term (`ob: []`) is now rejected by the ORE-bearing `eql_v3` domains instead of silently corrupting ordered queries.** Encrypting the empty string `""` as ordered text produces an empty ORE term (`ob: []`) — the only value that does — and previously an `""` row silently dropped out of `ORDER BY`, was wrongly returned by `eql_v3.max`, and threw off range-query counts (the `eql_v3.ore_block_256` extractor collapsed `ob: []` to NULL index terms). The ORE-bearing domains (`_ord` / `_ord_ore`, and text `_search`) now carry a `CHECK` requiring `ob` to be a non-empty array, so casting or inserting an empty-`ob` payload into an ordered column fails loudly with a check violation (SQLSTATE `23514`) rather than producing an unorderable row. This affects only the empty string in an ordered column: every non-empty string and every fixed-width scalar (int / date / numeric / float) always produces a non-empty `ob`. Storage and equality are unaffected — `""` can still be encrypted into a storage-only (`eql_v3.text`) or equality (`eql_v3.text_eq`) column with a real ciphertext (`c`) and HMAC (`hm`). As defense-in-depth for any path that bypasses the domain (e.g. a comparator composite built directly), the comparator also orders a zero-term ORE composite before every non-empty value (empty sorts first); a genuine SQL `NULL` row is unchanged and keeps standard `NULLS FIRST` / `NULLS LAST` semantics (the extractor is `STRICT`). ([#262](https://github.com/cipherstash/encrypt-query-language/issues/262))
+- b8d796b: **`ore_block_256` opclass-path helpers converted from `LANGUAGE sql` to plpgsql — restores v2-level ordered-scan performance.** `eql_v3_internal.jsonb_array_to_bytea_array` and `eql_v3_internal.jsonb_array_to_ore_block_256` were `LANGUAGE sql` for inlineability, but their only caller chain (`ore_block_256(val)`, plpgsql, feeding the btree operator class) can never inline SQL functions — every compared value paid the per-call SQL-function executor instead, measured at 3.5× the per-call cost of the logic-identical plpgsql form. Release benchmarks put the end-to-end cost at +43% on ORE ordered index scans vs EQL 2.3 (`0.513 → 0.736 ms` at 1M rows) and +36% on the composite bloom+ORE-order shape (`16.6 → 22.7 ms`); with the plpgsql form both scenarios return to (or beat) the v2 numbers — `0.553 ms` and `13.97 ms` respectively, validated A→B→A on a live 1M-row bench database. Semantics are unchanged: NULL/non-array inputs still return NULL, and the empty-`ob` COALESCE (#262) is preserved. The `eql-inline-critical` markers are retained so the pin_search_path pass keeps both functions unpinned — a `SET search_path` clause on plpgsql forces per-call configuration switching in the same hot path. Full attribution and experiment data: cipherstash/benches#23 (`v3-regressions-report.md`). ([#353](https://github.com/cipherstash/encrypt-query-language/issues/353))
+- b8d796b: **`eql_v3.jsonb_entry` CHECK inlined; `jsonb_query` validator converted to plpgsql — removes SQL-function-executor overhead from the per-query needle casts.** Domain constraints cannot inline SQL functions, so `jsonb_entry`'s function-call CHECK paid ~18 µs on every cast — the needle cast in every `field_eq` query was the ENTIRE +19% v2→v3 regression on that scenario (in-DB 0.011 → 0.029 ms/query with identical `eq_term` costs; cipherstash/benches#23). The `jsonb_entry` CHECK now mirrors the validator body inline, with a leading `VALUE IS NULL OR` preserving STRICT NULL-passes semantics (equivalence pinned over a payload corpus by `jsonb_check::jsonb_entry_check_matches_validator`). `jsonb_query`'s CHECK cannot be inlined — validating sv elements needs a subquery, which CHECK constraints forbid — so `is_valid_ste_vec_query_payload` is plpgsql instead (cached plan vs per-call SQL-function executor; the #353 finding), guarded by `jsonb_check::jsonb_query_validator_is_plpgsql`. The `eql_v3.json` document CHECK — part of the documented privilege contract — is unchanged; `docs/reference/permissions.md` now notes the `jsonb_entry` cast requires no internal grant. ([#354](https://github.com/cipherstash/encrypt-query-language/issues/354))
+- da4039d: **The `eql_v3` installer now runs on managed Postgres without superuser — the two SEM btree operator classes install conditionally.** `release/cipherstash-encrypt.sql` created `eql_v3_internal.ore_block_256_operator_class` and `eql_v3_internal.ore_cllw_ops` with bare `CREATE OPERATOR FAMILY` / `CREATE OPERATOR CLASS`, which PostgreSQL restricts to superusers. On Supabase (and most hosted Postgres), the installer runs as a non-superuser role, so the whole single-transaction install aborted at the first `CREATE OPERATOR FAMILY` with `must be superuser to create an operator family` (SQLSTATE `42501`) — leaving `eql_v3` uninstallable there despite the surface being otherwise managed-Postgres compatible. Both `operator_class.sql` files now wrap their family+class creation in a `DO` block that catches `insufficient_privilege` and continues with a `NOTICE`, so one artifact installs everywhere: superuser installs (self-managed Postgres, the SQLx test matrix) create the default btree opclass as before; non-superuser installs skip it and fall back to the order-preserving (OPE) ordering domains, whose extractor return types carry a native btree opclass and need no custom class. Any non-privilege error from the DDL still propagates. Verified end-to-end against live Supabase (skips, install commits, 0 opclasses) and a local superuser cluster (creates both opclasses). Also corrects the stale in-file comments claiming these files were excluded by a `**/*operator_class.sql` build glob — the v3 build (`tasks/build.sh`) globs `src/v3` wholesale and has no such exclusion. ([#375](https://github.com/cipherstash/encrypt-query-language/pull/375))
diff --git a/packages/eql/package.json b/packages/eql/package.json
index 117b77d5c..158530eb6 100644
--- a/packages/eql/package.json
+++ b/packages/eql/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@cipherstash/eql",
-  "version": "3.0.0-alpha.2",
+  "version": "3.0.0-alpha.3",
   "description": "Canonical EQL v3 wire types, JSON schemas, and SQL bundle.",
   "keywords": [
     "eql",
diff --git a/packages/eql/sql/cipherstash-encrypt-uninstall.sql b/packages/eql/sql/cipherstash-encrypt-uninstall.sql
index cb60f3296..7c9dd57f1 100644
--- a/packages/eql/sql/cipherstash-encrypt-uninstall.sql
+++ b/packages/eql/sql/cipherstash-encrypt-uninstall.sql
@@ -1 +1,8 @@
--- DEV placeholder. Release automation overwrites this file with exact-version EQL uninstall SQL before publishing.
+-- Uninstall the standalone eql_v3 surface. CASCADE removes the domains, SEM
+-- types, operators, opclass, and any columns typed with the eql_v3 domains.
+DROP SCHEMA IF EXISTS eql_v3 CASCADE;
+
+-- Drop the internal implementation schema after eql_v3 (eql_v3's extractors and
+-- operators depend on eql_v3_internal types; dropping eql_v3 first with CASCADE
+-- removes those dependents, then eql_v3_internal drops cleanly).
+DROP SCHEMA IF EXISTS eql_v3_internal CASCADE;
diff --git a/packages/eql/sql/cipherstash-encrypt.sql b/packages/eql/sql/cipherstash-encrypt.sql
index a30f106d9..617a1bddc 100644
--- a/packages/eql/sql/cipherstash-encrypt.sql
+++ b/packages/eql/sql/cipherstash-encrypt.sql
@@ -1 +1,43368 @@
--- DEV placeholder. Release automation overwrites this file with exact-version EQL SQL before publishing.
+--! @file v3/schema.sql
+--! @brief EQL v3 schema creation
+--!
+--! Creates the eql_v3 and eql_v3_internal schemas. User-column encrypted
+--! domains (public.integer, public.bigint, and future scalar domains) live in
+--! public so application tables survive EQL schema uninstall. eql_v3 is the
+--! public API for index-term extractors, aggregates, AND the operator-backing
+--! comparison wrappers
+--! (eq/neq/lt/lte/gt/gte/contains/contained_by, plus the jsonb containment
+--! helpers). The wrappers are public because they are the function-form
+--! equivalent of every supported operator: platforms without operator support
+--! (Supabase/PostgREST calls functions, not operators) invoke them by name.
+--! eql_v3_internal houses INTERNAL implementation objects only: the
+--! searchable-encrypted-metadata (SEM) index-term types
+--! (eql_v3_internal.hmac_256, eql_v3_internal.ore_block_256) and their support
+--! functions, the unsupported-operator blockers (which only raise), and the
+--! aggregate state functions. Together the two schemas are self-contained —
+--! they own every type they need and have no runtime dependency on another EQL
+--! schema.
+--!
+--! Drops existing schema if present to support clean reinstallation.
+--!
+--! @warning DROP SCHEMA CASCADE will remove all objects in the schema
+--! @note eql_v3 is a new, additional schema for the encrypted-domain families.
+--!
+--! @note DESIGN DECISION — EQL never grants permissions automatically. This
+--!       installer issues no GRANT (or REVOKE) on eql_v3 or eql_v3_internal:
+--!       access is strictly opt-in. A deployment that exposes EQL to
+--!       non-owner roles (e.g. Supabase `authenticated`/`anon` via PostgREST)
+--!       must explicitly `GRANT USAGE ON SCHEMA eql_v3` and `GRANT EXECUTE` on
+--!       the functions it needs. This is intentional least-privilege, not an
+--!       oversight — see docs/reference/permissions.md. eql_v3_internal is not
+--!       part of the public API and normally needs no grant; where a caller
+--!       reaches an internal object indirectly (a public operator/aggregate
+--!       whose backing state-fn/blocker lives there), grant it deliberately.
+
+--! @brief Drop existing EQL v3 schema
+--! @warning CASCADE will drop all dependent objects
+DROP SCHEMA IF EXISTS eql_v3 CASCADE;
+
+--! @brief Create EQL v3 schema
+--! @note Houses the encrypted-domain type families
+CREATE SCHEMA eql_v3;
+
+--! @brief Drop existing EQL v3 internal schema
+--! @warning CASCADE will drop all dependent objects
+DROP SCHEMA IF EXISTS eql_v3_internal CASCADE;
+
+--! @brief Create EQL v3 internal implementation schema
+--! @note Houses INTERNAL eql_v3 objects only: SEM index-term TYPES + their
+--!       support/constructor/comparator functions, the unsupported-operator
+--!       blockers (which only raise), the aggregate state functions, and the
+--!       SteVec CHECK validators. Kept out of the public `eql_v3` surface so
+--!       internal index-term TYPES do not clutter the Supabase Table Builder
+--!       type picker. NOTE: the operator-backing comparison *wrappers* are NOT
+--!       here — they are public in `eql_v3` so every operator has a callable
+--!       function equivalent for platforms without operator support.
+CREATE SCHEMA eql_v3_internal;
+COMMENT ON SCHEMA eql_v3_internal IS
+  'EQL internal implementation detail; not a public API surface.';
+
+--! @brief Schemas owned by the eql_v3 surface
+--!
+--! Single source of truth for tooling that must enumerate every schema this
+--! installer owns (`eql_v3.lints()`, `tasks/pin_search_path_v3.sql`), so a
+--! future third eql_v3-family schema is one array literal to edit instead of
+--! a hardcoded schema-name predicate repeated at every call site. Keep in
+--! sync with the `SCHEMA` / `INTERNAL_SCHEMA` constants in
+--! `crates/eql-codegen/src/consts.rs` — those drive what codegen emits into
+--! each schema; this drives what tooling scans across both.
+--!
+--! @return name[] The schema names eql_v3 owns (public + internal).
+CREATE FUNCTION eql_v3_internal.owned_schemas()
+  RETURNS name[]
+  LANGUAGE sql IMMUTABLE PARALLEL SAFE
+AS $$
+  SELECT ARRAY['eql_v3', 'eql_v3_internal']::name[]
+$$;
+
+--! @file v3/sem/ore_block_256/types.sql
+--! @brief ORE block index-term types (eql_v3 SEM).
+--!
+--! Self-contained eql_v3 copies of the Order-Revealing Encryption block types
+--! (design D1/D3). The eql_v2 originals are unchanged.
+
+--! @brief ORE block term type for Order-Revealing Encryption
+--!
+--! Composite type representing a single ORE block term. Stores encrypted data
+--! as bytea that enables range comparisons without decryption.
+CREATE TYPE eql_v3_internal.ore_block_256_term AS (
+  bytes bytea
+);
+
+
+--! @brief ORE block index term type for range queries
+--!
+--! Composite type containing an array of ORE block terms. The array is stored
+--! in the 'ob' field of encrypted data payloads.
+--!
+--! @note Transient type used only during query execution.
+CREATE TYPE eql_v3_internal.ore_block_256 AS (
+  terms eql_v3_internal.ore_block_256_term[]
+);
+
+--! @file v3/crypto.sql
+--! @brief PostgreSQL pgcrypto extension enablement (eql_v3 fork)
+--!
+--! Forked from src/crypto.sql (design D8) so the entire eql_v3 dependency
+--! closure lives under src/v3/. Enables the pgcrypto extension which provides
+--! cryptographic functions used by the eql_v3 ORE comparison path.
+--!
+--! Installs pgcrypto into the `extensions` schema (Supabase convention) to
+--! avoid the `extension_in_public` lint. Every EQL function that uses pgcrypto
+--! has `pg_catalog, extensions, public` on its `search_path`, so a pre-existing
+--! install in `public` keeps working — and a pre-existing install anywhere else
+--! will be rejected at install time. The body is idempotent
+--! (`CREATE SCHEMA IF NOT EXISTS`, `pg_extension` guard), so running it
+--! alongside the eql_v2 copy in a combined install is safe.
+--!
+--! @note pgcrypto provides functions like digest(), hmac(), gen_random_bytes()
+
+--! @brief Create extensions schema (Supabase convention)
+CREATE SCHEMA IF NOT EXISTS extensions;
+
+--! @brief Enable pgcrypto extension and validate its schema
+DO $$
+DECLARE
+  pgcrypto_schema name;
+BEGIN
+  IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pgcrypto') THEN
+    CREATE EXTENSION pgcrypto WITH SCHEMA extensions;
+  END IF;
+
+  SELECT n.nspname INTO pgcrypto_schema
+  FROM pg_extension e
+  JOIN pg_namespace n ON n.oid = e.extnamespace
+  WHERE e.extname = 'pgcrypto';
+
+  IF pgcrypto_schema = 'extensions' THEN
+    -- expected location, nothing to say
+    NULL;
+  ELSIF pgcrypto_schema = 'public' THEN
+    RAISE NOTICE
+      'pgcrypto is installed in the `public` schema. EQL works against this layout, '
+      'but Supabase splinter will flag it as `extension_in_public`. Move it with: '
+      'ALTER EXTENSION pgcrypto SET SCHEMA extensions';
+  ELSE
+    RAISE EXCEPTION
+      'pgcrypto is installed in schema `%`, which is not on the EQL function search_path '
+      '(pg_catalog, extensions, public). EQL cryptographic operations would fail at '
+      'runtime. Relocate the extension before installing EQL: '
+      'ALTER EXTENSION pgcrypto SET SCHEMA extensions',
+      pgcrypto_schema;
+  END IF;
+END $$;
+
+--! @file v3/common.sql
+--! @brief Common utility functions for the self-contained eql_v3 surface.
+--!
+--! Forked from src/common.sql (design D7) so the eql_v3 ORE constructor owns the
+--! one transitive helper it needs without reaching into another schema. The
+--! eql_v2 original is unchanged.
+
+--! @brief Convert JSONB hex array to bytea array
+--! @internal
+--!
+--! Converts a JSONB array of hex-encoded strings into a PostgreSQL bytea array.
+--! Used for deserializing binary data (like ORE terms) from JSONB storage.
+--!
+--! @param val jsonb JSONB array of hex-encoded strings
+--! @return bytea[] Array of decoded binary values
+--!
+--! @note Returns NULL if input is JSON null
+--! @note Each array element is hex-decoded to bytea
+--! @note plpgsql, not `LANGUAGE sql` (issue #353). This helper's ONLY caller
+--!   chain is `ore_block_256(val)` -> `jsonb_array_to_ore_block_256(val)` —
+--!   both reached exclusively from plpgsql and btree operator-class support
+--!   contexts, where SQL functions can NEVER be inlined and instead pay the
+--!   per-call SQL-function executor (measured 3.5x the per-call cost of the
+--!   plpgsql equivalent; +43% on ORE ordered scans end-to-end). plpgsql
+--!   caches its plan across calls. The non-array guard preserves the v3
+--!   behaviour (returns NULL for a non-array scalar; the v2 plpgsql original
+--!   raised) — both callers only ever pass an array or JSON null (`val->'ob'`),
+--!   so the divergence stays unreachable in practice; JSON null and empty
+--!   array still return NULL exactly as before.
+CREATE FUNCTION eql_v3_internal.jsonb_array_to_bytea_array(val jsonb)
+RETURNS bytea[]
+  IMMUTABLE
+AS $$
+DECLARE
+  result bytea[];
+BEGIN
+  IF val IS NULL OR jsonb_typeof(val) != 'array' THEN
+    RETURN NULL;
+  END IF;
+  SELECT array_agg(decode(value::text, 'hex')::bytea)
+    INTO result
+  FROM jsonb_array_elements_text(val) AS value;
+  RETURN result;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @internal Keep the inline-critical marker so the post-install
+--! pin_search_path pass leaves this unpinned: a `SET search_path` clause on a
+--! plpgsql function forces per-call configuration switching — measurable on a
+--! helper invoked per compared value in the ore_block_256 opclass hot path.
+--! It takes a bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the
+--! structural skip in tasks/pin_search_path_v3.sql does not recognise it;
+--! this marker is the documented manual opt-in.
+COMMENT ON FUNCTION eql_v3_internal.jsonb_array_to_bytea_array(jsonb) IS
+  'eql-inline-critical: per-encrypted-value ORE opclass-path helper; must stay unpinned (SET search_path adds per-call overhead)';
+
+--! @file v3/sem/hmac_256/types.sql
+--! @brief HMAC-SHA256 index term type (eql_v3 SEM)
+--!
+--! Domain type representing HMAC-SHA256 hash values. Used for exact-match
+--! encrypted searches. The hash is stored in the 'hm' field of encrypted data
+--! payloads. Self-contained eql_v3 copy (design D1/D3); the eql_v2 original is
+--! unchanged.
+--!
+--! @note Transient type used only during query execution.
+CREATE DOMAIN eql_v3_internal.hmac_256 AS text;
+
+--! @file v3/sem/bloom_filter/types.sql
+--! @brief Self-contained eql_v3 Bloom-filter SEM index-term type.
+
+--! @brief Bloom-filter index term: a bit array stored as smallint[].
+--!
+--! Backs the `match` capability (`@>` / `<@`) on `eql_v3_internal.text_match`. The
+--! filter is read from the `bf` field of an encrypted jsonb payload. Native
+--! `smallint[]` array-containment (`@>`/`<@`) is inherited through the domain,
+--! so this type needs no custom operators.
+--!
+--! @note Self-contained: references no eql_v2 symbol.
+CREATE DOMAIN eql_v3_internal.bloom_filter AS smallint[];
+
+--! @file v3/scalars/functions.sql
+--! @brief Shared blocker helper for the eql_v3 encrypted-domain families.
+--!
+--! Per-domain wrapper functions live in src/v3/scalars//.
+--! Blockers in those files delegate to encrypted_domain_unsupported_bool
+--! so every domain raises a uniform domain-specific error rather than
+--! letting an unsupported operator fall through to native jsonb
+--! behaviour.
+
+--! @brief Shared blocker helper. Raises 'operator X is not supported
+--!        for TYPE' so unsupported domain operators surface a clear
+--!        error rather than fall through to native jsonb behaviour.
+--! @param type_name Domain type name (eql_v3.*)
+--! @param operator_name Operator symbol (=, <, @>, ->, etc.)
+--! @return boolean (never returns; always raises)
+CREATE FUNCTION eql_v3_internal.encrypted_domain_unsupported_bool(type_name text, operator_name text)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Shared blocker helper returning jsonb. Identical to
+--!        encrypted_domain_unsupported_bool but typed for blockers shadowing
+--!        native operators whose result is jsonb (#>, -, #-, ||), so composed
+--!        expressions resolve and the body raises rather than failing earlier
+--!        with a misleading 'operator does not exist' on a boolean result.
+--! @param type_name Domain type name (eql_v3.*)
+--! @param operator_name Operator symbol (#>, -, #-, ||, etc.)
+--! @return jsonb (never returns; always raises)
+CREATE FUNCTION eql_v3_internal.encrypted_domain_unsupported_jsonb(type_name text, operator_name text)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Shared blocker helper returning text. Identical to
+--!        encrypted_domain_unsupported_bool but typed for blockers shadowing
+--!        the native #>> operator whose result is text.
+--! @param type_name Domain type name (eql_v3.*)
+--! @param operator_name Operator symbol (#>>)
+--! @return text (never returns; always raises)
+CREATE FUNCTION eql_v3_internal.encrypted_domain_unsupported_text(type_name text, operator_name text)
+RETURNS text
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RAISE EXCEPTION 'operator % is not supported for %', operator_name, type_name;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @file v3/sem/hmac_256/functions.sql
+--! @brief HMAC-SHA256 index-term extraction from a jsonb payload (eql_v3 SEM).
+--!
+--! jsonb-only subset of src/hmac_256/functions.sql. The encrypted-column and
+--! ste_vec-entry overloads are intentionally omitted — the eql_v3 scalar
+--! domains extract from the jsonb payload directly via a cast to the domain.
+--! (Doc comments deliberately avoid naming eql_v2 symbols so the
+--! self-containment grep stays clean.)
+
+--! @brief Extract HMAC-SHA256 index term from JSONB payload
+--!
+--! Inlinable single-statement SQL — the planner can fold this into the calling
+--! query so functional hash/btree indexes built on `eql_v3_internal.eq_term(col)`
+--! (which calls this) engage structurally.
+--!
+--! @param val jsonb containing encrypted EQL payload
+--! @return eql_v3_internal.hmac_256 HMAC-SHA256 hash value, or NULL when `hm` is absent
+CREATE FUNCTION eql_v3_internal.hmac_256(val jsonb)
+  RETURNS eql_v3_internal.hmac_256
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (val ->> 'hm')::eql_v3_internal.hmac_256
+$$;
+
+
+--! @brief Check if JSONB payload contains HMAC-SHA256 index term
+--!
+--! @param val jsonb containing encrypted EQL payload
+--! @return boolean True if 'hm' field is present and non-null
+CREATE FUNCTION eql_v3_internal.has_hmac_256(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (val ->> 'hm') IS NOT NULL
+$$;
+
+--! @file v3/sem/ore_block_256/functions.sql
+--! @brief ORE block construction, extraction, and comparison (eql_v3 SEM).
+--!
+--! jsonb-only subset of src/ore_block_u64_8_256/functions.sql. The
+--! encrypted-column overloads are omitted; the helper jsonb_array_to_bytea_array
+--! and pgcrypto encrypt() are reached via the forked src/v3/common.sql and
+--! src/v3/crypto.sql so the whole closure stays under src/v3. (Doc comments
+--! deliberately avoid naming eql_v2 symbols so the self-containment grep stays
+--! clean.)
+
+--! @brief Convert JSONB array to ORE block composite type
+--! @internal
+--! @param val jsonb Array of hex-encoded ORE block terms
+--! @return eql_v3_internal.ore_block_256 ORE block composite, or NULL if input is null
+--! @note plpgsql, not `LANGUAGE sql` (issue #353). The sole caller
+--!   (`ore_block_256`) is itself plpgsql, so this function is NEVER reached
+--!   from an inlinable context — as `LANGUAGE sql` it paid the per-call
+--!   SQL-function executor on every compared value in the opclass hot path
+--!   (measured: +43% on ORE ordered scans vs the plpgsql form). The
+--!   non-array guard preserves the v3 behaviour (returns NULL for a
+--!   non-array scalar; the v2 plpgsql original raised); the caller only
+--!   reaches this when `has_ore_block_256(val)` is true, which requires
+--!   `val->'ob'` to be a JSON array, so that branch stays unreachable.
+--!   An empty array (`ob: []`, what encrypting the empty string `""` produces)
+--!   yields a non-NULL composite with an EMPTY `terms` array — NOT NULL terms.
+--!   The `COALESCE` is load-bearing: `array_agg` over zero rows returns NULL, and
+--!   NULL terms make the comparator return NULL (so an empty-text row silently
+--!   drops out of ordered queries). An empty array instead engages the
+--!   comparator's `cardinality = 0` guard, which sorts empty BEFORE every
+--!   non-empty term. See issue #262 (pinned by T7).
+CREATE FUNCTION eql_v3_internal.jsonb_array_to_ore_block_256(val jsonb)
+RETURNS eql_v3_internal.ore_block_256
+  IMMUTABLE
+AS $$
+DECLARE
+  terms eql_v3_internal.ore_block_256_term[];
+BEGIN
+  IF val IS NULL OR jsonb_typeof(val) != 'array' THEN
+    RETURN NULL;
+  END IF;
+  SELECT array_agg(ROW(b)::eql_v3_internal.ore_block_256_term)
+    INTO terms
+  FROM unnest(eql_v3_internal.jsonb_array_to_bytea_array(val)) AS b;
+  -- plpgsql pitfall: `SELECT  INTO ` assigns the
+  -- select-list columns FIELD-WISE into the variable — return the row
+  -- constructor directly instead. The COALESCE stays load-bearing for the
+  -- empty-`ob` case (issue #262): array_agg over zero rows yields NULL, and
+  -- the comparator needs an EMPTY terms array, not NULL terms.
+  RETURN ROW(COALESCE(terms, ARRAY[]::eql_v3_internal.ore_block_256_term[]))::eql_v3_internal.ore_block_256;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @internal Keep the inline-critical marker so the post-install
+--! pin_search_path pass leaves this unpinned: a `SET search_path` clause on a
+--! plpgsql function forces per-call configuration switching — measurable on a
+--! helper invoked per compared value in the ore_block_256 opclass hot path.
+--! It takes a bare `jsonb` arg (not a jsonb-backed encrypted DOMAIN), so the
+--! structural skip in tasks/pin_search_path_v3.sql does not recognise it;
+--! this marker is the documented manual opt-in.
+COMMENT ON FUNCTION eql_v3_internal.jsonb_array_to_ore_block_256(jsonb) IS
+  'eql-inline-critical: per-encrypted-value ORE opclass-path helper; must stay unpinned (SET search_path adds per-call overhead)';
+
+
+--! @brief Extract ORE block index term from JSONB payload
+--! @param val jsonb containing encrypted EQL payload
+--! @return eql_v3_internal.ore_block_256 ORE block index term
+--! @throws Exception if 'ob' field is missing
+CREATE FUNCTION eql_v3_internal.ore_block_256(val jsonb)
+  RETURNS eql_v3_internal.ore_block_256
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    -- Declared STRICT: PostgreSQL returns NULL for a NULL argument without
+    -- entering the body, so no explicit `val IS NULL` guard is needed.
+    IF eql_v3_internal.has_ore_block_256(val) THEN
+      RETURN eql_v3_internal.jsonb_array_to_ore_block_256(val->'ob');
+    END IF;
+    RAISE 'Expected an ore index (ob) value in json: %', val;
+  END;
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Check if JSONB payload contains an ORE block index term
+--! @param val jsonb containing encrypted EQL payload
+--! @return boolean True only if the 'ob' field is present and is a JSON array
+--! @note A well-formed ORE index term is always a JSON array of block terms, so
+--!   this guard treats a present-but-non-array `ob` (a scalar or object) as
+--!   absent. That makes the extractor `ore_block_256(val)` RAISE on a
+--!   structurally invalid `ob` payload at the boundary instead of silently
+--!   degrading it to a NULL index term in `jsonb_array_to_ore_block_256`. The
+--!   previous `val ->> 'ob' IS NOT NULL` form stringified scalars/objects and so
+--!   reported them as present. `{}` (absent `ob`) and `{"ob": null}` (JSON null)
+--!   both remain `false`.
+CREATE FUNCTION eql_v3_internal.has_ore_block_256(val jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    RETURN COALESCE(jsonb_typeof(val -> 'ob') = 'array', false);
+  END;
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Compare two ORE block terms using cryptographic comparison
+--! @internal
+--! @param a eql_v3_internal.ore_block_256_term First ORE term
+--! @param b eql_v3_internal.ore_block_256_term Second ORE term
+--! @return integer -1 if a < b, 0 if a = b, 1 if a > b
+--! @throws Exception if ciphertexts are different lengths
+--! @note Marked `IMMUTABLE` (the three `compare_ore_block_256_term(s)`
+--!   overloads all are). This deliberately diverges from the v2 originals,
+--!   which carry no volatility marker and so default to `VOLATILE`. The
+--!   comparison is deterministic — its only crypto call, pgcrypto `encrypt()`,
+--!   is itself `IMMUTABLE STRICT PARALLEL SAFE` — so `IMMUTABLE` lets the
+--!   planner fold/cache these in ordering and index contexts. NOT `STRICT`:
+--!   the NULL-handling branches below are load-bearing for the array overload.
+CREATE FUNCTION eql_v3_internal.compare_ore_block_256_term(a eql_v3_internal.ore_block_256_term, b eql_v3_internal.ore_block_256_term)
+  RETURNS integer
+  IMMUTABLE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    eq boolean := true;
+    unequal_block smallint := 0;
+    hash_key bytea;
+    data_block bytea;
+    encrypt_block bytea;
+    target_block bytea;
+
+    left_block_size CONSTANT smallint := 16;
+    right_block_size CONSTANT smallint := 32;
+
+    -- Block count N is DERIVED from the ciphertext length, not hardcoded to 8.
+    -- Wire format per term:
+    --   [ N PRP bytes ][ N*16B left blocks ][ 16B hash key ][ N*32B right blocks ]
+    --   octet_length = 17*N + 16 + 32*N = 49*N + 16  =>  N = (octet_length - 16) / 49
+    -- This serves integer (N=8, 408B), timestamp (N=12, 604B), and numeric
+    -- (N=14, 702B) with one comparator.
+    n            integer;
+    left_offset  integer;  -- ordinal offset of the first left block (1 + N PRP bytes)
+    right_offset integer;  -- ordinal start of the right CT (= total left CT length = 17*N)
+
+    indicator smallint := 0;
+  BEGIN
+    IF a IS NULL AND b IS NULL THEN
+      RETURN 0;
+    END IF;
+
+    IF a IS NULL THEN
+      RETURN -1;
+    END IF;
+
+    IF b IS NULL THEN
+      RETURN 1;
+    END IF;
+
+    IF bit_length(a.bytes) != bit_length(b.bytes) THEN
+      RAISE EXCEPTION 'Ciphertexts are different lengths';
+    END IF;
+
+    -- Well-formedness: length must be exactly 49*N + 16 for some N >= 1. The
+    -- modulo alone is insufficient -- a 16-byte term passes (16 - 16) % 49 = 0
+    -- and derives N = 0, which would fall through to the all-blocks-equal path
+    -- and return 0 instead of raising. The `<= 16` clause is load-bearing.
+    IF octet_length(a.bytes) <= 16 OR (octet_length(a.bytes) - 16) % 49 != 0 THEN
+      RAISE EXCEPTION 'Malformed ORE term: % bytes', octet_length(a.bytes);
+    END IF;
+
+    n := (octet_length(a.bytes) - 16) / 49;
+    left_offset := 1 + n;     -- left blocks begin right after the N PRP bytes
+    right_offset := 17 * n;   -- right CT begins right after the 17*N-byte left CT
+
+    FOR block IN 0..n-1 LOOP
+      -- Compare each PRP byte (the first N bytes) and its 16-byte left block.
+      IF
+        substr(a.bytes, 1 + block, 1) != substr(b.bytes, 1 + block, 1)
+        OR substr(a.bytes, left_offset + left_block_size * block, left_block_size) != substr(b.bytes, left_offset + left_block_size * block, left_block_size)
+      THEN
+        IF eq THEN
+          unequal_block := block;
+        END IF;
+        eq = false;
+      END IF;
+    END LOOP;
+
+    IF eq THEN
+      RETURN 0::integer;
+    END IF;
+
+    -- Hash key is the IV from the right CT of b.
+    hash_key := substr(b.bytes, right_offset + 1, 16);
+
+    -- First right block is at right_offset + nonce_size (ordinally indexed).
+    target_block := substr(b.bytes, right_offset + 17 + (unequal_block * right_block_size), right_block_size);
+
+    data_block := substr(a.bytes, left_offset + (left_block_size * unequal_block), left_block_size);
+
+    encrypt_block := encrypt(data_block::bytea, hash_key::bytea, 'aes-ecb');
+
+    indicator := (
+      get_bit(
+        encrypt_block,
+        0
+      ) + get_bit(target_block, get_byte(a.bytes, unequal_block))) % 2;
+
+    IF indicator = 1 THEN
+      RETURN 1::integer;
+    ELSE
+      RETURN -1::integer;
+    END IF;
+  END;
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Compare arrays of ORE block terms recursively
+--! @internal
+--! @param a eql_v3_internal.ore_block_256_term[] First array
+--! @param b eql_v3_internal.ore_block_256_term[] Second array
+--! @return integer -1/0/1, or NULL if either array is NULL
+CREATE FUNCTION eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256_term[], b eql_v3_internal.ore_block_256_term[])
+RETURNS integer
+  IMMUTABLE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    cmp_result integer;
+  BEGIN
+    IF a IS NULL OR b IS NULL THEN
+      RETURN NULL;
+    END IF;
+
+    IF cardinality(a) = 0 AND cardinality(b) = 0 THEN
+      RETURN 0;
+    END IF;
+
+    IF (cardinality(a) = 0) AND cardinality(b) > 0 THEN
+      RETURN -1;
+    END IF;
+
+    IF cardinality(a) > 0 AND (cardinality(b) = 0) THEN
+      RETURN 1;
+    END IF;
+
+    cmp_result := eql_v3_internal.compare_ore_block_256_term(a[1], b[1]);
+
+    IF cmp_result = 0 THEN
+      RETURN eql_v3_internal.compare_ore_block_256_terms(a[2:array_length(a,1)], b[2:array_length(b,1)]);
+    END IF;
+
+    RETURN cmp_result;
+  END
+$$ LANGUAGE plpgsql;
+
+
+--! @brief Compare ORE block composite types
+--! @internal
+--! @param a eql_v3_internal.ore_block_256 First ORE block
+--! @param b eql_v3_internal.ore_block_256 Second ORE block
+--! @return integer -1/0/1
+CREATE FUNCTION eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS integer
+  IMMUTABLE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    RETURN eql_v3_internal.compare_ore_block_256_terms(a.terms, b.terms);
+  END
+$$ LANGUAGE plpgsql;
+
+--! @file v3/sem/ore_block_256/operators.sql
+--! @brief Comparison operators on eql_v3_internal.ore_block_256.
+--!
+--! The six backing functions are inlinable single-statement SQL so the planner
+--! can fold the eql_v3 comparison wrappers through to functional-index matching.
+
+--! @brief Equality backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the ORE blocks are equal
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_eq(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) = 0
+$$;
+
+--! @brief Not-equal backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the ORE blocks are not equal
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_neq(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) <> 0
+$$;
+
+--! @brief Less-than backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is less than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_lt(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) = -1
+$$;
+
+--! @brief Less-than-or-equal backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is less than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_lte(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) != 1
+$$;
+
+--! @brief Greater-than backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is greater than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_gt(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) = 1
+$$;
+
+--! @brief Greater-than-or-equal backing function for ORE block types
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_block_256 Left operand
+--! @param b eql_v3_internal.ore_block_256 Right operand
+--! @return boolean True if the left operand is greater than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_block_256_terms
+CREATE FUNCTION eql_v3_internal.ore_block_256_gte(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+RETURNS boolean
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_block_256_terms(a, b) != -1
+$$;
+
+
+--! @brief = operator for ORE block types
+--!
+--! COMMUTATOR is the operator itself: equality is symmetric. Required for the
+--! MERGES flag — without it the planner raises "could not find commutator" the
+--! first time an ore_block equality is used as a join qual (e.g. via the inlined
+--! eql_v3_internal._ord_ore equality wrappers).
+CREATE OPERATOR public.= (
+  FUNCTION=eql_v3_internal.ore_block_256_eq,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.=),
+  NEGATOR = OPERATOR(public.<>),
+  RESTRICT = eqsel,
+  JOIN = eqjoinsel,
+  HASHES,
+  MERGES
+);
+
+--! @brief <> operator for ORE block types
+CREATE OPERATOR public.<> (
+  FUNCTION=eql_v3_internal.ore_block_256_neq,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.<>),
+  NEGATOR = OPERATOR(public.=),
+  RESTRICT = neqsel,
+  JOIN = neqjoinsel,
+  MERGES
+);
+
+--! @brief > operator for ORE block types
+CREATE OPERATOR public.> (
+  FUNCTION=eql_v3_internal.ore_block_256_gt,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.<),
+  NEGATOR = OPERATOR(public.<=),
+  RESTRICT = scalargtsel,
+  JOIN = scalargtjoinsel
+);
+
+--! @brief < operator for ORE block types
+CREATE OPERATOR public.< (
+  FUNCTION=eql_v3_internal.ore_block_256_lt,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.>),
+  NEGATOR = OPERATOR(public.>=),
+  RESTRICT = scalarltsel,
+  JOIN = scalarltjoinsel
+);
+
+--! @brief <= operator for ORE block types
+CREATE OPERATOR public.<= (
+  FUNCTION=eql_v3_internal.ore_block_256_lte,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.>=),
+  NEGATOR = OPERATOR(public.>),
+  RESTRICT = scalarlesel,
+  JOIN = scalarlejoinsel
+);
+
+--! @brief >= operator for ORE block types
+CREATE OPERATOR public.>= (
+  FUNCTION=eql_v3_internal.ore_block_256_gte,
+  LEFTARG=eql_v3_internal.ore_block_256,
+  RIGHTARG=eql_v3_internal.ore_block_256,
+  COMMUTATOR = OPERATOR(public.<=),
+  NEGATOR = OPERATOR(public.<),
+  RESTRICT = scalargesel,
+  JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/real/real_types.sql
+--! @brief Encrypted-domain types for real.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.real.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real IS 'EQL encrypted real (storage only)';
+
+  --! @brief Encrypted domain public.real_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_eq IS 'EQL encrypted real (equality)';
+
+  --! @brief Encrypted domain public.real_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_ord_ore IS 'EQL encrypted real (equality, ordering)';
+
+  --! @brief Encrypted domain public.real_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_ord IS 'EQL encrypted real (equality, ordering)';
+
+  --! @brief Encrypted domain public.real_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'real_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.real_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.real_ord_ope IS 'EQL encrypted real (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ore_functions.sql
+--! @brief Functions for public.real_ord_ore.
+
+--! @brief Index extractor for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.real_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.real_ord_ore) $$;
+
+--! @brief Operator wrapper for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector text
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ore, selector text)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector integer
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ore, selector integer)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param selector public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord_ore)
+RETURNS public.real_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param selector public.real_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b public.real_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ore, b public.real_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ore.
+--! @param a jsonb
+--! @param b public.real_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/smallint/smallint_types.sql
+--! @brief Encrypted-domain types for smallint.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.smallint.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint IS 'EQL encrypted smallint (storage only)';
+
+  --! @brief Encrypted domain public.smallint_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_eq IS 'EQL encrypted smallint (equality)';
+
+  --! @brief Encrypted domain public.smallint_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_ord_ore IS 'EQL encrypted smallint (equality, ordering)';
+
+  --! @brief Encrypted domain public.smallint_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_ord IS 'EQL encrypted smallint (equality, ordering)';
+
+  --! @brief Encrypted domain public.smallint_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'smallint_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.smallint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.smallint_ord_ope IS 'EQL encrypted smallint (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_eq_functions.sql
+--! @brief Functions for public.smallint_eq.
+
+--! @brief Index extractor for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.smallint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.smallint_eq) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.smallint_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.smallint_eq) $$;
+
+--! @brief Operator wrapper for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.smallint_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_eq, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector text
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_eq, selector text)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector integer
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_eq, selector integer)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param selector public.smallint_eq
+--! @return public.smallint_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_eq)
+RETURNS public.smallint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param selector public.smallint_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b public.smallint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_eq, b public.smallint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a public.smallint_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_eq.
+--! @param a jsonb
+--! @param b public.smallint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/date/date_types.sql
+--! @brief Encrypted-domain types for date.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.date.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date IS 'EQL encrypted date (storage only)';
+
+  --! @brief Encrypted domain public.date_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_eq IS 'EQL encrypted date (equality)';
+
+  --! @brief Encrypted domain public.date_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_ord_ore IS 'EQL encrypted date (equality, ordering)';
+
+  --! @brief Encrypted domain public.date_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_ord IS 'EQL encrypted date (equality, ordering)';
+
+  --! @brief Encrypted domain public.date_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'date_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.date_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.date_ord_ope IS 'EQL encrypted date (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/numeric/numeric_types.sql
+--! @brief Encrypted-domain types for numeric.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.numeric.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric IS 'EQL encrypted numeric (storage only)';
+
+  --! @brief Encrypted domain public.numeric_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_eq IS 'EQL encrypted numeric (equality)';
+
+  --! @brief Encrypted domain public.numeric_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_ord_ore IS 'EQL encrypted numeric (equality, ordering)';
+
+  --! @brief Encrypted domain public.numeric_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_ord IS 'EQL encrypted numeric (equality, ordering)';
+
+  --! @brief Encrypted domain public.numeric_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'numeric_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.numeric_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.numeric_ord_ope IS 'EQL encrypted numeric (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/double/double_types.sql
+--! @brief Encrypted-domain types for double.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.double.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double IS 'EQL encrypted double (storage only)';
+
+  --! @brief Encrypted domain public.double_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_eq IS 'EQL encrypted double (equality)';
+
+  --! @brief Encrypted domain public.double_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_ord_ore IS 'EQL encrypted double (equality, ordering)';
+
+  --! @brief Encrypted domain public.double_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_ord IS 'EQL encrypted double (equality, ordering)';
+
+  --! @brief Encrypted domain public.double_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'double_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.double_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.double_ord_ope IS 'EQL encrypted double (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_eq_functions.sql
+--! @brief Functions for public.double_eq.
+
+--! @brief Index extractor for public.double_eq.
+--! @param a public.double_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.double_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.double_eq) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.double_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.double_eq) $$;
+
+--! @brief Operator wrapper for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.double_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_eq, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector text
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.double_eq, selector text)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector integer
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.double_eq, selector integer)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param selector public.double_eq
+--! @return public.double_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_eq)
+RETURNS public.double_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param selector public.double_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b public.double_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_eq, b public.double_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a public.double_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_eq.
+--! @param a jsonb
+--! @param b public.double_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/integer/integer_types.sql
+--! @brief Encrypted-domain types for integer.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.integer.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer IS 'EQL encrypted integer (storage only)';
+
+  --! @brief Encrypted domain public.integer_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_eq IS 'EQL encrypted integer (equality)';
+
+  --! @brief Encrypted domain public.integer_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_ord_ore IS 'EQL encrypted integer (equality, ordering)';
+
+  --! @brief Encrypted domain public.integer_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_ord IS 'EQL encrypted integer (equality, ordering)';
+
+  --! @brief Encrypted domain public.integer_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'integer_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.integer_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.integer_ord_ope IS 'EQL encrypted integer (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/text/text_types.sql
+--! @brief Encrypted-domain types for text.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.text.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text IS 'EQL encrypted text (storage only)';
+
+  --! @brief Encrypted domain public.text_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_eq IS 'EQL encrypted text (equality)';
+
+  --! @brief Encrypted domain public.text_match.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_match' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_match AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'bf'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_match IS 'EQL encrypted text (containment)';
+
+  --! @brief Encrypted domain public.text_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_ord_ore IS 'EQL encrypted text (equality, ordering)';
+
+  --! @brief Encrypted domain public.text_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_ord IS 'EQL encrypted text (equality, ordering)';
+
+  --! @brief Encrypted domain public.text_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_ord_ope IS 'EQL encrypted text (equality, ordering)';
+
+  --! @brief Encrypted domain public.text_search.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'text_search' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.text_search AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND VALUE ? 'bf'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.text_search IS 'EQL encrypted text (equality, ordering, containment)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_functions.sql
+--! @brief Functions for public.text_ord.
+
+--! @brief Index extractor for public.text_ord.
+--! @param a public.text_ord
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_ord.
+--! @param a public.text_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.text_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_ord) $$;
+
+--! @brief Operator wrapper for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector text
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord, selector text)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector integer
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord, selector integer)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param selector public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord)
+RETURNS public.text_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param selector public.text_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b public.text_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord, b public.text_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a public.text_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord.
+--! @param a jsonb
+--! @param b public.text_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @file v3/sem/bloom_filter/functions.sql
+--! @brief Extractor for the eql_v3 Bloom-filter SEM index term.
+--!
+--! jsonb-only subset of src/bloom_filter/functions.sql. The encrypted-column
+--! overloads are intentionally omitted — the eql_v3 scalar domains extract from
+--! the jsonb payload directly via a cast to the domain. (Doc comments
+--! deliberately avoid naming eql_v2 symbols so the self-containment grep stays
+--! clean.)
+
+--! @brief Test whether a jsonb payload carries a Bloom-filter (`bf`) term.
+--!
+--! @param val jsonb The encrypted payload.
+--! @return boolean True when the `bf` key is present and non-null.
+--!
+--! @internal Defined for parity with the eql_v3 SEM index-term predicates
+--! (`has_hmac_256` / `has_ore_block_256`); it is not currently called by
+--! the extractor below, which gates on value-shape inline, nor by the generated
+--! domain CHECK, which tests `bf` presence via the envelope-key skeleton. Kept
+--! as the canonical presence test for callers that need one.
+CREATE FUNCTION eql_v3_internal.has_bloom_filter(val jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    RETURN val ? 'bf' AND val ->> 'bf' IS NOT NULL;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract the Bloom-filter index term from a jsonb payload.
+--!
+--! Inlinable single-statement SQL — the planner can fold this into the calling
+--! query so the functional GIN index built on `eql_v3_internal.match_term(col)` (which
+--! calls this) engages structurally. Mirrors `eql_v3_internal.hmac_256(jsonb)`: no RAISE
+--! and no pinned `search_path`. Returns NULL when `bf` is absent or present but
+--! not a json array, rather than raising. The `text_match` domain CHECK
+--! guarantees the `bf` *key* is present but not that it is an array, so a
+--! non-array `bf` (e.g. `{"bf": null}`) can reach here even on a typed value;
+--! gating on `jsonb_typeof(...) = 'array'` returns NULL for that case — and for
+--! raw jsonb outside the domain — instead of erroring inside
+--! `jsonb_array_elements`. NULL, like the HMAC extractor, is the right answer. An
+--! empty `bf` array yields an empty filter (contains nothing, contained by
+--! everything), matching set-containment semantics.
+--!
+--! @param val jsonb The encrypted payload.
+--! @return eql_v3_internal.bloom_filter The `bf` array as a smallint[] domain value, or
+--!   NULL when `bf` is absent or not a json array.
+CREATE FUNCTION eql_v3_internal.bloom_filter(val jsonb)
+  RETURNS eql_v3_internal.bloom_filter
+  LANGUAGE sql
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE WHEN jsonb_typeof(val -> 'bf') = 'array'
+    THEN ARRAY(SELECT jsonb_array_elements(val -> 'bf'))::eql_v3_internal.bloom_filter
+  END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/timestamp/timestamp_types.sql
+--! @brief Encrypted-domain types for timestamp.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.timestamp.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp IS 'EQL encrypted timestamp (storage only)';
+
+  --! @brief Encrypted domain public.timestamp_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_eq IS 'EQL encrypted timestamp (equality)';
+
+  --! @brief Encrypted domain public.timestamp_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL encrypted timestamp (equality, ordering)';
+
+  --! @brief Encrypted domain public.timestamp_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_ord IS 'EQL encrypted timestamp (equality, ordering)';
+
+  --! @brief Encrypted domain public.timestamp_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.timestamp_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL encrypted timestamp (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_eq_functions.sql
+--! @brief Functions for public.timestamp_eq.
+
+--! @brief Index extractor for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.timestamp_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.timestamp_eq) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.timestamp_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.timestamp_eq) $$;
+
+--! @brief Operator wrapper for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.timestamp_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector text
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_eq, selector text)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector integer
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_eq, selector integer)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param selector public.timestamp_eq
+--! @return public.timestamp_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_eq)
+RETURNS public.timestamp_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param selector public.timestamp_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b public.timestamp_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_eq, b public.timestamp_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_eq.
+--! @param a jsonb
+--! @param b public.timestamp_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @file v3/sem/ope_cllw/types.sql
+--! @brief CLLW OPE index term type for scalar range queries (eql_v3 SEM)
+--!
+--! Domain type representing a CLLW (Copyless Logarithmic Width)
+--! Order-Preserving Encryption term. The ciphertext is stored hex-encoded in
+--! the `op` field of encrypted scalar payloads (the `_ord_ope` domains); the
+--! domain carries the hex-decoded bytes.
+--!
+--! A DOMAIN over bytea, not a composite: the OPE ciphertext is
+--! order-preserving under plain byte comparison, so the domain inherits
+--! bytea's native comparison operators and DEFAULT btree operator class
+--! outright — no hand-written operators, comparator, or operator class (the
+--! same pattern as eql_v3_internal.hmac_256 over text). That keeps the whole
+--! comparison chain inlinable, so a functional btree index on
+--! `eql_v3.ord_ope_term(col)` engages structurally for the `_ord_ope`
+--! domains' comparison operators. Contrast eql_v3_internal.ore_cllw (`oc`), the SteVec
+--! CLLW-*ORE* composite compared by a custom per-byte protocol.
+--!
+--! @note Transient type used only during query execution.
+--! @see eql_v3_internal.ope_cllw
+CREATE DOMAIN eql_v3_internal.ope_cllw AS bytea;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/bigint/bigint_types.sql
+--! @brief Encrypted-domain types for bigint.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.bigint.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint IS 'EQL encrypted bigint (storage only)';
+
+  --! @brief Encrypted domain public.bigint_eq.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_eq' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'hm'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_eq IS 'EQL encrypted bigint (equality)';
+
+  --! @brief Encrypted domain public.bigint_ord_ore.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_ord_ore' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_ord_ore IS 'EQL encrypted bigint (equality, ordering)';
+
+  --! @brief Encrypted domain public.bigint_ord.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_ord' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'ob'
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_ord IS 'EQL encrypted bigint (equality, ordering)';
+
+  --! @brief Encrypted domain public.bigint_ord_ope.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'bigint_ord_ope' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.bigint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE ? 'op'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.bigint_ord_ope IS 'EQL encrypted bigint (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_functions.sql
+--! @brief Functions for public.bigint.
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector text
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint, selector text)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector integer
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint, selector integer)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param selector public.bigint
+--! @return public.bigint
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint)
+RETURNS public.bigint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param selector public.bigint
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b public.bigint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint, b public.bigint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a public.bigint
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint.
+--! @param a jsonb
+--! @param b public.bigint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_functions.sql
+--! @brief Functions for public.bigint_ord.
+
+--! @brief Index extractor for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.bigint_ord) $$;
+
+--! @brief Operator wrapper for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector text
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord, selector text)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector integer
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord, selector integer)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param selector public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord)
+RETURNS public.bigint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param selector public.bigint_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b public.bigint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord, b public.bigint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a public.bigint_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord.
+--! @param a jsonb
+--! @param b public.bigint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/bigint/query_bigint_types.sql
+--! @brief Query-operand domains for bigint (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_bigint_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_bigint_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_eq IS 'EQL bigint query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_bigint_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_ord_ore IS 'EQL bigint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_bigint_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_ord IS 'EQL bigint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_bigint_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_bigint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_bigint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_bigint_ord_ope IS 'EQL bigint query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ore_functions.sql
+--! @brief Functions for public.bigint_ord_ore.
+
+--! @brief Index extractor for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.bigint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.bigint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.bigint_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector text
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ore, selector text)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector integer
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ore, selector integer)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ore.
+--! @param a jsonb
+--! @param b public.bigint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @file v3/sem/ope_cllw/functions.sql
+--! @brief CLLW OPE index-term extraction from a jsonb payload (eql_v3 SEM).
+
+--! @brief Extract CLLW OPE index term from JSONB payload
+--!
+--! Returns the CLLW OPE ciphertext from the `op` field of an encrypted scalar
+--! payload, hex-decoded to the bytea-backed eql_v3_internal.ope_cllw domain.
+--!
+--! Inlinable single-statement SQL — the body is a strict expression of the
+--! argument (`->>` and `decode` are both STRICT), so the planner folds this
+--! into the calling query and functional btree indexes built on
+--! `eql_v3.ord_ope_term(col)` (which calls this) engage structurally, the
+--! same way the hmac_256 equality chain does.
+--!
+--! **Missing-`op` semantics**: `val ->> 'op'` is NULL when `op` is absent and
+--! the strict chain propagates it, so the extractor returns SQL NULL and
+--! btree's NULL handling filters those rows from range queries.
+--!
+--! @param val jsonb containing encrypted EQL payload
+--! @return eql_v3_internal.ope_cllw Hex-decoded CLLW OPE term, or NULL when `op` is
+--!         absent
+CREATE FUNCTION eql_v3_internal.ope_cllw(val jsonb)
+  RETURNS eql_v3_internal.ope_cllw
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT decode(val ->> 'op', 'hex')::eql_v3_internal.ope_cllw
+$$;
+
+COMMENT ON FUNCTION eql_v3_internal.ope_cllw(jsonb) IS
+  'eql-inline-critical: raw-jsonb CLLW OPE extractor; must stay inlinable (unpinned search_path)';
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ore_operators.sql
+--! @brief Operators for public.bigint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = public.bigint_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_operators.sql
+--! @brief Operators for public.bigint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord, RIGHTARG = public.bigint_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_functions.sql
+--! @brief Functions for eql_v3.query_bigint_ord.
+
+--! @brief Index extractor for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_bigint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a public.bigint_ord
+--! @param b eql_v3.query_bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord, b eql_v3.query_bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord.
+--! @param a eql_v3.query_bigint_ord
+--! @param b public.bigint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord, b public.bigint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/real/query_real_types.sql
+--! @brief Query-operand domains for real (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_real_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_real_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_eq IS 'EQL real query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_real_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_ord_ore IS 'EQL real query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_real_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_ord IS 'EQL real query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_real_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_real_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_real_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_real_ord_ope IS 'EQL real query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_real_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_real_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a public.real_ord_ore
+--! @param b eql_v3.query_real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ore, b eql_v3.query_real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ore.
+--! @param a eql_v3.query_real_ord_ore
+--! @param b public.real_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord_ore, b public.real_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_functions.sql
+--! @brief Functions for public.real_ord.
+
+--! @brief Index extractor for public.real_ord.
+--! @param a public.real_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.real_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.real_ord) $$;
+
+--! @brief Operator wrapper for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.real_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector text
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord, selector text)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector integer
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord, selector integer)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param selector public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord)
+RETURNS public.real_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param selector public.real_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b public.real_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord, b public.real_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a public.real_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord.
+--! @param a jsonb
+--! @param b public.real_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_eq_functions.sql
+--! @brief Functions for public.real_eq.
+
+--! @brief Index extractor for public.real_eq.
+--! @param a public.real_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.real_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.real_eq) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.real_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.real_eq) $$;
+
+--! @brief Operator wrapper for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.real_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_eq, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector text
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.real_eq, selector text)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector integer
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.real_eq, selector integer)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param selector public.real_eq
+--! @return public.real_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_eq)
+RETURNS public.real_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param selector public.real_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b public.real_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_eq, b public.real_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a public.real_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_eq.
+--! @param a jsonb
+--! @param b public.real_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ope_functions.sql
+--! @brief Functions for public.real_ord_ope.
+
+--! @brief Index extractor for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.real_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.real_ord_ope) $$;
+
+--! @brief Operator wrapper for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.real_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector text
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ope, selector text)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector integer
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.real_ord_ope, selector integer)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param selector public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real_ord_ope)
+RETURNS public.real_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param selector public.real_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b public.real_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ope, b public.real_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real_ord_ope.
+--! @param a jsonb
+--! @param b public.real_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_eq_functions.sql
+--! @brief Functions for eql_v3.query_real_eq.
+
+--! @brief Index extractor for eql_v3.query_real_eq.
+--! @param a eql_v3.query_real_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_real_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a public.real_eq
+--! @param b eql_v3.query_real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_eq, b eql_v3.query_real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a eql_v3.query_real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a public.real_eq
+--! @param b eql_v3.query_real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_eq, b eql_v3.query_real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_eq.
+--! @param a eql_v3.query_real_eq
+--! @param b public.real_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_eq, b public.real_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_real_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_real_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a public.real_ord_ope
+--! @param b eql_v3.query_real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord_ope, b eql_v3.query_real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord_ope.
+--! @param a eql_v3.query_real_ord_ope
+--! @param b public.real_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord_ope, b public.real_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ore_functions.sql
+--! @brief Functions for public.smallint_ord_ore.
+
+--! @brief Index extractor for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.smallint_ord_ore) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector text
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ore, selector text)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector integer
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ore, selector integer)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ore.
+--! @param a jsonb
+--! @param b public.smallint_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ore_operators.sql
+--! @brief Operators for public.smallint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = public.smallint_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/smallint/query_smallint_types.sql
+--! @brief Query-operand domains for smallint (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_smallint_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_smallint_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_eq IS 'EQL smallint query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_smallint_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_ord_ore IS 'EQL smallint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_smallint_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_ord IS 'EQL smallint query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_smallint_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_smallint_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_smallint_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_smallint_ord_ope IS 'EQL smallint query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ope_functions.sql
+--! @brief Functions for public.smallint_ord_ope.
+
+--! @brief Index extractor for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.smallint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.smallint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.smallint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector text
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ope, selector text)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector integer
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord_ope, selector integer)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param selector public.smallint_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord_ope.
+--! @param a jsonb
+--! @param b public.smallint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_functions.sql
+--! @brief Functions for public.smallint_ord.
+
+--! @brief Index extractor for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.smallint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.smallint_ord) $$;
+
+--! @brief Operator wrapper for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.smallint_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector text
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord, selector text)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector integer
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint_ord, selector integer)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param selector public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint_ord)
+RETURNS public.smallint_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param selector public.smallint_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b public.smallint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord, b public.smallint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a public.smallint_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint_ord.
+--! @param a jsonb
+--! @param b public.smallint_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_eq_functions.sql
+--! @brief Functions for eql_v3.query_smallint_eq.
+
+--! @brief Index extractor for eql_v3.query_smallint_eq.
+--! @param a eql_v3.query_smallint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_smallint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a public.smallint_eq
+--! @param b eql_v3.query_smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_eq, b eql_v3.query_smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a eql_v3.query_smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a public.smallint_eq
+--! @param b eql_v3.query_smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_eq, b eql_v3.query_smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_eq.
+--! @param a eql_v3.query_smallint_eq
+--! @param b public.smallint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_eq, b public.smallint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_functions.sql
+--! @brief Functions for eql_v3.query_smallint_ord.
+
+--! @brief Index extractor for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_smallint_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a public.smallint_ord
+--! @param b eql_v3.query_smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord, b eql_v3.query_smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord.
+--! @param a eql_v3.query_smallint_ord
+--! @param b public.smallint_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord, b public.smallint_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_functions.sql
+--! @brief Functions for public.smallint.
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.smallint, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.smallint)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector text
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint, selector text)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector integer
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a public.smallint, selector integer)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param selector public.smallint
+--! @return public.smallint
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.smallint)
+RETURNS public.smallint IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.smallint, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param selector public.smallint
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.smallint)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.smallint, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.smallint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.smallint, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.smallint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.smallint, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.smallint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.smallint, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.smallint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.smallint, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b public.smallint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint, b public.smallint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a public.smallint
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.smallint, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.smallint.
+--! @param a jsonb
+--! @param b public.smallint
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.smallint)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.smallint'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ope_operators.sql
+--! @brief Operators for public.smallint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = public.smallint_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_functions.sql
+--! @brief Functions for public.date_ord.
+
+--! @brief Index extractor for public.date_ord.
+--! @param a public.date_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.date_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.date_ord) $$;
+
+--! @brief Operator wrapper for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector text
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord, selector text)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector integer
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord, selector integer)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param selector public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord)
+RETURNS public.date_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param selector public.date_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b public.date_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord, b public.date_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a public.date_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord.
+--! @param a jsonb
+--! @param b public.date_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/date/query_date_types.sql
+--! @brief Query-operand domains for date (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_date_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_date_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_eq IS 'EQL date query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_date_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_ord_ore IS 'EQL date query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_date_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_ord IS 'EQL date query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_date_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_date_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_date_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_date_ord_ope IS 'EQL date query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_functions.sql
+--! @brief Functions for eql_v3.query_date_ord.
+
+--! @brief Index extractor for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_date_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a public.date_ord
+--! @param b eql_v3.query_date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord, b eql_v3.query_date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord.
+--! @param a eql_v3.query_date_ord
+--! @param b public.date_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord, b public.date_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ore_functions.sql
+--! @brief Functions for public.date_ord_ore.
+
+--! @brief Index extractor for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.date_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.date_ord_ore) $$;
+
+--! @brief Operator wrapper for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.date_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector text
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ore, selector text)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector integer
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ore, selector integer)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param selector public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord_ore)
+RETURNS public.date_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param selector public.date_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b public.date_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ore, b public.date_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ore.
+--! @param a jsonb
+--! @param b public.date_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ope_functions.sql
+--! @brief Functions for public.date_ord_ope.
+
+--! @brief Index extractor for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.date_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.date_ord_ope) $$;
+
+--! @brief Operator wrapper for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.date_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector text
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ope, selector text)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector integer
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.date_ord_ope, selector integer)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param selector public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_ord_ope)
+RETURNS public.date_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param selector public.date_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b public.date_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ope, b public.date_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_ord_ope.
+--! @param a jsonb
+--! @param b public.date_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_eq_functions.sql
+--! @brief Functions for public.date_eq.
+
+--! @brief Index extractor for public.date_eq.
+--! @param a public.date_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.date_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.date_eq) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.date_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.date_eq) $$;
+
+--! @brief Operator wrapper for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.date_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_eq, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector text
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.date_eq, selector text)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector integer
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.date_eq, selector integer)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param selector public.date_eq
+--! @return public.date_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date_eq)
+RETURNS public.date_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param selector public.date_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b public.date_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_eq, b public.date_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a public.date_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date_eq.
+--! @param a jsonb
+--! @param b public.date_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_functions.sql
+--! @brief Functions for public.date.
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.date, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.date)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector text
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a public.date, selector text)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector integer
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a public.date, selector integer)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param selector public.date
+--! @return public.date
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.date)
+RETURNS public.date IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.date, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param selector public.date
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.date)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.date, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.date, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.date, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.date, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.date, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.date, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.date, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.date, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.date, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b public.date
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date, b public.date)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a public.date
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.date, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.date.
+--! @param a jsonb
+--! @param b public.date
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.date)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.date'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ore_operators.sql
+--! @brief Operators for public.date_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ore, RIGHTARG = public.date_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ope_operators.sql
+--! @brief Operators for public.date_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ope, RIGHTARG = public.date_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/numeric/query_numeric_types.sql
+--! @brief Query-operand domains for numeric (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_numeric_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_numeric_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_eq IS 'EQL numeric query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_numeric_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_ord_ore IS 'EQL numeric query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_numeric_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_ord IS 'EQL numeric query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_numeric_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_numeric_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_numeric_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_numeric_ord_ope IS 'EQL numeric query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_eq_functions.sql
+--! @brief Functions for public.numeric_eq.
+
+--! @brief Index extractor for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.numeric_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.numeric_eq) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.numeric_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.numeric_eq) $$;
+
+--! @brief Operator wrapper for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.numeric_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_eq, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector text
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_eq, selector text)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector integer
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_eq, selector integer)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param selector public.numeric_eq
+--! @return public.numeric_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_eq)
+RETURNS public.numeric_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param selector public.numeric_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b public.numeric_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_eq, b public.numeric_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a public.numeric_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_eq.
+--! @param a jsonb
+--! @param b public.numeric_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_functions.sql
+--! @brief Functions for public.numeric_ord.
+
+--! @brief Index extractor for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.numeric_ord) $$;
+
+--! @brief Operator wrapper for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector text
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord, selector text)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector integer
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord, selector integer)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param selector public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord)
+RETURNS public.numeric_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param selector public.numeric_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b public.numeric_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord, b public.numeric_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a public.numeric_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord.
+--! @param a jsonb
+--! @param b public.numeric_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_functions.sql
+--! @brief Functions for eql_v3.query_numeric_ord.
+
+--! @brief Index extractor for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_numeric_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a public.numeric_ord
+--! @param b eql_v3.query_numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord, b eql_v3.query_numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord.
+--! @param a eql_v3.query_numeric_ord
+--! @param b public.numeric_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord, b public.numeric_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ore_functions.sql
+--! @brief Functions for public.numeric_ord_ore.
+
+--! @brief Index extractor for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.numeric_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.numeric_ord_ore) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.numeric_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector text
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ore, selector text)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector integer
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ore, selector integer)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ore.
+--! @param a jsonb
+--! @param b public.numeric_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_numeric_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_numeric_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a public.numeric_ord_ore
+--! @param b eql_v3.query_numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ore, b eql_v3.query_numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ore.
+--! @param a eql_v3.query_numeric_ord_ore
+--! @param b public.numeric_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord_ore, b public.numeric_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ope_functions.sql
+--! @brief Functions for public.numeric_ord_ope.
+
+--! @brief Index extractor for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.numeric_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.numeric_ord_ope) $$;
+
+--! @brief Operator wrapper for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.numeric_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector text
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ope, selector text)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector integer
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric_ord_ope, selector integer)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param selector public.numeric_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric_ord_ope.
+--! @param a jsonb
+--! @param b public.numeric_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_numeric_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_numeric_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a public.numeric_ord_ope
+--! @param b eql_v3.query_numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.numeric_ord_ope, b eql_v3.query_numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_ord_ope.
+--! @param a eql_v3.query_numeric_ord_ope
+--! @param b public.numeric_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_numeric_ord_ope, b public.numeric_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ore_operators.sql
+--! @brief Operators for public.numeric_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = public.numeric_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ope_operators.sql
+--! @brief Operators for public.numeric_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = public.numeric_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/double/query_double_types.sql
+--! @brief Query-operand domains for double (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_double_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_double_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_eq IS 'EQL double query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_double_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_ord_ore IS 'EQL double query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_double_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_ord IS 'EQL double query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_double_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_double_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_double_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_double_ord_ope IS 'EQL double query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_functions.sql
+--! @brief Functions for public.double_ord.
+
+--! @brief Index extractor for public.double_ord.
+--! @param a public.double_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.double_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.double_ord) $$;
+
+--! @brief Operator wrapper for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector text
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord, selector text)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector integer
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord, selector integer)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param selector public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord)
+RETURNS public.double_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param selector public.double_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b public.double_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord, b public.double_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a public.double_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord.
+--! @param a jsonb
+--! @param b public.double_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ore_functions.sql
+--! @brief Functions for public.double_ord_ore.
+
+--! @brief Index extractor for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.double_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.double_ord_ore) $$;
+
+--! @brief Operator wrapper for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.double_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector text
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ore, selector text)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector integer
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ore, selector integer)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param selector public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord_ore)
+RETURNS public.double_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param selector public.double_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b public.double_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ore, b public.double_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ore.
+--! @param a jsonb
+--! @param b public.double_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ope_functions.sql
+--! @brief Functions for public.double_ord_ope.
+
+--! @brief Index extractor for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.double_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.double_ord_ope) $$;
+
+--! @brief Operator wrapper for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.double_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector text
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ope, selector text)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector integer
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.double_ord_ope, selector integer)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param selector public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double_ord_ope)
+RETURNS public.double_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param selector public.double_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b public.double_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ope, b public.double_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double_ord_ope.
+--! @param a jsonb
+--! @param b public.double_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_operators.sql
+--! @brief Operators for public.double_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord, RIGHTARG = public.double_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ope_operators.sql
+--! @brief Operators for public.double_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ope, RIGHTARG = public.double_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_functions.sql
+--! @brief Functions for public.double.
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.double, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.double)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector text
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a public.double, selector text)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector integer
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a public.double, selector integer)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param selector public.double
+--! @return public.double
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.double)
+RETURNS public.double IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.double, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param selector public.double
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.double)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.double, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.double, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.double, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.double, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.double, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.double, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.double, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.double, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.double, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b public.double
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double, b public.double)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a public.double
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.double, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.double.
+--! @param a jsonb
+--! @param b public.double
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.double)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.double'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_eq_functions.sql
+--! @brief Functions for eql_v3.query_double_eq.
+
+--! @brief Index extractor for eql_v3.query_double_eq.
+--! @param a eql_v3.query_double_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_double_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a public.double_eq
+--! @param b eql_v3.query_double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_eq, b eql_v3.query_double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a eql_v3.query_double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a public.double_eq
+--! @param b eql_v3.query_double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_eq, b eql_v3.query_double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_eq.
+--! @param a eql_v3.query_double_eq
+--! @param b public.double_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_eq, b public.double_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ore_operators.sql
+--! @brief Operators for public.double_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ore, RIGHTARG = public.double_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_eq_functions.sql
+--! @brief Functions for public.integer_eq.
+
+--! @brief Index extractor for public.integer_eq.
+--! @param a public.integer_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.integer_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.integer_eq) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.integer_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.integer_eq) $$;
+
+--! @brief Operator wrapper for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.integer_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_eq, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector text
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_eq, selector text)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector integer
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_eq, selector integer)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param selector public.integer_eq
+--! @return public.integer_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_eq)
+RETURNS public.integer_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param selector public.integer_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b public.integer_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_eq, b public.integer_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a public.integer_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_eq.
+--! @param a jsonb
+--! @param b public.integer_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_functions.sql
+--! @brief Functions for public.integer_ord.
+
+--! @brief Index extractor for public.integer_ord.
+--! @param a public.integer_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.integer_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.integer_ord) $$;
+
+--! @brief Operator wrapper for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector text
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord, selector text)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector integer
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord, selector integer)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param selector public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord)
+RETURNS public.integer_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param selector public.integer_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b public.integer_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord, b public.integer_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a public.integer_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord.
+--! @param a jsonb
+--! @param b public.integer_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_operators.sql
+--! @brief Operators for public.integer_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord, RIGHTARG = public.integer_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ore_functions.sql
+--! @brief Functions for public.integer_ord_ore.
+
+--! @brief Index extractor for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.integer_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.integer_ord_ore) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.integer_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector text
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ore, selector text)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector integer
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ore, selector integer)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param selector public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord_ore)
+RETURNS public.integer_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param selector public.integer_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ore, b public.integer_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ore.
+--! @param a jsonb
+--! @param b public.integer_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ore_operators.sql
+--! @brief Operators for public.integer_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = public.integer_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/integer/query_integer_types.sql
+--! @brief Query-operand domains for integer (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_integer_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_integer_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_eq IS 'EQL integer query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_integer_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_ord_ore IS 'EQL integer query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_integer_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_ord IS 'EQL integer query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_integer_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_integer_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_integer_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_integer_ord_ope IS 'EQL integer query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ope_functions.sql
+--! @brief Functions for public.integer_ord_ope.
+
+--! @brief Index extractor for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.integer_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.integer_ord_ope) $$;
+
+--! @brief Operator wrapper for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.integer_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector text
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ope, selector text)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector integer
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.integer_ord_ope, selector integer)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param selector public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer_ord_ope)
+RETURNS public.integer_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param selector public.integer_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ope, b public.integer_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer_ord_ope.
+--! @param a jsonb
+--! @param b public.integer_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_functions.sql
+--! @brief Functions for public.integer.
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.integer, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.integer)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector text
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a public.integer, selector text)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector integer
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a public.integer, selector integer)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param selector public.integer
+--! @return public.integer
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.integer)
+RETURNS public.integer IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.integer, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param selector public.integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.integer, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.integer, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.integer, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.integer, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.integer, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.integer, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.integer, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.integer, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.integer, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b public.integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer, b public.integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a public.integer
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.integer, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.integer.
+--! @param a jsonb
+--! @param b public.integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.integer'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_eq_functions.sql
+--! @brief Functions for eql_v3.query_integer_eq.
+
+--! @brief Index extractor for eql_v3.query_integer_eq.
+--! @param a eql_v3.query_integer_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_integer_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a public.integer_eq
+--! @param b eql_v3.query_integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_eq, b eql_v3.query_integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a eql_v3.query_integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a public.integer_eq
+--! @param b eql_v3.query_integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_eq, b eql_v3.query_integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_eq.
+--! @param a eql_v3.query_integer_eq
+--! @param b public.integer_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_eq, b public.integer_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/text/query_text_types.sql
+--! @brief Query-operand domains for text (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_text_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_text_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_eq IS 'EQL text query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_text_match (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_match' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_match AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'bf'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_match IS 'EQL text query operand (containment)';
+
+  --! @brief Query-operand domain eql_v3.query_text_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_ord_ore IS 'EQL text query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_text_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_ord IS 'EQL text query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_text_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_ord_ope IS 'EQL text query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_text_search (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_text_search' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_text_search AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND VALUE ? 'ob'
+        AND VALUE ? 'bf'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_text_search IS 'EQL text query operand (equality, ordering, containment)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_match_functions.sql
+--! @brief Functions for public.text_match.
+
+--! @brief Index extractor for public.text_match.
+--! @param a public.text_match
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a public.text_match)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_match, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_match, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text_match)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_match, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::public.text_match) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a jsonb, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_match) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::public.text_match) $$;
+
+--! @brief Operator wrapper for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a jsonb, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_match) <@ eql_v3.match_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector text
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a public.text_match, selector text)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector integer
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a public.text_match, selector integer)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param selector public.text_match
+--! @return public.text_match
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_match)
+RETURNS public.text_match IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_match, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_match, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param selector public.text_match
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_match)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_match, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_match, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_match, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_match, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_match, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_match, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_match, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_match, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_match, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b public.text_match
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_match, b public.text_match)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a public.text_match
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_match, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_match.
+--! @param a jsonb
+--! @param b public.text_match
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_match)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_match'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ope_functions.sql
+--! @brief Functions for public.text_ord_ope.
+
+--! @brief Index extractor for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ope)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.text_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ope) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ope) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.text_ord_ope) $$;
+
+--! @brief Operator wrapper for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.text_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector text
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ope, selector text)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector integer
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ope, selector integer)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param selector public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord_ope)
+RETURNS public.text_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param selector public.text_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b public.text_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ope, b public.text_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ope.
+--! @param a jsonb
+--! @param b public.text_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_functions.sql
+--! @brief Functions for eql_v3.query_text_ord.
+
+--! @brief Index extractor for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a public.text_ord
+--! @param b eql_v3.query_text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord, b eql_v3.query_text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord.
+--! @param a eql_v3.query_text_ord
+--! @param b public.text_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord, b public.text_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ore_functions.sql
+--! @brief Functions for public.text_ord_ore.
+
+--! @brief Index extractor for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_ord_ore)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.text_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ore) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_ord_ore) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_ord_ore) $$;
+
+--! @brief Operator wrapper for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector text
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ore, selector text)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector integer
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.text_ord_ore, selector integer)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param selector public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_ord_ore)
+RETURNS public.text_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param selector public.text_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b public.text_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ore, b public.text_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_ord_ore.
+--! @param a jsonb
+--! @param b public.text_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_eq_functions.sql
+--! @brief Functions for public.text_eq.
+
+--! @brief Index extractor for public.text_eq.
+--! @param a public.text_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_eq) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_eq) $$;
+
+--! @brief Operator wrapper for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_eq, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector text
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.text_eq, selector text)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector integer
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.text_eq, selector integer)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param selector public.text_eq
+--! @return public.text_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_eq)
+RETURNS public.text_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param selector public.text_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b public.text_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_eq, b public.text_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a public.text_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_eq.
+--! @param a jsonb
+--! @param b public.text_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_search_functions.sql
+--! @brief Functions for public.text_search.
+
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.text_search)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.text_search)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Index extractor for public.text_search.
+--! @param a public.text_search
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a public.text_search)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_search) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.text_search) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.text_search) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_search) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b::public.text_search) $$;
+
+--! @brief Operator wrapper for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a jsonb, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a::public.text_search) <@ eql_v3.match_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector text
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a public.text_search, selector text)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector integer
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a public.text_search, selector integer)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a jsonb
+--! @param selector public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text_search)
+RETURNS public.text_search IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_search, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text_search, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a jsonb
+--! @param selector public.text_search
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text_search)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text_search, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text_search, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text_search, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text_search, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text_search, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text_search, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text_search, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text_search, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text_search, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b public.text_search
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_search, b public.text_search)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a public.text_search
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text_search, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text_search.
+--! @param a jsonb
+--! @param b public.text_search
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text_search)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text_search'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ore_operators.sql
+--! @brief Operators for public.text_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ore, RIGHTARG = public.text_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_operators.sql
+--! @brief Operators for public.text_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord, RIGHTARG = public.text_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ore_functions.sql
+--! @brief Functions for public.timestamp_ord_ore.
+
+--! @brief Index extractor for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.timestamp_ord_ore) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord_ore) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ore, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord_ore)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector text
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ore, selector text)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector integer
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ore, selector integer)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ore, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ore, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ore
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord_ore)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord_ore, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord_ore, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord_ore, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord_ore, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord_ore, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ore, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ore.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ore
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord_ore)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ore'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_functions.sql
+--! @brief Functions for public.timestamp_ord.
+
+--! @brief Index extractor for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a public.timestamp_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b::public.timestamp_ord) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a::public.timestamp_ord) >= eql_v3.ord_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector text
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord, selector text)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector integer
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord, selector integer)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param selector public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord)
+RETURNS public.timestamp_ord IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param selector public.timestamp_ord
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b public.timestamp_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord, b public.timestamp_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord.
+--! @param a jsonb
+--! @param b public.timestamp_ord
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_operators.sql
+--! @brief Operators for public.timestamp_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord, RIGHTARG = public.timestamp_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/timestamp/query_timestamp_types.sql
+--! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext).
+--! @note Query-operand domains live in `eql_v3` (not `public`): they are
+--!       never valid column types, so they don't belong in the column-type
+--!       namespace, and dropping the EQL-owned schema can never drop an
+--!       application column.
+--! @note Cast a query operand explicitly to its `query_` domain in a predicate
+--!       (e.g. `WHERE col = $1::eql_v3.query_timestamp_eq`). A bare,
+--!       uncast literal RHS is ambiguous between the `query_` and `jsonb`
+--!       operator overloads and will not resolve.
+
+DO $$
+BEGIN
+  --! @brief Query-operand domain eql_v3.query_timestamp_eq (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_eq AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'hm'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_eq IS 'EQL timestamp query operand (equality)';
+
+  --! @brief Query-operand domain eql_v3.query_timestamp_ord_ore (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_ord_ore AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_timestamp_ord (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_ord AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'ob'
+        AND NOT (VALUE ? 'c')
+        AND jsonb_typeof(VALUE -> 'ob') = 'array'
+        AND jsonb_array_length(VALUE -> 'ob') > 0
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)';
+
+  --! @brief Query-operand domain eql_v3.query_timestamp_ord_ope (term-only; no `c`).
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_timestamp_ord_ope AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'op'
+        AND NOT (VALUE ? 'c')
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_eq_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_eq.
+
+--! @brief Index extractor for eql_v3.query_timestamp_eq.
+--! @param a eql_v3.query_timestamp_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_timestamp_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b eql_v3.query_timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_eq, b eql_v3.query_timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a eql_v3.query_timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a public.timestamp_eq
+--! @param b eql_v3.query_timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_eq, b eql_v3.query_timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_eq.
+--! @param a eql_v3.query_timestamp_eq
+--! @param b public.timestamp_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_eq, b public.timestamp_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ope_functions.sql
+--! @brief Functions for public.timestamp_ord_ope.
+
+--! @brief Index extractor for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.timestamp_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.timestamp_ord_ope) $$;
+
+--! @brief Operator wrapper for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.timestamp_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector text
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ope, selector text)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector integer
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp_ord_ope, selector integer)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param selector public.timestamp_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp_ord_ope.
+--! @param a jsonb
+--! @param b public.timestamp_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ope_operators.sql
+--! @brief Operators for public.timestamp_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ore_operators.sql
+--! @brief Operators for public.timestamp_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore
+);
+
+--! @file v3/sem/ore_cllw/types.sql
+--! @brief CLLW ORE index term type for STE-vec range queries (eql_v3 SEM)
+--!
+--! Composite type for CLLW (Copyless Logarithmic Width) Order-Revealing
+--! Encryption. The ciphertext is stored in the `oc` field of encrypted data
+--! payloads (Standard-mode `ste_vec` elements). Used by the range operators
+--! (`<`, `<=`, `>`, `>=`) when an sv element carries an `oc` term.
+--!
+--! The wire-format `oc` value is a hex string with a leading domain-tag byte
+--! (`0x00` numeric, `0x01` string) followed by the CLLW ciphertext. The
+--! decoded `bytes` field carries the full byte string including the tag — the
+--! comparator is variable-length capable, so numeric and string values within
+--! the same column order correctly: the domain tag separates the ranges
+--! (numeric < string) and the within-domain comparison falls through to the
+--! CLLW per-byte protocol.
+--!
+--! @note This is a transient type used only during query execution.
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE TYPE eql_v3_internal.ore_cllw AS (
+  bytes bytea
+);
+
+--! @file v3/sem/ore_cllw/functions.sql
+--! @brief CLLW ORE index-term extraction and comparison (eql_v3 SEM).
+
+--! @brief Extract CLLW ORE index term from raw jsonb
+--!
+--! Returns the CLLW ORE ciphertext from the `oc` field of a single sv element
+--! supplied as raw jsonb. Inlinable single-statement SQL — the planner folds
+--! the body into the calling query.
+--!
+--! **Missing-`oc` semantics**: returns SQL-level NULL (not a composite with
+--! NULL bytes) when `oc` is absent, so btree's NULL handling filters those
+--! rows from range queries.
+--!
+--! @param val jsonb An object carrying an `oc` field
+--! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL
+--!         when the `oc` field is absent.
+--! @see eql_v3_internal.has_ore_cllw
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw(val jsonb)
+  RETURNS eql_v3_internal.ore_cllw
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE WHEN val ->> 'oc' IS NULL THEN NULL
+              ELSE ROW(decode(val ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw
+         END
+$$;
+
+COMMENT ON FUNCTION eql_v3_internal.ore_cllw(jsonb) IS
+  'eql-inline-critical: raw-jsonb CLLW extractor; must stay inlinable (unpinned search_path)';
+
+--! @brief Check if a raw jsonb value contains a CLLW ORE index term
+--! @param val jsonb An object that may carry an `oc` field
+--! @return boolean True if `oc` field is present and non-null
+CREATE FUNCTION eql_v3_internal.has_ore_cllw(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT val ->> 'oc' IS NOT NULL
+$$;
+
+COMMENT ON FUNCTION eql_v3_internal.has_ore_cllw(jsonb) IS
+  'eql-inline-critical: raw-jsonb CLLW presence helper; must stay inlinable (unpinned search_path)';
+
+--! @brief CLLW per-byte comparison helper
+--! @internal
+--!
+--! Byte-by-byte comparison implementing the CLLW order-revealing protocol.
+--! Identify the index of the first differing byte; if `(y_byte + 1) == x_byte`
+--! (mod 256) there, then x > y; otherwise x < y. Equal inputs return 0. Inputs
+--! MUST be the same length (the caller guarantees this). Stays `LANGUAGE
+--! plpgsql` — the per-byte loop can't be a single inlinable SQL expression.
+--!
+--! @param a bytea First CLLW ciphertext slice
+--! @param b bytea Second CLLW ciphertext slice
+--! @return integer -1, 0, or 1
+--! @throws Exception if inputs are different lengths
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term_bytes(a bytea, b bytea)
+RETURNS int
+  SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+    len_a INT;
+    len_b INT;
+    i INT;
+    first_diff INT := 0;
+BEGIN
+
+    len_a := LENGTH(a);
+    len_b := LENGTH(b);
+
+    IF len_a != len_b THEN
+      RAISE EXCEPTION 'ore_cllw index terms are not the same length';
+    END IF;
+
+    FOR i IN 1..len_a LOOP
+        IF first_diff = 0 AND get_byte(a, i - 1) != get_byte(b, i - 1) THEN
+            first_diff := i;
+        END IF;
+    END LOOP;
+
+    IF first_diff = 0 THEN
+        RETURN 0;
+    END IF;
+
+    IF ((get_byte(b, first_diff - 1) + 1) & 255) = get_byte(a, first_diff - 1) THEN
+        RETURN 1;
+    ELSE
+        RETURN -1;
+    END IF;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Variable-length CLLW ORE term comparison
+--! @internal
+--!
+--! Three-way comparison of two CLLW ORE ciphertext terms of potentially
+--! different lengths. Compares the shared prefix via the CLLW per-byte
+--! protocol; on equal prefixes, the shorter input sorts first. The leading
+--! domain-tag byte makes numeric (`0x00`) sort before string (`0x01`). Stays
+--! `LANGUAGE plpgsql` because it dispatches to `compare_ore_cllw_term_bytes`.
+--!
+--! btree filters NULL composites at the row level, so this should never see a
+--! NULL composite under normal operation; the IS-NULL guard returns NULL
+--! defensively. A non-NULL composite with NULL `bytes` is a contract violation
+--! — the extractor returns SQL NULL (not ROW(NULL)) on missing `oc`, so raise
+--! loudly rather than silently misorder.
+--!
+--! @param a eql_v3_internal.ore_cllw First term
+--! @param b eql_v3_internal.ore_cllw Second term
+--! @return integer -1, 0, or 1; NULL if either composite is NULL
+--! @throws Exception if either composite has a NULL `bytes` field
+--! @see eql_v3_internal.compare_ore_cllw_term_bytes
+CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+RETURNS int
+  SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+    len_a INT;
+    len_b INT;
+    common_len INT;
+    cmp_result INT;
+BEGIN
+    -- The `::text` cast is load-bearing, not a stylistic choice. For the
+    -- single-field `ore_cllw` composite, `ROW(NULL)::ore_cllw IS NULL` is TRUE
+    -- but `(ROW(NULL)::ore_cllw)::text IS NULL` is FALSE. Casting to text first
+    -- means a NULL-component composite falls THROUGH to the RAISE below (the
+    -- extractor-invariant violation) instead of silently returning NULL and
+    -- masking it. A plain `a IS NULL` would reintroduce that masking bug.
+    IF a::text IS NULL OR b::text IS NULL THEN
+      RETURN NULL;
+    END IF;
+
+    IF a.bytes IS NULL OR b.bytes IS NULL THEN
+      RAISE EXCEPTION 'eql_v3_internal.compare_ore_cllw_term: composite has NULL bytes field — extractor invariant violated. Check that the index expression uses eql_v3_internal.ore_cllw(...) and not a hand-crafted ROW(NULL).';
+    END IF;
+
+    len_a := LENGTH(a.bytes);
+    len_b := LENGTH(b.bytes);
+
+    IF len_a = 0 AND len_b = 0 THEN
+        RETURN 0;
+    ELSIF len_a = 0 THEN
+        RETURN -1;
+    ELSIF len_b = 0 THEN
+        RETURN 1;
+    END IF;
+
+    IF len_a < len_b THEN
+        common_len := len_a;
+    ELSE
+        common_len := len_b;
+    END IF;
+
+    cmp_result := eql_v3_internal.compare_ore_cllw_term_bytes(
+      SUBSTRING(a.bytes FROM 1 FOR common_len),
+      SUBSTRING(b.bytes FROM 1 FOR common_len)
+    );
+
+    IF cmp_result = -1 THEN
+        RETURN -1;
+    ELSIF cmp_result = 1 THEN
+        RETURN 1;
+    END IF;
+
+    IF len_a < len_b THEN
+        RETURN -1;
+    ELSIF len_a > len_b THEN
+        RETURN 1;
+    ELSE
+        RETURN 0;
+    END IF;
+END;
+$$ LANGUAGE plpgsql;
+
+--! @file v3/jsonb/types.sql
+--! @brief Domain types for the eql_v3 encrypted-JSONB (SteVec) surface.
+--!
+--! Three jsonb-backed domains (none over another domain — operators resolve
+--! against the ultimate base type jsonb, so the native-jsonb firewall in
+--! blockers.sql can attach):
+--!   - public.json     — storage/root: an EQL envelope object ({i, v, ...}).
+--!   - public.jsonb_entry — a single sv element (returned by `->`).
+--!   - eql_v3.query_jsonb  — a containment needle (sv elements, no ciphertext).
+
+--! @brief Validate a single SteVec entry payload.
+--! @internal
+--! @param val jsonb Candidate entry payload.
+--! @return boolean True when `val` is an sv entry with string `s`, string `c`,
+--!         and exactly one string deterministic term (`hm` XOR `oc`).
+CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_entry_payload(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT COALESCE(
+    jsonb_typeof(val) = 'object'
+     AND jsonb_typeof(val -> 's') = 'string'
+     AND jsonb_typeof(val -> 'c') = 'string'
+     AND (
+       (jsonb_typeof(val -> 'hm') = 'string' AND NOT (val ? 'oc'))
+       OR
+       (jsonb_typeof(val -> 'oc') = 'string' AND NOT (val ? 'hm'))
+     ),
+    false
+  )
+$$;
+
+--! @brief Validate a SteVec containment query payload.
+--! @internal
+--! @param val jsonb Candidate query payload.
+--! @return boolean True when `val` is `{"sv":[...]}` and every element carries
+--!         string `s`, no ciphertext, and exactly one string term (`hm` XOR
+--!         `oc`).
+--! @note plpgsql, not LANGUAGE sql (issues #353/#354): the only caller is the
+--!   eql_v3.query_jsonb domain CHECK, where a SQL function can never be
+--!   inlined (and the CHECK itself cannot absorb this body — it needs a
+--!   subquery over the sv elements, which CHECK constraints forbid). plpgsql
+--!   caches its plan across calls instead of paying the per-call SQL-function
+--!   executor on every needle cast.
+CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_query_payload(val jsonb)
+  RETURNS boolean
+  LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+BEGIN
+  RETURN COALESCE(
+    jsonb_typeof(val) = 'object'
+     AND jsonb_typeof(val -> 'sv') = 'array'
+     AND NOT EXISTS (
+       SELECT 1
+       FROM jsonb_array_elements(
+         CASE WHEN jsonb_typeof(val -> 'sv') = 'array' THEN val -> 'sv' ELSE '[]'::jsonb END
+       ) AS elem
+       WHERE NOT COALESCE((
+         jsonb_typeof(elem) = 'object'
+         AND jsonb_typeof(elem -> 's') = 'string'
+         AND NOT (elem ? 'c')
+         AND (
+           (jsonb_typeof(elem -> 'hm') = 'string' AND NOT (elem ? 'oc'))
+           OR
+           (jsonb_typeof(elem -> 'oc') = 'string' AND NOT (elem ? 'hm'))
+         )
+       ), false)
+     ),
+    false
+  );
+END;
+$$;
+
+--! @brief Validate a root SteVec document payload.
+--! @internal
+--! @param val jsonb Candidate document payload.
+--! @return boolean True when `val` is an encrypted document envelope with
+--!         `v = 3`, `i`, an `sv` array, and valid sv entry elements.
+CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_document_payload(val jsonb)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT COALESCE(
+    jsonb_typeof(val) = 'object'
+     AND val ? 'v'
+     AND val ->> 'v' = '3'
+     AND val ? 'i'
+     AND jsonb_typeof(val -> 'sv') = 'array'
+     AND NOT EXISTS (
+       SELECT 1
+       FROM jsonb_array_elements(
+         CASE WHEN jsonb_typeof(val -> 'sv') = 'array' THEN val -> 'sv' ELSE '[]'::jsonb END
+       ) AS elem
+       WHERE NOT public.eql_v3_is_valid_ste_vec_entry_payload(elem)
+     ),
+    false
+  )
+$$;
+
+--! @brief Storage/root domain for an encrypted JSONB column.
+--!
+--! CHECK: a JSON object carrying the EQL envelope (`v = 3` version and `i` index
+--! metadata). Root `c` is intentionally NOT required — an sv-array root payload
+--! is `{i, v, sv}` with no root ciphertext. The CHECK now also requires an `sv`
+--! array, so the domain accepts only SteVec **document** payloads and rejects
+--! encrypted *scalar* payloads (which carry `c`/`hm`/`ob` but no `sv`) — this is
+--! what keeps `public.json` a typed document domain rather than a generic
+--! encrypted envelope. The firewall in blockers.sql attaches to this domain to
+--! stop native jsonb operators from reaching a column value.
+--!
+--! @note Constructing from inline JSON uses the standard DOMAIN cast:
+--!       `'{"i":{},"v":3,"sv":[...]}'::public.json`.
+DO $$
+BEGIN
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'json' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.json AS jsonb
+      CHECK (
+        public.eql_v3_is_valid_ste_vec_document_payload(VALUE)
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.json IS 'EQL encrypted JSONB document (containment, equality, ordering)';
+END
+$$;
+
+--! @brief Domain type for an individual sv element.
+--!
+--! A single element inside an `sv` array: a JSON object that carries a selector
+--! (`s`), a ciphertext (`c`), and **exactly one** of `hm` (HMAC-256, for
+--! hash-equality) or `oc` (CLLW ORE, for ordered queries) — they are mutually
+--! exclusive. This is the type returned by `->` and accepted by the per-entry
+--! extractors `eql_v3.eq_term` / `eql_v3.ore_cllw`. Extra fields (`a`, root
+--! `i`/`v` merged in by `->`) are allowed.
+--!
+--! @see src/v3/jsonb/operators.sql
+--!
+--! @internal
+--! Implementation note (issue #354): the CHECK is an INLINE expression, not a
+--! call to `public.eql_v3_is_valid_ste_vec_entry_payload` — domain
+--! constraints cannot inline SQL functions, so the function-call form paid
+--! the per-call SQL-function executor (~18 µs) on EVERY cast: the needle
+--! cast in every field_eq query (+19% end-to-end vs v2, the entire measured
+--! regression on that scenario; see cipherstash/benches#23). The expression
+--! mirrors the validator body; the leading `VALUE IS NULL OR` preserves the
+--! validator's STRICT NULL-passes semantics (a bare COALESCE(..., false)
+--! would reject NULL, which `->` returns for a missing selector). Keep the
+--! two in sync — `jsonb_entry_check_matches_validator` in tests/sqlx pins
+--! the equivalence.
+--! @endinternal
+DO $$
+BEGIN
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'jsonb_entry' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.jsonb_entry AS jsonb
+      CHECK (
+        VALUE IS NULL
+        OR COALESCE(
+          jsonb_typeof(VALUE) = 'object'
+           AND jsonb_typeof(VALUE -> 's') = 'string'
+           AND jsonb_typeof(VALUE -> 'c') = 'string'
+           AND (
+             (jsonb_typeof(VALUE -> 'hm') = 'string' AND NOT (VALUE ? 'oc'))
+             OR
+             (jsonb_typeof(VALUE -> 'oc') = 'string' AND NOT (VALUE ? 'hm'))
+           ),
+          false
+        )
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.jsonb_entry IS 'EQL encrypted JSONB leaf entry (equality, ordering)';
+END
+$$;
+
+--! @brief Domain type for an STE-vec containment needle.
+--!
+--! A query-shaped payload `{"sv":[...]}` whose elements carry selector + index
+--! term but **never** a ciphertext (`c`). Each element must carry `s` and
+--! exactly one deterministic term (`hm` XOR `oc`). Typing the needle this way
+--! stops selector-only needles from casting and matching every row via bare
+--! `jsonb @>`.
+--!
+--! @note Construct from inline JSON via the DOMAIN cast:
+--!       `'{"sv":[{"s":"","hm":""}]}'::eql_v3.query_jsonb`.
+--! @see eql_v3.to_ste_vec_query
+--!
+--! @internal
+--! Implementation note (issue #354): this CHECK CANNOT be inlined like
+--! public.jsonb_entry's — validating the sv elements requires a subquery
+--! (`NOT EXISTS (SELECT ... FROM jsonb_array_elements(...))`), and CHECK
+--! constraints forbid subqueries. The validator is plpgsql instead (cached
+--! plan; substantially cheaper per call than a non-inlined LANGUAGE sql
+--! function — the same finding as issue #353), since this cast sits on the
+--! per-query hot path of every containment scenario
+--! (`$1::jsonb::eql_v3.query_jsonb`).
+--! @endinternal
+DO $$
+BEGIN
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'query_jsonb' AND typnamespace = 'eql_v3'::regnamespace
+  ) THEN
+    CREATE DOMAIN eql_v3.query_jsonb AS jsonb
+      CHECK (
+        public.eql_v3_is_valid_ste_vec_query_payload(VALUE)
+      );
+  END IF;
+
+  COMMENT ON DOMAIN eql_v3.query_jsonb IS 'EQL JSONB query operand (containment)';
+END
+$$;
+
+--! @brief Convert a public.json to a query_jsonb needle.
+--!
+--! Normalises each sv element down to the matching-relevant fields: `s` plus
+--! exactly one of `hm` / `oc`. Other fields (`c`, `a`, `i`/`v`, anything else)
+--! are stripped. This is the canonical needle shape for `@>` containment.
+--! Designed for use as a functional GIN index expression:
+--!   `GIN (eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops)`.
+--!
+--! @param e public.json Source encrypted payload
+--! @return eql_v3.query_jsonb Query-shaped needle, sv elements normalised.
+--! @see eql_v3.query_jsonb
+CREATE FUNCTION eql_v3.to_ste_vec_query(e public.json)
+  RETURNS eql_v3.query_jsonb
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT jsonb_build_object(
+    'sv',
+    coalesce(
+      (SELECT jsonb_agg(
+                jsonb_strip_nulls(
+                  jsonb_build_object(
+                    's',  elem -> 's',
+                    'hm', elem -> 'hm',
+                    'oc', elem -> 'oc'
+                  )
+                )
+              )
+       FROM jsonb_array_elements(e::jsonb -> 'sv') AS elem),
+      '[]'::jsonb
+    )
+  )::eql_v3.query_jsonb
+$$;
+
+CREATE CAST (public.json AS eql_v3.query_jsonb)
+  WITH FUNCTION eql_v3.to_ste_vec_query
+  AS ASSIGNMENT;
+
+--! @file v3/jsonb/functions.sql
+--! @brief Extractors, containment engine, and path/array functions for the
+--!        eql_v3 encrypted-JSONB (SteVec) surface.
+--!
+--! `selector` parameters here are *encrypted-side* selector hashes — the
+--! deterministic hash the crypto layer emits in the `s` field of each sv
+--! element. Plaintext JSONPaths are never accepted at runtime.
+
+------------------------------------------------------------------------------
+-- Envelope helpers (eql_v3 owns these; jsonb-only)
+------------------------------------------------------------------------------
+
+--! @brief Extract metadata (i, v) from a raw jsonb encrypted value.
+--! @param val jsonb encrypted EQL payload
+--! @return jsonb Metadata object with `i` and `v` fields.
+CREATE FUNCTION eql_v3.meta_data(val jsonb)
+  RETURNS jsonb
+  IMMUTABLE STRICT PARALLEL SAFE
+  LANGUAGE SQL
+AS $$
+  SELECT jsonb_build_object('i', val->'i', 'v', val->'v');
+$$;
+
+COMMENT ON FUNCTION eql_v3.meta_data(jsonb) IS
+  'eql-inline-critical: raw-jsonb envelope helper used by v3 jsonb wrappers; must stay inlinable (unpinned search_path)';
+
+--! @brief Extract ciphertext (c) from a raw jsonb encrypted value.
+--! @param val jsonb encrypted EQL payload
+--! @return text Base64-encoded ciphertext.
+--! @throws Exception if `c` is absent.
+CREATE FUNCTION eql_v3.ciphertext(val jsonb)
+  RETURNS text
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    IF val ? 'c' THEN
+      RETURN val->>'c';
+    END IF;
+    RAISE 'Expected a ciphertext (c) value in json: %', val;
+  END;
+$$ LANGUAGE plpgsql;
+
+------------------------------------------------------------------------------
+-- Selector extractors
+------------------------------------------------------------------------------
+
+--! @brief Extract selector (s) from a raw jsonb encrypted value.
+--! @param val jsonb encrypted EQL payload
+--! @return text The selector value.
+--! @throws Exception if `s` is absent.
+CREATE FUNCTION eql_v3.selector(val jsonb)
+  RETURNS text
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    IF val ? 's' THEN
+      RETURN val->>'s';
+    END IF;
+    RAISE 'Expected a selector index (s) value in json: %', val;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract selector (s) from a ste_vec entry. The DOMAIN CHECK
+--!        guarantees `s` is present, so this is a simple field access.
+--! @param entry public.jsonb_entry
+--! @return text The selector value.
+CREATE FUNCTION eql_v3.selector(entry public.jsonb_entry)
+  RETURNS text
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT entry ->> 's'
+$$;
+
+------------------------------------------------------------------------------
+-- Equality-term extractor (XOR-aware: coalesce(hm, oc))
+------------------------------------------------------------------------------
+
+--! @brief XOR-aware equality term extractor for public.jsonb_entry.
+--!
+--! Returns the bytea of whichever deterministic term the sv entry carries —
+--! `hm` (HMAC-256) or `oc` (CLLW ORE). The two byte distributions are disjoint
+--! by construction, so byte equality on the coalesce is unambiguous. Canonical
+--! equality extractor used by `=` / `<>` on jsonb_entry.
+--!
+--! @param entry public.jsonb_entry
+--! @return bytea Decoded `hm` or `oc` bytes (NULL if entry is NULL).
+CREATE FUNCTION eql_v3.eq_term(entry public.jsonb_entry)
+  RETURNS bytea
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT decode(coalesce(entry ->> 'hm', entry ->> 'oc'), 'hex')
+$$;
+
+------------------------------------------------------------------------------
+-- ORE CLLW per-entry overloads (live here so sem/ore_cllw stays a leaf)
+------------------------------------------------------------------------------
+
+--! @brief Extract CLLW ORE index term from a ste_vec entry.
+--!
+--! `oc` is only ever present on an sv element, never at a root encrypted value,
+--! so the typed overload accepts public.jsonb_entry. Returns SQL NULL when
+--! `oc` is absent (btree NULL-filters such rows from range queries).
+--!
+--! @param entry public.jsonb_entry
+--! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL.
+--! @see eql_v3.has_ore_cllw
+CREATE FUNCTION eql_v3.ore_cllw(entry public.jsonb_entry)
+  RETURNS eql_v3_internal.ore_cllw
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE WHEN entry ->> 'oc' IS NULL THEN NULL
+              ELSE ROW(decode(entry ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw
+         END
+$$;
+
+--! @brief Check if a ste_vec entry contains a CLLW ORE index term.
+--! @param entry public.jsonb_entry
+--! @return boolean True if `oc` is present and non-null.
+CREATE FUNCTION eql_v3.has_ore_cllw(entry public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT entry ->> 'oc' IS NOT NULL
+$$;
+
+------------------------------------------------------------------------------
+-- sv-array helpers
+------------------------------------------------------------------------------
+
+--! @brief Extract the sv element array as raw jsonb[].
+--!
+--! Returns the elements of `sv` (or a single-element array wrapping the value
+--! when there is no `sv`). No envelope re-wrapping — raw jsonb elements.
+--!
+--! @param val jsonb encrypted EQL payload
+--! @return jsonb[] Array of sv elements.
+CREATE FUNCTION eql_v3.ste_vec(val jsonb)
+  RETURNS jsonb[]
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb;
+    ary jsonb[];
+  BEGIN
+    IF val ? 'sv' THEN
+      sv := val->'sv';
+    ELSE
+      sv := jsonb_build_array(val);
+    END IF;
+
+    SELECT array_agg(elem)
+      INTO ary
+      FROM jsonb_array_elements(sv) AS elem;
+
+    RETURN ary;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Check if a jsonb payload is marked as an sv array (`a` flag true).
+--! @param val jsonb encrypted EQL payload
+--! @return boolean True if `a` is present and true.
+CREATE FUNCTION eql_v3_internal.is_ste_vec_array(val jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  BEGIN
+    IF val ? 'a' THEN
+      RETURN (val->>'a')::boolean;
+    END IF;
+    RETURN false;
+  END;
+$$ LANGUAGE plpgsql;
+
+------------------------------------------------------------------------------
+-- Deterministic-fields array for GIN containment
+------------------------------------------------------------------------------
+
+--! @brief Extract deterministic search fields (s, hm, oc, op) per sv element.
+--!
+--! Excludes non-deterministic ciphertext so PostgreSQL's native jsonb `@>` can
+--! compare for containment. Use for GIN indexes and containment queries.
+--!
+--! @param val jsonb encrypted EQL payload
+--! @return jsonb[] Array of objects with only deterministic fields.
+CREATE FUNCTION eql_v3.jsonb_array(val jsonb)
+RETURNS jsonb[]
+IMMUTABLE STRICT PARALLEL SAFE
+LANGUAGE SQL
+AS $$
+  SELECT ARRAY(
+    SELECT jsonb_object_agg(kv.key, kv.value)
+    FROM jsonb_array_elements(
+      CASE WHEN val ? 'sv' THEN val->'sv' ELSE jsonb_build_array(val) END
+    ) AS elem,
+    LATERAL jsonb_each(elem) AS kv(key, value)
+    WHERE kv.key IN ('s', 'hm', 'oc', 'op')
+    GROUP BY elem
+  );
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_array(jsonb) IS
+  'eql-inline-critical: raw-jsonb deterministic-field array helper; must stay inlinable (unpinned search_path)';
+
+------------------------------------------------------------------------------
+-- Containment
+------------------------------------------------------------------------------
+
+--! @brief GIN-indexable containment check: does `a` contain all of `b`?
+--! @param a jsonb Container payload.
+--! @param b jsonb Search payload.
+--! @return boolean True if a contains all deterministic elements of b.
+--! @note Public raw-`jsonb[]` containment helper over the extracted
+--!       deterministic fields — the function-form entrypoint for containment on
+--!       platforms without operator support (Supabase/PostgREST). The typed
+--!       `public.json` `@>` operator does NOT call this function — it binds to
+--!       `eql_v3.ste_vec_contains` instead — but both agree on the result (a
+--!       parity test pins this). Also the documented GIN index expression
+--!       (`eql_v3.jsonb_array(col)`); see docs/reference/database-indexes.md.
+CREATE FUNCTION eql_v3.jsonb_contains(a jsonb, b jsonb)
+RETURNS boolean
+IMMUTABLE STRICT PARALLEL SAFE
+LANGUAGE SQL
+AS $$
+  SELECT eql_v3.jsonb_array(a) @> eql_v3.jsonb_array(b);
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_contains(jsonb, jsonb) IS
+  'eql-inline-critical: raw-jsonb containment helper; must stay inlinable (unpinned search_path)';
+
+--! @brief GIN-indexable "is contained by" check.
+--! @param a jsonb Payload to check.
+--! @param b jsonb Container payload.
+--! @return boolean True if all elements of a are contained in b.
+--! @note Public raw-`jsonb[]` reverse-containment helper — the function-form
+--!       entrypoint for `<@` on platforms without operator support. The typed
+--!       `public.json` `<@` operator binds to `eql_v3.ste_vec_contains` instead,
+--!       but both agree on the result.
+CREATE FUNCTION eql_v3.jsonb_contained_by(a jsonb, b jsonb)
+RETURNS boolean
+IMMUTABLE STRICT PARALLEL SAFE
+LANGUAGE SQL
+AS $$
+  SELECT eql_v3.jsonb_array(a) <@ eql_v3.jsonb_array(b);
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_contained_by(jsonb, jsonb) IS
+  'eql-inline-critical: raw-jsonb contained-by helper; must stay inlinable (unpinned search_path)';
+
+--! @brief Check if an sv array contains a specific sv element.
+--!
+--! Match = selector equal AND eq_term equal (byte-equality over coalesce(hm,
+--! oc)). This collapses the v2 hm/oc CASE: under the XOR contract both terms
+--! are deterministic and byte-disjoint, so either one is a valid equality
+--! discriminator and a single byte comparison is correct.
+--!
+--! ASSUMPTION (locked by a negative test in v3_jsonb_tests.rs): hm and oc byte
+--! distributions never collide at a given selector. The crypto layer configures
+--! a selector for eq XOR ordered, so both sides of a real comparison carry the
+--! same term type; and an oc value carries a leading domain-tag byte an hm never
+--! has. Unlike v2's explicit `has_hmac(both)`/`has_ore_cllw(both)`/`ELSE false`
+--! CASE, this collapse would wrongly match an hm needle against an oc leaf if
+--! their hex bytes were ever identical — which the contract prevents. The
+--! negative-containment test guards against regression.
+--!
+--! @param a jsonb[] sv array to search within.
+--! @param b jsonb sv element to search for.
+--! @return boolean True if b is found in any element of a.
+CREATE FUNCTION eql_v3.ste_vec_contains(a jsonb[], b jsonb)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    result boolean;
+    _a jsonb;
+  BEGIN
+    result := false;
+
+    FOR idx IN 1..array_length(a, 1) LOOP
+      _a := a[idx];
+      result := result OR (
+        eql_v3.selector(_a) = eql_v3.selector(b)
+        AND eql_v3.eq_term(_a::public.jsonb_entry) = eql_v3.eq_term(b::public.jsonb_entry)
+      );
+      EXIT WHEN result;
+    END LOOP;
+
+    RETURN result;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Does encrypted value `a` contain all sv elements of `b`?
+--!
+--! Empty b is always contained. Each element of b must match selector + eq_term
+--! in some element of a.
+--!
+--! @param a public.json Container.
+--! @param b public.json Elements to find.
+--! @return boolean True if all elements of b are contained in a.
+--! @see eql_v3.ste_vec_contains(jsonb[], jsonb)
+CREATE FUNCTION eql_v3.ste_vec_contains(a public.json, b public.json)
+  RETURNS boolean
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    result boolean;
+    sv_a jsonb[];
+    sv_b jsonb[];
+    _b jsonb;
+  BEGIN
+    sv_a := eql_v3.ste_vec(a);
+    sv_b := eql_v3.ste_vec(b);
+
+    IF array_length(sv_b, 1) IS NULL THEN
+      RETURN true;
+    END IF;
+
+    IF array_length(sv_a, 1) IS NULL THEN
+      RETURN false;
+    END IF;
+
+    result := true;
+
+    FOR idx IN 1..array_length(sv_b, 1) LOOP
+      _b := sv_b[idx];
+      result := result AND eql_v3.ste_vec_contains(sv_a, _b);
+    END LOOP;
+
+    RETURN result;
+  END;
+$$ LANGUAGE plpgsql;
+
+------------------------------------------------------------------------------
+-- Path queries (text selector only)
+------------------------------------------------------------------------------
+
+--! @brief Query encrypted JSONB for sv elements matching `selector`.
+--!
+--! Returns one jsonb_entry row per matching encrypted element. Returns empty
+--! set on no match. It deliberately does not wrap multiple matches as an
+--! public.json document, because the root document domain requires an `sv`
+--! array and single leaves belong to public.jsonb_entry.
+--!
+--! @param val jsonb encrypted EQL payload with `sv`.
+--! @param selector text Selector hash (`s` value).
+--! @return SETOF public.jsonb_entry Matching encrypted entries.
+--! @see eql_v3.jsonb_path_query_first
+CREATE FUNCTION eql_v3.jsonb_path_query(val jsonb, selector text)
+  RETURNS SETOF public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (eql_v3.meta_data(val) || elem)::public.jsonb_entry
+  FROM jsonb_array_elements(val -> 'sv') elem
+  WHERE elem ->> 's' = selector
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_path_query(jsonb, text) IS
+  'eql-inline-critical: raw-jsonb path query helper; must stay inlinable (unpinned search_path)';
+
+--! @brief Check if a selector path exists in encrypted JSONB.
+--! @param val jsonb encrypted EQL payload.
+--! @param selector text Selector hash to test.
+--! @return boolean True if a matching element exists.
+CREATE FUNCTION eql_v3.jsonb_path_exists(val jsonb, selector text)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT EXISTS (
+    SELECT 1 FROM jsonb_array_elements(val -> 'sv') elem
+    WHERE elem ->> 's' = selector
+  );
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_path_exists(jsonb, text) IS
+  'eql-inline-critical: raw-jsonb path exists helper; must stay inlinable (unpinned search_path)';
+
+--! @brief Get the first sv element matching `selector`, or NULL.
+--! @param val jsonb encrypted EQL payload.
+--! @param selector text Selector hash to match.
+--! @return public.jsonb_entry First matching element or NULL.
+CREATE FUNCTION eql_v3.jsonb_path_query_first(val jsonb, selector text)
+  RETURNS public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (eql_v3.meta_data(val) || elem)::public.jsonb_entry
+  FROM jsonb_array_elements(val -> 'sv') elem
+  WHERE elem ->> 's' = selector
+  LIMIT 1
+$$;
+
+COMMENT ON FUNCTION eql_v3.jsonb_path_query_first(jsonb, text) IS
+  'eql-inline-critical: raw-jsonb path first helper; must stay inlinable (unpinned search_path)';
+
+------------------------------------------------------------------------------
+-- Array functions
+------------------------------------------------------------------------------
+
+--! @brief Get the length of an encrypted JSONB array.
+--! @param val jsonb encrypted EQL payload (must have `a` flag true).
+--! @return integer Number of elements.
+--! @throws Exception 'cannot get array length of a non-array' if not an array.
+CREATE FUNCTION eql_v3.jsonb_array_length(val jsonb)
+  RETURNS integer
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb[];
+  BEGIN
+    IF eql_v3_internal.is_ste_vec_array(val) THEN
+      sv := eql_v3.ste_vec(val);
+      RETURN array_length(sv, 1);
+    END IF;
+
+    RAISE 'cannot get array length of a non-array';
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract elements of an encrypted JSONB array as rows.
+--! @param val jsonb encrypted EQL payload (must have `a` flag true).
+--! @return SETOF public.jsonb_entry One row per element (metadata preserved).
+--! @throws Exception 'cannot extract elements from non-array' if not an array.
+CREATE FUNCTION eql_v3.jsonb_array_elements(val jsonb)
+  RETURNS SETOF public.jsonb_entry
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb[];
+    meta jsonb;
+    item jsonb;
+  BEGIN
+    IF NOT eql_v3_internal.is_ste_vec_array(val) THEN
+      RAISE 'cannot extract elements from non-array';
+    END IF;
+
+    meta := eql_v3.meta_data(val);
+    sv := eql_v3.ste_vec(val);
+
+    FOR idx IN 1..array_length(sv, 1) LOOP
+      item = sv[idx];
+      RETURN NEXT (meta || item)::public.jsonb_entry;
+    END LOOP;
+
+    RETURN;
+  END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Extract elements of an encrypted JSONB array as ciphertext text.
+--! @param val jsonb encrypted EQL payload (must have `a` flag true).
+--! @return SETOF text One ciphertext per element.
+--! @throws Exception 'cannot extract elements from non-array' if not an array.
+CREATE FUNCTION eql_v3.jsonb_array_elements_text(val jsonb)
+  RETURNS SETOF text
+  IMMUTABLE STRICT PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+AS $$
+  DECLARE
+    sv jsonb[];
+  BEGIN
+    IF NOT eql_v3_internal.is_ste_vec_array(val) THEN
+      RAISE 'cannot extract elements from non-array';
+    END IF;
+
+    sv := eql_v3.ste_vec(val);
+
+    FOR idx IN 1..array_length(sv, 1) LOOP
+      RETURN NEXT eql_v3.ciphertext(sv[idx]);
+    END LOOP;
+
+    RETURN;
+  END;
+$$ LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE
+-- Source is src/v3/version.template
+
+DROP FUNCTION IF EXISTS eql_v3.version();
+
+--! @file v3/version.sql
+--! @brief EQL version reporting (self-contained eql_v3 surface)
+--!
+--! This file is auto-generated from src/v3/version.template during build.
+--! The 3.0.0-alpha.3 placeholder is replaced with the actual release
+--! version (bare semver, e.g. "3.0.0") supplied via `mise run build --version`,
+--! or "DEV" for development builds.
+
+--! @brief Get the installed EQL version string
+--!
+--! Returns the version string for the installed EQL library. This value is
+--! baked in at build time from the release tag.
+--!
+--! @return text Version string (e.g. "3.0.0" or "DEV" for development builds)
+--!
+--! @note Auto-generated during build from src/v3/version.template
+--!
+--! Example: `SELECT eql_v3.version()` returns the installed version string,
+--! e.g. `'3.0.0'` (or `'DEV'` for development builds).
+CREATE FUNCTION eql_v3.version()
+  RETURNS text
+  IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT '3.0.0-alpha.3';
+$$ LANGUAGE SQL;
+
+--! @brief Schema-level version marker for obj_description() discoverability
+--!
+--! Mirrors eql_v3.version() as a comment on the schema so the installed
+--! version can also be read via obj_description('eql_v3'::regnamespace).
+COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.3';
+
+--! @brief EQL lint: detect non-inlinable operator implementation functions
+--!
+--! Returns one row per violation found in the installed `eql_v3` surface. The
+--! Postgres planner can only inline a function during index matching when:
+--!
+--!   * `LANGUAGE sql` (plpgsql / C / etc. cannot be inlined)
+--!   * `IMMUTABLE` or `STABLE` volatility (VOLATILE cannot be inlined into
+--!     index expressions)
+--!   * No `SET` clauses (e.g. `SET search_path = ...`)
+--!   * Not `SECURITY DEFINER`
+--!   * Single-statement SELECT body
+--!
+--! @note The single-statement SELECT body condition is **not yet checked** by
+--! this lint. A `LANGUAGE sql` function with a multi-statement body, a CTE,
+--! or any pre-SELECT statement will pass all four implemented checks while
+--! remaining non-inlinable. Implementing the check requires walking `prosrc`
+--! (or `pg_get_functiondef`); tracked as a follow-up.
+--!
+--! Operators on `eql_v3` types (the jsonb-backed encrypted-domain families and
+--! the SEM index-term types `eql_v3_internal.ore_block_256`, `eql_v3_internal.ore_cllw`) whose
+--! implementation functions fail any of these rules silently fall back to seq
+--! scan when the documented functional indexes (`eql_v3.eq_term(col)`,
+--! `eql_v3.ord_term(col)`) are in place. This lint surfaces every such case.
+--!
+--! Severity:
+--!   `error`   — fixable, blocks index matching, ship-blocking.
+--!   `warning` — likely-fixable, may not block matching but signals intent.
+--!   `info`    — observational; useful for review, not a defect on its own.
+--!
+--! Categories:
+--!   `inlinability_language`   — implementation function isn't `LANGUAGE sql`.
+--!   `inlinability_volatility` — implementation function is VOLATILE.
+--!   `inlinability_set_clause` — implementation function has a `SET` clause.
+--!   `inlinability_secdef`     — implementation function is `SECURITY DEFINER`.
+--!   `inlinability_transitive` — implementation function is itself inlinable
+--!                                but its body invokes a non-inlinable function
+--!                                (depth 1; the planner can't peek through
+--!                                that boundary).
+--!   `blocker_language`        — encrypted-domain blocker is not LANGUAGE
+--!                                plpgsql. The planner can inline / elide a
+--!                                LANGUAGE sql body when the result is
+--!                                provably unused, silently bypassing the
+--!                                RAISE that the blocker exists to perform.
+--!   `blocker_strict`          — encrypted-domain blocker is STRICT.
+--!                                PostgreSQL skips the body and returns NULL
+--!                                on NULL arguments, silently bypassing the
+--!                                RAISE.
+--!   `domain_over_domain`      — an `eql_v3` encrypted domain is derived from
+--!                                another encrypted domain rather than jsonb.
+--!                                Operators resolve against the ultimate base
+--!                                type, so the derived domain does not
+--!                                inherit the base domain's blocker surface.
+--!   `domain_opclass`          — an operator class is declared FOR TYPE on an
+--!                                `eql_v3` encrypted domain. Opclasses on
+--!                                domains bypass operator resolution; use a
+--!                                functional index on the extractor instead.
+--!   `schema_placement`        — a naked composite or enum TYPE lives in the
+--!                                public `eql_v3` schema. Internal index-term
+--!                                types (e.g. `ore_block_256_term`) belong in
+--!                                `eql_v3_internal`; a composite/enum in
+--!                                `eql_v3` clutters the Supabase Table Builder
+--!                                type picker, which the schema split exists to
+--!                                prevent. Move it to `eql_v3_internal`.
+--!
+--! @example
+--! ```
+--! SELECT severity, category, object_name, message
+--!   FROM eql_v3.lints()
+--!  WHERE severity = 'error'
+--!  ORDER BY category, object_name;
+--! ```
+--!
+--! @return SETOF record (severity text, category text, object_name text, message text)
+CREATE OR REPLACE FUNCTION eql_v3.lints()
+RETURNS TABLE (
+  severity text,
+  category text,
+  object_name text,
+  message text
+)
+LANGUAGE sql STABLE
+AS $$
+  WITH
+  -- User-column encrypted domains now live in public so application tables
+  -- survive EQL uninstall. Keep this separate from owned_schemas(): public is
+  -- not installer-owned, but its EQL jsonb-backed domains are still the domain
+  -- types whose blockers/operator surfaces the lint must understand.
+  encrypted_domain_types AS (
+    SELECT
+      dt.oid AS typid
+    FROM pg_catalog.pg_type dt
+    JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace
+    JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype
+    JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace
+    WHERE dt.typtype = 'd'
+      AND bt.typname = 'jsonb'
+      AND bn.nspname = 'pg_catalog'
+      AND (
+           dn.nspname = 'public'
+        OR dn.nspname = ANY(eql_v3_internal.owned_schemas())
+      )
+  ),
+
+  -- All operators where at least one operand is an EQL-owned type or a public
+  -- encrypted domain. Limits the scope of the lint to the operator surface
+  -- customers actually hit via SQL (`col = val`, `col @> '...'` and friends).
+  eql_operators AS (
+    SELECT
+      op.oid              AS oprid,
+      op.oprname          AS opname,
+      op.oprcode          AS implfunc,
+      op.oprleft::regtype AS lhs,
+      op.oprright::regtype AS rhs,
+      op.oprcode::regprocedure AS impl_signature
+    FROM pg_operator op
+    WHERE EXISTS (
+        SELECT 1 FROM pg_type t
+         WHERE t.oid IN (op.oprleft, op.oprright)
+           AND (
+                t.typnamespace IN (SELECT oid FROM pg_namespace WHERE nspname = ANY(eql_v3_internal.owned_schemas()))
+             OR t.oid IN (SELECT typid FROM encrypted_domain_types)
+           )
+      )
+  ),
+
+  -- Cross-join with each operator's implementation function metadata.
+  -- One row per operator; columns describe the inlinability of the impl.
+  op_impl AS (
+    SELECT
+      eo.opname,
+      eo.lhs,
+      eo.rhs,
+      eo.implfunc                                  AS impl_oid,
+      eo.impl_signature::text                       AS impl_signature,
+      lang_l.lanname                                AS lang,
+      p.provolatile                                 AS volatility,
+      p.proconfig                                   AS config,
+      p.prosecdef                                   AS secdef,
+      p.prosrc                                      AS body
+    FROM eql_operators eo
+    JOIN pg_proc p ON p.oid = eo.implfunc
+    JOIN pg_language lang_l ON lang_l.oid = p.prolang
+  ),
+
+  -- Encrypted-domain blockers: functions in `eql_v3` whose body contains
+  -- a blocker marker emitted by the codegen (any of the
+  -- `encrypted_domain_unsupported_*` helper calls — `_bool` for boolean
+  -- blockers, `_jsonb` for the native-jsonb-operator blockers; plus the
+  -- literal `is not supported for` for older path-operator blockers) AND
+  -- that take at least one encrypted domain over jsonb argument. The argument
+  -- filter excludes the shared `encrypted_domain_unsupported_*(text, text)`
+  -- helpers themselves, which contain the marker in their body but are not
+  -- blockers (they take text arguments, not a domain).
+  encrypted_domain_blockers AS (
+    SELECT
+      p.oid                                        AS oid,
+      p.oid::regprocedure::text                    AS signature,
+      lang_l.lanname                               AS lang,
+      p.proisstrict                                AS isstrict
+    FROM pg_catalog.pg_proc p
+    JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
+    JOIN pg_catalog.pg_language lang_l ON lang_l.oid = p.prolang
+    WHERE n.nspname = ANY(eql_v3_internal.owned_schemas())
+      AND (p.prosrc LIKE '%encrypted_domain_unsupported%'
+        OR p.prosrc LIKE '%is not supported for%')
+      AND EXISTS (
+        SELECT 1
+        FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ)
+        JOIN encrypted_domain_types edt ON edt.typid = arg.typ
+      )
+  )
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Direct inlinability checks: each row examines one operator's    │
+  -- │ implementation function and emits a violation if any rule is    │
+  -- │ broken. Multiple violations on the same function become         │
+  -- │ multiple rows (developers see every reason it doesn't inline).  │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  SELECT
+    'error'                                                             AS severity,
+    'inlinability_language'                                             AS category,
+    format('operator %s(%s, %s) -> %s',
+           opname, lhs, rhs, impl_signature)                            AS object_name,
+    format(
+      'Operator implementation function is `LANGUAGE %s`; only `LANGUAGE sql` functions can be inlined by the planner. Bare `col %s val` queries fall back to seq scan even when a matching functional index exists.',
+      lang, opname)                                                     AS message
+  FROM op_impl
+  WHERE lang <> 'sql'
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_volatility',
+    format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature),
+    format(
+      'Operator implementation function is `VOLATILE`. The Postgres planner refuses to inline volatile functions into index expressions, so functional indexes never engage. Mark the function `IMMUTABLE` (or `STABLE` if it depends on session state).',
+      opname)
+  FROM op_impl
+  WHERE volatility = 'v'
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_set_clause',
+    format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature),
+    format(
+      'Operator implementation function has a `SET` clause (e.g. `SET search_path = ...`). Per Postgres function-inlining rules, any `SET` clause blocks inlining. Use schema-qualified identifiers in the body and remove the `SET` clause to allow the planner to inline.')
+  FROM op_impl
+  WHERE config IS NOT NULL
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_secdef',
+    format('operator %s(%s, %s) -> %s', opname, lhs, rhs, impl_signature),
+    'Operator implementation function is `SECURITY DEFINER`. Such functions cannot be inlined; remove `SECURITY DEFINER` or use a non-inlinable wrapper layer.'
+  FROM op_impl
+  WHERE secdef
+    AND NOT EXISTS (
+      SELECT 1 FROM encrypted_domain_blockers b
+      WHERE b.oid = op_impl.impl_oid
+    )
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Transitive inlinability: an operator implementation function    │
+  -- │ that's itself inlinable can still fail to inline if its body    │
+  -- │ calls a non-inlinable function. Walk one level via pg_depend.   │
+  -- │                                                                 │
+  -- │ Postgres records function-to-function dependencies in           │
+  -- │ pg_depend with deptype 'n' (normal) when one function references│
+  -- │ another in its body — but only at CREATE time and only for      │
+  -- │ direct calls. This is good enough for v1; deeper transitive     │
+  -- │ analysis is a follow-up.                                        │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'inlinability_transitive',
+    format('operator %s(%s, %s) -> %s', oi.opname, oi.lhs, oi.rhs,
+           oi.impl_signature),
+    format(
+      'Operator implementation function is inlinable but invokes non-inlinable function `%s` (lang=%s, volatility=%s%s). The chain blocks at depth 1: the planner inlines the outer call but cannot reduce the inner call into an index expression.',
+      called.proname,
+      called_lang.lanname,
+      CASE called.provolatile
+        WHEN 'i' THEN 'IMMUTABLE'
+        WHEN 's' THEN 'STABLE'
+        WHEN 'v' THEN 'VOLATILE'
+      END,
+      CASE WHEN called.proconfig IS NOT NULL
+           THEN ', has SET clause'
+           ELSE '' END)
+  FROM op_impl oi
+  -- Only worth the transitive check if the outer function is otherwise
+  -- inlinable — otherwise the direct lints above already report it.
+  JOIN pg_proc outer_p ON outer_p.oid = oi.impl_signature::regprocedure
+  JOIN pg_depend d
+    ON d.classid = 'pg_proc'::regclass
+   AND d.objid = outer_p.oid
+   AND d.refclassid = 'pg_proc'::regclass
+   AND d.deptype = 'n'
+  JOIN pg_proc called ON called.oid = d.refobjid
+  JOIN pg_language called_lang ON called_lang.oid = called.prolang
+  WHERE oi.lang = 'sql'
+    AND oi.volatility IN ('i', 's')
+    AND oi.config IS NULL
+    AND NOT oi.secdef
+    AND called.oid <> outer_p.oid
+    AND (
+         called_lang.lanname <> 'sql'
+      OR called.provolatile = 'v'
+      OR called.proconfig IS NOT NULL
+      OR called.prosecdef
+    )
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Encrypted-domain footguns: blockers exist to RAISE, so they     │
+  -- │ have inverted inlinability requirements vs operator impls.      │
+  -- │ A LANGUAGE sql blocker can be elided by the planner; a STRICT   │
+  -- │ blocker returns NULL on NULL args. Both silently re-enable      │
+  -- │ operators the storage variant is supposed to block.             │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'blocker_language',
+    format('function %s', signature),
+    format(
+      'Encrypted-domain blocker is `LANGUAGE %s`; must be `LANGUAGE plpgsql` so the RAISE is opaque to the planner. A `LANGUAGE sql` body is inlinable and may be elided when the result is provably unused, silently re-enabling the operator.',
+      lang)
+  FROM encrypted_domain_blockers
+  WHERE lang <> 'plpgsql'
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'blocker_strict',
+    format('function %s', signature),
+    'Encrypted-domain blocker is `STRICT`. PostgreSQL skips the body and returns NULL on a NULL argument, silently bypassing the RAISE. Remove `STRICT`.'
+  FROM encrypted_domain_blockers
+  WHERE isstrict
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Domain identity: an encrypted-domain must be defined directly   │
+  -- │ over jsonb. Operators resolve against the ultimate base type,   │
+  -- │ so domain-over-domain inherits jsonb's operator surface and not │
+  -- │ the base domain's blockers.                                     │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'domain_over_domain',
+    format('domain %I.%I', dn.nspname, dt.typname),
+    format(
+      'Domain `%s.%s` is derived from another encrypted-domain `%s.%s` rather than jsonb. Operators resolve against the ultimate base type, so the derived domain does not inherit the base domain''s operator surface and storage blockers do not engage. Define this domain directly over jsonb.',
+      dn.nspname, dt.typname, bn.nspname, bt.typname)
+  FROM pg_catalog.pg_type dt
+  JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace
+  JOIN pg_catalog.pg_type bt ON bt.oid = dt.typbasetype
+  JOIN pg_catalog.pg_namespace bn ON bn.oid = bt.typnamespace
+  WHERE dt.typtype = 'd'
+    AND dn.nspname = ANY(eql_v3_internal.owned_schemas())
+    AND bt.typtype = 'd'
+    AND bt.oid IN (SELECT typid FROM encrypted_domain_types)
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Domain opclass: an operator class declared FOR TYPE on an       │
+  -- │ encrypted-domain bypasses operator resolution at index time.    │
+  -- │ Use a functional index on the extractor instead.                │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'domain_opclass',
+    format('opclass %I.%I FOR TYPE %s.%s', cn.nspname, oc.opcname, tn.nspname, t.typname),
+    format(
+      'Operator class `%s.%s` is declared FOR TYPE `%s.%s`, which is an encrypted-domain type. Opclasses on domains bypass operator resolution. Use a functional index on the extractor (e.g. `%s.eq_term(col)`, `%s.ord_term(col)`) instead.',
+      cn.nspname, oc.opcname, tn.nspname, t.typname, tn.nspname, tn.nspname)
+  FROM pg_catalog.pg_opclass oc
+  JOIN pg_catalog.pg_type t ON t.oid = oc.opcintype
+  JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace
+  JOIN pg_catalog.pg_namespace cn ON cn.oid = oc.opcnamespace
+  WHERE t.oid IN (SELECT typid FROM encrypted_domain_types)
+
+  -- ┌─────────────────────────────────────────────────────────────────┐
+  -- │ Schema placement: the public `eql_v3` schema must hold only the  │
+  -- │ jsonb-backed encrypted-domain types. A naked composite/enum type │
+  -- │ there is an internal index-term type in the wrong schema — it     │
+  -- │ clutters the Supabase type picker the split exists to keep clean. │
+  -- └─────────────────────────────────────────────────────────────────┘
+
+  UNION ALL
+
+  SELECT
+    'error',
+    'schema_placement',
+    format('type %I.%I', n.nspname, t.typname),
+    format(
+      'Type `%s.%s` is a %s in the public `eql_v3` schema. Only jsonb-backed encrypted-domain types belong in `eql_v3`; internal index-term types belong in `eql_v3_internal` so they stay out of the Supabase Table Builder type picker. Move it to `eql_v3_internal`.',
+      n.nspname, t.typname,
+      CASE t.typtype WHEN 'c' THEN 'composite type' WHEN 'e' THEN 'enum type' ELSE 'type' END)
+  FROM pg_catalog.pg_type t
+  JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
+  WHERE n.nspname = 'eql_v3'
+    AND t.typtype IN ('c', 'e')
+
+  ORDER BY 1, 2, 3;
+$$;
+
+COMMENT ON FUNCTION eql_v3.lints() IS
+  'EQL lint: returns one row per non-inlinable operator implementation. '
+  'Run `SELECT * FROM eql_v3.lints() WHERE severity = ''error''` for a '
+  'CI-gateable check that all operator implementations on eql_v3 types are '
+  'eligible for planner inlining.';
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_operators.sql
+--! @brief Operators for public.bigint.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint, RIGHTARG = public.bigint
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_eq_functions.sql
+--! @brief Functions for public.bigint_eq.
+
+--! @brief Index extractor for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a public.bigint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b::public.bigint_eq) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.bigint_eq) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b::public.bigint_eq) $$;
+
+--! @brief Operator wrapper for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a::public.bigint_eq) <> eql_v3.eq_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_eq, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_eq, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_eq)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector text
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_eq, selector text)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector integer
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_eq, selector integer)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param selector public.bigint_eq
+--! @return public.bigint_eq
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_eq)
+RETURNS public.bigint_eq IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_eq, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_eq, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param selector public.bigint_eq
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_eq)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_eq, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_eq, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_eq, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_eq, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_eq, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b public.bigint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_eq, b public.bigint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a public.bigint_eq
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_eq, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_eq.
+--! @param a jsonb
+--! @param b public.bigint_eq
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_eq)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_eq'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_bigint_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_bigint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a public.bigint_ord_ore
+--! @param b eql_v3.query_bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ore, b eql_v3.query_bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ore.
+--! @param a eql_v3.query_bigint_ord_ore
+--! @param b public.bigint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord_ore, b public.bigint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_eq_functions.sql
+--! @brief Functions for eql_v3.query_bigint_eq.
+
+--! @brief Index extractor for eql_v3.query_bigint_eq.
+--! @param a eql_v3.query_bigint_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_bigint_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a public.bigint_eq
+--! @param b eql_v3.query_bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_eq, b eql_v3.query_bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a eql_v3.query_bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a public.bigint_eq
+--! @param b eql_v3.query_bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_eq, b eql_v3.query_bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_eq.
+--! @param a eql_v3.query_bigint_eq
+--! @param b public.bigint_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_eq, b public.bigint_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ope_functions.sql
+--! @brief Functions for public.bigint_ord_ope.
+
+--! @brief Index extractor for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a public.bigint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b::public.bigint_ord_ope) $$;
+
+--! @brief Operator wrapper for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a::public.bigint_ord_ope) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.bigint_ord_ope, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.bigint_ord_ope)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector text
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ope, selector text)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector integer
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a public.bigint_ord_ope, selector integer)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ope, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.bigint_ord_ope, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param selector public.bigint_ord_ope
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.bigint_ord_ope)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.bigint_ord_ope, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.bigint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.bigint_ord_ope, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.bigint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.bigint_ord_ope, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.bigint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.bigint_ord_ope, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.bigint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.bigint_ord_ope, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.bigint_ord_ope, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.bigint_ord_ope.
+--! @param a jsonb
+--! @param b public.bigint_ord_ope
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.bigint_ord_ope)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.bigint_ord_ope'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ore_aggregates.sql
+--! @brief Aggregates for public.bigint_ord_ore.
+
+--! @brief State function for min on public.bigint_ord_ore.
+--! @param state public.bigint_ord_ore
+--! @param value public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord_ore, value public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.bigint_ord_ore.
+--! @param input public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE AGGREGATE eql_v3.min(public.bigint_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.bigint_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.bigint_ord_ore.
+--! @param state public.bigint_ord_ore
+--! @param value public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord_ore, value public.bigint_ord_ore)
+RETURNS public.bigint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.bigint_ord_ore.
+--! @param input public.bigint_ord_ore
+--! @return public.bigint_ord_ore
+CREATE AGGREGATE eql_v3.max(public.bigint_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.bigint_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_aggregates.sql
+--! @brief Aggregates for public.bigint_ord.
+
+--! @brief State function for min on public.bigint_ord.
+--! @param state public.bigint_ord
+--! @param value public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord, value public.bigint_ord)
+RETURNS public.bigint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.bigint_ord.
+--! @param input public.bigint_ord
+--! @return public.bigint_ord
+CREATE AGGREGATE eql_v3.min(public.bigint_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.bigint_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.bigint_ord.
+--! @param state public.bigint_ord
+--! @param value public.bigint_ord
+--! @return public.bigint_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord, value public.bigint_ord)
+RETURNS public.bigint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.bigint_ord.
+--! @param input public.bigint_ord
+--! @return public.bigint_ord
+CREATE AGGREGATE eql_v3.max(public.bigint_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.bigint_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_bigint_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_bigint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a public.bigint_ord_ope
+--! @param b eql_v3.query_bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.bigint_ord_ope, b eql_v3.query_bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_bigint_ord_ope.
+--! @param a eql_v3.query_bigint_ord_ope
+--! @param b public.bigint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_bigint_ord_ope, b public.bigint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_operators.sql
+--! @brief Operators for eql_v3.query_bigint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord, RIGHTARG = eql_v3.query_bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_bigint_ord, RIGHTARG = public.bigint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ope_operators.sql
+--! @brief Operators for public.bigint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = public.bigint_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_eq_operators.sql
+--! @brief Operators for eql_v3.query_bigint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = eql_v3.query_bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_eq, RIGHTARG = eql_v3.query_bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_bigint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ore, RIGHTARG = eql_v3.query_bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_bigint_ord_ore, RIGHTARG = public.bigint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_eq_operators.sql
+--! @brief Operators for public.bigint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.bigint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_eq, RIGHTARG = public.bigint_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.bigint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.bigint_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/bigint_ord_ope_aggregates.sql
+--! @brief Aggregates for public.bigint_ord_ope.
+
+--! @brief State function for min on public.bigint_ord_ope.
+--! @param state public.bigint_ord_ope
+--! @param value public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.bigint_ord_ope, value public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.bigint_ord_ope.
+--! @param input public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE AGGREGATE eql_v3.min(public.bigint_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.bigint_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.bigint_ord_ope.
+--! @param state public.bigint_ord_ope
+--! @param value public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.bigint_ord_ope, value public.bigint_ord_ope)
+RETURNS public.bigint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.bigint_ord_ope.
+--! @param input public.bigint_ord_ope
+--! @return public.bigint_ord_ope
+CREATE AGGREGATE eql_v3.max(public.bigint_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.bigint_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/bigint/query_bigint_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_bigint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.bigint_ord_ope, RIGHTARG = eql_v3.query_bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_bigint_ord_ope, RIGHTARG = public.bigint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_real_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = eql_v3.query_real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ore_operators.sql
+--! @brief Operators for public.real_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_ord_ore, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ore, RIGHTARG = public.real_ord_ore
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ore, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ore
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_operators.sql
+--! @brief Operators for public.real_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord, RIGHTARG = public.real_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_functions.sql
+--! @brief Functions for eql_v3.query_real_ord.
+
+--! @brief Index extractor for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_real_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a public.real_ord
+--! @param b eql_v3.query_real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.real_ord, b eql_v3.query_real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_real_ord.
+--! @param a eql_v3.query_real_ord
+--! @param b public.real_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_real_ord, b public.real_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ore_aggregates.sql
+--! @brief Aggregates for public.real_ord_ore.
+
+--! @brief State function for min on public.real_ord_ore.
+--! @param state public.real_ord_ore
+--! @param value public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord_ore, value public.real_ord_ore)
+RETURNS public.real_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.real_ord_ore.
+--! @param input public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE AGGREGATE eql_v3.min(public.real_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.real_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.real_ord_ore.
+--! @param state public.real_ord_ore
+--! @param value public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord_ore, value public.real_ord_ore)
+RETURNS public.real_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.real_ord_ore.
+--! @param input public.real_ord_ore
+--! @return public.real_ord_ore
+CREATE AGGREGATE eql_v3.max(public.real_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.real_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ope_operators.sql
+--! @brief Operators for public.real_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ope, RIGHTARG = public.real_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_eq_operators.sql
+--! @brief Operators for eql_v3.query_real_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_eq, RIGHTARG = eql_v3.query_real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_eq, RIGHTARG = eql_v3.query_real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_real_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord_ope, RIGHTARG = eql_v3.query_real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_real_ord_ope, RIGHTARG = public.real_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_functions.sql
+--! @brief Functions for public.real.
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.real, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.real)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector text
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a public.real, selector text)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector integer
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a public.real, selector integer)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param selector public.real
+--! @return public.real
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.real)
+RETURNS public.real IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.real, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param selector public.real
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.real)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.real, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.real, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.real, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.real, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.real, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.real, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.real, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.real, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.real, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b public.real
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real, b public.real)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a public.real
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.real, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.real.
+--! @param a jsonb
+--! @param b public.real
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.real)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.real'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_aggregates.sql
+--! @brief Aggregates for public.real_ord.
+
+--! @brief State function for min on public.real_ord.
+--! @param state public.real_ord
+--! @param value public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord, value public.real_ord)
+RETURNS public.real_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.real_ord.
+--! @param input public.real_ord
+--! @return public.real_ord
+CREATE AGGREGATE eql_v3.min(public.real_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.real_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.real_ord.
+--! @param state public.real_ord
+--! @param value public.real_ord
+--! @return public.real_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord, value public.real_ord)
+RETURNS public.real_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.real_ord.
+--! @param input public.real_ord
+--! @return public.real_ord
+CREATE AGGREGATE eql_v3.max(public.real_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.real_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/query_real_ord_operators.sql
+--! @brief Operators for eql_v3.query_real_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.real_ord, RIGHTARG = eql_v3.query_real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_real_ord, RIGHTARG = public.real_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_operators.sql
+--! @brief Operators for public.real.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real, RIGHTARG = public.real
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_ord_ope_aggregates.sql
+--! @brief Aggregates for public.real_ord_ope.
+
+--! @brief State function for min on public.real_ord_ope.
+--! @param state public.real_ord_ope
+--! @param value public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.real_ord_ope, value public.real_ord_ope)
+RETURNS public.real_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.real_ord_ope.
+--! @param input public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE AGGREGATE eql_v3.min(public.real_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.real_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.real_ord_ope.
+--! @param state public.real_ord_ope
+--! @param value public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.real_ord_ope, value public.real_ord_ope)
+RETURNS public.real_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.real_ord_ope.
+--! @param input public.real_ord_ope
+--! @return public.real_ord_ope
+CREATE AGGREGATE eql_v3.max(public.real_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.real_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/real/real_eq_operators.sql
+--! @brief Operators for public.real_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.real_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.real_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.real_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.real_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.real_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_eq, RIGHTARG = public.real_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.real_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.real_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ore_aggregates.sql
+--! @brief Aggregates for public.smallint_ord_ore.
+
+--! @brief State function for min on public.smallint_ord_ore.
+--! @param state public.smallint_ord_ore
+--! @param value public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord_ore, value public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.smallint_ord_ore.
+--! @param input public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE AGGREGATE eql_v3.min(public.smallint_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.smallint_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.smallint_ord_ore.
+--! @param state public.smallint_ord_ore
+--! @param value public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord_ore, value public.smallint_ord_ore)
+RETURNS public.smallint_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.smallint_ord_ore.
+--! @param input public.smallint_ord_ore
+--! @return public.smallint_ord_ore
+CREATE AGGREGATE eql_v3.max(public.smallint_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.smallint_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_smallint_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_smallint_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a public.smallint_ord_ope
+--! @param b eql_v3.query_smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ope, b eql_v3.query_smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ope.
+--! @param a eql_v3.query_smallint_ord_ope
+--! @param b public.smallint_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord_ope, b public.smallint_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_smallint_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_smallint_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a public.smallint_ord_ore
+--! @param b eql_v3.query_smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.smallint_ord_ore, b eql_v3.query_smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_smallint_ord_ore.
+--! @param a eql_v3.query_smallint_ord_ore
+--! @param b public.smallint_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_smallint_ord_ore, b public.smallint_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_operators.sql
+--! @brief Operators for public.smallint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord, RIGHTARG = public.smallint_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_eq_operators.sql
+--! @brief Operators for eql_v3.query_smallint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = eql_v3.query_smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_eq, RIGHTARG = eql_v3.query_smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_operators.sql
+--! @brief Operators for eql_v3.query_smallint_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord, RIGHTARG = eql_v3.query_smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_smallint_ord, RIGHTARG = public.smallint_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_operators.sql
+--! @brief Operators for public.smallint.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint, RIGHTARG = public.smallint
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_smallint_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ope, RIGHTARG = eql_v3.query_smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_smallint_ord_ope, RIGHTARG = public.smallint_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_eq_operators.sql
+--! @brief Operators for public.smallint_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.smallint_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_eq, RIGHTARG = public.smallint_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.smallint_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.smallint_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_ope_aggregates.sql
+--! @brief Aggregates for public.smallint_ord_ope.
+
+--! @brief State function for min on public.smallint_ord_ope.
+--! @param state public.smallint_ord_ope
+--! @param value public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord_ope, value public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.smallint_ord_ope.
+--! @param input public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE AGGREGATE eql_v3.min(public.smallint_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.smallint_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.smallint_ord_ope.
+--! @param state public.smallint_ord_ope
+--! @param value public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord_ope, value public.smallint_ord_ope)
+RETURNS public.smallint_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.smallint_ord_ope.
+--! @param input public.smallint_ord_ope
+--! @return public.smallint_ord_ope
+CREATE AGGREGATE eql_v3.max(public.smallint_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.smallint_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/query_smallint_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_smallint_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.smallint_ord_ore, RIGHTARG = eql_v3.query_smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_smallint_ord_ore, RIGHTARG = public.smallint_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/smallint/smallint_ord_aggregates.sql
+--! @brief Aggregates for public.smallint_ord.
+
+--! @brief State function for min on public.smallint_ord.
+--! @param state public.smallint_ord
+--! @param value public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.smallint_ord, value public.smallint_ord)
+RETURNS public.smallint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.smallint_ord.
+--! @param input public.smallint_ord
+--! @return public.smallint_ord
+CREATE AGGREGATE eql_v3.min(public.smallint_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.smallint_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.smallint_ord.
+--! @param state public.smallint_ord
+--! @param value public.smallint_ord
+--! @return public.smallint_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.smallint_ord, value public.smallint_ord)
+RETURNS public.smallint_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.smallint_ord.
+--! @param input public.smallint_ord
+--! @return public.smallint_ord
+CREATE AGGREGATE eql_v3.max(public.smallint_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.smallint_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_operators.sql
+--! @brief Operators for eql_v3.query_date_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord, RIGHTARG = eql_v3.query_date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_date_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_date_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a public.date_ord_ore
+--! @param b eql_v3.query_date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ore, b eql_v3.query_date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ore.
+--! @param a eql_v3.query_date_ord_ore
+--! @param b public.date_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord_ore, b public.date_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_date_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_date_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a public.date_ord_ope
+--! @param b eql_v3.query_date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.date_ord_ope, b eql_v3.query_date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_ord_ope.
+--! @param a eql_v3.query_date_ord_ope
+--! @param b public.date_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_date_ord_ope, b public.date_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_eq_operators.sql
+--! @brief Operators for public.date_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_eq, RIGHTARG = public.date_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_operators.sql
+--! @brief Operators for public.date.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date, RIGHTARG = public.date
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ore_aggregates.sql
+--! @brief Aggregates for public.date_ord_ore.
+
+--! @brief State function for min on public.date_ord_ore.
+--! @param state public.date_ord_ore
+--! @param value public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord_ore, value public.date_ord_ore)
+RETURNS public.date_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.date_ord_ore.
+--! @param input public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE AGGREGATE eql_v3.min(public.date_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.date_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.date_ord_ore.
+--! @param state public.date_ord_ore
+--! @param value public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord_ore, value public.date_ord_ore)
+RETURNS public.date_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.date_ord_ore.
+--! @param input public.date_ord_ore
+--! @return public.date_ord_ore
+CREATE AGGREGATE eql_v3.max(public.date_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.date_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_eq_functions.sql
+--! @brief Functions for eql_v3.query_date_eq.
+
+--! @brief Index extractor for eql_v3.query_date_eq.
+--! @param a eql_v3.query_date_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_date_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a public.date_eq
+--! @param b eql_v3.query_date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.date_eq, b eql_v3.query_date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a eql_v3.query_date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a public.date_eq
+--! @param b eql_v3.query_date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.date_eq, b eql_v3.query_date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_date_eq.
+--! @param a eql_v3.query_date_eq
+--! @param b public.date_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_date_eq, b public.date_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_ope_aggregates.sql
+--! @brief Aggregates for public.date_ord_ope.
+
+--! @brief State function for min on public.date_ord_ope.
+--! @param state public.date_ord_ope
+--! @param value public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord_ope, value public.date_ord_ope)
+RETURNS public.date_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.date_ord_ope.
+--! @param input public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE AGGREGATE eql_v3.min(public.date_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.date_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.date_ord_ope.
+--! @param state public.date_ord_ope
+--! @param value public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord_ope, value public.date_ord_ope)
+RETURNS public.date_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.date_ord_ope.
+--! @param input public.date_ord_ope
+--! @return public.date_ord_ope
+CREATE AGGREGATE eql_v3.max(public.date_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.date_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_date_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ore, RIGHTARG = eql_v3.query_date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_date_ord_ore, RIGHTARG = public.date_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_operators.sql
+--! @brief Operators for public.date_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.date_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.date_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.date_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.date_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.date_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord, RIGHTARG = public.date_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.date_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.date_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/date_ord_aggregates.sql
+--! @brief Aggregates for public.date_ord.
+
+--! @brief State function for min on public.date_ord.
+--! @param state public.date_ord
+--! @param value public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.date_ord, value public.date_ord)
+RETURNS public.date_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.date_ord.
+--! @param input public.date_ord
+--! @return public.date_ord
+CREATE AGGREGATE eql_v3.min(public.date_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.date_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.date_ord.
+--! @param state public.date_ord
+--! @param value public.date_ord
+--! @return public.date_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.date_ord, value public.date_ord)
+RETURNS public.date_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.date_ord.
+--! @param input public.date_ord
+--! @return public.date_ord
+CREATE AGGREGATE eql_v3.max(public.date_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.date_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_eq_operators.sql
+--! @brief Operators for eql_v3.query_date_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_eq, RIGHTARG = eql_v3.query_date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_eq, RIGHTARG = eql_v3.query_date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_eq, RIGHTARG = public.date_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/date/query_date_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_date_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.date_ord_ope, RIGHTARG = eql_v3.query_date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_date_ord_ope, RIGHTARG = public.date_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_eq_functions.sql
+--! @brief Functions for eql_v3.query_numeric_eq.
+
+--! @brief Index extractor for eql_v3.query_numeric_eq.
+--! @param a eql_v3.query_numeric_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_numeric_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a public.numeric_eq
+--! @param b eql_v3.query_numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.numeric_eq, b eql_v3.query_numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a eql_v3.query_numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a public.numeric_eq
+--! @param b eql_v3.query_numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.numeric_eq, b eql_v3.query_numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_numeric_eq.
+--! @param a eql_v3.query_numeric_eq
+--! @param b public.numeric_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_numeric_eq, b public.numeric_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_operators.sql
+--! @brief Operators for eql_v3.query_numeric_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord, RIGHTARG = eql_v3.query_numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_numeric_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ore, RIGHTARG = eql_v3.query_numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_numeric_ord_ore, RIGHTARG = public.numeric_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_functions.sql
+--! @brief Functions for public.numeric.
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.numeric, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.numeric)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector text
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric, selector text)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector integer
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a public.numeric, selector integer)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param selector public.numeric
+--! @return public.numeric
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.numeric)
+RETURNS public.numeric IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.numeric, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param selector public.numeric
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.numeric)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.numeric, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.numeric, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.numeric, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.numeric, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.numeric, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.numeric, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.numeric, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.numeric, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.numeric, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b public.numeric
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric, b public.numeric)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a public.numeric
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.numeric, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.numeric.
+--! @param a jsonb
+--! @param b public.numeric
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.numeric)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.numeric'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_numeric_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord_ope, RIGHTARG = eql_v3.query_numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_numeric_ord_ope, RIGHTARG = public.numeric_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_eq_operators.sql
+--! @brief Operators for public.numeric_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_eq, RIGHTARG = public.numeric_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ore_aggregates.sql
+--! @brief Aggregates for public.numeric_ord_ore.
+
+--! @brief State function for min on public.numeric_ord_ore.
+--! @param state public.numeric_ord_ore
+--! @param value public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord_ore, value public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.numeric_ord_ore.
+--! @param input public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE AGGREGATE eql_v3.min(public.numeric_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.numeric_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.numeric_ord_ore.
+--! @param state public.numeric_ord_ore
+--! @param value public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord_ore, value public.numeric_ord_ore)
+RETURNS public.numeric_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.numeric_ord_ore.
+--! @param input public.numeric_ord_ore
+--! @return public.numeric_ord_ore
+CREATE AGGREGATE eql_v3.max(public.numeric_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.numeric_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_operators.sql
+--! @brief Operators for public.numeric.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric, RIGHTARG = public.numeric
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/query_numeric_eq_operators.sql
+--! @brief Operators for eql_v3.query_numeric_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_eq, RIGHTARG = eql_v3.query_numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_eq, RIGHTARG = eql_v3.query_numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_numeric_eq, RIGHTARG = public.numeric_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_ope_aggregates.sql
+--! @brief Aggregates for public.numeric_ord_ope.
+
+--! @brief State function for min on public.numeric_ord_ope.
+--! @param state public.numeric_ord_ope
+--! @param value public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord_ope, value public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.numeric_ord_ope.
+--! @param input public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE AGGREGATE eql_v3.min(public.numeric_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.numeric_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.numeric_ord_ope.
+--! @param state public.numeric_ord_ope
+--! @param value public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord_ope, value public.numeric_ord_ope)
+RETURNS public.numeric_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.numeric_ord_ope.
+--! @param input public.numeric_ord_ope
+--! @return public.numeric_ord_ope
+CREATE AGGREGATE eql_v3.max(public.numeric_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.numeric_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_operators.sql
+--! @brief Operators for public.numeric_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.numeric_ord, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord, RIGHTARG = public.numeric_ord
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.numeric_ord, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.numeric_ord
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/numeric/numeric_ord_aggregates.sql
+--! @brief Aggregates for public.numeric_ord.
+
+--! @brief State function for min on public.numeric_ord.
+--! @param state public.numeric_ord
+--! @param value public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.numeric_ord, value public.numeric_ord)
+RETURNS public.numeric_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.numeric_ord.
+--! @param input public.numeric_ord
+--! @return public.numeric_ord
+CREATE AGGREGATE eql_v3.min(public.numeric_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.numeric_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.numeric_ord.
+--! @param state public.numeric_ord
+--! @param value public.numeric_ord
+--! @return public.numeric_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.numeric_ord, value public.numeric_ord)
+RETURNS public.numeric_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.numeric_ord.
+--! @param input public.numeric_ord
+--! @return public.numeric_ord
+CREATE AGGREGATE eql_v3.max(public.numeric_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.numeric_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file v3/scalars/boolean/boolean_types.sql
+--! @brief Encrypted-domain types for boolean.
+
+DO $$
+BEGIN
+  --! @brief Encrypted domain public.boolean.
+  IF NOT EXISTS (
+    SELECT 1 FROM pg_type
+    WHERE typname = 'boolean' AND typnamespace = 'public'::regnamespace
+  ) THEN
+    CREATE DOMAIN public.boolean AS jsonb
+      CHECK (
+        jsonb_typeof(VALUE) = 'object'
+        AND VALUE ? 'v'
+        AND VALUE ? 'i'
+        AND VALUE ? 'c'
+        AND VALUE->>'v' = '3'
+      );
+  END IF;
+
+  COMMENT ON DOMAIN public.boolean IS 'EQL encrypted boolean (storage only)';
+END
+$$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/boolean/boolean_functions.sql
+--! @brief Functions for public.boolean.
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.boolean, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.boolean, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.boolean)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector text
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a public.boolean, selector text)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector integer
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a public.boolean, selector integer)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param selector public.boolean
+--! @return public.boolean
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.boolean)
+RETURNS public.boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.boolean, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.boolean, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param selector public.boolean
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.boolean)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.boolean, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.boolean, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.boolean, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.boolean, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.boolean, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.boolean, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.boolean, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.boolean, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.boolean, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b public.boolean
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.boolean, b public.boolean)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a public.boolean
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.boolean, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.boolean.
+--! @param a jsonb
+--! @param b public.boolean
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.boolean)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.boolean'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/boolean/boolean_operators.sql
+--! @brief Operators for public.boolean.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.boolean, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.boolean, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.boolean, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.boolean, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.boolean, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.boolean, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.boolean, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.boolean, RIGHTARG = public.boolean
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.boolean, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.boolean
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_functions.sql
+--! @brief Functions for eql_v3.query_double_ord.
+
+--! @brief Index extractor for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_double_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a public.double_ord
+--! @param b eql_v3.query_double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord, b eql_v3.query_double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord.
+--! @param a eql_v3.query_double_ord
+--! @param b public.double_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord, b public.double_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_double_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_double_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a public.double_ord_ore
+--! @param b eql_v3.query_double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ore, b eql_v3.query_double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ore.
+--! @param a eql_v3.query_double_ord_ore
+--! @param b public.double_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord_ore, b public.double_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_aggregates.sql
+--! @brief Aggregates for public.double_ord.
+
+--! @brief State function for min on public.double_ord.
+--! @param state public.double_ord
+--! @param value public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord, value public.double_ord)
+RETURNS public.double_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.double_ord.
+--! @param input public.double_ord
+--! @return public.double_ord
+CREATE AGGREGATE eql_v3.min(public.double_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.double_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.double_ord.
+--! @param state public.double_ord
+--! @param value public.double_ord
+--! @return public.double_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord, value public.double_ord)
+RETURNS public.double_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.double_ord.
+--! @param input public.double_ord
+--! @return public.double_ord
+CREATE AGGREGATE eql_v3.max(public.double_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.double_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ope_aggregates.sql
+--! @brief Aggregates for public.double_ord_ope.
+
+--! @brief State function for min on public.double_ord_ope.
+--! @param state public.double_ord_ope
+--! @param value public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord_ope, value public.double_ord_ope)
+RETURNS public.double_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.double_ord_ope.
+--! @param input public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE AGGREGATE eql_v3.min(public.double_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.double_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.double_ord_ope.
+--! @param state public.double_ord_ope
+--! @param value public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord_ope, value public.double_ord_ope)
+RETURNS public.double_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.double_ord_ope.
+--! @param input public.double_ord_ope
+--! @return public.double_ord_ope
+CREATE AGGREGATE eql_v3.max(public.double_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.double_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_operators.sql
+--! @brief Operators for public.double.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double, RIGHTARG = public.double
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_eq_operators.sql
+--! @brief Operators for eql_v3.query_double_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_eq, RIGHTARG = eql_v3.query_double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_eq, RIGHTARG = eql_v3.query_double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_double_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_double_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a public.double_ord_ope
+--! @param b eql_v3.query_double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.double_ord_ope, b eql_v3.query_double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_double_ord_ope.
+--! @param a eql_v3.query_double_ord_ope
+--! @param b public.double_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_double_ord_ope, b public.double_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_eq_operators.sql
+--! @brief Operators for public.double_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.double_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.double_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.double_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.double_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.double_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_eq, RIGHTARG = public.double_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.double_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.double_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_double_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ore, RIGHTARG = eql_v3.query_double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_double_ord_ore, RIGHTARG = public.double_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_operators.sql
+--! @brief Operators for eql_v3.query_double_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord, RIGHTARG = eql_v3.query_double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_double_ord, RIGHTARG = public.double_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/double_ord_ore_aggregates.sql
+--! @brief Aggregates for public.double_ord_ore.
+
+--! @brief State function for min on public.double_ord_ore.
+--! @param state public.double_ord_ore
+--! @param value public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.double_ord_ore, value public.double_ord_ore)
+RETURNS public.double_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.double_ord_ore.
+--! @param input public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE AGGREGATE eql_v3.min(public.double_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.double_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.double_ord_ore.
+--! @param state public.double_ord_ore
+--! @param value public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.double_ord_ore, value public.double_ord_ore)
+RETURNS public.double_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.double_ord_ore.
+--! @param input public.double_ord_ore
+--! @return public.double_ord_ore
+CREATE AGGREGATE eql_v3.max(public.double_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.double_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/double/query_double_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_double_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.double_ord_ope, RIGHTARG = eql_v3.query_double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_double_ord_ope, RIGHTARG = public.double_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_aggregates.sql
+--! @brief Aggregates for public.integer_ord.
+
+--! @brief State function for min on public.integer_ord.
+--! @param state public.integer_ord
+--! @param value public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord, value public.integer_ord)
+RETURNS public.integer_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.integer_ord.
+--! @param input public.integer_ord
+--! @return public.integer_ord
+CREATE AGGREGATE eql_v3.min(public.integer_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.integer_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.integer_ord.
+--! @param state public.integer_ord
+--! @param value public.integer_ord
+--! @return public.integer_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord, value public.integer_ord)
+RETURNS public.integer_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.integer_ord.
+--! @param input public.integer_ord
+--! @return public.integer_ord
+CREATE AGGREGATE eql_v3.max(public.integer_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.integer_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ore_aggregates.sql
+--! @brief Aggregates for public.integer_ord_ore.
+
+--! @brief State function for min on public.integer_ord_ore.
+--! @param state public.integer_ord_ore
+--! @param value public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord_ore, value public.integer_ord_ore)
+RETURNS public.integer_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.integer_ord_ore.
+--! @param input public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE AGGREGATE eql_v3.min(public.integer_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.integer_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.integer_ord_ore.
+--! @param state public.integer_ord_ore
+--! @param value public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord_ore, value public.integer_ord_ore)
+RETURNS public.integer_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.integer_ord_ore.
+--! @param input public.integer_ord_ore
+--! @return public.integer_ord_ore
+CREATE AGGREGATE eql_v3.max(public.integer_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.integer_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_integer_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_integer_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a public.integer_ord_ore
+--! @param b eql_v3.query_integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ore, b eql_v3.query_integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ore.
+--! @param a eql_v3.query_integer_ord_ore
+--! @param b public.integer_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord_ore, b public.integer_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ope_operators.sql
+--! @brief Operators for public.integer_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = public.integer_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_integer_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_integer_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a public.integer_ord_ope
+--! @param b eql_v3.query_integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord_ope, b eql_v3.query_integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord_ope.
+--! @param a eql_v3.query_integer_ord_ope
+--! @param b public.integer_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord_ope, b public.integer_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_operators.sql
+--! @brief Operators for public.integer.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer, RIGHTARG = public.integer
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_eq_operators.sql
+--! @brief Operators for eql_v3.query_integer_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_eq, RIGHTARG = eql_v3.query_integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_eq, RIGHTARG = eql_v3.query_integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_functions.sql
+--! @brief Functions for eql_v3.query_integer_ord.
+
+--! @brief Index extractor for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_integer_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a public.integer_ord
+--! @param b eql_v3.query_integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.integer_ord, b eql_v3.query_integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_integer_ord.
+--! @param a eql_v3.query_integer_ord
+--! @param b public.integer_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_integer_ord, b public.integer_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_integer_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ore, RIGHTARG = eql_v3.query_integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_integer_ord_ore, RIGHTARG = public.integer_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_eq_operators.sql
+--! @brief Operators for public.integer_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.integer_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.integer_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.integer_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.integer_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.integer_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_eq, RIGHTARG = public.integer_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.integer_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.integer_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_operators.sql
+--! @brief Operators for eql_v3.query_integer_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord, RIGHTARG = eql_v3.query_integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_integer_ord, RIGHTARG = public.integer_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/integer_ord_ope_aggregates.sql
+--! @brief Aggregates for public.integer_ord_ope.
+
+--! @brief State function for min on public.integer_ord_ope.
+--! @param state public.integer_ord_ope
+--! @param value public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.integer_ord_ope, value public.integer_ord_ope)
+RETURNS public.integer_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.integer_ord_ope.
+--! @param input public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE AGGREGATE eql_v3.min(public.integer_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.integer_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.integer_ord_ope.
+--! @param state public.integer_ord_ope
+--! @param value public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.integer_ord_ope, value public.integer_ord_ope)
+RETURNS public.integer_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.integer_ord_ope.
+--! @param input public.integer_ord_ope
+--! @return public.integer_ord_ope
+CREATE AGGREGATE eql_v3.max(public.integer_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.integer_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/integer/query_integer_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_integer_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.integer_ord_ope, RIGHTARG = eql_v3.query_integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_integer_ord_ope, RIGHTARG = public.integer_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_match_functions.sql
+--! @brief Functions for eql_v3.query_text_match.
+
+--! @brief Index extractor for eql_v3.query_text_match.
+--! @param a eql_v3.query_text_match
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a eql_v3.query_text_match)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a public.text_match
+--! @param b eql_v3.query_text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_match, b eql_v3.query_text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a eql_v3.query_text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a eql_v3.query_text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a public.text_match
+--! @param b eql_v3.query_text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_match, b eql_v3.query_text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_match.
+--! @param a eql_v3.query_text_match
+--! @param b public.text_match
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a eql_v3.query_text_match, b public.text_match)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_functions.sql
+--! @brief Functions for public.text.
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.text, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector text
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a public.text, selector text)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector integer
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a public.text, selector integer)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param selector public.text
+--! @return public.text
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.text)
+RETURNS public.text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.text, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param selector public.text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.text, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.text, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.text, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.text, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.text, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.text, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.text, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.text, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.text, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b public.text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text, b public.text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a public.text
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.text, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.text.
+--! @param a jsonb
+--! @param b public.text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.text'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_text_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord_ope)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_text_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a public.text_ord_ope
+--! @param b eql_v3.query_text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ope, b eql_v3.query_text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ope.
+--! @param a eql_v3.query_text_ord_ope
+--! @param b public.text_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord_ope, b public.text_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_operators.sql
+--! @brief Operators for eql_v3.query_text_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord, RIGHTARG = eql_v3.query_text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_ord, RIGHTARG = public.text_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_eq_functions.sql
+--! @brief Functions for eql_v3.query_text_eq.
+
+--! @brief Index extractor for eql_v3.query_text_eq.
+--! @param a eql_v3.query_text_eq
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_eq)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a public.text_eq
+--! @param b eql_v3.query_text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_eq, b eql_v3.query_text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a eql_v3.query_text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a public.text_eq
+--! @param b eql_v3.query_text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_eq, b eql_v3.query_text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_eq.
+--! @param a eql_v3.query_text_eq
+--! @param b public.text_eq
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_eq, b public.text_eq)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_match_operators.sql
+--! @brief Operators for public.text_match.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_match, RIGHTARG = jsonb,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_match, RIGHTARG = jsonb,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_match, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_match, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_match, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_match, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_match, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_match, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_match, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_match, RIGHTARG = public.text_match
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_match, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_match
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_search_operators.sql
+--! @brief Operators for public.text_search.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_search, RIGHTARG = jsonb,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_search, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_search
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_search, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_search
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_search, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_search, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_search, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_search, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_search, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_search, RIGHTARG = public.text_search
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_search, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_search
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_text_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_ord_ore)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a public.text_ord_ore
+--! @param b eql_v3.query_text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_ord_ore, b eql_v3.query_text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_ord_ore.
+--! @param a eql_v3.query_text_ord_ore
+--! @param b public.text_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_ord_ore, b public.text_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_search_functions.sql
+--! @brief Functions for eql_v3.query_text_search.
+
+--! @brief Index extractor for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @return eql_v3_internal.hmac_256
+CREATE FUNCTION eql_v3.eq_term(a eql_v3.query_text_search)
+RETURNS eql_v3_internal.hmac_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_text_search)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Index extractor for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @return eql_v3_internal.bloom_filter
+CREATE FUNCTION eql_v3.match_term(a eql_v3.query_text_search)
+RETURNS eql_v3_internal.bloom_filter
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.bloom_filter(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contains(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) @> eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a public.text_search
+--! @param b eql_v3.query_text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a public.text_search, b eql_v3.query_text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_text_search.
+--! @param a eql_v3.query_text_search
+--! @param b public.text_search
+--! @return boolean
+CREATE FUNCTION eql_v3.contained_by(a eql_v3.query_text_search, b public.text_search)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.match_term(a) <@ eql_v3.match_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_eq_operators.sql
+--! @brief Operators for public.text_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_eq, RIGHTARG = public.text_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ore_aggregates.sql
+--! @brief Aggregates for public.text_ord_ore.
+
+--! @brief State function for min on public.text_ord_ore.
+--! @param state public.text_ord_ore
+--! @param value public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord_ore, value public.text_ord_ore)
+RETURNS public.text_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_ord_ore.
+--! @param input public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE AGGREGATE eql_v3.min(public.text_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_ord_ore.
+--! @param state public.text_ord_ore
+--! @param value public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord_ore, value public.text_ord_ore)
+RETURNS public.text_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_ord_ore.
+--! @param input public.text_ord_ore
+--! @return public.text_ord_ore
+CREATE AGGREGATE eql_v3.max(public.text_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_aggregates.sql
+--! @brief Aggregates for public.text_ord.
+
+--! @brief State function for min on public.text_ord.
+--! @param state public.text_ord
+--! @param value public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord, value public.text_ord)
+RETURNS public.text_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_ord.
+--! @param input public.text_ord
+--! @return public.text_ord
+CREATE AGGREGATE eql_v3.min(public.text_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_ord.
+--! @param state public.text_ord
+--! @param value public.text_ord
+--! @return public.text_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord, value public.text_ord)
+RETURNS public.text_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_ord.
+--! @param input public.text_ord
+--! @return public.text_ord
+CREATE AGGREGATE eql_v3.max(public.text_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_text_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = eql_v3.query_text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ope_operators.sql
+--! @brief Operators for public.text_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text_ord_ope, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ope, RIGHTARG = public.text_ord_ope
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text_ord_ope, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text_ord_ope
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_ord_ope_aggregates.sql
+--! @brief Aggregates for public.text_ord_ope.
+
+--! @brief State function for min on public.text_ord_ope.
+--! @param state public.text_ord_ope
+--! @param value public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_ord_ope, value public.text_ord_ope)
+RETURNS public.text_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_ord_ope.
+--! @param input public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE AGGREGATE eql_v3.min(public.text_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_ord_ope.
+--! @param state public.text_ord_ope
+--! @param value public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_ord_ope, value public.text_ord_ope)
+RETURNS public.text_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_ord_ope.
+--! @param input public.text_ord_ope
+--! @return public.text_ord_ope
+CREATE AGGREGATE eql_v3.max(public.text_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_match_operators.sql
+--! @brief Operators for eql_v3.query_text_match.
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_match, RIGHTARG = eql_v3.query_text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = eql_v3.query_text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_match, RIGHTARG = eql_v3.query_text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = eql_v3.query_text_match, RIGHTARG = public.text_match,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_operators.sql
+--! @brief Operators for public.text.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.text, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.text, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.text, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.text, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.text, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text, RIGHTARG = public.text
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.text, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.text
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/text_search_aggregates.sql
+--! @brief Aggregates for public.text_search.
+
+--! @brief State function for min on public.text_search.
+--! @param state public.text_search
+--! @param value public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.text_search, value public.text_search)
+RETURNS public.text_search
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.text_search.
+--! @param input public.text_search
+--! @return public.text_search
+CREATE AGGREGATE eql_v3.min(public.text_search) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.text_search,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.text_search.
+--! @param state public.text_search
+--! @param value public.text_search
+--! @return public.text_search
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.text_search, value public.text_search)
+RETURNS public.text_search
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.text_search.
+--! @param input public.text_search
+--! @return public.text_search
+CREATE AGGREGATE eql_v3.max(public.text_search) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.text_search,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_search_operators.sql
+--! @brief Operators for eql_v3.query_text_search.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3.contains,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = <@, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = public.text_search, RIGHTARG = eql_v3.query_text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3.contained_by,
+  LEFTARG = eql_v3.query_text_search, RIGHTARG = public.text_search,
+  COMMUTATOR = @>, RESTRICT = contsel, JOIN = contjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_eq_operators.sql
+--! @brief Operators for eql_v3.query_text_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_eq, RIGHTARG = eql_v3.query_text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_eq, RIGHTARG = eql_v3.query_text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_eq, RIGHTARG = public.text_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/text/query_text_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_text_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.text_ord_ore, RIGHTARG = eql_v3.query_text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_text_ord_ore, RIGHTARG = public.text_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_functions.sql
+--! @brief Functions for public.timestamp.
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.eq(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.neq(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lt(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.lte(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gt(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.gte(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '>=', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contains(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a public.timestamp, b jsonb)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return boolean
+CREATE FUNCTION eql_v3_internal.contained_by(a jsonb, b public.timestamp)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '<@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector text
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp, selector text)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector integer
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a public.timestamp, selector integer)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param selector public.timestamp
+--! @return public.timestamp
+CREATE FUNCTION eql_v3_internal."->"(a jsonb, selector public.timestamp)
+RETURNS public.timestamp IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector text
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp, selector text)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param selector integer
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a public.timestamp, selector integer)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param selector public.timestamp
+--! @return text
+CREATE FUNCTION eql_v3_internal."->>"(a jsonb, selector public.timestamp)
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '->>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?"(a public.timestamp, b text)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?|"(a public.timestamp, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?|', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."?&"(a public.timestamp, b text[])
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '?&', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@?"(a public.timestamp, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@?', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonpath
+--! @return boolean
+CREATE FUNCTION eql_v3_internal."@@"(a public.timestamp, b jsonpath)
+RETURNS boolean IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '@@', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#>"(a public.timestamp, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return text
+CREATE FUNCTION eql_v3_internal."#>>"(a public.timestamp, b text[])
+RETURNS text IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#>>', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b text)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b integer
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b integer)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."-"(a public.timestamp, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b text[]
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."#-"(a public.timestamp, b text[])
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '#-', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b public.timestamp
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp, b public.timestamp)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a public.timestamp
+--! @param b jsonb
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a public.timestamp, b jsonb)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+
+--! @brief Unsupported operator blocker for public.timestamp.
+--! @param a jsonb
+--! @param b public.timestamp
+--! @return jsonb
+CREATE FUNCTION eql_v3_internal."||"(a jsonb, b public.timestamp)
+RETURNS jsonb IMMUTABLE PARALLEL SAFE
+AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.timestamp'; END; $$
+LANGUAGE plpgsql;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_aggregates.sql
+--! @brief Aggregates for public.timestamp_ord.
+
+--! @brief State function for min on public.timestamp_ord.
+--! @param state public.timestamp_ord
+--! @param value public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord, value public.timestamp_ord)
+RETURNS public.timestamp_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.timestamp_ord.
+--! @param input public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.timestamp_ord,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.timestamp_ord.
+--! @param state public.timestamp_ord
+--! @param value public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord, value public.timestamp_ord)
+RETURNS public.timestamp_ord
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.timestamp_ord.
+--! @param input public.timestamp_ord
+--! @return public.timestamp_ord
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.timestamp_ord,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ore_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_ord_ore.
+
+--! @brief Index extractor for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_timestamp_ord_ore)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a public.timestamp_ord_ore
+--! @param b eql_v3.query_timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ore, b eql_v3.query_timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ore.
+--! @param a eql_v3.query_timestamp_ord_ore
+--! @param b public.timestamp_ord_ore
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord_ore, b public.timestamp_ord_ore)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_eq_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = eql_v3.query_timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = eql_v3.query_timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_eq_operators.sql
+--! @brief Operators for public.timestamp_eq.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp_eq, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_eq, RIGHTARG = public.timestamp_eq
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp_eq, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp_eq
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ope_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_ord_ope.
+
+--! @brief Index extractor for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @return eql_v3_internal.ope_cllw
+CREATE FUNCTION eql_v3.ord_ope_term(a eql_v3.query_timestamp_ord_ope)
+RETURNS eql_v3_internal.ope_cllw
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ope_cllw(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) = eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <> eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a public.timestamp_ord_ope
+--! @param b eql_v3.query_timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord_ope, b eql_v3.query_timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord_ope.
+--! @param a eql_v3.query_timestamp_ord_ope
+--! @param b public.timestamp_ord_ope
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord_ope, b public.timestamp_ord_ope)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ope_aggregates.sql
+--! @brief Aggregates for public.timestamp_ord_ope.
+
+--! @brief State function for min on public.timestamp_ord_ope.
+--! @param state public.timestamp_ord_ope
+--! @param value public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord_ope, value public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.timestamp_ord_ope.
+--! @param input public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord_ope) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.timestamp_ord_ope,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.timestamp_ord_ope.
+--! @param state public.timestamp_ord_ope
+--! @param value public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord_ope, value public.timestamp_ord_ope)
+RETURNS public.timestamp_ord_ope
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.timestamp_ord_ope.
+--! @param input public.timestamp_ord_ope
+--! @return public.timestamp_ord_ope
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord_ope) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.timestamp_ord_ope,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_functions.sql
+--! @brief Functions for eql_v3.query_timestamp_ord.
+
+--! @brief Index extractor for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @return eql_v3_internal.ore_block_256
+CREATE FUNCTION eql_v3.ord_term(a eql_v3.query_timestamp_ord)
+RETURNS eql_v3_internal.ore_block_256
+LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.eq(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) = eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.neq(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <> eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lt(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) < eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.lte(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) <= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gt(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) > eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a public.timestamp_ord
+--! @param b eql_v3.query_timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a public.timestamp_ord, b eql_v3.query_timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+
+--! @brief Operator wrapper for eql_v3.query_timestamp_ord.
+--! @param a eql_v3.query_timestamp_ord
+--! @param b public.timestamp_ord
+--! @return boolean
+CREATE FUNCTION eql_v3.gte(a eql_v3.query_timestamp_ord, b public.timestamp_ord)
+RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$ SELECT eql_v3.ord_term(a) >= eql_v3.ord_term(b) $$;
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ore_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_ord_ore.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ore, RIGHTARG = eql_v3.query_timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_timestamp_ord_ore, RIGHTARG = public.timestamp_ord_ore,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_ord_ore_aggregates.sql
+--! @brief Aggregates for public.timestamp_ord_ore.
+
+--! @brief State function for min on public.timestamp_ord_ore.
+--! @param state public.timestamp_ord_ore
+--! @param value public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal.min_sfunc(state public.timestamp_ord_ore, value public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value < state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate for public.timestamp_ord_ore.
+--! @param input public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE AGGREGATE eql_v3.min(public.timestamp_ord_ore) (
+  sfunc = eql_v3_internal.min_sfunc,
+  stype = public.timestamp_ord_ore,
+  combinefunc = eql_v3_internal.min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.timestamp_ord_ore.
+--! @param state public.timestamp_ord_ore
+--! @param value public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE FUNCTION eql_v3_internal.max_sfunc(state public.timestamp_ord_ore, value public.timestamp_ord_ore)
+RETURNS public.timestamp_ord_ore
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  IF value > state THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate for public.timestamp_ord_ore.
+--! @param input public.timestamp_ord_ore
+--! @return public.timestamp_ord_ore
+CREATE AGGREGATE eql_v3.max(public.timestamp_ord_ore) (
+  sfunc = eql_v3_internal.max_sfunc,
+  stype = public.timestamp_ord_ore,
+  combinefunc = eql_v3_internal.max_sfunc,
+  parallel = safe
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/timestamp_operators.sql
+--! @brief Operators for public.timestamp.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.eq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.neq,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.lt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.lte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.gt,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.gte,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.contains,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.contained_by,
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = public.timestamp, RIGHTARG = integer
+);
+
+CREATE OPERATOR -> (
+  FUNCTION = eql_v3_internal."->",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = public.timestamp, RIGHTARG = integer
+);
+
+CREATE OPERATOR ->> (
+  FUNCTION = eql_v3_internal."->>",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal."?",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal."?|",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal."?&",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal."@?",
+  LEFTARG = public.timestamp, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal."@@",
+  LEFTARG = public.timestamp, RIGHTARG = jsonpath
+);
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal."#>",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal."#>>",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp, RIGHTARG = text
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp, RIGHTARG = integer
+);
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal."-",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal."#-",
+  LEFTARG = public.timestamp, RIGHTARG = text[]
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp, RIGHTARG = public.timestamp
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = public.timestamp, RIGHTARG = jsonb
+);
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal."||",
+  LEFTARG = jsonb, RIGHTARG = public.timestamp
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_ord.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord, RIGHTARG = eql_v3.query_timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_timestamp_ord, RIGHTARG = public.timestamp_ord,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+-- AUTOMATICALLY GENERATED FILE.
+
+--! @file encrypted_domain/timestamp/query_timestamp_ord_ope_operators.sql
+--! @brief Operators for eql_v3.query_timestamp_ord_ope.
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = =, NEGATOR = <>, RESTRICT = eqsel, JOIN = eqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <>, NEGATOR = =, RESTRICT = neqsel, JOIN = neqjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >, NEGATOR = >=, RESTRICT = scalarltsel, JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = >=, NEGATOR = >, RESTRICT = scalarlesel, JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <, NEGATOR = <=, RESTRICT = scalargtsel, JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = public.timestamp_ord_ope, RIGHTARG = eql_v3.query_timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG = eql_v3.query_timestamp_ord_ope, RIGHTARG = public.timestamp_ord_ope,
+  COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel
+);
+
+--! @file v3/sem/ore_block_256/operator_class.sql
+--! @brief B-tree operator family + default class on eql_v3_internal.ore_block_256.
+--!
+--! Gives the composite type its DEFAULT btree opclass so the recommended
+--! functional index `CREATE INDEX ON t (eql_v3_internal.ord_term(col))` engages without
+--! an explicit opclass annotation (design D4).
+--!
+--! @note Creating an operator family/class requires superuser: Postgres forbids
+--!       CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index
+--!       integrity. Managed platforms (Supabase, and most hosted Postgres) run
+--!       the installer as a non-superuser role, so the DO block below ATTEMPTS
+--!       the creation and skips it on insufficient_privilege (SQLSTATE 42501),
+--!       letting the single installer run everywhere. When the class is absent,
+--!       ORE ordered scans over eql_v3_internal.ore_block_256 are unavailable,
+--!       but the order-preserving (OPE) ordering domains — whose extractor
+--!       return types carry a native btree opclass — still index without it. On
+--!       superuser installs (self-managed Postgres, the SQLx test matrix) the
+--!       class is created normally. Any non-privilege error still propagates.
+--! @see eql_v3_internal.compare_ore_block_256_terms
+
+DO $do$
+BEGIN
+  EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree';
+
+  EXECUTE $ddl$
+    CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class
+      DEFAULT FOR TYPE eql_v3_internal.ore_block_256
+      USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS
+        OPERATOR 1 public.<,
+        OPERATOR 2 public.<=,
+        OPERATOR 3 public.=,
+        OPERATOR 4 public.>=,
+        OPERATOR 5 public.>,
+        FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256)
+  $ddl$;
+
+  RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_block_256_operator_class';
+EXCEPTION
+  WHEN insufficient_privilege THEN
+    RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_block_256_operator_class (requires superuser); ORE ordered indexes on ore_block_256 unavailable, OPE ordering domains unaffected';
+END;
+$do$;
+
+--! @file v3/sem/ore_cllw/operators.sql
+--! @brief Comparison operators on the eql_v3_internal.ore_cllw composite type.
+--!
+--! Each backing function reduces to a single SELECT over
+--! eql_v3_internal.compare_ore_cllw_term(a, b) and is inlinable so the planner can fold
+--! it through to functional-index matching. The inner comparator is plpgsql
+--! (per-byte loop) and is not inlined — fine for index *match*.
+--!
+--! @note Deliberately no HASHES / MERGES — the CLLW protocol gives ordering,
+--!       not a hash; there is no merge-joinable opclass on the other side.
+--! @see eql_v3_internal.compare_ore_cllw_term
+
+--! @brief Equality backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the CLLW ORE terms are equal
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_eq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 0
+$$;
+
+--! @brief Not-equal backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the CLLW ORE terms are not equal
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_neq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 0
+$$;
+
+--! @brief Less-than backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is less than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_lt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = -1
+$$;
+
+--! @brief Less-than-or-equal backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is less than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_lte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 1
+$$;
+
+--! @brief Greater-than backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is greater than the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_gt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 1
+$$;
+
+--! @brief Greater-than-or-equal backing function for eql_v3_internal.ore_cllw.
+--! @internal
+--!
+--! @param a eql_v3_internal.ore_cllw Left operand
+--! @param b eql_v3_internal.ore_cllw Right operand
+--! @return boolean True if the left operand is greater than or equal to the right operand
+--!
+--! @see eql_v3_internal.compare_ore_cllw_term
+CREATE FUNCTION eql_v3_internal.ore_cllw_gte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> -1
+$$;
+
+
+CREATE OPERATOR public.= (
+  FUNCTION = eql_v3_internal.ore_cllw_eq,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.=),
+  NEGATOR = OPERATOR(public.<>),
+  RESTRICT = eqsel,
+  JOIN = eqjoinsel
+);
+
+CREATE OPERATOR public.<> (
+  FUNCTION = eql_v3_internal.ore_cllw_neq,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.<>),
+  NEGATOR = OPERATOR(public.=),
+  RESTRICT = neqsel,
+  JOIN = neqjoinsel
+);
+
+CREATE OPERATOR public.< (
+  FUNCTION = eql_v3_internal.ore_cllw_lt,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.>),
+  NEGATOR = OPERATOR(public.>=),
+  RESTRICT = scalarltsel,
+  JOIN = scalarltjoinsel
+);
+
+CREATE OPERATOR public.<= (
+  FUNCTION = eql_v3_internal.ore_cllw_lte,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.>=),
+  NEGATOR = OPERATOR(public.>),
+  RESTRICT = scalarlesel,
+  JOIN = scalarlejoinsel
+);
+
+CREATE OPERATOR public.> (
+  FUNCTION = eql_v3_internal.ore_cllw_gt,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.<),
+  NEGATOR = OPERATOR(public.<=),
+  RESTRICT = scalargtsel,
+  JOIN = scalargtjoinsel
+);
+
+CREATE OPERATOR public.>= (
+  FUNCTION = eql_v3_internal.ore_cllw_gte,
+  LEFTARG = eql_v3_internal.ore_cllw,
+  RIGHTARG = eql_v3_internal.ore_cllw,
+  COMMUTATOR = OPERATOR(public.<=),
+  NEGATOR = OPERATOR(public.<),
+  RESTRICT = scalargesel,
+  JOIN = scalargejoinsel
+);
+
+--! @file v3/sem/ore_cllw/operator_class.sql
+--! @brief Btree operator class on the eql_v3_internal.ore_cllw composite type.
+--!
+--! DEFAULT FOR TYPE so a functional btree index on eql_v3_internal.ore_cllw(expr)
+--! engages without an explicit opclass annotation. FUNCTION 1 is the three-way
+--! comparator btree's internal sort uses; it is plpgsql by design (per-byte
+--! CLLW protocol needs iteration) and is called once per index-entry pair
+--! during build / search, not per-row in the outer query.
+--!
+--! @note Creating an operator family/class requires superuser: Postgres forbids
+--!       CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index
+--!       integrity. Managed platforms (Supabase, and most hosted Postgres) run
+--!       the installer as a non-superuser role, so the DO block below ATTEMPTS
+--!       the creation and skips it on insufficient_privilege (SQLSTATE 42501),
+--!       letting the single installer run everywhere. When the class is absent,
+--!       ORE ordered scans over eql_v3_internal.ore_cllw are unavailable, but
+--!       the order-preserving (OPE) ordering domains — whose extractor return
+--!       types carry a native btree opclass — still index without it. On
+--!       superuser installs (self-managed Postgres, the SQLx test matrix) the
+--!       class is created normally. Any non-privilege error still propagates.
+--! @see eql_v3_internal.compare_ore_cllw_term
+
+DO $do$
+BEGIN
+  EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_cllw_ops USING btree';
+
+  EXECUTE $ddl$
+    CREATE OPERATOR CLASS eql_v3_internal.ore_cllw_ops
+      DEFAULT FOR TYPE eql_v3_internal.ore_cllw
+      USING btree FAMILY eql_v3_internal.ore_cllw_ops AS
+        OPERATOR 1 public.<  (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 2 public.<= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 3 public.=  (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 4 public.>= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        OPERATOR 5 public.>  (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw),
+        FUNCTION 1 eql_v3_internal.compare_ore_cllw_term(eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw)
+  $ddl$;
+
+  RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_cllw_ops';
+EXCEPTION
+  WHEN insufficient_privilege THEN
+    RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_cllw_ops (requires superuser); ORE ordered indexes on ore_cllw unavailable, OPE ordering domains unaffected';
+END;
+$do$;
+
+--! @file v3/jsonb/aggregates.sql
+--! @brief min / max aggregates over public.jsonb_entry.
+--!
+--! SteVec document entries extracted at a selector (`doc -> 'sel'`) order by
+--! their CLLW ORE (`oc`) term, so the extremum is picked by comparing
+--! `eql_v3.ore_cllw(entry)` rather than the scalar Block-ORE `ord_term` the
+--! generated scalar ord aggregates use. Same STRICT + PARALLEL SAFE shape as the
+--! generated scalar `min`/`max` so partial/parallel aggregation is available on
+--! large GROUP BY workloads.
+--!
+--! Per the encrypted-domain footgun rules the state functions are
+--! `LANGUAGE plpgsql` with the pinned `search_path` — a `LANGUAGE sql` body would
+--! be inlinable and the planner could elide it.
+--!
+--! @note **Only `oc`-carrying entries are orderable.** `eql_v3.ore_cllw(entry)`
+--!   returns NULL when an entry has no `oc` (CLLW ORE) term — the same entries a
+--!   `eql_v3.ore_cllw` btree NULL-filters from range scans. The state functions
+--!   therefore IGNORE `oc`-less entries (they never become or survive as the
+--!   extremum), so `min`/`max` is well-defined over a mix of `oc`-carrying and
+--!   `oc`-less entries and is not corrupted by an `oc`-less seed. A naive
+--!   `ore_cllw(value) < ore_cllw(state)` would be NULL whenever either side
+--!   lacks `oc`, pinning a wrong (`oc`-less) extremum when the first aggregated
+--!   row is `oc`-less. An all-`oc`-less input has no orderable extremum and
+--!   returns the (arbitrary) STRICT seed.
+
+--! @brief State function for min on public.jsonb_entry.
+--!
+--! Keeps whichever orderable entry has the lesser CLLW ORE term. STRICT, so SQL
+--! NULL entries are skipped by the aggregate machinery; `oc`-less (non-orderable)
+--! entries are skipped explicitly (see the @note on this file).
+--!
+--! @param state public.jsonb_entry Running extremum.
+--! @param value public.jsonb_entry Candidate entry.
+--! @return public.jsonb_entry The lesser orderable entry by `ore_cllw`.
+CREATE FUNCTION eql_v3_internal.jsonb_entry_min_sfunc(
+  state public.jsonb_entry,
+  value public.jsonb_entry
+)
+RETURNS public.jsonb_entry
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+  value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value);
+  state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state);
+BEGIN
+  -- A non-orderable (oc-less) candidate never replaces the running extremum.
+  IF value_ore IS NULL THEN
+    RETURN state;
+  END IF;
+  -- Adopt the candidate when the running extremum is itself non-orderable
+  -- (e.g. an oc-less STRICT seed) or strictly greater.
+  IF state_ore IS NULL OR value_ore < state_ore THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief min aggregate over public.jsonb_entry.
+--! @param input public.jsonb_entry
+--! @return public.jsonb_entry The entry with the smallest CLLW ORE term.
+CREATE AGGREGATE eql_v3.min(public.jsonb_entry) (
+  sfunc = eql_v3_internal.jsonb_entry_min_sfunc,
+  stype = public.jsonb_entry,
+  combinefunc = eql_v3_internal.jsonb_entry_min_sfunc,
+  parallel = safe
+);
+
+--! @brief State function for max on public.jsonb_entry.
+--!
+--! Keeps whichever orderable entry has the greater CLLW ORE term. `oc`-less
+--! entries are skipped, mirroring `jsonb_entry_min_sfunc` (see the file @note).
+--!
+--! @param state public.jsonb_entry Running extremum.
+--! @param value public.jsonb_entry Candidate entry.
+--! @return public.jsonb_entry The greater orderable entry by `ore_cllw`.
+CREATE FUNCTION eql_v3_internal.jsonb_entry_max_sfunc(
+  state public.jsonb_entry,
+  value public.jsonb_entry
+)
+RETURNS public.jsonb_entry
+LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+DECLARE
+  value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value);
+  state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state);
+BEGIN
+  -- A non-orderable (oc-less) candidate never replaces the running extremum.
+  IF value_ore IS NULL THEN
+    RETURN state;
+  END IF;
+  -- Adopt the candidate when the running extremum is itself non-orderable
+  -- (e.g. an oc-less STRICT seed) or strictly lesser.
+  IF state_ore IS NULL OR value_ore > state_ore THEN
+    RETURN value;
+  END IF;
+  RETURN state;
+END;
+$$;
+
+--! @brief max aggregate over public.jsonb_entry.
+--! @param input public.jsonb_entry
+--! @return public.jsonb_entry The entry with the largest CLLW ORE term.
+CREATE AGGREGATE eql_v3.max(public.jsonb_entry) (
+  sfunc = eql_v3_internal.jsonb_entry_max_sfunc,
+  stype = public.jsonb_entry,
+  combinefunc = eql_v3_internal.jsonb_entry_max_sfunc,
+  parallel = safe
+);
+
+--! @file v3/jsonb/operators.sql
+--! @brief Operators on public.json and public.jsonb_entry.
+
+------------------------------------------------------------------------------
+-- -> field accessor (returns jsonb_entry)
+------------------------------------------------------------------------------
+
+--! @brief -> operator with text selector.
+--!
+--! Returns the sv entry whose `s` equals @p selector, with root `i`/`v` merged
+--! in. Inlinable: `WHERE col -> 'sel' = $1` reduces structurally to
+--! `eql_v3.eq_term(col -> 'sel') = eql_v3.eq_term($1)` and matches a functional
+--! index on `eql_v3.eq_term(col -> 'sel')`.
+--!
+--! @warning The selector operand MUST carry a known type — a text-typed
+--!   parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::text`).
+--!   A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> text`
+--!   operator and silently returns native jsonb semantics (a root-key lookup,
+--!   typically NULL), NOT this operator: PostgreSQL reduces the `public.json`
+--!   domain to its base type `jsonb` when resolving an unknown-typed RHS, and the
+--!   native base-type operator wins the exact-match tiebreak. This is intrinsic to
+--!   the domain type-kind and applies to the native-jsonb blockers too. See
+--!   the "Typed operands" caveat in docs/reference/json-support.md.
+--!
+--! @param e public.json Root encrypted payload.
+--! @param selector text Selector hash.
+--! @return public.jsonb_entry Matching entry merged with root meta, or NULL.
+CREATE FUNCTION eql_v3."->"(e public.json, selector text)
+  RETURNS public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT (
+    eql_v3.meta_data(e) ||
+    jsonb_path_query_first(
+      e,
+      '$.sv[*] ? (@.s == $sel)'::jsonpath,
+      jsonb_build_object('sel', selector)
+    )
+  )::public.jsonb_entry
+$$;
+
+CREATE OPERATOR ->(
+  FUNCTION=eql_v3."->",
+  LEFTARG=public.json,
+  RIGHTARG=text
+);
+
+--! @brief -> operator with integer array index (0-based, JSONB convention).
+--! @param e public.json Encrypted sv-array payload.
+--! @param selector integer Array index.
+--! @return public.jsonb_entry Matching entry merged with root meta, or NULL.
+CREATE FUNCTION eql_v3."->"(e public.json, selector integer)
+  RETURNS public.jsonb_entry
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT CASE
+    WHEN eql_v3_internal.is_ste_vec_array(e) THEN
+      -- NOTE: `e::jsonb` makes the native-jsonb traversal explicit. `'sv'` is an
+      -- unknown-typed literal, so `e -> 'sv'` already flattens `public.json` to
+      -- its base type and binds native `jsonb -> text` (see the @warning above) —
+      -- the custom `->(public.json, text)` operator does NOT capture a bare
+      -- untyped literal. The cast documents that intent and guards the `-> selector`
+      -- (integer) hop from ever resolving to the v3 `->(public.json, integer)`
+      -- operator instead of native array access.
+      (eql_v3.meta_data(e) || (e::jsonb -> 'sv' -> selector))::public.jsonb_entry
+    ELSE NULL
+  END
+$$;
+
+CREATE OPERATOR ->(
+  FUNCTION=eql_v3."->",
+  LEFTARG=public.json,
+  RIGHTARG=integer
+);
+
+------------------------------------------------------------------------------
+-- ->> field accessor (alias of -> coerced to text)
+------------------------------------------------------------------------------
+
+--! @brief ->> operator with text selector. Inlinable alias of -> coerced to
+--!        text.
+--!
+--! Intentional v2 parity: this serializes the entire matched jsonb_entry
+--! object as JSON text. It does not decrypt or return scalar plaintext like
+--! native `jsonb ->>`.
+--! @param e public.json Encrypted payload.
+--! @param selector text Field selector hash.
+--! @return text The matching entry as text.
+CREATE FUNCTION eql_v3."->>"(e public.json, selector text)
+  RETURNS text
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."->"(e, selector)::jsonb::text
+$$;
+
+CREATE OPERATOR ->> (
+  FUNCTION=eql_v3."->>",
+  LEFTARG=public.json,
+  RIGHTARG=text
+);
+
+--! @brief ->> operator with integer array index. Inlinable alias of
+--!        ->(json, integer) coerced to text.
+--! @param e public.json Encrypted sv-array payload.
+--! @param selector integer Array index.
+--! @return text The matching entry as text.
+CREATE FUNCTION eql_v3."->>"(e public.json, selector integer)
+  RETURNS text
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."->"(e, selector)::jsonb::text
+$$;
+
+CREATE OPERATOR ->> (
+  FUNCTION=eql_v3."->>",
+  LEFTARG=public.json,
+  RIGHTARG=integer
+);
+
+------------------------------------------------------------------------------
+-- @> containment
+------------------------------------------------------------------------------
+
+--! @brief @> contains operator (document, document).
+--! @param a public.json Container.
+--! @param b public.json Contained value.
+--! @return boolean True if a contains b.
+--! @see eql_v3.ste_vec_contains
+CREATE FUNCTION eql_v3."@>"(a public.json, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ste_vec_contains(a, b)
+$$;
+
+CREATE OPERATOR @>(
+  FUNCTION=eql_v3."@>",
+  LEFTARG=public.json,
+  RIGHTARG=public.json
+);
+
+--! @brief @> contains operator with an query_jsonb needle.
+--!
+--! Inlines to native `jsonb @>` over `eql_v3.to_ste_vec_query(a)::jsonb`, so a
+--! functional GIN index on the same expression engages.
+--!
+--! @param a public.json Container.
+--! @param b eql_v3.query_jsonb Query payload.
+--! @return boolean True if a contains b.
+CREATE FUNCTION eql_v3."@>"(a public.json, b eql_v3.query_jsonb)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.to_ste_vec_query(a)::jsonb @> b::jsonb
+$$;
+
+CREATE OPERATOR @>(
+  FUNCTION=eql_v3."@>",
+  LEFTARG=public.json,
+  RIGHTARG=eql_v3.query_jsonb
+);
+
+--! @brief @> contains operator with a single jsonb_entry needle.
+--!
+--! Wraps the entry into a single-element sv array (stripping `c`) and reduces
+--! to the same `to_ste_vec_query(a)::jsonb @> needle::jsonb` form.
+--!
+--! @param a public.json Container.
+--! @param b public.jsonb_entry Single entry.
+--! @return boolean True if a contains an sv entry matching b.
+CREATE FUNCTION eql_v3."@>"(a public.json, b public.jsonb_entry)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.to_ste_vec_query(a)::jsonb
+       @> jsonb_build_object(
+            'sv',
+            jsonb_build_array(
+              jsonb_strip_nulls(
+                jsonb_build_object(
+                  's',  b -> 's',
+                  'hm', b -> 'hm',
+                  'oc', b -> 'oc'
+                )
+              )
+            )
+          )
+$$;
+
+CREATE OPERATOR @>(
+  FUNCTION=eql_v3."@>",
+  LEFTARG=public.json,
+  RIGHTARG=public.jsonb_entry
+);
+
+------------------------------------------------------------------------------
+-- <@ contained-by (reverse of @>)
+------------------------------------------------------------------------------
+
+--! @brief <@ contained-by operator (document, document).
+--! @param a public.json Contained value.
+--! @param b public.json Container.
+--! @return boolean True if a is contained by b.
+CREATE FUNCTION eql_v3."<@"(a public.json, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ste_vec_contains(b, a)
+$$;
+
+CREATE OPERATOR <@(
+  FUNCTION=eql_v3."<@",
+  LEFTARG=public.json,
+  RIGHTARG=public.json
+);
+
+--! @brief <@ contained-by operator with an query_jsonb LHS.
+--! @param a eql_v3.query_jsonb Query payload.
+--! @param b public.json Container.
+--! @return boolean True if b contains a.
+CREATE FUNCTION eql_v3."<@"(a eql_v3.query_jsonb, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."@>"(b, a)
+$$;
+
+CREATE OPERATOR <@(
+  FUNCTION=eql_v3."<@",
+  LEFTARG=eql_v3.query_jsonb,
+  RIGHTARG=public.json
+);
+
+--! @brief <@ contained-by operator with a jsonb_entry LHS.
+--! @param a public.jsonb_entry Single entry.
+--! @param b public.json Container.
+--! @return boolean True if b contains a.
+CREATE FUNCTION eql_v3."<@"(a public.jsonb_entry, b public.json)
+RETURNS boolean
+LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3."@>"(b, a)
+$$;
+
+CREATE OPERATOR <@(
+  FUNCTION=eql_v3."<@",
+  LEFTARG=public.jsonb_entry,
+  RIGHTARG=public.json
+);
+
+------------------------------------------------------------------------------
+-- jsonb_entry comparisons
+------------------------------------------------------------------------------
+
+--! @brief Equality on jsonb_entry via eq_term (hm-or-oc byte equality).
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if the entries are equal
+CREATE FUNCTION eql_v3.eq(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.eq_term(a) = eql_v3.eq_term(b)
+$$;
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3.eq,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = =,
+  NEGATOR  = <>,
+  RESTRICT = eqsel,
+  JOIN     = eqjoinsel
+);
+
+--! @brief Inequality on jsonb_entry via eq_term.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if the entries are not equal
+CREATE FUNCTION eql_v3.neq(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b)
+$$;
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3.neq,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = <>,
+  NEGATOR  = =,
+  RESTRICT = neqsel,
+  JOIN     = neqjoinsel
+);
+
+--! @brief Less-than on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is less than b
+CREATE FUNCTION eql_v3.lt(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) < eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3.lt,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = >,
+  NEGATOR  = >=,
+  RESTRICT = scalarltsel,
+  JOIN     = scalarltjoinsel
+);
+
+--! @brief Less-than-or-equal on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is less than or equal to b
+CREATE FUNCTION eql_v3.lte(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) <= eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3.lte,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = >=,
+  NEGATOR  = >,
+  RESTRICT = scalarlesel,
+  JOIN     = scalarlejoinsel
+);
+
+--! @brief Greater-than on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is greater than b
+CREATE FUNCTION eql_v3.gt(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) > eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3.gt,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = <,
+  NEGATOR  = <=,
+  RESTRICT = scalargtsel,
+  JOIN     = scalargtjoinsel
+);
+
+--! @brief Greater-than-or-equal on jsonb_entry via ore_cllw.
+--! @param a public.jsonb_entry Left operand
+--! @param b public.jsonb_entry Right operand
+--! @return boolean True if a is greater than or equal to b
+CREATE FUNCTION eql_v3.gte(a public.jsonb_entry, b public.jsonb_entry)
+  RETURNS boolean
+  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE
+AS $$
+  SELECT eql_v3.ore_cllw(a) >= eql_v3.ore_cllw(b)
+$$;
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3.gte,
+  LEFTARG  = public.jsonb_entry,
+  RIGHTARG = public.jsonb_entry,
+  COMMUTATOR = <=,
+  NEGATOR  = <,
+  RESTRICT = scalargesel,
+  JOIN     = scalargejoinsel
+);
+
+--! @file v3/jsonb/blockers.sql
+--! @brief Native-jsonb firewall for public.json.
+--!
+--! public.json SUPPORTS @> <@ -> ->> (see operators.sql). Comparisons
+--! = <> < <= > >= are supported on public.jsonb_entry only, not on the root
+--! document domain.
+--! Every OTHER native jsonb operator reachable via domain fallback against the
+--! base type jsonb is BLOCKED here so an encrypted column can never silently
+--! route to plaintext-jsonb semantics. The blocked set is KNOWN_JSONB_OPERATORS
+--! minus the supported ops: ? ?| ?& @? @@ #> #>> - #- ||.
+--!
+--! Each blocker is LANGUAGE plpgsql (NEVER STRICT — a STRICT blocker would let
+--! PostgreSQL skip the body and return NULL on a NULL argument, bypassing the
+--! exception) and delegates to the shared eql_v3.encrypted_domain_unsupported_*
+--! helpers. Each blocker's RETURNS type matches the native operator it shadows
+--! (#> -> jsonb, #>> -> text, - / #- / || -> jsonb; the rest are boolean) so a
+--! composed expression resolves and the body raises 'operator not supported',
+--! rather than failing earlier with a misleading 'operator does not exist' on a
+--! boolean intermediate. The bound operator must resolve before native fallback,
+--! so the firewall fires.
+
+--! @brief Blocker: ? (key/element exists).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_exists(a public.json, b text)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '?');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR ? (
+  FUNCTION = eql_v3_internal.jsonb_blocked_exists,
+  LEFTARG = public.json,
+  RIGHTARG = text
+);
+
+--! @brief Blocker: ?| (any key exists).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_exists_any(a public.json, b text[])
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '?|');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR ?| (
+  FUNCTION = eql_v3_internal.jsonb_blocked_exists_any,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: ?& (all keys exist).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_exists_all(a public.json, b text[])
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '?&');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR ?& (
+  FUNCTION = eql_v3_internal.jsonb_blocked_exists_all,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: @? (jsonpath exists).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonpath Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_jsonpath_exists(a public.json, b jsonpath)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@?');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR @? (
+  FUNCTION = eql_v3_internal.jsonb_blocked_jsonpath_exists,
+  LEFTARG = public.json,
+  RIGHTARG = jsonpath
+);
+
+--! @brief Blocker: @@ (jsonpath predicate).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonpath Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_jsonpath_match(a public.json, b jsonpath)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@@');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR @@ (
+  FUNCTION = eql_v3_internal.jsonb_blocked_jsonpath_match,
+  LEFTARG = public.json,
+  RIGHTARG = jsonpath
+);
+
+--! @brief Blocker: #> (path extract, native returns jsonb).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_path_extract(a public.json, b text[])
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '#>');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR #> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_path_extract,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: #>> (path extract as text).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return text Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_path_extract_text(a public.json, b text[])
+RETURNS text
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_text('public.json', '#>>');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR #>> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_path_extract_text,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: - (delete key, text RHS; native returns jsonb).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_text(a public.json, b text)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_text,
+  LEFTARG = public.json,
+  RIGHTARG = text
+);
+
+--! @brief Blocker: - (delete index, integer RHS).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b integer Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_int(a public.json, b integer)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_int,
+  LEFTARG = public.json,
+  RIGHTARG = integer
+);
+
+--! @brief Blocker: - (delete keys, text[] RHS).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_array(a public.json, b text[])
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR - (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_array,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: #- (delete at path).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b text[] Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_delete_path(a public.json, b text[])
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '#-');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR #- (
+  FUNCTION = eql_v3_internal.jsonb_blocked_delete_path,
+  LEFTARG = public.json,
+  RIGHTARG = text[]
+);
+
+--! @brief Blocker: || (concatenate, encrypted on the left).
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_concat(a public.json, b jsonb)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '||');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal.jsonb_blocked_concat,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+--! @brief Blocker: || (concatenate, encrypted on the right).
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return jsonb Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_concat_rhs(a jsonb, b public.json)
+RETURNS jsonb
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_jsonb('public.json', '||');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR || (
+  FUNCTION = eql_v3_internal.jsonb_blocked_concat_rhs,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+------------------------------------------------------------------------------
+-- Root-document comparison blockers.
+------------------------------------------------------------------------------
+
+--! @brief Blocker: root public.json document comparisons.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_compare_json_json(a public.json, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', 'comparison');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: root public.json-to-jsonb comparisons.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_compare_json_jsonb(a public.json, b jsonb)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', 'comparison');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: root jsonb-to-public.json comparisons.
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_compare_jsonb_json(a jsonb, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', 'comparison');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR = (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR < (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR > (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_json,
+  LEFTARG = public.json,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR >= (
+  FUNCTION = eql_v3_internal.jsonb_blocked_compare_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+------------------------------------------------------------------------------
+-- Mixed jsonb containment blockers.
+------------------------------------------------------------------------------
+
+--! @brief Blocker: @> with encrypted root document and native jsonb.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contains_json_jsonb(a public.json, b jsonb)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@>');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: @> with native jsonb and encrypted root document.
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contains_jsonb_json(a jsonb, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '@>');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: <@ with encrypted root document and native jsonb.
+--! @param a public.json Left operand (encrypted payload).
+--! @param b jsonb Native RHS operand.
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contained_json_jsonb(a public.json, b jsonb)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '<@');
+END;
+$$ LANGUAGE plpgsql;
+
+--! @brief Blocker: <@ with native jsonb and encrypted root document.
+--! @param a jsonb Native LHS operand.
+--! @param b public.json Right operand (encrypted payload).
+--! @return boolean Never returns; always raises 'operator not supported'.
+CREATE FUNCTION eql_v3_internal.jsonb_blocked_contained_jsonb_json(a jsonb, b public.json)
+RETURNS boolean
+IMMUTABLE PARALLEL SAFE
+SET search_path = pg_catalog, extensions, public
+AS $$
+BEGIN
+  RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.json', '<@');
+END;
+$$ LANGUAGE plpgsql;
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contains_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR @> (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contains_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contained_json_jsonb,
+  LEFTARG = public.json,
+  RIGHTARG = jsonb
+);
+
+CREATE OPERATOR <@ (
+  FUNCTION = eql_v3_internal.jsonb_blocked_contained_jsonb_json,
+  LEFTARG = jsonb,
+  RIGHTARG = public.json
+);
+--! @file pin_search_path_v3.sql
+--! @brief Post-install: pin search_path on every eql_v3.* function.
+--!
+--! Appended verbatim by `tasks/build.sh` to the end of the v3-only release
+--! artifact, AFTER all src/v3/**/*.sql files have been concatenated. It lives
+--! outside src/ so it stays out of the dependency graph.
+--!
+--! Iterates over functions in the `eql_v3` and `eql_v3_internal` schemas and
+--! applies a fixed `search_path` via `ALTER FUNCTION ... SET search_path = ...`,
+--! satisfying Supabase splinter's `function_search_path_mutable` lint.
+--!
+--! @note A SET clause disables SQL-function inlining. The inline-critical SEM
+--!       helpers (ore_block_256_*, ore_cllw_*, ore_cllw/has_ore_cllw,
+--!       ope_cllw, hmac_256, bloom_filter over jsonb) and the
+--!       encrypted-domain family (recognised structurally, including public
+--!       user-column domains) are deliberately left unpinned.
+--! @see tasks/test/splinter.sh
+--! @see tasks/build.sh
+
+DO $$
+DECLARE
+  fn_oid oid;
+  inline_critical_oids oid[];
+  jsonb_oid oid;
+BEGIN
+  SELECT t.oid INTO jsonb_oid
+  FROM pg_catalog.pg_type t
+  JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
+  WHERE n.nspname = 'pg_catalog' AND t.typname = 'jsonb';
+
+  IF jsonb_oid IS NULL THEN
+    RAISE EXCEPTION 'pin_search_path_v3: type pg_catalog.jsonb not found';
+  END IF;
+
+  -- eql_v3 SEM index-term functions that must stay inlinable for
+  -- functional-index matching (no SET, IMMUTABLE). Mirrors the eql_v3 clause
+  -- in the legacy combined pin_search_path.sql.
+  SELECT pg_catalog.array_agg(p.oid) INTO inline_critical_oids
+  FROM pg_catalog.pg_proc p
+  JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
+  WHERE n.nspname = ANY(eql_v3_internal.owned_schemas())
+    AND (
+      (p.pronargs = 2
+        AND p.proname IN ('ore_block_256_eq', 'ore_block_256_neq',
+                          'ore_block_256_lt', 'ore_block_256_lte',
+                          'ore_block_256_gt', 'ore_block_256_gte'))
+      OR (p.pronargs = 2
+        AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq',
+                          'ore_cllw_lt', 'ore_cllw_lte',
+                          'ore_cllw_gt', 'ore_cllw_gte'))
+      OR (p.pronargs = 1
+        AND p.proname IN ('ore_cllw', 'has_ore_cllw')
+        AND p.proargtypes[0] = jsonb_oid)
+      -- The CLLW-OPE surface is the extractor alone: eql_v3_internal.ope_cllw is a
+      -- domain over bytea (native comparison operators and btree opclass),
+      -- so there are no ope-specific comparison functions to keep inlinable.
+      OR (p.pronargs = 1
+        AND p.proname = 'ope_cllw'
+        AND p.proargtypes[0] = jsonb_oid)
+      OR (p.pronargs = 1
+        AND p.proname = 'hmac_256'
+        AND p.proargtypes[0] = jsonb_oid)
+      OR (p.pronargs = 1
+        AND p.proname = 'bloom_filter'
+        AND p.proargtypes[0] = jsonb_oid)
+    );
+
+  FOR fn_oid IN
+    SELECT p.oid
+    FROM pg_catalog.pg_proc p
+    JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
+    WHERE n.nspname = ANY(eql_v3_internal.owned_schemas())
+      AND p.prokind IN ('f', 'w')
+      AND NOT EXISTS (
+        SELECT 1 FROM pg_catalog.unnest(coalesce(p.proconfig, '{}'::text[])) c
+        WHERE c LIKE 'search_path=%'
+      )
+      AND NOT (p.oid = ANY (coalesce(inline_critical_oids, '{}'::oid[])))
+      -- Encrypted-domain family — structural skip: LANGUAGE sql, IMMUTABLE,
+      -- taking >=1 argument typed as a jsonb-backed DOMAIN. User-column
+      -- domains live in public; implementation-only domains live in EQL-owned
+      -- schemas.
+      AND NOT (
+        p.prolang = (SELECT l.oid FROM pg_catalog.pg_language l
+                     WHERE l.lanname = 'sql')
+        AND p.provolatile = 'i'
+        AND EXISTS (
+          SELECT 1
+          FROM pg_catalog.unnest(p.proargtypes::oid[]) AS arg(typ)
+          JOIN pg_catalog.pg_type dt ON dt.oid = arg.typ
+          JOIN pg_catalog.pg_namespace dn ON dn.oid = dt.typnamespace
+          WHERE dt.typtype = 'd'
+            AND dt.typbasetype = jsonb_oid
+            AND (
+              dn.nspname = 'public'
+              OR dn.nspname = ANY(eql_v3_internal.owned_schemas())
+            )
+        )
+      )
+      -- Comment-marker fallback for hand-written inline-critical extension
+      -- functions that take no domain argument.
+      AND NOT EXISTS (
+        SELECT 1 FROM pg_catalog.pg_description d
+        WHERE d.objoid = p.oid
+          AND d.classoid = 'pg_catalog.pg_proc'::regclass
+          AND d.description LIKE 'eql-inline-critical%'
+      )
+  LOOP
+    EXECUTE pg_catalog.format(
+      'ALTER FUNCTION %s SET search_path = pg_catalog, extensions, public',
+      fn_oid::regprocedure
+    );
+  END LOOP;
+END $$;
diff --git a/packages/eql/sql/release-manifest.json b/packages/eql/sql/release-manifest.json
index f25e4219f..34cad1950 100644
--- a/packages/eql/sql/release-manifest.json
+++ b/packages/eql/sql/release-manifest.json
@@ -1,6 +1,6 @@
 {
-  "eqlVersion": "DEV",
+  "eqlVersion": "3.0.0-alpha.3",
   "schemaVersion": 3,
-  "installSqlSha256": "",
-  "uninstallSqlSha256": ""
+  "installSqlSha256": "ec7af1b334cd9ba2d6356bcb3eec41a4db5bfc6e39108de74484134aa90b7929",
+  "uninstallSqlSha256": "b1b5131b8175c5d04da9ada108d25c81c5772b15fad79a6c419ebb32d18c60a9"
 }
diff --git a/packages/eql/src/generated/release-manifest.ts b/packages/eql/src/generated/release-manifest.ts
index 26d825c59..123be25c5 100644
--- a/packages/eql/src/generated/release-manifest.ts
+++ b/packages/eql/src/generated/release-manifest.ts
@@ -1,6 +1,6 @@
 export const releaseManifest = {
-  eqlVersion: 'DEV',
+  eqlVersion: '3.0.0-alpha.3',
   schemaVersion: 3,
-  installSqlSha256: '',
-  uninstallSqlSha256: '',
+  installSqlSha256: 'ec7af1b334cd9ba2d6356bcb3eec41a4db5bfc6e39108de74484134aa90b7929',
+  uninstallSqlSha256: 'b1b5131b8175c5d04da9ada108d25c81c5772b15fad79a6c419ebb32d18c60a9',
 } as const

From 7239f918aa7a01e33f84c96ad6c97e0d5ab16365 Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 16:17:15 +1000
Subject: [PATCH 584/599] =?UTF-8?q?chore(release):=20eql=203.0.0-alpha.3?=
 =?UTF-8?q?=20=E2=80=94=20retry=20(fix=20crate-publish=20dispatch)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

First attempt (b5c586f5) failed on two jobs:
- prerelease-publish-rust: 'gh workflow run' resolves the workflow via a
  local git repo, and the job has no checkout — fixed with --repo.
- prerelease-publish-npm: ENEEDAUTH — npm Trusted Publishing is not yet
  configured for @cipherstash/eql + release.yml on npmjs.com (alpha.2 was
  published manually). Needs the npmjs-side publisher config; will fail
  again on this retry, which is fine: the eql-typescript tag is only
  created after a successful npm publish, so classify keeps allowing
  retries for this identity until npm lands.

The marker subject re-triggers the prerelease path for 3.0.0-alpha.3:
build-sql/docs update the existing eql-3.0.0-alpha.3 release in place
(action-gh-release updates by tag), and the fixed dispatch publishes the
crate from the eql-3.0.0-alpha.3 tag.
---
 .github/workflows/release.yml | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index badcbd503..d27632881 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -354,9 +354,13 @@ jobs:
         env:
           GH_TOKEN: ${{ github.token }}
           VERSION: ${{ needs.classify.outputs.version }}
+          REPO: ${{ github.repository }}
         run: |
           set -euo pipefail
-          gh workflow run release-plz.yml --ref "eql-${VERSION}"
+          # --repo is required: this job has no checkout, and without it gh
+          # tries to resolve the workflow through a local git repo and dies
+          # with "not a git repository".
+          gh workflow run release-plz.yml --repo "$REPO" --ref "eql-${VERSION}"
 
   summary:
     name: Summary

From cb20b743929516d25109c08bf04c65f62c9cad94 Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 16:37:47 +1000
Subject: [PATCH 585/599] =?UTF-8?q?chore(release):=20eql=203.0.0-alpha.3?=
 =?UTF-8?q?=20=E2=80=94=20retry=20(trusted=20publishing=20configured)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

npm and crates.io OIDC trusted publishers are now configured
(@cipherstash/eql -> release.yml; eql-bindings -> release-plz.yml) and
release-plz.yml is registered on the default branch (PR #383). This
marker retry completes the two package legs: the eql-typescript tag
doesn't exist yet so classify proceeds; SQL/docs update in place.

From 4301cff29838c65e25d59067c3c2334a8ef39ecf Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 16:44:40 +1000
Subject: [PATCH 586/599] =?UTF-8?q?chore(release):=20eql=203.0.0-alpha.3?=
 =?UTF-8?q?=20=E2=80=94=20retry=20(fix=20npm=20PATH=20shadowing=20+=20bran?=
 =?UTF-8?q?ch=20dispatch)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Second retry failed on both package legs for new reasons:

- npm ENEEDAUTH persisted despite trusted publishing being configured:
  mise-action runs after the 'upgrade npm' step and prepends mise's node
  (from [tools]) to PATH — its bundled npm 10.x has no OIDC trusted
  publishing, so the upgraded npm 11.5.1 never ran. The upgrade step now
  runs AFTER mise-action in both publish jobs.

- release-plz errored 'cannot determine current branch': dispatching
  against the eql- tag gives it a detached HEAD, which it refuses.
  prerelease-publish-rust now pins a release/eql- branch at the
  release commit and dispatches against that — same exact-commit
  guarantee, real branch for release-plz.

classify proceeds for 3.0.0-alpha.3 (the eql-typescript tag is still
uncreated); SQL/docs update in place.
---
 .github/workflows/release.yml | 44 ++++++++++++++++++++++++-----------
 docs/development/releasing.md | 13 ++++++-----
 2 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index d27632881..f10c11b1a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -123,9 +123,6 @@ jobs:
         with:
           node-version: 22
 
-      - name: Upgrade npm for OIDC trusted publishing
-        run: npm install -g npm@11.5.1
-
       - uses: jdx/mise-action@v3
         with:
           version: 2026.4.0
@@ -135,6 +132,13 @@ jobs:
           # the job that holds npm OIDC publishing power.
           cache: false
 
+      # AFTER mise-action, deliberately: mise's node (from [tools]) is first on
+      # PATH and its bundled npm 10.x has no OIDC trusted publishing — upgrading
+      # before mise-action upgrades an npm that never runs (the exact cause of
+      # the alpha.3 ENEEDAUTH failures).
+      - name: Upgrade npm for OIDC trusted publishing
+        run: npm install -g npm@11.5.1
+
       - name: Install dependencies
         run: pnpm install --frozen-lockfile
 
@@ -271,9 +275,6 @@ jobs:
         with:
           node-version: 22
 
-      - name: Upgrade npm for OIDC trusted publishing
-        run: npm install -g npm@11.5.1
-
       - uses: jdx/mise-action@v3
         with:
           version: 2026.4.0
@@ -283,6 +284,13 @@ jobs:
           # the job that holds npm OIDC publishing power.
           cache: false
 
+      # AFTER mise-action, deliberately: mise's node (from [tools]) is first on
+      # PATH and its bundled npm 10.x has no OIDC trusted publishing — upgrading
+      # before mise-action upgrades an npm that never runs (the exact cause of
+      # the alpha.3 ENEEDAUTH failures).
+      - name: Upgrade npm for OIDC trusted publishing
+        run: npm install -g npm@11.5.1
+
       - name: Install dependencies
         run: pnpm install --frozen-lockfile
 
@@ -344,23 +352,33 @@ jobs:
     timeout-minutes: 10
     permissions:
       actions: write
+      contents: write # create/update the release/eql- branch ref
     steps:
-      - name: Dispatch release-plz.yml against the prerelease tag
-        # Dispatch against the eql- tag, not the branch (same pattern
-        # as build-image): prerelease-build-sql (a `needs`) created that tag at
-        # the release commit, so the crate publishes from the EXACT commit the
-        # SQL + npm artifacts shipped from even if eql_v3 has advanced since
-        # the marker push — preserving the one-identity-one-commit invariant.
+      - name: Dispatch release-plz.yml at the release commit
+        # release-plz refuses detached HEADs ("cannot determine current
+        # branch"), so a tag dispatch does not work. To still publish from the
+        # EXACT commit the SQL + npm artifacts shipped from — even if eql_v3
+        # has advanced since the marker push — pin a release/eql-
+        # branch at this run's commit and dispatch against that. The branch is
+        # a stable pointer per identity: force-updated on retries of the same
+        # identity, never reused across identities.
         env:
           GH_TOKEN: ${{ github.token }}
           VERSION: ${{ needs.classify.outputs.version }}
           REPO: ${{ github.repository }}
+          SHA: ${{ github.sha }}
         run: |
           set -euo pipefail
+          branch="release/eql-${VERSION}"
+          if ! gh api -X POST "repos/${REPO}/git/refs" \
+              -f ref="refs/heads/${branch}" -f sha="$SHA" >/dev/null 2>&1; then
+            gh api -X PATCH "repos/${REPO}/git/refs/heads/${branch}" \
+              -f sha="$SHA" -F force=true >/dev/null
+          fi
           # --repo is required: this job has no checkout, and without it gh
           # tries to resolve the workflow through a local git repo and dies
           # with "not a git repository".
-          gh workflow run release-plz.yml --repo "$REPO" --ref "eql-${VERSION}"
+          gh workflow run release-plz.yml --repo "$REPO" --ref "$branch"
 
   summary:
     name: Summary
diff --git a/docs/development/releasing.md b/docs/development/releasing.md
index 1f9f02f90..4eb6eecd7 100644
--- a/docs/development/releasing.md
+++ b/docs/development/releasing.md
@@ -132,12 +132,13 @@ that is **already pinned** in the repo.
      via `scripts/npm-publish.mjs`) and creates the `eql-typescript-vV` tag.
      Both steps are idempotent (`npm view` / `git ls-remote` guards) so a rerun
      after a partial failure converges.
-   - `prerelease-publish-rust` → dispatches `release-plz.yml` against the
-     `eql-V` **tag** (created by `prerelease-build-sql` at the release commit),
-     so the crate publishes from the exact commit the SQL + npm artifacts
-     shipped from even if `eql_v3` has advanced since. release-plz refuses to
-     publish if the committed `crates/eql-bindings/sql/` bundle wasn't prepared
-     for the crate's version (the DEV-placeholder guard).
+   - `prerelease-publish-rust` → pins a `release/eql-V` **branch** at the
+     release commit and dispatches `release-plz.yml` against it, so the crate
+     publishes from the exact commit the SQL + npm artifacts shipped from even
+     if `eql_v3` has advanced since. (A branch, not the `eql-V` tag:
+     release-plz refuses detached HEADs.) release-plz also refuses to publish
+     if the committed `crates/eql-bindings/sql/` bundle wasn't prepared for
+     the crate's version (the DEV-placeholder guard).
 
 Prereleases keep the pending changesets **unconsumed** — Changesets pre-mode
 emits a `X.Y.Z-alpha.N` entry but the changesets are only finalized into the

From e079f6b4fb64ad0da6e0fa8941dc75d4e575755d Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 16:50:34 +1000
Subject: [PATCH 587/599] =?UTF-8?q?chore(release):=20eql=203.0.0-alpha.3?=
 =?UTF-8?q?=20=E2=80=94=20retry=20(API=20tag=20creation)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

npm publish and the crate publish both succeeded on the previous retry
(@cipherstash/eql@3.0.0-alpha.3 with provenance; eql-bindings@3.0.0-alpha.3
via crates.io trusted publishing). The only remaining failure was the
eql-typescript tag push: with persist-credentials: false the git
extraheader hack didn't authenticate ('could not read Username'). Create
the tag ref via 'gh api' instead.

This retry converges: npm publish skips (already published), the tag is
created, release-plz no-ops (version already on crates.io).
---
 .github/workflows/release.yml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f10c11b1a..2c26586a0 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -332,16 +332,16 @@ jobs:
           REPO: ${{ github.repository }}
         run: |
           set -euo pipefail
+          # Create the tag via the REST API with GH_TOKEN — the checkout has
+          # persist-credentials: false (deliberate hardening) and a git-level
+          # extraheader hack proved unreliable ("could not read Username").
           tag="eql-typescript-v${VERSION}"
-          repo_url="https://github.com/${REPO}.git"
-          auth=(-c "http.https://github.com/.extraheader=AUTHORIZATION: bearer ${GH_TOKEN}")
-          if git "${auth[@]}" ls-remote --exit-code --tags "$repo_url" "refs/tags/${tag}" >/dev/null 2>&1; then
+          if gh api "repos/${REPO}/git/ref/tags/${tag}" >/dev/null 2>&1; then
             echo "tag ${tag} already exists on the remote; skipping"
           else
-            git config user.name "github-actions[bot]"
-            git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
-            git tag "$tag"
-            git "${auth[@]}" push "$repo_url" "refs/tags/${tag}"
+            gh api -X POST "repos/${REPO}/git/refs" \
+              -f ref="refs/tags/${tag}" -f sha="$GITHUB_SHA" >/dev/null
+            echo "created ${tag} at ${GITHUB_SHA}"
           fi
 
   prerelease-publish-rust:

From a7588941362201119e2a29f01b1787464cee1e1e Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Wed, 8 Jul 2026 16:55:00 +1000
Subject: [PATCH 588/599] feat(release): npm prereleases publish under 'latest'
 until 3.0.0 GA

Until the 3.0.0 final ships, the alphas are the package's only release
line, so a bare 'npm install @cipherstash/eql' should resolve to the
newest alpha rather than whichever version last happened to hold latest
(alpha.2 had it from a manual publish while alpha.3 sat under the alpha
tag). PRE_GA_LATEST in npm-publish.mjs flips the policy back to channel
dist-tags after GA. Policy per James, 2026-07-08.
---
 .changeset/npm-latest-pre-ga.md      |  5 +++++
 docs/development/releasing.md        |  7 +++++--
 packages/eql/scripts/npm-publish.mjs | 10 +++++++++-
 3 files changed, 19 insertions(+), 3 deletions(-)
 create mode 100644 .changeset/npm-latest-pre-ga.md

diff --git a/.changeset/npm-latest-pre-ga.md b/.changeset/npm-latest-pre-ga.md
new file mode 100644
index 000000000..1fe195698
--- /dev/null
+++ b/.changeset/npm-latest-pre-ga.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': patch
+---
+
+**npm prereleases publish under the `latest` dist-tag until 3.0.0 ships.** Until the 3.0.0 final, the alphas are the package's only release line, so `npm install @cipherstash/eql` should resolve to the newest alpha instead of whichever version last happened to hold `latest`. Once 3.0.0 GA is published, prereleases return to their channel dist-tag (`alpha`/`beta`/`rc`) and `latest` stays on finals (`PRE_GA_LATEST` in `packages/eql/scripts/npm-publish.mjs`).
diff --git a/docs/development/releasing.md b/docs/development/releasing.md
index 4eb6eecd7..643344d3e 100644
--- a/docs/development/releasing.md
+++ b/docs/development/releasing.md
@@ -169,8 +169,11 @@ Three independent git tag families, all keyed to the same identity `V`:
 - **`eql-bindings-vV`** — the **`eql-bindings` Rust crate** on crates.io.
 - **`eql-typescript-vV`** — the **`@cipherstash/eql` npm package**.
 
-The npm dist-tag is `latest` for finals and the channel name (`alpha` / `beta` /
-`rc`) for prereleases. Each language package bundles the **exact** self-contained
+The npm dist-tag is `latest` for finals — and, **until 3.0.0 final ships**,
+also for prereleases (the alphas are the only release line, so `latest`
+tracks the newest alpha; see `PRE_GA_LATEST` in
+`packages/eql/scripts/npm-publish.mjs`). After GA, prereleases return to
+their channel dist-tag (`alpha` / `beta` / `rc`). Each language package bundles the **exact** self-contained
 SQL it was generated against (`eql_bindings::sql`; npm `./sql` subpath), so a
 consumer pins wire types and the matching DDL together.
 
diff --git a/packages/eql/scripts/npm-publish.mjs b/packages/eql/scripts/npm-publish.mjs
index 3c940c0ed..f199424c9 100644
--- a/packages/eql/scripts/npm-publish.mjs
+++ b/packages/eql/scripts/npm-publish.mjs
@@ -6,8 +6,16 @@ import { fileURLToPath } from 'node:url'
 
 const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')
 const pkg = JSON.parse(readFileSync(resolve(packageRoot, 'package.json'), 'utf8'))
+// Dist-tag policy (2026-07-08): until 3.0.0 final ships, `latest` tracks the
+// newest release INCLUDING prereleases — the 3.0.0 alphas are the only release
+// line, so a bare `npm install @cipherstash/eql` should resolve to the newest
+// alpha rather than a stale one. Once 3.0.0 GA is published, flip
+// PRE_GA_LATEST to false so prereleases go back to their channel dist-tag
+// (alpha/beta/rc) and `latest` stays on finals.
+const PRE_GA_LATEST = true
+
 const prerelease = pkg.version.match(/-(alpha|beta|rc)\./)
-const tag = prerelease ? prerelease[1] : 'latest'
+const tag = prerelease && !PRE_GA_LATEST ? prerelease[1] : 'latest'
 
 console.log(`publishing ${pkg.name}@${pkg.version} with npm dist-tag '${tag}'`)
 

From d71a2218405c2a2245369078137005372750adf6 Mon Sep 17 00:00:00 2001
From: Dan Draper 
Date: Wed, 8 Jul 2026 16:57:21 +1000
Subject: [PATCH 589/599] fix(docs): suppress Doxygen auto-linking of `text` in
 jsonb selector @warning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Doxygen auto-links the bare word `text` (it collides with a documented
symbol) into a cross-reference — even inside inline code. In the jsonb
selector operator's @warning, `` `col -> 'sel'::text` `` became
`col -> 'sel'text`: a link
nested inside inline code. Rendered to Markdown that surfaces as an
unbalanced ``, which fails the downstream MDX/docs build
(cipherstash/docs was broken by eql-3.0.0-alpha.3's API.md at line 2153,
`Expected a closing tag for `). It also drops the `::`, so the cast
read as `'sel'text`.

Prefix the two `text` occurrences with Doxygen's `%` no-autolink marker
(`::%text`, `-> %text`). Verified with doxygen: the nested  is gone
and `col -> 'sel'::text` now renders as clean, balanced inline code.
---
 src/v3/jsonb/operators.sql | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/v3/jsonb/operators.sql b/src/v3/jsonb/operators.sql
index fa7ec9319..be93e6cd5 100644
--- a/src/v3/jsonb/operators.sql
+++ b/src/v3/jsonb/operators.sql
@@ -18,8 +18,8 @@
 --! index on `eql_v3.eq_term(col -> 'sel')`.
 --!
 --! @warning The selector operand MUST carry a known type — a text-typed
---!   parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::text`).
---!   A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> text`
+--!   parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::%text`).
+--!   A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> %text`
 --!   operator and silently returns native jsonb semantics (a root-key lookup,
 --!   typically NULL), NOT this operator: PostgreSQL reduces the `public.json`
 --!   domain to its base type `jsonb` when resolving an unknown-typed RHS, and the

From 99dc4367d9099dc26a977175c50d10549f44d7b8 Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Thu, 9 Jul 2026 12:29:26 +1000
Subject: [PATCH 590/599] feat(install): disable ORE-backed domains loudly on
 non-superuser installs (CIP-3468)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

CREATE OPERATOR CLASS requires superuser, so on cloud-hosted Supabase and
most managed Postgres the installer has always attempted the ORE operator
class and skipped it on insufficient_privilege — but the ORE-carrying
domains still installed half-working:  comparisons ran as unindexable
seq scans while CREATE INDEX ... (eql_v3.ord_term(col)) and bare ORDER BY
failed with opaque Postgres errors.

The installer now capability-detects the skip (checking pg_opclass after
the attempt) and poisons all 38 ORE-carrying domains — _ord/_ord_ore on
every ordered scalar, text_search, and their eql_v3.query_* twins — with
an always-raising CHECK constraint: the first value cast or inserted
(including NULL) raises feature_not_supported (SQLSTATE 0A000) naming the
domain and the platform-supported alternatives (_ord_ope for indexed
CLLW-OPE ordering, _eq for equality, text_match for pattern match).
Superuser installs are unchanged: the operator class is created and
nothing is poisoned.

The fallback (src/v3/scalars/ore_fallback.sql) is generated from the
catalog by eql-codegen via a new ore_fallback.sql.j2 template, so new
ORE-carrying families are covered by construction. The poison function
honours the encrypted-domain footguns: LANGUAGE plpgsql (never inlined,
RAISE cannot be planned away) and not STRICT (NULLs cannot slip through).
Integration tests run the shipped installer under SET ROLE to a
NOSUPERUSER role and derive the poisoned/functional split from the same
catalog.
---
 .changeset/eql-3468.md                        |   5 +
 crates/eql-codegen/src/context.rs             |  25 ++
 crates/eql-codegen/src/generate.rs            | 237 ++++++++++++-
 .../eql-codegen/templates/ore_fallback.sql.j2 |  65 ++++
 docs/reference/database-indexes.md            |   8 +-
 docs/upgrading/v3.0.md                        |  49 +++
 src/v3/scalars/ore_fallback.sql               | 193 +++++++++++
 tests/sqlx/tests/v3_ore_fallback_tests.rs     | 312 ++++++++++++++++++
 8 files changed, 886 insertions(+), 8 deletions(-)
 create mode 100644 .changeset/eql-3468.md
 create mode 100644 crates/eql-codegen/templates/ore_fallback.sql.j2
 create mode 100644 src/v3/scalars/ore_fallback.sql
 create mode 100644 tests/sqlx/tests/v3_ore_fallback_tests.rs

diff --git a/.changeset/eql-3468.md b/.changeset/eql-3468.md
new file mode 100644
index 000000000..16f49ced4
--- /dev/null
+++ b/.changeset/eql-3468.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': minor
+---
+
+**Non-superuser installs (cloud-hosted Supabase, most managed Postgres) now disable the ORE-backed domains loudly instead of installing them half-working.** `CREATE OPERATOR CLASS` requires superuser, so the installer has always attempted the ORE operator class and skipped it on `insufficient_privilege` — but the ORE-carrying domains (`_ord` / `_ord_ore` on every ordered scalar, `text_search`, and their `eql_v3.query_*` twins) still installed, leaving a trap: `<` / `>` comparisons ran as unindexable seq scans while `CREATE INDEX ... (eql_v3.ord_term(col))` and bare `ORDER BY` failed with opaque Postgres errors. The installer now capability-detects the skip (by checking `pg_opclass` after the attempt) and poisons all 38 ORE-carrying domains with an always-raising `CHECK` constraint: the first value cast or inserted into one — including `NULL` — raises `feature_not_supported` (SQLSTATE `0A000`) naming the domain and pointing at the platform-supported alternatives (`_ord_ope` for indexed ordering via CLLW-OPE, `_eq` for equality, `text_match` for pattern match). Superuser installs are unchanged: the operator class is created and nothing is poisoned. The check is install-time, so installing as superuser keeps full ORE support regardless of which role queries later. ([CIP-3468](https://linear.app/cipherstash/issue/CIP-3468/do-not-install-ore-types-on-cloud-hosted-supabase))
diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs
index 816dd1130..94967cb69 100644
--- a/crates/eql-codegen/src/context.rs
+++ b/crates/eql-codegen/src/context.rs
@@ -54,6 +54,11 @@ pub fn environment() -> minijinja::Environment<'static> {
         include_str!("../templates/aggregates.sql.j2"),
     )
     .expect("aggregates.sql template");
+    env.add_template(
+        "ore_fallback.sql",
+        include_str!("../templates/ore_fallback.sql.j2"),
+    )
+    .expect("ore_fallback.sql template");
     env.add_global("schema", SCHEMA);
     env.add_global("internal_schema", INTERNAL_SCHEMA);
     env
@@ -345,6 +350,26 @@ pub struct AggregatesContext {
     pub aggregates: &'static [AggregateOp], // == AGGREGATE_OPS
 }
 
+/// Context for `ore_fallback.sql` — the cross-family capability-detection file
+/// (CIP-3468) that poisons every ORE-carrying domain when the ORE operator
+/// class could not be installed (non-superuser installer, e.g. cloud Supabase).
+#[derive(serde::Serialize)]
+pub struct OreFallbackContext {
+    pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:"
+    pub entries: Vec,
+    pub count: usize, // == entries.len(), hoisted for the closing NOTICE
+}
+
+/// One poisoned domain in `ore_fallback.sql`: the schema-qualified domain name
+/// and the human-readable alternatives its poison error steers callers to (the
+/// same family's non-ORE term-bearing siblings, e.g.
+/// `public.integer_eq (equality) or public.integer_ord_ope (ordering)`).
+#[derive(serde::Serialize)]
+pub struct OreFallbackEntry {
+    pub name: String,
+    pub alternatives: String,
+}
+
 /// The schema-qualified SQL domain type name, e.g. `public.integer_eq`.
 /// User-column encrypted domains intentionally live in `public` so dropping
 /// EQL-owned schemas cannot drop application columns.
diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs
index a943dccae..53a69f6ab 100644
--- a/crates/eql-codegen/src/generate.rs
+++ b/crates/eql-codegen/src/generate.rs
@@ -2,15 +2,18 @@
 
 use std::path::{Path, PathBuf};
 
-use eql_domains::{Domain, DomainFamily, Term};
+use eql_domains::{Domain, DomainFamily, Role, Term};
 
-use crate::context::{domain_name, is_ord_capable};
+use crate::context::{domain_name, is_ord_capable, query_domain_name};
 use crate::operator_surface::OPERATORS;
 
 /// REQUIRE edge for the v3 schema file — pulled in by every generated file.
 const V3_SCHEMA: &str = "src/v3/schema.sql";
 /// REQUIRE edge for the hand-written shared blocker helper.
 const V3_SCALARS_BLOCKER: &str = "src/v3/scalars/functions.sql";
+/// REQUIRE edge for the ORE opclass capability-detection DO block — the
+/// `ore_fallback.sql` file must sort after the attempt whose outcome it reads.
+const V3_ORE_OPCLASS: &str = "src/v3/sem/ore_block_256/operator_class.sql";
 /// Root of the generated per-type scalar surface. The single place the tree
 /// layout is spelled out — keeps `types_path`/`scalar_path` and the REQUIRE
 /// vecs from drifting if the surface ever relocates again.
@@ -343,6 +346,101 @@ pub fn render_aggregates_file(family_name: &str, domain: &Domain) -> Option &'static str {
+    match role {
+        Role::Eq => "equality",
+        Role::Ord => "ordering",
+        Role::Match => "match",
+        Role::Storage => "storage",
+    }
+}
+
+/// The alternatives hint for one poisoned domain: the same family's
+/// term-bearing non-ORE siblings (the domains that stay fully functional
+/// without the ORE operator class), each qualified by `qualify` and labelled
+/// with its capability word, joined with " or ".
+fn ore_alternatives(spec: &DomainFamily, qualify: &dyn Fn(&Domain) -> String) -> String {
+    let alts: Vec = spec
+        .domains
+        .iter()
+        .filter(|d| !d.terms.is_empty() && !d.terms.contains(&Term::Ore))
+        .map(|d| {
+            format!(
+                "{} ({})",
+                qualify(d),
+                role_word(Term::role_for_terms(d.terms))
+            )
+        })
+        .collect();
+    if alts.is_empty() {
+        // Unreachable with the current catalog (every ORE-carrying family also
+        // declares `_eq` and `_ord_ope`), but a future family must still render
+        // a sentence, not an empty hint.
+        "a non-ORE encrypted domain".to_string()
+    } else {
+        alts.join(" or ")
+    }
+}
+
+/// Body for the cross-family `src/v3/scalars/ore_fallback.sql` (CIP-3468).
+///
+/// The rendered DO block runs after the ORE opclass creation attempt
+/// (`V3_ORE_OPCLASS`). If the default btree opclass for
+/// `eql_v3_internal.ore_block_256` exists (superuser install) it is a no-op;
+/// if the attempt was skipped (`insufficient_privilege` — cloud Supabase and
+/// most managed Postgres), it poisons every ORE-carrying domain and its
+/// query-operand twin with an always-raising CHECK constraint so the domains
+/// fail loudly on first use instead of silently degrading to unindexable seq
+/// scans. The poison function is plpgsql and non-STRICT per the
+/// encrypted-domain footgun list.
+pub fn render_ore_fallback_file() -> String {
+    use crate::consts::sql_str;
+    use crate::context::{environment, OreFallbackContext, OreFallbackEntry};
+
+    let mut requires = vec![V3_SCHEMA.to_string(), V3_ORE_OPCLASS.to_string()];
+    let mut entries = Vec::new();
+    for spec in eql_domains::scalar_families() {
+        let ore_domains: Vec<&Domain> = spec
+            .domains
+            .iter()
+            .filter(|d| d.terms.contains(&Term::Ore))
+            .collect();
+        if ore_domains.is_empty() {
+            continue;
+        }
+        requires.push(types_path(spec.name));
+        requires.push(scalar_path(
+            spec.name,
+            &format!("query_{}_types.sql", spec.name),
+        ));
+        let column_alts = ore_alternatives(spec, &|d| domain_name(&d.full_name(spec.name)));
+        let query_alts = ore_alternatives(spec, &|d| query_domain_name(&d.query_name(spec.name)));
+        for d in ore_domains {
+            entries.push(OreFallbackEntry {
+                name: domain_name(&d.full_name(spec.name)),
+                alternatives: sql_str(&column_alts),
+            });
+            entries.push(OreFallbackEntry {
+                name: query_domain_name(&d.query_name(spec.name)),
+                alternatives: sql_str(&query_alts),
+            });
+        }
+    }
+    let count = entries.len();
+    let ctx = OreFallbackContext {
+        requires,
+        entries,
+        count,
+    };
+    environment()
+        .get_template("ore_fallback.sql")
+        .unwrap()
+        .render(&ctx)
+        .expect("render ore_fallback.sql")
+}
+
 use std::fs;
 
 use crate::writer::{
@@ -443,6 +541,24 @@ pub fn generate_all(out_root: &Path) -> Result {
         all_written.extend(written.iter().cloned());
     }
 
+    // Cross-family ORE capability-detection fallback (CIP-3468). Depth-1 under
+    // src/v3/scalars (it spans families, so it belongs to no type dir), written
+    // after every per-family surface so all its REQUIRE targets exist.
+    let fallback_path = scalars_root.join("ore_fallback.sql");
+    ensure_generated_paths_writable(std::slice::from_ref(&fallback_path), GeneratedKind::Sql)?;
+    write_generated_file(
+        &fallback_path,
+        &render_ore_fallback_file(),
+        GeneratedKind::Sql,
+    )?;
+    {
+        let rel = fallback_path
+            .strip_prefix(out_root)
+            .unwrap_or(&fallback_path);
+        println!("generated {}", rel.display());
+    }
+    all_written.push(fallback_path);
+
     // Orphan sweep across every scalar type dir. `generate_type` already prunes
     // stale files *within* a regenerated dir, but a type dropped from the catalog
     // entirely leaves a dir the generator never revisits — its generated SQL must
@@ -469,6 +585,13 @@ pub fn generate_all(out_root: &Path) -> Result {
                 println!("removed orphan {}", rel.display());
             }
         }
+        // Depth-1 sweep for cross-family generated files (ore_fallback.sql).
+        // Marker-aware, so the hand-written depth-1 functions.sql (no
+        // AUTO-GENERATED marker) is never touched.
+        for removed in remove_generated_orphans(&scalars_root, GeneratedKind::Sql, &keep)? {
+            let rel = removed.strip_prefix(out_root).unwrap_or(&removed);
+            println!("removed orphan {}", rel.display());
+        }
     }
 
     let names: Vec<&str> = eql_domains::scalar_families().map(|s| s.name).collect();
@@ -476,12 +599,13 @@ pub fn generate_all(out_root: &Path) -> Result {
     Ok(0)
 }
 
-/// Remove every generated SQL file under `out_root`'s `src/v3/scalars/*` type
-/// dirs, marker-aware. Replaces build.sh's filename-pattern `find -delete`: it
+/// Remove every generated SQL file under `out_root`'s `src/v3/scalars` tree —
+/// the per-type subdirs plus depth-1 cross-family files (ore_fallback.sql) —
+/// marker-aware. Replaces build.sh's filename-pattern `find -delete`: it
 /// deletes only files carrying the AUTO-GENERATED marker, so a hand-written
-/// `_extensions.sql` (no marker) and the committed depth-1
-/// `src/v3/scalars/functions.sql` (not in a type subdir) are preserved. Returns
-/// the removed paths.
+/// `_extensions.sql` and the hand-written depth-1
+/// `src/v3/scalars/functions.sql` (no marker) are preserved. Returns the
+/// removed paths.
 pub fn clean_all(out_root: &Path) -> Result, WriteError> {
     use crate::writer::clean_generated_files;
     let scalars_root = out_root.join(V3_SCALARS_DIR);
@@ -500,6 +624,9 @@ pub fn clean_all(out_root: &Path) -> Result, WriteError> {
     }
     subdirs.sort();
     let mut removed = Vec::new();
+    // Depth-1 cross-family generated files (ore_fallback.sql); marker-aware,
+    // so the hand-written depth-1 functions.sql survives.
+    removed.extend(clean_generated_files(&scalars_root, GeneratedKind::Sql)?);
     for dir in subdirs {
         removed.extend(clean_generated_files(&dir, GeneratedKind::Sql)?);
     }
@@ -1088,4 +1215,100 @@ mod tests {
                                                 // keys are sql_str-escaped key tokens; none should carry a bare unescaped quote.
         assert!(block.keys.iter().all(|k| !k.contains("o'")));
     }
+
+    #[test]
+    fn ore_fallback_poisons_exactly_the_ore_carrying_domains_and_their_query_twins() {
+        // Every domain carrying Term::Ore — and ONLY those — gets an
+        // always-raising CHECK, on both the public column domain and its
+        // eql_v3.query_* twin. Trailing space in the needle prevents
+        // `integer_ord` prefix-matching `integer_ord_ore`.
+        let sql = render_ore_fallback_file();
+        for spec in eql_domains::scalar_families() {
+            for d in spec.domains {
+                let col = format!("ALTER DOMAIN public.{} ", d.full_name(spec.name));
+                let query = format!("ALTER DOMAIN eql_v3.{} ", d.query_name(spec.name));
+                if d.terms.contains(&Term::Ore) {
+                    assert!(sql.contains(&col), "missing poison for {col}");
+                    assert!(sql.contains(&query), "missing poison for {query}");
+                } else {
+                    assert!(!sql.contains(&col), "unexpected poison for {col}");
+                    assert!(!sql.contains(&query), "unexpected poison for {query}");
+                }
+            }
+        }
+    }
+
+    #[test]
+    fn ore_fallback_poison_function_is_plpgsql_and_not_strict() {
+        // Footguns from the encrypted-domain list: the poison must be plpgsql
+        // (never inlined → the RAISE cannot be planned away) and must not be
+        // STRICT (a STRICT function is skipped on NULL input, silently letting
+        // NULLs through the poisoned domain). Scope the STRICT assertion to the
+        // CREATE FUNCTION statement — the file's doc header legitimately
+        // mentions the word.
+        let sql = render_ore_fallback_file();
+        let start = sql
+            .find("CREATE FUNCTION eql_v3_internal.ore_domain_unavailable")
+            .expect("poison function present");
+        let end = sql[start..].find("$poison$;").expect("function end") + start;
+        let create_fn = &sql[start..end];
+        assert!(create_fn.contains("LANGUAGE plpgsql"));
+        assert!(!create_fn.contains("STRICT"));
+        assert!(!create_fn.contains("RETURNS NULL ON NULL INPUT"));
+    }
+
+    #[test]
+    fn ore_fallback_requires_opclass_attempt_and_every_affected_family() {
+        // The REQUIRE edges force tsort to place the fallback after the opclass
+        // creation attempt (whose outcome it reads from pg_opclass) and after
+        // every poisoned domain exists. Families with no ORE domain (boolean)
+        // contribute no edge.
+        let sql = render_ore_fallback_file();
+        assert!(sql.contains("-- REQUIRE: src/v3/sem/ore_block_256/operator_class.sql"));
+        for spec in eql_domains::scalar_families() {
+            let types = format!(
+                "-- REQUIRE: {}\n",
+                scalar_path(spec.name, &format!("{}_types.sql", spec.name))
+            );
+            let query_types = format!(
+                "-- REQUIRE: {}\n",
+                scalar_path(spec.name, &format!("query_{}_types.sql", spec.name))
+            );
+            let has_ore = spec.domains.iter().any(|d| d.terms.contains(&Term::Ore));
+            assert_eq!(
+                sql.contains(&types),
+                has_ore,
+                "types edge for {}",
+                spec.name
+            );
+            assert_eq!(
+                sql.contains(&query_types),
+                has_ore,
+                "query types edge for {}",
+                spec.name
+            );
+        }
+    }
+
+    #[test]
+    fn generate_all_writes_ore_fallback_and_clean_all_removes_it() {
+        // The cross-family fallback is depth-1 under src/v3/scalars: generate_all
+        // writes it, clean_all's marker-aware depth-1 pass removes it, and the
+        // hand-written depth-1 functions.sql (no marker) survives both.
+        let d = crate::writer::test_support::tempdir();
+        let root = d.path();
+        let scalars = root.join(V3_SCALARS_DIR);
+        fs::create_dir_all(&scalars).unwrap();
+        let hand = scalars.join("functions.sql");
+        fs::write(&hand, "-- hand-written, no marker\n").unwrap();
+
+        generate_all(root).unwrap();
+        let fallback = scalars.join("ore_fallback.sql");
+        assert!(fallback.exists(), "generate_all writes ore_fallback.sql");
+
+        let removed = clean_all(root).unwrap();
+        assert!(!fallback.exists(), "clean_all removes ore_fallback.sql");
+        assert!(removed.contains(&fallback));
+        assert!(hand.exists(), "hand-written depth-1 functions.sql survives");
+    }
 }
diff --git a/crates/eql-codegen/templates/ore_fallback.sql.j2 b/crates/eql-codegen/templates/ore_fallback.sql.j2
new file mode 100644
index 000000000..6d12dd2d1
--- /dev/null
+++ b/crates/eql-codegen/templates/ore_fallback.sql.j2
@@ -0,0 +1,65 @@
+-- AUTOMATICALLY GENERATED FILE.
+{%- for r in requires %}
+-- REQUIRE: {{ r }}
+{%- endfor %}
+
+--! @file v3/scalars/ore_fallback.sql
+--! @brief Disable the ORE-backed encrypted domains when the ORE operator class is absent (CIP-3468).
+--!
+--! Runs after the DO block in src/v3/sem/ore_block_256/operator_class.sql,
+--! which ATTEMPTS to create the default btree operator class for
+--! eql_v3_internal.ore_block_256 and skips it on insufficient_privilege
+--! (CREATE OPERATOR CLASS requires superuser; managed platforms — cloud
+--! Supabase and most hosted Postgres — run the installer as a non-superuser
+--! role). When the class was created, this file is a no-op.
+--!
+--! When the class was skipped, the ORE-carrying domains would otherwise
+--! install half-working: `<`/`>` comparisons still run (as unindexable seq
+--! scans), while `CREATE INDEX ... ({{ schema }}.ord_term(col))` and bare
+--! `ORDER BY` fail with opaque Postgres errors. Instead of that silent
+--! degradation, this file poisons every ORE-carrying domain (and its
+--! query-operand twin) with an always-raising CHECK constraint, so the first
+--! value coerced into the domain fails loudly and points at the
+--! platform-supported alternatives (OPE ordering / HMAC equality /
+--! bloom-filter match).
+--!
+--! Footguns honoured (see the encrypted-domain footgun list in CLAUDE.md):
+--! the poison function is LANGUAGE plpgsql (never inlined, so the RAISE
+--! cannot be planned away) and NOT STRICT (a STRICT function is skipped for
+--! NULL inputs, which would silently let NULLs through the poisoned domain).
+
+DO $do$
+BEGIN
+  IF EXISTS (
+    SELECT 1
+    FROM pg_catalog.pg_opclass c
+    JOIN pg_catalog.pg_am am ON am.oid = c.opcmethod
+    WHERE am.amname = 'btree'
+      AND c.opcdefault
+      AND c.opcintype = '{{ internal_schema }}.ore_block_256'::pg_catalog.regtype
+  ) THEN
+    RETURN;
+  END IF;
+
+  --! @brief Poison CHECK backing for the ORE-carrying domains on platforms
+  --!        without the ORE operator class. Always raises; never returns.
+  --! @internal
+  CREATE FUNCTION {{ internal_schema }}.ore_domain_unavailable(val jsonb, domain_name text, alternatives text)
+  RETURNS boolean
+  IMMUTABLE PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+  LANGUAGE plpgsql
+  AS $poison$
+  BEGIN
+    RAISE EXCEPTION 'EQL: % cannot be used on this platform: the EQL installer could not create the ORE operator class (requires superuser, unavailable on e.g. cloud-hosted Supabase)', domain_name
+      USING HINT = 'Use ' || alternatives || ' instead.',
+            ERRCODE = 'feature_not_supported';
+  END;
+  $poison$;
+{% for e in entries %}
+  ALTER DOMAIN {{ e.name }} ADD CONSTRAINT eql_ore_unavailable
+    CHECK ({{ internal_schema }}.ore_domain_unavailable(VALUE, '{{ e.name }}', '{{ e.alternatives }}'));
+{% endfor %}
+  RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — % ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering), _eq (equality), or _match (match) domains instead', {{ count }};
+END;
+$do$;
diff --git a/docs/reference/database-indexes.md b/docs/reference/database-indexes.md
index abe0d4068..bef0599ce 100644
--- a/docs/reference/database-indexes.md
+++ b/docs/reference/database-indexes.md
@@ -38,7 +38,13 @@ CREATE INDEX users_name_match
 ANALYZE users;
 ```
 
-> **No operator class on a column or domain.** `eql_v3` deliberately does **not** ship an `encrypted_operator_class`. Operators resolve against the domain's `jsonb` base type, so an opclass on the column would bypass the encrypted surface. Always index through the extractor. (This also means no superuser is required — functional indexes work on Supabase and managed PostgreSQL.)
+> **No operator class on a column or domain.** `eql_v3` deliberately does **not** ship an `encrypted_operator_class`. Operators resolve against the domain's `jsonb` base type, so an opclass on the column would bypass the encrypted surface. Always index through the extractor. (This also means no superuser is required to *query* — functional indexes work on Supabase and managed PostgreSQL.)
+
+> **ORE requires a superuser *install*; OPE does not.** The `ord_term` btree recipe above depends on the default operator class the installer creates for the ORE term type — and `CREATE OPERATOR CLASS` requires superuser. On platforms whose installer role is not superuser (cloud-hosted Supabase, most managed Postgres), the installer detects this and **disables the ORE-carrying domains** (`_ord`, `_ord_ore`, `text_search`, and their `eql_v3.query_*` twins): using one raises `feature_not_supported` with a `HINT` naming the alternatives (see [U-003](../upgrading/v3.0.md#u-003-non-superuser-installs-disable-the-ore-backed-domains)). On those platforms type ordered columns as **`_ord_ope`** and index the OPE extractor instead — its return type carries a *native* btree opclass, so no superuser is needed:
+>
+> ```sql
+> CREATE INDEX events_at_ord ON events USING btree (eql_v3.ord_ope_term(encrypted_at));
+> ```
 
 ### When to Create Indexes
 
diff --git a/docs/upgrading/v3.0.md b/docs/upgrading/v3.0.md
index c592f09eb..4b8e1e930 100644
--- a/docs/upgrading/v3.0.md
+++ b/docs/upgrading/v3.0.md
@@ -9,6 +9,7 @@ release is prepared.
 
 1. **The `eql_v3` JSON envelope version is now `v: 3`** ([U-001](#u-001-eql_v3-payloads-carry-v-3)). Every `eql_v3` domain `CHECK` pins `VALUE->>'v' = '3'`, and the published payload bindings (Rust / TypeScript / JSON Schema) accept exactly `3`. Payloads carrying the legacy `v: 2` are rejected on insert or cast.
 2. **Query-operand domains are `eql_v3.query_`** ([U-002](#u-002-query-operand-domains-are-eql_v3query_name)). Renamed from the `_query` suffix to a `query_` prefix AND moved from `public` into the `eql_v3` schema: `public.integer_eq_query` → `eql_v3.query_integer_eq`, and the encrypted-JSONB containment needle `public.jsonb_query` → `eql_v3.query_jsonb`. Only affects 3.0.0 pre-release adopters — the old names never shipped in a final release.
+3. **Non-superuser installs disable the ORE-backed domains** ([U-003](#u-003-non-superuser-installs-disable-the-ore-backed-domains)). When the installer role cannot create the ORE operator class (cloud-hosted Supabase, most managed Postgres), the `_ord` / `_ord_ore` / `text_search` domains and their query twins now raise `feature_not_supported` on first use instead of silently degrading to seq scans. Use `_ord_ope` (indexed OPE ordering), `_eq`, and `text_match` on those platforms. Superuser installs are unchanged.
 
 ## Compatibility
 
@@ -18,6 +19,7 @@ release is prepared.
 | Query-operand domains (`public._query`, `public.jsonb_query` — 3.0.0 pre-releases only) | **Changed.** Now `eql_v3.query_` / `eql_v3.query_jsonb` — see U-002. |
 | `eql_v3` payload envelope version (`v`) | **Changed.** `2` → `3`. Re-encryption / re-emission with a v3-envelope client required — see U-001. |
 | `eql_v3` payload term keys (`hm` / `ob` / `bf`, new `op`) | **Unchanged** (additive `op`). |
+| ORE-carrying domains (`_ord` / `_ord_ore` / `text_search` + query twins) on non-superuser installs | **Changed.** Poisoned at install time — raise `feature_not_supported` on use instead of silently degrading — see U-003. Superuser installs unchanged. |
 | Legacy `eql_v2` wire documentation (`docs/reference/schema/eql-payload-v2.*.schema.json`) | **Unchanged.** Stays `v: 2`. |
 
 ## Upgrade notes
@@ -112,3 +114,50 @@ SELECT '{"sv":[{"s":"aa","hm":"bb"}]}'::jsonb::eql_v3.query_jsonb;
 SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::public.text_eq_query;
 SELECT '{"v":3,"i":{},"hm":"aa"}'::jsonb::public.query_text_eq;
 ```
+
+### U-003: Non-superuser installs disable the ORE-backed domains
+
+**What changed.** `CREATE OPERATOR CLASS` requires superuser, so on managed
+platforms whose installer role is not superuser (cloud-hosted Supabase, most
+hosted Postgres) the installer has always attempted the ORE operator class and
+skipped it with a `NOTICE` on `insufficient_privilege`. Previously the
+ORE-carrying domains still installed and *silently degraded*: `<` / `>`
+comparisons ran as unindexable seq scans, while
+`CREATE INDEX ... (eql_v3.ord_term(col))` failed with
+`data type eql_v3_internal.ore_block_256 has no default operator class` and
+bare `ORDER BY` could not find an ordering operator. From 3.0.0 the installer
+capability-detects the skip and **poisons every ORE-carrying domain** — `_ord`
+/ `_ord_ore` on each ordered scalar family, `text_search`, and their
+`eql_v3.query_*` twins (38 domains) — with an always-raising `CHECK`
+constraint. The first value cast or inserted into one (including `NULL`)
+raises `feature_not_supported` (SQLSTATE `0A000`) naming the domain, with a
+`HINT` listing the same family's platform-supported alternatives.
+
+**Why.** Failing loudly at first use beats a seq-scan performance trap and
+opaque index-time errors discovered in production. The supported alternatives
+are strictly better on these platforms: the `_ord_ope` domains order via
+CLLW-OPE, whose extractor (`eql_v3.ord_ope_term`) returns a type with a
+*native* btree operator class — indexed ordering with no superuser required.
+
+**Who is affected.** Installations run by a non-superuser role that use an
+ORE-carrying domain. Superuser installs (self-managed Postgres, Docker) are
+unchanged: the operator class is created and nothing is poisoned. The
+detection is install-time — an installer that ran as superuser keeps full ORE
+support regardless of which role queries later.
+
+**What to do.** On managed platforms, type ordered columns as `_ord_ope`
+instead of `_ord` / `_ord_ore`, index with
+`CREATE INDEX ... USING btree (eql_v3.ord_ope_term(col))`, and use `_eq` for
+equality and `text_match` for pattern match (a `text_search` column splits
+into `text_eq` + `text_match` + `text_ord_ope` columns as needed).
+
+**Verification.**
+
+```sql
+-- On a non-superuser install: must raise SQLSTATE 0A000 with the alternatives HINT.
+SELECT '{"v":"3","i":{"t":"t","c":"c"},"c":"ct","ob":["aa"]}'::jsonb::public.integer_ord;
+-- And the OPE alternative must work:
+SELECT '{"v":"3","i":{"t":"t","c":"c"},"c":"ct","op":"aa"}'::jsonb::public.integer_ord_ope;
+-- On a superuser install: no domain is poisoned.
+SELECT count(*) FROM pg_constraint WHERE conname = 'eql_ore_unavailable'; -- 0
+```
diff --git a/src/v3/scalars/ore_fallback.sql b/src/v3/scalars/ore_fallback.sql
new file mode 100644
index 000000000..9735c7911
--- /dev/null
+++ b/src/v3/scalars/ore_fallback.sql
@@ -0,0 +1,193 @@
+-- AUTOMATICALLY GENERATED FILE.
+-- REQUIRE: src/v3/schema.sql
+-- REQUIRE: src/v3/sem/ore_block_256/operator_class.sql
+-- REQUIRE: src/v3/scalars/integer/integer_types.sql
+-- REQUIRE: src/v3/scalars/integer/query_integer_types.sql
+-- REQUIRE: src/v3/scalars/smallint/smallint_types.sql
+-- REQUIRE: src/v3/scalars/smallint/query_smallint_types.sql
+-- REQUIRE: src/v3/scalars/bigint/bigint_types.sql
+-- REQUIRE: src/v3/scalars/bigint/query_bigint_types.sql
+-- REQUIRE: src/v3/scalars/date/date_types.sql
+-- REQUIRE: src/v3/scalars/date/query_date_types.sql
+-- REQUIRE: src/v3/scalars/timestamp/timestamp_types.sql
+-- REQUIRE: src/v3/scalars/timestamp/query_timestamp_types.sql
+-- REQUIRE: src/v3/scalars/numeric/numeric_types.sql
+-- REQUIRE: src/v3/scalars/numeric/query_numeric_types.sql
+-- REQUIRE: src/v3/scalars/text/text_types.sql
+-- REQUIRE: src/v3/scalars/text/query_text_types.sql
+-- REQUIRE: src/v3/scalars/real/real_types.sql
+-- REQUIRE: src/v3/scalars/real/query_real_types.sql
+-- REQUIRE: src/v3/scalars/double/double_types.sql
+-- REQUIRE: src/v3/scalars/double/query_double_types.sql
+
+--! @file v3/scalars/ore_fallback.sql
+--! @brief Disable the ORE-backed encrypted domains when the ORE operator class is absent (CIP-3468).
+--!
+--! Runs after the DO block in src/v3/sem/ore_block_256/operator_class.sql,
+--! which ATTEMPTS to create the default btree operator class for
+--! eql_v3_internal.ore_block_256 and skips it on insufficient_privilege
+--! (CREATE OPERATOR CLASS requires superuser; managed platforms — cloud
+--! Supabase and most hosted Postgres — run the installer as a non-superuser
+--! role). When the class was created, this file is a no-op.
+--!
+--! When the class was skipped, the ORE-carrying domains would otherwise
+--! install half-working: `<`/`>` comparisons still run (as unindexable seq
+--! scans), while `CREATE INDEX ... (eql_v3.ord_term(col))` and bare
+--! `ORDER BY` fail with opaque Postgres errors. Instead of that silent
+--! degradation, this file poisons every ORE-carrying domain (and its
+--! query-operand twin) with an always-raising CHECK constraint, so the first
+--! value coerced into the domain fails loudly and points at the
+--! platform-supported alternatives (OPE ordering / HMAC equality /
+--! bloom-filter match).
+--!
+--! Footguns honoured (see the encrypted-domain footgun list in CLAUDE.md):
+--! the poison function is LANGUAGE plpgsql (never inlined, so the RAISE
+--! cannot be planned away) and NOT STRICT (a STRICT function is skipped for
+--! NULL inputs, which would silently let NULLs through the poisoned domain).
+
+DO $do$
+BEGIN
+  IF EXISTS (
+    SELECT 1
+    FROM pg_catalog.pg_opclass c
+    JOIN pg_catalog.pg_am am ON am.oid = c.opcmethod
+    WHERE am.amname = 'btree'
+      AND c.opcdefault
+      AND c.opcintype = 'eql_v3_internal.ore_block_256'::pg_catalog.regtype
+  ) THEN
+    RETURN;
+  END IF;
+
+  --! @brief Poison CHECK backing for the ORE-carrying domains on platforms
+  --!        without the ORE operator class. Always raises; never returns.
+  --! @internal
+  CREATE FUNCTION eql_v3_internal.ore_domain_unavailable(val jsonb, domain_name text, alternatives text)
+  RETURNS boolean
+  IMMUTABLE PARALLEL SAFE
+  SET search_path = pg_catalog, extensions, public
+  LANGUAGE plpgsql
+  AS $poison$
+  BEGIN
+    RAISE EXCEPTION 'EQL: % cannot be used on this platform: the EQL installer could not create the ORE operator class (requires superuser, unavailable on e.g. cloud-hosted Supabase)', domain_name
+      USING HINT = 'Use ' || alternatives || ' instead.',
+            ERRCODE = 'feature_not_supported';
+  END;
+  $poison$;
+
+  ALTER DOMAIN public.integer_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord_ore', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_integer_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord_ore', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.integer_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_integer_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord_ore', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord_ore', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.smallint_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_smallint_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord_ore', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord_ore', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.bigint_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_bigint_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.date_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord_ore', 'public.date_eq (equality) or public.date_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_date_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord_ore', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.date_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord', 'public.date_eq (equality) or public.date_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_date_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord_ore', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord_ore', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.timestamp_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_timestamp_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord_ore', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord_ore', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.numeric_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_numeric_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.text_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord_ore', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_text_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord_ore', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.text_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_text_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.text_search ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_search', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_text_search ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_search', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.real_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord_ore', 'public.real_eq (equality) or public.real_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_real_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord_ore', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.real_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord', 'public.real_eq (equality) or public.real_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_real_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.double_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord_ore', 'public.double_eq (equality) or public.double_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_double_ord_ore ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord_ore', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)'));
+
+  ALTER DOMAIN public.double_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord', 'public.double_eq (equality) or public.double_ord_ope (ordering)'));
+
+  ALTER DOMAIN eql_v3.query_double_ord ADD CONSTRAINT eql_ore_unavailable
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)'));
+
+  RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — % ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering), _eq (equality), or _match (match) domains instead', 38;
+END;
+$do$;
diff --git a/tests/sqlx/tests/v3_ore_fallback_tests.rs b/tests/sqlx/tests/v3_ore_fallback_tests.rs
new file mode 100644
index 000000000..885280dc8
--- /dev/null
+++ b/tests/sqlx/tests/v3_ore_fallback_tests.rs
@@ -0,0 +1,312 @@
+//! Non-superuser install gate for the ORE capability-detection fallback
+//! (CIP-3468).
+//!
+//! `CREATE OPERATOR CLASS` requires superuser, and managed platforms (cloud
+//! Supabase and most hosted Postgres) run the installer as a non-superuser
+//! role. The installer ATTEMPTS the ORE opclass creation and, on
+//! `insufficient_privilege`, skips it — and then `src/v3/scalars/ore_fallback.sql`
+//! poisons every ORE-carrying domain (and its `eql_v3.query_*` twin) with an
+//! always-raising CHECK constraint, so the domains fail loudly on first use
+//! instead of silently installing half-working (seq-scan-only comparisons,
+//! opaque errors from `CREATE INDEX` / bare `ORDER BY`).
+//!
+//! These tests run the ACTUAL shipped installer — `release/cipherstash-encrypt.sql`,
+//! read from disk exactly as `v3_uninstall_tests` does — under `SET ROLE` to a
+//! NOSUPERUSER role, against a database with no prior EQL install
+//! (`migrations = false`; the standard migration installs as superuser, which
+//! would create the opclass and make the fallback a no-op — and would leave
+//! superuser-owned domains a non-superuser re-install could not `ALTER`).
+//!
+//! The poisoned/functional split is derived from the SAME catalog the
+//! generator renders from (`eql_domains::scalar_families()`), so a new
+//! ORE-carrying domain is covered here by construction, not by a hand-kept
+//! list.
+//!
+//! Roles are cluster-global (not per-database), so each test derives a unique
+//! role name from its isolated database name and drops it (with `DROP OWNED BY`
+//! first) on the way out — same pattern as `v3_privilege_tests`.
+
+use anyhow::Result;
+use eql_domains::Term;
+use sqlx::PgPool;
+
+/// The shipped installer, relative to the test crate root (`tests/sqlx`).
+const INSTALLER: &str = "../../release/cipherstash-encrypt.sql";
+
+/// SQLSTATE for `feature_not_supported`, which the poison CHECK raises with.
+const FEATURE_NOT_SUPPORTED: &str = "0A000";
+
+/// Derive a unique, valid role name from the per-test database name so parallel
+/// tests (and reruns) never collide on the cluster-global role namespace.
+async fn unique_role(conn: &mut sqlx::PgConnection) -> Result {
+    use std::hash::{Hash, Hasher};
+    let db: String = sqlx::query_scalar("SELECT current_database()")
+        .fetch_one(&mut *conn)
+        .await?;
+    let mut hasher = std::collections::hash_map::DefaultHasher::new();
+    db.hash(&mut hasher);
+    Ok(format!("eqlore_{:016x}", hasher.finish()))
+}
+
+/// A minimal payload accepted by a column domain's structural CHECK: the
+/// envelope (`v`/`i`/`c`) plus every term key, with nonempty-array keys (`ob`,
+/// `bf`) as arrays. Mirrors what the generated CHECK validates (key presence +
+/// array shape); the values are inert — no crypto runs at the CHECK layer.
+fn column_payload(terms: &[Term]) -> String {
+    let mut payload = String::from(r#"{"v":"3","i":{"t":"t","c":"c"},"c":"ct""#);
+    for t in Term::payload_terms(terms) {
+        let key = t.json_key();
+        if t.nonempty_array_key().is_some() {
+            payload.push_str(&format!(r#","{key}":["aa"]"#));
+        } else {
+            payload.push_str(&format!(r#","{key}":"aa""#));
+        }
+    }
+    payload.push('}');
+    payload
+}
+
+/// A minimal payload accepted by a query-twin domain's CHECK: envelope minus
+/// `c` (the twins require `NOT (VALUE ? 'c')`) plus every term key.
+fn query_payload(terms: &[Term]) -> String {
+    let mut payload = String::from(r#"{"v":"3","i":{"t":"t","c":"c"}"#);
+    for t in Term::payload_terms(terms) {
+        let key = t.json_key();
+        if t.nonempty_array_key().is_some() {
+            payload.push_str(&format!(r#","{key}":["aa"]"#));
+        } else {
+            payload.push_str(&format!(r#","{key}":"aa""#));
+        }
+    }
+    payload.push('}');
+    payload
+}
+
+/// True when the default btree operator class for
+/// `eql_v3_internal.ore_block_256` exists — the condition the fallback reads.
+async fn ore_opclass_exists(pool: &PgPool) -> Result {
+    let exists: bool = sqlx::query_scalar(
+        r#"
+        SELECT EXISTS (
+          SELECT 1
+          FROM pg_catalog.pg_opclass c
+          JOIN pg_catalog.pg_am am ON am.oid = c.opcmethod
+          WHERE am.amname = 'btree'
+            AND c.opcdefault
+            AND c.opcintype = 'eql_v3_internal.ore_block_256'::regtype
+        )
+        "#,
+    )
+    .fetch_one(pool)
+    .await?;
+    Ok(exists)
+}
+
+/// Cast `payload` into `domain`, returning the error if it raises.
+async fn try_cast(pool: &PgPool, domain: &str, payload: &str) -> Result<(), sqlx::Error> {
+    sqlx::query(&format!("SELECT $1::jsonb::{domain}"))
+        .bind(payload)
+        .execute(pool)
+        .await
+        .map(|_| ())
+}
+
+/// Assert `err` is the poison raise: `feature_not_supported`, naming the
+/// domain, with the alternatives HINT.
+fn assert_poison_error(err: sqlx::Error, domain: &str) {
+    let db_err = match err {
+        sqlx::Error::Database(e) => e,
+        other => panic!(
+            "expected the poison CHECK to raise a database error for {domain}, got {other:?}"
+        ),
+    };
+    assert_eq!(
+        db_err.code().as_deref(),
+        Some(FEATURE_NOT_SUPPORTED),
+        "poison raise for {domain} must use ERRCODE feature_not_supported: {db_err}"
+    );
+    assert!(
+        db_err.message().contains(domain)
+            && db_err.message().contains("cannot be used on this platform"),
+        "poison message for {domain} must name the domain and the platform limitation: {db_err}"
+    );
+}
+
+/// Install the shipped installer under `SET ROLE role` on a single connection,
+/// so every statement executes with non-superuser privileges.
+async fn install_as(conn: &mut sqlx::PgConnection, role: &str) -> Result<()> {
+    let install_sql = std::fs::read_to_string(INSTALLER).unwrap_or_else(|e| {
+        panic!(
+            "failed to read shipped installer {INSTALLER}: {e} — run `mise run build` \
+             (or, in CI, ensure the nextest-archive artifact shipped release/*.sql)"
+        )
+    });
+    sqlx::query(&format!("SET ROLE {role}"))
+        .execute(&mut *conn)
+        .await?;
+    sqlx::raw_sql(&install_sql).execute(&mut *conn).await?;
+    sqlx::query("RESET ROLE").execute(&mut *conn).await?;
+    Ok(())
+}
+
+/// Cluster-global role teardown: drop everything the role owns in this
+/// database, then the role itself.
+async fn drop_role(conn: &mut sqlx::PgConnection, role: &str) -> Result<()> {
+    sqlx::query(&format!("DROP OWNED BY {role} CASCADE"))
+        .execute(&mut *conn)
+        .await?;
+    sqlx::query(&format!("DROP ROLE {role}"))
+        .execute(&mut *conn)
+        .await?;
+    Ok(())
+}
+
+/// The full CIP-3468 contract, catalog-driven: a non-superuser install
+/// succeeds, skips the ORE opclass, and poisons exactly the ORE-carrying
+/// domains (columns AND query twins), while every non-ORE domain stays fully
+/// functional.
+///
+/// NB: keep this test's NAME short — the `#[sqlx::test]` harness derives the
+/// per-test database name from it, and a name past PostgreSQL's 63-byte
+/// identifier limit is created truncated but connected to untruncated
+/// ("database does not exist").
+#[sqlx::test(migrations = false)]
+async fn nosuper_install_poisons_ore_domains(pool: PgPool) -> Result<()> {
+    let mut conn = pool.acquire().await?;
+    let role = unique_role(&mut conn).await?;
+    let db: String = sqlx::query_scalar("SELECT current_database()")
+        .fetch_one(&mut *conn)
+        .await?;
+
+    // Self-heal from a prior failed run: the role is cluster-global and a
+    // teardown that never ran (test process killed, assertion panic before
+    // cleanup) leaves it behind, deterministically colliding on rerun.
+    sqlx::query(&format!(
+        "DO $$ BEGIN
+           IF EXISTS (SELECT FROM pg_roles WHERE rolname = '{role}') THEN
+             EXECUTE 'DROP OWNED BY {role} CASCADE';
+             EXECUTE 'DROP ROLE {role}';
+           END IF;
+         END $$"
+    ))
+    .execute(&mut *conn)
+    .await?;
+
+    // NOSUPERUSER is the default, spelled out because it is the point.
+    sqlx::query(&format!("CREATE ROLE {role} NOSUPERUSER"))
+        .execute(&mut *conn)
+        .await?;
+    // The installer creates schemas + the pgcrypto extension (trusted since
+    // PG13, so CREATE on the database suffices) and domains in public. The
+    // database name MUST be quoted: the sqlx harness generates mixed-case
+    // names, which an unquoted identifier would case-fold into oblivion.
+    sqlx::query(&format!("GRANT CREATE ON DATABASE \"{db}\" TO {role}"))
+        .execute(&mut *conn)
+        .await?;
+    sqlx::query(&format!("GRANT CREATE ON SCHEMA public TO {role}"))
+        .execute(&mut *conn)
+        .await?;
+
+    let result = async {
+        install_as(&mut conn, &role).await?;
+        drop(conn);
+
+        assert!(
+            !ore_opclass_exists(&pool).await?,
+            "a NOSUPERUSER install must not have created the ORE opclass"
+        );
+
+        for spec in eql_domains::scalar_families() {
+            for d in spec.domains {
+                if d.terms.is_empty() {
+                    continue; // storage-only: no term keys, no query twin, not poisoned
+                }
+                let column = format!("public.{}", d.full_name(spec.name));
+                let query = format!("eql_v3.{}", d.query_name(spec.name));
+                let col_payload = column_payload(d.terms);
+                let q_payload = query_payload(d.terms);
+                if d.terms.contains(&Term::Ore) {
+                    let err = try_cast(&pool, &column, &col_payload)
+                        .await
+                        .expect_err(&format!(
+                            "{column} must be poisoned on a NOSUPERUSER install"
+                        ));
+                    assert_poison_error(err, &column);
+                    let err = try_cast(&pool, &query, &q_payload)
+                        .await
+                        .expect_err(&format!(
+                            "{query} must be poisoned on a NOSUPERUSER install"
+                        ));
+                    assert_poison_error(err, &query);
+                } else {
+                    try_cast(&pool, &column, &col_payload)
+                        .await
+                        .unwrap_or_else(|e| {
+                            panic!("{column} must stay functional on a NOSUPERUSER install: {e}")
+                        });
+                    try_cast(&pool, &query, &q_payload)
+                        .await
+                        .unwrap_or_else(|e| {
+                            panic!("{query} must stay functional on a NOSUPERUSER install: {e}")
+                        });
+                }
+            }
+        }
+
+        // The poison must fire for NULL too (a STRICT poison function would be
+        // skipped on NULL input and let NULLs into the domain silently). One
+        // representative domain suffices — the CHECK wiring is identical.
+        sqlx::query("CREATE TABLE ore_fallback_null_probe (x public.integer_ord)")
+            .execute(&pool)
+            .await?;
+        let err = sqlx::query("INSERT INTO ore_fallback_null_probe VALUES (NULL)")
+            .execute(&pool)
+            .await
+            .expect_err("inserting NULL into a poisoned domain column must raise");
+        assert_poison_error(err, "public.integer_ord");
+
+        Ok::<(), anyhow::Error>(())
+    }
+    .await;
+
+    // Teardown the cluster-global role whether or not the assertions passed;
+    // never let a teardown error mask the real failure.
+    let mut conn = pool.acquire().await?;
+    sqlx::query("RESET ROLE").execute(&mut *conn).await.ok();
+    if let Err(e) = drop_role(&mut conn, &role).await {
+        if result.is_ok() {
+            return Err(e);
+        }
+        eprintln!("teardown: failed to drop role {role}: {e}");
+    }
+    result
+}
+
+/// The superuser path is unchanged: opclass created, nothing poisoned, ORE
+/// domains accept values. Runs on the standard migration install.
+#[sqlx::test]
+async fn superuser_install_creates_opclass_and_poisons_nothing(pool: PgPool) -> Result<()> {
+    assert!(
+        ore_opclass_exists(&pool).await?,
+        "a superuser install must create the ORE opclass"
+    );
+
+    let poison_constraints: i64 = sqlx::query_scalar(
+        "SELECT count(*) FROM pg_constraint WHERE conname = 'eql_ore_unavailable'",
+    )
+    .fetch_one(&pool)
+    .await?;
+    assert_eq!(
+        poison_constraints, 0,
+        "a superuser install must not poison any domain"
+    );
+
+    let ord = eql_domains::scalar_families()
+        .find(|s| s.name == "integer")
+        .and_then(|s| s.domains.iter().find(|d| d.name == "ord"))
+        .expect("integer_ord in catalog");
+    try_cast(&pool, "public.integer_ord", &column_payload(ord.terms))
+        .await
+        .expect("integer_ord accepts values on a superuser install");
+    Ok(())
+}

From e1e0d0eef0479d337e6227ce73c8bbe20259c43a Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Thu, 9 Jul 2026 13:25:51 +1000
Subject: [PATCH 591/599] fix(install): add the poison constraints NOT VALID +
 review polish (CIP-3468)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Addresses PR #388 review feedback (tobyhede + internal review).

NOT VALID (blocking finding): ALTER DOMAIN ... ADD CONSTRAINT validates
existing stored data, and the poison raises unconditionally — so re-running
the installer over a database already holding ORE values (written under an
earlier superuser install, before the installing role was demoted) aborted
inside the DO block, for exactly the users the fallback exists to help. For
domains, NOT VALID does not weaken enforcement (coercion applies every
constraint regardless of validation status, NULL included); it skips the
existing-data scan. Pinned by a codegen unit test and a new integration
test (reinstall_over_ore_data) that runs the shipped installer as a
superuser role, stores an ORE row, demotes the role, re-installs — old row
stays readable, new writes raise 0A000 — and re-installs once more to pin
non-superuser re-install idempotency.

Also from review:
- closing RAISE NOTICE no longer advertises "_match domains" generically
  (only text has one); count field dropped for entries|length
- domain name now sql_str-escaped in the poison CHECK literal, matching
  the alternatives string
- U-003: NOT VALID semantics, the text_search split collateral on
  superuser->managed migrations (equality/match lost too, re-encryption
  required), and a scope caveat that the SteVec ore_cllw path keeps silent
  degradation (follow-up CIP-3471)
- payload examples use the wire-contract integer "v":3 (the bindings
  reject a JSON string; only the domain CHECK's ->> coercion accepted it)
---
 .changeset/eql-3468.md                        |   2 +-
 crates/eql-codegen/src/context.rs             |   8 +-
 crates/eql-codegen/src/generate.rs            |  35 +++--
 .../eql-codegen/templates/ore_fallback.sql.j2 |  17 ++-
 docs/upgrading/v3.0.md                        |  23 ++-
 src/v3/scalars/ore_fallback.sql               |  91 +++++++-----
 tests/sqlx/tests/v3_ore_fallback_tests.rs     | 138 +++++++++++++++++-
 7 files changed, 254 insertions(+), 60 deletions(-)

diff --git a/.changeset/eql-3468.md b/.changeset/eql-3468.md
index 16f49ced4..017fc1e47 100644
--- a/.changeset/eql-3468.md
+++ b/.changeset/eql-3468.md
@@ -2,4 +2,4 @@
 '@cipherstash/eql': minor
 ---
 
-**Non-superuser installs (cloud-hosted Supabase, most managed Postgres) now disable the ORE-backed domains loudly instead of installing them half-working.** `CREATE OPERATOR CLASS` requires superuser, so the installer has always attempted the ORE operator class and skipped it on `insufficient_privilege` — but the ORE-carrying domains (`_ord` / `_ord_ore` on every ordered scalar, `text_search`, and their `eql_v3.query_*` twins) still installed, leaving a trap: `<` / `>` comparisons ran as unindexable seq scans while `CREATE INDEX ... (eql_v3.ord_term(col))` and bare `ORDER BY` failed with opaque Postgres errors. The installer now capability-detects the skip (by checking `pg_opclass` after the attempt) and poisons all 38 ORE-carrying domains with an always-raising `CHECK` constraint: the first value cast or inserted into one — including `NULL` — raises `feature_not_supported` (SQLSTATE `0A000`) naming the domain and pointing at the platform-supported alternatives (`_ord_ope` for indexed ordering via CLLW-OPE, `_eq` for equality, `text_match` for pattern match). Superuser installs are unchanged: the operator class is created and nothing is poisoned. The check is install-time, so installing as superuser keeps full ORE support regardless of which role queries later. ([CIP-3468](https://linear.app/cipherstash/issue/CIP-3468/do-not-install-ore-types-on-cloud-hosted-supabase))
+**Non-superuser installs (cloud-hosted Supabase, most managed Postgres) now disable the ORE-backed domains loudly instead of installing them half-working.** `CREATE OPERATOR CLASS` requires superuser, so the installer has always attempted the ORE operator class and skipped it on `insufficient_privilege` — but the ORE-carrying domains (`_ord` / `_ord_ore` on every ordered scalar, `text_search`, and their `eql_v3.query_*` twins) still installed, leaving a trap: `<` / `>` comparisons ran as unindexable seq scans while `CREATE INDEX ... (eql_v3.ord_term(col))` and bare `ORDER BY` failed with opaque Postgres errors. The installer now capability-detects the skip (by checking `pg_opclass` after the attempt) and poisons all 38 ORE-carrying domains with an always-raising `CHECK` constraint: the first value cast or inserted into one — including `NULL` — raises `feature_not_supported` (SQLSTATE `0A000`) naming the domain and pointing at the platform-supported alternatives (`_ord_ope` for indexed ordering via CLLW-OPE, `_eq` for equality, `text_match` for pattern match). The constraint is added `NOT VALID`, so ORE data written under an earlier superuser install stays readable and re-running the installer over it succeeds — only new casts and inserts raise. Superuser installs are unchanged: the operator class is created and nothing is poisoned. The check is install-time, so installing as superuser keeps full ORE support regardless of which role queries later. ([CIP-3468](https://linear.app/cipherstash/issue/CIP-3468/do-not-install-ore-types-on-cloud-hosted-supabase))
diff --git a/crates/eql-codegen/src/context.rs b/crates/eql-codegen/src/context.rs
index 94967cb69..874e73fe1 100644
--- a/crates/eql-codegen/src/context.rs
+++ b/crates/eql-codegen/src/context.rs
@@ -357,16 +357,18 @@ pub struct AggregatesContext {
 pub struct OreFallbackContext {
     pub requires: Vec, // dependency paths only; template emits "-- REQUIRE:"
     pub entries: Vec,
-    pub count: usize, // == entries.len(), hoisted for the closing NOTICE
 }
 
 /// One poisoned domain in `ore_fallback.sql`: the schema-qualified domain name
-/// and the human-readable alternatives its poison error steers callers to (the
-/// same family's non-ORE term-bearing siblings, e.g.
+/// (`name` for the identifier position, `name_literal` sql_str-escaped for the
+/// string-literal position in the poison CHECK) and the human-readable
+/// alternatives its poison error steers callers to (the same family's non-ORE
+/// term-bearing siblings, e.g.
 /// `public.integer_eq (equality) or public.integer_ord_ope (ordering)`).
 #[derive(serde::Serialize)]
 pub struct OreFallbackEntry {
     pub name: String,
+    pub name_literal: String,
     pub alternatives: String,
 }
 
diff --git a/crates/eql-codegen/src/generate.rs b/crates/eql-codegen/src/generate.rs
index 53a69f6ab..837c224da 100644
--- a/crates/eql-codegen/src/generate.rs
+++ b/crates/eql-codegen/src/generate.rs
@@ -394,7 +394,10 @@ fn ore_alternatives(spec: &DomainFamily, qualify: &dyn Fn(&Domain) -> String) ->
 /// query-operand twin with an always-raising CHECK constraint so the domains
 /// fail loudly on first use instead of silently degrading to unindexable seq
 /// scans. The poison function is plpgsql and non-STRICT per the
-/// encrypted-domain footgun list.
+/// encrypted-domain footgun list, and the constraints are added NOT VALID so
+/// a re-install over existing ORE data (written under an earlier superuser
+/// install) does not abort — domain coercion enforces the CHECK on new values
+/// regardless of validation status.
 pub fn render_ore_fallback_file() -> String {
     use crate::consts::sql_str;
     use crate::context::{environment, OreFallbackContext, OreFallbackEntry};
@@ -418,22 +421,21 @@ pub fn render_ore_fallback_file() -> String {
         let column_alts = ore_alternatives(spec, &|d| domain_name(&d.full_name(spec.name)));
         let query_alts = ore_alternatives(spec, &|d| query_domain_name(&d.query_name(spec.name)));
         for d in ore_domains {
+            let col_name = domain_name(&d.full_name(spec.name));
             entries.push(OreFallbackEntry {
-                name: domain_name(&d.full_name(spec.name)),
+                name_literal: sql_str(&col_name),
+                name: col_name,
                 alternatives: sql_str(&column_alts),
             });
+            let query_name = query_domain_name(&d.query_name(spec.name));
             entries.push(OreFallbackEntry {
-                name: query_domain_name(&d.query_name(spec.name)),
+                name_literal: sql_str(&query_name),
+                name: query_name,
                 alternatives: sql_str(&query_alts),
             });
         }
     }
-    let count = entries.len();
-    let ctx = OreFallbackContext {
-        requires,
-        entries,
-        count,
-    };
+    let ctx = OreFallbackContext { requires, entries };
     environment()
         .get_template("ore_fallback.sql")
         .unwrap()
@@ -1257,6 +1259,21 @@ mod tests {
         assert!(!create_fn.contains("RETURNS NULL ON NULL INPUT"));
     }
 
+    #[test]
+    fn ore_fallback_poison_constraints_are_not_valid() {
+        // ALTER DOMAIN ... ADD CONSTRAINT validates existing stored data, and
+        // the poison raises unconditionally — without NOT VALID, re-running
+        // the installer over a database holding ORE values (written under an
+        // earlier superuser install) would abort inside the DO block. NOT
+        // VALID skips that scan; domain coercion still enforces the CHECK on
+        // every new cast/insert regardless of validation status.
+        let sql = render_ore_fallback_file();
+        let adds = sql.matches("ADD CONSTRAINT eql_ore_unavailable").count();
+        let not_valid = sql.matches(")) NOT VALID;").count();
+        assert!(adds > 0, "poison constraints present");
+        assert_eq!(adds, not_valid, "every poison constraint must be NOT VALID");
+    }
+
     #[test]
     fn ore_fallback_requires_opclass_attempt_and_every_affected_family() {
         // The REQUIRE edges force tsort to place the fallback after the opclass
diff --git a/crates/eql-codegen/templates/ore_fallback.sql.j2 b/crates/eql-codegen/templates/ore_fallback.sql.j2
index 6d12dd2d1..331de59cd 100644
--- a/crates/eql-codegen/templates/ore_fallback.sql.j2
+++ b/crates/eql-codegen/templates/ore_fallback.sql.j2
@@ -27,6 +27,15 @@
 --! the poison function is LANGUAGE plpgsql (never inlined, so the RAISE
 --! cannot be planned away) and NOT STRICT (a STRICT function is skipped for
 --! NULL inputs, which would silently let NULLs through the poisoned domain).
+--!
+--! The poison constraints are added NOT VALID. For domains — unlike table
+--! constraints — this does not weaken enforcement: coercion applies every
+--! constraint regardless of validation status, so new casts and inserts
+--! (including NULL) still raise. What it skips is validating existing stored
+--! data: without it, re-running the installer over a database that already
+--! holds ORE values (written under an earlier superuser install, before the
+--! installing role was demoted) would run the always-raising poison against
+--! every stored row and abort the install.
 
 DO $do$
 BEGIN
@@ -56,10 +65,14 @@ BEGIN
             ERRCODE = 'feature_not_supported';
   END;
   $poison$;
+  -- NOT VALID: skip validating existing stored data (rows written under an
+  -- earlier superuser install must stay readable, and re-installing over them
+  -- must not abort). Domain coercion still enforces the CHECK on every new
+  -- cast/insert regardless of validation status.
 {% for e in entries %}
   ALTER DOMAIN {{ e.name }} ADD CONSTRAINT eql_ore_unavailable
-    CHECK ({{ internal_schema }}.ore_domain_unavailable(VALUE, '{{ e.name }}', '{{ e.alternatives }}'));
+    CHECK ({{ internal_schema }}.ore_domain_unavailable(VALUE, '{{ e.name_literal }}', '{{ e.alternatives }}')) NOT VALID;
 {% endfor %}
-  RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — % ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering), _eq (equality), or _match (match) domains instead', {{ count }};
+  RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — {{ entries|length }} ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering) and _eq (equality) domains — and text_match for text pattern match — instead';
 END;
 $do$;
diff --git a/docs/upgrading/v3.0.md b/docs/upgrading/v3.0.md
index 4b8e1e930..ed41b6be2 100644
--- a/docs/upgrading/v3.0.md
+++ b/docs/upgrading/v3.0.md
@@ -131,7 +131,11 @@ capability-detects the skip and **poisons every ORE-carrying domain** — `_ord`
 `eql_v3.query_*` twins (38 domains) — with an always-raising `CHECK`
 constraint. The first value cast or inserted into one (including `NULL`)
 raises `feature_not_supported` (SQLSTATE `0A000`) naming the domain, with a
-`HINT` listing the same family's platform-supported alternatives.
+`HINT` listing the same family's platform-supported alternatives. The
+constraint is added `NOT VALID`, so rows stored before the capability was
+lost — data written under an earlier superuser install, before the installing
+role was demoted — stay readable, and re-running the installer over them
+succeeds; only new casts and inserts raise.
 
 **Why.** Failing loudly at first use beats a seq-scan performance trap and
 opaque index-time errors discovered in production. The supported alternatives
@@ -149,15 +153,26 @@ support regardless of which role queries later.
 instead of `_ord` / `_ord_ore`, index with
 `CREATE INDEX ... USING btree (eql_v3.ord_ope_term(col))`, and use `_eq` for
 equality and `text_match` for pattern match (a `text_search` column splits
-into `text_eq` + `text_match` + `text_ord_ope` columns as needed).
+into `text_eq` + `text_match` + `text_ord_ope` columns as needed). Note that
+`text_search` carries the HMAC and bloom-filter terms alongside ORE, so
+poisoning it also removes equality and match — capabilities that need no ORE
+operator class. On a fresh managed install the split costs nothing; migrating
+an *existing* superuser install to a managed platform means re-encrypting the
+`text_search` column into the split columns.
+
+**Scope caveat.** The encrypted-JSONB (SteVec) ordered-comparison path is
+outside this gate: its `ore_cllw` operator class is skipped on non-superuser
+installs the same way, and ordered `jsonb_entry` comparisons keep the old
+silent degradation there. Tracked as a follow-up
+([CIP-3471](https://linear.app/cipherstash/issue/CIP-3471/jsonbstevec-ordering-ore-cllw-silently-degrades-on-non-superuser)).
 
 **Verification.**
 
 ```sql
 -- On a non-superuser install: must raise SQLSTATE 0A000 with the alternatives HINT.
-SELECT '{"v":"3","i":{"t":"t","c":"c"},"c":"ct","ob":["aa"]}'::jsonb::public.integer_ord;
+SELECT '{"v":3,"i":{"t":"t","c":"c"},"c":"ct","ob":["aa"]}'::jsonb::public.integer_ord;
 -- And the OPE alternative must work:
-SELECT '{"v":"3","i":{"t":"t","c":"c"},"c":"ct","op":"aa"}'::jsonb::public.integer_ord_ope;
+SELECT '{"v":3,"i":{"t":"t","c":"c"},"c":"ct","op":"aa"}'::jsonb::public.integer_ord_ope;
 -- On a superuser install: no domain is poisoned.
 SELECT count(*) FROM pg_constraint WHERE conname = 'eql_ore_unavailable'; -- 0
 ```
diff --git a/src/v3/scalars/ore_fallback.sql b/src/v3/scalars/ore_fallback.sql
index 9735c7911..6453a5d80 100644
--- a/src/v3/scalars/ore_fallback.sql
+++ b/src/v3/scalars/ore_fallback.sql
@@ -44,6 +44,15 @@
 --! the poison function is LANGUAGE plpgsql (never inlined, so the RAISE
 --! cannot be planned away) and NOT STRICT (a STRICT function is skipped for
 --! NULL inputs, which would silently let NULLs through the poisoned domain).
+--!
+--! The poison constraints are added NOT VALID. For domains — unlike table
+--! constraints — this does not weaken enforcement: coercion applies every
+--! constraint regardless of validation status, so new casts and inserts
+--! (including NULL) still raise. What it skips is validating existing stored
+--! data: without it, re-running the installer over a database that already
+--! holds ORE values (written under an earlier superuser install, before the
+--! installing role was demoted) would run the always-raising poison against
+--! every stored row and abort the install.
 
 DO $do$
 BEGIN
@@ -73,121 +82,125 @@ BEGIN
             ERRCODE = 'feature_not_supported';
   END;
   $poison$;
+  -- NOT VALID: skip validating existing stored data (rows written under an
+  -- earlier superuser install must stay readable, and re-installing over them
+  -- must not abort). Domain coercion still enforces the CHECK on every new
+  -- cast/insert regardless of validation status.
 
   ALTER DOMAIN public.integer_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord_ore', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord_ore', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_integer_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord_ore', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord_ore', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.integer_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_integer_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord_ore', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord_ore', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord_ore', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord_ore', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.smallint_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_smallint_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord_ore', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord_ore', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord_ore', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord_ore', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.bigint_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_bigint_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.date_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord_ore', 'public.date_eq (equality) or public.date_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord_ore', 'public.date_eq (equality) or public.date_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_date_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord_ore', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord_ore', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.date_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord', 'public.date_eq (equality) or public.date_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord', 'public.date_eq (equality) or public.date_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_date_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord_ore', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord_ore', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord_ore', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord_ore', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.timestamp_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_timestamp_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord_ore', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord_ore', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord_ore', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord_ore', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.numeric_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_numeric_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.text_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord_ore', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord_ore', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_text_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord_ore', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord_ore', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.text_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_text_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.text_search ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_search', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_search', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_text_search ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_search', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_search', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.real_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord_ore', 'public.real_eq (equality) or public.real_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord_ore', 'public.real_eq (equality) or public.real_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_real_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord_ore', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord_ore', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.real_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord', 'public.real_eq (equality) or public.real_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord', 'public.real_eq (equality) or public.real_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_real_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.double_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord_ore', 'public.double_eq (equality) or public.double_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord_ore', 'public.double_eq (equality) or public.double_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_double_ord_ore ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord_ore', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord_ore', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN public.double_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord', 'public.double_eq (equality) or public.double_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord', 'public.double_eq (equality) or public.double_ord_ope (ordering)')) NOT VALID;
 
   ALTER DOMAIN eql_v3.query_double_ord ADD CONSTRAINT eql_ore_unavailable
-    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)'));
+    CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)')) NOT VALID;
 
-  RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — % ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering), _eq (equality), or _match (match) domains instead', 38;
+  RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — 38 ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering) and _eq (equality) domains — and text_match for text pattern match — instead';
 END;
 $do$;
diff --git a/tests/sqlx/tests/v3_ore_fallback_tests.rs b/tests/sqlx/tests/v3_ore_fallback_tests.rs
index 885280dc8..4c7ba1dc0 100644
--- a/tests/sqlx/tests/v3_ore_fallback_tests.rs
+++ b/tests/sqlx/tests/v3_ore_fallback_tests.rs
@@ -53,7 +53,10 @@ async fn unique_role(conn: &mut sqlx::PgConnection) -> Result {
 /// `bf`) as arrays. Mirrors what the generated CHECK validates (key presence +
 /// array shape); the values are inert — no crypto runs at the CHECK layer.
 fn column_payload(terms: &[Term]) -> String {
-    let mut payload = String::from(r#"{"v":"3","i":{"t":"t","c":"c"},"c":"ct""#);
+    // `v` is a JSON number: the wire contract (`SchemaVersion`, the published
+    // bindings) pins integer 3; the domain CHECK's `->>` would also accept a
+    // string, but the fixtures here should model conforming payloads.
+    let mut payload = String::from(r#"{"v":3,"i":{"t":"t","c":"c"},"c":"ct""#);
     for t in Term::payload_terms(terms) {
         let key = t.json_key();
         if t.nonempty_array_key().is_some() {
@@ -69,7 +72,7 @@ fn column_payload(terms: &[Term]) -> String {
 /// A minimal payload accepted by a query-twin domain's CHECK: envelope minus
 /// `c` (the twins require `NOT (VALUE ? 'c')`) plus every term key.
 fn query_payload(terms: &[Term]) -> String {
-    let mut payload = String::from(r#"{"v":"3","i":{"t":"t","c":"c"}"#);
+    let mut payload = String::from(r#"{"v":3,"i":{"t":"t","c":"c"}"#);
     for t in Term::payload_terms(terms) {
         let key = t.json_key();
         if t.nonempty_array_key().is_some() {
@@ -310,3 +313,134 @@ async fn superuser_install_creates_opclass_and_poisons_nothing(pool: PgPool) ->
         .expect("integer_ord accepts values on a superuser install");
     Ok(())
 }
+
+/// The demotion scenario the NOT VALID poison exists for: a role installs as
+/// superuser, ORE data is stored, the role is demoted (managed-platform
+/// reality: the capability is lost), and the installer re-runs. Without
+/// NOT VALID, `ALTER DOMAIN ... ADD CONSTRAINT` validates the stored rows
+/// against the always-raising poison and aborts the whole install — for
+/// exactly the users the fallback exists to help. The re-install must
+/// succeed, keep the pre-existing rows readable, and poison only new writes.
+/// A third install run pins non-superuser-over-non-superuser re-install
+/// idempotency on a data-bearing, already-poisoned database.
+#[sqlx::test(migrations = false)]
+async fn reinstall_over_ore_data(pool: PgPool) -> Result<()> {
+    let mut conn = pool.acquire().await?;
+    let role = unique_role(&mut conn).await?;
+    let db: String = sqlx::query_scalar("SELECT current_database()")
+        .fetch_one(&mut *conn)
+        .await?;
+
+    // Self-heal from a prior failed run (see nosuper_install_poisons_ore_domains).
+    sqlx::query(&format!(
+        "DO $$ BEGIN
+           IF EXISTS (SELECT FROM pg_roles WHERE rolname = '{role}') THEN
+             EXECUTE 'DROP OWNED BY {role} CASCADE';
+             EXECUTE 'DROP ROLE {role}';
+           END IF;
+         END $$"
+    ))
+    .execute(&mut *conn)
+    .await?;
+
+    // Start SUPERUSER: the first install runs with full privileges (opclass
+    // created, nothing poisoned) and — the point of same-role demotion — the
+    // role OWNS every EQL object, so the demoted re-install can drop and
+    // alter them.
+    sqlx::query(&format!("CREATE ROLE {role} SUPERUSER"))
+        .execute(&mut *conn)
+        .await?;
+    // No-ops while the role is superuser; load-bearing after the demotion.
+    sqlx::query(&format!("GRANT CREATE ON DATABASE \"{db}\" TO {role}"))
+        .execute(&mut *conn)
+        .await?;
+    sqlx::query(&format!("GRANT CREATE ON SCHEMA public TO {role}"))
+        .execute(&mut *conn)
+        .await?;
+
+    let ord = eql_domains::scalar_families()
+        .find(|s| s.name == "integer")
+        .and_then(|s| s.domains.iter().find(|d| d.name == "ord"))
+        .expect("integer_ord in catalog");
+    let payload = column_payload(ord.terms);
+    let expected_poisoned: i64 = eql_domains::scalar_families()
+        .flat_map(|s| s.domains.iter())
+        .filter(|d| d.terms.contains(&Term::Ore))
+        .count() as i64
+        * 2; // column domain + query twin
+
+    let result = async {
+        install_as(&mut conn, &role).await?;
+
+        // Store ORE data while the domain is fully functional, owned by the
+        // role so teardown's DROP OWNED BY cleans it up.
+        sqlx::query(&format!("SET ROLE {role}"))
+            .execute(&mut *conn)
+            .await?;
+        sqlx::query("CREATE TABLE ore_reinstall_probe (x public.integer_ord)")
+            .execute(&mut *conn)
+            .await?;
+        sqlx::query("INSERT INTO ore_reinstall_probe VALUES ($1::jsonb)")
+            .bind(&payload)
+            .execute(&mut *conn)
+            .await?;
+        sqlx::query("RESET ROLE").execute(&mut *conn).await?;
+
+        sqlx::query(&format!("ALTER ROLE {role} NOSUPERUSER"))
+            .execute(&mut *conn)
+            .await?;
+
+        // The demoted re-install must not abort validating the stored row.
+        install_as(&mut conn, &role).await?;
+        drop(conn);
+
+        assert!(
+            !ore_opclass_exists(&pool).await?,
+            "the demoted re-install must not have recreated the ORE opclass"
+        );
+        let stored: i64 = sqlx::query_scalar("SELECT count(*) FROM ore_reinstall_probe")
+            .fetch_one(&pool)
+            .await?;
+        assert_eq!(stored, 1, "pre-demotion ORE rows must stay readable");
+        let err = sqlx::query("INSERT INTO ore_reinstall_probe VALUES ($1::jsonb)")
+            .bind(&payload)
+            .execute(&pool)
+            .await
+            .expect_err("new writes into the poisoned domain must raise");
+        assert_poison_error(err, "public.integer_ord");
+
+        // Non-superuser over non-superuser: a further re-run over the same
+        // data-bearing, already-poisoned database is idempotent.
+        let mut conn = pool.acquire().await?;
+        install_as(&mut conn, &role).await?;
+        drop(conn);
+        let poison_constraints: i64 = sqlx::query_scalar(
+            "SELECT count(*) FROM pg_constraint WHERE conname = 'eql_ore_unavailable'",
+        )
+        .fetch_one(&pool)
+        .await?;
+        assert_eq!(
+            poison_constraints, expected_poisoned,
+            "re-install re-poisons every ORE-carrying domain"
+        );
+        let stored: i64 = sqlx::query_scalar("SELECT count(*) FROM ore_reinstall_probe")
+            .fetch_one(&pool)
+            .await?;
+        assert_eq!(stored, 1, "rows survive repeated re-installs");
+
+        Ok::<(), anyhow::Error>(())
+    }
+    .await;
+
+    // Teardown mirrors nosuper_install_poisons_ore_domains: never let a
+    // teardown error mask the real failure.
+    let mut conn = pool.acquire().await?;
+    sqlx::query("RESET ROLE").execute(&mut *conn).await.ok();
+    if let Err(e) = drop_role(&mut conn, &role).await {
+        if result.is_ok() {
+            return Err(e);
+        }
+        eprintln!("teardown: failed to drop role {role}: {e}");
+    }
+    result
+}

From 56aa46c67b78f3b57b83d0b84da0146486b125ef Mon Sep 17 00:00:00 2001
From: James Sadler 
Date: Thu, 9 Jul 2026 14:23:08 +1000
Subject: [PATCH 592/599] feat(types)!: prefix all public EQL v3 types with
 eql_v3_ (CIP-3472)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Public-schema encrypted-domain type names now carry an eql_v3_ version
prefix (public.eql_v3_integer, public.eql_v3_text_eq, public.eql_v3_json,
...). The prefix stops EQL domains shadowing PostgreSQL built-in type
names and gives each EQL version a distinct column-type namespace so
multiple versions can coexist at runtime (future version migrations).
Query-operand domains (eql_v3.query_*) are unchanged — their schema
already versions them.

The rule lives in the catalog (eql_domains::PUBLIC_TYPNAME_PREFIX,
Domain::sql_typname); codegen renders SQL + bindings through it, the
hand-written jsonb (SteVec) surface and bindings are updated to match,
and every generated surface (src/v3/scalars, eql-bindings Rust/TS/JSON
schema, packages/eql) is regenerated — never hand-edited. dump-catalog
now emits the installed typname so the docs manifest derives names from
the same source.
---
 .changeset/prefix-public-types-eql-v3.md      |   5 +
 crates/eql-bindings/bindings/v3/Bigint.ts     |   2 +-
 crates/eql-bindings/bindings/v3/BigintEq.ts   |   2 +-
 crates/eql-bindings/bindings/v3/BigintOrd.ts  |   2 +-
 .../eql-bindings/bindings/v3/BigintOrdOpe.ts  |   2 +-
 .../eql-bindings/bindings/v3/BigintOrdOre.ts  |   2 +-
 crates/eql-bindings/bindings/v3/Boolean.ts    |   2 +-
 crates/eql-bindings/bindings/v3/Date.ts       |   2 +-
 crates/eql-bindings/bindings/v3/DateEq.ts     |   2 +-
 crates/eql-bindings/bindings/v3/DateOrd.ts    |   2 +-
 crates/eql-bindings/bindings/v3/DateOrdOpe.ts |   2 +-
 crates/eql-bindings/bindings/v3/DateOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Double.ts     |   2 +-
 crates/eql-bindings/bindings/v3/DoubleEq.ts   |   2 +-
 crates/eql-bindings/bindings/v3/DoubleOrd.ts  |   2 +-
 .../eql-bindings/bindings/v3/DoubleOrdOpe.ts  |   2 +-
 .../eql-bindings/bindings/v3/DoubleOrdOre.ts  |   2 +-
 crates/eql-bindings/bindings/v3/Integer.ts    |   2 +-
 crates/eql-bindings/bindings/v3/IntegerEq.ts  |   2 +-
 crates/eql-bindings/bindings/v3/IntegerOrd.ts |   2 +-
 .../eql-bindings/bindings/v3/IntegerOrdOpe.ts |   2 +-
 .../eql-bindings/bindings/v3/IntegerOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Numeric.ts    |   2 +-
 crates/eql-bindings/bindings/v3/NumericEq.ts  |   2 +-
 crates/eql-bindings/bindings/v3/NumericOrd.ts |   2 +-
 .../eql-bindings/bindings/v3/NumericOrdOpe.ts |   2 +-
 .../eql-bindings/bindings/v3/NumericOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Real.ts       |   2 +-
 crates/eql-bindings/bindings/v3/RealEq.ts     |   2 +-
 crates/eql-bindings/bindings/v3/RealOrd.ts    |   2 +-
 crates/eql-bindings/bindings/v3/RealOrdOpe.ts |   2 +-
 crates/eql-bindings/bindings/v3/RealOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/Smallint.ts   |   2 +-
 crates/eql-bindings/bindings/v3/SmallintEq.ts |   2 +-
 .../eql-bindings/bindings/v3/SmallintOrd.ts   |   2 +-
 .../bindings/v3/SmallintOrdOpe.ts             |   2 +-
 .../bindings/v3/SmallintOrdOre.ts             |   2 +-
 .../bindings/v3/SteVecDocument.ts             |   2 +-
 .../eql-bindings/bindings/v3/SteVecEntry.ts   |   2 +-
 crates/eql-bindings/bindings/v3/Text.ts       |   2 +-
 crates/eql-bindings/bindings/v3/TextEq.ts     |   2 +-
 crates/eql-bindings/bindings/v3/TextMatch.ts  |   2 +-
 crates/eql-bindings/bindings/v3/TextOrd.ts    |   2 +-
 crates/eql-bindings/bindings/v3/TextOrdOpe.ts |   2 +-
 crates/eql-bindings/bindings/v3/TextOrdOre.ts |   2 +-
 crates/eql-bindings/bindings/v3/TextSearch.ts |   2 +-
 crates/eql-bindings/bindings/v3/Timestamp.ts  |   2 +-
 .../eql-bindings/bindings/v3/TimestampEq.ts   |   2 +-
 .../eql-bindings/bindings/v3/TimestampOrd.ts  |   2 +-
 .../bindings/v3/TimestampOrdOpe.ts            |   2 +-
 .../bindings/v3/TimestampOrdOre.ts            |   2 +-
 crates/eql-bindings/schema/v3/date_ord.json   |  65 ---
 .../v3/{bigint.json => eql_v3_bigint.json}    |   4 +-
 .../schema/v3/eql_v3_bigint_eq.json           |   4 +-
 ...mp_ord_ore.json => eql_v3_bigint_ord.json} |   6 +-
 .../schema/v3/eql_v3_bigint_ord_ope.json      |   4 +-
 ...rd_ore.json => eql_v3_bigint_ord_ore.json} |   4 +-
 .../schema/v3/eql_v3_boolean.json             |   4 +-
 .../eql-bindings/schema/v3/eql_v3_date.json   |   4 +-
 .../v3/{date_eq.json => eql_v3_date_eq.json}  |   4 +-
 ...eger_ord_ore.json => eql_v3_date_ord.json} |   6 +-
 .../schema/v3/eql_v3_date_ord_ope.json        |   4 +-
 .../schema/v3/eql_v3_date_ord_ore.json        |   4 +-
 .../eql-bindings/schema/v3/eql_v3_double.json |   4 +-
 .../schema/v3/eql_v3_double_eq.json           |   4 +-
 .../schema/v3/eql_v3_double_ord.json          |   6 +-
 ...rd_ope.json => eql_v3_double_ord_ope.json} |   4 +-
 ...rd_ore.json => eql_v3_double_ord_ore.json} |   4 +-
 .../v3/{integer.json => eql_v3_integer.json}  |   4 +-
 .../schema/v3/eql_v3_integer_eq.json          |   4 +-
 ...teger_ord.json => eql_v3_integer_ord.json} |   4 +-
 .../schema/v3/eql_v3_integer_ord_ope.json     |   4 +-
 ...t_ord.json => eql_v3_integer_ord_ore.json} |   6 +-
 .../eql-bindings/schema/v3/eql_v3_json.json   |   6 +-
 ...onb_entry.json => eql_v3_jsonb_entry.json} |   4 +-
 .../v3/{numeric.json => eql_v3_numeric.json}  |   4 +-
 ...numeric_eq.json => eql_v3_numeric_eq.json} |   4 +-
 ...meric_ord.json => eql_v3_numeric_ord.json} |   4 +-
 ...d_ope.json => eql_v3_numeric_ord_ope.json} |   4 +-
 .../schema/v3/eql_v3_numeric_ord_ore.json     |  65 +++
 .../schema/v3/{real.json => eql_v3_real.json} |   4 +-
 .../v3/{real_eq.json => eql_v3_real_eq.json}  |   4 +-
 ...eric_ord_ore.json => eql_v3_real_ord.json} |   6 +-
 ..._ord_ope.json => eql_v3_real_ord_ope.json} |   4 +-
 ..._ord_ore.json => eql_v3_real_ord_ore.json} |   4 +-
 .../{smallint.json => eql_v3_smallint.json}   |   4 +-
 ...allint_eq.json => eql_v3_smallint_eq.json} |   4 +-
 ...lint_ord.json => eql_v3_smallint_ord.json} |   4 +-
 ..._ope.json => eql_v3_smallint_ord_ope.json} |   4 +-
 ..._ore.json => eql_v3_smallint_ord_ore.json} |   4 +-
 .../schema/v3/{text.json => eql_v3_text.json} |   4 +-
 .../v3/{text_eq.json => eql_v3_text_eq.json}  |   4 +-
 .../schema/v3/eql_v3_text_match.json          |   4 +-
 .../schema/v3/eql_v3_text_ord.json            |   4 +-
 ..._ord_ope.json => eql_v3_text_ord_ope.json} |   4 +-
 ..._ord_ore.json => eql_v3_text_ord_ore.json} |   4 +-
 .../schema/v3/eql_v3_text_search.json         |   4 +-
 .../{timestamp.json => eql_v3_timestamp.json} |   4 +-
 ...stamp_eq.json => eql_v3_timestamp_eq.json} |   4 +-
 ...amp_ord.json => eql_v3_timestamp_ord.json} |   4 +-
 ...ope.json => eql_v3_timestamp_ord_ope.json} |   4 +-
 .../schema/v3/eql_v3_timestamp_ord_ore.json   |  65 +++
 crates/eql-bindings/schema/v3/real_ord.json   |  65 ---
 crates/eql-bindings/src/from_v2/mod.rs        |  25 +-
 crates/eql-bindings/src/from_v2/target.rs     |  12 +-
 crates/eql-bindings/src/v3/bigint.rs          |  20 +-
 crates/eql-bindings/src/v3/boolean.rs         |   4 +-
 crates/eql-bindings/src/v3/date.rs            |  20 +-
 crates/eql-bindings/src/v3/domain_type.rs     |   9 +
 crates/eql-bindings/src/v3/double.rs          |  20 +-
 crates/eql-bindings/src/v3/integer.rs         |  20 +-
 crates/eql-bindings/src/v3/jsonb.rs           |   8 +-
 crates/eql-bindings/src/v3/numeric.rs         |  20 +-
 crates/eql-bindings/src/v3/payload.rs         | 224 +++++-----
 crates/eql-bindings/src/v3/real.rs            |  20 +-
 crates/eql-bindings/src/v3/smallint.rs        |  20 +-
 crates/eql-bindings/src/v3/text.rs            |  28 +-
 crates/eql-bindings/src/v3/timestamp.rs       |  20 +-
 crates/eql-bindings/tests/catalog_parity.rs   |  24 +-
 crates/eql-bindings/tests/domain_payload.rs   |  50 +--
 crates/eql-bindings/tests/from_v2.rs          |  64 +--
 crates/eql-bindings/tests/query_payload.rs    |  14 +-
 crates/eql-bindings/tests/v3_conformance.rs   |  92 ++---
 crates/eql-codegen/src/bindings.rs            |  57 +--
 crates/eql-codegen/src/context.rs             |  42 +-
 crates/eql-codegen/src/dump.rs                |  13 +-
 crates/eql-codegen/src/generate.rs            |  24 +-
 crates/eql-codegen/src/operator_surface.rs    |  44 +-
 crates/eql-domains/src/lib.rs                 |  16 +
 crates/eql-domains/src/spec.rs                |  43 +-
 crates/eql-domains/src/tests.rs               |  18 +-
 packages/eql/src/generated/schema-manifest.ts | 200 ++++-----
 .../eql/src/generated/schema/v3/date_ord.json |  65 ---
 .../src/generated/schema/v3/double_ord.json   |  65 ---
 .../v3/{bigint.json => eql_v3_bigint.json}    |   4 +-
 .../generated/schema/v3/eql_v3_bigint_eq.json |   4 +-
 ...bigint_ord.json => eql_v3_bigint_ord.json} |   4 +-
 .../schema/v3/eql_v3_bigint_ord_ope.json      |   4 +-
 ...rd_ore.json => eql_v3_bigint_ord_ore.json} |   4 +-
 .../generated/schema/v3/eql_v3_boolean.json   |   4 +-
 .../src/generated/schema/v3/eql_v3_date.json  |   4 +-
 .../v3/{date_eq.json => eql_v3_date_eq.json}  |   4 +-
 ...eger_ord_ore.json => eql_v3_date_ord.json} |   6 +-
 .../schema/v3/eql_v3_date_ord_ope.json        |   4 +-
 .../schema/v3/eql_v3_date_ord_ore.json        |   4 +-
 .../generated/schema/v3/eql_v3_double.json    |   4 +-
 .../generated/schema/v3/eql_v3_double_eq.json |   4 +-
 .../schema/v3/eql_v3_double_ord.json          |   4 +-
 ...rd_ope.json => eql_v3_double_ord_ope.json} |   4 +-
 ...rd_ore.json => eql_v3_double_ord_ore.json} |   4 +-
 .../v3/{integer.json => eql_v3_integer.json}  |   4 +-
 .../schema/v3/eql_v3_integer_eq.json          |   4 +-
 ...teger_ord.json => eql_v3_integer_ord.json} |   4 +-
 .../schema/v3/eql_v3_integer_ord_ope.json     |   4 +-
 .../schema/v3/eql_v3_integer_ord_ore.json     |  65 +++
 .../src/generated/schema/v3/eql_v3_json.json  |   6 +-
 ...onb_entry.json => eql_v3_jsonb_entry.json} |   4 +-
 .../v3/{numeric.json => eql_v3_numeric.json}  |   4 +-
 ...numeric_eq.json => eql_v3_numeric_eq.json} |   4 +-
 ...meric_ord.json => eql_v3_numeric_ord.json} |   4 +-
 ...d_ope.json => eql_v3_numeric_ord_ope.json} |   4 +-
 .../schema/v3/eql_v3_numeric_ord_ore.json     |  65 +++
 .../schema/v3/{real.json => eql_v3_real.json} |   4 +-
 .../v3/{real_eq.json => eql_v3_real_eq.json}  |   4 +-
 ...eric_ord_ore.json => eql_v3_real_ord.json} |   6 +-
 ..._ord_ope.json => eql_v3_real_ord_ope.json} |   4 +-
 ..._ord_ore.json => eql_v3_real_ord_ore.json} |   4 +-
 .../{smallint.json => eql_v3_smallint.json}   |   4 +-
 ...allint_eq.json => eql_v3_smallint_eq.json} |   4 +-
 ...lint_ord.json => eql_v3_smallint_ord.json} |   4 +-
 ..._ope.json => eql_v3_smallint_ord_ope.json} |   4 +-
 ..._ore.json => eql_v3_smallint_ord_ore.json} |   4 +-
 .../schema/v3/{text.json => eql_v3_text.json} |   4 +-
 .../v3/{text_eq.json => eql_v3_text_eq.json}  |   4 +-
 .../schema/v3/eql_v3_text_match.json          |   4 +-
 .../generated/schema/v3/eql_v3_text_ord.json  |   4 +-
 ..._ord_ope.json => eql_v3_text_ord_ope.json} |   4 +-
 ..._ord_ore.json => eql_v3_text_ord_ore.json} |   4 +-
 .../schema/v3/eql_v3_text_search.json         |   4 +-
 .../{timestamp.json => eql_v3_timestamp.json} |   4 +-
 ...stamp_eq.json => eql_v3_timestamp_eq.json} |   4 +-
 ...amp_ord.json => eql_v3_timestamp_ord.json} |   4 +-
 ...ope.json => eql_v3_timestamp_ord_ope.json} |   4 +-
 .../schema/v3/eql_v3_timestamp_ord_ore.json   |  65 +++
 .../eql/src/generated/schema/v3/real_ord.json |  65 ---
 packages/eql/src/generated/v3/Bigint.ts       |   2 +-
 packages/eql/src/generated/v3/BigintEq.ts     |   2 +-
 packages/eql/src/generated/v3/BigintOrd.ts    |   2 +-
 packages/eql/src/generated/v3/BigintOrdOpe.ts |   2 +-
 packages/eql/src/generated/v3/BigintOrdOre.ts |   2 +-
 packages/eql/src/generated/v3/Boolean.ts      |   2 +-
 packages/eql/src/generated/v3/Date.ts         |   2 +-
 packages/eql/src/generated/v3/DateEq.ts       |   2 +-
 packages/eql/src/generated/v3/DateOrd.ts      |   2 +-
 packages/eql/src/generated/v3/DateOrdOpe.ts   |   2 +-
 packages/eql/src/generated/v3/DateOrdOre.ts   |   2 +-
 packages/eql/src/generated/v3/Double.ts       |   2 +-
 packages/eql/src/generated/v3/DoubleEq.ts     |   2 +-
 packages/eql/src/generated/v3/DoubleOrd.ts    |   2 +-
 packages/eql/src/generated/v3/DoubleOrdOpe.ts |   2 +-
 packages/eql/src/generated/v3/DoubleOrdOre.ts |   2 +-
 packages/eql/src/generated/v3/Integer.ts      |   2 +-
 packages/eql/src/generated/v3/IntegerEq.ts    |   2 +-
 packages/eql/src/generated/v3/IntegerOrd.ts   |   2 +-
 .../eql/src/generated/v3/IntegerOrdOpe.ts     |   2 +-
 .../eql/src/generated/v3/IntegerOrdOre.ts     |   2 +-
 packages/eql/src/generated/v3/Numeric.ts      |   2 +-
 packages/eql/src/generated/v3/NumericEq.ts    |   2 +-
 packages/eql/src/generated/v3/NumericOrd.ts   |   2 +-
 .../eql/src/generated/v3/NumericOrdOpe.ts     |   2 +-
 .../eql/src/generated/v3/NumericOrdOre.ts     |   2 +-
 packages/eql/src/generated/v3/Real.ts         |   2 +-
 packages/eql/src/generated/v3/RealEq.ts       |   2 +-
 packages/eql/src/generated/v3/RealOrd.ts      |   2 +-
 packages/eql/src/generated/v3/RealOrdOpe.ts   |   2 +-
 packages/eql/src/generated/v3/RealOrdOre.ts   |   2 +-
 packages/eql/src/generated/v3/Smallint.ts     |   2 +-
 packages/eql/src/generated/v3/SmallintEq.ts   |   2 +-
 packages/eql/src/generated/v3/SmallintOrd.ts  |   2 +-
 .../eql/src/generated/v3/SmallintOrdOpe.ts    |   2 +-
 .../eql/src/generated/v3/SmallintOrdOre.ts    |   2 +-
 .../eql/src/generated/v3/SteVecDocument.ts    |   2 +-
 packages/eql/src/generated/v3/SteVecEntry.ts  |   2 +-
 packages/eql/src/generated/v3/Text.ts         |   2 +-
 packages/eql/src/generated/v3/TextEq.ts       |   2 +-
 packages/eql/src/generated/v3/TextMatch.ts    |   2 +-
 packages/eql/src/generated/v3/TextOrd.ts      |   2 +-
 packages/eql/src/generated/v3/TextOrdOpe.ts   |   2 +-
 packages/eql/src/generated/v3/TextOrdOre.ts   |   2 +-
 packages/eql/src/generated/v3/TextSearch.ts   |   2 +-
 packages/eql/src/generated/v3/Timestamp.ts    |   2 +-
 packages/eql/src/generated/v3/TimestampEq.ts  |   2 +-
 packages/eql/src/generated/v3/TimestampOrd.ts |   2 +-
 .../eql/src/generated/v3/TimestampOrdOpe.ts   |   2 +-
 .../eql/src/generated/v3/TimestampOrdOre.ts   |   2 +-
 src/v3/jsonb/aggregates.sql                   |  50 +--
 src/v3/jsonb/blockers.sql                     | 216 +++++-----
 src/v3/jsonb/functions.sql                    |  54 +--
 src/v3/jsonb/operators.sql                    | 158 +++----
 src/v3/jsonb/types.sql                        |  30 +-
 src/v3/scalars/bigint/bigint_eq_functions.sql | 386 +++++++++---------
 src/v3/scalars/bigint/bigint_eq_operators.sql |  90 ++--
 src/v3/scalars/bigint/bigint_functions.sql    | 384 ++++++++---------
 src/v3/scalars/bigint/bigint_operators.sql    |  90 ++--
 .../scalars/bigint/bigint_ord_aggregates.sql  |  46 +--
 .../scalars/bigint/bigint_ord_functions.sql   | 378 ++++++++---------
 .../bigint/bigint_ord_ope_aggregates.sql      |  46 +--
 .../bigint/bigint_ord_ope_functions.sql       | 378 ++++++++---------
 .../bigint/bigint_ord_ope_operators.sql       |  90 ++--
 .../scalars/bigint/bigint_ord_operators.sql   |  90 ++--
 .../bigint/bigint_ord_ore_aggregates.sql      |  46 +--
 .../bigint/bigint_ord_ore_functions.sql       | 378 ++++++++---------
 .../bigint/bigint_ord_ore_operators.sql       |  90 ++--
 src/v3/scalars/bigint/bigint_types.sql        |  40 +-
 .../bigint/query_bigint_eq_functions.sql      |  16 +-
 .../bigint/query_bigint_eq_operators.sql      |   8 +-
 .../bigint/query_bigint_ord_functions.sql     |  48 +--
 .../bigint/query_bigint_ord_ope_functions.sql |  48 +--
 .../bigint/query_bigint_ord_ope_operators.sql |  24 +-
 .../bigint/query_bigint_ord_operators.sql     |  24 +-
 .../bigint/query_bigint_ord_ore_functions.sql |  48 +--
 .../bigint/query_bigint_ord_ore_operators.sql |  24 +-
 src/v3/scalars/boolean/boolean_functions.sql  | 384 ++++++++---------
 src/v3/scalars/boolean/boolean_operators.sql  |  90 ++--
 src/v3/scalars/boolean/boolean_types.sql      |   8 +-
 src/v3/scalars/date/date_eq_functions.sql     | 386 +++++++++---------
 src/v3/scalars/date/date_eq_operators.sql     |  90 ++--
 src/v3/scalars/date/date_functions.sql        | 384 ++++++++---------
 src/v3/scalars/date/date_operators.sql        |  90 ++--
 src/v3/scalars/date/date_ord_aggregates.sql   |  46 +--
 src/v3/scalars/date/date_ord_functions.sql    | 378 ++++++++---------
 .../scalars/date/date_ord_ope_aggregates.sql  |  46 +--
 .../scalars/date/date_ord_ope_functions.sql   | 378 ++++++++---------
 .../scalars/date/date_ord_ope_operators.sql   |  90 ++--
 src/v3/scalars/date/date_ord_operators.sql    |  90 ++--
 .../scalars/date/date_ord_ore_aggregates.sql  |  46 +--
 .../scalars/date/date_ord_ore_functions.sql   | 378 ++++++++---------
 .../scalars/date/date_ord_ore_operators.sql   |  90 ++--
 src/v3/scalars/date/date_types.sql            |  40 +-
 .../scalars/date/query_date_eq_functions.sql  |  16 +-
 .../scalars/date/query_date_eq_operators.sql  |   8 +-
 .../scalars/date/query_date_ord_functions.sql |  48 +--
 .../date/query_date_ord_ope_functions.sql     |  48 +--
 .../date/query_date_ord_ope_operators.sql     |  24 +-
 .../scalars/date/query_date_ord_operators.sql |  24 +-
 .../date/query_date_ord_ore_functions.sql     |  48 +--
 .../date/query_date_ord_ore_operators.sql     |  24 +-
 src/v3/scalars/double/double_eq_functions.sql | 386 +++++++++---------
 src/v3/scalars/double/double_eq_operators.sql |  90 ++--
 src/v3/scalars/double/double_functions.sql    | 384 ++++++++---------
 src/v3/scalars/double/double_operators.sql    |  90 ++--
 .../scalars/double/double_ord_aggregates.sql  |  46 +--
 .../scalars/double/double_ord_functions.sql   | 378 ++++++++---------
 .../double/double_ord_ope_aggregates.sql      |  46 +--
 .../double/double_ord_ope_functions.sql       | 378 ++++++++---------
 .../double/double_ord_ope_operators.sql       |  90 ++--
 .../scalars/double/double_ord_operators.sql   |  90 ++--
 .../double/double_ord_ore_aggregates.sql      |  46 +--
 .../double/double_ord_ore_functions.sql       | 378 ++++++++---------
 .../double/double_ord_ore_operators.sql       |  90 ++--
 src/v3/scalars/double/double_types.sql        |  40 +-
 .../double/query_double_eq_functions.sql      |  16 +-
 .../double/query_double_eq_operators.sql      |   8 +-
 .../double/query_double_ord_functions.sql     |  48 +--
 .../double/query_double_ord_ope_functions.sql |  48 +--
 .../double/query_double_ord_ope_operators.sql |  24 +-
 .../double/query_double_ord_operators.sql     |  24 +-
 .../double/query_double_ord_ore_functions.sql |  48 +--
 .../double/query_double_ord_ore_operators.sql |  24 +-
 .../scalars/integer/integer_eq_functions.sql  | 386 +++++++++---------
 .../scalars/integer/integer_eq_operators.sql  |  90 ++--
 src/v3/scalars/integer/integer_functions.sql  | 384 ++++++++---------
 src/v3/scalars/integer/integer_operators.sql  |  90 ++--
 .../integer/integer_ord_aggregates.sql        |  46 +--
 .../scalars/integer/integer_ord_functions.sql | 378 ++++++++---------
 .../integer/integer_ord_ope_aggregates.sql    |  46 +--
 .../integer/integer_ord_ope_functions.sql     | 378 ++++++++---------
 .../integer/integer_ord_ope_operators.sql     |  90 ++--
 .../scalars/integer/integer_ord_operators.sql |  90 ++--
 .../integer/integer_ord_ore_aggregates.sql    |  46 +--
 .../integer/integer_ord_ore_functions.sql     | 378 ++++++++---------
 .../integer/integer_ord_ore_operators.sql     |  90 ++--
 src/v3/scalars/integer/integer_types.sql      |  40 +-
 .../integer/query_integer_eq_functions.sql    |  16 +-
 .../integer/query_integer_eq_operators.sql    |   8 +-
 .../integer/query_integer_ord_functions.sql   |  48 +--
 .../query_integer_ord_ope_functions.sql       |  48 +--
 .../query_integer_ord_ope_operators.sql       |  24 +-
 .../integer/query_integer_ord_operators.sql   |  24 +-
 .../query_integer_ord_ore_functions.sql       |  48 +--
 .../query_integer_ord_ore_operators.sql       |  24 +-
 .../scalars/numeric/numeric_eq_functions.sql  | 386 +++++++++---------
 .../scalars/numeric/numeric_eq_operators.sql  |  90 ++--
 src/v3/scalars/numeric/numeric_functions.sql  | 384 ++++++++---------
 src/v3/scalars/numeric/numeric_operators.sql  |  90 ++--
 .../numeric/numeric_ord_aggregates.sql        |  46 +--
 .../scalars/numeric/numeric_ord_functions.sql | 378 ++++++++---------
 .../numeric/numeric_ord_ope_aggregates.sql    |  46 +--
 .../numeric/numeric_ord_ope_functions.sql     | 378 ++++++++---------
 .../numeric/numeric_ord_ope_operators.sql     |  90 ++--
 .../scalars/numeric/numeric_ord_operators.sql |  90 ++--
 .../numeric/numeric_ord_ore_aggregates.sql    |  46 +--
 .../numeric/numeric_ord_ore_functions.sql     | 378 ++++++++---------
 .../numeric/numeric_ord_ore_operators.sql     |  90 ++--
 src/v3/scalars/numeric/numeric_types.sql      |  40 +-
 .../numeric/query_numeric_eq_functions.sql    |  16 +-
 .../numeric/query_numeric_eq_operators.sql    |   8 +-
 .../numeric/query_numeric_ord_functions.sql   |  48 +--
 .../query_numeric_ord_ope_functions.sql       |  48 +--
 .../query_numeric_ord_ope_operators.sql       |  24 +-
 .../numeric/query_numeric_ord_operators.sql   |  24 +-
 .../query_numeric_ord_ore_functions.sql       |  48 +--
 .../query_numeric_ord_ore_operators.sql       |  24 +-
 .../scalars/real/query_real_eq_functions.sql  |  16 +-
 .../scalars/real/query_real_eq_operators.sql  |   8 +-
 .../scalars/real/query_real_ord_functions.sql |  48 +--
 .../real/query_real_ord_ope_functions.sql     |  48 +--
 .../real/query_real_ord_ope_operators.sql     |  24 +-
 .../scalars/real/query_real_ord_operators.sql |  24 +-
 .../real/query_real_ord_ore_functions.sql     |  48 +--
 .../real/query_real_ord_ore_operators.sql     |  24 +-
 src/v3/scalars/real/real_eq_functions.sql     | 386 +++++++++---------
 src/v3/scalars/real/real_eq_operators.sql     |  90 ++--
 src/v3/scalars/real/real_functions.sql        | 384 ++++++++---------
 src/v3/scalars/real/real_operators.sql        |  90 ++--
 src/v3/scalars/real/real_ord_aggregates.sql   |  46 +--
 src/v3/scalars/real/real_ord_functions.sql    | 378 ++++++++---------
 .../scalars/real/real_ord_ope_aggregates.sql  |  46 +--
 .../scalars/real/real_ord_ope_functions.sql   | 378 ++++++++---------
 .../scalars/real/real_ord_ope_operators.sql   |  90 ++--
 src/v3/scalars/real/real_ord_operators.sql    |  90 ++--
 .../scalars/real/real_ord_ore_aggregates.sql  |  46 +--
 .../scalars/real/real_ord_ore_functions.sql   | 378 ++++++++---------
 .../scalars/real/real_ord_ore_operators.sql   |  90 ++--
 src/v3/scalars/real/real_types.sql            |  40 +-
 .../smallint/query_smallint_eq_functions.sql  |  16 +-
 .../smallint/query_smallint_eq_operators.sql  |   8 +-
 .../smallint/query_smallint_ord_functions.sql |  48 +--
 .../query_smallint_ord_ope_functions.sql      |  48 +--
 .../query_smallint_ord_ope_operators.sql      |  24 +-
 .../smallint/query_smallint_ord_operators.sql |  24 +-
 .../query_smallint_ord_ore_functions.sql      |  48 +--
 .../query_smallint_ord_ore_operators.sql      |  24 +-
 .../smallint/smallint_eq_functions.sql        | 386 +++++++++---------
 .../smallint/smallint_eq_operators.sql        |  90 ++--
 .../scalars/smallint/smallint_functions.sql   | 384 ++++++++---------
 .../scalars/smallint/smallint_operators.sql   |  90 ++--
 .../smallint/smallint_ord_aggregates.sql      |  46 +--
 .../smallint/smallint_ord_functions.sql       | 378 ++++++++---------
 .../smallint/smallint_ord_ope_aggregates.sql  |  46 +--
 .../smallint/smallint_ord_ope_functions.sql   | 378 ++++++++---------
 .../smallint/smallint_ord_ope_operators.sql   |  90 ++--
 .../smallint/smallint_ord_operators.sql       |  90 ++--
 .../smallint/smallint_ord_ore_aggregates.sql  |  46 +--
 .../smallint/smallint_ord_ore_functions.sql   | 378 ++++++++---------
 .../smallint/smallint_ord_ore_operators.sql   |  90 ++--
 src/v3/scalars/smallint/smallint_types.sql    |  40 +-
 .../scalars/text/query_text_eq_functions.sql  |  16 +-
 .../scalars/text/query_text_eq_operators.sql  |   8 +-
 .../text/query_text_match_functions.sql       |  16 +-
 .../text/query_text_match_operators.sql       |   8 +-
 .../scalars/text/query_text_ord_functions.sql |  48 +--
 .../text/query_text_ord_ope_functions.sql     |  48 +--
 .../text/query_text_ord_ope_operators.sql     |  24 +-
 .../scalars/text/query_text_ord_operators.sql |  24 +-
 .../text/query_text_ord_ore_functions.sql     |  48 +--
 .../text/query_text_ord_ore_operators.sql     |  24 +-
 .../text/query_text_search_functions.sql      |  64 +--
 .../text/query_text_search_operators.sql      |  32 +-
 src/v3/scalars/text/text_eq_functions.sql     | 386 +++++++++---------
 src/v3/scalars/text/text_eq_operators.sql     |  90 ++--
 src/v3/scalars/text/text_functions.sql        | 384 ++++++++---------
 src/v3/scalars/text/text_match_functions.sql  | 386 +++++++++---------
 src/v3/scalars/text/text_match_operators.sql  |  90 ++--
 src/v3/scalars/text/text_operators.sql        |  90 ++--
 src/v3/scalars/text/text_ord_aggregates.sql   |  46 +--
 src/v3/scalars/text/text_ord_functions.sql    | 384 ++++++++---------
 .../scalars/text/text_ord_ope_aggregates.sql  |  46 +--
 .../scalars/text/text_ord_ope_functions.sql   | 384 ++++++++---------
 .../scalars/text/text_ord_ope_operators.sql   |  90 ++--
 src/v3/scalars/text/text_ord_operators.sql    |  90 ++--
 .../scalars/text/text_ord_ore_aggregates.sql  |  46 +--
 .../scalars/text/text_ord_ore_functions.sql   | 384 ++++++++---------
 .../scalars/text/text_ord_ore_operators.sql   |  90 ++--
 .../scalars/text/text_search_aggregates.sql   |  46 +--
 src/v3/scalars/text/text_search_functions.sql | 386 +++++++++---------
 src/v3/scalars/text/text_search_operators.sql |  90 ++--
 src/v3/scalars/text/text_types.sql            |  56 +--
 .../query_timestamp_eq_functions.sql          |  16 +-
 .../query_timestamp_eq_operators.sql          |   8 +-
 .../query_timestamp_ord_functions.sql         |  48 +--
 .../query_timestamp_ord_ope_functions.sql     |  48 +--
 .../query_timestamp_ord_ope_operators.sql     |  24 +-
 .../query_timestamp_ord_operators.sql         |  24 +-
 .../query_timestamp_ord_ore_functions.sql     |  48 +--
 .../query_timestamp_ord_ore_operators.sql     |  24 +-
 .../timestamp/timestamp_eq_functions.sql      | 386 +++++++++---------
 .../timestamp/timestamp_eq_operators.sql      |  90 ++--
 .../scalars/timestamp/timestamp_functions.sql | 384 ++++++++---------
 .../scalars/timestamp/timestamp_operators.sql |  90 ++--
 .../timestamp/timestamp_ord_aggregates.sql    |  46 +--
 .../timestamp/timestamp_ord_functions.sql     | 378 ++++++++---------
 .../timestamp_ord_ope_aggregates.sql          |  46 +--
 .../timestamp/timestamp_ord_ope_functions.sql | 378 ++++++++---------
 .../timestamp/timestamp_ord_ope_operators.sql |  90 ++--
 .../timestamp/timestamp_ord_operators.sql     |  90 ++--
 .../timestamp_ord_ore_aggregates.sql          |  46 +--
 .../timestamp/timestamp_ord_ore_functions.sql | 378 ++++++++---------
 .../timestamp/timestamp_ord_ore_operators.sql |  90 ++--
 src/v3/scalars/timestamp/timestamp_types.sql  |  40 +-
 src/v3/schema.sql                             |   2 +-
 tasks/docs/generate/test_xml_to_json.py       |  34 +-
 tasks/docs/generate/xml-to-json.py            |   8 +-
 453 files changed, 14848 insertions(+), 14710 deletions(-)
 create mode 100644 .changeset/prefix-public-types-eql-v3.md
 delete mode 100644 crates/eql-bindings/schema/v3/date_ord.json
 rename crates/eql-bindings/schema/v3/{bigint.json => eql_v3_bigint.json} (86%)
 rename packages/eql/src/generated/schema/v3/bigint_eq.json => crates/eql-bindings/schema/v3/eql_v3_bigint_eq.json (88%)
 rename crates/eql-bindings/schema/v3/{timestamp_ord_ore.json => eql_v3_bigint_ord.json} (91%)
 rename packages/eql/src/generated/schema/v3/bigint_ord_ope.json => crates/eql-bindings/schema/v3/eql_v3_bigint_ord_ope.json (88%)
 rename crates/eql-bindings/schema/v3/{bigint_ord_ore.json => eql_v3_bigint_ord_ore.json} (88%)
 rename packages/eql/src/generated/schema/v3/boolean.json => crates/eql-bindings/schema/v3/eql_v3_boolean.json (86%)
 rename packages/eql/src/generated/schema/v3/date.json => crates/eql-bindings/schema/v3/eql_v3_date.json (87%)
 rename crates/eql-bindings/schema/v3/{date_eq.json => eql_v3_date_eq.json} (88%)
 rename crates/eql-bindings/schema/v3/{integer_ord_ore.json => eql_v3_date_ord.json} (92%)
 rename packages/eql/src/generated/schema/v3/date_ord_ope.json => crates/eql-bindings/schema/v3/eql_v3_date_ord_ope.json (89%)
 rename packages/eql/src/generated/schema/v3/date_ord_ore.json => crates/eql-bindings/schema/v3/eql_v3_date_ord_ore.json (89%)
 rename packages/eql/src/generated/schema/v3/double.json => crates/eql-bindings/schema/v3/eql_v3_double.json (86%)
 rename packages/eql/src/generated/schema/v3/double_eq.json => crates/eql-bindings/schema/v3/eql_v3_double_eq.json (88%)
 rename packages/eql/src/generated/schema/v3/timestamp_ord_ore.json => crates/eql-bindings/schema/v3/eql_v3_double_ord.json (91%)
 rename crates/eql-bindings/schema/v3/{double_ord_ope.json => eql_v3_double_ord_ope.json} (88%)
 rename crates/eql-bindings/schema/v3/{double_ord_ore.json => eql_v3_double_ord_ore.json} (88%)
 rename crates/eql-bindings/schema/v3/{integer.json => eql_v3_integer.json} (86%)
 rename packages/eql/src/generated/schema/v3/integer_eq.json => crates/eql-bindings/schema/v3/eql_v3_integer_eq.json (88%)
 rename crates/eql-bindings/schema/v3/{integer_ord.json => eql_v3_integer_ord.json} (89%)
 rename packages/eql/src/generated/schema/v3/integer_ord_ope.json => crates/eql-bindings/schema/v3/eql_v3_integer_ord_ope.json (88%)
 rename crates/eql-bindings/schema/v3/{bigint_ord.json => eql_v3_integer_ord_ore.json} (87%)
 rename packages/eql/src/generated/schema/v3/json.json => crates/eql-bindings/schema/v3/eql_v3_json.json (82%)
 rename crates/eql-bindings/schema/v3/{jsonb_entry.json => eql_v3_jsonb_entry.json} (80%)
 rename crates/eql-bindings/schema/v3/{numeric.json => eql_v3_numeric.json} (86%)
 rename crates/eql-bindings/schema/v3/{numeric_eq.json => eql_v3_numeric_eq.json} (88%)
 rename crates/eql-bindings/schema/v3/{numeric_ord.json => eql_v3_numeric_ord.json} (89%)
 rename crates/eql-bindings/schema/v3/{numeric_ord_ope.json => eql_v3_numeric_ord_ope.json} (88%)
 create mode 100644 crates/eql-bindings/schema/v3/eql_v3_numeric_ord_ore.json
 rename crates/eql-bindings/schema/v3/{real.json => eql_v3_real.json} (87%)
 rename crates/eql-bindings/schema/v3/{real_eq.json => eql_v3_real_eq.json} (88%)
 rename crates/eql-bindings/schema/v3/{numeric_ord_ore.json => eql_v3_real_ord.json} (92%)
 rename crates/eql-bindings/schema/v3/{real_ord_ope.json => eql_v3_real_ord_ope.json} (89%)
 rename crates/eql-bindings/schema/v3/{real_ord_ore.json => eql_v3_real_ord_ore.json} (89%)
 rename crates/eql-bindings/schema/v3/{smallint.json => eql_v3_smallint.json} (86%)
 rename crates/eql-bindings/schema/v3/{smallint_eq.json => eql_v3_smallint_eq.json} (88%)
 rename crates/eql-bindings/schema/v3/{smallint_ord.json => eql_v3_smallint_ord.json} (89%)
 rename crates/eql-bindings/schema/v3/{smallint_ord_ope.json => eql_v3_smallint_ord_ope.json} (88%)
 rename crates/eql-bindings/schema/v3/{smallint_ord_ore.json => eql_v3_smallint_ord_ore.json} (88%)
 rename crates/eql-bindings/schema/v3/{text.json => eql_v3_text.json} (87%)
 rename crates/eql-bindings/schema/v3/{text_eq.json => eql_v3_text_eq.json} (88%)
 rename packages/eql/src/generated/schema/v3/text_match.json => crates/eql-bindings/schema/v3/eql_v3_text_match.json (89%)
 rename packages/eql/src/generated/schema/v3/text_ord.json => crates/eql-bindings/schema/v3/eql_v3_text_ord.json (90%)
 rename crates/eql-bindings/schema/v3/{text_ord_ope.json => eql_v3_text_ord_ope.json} (90%)
 rename crates/eql-bindings/schema/v3/{text_ord_ore.json => eql_v3_text_ord_ore.json} (90%)
 rename packages/eql/src/generated/schema/v3/text_search.json => crates/eql-bindings/schema/v3/eql_v3_text_search.json (91%)
 rename crates/eql-bindings/schema/v3/{timestamp.json => eql_v3_timestamp.json} (86%)
 rename crates/eql-bindings/schema/v3/{timestamp_eq.json => eql_v3_timestamp_eq.json} (88%)
 rename crates/eql-bindings/schema/v3/{timestamp_ord.json => eql_v3_timestamp_ord.json} (89%)
 rename crates/eql-bindings/schema/v3/{timestamp_ord_ope.json => eql_v3_timestamp_ord_ope.json} (88%)
 create mode 100644 crates/eql-bindings/schema/v3/eql_v3_timestamp_ord_ore.json
 delete mode 100644 crates/eql-bindings/schema/v3/real_ord.json
 delete mode 100644 packages/eql/src/generated/schema/v3/date_ord.json
 delete mode 100644 packages/eql/src/generated/schema/v3/double_ord.json
 rename packages/eql/src/generated/schema/v3/{bigint.json => eql_v3_bigint.json} (86%)
 rename crates/eql-bindings/schema/v3/bigint_eq.json => packages/eql/src/generated/schema/v3/eql_v3_bigint_eq.json (88%)
 rename packages/eql/src/generated/schema/v3/{bigint_ord.json => eql_v3_bigint_ord.json} (89%)
 rename crates/eql-bindings/schema/v3/bigint_ord_ope.json => packages/eql/src/generated/schema/v3/eql_v3_bigint_ord_ope.json (88%)
 rename packages/eql/src/generated/schema/v3/{bigint_ord_ore.json => eql_v3_bigint_ord_ore.json} (88%)
 rename crates/eql-bindings/schema/v3/boolean.json => packages/eql/src/generated/schema/v3/eql_v3_boolean.json (86%)
 rename crates/eql-bindings/schema/v3/date.json => packages/eql/src/generated/schema/v3/eql_v3_date.json (87%)
 rename packages/eql/src/generated/schema/v3/{date_eq.json => eql_v3_date_eq.json} (88%)
 rename packages/eql/src/generated/schema/v3/{integer_ord_ore.json => eql_v3_date_ord.json} (92%)
 rename crates/eql-bindings/schema/v3/date_ord_ope.json => packages/eql/src/generated/schema/v3/eql_v3_date_ord_ope.json (89%)
 rename crates/eql-bindings/schema/v3/date_ord_ore.json => packages/eql/src/generated/schema/v3/eql_v3_date_ord_ore.json (89%)
 rename crates/eql-bindings/schema/v3/double.json => packages/eql/src/generated/schema/v3/eql_v3_double.json (86%)
 rename crates/eql-bindings/schema/v3/double_eq.json => packages/eql/src/generated/schema/v3/eql_v3_double_eq.json (88%)
 rename crates/eql-bindings/schema/v3/double_ord.json => packages/eql/src/generated/schema/v3/eql_v3_double_ord.json (89%)
 rename packages/eql/src/generated/schema/v3/{double_ord_ope.json => eql_v3_double_ord_ope.json} (88%)
 rename packages/eql/src/generated/schema/v3/{double_ord_ore.json => eql_v3_double_ord_ore.json} (88%)
 rename packages/eql/src/generated/schema/v3/{integer.json => eql_v3_integer.json} (86%)
 rename crates/eql-bindings/schema/v3/integer_eq.json => packages/eql/src/generated/schema/v3/eql_v3_integer_eq.json (88%)
 rename packages/eql/src/generated/schema/v3/{integer_ord.json => eql_v3_integer_ord.json} (89%)
 rename crates/eql-bindings/schema/v3/integer_ord_ope.json => packages/eql/src/generated/schema/v3/eql_v3_integer_ord_ope.json (88%)
 create mode 100644 packages/eql/src/generated/schema/v3/eql_v3_integer_ord_ore.json
 rename crates/eql-bindings/schema/v3/json.json => packages/eql/src/generated/schema/v3/eql_v3_json.json (82%)
 rename packages/eql/src/generated/schema/v3/{jsonb_entry.json => eql_v3_jsonb_entry.json} (80%)
 rename packages/eql/src/generated/schema/v3/{numeric.json => eql_v3_numeric.json} (86%)
 rename packages/eql/src/generated/schema/v3/{numeric_eq.json => eql_v3_numeric_eq.json} (88%)
 rename packages/eql/src/generated/schema/v3/{numeric_ord.json => eql_v3_numeric_ord.json} (89%)
 rename packages/eql/src/generated/schema/v3/{numeric_ord_ope.json => eql_v3_numeric_ord_ope.json} (88%)
 create mode 100644 packages/eql/src/generated/schema/v3/eql_v3_numeric_ord_ore.json
 rename packages/eql/src/generated/schema/v3/{real.json => eql_v3_real.json} (87%)
 rename packages/eql/src/generated/schema/v3/{real_eq.json => eql_v3_real_eq.json} (88%)
 rename packages/eql/src/generated/schema/v3/{numeric_ord_ore.json => eql_v3_real_ord.json} (92%)
 rename packages/eql/src/generated/schema/v3/{real_ord_ope.json => eql_v3_real_ord_ope.json} (89%)
 rename packages/eql/src/generated/schema/v3/{real_ord_ore.json => eql_v3_real_ord_ore.json} (89%)
 rename packages/eql/src/generated/schema/v3/{smallint.json => eql_v3_smallint.json} (86%)
 rename packages/eql/src/generated/schema/v3/{smallint_eq.json => eql_v3_smallint_eq.json} (88%)
 rename packages/eql/src/generated/schema/v3/{smallint_ord.json => eql_v3_smallint_ord.json} (89%)
 rename packages/eql/src/generated/schema/v3/{smallint_ord_ope.json => eql_v3_smallint_ord_ope.json} (88%)
 rename packages/eql/src/generated/schema/v3/{smallint_ord_ore.json => eql_v3_smallint_ord_ore.json} (88%)
 rename packages/eql/src/generated/schema/v3/{text.json => eql_v3_text.json} (87%)
 rename packages/eql/src/generated/schema/v3/{text_eq.json => eql_v3_text_eq.json} (88%)
 rename crates/eql-bindings/schema/v3/text_match.json => packages/eql/src/generated/schema/v3/eql_v3_text_match.json (89%)
 rename crates/eql-bindings/schema/v3/text_ord.json => packages/eql/src/generated/schema/v3/eql_v3_text_ord.json (90%)
 rename packages/eql/src/generated/schema/v3/{text_ord_ope.json => eql_v3_text_ord_ope.json} (90%)
 rename packages/eql/src/generated/schema/v3/{text_ord_ore.json => eql_v3_text_ord_ore.json} (90%)
 rename crates/eql-bindings/schema/v3/text_search.json => packages/eql/src/generated/schema/v3/eql_v3_text_search.json (91%)
 rename packages/eql/src/generated/schema/v3/{timestamp.json => eql_v3_timestamp.json} (86%)
 rename packages/eql/src/generated/schema/v3/{timestamp_eq.json => eql_v3_timestamp_eq.json} (88%)
 rename packages/eql/src/generated/schema/v3/{timestamp_ord.json => eql_v3_timestamp_ord.json} (89%)
 rename packages/eql/src/generated/schema/v3/{timestamp_ord_ope.json => eql_v3_timestamp_ord_ope.json} (88%)
 create mode 100644 packages/eql/src/generated/schema/v3/eql_v3_timestamp_ord_ore.json
 delete mode 100644 packages/eql/src/generated/schema/v3/real_ord.json

diff --git a/.changeset/prefix-public-types-eql-v3.md b/.changeset/prefix-public-types-eql-v3.md
new file mode 100644
index 000000000..d1cbd7ac9
--- /dev/null
+++ b/.changeset/prefix-public-types-eql-v3.md
@@ -0,0 +1,5 @@
+---
+'@cipherstash/eql': major
+---
+
+**Every public-schema EQL type name now carries an `eql_v3_` prefix** (CIP-3472): the encrypted-domain column types are now `public.eql_v3_integer`, `public.eql_v3_text_eq`, `public.eql_v3_json`, `public.eql_v3_jsonb_entry`, and so on — declare columns as `age public.eql_v3_integer_ord` instead of `age public.integer_ord`. EQL domains no longer shadow PostgreSQL built-in type names (`integer`, `text`, `json`), so unqualified references can never resolve to the wrong type through `search_path`, and each EQL version now owns a distinct column-type namespace, which lets multiple EQL versions coexist in one database during future version migrations. Query-operand domains are unchanged (`eql_v3.query_integer_eq`, `eql_v3.query_jsonb`) — the `eql_v3` schema already versions them. The bindings follow the SQL: `DomainType::sql_domain`/`domain()` report the prefixed names, `DomainPayload::parse` / `TargetDomain::parse` accept `"eql_v3_integer_eq"`-style names (bare names are no longer recognised), and the published JSON Schema `$id`s and file names now use the prefixed names (`…/eql/v3/eql_v3_integer_eq.json`).
diff --git a/crates/eql-bindings/bindings/v3/Bigint.ts b/crates/eql-bindings/bindings/v3/Bigint.ts
index 809944c6b..24ec75b14 100644
--- a/crates/eql-bindings/bindings/v3/Bigint.ts
+++ b/crates/eql-bindings/bindings/v3/Bigint.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.bigint` — storage-only domain.
+ * `public.eql_v3_bigint` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintEq.ts b/crates/eql-bindings/bindings/v3/BigintEq.ts
index 28ed32e72..84d0ddacc 100644
--- a/crates/eql-bindings/bindings/v3/BigintEq.ts
+++ b/crates/eql-bindings/bindings/v3/BigintEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.bigint_eq` — equality domain.
+ * `public.eql_v3_bigint_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintOrd.ts b/crates/eql-bindings/bindings/v3/BigintOrd.ts
index 945c36831..e599e71cd 100644
--- a/crates/eql-bindings/bindings/v3/BigintOrd.ts
+++ b/crates/eql-bindings/bindings/v3/BigintOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.bigint_ord` — ordering domain.
+ * `public.eql_v3_bigint_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts b/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts
index 9ca0bc5d8..2e84b90fc 100644
--- a/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/BigintOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.bigint_ord_ope` — ordering domain.
+ * `public.eql_v3_bigint_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/BigintOrdOre.ts b/crates/eql-bindings/bindings/v3/BigintOrdOre.ts
index c40be04bf..247ff5201 100644
--- a/crates/eql-bindings/bindings/v3/BigintOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/BigintOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.bigint_ord_ore` — ordering domain.
+ * `public.eql_v3_bigint_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Boolean.ts b/crates/eql-bindings/bindings/v3/Boolean.ts
index 96fc814fa..a79845f75 100644
--- a/crates/eql-bindings/bindings/v3/Boolean.ts
+++ b/crates/eql-bindings/bindings/v3/Boolean.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.boolean` — storage-only domain.
+ * `public.eql_v3_boolean` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Date.ts b/crates/eql-bindings/bindings/v3/Date.ts
index 1926b4d4c..d256c0f67 100644
--- a/crates/eql-bindings/bindings/v3/Date.ts
+++ b/crates/eql-bindings/bindings/v3/Date.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.date` — storage-only domain.
+ * `public.eql_v3_date` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateEq.ts b/crates/eql-bindings/bindings/v3/DateEq.ts
index fb6e600b9..eb53bcb1c 100644
--- a/crates/eql-bindings/bindings/v3/DateEq.ts
+++ b/crates/eql-bindings/bindings/v3/DateEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.date_eq` — equality domain.
+ * `public.eql_v3_date_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateOrd.ts b/crates/eql-bindings/bindings/v3/DateOrd.ts
index 326fc3c9a..fe624a5cc 100644
--- a/crates/eql-bindings/bindings/v3/DateOrd.ts
+++ b/crates/eql-bindings/bindings/v3/DateOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.date_ord` — ordering domain.
+ * `public.eql_v3_date_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateOrdOpe.ts b/crates/eql-bindings/bindings/v3/DateOrdOpe.ts
index f3a43723e..546c12a8a 100644
--- a/crates/eql-bindings/bindings/v3/DateOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/DateOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.date_ord_ope` — ordering domain.
+ * `public.eql_v3_date_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DateOrdOre.ts b/crates/eql-bindings/bindings/v3/DateOrdOre.ts
index f6e28e4e4..6010aef5c 100644
--- a/crates/eql-bindings/bindings/v3/DateOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/DateOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.date_ord_ore` — ordering domain.
+ * `public.eql_v3_date_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Double.ts b/crates/eql-bindings/bindings/v3/Double.ts
index cd0d5c806..3174e5c2d 100644
--- a/crates/eql-bindings/bindings/v3/Double.ts
+++ b/crates/eql-bindings/bindings/v3/Double.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.double` — storage-only domain.
+ * `public.eql_v3_double` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleEq.ts b/crates/eql-bindings/bindings/v3/DoubleEq.ts
index e4218fae8..531e2fe23 100644
--- a/crates/eql-bindings/bindings/v3/DoubleEq.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.double_eq` — equality domain.
+ * `public.eql_v3_double_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleOrd.ts b/crates/eql-bindings/bindings/v3/DoubleOrd.ts
index be98e9f3c..f9058a363 100644
--- a/crates/eql-bindings/bindings/v3/DoubleOrd.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.double_ord` — ordering domain.
+ * `public.eql_v3_double_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts
index 85c3a1bd1..af12d2381 100644
--- a/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.double_ord_ope` — ordering domain.
+ * `public.eql_v3_double_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts b/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts
index 10a64ad15..821033ee8 100644
--- a/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/DoubleOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.double_ord_ore` — ordering domain.
+ * `public.eql_v3_double_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Integer.ts b/crates/eql-bindings/bindings/v3/Integer.ts
index d7fe5263a..4d8f47a2e 100644
--- a/crates/eql-bindings/bindings/v3/Integer.ts
+++ b/crates/eql-bindings/bindings/v3/Integer.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.integer` — storage-only domain.
+ * `public.eql_v3_integer` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerEq.ts b/crates/eql-bindings/bindings/v3/IntegerEq.ts
index 51079950e..b6c8b95c0 100644
--- a/crates/eql-bindings/bindings/v3/IntegerEq.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.integer_eq` — equality domain.
+ * `public.eql_v3_integer_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerOrd.ts b/crates/eql-bindings/bindings/v3/IntegerOrd.ts
index e7b016e49..ffcad6088 100644
--- a/crates/eql-bindings/bindings/v3/IntegerOrd.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.integer_ord` — ordering domain.
+ * `public.eql_v3_integer_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts
index 19c948db9..f0f3b5dec 100644
--- a/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.integer_ord_ope` — ordering domain.
+ * `public.eql_v3_integer_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts b/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts
index eddb18e22..fa55866a8 100644
--- a/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/IntegerOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.integer_ord_ore` — ordering domain.
+ * `public.eql_v3_integer_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Numeric.ts b/crates/eql-bindings/bindings/v3/Numeric.ts
index 5d231394b..598545745 100644
--- a/crates/eql-bindings/bindings/v3/Numeric.ts
+++ b/crates/eql-bindings/bindings/v3/Numeric.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.numeric` — storage-only domain.
+ * `public.eql_v3_numeric` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericEq.ts b/crates/eql-bindings/bindings/v3/NumericEq.ts
index 784641e71..beae0ca00 100644
--- a/crates/eql-bindings/bindings/v3/NumericEq.ts
+++ b/crates/eql-bindings/bindings/v3/NumericEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.numeric_eq` — equality domain.
+ * `public.eql_v3_numeric_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericOrd.ts b/crates/eql-bindings/bindings/v3/NumericOrd.ts
index b99627eaf..ccecec1cd 100644
--- a/crates/eql-bindings/bindings/v3/NumericOrd.ts
+++ b/crates/eql-bindings/bindings/v3/NumericOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.numeric_ord` — ordering domain.
+ * `public.eql_v3_numeric_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts b/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts
index 4e470ed80..691514270 100644
--- a/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/NumericOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.numeric_ord_ope` — ordering domain.
+ * `public.eql_v3_numeric_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/NumericOrdOre.ts b/crates/eql-bindings/bindings/v3/NumericOrdOre.ts
index a3362d632..e6579faf9 100644
--- a/crates/eql-bindings/bindings/v3/NumericOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/NumericOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.numeric_ord_ore` — ordering domain.
+ * `public.eql_v3_numeric_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Real.ts b/crates/eql-bindings/bindings/v3/Real.ts
index e7e4af203..1ac940c15 100644
--- a/crates/eql-bindings/bindings/v3/Real.ts
+++ b/crates/eql-bindings/bindings/v3/Real.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.real` — storage-only domain.
+ * `public.eql_v3_real` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealEq.ts b/crates/eql-bindings/bindings/v3/RealEq.ts
index 2b565ff73..069c250a4 100644
--- a/crates/eql-bindings/bindings/v3/RealEq.ts
+++ b/crates/eql-bindings/bindings/v3/RealEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.real_eq` — equality domain.
+ * `public.eql_v3_real_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealOrd.ts b/crates/eql-bindings/bindings/v3/RealOrd.ts
index eecebcb3f..9712b1a85 100644
--- a/crates/eql-bindings/bindings/v3/RealOrd.ts
+++ b/crates/eql-bindings/bindings/v3/RealOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.real_ord` — ordering domain.
+ * `public.eql_v3_real_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealOrdOpe.ts b/crates/eql-bindings/bindings/v3/RealOrdOpe.ts
index c60d0ceb3..03156da21 100644
--- a/crates/eql-bindings/bindings/v3/RealOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/RealOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.real_ord_ope` — ordering domain.
+ * `public.eql_v3_real_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/RealOrdOre.ts b/crates/eql-bindings/bindings/v3/RealOrdOre.ts
index 58b42ddae..d998be4fd 100644
--- a/crates/eql-bindings/bindings/v3/RealOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/RealOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.real_ord_ore` — ordering domain.
+ * `public.eql_v3_real_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Smallint.ts b/crates/eql-bindings/bindings/v3/Smallint.ts
index 0450a7e32..ca91c87da 100644
--- a/crates/eql-bindings/bindings/v3/Smallint.ts
+++ b/crates/eql-bindings/bindings/v3/Smallint.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.smallint` — storage-only domain.
+ * `public.eql_v3_smallint` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintEq.ts b/crates/eql-bindings/bindings/v3/SmallintEq.ts
index f4ddfb50a..d46547c73 100644
--- a/crates/eql-bindings/bindings/v3/SmallintEq.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.smallint_eq` — equality domain.
+ * `public.eql_v3_smallint_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintOrd.ts b/crates/eql-bindings/bindings/v3/SmallintOrd.ts
index caf148562..684f2cacb 100644
--- a/crates/eql-bindings/bindings/v3/SmallintOrd.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.smallint_ord` — ordering domain.
+ * `public.eql_v3_smallint_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts
index 81da5a430..14eeafd82 100644
--- a/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.smallint_ord_ope` — ordering domain.
+ * `public.eql_v3_smallint_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts b/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts
index acee4059a..a0724ec7d 100644
--- a/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/SmallintOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.smallint_ord_ore` — ordering domain.
+ * `public.eql_v3_smallint_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/SteVecDocument.ts b/crates/eql-bindings/bindings/v3/SteVecDocument.ts
index 75e5f820c..59b432b26 100644
--- a/crates/eql-bindings/bindings/v3/SteVecDocument.ts
+++ b/crates/eql-bindings/bindings/v3/SteVecDocument.ts
@@ -5,7 +5,7 @@ import type { SteVecEntry } from "./SteVecEntry";
 import type { SteVecForm } from "./SteVecForm";
 
 /**
- * `public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
+ * `public.eql_v3_json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
  * no root ciphertext). Strict. `k` is the `"sv"` form discriminator (see
  * [`SteVecForm`]) — carried on the real wire, so the strict struct models it.
  */
diff --git a/crates/eql-bindings/bindings/v3/SteVecEntry.ts b/crates/eql-bindings/bindings/v3/SteVecEntry.ts
index 848849f69..968a7f770 100644
--- a/crates/eql-bindings/bindings/v3/SteVecEntry.ts
+++ b/crates/eql-bindings/bindings/v3/SteVecEntry.ts
@@ -5,7 +5,7 @@ import type { OreCllw } from "./OreCllw";
 import type { Selector } from "./Selector";
 
 /**
- * `public.jsonb_entry` — one sv element (returned by `->`). Carries a selector
+ * `public.eql_v3_jsonb_entry` — one sv element (returned by `->`). Carries a selector
  * `s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of
  * `hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the
  * root `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.
diff --git a/crates/eql-bindings/bindings/v3/Text.ts b/crates/eql-bindings/bindings/v3/Text.ts
index 65309716c..059f10cee 100644
--- a/crates/eql-bindings/bindings/v3/Text.ts
+++ b/crates/eql-bindings/bindings/v3/Text.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.text` — storage-only domain.
+ * `public.eql_v3_text` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextEq.ts b/crates/eql-bindings/bindings/v3/TextEq.ts
index c0f7744e0..984b6cebe 100644
--- a/crates/eql-bindings/bindings/v3/TextEq.ts
+++ b/crates/eql-bindings/bindings/v3/TextEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.text_eq` — equality domain.
+ * `public.eql_v3_text_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextMatch.ts b/crates/eql-bindings/bindings/v3/TextMatch.ts
index 39c401bb1..eef14fe15 100644
--- a/crates/eql-bindings/bindings/v3/TextMatch.ts
+++ b/crates/eql-bindings/bindings/v3/TextMatch.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.text_match` — match domain.
+ * `public.eql_v3_text_match` — match domain.
  *
  * Operators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextOrd.ts b/crates/eql-bindings/bindings/v3/TextOrd.ts
index bff3ab55c..81fae142c 100644
--- a/crates/eql-bindings/bindings/v3/TextOrd.ts
+++ b/crates/eql-bindings/bindings/v3/TextOrd.ts
@@ -6,7 +6,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.text_ord` — ordering domain.
+ * `public.eql_v3_text_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextOrdOpe.ts b/crates/eql-bindings/bindings/v3/TextOrdOpe.ts
index e681f9f86..69ac3c276 100644
--- a/crates/eql-bindings/bindings/v3/TextOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/TextOrdOpe.ts
@@ -6,7 +6,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.text_ord_ope` — ordering domain.
+ * `public.eql_v3_text_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextOrdOre.ts b/crates/eql-bindings/bindings/v3/TextOrdOre.ts
index ce5e29d0a..243dcd290 100644
--- a/crates/eql-bindings/bindings/v3/TextOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/TextOrdOre.ts
@@ -6,7 +6,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.text_ord_ore` — ordering domain.
+ * `public.eql_v3_text_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TextSearch.ts b/crates/eql-bindings/bindings/v3/TextSearch.ts
index d9ce8c69c..3caa523c2 100644
--- a/crates/eql-bindings/bindings/v3/TextSearch.ts
+++ b/crates/eql-bindings/bindings/v3/TextSearch.ts
@@ -7,7 +7,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.text_search` — search domain.
+ * `public.eql_v3_text_search` — search domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.
  */
diff --git a/crates/eql-bindings/bindings/v3/Timestamp.ts b/crates/eql-bindings/bindings/v3/Timestamp.ts
index 87a4b9e7b..cf43a3bf7 100644
--- a/crates/eql-bindings/bindings/v3/Timestamp.ts
+++ b/crates/eql-bindings/bindings/v3/Timestamp.ts
@@ -4,7 +4,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.timestamp` — storage-only domain.
+ * `public.eql_v3_timestamp` — storage-only domain.
  *
  * Operators: none. Required keys: `v` `i` `c`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampEq.ts b/crates/eql-bindings/bindings/v3/TimestampEq.ts
index 63feac8d8..a150ac619 100644
--- a/crates/eql-bindings/bindings/v3/TimestampEq.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampEq.ts
@@ -5,7 +5,7 @@ import type { Identifier } from "./Identifier";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.timestamp_eq` — equality domain.
+ * `public.eql_v3_timestamp_eq` — equality domain.
  *
  * Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampOrd.ts b/crates/eql-bindings/bindings/v3/TimestampOrd.ts
index f22750626..28ddf2957 100644
--- a/crates/eql-bindings/bindings/v3/TimestampOrd.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampOrd.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.timestamp_ord` — ordering domain.
+ * `public.eql_v3_timestamp_ord` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts
index 1beaa8030..bed5b35c0 100644
--- a/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampOrdOpe.ts
@@ -5,7 +5,7 @@ import type { OpeCllw } from "./OpeCllw";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.timestamp_ord_ope` — ordering domain.
+ * `public.eql_v3_timestamp_ord_ope` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
  */
diff --git a/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts b/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts
index dc27811f1..2255a38b3 100644
--- a/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts
+++ b/crates/eql-bindings/bindings/v3/TimestampOrdOre.ts
@@ -5,7 +5,7 @@ import type { OreBlock256 } from "./OreBlock256";
 import type { SchemaVersion } from "./SchemaVersion";
 
 /**
- * `public.timestamp_ord_ore` — ordering domain.
+ * `public.eql_v3_timestamp_ord_ore` — ordering domain.
  *
  * Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
  */
diff --git a/crates/eql-bindings/schema/v3/date_ord.json b/crates/eql-bindings/schema/v3/date_ord.json
deleted file mode 100644
index 8c3a540fb..000000000
--- a/crates/eql-bindings/schema/v3/date_ord.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "$defs": {
-    "Ciphertext": {
-      "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.",
-      "type": "string"
-    },
-    "Identifier": {
-      "additionalProperties": false,
-      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
-      "properties": {
-        "c": {
-          "description": "Column name.",
-          "type": "string"
-        },
-        "t": {
-          "description": "Table name.",
-          "type": "string"
-        }
-      },
-      "required": [
-        "t",
-        "c"
-      ],
-      "type": "object"
-    },
-    "OreBlock256": {
-      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
-      "items": {
-        "type": "string"
-      },
-      "type": "array"
-    },
-    "SchemaVersion": {
-      "const": 3,
-      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
-      "type": "integer"
-    }
-  },
-  "$id": "https://schemas.cipherstash.com/eql/v3/date_ord.json",
-  "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "additionalProperties": false,
-  "description": "`public.date_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
-  "properties": {
-    "c": {
-      "$ref": "#/$defs/Ciphertext"
-    },
-    "i": {
-      "$ref": "#/$defs/Identifier"
-    },
-    "ob": {
-      "$ref": "#/$defs/OreBlock256"
-    },
-    "v": {
-      "$ref": "#/$defs/SchemaVersion"
-    }
-  },
-  "required": [
-    "v",
-    "i",
-    "c",
-    "ob"
-  ],
-  "title": "DateOrd",
-  "type": "object"
-}
\ No newline at end of file
diff --git a/crates/eql-bindings/schema/v3/bigint.json b/crates/eql-bindings/schema/v3/eql_v3_bigint.json
similarity index 86%
rename from crates/eql-bindings/schema/v3/bigint.json
rename to crates/eql-bindings/schema/v3/eql_v3_bigint.json
index e6cb310f4..dcf39ca1d 100644
--- a/crates/eql-bindings/schema/v3/bigint.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_bigint.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/bigint.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_bigint.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.bigint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_bigint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/bigint_eq.json b/crates/eql-bindings/schema/v3/eql_v3_bigint_eq.json
similarity index 88%
rename from packages/eql/src/generated/schema/v3/bigint_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_bigint_eq.json
index 9309eef16..376e97e59 100644
--- a/packages/eql/src/generated/schema/v3/bigint_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_bigint_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/bigint_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_bigint_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.bigint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_bigint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_bigint_ord.json
similarity index 91%
rename from crates/eql-bindings/schema/v3/timestamp_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_bigint_ord.json
index 0eb48eb74..a6d55585c 100644
--- a/crates/eql-bindings/schema/v3/timestamp_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_bigint_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_bigint_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.timestamp_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_bigint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
@@ -60,6 +60,6 @@
     "c",
     "ob"
   ],
-  "title": "TimestampOrdOre",
+  "title": "BigintOrd",
   "type": "object"
 }
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/bigint_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_bigint_ord_ope.json
similarity index 88%
rename from packages/eql/src/generated/schema/v3/bigint_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_bigint_ord_ope.json
index cd7bdd447..ded1a52be 100644
--- a/packages/eql/src/generated/schema/v3/bigint_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_bigint_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_bigint_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.bigint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_bigint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/bigint_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_bigint_ord_ore.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/bigint_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_bigint_ord_ore.json
index f2a94eb39..2879adeb6 100644
--- a/crates/eql-bindings/schema/v3/bigint_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_bigint_ord_ore.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_bigint_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.bigint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_bigint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/boolean.json b/crates/eql-bindings/schema/v3/eql_v3_boolean.json
similarity index 86%
rename from packages/eql/src/generated/schema/v3/boolean.json
rename to crates/eql-bindings/schema/v3/eql_v3_boolean.json
index 958b89de6..feee8688d 100644
--- a/packages/eql/src/generated/schema/v3/boolean.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_boolean.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/boolean.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_boolean.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.boolean` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_boolean` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/date.json b/crates/eql-bindings/schema/v3/eql_v3_date.json
similarity index 87%
rename from packages/eql/src/generated/schema/v3/date.json
rename to crates/eql-bindings/schema/v3/eql_v3_date.json
index fbf9a8720..7265731c5 100644
--- a/packages/eql/src/generated/schema/v3/date.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_date.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/date.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_date.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.date` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_date` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/date_eq.json b/crates/eql-bindings/schema/v3/eql_v3_date_eq.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/date_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_date_eq.json
index fc0f52262..87c588b18 100644
--- a/crates/eql-bindings/schema/v3/date_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_date_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/date_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_date_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.date_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_date_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_date_ord.json
similarity index 92%
rename from crates/eql-bindings/schema/v3/integer_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_date_ord.json
index 3521f1087..82aac0089 100644
--- a/crates/eql-bindings/schema/v3/integer_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_date_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_date_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.integer_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_date_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
@@ -60,6 +60,6 @@
     "c",
     "ob"
   ],
-  "title": "IntegerOrdOre",
+  "title": "DateOrd",
   "type": "object"
 }
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/date_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_date_ord_ope.json
similarity index 89%
rename from packages/eql/src/generated/schema/v3/date_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_date_ord_ope.json
index 105c5ff87..3b2265c6f 100644
--- a/packages/eql/src/generated/schema/v3/date_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_date_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_date_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.date_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_date_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/date_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_date_ord_ore.json
similarity index 89%
rename from packages/eql/src/generated/schema/v3/date_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_date_ord_ore.json
index ea862d5af..1199dca6d 100644
--- a/packages/eql/src/generated/schema/v3/date_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_date_ord_ore.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/date_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_date_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.date_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_date_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/double.json b/crates/eql-bindings/schema/v3/eql_v3_double.json
similarity index 86%
rename from packages/eql/src/generated/schema/v3/double.json
rename to crates/eql-bindings/schema/v3/eql_v3_double.json
index cef5d433f..2b2dc709f 100644
--- a/packages/eql/src/generated/schema/v3/double.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_double.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/double.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_double.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.double` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_double` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/double_eq.json b/crates/eql-bindings/schema/v3/eql_v3_double_eq.json
similarity index 88%
rename from packages/eql/src/generated/schema/v3/double_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_double_eq.json
index 67ceb5ce2..fea7dbc50 100644
--- a/packages/eql/src/generated/schema/v3/double_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_double_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/double_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_double_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.double_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_double_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/timestamp_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_double_ord.json
similarity index 91%
rename from packages/eql/src/generated/schema/v3/timestamp_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_double_ord.json
index 0eb48eb74..5cab990eb 100644
--- a/packages/eql/src/generated/schema/v3/timestamp_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_double_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_double_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.timestamp_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_double_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
@@ -60,6 +60,6 @@
     "c",
     "ob"
   ],
-  "title": "TimestampOrdOre",
+  "title": "DoubleOrd",
   "type": "object"
 }
\ No newline at end of file
diff --git a/crates/eql-bindings/schema/v3/double_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_double_ord_ope.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/double_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_double_ord_ope.json
index e7ae20677..93e06af78 100644
--- a/crates/eql-bindings/schema/v3/double_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_double_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_double_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.double_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_double_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/double_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_double_ord_ore.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/double_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_double_ord_ore.json
index 0fcbdeb6b..1882c31dd 100644
--- a/crates/eql-bindings/schema/v3/double_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_double_ord_ore.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/double_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_double_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.double_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_double_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer.json b/crates/eql-bindings/schema/v3/eql_v3_integer.json
similarity index 86%
rename from crates/eql-bindings/schema/v3/integer.json
rename to crates/eql-bindings/schema/v3/eql_v3_integer.json
index d0ebfe286..92d36fa97 100644
--- a/crates/eql-bindings/schema/v3/integer.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_integer.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/integer.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_integer.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.integer` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_integer` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/integer_eq.json b/crates/eql-bindings/schema/v3/eql_v3_integer_eq.json
similarity index 88%
rename from packages/eql/src/generated/schema/v3/integer_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_integer_eq.json
index 75bc84dfa..7a07dc8dc 100644
--- a/packages/eql/src/generated/schema/v3/integer_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_integer_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/integer_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_integer_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.integer_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_integer_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/integer_ord.json b/crates/eql-bindings/schema/v3/eql_v3_integer_ord.json
similarity index 89%
rename from crates/eql-bindings/schema/v3/integer_ord.json
rename to crates/eql-bindings/schema/v3/eql_v3_integer_ord.json
index 08dcd2109..ad4fb9530 100644
--- a/crates/eql-bindings/schema/v3/integer_ord.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_integer_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_integer_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.integer_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_integer_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/integer_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_integer_ord_ope.json
similarity index 88%
rename from packages/eql/src/generated/schema/v3/integer_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_integer_ord_ope.json
index 7b8b504ac..bf4b2a57c 100644
--- a/packages/eql/src/generated/schema/v3/integer_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_integer_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/integer_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_integer_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.integer_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_integer_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/bigint_ord.json b/crates/eql-bindings/schema/v3/eql_v3_integer_ord_ore.json
similarity index 87%
rename from crates/eql-bindings/schema/v3/bigint_ord.json
rename to crates/eql-bindings/schema/v3/eql_v3_integer_ord_ore.json
index 7cce23859..22b433573 100644
--- a/crates/eql-bindings/schema/v3/bigint_ord.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_integer_ord_ore.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/bigint_ord.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_integer_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.bigint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_integer_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
@@ -60,6 +60,6 @@
     "c",
     "ob"
   ],
-  "title": "BigintOrd",
+  "title": "IntegerOrdOre",
   "type": "object"
 }
\ No newline at end of file
diff --git a/packages/eql/src/generated/schema/v3/json.json b/crates/eql-bindings/schema/v3/eql_v3_json.json
similarity index 82%
rename from packages/eql/src/generated/schema/v3/json.json
rename to crates/eql-bindings/schema/v3/eql_v3_json.json
index 546a80c0e..eeb82ae59 100644
--- a/packages/eql/src/generated/schema/v3/json.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_json.json
@@ -65,7 +65,7 @@
           "type": "object"
         }
       ],
-      "description": "`public.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
+      "description": "`public.eql_v3_jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
       "properties": {
         "a": {
           "type": [
@@ -92,10 +92,10 @@
       "type": "string"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/json.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_json.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,\nno root ciphertext). Strict. `k` is the `\"sv\"` form discriminator (see\n[`SteVecForm`]) — carried on the real wire, so the strict struct models it.",
+  "description": "`public.eql_v3_json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,\nno root ciphertext). Strict. `k` is the `\"sv\"` form discriminator (see\n[`SteVecForm`]) — carried on the real wire, so the strict struct models it.",
   "properties": {
     "i": {
       "$ref": "#/$defs/Identifier"
diff --git a/crates/eql-bindings/schema/v3/jsonb_entry.json b/crates/eql-bindings/schema/v3/eql_v3_jsonb_entry.json
similarity index 80%
rename from crates/eql-bindings/schema/v3/jsonb_entry.json
rename to crates/eql-bindings/schema/v3/eql_v3_jsonb_entry.json
index c38667838..18deb9e33 100644
--- a/crates/eql-bindings/schema/v3/jsonb_entry.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_jsonb_entry.json
@@ -17,7 +17,7 @@
       "type": "string"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/jsonb_entry.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_jsonb_entry.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "anyOf": [
     {
@@ -43,7 +43,7 @@
       "type": "object"
     }
   ],
-  "description": "`public.jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
+  "description": "`public.eql_v3_jsonb_entry` — one sv element (returned by `->`). Carries a selector\n`s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of\n`hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the\nroot `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.",
   "properties": {
     "a": {
       "type": [
diff --git a/crates/eql-bindings/schema/v3/numeric.json b/crates/eql-bindings/schema/v3/eql_v3_numeric.json
similarity index 86%
rename from crates/eql-bindings/schema/v3/numeric.json
rename to crates/eql-bindings/schema/v3/eql_v3_numeric.json
index c8deb4041..8d2d08a06 100644
--- a/crates/eql-bindings/schema/v3/numeric.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_numeric.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/numeric.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_numeric.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.numeric` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_numeric` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_eq.json b/crates/eql-bindings/schema/v3/eql_v3_numeric_eq.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/numeric_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_numeric_eq.json
index 20ce2e84f..741c95904 100644
--- a/crates/eql-bindings/schema/v3/numeric_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_numeric_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/numeric_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_numeric_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.numeric_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_numeric_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_ord.json b/crates/eql-bindings/schema/v3/eql_v3_numeric_ord.json
similarity index 89%
rename from crates/eql-bindings/schema/v3/numeric_ord.json
rename to crates/eql-bindings/schema/v3/eql_v3_numeric_ord.json
index a93457e21..a5b527b2b 100644
--- a/crates/eql-bindings/schema/v3/numeric_ord.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_numeric_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_numeric_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.numeric_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_numeric_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_numeric_ord_ope.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/numeric_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_numeric_ord_ope.json
index 198724c8c..ef1895e83 100644
--- a/crates/eql-bindings/schema/v3/numeric_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_numeric_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_numeric_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.numeric_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_numeric_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/eql_v3_numeric_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_numeric_ord_ore.json
new file mode 100644
index 000000000..98bd994db
--- /dev/null
+++ b/crates/eql-bindings/schema/v3/eql_v3_numeric_ord_ore.json
@@ -0,0 +1,65 @@
+{
+  "$defs": {
+    "Ciphertext": {
+      "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_numeric_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`public.eql_v3_numeric_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "properties": {
+    "c": {
+      "$ref": "#/$defs/Ciphertext"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "c",
+    "ob"
+  ],
+  "title": "NumericOrdOre",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/crates/eql-bindings/schema/v3/real.json b/crates/eql-bindings/schema/v3/eql_v3_real.json
similarity index 87%
rename from crates/eql-bindings/schema/v3/real.json
rename to crates/eql-bindings/schema/v3/eql_v3_real.json
index e62f8db5a..52da42ac2 100644
--- a/crates/eql-bindings/schema/v3/real.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_real.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/real.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_real.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.real` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_real` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/real_eq.json b/crates/eql-bindings/schema/v3/eql_v3_real_eq.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/real_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_real_eq.json
index c5714a700..ce0f03141 100644
--- a/crates/eql-bindings/schema/v3/real_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_real_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/real_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_real_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.real_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_real_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/numeric_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_real_ord.json
similarity index 92%
rename from crates/eql-bindings/schema/v3/numeric_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_real_ord.json
index 48ffe1a3e..efb570ef6 100644
--- a/crates/eql-bindings/schema/v3/numeric_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_real_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/numeric_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_real_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.numeric_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_real_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
@@ -60,6 +60,6 @@
     "c",
     "ob"
   ],
-  "title": "NumericOrdOre",
+  "title": "RealOrd",
   "type": "object"
 }
\ No newline at end of file
diff --git a/crates/eql-bindings/schema/v3/real_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_real_ord_ope.json
similarity index 89%
rename from crates/eql-bindings/schema/v3/real_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_real_ord_ope.json
index 88b9f05d2..3bb7776bb 100644
--- a/crates/eql-bindings/schema/v3/real_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_real_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_real_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.real_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_real_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/real_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_real_ord_ore.json
similarity index 89%
rename from crates/eql-bindings/schema/v3/real_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_real_ord_ore.json
index dadf63852..0ce74292f 100644
--- a/crates/eql-bindings/schema/v3/real_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_real_ord_ore.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/real_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_real_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.real_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_real_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint.json b/crates/eql-bindings/schema/v3/eql_v3_smallint.json
similarity index 86%
rename from crates/eql-bindings/schema/v3/smallint.json
rename to crates/eql-bindings/schema/v3/eql_v3_smallint.json
index 5270797b9..f04378a6f 100644
--- a/crates/eql-bindings/schema/v3/smallint.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_smallint.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/smallint.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_smallint.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.smallint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_smallint` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_eq.json b/crates/eql-bindings/schema/v3/eql_v3_smallint_eq.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/smallint_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_smallint_eq.json
index 9427016f7..a793597d4 100644
--- a/crates/eql-bindings/schema/v3/smallint_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_smallint_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/smallint_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_smallint_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.smallint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_smallint_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_ord.json b/crates/eql-bindings/schema/v3/eql_v3_smallint_ord.json
similarity index 89%
rename from crates/eql-bindings/schema/v3/smallint_ord.json
rename to crates/eql-bindings/schema/v3/eql_v3_smallint_ord.json
index 32dfac9e4..35d0c9fa2 100644
--- a/crates/eql-bindings/schema/v3/smallint_ord.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_smallint_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_smallint_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.smallint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_smallint_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_smallint_ord_ope.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/smallint_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_smallint_ord_ope.json
index 52a582166..0ed3d0722 100644
--- a/crates/eql-bindings/schema/v3/smallint_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_smallint_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_smallint_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.smallint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_smallint_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/smallint_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_smallint_ord_ore.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/smallint_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_smallint_ord_ore.json
index 92e8b1929..675d00059 100644
--- a/crates/eql-bindings/schema/v3/smallint_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_smallint_ord_ore.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/smallint_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_smallint_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.smallint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_smallint_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text.json b/crates/eql-bindings/schema/v3/eql_v3_text.json
similarity index 87%
rename from crates/eql-bindings/schema/v3/text.json
rename to crates/eql-bindings/schema/v3/eql_v3_text.json
index 35cf29063..60a7fdafd 100644
--- a/crates/eql-bindings/schema/v3/text.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_text.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/text.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_text.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.text` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_text` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_eq.json b/crates/eql-bindings/schema/v3/eql_v3_text_eq.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/text_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_text_eq.json
index cc7949f57..b7d94f830 100644
--- a/crates/eql-bindings/schema/v3/text_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_text_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/text_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_text_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.text_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_text_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/text_match.json b/crates/eql-bindings/schema/v3/eql_v3_text_match.json
similarity index 89%
rename from packages/eql/src/generated/schema/v3/text_match.json
rename to crates/eql-bindings/schema/v3/eql_v3_text_match.json
index 157c83950..e3b30c709 100644
--- a/packages/eql/src/generated/schema/v3/text_match.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_text_match.json
@@ -39,10 +39,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/text_match.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_text_match.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.text_match` — match domain.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.",
+  "description": "`public.eql_v3_text_match` — match domain.\n\nOperators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.",
   "properties": {
     "bf": {
       "$ref": "#/$defs/BloomFilter"
diff --git a/packages/eql/src/generated/schema/v3/text_ord.json b/crates/eql-bindings/schema/v3/eql_v3_text_ord.json
similarity index 90%
rename from packages/eql/src/generated/schema/v3/text_ord.json
rename to crates/eql-bindings/schema/v3/eql_v3_text_ord.json
index 9ac1f2ae8..39543b5da 100644
--- a/packages/eql/src/generated/schema/v3/text_ord.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_text_ord.json
@@ -40,10 +40,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/text_ord.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_text_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.text_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
+  "description": "`public.eql_v3_text_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_text_ord_ope.json
similarity index 90%
rename from crates/eql-bindings/schema/v3/text_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_text_ord_ope.json
index 4b25588f0..50d6bdc36 100644
--- a/crates/eql-bindings/schema/v3/text_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_text_ord_ope.json
@@ -37,10 +37,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_text_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.text_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.",
+  "description": "`public.eql_v3_text_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/text_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_text_ord_ore.json
similarity index 90%
rename from crates/eql-bindings/schema/v3/text_ord_ore.json
rename to crates/eql-bindings/schema/v3/eql_v3_text_ord_ore.json
index 67e0afcb2..732f1612c 100644
--- a/crates/eql-bindings/schema/v3/text_ord_ore.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_text_ord_ore.json
@@ -40,10 +40,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/text_ord_ore.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_text_ord_ore.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.text_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
+  "description": "`public.eql_v3_text_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/packages/eql/src/generated/schema/v3/text_search.json b/crates/eql-bindings/schema/v3/eql_v3_text_search.json
similarity index 91%
rename from packages/eql/src/generated/schema/v3/text_search.json
rename to crates/eql-bindings/schema/v3/eql_v3_text_search.json
index 4d146221d..78b4d741b 100644
--- a/packages/eql/src/generated/schema/v3/text_search.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_text_search.json
@@ -50,10 +50,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/text_search.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_text_search.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.text_search` — search domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.",
+  "description": "`public.eql_v3_text_search` — search domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.",
   "properties": {
     "bf": {
       "$ref": "#/$defs/BloomFilter"
diff --git a/crates/eql-bindings/schema/v3/timestamp.json b/crates/eql-bindings/schema/v3/eql_v3_timestamp.json
similarity index 86%
rename from crates/eql-bindings/schema/v3/timestamp.json
rename to crates/eql-bindings/schema/v3/eql_v3_timestamp.json
index 523b588fd..16e97bd9d 100644
--- a/crates/eql-bindings/schema/v3/timestamp.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_timestamp.json
@@ -29,10 +29,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/timestamp.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_timestamp.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.timestamp` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
+  "description": "`public.eql_v3_timestamp` — storage-only domain.\n\nOperators: none. Required keys: `v` `i` `c`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_eq.json b/crates/eql-bindings/schema/v3/eql_v3_timestamp_eq.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/timestamp_eq.json
rename to crates/eql-bindings/schema/v3/eql_v3_timestamp_eq.json
index cfb61fa3c..c76a60ade 100644
--- a/crates/eql-bindings/schema/v3/timestamp_eq.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_timestamp_eq.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_eq.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_timestamp_eq.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.timestamp_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
+  "description": "`public.eql_v3_timestamp_eq` — equality domain.\n\nOperators: `=` `<>`. Required keys: `v` `i` `c` `hm`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_ord.json b/crates/eql-bindings/schema/v3/eql_v3_timestamp_ord.json
similarity index 89%
rename from crates/eql-bindings/schema/v3/timestamp_ord.json
rename to crates/eql-bindings/schema/v3/eql_v3_timestamp_ord.json
index c7bdc3688..c840264cd 100644
--- a/crates/eql-bindings/schema/v3/timestamp_ord.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_timestamp_ord.json
@@ -36,10 +36,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_timestamp_ord.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.timestamp_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "description": "`public.eql_v3_timestamp_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/timestamp_ord_ope.json b/crates/eql-bindings/schema/v3/eql_v3_timestamp_ord_ope.json
similarity index 88%
rename from crates/eql-bindings/schema/v3/timestamp_ord_ope.json
rename to crates/eql-bindings/schema/v3/eql_v3_timestamp_ord_ope.json
index f87426ef8..fc371e8f2 100644
--- a/crates/eql-bindings/schema/v3/timestamp_ord_ope.json
+++ b/crates/eql-bindings/schema/v3/eql_v3_timestamp_ord_ope.json
@@ -33,10 +33,10 @@
       "type": "integer"
     }
   },
-  "$id": "https://schemas.cipherstash.com/eql/v3/timestamp_ord_ope.json",
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_timestamp_ord_ope.json",
   "$schema": "https://json-schema.org/draft/2020-12/schema",
   "additionalProperties": false,
-  "description": "`public.timestamp_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
+  "description": "`public.eql_v3_timestamp_ord_ope` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.",
   "properties": {
     "c": {
       "$ref": "#/$defs/Ciphertext"
diff --git a/crates/eql-bindings/schema/v3/eql_v3_timestamp_ord_ore.json b/crates/eql-bindings/schema/v3/eql_v3_timestamp_ord_ore.json
new file mode 100644
index 000000000..fcb4d3103
--- /dev/null
+++ b/crates/eql-bindings/schema/v3/eql_v3_timestamp_ord_ore.json
@@ -0,0 +1,65 @@
+{
+  "$defs": {
+    "Ciphertext": {
+      "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.",
+      "type": "string"
+    },
+    "Identifier": {
+      "additionalProperties": false,
+      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
+      "properties": {
+        "c": {
+          "description": "Column name.",
+          "type": "string"
+        },
+        "t": {
+          "description": "Table name.",
+          "type": "string"
+        }
+      },
+      "required": [
+        "t",
+        "c"
+      ],
+      "type": "object"
+    },
+    "OreBlock256": {
+      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
+      "items": {
+        "type": "string"
+      },
+      "type": "array"
+    },
+    "SchemaVersion": {
+      "const": 3,
+      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
+      "type": "integer"
+    }
+  },
+  "$id": "https://schemas.cipherstash.com/eql/v3/eql_v3_timestamp_ord_ore.json",
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "additionalProperties": false,
+  "description": "`public.eql_v3_timestamp_ord_ore` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
+  "properties": {
+    "c": {
+      "$ref": "#/$defs/Ciphertext"
+    },
+    "i": {
+      "$ref": "#/$defs/Identifier"
+    },
+    "ob": {
+      "$ref": "#/$defs/OreBlock256"
+    },
+    "v": {
+      "$ref": "#/$defs/SchemaVersion"
+    }
+  },
+  "required": [
+    "v",
+    "i",
+    "c",
+    "ob"
+  ],
+  "title": "TimestampOrdOre",
+  "type": "object"
+}
\ No newline at end of file
diff --git a/crates/eql-bindings/schema/v3/real_ord.json b/crates/eql-bindings/schema/v3/real_ord.json
deleted file mode 100644
index b0304add5..000000000
--- a/crates/eql-bindings/schema/v3/real_ord.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "$defs": {
-    "Ciphertext": {
-      "description": "mp_base85 source ciphertext — the `c` envelope key.\n\nRequired by every v3 domain CHECK; present on every payload.",
-      "type": "string"
-    },
-    "Identifier": {
-      "additionalProperties": false,
-      "description": "Table + column identifier — wire shape `{\"t\": \"...\", \"c\": \"...\"}`.\n\nShared by every payload.",
-      "properties": {
-        "c": {
-          "description": "Column name.",
-          "type": "string"
-        },
-        "t": {
-          "description": "Table name.",
-          "type": "string"
-        }
-      },
-      "required": [
-        "t",
-        "c"
-      ],
-      "type": "object"
-    },
-    "OreBlock256": {
-      "description": "Block-ORE order term — the `ob` wire key. Backs the `_ord` / `_ord_ore`\ndomains (`=` `<>` `<` `<=` `>` `>=`); ORE is lossless over the scalar's\ndomain, so it serves equality too. The block count is width-agnostic on the\nwire (8 for the int scalars, 12 for timestamp, 14 for numeric) — the\narray just carries more block strings. SQL-side constructor:\n`eql_v3_internal.ore_block_256`.",
-      "items": {
-        "type": "string"
-      },
-      "type": "array"
-    },
-    "SchemaVersion": {
-      "const": 3,
-      "description": "The envelope version field (`v`) — always exactly `3` on the wire.",
-      "type": "integer"
-    }
-  },
-  "$id": "https://schemas.cipherstash.com/eql/v3/real_ord.json",
-  "$schema": "https://json-schema.org/draft/2020-12/schema",
-  "additionalProperties": false,
-  "description": "`public.real_ord` — ordering domain.\n\nOperators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.",
-  "properties": {
-    "c": {
-      "$ref": "#/$defs/Ciphertext"
-    },
-    "i": {
-      "$ref": "#/$defs/Identifier"
-    },
-    "ob": {
-      "$ref": "#/$defs/OreBlock256"
-    },
-    "v": {
-      "$ref": "#/$defs/SchemaVersion"
-    }
-  },
-  "required": [
-    "v",
-    "i",
-    "c",
-    "ob"
-  ],
-  "title": "RealOrd",
-  "type": "object"
-}
\ No newline at end of file
diff --git a/crates/eql-bindings/src/from_v2/mod.rs b/crates/eql-bindings/src/from_v2/mod.rs
index 977c1e732..89c882e2f 100644
--- a/crates/eql-bindings/src/from_v2/mod.rs
+++ b/crates/eql-bindings/src/from_v2/mod.rs
@@ -131,7 +131,7 @@ pub fn from_v2_typed(v2: &Value, target: TargetDomain) -> Result Result String {
     match target {
         TargetDomain::Json => "query_jsonb".to_string(),
-        TargetDomain::Scalar(t) => format!("query_{}", t.domain()),
+        // The query twin joins `query_` to the BARE domain name: the stored
+        // domain's `eql_v3_` version prefix (CIP-3472) applies to public-schema
+        // column types only — query operands live in the already-versioned
+        // `eql_v3` schema, so `eql_v3_text_eq` twins `query_text_eq`.
+        TargetDomain::Scalar(t) => {
+            let bare = t
+                .domain()
+                .strip_prefix(crate::v3::domain_type::PUBLIC_TYPNAME_PREFIX)
+                .unwrap_or_else(|| {
+                    unreachable!(
+                        "stored scalar domain {} must carry the version prefix",
+                        t.domain()
+                    )
+                });
+            format!("query_{bare}")
+        }
     }
 }
 
@@ -336,7 +351,7 @@ fn validate_as(domain: &str, value: &Value) -> Result<(), FromV2Error> {
         .find(|d| d.domain() == domain)
         .unwrap_or_else(|| {
             // `domain` always came from the same inventory via
-            // `TargetDomain::parse` (or is the literal "json"/"query_jsonb").
+            // `TargetDomain::parse` (or is the literal "eql_v3_json"/"query_jsonb").
             unreachable!("domain {domain} resolved by parse must be in the inventory")
         });
     entry.parse_value(value).map_err(FromV2Error::Invalid)
@@ -444,7 +459,7 @@ fn convert_ste_vec_query(v2: &Value) -> Result {
         Some(kind) => {
             return Err(FromV2Error::KindMismatch {
                 kind: kind.into(),
-                target: "json".into(),
+                target: "eql_v3_json".into(),
             })
         }
     }
@@ -483,7 +498,7 @@ impl EntryShape {
     /// context.
     fn domain(self) -> &'static str {
         match self {
-            Self::Document => "json",
+            Self::Document => "eql_v3_json",
             Self::Query => "query_jsonb",
         }
     }
diff --git a/crates/eql-bindings/src/from_v2/target.rs b/crates/eql-bindings/src/from_v2/target.rs
index e77e1de23..af2358026 100644
--- a/crates/eql-bindings/src/from_v2/target.rs
+++ b/crates/eql-bindings/src/from_v2/target.rs
@@ -16,7 +16,7 @@ pub enum TargetDomain {
     /// A flat scalar domain (`integer`, `text_eq`, `integer_ord_ope`, …): the v2
     /// payload must be the `k: "ct"` form.
     Scalar(ScalarTarget),
-    /// The SteVec document domain `public.json`: the v2 payload must be the
+    /// The SteVec document domain `public.eql_v3_json`: the v2 payload must be the
     /// `k: "sv"` form.
     Json,
 }
@@ -44,8 +44,8 @@ impl ScalarTarget {
 }
 
 impl TargetDomain {
-    /// Resolve an unqualified v3 domain name (`"integer_ord_ope"`,
-    /// `"text_search"`, `"float8"`, `"json"`, …) against the inventory.
+    /// Resolve an unqualified v3 domain name (`"eql_v3_integer_ord_ope"`,
+    /// `"text_search"`, `"float8"`, `"eql_v3_json"`, …) against the inventory.
     ///
     /// Shape-aware: scalar domains resolve to [`TargetDomain::Scalar`] with
     /// their catalog term keys; the SteVec document domain `json` resolves to
@@ -61,7 +61,7 @@ impl TargetDomain {
                     domain: d.domain(),
                     term_keys,
                 })),
-                None if name == "json" => Ok(Self::Json),
+                None if name == "eql_v3_json" => Ok(Self::Json),
                 None => Err(FromV2Error::UnknownDomain { name: name.into() }),
             },
             None => Err(FromV2Error::UnknownDomain { name: name.into() }),
@@ -69,11 +69,11 @@ impl TargetDomain {
     }
 
     /// The target's name for error messages: the scalar domain name, or
-    /// `"json"`.
+    /// `"eql_v3_json"`.
     pub(super) fn describe(&self) -> &'static str {
         match self {
             Self::Scalar(t) => t.domain(),
-            Self::Json => "json",
+            Self::Json => "eql_v3_json",
         }
     }
 }
diff --git a/crates/eql-bindings/src/v3/bigint.rs b/crates/eql-bindings/src/v3/bigint.rs
index dff8c373c..207980475 100644
--- a/crates/eql-bindings/src/v3/bigint.rs
+++ b/crates/eql-bindings/src/v3/bigint.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.bigint` — storage-only domain.
+/// `public.eql_v3_bigint` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Bigint {
 }
 impl DomainType for Bigint {
     fn sql_domain_static() -> &'static str {
-        "public.bigint"
+        "public.eql_v3_bigint"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Bigint {
         schema_for!(Bigint)
     }
 }
-/// `public.bigint_eq` — equality domain.
+/// `public.eql_v3_bigint_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct BigintEq {
 }
 impl DomainType for BigintEq {
     fn sql_domain_static() -> &'static str {
-        "public.bigint_eq"
+        "public.eql_v3_bigint_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for BigintEq {
         schema_for!(BigintEq)
     }
 }
-/// `public.bigint_ord_ore` — ordering domain.
+/// `public.eql_v3_bigint_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct BigintOrdOre {
 }
 impl DomainType for BigintOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.bigint_ord_ore"
+        "public.eql_v3_bigint_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for BigintOrdOre {
         schema_for!(BigintOrdOre)
     }
 }
-/// `public.bigint_ord` — ordering domain.
+/// `public.eql_v3_bigint_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct BigintOrd {
 }
 impl DomainType for BigintOrd {
     fn sql_domain_static() -> &'static str {
-        "public.bigint_ord"
+        "public.eql_v3_bigint_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for BigintOrd {
         schema_for!(BigintOrd)
     }
 }
-/// `public.bigint_ord_ope` — ordering domain.
+/// `public.eql_v3_bigint_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct BigintOrdOpe {
 }
 impl DomainType for BigintOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.bigint_ord_ope"
+        "public.eql_v3_bigint_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/boolean.rs b/crates/eql-bindings/src/v3/boolean.rs
index f4a5faea3..2a64a6046 100644
--- a/crates/eql-bindings/src/v3/boolean.rs
+++ b/crates/eql-bindings/src/v3/boolean.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.boolean` — storage-only domain.
+/// `public.eql_v3_boolean` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Boolean {
 }
 impl DomainType for Boolean {
     fn sql_domain_static() -> &'static str {
-        "public.boolean"
+        "public.eql_v3_boolean"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/date.rs b/crates/eql-bindings/src/v3/date.rs
index 2e4b8b7b8..96f694434 100644
--- a/crates/eql-bindings/src/v3/date.rs
+++ b/crates/eql-bindings/src/v3/date.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.date` — storage-only domain.
+/// `public.eql_v3_date` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Date {
 }
 impl DomainType for Date {
     fn sql_domain_static() -> &'static str {
-        "public.date"
+        "public.eql_v3_date"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Date {
         schema_for!(Date)
     }
 }
-/// `public.date_eq` — equality domain.
+/// `public.eql_v3_date_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct DateEq {
 }
 impl DomainType for DateEq {
     fn sql_domain_static() -> &'static str {
-        "public.date_eq"
+        "public.eql_v3_date_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for DateEq {
         schema_for!(DateEq)
     }
 }
-/// `public.date_ord_ore` — ordering domain.
+/// `public.eql_v3_date_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct DateOrdOre {
 }
 impl DomainType for DateOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.date_ord_ore"
+        "public.eql_v3_date_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for DateOrdOre {
         schema_for!(DateOrdOre)
     }
 }
-/// `public.date_ord` — ordering domain.
+/// `public.eql_v3_date_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct DateOrd {
 }
 impl DomainType for DateOrd {
     fn sql_domain_static() -> &'static str {
-        "public.date_ord"
+        "public.eql_v3_date_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for DateOrd {
         schema_for!(DateOrd)
     }
 }
-/// `public.date_ord_ope` — ordering domain.
+/// `public.eql_v3_date_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct DateOrdOpe {
 }
 impl DomainType for DateOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.date_ord_ope"
+        "public.eql_v3_date_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/domain_type.rs b/crates/eql-bindings/src/v3/domain_type.rs
index c2cf64fa3..13a52802c 100644
--- a/crates/eql-bindings/src/v3/domain_type.rs
+++ b/crates/eql-bindings/src/v3/domain_type.rs
@@ -15,6 +15,15 @@ use serde::Deserialize;
 /// application column, and a query operand is never an application column.
 pub const SQL_SCHEMA: &str = "public";
 
+/// The version prefix every public-schema column domain's typname carries
+/// (`eql_v3_integer_eq`, `eql_v3_json`, … — CIP-3472). Mirrors
+/// `eql_domains::PUBLIC_TYPNAME_PREFIX` (a dev-dependency here, so the
+/// literal is repeated); parity with the catalog is pinned exhaustively by
+/// `tests/catalog_parity.rs`. Query-operand domains (`query_`,
+/// `query_jsonb`) are NOT prefixed — the `eql_v3` schema they live in
+/// already versions them.
+pub const PUBLIC_TYPNAME_PREFIX: &str = "eql_v3_";
+
 /// Base URL for the canonical `$id` of every published v3 JSON Schema.
 /// The per-domain `$id` is `{SCHEMA_ID_BASE}{domain}.json` (see
 /// [`DomainType::schema_id`]); `tests/export.rs` injects it at write time.
diff --git a/crates/eql-bindings/src/v3/double.rs b/crates/eql-bindings/src/v3/double.rs
index b3a92522a..30a218d4e 100644
--- a/crates/eql-bindings/src/v3/double.rs
+++ b/crates/eql-bindings/src/v3/double.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.double` — storage-only domain.
+/// `public.eql_v3_double` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Double {
 }
 impl DomainType for Double {
     fn sql_domain_static() -> &'static str {
-        "public.double"
+        "public.eql_v3_double"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Double {
         schema_for!(Double)
     }
 }
-/// `public.double_eq` — equality domain.
+/// `public.eql_v3_double_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct DoubleEq {
 }
 impl DomainType for DoubleEq {
     fn sql_domain_static() -> &'static str {
-        "public.double_eq"
+        "public.eql_v3_double_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for DoubleEq {
         schema_for!(DoubleEq)
     }
 }
-/// `public.double_ord_ore` — ordering domain.
+/// `public.eql_v3_double_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct DoubleOrdOre {
 }
 impl DomainType for DoubleOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.double_ord_ore"
+        "public.eql_v3_double_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for DoubleOrdOre {
         schema_for!(DoubleOrdOre)
     }
 }
-/// `public.double_ord` — ordering domain.
+/// `public.eql_v3_double_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct DoubleOrd {
 }
 impl DomainType for DoubleOrd {
     fn sql_domain_static() -> &'static str {
-        "public.double_ord"
+        "public.eql_v3_double_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for DoubleOrd {
         schema_for!(DoubleOrd)
     }
 }
-/// `public.double_ord_ope` — ordering domain.
+/// `public.eql_v3_double_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct DoubleOrdOpe {
 }
 impl DomainType for DoubleOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.double_ord_ope"
+        "public.eql_v3_double_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/integer.rs b/crates/eql-bindings/src/v3/integer.rs
index cd16e1484..92486727f 100644
--- a/crates/eql-bindings/src/v3/integer.rs
+++ b/crates/eql-bindings/src/v3/integer.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.integer` — storage-only domain.
+/// `public.eql_v3_integer` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Integer {
 }
 impl DomainType for Integer {
     fn sql_domain_static() -> &'static str {
-        "public.integer"
+        "public.eql_v3_integer"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Integer {
         schema_for!(Integer)
     }
 }
-/// `public.integer_eq` — equality domain.
+/// `public.eql_v3_integer_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct IntegerEq {
 }
 impl DomainType for IntegerEq {
     fn sql_domain_static() -> &'static str {
-        "public.integer_eq"
+        "public.eql_v3_integer_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for IntegerEq {
         schema_for!(IntegerEq)
     }
 }
-/// `public.integer_ord_ore` — ordering domain.
+/// `public.eql_v3_integer_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct IntegerOrdOre {
 }
 impl DomainType for IntegerOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.integer_ord_ore"
+        "public.eql_v3_integer_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for IntegerOrdOre {
         schema_for!(IntegerOrdOre)
     }
 }
-/// `public.integer_ord` — ordering domain.
+/// `public.eql_v3_integer_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct IntegerOrd {
 }
 impl DomainType for IntegerOrd {
     fn sql_domain_static() -> &'static str {
-        "public.integer_ord"
+        "public.eql_v3_integer_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for IntegerOrd {
         schema_for!(IntegerOrd)
     }
 }
-/// `public.integer_ord_ope` — ordering domain.
+/// `public.eql_v3_integer_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct IntegerOrdOpe {
 }
 impl DomainType for IntegerOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.integer_ord_ope"
+        "public.eql_v3_integer_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/jsonb.rs b/crates/eql-bindings/src/v3/jsonb.rs
index 2f44f841d..e9f317720 100644
--- a/crates/eql-bindings/src/v3/jsonb.rs
+++ b/crates/eql-bindings/src/v3/jsonb.rs
@@ -71,7 +71,7 @@ impl JsonSchema for SteVecForm {
     }
 }
 
-/// `public.json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
+/// `public.eql_v3_json` — a SteVec encrypted-JSONB document (`{v, k, i, sv:[entry]}`,
 /// no root ciphertext). Strict. `k` is the `"sv"` form discriminator (see
 /// [`SteVecForm`]) — carried on the real wire, so the strict struct models it.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -84,7 +84,7 @@ pub struct SteVecDocument {
     pub sv: Vec,
 }
 
-/// `public.jsonb_entry` — one sv element (returned by `->`). Carries a selector
+/// `public.eql_v3_jsonb_entry` — one sv element (returned by `->`). Carries a selector
 /// `s`, ciphertext `c`, optional array-membership marker `a`, and exactly one of
 /// `hm` XOR `oc`. LAX (flatten precludes `deny_unknown_fields`): tolerates the
 /// root `i`/`v` merged in by `->`. XOR of the term is enforced by the SQL CHECK.
@@ -155,6 +155,6 @@ macro_rules! ste_vec_domain_type {
     };
 }
 
-ste_vec_domain_type!(SteVecDocument, "public.json");
-ste_vec_domain_type!(SteVecEntry, "public.jsonb_entry");
+ste_vec_domain_type!(SteVecDocument, "public.eql_v3_json");
+ste_vec_domain_type!(SteVecEntry, "public.eql_v3_jsonb_entry");
 ste_vec_domain_type!(SteVecQuery, "eql_v3.query_jsonb");
diff --git a/crates/eql-bindings/src/v3/numeric.rs b/crates/eql-bindings/src/v3/numeric.rs
index 790ef8cac..0131ac4b2 100644
--- a/crates/eql-bindings/src/v3/numeric.rs
+++ b/crates/eql-bindings/src/v3/numeric.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.numeric` — storage-only domain.
+/// `public.eql_v3_numeric` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Numeric {
 }
 impl DomainType for Numeric {
     fn sql_domain_static() -> &'static str {
-        "public.numeric"
+        "public.eql_v3_numeric"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Numeric {
         schema_for!(Numeric)
     }
 }
-/// `public.numeric_eq` — equality domain.
+/// `public.eql_v3_numeric_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct NumericEq {
 }
 impl DomainType for NumericEq {
     fn sql_domain_static() -> &'static str {
-        "public.numeric_eq"
+        "public.eql_v3_numeric_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for NumericEq {
         schema_for!(NumericEq)
     }
 }
-/// `public.numeric_ord_ore` — ordering domain.
+/// `public.eql_v3_numeric_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct NumericOrdOre {
 }
 impl DomainType for NumericOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.numeric_ord_ore"
+        "public.eql_v3_numeric_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for NumericOrdOre {
         schema_for!(NumericOrdOre)
     }
 }
-/// `public.numeric_ord` — ordering domain.
+/// `public.eql_v3_numeric_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct NumericOrd {
 }
 impl DomainType for NumericOrd {
     fn sql_domain_static() -> &'static str {
-        "public.numeric_ord"
+        "public.eql_v3_numeric_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for NumericOrd {
         schema_for!(NumericOrd)
     }
 }
-/// `public.numeric_ord_ope` — ordering domain.
+/// `public.eql_v3_numeric_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct NumericOrdOpe {
 }
 impl DomainType for NumericOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.numeric_ord_ope"
+        "public.eql_v3_numeric_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/payload.rs b/crates/eql-bindings/src/v3/payload.rs
index 850404747..12765a537 100644
--- a/crates/eql-bindings/src/v3/payload.rs
+++ b/crates/eql-bindings/src/v3/payload.rs
@@ -4,7 +4,7 @@ use super::domain_type::DomainType;
 use serde::{Deserialize, Serialize};
 /// Every stored-payload v3 domain in one type: one variant per flat
 /// scalar domain in `eql-domains::CATALOG` plus the SteVec document
-/// (`public.json`). Generated from the catalog, so it cannot drift
+/// (`public.eql_v3_json`). Generated from the catalog, so it cannot drift
 /// when the catalog grows.
 ///
 /// Serialization is exactly the inner struct's (`#[serde(untagged)]`
@@ -17,111 +17,111 @@ use serde::{Deserialize, Serialize};
 #[derive(Clone, Debug, PartialEq, Serialize)]
 #[serde(untagged)]
 pub enum DomainPayload {
-    /// The `public.integer` payload.
+    /// The `public.eql_v3_integer` payload.
     Integer(super::integer::Integer),
-    /// The `public.integer_eq` payload.
+    /// The `public.eql_v3_integer_eq` payload.
     IntegerEq(super::integer::IntegerEq),
-    /// The `public.integer_ord_ore` payload.
+    /// The `public.eql_v3_integer_ord_ore` payload.
     IntegerOrdOre(super::integer::IntegerOrdOre),
-    /// The `public.integer_ord` payload.
+    /// The `public.eql_v3_integer_ord` payload.
     IntegerOrd(super::integer::IntegerOrd),
-    /// The `public.integer_ord_ope` payload.
+    /// The `public.eql_v3_integer_ord_ope` payload.
     IntegerOrdOpe(super::integer::IntegerOrdOpe),
-    /// The `public.smallint` payload.
+    /// The `public.eql_v3_smallint` payload.
     Smallint(super::smallint::Smallint),
-    /// The `public.smallint_eq` payload.
+    /// The `public.eql_v3_smallint_eq` payload.
     SmallintEq(super::smallint::SmallintEq),
-    /// The `public.smallint_ord_ore` payload.
+    /// The `public.eql_v3_smallint_ord_ore` payload.
     SmallintOrdOre(super::smallint::SmallintOrdOre),
-    /// The `public.smallint_ord` payload.
+    /// The `public.eql_v3_smallint_ord` payload.
     SmallintOrd(super::smallint::SmallintOrd),
-    /// The `public.smallint_ord_ope` payload.
+    /// The `public.eql_v3_smallint_ord_ope` payload.
     SmallintOrdOpe(super::smallint::SmallintOrdOpe),
-    /// The `public.bigint` payload.
+    /// The `public.eql_v3_bigint` payload.
     Bigint(super::bigint::Bigint),
-    /// The `public.bigint_eq` payload.
+    /// The `public.eql_v3_bigint_eq` payload.
     BigintEq(super::bigint::BigintEq),
-    /// The `public.bigint_ord_ore` payload.
+    /// The `public.eql_v3_bigint_ord_ore` payload.
     BigintOrdOre(super::bigint::BigintOrdOre),
-    /// The `public.bigint_ord` payload.
+    /// The `public.eql_v3_bigint_ord` payload.
     BigintOrd(super::bigint::BigintOrd),
-    /// The `public.bigint_ord_ope` payload.
+    /// The `public.eql_v3_bigint_ord_ope` payload.
     BigintOrdOpe(super::bigint::BigintOrdOpe),
-    /// The `public.date` payload.
+    /// The `public.eql_v3_date` payload.
     Date(super::date::Date),
-    /// The `public.date_eq` payload.
+    /// The `public.eql_v3_date_eq` payload.
     DateEq(super::date::DateEq),
-    /// The `public.date_ord_ore` payload.
+    /// The `public.eql_v3_date_ord_ore` payload.
     DateOrdOre(super::date::DateOrdOre),
-    /// The `public.date_ord` payload.
+    /// The `public.eql_v3_date_ord` payload.
     DateOrd(super::date::DateOrd),
-    /// The `public.date_ord_ope` payload.
+    /// The `public.eql_v3_date_ord_ope` payload.
     DateOrdOpe(super::date::DateOrdOpe),
-    /// The `public.timestamp` payload.
+    /// The `public.eql_v3_timestamp` payload.
     Timestamp(super::timestamp::Timestamp),
-    /// The `public.timestamp_eq` payload.
+    /// The `public.eql_v3_timestamp_eq` payload.
     TimestampEq(super::timestamp::TimestampEq),
-    /// The `public.timestamp_ord_ore` payload.
+    /// The `public.eql_v3_timestamp_ord_ore` payload.
     TimestampOrdOre(super::timestamp::TimestampOrdOre),
-    /// The `public.timestamp_ord` payload.
+    /// The `public.eql_v3_timestamp_ord` payload.
     TimestampOrd(super::timestamp::TimestampOrd),
-    /// The `public.timestamp_ord_ope` payload.
+    /// The `public.eql_v3_timestamp_ord_ope` payload.
     TimestampOrdOpe(super::timestamp::TimestampOrdOpe),
-    /// The `public.numeric` payload.
+    /// The `public.eql_v3_numeric` payload.
     Numeric(super::numeric::Numeric),
-    /// The `public.numeric_eq` payload.
+    /// The `public.eql_v3_numeric_eq` payload.
     NumericEq(super::numeric::NumericEq),
-    /// The `public.numeric_ord_ore` payload.
+    /// The `public.eql_v3_numeric_ord_ore` payload.
     NumericOrdOre(super::numeric::NumericOrdOre),
-    /// The `public.numeric_ord` payload.
+    /// The `public.eql_v3_numeric_ord` payload.
     NumericOrd(super::numeric::NumericOrd),
-    /// The `public.numeric_ord_ope` payload.
+    /// The `public.eql_v3_numeric_ord_ope` payload.
     NumericOrdOpe(super::numeric::NumericOrdOpe),
-    /// The `public.text` payload.
+    /// The `public.eql_v3_text` payload.
     Text(super::text::Text),
-    /// The `public.text_eq` payload.
+    /// The `public.eql_v3_text_eq` payload.
     TextEq(super::text::TextEq),
-    /// The `public.text_match` payload.
+    /// The `public.eql_v3_text_match` payload.
     TextMatch(super::text::TextMatch),
-    /// The `public.text_ord_ore` payload.
+    /// The `public.eql_v3_text_ord_ore` payload.
     TextOrdOre(super::text::TextOrdOre),
-    /// The `public.text_ord` payload.
+    /// The `public.eql_v3_text_ord` payload.
     TextOrd(super::text::TextOrd),
-    /// The `public.text_ord_ope` payload.
+    /// The `public.eql_v3_text_ord_ope` payload.
     TextOrdOpe(super::text::TextOrdOpe),
-    /// The `public.text_search` payload.
+    /// The `public.eql_v3_text_search` payload.
     TextSearch(super::text::TextSearch),
-    /// The `public.boolean` payload.
+    /// The `public.eql_v3_boolean` payload.
     Boolean(super::boolean::Boolean),
-    /// The `public.real` payload.
+    /// The `public.eql_v3_real` payload.
     Real(super::real::Real),
-    /// The `public.real_eq` payload.
+    /// The `public.eql_v3_real_eq` payload.
     RealEq(super::real::RealEq),
-    /// The `public.real_ord_ore` payload.
+    /// The `public.eql_v3_real_ord_ore` payload.
     RealOrdOre(super::real::RealOrdOre),
-    /// The `public.real_ord` payload.
+    /// The `public.eql_v3_real_ord` payload.
     RealOrd(super::real::RealOrd),
-    /// The `public.real_ord_ope` payload.
+    /// The `public.eql_v3_real_ord_ope` payload.
     RealOrdOpe(super::real::RealOrdOpe),
-    /// The `public.double` payload.
+    /// The `public.eql_v3_double` payload.
     Double(super::double::Double),
-    /// The `public.double_eq` payload.
+    /// The `public.eql_v3_double_eq` payload.
     DoubleEq(super::double::DoubleEq),
-    /// The `public.double_ord_ore` payload.
+    /// The `public.eql_v3_double_ord_ore` payload.
     DoubleOrdOre(super::double::DoubleOrdOre),
-    /// The `public.double_ord` payload.
+    /// The `public.eql_v3_double_ord` payload.
     DoubleOrd(super::double::DoubleOrd),
-    /// The `public.double_ord_ope` payload.
+    /// The `public.eql_v3_double_ord_ope` payload.
     DoubleOrdOpe(super::double::DoubleOrdOpe),
-    /// The `public.json` payload.
+    /// The `public.eql_v3_json` payload.
     SteVecDocument(super::jsonb::SteVecDocument),
 }
 impl DomainPayload {
     /// Strictly parse `value` as `domain`'s payload, KEEPING the
     /// parsed value — the constructor counterpart of
     /// [`DomainType::parse_value`] (which validates and discards).
-    /// `domain` is the unqualified name (`"integer_eq"`, `"json"`,
-    /// …). `None` when `domain` is not a stored-payload domain (the
+    /// `domain` is the unqualified installed name (`"eql_v3_integer_eq"`,
+    /// `"eql_v3_json"`, …). `None` when `domain` is not a stored-payload domain (the
     /// SteVec entry/query shapes included); `Some(Err)` when the
     /// strict parse fails (`deny_unknown_fields`, the
     /// `SchemaVersion`/`SteVecForm` pins).
@@ -130,111 +130,129 @@ impl DomainPayload {
         value: &serde_json::Value,
     ) -> Option> {
         match domain {
-            "integer" => Some(super::integer::Integer::deserialize(value).map(Self::Integer)),
-            "integer_eq" => {
+            "eql_v3_integer" => {
+                Some(super::integer::Integer::deserialize(value).map(Self::Integer))
+            }
+            "eql_v3_integer_eq" => {
                 Some(super::integer::IntegerEq::deserialize(value).map(Self::IntegerEq))
             }
-            "integer_ord_ore" => {
+            "eql_v3_integer_ord_ore" => {
                 Some(super::integer::IntegerOrdOre::deserialize(value).map(Self::IntegerOrdOre))
             }
-            "integer_ord" => {
+            "eql_v3_integer_ord" => {
                 Some(super::integer::IntegerOrd::deserialize(value).map(Self::IntegerOrd))
             }
-            "integer_ord_ope" => {
+            "eql_v3_integer_ord_ope" => {
                 Some(super::integer::IntegerOrdOpe::deserialize(value).map(Self::IntegerOrdOpe))
             }
-            "smallint" => Some(super::smallint::Smallint::deserialize(value).map(Self::Smallint)),
-            "smallint_eq" => {
+            "eql_v3_smallint" => {
+                Some(super::smallint::Smallint::deserialize(value).map(Self::Smallint))
+            }
+            "eql_v3_smallint_eq" => {
                 Some(super::smallint::SmallintEq::deserialize(value).map(Self::SmallintEq))
             }
-            "smallint_ord_ore" => {
+            "eql_v3_smallint_ord_ore" => {
                 Some(super::smallint::SmallintOrdOre::deserialize(value).map(Self::SmallintOrdOre))
             }
-            "smallint_ord" => {
+            "eql_v3_smallint_ord" => {
                 Some(super::smallint::SmallintOrd::deserialize(value).map(Self::SmallintOrd))
             }
-            "smallint_ord_ope" => {
+            "eql_v3_smallint_ord_ope" => {
                 Some(super::smallint::SmallintOrdOpe::deserialize(value).map(Self::SmallintOrdOpe))
             }
-            "bigint" => Some(super::bigint::Bigint::deserialize(value).map(Self::Bigint)),
-            "bigint_eq" => Some(super::bigint::BigintEq::deserialize(value).map(Self::BigintEq)),
-            "bigint_ord_ore" => {
+            "eql_v3_bigint" => Some(super::bigint::Bigint::deserialize(value).map(Self::Bigint)),
+            "eql_v3_bigint_eq" => {
+                Some(super::bigint::BigintEq::deserialize(value).map(Self::BigintEq))
+            }
+            "eql_v3_bigint_ord_ore" => {
                 Some(super::bigint::BigintOrdOre::deserialize(value).map(Self::BigintOrdOre))
             }
-            "bigint_ord" => Some(super::bigint::BigintOrd::deserialize(value).map(Self::BigintOrd)),
-            "bigint_ord_ope" => {
+            "eql_v3_bigint_ord" => {
+                Some(super::bigint::BigintOrd::deserialize(value).map(Self::BigintOrd))
+            }
+            "eql_v3_bigint_ord_ope" => {
                 Some(super::bigint::BigintOrdOpe::deserialize(value).map(Self::BigintOrdOpe))
             }
-            "date" => Some(super::date::Date::deserialize(value).map(Self::Date)),
-            "date_eq" => Some(super::date::DateEq::deserialize(value).map(Self::DateEq)),
-            "date_ord_ore" => {
+            "eql_v3_date" => Some(super::date::Date::deserialize(value).map(Self::Date)),
+            "eql_v3_date_eq" => Some(super::date::DateEq::deserialize(value).map(Self::DateEq)),
+            "eql_v3_date_ord_ore" => {
                 Some(super::date::DateOrdOre::deserialize(value).map(Self::DateOrdOre))
             }
-            "date_ord" => Some(super::date::DateOrd::deserialize(value).map(Self::DateOrd)),
-            "date_ord_ope" => {
+            "eql_v3_date_ord" => Some(super::date::DateOrd::deserialize(value).map(Self::DateOrd)),
+            "eql_v3_date_ord_ope" => {
                 Some(super::date::DateOrdOpe::deserialize(value).map(Self::DateOrdOpe))
             }
-            "timestamp" => {
+            "eql_v3_timestamp" => {
                 Some(super::timestamp::Timestamp::deserialize(value).map(Self::Timestamp))
             }
-            "timestamp_eq" => {
+            "eql_v3_timestamp_eq" => {
                 Some(super::timestamp::TimestampEq::deserialize(value).map(Self::TimestampEq))
             }
-            "timestamp_ord_ore" => Some(
+            "eql_v3_timestamp_ord_ore" => Some(
                 super::timestamp::TimestampOrdOre::deserialize(value).map(Self::TimestampOrdOre),
             ),
-            "timestamp_ord" => {
+            "eql_v3_timestamp_ord" => {
                 Some(super::timestamp::TimestampOrd::deserialize(value).map(Self::TimestampOrd))
             }
-            "timestamp_ord_ope" => Some(
+            "eql_v3_timestamp_ord_ope" => Some(
                 super::timestamp::TimestampOrdOpe::deserialize(value).map(Self::TimestampOrdOpe),
             ),
-            "numeric" => Some(super::numeric::Numeric::deserialize(value).map(Self::Numeric)),
-            "numeric_eq" => {
+            "eql_v3_numeric" => {
+                Some(super::numeric::Numeric::deserialize(value).map(Self::Numeric))
+            }
+            "eql_v3_numeric_eq" => {
                 Some(super::numeric::NumericEq::deserialize(value).map(Self::NumericEq))
             }
-            "numeric_ord_ore" => {
+            "eql_v3_numeric_ord_ore" => {
                 Some(super::numeric::NumericOrdOre::deserialize(value).map(Self::NumericOrdOre))
             }
-            "numeric_ord" => {
+            "eql_v3_numeric_ord" => {
                 Some(super::numeric::NumericOrd::deserialize(value).map(Self::NumericOrd))
             }
-            "numeric_ord_ope" => {
+            "eql_v3_numeric_ord_ope" => {
                 Some(super::numeric::NumericOrdOpe::deserialize(value).map(Self::NumericOrdOpe))
             }
-            "text" => Some(super::text::Text::deserialize(value).map(Self::Text)),
-            "text_eq" => Some(super::text::TextEq::deserialize(value).map(Self::TextEq)),
-            "text_match" => Some(super::text::TextMatch::deserialize(value).map(Self::TextMatch)),
-            "text_ord_ore" => {
+            "eql_v3_text" => Some(super::text::Text::deserialize(value).map(Self::Text)),
+            "eql_v3_text_eq" => Some(super::text::TextEq::deserialize(value).map(Self::TextEq)),
+            "eql_v3_text_match" => {
+                Some(super::text::TextMatch::deserialize(value).map(Self::TextMatch))
+            }
+            "eql_v3_text_ord_ore" => {
                 Some(super::text::TextOrdOre::deserialize(value).map(Self::TextOrdOre))
             }
-            "text_ord" => Some(super::text::TextOrd::deserialize(value).map(Self::TextOrd)),
-            "text_ord_ope" => {
+            "eql_v3_text_ord" => Some(super::text::TextOrd::deserialize(value).map(Self::TextOrd)),
+            "eql_v3_text_ord_ope" => {
                 Some(super::text::TextOrdOpe::deserialize(value).map(Self::TextOrdOpe))
             }
-            "text_search" => {
+            "eql_v3_text_search" => {
                 Some(super::text::TextSearch::deserialize(value).map(Self::TextSearch))
             }
-            "boolean" => Some(super::boolean::Boolean::deserialize(value).map(Self::Boolean)),
-            "real" => Some(super::real::Real::deserialize(value).map(Self::Real)),
-            "real_eq" => Some(super::real::RealEq::deserialize(value).map(Self::RealEq)),
-            "real_ord_ore" => {
+            "eql_v3_boolean" => {
+                Some(super::boolean::Boolean::deserialize(value).map(Self::Boolean))
+            }
+            "eql_v3_real" => Some(super::real::Real::deserialize(value).map(Self::Real)),
+            "eql_v3_real_eq" => Some(super::real::RealEq::deserialize(value).map(Self::RealEq)),
+            "eql_v3_real_ord_ore" => {
                 Some(super::real::RealOrdOre::deserialize(value).map(Self::RealOrdOre))
             }
-            "real_ord" => Some(super::real::RealOrd::deserialize(value).map(Self::RealOrd)),
-            "real_ord_ope" => {
+            "eql_v3_real_ord" => Some(super::real::RealOrd::deserialize(value).map(Self::RealOrd)),
+            "eql_v3_real_ord_ope" => {
                 Some(super::real::RealOrdOpe::deserialize(value).map(Self::RealOrdOpe))
             }
-            "double" => Some(super::double::Double::deserialize(value).map(Self::Double)),
-            "double_eq" => Some(super::double::DoubleEq::deserialize(value).map(Self::DoubleEq)),
-            "double_ord_ore" => {
+            "eql_v3_double" => Some(super::double::Double::deserialize(value).map(Self::Double)),
+            "eql_v3_double_eq" => {
+                Some(super::double::DoubleEq::deserialize(value).map(Self::DoubleEq))
+            }
+            "eql_v3_double_ord_ore" => {
                 Some(super::double::DoubleOrdOre::deserialize(value).map(Self::DoubleOrdOre))
             }
-            "double_ord" => Some(super::double::DoubleOrd::deserialize(value).map(Self::DoubleOrd)),
-            "double_ord_ope" => {
+            "eql_v3_double_ord" => {
+                Some(super::double::DoubleOrd::deserialize(value).map(Self::DoubleOrd))
+            }
+            "eql_v3_double_ord_ope" => {
                 Some(super::double::DoubleOrdOpe::deserialize(value).map(Self::DoubleOrdOpe))
             }
-            "json" => {
+            "eql_v3_json" => {
                 Some(super::jsonb::SteVecDocument::deserialize(value).map(Self::SteVecDocument))
             }
             _ => None,
@@ -294,11 +312,11 @@ impl DomainPayload {
             Self::SteVecDocument(payload) => payload,
         }
     }
-    /// Fully-qualified SQL domain name, e.g. `"public.integer_eq"`.
+    /// Fully-qualified SQL domain name, e.g. `"public.eql_v3_integer_eq"`.
     pub fn sql_domain(&self) -> &'static str {
         self.as_domain_type().sql_domain()
     }
-    /// Unqualified SQL domain name, e.g. `"integer_eq"` — the name
+    /// Unqualified SQL domain name, e.g. `"eql_v3_integer_eq"` — the name
     /// [`DomainPayload::parse`] accepts.
     pub fn domain(&self) -> &'static str {
         self.as_domain_type().domain()
diff --git a/crates/eql-bindings/src/v3/real.rs b/crates/eql-bindings/src/v3/real.rs
index 31201219d..ab5df68a8 100644
--- a/crates/eql-bindings/src/v3/real.rs
+++ b/crates/eql-bindings/src/v3/real.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.real` — storage-only domain.
+/// `public.eql_v3_real` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Real {
 }
 impl DomainType for Real {
     fn sql_domain_static() -> &'static str {
-        "public.real"
+        "public.eql_v3_real"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Real {
         schema_for!(Real)
     }
 }
-/// `public.real_eq` — equality domain.
+/// `public.eql_v3_real_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct RealEq {
 }
 impl DomainType for RealEq {
     fn sql_domain_static() -> &'static str {
-        "public.real_eq"
+        "public.eql_v3_real_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for RealEq {
         schema_for!(RealEq)
     }
 }
-/// `public.real_ord_ore` — ordering domain.
+/// `public.eql_v3_real_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct RealOrdOre {
 }
 impl DomainType for RealOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.real_ord_ore"
+        "public.eql_v3_real_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for RealOrdOre {
         schema_for!(RealOrdOre)
     }
 }
-/// `public.real_ord` — ordering domain.
+/// `public.eql_v3_real_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct RealOrd {
 }
 impl DomainType for RealOrd {
     fn sql_domain_static() -> &'static str {
-        "public.real_ord"
+        "public.eql_v3_real_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for RealOrd {
         schema_for!(RealOrd)
     }
 }
-/// `public.real_ord_ope` — ordering domain.
+/// `public.eql_v3_real_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct RealOrdOpe {
 }
 impl DomainType for RealOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.real_ord_ope"
+        "public.eql_v3_real_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/smallint.rs b/crates/eql-bindings/src/v3/smallint.rs
index bb1a78881..2dfcc6f13 100644
--- a/crates/eql-bindings/src/v3/smallint.rs
+++ b/crates/eql-bindings/src/v3/smallint.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.smallint` — storage-only domain.
+/// `public.eql_v3_smallint` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Smallint {
 }
 impl DomainType for Smallint {
     fn sql_domain_static() -> &'static str {
-        "public.smallint"
+        "public.eql_v3_smallint"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Smallint {
         schema_for!(Smallint)
     }
 }
-/// `public.smallint_eq` — equality domain.
+/// `public.eql_v3_smallint_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct SmallintEq {
 }
 impl DomainType for SmallintEq {
     fn sql_domain_static() -> &'static str {
-        "public.smallint_eq"
+        "public.eql_v3_smallint_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for SmallintEq {
         schema_for!(SmallintEq)
     }
 }
-/// `public.smallint_ord_ore` — ordering domain.
+/// `public.eql_v3_smallint_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct SmallintOrdOre {
 }
 impl DomainType for SmallintOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.smallint_ord_ore"
+        "public.eql_v3_smallint_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for SmallintOrdOre {
         schema_for!(SmallintOrdOre)
     }
 }
-/// `public.smallint_ord` — ordering domain.
+/// `public.eql_v3_smallint_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct SmallintOrd {
 }
 impl DomainType for SmallintOrd {
     fn sql_domain_static() -> &'static str {
-        "public.smallint_ord"
+        "public.eql_v3_smallint_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for SmallintOrd {
         schema_for!(SmallintOrd)
     }
 }
-/// `public.smallint_ord_ope` — ordering domain.
+/// `public.eql_v3_smallint_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct SmallintOrdOpe {
 }
 impl DomainType for SmallintOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.smallint_ord_ope"
+        "public.eql_v3_smallint_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/text.rs b/crates/eql-bindings/src/v3/text.rs
index e777b5d0a..f2179fc90 100644
--- a/crates/eql-bindings/src/v3/text.rs
+++ b/crates/eql-bindings/src/v3/text.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.text` — storage-only domain.
+/// `public.eql_v3_text` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Text {
 }
 impl DomainType for Text {
     fn sql_domain_static() -> &'static str {
-        "public.text"
+        "public.eql_v3_text"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Text {
         schema_for!(Text)
     }
 }
-/// `public.text_eq` — equality domain.
+/// `public.eql_v3_text_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct TextEq {
 }
 impl DomainType for TextEq {
     fn sql_domain_static() -> &'static str {
-        "public.text_eq"
+        "public.eql_v3_text_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for TextEq {
         schema_for!(TextEq)
     }
 }
-/// `public.text_match` — match domain.
+/// `public.eql_v3_text_match` — match domain.
 ///
 /// Operators: `@>` `<@`. Required keys: `v` `i` `c` `bf`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct TextMatch {
 }
 impl DomainType for TextMatch {
     fn sql_domain_static() -> &'static str {
-        "public.text_match"
+        "public.eql_v3_text_match"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for TextMatch {
         schema_for!(TextMatch)
     }
 }
-/// `public.text_ord_ore` — ordering domain.
+/// `public.eql_v3_text_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -116,7 +116,7 @@ pub struct TextOrdOre {
 }
 impl DomainType for TextOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.text_ord_ore"
+        "public.eql_v3_text_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -134,7 +134,7 @@ impl DomainType for TextOrdOre {
         schema_for!(TextOrdOre)
     }
 }
-/// `public.text_ord` — ordering domain.
+/// `public.eql_v3_text_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -149,7 +149,7 @@ pub struct TextOrd {
 }
 impl DomainType for TextOrd {
     fn sql_domain_static() -> &'static str {
-        "public.text_ord"
+        "public.eql_v3_text_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -167,7 +167,7 @@ impl DomainType for TextOrd {
         schema_for!(TextOrd)
     }
 }
-/// `public.text_ord_ope` — ordering domain.
+/// `public.eql_v3_text_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `hm` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -182,7 +182,7 @@ pub struct TextOrdOpe {
 }
 impl DomainType for TextOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.text_ord_ope"
+        "public.eql_v3_text_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -200,7 +200,7 @@ impl DomainType for TextOrdOpe {
         schema_for!(TextOrdOpe)
     }
 }
-/// `public.text_search` — search domain.
+/// `public.eql_v3_text_search` — search domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=` `@>` `<@`. Required keys: `v` `i` `c` `hm` `ob` `bf`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -216,7 +216,7 @@ pub struct TextSearch {
 }
 impl DomainType for TextSearch {
     fn sql_domain_static() -> &'static str {
-        "public.text_search"
+        "public.eql_v3_text_search"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/src/v3/timestamp.rs b/crates/eql-bindings/src/v3/timestamp.rs
index 5a5b3ce4c..a98fe8060 100644
--- a/crates/eql-bindings/src/v3/timestamp.rs
+++ b/crates/eql-bindings/src/v3/timestamp.rs
@@ -6,7 +6,7 @@ use crate::{Identifier, SchemaVersion};
 use schemars::{schema_for, JsonSchema, Schema};
 use serde::{Deserialize, Serialize};
 use ts_rs::TS;
-/// `public.timestamp` — storage-only domain.
+/// `public.eql_v3_timestamp` — storage-only domain.
 ///
 /// Operators: none. Required keys: `v` `i` `c`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -19,7 +19,7 @@ pub struct Timestamp {
 }
 impl DomainType for Timestamp {
     fn sql_domain_static() -> &'static str {
-        "public.timestamp"
+        "public.eql_v3_timestamp"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -37,7 +37,7 @@ impl DomainType for Timestamp {
         schema_for!(Timestamp)
     }
 }
-/// `public.timestamp_eq` — equality domain.
+/// `public.eql_v3_timestamp_eq` — equality domain.
 ///
 /// Operators: `=` `<>`. Required keys: `v` `i` `c` `hm`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -51,7 +51,7 @@ pub struct TimestampEq {
 }
 impl DomainType for TimestampEq {
     fn sql_domain_static() -> &'static str {
-        "public.timestamp_eq"
+        "public.eql_v3_timestamp_eq"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -69,7 +69,7 @@ impl DomainType for TimestampEq {
         schema_for!(TimestampEq)
     }
 }
-/// `public.timestamp_ord_ore` — ordering domain.
+/// `public.eql_v3_timestamp_ord_ore` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -83,7 +83,7 @@ pub struct TimestampOrdOre {
 }
 impl DomainType for TimestampOrdOre {
     fn sql_domain_static() -> &'static str {
-        "public.timestamp_ord_ore"
+        "public.eql_v3_timestamp_ord_ore"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -101,7 +101,7 @@ impl DomainType for TimestampOrdOre {
         schema_for!(TimestampOrdOre)
     }
 }
-/// `public.timestamp_ord` — ordering domain.
+/// `public.eql_v3_timestamp_ord` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `ob`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -115,7 +115,7 @@ pub struct TimestampOrd {
 }
 impl DomainType for TimestampOrd {
     fn sql_domain_static() -> &'static str {
-        "public.timestamp_ord"
+        "public.eql_v3_timestamp_ord"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
@@ -133,7 +133,7 @@ impl DomainType for TimestampOrd {
         schema_for!(TimestampOrd)
     }
 }
-/// `public.timestamp_ord_ope` — ordering domain.
+/// `public.eql_v3_timestamp_ord_ope` — ordering domain.
 ///
 /// Operators: `=` `<>` `<` `<=` `>` `>=`. Required keys: `v` `i` `c` `op`.
 #[derive(Clone, Debug, PartialEq, Serialize, Deserialize, TS, JsonSchema)]
@@ -147,7 +147,7 @@ pub struct TimestampOrdOpe {
 }
 impl DomainType for TimestampOrdOpe {
     fn sql_domain_static() -> &'static str {
-        "public.timestamp_ord_ope"
+        "public.eql_v3_timestamp_ord_ope"
     }
     fn sql_domain(&self) -> &'static str {
         Self::sql_domain_static()
diff --git a/crates/eql-bindings/tests/catalog_parity.rs b/crates/eql-bindings/tests/catalog_parity.rs
index 5e2d91bc8..5b743905c 100644
--- a/crates/eql-bindings/tests/catalog_parity.rs
+++ b/crates/eql-bindings/tests/catalog_parity.rs
@@ -142,11 +142,11 @@ fn parse_value_validates_through_the_inventory() {
         "c": "mp_base85_ciphertext",
         "hm": "deadbeef"
     });
-    assert!(entry("integer_eq").parse_value(&eq_payload).is_ok());
+    assert!(entry("eql_v3_integer_eq").parse_value(&eq_payload).is_ok());
     // Missing term key fails.
-    assert!(entry("integer_ord").parse_value(&eq_payload).is_err());
+    assert!(entry("eql_v3_integer_ord").parse_value(&eq_payload).is_err());
     // Unknown key fails (deny_unknown_fields is live through the trait).
-    assert!(entry("integer").parse_value(&eq_payload).is_err());
+    assert!(entry("eql_v3_integer").parse_value(&eq_payload).is_err());
 
     let doc = json!({
         "v": 3,
@@ -154,7 +154,7 @@ fn parse_value_validates_through_the_inventory() {
         "i": { "t": "users", "c": "profile" },
         "sv": [ { "s": "sel", "c": "ct", "hm": "deadbeef" } ]
     });
-    assert!(entry("json").parse_value(&doc).is_ok());
+    assert!(entry("eql_v3_json").parse_value(&doc).is_ok());
     assert!(entry("query_jsonb").parse_value(&doc).is_err());
     assert!(entry("query_jsonb")
         .parse_value(&json!({ "sv": [ { "s": "sel", "hm": "deadbeef" } ] }))
@@ -180,12 +180,12 @@ fn schema_id_is_canonical() {
     // Fully-literal anchors — no interpolation, so a typo in the helper's base
     // URL or path cannot match.
     assert_eq!(
-        id_of("integer_eq"),
-        "https://schemas.cipherstash.com/eql/v3/integer_eq.json"
+        id_of("eql_v3_integer_eq"),
+        "https://schemas.cipherstash.com/eql/v3/eql_v3_integer_eq.json"
     );
     assert_eq!(
-        id_of("text_search"),
-        "https://schemas.cipherstash.com/eql/v3/text_search.json"
+        id_of("eql_v3_text_search"),
+        "https://schemas.cipherstash.com/eql/v3/eql_v3_text_search.json"
     );
 
     // Every domain follows the same canonical pattern.
@@ -289,9 +289,9 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() {
 
     // Document: {v, k, i, sv}. No root `c` (a document is not itself a
     // ciphertext); `k` is the "sv" form discriminator (SteVecForm-pinned).
-    let doc = schema_of("json");
+    let doc = schema_of("eql_v3_json");
     assert_eq!(
-        required(&doc, "/required", "json"),
+        required(&doc, "/required", "eql_v3_json"),
         set(&["v", "k", "i", "sv"]),
         "public.json required keys must match the SteVec document wire contract"
     );
@@ -300,9 +300,9 @@ fn jsonb_schema_required_keys_match_the_sql_check_contract() {
     // over {hm} | {oc} (serde/schemars cannot express exclusivity; the SQL CHECK
     // owns the XOR). Assert both the base required set and that BOTH term
     // alternatives are reachable.
-    let entry = schema_of("jsonb_entry");
+    let entry = schema_of("eql_v3_jsonb_entry");
     assert_eq!(
-        required(&entry, "/required", "jsonb_entry"),
+        required(&entry, "/required", "eql_v3_jsonb_entry"),
         set(&["s", "c"]),
         "public.jsonb_entry base required keys must be s + c"
     );
diff --git a/crates/eql-bindings/tests/domain_payload.rs b/crates/eql-bindings/tests/domain_payload.rs
index 3eb82680f..2c7970438 100644
--- a/crates/eql-bindings/tests/domain_payload.rs
+++ b/crates/eql-bindings/tests/domain_payload.rs
@@ -88,12 +88,12 @@ fn assert_serialization_pin(v2: &Value, t: TargetDomain) -> DomainPayload {
 
 #[test]
 fn typed_scalar_single_term_yields_the_matching_variant() {
-    let typed = assert_serialization_pin(&v2_ct_full(), target("integer_eq"));
-    assert_eq!(typed.domain(), "integer_eq");
-    assert_eq!(typed.sql_domain(), "public.integer_eq");
+    let typed = assert_serialization_pin(&v2_ct_full(), target("eql_v3_integer_eq"));
+    assert_eq!(typed.domain(), "eql_v3_integer_eq");
+    assert_eq!(typed.sql_domain(), "public.eql_v3_integer_eq");
     match &typed {
         DomainPayload::IntegerEq(p) => {
-            assert_eq!(p.sql_domain(), "public.integer_eq");
+            assert_eq!(p.sql_domain(), "public.eql_v3_integer_eq");
         }
         other => panic!("expected IntegerEq, got {other:?}"),
     }
@@ -101,8 +101,8 @@ fn typed_scalar_single_term_yields_the_matching_variant() {
 
 #[test]
 fn typed_scalar_multi_term_yields_text_search() {
-    let typed = assert_serialization_pin(&v2_ct_full(), target("text_search"));
-    assert_eq!(typed.domain(), "text_search");
+    let typed = assert_serialization_pin(&v2_ct_full(), target("eql_v3_text_search"));
+    assert_eq!(typed.domain(), "eql_v3_text_search");
     match &typed {
         DomainPayload::TextSearch(p) => {
             // All three terms present — the capability is the type.
@@ -125,8 +125,8 @@ fn typed_scalar_multi_term_yields_text_search() {
 #[test]
 fn typed_ste_vec_document_yields_ste_vec_document() {
     let typed = assert_serialization_pin(&v2_sv(), TargetDomain::Json);
-    assert_eq!(typed.domain(), "json");
-    assert_eq!(typed.sql_domain(), "public.json");
+    assert_eq!(typed.domain(), "eql_v3_json");
+    assert_eq!(typed.sql_domain(), "public.eql_v3_json");
     match &typed {
         DomainPayload::SteVecDocument(doc) => {
             assert_eq!(doc.sv.len(), 2, "entry order/count preserved");
@@ -156,12 +156,12 @@ fn typed_conversion_pins_serialization_for_every_scalar_domain() {
 #[test]
 fn typed_missing_term_fails_closed_exactly_like_from_v2() {
     let minimal = json!({ "v": 2, "k": "ct", "c": CIPHERTEXT, "i": ident() });
-    let typed_err = from_v2_typed(&minimal, target("text_eq")).unwrap_err();
-    let untyped_err = from_v2(&minimal, target("text_eq")).unwrap_err();
+    let typed_err = from_v2_typed(&minimal, target("eql_v3_text_eq")).unwrap_err();
+    let untyped_err = from_v2(&minimal, target("eql_v3_text_eq")).unwrap_err();
     for err in [&typed_err, &untyped_err] {
         match err {
             FromV2Error::MissingTerm { domain, key, entry } => {
-                assert_eq!(domain, "text_eq");
+                assert_eq!(domain, "eql_v3_text_eq");
                 assert_eq!(key, "hm");
                 assert_eq!(entry, &None);
             }
@@ -176,18 +176,18 @@ fn typed_rejects_the_same_inputs_as_from_v2() {
     // conversion path); spot-check each class.
     let v3 = json!({ "v": 3, "i": ident(), "c": CIPHERTEXT, "hm": HEX });
     assert!(matches!(
-        from_v2_typed(&v3, target("text_eq")).unwrap_err(),
+        from_v2_typed(&v3, target("eql_v3_text_eq")).unwrap_err(),
         FromV2Error::UnsupportedVersion { found: Some(3) }
     ));
     assert!(matches!(
-        from_v2_typed(&v2_sv(), target("integer_eq")).unwrap_err(),
+        from_v2_typed(&v2_sv(), target("eql_v3_integer_eq")).unwrap_err(),
         FromV2Error::KindMismatch { .. }
     ));
     // A v2 QUERY payload (no `c`) fails the strict parse — Invalid, exactly
     // like from_v2's validate_as.
     let query = json!({ "v": 2, "k": "ct", "i": ident(), "hm": HEX });
     assert!(matches!(
-        from_v2_typed(&query, target("text_eq")).unwrap_err(),
+        from_v2_typed(&query, target("eql_v3_text_eq")).unwrap_err(),
         FromV2Error::Invalid(_)
     ));
 }
@@ -203,8 +203,8 @@ fn parse_constructs_every_stored_payload_domain() {
     for family in eql_domains::CATALOG {
         for domain in family.domains {
             let name = family.domain_name(domain);
-            let stored = domain.is_scalar() || name == "json";
-            let value = if name == "json" {
+            let stored = domain.is_scalar() || name == "eql_v3_json";
+            let value = if name == "eql_v3_json" {
                 from_v2(&v2_sv(), TargetDomain::Json).unwrap()
             } else if stored {
                 from_v2(&v2_ct_full(), target(&name)).unwrap()
@@ -230,10 +230,10 @@ fn parse_constructs_every_stored_payload_domain() {
 fn parse_returns_none_for_unknown_domains() {
     for name in [
         "int5",
-        "public.integer_eq",
+        "public.eql_v3_integer_eq",
         "",
         "jsonb",
-        "jsonb_entry",
+        "eql_v3_jsonb_entry",
         "query_jsonb",
     ] {
         assert!(
@@ -247,18 +247,18 @@ fn parse_returns_none_for_unknown_domains() {
 fn parse_is_strict_exactly_like_the_binding_struct() {
     // Unknown keys and wrong envelope versions fail — DomainPayload::parse is
     // the binding struct's strict Deserialize, kept instead of discarded.
-    let mut good = from_v2(&v2_ct_full(), target("integer_eq")).unwrap();
-    assert!(DomainPayload::parse("integer_eq", &good).unwrap().is_ok());
+    let mut good = from_v2(&v2_ct_full(), target("eql_v3_integer_eq")).unwrap();
+    assert!(DomainPayload::parse("eql_v3_integer_eq", &good).unwrap().is_ok());
 
     good["extra"] = json!(1);
     assert!(
-        DomainPayload::parse("integer_eq", &good).unwrap().is_err(),
+        DomainPayload::parse("eql_v3_integer_eq", &good).unwrap().is_err(),
         "deny_unknown_fields must reject a stray key"
     );
 
     let wrong_version = json!({ "v": 2, "i": ident(), "c": CIPHERTEXT, "hm": HEX });
     assert!(
-        DomainPayload::parse("integer_eq", &wrong_version)
+        DomainPayload::parse("eql_v3_integer_eq", &wrong_version)
             .unwrap()
             .is_err(),
         "SchemaVersion must reject v: 2"
@@ -267,8 +267,8 @@ fn parse_is_strict_exactly_like_the_binding_struct() {
 
 #[test]
 fn as_domain_type_exposes_the_inner_trait_object() {
-    let typed = from_v2_typed(&v2_ct_full(), target("bigint_ord_ope")).unwrap();
+    let typed = from_v2_typed(&v2_ct_full(), target("eql_v3_bigint_ord_ope")).unwrap();
     let dt: &dyn DomainType = typed.as_domain_type();
-    assert_eq!(dt.sql_domain(), "public.bigint_ord_ope");
-    assert_eq!(dt.domain(), "bigint_ord_ope");
+    assert_eq!(dt.sql_domain(), "public.eql_v3_bigint_ord_ope");
+    assert_eq!(dt.domain(), "eql_v3_bigint_ord_ope");
 }
diff --git a/crates/eql-bindings/tests/from_v2.rs b/crates/eql-bindings/tests/from_v2.rs
index 8605c517d..26afc2682 100644
--- a/crates/eql-bindings/tests/from_v2.rs
+++ b/crates/eql-bindings/tests/from_v2.rs
@@ -79,7 +79,7 @@ fn parse_resolves_every_catalog_scalar_domain_and_json() {
                     matches!(parsed, Ok(TargetDomain::Scalar(_))),
                     "{name} must parse to Scalar, got {parsed:?}"
                 );
-            } else if name == "json" {
+            } else if name == "eql_v3_json" {
                 assert_eq!(parsed.unwrap(), TargetDomain::Json);
             } else {
                 assert!(
@@ -104,10 +104,10 @@ fn parse_rejects_unknown_domain_names() {
 
 #[test]
 fn target_domain_is_copy_and_comparable() {
-    let a = target("integer_eq");
+    let a = target("eql_v3_integer_eq");
     let b = a; // Copy
     assert_eq!(a, b);
-    assert_ne!(a, target("integer"));
+    assert_ne!(a, target("eql_v3_integer"));
     assert_ne!(a, TargetDomain::Json);
 }
 
@@ -117,14 +117,14 @@ fn target_domain_is_copy_and_comparable() {
 
 #[test]
 fn storage_only_scalar_drops_k_and_all_terms() {
-    let out = from_v2(&v2_ct_full(), target("integer")).unwrap();
+    let out = from_v2(&v2_ct_full(), target("eql_v3_integer")).unwrap();
     assert_eq!(out, json!({ "v": 3, "i": ident(), "c": CIPHERTEXT }));
     assert!(is_v3_payload(&out));
 }
 
 #[test]
 fn text_eq_copies_hm_and_drops_the_rest() {
-    let out = from_v2(&v2_ct_full(), target("text_eq")).unwrap();
+    let out = from_v2(&v2_ct_full(), target("eql_v3_text_eq")).unwrap();
     assert_eq!(
         out,
         json!({ "v": 3, "i": ident(), "c": CIPHERTEXT, "hm": HEX })
@@ -134,7 +134,7 @@ fn text_eq_copies_hm_and_drops_the_rest() {
 
 #[test]
 fn integer_ord_ore_copies_ob_verbatim() {
-    let out = from_v2(&v2_ct_full(), target("integer_ord_ore")).unwrap();
+    let out = from_v2(&v2_ct_full(), target("eql_v3_integer_ord_ore")).unwrap();
     assert_eq!(
         out,
         json!({ "v": 3, "i": ident(), "c": CIPHERTEXT, "ob": [HEX, HEX_LONG] })
@@ -144,7 +144,7 @@ fn integer_ord_ore_copies_ob_verbatim() {
 
 #[test]
 fn integer_ord_ope_copies_op_verbatim() {
-    let out = from_v2(&v2_ct_full(), target("integer_ord_ope")).unwrap();
+    let out = from_v2(&v2_ct_full(), target("eql_v3_integer_ord_ope")).unwrap();
     assert_eq!(
         out,
         json!({ "v": 3, "i": ident(), "c": CIPHERTEXT, "op": HEX })
@@ -153,7 +153,7 @@ fn integer_ord_ope_copies_op_verbatim() {
 
 #[test]
 fn text_ord_ope_requires_both_hm_and_op() {
-    let out = from_v2(&v2_ct_full(), target("text_ord_ope")).unwrap();
+    let out = from_v2(&v2_ct_full(), target("eql_v3_text_ord_ope")).unwrap();
     assert_eq!(
         out,
         json!({ "v": 3, "i": ident(), "c": CIPHERTEXT, "hm": HEX, "op": HEX })
@@ -162,7 +162,7 @@ fn text_ord_ope_requires_both_hm_and_op() {
 
 #[test]
 fn text_search_copies_hm_ob_and_bf() {
-    let out = from_v2(&v2_ct_full(), target("text_search")).unwrap();
+    let out = from_v2(&v2_ct_full(), target("eql_v3_text_search")).unwrap();
     assert_eq!(
         out,
         json!({
@@ -179,10 +179,10 @@ fn text_search_copies_hm_ob_and_bf() {
 
 #[test]
 fn missing_required_term_fails_closed() {
-    let err = from_v2(&v2_ct_minimal(), target("text_eq")).unwrap_err();
+    let err = from_v2(&v2_ct_minimal(), target("eql_v3_text_eq")).unwrap_err();
     match err {
         FromV2Error::MissingTerm { domain, key, entry } => {
-            assert_eq!(domain, "text_eq");
+            assert_eq!(domain, "eql_v3_text_eq");
             assert_eq!(key, "hm");
             // Scalar payloads have no sv entries to index.
             assert_eq!(entry, None);
@@ -190,7 +190,7 @@ fn missing_required_term_fails_closed() {
         other => panic!("expected MissingTerm, got {other:?}"),
     }
     // Multi-term domain reports its first absent key.
-    let err = from_v2(&v2_ct_minimal(), target("text_search")).unwrap_err();
+    let err = from_v2(&v2_ct_minimal(), target("eql_v3_text_search")).unwrap_err();
     assert!(matches!(err, FromV2Error::MissingTerm { .. }));
 }
 
@@ -200,7 +200,7 @@ fn bloom_filter_upper_half_reinterprets_as_negative_i16() {
     // 65536-wide filter wraps to negative i16 — 40000 - 65536 = -25536.
     let mut v2 = v2_ct_full();
     v2["bf"] = json!([0, 32767, 32768, 40000, 65535]);
-    let out = from_v2(&v2, target("text_search")).unwrap();
+    let out = from_v2(&v2, target("eql_v3_text_search")).unwrap();
     assert_eq!(out["bf"], json!([0, 32767, -32768, -25536, -1]));
 }
 
@@ -210,7 +210,7 @@ fn bloom_filter_already_signed_values_pass_through() {
     // through unchanged rather than double-wrapping.
     let mut v2 = v2_ct_full();
     v2["bf"] = json!([-1, -32768, 12]);
-    let out = from_v2(&v2, target("text_search")).unwrap();
+    let out = from_v2(&v2, target("eql_v3_text_search")).unwrap();
     assert_eq!(out["bf"], json!([-1, -32768, 12]));
 }
 
@@ -218,7 +218,7 @@ fn bloom_filter_already_signed_values_pass_through() {
 fn bloom_filter_element_above_u16_is_out_of_range() {
     let mut v2 = v2_ct_full();
     v2["bf"] = json!([12, 70000]);
-    let err = from_v2(&v2, target("text_search")).unwrap_err();
+    let err = from_v2(&v2, target("eql_v3_text_search")).unwrap_err();
     match err {
         FromV2Error::BloomOutOfRange { index, value } => {
             assert_eq!(index, 1);
@@ -230,7 +230,7 @@ fn bloom_filter_element_above_u16_is_out_of_range() {
     let mut v2 = v2_ct_full();
     v2["bf"] = json!([-32769]);
     assert!(matches!(
-        from_v2(&v2, target("text_search")).unwrap_err(),
+        from_v2(&v2, target("eql_v3_text_search")).unwrap_err(),
         FromV2Error::BloomOutOfRange { .. }
     ));
 }
@@ -245,7 +245,7 @@ fn bloom_filter_reinterpretation_is_exhaustively_correct() {
     let inputs: Vec = (i64::from(i16::MIN)..=i64::from(u16::MAX)).collect();
     let mut v2 = v2_ct_full();
     v2["bf"] = json!(inputs);
-    let out = from_v2(&v2, target("text_search")).unwrap();
+    let out = from_v2(&v2, target("eql_v3_text_search")).unwrap();
     let out_bf = out["bf"].as_array().unwrap();
     assert_eq!(out_bf.len(), inputs.len());
     for (n, o) in inputs.iter().zip(out_bf) {
@@ -263,7 +263,7 @@ fn bloom_filter_reinterpretation_is_exhaustively_correct() {
         let mut v2 = v2_ct_full();
         v2["bf"] = json!([bad]);
         assert!(matches!(
-            from_v2(&v2, target("text_search")).unwrap_err(),
+            from_v2(&v2, target("eql_v3_text_search")).unwrap_err(),
             FromV2Error::BloomOutOfRange { index: 0, value } if value == bad
         ));
     }
@@ -272,18 +272,18 @@ fn bloom_filter_reinterpretation_is_exhaustively_correct() {
 #[test]
 fn already_v3_input_is_rejected() {
     let v3 = json!({ "v": 3, "i": ident(), "c": CIPHERTEXT, "hm": HEX });
-    let err = from_v2(&v3, target("text_eq")).unwrap_err();
+    let err = from_v2(&v3, target("eql_v3_text_eq")).unwrap_err();
     assert!(
         matches!(err, FromV2Error::UnsupportedVersion { found: Some(3) }),
         "got {err:?}"
     );
     // Non-envelope inputs (no `v` at all) are also unsupported-version.
-    let err = from_v2(&json!({ "hello": "world" }), target("text_eq")).unwrap_err();
+    let err = from_v2(&json!({ "hello": "world" }), target("eql_v3_text_eq")).unwrap_err();
     assert!(matches!(
         err,
         FromV2Error::UnsupportedVersion { found: None }
     ));
-    let err = from_v2(&json!("plaintext"), target("text_eq")).unwrap_err();
+    let err = from_v2(&json!("plaintext"), target("eql_v3_text_eq")).unwrap_err();
     assert!(matches!(err, FromV2Error::UnsupportedVersion { .. }));
 }
 
@@ -292,13 +292,13 @@ fn unknown_or_missing_kind_is_rejected() {
     let mut v2 = v2_ct_full();
     v2["k"] = json!("xx");
     assert!(matches!(
-        from_v2(&v2, target("text_eq")).unwrap_err(),
+        from_v2(&v2, target("eql_v3_text_eq")).unwrap_err(),
         FromV2Error::UnknownKind { .. }
     ));
     let mut v2 = v2_ct_full();
     v2.as_object_mut().unwrap().remove("k");
     assert!(matches!(
-        from_v2(&v2, target("text_eq")).unwrap_err(),
+        from_v2(&v2, target("eql_v3_text_eq")).unwrap_err(),
         FromV2Error::UnknownKind { found: None }
     ));
 }
@@ -307,7 +307,7 @@ fn unknown_or_missing_kind_is_rejected() {
 fn kind_mismatch_is_rejected_in_both_directions() {
     // sv payload for a scalar target.
     assert!(matches!(
-        from_v2(&v2_sv(), target("integer_eq")).unwrap_err(),
+        from_v2(&v2_sv(), target("eql_v3_integer_eq")).unwrap_err(),
         FromV2Error::KindMismatch { .. }
     ));
     // ct payload for the Json target.
@@ -322,7 +322,7 @@ fn v2_query_payload_without_ciphertext_is_rejected_by_from_v2() {
     // A v2 QUERY payload omits `c`; `from_v2` converts STORED payloads only,
     // and the final validation through the binding struct fails closed.
     let query = json!({ "v": 2, "k": "ct", "i": ident(), "hm": HEX });
-    let err = from_v2(&query, target("text_eq")).unwrap_err();
+    let err = from_v2(&query, target("eql_v3_text_eq")).unwrap_err();
     assert!(matches!(err, FromV2Error::Invalid(_)), "got {err:?}");
 }
 
@@ -370,7 +370,7 @@ fn ste_vec_entry_with_neither_term_is_missing() {
     let err = from_v2(&v2, TargetDomain::Json).unwrap_err();
     match err {
         FromV2Error::MissingTerm { domain, key, entry } => {
-            assert_eq!(domain, "json");
+            assert_eq!(domain, "eql_v3_json");
             assert_eq!(key, "hm|oc");
             assert_eq!(entry, Some(1));
         }
@@ -437,16 +437,16 @@ fn scalar_query_hoists_terms_and_storage_only_is_unsupported() {
     // the stored `c`/`k`. A storage-only target has no operators, so it stays
     // UnsupportedQueryTarget.
     let query = json!({ "v": 2, "k": "ct", "i": ident(), "c": CIPHERTEXT, "hm": HEX });
-    let out = from_v2_query(&query, target("text_eq")).expect("text_eq query hoist succeeds");
+    let out = from_v2_query(&query, target("eql_v3_text_eq")).expect("text_eq query hoist succeeds");
     assert_eq!(
         out,
         json!({ "v": 3, "i": ident(), "hm": HEX }),
         "hoist keeps v/i + the hm term, drops c/k"
     );
 
-    let err = from_v2_query(&query, target("boolean")).unwrap_err();
+    let err = from_v2_query(&query, target("eql_v3_boolean")).unwrap_err();
     match err {
-        FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, "boolean"),
+        FromV2Error::UnsupportedQueryTarget { domain } => assert_eq!(domain, "eql_v3_boolean"),
         other => panic!("expected UnsupportedQueryTarget for storage-only, got {other:?}"),
     }
 }
@@ -489,12 +489,12 @@ fn is_v3_payload_is_a_lenient_envelope_probe() {
 fn errors_display_and_implement_std_error() {
     // Hand-rolled Display/Error (no thiserror): every variant renders a
     // non-empty, informative message, and Invalid exposes its serde source.
-    let err = from_v2(&v2_ct_minimal(), target("text_eq")).unwrap_err();
+    let err = from_v2(&v2_ct_minimal(), target("eql_v3_text_eq")).unwrap_err();
     let msg = err.to_string();
-    assert!(msg.contains("text_eq") && msg.contains("hm"), "got {msg:?}");
+    assert!(msg.contains("eql_v3_text_eq") && msg.contains("hm"), "got {msg:?}");
 
     let query = json!({ "v": 2, "k": "ct", "i": ident(), "hm": HEX });
-    let invalid = from_v2(&query, target("text_eq")).unwrap_err();
+    let invalid = from_v2(&query, target("eql_v3_text_eq")).unwrap_err();
     let source = std::error::Error::source(&invalid);
     assert!(
         source.is_some(),
diff --git a/crates/eql-bindings/tests/query_payload.rs b/crates/eql-bindings/tests/query_payload.rs
index 39ed85842..e8764903d 100644
--- a/crates/eql-bindings/tests/query_payload.rs
+++ b/crates/eql-bindings/tests/query_payload.rs
@@ -165,8 +165,12 @@ fn scalar_query_hoist_and_storage_only_unsupported() {
 
             let typed =
                 from_v2_query_typed(&v2, t).unwrap_or_else(|e| panic!("{name} typed hoist: {e:?}"));
-            assert_eq!(typed.domain(), format!("query_{name}"), "{name} domain");
-            assert_eq!(typed.sql_domain(), format!("eql_v3.query_{name}"));
+            // The query twin joins `query_` to the BARE name: the stored
+            // domain's `eql_v3_` version prefix (CIP-3472) never applies to
+            // query operands (the `eql_v3` schema already versions them).
+            let query_name = domain.query_name(family.name);
+            assert_eq!(typed.domain(), query_name, "{name} domain");
+            assert_eq!(typed.sql_domain(), format!("eql_v3.{query_name}"));
             assert_eq!(
                 serde_json::to_value(&typed).unwrap(),
                 out,
@@ -247,9 +251,9 @@ fn parse_returns_none_for_non_query_domains() {
     // Stored-payload domains (DomainPayload territory), the entry shape, and
     // unknown names are not query payloads.
     for name in [
-        "json",
-        "jsonb_entry",
-        "integer_eq",
+        "eql_v3_json",
+        "eql_v3_jsonb_entry",
+        "eql_v3_integer_eq",
         "eql_v3.query_jsonb",
         "",
     ] {
diff --git a/crates/eql-bindings/tests/v3_conformance.rs b/crates/eql-bindings/tests/v3_conformance.rs
index 7665e5c0e..84aba7311 100644
--- a/crates/eql-bindings/tests/v3_conformance.rs
+++ b/crates/eql-bindings/tests/v3_conformance.rs
@@ -17,7 +17,7 @@ fn integer_storage_round_trips() {
     });
     let parsed: Integer = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(Integer::sql_domain_static(), "public.integer");
+    assert_eq!(Integer::sql_domain_static(), "public.eql_v3_integer");
 }
 
 #[test]
@@ -30,7 +30,7 @@ fn integer_eq_round_trips() {
     });
     let parsed: IntegerEq = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(IntegerEq::sql_domain_static(), "public.integer_eq");
+    assert_eq!(IntegerEq::sql_domain_static(), "public.eql_v3_integer_eq");
 }
 
 #[test]
@@ -46,7 +46,7 @@ fn integer_ord_round_trips() {
     // `_ord_ore` is the same shape under the scheme-explicit domain name.
     let parsed: IntegerOrdOre = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(IntegerOrdOre::sql_domain_static(), "public.integer_ord_ore");
+    assert_eq!(IntegerOrdOre::sql_domain_static(), "public.eql_v3_integer_ord_ore");
 }
 
 #[test]
@@ -61,7 +61,7 @@ fn integer_ord_ope_round_trips() {
     });
     let parsed: IntegerOrdOpe = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(IntegerOrdOpe::sql_domain_static(), "public.integer_ord_ope");
+    assert_eq!(IntegerOrdOpe::sql_domain_static(), "public.eql_v3_integer_ord_ope");
 }
 
 #[test]
@@ -234,54 +234,54 @@ fn non_integer_tokens_round_trip_every_domain() {
         }};
     }
 
-    round_trip!(Smallint, storage("a"), "public.smallint");
-    round_trip!(SmallintEq, eq("a"), "public.smallint_eq");
-    round_trip!(SmallintOrd, ord("a"), "public.smallint_ord");
-    round_trip!(SmallintOrdOre, ord("a"), "public.smallint_ord_ore");
-    round_trip!(SmallintOrdOpe, ope("a"), "public.smallint_ord_ope");
+    round_trip!(Smallint, storage("a"), "public.eql_v3_smallint");
+    round_trip!(SmallintEq, eq("a"), "public.eql_v3_smallint_eq");
+    round_trip!(SmallintOrd, ord("a"), "public.eql_v3_smallint_ord");
+    round_trip!(SmallintOrdOre, ord("a"), "public.eql_v3_smallint_ord_ore");
+    round_trip!(SmallintOrdOpe, ope("a"), "public.eql_v3_smallint_ord_ope");
 
-    round_trip!(Bigint, storage("a"), "public.bigint");
-    round_trip!(BigintEq, eq("a"), "public.bigint_eq");
-    round_trip!(BigintOrd, ord("a"), "public.bigint_ord");
-    round_trip!(BigintOrdOre, ord("a"), "public.bigint_ord_ore");
-    round_trip!(BigintOrdOpe, ope("a"), "public.bigint_ord_ope");
+    round_trip!(Bigint, storage("a"), "public.eql_v3_bigint");
+    round_trip!(BigintEq, eq("a"), "public.eql_v3_bigint_eq");
+    round_trip!(BigintOrd, ord("a"), "public.eql_v3_bigint_ord");
+    round_trip!(BigintOrdOre, ord("a"), "public.eql_v3_bigint_ord_ore");
+    round_trip!(BigintOrdOpe, ope("a"), "public.eql_v3_bigint_ord_ope");
 
-    round_trip!(Date, storage("a"), "public.date");
-    round_trip!(DateEq, eq("a"), "public.date_eq");
-    round_trip!(DateOrd, ord("a"), "public.date_ord");
-    round_trip!(DateOrdOre, ord("a"), "public.date_ord_ore");
-    round_trip!(DateOrdOpe, ope("a"), "public.date_ord_ope");
+    round_trip!(Date, storage("a"), "public.eql_v3_date");
+    round_trip!(DateEq, eq("a"), "public.eql_v3_date_eq");
+    round_trip!(DateOrd, ord("a"), "public.eql_v3_date_ord");
+    round_trip!(DateOrdOre, ord("a"), "public.eql_v3_date_ord_ore");
+    round_trip!(DateOrdOpe, ope("a"), "public.eql_v3_date_ord_ope");
 
     // numeric is the first scalar whose native ORE term exceeds 8 blocks (14);
     // the wire shape is identical, so the same `ord` builder applies.
-    round_trip!(Numeric, storage("a"), "public.numeric");
-    round_trip!(NumericEq, eq("a"), "public.numeric_eq");
-    round_trip!(NumericOrd, ord("a"), "public.numeric_ord");
-    round_trip!(NumericOrdOre, ord("a"), "public.numeric_ord_ore");
-    round_trip!(NumericOrdOpe, ope("a"), "public.numeric_ord_ope");
+    round_trip!(Numeric, storage("a"), "public.eql_v3_numeric");
+    round_trip!(NumericEq, eq("a"), "public.eql_v3_numeric_eq");
+    round_trip!(NumericOrd, ord("a"), "public.eql_v3_numeric_ord");
+    round_trip!(NumericOrdOre, ord("a"), "public.eql_v3_numeric_ord_ore");
+    round_trip!(NumericOrdOpe, ope("a"), "public.eql_v3_numeric_ord_ope");
 
     // real/double are the float scalars (renamed from float4/float8); they carry
     // the same ordered-token wire shape as the int scalars (`hm` eq, `ob` ord).
-    round_trip!(Real, storage("a"), "public.real");
-    round_trip!(RealEq, eq("a"), "public.real_eq");
-    round_trip!(RealOrd, ord("a"), "public.real_ord");
-    round_trip!(RealOrdOre, ord("a"), "public.real_ord_ore");
+    round_trip!(Real, storage("a"), "public.eql_v3_real");
+    round_trip!(RealEq, eq("a"), "public.eql_v3_real_eq");
+    round_trip!(RealOrd, ord("a"), "public.eql_v3_real_ord");
+    round_trip!(RealOrdOre, ord("a"), "public.eql_v3_real_ord_ore");
 
-    round_trip!(Double, storage("a"), "public.double");
-    round_trip!(DoubleEq, eq("a"), "public.double_eq");
-    round_trip!(DoubleOrd, ord("a"), "public.double_ord");
-    round_trip!(DoubleOrdOre, ord("a"), "public.double_ord_ore");
+    round_trip!(Double, storage("a"), "public.eql_v3_double");
+    round_trip!(DoubleEq, eq("a"), "public.eql_v3_double_eq");
+    round_trip!(DoubleOrd, ord("a"), "public.eql_v3_double_ord");
+    round_trip!(DoubleOrdOre, ord("a"), "public.eql_v3_double_ord_ore");
 
     // boolean is storage-only (no eq/ord term) — just the shared envelope.
-    round_trip!(Boolean, storage("a"), "public.boolean");
+    round_trip!(Boolean, storage("a"), "public.eql_v3_boolean");
 
     // text_match is covered by `text_match_round_trips_signed_bloom_filter`.
-    round_trip!(Text, storage("a"), "public.text");
-    round_trip!(TextEq, eq("a"), "public.text_eq");
-    round_trip!(TextOrd, text_ord("a"), "public.text_ord");
-    round_trip!(TextOrdOre, text_ord("a"), "public.text_ord_ore");
-    round_trip!(TextOrdOpe, text_ope("a"), "public.text_ord_ope");
-    round_trip!(TextSearch, text_search("a"), "public.text_search");
+    round_trip!(Text, storage("a"), "public.eql_v3_text");
+    round_trip!(TextEq, eq("a"), "public.eql_v3_text_eq");
+    round_trip!(TextOrd, text_ord("a"), "public.eql_v3_text_ord");
+    round_trip!(TextOrdOre, text_ord("a"), "public.eql_v3_text_ord_ore");
+    round_trip!(TextOrdOpe, text_ope("a"), "public.eql_v3_text_ord_ope");
+    round_trip!(TextSearch, text_search("a"), "public.eql_v3_text_search");
 }
 
 #[test]
@@ -304,7 +304,7 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     });
     let parsed: Timestamp = serde_json::from_value(storage.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), storage);
-    assert_eq!(Timestamp::sql_domain_static(), "public.timestamp");
+    assert_eq!(Timestamp::sql_domain_static(), "public.eql_v3_timestamp");
 
     // Equality: envelope + hm.
     let with_hm = json!({
@@ -315,7 +315,7 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     });
     let parsed: TimestampEq = serde_json::from_value(with_hm.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_hm);
-    assert_eq!(TimestampEq::sql_domain_static(), "public.timestamp_eq");
+    assert_eq!(TimestampEq::sql_domain_static(), "public.eql_v3_timestamp_eq");
 
     // Ordered: envelope + ob (a 12-block array on the wire; shape is the same).
     let with_ob = json!({
@@ -326,12 +326,12 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     });
     let parsed: TimestampOrd = serde_json::from_value(with_ob.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_ob);
-    assert_eq!(TimestampOrd::sql_domain_static(), "public.timestamp_ord");
+    assert_eq!(TimestampOrd::sql_domain_static(), "public.eql_v3_timestamp_ord");
     let parsed: TimestampOrdOre = serde_json::from_value(with_ob.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_ob);
     assert_eq!(
         TimestampOrdOre::sql_domain_static(),
-        "public.timestamp_ord_ore"
+        "public.eql_v3_timestamp_ord_ore"
     );
 
     // OPE ordered: envelope + op (a single CLLW-OPE hex string).
@@ -345,7 +345,7 @@ fn timestamp_round_trips_and_enforces_term_capabilities() {
     assert_eq!(serde_json::to_value(&parsed).unwrap(), with_op);
     assert_eq!(
         TimestampOrdOpe::sql_domain_static(),
-        "public.timestamp_ord_ope"
+        "public.eql_v3_timestamp_ord_ope"
     );
 
     // The searchable domains cannot let their term silently become optional.
@@ -386,7 +386,7 @@ fn stevec_document_round_trips_and_enforces_envelope() {
     });
     let parsed: SteVecDocument = serde_json::from_value(wire.clone()).unwrap();
     assert_eq!(serde_json::to_value(&parsed).unwrap(), wire);
-    assert_eq!(SteVecDocument::sql_domain_static(), "public.json");
+    assert_eq!(SteVecDocument::sql_domain_static(), "public.eql_v3_json");
 
     // Envelope negatives (parity with the scalar integer tests) — now including `k`.
     for missing in ["v", "k", "i", "sv"] {
@@ -515,7 +515,7 @@ fn stevec_document_and_query_schemas_are_strict() {
     let sq = serde_json::to_value(q.schema()).unwrap();
     assert_eq!(sq.pointer("/additionalProperties"), Some(&json!(false)));
     // SteVecDocument/Query domain names.
-    assert_eq!(SteVecDocument::sql_domain_static(), "public.json");
+    assert_eq!(SteVecDocument::sql_domain_static(), "public.eql_v3_json");
     assert_eq!(SteVecQuery::sql_domain_static(), "eql_v3.query_jsonb");
 }
 
diff --git a/crates/eql-codegen/src/bindings.rs b/crates/eql-codegen/src/bindings.rs
index 2d4d3f568..eee51f44b 100644
--- a/crates/eql-codegen/src/bindings.rs
+++ b/crates/eql-codegen/src/bindings.rs
@@ -84,7 +84,7 @@ fn capability_label(domain_name: &str) -> &'static str {
 }
 
 /// Render the catalog-derived struct doc lines for a domain: a summary line
-/// (`` `public.` — 
__key` per PostgreSQL's auto-naming. let err = sqlx::query(&format!( - "INSERT INTO v3_unique (id, val) VALUES (3, {p42}::jsonb::public.integer_eq)" + "INSERT INTO v3_unique (id, val) VALUES (3, {p42}::jsonb::public.eql_v3_integer_eq)" )) .execute(&pool) .await @@ -157,7 +159,7 @@ async fn unique_on_integer_eq_column_constrains_raw_payload(pool: PgPool) -> any } // =========================================================================== -// FOREIGN KEY — child referencing a parent `public.integer` PRIMARY KEY column. +// FOREIGN KEY — child referencing a parent `public.eql_v3_integer` PRIMARY KEY column. // // FK on a jsonb-backed domain IS feasible: a PRIMARY KEY / UNIQUE on the parent // column resolves against the base type (`jsonb`) btree opclass (jsonb has a @@ -167,7 +169,7 @@ async fn unique_on_integer_eq_column_constrains_raw_payload(pool: PgPool) -> any // PK/UNIQUE uses the inherited jsonb btree opclass and works. // =========================================================================== -/// A FOREIGN KEY from a child `public.integer` column to a parent `public.integer` +/// A FOREIGN KEY from a child `public.eql_v3_integer` column to a parent `public.eql_v3_integer` /// PRIMARY KEY column: a matching (byte-identical) reference is accepted, a /// dangling reference is rejected (23503). /// @@ -184,8 +186,8 @@ async fn unique_on_integer_eq_column_constrains_raw_payload(pool: PgPool) -> any /// integrity. #[sqlx::test(fixtures(path = "../../fixtures", scripts("eql_v3_integer")))] async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<()> { - // Parent with a PRIMARY KEY on an public.integer (jsonb-backed domain) column. - sqlx::query("CREATE TABLE v3_parent (ref public.integer PRIMARY KEY)") + // Parent with a PRIMARY KEY on an public.eql_v3_integer (jsonb-backed domain) column. + sqlx::query("CREATE TABLE v3_parent (ref public.eql_v3_integer PRIMARY KEY)") .execute(&pool) .await?; @@ -193,7 +195,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( sqlx::query( "CREATE TABLE v3_child ( id bigint PRIMARY KEY, - parent_ref public.integer REFERENCES v3_parent(ref) + parent_ref public.eql_v3_integer REFERENCES v3_parent(ref) )", ) .execute(&pool) @@ -215,7 +217,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( // Seed the parent with the 42-payload. sqlx::query(&format!( - "INSERT INTO v3_parent (ref) VALUES ({p42}::jsonb::public.integer)" + "INSERT INTO v3_parent (ref) VALUES ({p42}::jsonb::public.eql_v3_integer)" )) .execute(&pool) .await?; @@ -223,7 +225,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( // Child row with a byte-identical reference resolves (deterministic fixture // bytes), so the FK is satisfied. sqlx::query(&format!( - "INSERT INTO v3_child (id, parent_ref) VALUES (1, {p42}::jsonb::public.integer)" + "INSERT INTO v3_child (id, parent_ref) VALUES (1, {p42}::jsonb::public.eql_v3_integer)" )) .execute(&pool) .await?; @@ -236,7 +238,7 @@ async fn foreign_key_on_integer_domain_columns(pool: PgPool) -> anyhow::Result<( // Child row referencing a payload NOT present in the parent (different // plaintext → different jsonb) violates the FK (23503). let err = sqlx::query(&format!( - "INSERT INTO v3_child (id, parent_ref) VALUES (2, {p100}::jsonb::public.integer)" + "INSERT INTO v3_child (id, parent_ref) VALUES (2, {p100}::jsonb::public.eql_v3_integer)" )) .execute(&pool) .await diff --git a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs index 9eda3f1ad..bc92bfa28 100644 --- a/tests/sqlx/tests/encrypted_domain/family/inlinability.rs +++ b/tests/sqlx/tests/encrypted_domain/family/inlinability.rs @@ -10,7 +10,7 @@ //! on the *identity predicate*: a `LANGUAGE sql`, `IMMUTABLE` function //! taking at least one argument typed as a jsonb-backed DOMAIN of the //! encrypted-domain families — a domain in the `eql_v3` schema (e.g. -//! `public.integer_eq`). The identity +//! `public.eql_v3_integer_eq`). The identity //! predicate is proconfig-independent — it describes what a function //! intrinsically IS, not whether it has been pinned. //! diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs index 3fe4f31fc..c8d3873aa 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_check.rs @@ -1,7 +1,7 @@ //! Equivalence guards for the inline SteVec domain CHECK expressions //! (issue #354). //! -//! `public.jsonb_entry` carries an INLINE CHECK expression rather than +//! `public.eql_v3_jsonb_entry` carries an INLINE CHECK expression rather than //! calling `public.eql_v3_is_valid_ste_vec_entry_payload`: domain //! constraints cannot inline SQL functions, so the function-call form paid //! the per-call SQL-function executor on every cast — the needle cast in @@ -94,7 +94,7 @@ async fn jsonb_entry_check_matches_validator(pool: PgPool) -> Result<()> { ]; assert_equivalent( &pool, - "public.jsonb_entry", + "public.eql_v3_jsonb_entry", "eql_v3_is_valid_ste_vec_entry_payload", candidates, ) diff --git a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs index 2212787c9..e5524e603 100644 --- a/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs +++ b/tests/sqlx/tests/encrypted_domain/family/jsonb_operator_surface.rs @@ -1,6 +1,6 @@ //! Structural guard for the blocked native-jsonb operator enumeration. //! -//! The storage-only domains (`public.integer`, future scalars) promise that +//! The storage-only domains (`public.eql_v3_integer`, future scalars) promise that //! *every* native jsonb operator is blocked, so an encrypted column can never //! fall through to plaintext-jsonb semantics. That promise rests on the //! enumerated operator surface in `crates/eql-codegen/src/operator_surface.rs` diff --git a/tests/sqlx/tests/encrypted_domain/family/mutations.rs b/tests/sqlx/tests/encrypted_domain/family/mutations.rs index 9fb36d9f2..45e5ddae8 100644 --- a/tests/sqlx/tests/encrypted_domain/family/mutations.rs +++ b/tests/sqlx/tests/encrypted_domain/family/mutations.rs @@ -36,23 +36,23 @@ async fn mutate(pool: &PgPool, ddl: &str) -> Result<()> { // catch a blocker that silently stopped raising. #[sqlx::test] async fn disabling_storage_eq_blocker_flips_blocker_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::public.integer = $2::jsonb::public.integer"; + let sql = "SELECT $1::jsonb::public.eql_v3_integer = $2::jsonb::public.eql_v3_integer"; // Baseline: the storage `=` blocker raises. assert_raises( &pool, sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("public.integer", "="), + &blocker_msg("public.eql_v3_integer", "="), ) .await?; // Mutation: replace the plpgsql blocker with an inlinable SQL body that // returns true. CREATE OR REPLACE keeps the oid, so the `=` operator on - // (public.integer, public.integer) now resolves to this no-raise body. + // (public.eql_v3_integer, public.eql_v3_integer) now resolves to this no-raise body. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3_internal.eq(a public.integer, b public.integer) \ + "CREATE OR REPLACE FUNCTION eql_v3_internal.eq(a public.eql_v3_integer, b public.eql_v3_integer) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -84,8 +84,8 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( JOIN pg_catalog.pg_type lt ON lt.oid = o.oprleft JOIN pg_catalog.pg_type rt ON rt.oid = o.oprright WHERE o.oprname = '=' - AND lt.typname = 'integer_ord' - AND rt.typname = 'integer_ord' + AND lt.typname = 'eql_v3_integer_ord' + AND rt.typname = 'eql_v3_integer_ord' "#, ) .fetch_one(pool) @@ -96,14 +96,14 @@ async fn unsetting_restrict_flips_planner_metadata_arm(pool: PgPool) -> Result<( // Baseline: `=` on (ord, ord) declares a RESTRICT estimator. ensure!( restrict_present(&pool).await?, - "baseline: `=` on public.integer_ord must declare a RESTRICT estimator" + "baseline: `=` on public.eql_v3_integer_ord must declare a RESTRICT estimator" ); // Mutation: unset RESTRICT. DROP OPERATOR would hit COMMUTATOR/NEGATOR // dependency links; ALTER ... SET (RESTRICT = NONE) avoids that. mutate( &pool, - "ALTER OPERATOR = (public.integer_ord, public.integer_ord) SET (RESTRICT = NONE)", + "ALTER OPERATOR = (public.eql_v3_integer_ord, public.eql_v3_integer_ord) SET (RESTRICT = NONE)", ) .await?; @@ -130,7 +130,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul .await?; let count_sql = "SELECT count(*) FROM fixtures.eql_v3_integer \ - WHERE (payload - 'hm')::public.integer_ord = $1::jsonb::public.integer_ord"; + WHERE (payload - 'hm')::public.eql_v3_integer_ord = $1::jsonb::public.eql_v3_integer_ord"; // Baseline: with `hm` stripped, `=` still matches the pivot via `ord_term` // (the `ob` term survives) — exactly one row. @@ -148,7 +148,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // nothing. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.integer_ord, b public.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.eql_v3_integer_ord, b public.eql_v3_integer_ord) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v3_internal.hmac_256(a::jsonb) = eql_v3_internal.hmac_256(b::jsonb) $$", ) @@ -171,7 +171,7 @@ async fn rerouting_ord_eq_through_hm_flips_ord_routes_arm(pool: PgPool) -> Resul // the `supported_null` arm has teeth. #[sqlx::test] async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result<()> { - let sql = "SELECT $1::jsonb::public.integer_eq = $2::jsonb::public.integer_eq"; + let sql = "SELECT $1::jsonb::public.eql_v3_integer_eq = $2::jsonb::public.eql_v3_integer_eq"; // Baseline: STRICT `=` propagates NULL when one side is NULL. assert_null(&pool, sql, &[Some(PLACEHOLDER_PAYLOAD), None]).await?; @@ -180,7 +180,7 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // keeps the oid; the operator now ignores NULL semantics. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.eql_v3_integer_eq, b public.eql_v3_integer_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT true $$", ) .await?; @@ -205,9 +205,10 @@ async fn dropping_strict_on_eq_flips_supported_null_arm(pool: PgPool) -> Result< // sort key. Blocking `<` alone must not disturb ORDER BY. #[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { - let lt_sql = "SELECT $1::jsonb::public.integer_ord < $2::jsonb::public.integer_ord"; + let lt_sql = + "SELECT $1::jsonb::public.eql_v3_integer_ord < $2::jsonb::public.eql_v3_integer_ord"; let order_by_sql = "SELECT plaintext FROM fixtures.eql_v3_integer \ - ORDER BY eql_v3.ord_term(payload::public.integer_ord) ASC"; + ORDER BY eql_v3.ord_term(payload::public.eql_v3_integer_ord) ASC"; let mut ascending: Vec = ::fixture_values().to_vec(); ascending.sort(); @@ -219,8 +220,8 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // post-mutation `assert_raises` below, where the `lt` blocker raises before // the comparator ever inspects the term. let lt_baseline: Option = sqlx::query_scalar( - "SELECT (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $1)::public.integer_ord \ - < (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $2)::public.integer_ord", + "SELECT (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $1)::public.eql_v3_integer_ord \ + < (SELECT payload FROM fixtures.eql_v3_integer WHERE plaintext = $2)::public.eql_v3_integer_ord", ) .bind(ascending[0]) .bind(ascending[1]) @@ -240,9 +241,9 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { // LANGUAGE plpgsql and non-STRICT so the RAISE always fires. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.lt(a public.integer_ord, b public.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.lt(a public.eql_v3_integer_ord, b public.eql_v3_integer_ord) \ RETURNS boolean LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE \ - AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.integer_ord', '<'); END; $$", + AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.eql_v3_integer_ord', '<'); END; $$", ) .await?; @@ -251,7 +252,7 @@ async fn blocking_lt_flips_lt_arm_but_not_order_by(pool: PgPool) -> Result<()> { &pool, lt_sql, &[Some(PLACEHOLDER_PAYLOAD), Some(PLACEHOLDER_PAYLOAD)], - &blocker_msg("public.integer_ord", "<"), + &blocker_msg("public.eql_v3_integer_ord", "<"), ) .await?; @@ -291,7 +292,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { .await?; let count_sql = "SELECT count(*) FROM fixtures.eql_v3_integer \ - WHERE (payload - 'ob')::public.integer_eq = $1::jsonb::public.integer_eq"; + WHERE (payload - 'ob')::public.eql_v3_integer_eq = $1::jsonb::public.eql_v3_integer_eq"; // Baseline: with `ob` stripped, `=` still matches the pivot via `eq_term` // (the `hm` term survives) — exactly one row. @@ -308,7 +309,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { // `eql_v3_internal.ore_block_256(jsonb)` raises rather than matching. mutate( &pool, - "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.integer_eq, b public.integer_eq) \ + "CREATE OR REPLACE FUNCTION eql_v3.eq(a public.eql_v3_integer_eq, b public.eql_v3_integer_eq) \ RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $$ SELECT eql_v3_internal.ore_block_256(a::jsonb) = eql_v3_internal.ore_block_256(b::jsonb) $$", ) @@ -342,7 +343,7 @@ async fn rerouting_eq_eq_through_ob_flips_eq_arm(pool: PgPool) -> Result<()> { #[sqlx::test(fixtures(path = "../../../fixtures", scripts("eql_v3_integer")))] async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { let order_by_desc = "SELECT plaintext FROM fixtures.eql_v3_integer \ - ORDER BY eql_v3.ord_term(payload::public.integer_ord) DESC"; + ORDER BY eql_v3.ord_term(payload::public.eql_v3_integer_ord) DESC"; let mut descending: Vec = ::fixture_values().to_vec(); descending.sort(); @@ -361,7 +362,7 @@ async fn collapsing_ord_term_flips_order_by_arm(pool: PgPool) -> Result<()> { // function body. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a public.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a public.eql_v3_integer_ord) \ RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE \ AS $mutbody$ SELECT eql_v3_internal.ore_block_256('{esc}'::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), @@ -392,9 +393,9 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re const NULL_ROWS: usize = 3; let order_by = format!( "SELECT plaintext FROM ( \ - SELECT plaintext, payload::public.integer_ord AS value FROM fixtures.eql_v3_integer \ + SELECT plaintext, payload::public.eql_v3_integer_ord AS value FROM fixtures.eql_v3_integer \ UNION ALL \ - SELECT NULL::integer, NULL::public.integer_ord FROM generate_series(1, {NULL_ROWS}) \ + SELECT NULL::integer, NULL::public.eql_v3_integer_ord FROM generate_series(1, {NULL_ROWS}) \ ) s \ ORDER BY eql_v3.ord_term(value) ASC NULLS LAST" ); @@ -416,10 +417,10 @@ async fn making_ord_term_non_strict_flips_order_by_nulls_arm(pool: PgPool) -> Re // unchanged. Unique dollar-quote tag guards the embedded jsonb literal. let const_payload = fetch_fixture_payload::(&pool, 0).await?; let ddl = format!( - "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a public.integer_ord) \ + "CREATE OR REPLACE FUNCTION eql_v3.ord_term(a public.eql_v3_integer_ord) \ RETURNS eql_v3_internal.ore_block_256 LANGUAGE sql IMMUTABLE PARALLEL SAFE \ AS $mutbody$ SELECT eql_v3_internal.ore_block_256(\ - coalesce(a, '{esc}'::jsonb::public.integer_ord)::jsonb) $mutbody$", + coalesce(a, '{esc}'::jsonb::public.eql_v3_integer_ord)::jsonb) $mutbody$", esc = const_payload.replace('\'', "''"), ); mutate(&pool, &ddl).await?; diff --git a/tests/sqlx/tests/encrypted_domain/family/support.rs b/tests/sqlx/tests/encrypted_domain/family/support.rs index bc6576d17..59d0037f1 100644 --- a/tests/sqlx/tests/encrypted_domain/family/support.rs +++ b/tests/sqlx/tests/encrypted_domain/family/support.rs @@ -13,7 +13,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { // ordered domains are `[Ore]`-only — ORE is lossless for integers, so `=` // routes through `ord_term`, unlike text where `=` routes through `eq_term`. let storage = ScalarDomainSpec::new::(Variant::Storage); - assert_eq!(storage.sql_domain, "public.integer"); + assert_eq!(storage.sql_domain, "public.eql_v3_integer"); assert!(!storage.supports_eq()); assert!(!storage.supports_ord()); assert_eq!(storage.primary_extractor(), None); @@ -23,7 +23,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { ); let eq = ScalarDomainSpec::new::(Variant::Eq); - assert_eq!(eq.sql_domain, "public.integer_eq"); + assert_eq!(eq.sql_domain, "public.eql_v3_integer_eq"); assert!(eq.supports_eq()); assert!(!eq.supports_ord()); assert_eq!(eq.primary_extractor().as_deref(), Some("eql_v3.eq_term")); @@ -34,7 +34,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { ); let ord = ScalarDomainSpec::new::(Variant::Ord); - assert_eq!(ord.sql_domain, "public.integer_ord"); + assert_eq!(ord.sql_domain, "public.eql_v3_integer_ord"); assert!(ord.supports_ord()); assert_eq!(ord.primary_extractor().as_deref(), Some("eql_v3.ord_term")); // integer_ord is `[Ore]`-only: equality routes through ORE (lossless for ints). @@ -52,7 +52,7 @@ fn variant_derives_consistent_sql_domain_and_capabilities() { ); let ord_ore = ScalarDomainSpec::new::(Variant::OrdOre); - assert_eq!(ord_ore.sql_domain, "public.integer_ord_ore"); + assert_eq!(ord_ore.sql_domain, "public.eql_v3_integer_ord_ore"); assert!(ord_ore.supports_ord()); assert_eq!( ord_ore.primary_extractor().as_deref(), @@ -139,7 +139,7 @@ async fn placeholder_payload_casts_to_every_declared_domain(pool: PgPool) -> Res #[sqlx::test] async fn no_cross_variant_operator_is_declared(pool: PgPool) -> Result<()> { // The SCALAR family deliberately does NOT define ANY operator that mixes - // two different capability variants — e.g. `public.integer_eq = public.integer_ord` + // two different capability variants — e.g. `public.eql_v3_integer_eq = public.eql_v3_integer_ord` // would resolve against jsonb (the ultimate base type) and silently // bypass the per-variant blockers. The query below has no `oprname` // filter, so it catches a cross-variant operator of any kind, not just diff --git a/tests/sqlx/tests/encrypted_domain/float_special.rs b/tests/sqlx/tests/encrypted_domain/float_special.rs index 2e70d2f62..1c1d495f5 100644 --- a/tests/sqlx/tests/encrypted_domain/float_special.rs +++ b/tests/sqlx/tests/encrypted_domain/float_special.rs @@ -41,22 +41,25 @@ async fn encrypt_specials(values: &[F8]) -> Result> { Ok(payloads.into_iter().map(|p| p.to_string()).collect()) } -/// Cast a payload literal to `public.double` and read it back, proving the domain +/// Cast a payload literal to `public.eql_v3_double` and read it back, proving the domain /// CHECK accepts the encrypted special value. async fn cast_passes_check(pool: &PgPool, payload: &str) -> Result<()> { - let sql = "SELECT ($1::jsonb::public.double) IS NOT NULL"; + let sql = "SELECT ($1::jsonb::public.eql_v3_double) IS NOT NULL"; let ok: bool = sqlx::query_scalar(sql) .bind(payload) .fetch_one(pool) .await?; - anyhow::ensure!(ok, "payload failed the public.double CHECK: {payload}"); + anyhow::ensure!( + ok, + "payload failed the public.eql_v3_double CHECK: {payload}" + ); Ok(()) } /// Compare two payloads under an operator on the `_ord` domain, returning the /// boolean result. Used to pin the discovered NaN/±0/±Inf outcomes. async fn ord_cmp(pool: &PgPool, a: &str, op: &str, b: &str) -> Result { - let d = "public.double_ord"; + let d = "public.eql_v3_double_ord"; let sql = format!("SELECT ($1::jsonb::{d} {op} $2::jsonb::{d})"); Ok(sqlx::query_scalar(&sql) .bind(a) @@ -67,7 +70,7 @@ async fn ord_cmp(pool: &PgPool, a: &str, op: &str, b: &str) -> Result { /// Equality under the `_eq` domain (HMAC). async fn eq_cmp(pool: &PgPool, a: &str, b: &str) -> Result { - let d = "public.double_eq"; + let d = "public.eql_v3_double_eq"; let sql = format!("SELECT ($1::jsonb::{d} = $2::jsonb::{d})"); Ok(sqlx::query_scalar(&sql) .bind(a) @@ -85,7 +88,7 @@ async fn setup() -> Result { #[tokio::test] async fn nan_encrypts_and_passes_check() -> Result<()> { // Encrypting f64::NAN succeeds (no panic) and yields a structurally valid - // public.double payload. This is the one universal NaN guarantee. + // public.eql_v3_double payload. This is the one universal NaN guarantee. let pool = setup().await?; let payloads = encrypt_specials(&[F8(f64::NAN)]).await?; assert_eq!(payloads.len(), 1); diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index c36906190..b006a5687 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -64,7 +64,7 @@ async fn jsonb_entry_integer_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result let invalid: i64 = sqlx::query_scalar(&format!( "SELECT COUNT(*) FROM fixtures.v3_doc_integer \ WHERE NOT public.eql_v3_is_valid_ste_vec_entry_payload((payload -> '{SELECTOR}'::text)::jsonb) \ - OR NOT eql_v3.has_ore_cllw((payload -> '{SELECTOR}'::text)::public.jsonb_entry)", + OR NOT eql_v3.has_ore_cllw((payload -> '{SELECTOR}'::text)::public.eql_v3_jsonb_entry)", )) .fetch_one(&pool) .await?; @@ -104,8 +104,8 @@ async fn jsonb_entry_integer_fixture_shape(pool: sqlx::PgPool) -> anyhow::Result #[sqlx::test(fixtures(path = "../../fixtures", scripts("v3_doc_integer")))] async fn jsonb_entry_integer_selector_matches_fixture(pool: sqlx::PgPool) -> anyhow::Result<()> { // The `$.field` ORE-CLLW entry is the sv element carrying `oc`. Cast the - // `public.json` payload to bare jsonb FIRST so `-> 'sv'` is the native array - // accessor, not the custom `public.json -> text` selector-lookup operator. + // `public.eql_v3_json` payload to bare jsonb FIRST so `-> 'sv'` is the native array + // accessor, not the custom `public.eql_v3_json -> text` selector-lookup operator. let live: Vec = sqlx::query_scalar( "SELECT DISTINCT elem ->> 's' \ FROM fixtures.v3_doc_integer, \ @@ -144,8 +144,8 @@ async fn jsonb_entry_integer_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow: FROM fixtures.v3_doc_integer a \ JOIN fixtures.v3_doc_integer b ON a.id < b.id \ WHERE a.plaintext <> b.plaintext \ - AND eql_v3.ore_cllw((a.payload -> '{SELECTOR}'::text)::public.jsonb_entry) \ - = eql_v3.ore_cllw((b.payload -> '{SELECTOR}'::text)::public.jsonb_entry)", + AND eql_v3.ore_cllw((a.payload -> '{SELECTOR}'::text)::public.eql_v3_jsonb_entry) \ + = eql_v3.ore_cllw((b.payload -> '{SELECTOR}'::text)::public.eql_v3_jsonb_entry)", )) .fetch_one(&pool) .await?; @@ -161,7 +161,7 @@ async fn jsonb_entry_integer_ore_cllw_injectivity(pool: sqlx::PgPool) -> anyhow: // driver, which sweeps a bare-jsonb RHS that flattens to native `jsonb < jsonb` // for entries). Builds the ore_cllw functional btree and asserts each ORDERING // op (which inlines to `ore_cllw(value) ore_cllw(const)`) engages it, using -// the domain-cast RHS (`''::public.jsonb_entry`) so the entry operator +// the domain-cast RHS (`''::public.eql_v3_jsonb_entry`) so the entry operator // resolves rather than native jsonb. // // VALIDITY ONLY: forces `enable_seqscan = off` on the ~17-row fixture, so a @@ -179,12 +179,12 @@ async fn jsonb_entry_integer_index_engages(pool: sqlx::PgPool) -> anyhow::Result let lit = payload.replace('\'', "''"); let mut tx = pool.begin().await?; - sqlx::query("CREATE TEMP TABLE entry_idx (value public.jsonb_entry) ON COMMIT DROP") + sqlx::query("CREATE TEMP TABLE entry_idx (value public.eql_v3_jsonb_entry) ON COMMIT DROP") .execute(&mut *tx) .await?; sqlx::query(&format!( "INSERT INTO entry_idx(value) \ - SELECT (payload -> '{sel}'::text)::public.jsonb_entry FROM fixtures.v3_doc_integer", + SELECT (payload -> '{sel}'::text)::public.eql_v3_jsonb_entry FROM fixtures.v3_doc_integer", )) .execute(&mut *tx) .await?; @@ -198,7 +198,7 @@ async fn jsonb_entry_integer_index_engages(pool: sqlx::PgPool) -> anyhow::Result for op in ["<", "<=", ">", ">="] { let query = - format!("SELECT * FROM entry_idx WHERE value {op} '{lit}'::public.jsonb_entry",); + format!("SELECT * FROM entry_idx WHERE value {op} '{lit}'::public.eql_v3_jsonb_entry",); eql_tests::matrix::assert_index_scan_uses( &mut *tx, &query, @@ -228,7 +228,7 @@ async fn jsonb_entry_integer_aggregate_ignores_oc_less_entries( pool: sqlx::PgPool, ) -> anyhow::Result<()> { let sel = SELECTOR; - // A valid public.jsonb_entry that is NOT orderable: string s, string c, + // A valid public.eql_v3_jsonb_entry that is NOT orderable: string s, string c, // exactly one of hm/oc — here `hm`, so `eql_v3.ore_cllw(entry)` is NULL. let oc_less = r#"{"s":"forged","c":"x","hm":"00"}"#; @@ -241,18 +241,18 @@ async fn jsonb_entry_integer_aggregate_ignores_oc_less_entries( let high = *sorted.last().expect("fixture is non-empty"); let mut tx = pool.begin().await?; - sqlx::query("CREATE TEMP TABLE oc_mix (value public.jsonb_entry) ON COMMIT DROP") + sqlx::query("CREATE TEMP TABLE oc_mix (value public.eql_v3_jsonb_entry) ON COMMIT DROP") .execute(&mut *tx) .await?; // SEED position: the oc-less entry is inserted FIRST, so the STRICT seed is // non-orderable — the exact case the sfunc guard must survive. - sqlx::query("INSERT INTO oc_mix(value) VALUES ($1::jsonb::public.jsonb_entry)") + sqlx::query("INSERT INTO oc_mix(value) VALUES ($1::jsonb::public.eql_v3_jsonb_entry)") .bind(oc_less) .execute(&mut *tx) .await?; sqlx::query(&format!( "INSERT INTO oc_mix(value) \ - SELECT (payload -> '{sel}'::text)::public.jsonb_entry \ + SELECT (payload -> '{sel}'::text)::public.eql_v3_jsonb_entry \ FROM fixtures.v3_doc_integer WHERE plaintext IN ({low}, {high})", )) .execute(&mut *tx) @@ -261,13 +261,13 @@ async fn jsonb_entry_integer_aggregate_ignores_oc_less_entries( // Expected extrema: the orderable entries for the smallest / largest integer, // NOT the oc-less seed. let expect_min: String = sqlx::query_scalar(&format!( - "SELECT ((payload -> '{sel}'::text)::public.jsonb_entry)::text \ + "SELECT ((payload -> '{sel}'::text)::public.eql_v3_jsonb_entry)::text \ FROM fixtures.v3_doc_integer WHERE plaintext = {low}", )) .fetch_one(&mut *tx) .await?; let expect_max: String = sqlx::query_scalar(&format!( - "SELECT ((payload -> '{sel}'::text)::public.jsonb_entry)::text \ + "SELECT ((payload -> '{sel}'::text)::public.eql_v3_jsonb_entry)::text \ FROM fixtures.v3_doc_integer WHERE plaintext = {high}", )) .fetch_one(&mut *tx) diff --git a/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs index d0432d513..c186d2ca7 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/bigint_ord_ope.rs @@ -4,8 +4,8 @@ //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer //! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("bigint_ord_ope"); +crate::ope_ord_smoke!("eql_v3_bigint_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("bigint_ord_ope", i64, "eql_v3_bigint"); +crate::ope_ord_fixture_smoke!("eql_v3_bigint_ord_ope", i64, "eql_v3_bigint"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs index eab235383..5c60e79b3 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/date_ord_ope.rs @@ -1,11 +1,11 @@ -//! `public.date_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.eql_v3_date_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer //! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("date_ord_ope"); +crate::ope_ord_smoke!("eql_v3_date_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("date_ord_ope", chrono::NaiveDate, "eql_v3_date"); +crate::ope_ord_fixture_smoke!("eql_v3_date_ord_ope", chrono::NaiveDate, "eql_v3_date"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs index 699f4921b..34c37c290 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/double_ord_ope.rs @@ -1,15 +1,15 @@ -//! `public.double_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.eql_v3_double_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer //! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("double_ord_ope"); +crate::ope_ord_smoke!("eql_v3_double_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. crate::ope_ord_fixture_smoke!( - "double_ord_ope", + "eql_v3_double_ord_ope", eql_tests::scalar_domains::F8, "eql_v3_double" ); diff --git a/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs index e86e9f85d..7fec804bc 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/integer_ord_ope.rs @@ -1,4 +1,4 @@ -//! `public.integer_ord_ope` smoke suite: the shared `_ord_ope` tests plus the +//! `public.eql_v3_integer_ord_ope` smoke suite: the shared `_ord_ope` tests plus the //! deeper single-type behaviour (bytea prefix order, blockers, ORDER BY forms, //! MIN/MAX aggregates) exercised once on the integer reference — the ope surface //! is byte-identical across the ordered families modulo the domain name, so @@ -6,11 +6,11 @@ use crate::ope_support::ope_cast; -crate::ope_ord_smoke!("integer_ord_ope"); +crate::ope_ord_smoke!("eql_v3_integer_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("integer_ord_ope", i32, "eql_v3_integer"); +crate::ope_ord_fixture_smoke!("eql_v3_integer_ord_ope", i32, "eql_v3_integer"); #[sqlx::test] async fn ord_ope_functional_index_engages_for_range_and_equality( @@ -24,13 +24,13 @@ async fn ord_ope_functional_index_engages_for_range_and_equality( // opclass — the same mechanism as `hm` equality. `enable_seqscan = off` // proves usability only (the matrix's scale tests own preference). let mut tx = pool.begin().await?; - sqlx::query("CREATE TABLE ope_idx (id int, payload public.integer_ord_ope)") + sqlx::query("CREATE TABLE ope_idx (id int, payload public.eql_v3_integer_ord_ope)") .execute(&mut *tx) .await?; for (id, op) in [(1, "00"), (2, "0a"), (3, "7f"), (4, "ff"), (5, "ffff")] { sqlx::query(&format!( "INSERT INTO ope_idx VALUES ({id}, ({}))", - ope_cast("integer_ord_ope", "aa", op) + ope_cast("eql_v3_integer_ord_ope", "aa", op) )) .execute(&mut *tx) .await?; @@ -45,7 +45,7 @@ async fn ord_ope_functional_index_engages_for_range_and_equality( for op in ["<", "<=", ">", ">=", "="] { let query = format!( "SELECT id FROM ope_idx WHERE payload {op} ({})", - ope_cast("integer_ord_ope", "aa", "7f") + ope_cast("eql_v3_integer_ord_ope", "aa", "7f") ); eql_tests::matrix::assert_index_scan_uses( &mut *tx, @@ -64,8 +64,8 @@ async fn ord_ope_shorter_prefix_sorts_first(pool: PgPool) -> anyhow::Result<()> // Native bytea semantics: a strict prefix sorts before its extension. let lt: bool = sqlx::query_scalar(&format!( "SELECT ({}) < ({})", - ope_cast("integer_ord_ope", "aa", "00ff"), - ope_cast("integer_ord_ope", "aa", "00ff01") + ope_cast("eql_v3_integer_ord_ope", "aa", "00ff"), + ope_cast("eql_v3_integer_ord_ope", "aa", "00ff01") )) .fetch_one(&pool) .await?; @@ -77,8 +77,8 @@ async fn ord_ope_shorter_prefix_sorts_first(pool: PgPool) -> anyhow::Result<()> async fn ord_ope_blocks_unsupported_operators(pool: PgPool) -> anyhow::Result<()> { let err = sqlx::query(&format!( "SELECT ({}) @> ({})", - ope_cast("integer_ord_ope", "aa", "00"), - ope_cast("integer_ord_ope", "aa", "00") + ope_cast("eql_v3_integer_ord_ope", "aa", "00"), + ope_cast("eql_v3_integer_ord_ope", "aa", "00") )) .execute(&pool) .await @@ -97,14 +97,14 @@ async fn ord_ope_order_by_sorts_by_decoded_bytes(pool: PgPool) -> anyhow::Result // opclass). `ORDER BY col USING <` must REJECT: the design forbids // opclasses on the domains themselves (see the matrix's order_by_using // rejection category). - sqlx::query("CREATE TABLE ope_smoke (id int, payload public.integer_ord_ope)") + sqlx::query("CREATE TABLE ope_smoke (id int, payload public.eql_v3_integer_ord_ope)") .execute(&pool) .await?; // Insert out of byte order: 0xff (3rd), 0x00ff (1st), 0x0100 (2nd). for (id, op) in [(1, "ff"), (2, "00ff"), (3, "0100")] { sqlx::query(&format!( "INSERT INTO ope_smoke VALUES ({id}, ({}))", - ope_cast("integer_ord_ope", "aa", op) + ope_cast("eql_v3_integer_ord_ope", "aa", op) )) .execute(&pool) .await?; @@ -133,13 +133,13 @@ async fn ord_ope_order_by_sorts_by_decoded_bytes(pool: PgPool) -> anyhow::Result #[sqlx::test] async fn ord_ope_min_max_aggregates(pool: PgPool) -> anyhow::Result<()> { - sqlx::query("CREATE TABLE ope_agg (payload public.integer_ord_ope)") + sqlx::query("CREATE TABLE ope_agg (payload public.eql_v3_integer_ord_ope)") .execute(&pool) .await?; for op in ["0a", "00", "ff"] { sqlx::query(&format!( "INSERT INTO ope_agg VALUES (({}))", - ope_cast("integer_ord_ope", "aa", op) + ope_cast("eql_v3_integer_ord_ope", "aa", op) )) .execute(&pool) .await?; diff --git a/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs index 1bf7d7f74..c5d13939e 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/numeric_ord_ope.rs @@ -4,8 +4,12 @@ //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer //! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("numeric_ord_ope"); +crate::ope_ord_smoke!("eql_v3_numeric_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("numeric_ord_ope", rust_decimal::Decimal, "eql_v3_numeric"); +crate::ope_ord_fixture_smoke!( + "eql_v3_numeric_ord_ope", + rust_decimal::Decimal, + "eql_v3_numeric" +); diff --git a/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs index 300905d7f..26e9cbb37 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/real_ord_ope.rs @@ -1,11 +1,15 @@ -//! `public.real_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.eql_v3_real_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer //! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("real_ord_ope"); +crate::ope_ord_smoke!("eql_v3_real_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("real_ord_ope", eql_tests::scalar_domains::F4, "eql_v3_real"); +crate::ope_ord_fixture_smoke!( + "eql_v3_real_ord_ope", + eql_tests::scalar_domains::F4, + "eql_v3_real" +); diff --git a/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs index ec5f17ccc..82fd16b44 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/smallint_ord_ope.rs @@ -4,8 +4,8 @@ //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer //! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("smallint_ord_ope"); +crate::ope_ord_smoke!("eql_v3_smallint_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("smallint_ord_ope", i16, "eql_v3_smallint"); +crate::ope_ord_fixture_smoke!("eql_v3_smallint_ord_ope", i16, "eql_v3_smallint"); diff --git a/tests/sqlx/tests/encrypted_domain/ope/support.rs b/tests/sqlx/tests/encrypted_domain/ope/support.rs index d52aa062e..dc34a60d6 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/support.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/support.rs @@ -267,10 +267,15 @@ macro_rules! ope_ord_fixture_smoke { if let Some(o) = v.as_object_mut() { o.remove("c"); } + // The query twin joins `query_` to the BARE name — the + // `eql_v3_` version prefix (CIP-3472) applies to public-schema + // column types only, not the eql_v3-schema query operands. format!( "'{}'::jsonb::eql_v3.query_{}", v.to_string().replace('\'', "''"), $domain + .strip_prefix(eql_domains::PUBLIC_TYPNAME_PREFIX) + .unwrap_or($domain) ) }; diff --git a/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs index 7c073b93f..2cc37fc0c 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/text_ord_ope.rs @@ -1,15 +1,15 @@ -//! `public.text_ord_ope` smoke suite: the shared `_ord_ope` tests plus the +//! `public.eql_v3_text_ord_ope` smoke suite: the shared `_ord_ope` tests plus the //! text-specific routing contract — `=` / `<>` resolve through `hm` (exact //! HMAC), never the OPE term, because OPE over text is not equality-lossless //! (the same rule as `text_ord`'s `[Hm, Ore]`). use crate::ope_support::ope_cast; -crate::ope_ord_smoke!("text_ord_ope"); +crate::ope_ord_smoke!("eql_v3_text_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. -crate::ope_ord_fixture_smoke!("text_ord_ope", String, "eql_v3_text"); +crate::ope_ord_fixture_smoke!("eql_v3_text_ord_ope", String, "eql_v3_text"); #[sqlx::test] async fn equality_routes_through_hm_not_op(pool: PgPool) -> anyhow::Result<()> { @@ -17,8 +17,8 @@ async fn equality_routes_through_hm_not_op(pool: PgPool) -> anyhow::Result<()> { // not-equal here. let same_hm: bool = sqlx::query_scalar(&format!( "SELECT ({}) = ({})", - ope_cast("text_ord_ope", "deadbeef", "00"), - ope_cast("text_ord_ope", "deadbeef", "ff") + ope_cast("eql_v3_text_ord_ope", "deadbeef", "00"), + ope_cast("eql_v3_text_ord_ope", "deadbeef", "ff") )) .fetch_one(&pool) .await?; @@ -28,8 +28,8 @@ async fn equality_routes_through_hm_not_op(pool: PgPool) -> anyhow::Result<()> { // say equal here. let diff_hm: bool = sqlx::query_scalar(&format!( "SELECT ({}) = ({})", - ope_cast("text_ord_ope", "deadbeef", "00"), - ope_cast("text_ord_ope", "feedface", "00") + ope_cast("eql_v3_text_ord_ope", "deadbeef", "00"), + ope_cast("eql_v3_text_ord_ope", "feedface", "00") )) .fetch_one(&pool) .await?; @@ -38,8 +38,8 @@ async fn equality_routes_through_hm_not_op(pool: PgPool) -> anyhow::Result<()> { // Ordering still routes through op: hm order here disagrees with op order. let lt: bool = sqlx::query_scalar(&format!( "SELECT ({}) < ({})", - ope_cast("text_ord_ope", "feedface", "00"), - ope_cast("text_ord_ope", "deadbeef", "ff") + ope_cast("eql_v3_text_ord_ope", "feedface", "00"), + ope_cast("eql_v3_text_ord_ope", "deadbeef", "ff") )) .fetch_one(&pool) .await?; diff --git a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs index 5f49738cb..7e4bf95e5 100644 --- a/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs +++ b/tests/sqlx/tests/encrypted_domain/ope/timestamp_ord_ope.rs @@ -1,15 +1,15 @@ -//! `public.timestamp_ord_ope` smoke suite — the shared `_ord_ope` literal-payload +//! `public.eql_v3_timestamp_ord_ope` smoke suite — the shared `_ord_ope` literal-payload //! tests (see `ope/support.rs`). The ope surface is byte-identical across the //! ordered families modulo the domain name; the deeper single-type behaviour //! (prefix order, blockers, ORDER BY forms, aggregates) lives on the integer //! reference in `ope/integer_ord_ope.rs`. -crate::ope_ord_smoke!("timestamp_ord_ope"); +crate::ope_ord_smoke!("eql_v3_timestamp_ord_ope"); // Real-ciphertext coverage (CIP-3348): the generated fixture's client-emitted // `op` terms must order and compare like the plaintext oracle. crate::ope_ord_fixture_smoke!( - "timestamp_ord_ope", + "eql_v3_timestamp_ord_ope", chrono::DateTime, "eql_v3_timestamp" ); diff --git a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs index 10ba5b595..3f62e26b2 100644 --- a/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs +++ b/tests/sqlx/tests/encrypted_domain/property/cross_ciphertext.rs @@ -144,7 +144,7 @@ async fn assert_pair_eq_on_ord_ope( a: &Row, b: &Row, ) -> Result<()> { - let domain = format!("public.{}_ord_ope", T::PG_TYPE); + let domain = format!("public.eql_v3_{}_ord_ope", T::PG_TYPE); let a_cast = format!("'{}'::jsonb::{domain}", a.payload_json.replace('\'', "''")); let b_cast = format!("'{}'::jsonb::{domain}", b.payload_json.replace('\'', "''")); let sql = format!("SELECT ({a_cast}) = ({b_cast}), ({a_cast}) <> ({b_cast})"); diff --git a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs index a97731623..6634a4549 100644 --- a/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs +++ b/tests/sqlx/tests/encrypted_domain/property/e2e_oracle.rs @@ -278,8 +278,8 @@ fn real_and_double_share_index_terms_for_the_same_value() -> Result<()> { }; let sql = format!( "SELECT {} = {}", - ord_term(&f4_payloads[0], "public.real_ord_ore"), - ord_term(&f8_payloads[0], "public.double_ord_ore"), + ord_term(&f4_payloads[0], "public.eql_v3_real_ord_ore"), + ord_term(&f8_payloads[0], "public.eql_v3_double_ord_ore"), ); let ore_equal: Option = rt .block_on(sqlx::query_scalar(&sql).fetch_one(&pool)) diff --git a/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs b/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs index abd8b57af..31f3c807a 100644 --- a/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs +++ b/tests/sqlx/tests/encrypted_domain/property/match_smoke.rs @@ -13,7 +13,7 @@ //! fixtures load, exactly like `fixture_oracle.rs`. It is a `#[sqlx::test]` //! (its own migrated scratch DB), so the fixtures load into an isolated database. //! The `Variant` enum models no `_match` member, so the domain -//! (`public.text_match`) is named directly. +//! (`public.eql_v3_text_match`) is named directly. use super::fixture_oracle::load_fixtures; use anyhow::Result; @@ -21,8 +21,8 @@ use eql_tests::property::assert_match_smoke; use eql_tests::scalar_domains::{fetch_fixture_payload, MatchScalar}; use sqlx::PgPool; -/// `public.text_match` — the bloom-filter (`bf`) domain (`@>`/`<@`). -const TEXT_MATCH_DOMAIN: &str = "public.text_match"; +/// `public.eql_v3_text_match` — the bloom-filter (`bf`) domain (`@>`/`<@`). +const TEXT_MATCH_DOMAIN: &str = "public.eql_v3_text_match"; #[sqlx::test] async fn text_match_smoke(pool: PgPool) -> Result<()> { diff --git a/tests/sqlx/tests/encrypted_domain/signed.rs b/tests/sqlx/tests/encrypted_domain/signed.rs index 0eb361b9f..037a7aace 100644 --- a/tests/sqlx/tests/encrypted_domain/signed.rs +++ b/tests/sqlx/tests/encrypted_domain/signed.rs @@ -21,7 +21,7 @@ use sqlx::PgPool; /// `min_pivot() < origin() < max_pivot()` holds through the encrypted `_ord` /// domain's `<` operator (ORE block comparison), spanning the sign boundary. async fn sign_boundary_is_monotonic(pool: &PgPool) -> anyhow::Result<()> { - let d = format!("public.{}_ord", T::PG_TYPE); + let d = format!("public.eql_v3_{}_ord", T::PG_TYPE); // Fixtures straddling the origin: min is below it, max above it. let below = sql_string_literal(&fetch_fixture_payload::(pool, T::min_pivot()).await?); diff --git a/tests/sqlx/tests/encrypted_domain/text/text_match.rs b/tests/sqlx/tests/encrypted_domain/text/text_match.rs index a7343f02d..aac31d5f5 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_match.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_match.rs @@ -1,4 +1,4 @@ -//! Match-containment coverage for `public.text_match` — separate from the +//! Match-containment coverage for `public.eql_v3_text_match` — separate from the //! ordered matrix because `@>` is asymmetric/probabilistic, not a total order. //! Asserts against the generated `eql_v3_text` fixtures (which carry `bf`). use sqlx::PgPool; @@ -18,7 +18,7 @@ async fn payload_for(pool: &PgPool, plaintext: &str) -> anyhow::Result anyhow::Result<()> { let p = payload_for(&pool, "aardvark").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::public.text_match) @> ($1::jsonb::public.text_match)", + "SELECT ($1::jsonb::public.eql_v3_text_match) @> ($1::jsonb::public.eql_v3_text_match)", ) .bind(&p) .fetch_one(&pool) @@ -32,7 +32,7 @@ async fn haystack_contains_substring_needle(pool: PgPool) -> anyhow::Result<()> let hay = payload_for(&pool, "aardvark").await?; let needle = payload_for(&pool, "aard").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match)", + "SELECT ($1::jsonb::public.eql_v3_text_match) @> ($2::jsonb::public.eql_v3_text_match)", ) .bind(&hay) .bind(&needle) @@ -52,7 +52,7 @@ async fn disjoint_value_does_not_match(pool: PgPool) -> anyhow::Result<()> { let hay = payload_for(&pool, "aard").await?; let needle = payload_for(&pool, "zzzz").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match)", + "SELECT ($1::jsonb::public.eql_v3_text_match) @> ($2::jsonb::public.eql_v3_text_match)", ) .bind(&hay) .bind(&needle) @@ -76,7 +76,7 @@ async fn match_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { .execute(&mut *tx) .await?; sqlx::query(&format!( - "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::public.text_match))" + "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::public.eql_v3_text_match))" )) .execute(&mut *tx) .await?; @@ -85,8 +85,8 @@ async fn match_uses_functional_index(pool: PgPool) -> anyhow::Result<()> { // hardcoded query (it interpolates directly and takes no binds). let query = format!( "SELECT 1 FROM {TABLE} \ - WHERE eql_v3.match_term(payload::public.text_match) \ - @> eql_v3.match_term((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::public.text_match)" + WHERE eql_v3.match_term(payload::public.eql_v3_text_match) \ + @> eql_v3.match_term((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::public.eql_v3_text_match)" ); eql_tests::matrix::assert_index_scan_uses( &mut *tx, @@ -112,7 +112,7 @@ async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> .execute(&mut *tx) .await?; sqlx::query(&format!( - "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::public.text_match))" + "CREATE INDEX text_match_idx ON {TABLE} USING gin (eql_v3.match_term(payload::public.eql_v3_text_match))" )) .execute(&mut *tx) .await?; @@ -121,8 +121,8 @@ async fn bare_operator_uses_functional_index(pool: PgPool) -> anyhow::Result<()> // a hardcoded query string (it interpolates directly and takes no binds). let query = format!( "SELECT 1 FROM {TABLE} \ - WHERE (payload::public.text_match) \ - @> ((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::public.text_match)" + WHERE (payload::public.eql_v3_text_match) \ + @> ((SELECT payload::jsonb FROM {TABLE} WHERE plaintext = 'aard')::public.eql_v3_text_match)" ); eql_tests::matrix::assert_index_scan_uses( &mut *tx, @@ -142,7 +142,7 @@ async fn needle_contained_by_haystack(pool: PgPool) -> anyhow::Result<()> { let needle = payload_for(&pool, "aard").await?; let hay = payload_for(&pool, "aardvark").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::public.text_match) <@ ($2::jsonb::public.text_match)", + "SELECT ($1::jsonb::public.eql_v3_text_match) <@ ($2::jsonb::public.eql_v3_text_match)", ) .bind(&needle) .bind(&hay) @@ -165,7 +165,7 @@ async fn disjoint_value_not_contained_by(pool: PgPool) -> anyhow::Result<()> { let needle = payload_for(&pool, "zzzz").await?; let hay = payload_for(&pool, "aard").await?; let hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::public.text_match) <@ ($2::jsonb::public.text_match)", + "SELECT ($1::jsonb::public.eql_v3_text_match) <@ ($2::jsonb::public.eql_v3_text_match)", ) .bind(&needle) .bind(&hay) @@ -186,8 +186,8 @@ async fn contains_and_contained_by_are_commutative(pool: PgPool) -> anyhow::Resu let sup = payload_for(&pool, "aardvark").await?; let sub = payload_for(&pool, "aard").await?; let (contains, contained_by): (bool, bool) = sqlx::query_as( - "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match), - ($2::jsonb::public.text_match) <@ ($1::jsonb::public.text_match)", + "SELECT ($1::jsonb::public.eql_v3_text_match) @> ($2::jsonb::public.eql_v3_text_match), + ($2::jsonb::public.eql_v3_text_match) <@ ($1::jsonb::public.eql_v3_text_match)", ) .bind(&sup) .bind(&sub) @@ -214,9 +214,9 @@ async fn direct_contains_function_matches_operator(pool: PgPool) -> anyhow::Resu let zzzz = payload_for(&pool, "zzzz").await?; let (fn_hit, op_hit, fn_miss): (bool, bool, bool) = sqlx::query_as( - "SELECT eql_v3.contains($1::jsonb::public.text_match, $2::jsonb::public.text_match), - ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match), - eql_v3.contains($1::jsonb::public.text_match, $3::jsonb::public.text_match)", + "SELECT eql_v3.contains($1::jsonb::public.eql_v3_text_match, $2::jsonb::public.eql_v3_text_match), + ($1::jsonb::public.eql_v3_text_match) @> ($2::jsonb::public.eql_v3_text_match), + eql_v3.contains($1::jsonb::public.eql_v3_text_match, $3::jsonb::public.eql_v3_text_match)", ) .bind(&hay) .bind(&aard) @@ -245,9 +245,9 @@ async fn direct_contained_by_function_matches_operator(pool: PgPool) -> anyhow:: let zzzz = payload_for(&pool, "zzzz").await?; let (fn_hit, op_hit, fn_miss): (bool, bool, bool) = sqlx::query_as( - "SELECT eql_v3.contained_by($1::jsonb::public.text_match, $2::jsonb::public.text_match), - ($1::jsonb::public.text_match) <@ ($2::jsonb::public.text_match), - eql_v3.contained_by($3::jsonb::public.text_match, $1::jsonb::public.text_match)", + "SELECT eql_v3.contained_by($1::jsonb::public.eql_v3_text_match, $2::jsonb::public.eql_v3_text_match), + ($1::jsonb::public.eql_v3_text_match) <@ ($2::jsonb::public.eql_v3_text_match), + eql_v3.contained_by($3::jsonb::public.eql_v3_text_match, $1::jsonb::public.eql_v3_text_match)", ) .bind(&aard) .bind(&hay) @@ -282,11 +282,11 @@ async fn mixed_jsonb_domain_overloads_agree(pool: PgPool) -> anyhow::Result<()> // DIFFERENT overload resolves; all must equal the all-domain baseline. let row: (bool, bool, bool, bool, bool) = sqlx::query_as( "SELECT - eql_v3.contains($1::jsonb::public.text_match, $2::jsonb::public.text_match), -- baseline (domain,domain) - eql_v3.contains($1::jsonb::public.text_match, $2::jsonb), -- (domain, jsonb) - eql_v3.contains($1::jsonb, $2::jsonb::public.text_match), -- (jsonb, domain) - eql_v3.contained_by($2::jsonb::public.text_match, $1::jsonb), -- (domain, jsonb) - eql_v3.contained_by($2::jsonb, $1::jsonb::public.text_match) -- (jsonb, domain) + eql_v3.contains($1::jsonb::public.eql_v3_text_match, $2::jsonb::public.eql_v3_text_match), -- baseline (domain,domain) + eql_v3.contains($1::jsonb::public.eql_v3_text_match, $2::jsonb), -- (domain, jsonb) + eql_v3.contains($1::jsonb, $2::jsonb::public.eql_v3_text_match), -- (jsonb, domain) + eql_v3.contained_by($2::jsonb::public.eql_v3_text_match, $1::jsonb), -- (domain, jsonb) + eql_v3.contained_by($2::jsonb, $1::jsonb::public.eql_v3_text_match) -- (jsonb, domain) ", ) .bind(&hay) @@ -328,9 +328,9 @@ async fn direct_functions_propagate_null(pool: PgPool) -> anyhow::Result<()> { // $1 NULL, $2 a real payload — and the reverse — across both functions, both // operand positions, and a mixed jsonb overload. for sql in [ - "SELECT eql_v3.contains($1::jsonb::public.text_match, $2::jsonb::public.text_match)", - "SELECT eql_v3.contained_by($1::jsonb::public.text_match, $2::jsonb::public.text_match)", - "SELECT eql_v3.contains($1::jsonb::public.text_match, $2::jsonb)", // mixed (domain, jsonb) + "SELECT eql_v3.contains($1::jsonb::public.eql_v3_text_match, $2::jsonb::public.eql_v3_text_match)", + "SELECT eql_v3.contained_by($1::jsonb::public.eql_v3_text_match, $2::jsonb::public.eql_v3_text_match)", + "SELECT eql_v3.contains($1::jsonb::public.eql_v3_text_match, $2::jsonb)", // mixed (domain, jsonb) ] { eql_tests::assert_null(&pool, sql, &[None, Some(BF)]).await?; eql_tests::assert_null(&pool, sql, &[Some(BF), None]).await?; @@ -351,7 +351,7 @@ async fn bloom_matches_where_like_would_not(pool: PgPool) -> anyhow::Result<()> // 1. bloom DOES match. let bloom_hit: bool = sqlx::query_scalar( - "SELECT ($1::jsonb::public.text_match) @> ($2::jsonb::public.text_match)", + "SELECT ($1::jsonb::public.eql_v3_text_match) @> ($2::jsonb::public.eql_v3_text_match)", ) .bind(&hay) .bind(&needle) diff --git a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs index 5fe5dd780..54852e558 100644 --- a/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs +++ b/tests/sqlx/tests/encrypted_domain/text/text_smoke.rs @@ -1,24 +1,24 @@ -//! Literal-payload smoke tests for the generated `public.text_match` surface: +//! Literal-payload smoke tests for the generated `public.eql_v3_text_match` surface: //! `@>` / `<@` containment engages (supported wrappers), `=` raises (blocker), //! `~~`/`~~*` are absent (no pattern-match), and the domain CHECK requires `bf`. //! Uses hand-written jsonb payloads carrying `bf` — no encryption/fixtures //! needed. The fixture-backed containment behaviour lives in `text_match.rs`. use sqlx::PgPool; -/// Build a literal `public.text_match` cast expression carrying bloom array +/// Build a literal `public.eql_v3_text_match` cast expression carrying bloom array /// `bf` (e.g. `"[1,2,3]"` or `"[]"`). Lets these tests state set-containment /// semantics directly on `bf` arrays — deterministic, with no encryption and no /// bloom false positives to reason about. fn match_cast(bf: &str) -> String { - format!("'{{\"v\":\"3\",\"i\":{{}},\"c\":\"x\",\"bf\":{bf}}}'::jsonb::public.text_match") + format!("'{{\"v\":\"3\",\"i\":{{}},\"c\":\"x\",\"bf\":{bf}}}'::jsonb::public.eql_v3_text_match") } #[sqlx::test] async fn text_match_at_contains_engages(pool: PgPool) -> anyhow::Result<()> { // self-containment: a filter contains a subset of itself let hit: bool = sqlx::query_scalar( - "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::public.text_match) - @> ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[2]}'::jsonb::public.text_match)", + "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::public.eql_v3_text_match) + @> ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[2]}'::jsonb::public.eql_v3_text_match)", ) .fetch_one(&pool) .await?; @@ -29,8 +29,8 @@ async fn text_match_at_contains_engages(pool: PgPool) -> anyhow::Result<()> { #[sqlx::test] async fn text_match_eq_is_blocked(pool: PgPool) -> anyhow::Result<()> { let err = sqlx::query( - "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::public.text_match) - = ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::public.text_match)", + "SELECT ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::public.eql_v3_text_match) + = ('{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1]}'::jsonb::public.eql_v3_text_match)", ) .execute(&pool) .await @@ -50,8 +50,9 @@ async fn empty_bloom_has_empty_set_semantics(pool: PgPool) -> anyhow::Result<()> // literal payloads so the assertion is deterministic and independent of how // the encryptor renders a `bf` for a degenerate plaintext. const NON_EMPTY: &str = - "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::public.text_match"; - const EMPTY: &str = "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[]}'::jsonb::public.text_match"; + "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[1,2,3]}'::jsonb::public.eql_v3_text_match"; + const EMPTY: &str = + "'{\"v\":\"3\",\"i\":{},\"c\":\"x\",\"bf\":[]}'::jsonb::public.eql_v3_text_match"; let everything_contains_empty: bool = sqlx::query_scalar(&format!("SELECT ({NON_EMPTY}) @> ({EMPTY})")) @@ -80,7 +81,7 @@ async fn match_null_propagates(pool: PgPool) -> anyhow::Result<()> { const BF: &str = r#"{"v":"3","i":{},"c":"x","bf":[1,2,3]}"#; for op in ["@>", "<@"] { let sql = - format!("SELECT ($1::jsonb::public.text_match) {op} ($2::jsonb::public.text_match)"); + format!("SELECT ($1::jsonb::public.eql_v3_text_match) {op} ($2::jsonb::public.eql_v3_text_match)"); eql_tests::assert_null(&pool, &sql, &[None, Some(BF)]).await?; eql_tests::assert_null(&pool, &sql, &[Some(BF), None]).await?; } @@ -157,12 +158,14 @@ async fn text_match_containment_requires_all_elements(pool: PgPool) -> anyhow::R async fn text_match_like_ilike_absent(pool: PgPool) -> anyhow::Result<()> { // The bloom containment surface replaces deprecated `LIKE`/`ILIKE`, but it is // NOT a pattern-match operator. `~~`/`~~*` are deliberately not declared on - // public.text_match, so they resolve to PostgreSQL's "operator does not + // public.eql_v3_text_match, so they resolve to PostgreSQL's "operator does not // exist" rather than an EQL blocker. Pin that they stay absent on the very // domain a `LIKE` user would reach for. const BF: &str = r#"{"v":"3","i":{},"c":"x","bf":[1]}"#; for op in ["~~", "~~*"] { - let sql = format!("SELECT $1::jsonb::public.text_match {op} $2::jsonb::public.text_match"); + let sql = format!( + "SELECT $1::jsonb::public.eql_v3_text_match {op} $2::jsonb::public.eql_v3_text_match" + ); eql_tests::assert_raises( &pool, &sql, @@ -176,14 +179,14 @@ async fn text_match_like_ilike_absent(pool: PgPool) -> anyhow::Result<()> { #[sqlx::test] async fn text_match_payload_check_rejects_missing_bf(pool: PgPool) -> anyhow::Result<()> { - // The generated public.text_match domain CHECK requires the `bf` key + // The generated public.eql_v3_text_match domain CHECK requires the `bf` key // (src/v3/scalars/text/text_types.sql). A well-formed envelope lacking `bf` // must be rejected at the cast, so a match query can never silently run // against a payload that carries no bloom term. const NO_BF: &str = r#"{"v":"3","i":{},"c":"x"}"#; eql_tests::assert_raises( &pool, - "SELECT $1::jsonb::public.text_match", + "SELECT $1::jsonb::public.eql_v3_text_match", &[Some(NO_BF)], "violates check constraint", ) diff --git a/tests/sqlx/tests/lint_tests.rs b/tests/sqlx/tests/lint_tests.rs index 6aaf6e46e..a51f54743 100644 --- a/tests/sqlx/tests/lint_tests.rs +++ b/tests/sqlx/tests/lint_tests.rs @@ -118,15 +118,15 @@ async fn lint_categories_are_well_known(pool: PgPool) -> Result<()> { /// planner can fold or elide the call when the result is provably unused /// (a dead CASE branch, a folded predicate), silently bypassing the RAISE /// and re-enabling the operator. See CLAUDE.md footguns. This test plants -/// a fake LANGUAGE sql blocker on `public.integer` and asserts the lint +/// a fake LANGUAGE sql blocker on `public.eql_v3_integer` and asserts the lint /// surfaces it under category `blocker_language`. #[sqlx::test] async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v3.test_bad_blocker_sql(a public.integer, b public.integer) + CREATE FUNCTION eql_v3.test_bad_blocker_sql(a public.eql_v3_integer, b public.eql_v3_integer) RETURNS boolean LANGUAGE sql IMMUTABLE - AS $$ SELECT eql_v3_internal.encrypted_domain_unsupported_bool('public.integer', '=') $$; + AS $$ SELECT eql_v3_internal.encrypted_domain_unsupported_bool('public.eql_v3_integer', '=') $$; "#, ) .execute(&pool) @@ -156,15 +156,15 @@ async fn lint_flags_blocker_in_language_sql(pool: PgPool) -> Result<()> { /// A blocker marked `STRICT` lets PostgreSQL skip the body and return NULL /// on a NULL argument — silently bypassing the "operator not supported" /// RAISE. See CLAUDE.md footguns. This test plants a fake STRICT plpgsql -/// blocker on `public.integer` and asserts the lint surfaces it under +/// blocker on `public.eql_v3_integer` and asserts the lint surfaces it under /// `blocker_strict`. #[sqlx::test] async fn lint_flags_strict_blocker(pool: PgPool) -> Result<()> { sqlx::query( r#" - CREATE FUNCTION eql_v3.test_bad_blocker_strict(a public.integer, b public.integer) + CREATE FUNCTION eql_v3.test_bad_blocker_strict(a public.eql_v3_integer, b public.eql_v3_integer) RETURNS boolean LANGUAGE plpgsql IMMUTABLE STRICT - AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.integer', '='); END; $$; + AS $$ BEGIN RETURN eql_v3_internal.encrypted_domain_unsupported_bool('public.eql_v3_integer', '='); END; $$; "#, ) .execute(&pool) @@ -208,7 +208,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( | "inlinability_volatility" | "inlinability_set_clause" | "inlinability_secdef" - ) && r.object_name.contains("public.integer") + ) && r.object_name.contains("public.eql_v3_integer") && (r.object_name.contains("operator =(") || r.object_name.contains("operator ->(") || r.object_name.contains("operator ?(")) @@ -231,7 +231,7 @@ async fn lint_does_not_report_generated_blockers_as_inlinability_errors( /// surfaces it under `domain_over_domain`. #[sqlx::test] async fn lint_flags_domain_over_domain(pool: PgPool) -> Result<()> { - sqlx::query(r#"CREATE DOMAIN eql_v3.test_baddom AS public.integer;"#) + sqlx::query(r#"CREATE DOMAIN eql_v3.test_baddom AS public.eql_v3_integer;"#) .execute(&pool) .await?; diff --git a/tests/sqlx/tests/ore_block_comparator_tests.rs b/tests/sqlx/tests/ore_block_comparator_tests.rs index a54fcfbb4..e4ef137a2 100644 --- a/tests/sqlx/tests/ore_block_comparator_tests.rs +++ b/tests/sqlx/tests/ore_block_comparator_tests.rs @@ -306,7 +306,7 @@ async fn numeric_term_is_14_blocks(pool: PgPool) -> Result<()> { let width: i32 = sqlx::query_scalar( "SELECT octet_length((((eql_v3.ord_term( \ (SELECT payload FROM fixtures.eql_v3_numeric WHERE plaintext = (-1000000)::numeric) \ - ::public.numeric_ord)).terms)[1]).bytes)", + ::public.eql_v3_numeric_ord)).terms)[1]).bytes)", ) .fetch_one(&pool) .await?; @@ -343,7 +343,7 @@ async fn numeric_terms_order_like_decimal_ord(pool: PgPool) -> Result<()> { .iter() .map(|v| format!("({v})::numeric")) .collect(); - assert_orders_like_oracle(&pool, "eql_v3_numeric", "numeric_ord", &ascending).await + assert_orders_like_oracle(&pool, "eql_v3_numeric", "eql_v3_numeric_ord", &ascending).await } /// Width + single-pair sanity for the 12-block (timestamp, N=12 => 604 bytes) @@ -353,7 +353,7 @@ async fn timestamp_term_is_12_blocks(pool: PgPool) -> Result<()> { let width: i32 = sqlx::query_scalar( "SELECT octet_length((((eql_v3.ord_term( \ (SELECT payload FROM fixtures.eql_v3_timestamp WHERE plaintext = '1970-01-01T00:00:00Z'::timestamptz) \ - ::public.timestamp_ord)).terms)[1]).bytes)", + ::public.eql_v3_timestamp_ord)).terms)[1]).bytes)", ) .fetch_one(&pool) .await?; @@ -392,7 +392,13 @@ async fn timestamp_terms_order_like_datetime_ord(pool: PgPool) -> Result<()> { .iter() .map(|v| format!("'{v}'::timestamptz")) .collect(); - assert_orders_like_oracle(&pool, "eql_v3_timestamp", "timestamp_ord", &ascending).await + assert_orders_like_oracle( + &pool, + "eql_v3_timestamp", + "eql_v3_timestamp_ord", + &ascending, + ) + .await } /// A real wide-block term must compare equal to itself — the reflexive @@ -404,7 +410,7 @@ async fn wide_block_term_compares_equal_to_itself(pool: PgPool) -> Result<()> { let numeric = compare_fixture_pair( &pool, "eql_v3_numeric", - "numeric_ord", + "eql_v3_numeric_ord", "(1)::numeric", "(1)::numeric", ) @@ -414,7 +420,7 @@ async fn wide_block_term_compares_equal_to_itself(pool: PgPool) -> Result<()> { let timestamp = compare_fixture_pair( &pool, "eql_v3_timestamp", - "timestamp_ord", + "eql_v3_timestamp_ord", "'2000-01-01T00:00:00Z'::timestamptz", "'2000-01-01T00:00:00Z'::timestamptz", ) @@ -430,8 +436,8 @@ async fn wide_block_term_compares_equal_to_itself(pool: PgPool) -> Result<()> { async fn compare_collision_ids(pool: &PgPool, a: i64, b: i64) -> Result { let sql = format!( "SELECT eql_v3_internal.compare_ore_block_256_terms( \ - eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {a})::public.numeric_ord), \ - eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {b})::public.numeric_ord))" + eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {a})::public.eql_v3_numeric_ord), \ + eql_v3.ord_term((SELECT payload FROM fixtures.v3_numeric_collision WHERE id = {b})::public.eql_v3_numeric_ord))" ); Ok(sqlx::query_scalar::<_, i32>(&sql).fetch_one(pool).await?) } diff --git a/tests/sqlx/tests/payload_schema_tests.rs b/tests/sqlx/tests/payload_schema_tests.rs index 6919ebf7c..93770d54e 100644 --- a/tests/sqlx/tests/payload_schema_tests.rs +++ b/tests/sqlx/tests/payload_schema_tests.rs @@ -562,12 +562,12 @@ fn from_v2_scalar_outputs_validate_against_published_v3_schemas() { // schema's signed int16 bounds are exercised on the converted value. let v2 = v2_ct_full(); for domain in [ - "integer", - "text_eq", - "integer_ord_ore", - "text_search", - "integer_ord_ope", - "text_ord_ope", + "eql_v3_integer", + "eql_v3_text_eq", + "eql_v3_integer_ord_ore", + "eql_v3_text_search", + "eql_v3_integer_ord_ope", + "eql_v3_text_ord_ope", ] { assert_converts_to_valid_v3(&v2, domain); } @@ -584,7 +584,7 @@ fn from_v2_ste_vec_output_validates_against_published_v3_schema() { { "s": SELECTOR, "a": true, "c": CIPHERTEXT, "oc": HEX_LONG } ] }); - assert_converts_to_valid_v3(&v2, "json"); + assert_converts_to_valid_v3(&v2, "eql_v3_json"); } #[test] @@ -610,12 +610,12 @@ fn published_v3_schemas_reject_the_unconverted_v2_payloads() { // (v: 2 envelope, stray k/terms), proving the schema validation above is // not vacuously green. assert_invalid( - &load_v3_schema("text_eq"), + &load_v3_schema("eql_v3_text_eq"), &v2_ct_full(), "raw v2 ct payload", ); assert_invalid( - &load_v3_schema("json"), + &load_v3_schema("eql_v3_json"), &json!({ "v": 2, "k": "sv", "i": ident(), "sv": [{ "s": SELECTOR, "c": CIPHERTEXT, "hm": HEX }] diff --git a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs index 000922915..ff8b55371 100644 --- a/tests/sqlx/tests/v3_jsonb_bindings_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_bindings_tests.rs @@ -2,7 +2,7 @@ //! the one test that ties eql-bindings to real cipherstash crypto AND to the //! hand-written src/v3/jsonb/types.sql domain CHECK simultaneously. //! -//! The fixture (`fixtures.v3_ste_vec`, column `payload public.json`) is GENERATED +//! The fixture (`fixtures.v3_ste_vec`, column `payload public.eql_v3_json`) is GENERATED //! by encrypting JSON documents through cipherstash-client's SteVec pipeline //! (`mise run fixture:generate:all`), so this exercises the bindings against the //! same wire shape the domain CHECK (`is_valid_ste_vec_document_payload`) diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs index 9e4c6b8a1..c6965efe5 100644 --- a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -4,12 +4,12 @@ //! This binary reads `pg_operator`, not the fixture. It verifies BOTH sides of //! the surface: //! 1. Every native jsonb operator symbol is either a supported root symbol OR -//! has an `public.json`-bound blocker (so a column can never silently route +//! has an `public.eql_v3_json`-bound blocker (so a column can never silently route //! to plaintext-jsonb semantics). //! 2. Every supported symbol is bound with EXACTLY the intended safe operand //! signatures, and unsupported root-document comparison signatures -//! (`public.json = public.json`, etc.) are blocked. -//! 3. Every blocker is bound to `public.json` with PostgreSQL's real native +//! (`public.eql_v3_json = public.eql_v3_json`, etc.) are blocked. +//! 3. Every blocker is bound to `public.eql_v3_json` with PostgreSQL's real native //! RHS type for that operator. //! //! Design source of truth: @@ -18,11 +18,11 @@ use sqlx::PgPool; use std::collections::BTreeSet; -/// Root-document operator symbols the surface SUPPORTS (an `public.json`-bound +/// Root-document operator symbols the surface SUPPORTS (an `public.eql_v3_json`-bound /// operator, not a blocker). const SUPPORTED_ROOT_SYMBOLS: &[&str] = &["@>", "<@", "->", "->>"]; -/// Entry comparison symbols on `public.jsonb_entry`. +/// Entry comparison symbols on `public.eql_v3_jsonb_entry`. const SUPPORTED_ENTRY_SYMBOLS: &[&str] = &["=", "<>", "<", "<=", ">", ">="]; /// Native jsonb operators the surface BLOCKS (each raises "is not supported"). @@ -36,8 +36,8 @@ async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result = sqlx::query_as( r#" WITH d AS ( - SELECT 'public.json'::regtype AS j, - 'public.jsonb_entry'::regtype AS e, + SELECT 'public.eql_v3_json'::regtype AS j, + 'public.eql_v3_jsonb_entry'::regtype AS e, 'eql_v3.query_jsonb'::regtype AS q ) SELECT o.oprname, @@ -57,10 +57,10 @@ async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result String { match ty { - "\"json\"" => "public.json".to_string(), - "jsonb_entry" => "public.jsonb_entry".to_string(), + "\"json\"" => "public.eql_v3_json".to_string(), + "jsonb_entry" => "public.eql_v3_jsonb_entry".to_string(), "query_jsonb" => "eql_v3.query_jsonb".to_string(), - _ => ty.replace("public.\"json\"", "public.json"), + _ => ty.replace("public.\"json\"", "public.eql_v3_json"), } } @@ -86,11 +86,11 @@ async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<( "expected pg_operator to expose jsonb operators" ); - // The blocked symbols MUST each have an public.json-bound operator. + // The blocked symbols MUST each have an public.eql_v3_json-bound operator. let bound: Vec<(String, String, String)> = v3_jsonb_operators(&pool).await?; let json_bound_symbols: BTreeSet = bound .iter() - .filter(|(_, l, r)| norm(l) == "public.json" || norm(r) == "public.json") + .filter(|(_, l, r)| norm(l) == "public.eql_v3_json" || norm(r) == "public.eql_v3_json") .map(|(n, _, _)| n.clone()) .collect(); @@ -109,9 +109,9 @@ async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<( assert!( unaccounted.is_empty(), "native jsonb operator(s) neither supported, blocked, nor an intentionally-native \ - comparison on public.json: {unaccounted:#?}. Each would route an encrypted column \ + comparison on public.eql_v3_json: {unaccounted:#?}. Each would route an encrypted column \ to native plaintext-jsonb semantics (e.g. key/path extraction). Add a supported \ - wrapper or an public.json-bound blocker." + wrapper or an public.eql_v3_json-bound blocker." ); // And every blocked symbol must actually be bound (no missing blocker). @@ -123,7 +123,7 @@ async fn v3_jsonb_surface_supported_or_blocked(pool: PgPool) -> anyhow::Result<( } assert!( missing_blockers.is_empty(), - "blocked symbol(s) have no public.json-bound operator: {missing_blockers:?}" + "blocked symbol(s) have no public.eql_v3_json-bound operator: {missing_blockers:?}" ); Ok(()) } @@ -143,23 +143,47 @@ async fn v3_jsonb_surface_supported_signatures(pool: PgPool) -> anyhow::Result<( // Exact supported operand signatures (verified against operators.sql). let expected_supported: &[(&str, &str, &str)] = &[ // containment - ("@>", "public.json", "public.json"), - ("@>", "public.json", "eql_v3.query_jsonb"), - ("@>", "public.json", "public.jsonb_entry"), - ("<@", "public.json", "public.json"), - ("<@", "eql_v3.query_jsonb", "public.json"), - ("<@", "public.jsonb_entry", "public.json"), + ("@>", "public.eql_v3_json", "public.eql_v3_json"), + ("@>", "public.eql_v3_json", "eql_v3.query_jsonb"), + ("@>", "public.eql_v3_json", "public.eql_v3_jsonb_entry"), + ("<@", "public.eql_v3_json", "public.eql_v3_json"), + ("<@", "eql_v3.query_jsonb", "public.eql_v3_json"), + ("<@", "public.eql_v3_jsonb_entry", "public.eql_v3_json"), // path access - ("->", "public.json", "text"), - ("->", "public.json", "integer"), - ("->>", "public.json", "text"), + ("->", "public.eql_v3_json", "text"), + ("->", "public.eql_v3_json", "integer"), + ("->>", "public.eql_v3_json", "text"), // entry comparisons - ("=", "public.jsonb_entry", "public.jsonb_entry"), - ("<>", "public.jsonb_entry", "public.jsonb_entry"), - ("<", "public.jsonb_entry", "public.jsonb_entry"), - ("<=", "public.jsonb_entry", "public.jsonb_entry"), - (">", "public.jsonb_entry", "public.jsonb_entry"), - (">=", "public.jsonb_entry", "public.jsonb_entry"), + ( + "=", + "public.eql_v3_jsonb_entry", + "public.eql_v3_jsonb_entry", + ), + ( + "<>", + "public.eql_v3_jsonb_entry", + "public.eql_v3_jsonb_entry", + ), + ( + "<", + "public.eql_v3_jsonb_entry", + "public.eql_v3_jsonb_entry", + ), + ( + "<=", + "public.eql_v3_jsonb_entry", + "public.eql_v3_jsonb_entry", + ), + ( + ">", + "public.eql_v3_jsonb_entry", + "public.eql_v3_jsonb_entry", + ), + ( + ">=", + "public.eql_v3_jsonb_entry", + "public.eql_v3_jsonb_entry", + ), ]; let mut missing: Vec<(&str, &str, &str)> = Vec::new(); @@ -188,7 +212,7 @@ async fn v3_jsonb_surface_root_comparisons_blocked(pool: PgPool) -> anyhow::Resu pg_catalog.format_type(o.oprright, NULL) FROM pg_operator o WHERE o.oprname IN ('=', '<>', '<', '<=', '>', '>=') - AND ('public.json'::regtype IN (o.oprleft, o.oprright)) + AND ('public.eql_v3_json'::regtype IN (o.oprleft, o.oprright)) ORDER BY 1, 2, 3 "#, ) @@ -200,9 +224,9 @@ async fn v3_jsonb_surface_root_comparisons_blocked(pool: PgPool) -> anyhow::Resu .collect(); for op in ["=", "<>", "<", "<=", ">", ">="] { for (l, r) in [ - ("public.json", "public.json"), - ("public.json", "jsonb"), - ("jsonb", "public.json"), + ("public.eql_v3_json", "public.eql_v3_json"), + ("public.eql_v3_json", "jsonb"), + ("jsonb", "public.eql_v3_json"), ] { assert!( have.contains(&(op.to_string(), l.to_string(), r.to_string())), @@ -231,9 +255,9 @@ async fn v3_jsonb_surface_entry_mixed_shapes_absent(pool: PgPool) -> anyhow::Res pg_catalog.format_type(o.oprright, NULL) FROM pg_operator o WHERE o.oprname IN ('=', '<>', '<', '<=', '>', '>=') - AND ('public.jsonb_entry'::regtype IN (o.oprleft, o.oprright)) - AND NOT (o.oprleft = 'public.jsonb_entry'::regtype - AND o.oprright = 'public.jsonb_entry'::regtype) + AND ('public.eql_v3_jsonb_entry'::regtype IN (o.oprleft, o.oprright)) + AND NOT (o.oprleft = 'public.eql_v3_jsonb_entry'::regtype + AND o.oprright = 'public.eql_v3_jsonb_entry'::regtype) "#, ) .fetch_all(&pool) @@ -249,8 +273,8 @@ async fn v3_jsonb_surface_entry_mixed_shapes_absent(pool: PgPool) -> anyhow::Res r#" SELECT o.oprname FROM pg_operator o - WHERE o.oprleft = 'public.jsonb_entry'::regtype - AND o.oprright = 'public.jsonb_entry'::regtype + WHERE o.oprleft = 'public.eql_v3_jsonb_entry'::regtype + AND o.oprright = 'public.eql_v3_jsonb_entry'::regtype "#, ) .fetch_all(&pool) @@ -267,7 +291,7 @@ async fn v3_jsonb_surface_entry_mixed_shapes_absent(pool: PgPool) -> anyhow::Res } // ============================================================================ -// (3) Each blocker is bound to public.json with PostgreSQL's real native RHS +// (3) Each blocker is bound to public.eql_v3_json with PostgreSQL's real native RHS // type for that operator. // ============================================================================ @@ -282,45 +306,45 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> // Exact blocker operand signatures with PostgreSQL's real native RHS types // (verified against blockers.sql and the live catalog). let expected_blockers: &[(&str, &str, &str)] = &[ - ("?", "public.json", "text"), - ("?|", "public.json", "text[]"), - ("?&", "public.json", "text[]"), - ("@?", "public.json", "jsonpath"), - ("@@", "public.json", "jsonpath"), - ("#>", "public.json", "text[]"), - ("#>>", "public.json", "text[]"), - ("-", "public.json", "text"), - ("-", "public.json", "integer"), - ("-", "public.json", "text[]"), - ("#-", "public.json", "text[]"), - ("||", "public.json", "jsonb"), + ("?", "public.eql_v3_json", "text"), + ("?|", "public.eql_v3_json", "text[]"), + ("?&", "public.eql_v3_json", "text[]"), + ("@?", "public.eql_v3_json", "jsonpath"), + ("@@", "public.eql_v3_json", "jsonpath"), + ("#>", "public.eql_v3_json", "text[]"), + ("#>>", "public.eql_v3_json", "text[]"), + ("-", "public.eql_v3_json", "text"), + ("-", "public.eql_v3_json", "integer"), + ("-", "public.eql_v3_json", "text[]"), + ("#-", "public.eql_v3_json", "text[]"), + ("||", "public.eql_v3_json", "jsonb"), // concat is also blocked with the domain on the RIGHT. - ("||", "jsonb", "public.json"), + ("||", "jsonb", "public.eql_v3_json"), // root comparisons are blocked for every typed domain/jsonb shape. - ("=", "public.json", "public.json"), - ("=", "public.json", "jsonb"), - ("=", "jsonb", "public.json"), - ("<>", "public.json", "public.json"), - ("<>", "public.json", "jsonb"), - ("<>", "jsonb", "public.json"), - ("<", "public.json", "public.json"), - ("<", "public.json", "jsonb"), - ("<", "jsonb", "public.json"), - ("<=", "public.json", "public.json"), - ("<=", "public.json", "jsonb"), - ("<=", "jsonb", "public.json"), - (">", "public.json", "public.json"), - (">", "public.json", "jsonb"), - (">", "jsonb", "public.json"), - (">=", "public.json", "public.json"), - (">=", "public.json", "jsonb"), - (">=", "jsonb", "public.json"), + ("=", "public.eql_v3_json", "public.eql_v3_json"), + ("=", "public.eql_v3_json", "jsonb"), + ("=", "jsonb", "public.eql_v3_json"), + ("<>", "public.eql_v3_json", "public.eql_v3_json"), + ("<>", "public.eql_v3_json", "jsonb"), + ("<>", "jsonb", "public.eql_v3_json"), + ("<", "public.eql_v3_json", "public.eql_v3_json"), + ("<", "public.eql_v3_json", "jsonb"), + ("<", "jsonb", "public.eql_v3_json"), + ("<=", "public.eql_v3_json", "public.eql_v3_json"), + ("<=", "public.eql_v3_json", "jsonb"), + ("<=", "jsonb", "public.eql_v3_json"), + (">", "public.eql_v3_json", "public.eql_v3_json"), + (">", "public.eql_v3_json", "jsonb"), + (">", "jsonb", "public.eql_v3_json"), + (">=", "public.eql_v3_json", "public.eql_v3_json"), + (">=", "public.eql_v3_json", "jsonb"), + (">=", "jsonb", "public.eql_v3_json"), // mixed jsonb containment shapes are blocked; safe forms use json, // query_jsonb, or jsonb_entry. - ("@>", "public.json", "jsonb"), - ("@>", "jsonb", "public.json"), - ("<@", "public.json", "jsonb"), - ("<@", "jsonb", "public.json"), + ("@>", "public.eql_v3_json", "jsonb"), + ("@>", "jsonb", "public.eql_v3_json"), + ("<@", "public.eql_v3_json", "jsonb"), + ("<@", "jsonb", "public.eql_v3_json"), ]; let mut missing: Vec<(&str, &str, &str)> = Vec::new(); @@ -334,7 +358,7 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> "expected blocker signature(s) are absent: {missing:#?}" ); - // Every blocked symbol's public.json-bound operator backs a non-STRICT + // Every blocked symbol's public.eql_v3_json-bound operator backs a non-STRICT // plpgsql blocker function (proisstrict = false), so a NULL domain operand // still raises rather than short-circuiting to NULL. let strict_offenders: Vec<(String, String)> = sqlx::query_as( @@ -342,7 +366,7 @@ async fn v3_jsonb_surface_blocker_signatures(pool: PgPool) -> anyhow::Result<()> SELECT o.oprname, p.proname FROM pg_operator o JOIN pg_proc p ON p.oid = o.oprcode - WHERE ('public.json'::regtype IN (o.oprleft, o.oprright)) + WHERE ('public.eql_v3_json'::regtype IN (o.oprleft, o.oprright)) AND o.oprname IN ('?', '?|', '?&', '@?', '@@', '#>', '#>>', '-', '#-', '||', '=', '<>', '<', '<=', '>', '>=', '@>', '<@') AND p.proname LIKE 'jsonb_blocked%' @@ -453,8 +477,8 @@ async fn assert_composed_blocked(pool: &PgPool, sql: &str) -> anyhow::Result<()> #[sqlx::test] async fn v3_jsonb_blocked_composed_expression_raises(pool: PgPool) -> anyhow::Result<()> { - // A valid public.json document literal (empty sv array satisfies the CHECK). - let j = r#"'{"i":{},"v":3,"sv":[]}'::public.json"#; + // A valid public.eql_v3_json document literal (empty sv array satisfies the CHECK). + let j = r#"'{"i":{},"v":3,"sv":[]}'::public.eql_v3_json"#; // Each case wraps a blocked operator (whose return type was boolean before // the fix) in a surrounding operator that only resolves against the NATIVE diff --git a/tests/sqlx/tests/v3_jsonb_tests.rs b/tests/sqlx/tests/v3_jsonb_tests.rs index fbbe163e2..9cbce02e8 100644 --- a/tests/sqlx/tests/v3_jsonb_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_tests.rs @@ -1,5 +1,5 @@ //! Parameterized test harness for the `eql_v3` encrypted-JSONB (SteVec) surface -//! (`public.json` / `public.jsonb_entry` / `eql_v3.query_jsonb`). +//! (`public.eql_v3_json` / `public.eql_v3_jsonb_entry` / `eql_v3.query_jsonb`). //! //! Design source of truth: //! `docs/superpowers/plans/2026-06-09-eql-v3-jsonb-test-harness-design.md`. @@ -10,7 +10,7 @@ //! `{scalar type}`, because a SteVec value is a *document* (a collection of //! leaves addressed by selector), so it does not fit `scalar_matrix!`. //! -//! CRITICAL correctness rule: `public.json` is a DOMAIN over `jsonb`. +//! CRITICAL correctness rule: `public.eql_v3_json` is a DOMAIN over `jsonb`. //! PostgreSQL resolves `domain OP untyped_literal` to the NATIVE jsonb operator //! (the domain flattens to its base type for unknown-typed literals). So every //! `->`/`->>` selector operand and every blocker RHS operand below is @@ -93,7 +93,7 @@ fn oc_entry(oc_hex: &str) -> String { entry(SEL_HELLO_OC, "oc", oc_hex) } -/// Build a document literal (`public.json`-shaped) wrapping the given sv element +/// Build a document literal (`public.eql_v3_json`-shaped) wrapping the given sv element /// literals (each already a JSON object string). fn doc(elems: &[String]) -> String { format!( @@ -146,23 +146,23 @@ macro_rules! v3_jsonb_eq_correctness { // = is true iff terms equal. let eq_same: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::public.jsonb_entry = '{same_b}'::public.jsonb_entry" + "SELECT '{same_a}'::public.eql_v3_jsonb_entry = '{same_b}'::public.eql_v3_jsonb_entry" )).fetch_one(&pool).await?; assert!(eq_same, "{} entries with equal terms must be =", $field); let eq_diff: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::public.jsonb_entry = '{diff_b}'::public.jsonb_entry" + "SELECT '{same_a}'::public.eql_v3_jsonb_entry = '{diff_b}'::public.eql_v3_jsonb_entry" )).fetch_one(&pool).await?; assert!(!eq_diff, "{} entries with differing terms must NOT be =", $field); // <> is the exact negation of =. let neq_same: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::public.jsonb_entry <> '{same_b}'::public.jsonb_entry" + "SELECT '{same_a}'::public.eql_v3_jsonb_entry <> '{same_b}'::public.eql_v3_jsonb_entry" )).fetch_one(&pool).await?; assert!(!neq_same, "<> must be false when terms equal"); let neq_diff: bool = sqlx::query_scalar(&format!( - "SELECT '{same_a}'::public.jsonb_entry <> '{diff_b}'::public.jsonb_entry" + "SELECT '{same_a}'::public.eql_v3_jsonb_entry <> '{diff_b}'::public.eql_v3_jsonb_entry" )).fetch_one(&pool).await?; assert!(neq_diff, "<> must be true when terms differ"); @@ -200,21 +200,21 @@ macro_rules! v3_jsonb_ord_correctness { // mid `op` (something strictly greater): the "lo < hi" position. let against_greater: bool = sqlx::query_scalar(&format!( - "SELECT '{mid}'::public.jsonb_entry {} '{hi}'::public.jsonb_entry", $op + "SELECT '{mid}'::public.eql_v3_jsonb_entry {} '{hi}'::public.eql_v3_jsonb_entry", $op )).fetch_one(&pool).await?; assert_eq!(against_greater, $lo_rel, "oc {} against a strictly-greater leaf", $op); // mid `op` (equal term). let against_equal: bool = sqlx::query_scalar(&format!( - "SELECT '{mid}'::public.jsonb_entry {} '{lo}'::public.jsonb_entry", $op + "SELECT '{mid}'::public.eql_v3_jsonb_entry {} '{lo}'::public.eql_v3_jsonb_entry", $op )).fetch_one(&pool).await?; assert_eq!(against_equal, $eq_rel, "oc {} against an equal-term leaf", $op); // hi `op` (something strictly smaller). let against_smaller: bool = sqlx::query_scalar(&format!( - "SELECT '{hi}'::public.jsonb_entry {} '{lo}'::public.jsonb_entry", $op + "SELECT '{hi}'::public.eql_v3_jsonb_entry {} '{lo}'::public.eql_v3_jsonb_entry", $op )).fetch_one(&pool).await?; assert_eq!(against_smaller, $hi_rel, "oc {} against a strictly-smaller leaf", $op); @@ -240,7 +240,7 @@ async fn v3_jsonb_oc_ladder_is_total_order(pool: PgPool) -> anyhow::Result<()> { let lo = oc_entry(w[0]); let hi = oc_entry(w[1]); let ok: bool = sqlx::query_scalar(&format!( - "SELECT '{lo}'::public.jsonb_entry < '{hi}'::public.jsonb_entry" + "SELECT '{lo}'::public.eql_v3_jsonb_entry < '{hi}'::public.eql_v3_jsonb_entry" )) .fetch_one(&pool) .await?; @@ -254,7 +254,7 @@ async fn v3_jsonb_oc_ladder_is_total_order(pool: PgPool) -> anyhow::Result<()> { let first = oc_entry(OC_LADDER[0]); let last = oc_entry(OC_LADDER[OC_LADDER.len() - 1]); let end: bool = sqlx::query_scalar(&format!( - "SELECT '{first}'::public.jsonb_entry < '{last}'::public.jsonb_entry" + "SELECT '{first}'::public.eql_v3_jsonb_entry < '{last}'::public.eql_v3_jsonb_entry" )) .fetch_one(&pool) .await?; @@ -277,7 +277,7 @@ async fn v3_jsonb_entry_entry_shape_resolves(pool: PgPool) -> anyhow::Result<()> // Each of the six entry operators resolves on (entry, entry) and returns bool. for op in ["=", "<>", "<", "<=", ">", ">="] { let _v: bool = sqlx::query_scalar(&format!( - "SELECT '{a}'::public.jsonb_entry {op} '{b}'::public.jsonb_entry" + "SELECT '{a}'::public.eql_v3_jsonb_entry {op} '{b}'::public.eql_v3_jsonb_entry" )) .fetch_one(&pool) .await?; @@ -426,7 +426,7 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // Self-containment (json @> json). let self_c: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::public.json @> '{full}'::public.json" + "SELECT '{full}'::public.eql_v3_json @> '{full}'::public.eql_v3_json" )) .fetch_one(&pool) .await?; @@ -434,12 +434,12 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // Superset @> subset, and commutator subset <@ superset. let sup: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::public.json @> '{subset}'::public.json" + "SELECT '{full}'::public.eql_v3_json @> '{subset}'::public.eql_v3_json" )) .fetch_one(&pool) .await?; let sub: bool = sqlx::query_scalar(&format!( - "SELECT '{subset}'::public.json <@ '{full}'::public.json" + "SELECT '{subset}'::public.eql_v3_json <@ '{full}'::public.eql_v3_json" )) .fetch_one(&pool) .await?; @@ -450,7 +450,7 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // Subset does NOT contain superset. let backwards: bool = sqlx::query_scalar(&format!( - "SELECT '{subset}'::public.json @> '{full}'::public.json" + "SELECT '{subset}'::public.eql_v3_json @> '{full}'::public.eql_v3_json" )) .fetch_one(&pool) .await?; @@ -459,12 +459,12 @@ async fn v3_jsonb_containment_self_and_subset(pool: PgPool) -> anyhow::Result<() // entry-needle overload (json @> jsonb_entry) + reverse (entry <@ json). let ent = entry(SEL_ROOT_HM, "hm", HM_TERM_FORGED); let by_entry: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::public.json @> '{ent}'::public.jsonb_entry" + "SELECT '{full}'::public.eql_v3_json @> '{ent}'::public.eql_v3_jsonb_entry" )) .fetch_one(&pool) .await?; let by_entry_rev: bool = sqlx::query_scalar(&format!( - "SELECT '{ent}'::public.jsonb_entry <@ '{full}'::public.json" + "SELECT '{ent}'::public.eql_v3_jsonb_entry <@ '{full}'::public.eql_v3_json" )) .fetch_one(&pool) .await?; @@ -523,7 +523,7 @@ async fn v3_jsonb_raw_helpers_contains_and_contained_by(pool: PgPool) -> anyhow: // The raw helper must agree with the typed `@>` operator (which binds to // eql_v3.ste_vec_contains, not this function) on the same well-formed inputs. let typed: bool = sqlx::query_scalar(&format!( - "SELECT '{full}'::public.json @> '{subset}'::public.json" + "SELECT '{full}'::public.eql_v3_json @> '{subset}'::public.eql_v3_json" )) .fetch_one(&pool) .await?; @@ -543,7 +543,7 @@ async fn v3_jsonb_raw_helpers_contains_and_contained_by(pool: PgPool) -> anyhow: async fn v3_jsonb_has_ore_cllw_entry_branches(pool: PgPool) -> anyhow::Result<()> { let with_oc = oc_entry(OC_LADDER[0]); let has_oc: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.has_ore_cllw('{with_oc}'::public.jsonb_entry)" + "SELECT eql_v3.has_ore_cllw('{with_oc}'::public.eql_v3_jsonb_entry)" )) .fetch_one(&pool) .await?; @@ -551,7 +551,7 @@ async fn v3_jsonb_has_ore_cllw_entry_branches(pool: PgPool) -> anyhow::Result<() let hm_only = entry(SEL_ROOT_HM, "hm", HM_TERM_FORGED); let has_no_oc: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.has_ore_cllw('{hm_only}'::public.jsonb_entry)" + "SELECT eql_v3.has_ore_cllw('{hm_only}'::public.eql_v3_jsonb_entry)" )) .fetch_one(&pool) .await?; @@ -664,12 +664,12 @@ async fn v3_jsonb_containment_rejects_wrong_term_type(pool: PgPool) -> anyhow::R let oc_needle = needle(&[(COLLIDE_SEL, "oc", COLLIDE_TERM)]); let hm_needle = needle(&[(COLLIDE_SEL, "hm", COLLIDE_TERM)]); let collide_accept: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::public.json @> '{hm_needle}'::eql_v3.query_jsonb" + "SELECT '{hm_doc}'::public.eql_v3_json @> '{hm_needle}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; let collide_reject: bool = sqlx::query_scalar(&format!( - "SELECT '{hm_doc}'::public.json @> '{oc_needle}'::eql_v3.query_jsonb" + "SELECT '{hm_doc}'::public.eql_v3_json @> '{oc_needle}'::eql_v3.query_jsonb" )) .fetch_one(&pool) .await?; @@ -793,23 +793,23 @@ const NN_DOC: &str = r#"{"i":{},"v":3,"sv":[]}"#; v3_jsonb_supported_null!( // entry comparisons (= <> < <= > >=), NULL on each side - (entry_eq_lhs, "SELECT NULL::public.jsonb_entry = '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.jsonb_entry"), - (entry_eq_rhs, "SELECT '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.jsonb_entry = NULL::public.jsonb_entry"), - (entry_neq_lhs, "SELECT NULL::public.jsonb_entry <> '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.jsonb_entry"), - (entry_lt_lhs, "SELECT NULL::public.jsonb_entry < '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), - (entry_lte_lhs, "SELECT NULL::public.jsonb_entry <= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), - (entry_gt_lhs, "SELECT NULL::public.jsonb_entry > '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), - (entry_gte_lhs, "SELECT NULL::public.jsonb_entry >= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.jsonb_entry"), + (entry_eq_lhs, "SELECT NULL::public.eql_v3_jsonb_entry = '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.eql_v3_jsonb_entry"), + (entry_eq_rhs, "SELECT '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.eql_v3_jsonb_entry = NULL::public.eql_v3_jsonb_entry"), + (entry_neq_lhs, "SELECT NULL::public.eql_v3_jsonb_entry <> '{\"s\":\"r\",\"c\":\"x\",\"hm\":\"00\"}'::public.eql_v3_jsonb_entry"), + (entry_lt_lhs, "SELECT NULL::public.eql_v3_jsonb_entry < '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.eql_v3_jsonb_entry"), + (entry_lte_lhs, "SELECT NULL::public.eql_v3_jsonb_entry <= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.eql_v3_jsonb_entry"), + (entry_gt_lhs, "SELECT NULL::public.eql_v3_jsonb_entry > '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.eql_v3_jsonb_entry"), + (entry_gte_lhs, "SELECT NULL::public.eql_v3_jsonb_entry >= '{\"s\":\"r\",\"c\":\"x\",\"oc\":\"00\"}'::public.eql_v3_jsonb_entry"), // document containment: json @> json - (doc_contains_doc_lhs, "SELECT NULL::public.json @> '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), - (doc_contains_doc_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.json"), + (doc_contains_doc_lhs, "SELECT NULL::public.eql_v3_json @> '{\"i\":{},\"v\":3,\"sv\":[]}'::public.eql_v3_json"), + (doc_contains_doc_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.eql_v3_json @> NULL::public.eql_v3_json"), // json @> query_jsonb / json @> jsonb_entry - (doc_contains_query_lhs, "SELECT NULL::public.json @> '{\"sv\":[]}'::eql_v3.query_jsonb"), - (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::eql_v3.query_jsonb"), - (doc_contains_entry_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json @> NULL::public.jsonb_entry"), + (doc_contains_query_lhs, "SELECT NULL::public.eql_v3_json @> '{\"sv\":[]}'::eql_v3.query_jsonb"), + (doc_contains_query_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.eql_v3_json @> NULL::eql_v3.query_jsonb"), + (doc_contains_entry_rhs, "SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.eql_v3_json @> NULL::public.eql_v3_jsonb_entry"), // <@ reverses - (query_contained_lhs, "SELECT NULL::eql_v3.query_jsonb <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), - (entry_contained_lhs, "SELECT NULL::public.jsonb_entry <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json"), + (query_contained_lhs, "SELECT NULL::eql_v3.query_jsonb <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.eql_v3_json"), + (entry_contained_lhs, "SELECT NULL::public.eql_v3_jsonb_entry <@ '{\"i\":{},\"v\":3,\"sv\":[]}'::public.eql_v3_json"), ); // The `-> text` / `-> int` / `->> text` accessors return non-boolean types, so @@ -818,19 +818,19 @@ v3_jsonb_supported_null!( #[sqlx::test] async fn v3_jsonb_arrow_accessors_supported_null(pool: PgPool) -> anyhow::Result<()> { let arrow_text: Option = - sqlx::query_scalar("SELECT (NULL::public.json -> 'x'::text)::jsonb::text") + sqlx::query_scalar("SELECT (NULL::public.eql_v3_json -> 'x'::text)::jsonb::text") .fetch_one(&pool) .await?; assert!(arrow_text.is_none(), "json -> text must propagate NULL"); let arrow_int: Option = - sqlx::query_scalar("SELECT (NULL::public.json -> 0::integer)::jsonb::text") + sqlx::query_scalar("SELECT (NULL::public.eql_v3_json -> 0::integer)::jsonb::text") .fetch_one(&pool) .await?; assert!(arrow_int.is_none(), "json -> int must propagate NULL"); let arrow_text_text: Option = - sqlx::query_scalar("SELECT NULL::public.json ->> 'x'::text") + sqlx::query_scalar("SELECT NULL::public.eql_v3_json ->> 'x'::text") .fetch_one(&pool) .await?; assert!( @@ -839,7 +839,7 @@ async fn v3_jsonb_arrow_accessors_supported_null(pool: PgPool) -> anyhow::Result ); let arrow_int_text: Option = - sqlx::query_scalar("SELECT NULL::public.json ->> 0::integer") + sqlx::query_scalar("SELECT NULL::public.eql_v3_json ->> 0::integer") .fetch_one(&pool) .await?; assert!(arrow_int_text.is_none(), "json ->> int must propagate NULL"); @@ -857,7 +857,7 @@ macro_rules! v3_jsonb_blocker_cases { $( paste::paste! { #[sqlx::test] async fn [](pool: PgPool) -> anyhow::Result<()> { - let lhs = format!("'{}'::public.json", NN_DOC); + let lhs = format!("'{}'::public.eql_v3_json", NN_DOC); let msg = "is not supported"; // Domain on the left, real-typed RHS — must raise. @@ -866,16 +866,16 @@ macro_rules! v3_jsonb_blocker_cases { // Non-STRICT proof: NULL domain LHS must STILL raise (a STRICT // blocker would short-circuit to NULL and bypass the exception). - let null_lhs = format!("SELECT NULL::public.json {} {}", $op, $rhs); + let null_lhs = format!("SELECT NULL::public.eql_v3_json {} {}", $op, $rhs); eql_tests::assert_raises(&pool, &null_lhs, &[], msg).await?; // Domain on the RIGHT, only where the surface defines that form. let rhs_dom: Option<&str> = $rhs_domain; if let Some(_) = rhs_dom { - let sql = format!("SELECT {} {} '{}'::public.json", $rhs, $op, NN_DOC); + let sql = format!("SELECT {} {} '{}'::public.eql_v3_json", $rhs, $op, NN_DOC); eql_tests::assert_raises(&pool, &sql, &[], msg).await?; // Non-STRICT proof for the right-domain form. - let null_rhs = format!("SELECT {} {} NULL::public.json", $rhs, $op); + let null_rhs = format!("SELECT {} {} NULL::public.eql_v3_json", $rhs, $op); eql_tests::assert_raises(&pool, &null_rhs, &[], msg).await?; } Ok(()) @@ -959,8 +959,8 @@ v3_jsonb_blocker_cases!( #[sqlx::test] async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Result<()> { - let lhs = format!("'{}'::public.json", NN_DOC); - let rhs = format!("'{}'::public.json", NN_DOC); + let lhs = format!("'{}'::public.eql_v3_json", NN_DOC); + let rhs = format!("'{}'::public.eql_v3_json", NN_DOC); for op in ["=", "<>", "<", "<=", ">", ">="] { let sql = format!("SELECT {lhs} {op} {rhs}"); eql_tests::assert_raises(&pool, &sql, &[], "is not supported").await?; @@ -970,7 +970,7 @@ async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Resu // D7 (negative control) — pins the domain-flattening rule that makes the typed // RHS in `v3_jsonb_blocker_cases!` LOAD-BEARING (file header, lines 13–20). A -// BARE (unknown-typed) operand flattens `public.json` to native `jsonb`, so the +// BARE (unknown-typed) operand flattens `public.eql_v3_json` to native `jsonb`, so the // SAME operator that RAISES with a typed RHS in D7 must SUCCEED here — resolving // to native and returning a value, never reaching our blocker. Without this, the // `::text` / `::jsonb` typing in D7 could silently become unnecessary (or, worse, @@ -978,7 +978,7 @@ async fn v3_jsonb_root_doc_doc_comparison_blockers(pool: PgPool) -> anyhow::Resu // would notice. See the "Typed operands" caveat in `docs/reference/json-support.md`. #[sqlx::test] async fn v3_jsonb_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Result<()> { - let doc = format!("'{}'::public.json", NN_DOC); + let doc = format!("'{}'::public.eql_v3_json", NN_DOC); // `?` is blocked with a typed RHS in D7 (`question`). Bare `'sv'` is unknown // -> native `jsonb ? text` -> top-level key present -> TRUE, no raise. @@ -1027,7 +1027,7 @@ async fn v3_jsonb_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Resul // D7 (negative control, finding #1) — the `->`/`->>` SUPPORTED operators are the // DANGEROUS face of domain-flattening. Unlike the blockers above (typed RHS // RAISES, bare RHS merely succeeds-as-native), `->`/`->>` SILENTLY return a WRONG -// answer for a bare untyped selector: `doc -> 'sel'` flattens `public.json` to +// answer for a bare untyped selector: `doc -> 'sel'` flattens `public.eql_v3_json` to // native `jsonb -> text` (a root-key lookup on the envelope), NOT the v3 // selector-lookup operator. This pins BOTH which operator binds (`pg_typeof`) and // the user-visible divergence, so a future resolution change in either direction @@ -1040,7 +1040,7 @@ async fn v3_jsonb_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Resul // "Typed operands" caveat in `docs/reference/json-support.md`. #[sqlx::test] async fn v3_jsonb_arrow_bare_operand_flattens_to_native(pool: PgPool) -> anyhow::Result<()> { - let doc = format!("'{}'::public.json", NN_DOC); + let doc = format!("'{}'::public.eql_v3_json", NN_DOC); // --- `->` : which operator binds? ------------------------------------- // Bare selector -> NATIVE `jsonb -> text` (result type is `jsonb`). @@ -1050,15 +1050,18 @@ async fn v3_jsonb_arrow_bare_operand_flattens_to_native(pool: PgPool) -> anyhow: assert_eq!( bare_ty, "jsonb", "bare `->` must flatten to native `jsonb -> text`; binding the v3 operator \ - (public.jsonb_entry) here would mean the domain-flattening contract changed" + (public.eql_v3_jsonb_entry) here would mean the domain-flattening contract changed" ); - // Typed selector -> the v3 operator (result type is `public.jsonb_entry`). + // Typed selector -> the v3 operator (result type is `public.eql_v3_jsonb_entry`). let typed_ty: String = sqlx::query_scalar(&format!("SELECT pg_typeof({doc} -> 'sv'::text)::text")) .fetch_one(&pool) .await?; assert!( - matches!(typed_ty.as_str(), "public.jsonb_entry" | "jsonb_entry"), + matches!( + typed_ty.as_str(), + "public.eql_v3_jsonb_entry" | "jsonb_entry" + ), "typed `-> 'sv'::text` must bind the v3 selector-lookup operator" ); @@ -1130,7 +1133,7 @@ macro_rules! v3_jsonb_payload_reject { v3_jsonb_payload_reject!( v3_jsonb_json_payload_check, - "public.json", + "public.eql_v3_json", [ "[]", // non-object "{\"v\":3,\"sv\":[]}", // missing i @@ -1148,7 +1151,7 @@ v3_jsonb_payload_reject!( v3_jsonb_payload_reject!( v3_jsonb_ste_vec_entry_payload_check, - "public.jsonb_entry", + "public.eql_v3_jsonb_entry", [ "[]", // non-object "{\"s\":\"x\",\"hm\":\"00\"}", // missing c @@ -1183,12 +1186,12 @@ v3_jsonb_payload_reject!( #[sqlx::test] async fn v3_jsonb_payload_check_accepts_valid(pool: PgPool) -> anyhow::Result<()> { let ok_doc: bool = - sqlx::query_scalar("SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.json IS NOT NULL") + sqlx::query_scalar("SELECT '{\"i\":{},\"v\":3,\"sv\":[]}'::public.eql_v3_json IS NOT NULL") .fetch_one(&pool) .await?; assert!(ok_doc); let ok_entry: bool = sqlx::query_scalar( - "SELECT '{\"s\":\"x\",\"c\":\"y\",\"hm\":\"00\"}'::public.jsonb_entry IS NOT NULL", + "SELECT '{\"s\":\"x\",\"c\":\"y\",\"hm\":\"00\"}'::public.eql_v3_jsonb_entry IS NOT NULL", ) .fetch_one(&pool) .await?; @@ -1204,7 +1207,7 @@ async fn v3_jsonb_payload_check_accepts_valid(pool: PgPool) -> anyhow::Result<() /// D9 — the cipherstash-client SteVec envelope SHAPE (the extra top-level /// `k:"sv"` the generator emits, plus the per-entry `a` array marker) must pass -/// the `public.json` domain CHECK. The static fixture lacked `k`; the generated +/// the `public.eql_v3_json` domain CHECK. The static fixture lacked `k`; the generated /// fixture carries it, so this guards the generated fixture against a CHECK /// rejection independently of live encryption (no creds, no fixture load). #[sqlx::test] @@ -1216,12 +1219,14 @@ async fn v3_jsonb_generator_envelope_shape_accepted(pool: PgPool) -> anyhow::Res {"s":"3a114ad13d25b030f41175114347de59","c":"ct","oc":"00010203","a":false} ] }"#; - let ok: bool = sqlx::query_scalar(&format!("SELECT '{envelope}'::public.json IS NOT NULL")) - .fetch_one(&pool) - .await?; + let ok: bool = sqlx::query_scalar(&format!( + "SELECT '{envelope}'::public.eql_v3_json IS NOT NULL" + )) + .fetch_one(&pool) + .await?; assert!( ok, - "cipherstash SteVec envelope (root k:\"sv\" + per-entry a) must pass the public.json CHECK" + "cipherstash SteVec envelope (root k:\"sv\" + per-entry a) must pass the public.eql_v3_json CHECK" ); Ok(()) } @@ -1243,14 +1248,14 @@ async fn v3_jsonb_path_query_match_and_miss(pool: PgPool) -> anyhow::Result<()> let d = array_doc(); // Matching selector returns exactly one entry row, whose selector is 'aa'. let hits: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::public.json::jsonb, 'aa')" + "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::public.eql_v3_json::jsonb, 'aa')" )) .fetch_one(&pool) .await?; assert_eq!(hits, 1, "one entry matches selector 'aa'"); let sel: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_path_query('{d}'::public.json::jsonb, 'aa') AS e" + "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_path_query('{d}'::public.eql_v3_json::jsonb, 'aa') AS e" )) .fetch_one(&pool) .await?; @@ -1258,7 +1263,7 @@ async fn v3_jsonb_path_query_match_and_miss(pool: PgPool) -> anyhow::Result<()> // Missing selector returns an empty set. let miss: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::public.json::jsonb, 'zz')" + "SELECT count(*) FROM eql_v3.jsonb_path_query('{d}'::public.eql_v3_json::jsonb, 'zz')" )) .fetch_one(&pool) .await?; @@ -1270,14 +1275,14 @@ async fn v3_jsonb_path_query_match_and_miss(pool: PgPool) -> anyhow::Result<()> async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { let d = array_doc(); let exists: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.jsonb_path_exists('{d}'::public.json::jsonb, 'bb')" + "SELECT eql_v3.jsonb_path_exists('{d}'::public.eql_v3_json::jsonb, 'bb')" )) .fetch_one(&pool) .await?; assert!(exists, "selector 'bb' exists"); let missing: bool = sqlx::query_scalar(&format!( - "SELECT eql_v3.jsonb_path_exists('{d}'::public.json::jsonb, 'zz')" + "SELECT eql_v3.jsonb_path_exists('{d}'::public.eql_v3_json::jsonb, 'zz')" )) .fetch_one(&pool) .await?; @@ -1285,7 +1290,7 @@ async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { // query_first returns the matching entry (selector 'bb'). let first_sel: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::public.json::jsonb, 'bb'))" + "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::public.eql_v3_json::jsonb, 'bb'))" )) .fetch_one(&pool) .await?; @@ -1293,7 +1298,7 @@ async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { // query_first on a miss returns NULL. let first_miss: Option = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::public.json::jsonb, 'zz'))" + "SELECT eql_v3.selector(eql_v3.jsonb_path_query_first('{d}'::public.eql_v3_json::jsonb, 'zz'))" )) .fetch_one(&pool) .await?; @@ -1305,30 +1310,30 @@ async fn v3_jsonb_path_exists_and_first(pool: PgPool) -> anyhow::Result<()> { async fn v3_jsonb_array_length_and_elements(pool: PgPool) -> anyhow::Result<()> { let d = array_doc(); let len: i32 = sqlx::query_scalar(&format!( - "SELECT eql_v3.jsonb_array_length('{d}'::public.json::jsonb)" + "SELECT eql_v3.jsonb_array_length('{d}'::public.eql_v3_json::jsonb)" )) .fetch_one(&pool) .await?; assert_eq!(len, 2, "array doc has two elements"); let n: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_array_elements('{d}'::public.json::jsonb)" + "SELECT count(*) FROM eql_v3.jsonb_array_elements('{d}'::public.eql_v3_json::jsonb)" )) .fetch_one(&pool) .await?; assert_eq!(n, 2, "jsonb_array_elements yields one row per element"); - // jsonb_array_elements returns SETOF public.jsonb_entry — the rows are + // jsonb_array_elements returns SETOF public.eql_v3_jsonb_entry — the rows are // valid entries (the entry extractor accepts them). let sels: Vec = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_array_elements('{d}'::public.json::jsonb) AS e ORDER BY 1" + "SELECT eql_v3.selector(e) FROM eql_v3.jsonb_array_elements('{d}'::public.eql_v3_json::jsonb) AS e ORDER BY 1" )) .fetch_all(&pool) .await?; assert_eq!(sels, vec!["aa".to_string(), "bb".to_string()]); let texts: i64 = sqlx::query_scalar(&format!( - "SELECT count(*) FROM eql_v3.jsonb_array_elements_text('{d}'::public.json::jsonb)" + "SELECT count(*) FROM eql_v3.jsonb_array_elements_text('{d}'::public.eql_v3_json::jsonb)" )) .fetch_one(&pool) .await?; @@ -1340,11 +1345,11 @@ async fn v3_jsonb_array_length_and_elements(pool: PgPool) -> anyhow::Result<()> async fn v3_jsonb_array_length_non_array_raises(pool: PgPool) -> anyhow::Result<()> { // A document WITHOUT the `a:true` array flag is not an array. let not_array = r#"{"i":{},"v":3,"sv":[{"s":"aa","c":"x","hm":"00"}]}"#; - let sql = format!("SELECT eql_v3.jsonb_array_length('{not_array}'::public.json::jsonb)"); + let sql = format!("SELECT eql_v3.jsonb_array_length('{not_array}'::public.eql_v3_json::jsonb)"); eql_tests::assert_raises(&pool, &sql, &[], "non-array").await?; let sql2 = format!( - "SELECT count(*) FROM eql_v3.jsonb_array_elements('{not_array}'::public.json::jsonb)" + "SELECT count(*) FROM eql_v3.jsonb_array_elements('{not_array}'::public.eql_v3_json::jsonb)" ); eql_tests::assert_raises(&pool, &sql2, &[], "non-array").await?; Ok(()) @@ -1451,19 +1456,19 @@ async fn v3_jsonb_to_ste_vec_query_gin_is_cost_chosen(pool: PgPool) -> anyhow::R ); let mut tx = pool.begin().await?; - sqlx::query("CREATE TEMP TABLE v3_jsonb_scale (payload public.json) ON COMMIT DROP") + sqlx::query("CREATE TEMP TABLE v3_jsonb_scale (payload public.eql_v3_json) ON COMMIT DROP") .execute(&mut *tx) .await?; // The bulk: 5000 copies of the filler document. sqlx::query( "INSERT INTO v3_jsonb_scale(payload) \ - SELECT $1::jsonb::public.json FROM generate_series(1, 5000)", + SELECT $1::jsonb::public.eql_v3_json FROM generate_series(1, 5000)", ) .bind(&filler_payload) .execute(&mut *tx) .await?; // The single selective pivot document. - sqlx::query("INSERT INTO v3_jsonb_scale(payload) VALUES ($1::jsonb::public.json)") + sqlx::query("INSERT INTO v3_jsonb_scale(payload) VALUES ($1::jsonb::public.eql_v3_json)") .bind(&pivot_payload) .execute(&mut *tx) .await?; @@ -1552,22 +1557,23 @@ async fn v3_jsonb_arrow_integer_index_on_array(pool: PgPool) -> anyhow::Result<( // `-> 0` / `-> 1` index the sv array positionally (native jsonb path), not a // selector lookup. Selectors come out in array order. let i0: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector('{d}'::public.json -> 0::integer)" + "SELECT eql_v3.selector('{d}'::public.eql_v3_json -> 0::integer)" )) .fetch_one(&pool) .await?; assert_eq!(i0, "aa", "-> 0 must index the first sv element"); let i1: String = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector('{d}'::public.json -> 1::integer)" + "SELECT eql_v3.selector('{d}'::public.eql_v3_json -> 1::integer)" )) .fetch_one(&pool) .await?; assert_eq!(i1, "bb", "-> 1 must index the second sv element"); - let t1: String = sqlx::query_scalar(&format!("SELECT '{d}'::public.json ->> 1::integer")) - .fetch_one(&pool) - .await?; + let t1: String = + sqlx::query_scalar(&format!("SELECT '{d}'::public.eql_v3_json ->> 1::integer")) + .fetch_one(&pool) + .await?; assert!( t1.contains("\"s\": \"bb\""), "->> 1 must serialize the second sv element, got {t1}" @@ -1576,7 +1582,7 @@ async fn v3_jsonb_arrow_integer_index_on_array(pool: PgPool) -> anyhow::Result<( // Regression: `-> 'sv'::text` is a SELECTOR lookup (our text operator), NOT // native key access — there is no element with selector 'sv', so NULL. let sv_lookup: Option = sqlx::query_scalar(&format!( - "SELECT eql_v3.selector('{d}'::public.json -> 'sv'::text)" + "SELECT eql_v3.selector('{d}'::public.eql_v3_json -> 'sv'::text)" )) .fetch_one(&pool) .await?; @@ -1618,8 +1624,8 @@ async fn v3_jsonb_entry_operators_declare_commutator_negator(pool: PgPool) -> an FROM pg_operator o LEFT JOIN pg_operator com ON com.oid = o.oprcom LEFT JOIN pg_operator neg ON neg.oid = o.oprnegate - WHERE o.oprleft = 'public.jsonb_entry'::regtype - AND o.oprright = 'public.jsonb_entry'::regtype + WHERE o.oprleft = 'public.eql_v3_jsonb_entry'::regtype + AND o.oprright = 'public.eql_v3_jsonb_entry'::regtype ORDER BY o.oprname "#, ) @@ -1663,8 +1669,8 @@ async fn v3_jsonb_entry_eq_does_not_declare_hashes_or_merges(pool: PgPool) -> an SELECT oprcanhash, oprcanmerge FROM pg_operator WHERE oprname = '=' - AND oprleft = 'public.jsonb_entry'::regtype - AND oprright = 'public.jsonb_entry'::regtype + AND oprleft = 'public.eql_v3_jsonb_entry'::regtype + AND oprright = 'public.eql_v3_jsonb_entry'::regtype "#, ) .fetch_one(&pool) diff --git a/tests/sqlx/tests/v3_privilege_tests.rs b/tests/sqlx/tests/v3_privilege_tests.rs index cbf5fb5ef..68694fe74 100644 --- a/tests/sqlx/tests/v3_privilege_tests.rs +++ b/tests/sqlx/tests/v3_privilege_tests.rs @@ -12,7 +12,7 @@ //! Not every path crosses the boundary, and the tests below pin the difference: //! the hand-written jsonb (SteVec) `ste_vec_contains` read path is `plpgsql` //! (never inlined) and runs under the public grant alone. Casting raw jsonb to -//! `public.json` also stays outside `eql_v3_internal`: the domain CHECK calls +//! `public.eql_v3_json` also stays outside `eql_v3_internal`: the domain CHECK calls //! public validators so application table columns can survive EQL schema //! uninstall without dependency edges back into the droppable schemas. //! @@ -31,22 +31,22 @@ use sqlx::PgPool; /// constructor — inlined into the query, that constructor call requires the /// caller to hold `eql_v3_internal`, so the path exercises BOTH schemas. const EQ_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer \ - WHERE payload::public.integer_eq = payload::public.integer_eq"; + WHERE payload::public.eql_v3_integer_eq = payload::public.eql_v3_integer_eq"; /// A real ordering query using the `<` *operator* on `integer_ord`, which dispatches /// through `eql_v3.lt` → `eql_v3.ord_term` → the `eql_v3_internal.ore_block_256` -/// constructor + comparator. NB: `ORDER BY payload::public.integer_ord` alone does +/// constructor + comparator. NB: `ORDER BY payload::public.eql_v3_integer_ord` alone does /// NOT work here — a bare domain has no ORE opclass, so it silently falls back to /// built-in jsonb ordering and never crosses into `eql_v3_internal`. The `<` /// operator is what genuinely exercises the encrypted ordering path. const ORD_QUERY: &str = "SELECT count(*) FROM fixtures.eql_v3_integer a, fixtures.eql_v3_integer b \ - WHERE a.payload::public.integer_ord < b.payload::public.integer_ord"; + WHERE a.payload::public.eql_v3_integer_ord < b.payload::public.eql_v3_integer_ord"; /// A real aggregate (`eql_v3.min` on `integer_ord`). The public aggregate dispatches /// into its state function `eql_v3_internal.min_sfunc`, so it requires the /// internal grant. -const AGG_QUERY: &str = "SELECT eql_v3.min(payload::public.integer_ord) \ +const AGG_QUERY: &str = "SELECT eql_v3.min(payload::public.eql_v3_integer_ord) \ FROM fixtures.eql_v3_integer"; /// A real jsonb (SteVec) containment READ path. `eql_v3.ste_vec_contains` is @@ -55,10 +55,10 @@ const AGG_QUERY: &str = "SELECT eql_v3.min(payload::public.integer_ord) \ const JSONB_READ_QUERY: &str = "SELECT eql_v3.ste_vec_contains(payload, payload) \ FROM fixtures.v3_ste_vec LIMIT 1"; -/// A real jsonb WRITE path: casting raw jsonb to the `public.json` domain fires +/// A real jsonb WRITE path: casting raw jsonb to the `public.eql_v3_json` domain fires /// the domain CHECK, which calls public validators and does not cross into /// `eql_v3_internal`. -const JSONB_WRITE_QUERY: &str = "SELECT (payload::jsonb)::public.json \ +const JSONB_WRITE_QUERY: &str = "SELECT (payload::jsonb)::public.eql_v3_json \ FROM fixtures.v3_ste_vec LIMIT 1"; /// Derive a unique, valid role name from the per-test database name so parallel @@ -245,7 +245,7 @@ async fn runtime_role_without_internal_grant_is_denied(pool: PgPool) -> Result<( // ============================================================================ /// Positive (jsonb): a runtime role granted USAGE + EXECUTE on BOTH schemas can -/// run both the SteVec containment read and the `public.json` cast (write) path. +/// run both the SteVec containment read and the `public.eql_v3_json` cast (write) path. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn runtime_role_with_both_schema_grants_can_query_jsonb(pool: PgPool) -> Result<()> { let mut conn = pool.acquire().await?; @@ -278,7 +278,7 @@ async fn runtime_role_with_both_schema_grants_can_query_jsonb(pool: PgPool) -> R /// Boundary (jsonb): a runtime role granted only the PUBLIC schema (`eql_v3`) /// characterises the SteVec split precisely — both the `plpgsql` containment -/// READ and the `public.json` domain CHECK validator path run without the +/// READ and the `public.eql_v3_json` domain CHECK validator path run without the /// internal grant. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_ste_vec")))] async fn runtime_role_without_internal_grant_jsonb_boundary(pool: PgPool) -> Result<()> { diff --git a/tests/sqlx/tests/v3_public_surface_tests.rs b/tests/sqlx/tests/v3_public_surface_tests.rs index df2030a2d..428257265 100644 --- a/tests/sqlx/tests/v3_public_surface_tests.rs +++ b/tests/sqlx/tests/v3_public_surface_tests.rs @@ -97,17 +97,20 @@ async fn public_surface(pool: &PgPool) -> Result> { /// NOT here — they are never column types and live in `eql_v3` (CIP-3442); /// see [`query_domain_names`]. fn user_domain_names() -> Vec { + // Installed typnames: the catalog join carrying the eql_v3_ version + // prefix (CIP-3472) — resolved through the same DomainFamily::domain_name + // the SQL surface is generated through. let mut names = Vec::new(); for family in eql_domains::scalar_families() { for domain in family.domains { - if domain.name.is_empty() { - names.push(family.name.to_string()); - } else { - names.push(format!("{}_{}", family.name, domain.name)); - } + names.push(family.domain_name(domain)); } } - names.extend(["json", "jsonb_entry"].into_iter().map(String::from)); + names.extend( + ["eql_v3_json", "eql_v3_jsonb_entry"] + .into_iter() + .map(String::from), + ); names.sort(); names } diff --git a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs index 755d9a41d..b195118e8 100644 --- a/tests/sqlx/tests/v3_scalar_query_operand_tests.rs +++ b/tests/sqlx/tests/v3_scalar_query_operand_tests.rs @@ -43,11 +43,13 @@ async fn eq_term_only_operand_matches_exactly_the_equal_rows(pool: PgPool) -> Re &[IndexKind::Unique], ) .await?; - sqlx::query("CREATE TABLE q (id int GENERATED ALWAYS AS IDENTITY, val public.integer_eq)") - .execute(&pool) - .await?; + sqlx::query( + "CREATE TABLE q (id int GENERATED ALWAYS AS IDENTITY, val public.eql_v3_integer_eq)", + ) + .execute(&pool) + .await?; for p in &stored { - sqlx::query("INSERT INTO q (val) VALUES ($1::jsonb::public.integer_eq)") + sqlx::query("INSERT INTO q (val) VALUES ($1::jsonb::public.eql_v3_integer_eq)") .bind(p.to_string()) .execute(&pool) .await?; @@ -85,11 +87,13 @@ async fn eq_term_only_operand_matches_exactly_the_equal_rows(pool: PgPool) -> Re async fn ord_term_only_operand_orders_via_the_ore_operator(pool: PgPool) -> Result<()> { // Store 10, 20, 30 as `integer_ord` (ORE block term). let stored = encrypt_store("qtest", "payload", &[10i32, 20, 30], &[IndexKind::Ore]).await?; - sqlx::query("CREATE TABLE q (id int GENERATED ALWAYS AS IDENTITY, val public.integer_ord)") - .execute(&pool) - .await?; + sqlx::query( + "CREATE TABLE q (id int GENERATED ALWAYS AS IDENTITY, val public.eql_v3_integer_ord)", + ) + .execute(&pool) + .await?; for p in &stored { - sqlx::query("INSERT INTO q (val) VALUES ($1::jsonb::public.integer_ord)") + sqlx::query("INSERT INTO q (val) VALUES ($1::jsonb::public.eql_v3_integer_ord)") .bind(p.to_string()) .execute(&pool) .await?; diff --git a/tests/sqlx/tests/v3_text_empty_constraint_tests.rs b/tests/sqlx/tests/v3_text_empty_constraint_tests.rs index c0560c603..9e377fb21 100644 --- a/tests/sqlx/tests/v3_text_empty_constraint_tests.rs +++ b/tests/sqlx/tests/v3_text_empty_constraint_tests.rs @@ -5,7 +5,7 @@ //! (`ob: []`, verified against cipherstash-client) — the only value that does. //! Rather than ordering such a degenerate term, the ORE-bearing domains reject //! it at the boundary: their `CHECK` requires `ob` to be a non-empty array, so -//! casting an empty-`ob` payload to `public.text_ord` / `public.text_ord_ore` +//! casting an empty-`ob` payload to `public.eql_v3_text_ord` / `public.eql_v3_text_ord_ore` //! fails with a check violation (SQLSTATE `23514`). The comparator's //! "empty sorts first" cardinality guard remains in place as defense-in-depth //! for any path that bypasses the domain (e.g. a composite built directly). @@ -21,40 +21,42 @@ use anyhow::Result; use eql_tests::assert_db_error; use sqlx::PgPool; -/// Casting the empty-string row (`id = 1`, `ob: []`) to `public.text_ord` is +/// Casting the empty-string row (`id = 1`, `ob: []`) to `public.eql_v3_text_ord` is /// rejected by the domain's non-empty-`ob` CHECK. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] async fn empty_string_rejected_by_text_ord(pool: PgPool) -> Result<()> { - let err = - sqlx::query("SELECT payload::public.text_ord FROM fixtures.v3_text_empty WHERE id = 1") - .fetch_all(&pool) - .await - .expect_err("empty ORE term (ob: []) must violate the text_ord CHECK"); + let err = sqlx::query( + "SELECT payload::public.eql_v3_text_ord FROM fixtures.v3_text_empty WHERE id = 1", + ) + .fetch_all(&pool) + .await + .expect_err("empty ORE term (ob: []) must violate the text_ord CHECK"); // Auto-generated domain constraint name is not pinned — only the SQLSTATE. assert_db_error(&err, "23514", None); Ok(()) } -/// Same rejection for the `public.text_ord_ore` domain. +/// Same rejection for the `public.eql_v3_text_ord_ore` domain. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] async fn empty_string_rejected_by_text_ord_ore(pool: PgPool) -> Result<()> { - let err = - sqlx::query("SELECT payload::public.text_ord_ore FROM fixtures.v3_text_empty WHERE id = 1") - .fetch_all(&pool) - .await - .expect_err("empty ORE term (ob: []) must violate the text_ord_ore CHECK"); + let err = sqlx::query( + "SELECT payload::public.eql_v3_text_ord_ore FROM fixtures.v3_text_empty WHERE id = 1", + ) + .fetch_all(&pool) + .await + .expect_err("empty ORE term (ob: []) must violate the text_ord_ore CHECK"); assert_db_error(&err, "23514", None); Ok(()) } /// The non-empty controls (`"frank"`, `"zebra"`) carry a real `ob` array, so -/// they cast cleanly into `public.text_ord` — the CHECK only rejects the empty +/// they cast cleanly into `public.eql_v3_text_ord` — the CHECK only rejects the empty /// term, not ordered text in general. #[sqlx::test(fixtures(path = "../fixtures", scripts("v3_text_empty")))] async fn non_empty_controls_accepted_by_text_ord(pool: PgPool) -> Result<()> { let plaintexts: Vec = sqlx::query_scalar( "SELECT plaintext FROM fixtures.v3_text_empty \ - WHERE id IN (2, 3) AND payload::public.text_ord IS NOT NULL \ + WHERE id IN (2, 3) AND payload::public.eql_v3_text_ord IS NOT NULL \ ORDER BY id", ) .fetch_all(&pool) @@ -74,7 +76,7 @@ async fn non_empty_controls_order_under_text_ord(pool: PgPool) -> Result<()> { let plaintexts: Vec = sqlx::query_scalar( "SELECT plaintext FROM fixtures.v3_text_empty \ WHERE id IN (2, 3) \ - ORDER BY eql_v3.ord_term(payload::public.text_ord) ASC", + ORDER BY eql_v3.ord_term(payload::public.eql_v3_text_ord) ASC", ) .fetch_all(&pool) .await?; diff --git a/tests/sqlx/tests/v3_uninstall_tests.rs b/tests/sqlx/tests/v3_uninstall_tests.rs index 7833be142..0f8c065f0 100644 --- a/tests/sqlx/tests/v3_uninstall_tests.rs +++ b/tests/sqlx/tests/v3_uninstall_tests.rs @@ -76,7 +76,7 @@ async fn table_exists(pool: &PgPool, table: &str) -> Result { } fn normalize_regtype_name(name: String) -> String { - name.replace("public.\"json\"", "public.json") + name.replace("public.\"json\"", "public.eql_v3_json") } #[sqlx::test] @@ -142,7 +142,7 @@ async fn shipped_installer_can_run_over_existing_public_domains(pool: PgPool) -> FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = 'public' - AND t.typname IN ('integer_eq', 'json', 'jsonb_entry') + AND t.typname IN ('eql_v3_integer_eq', 'eql_v3_json', 'eql_v3_jsonb_entry') ORDER BY 1 "#, ) @@ -154,7 +154,11 @@ async fn shipped_installer_can_run_over_existing_public_domains(pool: PgPool) -> public_domains.sort(); assert_eq!( public_domains, - vec!["public.integer_eq", "public.json", "public.jsonb_entry"], + vec![ + "public.eql_v3_integer_eq", + "public.eql_v3_json", + "public.eql_v3_jsonb_entry" + ], "repeat install must keep public user-column domains available" ); @@ -203,9 +207,9 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( r#" CREATE TABLE public.eql_v3_uninstall_preserve ( id integer PRIMARY KEY, - scalar_value public.integer_eq NOT NULL, - doc_value public.json NOT NULL, - entry_value public.jsonb_entry + scalar_value public.eql_v3_integer_eq NOT NULL, + doc_value public.eql_v3_json NOT NULL, + entry_value public.eql_v3_jsonb_entry ) "#, ) @@ -219,9 +223,9 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( VALUES ( 1, - $1::jsonb::public.integer_eq, - $2::jsonb::public.json, - $3::jsonb::public.jsonb_entry + $1::jsonb::public.eql_v3_integer_eq, + $2::jsonb::public.eql_v3_json, + $3::jsonb::public.eql_v3_jsonb_entry ) "#, ) @@ -288,9 +292,9 @@ async fn uninstaller_preserves_application_tables_with_public_domain_columns( column_types, vec![ "pg_catalog.int4", - "public.integer_eq", - "public.json", - "public.jsonb_entry", + "public.eql_v3_integer_eq", + "public.eql_v3_json", + "public.eql_v3_jsonb_entry", ] ); From 9e3a7d5acb7c50bc06f937be88f2fb027e3387c2 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Thu, 9 Jul 2026 16:07:57 +1000 Subject: [PATCH 597/599] =?UTF-8?q?docs:=20review=20polish=20=E2=80=94=20c?= =?UTF-8?q?hangelog-safe=20U-004=20link,=20U-003=20spacing,=20grammar=20ni?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The changeset body is copied verbatim into packages/eql/CHANGELOG.md at release time, where a ../docs/... link resolves to the nonexistent packages/docs/... — use the root-relative anchored form the existing changesets use. Also restore the blank line before U-003's Verification block and fix 'an CLLW-OPE' in a test assertion message. --- .changeset/eql-3469-stevec-ope.md | 2 +- docs/upgrading/v3.0.md | 1 + tests/sqlx/tests/encrypted_domain/jsonb_entry.rs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.changeset/eql-3469-stevec-ope.md b/.changeset/eql-3469-stevec-ope.md index 563fac919..f7159e674 100644 --- a/.changeset/eql-3469-stevec-ope.md +++ b/.changeset/eql-3469-stevec-ope.md @@ -2,4 +2,4 @@ '@cipherstash/eql': major --- -**SteVec (encrypted JSONB) ordering switched from CLLW-ORE to CLLW-OPE: sv entries carry `hm` XOR `op`, and entry ordering extracts `eql_v3.ord_ope_term(entry)` — native bytea order, no operator class.** The `eql_v3_internal.ore_cllw` composite type, its per-byte comparator, six operators, and superuser-only `DEFAULT FOR TYPE` btree operator class are removed, along with `eql_v3.ore_cllw(entry)` / `eql_v3.has_ore_cllw(entry)`; the domain CHECKs on `public.json` / `public.jsonb_entry` / `eql_v3.query_jsonb` now validate `hm` XOR `op` and reject `oc`-bearing payloads. Why: `CREATE OPERATOR CLASS` requires superuser, so SteVec entry ordering was the last EQL surface that could not index on cloud-hosted Supabase / managed Postgres — the CLLW-OPE term is the same `op` / `eql_v3_internal.ope_cllw` bytea domain the scalar `_ord_ope` domains use, the whole comparison chain is inlinable SQL, and a plain functional btree index on `eql_v3.ord_ope_term(doc -> ''::text)` engages structurally on any install. Stored `oc` documents must be re-encrypted with an OPE-mode client (`eql-bindings`' `from_v2` fails closed with the new `UnconvertibleOreTerm` on `oc` entries; the bindings' `SteVecTerm` gains an `OpeCllw { op }` variant in place of `OreCllw { oc }`). See [U-004](../docs/upgrading/v3.0.md) for the migration recipe. ([CIP-3469](https://linear.app/cipherstash/issue/CIP-3469/switch-jsonbstevec-support-from-cllw-ore-to-ope)) +**SteVec (encrypted JSONB) ordering switched from CLLW-ORE to CLLW-OPE: sv entries carry `hm` XOR `op`, and entry ordering extracts `eql_v3.ord_ope_term(entry)` — native bytea order, no operator class.** The `eql_v3_internal.ore_cllw` composite type, its per-byte comparator, six operators, and superuser-only `DEFAULT FOR TYPE` btree operator class are removed, along with `eql_v3.ore_cllw(entry)` / `eql_v3.has_ore_cllw(entry)`; the domain CHECKs on `public.json` / `public.jsonb_entry` / `eql_v3.query_jsonb` now validate `hm` XOR `op` and reject `oc`-bearing payloads. Why: `CREATE OPERATOR CLASS` requires superuser, so SteVec entry ordering was the last EQL surface that could not index on cloud-hosted Supabase / managed Postgres — the CLLW-OPE term is the same `op` / `eql_v3_internal.ope_cllw` bytea domain the scalar `_ord_ope` domains use, the whole comparison chain is inlinable SQL, and a plain functional btree index on `eql_v3.ord_ope_term(doc -> ''::text)` engages structurally on any install. Stored `oc` documents must be re-encrypted with an OPE-mode client (`eql-bindings`' `from_v2` fails closed with the new `UnconvertibleOreTerm` on `oc` entries; the bindings' `SteVecTerm` gains an `OpeCllw { op }` variant in place of `OreCllw { oc }`). See [U-004](docs/upgrading/v3.0.md#u-004-stevec-ordering-terms-are-cllw-ope-op) for the migration recipe. ([CIP-3469](https://linear.app/cipherstash/issue/CIP-3469/switch-jsonbstevec-support-from-cllw-ore-to-ope)) diff --git a/docs/upgrading/v3.0.md b/docs/upgrading/v3.0.md index 085551316..9662095a7 100644 --- a/docs/upgrading/v3.0.md +++ b/docs/upgrading/v3.0.md @@ -169,6 +169,7 @@ path needs no such gate as of this release: SteVec ordering switched from the opclass ([U-004](#u-004-stevec-ordering-terms-are-cllw-ope-op)), so there is no superuser-only object left to skip and nothing to poison (closes [CIP-3471](https://linear.app/cipherstash/issue/CIP-3471/jsonbstevec-ordering-ore-cllw-silently-degrades-on-non-superuser)). + **Verification.** ```sql diff --git a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs index 8807b7bcd..f9ade8525 100644 --- a/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs +++ b/tests/sqlx/tests/encrypted_domain/jsonb_entry.rs @@ -152,7 +152,7 @@ async fn jsonb_entry_integer_ord_ope_injectivity(pool: sqlx::PgPool) -> anyhow:: .await?; anyhow::ensure!( collisions == 0, - "no two distinct plaintexts may share an CLLW-OPE term ($.field); got {collisions} collisions", + "no two distinct plaintexts may share a CLLW-OPE term ($.field); got {collisions} collisions", ); Ok(()) } From baeeea6a4463ea83ad2f5abb4a40a7224a55bf8f Mon Sep 17 00:00:00 2001 From: Dan Draper Date: Thu, 9 Jul 2026 19:37:04 +1000 Subject: [PATCH 598/599] chore(release): eql 3.0.0-alpha.4 Cuts the EQL 3.0.0-alpha.4 lockstep release: npm `@cipherstash/eql`, crate `eql-bindings`, and the bundled SQL all ship at this identity. Carries CIP-3469 (#390): SteVec ordering moves from CLLW-ORE (`oc`) to CLLW-OPE (`op`). `SteVecTerm` becomes `{ hm } | { op }`, the `eql_v3_internal.ore_cllw` type and its superuser-only operator class are gone, and `from_v2` fails closed on `oc` entries with UnconvertibleOreTerm. Entry ordering now extracts `eql_v3.ord_ope_term(entry)` under native bytea comparison, so a plain functional btree index engages on managed Postgres. Unblocks protectjs-ffi#129, whose 7 remaining failures are all `FromV2(MissingTerm { key: "hm|oc" })` against alpha.3. Generated by `pnpm run version`: changesets computed alpha.4 (prerelease mode absorbs the major bump), sync-lockstep-versions.mjs propagated it to Cargo.toml, and release:prepare_bindings_assets rebuilt the exact-version SQL into both packages. Verified: bundled SQL carries 0 `ore_cllw` and 300 `ord_ope_term` references, crate and npm SQL are byte-identical, and all four version artifacts agree. --- .changeset/pre.json | 5 +- Cargo.lock | 2 +- crates/eql-bindings/Cargo.toml | 2 +- .../eql-bindings/sql/cipherstash-encrypt.sql | 1277 +++++++---------- crates/eql-bindings/sql/release-manifest.json | 4 +- packages/eql/CHANGELOG.md | 14 + packages/eql/package.json | 2 +- packages/eql/sql/cipherstash-encrypt.sql | 1277 +++++++---------- packages/eql/sql/release-manifest.json | 4 +- .../eql/src/generated/release-manifest.ts | 4 +- 10 files changed, 1077 insertions(+), 1514 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index fbb320289..2198e93fe 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -29,6 +29,8 @@ "eql-340", "eql-341", "eql-3442", + "eql-3468", + "eql-3469-stevec-ope", "eql-349", "eql-350", "eql-353", @@ -41,6 +43,7 @@ "eql-lints-schema-placement", "eql-sole-installer", "eql-v2-removed", - "eql-version-fn" + "eql-version-fn", + "npm-latest-pre-ga" ] } diff --git a/Cargo.lock b/Cargo.lock index 33104ef90..608f09650 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1164,7 +1164,7 @@ dependencies = [ [[package]] name = "eql-bindings" -version = "3.0.0-alpha.3" +version = "3.0.0-alpha.4" dependencies = [ "eql-domains", "schemars", diff --git a/crates/eql-bindings/Cargo.toml b/crates/eql-bindings/Cargo.toml index e17b52b89..4a4519f58 100644 --- a/crates/eql-bindings/Cargo.toml +++ b/crates/eql-bindings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "eql-bindings" -version = "3.0.0-alpha.3" +version = "3.0.0-alpha.4" edition = "2021" description = "Canonical wire types for EQL payloads — single source of truth for Rust, TypeScript (ts-rs), and JSON Schema (schemars)." # crates.io metadata. `license` is REQUIRED by crates.io — publish fails without diff --git a/crates/eql-bindings/sql/cipherstash-encrypt.sql b/crates/eql-bindings/sql/cipherstash-encrypt.sql index 617a1bddc..6d48b5007 100644 --- a/crates/eql-bindings/sql/cipherstash-encrypt.sql +++ b/crates/eql-bindings/sql/cipherstash-encrypt.sql @@ -2580,6 +2580,107 @@ END $$; -- AUTOMATICALLY GENERATED FILE. +--! @file v3/scalars/timestamp/timestamp_types.sql +--! @brief Encrypted-domain types for timestamp. + +DO $$ +BEGIN + --! @brief Encrypted domain public.timestamp. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp IS 'EQL encrypted timestamp (storage only)'; + + --! @brief Encrypted domain public.timestamp_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_eq' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_eq IS 'EQL encrypted timestamp (equality)'; + + --! @brief Encrypted domain public.timestamp_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL encrypted timestamp (equality, ordering)'; + + --! @brief Encrypted domain public.timestamp_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_ord IS 'EQL encrypted timestamp (equality, ordering)'; + + --! @brief Encrypted domain public.timestamp_ord_ope. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord_ope AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'op' + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL encrypted timestamp (equality, ordering)'; +END +$$; +-- AUTOMATICALLY GENERATED FILE. + --! @file v3/scalars/text/text_types.sql --! @brief Encrypted-domain types for text. @@ -3179,107 +3280,6 @@ AS $$ $$; -- AUTOMATICALLY GENERATED FILE. ---! @file v3/scalars/timestamp/timestamp_types.sql ---! @brief Encrypted-domain types for timestamp. - -DO $$ -BEGIN - --! @brief Encrypted domain public.timestamp. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp IS 'EQL encrypted timestamp (storage only)'; - - --! @brief Encrypted domain public.timestamp_eq. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_eq' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_eq AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'hm' - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_eq IS 'EQL encrypted timestamp (equality)'; - - --! @brief Encrypted domain public.timestamp_ord_ore. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_ord_ore AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'ob' - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL encrypted timestamp (equality, ordering)'; - - --! @brief Encrypted domain public.timestamp_ord. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_ord AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'ob' - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_ord IS 'EQL encrypted timestamp (equality, ordering)'; - - --! @brief Encrypted domain public.timestamp_ord_ope. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_ord_ope AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'op' - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL encrypted timestamp (equality, ordering)'; -END -$$; --- AUTOMATICALLY GENERATED FILE. - --! @file encrypted_domain/timestamp/timestamp_eq_functions.sql --! @brief Functions for public.timestamp_eq. @@ -3682,11 +3682,12 @@ AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.t LANGUAGE plpgsql; --! @file v3/sem/ope_cllw/types.sql ---! @brief CLLW OPE index term type for scalar range queries (eql_v3 SEM) +--! @brief CLLW OPE index term type for ordered range queries (eql_v3 SEM) --! --! Domain type representing a CLLW (Copyless Logarithmic Width) --! Order-Preserving Encryption term. The ciphertext is stored hex-encoded in ---! the `op` field of encrypted scalar payloads (the `_ord_ope` domains); the +--! the `op` field of encrypted payloads — the scalar `_ord_ope` domains and +--! the ordered entries of a SteVec document (`public.jsonb_entry`); the --! domain carries the hex-decoded bytes. --! --! A DOMAIN over bytea, not a composite: the OPE ciphertext is @@ -3696,8 +3697,8 @@ LANGUAGE plpgsql; --! same pattern as eql_v3_internal.hmac_256 over text). That keeps the whole --! comparison chain inlinable, so a functional btree index on --! `eql_v3.ord_ope_term(col)` engages structurally for the `_ord_ope` ---! domains' comparison operators. Contrast eql_v3_internal.ore_cllw (`oc`), the SteVec ---! CLLW-*ORE* composite compared by a custom per-byte protocol. +--! domains' comparison operators — and likewise on +--! `eql_v3.ord_ope_term(col -> 'selector')` for SteVec entry ordering. --! --! @note Transient type used only during query execution. --! @see eql_v3_internal.ope_cllw @@ -19682,6 +19683,141 @@ AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_eq, b public.integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @file v3/sem/ore_block_256/operator_class.sql +--! @brief B-tree operator family + default class on eql_v3_internal.ore_block_256. +--! +--! Gives the composite type its DEFAULT btree opclass so the recommended +--! functional index `CREATE INDEX ON t (eql_v3_internal.ord_term(col))` engages without +--! an explicit opclass annotation (design D4). +--! +--! @note Creating an operator family/class requires superuser: Postgres forbids +--! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index +--! integrity. Managed platforms (Supabase, and most hosted Postgres) run +--! the installer as a non-superuser role, so the DO block below ATTEMPTS +--! the creation and skips it on insufficient_privilege (SQLSTATE 42501), +--! letting the single installer run everywhere. When the class is absent, +--! ORE ordered scans over eql_v3_internal.ore_block_256 are unavailable, +--! but the order-preserving (OPE) ordering domains — whose extractor +--! return types carry a native btree opclass — still index without it. On +--! superuser installs (self-managed Postgres, the SQLx test matrix) the +--! class is created normally. Any non-privilege error still propagates. +--! @see eql_v3_internal.compare_ore_block_256_terms + +DO $do$ +BEGIN + EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree'; + + EXECUTE $ddl$ + CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class + DEFAULT FOR TYPE eql_v3_internal.ore_block_256 + USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS + OPERATOR 1 public.<, + OPERATOR 2 public.<=, + OPERATOR 3 public.=, + OPERATOR 4 public.>=, + OPERATOR 5 public.>, + FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256) + $ddl$; + + RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_block_256_operator_class'; +EXCEPTION + WHEN insufficient_privilege THEN + RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_block_256_operator_class (requires superuser); ORE ordered indexes on ore_block_256 unavailable, OPE ordering domains unaffected'; +END; +$do$; +-- AUTOMATICALLY GENERATED FILE. + +--! @file v3/scalars/timestamp/query_timestamp_types.sql +--! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::eql_v3.query_timestamp_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` +--! operator overloads and will not resolve. + +DO $$ +BEGIN + --! @brief Query-operand domain eql_v3.query_timestamp_eq (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_eq IS 'EQL timestamp query operand (equality)'; + + --! @brief Query-operand domain eql_v3.query_timestamp_ord_ore (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)'; + + --! @brief Query-operand domain eql_v3.query_timestamp_ord (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)'; + + --! @brief Query-operand domain eql_v3.query_timestamp_ord_ope (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_ord_ope AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)'; +END +$$; -- AUTOMATICALLY GENERATED FILE. --! @file v3/scalars/text/query_text_types.sql @@ -23441,98 +23577,6 @@ CREATE OPERATOR || ( ); -- AUTOMATICALLY GENERATED FILE. ---! @file v3/scalars/timestamp/query_timestamp_types.sql ---! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). ---! @note Query-operand domains live in `eql_v3` (not `public`): they are ---! never valid column types, so they don't belong in the column-type ---! namespace, and dropping the EQL-owned schema can never drop an ---! application column. ---! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::eql_v3.query_timestamp_eq`). A bare, ---! uncast literal RHS is ambiguous between the `query_` and `jsonb` ---! operator overloads and will not resolve. - -DO $$ -BEGIN - --! @brief Query-operand domain eql_v3.query_timestamp_eq (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_eq AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'hm' - AND NOT (VALUE ? 'c') - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_eq IS 'EQL timestamp query operand (equality)'; - - --! @brief Query-operand domain eql_v3.query_timestamp_ord_ore (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_ord_ore AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'ob' - AND NOT (VALUE ? 'c') - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)'; - - --! @brief Query-operand domain eql_v3.query_timestamp_ord (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_ord AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'ob' - AND NOT (VALUE ? 'c') - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)'; - - --! @brief Query-operand domain eql_v3.query_timestamp_ord_ope (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_ord_ope AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'op' - AND NOT (VALUE ? 'c') - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)'; -END -$$; --- AUTOMATICALLY GENERATED FILE. - --! @file encrypted_domain/timestamp/query_timestamp_eq_functions.sql --! @brief Functions for eql_v3.query_timestamp_eq. @@ -24450,203 +24494,6 @@ CREATE OPERATOR || ( LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore ); ---! @file v3/sem/ore_cllw/types.sql ---! @brief CLLW ORE index term type for STE-vec range queries (eql_v3 SEM) ---! ---! Composite type for CLLW (Copyless Logarithmic Width) Order-Revealing ---! Encryption. The ciphertext is stored in the `oc` field of encrypted data ---! payloads (Standard-mode `ste_vec` elements). Used by the range operators ---! (`<`, `<=`, `>`, `>=`) when an sv element carries an `oc` term. ---! ---! The wire-format `oc` value is a hex string with a leading domain-tag byte ---! (`0x00` numeric, `0x01` string) followed by the CLLW ciphertext. The ---! decoded `bytes` field carries the full byte string including the tag — the ---! comparator is variable-length capable, so numeric and string values within ---! the same column order correctly: the domain tag separates the ranges ---! (numeric < string) and the within-domain comparison falls through to the ---! CLLW per-byte protocol. ---! ---! @note This is a transient type used only during query execution. ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE TYPE eql_v3_internal.ore_cllw AS ( - bytes bytea -); - ---! @file v3/sem/ore_cllw/functions.sql ---! @brief CLLW ORE index-term extraction and comparison (eql_v3 SEM). - ---! @brief Extract CLLW ORE index term from raw jsonb ---! ---! Returns the CLLW ORE ciphertext from the `oc` field of a single sv element ---! supplied as raw jsonb. Inlinable single-statement SQL — the planner folds ---! the body into the calling query. ---! ---! **Missing-`oc` semantics**: returns SQL-level NULL (not a composite with ---! NULL bytes) when `oc` is absent, so btree's NULL handling filters those ---! rows from range queries. ---! ---! @param val jsonb An object carrying an `oc` field ---! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL ---! when the `oc` field is absent. ---! @see eql_v3_internal.has_ore_cllw ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw(val jsonb) - RETURNS eql_v3_internal.ore_cllw - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT CASE WHEN val ->> 'oc' IS NULL THEN NULL - ELSE ROW(decode(val ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw - END -$$; - -COMMENT ON FUNCTION eql_v3_internal.ore_cllw(jsonb) IS - 'eql-inline-critical: raw-jsonb CLLW extractor; must stay inlinable (unpinned search_path)'; - ---! @brief Check if a raw jsonb value contains a CLLW ORE index term ---! @param val jsonb An object that may carry an `oc` field ---! @return boolean True if `oc` field is present and non-null -CREATE FUNCTION eql_v3_internal.has_ore_cllw(val jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT val ->> 'oc' IS NOT NULL -$$; - -COMMENT ON FUNCTION eql_v3_internal.has_ore_cllw(jsonb) IS - 'eql-inline-critical: raw-jsonb CLLW presence helper; must stay inlinable (unpinned search_path)'; - ---! @brief CLLW per-byte comparison helper ---! @internal ---! ---! Byte-by-byte comparison implementing the CLLW order-revealing protocol. ---! Identify the index of the first differing byte; if `(y_byte + 1) == x_byte` ---! (mod 256) there, then x > y; otherwise x < y. Equal inputs return 0. Inputs ---! MUST be the same length (the caller guarantees this). Stays `LANGUAGE ---! plpgsql` — the per-byte loop can't be a single inlinable SQL expression. ---! ---! @param a bytea First CLLW ciphertext slice ---! @param b bytea Second CLLW ciphertext slice ---! @return integer -1, 0, or 1 ---! @throws Exception if inputs are different lengths ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term_bytes(a bytea, b bytea) -RETURNS int - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - len_a INT; - len_b INT; - i INT; - first_diff INT := 0; -BEGIN - - len_a := LENGTH(a); - len_b := LENGTH(b); - - IF len_a != len_b THEN - RAISE EXCEPTION 'ore_cllw index terms are not the same length'; - END IF; - - FOR i IN 1..len_a LOOP - IF first_diff = 0 AND get_byte(a, i - 1) != get_byte(b, i - 1) THEN - first_diff := i; - END IF; - END LOOP; - - IF first_diff = 0 THEN - RETURN 0; - END IF; - - IF ((get_byte(b, first_diff - 1) + 1) & 255) = get_byte(a, first_diff - 1) THEN - RETURN 1; - ELSE - RETURN -1; - END IF; -END; -$$ LANGUAGE plpgsql; - ---! @brief Variable-length CLLW ORE term comparison ---! @internal ---! ---! Three-way comparison of two CLLW ORE ciphertext terms of potentially ---! different lengths. Compares the shared prefix via the CLLW per-byte ---! protocol; on equal prefixes, the shorter input sorts first. The leading ---! domain-tag byte makes numeric (`0x00`) sort before string (`0x01`). Stays ---! `LANGUAGE plpgsql` because it dispatches to `compare_ore_cllw_term_bytes`. ---! ---! btree filters NULL composites at the row level, so this should never see a ---! NULL composite under normal operation; the IS-NULL guard returns NULL ---! defensively. A non-NULL composite with NULL `bytes` is a contract violation ---! — the extractor returns SQL NULL (not ROW(NULL)) on missing `oc`, so raise ---! loudly rather than silently misorder. ---! ---! @param a eql_v3_internal.ore_cllw First term ---! @param b eql_v3_internal.ore_cllw Second term ---! @return integer -1, 0, or 1; NULL if either composite is NULL ---! @throws Exception if either composite has a NULL `bytes` field ---! @see eql_v3_internal.compare_ore_cllw_term_bytes -CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) -RETURNS int - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - len_a INT; - len_b INT; - common_len INT; - cmp_result INT; -BEGIN - -- The `::text` cast is load-bearing, not a stylistic choice. For the - -- single-field `ore_cllw` composite, `ROW(NULL)::ore_cllw IS NULL` is TRUE - -- but `(ROW(NULL)::ore_cllw)::text IS NULL` is FALSE. Casting to text first - -- means a NULL-component composite falls THROUGH to the RAISE below (the - -- extractor-invariant violation) instead of silently returning NULL and - -- masking it. A plain `a IS NULL` would reintroduce that masking bug. - IF a::text IS NULL OR b::text IS NULL THEN - RETURN NULL; - END IF; - - IF a.bytes IS NULL OR b.bytes IS NULL THEN - RAISE EXCEPTION 'eql_v3_internal.compare_ore_cllw_term: composite has NULL bytes field — extractor invariant violated. Check that the index expression uses eql_v3_internal.ore_cllw(...) and not a hand-crafted ROW(NULL).'; - END IF; - - len_a := LENGTH(a.bytes); - len_b := LENGTH(b.bytes); - - IF len_a = 0 AND len_b = 0 THEN - RETURN 0; - ELSIF len_a = 0 THEN - RETURN -1; - ELSIF len_b = 0 THEN - RETURN 1; - END IF; - - IF len_a < len_b THEN - common_len := len_a; - ELSE - common_len := len_b; - END IF; - - cmp_result := eql_v3_internal.compare_ore_cllw_term_bytes( - SUBSTRING(a.bytes FROM 1 FOR common_len), - SUBSTRING(b.bytes FROM 1 FOR common_len) - ); - - IF cmp_result = -1 THEN - RETURN -1; - ELSIF cmp_result = 1 THEN - RETURN 1; - END IF; - - IF len_a < len_b THEN - RETURN -1; - ELSIF len_a > len_b THEN - RETURN 1; - ELSE - RETURN 0; - END IF; -END; -$$ LANGUAGE plpgsql; - --! @file v3/jsonb/types.sql --! @brief Domain types for the eql_v3 encrypted-JSONB (SteVec) surface. --! @@ -24661,7 +24508,7 @@ $$ LANGUAGE plpgsql; --! @internal --! @param val jsonb Candidate entry payload. --! @return boolean True when `val` is an sv entry with string `s`, string `c`, ---! and exactly one string deterministic term (`hm` XOR `oc`). +--! and exactly one string deterministic term (`hm` XOR `op`). CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_entry_payload(val jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE @@ -24671,9 +24518,9 @@ AS $$ AND jsonb_typeof(val -> 's') = 'string' AND jsonb_typeof(val -> 'c') = 'string' AND ( - (jsonb_typeof(val -> 'hm') = 'string' AND NOT (val ? 'oc')) + (jsonb_typeof(val -> 'hm') = 'string' AND NOT (val ? 'op')) OR - (jsonb_typeof(val -> 'oc') = 'string' AND NOT (val ? 'hm')) + (jsonb_typeof(val -> 'op') = 'string' AND NOT (val ? 'hm')) ), false ) @@ -24684,7 +24531,7 @@ $$; --! @param val jsonb Candidate query payload. --! @return boolean True when `val` is `{"sv":[...]}` and every element carries --! string `s`, no ciphertext, and exactly one string term (`hm` XOR ---! `oc`). +--! `op`). --! @note plpgsql, not LANGUAGE sql (issues #353/#354): the only caller is the --! eql_v3.query_jsonb domain CHECK, where a SQL function can never be --! inlined (and the CHECK itself cannot absorb this body — it needs a @@ -24709,9 +24556,9 @@ BEGIN AND jsonb_typeof(elem -> 's') = 'string' AND NOT (elem ? 'c') AND ( - (jsonb_typeof(elem -> 'hm') = 'string' AND NOT (elem ? 'oc')) + (jsonb_typeof(elem -> 'hm') = 'string' AND NOT (elem ? 'op')) OR - (jsonb_typeof(elem -> 'oc') = 'string' AND NOT (elem ? 'hm')) + (jsonb_typeof(elem -> 'op') = 'string' AND NOT (elem ? 'hm')) ) ), false) ), @@ -24779,9 +24626,9 @@ $$; --! --! A single element inside an `sv` array: a JSON object that carries a selector --! (`s`), a ciphertext (`c`), and **exactly one** of `hm` (HMAC-256, for ---! hash-equality) or `oc` (CLLW ORE, for ordered queries) — they are mutually +--! hash-equality) or `op` (CLLW OPE, for ordered queries) — they are mutually --! exclusive. This is the type returned by `->` and accepted by the per-entry ---! extractors `eql_v3.eq_term` / `eql_v3.ore_cllw`. Extra fields (`a`, root +--! extractors `eql_v3.eq_term` / `eql_v3.ord_ope_term`. Extra fields (`a`, root --! `i`/`v` merged in by `->`) are allowed. --! --! @see src/v3/jsonb/operators.sql @@ -24813,9 +24660,9 @@ BEGIN AND jsonb_typeof(VALUE -> 's') = 'string' AND jsonb_typeof(VALUE -> 'c') = 'string' AND ( - (jsonb_typeof(VALUE -> 'hm') = 'string' AND NOT (VALUE ? 'oc')) + (jsonb_typeof(VALUE -> 'hm') = 'string' AND NOT (VALUE ? 'op')) OR - (jsonb_typeof(VALUE -> 'oc') = 'string' AND NOT (VALUE ? 'hm')) + (jsonb_typeof(VALUE -> 'op') = 'string' AND NOT (VALUE ? 'hm')) ), false ) @@ -24830,7 +24677,7 @@ $$; --! --! A query-shaped payload `{"sv":[...]}` whose elements carry selector + index --! term but **never** a ciphertext (`c`). Each element must carry `s` and ---! exactly one deterministic term (`hm` XOR `oc`). Typing the needle this way +--! exactly one deterministic term (`hm` XOR `op`). Typing the needle this way --! stops selector-only needles from casting and matching every row via bare --! `jsonb @>`. --! @@ -24867,7 +24714,7 @@ $$; --! @brief Convert a public.json to a query_jsonb needle. --! --! Normalises each sv element down to the matching-relevant fields: `s` plus ---! exactly one of `hm` / `oc`. Other fields (`c`, `a`, `i`/`v`, anything else) +--! exactly one of `hm` / `op`. Other fields (`c`, `a`, `i`/`v`, anything else) --! are stripped. This is the canonical needle shape for `@>` containment. --! Designed for use as a functional GIN index expression: --! `GIN (eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops)`. @@ -24887,7 +24734,7 @@ AS $$ jsonb_build_object( 's', elem -> 's', 'hm', elem -> 'hm', - 'oc', elem -> 'oc' + 'op', elem -> 'op' ) ) ) @@ -24977,55 +24824,50 @@ AS $$ $$; ------------------------------------------------------------------------------ --- Equality-term extractor (XOR-aware: coalesce(hm, oc)) +-- Equality-term extractor (XOR-aware: coalesce(hm, op)) ------------------------------------------------------------------------------ --! @brief XOR-aware equality term extractor for public.jsonb_entry. --! --! Returns the bytea of whichever deterministic term the sv entry carries — ---! `hm` (HMAC-256) or `oc` (CLLW ORE). The two byte distributions are disjoint +--! `hm` (HMAC-256) or `op` (CLLW OPE). The two byte distributions are disjoint --! by construction, so byte equality on the coalesce is unambiguous. Canonical --! equality extractor used by `=` / `<>` on jsonb_entry. --! --! @param entry public.jsonb_entry ---! @return bytea Decoded `hm` or `oc` bytes (NULL if entry is NULL). +--! @return bytea Decoded `hm` or `op` bytes (NULL if entry is NULL). CREATE FUNCTION eql_v3.eq_term(entry public.jsonb_entry) RETURNS bytea LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT decode(coalesce(entry ->> 'hm', entry ->> 'oc'), 'hex') + SELECT decode(coalesce(entry ->> 'hm', entry ->> 'op'), 'hex') $$; ------------------------------------------------------------------------------ --- ORE CLLW per-entry overloads (live here so sem/ore_cllw stays a leaf) +-- CLLW OPE per-entry overload (converged with the scalar ord_ope_term) ------------------------------------------------------------------------------ ---! @brief Extract CLLW ORE index term from a ste_vec entry. +--! @brief Extract the CLLW OPE index term from a ste_vec entry. --! ---! `oc` is only ever present on an sv element, never at a root encrypted value, ---! so the typed overload accepts public.jsonb_entry. Returns SQL NULL when ---! `oc` is absent (btree NULL-filters such rows from range queries). +--! An sv-element `op` term is only ever present on an sv element, never at a +--! root encrypted value, so the typed overload accepts public.jsonb_entry — +--! the jsonb_entry twin of the generated scalar `eql_v3.ord_ope_term` +--! extractors. Returns SQL NULL when `op` is absent (the strict `->>` / +--! `decode` chain propagates it), so btree NULL-filters such rows from range +--! queries. The returned eql_v3_internal.ope_cllw is a bytea domain: it orders +--! under native byte comparison with the DEFAULT btree opclass, so a +--! functional index on `eql_v3.ord_ope_term(col -> 'selector')` engages +--! structurally with no custom operator class (Supabase/managed-Postgres +--! safe). --! --! @param entry public.jsonb_entry ---! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL. ---! @see eql_v3.has_ore_cllw -CREATE FUNCTION eql_v3.ore_cllw(entry public.jsonb_entry) - RETURNS eql_v3_internal.ore_cllw - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT CASE WHEN entry ->> 'oc' IS NULL THEN NULL - ELSE ROW(decode(entry ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw - END -$$; - ---! @brief Check if a ste_vec entry contains a CLLW ORE index term. ---! @param entry public.jsonb_entry ---! @return boolean True if `oc` is present and non-null. -CREATE FUNCTION eql_v3.has_ore_cllw(entry public.jsonb_entry) - RETURNS boolean +--! @return eql_v3_internal.ope_cllw Hex-decoded CLLW OPE term, or NULL when +--! `op` is absent. +CREATE FUNCTION eql_v3.ord_ope_term(entry public.jsonb_entry) + RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT entry ->> 'oc' IS NOT NULL + SELECT eql_v3_internal.ope_cllw(entry::jsonb) $$; ------------------------------------------------------------------------------ @@ -25082,7 +24924,7 @@ $$ LANGUAGE plpgsql; -- Deterministic-fields array for GIN containment ------------------------------------------------------------------------------ ---! @brief Extract deterministic search fields (s, hm, oc, op) per sv element. +--! @brief Extract deterministic search fields (s, hm, op) per sv element. --! --! Excludes non-deterministic ciphertext so PostgreSQL's native jsonb `@>` can --! compare for containment. Use for GIN indexes and containment queries. @@ -25100,7 +24942,7 @@ AS $$ CASE WHEN val ? 'sv' THEN val->'sv' ELSE jsonb_build_array(val) END ) AS elem, LATERAL jsonb_each(elem) AS kv(key, value) - WHERE kv.key IN ('s', 'hm', 'oc', 'op') + WHERE kv.key IN ('s', 'hm', 'op') GROUP BY elem ); $$; @@ -25156,18 +24998,19 @@ COMMENT ON FUNCTION eql_v3.jsonb_contained_by(jsonb, jsonb) IS --! @brief Check if an sv array contains a specific sv element. --! --! Match = selector equal AND eq_term equal (byte-equality over coalesce(hm, ---! oc)). This collapses the v2 hm/oc CASE: under the XOR contract both terms +--! op)). This collapses the v2 hm/oc CASE: under the XOR contract both terms --! are deterministic and byte-disjoint, so either one is a valid equality --! discriminator and a single byte comparison is correct. --! ---! ASSUMPTION (locked by a negative test in v3_jsonb_tests.rs): hm and oc byte +--! ASSUMPTION (locked by a negative test in v3_jsonb_tests.rs): hm and op byte --! distributions never collide at a given selector. The crypto layer configures --! a selector for eq XOR ordered, so both sides of a real comparison carry the ---! same term type; and an oc value carries a leading domain-tag byte an hm never ---! has. Unlike v2's explicit `has_hmac(both)`/`has_ore_cllw(both)`/`ELSE false` ---! CASE, this collapse would wrongly match an hm needle against an oc leaf if ---! their hex bytes were ever identical — which the contract prevents. The ---! negative-containment test guards against regression. +--! same term type — an hm needle never meets an op leaf at the same selector. +--! This collapse would wrongly match an hm needle against an op leaf if their +--! hex bytes were ever identical — which the contract prevents (an hm is a +--! fixed 32-byte HMAC; an op is a CLLW OPE ciphertext whose length is a +--! function of the plaintext bit width, never 32 bytes for the supported +--! domains). The negative-containment test guards against regression. --! --! @param a jsonb[] sv array to search within. --! @param b jsonb sv element to search for. @@ -25388,7 +25231,7 @@ DROP FUNCTION IF EXISTS eql_v3.version(); --! @brief EQL version reporting (self-contained eql_v3 surface) --! --! This file is auto-generated from src/v3/version.template during build. ---! The 3.0.0-alpha.3 placeholder is replaced with the actual release +--! The 3.0.0-alpha.4 placeholder is replaced with the actual release --! version (bare semver, e.g. "3.0.0") supplied via `mise run build --version`, --! or "DEV" for development builds. @@ -25407,14 +25250,14 @@ CREATE FUNCTION eql_v3.version() RETURNS text IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT '3.0.0-alpha.3'; + SELECT '3.0.0-alpha.4'; $$ LANGUAGE SQL; --! @brief Schema-level version marker for obj_description() discoverability --! --! Mirrors eql_v3.version() as a comment on the schema so the installed --! version can also be read via obj_description('eql_v3'::regnamespace). -COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.3'; +COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.4'; --! @brief EQL lint: detect non-inlinable operator implementation functions --! @@ -25435,7 +25278,7 @@ COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.3'; --! (or `pg_get_functiondef`); tracked as a follow-up. --! --! Operators on `eql_v3` types (the jsonb-backed encrypted-domain families and ---! the SEM index-term types `eql_v3_internal.ore_block_256`, `eql_v3_internal.ore_cllw`) whose +--! the SEM index-term type `eql_v3_internal.ore_block_256`) whose --! implementation functions fail any of these rules silently fall back to seq --! scan when the documented functional indexes (`eql_v3.eq_term(col)`, --! `eql_v3.ord_term(col)`) are in place. This lint surfaces every such case. @@ -37718,6 +37561,192 @@ CREATE OPERATOR >= ( ); -- AUTOMATICALLY GENERATED FILE. +--! @file v3/scalars/ore_fallback.sql +--! @brief Disable the ORE-backed encrypted domains when the ORE operator class is absent (CIP-3468). +--! +--! Runs after the DO block in src/v3/sem/ore_block_256/operator_class.sql, +--! which ATTEMPTS to create the default btree operator class for +--! eql_v3_internal.ore_block_256 and skips it on insufficient_privilege +--! (CREATE OPERATOR CLASS requires superuser; managed platforms — cloud +--! Supabase and most hosted Postgres — run the installer as a non-superuser +--! role). When the class was created, this file is a no-op. +--! +--! When the class was skipped, the ORE-carrying domains would otherwise +--! install half-working: `<`/`>` comparisons still run (as unindexable seq +--! scans), while `CREATE INDEX ... (eql_v3.ord_term(col))` and bare +--! `ORDER BY` fail with opaque Postgres errors. Instead of that silent +--! degradation, this file poisons every ORE-carrying domain (and its +--! query-operand twin) with an always-raising CHECK constraint, so the first +--! value coerced into the domain fails loudly and points at the +--! platform-supported alternatives (OPE ordering / HMAC equality / +--! bloom-filter match). +--! +--! Footguns honoured (see the encrypted-domain footgun list in CLAUDE.md): +--! the poison function is LANGUAGE plpgsql (never inlined, so the RAISE +--! cannot be planned away) and NOT STRICT (a STRICT function is skipped for +--! NULL inputs, which would silently let NULLs through the poisoned domain). +--! +--! The poison constraints are added NOT VALID. For domains — unlike table +--! constraints — this does not weaken enforcement: coercion applies every +--! constraint regardless of validation status, so new casts and inserts +--! (including NULL) still raise. What it skips is validating existing stored +--! data: without it, re-running the installer over a database that already +--! holds ORE values (written under an earlier superuser install, before the +--! installing role was demoted) would run the always-raising poison against +--! every stored row and abort the install. + +DO $do$ +BEGIN + IF EXISTS ( + SELECT 1 + FROM pg_catalog.pg_opclass c + JOIN pg_catalog.pg_am am ON am.oid = c.opcmethod + WHERE am.amname = 'btree' + AND c.opcdefault + AND c.opcintype = 'eql_v3_internal.ore_block_256'::pg_catalog.regtype + ) THEN + RETURN; + END IF; + + --! @brief Poison CHECK backing for the ORE-carrying domains on platforms + --! without the ORE operator class. Always raises; never returns. + --! @internal + CREATE FUNCTION eql_v3_internal.ore_domain_unavailable(val jsonb, domain_name text, alternatives text) + RETURNS boolean + IMMUTABLE PARALLEL SAFE + SET search_path = pg_catalog, extensions, public + LANGUAGE plpgsql + AS $poison$ + BEGIN + RAISE EXCEPTION 'EQL: % cannot be used on this platform: the EQL installer could not create the ORE operator class (requires superuser, unavailable on e.g. cloud-hosted Supabase)', domain_name + USING HINT = 'Use ' || alternatives || ' instead.', + ERRCODE = 'feature_not_supported'; + END; + $poison$; + -- NOT VALID: skip validating existing stored data (rows written under an + -- earlier superuser install must stay readable, and re-installing over them + -- must not abort). Domain coercion still enforces the CHECK on every new + -- cast/insert regardless of validation status. + + ALTER DOMAIN public.integer_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord_ore', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_integer_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord_ore', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.integer_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_integer_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord_ore', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord_ore', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.smallint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_smallint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord_ore', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord_ore', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.bigint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_bigint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.date_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord_ore', 'public.date_eq (equality) or public.date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_date_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord_ore', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.date_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord', 'public.date_eq (equality) or public.date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_date_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord_ore', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord_ore', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.timestamp_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_timestamp_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord_ore', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord_ore', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.numeric_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_numeric_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.text_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord_ore', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_text_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord_ore', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.text_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_text_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.text_search ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_search', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_text_search ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_search', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.real_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord_ore', 'public.real_eq (equality) or public.real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_real_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord_ore', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.real_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord', 'public.real_eq (equality) or public.real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_real_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.double_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord_ore', 'public.double_eq (equality) or public.double_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_double_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord_ore', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.double_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord', 'public.double_eq (equality) or public.double_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_double_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)')) NOT VALID; + + RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — 38 ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering) and _eq (equality) domains — and text_match for text pattern match — instead'; +END; +$do$; +-- AUTOMATICALLY GENERATED FILE. + --! @file encrypted_domain/text/query_text_match_functions.sql --! @brief Functions for eql_v3.query_text_match. @@ -41991,291 +42020,42 @@ CREATE OPERATOR >= ( COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); ---! @file v3/sem/ore_block_256/operator_class.sql ---! @brief B-tree operator family + default class on eql_v3_internal.ore_block_256. ---! ---! Gives the composite type its DEFAULT btree opclass so the recommended ---! functional index `CREATE INDEX ON t (eql_v3_internal.ord_term(col))` engages without ---! an explicit opclass annotation (design D4). ---! ---! @note Creating an operator family/class requires superuser: Postgres forbids ---! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index ---! integrity. Managed platforms (Supabase, and most hosted Postgres) run ---! the installer as a non-superuser role, so the DO block below ATTEMPTS ---! the creation and skips it on insufficient_privilege (SQLSTATE 42501), ---! letting the single installer run everywhere. When the class is absent, ---! ORE ordered scans over eql_v3_internal.ore_block_256 are unavailable, ---! but the order-preserving (OPE) ordering domains — whose extractor ---! return types carry a native btree opclass — still index without it. On ---! superuser installs (self-managed Postgres, the SQLx test matrix) the ---! class is created normally. Any non-privilege error still propagates. ---! @see eql_v3_internal.compare_ore_block_256_terms - -DO $do$ -BEGIN - EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree'; - - EXECUTE $ddl$ - CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class - DEFAULT FOR TYPE eql_v3_internal.ore_block_256 - USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS - OPERATOR 1 public.<, - OPERATOR 2 public.<=, - OPERATOR 3 public.=, - OPERATOR 4 public.>=, - OPERATOR 5 public.>, - FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256) - $ddl$; - - RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_block_256_operator_class'; -EXCEPTION - WHEN insufficient_privilege THEN - RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_block_256_operator_class (requires superuser); ORE ordered indexes on ore_block_256 unavailable, OPE ordering domains unaffected'; -END; -$do$; - ---! @file v3/sem/ore_cllw/operators.sql ---! @brief Comparison operators on the eql_v3_internal.ore_cllw composite type. ---! ---! Each backing function reduces to a single SELECT over ---! eql_v3_internal.compare_ore_cllw_term(a, b) and is inlinable so the planner can fold ---! it through to functional-index matching. The inner comparator is plpgsql ---! (per-byte loop) and is not inlined — fine for index *match*. ---! ---! @note Deliberately no HASHES / MERGES — the CLLW protocol gives ordering, ---! not a hash; there is no merge-joinable opclass on the other side. ---! @see eql_v3_internal.compare_ore_cllw_term - ---! @brief Equality backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the CLLW ORE terms are equal ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_eq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 0 -$$; - ---! @brief Not-equal backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the CLLW ORE terms are not equal ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_neq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 0 -$$; - ---! @brief Less-than backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is less than the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_lt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = -1 -$$; - ---! @brief Less-than-or-equal backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is less than or equal to the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_lte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 1 -$$; - ---! @brief Greater-than backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is greater than the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_gt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 1 -$$; - ---! @brief Greater-than-or-equal backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is greater than or equal to the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_gte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> -1 -$$; - - -CREATE OPERATOR public.= ( - FUNCTION = eql_v3_internal.ore_cllw_eq, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.=), - NEGATOR = OPERATOR(public.<>), - RESTRICT = eqsel, - JOIN = eqjoinsel -); - -CREATE OPERATOR public.<> ( - FUNCTION = eql_v3_internal.ore_cllw_neq, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.<>), - NEGATOR = OPERATOR(public.=), - RESTRICT = neqsel, - JOIN = neqjoinsel -); - -CREATE OPERATOR public.< ( - FUNCTION = eql_v3_internal.ore_cllw_lt, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.>), - NEGATOR = OPERATOR(public.>=), - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - -CREATE OPERATOR public.<= ( - FUNCTION = eql_v3_internal.ore_cllw_lte, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.>=), - NEGATOR = OPERATOR(public.>), - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - -CREATE OPERATOR public.> ( - FUNCTION = eql_v3_internal.ore_cllw_gt, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.<), - NEGATOR = OPERATOR(public.<=), - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - -CREATE OPERATOR public.>= ( - FUNCTION = eql_v3_internal.ore_cllw_gte, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.<=), - NEGATOR = OPERATOR(public.<), - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); - ---! @file v3/sem/ore_cllw/operator_class.sql ---! @brief Btree operator class on the eql_v3_internal.ore_cllw composite type. ---! ---! DEFAULT FOR TYPE so a functional btree index on eql_v3_internal.ore_cllw(expr) ---! engages without an explicit opclass annotation. FUNCTION 1 is the three-way ---! comparator btree's internal sort uses; it is plpgsql by design (per-byte ---! CLLW protocol needs iteration) and is called once per index-entry pair ---! during build / search, not per-row in the outer query. ---! ---! @note Creating an operator family/class requires superuser: Postgres forbids ---! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index ---! integrity. Managed platforms (Supabase, and most hosted Postgres) run ---! the installer as a non-superuser role, so the DO block below ATTEMPTS ---! the creation and skips it on insufficient_privilege (SQLSTATE 42501), ---! letting the single installer run everywhere. When the class is absent, ---! ORE ordered scans over eql_v3_internal.ore_cllw are unavailable, but ---! the order-preserving (OPE) ordering domains — whose extractor return ---! types carry a native btree opclass — still index without it. On ---! superuser installs (self-managed Postgres, the SQLx test matrix) the ---! class is created normally. Any non-privilege error still propagates. ---! @see eql_v3_internal.compare_ore_cllw_term - -DO $do$ -BEGIN - EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_cllw_ops USING btree'; - - EXECUTE $ddl$ - CREATE OPERATOR CLASS eql_v3_internal.ore_cllw_ops - DEFAULT FOR TYPE eql_v3_internal.ore_cllw - USING btree FAMILY eql_v3_internal.ore_cllw_ops AS - OPERATOR 1 public.< (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 2 public.<= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 3 public.= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 4 public.>= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 5 public.> (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - FUNCTION 1 eql_v3_internal.compare_ore_cllw_term(eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw) - $ddl$; - - RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_cllw_ops'; -EXCEPTION - WHEN insufficient_privilege THEN - RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_cllw_ops (requires superuser); ORE ordered indexes on ore_cllw unavailable, OPE ordering domains unaffected'; -END; -$do$; - --! @file v3/jsonb/aggregates.sql --! @brief min / max aggregates over public.jsonb_entry. --! --! SteVec document entries extracted at a selector (`doc -> 'sel'`) order by ---! their CLLW ORE (`oc`) term, so the extremum is picked by comparing ---! `eql_v3.ore_cllw(entry)` rather than the scalar Block-ORE `ord_term` the ---! generated scalar ord aggregates use. Same STRICT + PARALLEL SAFE shape as the ---! generated scalar `min`/`max` so partial/parallel aggregation is available on ---! large GROUP BY workloads. +--! their CLLW OPE (`op`) term, so the extremum is picked by comparing +--! `eql_v3.ord_ope_term(entry)` rather than the scalar Block-ORE `ord_term` the +--! generated scalar ord aggregates use. The ope_cllw bytea domain orders under +--! native byte comparison, so `<` / `>` on the extracted terms needs no custom +--! comparator. Same STRICT + PARALLEL SAFE shape as the generated scalar +--! `min`/`max` so partial/parallel aggregation is available on large GROUP BY +--! workloads. --! --! Per the encrypted-domain footgun rules the state functions are --! `LANGUAGE plpgsql` with the pinned `search_path` — a `LANGUAGE sql` body would --! be inlinable and the planner could elide it. --! ---! @note **Only `oc`-carrying entries are orderable.** `eql_v3.ore_cllw(entry)` ---! returns NULL when an entry has no `oc` (CLLW ORE) term — the same entries a ---! `eql_v3.ore_cllw` btree NULL-filters from range scans. The state functions ---! therefore IGNORE `oc`-less entries (they never become or survive as the ---! extremum), so `min`/`max` is well-defined over a mix of `oc`-carrying and ---! `oc`-less entries and is not corrupted by an `oc`-less seed. A naive ---! `ore_cllw(value) < ore_cllw(state)` would be NULL whenever either side ---! lacks `oc`, pinning a wrong (`oc`-less) extremum when the first aggregated ---! row is `oc`-less. An all-`oc`-less input has no orderable extremum and +--! @note **Only `op`-carrying entries are orderable.** `eql_v3.ord_ope_term(entry)` +--! returns NULL when an entry has no `op` (CLLW OPE) term — the same entries a +--! `eql_v3.ord_ope_term` btree NULL-filters from range scans. The state functions +--! therefore IGNORE `op`-less entries (they never become or survive as the +--! extremum), so `min`/`max` is well-defined over a mix of `op`-carrying and +--! `op`-less entries and is not corrupted by an `op`-less seed. A naive +--! `ord_ope_term(value) < ord_ope_term(state)` would be NULL whenever either side +--! lacks `op`, pinning a wrong (`op`-less) extremum when the first aggregated +--! row is `op`-less. An all-`op`-less input has no orderable extremum and --! returns the (arbitrary) STRICT seed. --! @brief State function for min on public.jsonb_entry. --! ---! Keeps whichever orderable entry has the lesser CLLW ORE term. STRICT, so SQL ---! NULL entries are skipped by the aggregate machinery; `oc`-less (non-orderable) +--! Keeps whichever orderable entry has the lesser CLLW OPE term. STRICT, so SQL +--! NULL entries are skipped by the aggregate machinery; `op`-less (non-orderable) --! entries are skipped explicitly (see the @note on this file). --! --! @param state public.jsonb_entry Running extremum. --! @param value public.jsonb_entry Candidate entry. ---! @return public.jsonb_entry The lesser orderable entry by `ore_cllw`. +--! @return public.jsonb_entry The lesser orderable entry by `ord_ope_term`. CREATE FUNCTION eql_v3_internal.jsonb_entry_min_sfunc( state public.jsonb_entry, value public.jsonb_entry @@ -42285,16 +42065,16 @@ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ DECLARE - value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value); - state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state); + value_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(value); + state_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(state); BEGIN - -- A non-orderable (oc-less) candidate never replaces the running extremum. - IF value_ore IS NULL THEN + -- A non-orderable (op-less) candidate never replaces the running extremum. + IF value_ope IS NULL THEN RETURN state; END IF; -- Adopt the candidate when the running extremum is itself non-orderable - -- (e.g. an oc-less STRICT seed) or strictly greater. - IF state_ore IS NULL OR value_ore < state_ore THEN + -- (e.g. an op-less STRICT seed) or strictly greater. + IF state_ope IS NULL OR value_ope < state_ope THEN RETURN value; END IF; RETURN state; @@ -42303,7 +42083,7 @@ $$; --! @brief min aggregate over public.jsonb_entry. --! @param input public.jsonb_entry ---! @return public.jsonb_entry The entry with the smallest CLLW ORE term. +--! @return public.jsonb_entry The entry with the smallest CLLW OPE term. CREATE AGGREGATE eql_v3.min(public.jsonb_entry) ( sfunc = eql_v3_internal.jsonb_entry_min_sfunc, stype = public.jsonb_entry, @@ -42313,12 +42093,12 @@ CREATE AGGREGATE eql_v3.min(public.jsonb_entry) ( --! @brief State function for max on public.jsonb_entry. --! ---! Keeps whichever orderable entry has the greater CLLW ORE term. `oc`-less +--! Keeps whichever orderable entry has the greater CLLW OPE term. `op`-less --! entries are skipped, mirroring `jsonb_entry_min_sfunc` (see the file @note). --! --! @param state public.jsonb_entry Running extremum. --! @param value public.jsonb_entry Candidate entry. ---! @return public.jsonb_entry The greater orderable entry by `ore_cllw`. +--! @return public.jsonb_entry The greater orderable entry by `ord_ope_term`. CREATE FUNCTION eql_v3_internal.jsonb_entry_max_sfunc( state public.jsonb_entry, value public.jsonb_entry @@ -42328,16 +42108,16 @@ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ DECLARE - value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value); - state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state); + value_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(value); + state_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(state); BEGIN - -- A non-orderable (oc-less) candidate never replaces the running extremum. - IF value_ore IS NULL THEN + -- A non-orderable (op-less) candidate never replaces the running extremum. + IF value_ope IS NULL THEN RETURN state; END IF; -- Adopt the candidate when the running extremum is itself non-orderable - -- (e.g. an oc-less STRICT seed) or strictly lesser. - IF state_ore IS NULL OR value_ore > state_ore THEN + -- (e.g. an op-less STRICT seed) or strictly lesser. + IF state_ope IS NULL OR value_ope > state_ope THEN RETURN value; END IF; RETURN state; @@ -42346,7 +42126,7 @@ $$; --! @brief max aggregate over public.jsonb_entry. --! @param input public.jsonb_entry ---! @return public.jsonb_entry The entry with the largest CLLW ORE term. +--! @return public.jsonb_entry The entry with the largest CLLW OPE term. CREATE AGGREGATE eql_v3.max(public.jsonb_entry) ( sfunc = eql_v3_internal.jsonb_entry_max_sfunc, stype = public.jsonb_entry, @@ -42369,8 +42149,8 @@ CREATE AGGREGATE eql_v3.max(public.jsonb_entry) ( --! index on `eql_v3.eq_term(col -> 'sel')`. --! --! @warning The selector operand MUST carry a known type — a text-typed ---! parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::text`). ---! A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> text` +--! parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::%text`). +--! A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> %text` --! operator and silently returns native jsonb semantics (a root-key lookup, --! typically NULL), NOT this operator: PostgreSQL reduces the `public.json` --! domain to its base type `jsonb` when resolving an unknown-typed RHS, and the @@ -42536,7 +42316,7 @@ AS $$ jsonb_build_object( 's', b -> 's', 'hm', b -> 'hm', - 'oc', b -> 'oc' + 'op', b -> 'op' ) ) ) @@ -42650,7 +42430,7 @@ CREATE OPERATOR <> ( JOIN = neqjoinsel ); ---! @brief Less-than on jsonb_entry via ore_cllw. +--! @brief Less-than on jsonb_entry via the CLLW OPE term (native bytea order). --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is less than b @@ -42658,7 +42438,7 @@ CREATE FUNCTION eql_v3.lt(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) < eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; CREATE OPERATOR < ( @@ -42671,7 +42451,7 @@ CREATE OPERATOR < ( JOIN = scalarltjoinsel ); ---! @brief Less-than-or-equal on jsonb_entry via ore_cllw. +--! @brief Less-than-or-equal on jsonb_entry via the CLLW OPE term. --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is less than or equal to b @@ -42679,7 +42459,7 @@ CREATE FUNCTION eql_v3.lte(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) <= eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; CREATE OPERATOR <= ( @@ -42692,7 +42472,7 @@ CREATE OPERATOR <= ( JOIN = scalarlejoinsel ); ---! @brief Greater-than on jsonb_entry via ore_cllw. +--! @brief Greater-than on jsonb_entry via the CLLW OPE term. --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is greater than b @@ -42700,7 +42480,7 @@ CREATE FUNCTION eql_v3.gt(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) > eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; CREATE OPERATOR > ( @@ -42713,7 +42493,7 @@ CREATE OPERATOR > ( JOIN = scalargtjoinsel ); ---! @brief Greater-than-or-equal on jsonb_entry via ore_cllw. +--! @brief Greater-than-or-equal on jsonb_entry via the CLLW OPE term. --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is greater than or equal to b @@ -42721,7 +42501,7 @@ CREATE FUNCTION eql_v3.gte(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) >= eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; CREATE OPERATOR >= ( @@ -43264,10 +43044,10 @@ CREATE OPERATOR <@ ( --! satisfying Supabase splinter's `function_search_path_mutable` lint. --! --! @note A SET clause disables SQL-function inlining. The inline-critical SEM ---! helpers (ore_block_256_*, ore_cllw_*, ore_cllw/has_ore_cllw, ---! ope_cllw, hmac_256, bloom_filter over jsonb) and the ---! encrypted-domain family (recognised structurally, including public ---! user-column domains) are deliberately left unpinned. +--! helpers (ore_block_256_*, ope_cllw, hmac_256, bloom_filter over +--! jsonb) and the encrypted-domain family (recognised structurally, +--! including public user-column domains) are deliberately left +--! unpinned. --! @see tasks/test/splinter.sh --! @see tasks/build.sh @@ -43298,13 +43078,6 @@ BEGIN AND p.proname IN ('ore_block_256_eq', 'ore_block_256_neq', 'ore_block_256_lt', 'ore_block_256_lte', 'ore_block_256_gt', 'ore_block_256_gte')) - OR (p.pronargs = 2 - AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', - 'ore_cllw_lt', 'ore_cllw_lte', - 'ore_cllw_gt', 'ore_cllw_gte')) - OR (p.pronargs = 1 - AND p.proname IN ('ore_cllw', 'has_ore_cllw') - AND p.proargtypes[0] = jsonb_oid) -- The CLLW-OPE surface is the extractor alone: eql_v3_internal.ope_cllw is a -- domain over bytea (native comparison operators and btree opclass), -- so there are no ope-specific comparison functions to keep inlinable. diff --git a/crates/eql-bindings/sql/release-manifest.json b/crates/eql-bindings/sql/release-manifest.json index 34cad1950..de196e24c 100644 --- a/crates/eql-bindings/sql/release-manifest.json +++ b/crates/eql-bindings/sql/release-manifest.json @@ -1,6 +1,6 @@ { - "eqlVersion": "3.0.0-alpha.3", + "eqlVersion": "3.0.0-alpha.4", "schemaVersion": 3, - "installSqlSha256": "ec7af1b334cd9ba2d6356bcb3eec41a4db5bfc6e39108de74484134aa90b7929", + "installSqlSha256": "eb4036cf7d2513e9cdff987582c1bba889300929f8ff4d6e6d984665c06eec9b", "uninstallSqlSha256": "b1b5131b8175c5d04da9ada108d25c81c5772b15fad79a6c419ebb32d18c60a9" } diff --git a/packages/eql/CHANGELOG.md b/packages/eql/CHANGELOG.md index 1bd58b28a..39b8518ec 100644 --- a/packages/eql/CHANGELOG.md +++ b/packages/eql/CHANGELOG.md @@ -1,5 +1,19 @@ # @cipherstash/eql +## 3.0.0-alpha.4 + +### Major Changes + +- 60bc2fe: **SteVec (encrypted JSONB) ordering switched from CLLW-ORE to CLLW-OPE: sv entries carry `hm` XOR `op`, and entry ordering extracts `eql_v3.ord_ope_term(entry)` — native bytea order, no operator class.** The `eql_v3_internal.ore_cllw` composite type, its per-byte comparator, six operators, and superuser-only `DEFAULT FOR TYPE` btree operator class are removed, along with `eql_v3.ore_cllw(entry)` / `eql_v3.has_ore_cllw(entry)`; the domain CHECKs on `public.json` / `public.jsonb_entry` / `eql_v3.query_jsonb` now validate `hm` XOR `op` and reject `oc`-bearing payloads. Why: `CREATE OPERATOR CLASS` requires superuser, so SteVec entry ordering was the last EQL surface that could not index on cloud-hosted Supabase / managed Postgres — the CLLW-OPE term is the same `op` / `eql_v3_internal.ope_cllw` bytea domain the scalar `_ord_ope` domains use, the whole comparison chain is inlinable SQL, and a plain functional btree index on `eql_v3.ord_ope_term(doc -> ''::text)` engages structurally on any install. Stored `oc` documents must be re-encrypted with an OPE-mode client (`eql-bindings`' `from_v2` fails closed with the new `UnconvertibleOreTerm` on `oc` entries; the bindings' `SteVecTerm` gains an `OpeCllw { op }` variant in place of `OreCllw { oc }`). See [U-004](docs/upgrading/v3.0.md#u-004-stevec-ordering-terms-are-cllw-ope-op) for the migration recipe. ([CIP-3469](https://linear.app/cipherstash/issue/CIP-3469/switch-jsonbstevec-support-from-cllw-ore-to-ope)) + +### Minor Changes + +- 99dc436: **Non-superuser installs (cloud-hosted Supabase, most managed Postgres) now disable the ORE-backed domains loudly instead of installing them half-working.** `CREATE OPERATOR CLASS` requires superuser, so the installer has always attempted the ORE operator class and skipped it on `insufficient_privilege` — but the ORE-carrying domains (`_ord` / `_ord_ore` on every ordered scalar, `text_search`, and their `eql_v3.query_*` twins) still installed, leaving a trap: `<` / `>` comparisons ran as unindexable seq scans while `CREATE INDEX ... (eql_v3.ord_term(col))` and bare `ORDER BY` failed with opaque Postgres errors. The installer now capability-detects the skip (by checking `pg_opclass` after the attempt) and poisons all 38 ORE-carrying domains with an always-raising `CHECK` constraint: the first value cast or inserted into one — including `NULL` — raises `feature_not_supported` (SQLSTATE `0A000`) naming the domain and pointing at the platform-supported alternatives (`_ord_ope` for indexed ordering via CLLW-OPE, `_eq` for equality, `text_match` for pattern match). The constraint is added `NOT VALID`, so ORE data written under an earlier superuser install stays readable and re-running the installer over it succeeds — only new casts and inserts raise. Superuser installs are unchanged: the operator class is created and nothing is poisoned. The check is install-time, so installing as superuser keeps full ORE support regardless of which role queries later. ([CIP-3468](https://linear.app/cipherstash/issue/CIP-3468/do-not-install-ore-types-on-cloud-hosted-supabase)) + +### Patch Changes + +- a758894: **npm prereleases publish under the `latest` dist-tag until 3.0.0 ships.** Until the 3.0.0 final, the alphas are the package's only release line, so `npm install @cipherstash/eql` should resolve to the newest alpha instead of whichever version last happened to hold `latest`. Once 3.0.0 GA is published, prereleases return to their channel dist-tag (`alpha`/`beta`/`rc`) and `latest` stays on finals (`PRE_GA_LATEST` in `packages/eql/scripts/npm-publish.mjs`). + ## 3.0.0-alpha.3 ### Major Changes diff --git a/packages/eql/package.json b/packages/eql/package.json index 158530eb6..3d295a704 100644 --- a/packages/eql/package.json +++ b/packages/eql/package.json @@ -1,6 +1,6 @@ { "name": "@cipherstash/eql", - "version": "3.0.0-alpha.3", + "version": "3.0.0-alpha.4", "description": "Canonical EQL v3 wire types, JSON schemas, and SQL bundle.", "keywords": [ "eql", diff --git a/packages/eql/sql/cipherstash-encrypt.sql b/packages/eql/sql/cipherstash-encrypt.sql index 617a1bddc..6d48b5007 100644 --- a/packages/eql/sql/cipherstash-encrypt.sql +++ b/packages/eql/sql/cipherstash-encrypt.sql @@ -2580,6 +2580,107 @@ END $$; -- AUTOMATICALLY GENERATED FILE. +--! @file v3/scalars/timestamp/timestamp_types.sql +--! @brief Encrypted-domain types for timestamp. + +DO $$ +BEGIN + --! @brief Encrypted domain public.timestamp. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp IS 'EQL encrypted timestamp (storage only)'; + + --! @brief Encrypted domain public.timestamp_eq. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_eq' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'hm' + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_eq IS 'EQL encrypted timestamp (equality)'; + + --! @brief Encrypted domain public.timestamp_ord_ore. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL encrypted timestamp (equality, ordering)'; + + --! @brief Encrypted domain public.timestamp_ord. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'ob' + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_ord IS 'EQL encrypted timestamp (equality, ordering)'; + + --! @brief Encrypted domain public.timestamp_ord_ope. + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'public'::regnamespace + ) THEN + CREATE DOMAIN public.timestamp_ord_ope AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'c' + AND VALUE ? 'op' + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL encrypted timestamp (equality, ordering)'; +END +$$; +-- AUTOMATICALLY GENERATED FILE. + --! @file v3/scalars/text/text_types.sql --! @brief Encrypted-domain types for text. @@ -3179,107 +3280,6 @@ AS $$ $$; -- AUTOMATICALLY GENERATED FILE. ---! @file v3/scalars/timestamp/timestamp_types.sql ---! @brief Encrypted-domain types for timestamp. - -DO $$ -BEGIN - --! @brief Encrypted domain public.timestamp. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp IS 'EQL encrypted timestamp (storage only)'; - - --! @brief Encrypted domain public.timestamp_eq. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_eq' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_eq AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'hm' - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_eq IS 'EQL encrypted timestamp (equality)'; - - --! @brief Encrypted domain public.timestamp_ord_ore. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord_ore' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_ord_ore AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'ob' - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_ord_ore IS 'EQL encrypted timestamp (equality, ordering)'; - - --! @brief Encrypted domain public.timestamp_ord. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_ord AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'ob' - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_ord IS 'EQL encrypted timestamp (equality, ordering)'; - - --! @brief Encrypted domain public.timestamp_ord_ope. - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'timestamp_ord_ope' AND typnamespace = 'public'::regnamespace - ) THEN - CREATE DOMAIN public.timestamp_ord_ope AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'c' - AND VALUE ? 'op' - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN public.timestamp_ord_ope IS 'EQL encrypted timestamp (equality, ordering)'; -END -$$; --- AUTOMATICALLY GENERATED FILE. - --! @file encrypted_domain/timestamp/timestamp_eq_functions.sql --! @brief Functions for public.timestamp_eq. @@ -3682,11 +3682,12 @@ AS $$ BEGIN RAISE EXCEPTION 'operator % is not supported for %', '||', 'public.t LANGUAGE plpgsql; --! @file v3/sem/ope_cllw/types.sql ---! @brief CLLW OPE index term type for scalar range queries (eql_v3 SEM) +--! @brief CLLW OPE index term type for ordered range queries (eql_v3 SEM) --! --! Domain type representing a CLLW (Copyless Logarithmic Width) --! Order-Preserving Encryption term. The ciphertext is stored hex-encoded in ---! the `op` field of encrypted scalar payloads (the `_ord_ope` domains); the +--! the `op` field of encrypted payloads — the scalar `_ord_ope` domains and +--! the ordered entries of a SteVec document (`public.jsonb_entry`); the --! domain carries the hex-decoded bytes. --! --! A DOMAIN over bytea, not a composite: the OPE ciphertext is @@ -3696,8 +3697,8 @@ LANGUAGE plpgsql; --! same pattern as eql_v3_internal.hmac_256 over text). That keeps the whole --! comparison chain inlinable, so a functional btree index on --! `eql_v3.ord_ope_term(col)` engages structurally for the `_ord_ope` ---! domains' comparison operators. Contrast eql_v3_internal.ore_cllw (`oc`), the SteVec ---! CLLW-*ORE* composite compared by a custom per-byte protocol. +--! domains' comparison operators — and likewise on +--! `eql_v3.ord_ope_term(col -> 'selector')` for SteVec entry ordering. --! --! @note Transient type used only during query execution. --! @see eql_v3_internal.ope_cllw @@ -19682,6 +19683,141 @@ AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; CREATE FUNCTION eql_v3.neq(a eql_v3.query_integer_eq, b public.integer_eq) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ SELECT eql_v3.eq_term(a) <> eql_v3.eq_term(b) $$; + +--! @file v3/sem/ore_block_256/operator_class.sql +--! @brief B-tree operator family + default class on eql_v3_internal.ore_block_256. +--! +--! Gives the composite type its DEFAULT btree opclass so the recommended +--! functional index `CREATE INDEX ON t (eql_v3_internal.ord_term(col))` engages without +--! an explicit opclass annotation (design D4). +--! +--! @note Creating an operator family/class requires superuser: Postgres forbids +--! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index +--! integrity. Managed platforms (Supabase, and most hosted Postgres) run +--! the installer as a non-superuser role, so the DO block below ATTEMPTS +--! the creation and skips it on insufficient_privilege (SQLSTATE 42501), +--! letting the single installer run everywhere. When the class is absent, +--! ORE ordered scans over eql_v3_internal.ore_block_256 are unavailable, +--! but the order-preserving (OPE) ordering domains — whose extractor +--! return types carry a native btree opclass — still index without it. On +--! superuser installs (self-managed Postgres, the SQLx test matrix) the +--! class is created normally. Any non-privilege error still propagates. +--! @see eql_v3_internal.compare_ore_block_256_terms + +DO $do$ +BEGIN + EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree'; + + EXECUTE $ddl$ + CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class + DEFAULT FOR TYPE eql_v3_internal.ore_block_256 + USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS + OPERATOR 1 public.<, + OPERATOR 2 public.<=, + OPERATOR 3 public.=, + OPERATOR 4 public.>=, + OPERATOR 5 public.>, + FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256) + $ddl$; + + RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_block_256_operator_class'; +EXCEPTION + WHEN insufficient_privilege THEN + RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_block_256_operator_class (requires superuser); ORE ordered indexes on ore_block_256 unavailable, OPE ordering domains unaffected'; +END; +$do$; +-- AUTOMATICALLY GENERATED FILE. + +--! @file v3/scalars/timestamp/query_timestamp_types.sql +--! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). +--! @note Query-operand domains live in `eql_v3` (not `public`): they are +--! never valid column types, so they don't belong in the column-type +--! namespace, and dropping the EQL-owned schema can never drop an +--! application column. +--! @note Cast a query operand explicitly to its `query_` domain in a predicate +--! (e.g. `WHERE col = $1::eql_v3.query_timestamp_eq`). A bare, +--! uncast literal RHS is ambiguous between the `query_` and `jsonb` +--! operator overloads and will not resolve. + +DO $$ +BEGIN + --! @brief Query-operand domain eql_v3.query_timestamp_eq (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_eq AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'hm' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_eq IS 'EQL timestamp query operand (equality)'; + + --! @brief Query-operand domain eql_v3.query_timestamp_ord_ore (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_ord_ore AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)'; + + --! @brief Query-operand domain eql_v3.query_timestamp_ord (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_ord AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'ob' + AND NOT (VALUE ? 'c') + AND jsonb_typeof(VALUE -> 'ob') = 'array' + AND jsonb_array_length(VALUE -> 'ob') > 0 + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)'; + + --! @brief Query-operand domain eql_v3.query_timestamp_ord_ope (term-only; no `c`). + IF NOT EXISTS ( + SELECT 1 FROM pg_type + WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace + ) THEN + CREATE DOMAIN eql_v3.query_timestamp_ord_ope AS jsonb + CHECK ( + jsonb_typeof(VALUE) = 'object' + AND VALUE ? 'v' + AND VALUE ? 'i' + AND VALUE ? 'op' + AND NOT (VALUE ? 'c') + AND VALUE->>'v' = '3' + ); + END IF; + + COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)'; +END +$$; -- AUTOMATICALLY GENERATED FILE. --! @file v3/scalars/text/query_text_types.sql @@ -23441,98 +23577,6 @@ CREATE OPERATOR || ( ); -- AUTOMATICALLY GENERATED FILE. ---! @file v3/scalars/timestamp/query_timestamp_types.sql ---! @brief Query-operand domains for timestamp (index-terms-only, no ciphertext). ---! @note Query-operand domains live in `eql_v3` (not `public`): they are ---! never valid column types, so they don't belong in the column-type ---! namespace, and dropping the EQL-owned schema can never drop an ---! application column. ---! @note Cast a query operand explicitly to its `query_` domain in a predicate ---! (e.g. `WHERE col = $1::eql_v3.query_timestamp_eq`). A bare, ---! uncast literal RHS is ambiguous between the `query_` and `jsonb` ---! operator overloads and will not resolve. - -DO $$ -BEGIN - --! @brief Query-operand domain eql_v3.query_timestamp_eq (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_eq' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_eq AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'hm' - AND NOT (VALUE ? 'c') - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_eq IS 'EQL timestamp query operand (equality)'; - - --! @brief Query-operand domain eql_v3.query_timestamp_ord_ore (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord_ore' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_ord_ore AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'ob' - AND NOT (VALUE ? 'c') - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ore IS 'EQL timestamp query operand (equality, ordering)'; - - --! @brief Query-operand domain eql_v3.query_timestamp_ord (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_ord AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'ob' - AND NOT (VALUE ? 'c') - AND jsonb_typeof(VALUE -> 'ob') = 'array' - AND jsonb_array_length(VALUE -> 'ob') > 0 - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_ord IS 'EQL timestamp query operand (equality, ordering)'; - - --! @brief Query-operand domain eql_v3.query_timestamp_ord_ope (term-only; no `c`). - IF NOT EXISTS ( - SELECT 1 FROM pg_type - WHERE typname = 'query_timestamp_ord_ope' AND typnamespace = 'eql_v3'::regnamespace - ) THEN - CREATE DOMAIN eql_v3.query_timestamp_ord_ope AS jsonb - CHECK ( - jsonb_typeof(VALUE) = 'object' - AND VALUE ? 'v' - AND VALUE ? 'i' - AND VALUE ? 'op' - AND NOT (VALUE ? 'c') - AND VALUE->>'v' = '3' - ); - END IF; - - COMMENT ON DOMAIN eql_v3.query_timestamp_ord_ope IS 'EQL timestamp query operand (equality, ordering)'; -END -$$; --- AUTOMATICALLY GENERATED FILE. - --! @file encrypted_domain/timestamp/query_timestamp_eq_functions.sql --! @brief Functions for eql_v3.query_timestamp_eq. @@ -24450,203 +24494,6 @@ CREATE OPERATOR || ( LEFTARG = jsonb, RIGHTARG = public.timestamp_ord_ore ); ---! @file v3/sem/ore_cllw/types.sql ---! @brief CLLW ORE index term type for STE-vec range queries (eql_v3 SEM) ---! ---! Composite type for CLLW (Copyless Logarithmic Width) Order-Revealing ---! Encryption. The ciphertext is stored in the `oc` field of encrypted data ---! payloads (Standard-mode `ste_vec` elements). Used by the range operators ---! (`<`, `<=`, `>`, `>=`) when an sv element carries an `oc` term. ---! ---! The wire-format `oc` value is a hex string with a leading domain-tag byte ---! (`0x00` numeric, `0x01` string) followed by the CLLW ciphertext. The ---! decoded `bytes` field carries the full byte string including the tag — the ---! comparator is variable-length capable, so numeric and string values within ---! the same column order correctly: the domain tag separates the ranges ---! (numeric < string) and the within-domain comparison falls through to the ---! CLLW per-byte protocol. ---! ---! @note This is a transient type used only during query execution. ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE TYPE eql_v3_internal.ore_cllw AS ( - bytes bytea -); - ---! @file v3/sem/ore_cllw/functions.sql ---! @brief CLLW ORE index-term extraction and comparison (eql_v3 SEM). - ---! @brief Extract CLLW ORE index term from raw jsonb ---! ---! Returns the CLLW ORE ciphertext from the `oc` field of a single sv element ---! supplied as raw jsonb. Inlinable single-statement SQL — the planner folds ---! the body into the calling query. ---! ---! **Missing-`oc` semantics**: returns SQL-level NULL (not a composite with ---! NULL bytes) when `oc` is absent, so btree's NULL handling filters those ---! rows from range queries. ---! ---! @param val jsonb An object carrying an `oc` field ---! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL ---! when the `oc` field is absent. ---! @see eql_v3_internal.has_ore_cllw ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw(val jsonb) - RETURNS eql_v3_internal.ore_cllw - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT CASE WHEN val ->> 'oc' IS NULL THEN NULL - ELSE ROW(decode(val ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw - END -$$; - -COMMENT ON FUNCTION eql_v3_internal.ore_cllw(jsonb) IS - 'eql-inline-critical: raw-jsonb CLLW extractor; must stay inlinable (unpinned search_path)'; - ---! @brief Check if a raw jsonb value contains a CLLW ORE index term ---! @param val jsonb An object that may carry an `oc` field ---! @return boolean True if `oc` field is present and non-null -CREATE FUNCTION eql_v3_internal.has_ore_cllw(val jsonb) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT val ->> 'oc' IS NOT NULL -$$; - -COMMENT ON FUNCTION eql_v3_internal.has_ore_cllw(jsonb) IS - 'eql-inline-critical: raw-jsonb CLLW presence helper; must stay inlinable (unpinned search_path)'; - ---! @brief CLLW per-byte comparison helper ---! @internal ---! ---! Byte-by-byte comparison implementing the CLLW order-revealing protocol. ---! Identify the index of the first differing byte; if `(y_byte + 1) == x_byte` ---! (mod 256) there, then x > y; otherwise x < y. Equal inputs return 0. Inputs ---! MUST be the same length (the caller guarantees this). Stays `LANGUAGE ---! plpgsql` — the per-byte loop can't be a single inlinable SQL expression. ---! ---! @param a bytea First CLLW ciphertext slice ---! @param b bytea Second CLLW ciphertext slice ---! @return integer -1, 0, or 1 ---! @throws Exception if inputs are different lengths ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term_bytes(a bytea, b bytea) -RETURNS int - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - len_a INT; - len_b INT; - i INT; - first_diff INT := 0; -BEGIN - - len_a := LENGTH(a); - len_b := LENGTH(b); - - IF len_a != len_b THEN - RAISE EXCEPTION 'ore_cllw index terms are not the same length'; - END IF; - - FOR i IN 1..len_a LOOP - IF first_diff = 0 AND get_byte(a, i - 1) != get_byte(b, i - 1) THEN - first_diff := i; - END IF; - END LOOP; - - IF first_diff = 0 THEN - RETURN 0; - END IF; - - IF ((get_byte(b, first_diff - 1) + 1) & 255) = get_byte(a, first_diff - 1) THEN - RETURN 1; - ELSE - RETURN -1; - END IF; -END; -$$ LANGUAGE plpgsql; - ---! @brief Variable-length CLLW ORE term comparison ---! @internal ---! ---! Three-way comparison of two CLLW ORE ciphertext terms of potentially ---! different lengths. Compares the shared prefix via the CLLW per-byte ---! protocol; on equal prefixes, the shorter input sorts first. The leading ---! domain-tag byte makes numeric (`0x00`) sort before string (`0x01`). Stays ---! `LANGUAGE plpgsql` because it dispatches to `compare_ore_cllw_term_bytes`. ---! ---! btree filters NULL composites at the row level, so this should never see a ---! NULL composite under normal operation; the IS-NULL guard returns NULL ---! defensively. A non-NULL composite with NULL `bytes` is a contract violation ---! — the extractor returns SQL NULL (not ROW(NULL)) on missing `oc`, so raise ---! loudly rather than silently misorder. ---! ---! @param a eql_v3_internal.ore_cllw First term ---! @param b eql_v3_internal.ore_cllw Second term ---! @return integer -1, 0, or 1; NULL if either composite is NULL ---! @throws Exception if either composite has a NULL `bytes` field ---! @see eql_v3_internal.compare_ore_cllw_term_bytes -CREATE FUNCTION eql_v3_internal.compare_ore_cllw_term(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) -RETURNS int - SET search_path = pg_catalog, extensions, public -AS $$ -DECLARE - len_a INT; - len_b INT; - common_len INT; - cmp_result INT; -BEGIN - -- The `::text` cast is load-bearing, not a stylistic choice. For the - -- single-field `ore_cllw` composite, `ROW(NULL)::ore_cllw IS NULL` is TRUE - -- but `(ROW(NULL)::ore_cllw)::text IS NULL` is FALSE. Casting to text first - -- means a NULL-component composite falls THROUGH to the RAISE below (the - -- extractor-invariant violation) instead of silently returning NULL and - -- masking it. A plain `a IS NULL` would reintroduce that masking bug. - IF a::text IS NULL OR b::text IS NULL THEN - RETURN NULL; - END IF; - - IF a.bytes IS NULL OR b.bytes IS NULL THEN - RAISE EXCEPTION 'eql_v3_internal.compare_ore_cllw_term: composite has NULL bytes field — extractor invariant violated. Check that the index expression uses eql_v3_internal.ore_cllw(...) and not a hand-crafted ROW(NULL).'; - END IF; - - len_a := LENGTH(a.bytes); - len_b := LENGTH(b.bytes); - - IF len_a = 0 AND len_b = 0 THEN - RETURN 0; - ELSIF len_a = 0 THEN - RETURN -1; - ELSIF len_b = 0 THEN - RETURN 1; - END IF; - - IF len_a < len_b THEN - common_len := len_a; - ELSE - common_len := len_b; - END IF; - - cmp_result := eql_v3_internal.compare_ore_cllw_term_bytes( - SUBSTRING(a.bytes FROM 1 FOR common_len), - SUBSTRING(b.bytes FROM 1 FOR common_len) - ); - - IF cmp_result = -1 THEN - RETURN -1; - ELSIF cmp_result = 1 THEN - RETURN 1; - END IF; - - IF len_a < len_b THEN - RETURN -1; - ELSIF len_a > len_b THEN - RETURN 1; - ELSE - RETURN 0; - END IF; -END; -$$ LANGUAGE plpgsql; - --! @file v3/jsonb/types.sql --! @brief Domain types for the eql_v3 encrypted-JSONB (SteVec) surface. --! @@ -24661,7 +24508,7 @@ $$ LANGUAGE plpgsql; --! @internal --! @param val jsonb Candidate entry payload. --! @return boolean True when `val` is an sv entry with string `s`, string `c`, ---! and exactly one string deterministic term (`hm` XOR `oc`). +--! and exactly one string deterministic term (`hm` XOR `op`). CREATE OR REPLACE FUNCTION public.eql_v3_is_valid_ste_vec_entry_payload(val jsonb) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE @@ -24671,9 +24518,9 @@ AS $$ AND jsonb_typeof(val -> 's') = 'string' AND jsonb_typeof(val -> 'c') = 'string' AND ( - (jsonb_typeof(val -> 'hm') = 'string' AND NOT (val ? 'oc')) + (jsonb_typeof(val -> 'hm') = 'string' AND NOT (val ? 'op')) OR - (jsonb_typeof(val -> 'oc') = 'string' AND NOT (val ? 'hm')) + (jsonb_typeof(val -> 'op') = 'string' AND NOT (val ? 'hm')) ), false ) @@ -24684,7 +24531,7 @@ $$; --! @param val jsonb Candidate query payload. --! @return boolean True when `val` is `{"sv":[...]}` and every element carries --! string `s`, no ciphertext, and exactly one string term (`hm` XOR ---! `oc`). +--! `op`). --! @note plpgsql, not LANGUAGE sql (issues #353/#354): the only caller is the --! eql_v3.query_jsonb domain CHECK, where a SQL function can never be --! inlined (and the CHECK itself cannot absorb this body — it needs a @@ -24709,9 +24556,9 @@ BEGIN AND jsonb_typeof(elem -> 's') = 'string' AND NOT (elem ? 'c') AND ( - (jsonb_typeof(elem -> 'hm') = 'string' AND NOT (elem ? 'oc')) + (jsonb_typeof(elem -> 'hm') = 'string' AND NOT (elem ? 'op')) OR - (jsonb_typeof(elem -> 'oc') = 'string' AND NOT (elem ? 'hm')) + (jsonb_typeof(elem -> 'op') = 'string' AND NOT (elem ? 'hm')) ) ), false) ), @@ -24779,9 +24626,9 @@ $$; --! --! A single element inside an `sv` array: a JSON object that carries a selector --! (`s`), a ciphertext (`c`), and **exactly one** of `hm` (HMAC-256, for ---! hash-equality) or `oc` (CLLW ORE, for ordered queries) — they are mutually +--! hash-equality) or `op` (CLLW OPE, for ordered queries) — they are mutually --! exclusive. This is the type returned by `->` and accepted by the per-entry ---! extractors `eql_v3.eq_term` / `eql_v3.ore_cllw`. Extra fields (`a`, root +--! extractors `eql_v3.eq_term` / `eql_v3.ord_ope_term`. Extra fields (`a`, root --! `i`/`v` merged in by `->`) are allowed. --! --! @see src/v3/jsonb/operators.sql @@ -24813,9 +24660,9 @@ BEGIN AND jsonb_typeof(VALUE -> 's') = 'string' AND jsonb_typeof(VALUE -> 'c') = 'string' AND ( - (jsonb_typeof(VALUE -> 'hm') = 'string' AND NOT (VALUE ? 'oc')) + (jsonb_typeof(VALUE -> 'hm') = 'string' AND NOT (VALUE ? 'op')) OR - (jsonb_typeof(VALUE -> 'oc') = 'string' AND NOT (VALUE ? 'hm')) + (jsonb_typeof(VALUE -> 'op') = 'string' AND NOT (VALUE ? 'hm')) ), false ) @@ -24830,7 +24677,7 @@ $$; --! --! A query-shaped payload `{"sv":[...]}` whose elements carry selector + index --! term but **never** a ciphertext (`c`). Each element must carry `s` and ---! exactly one deterministic term (`hm` XOR `oc`). Typing the needle this way +--! exactly one deterministic term (`hm` XOR `op`). Typing the needle this way --! stops selector-only needles from casting and matching every row via bare --! `jsonb @>`. --! @@ -24867,7 +24714,7 @@ $$; --! @brief Convert a public.json to a query_jsonb needle. --! --! Normalises each sv element down to the matching-relevant fields: `s` plus ---! exactly one of `hm` / `oc`. Other fields (`c`, `a`, `i`/`v`, anything else) +--! exactly one of `hm` / `op`. Other fields (`c`, `a`, `i`/`v`, anything else) --! are stripped. This is the canonical needle shape for `@>` containment. --! Designed for use as a functional GIN index expression: --! `GIN (eql_v3.to_ste_vec_query(col)::jsonb jsonb_path_ops)`. @@ -24887,7 +24734,7 @@ AS $$ jsonb_build_object( 's', elem -> 's', 'hm', elem -> 'hm', - 'oc', elem -> 'oc' + 'op', elem -> 'op' ) ) ) @@ -24977,55 +24824,50 @@ AS $$ $$; ------------------------------------------------------------------------------ --- Equality-term extractor (XOR-aware: coalesce(hm, oc)) +-- Equality-term extractor (XOR-aware: coalesce(hm, op)) ------------------------------------------------------------------------------ --! @brief XOR-aware equality term extractor for public.jsonb_entry. --! --! Returns the bytea of whichever deterministic term the sv entry carries — ---! `hm` (HMAC-256) or `oc` (CLLW ORE). The two byte distributions are disjoint +--! `hm` (HMAC-256) or `op` (CLLW OPE). The two byte distributions are disjoint --! by construction, so byte equality on the coalesce is unambiguous. Canonical --! equality extractor used by `=` / `<>` on jsonb_entry. --! --! @param entry public.jsonb_entry ---! @return bytea Decoded `hm` or `oc` bytes (NULL if entry is NULL). +--! @return bytea Decoded `hm` or `op` bytes (NULL if entry is NULL). CREATE FUNCTION eql_v3.eq_term(entry public.jsonb_entry) RETURNS bytea LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT decode(coalesce(entry ->> 'hm', entry ->> 'oc'), 'hex') + SELECT decode(coalesce(entry ->> 'hm', entry ->> 'op'), 'hex') $$; ------------------------------------------------------------------------------ --- ORE CLLW per-entry overloads (live here so sem/ore_cllw stays a leaf) +-- CLLW OPE per-entry overload (converged with the scalar ord_ope_term) ------------------------------------------------------------------------------ ---! @brief Extract CLLW ORE index term from a ste_vec entry. +--! @brief Extract the CLLW OPE index term from a ste_vec entry. --! ---! `oc` is only ever present on an sv element, never at a root encrypted value, ---! so the typed overload accepts public.jsonb_entry. Returns SQL NULL when ---! `oc` is absent (btree NULL-filters such rows from range queries). +--! An sv-element `op` term is only ever present on an sv element, never at a +--! root encrypted value, so the typed overload accepts public.jsonb_entry — +--! the jsonb_entry twin of the generated scalar `eql_v3.ord_ope_term` +--! extractors. Returns SQL NULL when `op` is absent (the strict `->>` / +--! `decode` chain propagates it), so btree NULL-filters such rows from range +--! queries. The returned eql_v3_internal.ope_cllw is a bytea domain: it orders +--! under native byte comparison with the DEFAULT btree opclass, so a +--! functional index on `eql_v3.ord_ope_term(col -> 'selector')` engages +--! structurally with no custom operator class (Supabase/managed-Postgres +--! safe). --! --! @param entry public.jsonb_entry ---! @return eql_v3_internal.ore_cllw Composite carrying the CLLW ciphertext, or NULL. ---! @see eql_v3.has_ore_cllw -CREATE FUNCTION eql_v3.ore_cllw(entry public.jsonb_entry) - RETURNS eql_v3_internal.ore_cllw - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT CASE WHEN entry ->> 'oc' IS NULL THEN NULL - ELSE ROW(decode(entry ->> 'oc', 'hex'))::eql_v3_internal.ore_cllw - END -$$; - ---! @brief Check if a ste_vec entry contains a CLLW ORE index term. ---! @param entry public.jsonb_entry ---! @return boolean True if `oc` is present and non-null. -CREATE FUNCTION eql_v3.has_ore_cllw(entry public.jsonb_entry) - RETURNS boolean +--! @return eql_v3_internal.ope_cllw Hex-decoded CLLW OPE term, or NULL when +--! `op` is absent. +CREATE FUNCTION eql_v3.ord_ope_term(entry public.jsonb_entry) + RETURNS eql_v3_internal.ope_cllw LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT entry ->> 'oc' IS NOT NULL + SELECT eql_v3_internal.ope_cllw(entry::jsonb) $$; ------------------------------------------------------------------------------ @@ -25082,7 +24924,7 @@ $$ LANGUAGE plpgsql; -- Deterministic-fields array for GIN containment ------------------------------------------------------------------------------ ---! @brief Extract deterministic search fields (s, hm, oc, op) per sv element. +--! @brief Extract deterministic search fields (s, hm, op) per sv element. --! --! Excludes non-deterministic ciphertext so PostgreSQL's native jsonb `@>` can --! compare for containment. Use for GIN indexes and containment queries. @@ -25100,7 +24942,7 @@ AS $$ CASE WHEN val ? 'sv' THEN val->'sv' ELSE jsonb_build_array(val) END ) AS elem, LATERAL jsonb_each(elem) AS kv(key, value) - WHERE kv.key IN ('s', 'hm', 'oc', 'op') + WHERE kv.key IN ('s', 'hm', 'op') GROUP BY elem ); $$; @@ -25156,18 +24998,19 @@ COMMENT ON FUNCTION eql_v3.jsonb_contained_by(jsonb, jsonb) IS --! @brief Check if an sv array contains a specific sv element. --! --! Match = selector equal AND eq_term equal (byte-equality over coalesce(hm, ---! oc)). This collapses the v2 hm/oc CASE: under the XOR contract both terms +--! op)). This collapses the v2 hm/oc CASE: under the XOR contract both terms --! are deterministic and byte-disjoint, so either one is a valid equality --! discriminator and a single byte comparison is correct. --! ---! ASSUMPTION (locked by a negative test in v3_jsonb_tests.rs): hm and oc byte +--! ASSUMPTION (locked by a negative test in v3_jsonb_tests.rs): hm and op byte --! distributions never collide at a given selector. The crypto layer configures --! a selector for eq XOR ordered, so both sides of a real comparison carry the ---! same term type; and an oc value carries a leading domain-tag byte an hm never ---! has. Unlike v2's explicit `has_hmac(both)`/`has_ore_cllw(both)`/`ELSE false` ---! CASE, this collapse would wrongly match an hm needle against an oc leaf if ---! their hex bytes were ever identical — which the contract prevents. The ---! negative-containment test guards against regression. +--! same term type — an hm needle never meets an op leaf at the same selector. +--! This collapse would wrongly match an hm needle against an op leaf if their +--! hex bytes were ever identical — which the contract prevents (an hm is a +--! fixed 32-byte HMAC; an op is a CLLW OPE ciphertext whose length is a +--! function of the plaintext bit width, never 32 bytes for the supported +--! domains). The negative-containment test guards against regression. --! --! @param a jsonb[] sv array to search within. --! @param b jsonb sv element to search for. @@ -25388,7 +25231,7 @@ DROP FUNCTION IF EXISTS eql_v3.version(); --! @brief EQL version reporting (self-contained eql_v3 surface) --! --! This file is auto-generated from src/v3/version.template during build. ---! The 3.0.0-alpha.3 placeholder is replaced with the actual release +--! The 3.0.0-alpha.4 placeholder is replaced with the actual release --! version (bare semver, e.g. "3.0.0") supplied via `mise run build --version`, --! or "DEV" for development builds. @@ -25407,14 +25250,14 @@ CREATE FUNCTION eql_v3.version() RETURNS text IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT '3.0.0-alpha.3'; + SELECT '3.0.0-alpha.4'; $$ LANGUAGE SQL; --! @brief Schema-level version marker for obj_description() discoverability --! --! Mirrors eql_v3.version() as a comment on the schema so the installed --! version can also be read via obj_description('eql_v3'::regnamespace). -COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.3'; +COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.4'; --! @brief EQL lint: detect non-inlinable operator implementation functions --! @@ -25435,7 +25278,7 @@ COMMENT ON SCHEMA eql_v3 IS '3.0.0-alpha.3'; --! (or `pg_get_functiondef`); tracked as a follow-up. --! --! Operators on `eql_v3` types (the jsonb-backed encrypted-domain families and ---! the SEM index-term types `eql_v3_internal.ore_block_256`, `eql_v3_internal.ore_cllw`) whose +--! the SEM index-term type `eql_v3_internal.ore_block_256`) whose --! implementation functions fail any of these rules silently fall back to seq --! scan when the documented functional indexes (`eql_v3.eq_term(col)`, --! `eql_v3.ord_term(col)`) are in place. This lint surfaces every such case. @@ -37718,6 +37561,192 @@ CREATE OPERATOR >= ( ); -- AUTOMATICALLY GENERATED FILE. +--! @file v3/scalars/ore_fallback.sql +--! @brief Disable the ORE-backed encrypted domains when the ORE operator class is absent (CIP-3468). +--! +--! Runs after the DO block in src/v3/sem/ore_block_256/operator_class.sql, +--! which ATTEMPTS to create the default btree operator class for +--! eql_v3_internal.ore_block_256 and skips it on insufficient_privilege +--! (CREATE OPERATOR CLASS requires superuser; managed platforms — cloud +--! Supabase and most hosted Postgres — run the installer as a non-superuser +--! role). When the class was created, this file is a no-op. +--! +--! When the class was skipped, the ORE-carrying domains would otherwise +--! install half-working: `<`/`>` comparisons still run (as unindexable seq +--! scans), while `CREATE INDEX ... (eql_v3.ord_term(col))` and bare +--! `ORDER BY` fail with opaque Postgres errors. Instead of that silent +--! degradation, this file poisons every ORE-carrying domain (and its +--! query-operand twin) with an always-raising CHECK constraint, so the first +--! value coerced into the domain fails loudly and points at the +--! platform-supported alternatives (OPE ordering / HMAC equality / +--! bloom-filter match). +--! +--! Footguns honoured (see the encrypted-domain footgun list in CLAUDE.md): +--! the poison function is LANGUAGE plpgsql (never inlined, so the RAISE +--! cannot be planned away) and NOT STRICT (a STRICT function is skipped for +--! NULL inputs, which would silently let NULLs through the poisoned domain). +--! +--! The poison constraints are added NOT VALID. For domains — unlike table +--! constraints — this does not weaken enforcement: coercion applies every +--! constraint regardless of validation status, so new casts and inserts +--! (including NULL) still raise. What it skips is validating existing stored +--! data: without it, re-running the installer over a database that already +--! holds ORE values (written under an earlier superuser install, before the +--! installing role was demoted) would run the always-raising poison against +--! every stored row and abort the install. + +DO $do$ +BEGIN + IF EXISTS ( + SELECT 1 + FROM pg_catalog.pg_opclass c + JOIN pg_catalog.pg_am am ON am.oid = c.opcmethod + WHERE am.amname = 'btree' + AND c.opcdefault + AND c.opcintype = 'eql_v3_internal.ore_block_256'::pg_catalog.regtype + ) THEN + RETURN; + END IF; + + --! @brief Poison CHECK backing for the ORE-carrying domains on platforms + --! without the ORE operator class. Always raises; never returns. + --! @internal + CREATE FUNCTION eql_v3_internal.ore_domain_unavailable(val jsonb, domain_name text, alternatives text) + RETURNS boolean + IMMUTABLE PARALLEL SAFE + SET search_path = pg_catalog, extensions, public + LANGUAGE plpgsql + AS $poison$ + BEGIN + RAISE EXCEPTION 'EQL: % cannot be used on this platform: the EQL installer could not create the ORE operator class (requires superuser, unavailable on e.g. cloud-hosted Supabase)', domain_name + USING HINT = 'Use ' || alternatives || ' instead.', + ERRCODE = 'feature_not_supported'; + END; + $poison$; + -- NOT VALID: skip validating existing stored data (rows written under an + -- earlier superuser install must stay readable, and re-installing over them + -- must not abort). Domain coercion still enforces the CHECK on every new + -- cast/insert regardless of validation status. + + ALTER DOMAIN public.integer_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord_ore', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_integer_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord_ore', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.integer_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.integer_ord', 'public.integer_eq (equality) or public.integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_integer_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_integer_ord', 'eql_v3.query_integer_eq (equality) or eql_v3.query_integer_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord_ore', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_smallint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord_ore', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.smallint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.smallint_ord', 'public.smallint_eq (equality) or public.smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_smallint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_smallint_ord', 'eql_v3.query_smallint_eq (equality) or eql_v3.query_smallint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord_ore', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_bigint_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord_ore', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.bigint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.bigint_ord', 'public.bigint_eq (equality) or public.bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_bigint_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_bigint_ord', 'eql_v3.query_bigint_eq (equality) or eql_v3.query_bigint_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.date_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord_ore', 'public.date_eq (equality) or public.date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_date_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord_ore', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.date_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.date_ord', 'public.date_eq (equality) or public.date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_date_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_date_ord', 'eql_v3.query_date_eq (equality) or eql_v3.query_date_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord_ore', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_timestamp_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord_ore', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.timestamp_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.timestamp_ord', 'public.timestamp_eq (equality) or public.timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_timestamp_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_timestamp_ord', 'eql_v3.query_timestamp_eq (equality) or eql_v3.query_timestamp_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord_ore', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_numeric_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord_ore', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.numeric_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.numeric_ord', 'public.numeric_eq (equality) or public.numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_numeric_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_numeric_ord', 'eql_v3.query_numeric_eq (equality) or eql_v3.query_numeric_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.text_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord_ore', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_text_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord_ore', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.text_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_ord', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_text_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_ord', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.text_search ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.text_search', 'public.text_eq (equality) or public.text_match (match) or public.text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_text_search ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_text_search', 'eql_v3.query_text_eq (equality) or eql_v3.query_text_match (match) or eql_v3.query_text_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.real_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord_ore', 'public.real_eq (equality) or public.real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_real_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord_ore', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.real_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.real_ord', 'public.real_eq (equality) or public.real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_real_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_real_ord', 'eql_v3.query_real_eq (equality) or eql_v3.query_real_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.double_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord_ore', 'public.double_eq (equality) or public.double_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_double_ord_ore ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord_ore', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN public.double_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'public.double_ord', 'public.double_eq (equality) or public.double_ord_ope (ordering)')) NOT VALID; + + ALTER DOMAIN eql_v3.query_double_ord ADD CONSTRAINT eql_ore_unavailable + CHECK (eql_v3_internal.ore_domain_unavailable(VALUE, 'eql_v3.query_double_ord', 'eql_v3.query_double_eq (equality) or eql_v3.query_double_ord_ope (ordering)')) NOT VALID; + + RAISE NOTICE 'EQL: ORE operator class absent (creation requires superuser) — 38 ORE-backed domains disabled and will raise on use; use the _ord_ope (ordering) and _eq (equality) domains — and text_match for text pattern match — instead'; +END; +$do$; +-- AUTOMATICALLY GENERATED FILE. + --! @file encrypted_domain/text/query_text_match_functions.sql --! @brief Functions for eql_v3.query_text_match. @@ -41991,291 +42020,42 @@ CREATE OPERATOR >= ( COMMUTATOR = <=, NEGATOR = <, RESTRICT = scalargesel, JOIN = scalargejoinsel ); ---! @file v3/sem/ore_block_256/operator_class.sql ---! @brief B-tree operator family + default class on eql_v3_internal.ore_block_256. ---! ---! Gives the composite type its DEFAULT btree opclass so the recommended ---! functional index `CREATE INDEX ON t (eql_v3_internal.ord_term(col))` engages without ---! an explicit opclass annotation (design D4). ---! ---! @note Creating an operator family/class requires superuser: Postgres forbids ---! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index ---! integrity. Managed platforms (Supabase, and most hosted Postgres) run ---! the installer as a non-superuser role, so the DO block below ATTEMPTS ---! the creation and skips it on insufficient_privilege (SQLSTATE 42501), ---! letting the single installer run everywhere. When the class is absent, ---! ORE ordered scans over eql_v3_internal.ore_block_256 are unavailable, ---! but the order-preserving (OPE) ordering domains — whose extractor ---! return types carry a native btree opclass — still index without it. On ---! superuser installs (self-managed Postgres, the SQLx test matrix) the ---! class is created normally. Any non-privilege error still propagates. ---! @see eql_v3_internal.compare_ore_block_256_terms - -DO $do$ -BEGIN - EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_block_256_operator_family USING btree'; - - EXECUTE $ddl$ - CREATE OPERATOR CLASS eql_v3_internal.ore_block_256_operator_class - DEFAULT FOR TYPE eql_v3_internal.ore_block_256 - USING btree FAMILY eql_v3_internal.ore_block_256_operator_family AS - OPERATOR 1 public.<, - OPERATOR 2 public.<=, - OPERATOR 3 public.=, - OPERATOR 4 public.>=, - OPERATOR 5 public.>, - FUNCTION 1 eql_v3_internal.compare_ore_block_256_terms(a eql_v3_internal.ore_block_256, b eql_v3_internal.ore_block_256) - $ddl$; - - RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_block_256_operator_class'; -EXCEPTION - WHEN insufficient_privilege THEN - RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_block_256_operator_class (requires superuser); ORE ordered indexes on ore_block_256 unavailable, OPE ordering domains unaffected'; -END; -$do$; - ---! @file v3/sem/ore_cllw/operators.sql ---! @brief Comparison operators on the eql_v3_internal.ore_cllw composite type. ---! ---! Each backing function reduces to a single SELECT over ---! eql_v3_internal.compare_ore_cllw_term(a, b) and is inlinable so the planner can fold ---! it through to functional-index matching. The inner comparator is plpgsql ---! (per-byte loop) and is not inlined — fine for index *match*. ---! ---! @note Deliberately no HASHES / MERGES — the CLLW protocol gives ordering, ---! not a hash; there is no merge-joinable opclass on the other side. ---! @see eql_v3_internal.compare_ore_cllw_term - ---! @brief Equality backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the CLLW ORE terms are equal ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_eq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 0 -$$; - ---! @brief Not-equal backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the CLLW ORE terms are not equal ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_neq(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 0 -$$; - ---! @brief Less-than backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is less than the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_lt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = -1 -$$; - ---! @brief Less-than-or-equal backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is less than or equal to the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_lte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> 1 -$$; - ---! @brief Greater-than backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is greater than the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_gt(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) = 1 -$$; - ---! @brief Greater-than-or-equal backing function for eql_v3_internal.ore_cllw. ---! @internal ---! ---! @param a eql_v3_internal.ore_cllw Left operand ---! @param b eql_v3_internal.ore_cllw Right operand ---! @return boolean True if the left operand is greater than or equal to the right operand ---! ---! @see eql_v3_internal.compare_ore_cllw_term -CREATE FUNCTION eql_v3_internal.ore_cllw_gte(a eql_v3_internal.ore_cllw, b eql_v3_internal.ore_cllw) - RETURNS boolean - LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE -AS $$ - SELECT eql_v3_internal.compare_ore_cllw_term(a, b) <> -1 -$$; - - -CREATE OPERATOR public.= ( - FUNCTION = eql_v3_internal.ore_cllw_eq, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.=), - NEGATOR = OPERATOR(public.<>), - RESTRICT = eqsel, - JOIN = eqjoinsel -); - -CREATE OPERATOR public.<> ( - FUNCTION = eql_v3_internal.ore_cllw_neq, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.<>), - NEGATOR = OPERATOR(public.=), - RESTRICT = neqsel, - JOIN = neqjoinsel -); - -CREATE OPERATOR public.< ( - FUNCTION = eql_v3_internal.ore_cllw_lt, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.>), - NEGATOR = OPERATOR(public.>=), - RESTRICT = scalarltsel, - JOIN = scalarltjoinsel -); - -CREATE OPERATOR public.<= ( - FUNCTION = eql_v3_internal.ore_cllw_lte, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.>=), - NEGATOR = OPERATOR(public.>), - RESTRICT = scalarlesel, - JOIN = scalarlejoinsel -); - -CREATE OPERATOR public.> ( - FUNCTION = eql_v3_internal.ore_cllw_gt, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.<), - NEGATOR = OPERATOR(public.<=), - RESTRICT = scalargtsel, - JOIN = scalargtjoinsel -); - -CREATE OPERATOR public.>= ( - FUNCTION = eql_v3_internal.ore_cllw_gte, - LEFTARG = eql_v3_internal.ore_cllw, - RIGHTARG = eql_v3_internal.ore_cllw, - COMMUTATOR = OPERATOR(public.<=), - NEGATOR = OPERATOR(public.<), - RESTRICT = scalargesel, - JOIN = scalargejoinsel -); - ---! @file v3/sem/ore_cllw/operator_class.sql ---! @brief Btree operator class on the eql_v3_internal.ore_cllw composite type. ---! ---! DEFAULT FOR TYPE so a functional btree index on eql_v3_internal.ore_cllw(expr) ---! engages without an explicit opclass annotation. FUNCTION 1 is the three-way ---! comparator btree's internal sort uses; it is plpgsql by design (per-byte ---! CLLW protocol needs iteration) and is called once per index-entry pair ---! during build / search, not per-row in the outer query. ---! ---! @note Creating an operator family/class requires superuser: Postgres forbids ---! CREATE OPERATOR FAMILY / CLASS to non-superusers to protect index ---! integrity. Managed platforms (Supabase, and most hosted Postgres) run ---! the installer as a non-superuser role, so the DO block below ATTEMPTS ---! the creation and skips it on insufficient_privilege (SQLSTATE 42501), ---! letting the single installer run everywhere. When the class is absent, ---! ORE ordered scans over eql_v3_internal.ore_cllw are unavailable, but ---! the order-preserving (OPE) ordering domains — whose extractor return ---! types carry a native btree opclass — still index without it. On ---! superuser installs (self-managed Postgres, the SQLx test matrix) the ---! class is created normally. Any non-privilege error still propagates. ---! @see eql_v3_internal.compare_ore_cllw_term - -DO $do$ -BEGIN - EXECUTE 'CREATE OPERATOR FAMILY eql_v3_internal.ore_cllw_ops USING btree'; - - EXECUTE $ddl$ - CREATE OPERATOR CLASS eql_v3_internal.ore_cllw_ops - DEFAULT FOR TYPE eql_v3_internal.ore_cllw - USING btree FAMILY eql_v3_internal.ore_cllw_ops AS - OPERATOR 1 public.< (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 2 public.<= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 3 public.= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 4 public.>= (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - OPERATOR 5 public.> (eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw), - FUNCTION 1 eql_v3_internal.compare_ore_cllw_term(eql_v3_internal.ore_cllw, eql_v3_internal.ore_cllw) - $ddl$; - - RAISE NOTICE 'EQL: created btree operator class eql_v3_internal.ore_cllw_ops'; -EXCEPTION - WHEN insufficient_privilege THEN - RAISE NOTICE 'EQL: skipped operator class eql_v3_internal.ore_cllw_ops (requires superuser); ORE ordered indexes on ore_cllw unavailable, OPE ordering domains unaffected'; -END; -$do$; - --! @file v3/jsonb/aggregates.sql --! @brief min / max aggregates over public.jsonb_entry. --! --! SteVec document entries extracted at a selector (`doc -> 'sel'`) order by ---! their CLLW ORE (`oc`) term, so the extremum is picked by comparing ---! `eql_v3.ore_cllw(entry)` rather than the scalar Block-ORE `ord_term` the ---! generated scalar ord aggregates use. Same STRICT + PARALLEL SAFE shape as the ---! generated scalar `min`/`max` so partial/parallel aggregation is available on ---! large GROUP BY workloads. +--! their CLLW OPE (`op`) term, so the extremum is picked by comparing +--! `eql_v3.ord_ope_term(entry)` rather than the scalar Block-ORE `ord_term` the +--! generated scalar ord aggregates use. The ope_cllw bytea domain orders under +--! native byte comparison, so `<` / `>` on the extracted terms needs no custom +--! comparator. Same STRICT + PARALLEL SAFE shape as the generated scalar +--! `min`/`max` so partial/parallel aggregation is available on large GROUP BY +--! workloads. --! --! Per the encrypted-domain footgun rules the state functions are --! `LANGUAGE plpgsql` with the pinned `search_path` — a `LANGUAGE sql` body would --! be inlinable and the planner could elide it. --! ---! @note **Only `oc`-carrying entries are orderable.** `eql_v3.ore_cllw(entry)` ---! returns NULL when an entry has no `oc` (CLLW ORE) term — the same entries a ---! `eql_v3.ore_cllw` btree NULL-filters from range scans. The state functions ---! therefore IGNORE `oc`-less entries (they never become or survive as the ---! extremum), so `min`/`max` is well-defined over a mix of `oc`-carrying and ---! `oc`-less entries and is not corrupted by an `oc`-less seed. A naive ---! `ore_cllw(value) < ore_cllw(state)` would be NULL whenever either side ---! lacks `oc`, pinning a wrong (`oc`-less) extremum when the first aggregated ---! row is `oc`-less. An all-`oc`-less input has no orderable extremum and +--! @note **Only `op`-carrying entries are orderable.** `eql_v3.ord_ope_term(entry)` +--! returns NULL when an entry has no `op` (CLLW OPE) term — the same entries a +--! `eql_v3.ord_ope_term` btree NULL-filters from range scans. The state functions +--! therefore IGNORE `op`-less entries (they never become or survive as the +--! extremum), so `min`/`max` is well-defined over a mix of `op`-carrying and +--! `op`-less entries and is not corrupted by an `op`-less seed. A naive +--! `ord_ope_term(value) < ord_ope_term(state)` would be NULL whenever either side +--! lacks `op`, pinning a wrong (`op`-less) extremum when the first aggregated +--! row is `op`-less. An all-`op`-less input has no orderable extremum and --! returns the (arbitrary) STRICT seed. --! @brief State function for min on public.jsonb_entry. --! ---! Keeps whichever orderable entry has the lesser CLLW ORE term. STRICT, so SQL ---! NULL entries are skipped by the aggregate machinery; `oc`-less (non-orderable) +--! Keeps whichever orderable entry has the lesser CLLW OPE term. STRICT, so SQL +--! NULL entries are skipped by the aggregate machinery; `op`-less (non-orderable) --! entries are skipped explicitly (see the @note on this file). --! --! @param state public.jsonb_entry Running extremum. --! @param value public.jsonb_entry Candidate entry. ---! @return public.jsonb_entry The lesser orderable entry by `ore_cllw`. +--! @return public.jsonb_entry The lesser orderable entry by `ord_ope_term`. CREATE FUNCTION eql_v3_internal.jsonb_entry_min_sfunc( state public.jsonb_entry, value public.jsonb_entry @@ -42285,16 +42065,16 @@ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ DECLARE - value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value); - state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state); + value_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(value); + state_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(state); BEGIN - -- A non-orderable (oc-less) candidate never replaces the running extremum. - IF value_ore IS NULL THEN + -- A non-orderable (op-less) candidate never replaces the running extremum. + IF value_ope IS NULL THEN RETURN state; END IF; -- Adopt the candidate when the running extremum is itself non-orderable - -- (e.g. an oc-less STRICT seed) or strictly greater. - IF state_ore IS NULL OR value_ore < state_ore THEN + -- (e.g. an op-less STRICT seed) or strictly greater. + IF state_ope IS NULL OR value_ope < state_ope THEN RETURN value; END IF; RETURN state; @@ -42303,7 +42083,7 @@ $$; --! @brief min aggregate over public.jsonb_entry. --! @param input public.jsonb_entry ---! @return public.jsonb_entry The entry with the smallest CLLW ORE term. +--! @return public.jsonb_entry The entry with the smallest CLLW OPE term. CREATE AGGREGATE eql_v3.min(public.jsonb_entry) ( sfunc = eql_v3_internal.jsonb_entry_min_sfunc, stype = public.jsonb_entry, @@ -42313,12 +42093,12 @@ CREATE AGGREGATE eql_v3.min(public.jsonb_entry) ( --! @brief State function for max on public.jsonb_entry. --! ---! Keeps whichever orderable entry has the greater CLLW ORE term. `oc`-less +--! Keeps whichever orderable entry has the greater CLLW OPE term. `op`-less --! entries are skipped, mirroring `jsonb_entry_min_sfunc` (see the file @note). --! --! @param state public.jsonb_entry Running extremum. --! @param value public.jsonb_entry Candidate entry. ---! @return public.jsonb_entry The greater orderable entry by `ore_cllw`. +--! @return public.jsonb_entry The greater orderable entry by `ord_ope_term`. CREATE FUNCTION eql_v3_internal.jsonb_entry_max_sfunc( state public.jsonb_entry, value public.jsonb_entry @@ -42328,16 +42108,16 @@ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE SET search_path = pg_catalog, extensions, public AS $$ DECLARE - value_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(value); - state_ore eql_v3_internal.ore_cllw := eql_v3.ore_cllw(state); + value_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(value); + state_ope eql_v3_internal.ope_cllw := eql_v3.ord_ope_term(state); BEGIN - -- A non-orderable (oc-less) candidate never replaces the running extremum. - IF value_ore IS NULL THEN + -- A non-orderable (op-less) candidate never replaces the running extremum. + IF value_ope IS NULL THEN RETURN state; END IF; -- Adopt the candidate when the running extremum is itself non-orderable - -- (e.g. an oc-less STRICT seed) or strictly lesser. - IF state_ore IS NULL OR value_ore > state_ore THEN + -- (e.g. an op-less STRICT seed) or strictly lesser. + IF state_ope IS NULL OR value_ope > state_ope THEN RETURN value; END IF; RETURN state; @@ -42346,7 +42126,7 @@ $$; --! @brief max aggregate over public.jsonb_entry. --! @param input public.jsonb_entry ---! @return public.jsonb_entry The entry with the largest CLLW ORE term. +--! @return public.jsonb_entry The entry with the largest CLLW OPE term. CREATE AGGREGATE eql_v3.max(public.jsonb_entry) ( sfunc = eql_v3_internal.jsonb_entry_max_sfunc, stype = public.jsonb_entry, @@ -42369,8 +42149,8 @@ CREATE AGGREGATE eql_v3.max(public.jsonb_entry) ( --! index on `eql_v3.eq_term(col -> 'sel')`. --! --! @warning The selector operand MUST carry a known type — a text-typed ---! parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::text`). ---! A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> text` +--! parameter (`$1`, the Proxy interface) or an explicit cast (`col -> 'sel'::%text`). +--! A bare untyped literal (`col -> 'sel'`) resolves to the NATIVE `jsonb -> %text` --! operator and silently returns native jsonb semantics (a root-key lookup, --! typically NULL), NOT this operator: PostgreSQL reduces the `public.json` --! domain to its base type `jsonb` when resolving an unknown-typed RHS, and the @@ -42536,7 +42316,7 @@ AS $$ jsonb_build_object( 's', b -> 's', 'hm', b -> 'hm', - 'oc', b -> 'oc' + 'op', b -> 'op' ) ) ) @@ -42650,7 +42430,7 @@ CREATE OPERATOR <> ( JOIN = neqjoinsel ); ---! @brief Less-than on jsonb_entry via ore_cllw. +--! @brief Less-than on jsonb_entry via the CLLW OPE term (native bytea order). --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is less than b @@ -42658,7 +42438,7 @@ CREATE FUNCTION eql_v3.lt(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) < eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) < eql_v3.ord_ope_term(b) $$; CREATE OPERATOR < ( @@ -42671,7 +42451,7 @@ CREATE OPERATOR < ( JOIN = scalarltjoinsel ); ---! @brief Less-than-or-equal on jsonb_entry via ore_cllw. +--! @brief Less-than-or-equal on jsonb_entry via the CLLW OPE term. --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is less than or equal to b @@ -42679,7 +42459,7 @@ CREATE FUNCTION eql_v3.lte(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) <= eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) <= eql_v3.ord_ope_term(b) $$; CREATE OPERATOR <= ( @@ -42692,7 +42472,7 @@ CREATE OPERATOR <= ( JOIN = scalarlejoinsel ); ---! @brief Greater-than on jsonb_entry via ore_cllw. +--! @brief Greater-than on jsonb_entry via the CLLW OPE term. --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is greater than b @@ -42700,7 +42480,7 @@ CREATE FUNCTION eql_v3.gt(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) > eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) > eql_v3.ord_ope_term(b) $$; CREATE OPERATOR > ( @@ -42713,7 +42493,7 @@ CREATE OPERATOR > ( JOIN = scalargtjoinsel ); ---! @brief Greater-than-or-equal on jsonb_entry via ore_cllw. +--! @brief Greater-than-or-equal on jsonb_entry via the CLLW OPE term. --! @param a public.jsonb_entry Left operand --! @param b public.jsonb_entry Right operand --! @return boolean True if a is greater than or equal to b @@ -42721,7 +42501,7 @@ CREATE FUNCTION eql_v3.gte(a public.jsonb_entry, b public.jsonb_entry) RETURNS boolean LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS $$ - SELECT eql_v3.ore_cllw(a) >= eql_v3.ore_cllw(b) + SELECT eql_v3.ord_ope_term(a) >= eql_v3.ord_ope_term(b) $$; CREATE OPERATOR >= ( @@ -43264,10 +43044,10 @@ CREATE OPERATOR <@ ( --! satisfying Supabase splinter's `function_search_path_mutable` lint. --! --! @note A SET clause disables SQL-function inlining. The inline-critical SEM ---! helpers (ore_block_256_*, ore_cllw_*, ore_cllw/has_ore_cllw, ---! ope_cllw, hmac_256, bloom_filter over jsonb) and the ---! encrypted-domain family (recognised structurally, including public ---! user-column domains) are deliberately left unpinned. +--! helpers (ore_block_256_*, ope_cllw, hmac_256, bloom_filter over +--! jsonb) and the encrypted-domain family (recognised structurally, +--! including public user-column domains) are deliberately left +--! unpinned. --! @see tasks/test/splinter.sh --! @see tasks/build.sh @@ -43298,13 +43078,6 @@ BEGIN AND p.proname IN ('ore_block_256_eq', 'ore_block_256_neq', 'ore_block_256_lt', 'ore_block_256_lte', 'ore_block_256_gt', 'ore_block_256_gte')) - OR (p.pronargs = 2 - AND p.proname IN ('ore_cllw_eq', 'ore_cllw_neq', - 'ore_cllw_lt', 'ore_cllw_lte', - 'ore_cllw_gt', 'ore_cllw_gte')) - OR (p.pronargs = 1 - AND p.proname IN ('ore_cllw', 'has_ore_cllw') - AND p.proargtypes[0] = jsonb_oid) -- The CLLW-OPE surface is the extractor alone: eql_v3_internal.ope_cllw is a -- domain over bytea (native comparison operators and btree opclass), -- so there are no ope-specific comparison functions to keep inlinable. diff --git a/packages/eql/sql/release-manifest.json b/packages/eql/sql/release-manifest.json index 34cad1950..de196e24c 100644 --- a/packages/eql/sql/release-manifest.json +++ b/packages/eql/sql/release-manifest.json @@ -1,6 +1,6 @@ { - "eqlVersion": "3.0.0-alpha.3", + "eqlVersion": "3.0.0-alpha.4", "schemaVersion": 3, - "installSqlSha256": "ec7af1b334cd9ba2d6356bcb3eec41a4db5bfc6e39108de74484134aa90b7929", + "installSqlSha256": "eb4036cf7d2513e9cdff987582c1bba889300929f8ff4d6e6d984665c06eec9b", "uninstallSqlSha256": "b1b5131b8175c5d04da9ada108d25c81c5772b15fad79a6c419ebb32d18c60a9" } diff --git a/packages/eql/src/generated/release-manifest.ts b/packages/eql/src/generated/release-manifest.ts index 123be25c5..a52e9cfd8 100644 --- a/packages/eql/src/generated/release-manifest.ts +++ b/packages/eql/src/generated/release-manifest.ts @@ -1,6 +1,6 @@ export const releaseManifest = { - eqlVersion: '3.0.0-alpha.3', + eqlVersion: '3.0.0-alpha.4', schemaVersion: 3, - installSqlSha256: 'ec7af1b334cd9ba2d6356bcb3eec41a4db5bfc6e39108de74484134aa90b7929', + installSqlSha256: 'eb4036cf7d2513e9cdff987582c1bba889300929f8ff4d6e6d984665c06eec9b', uninstallSqlSha256: 'b1b5131b8175c5d04da9ada108d25c81c5772b15fad79a6c419ebb32d18c60a9', } as const From 03d97ced1110e5be90347e08c332643c8a4f1ff3 Mon Sep 17 00:00:00 2001 From: James Sadler Date: Thu, 9 Jul 2026 20:51:40 +1000 Subject: [PATCH 599/599] fix(test): norm() must match raw format_type output, not source names The CIP-3472 rename sweep rewrote the match arms of norm() in v3_jsonb_operator_surface_tests, but those arms match what Postgres' format_type() RETURNS, not names in our source. Two things changed at once: the domains gained the eql_v3_ prefix, and json stopped being a reserved word, so format_type no longer quotes it. Output is now bare eql_v3_json / eql_v3_jsonb_entry (schema omitted, public being on search_path), where the arms still looked for the quoted json and bare jsonb_entry. Every operand normalised to itself, so all four surface assertions saw unprefixed names and failed on 3 of 4 PG17 shards. Match the real output, and keep the bare query_jsonb arm so the assertions survive a search_path change that would unqualify it. --- .../sqlx/tests/v3_jsonb_operator_surface_tests.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs index c6965efe5..ea9ec4927 100644 --- a/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs +++ b/tests/sqlx/tests/v3_jsonb_operator_surface_tests.rs @@ -53,14 +53,18 @@ async fn v3_jsonb_operators(pool: &PgPool) -> anyhow::Result String { match ty { - "\"json\"" => "public.eql_v3_json".to_string(), - "jsonb_entry" => "public.eql_v3_jsonb_entry".to_string(), + "eql_v3_json" => "public.eql_v3_json".to_string(), + "eql_v3_jsonb_entry" => "public.eql_v3_jsonb_entry".to_string(), + // Qualified today (eql_v3 is off the default search_path); mapped + // anyway so the assertions survive a search_path change. "query_jsonb" => "eql_v3.query_jsonb".to_string(), - _ => ty.replace("public.\"json\"", "public.eql_v3_json"), + other => other.to_string(), } }